{"version":3,"file":"ThemeControlsModal-IaR4suQN.cjs","sources":["../src/hooks/useBreakpoint.ts","../../../node_modules/@emotion/weak-memoize/dist/emotion-weak-memoize.esm.js","../src/Cards/CardBase/index.tsx","../src/Cards/CardBase/RelatedEntity/index.tsx","../src/Cards/CardBase/FeatureEntity/index.tsx","../src/Shared/Tooltip/index.tsx","../src/Shared/ErrorBoundary/index.tsx","../src/Cards/ButtonCard/index.tsx","../src/Shared/RangeSlider/index.tsx","../src/Shared/Ripples/index.tsx","../src/Cards/TriggerCard/index.tsx","../src/Group/index.tsx","../src/Cards/WeatherCard/index.tsx","../src/Cards/WeatherCard/WeatherCardDetail.tsx","../src/Cards/GarbageCollectionCard/garbage-bin.svg?react","../src/Cards/GarbageCollectionCard/index.tsx","../src/Cards/TimeCard/index.tsx","../src/Cards/AreaCard/index.tsx","../src/Cards/VacuumCard/index.tsx","../src/Cards/PictureCard/index.tsx","../src/Cards/FabCard/index.tsx","../src/Cards/FamilyCard/index.tsx","../src/Cards/FamilyCard/PersonCard/index.tsx","../src/Cards/SidebarCard/index.tsx","../src/Shared/Entity/Climate/ClimateControls/ClimateControlSlider.tsx","../src/Shared/Entity/Climate/ClimateControls/ClimateHumiditySlider.tsx","../src/Shared/Entity/Climate/ClimateControls/index.tsx","../src/Shared/Entity/Light/LightControls/color_wheel.png","../src/Shared/Entity/Light/LightControls/index.tsx","../src/Shared/Entity/Alarm/AlarmControls/index.tsx","../src/Shared/Entity/Cover/CoverControls/index.tsx","../src/Cards/MediaPlayerCard/Fab.tsx","../src/Shared/Entity/MediaPlayer/MediaPlayerControls/index.tsx","../src/Shared/Entity/Person/PersonControls/index.tsx","../src/Cards/ClimateCard/index.tsx","../src/Cards/EntitiesCard/index.tsx","../src/Cards/EntitiesCard/EntitiesCardRow.tsx","../src/Cards/MediaPlayerCard/VolumeControls/index.tsx","../src/Cards/MediaPlayerCard/PlaybackControls/index.tsx","../src/Cards/MediaPlayerCard/AlternateControls.tsx","../src/Cards/MediaPlayerCard/index.tsx","../../../node_modules/zustand/esm/vanilla/shallow.mjs","../../../node_modules/zustand/esm/react/shallow.mjs","../src/Cards/CalendarCard/index.tsx","../src/Shared/Entity/Miscellaneous/ButtonBar/index.tsx","../src/Shared/Entity/Miscellaneous/ButtonBar/ButtonBarButton/index.tsx","../src/Shared/Entity/Miscellaneous/ButtonGroup/index.tsx","../src/Shared/Entity/Miscellaneous/ButtonGroup/ButtonGroupButton/index.tsx","../src/Cards/CameraCard/players/hls.tsx","../src/Cards/CameraCard/players/webrtc.tsx","../src/Cards/CameraCard/stream/index.tsx","../src/Cards/CameraCard/index.tsx","../src/Shared/Entity/Miscellaneous/LogBookRenderer/index.tsx","../src/Shared/Modal/index.tsx","../../core/src/utils/computeDomain.ts","../src/Shared/Modal/ModalByEntityDomain/index.tsx","../src/Shared/Entity/Vacuum/VacuumControls/index.tsx","../src/Shared/ControlSlider/index.tsx","../src/Shared/ControlToggle/index.tsx","../src/Shared/ControlSliderCircular/index.tsx","../../../node_modules/@floating-ui/utils/dist/floating-ui.utils.dom.mjs","../../../node_modules/@floating-ui/utils/dist/floating-ui.utils.mjs","../../../node_modules/@floating-ui/react/dist/floating-ui.react.utils.mjs","../../../node_modules/@floating-ui/core/dist/floating-ui.core.mjs","../../../node_modules/@floating-ui/dom/dist/floating-ui.dom.mjs","../../../node_modules/@floating-ui/react-dom/dist/floating-ui.react-dom.mjs","../../../node_modules/@floating-ui/react/dist/floating-ui.react.mjs","../src/Shared/Menu/index.tsx","../src/Shared/Entity/Light/ColorTempPicker/index.tsx","../src/Shared/Entity/Light/ColorPicker/index.tsx","../src/Shared/Entity/Miscellaneous/EntityAttributes/index.tsx","../src/ThemeProvider/index.tsx","../src/ThemeProvider/ThemeControls.tsx","../src/ThemeProvider/ThemeControlsModal.tsx"],"sourcesContent":["import { useEffect, useState, useMemo } from \"react\";\nimport { getBreakpoints, allBreakpoints, type BreakPoint, useThemeStore } from \"@components\";\nimport { useHass } from \"@hakit/core\";\n\n/**\n * @description This hook can be used to programmatically change the layout/content or functionality based on the current breakpoint.\n * This will return an object with all breakpoint key names and their active state.\n *\n * NOTE: If you're running hakit within an iframe, you'll need to update the window context in the HassConnect.options.windowContext property\n *\n * @example\n * ```tsx\n * import { useBreakpoint } from \"@hakit/components\";\n * function SomeComponent() {\n *  const bp = useBreakpoint();\n * return (\n *   <div>\n *     {bp.xxs && <p>Extra small</p>}\n *     {bp.xs && <p>Small</p>}\n *     {bp.sm && <p>Medium</p>}\n *     {bp.md && <p>Large</p>}\n *     {bp.lg && <p>Extra large</p>}\n *   </div>\n *   );\n * }\n *\n * @returns { [key in BreakPoint]: boolean } - Object containing the breakpoint keys and if they're active or not.\n */\nexport function useBreakpoint(): { [key in BreakPoint]: boolean } {\n  const breakpoints = useThemeStore((store) => store.breakpoints);\n  const windowContext = useHass((store) => store.windowContext);\n  const win = windowContext ?? window;\n  const queries = useMemo(() => getBreakpoints(breakpoints), [breakpoints]);\n  const [matches, setMatches] = useState(() => Object.fromEntries(allBreakpoints.map((bp) => [bp, false])) as Record<BreakPoint, boolean>);\n\n  useEffect(() => {\n    const context = win || window;\n    const mqlMap = new Map<BreakPoint, MediaQueryList>();\n\n    const updateMatches = () => {\n      const newMatches = Object.fromEntries(allBreakpoints.map((bp) => [bp, false])) as Record<BreakPoint, boolean>;\n\n      for (const bp of allBreakpoints) {\n        const query = queries[bp];\n        if (typeof query === \"string\") {\n          const mql = mqlMap.get(bp);\n          if (mql?.matches) {\n            newMatches[bp] = true;\n            // Only one should be active at a time, so we can break here\n            break;\n          }\n        }\n      }\n\n      setMatches(newMatches);\n    };\n\n    for (const bp of allBreakpoints) {\n      const query = queries[bp];\n      if (typeof query === \"string\") {\n        const mql = context.matchMedia(query);\n        // when dynamically switch context (windows) the mql will be null\n        // let the next iteration handle the mql\n        if (!mql) continue;\n        mqlMap.set(bp, mql);\n        mql.addEventListener(\"change\", updateMatches);\n      }\n    }\n\n    // Set initial matches\n    updateMatches();\n\n    return () => {\n      for (const mql of mqlMap.values()) {\n        if (!mql) continue;\n        mql.removeEventListener(\"change\", updateMatches);\n      }\n    };\n  }, [queries, win]);\n\n  return matches;\n}\n","var weakMemoize = function weakMemoize(func) {\n  var cache = new WeakMap();\n  return function (arg) {\n    if (cache.has(arg)) {\n      // Use non-null assertion because we just checked that the cache `has` it\n      // This allows us to remove `undefined` from the return value\n      return cache.get(arg);\n    }\n\n    var ret = func(arg);\n    cache.set(arg, ret);\n    return ret;\n  };\n};\n\nexport { weakMemoize as default };\n","import { css } from \"@emotion/react\";\nimport { useLongPress, type LongPressReactEvents } from \"use-long-press\";\nimport { lowerCase, startCase } from \"lodash\";\nimport {\n  memo,\n  useMemo,\n  useId,\n  useState,\n  useCallback,\n  Children,\n  isValidElement,\n  cloneElement,\n  type ReactElement,\n  type ReactNode,\n  CSSProperties,\n  useRef,\n} from \"react\";\nimport {\n  type EntityName,\n  type DomainService,\n  type ExtractDomain,\n  type ServiceData,\n  type HassEntityWithService,\n  type HistoryOptions,\n  computeDomain,\n  isUnavailableState,\n  useEntity,\n  useHass,\n  localize,\n} from \"@hakit/core\";\nimport { CSSInterpolation } from \"@emotion/serialize\";\nimport {\n  ModalByEntityDomain,\n  Ripples,\n  fallback,\n  type RipplesProps,\n  type AvailableQueries,\n  type ModalByEntityDomainProps,\n  type BreakPoint,\n  Alert,\n  SvgGraph,\n  ButtonBar,\n  ButtonBarButton,\n  ButtonBarProps,\n  SvgGraphProps,\n  type RelatedEntity,\n  type RelatedEntityProps,\n} from \"@components\";\nimport { type FeatureEntity, type FeatureEntityProps } from \"./FeatureEntity\";\nimport { ErrorBoundary } from \"react-error-boundary\";\nimport { isValidProp } from \"../../utils/isValidProp\";\nimport styled from \"@emotion/styled\";\nimport { useResizeDetector } from \"react-resize-detector\";\nimport { useResizeDetectorProps } from \"react-resize-detector\";\nimport { SVG_HEIGHT, SVG_WIDTH } from \"../../Shared/SvgGraph/constants\";\n\nconst getBaseElement = <C extends keyof React.JSX.IntrinsicElements = \"div\">(as: C, onlyFunctionality?: boolean) => {\n  if (onlyFunctionality) {\n    return styled(as)``;\n  }\n  return styled(as, {\n    shouldForwardProp: (prop) => isValidProp(prop),\n  })<{\n    disableActiveState: boolean;\n    disabled?: boolean;\n  }>`\n    outline: none;\n    border: 0;\n    box-sizing: border-box;\n    padding: 0;\n    position: relative;\n    overflow: hidden;\n    display: flex;\n    width: 100%;\n    cursor: pointer;\n    background-color: var(--ha-S300);\n    box-shadow: 0px 0px 0px rgba(0, 0, 0, 0);\n    transform: scale(1) translate3d(0, 0, 0);\n    transition: var(--ha-transition-duration) var(--ha-easing);\n    transition-property: transform, background-color, background-image;\n    color: var(--ha-S200-contrast);\n    flex-shrink: 1;\n    user-select: none;\n    svg {\n      color: var(--ha-S200-contrast);\n      transition: color var(--ha-transition-duration) var(--ha-easing);\n    }\n    .graph-element {\n      position: absolute;\n      bottom: 0;\n      left: 0;\n      right: 0;\n    }\n    &:not(.disabled):not(:disabled):not(:focus):hover {\n      background-color: var(--ha-S400);\n      color: var(--ha-500-contrast);\n      svg {\n        color: var(--ha-S400-contrast);\n      }\n    }\n    &:disabled,\n    &.disabled {\n      cursor: not-allowed;\n      opacity: 0.8;\n    }\n    &.card-base-active:active:not(.disable-scale-effect):not(.disabled):not(.unavailable) {\n      transform: scale(0.9) translate3d(0, 0, 0);\n    }\n    ${(props) =>\n      !props.disableActiveState &&\n      `\n      &.active, &:active {\n        background-color: var(--ha-A400);\n        color: var(--ha-900-contrast);\n        svg {\n          color: var(--ha-900-contrast);\n        }\n        &:not(:disabled):not(.disabled):hover {\n          background-color: var(--ha-A700);\n          color: var(--ha-900-contrast);\n        }\n      }\n    `}\n  `;\n};\n\nconst StyledRipples = styled((props: RipplesProps) => <Ripples {...props} />)`\n  flex-shrink: 1;\n  width: 100%;\n  height: 100%;\n`;\n\nconst Trigger = styled.div`\n  width: 100%;\n  height: 100%;\n  &:has(.features) {\n    display: flex;\n    flex-direction: column;\n  }\n  > .features {\n    padding: 0 1rem 1rem;\n    > .fit-content > .button-group-inner > * {\n      width: auto;\n      flex-grow: 1;\n      > .button-bar-button {\n        width: auto;\n        flex-grow: 1;\n      }\n    }\n  }\n`;\n\ntype Extendable<T extends keyof React.JSX.IntrinsicElements> = Omit<\n  React.ComponentPropsWithRef<T>,\n  \"onClick\" | \"disabled\" | \"title\" | \"children\" | \"active\"\n>;\n\n// Define the allowed children types\ntype AllowedFeaturedEntity = ReactElement<typeof FeatureEntity> | false | null | undefined;\ntype AllowedFeaturedEntities = AllowedFeaturedEntity | AllowedFeaturedEntity[];\n\n// Define the allowed children types\ntype AllowedRelatedEntity = ReactElement<typeof RelatedEntity> | false | null | undefined;\ntype AllowedRelatedEntities = AllowedRelatedEntity | AllowedRelatedEntity[];\n\nexport type CardBaseProps<T extends keyof React.JSX.IntrinsicElements = \"div\", E extends EntityName = EntityName> = Extendable<T> &\n  AvailableQueries & {\n    /** convert the component type to something else @default \"div\" */\n    as?: T;\n    /** children to render alongside the card */\n    children?: ReactNode;\n    /** should the card be disabled, this will disable any click events, service calls and scale effects */\n    disabled?: boolean;\n    /** Optional active param, By default this is updated via home assistant  @default undefined */\n    active?: boolean;\n    /** By default, the title is retrieved from the domain name, or you can specify a manual title @default undefined */\n    title?: ReactNode;\n    /** The name of your entity */\n    entity?: E;\n    /** The service name to call */\n    service?: DomainService<ExtractDomain<E>>;\n    /** The data to pass to the service */\n    serviceData?: ServiceData<ExtractDomain<E>, DomainService<ExtractDomain<E>>>;\n    /** allows you to place a fully functional and interactive element at predefined zones of the card, like displaying an icon in the top left which might be a sensor indicating battery level */\n    relatedEntities?: AllowedRelatedEntities;\n    /** provide a FeatureEntity component as a list or individual components to render a bar at the bottom of the card */\n    features?: AllowedFeaturedEntities;\n    /** props to pass to the feature bar */\n    featureBarProps?: Omit<ButtonBarProps, \"children\">;\n    /** callback to fire after a long press event */\n    longPressCallback?: E extends undefined\n      ? (entity: null, event: LongPressReactEvents) => void\n      : (entity: HassEntityWithService<ExtractDomain<E>>, event: LongPressReactEvents) => void;\n    /** The onClick handler is called when the card is pressed, the first argument will be entity object with api methods if entity is provided  */\n    /** The onClick handler is called when the button is pressed, the first argument will be entity object with api methods if entity is provided  */\n    onClick?: E extends undefined\n      ? (entity: null, event: React.MouseEvent<HTMLElement>) => void\n      : (entity: HassEntityWithService<ExtractDomain<E>>, event: React.MouseEvent<HTMLElement>) => void;\n    /** disable the modal opening functionality @default false */\n    disableModal?: boolean;\n    /** props to pass to the modal */\n    modalProps?: Partial<ModalByEntityDomainProps<E>>;\n    /** include ripples or not */\n    disableRipples?: boolean;\n    /** disable the scale effect on the card when clicked */\n    disableScale?: boolean;\n    /** disable the styles of the card when in the active state */\n    disableActiveState?: boolean;\n    /** This also controls the animated modal border-radius, update the border radius of the card @default \"16px\" */\n    borderRadius?: CSSProperties[\"borderRadius\"];\n    /** completely disable the automated column sizes, this will default to whatever width is provided by the user or the card @default false */\n    disableColumns?: boolean;\n    /** props to pass to the ripple component if enabled */\n    rippleProps?: Omit<RipplesProps, \"children\">;\n    /** className to provide to the trigger element */\n    triggerClass?: string;\n    /** the graph settings containing the entity to display a graph in the background of the card */\n    graph?: {\n      /** the entity to display the graph for */\n      entity: EntityName;\n      /** the props to pass to the svg graph, control the styles and colors of the graph from here */\n      props?: SvgGraphProps;\n      /** the space at the bottom of the card is automatically calculated by the available height, you can adjust this by manipulating the value here @default 0px */\n      adjustGraphSpaceBy?: CSSProperties[\"paddingBottom\"];\n      /** options to pass to the history request */\n      historyOptions?: HistoryOptions;\n    };\n    /**\n     *\n     * A css string to update the card, this is similar to how you'd write scss.\n     *\n     * ```jsx\n     * export const MyComponent = (otherProps) => {\n     *   return <SomeCard cssStyles={`\n     *     color: var(--ha-900-contrast);\n     *    .some-selector {\n     *        &:hover {\n     *            background-color: var(--ha-A400);\n     *        }\n     *    }\n     * `} {...otherProps} />\n     * }\n     * ```\n     */\n    cssStyles?: CSSInterpolation;\n    /** remove all base styles of the card and just use the inbuilt functionality */\n    onlyFunctionality?: boolean;\n    /** props to pass to the resize detector, this is useful if you want to trigger something whenever the card resizes */\n    resizeDetectorProps?: useResizeDetectorProps<HTMLElement>;\n    /** ref callback to get the reference to the card element */\n    refCallback?: (ref: React.RefObject<HTMLElement | null>) => void;\n  };\n\nconst DEFAULT_SIZES: Required<AvailableQueries> = {\n  xxs: 12,\n  xs: 6,\n  sm: 6,\n  md: 4,\n  lg: 4,\n  xlg: 3,\n};\n\nconst CardBaseInternal = function CardBase<T extends keyof React.JSX.IntrinsicElements = \"div\", E extends EntityName = EntityName>({\n  as = \"div\" as T,\n  entity: _entity,\n  title: _title,\n  active,\n  service,\n  serviceData,\n  children,\n  disabled,\n  longPressCallback,\n  onClick,\n  disableModal = false,\n  modalProps,\n  disableRipples = false,\n  disableScale = false,\n  disableActiveState = false,\n  onlyFunctionality = false,\n  id,\n  className,\n  cssStyles,\n  style,\n  borderRadius = \"16px\",\n  rippleProps,\n  disableColumns,\n  refCallback,\n  key,\n  relatedEntities,\n  features,\n  featureBarProps,\n  graph,\n  resizeDetectorProps,\n  triggerClass,\n  ...rest\n}: CardBaseProps<T, E>): ReactElement<T> {\n  const _id = useId();\n  const globalComponentStyle = useHass((state) => state.globalComponentStyles);\n  const [openModal, setOpenModal] = useState(false);\n  const domain = _entity ? computeDomain(_entity) : null;\n  const entity = useEntity(_entity ?? \"unknown\", {\n    returnNullIfNotFound: true,\n  });\n  const internalRef = useRef<HTMLDivElement | null>(null);\n  // useful so users can subscribe to the resize event\n  const { width = 0 } = useResizeDetector({\n    refreshMode: \"debounce\",\n    refreshRate: 50,\n    handleHeight: false,\n    skipOnMount: false,\n    targetRef: internalRef,\n    ...(resizeDetectorProps ?? {}),\n  });\n  const graphEntity = useEntity(graph?.entity ?? \"unknown\", {\n    returnNullIfNotFound: true,\n    historyOptions: {\n      disable: false,\n      ...graph?.historyOptions,\n    },\n  });\n  const isUnavailable = useMemo(() => (typeof entity?.state === \"string\" ? isUnavailableState(entity.state) : false), [entity?.state]);\n  const _borderRadius = borderRadius;\n  const StyledElement = useMemo(() => getBaseElement(as as \"div\", onlyFunctionality), [as, onlyFunctionality]);\n  const bind = useLongPress<HTMLDivElement>(\n    (e) => {\n      if (typeof longPressCallback === \"function\") {\n        if (entity !== null) {\n          // we don't know the types at this level, but they will be correct at the parent level\n          longPressCallback(entity as never, e);\n        } else {\n          longPressCallback(null as never, e);\n        }\n      }\n      if (typeof _entity === \"string\" && !openModal && !disableModal) {\n        setOpenModal(true);\n      }\n      internalRef.current?.classList.remove(\"card-base-active\");\n    },\n    {\n      threshold: 300,\n      cancelOnMovement: true,\n      cancelOutsideElement: true,\n      filterEvents(e) {\n        return !(\"button\" in e && e.button === 2);\n      },\n    },\n  );\n  const onClickHandler = useCallback(\n    (event: React.MouseEvent<HTMLDivElement>) => {\n      if (disabled) return;\n      // so we can expect it to throw errors however the parent level ts validation will catch invalid params.\n      if (typeof service === \"string\" && entity && !isUnavailable) {\n        // @ts-expect-error - we don't actually know the service at this level\n        const caller = entity.service[service];\n        caller(serviceData);\n      }\n      if (typeof onClick === \"function\") {\n        if (entity !== null) {\n          // we don't know the types at this level, but they will be correct at the parent level\n          onClick(entity as never, event);\n        } else {\n          onClick(null as never, event);\n        }\n      }\n    },\n    [service, disabled, entity, serviceData, onClick, isUnavailable],\n  );\n  // use the input title if provided, else use the domain if available, else null\n  const title = useMemo(\n    () => _title || entity?.attributes?.friendly_name || (domain !== null ? startCase(lowerCase(domain)) : null),\n    [_title, entity, domain],\n  );\n\n  const columnClassNames = useMemo(() => {\n    const mergedGrids = Object.entries(DEFAULT_SIZES).reduce<Required<AvailableQueries>>((acc, [key, value]) => {\n      const inputValue = rest[key as BreakPoint];\n      return {\n        ...acc,\n        [key]: inputValue ?? value,\n      };\n    }, DEFAULT_SIZES);\n    return Object.entries(mergedGrids)\n      .map(([key, value]) => `${key}-${value}`)\n      .join(\" \");\n    // this is okay, we only want this effect to re-run when the breakpoints change not the entire prop object\n    // eslint-disable-next-line react-hooks/exhaustive-deps\n  }, [rest.xxs, rest.xs, rest.sm, rest.md, rest.lg, rest.xlg]);\n\n  const filteredRelatedEntities = Children.toArray(relatedEntities).filter((child): child is ReactElement<typeof ButtonBarButton> =>\n    isValidElement(child),\n  );\n  const filteredFeaturedEntities = Children.toArray(features).filter((child): child is ReactElement<typeof ButtonBarButton> =>\n    isValidElement(child),\n  );\n\n  const featuredElements = Children.map(filteredFeaturedEntities, (child, index) => {\n    if (isValidElement<FeatureEntityProps<EntityName>>(child)) {\n      return cloneElement(child, {\n        key: child.key || `${_id}${index}`,\n        ...child.props,\n      });\n    }\n    return child;\n  });\n  const hasFeatures = filteredFeaturedEntities.length > 0;\n  const featureBar = hasFeatures && (\n    <ButtonBar layoutType=\"bubble\" className=\"features\" fullWidth gap=\"0.5rem\" {...featureBarProps}>\n      {featuredElements}\n    </ButtonBar>\n  );\n\n  function calculateSvgHeight(parentWidth: number): CSSProperties[\"paddingBottom\"] {\n    const aspectRatio = SVG_WIDTH / SVG_HEIGHT;\n    return `calc(${parentWidth / aspectRatio}px - ${graph?.adjustGraphSpaceBy ?? \"0px\"});`;\n  }\n\n  const svgHeight = calculateSvgHeight(width);\n\n  const _classes = useMemo(() => {\n    return [\n      \"card-base\",\n      className ?? \"\",\n      disableColumns ? \"\" : columnClassNames,\n      disableScale ? \"disable-scale-effect\" : \"\",\n      active ? \"active\" : \"\",\n      isUnavailable ? \"unavailable\" : \"\",\n      disabled || isUnavailable ? \"disabled\" : \"\",\n      hasFeatures ? \"has-features\" : \"\",\n      graphEntity ? \"has-graph\" : \"\",\n    ]\n      .filter((x) => !!x)\n      .join(\" \");\n  }, [active, className, columnClassNames, disableScale, disableColumns, disabled, graphEntity, hasFeatures, isUnavailable]);\n\n  const handlePointerDown = () => {\n    internalRef.current?.classList.add(\"card-base-active\");\n  };\n\n  const handlePointerUp = () => {\n    internalRef.current?.classList.remove(\"card-base-active\");\n  };\n\n  return (\n    <>\n      <StyledElement\n        key={key}\n        ref={(ref) => {\n          internalRef.current = ref;\n          if (refCallback) {\n            refCallback(internalRef);\n          }\n        }}\n        id={id ?? \"\"}\n        className={_classes}\n        css={css`\n          padding-bottom: ${graphEntity ? svgHeight : \"inherit\"};\n          ${globalComponentStyle.cardBase ?? \"\"}\n          ${cssStyles ?? \"\"}\n        `}\n        style={{\n          ...(style ?? {}),\n          borderRadius: _borderRadius,\n        }}\n        disableActiveState={disableActiveState}\n        disabled={isUnavailable || disabled}\n        {...bind()}\n        {...(rest as unknown as React.HTMLAttributes<HTMLDivElement>)}\n      >\n        {graphEntity && (\n          <div className={\"graph-element history\"}>\n            {graphEntity.history.loading ? (\n              <Alert className={\"loading\"} description={localize(\"loading\")} />\n            ) : graphEntity.history.coordinates.length > 0 ? (\n              <SvgGraph coordinates={graphEntity.history.coordinates} {...graph?.props} />\n            ) : (\n              <Alert className={\"no-state-history\"} description={localize(\"no_state_history_found\")} />\n            )}\n          </div>\n        )}\n        {disableRipples ? (\n          <Trigger\n            className={`contents trigger-element ${triggerClass}`}\n            onClick={onClickHandler}\n            onPointerDown={handlePointerDown}\n            onPointerUp={handlePointerUp}\n          >\n            {children}\n            {featureBar}\n          </Trigger>\n        ) : (\n          <StyledRipples {...rippleProps} key={rippleProps?.key} borderRadius={_borderRadius} disabled={disabled || isUnavailable}>\n            <Trigger\n              className={`contents trigger-element ${triggerClass}`}\n              onClick={onClickHandler}\n              onPointerDown={handlePointerDown}\n              onPointerUp={handlePointerUp}\n            >\n              {children}\n              {featureBar}\n            </Trigger>\n          </StyledRipples>\n        )}\n        {Children.map(filteredRelatedEntities, (child, index) => {\n          if (isValidElement<RelatedEntityProps<EntityName>>(child)) {\n            return cloneElement(child, {\n              key: child.key || `${_id}${index}`,\n              ...child.props,\n            });\n          }\n          return child;\n        })}\n      </StyledElement>\n      {typeof _entity === \"string\" && (\n        <ModalByEntityDomain\n          {...modalProps}\n          entity={_entity as EntityName}\n          title={modalProps?.title ?? title ?? localize(\"unknown\")}\n          onClose={() => {\n            setOpenModal(false);\n            if (modalProps?.onClose) {\n              modalProps.onClose();\n            }\n          }}\n          open={modalProps?.open || openModal}\n          id={_id}\n        />\n      )}\n    </>\n  );\n};\n\n/**\n * This is the base card component that every other card component should extend, it comes with everything we need to be able to replicate functionality\n * like the modal popup, ripples and more.\n *\n * You can use this if you want an empty shell of a component that you can build on top of.\n * */\nexport const CardBase = memo(function CardBase<T extends keyof React.JSX.IntrinsicElements = \"div\", E extends EntityName = EntityName>(\n  props: CardBaseProps<T, E>,\n) {\n  return <ErrorBoundary {...fallback({ prefix: \"CardBase\" })}>{CardBaseInternal<T, E>(props)}</ErrorBoundary>;\n});\n","import styled from \"@emotion/styled\";\nimport { memo, useCallback, useMemo, type ReactNode, type CSSProperties } from \"react\";\nimport {\n  type EntityName,\n  type ExtractDomain,\n  type HassEntityWithService,\n  type DomainService,\n  type ServiceData,\n  isUnavailableState,\n  computeDomain,\n  useEntity,\n  useIconByDomain,\n  useIconByEntity,\n  useIcon,\n} from \"@hakit/core\";\nimport { fallback } from \"@components\";\nimport { ErrorBoundary } from \"react-error-boundary\";\nimport { type IconProps } from \"@iconify/react\";\n\ntype Position =\n  | \"left top\"\n  | \"left center\"\n  | \"left bottom\"\n  | \"center top\"\n  | \"center center\"\n  | \"center bottom\"\n  | \"right top\"\n  | \"right center\"\n  | \"right bottom\";\n\nexport interface RelatedEntityProps<E extends EntityName = EntityName> extends Omit<React.ComponentPropsWithoutRef<\"div\">, \"onClick\"> {\n  /** The name of the entity */\n  entity: E;\n  /** The service name to call */\n  service?: DomainService<ExtractDomain<E>>;\n  /** The data to pass to the service */\n  serviceData?: ServiceData<ExtractDomain<E>, DomainService<ExtractDomain<E>>>;\n  /** overwrite the default for the entity */\n  icon?: string;\n  /** properties for the icon */\n  iconProps?: Omit<IconProps, \"icon\">;\n  /** the position of the entity element, @default \"top left\" */\n  position?: Position;\n  /** should the element be disabled or not which will block the click events @default false */\n  disabled?: boolean;\n  /** custom render method for the element, this will replace any default children of this component */\n  render?: (entity: HassEntityWithService<ExtractDomain<E>>, icon: ReactNode | null) => ReactNode;\n  /** margin for the custom element @default 1rem */\n  margin?: CSSProperties[\"margin\"];\n  /** padding for the custom element @default 0 */\n  padding?: CSSProperties[\"padding\"];\n  /** The onClick handler is called when the button is pressed, the first argument will be entity object with api methods if entity is provided  */\n  onClick?: (entity: HassEntityWithService<ExtractDomain<E>>, event: React.MouseEvent<HTMLElement>) => void;\n}\n\ntype PartialStyleProps = Pick<RelatedEntityProps<EntityName>, \"position\" | \"padding\" | \"margin\">;\n\nconst RelatedEntityEl = styled.div<PartialStyleProps>`\n  position: absolute;\n  margin: ${(props) => props.margin || \"1rem\"};\n  padding: ${(props) => props.padding || \"0\"};\n  cursor: ${(props) => (props.onClick ? \"pointer\" : \"default\")};\n  ${(props) => {\n    switch (props.position) {\n      case \"left top\":\n        return `top: 0; left: 0;`;\n      case \"left center\":\n        return `top: 50%; left: 0; transform: translateY(-50%);`;\n      case \"left bottom\":\n        return `bottom: 0; left: 0;`;\n      case \"center top\":\n        return `top: 0; left: 50%; transform: translateX(-50%);`;\n      case \"center center\":\n        return `top: 50%; left: 50%; transform: translate(-50%, -50%);`;\n      case \"center bottom\":\n        return `bottom: 0; left: 50%; transform: translateX(-50%);`;\n      case \"right top\":\n        return `top: 0; right: 0;`;\n      case \"right center\":\n        return `top: 50%; right: 0; transform: translateY(-50%);`;\n      case \"right bottom\":\n        return `bottom: 0; right: 0;`;\n      default:\n        return `top: 0; right: 0;`;\n    }\n  }}\n`;\n\nfunction InternalRelatedEntity<E extends EntityName>({\n  entity: _entity,\n  icon: _icon,\n  iconProps,\n  render,\n  position,\n  onClick,\n  disabled,\n  service,\n  serviceData,\n  ...rest\n}: RelatedEntityProps<E>) {\n  const entity = useEntity(_entity);\n  const iconElement = useIcon(_icon ?? null, iconProps);\n  const domain = computeDomain(_entity);\n  const domainIcon = useIconByDomain(domain === null ? \"unknown\" : domain, iconProps);\n  const entityIcon = useIconByEntity(_entity || \"unknown\", iconProps);\n  const icon = iconElement ?? entityIcon ?? domainIcon;\n  const isUnavailable = useMemo(() => (typeof entity?.state === \"string\" ? isUnavailableState(entity.state) : false), [entity?.state]);\n  const onClickHandler = useCallback(\n    (event: React.MouseEvent<HTMLElement>) => {\n      if (disabled) return;\n      // so we can expect it to throw errors however the parent level ts validation will catch invalid params.\n      if (typeof service === \"string\" && entity && !isUnavailable) {\n        // @ts-expect-error - we don't actually know the service at this level\n        const caller = entity.service[service];\n        caller(serviceData);\n      }\n      if (typeof onClick === \"function\") {\n        if (entity !== null) {\n          // we don't know the types at this level, but they will be correct at the parent level\n          onClick(entity as never, event);\n        } else {\n          onClick(null as never, event);\n        }\n      }\n    },\n    [service, disabled, entity, serviceData, onClick, isUnavailable],\n  );\n  return (\n    <RelatedEntityEl position={position} onClick={onClickHandler} {...rest}>\n      {render ? render(entity, icon) : <>{icon}</>}\n    </RelatedEntityEl>\n  );\n}\n\n/**\n * This can be used within the `relatedEntities` prop for any card that extends CardBase where you can place icons/elements in predefined positions across the card with full control over style/positions/rendering capabilities, click actions and more.\n * Each individual related entity can have clickable actions, stylable and more.\n * This would be useful to show an icon for an entity to indicate it's battery level or state.\n * */\nexport const RelatedEntity = memo(function RelatedEntity<E extends EntityName>(props: RelatedEntityProps<E>) {\n  return (\n    <ErrorBoundary {...fallback({ prefix: \"RelatedEntity\" })}>\n      <InternalRelatedEntity {...props} />\n    </ErrorBoundary>\n  );\n});\n","import { type EntityName } from \"@hakit/core\";\nimport { fallback, ButtonBarButton, type ButtonBarButtonProps } from \"@components\";\nimport { ErrorBoundary } from \"react-error-boundary\";\n\nexport type FeatureEntityProps<E extends EntityName = EntityName> = ButtonBarButtonProps<E>;\n\nfunction _FeatureEntity<E extends EntityName>({ children, active, ...rest }: ButtonBarButtonProps<E>) {\n  return (\n    <ButtonBarButton\n      // @ts-expect-error - will need to fix this typescript problem later\n      as=\"div\"\n      rippleProps={{\n        preventPropagation: true,\n      }}\n      active={active}\n      cssStyles={`\n        &.button-bar-button {\n          .contents {\n            > div {\n              padding: 0.6rem;\n            }\n          }\n        }\n      `}\n      {...rest}\n    >\n      {children}\n    </ButtonBarButton>\n  );\n}\n\n/**\n * This can be used within the `features` prop for any card that extends CardBase where you can place actions at the bottom of every card allowing you to replace similar functionality of the \"features\" option within home assistant.\n * */\nexport const FeatureEntity = function FeatureEntity<E extends EntityName>(props: ButtonBarButtonProps<E>) {\n  return (\n    <ErrorBoundary {...fallback({ prefix: \"FeatureEntity\" })}>\n      <_FeatureEntity {...props} />\n    </ErrorBoundary>\n  );\n};\n","import { useRef, useCallback, Children, isValidElement, cloneElement, useState } from \"react\";\nimport { createPortal } from \"react-dom\";\nimport styled from \"@emotion/styled\";\nimport { fallback } from \"@components\";\nimport { ErrorBoundary } from \"react-error-boundary\";\nimport { useHass } from \"@hakit/core\";\n\nconst TooltipSpan = styled.span<Pick<TooltipProps, \"placement\">>`\n  position: fixed;\n  top: 0;\n  left: 0;\n  background-color: var(--ha-S300);\n  color: var(--ha-S100-contrast);\n  padding: 8px;\n  border-radius: 4px;\n  box-shadow: 0px 2px 4px var(--ha-S100);\n  font-size: 0.9rem;\n  z-index: 1000;\n  visibility: hidden;\n  opacity: 0;\n  transition: var(--ha-transition-duration) var(--ha-easing);\n  transition-property: opacity, visibility;\n  pointer-events: none;\n  transform: ${(props) => {\n    switch (props.placement) {\n      default:\n      case \"top\":\n        return \"translateY(calc(-100% - 10px)) translateX(-50%)\";\n      case \"right\":\n        return \"translateX(10px) translateY(-50%)\";\n      case \"bottom\":\n        return \"translateY(10px) translateX(-50%)\";\n      case \"left\":\n        return \"translateX(calc(-100% - 10px)) translateY(-50%)\";\n    }\n  }};\n  &::before {\n    content: \"\";\n    position: absolute;\n    width: 0;\n    height: 0;\n    border-style: solid;\n    display: block;\n    ${(props) => {\n      switch (props.placement) {\n        default:\n        case \"top\":\n          return `\n            border-width: 6px 6px 0 6px;\n            border-color: var(--ha-S300) transparent transparent transparent;\n            top: 100%;\n            left: 50%;\n            transform: translateX(-50%);\n          `;\n        case \"right\":\n          return `\n            border-width: 6px 6px 6px 0;\n            border-color: transparent var(--ha-S300) transparent transparent;\n            left: 0;\n            top: 50%;\n            transform: translate(-100%, -50%);\n          `;\n        case \"bottom\":\n          return `\n            border-width: 0 6px 6px 6px;\n            border-color: transparent transparent var(--ha-S300) transparent;\n            bottom: 100%;\n            left: 50%;\n            transform: translateX(-50%);\n          `;\n        case \"left\":\n          return `\n            border-width: 6px 0 6px 6px;\n            border-color: transparent transparent transparent var(--ha-S300);\n            right: 0;\n            top: 50%;\n            transform: translate(100%, -50%);\n          `;\n      }\n    }};\n  }\n`;\n\nexport interface TooltipProps extends Omit<React.ComponentPropsWithRef<\"div\">, \"title\"> {\n  /** the placement of the tooltip @default 'top' */\n  placement?: \"top\" | \"right\" | \"bottom\" | \"left\";\n  /** the X-axis offset of the tooltip @default 0 */\n  offsetX?: number;\n  /** the Y-axis offset of the tooltip @default 0 */\n  offsetY?: number;\n  /** the title of the tooltip */\n  title?: React.ReactNode | null;\n  /** the children of the tooltip */\n  children: React.ReactNode;\n}\n\nfunction InternalTooltip({ placement = \"top\", offsetX = 0, offsetY = 0, title = null, children, ref, ...rest }: TooltipProps) {\n  const tooltipRef = useRef<HTMLSpanElement | null>(null);\n  const childRef = useRef<HTMLDivElement | null>(null);\n  const portalRoot = useHass((store) => store.portalRoot);\n  const windowContext = useHass((store) => store.windowContext);\n  const win = windowContext ?? window;\n  const [show, setShow] = useState(false);\n\n  const calculatePosition = useCallback(\n    (el: HTMLSpanElement) => {\n      const childRect = childRef.current?.getBoundingClientRect();\n      if (typeof childRect === \"undefined\") return;\n      let top = 0;\n      let left = 0;\n      switch (placement) {\n        case \"top\":\n          top = childRect.top;\n          left = childRect.left + childRect.width / 2;\n          break;\n        case \"right\":\n          top = childRect.top + childRect.height / 2;\n          left = childRect.right;\n          break;\n        case \"bottom\":\n          top = childRect.bottom;\n          left = childRect.left + childRect.width / 2;\n          break;\n        case \"left\":\n          top = childRect.top + childRect.height / 2;\n          left = childRect.left;\n          break;\n      }\n      top = top + offsetY;\n      left = left + offsetX;\n      el.style.top = `${top}px`;\n      el.style.left = `${left}px`;\n      // to ensure animations play out, we need to update these values after the next tick\n      setTimeout(() => {\n        el.style.opacity = \"1\";\n        el.style.visibility = \"visible\";\n      }, 0);\n    },\n    [placement, offsetX, offsetY],\n  );\n\n  const handleMouseEnter = useCallback(() => {\n    setShow(true);\n  }, []);\n\n  const handleHide = useCallback(() => {\n    const tooltipEl = tooltipRef.current;\n    if (!tooltipEl) return;\n    tooltipEl.style.opacity = \"0\";\n    tooltipEl.style.visibility = \"hidden\";\n    tooltipEl.setAttribute(\"aria-hidden\", \"true\");\n    setTimeout(() => {\n      setShow(false);\n    }, 250);\n  }, []);\n\n  if (title === null || title === \"\") {\n    return children;\n  }\n\n  return (\n    <div\n      ref={childRef}\n      onBlur={handleHide}\n      onTouchEnd={handleHide}\n      onTouchStart={handleMouseEnter}\n      onMouseUp={handleHide}\n      onMouseEnter={handleMouseEnter}\n      onMouseLeave={handleHide}\n      {...rest}\n    >\n      {Children.map(children, (child, index) => {\n        if (\n          isValidElement<\n            Omit<React.ComponentPropsWithRef<\"div\">, \"onClick\"> & {\n              onClick: (unknown: null, event: React.MouseEvent<HTMLDivElement>) => void;\n            }\n          >(child)\n        ) {\n          return cloneElement(child, {\n            ...child.props,\n            onClick(_unknown: null, event: React.MouseEvent<HTMLDivElement>) {\n              child.props.onClick?.(_unknown, event);\n              rest?.onClick?.(event);\n            },\n            ref,\n            key: child.key ?? index,\n          });\n        }\n        return child;\n      })}\n      {typeof document !== \"undefined\" &&\n        createPortal(\n          show && (\n            <TooltipSpan\n              className=\"tooltip-inner\"\n              placement={placement}\n              ref={(ref) => {\n                if (ref) {\n                  tooltipRef.current = ref;\n                  calculatePosition(ref);\n                }\n              }}\n              aria-hidden=\"false\"\n            >\n              {title}\n            </TooltipSpan>\n          ),\n          portalRoot ?? win.document.body,\n        )}\n    </div>\n  );\n}\n\n/** Tooltip is a simplified component similar to material ui's Tooltip component, simply wrap any element in the Tooltip and provide a title as either ReactNode or string, and it will render the tooltip on hover, if you want to conditionally render a tooltip, simply set the title to either null or an empty string */\nexport function Tooltip(props: TooltipProps) {\n  return (\n    <ErrorBoundary {...fallback({ prefix: \"Tooltip\" })}>\n      <InternalTooltip {...props} />\n    </ErrorBoundary>\n  );\n}\n","import { type ErrorBoundaryProps } from \"react-error-boundary\";\nimport { Alert } from \"@components\";\nimport { localize } from \"@hakit/core\";\n\ninterface Fallback {\n  prefix?: string;\n}\n\nexport const fallback = ({ prefix }: Fallback): ErrorBoundaryProps => ({\n  fallbackRender({ error, resetErrorBoundary }) {\n    return (\n      <Alert\n        className={`error-boundary-alert`}\n        title={`${prefix ? `${prefix} - ` : \"\"}${localize(\"unknown_error\")}`}\n        description={error.message}\n        type=\"error\"\n        onClick={() => resetErrorBoundary()}\n      />\n    );\n  },\n});\n","import { useMemo, Children, isValidElement, ReactNode } from \"react\";\nimport styled from \"@emotion/styled\";\nimport {\n  localize,\n  useEntity,\n  useHass,\n  useIconByDomain,\n  useIcon,\n  useIconByEntity,\n  isUnavailableState,\n  ON,\n  OFF,\n  computeDomain,\n  type HassEntityWithService,\n  type ExtractDomain,\n  type EntityName,\n} from \"@hakit/core\";\nimport { type IconProps } from \"@iconify/react\";\nimport { fallback, Column, CardBase, type CardBaseProps, type AvailableQueries } from \"@components\";\nimport { ErrorBoundary } from \"react-error-boundary\";\n\nconst StyledButtonCard = styled(CardBase)`\n  &.slim {\n    justify-content: center;\n    .fab-card-inner {\n      width: 3rem;\n      height: 3rem;\n    }\n    .button-card-trigger {\n      align-items: center;\n      > .contents {\n        width: 100%;\n      }\n    }\n  }\n  .button-card-trigger > .features {\n    width: 100%;\n  }\n  .button-card-trigger > .features > .fit-content {\n    flex-basis: 100%;\n  }\n  .children {\n    width: 100%;\n  }\n  &.slim-vertical {\n    justify-content: center;\n    .fab-card-inner {\n      width: 3rem;\n      height: 3rem;\n    }\n    .button-card-trigger {\n      align-items: center;\n    }\n  }\n  .footer > .title {\n    text-align: left;\n  }\n  &:not(.disabled),\n  &:not(:disabled) {\n    &:not(:focus):hover {\n      .fab-card-inner:not(.custom) {\n        background-color: var(--ha-S500);\n        color: var(--ha-S500-contrast);\n      }\n    }\n  }\n`;\n\nconst Contents = styled.div`\n  padding: 1rem;\n  display: flex;\n  flex-direction: column;\n  align-items: center;\n  justify-content: stretch;\n  height: 100%;\n`;\n\ninterface ToggleProps {\n  active: boolean;\n}\n\nconst ToggleState = styled.div<ToggleProps>`\n  background-color: var(--ha-100);\n  border-radius: 100%;\n  width: 16px;\n  height: 16px;\n  position: absolute;\n  top: 2px;\n  box-shadow: 0 0 4px rgba(0, 0, 0, 0.5);\n  transition: var(--ha-transition-duration) var(--ha-easing);\n  transition-property: left, transform;\n  left: ${(props) => (props.active ? \"100%\" : 0)};\n  transform: ${(props) => (props.active ? \"translate3d(calc(-100% - 2px), 0, 0)\" : \"translate3d(calc(0% + 2px), 0, 0)\")};\n`;\n\nconst Toggle = styled.div<ToggleProps>`\n  position: relative;\n  background-color: ${(props) => (props.active ? \"var(--ha-A400)\" : \"var(--ha-S100)\")};\n  border-radius: 10px;\n  width: 40px;\n  height: 20px;\n  flex-grow: 0;\n  flex-shrink: 0;\n  transition: background-color var(--ha-transition-duration) var(--ha-easing);\n  margin-left: 20px;\n`;\n\nconst Fab = styled.div<\n  React.ComponentProps<\"div\"> & {\n    brightness: string;\n  }\n>`\n  border-radius: 100%;\n  padding: 6px;\n  width: 2rem;\n  height: 2rem;\n  display: flex;\n  flex-shrink: 0;\n  align-items: center;\n  justify-content: center;\n  box-shadow: 0 1px 4px rgba(0, 0, 0, 0.2);\n  ${(props) =>\n    props.brightness &&\n    `\n    filter: ${props.brightness};\n  `}\n  transition: var(--ha-transition-duration) var(--ha-easing);\n  transition-property: background-color, color, filter;\n  svg {\n    transition: var(--ha-transition-duration) var(--ha-easing);\n    transition-property: color;\n  }\n`;\n\nconst LayoutBetween = styled.div`\n  display: flex;\n  align-items: center;\n  justify-content: space-between;\n  flex-direction: row;\n  gap: 10px;\n  width: 100%;\n  &.vertical {\n    flex-direction: column;\n    height: 100%;\n  }\n`;\n\nconst Footer = styled.div`\n  display: flex;\n  align-items: flex-start;\n  justify-content: flex-start;\n  flex-direction: column;\n  width: 100%;\n`;\n\nconst Title = styled.div`\n  color: var(--ha-S100-contrast);\n  font-size: 0.9rem;\n  font-weight: bold;\n  margin-bottom: 0.25rem;\n`;\n\nconst Description = styled.div`\n  color: var(--ha-S300-contrast);\n  font-size: 0.7rem;\n  margin: 2px 0;\n  text-align: left;\n  width: 100%;\n  &.center {\n    text-align: center;\n  }\n  &.secondary {\n    color: var(--ha-S500-contrast);\n  }\n  &.slim-vertical {\n    text-align: center;\n  }\n`;\n\ntype OmitProperties = \"as\" | \"children\" | \"ref\" | \"description\";\n\nexport interface ButtonCardProps<E extends EntityName> extends Omit<CardBaseProps<\"button\", E>, OmitProperties> {\n  /** Optional icon param, this is automatically retrieved by the \"domain\" name if provided, or can be overwritten with a custom value, provide a string with the name of the icon, or a custom icon by providing a react node  */\n  icon?: ReactNode | null;\n  /** the props for the icon, which includes styles for the icon */\n  iconProps?: Omit<IconProps, \"icon\">;\n  /** the props to provide to the Fab element within the card, useful if you want to re-style it */\n  fabProps?: React.ComponentProps<\"div\">;\n  /** By default, the title is retrieved from the friendly name of the entity, or you can specify a manual title */\n  title?: ReactNode | null;\n  /** The description will naturally fall under the title, by default it will show the information of the entity like the state */\n  description?: ReactNode | null;\n  /** The layout of the button card, mimics the style of HA mushroom cards in slim/slim-vertical @default \"default\" */\n  layoutType?: \"default\" | \"slim\" | \"slim-vertical\";\n  /** custom method to render the state however you choose, this will just change how the \"suffix\" of the title will appear */\n  customRenderState?: (entity: HassEntityWithService<ExtractDomain<E>>) => ReactNode;\n  /** hide the icon shown in the component @default false */\n  hideIcon?: boolean;\n  /** Hide the state value @default false */\n  hideState?: boolean;\n  /** Hide the last updated time @default false */\n  hideLastUpdated?: boolean;\n  /** This forces hideState, hideLastUpdated and will only show the entity name / description prop @default false */\n  hideDetails?: boolean;\n  /** Will hide the \"toggle\" element shown in the default layout @default false */\n  hideToggle?: boolean;\n  /** The children to render at the bottom of the card */\n  children?: React.ReactNode;\n  /** Separator rendered between description and state when both exist. Can be any React node. @default '-' */\n  descriptionSeparator?: React.ReactNode;\n}\nfunction InternalButtonCard<E extends EntityName>({\n  entity: _entity,\n  service,\n  serviceData,\n  iconProps,\n  icon: _icon,\n  fabProps,\n  active,\n  onClick,\n  description,\n  title: _title,\n  layoutType,\n  disabled = false,\n  className,\n  hideIcon = false,\n  hideState = false,\n  hideLastUpdated = false,\n  children,\n  hideDetails = false,\n  cssStyles,\n  key,\n  hideToggle = false,\n  customRenderState,\n  ...rest\n}: ButtonCardProps<E>): React.ReactNode {\n  const globalComponentStyle = useHass((state) => state.globalComponentStyles);\n  const formatter = useHass((state) => state.formatter);\n  const domain = _entity ? computeDomain(_entity) : null;\n  const entity = useEntity(_entity || \"unknown\", {\n    returnNullIfNotFound: true,\n  });\n  const iconNode = typeof _icon !== \"undefined\" && typeof _icon !== \"string\" ? _icon : null;\n  const domainIcon = useIconByDomain(domain === null ? \"unknown\" : domain, {\n    ...(iconProps ?? {}),\n  });\n  const entityIcon = useIconByEntity(_entity || \"unknown\", {\n    ...(iconProps ?? {}),\n  });\n  const isDefaultLayout = layoutType === \"default\" || layoutType === undefined;\n  const isSlimLayout = layoutType === \"slim\" || layoutType === \"slim-vertical\";\n  const isUnavailable = typeof entity?.state === \"string\" ? isUnavailableState(entity.state) : false;\n  const on = entity ? entity.state !== \"off\" && !isUnavailable && !disabled : active || false;\n  const iconElement = useIcon(typeof _icon === \"string\" ? _icon : null, {\n    ...(iconProps ?? {}),\n  });\n  // use the input description if provided, else use the friendly name if available, else entity name, else null\n  const title = useMemo(() => {\n    return _title === null ? null : _title || entity?.attributes.friendly_name || entity?.entity_id || null;\n  }, [_title, entity]);\n\n  function renderState() {\n    if (hideState) return null;\n    if (customRenderState && entity) {\n      // @ts-expect-error - this is correct, no idea why it's complaining\n      return customRenderState(entity);\n    }\n    if (typeof active === \"boolean\") {\n      // static usage without entity\n      return active ? `${localize(ON)}` : `${localize(OFF)}`;\n    }\n    if (entity && entity.state === ON && domain === \"light\") {\n      return formatter.attributeValue(entity, \"brightness\");\n    }\n    if (entity) {\n      return formatter.stateValue(entity);\n    }\n    return null;\n  }\n  const hasFeatures = Children.toArray(rest?.features).filter((child) => isValidElement(child)).length > 0;\n  const stateNode = renderState();\n  const separatorNode = rest.descriptionSeparator ?? \"-\";\n  function buildDescriptionContent(main: React.ReactNode, state: React.ReactNode) {\n    if (!main && !state) return null;\n    if (main && state) {\n      return (\n        <>\n          {main} <span className=\"description-separator\">{separatorNode}</span> {state}\n        </>\n      );\n    }\n    return main || state;\n  }\n\n  const hasHeaderContent = !hideIcon || (isDefaultLayout && !hideToggle) || isSlimLayout;\n\n  return (\n    <StyledButtonCard\n      key={key}\n      as=\"button\"\n      // @ts-expect-error - don't know the entity name, so we can't know the service type\n      service={service}\n      // @ts-expect-error - don't know the entity name, so we can't know the service data\n      serviceData={serviceData}\n      active={active}\n      entity={_entity as EntityName}\n      title={title ?? undefined}\n      disabled={disabled || isUnavailable}\n      onClick={onClick}\n      className={`${className ?? \"\"} ${layoutType ?? \"default\"} button-card`}\n      triggerClass={`button-card-trigger`}\n      cssStyles={`\n        ${globalComponentStyle.buttonCard ?? \"\"}\n        ${cssStyles ?? \"\"}\n      `}\n      {...rest}\n    >\n      <Contents className={`contents ${hasFeatures ? \"has-features\" : \"\"}`}>\n        {hasHeaderContent && (\n          <LayoutBetween\n            className={`layout-between ${layoutType === \"slim-vertical\" ? \"vertical\" : \"\"}`}\n            style={\n              isDefaultLayout || children\n                ? {\n                    marginBottom: \"20px\",\n                  }\n                : undefined\n            }\n          >\n            {!hideIcon && (\n              <Fab\n                brightness={(on && entity?.custom.brightness) || \"brightness(100%)\"}\n                {...fabProps}\n                className={`fab-card-inner icon ${fabProps?.className} ${fabProps?.style ? \"custom\" : \"\"}`}\n                style={{\n                  ...fabProps?.style,\n                  backgroundColor:\n                    fabProps?.style?.backgroundColor ??\n                    (on ? (domain === \"light\" ? (entity?.custom?.rgbaColor ?? \"var(--ha-A400)\") : \"var(--ha-A400)\") : \"var(--ha-S400)\"),\n                  color:\n                    fabProps?.style?.color ??\n                    (entity\n                      ? on\n                        ? entity.custom.rgbColor\n                        : \"var(--ha-S500-contrast)\"\n                      : on\n                        ? \"var(--ha-A400)\"\n                        : \"var(--ha-S500-contrast)\"),\n                }}\n              >\n                {iconNode ?? iconElement ?? entityIcon ?? domainIcon}\n              </Fab>\n            )}\n            {isDefaultLayout && !hideToggle && (\n              <Toggle active={on} className=\"toggle\">\n                {!isUnavailable && <ToggleState active={on} className=\"toggle-state\" />}\n              </Toggle>\n            )}\n            {isSlimLayout && (\n              <Column fullWidth alignItems={layoutType === \"slim-vertical\" ? \"center\" : \"flex-start\"}>\n                {title && <Title className=\"title\">{title}</Title>}\n                {!hideDetails && (\n                  <Description className={`description ${layoutType ?? \"\"}`}>{buildDescriptionContent(description, stateNode)}</Description>\n                )}\n                {entity && !hideLastUpdated && (\n                  <Description className={`description secondary ${layoutType === \"slim-vertical\" ? \"center\" : \"\"}`}>\n                    {localize(\"last_updated\")}: {entity.custom.relativeTime}\n                  </Description>\n                )}\n              </Column>\n            )}\n          </LayoutBetween>\n        )}\n        {isDefaultLayout && (\n          <Footer className=\"footer\">\n            {title && <Title className=\"title\">{title}</Title>}\n            {!hideDetails && <Description className=\"description\">{buildDescriptionContent(description, stateNode)}</Description>}\n            {!hideDetails && entity && !hideLastUpdated && (\n              <Description className=\"description secondary\">\n                {localize(\"last_updated\")}: {entity.custom.relativeTime}\n              </Description>\n            )}\n          </Footer>\n        )}\n        {children && <div className=\"children\">{children}</div>}\n      </Contents>\n    </StyledButtonCard>\n  );\n}\n/**\n * The ButtonCard component is an easy way to represent the state and control of an entity with a simple button, eventually I'll provide further options per domain, like being able to set the colours for lights etc...\n * Below are a few examples of layouts that the ButtonCard supports\n * */\nexport function ButtonCard<E extends EntityName>(props: ButtonCardProps<E>) {\n  const defaultColumns: AvailableQueries = {\n    xxs: 12,\n    xs: 6,\n    sm: 4,\n    md: 3,\n    lg: 2,\n    xlg: 2,\n  };\n  return (\n    <ErrorBoundary {...fallback({ prefix: \"ButtonCard\" })}>\n      <InternalButtonCard {...defaultColumns} {...props} />\n    </ErrorBoundary>\n  );\n}\n","import { useState, useEffect, useRef, ReactNode } from \"react\";\nimport styled from \"@emotion/styled\";\nimport { css } from \"@emotion/react\";\nimport { useDebouncedCallback, useThrottledCallback } from \"use-debounce\";\nimport { fallback, mq } from \"@components\";\nimport { ErrorBoundary } from \"react-error-boundary\";\n\nconst RangeSliderParent = styled.div``;\n\nconst StyledRange = styled.div<{\n  handleSize: number;\n}>`\n  ${(props) => `\n    min-width: 6rem;\n    width: 100%;\n    position: relative;\n    isolation: isolate;\n\n    ${mq(\n      [\"xxs\", \"xs\", \"sm\"],\n      `\n      min-width: 0;\n    `,\n    )}\n\n    z-index: 1;\n\n    .range-slider-range {\n      position: relative;\n      -webkit-appearance: none;\n      width: 100%;\n      height: 0.7rem;\n      border-radius: 5px;\n      background: var(--ha-S400);\n      outline: none;\n      padding: 0;\n      margin: 0;\n      z-index: 1;\n\n      &::-webkit-slider-thumb {\n        appearance: none;\n        width: ${props.handleSize}px;\n        height: ${props.handleSize}px;\n        border-radius: 50%;\n        background: var(--ha-A400);\n        cursor: pointer;\n        transition: background var(--ha-transition-duration) var(--ha-easing);\n        position: relative;\n        z-index: 1;\n\n        &:hover {\n          background: var(--ha-A200);\n        }\n      }\n\n      &:active::-webkit-slider-thumb {\n        background: var(--ha-A400);\n      }\n\n      &::-moz-range-thumb {\n        width: ${props.handleSize}px;\n        height: ${props.handleSize}px;\n        border: 0;\n        border-radius: 50%;\n        background: var(--ha-A400);\n        cursor: pointer;\n        transition: background var(--ha-transition-duration) var(--ha-easing);\n        z-index: 1;\n\n        &:hover {\n          background: var(--ha-A200);\n        }\n      }\n\n      &:active::-moz-range-thumb {\n        background: var(--ha-A400);\n      }\n      \n      &:focus {\n        &::-webkit-slider-thumb {\n          box-shadow: 0 0 0 3px var(--ha-A100);\n        }\n      }\n    }\n\n    // Firefox Overrides\n    ::-moz-range-track {\n        background: var(--ha-S400);\n        border: 0;\n    }\n\n    input::-moz-focus-inner,\n    input::-moz-focus-outer { \n      border: 0; \n    }\n\n    \n    &:hover, &.active {\n      .tooltip-holder {\n        > div {\n          transform: translate(-50%, -1rem) rotate(-45deg) scale(1);\n          opacity: 1;\n        }\n      }\n    }\n  `}\n`;\n\nconst Tooltip = styled.div<{\n  size: number;\n}>`\n  opacity: 0;\n  position: absolute;\n  bottom: 100%;\n  width: ${({ size }) => `${size}rem`};\n  height: ${({ size }) => `${size}rem`};\n  border-radius: 50% 50% 50% 0;\n  left: 0;\n  transform: translate(-50%, 1rem) rotate(-45deg) scale(0);\n  transition: var(--ha-transition-duration) var(--ha-easing);\n  transition-property: transform, opacity;\n  background-color: var(--ha-A400);\n  white-space: nowrap;\n  pointer-events: none;\n  z-index: 0;\n  &:after {\n    content: attr(data-title);\n    font-size: 0.7rem;\n    display: flex;\n    align-items: center;\n    justify-content: center;\n    color: white;\n    transform: rotate(45deg);\n    position: absolute;\n    inset: 0;\n    border-radius: 50%;\n  }\n`;\n\nconst Label = styled.label`\n  display: block;\n  margin-bottom: 0.5rem;\n  font-size: 0.9rem;\n  color: var(--ha-S50-contrast);\n`;\n\nconst Description = styled.span`\n  display: block;\n  font-size: 0.8rem;\n  margin-bottom: 0.5rem;\n  color: var(--ha-S500-contrast);\n`;\n\nexport interface RangeSliderProps extends Omit<React.ComponentPropsWithoutRef<\"input\">, \"onInput\" | \"onChange\"> {\n  /** The minimum value for the input @default 0 */\n  min?: number;\n  /** The maximum value for the input @default 100 */\n  max?: number;\n  /** The step value for the input @default 1 */\n  step?: number;\n  /** The value for the input @default 0 */\n  value?: number;\n  /** The handle size in px for the input @default 15 */\n  handleSize?: number;\n  /** The label for the input @default undefined */\n  onChange?: (value: number, event: React.ChangeEvent<HTMLInputElement>) => void;\n  /* The callback function that is called when the user has finished changing the value @default undefined */\n  onChangeComplete?: (value: number, event: React.ChangeEvent<HTMLInputElement>) => void;\n  /** Debounce/throttle value @default 300 */\n  debounceThrottleValue?: number;\n  debounceType?: \"debounce\" | \"throttle\";\n  /** The label for the input @default undefined */\n  label?: ReactNode;\n  /** The description for the input @default undefined */\n  description?: ReactNode;\n  /** should the tooltip value be hidden @default false */\n  hideTooltip?: boolean;\n  /** function to format the value displayed in the tooltip */\n  formatTooltipValue?: (value: number) => string;\n  /** tooltip size, increase/decrease the size of the tooltip, value should be a number representing rems @default 2 */\n  tooltipSize?: number;\n}\n\nfunction InternalRangeSlider({\n  value: _value,\n  onChange,\n  formatTooltipValue,\n  hideTooltip,\n  label,\n  description,\n  className,\n  style,\n  tooltipSize = 2,\n  handleSize = 15,\n  min: _min = 0,\n  max: _max = 100,\n  step: _step = 1,\n  debounceThrottleValue = 300,\n  debounceType = \"debounce\",\n  onChangeComplete,\n  cssStyles,\n  ...rest\n}: RangeSliderProps) {\n  const [value, setValue] = useState(_value ?? 0);\n  const [active, setActive] = useState(false);\n  const rangeRef = useRef<HTMLInputElement>(null);\n  const parentRangeRef = useRef<HTMLDivElement>(null);\n  const tooltipRef = useRef<HTMLDivElement>(null);\n\n  useEffect(() => {\n    if (typeof _value === \"number\") {\n      setValue(_value);\n    }\n  }, [_value]);\n\n  useEffect(() => {\n    if (!rangeRef.current || hideTooltip) return;\n    const min = parseFloat(`${_min ?? 0}`);\n    const max = parseFloat(`${_max ?? 100}`);\n    const step = parseFloat(`${_step ?? 1}`);\n    const roundedValue = parseFloat(rangeRef.current.valueAsNumber.toFixed(step < 1 ? Math.abs(Math.log10(step)) : 0));\n    const percentage = ((rangeRef.current.valueAsNumber - min) / (max - min)) * 100;\n\n    if (tooltipRef.current) {\n      tooltipRef.current.style.left = `${percentage}%`;\n      const tooltipValue = typeof formatTooltipValue === \"function\" ? formatTooltipValue(roundedValue) : roundedValue;\n      tooltipRef.current.setAttribute(\"data-title\", `${tooltipValue}`);\n    }\n  }, [value, _min, _max, _step, formatTooltipValue, hideTooltip]);\n\n  const callType = debounceType === \"debounce\" ? useDebouncedCallback : useThrottledCallback;\n\n  const debouncedOnChange = callType(\n    (event: React.ChangeEvent<HTMLInputElement>) => {\n      if (typeof onChangeComplete === \"function\") {\n        onChangeComplete(event.target.valueAsNumber, event);\n      }\n      setActive(false);\n    },\n    debounceThrottleValue,\n    {\n      leading: true,\n      trailing: true,\n    },\n  );\n\n  return (\n    <RangeSliderParent\n      className={`${className ?? \"\"} ${active ? \"active\" : \"\"} range-slider`}\n      style={{ position: \"relative\", ...(style ?? {}) }}\n      css={css`\n        ${cssStyles ?? \"\"}\n      `}\n    >\n      {label && <Label className=\"label\">{label}</Label>}\n      {description && <Description className=\"description\">{description}</Description>}\n      <StyledRange ref={parentRangeRef} handleSize={handleSize} className={`range-slider-inner ${active ? \"active\" : \"\"}`}>\n        <input\n          {...rest}\n          min={_min}\n          max={_max}\n          step={_step}\n          ref={rangeRef}\n          type=\"range\"\n          className=\"range-slider-range\"\n          value={value}\n          onInput={(event: React.ChangeEvent<HTMLInputElement>) => {\n            setValue(event.target.valueAsNumber);\n            if (!active) setActive(true);\n          }}\n          onChange={(event) => {\n            if (typeof onChange === \"function\") {\n              onChange(event.target.valueAsNumber, event);\n            }\n            debouncedOnChange(event);\n          }}\n        />\n        {!hideTooltip && (\n          <div\n            className=\"tooltip-holder\"\n            style={{\n              position: \"absolute\",\n              top: 0,\n              left: handleSize / 2,\n              right: handleSize / 2,\n            }}\n          >\n            <Tooltip size={tooltipSize} ref={tooltipRef} />\n          </div>\n        )}\n      </StyledRange>\n    </RangeSliderParent>\n  );\n}\n\n/** The RangeSlider is a simple component that allows you to provide a slider to extract a value and do something with it */\nexport function RangeSlider(props: RangeSliderProps) {\n  return (\n    <ErrorBoundary {...fallback({ prefix: \"RangeSlider\" })}>\n      <InternalRangeSlider {...props} />\n    </ErrorBoundary>\n  );\n}\n","import { CSSProperties, memo, useCallback, useRef, useEffect } from \"react\";\nimport styled from \"@emotion/styled\";\nimport { css } from \"@emotion/react\";\nimport { fallback } from \"@components\";\nimport { ErrorBoundary } from \"react-error-boundary\";\nimport { useHass } from \"@hakit/core\";\n\nexport interface RipplesProps extends React.ComponentPropsWithoutRef<\"div\"> {\n  /** the animation duration of the ripple @default 600 */\n  duration?: number;\n  /** the color of the ripple, @default rgba(0, 0, 0, .3) */\n  color?: string;\n  /** click even to bind to the ripple, @default void */\n  onClick?: (ev: React.MouseEvent<HTMLDivElement>) => void;\n  /** the children of the ripple */\n  children: React.ReactNode;\n  /** the css border radius of the ripple, @default none */\n  borderRadius?: CSSProperties[\"borderRadius\"];\n  /** disable the ripple */\n  disabled?: boolean;\n  /** prevent propagation on ripples */\n  preventPropagation?: boolean;\n}\n\nconst boxStyle: CSSProperties = {\n  position: \"relative\",\n  display: \"inline-flex\",\n  overflow: \"hidden\",\n};\n\nconst StyledRipple = styled.div`\n  position: absolute;\n  border-radius: 50%;\n  opacity: 0;\n  width: 35px;\n  height: 35px;\n  transform: translate(-50%, -50%);\n  pointer-events: none;\n  flex-shrink: 0;\n`;\n\nconst ParentRipple = styled.div<{\n  borderRadius: RipplesProps[\"borderRadius\"];\n}>`\n  ${(props) =>\n    props.borderRadius &&\n    `\n    border-radius: ${props.borderRadius};\n    overflow: hidden;\n    display: inline-flex;\n  `}\n`;\nconst _Ripples = memo(\n  ({\n    duration = 600,\n    color = \"rgba(0, 0, 0, .3)\",\n    borderRadius = \"none\",\n    onClick,\n    children,\n    disabled,\n    preventPropagation = false,\n    style,\n    className,\n    cssStyles,\n    id,\n    ...rest\n  }: RipplesProps) => {\n    const rippleRef = useRef<HTMLDivElement | null>(null);\n    const timeoutId = useRef<NodeJS.Timeout | null>(null);\n    const windowContext = useHass((store) => store.windowContext);\n    const win = windowContext ?? window;\n    useEffect(() => {\n      return () => {\n        // cleanup\n        if (timeoutId.current) clearTimeout(timeoutId.current);\n      };\n    }, []);\n\n    const onClickHandler = useCallback(\n      (event: React.MouseEvent<HTMLDivElement>) => {\n        event.stopPropagation();\n        if (disabled) return;\n        // clear the timeout if exists\n        if (timeoutId.current !== null) clearTimeout(timeoutId.current);\n\n        const { pageX, pageY, currentTarget } = event;\n\n        const rect = currentTarget.getBoundingClientRect();\n        let xMultiplier = 1;\n        if (typeof win !== \"undefined\") {\n          xMultiplier = win.scrollX;\n        }\n        let yMultiplier = 1;\n        if (typeof win !== \"undefined\") {\n          yMultiplier = win.scrollY;\n        }\n\n        const left = pageX - (rect.left + xMultiplier);\n        const top = pageY - (rect.top + yMultiplier);\n        const size = Math.max(rect.width, rect.height);\n\n        if (rippleRef.current) {\n          const newStyles = {\n            left: isNaN(left) ? \"0px\" : `${left}px`,\n            top: isNaN(top) ? \"0px\" : `${top}px`,\n            opacity: 1,\n            transform: \"translate(-50%, -50%)\",\n            transition: \"initial\",\n            backgroundColor: color,\n          };\n          Object.assign(rippleRef.current.style, newStyles);\n        }\n        // start a timeout to scale the ripple\n        timeoutId.current = setTimeout(() => {\n          if (rippleRef.current) {\n            const newStyles = {\n              opacity: 0,\n              transform: `scale(${size / 9})`,\n              transition: `all ${duration}ms`,\n            };\n            Object.assign(rippleRef.current.style, newStyles);\n          }\n          timeoutId.current = null;\n        }, 50);\n\n        if (typeof onClick === \"function\") onClick(event);\n      },\n      [color, duration, disabled, onClick, win],\n    );\n\n    return (\n      <ParentRipple\n        borderRadius={borderRadius}\n        id={id ?? \"\"}\n        className={`ripple-parent ${className ?? \"\"}`}\n        css={css`\n          ${cssStyles ?? \"\"}\n        `}\n        style={{\n          ...(style ?? {}),\n        }}\n      >\n        <div\n          className=\"ripple-inner\"\n          onPointerDownCapture={(e) => {\n            if (preventPropagation) {\n              e.stopPropagation();\n            }\n          }}\n          {...rest}\n          style={{\n            width: \"100%\",\n            ...boxStyle,\n            borderRadius,\n          }}\n          onClick={onClickHandler}\n        >\n          {children}\n          <StyledRipple ref={rippleRef} />\n        </div>\n      </ParentRipple>\n    );\n  },\n);\n_Ripples.displayName = \"_Ripples\";\n/** Ripples is a component that can easily add an interactive ripple effect when clicked, simply wrap your component in Ripples and you're good to go! If your component has a border radius, simply pass the same value as a prop to ripples to mask the effect */\nexport function Ripples(props: RipplesProps) {\n  return (\n    <ErrorBoundary {...fallback({ prefix: \"Ripples\" })}>\n      <_Ripples {...props} />\n    </ErrorBoundary>\n  );\n}\n","import { useCallback, useRef, useState } from \"react\";\nimport styled from \"@emotion/styled\";\nimport type { EntityName } from \"@hakit/core\";\nimport {\n  computeDomainTitle,\n  useEntity,\n  useHass,\n  useIconByDomain,\n  useIcon,\n  useIconByEntity,\n  computeDomain,\n  isUnavailableState,\n  localize,\n} from \"@hakit/core\";\nimport { ErrorBoundary } from \"react-error-boundary\";\nimport { fallback, CardBase, type AvailableQueries, type CardBaseProps } from \"@components\";\nimport { IconProps } from \"@iconify/react\";\n\nconst StyledTriggerCard = styled(CardBase)``;\n\nconst ToggleMessage = styled.span<ToggleProps>`\n  font-size: 0.6rem;\n  display: flex;\n  align-items: center;\n  justify-content: flex-end;\n  height: 100%;\n  padding: 0 0.4rem 0 0.8rem;\n  transition: var(--ha-transition-duration) var(--ha-easing);\n  transition-property: justify-content, color;\n  justify-content: ${(props) => (props.active ? `flex-start` : `flex-end`)};\n  color: ${(props) => (!props.active ? \"var(--ha-300)\" : \"var(--ha-300-contrast)\")};\n  ${(props) => props.hideArrow && `padding-right: 0.8rem;`}\n`;\n\nconst ToggleState = styled.div<ToggleProps>`\n  background-color: var(--ha-S200);\n  border-radius: 100%;\n  width: 1.9rem;\n  height: 1.9rem;\n  position: absolute;\n  top: 5px;\n  left: 0px;\n  display: flex;\n  align-items: center;\n  justify-content: center;\n  transition: var(--ha-transition-duration) var(--ha-easing);\n  transition-property: left, transform;\n  left: ${(props) => (props.active ? \"100%\" : \"0px\")};\n  transform: ${(props) => (props.active ? \"translate3d(calc(-100% - 5px), 0, 0)\" : \"translate3d(calc(0% + 5px), 0, 0)\")};\n  svg {\n    color: ${(props) => (props.active ? \"var(--ha-A400)\" : \"var(--ha-200)\")};\n    font-size: 40px;\n  }\n`;\n\ninterface ToggleProps {\n  active: boolean;\n  hideArrow?: boolean;\n}\nconst Gap = styled.div`\n  height: 20px;\n`;\nconst Toggle = styled.div<ToggleProps>`\n  position: relative;\n  background-color: ${(props) => (props.active ? \"var(--ha-300)\" : \"var(--ha-S200)\")};\n  border-radius: 3rem;\n  width: 10rem;\n  height: 2.5rem;\n  flex-grow: 0;\n  flex-shrink: 0;\n  transition: background-color var(--ha-transition-duration) var(--ha-easing);\n  margin-left: 1.5rem;\n  overflow: hidden;\n`;\n\nconst Contents = styled.div`\n  padding: 1rem;\n  height: 100%;\n  display: flex;\n  flex-direction: column;\n  justify-content: center;\n`;\n\nconst LayoutBetween = styled.div`\n  display: flex;\n  align-items: center;\n  justify-content: space-between;\n  flex-direction: row;\n`;\n\nconst Description = styled.div`\n  color: var(--ha-S500-contrast);\n  font-size: 0.7rem;\n  text-align: left;\n`;\nconst Title = styled.div<{\n  disabled?: boolean;\n}>`\n  color: var(--ha-S300-contrast);\n  font-size: 0.9rem;\n  font-weight: bold;\n  ${(props) => props.disabled && `color: var(--ha-S50-contrast);`}\n\n  text-align: left;\n  span {\n    display: block;\n    width: 100%;\n    color: var(--ha-S50-contrast);\n    margin-top: 0.3rem;\n    line-height: 1rem;\n    font-size: 0.7rem;\n  }\n`;\n\ntype OmitProperties = \"as\" | \"entity\";\nexport interface TriggerCardProps<E extends EntityName> extends Omit<CardBaseProps<\"button\", E>, OmitProperties> {\n  /** The name of your entity */\n  entity: E;\n  /** an optional description to add to the card */\n  description?: string;\n  /** optional override to replace the icon that appears in the card */\n  icon?: string;\n  /** the props for the icon, which includes styles for the icon */\n  iconProps?: Omit<IconProps, \"icon\">;\n  /** the props for the icon, which includes styles for the icon */\n  sliderIconProps?: Omit<IconProps, \"icon\">;\n  /** optional override for the slider icon */\n  sliderIcon?: string;\n  /** override for the slider text when the state is active */\n  sliderTextActive?: string;\n  /** override for the slider text when the state is inactive */\n  sliderTextInactive?: string;\n  /** how much time in milliseconds must pass before the active state reverts to it's default state @default 5000 */\n  activeStateDuration?: number;\n  /** display the arrow icon in the slider @default false */\n  hideArrow?: boolean;\n}\n\nfunction InternalTriggerCard<E extends EntityName>({\n  entity: _entity,\n  title,\n  description,\n  onClick,\n  disabled: _disabled,\n  icon: _icon,\n  iconProps,\n  sliderIconProps,\n  sliderIcon: _sliderIcon,\n  sliderTextActive,\n  sliderTextInactive,\n  activeStateDuration = 5000,\n  hideArrow = false,\n  className,\n  service,\n  serviceData,\n  key,\n  cssStyles,\n  ...rest\n}: TriggerCardProps<E>): React.ReactNode {\n  const globalComponentStyle = useHass((state) => state.globalComponentStyles);\n  const domain = computeDomain(_entity);\n  const entity = useEntity(_entity);\n  const entityIcon = useIconByEntity(_entity, iconProps);\n  const domainIcon = useIconByDomain(domain, iconProps);\n  const timeRef = useRef<NodeJS.Timeout | null>(null);\n  const [active, setActive] = useState(false);\n  const icon = useIcon(_icon ?? null, iconProps);\n  const sliderIcon = useIcon(_sliderIcon ?? null, sliderIconProps);\n  const powerIcon = useIcon(\"mdi:power\", iconProps);\n  const arrowIcon = useIcon(\"mingcute:arrows-right-line\", {\n    ...iconProps,\n    style: {\n      fontSize: \"16px\",\n      ...iconProps?.style,\n    },\n  });\n  const isUnavailable = isUnavailableState(entity.state);\n  const disabled = _disabled || isUnavailable;\n  const useApiHandler = useCallback(\n    (event: React.MouseEvent<HTMLElement, MouseEvent>) => {\n      setActive(true);\n      if (typeof onClick === \"function\" && !isUnavailable) onClick(entity as never, event);\n      if (timeRef.current) clearTimeout(timeRef.current);\n      timeRef.current = setTimeout(() => {\n        setActive(false);\n      }, activeStateDuration);\n    },\n    [entity, onClick, activeStateDuration, isUnavailable],\n  );\n\n  return (\n    <StyledTriggerCard\n      key={key}\n      as=\"button\"\n      className={`${className ?? \"\"} trigger-card`}\n      disabled={disabled}\n      entity={_entity}\n      // @ts-expect-error - don't know the entity name, so we can't know the service type\n      service={service}\n      // @ts-expect-error - don't know the entity name, so we can't know the service data\n      serviceData={serviceData}\n      onClick={useApiHandler}\n      cssStyles={`\n        ${globalComponentStyle?.triggerCard ?? \"\"}\n        ${cssStyles ?? \"\"}\n      `}\n      {...rest}\n    >\n      <Contents>\n        <LayoutBetween className={`layout-between`}>\n          <Title disabled={disabled} className={`description`}>\n            {title || entity.attributes.friendly_name || _entity}\n            {description && <span>{description}</span>}\n          </Title>\n          {icon ?? entityIcon ?? domainIcon}\n        </LayoutBetween>\n        <Gap className={`gap`} />\n        <LayoutBetween className={`layout-between`}>\n          <Description className={`title`}>\n            {entity.custom.relativeTime}\n            {disabled ? ` - ${entity.state}` : \"\"}\n          </Description>\n          <Toggle active={disabled ? false : active} className={`toggle`}>\n            {disabled ? null : (\n              <>\n                <ToggleState active={active} className={`toggle-state`}>\n                  {sliderIcon ?? powerIcon}\n                </ToggleState>\n                <ToggleMessage hideArrow={hideArrow} active={active} className={`toggle-message`}>\n                  {active\n                    ? (sliderTextActive ??\n                      localize(\"triggered_name\", {\n                        search: \" {name}\",\n                        replace: \"\",\n                      }))\n                    : (sliderTextInactive ?? `${localize(\"run\")} ${computeDomainTitle(_entity, entity?.attributes?.device_class)}`)}{\" \"}\n                  {!active && !hideArrow && arrowIcon}\n                </ToggleMessage>\n              </>\n            )}\n          </Toggle>\n        </LayoutBetween>\n      </Contents>\n    </StyledTriggerCard>\n  );\n}\n/** The TriggerCard is a simple to use component to make it easy to trigger and a scene, automation, script or any other entity to trigger. */\nexport function TriggerCard<E extends EntityName>(props: TriggerCardProps<E>) {\n  const defaultColumns: AvailableQueries = {\n    xxs: 12,\n    xs: 6,\n    sm: 6,\n    md: 4,\n    lg: 4,\n    xlg: 3,\n  };\n  return (\n    <ErrorBoundary {...fallback({ prefix: \"TriggerCard\" })}>\n      <InternalTriggerCard {...defaultColumns} {...props} />\n    </ErrorBoundary>\n  );\n}\n","import { useCallback, useState } from \"react\";\nimport styled from \"@emotion/styled\";\nimport { Row, Column, fallback, CardBase, CardBaseProps, mq, type AvailableQueries } from \"@components\";\nimport { ErrorBoundary } from \"react-error-boundary\";\nimport { AutoHeight } from \"../Shared/AutoHeight\";\nimport { type EntityName } from \"@hakit/core\";\n\nconst StyledGroup = styled(CardBase as React.ComponentType<CardBaseProps<\"div\", EntityName>>)<{\n  collapsed: boolean;\n  collapsible: boolean;\n}>`\n  background-color: var(--ha-S200);\n  color: var(--ha-S200-contrast);\n  padding: ${({ collapsed }) => (collapsed ? \"0 2rem\" : \"0 2rem 2rem\")};\n  transition: var(--ha-transition-duration) var(--ha-easing);\n  transition-property: height, padding, background-color;\n  &.expanded {\n    height: calc-size(auto);\n  }\n  width: 100%;\n  > div.contents > .header-title {\n    cursor: pointer;\n    padding: ${({ collapsed }) => (collapsed ? \"1.5rem 0\" : \"2rem 0\")};\n    > h3 {\n      color: var(--ha-S100-contrast);\n      margin: 0;\n      display: flex;\n      align-items: center;\n      transition: padding var(--ha-transition-duration) var(--ha-easing);\n      ${({ collapsible, collapsed }) =>\n        collapsible &&\n        `&:before {\n        content: \"${collapsed ? \"+\" : \"-\"}\";\n        display: inline-block;\n        color: var(--ha-A400);\n        width: 1rem;\n      }`}\n    }\n  }\n  ${({ collapsed }) => `\n    ${mq(\n      [\"xxs\", \"xs\"],\n      `\n      padding: ${collapsed ? \"1rem 0rem\" : \"1.5rem 1rem 1rem\"};\n    `,\n    )}\n  `};\n`;\n\nconst Description = styled.span`\n  color: var(--ha-S300-contrast);\n  font-size: 0.9rem;\n  margin: 0.5rem 0 0;\n  width: 100%;\n  display: block;\n  padding-left: 1rem;\n`;\n\nconst Header = styled.div`\n  transition: padding var(--ha-transition-duration) var(--ha-easing);\n`;\nconst Title = styled.h3``;\n\ntype OmitProperties =\n  | \"title\"\n  | \"as\"\n  | \"layout\"\n  | \"entity\"\n  | \"serviceData\"\n  | \"service\"\n  | \"longPressCallback\"\n  | \"modalProps\"\n  | \"onClick\"\n  | \"disableScale\"\n  | \"onlyFunctionality\"\n  | \"rippleProps\"\n  | \"disableActiveState\"\n  | \"disableRipples\";\nexport interface GroupProps extends Omit<CardBaseProps, OmitProperties> {\n  /** the title of the group */\n  title: React.ReactNode;\n  /** the optional description of the group */\n  description?: React.ReactNode;\n  /** the layout of the group, either column or row, @default row */\n  layout?: \"row\" | \"column\";\n  /** standard flex css properties for align-items, @default center */\n  alignItems?: React.CSSProperties[\"alignItems\"];\n  /** standard flex css properties for justify-content, @default center */\n  justifyContent?: React.CSSProperties[\"justifyContent\"];\n  /** standard css gap property values, @default 0.5rem */\n  gap?: React.CSSProperties[\"gap\"];\n  /** should the group be collapsed by default @default false */\n  collapsed?: boolean;\n  /** Whether the group can be collapsed by the end-user @default true */\n  collapsible?: boolean;\n  /** fired when the group header section is clicked */\n  onClick?: (event: React.MouseEvent<HTMLElement, MouseEvent>) => void;\n}\nfunction InternalGroup({\n  title,\n  description,\n  children,\n  gap = \"0.5rem\",\n  justifyContent = \"center\",\n  alignItems = \"center\",\n  layout = \"row\",\n  collapsed = false,\n  collapsible = true,\n  className,\n  onClick,\n  ...rest\n}: GroupProps): React.ReactNode {\n  const [_collapsed, setCollapsed] = useState(collapsed);\n  const cssProps = {\n    gap,\n    justifyContent,\n    alignItems,\n  };\n\n  const onCollapseComplete = useCallback(() => {\n    setCollapsed(true);\n  }, []);\n\n  const onHeaderClick = useCallback(\n    (event: React.MouseEvent<HTMLElement, MouseEvent>) => {\n      if (collapsible) {\n        setCollapsed(!_collapsed);\n      }\n      if (onClick) onClick(event);\n    },\n    [_collapsed, collapsible, onClick],\n  );\n\n  return (\n    <StyledGroup\n      onlyFunctionality\n      disableScale\n      disableActiveState\n      disableRipples\n      borderRadius={\"16px\"}\n      className={`${className ?? \"\"} ${_collapsed ? \"collapsed\" : \"expanded\"} group`}\n      collapsed={_collapsed}\n      collapsible={collapsible}\n      {...rest}\n    >\n      <Header onClick={onHeaderClick} className=\"header-title\">\n        <Title className=\"title\">{title}</Title>\n        {description && <Description>{description}</Description>}\n      </Header>\n      <AutoHeight isOpen={!_collapsed || !collapsible} className=\"content\" onCollapseComplete={onCollapseComplete}>\n        {layout === \"row\" ? (\n          <Row className=\"row\" {...cssProps}>\n            {children}\n          </Row>\n        ) : (\n          <Column className=\"column\" {...cssProps}>\n            {children}\n          </Column>\n        )}\n      </AutoHeight>\n    </StyledGroup>\n  );\n}\n/** The group component will automatically layout the children in a row with a predefined gap between the children. The Group component is handy when you want to be able to collapse sections of cards */\nexport function Group(props: GroupProps) {\n  const defaultColumns: AvailableQueries = {\n    xxs: 12,\n    xs: 12,\n    sm: 12,\n    md: 12,\n    lg: 12,\n    xlg: 12,\n  };\n  return (\n    <ErrorBoundary {...fallback({ prefix: \"Group\" })}>\n      <InternalGroup {...defaultColumns} {...props} />\n    </ErrorBoundary>\n  );\n}\n","import styled from \"@emotion/styled\";\nimport { useState, useEffect, useMemo, ReactNode, ReactElement, Children, isValidElement, cloneElement } from \"react\";\nimport { useWeather, useHass, isUnavailableState, getSupportedForecastTypes, getIconByEntity, localize } from \"@hakit/core\";\nimport type { FilterByDomain, ModernForecastType, EntityName } from \"@hakit/core\";\nimport { Icon, type IconProps } from \"@iconify/react\";\nimport {\n  Row,\n  Column,\n  fallback,\n  WeatherCardDetail,\n  ButtonBar,\n  ButtonBarButton,\n  CardBase,\n  type CardBaseProps,\n  type AvailableQueries,\n} from \"@components\";\nimport { ErrorBoundary } from \"react-error-boundary\";\nimport { getAdditionalWeatherInformation } from \"./helpers\";\n\nconst Card = styled(CardBase)``;\n\nconst Contents = styled.div`\n  padding: 1rem;\n  gap: 1rem;\n  flex-direction: column;\n  display: flex;\n  width: 100%;\n  height: 100%;\n`;\n\nconst Title = styled.h4`\n  all: unset;\n  font-family: var(--ha-font-family);\n  font-size: 0.8rem;\n  color: var(--ha-S100-contrast);\n  display: flex;\n  align-items: center;\n  justify-content: flex-start;\n`;\n\nconst SubTitle = styled.h4`\n  all: unset;\n  font-family: var(--ha-font-family);\n  font-size: 1rem;\n  color: var(--ha-S500-contrast);\n  margin-top: 0.3rem;\n  margin-left: 1.1rem;\n`;\nconst StyledIcon = styled(Icon)`\n  font-size: 3rem;\n  color: var(--ha-A100) !important;\n`;\n\nconst LocationIcon = styled(Icon)`\n  font-size: 1rem;\n  color: var(--ha-A400) !important;\n  margin-right: 0.2rem;\n`;\n\n// Removed convertDateTime in favor of centralized HA-aware formatter (formatForecastHour)\n\nfunction splitForecastsIntoRows<T>(arr: T[], rowCount: number, maxItemsPerRow: number): T[][] {\n  const maxItems = rowCount * maxItemsPerRow;\n  const limitedArray = arr.slice(0, maxItems); // Ignore items beyond rowCount * maxItemsPerRow\n  const result: T[][] = [];\n  let start = 0;\n\n  for (let i = 0; i < rowCount; i++) {\n    // Determine the maximum size for this group\n    const groupSize = Math.min(\n      Math.ceil((limitedArray.length - start) / (rowCount - i)), // Evenly distribute remaining elements\n      maxItemsPerRow,\n    );\n    result.push(limitedArray.slice(start, start + groupSize));\n    start += groupSize;\n  }\n\n  return result;\n}\n\nconst Forecast = styled.div`\n  display: flex;\n  flex-direction: column;\n  align-items: center;\n  justify-content: space-between;\n  gap: 0.5rem;\n  height: 100%;\n`;\nconst ForecastIcon = styled(Icon)`\n  font-size: 1.5rem;\n  color: var(--ha-A100) !important;\n`;\n\nconst Day = styled.div`\n  color: var(--ha-S50-contrast);\n`;\nconst Time = styled.div`\n  color: var(--ha-S200-contrast);\n  font-size: 0.8rem;\n`;\nconst Temperature = styled.div`\n  color: var(--ha-S50-contrast);\n  font-size: 0.8rem;\n`;\nconst TemperatureLow = styled.div`\n  color: var(--ha-S500-contrast);\n  font-size: 0.75rem;\n`;\n\ntype OmitProperties = \"as\" | \"entity\";\nexport interface WeatherCardProps extends Omit<CardBaseProps<\"div\", FilterByDomain<EntityName, \"weather\">>, OmitProperties> {\n  /** The name of your entity */\n  entity: FilterByDomain<EntityName, \"weather\">;\n  /** override the icon displayed before the title */\n  icon?: string;\n  /** the props for the icon, which includes styles for the icon */\n  iconProps?: Omit<IconProps, \"icon\">;\n  /** override the temperature suffix that's pulled from the entity, will retrieve the temperature_unit from entity by default\"  */\n  temperatureSuffix?: ReactNode;\n  /** include a title showing the forecast name @default true */\n  includeTitle?: boolean;\n  /** include the forecast @default true */\n  includeForecast?: boolean;\n  /** include the current forecast row, @default true */\n  includeCurrent?: boolean;\n  /** any related entities/sensors you want to include in the details section @default [] */\n  details?: ReactElement<typeof WeatherCardDetail>[];\n  /** include time value under day name @default true */\n  includeTime?: boolean;\n  /** include day name in forecast @default true */\n  includeDay?: boolean;\n  /** property on the weather entity attributes that returns the \"feels like\" temperature or \"apparent temperature\" @default \"apparent_temperature\" */\n  apparentTemperatureAttribute?: string;\n  /** the forecast type to display @default \"daily\" */\n  forecastType?: ModernForecastType;\n  /** The number of rows to display forecast information, @default 1 */\n  forecastRows?: number;\n  /** Whether to allow the user to toggle the forecast type. @default true */\n  allowForecastToggle?: boolean;\n}\n\nconst FORECAST_ITEM_PROJECTED_WIDTH = 50;\n\nfunction InternalWeatherCard({\n  entity,\n  title,\n  icon: _icon,\n  iconProps,\n  temperatureSuffix,\n  includeTitle = true,\n  includeForecast = true,\n  includeCurrent = true,\n  includeTime = true,\n  includeDay = true,\n  details = [],\n  apparentTemperatureAttribute = \"apparent_temperature\",\n  className,\n  service,\n  serviceData,\n  forecastType = \"daily\",\n  forecastRows = 1,\n  allowForecastToggle = true,\n  cssStyles,\n  key,\n  ...rest\n}: WeatherCardProps): React.ReactNode {\n  const config = useHass((state) => state.config);\n  const [width, setWidth] = useState<number>(0);\n  const globalComponentStyle = useHass((state) => state.globalComponentStyles);\n  const itemsToRender = Math.floor(width / FORECAST_ITEM_PROJECTED_WIDTH);\n  const [timeZone, setTimeZone] = useState<string>(\"UTC\");\n  const formatter = useHass((s) => s.formatter);\n  const helpers = useHass((s) => s.helpers);\n  // Determine 12/24h preference directly from locale using core helper\n  const shouldAmPm = helpers.dateTime.shouldUseAmPm();\n  const [type, setType] = useState<ModernForecastType>(forecastType);\n  const weather = useWeather(entity, {\n    type,\n  });\n  const isUnavailable = isUnavailableState(weather.state);\n  const icon = getIconByEntity(\"weather\", weather) as string;\n\n  const {\n    attributes: { friendly_name, temperature, temperature_unit },\n  } = weather;\n  useEffect(() => {\n    if (config?.time_zone && timeZone !== config.time_zone) {\n      setTimeZone(config.time_zone);\n    }\n  }, [config, timeZone]);\n\n  const supportedForecasts = useMemo(() => getSupportedForecastTypes(weather), [weather]);\n\n  useEffect(() => {\n    setType(forecastType);\n  }, [forecastType]);\n\n  const weatherDetails = useMemo(() => {\n    const { humidity, temperature, wind_speed, wind_speed_unit, temperature_unit } = weather.attributes;\n    const additional = getAdditionalWeatherInformation(temperature, temperature_unit, wind_speed, wind_speed_unit, humidity);\n    const apparentTemperature = weather.attributes[apparentTemperatureAttribute] as number | null | undefined;\n    return {\n      apparent_temperature: apparentTemperature ?? null,\n      ...weather.attributes,\n      ...(additional ?? {}),\n    };\n  }, [weather.attributes, apparentTemperatureAttribute]);\n\n  const feelsLikeBase = weatherDetails.apparent_temperature ?? weatherDetails.feelsLike;\n  const feelsLike = feelsLikeBase === temperature ? null : feelsLikeBase;\n\n  const forcastRowArrs = splitForecastsIntoRows(weather.forecast?.forecast ?? [], forecastRows, itemsToRender);\n\n  const genForecastRows = () => (\n    <>\n      {forcastRowArrs.map((forecastForRow, rowIdx) => (\n        <Row\n          className=\"row\"\n          fullHeight\n          key={`weather-${rowIdx}`}\n          style={{\n            justifyContent: \"space-between\",\n          }}\n        >\n          {forecastForRow.map((forecast, index) => {\n            const dateObj = new Date(forecast.datetime);\n            // Derive weekday, hour numeric, and optional AM/PM suffix via helpers.\n            const dayDisplay = formatter.formatDateWeekdayShort(dateObj);\n            const hourNumeric = formatter.formatHour(dateObj);\n            const suffix = shouldAmPm ? formatter.formatAmPmSuffix(dateObj) : \"\";\n            const hourDisplay = shouldAmPm ? `${hourNumeric} ${suffix}` : hourNumeric;\n            return (\n              <Forecast key={index} className=\"forecast\">\n                {includeDay && <Day className=\"day\">{dayDisplay}</Day>}\n                {includeTime && <Time className=\"time\">{hourDisplay}</Time>}\n                <ForecastIcon\n                  className=\"icon forecast-icon\"\n                  icon={\n                    getIconByEntity(\"weather\", {\n                      ...weather,\n                      state: forecast.condition as string,\n                    }) as string\n                  }\n                  {...(iconProps ?? {})}\n                />\n                <Temperature className=\"temperature\">\n                  {forecast.temperature}\n                  {temperatureSuffix || temperature_unit}\n                </Temperature>\n                {forecast.templow && (\n                  <TemperatureLow className=\"temperature-low\">\n                    {forecast.templow}\n                    {temperatureSuffix || temperature_unit}\n                  </TemperatureLow>\n                )}\n              </Forecast>\n            );\n          })}\n        </Row>\n      ))}\n    </>\n  );\n\n  return (\n    <Card\n      key={key}\n      title={title}\n      entity={entity}\n      // @ts-expect-error - don't know the entity name, so we can't know the service type\n      service={service}\n      // @ts-expect-error - don't know the entity name, so we can't know the service data\n      serviceData={serviceData}\n      className={`${className ?? \"\"} weather-card`}\n      resizeDetectorProps={{\n        refreshRate: 50,\n        refreshMode: \"throttle\",\n        onResize({ width: _width }) {\n          if (_width) {\n            setWidth(_width);\n          }\n        },\n      }}\n      cssStyles={`\n        ${globalComponentStyle?.weatherCard ?? \"\"}\n        ${cssStyles ?? \"\"}\n      `}\n      {...rest}\n    >\n      <Contents>\n        {includeCurrent && !isUnavailable && (\n          <Row className=\"row\" justifyContent=\"space-between\" fullWidth wrap=\"nowrap\">\n            <Row wrap=\"nowrap\">\n              <StyledIcon icon={icon} className=\"icon\" />\n              <Column className=\"column\" alignItems=\"flex-start\" justifyContent=\"center\">\n                {includeTitle && (\n                  <Title className=\"title\">\n                    <LocationIcon className=\"location-icon icon\" icon={_icon || \"mdi:location\"} />\n                    {title || friendly_name}\n                  </Title>\n                )}\n                <SubTitle className=\"sub-title\">\n                  <Row align-items=\"center\" justifyContent=\"flex-start\">\n                    <span className=\"temperature-value\">{formatter.attributeValue(weather, \"temperature\")}</span>\n                    <span className=\"sub-title-separator\">,&nbsp;</span>\n                    <span className=\"state-value\">{formatter.stateValue(weather)}</span>\n                  </Row>\n                </SubTitle>\n              </Column>\n            </Row>\n            {includeForecast && allowForecastToggle && (\n              <ButtonBar>\n                {supportedForecasts.map((forecastType, index) => {\n                  const icon =\n                    forecastType === \"daily\" ? \"mdi:view-day\" : forecastType === \"twice_daily\" ? \"mdi:hours-12\" : \"mdi:hourglass\";\n                  return (\n                    <ButtonBarButton\n                      key={index}\n                      onClick={() => {\n                        setType(forecastType);\n                      }}\n                      icon={icon}\n                      noIcon={false}\n                      title={forecastType}\n                      active={type === forecastType}\n                      rippleProps={{\n                        preventPropagation: true,\n                      }}\n                    />\n                  );\n                })}\n              </ButtonBar>\n            )}\n          </Row>\n        )}\n\n        {((details && details.length > 0) || typeof feelsLike === \"number\") && (\n          <Row gap=\"0.5rem\" className=\"row\" alignItems=\"flex-start\" justifyContent=\"space-between\" fullWidth>\n            {typeof feelsLike === \"number\" && (\n              <WeatherCardDetail\n                entity={entity}\n                title={localize(\"apparent_temperature\")}\n                render={() => {\n                  return `${localize(\"apparent_temperature\")} - ${Math.round(feelsLike)}${temperatureSuffix || temperature_unit}`;\n                }}\n              />\n            )}\n            {Children.map(details, (child, index) => {\n              if (isValidElement(child)) {\n                return cloneElement(child, {\n                  key: child.key || index,\n                });\n              }\n              return child;\n            })}\n          </Row>\n        )}\n        {includeForecast && !isUnavailable && width > 0 && genForecastRows()}\n        {isUnavailable && localize(\"unavailable\")}\n      </Contents>\n    </Card>\n  );\n}\n/** This will pull information from the weather entity provided to display the forecast provided by home assistant, this card will display exactly what the weather card in lovelace displays.\n *\n * It will render more information depending on the size of the card, the smaller the card, the less \"hourly / daily\" forecast items will be displayed.\n */\nexport function WeatherCard(props: WeatherCardProps) {\n  const defaultColumns: AvailableQueries = {\n    xxs: 12,\n    xs: 6,\n    sm: 6,\n    md: 4,\n    lg: 4,\n    xlg: 3,\n  };\n  return (\n    <ErrorBoundary {...fallback({ prefix: \"WeatherCard\" })}>\n      <InternalWeatherCard {...defaultColumns} {...props} />\n    </ErrorBoundary>\n  );\n}\n","import styled from \"@emotion/styled\";\nimport { ReactNode } from \"react\";\nimport { localize, useEntity } from \"@hakit/core\";\nimport type { EntityName, HassEntityWithService, ExtractDomain } from \"@hakit/core\";\nimport { Icon, type IconProps } from \"@iconify/react\";\nimport { Row, fallback, Tooltip, mq } from \"@components\";\nimport type { RowProps } from \"@components\";\nimport { ErrorBoundary } from \"react-error-boundary\";\n\nconst DetailsRow = styled(Row)`\n  width: auto;\n  ${mq(\n    [\"xxs\"],\n    `\n    width: 100%;\n  `,\n  )}\n`;\n\nconst State = styled.div`\n  color: var(--ha-S500-contrast);\n  font-size: 0.8rem;\n  white-space: nowrap;\n  overflow: hidden;\n  text-overflow: ellipsis;\n`;\n\nexport interface WeatherCardDetailProps extends Omit<RowProps, \"title\"> {\n  icon?: string;\n  /** the props for the icon, which includes styles for the icon */\n  iconProps?: Omit<IconProps, \"icon\">;\n  entity: EntityName;\n  title?: ReactNode;\n  suffix?: ReactNode;\n  render?: (value: HassEntityWithService<ExtractDomain<EntityName>>) => ReactNode;\n}\n\nfunction InternalWeatherCardDetail({ icon, iconProps, entity, title, suffix, render, ...rest }: WeatherCardDetailProps) {\n  const _entity = useEntity(entity);\n  const _title = title ?? _entity.attributes.friendly_name ?? \"\";\n  return (\n    <DetailsRow className=\"details\" gap=\"0rem\" justifyContent=\"flex-start\" {...rest}>\n      <Tooltip title={_title ?? localize(\"unknown\")}>\n        <Row className=\"row\" fullWidth gap=\"0.5rem\" justifyContent=\"flex-start\">\n          <Icon className=\"icon\" icon={icon ?? _entity.attributes.icon ?? \"mdi:info\"} {...(iconProps ?? {})} />\n          <State className=\"state\">\n            {typeof render === \"function\"\n              ? render(_entity)\n              : `${_title ? `${_title} - ` : \"\"}${_entity.state ?? \"\"}${\n                  !suffix && _entity.attributes.unit_of_measurement ? `${_entity.attributes.unit_of_measurement}` : (suffix ?? \"\")\n                }`}\n          </State>\n        </Row>\n      </Tooltip>\n    </DetailsRow>\n  );\n}\n\nexport function WeatherCardDetail(props: WeatherCardDetailProps) {\n  return (\n    <ErrorBoundary {...fallback({ prefix: \"WeatherCardDetail\" })}>\n      <InternalWeatherCardDetail {...props} />\n    </ErrorBoundary>\n  );\n}\n","import * as React from \"react\";\nconst SvgGarbageBin = (props) => /* @__PURE__ */ React.createElement(\"svg\", { xmlns: \"http://www.w3.org/2000/svg\", x: \"0px\", y: \"0px\", xmlSpace: \"preserve\", viewBox: \"0 0 77.41 123.36\", style: {\n  color: \"#444545\"\n}, ...props }, /* @__PURE__ */ React.createElement(\"defs\", null, /* @__PURE__ */ React.createElement(\"style\", { type: \"text/css\" }, \"\\n      .main-color{fill:currentColor;}\\n      .bin-wheel{fill:#1B1B1B;}\\n      .bin-wheel-inner{fill:#2D2D2D;}\\n      .overlay{\\n        fill:currentColor;\\n        filter: brightness(80%);\\n      }\\n    \")), /* @__PURE__ */ React.createElement(\"path\", { className: \"main-color\", d: \"M67.65,10S55,0,30.19,0C12,0,2.73,5.89,2.73,5.89a.87.87,0,0,0-.36.66v6.92a1.15,1.15,0,0,0,.31.73l.77.74a1.13,1.13,0,0,0,.74.29L67,13.91a.54.54,0,0,0,.51-.43L68,10.59A.64.64,0,0,0,67.65,10Z\" }), /* @__PURE__ */ React.createElement(\"path\", { className: \"main-color\", d: \"M62.25,19.9H7.18a.41.41,0,0,0-.42.43L11,117.24a1.16,1.16,0,0,0,.34.72l5.17,4.68a1.29,1.29,0,0,0,.75.29H39.57a1,1,0,0,0,.68-.35l17.87-25a1.88,1.88,0,0,0,.28-.78l4.25-76.45A.4.4,0,0,0,62.25,19.9Z\" }), /* @__PURE__ */ React.createElement(\"path\", { className: \"bin-wheel\", d: \"M63.13,110.22A13.14,13.14,0,1,1,50,97.08,13.14,13.14,0,0,1,63.13,110.22Z\" }), /* @__PURE__ */ React.createElement(\"path\", { className: \"overlay\", d: \"M54,24.2H14.91a.42.42,0,0,0-.42.43l4.12,93.5c0,.24.07.45.13.46a4.61,4.61,0,0,0,.64,0H33.84a1.82,1.82,0,0,0,.61-.09c.09,0,0-.48-.1-.69a20.13,20.13,0,0,1-1.8-7.62A17.46,17.46,0,0,1,50,92.78h.22a.43.43,0,0,0,.45-.41l3.78-67.74A.41.41,0,0,0,54,24.2Z\" }), /* @__PURE__ */ React.createElement(\"path\", { className: \"bin-wheel-inner\", d: \"M45.62,108.53l-5.43-2.8a10.49,10.49,0,0,0-.93,3.48l6.1.29A5.34,5.34,0,0,1,45.62,108.53Zm1.43-2-3.3-5.14A10.83,10.83,0,0,0,41.2,104l5.14,3.3A4.77,4.77,0,0,1,47.05,106.57Zm2.22-1L49,99.49a10.66,10.66,0,0,0-3.48.93l2.8,5.43A4.46,4.46,0,0,1,49.27,105.6Zm5.35,3.9,6.1-.29a10.73,10.73,0,0,0-.93-3.48l-5.43,2.8A5.34,5.34,0,0,1,54.62,109.5Zm-1-2.22,5.14-3.3a10.83,10.83,0,0,0-2.55-2.55l-3.3,5.14A4.77,4.77,0,0,1,53.64,107.28Zm-8.28,3.66-6.1.29a10.66,10.66,0,0,0,.93,3.48l5.43-2.8A5.13,5.13,0,0,1,45.36,110.94ZM45.5,120A10.42,10.42,0,0,0,49,121l.29-6.1a5.13,5.13,0,0,1-1-.26Zm8.86-8.11,5.43,2.8a10.66,10.66,0,0,0,.93-3.48l-6.1-.29A5.13,5.13,0,0,1,54.36,111.91Zm-8,1.25-5.14,3.3A10.65,10.65,0,0,0,43.75,119l3.3-5.14A4.77,4.77,0,0,1,46.34,113.16Zm6.59.71,3.3,5.14a10.65,10.65,0,0,0,2.55-2.55l-5.14-3.3A4.77,4.77,0,0,1,52.93,113.87Zm-2.22,1L51,121a10.49,10.49,0,0,0,3.48-.93l-2.8-5.43A5.13,5.13,0,0,1,50.71,114.85Zm3.77-14.43A10.66,10.66,0,0,0,51,99.49l-.29,6.11a4.46,4.46,0,0,1,1,.25Z\" }), /* @__PURE__ */ React.createElement(\"path\", { className: \"overlay\", d: \"M72.37,10.94,69.72,8.06A.5.5,0,0,0,69.08,8l-3.46,2.64a1.48,1.48,0,0,1-.77.26H.43a.43.43,0,0,0-.43.43v8.14a.43.43,0,0,0,.43.43H64.85a1.05,1.05,0,0,0,.71-.33l6.82-8A.51.51,0,0,0,72.37,10.94Z\" }), /* @__PURE__ */ React.createElement(\"path\", { className: \"main-color\", d: \"M77.41,8.11a4.69,4.69,0,1,1-4.69-4.69A4.69,4.69,0,0,1,77.41,8.11Z\" }), /* @__PURE__ */ React.createElement(\"path\", { className: \"overlay\", d: \"M75.36,8.11a2.64,2.64,0,1,1-2.64-2.64A2.64,2.64,0,0,1,75.36,8.11Z\" }));\nexport default SvgGarbageBin;\n","/* eslint-disable @typescript-eslint/no-namespace */\n/* eslint-disable @typescript-eslint/prefer-namespace-keyword */\nimport { useMemo, useEffect, useCallback, useRef, useState, CSSProperties, Key } from \"react\";\nimport { useEntity, useHass } from \"@hakit/core\";\nimport { Icon } from \"@iconify/react\";\nimport { fallback, Row, Column, CardBase, type CardBaseProps, type AvailableQueries } from \"@components\";\nimport { ErrorBoundary } from \"react-error-boundary\";\nimport styled from \"@emotion/styled\";\n// @ts-expect-error - this is a custom svg loader\nimport GarbageBin from \"./garbage-bin.svg?react\";\nimport { EntityName } from \"@hakit/core\";\n\nconst ASPECT_RATIO = 77.41 / 123.36;\n\nconst Card = styled(CardBase as React.ComponentType<CardBaseProps<\"div\", EntityName>>)``;\nconst Contents = styled.div`\n  padding: 1rem;\n  width: 100%;\n  height: 100%;\n  display: flex;\n  flex-direction: column;\n  align-items: stretch;\n  justify-content: space-between;\n`;\n\nconst Bin = styled.div<{\n  textColor?: CSSProperties[\"color\"];\n  iconColor?: CSSProperties[\"color\"];\n}>`\n  position: relative;\n  .vertical-text {\n    position: absolute;\n    inset: 0;\n    margin-top: 40%;\n    margin-left: 5%;\n    text {\n      transition: opacity var(--ha-transition-duration) var(--ha-easing);\n      opacity: 0;\n    }\n    ${(props) => typeof props.textColor === \"string\" && `color: ${props.textColor};`}\n  }\n  .bin-icon {\n    position: absolute;\n    top: 50%;\n    left: 50%;\n    transform: translate3d(-65%, -60%, 0);\n    ${(props) => typeof props.iconColor === \"string\" && `color: ${props.iconColor};`}\n  }\n`;\n\nconst BinBox = styled(Column)`\n  background: var(--ha-S500);\n  border-radius: 0.5rem;\n  padding: 0.5rem;\n  width: 50%;\n  &:nth-of-type(2n) {\n    margin-left: 1rem;\n  }\n  .collection-time {\n    font-size: 0.8rem;\n    color: var(--ha-S500-contrast);\n  }\n  .collection-title {\n    font-size: 0.8rem;\n    margin-bottom: 0.5rem;\n    color: var(--ha-S300-contrast);\n  }\n`;\n\nconst Title = styled.div`\n  color: var(--ha-S100-contrast);\n  font-size: 0.9rem;\n  font-weight: bold;\n`;\nconst Description = styled.div`\n  font-size: 0.8rem;\n  margin-top: 0.5rem;\n  color: var(--ha-S500-contrast);\n`;\n\ninterface VerticalTextProps {\n  height: number;\n  text: string;\n}\nfunction VerticalText({ height, text }: VerticalTextProps) {\n  const newWidth = height / ASPECT_RATIO / 2;\n  const newHeight = height / 1.3;\n  const textRef = useRef<SVGTextElement>(null);\n  const [fontSize, setFontSize] = useState(newHeight);\n\n  useEffect(() => {\n    const resizeText = () => {\n      if (textRef.current) {\n        const textLength = textRef.current.getComputedTextLength();\n        if (textLength > newHeight) {\n          setFontSize((oldFontSize) => oldFontSize * (newHeight / textLength));\n        }\n        textRef.current.style.opacity = \"1\";\n      }\n    };\n    resizeText();\n  }, [newHeight, text]);\n  return (\n    <svg width={newWidth} height={newHeight} className=\"vertical-text\">\n      <text\n        ref={textRef}\n        x=\"0\"\n        y=\"0\"\n        transform={`translate(${newWidth / 2}, ${newHeight / 2}) rotate(90)`}\n        textAnchor=\"middle\"\n        dominantBaseline=\"middle\"\n        fill=\"currentColor\"\n        fontSize={fontSize}\n      >\n        {text}\n      </text>\n    </svg>\n  );\n}\n\nexport module GarbageCollectionCardTypes {\n  export type Day = \"Sunday\" | \"Monday\" | \"Tuesday\" | \"Wednesday\" | \"Thursday\" | \"Friday\" | \"Saturday\";\n  export type Week = Array<BinProperties | CSSProperties[\"color\"]> | null;\n  export interface SvgProperties {\n    color: CSSProperties[\"color\"];\n    /** If the name is provided, this color will apply to the text of the bin @default rgba(0,0,0,0.6) */\n    textColor?: CSSProperties[\"color\"];\n    /** the color of the icon if provided to any of the bins @default rgba(0,0,0,0.6) */\n    iconColor?: CSSProperties[\"color\"];\n    /** the size of the rendered default svg @default 45 */\n    size?: number;\n  }\n  export interface BinProperties extends SvgProperties {\n    /** the name of the bin @default \"''\" */\n    name?: string;\n    /** the icon name from iconify to display over the bin, if provided as well as name, the display may look odd */\n    icon?: string;\n    /** if provided, the default garbage bin will not be rendered and you can render your own */\n    render?: (bin: BinProperties, key: Key) => React.ReactElement<HTMLElement>;\n  }\n\n  export interface Schedule {\n    /** optional title to appear in each schedule */\n    title?: React.ReactNode;\n    /** on what day does your garbage get collected */\n    day: GarbageCollectionCardTypes.Day;\n    /** as there's (usually) 4 weeks in a month, provide a config for each week, if you only have your garbage collected once a month, on a tuesday, specify null for the weeks that aren't relevant */\n    weeks: [\n      GarbageCollectionCardTypes.Week,\n      GarbageCollectionCardTypes.Week,\n      GarbageCollectionCardTypes.Week,\n      GarbageCollectionCardTypes.Week,\n    ];\n    /** how often is your garbage collected */\n    frequency: \"weekly\" | \"fortnightly\" | \"monthly\";\n    /** hide the next collection time @default false */\n    hideNextCollection?: boolean;\n  }\n}\n\ntype OmitProperties =\n  | \"onClick\"\n  | \"as\"\n  | \"title\"\n  | \"entity\"\n  | \"children\"\n  | \"disabled\"\n  | \"active\"\n  | \"service\"\n  | \"serviceData\"\n  | \"modalProps\"\n  | \"longPressCallback\"\n  | \"disableActiveState\"\n  | \"disableScale\"\n  | \"disableRipples\"\n  | \"rippleProps\";\nexport interface GarbageCollectionCardProps extends Omit<CardBaseProps, OmitProperties> {\n  /** The title of the card @default 'Garbage Collection' */\n  title?: React.ReactNode;\n  /** The description of the card @default undefined */\n  description?: React.ReactNode;\n  /** the schedule(s) for your garbage collection */\n  schedules: GarbageCollectionCardTypes.Schedule[];\n  /** the styles to apply globally to the garbage bin svg, this can be overwritten per week */\n  svg?: GarbageCollectionCardTypes.SvgProperties;\n  /** fired when the card is clicked */\n  onClick?: () => void;\n}\n\nfunction InternalGarbageCollectionCard({\n  schedules,\n  svg,\n  title = \"Garbage Collection\",\n  description,\n  className,\n  cssStyles,\n  key,\n  ...rest\n}: GarbageCollectionCardProps): React.ReactNode {\n  const globalComponentStyle = useHass((state) => state.globalComponentStyles);\n  const dateSensor = useEntity(\"sensor.date\", {\n    returnNullIfNotFound: true,\n  });\n  const defaultSVGProperties = useMemo<Required<GarbageCollectionCardTypes.SvgProperties>>(\n    () => ({\n      size: 45,\n      color: \"#484848\",\n      textColor: \"rgba(0,0,0,0.6)\",\n      iconColor: \"rgba(0,0,0,0.6)\",\n      ...(svg ?? {}),\n    }),\n    [svg],\n  );\n  const today = useMemo(() => {\n    const date = dateSensor === null ? new Date() : new Date(dateSensor.state);\n    // 0 (Sunday) - 6 (Saturday)\n    return date.getDay();\n  }, [dateSensor]);\n  const currentWeek = Math.floor(new Date().getDate() / 7);\n  const dayNames = useMemo(() => [\"Sunday\", \"Monday\", \"Tuesday\", \"Wednesday\", \"Thursday\", \"Friday\", \"Saturday\"], []);\n\n  const renderBin = useCallback(\n    (bin: CSSProperties[\"color\"] | GarbageCollectionCardTypes.BinProperties | undefined, key: Key) => {\n      if (typeof bin === \"object\" && typeof bin.render === \"function\") return bin.render(bin, key);\n      const size = typeof bin === \"string\" ? defaultSVGProperties.size : (bin?.size ?? defaultSVGProperties.size);\n      const color = typeof bin === \"string\" ? bin : (bin?.color ?? defaultSVGProperties.color);\n      const textColor = typeof bin === \"string\" ? defaultSVGProperties.textColor : (bin?.textColor ?? defaultSVGProperties.textColor);\n      const iconColor = typeof bin === \"string\" ? defaultSVGProperties.iconColor : (bin?.iconColor ?? defaultSVGProperties.iconColor);\n      const icon = typeof bin === \"string\" ? undefined : bin?.icon;\n      return (\n        <Bin className=\"bin-group\" key={key} textColor={textColor} iconColor={iconColor}>\n          {typeof bin !== \"string\" && typeof bin !== \"undefined\" && typeof bin.name === \"string\" && (\n            <VerticalText height={size} text={bin.name} />\n          )}\n          {typeof icon === \"string\" && (\n            <Icon\n              className=\"icon bin-icon\"\n              icon={icon}\n              style={{\n                fontSize: size / 2.7,\n              }}\n            />\n          )}\n          <GarbageBin\n            className=\"garbage-bin\"\n            style={{\n              color,\n              width: size,\n            }}\n          />\n        </Bin>\n      );\n    },\n    [defaultSVGProperties],\n  );\n\n  const formatTimeDisplay = useCallback((days: number) => {\n    return days === 0 ? \"Today\" : days === 1 ? \"Tomorrow\" : `in ${days} days`;\n  }, []);\n\n  const findNextNonNullWeek = useCallback((weeks: GarbageCollectionCardTypes.Week[], startWeek: number): number => {\n    for (let i = 0; i < weeks.length; i++) {\n      const index = (startWeek + i) % weeks.length;\n      if (weeks[index] !== null) {\n        return index;\n      }\n    }\n    return -1; // return an invalid index if no non-null weeks are found\n  }, []);\n\n  const collections = useMemo(\n    () =>\n      schedules.flatMap((schedule) => {\n        const scheduleDay = dayNames.map((x) => x.toLowerCase()).indexOf(schedule.day.toLowerCase());\n        const daysUntilCollection = (scheduleDay - today + 7) % 7;\n\n        const futureDate = new Date();\n        futureDate.setDate(new Date().getDate() + daysUntilCollection);\n\n        const bins = schedule.weeks[currentWeek];\n        let nextWeekIndex = (currentWeek + 1) % schedule.weeks.length;\n\n        // Find next non-null week for non-weekly frequencies\n        if (schedule.frequency !== \"weekly\") {\n          nextWeekIndex = findNextNonNullWeek(schedule.weeks, currentWeek);\n        }\n\n        const nextBins = schedule.weeks[nextWeekIndex];\n        const timeUntilCollection = formatTimeDisplay(daysUntilCollection);\n        // ignore next week if null (no collection)\n        if (schedule.hideNextCollection || nextBins === null) {\n          return [\n            {\n              schedule,\n              timeUntilCollection,\n              bins,\n            },\n          ];\n        }\n\n        const nextFutureDate = new Date(futureDate);\n        let incrementDays;\n\n        switch (schedule.frequency) {\n          case \"weekly\":\n            incrementDays = 7;\n            break;\n          case \"fortnightly\":\n            incrementDays = 14;\n            break;\n          case \"monthly\":\n            incrementDays = 28; // Closest approximation to average days in a month\n            break;\n          default:\n            incrementDays = 7;\n        }\n\n        nextFutureDate.setDate(futureDate.getDate() + incrementDays);\n\n        const daysUntilNextCollection = daysUntilCollection + incrementDays;\n\n        const nextCollectionTime = formatTimeDisplay(daysUntilNextCollection);\n        return [\n          {\n            schedule,\n            timeUntilCollection,\n            bins,\n          },\n          {\n            schedule,\n            timeUntilCollection: nextCollectionTime,\n            bins: nextBins,\n          },\n        ];\n      }),\n    [currentWeek, dayNames, schedules, today, findNextNonNullWeek, formatTimeDisplay],\n  );\n  return (\n    <Card\n      key={key}\n      cssStyles={`\n      ${globalComponentStyle?.garbageCollectionCard ?? \"\"}\n      ${cssStyles ?? \"\"}\n    `}\n      disableActiveState\n      disableRipples\n      disableScale\n      className={`garbage-collection-card ${className ?? \"\"}`}\n      {...rest}\n    >\n      <Contents>\n        <Column alignItems=\"flex-start\" fullWidth>\n          <Title className=\"title\">{title}</Title>\n          {typeof description !== \"undefined\" && <Description className=\"description\">{description}</Description>}\n        </Column>\n        <Row\n          className=\"row\"\n          fullWidth\n          wrap=\"nowrap\"\n          justifyContent=\"space-between\"\n          style={{\n            marginTop: \"0.5rem\",\n          }}\n        >\n          {collections\n            .filter((collection) => collection.bins !== null)\n            .map((collection, index) => {\n              return (\n                <BinBox className=\"bin-box\" key={index}>\n                  {typeof collection.schedule.title !== \"undefined\" && <div className=\"collection-title\">{collection.schedule.title}</div>}\n                  <Row className=\"row\" wrap=\"nowrap\" gap=\"1rem\">\n                    {collection.bins && collection.bins.map((bin, index) => renderBin(bin, index))}\n                  </Row>\n                  <div className=\"collection-time\">{collection.timeUntilCollection}</div>\n                </BinBox>\n              );\n            })}\n        </Row>\n      </Contents>\n    </Card>\n  );\n}\n/**\n * This card is useful to remind you of schedule of the pickup of our rubbish bins, it's very simple, yet highly customizable.\n *\n * It uses the current date (either provided by home assistant sensor.date or via javascript to determine the current day of the week, and then calculates the next collection date based on the schedule provided.\n *\n * You can change the color of the bin, by simply providing a css color property or providing an object will allow you to change colors, size of the bin, text, textColors, icon or even a custom render function.\n *\n * It will also allow you to create multiple schedules if you need to.\n *\n * You can also hide the \"next\" collection by passing through hideNextCollection on the schedule.\n *\n * WARNING: If the approach I've taken for schedules doesn't work for you, reach out on github an open an new issue with some details on what isn't working for you!\n *\n * Here's an example of some of the customization achievable:\n * */\nexport function GarbageCollectionCard(props: GarbageCollectionCardProps) {\n  const defaultColumns: AvailableQueries = {\n    xxs: 12,\n    xs: 6,\n    sm: 6,\n    md: 4,\n    lg: 4,\n    xlg: 3,\n  };\n  return (\n    <ErrorBoundary {...fallback({ prefix: \"GarbageCollectionCard\" })}>\n      <InternalGarbageCollectionCard {...defaultColumns} {...props} />\n    </ErrorBoundary>\n  );\n}\n","import styled from \"@emotion/styled\";\nimport { useMemo, useRef, useCallback, useEffect, useState } from \"react\";\nimport { type HassEntityWithService, useHass, useEntity, FilterByDomain, EntityName } from \"@hakit/core\";\nimport { Icon, type IconProps } from \"@iconify/react\";\nimport { Row, Column, fallback, CardBase, type CardBaseProps, type AvailableQueries } from \"@components\";\nimport { createDateFormatter, daySuffix } from \"./formatter\";\nimport { ErrorBoundary } from \"react-error-boundary\";\nimport { FormatFunction } from \"./types\";\nimport { Time, AmOrPm } from \"./shared\";\n\nconst Card = styled(CardBase as React.ComponentType<CardBaseProps<\"div\", FilterByDomain<EntityName, \"sensor\">>>)`\n  cursor: default;\n`;\n\nconst Contents = styled.div`\n  padding: 1rem;\n  height: 100%;\n  .primary-icon {\n    color: var(--ha-A200);\n    font-size: 30px;\n  }\n  &:not(:disabled),\n  &:not(.disabled) {\n    &:hover,\n    &:active {\n      .primary-icon {\n        color: var(--ha-A400);\n      }\n    }\n  }\n`;\n\n// We intentionally removed bespoke locale logic in favor of the central formatter exposed via useHass.\n// The only custom logic retained locally is the ordinal day suffix (1st, 2nd, 3rd...) which Home Assistant\n// itself does not currently expose as a dedicated helper; we compose that around the shared formatter parts.\ntype CustomFormatter = (date: Date, formatter: FormatFunction) => React.ReactNode;\ntype OmitProperties = \"title\" | \"as\" | \"active\" | \"entity\" | \"service\" | \"serviceData\" | \"longPressCallback\" | \"modalProps\";\nexport interface TimeCardProps extends Omit<CardBaseProps<\"div\">, OmitProperties> {\n  /** Optional Home Assistant sensor providing time (state string HH:MM). If omitted, component uses internal ticking clock.\n   * Entity value is assumed already localized by HA; we only derive optional AM/PM suffix. */\n  timeEntity?: FilterByDomain<EntityName, \"sensor\">;\n  /** Optional Home Assistant sensor providing date (state string YYYY-MM-DD). If omitted, component uses current date locally but\n   * formats via HA locale/timezone helpers. */\n  dateEntity?: FilterByDomain<EntityName, \"sensor\">;\n  /** Custom time format pattern or function. Providing this always ignores `timeEntity` even if present.\n   * Pattern uses intl-dateformat style tokens; function receives (date, haFormatter). */\n  timeFormat?: string | CustomFormatter;\n  /** Custom date format pattern or function. Providing this always ignores `dateEntity` even if present.\n   * Pattern uses intl-dateformat style tokens; function receives (date, haFormatter). */\n  dateFormat?: string | CustomFormatter;\n  /** Hide the date portion entirely. @default false */\n  hideDate?: boolean;\n  /** Hide the time portion entirely. @default false */\n  hideTime?: boolean;\n  /** Hide the leading icon. @default false */\n  hideIcon?: boolean;\n  /** Milliseconds throttle for internal ticker when NOT entity-driven (custom formats or missing entities). @default 1000 */\n  throttleTime?: number;\n  /** Override icon; falls back to date entity icon or mdi:calendar. */\n  icon?: string;\n  /** Additional icon props/styles. */\n  iconProps?: Omit<IconProps, \"icon\">;\n  /** Center align contents instead of left alignment. @default false */\n  center?: boolean;\n  /** Click handler; receives time sensor entity when entity-driven. */\n  onClick?: (entity: HassEntityWithService<\"sensor\">, event: React.MouseEvent<HTMLElement, MouseEvent>) => void;\n}\n\nconst DEFAULT_TIME_FORMAT = \"hh:mm A\";\nconst DEFAULT_DATE_FORMAT = \"dddd, MMMM DD YYYY\";\n\nconst customFormatter = createDateFormatter({});\n// HA-aware wrapper adding locale & timezone when formatting outside entity-driven mode.\n// Ensures non-entity clock/date respects Home Assistant user preferences instead of browser defaults.\n\nfunction InternalTimeCard({\n  timeEntity,\n  dateEntity,\n  timeFormat,\n  dateFormat,\n  throttleTime = 1000,\n  hideDate = false,\n  hideIcon = false,\n  hideTime = false,\n  center = false,\n  icon,\n  iconProps,\n  className,\n  children,\n  disabled,\n  onClick,\n  cssStyles,\n  key,\n  ...rest\n}: TimeCardProps): React.ReactNode {\n  const [currentTime, setCurrentTime] = useState(new Date());\n  // Access the centralized, timezone & locale aware formatter from the store (HA config + user profile driven)\n  const formatter = useHass((s) => s.formatter);\n  const locale = useHass((s) => s.locale);\n  const config = useHass((s) => s.config);\n  const language = locale?.language;\n  const timeZone = config?.time_zone;\n\n  const { formatAmPmSuffix, formatDateWeekday, formatDateMonth, formatDateYear, formatTime } = formatter;\n  const previousTimeRef = useRef<number>(Date.now());\n  const requestRef = useRef<number>(undefined);\n  const globalComponentStyle = useHass((state) => state.globalComponentStyles);\n  const timeSensor = useEntity(timeEntity ?? \"unknown\", {\n    returnNullIfNotFound: true,\n  });\n  const dateSensor = useEntity(dateEntity ?? \"unknown\", {\n    returnNullIfNotFound: true,\n  });\n  const dateIcon = useMemo(() => icon || dateSensor?.attributes?.icon || \"mdi:calendar\", [icon, dateSensor]);\n  const [formatted, amOrPm] = useMemo(() => {\n    // Entity-driven path: sensor.time already reflects HA timezone & user locale preferences.\n    // Do not re-format the HH:MM portion; only optionally derive AM/PM suffix if user prefers 12h.\n    if (timeSensor && !timeFormat) {\n      const raw = timeSensor.state ?? \"00:00\"; // 24h HH:MM\n      const [h, m] = raw.split(\":\").map(Number);\n      const entityDate = new Date();\n      entityDate.setHours(h, m, 0, 0);\n      // Decide suffix using HA-aware formatter; keep raw string unchanged.\n      return [raw, formatAmPmSuffix(entityDate)];\n    }\n    // Non-entity path: use HA-aware formatter (NOT browser locale/timezone) for both parts.\n    const timeStr = formatTime(currentTime); // includes suffix if AM/PM preference, else 24h.\n    // Split suffix out so UI stays consistent with separate span.\n    const match = timeStr.match(/^(.*?)(?:\\s([AP]M))$/i);\n    if (match) {\n      return [match[1], match[2]];\n    }\n    return [timeStr, undefined];\n  }, [timeSensor, timeFormat, currentTime, formatTime, formatAmPmSuffix]);\n  const hasOnClick = typeof onClick === \"function\";\n\n  // Memoized HA format function (FormatFunction signature) injecting locale/timezone.\n  const haFormatter = useCallback<FormatFunction>(\n    (date, format, opts) => {\n      return customFormatter(date, format, { locale: language, timezone: timeZone, ...opts });\n    },\n    [language, timeZone],\n  );\n\n  const timeValue = useMemo(() => {\n    if (timeSensor && !timeFormat) {\n      return (\n        <>\n          <Time className=\"time\">{formatted}</Time>\n          {amOrPm && <AmOrPm className=\"time-suffix\">{amOrPm}</AmOrPm>}\n        </>\n      );\n    }\n    // Custom formatter path retained for backwards compatibility; note it uses browser timezone.\n    // Prefer built-in HA formatter functions instead; if user supplies pattern we fall back.\n    if (!timeSensor && !timeFormat) {\n      return (\n        <>\n          <Time className=\"time\">{formatted}</Time>\n          {amOrPm && <AmOrPm className=\"time-suffix\">{amOrPm}</AmOrPm>}\n        </>\n      );\n    }\n    try {\n      return (\n        <Time className=\"time\">\n          {typeof timeFormat === \"function\"\n            ? timeFormat(currentTime, haFormatter)\n            : haFormatter(currentTime, timeFormat ?? DEFAULT_TIME_FORMAT)}\n        </Time>\n      );\n    } catch (e) {\n      console.error(\"Time formatting error\", e);\n      return <Time className=\"time\">{formatted}</Time>;\n    }\n  }, [amOrPm, currentTime, formatted, timeFormat, timeSensor, haFormatter]);\n\n  const dateValue = useMemo(() => {\n    if (hideDate) return null;\n    try {\n      // Entity path using HA date entity (YYYY-MM-DD) and HA-aware formatter parts.\n      if (dateSensor && !dateFormat) {\n        const parts = dateSensor.state.split(\"-\").map(Number);\n        if (parts.length === 3) {\n          const d = new Date(parts[0], parts[1] - 1, parts[2]);\n          const day = d.getDate();\n          const suffix = daySuffix(day);\n          // Compose: Weekday, Month <day><suffix> <year>\n          return `${formatDateWeekday(d)}, ${formatDateMonth(d)} ${day}${suffix} ${formatDateYear(d)}`;\n        }\n      }\n      // Non-entity default path: build HA timezone/locale aware date using formatter parts (with ordinal).\n      if (!dateSensor && !dateFormat) {\n        const d = currentTime;\n        const day = d.getDate();\n        const suffix = daySuffix(day);\n        return `${formatDateWeekday(d)}, ${formatDateMonth(d)} ${day}${suffix} ${formatDateYear(d)}`;\n      }\n      // Custom formatting path now injected with HA locale/timezone via haFormatter.\n      return typeof dateFormat === \"function\"\n        ? dateFormat(currentTime, haFormatter)\n        : haFormatter(currentTime, dateFormat ?? DEFAULT_DATE_FORMAT);\n    } catch (e) {\n      console.error(\"Date formatting error\", e);\n      return haFormatter(currentTime, DEFAULT_DATE_FORMAT);\n    }\n  }, [hideDate, dateSensor, dateFormat, currentTime, formatDateWeekday, formatDateMonth, formatDateYear, haFormatter]);\n\n  const updateClock = useCallback(() => {\n    const now = Date.now();\n    const elapsed = now - previousTimeRef.current;\n    if (elapsed >= throttleTime) {\n      setCurrentTime(new Date());\n      previousTimeRef.current = now - (elapsed % throttleTime);\n    }\n    requestRef.current = requestAnimationFrame(updateClock);\n  }, [throttleTime]);\n\n  // Only run a ticker when we are NOT fully entity-driven for both time & date (i.e. custom formats or missing entities)\n  const needTicker = useMemo(() => {\n    const timeEntityDriven = timeSensor && !timeFormat;\n    const dateEntityDriven = dateSensor && !dateFormat;\n    return !(timeEntityDriven && dateEntityDriven);\n  }, [timeSensor, timeFormat, dateSensor, dateFormat]);\n\n  useEffect(() => {\n    if (!needTicker) return; // Entity-driven; rely on websocket updates.\n    requestRef.current = requestAnimationFrame(updateClock);\n    return () => {\n      if (requestRef.current) cancelAnimationFrame(requestRef.current);\n    };\n  }, [needTicker, updateClock]);\n\n  return (\n    <Card\n      key={key}\n      cssStyles={`\n        ${globalComponentStyle?.timeCard ?? \"\"}\n        ${cssStyles ?? \"\"}\n      `}\n      className={`${className ?? \"\"} time-card`}\n      disableScale={disabled || !hasOnClick}\n      disableActiveState={rest.disableActiveState ?? !hasOnClick}\n      disableRipples={rest.disableRipples ?? !hasOnClick}\n      onClick={(_: unknown, event: React.MouseEvent<HTMLElement, MouseEvent>) => {\n        if (hasOnClick && timeSensor) {\n          onClick?.(timeSensor, event);\n        }\n      }}\n      {...rest}\n    >\n      <Contents>\n        <Column className=\"column\" gap=\"0.5rem\" alignItems={center ? \"center\" : \"flex-start\"} fullHeight wrap=\"nowrap\">\n          {(!hideIcon || !hideTime) && (\n            <Row className=\"row\" gap=\"0.5rem\" alignItems=\"center\" wrap=\"nowrap\">\n              {!hideIcon && <Icon className=\"icon primary-icon\" icon={dateIcon} {...(iconProps ?? {})} />}\n              {!hideTime && timeValue}\n            </Row>\n          )}\n          {!hideDate && <Row>{dateValue}</Row>}\n        </Column>\n        {children && <div className=\"children\">{children}</div>}\n      </Contents>\n    </Card>\n  );\n}\n/**\n *\n * Default behavior: Renders current clock time & date using Home Assistant locale, timezone and 12/24h preference.\n * It maintains an internal ticking Date (throttled) unless both a `timeEntity` and `dateEntity` are provided\n * without custom format overrides—in which case updates rely on HA websocket events. Entities are optional.\n *\n * Custom formats (timeFormat/dateFormat): Always override entity usage for that portion. The function versions of the formatters will receive a timezone/locale aware formatter from the home assistant instance, so output still respects user settings. Pattern strings use intl-dateformat tokens.\n *\n * Ordinal day suffix (1st, 2nd, 3rd...) is added locally when composing default date output.\n */\nexport function TimeCard(props: TimeCardProps) {\n  const defaultColumns: AvailableQueries = {\n    xxs: 12,\n    xs: 6,\n    sm: 6,\n    md: 4,\n    lg: 4,\n    xlg: 3,\n  };\n  return (\n    <ErrorBoundary {...fallback({ prefix: \"TimeCard\" })}>\n      <InternalTimeCard {...defaultColumns} {...props} />\n    </ErrorBoundary>\n  );\n}\n","import styled from \"@emotion/styled\";\nimport { css, Global } from \"@emotion/react\";\nimport { useEffect, useMemo, useState, useId } from \"react\";\nimport { createPortal } from \"react-dom\";\nimport { localize, useHass, type EntityName } from \"@hakit/core\";\nimport { Row, FabCard, fallback, mq, PreloadImage, CardBase } from \"@components\";\nimport type { PictureCardProps, CardBaseProps, AvailableQueries } from \"@components\";\nimport { Icon } from \"@iconify/react\";\nimport { useKeyPress } from \"react-use\";\nimport { ErrorBoundary } from \"react-error-boundary\";\n\ntype OmitProperties =\n  | \"as\"\n  | \"active\"\n  | \"title\"\n  | \"entity\"\n  | \"modalProps\"\n  | \"entity\"\n  | \"serviceData\"\n  | \"service\"\n  | \"disableRipples\"\n  | \"disableScale\"\n  | \"disableActiveState\"\n  | \"rippleProps\"\n  | \"service\"\n  | \"serviceData\"\n  | \"longPressCallback\"\n  | \"onClick\"\n  | \"modalProps\";\n\ntype Extendable = PictureCardProps & Omit<CardBaseProps<\"div\", EntityName>, OmitProperties>;\nexport interface AreaCardProps extends Extendable {\n  /** the hash of the area, eg \"office\", \"living-room\", this will set the hash in the url bar and activate the area */\n  hash: string;\n  /** The children to render when the area is activated */\n  children: React.ReactNode;\n  /** called when the card is pressed */\n  onClick?: () => void;\n  /** disable the click events on the card, useful if you want to disable the area card for certain situations like drag or panning @default false */\n  disable?: boolean;\n}\n\nconst StyledAreaCard = styled(CardBase as React.ComponentType<CardBaseProps<\"div\", EntityName>>)<Partial<PictureCardProps>>`\n  aspect-ratio: 16 / 9;\n  background-color: transparent;\n  &:hover,\n  &:active {\n    background-color: transparent !important;\n  }\n  height: var(--stretch,);\n`;\n\nconst PictureCardFooter = styled.div`\n  all: unset;\n  font-family: var(--ha-font-family);\n  padding: 1rem;\n  color: var(--ha-500-contrast);\n  background-color: var(--ha-background-opaque);\n  transition: color var(--ha-transition-duration) var(--ha-easing);\n  position: absolute;\n  inset: auto 0 0 0;\n  font-weight: bold;\n  font-size: 1.2rem;\n`;\n\nconst NavBar = styled(PictureCardFooter)`\n  padding: 0.95rem;\n  color: var(--ha-S100-contrast);\n  background-color: var(--ha-S50);\n  inset: 0 0 auto 0;\n  z-index: calc(var(--ha-device-area-card-z-index) + 1);\n  border-bottom: 1px solid var(--ha-S200);\n`;\n\nconst FullScreen = styled.div`\n  position: fixed;\n  inset: 0;\n  left: var(--ha-area-card-expanded-offset);\n  padding: 0;\n  margin: 0;\n  max-height: 100svh;\n  background: var(--ha-S100);\n  z-index: var(--ha-device-area-card-z-index);\n  display: flex;\n  justify-content: center;\n  align-items: stretch;\n  transition: left var(--ha-transition-duration) var(--ha-easing);\n  color: var(--ha-S50-contrast);\n  ${mq(\n    [\"xxs\", \"xs\"],\n    `\n    left: 0;\n  `,\n  )}\n`;\n\nconst ChildContainer = styled.div`\n  margin-top: 5rem;\n  display: flex;\n  justify-content: flex-start;\n  align-items: center;\n  width: 100%;\n  overflow-y: auto;\n  flex-direction: column;\n`;\n\nfunction InternalAreaCard({\n  hash,\n  children,\n  icon,\n  title,\n  image,\n  className,\n  preloadProps,\n  onClick,\n  disable = false,\n  id,\n  cssStyles,\n  key,\n  ...rest\n}: AreaCardProps) {\n  const _id = useId();\n  const idRef = id ?? _id;\n  const { addRoute, getRoute } = useHass.getState().helpers;\n  const dynamicHash = useHass((store) => store.hash);\n  const globalComponentStyle = useHass((state) => state.globalComponentStyles);\n  const portalRoot = useHass((store) => store.portalRoot);\n  const windowContext = useHass((store) => store.windowContext);\n  const win = windowContext ?? window;\n  const [isPressed] = useKeyPress((event) => event.key === \"Escape\");\n  const [open, setOpen] = useState(false);\n  // we want to retrigger this effect when the actual hash changes\n  // eslint-disable-next-line react-hooks/exhaustive-deps\n  const route = useMemo(() => getRoute(hash), [hash, getRoute, dynamicHash]);\n\n  useEffect(() => {\n    // if the route is active, and active isn't set, set it\n    if (route?.active && !open) {\n      setOpen(true);\n      // if the route isn't active, and we're open, close it\n    } else if (!route?.active && open) {\n      setOpen(false);\n    }\n  }, [route, open]);\n\n  useEffect(() => {\n    // add the current route by hash, even though this is called multiple times\n    // it will only add it the first time\n    addRoute({\n      hash,\n      icon: icon || \"mdi:info\",\n      name: title,\n    });\n  }, [addRoute, hash, icon, title]);\n\n  // when the escape key is pressed and we're active, close the card\n  useEffect(() => {\n    if (isPressed && open) {\n      // setting the hash change here, will also bubble up to the provider\n      // which will update the routes, which will update the state automatically.\n      location.hash = \"\";\n    }\n  }, [isPressed, open]);\n\n  return (\n    <>\n      {open &&\n        createPortal(\n          open === true && (\n            <FullScreen key={`fullscreen-layout-${idRef}`} className={\"full-screen\"}>\n              <Global\n                styles={css`\n                  :root {\n                    --ha-hide-body-overflow-y: hidden;\n                  }\n                `}\n              />\n              <NavBar className={\"nav-bar\"}>\n                <Row gap=\"0.5rem\" justifyContent=\"space-between\" className={\"row\"}>\n                  <Row gap=\"0.5rem\" className={\"row\"}>\n                    {icon && <Icon className={\"icon\"} icon={icon} />}\n                    {title}\n                  </Row>\n                  <FabCard\n                    title={localize(\"close\")}\n                    tooltipPlacement=\"left\"\n                    icon=\"mdi:close\"\n                    onClick={() => {\n                      location.hash = \"\";\n                    }}\n                  />\n                </Row>\n              </NavBar>\n              <ChildContainer className={\"child-container\"}>{children}</ChildContainer>\n            </FullScreen>\n          ),\n          portalRoot ?? win.document.body,\n          idRef,\n        )}\n      <StyledAreaCard\n        key={key}\n        disableActiveState\n        disableRipples\n        id={`${idRef}-area-card`}\n        className={`area-card ${className ?? \"\"}`}\n        onClick={() => {\n          if (!disable) {\n            location.hash = hash;\n            if (onClick) {\n              onClick();\n            }\n          }\n        }}\n        cssStyles={`\n          ${globalComponentStyle.areaCard ?? \"\"}\n          ${cssStyles ?? \"\"}\n        `}\n        {...rest}\n      >\n        <PreloadImage\n          {...(preloadProps ?? {})}\n          src={image}\n          style={{\n            width: \"100%\",\n            height: \"100%\",\n            position: \"absolute\",\n          }}\n          lazy\n        >\n          <PictureCardFooter className={\"footer\"}>\n            <Row gap={\"0.5rem\"} className={\"row\"}>\n              {icon && (\n                <Icon\n                  className={\"icon\"}\n                  icon={icon}\n                  style={{\n                    color: `var(--ha-500-contrast)`,\n                  }}\n                />\n              )}\n              {title}\n            </Row>\n          </PictureCardFooter>\n        </PreloadImage>\n      </StyledAreaCard>\n    </>\n  );\n}\n/** The AreaCard component is a very simple way of categorizing all your entities into a single \"PictureCard\" which will show all the entities when clicked. */\nexport function AreaCard(props: AreaCardProps) {\n  const defaultColumns: AvailableQueries = {\n    xxs: 12,\n    xs: 6,\n    sm: 6,\n    md: 4,\n    lg: 4,\n    xlg: 3,\n  };\n  return (\n    <ErrorBoundary {...fallback({ prefix: \"AreaCard\" })}>\n      <InternalAreaCard {...defaultColumns} {...props} />\n    </ErrorBoundary>\n  );\n}\n","import { useMemo, useState, useCallback } from \"react\";\nimport styled from \"@emotion/styled\";\nimport { type AvailableQueries, fallback } from \"@components\";\nimport type { VacuumControlsProps } from \"@components\";\nimport { useHass, useEntity, localize, type EntityName, type FilterByDomain } from \"@hakit/core\";\nimport { VacuumImage } from \"../../Shared/Entity/Vacuum/VacuumControls/VacuumImage\";\nimport { ErrorBoundary } from \"react-error-boundary\";\nimport { getToolbarActions } from \"../../Shared/Entity/Vacuum/VacuumControls/shared\";\nimport { FeatureEntity } from \"../CardBase/FeatureEntity\";\nimport { ButtonCard, type ButtonCardProps } from \"../ButtonCard\";\n\nconst StyledVacuumCard = styled(ButtonCard)`\n  .footer {\n    margin-top: 0.5rem;\n  }\n`;\n\nconst StyledVacuumImage = styled(VacuumImage)`\n  width: 100%;\n`;\n\ntype OmitProperties = \"title\" | \"features\";\nexport type VacuumCardProps = Omit<ButtonCardProps<FilterByDomain<EntityName, \"vacuum\">>, OmitProperties> & {\n  /** An optional override for the title */\n  title?: string;\n} & VacuumControlsProps;\n\nfunction InternalVacuumCard({\n  entity: _entity,\n  shortcuts,\n  hideCurrentBatteryLevel,\n  hideState = false,\n  hideUpdated = false,\n  hideToolbar = false,\n  className,\n  cssStyles,\n  serviceData,\n  service,\n  modalProps,\n  customImage,\n  locatingNode,\n  ...rest\n}: VacuumCardProps) {\n  const [flash, setFlash] = useState(false);\n  const globalComponentStyle = useHass((state) => state.globalComponentStyles);\n  const entity = useEntity(_entity);\n\n  const titleValue = useMemo(() => {\n    return flash ? (locatingNode ?? `${localize(\"locate\")}...`) : (entity.attributes.status ?? entity.state);\n  }, [entity.attributes.status, locatingNode, entity.state, flash]);\n\n  const locateFlash = useCallback(() => {\n    setFlash(true);\n    setTimeout(() => {\n      setFlash(false);\n    }, 2000);\n  }, []);\n\n  const features = getToolbarActions({\n    entity,\n    shortcuts,\n    onLocate() {\n      locateFlash();\n    },\n  });\n  return (\n    <StyledVacuumCard\n      className={`${className ?? \"\"} vacuum-card`}\n      modalProps={{\n        stateTitle: titleValue,\n        locatingNode,\n        hideCurrentBatteryLevel,\n        hideState,\n        hideUpdated,\n        hideToolbar,\n        shortcuts,\n        ...modalProps,\n      }}\n      entity={_entity}\n      // @ts-expect-error - don't know the entity name, so we can't know the service type\n      service={service}\n      // @ts-expect-error - don't know the entity name, so we can't know the service data\n      serviceData={serviceData}\n      disableActiveState\n      disableRipples\n      hideToggle\n      cssStyles={`\n        ${globalComponentStyle.vacuumCard ?? \"\"}\n        ${cssStyles ?? \"\"}\n      `}\n      icon={<StyledVacuumImage src={customImage} className={entity.state} />}\n      customRenderState={() => titleValue}\n      fabProps={{\n        style: {\n          padding: 0,\n          backgroundColor: \"none\",\n          width: \"3rem\",\n          height: \"3rem\",\n        },\n      }}\n      features={features.map((feature, index) => (\n        <FeatureEntity\n          key={index}\n          iconProps={{\n            color: feature?.active ? \"var(--ha-300)\" : undefined,\n          }}\n          {...feature}\n        />\n      ))}\n      {...rest}\n    />\n  );\n}\n\n/** The VacuumCard is a card to easily interact with vacuum entities, you should have full control over your vacuum entity and even more controls when you long press on the card.\n */\nexport function VacuumCard(props: VacuumCardProps) {\n  const defaultColumns: AvailableQueries = {\n    xxs: 12,\n    xs: 6,\n    sm: 6,\n    md: 4,\n    lg: 4,\n    xlg: 3,\n  };\n  return (\n    <ErrorBoundary {...fallback({ prefix: \"VacuumCard\" })}>\n      <InternalVacuumCard {...defaultColumns} {...props} />\n    </ErrorBoundary>\n  );\n}\n","import styled from \"@emotion/styled\";\nimport { Icon, type IconProps } from \"@iconify/react\";\nimport { Row, fallback, PreloadImage, CardBase, type CardBaseProps, type PreloadImageProps, type AvailableQueries } from \"@components\";\nimport { ErrorBoundary } from \"react-error-boundary\";\nimport { EntityName } from \"@hakit/core\";\n\ntype OmitProperties =\n  | \"title\"\n  | \"as\"\n  | \"active\"\n  | \"entity\"\n  | \"disabled\"\n  | \"service\"\n  | \"serviceData\"\n  | \"onClick\"\n  | \"active\"\n  | \"longPressCallback\"\n  | \"modalProps\";\n\nexport interface PictureCardProps extends Omit<CardBaseProps<\"button\">, OmitProperties> {\n  /** an image to provide to the card */\n  image: string;\n  /** a title of the card */\n  title: string;\n  /** an optional icon to provide */\n  icon?: string;\n  /** the props for the icon, which includes styles for the icon */\n  iconProps?: Omit<IconProps, \"icon\">;\n  /** an object containing the props to pass to the preloader */\n  preloadProps?: PreloadImageProps;\n  /** called when the card is pressed */\n  onClick?: () => void;\n}\n\nconst StyledPictureCard = styled(CardBase as React.ComponentType<CardBaseProps<\"button\", EntityName>>)`\n  aspect-ratio: 16 / 9;\n`;\nconst Inner = styled.div`\n  flex-direction: column;\n  align-items: stretch;\n  justify-content: space-between;\n`;\n\nconst PictureCardFooter = styled.h4`\n  all: unset;\n  font-family: var(--ha-font-family);\n  padding: 1rem;\n  color: var(--ha-500-contrast);\n  background-color: var(--ha-background-opaque);\n  position: absolute;\n  inset: auto 0 0 0;\n  font-weight: bold;\n  font-size: 1.2rem;\n`;\n\nfunction _PictureCard({\n  title,\n  key,\n  image,\n  icon,\n  iconProps,\n  className,\n  preloadProps,\n  children,\n  ...rest\n}: PictureCardProps): React.ReactNode {\n  return (\n    <StyledPictureCard\n      key={key}\n      disableActiveState\n      disableScale={rest.disableScale ?? typeof rest.onClick === \"undefined\"}\n      disableRipples={rest.disableRipples ?? typeof rest.onClick === \"undefined\"}\n      className={`picture-card ${className ?? \"\"}`}\n      {...rest}\n    >\n      <Inner>\n        <PreloadImage\n          {...(preloadProps ?? {})}\n          src={image}\n          style={{\n            width: \"100%\",\n            height: \"100%\",\n            position: \"absolute\",\n          }}\n          lazy\n        >\n          <PictureCardFooter className=\"footer\">\n            <Row gap={\"0.5rem\"} className=\"row\">\n              {icon && <Icon icon={icon} className=\"icon\" {...(iconProps ?? {})} />}\n              {title}\n            </Row>\n          </PictureCardFooter>\n        </PreloadImage>\n      </Inner>\n      {children && <div className=\"children\">{children}</div>}\n    </StyledPictureCard>\n  );\n}\n/** A simple component to render an image with a title/icon similar to the lovelace picture card, you can also bind a click event to the card, which will also return the entity if provided\n * @example\n * <PictureCard entity=\"group.some_group_of_lights\" onClick={(entity) => {\n *  entity.service.toggle();\n * }}\n */\nexport function PictureCard(props: PictureCardProps) {\n  const defaultColumns: AvailableQueries = {\n    xxs: 12,\n    xs: 6,\n    sm: 6,\n    md: 4,\n    lg: 4,\n    xlg: 3,\n  };\n  return (\n    <ErrorBoundary {...fallback({ prefix: \"PictureCard\" })}>\n      <_PictureCard {...defaultColumns} {...props} />\n    </ErrorBoundary>\n  );\n}\n","import { useMemo } from \"react\";\nimport styled from \"@emotion/styled\";\nimport {\n  useEntity,\n  useIconByDomain,\n  useHass,\n  useIcon,\n  useIconByEntity,\n  isUnavailableState,\n  computeDomainTitle,\n  computeDomain,\n  ON,\n  type EntityName,\n} from \"@hakit/core\";\nimport { CardBase, fallback, Tooltip } from \"@components\";\nimport type { TooltipProps, CardBaseProps } from \"@components\";\nimport { ErrorBoundary } from \"react-error-boundary\";\nimport { type IconProps } from \"@iconify/react\";\n\nconst StyledFabCard = styled(<E extends EntityName>({ service, serviceData, key, ...props }: CardBaseProps<\"button\", E>) => (\n  <CardBase\n    key={key}\n    // @ts-expect-error - don't know entity name\n    service={service}\n    // @ts-expect-error - don't know entity name\n    serviceData={serviceData}\n    {...props}\n  />\n))<\n  CardBaseProps<\"button\", EntityName> & {\n    hasChildren?: boolean;\n    size: number;\n  }\n>`\n  flex-shrink: 0;\n  border-radius: ${(props) => props.borderRadius};\n  color: ${(props) => (props.active ? `var(--ha-A400)` : `var(--ha-S500-contrast)`)};\n  ${(props) =>\n    props.size &&\n    `\n    font-size: ${props.size * 0.37}px;\n    height: ${props.size}px;\n    ${!props.hasChildren ? `width: ${props.size}px;` : ``}\n  `}\n  > .ripple-parent {\n    > .ripple-inner {\n      height: 100%;\n    }\n  }\n`;\n\nconst Contents = styled.div<{\n  size: number;\n  hasChildren: boolean;\n}>`\n  text-align: center;\n  display: flex;\n  flex-grow: 0;\n  flex-shrink: 0;\n  justify-content: center;\n  align-items: center;\n  height: 100%;\n  svg {\n    ${(props) => (props.hasChildren ? `margin-right: 0.5rem;` : ``)}\n  }\n  ${(props) => `\n    ${\n      props.hasChildren\n        ? `padding: 0 ${props.size * 0.2}px;`\n        : `\n    `\n    }\n  `}\n`;\n\ntype OmitProperties = \"title\" | \"active\";\n\nexport interface FabCardProps<E extends EntityName> extends Omit<CardBaseProps<\"button\", E>, OmitProperties> {\n  /** The size of the Fab, this applies to the width and height @default 48 */\n  size?: number;\n  /** Optional icon param, this is automatically retrieved by the \"domain\" name if provided, or can be overwritten with a custom value  */\n  icon?: string | null;\n  /** the props for the icon, which includes styles for the icon */\n  iconProps?: Omit<IconProps, \"icon\">;\n  /** will not show any icons */\n  noIcon?: boolean;\n  /** the title used for the tooltip and or modal that will expands, defaults to entity name or domain name  */\n  title?: string;\n  /** the tooltip placement @default \"top\" */\n  tooltipPlacement?: TooltipProps[\"placement\"];\n  /** active flag for the state of the fab, by default this is active if the entity.state value is ON, if you want to control this just pass the prop */\n  active?: boolean;\n}\n\nfunction InternalFabCard<E extends EntityName>({\n  title: _title,\n  tooltipPlacement,\n  icon: _icon,\n  iconProps,\n  noIcon,\n  size = 48,\n  entity: _entity,\n  active: _active,\n  children,\n  disabled = false,\n  borderRadius,\n  className,\n  service,\n  serviceData,\n  cssStyles,\n  key,\n  ...rest\n}: FabCardProps<E>): React.ReactNode {\n  const globalComponentStyle = useHass((state) => state.globalComponentStyles);\n  const entity = useEntity(_entity || \"unknown\", {\n    returnNullIfNotFound: true,\n  });\n  const domain = _entity ? computeDomain(_entity) : null;\n  const icon = typeof _icon === \"string\" ? _icon : null;\n  const domainIcon = useIconByDomain(domain === null ? \"unknown\" : domain, {\n    ...(iconProps ?? {}),\n    fontSize: iconProps?.fontSize ?? `${size / 1.7}px`,\n  });\n  const hasChildren = typeof children !== \"undefined\";\n  const _borderRadius = hasChildren ? (borderRadius ?? \"10px\") : (borderRadius ?? \"50%\");\n  const isUnavailable = typeof entity?.state === \"string\" ? isUnavailableState(entity.state) : false;\n  const entityIcon = useIconByEntity(_entity || \"unknown\", {\n    ...(iconProps ?? {}),\n    fontSize: iconProps?.fontSize ?? `${size / 1.7}px`,\n  });\n  const iconElement = useIcon(icon, {\n    ...(iconProps ?? {}),\n    fontSize: iconProps?.fontSize ?? `${size / 1.7}px`,\n  });\n  const active = typeof _active === \"boolean\" ? _active : entity === null ? false : entity.state === ON && !isUnavailable;\n  const title = useMemo(\n    () => _title || (domain !== null && _entity ? computeDomainTitle(_entity, entity?.attributes?.device_class) : null),\n    [_title, domain, entity, _entity],\n  );\n  return (\n    <>\n      <Tooltip\n        key={key}\n        placement={tooltipPlacement}\n        title={`${_title ?? entity?.attributes?.friendly_name ?? title ?? \"\"}${entity?.state ? ` - ${entity.state}` : \"\"}`}\n      >\n        <StyledFabCard\n          as=\"button\"\n          title={title}\n          // just a dodgey hack to let typescript play nicely here\n          // as we don't know the service/serviceData at this level\n          service={service as undefined}\n          serviceData={serviceData as undefined}\n          entity={_entity}\n          className={`fab-card ${className ?? \"\"}`}\n          disabled={disabled || isUnavailable}\n          active={active}\n          size={size}\n          borderRadius={_borderRadius}\n          hasChildren={hasChildren}\n          disableColumns={true}\n          cssStyles={`\n            ${globalComponentStyle?.fabCard ?? \"\"}\n            ${cssStyles ?? \"\"}\n          `}\n          {...rest}\n        >\n          <Contents size={size} hasChildren={hasChildren}>\n            {noIcon !== true && (iconElement || entityIcon || domainIcon)}\n            {hasChildren ? children : undefined}\n          </Contents>\n        </StyledFabCard>\n      </Tooltip>\n    </>\n  );\n}\n/** The Fab (Floating Action Button) Card is a simple button with an icon to trigger something on press\n *\n * NOTE: This component does NOT have any media queries by default, it will just be the width set by the size prop or the default size.\n */\nexport function FabCard<E extends EntityName>(props: FabCardProps<E>) {\n  return (\n    <ErrorBoundary {...fallback({ prefix: \"FabCard\" })}>\n      <InternalFabCard {...props} />\n    </ErrorBoundary>\n  );\n}\n","import {\n  AvailableQueries,\n  CardBase,\n  getColumnSizeCSS,\n  mq,\n  CardBaseProps,\n  Column,\n  PersonCard,\n  PersonCardProps,\n  Row,\n  fallback,\n  BreakPoint,\n} from \"@components\";\nimport { EntityName, FilterByDomain, useHass } from \"@hakit/core\";\nimport { Children, ReactElement, cloneElement, isValidElement } from \"react\";\nimport { ErrorBoundary } from \"react-error-boundary\";\n\nimport styled from \"@emotion/styled\";\nconst FamilyBaseCard = styled(CardBase as React.ComponentType<CardBaseProps<\"div\", FilterByDomain<EntityName, \"person\">>>)`\n  cursor: default;\n`;\n\nconst FamilyCardContent = styled.div`\n  padding: 1rem;\n  width: 100%;\n  height: 100%;\n  display: flex;\n  flex-direction: column;\n  align-items: stretch;\n  justify-content: space-between;\n  .person-card {\n    &.entity-count-2-plus {\n      width: ${getColumnSizeCSS(6)};\n      ${mq(\n        [\"xxs\", \"xs\"],\n        `\n        width: ${getColumnSizeCSS(12)};\n      `,\n      )}\n      ${mq(\n        [\"md\", \"lg\", \"xlg\"],\n        `\n        width: ${getColumnSizeCSS(4)};\n      `,\n      )}\n    }\n\n    &.entity-count-1 {\n      width: ${getColumnSizeCSS(12)};\n    }\n\n    &.entity-count-2 {\n      width: ${getColumnSizeCSS(6)};\n      ${mq(\n        [\"xxs\", \"xs\"],\n        `\n        width: ${getColumnSizeCSS(12)};\n      `,\n      )}\n    }\n  }\n`;\n\nconst Title = styled.div`\n  color: var(--ha-S100-contrast);\n  font-size: 0.9rem;\n  font-weight: bold;\n`;\n\ntype OmitProperties =\n  | \"as\"\n  | \"active\"\n  | \"disabled\"\n  | \"children\"\n  | \"entity\"\n  | \"title\"\n  | \"onClick\"\n  | \"modalProps\"\n  | \"serviceData\"\n  | \"service\"\n  | \"disableRipples\"\n  | \"disableScale\"\n  | \"disableActiveState\"\n  | \"rippleProps\"\n  | \"borderRadius\"\n  | \"disableActiveState\"\n  | \"onlyFunctionality\";\n\nexport interface FamilyCardProps extends Omit<CardBaseProps<\"div\", FilterByDomain<EntityName, \"person\">>, OmitProperties> {\n  /** the children for the FamilyCard, it accepts Person components */\n  children: ReactElement<typeof PersonCard> | ReactElement<typeof PersonCard>[];\n  /** optional title of the card */\n  title?: string;\n}\n\nfunction InternalFamilyCard({ title, key, cssStyles, children, className, ...rest }: FamilyCardProps): React.ReactNode {\n  const globalComponentStyle = useHass((state) => state.globalComponentStyles);\n  const len = Children.count(children);\n  const count = len > 2 ? \"2-plus\" : len === 1 ? \"1\" : \"2\";\n  const childrenWithKeys = Children.map(children, (child, index) => {\n    if (isValidElement<PersonCardProps>(child)) {\n      // if they've defined columns, we don't want to override it\n      const columns: BreakPoint[] = [\"xxs\", \"xs\", \"sm\", \"md\", \"lg\", \"xlg\"];\n      const hasColumnDefinition = columns.some((key) => typeof child.props[key] === \"number\");\n      const disableColumns = hasColumnDefinition ? false : (child.props.disableColumns ?? true);\n      return cloneElement(child, {\n        key: child.key || index,\n        className: disableColumns ? `entity-count-${count}` : \"\",\n        disableColumns,\n      });\n    }\n    return child;\n  });\n\n  return (\n    <FamilyBaseCard\n      key={key}\n      disableRipples\n      disableScale\n      disableActiveState\n      className={`family-card ${className}`}\n      cssStyles={`\n      ${globalComponentStyle?.familyCard ?? \"\"}\n      ${cssStyles ?? \"\"}\n    `}\n      {...rest}\n    >\n      <FamilyCardContent>\n        {title && (\n          <Column alignItems=\"flex-start\" fullWidth>\n            <Title>{title}</Title>\n          </Column>\n        )}\n        <Row\n          className=\"row\"\n          fullWidth\n          wrap=\"wrap\"\n          justifyContent=\"flex-start\"\n          gap=\"0.5rem\"\n          style={{\n            marginTop: \"0.5rem\",\n          }}\n        >\n          {childrenWithKeys}\n        </Row>\n      </FamilyCardContent>\n    </FamilyBaseCard>\n  );\n}\n\n/** The FamilyCard component is an easy way to represent the state of the persons of your family within a simple layout, add each person to a PersonCard and place them as children within this card and you're good to go!\n * By default the layout is automatically adjusted to fit the amount of people you have, but you can override this by setting an BreakPoint prop on the PersonCard component.\n */\nexport function FamilyCard(props: FamilyCardProps) {\n  const defaultColumns: AvailableQueries = {\n    xxs: 12,\n    xs: 6,\n    sm: 6,\n    md: 4,\n    lg: 4,\n    xlg: 3,\n  };\n  return (\n    <ErrorBoundary {...fallback({ prefix: \"FamilyCard\" })}>\n      <InternalFamilyCard {...defaultColumns} {...props} />\n    </ErrorBoundary>\n  );\n}\n","import { AvailableQueries, CardBase, CardBaseProps, fallback } from \"@components\";\nimport styled from \"@emotion/styled\";\nimport { type EntityName, type FilterByDomain, localize, useEntity, useHass, useIcon } from \"@hakit/core\";\nimport { useMemo } from \"react\";\nimport { ErrorBoundary } from \"react-error-boundary\";\n\nconst PersonBaseCard = styled(CardBase as React.ComponentType<CardBaseProps<\"div\", PersonEntity>>)`\n  background-color: var(--ha-S500);\n  &:not(.disabled):hover,\n  &:not(:disabled):hover {\n    background-color: var(--ha-S600);\n  }\n`;\n\nconst PersonCardContent = styled.div`\n  display: flex;\n  justify-content: center;\n  align-items: center;\n  flex-direction: column;\n  gap: 8px;\n  border-radius: 0.5rem;\n  padding: 0.5rem;\n  .state-text {\n    font-size: 0.8rem;\n    color: var(--ha-S500-contrast);\n  }\n`;\n\nconst UserAvatarDiv = styled.div<{ width: string; height: string; withBorder: boolean }>`\n  position: relative;\n  .avatar-image,\n  .avatar-icon {\n    border-radius: 100%;\n    width: ${({ width }) => width};\n    height: ${({ height }) => height};\n    border: ${({ withBorder }) => (withBorder ? \"2px solid var(--ha-50)\" : \"none\")};\n    box-shadow: ${({ withBorder }) => (withBorder ? \"0 2px 2px rgba(0, 0, 0, 0.2)\" : \"none\")};\n    background: var(--ha-S900);\n  }\n  .avatar-icon {\n    display: flex;\n    align-items: center;\n    justify-content: center;\n  }\n`;\n\nconst UserAvatarStateIcon = styled.div`\n  position: absolute;\n  background-color: var(--ha-50);\n  border-radius: 100%;\n  top: calc(50% + 8px);\n  right: calc(0% - 11px);\n  display: flex;\n  justify-content: center;\n  align-items: center;\n  height: 28px;\n  width: 28px;\n  border: 3px solid var(--ha-S500);\n`;\n\nconst NameAndState = styled.div`\n  flex-grow: 1;\n  font-size: 0.8rem;\n  color: var(--ha-S50-contrast);\n  font-weight: 500;\n  text-align: center;\n  span {\n    width: 100%;\n    font-size: 0.7rem;\n    font-weight: 400;\n    display: block;\n    margin-top: 0.2rem;\n    color: var(--ha-S500-contrast);\n  }\n`;\n\nexport type PersonEntity = FilterByDomain<EntityName, \"person\">;\ntype PersonStateMap = {\n  [key: string]:\n    | {\n        text: string;\n        icon: string;\n      }\n    | undefined;\n};\n\ntype OmitProperties = \"as\" | \"active\" | \"disabled\" | \"children\" | \"entity\" | \"title\" | \"onClick\" | \"serviceData\" | \"service\";\n\nexport interface PersonCardProps extends Omit<CardBaseProps<\"div\", PersonEntity>, OmitProperties> {\n  /** person entity in the form of \"person.{string}\" */\n  entity: PersonEntity;\n  /** optional person.state to value object map, i.e:\n   * {home: {text: \"Home\", icon: \"mdi:home\"}, not_home: { text: \"Away\", icon: \"mdi:walk\" }, zone_id: { text: \"At work\", icon: \"mdi:briefcase\" }, etc.}\n   *\n   * Defaults to:\n   * { home: { text: \"Home\", icon: \"mdi:home\" }, not_home: { text: \"Away\", icon: \"mdi:walk\" } }\n   */\n  personStateMap?: PersonStateMap;\n}\n\nexport type UserAvatarProps = {\n  entity: PersonEntity;\n  iconSize?: { width: string; height: string };\n  avatarSize?: { width: string; height: string };\n  withBorder?: boolean;\n  stateIcon?: string;\n};\n\nexport const UserAvatar = ({\n  entity,\n  iconSize = { width: \"2.5rem\", height: \"2.5rem\" },\n  avatarSize = { width: \"3.5rem\", height: \"3.5rem\" },\n  withBorder = false,\n  stateIcon,\n}: UserAvatarProps) => {\n  const person = useEntity(entity);\n  const { joinHassUrl } = useHass.getState().helpers;\n\n  const userImage = useMemo(() => {\n    const url = person.attributes.entity_picture ? person.attributes.entity_picture : null;\n    return url && url.startsWith(\"/\") ? joinHassUrl(url) : url;\n  }, [person.attributes.entity_picture, joinHassUrl]);\n\n  const userIcon = useIcon(person.attributes.icon ?? \"mdi:account\", iconSize);\n  const renderedStateIcon = useIcon(stateIcon ?? \"\", { width: \"16px\", height: \"16px\", color: \"var(--ha-S900)\" });\n\n  return userImage ? (\n    <UserAvatarDiv width={avatarSize.width} height={avatarSize.height} withBorder={withBorder}>\n      <img src={userImage} className=\"avatar-image\" />\n      {stateIcon && renderedStateIcon && <UserAvatarStateIcon>{renderedStateIcon}</UserAvatarStateIcon>}\n    </UserAvatarDiv>\n  ) : (\n    <UserAvatarDiv width={avatarSize.width} height={avatarSize.height} withBorder={withBorder}>\n      <div className=\"avatar-icon\">{userIcon}</div>\n      {stateIcon && renderedStateIcon && <UserAvatarStateIcon>{renderedStateIcon}</UserAvatarStateIcon>}\n    </UserAvatarDiv>\n  );\n};\n\nfunction InternalPersonCard({\n  entity,\n  personStateMap: _personStateMap = {},\n  cssStyles,\n  modalProps,\n  className,\n  ...rest\n}: PersonCardProps): React.ReactNode {\n  const globalComponentStyle = useHass((state) => state.globalComponentStyles);\n\n  const personStateMapDefault: PersonStateMap = {\n    home: { text: localize(\"home\"), icon: \"mdi:home\" },\n    not_home: { text: localize(\"away\"), icon: \"mdi:walk\" },\n  };\n  const personStateMap = { ...personStateMapDefault, ..._personStateMap };\n\n  const person = useEntity(entity);\n  const stateText = personStateMap[person.state]?.text ?? person.state;\n  const stateIcon = personStateMap[person.state]?.icon;\n  return (\n    <PersonBaseCard\n      entity={entity}\n      className={`person-card ${className}`}\n      cssStyles={`\n      ${globalComponentStyle?.personCard ?? \"\"}\n      ${cssStyles ?? \"\"}\n    `}\n      modalProps={{\n        stateTitle: stateText,\n        ...modalProps,\n      }}\n      {...rest}\n    >\n      <PersonCardContent>\n        <UserAvatar entity={entity} stateIcon={stateIcon} />\n        <NameAndState>\n          {person.attributes.friendly_name}\n          <span>{stateText}</span>\n        </NameAndState>\n      </PersonCardContent>\n    </PersonBaseCard>\n  );\n}\n\n/** The PersonCard component is an easy way to represent the state of a person. Can be added as children to the FamilyCard component to quickly give an overview of the whole family. */\nexport function PersonCard(props: PersonCardProps) {\n  const defaultColumns: AvailableQueries = {\n    xxs: 12,\n    xs: 6,\n    sm: 6,\n    md: 4,\n    lg: 4,\n    xlg: 3,\n  };\n  return (\n    <ErrorBoundary {...fallback({ prefix: \"PersonCard\" })}>\n      <InternalPersonCard {...defaultColumns} {...props} />\n    </ErrorBoundary>\n  );\n}\n","import { useMemo, useState } from \"react\";\nimport styled from \"@emotion/styled\";\nimport { css, Global } from \"@emotion/react\";\nimport { Icon } from \"@iconify/react\";\nimport { useHass } from \"@hakit/core\";\nimport { Tooltip, TimeCard, WeatherCard, Row, Column, fallback, mq, useBreakpoint } from \"@components\";\nimport type { WeatherCardProps, TimeCardProps } from \"@components\";\nimport { ErrorBoundary } from \"react-error-boundary\";\n\nconst StyledTimeCard = styled(TimeCard)<{\n  open: boolean;\n}>`\n  padding: 0;\n  background: transparent;\n  width: 100%;\n  box-shadow: none;\n  transition: var(--ha-transition-duration) var(--ha-easing);\n  transition-property: padding;\n  border-radius: 0;\n  &:hover {\n    box-shadow: none;\n    background: transparent;\n  }\n  &:not(.disabled):not(:disabled):not(:focus):hover {\n    box-shadow: none;\n    background: transparent;\n    color: var(--ha-S200-contrast) svg {\n      color: var(--ha-S200-contrast);\n    }\n  }\n  .time,\n  .time-suffix {\n    transition: var(--ha-transition-duration) var(--ha-easing);\n    transition-property: font-size;\n  }\n  ${(props) =>\n    !props.open &&\n    `\n    padding: 0.5rem 0;\n    .time, .time-suffix {\n      font-size: 0.7rem;\n    }\n  `}\n`;\n\nconst StyledSidebarCard = styled.div`\n  background-color: var(--ha-S50);\n  display: flex;\n  flex-direction: column;\n  align-items: center;\n  overflow: hidden;\n  height: 100%;\n  justify-content: flex-start;\n  transition: var(--ha-transition-duration) var(--ha-easing);\n  transition-property: left, max-width, width;\n  transform-origin: left center;\n  gap: 1rem;\n  > * {\n    transition: var(--ha-transition-duration) var(--ha-easing);\n    transition-property: padding;\n  }\n  ${mq(\n    [\"xxs\", \"xs\"],\n    `\n    position: fixed;\n    top: 0;\n    bottom: 0;\n    left: var(--ha-sidebar-offset);\n    z-index: calc(var(--ha-device-area-card-z-index) - 1);\n  `,\n  )}\n`;\n\nconst Menu = styled.ul<{\n  open: boolean;\n}>`\n  padding: 0;\n  margin: 1rem 0 0 0;\n  width: 100%;\n  li {\n    position: relative;\n    list-style-type: none;\n    a {\n      position: relative;\n      cursor: pointer;\n      user-select: none;\n      position: relative;\n      cursor: pointer;\n      user-select: none;\n      height: 3rem;\n      text-decoration: none;\n      font-weight: 500;\n      overflow: hidden;\n      text-overflow: ellipsis;\n      white-space: nowrap;\n      display: flex;\n      align-items: center;\n      justify-content: flex-start;\n      flex-direction: row;\n      padding: 0.5rem 0rem 0.5rem 1rem;\n      gap: 1rem;\n\n      &:hover {\n        background: transparent;\n      }\n      svg {\n        display: inline-block;\n        margin: 0;\n        text-align: left;\n        font-size: 1.5rem;\n      }\n      > .menu-inner {\n        display: flex;\n        align-items: flex-start;\n        justify-content: center;\n        flex-direction: column;\n      }\n      span {\n        display: block;\n        width: 100%;\n        font-size: 0.7rem;\n        font-weight: 300;\n        color: var(--ha-S100-contrast);\n      }\n    }\n  }\n  li {\n    > a {\n      color: var(--ha-S100-contrast);\n      background-color: transparent;\n      transition: var(--ha-transition-duration) var(--ha-easing);\n      transition-property: color, background-color;\n      svg {\n        color: var(--ha-S100-contrast);\n        transition: var(--ha-transition-duration) var(--ha-easing);\n        transition-property: color;\n      }\n    }\n    &:hover,\n    &.active,\n    &:focus {\n      > a {\n        color: var(--ha-A400);\n        background-color: var(--ha-S100);\n\n        svg {\n          color: var(--ha-A400);\n        }\n      }\n    }\n  }\n  ${(props) =>\n    !props.open &&\n    `\n    margin: 0;\n    li {\n      a {\n        padding: 0;\n        justify-content: center;\n        svg {\n          margin: 0;\n        }\n      }\n    }\n  `}\n`;\n\nconst Divider = styled.hr`\n  width: 100%;\n  border: none;\n  border-bottom: 1px solid var(--ha-S200);\n  margin: 0;\n`;\n\nconst HamburgerMenu = styled(Menu)`\n  margin: 0;\n  li {\n    a {\n      justify-content: center;\n      padding: 0.7rem;\n      svg {\n        margin: 0;\n      }\n    }\n  }\n\n  ${mq(\n    [\"xxs\", \"xs\"],\n    `\n    left: 0;\n    top: 0;\n    li {\n      a {\n        background-color: transparent;\n      }\n    }\n  `,\n  )}\n`;\n\nconst Filler = styled.div`\n  width: 100%;\n  height: 100%;\n`;\n\nconst StyledWeatherCard = styled(WeatherCard)`\n  background: transparent;\n  width: 100%;\n  padding: 0;\n  border-radius: 0;\n  box-shadow: none;\n  &:hover {\n    box-shadow: none;\n    background: transparent;\n  }\n`;\n\nconst WeatherCardCustom = styled(StyledWeatherCard)<{\n  open: boolean;\n}>`\n  padding-bottom: 1rem;\n  border-radius: 0;\n  ${(props) =>\n    !props.open &&\n    `\n    div > * {\n      display: none;\n    }\n    div > svg {\n      display: flex;\n    }\n  `}\n`;\nexport interface MenuItem {\n  /** The title of the menu item */\n  title: string;\n  /** the description, this will appear below the title */\n  description?: string;\n  /** the icon name or JSX element, eg <Icon icon=\"mdi:cross\" /> */\n  icon: React.ReactNode | string;\n  /** the hash name of the menu item, this is optional */\n  hash?: string;\n  /** if the item is active or not */\n  active: boolean;\n  /** onClick action to fire when the menu item is clicked  */\n  onClick: (event: React.MouseEvent<HTMLLIElement>) => void;\n}\nexport interface SidebarCardProps extends React.ComponentProps<\"div\"> {\n  /** should the time card be included by default @default true */\n  includeTimeCard?: boolean;\n  /** should the sidebar start opened,  True by default if collapsible=false @default true */\n  startOpen?: boolean;\n  /** Whether the sidebar can be collapsed by the end-user @default true */\n  collapsible?: boolean;\n  /** the props for the weather card , if omitted, weather card is not rendered @default undefined */\n  weatherCardProps?: WeatherCardProps;\n  /** Adding menu items can also add routes by default, disabled this if need be @default true */\n  autoIncludeRoutes?: boolean;\n  /** the props for the timeCard @default { hideIcon: true, hideIcon: true, center: true }*/\n  timeCardProps?: TimeCardProps;\n  /** the menu items to add to the sidebar @default [] */\n  menuItems?: MenuItem[];\n  /** the children to render in the sidebar */\n  children?: React.ReactNode;\n  /** a method to apply a sort function to the sidebar menu items before they render */\n  sortSidebarMenuItems?: (a: MenuItem, b: MenuItem) => number;\n  /** Show Tooltips on item hover when the sidebar is closed @default false */\n  tooltipsWhenClosed?: boolean;\n}\nfunction InternalSidebarCard({\n  weatherCardProps,\n  timeCardProps = {\n    hideIcon: true,\n    hideDate: true,\n    center: true,\n  },\n  startOpen = true,\n  collapsible = true,\n  tooltipsWhenClosed = true,\n  menuItems = [],\n  children,\n  autoIncludeRoutes = true,\n  includeTimeCard = true,\n  className,\n  cssStyles,\n  sortSidebarMenuItems,\n  key,\n  style,\n  ...rest\n}: SidebarCardProps) {\n  const [open, setOpen] = useState(startOpen);\n  const routes = useHass((state) => state.routes);\n  const hash = useHass((state) => state.hash);\n  const devices = useBreakpoint();\n  const concatenatedMenuItems = useMemo<MenuItem[]>(() => {\n    const mappedRoutes = routes.map<MenuItem>((route) => ({\n      ...route,\n      title: route.name,\n      onClick() {\n        if (!route.active) {\n          location.hash = \"\";\n          setTimeout(\n            () => {\n              location.hash = route.hash;\n            },\n            hash === \"\" ? 0 : 450,\n          );\n        }\n      },\n    }));\n    const items = autoIncludeRoutes ? [...menuItems, ...mappedRoutes] : menuItems;\n    if (typeof sortSidebarMenuItems === \"function\") {\n      items.sort(sortSidebarMenuItems);\n    }\n    return items;\n  }, [routes, sortSidebarMenuItems, autoIncludeRoutes, menuItems, hash]);\n  return (\n    <>\n      <Global\n        styles={css`\n          :root {\n            --ha-area-card-expanded-offset: ${devices.xxs || devices.xs\n              ? \"0rem\"\n              : open\n                ? `var(--ha-device-sidebar-card-width-expanded, 19rem)`\n                : `var(--ha-device-sidebar-card-width-collapsed, 5rem)`};\n            --ha-sidebar-max-width: ${open\n              ? `var(--ha-device-sidebar-card-width-expanded, 19rem)`\n              : `var(--ha-device-sidebar-card-width-collapsed, 5rem)`};\n            --ha-sidebar-offset: ${open ? `0` : `calc(var(--ha-sidebar-max-width) * -1)`};\n          }\n        `}\n      />\n      <StyledSidebarCard\n        key={key ?? `ha-sidebar-closed`}\n        css={css`\n          ${cssStyles ?? \"\"}\n        `}\n        className={`${className ?? \"\"} sidebar-card`}\n        style={{\n          ...style,\n          width: \"100%\",\n          maxWidth: open ? `var(--ha-device-sidebar-card-width-expanded, 19rem)` : `var(--ha-device-sidebar-card-width-collapsed, 5rem)`,\n        }}\n        {...rest}\n      >\n        <Column className=\"column\" wrap=\"nowrap\" fullHeight fullWidth alignItems=\"flex-start\" justifyContent=\"space-between\">\n          <Filler className=\"filler\">\n            <Row\n              className=\"row\"\n              wrap=\"nowrap\"\n              style={{\n                padding: open ? \"0.28rem 0\" : \"0\",\n                flexDirection: open ? \"row\" : \"column\",\n              }}\n            >\n              {includeTimeCard && (\n                <StyledTimeCard disableColumns key=\"sidebar-large-time-card\" className=\"sidebar-time-card\" open={open} {...timeCardProps} />\n              )}\n              {collapsible && (\n                <HamburgerMenu\n                  open={open}\n                  className=\"hamburger-menu\"\n                  key=\"hamburger-menu-open\"\n                  style={{\n                    width: devices.xxs || devices.xs ? \"auto\" : !open ? \"100%\" : \"40%\",\n                    position: devices.xxs || devices.xs ? \"fixed\" : \"relative\",\n                  }}\n                >\n                  <li\n                    onClick={(event) => {\n                      event.stopPropagation();\n                      setOpen(!open);\n                    }}\n                  >\n                    <a\n                      style={{\n                        justifyContent: \"center\",\n                      }}\n                    >\n                      <Icon className=\"icon\" icon={open ? \"mdi:close\" : \"mdi:menu\"} />\n                    </a>\n                  </li>\n                </HamburgerMenu>\n              )}\n            </Row>\n            <Divider className=\"divider\" />\n            <Menu open={open} className=\"menu\">\n              {concatenatedMenuItems.map((item, index) => {\n                const innerItemContent = (\n                  <a>\n                    {typeof item.icon === \"string\" ? <Icon className=\"icon\" icon={item.icon} /> : item.icon}\n                    {open && (\n                      <div className=\"menu-inner\">\n                        {item.title}\n                        {item.description && <span>{item.description}</span>}\n                      </div>\n                    )}\n                  </a>\n                );\n\n                return (\n                  <li\n                    onClick={(event) => {\n                      event.stopPropagation();\n                      item.onClick(event);\n                    }}\n                    key={index}\n                    className={item.active ? \"active\" : \"inactive\"}\n                  >\n                    {tooltipsWhenClosed && !open ? (\n                      <Tooltip title={item.title} placement=\"right\" offsetX={-16}>\n                        {innerItemContent}\n                      </Tooltip>\n                    ) : (\n                      innerItemContent\n                    )}\n                  </li>\n                );\n              })}\n            </Menu>\n            {children && open && <Filler className=\"filler\">{children}</Filler>}\n          </Filler>\n          {weatherCardProps && (\n            <div\n              className=\"weather-wrapper\"\n              key=\"sidebar-weather-large\"\n              style={{\n                width: \"100%\",\n                padding: open ? \"0 1rem 1rem\" : \"0\",\n              }}\n            >\n              <WeatherCardCustom disableColumns className=\"weather-card-sidebar\" open={open} {...weatherCardProps} />\n            </div>\n          )}\n        </Column>\n      </StyledSidebarCard>\n    </>\n  );\n}\n/** This component is a nice way of organizing components / groups into an easy to navigate sidebar, the \"Area Cards\" will automatically insert into the sidebar items if they're present on the page, eg if you have 6 AreaCards, all 6 items will be added to the sidebar automatically, you can also add your own menu items to the start of the list, this all needs a bit more thought but for now it is pretty useful! The TimeCard and WeatherCard are integrate and themed slightly different in the sidebar, if the sidebar is present, the AreaCard will only expand to the available space and not cover the sidebar */\nexport function SidebarCard(props: SidebarCardProps) {\n  return (\n    <ErrorBoundary {...fallback({ prefix: \"SidebarCard\" })}>\n      <InternalSidebarCard {...props} />\n    </ErrorBoundary>\n  );\n}\n","import { CLIMATE_HVAC_ACTION_TO_MODE, ClimateEntityFeature, UNIT_F } from \"./data\";\nimport { useState, useEffect, useCallback, useMemo } from \"react\";\nimport {\n  HvacAction,\n  HvacMode,\n  type FilterByDomain,\n  type EntityName,\n  isOffState,\n  UNAVAILABLE,\n  useEntity,\n  supportsFeatureFromAttributes,\n  stateActive,\n  toReadableString,\n  localize,\n  useHass,\n} from \"@hakit/core\";\nimport styled from \"@emotion/styled\";\nimport { useDebouncedCallback } from \"use-debounce\";\nimport { clamp } from \"lodash\";\nimport { FabCard, ControlSliderCircular, type ControlCircularSliderMode } from \"@components\";\nimport { colors } from \"./shared\";\nimport { BigNumber } from \"./BigNumber\";\n\nimport { Icon } from \"@iconify/react\";\n\ntype Target = \"value\" | \"low\" | \"high\";\n\nconst SLIDER_MODES: Record<HvacMode, ControlCircularSliderMode> = {\n  auto: \"full\",\n  cool: \"end\",\n  dry: \"full\",\n  fan_only: \"full\",\n  heat: \"start\",\n  heat_cool: \"full\",\n  off: \"full\",\n};\n\nconst Wrapper = styled.div`\n  position: relative;\n  width: 320px;\n  .container {\n    position: relative;\n  }\n  .info * {\n    margin: 0;\n    pointer-events: auto;\n  }\n  .label {\n    width: 60%;\n    font-weight: 500;\n    text-align: center;\n    align-items: center;\n    justify-content: center;\n    display: flex;\n    -webkit-line-clamp: 2;\n    -webkit-box-orient: vertical;\n    overflow: hidden;\n  }\n  .label span {\n    white-space: nowrap;\n  }\n  .label ha-svg-icon {\n    bottom: 5%;\n  }\n  .label.disabled {\n    color: #444;\n  }\n  .buttons {\n    position: absolute;\n    bottom: 10px;\n    left: 0;\n    right: 0;\n    margin: 0 auto;\n    gap: 24px;\n    display: flex;\n    flex-direction: row;\n    align-items: center;\n    justify-content: center;\n  }\n  .info {\n    position: absolute;\n    inset: 0px;\n    display: flex;\n    flex-direction: column;\n    align-items: center;\n    justify-content: center;\n    pointer-events: none;\n    font-size: 16px;\n    line-height: 24px;\n    letter-spacing: 0.1px;\n  }\n  /* Dual target */\n  .dual {\n    display: flex;\n    flex-direction: row;\n    gap: 24px;\n  }\n  .dual button {\n    outline: none;\n    background: none;\n    color: inherit;\n    font-family: inherit;\n    -webkit-tap-highlight-color: transparent;\n    border: none;\n    opacity: 0.5;\n    padding: 0;\n    transition:\n      opacity 180ms ease-in-out,\n      transform 180ms ease-in-out;\n    cursor: pointer;\n  }\n  .dual button:focus-visible {\n    transform: scale(1.1);\n  }\n  .dual button.selected {\n    opacity: 1;\n  }\n\n  .control-slider-circular {\n    width: 100%;\n  }\n`;\n\nexport interface ClimateControlSliderProps {\n  entity: FilterByDomain<EntityName, \"climate\">;\n  showCurrent?: boolean;\n  targetTempStep?: number;\n}\n\nexport function ClimateControlSlider({ entity: _entity, targetTempStep, showCurrent = false }: ClimateControlSliderProps) {\n  const [_targetTemperature, setTargetTemperature] = useState<Partial<Record<Target, number>>>({});\n  const [_selectTargetTemperature, setSelectTargetTemperature] = useState<Target>(\"low\");\n  const entity = useEntity(_entity);\n  const config = useHass((store) => store.config);\n\n  const { min_temp: _min, max_temp: _max, target_temp_step, hvac_modes } = entity.attributes;\n\n  const _step = useMemo(() => {\n    return targetTempStep ?? target_temp_step ?? (config?.unit_system.temperature === UNIT_F ? 1 : 0.5);\n  }, [config?.unit_system.temperature, targetTempStep, target_temp_step]);\n\n  useEffect(() => {\n    setTargetTemperature({\n      value: entity.attributes.temperature,\n      low: entity.attributes.target_temp_low,\n      high: entity.attributes.target_temp_high,\n    });\n  }, [entity.attributes.temperature, entity.attributes.target_temp_low, entity.attributes.target_temp_high]);\n\n  const supportsTargetTemperature = supportsFeatureFromAttributes(entity.attributes, ClimateEntityFeature.TARGET_TEMPERATURE);\n\n  const supportsTargetTemperatureRange = supportsFeatureFromAttributes(entity.attributes, ClimateEntityFeature.TARGET_TEMPERATURE_RANGE);\n\n  const _callService = useCallback(\n    (type: string) => {\n      if (type === \"high\" || type === \"low\") {\n        entity.service.setTemperature({\n          serviceData: {\n            target_temp_low: _targetTemperature.low,\n            target_temp_high: _targetTemperature.high,\n          },\n        });\n        return;\n      }\n      entity.service.setTemperature({\n        serviceData: {\n          temperature: _targetTemperature.value,\n        },\n      });\n    },\n    [_targetTemperature, entity],\n  );\n\n  const _debouncedCallService = useDebouncedCallback((target: Target) => _callService(target), 1000, {\n    trailing: true,\n    leading: true,\n  });\n\n  const _handleButton = useCallback(\n    (target: Target, step: number) => {\n      const defaultValue = target === \"high\" ? _max : _min;\n\n      let temp = _targetTemperature[target] ?? defaultValue;\n      temp += step;\n      temp = clamp(temp, _min, _max);\n      if (target === \"high\" && _targetTemperature.low != null) {\n        temp = clamp(temp, _targetTemperature.low, _max);\n      }\n      if (target === \"low\" && _targetTemperature.high != null) {\n        temp = clamp(temp, _min, _targetTemperature.high);\n      }\n      setTargetTemperature((_targetTemperature) => ({\n        ..._targetTemperature,\n        [target]: temp,\n      }));\n      _debouncedCallService(target);\n    },\n    [_max, _min, _debouncedCallService, _targetTemperature],\n  );\n\n  const _handleSelectTemp = useCallback((target: Target) => {\n    setSelectTargetTemperature(target);\n  }, []);\n\n  const _renderLabel = useCallback(() => {\n    if (entity.state === UNAVAILABLE) {\n      return <p className=\"label disabled\">{entity.state ?? \"\"}</p>;\n    }\n\n    if (!supportsTargetTemperature && !supportsTargetTemperatureRange) {\n      return <p className=\"label\">{entity.state ?? \"\"}</p>;\n    }\n\n    const action = entity.attributes.hvac_action;\n\n    const actionLabel = toReadableString(entity.attributes.hvac_action);\n\n    return <p className=\"label\">{action && action !== \"off\" && action !== \"idle\" ? actionLabel : localize(\"target_temperature\")}</p>;\n  }, [entity.attributes.hvac_action, entity.state, supportsTargetTemperature, supportsTargetTemperatureRange]);\n\n  const _valueChanged = useCallback(\n    (value: number, target: Target) => {\n      setTargetTemperature((_targetTemperature) => ({\n        ..._targetTemperature,\n        [target]: value,\n      }));\n      setSelectTargetTemperature(target);\n      _callService(target);\n    },\n    [_callService],\n  );\n\n  const _valueChanging = useCallback((value: number, target: Target) => {\n    setTargetTemperature((_targetTemperature) => ({\n      ..._targetTemperature,\n      [target]: value,\n    }));\n    setSelectTargetTemperature(target);\n  }, []);\n\n  const _renderTemperatureButtons = useCallback(\n    (target: Target, colored?: boolean) => {\n      const lowColor = colors[\"heat\"];\n      const highColor = colors[\"cool\"];\n\n      const color = colored && stateActive(entity) ? (target === \"high\" ? highColor[1] : lowColor[1]) : undefined;\n\n      return (\n        <div className=\"buttons\">\n          <FabCard\n            style={{\n              borderColor: color,\n            }}\n            icon=\"mdi:minus\"\n            onClick={() => _handleButton(target, -_step)}\n          />\n          <FabCard\n            style={{\n              borderColor: color,\n            }}\n            icon=\"mdi:plus\"\n            onClick={() => _handleButton(target, _step)}\n          />\n        </div>\n      );\n    },\n    [_handleButton, _step, entity],\n  );\n\n  const _renderTargetTemperature = useCallback(\n    (temperature: number) => {\n      const digits = _step.toString().split(\".\")?.[1]?.length ?? 0;\n      const formatOptions: Intl.NumberFormatOptions = {\n        maximumFractionDigits: digits,\n        minimumFractionDigits: digits,\n      };\n      return (\n        <BigNumber\n          value={temperature}\n          unit={config?.unit_system.temperature}\n          unitPosition={_step === 1 ? \"bottom\" : \"top\"}\n          formatOptions={formatOptions}\n        />\n      );\n    },\n    [_step, config],\n  );\n\n  const _renderCurrentTemperature = useCallback(\n    (temperature?: number) => {\n      if (!showCurrent || temperature == null) {\n        return <p className=\"label\">&nbsp;</p>;\n      }\n      if (isOffState(entity.state)) {\n        return <p className=\"label disabled\">{entity.state ?? \"\"}</p>;\n      }\n\n      return (\n        <p className=\"label current\">\n          <Icon icon={\"mdi:thermometer\"} />\n          <span>{temperature ?? entity.attributes.current_temperature}</span>\n        </p>\n      );\n    },\n    [entity.state, entity.attributes.current_temperature, showCurrent],\n  );\n\n  function render() {\n    const mode = entity.state as HvacMode;\n    const action = entity.attributes.hvac_action as HvacAction;\n    const active = stateActive(entity);\n\n    const stateColor = colors[mode];\n    const lowColor = active ? colors[\"heat\"][1] : colors[\"off\"];\n    const highColor = active ? colors[\"cool\"][1] : colors[\"off\"];\n\n    let actionColor: string[] | undefined;\n    if (action && action !== \"idle\" && action !== \"off\" && active) {\n      actionColor = colors[mode] ?? colors[CLIMATE_HVAC_ACTION_TO_MODE[action]];\n    }\n\n    if (supportsTargetTemperature && _targetTemperature.value != null && entity.state !== UNAVAILABLE) {\n      const heatCoolModes: HvacMode[] = (hvac_modes as HvacMode[]).filter((m) => [\"heat\", \"cool\", \"heat_cool\"].includes(m));\n      const sliderMode = SLIDER_MODES[heatCoolModes.length === 1 && [\"off\", \"auto\"].includes(mode) ? heatCoolModes[1] : mode];\n\n      return (\n        <div className={`container`}>\n          <ControlSliderCircular\n            inactive={!active}\n            mode={sliderMode}\n            value={_targetTemperature.value}\n            min={_min}\n            max={_max}\n            step={_step}\n            current={entity.attributes.current_temperature}\n            onChange={(value, type) => {\n              _valueChanging(value, type);\n            }}\n            onChangeApplied={(value, type) => {\n              _valueChanged(value, type);\n            }}\n            colors={{\n              color: stateColor ? stateColor[1] : undefined,\n              lowColor: lowColor ? lowColor[1] : undefined,\n              highColor: highColor ? highColor[1] : undefined,\n            }}\n          />\n          <div className=\"info\">\n            {_renderLabel()}\n            {_renderTargetTemperature(_targetTemperature.value)}\n            {_renderCurrentTemperature(entity.attributes.current_temperature)}\n          </div>\n          {_renderTemperatureButtons(\"value\")}\n        </div>\n      );\n    }\n\n    if (\n      supportsTargetTemperatureRange &&\n      _targetTemperature.low != null &&\n      _targetTemperature.high != null &&\n      entity.state !== UNAVAILABLE\n    ) {\n      return (\n        <div className={`container`}>\n          <ControlSliderCircular\n            inactive={!active}\n            dual\n            low={_targetTemperature.low}\n            high={_targetTemperature.high}\n            min={_min}\n            max={_max}\n            step={_step}\n            current={entity.attributes.current_temperature}\n            onChange={(value, type) => {\n              _valueChanging(value, type);\n            }}\n            onChangeApplied={(value, type) => {\n              _valueChanged(value, type);\n            }}\n            colors={{\n              lowColor: lowColor ? lowColor[1] : undefined,\n              highColor: highColor ? highColor[1] : undefined,\n              color: actionColor ? actionColor[1] : undefined,\n            }}\n          />\n          <div className=\"info\">\n            {_renderLabel()}\n            <div className=\"dual\">\n              <button onClick={() => _handleSelectTemp(\"low\")} className={`${_selectTargetTemperature === \"low\" ? \"selected\" : \"\"}`}>\n                {_renderTargetTemperature(_targetTemperature.low)}\n              </button>\n              <button onClick={() => _handleSelectTemp(\"high\")} className={`${_selectTargetTemperature === \"high\" ? \"selected\" : \"\"}`}>\n                {_renderTargetTemperature(_targetTemperature.high)}\n              </button>\n            </div>\n            {_renderCurrentTemperature(entity.attributes.current_temperature)}\n          </div>\n          {_renderTemperatureButtons(_selectTargetTemperature, true)}\n        </div>\n      );\n    }\n    return (\n      <div className=\"container\">\n        <ControlSliderCircular\n          mode=\"full\"\n          current={entity.attributes.current_temperature}\n          min={_min}\n          max={_max}\n          step={_step}\n          readonly\n          disabled={!active}\n        ></ControlSliderCircular>\n        <div className=\"info\">\n          {_renderLabel()}\n          {_renderCurrentTemperature(entity.attributes.current_temperature)}\n        </div>\n      </div>\n    );\n  }\n\n  return <Wrapper>{render()}</Wrapper>;\n}\n","import { ClimateEntityFeature, UNIT_F } from \"./data\";\nimport { useState, useMemo, useEffect, useCallback } from \"react\";\nimport {\n  type FilterByDomain,\n  type EntityName,\n  UNAVAILABLE,\n  useEntity,\n  supportsFeatureFromAttributes,\n  stateActive,\n  useHass,\n} from \"@hakit/core\";\nimport { useDebouncedCallback } from \"use-debounce\";\nimport { clamp } from \"lodash\";\nimport { FabCard, ControlSliderCircular } from \"@components\";\nimport { colors } from \"./shared\";\nimport { BigNumber } from \"./BigNumber\";\nimport { Icon } from \"@iconify/react\";\n\nexport interface ClimateHumiditySliderProps {\n  entity: FilterByDomain<EntityName, \"climate\">;\n  showCurrent?: boolean;\n  targetTempStep?: number;\n}\n\nexport function ClimateHumiditySlider({ entity: _entity, targetTempStep, showCurrent = false }: ClimateHumiditySliderProps) {\n  const entity = useEntity(_entity);\n  const [_targetHumidity, setTargetHumidity] = useState<number | null>(entity.attributes.humidity ?? null);\n  const config = useHass((state) => state.config);\n  const { target_temp_step, min_humidity = 0, max_humidity = 100 } = entity.attributes;\n\n  const _step = useMemo(() => {\n    return targetTempStep ?? target_temp_step ?? (config?.unit_system.temperature === UNIT_F ? 1 : 0.5);\n  }, [config?.unit_system.temperature, targetTempStep, target_temp_step]);\n\n  useEffect(() => {\n    setTargetHumidity(entity.attributes.humidity ?? null);\n  }, [entity.attributes.humidity]);\n\n  const _callService = useCallback(\n    (targetHumidity: number) => {\n      if (targetHumidity) {\n        entity.service.setHumidity({\n          serviceData: {\n            humidity: targetHumidity,\n          },\n        });\n      }\n    },\n    [entity.service],\n  );\n\n  const _debouncedCallService = useDebouncedCallback((target: number) => _callService(target), 1000, {\n    leading: true,\n    trailing: true,\n  });\n\n  const _valueChanged = useCallback(\n    (value: number) => {\n      if (isNaN(value)) return;\n      setTargetHumidity(value);\n      _callService(value);\n    },\n    [_callService],\n  );\n\n  const _valueChanging = useCallback((value: number) => {\n    if (isNaN(value)) return;\n    setTargetHumidity(value);\n  }, []);\n\n  const _handleButton = useCallback(\n    (step: number) => {\n      let humidity = _targetHumidity ?? min_humidity;\n      humidity += step;\n      humidity = clamp(humidity, min_humidity, max_humidity);\n      setTargetHumidity(humidity);\n      _debouncedCallService(humidity);\n    },\n    [_debouncedCallService, max_humidity, min_humidity, _targetHumidity],\n  );\n\n  const _renderLabel = useCallback(() => {\n    if (entity.state === UNAVAILABLE) {\n      return <p className=\"label disabled\">{entity.state ?? UNAVAILABLE}</p>;\n    }\n    return <p className=\"label\">Target</p>;\n  }, [entity.state]);\n\n  const _renderButtons = useCallback(() => {\n    return (\n      <div className=\"buttons\">\n        <FabCard icon=\"mdi:minus\" onClick={() => _handleButton(-_step)} />\n        <FabCard icon=\"mdi:plus\" onClick={() => _handleButton(_step)} />\n      </div>\n    );\n  }, [_handleButton, _step]);\n\n  const _renderTarget = useCallback((humidity: number) => {\n    const formatOptions = {\n      maximumFractionDigits: 0,\n    };\n\n    return <BigNumber value={humidity} unit=\"%\" unitPosition=\"bottom\" formatOptions={formatOptions} />;\n  }, []);\n\n  const _renderCurrentHumidity = useCallback(\n    (humidity?: number) => {\n      if (!showCurrent || humidity == null) {\n        return <p className=\"label\">&nbsp;</p>;\n      }\n\n      return (\n        <p className=\"label\">\n          <Icon icon=\"mdi:water-percent\" />\n          <span>{entity.attributes.current_humidity ?? humidity}</span>\n        </p>\n      );\n    },\n    [entity.attributes.current_humidity, showCurrent],\n  );\n  const supportsTargetHumidity = supportsFeatureFromAttributes(entity.attributes, ClimateEntityFeature.TARGET_HUMIDITY);\n  const active = stateActive(entity);\n\n  // Use humidifier state color\n  const stateColor = active ? colors[\"cool\"][1] : colors.off[1];\n\n  const targetHumidity = _targetHumidity;\n  const currentHumidity = entity.attributes.current_humidity;\n\n  if (supportsTargetHumidity && targetHumidity != null && entity.state !== UNAVAILABLE) {\n    return (\n      <div className=\"container\">\n        <ControlSliderCircular\n          inactive={!active}\n          value={_targetHumidity ?? 0}\n          min={min_humidity}\n          max={max_humidity}\n          step={_step}\n          current={currentHumidity}\n          onChangeApplied={_valueChanged}\n          onChange={_valueChanging}\n          colors={{\n            color: stateColor,\n          }}\n        />\n        <div className=\"info\">\n          {_renderLabel()} {_renderTarget(targetHumidity)}\n          {_renderCurrentHumidity(entity.attributes.current_humidity)}\n        </div>\n        {_renderButtons()}\n      </div>\n    );\n  }\n\n  return (\n    <div className=\"container${containerSizeClass}\">\n      <ControlSliderCircular current={entity.attributes.current_humidity} min={min_humidity} max={max_humidity} step={_step} disabled />\n      <div className=\"info\">\n        {_renderLabel()}\n        {_renderCurrentHumidity(entity.attributes.current_humidity)}\n      </div>\n    </div>\n  );\n}\n","import { Menu, FabCard, ButtonBar, ButtonBarButton, fallback } from \"@components\";\nimport type { EntityName, FilterByDomain } from \"@hakit/core\";\nimport { useEntity, HvacMode, toReadableString, OFF, localize, supportsFeatureFromAttributes, UNAVAILABLE, useHass } from \"@hakit/core\";\nimport { useState, useEffect, useMemo, useCallback } from \"react\";\nimport styled from \"@emotion/styled\";\nimport { ErrorBoundary } from \"react-error-boundary\";\nimport { css } from \"@emotion/react\";\nimport {\n  ClimateEntityFeature,\n  ClimateBuiltInPresetMode,\n  compareClimateHvacModes,\n  ClimateBuiltInSwingMode,\n  computeFanModeIcon,\n  computeHvacModeIcon,\n  computePresetModeIcon,\n  computeSwingModeIcon,\n  ClimateBuiltInFanMode,\n  UNIT_F,\n} from \"./data\";\nimport { ClimateControlSlider } from \"./ClimateControlSlider\";\nimport { ClimateHumiditySlider } from \"./ClimateHumiditySlider\";\n\ntype MainControl = \"temperature\" | \"humidity\";\n\nconst Wrapper = styled.div`\n  color: var(--ha-500-contrast);\n  width: 100%;\n  .controls {\n    display: flex;\n    flex-direction: column;\n    justify-content: center;\n    align-items: center;\n  }\n  .controls-scroll {\n    display: flex;\n    flex-direction: row;\n    justify-content: flex-start;\n    gap: 24px;\n    padding: 0 24px;\n  }\n`;\n\nexport interface ClimateControlsProps extends Omit<React.ComponentPropsWithoutRef<\"div\">, \"title\"> {\n  /** the name of your climate entity */\n  entity: FilterByDomain<EntityName, \"climate\">;\n  /** provide a list of hvacModes you want to support/display in the UI, will use all by default */\n  hvacModes?: HvacMode[];\n  /** use custom labels for the displayed hvac modes */\n  hvacModeLabels?: Record<HvacMode, string>;\n  /** hide the current temperature @default false */\n  hideCurrentTemperature?: boolean;\n  /** hide the hvac modes button @default false */\n  hideHvacModes?: boolean;\n  /** hide the swing modes button @default false */\n  hideSwingModes?: boolean;\n  /** hide the fan modes button @default false */\n  hideFanModes?: boolean;\n  /** hide the preset modes button @default false */\n  hidePresetModes?: boolean;\n  /** changed whenever the state changes */\n  entityStateChanged?: (state: string) => void;\n  /** the control mode */\n  mainControl?: MainControl;\n  /** The custom step increment for the climate entity, this is automatically retrieved from the entity */\n  targetTempStep?: number;\n}\n\nfunction InternalClimateControls({\n  entity: _entity,\n  hvacModes,\n  hvacModeLabels,\n  hideCurrentTemperature,\n  hideHvacModes,\n  hideSwingModes,\n  hideFanModes,\n  hidePresetModes,\n  entityStateChanged,\n  cssStyles,\n  className,\n  targetTempStep,\n  mainControl = \"temperature\",\n  ...rest\n}: ClimateControlsProps) {\n  const [_mainControl, setMainControl] = useState<MainControl>(mainControl);\n  const entity = useEntity(_entity);\n  const isOff = entity.state === OFF;\n  const { hvac_action, preset_mode, fan_mode } = entity.attributes;\n  const fan_modes = entity.attributes.fan_modes as ClimateBuiltInFanMode[] | undefined;\n  const preset_modes = entity.attributes.preset_modes as ClimateBuiltInPresetMode[] | undefined;\n  const swing_modes = entity.attributes.swing_modes as ClimateBuiltInSwingMode[] | undefined;\n  const modes = hvacModes ?? entity.attributes.hvac_modes;\n  const config = useHass((state) => state.config);\n\n  const supportTargetHumidity = supportsFeatureFromAttributes(entity.attributes, ClimateEntityFeature.TARGET_HUMIDITY);\n  const supportFanMode = supportsFeatureFromAttributes(entity.attributes, ClimateEntityFeature.FAN_MODE);\n  const supportPresetMode = supportsFeatureFromAttributes(entity.attributes, ClimateEntityFeature.PRESET_MODE);\n  const supportSwingMode = supportsFeatureFromAttributes(entity.attributes, ClimateEntityFeature.SWING_MODE);\n\n  useEffect(() => {\n    if (!entityStateChanged) return;\n    if (isOff) {\n      return entityStateChanged(\"Off\");\n    }\n    return entityStateChanged(hvac_action ?? \"unknown\");\n  }, [hvac_action, entityStateChanged, isOff]);\n\n  useEffect(() => {\n    setMainControl(mainControl);\n  }, [mainControl]);\n\n  const { target_temp_step } = entity.attributes;\n\n  const _step = useMemo(() => {\n    return targetTempStep ?? target_temp_step ?? (config?.unit_system.temperature === UNIT_F ? 1 : 0.5);\n  }, [config?.unit_system.temperature, targetTempStep, target_temp_step]);\n\n  const _handleFanModeChanged = useCallback(\n    (value: ClimateBuiltInFanMode) => {\n      entity.service.setFanMode({\n        serviceData: {\n          fan_mode: value,\n        },\n      });\n    },\n    [entity.service],\n  );\n\n  const _handleOperationModeChanged = useCallback(\n    (value: HvacMode) => {\n      entity.service.setHvacMode({\n        serviceData: {\n          hvac_mode: value,\n        },\n      });\n    },\n    [entity.service],\n  );\n\n  const _handleSwingmodeChanged = useCallback(\n    (value: ClimateBuiltInSwingMode) => {\n      entity.service.setSwingMode({\n        serviceData: {\n          swing_mode: value,\n        },\n      });\n    },\n    [entity.service],\n  );\n\n  const _handlePresetmodeChanged = useCallback(\n    (value: ClimateBuiltInPresetMode) => {\n      if (value) {\n        entity.service.setPresetMode({\n          serviceData: {\n            preset_mode: value,\n          },\n        });\n      }\n    },\n    [entity.service],\n  );\n\n  return (\n    <Wrapper\n      {...rest}\n      className={`climate-card-controls ${className}`}\n      css={css`\n        ${cssStyles ?? \"\"}\n      `}\n    >\n      <div className=\"controls\">\n        {_mainControl === \"temperature\" ? (\n          <ClimateControlSlider targetTempStep={_step} entity={_entity} showCurrent={!hideCurrentTemperature} />\n        ) : null}\n        {_mainControl === \"humidity\" ? (\n          <ClimateHumiditySlider targetTempStep={_step} entity={_entity} showCurrent={!hideCurrentTemperature} />\n        ) : null}\n        {supportTargetHumidity ? (\n          <ButtonBar\n            cssStyles={`\n              margin-bottom: 12px;\n            `}\n          >\n            <ButtonBarButton\n              active={_mainControl === \"temperature\"}\n              disabled={entity!.state === UNAVAILABLE}\n              title={localize(\"temperature\")}\n              icon=\"mdi:thermometer\"\n              onClick={() => setMainControl(\"temperature\")}\n            />\n            <ButtonBarButton\n              active={_mainControl === \"humidity\"}\n              disabled={entity!.state === UNAVAILABLE}\n              title={localize(\"humidity\")}\n              onClick={() => setMainControl(\"humidity\")}\n              icon=\"mdi:water-percent\"\n            />\n          </ButtonBar>\n        ) : null}\n        <div className={`controls-scroll`}>\n          {modes && !hideHvacModes && (\n            <Menu\n              placement=\"top\"\n              items={modes\n                .concat()\n                .sort(compareClimateHvacModes)\n                .map((mode) => {\n                  return {\n                    active: entity.state === mode,\n                    icon: computeHvacModeIcon(mode),\n                    label: hvacModeLabels?.[mode] ?? toReadableString(mode),\n                    onClick: () => {\n                      _handleOperationModeChanged(mode);\n                    },\n                  };\n                })}\n            >\n              <FabCard\n                icon={computeHvacModeIcon(entity.state as HvacMode)}\n                disabled={entity.state === UNAVAILABLE}\n                title={toReadableString(entity.state)}\n              />\n            </Menu>\n          )}\n          {supportPresetMode && !hidePresetModes && preset_modes && (\n            <Menu\n              placement=\"top\"\n              items={preset_modes.map((mode) => {\n                return {\n                  active: preset_mode === mode,\n                  icon: computePresetModeIcon(mode),\n                  label: toReadableString(mode),\n                  onClick: () => {\n                    _handlePresetmodeChanged(mode);\n                  },\n                };\n              })}\n            >\n              <FabCard\n                icon={computePresetModeIcon(preset_mode as ClimateBuiltInPresetMode)}\n                disabled={entity.state === UNAVAILABLE}\n                title={toReadableString(entity.attributes.preset_mode)}\n              />\n            </Menu>\n          )}\n          {supportFanMode && !hideFanModes && fan_modes && (\n            <Menu\n              placement=\"top\"\n              items={fan_modes.map((mode) => {\n                return {\n                  active: entity.attributes.fan_mode === mode,\n                  icon: computeFanModeIcon(mode),\n                  label: toReadableString(mode),\n                  onClick: () => {\n                    _handleFanModeChanged(mode);\n                  },\n                };\n              })}\n            >\n              <FabCard\n                icon={computeFanModeIcon(fan_mode as ClimateBuiltInFanMode)}\n                disabled={entity.state === UNAVAILABLE}\n                title={toReadableString(entity.attributes.fan_mode)}\n              />\n            </Menu>\n          )}\n          {supportSwingMode && !hideSwingModes && swing_modes && (\n            <Menu\n              placement=\"top\"\n              items={swing_modes.map((mode) => {\n                return {\n                  active: entity.attributes.swing_mode === mode,\n                  icon: computeSwingModeIcon(mode),\n                  label: toReadableString(mode),\n                  onClick: () => {\n                    _handleSwingmodeChanged(mode);\n                  },\n                };\n              })}\n            >\n              <FabCard\n                icon={computeSwingModeIcon(entity.attributes.swing_mode as ClimateBuiltInSwingMode)}\n                disabled={entity.state === UNAVAILABLE}\n                title={toReadableString(entity.attributes.swing_mode)}\n              />\n            </Menu>\n          )}\n        </div>\n      </div>\n    </Wrapper>\n  );\n}\n\n/** This layout is shared for the popup for a buttonCard and fabCard when long pressing on a card with a climate entity, and also the climateCard, this will fill the width/height of the parent component */\nexport function ClimateControls(props: ClimateControlsProps) {\n  return (\n    <ErrorBoundary {...fallback({ prefix: \"ClimateControls\" })}>\n      <InternalClimateControls {...props} />\n    </ErrorBoundary>\n  );\n}\n","export default \"data:image/png;base64,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\"","import { useMemo, useEffect, useState, useCallback } from \"react\";\nimport styled from \"@emotion/styled\";\nimport {\n  ControlSlider,\n  Tooltip,\n  Column,\n  FabCard,\n  ColorTempPicker,\n  ColorPicker,\n  useBreakpoint,\n  fallback,\n  ColumnProps,\n  ControlToggle,\n  Menu,\n} from \"@components\";\nimport {\n  useEntity,\n  LIGHT_COLOR_MODES,\n  OFF,\n  ON,\n  isUnavailableState,\n  useLightBrightness,\n  lightSupportsBrightness,\n  lightSupportsColorMode,\n  lightSupportsColor,\n  localize,\n  toReadableString,\n  lightSupportsFavoriteColors,\n  computeDefaultFavoriteColors,\n  temperature2rgb,\n  getLightCurrentModeRgbColor,\n  luminosity,\n  rgbww2rgb,\n  rgbw2rgb,\n  hs2rgb,\n  type LightColor,\n  useHass,\n  DOMAIN_ATTRIBUTES_UNITS,\n  isOffState,\n} from \"@hakit/core\";\nimport type { EntityName, FilterByDomain, LightEntityAttributes, ServiceData } from \"@hakit/core\";\nimport colorWheel from \"./color_wheel.png\";\nimport { ErrorBoundary } from \"react-error-boundary\";\n\nconst SWATCH_SIZE = 40;\n\nconst ButtonBar = styled.div`\n  position: relative;\n  display: flex;\n  flex-direction: row;\n  align-items: center;\n  height: 56px;\n  border-radius: 28px;\n  background-color: rgba(120, 120, 120, 0.1);\n  box-sizing: border-box;\n  width: auto;\n  padding: 4px;\n  gap: 4px;\n  margin-top: 24px;\n`;\n\nconst Separator = styled.div`\n  background-color: rgba(255, 255, 255, 0.1);\n  width: 1px;\n  height: 40px;\n`;\n\ntype MainControl = \"brightness\" | \"color_temp\" | \"color\";\n\nconst FabCardColor = styled(FabCard)`\n  position: relative;\n  .icon {\n    background-color: transparent;\n    transition: background var(--ha-transition-duration) var(--ha-easing);\n  }\n  &:after {\n    content: \"\";\n    position: absolute;\n    inset: 0px;\n    border-radius: 50%;\n    border: 0px;\n    background-image: url(${colorWheel});\n    background-size: 101%;\n    transition: var(--ha-transition-duration) var(--ha-easing);\n    transition-property: inset, border;\n    pointer-events: none;\n  }\n  ${(props) =>\n    props.active &&\n    `\n    .icon {\n      background-color: white;\n      transition: background var(--ha-transition-duration) var(--ha-easing);\n    }\n    &:after {\n      inset: 2px;\n      border: 2px solid var(--ha-S200);\n    }\n  `}\n  svg {\n    display: none;\n  }\n`;\n\nconst FabCardTemp = styled(FabCard)`\n  position: relative;\n  .icon {\n    background-color: transparent;\n    transition: background var(--ha-transition-duration) var(--ha-easing);\n  }\n  &:after {\n    content: \"\";\n    position: absolute;\n    inset: 0px;\n    border-radius: 50%;\n    border: 0px;\n    pointer-events: none;\n    background: linear-gradient(0deg, rgb(166, 209, 255) 0%, rgb(255, 255, 255) 50%, rgb(255, 160, 0) 100%);\n    transition: var(--ha-transition-duration) var(--ha-easing);\n    transition-property: inset, border;\n  }\n  ${(props) =>\n    props.active &&\n    `\n    .icon {\n      background-color: white;\n    }\n    &:after {\n      inset: 2px;\n      border: 2px solid var(--ha-S200);\n    }\n  `}\n  svg {\n    display: none;\n  }\n`;\n\ntype Extended = React.HTMLAttributes<HTMLDivElement> & ColumnProps;\nexport interface LightControlsProps extends Extended {\n  entity: FilterByDomain<EntityName, \"light\">;\n  onStateChange?: (state: string) => void;\n  /** Show the favorite colors section (defaults to true) */\n  showFavoriteColors?: boolean;\n  /** Provide custom favorite colors instead of computed defaults */\n  favoriteColors?: LightColor[];\n}\n\nfunction InternalLightControls({\n  entity: _entity,\n  onStateChange,\n  style,\n  showFavoriteColors = true,\n  favoriteColors,\n  ...rest\n}: LightControlsProps) {\n  const [control, setControl] = useState<MainControl>(\"brightness\");\n  const entity = useEntity(_entity);\n  const brightnessValue = useLightBrightness(entity);\n  const device = useBreakpoint();\n  const isUnavailable = isUnavailableState(entity.state);\n  const formatter = useHass((state) => state.formatter);\n  const titleValue = useMemo(() => {\n    if (entity.state === OFF) {\n      return localize(\"off\");\n    }\n    if (entity.state === ON) {\n      return `${brightnessValue}${DOMAIN_ATTRIBUTES_UNITS.light.brightness}`;\n    }\n    return localize(\"unavailable\");\n  }, [brightnessValue, entity.state]);\n\n  useEffect(() => {\n    if (onStateChange) {\n      onStateChange(titleValue);\n    }\n  }, [titleValue, onStateChange]);\n\n  // Effects restored per user request.\n\n  const supportsColorTemp = lightSupportsColorMode(entity, LIGHT_COLOR_MODES.COLOR_TEMP);\n  const supportsColor = lightSupportsColor(entity);\n  const supportsBrightness = lightSupportsBrightness(entity);\n  const supportsWhite = lightSupportsColorMode(entity, LIGHT_COLOR_MODES.WHITE);\n  const hasEffects = !!(entity?.attributes?.effect_list && entity.attributes.effect_list.length > 0);\n\n  const supportsFavorites = lightSupportsFavoriteColors(entity);\n  const computedFavorites = useMemo(() => {\n    if (!supportsFavorites) return [] as LightColor[];\n    return favoriteColors && favoriteColors.length > 0 ? favoriteColors : computeDefaultFavoriteColors(entity);\n  }, [supportsFavorites, favoriteColors, entity]);\n\n  const currentRgb = getLightCurrentModeRgbColor(entity);\n  const currentKelvin = entity.attributes.color_temp_kelvin;\n\n  const isFavoriteActive = useCallback(\n    (fav: LightColor) => {\n      if (\"color_temp_kelvin\" in fav) {\n        return (fav as { color_temp_kelvin: number }).color_temp_kelvin === currentKelvin;\n      }\n      if (\"rgb_color\" in fav && currentRgb) {\n        const rgb = (fav as { rgb_color: [number, number, number] }).rgb_color;\n        return rgb.every((v, i) => v === currentRgb[i]);\n      }\n      return false;\n    },\n    [currentKelvin, currentRgb],\n  );\n\n  const handleFavoriteClick = useCallback(\n    (fav: LightColor) => {\n      // Mirror HA: spread favorite object keys directly into service data without using 'any'\n      const serviceData: ServiceData<\"light\", \"turnOn\"> = {};\n      if (\"hs_color\" in fav) serviceData.hs_color = fav.hs_color;\n      if (\"color_temp_kelvin\" in fav) serviceData.color_temp_kelvin = fav.color_temp_kelvin;\n      if (\"rgb_color\" in fav) serviceData.rgb_color = fav.rgb_color;\n      if (\"rgbw_color\" in fav) serviceData.rgbw_color = fav.rgbw_color;\n      if (\"rgbww_color\" in fav) serviceData.rgbww_color = fav.rgbww_color;\n      entity.service.turnOn({ serviceData });\n    },\n    [entity.service],\n  );\n\n  const _handleEffectChange = useCallback(\n    (value?: string) => {\n      entity.service.turnOn({\n        serviceData: {\n          effect: value,\n        },\n      });\n    },\n    [entity.service],\n  );\n\n  return (\n    <Column\n      fullHeight\n      fullWidth\n      wrap=\"nowrap\"\n      justifyContent={device.xxs ? \"flex-start\" : \"center\"}\n      style={{\n        padding: device.xxs ? \"1rem\" : \"0\",\n        ...style,\n      }}\n      {...rest}\n    >\n      <Column>\n        {/* Mirrors HA: if no brightness support, show a simple toggle first */}\n        {!supportsBrightness && (\n          <ControlToggle\n            disabled={isUnavailable}\n            reversed\n            checked={entity.state === ON}\n            onChange={() => {\n              entity.service.toggle();\n            }}\n          />\n        )}\n        {(supportsColorTemp || supportsColor || supportsBrightness) && (\n          <>\n            {supportsBrightness && control === \"brightness\" && (\n              <ControlSlider\n                sliderColor={entity.state === ON ? entity.custom.color : undefined}\n                min={1}\n                max={100}\n                thickness={device.xxs ? 90 : 100}\n                clampValueToBaseline={!isOffState(entity.state)}\n                borderRadius={24}\n                value={brightnessValue}\n                disabled={isUnavailable}\n                onChange={(value) => {\n                  if (onStateChange) onStateChange(`${Math.round(value)}%`);\n                }}\n                onChangeApplied={(value) => {\n                  entity.service.turnOn({\n                    serviceData: { brightness_pct: value },\n                  });\n                  if (onStateChange) onStateChange(`${Math.round(value)}%`);\n                }}\n              />\n            )}\n            {supportsColor && control === \"color\" && <ColorPicker entity={_entity} />}\n            {supportsColorTemp && control === \"color_temp\" && (\n              <ColorTempPicker\n                entity={_entity}\n                disabled={isUnavailable || entity.state === OFF}\n                onChange={(kelvin) => {\n                  if (kelvin === null) {\n                    if (onStateChange) onStateChange(`${titleValue}`);\n                  } else {\n                    if (onStateChange) onStateChange(`${kelvin}K`);\n                  }\n                }}\n                onChangeApplied={() => {\n                  if (onStateChange) onStateChange(`${titleValue}`);\n                }}\n              />\n            )}\n          </>\n        )}\n      </Column>\n\n      {(supportsColorTemp || supportsColor || supportsBrightness) && (\n        <ButtonBar>\n          {/* Power button only when brightness supported (HA pattern) */}\n          {supportsBrightness && (\n            <Tooltip title={entity.state === OFF ? localize(\"turn_on\") : localize(\"turn_off\")}>\n              <FabCard\n                icon=\"mdi:power\"\n                onClick={() => {\n                  entity.service.toggle();\n                }}\n              />\n            </Tooltip>\n          )}\n          {/* Show brightness toggle button only if there are other modes to switch to */}\n          {(supportsColor || supportsColorTemp) && supportsBrightness && <Separator />}\n          {(supportsColor || supportsColorTemp) && supportsBrightness && (\n            <Tooltip title={localize(\"color_brightness\")}>\n              <FabCard\n                key={`${_entity}-brightness`}\n                icon=\"mdi:brightness-6\"\n                active={control === \"brightness\"}\n                onClick={() => setControl(\"brightness\")}\n              />\n            </Tooltip>\n          )}\n          {supportsColor && (\n            <Tooltip title={localize(\"color\")}>\n              <FabCardColor key={`${_entity}-color`} active={control === \"color\"} onClick={() => setControl(\"color\")} />\n            </Tooltip>\n          )}\n          {supportsColorTemp && (\n            <Tooltip title={localize(\"color_temperature\")}>\n              <FabCardTemp key={`${_entity}-color-temp`} active={control === \"color_temp\"} onClick={() => setControl(\"color_temp\")} />\n            </Tooltip>\n          )}\n          {supportsWhite && (\n            <>\n              <Separator />\n              <Tooltip title={localize(\"set_white\") /* placeholder key */}>\n                <FabCard\n                  key={`${_entity}-white`}\n                  icon=\"mdi:file-word-box\"\n                  onClick={() => {\n                    entity.service.turnOn({ serviceData: { white: true } });\n                  }}\n                />\n              </Tooltip>\n            </>\n          )}\n          {/* Effects menu (mirrors HA effect selection placement after controls) */}\n          {hasEffects && entity.attributes.effect_list && (\n            <Menu\n              placement=\"top\"\n              items={entity.attributes.effect_list.map((effect) => {\n                return {\n                  active: entity.attributes.effect === effect,\n                  label: toReadableString(effect),\n                  onClick: () => {\n                    _handleEffectChange(effect);\n                  },\n                };\n              })}\n            >\n              <Tooltip title={localize(\"effect\")}>\n                <FabCard key={`${_entity}-effects`} icon=\"mdi:stars\" />\n              </Tooltip>\n            </Menu>\n          )}\n        </ButtonBar>\n      )}\n      {showFavoriteColors && supportsFavorites && computedFavorites.length > 0 && (\n        <FavoritesWrapper>\n          {/* TODO: allow user persistence & editing of custom favorite colors */}\n          {computedFavorites.map((fav, idx) => {\n            const [r, g, b] = getRgbColor(entity.attributes, fav);\n            const bg = `rgb(${r}, ${g}, ${b})`;\n            const active = isFavoriteActive(fav);\n            const lum = luminosity([r, g, b]);\n            const contrastColor = lum > 0.8 ? \"rgb(33,33,33)\" : \"white\";\n\n            // Helper: clamp & round before hex conversion so decimals don't produce invalid hex like \"fe.1c...\"\n            const rgbToHex = (vals: [number, number, number]) =>\n              \"#\" +\n              vals\n                .map((v) => Math.min(255, Math.max(0, Math.round(v))))\n                .map((v) => v.toString(16).padStart(2, \"0\"))\n                .join(\"\");\n\n            let label: string;\n            if (\"color_temp_kelvin\" in fav) {\n              // Only show kelvin label when the light actually supports color temperature; otherwise show hex.\n              if (lightSupportsColorMode(entity, LIGHT_COLOR_MODES.COLOR_TEMP)) {\n                label = formatter.attributeValue(\n                  {\n                    ...entity,\n                    attributes: {\n                      ...entity.attributes,\n                      color_temp_kelvin: fav.color_temp_kelvin,\n                    },\n                  },\n                  \"color_temp_kelvin\",\n                ) as string;\n              } else {\n                label = rgbToHex([r, g, b]);\n              }\n            } else {\n              label = rgbToHex([r, g, b]);\n            }\n            return (\n              <Tooltip key={`fav-${idx}`} title={label}>\n                <FavoriteFabCard\n                  data-label={label}\n                  size={SWATCH_SIZE}\n                  icon={active ? \"mdi:check-circle-outline\" : null}\n                  iconProps={{\n                    style: {\n                      color: contrastColor,\n                    },\n                  }}\n                  noIcon={!active}\n                  active={active}\n                  style={{\n                    backgroundColor: bg,\n                    color: contrastColor,\n                  }}\n                  onClick={() => handleFavoriteClick(fav)}\n                />\n              </Tooltip>\n            );\n          })}\n        </FavoritesWrapper>\n      )}\n    </Column>\n  );\n}\n\n/** A component that will render the controls for a light, this is currently used by the popup for buttons */\nexport function LightControls(props: LightControlsProps) {\n  return (\n    <ErrorBoundary {...fallback({ prefix: \"LightControls\" })}>\n      <InternalLightControls {...props} />\n    </ErrorBoundary>\n  );\n}\n\nfunction getRgbColor(entityAttributes: LightEntityAttributes, color: LightColor): [number, number, number] {\n  if (color) {\n    if (\"hs_color\" in color) {\n      return hs2rgb([color.hs_color[0], color.hs_color[1] / 100]);\n    }\n    if (\"color_temp_kelvin\" in color) {\n      return temperature2rgb(color.color_temp_kelvin);\n    }\n    if (\"rgb_color\" in color) {\n      return color.rgb_color;\n    }\n    if (\"rgbw_color\" in color) {\n      return rgbw2rgb(color.rgbw_color);\n    }\n    if (\"rgbww_color\" in color) {\n      return rgbww2rgb(color.rgbww_color, entityAttributes.min_color_temp_kelvin, entityAttributes.max_color_temp_kelvin);\n    }\n  }\n\n  return [255, 255, 255];\n}\n\n// Styled components for favorites\nconst FavoritesWrapper = styled.div`\n  /* Keep a consistent swatch size & gap regardless of parent width */\n  --favorite-swatch-size: ${SWATCH_SIZE}px;\n  --favorite-swatch-gap: 8px;\n  margin-top: 16px;\n  display: grid;\n  width: 100%;\n  gap: var(--favorite-swatch-gap);\n  /* Fixed-size columns so they don't stretch when there's extra space */\n  grid-template-columns: repeat(4, var(--favorite-swatch-size));\n  justify-content: center; /* center the 4-column block horizontally */\n  align-items: center;\n  justify-items: center;\n`;\n\nconst FavoriteFabCard = styled(FabCard)`\n  position: relative;\n  box-sizing: border-box;\n  width: var(--favorite-swatch-size);\n  height: var(--favorite-swatch-size);\n  .icon {\n    opacity: 0;\n  }\n  &:hover {\n    transform: scale(0.97);\n  }\n`;\n","import styled from \"@emotion/styled\";\nimport { keyframes } from \"@emotion/react\";\nimport { useEffect, useState, CSSProperties, useRef } from \"react\";\nimport {\n  localize,\n  useHass,\n  type AlarmMode,\n  type AlarmPanelCardConfigState,\n  type EntityName,\n  type HassEntityWithService,\n  type FilterByDomain,\n  useEntity,\n  LocaleKeys,\n} from \"@hakit/core\";\nimport { fallback, ButtonGroup, ButtonGroupButton } from \"@components\";\nimport { ErrorBoundary } from \"react-error-boundary\";\nimport { TextField } from \"../../../Form/TextField\";\nimport { snakeCase } from \"lodash\";\n\nimport { _getActionLabel, _getActionColor, filterSupportedAlarmStates, ALARM_MODE_STATE_MAP, ALARM_MODES, DEFAULT_STATES } from \"./shared\";\n\nconst BUTTONS = [\"1\", \"2\", \"3\", \"4\", \"5\", \"6\", \"7\", \"8\", \"9\", \"\", \"0\", \"clear\"];\n// split the buttons into 3 rows so we can render them like an input pad\nconst BUTTON_ROWS = BUTTONS.reduce((acc, _val, i) => {\n  if (i % 3 === 0) {\n    acc.push(BUTTONS.slice(i, i + 3));\n  }\n  return acc;\n}, [] as string[][]);\n\nconst FORMAT_NUMBER = \"number\";\n\nconst pulse = keyframes`\n  0% {\n    opacity: 1;\n  }\n  50% {\n    opacity: 0;\n  }\n  100% {\n    opacity: 1;\n  }\n`;\n\nconst Wrapper = styled.div`\n  width: 100%;\n  position: relative;\n  height: 100%;\n  display: flex;\n  flex-direction: column;\n  align-items: center;\n  box-sizing: border-box;\n\n  .card-header {\n    display: flex;\n    justify-content: space-between;\n    align-items: center;\n    width: 100%;\n    box-sizing: border-box;\n  }\n\n  .loading-wrapper {\n    position: absolute;\n    top: 0;\n    bottom: 0;\n    overflow: hidden;\n    z-index: 2;\n  }\n\n  .loading-indicator {\n    position: absolute;\n    inset: 0;\n    animation: ${pulse} 1s infinite;\n    display: flex;\n    justify-content: center;\n    align-items: center;\n    background-color: var(--ha-300-a1);\n  }\n\n  .keypad {\n    .keypad-buttons {\n      z-index: 1;\n    }\n    &:before {\n      content: \"\";\n      position: absolute;\n      top: -10%;\n      left: -10%;\n      right: -10%;\n      bottom: -10%;\n      display: block;\n      opacity: 0.25;\n      z-index: 0;\n      pointer-events: none;\n      transition: var(--ha-transition-duration) var(--ha-easing);\n      transition-property: background;\n      background: radial-gradient(\n        var(--ha-alarm-controls-size) at var(--ha-alarm-controls-position),\n        var(--ha-alarm-controls-color, transparent) 0%,\n        transparent 100%\n      );\n    }\n  }\n\n  .actions {\n    margin: 0;\n    display: flex;\n    flex-wrap: wrap;\n    justify-content: center;\n    width: 100%;\n  }\n`;\n\nconst ControlPanelSize = styled.div<{\n  buttonSize: number;\n  buttonGap: CSSProperties[\"gap\"];\n}>`\n  ${(props) => {\n    return `\n      display: flex;\n      justify-content: center;\n      flex-wrap: wrap;\n      margin: auto;\n      width: 100%;\n      direction: ltr;\n      gap: ${props.buttonGap};\n      position: relative;\n      max-width: calc(${props.buttonSize}px * 3 + ${props.buttonGap} * 2);\n      > * {\n        width: 100%;\n      }\n      .button-group-parent:not(.vertical) {\n        max-width: none;\n        min-width: 0;\n        width: 100%;\n        gap: ${props.buttonGap};\n      }\n    `;\n  }}\n`;\n\ninterface Slot {\n  position: \"1\" | \"2\" | \"3\" | \"4\";\n  children: React.ReactNode;\n}\n\ntype AlarmServices = keyof HassEntityWithService<\"alarm_control_panel\">[\"service\"];\nexport interface AlarmControlsProps extends React.ComponentPropsWithoutRef<\"div\"> {\n  /** The alarm entity to control */\n  entity: FilterByDomain<EntityName, \"alarm_control_panel\">;\n  /** overwrite the default actions that are displayed, by default it will show what's supported by the entity */\n  states?: AlarmPanelCardConfigState[];\n  /** if you provide this the pin-code functionality will be hidden and you'll just be able to call disarm/arm without a pin-code input.  */\n  defaultCode?: number;\n  /** The size of the buttons for the keypad in pixels @default 80 */\n  buttonSize?: number;\n  /** The gap between each button @default '0.5rem' */\n  buttonGap?: CSSProperties[\"gap\"];\n  /** hide the code input field, useful if you only want to show the keypad @default false */\n  hideCodeInput?: boolean;\n  /** hide the keypad, useful if you only want to show the action buttons or just the code input field @default false */\n  hideKeypad?: boolean;\n  /** use a custom color for the background gradient behind the keypad depending on the state, if you return undefined it will use the default */\n  customActionColor?: (state: AlarmMode) => string | undefined;\n  /** overwrite the labels used on the buttons by assigning the state value to a label, by default this will use the same values as home assistant */\n  labelMap?: Record<AlarmPanelCardConfigState | \"disarm\", string>;\n  /** you can customize and add in additional content/layout by inserting custom slots, this allows you to insert custom elements within the component layout. */\n  slots?: Slot[];\n}\n\nfunction InternalAlarmControls({\n  entity: _entity,\n  states: _states,\n  className,\n  cssStyles,\n  defaultCode,\n  buttonSize = 80,\n  buttonGap = \"0.5rem\",\n  hideCodeInput = false,\n  hideKeypad = false,\n  customActionColor,\n  labelMap,\n  slots,\n  ...rest\n}: AlarmControlsProps) {\n  const wrapperRef = useRef<HTMLDivElement>(null);\n  const [inputVal, setInputVal] = useState<string>(defaultCode ? `${defaultCode}` : \"\");\n  const entity = useEntity(_entity);\n  const globalComponentStyle = useHass((state) => state.globalComponentStyles);\n\n  const states = _states || filterSupportedAlarmStates(entity, DEFAULT_STATES);\n\n  const _handlePadClick = (val: string): void => {\n    setInputVal(val === \"clear\" ? \"\" : inputVal + val);\n  };\n\n  const _handleActionClick = (state: AlarmPanelCardConfigState | \"disarm\"): void => {\n    entity.service[snakeCase(`alarm_${state}`) as AlarmServices]({\n      serviceData: {\n        code: inputVal,\n      },\n    });\n    if (!defaultCode) {\n      setInputVal(\"\");\n    }\n  };\n\n  useEffect(() => {\n    if (defaultCode) {\n      setInputVal(`${defaultCode}`);\n    }\n  }, [defaultCode]);\n\n  useEffect(() => {\n    if (!wrapperRef.current) return;\n    wrapperRef.current.style.setProperty(\"--ha-alarm-controls-position\", \"50% 50%\");\n    wrapperRef.current.style.setProperty(\"--ha-alarm-controls-size\", \"50% 50%\");\n    wrapperRef.current.style.setProperty(\"--ha-alarm-controls-color\", _getActionColor(entity.state, customActionColor));\n  }, [entity.state, customActionColor]);\n\n  const localizeState = (): string => {\n    if (entity.state === \"triggered\") return localize(\"pending\");\n    if (entity.state.includes(\"custom_bypass\")) return localize(\"custom_bypass\");\n    if (entity.state.includes(\"armed_\")) return localize(\"armed\");\n    return localize(entity.state as LocaleKeys);\n  };\n\n  const isLoading = [\"pending\", \"triggered\", \"arming\"].includes(entity.state);\n\n  const showKeypad = entity.attributes.code_format === FORMAT_NUMBER && !defaultCode && !hideKeypad;\n  const unpackSlot = (position: \"1\" | \"2\" | \"3\" | \"4\") => slots?.find((slot) => slot.position === position)?.children ?? null;\n\n  return (\n    <Wrapper\n      ref={wrapperRef}\n      className={`alarm-control-panel ${isLoading ? \"is-loading\" : \"\"} ${className ?? \"\"}`}\n      cssStyles={`\n          ${globalComponentStyle.alarmCard ?? \"\"}\n          ${cssStyles ?? \"\"}\n        `}\n      {...rest}\n    >\n      {unpackSlot(\"1\")}\n      <ControlPanelSize className=\"actions-wrapper\" buttonSize={buttonSize} buttonGap={buttonGap}>\n        <ButtonGroup\n          id=\"armActions\"\n          className=\"actions\"\n          orientation=\"horizontal\"\n          thickness={buttonSize}\n          gap={buttonGap}\n          maintainAspectRatio={false}\n        >\n          {(entity.state === \"disarmed\" ? states : ([\"disarm\"] as const)).map((stateAction) => (\n            <ButtonGroupButton\n              key={stateAction}\n              icon={stateAction in ALARM_MODE_STATE_MAP ? ALARM_MODES[ALARM_MODE_STATE_MAP[stateAction]].icon : \"\"}\n              iconProps={{\n                fontSize: \"30px\",\n                style: {\n                  marginBottom: \"6px\",\n                },\n              }}\n              title={!inputVal ? localize(\"enter_code\") : _getActionLabel(stateAction, labelMap)}\n              placement=\"top\"\n              style={{\n                flexDirection: \"column\",\n                fontSize: \"14px\",\n                aspectRatio: \"unset\",\n              }}\n              disabled={!inputVal || isLoading}\n              onClick={() => _handleActionClick(stateAction)}\n            >\n              {_getActionLabel(stateAction, labelMap)}\n            </ButtonGroupButton>\n          ))}\n        </ButtonGroup>\n      </ControlPanelSize>\n      {unpackSlot(\"2\")}\n      {!entity.attributes.code_format || defaultCode || hideCodeInput ? null : (\n        <ControlPanelSize className=\"actions-wrapper-input\" buttonSize={buttonSize} buttonGap={buttonGap}>\n          <TextField value={inputVal} type=\"password\" label={localize(\"code\")} id=\"alarmCode\" disabled={isLoading} />\n        </ControlPanelSize>\n      )}\n      {unpackSlot(\"3\")}\n      {!showKeypad ? null : (\n        <ControlPanelSize className=\"keypad\" buttonSize={buttonSize} buttonGap={buttonGap}>\n          {BUTTON_ROWS.map((buttons, index) => {\n            return (\n              <ButtonGroup key={index} orientation=\"horizontal\" gap={buttonGap} thickness={buttonSize} className=\"keypad-buttons\">\n                {buttons.map((val, j) => {\n                  return (\n                    <ButtonGroupButton\n                      key={`${index}-${j}`}\n                      className={`keypad-button keypad-button-${val === \"\" ? \"empty\" : val} ${val !== \"clear\" ? \"numberkey\" : \"\"}`}\n                      disabled={isLoading || val === \"\"}\n                      disableScaleEffect={val === \"\"}\n                      onClick={() => {\n                        _handlePadClick(val);\n                      }}\n                      style={{\n                        opacity: val === \"\" ? 0.2 : 1,\n                        zIndex: val === \"\" ? -1 : undefined,\n                        cursor: val === \"\" ? \"default\" : \"pointer\",\n                      }}\n                    >\n                      <span>{val === \"clear\" ? localize(\"clear\") : val}</span>\n                    </ButtonGroupButton>\n                  );\n                })}\n              </ButtonGroup>\n            );\n          })}\n        </ControlPanelSize>\n      )}\n      {isLoading && (\n        <>\n          <ControlPanelSize className=\"loading-wrapper\" buttonSize={buttonSize} buttonGap={buttonGap}>\n            <div className=\"loading-indicator\">\n              <span>{localizeState()}</span>\n            </div>\n          </ControlPanelSize>\n        </>\n      )}\n      {unpackSlot(\"4\")}\n    </Wrapper>\n  );\n}\n\n/** This component will render controls for a an alarm system, it supports arm home, arm away, and disarm buttons.\n *  It has full keypad support for entering a pin code to arm/disarm the alarm system.\n *  You can bypass the keycode functionality and just retain the action buttons by providing a defaultCode value with the expected code to pass around\n */\nexport function AlarmControls(props: AlarmControlsProps) {\n  return (\n    <ErrorBoundary {...fallback({ prefix: \"AlarmControls\" })}>\n      <InternalAlarmControls {...props} />\n    </ErrorBoundary>\n  );\n}\n","import { useMemo, useEffect, useCallback, useState } from \"react\";\nimport styled from \"@emotion/styled\";\nimport { ControlSlider, Column, Row, FabCard, useBreakpoint, fallback, ButtonGroup, ButtonGroupButton } from \"@components\";\nimport { useEntity, supportsFeatureFromAttributes, isUnavailableState, localize } from \"@hakit/core\";\nimport type { EntityName, CoverEntity, FilterByDomain } from \"@hakit/core\";\nimport { ErrorBoundary } from \"react-error-boundary\";\n\nconst enum CoverEntityFeature {\n  OPEN = 1,\n  CLOSE = 2,\n  SET_POSITION = 4,\n  STOP = 8,\n  OPEN_TILT = 16,\n  CLOSE_TILT = 32,\n  STOP_TILT = 64,\n  SET_TILT_POSITION = 128,\n}\n\nconst ButtonBar = styled.div`\n  position: relative;\n  display: flex;\n  flex-direction: row;\n  align-items: center;\n  height: 56px;\n  border-radius: 28px;\n  background-color: rgba(120, 120, 120, 0.1);\n  box-sizing: border-box;\n  width: auto;\n  padding: 4px;\n  gap: 4px;\n  margin-top: 24px;\n`;\n\nconst Label = styled.span`\n  font-size: 0.8rem;\n  margin-top: 0.5rem;\n  text-transform: uppercase;\n`;\n\nfunction computeTitleDisplay(entity: CoverEntity, position?: number) {\n  const isUnavailable = isUnavailableState(entity.state);\n  const statePosition =\n    !isUnavailable && entity.state !== \"closed\"\n      ? (entity.attributes.current_position ?? entity.attributes.current_tilt_position)\n      : undefined;\n\n  const currentPosition = position ?? statePosition;\n\n  const suffix = currentPosition && currentPosition !== 100 ? (currentPosition ?? entity.attributes.current_position ?? \"\") : \"\";\n  if (typeof position === \"number\") {\n    return `${position === 0 ? \"closed\" : position === 100 ? \"open\" : entity.state}${suffix ? ` - ${suffix}%` : \"\"}`;\n  }\n  return `${entity.state}${suffix ? ` - ${suffix}%` : \"\"}`;\n}\n\ntype Mode = \"position\" | \"button\";\ntype Orientation = \"vertical\" | \"horizontal\";\n\nexport interface CoverControlsProps {\n  entity: FilterByDomain<EntityName, \"cover\">;\n  onStateChange?: (state: string) => void;\n  mode?: Mode;\n  /** the orientation of the slider, useful if you want to represent the slider to match your curtain/blind orientation */\n  orientation?: Orientation;\n  /** reverse the direction of the slider, useful if you want the ui to reflect the actual cover, the UI will not change, but the actions will reverse, open becomes close, just changes the order */\n  reverse?: boolean;\n}\n\nfunction InternalCoverControls({\n  entity: _entity,\n  mode = \"position\",\n  orientation = \"vertical\",\n  reverse = false,\n  onStateChange,\n}: CoverControlsProps) {\n  const entity = useEntity(_entity);\n  const isUnavailable = isUnavailableState(entity.state);\n  const supports = useCallback(\n    (feature: CoverEntityFeature) => {\n      return supportsFeatureFromAttributes(entity.attributes, feature);\n    },\n    [entity.attributes],\n  );\n  const supportsPosition = supports(CoverEntityFeature.SET_POSITION);\n  const supportsTiltPosition = supports(CoverEntityFeature.SET_TILT_POSITION);\n\n  const supportsOpenClose = supports(CoverEntityFeature.OPEN) || supports(CoverEntityFeature.CLOSE) || supports(CoverEntityFeature.STOP);\n\n  const supportsTilt =\n    supports(CoverEntityFeature.OPEN_TILT) || supports(CoverEntityFeature.CLOSE_TILT) || supports(CoverEntityFeature.STOP_TILT);\n\n  const [_mode, setMode] = useState<Mode>((mode ?? supportsPosition) ? \"position\" : \"button\");\n\n  const device = useBreakpoint();\n  const titleValue = useMemo(() => {\n    return computeTitleDisplay(entity);\n  }, [entity]);\n\n  useEffect(() => {\n    if (supportsPosition && mode === \"position\") {\n      setMode(mode);\n    } else {\n      setMode(\"button\");\n    }\n  }, [mode, supportsPosition]);\n\n  useEffect(() => {\n    if (onStateChange) {\n      onStateChange(titleValue);\n    }\n  }, [titleValue, onStateChange]);\n\n  return (\n    <Column\n      fullHeight\n      wrap=\"nowrap\"\n      justifyContent={device.xxs ? \"flex-start\" : \"flex-start\"}\n      style={{\n        padding: device.xxs ? \"1rem\" : \"0\",\n      }}\n    >\n      <Column>\n        {_mode === \"position\" && (\n          <>\n            <Row\n              gap=\"1rem\"\n              style={{\n                flexDirection: orientation === \"vertical\" ? \"row\" : \"column\",\n              }}\n            >\n              {supportsPosition && typeof entity.attributes.current_position !== \"undefined\" && (\n                <Column>\n                  <ControlSlider\n                    sliderColor={isUnavailable ? undefined : `var(--ha-A400)`}\n                    min={0}\n                    max={100}\n                    mode={reverse ? \"end\" : \"start\"}\n                    vertical={orientation === \"vertical\"}\n                    thickness={device.xxs ? 90 : 100}\n                    borderRadius={24}\n                    value={entity.attributes.current_position}\n                    disabled={isUnavailable}\n                    onChange={(value) => {\n                      if (onStateChange) onStateChange(computeTitleDisplay(entity, Math.round(value)));\n                    }}\n                    onChangeApplied={(value) => {\n                      entity.service.setCoverPosition({\n                        serviceData: {\n                          position: value,\n                        },\n                      });\n                      if (onStateChange) onStateChange(computeTitleDisplay(entity, Math.round(value)));\n                    }}\n                  />\n                  <Label>{localize(\"cover_position\")}</Label>\n                </Column>\n              )}\n              {supportsTiltPosition && typeof entity.attributes.current_tilt_position !== \"undefined\" && (\n                <Column>\n                  <ControlSlider\n                    sliderColor={isUnavailable ? undefined : `var(--ha-A400)`}\n                    min={0}\n                    max={100}\n                    mode={reverse ? \"end\" : \"start\"}\n                    vertical={orientation === \"vertical\"}\n                    thickness={device.xxs ? 90 : 100}\n                    borderRadius={24}\n                    value={entity.attributes.current_tilt_position}\n                    disabled={isUnavailable}\n                    onChange={(value) => {\n                      if (onStateChange) onStateChange(computeTitleDisplay(entity, Math.round(value)));\n                    }}\n                    onChangeApplied={(value) => {\n                      entity.service.setCoverTiltPosition({\n                        serviceData: {\n                          tilt_position: value,\n                        },\n                      });\n                      if (onStateChange) onStateChange(computeTitleDisplay(entity, Math.round(value)));\n                    }}\n                  />\n                  <Label>{localize(\"cover_tilt_position\")}</Label>\n                </Column>\n              )}\n            </Row>\n          </>\n        )}\n        {_mode === \"button\" && (\n          <>\n            <Row\n              gap=\"1rem\"\n              style={{\n                flexDirection: orientation === \"vertical\" ? \"row\" : \"column\",\n              }}\n            >\n              {supportsOpenClose && (\n                <Column>\n                  <ButtonGroup\n                    thickness={device.xxs ? 80 : 96}\n                    reverse={reverse}\n                    orientation={orientation}\n                    style={{\n                      minHeight: orientation === \"vertical\" ? \"200px\" : undefined,\n                      maxHeight: orientation === \"vertical\" ? \"320px\" : undefined,\n                      height: orientation === \"vertical\" ? \"45vh\" : undefined,\n                      minWidth: orientation === \"horizontal\" ? \"320px\" : undefined,\n                      maxWidth: orientation === \"horizontal\" ? \"420px\" : undefined,\n                      flexWrap: \"nowrap\",\n                    }}\n                  >\n                    <ButtonGroupButton\n                      title={localize(\"open_cover\")}\n                      entity={_entity}\n                      service=\"openCover\"\n                      icon={reverse ? \"mdi:arrow-down\" : \"mdi:arrow-up\"}\n                    />\n                    <ButtonGroupButton\n                      title={localize(\"stop_cover\")}\n                      entity={_entity}\n                      service=\"stopCover\"\n                      icon={\"mdi:stop-circle-outline\"}\n                    />\n                    <ButtonGroupButton\n                      title={localize(\"close_cover\")}\n                      entity={_entity}\n                      service=\"closeCover\"\n                      icon={!reverse ? \"mdi:arrow-down\" : \"mdi:arrow-up\"}\n                    />\n                  </ButtonGroup>\n                  <Label>{localize(\"control\")}</Label>\n                </Column>\n              )}\n              {supportsTilt && (\n                <Column>\n                  <ButtonGroup\n                    thickness={device.xxs ? 80 : 96}\n                    reverse={reverse}\n                    orientation={orientation}\n                    style={{\n                      minHeight: orientation === \"vertical\" ? \"200px\" : undefined,\n                      maxHeight: orientation === \"vertical\" ? \"320px\" : undefined,\n                      height: orientation === \"vertical\" ? \"45vh\" : undefined,\n                      minWidth: orientation === \"horizontal\" ? \"320px\" : undefined,\n                      maxWidth: orientation === \"horizontal\" ? \"420px\" : undefined,\n                      flexWrap: \"nowrap\",\n                    }}\n                  >\n                    <ButtonGroupButton\n                      title={localize(\"open_cover_tilt\")}\n                      entity={_entity}\n                      service=\"openCoverTilt\"\n                      icon={reverse ? \"mdi:arrow-collapse\" : \"mdi:arrow-expand\"}\n                    />\n                    <ButtonGroupButton\n                      title={localize(\"stops_a_tilting_cover_movement\")}\n                      entity={_entity}\n                      service=\"stopCoverTilt\"\n                      icon={\"mdi:stop-circle-outline\"}\n                    />\n                    <ButtonGroupButton\n                      title={localize(\"close_cover_tilt\")}\n                      entity={_entity}\n                      service=\"closeCoverTilt\"\n                      icon={!reverse ? \"mdi:arrow-collapse\" : \"mdi:arrow-expand\"}\n                    />\n                  </ButtonGroup>\n                  <Label>{localize(\"tilt_position\")}</Label>\n                </Column>\n              )}\n            </Row>\n          </>\n        )}\n        {(supportsTilt || supportsPosition) && (\n          <ButtonBar>\n            <FabCard\n              icon=\"mdi:hamburger-menu\"\n              active={_mode === \"position\"}\n              title={localize(\"position\")}\n              onClick={() => {\n                setMode(\"position\");\n              }}\n            />\n            <FabCard\n              icon=\"mdi:swap-vertical\"\n              active={_mode === \"button\"}\n              title={localize(\"button\")}\n              onClick={() => {\n                setMode(\"button\");\n              }}\n            />\n          </ButtonBar>\n        )}\n      </Column>\n    </Column>\n  );\n}\n\n/** This component will render controls for a cover, it supports tilt & position sliders, as well as a button mode\n *\n * The below demos show how different cover entities will render based on what they support, this is automatic and no need to configure anything.\n */\nexport function CoverControls(props: CoverControlsProps) {\n  return (\n    <ErrorBoundary {...fallback({ prefix: \"CoverControls\" })}>\n      <InternalCoverControls {...props} />\n    </ErrorBoundary>\n  );\n}\n","import styled from \"@emotion/styled\";\nimport { FabCard } from \"@components\";\n\nexport const Fab = styled(FabCard)`\n  background-color: var(--ha-S600);\n\n  &:not(.active) {\n    color: black;\n  }\n  opacity: 0.8;\n  transition-property: opacity, color, background-color;\n  &:disabled {\n    opacity: 0.38;\n  }\n  &:not(:disabled) {\n    &:hover,\n    &:active {\n      opacity: 1;\n      color: black;\n    }\n  }\n  z-index: 2;\n`;\n","import {\n  EntityName,\n  FilterByDomain,\n  useEntity,\n  useService,\n  isUnavailableState,\n  OFF,\n  supportsFeatureFromAttributes,\n  type MediaPlayerEntity,\n  localize,\n} from \"@hakit/core\";\nimport { ErrorBoundary } from \"react-error-boundary\";\nimport styled from \"@emotion/styled\";\nimport { MediaPlayerCard, CardBase, Row, Column, Group, VolumeControls, fallback, ColumnProps } from \"@components\";\nimport { Fab } from \"../../../../Cards/MediaPlayerCard/Fab\";\nimport { capitalize, flatten, groupBy } from \"lodash\";\nimport { useCallback, useMemo, useState, useEffect } from \"react\";\n\nconst StyledMediaPlayerCard = styled(CardBase)`\n  transform: none;\n  will-change: width, height;\n  overflow: visible;\n  svg {\n    color: currentColor;\n  }\n  &:not(.disabled) {\n    &:hover,\n    &:active {\n      background-color: var(--ha-S300);\n      svg {\n        color: currentColor;\n      }\n    }\n  }\n  padding: 1rem;\n  cursor: default;\n`;\n\nconst Title = styled.div`\n  font-size: 0.8rem;\n  color: rgba(255, 255, 255, 1);\n`;\nconst State = styled.span`\n  font-size: 0.8rem;\n  color: rgba(255, 255, 255, 0.5);\n`;\n\nconst StyledColumn = styled(Column)`\n  display: grid;\n  grid-template-columns: auto auto;\n`;\nconst GroupLine = styled.div`\n  height: 50px;\n  width: 2px;\n  background-color: var(--ha-A400);\n  position: absolute;\n  top: 30px;\n  left: 14px;\n  z-index: 1;\n`;\n\nexport interface MediaPlayerControlsProps extends ColumnProps {\n  entity: FilterByDomain<EntityName, \"media_player\">;\n  groupedEntities: MediaPlayerEntity[];\n  allEntityIds: string[];\n  onStateChange?: (state: string) => void;\n}\n\nexport const MediaPlayerControls = ({\n  groupedEntities = [],\n  allEntityIds = [],\n  onStateChange,\n  entity,\n  ...rest\n}: MediaPlayerControlsProps) => {\n  const primaryEntity = useEntity(entity);\n  const supportsGrouping = supportsFeatureFromAttributes(primaryEntity.attributes, 524288);\n  // To get proper ordering of speakers, we need to flatten the groupedEntities array while keeping the order of the groups\n  const mediaPlayersOrderedByGroup = useMemo(\n    () => flatten(Object.values(groupBy(groupedEntities, (entity) => entity.attributes?.group_members))),\n    [groupedEntities],\n  );\n  const mediaPlayerService = useService(\"media_player\");\n  const [lastPlayedMedia, setLastPlayedMedia] = useState<{ media_content_id: string; media_content_type: string }>({\n    media_content_id: \"\",\n    media_content_type: \"\",\n  });\n\n  const handleMediaPlayerActionClick = useCallback(\n    (entityId: FilterByDomain<EntityName, \"media_player\">) => {\n      const entity = groupedEntities.find((entity) => entity.entity_id === entityId);\n      if (!entity) {\n        // TODO - handle the case where it's not found?\n        return;\n      }\n      const playingSpeakers = groupedEntities.filter((entity) => entity.state === \"playing\");\n\n      // no speakers are playing -> play media\n      if (playingSpeakers.length === 0) {\n        mediaPlayerService.playMedia({\n          target: entity.attributes?.group_members ?? entity.entity_id,\n          serviceData: { media: { ...lastPlayedMedia }, enqueue: \"play\" },\n        });\n        return mediaPlayerService.mediaPlay({\n          target: entity.attributes?.group_members ?? entity.entity_id,\n        });\n      }\n\n      // the target speaker is playing and only has one member in the group -> pause media\n      if (entity.attributes?.group_members?.length === 1 && entity.state === \"playing\") {\n        setLastPlayedMedia({\n          media_content_id: entity.attributes.media_content_id ?? \"\",\n          media_content_type: entity.attributes.media_content_type ?? \"\",\n        });\n        return mediaPlayerService.mediaPause({\n          target: entity.attributes?.group_members ?? entity.entity_id,\n        });\n      }\n\n      // the target speaker is playing and has more than one member in the group -> unjoin\n      if ((entity.attributes?.group_members?.length || 0) > 1 && entity.state === \"playing\") {\n        return mediaPlayerService.unjoin({\n          target: entityId,\n        });\n      }\n\n      // the target speaker is not playing, and we have at least one speaker playing -> join\n      if (entity.state !== \"playing\" && playingSpeakers.length > 0) {\n        return mediaPlayerService.join({\n          target: playingSpeakers[0].entity_id,\n          serviceData: { group_members: [entityId] },\n        });\n      }\n    },\n    [groupedEntities, mediaPlayerService, lastPlayedMedia],\n  );\n\n  const getIcon = useCallback(\n    (entity: MediaPlayerEntity): string => {\n      const hasSomePlayingSpeakers = mediaPlayersOrderedByGroup?.some((mediaPlayer) => mediaPlayer.state === \"playing\");\n\n      if (entity.attributes.group_members?.length === 1 && entity.state === \"playing\") {\n        return \"mdi:pause\";\n      }\n\n      if (hasSomePlayingSpeakers) {\n        return \"mdi:speaker-multiple\";\n      }\n\n      if (entity.attributes.group_members?.length === 1 && entity.state !== \"playing\") {\n        return \"mdi:play\";\n      }\n\n      return \"mdi:speaker-off\";\n    },\n    [mediaPlayersOrderedByGroup],\n  );\n\n  useEffect(() => {\n    if (primaryEntity && onStateChange) {\n      onStateChange(primaryEntity.state);\n    }\n  }, [primaryEntity, onStateChange]);\n\n  return (\n    <Column fullHeight fullWidth {...rest}>\n      <Column fullWidth fullHeight className={`column`} gap=\"1rem\">\n        {primaryEntity && (\n          <MediaPlayerCard\n            layout=\"slim\"\n            groupMembers={allEntityIds.length > 1 ? (allEntityIds as FilterByDomain<EntityName, \"media_player\">[]) : undefined}\n            disableColumns\n            entity={primaryEntity.entity_id as FilterByDomain<EntityName, \"media_player\">}\n            hideGrouping={true}\n            disableScale\n            disableModal\n          />\n        )}\n        {allEntityIds.length > 1 && (\n          <Group\n            title={localize(\"related_entities\")}\n            disableColumns\n            cssStyles={`\n            &.group {\n              background-color: rgba(0,0,0,0.1);\n            }\n          `}\n          >\n            {mediaPlayersOrderedByGroup.map((entity, index) => {\n              const isPlaying = entity.state === \"playing\";\n              const isLastOfGroup = index === mediaPlayersOrderedByGroup.length - 1;\n              const friendlyName = `${entity.attributes?.friendly_name ?? entity.entity_id}`;\n              const isOff = entity.state === OFF;\n              const isUnavailable = isUnavailableState(entity.state);\n              const supportsTurnOn = supportsFeatureFromAttributes(entity.attributes, 128);\n              const supportsTurnOff = supportsFeatureFromAttributes(entity.attributes, 256);\n\n              return (\n                <StyledMediaPlayerCard\n                  key={entity.entity_id}\n                  disableRipples\n                  disableScale\n                  disableActiveState\n                  xxs={12}\n                  xs={12}\n                  sm={12}\n                  md={12}\n                  lg={12}\n                  xlg={12}\n                  className={`entities-card entities-card-media-controls`}\n                >\n                  <ErrorBoundary {...fallback({ prefix: \"EntityRow\" })}>\n                    <StyledColumn gap={\"0.5rem\"} justifyContent={\"space-between\"}>\n                      <Title className=\"title device-name\">\n                        {friendlyName}\n                        <State> - {capitalize(entity.state)}</State>\n                      </Title>\n                      <Row gap={\"0.5rem\"} justifyContent={\"end\"}>\n                        {!supportsGrouping && (\n                          <Fab\n                            className=\"media-player-power\"\n                            iconProps={{\n                              color: `var(--ha-S200-contrast)`,\n                            }}\n                            active={!isOff && !isUnavailable}\n                            disabled={!supportsTurnOn || !supportsTurnOff}\n                            size={30}\n                            icon=\"mdi:power\"\n                            rippleProps={{\n                              preventPropagation: true,\n                            }}\n                            onClick={() => {\n                              if (isOff) {\n                                mediaPlayerService.turnOn({\n                                  target: entity.entity_id,\n                                });\n                              } else {\n                                mediaPlayerService.turnOff({\n                                  target: entity.entity_id,\n                                });\n                              }\n                            }}\n                          />\n                        )}\n                        {!isOff && (\n                          <VolumeControls\n                            entity={entity.entity_id as FilterByDomain<EntityName, \"media_player\">}\n                            volumeLayout={\"buttons\"}\n                            hideMute={false}\n                            disabled={false}\n                            layout={\"slim\"}\n                          />\n                        )}\n                        {supportsGrouping && !isOff && (\n                          <div style={{ position: \"relative\" }}>\n                            <Fab\n                              rippleProps={{\n                                preventPropagation: true,\n                              }}\n                              className=\"speaker-group\"\n                              iconProps={{\n                                color: `var(--ha-S200-contrast)`,\n                              }}\n                              active={isPlaying}\n                              disabled={false}\n                              size={30}\n                              icon={getIcon(entity)}\n                              onClick={() => handleMediaPlayerActionClick(entity.entity_id as FilterByDomain<EntityName, \"media_player\">)}\n                            />\n                            {!isLastOfGroup && <GroupLine />}\n                          </div>\n                        )}\n                      </Row>\n                    </StyledColumn>\n                  </ErrorBoundary>\n                </StyledMediaPlayerCard>\n              );\n            })}\n          </Group>\n        )}\n      </Column>\n    </Column>\n  );\n};\n","import { UserAvatar, fallback } from \"@components\";\nimport styled from \"@emotion/styled\";\nimport type { EntityName, FilterByDomain } from \"@hakit/core\";\nimport { useEntity } from \"@hakit/core\";\nimport L, { DivIcon } from \"leaflet\";\nimport \"leaflet/dist/leaflet.css\";\nimport { useEffect } from \"react\";\nimport { createPortal } from \"react-dom\";\nimport { ErrorBoundary } from \"react-error-boundary\";\nimport { MapContainer, Marker, MarkerProps, TileLayer } from \"react-leaflet\";\n\nconst StyledMapContainer = styled(MapContainer)`\n  .leaflet-layer,\n  .leaflet-control-zoom-in,\n  .leaflet-control-zoom-out,\n  .leaflet-control-attribution {\n    filter: brightness(0.6) invert(1) contrast(4) hue-rotate(300deg) saturate(0.3) brightness(1) grayscale(40%);\n  }\n  .leaflet-div-icon {\n    background: none;\n    border: none;\n  }\n`;\n\ntype ReactProps = { children: React.ReactNode };\n\ntype ContainerProps = {\n  tagName: string;\n  className?: string;\n  container?: HTMLElement;\n};\n\ntype DivIconMarkerProps = ReactProps & { marker: MarkerProps } & {\n  container: ContainerProps;\n};\nexport const MapMarker = ({ children, marker, container }: DivIconMarkerProps) => {\n  const { tagName, className } = container;\n  const element = L.DomUtil.create(tagName, className);\n  const divIcon = new DivIcon({ html: element });\n  const portal = createPortal(children, element);\n  const { position, eventHandlers } = marker;\n\n  useEffect(() => {\n    return () => {\n      L.DomUtil.remove(element);\n    };\n    // eslint-disable-next-line react-hooks/exhaustive-deps\n  }, []); // Cleanup runs on unmount\n\n  return (\n    <>\n      {portal}\n      <Marker position={position} icon={divIcon} eventHandlers={eventHandlers} />\n    </>\n  );\n};\n\nexport interface PersonControlsProps {\n  entity: FilterByDomain<EntityName, \"person\">;\n  mapHeight: number;\n}\n\nfunction InternalPersonControls({ entity: _entity, mapHeight }: PersonControlsProps) {\n  const entity = useEntity(_entity);\n  const position = new L.LatLng(entity.attributes.latitude, entity.attributes.longitude);\n\n  return (\n    <StyledMapContainer center={position} zoom={14} style={{ height: `${mapHeight}px`, width: \"100%\" }}>\n      <TileLayer\n        url=\"https://{s}.tile.openstreetmap.org/{z}/{x}/{y}.png\"\n        attribution='&copy; <a href=\"https://www.openstreetmap.org/copyright\">OpenStreetMap</a> contributors'\n      />\n      <MapMarker\n        marker={{\n          position: position,\n        }}\n        container={{\n          tagName: \"div\",\n          className: \"custom-marker\",\n        }}\n      >\n        <UserAvatar\n          entity={_entity}\n          iconSize={{ width: \"30px\", height: \"30px\" }}\n          avatarSize={{ width: \"48px\", height: \"48px\" }}\n          withBorder\n        />\n      </MapMarker>\n    </StyledMapContainer>\n  );\n}\n\n/**\n * The PersonControls component renders a map with a user avatar marker of the persons location.\n * */\nexport function PersonControls(props: PersonControlsProps) {\n  return (\n    <ErrorBoundary {...fallback({ prefix: \"PersonControls\" })}>\n      <InternalPersonControls {...props} />\n    </ErrorBoundary>\n  );\n}\n","import { useMemo } from \"react\";\nimport styled from \"@emotion/styled\";\nimport type { HassEntityWithService, HvacMode } from \"@hakit/core\";\nimport type { ClimateControlsProps, AvailableQueries } from \"@components\";\nimport { useEntity, OFF, isUnavailableState, useHass, localize } from \"@hakit/core\";\nimport { fallback, Row, ButtonBar, Column } from \"@components\";\nimport { capitalize } from \"lodash\";\nimport { icons, activeColors, colors } from \"../../Shared/Entity/Climate/ClimateControls/shared\";\nimport { UNIT_F } from \"../../Shared/Entity/Climate/ClimateControls/data\";\nimport { ErrorBoundary } from \"react-error-boundary\";\nimport { FeatureEntity, type FeatureEntityProps } from \"../CardBase/FeatureEntity\";\n\nimport { ButtonCard, type ButtonCardProps } from \"../ButtonCard\";\n\nconst StyledClimateCard = styled(ButtonCard)`\n  &.slim {\n    &.has-temp-controls {\n    }\n  }\n  &.slim-vertical {\n    &.has-temp-controls {\n    }\n  }\n`;\n\nconst Gap = styled.div`\n  height: 20px;\n`;\n\nconst Description = styled.div`\n  color: var(--ha-S400-contrast);\n  font-size: 0.7rem;\n  display: flex;\n  gap: 0.5rem;\n  flex-wrap: wrap;\n  > * {\n    position: relative;\n    display: flex;\n    flex-shrink: 0;\n    &:after {\n      content: \",\";\n      position: absolute;\n      bottom: 0;\n      right: -3px;\n    }\n    &:last-of-type {\n      &:after {\n        display: none;\n      }\n    }\n  }\n`;\n\nconst Temperature = styled.span`\n  position: relative;\n  display: flex;\n  span {\n    font-size: 0.7rem;\n    align-items: flex-start;\n  }\n`;\n\ntype OmitProperties = \"onClick\" | \"children\" | \"active\" | \"as\" | \"disableActiveState\" | \"features\";\n\ntype Extendable = Omit<ClimateControlsProps, \"onClick\"> & Omit<ButtonCardProps<ClimateControlsProps[\"entity\"]>, OmitProperties>;\nexport interface ClimateCardProps extends Extendable {\n  /** the onClick handler is called when the card is pressed  */\n  onClick?: (entity: HassEntityWithService<\"climate\">) => void;\n  /** show the labels in the button bar for the hvac modes @default false */\n  showHvacModeLabels?: boolean;\n  /** show the temperature controls within the main card, does not change the popup @default false */\n  showTemperatureControls?: boolean;\n}\n\nfunction InternalClimateCard({\n  entity: _entity,\n  onClick,\n  hvacModes,\n  hvacModeLabels,\n  showHvacModeLabels = false,\n  hideCurrentTemperature,\n  showTemperatureControls = false,\n  hideToggle = true,\n  hideHvacModes,\n  disabled,\n  className,\n  modalProps,\n  service,\n  serviceData,\n  cssStyles,\n  layoutType,\n  key,\n  title,\n  targetTempStep,\n  ...rest\n}: ClimateCardProps): React.ReactNode {\n  const config = useHass((state) => state.config);\n  const globalComponentStyle = useHass((state) => state.globalComponentStyles);\n  const entity = useEntity(_entity);\n  const currentMode = entity.state in icons ? entity.state : \"unknown-mode\";\n  const isUnavailable = isUnavailableState(entity.state);\n  const on = entity.state !== \"off\" && !isUnavailable && !disabled;\n  const {\n    current_temperature,\n    hvac_action,\n    hvac_modes,\n    min_temp = 6,\n    max_temp = 40,\n    unit_of_measurement,\n    temperature = 20,\n    target_temp_step,\n  } = entity.attributes || {};\n  const isOff = entity.state === OFF;\n  const titleValue = useMemo(() => {\n    if (isUnavailable) {\n      return localize(\"unavailable\");\n    }\n    if (isOff) {\n      return localize(\"off\");\n    }\n    return hvac_action ? localize(hvac_action) : localize(\"unknown\");\n  }, [hvac_action, isUnavailable, isOff]);\n\n  const _step = useMemo(() => {\n    return targetTempStep ?? target_temp_step ?? (config?.unit_system.temperature === UNIT_F ? 1 : 0.5);\n  }, [config?.unit_system.temperature, targetTempStep, target_temp_step]);\n\n  const havacModesToUse = (hvacModes ?? []).length === 0 ? hvac_modes : (hvacModes ?? []);\n\n  return (\n    <>\n      <StyledClimateCard\n        key={key}\n        hideToggle={hideToggle}\n        disableActiveState\n        className={`climate-card ${showTemperatureControls ? \"has-temp-controls\" : \"\"} ${className ?? \"\"}`}\n        disabled={disabled || isUnavailable}\n        entity={_entity}\n        title={title ?? entity.attributes.friendly_name}\n        // @ts-expect-error - don't know the entity name, so we can't know the service type\n        service={service}\n        // @ts-expect-error - don't know the entity name, so we can't know the service data\n        serviceData={serviceData}\n        layoutType={layoutType}\n        modalProps={{\n          hvacModes: havacModesToUse,\n          hideCurrentTemperature,\n          hideHvacModes,\n          hvacModeLabels,\n          targetTempStep: _step,\n          ...modalProps,\n        }}\n        onClick={() => {\n          if (isUnavailable || disabled || typeof onClick !== \"function\") return;\n          onClick(entity);\n        }}\n        cssStyles={`\n          ${globalComponentStyle.climateCard ?? \"\"}\n          ${cssStyles ?? \"\"}\n        `}\n        hideState\n        features={havacModesToUse\n          .concat()\n          .filter((x) => !!x)\n          .map((mode) => {\n            const props = {\n              size: 35,\n              disabled: disabled || isUnavailable,\n              iconProps: {\n                color: currentMode === mode ? activeColors[mode] : undefined,\n              },\n              rippleProps: {\n                preventPropagation: true,\n              },\n              title: capitalize(mode.replace(/_/g, \" \")),\n              active: currentMode === mode,\n              icon: icons[mode],\n              onClick: () => {\n                entity.service.setHvacMode({\n                  serviceData: {\n                    hvac_mode: mode,\n                  },\n                });\n              },\n            } satisfies FeatureEntityProps;\n            if (hvacModeLabels?.[mode] && showHvacModeLabels) {\n              const customLabel = hvacModeLabels?.[mode];\n              return (\n                <FeatureEntity key={mode} {...props} title={customLabel}>\n                  {customLabel}\n                </FeatureEntity>\n              );\n            }\n            return <FeatureEntity key={mode} {...props} />;\n          })}\n        fabProps={{\n          style: {\n            color: on ? \"var(--ha-A400)\" : \"var(--ha-S500-contrast)\",\n            backgroundColor:\n              isUnavailable || disabled\n                ? colors[\"off\"][1]\n                : currentMode === \"unknown-mode\"\n                  ? \"var(--ha-S500-contrast)\"\n                  : colors[currentMode as HvacMode][1],\n          },\n        }}\n        description={\n          <Row justifyContent=\"flex-start\">\n            <Description className=\"climate-description\">\n              <span>{titleValue}</span>\n              <span className=\"fan-speed\">\n                {localize(\"speed\")}: {localize(entity.attributes.fan_mode as \"low\") || localize(\"unknown\")}\n              </span>\n              {!hideCurrentTemperature && (\n                <span className=\"current-temperature\">\n                  <Temperature>\n                    <div>\n                      {capitalize(\n                        localize(\"current_temperature\", {\n                          search: \"{name} \",\n                          replace: \"\",\n                        }),\n                      )}\n                      : {current_temperature}\n                    </div>\n                    <span>{unit_of_measurement ?? config?.unit_system.temperature}</span>\n                  </Temperature>\n                </span>\n              )}\n            </Description>\n          </Row>\n        }\n        {...rest}\n      >\n        {showTemperatureControls && (\n          <Column alignItems={layoutType === \"slim-vertical\" ? \"center\" : \"flex-start\"} fullWidth fullHeight>\n            <Gap />\n            <ButtonBar fullWidth>\n              <FeatureEntity\n                size={40}\n                disabled={disabled || isUnavailable || temperature === min_temp}\n                rippleProps={{\n                  preventPropagation: true,\n                }}\n                title={localize(\"decrease_temperature\")}\n                icon={\"mdi:minus\"}\n                onClick={() => {\n                  entity.service.setTemperature({\n                    serviceData: {\n                      temperature: temperature - _step,\n                    },\n                  });\n                }}\n              />\n              <FeatureEntity\n                size={40}\n                disabled\n                rippleProps={{\n                  preventPropagation: true,\n                }}\n                borderRadius={0}\n                noIcon\n                title={capitalize(\n                  localize(\"current_temperature\", {\n                    search: \"{name} \",\n                    replace: \"\",\n                  }),\n                )}\n                cssStyles={`\n                  button {\n                    cursor: default;\n                  }\n                `}\n              >\n                <Temperature>\n                  <div>{temperature}</div>\n                  <span>{unit_of_measurement ?? config?.unit_system.temperature}</span>\n                </Temperature>\n              </FeatureEntity>\n              <FeatureEntity\n                size={40}\n                disabled={disabled || isUnavailable || temperature === max_temp}\n                rippleProps={{\n                  preventPropagation: true,\n                }}\n                title={localize(\"increase_temperature\")}\n                icon={\"mdi:plus\"}\n                onClick={() => {\n                  entity.service.setTemperature({\n                    serviceData: {\n                      temperature: temperature + _step,\n                    },\n                  });\n                }}\n              />\n            </ButtonBar>\n          </Column>\n        )}\n      </StyledClimateCard>\n    </>\n  );\n}\n/** The ClimateCard is a card to easily interact with climate entities, whilst it's not documented below, the types are correct and you can also pass through anything related to ModalClimateControlsProps\n * The ClimateCard shares the same functionality/props as the ButtonCard so you can display in different layouts and also utilize the same props\n */\nexport function ClimateCard(props: ClimateCardProps) {\n  const defaultColumns: AvailableQueries = {\n    xxs: 12,\n    xs: 6,\n    sm: 6,\n    md: 4,\n    lg: 4,\n    xlg: 3,\n  };\n  return (\n    <ErrorBoundary {...fallback({ prefix: \"ClimateCard\" })}>\n      <InternalClimateCard {...defaultColumns} {...props} />\n    </ErrorBoundary>\n  );\n}\n","import styled from \"@emotion/styled\";\nimport { useHass, type EntityName } from \"@hakit/core\";\nimport {\n  Column,\n  fallback,\n  CardBase,\n  EntitiesCardRow,\n  type EntitiesCardRowProps,\n  type AvailableQueries,\n  type CardBaseProps,\n} from \"@components\";\nimport { ErrorBoundary } from \"react-error-boundary\";\nimport { Children, isValidElement, cloneElement, type ReactElement } from \"react\";\nconst StyledEntitiesCard = styled(CardBase as React.ComponentType<CardBaseProps<\"div\", EntityName>>)`\n  svg {\n    color: currentColor;\n  }\n  &:not(.disabled) {\n    &:hover,\n    &:active {\n      svg {\n        color: currentColor;\n      }\n    }\n  }\n`;\n\ntype OmitProperties =\n  | \"as\"\n  | \"active\"\n  | \"disabled\"\n  | \"children\"\n  | \"entity\"\n  | \"title\"\n  | \"onClick\"\n  | \"modalProps\"\n  | \"serviceData\"\n  | \"service\"\n  | \"disableRipples\"\n  | \"disableActiveState\"\n  | \"disableScale\";\nexport interface EntitiesCardProps extends Omit<CardBaseProps<\"div\", EntityName>, OmitProperties> {\n  /** the children for the ButtonBar, it accepts ButtonBarButton components */\n  children: ReactElement<typeof EntitiesCardRow> | ReactElement<typeof EntitiesCardRow>[];\n  /** include the last updated time, will apply to every row unless specified on an individual EntityItem @default false */\n  includeLastUpdated?: boolean;\n}\nfunction InternalEntitiesCard({\n  includeLastUpdated = false,\n  key,\n  className,\n  children,\n  cssStyles,\n  ...rest\n}: EntitiesCardProps): React.ReactNode {\n  const globalComponentStyle = useHass((state) => state.globalComponentStyles);\n  const childrenWithKeys = Children.map(children, (child, index) => {\n    if (isValidElement<EntitiesCardRowProps<EntityName>>(child)) {\n      return cloneElement(child, {\n        key: child.key || index,\n        includeLastUpdated: includeLastUpdated,\n      });\n    }\n    return child;\n  });\n  return (\n    <StyledEntitiesCard\n      key={key}\n      cssStyles={`\n      ${globalComponentStyle?.entitiesCard ?? \"\"}\n      ${cssStyles ?? \"\"}\n    `}\n      disableRipples\n      disableScale\n      disableActiveState\n      className={`entities-card ${className ?? \"\"}`}\n      {...rest}\n    >\n      <Column fullWidth fullHeight className={`column`}>\n        {childrenWithKeys}\n      </Column>\n    </StyledEntitiesCard>\n  );\n}\n/** The EntitiesCard component is an easy way to represent the state a of multiple entities with a simple layout, you can customize every part of every row with the EntityItem properties, the renderState and onClick both receive the entity object with the api properties. */\nexport function EntitiesCard(props: EntitiesCardProps) {\n  const defaultColumns: AvailableQueries = {\n    xxs: 12,\n    xs: 6,\n    sm: 6,\n    md: 4,\n    lg: 4,\n    xlg: 3,\n  };\n  return (\n    <ErrorBoundary {...fallback({ prefix: \"EntitiesCard\" })}>\n      <InternalEntitiesCard {...defaultColumns} {...props} />\n    </ErrorBoundary>\n  );\n}\n","import { useHass, useEntity, useIconByDomain, useIconByEntity, computeDomain, isUnavailableState, ON, localize } from \"@hakit/core\";\nimport type { EntityName, ExtractDomain, AllDomains, HassEntityWithService } from \"@hakit/core\";\nimport { Icon, type IconProps } from \"@iconify/react\";\nimport { Row, fallback, ModalByEntityDomain, type ModalPropsHelper } from \"@components\";\nimport { ErrorBoundary } from \"react-error-boundary\";\nimport { useState, ReactNode, useId, useMemo, lazy, Suspense } from \"react\";\nimport { useLongPress } from \"use-long-press\";\nimport styled from \"@emotion/styled\";\n\nconst IconWrapper = styled(Row)`\n  width: 100%;\n  max-width: 2rem;\n`;\nconst Name = styled.div`\n  flex-grow: 1;\n  font-size: 0.8rem;\n  color: var(--ha-S50-contrast);\n  font-weight: 500;\n  span {\n    width: 100%;\n    font-size: 0.7rem;\n    font-weight: 400;\n    display: block;\n    margin-top: 0.2rem;\n    color: var(--ha-S500-contrast);\n  }\n`;\nconst State = styled.div`\n  max-width: 5rem;\n  font-size: 0.8rem;\n  font-weight: 400;\n  text-align: right;\n  white-space: nowrap;\n  color: var(--ha-S300-contrast);\n`;\n\nconst EntityRowInner = styled.div`\n  width: 100%;\n  padding: 1rem;\n  transition: background-color var(--ha-transition-duration) var(--ha-easing);\n  &:hover {\n    background-color: var(--ha-S500);\n  }\n`;\n\nconst LAZY_LOAD_STATE_TYPES = {\n  climate: () => import(\"./action-types/climate\"),\n  toggle: () => import(\"./action-types/toggle\"),\n  sensor: () => import(\"./action-types/sensor\"),\n};\n\nconst DOMAIN_TO_ELEMENT_TYPE: Partial<Record<AllDomains, keyof typeof LAZY_LOAD_STATE_TYPES>> = {\n  water_heater: \"climate\",\n  climate: \"climate\",\n  // _domain_not_found: \"simple\",\n  alert: \"toggle\",\n  automation: \"toggle\",\n  // button: \"button\",\n  // cover: \"cover\",\n  // date: \"date\",\n  // datetime: \"datetime\",\n  // event: \"event\",\n  fan: \"toggle\",\n  // group: \"group\",\n  // humidifier: \"humidifier\",\n  input_boolean: \"toggle\",\n  // input_button: \"input-button\",\n  // input_datetime: \"input-datetime\",\n  // input_number: \"input-number\",\n  // input_select: \"input-select\",\n  // input_text: \"input-text\",\n  light: \"toggle\",\n  // lock: \"lock\",\n  // media_player: \"media-player\",\n  // number: \"number\",\n  remote: \"toggle\",\n  // scene: \"scene\",\n  // script: \"script\",\n  // select: \"select\",\n  sensor: \"sensor\",\n  siren: \"toggle\",\n  switch: \"toggle\",\n  // text: \"text\",\n  // time: \"time\",\n  // timer: \"timer\",\n  // update: \"update\",\n  vacuum: \"toggle\",\n  // valve: \"valve\",\n  // weather: \"weather\",\n};\n\nexport interface EntitiesCardRowProps<E extends EntityName> extends Omit<React.ComponentPropsWithoutRef<\"div\">, \"onClick\"> {\n  /** The name of the entity to render */\n  entity: E;\n  /** the icon name to use @default entity_icon */\n  icon?: string;\n  /** the props for the icon, which includes styles for the icon */\n  iconProps?: Omit<IconProps, \"icon\">;\n  /** the name of the entity @default friendly_name */\n  name?: ReactNode;\n  /** the function to call when the row is clicked @default undefined */\n  onClick?: (entity: HassEntityWithService<ExtractDomain<E>>) => void;\n  /** the function to render the state @default undefined */\n  renderState?: (entity: HassEntityWithService<ExtractDomain<E>>) => React.ReactElement<HTMLElement>;\n  /** include last updated time @default false */\n  includeLastUpdated?: boolean;\n  /** props to pass to the modal for each row */\n  modalProps?: Partial<ModalPropsHelper<ExtractDomain<E>>>;\n}\n\nfunction InternalEntitiesCardRow<E extends EntityName>({\n  entity: _entity,\n  icon: _icon,\n  iconProps,\n  name: _name,\n  renderState,\n  onClick,\n  modalProps,\n  key,\n  includeLastUpdated = false,\n  ...rest\n}: EntitiesCardRowProps<E>) {\n  const _id = useId();\n  const [openModal, setOpenModal] = useState(false);\n  const formatter = useHass((store) => store.formatter);\n  const entity = useEntity(_entity);\n  const domain = computeDomain(_entity);\n  const domainIcon = useIconByDomain(domain === null ? \"unknown\" : domain);\n  const entityIcon = useIconByEntity(_entity || \"unknown\");\n  const isUnavailable = isUnavailableState(entity?.state);\n  const title = useMemo(() => _name ?? entity.attributes.friendly_name ?? entity.attributes.entity_id, [_name, entity]);\n  const on = entity?.state === ON;\n  const iconColor = on ? entity.custom.hexColor : \"var(--ha-S500-contrast)\";\n  const bind = useLongPress(\n    () => {\n      if (typeof _entity === \"string\" && !openModal) {\n        setOpenModal(true);\n      }\n    },\n    {\n      threshold: 300,\n      cancelOnMovement: true,\n      cancelOutsideElement: true,\n      filterEvents(e) {\n        return !(\"button\" in e && e.button === 2);\n      },\n    },\n  );\n\n  const lazyKey = DOMAIN_TO_ELEMENT_TYPE[domain];\n\n  const LazyComponent = useMemo(() => {\n    if (!lazyKey || !(lazyKey in LAZY_LOAD_STATE_TYPES)) return null;\n    return lazy(LAZY_LOAD_STATE_TYPES[lazyKey]);\n  }, [lazyKey]);\n\n  return (\n    <>\n      <EntityRowInner key={key} className={`entities-card-row`} {...bind()} {...rest}>\n        <Row className={`row`} wrap=\"nowrap\" gap=\"1rem\" fullWidth onClick={() => onClick && onClick(entity)}>\n          <IconWrapper\n            className={`icon-wrapper`}\n            style={{\n              opacity: isUnavailable ? \"0.3\" : \"1\",\n              color: iconColor,\n              filter: (on && entity?.custom.brightness) || \"brightness(100%)\",\n            }}\n          >\n            {_icon ? <Icon className={`icon`} icon={_icon} {...(iconProps ?? {})} /> : (entityIcon ?? domainIcon)}\n          </IconWrapper>\n          <Name className={`name`}>\n            {title}\n            {includeLastUpdated && <span>{entity.custom.relativeTime}</span>}\n          </Name>\n          <State className={`state`}>\n            {typeof renderState === \"function\" ? (\n              renderState(entity)\n            ) : isUnavailable ? (\n              localize(\"unavailable\")\n            ) : LazyComponent ? (\n              <Suspense fallback={<div>{localize(\"loading\")}...</div>}>\n                {<LazyComponent entity={entity as HassEntityWithService<AllDomains>} />}\n              </Suspense>\n            ) : (\n              <>{formatter.stateValue(entity)}</>\n            )}\n          </State>\n        </Row>\n      </EntityRowInner>\n      {typeof _entity === \"string\" && (\n        <ModalByEntityDomain\n          entity={_entity as EntityName}\n          title={title ?? localize(\"unknown\")}\n          onClose={() => {\n            setOpenModal(false);\n          }}\n          open={openModal}\n          id={_id}\n          {...modalProps}\n        />\n      )}\n    </>\n  );\n}\n\n/** The EntitiesCardRow component is a child component of the EntitiesCard component. */\nexport function EntitiesCardRow<E extends EntityName>(props: EntitiesCardRowProps<E>) {\n  return (\n    <ErrorBoundary {...fallback({ prefix: \"EntitiesCardRow\" })}>\n      <InternalEntitiesCardRow {...props} />\n    </ErrorBoundary>\n  );\n}\n","import { EntityName, FilterByDomain, supportsFeatureFromAttributes, useEntity, useService } from \"@hakit/core\";\nimport { useCallback, useRef, useEffect, useState } from \"react\";\nimport { mq, Row, RangeSlider } from \"@components\";\nimport styled from \"@emotion/styled\";\nimport { Fab } from \"../Fab\";\nimport { Layout, VolumeLayout, DEFAULT_FAB_SIZE } from \"../constants\";\nconst VolumeSlider = styled.label<{\n  layout: Layout;\n}>`\n  display: inline-block;\n  width: 100%;\n  color: rgba(0, 0, 0, 0.87);\n  font-size: 1rem;\n  line-height: 1.5;\n  ${mq(\n    [\"xxs\"],\n    `\n    width: 40%;\n  `,\n  )}\n\n  ${mq(\n    [\"xs\", \"sm\"],\n    `\n    width: 60%;\n  `,\n  )}\n`;\n\nconst StyledRangeSlider = styled(RangeSlider)`\n  width: 100%;\n`;\n\nexport interface VolumeControlsProps {\n  entity: FilterByDomain<EntityName, \"media_player\">;\n  volumeLayout: VolumeLayout;\n  hideMute: boolean;\n  disabled: boolean;\n  allEntityIds?: string[];\n  layout: Layout;\n}\n\nexport function VolumeControls({ entity: _entity, volumeLayout, hideMute, disabled, allEntityIds, layout }: VolumeControlsProps) {\n  const entity = useEntity(_entity);\n  const { volume_level, is_volume_muted } = entity.attributes;\n  const [volume, _setVolume] = useState(volume_level);\n  const mp = useService(\"mediaPlayer\");\n  const timerRef = useRef<NodeJS.Timeout | null>(null);\n  const supportsVolumeSet = supportsFeatureFromAttributes(entity.attributes, 4);\n  const supportsVolumeMute = supportsFeatureFromAttributes(entity.attributes, 8);\n  const setVolume = useCallback(\n    (volume: number) => {\n      _setVolume(volume);\n      if (timerRef.current) {\n        clearTimeout(timerRef.current);\n      }\n      timerRef.current = setTimeout(() => {\n        mp.volumeSet({\n          target: allEntityIds ?? _entity,\n          serviceData: {\n            volume_level: volume,\n          },\n        });\n      }, 500);\n    },\n    [mp, allEntityIds, _setVolume, _entity],\n  );\n\n  useEffect(() => {\n    _setVolume(volume_level);\n  }, [volume_level]);\n\n  return (\n    <Row gap=\"0.5rem\" wrap=\"nowrap\">\n      {!hideMute && supportsVolumeMute && (\n        <Fab\n          iconProps={{\n            color: `var(--ha-S200-contrast)`,\n          }}\n          className={`volume-mute ${is_volume_muted ? \"muted\" : \"not-muted\"}`}\n          disabled={disabled}\n          size={DEFAULT_FAB_SIZE}\n          rippleProps={{\n            preventPropagation: true,\n          }}\n          icon={is_volume_muted ? \"mdi:volume-off\" : \"mdi:volume-high\"}\n          onClick={() => {\n            mp.volumeMute({\n              target: allEntityIds ?? _entity,\n              serviceData: {\n                is_volume_muted: !is_volume_muted,\n              },\n            });\n          }}\n        />\n      )}\n      {volumeLayout === \"buttons\" && supportsVolumeSet && (\n        <>\n          <Fab\n            rippleProps={{\n              preventPropagation: true,\n            }}\n            iconProps={{\n              color: `var(--ha-S200-contrast)`,\n            }}\n            className=\"volume-down\"\n            disabled={disabled}\n            size={DEFAULT_FAB_SIZE}\n            icon=\"mdi:volume-minus\"\n            title={`${Number(volume_level) * 100}%`}\n            onClick={() =>\n              mp.volumeDown({\n                target: allEntityIds ?? _entity,\n              })\n            }\n          />\n          <Fab\n            rippleProps={{\n              preventPropagation: true,\n            }}\n            iconProps={{\n              color: `var(--ha-S200-contrast)`,\n            }}\n            className=\"volume-up\"\n            disabled={disabled}\n            size={DEFAULT_FAB_SIZE}\n            icon=\"mdi:volume-plus\"\n            title={`${Number(volume_level) * 100}%`}\n            onClick={() =>\n              mp.volumeUp({\n                target: allEntityIds ?? _entity,\n              })\n            }\n          />\n        </>\n      )}\n      {volumeLayout === \"slider\" && supportsVolumeSet && (\n        <VolumeSlider\n          className=\"volume-slider\"\n          layout={layout}\n          onPointerDownCapture={(e) => {\n            e.stopPropagation();\n          }}\n        >\n          <StyledRangeSlider\n            type=\"range\"\n            min={0}\n            max={1}\n            disabled={disabled}\n            step={0.02}\n            value={is_volume_muted ? 0 : volume}\n            formatTooltipValue={(value) => `${Math.round(value * 100)}%`}\n            tooltipSize={2.2}\n            onChangeComplete={(value, event) => {\n              event.preventDefault();\n              setVolume(value);\n            }}\n          />\n        </VolumeSlider>\n      )}\n    </Row>\n  );\n}\n","import { EntityName, FilterByDomain, OFF, supportsFeatureFromAttributes, useEntity, useService } from \"@hakit/core\";\nimport { Fab } from \"../Fab\";\n\nexport interface PlaybackControlsProps {\n  entity: FilterByDomain<EntityName, \"media_player\">;\n  disabled: boolean;\n  allEntityIds: string[];\n  size?: number;\n  feature?: boolean;\n}\nexport function PlaybackControls({ entity: _entity, size = 20, feature, disabled, allEntityIds }: PlaybackControlsProps) {\n  const entity = useEntity(_entity);\n  const mp = useService(\"mediaPlayer\");\n  const playing = entity.state === \"playing\";\n  const isOff = entity.state === OFF;\n  const supportsPreviousTrack = supportsFeatureFromAttributes(entity.attributes, 16);\n  const supportsNextTrack = supportsFeatureFromAttributes(entity.attributes, 32);\n  const supportsPlay = supportsFeatureFromAttributes(entity.attributes, 16384);\n  return (\n    <>\n      <Fab\n        className=\"skip-previous\"\n        disabled={disabled || isOff || !supportsPreviousTrack}\n        size={size}\n        iconProps={{\n          color: `var(--ha-S200-contrast)`,\n        }}\n        icon=\"mdi:skip-previous\"\n        rippleProps={{\n          preventPropagation: true,\n        }}\n        onClick={() =>\n          mp.mediaPreviousTrack({\n            target: allEntityIds,\n          })\n        }\n      />\n      <Fab\n        className=\"play-pause\"\n        iconProps={{\n          color: `var(--ha-S200-contrast)`,\n        }}\n        disabled={disabled || isOff || !supportsPlay}\n        size={size * (feature ? 2 : 1)}\n        rippleProps={{\n          preventPropagation: true,\n        }}\n        icon={playing ? \"mdi:pause\" : \"mdi:play\"}\n        onClick={() => {\n          if (playing) {\n            mp.mediaPause({\n              target: allEntityIds,\n            });\n          } else {\n            mp.mediaPlay({\n              target: allEntityIds,\n            });\n          }\n        }}\n      />\n      <Fab\n        rippleProps={{\n          preventPropagation: true,\n        }}\n        className=\"skip-next\"\n        iconProps={{\n          color: `var(--ha-S200-contrast)`,\n        }}\n        disabled={disabled || isOff || !supportsNextTrack}\n        size={size}\n        icon=\"mdi:skip-next\"\n        onClick={() =>\n          mp.mediaNextTrack({\n            target: allEntityIds,\n          })\n        }\n      />\n    </>\n  );\n}\n","import { Row, RowProps } from \"@components\";\nimport { EntityName, FilterByDomain, isUnavailableState, OFF, supportsFeatureFromAttributes, useEntity, useService } from \"@hakit/core\";\nimport { Fab } from \"./Fab\";\nimport { DEFAULT_FAB_SIZE } from \"./constants\";\nimport styled from \"@emotion/styled\";\n\nconst SmallText = styled.span`\n  font-size: 0.8rem;\n  color: rgba(255, 255, 255, 1);\n`;\n\ninterface AlternateControlsProps extends RowProps {\n  entity: FilterByDomain<EntityName, \"media_player\">;\n  disabled: boolean;\n  allEntityIds: string[];\n  onSpeakerGroupClick: () => void;\n  hideGrouping?: boolean;\n}\n\nexport function AlternateControls({\n  entity: _entity,\n  disabled,\n  allEntityIds,\n  onSpeakerGroupClick,\n  hideGrouping = false,\n}: AlternateControlsProps) {\n  const entity = useEntity(_entity);\n  const mp = useService(\"mediaPlayer\");\n  const groups = entity.attributes.group_members ?? [];\n  const isOff = entity.state === OFF;\n  const isUnavailable = isUnavailableState(entity.state);\n  const supportsTurnOn = supportsFeatureFromAttributes(entity.attributes, 128);\n  const supportsTurnOff = supportsFeatureFromAttributes(entity.attributes, 256);\n\n  return (\n    <Row gap=\"0.5rem\" wrap=\"nowrap\" className=\"row\">\n      {!hideGrouping && (allEntityIds.length > 1 || groups.length > 0) && (\n        <Fab\n          className=\"speaker-group\"\n          iconProps={{\n            color: `var(--ha-S200-contrast)`,\n          }}\n          active={groups.length > 0}\n          disabled={disabled}\n          rippleProps={{\n            preventPropagation: true,\n          }}\n          size={DEFAULT_FAB_SIZE}\n          icon={groups.length === 0 ? \"mdi:speaker-off\" : \"mdi:speaker-multiple\"}\n          onClick={() => {\n            onSpeakerGroupClick();\n          }}\n        />\n      )}\n      {(isUnavailable || isOff) && <SmallText>{entity.state}</SmallText>}\n      <Fab\n        className=\"media-player-power\"\n        iconProps={{\n          color: `var(--ha-S200-contrast)`,\n        }}\n        active={!isOff && !isUnavailable}\n        disabled={disabled || !supportsTurnOn || !supportsTurnOff}\n        size={DEFAULT_FAB_SIZE}\n        icon=\"mdi:power\"\n        rippleProps={{\n          preventPropagation: true,\n        }}\n        onClick={() => {\n          if (isOff) {\n            mp.turnOn({\n              target: allEntityIds,\n            });\n          } else {\n            mp.turnOff({\n              target: allEntityIds,\n            });\n          }\n        }}\n      />\n    </Row>\n  );\n}\n","import { useEffect, useRef, useCallback, useMemo, useState } from \"react\";\nimport { useService, useHass, isUnavailableState, useEntity, OFF, supportsFeatureFromAttributes } from \"@hakit/core\";\nimport { snakeCase, clamp } from \"lodash\";\nimport { useGesture } from \"@use-gesture/react\";\nimport type { EntityName, FilterByDomain, MediaPlayerEntity } from \"@hakit/core\";\nimport { fallback, Row, Column, CardBase } from \"@components\";\nimport type { CardBaseProps, AvailableQueries } from \"@components\";\nimport { ErrorBoundary } from \"react-error-boundary\";\nimport styled from \"@emotion/styled\";\nimport { Marquee } from \"./Marquee\";\nimport type { MarqueeProps } from \"./Marquee\";\nimport { useThrottledCallback } from \"use-debounce\";\nimport { VolumeControls } from \"./VolumeControls\";\nimport { Thumbnail } from \"./Thumbnail\";\nimport { Clock } from \"./Clock\";\nimport { PlaybackControls } from \"./PlaybackControls\";\nimport { ProgressBar } from \"./ProgressBar\";\nimport { AlternateControls } from \"./AlternateControls\";\nimport { Layout, VolumeLayout, DEFAULT_FAB_SIZE } from \"./constants\";\n\ntype BackgroundImageProps = {\n  backgroundImage: string;\n};\nconst BackgroundImage = styled.div<BackgroundImageProps>`\n  width: 100%;\n  height: 100%;\n  ${(props) => props.backgroundImage && `background-image: url(${props.backgroundImage});`}\n  background-size: cover;\n  background-position: center;\n  position: absolute;\n  background-repeat: no-repeat;\n  inset: 0;\n  z-index: -1;\n  &:after {\n    background: rgba(0, 0, 0, 0.7);\n    content: \"\";\n    position: absolute;\n    inset: 0;\n    z-index: 0;\n  }\n`;\nconst MediaPlayerWrapper = styled(CardBase as React.ComponentType<CardBaseProps<\"button\", MediaPlayerString>>)<MediaPlayerCardProps>`\n  padding: 0;\n  background-color: var(--ha-S300);\n  box-shadow: 0px 2px 4px rgba(0, 0, 0, 0.1);\n  transition: var(--ha-transition-duration) var(--ha-easing);\n  transition-property: background-image, background-color, box-shadow, transform;\n  position: relative;\n  overflow: hidden;\n  border-radius: 1rem;\n  width: 100%;\n  flex-shrink: 1;\n\n  ${(props) =>\n    props.layout === \"card\" &&\n    `\n    aspect-ratio: 1/1;\n  `}\n  &:disabled {\n    cursor: not-allowed;\n    opacity: 0.8;\n  }\n\n  &:active {\n    box-shadow: 0px 4px 4px rgba(0, 0, 0, 0.1);\n  }\n  &:not(:disabled):hover {\n    background-color: var(--ha-S400);\n    box-shadow: 0px 4px 4px rgba(0, 0, 0, 0.1);\n  }\n\n  .content {\n    position: relative;\n    z-index: 1;\n  }\n`;\n\nconst Title = styled.div`\n  font-size: 0.8rem;\n  color: rgba(255, 255, 255, 1);\n`;\n\nconst Base = styled(Column)`\n  padding: 0.5rem 0.5rem 1rem;\n  width: 100%;\n  background-color: rgba(0, 0, 0, 0.5);\n`;\nconst Empty = styled.span``;\n\nconst StyledMarquee = styled(Marquee)`\n  font-size: 0.8rem;\n  color: rgba(255, 255, 255, 0.87);\n`;\n\ntype OmitProperties =\n  | \"title\"\n  | \"as\"\n  | \"layout\"\n  | \"entity\"\n  | \"disabled\"\n  | \"active\"\n  | \"ref\"\n  | \"disableActiveState\"\n  | \"disableRipples\"\n  | \"rippleProps\";\n\ntype MediaPlayerString = FilterByDomain<EntityName, \"media_player\">;\nexport interface MediaPlayerCardProps extends Omit<CardBaseProps<\"button\", MediaPlayerString>, OmitProperties> {\n  /** the entity_id of the media_player to control */\n  entity: FilterByDomain<EntityName, \"media_player\">;\n  /** an optional override for the title of the entity */\n  title?: React.ReactNode;\n  /**\n   * if the entity supports grouping, you can provide the groupMembers as a list to join them together\n   * specify all the group members you want to group together, including the entity_id of the entity itself\n   */\n  groupMembers?: FilterByDomain<EntityName, \"media_player\">[];\n  /** the layout of the card @default 'card' */\n  layout?: Layout;\n  /** properties to pass to the track title marquee element  */\n  marqueeProps?: MarqueeProps;\n  /** the layout of the volume elements @default 'slider' */\n  volumeLayout?: VolumeLayout;\n  /** hide the mute button @default false */\n  hideMute?: boolean;\n  /** hide the app name eg YouTube @default false */\n  hideAppName?: boolean;\n  /** hide the entity friendly name @default false */\n  hideEntityName?: boolean;\n  /** disable the card manually if the internal disable functionality needs to be updated @default false */\n  disabled?: boolean;\n  /** hide the thumbnail element @default false */\n  hideThumbnail?: boolean;\n  /** hide the grouping button @default false */\n  hideGrouping?: boolean;\n  /** the size of the thumbnail to show @default 3rem */\n  thumbnailSize?: string;\n  /** show the artwork as the background of the card @default true */\n  showArtworkBackground?: boolean;\n}\n\nfunction InternalMediaPlayerCard({\n  entity: _entity,\n  groupMembers = [],\n  volumeLayout = \"slider\",\n  thumbnailSize = \"3rem\",\n  hideThumbnail = false,\n  showArtworkBackground = true,\n  layout = \"card\",\n  hideMute = false,\n  hideAppName = false,\n  hideEntityName = false,\n  hideGrouping = false,\n  disabled: _disabled = false,\n  service,\n  serviceData,\n  marqueeProps,\n  className,\n  cssStyles,\n  key,\n  modalProps,\n  ...rest\n}: MediaPlayerCardProps) {\n  const entity = useEntity(_entity);\n  const mp = useService(\"mediaPlayer\");\n  const { joinHassUrl } = useHass.getState().helpers;\n  const globalComponentStyle = useHass((state) => state.globalComponentStyles);\n  const interval = useRef<NodeJS.Timeout | null>(null);\n  const progressRef = useRef<HTMLDivElement>(null);\n  const playerRef = useRef<HTMLElement>(null);\n  const clockRef = useRef<HTMLDivElement>(null);\n  const entitiesById = useHass((store) => store.entities);\n  const groupedEntities = groupMembers\n    .map((entity) => entitiesById[entity] ?? null)\n    .filter((entity): entity is MediaPlayerEntity => entity !== null && !isUnavailableState(entity.state));\n  const allEntityIds = useMemo(() => [_entity, ...groupedEntities.map((x) => x.entity_id)], [_entity, groupedEntities]);\n  const { state } = entity;\n  const { media_artist, media_title, media_playlist, app_name, media_duration, media_position, media_position_updated_at } =\n    entity.attributes;\n  // use the group members for device names if available, else use the entity name\n  const deviceNames = (entity?.attributes?.group_members || [entity.entity_id]).reduce((friendlyNames, entityId) => {\n    const entity = entitiesById[entityId];\n    if (!entity) {\n      return friendlyNames;\n    }\n    return [...friendlyNames, entity.attributes?.friendly_name || entity.entity_id];\n  }, [] as string[]);\n  const title = `${media_artist ? media_artist + \" - \" : \"\"}${media_title ?? media_playlist ?? \"\"}`;\n  const appName = app_name;\n  const artworkUrl = useMemo(() => {\n    const url = entity.attributes.entity_picture ? entity.attributes.entity_picture : null;\n    return url && url.startsWith(\"/\") ? joinHassUrl(url) : url;\n  }, [entity.attributes.entity_picture, joinHassUrl]);\n  const isUnavailable = isUnavailableState(state);\n  const isIdle = state === \"idle\";\n  const isStandby = state === \"standby\";\n  const isOff = state === OFF;\n  const playing = state === \"playing\";\n  const buffering = state === \"buffering\";\n  const disabled = isUnavailable || _disabled;\n  const seekDisabled = isIdle || isOff || isStandby || buffering || disabled;\n  const [isGroupingModalOpen, setIsGroupingModalOpen] = useState(false);\n\n  const updateClock = useCallback(\n    (x: number) => {\n      if (!progressRef.current || !clockRef.current || seekDisabled || !playerRef.current || !media_duration) return;\n\n      // Get the bounding client rectangle\n      const rect = progressRef.current.getBoundingClientRect();\n      // Calculate the click position relative to the element\n      const offsetX = x - rect.left;\n      // Translate the click position into a percentage between 0-100\n      const percentage = (offsetX / rect.width) * 100;\n      // Calculate the current time in seconds\n      const currentTimeInSeconds: number = (media_duration * percentage) / 100;\n      // Convert the current time to minutes and remaining seconds\n      const minutes: number = Math.max(0, Math.floor(currentTimeInSeconds / 60));\n      const seconds: number = Math.max(0, Math.floor(currentTimeInSeconds % 60));\n      // Convert minutes and seconds to string and ensure they have at least two digits\n      const minutesStr: string = String(minutes).padStart(2, \"0\");\n      const secondsStr: string = String(seconds).padStart(2, \"0\");\n      // Update the clock\n      clockRef.current.style.left = `${clamp(percentage, 5, 95)}%`;\n      playerRef.current.style.setProperty(`--progress-${snakeCase(_entity)}-clock`, `'${minutesStr}:${secondsStr}'`);\n    },\n    [_entity, media_duration, seekDisabled],\n  );\n\n  const calculatePercentageViewed = useCallback(\n    (media_duration?: number, media_position?: number) => {\n      if (!media_duration || !media_position) return 0;\n      const progress = (media_position / media_duration) * 100;\n      if (playerRef.current) {\n        playerRef.current.style.setProperty(`--progress-${snakeCase(_entity)}-width`, `${clamp(progress, 0, 100)}%`);\n      }\n    },\n    [_entity],\n  );\n\n  useEffect(() => {\n    if (playing && interval.current === null && media_position_updated_at !== undefined && media_position !== undefined) {\n      interval.current = setInterval(() => {\n        const now = new Date();\n        const lastUpdated = new Date(media_position_updated_at);\n        const timeDifferenceInSeconds = (now.getTime() - lastUpdated.getTime()) / 1000.0;\n\n        const newMediaPosition = media_position + timeDifferenceInSeconds;\n        calculatePercentageViewed(media_duration, newMediaPosition);\n      }, 1000);\n    } else if (!playing && interval.current !== null) {\n      clearInterval(interval.current);\n      interval.current = null;\n    }\n    return () => {\n      if (interval.current !== null) {\n        clearInterval(interval.current);\n        interval.current = null;\n      }\n    };\n  }, [playing, media_position, media_position_updated_at, media_duration, calculatePercentageViewed]);\n\n  const seekTrack = useCallback(\n    (x: number): void => {\n      if (!progressRef.current) return;\n      // Get the bounding client rectangle\n      const rect = progressRef.current.getBoundingClientRect();\n      // Calculate the click position relative to the element\n      const offsetX = x - rect.left;\n      // Translate the click position into a percentage between 0-100\n      const percentage = offsetX / rect.width;\n      mp.mediaSeek({\n        target: allEntityIds,\n        serviceData: {\n          seek_position: percentage * (media_duration ?? 0),\n        },\n      });\n    },\n    [mp, allEntityIds, media_duration],\n  );\n  // Calculate percentage viewed whenever mediaPosition or mediaDuration changes\n  useEffect(() => {\n    calculatePercentageViewed(media_duration, media_position);\n  }, [media_position, calculatePercentageViewed, media_duration]);\n\n  const debounceUpdateClock = useThrottledCallback(\n    (value: number) => {\n      updateClock(value);\n    },\n    20,\n    {\n      trailing: true,\n      leading: true,\n    },\n  );\n\n  const bindProgress = useGesture({\n    onMove: (state) => {\n      if (seekDisabled) return;\n      debounceUpdateClock(state.event.clientX);\n    },\n    onClick: (state) => {\n      if (seekDisabled) return;\n      seekTrack(state.event.clientX);\n    },\n  });\n\n  const supportsGrouping = supportsFeatureFromAttributes(entity.attributes, 524288);\n\n  if (groupMembers.length > 0 && !supportsGrouping && !entity.attributes.group_members) {\n    throw new Error(`\"${_entity}\" does not support grouping, but you have provided groupMembers.`);\n  }\n  return (\n    <>\n      <MediaPlayerWrapper\n        key={key}\n        disabled={disabled}\n        modalProps={{\n          open: isGroupingModalOpen,\n          groupedEntities,\n          allEntityIds,\n          onClose: () => setIsGroupingModalOpen(false),\n          ...modalProps,\n        }}\n        entity={_entity}\n        // just a dodgey hack to let typescript play nicely here\n        // as we don't know the service/serviceData at this level\n        service={service as undefined}\n        serviceData={serviceData as undefined}\n        disableActiveState\n        disableRipples\n        className={`media-player-card ${className ?? \"\"}`}\n        refCallback={(ref) => {\n          if (ref) {\n            playerRef.current = ref.current;\n          }\n        }}\n        layout={layout}\n        cssStyles={`\n          ${globalComponentStyle?.mediaPlayerCard ?? \"\"}\n          ${cssStyles ?? \"\"}\n        `}\n        {...rest}\n      >\n        {showArtworkBackground && artworkUrl !== null && <BackgroundImage className=\"artwork\" backgroundImage={artworkUrl} />}\n        <Column fullHeight fullWidth className=\"column content\" justifyContent=\"space-between\">\n          <Empty className=\"empty\" />\n          {layout === \"card\" && (\n            <Row gap=\"1rem\" fullWidth className=\"row\">\n              <PlaybackControls entity={_entity} disabled={disabled} allEntityIds={allEntityIds} feature size={40} />\n            </Row>\n          )}\n\n          <Base\n            className=\"base\"\n            fullWidth\n            gap=\"0.5rem\"\n            style={{\n              paddingBottom: isOff ? (layout === \"slim\" ? \"1rem\" : \"0.5rem\") : \"1rem\",\n            }}\n          >\n            <Row className=\"row\" gap=\"0.5rem\" wrap=\"nowrap\" fullWidth>\n              {hideThumbnail === false && artworkUrl !== null && (\n                <Thumbnail className=\"thumbnail\" backgroundImage={artworkUrl} size={thumbnailSize} />\n              )}\n              <Column\n                className=\"column\"\n                gap=\"0.5rem\"\n                alignItems=\"flex-start\"\n                style={{\n                  width: hideThumbnail === false && artworkUrl !== null ? `calc(100% - (${thumbnailSize} + 0.5rem))` : \"100%\",\n                }}\n              >\n                <Row className=\"row\" justifyContent={deviceNames.length > 0 && !hideEntityName ? \"space-between\" : \"flex-end\"} fullWidth>\n                  {deviceNames.length > 0 && !hideEntityName && (\n                    <Title className=\"title device-name\">\n                      {hideEntityName ? \"\" : deviceNames.join(\", \")}\n                      {buffering ? (hideEntityName ? \"\" : \" - \") + \"buffering\" : \"\"}\n                    </Title>\n                  )}\n                  {(isOff || layout === \"slim\") && (\n                    <AlternateControls\n                      allEntityIds={allEntityIds}\n                      entity={_entity}\n                      disabled={disabled}\n                      onSpeakerGroupClick={() => setIsGroupingModalOpen(true)}\n                      hideGrouping={hideGrouping}\n                    />\n                  )}\n                </Row>\n                {title && !isOff && (\n                  <StyledMarquee speed={30} pauseOnHover play={playing} autoFill {...marqueeProps} className=\"title marquee\">\n                    {title}\n                    {appName && !hideAppName ? ` - ${appName}` : \"\"}\n                  </StyledMarquee>\n                )}\n              </Column>\n            </Row>\n\n            {!isUnavailable ? (\n              <Row className=\"row\" gap=\"1rem\" justifyContent=\"space-between\" wrap=\"nowrap\" fullWidth>\n                {!isOff && (\n                  <VolumeControls\n                    entity={_entity}\n                    disabled={disabled}\n                    allEntityIds={allEntityIds}\n                    volumeLayout={volumeLayout}\n                    layout={layout}\n                    hideMute={hideMute}\n                  />\n                )}\n                {layout === \"slim\" && (\n                  <Row gap=\"0.5rem\" wrap=\"nowrap\">\n                    <PlaybackControls\n                      entity={_entity}\n                      disabled={disabled}\n                      allEntityIds={allEntityIds}\n                      feature={false}\n                      size={DEFAULT_FAB_SIZE}\n                    />\n                  </Row>\n                )}\n                {!isOff && layout === \"card\" && (\n                  <AlternateControls\n                    allEntityIds={allEntityIds}\n                    entity={_entity}\n                    disabled={disabled}\n                    onSpeakerGroupClick={() => setIsGroupingModalOpen(true)}\n                    hideGrouping={hideGrouping}\n                  />\n                )}\n              </Row>\n            ) : null}\n          </Base>\n        </Column>\n        <ProgressBar\n          className={`${seekDisabled ? \"disabled\" : \"\"} progress-bar`}\n          disabled={seekDisabled}\n          entity={snakeCase(_entity)}\n          ref={progressRef}\n          onPointerDownCapture={(e) => {\n            e.stopPropagation();\n          }}\n          {...bindProgress()}\n        >\n          <span></span>\n        </ProgressBar>\n        <Clock entity={snakeCase(_entity)} className=\"clock\" ref={clockRef} />\n      </MediaPlayerWrapper>\n    </>\n  );\n}\n\n/** A MediaPlayerCard to control media similar to the mini-media-player from Hacs.\n * - groups - if the player supports grouping, the popup for the media player will show group controls for related entities\n * - group_members - if the group_members attribute is present on the primary entity, but the entity doesn't support grouping, you will only see volume controls in the popup for related entities\n * - if you provide the groupMembers prop, but the entity doesn't support grouping at all, an error will be thrown\n * It supports skip, previous, volume, mute, power, seeking, play, pause, grouping, artwork */\nexport function MediaPlayerCard(props: MediaPlayerCardProps) {\n  const defaultColumns: AvailableQueries = {\n    xxs: 12,\n    xs: 6,\n    sm: 6,\n    md: 4,\n    lg: 4,\n    xlg: 3,\n  };\n\n  return (\n    <ErrorBoundary {...fallback({ prefix: \"MediaPlayerCard\" })}>\n      <InternalMediaPlayerCard {...defaultColumns} {...props} />\n    </ErrorBoundary>\n  );\n}\n","const isIterable = (obj) => Symbol.iterator in obj;\nconst hasIterableEntries = (value) => (\n  // HACK: avoid checking entries type\n  \"entries\" in value\n);\nconst compareEntries = (valueA, valueB) => {\n  const mapA = valueA instanceof Map ? valueA : new Map(valueA.entries());\n  const mapB = valueB instanceof Map ? valueB : new Map(valueB.entries());\n  if (mapA.size !== mapB.size) {\n    return false;\n  }\n  for (const [key, value] of mapA) {\n    if (!mapB.has(key) || !Object.is(value, mapB.get(key))) {\n      return false;\n    }\n  }\n  return true;\n};\nconst compareIterables = (valueA, valueB) => {\n  const iteratorA = valueA[Symbol.iterator]();\n  const iteratorB = valueB[Symbol.iterator]();\n  let nextA = iteratorA.next();\n  let nextB = iteratorB.next();\n  while (!nextA.done && !nextB.done) {\n    if (!Object.is(nextA.value, nextB.value)) {\n      return false;\n    }\n    nextA = iteratorA.next();\n    nextB = iteratorB.next();\n  }\n  return !!nextA.done && !!nextB.done;\n};\nfunction shallow(valueA, valueB) {\n  if (Object.is(valueA, valueB)) {\n    return true;\n  }\n  if (typeof valueA !== \"object\" || valueA === null || typeof valueB !== \"object\" || valueB === null) {\n    return false;\n  }\n  if (Object.getPrototypeOf(valueA) !== Object.getPrototypeOf(valueB)) {\n    return false;\n  }\n  if (isIterable(valueA) && isIterable(valueB)) {\n    if (hasIterableEntries(valueA) && hasIterableEntries(valueB)) {\n      return compareEntries(valueA, valueB);\n    }\n    return compareIterables(valueA, valueB);\n  }\n  return compareEntries(\n    { entries: () => Object.entries(valueA) },\n    { entries: () => Object.entries(valueB) }\n  );\n}\n\nexport { shallow };\n","import React from 'react';\nimport { shallow } from 'zustand/vanilla/shallow';\n\nfunction useShallow(selector) {\n  const prev = React.useRef(void 0);\n  return (state) => {\n    const next = selector(state);\n    return shallow(prev.current, next) ? prev.current : prev.current = next;\n  };\n}\n\nexport { useShallow };\n","import styled from \"@emotion/styled\";\nimport type { CalendarOptions, CalendarApi, EventClickArg, MoreLinkArg, EventSourceFuncArg, EventInput } from \"@fullcalendar/core\";\nimport FullCalendar from \"@fullcalendar/react\";\nimport dayGridPlugin from \"@fullcalendar/daygrid\";\nimport interactionPlugin, { DateClickArg } from \"@fullcalendar/interaction\";\nimport listPlugin from \"@fullcalendar/list\";\nimport { Icon } from \"@iconify/react\";\nimport { isUnavailableState, useHass, getColorByIndex, localize } from \"@hakit/core\";\nimport type { FilterByDomain, EntityName } from \"@hakit/core\";\nimport { HassEntity } from \"home-assistant-js-websocket\";\nimport { useResizeDetector } from \"react-resize-detector\";\nimport Autolinker from \"autolinker\";\nimport {\n  Row,\n  Column,\n  fallback,\n  Modal,\n  ButtonBar,\n  Alert,\n  ButtonBarButton,\n  CardBase,\n  type CardBaseProps,\n  type AvailableQueries,\n} from \"@components\";\nimport { ErrorBoundary } from \"react-error-boundary\";\nimport { useRef, useEffect, useState, useCallback } from \"react\";\nimport { useShallow } from \"zustand/shallow\";\n\nconst StyledCalendarCard = styled(CardBase as React.ComponentType<CardBaseProps<\"div\", FilterByDomain<EntityName, \"calendar\">>>)`\n  .contents .calendar > * {\n    flex-grow: 1;\n    background-color: var(--ha-S300);\n    min-height: 400px;\n    --fc-neutral-bg-color: var(--ha-S300);\n    --fc-list-event-hover-bg-color: var(--ha-S300);\n    --fc-theme-standard-border-color: var(--ha-S500);\n    --fc-border-color: var(--ha-S500);\n    --fc-page-bg-color: var(--ha-S300);\n  }\n\n  a {\n    color: inherit !important;\n  }\n\n  .fc-theme-standard .fc-scrollgrid {\n    border: 1px solid var(--ha-S500);\n    border-radius: 0.5rem;\n  }\n\n  .fc-theme-standard td {\n    border-bottom-left-radius: 0.5rem;\n    border-bottom-right-radius: 0.5rem;\n  }\n\n  .fc-scrollgrid-section-header td {\n    border: none;\n  }\n\n  th.fc-col-header-cell.fc-day {\n    background-color: var(--ha-S200);\n    color: var(--ha-S200-contrast);\n    font-size: 11px;\n    font-weight: bold;\n    text-transform: uppercase;\n  }\n\n  .fc-daygrid-dot-event:hover {\n    background-color: inherit;\n  }\n\n  .fc-daygrid-day-top {\n    text-align: center;\n    padding-top: 0.25rem;\n    justify-content: center;\n  }\n\n  table.fc-scrollgrid-sync-table tbody tr:first-of-type .fc-daygrid-day-top {\n    padding-top: 0;\n  }\n\n  a.fc-daygrid-day-number {\n    font-size: 0.8rem;\n    cursor: pointer;\n  }\n\n  .fc .fc-daygrid-day-number {\n  }\n  .fc .fc-daygrid-more-link {\n    font-size: 0.7rem;\n    float: none;\n  }\n  .fc-daygrid-day-bottom {\n    width: 100%;\n    text-align: center;\n    &:before,\n    &:after {\n      display: none;\n    }\n  }\n\n  .fc .fc-daygrid-day.fc-day-today {\n    background: inherit;\n  }\n\n  td.fc-day-today .fc-daygrid-day-number {\n    height: 1.5rem;\n    width: 1.5rem;\n    flex-grow: 0;\n    flex-shrink: 0;\n    display: flex;\n    border-radius: 50%;\n    text-align: center;\n    white-space: nowrap;\n    background-color: var(--ha-A400);\n    color: var(--ha-900-contrast);\n    line-height: 1.5rem;\n    padding: 0;\n    align-items: center;\n    justify-content: center;\n  }\n\n  .fc-event {\n    border-radius: 4px;\n    line-height: 1.7;\n    cursor: pointer;\n  }\n\n  .fc-daygrid-block-event .fc-event-main {\n    padding: 0 1px;\n  }\n\n  .fc-day-past .fc-daygrid-day-events {\n    opacity: 0.5;\n  }\n\n  .fc-popover {\n    background-color: var(--primary-background-color) !important;\n  }\n\n  .fc-popover-header {\n    background-color: var(--secondary-background-color) !important;\n  }\n\n  .fc-theme-standard .fc-list-day-frame {\n    background-color: transparent;\n  }\n\n  .fc-list.fc-view,\n  .fc-list-event.fc-event td {\n    border: none;\n  }\n\n  .fc-list-day.fc-day th {\n    border-bottom: none;\n    border-top: 1px solid var(--fc-theme-standard-border-color, #ddd) !important;\n  }\n\n  .fc-list-day-text {\n    font-size: 16px;\n    font-weight: 400;\n  }\n\n  .fc-list-day-side-text {\n    font-weight: 400;\n    font-size: 16px;\n    color: var(--primary-color);\n  }\n  .fc-list-day-cushion {\n    background-color: var(--ha-S200);\n    color: var(--ha-S200-contrast);\n  }\n\n  .fc-list-table td,\n  .fc-list-day-frame {\n    padding-top: 12px;\n    padding-bottom: 12px;\n  }\n  &.narrow .fc-list-table {\n    table-layout: fixed;\n    tr th,\n    tr td {\n      &:first-of-type {\n        box-sizing: border-box;\n        width: 30%;\n        overflow-wrap: break-word;\n        white-space: pre-wrap;\n        font-size: 0.8rem;\n      }\n      &[aria-hidden=\"true\"] {\n        box-sizing: border-box;\n        width: 5%;\n      }\n      &:last-of-type {\n        box-sizing: border-box;\n        width: 65%;\n        overflow-wrap: break-word;\n        white-space: pre-wrap;\n        font-size: 0.8rem;\n      }\n    }\n  }\n\n  .fc-dayGridMonth-view {\n    .fc-event-time,\n    .fc-event-title {\n      display: none;\n    }\n    .fc-daygrid-event-harness {\n      margin-top: 0 !important;\n    }\n    .fc-daygrid-day-events {\n      display: flex;\n      align-items: center;\n      justify-content: center;\n      flex-wrap: wrap;\n      position: relative;\n      margin-top: 0;\n    }\n  }\n\n  .fc-dayGridDay-view {\n    .fc-event-title {\n      &:before {\n        content: \"- \";\n      }\n    }\n    th.fc-col-header-cell.fc-day {\n      font-size: 16px;\n      font-weight: 400;\n      .fc-col-header-cell-cushion {\n        padding: 8px 14px;\n        text-transform: none;\n      }\n    }\n  }\n\n  &.narrow {\n    .fc-dayGridMonth-view .fc-scrollgrid-sync-table {\n      overflow: hidden;\n    }\n    .fc .fc-col-header-cell-cushion {\n      padding: 0.4rem;\n    }\n    .monthly-toggle-view {\n      display: none;\n    }\n  }\n\n  .fc-header-toolbar,\n  .fc .fc-toolbar {\n    display: none;\n  }\n`;\n\nconst Header = styled.div`\n  padding: 1rem;\n`;\n\nconst EventBody = styled.div`\n  overflow-wrap: break-word;\n  color: var(--ha-S200-contrast);\n  padding: 1rem 0;\n  width: 100%;\n  display: flex;\n  flex-direction: column;\n`;\nconst StyledAlert = styled(Alert)`\n  position: absolute;\n  bottom: 0;\n  left: 0;\n  right: 0;\n  z-index: 4;\n  &:after {\n    border-radius: 0;\n  }\n`;\n\nexport interface CalendarEvent {\n  title: string;\n  start: string;\n  end?: string;\n  backgroundColor?: string;\n  borderColor?: string;\n  calendar: string;\n  eventData: CalendarEventData;\n}\n\n/** Data returned from the core APIs. */\nexport interface CalendarEventData {\n  uid?: string;\n  recurrence_id?: string;\n  summary: string;\n  dtstart: string;\n  dtend: string;\n  start?: string;\n  end?: string;\n  rrule?: string;\n  description?: string;\n}\n\nexport interface CalendarEventWithEntity extends CalendarEvent {\n  entity: HassEntity;\n}\ntype OmitProperties =\n  | \"modalProps\"\n  | \"onClick\"\n  | \"children\"\n  | \"active\"\n  | \"as\"\n  | \"title\"\n  | \"disabled\"\n  | \"entity\"\n  | \"service\"\n  | \"serviceData\"\n  | \"ref\"\n  | \"longPressCallback\"\n  | \"disableRipples\"\n  | \"disableScale\"\n  | \"disableActiveState\";\nexport interface CalendarCardProps extends Omit<CardBaseProps<\"div\", EntityName>, OmitProperties> {\n  /** The names of your calendar entities */\n  entities: FilterByDomain<EntityName, \"calendar\">[];\n  /** if need be, you can provide a timezone to display time in a specific timezone */\n  timeZone?: string;\n  /** the default rendered view @default \"dayGridMonth\" */\n  view?: \"dayGridMonth\" | \"listWeek\" | \"dayGridDay\";\n  /** disables the auto view switching based on the size of the card @default false */\n  disableAutoView?: boolean;\n  /** disables the narrow class/styles from being added when the card is too small @default false */\n  disableNarrow?: boolean;\n  /** include the header controls @default true */\n  includeHeader?: boolean;\n}\n\nconst getCalendarDate = (\n  dateObj?:\n    | string\n    | {\n        dateTime?: string;\n        date?: string;\n      },\n): string | undefined => {\n  if (typeof dateObj === \"string\") {\n    return dateObj;\n  }\n\n  if (dateObj?.dateTime) {\n    return dateObj.dateTime;\n  }\n\n  if (dateObj?.date) {\n    return dateObj.date;\n  }\n\n  return undefined;\n};\n\nfunction formatDate(dateString: string) {\n  const optionsDate: Intl.DateTimeFormatOptions = {\n    month: \"long\",\n    day: \"numeric\",\n    year: \"numeric\",\n  };\n\n  const optionsTime: Intl.DateTimeFormatOptions = {\n    hour: \"2-digit\",\n    minute: \"2-digit\",\n  };\n\n  const date = new Date(dateString);\n\n  const formattedDate = new Intl.DateTimeFormat(\"en-US\", optionsDate).format(date);\n  const formattedStartTime = new Intl.DateTimeFormat(\"en-US\", optionsTime).format(date);\n\n  // Assume event is 15 minutes long for this example\n  const eventEndTime = new Date(date.getTime() + 15 * 60000);\n  const formattedEndTime = new Intl.DateTimeFormat(\"en-US\", optionsTime).format(eventEndTime);\n\n  return `${formattedDate} ${formattedStartTime} - ${formattedEndTime}`;\n}\n\nconst defaultFullCalendarConfig: CalendarOptions = {\n  headerToolbar: false,\n  plugins: [dayGridPlugin, listPlugin, interactionPlugin],\n  initialView: \"dayGridMonth\",\n  dayMaxEventRows: true,\n  height: \"parent\",\n  views: {\n    listWeek: {\n      type: \"list\",\n      duration: { days: 7 },\n    },\n  },\n  eventTimeFormat: {\n    hour: \"2-digit\",\n    minute: \"2-digit\",\n    hour12: true,\n  },\n};\n\nfunction InternalCalendarCard({\n  entities,\n  className,\n  timeZone,\n  view,\n  disableAutoView = false,\n  disableNarrow = false,\n  includeHeader = true,\n  cssStyles,\n  key,\n  ...rest\n}: CalendarCardProps): React.ReactNode {\n  const { callApi } = useHass.getState().helpers;\n  const globalComponentStyle = useHass((state) => state.globalComponentStyles);\n  const config = useHass((store) => store.config);\n  const calRef = useRef<FullCalendar>(null);\n  const initialRequest = useRef(false);\n  const [error, setError] = useState<string | null>(null);\n  const [title, setTitle] = useState<string>(\"\");\n  const [loading, setLoading] = useState<boolean>(false);\n  const [narrow, setNarrow] = useState<boolean>(false);\n  const { width, ref: widthRef } = useResizeDetector({\n    refreshMode: \"debounce\",\n    handleHeight: false,\n    refreshRate: 500,\n  });\n  const [currentEvent, setCurrentEvent] = useState<CalendarEventWithEntity | null>(null);\n  const calEntities = useHass(useShallow((state) => entities.map((id) => state.entities[id])));\n  const [activeView, setActiveView] = useState<CalendarCardProps[\"view\"]>(view ?? \"dayGridMonth\");\n\n  const calendars = calEntities.filter((entity) => !isUnavailableState(entity?.state));\n  const fetchEvents = useCallback(\n    async (info: EventSourceFuncArg, successCallback: (events: EventInput[]) => void): Promise<void> => {\n      setError(null);\n      const params = encodeURI(`?start=${info.start.toISOString()}&end=${info.end.toISOString()}`);\n      const calEvents: CalendarEvent[] = [];\n      const errors: string[] = [];\n      const apiCalls = entities.map(async (entity) =>\n        callApi<CalendarEventData[]>(`/calendars/${entity}${params}`, {\n          method: \"GET\",\n        }).then(\n          (result) => ({\n            result: result,\n            error: result.status === \"error\" ? result.data : null,\n            entityId: entity,\n          }),\n          (error) => ({ error, result: null, entityId: entity }),\n        ),\n      );\n      const responses = await Promise.all(apiCalls);\n      responses.forEach(({ result, error, entityId }, index) => {\n        const backgroundColor = getColorByIndex(index);\n        if (error || !result || result.status === \"error\") {\n          errors.push(`${entityId} - ${error}`);\n          return;\n        }\n        (result.data ?? []).forEach((ev) => {\n          const eventStart = getCalendarDate(ev.start);\n          const eventEnd = getCalendarDate(ev.end);\n          if (!eventStart || !eventEnd) {\n            return;\n          }\n          const eventData: CalendarEventData = {\n            uid: ev.uid,\n            summary: ev.summary,\n            description: ev.description,\n            dtstart: eventStart,\n            dtend: eventEnd,\n            recurrence_id: ev.recurrence_id,\n            rrule: ev.rrule,\n          };\n          const event: CalendarEvent = {\n            start: eventStart,\n            end: eventEnd,\n            title: ev.summary,\n            backgroundColor: backgroundColor,\n            borderColor: backgroundColor,\n            calendar: entities[index],\n            eventData: eventData,\n          };\n\n          calEvents.push(event);\n        });\n      });\n      if (errors.length > 0) {\n        setError(`${localize(\"components.calendar.event_retrieval_error\")}: \"${errors.join(\", \")}\".`);\n        successCallback([]);\n      } else {\n        successCallback(calEvents);\n      }\n      initialRequest.current = true;\n    },\n    [callApi, entities],\n  );\n\n  const changeView = useCallback(\n    (fn: (api: CalendarApi) => void) => {\n      if (!calRef.current) return;\n      const calendarApi = calRef.current.getApi();\n      // @ts-expect-error - this does exist.\n      calendarApi.batchRendering(() => {\n        calendarApi.removeAllEventSources();\n        fn(calendarApi);\n        calendarApi.addEventSource(fetchEvents);\n        setTitle(calendarApi.view.title);\n      });\n    },\n    [fetchEvents],\n  );\n\n  const measureCard = useCallback(\n    (width: number) => {\n      if (calRef.current) {\n        const calendarApi = calRef.current.getApi();\n        calRef.current.requestResize();\n        if (width < 400) {\n          // only change the view if it's not already in listWeek, and not defined as an input prop\n          if (!disableAutoView && calendarApi.view.type !== \"listWeek\") {\n            changeView((api) => {\n              api.setOption(\"eventDisplay\", \"auto\");\n              api.changeView(\"listWeek\");\n              setActiveView(\"listWeek\");\n            });\n          }\n          if (!narrow && !disableNarrow) {\n            setNarrow(true);\n          }\n        }\n        if (width >= 400 && narrow && !disableNarrow) {\n          setNarrow(false);\n        }\n      }\n    },\n    [narrow, disableAutoView, disableNarrow, changeView],\n  );\n  useEffect(() => {\n    if (width) {\n      measureCard(width);\n    }\n  }, [width, measureCard]);\n\n  const _handleNext = useCallback(() => {\n    changeView((api) => api.next());\n  }, [changeView]);\n\n  const _handlePrev = useCallback(() => {\n    changeView((api) => api.prev());\n  }, [changeView]);\n\n  const _handleToday = useCallback(() => {\n    changeView((api) => api.today());\n  }, [changeView]);\n  const _handleView = useCallback(\n    (newView: CalendarCardProps[\"view\"]): void => {\n      if (newView === activeView || !calRef.current) return;\n      const eventDisplay = newView === \"dayGridMonth\" ? \"list-item\" : \"auto\";\n      changeView((api) => {\n        api.setOption(\"eventDisplay\", eventDisplay);\n        api.changeView(newView as string);\n        setActiveView(newView);\n      });\n    },\n    [activeView, changeView],\n  );\n\n  const _handleEventClick = useCallback(\n    (info: EventClickArg): void => {\n      const entityStateObj = calendars.find((entity) => entity.entity_id === info.event.extendedProps.calendar);\n      setCurrentEvent({\n        ...info.event.extendedProps,\n        entity: entityStateObj ?? null,\n      } as CalendarEventWithEntity);\n    },\n    [calendars],\n  );\n\n  const _handleDateClick = useCallback(\n    (info: DateClickArg | MoreLinkArg): void => {\n      if (info.view.type !== \"dayGridMonth\") {\n        return;\n      }\n      changeView((api) => {\n        api.gotoDate(info.date);\n        api.changeView(\"dayGridDay\");\n        setActiveView(\"dayGridDay\");\n      });\n    },\n    [changeView],\n  );\n\n  useEffect(() => {\n    if (initialRequest.current) return;\n    // initially request the events\n    if (!view) {\n      const defaultView = \"dayGridMonth\";\n      const eventDisplay = defaultView === \"dayGridMonth\" ? \"list-item\" : \"auto\";\n      changeView((api) => {\n        api.setOption(\"eventDisplay\", eventDisplay);\n        api.changeView(defaultView as string);\n        setActiveView(defaultView);\n      });\n    } else {\n      changeView((api) => {\n        api.changeView(view);\n      });\n    }\n  }, [changeView, view]);\n\n  return (\n    <StyledCalendarCard\n      key={key}\n      disableScale\n      disableActiveState\n      disableRipples\n      className={`calendar-card ${className ?? \"\"} ${narrow ? \"narrow\" : \"\"}`}\n      cssStyles={`\n        ${globalComponentStyle.calendarCard ?? \"\"}\n        ${cssStyles ?? \"\"}\n      `}\n      {...rest}\n    >\n      {includeHeader && (\n        <Header className=\"header\">\n          <Row justifyContent=\"space-between\">\n            <Column>\n              <h3 className=\"title\">{title}</h3>\n            </Column>\n            <ButtonBar className=\"button-group-nav\">\n              <ButtonBarButton\n                title={localize(\"previous\")}\n                size={35}\n                disabled={loading}\n                onClick={() => {\n                  _handlePrev();\n                }}\n                icon=\"mdi:navigate-before\"\n              />\n              <ButtonBarButton\n                title={localize(\"next\")}\n                size={35}\n                disabled={loading}\n                onClick={() => {\n                  _handleNext();\n                }}\n                icon=\"mdi:navigate-next\"\n              />\n            </ButtonBar>\n          </Row>\n          <Row justifyContent=\"flex-end\">\n            <ButtonBar className=\"button-group-views\">\n              <ButtonBarButton\n                title={localize(\"today\")}\n                size={35}\n                disabled={loading}\n                onClick={() => {\n                  _handleToday();\n                }}\n                noIcon\n              >\n                {localize(\"today\").toUpperCase()}\n              </ButtonBarButton>\n              <ButtonBarButton\n                className=\"monthly-toggle-view\"\n                title={localize(\"monthly\")}\n                active={activeView === \"dayGridMonth\"}\n                size={35}\n                disabled={loading}\n                onClick={() => {\n                  _handleView(\"dayGridMonth\");\n                }}\n                icon=\"mdi:view-module\"\n              />\n              <ButtonBarButton\n                title={localize(\"weekly\")}\n                size={35}\n                disabled={loading}\n                onClick={() => {\n                  _handleView(\"listWeek\");\n                }}\n                icon=\"mdi:view-week\"\n              />\n              <ButtonBarButton\n                title={localize(\"daily\")}\n                size={35}\n                disabled={loading}\n                onClick={() => {\n                  _handleView(\"dayGridDay\");\n                }}\n                icon=\"mdi:view-day\"\n              />\n            </ButtonBar>\n          </Row>\n        </Header>\n      )}\n      <div className=\"calendar\" ref={widthRef}>\n        <FullCalendar\n          dateClick={_handleDateClick}\n          moreLinkClick={_handleDateClick}\n          eventClick={_handleEventClick}\n          editable={false}\n          ref={calRef}\n          loading={(isLoading) => {\n            setLoading(isLoading);\n          }}\n          locale={config?.language}\n          timeZone={timeZone ?? \"local\"}\n          progressiveEventRendering\n          {...defaultFullCalendarConfig}\n        />\n      </div>\n      {loading && <StyledAlert className={\"loading\"} description={`${localize(\"loading\")}...`} />}\n      {currentEvent && (\n        <Modal\n          title={currentEvent.eventData.summary}\n          id={currentEvent.eventData.uid as string}\n          description={\n            <Row\n              justifyContent=\"flex-start\"\n              gap=\"1rem\"\n              style={{\n                textTransform: \"lowercase\",\n              }}\n            >\n              {currentEvent.entity.attributes.friendly_name}\n            </Row>\n          }\n          open\n          onClose={() => {\n            setCurrentEvent(null);\n          }}\n        >\n          <Column justifyContent=\"flex-start\" alignItems=\"flex-start\">\n            <Row justifyContent=\"flex-start\" gap=\"1rem\">\n              <Icon\n                style={{\n                  fontSize: \"1.5rem\",\n                }}\n                icon=\"mdi:calendar-clock\"\n              />\n              <span>{formatDate(currentEvent.eventData.dtstart)}</span>\n            </Row>\n            {currentEvent.eventData.description && (\n              <EventBody\n                dangerouslySetInnerHTML={{\n                  __html: Autolinker.link(currentEvent.eventData.description.replace(/\\n/g, \"<br/>\"), {\n                    newWindow: true,\n                    stripPrefix: false,\n                  }),\n                }}\n              />\n            )}\n          </Column>\n        </Modal>\n      )}\n      {error && (\n        <Alert title={localize(\"components.calendar.event_retrieval_error\")} type=\"error\">\n          {error}\n        </Alert>\n      )}\n    </StyledCalendarCard>\n  );\n}\n\n/**\n * The CalendarCard is very similar to the home assistant calendar card, with the exception of not having delete/edit event functionality, the preview here contains only a month (the current month) of fake events to preview the functionality\n *\n * This component uses the REST API to retrieve events from home assistant, ensure you've followed the instructions [here](https://shannonhochkins.github.io/ha-component-kit/?path=/docs/core-hooks-usehass-hass-callapi--docs)\n * */\nexport function CalendarCard(props: CalendarCardProps) {\n  const defaultColumns: AvailableQueries = {\n    xxs: 12,\n    xs: 8,\n    sm: 6,\n    md: 6,\n    lg: 4,\n    xlg: 3,\n  };\n  return (\n    <ErrorBoundary {...fallback({ prefix: \"CalendarCard\" })}>\n      <InternalCalendarCard {...defaultColumns} {...props} />\n    </ErrorBoundary>\n  );\n}\n","import { fallback, ButtonBarButton } from \"@components\";\nimport { ErrorBoundary } from \"react-error-boundary\";\nimport styled from \"@emotion/styled\";\nimport { css } from \"@emotion/react\";\nimport { ReactElement, Children, isValidElement, cloneElement } from \"react\";\n\ntype Extendable = React.ComponentPropsWithoutRef<\"div\">;\n\n// Define the allowed children types\ntype AllowedChild = ReactElement<typeof ButtonBarButton> | false | null;\ntype AllowedChildren = AllowedChild | AllowedChild[];\n\nexport interface ButtonBarProps extends Extendable {\n  /** standard flex css properties for align-items, @default \"center\" */\n  alignItems?: React.CSSProperties[\"alignItems\"];\n  /** standard flex css properties for justify-content, @default \"center\" */\n  justifyContent?: React.CSSProperties[\"justifyContent\"];\n  /** standard flex css properties for flex-wrap property, @default \"wrap\" */\n  wrap?: React.CSSProperties[\"justifyContent\"];\n  /** gap between buttons, note - will not be applied in \"grouped\" layoutType @default \"0\" */\n  gap?: React.CSSProperties[\"gap\"];\n  /** the children for the ButtonBar, it accepts ButtonBarButton components */\n  children: AllowedChildren;\n  /** should the group stretch to the height of the parent */\n  fullHeight?: boolean;\n  /** should the group stretch to the width of the parent */\n  fullWidth?: boolean;\n  /** type of the layout, grouped will render all buttons together, bubble will render them as buttons in a row @default 'grouped' */\n  layoutType?: \"grouped\" | \"bubble\";\n}\n\nconst ButtonBarParent = styled.div<Partial<ButtonBarProps>>`\n  display: flex;\n  ${({ fullWidth }) => {\n    if (fullWidth) {\n      return `\n        > .fit-content {\n          flex-basis: auto;\n          width: 100%;\n        }\n      `;\n    }\n    return ``;\n  }};\n`;\n\nconst FitContent = styled.div`\n  display: flex;\n  flex-basis: fit-content;\n`;\n\nconst ButtonBarInner = styled.div<Partial<ButtonBarProps>>`\n  display: flex;\n  flex-direction: row;\n  flex-wrap: ${({ wrap }) => wrap || \"wrap\"};\n  justify-content: ${({ justifyContent }) => justifyContent || \"center\"};\n  align-items: ${({ alignItems }) => alignItems || \"center\"};\n  width: ${({ fullWidth }) => (fullWidth ? \"100%\" : \"auto\")};\n  height: ${({ fullHeight }) => (fullHeight ? \"100%\" : \"auto\")};\n  overflow: hidden;\n  flex-wrap: nowrap;\n\n  > * {\n    height: 100%;\n    width: auto;\n    display: flex;\n    align-items: stretch;\n    .button-bar-button {\n      height: 100%;\n      display: flex;\n      align-items: stretch;\n    }\n  }\n\n  &.grouped {\n    background-color: var(--ha-S300);\n    border-radius: 0.5rem;\n    border: 1px solid var(--ha-S500);\n    > * {\n      border-right: 1px solid var(--ha-S500);\n      &:last-of-type {\n        border-right: none;\n      }\n    }\n  }\n  &.bubble {\n    gap: ${({ gap }) => gap || \"0px\"};\n    > * {\n      flex-grow: 1;\n    }\n    .button-bar-button {\n      background-color: var(--ha-300-a3-contrast);\n      color: var(--ha-300);\n      &:not(.disabled):not(:focus):hover {\n        background-color: var(--ha-S50-a6);\n        color: var(--ha-500);\n      }\n    }\n  }\n`;\n\nfunction InternalButtonBar({\n  key,\n  alignItems,\n  fullWidth,\n  fullHeight,\n  gap,\n  justifyContent,\n  wrap,\n  style,\n  id,\n  className,\n  cssStyles,\n  children,\n  layoutType = \"grouped\",\n  ...rest\n}: ButtonBarProps) {\n  const childrenWithKeys = Children.map(children, (child, index) => {\n    if (isValidElement(child)) {\n      return cloneElement(child, {\n        key: child.key || index,\n        // @ts-expect-error - it does exist, fix types later\n        size: child?.props?.size ?? (layoutType === \"bubble\" ? 35 : 30),\n        borderRadius: layoutType === \"bubble\" ? \"8px\" : \"0px\",\n      });\n    }\n    return null;\n  });\n  return (\n    <ButtonBarParent\n      key={key}\n      id={id ?? \"\"}\n      css={css`\n        ${cssStyles ?? \"\"}\n      `}\n      layoutType={layoutType}\n      className={`button-bar ${layoutType} ${className ?? \"\"}`}\n      style={{\n        ...(style ?? {}),\n      }}\n      {...rest}\n    >\n      <FitContent className=\"fit-content\">\n        <ButtonBarInner\n          className={`button-group-inner ${layoutType}`}\n          {...{\n            alignItems,\n            justifyContent,\n            wrap,\n            gap: (gap ?? layoutType === \"bubble\") ? \"0.5rem\" : \"0\",\n            fullWidth,\n            fullHeight,\n          }}\n        >\n          {/* @ts-expect-error - fix later */}\n          {childrenWithKeys}\n        </ButtonBarInner>\n      </FitContent>\n    </ButtonBarParent>\n  );\n}\n\n/**\n * This is a very simple function that turns FabCards into a button bar, you can use this with entities or just normal button elements\n *\n * There's a known problem with the types when you provide an entity name, typescript will complain about the available services, this is something i'll address later * */\nexport function ButtonBar(props: ButtonBarProps) {\n  return (\n    <ErrorBoundary {...fallback({ prefix: \"ButtonBar\" })}>\n      <InternalButtonBar {...props} />\n    </ErrorBoundary>\n  );\n}\n","import { type EntityName } from \"@hakit/core\";\nimport { type FabCardProps, FabCard } from \"@components\";\n\nexport interface ButtonBarButtonProps<E extends EntityName> extends FabCardProps<E> {\n  /** optional override to determine if the button should render in an active state */\n  active?: boolean;\n  /** hide the bottom border when active */\n  hideActiveBorder?: boolean;\n}\n\nconst DEFAULT_ICON_SIZE = 35;\n\nexport function ButtonBarButton<E extends EntityName>({\n  key,\n  children,\n  active,\n  className,\n  size,\n  cssStyles,\n  borderRadius,\n  hideActiveBorder,\n  ...rest\n}: ButtonBarButtonProps<E>) {\n  return (\n    <FabCard\n      key={key}\n      className={`button-bar-button ${className ?? \"\"} ${hideActiveBorder ? \"hide-active-border\" : \"\"}`}\n      disableScale\n      borderRadius={borderRadius ?? 0}\n      size={size ?? DEFAULT_ICON_SIZE}\n      active={active}\n      cssStyles={`\n        &.button-bar-button {\n          height: auto;\n          &:not(.hide-active-border) {\n            border-bottom: 2px solid transparent;\n            transition: border-bottom-color var(--ha-transition-duration) var(--ha-easing);\n          }\n          \n          .contents {\n            > div {\n              padding: 0.4rem;\n            }\n          }\n          &.active {\n            &:not(.hide-active-border) {\n              border-bottom-color: var(--ha-A400);\n            }\n          }\n        }\n        ${cssStyles ?? \"\"}\n      `}\n      {...rest}\n    >\n      {children}\n    </FabCard>\n  );\n}\n","import { ReactElement, Children, isValidElement, cloneElement, CSSProperties, useMemo } from \"react\";\nimport styled from \"@emotion/styled\";\nimport { Row, fallback, ButtonGroupButton, type RowProps } from \"@components\";\nimport { ErrorBoundary } from \"react-error-boundary\";\n\nconst ButtonGroupParent = styled(Row)<\n  {\n    thickness: number;\n  } & RowProps\n>`\n  --ha-control-button-group-thickness: ${(props) => props.thickness}px;\n  width: auto;\n  &:not(.maintain-aspect-ratio) {\n    > * {\n      flex: 1;\n      height: 100%;\n      width: 100%;\n    }\n  }\n\n  &.maintain-aspect-ratio {\n    > * {\n      flex-grow: 0;\n    }\n  }\n\n  &:not(.vertical) {\n    height: var(--ha-control-button-group-thickness);\n    &.maintain-aspect-ratio {\n      > * {\n        height: 100%;\n        width: var(--ha-control-button-group-thickness);\n      }\n    }\n  }\n  &.vertical {\n    width: var(--ha-control-button-group-thickness);\n    &.maintain-aspect-ratio {\n      > * {\n        width: 100%;\n        height: var(--ha-control-button-group-thickness);\n      }\n    }\n  }\n`;\n\ntype Orientation = \"vertical\" | \"horizontal\";\nexport interface ButtonGroupProps extends RowProps {\n  /** the orientation of the slider, useful if you want to represent the slider to match your curtain/blind orientation */\n  orientation?: Orientation;\n  /** reverse the direction of the slider, useful if you want the ui to reflect the actual cover */\n  reverse?: boolean;\n  /** the thickness of the buttons @default 100 */\n  thickness?: number;\n  /** This will only accept ButtonGroupButton as a child component */\n  children: ReactElement<typeof ButtonGroupButton> | ReactElement<typeof ButtonGroupButton>[];\n  /** The gap between the buttons  @default '1rem' */\n  gap?: CSSProperties[\"gap\"];\n  /** should the buttons maintain their aspect ratio, disabling this you'll need to control your own dimensions @default true */\n  maintainAspectRatio?: boolean;\n}\n\nfunction InternalButtonGroup({\n  key,\n  orientation = \"vertical\",\n  reverse = false,\n  thickness = 100,\n  children,\n  className,\n  gap = \"1rem\",\n  maintainAspectRatio = true,\n  ...rest\n}: ButtonGroupProps) {\n  const childrenWithKeys = Children.map(children, (child, index) => {\n    if (isValidElement(child)) {\n      return cloneElement(child, {\n        key: child.key || index,\n      });\n    }\n    return child;\n  });\n\n  const _classes = useMemo(() => {\n    return [\n      \"button-group-parent\",\n      className,\n      maintainAspectRatio ? \"maintain-aspect-ratio\" : \"\",\n      reverse ? \"reverse\" : \"\",\n      orientation === \"vertical\" ? \"vertical\" : \"\",\n    ]\n      .filter((x) => !!x)\n      .join(\" \");\n  }, [maintainAspectRatio, className, reverse, orientation]);\n  const flexDirection = useMemo(() => {\n    if (reverse) {\n      return orientation === \"vertical\" ? \"column-reverse\" : \"row-reverse\";\n    }\n    return orientation === \"vertical\" ? \"column\" : \"row\";\n  }, [reverse, orientation]);\n  return (\n    <ButtonGroupParent\n      key={key}\n      {...rest}\n      style={{\n        ...(rest.style || {}),\n        flexDirection,\n      }}\n      gap={gap}\n      thickness={thickness}\n      className={_classes}\n    >\n      {childrenWithKeys}\n    </ButtonGroupParent>\n  );\n}\n\n/** This component will render buttons to control any entity, they can be displayed vertically, horizontally, reversed order and the size, color and icons are all configurable.\n */\nexport function ButtonGroup(props: ButtonGroupProps) {\n  return (\n    <ErrorBoundary {...fallback({ prefix: \"ButtonGroup\" })}>\n      <InternalButtonGroup {...props} />\n    </ErrorBoundary>\n  );\n}\n","import styled from \"@emotion/styled\";\nimport { Tooltip, fallback, type TooltipProps, Row, Column } from \"@components\";\nimport {\n  useIcon,\n  ON,\n  useEntity,\n  type DomainService,\n  type ServiceData,\n  type ExtractDomain,\n  type HassEntityWithService,\n  type EntityName,\n} from \"@hakit/core\";\nimport { ReactNode, useMemo } from \"react\";\nimport { ErrorBoundary } from \"react-error-boundary\";\nimport { IconProps } from \"@iconify/react\";\n\nconst Button = styled.button<{\n  borderRadius?: number;\n  activeColor?: string;\n}>`\n  outline: none;\n  cursor: pointer;\n  border: 0;\n  border-radius: ${(props) => props.borderRadius ?? 0.25}rem;\n  background-color: var(--ha-S300);\n  color: var(--ha-S500-contrast);\n  display: flex;\n  flex-shrink: 0;\n  aspect-ratio: 1/1;\n  justify-content: center;\n  align-items: center;\n  box-shadow: 0px 2px 4px rgba(0, 0, 0, 0.1);\n  transition: var(--ha-transition-duration) var(--ha-easing);\n  transition-property: transform, background-color, color, box-shadow, opacity;\n  font-size: calc(var(--ha-control-button-group-thickness) / 4);\n  width: 100%;\n  height: 100%;\n  svg {\n    transition: color var(--ha-transition-duration) var(--ha-easing);\n  }\n  &:not(:disabled):hover {\n    background-color: var(--ha-S400);\n  }\n  &:disabled {\n    cursor: not-allowed;\n    opacity: 0.8;\n  }\n  &.active:not(:disabled) {\n    background-color: ${(props) => props.activeColor ?? \"var(--ha-A400)\"};\n    color: var(--ha-900-contrast);\n    svg {\n      color: var(--ha-900-contrast);\n    }\n    &:hover {\n      background-color: ${(props) => props.activeColor ?? \"var(--ha-A700)\"};\n    }\n  }\n  &:active:not(:disabled):not(.disable-scale-effect) {\n    transform: scale(0.9);\n  }\n`;\n\nexport interface ButtonGroupButtonProps<E extends EntityName> extends Omit<TooltipProps, \"title\" | \"children\" | \"onClick\"> {\n  /** the entity name to render */\n  entity?: E;\n  /** The service name to call\" */\n  service?: DomainService<ExtractDomain<E>>;\n  /** The data to pass to the service */\n  serviceData?: ServiceData<ExtractDomain<E>, DomainService<ExtractDomain<E>>>;\n  /** an optional override for the title for the tooltip */\n  title?: React.ReactNode;\n  /** an optional override for the icon */\n  icon?: string;\n  /** the props for the icon, which includes styles for the icon */\n  iconProps?: Omit<IconProps, \"icon\">;\n  /** a callback when the button is clicked, this will receive the entity with the available services if entity was provided */\n  onClick?: (entity: HassEntityWithService<ExtractDomain<E>> | null) => void;\n  /** optional override to determine if the button should render in an active state */\n  active?: boolean;\n  /** optional override to the button color when active */\n  activeColor?: string;\n  /** show the title */\n  showTitle?: boolean;\n  /** optionally render children within the button */\n  children?: ReactNode;\n  /** should the button render as disabled */\n  disabled?: boolean;\n  /** disableScaleEffect while tapping */\n  disableScaleEffect?: boolean;\n}\n\nfunction InternalButtonGroupButton<E extends EntityName>({\n  entity,\n  onClick,\n  icon,\n  iconProps,\n  title,\n  active,\n  service,\n  serviceData,\n  key,\n  showTitle = false,\n  activeColor,\n  children,\n  disabled,\n  disableScaleEffect = false,\n  style,\n  ...rest\n}: ButtonGroupButtonProps<E>) {\n  const _entity = useEntity(entity ?? \"unknown\", {\n    returnNullIfNotFound: true,\n  });\n  const _icon = useIcon(icon ?? _entity?.attributes?.icon ?? (children ? null : \"mdi:help-circle-outline\"), iconProps);\n  const titleValue = useMemo(() => {\n    return title ?? _entity?.attributes?.friendly_name ?? _entity?.entity_id ?? \"\";\n  }, [_entity, title]);\n  const _active = useMemo(() => {\n    return active ?? _entity?.state === ON;\n  }, [_entity, active]);\n  return (\n    <Tooltip placement=\"left\" title={titleValue} key={key} {...rest}>\n      <Button\n        className={`button-group-button ${showTitle ? \"has-title\" : \"\"} ${_active ? \"active\" : \"\"} ${disableScaleEffect ? \"disable-scale-effect\" : \"\"}`}\n        activeColor={activeColor}\n        disabled={disabled}\n        onClick={() => {\n          // @ts-expect-error - this is fine, entity name, service etc aren't known here\n          if (onClick) onClick(_entity);\n          if (service && _entity) {\n            // @ts-expect-error - this is fine, entity name, service etc aren't known here\n            _entity.service[service](serviceData ?? {});\n          }\n        }}\n        style={style}\n      >\n        {showTitle && (\n          <Column>\n            <Row fullWidth>{_icon}</Row>\n            <Row\n              fullWidth\n              style={{\n                fontSize: \"1.2rem\",\n              }}\n            >\n              {title}\n            </Row>\n          </Column>\n        )}\n        {!showTitle && _icon}\n        {children && children}\n      </Button>\n    </Tooltip>\n  );\n}\n\n/** This component is designed to work with the ButtonGroup as a child component */\nexport function ButtonGroupButton<E extends EntityName>(props: ButtonGroupButtonProps<E>) {\n  return (\n    <ErrorBoundary {...fallback({ prefix: \"ButtonGroupButton\" })}>\n      <InternalButtonGroupButton {...props} />\n    </ErrorBoundary>\n  );\n}\n","import type HlsType from \"hls.js\";\nimport type { ErrorData } from \"hls.js\";\nimport { useRef, useState, useCallback, useEffect } from \"react\";\nimport { Alert } from \"@components\";\nimport { VideoPlayer, type VideoState } from \"./\";\n\ntype HlsLite = Omit<HlsType, \"subtitleTrackController\" | \"audioTrackController\" | \"emeController\">;\n\nexport interface HlsPlayerProps {\n  url: string;\n  posterUrl: string;\n  controls?: boolean;\n  muted?: boolean;\n  autoPlay?: boolean;\n  playsInline?: boolean;\n  onStateChange?: (state: VideoState) => void;\n}\n\nexport function HlsPlayer({\n  url,\n  posterUrl,\n  controls = true,\n  muted = false,\n  autoPlay = false,\n  playsInline = false,\n  onStateChange,\n}: HlsPlayerProps) {\n  const _videoEl = useRef<HTMLVideoElement>(null);\n  const [fatalError, setFatalError] = useState<string | null>(null);\n  const [retryableError, setRetryableError] = useState<string | null>(null);\n  const _hlsPolyfillInstance = useRef<HlsLite | undefined>(undefined);\n  const started = useRef(false);\n\n  const _renderHLSPolyfill = useCallback(async (videoEl: HTMLVideoElement, Hls: typeof HlsType, url: string) => {\n    const hls = new Hls({\n      backBufferLength: 60,\n      fragLoadingTimeOut: 30000,\n      manifestLoadingTimeOut: 30000,\n      levelLoadingTimeOut: 30000,\n      maxLiveSyncPlaybackRate: 2,\n      lowLatencyMode: _isLLHLSSupported(),\n    });\n    _hlsPolyfillInstance.current = hls;\n    hls.attachMedia(videoEl);\n    hls.on(Hls.Events.MEDIA_ATTACHED, () => {\n      setRetryableError(null);\n      setFatalError(null);\n      hls.loadSource(url);\n    });\n    hls.on(Hls.Events.FRAG_LOADED, () => {\n      setRetryableError(null);\n      setFatalError(null);\n    });\n    hls.on(Hls.Events.ERROR, (_event, data: ErrorData) => {\n      // Some errors are recovered automatically by the hls player itself, and the others handled\n      // in this function require special actions to recover. Errors retried in this function\n      // are done with backoff to not cause unecessary failures.\n      if (!data.fatal) {\n        return;\n      }\n      if (data.type === Hls.ErrorTypes.NETWORK_ERROR) {\n        switch (data.details) {\n          case Hls.ErrorDetails.MANIFEST_LOAD_ERROR: {\n            let error = \"Error starting stream, see logs for details\";\n            if (data.response !== undefined && data.response.code !== undefined) {\n              if (data.response.code >= 500) {\n                error += \" (Server failure)\";\n              } else if (data.response.code >= 400) {\n                error += \" (Stream never started)\";\n              } else {\n                error += \" (\" + data.response.code + \")\";\n              }\n            }\n            setRetryableError(error);\n            break;\n          }\n          case Hls.ErrorDetails.MANIFEST_LOAD_TIMEOUT:\n            setRetryableError(\"Timeout while starting stream\");\n            break;\n          default:\n            setRetryableError(\"Stream network error\");\n            break;\n        }\n        hls.startLoad();\n      } else if (data.type === Hls.ErrorTypes.MEDIA_ERROR) {\n        setRetryableError(\"Error with media stream contents\");\n        hls.recoverMediaError();\n      } else {\n        setFatalError(\"Error playing stream\");\n      }\n    });\n  }, []);\n\n  const _startHls = useCallback(async (): Promise<void> => {\n    if (!_videoEl.current || started.current) {\n      return;\n    }\n    const masterPlaylistPromise = fetch(url);\n    // @ts-expect-error - no need for types\n    const Hls: typeof HlsType = (await import(\"hls.js/dist/hls.light.mjs\")).default;\n    started.current = true;\n\n    let hlsSupported = Hls.isSupported();\n\n    if (!hlsSupported) {\n      hlsSupported = _videoEl.current.canPlayType(\"application/vnd.apple.mpegurl\") !== \"\";\n    }\n\n    if (!hlsSupported) {\n      setFatalError(\"video not supported\");\n      return;\n    }\n\n    const masterPlaylist = await (await masterPlaylistPromise).text();\n\n    // Parse playlist assuming it is a master playlist. Match group 1 is whether hevc, match group 2 is regular playlist url\n    // See https://tools.ietf.org/html/rfc8216 for HLS spec details\n    const playlistRegexp = /#EXT-X-STREAM-INF:.*?(?:CODECS=\".*?(hev1|hvc1)?\\..*?\".*?)?(?:\\n|\\r\\n)(.+)/g;\n    const match = playlistRegexp.exec(masterPlaylist);\n    const matchTwice = playlistRegexp.exec(masterPlaylist);\n\n    // Get the regular playlist url from the input (master) playlist, falling back to the input playlist if necessary\n    // This avoids the player having to load and parse the master playlist again before loading the regular playlist\n    let playlist_url: string;\n    if (match !== null && matchTwice === null) {\n      // Only send the regular playlist url if we match exactly once\n      playlist_url = new URL(match[2], url).href;\n    } else {\n      playlist_url = url;\n    }\n\n    // If codec is HEVC\n    if (Hls.isSupported()) {\n      _renderHLSPolyfill(_videoEl.current, Hls, playlist_url);\n    } else {\n      _renderHLSNative(_videoEl.current, playlist_url);\n    }\n  }, [url, _renderHLSPolyfill]);\n\n  function _isLLHLSSupported(): boolean {\n    // LL-HLS keeps multiple requests in flight, which can run into browser limitations without\n    // an http/2 proxy to pipeline requests. However, a small number of streams active at\n    // once should be OK.\n    // The stream count may be incremented multiple times before this function is called to check\n    // the count e.g. when loading a page with many streams on it. The race can work in our favor\n    // so we now have a better idea on if we'll use too many browser connections later.\n    if ((typeof window !== \"undefined\" && !(\"performance\" in window)) || performance.getEntriesByType(\"resource\").length === 0) {\n      return false;\n    }\n    const perfEntry = performance.getEntriesByType(\"resource\")[0] as PerformanceResourceTiming;\n    return \"nextHopProtocol\" in perfEntry && perfEntry.nextHopProtocol === \"h2\";\n  }\n\n  async function _renderHLSNative(videoEl: HTMLVideoElement, url: string) {\n    videoEl.src = url;\n    videoEl.addEventListener(\"loadedmetadata\", () => {\n      videoEl.play();\n    });\n  }\n\n  useEffect(() => {\n    _startHls();\n  }, [_startHls]);\n\n  if (fatalError) {\n    return <Alert type=\"error\" description={fatalError} />;\n  }\n  if (retryableError) {\n    console.error(retryableError);\n  }\n\n  return (\n    <VideoPlayer\n      ref={_videoEl}\n      type=\"application/vnd.apple.mpegurl\"\n      poster={posterUrl}\n      autoPlay={autoPlay}\n      muted={muted}\n      playsInline={playsInline}\n      controls={controls}\n      onVideoStateChange={onStateChange}\n    />\n  );\n}\n","import { useState, useRef, useEffect, useCallback } from \"react\";\nimport { Alert } from \"@components\";\nimport { useHass, type EntityName, type FilterByDomain } from \"@hakit/core\";\nimport { VideoPlayer, type VideoState } from \"./\";\n\ntype SubscriptionUnsubscribe = () => Promise<void>;\n\nexport interface WebRTCPlayerProps {\n  /** The name of your entity */\n  entity: FilterByDomain<EntityName, \"camera\">;\n  controls?: boolean;\n  muted?: boolean;\n  autoPlay?: boolean;\n  playsInline?: boolean;\n  posterUrl?: string;\n  onStateChange?: (state: VideoState) => void;\n}\n\nexport type WebRtcOfferEvent = WebRtcId | WebRtcAnswer | WebRtcCandidate | WebRtcError;\n\nexport interface WebRtcId {\n  type: \"session\";\n  session_id: string;\n}\n\nexport interface WebRtcAnswer {\n  type: \"answer\";\n  answer: string;\n}\n\nexport interface WebRtcCandidate {\n  type: \"candidate\";\n  candidate: RTCIceCandidateInit;\n}\n\nexport interface WebRtcError {\n  type: \"error\";\n  code: string;\n  message: string;\n}\n\nexport interface WebRTCClientConfiguration {\n  configuration: RTCConfiguration;\n  dataChannel?: string;\n  getCandidatesUpfront: boolean;\n}\n\n/**\n * A WebRTC stream is established by first sending an offer through a signal\n * path via an integration. An answer is returned, then the rest of the stream\n * is handled entirely client side.\n */\nexport function WebRTCPlayer({ entity, controls, muted, autoPlay, playsInline, posterUrl, onStateChange }: WebRTCPlayerProps) {\n  const connection = useHass((store) => store.connection);\n  const _videoEl = useRef<HTMLVideoElement>(null);\n  const [error, setError] = useState<string | undefined>(undefined);\n  const _peerConnection = useRef<RTCPeerConnection | undefined>(undefined);\n  const _remoteStream = useRef<MediaStream | undefined>(undefined);\n  const _sessionId = useRef<string | undefined>(undefined);\n  const _candidatesList = useRef<RTCIceCandidate[]>([]);\n  const _unsub = useRef<Promise<SubscriptionUnsubscribe> | undefined>(undefined);\n  const started = useRef(false);\n  const fetchWebRtcSettings = useCallback(\n    async () =>\n      connection?.sendMessagePromise<WebRTCClientConfiguration>({\n        type: \"camera/webrtc/get_client_config\",\n        entity_id: entity,\n      }),\n    [connection, entity],\n  );\n\n  const cleanUp = () => {\n    if (_remoteStream.current) {\n      _remoteStream.current.getTracks().forEach((track) => {\n        track.stop();\n      });\n\n      _remoteStream.current = undefined;\n    }\n    if (_videoEl.current) {\n      _videoEl.current.removeAttribute(\"src\");\n      _videoEl.current.load();\n    }\n    if (_peerConnection.current) {\n      const peerConnection = _peerConnection.current;\n      peerConnection.close();\n\n      peerConnection.onnegotiationneeded = null;\n      peerConnection.onicecandidate = null;\n      peerConnection.oniceconnectionstatechange = null;\n      peerConnection.onicegatheringstatechange = null;\n      peerConnection.ontrack = null;\n      peerConnection.onsignalingstatechange = null;\n      _peerConnection.current = undefined;\n    }\n    _unsub.current?.then((unsub_call) => unsub_call());\n    _unsub.current = undefined;\n    _sessionId.current = undefined;\n    _candidatesList.current = [];\n  };\n\n  const addTrack = useCallback(\n    async (event: RTCTrackEvent) => {\n      if (!_remoteStream.current || !_videoEl.current) {\n        return;\n      }\n      _remoteStream.current.addTrack(event.track);\n      _videoEl.current.srcObject = _remoteStream.current;\n    },\n    [_remoteStream],\n  );\n\n  // Reference: https://github.com/home-assistant/frontend/blob/7d1ca2acf0a7dcb68ebc69cf2d54c7395455c8e5/src/components/ha-web-rtc-player.ts\n  const _startWebRtc = useCallback(async (): Promise<void> => {\n    if (!connection || !_videoEl.current || started.current) return;\n    started.current = true;\n    setError(undefined);\n    const configuration = await fetchWebRtcSettings();\n    if (!configuration) return;\n    const peerConnection: RTCPeerConnection | undefined = new RTCPeerConnection(configuration.configuration);\n    if (configuration.dataChannel) {\n      // Some cameras (such as nest) require a data channel to establish a stream\n      // however, not used by any integrations.\n      peerConnection.createDataChannel(configuration.dataChannel);\n    }\n\n    const addWebRtcCandidate = (candidateSession: string, candidate: RTCIceCandidateInit) =>\n      connection?.sendMessage({\n        type: \"camera/webrtc/candidate\",\n        entity_id: entity,\n        session_id: candidateSession,\n        candidate: candidate,\n      });\n\n    const startNegotiation = async () => {\n      if (!peerConnection) {\n        return;\n      }\n\n      const offerOptions: RTCOfferOptions = {\n        offerToReceiveAudio: true,\n        offerToReceiveVideo: true,\n      };\n\n      const offer: RTCSessionDescriptionInit = await peerConnection.createOffer(offerOptions);\n\n      if (!peerConnection) {\n        return;\n      }\n\n      await peerConnection.setLocalDescription(offer);\n\n      if (!peerConnection) {\n        return;\n      }\n\n      let candidates = \"\";\n\n      if (configuration?.getCandidatesUpfront) {\n        await new Promise<void>((resolve) => {\n          peerConnection!.onicegatheringstatechange = (ev: Event) => {\n            const iceGatheringState = (ev.target as RTCPeerConnection).iceGatheringState;\n            if (iceGatheringState === \"complete\") {\n              peerConnection!.onicegatheringstatechange = null;\n              resolve();\n            }\n          };\n        });\n\n        if (!peerConnection) {\n          return;\n        }\n      }\n\n      while (_candidatesList.current.length) {\n        const candidate = _candidatesList.current.pop();\n        if (candidate) {\n          candidates += `a=${candidate}\\r\\n`;\n        }\n      }\n\n      const handleAnswer = async (event: WebRtcAnswer) => {\n        if (!_peerConnection.current?.signalingState || [\"stable\", \"closed\"].includes(_peerConnection.current.signalingState)) {\n          return;\n        }\n\n        // Initiate the stream with the remote device\n        const remoteDesc = new RTCSessionDescription({\n          type: \"answer\",\n          sdp: event.answer,\n        });\n        try {\n          await _peerConnection.current.setRemoteDescription(remoteDesc);\n        } catch (err) {\n          if (err instanceof Error) {\n            setError(\"Failed to connect WebRTC stream: \" + err.message);\n          }\n          cleanUp();\n        }\n      };\n\n      const handleOfferEvent = async (event: WebRtcOfferEvent) => {\n        if (event.type === \"session\") {\n          _sessionId.current = event.session_id;\n          _candidatesList.current.forEach((candidate) => addWebRtcCandidate(event.session_id, candidate.toJSON()));\n          _candidatesList.current = [];\n        } else if (event.type === \"answer\") {\n          handleAnswer(event);\n        } else if (event.type === \"candidate\") {\n          try {\n            // The spdMid or sdpMLineIndex is required so set sdpMid=\"0\" if not\n            // sent from the backend.\n            const candidate =\n              event.candidate.sdpMid || event.candidate.sdpMLineIndex != null\n                ? new RTCIceCandidate(event.candidate)\n                : new RTCIceCandidate({\n                    candidate: event.candidate.candidate,\n                    sdpMid: \"0\",\n                  });\n\n            await _peerConnection.current?.addIceCandidate(candidate);\n          } catch (err) {\n            if (err instanceof Error) {\n              setError(err.message);\n            }\n            console.error(err);\n          }\n        } else if (event.type === \"error\") {\n          setError(\"Failed to start WebRTC stream: \" + event.message);\n          cleanUp();\n        }\n      };\n\n      const offer_sdp = offer.sdp! + candidates;\n      try {\n        _unsub.current = connection.subscribeMessage<WebRtcOfferEvent>((event) => handleOfferEvent(event), {\n          type: \"camera/webrtc/offer\",\n          entity_id: entity,\n          offer: offer_sdp,\n        });\n      } catch (err) {\n        if (err instanceof Error) {\n          setError(\"Failed to start WebRTC stream: \" + err.message);\n        }\n        cleanUp();\n      }\n    };\n\n    peerConnection.onnegotiationneeded = startNegotiation;\n\n    const handleIceCandidate = (event: RTCPeerConnectionIceEvent) => {\n      if (!event.candidate?.candidate) {\n        return;\n      }\n      if (_sessionId.current) {\n        addWebRtcCandidate(_sessionId.current, event.candidate.toJSON());\n      } else {\n        _candidatesList.current.push(event.candidate);\n      }\n    };\n    peerConnection.onicecandidate = handleIceCandidate;\n\n    const iceConnectionStateChanged = () => {\n      if (peerConnection?.iceConnectionState === \"failed\") {\n        peerConnection.restartIce();\n      }\n    };\n    peerConnection.oniceconnectionstatechange = iceConnectionStateChanged;\n\n    // just for debugging\n    peerConnection.onsignalingstatechange = (ev) => {\n      switch ((ev.target as RTCPeerConnection).signalingState) {\n        case \"stable\":\n          console.log(\"WebRTC ICE Negotiation complete\");\n          break;\n        default:\n          console.log(`WebRTC signaling state changed: ${(ev.target as RTCPeerConnection).signalingState}`);\n      }\n    };\n\n    // Setup callbacks to render remote stream once media tracks are discovered.\n    _remoteStream.current = new MediaStream();\n    peerConnection.ontrack = addTrack;\n\n    peerConnection.addTransceiver(\"audio\", { direction: \"recvonly\" });\n    peerConnection.addTransceiver(\"video\", { direction: \"recvonly\" });\n\n    _peerConnection.current = peerConnection;\n  }, [fetchWebRtcSettings, addTrack, connection, entity]);\n\n  useEffect(() => {\n    _startWebRtc();\n  }, [_startWebRtc]);\n\n  useEffect(() => {\n    const localVideo = _videoEl.current;\n    return () => {\n      if (_remoteStream.current) {\n        _remoteStream.current.getTracks().forEach((track) => {\n          track.stop();\n        });\n        _remoteStream.current = undefined;\n      }\n      if (localVideo) {\n        localVideo.removeAttribute(\"src\");\n        localVideo.load();\n      }\n      if (_peerConnection.current) {\n        _peerConnection.current.close();\n        _peerConnection.current = undefined;\n      }\n    };\n  }, []);\n\n  if (error) {\n    return <Alert type=\"error\" description={error} />;\n  }\n\n  return (\n    <VideoPlayer\n      ref={_videoEl}\n      poster={posterUrl}\n      autoPlay={autoPlay}\n      muted={muted}\n      playsInline={playsInline}\n      controls={controls}\n      onVideoStateChange={onStateChange}\n    />\n  );\n}\n","import { STREAM_TYPE_WEB_RTC, STREAM_TYPE_HLS, useCamera, localize } from \"@hakit/core\";\nimport type { FilterByDomain, EntityName } from \"@hakit/core\";\nimport { HlsPlayer } from \"../players/hls\";\nimport { WebRTCPlayer } from \"../players/webrtc\";\nimport type { VideoState } from \"../players\";\nexport interface CameraStreamProps {\n  /** The name of your entity */\n  entity: FilterByDomain<EntityName, \"camera\">;\n  /** if the player should start muted @default false */\n  muted?: boolean;\n  /** if the player should show the controls @default true */\n  controls?: boolean;\n  /** if the player should play inline @default false */\n  playsInline?: boolean;\n  /** if the player should start playing automatically @default false */\n  autoPlay?: boolean;\n  /** called whenever the video changes state, not every listener is available, but most of the important listeners are supported */\n  onStateChange?: (state: VideoState) => void;\n}\n\n/**\n * A Simple wrapper for HLS and WEBRTC to display a live feed of your camera entity.\n * This component will not render anything if your camera does not support HLS or WEBRTC */\nexport function CameraStream({\n  entity,\n  muted = false,\n  controls = true,\n  autoPlay = false,\n  playsInline = false,\n  onStateChange,\n}: CameraStreamProps) {\n  const camera = useCamera(entity);\n  const { stream, poster, mjpeg } = camera;\n  if (mjpeg.shouldRenderMJPEG && mjpeg.url) {\n    return <img src={mjpeg.url} alt={`${localize(\"camera_view\")} \"${camera.attributes.friendly_name ?? camera.entity_id}\".`} />;\n  }\n  if (camera.frontend_stream_types.includes(STREAM_TYPE_WEB_RTC)) {\n    return (\n      <WebRTCPlayer\n        autoPlay={autoPlay}\n        playsInline={playsInline}\n        muted={muted}\n        controls={controls}\n        entity={entity}\n        onStateChange={onStateChange}\n        posterUrl={poster.url}\n      />\n    );\n  }\n  if (camera.frontend_stream_types.includes(STREAM_TYPE_HLS)) {\n    return (\n      !poster.loading &&\n      poster.url &&\n      !stream.loading &&\n      stream.url && (\n        <HlsPlayer\n          autoPlay={autoPlay}\n          muted={muted}\n          controls={controls}\n          playsInline={playsInline}\n          posterUrl={poster.url}\n          onStateChange={onStateChange}\n          url={stream.url}\n        />\n      )\n    );\n  }\n\n  return null;\n}\n","import type { EntityName, FilterByDomain, CameraEntityExtended } from \"@hakit/core\";\nimport { useCamera, useHass, isUnavailableState, STREAM_TYPE_WEB_RTC, STREAM_TYPE_HLS, localize } from \"@hakit/core\";\nimport styled from \"@emotion/styled\";\nimport { useEffect, useCallback, useRef, useState, useMemo, Children, isValidElement, cloneElement } from \"react\";\nimport {\n  PreloadImage,\n  fallback,\n  Row,\n  FabCard,\n  ButtonBar,\n  ButtonBarProps,\n  ButtonBarButton,\n  ButtonBarButtonProps,\n  CardBase,\n  type AvailableQueries,\n  type CardBaseProps,\n} from \"@components\";\nimport { ErrorBoundary } from \"react-error-boundary\";\nimport { CameraStream } from \"./stream\";\nimport { type VideoState } from \"./players\";\nimport { Icon } from \"@iconify/react\";\n\ntype OmitProperties = \"onClick\" | \"children\" | \"active\" | \"as\" | \"title\" | \"ref\" | \"disableActiveState\" | \"features\";\n\ntype Extendable = Omit<CardBaseProps<\"div\", FilterByDomain<EntityName, \"camera\">>, OmitProperties>;\nexport interface CameraCardProps<E extends FilterByDomain<EntityName, \"camera\">> extends Extendable {\n  /** the camera entity to display */\n  entity: E;\n  /** override the camera name displayed in the card */\n  name?: string;\n  /** hide the camera name @default false */\n  hideName?: boolean;\n  /** the view to display the camera in, poster is an image that updated based on the\n   * specified interval, live is a live stream if supported and motion is a motion jpeg\n   * (automatically selected if live stream not supported) @default 'poster' */\n  view?: \"poster\" | \"live\" | \"motion\";\n  /** auto play the video stream */\n  autoPlay?: boolean;\n  /** mute the video player  @default true */\n  muted?: boolean;\n  /** enable / disable the controls for the player @default false */\n  controls?: boolean;\n  /** tells the video player to play inline @default true */\n  playsInline?: boolean;\n  /** the refresh rate for the poster image when in poster view @default 10000 */\n  posterUpdateInterval?: number;\n  /** sensors to render in the header of the card */\n  headerSensors?: ButtonBarProps[\"children\"];\n  /** hide the footer of the card, this will hide all sensors @default false */\n  hideFooter?: boolean;\n  /** hide the view controls @default false */\n  hideViewControls?: boolean;\n  /** fired when the card is clicked, this will provide the camera with all extended data */\n  onClick?: (camera: CameraEntityExtended, event: React.MouseEvent<HTMLDivElement, MouseEvent>) => void;\n}\n\nconst Header = styled(Row)`\n  position: absolute;\n  top: 0;\n  left: 0;\n  right: 0;\n  padding: 0.5rem;\n  z-index: 1;\n`;\n\nconst StateFabCard = styled(FabCard)`\n  box-shadow: 0px 2px 4px rgba(255, 255, 255, 0.1);\n  border-radius: 10px;\n  .icon {\n    background-color: ${(props) => (props.active ? `rgba(255,255,255,0.8)` : `rgba(255,255,255,0.5)`)};\n\n    color: ${(props) => (props.active ? `rgba(0, 0, 0, 1)` : `rgba(0, 0, 0, 0.4)`)};\n    &:not(:disabled):hover {\n      background-color: ${(props) => (props.active ? `rgba(255,255,255,0.8)` : `rgba(255,255,255,0.5)`)};\n    }\n  }\n`;\n\nconst Wrapper = styled(CardBase)`\n  aspect-ratio: 16/9;\n`;\n\nconst CameraName = styled.div`\n  color: var(--ha-500-contrast);\n  background-color: hsla(var(--ha-h), calc(var(--ha-s) * 1%), 10%, 0.6);\n  padding: 0.5rem;\n  border-radius: 0.4rem;\n`;\n\nconst Footer = styled(Row)`\n  padding: 0.5rem;\n  color: var(--ha-500-contrast);\n  background-color: hsla(var(--ha-h), calc(var(--ha-s) * 1%), 10%, 0.6);\n  transition: color var(--ha-transition-duration) var(--ha-easing);\n  position: absolute;\n  inset: auto 0 0 0;\n  font-weight: bold;\n  font-size: 1.2rem;\n  z-index: 1;\n`;\n\nconst StyledIcon = styled(Icon)`\n  opacity: 1;\n  position: absolute;\n  top: 50%;\n  left: 50%;\n  transform: translate(-50%, -50%);\n  font-size: 2rem;\n`;\n\nconst DEFAULT_ICON_BUTTON_SIZE = 40;\n\nfunction InternalCameraCard<E extends FilterByDomain<EntityName, \"camera\">>({\n  entity,\n  view = \"poster\",\n  autoPlay = true,\n  muted = true,\n  controls = false,\n  playsInline = true,\n  posterUpdateInterval = 10000,\n  className,\n  name,\n  hideName,\n  headerSensors,\n  hideFooter,\n  hideViewControls,\n  onClick,\n  service,\n  serviceData,\n  cssStyles,\n  key,\n  ...rest\n}: CameraCardProps<E>) {\n  const globalComponentStyle = useHass((state) => state.globalComponentStyles);\n  const cameraUpdater = useRef<NodeJS.Timeout | undefined>(undefined);\n  const loadingIconRef = useRef<SVGSVGElement | null>(null);\n  const stateValueRef = useRef<HTMLDivElement | null>(null);\n  const [loading, setLoading] = useState(true);\n  const [_view, setView] = useState(view);\n  const camera = useCamera(entity, {\n    // stream loading handled internally on the stream component\n    stream: false,\n    poster: _view === \"poster\",\n  });\n  const { poster, mjpeg } = camera;\n  const isUnavailable = isUnavailableState(camera.state);\n\n  const supportsLiveStream =\n    camera.frontend_stream_types.includes(STREAM_TYPE_WEB_RTC) || camera.frontend_stream_types.includes(STREAM_TYPE_HLS);\n\n  const _stopUpdateCameraInterval = (): void => {\n    if (cameraUpdater.current) {\n      clearInterval(cameraUpdater.current);\n      cameraUpdater.current = undefined;\n    }\n  };\n\n  const _startUpdateCameraInterval = useCallback((): void => {\n    _stopUpdateCameraInterval();\n    cameraUpdater.current = setInterval(() => poster.refresh(), posterUpdateInterval);\n  }, [poster, posterUpdateInterval]);\n\n  useEffect(() => {\n    return () => {\n      _stopUpdateCameraInterval();\n    };\n  }, []);\n\n  useEffect(() => {\n    if (view === \"poster\") {\n      _startUpdateCameraInterval();\n    }\n  }, [view, _startUpdateCameraInterval]);\n\n  useEffect(() => {\n    if (view) {\n      setView(view);\n    }\n  }, [view]);\n\n  const onImageLoad = useCallback(() => {\n    setLoading(false);\n  }, []);\n\n  const onImageLoading = useCallback(() => {\n    setLoading(true);\n  }, []);\n\n  const onVideoStateChange = useCallback((state: VideoState) => {\n    if (stateValueRef.current !== null) {\n      if (state === \"canplay\" || state === \"canplaythrough\") {\n        stateValueRef.current.innerText = \"ready\";\n      } else if (state === \"play\" || state === \"playing\") {\n        stateValueRef.current.innerText = \"playing\";\n      } else {\n        stateValueRef.current.innerText = state;\n      }\n    }\n    if (loadingIconRef.current) {\n      loadingIconRef.current.style.opacity = state === \"waiting\" || state === \"stalled\" ? \"1\" : \"0\";\n    }\n  }, []);\n\n  const viewButtons = useMemo(() => {\n    const buttons: ButtonBarProps[\"children\"] = [];\n    if (supportsLiveStream) {\n      buttons.push(\n        <ButtonBarButton\n          key=\"live\"\n          icon=\"mdi:video\"\n          size={DEFAULT_ICON_BUTTON_SIZE}\n          disabled={isUnavailable}\n          onClick={() => {\n            setView(\"live\");\n          }}\n          active={_view === \"live\"}\n          title={localize(\"preload_camera_stream\")}\n          tooltipPlacement=\"top\"\n          rippleProps={{\n            preventPropagation: true,\n          }}\n        />,\n      );\n    }\n    buttons.push(\n      ...([\n        <ButtonBarButton\n          key=\"motion\"\n          icon=\"mdi:video-image\"\n          size={DEFAULT_ICON_BUTTON_SIZE}\n          disabled={isUnavailable}\n          onClick={() => {\n            setView(\"motion\");\n          }}\n          active={_view === \"motion\"}\n          title={`${localize(\"motion\")} ${localize(\"view\")}`}\n          tooltipPlacement=\"top\"\n          rippleProps={{\n            preventPropagation: true,\n          }}\n        />,\n        <ButtonBarButton\n          key=\"poster\"\n          icon=\"el:picture\"\n          size={DEFAULT_ICON_BUTTON_SIZE}\n          disabled={isUnavailable}\n          onClick={() => {\n            setView(\"poster\");\n          }}\n          active={_view === \"poster\"}\n          title={`${localize(\"image\")} ${localize(\"view\")}`}\n          tooltipPlacement=\"top\"\n          rippleProps={{\n            preventPropagation: true,\n          }}\n        />,\n      ] satisfies ButtonBarProps[\"children\"]),\n    );\n    return buttons;\n  }, [supportsLiveStream, isUnavailable, _view]);\n\n  const cameraName = useMemo(() => name ?? camera.attributes.friendly_name ?? camera.entity_id, [name, camera]);\n\n  return (\n    <>\n      <Wrapper\n        key={key}\n        entity={entity}\n        // @ts-expect-error - don't know the entity name, so we can't know the service type\n        service={service}\n        // @ts-expect-error - don't know the entity name, so we can't know the service data\n        serviceData={serviceData}\n        disableActiveState\n        title={cameraName}\n        className={`camera-card ${className ?? \"\"}`}\n        onClick={(event: React.MouseEvent<HTMLDivElement, MouseEvent>) => {\n          if (onClick) onClick(camera, event);\n        }}\n        cssStyles={`\n          ${globalComponentStyle.cameraCard ?? \"\"}\n          ${cssStyles ?? \"\"}\n        `}\n        {...rest}\n      >\n        <Header justifyContent=\"space-between\" gap=\"0.5rem\">\n          <Row justifyContent=\"flex-start\" gap=\"0.5rem\">\n            <StateFabCard active borderRadius={10} disableScale size={30} noIcon>\n              <div ref={stateValueRef}>{loading || _view === \"live\" ? localize(\"loading\") : camera.state}</div>\n            </StateFabCard>\n          </Row>\n          {isUnavailable && (\n            <CameraName>\n              {localize(\"unavailable\")} {camera.entity_id}\n            </CameraName>\n          )}\n          {!hideName && <CameraName>{cameraName}</CameraName>}\n        </Header>\n        {!hideFooter && (\n          <Footer justifyContent=\"space-between\" gap=\"0.5rem\" wrap=\"nowrap\">\n            {headerSensors && (\n              <ButtonBar layoutType=\"bubble\" gap=\"0.5rem\">\n                {/* @ts-expect-error E doesn't extend EntityName, it's filtered by camera name and we can't really fix that here */}\n                {Children.map(headerSensors, (child, index) => {\n                  if (isValidElement<ButtonBarButtonProps<EntityName>>(child)) {\n                    return cloneElement(child, {\n                      key: child.key || index,\n                      size: child.props.size ?? DEFAULT_ICON_BUTTON_SIZE,\n                      rippleProps: {\n                        preventPropagation: true,\n                        ...(child?.props?.rippleProps ?? {}),\n                        key: child.key || index,\n                      },\n                    });\n                  }\n                  return child;\n                })}\n              </ButtonBar>\n            )}\n            {!hideViewControls && (\n              <ButtonBar gap=\"0.5rem\" layoutType=\"bubble\">\n                {viewButtons}\n              </ButtonBar>\n            )}\n          </Footer>\n        )}\n        {_view !== \"live\" && (poster.url || mjpeg.url) && (\n          <PreloadImage\n            onLoad={onImageLoad}\n            onLoading={onImageLoading}\n            src={_view === \"motion\" && mjpeg.url ? mjpeg.url : (poster.url ?? \"\")}\n            style={{\n              width: \"100%\",\n              height: \"100%\",\n              position: \"absolute\",\n            }}\n            lazy\n          />\n        )}\n        {_view === \"live\" && (\n          <>\n            <StyledIcon ref={loadingIconRef} icon=\"eos-icons:three-dots-loading\" />\n            <CameraStream\n              autoPlay={autoPlay}\n              muted={muted}\n              controls={controls}\n              playsInline={playsInline}\n              onStateChange={onVideoStateChange}\n              entity={entity}\n            />\n          </>\n        )}\n      </Wrapper>\n    </>\n  );\n}\n\n/**\n * The CameraCard is a card to display a live stream, poster image that refreshes at a specified interval or a motion jpeg stream.\n *\n * By Default, it will load a poster image and refresh it at a specified interval, if you want to use the live stream you can set the view to live or motion.\n *\n * This supports HLS, WebRTC and MJPEG streams, the WebRTC implementation hasn't been tested so if you're using WebRTC and it's not working for you please create an [issue request](https://github.com/shannonhochkins/ha-component-kit/issues).\n *\n * It also supports additional entities to render on the card such is motion detection, vehicle detection if you have entities that have additional data you can display them in the card easily.\n *\n * This is one of the first components that i have NOT got a complete demo working, as you can imagine setting up a live stream, motion image and refreshable poster image is a difficult and time expensive task, so you'll have to try it out to explore it's wonders :)\n *\n * Note: If you want to just use the stream, you can also import CameraStream from @hakit/components to use the stream as a video player element.\n * */\nexport function CameraCard<E extends FilterByDomain<EntityName, \"camera\">>(props: CameraCardProps<E>) {\n  const defaultColumns: AvailableQueries = {\n    xxs: 12,\n    xs: 6,\n    sm: 6,\n    md: 4,\n    lg: 4,\n    xlg: 3,\n  };\n  return (\n    <ErrorBoundary {...fallback({ prefix: \"CameraCard\" })}>\n      <InternalCameraCard {...defaultColumns} {...props} />\n    </ErrorBoundary>\n  );\n}\n","import { HassEntity } from \"home-assistant-js-websocket\";\nimport styled from \"@emotion/styled\";\nimport { Row, fallback } from \"@components\";\nimport { css } from \"@emotion/react\";\nimport { useCallback, ComponentPropsWithoutRef } from \"react\";\nimport {\n  useLogs,\n  useDevice,\n  useHass,\n  computeDomain,\n  createHistoricState,\n  localizeStateMessage,\n  localizeTriggerSource,\n  timeAgo,\n  ON,\n  type LogbookEntry,\n  type EntityName,\n  type UseLogOptions,\n  localize,\n} from \"@hakit/core\";\nimport { ErrorBoundary } from \"react-error-boundary\";\n\nconst Wrapper = styled.div`\n  --divider-color: rgba(225, 225, 225, 0.12);\n  display: block;\n  height: 100%;\n  width: 100%;\n\n  .entry-container {\n    width: 100%;\n  }\n\n  .entry {\n    position: relative;\n    display: flex;\n    width: 100%;\n    line-height: 1.6rem;\n    padding: 0.5rem 1rem;\n    box-sizing: border-box;\n    border-top: 1px solid var(--divider-color);\n    justify-content: space-between;\n    align-items: center;\n  }\n\n  .indicator {\n    background-color: var(--disabled-color);\n    height: 0.5rem;\n    width: 0.5rem;\n    border-radius: 0.25rem;\n    flex-shrink: 0;\n    margin-right: 0.7rem;\n    margin-inline-start: initial;\n    margin-inline-end: 0.7rem;\n  }\n\n  .entry:hover {\n    background-color: rgba(0, 0, 0, 0.12);\n  }\n\n  .message-relative_time {\n    display: flex;\n    flex-direction: column;\n  }\n\n  .secondary {\n    font-size: 0.8rem;\n    line-height: 1.7;\n    display: flex;\n    gap: 0.25rem;\n  }\n\n  .secondary a {\n    color: var(--ha-S300-contrast);\n  }\n\n  .date {\n    margin: 0.5rem 0;\n    padding: 0 1rem;\n  }\n\n  .icon-message {\n    display: flex;\n    align-items: center;\n  }\n\n  .no-entries {\n    text-align: center;\n    color: var(--ha-S300-contrast);\n    width: 100%;\n    display: block;\n    padding: 0.5rem;\n  }\n\n  .message {\n    color: var(--ha-S100-contrast);\n    span {\n      padding-right: 0.15rem;\n    }\n  }\n\n  .message span:first-of-type {\n    &:first-letter {\n      text-transform: capitalize;\n    }\n  }\n\n  button.link {\n    color: var(--ha-A100);\n    text-decoration: none;\n    background: 0px 0px;\n    border: none;\n    padding: 0px;\n    font: inherit;\n    text-align: left;\n    text-decoration: underline;\n    cursor: pointer;\n    outline: 0px;\n    margin-right: 0.15rem;\n  }\n`;\n\nconst triggerDomains = [\"script\", \"automation\"];\n\nconst hasContext = (item: LogbookEntry) => item.context_event_type || item.context_state || item.context_message;\nconst stripEntityId = (message: string, entityId?: string) => (entityId ? message.replace(entityId, \" \") : message);\n\nexport interface LogBookRendererProps extends ComponentPropsWithoutRef<\"div\"> {\n  /** the entity id to retrieve log information */\n  entity: EntityName;\n  /** options to pass to the useLog hook */\n  options?: UseLogOptions;\n  /** hide the header with the show more button @default false */\n  hideHeader?: boolean;\n  /** Whether to show an indicator next to each log row. @default false */\n  hideIndicator?: boolean;\n}\n\nconst Header = styled.div`\n  display: flex;\n  flex-direction: column;\n  gap: 0.5rem;\n`;\n\nfunction InternalLogBookRenderer({\n  entity,\n  hideIndicator = false,\n  hideHeader = false,\n  options,\n  className,\n  cssStyles,\n  id,\n  style,\n  ...rest\n}: LogBookRendererProps): React.ReactNode {\n  const logs = useLogs(entity, options);\n  const { joinHassUrl } = useHass.getState().helpers;\n  const entities = useHass((state) => state.entities);\n  const services = useHass((state) => state.services);\n  const language = useHass((state) => state.config?.language);\n  const device = useDevice(entity);\n\n  const _entityClicked = useCallback(\n    async (entityId: string | undefined) => {\n      if (!entityId) {\n        return;\n      }\n      if (device && device.device_id && typeof window !== \"undefined\") {\n        window.open(joinHassUrl(`config/devices/device/${device.device_id}`), \"_blank\");\n      }\n    },\n    [device, joinHassUrl],\n  );\n\n  const showMoreLogs = useCallback(() => {\n    if (typeof window === \"undefined\") return;\n    window.open(joinHassUrl(`/logbook?entity_id=${entity}`), \"_blank\");\n  }, [entity, joinHassUrl]);\n\n  const _renderEntity = useCallback(\n    (entityId: string | undefined, entityName: string | undefined) => {\n      const hasState = entityId && entityId in entities;\n      const displayName = entityName || (hasState ? entities[entityId].attributes.friendly_name || entityId : entityId);\n      if (!hasState) {\n        return <span className=\"entity-name\">{displayName}</span>;\n      }\n      return (\n        <button className=\"link entity-name\" onClick={() => _entityClicked(entityId)}>\n          {displayName}\n        </button>\n      );\n    },\n    [entities, _entityClicked],\n  );\n\n  // 9:15:24 PM || 21:15:24\n  const formatTimeWithSecondsMem = useCallback(\n    (dateObj: Date) =>\n      new Intl.DateTimeFormat(\"en-US\", {\n        hour: \"numeric\",\n        minute: \"2-digit\",\n        second: \"2-digit\",\n        hourCycle: \"h12\",\n      }).format(dateObj),\n    [],\n  );\n\n  const _formatMessageWithPossibleEntity = useCallback(\n    (message: string, seenEntities: string[], possibleEntity?: string) => {\n      //\n      // As we are looking at a log(book), we are doing entity_id\n      // \"highlighting\"/\"colorizing\". The goal is to make it easy for\n      // the user to access the entity that caused the event.\n      //\n      // If there is an entity_id in the message that is also in the\n      // state machine, we search the message for the entity_id and\n      // replace it with _renderEntity\n      //\n      if (message.indexOf(\".\") !== -1) {\n        const messageParts = message.split(\" \");\n        for (let i = 0, size = messageParts.length; i < size; i++) {\n          if (messageParts[i] in entities) {\n            const entityId = messageParts[i];\n            if (seenEntities.includes(entityId)) {\n              return null;\n            }\n            seenEntities.push(entityId);\n            const messageEnd = messageParts.splice(i);\n            messageEnd.shift(); // remove the entity\n            return (\n              <>\n                <span className=\"triggered-by-state\">{messageParts.join(\" \")}</span>\n                {_renderEntity(entityId, entities[entityId].attributes.friendly_name)}\n                <span className=\"message-suffix\">{messageEnd.join(\" \")}</span>\n              </>\n            );\n          }\n        }\n      }\n      //\n      // When we have a message that has a specific entity_id attached to\n      // it, and the entity_id is not in the message, we look\n      // for the friendly name of the entity and replace that with\n      // _renderEntity if its there so the user can quickly get to\n      // that entity.\n      //\n      if (possibleEntity && possibleEntity in entities) {\n        const possibleEntityName = entities[possibleEntity].attributes.friendly_name;\n        if (possibleEntityName && message.endsWith(possibleEntityName)) {\n          if (seenEntities.includes(possibleEntity)) {\n            return null;\n          }\n          seenEntities.push(possibleEntity);\n          message = message.substring(0, message.length - possibleEntityName.length);\n          return (\n            <>\n              <span className=\"message-entity\">{message}</span>\n              {_renderEntity(possibleEntity, possibleEntityName)}\n            </>\n          );\n        }\n      }\n      return <span className=\"message-entity\">{message}</span>;\n    },\n    [entities, _renderEntity],\n  );\n\n  const formatDateMem = useCallback(\n    (dateObject: Date) =>\n      new Intl.DateTimeFormat(\"en-US\", {\n        year: \"numeric\",\n        month: \"long\",\n        day: \"numeric\",\n        timeZone: undefined,\n      }).format(dateObject),\n    [],\n  );\n\n  const _renderIndicator = useCallback((item: LogbookEntry) => {\n    const style = {\n      backgroundColor: item.state === ON ? `var(--ha-A400)` : `var(--ha-S300-contrast)`,\n    };\n    return <div className=\"indicator\" style={style}></div>;\n  }, []);\n\n  const _renderUnseenContextSourceEntity = useCallback(\n    (item: LogbookEntry, seenEntityIds: string[]) => {\n      if (!item.context_entity_id || seenEntityIds.includes(item.context_entity_id!)) {\n        return \"\";\n      }\n      // We don't know what caused this entity\n      // to be included since its an integration\n      // described event.\n      return <>({_renderEntity(item.context_entity_id, item.context_entity_id_name)})</>;\n    },\n    [_renderEntity],\n  );\n\n  const _renderContextMessage = useCallback(\n    (item: LogbookEntry, seenEntityIds: string[]) => {\n      // State change\n      if (item.context_state) {\n        const historicStateObj =\n          item.context_entity_id && item.context_entity_id in entities\n            ? createHistoricState(entities[item.context_entity_id], item.context_state)\n            : undefined;\n        return (\n          <>\n            <span className=\"triggered-by\">{localize(\"triggered_by_state_of\")}</span>\n            {_renderEntity(item.context_entity_id, item.context_entity_id_name)}\n            <span>\n              {historicStateObj\n                ? localizeStateMessage(item.context_state, historicStateObj, computeDomain(item.context_entity_id as EntityName))\n                : item.context_state}\n            </span>\n          </>\n        );\n      }\n      // Service call\n      if (item.context_event_type === \"call_service\") {\n        return (\n          <>\n            <span className=\"triggered-by\">{localize(\"triggered_by_action\")}</span>\n            {item.context_domain && item.context_service ? (\n              <span className=\"service-trigger-details\">\n                {item.context_domain}:{\" \"}\n                {services ? services[item.context_domain]?.[item.context_service]?.name || item.context_service : item.context_service}\n              </span>\n            ) : null}\n          </>\n        );\n      }\n      if (!item.context_message || seenEntityIds.includes(item.context_entity_id!)) {\n        return null;\n      }\n      // Automation or script\n      if (item.context_event_type === \"automation_triggered\" || item.context_event_type === \"script_started\") {\n        // context_source is available in 2022.6 and later\n        const triggerMsg = item.context_source ? item.context_source : item.context_message.replace(\"triggered by \", \"\");\n        const contextTriggerSource = localizeTriggerSource(triggerMsg);\n        return (\n          <>\n            <span className=\"triggered-by\">\n              {localize(item.context_event_type === \"automation_triggered\" ? \"triggered_by_automation\" : \"triggered_by_script\")}\n            </span>\n            {_renderEntity(item.context_entity_id, item.context_entity_id_name)}\n            {item.context_message ? _formatMessageWithPossibleEntity(contextTriggerSource, seenEntityIds, undefined) : null}\n          </>\n        );\n      }\n      // Generic externally described logbook platform\n      // These are not localizable\n      return (\n        <>\n          <span className=\"triggered-by\">{localize(\"triggered_by\")}</span>\n          <span className=\"trigger-name\">{item.context_name}</span>\n          {_formatMessageWithPossibleEntity(item.context_message, seenEntityIds, item.context_entity_id)}\n          {_renderUnseenContextSourceEntity(item, seenEntityIds)}\n        </>\n      );\n    },\n    [_formatMessageWithPossibleEntity, _renderEntity, _renderUnseenContextSourceEntity, entities, services],\n  );\n\n  const _renderMessage = useCallback(\n    (item: LogbookEntry, seenEntityIds: string[], domain?: string, historicStateObj?: HassEntity) => {\n      if (item.entity_id) {\n        if (item.state) {\n          return (\n            <span className=\"message-state\">\n              {historicStateObj ? localizeStateMessage(item.state, historicStateObj, domain!) : item.state}\n            </span>\n          );\n        }\n      }\n\n      const itemHasContext = hasContext(item);\n      let message = item.message;\n      if (triggerDomains.includes(domain!) && item.source) {\n        if (itemHasContext) {\n          // These domains include the trigger source in the message\n          // but if we have the context we want to display that instead\n          // as otherwise we display duplicate triggers\n          return null;\n        }\n        message = item.source;\n      }\n      return message\n        ? _formatMessageWithPossibleEntity(\n            itemHasContext ? stripEntityId(message, item.context_entity_id) : message,\n            seenEntityIds,\n            undefined,\n          )\n        : null;\n    },\n    [_formatMessageWithPossibleEntity],\n  );\n  const _renderLogbookItem = useCallback(\n    (item: LogbookEntry, index: number) => {\n      if (!item || index === undefined) {\n        return null;\n      }\n      const previous = logs[index - 1] as LogbookEntry | undefined;\n      const seenEntityIds: string[] = [];\n      const currentStateObj = item.entity_id ? entities[item.entity_id] : undefined;\n      const historicStateObj = currentStateObj ? createHistoricState(currentStateObj, item.state!) : undefined;\n      const domain = item.entity_id\n        ? computeDomain(item.entity_id as EntityName)\n        : // Domain is there if there is no entity ID.\n          item.domain!;\n      const then = new Date(item.when * 1000);\n      const relativeTime = timeAgo(then, language);\n\n      return (\n        <div key={index} className=\"entry-container\">\n          {index === 0 ||\n          (item?.when && previous?.when && new Date(item.when * 1000).toDateString() !== new Date(previous.when * 1000).toDateString()) ? (\n            <h4 className=\"date\">{formatDateMem(new Date(item.when * 1000))}</h4>\n          ) : null}\n\n          <div className={`entry ${!item.entity_id ? \"no-entity\" : \"\"}`}>\n            <div className=\"icon-message\">\n              {!hideIndicator ? _renderIndicator(item) : \"\"}\n              <div className=\"message-relative_time\">\n                <div className=\"message\">\n                  {_renderMessage(item, seenEntityIds, domain, historicStateObj)}\n                  {_renderContextMessage(item, seenEntityIds)}\n                </div>\n                <div className=\"secondary\">\n                  <span>{formatTimeWithSecondsMem(new Date(item.when * 1000))}</span>-<span className=\"relative-time\">{relativeTime}</span>\n                </div>\n              </div>\n            </div>\n          </div>\n        </div>\n      );\n    },\n    [\n      _renderContextMessage,\n      _renderIndicator,\n      _renderMessage,\n      entities,\n      formatDateMem,\n      formatTimeWithSecondsMem,\n      logs,\n      hideIndicator,\n      language,\n    ],\n  );\n\n  return (\n    <Wrapper\n      id={id ?? \"\"}\n      css={css`\n        ${cssStyles ?? \"\"}\n      `}\n      className={`logbook-renderer ${className ?? \"\"}`}\n      style={{\n        ...(style ?? {}),\n      }}\n      {...rest}\n    >\n      {!logs.length ? (\n        <span className=\"no-entries\">{localize(\"no_activity_found\")}</span>\n      ) : (\n        <Header>\n          {!hideHeader && (\n            <Row fullWidth justifyContent=\"space-between\">\n              <h3>{localize(\"activity\")}</h3>\n              <button className=\"link\" onClick={showMoreLogs}>\n                {localize(\"show_more\")}\n              </button>\n            </Row>\n          )}\n          {logs.map((log, index) => {\n            return _renderLogbookItem(log, index);\n          })}\n        </Header>\n      )}\n    </Wrapper>\n  );\n}\n\n/** A component to render logs for an entity as a list, the list is updated automatically via a websocket listening to updates for the entity.\n * This is currently used for all popups for the cards and accessible via the button next to the close button. */\nexport function LogBookRenderer(props: LogBookRendererProps) {\n  return (\n    <ErrorBoundary {...fallback({ prefix: \"LogBookRenderer\" })}>\n      <InternalLogBookRenderer {...props} />\n    </ErrorBoundary>\n  );\n}\n","import { Column, FabCard, Row, fallback, mq } from \"@components\";\nimport { css } from \"@emotion/react\";\nimport styled from \"@emotion/styled\";\nimport { localize, useHass } from \"@hakit/core\";\nimport { Fragment, ReactNode, memo, useCallback, useEffect, useId, useRef } from \"react\";\nimport { createPortal } from \"react-dom\";\nimport { ErrorBoundary } from \"react-error-boundary\";\nimport { useKeyPress } from \"react-use\";\n\nconst ModalContainer = styled.div`\n  position: absolute;\n  z-index: 1;\n  top: 50%;\n  left: 50%;\n  display: flex;\n  width: var(--ha-modal-width);\n  margin-left: calc(var(--ha-modal-width) / -2);\n  transform: translateY(-50%);\n  color: var(--ha-S50-contrast);\n  max-height: calc(100% - 4rem);\n  overflow: hidden;\n  display: flex;\n  flex-direction: row;\n  align-items: stretch;\n  justify-content: space-between;\n  background-color: var(--ha-S200);\n  z-index: var(--ha-modal-z-index);\n  opacity: 0;\n  transition: opacity var(--ha-transition-duration) var(--ha-easing);\n  box-shadow: 0px 0px 10px hsla(var(--ha-h), calc(var(--ha-50-s) * 0.8), 3%, 0.6);\n  ${mq(\n    [\"xxs\", \"xs\"],\n    `\n    max-width: 95vw;\n    margin-left: calc(95vw / -2);\n  `,\n  )}\n`;\nconst ModalInner = styled.div`\n  display: flex;\n  padding: 0rem 1rem 2rem;\n  align-items: flex-start;\n  flex-direction: column;\n`;\nconst ModalOverflow = styled.div`\n  overflow-x: hidden;\n  overflow-y: auto;\n  display: flex;\n  flex-direction: column;\n  margin-top: 5rem;\n  justify-content: flex-start;\n  align-items: stretch;\n  width: 100%;\n`;\nconst ModalHeader = styled.div`\n  display: flex;\n  align-items: center;\n  justify-content: space-between;\n  padding: 1rem;\n  flex-wrap: nowrap;\n  position: absolute;\n  top: 0;\n  left: 0;\n  right: 0;\n`;\n\nconst Title = styled.h4`\n  margin: 0;\n  font-size: 1.5rem;\n  overflow: hidden;\n  white-space: nowrap;\n  text-overflow: ellipsis;\n  max-width: 100%;\n  > span {\n    margin: 0;\n    font-size: 0.9rem;\n    color: var(--ha-S500-contrast);\n    display: flex;\n  }\n`;\n\nconst Description = styled.h4`\n  margin: 0;\n  font-size: 0.9rem;\n  color: var(--ha-S500-contrast);\n`;\n\nconst ModalBackdrop = styled.div`\n  position: absolute;\n  top: 0;\n  left: 0;\n  width: 100%;\n  height: 100%;\n  cursor: pointer;\n  background: hsla(var(--ha-h), calc(var(--ha-s) * 1%), 10%, 0.3);\n  z-index: var(--ha-modal-z-index);\n  backdrop-filter: blur(2em) brightness(0.75);\n  opacity: 0;\n  transition: opacity var(--ha-transition-duration) var(--ha-easing);\n`;\n\ntype Extendable = React.ComponentPropsWithoutRef<\"div\">;\nexport interface ModalProps extends Omit<Extendable, \"title\"> {\n  /** triggers the modal opening */\n  open: boolean;\n  /** the react layout to include inside the Modal */\n  children: React.ReactNode;\n  /** The title of the dialog */\n  title?: ReactNode;\n  /** the description of the modal */\n  description?: ReactNode;\n  /** triggered when the users pressed the close button, this is also triggered when the escape key is pressed */\n  onClose: () => void;\n  /** any prop to pass to the backdrop element */\n  backdropProps?: React.ComponentProps<\"div\">;\n  /** react elements to render next to the close button */\n  headerActions?: () => ReactNode;\n  /** the animation duration modal animation in seconds @default 0.25 */\n  animationDuration?: number;\n  /** Automatically close the modal after the provided number of seconds */\n  autocloseSeconds?: number;\n}\n\nfunction InternalModal({\n  open,\n  id,\n  title,\n  description,\n  children,\n  onClose,\n  backdropProps,\n  style,\n  className,\n  cssStyles,\n  headerActions,\n  autocloseSeconds = undefined,\n  animationDuration = 0.25,\n  ...rest\n}: ModalProps) {\n  const _id = useId();\n  const prefix = id ?? _id;\n  const globalComponentStyle = useHass((state) => state.globalComponentStyles);\n  const windowContext = useHass((store) => store.windowContext);\n  const win = windowContext ?? window;\n  const portalRoot = useHass((store) => store.portalRoot);\n  const [isPressed] = useKeyPress((event) => event.key === \"Escape\");\n  const autocloseRef = useRef<NodeJS.Timeout | null>(null);\n  const containerRef = useRef<HTMLDivElement>(null);\n  const backdropRef = useRef<HTMLDivElement>(null);\n\n  const doClose = useCallback(() => {\n    if (autocloseRef.current) {\n      clearTimeout(autocloseRef.current);\n    }\n    if (onClose && open) {\n      onClose();\n    }\n  }, [open, onClose]);\n\n  useEffect(() => {\n    const removeCurrent = () => {\n      if (autocloseRef.current) {\n        clearTimeout(autocloseRef.current);\n      }\n    };\n    removeCurrent();\n    if (autocloseSeconds && open) {\n      autocloseRef.current = setTimeout(doClose, autocloseSeconds * 1000);\n      return removeCurrent;\n    }\n  }, [open, autocloseSeconds, doClose]);\n\n  useEffect(() => {\n    if (isPressed) {\n      doClose();\n    }\n  }, [isPressed, doClose, open]);\n\n  useEffect(() => {\n    setTimeout(() => {\n      if (containerRef.current) {\n        containerRef.current.style.opacity = open ? \"1\" : \"0\";\n      }\n      if (backdropRef.current) {\n        backdropRef.current.style.opacity = open ? \"1\" : \"0\";\n      }\n    }, 25);\n  }, [open, animationDuration]);\n\n  return createPortal(\n    <>\n      {open && (\n        <Fragment key={`${prefix}-fragment`}>\n          <ModalBackdrop\n            ref={backdropRef}\n            key={`${prefix}-backdrop`}\n            className=\"modal-backdrop\"\n            id={`${prefix}-backdrop`}\n            onClick={() => {\n              // stops double tapping the backdrop whilst animating\n              if (open) {\n                onClose();\n              }\n            }}\n            css={css`\n              transition-duration: ${animationDuration}s;\n            `}\n            {...backdropProps}\n          />\n          <ModalContainer\n            {...rest}\n            ref={containerRef}\n            style={{\n              borderRadius: \"16px\",\n              ...style,\n            }}\n            css={css`\n              ${globalComponentStyle.modal ?? \"\"}\n              ${cssStyles ?? \"\"}\n            transition-duration: ${animationDuration}s;\n            `}\n            key={`${prefix}-container`}\n            className={`modal-container ${className ?? \"\"}`}\n          >\n            <ModalHeader className={`modal-header`}>\n              <Column\n                alignItems=\"flex-start\"\n                className={`modal-column`}\n                style={{\n                  flexShrink: 1,\n                  maxWidth: \"70%\",\n                }}\n              >\n                {title && <Title className={`modal-title`}>{title}</Title>}\n                {description && <Description className={`modal-description`}>{description}</Description>}\n              </Column>\n              <Row\n                gap=\"0.5rem\"\n                wrap=\"nowrap\"\n                style={{\n                  flexShrink: 0,\n                }}\n              >\n                {headerActions && headerActions()}\n                <FabCard\n                  onClick={() => {\n                    doClose();\n                  }}\n                  className={`modal-close-button`}\n                  tooltipPlacement=\"left\"\n                  title={localize(\"close\")}\n                  icon=\"mdi:close\"\n                  disableRipples\n                  disableScale\n                />\n              </Row>\n            </ModalHeader>\n            <ModalOverflow className={`modal-overflow`}>\n              <ModalInner\n                className={\"modal-inner\"}\n                style={{\n                  transformOrigin: \"top\",\n                }}\n              >\n                {children}\n              </ModalInner>\n            </ModalOverflow>\n          </ModalContainer>\n        </Fragment>\n      )}\n    </>,\n    portalRoot ?? win.document.body,\n  );\n}\n/** The modal component was built to easily generate a popup dialog from any element by passing through an \"open\" value */\nexport const Modal = memo(function Modal(props: ModalProps) {\n  return (\n    <ErrorBoundary {...fallback({ prefix: \"Modal\" })}>\n      <InternalModal {...props} />\n    </ErrorBoundary>\n  );\n});\n","import { AllDomains, EntityName, CamelToSnake } from \"@typings\";\nimport { snakeCase } from \"lodash\";\n\nexport const computeDomain = <E extends EntityName | \"unknown\">(entityId: E): CamelToSnake<AllDomains> =>\n  snakeCase(entityId.substring(0, entityId.indexOf(\".\"))) as CamelToSnake<AllDomains>;\n","import {\n  Column,\n  EntityAttributes,\n  FabCard,\n  LogBookRenderer,\n  Modal,\n  type ModalAlarmControlsProps,\n  type ModalCameraControlsProps,\n  type ModalClimateControlsProps,\n  type ModalCoverControlsProps,\n  type ModalLightControlsProps,\n  type ModalMediaPlayerControlsProps,\n  type ModalPersonControlsProps,\n  type ModalSwitchControlsProps,\n  type ModalWeatherControlsProps,\n  type ModalVacuumControlsProps,\n} from \"@components\";\nimport styled from \"@emotion/styled\";\nimport {\n  useEntity,\n  useHass,\n  useDevice,\n  localize,\n  type AllDomains,\n  type EntityName,\n  type ExtractDomain,\n  type FilterByDomain,\n} from \"@hakit/core\";\nimport { Icon } from \"@iconify/react\";\nimport { computeDomain } from \"@utils/computeDomain\";\nimport { lowerCase, startCase } from \"lodash\";\nimport { Suspense, lazy, useCallback, useMemo, useRef, useState, ReactNode } from \"react\";\nimport type { ModalProps } from \"..\";\n\nconst Separator = styled.div`\n  height: 30px;\n  width: 1px;\n  background-color: var(--ha-S400);\n`;\n\nconst State = styled.div`\n  font-weight: 400;\n  font-size: 36px;\n  line-height: 44px;\n  user-select: none;\n  &:first-letter {\n    text-transform: capitalize;\n  }\n`;\n\nconst Updated = styled.div`\n  font-style: normal;\n  font-weight: 500;\n  font-size: 16px;\n  line-height: 24px;\n  letter-spacing: 0.1px;\n  padding: 4px 0px;\n  margin-bottom: 20px;\n  user-select: none;\n  -webkit-tap-highlight-color: transparent;\n  margin-bottom: 2rem;\n`;\n\nconst StyledIcon = styled(Icon)`\n  font-size: 2rem;\n`;\n\ninterface ModalPropsByDomain {\n  light: ModalLightControlsProps;\n  climate: ModalClimateControlsProps;\n  weather: ModalWeatherControlsProps;\n  switch: ModalSwitchControlsProps;\n  camera: ModalCameraControlsProps;\n  cover: ModalCoverControlsProps;\n  media_player: ModalMediaPlayerControlsProps;\n  person: ModalPersonControlsProps;\n  vacuum: ModalVacuumControlsProps;\n  alarm_control_panel: ModalAlarmControlsProps;\n}\n\nexport type ModalPropsHelper<D extends AllDomains> = D extends keyof ModalPropsByDomain\n  ? ModalPropsByDomain[D]\n  : {\n      entity: EntityName;\n    };\n\n// remove children from ModalProps, and make it optional\ntype OptionalChildrenModalProps = Omit<ModalProps, \"children\"> & {\n  children?: React.ReactNode;\n};\n\nexport type ModalByEntityDomainProps<E extends EntityName> = ModalPropsHelper<ExtractDomain<E>> & {\n  hideState?: boolean;\n  hideUpdated?: boolean;\n  hideAttributes?: boolean;\n  hideLogbook?: boolean;\n  hideDeviceSettings?: boolean;\n  stateTitle?: ReactNode;\n  /** There's currently a few default header actions, this will allow you to place your own actions in a different order @default 'start' */\n  headerActionsPosition?: \"start\" | \"middle\" | \"end\";\n  /** This will hide the default lazy component thats loaded as the children of the modal if you want to create your own */\n  hideDefaultLayout?: boolean;\n} & OptionalChildrenModalProps;\n\nfunction getLazyModal<D extends keyof ModalPropsByDomain>(\n  domain: D,\n): (() => Promise<{ default: React.ComponentType<ModalPropsByDomain[D]> }>) | null {\n  const modals: { [K in keyof ModalPropsByDomain]: () => Promise<{ default: React.ComponentType<ModalPropsByDomain[K]> }> } = {\n    cover: () => import(\"./Cover\"),\n    alarm_control_panel: () => import(\"./AlarmControlPanel\"),\n    camera: () => import(\"./Camera\"),\n    light: () => import(\"./Light\"),\n    media_player: () => import(\"./MediaPlayer\"),\n    person: () => import(\"./Person\"),\n    switch: () => import(\"./Switch\"),\n    vacuum: () => import(\"./Vacuum\"),\n    weather: () => import(\"./Weather\"),\n    climate: () => import(\"./Climate\"),\n  };\n  return modals[domain] ?? null;\n}\n\nexport function ModalByEntityDomain<E extends EntityName>({\n  entity,\n  hideState,\n  hideUpdated,\n  hideAttributes,\n  hideDeviceSettings,\n  headerActionsPosition = \"start\",\n  headerActions,\n  hideLogbook = false,\n  hideDefaultLayout = false,\n  children,\n  ...rest\n}: ModalByEntityDomainProps<E>) {\n  const { joinHassUrl } = useHass.getState().helpers;\n  const [showLogbook, setShowLogbook] = useState(false);\n  const _entity = useEntity(entity);\n  const device = useDevice(entity);\n\n  const openDevice = useCallback(() => {\n    if (typeof window === \"undefined\") return;\n    // if we have a device value, open it up in a new tab and join the url with joinHassUrl\n    if (device && device.device_id) {\n      window.open(joinHassUrl(`config/devices/device/${device.device_id}`), \"_blank\");\n    }\n  }, [device, joinHassUrl]);\n\n  const [modalProps, childProps] = useMemo(() => {\n    const { open, id, title, description, onClose, backdropProps, stateTitle, ...childProps } = rest;\n    return [\n      {\n        open,\n        id,\n        title,\n        description,\n        onClose,\n        backdropProps,\n        stateTitle,\n      },\n      childProps,\n    ];\n  }, [rest]);\n\n  const domain = computeDomain(entity);\n\n  const onStateChange = useCallback((value: string) => {\n    if (!stateRef.current) return;\n    stateRef.current.innerText = value;\n  }, []);\n\n  const LazyModalComponent = useMemo(() => {\n    const modal = getLazyModal(domain as keyof ModalPropsByDomain);\n    if (!modal) return null;\n    return lazy(modal);\n  }, [domain]);\n\n  const defaultChildren = useMemo(() => {\n    if (!LazyModalComponent || hideDefaultLayout) return null;\n    const fallback = (\n      <Column fullWidth fullHeight>\n        <StyledIcon icon=\"eos-icons:three-dots-loading\" className=\"preloader-loading-icon\" />\n      </Column>\n    );\n    if (domain === \"person\") {\n      return (\n        <Suspense fallback={fallback}>\n          <LazyModalComponent\n            entity={entity as FilterByDomain<EntityName, \"person\">}\n            mapHeight={modalProps.open ? 300 : 0}\n            {...childProps}\n          />\n        </Suspense>\n      );\n    }\n    return (\n      <Suspense fallback={fallback}>\n        <LazyModalComponent\n          // @ts-expect-error types are impossible to fix at this level, cast it as anything\n          entity={entity as FilterByDomain<EntityName, \"light\">}\n          onStateChange={onStateChange}\n          {...{\n            ...childProps,\n            entity,\n          }}\n        />\n      </Suspense>\n    );\n  }, [entity, hideDefaultLayout, LazyModalComponent, childProps, onStateChange, domain, modalProps.open]);\n\n  const stateRef = useRef<HTMLDivElement>(null);\n  const titleValue = useMemo(() => {\n    return modalProps.stateTitle ?? startCase(lowerCase(`${_entity.state}${_entity.attributes.unit_of_measurement ?? \"\"}`));\n  }, [_entity, modalProps.stateTitle]);\n\n  return (\n    <Modal\n      {...modalProps}\n      headerActions={() => (\n        <>\n          {/* Logbook Back Button */}\n          {!hideLogbook && showLogbook && (\n            <FabCard\n              title={localize(\"device\")}\n              tooltipPlacement=\"left\"\n              icon=\"mdi:arrow-back\"\n              size={30}\n              onClick={() => setShowLogbook(false)}\n            />\n          )}\n\n          {/* Header actions at the start */}\n          {headerActionsPosition === \"start\" && headerActions && headerActions()}\n\n          {/* Logbook Open Button */}\n          {!hideLogbook && !showLogbook && (\n            <FabCard\n              title={localize(\"activity\")}\n              tooltipPlacement=\"left\"\n              icon=\"mdi:graph-box\"\n              size={30}\n              onClick={() => setShowLogbook(true)}\n            />\n          )}\n\n          {/* Header actions in the middle */}\n          {headerActionsPosition === \"middle\" && headerActions && headerActions()}\n\n          {/* Device Settings (Cog) */}\n          {device && device.device_id && !hideDeviceSettings && (\n            <FabCard title={localize(\"open_device_settings\")} tooltipPlacement=\"left\" icon=\"mdi:cog\" size={30} onClick={openDevice} />\n          )}\n\n          {/* Header actions at the end */}\n          {headerActionsPosition === \"end\" && headerActions && headerActions()}\n\n          {/* Separator if either logbook or settings exists */}\n          {(!hideLogbook || (device && device.device_id && !hideDeviceSettings)) && <Separator />}\n        </>\n      )}\n    >\n      {showLogbook ? (\n        <LogBookRenderer entity={entity} />\n      ) : (\n        <>\n          {(!hideUpdated || !hideState) && (\n            <Column fullWidth>\n              {!hideState && (\n                <State className=\"state\" ref={stateRef}>\n                  {titleValue}\n                </State>\n              )}\n              {!hideUpdated && <Updated className=\"last-updated\">{_entity.custom.relativeTime}</Updated>}\n            </Column>\n          )}\n          {children ?? null}\n          {defaultChildren}\n          {!hideAttributes && <EntityAttributes entity={entity} />}\n        </>\n      )}\n    </Modal>\n  );\n}\n","import { useState } from \"react\";\nimport styled from \"@emotion/styled\";\nimport { keyframes } from \"@emotion/react\";\nimport {\n  ButtonGroup,\n  ButtonGroupButton,\n  Column,\n  FabCard,\n  Row,\n  type ButtonGroupProps,\n  type ButtonGroupButtonProps,\n  useBreakpoint,\n} from \"@components\";\nimport { useEntity, type HassEntityWithService, type EntityName, batteryIconByLevel, localize } from \"@hakit/core\";\nimport { useDebounce } from \"react-use\";\nimport { getToolbarActions } from \"./shared\";\nimport { VacuumImage } from \"./VacuumImage\";\n\ninterface Shortcut extends Partial<Omit<ButtonGroupButtonProps<EntityName>, \"onClick\">> {\n  onClick: (entity: HassEntityWithService<\"vacuum\">) => void;\n}\nexport interface VacuumControlsProps extends React.ComponentPropsWithoutRef<\"div\"> {\n  entity: `${\"vacuum\"}.${string}`;\n  /** provide a list of shorts you want to support/display in the UI, you can call your own service if need be! */\n  shortcuts?: Shortcut[];\n  /** hide the fan mode shown in the popup @default false */\n  hideFanModes?: boolean;\n  /** hide the current battery level @default false */\n  hideCurrentBatteryLevel?: boolean;\n  /** hide the state of the vacuum entity @default false */\n  hideState?: boolean;\n  /** hide the last updated time @default false */\n  hideUpdated?: boolean;\n  /** hide the toolbar @default false */\n  hideToolbar?: boolean;\n  /** change the default custom image to display @default vacuum.png */\n  customImage?: string;\n  /** the text/node to render when locating @default 'Locate...' in preferred language */\n  locatingNode?: React.ReactNode;\n  /** additional props to pass to the button-group */\n  buttonGroupProps?: Omit<ButtonGroupProps, \"children\">;\n}\n\nconst VacuumSize = styled.div`\n  height: 100%;\n  max-height: 45vh;\n  min-height: 300px;\n  margin-bottom: 2rem;\n  position: relative;\n`;\n\nconst ModeColumn = styled(Column)`\n  font-size: 0.8rem;\n`;\n\nconst Push = styled.span`\n  padding: 1rem;\n`;\n\nconst spin = keyframes`\n  from {\n    transform:rotate(0deg);\n  }\n  to {\n    transform:rotate(360deg);\n  }\n`;\n\nconst FanMode = styled(FabCard)<{\n  speed?: string;\n}>`\n  animation-name: ${spin};\n  animation-duration: ${(props) => {\n    const speed = (props.speed || \"\").toLowerCase().trim();\n    const silent = speed.includes(\"silent\");\n    const standard = speed.includes(\"standard\");\n    const medium = speed.includes(\"medium\");\n    const turbo = speed.includes(\"turbo\");\n    if (silent) return \"4s\";\n    if (standard) return \"2.5s\";\n    if (medium) return \"1.8s\";\n    if (turbo) return \"0.7s\";\n    return \"2s\";\n  }};\n  animation-iteration-count: infinite;\n  animation-timing-function: linear;\n`;\n\ninterface VacuumToolbarProps {\n  /** the vacuum entity to control */\n  entity: `${\"vacuum\"}.${string}`;\n  /** hide the toolbar @default false */\n  hideToolbar?: boolean;\n  /** provide a list of shorts you want to support/display in the UI, you can call your own service if need be! */\n  shortcuts?: Shortcut[];\n  /** a callback when the locate button is clicked */\n  onLocate?: () => void;\n  /** additional props to pass to the button-group */\n  buttonGroupProps?: Omit<ButtonGroupProps, \"children\">;\n}\n\nexport function VacuumToolbar({\n  entity: _entity,\n  shortcuts,\n  onLocate,\n  hideToolbar = false,\n  buttonGroupProps,\n  ...rest\n}: VacuumToolbarProps) {\n  const entity = useEntity(_entity);\n  const device = useBreakpoint();\n\n  if (hideToolbar) {\n    return null;\n  }\n  const actions = getToolbarActions({ entity, shortcuts, onLocate });\n  return (\n    <Row gap=\"0.5rem\" {...rest}>\n      <ButtonGroup\n        wrap=\"nowrap\"\n        alignItems=\"center\"\n        justifyContent=\"center\"\n        orientation=\"horizontal\"\n        thickness={device.xxs ? 80 : 80}\n        maintainAspectRatio\n        {...buttonGroupProps}\n      >\n        {actions.map((action, index) => (\n          <ButtonGroupButton\n            key={index}\n            iconProps={{\n              color: action?.active ? \"var(--ha-300)\" : undefined,\n            }}\n            rippleProps={{\n              preventPropagation: true,\n            }}\n            // @ts-expect-error - cannot assume the types at this level because of how generics work\n            onClick={(_, event) => action?.onClick?.(entity, event)}\n            {...action}\n          />\n        ))}\n      </ButtonGroup>\n    </Row>\n  );\n}\n\n/** The VacuumControls component can be used in isolation of the VacuumCard and will display the some information that's displayed\n * in the more info panel when the component expands.\n */\nexport function VacuumControls({\n  entity: _entity,\n  hideCurrentBatteryLevel = false,\n  hideFanModes = false,\n  hideToolbar = false,\n  customImage,\n  shortcuts,\n  buttonGroupProps,\n  ...rest\n}: VacuumControlsProps) {\n  const entity = useEntity(_entity);\n  const isDocked = entity.state === \"docked\";\n  const { battery_level, fan_speed, fan_speed_list } = entity.attributes || {};\n  const [internalFanSpeed, setInternalFanSpeed] = useState(fan_speed);\n\n  useDebounce(\n    () => {\n      if (typeof internalFanSpeed === \"string\") {\n        entity.service.setFanSpeed({\n          serviceData: {\n            fan_speed: internalFanSpeed,\n          },\n        });\n      }\n    },\n    200,\n    [internalFanSpeed],\n  );\n  const fanSpeedList = fan_speed_list ?? [];\n  const shouldShowFanControls = !hideFanModes && !isDocked && fanSpeedList.length > 0;\n  const shouldShowBatteryLevel = !hideCurrentBatteryLevel && typeof battery_level === \"number\";\n\n  return (\n    <Column fullHeight fullWidth wrap=\"nowrap\" {...rest}>\n      <VacuumSize>\n        <Column gap=\"0.5rem\">\n          <VacuumImage src={customImage} className={entity.state} />\n          {(shouldShowBatteryLevel || shouldShowFanControls) && (\n            <Row\n              style={{\n                padding: \"1rem 0\",\n              }}\n            >\n              {shouldShowFanControls && (\n                <ModeColumn gap=\"0.5rem\">\n                  <FanMode\n                    size={40}\n                    disabled={isDocked}\n                    title={internalFanSpeed}\n                    speed={isDocked ? undefined : internalFanSpeed}\n                    active={!isDocked}\n                    icon=\"mdi:fan\"\n                    onClick={() => {\n                      const currentIndex = fanSpeedList.findIndex(\n                        (speed) => speed.toLowerCase() === (internalFanSpeed ?? \"\").toLowerCase(),\n                      );\n                      const fanSpeed = fanSpeedList[currentIndex + 1] ? fanSpeedList[currentIndex + 1] : fanSpeedList[0];\n                      setInternalFanSpeed(fanSpeed);\n                      entity.service.setFanSpeed({\n                        serviceData: {\n                          fan_speed: fanSpeed,\n                        },\n                      });\n                    }}\n                  />\n                  <div>{localize(\"fan_speed\")}</div>\n                  {internalFanSpeed}\n                </ModeColumn>\n              )}\n              {shouldShowBatteryLevel && shouldShowFanControls && (\n                <>\n                  <Push />\n                </>\n              )}\n              {shouldShowBatteryLevel && (\n                <ModeColumn gap=\"0.5rem\">\n                  <FabCard size={40} disabled={isDocked} title={`${battery_level}%`} icon={batteryIconByLevel(battery_level)} />\n                  <div>{localize(\"battery_level\")}</div>\n                  {`${battery_level}%`}\n                </ModeColumn>\n              )}\n            </Row>\n          )}\n          <VacuumToolbar entity={_entity} hideToolbar={hideToolbar} shortcuts={shortcuts} buttonGroupProps={buttonGroupProps} />\n        </Column>\n      </VacuumSize>\n    </Column>\n  );\n}\n","import { useRef, useEffect, useCallback } from \"react\";\nimport { css } from \"@emotion/react\";\nimport styled from \"@emotion/styled\";\nimport { useGesture } from \"@use-gesture/react\";\nimport { fallback, mq } from \"@components\";\nimport { ErrorBoundary } from \"react-error-boundary\";\n\nexport interface ControlSliderProps extends Omit<React.ComponentPropsWithoutRef<\"div\">, \"onChange\"> {\n  /** the orientation of the slider @default true */\n  vertical?: boolean;\n  /** hide the handle on the slider @default false */\n  showHandle?: boolean;\n  /** the value of the slider, this should equal to or between the min/max values */\n  value: number;\n  /** the mode of the slider @default start */\n  mode?: \"start\" | \"end\" | \"cursor\";\n  /** the minimum value of the slider @default 0 */\n  min?: number;\n  /** the max value of the slider @default 100 */\n  max?: number;\n  /** the thickness of the slider @default 40 */\n  thickness?: number;\n  /** the border radius of the slider @default 10 */\n  borderRadius?: number;\n  /** the step increment of the slider @default 1 */\n  step?: number;\n  /** should the slider be disabled @default false*/\n  disabled?: boolean;\n  /** the colour to theme the slider, this should be in rgb format or a css color value [number, number, number] @default [70, 70, 70] */\n  sliderColor?: [number, number, number] | string;\n  /** called when the slider is being dragged around @default undefined */\n  onChange?: (value: number) => void;\n  /** called when the user has finished interacting with the slider @default undefined */\n  onChangeApplied?: (value: number) => void;\n  /** when true, minimum value (>0) is visually mapped to a baseline fill (12%) so it's still visible */\n  clampValueToBaseline?: boolean;\n}\n\nconst Slider = styled.div<Pick<ControlSliderProps, \"disabled\" | \"sliderColor\" | \"vertical\" | \"showHandle\" | \"thickness\" | \"borderRadius\">>`\n  ${(props) => {\n    const defaultColor = [70, 70, 70];\n    let color = `rgb(${defaultColor.join(\", \")})`;\n    if (!props.disabled) {\n      if (typeof props.sliderColor === \"string\") {\n        color = props.sliderColor;\n      } else {\n        color = `rgb(${(props.sliderColor || defaultColor).join(\",\")})`;\n      }\n    }\n    return `\n      \n      touch-action: none;\n      --ha-slider-control-thickness: ${props.thickness || 40}px;\n      --ha-slider-control-border-radius: ${props.borderRadius || 10}px;\n      --ha-slider-control-handle-size: 4px;\n      --ha-slider-control-handle-margin: calc(var(--ha-slider-control-thickness) / 8);\n      --ha-slider-control-slider-size: ${\n        props.showHandle ? \"calc(100% - 2 * var(--ha-slider-control-handle-margin) - var(--ha-slider-control-handle-size))\" : \"100%\"\n      };\n      \n      border-radius: var(--ha-slider-control-border-radius);\n      outline: 0px;\n      &:focus-visible {\n        box-shadow: 0 0 0 2px ${color};\n      }\n      &:not([vertical]) {\n        width: 100%;\n        height: var(--ha-slider-control-thickness);\n        max-width: 420px;\n        min-width: 320px;\n      }\n      &[vertical] {\n        width: var(--ha-slider-control-thickness);\n        height: 45vh;\n        max-height: 320px;\n        min-height: 200px;\n        ${mq(\n          [\"xxs\"],\n          `\n          min-height: 0;\n          height: 35vh;\n          max-height: 100%;\n        `,\n        )}\n      }\n      .slider {\n        position: relative;\n        height: 100%;\n        width: 100%;\n        border-radius: var(--ha-slider-control-border-radius);\n        transform: translateZ(0px);\n        overflow: hidden;\n        cursor: pointer;\n      }\n      .slider * {\n        pointer-events: none;\n      }\n      .slider-track-background {\n        position: absolute;\n        top: 0px;\n        left: 0px;\n        height: 100%;\n        width: 100%;\n        background: ${color};\n        opacity: 0.2;\n      }\n      .slider-track-bar {\n        position: absolute;\n        height: 100%;\n        width: 100%;\n        background-color: ${color};\n        transition: transform 180ms ease-in-out, background-color 180ms ease-in-out;                \n        &:after {\n          display: ${props.showHandle ? \"block\" : \"none\"};\n          content: \"\";\n          position: absolute;\n          margin: auto;\n          border-radius: var(--ha-slider-control-handle-size);\n          background-color: white;\n        }\n      }\n      .slider-track-cursor {\n        position: absolute;\n        background-color: ${color};\n        border-radius: var(--ha-slider-control-handle-size);\n        transition:\n          left 180ms ease-in-out,\n          bottom 180ms ease-in-out;\n        box-shadow: 0 2px 5px rgba(0, 0, 0, 0.2);\n      }\n      &.horizontal {\n        .slider-track-bar {\n          top: 0;\n          left: 0;\n          width: calc(var(--value, 0) * 100%);\n          height: 100%;\n          transition: width 180ms ease-in-out, background-color 180ms ease-in-out;\n          border-radius: 0 var(--ha-slider-control-border-radius) var(--ha-slider-control-border-radius) 0;\n          overflow: hidden;\n          &:after {\n            top: 0;\n            bottom: 0;\n            right: var(--ha-slider-control-handle-margin);\n            height: 50%;\n            width: var(--ha-slider-control-handle-size);\n            opacity: calc(var(--value, 0));\n            transition: opacity 120ms ease-in-out;\n          }\n          &.end {\n            right: 0;\n            left: initial;\n            width: calc(var(--value, 0) * 100%);\n            border-radius: var(--ha-slider-control-border-radius) 0 0 var(--ha-slider-control-border-radius);\n            &:after {\n              right: initial;\n              left: var(--ha-slider-control-handle-margin);\n            }\n          }\n        }\n        .slider-track-cursor {\n          top: 0;\n          bottom: 0;\n          left: calc(var(--value, 0) * (100% - calc(var(--ha-slider-control-thickness) / 4)));\n          width: calc(var(--ha-slider-control-thickness) / 4);\n          right: 0;\n          height: calc(var(--ha-slider-control-thickness) / 4);\n          &:after {\n            height: 50%;\n            width: var(--ha-slider-control-handle-size);\n          }\n        }\n      }\n      &.vertical {\n        .slider-track-bar {\n          bottom: 0;\n          left: 0;\n          width: 100%;\n          height: calc(var(--value, 0) * 100%);\n          transition: height 180ms ease-in-out, background-color 180ms ease-in-out;\n          border-radius: var(--ha-slider-control-border-radius) var(--ha-slider-control-border-radius) 0 0;\n          overflow: hidden;\n          &:after {\n            top: var(--ha-slider-control-handle-margin);\n            right: 0;\n            left: 0;\n            bottom: initial;\n            width: 50%;\n            height: var(--ha-slider-control-handle-size);\n            opacity: calc(var(--value, 0));\n            transition: opacity 120ms ease-in-out;\n          }\n          &.end {\n            top: 0;\n            bottom: initial;\n            height: calc(var(--value, 0) * 100%);\n            border-radius: 0 0 var(--ha-slider-control-border-radius) var(--ha-slider-control-border-radius);\n            &:after {\n              top: initial;\n              bottom: var(--ha-slider-control-handle-margin);\n            }\n          }\n        }\n        .slider-track-cursor {\n          top: initial;\n          right: 0;\n          left: 0;\n          bottom: calc(var(--value, 0) * (100% - calc(var(--ha-slider-control-thickness) / 4)));\n          height: calc(var(--ha-slider-control-thickness) / 4);\n          width: 100%;\n          &:after {\n            width: 50%;\n            height: var(--ha-slider-control-handle-size);\n          }\n        }\n      }\n      &[dragging] .slider-track-bar,\n      &[dragging] .slider-track-cursor {\n        transition: none;\n      }\n      &.disabled {\n        cursor: not-allowed;\n        > * {\n          cursor: not-allowed;\n        }\n      }\n    `;\n  }}\n`;\n\nconst SliderHolder = styled.div``;\nconst SliderTrackBackground = styled.div``;\nconst SliderTrackBar = styled.div``;\n\nfunction InternalControlSlider({\n  vertical = true,\n  disabled = false,\n  showHandle = true,\n  min = 1,\n  max = 100,\n  step = 1,\n  value,\n  mode = \"start\",\n  thickness,\n  borderRadius,\n  sliderColor = [70, 70, 70],\n  onChangeApplied,\n  onChange,\n  clampValueToBaseline = true,\n  cssStyles,\n  className,\n  ...rest\n}: ControlSliderProps) {\n  const trackBarRef = useRef<HTMLDivElement>(null);\n  const sliderRef = useRef<HTMLDivElement>(null);\n  const parentRef = useRef<HTMLDivElement>(null);\n  const inlineValue = useRef(value);\n  const timerRef = useRef<NodeJS.Timeout | undefined>(undefined);\n  const boundedValue = useCallback(\n    (value: number) => {\n      return Math.min(Math.max(value, min), max);\n    },\n    [min, max],\n  );\n\n  const valueToPercentage = useCallback(\n    (val: number) => {\n      const clamped = boundedValue(val);\n      const raw = (clamped - min) / (max - min);\n      if (!clampValueToBaseline) return raw; // direct mapping\n      const baseline = min > 0 ? 0.09 : 0; // baseline only when min > 0\n      if (raw <= 0) return baseline;\n      return baseline + raw * (1 - baseline);\n    },\n    [boundedValue, clampValueToBaseline, min, max],\n  );\n\n  const percentageToValue = useCallback(\n    (value: number) => {\n      return (max - min) * value + min;\n    },\n    [min, max],\n  );\n\n  const steppedValue = useCallback(\n    (value: number) => {\n      return Math.round(value / step) * step;\n    },\n    [step],\n  );\n\n  const triggerOnChange = useCallback(\n    (updatedValue: number) => {\n      if (timerRef.current) clearTimeout(timerRef.current);\n      if (updatedValue === value || typeof onChangeApplied !== \"function\") return;\n      timerRef.current = setTimeout(() => {\n        onChangeApplied(updatedValue);\n      }, 100);\n    },\n    [onChangeApplied, value],\n  );\n\n  const _getPercentageFromEvent = useCallback(\n    (xy: [number, number], target: HTMLElement) => {\n      const [x, y] = xy;\n      if (vertical) {\n        const offset = target.getBoundingClientRect().top;\n        const total = target.clientHeight;\n        return Math.max(Math.min(1, 1 - (y - offset) / total), 0);\n      }\n      const offset = target.getBoundingClientRect().left;\n      const total = target.clientWidth;\n      return Math.max(Math.min(1, (x - offset) / total), 0);\n    },\n    [vertical],\n  );\n  const setValue = useCallback(\n    (updatedValue: number) => {\n      if (!trackBarRef.current) return;\n      inlineValue.current = boundedValue(updatedValue);\n      trackBarRef.current.style.setProperty(\n        \"--value\",\n        disabled ? (mode === \"start\" ? `${min}` : mode === \"end\" ? `${max}` : \"0\") : `${valueToPercentage(updatedValue)}`,\n      );\n    },\n    [valueToPercentage, boundedValue, disabled, min, max, mode],\n  );\n\n  useEffect(() => {\n    setValue(value);\n  }, [value, setValue]);\n\n  useEffect(() => {\n    if (!parentRef.current) return;\n    if (vertical) {\n      parentRef.current.setAttribute(\"vertical\", \"\");\n    } else {\n      parentRef.current.removeAttribute(\"vertical\");\n    }\n  }, [vertical]);\n\n  const setPressed = function (pressed: boolean) {\n    if (!parentRef.current) return;\n    if (pressed) {\n      parentRef.current.setAttribute(\"dragging\", \"\");\n    } else {\n      parentRef.current.removeAttribute(\"dragging\");\n    }\n  };\n\n  const bind = useGesture(\n    {\n      onDrag: (state) => {\n        if (disabled) return;\n        const percentage = _getPercentageFromEvent(state.values, state.target as HTMLElement);\n        setPressed(state.dragging === true);\n        setValue(percentageToValue(percentage));\n        if (typeof onChange === \"function\") onChange(inlineValue.current);\n      },\n      onDragStart: () => {\n        if (disabled) return;\n        setPressed(true);\n        setValue(inlineValue.current);\n      },\n      onDragEnd: (state) => {\n        if (disabled) return;\n        setPressed(false);\n        const percentage = _getPercentageFromEvent(state.values, state.target as HTMLElement);\n        setValue(steppedValue(percentageToValue(percentage)));\n        triggerOnChange(inlineValue.current);\n      },\n      onClick: (state) => {\n        if (disabled) return;\n        const x = state.event.clientX;\n        const y = state.event.clientY;\n        const percentage = _getPercentageFromEvent([x, y], state.event.target as HTMLElement);\n        setValue(steppedValue(percentageToValue(percentage)));\n        triggerOnChange(inlineValue.current);\n      },\n    },\n    {\n      drag: {\n        filterTaps: true,\n      },\n    },\n  );\n\n  return (\n    <Slider\n      ref={parentRef}\n      className={`${className ?? \"\"} slider-host ${disabled ? \"disabled\" : \"\"} ${vertical ? \"vertical\" : \"horizontal\"}`}\n      css={css`\n        ${cssStyles ?? \"\"}\n      `}\n      showHandle={showHandle && !disabled}\n      sliderColor={sliderColor}\n      vertical={vertical}\n      thickness={thickness}\n      borderRadius={borderRadius}\n      disabled={disabled}\n      {...bind()}\n      {...rest}\n    >\n      <SliderHolder ref={sliderRef} className=\"slider\">\n        <SliderTrackBackground className=\"slider-track-background\" />\n        {mode === \"cursor\" ? (\n          inlineValue.current != null ? (\n            <div className=\"slider-track-cursor\" ref={trackBarRef}></div>\n          ) : null\n        ) : (\n          <SliderTrackBar className={`slider-track-bar ${mode}`} ref={trackBarRef} />\n        )}\n      </SliderHolder>\n    </Slider>\n  );\n}\n\n/** A interactive slider to control values ranging between two other values, eg brightness on a light, or curtain position etc.. */\nexport function ControlSlider(props: ControlSliderProps) {\n  return (\n    <ErrorBoundary {...fallback({ prefix: \"ControlSlider\" })}>\n      <InternalControlSlider {...props} />\n    </ErrorBoundary>\n  );\n}\n","import { useState, useRef, useEffect, useCallback } from \"react\";\nimport styled from \"@emotion/styled\";\nimport { useIcon } from \"@hakit/core\";\nimport { fallback } from \"@components\";\nimport { ErrorBoundary } from \"react-error-boundary\";\nimport { css } from \"@emotion/react\";\n\nconst Switch = styled.div`\n  display: block;\n  --ha-control-switch-on-color: var(--ha-A400);\n  --ha-control-switch-off-color: rgb(70, 70, 70);\n  --ha-control-switch-background-opacity: 0.2;\n  --ha-control-switch-thickness: 100px;\n  --ha-control-switch-border-radius: 12px;\n  --ha-control-switch-padding: 4px;\n  --mdc-icon-size: 20px;\n  box-sizing: border-box;\n  user-select: none;\n  cursor: pointer;\n  border-radius: var(--ha-control-switch-border-radius);\n  outline: none;\n  transition: box-shadow 180ms ease-in-out;\n  -webkit-tap-highlight-color: transparent;\n  &:focus-visible {\n    box-shadow: 0 0 0 2px var(--ha-control-switch-off-color);\n  }\n  &[checked=\"true\"]:focus-visible {\n    box-shadow: 0 0 0 2px var(--ha-control-switch-on-color);\n  }\n  .switch {\n    box-sizing: border-box;\n    position: relative;\n    height: 100%;\n    width: 100%;\n    border-radius: var(--ha-control-switch-border-radius);\n    overflow: hidden;\n    padding: var(--ha-control-switch-padding);\n    display: flex;\n  }\n  .switch .background {\n    position: absolute;\n    top: 0;\n    left: 0;\n    height: 100%;\n    width: 100%;\n    background-color: var(--ha-control-switch-off-color);\n    transition: background-color 180ms ease-in-out;\n    opacity: var(--ha-control-switch-background-opacity);\n  }\n  .switch .button {\n    width: 50%;\n    height: 100%;\n    background: lightgrey;\n    border-radius: calc(var(--ha-control-switch-border-radius) - var(--ha-control-switch-padding));\n    transition:\n      transform 180ms ease-in-out,\n      background-color 180ms ease-in-out;\n    background-color: var(--ha-control-switch-off-color);\n    color: white;\n    display: flex;\n    align-items: center;\n    justify-content: center;\n  }\n  &[checked=\"true\"] .switch .background {\n    background-color: var(--ha-control-switch-on-color);\n  }\n  &[checked=\"true\"] .switch .button {\n    transform: translateX(100%);\n    background-color: var(--ha-control-switch-on-color);\n  }\n  &[reversed=\"true\"] .switch {\n    flex-direction: row-reverse;\n  }\n  &[reversed=\"true\"][checked=\"true\"] .switch .button {\n    transform: translateX(-100%);\n  }\n  &[vertical=\"false\"] {\n    height: var(--ha-control-switch-thickness);\n    max-width: 420px;\n    min-width: 320px;\n  }\n  &[vertical=\"true\"] {\n    width: var(--ha-control-switch-thickness);\n    height: 45vh;\n    max-height: 320px;\n    min-height: 200px;\n  }\n  &[vertical=\"true\"][checked=\"true\"] .switch .button {\n    transform: translateY(100%);\n  }\n  &[vertical=\"true\"] .switch .button {\n    width: 100%;\n    height: 50%;\n  }\n  &[vertical=\"true\"][reversed=\"true\"] .switch {\n    flex-direction: column-reverse;\n  }\n  &[vertical=\"true\"][reversed=\"true\"][checked=\"true\"] .switch .button {\n    transform: translateY(-100%);\n  }\n  &[disabled=\"true\"] {\n    opacity: 0.5;\n    cursor: not-allowed;\n  }\n`;\nconst Background = styled.div``;\nconst Button = styled.div``;\n\nexport interface ControlToggleProps extends Omit<React.ComponentPropsWithoutRef<\"div\">, \"checked\" | \"onChange\"> {\n  /** should the switch be disabled */\n  disabled?: boolean;\n  /** should the switch be vertical or horizontal @default true */\n  vertical?: boolean;\n  /** should you reverse the order of the switch by default @default false */\n  reversed?: boolean;\n  /** If the switch is checked */\n  checked?: boolean;\n  /** the thickness of the switch @default 40 */\n  thickness?: number;\n  /** the icon to use when the switch is on @default mdi:power */\n  onIcon?: string;\n  /** the icon to use when the switch is off @default mdi:power-off */\n  offIcon?: string;\n  /** called when the switch is toggled */\n  onChange?: (checked: boolean) => void;\n  /** switch color as a css value, rgb, rgba, hex etc.. */\n  color?: string;\n}\n\nconst InternalControlToggle = ({\n  disabled = false,\n  vertical = true,\n  reversed = false,\n  thickness = 100,\n  checked: propChecked = false,\n  onIcon: _onIcon,\n  offIcon: _offIcon,\n  onChange,\n  className,\n  cssStyles,\n  id,\n  style,\n  color,\n  ...rest\n}: ControlToggleProps) => {\n  const [checked, setChecked] = useState(propChecked);\n  const switchRef = useRef<HTMLDivElement>(null);\n  const onIcon = useIcon(typeof _onIcon === \"string\" ? _onIcon : \"mdi:power\");\n  const offIcon = useIcon(typeof _offIcon === \"string\" ? _offIcon : \"mdi:power-off\");\n\n  const _toggle = useCallback(() => {\n    if (disabled) return;\n    setChecked(!checked);\n    if (onChange) onChange(!checked);\n  }, [disabled, checked, onChange]);\n\n  useEffect(() => {\n    if (!switchRef.current) return;\n    switchRef.current.setAttribute(\"role\", \"switch\");\n    if (!switchRef.current.hasAttribute(\"tabindex\")) {\n      switchRef.current.setAttribute(\"tabindex\", \"0\");\n    }\n  }, []);\n\n  useEffect(() => {\n    if (!switchRef.current) return;\n    switchRef.current.setAttribute(\"aria-checked\", checked ? \"true\" : \"false\");\n  }, [checked]);\n\n  useEffect(() => {\n    setChecked(propChecked);\n  }, [propChecked]);\n\n  useEffect(() => {\n    if (!switchRef.current) return;\n    switchRef.current.style.setProperty(\"--ha-control-switch-thickness\", `${thickness}px`);\n    switchRef.current.setAttribute(\"vertical\", vertical ? \"true\" : \"false\");\n    switchRef.current.setAttribute(\"reversed\", reversed ? \"true\" : \"false\");\n    switchRef.current.setAttribute(\"disabled\", disabled ? \"true\" : \"false\");\n    switchRef.current.setAttribute(\"checked\", checked ? \"true\" : \"false\");\n    switchRef.current.style.setProperty(\"--ha-control-switch-on-color\", color ?? \"var(--ha-A400)\");\n  }, [checked, vertical, disabled, reversed, thickness, color]);\n\n  return (\n    <Switch\n      ref={switchRef}\n      onClick={_toggle}\n      id={id ?? \"\"}\n      css={css`\n        ${cssStyles ?? \"\"}\n      `}\n      className={`control-switch ${className ?? \"\"}`}\n      style={{\n        ...(style ?? {}),\n      }}\n      {...rest}\n    >\n      <div className=\"switch\">\n        <Background className={`${checked ? \"checked\" : \"\"} background`} />\n        <Button aria-hidden=\"true\" className=\"button\">\n          {checked ? onIcon : offIcon}\n        </Button>\n      </div>\n    </Switch>\n  );\n};\n\n/** A simple control switch similar to home assistant switches, used in the popup for switch entities, you can reverse the order, change orientation, all you need to set is your desired width/height depending on the orientation\n * Note: If you want to use this directly with an element to call the toggle service, you can use the SwitchControls component.\n */\nexport function ControlToggle(props: ControlToggleProps) {\n  return (\n    <ErrorBoundary {...fallback({ prefix: \"ControlToggle\" })}>\n      <InternalControlToggle {...props} />\n    </ErrorBoundary>\n  );\n}\n","import { useGesture } from \"@use-gesture/react\";\nimport { svgArc } from \"./svg-arc\";\nimport { useRef, useEffect, useCallback, useState, useMemo } from \"react\";\nimport styled from \"@emotion/styled\";\nimport { clamp, isNumber } from \"lodash\";\nimport { fallback } from \"@components\";\nimport { ErrorBoundary } from \"react-error-boundary\";\nimport { useDebouncedCallback, useThrottledCallback } from \"use-debounce\";\n\nconst Wrapper = styled.div`\n  --ha-control-slider-track-bg: #464646;\n  --ha-control-slider-track-bg-opacity: 0.3;\n  --ha-control-slider-clear: black;\n  touch-action: none;\n  width: 320px;\n  display: block;\n\n  &:after {\n    display: block;\n    content: \"\";\n    position: absolute;\n    top: -10%;\n    left: -10%;\n    right: -10%;\n    bottom: -10%;\n    background: radial-gradient(50% 50% at 50% 50%, var(--ha-control-slider-color, transparent) 0%, transparent 100%);\n    opacity: 0.15;\n    pointer-events: none;\n  }\n  svg {\n    width: 100%;\n    display: block;\n  }\n  .slider {\n    outline: none;\n  }\n  .interaction {\n    display: flex;\n    fill: none;\n    stroke: transparent;\n    stroke-linecap: round;\n    stroke-width: calc(24px + 2 * 12px);\n    cursor: pointer;\n  }\n  .display {\n    pointer-events: none;\n  }\n  :host([disabled]) #interaction,\n  :host([readonly]) #interaction {\n    cursor: initial;\n  }\n\n  .background {\n    fill: none;\n    stroke: var(--ha-control-slider-track-bg);\n    opacity: var(--ha-control-slider-track-bg-opacity);\n    transition:\n      stroke 180ms ease-in-out,\n      opacity 180ms ease-in-out;\n    stroke-linecap: round;\n    stroke-width: 24px;\n  }\n\n  .arc {\n    fill: none;\n    stroke-linecap: round;\n    stroke-width: 24px;\n    transition:\n      stroke-width 300ms ease-in-out,\n      stroke-dasharray 300ms ease-in-out,\n      stroke-dashoffset 300ms ease-in-out,\n      stroke 180ms ease-in-out,\n      opacity 180ms ease-in-out;\n  }\n\n  .target {\n    fill: none;\n    stroke-linecap: round;\n    stroke-width: 18px;\n    stroke: white;\n    transition:\n      stroke-width 300ms ease-in-out,\n      stroke-dasharray 300ms ease-in-out,\n      stroke-dashoffset 300ms ease-in-out,\n      stroke 180ms ease-in-out,\n      opacity 180ms ease-in-out;\n  }\n\n  .target-border {\n    fill: none;\n    stroke-linecap: round;\n    stroke-width: 24px;\n    stroke: white;\n    transition:\n      stroke-width 300ms ease-in-out,\n      stroke-dasharray 300ms ease-in-out,\n      stroke-dashoffset 300ms ease-in-out,\n      stroke 180ms ease-in-out,\n      opacity 180ms ease-in-out;\n  }\n\n  .current {\n    fill: none;\n    stroke-linecap: round;\n    stroke-width: 8px;\n    stroke: var(--ha-500-contrast);\n    opacity: 0.5;\n    transition:\n      stroke-width 300ms ease-in-out,\n      stroke-dasharray 300ms ease-in-out,\n      stroke-dashoffset 300ms ease-in-out,\n      stroke 180ms ease-in-out,\n      opacity 180ms ease-in-out;\n  }\n\n  .arc-current {\n    stroke: var(--ha-control-slider-clear);\n  }\n\n  .arc-clear {\n    stroke: var(--ha-control-slider-clear);\n  }\n  .arc-colored {\n    opacity: 0.5;\n  }\n  .arc-active {\n    outline: none;\n  }\n  .arc-active:focus-visible {\n    stroke-width: 28px;\n  }\n\n  .pressed .arc,\n  .pressed .target,\n  .pressed .target-border,\n  .pressed .current {\n    transition:\n      stroke-width 300ms ease-in-out,\n      stroke 180ms ease-in-out,\n      opacity 180ms ease-in-out;\n  }\n\n  .inactive .arc,\n  .inactive .arc-current {\n    opacity: 0;\n  }\n\n  .value {\n    stroke: var(--ha-control-slider-color);\n  }\n\n  .low {\n    stroke: var(--ha-control-slider-low-color);\n  }\n\n  .high {\n    stroke: var(--ha-control-slider-high-color);\n  }\n`;\n\nconst MAX_ANGLE = 270;\nconst ROTATE_ANGLE = 360 - MAX_ANGLE / 2 - 90;\nconst RADIUS = 145;\n\nfunction xy2polar(x: number, y: number) {\n  const r = Math.sqrt(x * x + y * y);\n  const phi = Math.atan2(y, x);\n  return [r, phi];\n}\n\nfunction rad2deg(rad: number) {\n  return (rad / (2 * Math.PI)) * 360;\n}\n\ntype ActiveSlider = \"low\" | \"high\" | \"value\";\n\nexport type ControlCircularSliderMode = \"start\" | \"end\" | \"full\";\n\nexport interface ControlSliderCircularProps extends Omit<React.ComponentPropsWithoutRef<\"div\">, \"onChange\"> {\n  /** the value of the slider */\n  value?: number;\n  /** the low end value if low/high values are supported */\n  low?: number;\n  /** the high end value if low/high values are supported */\n  high?: number;\n  /** should the slider become disabled @default false */\n  disabled?: boolean;\n  /** should the slider become readonly @default false */\n  readonly?: boolean;\n  /** should the slider support dual values @default false */\n  dual?: boolean;\n  /** the mode of the slider */\n  mode?: ControlCircularSliderMode;\n  /** should the slider become inactive @default false */\n  inactive?: boolean;\n  /** the label of the slider used for screen readers */\n  label?: string;\n  /** the current value of the slider which places a dot on the slider */\n  current?: number;\n  /** the step of the slider @default 1 */\n  step?: number;\n  /** the minimum value of the slider @default 0 */\n  min?: number;\n  /** the maximum value of the slider @default 100 */\n  max?: number;\n  /** the colors of the slider, if single value, just use color, else use high and low color */\n  colors?: {\n    color?: string;\n    lowColor?: string;\n    highColor?: string;\n  };\n  /** called whenever the value changes, you should not use this to update state but rather display the value visually using refs for example, updates are throttled to 20ms */\n  onChange?: (value: number, type: ActiveSlider) => void;\n  /** called whenever the value changes and the user has finished interacting with the slider */\n  onChangeApplied?: (value: number, type: ActiveSlider) => void;\n}\n\nfunction InternalControlSliderCircular({\n  step = 1,\n  inactive,\n  label,\n  readonly = false,\n  value,\n  low,\n  high,\n  min = 0,\n  max = 100,\n  dual,\n  disabled = false,\n  mode,\n  current,\n  colors = {\n    color: \"tomato\",\n    lowColor: \"blue\",\n    highColor: \"tomato\",\n  },\n  onChange,\n  onChangeApplied,\n  ...rest\n}: ControlSliderCircularProps) {\n  const _sliderRef = useRef<HTMLDivElement>(null);\n  const _svgRef = useRef<SVGSVGElement>(null);\n  const _activeSlider = useRef<ActiveSlider | undefined>(undefined);\n  const _lastSlider = useRef<ActiveSlider | undefined>(undefined);\n  const [localValue, setLocalValue] = useState<number | undefined>(value);\n  const [localLow, setLocalLow] = useState<number | undefined>(low);\n  const [localHigh, setLocalHigh] = useState<number | undefined>(high);\n\n  const trackPath = useMemo(\n    () =>\n      svgArc({\n        x: 0,\n        y: 0,\n        start: 0,\n        end: MAX_ANGLE,\n        r: RADIUS,\n      }),\n    [],\n  );\n\n  const lowValue = dual ? localLow : localValue;\n  const highValue = localHigh;\n\n  useEffect(() => {\n    if (isNumber(value)) setLocalValue(value);\n    if (isNumber(low)) setLocalLow(low);\n    if (isNumber(high)) setLocalLow(high);\n  }, [value, low, high]);\n\n  const _setActiveValue = useCallback((value: number) => {\n    switch (_activeSlider.current) {\n      case \"high\":\n        setLocalHigh(value);\n        break;\n      case \"low\":\n        setLocalLow(value);\n        break;\n      case \"value\":\n        setLocalValue(value);\n        break;\n    }\n  }, []);\n\n  useEffect(() => {\n    if (!_sliderRef.current) return;\n    if (colors.color) _sliderRef.current.style.setProperty(\"--ha-control-slider-color\", colors.color);\n    if (colors.lowColor) _sliderRef.current.style.setProperty(\"--ha-control-slider-low-color\", colors.lowColor);\n    if (colors.highColor) _sliderRef.current.style.setProperty(\"--ha-control-slider-high-color\", colors.highColor);\n  }, [colors]);\n\n  const _valueToPercentage = useCallback(\n    (value: number) => {\n      return (clamp(value, min, max) - min) / (max - min);\n    },\n    [max, min],\n  );\n\n  const _percentageToValue = useCallback(\n    (value: number) => {\n      return (max - min) * value + min;\n    },\n    [max, min],\n  );\n\n  const _steppedValue = useCallback(\n    (value: number) => {\n      return Math.round(value / step) * step;\n    },\n    [step],\n  );\n\n  const _strokeDashArc = useCallback(\n    (from: number, to: number): [string, string] => {\n      const start = _valueToPercentage(from);\n      const end = _valueToPercentage(to);\n\n      const track = (RADIUS * 2 * Math.PI * MAX_ANGLE) / 360;\n      const arc = Math.max((end - start) * track, 0);\n      const arcOffset = start * track - 0.5;\n\n      const strokeDasharray = `${arc} ${track - arc}`;\n      const strokeDashOffset = `-${arcOffset}`;\n      return [strokeDasharray, strokeDashOffset];\n    },\n    [_valueToPercentage],\n  );\n\n  const _strokeCircleDashArc = useCallback(\n    (value: number): [string, string] => {\n      return _strokeDashArc(value, value);\n    },\n    [_strokeDashArc],\n  );\n\n  const currentStroke = current ? _strokeCircleDashArc(current) : undefined;\n\n  const _boundedValue = useCallback(\n    (value: number) => {\n      const _min = _activeSlider.current === \"high\" ? Math.min(localLow ?? max) : min;\n      const _max = _activeSlider.current === \"low\" ? Math.max(localHigh ?? min) : max;\n      return Math.min(Math.max(value, _min), _max);\n    },\n    [localLow, max, min, localHigh],\n  );\n\n  const renderArc = useCallback(\n    (id: string, value: number | undefined, mode: ControlCircularSliderMode) => {\n      if (disabled) return null;\n\n      const path = svgArc({\n        x: 0,\n        y: 0,\n        start: 0,\n        end: MAX_ANGLE,\n        r: RADIUS,\n      });\n\n      const limit = mode === \"end\" ? max : min;\n\n      const _current = current ?? limit;\n      const target = value ?? limit;\n\n      const showActive = mode === \"end\" ? target <= _current : mode === \"start\" ? _current <= target : false;\n\n      const showTarget = value != null;\n\n      const activeArc = showTarget\n        ? showActive\n          ? mode === \"end\"\n            ? _strokeDashArc(target, _current)\n            : _strokeDashArc(_current, target)\n          : _strokeCircleDashArc(target)\n        : undefined;\n\n      const coloredArc =\n        mode === \"full\" ? _strokeDashArc(min, max) : mode === \"end\" ? _strokeDashArc(target, limit) : _strokeDashArc(limit, target);\n\n      const targetCircle = showTarget ? _strokeCircleDashArc(target) : undefined;\n\n      const currentCircle =\n        current != null && current <= max && current >= min && (showActive || mode === \"full\") ? _strokeCircleDashArc(current) : undefined;\n\n      return (\n        <g className={`${inactive ? \"inactive\" : \"\"}`}>\n          <path className=\"arc arc-clear\" d={path} strokeDasharray={coloredArc[0]} strokeDashoffset={coloredArc[1]} />\n          <path className={`arc arc-colored ${id}`} d={path} strokeDasharray={coloredArc[0]} strokeDashoffset={coloredArc[1]} />\n          {activeArc ? (\n            <path\n              d={path}\n              className={`arc arc-active ${id}`}\n              strokeDasharray={activeArc[0]}\n              strokeDashoffset={activeArc[1]}\n              role=\"slider\"\n              tabIndex={0}\n              aria-valuemin={min}\n              aria-valuemax={max}\n              aria-valuenow={localValue != null ? _steppedValue(localValue) : undefined}\n              aria-disabled={disabled}\n              aria-readonly={readonly}\n              aria-label={label}\n            />\n          ) : null}\n          {currentCircle ? (\n            <path className=\"current arc-current\" d={path} strokeDasharray={currentCircle[0]} strokeDashoffset={currentCircle[1]} />\n          ) : null}\n          {targetCircle ? (\n            <>\n              <path className={`target-border ${id}`} d={path} strokeDasharray={targetCircle[0]} strokeDashoffset={targetCircle[1]} />\n              <path className=\"target\" d={path} strokeDasharray={targetCircle[0]} strokeDashoffset={targetCircle[1]} />\n            </>\n          ) : null}\n        </g>\n      );\n    },\n    [_steppedValue, _strokeCircleDashArc, _strokeDashArc, current, disabled, inactive, label, localValue, max, min, readonly],\n  );\n\n  const _getPercentageFromEvent = useCallback((xy: [number, number]) => {\n    if (!_sliderRef.current) return 0;\n    const bound = _sliderRef.current.getBoundingClientRect();\n    const x = (2 * (xy[0] - bound.left - bound.width / 2)) / bound.width;\n    const y = (2 * (xy[1] - bound.top - bound.height / 2)) / bound.height;\n\n    const [, phi] = xy2polar(x, y);\n\n    const offset = (360 - MAX_ANGLE) / 2;\n\n    const angle = ((rad2deg(phi) + offset - ROTATE_ANGLE + 360) % 360) - offset;\n\n    return Math.max(Math.min(angle / MAX_ANGLE, 1), 0);\n  }, []);\n\n  const _findActiveSlider = useCallback(\n    (value: number): ActiveSlider => {\n      if (!dual) return \"value\";\n      const low = Math.max(localLow ?? min, min);\n      const high = Math.min(localHigh ?? max, max);\n      if (low >= value) {\n        return \"low\";\n      }\n      if (high <= value) {\n        return \"high\";\n      }\n      const lowDistance = Math.abs(value - low);\n      const highDistance = Math.abs(value - high);\n      return lowDistance <= highDistance ? \"low\" : \"high\";\n    },\n    [dual, localHigh, localLow, max, min],\n  );\n\n  const triggerOnChangeApplied = useDebouncedCallback(\n    (updatedValue: number, type: ActiveSlider) => {\n      if (typeof onChangeApplied !== \"function\") return;\n      onChangeApplied(updatedValue, type);\n    },\n    100,\n    {\n      trailing: true,\n      leading: true,\n    },\n  );\n\n  const triggerOnChange = useThrottledCallback(\n    (updatedValue: number, type: ActiveSlider) => {\n      if (typeof onChange !== \"function\") return;\n      onChange(updatedValue, type);\n    },\n    20,\n    {\n      trailing: true,\n      leading: true,\n    },\n  );\n\n  const bind = useGesture(\n    {\n      onDrag: (state) => {\n        if (disabled || readonly) return;\n        const { first, last } = state;\n        // 'movement' contains the delta of the drag\n        if (!first && !last) {\n          // Add your 'panmove' logic here\n          const values = state.values;\n          const [x, y] = values;\n          const percentage = _getPercentageFromEvent([x, y]);\n          const raw = _percentageToValue(percentage);\n          const bounded = _boundedValue(raw);\n          _setActiveValue(bounded);\n          const stepped = _steppedValue(bounded);\n          const type = _findActiveSlider(raw);\n          triggerOnChange(stepped, type);\n        }\n      },\n      onDragStart: (state) => {\n        if (disabled || readonly) return;\n        const values = state.values;\n        const [x, y] = values;\n        const percentage = _getPercentageFromEvent([x, y]);\n        const raw = _percentageToValue(percentage);\n        _activeSlider.current = _findActiveSlider(raw);\n        _lastSlider.current = _activeSlider.current;\n        if (_svgRef.current) {\n          _svgRef.current.focus();\n        }\n      },\n      onDragEnd: (state) => {\n        if (disabled) return;\n        const values = state.values;\n        const [x, y] = values;\n        const percentage = _getPercentageFromEvent([x, y]);\n        const raw = _percentageToValue(percentage);\n        const bounded = _boundedValue(raw);\n        const stepped = _steppedValue(bounded);\n        _setActiveValue(stepped);\n        _activeSlider.current = _findActiveSlider(raw);\n        triggerOnChange(stepped, _activeSlider.current);\n        triggerOnChangeApplied(stepped, _activeSlider.current);\n        _activeSlider.current = undefined;\n      },\n      onPointerDown: (state) => {\n        state.event.stopPropagation();\n        state.event.preventDefault();\n        if (disabled || readonly) return;\n        const percentage = _getPercentageFromEvent([state.event.clientX, state.event.clientY]);\n        const raw = _percentageToValue(percentage);\n        _activeSlider.current = _findActiveSlider(raw);\n        const bounded = _boundedValue(raw);\n        const stepped = _steppedValue(bounded);\n        _setActiveValue(bounded);\n        triggerOnChange(stepped, _activeSlider.current);\n      },\n      onPointerUp: (state) => {\n        if (disabled || readonly) return;\n        state.event.stopPropagation();\n        state.event.preventDefault();\n        if (disabled || readonly) return;\n        const percentage = _getPercentageFromEvent([state.event.clientX, state.event.clientY]);\n        const raw = _percentageToValue(percentage);\n        _activeSlider.current = _findActiveSlider(raw);\n        const bounded = _boundedValue(raw);\n        const stepped = _steppedValue(bounded);\n        triggerOnChange(stepped, _activeSlider.current);\n        triggerOnChangeApplied(stepped, _activeSlider.current);\n        _activeSlider.current = undefined;\n      },\n    },\n    {\n      drag: {\n        filterTaps: true,\n      },\n    },\n  );\n\n  return (\n    <Wrapper className=\"control-slider-circular\" ref={_sliderRef} {...bind()} {...rest}>\n      <svg\n        ref={_svgRef}\n        viewBox=\"0 0 320 320\"\n        overflow=\"visible\"\n        className={`slider ${_activeSlider.current ? \"pressed\" : \"\"}`}\n        tabIndex={_lastSlider.current ? 0 : -1}\n      >\n        <g className=\"container\" transform={`translate(160 160) rotate(${ROTATE_ANGLE})`}>\n          <g className=\"interaction\">\n            <path d={trackPath} />\n          </g>\n          <g className=\"display\">\n            <path className=\"background\" d={trackPath} />\n            {currentStroke ? (\n              <path className=\"current\" d={trackPath} strokeDasharray={currentStroke[0]} strokeDashoffset={currentStroke[1]} />\n            ) : null}\n            {lowValue != null || mode === \"full\" ? renderArc(dual ? \"low\" : \"value\", lowValue, (!dual && mode) || \"start\") : null}\n            {dual && highValue != null ? renderArc(\"high\", highValue, \"end\") : null}\n          </g>\n        </g>\n      </svg>\n    </Wrapper>\n  );\n}\n\n/** A interactive slider similar to the home assistant circular slider to control climate & humidifier entities */\nexport function ControlSliderCircular(props: ControlSliderCircularProps) {\n  return (\n    <ErrorBoundary {...fallback({ prefix: \"ControlSliderCircular\" })}>\n      <InternalControlSliderCircular {...props} />\n    </ErrorBoundary>\n  );\n}\n","function hasWindow() {\n  return typeof window !== 'undefined';\n}\nfunction getNodeName(node) {\n  if (isNode(node)) {\n    return (node.nodeName || '').toLowerCase();\n  }\n  // Mocked nodes in testing environments may not be instances of Node. By\n  // returning `#document` an infinite loop won't occur.\n  // https://github.com/floating-ui/floating-ui/issues/2317\n  return '#document';\n}\nfunction getWindow(node) {\n  var _node$ownerDocument;\n  return (node == null || (_node$ownerDocument = node.ownerDocument) == null ? void 0 : _node$ownerDocument.defaultView) || window;\n}\nfunction getDocumentElement(node) {\n  var _ref;\n  return (_ref = (isNode(node) ? node.ownerDocument : node.document) || window.document) == null ? void 0 : _ref.documentElement;\n}\nfunction isNode(value) {\n  if (!hasWindow()) {\n    return false;\n  }\n  return value instanceof Node || value instanceof getWindow(value).Node;\n}\nfunction isElement(value) {\n  if (!hasWindow()) {\n    return false;\n  }\n  return value instanceof Element || value instanceof getWindow(value).Element;\n}\nfunction isHTMLElement(value) {\n  if (!hasWindow()) {\n    return false;\n  }\n  return value instanceof HTMLElement || value instanceof getWindow(value).HTMLElement;\n}\nfunction isShadowRoot(value) {\n  if (!hasWindow() || typeof ShadowRoot === 'undefined') {\n    return false;\n  }\n  return value instanceof ShadowRoot || value instanceof getWindow(value).ShadowRoot;\n}\nconst invalidOverflowDisplayValues = /*#__PURE__*/new Set(['inline', 'contents']);\nfunction isOverflowElement(element) {\n  const {\n    overflow,\n    overflowX,\n    overflowY,\n    display\n  } = getComputedStyle(element);\n  return /auto|scroll|overlay|hidden|clip/.test(overflow + overflowY + overflowX) && !invalidOverflowDisplayValues.has(display);\n}\nconst tableElements = /*#__PURE__*/new Set(['table', 'td', 'th']);\nfunction isTableElement(element) {\n  return tableElements.has(getNodeName(element));\n}\nconst topLayerSelectors = [':popover-open', ':modal'];\nfunction isTopLayer(element) {\n  return topLayerSelectors.some(selector => {\n    try {\n      return element.matches(selector);\n    } catch (_e) {\n      return false;\n    }\n  });\n}\nconst transformProperties = ['transform', 'translate', 'scale', 'rotate', 'perspective'];\nconst willChangeValues = ['transform', 'translate', 'scale', 'rotate', 'perspective', 'filter'];\nconst containValues = ['paint', 'layout', 'strict', 'content'];\nfunction isContainingBlock(elementOrCss) {\n  const webkit = isWebKit();\n  const css = isElement(elementOrCss) ? getComputedStyle(elementOrCss) : elementOrCss;\n\n  // https://developer.mozilla.org/en-US/docs/Web/CSS/Containing_block#identifying_the_containing_block\n  // https://drafts.csswg.org/css-transforms-2/#individual-transforms\n  return transformProperties.some(value => css[value] ? css[value] !== 'none' : false) || (css.containerType ? css.containerType !== 'normal' : false) || !webkit && (css.backdropFilter ? css.backdropFilter !== 'none' : false) || !webkit && (css.filter ? css.filter !== 'none' : false) || willChangeValues.some(value => (css.willChange || '').includes(value)) || containValues.some(value => (css.contain || '').includes(value));\n}\nfunction getContainingBlock(element) {\n  let currentNode = getParentNode(element);\n  while (isHTMLElement(currentNode) && !isLastTraversableNode(currentNode)) {\n    if (isContainingBlock(currentNode)) {\n      return currentNode;\n    } else if (isTopLayer(currentNode)) {\n      return null;\n    }\n    currentNode = getParentNode(currentNode);\n  }\n  return null;\n}\nfunction isWebKit() {\n  if (typeof CSS === 'undefined' || !CSS.supports) return false;\n  return CSS.supports('-webkit-backdrop-filter', 'none');\n}\nconst lastTraversableNodeNames = /*#__PURE__*/new Set(['html', 'body', '#document']);\nfunction isLastTraversableNode(node) {\n  return lastTraversableNodeNames.has(getNodeName(node));\n}\nfunction getComputedStyle(element) {\n  return getWindow(element).getComputedStyle(element);\n}\nfunction getNodeScroll(element) {\n  if (isElement(element)) {\n    return {\n      scrollLeft: element.scrollLeft,\n      scrollTop: element.scrollTop\n    };\n  }\n  return {\n    scrollLeft: element.scrollX,\n    scrollTop: element.scrollY\n  };\n}\nfunction getParentNode(node) {\n  if (getNodeName(node) === 'html') {\n    return node;\n  }\n  const result =\n  // Step into the shadow DOM of the parent of a slotted node.\n  node.assignedSlot ||\n  // DOM Element detected.\n  node.parentNode ||\n  // ShadowRoot detected.\n  isShadowRoot(node) && node.host ||\n  // Fallback.\n  getDocumentElement(node);\n  return isShadowRoot(result) ? result.host : result;\n}\nfunction getNearestOverflowAncestor(node) {\n  const parentNode = getParentNode(node);\n  if (isLastTraversableNode(parentNode)) {\n    return node.ownerDocument ? node.ownerDocument.body : node.body;\n  }\n  if (isHTMLElement(parentNode) && isOverflowElement(parentNode)) {\n    return parentNode;\n  }\n  return getNearestOverflowAncestor(parentNode);\n}\nfunction getOverflowAncestors(node, list, traverseIframes) {\n  var _node$ownerDocument2;\n  if (list === void 0) {\n    list = [];\n  }\n  if (traverseIframes === void 0) {\n    traverseIframes = true;\n  }\n  const scrollableAncestor = getNearestOverflowAncestor(node);\n  const isBody = scrollableAncestor === ((_node$ownerDocument2 = node.ownerDocument) == null ? void 0 : _node$ownerDocument2.body);\n  const win = getWindow(scrollableAncestor);\n  if (isBody) {\n    const frameElement = getFrameElement(win);\n    return list.concat(win, win.visualViewport || [], isOverflowElement(scrollableAncestor) ? scrollableAncestor : [], frameElement && traverseIframes ? getOverflowAncestors(frameElement) : []);\n  }\n  return list.concat(scrollableAncestor, getOverflowAncestors(scrollableAncestor, [], traverseIframes));\n}\nfunction getFrameElement(win) {\n  return win.parent && Object.getPrototypeOf(win.parent) ? win.frameElement : null;\n}\n\nexport { getComputedStyle, getContainingBlock, getDocumentElement, getFrameElement, getNearestOverflowAncestor, getNodeName, getNodeScroll, getOverflowAncestors, getParentNode, getWindow, isContainingBlock, isElement, isHTMLElement, isLastTraversableNode, isNode, isOverflowElement, isShadowRoot, isTableElement, isTopLayer, isWebKit };\n","/**\n * Custom positioning reference element.\n * @see https://floating-ui.com/docs/virtual-elements\n */\n\nconst sides = ['top', 'right', 'bottom', 'left'];\nconst alignments = ['start', 'end'];\nconst placements = /*#__PURE__*/sides.reduce((acc, side) => acc.concat(side, side + \"-\" + alignments[0], side + \"-\" + alignments[1]), []);\nconst min = Math.min;\nconst max = Math.max;\nconst round = Math.round;\nconst floor = Math.floor;\nconst createCoords = v => ({\n  x: v,\n  y: v\n});\nconst oppositeSideMap = {\n  left: 'right',\n  right: 'left',\n  bottom: 'top',\n  top: 'bottom'\n};\nconst oppositeAlignmentMap = {\n  start: 'end',\n  end: 'start'\n};\nfunction clamp(start, value, end) {\n  return max(start, min(value, end));\n}\nfunction evaluate(value, param) {\n  return typeof value === 'function' ? value(param) : value;\n}\nfunction getSide(placement) {\n  return placement.split('-')[0];\n}\nfunction getAlignment(placement) {\n  return placement.split('-')[1];\n}\nfunction getOppositeAxis(axis) {\n  return axis === 'x' ? 'y' : 'x';\n}\nfunction getAxisLength(axis) {\n  return axis === 'y' ? 'height' : 'width';\n}\nconst yAxisSides = /*#__PURE__*/new Set(['top', 'bottom']);\nfunction getSideAxis(placement) {\n  return yAxisSides.has(getSide(placement)) ? 'y' : 'x';\n}\nfunction getAlignmentAxis(placement) {\n  return getOppositeAxis(getSideAxis(placement));\n}\nfunction getAlignmentSides(placement, rects, rtl) {\n  if (rtl === void 0) {\n    rtl = false;\n  }\n  const alignment = getAlignment(placement);\n  const alignmentAxis = getAlignmentAxis(placement);\n  const length = getAxisLength(alignmentAxis);\n  let mainAlignmentSide = alignmentAxis === 'x' ? alignment === (rtl ? 'end' : 'start') ? 'right' : 'left' : alignment === 'start' ? 'bottom' : 'top';\n  if (rects.reference[length] > rects.floating[length]) {\n    mainAlignmentSide = getOppositePlacement(mainAlignmentSide);\n  }\n  return [mainAlignmentSide, getOppositePlacement(mainAlignmentSide)];\n}\nfunction getExpandedPlacements(placement) {\n  const oppositePlacement = getOppositePlacement(placement);\n  return [getOppositeAlignmentPlacement(placement), oppositePlacement, getOppositeAlignmentPlacement(oppositePlacement)];\n}\nfunction getOppositeAlignmentPlacement(placement) {\n  return placement.replace(/start|end/g, alignment => oppositeAlignmentMap[alignment]);\n}\nconst lrPlacement = ['left', 'right'];\nconst rlPlacement = ['right', 'left'];\nconst tbPlacement = ['top', 'bottom'];\nconst btPlacement = ['bottom', 'top'];\nfunction getSideList(side, isStart, rtl) {\n  switch (side) {\n    case 'top':\n    case 'bottom':\n      if (rtl) return isStart ? rlPlacement : lrPlacement;\n      return isStart ? lrPlacement : rlPlacement;\n    case 'left':\n    case 'right':\n      return isStart ? tbPlacement : btPlacement;\n    default:\n      return [];\n  }\n}\nfunction getOppositeAxisPlacements(placement, flipAlignment, direction, rtl) {\n  const alignment = getAlignment(placement);\n  let list = getSideList(getSide(placement), direction === 'start', rtl);\n  if (alignment) {\n    list = list.map(side => side + \"-\" + alignment);\n    if (flipAlignment) {\n      list = list.concat(list.map(getOppositeAlignmentPlacement));\n    }\n  }\n  return list;\n}\nfunction getOppositePlacement(placement) {\n  return placement.replace(/left|right|bottom|top/g, side => oppositeSideMap[side]);\n}\nfunction expandPaddingObject(padding) {\n  return {\n    top: 0,\n    right: 0,\n    bottom: 0,\n    left: 0,\n    ...padding\n  };\n}\nfunction getPaddingObject(padding) {\n  return typeof padding !== 'number' ? expandPaddingObject(padding) : {\n    top: padding,\n    right: padding,\n    bottom: padding,\n    left: padding\n  };\n}\nfunction rectToClientRect(rect) {\n  const {\n    x,\n    y,\n    width,\n    height\n  } = rect;\n  return {\n    width,\n    height,\n    top: y,\n    left: x,\n    right: x + width,\n    bottom: y + height,\n    x,\n    y\n  };\n}\n\nexport { alignments, clamp, createCoords, evaluate, expandPaddingObject, floor, getAlignment, getAlignmentAxis, getAlignmentSides, getAxisLength, getExpandedPlacements, getOppositeAlignmentPlacement, getOppositeAxis, getOppositeAxisPlacements, getOppositePlacement, getPaddingObject, getSide, getSideAxis, max, min, placements, rectToClientRect, round, sides };\n","import { isShadowRoot, isHTMLElement } from '@floating-ui/utils/dom';\nimport * as React from 'react';\nimport { useLayoutEffect } from 'react';\nimport { floor } from '@floating-ui/utils';\nimport { tabbable } from 'tabbable';\n\n// Avoid Chrome DevTools blue warning.\nfunction getPlatform() {\n  const uaData = navigator.userAgentData;\n  if (uaData != null && uaData.platform) {\n    return uaData.platform;\n  }\n  return navigator.platform;\n}\nfunction getUserAgent() {\n  const uaData = navigator.userAgentData;\n  if (uaData && Array.isArray(uaData.brands)) {\n    return uaData.brands.map(_ref => {\n      let {\n        brand,\n        version\n      } = _ref;\n      return brand + \"/\" + version;\n    }).join(' ');\n  }\n  return navigator.userAgent;\n}\nfunction isSafari() {\n  // Chrome DevTools does not complain about navigator.vendor\n  return /apple/i.test(navigator.vendor);\n}\nfunction isAndroid() {\n  const re = /android/i;\n  return re.test(getPlatform()) || re.test(getUserAgent());\n}\nfunction isMac() {\n  return getPlatform().toLowerCase().startsWith('mac') && !navigator.maxTouchPoints;\n}\nfunction isJSDOM() {\n  return getUserAgent().includes('jsdom/');\n}\n\nconst FOCUSABLE_ATTRIBUTE = 'data-floating-ui-focusable';\nconst TYPEABLE_SELECTOR = \"input:not([type='hidden']):not([disabled]),\" + \"[contenteditable]:not([contenteditable='false']),textarea:not([disabled])\";\nconst ARROW_LEFT = 'ArrowLeft';\nconst ARROW_RIGHT = 'ArrowRight';\nconst ARROW_UP = 'ArrowUp';\nconst ARROW_DOWN = 'ArrowDown';\n\nfunction activeElement(doc) {\n  let activeElement = doc.activeElement;\n  while (((_activeElement = activeElement) == null || (_activeElement = _activeElement.shadowRoot) == null ? void 0 : _activeElement.activeElement) != null) {\n    var _activeElement;\n    activeElement = activeElement.shadowRoot.activeElement;\n  }\n  return activeElement;\n}\nfunction contains(parent, child) {\n  if (!parent || !child) {\n    return false;\n  }\n  const rootNode = child.getRootNode == null ? void 0 : child.getRootNode();\n\n  // First, attempt with faster native method\n  if (parent.contains(child)) {\n    return true;\n  }\n\n  // then fallback to custom implementation with Shadow DOM support\n  if (rootNode && isShadowRoot(rootNode)) {\n    let next = child;\n    while (next) {\n      if (parent === next) {\n        return true;\n      }\n      // @ts-ignore\n      next = next.parentNode || next.host;\n    }\n  }\n\n  // Give up, the result is false\n  return false;\n}\nfunction getTarget(event) {\n  if ('composedPath' in event) {\n    return event.composedPath()[0];\n  }\n\n  // TS thinks `event` is of type never as it assumes all browsers support\n  // `composedPath()`, but browsers without shadow DOM don't.\n  return event.target;\n}\nfunction isEventTargetWithin(event, node) {\n  if (node == null) {\n    return false;\n  }\n  if ('composedPath' in event) {\n    return event.composedPath().includes(node);\n  }\n\n  // TS thinks `event` is of type never as it assumes all browsers support composedPath, but browsers without shadow dom don't\n  const e = event;\n  return e.target != null && node.contains(e.target);\n}\nfunction isRootElement(element) {\n  return element.matches('html,body');\n}\nfunction getDocument(node) {\n  return (node == null ? void 0 : node.ownerDocument) || document;\n}\nfunction isTypeableElement(element) {\n  return isHTMLElement(element) && element.matches(TYPEABLE_SELECTOR);\n}\nfunction isTypeableCombobox(element) {\n  if (!element) return false;\n  return element.getAttribute('role') === 'combobox' && isTypeableElement(element);\n}\nfunction matchesFocusVisible(element) {\n  // We don't want to block focus from working with `visibleOnly`\n  // (JSDOM doesn't match `:focus-visible` when the element has `:focus`)\n  if (!element || isJSDOM()) return true;\n  try {\n    return element.matches(':focus-visible');\n  } catch (_e) {\n    return true;\n  }\n}\nfunction getFloatingFocusElement(floatingElement) {\n  if (!floatingElement) {\n    return null;\n  }\n  // Try to find the element that has `{...getFloatingProps()}` spread on it.\n  // This indicates the floating element is acting as a positioning wrapper, and\n  // so focus should be managed on the child element with the event handlers and\n  // aria props.\n  return floatingElement.hasAttribute(FOCUSABLE_ATTRIBUTE) ? floatingElement : floatingElement.querySelector(\"[\" + FOCUSABLE_ATTRIBUTE + \"]\") || floatingElement;\n}\n\nfunction getNodeChildren(nodes, id, onlyOpenChildren) {\n  if (onlyOpenChildren === void 0) {\n    onlyOpenChildren = true;\n  }\n  const directChildren = nodes.filter(node => {\n    var _node$context;\n    return node.parentId === id && (!onlyOpenChildren || ((_node$context = node.context) == null ? void 0 : _node$context.open));\n  });\n  return directChildren.flatMap(child => [child, ...getNodeChildren(nodes, child.id, onlyOpenChildren)]);\n}\nfunction getDeepestNode(nodes, id) {\n  let deepestNodeId;\n  let maxDepth = -1;\n  function findDeepest(nodeId, depth) {\n    if (depth > maxDepth) {\n      deepestNodeId = nodeId;\n      maxDepth = depth;\n    }\n    const children = getNodeChildren(nodes, nodeId);\n    children.forEach(child => {\n      findDeepest(child.id, depth + 1);\n    });\n  }\n  findDeepest(id, 0);\n  return nodes.find(node => node.id === deepestNodeId);\n}\nfunction getNodeAncestors(nodes, id) {\n  var _nodes$find;\n  let allAncestors = [];\n  let currentParentId = (_nodes$find = nodes.find(node => node.id === id)) == null ? void 0 : _nodes$find.parentId;\n  while (currentParentId) {\n    const currentNode = nodes.find(node => node.id === currentParentId);\n    currentParentId = currentNode == null ? void 0 : currentNode.parentId;\n    if (currentNode) {\n      allAncestors = allAncestors.concat(currentNode);\n    }\n  }\n  return allAncestors;\n}\n\nfunction stopEvent(event) {\n  event.preventDefault();\n  event.stopPropagation();\n}\nfunction isReactEvent(event) {\n  return 'nativeEvent' in event;\n}\n\n// License: https://github.com/adobe/react-spectrum/blob/b35d5c02fe900badccd0cf1a8f23bb593419f238/packages/@react-aria/utils/src/isVirtualEvent.ts\nfunction isVirtualClick(event) {\n  // FIXME: Firefox is now emitting a deprecation warning for `mozInputSource`.\n  // Try to find a workaround for this. `react-aria` source still has the check.\n  if (event.mozInputSource === 0 && event.isTrusted) {\n    return true;\n  }\n  if (isAndroid() && event.pointerType) {\n    return event.type === 'click' && event.buttons === 1;\n  }\n  return event.detail === 0 && !event.pointerType;\n}\nfunction isVirtualPointerEvent(event) {\n  if (isJSDOM()) return false;\n  return !isAndroid() && event.width === 0 && event.height === 0 || isAndroid() && event.width === 1 && event.height === 1 && event.pressure === 0 && event.detail === 0 && event.pointerType === 'mouse' ||\n  // iOS VoiceOver returns 0.333• for width/height.\n  event.width < 1 && event.height < 1 && event.pressure === 0 && event.detail === 0 && event.pointerType === 'touch';\n}\nfunction isMouseLikePointerType(pointerType, strict) {\n  // On some Linux machines with Chromium, mouse inputs return a `pointerType`\n  // of \"pen\": https://github.com/floating-ui/floating-ui/issues/2015\n  const values = ['mouse', 'pen'];\n  if (!strict) {\n    values.push('', undefined);\n  }\n  return values.includes(pointerType);\n}\n\nvar isClient = typeof document !== 'undefined';\n\nvar noop = function noop() {};\nvar index = isClient ? useLayoutEffect : noop;\n\n// https://github.com/mui/material-ui/issues/41190#issuecomment-2040873379\nconst SafeReact = {\n  ...React\n};\n\nfunction useLatestRef(value) {\n  const ref = React.useRef(value);\n  index(() => {\n    ref.current = value;\n  });\n  return ref;\n}\nconst useInsertionEffect = SafeReact.useInsertionEffect;\nconst useSafeInsertionEffect = useInsertionEffect || (fn => fn());\nfunction useEffectEvent(callback) {\n  const ref = React.useRef(() => {\n    if (process.env.NODE_ENV !== \"production\") {\n      throw new Error('Cannot call an event handler while rendering.');\n    }\n  });\n  useSafeInsertionEffect(() => {\n    ref.current = callback;\n  });\n  return React.useCallback(function () {\n    for (var _len = arguments.length, args = new Array(_len), _key = 0; _key < _len; _key++) {\n      args[_key] = arguments[_key];\n    }\n    return ref.current == null ? void 0 : ref.current(...args);\n  }, []);\n}\n\nfunction isDifferentGridRow(index, cols, prevRow) {\n  return Math.floor(index / cols) !== prevRow;\n}\nfunction isIndexOutOfListBounds(listRef, index) {\n  return index < 0 || index >= listRef.current.length;\n}\nfunction getMinListIndex(listRef, disabledIndices) {\n  return findNonDisabledListIndex(listRef, {\n    disabledIndices\n  });\n}\nfunction getMaxListIndex(listRef, disabledIndices) {\n  return findNonDisabledListIndex(listRef, {\n    decrement: true,\n    startingIndex: listRef.current.length,\n    disabledIndices\n  });\n}\nfunction findNonDisabledListIndex(listRef, _temp) {\n  let {\n    startingIndex = -1,\n    decrement = false,\n    disabledIndices,\n    amount = 1\n  } = _temp === void 0 ? {} : _temp;\n  let index = startingIndex;\n  do {\n    index += decrement ? -amount : amount;\n  } while (index >= 0 && index <= listRef.current.length - 1 && isListIndexDisabled(listRef, index, disabledIndices));\n  return index;\n}\nfunction getGridNavigatedIndex(listRef, _ref) {\n  let {\n    event,\n    orientation,\n    loop,\n    rtl,\n    cols,\n    disabledIndices,\n    minIndex,\n    maxIndex,\n    prevIndex,\n    stopEvent: stop = false\n  } = _ref;\n  let nextIndex = prevIndex;\n  if (event.key === ARROW_UP) {\n    stop && stopEvent(event);\n    if (prevIndex === -1) {\n      nextIndex = maxIndex;\n    } else {\n      nextIndex = findNonDisabledListIndex(listRef, {\n        startingIndex: nextIndex,\n        amount: cols,\n        decrement: true,\n        disabledIndices\n      });\n      if (loop && (prevIndex - cols < minIndex || nextIndex < 0)) {\n        const col = prevIndex % cols;\n        const maxCol = maxIndex % cols;\n        const offset = maxIndex - (maxCol - col);\n        if (maxCol === col) {\n          nextIndex = maxIndex;\n        } else {\n          nextIndex = maxCol > col ? offset : offset - cols;\n        }\n      }\n    }\n    if (isIndexOutOfListBounds(listRef, nextIndex)) {\n      nextIndex = prevIndex;\n    }\n  }\n  if (event.key === ARROW_DOWN) {\n    stop && stopEvent(event);\n    if (prevIndex === -1) {\n      nextIndex = minIndex;\n    } else {\n      nextIndex = findNonDisabledListIndex(listRef, {\n        startingIndex: prevIndex,\n        amount: cols,\n        disabledIndices\n      });\n      if (loop && prevIndex + cols > maxIndex) {\n        nextIndex = findNonDisabledListIndex(listRef, {\n          startingIndex: prevIndex % cols - cols,\n          amount: cols,\n          disabledIndices\n        });\n      }\n    }\n    if (isIndexOutOfListBounds(listRef, nextIndex)) {\n      nextIndex = prevIndex;\n    }\n  }\n\n  // Remains on the same row/column.\n  if (orientation === 'both') {\n    const prevRow = floor(prevIndex / cols);\n    if (event.key === (rtl ? ARROW_LEFT : ARROW_RIGHT)) {\n      stop && stopEvent(event);\n      if (prevIndex % cols !== cols - 1) {\n        nextIndex = findNonDisabledListIndex(listRef, {\n          startingIndex: prevIndex,\n          disabledIndices\n        });\n        if (loop && isDifferentGridRow(nextIndex, cols, prevRow)) {\n          nextIndex = findNonDisabledListIndex(listRef, {\n            startingIndex: prevIndex - prevIndex % cols - 1,\n            disabledIndices\n          });\n        }\n      } else if (loop) {\n        nextIndex = findNonDisabledListIndex(listRef, {\n          startingIndex: prevIndex - prevIndex % cols - 1,\n          disabledIndices\n        });\n      }\n      if (isDifferentGridRow(nextIndex, cols, prevRow)) {\n        nextIndex = prevIndex;\n      }\n    }\n    if (event.key === (rtl ? ARROW_RIGHT : ARROW_LEFT)) {\n      stop && stopEvent(event);\n      if (prevIndex % cols !== 0) {\n        nextIndex = findNonDisabledListIndex(listRef, {\n          startingIndex: prevIndex,\n          decrement: true,\n          disabledIndices\n        });\n        if (loop && isDifferentGridRow(nextIndex, cols, prevRow)) {\n          nextIndex = findNonDisabledListIndex(listRef, {\n            startingIndex: prevIndex + (cols - prevIndex % cols),\n            decrement: true,\n            disabledIndices\n          });\n        }\n      } else if (loop) {\n        nextIndex = findNonDisabledListIndex(listRef, {\n          startingIndex: prevIndex + (cols - prevIndex % cols),\n          decrement: true,\n          disabledIndices\n        });\n      }\n      if (isDifferentGridRow(nextIndex, cols, prevRow)) {\n        nextIndex = prevIndex;\n      }\n    }\n    const lastRow = floor(maxIndex / cols) === prevRow;\n    if (isIndexOutOfListBounds(listRef, nextIndex)) {\n      if (loop && lastRow) {\n        nextIndex = event.key === (rtl ? ARROW_RIGHT : ARROW_LEFT) ? maxIndex : findNonDisabledListIndex(listRef, {\n          startingIndex: prevIndex - prevIndex % cols - 1,\n          disabledIndices\n        });\n      } else {\n        nextIndex = prevIndex;\n      }\n    }\n  }\n  return nextIndex;\n}\n\n/** For each cell index, gets the item index that occupies that cell */\nfunction createGridCellMap(sizes, cols, dense) {\n  const cellMap = [];\n  let startIndex = 0;\n  sizes.forEach((_ref2, index) => {\n    let {\n      width,\n      height\n    } = _ref2;\n    if (width > cols) {\n      if (process.env.NODE_ENV !== \"production\") {\n        throw new Error(\"[Floating UI]: Invalid grid - item width at index \" + index + \" is greater than grid columns\");\n      }\n    }\n    let itemPlaced = false;\n    if (dense) {\n      startIndex = 0;\n    }\n    while (!itemPlaced) {\n      const targetCells = [];\n      for (let i = 0; i < width; i++) {\n        for (let j = 0; j < height; j++) {\n          targetCells.push(startIndex + i + j * cols);\n        }\n      }\n      if (startIndex % cols + width <= cols && targetCells.every(cell => cellMap[cell] == null)) {\n        targetCells.forEach(cell => {\n          cellMap[cell] = index;\n        });\n        itemPlaced = true;\n      } else {\n        startIndex++;\n      }\n    }\n  });\n\n  // convert into a non-sparse array\n  return [...cellMap];\n}\n\n/** Gets cell index of an item's corner or -1 when index is -1. */\nfunction getGridCellIndexOfCorner(index, sizes, cellMap, cols, corner) {\n  if (index === -1) return -1;\n  const firstCellIndex = cellMap.indexOf(index);\n  const sizeItem = sizes[index];\n  switch (corner) {\n    case 'tl':\n      return firstCellIndex;\n    case 'tr':\n      if (!sizeItem) {\n        return firstCellIndex;\n      }\n      return firstCellIndex + sizeItem.width - 1;\n    case 'bl':\n      if (!sizeItem) {\n        return firstCellIndex;\n      }\n      return firstCellIndex + (sizeItem.height - 1) * cols;\n    case 'br':\n      return cellMap.lastIndexOf(index);\n  }\n}\n\n/** Gets all cell indices that correspond to the specified indices */\nfunction getGridCellIndices(indices, cellMap) {\n  return cellMap.flatMap((index, cellIndex) => indices.includes(index) ? [cellIndex] : []);\n}\nfunction isListIndexDisabled(listRef, index, disabledIndices) {\n  if (typeof disabledIndices === 'function') {\n    return disabledIndices(index);\n  } else if (disabledIndices) {\n    return disabledIndices.includes(index);\n  }\n  const element = listRef.current[index];\n  return element == null || element.hasAttribute('disabled') || element.getAttribute('aria-disabled') === 'true';\n}\n\nconst getTabbableOptions = () => ({\n  getShadowRoot: true,\n  displayCheck:\n  // JSDOM does not support the `tabbable` library. To solve this we can\n  // check if `ResizeObserver` is a real function (not polyfilled), which\n  // determines if the current environment is JSDOM-like.\n  typeof ResizeObserver === 'function' && ResizeObserver.toString().includes('[native code]') ? 'full' : 'none'\n});\nfunction getTabbableIn(container, dir) {\n  const list = tabbable(container, getTabbableOptions());\n  const len = list.length;\n  if (len === 0) return;\n  const active = activeElement(getDocument(container));\n  const index = list.indexOf(active);\n  const nextIndex = index === -1 ? dir === 1 ? 0 : len - 1 : index + dir;\n  return list[nextIndex];\n}\nfunction getNextTabbable(referenceElement) {\n  return getTabbableIn(getDocument(referenceElement).body, 1) || referenceElement;\n}\nfunction getPreviousTabbable(referenceElement) {\n  return getTabbableIn(getDocument(referenceElement).body, -1) || referenceElement;\n}\nfunction isOutsideEvent(event, container) {\n  const containerElement = container || event.currentTarget;\n  const relatedTarget = event.relatedTarget;\n  return !relatedTarget || !contains(containerElement, relatedTarget);\n}\nfunction disableFocusInside(container) {\n  const tabbableElements = tabbable(container, getTabbableOptions());\n  tabbableElements.forEach(element => {\n    element.dataset.tabindex = element.getAttribute('tabindex') || '';\n    element.setAttribute('tabindex', '-1');\n  });\n}\nfunction enableFocusInside(container) {\n  const elements = container.querySelectorAll('[data-tabindex]');\n  elements.forEach(element => {\n    const tabindex = element.dataset.tabindex;\n    delete element.dataset.tabindex;\n    if (tabindex) {\n      element.setAttribute('tabindex', tabindex);\n    } else {\n      element.removeAttribute('tabindex');\n    }\n  });\n}\n\nexport { activeElement, contains, createGridCellMap, disableFocusInside, enableFocusInside, findNonDisabledListIndex, getDeepestNode, getDocument, getFloatingFocusElement, getGridCellIndexOfCorner, getGridCellIndices, getGridNavigatedIndex, getMaxListIndex, getMinListIndex, getNextTabbable, getNodeAncestors, getNodeChildren, getPlatform, getPreviousTabbable, getTabbableOptions, getTarget, getUserAgent, isAndroid, isDifferentGridRow, isEventTargetWithin, isIndexOutOfListBounds, isJSDOM, isListIndexDisabled, isMac, isMouseLikePointerType, isOutsideEvent, isReactEvent, isRootElement, isSafari, isTypeableCombobox, isTypeableElement, isVirtualClick, isVirtualPointerEvent, matchesFocusVisible, stopEvent, useEffectEvent, useLatestRef, index as useModernLayoutEffect };\n","import { getSideAxis, getAlignmentAxis, getAxisLength, getSide, getAlignment, evaluate, getPaddingObject, rectToClientRect, min, clamp, placements, getAlignmentSides, getOppositeAlignmentPlacement, getOppositePlacement, getExpandedPlacements, getOppositeAxisPlacements, sides, max, getOppositeAxis } from '@floating-ui/utils';\nexport { rectToClientRect } from '@floating-ui/utils';\n\nfunction computeCoordsFromPlacement(_ref, placement, rtl) {\n  let {\n    reference,\n    floating\n  } = _ref;\n  const sideAxis = getSideAxis(placement);\n  const alignmentAxis = getAlignmentAxis(placement);\n  const alignLength = getAxisLength(alignmentAxis);\n  const side = getSide(placement);\n  const isVertical = sideAxis === 'y';\n  const commonX = reference.x + reference.width / 2 - floating.width / 2;\n  const commonY = reference.y + reference.height / 2 - floating.height / 2;\n  const commonAlign = reference[alignLength] / 2 - floating[alignLength] / 2;\n  let coords;\n  switch (side) {\n    case 'top':\n      coords = {\n        x: commonX,\n        y: reference.y - floating.height\n      };\n      break;\n    case 'bottom':\n      coords = {\n        x: commonX,\n        y: reference.y + reference.height\n      };\n      break;\n    case 'right':\n      coords = {\n        x: reference.x + reference.width,\n        y: commonY\n      };\n      break;\n    case 'left':\n      coords = {\n        x: reference.x - floating.width,\n        y: commonY\n      };\n      break;\n    default:\n      coords = {\n        x: reference.x,\n        y: reference.y\n      };\n  }\n  switch (getAlignment(placement)) {\n    case 'start':\n      coords[alignmentAxis] -= commonAlign * (rtl && isVertical ? -1 : 1);\n      break;\n    case 'end':\n      coords[alignmentAxis] += commonAlign * (rtl && isVertical ? -1 : 1);\n      break;\n  }\n  return coords;\n}\n\n/**\n * Computes the `x` and `y` coordinates that will place the floating element\n * next to a given reference element.\n *\n * This export does not have any `platform` interface logic. You will need to\n * write one for the platform you are using Floating UI with.\n */\nconst computePosition = async (reference, floating, config) => {\n  const {\n    placement = 'bottom',\n    strategy = 'absolute',\n    middleware = [],\n    platform\n  } = config;\n  const validMiddleware = middleware.filter(Boolean);\n  const rtl = await (platform.isRTL == null ? void 0 : platform.isRTL(floating));\n  let rects = await platform.getElementRects({\n    reference,\n    floating,\n    strategy\n  });\n  let {\n    x,\n    y\n  } = computeCoordsFromPlacement(rects, placement, rtl);\n  let statefulPlacement = placement;\n  let middlewareData = {};\n  let resetCount = 0;\n  for (let i = 0; i < validMiddleware.length; i++) {\n    const {\n      name,\n      fn\n    } = validMiddleware[i];\n    const {\n      x: nextX,\n      y: nextY,\n      data,\n      reset\n    } = await fn({\n      x,\n      y,\n      initialPlacement: placement,\n      placement: statefulPlacement,\n      strategy,\n      middlewareData,\n      rects,\n      platform,\n      elements: {\n        reference,\n        floating\n      }\n    });\n    x = nextX != null ? nextX : x;\n    y = nextY != null ? nextY : y;\n    middlewareData = {\n      ...middlewareData,\n      [name]: {\n        ...middlewareData[name],\n        ...data\n      }\n    };\n    if (reset && resetCount <= 50) {\n      resetCount++;\n      if (typeof reset === 'object') {\n        if (reset.placement) {\n          statefulPlacement = reset.placement;\n        }\n        if (reset.rects) {\n          rects = reset.rects === true ? await platform.getElementRects({\n            reference,\n            floating,\n            strategy\n          }) : reset.rects;\n        }\n        ({\n          x,\n          y\n        } = computeCoordsFromPlacement(rects, statefulPlacement, rtl));\n      }\n      i = -1;\n    }\n  }\n  return {\n    x,\n    y,\n    placement: statefulPlacement,\n    strategy,\n    middlewareData\n  };\n};\n\n/**\n * Resolves with an object of overflow side offsets that determine how much the\n * element is overflowing a given clipping boundary on each side.\n * - positive = overflowing the boundary by that number of pixels\n * - negative = how many pixels left before it will overflow\n * - 0 = lies flush with the boundary\n * @see https://floating-ui.com/docs/detectOverflow\n */\nasync function detectOverflow(state, options) {\n  var _await$platform$isEle;\n  if (options === void 0) {\n    options = {};\n  }\n  const {\n    x,\n    y,\n    platform,\n    rects,\n    elements,\n    strategy\n  } = state;\n  const {\n    boundary = 'clippingAncestors',\n    rootBoundary = 'viewport',\n    elementContext = 'floating',\n    altBoundary = false,\n    padding = 0\n  } = evaluate(options, state);\n  const paddingObject = getPaddingObject(padding);\n  const altContext = elementContext === 'floating' ? 'reference' : 'floating';\n  const element = elements[altBoundary ? altContext : elementContext];\n  const clippingClientRect = rectToClientRect(await platform.getClippingRect({\n    element: ((_await$platform$isEle = await (platform.isElement == null ? void 0 : platform.isElement(element))) != null ? _await$platform$isEle : true) ? element : element.contextElement || (await (platform.getDocumentElement == null ? void 0 : platform.getDocumentElement(elements.floating))),\n    boundary,\n    rootBoundary,\n    strategy\n  }));\n  const rect = elementContext === 'floating' ? {\n    x,\n    y,\n    width: rects.floating.width,\n    height: rects.floating.height\n  } : rects.reference;\n  const offsetParent = await (platform.getOffsetParent == null ? void 0 : platform.getOffsetParent(elements.floating));\n  const offsetScale = (await (platform.isElement == null ? void 0 : platform.isElement(offsetParent))) ? (await (platform.getScale == null ? void 0 : platform.getScale(offsetParent))) || {\n    x: 1,\n    y: 1\n  } : {\n    x: 1,\n    y: 1\n  };\n  const elementClientRect = rectToClientRect(platform.convertOffsetParentRelativeRectToViewportRelativeRect ? await platform.convertOffsetParentRelativeRectToViewportRelativeRect({\n    elements,\n    rect,\n    offsetParent,\n    strategy\n  }) : rect);\n  return {\n    top: (clippingClientRect.top - elementClientRect.top + paddingObject.top) / offsetScale.y,\n    bottom: (elementClientRect.bottom - clippingClientRect.bottom + paddingObject.bottom) / offsetScale.y,\n    left: (clippingClientRect.left - elementClientRect.left + paddingObject.left) / offsetScale.x,\n    right: (elementClientRect.right - clippingClientRect.right + paddingObject.right) / offsetScale.x\n  };\n}\n\n/**\n * Provides data to position an inner element of the floating element so that it\n * appears centered to the reference element.\n * @see https://floating-ui.com/docs/arrow\n */\nconst arrow = options => ({\n  name: 'arrow',\n  options,\n  async fn(state) {\n    const {\n      x,\n      y,\n      placement,\n      rects,\n      platform,\n      elements,\n      middlewareData\n    } = state;\n    // Since `element` is required, we don't Partial<> the type.\n    const {\n      element,\n      padding = 0\n    } = evaluate(options, state) || {};\n    if (element == null) {\n      return {};\n    }\n    const paddingObject = getPaddingObject(padding);\n    const coords = {\n      x,\n      y\n    };\n    const axis = getAlignmentAxis(placement);\n    const length = getAxisLength(axis);\n    const arrowDimensions = await platform.getDimensions(element);\n    const isYAxis = axis === 'y';\n    const minProp = isYAxis ? 'top' : 'left';\n    const maxProp = isYAxis ? 'bottom' : 'right';\n    const clientProp = isYAxis ? 'clientHeight' : 'clientWidth';\n    const endDiff = rects.reference[length] + rects.reference[axis] - coords[axis] - rects.floating[length];\n    const startDiff = coords[axis] - rects.reference[axis];\n    const arrowOffsetParent = await (platform.getOffsetParent == null ? void 0 : platform.getOffsetParent(element));\n    let clientSize = arrowOffsetParent ? arrowOffsetParent[clientProp] : 0;\n\n    // DOM platform can return `window` as the `offsetParent`.\n    if (!clientSize || !(await (platform.isElement == null ? void 0 : platform.isElement(arrowOffsetParent)))) {\n      clientSize = elements.floating[clientProp] || rects.floating[length];\n    }\n    const centerToReference = endDiff / 2 - startDiff / 2;\n\n    // If the padding is large enough that it causes the arrow to no longer be\n    // centered, modify the padding so that it is centered.\n    const largestPossiblePadding = clientSize / 2 - arrowDimensions[length] / 2 - 1;\n    const minPadding = min(paddingObject[minProp], largestPossiblePadding);\n    const maxPadding = min(paddingObject[maxProp], largestPossiblePadding);\n\n    // Make sure the arrow doesn't overflow the floating element if the center\n    // point is outside the floating element's bounds.\n    const min$1 = minPadding;\n    const max = clientSize - arrowDimensions[length] - maxPadding;\n    const center = clientSize / 2 - arrowDimensions[length] / 2 + centerToReference;\n    const offset = clamp(min$1, center, max);\n\n    // If the reference is small enough that the arrow's padding causes it to\n    // to point to nothing for an aligned placement, adjust the offset of the\n    // floating element itself. To ensure `shift()` continues to take action,\n    // a single reset is performed when this is true.\n    const shouldAddOffset = !middlewareData.arrow && getAlignment(placement) != null && center !== offset && rects.reference[length] / 2 - (center < min$1 ? minPadding : maxPadding) - arrowDimensions[length] / 2 < 0;\n    const alignmentOffset = shouldAddOffset ? center < min$1 ? center - min$1 : center - max : 0;\n    return {\n      [axis]: coords[axis] + alignmentOffset,\n      data: {\n        [axis]: offset,\n        centerOffset: center - offset - alignmentOffset,\n        ...(shouldAddOffset && {\n          alignmentOffset\n        })\n      },\n      reset: shouldAddOffset\n    };\n  }\n});\n\nfunction getPlacementList(alignment, autoAlignment, allowedPlacements) {\n  const allowedPlacementsSortedByAlignment = alignment ? [...allowedPlacements.filter(placement => getAlignment(placement) === alignment), ...allowedPlacements.filter(placement => getAlignment(placement) !== alignment)] : allowedPlacements.filter(placement => getSide(placement) === placement);\n  return allowedPlacementsSortedByAlignment.filter(placement => {\n    if (alignment) {\n      return getAlignment(placement) === alignment || (autoAlignment ? getOppositeAlignmentPlacement(placement) !== placement : false);\n    }\n    return true;\n  });\n}\n/**\n * Optimizes the visibility of the floating element by choosing the placement\n * that has the most space available automatically, without needing to specify a\n * preferred placement. Alternative to `flip`.\n * @see https://floating-ui.com/docs/autoPlacement\n */\nconst autoPlacement = function (options) {\n  if (options === void 0) {\n    options = {};\n  }\n  return {\n    name: 'autoPlacement',\n    options,\n    async fn(state) {\n      var _middlewareData$autoP, _middlewareData$autoP2, _placementsThatFitOnE;\n      const {\n        rects,\n        middlewareData,\n        placement,\n        platform,\n        elements\n      } = state;\n      const {\n        crossAxis = false,\n        alignment,\n        allowedPlacements = placements,\n        autoAlignment = true,\n        ...detectOverflowOptions\n      } = evaluate(options, state);\n      const placements$1 = alignment !== undefined || allowedPlacements === placements ? getPlacementList(alignment || null, autoAlignment, allowedPlacements) : allowedPlacements;\n      const overflow = await detectOverflow(state, detectOverflowOptions);\n      const currentIndex = ((_middlewareData$autoP = middlewareData.autoPlacement) == null ? void 0 : _middlewareData$autoP.index) || 0;\n      const currentPlacement = placements$1[currentIndex];\n      if (currentPlacement == null) {\n        return {};\n      }\n      const alignmentSides = getAlignmentSides(currentPlacement, rects, await (platform.isRTL == null ? void 0 : platform.isRTL(elements.floating)));\n\n      // Make `computeCoords` start from the right place.\n      if (placement !== currentPlacement) {\n        return {\n          reset: {\n            placement: placements$1[0]\n          }\n        };\n      }\n      const currentOverflows = [overflow[getSide(currentPlacement)], overflow[alignmentSides[0]], overflow[alignmentSides[1]]];\n      const allOverflows = [...(((_middlewareData$autoP2 = middlewareData.autoPlacement) == null ? void 0 : _middlewareData$autoP2.overflows) || []), {\n        placement: currentPlacement,\n        overflows: currentOverflows\n      }];\n      const nextPlacement = placements$1[currentIndex + 1];\n\n      // There are more placements to check.\n      if (nextPlacement) {\n        return {\n          data: {\n            index: currentIndex + 1,\n            overflows: allOverflows\n          },\n          reset: {\n            placement: nextPlacement\n          }\n        };\n      }\n      const placementsSortedByMostSpace = allOverflows.map(d => {\n        const alignment = getAlignment(d.placement);\n        return [d.placement, alignment && crossAxis ?\n        // Check along the mainAxis and main crossAxis side.\n        d.overflows.slice(0, 2).reduce((acc, v) => acc + v, 0) :\n        // Check only the mainAxis.\n        d.overflows[0], d.overflows];\n      }).sort((a, b) => a[1] - b[1]);\n      const placementsThatFitOnEachSide = placementsSortedByMostSpace.filter(d => d[2].slice(0,\n      // Aligned placements should not check their opposite crossAxis\n      // side.\n      getAlignment(d[0]) ? 2 : 3).every(v => v <= 0));\n      const resetPlacement = ((_placementsThatFitOnE = placementsThatFitOnEachSide[0]) == null ? void 0 : _placementsThatFitOnE[0]) || placementsSortedByMostSpace[0][0];\n      if (resetPlacement !== placement) {\n        return {\n          data: {\n            index: currentIndex + 1,\n            overflows: allOverflows\n          },\n          reset: {\n            placement: resetPlacement\n          }\n        };\n      }\n      return {};\n    }\n  };\n};\n\n/**\n * Optimizes the visibility of the floating element by flipping the `placement`\n * in order to keep it in view when the preferred placement(s) will overflow the\n * clipping boundary. Alternative to `autoPlacement`.\n * @see https://floating-ui.com/docs/flip\n */\nconst flip = function (options) {\n  if (options === void 0) {\n    options = {};\n  }\n  return {\n    name: 'flip',\n    options,\n    async fn(state) {\n      var _middlewareData$arrow, _middlewareData$flip;\n      const {\n        placement,\n        middlewareData,\n        rects,\n        initialPlacement,\n        platform,\n        elements\n      } = state;\n      const {\n        mainAxis: checkMainAxis = true,\n        crossAxis: checkCrossAxis = true,\n        fallbackPlacements: specifiedFallbackPlacements,\n        fallbackStrategy = 'bestFit',\n        fallbackAxisSideDirection = 'none',\n        flipAlignment = true,\n        ...detectOverflowOptions\n      } = evaluate(options, state);\n\n      // If a reset by the arrow was caused due to an alignment offset being\n      // added, we should skip any logic now since `flip()` has already done its\n      // work.\n      // https://github.com/floating-ui/floating-ui/issues/2549#issuecomment-1719601643\n      if ((_middlewareData$arrow = middlewareData.arrow) != null && _middlewareData$arrow.alignmentOffset) {\n        return {};\n      }\n      const side = getSide(placement);\n      const initialSideAxis = getSideAxis(initialPlacement);\n      const isBasePlacement = getSide(initialPlacement) === initialPlacement;\n      const rtl = await (platform.isRTL == null ? void 0 : platform.isRTL(elements.floating));\n      const fallbackPlacements = specifiedFallbackPlacements || (isBasePlacement || !flipAlignment ? [getOppositePlacement(initialPlacement)] : getExpandedPlacements(initialPlacement));\n      const hasFallbackAxisSideDirection = fallbackAxisSideDirection !== 'none';\n      if (!specifiedFallbackPlacements && hasFallbackAxisSideDirection) {\n        fallbackPlacements.push(...getOppositeAxisPlacements(initialPlacement, flipAlignment, fallbackAxisSideDirection, rtl));\n      }\n      const placements = [initialPlacement, ...fallbackPlacements];\n      const overflow = await detectOverflow(state, detectOverflowOptions);\n      const overflows = [];\n      let overflowsData = ((_middlewareData$flip = middlewareData.flip) == null ? void 0 : _middlewareData$flip.overflows) || [];\n      if (checkMainAxis) {\n        overflows.push(overflow[side]);\n      }\n      if (checkCrossAxis) {\n        const sides = getAlignmentSides(placement, rects, rtl);\n        overflows.push(overflow[sides[0]], overflow[sides[1]]);\n      }\n      overflowsData = [...overflowsData, {\n        placement,\n        overflows\n      }];\n\n      // One or more sides is overflowing.\n      if (!overflows.every(side => side <= 0)) {\n        var _middlewareData$flip2, _overflowsData$filter;\n        const nextIndex = (((_middlewareData$flip2 = middlewareData.flip) == null ? void 0 : _middlewareData$flip2.index) || 0) + 1;\n        const nextPlacement = placements[nextIndex];\n        if (nextPlacement) {\n          const ignoreCrossAxisOverflow = checkCrossAxis === 'alignment' ? initialSideAxis !== getSideAxis(nextPlacement) : false;\n          if (!ignoreCrossAxisOverflow ||\n          // We leave the current main axis only if every placement on that axis\n          // overflows the main axis.\n          overflowsData.every(d => getSideAxis(d.placement) === initialSideAxis ? d.overflows[0] > 0 : true)) {\n            // Try next placement and re-run the lifecycle.\n            return {\n              data: {\n                index: nextIndex,\n                overflows: overflowsData\n              },\n              reset: {\n                placement: nextPlacement\n              }\n            };\n          }\n        }\n\n        // First, find the candidates that fit on the mainAxis side of overflow,\n        // then find the placement that fits the best on the main crossAxis side.\n        let resetPlacement = (_overflowsData$filter = overflowsData.filter(d => d.overflows[0] <= 0).sort((a, b) => a.overflows[1] - b.overflows[1])[0]) == null ? void 0 : _overflowsData$filter.placement;\n\n        // Otherwise fallback.\n        if (!resetPlacement) {\n          switch (fallbackStrategy) {\n            case 'bestFit':\n              {\n                var _overflowsData$filter2;\n                const placement = (_overflowsData$filter2 = overflowsData.filter(d => {\n                  if (hasFallbackAxisSideDirection) {\n                    const currentSideAxis = getSideAxis(d.placement);\n                    return currentSideAxis === initialSideAxis ||\n                    // Create a bias to the `y` side axis due to horizontal\n                    // reading directions favoring greater width.\n                    currentSideAxis === 'y';\n                  }\n                  return true;\n                }).map(d => [d.placement, d.overflows.filter(overflow => overflow > 0).reduce((acc, overflow) => acc + overflow, 0)]).sort((a, b) => a[1] - b[1])[0]) == null ? void 0 : _overflowsData$filter2[0];\n                if (placement) {\n                  resetPlacement = placement;\n                }\n                break;\n              }\n            case 'initialPlacement':\n              resetPlacement = initialPlacement;\n              break;\n          }\n        }\n        if (placement !== resetPlacement) {\n          return {\n            reset: {\n              placement: resetPlacement\n            }\n          };\n        }\n      }\n      return {};\n    }\n  };\n};\n\nfunction getSideOffsets(overflow, rect) {\n  return {\n    top: overflow.top - rect.height,\n    right: overflow.right - rect.width,\n    bottom: overflow.bottom - rect.height,\n    left: overflow.left - rect.width\n  };\n}\nfunction isAnySideFullyClipped(overflow) {\n  return sides.some(side => overflow[side] >= 0);\n}\n/**\n * Provides data to hide the floating element in applicable situations, such as\n * when it is not in the same clipping context as the reference element.\n * @see https://floating-ui.com/docs/hide\n */\nconst hide = function (options) {\n  if (options === void 0) {\n    options = {};\n  }\n  return {\n    name: 'hide',\n    options,\n    async fn(state) {\n      const {\n        rects\n      } = state;\n      const {\n        strategy = 'referenceHidden',\n        ...detectOverflowOptions\n      } = evaluate(options, state);\n      switch (strategy) {\n        case 'referenceHidden':\n          {\n            const overflow = await detectOverflow(state, {\n              ...detectOverflowOptions,\n              elementContext: 'reference'\n            });\n            const offsets = getSideOffsets(overflow, rects.reference);\n            return {\n              data: {\n                referenceHiddenOffsets: offsets,\n                referenceHidden: isAnySideFullyClipped(offsets)\n              }\n            };\n          }\n        case 'escaped':\n          {\n            const overflow = await detectOverflow(state, {\n              ...detectOverflowOptions,\n              altBoundary: true\n            });\n            const offsets = getSideOffsets(overflow, rects.floating);\n            return {\n              data: {\n                escapedOffsets: offsets,\n                escaped: isAnySideFullyClipped(offsets)\n              }\n            };\n          }\n        default:\n          {\n            return {};\n          }\n      }\n    }\n  };\n};\n\nfunction getBoundingRect(rects) {\n  const minX = min(...rects.map(rect => rect.left));\n  const minY = min(...rects.map(rect => rect.top));\n  const maxX = max(...rects.map(rect => rect.right));\n  const maxY = max(...rects.map(rect => rect.bottom));\n  return {\n    x: minX,\n    y: minY,\n    width: maxX - minX,\n    height: maxY - minY\n  };\n}\nfunction getRectsByLine(rects) {\n  const sortedRects = rects.slice().sort((a, b) => a.y - b.y);\n  const groups = [];\n  let prevRect = null;\n  for (let i = 0; i < sortedRects.length; i++) {\n    const rect = sortedRects[i];\n    if (!prevRect || rect.y - prevRect.y > prevRect.height / 2) {\n      groups.push([rect]);\n    } else {\n      groups[groups.length - 1].push(rect);\n    }\n    prevRect = rect;\n  }\n  return groups.map(rect => rectToClientRect(getBoundingRect(rect)));\n}\n/**\n * Provides improved positioning for inline reference elements that can span\n * over multiple lines, such as hyperlinks or range selections.\n * @see https://floating-ui.com/docs/inline\n */\nconst inline = function (options) {\n  if (options === void 0) {\n    options = {};\n  }\n  return {\n    name: 'inline',\n    options,\n    async fn(state) {\n      const {\n        placement,\n        elements,\n        rects,\n        platform,\n        strategy\n      } = state;\n      // A MouseEvent's client{X,Y} coords can be up to 2 pixels off a\n      // ClientRect's bounds, despite the event listener being triggered. A\n      // padding of 2 seems to handle this issue.\n      const {\n        padding = 2,\n        x,\n        y\n      } = evaluate(options, state);\n      const nativeClientRects = Array.from((await (platform.getClientRects == null ? void 0 : platform.getClientRects(elements.reference))) || []);\n      const clientRects = getRectsByLine(nativeClientRects);\n      const fallback = rectToClientRect(getBoundingRect(nativeClientRects));\n      const paddingObject = getPaddingObject(padding);\n      function getBoundingClientRect() {\n        // There are two rects and they are disjoined.\n        if (clientRects.length === 2 && clientRects[0].left > clientRects[1].right && x != null && y != null) {\n          // Find the first rect in which the point is fully inside.\n          return clientRects.find(rect => x > rect.left - paddingObject.left && x < rect.right + paddingObject.right && y > rect.top - paddingObject.top && y < rect.bottom + paddingObject.bottom) || fallback;\n        }\n\n        // There are 2 or more connected rects.\n        if (clientRects.length >= 2) {\n          if (getSideAxis(placement) === 'y') {\n            const firstRect = clientRects[0];\n            const lastRect = clientRects[clientRects.length - 1];\n            const isTop = getSide(placement) === 'top';\n            const top = firstRect.top;\n            const bottom = lastRect.bottom;\n            const left = isTop ? firstRect.left : lastRect.left;\n            const right = isTop ? firstRect.right : lastRect.right;\n            const width = right - left;\n            const height = bottom - top;\n            return {\n              top,\n              bottom,\n              left,\n              right,\n              width,\n              height,\n              x: left,\n              y: top\n            };\n          }\n          const isLeftSide = getSide(placement) === 'left';\n          const maxRight = max(...clientRects.map(rect => rect.right));\n          const minLeft = min(...clientRects.map(rect => rect.left));\n          const measureRects = clientRects.filter(rect => isLeftSide ? rect.left === minLeft : rect.right === maxRight);\n          const top = measureRects[0].top;\n          const bottom = measureRects[measureRects.length - 1].bottom;\n          const left = minLeft;\n          const right = maxRight;\n          const width = right - left;\n          const height = bottom - top;\n          return {\n            top,\n            bottom,\n            left,\n            right,\n            width,\n            height,\n            x: left,\n            y: top\n          };\n        }\n        return fallback;\n      }\n      const resetRects = await platform.getElementRects({\n        reference: {\n          getBoundingClientRect\n        },\n        floating: elements.floating,\n        strategy\n      });\n      if (rects.reference.x !== resetRects.reference.x || rects.reference.y !== resetRects.reference.y || rects.reference.width !== resetRects.reference.width || rects.reference.height !== resetRects.reference.height) {\n        return {\n          reset: {\n            rects: resetRects\n          }\n        };\n      }\n      return {};\n    }\n  };\n};\n\nconst originSides = /*#__PURE__*/new Set(['left', 'top']);\n\n// For type backwards-compatibility, the `OffsetOptions` type was also\n// Derivable.\n\nasync function convertValueToCoords(state, options) {\n  const {\n    placement,\n    platform,\n    elements\n  } = state;\n  const rtl = await (platform.isRTL == null ? void 0 : platform.isRTL(elements.floating));\n  const side = getSide(placement);\n  const alignment = getAlignment(placement);\n  const isVertical = getSideAxis(placement) === 'y';\n  const mainAxisMulti = originSides.has(side) ? -1 : 1;\n  const crossAxisMulti = rtl && isVertical ? -1 : 1;\n  const rawValue = evaluate(options, state);\n\n  // eslint-disable-next-line prefer-const\n  let {\n    mainAxis,\n    crossAxis,\n    alignmentAxis\n  } = typeof rawValue === 'number' ? {\n    mainAxis: rawValue,\n    crossAxis: 0,\n    alignmentAxis: null\n  } : {\n    mainAxis: rawValue.mainAxis || 0,\n    crossAxis: rawValue.crossAxis || 0,\n    alignmentAxis: rawValue.alignmentAxis\n  };\n  if (alignment && typeof alignmentAxis === 'number') {\n    crossAxis = alignment === 'end' ? alignmentAxis * -1 : alignmentAxis;\n  }\n  return isVertical ? {\n    x: crossAxis * crossAxisMulti,\n    y: mainAxis * mainAxisMulti\n  } : {\n    x: mainAxis * mainAxisMulti,\n    y: crossAxis * crossAxisMulti\n  };\n}\n\n/**\n * Modifies the placement by translating the floating element along the\n * specified axes.\n * A number (shorthand for `mainAxis` or distance), or an axes configuration\n * object may be passed.\n * @see https://floating-ui.com/docs/offset\n */\nconst offset = function (options) {\n  if (options === void 0) {\n    options = 0;\n  }\n  return {\n    name: 'offset',\n    options,\n    async fn(state) {\n      var _middlewareData$offse, _middlewareData$arrow;\n      const {\n        x,\n        y,\n        placement,\n        middlewareData\n      } = state;\n      const diffCoords = await convertValueToCoords(state, options);\n\n      // If the placement is the same and the arrow caused an alignment offset\n      // then we don't need to change the positioning coordinates.\n      if (placement === ((_middlewareData$offse = middlewareData.offset) == null ? void 0 : _middlewareData$offse.placement) && (_middlewareData$arrow = middlewareData.arrow) != null && _middlewareData$arrow.alignmentOffset) {\n        return {};\n      }\n      return {\n        x: x + diffCoords.x,\n        y: y + diffCoords.y,\n        data: {\n          ...diffCoords,\n          placement\n        }\n      };\n    }\n  };\n};\n\n/**\n * Optimizes the visibility of the floating element by shifting it in order to\n * keep it in view when it will overflow the clipping boundary.\n * @see https://floating-ui.com/docs/shift\n */\nconst shift = function (options) {\n  if (options === void 0) {\n    options = {};\n  }\n  return {\n    name: 'shift',\n    options,\n    async fn(state) {\n      const {\n        x,\n        y,\n        placement\n      } = state;\n      const {\n        mainAxis: checkMainAxis = true,\n        crossAxis: checkCrossAxis = false,\n        limiter = {\n          fn: _ref => {\n            let {\n              x,\n              y\n            } = _ref;\n            return {\n              x,\n              y\n            };\n          }\n        },\n        ...detectOverflowOptions\n      } = evaluate(options, state);\n      const coords = {\n        x,\n        y\n      };\n      const overflow = await detectOverflow(state, detectOverflowOptions);\n      const crossAxis = getSideAxis(getSide(placement));\n      const mainAxis = getOppositeAxis(crossAxis);\n      let mainAxisCoord = coords[mainAxis];\n      let crossAxisCoord = coords[crossAxis];\n      if (checkMainAxis) {\n        const minSide = mainAxis === 'y' ? 'top' : 'left';\n        const maxSide = mainAxis === 'y' ? 'bottom' : 'right';\n        const min = mainAxisCoord + overflow[minSide];\n        const max = mainAxisCoord - overflow[maxSide];\n        mainAxisCoord = clamp(min, mainAxisCoord, max);\n      }\n      if (checkCrossAxis) {\n        const minSide = crossAxis === 'y' ? 'top' : 'left';\n        const maxSide = crossAxis === 'y' ? 'bottom' : 'right';\n        const min = crossAxisCoord + overflow[minSide];\n        const max = crossAxisCoord - overflow[maxSide];\n        crossAxisCoord = clamp(min, crossAxisCoord, max);\n      }\n      const limitedCoords = limiter.fn({\n        ...state,\n        [mainAxis]: mainAxisCoord,\n        [crossAxis]: crossAxisCoord\n      });\n      return {\n        ...limitedCoords,\n        data: {\n          x: limitedCoords.x - x,\n          y: limitedCoords.y - y,\n          enabled: {\n            [mainAxis]: checkMainAxis,\n            [crossAxis]: checkCrossAxis\n          }\n        }\n      };\n    }\n  };\n};\n/**\n * Built-in `limiter` that will stop `shift()` at a certain point.\n */\nconst limitShift = function (options) {\n  if (options === void 0) {\n    options = {};\n  }\n  return {\n    options,\n    fn(state) {\n      const {\n        x,\n        y,\n        placement,\n        rects,\n        middlewareData\n      } = state;\n      const {\n        offset = 0,\n        mainAxis: checkMainAxis = true,\n        crossAxis: checkCrossAxis = true\n      } = evaluate(options, state);\n      const coords = {\n        x,\n        y\n      };\n      const crossAxis = getSideAxis(placement);\n      const mainAxis = getOppositeAxis(crossAxis);\n      let mainAxisCoord = coords[mainAxis];\n      let crossAxisCoord = coords[crossAxis];\n      const rawOffset = evaluate(offset, state);\n      const computedOffset = typeof rawOffset === 'number' ? {\n        mainAxis: rawOffset,\n        crossAxis: 0\n      } : {\n        mainAxis: 0,\n        crossAxis: 0,\n        ...rawOffset\n      };\n      if (checkMainAxis) {\n        const len = mainAxis === 'y' ? 'height' : 'width';\n        const limitMin = rects.reference[mainAxis] - rects.floating[len] + computedOffset.mainAxis;\n        const limitMax = rects.reference[mainAxis] + rects.reference[len] - computedOffset.mainAxis;\n        if (mainAxisCoord < limitMin) {\n          mainAxisCoord = limitMin;\n        } else if (mainAxisCoord > limitMax) {\n          mainAxisCoord = limitMax;\n        }\n      }\n      if (checkCrossAxis) {\n        var _middlewareData$offse, _middlewareData$offse2;\n        const len = mainAxis === 'y' ? 'width' : 'height';\n        const isOriginSide = originSides.has(getSide(placement));\n        const limitMin = rects.reference[crossAxis] - rects.floating[len] + (isOriginSide ? ((_middlewareData$offse = middlewareData.offset) == null ? void 0 : _middlewareData$offse[crossAxis]) || 0 : 0) + (isOriginSide ? 0 : computedOffset.crossAxis);\n        const limitMax = rects.reference[crossAxis] + rects.reference[len] + (isOriginSide ? 0 : ((_middlewareData$offse2 = middlewareData.offset) == null ? void 0 : _middlewareData$offse2[crossAxis]) || 0) - (isOriginSide ? computedOffset.crossAxis : 0);\n        if (crossAxisCoord < limitMin) {\n          crossAxisCoord = limitMin;\n        } else if (crossAxisCoord > limitMax) {\n          crossAxisCoord = limitMax;\n        }\n      }\n      return {\n        [mainAxis]: mainAxisCoord,\n        [crossAxis]: crossAxisCoord\n      };\n    }\n  };\n};\n\n/**\n * Provides data that allows you to change the size of the floating element —\n * for instance, prevent it from overflowing the clipping boundary or match the\n * width of the reference element.\n * @see https://floating-ui.com/docs/size\n */\nconst size = function (options) {\n  if (options === void 0) {\n    options = {};\n  }\n  return {\n    name: 'size',\n    options,\n    async fn(state) {\n      var _state$middlewareData, _state$middlewareData2;\n      const {\n        placement,\n        rects,\n        platform,\n        elements\n      } = state;\n      const {\n        apply = () => {},\n        ...detectOverflowOptions\n      } = evaluate(options, state);\n      const overflow = await detectOverflow(state, detectOverflowOptions);\n      const side = getSide(placement);\n      const alignment = getAlignment(placement);\n      const isYAxis = getSideAxis(placement) === 'y';\n      const {\n        width,\n        height\n      } = rects.floating;\n      let heightSide;\n      let widthSide;\n      if (side === 'top' || side === 'bottom') {\n        heightSide = side;\n        widthSide = alignment === ((await (platform.isRTL == null ? void 0 : platform.isRTL(elements.floating))) ? 'start' : 'end') ? 'left' : 'right';\n      } else {\n        widthSide = side;\n        heightSide = alignment === 'end' ? 'top' : 'bottom';\n      }\n      const maximumClippingHeight = height - overflow.top - overflow.bottom;\n      const maximumClippingWidth = width - overflow.left - overflow.right;\n      const overflowAvailableHeight = min(height - overflow[heightSide], maximumClippingHeight);\n      const overflowAvailableWidth = min(width - overflow[widthSide], maximumClippingWidth);\n      const noShift = !state.middlewareData.shift;\n      let availableHeight = overflowAvailableHeight;\n      let availableWidth = overflowAvailableWidth;\n      if ((_state$middlewareData = state.middlewareData.shift) != null && _state$middlewareData.enabled.x) {\n        availableWidth = maximumClippingWidth;\n      }\n      if ((_state$middlewareData2 = state.middlewareData.shift) != null && _state$middlewareData2.enabled.y) {\n        availableHeight = maximumClippingHeight;\n      }\n      if (noShift && !alignment) {\n        const xMin = max(overflow.left, 0);\n        const xMax = max(overflow.right, 0);\n        const yMin = max(overflow.top, 0);\n        const yMax = max(overflow.bottom, 0);\n        if (isYAxis) {\n          availableWidth = width - 2 * (xMin !== 0 || xMax !== 0 ? xMin + xMax : max(overflow.left, overflow.right));\n        } else {\n          availableHeight = height - 2 * (yMin !== 0 || yMax !== 0 ? yMin + yMax : max(overflow.top, overflow.bottom));\n        }\n      }\n      await apply({\n        ...state,\n        availableWidth,\n        availableHeight\n      });\n      const nextDimensions = await platform.getDimensions(elements.floating);\n      if (width !== nextDimensions.width || height !== nextDimensions.height) {\n        return {\n          reset: {\n            rects: true\n          }\n        };\n      }\n      return {};\n    }\n  };\n};\n\nexport { arrow, autoPlacement, computePosition, detectOverflow, flip, hide, inline, limitShift, offset, shift, size };\n","import { rectToClientRect, arrow as arrow$1, autoPlacement as autoPlacement$1, detectOverflow as detectOverflow$1, flip as flip$1, hide as hide$1, inline as inline$1, limitShift as limitShift$1, offset as offset$1, shift as shift$1, size as size$1, computePosition as computePosition$1 } from '@floating-ui/core';\nimport { round, createCoords, max, min, floor } from '@floating-ui/utils';\nimport { getComputedStyle as getComputedStyle$1, isHTMLElement, isElement, getWindow, isWebKit, getFrameElement, getNodeScroll, getDocumentElement, isTopLayer, getNodeName, isOverflowElement, getOverflowAncestors, getParentNode, isLastTraversableNode, isContainingBlock, isTableElement, getContainingBlock } from '@floating-ui/utils/dom';\nexport { getOverflowAncestors } from '@floating-ui/utils/dom';\n\nfunction getCssDimensions(element) {\n  const css = getComputedStyle$1(element);\n  // In testing environments, the `width` and `height` properties are empty\n  // strings for SVG elements, returning NaN. Fallback to `0` in this case.\n  let width = parseFloat(css.width) || 0;\n  let height = parseFloat(css.height) || 0;\n  const hasOffset = isHTMLElement(element);\n  const offsetWidth = hasOffset ? element.offsetWidth : width;\n  const offsetHeight = hasOffset ? element.offsetHeight : height;\n  const shouldFallback = round(width) !== offsetWidth || round(height) !== offsetHeight;\n  if (shouldFallback) {\n    width = offsetWidth;\n    height = offsetHeight;\n  }\n  return {\n    width,\n    height,\n    $: shouldFallback\n  };\n}\n\nfunction unwrapElement(element) {\n  return !isElement(element) ? element.contextElement : element;\n}\n\nfunction getScale(element) {\n  const domElement = unwrapElement(element);\n  if (!isHTMLElement(domElement)) {\n    return createCoords(1);\n  }\n  const rect = domElement.getBoundingClientRect();\n  const {\n    width,\n    height,\n    $\n  } = getCssDimensions(domElement);\n  let x = ($ ? round(rect.width) : rect.width) / width;\n  let y = ($ ? round(rect.height) : rect.height) / height;\n\n  // 0, NaN, or Infinity should always fallback to 1.\n\n  if (!x || !Number.isFinite(x)) {\n    x = 1;\n  }\n  if (!y || !Number.isFinite(y)) {\n    y = 1;\n  }\n  return {\n    x,\n    y\n  };\n}\n\nconst noOffsets = /*#__PURE__*/createCoords(0);\nfunction getVisualOffsets(element) {\n  const win = getWindow(element);\n  if (!isWebKit() || !win.visualViewport) {\n    return noOffsets;\n  }\n  return {\n    x: win.visualViewport.offsetLeft,\n    y: win.visualViewport.offsetTop\n  };\n}\nfunction shouldAddVisualOffsets(element, isFixed, floatingOffsetParent) {\n  if (isFixed === void 0) {\n    isFixed = false;\n  }\n  if (!floatingOffsetParent || isFixed && floatingOffsetParent !== getWindow(element)) {\n    return false;\n  }\n  return isFixed;\n}\n\nfunction getBoundingClientRect(element, includeScale, isFixedStrategy, offsetParent) {\n  if (includeScale === void 0) {\n    includeScale = false;\n  }\n  if (isFixedStrategy === void 0) {\n    isFixedStrategy = false;\n  }\n  const clientRect = element.getBoundingClientRect();\n  const domElement = unwrapElement(element);\n  let scale = createCoords(1);\n  if (includeScale) {\n    if (offsetParent) {\n      if (isElement(offsetParent)) {\n        scale = getScale(offsetParent);\n      }\n    } else {\n      scale = getScale(element);\n    }\n  }\n  const visualOffsets = shouldAddVisualOffsets(domElement, isFixedStrategy, offsetParent) ? getVisualOffsets(domElement) : createCoords(0);\n  let x = (clientRect.left + visualOffsets.x) / scale.x;\n  let y = (clientRect.top + visualOffsets.y) / scale.y;\n  let width = clientRect.width / scale.x;\n  let height = clientRect.height / scale.y;\n  if (domElement) {\n    const win = getWindow(domElement);\n    const offsetWin = offsetParent && isElement(offsetParent) ? getWindow(offsetParent) : offsetParent;\n    let currentWin = win;\n    let currentIFrame = getFrameElement(currentWin);\n    while (currentIFrame && offsetParent && offsetWin !== currentWin) {\n      const iframeScale = getScale(currentIFrame);\n      const iframeRect = currentIFrame.getBoundingClientRect();\n      const css = getComputedStyle$1(currentIFrame);\n      const left = iframeRect.left + (currentIFrame.clientLeft + parseFloat(css.paddingLeft)) * iframeScale.x;\n      const top = iframeRect.top + (currentIFrame.clientTop + parseFloat(css.paddingTop)) * iframeScale.y;\n      x *= iframeScale.x;\n      y *= iframeScale.y;\n      width *= iframeScale.x;\n      height *= iframeScale.y;\n      x += left;\n      y += top;\n      currentWin = getWindow(currentIFrame);\n      currentIFrame = getFrameElement(currentWin);\n    }\n  }\n  return rectToClientRect({\n    width,\n    height,\n    x,\n    y\n  });\n}\n\n// If <html> has a CSS width greater than the viewport, then this will be\n// incorrect for RTL.\nfunction getWindowScrollBarX(element, rect) {\n  const leftScroll = getNodeScroll(element).scrollLeft;\n  if (!rect) {\n    return getBoundingClientRect(getDocumentElement(element)).left + leftScroll;\n  }\n  return rect.left + leftScroll;\n}\n\nfunction getHTMLOffset(documentElement, scroll) {\n  const htmlRect = documentElement.getBoundingClientRect();\n  const x = htmlRect.left + scroll.scrollLeft - getWindowScrollBarX(documentElement, htmlRect);\n  const y = htmlRect.top + scroll.scrollTop;\n  return {\n    x,\n    y\n  };\n}\n\nfunction convertOffsetParentRelativeRectToViewportRelativeRect(_ref) {\n  let {\n    elements,\n    rect,\n    offsetParent,\n    strategy\n  } = _ref;\n  const isFixed = strategy === 'fixed';\n  const documentElement = getDocumentElement(offsetParent);\n  const topLayer = elements ? isTopLayer(elements.floating) : false;\n  if (offsetParent === documentElement || topLayer && isFixed) {\n    return rect;\n  }\n  let scroll = {\n    scrollLeft: 0,\n    scrollTop: 0\n  };\n  let scale = createCoords(1);\n  const offsets = createCoords(0);\n  const isOffsetParentAnElement = isHTMLElement(offsetParent);\n  if (isOffsetParentAnElement || !isOffsetParentAnElement && !isFixed) {\n    if (getNodeName(offsetParent) !== 'body' || isOverflowElement(documentElement)) {\n      scroll = getNodeScroll(offsetParent);\n    }\n    if (isHTMLElement(offsetParent)) {\n      const offsetRect = getBoundingClientRect(offsetParent);\n      scale = getScale(offsetParent);\n      offsets.x = offsetRect.x + offsetParent.clientLeft;\n      offsets.y = offsetRect.y + offsetParent.clientTop;\n    }\n  }\n  const htmlOffset = documentElement && !isOffsetParentAnElement && !isFixed ? getHTMLOffset(documentElement, scroll) : createCoords(0);\n  return {\n    width: rect.width * scale.x,\n    height: rect.height * scale.y,\n    x: rect.x * scale.x - scroll.scrollLeft * scale.x + offsets.x + htmlOffset.x,\n    y: rect.y * scale.y - scroll.scrollTop * scale.y + offsets.y + htmlOffset.y\n  };\n}\n\nfunction getClientRects(element) {\n  return Array.from(element.getClientRects());\n}\n\n// Gets the entire size of the scrollable document area, even extending outside\n// of the `<html>` and `<body>` rect bounds if horizontally scrollable.\nfunction getDocumentRect(element) {\n  const html = getDocumentElement(element);\n  const scroll = getNodeScroll(element);\n  const body = element.ownerDocument.body;\n  const width = max(html.scrollWidth, html.clientWidth, body.scrollWidth, body.clientWidth);\n  const height = max(html.scrollHeight, html.clientHeight, body.scrollHeight, body.clientHeight);\n  let x = -scroll.scrollLeft + getWindowScrollBarX(element);\n  const y = -scroll.scrollTop;\n  if (getComputedStyle$1(body).direction === 'rtl') {\n    x += max(html.clientWidth, body.clientWidth) - width;\n  }\n  return {\n    width,\n    height,\n    x,\n    y\n  };\n}\n\n// Safety check: ensure the scrollbar space is reasonable in case this\n// calculation is affected by unusual styles.\n// Most scrollbars leave 15-18px of space.\nconst SCROLLBAR_MAX = 25;\nfunction getViewportRect(element, strategy) {\n  const win = getWindow(element);\n  const html = getDocumentElement(element);\n  const visualViewport = win.visualViewport;\n  let width = html.clientWidth;\n  let height = html.clientHeight;\n  let x = 0;\n  let y = 0;\n  if (visualViewport) {\n    width = visualViewport.width;\n    height = visualViewport.height;\n    const visualViewportBased = isWebKit();\n    if (!visualViewportBased || visualViewportBased && strategy === 'fixed') {\n      x = visualViewport.offsetLeft;\n      y = visualViewport.offsetTop;\n    }\n  }\n  const windowScrollbarX = getWindowScrollBarX(html);\n  // <html> `overflow: hidden` + `scrollbar-gutter: stable` reduces the\n  // visual width of the <html> but this is not considered in the size\n  // of `html.clientWidth`.\n  if (windowScrollbarX <= 0) {\n    const doc = html.ownerDocument;\n    const body = doc.body;\n    const bodyStyles = getComputedStyle(body);\n    const bodyMarginInline = doc.compatMode === 'CSS1Compat' ? parseFloat(bodyStyles.marginLeft) + parseFloat(bodyStyles.marginRight) || 0 : 0;\n    const clippingStableScrollbarWidth = Math.abs(html.clientWidth - body.clientWidth - bodyMarginInline);\n    if (clippingStableScrollbarWidth <= SCROLLBAR_MAX) {\n      width -= clippingStableScrollbarWidth;\n    }\n  } else if (windowScrollbarX <= SCROLLBAR_MAX) {\n    // If the <body> scrollbar is on the left, the width needs to be extended\n    // by the scrollbar amount so there isn't extra space on the right.\n    width += windowScrollbarX;\n  }\n  return {\n    width,\n    height,\n    x,\n    y\n  };\n}\n\nconst absoluteOrFixed = /*#__PURE__*/new Set(['absolute', 'fixed']);\n// Returns the inner client rect, subtracting scrollbars if present.\nfunction getInnerBoundingClientRect(element, strategy) {\n  const clientRect = getBoundingClientRect(element, true, strategy === 'fixed');\n  const top = clientRect.top + element.clientTop;\n  const left = clientRect.left + element.clientLeft;\n  const scale = isHTMLElement(element) ? getScale(element) : createCoords(1);\n  const width = element.clientWidth * scale.x;\n  const height = element.clientHeight * scale.y;\n  const x = left * scale.x;\n  const y = top * scale.y;\n  return {\n    width,\n    height,\n    x,\n    y\n  };\n}\nfunction getClientRectFromClippingAncestor(element, clippingAncestor, strategy) {\n  let rect;\n  if (clippingAncestor === 'viewport') {\n    rect = getViewportRect(element, strategy);\n  } else if (clippingAncestor === 'document') {\n    rect = getDocumentRect(getDocumentElement(element));\n  } else if (isElement(clippingAncestor)) {\n    rect = getInnerBoundingClientRect(clippingAncestor, strategy);\n  } else {\n    const visualOffsets = getVisualOffsets(element);\n    rect = {\n      x: clippingAncestor.x - visualOffsets.x,\n      y: clippingAncestor.y - visualOffsets.y,\n      width: clippingAncestor.width,\n      height: clippingAncestor.height\n    };\n  }\n  return rectToClientRect(rect);\n}\nfunction hasFixedPositionAncestor(element, stopNode) {\n  const parentNode = getParentNode(element);\n  if (parentNode === stopNode || !isElement(parentNode) || isLastTraversableNode(parentNode)) {\n    return false;\n  }\n  return getComputedStyle$1(parentNode).position === 'fixed' || hasFixedPositionAncestor(parentNode, stopNode);\n}\n\n// A \"clipping ancestor\" is an `overflow` element with the characteristic of\n// clipping (or hiding) child elements. This returns all clipping ancestors\n// of the given element up the tree.\nfunction getClippingElementAncestors(element, cache) {\n  const cachedResult = cache.get(element);\n  if (cachedResult) {\n    return cachedResult;\n  }\n  let result = getOverflowAncestors(element, [], false).filter(el => isElement(el) && getNodeName(el) !== 'body');\n  let currentContainingBlockComputedStyle = null;\n  const elementIsFixed = getComputedStyle$1(element).position === 'fixed';\n  let currentNode = elementIsFixed ? getParentNode(element) : element;\n\n  // https://developer.mozilla.org/en-US/docs/Web/CSS/Containing_block#identifying_the_containing_block\n  while (isElement(currentNode) && !isLastTraversableNode(currentNode)) {\n    const computedStyle = getComputedStyle$1(currentNode);\n    const currentNodeIsContaining = isContainingBlock(currentNode);\n    if (!currentNodeIsContaining && computedStyle.position === 'fixed') {\n      currentContainingBlockComputedStyle = null;\n    }\n    const shouldDropCurrentNode = elementIsFixed ? !currentNodeIsContaining && !currentContainingBlockComputedStyle : !currentNodeIsContaining && computedStyle.position === 'static' && !!currentContainingBlockComputedStyle && absoluteOrFixed.has(currentContainingBlockComputedStyle.position) || isOverflowElement(currentNode) && !currentNodeIsContaining && hasFixedPositionAncestor(element, currentNode);\n    if (shouldDropCurrentNode) {\n      // Drop non-containing blocks.\n      result = result.filter(ancestor => ancestor !== currentNode);\n    } else {\n      // Record last containing block for next iteration.\n      currentContainingBlockComputedStyle = computedStyle;\n    }\n    currentNode = getParentNode(currentNode);\n  }\n  cache.set(element, result);\n  return result;\n}\n\n// Gets the maximum area that the element is visible in due to any number of\n// clipping ancestors.\nfunction getClippingRect(_ref) {\n  let {\n    element,\n    boundary,\n    rootBoundary,\n    strategy\n  } = _ref;\n  const elementClippingAncestors = boundary === 'clippingAncestors' ? isTopLayer(element) ? [] : getClippingElementAncestors(element, this._c) : [].concat(boundary);\n  const clippingAncestors = [...elementClippingAncestors, rootBoundary];\n  const firstClippingAncestor = clippingAncestors[0];\n  const clippingRect = clippingAncestors.reduce((accRect, clippingAncestor) => {\n    const rect = getClientRectFromClippingAncestor(element, clippingAncestor, strategy);\n    accRect.top = max(rect.top, accRect.top);\n    accRect.right = min(rect.right, accRect.right);\n    accRect.bottom = min(rect.bottom, accRect.bottom);\n    accRect.left = max(rect.left, accRect.left);\n    return accRect;\n  }, getClientRectFromClippingAncestor(element, firstClippingAncestor, strategy));\n  return {\n    width: clippingRect.right - clippingRect.left,\n    height: clippingRect.bottom - clippingRect.top,\n    x: clippingRect.left,\n    y: clippingRect.top\n  };\n}\n\nfunction getDimensions(element) {\n  const {\n    width,\n    height\n  } = getCssDimensions(element);\n  return {\n    width,\n    height\n  };\n}\n\nfunction getRectRelativeToOffsetParent(element, offsetParent, strategy) {\n  const isOffsetParentAnElement = isHTMLElement(offsetParent);\n  const documentElement = getDocumentElement(offsetParent);\n  const isFixed = strategy === 'fixed';\n  const rect = getBoundingClientRect(element, true, isFixed, offsetParent);\n  let scroll = {\n    scrollLeft: 0,\n    scrollTop: 0\n  };\n  const offsets = createCoords(0);\n\n  // If the <body> scrollbar appears on the left (e.g. RTL systems). Use\n  // Firefox with layout.scrollbar.side = 3 in about:config to test this.\n  function setLeftRTLScrollbarOffset() {\n    offsets.x = getWindowScrollBarX(documentElement);\n  }\n  if (isOffsetParentAnElement || !isOffsetParentAnElement && !isFixed) {\n    if (getNodeName(offsetParent) !== 'body' || isOverflowElement(documentElement)) {\n      scroll = getNodeScroll(offsetParent);\n    }\n    if (isOffsetParentAnElement) {\n      const offsetRect = getBoundingClientRect(offsetParent, true, isFixed, offsetParent);\n      offsets.x = offsetRect.x + offsetParent.clientLeft;\n      offsets.y = offsetRect.y + offsetParent.clientTop;\n    } else if (documentElement) {\n      setLeftRTLScrollbarOffset();\n    }\n  }\n  if (isFixed && !isOffsetParentAnElement && documentElement) {\n    setLeftRTLScrollbarOffset();\n  }\n  const htmlOffset = documentElement && !isOffsetParentAnElement && !isFixed ? getHTMLOffset(documentElement, scroll) : createCoords(0);\n  const x = rect.left + scroll.scrollLeft - offsets.x - htmlOffset.x;\n  const y = rect.top + scroll.scrollTop - offsets.y - htmlOffset.y;\n  return {\n    x,\n    y,\n    width: rect.width,\n    height: rect.height\n  };\n}\n\nfunction isStaticPositioned(element) {\n  return getComputedStyle$1(element).position === 'static';\n}\n\nfunction getTrueOffsetParent(element, polyfill) {\n  if (!isHTMLElement(element) || getComputedStyle$1(element).position === 'fixed') {\n    return null;\n  }\n  if (polyfill) {\n    return polyfill(element);\n  }\n  let rawOffsetParent = element.offsetParent;\n\n  // Firefox returns the <html> element as the offsetParent if it's non-static,\n  // while Chrome and Safari return the <body> element. The <body> element must\n  // be used to perform the correct calculations even if the <html> element is\n  // non-static.\n  if (getDocumentElement(element) === rawOffsetParent) {\n    rawOffsetParent = rawOffsetParent.ownerDocument.body;\n  }\n  return rawOffsetParent;\n}\n\n// Gets the closest ancestor positioned element. Handles some edge cases,\n// such as table ancestors and cross browser bugs.\nfunction getOffsetParent(element, polyfill) {\n  const win = getWindow(element);\n  if (isTopLayer(element)) {\n    return win;\n  }\n  if (!isHTMLElement(element)) {\n    let svgOffsetParent = getParentNode(element);\n    while (svgOffsetParent && !isLastTraversableNode(svgOffsetParent)) {\n      if (isElement(svgOffsetParent) && !isStaticPositioned(svgOffsetParent)) {\n        return svgOffsetParent;\n      }\n      svgOffsetParent = getParentNode(svgOffsetParent);\n    }\n    return win;\n  }\n  let offsetParent = getTrueOffsetParent(element, polyfill);\n  while (offsetParent && isTableElement(offsetParent) && isStaticPositioned(offsetParent)) {\n    offsetParent = getTrueOffsetParent(offsetParent, polyfill);\n  }\n  if (offsetParent && isLastTraversableNode(offsetParent) && isStaticPositioned(offsetParent) && !isContainingBlock(offsetParent)) {\n    return win;\n  }\n  return offsetParent || getContainingBlock(element) || win;\n}\n\nconst getElementRects = async function (data) {\n  const getOffsetParentFn = this.getOffsetParent || getOffsetParent;\n  const getDimensionsFn = this.getDimensions;\n  const floatingDimensions = await getDimensionsFn(data.floating);\n  return {\n    reference: getRectRelativeToOffsetParent(data.reference, await getOffsetParentFn(data.floating), data.strategy),\n    floating: {\n      x: 0,\n      y: 0,\n      width: floatingDimensions.width,\n      height: floatingDimensions.height\n    }\n  };\n};\n\nfunction isRTL(element) {\n  return getComputedStyle$1(element).direction === 'rtl';\n}\n\nconst platform = {\n  convertOffsetParentRelativeRectToViewportRelativeRect,\n  getDocumentElement,\n  getClippingRect,\n  getOffsetParent,\n  getElementRects,\n  getClientRects,\n  getDimensions,\n  getScale,\n  isElement,\n  isRTL\n};\n\nfunction rectsAreEqual(a, b) {\n  return a.x === b.x && a.y === b.y && a.width === b.width && a.height === b.height;\n}\n\n// https://samthor.au/2021/observing-dom/\nfunction observeMove(element, onMove) {\n  let io = null;\n  let timeoutId;\n  const root = getDocumentElement(element);\n  function cleanup() {\n    var _io;\n    clearTimeout(timeoutId);\n    (_io = io) == null || _io.disconnect();\n    io = null;\n  }\n  function refresh(skip, threshold) {\n    if (skip === void 0) {\n      skip = false;\n    }\n    if (threshold === void 0) {\n      threshold = 1;\n    }\n    cleanup();\n    const elementRectForRootMargin = element.getBoundingClientRect();\n    const {\n      left,\n      top,\n      width,\n      height\n    } = elementRectForRootMargin;\n    if (!skip) {\n      onMove();\n    }\n    if (!width || !height) {\n      return;\n    }\n    const insetTop = floor(top);\n    const insetRight = floor(root.clientWidth - (left + width));\n    const insetBottom = floor(root.clientHeight - (top + height));\n    const insetLeft = floor(left);\n    const rootMargin = -insetTop + \"px \" + -insetRight + \"px \" + -insetBottom + \"px \" + -insetLeft + \"px\";\n    const options = {\n      rootMargin,\n      threshold: max(0, min(1, threshold)) || 1\n    };\n    let isFirstUpdate = true;\n    function handleObserve(entries) {\n      const ratio = entries[0].intersectionRatio;\n      if (ratio !== threshold) {\n        if (!isFirstUpdate) {\n          return refresh();\n        }\n        if (!ratio) {\n          // If the reference is clipped, the ratio is 0. Throttle the refresh\n          // to prevent an infinite loop of updates.\n          timeoutId = setTimeout(() => {\n            refresh(false, 1e-7);\n          }, 1000);\n        } else {\n          refresh(false, ratio);\n        }\n      }\n      if (ratio === 1 && !rectsAreEqual(elementRectForRootMargin, element.getBoundingClientRect())) {\n        // It's possible that even though the ratio is reported as 1, the\n        // element is not actually fully within the IntersectionObserver's root\n        // area anymore. This can happen under performance constraints. This may\n        // be a bug in the browser's IntersectionObserver implementation. To\n        // work around this, we compare the element's bounding rect now with\n        // what it was at the time we created the IntersectionObserver. If they\n        // are not equal then the element moved, so we refresh.\n        refresh();\n      }\n      isFirstUpdate = false;\n    }\n\n    // Older browsers don't support a `document` as the root and will throw an\n    // error.\n    try {\n      io = new IntersectionObserver(handleObserve, {\n        ...options,\n        // Handle <iframe>s\n        root: root.ownerDocument\n      });\n    } catch (_e) {\n      io = new IntersectionObserver(handleObserve, options);\n    }\n    io.observe(element);\n  }\n  refresh(true);\n  return cleanup;\n}\n\n/**\n * Automatically updates the position of the floating element when necessary.\n * Should only be called when the floating element is mounted on the DOM or\n * visible on the screen.\n * @returns cleanup function that should be invoked when the floating element is\n * removed from the DOM or hidden from the screen.\n * @see https://floating-ui.com/docs/autoUpdate\n */\nfunction autoUpdate(reference, floating, update, options) {\n  if (options === void 0) {\n    options = {};\n  }\n  const {\n    ancestorScroll = true,\n    ancestorResize = true,\n    elementResize = typeof ResizeObserver === 'function',\n    layoutShift = typeof IntersectionObserver === 'function',\n    animationFrame = false\n  } = options;\n  const referenceEl = unwrapElement(reference);\n  const ancestors = ancestorScroll || ancestorResize ? [...(referenceEl ? getOverflowAncestors(referenceEl) : []), ...getOverflowAncestors(floating)] : [];\n  ancestors.forEach(ancestor => {\n    ancestorScroll && ancestor.addEventListener('scroll', update, {\n      passive: true\n    });\n    ancestorResize && ancestor.addEventListener('resize', update);\n  });\n  const cleanupIo = referenceEl && layoutShift ? observeMove(referenceEl, update) : null;\n  let reobserveFrame = -1;\n  let resizeObserver = null;\n  if (elementResize) {\n    resizeObserver = new ResizeObserver(_ref => {\n      let [firstEntry] = _ref;\n      if (firstEntry && firstEntry.target === referenceEl && resizeObserver) {\n        // Prevent update loops when using the `size` middleware.\n        // https://github.com/floating-ui/floating-ui/issues/1740\n        resizeObserver.unobserve(floating);\n        cancelAnimationFrame(reobserveFrame);\n        reobserveFrame = requestAnimationFrame(() => {\n          var _resizeObserver;\n          (_resizeObserver = resizeObserver) == null || _resizeObserver.observe(floating);\n        });\n      }\n      update();\n    });\n    if (referenceEl && !animationFrame) {\n      resizeObserver.observe(referenceEl);\n    }\n    resizeObserver.observe(floating);\n  }\n  let frameId;\n  let prevRefRect = animationFrame ? getBoundingClientRect(reference) : null;\n  if (animationFrame) {\n    frameLoop();\n  }\n  function frameLoop() {\n    const nextRefRect = getBoundingClientRect(reference);\n    if (prevRefRect && !rectsAreEqual(prevRefRect, nextRefRect)) {\n      update();\n    }\n    prevRefRect = nextRefRect;\n    frameId = requestAnimationFrame(frameLoop);\n  }\n  update();\n  return () => {\n    var _resizeObserver2;\n    ancestors.forEach(ancestor => {\n      ancestorScroll && ancestor.removeEventListener('scroll', update);\n      ancestorResize && ancestor.removeEventListener('resize', update);\n    });\n    cleanupIo == null || cleanupIo();\n    (_resizeObserver2 = resizeObserver) == null || _resizeObserver2.disconnect();\n    resizeObserver = null;\n    if (animationFrame) {\n      cancelAnimationFrame(frameId);\n    }\n  };\n}\n\n/**\n * Resolves with an object of overflow side offsets that determine how much the\n * element is overflowing a given clipping boundary on each side.\n * - positive = overflowing the boundary by that number of pixels\n * - negative = how many pixels left before it will overflow\n * - 0 = lies flush with the boundary\n * @see https://floating-ui.com/docs/detectOverflow\n */\nconst detectOverflow = detectOverflow$1;\n\n/**\n * Modifies the placement by translating the floating element along the\n * specified axes.\n * A number (shorthand for `mainAxis` or distance), or an axes configuration\n * object may be passed.\n * @see https://floating-ui.com/docs/offset\n */\nconst offset = offset$1;\n\n/**\n * Optimizes the visibility of the floating element by choosing the placement\n * that has the most space available automatically, without needing to specify a\n * preferred placement. Alternative to `flip`.\n * @see https://floating-ui.com/docs/autoPlacement\n */\nconst autoPlacement = autoPlacement$1;\n\n/**\n * Optimizes the visibility of the floating element by shifting it in order to\n * keep it in view when it will overflow the clipping boundary.\n * @see https://floating-ui.com/docs/shift\n */\nconst shift = shift$1;\n\n/**\n * Optimizes the visibility of the floating element by flipping the `placement`\n * in order to keep it in view when the preferred placement(s) will overflow the\n * clipping boundary. Alternative to `autoPlacement`.\n * @see https://floating-ui.com/docs/flip\n */\nconst flip = flip$1;\n\n/**\n * Provides data that allows you to change the size of the floating element —\n * for instance, prevent it from overflowing the clipping boundary or match the\n * width of the reference element.\n * @see https://floating-ui.com/docs/size\n */\nconst size = size$1;\n\n/**\n * Provides data to hide the floating element in applicable situations, such as\n * when it is not in the same clipping context as the reference element.\n * @see https://floating-ui.com/docs/hide\n */\nconst hide = hide$1;\n\n/**\n * Provides data to position an inner element of the floating element so that it\n * appears centered to the reference element.\n * @see https://floating-ui.com/docs/arrow\n */\nconst arrow = arrow$1;\n\n/**\n * Provides improved positioning for inline reference elements that can span\n * over multiple lines, such as hyperlinks or range selections.\n * @see https://floating-ui.com/docs/inline\n */\nconst inline = inline$1;\n\n/**\n * Built-in `limiter` that will stop `shift()` at a certain point.\n */\nconst limitShift = limitShift$1;\n\n/**\n * Computes the `x` and `y` coordinates that will place the floating element\n * next to a given reference element.\n */\nconst computePosition = (reference, floating, options) => {\n  // This caches the expensive `getClippingElementAncestors` function so that\n  // multiple lifecycle resets re-use the same result. It only lives for a\n  // single call. If other functions become expensive, we can add them as well.\n  const cache = new Map();\n  const mergedOptions = {\n    platform,\n    ...options\n  };\n  const platformWithCache = {\n    ...mergedOptions.platform,\n    _c: cache\n  };\n  return computePosition$1(reference, floating, {\n    ...mergedOptions,\n    platform: platformWithCache\n  });\n};\n\nexport { arrow, autoPlacement, autoUpdate, computePosition, detectOverflow, flip, hide, inline, limitShift, offset, platform, shift, size };\n","import { computePosition, arrow as arrow$2, autoPlacement as autoPlacement$1, flip as flip$1, hide as hide$1, inline as inline$1, limitShift as limitShift$1, offset as offset$1, shift as shift$1, size as size$1 } from '@floating-ui/dom';\nexport { autoUpdate, computePosition, detectOverflow, getOverflowAncestors, platform } from '@floating-ui/dom';\nimport * as React from 'react';\nimport { useLayoutEffect } from 'react';\nimport * as ReactDOM from 'react-dom';\n\nvar isClient = typeof document !== 'undefined';\n\nvar noop = function noop() {};\nvar index = isClient ? useLayoutEffect : noop;\n\n// Fork of `fast-deep-equal` that only does the comparisons we need and compares\n// functions\nfunction deepEqual(a, b) {\n  if (a === b) {\n    return true;\n  }\n  if (typeof a !== typeof b) {\n    return false;\n  }\n  if (typeof a === 'function' && a.toString() === b.toString()) {\n    return true;\n  }\n  let length;\n  let i;\n  let keys;\n  if (a && b && typeof a === 'object') {\n    if (Array.isArray(a)) {\n      length = a.length;\n      if (length !== b.length) return false;\n      for (i = length; i-- !== 0;) {\n        if (!deepEqual(a[i], b[i])) {\n          return false;\n        }\n      }\n      return true;\n    }\n    keys = Object.keys(a);\n    length = keys.length;\n    if (length !== Object.keys(b).length) {\n      return false;\n    }\n    for (i = length; i-- !== 0;) {\n      if (!{}.hasOwnProperty.call(b, keys[i])) {\n        return false;\n      }\n    }\n    for (i = length; i-- !== 0;) {\n      const key = keys[i];\n      if (key === '_owner' && a.$$typeof) {\n        continue;\n      }\n      if (!deepEqual(a[key], b[key])) {\n        return false;\n      }\n    }\n    return true;\n  }\n  return a !== a && b !== b;\n}\n\nfunction getDPR(element) {\n  if (typeof window === 'undefined') {\n    return 1;\n  }\n  const win = element.ownerDocument.defaultView || window;\n  return win.devicePixelRatio || 1;\n}\n\nfunction roundByDPR(element, value) {\n  const dpr = getDPR(element);\n  return Math.round(value * dpr) / dpr;\n}\n\nfunction useLatestRef(value) {\n  const ref = React.useRef(value);\n  index(() => {\n    ref.current = value;\n  });\n  return ref;\n}\n\n/**\n * Provides data to position a floating element.\n * @see https://floating-ui.com/docs/useFloating\n */\nfunction useFloating(options) {\n  if (options === void 0) {\n    options = {};\n  }\n  const {\n    placement = 'bottom',\n    strategy = 'absolute',\n    middleware = [],\n    platform,\n    elements: {\n      reference: externalReference,\n      floating: externalFloating\n    } = {},\n    transform = true,\n    whileElementsMounted,\n    open\n  } = options;\n  const [data, setData] = React.useState({\n    x: 0,\n    y: 0,\n    strategy,\n    placement,\n    middlewareData: {},\n    isPositioned: false\n  });\n  const [latestMiddleware, setLatestMiddleware] = React.useState(middleware);\n  if (!deepEqual(latestMiddleware, middleware)) {\n    setLatestMiddleware(middleware);\n  }\n  const [_reference, _setReference] = React.useState(null);\n  const [_floating, _setFloating] = React.useState(null);\n  const setReference = React.useCallback(node => {\n    if (node !== referenceRef.current) {\n      referenceRef.current = node;\n      _setReference(node);\n    }\n  }, []);\n  const setFloating = React.useCallback(node => {\n    if (node !== floatingRef.current) {\n      floatingRef.current = node;\n      _setFloating(node);\n    }\n  }, []);\n  const referenceEl = externalReference || _reference;\n  const floatingEl = externalFloating || _floating;\n  const referenceRef = React.useRef(null);\n  const floatingRef = React.useRef(null);\n  const dataRef = React.useRef(data);\n  const hasWhileElementsMounted = whileElementsMounted != null;\n  const whileElementsMountedRef = useLatestRef(whileElementsMounted);\n  const platformRef = useLatestRef(platform);\n  const openRef = useLatestRef(open);\n  const update = React.useCallback(() => {\n    if (!referenceRef.current || !floatingRef.current) {\n      return;\n    }\n    const config = {\n      placement,\n      strategy,\n      middleware: latestMiddleware\n    };\n    if (platformRef.current) {\n      config.platform = platformRef.current;\n    }\n    computePosition(referenceRef.current, floatingRef.current, config).then(data => {\n      const fullData = {\n        ...data,\n        // The floating element's position may be recomputed while it's closed\n        // but still mounted (such as when transitioning out). To ensure\n        // `isPositioned` will be `false` initially on the next open, avoid\n        // setting it to `true` when `open === false` (must be specified).\n        isPositioned: openRef.current !== false\n      };\n      if (isMountedRef.current && !deepEqual(dataRef.current, fullData)) {\n        dataRef.current = fullData;\n        ReactDOM.flushSync(() => {\n          setData(fullData);\n        });\n      }\n    });\n  }, [latestMiddleware, placement, strategy, platformRef, openRef]);\n  index(() => {\n    if (open === false && dataRef.current.isPositioned) {\n      dataRef.current.isPositioned = false;\n      setData(data => ({\n        ...data,\n        isPositioned: false\n      }));\n    }\n  }, [open]);\n  const isMountedRef = React.useRef(false);\n  index(() => {\n    isMountedRef.current = true;\n    return () => {\n      isMountedRef.current = false;\n    };\n  }, []);\n  index(() => {\n    if (referenceEl) referenceRef.current = referenceEl;\n    if (floatingEl) floatingRef.current = floatingEl;\n    if (referenceEl && floatingEl) {\n      if (whileElementsMountedRef.current) {\n        return whileElementsMountedRef.current(referenceEl, floatingEl, update);\n      }\n      update();\n    }\n  }, [referenceEl, floatingEl, update, whileElementsMountedRef, hasWhileElementsMounted]);\n  const refs = React.useMemo(() => ({\n    reference: referenceRef,\n    floating: floatingRef,\n    setReference,\n    setFloating\n  }), [setReference, setFloating]);\n  const elements = React.useMemo(() => ({\n    reference: referenceEl,\n    floating: floatingEl\n  }), [referenceEl, floatingEl]);\n  const floatingStyles = React.useMemo(() => {\n    const initialStyles = {\n      position: strategy,\n      left: 0,\n      top: 0\n    };\n    if (!elements.floating) {\n      return initialStyles;\n    }\n    const x = roundByDPR(elements.floating, data.x);\n    const y = roundByDPR(elements.floating, data.y);\n    if (transform) {\n      return {\n        ...initialStyles,\n        transform: \"translate(\" + x + \"px, \" + y + \"px)\",\n        ...(getDPR(elements.floating) >= 1.5 && {\n          willChange: 'transform'\n        })\n      };\n    }\n    return {\n      position: strategy,\n      left: x,\n      top: y\n    };\n  }, [strategy, transform, elements.floating, data.x, data.y]);\n  return React.useMemo(() => ({\n    ...data,\n    update,\n    refs,\n    elements,\n    floatingStyles\n  }), [data, update, refs, elements, floatingStyles]);\n}\n\n/**\n * Provides data to position an inner element of the floating element so that it\n * appears centered to the reference element.\n * This wraps the core `arrow` middleware to allow React refs as the element.\n * @see https://floating-ui.com/docs/arrow\n */\nconst arrow$1 = options => {\n  function isRef(value) {\n    return {}.hasOwnProperty.call(value, 'current');\n  }\n  return {\n    name: 'arrow',\n    options,\n    fn(state) {\n      const {\n        element,\n        padding\n      } = typeof options === 'function' ? options(state) : options;\n      if (element && isRef(element)) {\n        if (element.current != null) {\n          return arrow$2({\n            element: element.current,\n            padding\n          }).fn(state);\n        }\n        return {};\n      }\n      if (element) {\n        return arrow$2({\n          element,\n          padding\n        }).fn(state);\n      }\n      return {};\n    }\n  };\n};\n\n/**\n * Modifies the placement by translating the floating element along the\n * specified axes.\n * A number (shorthand for `mainAxis` or distance), or an axes configuration\n * object may be passed.\n * @see https://floating-ui.com/docs/offset\n */\nconst offset = (options, deps) => ({\n  ...offset$1(options),\n  options: [options, deps]\n});\n\n/**\n * Optimizes the visibility of the floating element by shifting it in order to\n * keep it in view when it will overflow the clipping boundary.\n * @see https://floating-ui.com/docs/shift\n */\nconst shift = (options, deps) => ({\n  ...shift$1(options),\n  options: [options, deps]\n});\n\n/**\n * Built-in `limiter` that will stop `shift()` at a certain point.\n */\nconst limitShift = (options, deps) => ({\n  ...limitShift$1(options),\n  options: [options, deps]\n});\n\n/**\n * Optimizes the visibility of the floating element by flipping the `placement`\n * in order to keep it in view when the preferred placement(s) will overflow the\n * clipping boundary. Alternative to `autoPlacement`.\n * @see https://floating-ui.com/docs/flip\n */\nconst flip = (options, deps) => ({\n  ...flip$1(options),\n  options: [options, deps]\n});\n\n/**\n * Provides data that allows you to change the size of the floating element —\n * for instance, prevent it from overflowing the clipping boundary or match the\n * width of the reference element.\n * @see https://floating-ui.com/docs/size\n */\nconst size = (options, deps) => ({\n  ...size$1(options),\n  options: [options, deps]\n});\n\n/**\n * Optimizes the visibility of the floating element by choosing the placement\n * that has the most space available automatically, without needing to specify a\n * preferred placement. Alternative to `flip`.\n * @see https://floating-ui.com/docs/autoPlacement\n */\nconst autoPlacement = (options, deps) => ({\n  ...autoPlacement$1(options),\n  options: [options, deps]\n});\n\n/**\n * Provides data to hide the floating element in applicable situations, such as\n * when it is not in the same clipping context as the reference element.\n * @see https://floating-ui.com/docs/hide\n */\nconst hide = (options, deps) => ({\n  ...hide$1(options),\n  options: [options, deps]\n});\n\n/**\n * Provides improved positioning for inline reference elements that can span\n * over multiple lines, such as hyperlinks or range selections.\n * @see https://floating-ui.com/docs/inline\n */\nconst inline = (options, deps) => ({\n  ...inline$1(options),\n  options: [options, deps]\n});\n\n/**\n * Provides data to position an inner element of the floating element so that it\n * appears centered to the reference element.\n * This wraps the core `arrow` middleware to allow React refs as the element.\n * @see https://floating-ui.com/docs/arrow\n */\nconst arrow = (options, deps) => ({\n  ...arrow$1(options),\n  options: [options, deps]\n});\n\nexport { arrow, autoPlacement, flip, hide, inline, limitShift, offset, shift, size, useFloating };\n","import * as React from 'react';\nimport { useModernLayoutEffect, useEffectEvent, getMinListIndex, getMaxListIndex, createGridCellMap, isListIndexDisabled, getGridNavigatedIndex, getGridCellIndexOfCorner, getGridCellIndices, findNonDisabledListIndex, isIndexOutOfListBounds, useLatestRef, getDocument as getDocument$1, isMouseLikePointerType, contains as contains$1, isSafari, enableFocusInside, isOutsideEvent, getPreviousTabbable, getNextTabbable, disableFocusInside, isTypeableCombobox, getFloatingFocusElement, getTabbableOptions, getNodeAncestors, activeElement, getNodeChildren as getNodeChildren$1, stopEvent, getTarget as getTarget$1, isVirtualClick, isVirtualPointerEvent, getPlatform, isTypeableElement, isReactEvent, isRootElement, isEventTargetWithin, matchesFocusVisible, isMac, getDeepestNode, getUserAgent } from '@floating-ui/react/utils';\nimport { jsx, jsxs, Fragment } from 'react/jsx-runtime';\nimport { getComputedStyle, isElement, isShadowRoot, getNodeName, isNode, isHTMLElement, getWindow, isLastTraversableNode, getParentNode, isWebKit } from '@floating-ui/utils/dom';\nimport { tabbable, isTabbable, focusable } from 'tabbable';\nimport * as ReactDOM from 'react-dom';\nimport { getOverflowAncestors, useFloating as useFloating$1, offset, detectOverflow } from '@floating-ui/react-dom';\nexport { arrow, autoPlacement, autoUpdate, computePosition, detectOverflow, flip, getOverflowAncestors, hide, inline, limitShift, offset, platform, shift, size } from '@floating-ui/react-dom';\nimport { evaluate, max, round, min } from '@floating-ui/utils';\n\n/**\n * Merges an array of refs into a single memoized callback ref or `null`.\n * @see https://floating-ui.com/docs/react-utils#usemergerefs\n */\nfunction useMergeRefs(refs) {\n  const cleanupRef = React.useRef(undefined);\n  const refEffect = React.useCallback(instance => {\n    const cleanups = refs.map(ref => {\n      if (ref == null) {\n        return;\n      }\n      if (typeof ref === 'function') {\n        const refCallback = ref;\n        const refCleanup = refCallback(instance);\n        return typeof refCleanup === 'function' ? refCleanup : () => {\n          refCallback(null);\n        };\n      }\n      ref.current = instance;\n      return () => {\n        ref.current = null;\n      };\n    });\n    return () => {\n      cleanups.forEach(refCleanup => refCleanup == null ? void 0 : refCleanup());\n    };\n    // eslint-disable-next-line react-hooks/exhaustive-deps\n  }, refs);\n  return React.useMemo(() => {\n    if (refs.every(ref => ref == null)) {\n      return null;\n    }\n    return value => {\n      if (cleanupRef.current) {\n        cleanupRef.current();\n        cleanupRef.current = undefined;\n      }\n      if (value != null) {\n        cleanupRef.current = refEffect(value);\n      }\n    };\n    // eslint-disable-next-line react-hooks/exhaustive-deps\n  }, refs);\n}\n\nfunction sortByDocumentPosition(a, b) {\n  const position = a.compareDocumentPosition(b);\n  if (position & Node.DOCUMENT_POSITION_FOLLOWING || position & Node.DOCUMENT_POSITION_CONTAINED_BY) {\n    return -1;\n  }\n  if (position & Node.DOCUMENT_POSITION_PRECEDING || position & Node.DOCUMENT_POSITION_CONTAINS) {\n    return 1;\n  }\n  return 0;\n}\nconst FloatingListContext = /*#__PURE__*/React.createContext({\n  register: () => {},\n  unregister: () => {},\n  map: /*#__PURE__*/new Map(),\n  elementsRef: {\n    current: []\n  }\n});\n/**\n * Provides context for a list of items within the floating element.\n * @see https://floating-ui.com/docs/FloatingList\n */\nfunction FloatingList(props) {\n  const {\n    children,\n    elementsRef,\n    labelsRef\n  } = props;\n  const [nodes, setNodes] = React.useState(() => new Set());\n  const register = React.useCallback(node => {\n    setNodes(prevSet => new Set(prevSet).add(node));\n  }, []);\n  const unregister = React.useCallback(node => {\n    setNodes(prevSet => {\n      const set = new Set(prevSet);\n      set.delete(node);\n      return set;\n    });\n  }, []);\n  const map = React.useMemo(() => {\n    const newMap = new Map();\n    const sortedNodes = Array.from(nodes.keys()).sort(sortByDocumentPosition);\n    sortedNodes.forEach((node, index) => {\n      newMap.set(node, index);\n    });\n    return newMap;\n  }, [nodes]);\n  return /*#__PURE__*/jsx(FloatingListContext.Provider, {\n    value: React.useMemo(() => ({\n      register,\n      unregister,\n      map,\n      elementsRef,\n      labelsRef\n    }), [register, unregister, map, elementsRef, labelsRef]),\n    children: children\n  });\n}\n/**\n * Used to register a list item and its index (DOM position) in the\n * `FloatingList`.\n * @see https://floating-ui.com/docs/FloatingList#uselistitem\n */\nfunction useListItem(props) {\n  if (props === void 0) {\n    props = {};\n  }\n  const {\n    label\n  } = props;\n  const {\n    register,\n    unregister,\n    map,\n    elementsRef,\n    labelsRef\n  } = React.useContext(FloatingListContext);\n  const [index, setIndex] = React.useState(null);\n  const componentRef = React.useRef(null);\n  const ref = React.useCallback(node => {\n    componentRef.current = node;\n    if (index !== null) {\n      elementsRef.current[index] = node;\n      if (labelsRef) {\n        var _node$textContent;\n        const isLabelDefined = label !== undefined;\n        labelsRef.current[index] = isLabelDefined ? label : (_node$textContent = node == null ? void 0 : node.textContent) != null ? _node$textContent : null;\n      }\n    }\n  }, [index, elementsRef, labelsRef, label]);\n  useModernLayoutEffect(() => {\n    const node = componentRef.current;\n    if (node) {\n      register(node);\n      return () => {\n        unregister(node);\n      };\n    }\n  }, [register, unregister]);\n  useModernLayoutEffect(() => {\n    const index = componentRef.current ? map.get(componentRef.current) : null;\n    if (index != null) {\n      setIndex(index);\n    }\n  }, [map]);\n  return React.useMemo(() => ({\n    ref,\n    index: index == null ? -1 : index\n  }), [index, ref]);\n}\n\nconst FOCUSABLE_ATTRIBUTE = 'data-floating-ui-focusable';\nconst ACTIVE_KEY = 'active';\nconst SELECTED_KEY = 'selected';\nconst ARROW_LEFT = 'ArrowLeft';\nconst ARROW_RIGHT = 'ArrowRight';\nconst ARROW_UP = 'ArrowUp';\nconst ARROW_DOWN = 'ArrowDown';\n\nfunction renderJsx(render, computedProps) {\n  if (typeof render === 'function') {\n    return render(computedProps);\n  }\n  if (render) {\n    return /*#__PURE__*/React.cloneElement(render, computedProps);\n  }\n  return /*#__PURE__*/jsx(\"div\", {\n    ...computedProps\n  });\n}\nconst CompositeContext = /*#__PURE__*/React.createContext({\n  activeIndex: 0,\n  onNavigate: () => {}\n});\nconst horizontalKeys = [ARROW_LEFT, ARROW_RIGHT];\nconst verticalKeys = [ARROW_UP, ARROW_DOWN];\nconst allKeys = [...horizontalKeys, ...verticalKeys];\n\n/**\n * Creates a single tab stop whose items are navigated by arrow keys, which\n * provides list navigation outside of floating element contexts.\n *\n * This is useful to enable navigation of a list of items that aren’t part of a\n * floating element. A menubar is an example of a composite, with each reference\n * element being an item.\n * @see https://floating-ui.com/docs/Composite\n */\nconst Composite = /*#__PURE__*/React.forwardRef(function Composite(props, forwardedRef) {\n  const {\n    render,\n    orientation = 'both',\n    loop = true,\n    rtl = false,\n    cols = 1,\n    disabledIndices,\n    activeIndex: externalActiveIndex,\n    onNavigate: externalSetActiveIndex,\n    itemSizes,\n    dense = false,\n    ...domProps\n  } = props;\n  const [internalActiveIndex, internalSetActiveIndex] = React.useState(0);\n  const activeIndex = externalActiveIndex != null ? externalActiveIndex : internalActiveIndex;\n  const onNavigate = useEffectEvent(externalSetActiveIndex != null ? externalSetActiveIndex : internalSetActiveIndex);\n  const elementsRef = React.useRef([]);\n  const renderElementProps = render && typeof render !== 'function' ? render.props : {};\n  const contextValue = React.useMemo(() => ({\n    activeIndex,\n    onNavigate\n  }), [activeIndex, onNavigate]);\n  const isGrid = cols > 1;\n  function handleKeyDown(event) {\n    if (!allKeys.includes(event.key)) return;\n    let nextIndex = activeIndex;\n    const minIndex = getMinListIndex(elementsRef, disabledIndices);\n    const maxIndex = getMaxListIndex(elementsRef, disabledIndices);\n    const horizontalEndKey = rtl ? ARROW_LEFT : ARROW_RIGHT;\n    const horizontalStartKey = rtl ? ARROW_RIGHT : ARROW_LEFT;\n    if (isGrid) {\n      const sizes = itemSizes || Array.from({\n        length: elementsRef.current.length\n      }, () => ({\n        width: 1,\n        height: 1\n      }));\n      // To calculate movements on the grid, we use hypothetical cell indices\n      // as if every item was 1x1, then convert back to real indices.\n      const cellMap = createGridCellMap(sizes, cols, dense);\n      const minGridIndex = cellMap.findIndex(index => index != null && !isListIndexDisabled(elementsRef, index, disabledIndices));\n      // last enabled index\n      const maxGridIndex = cellMap.reduce((foundIndex, index, cellIndex) => index != null && !isListIndexDisabled(elementsRef, index, disabledIndices) ? cellIndex : foundIndex, -1);\n      const maybeNextIndex = cellMap[getGridNavigatedIndex({\n        current: cellMap.map(itemIndex => itemIndex ? elementsRef.current[itemIndex] : null)\n      }, {\n        event,\n        orientation,\n        loop,\n        rtl,\n        cols,\n        // treat undefined (empty grid spaces) as disabled indices so we\n        // don't end up in them\n        disabledIndices: getGridCellIndices([...((typeof disabledIndices !== 'function' ? disabledIndices : null) || elementsRef.current.map((_, index) => isListIndexDisabled(elementsRef, index, disabledIndices) ? index : undefined)), undefined], cellMap),\n        minIndex: minGridIndex,\n        maxIndex: maxGridIndex,\n        prevIndex: getGridCellIndexOfCorner(activeIndex > maxIndex ? minIndex : activeIndex, sizes, cellMap, cols,\n        // use a corner matching the edge closest to the direction we're\n        // moving in so we don't end up in the same item. Prefer\n        // top/left over bottom/right.\n        event.key === ARROW_DOWN ? 'bl' : event.key === horizontalEndKey ? 'tr' : 'tl')\n      })];\n      if (maybeNextIndex != null) {\n        nextIndex = maybeNextIndex;\n      }\n    }\n    const toEndKeys = {\n      horizontal: [horizontalEndKey],\n      vertical: [ARROW_DOWN],\n      both: [horizontalEndKey, ARROW_DOWN]\n    }[orientation];\n    const toStartKeys = {\n      horizontal: [horizontalStartKey],\n      vertical: [ARROW_UP],\n      both: [horizontalStartKey, ARROW_UP]\n    }[orientation];\n    const preventedKeys = isGrid ? allKeys : {\n      horizontal: horizontalKeys,\n      vertical: verticalKeys,\n      both: allKeys\n    }[orientation];\n    if (nextIndex === activeIndex && [...toEndKeys, ...toStartKeys].includes(event.key)) {\n      if (loop && nextIndex === maxIndex && toEndKeys.includes(event.key)) {\n        nextIndex = minIndex;\n      } else if (loop && nextIndex === minIndex && toStartKeys.includes(event.key)) {\n        nextIndex = maxIndex;\n      } else {\n        nextIndex = findNonDisabledListIndex(elementsRef, {\n          startingIndex: nextIndex,\n          decrement: toStartKeys.includes(event.key),\n          disabledIndices\n        });\n      }\n    }\n    if (nextIndex !== activeIndex && !isIndexOutOfListBounds(elementsRef, nextIndex)) {\n      var _elementsRef$current$;\n      event.stopPropagation();\n      if (preventedKeys.includes(event.key)) {\n        event.preventDefault();\n      }\n      onNavigate(nextIndex);\n      (_elementsRef$current$ = elementsRef.current[nextIndex]) == null || _elementsRef$current$.focus();\n    }\n  }\n  const computedProps = {\n    ...domProps,\n    ...renderElementProps,\n    ref: forwardedRef,\n    'aria-orientation': orientation === 'both' ? undefined : orientation,\n    onKeyDown(e) {\n      domProps.onKeyDown == null || domProps.onKeyDown(e);\n      renderElementProps.onKeyDown == null || renderElementProps.onKeyDown(e);\n      handleKeyDown(e);\n    }\n  };\n  return /*#__PURE__*/jsx(CompositeContext.Provider, {\n    value: contextValue,\n    children: /*#__PURE__*/jsx(FloatingList, {\n      elementsRef: elementsRef,\n      children: renderJsx(render, computedProps)\n    })\n  });\n});\n/**\n * @see https://floating-ui.com/docs/Composite\n */\nconst CompositeItem = /*#__PURE__*/React.forwardRef(function CompositeItem(props, forwardedRef) {\n  const {\n    render,\n    ...domProps\n  } = props;\n  const renderElementProps = render && typeof render !== 'function' ? render.props : {};\n  const {\n    activeIndex,\n    onNavigate\n  } = React.useContext(CompositeContext);\n  const {\n    ref,\n    index\n  } = useListItem();\n  const mergedRef = useMergeRefs([ref, forwardedRef, renderElementProps.ref]);\n  const isActive = activeIndex === index;\n  const computedProps = {\n    ...domProps,\n    ...renderElementProps,\n    ref: mergedRef,\n    tabIndex: isActive ? 0 : -1,\n    'data-active': isActive ? '' : undefined,\n    onFocus(e) {\n      domProps.onFocus == null || domProps.onFocus(e);\n      renderElementProps.onFocus == null || renderElementProps.onFocus(e);\n      onNavigate(index);\n    }\n  };\n  return renderJsx(render, computedProps);\n});\n\n// https://github.com/mui/material-ui/issues/41190#issuecomment-2040873379\nconst SafeReact = {\n  ...React\n};\n\nlet serverHandoffComplete = false;\nlet count = 0;\nconst genId = () => // Ensure the id is unique with multiple independent versions of Floating UI\n// on <React 18\n\"floating-ui-\" + Math.random().toString(36).slice(2, 6) + count++;\nfunction useFloatingId() {\n  const [id, setId] = React.useState(() => serverHandoffComplete ? genId() : undefined);\n  useModernLayoutEffect(() => {\n    if (id == null) {\n      setId(genId());\n    }\n    // eslint-disable-next-line react-hooks/exhaustive-deps\n  }, []);\n  React.useEffect(() => {\n    serverHandoffComplete = true;\n  }, []);\n  return id;\n}\nconst useReactId = SafeReact.useId;\n\n/**\n * Uses React 18's built-in `useId()` when available, or falls back to a\n * slightly less performant (requiring a double render) implementation for\n * earlier React versions.\n * @see https://floating-ui.com/docs/react-utils#useid\n */\nconst useId = useReactId || useFloatingId;\n\nlet devMessageSet;\nif (process.env.NODE_ENV !== \"production\") {\n  devMessageSet = /*#__PURE__*/new Set();\n}\nfunction warn() {\n  var _devMessageSet;\n  for (var _len = arguments.length, messages = new Array(_len), _key = 0; _key < _len; _key++) {\n    messages[_key] = arguments[_key];\n  }\n  const message = \"Floating UI: \" + messages.join(' ');\n  if (!((_devMessageSet = devMessageSet) != null && _devMessageSet.has(message))) {\n    var _devMessageSet2;\n    (_devMessageSet2 = devMessageSet) == null || _devMessageSet2.add(message);\n    console.warn(message);\n  }\n}\nfunction error() {\n  var _devMessageSet3;\n  for (var _len2 = arguments.length, messages = new Array(_len2), _key2 = 0; _key2 < _len2; _key2++) {\n    messages[_key2] = arguments[_key2];\n  }\n  const message = \"Floating UI: \" + messages.join(' ');\n  if (!((_devMessageSet3 = devMessageSet) != null && _devMessageSet3.has(message))) {\n    var _devMessageSet4;\n    (_devMessageSet4 = devMessageSet) == null || _devMessageSet4.add(message);\n    console.error(message);\n  }\n}\n\n/**\n * Renders a pointing arrow triangle.\n * @see https://floating-ui.com/docs/FloatingArrow\n */\nconst FloatingArrow = /*#__PURE__*/React.forwardRef(function FloatingArrow(props, ref) {\n  const {\n    context: {\n      placement,\n      elements: {\n        floating\n      },\n      middlewareData: {\n        arrow,\n        shift\n      }\n    },\n    width = 14,\n    height = 7,\n    tipRadius = 0,\n    strokeWidth = 0,\n    staticOffset,\n    stroke,\n    d,\n    style: {\n      transform,\n      ...restStyle\n    } = {},\n    ...rest\n  } = props;\n  if (process.env.NODE_ENV !== \"production\") {\n    if (!ref) {\n      warn('The `ref` prop is required for `FloatingArrow`.');\n    }\n  }\n  const clipPathId = useId();\n  const [isRTL, setIsRTL] = React.useState(false);\n\n  // https://github.com/floating-ui/floating-ui/issues/2932\n  useModernLayoutEffect(() => {\n    if (!floating) return;\n    const isRTL = getComputedStyle(floating).direction === 'rtl';\n    if (isRTL) {\n      setIsRTL(true);\n    }\n  }, [floating]);\n  if (!floating) {\n    return null;\n  }\n  const [side, alignment] = placement.split('-');\n  const isVerticalSide = side === 'top' || side === 'bottom';\n  let computedStaticOffset = staticOffset;\n  if (isVerticalSide && shift != null && shift.x || !isVerticalSide && shift != null && shift.y) {\n    computedStaticOffset = null;\n  }\n\n  // Strokes must be double the border width, this ensures the stroke's width\n  // works as you'd expect.\n  const computedStrokeWidth = strokeWidth * 2;\n  const halfStrokeWidth = computedStrokeWidth / 2;\n  const svgX = width / 2 * (tipRadius / -8 + 1);\n  const svgY = height / 2 * tipRadius / 4;\n  const isCustomShape = !!d;\n  const yOffsetProp = computedStaticOffset && alignment === 'end' ? 'bottom' : 'top';\n  let xOffsetProp = computedStaticOffset && alignment === 'end' ? 'right' : 'left';\n  if (computedStaticOffset && isRTL) {\n    xOffsetProp = alignment === 'end' ? 'left' : 'right';\n  }\n  const arrowX = (arrow == null ? void 0 : arrow.x) != null ? computedStaticOffset || arrow.x : '';\n  const arrowY = (arrow == null ? void 0 : arrow.y) != null ? computedStaticOffset || arrow.y : '';\n  const dValue = d || 'M0,0' + (\" H\" + width) + (\" L\" + (width - svgX) + \",\" + (height - svgY)) + (\" Q\" + width / 2 + \",\" + height + \" \" + svgX + \",\" + (height - svgY)) + ' Z';\n  const rotation = {\n    top: isCustomShape ? 'rotate(180deg)' : '',\n    left: isCustomShape ? 'rotate(90deg)' : 'rotate(-90deg)',\n    bottom: isCustomShape ? '' : 'rotate(180deg)',\n    right: isCustomShape ? 'rotate(-90deg)' : 'rotate(90deg)'\n  }[side];\n  return /*#__PURE__*/jsxs(\"svg\", {\n    ...rest,\n    \"aria-hidden\": true,\n    ref: ref,\n    width: isCustomShape ? width : width + computedStrokeWidth,\n    height: width,\n    viewBox: \"0 0 \" + width + \" \" + (height > width ? height : width),\n    style: {\n      position: 'absolute',\n      pointerEvents: 'none',\n      [xOffsetProp]: arrowX,\n      [yOffsetProp]: arrowY,\n      [side]: isVerticalSide || isCustomShape ? '100%' : \"calc(100% - \" + computedStrokeWidth / 2 + \"px)\",\n      transform: [rotation, transform].filter(t => !!t).join(' '),\n      ...restStyle\n    },\n    children: [computedStrokeWidth > 0 && /*#__PURE__*/jsx(\"path\", {\n      clipPath: \"url(#\" + clipPathId + \")\",\n      fill: \"none\",\n      stroke: stroke\n      // Account for the stroke on the fill path rendered below.\n      ,\n      strokeWidth: computedStrokeWidth + (d ? 0 : 1),\n      d: dValue\n    }), /*#__PURE__*/jsx(\"path\", {\n      stroke: computedStrokeWidth && !d ? rest.fill : 'none',\n      d: dValue\n    }), /*#__PURE__*/jsx(\"clipPath\", {\n      id: clipPathId,\n      children: /*#__PURE__*/jsx(\"rect\", {\n        x: -halfStrokeWidth,\n        y: halfStrokeWidth * (isCustomShape ? -1 : 1),\n        width: width + computedStrokeWidth,\n        height: width\n      })\n    })]\n  });\n});\n\nfunction createEventEmitter() {\n  const map = new Map();\n  return {\n    emit(event, data) {\n      var _map$get;\n      (_map$get = map.get(event)) == null || _map$get.forEach(listener => listener(data));\n    },\n    on(event, listener) {\n      if (!map.has(event)) {\n        map.set(event, new Set());\n      }\n      map.get(event).add(listener);\n    },\n    off(event, listener) {\n      var _map$get2;\n      (_map$get2 = map.get(event)) == null || _map$get2.delete(listener);\n    }\n  };\n}\n\nconst FloatingNodeContext = /*#__PURE__*/React.createContext(null);\nconst FloatingTreeContext = /*#__PURE__*/React.createContext(null);\n\n/**\n * Returns the parent node id for nested floating elements, if available.\n * Returns `null` for top-level floating elements.\n */\nconst useFloatingParentNodeId = () => {\n  var _React$useContext;\n  return ((_React$useContext = React.useContext(FloatingNodeContext)) == null ? void 0 : _React$useContext.id) || null;\n};\n\n/**\n * Returns the nearest floating tree context, if available.\n */\nconst useFloatingTree = () => React.useContext(FloatingTreeContext);\n\n/**\n * Registers a node into the `FloatingTree`, returning its id.\n * @see https://floating-ui.com/docs/FloatingTree\n */\nfunction useFloatingNodeId(customParentId) {\n  const id = useId();\n  const tree = useFloatingTree();\n  const reactParentId = useFloatingParentNodeId();\n  const parentId = customParentId || reactParentId;\n  useModernLayoutEffect(() => {\n    if (!id) return;\n    const node = {\n      id,\n      parentId\n    };\n    tree == null || tree.addNode(node);\n    return () => {\n      tree == null || tree.removeNode(node);\n    };\n  }, [tree, id, parentId]);\n  return id;\n}\n/**\n * Provides parent node context for nested floating elements.\n * @see https://floating-ui.com/docs/FloatingTree\n */\nfunction FloatingNode(props) {\n  const {\n    children,\n    id\n  } = props;\n  const parentId = useFloatingParentNodeId();\n  return /*#__PURE__*/jsx(FloatingNodeContext.Provider, {\n    value: React.useMemo(() => ({\n      id,\n      parentId\n    }), [id, parentId]),\n    children: children\n  });\n}\n/**\n * Provides context for nested floating elements when they are not children of\n * each other on the DOM.\n * This is not necessary in all cases, except when there must be explicit communication between parent and child floating elements. It is necessary for:\n * - The `bubbles` option in the `useDismiss()` Hook\n * - Nested virtual list navigation\n * - Nested floating elements that each open on hover\n * - Custom communication between parent and child floating elements\n * @see https://floating-ui.com/docs/FloatingTree\n */\nfunction FloatingTree(props) {\n  const {\n    children\n  } = props;\n  const nodesRef = React.useRef([]);\n  const addNode = React.useCallback(node => {\n    nodesRef.current = [...nodesRef.current, node];\n  }, []);\n  const removeNode = React.useCallback(node => {\n    nodesRef.current = nodesRef.current.filter(n => n !== node);\n  }, []);\n  const [events] = React.useState(() => createEventEmitter());\n  return /*#__PURE__*/jsx(FloatingTreeContext.Provider, {\n    value: React.useMemo(() => ({\n      nodesRef,\n      addNode,\n      removeNode,\n      events\n    }), [addNode, removeNode, events]),\n    children: children\n  });\n}\n\nfunction createAttribute(name) {\n  return \"data-floating-ui-\" + name;\n}\n\nfunction clearTimeoutIfSet(timeoutRef) {\n  if (timeoutRef.current !== -1) {\n    clearTimeout(timeoutRef.current);\n    timeoutRef.current = -1;\n  }\n}\n\nconst safePolygonIdentifier = /*#__PURE__*/createAttribute('safe-polygon');\nfunction getDelay(value, prop, pointerType) {\n  if (pointerType && !isMouseLikePointerType(pointerType)) {\n    return 0;\n  }\n  if (typeof value === 'number') {\n    return value;\n  }\n  if (typeof value === 'function') {\n    const result = value();\n    if (typeof result === 'number') {\n      return result;\n    }\n    return result == null ? void 0 : result[prop];\n  }\n  return value == null ? void 0 : value[prop];\n}\nfunction getRestMs(value) {\n  if (typeof value === 'function') {\n    return value();\n  }\n  return value;\n}\n/**\n * Opens the floating element while hovering over the reference element, like\n * CSS `:hover`.\n * @see https://floating-ui.com/docs/useHover\n */\nfunction useHover(context, props) {\n  if (props === void 0) {\n    props = {};\n  }\n  const {\n    open,\n    onOpenChange,\n    dataRef,\n    events,\n    elements\n  } = context;\n  const {\n    enabled = true,\n    delay = 0,\n    handleClose = null,\n    mouseOnly = false,\n    restMs = 0,\n    move = true\n  } = props;\n  const tree = useFloatingTree();\n  const parentId = useFloatingParentNodeId();\n  const handleCloseRef = useLatestRef(handleClose);\n  const delayRef = useLatestRef(delay);\n  const openRef = useLatestRef(open);\n  const restMsRef = useLatestRef(restMs);\n  const pointerTypeRef = React.useRef();\n  const timeoutRef = React.useRef(-1);\n  const handlerRef = React.useRef();\n  const restTimeoutRef = React.useRef(-1);\n  const blockMouseMoveRef = React.useRef(true);\n  const performedPointerEventsMutationRef = React.useRef(false);\n  const unbindMouseMoveRef = React.useRef(() => {});\n  const restTimeoutPendingRef = React.useRef(false);\n  const isHoverOpen = useEffectEvent(() => {\n    var _dataRef$current$open;\n    const type = (_dataRef$current$open = dataRef.current.openEvent) == null ? void 0 : _dataRef$current$open.type;\n    return (type == null ? void 0 : type.includes('mouse')) && type !== 'mousedown';\n  });\n\n  // When closing before opening, clear the delay timeouts to cancel it\n  // from showing.\n  React.useEffect(() => {\n    if (!enabled) return;\n    function onOpenChange(_ref) {\n      let {\n        open\n      } = _ref;\n      if (!open) {\n        clearTimeoutIfSet(timeoutRef);\n        clearTimeoutIfSet(restTimeoutRef);\n        blockMouseMoveRef.current = true;\n        restTimeoutPendingRef.current = false;\n      }\n    }\n    events.on('openchange', onOpenChange);\n    return () => {\n      events.off('openchange', onOpenChange);\n    };\n  }, [enabled, events]);\n  React.useEffect(() => {\n    if (!enabled) return;\n    if (!handleCloseRef.current) return;\n    if (!open) return;\n    function onLeave(event) {\n      if (isHoverOpen()) {\n        onOpenChange(false, event, 'hover');\n      }\n    }\n    const html = getDocument$1(elements.floating).documentElement;\n    html.addEventListener('mouseleave', onLeave);\n    return () => {\n      html.removeEventListener('mouseleave', onLeave);\n    };\n  }, [elements.floating, open, onOpenChange, enabled, handleCloseRef, isHoverOpen]);\n  const closeWithDelay = React.useCallback(function (event, runElseBranch, reason) {\n    if (runElseBranch === void 0) {\n      runElseBranch = true;\n    }\n    if (reason === void 0) {\n      reason = 'hover';\n    }\n    const closeDelay = getDelay(delayRef.current, 'close', pointerTypeRef.current);\n    if (closeDelay && !handlerRef.current) {\n      clearTimeoutIfSet(timeoutRef);\n      timeoutRef.current = window.setTimeout(() => onOpenChange(false, event, reason), closeDelay);\n    } else if (runElseBranch) {\n      clearTimeoutIfSet(timeoutRef);\n      onOpenChange(false, event, reason);\n    }\n  }, [delayRef, onOpenChange]);\n  const cleanupMouseMoveHandler = useEffectEvent(() => {\n    unbindMouseMoveRef.current();\n    handlerRef.current = undefined;\n  });\n  const clearPointerEvents = useEffectEvent(() => {\n    if (performedPointerEventsMutationRef.current) {\n      const body = getDocument$1(elements.floating).body;\n      body.style.pointerEvents = '';\n      body.removeAttribute(safePolygonIdentifier);\n      performedPointerEventsMutationRef.current = false;\n    }\n  });\n  const isClickLikeOpenEvent = useEffectEvent(() => {\n    return dataRef.current.openEvent ? ['click', 'mousedown'].includes(dataRef.current.openEvent.type) : false;\n  });\n\n  // Registering the mouse events on the reference directly to bypass React's\n  // delegation system. If the cursor was on a disabled element and then entered\n  // the reference (no gap), `mouseenter` doesn't fire in the delegation system.\n  React.useEffect(() => {\n    if (!enabled) return;\n    function onReferenceMouseEnter(event) {\n      clearTimeoutIfSet(timeoutRef);\n      blockMouseMoveRef.current = false;\n      if (mouseOnly && !isMouseLikePointerType(pointerTypeRef.current) || getRestMs(restMsRef.current) > 0 && !getDelay(delayRef.current, 'open')) {\n        return;\n      }\n      const openDelay = getDelay(delayRef.current, 'open', pointerTypeRef.current);\n      if (openDelay) {\n        timeoutRef.current = window.setTimeout(() => {\n          if (!openRef.current) {\n            onOpenChange(true, event, 'hover');\n          }\n        }, openDelay);\n      } else if (!open) {\n        onOpenChange(true, event, 'hover');\n      }\n    }\n    function onReferenceMouseLeave(event) {\n      if (isClickLikeOpenEvent()) {\n        clearPointerEvents();\n        return;\n      }\n      unbindMouseMoveRef.current();\n      const doc = getDocument$1(elements.floating);\n      clearTimeoutIfSet(restTimeoutRef);\n      restTimeoutPendingRef.current = false;\n      if (handleCloseRef.current && dataRef.current.floatingContext) {\n        // Prevent clearing `onScrollMouseLeave` timeout.\n        if (!open) {\n          clearTimeoutIfSet(timeoutRef);\n        }\n        handlerRef.current = handleCloseRef.current({\n          ...dataRef.current.floatingContext,\n          tree,\n          x: event.clientX,\n          y: event.clientY,\n          onClose() {\n            clearPointerEvents();\n            cleanupMouseMoveHandler();\n            if (!isClickLikeOpenEvent()) {\n              closeWithDelay(event, true, 'safe-polygon');\n            }\n          }\n        });\n        const handler = handlerRef.current;\n        doc.addEventListener('mousemove', handler);\n        unbindMouseMoveRef.current = () => {\n          doc.removeEventListener('mousemove', handler);\n        };\n        return;\n      }\n\n      // Allow interactivity without `safePolygon` on touch devices. With a\n      // pointer, a short close delay is an alternative, so it should work\n      // consistently.\n      const shouldClose = pointerTypeRef.current === 'touch' ? !contains$1(elements.floating, event.relatedTarget) : true;\n      if (shouldClose) {\n        closeWithDelay(event);\n      }\n    }\n\n    // Ensure the floating element closes after scrolling even if the pointer\n    // did not move.\n    // https://github.com/floating-ui/floating-ui/discussions/1692\n    function onScrollMouseLeave(event) {\n      if (isClickLikeOpenEvent()) return;\n      if (!dataRef.current.floatingContext) return;\n      handleCloseRef.current == null || handleCloseRef.current({\n        ...dataRef.current.floatingContext,\n        tree,\n        x: event.clientX,\n        y: event.clientY,\n        onClose() {\n          clearPointerEvents();\n          cleanupMouseMoveHandler();\n          if (!isClickLikeOpenEvent()) {\n            closeWithDelay(event);\n          }\n        }\n      })(event);\n    }\n    function onFloatingMouseEnter() {\n      clearTimeoutIfSet(timeoutRef);\n    }\n    function onFloatingMouseLeave(event) {\n      if (!isClickLikeOpenEvent()) {\n        closeWithDelay(event, false);\n      }\n    }\n    if (isElement(elements.domReference)) {\n      const reference = elements.domReference;\n      const floating = elements.floating;\n      if (open) {\n        reference.addEventListener('mouseleave', onScrollMouseLeave);\n      }\n      if (move) {\n        reference.addEventListener('mousemove', onReferenceMouseEnter, {\n          once: true\n        });\n      }\n      reference.addEventListener('mouseenter', onReferenceMouseEnter);\n      reference.addEventListener('mouseleave', onReferenceMouseLeave);\n      if (floating) {\n        floating.addEventListener('mouseleave', onScrollMouseLeave);\n        floating.addEventListener('mouseenter', onFloatingMouseEnter);\n        floating.addEventListener('mouseleave', onFloatingMouseLeave);\n      }\n      return () => {\n        if (open) {\n          reference.removeEventListener('mouseleave', onScrollMouseLeave);\n        }\n        if (move) {\n          reference.removeEventListener('mousemove', onReferenceMouseEnter);\n        }\n        reference.removeEventListener('mouseenter', onReferenceMouseEnter);\n        reference.removeEventListener('mouseleave', onReferenceMouseLeave);\n        if (floating) {\n          floating.removeEventListener('mouseleave', onScrollMouseLeave);\n          floating.removeEventListener('mouseenter', onFloatingMouseEnter);\n          floating.removeEventListener('mouseleave', onFloatingMouseLeave);\n        }\n      };\n    }\n  }, [elements, enabled, context, mouseOnly, move, closeWithDelay, cleanupMouseMoveHandler, clearPointerEvents, onOpenChange, open, openRef, tree, delayRef, handleCloseRef, dataRef, isClickLikeOpenEvent, restMsRef]);\n\n  // Block pointer-events of every element other than the reference and floating\n  // while the floating element is open and has a `handleClose` handler. Also\n  // handles nested floating elements.\n  // https://github.com/floating-ui/floating-ui/issues/1722\n  useModernLayoutEffect(() => {\n    var _handleCloseRef$curre;\n    if (!enabled) return;\n    if (open && (_handleCloseRef$curre = handleCloseRef.current) != null && (_handleCloseRef$curre = _handleCloseRef$curre.__options) != null && _handleCloseRef$curre.blockPointerEvents && isHoverOpen()) {\n      performedPointerEventsMutationRef.current = true;\n      const floatingEl = elements.floating;\n      if (isElement(elements.domReference) && floatingEl) {\n        var _tree$nodesRef$curren;\n        const body = getDocument$1(elements.floating).body;\n        body.setAttribute(safePolygonIdentifier, '');\n        const ref = elements.domReference;\n        const parentFloating = tree == null || (_tree$nodesRef$curren = tree.nodesRef.current.find(node => node.id === parentId)) == null || (_tree$nodesRef$curren = _tree$nodesRef$curren.context) == null ? void 0 : _tree$nodesRef$curren.elements.floating;\n        if (parentFloating) {\n          parentFloating.style.pointerEvents = '';\n        }\n        body.style.pointerEvents = 'none';\n        ref.style.pointerEvents = 'auto';\n        floatingEl.style.pointerEvents = 'auto';\n        return () => {\n          body.style.pointerEvents = '';\n          ref.style.pointerEvents = '';\n          floatingEl.style.pointerEvents = '';\n        };\n      }\n    }\n  }, [enabled, open, parentId, elements, tree, handleCloseRef, isHoverOpen]);\n  useModernLayoutEffect(() => {\n    if (!open) {\n      pointerTypeRef.current = undefined;\n      restTimeoutPendingRef.current = false;\n      cleanupMouseMoveHandler();\n      clearPointerEvents();\n    }\n  }, [open, cleanupMouseMoveHandler, clearPointerEvents]);\n  React.useEffect(() => {\n    return () => {\n      cleanupMouseMoveHandler();\n      clearTimeoutIfSet(timeoutRef);\n      clearTimeoutIfSet(restTimeoutRef);\n      clearPointerEvents();\n    };\n  }, [enabled, elements.domReference, cleanupMouseMoveHandler, clearPointerEvents]);\n  const reference = React.useMemo(() => {\n    function setPointerRef(event) {\n      pointerTypeRef.current = event.pointerType;\n    }\n    return {\n      onPointerDown: setPointerRef,\n      onPointerEnter: setPointerRef,\n      onMouseMove(event) {\n        const {\n          nativeEvent\n        } = event;\n        function handleMouseMove() {\n          if (!blockMouseMoveRef.current && !openRef.current) {\n            onOpenChange(true, nativeEvent, 'hover');\n          }\n        }\n        if (mouseOnly && !isMouseLikePointerType(pointerTypeRef.current)) {\n          return;\n        }\n        if (open || getRestMs(restMsRef.current) === 0) {\n          return;\n        }\n\n        // Ignore insignificant movements to account for tremors.\n        if (restTimeoutPendingRef.current && event.movementX ** 2 + event.movementY ** 2 < 2) {\n          return;\n        }\n        clearTimeoutIfSet(restTimeoutRef);\n        if (pointerTypeRef.current === 'touch') {\n          handleMouseMove();\n        } else {\n          restTimeoutPendingRef.current = true;\n          restTimeoutRef.current = window.setTimeout(handleMouseMove, getRestMs(restMsRef.current));\n        }\n      }\n    };\n  }, [mouseOnly, onOpenChange, open, openRef, restMsRef]);\n  return React.useMemo(() => enabled ? {\n    reference\n  } : {}, [enabled, reference]);\n}\n\nconst NOOP = () => {};\nconst FloatingDelayGroupContext = /*#__PURE__*/React.createContext({\n  delay: 0,\n  initialDelay: 0,\n  timeoutMs: 0,\n  currentId: null,\n  setCurrentId: NOOP,\n  setState: NOOP,\n  isInstantPhase: false\n});\n\n/**\n * @deprecated\n * Use the return value of `useDelayGroup()` instead.\n */\nconst useDelayGroupContext = () => React.useContext(FloatingDelayGroupContext);\n/**\n * Provides context for a group of floating elements that should share a\n * `delay`.\n * @see https://floating-ui.com/docs/FloatingDelayGroup\n */\nfunction FloatingDelayGroup(props) {\n  const {\n    children,\n    delay,\n    timeoutMs = 0\n  } = props;\n  const [state, setState] = React.useReducer((prev, next) => ({\n    ...prev,\n    ...next\n  }), {\n    delay,\n    timeoutMs,\n    initialDelay: delay,\n    currentId: null,\n    isInstantPhase: false\n  });\n  const initialCurrentIdRef = React.useRef(null);\n  const setCurrentId = React.useCallback(currentId => {\n    setState({\n      currentId\n    });\n  }, []);\n  useModernLayoutEffect(() => {\n    if (state.currentId) {\n      if (initialCurrentIdRef.current === null) {\n        initialCurrentIdRef.current = state.currentId;\n      } else if (!state.isInstantPhase) {\n        setState({\n          isInstantPhase: true\n        });\n      }\n    } else {\n      if (state.isInstantPhase) {\n        setState({\n          isInstantPhase: false\n        });\n      }\n      initialCurrentIdRef.current = null;\n    }\n  }, [state.currentId, state.isInstantPhase]);\n  return /*#__PURE__*/jsx(FloatingDelayGroupContext.Provider, {\n    value: React.useMemo(() => ({\n      ...state,\n      setState,\n      setCurrentId\n    }), [state, setCurrentId]),\n    children: children\n  });\n}\n/**\n * Enables grouping when called inside a component that's a child of a\n * `FloatingDelayGroup`.\n * @see https://floating-ui.com/docs/FloatingDelayGroup\n */\nfunction useDelayGroup(context, options) {\n  if (options === void 0) {\n    options = {};\n  }\n  const {\n    open,\n    onOpenChange,\n    floatingId\n  } = context;\n  const {\n    id: optionId,\n    enabled = true\n  } = options;\n  const id = optionId != null ? optionId : floatingId;\n  const groupContext = useDelayGroupContext();\n  const {\n    currentId,\n    setCurrentId,\n    initialDelay,\n    setState,\n    timeoutMs\n  } = groupContext;\n  useModernLayoutEffect(() => {\n    if (!enabled) return;\n    if (!currentId) return;\n    setState({\n      delay: {\n        open: 1,\n        close: getDelay(initialDelay, 'close')\n      }\n    });\n    if (currentId !== id) {\n      onOpenChange(false);\n    }\n  }, [enabled, id, onOpenChange, setState, currentId, initialDelay]);\n  useModernLayoutEffect(() => {\n    function unset() {\n      onOpenChange(false);\n      setState({\n        delay: initialDelay,\n        currentId: null\n      });\n    }\n    if (!enabled) return;\n    if (!currentId) return;\n    if (!open && currentId === id) {\n      if (timeoutMs) {\n        const timeout = window.setTimeout(unset, timeoutMs);\n        return () => {\n          clearTimeout(timeout);\n        };\n      }\n      unset();\n    }\n  }, [enabled, open, setState, currentId, id, onOpenChange, initialDelay, timeoutMs]);\n  useModernLayoutEffect(() => {\n    if (!enabled) return;\n    if (setCurrentId === NOOP || !open) return;\n    setCurrentId(id);\n  }, [enabled, open, setCurrentId, id]);\n  return groupContext;\n}\n\nconst NextFloatingDelayGroupContext = /*#__PURE__*/React.createContext({\n  hasProvider: false,\n  timeoutMs: 0,\n  delayRef: {\n    current: 0\n  },\n  initialDelayRef: {\n    current: 0\n  },\n  timeoutIdRef: {\n    current: -1\n  },\n  currentIdRef: {\n    current: null\n  },\n  currentContextRef: {\n    current: null\n  }\n});\n/**\n * Experimental next version of `FloatingDelayGroup` to become the default\n * in the future. This component is not yet stable.\n * Provides context for a group of floating elements that should share a\n * `delay`. Unlike `FloatingDelayGroup`, `useNextDelayGroup` with this\n * component does not cause a re-render of unrelated consumers of the\n * context when the delay changes.\n * @see https://floating-ui.com/docs/FloatingDelayGroup\n */\nfunction NextFloatingDelayGroup(props) {\n  const {\n    children,\n    delay,\n    timeoutMs = 0\n  } = props;\n  const delayRef = React.useRef(delay);\n  const initialDelayRef = React.useRef(delay);\n  const currentIdRef = React.useRef(null);\n  const currentContextRef = React.useRef(null);\n  const timeoutIdRef = React.useRef(-1);\n  return /*#__PURE__*/jsx(NextFloatingDelayGroupContext.Provider, {\n    value: React.useMemo(() => ({\n      hasProvider: true,\n      delayRef,\n      initialDelayRef,\n      currentIdRef,\n      timeoutMs,\n      currentContextRef,\n      timeoutIdRef\n    }), [timeoutMs]),\n    children: children\n  });\n}\n/**\n * Enables grouping when called inside a component that's a child of a\n * `NextFloatingDelayGroup`.\n * @see https://floating-ui.com/docs/FloatingDelayGroup\n */\nfunction useNextDelayGroup(context, options) {\n  if (options === void 0) {\n    options = {};\n  }\n  const {\n    open,\n    onOpenChange,\n    floatingId\n  } = context;\n  const {\n    enabled = true\n  } = options;\n  const groupContext = React.useContext(NextFloatingDelayGroupContext);\n  const {\n    currentIdRef,\n    delayRef,\n    timeoutMs,\n    initialDelayRef,\n    currentContextRef,\n    hasProvider,\n    timeoutIdRef\n  } = groupContext;\n  const [isInstantPhase, setIsInstantPhase] = React.useState(false);\n  useModernLayoutEffect(() => {\n    function unset() {\n      var _currentContextRef$cu;\n      setIsInstantPhase(false);\n      (_currentContextRef$cu = currentContextRef.current) == null || _currentContextRef$cu.setIsInstantPhase(false);\n      currentIdRef.current = null;\n      currentContextRef.current = null;\n      delayRef.current = initialDelayRef.current;\n    }\n    if (!enabled) return;\n    if (!currentIdRef.current) return;\n    if (!open && currentIdRef.current === floatingId) {\n      setIsInstantPhase(false);\n      if (timeoutMs) {\n        timeoutIdRef.current = window.setTimeout(unset, timeoutMs);\n        return () => {\n          clearTimeout(timeoutIdRef.current);\n        };\n      }\n      unset();\n    }\n  }, [enabled, open, floatingId, currentIdRef, delayRef, timeoutMs, initialDelayRef, currentContextRef, timeoutIdRef]);\n  useModernLayoutEffect(() => {\n    if (!enabled) return;\n    if (!open) return;\n    const prevContext = currentContextRef.current;\n    const prevId = currentIdRef.current;\n    currentContextRef.current = {\n      onOpenChange,\n      setIsInstantPhase\n    };\n    currentIdRef.current = floatingId;\n    delayRef.current = {\n      open: 0,\n      close: getDelay(initialDelayRef.current, 'close')\n    };\n    if (prevId !== null && prevId !== floatingId) {\n      clearTimeoutIfSet(timeoutIdRef);\n      setIsInstantPhase(true);\n      prevContext == null || prevContext.setIsInstantPhase(true);\n      prevContext == null || prevContext.onOpenChange(false);\n    } else {\n      setIsInstantPhase(false);\n      prevContext == null || prevContext.setIsInstantPhase(false);\n    }\n  }, [enabled, open, floatingId, onOpenChange, currentIdRef, delayRef, timeoutMs, initialDelayRef, currentContextRef, timeoutIdRef]);\n  useModernLayoutEffect(() => {\n    return () => {\n      currentContextRef.current = null;\n    };\n  }, [currentContextRef]);\n  return React.useMemo(() => ({\n    hasProvider,\n    delayRef,\n    isInstantPhase\n  }), [hasProvider, delayRef, isInstantPhase]);\n}\n\nlet rafId = 0;\nfunction enqueueFocus(el, options) {\n  if (options === void 0) {\n    options = {};\n  }\n  const {\n    preventScroll = false,\n    cancelPrevious = true,\n    sync = false\n  } = options;\n  cancelPrevious && cancelAnimationFrame(rafId);\n  const exec = () => el == null ? void 0 : el.focus({\n    preventScroll\n  });\n  if (sync) {\n    exec();\n  } else {\n    rafId = requestAnimationFrame(exec);\n  }\n}\n\nfunction contains(parent, child) {\n  if (!parent || !child) {\n    return false;\n  }\n  const rootNode = child.getRootNode == null ? void 0 : child.getRootNode();\n\n  // First, attempt with faster native method\n  if (parent.contains(child)) {\n    return true;\n  }\n\n  // then fallback to custom implementation with Shadow DOM support\n  if (rootNode && isShadowRoot(rootNode)) {\n    let next = child;\n    while (next) {\n      if (parent === next) {\n        return true;\n      }\n      // @ts-ignore\n      next = next.parentNode || next.host;\n    }\n  }\n\n  // Give up, the result is false\n  return false;\n}\nfunction getTarget(event) {\n  if ('composedPath' in event) {\n    return event.composedPath()[0];\n  }\n\n  // TS thinks `event` is of type never as it assumes all browsers support\n  // `composedPath()`, but browsers without shadow DOM don't.\n  return event.target;\n}\nfunction getDocument(node) {\n  return (node == null ? void 0 : node.ownerDocument) || document;\n}\n\n// Modified to add conditional `aria-hidden` support:\n// https://github.com/theKashey/aria-hidden/blob/9220c8f4a4fd35f63bee5510a9f41a37264382d4/src/index.ts\nconst counters = {\n  inert: /*#__PURE__*/new WeakMap(),\n  'aria-hidden': /*#__PURE__*/new WeakMap(),\n  none: /*#__PURE__*/new WeakMap()\n};\nfunction getCounterMap(control) {\n  if (control === 'inert') return counters.inert;\n  if (control === 'aria-hidden') return counters['aria-hidden'];\n  return counters.none;\n}\nlet uncontrolledElementsSet = /*#__PURE__*/new WeakSet();\nlet markerMap = {};\nlet lockCount$1 = 0;\nconst supportsInert = () => typeof HTMLElement !== 'undefined' && 'inert' in HTMLElement.prototype;\nconst unwrapHost = node => node && (node.host || unwrapHost(node.parentNode));\nconst correctElements = (parent, targets) => targets.map(target => {\n  if (parent.contains(target)) {\n    return target;\n  }\n  const correctedTarget = unwrapHost(target);\n  if (parent.contains(correctedTarget)) {\n    return correctedTarget;\n  }\n  return null;\n}).filter(x => x != null);\nfunction applyAttributeToOthers(uncorrectedAvoidElements, body, ariaHidden, inert) {\n  const markerName = 'data-floating-ui-inert';\n  const controlAttribute = inert ? 'inert' : ariaHidden ? 'aria-hidden' : null;\n  const avoidElements = correctElements(body, uncorrectedAvoidElements);\n  const elementsToKeep = new Set();\n  const elementsToStop = new Set(avoidElements);\n  const hiddenElements = [];\n  if (!markerMap[markerName]) {\n    markerMap[markerName] = new WeakMap();\n  }\n  const markerCounter = markerMap[markerName];\n  avoidElements.forEach(keep);\n  deep(body);\n  elementsToKeep.clear();\n  function keep(el) {\n    if (!el || elementsToKeep.has(el)) {\n      return;\n    }\n    elementsToKeep.add(el);\n    el.parentNode && keep(el.parentNode);\n  }\n  function deep(parent) {\n    if (!parent || elementsToStop.has(parent)) {\n      return;\n    }\n    [].forEach.call(parent.children, node => {\n      if (getNodeName(node) === 'script') return;\n      if (elementsToKeep.has(node)) {\n        deep(node);\n      } else {\n        const attr = controlAttribute ? node.getAttribute(controlAttribute) : null;\n        const alreadyHidden = attr !== null && attr !== 'false';\n        const counterMap = getCounterMap(controlAttribute);\n        const counterValue = (counterMap.get(node) || 0) + 1;\n        const markerValue = (markerCounter.get(node) || 0) + 1;\n        counterMap.set(node, counterValue);\n        markerCounter.set(node, markerValue);\n        hiddenElements.push(node);\n        if (counterValue === 1 && alreadyHidden) {\n          uncontrolledElementsSet.add(node);\n        }\n        if (markerValue === 1) {\n          node.setAttribute(markerName, '');\n        }\n        if (!alreadyHidden && controlAttribute) {\n          node.setAttribute(controlAttribute, controlAttribute === 'inert' ? '' : 'true');\n        }\n      }\n    });\n  }\n  lockCount$1++;\n  return () => {\n    hiddenElements.forEach(element => {\n      const counterMap = getCounterMap(controlAttribute);\n      const currentCounterValue = counterMap.get(element) || 0;\n      const counterValue = currentCounterValue - 1;\n      const markerValue = (markerCounter.get(element) || 0) - 1;\n      counterMap.set(element, counterValue);\n      markerCounter.set(element, markerValue);\n      if (!counterValue) {\n        if (!uncontrolledElementsSet.has(element) && controlAttribute) {\n          element.removeAttribute(controlAttribute);\n        }\n        uncontrolledElementsSet.delete(element);\n      }\n      if (!markerValue) {\n        element.removeAttribute(markerName);\n      }\n    });\n    lockCount$1--;\n    if (!lockCount$1) {\n      counters.inert = new WeakMap();\n      counters['aria-hidden'] = new WeakMap();\n      counters.none = new WeakMap();\n      uncontrolledElementsSet = new WeakSet();\n      markerMap = {};\n    }\n  };\n}\nfunction markOthers(avoidElements, ariaHidden, inert) {\n  if (ariaHidden === void 0) {\n    ariaHidden = false;\n  }\n  if (inert === void 0) {\n    inert = false;\n  }\n  const body = getDocument(avoidElements[0]).body;\n  return applyAttributeToOthers(avoidElements.concat(Array.from(body.querySelectorAll('[aria-live],[role=\"status\"],output'))), body, ariaHidden, inert);\n}\n\nconst HIDDEN_STYLES = {\n  border: 0,\n  clip: 'rect(0 0 0 0)',\n  height: '1px',\n  margin: '-1px',\n  overflow: 'hidden',\n  padding: 0,\n  position: 'fixed',\n  whiteSpace: 'nowrap',\n  width: '1px',\n  top: 0,\n  left: 0\n};\nconst FocusGuard = /*#__PURE__*/React.forwardRef(function FocusGuard(props, ref) {\n  const [role, setRole] = React.useState();\n  useModernLayoutEffect(() => {\n    if (isSafari()) {\n      // Unlike other screen readers such as NVDA and JAWS, the virtual cursor\n      // on VoiceOver does trigger the onFocus event, so we can use the focus\n      // trap element. On Safari, only buttons trigger the onFocus event.\n      // NB: \"group\" role in the Sandbox no longer appears to work, must be a\n      // button role.\n      setRole('button');\n    }\n  }, []);\n  const restProps = {\n    ref,\n    tabIndex: 0,\n    // Role is only for VoiceOver\n    role,\n    'aria-hidden': role ? undefined : true,\n    [createAttribute('focus-guard')]: '',\n    style: HIDDEN_STYLES\n  };\n  return /*#__PURE__*/jsx(\"span\", {\n    ...props,\n    ...restProps\n  });\n});\n\nconst PortalContext = /*#__PURE__*/React.createContext(null);\nconst attr = /*#__PURE__*/createAttribute('portal');\n/**\n * @see https://floating-ui.com/docs/FloatingPortal#usefloatingportalnode\n */\nfunction useFloatingPortalNode(props) {\n  if (props === void 0) {\n    props = {};\n  }\n  const {\n    id,\n    root\n  } = props;\n  const uniqueId = useId();\n  const portalContext = usePortalContext();\n  const [portalNode, setPortalNode] = React.useState(null);\n  const portalNodeRef = React.useRef(null);\n  useModernLayoutEffect(() => {\n    return () => {\n      portalNode == null || portalNode.remove();\n      // Allow the subsequent layout effects to create a new node on updates.\n      // The portal node will still be cleaned up on unmount.\n      // https://github.com/floating-ui/floating-ui/issues/2454\n      queueMicrotask(() => {\n        portalNodeRef.current = null;\n      });\n    };\n  }, [portalNode]);\n  useModernLayoutEffect(() => {\n    // Wait for the uniqueId to be generated before creating the portal node in\n    // React <18 (using `useFloatingId` instead of the native `useId`).\n    // https://github.com/floating-ui/floating-ui/issues/2778\n    if (!uniqueId) return;\n    if (portalNodeRef.current) return;\n    const existingIdRoot = id ? document.getElementById(id) : null;\n    if (!existingIdRoot) return;\n    const subRoot = document.createElement('div');\n    subRoot.id = uniqueId;\n    subRoot.setAttribute(attr, '');\n    existingIdRoot.appendChild(subRoot);\n    portalNodeRef.current = subRoot;\n    setPortalNode(subRoot);\n  }, [id, uniqueId]);\n  useModernLayoutEffect(() => {\n    // Wait for the root to exist before creating the portal node. The root must\n    // be stored in state, not a ref, for this to work reactively.\n    if (root === null) return;\n    if (!uniqueId) return;\n    if (portalNodeRef.current) return;\n    let container = root || (portalContext == null ? void 0 : portalContext.portalNode);\n    if (container && !isNode(container)) container = container.current;\n    container = container || document.body;\n    let idWrapper = null;\n    if (id) {\n      idWrapper = document.createElement('div');\n      idWrapper.id = id;\n      container.appendChild(idWrapper);\n    }\n    const subRoot = document.createElement('div');\n    subRoot.id = uniqueId;\n    subRoot.setAttribute(attr, '');\n    container = idWrapper || container;\n    container.appendChild(subRoot);\n    portalNodeRef.current = subRoot;\n    setPortalNode(subRoot);\n  }, [id, root, uniqueId, portalContext]);\n  return portalNode;\n}\n/**\n * Portals the floating element into a given container element — by default,\n * outside of the app root and into the body.\n * This is necessary to ensure the floating element can appear outside any\n * potential parent containers that cause clipping (such as `overflow: hidden`),\n * while retaining its location in the React tree.\n * @see https://floating-ui.com/docs/FloatingPortal\n */\nfunction FloatingPortal(props) {\n  const {\n    children,\n    id,\n    root,\n    preserveTabOrder = true\n  } = props;\n  const portalNode = useFloatingPortalNode({\n    id,\n    root\n  });\n  const [focusManagerState, setFocusManagerState] = React.useState(null);\n  const beforeOutsideRef = React.useRef(null);\n  const afterOutsideRef = React.useRef(null);\n  const beforeInsideRef = React.useRef(null);\n  const afterInsideRef = React.useRef(null);\n  const modal = focusManagerState == null ? void 0 : focusManagerState.modal;\n  const open = focusManagerState == null ? void 0 : focusManagerState.open;\n  const shouldRenderGuards =\n  // The FocusManager and therefore floating element are currently open/\n  // rendered.\n  !!focusManagerState &&\n  // Guards are only for non-modal focus management.\n  !focusManagerState.modal &&\n  // Don't render if unmount is transitioning.\n  focusManagerState.open && preserveTabOrder && !!(root || portalNode);\n\n  // https://codesandbox.io/s/tabbable-portal-f4tng?file=/src/TabbablePortal.tsx\n  React.useEffect(() => {\n    if (!portalNode || !preserveTabOrder || modal) {\n      return;\n    }\n\n    // Make sure elements inside the portal element are tabbable only when the\n    // portal has already been focused, either by tabbing into a focus trap\n    // element outside or using the mouse.\n    function onFocus(event) {\n      if (portalNode && isOutsideEvent(event)) {\n        const focusing = event.type === 'focusin';\n        const manageFocus = focusing ? enableFocusInside : disableFocusInside;\n        manageFocus(portalNode);\n      }\n    }\n    // Listen to the event on the capture phase so they run before the focus\n    // trap elements onFocus prop is called.\n    portalNode.addEventListener('focusin', onFocus, true);\n    portalNode.addEventListener('focusout', onFocus, true);\n    return () => {\n      portalNode.removeEventListener('focusin', onFocus, true);\n      portalNode.removeEventListener('focusout', onFocus, true);\n    };\n  }, [portalNode, preserveTabOrder, modal]);\n  React.useEffect(() => {\n    if (!portalNode) return;\n    if (open) return;\n    enableFocusInside(portalNode);\n  }, [open, portalNode]);\n  return /*#__PURE__*/jsxs(PortalContext.Provider, {\n    value: React.useMemo(() => ({\n      preserveTabOrder,\n      beforeOutsideRef,\n      afterOutsideRef,\n      beforeInsideRef,\n      afterInsideRef,\n      portalNode,\n      setFocusManagerState\n    }), [preserveTabOrder, portalNode]),\n    children: [shouldRenderGuards && portalNode && /*#__PURE__*/jsx(FocusGuard, {\n      \"data-type\": \"outside\",\n      ref: beforeOutsideRef,\n      onFocus: event => {\n        if (isOutsideEvent(event, portalNode)) {\n          var _beforeInsideRef$curr;\n          (_beforeInsideRef$curr = beforeInsideRef.current) == null || _beforeInsideRef$curr.focus();\n        } else {\n          const domReference = focusManagerState ? focusManagerState.domReference : null;\n          const prevTabbable = getPreviousTabbable(domReference);\n          prevTabbable == null || prevTabbable.focus();\n        }\n      }\n    }), shouldRenderGuards && portalNode && /*#__PURE__*/jsx(\"span\", {\n      \"aria-owns\": portalNode.id,\n      style: HIDDEN_STYLES\n    }), portalNode && /*#__PURE__*/ReactDOM.createPortal(children, portalNode), shouldRenderGuards && portalNode && /*#__PURE__*/jsx(FocusGuard, {\n      \"data-type\": \"outside\",\n      ref: afterOutsideRef,\n      onFocus: event => {\n        if (isOutsideEvent(event, portalNode)) {\n          var _afterInsideRef$curre;\n          (_afterInsideRef$curre = afterInsideRef.current) == null || _afterInsideRef$curre.focus();\n        } else {\n          const domReference = focusManagerState ? focusManagerState.domReference : null;\n          const nextTabbable = getNextTabbable(domReference);\n          nextTabbable == null || nextTabbable.focus();\n          (focusManagerState == null ? void 0 : focusManagerState.closeOnFocusOut) && (focusManagerState == null ? void 0 : focusManagerState.onOpenChange(false, event.nativeEvent, 'focus-out'));\n        }\n      }\n    })]\n  });\n}\nconst usePortalContext = () => React.useContext(PortalContext);\n\nfunction useLiteMergeRefs(refs) {\n  return React.useMemo(() => {\n    return value => {\n      refs.forEach(ref => {\n        if (ref) {\n          ref.current = value;\n        }\n      });\n    };\n    // eslint-disable-next-line react-hooks/exhaustive-deps\n  }, refs);\n}\n\nconst LIST_LIMIT = 20;\nlet previouslyFocusedElements = [];\nfunction clearDisconnectedPreviouslyFocusedElements() {\n  previouslyFocusedElements = previouslyFocusedElements.filter(el => el.isConnected);\n}\nfunction addPreviouslyFocusedElement(element) {\n  clearDisconnectedPreviouslyFocusedElements();\n  if (element && getNodeName(element) !== 'body') {\n    previouslyFocusedElements.push(element);\n    if (previouslyFocusedElements.length > LIST_LIMIT) {\n      previouslyFocusedElements = previouslyFocusedElements.slice(-20);\n    }\n  }\n}\nfunction getPreviouslyFocusedElement() {\n  clearDisconnectedPreviouslyFocusedElements();\n  return previouslyFocusedElements[previouslyFocusedElements.length - 1];\n}\nfunction getFirstTabbableElement(container) {\n  const tabbableOptions = getTabbableOptions();\n  if (isTabbable(container, tabbableOptions)) {\n    return container;\n  }\n  return tabbable(container, tabbableOptions)[0] || container;\n}\nfunction handleTabIndex(floatingFocusElement, orderRef) {\n  var _floatingFocusElement;\n  if (!orderRef.current.includes('floating') && !((_floatingFocusElement = floatingFocusElement.getAttribute('role')) != null && _floatingFocusElement.includes('dialog'))) {\n    return;\n  }\n  const options = getTabbableOptions();\n  const focusableElements = focusable(floatingFocusElement, options);\n  const tabbableContent = focusableElements.filter(element => {\n    const dataTabIndex = element.getAttribute('data-tabindex') || '';\n    return isTabbable(element, options) || element.hasAttribute('data-tabindex') && !dataTabIndex.startsWith('-');\n  });\n  const tabIndex = floatingFocusElement.getAttribute('tabindex');\n  if (orderRef.current.includes('floating') || tabbableContent.length === 0) {\n    if (tabIndex !== '0') {\n      floatingFocusElement.setAttribute('tabindex', '0');\n    }\n  } else if (tabIndex !== '-1' || floatingFocusElement.hasAttribute('data-tabindex') && floatingFocusElement.getAttribute('data-tabindex') !== '-1') {\n    floatingFocusElement.setAttribute('tabindex', '-1');\n    floatingFocusElement.setAttribute('data-tabindex', '-1');\n  }\n}\nconst VisuallyHiddenDismiss = /*#__PURE__*/React.forwardRef(function VisuallyHiddenDismiss(props, ref) {\n  return /*#__PURE__*/jsx(\"button\", {\n    ...props,\n    type: \"button\",\n    ref: ref,\n    tabIndex: -1,\n    style: HIDDEN_STYLES\n  });\n});\n/**\n * Provides focus management for the floating element.\n * @see https://floating-ui.com/docs/FloatingFocusManager\n */\nfunction FloatingFocusManager(props) {\n  const {\n    context,\n    children,\n    disabled = false,\n    order = ['content'],\n    guards: _guards = true,\n    initialFocus = 0,\n    returnFocus = true,\n    restoreFocus = false,\n    modal = true,\n    visuallyHiddenDismiss = false,\n    closeOnFocusOut = true,\n    outsideElementsInert = false,\n    getInsideElements: _getInsideElements = () => []\n  } = props;\n  const {\n    open,\n    onOpenChange,\n    events,\n    dataRef,\n    elements: {\n      domReference,\n      floating\n    }\n  } = context;\n  const getNodeId = useEffectEvent(() => {\n    var _dataRef$current$floa;\n    return (_dataRef$current$floa = dataRef.current.floatingContext) == null ? void 0 : _dataRef$current$floa.nodeId;\n  });\n  const getInsideElements = useEffectEvent(_getInsideElements);\n  const ignoreInitialFocus = typeof initialFocus === 'number' && initialFocus < 0;\n  // If the reference is a combobox and is typeable (e.g. input/textarea),\n  // there are different focus semantics. The guards should not be rendered, but\n  // aria-hidden should be applied to all nodes still. Further, the visually\n  // hidden dismiss button should only appear at the end of the list, not the\n  // start.\n  const isUntrappedTypeableCombobox = isTypeableCombobox(domReference) && ignoreInitialFocus;\n\n  // Force the guards to be rendered if the `inert` attribute is not supported.\n  const inertSupported = supportsInert();\n  const guards = inertSupported ? _guards : true;\n  const useInert = !guards || inertSupported && outsideElementsInert;\n  const orderRef = useLatestRef(order);\n  const initialFocusRef = useLatestRef(initialFocus);\n  const returnFocusRef = useLatestRef(returnFocus);\n  const tree = useFloatingTree();\n  const portalContext = usePortalContext();\n  const startDismissButtonRef = React.useRef(null);\n  const endDismissButtonRef = React.useRef(null);\n  const preventReturnFocusRef = React.useRef(false);\n  const isPointerDownRef = React.useRef(false);\n  const tabbableIndexRef = React.useRef(-1);\n  const blurTimeoutRef = React.useRef(-1);\n  const isInsidePortal = portalContext != null;\n  const floatingFocusElement = getFloatingFocusElement(floating);\n  const getTabbableContent = useEffectEvent(function (container) {\n    if (container === void 0) {\n      container = floatingFocusElement;\n    }\n    return container ? tabbable(container, getTabbableOptions()) : [];\n  });\n  const getTabbableElements = useEffectEvent(container => {\n    const content = getTabbableContent(container);\n    return orderRef.current.map(type => {\n      if (domReference && type === 'reference') {\n        return domReference;\n      }\n      if (floatingFocusElement && type === 'floating') {\n        return floatingFocusElement;\n      }\n      return content;\n    }).filter(Boolean).flat();\n  });\n  React.useEffect(() => {\n    if (disabled) return;\n    if (!modal) return;\n    function onKeyDown(event) {\n      if (event.key === 'Tab') {\n        // The focus guards have nothing to focus, so we need to stop the event.\n        if (contains$1(floatingFocusElement, activeElement(getDocument$1(floatingFocusElement))) && getTabbableContent().length === 0 && !isUntrappedTypeableCombobox) {\n          stopEvent(event);\n        }\n        const els = getTabbableElements();\n        const target = getTarget$1(event);\n        if (orderRef.current[0] === 'reference' && target === domReference) {\n          stopEvent(event);\n          if (event.shiftKey) {\n            enqueueFocus(els[els.length - 1]);\n          } else {\n            enqueueFocus(els[1]);\n          }\n        }\n        if (orderRef.current[1] === 'floating' && target === floatingFocusElement && event.shiftKey) {\n          stopEvent(event);\n          enqueueFocus(els[0]);\n        }\n      }\n    }\n    const doc = getDocument$1(floatingFocusElement);\n    doc.addEventListener('keydown', onKeyDown);\n    return () => {\n      doc.removeEventListener('keydown', onKeyDown);\n    };\n  }, [disabled, domReference, floatingFocusElement, modal, orderRef, isUntrappedTypeableCombobox, getTabbableContent, getTabbableElements]);\n  React.useEffect(() => {\n    if (disabled) return;\n    if (!floating) return;\n    function handleFocusIn(event) {\n      const target = getTarget$1(event);\n      const tabbableContent = getTabbableContent();\n      const tabbableIndex = tabbableContent.indexOf(target);\n      if (tabbableIndex !== -1) {\n        tabbableIndexRef.current = tabbableIndex;\n      }\n    }\n    floating.addEventListener('focusin', handleFocusIn);\n    return () => {\n      floating.removeEventListener('focusin', handleFocusIn);\n    };\n  }, [disabled, floating, getTabbableContent]);\n  React.useEffect(() => {\n    if (disabled) return;\n    if (!closeOnFocusOut) return;\n\n    // In Safari, buttons lose focus when pressing them.\n    function handlePointerDown() {\n      isPointerDownRef.current = true;\n      setTimeout(() => {\n        isPointerDownRef.current = false;\n      });\n    }\n    function handleFocusOutside(event) {\n      const relatedTarget = event.relatedTarget;\n      const currentTarget = event.currentTarget;\n      const target = getTarget$1(event);\n      queueMicrotask(() => {\n        const nodeId = getNodeId();\n        const movedToUnrelatedNode = !(contains$1(domReference, relatedTarget) || contains$1(floating, relatedTarget) || contains$1(relatedTarget, floating) || contains$1(portalContext == null ? void 0 : portalContext.portalNode, relatedTarget) || relatedTarget != null && relatedTarget.hasAttribute(createAttribute('focus-guard')) || tree && (getNodeChildren$1(tree.nodesRef.current, nodeId).find(node => {\n          var _node$context, _node$context2;\n          return contains$1((_node$context = node.context) == null ? void 0 : _node$context.elements.floating, relatedTarget) || contains$1((_node$context2 = node.context) == null ? void 0 : _node$context2.elements.domReference, relatedTarget);\n        }) || getNodeAncestors(tree.nodesRef.current, nodeId).find(node => {\n          var _node$context3, _node$context4, _node$context5;\n          return [(_node$context3 = node.context) == null ? void 0 : _node$context3.elements.floating, getFloatingFocusElement((_node$context4 = node.context) == null ? void 0 : _node$context4.elements.floating)].includes(relatedTarget) || ((_node$context5 = node.context) == null ? void 0 : _node$context5.elements.domReference) === relatedTarget;\n        })));\n        if (currentTarget === domReference && floatingFocusElement) {\n          handleTabIndex(floatingFocusElement, orderRef);\n        }\n\n        // Restore focus to the previous tabbable element index to prevent\n        // focus from being lost outside the floating tree.\n        if (restoreFocus && currentTarget !== domReference && !(target != null && target.isConnected) && activeElement(getDocument$1(floatingFocusElement)) === getDocument$1(floatingFocusElement).body) {\n          // Let `FloatingPortal` effect knows that focus is still inside the\n          // floating tree.\n          if (isHTMLElement(floatingFocusElement)) {\n            floatingFocusElement.focus();\n          }\n          const prevTabbableIndex = tabbableIndexRef.current;\n          const tabbableContent = getTabbableContent();\n          const nodeToFocus = tabbableContent[prevTabbableIndex] || tabbableContent[tabbableContent.length - 1] || floatingFocusElement;\n          if (isHTMLElement(nodeToFocus)) {\n            nodeToFocus.focus();\n          }\n        }\n\n        // https://github.com/floating-ui/floating-ui/issues/3060\n        if (dataRef.current.insideReactTree) {\n          dataRef.current.insideReactTree = false;\n          return;\n        }\n\n        // Focus did not move inside the floating tree, and there are no tabbable\n        // portal guards to handle closing.\n        if ((isUntrappedTypeableCombobox ? true : !modal) && relatedTarget && movedToUnrelatedNode && !isPointerDownRef.current &&\n        // Fix React 18 Strict Mode returnFocus due to double rendering.\n        relatedTarget !== getPreviouslyFocusedElement()) {\n          preventReturnFocusRef.current = true;\n          onOpenChange(false, event, 'focus-out');\n        }\n      });\n    }\n    const shouldHandleBlurCapture = Boolean(!tree && portalContext);\n    function markInsideReactTree() {\n      clearTimeoutIfSet(blurTimeoutRef);\n      dataRef.current.insideReactTree = true;\n      blurTimeoutRef.current = window.setTimeout(() => {\n        dataRef.current.insideReactTree = false;\n      });\n    }\n    if (floating && isHTMLElement(domReference)) {\n      domReference.addEventListener('focusout', handleFocusOutside);\n      domReference.addEventListener('pointerdown', handlePointerDown);\n      floating.addEventListener('focusout', handleFocusOutside);\n      if (shouldHandleBlurCapture) {\n        floating.addEventListener('focusout', markInsideReactTree, true);\n      }\n      return () => {\n        domReference.removeEventListener('focusout', handleFocusOutside);\n        domReference.removeEventListener('pointerdown', handlePointerDown);\n        floating.removeEventListener('focusout', handleFocusOutside);\n        if (shouldHandleBlurCapture) {\n          floating.removeEventListener('focusout', markInsideReactTree, true);\n        }\n      };\n    }\n  }, [disabled, domReference, floating, floatingFocusElement, modal, tree, portalContext, onOpenChange, closeOnFocusOut, restoreFocus, getTabbableContent, isUntrappedTypeableCombobox, getNodeId, orderRef, dataRef]);\n  const beforeGuardRef = React.useRef(null);\n  const afterGuardRef = React.useRef(null);\n  const mergedBeforeGuardRef = useLiteMergeRefs([beforeGuardRef, portalContext == null ? void 0 : portalContext.beforeInsideRef]);\n  const mergedAfterGuardRef = useLiteMergeRefs([afterGuardRef, portalContext == null ? void 0 : portalContext.afterInsideRef]);\n  React.useEffect(() => {\n    var _portalContext$portal, _ancestors$find;\n    if (disabled) return;\n    if (!floating) return;\n\n    // Don't hide portals nested within the parent portal.\n    const portalNodes = Array.from((portalContext == null || (_portalContext$portal = portalContext.portalNode) == null ? void 0 : _portalContext$portal.querySelectorAll(\"[\" + createAttribute('portal') + \"]\")) || []);\n    const ancestors = tree ? getNodeAncestors(tree.nodesRef.current, getNodeId()) : [];\n    const rootAncestorComboboxDomReference = (_ancestors$find = ancestors.find(node => {\n      var _node$context6;\n      return isTypeableCombobox(((_node$context6 = node.context) == null ? void 0 : _node$context6.elements.domReference) || null);\n    })) == null || (_ancestors$find = _ancestors$find.context) == null ? void 0 : _ancestors$find.elements.domReference;\n    const insideElements = [floating, rootAncestorComboboxDomReference, ...portalNodes, ...getInsideElements(), startDismissButtonRef.current, endDismissButtonRef.current, beforeGuardRef.current, afterGuardRef.current, portalContext == null ? void 0 : portalContext.beforeOutsideRef.current, portalContext == null ? void 0 : portalContext.afterOutsideRef.current, orderRef.current.includes('reference') || isUntrappedTypeableCombobox ? domReference : null].filter(x => x != null);\n    const cleanup = modal || isUntrappedTypeableCombobox ? markOthers(insideElements, !useInert, useInert) : markOthers(insideElements);\n    return () => {\n      cleanup();\n    };\n  }, [disabled, domReference, floating, modal, orderRef, portalContext, isUntrappedTypeableCombobox, guards, useInert, tree, getNodeId, getInsideElements]);\n  useModernLayoutEffect(() => {\n    if (disabled || !isHTMLElement(floatingFocusElement)) return;\n    const doc = getDocument$1(floatingFocusElement);\n    const previouslyFocusedElement = activeElement(doc);\n\n    // Wait for any layout effect state setters to execute to set `tabIndex`.\n    queueMicrotask(() => {\n      const focusableElements = getTabbableElements(floatingFocusElement);\n      const initialFocusValue = initialFocusRef.current;\n      const elToFocus = (typeof initialFocusValue === 'number' ? focusableElements[initialFocusValue] : initialFocusValue.current) || floatingFocusElement;\n      const focusAlreadyInsideFloatingEl = contains$1(floatingFocusElement, previouslyFocusedElement);\n      if (!ignoreInitialFocus && !focusAlreadyInsideFloatingEl && open) {\n        enqueueFocus(elToFocus, {\n          preventScroll: elToFocus === floatingFocusElement\n        });\n      }\n    });\n  }, [disabled, open, floatingFocusElement, ignoreInitialFocus, getTabbableElements, initialFocusRef]);\n  useModernLayoutEffect(() => {\n    if (disabled || !floatingFocusElement) return;\n    const doc = getDocument$1(floatingFocusElement);\n    const previouslyFocusedElement = activeElement(doc);\n    addPreviouslyFocusedElement(previouslyFocusedElement);\n\n    // Dismissing via outside press should always ignore `returnFocus` to\n    // prevent unwanted scrolling.\n    function onOpenChange(_ref) {\n      let {\n        reason,\n        event,\n        nested\n      } = _ref;\n      if (['hover', 'safe-polygon'].includes(reason) && event.type === 'mouseleave') {\n        preventReturnFocusRef.current = true;\n      }\n      if (reason !== 'outside-press') return;\n      if (nested) {\n        preventReturnFocusRef.current = false;\n      } else if (isVirtualClick(event) || isVirtualPointerEvent(event)) {\n        preventReturnFocusRef.current = false;\n      } else {\n        let isPreventScrollSupported = false;\n        document.createElement('div').focus({\n          get preventScroll() {\n            isPreventScrollSupported = true;\n            return false;\n          }\n        });\n        if (isPreventScrollSupported) {\n          preventReturnFocusRef.current = false;\n        } else {\n          preventReturnFocusRef.current = true;\n        }\n      }\n    }\n    events.on('openchange', onOpenChange);\n    const fallbackEl = doc.createElement('span');\n    fallbackEl.setAttribute('tabindex', '-1');\n    fallbackEl.setAttribute('aria-hidden', 'true');\n    Object.assign(fallbackEl.style, HIDDEN_STYLES);\n    if (isInsidePortal && domReference) {\n      domReference.insertAdjacentElement('afterend', fallbackEl);\n    }\n    function getReturnElement() {\n      if (typeof returnFocusRef.current === 'boolean') {\n        const el = domReference || getPreviouslyFocusedElement();\n        return el && el.isConnected ? el : fallbackEl;\n      }\n      return returnFocusRef.current.current || fallbackEl;\n    }\n    return () => {\n      events.off('openchange', onOpenChange);\n      const activeEl = activeElement(doc);\n      const isFocusInsideFloatingTree = contains$1(floating, activeEl) || tree && getNodeChildren$1(tree.nodesRef.current, getNodeId(), false).some(node => {\n        var _node$context7;\n        return contains$1((_node$context7 = node.context) == null ? void 0 : _node$context7.elements.floating, activeEl);\n      });\n      const returnElement = getReturnElement();\n      queueMicrotask(() => {\n        // This is `returnElement`, if it's tabbable, or its first tabbable child.\n        const tabbableReturnElement = getFirstTabbableElement(returnElement);\n        if (\n        // eslint-disable-next-line react-hooks/exhaustive-deps\n        returnFocusRef.current && !preventReturnFocusRef.current && isHTMLElement(tabbableReturnElement) && (\n        // If the focus moved somewhere else after mount, avoid returning focus\n        // since it likely entered a different element which should be\n        // respected: https://github.com/floating-ui/floating-ui/issues/2607\n        tabbableReturnElement !== activeEl && activeEl !== doc.body ? isFocusInsideFloatingTree : true)) {\n          tabbableReturnElement.focus({\n            preventScroll: true\n          });\n        }\n        fallbackEl.remove();\n      });\n    };\n  }, [disabled, floating, floatingFocusElement, returnFocusRef, dataRef, events, tree, isInsidePortal, domReference, getNodeId]);\n  React.useEffect(() => {\n    // The `returnFocus` cleanup behavior is inside a microtask; ensure we\n    // wait for it to complete before resetting the flag.\n    queueMicrotask(() => {\n      preventReturnFocusRef.current = false;\n    });\n    return () => {\n      queueMicrotask(clearDisconnectedPreviouslyFocusedElements);\n    };\n  }, [disabled]);\n\n  // Synchronize the `context` & `modal` value to the FloatingPortal context.\n  // It will decide whether or not it needs to render its own guards.\n  useModernLayoutEffect(() => {\n    if (disabled) return;\n    if (!portalContext) return;\n    portalContext.setFocusManagerState({\n      modal,\n      closeOnFocusOut,\n      open,\n      onOpenChange,\n      domReference\n    });\n    return () => {\n      portalContext.setFocusManagerState(null);\n    };\n  }, [disabled, portalContext, modal, open, onOpenChange, closeOnFocusOut, domReference]);\n  useModernLayoutEffect(() => {\n    if (disabled) return;\n    if (!floatingFocusElement) return;\n    handleTabIndex(floatingFocusElement, orderRef);\n  }, [disabled, floatingFocusElement, orderRef]);\n  function renderDismissButton(location) {\n    if (disabled || !visuallyHiddenDismiss || !modal) {\n      return null;\n    }\n    return /*#__PURE__*/jsx(VisuallyHiddenDismiss, {\n      ref: location === 'start' ? startDismissButtonRef : endDismissButtonRef,\n      onClick: event => onOpenChange(false, event.nativeEvent),\n      children: typeof visuallyHiddenDismiss === 'string' ? visuallyHiddenDismiss : 'Dismiss'\n    });\n  }\n  const shouldRenderGuards = !disabled && guards && (modal ? !isUntrappedTypeableCombobox : true) && (isInsidePortal || modal);\n  return /*#__PURE__*/jsxs(Fragment, {\n    children: [shouldRenderGuards && /*#__PURE__*/jsx(FocusGuard, {\n      \"data-type\": \"inside\",\n      ref: mergedBeforeGuardRef,\n      onFocus: event => {\n        if (modal) {\n          const els = getTabbableElements();\n          enqueueFocus(order[0] === 'reference' ? els[0] : els[els.length - 1]);\n        } else if (portalContext != null && portalContext.preserveTabOrder && portalContext.portalNode) {\n          preventReturnFocusRef.current = false;\n          if (isOutsideEvent(event, portalContext.portalNode)) {\n            const nextTabbable = getNextTabbable(domReference);\n            nextTabbable == null || nextTabbable.focus();\n          } else {\n            var _portalContext$before;\n            (_portalContext$before = portalContext.beforeOutsideRef.current) == null || _portalContext$before.focus();\n          }\n        }\n      }\n    }), !isUntrappedTypeableCombobox && renderDismissButton('start'), children, renderDismissButton('end'), shouldRenderGuards && /*#__PURE__*/jsx(FocusGuard, {\n      \"data-type\": \"inside\",\n      ref: mergedAfterGuardRef,\n      onFocus: event => {\n        if (modal) {\n          enqueueFocus(getTabbableElements()[0]);\n        } else if (portalContext != null && portalContext.preserveTabOrder && portalContext.portalNode) {\n          if (closeOnFocusOut) {\n            preventReturnFocusRef.current = true;\n          }\n          if (isOutsideEvent(event, portalContext.portalNode)) {\n            const prevTabbable = getPreviousTabbable(domReference);\n            prevTabbable == null || prevTabbable.focus();\n          } else {\n            var _portalContext$afterO;\n            (_portalContext$afterO = portalContext.afterOutsideRef.current) == null || _portalContext$afterO.focus();\n          }\n        }\n      }\n    })]\n  });\n}\n\nlet lockCount = 0;\nconst scrollbarProperty = '--floating-ui-scrollbar-width';\nfunction enableScrollLock() {\n  const platform = getPlatform();\n  const isIOS = /iP(hone|ad|od)|iOS/.test(platform) ||\n  // iPads can claim to be MacIntel\n  platform === 'MacIntel' && navigator.maxTouchPoints > 1;\n  const bodyStyle = document.body.style;\n  // RTL <body> scrollbar\n  const scrollbarX = Math.round(document.documentElement.getBoundingClientRect().left) + document.documentElement.scrollLeft;\n  const paddingProp = scrollbarX ? 'paddingLeft' : 'paddingRight';\n  const scrollbarWidth = window.innerWidth - document.documentElement.clientWidth;\n  const scrollX = bodyStyle.left ? parseFloat(bodyStyle.left) : window.scrollX;\n  const scrollY = bodyStyle.top ? parseFloat(bodyStyle.top) : window.scrollY;\n  bodyStyle.overflow = 'hidden';\n  bodyStyle.setProperty(scrollbarProperty, scrollbarWidth + \"px\");\n  if (scrollbarWidth) {\n    bodyStyle[paddingProp] = scrollbarWidth + \"px\";\n  }\n\n  // Only iOS doesn't respect `overflow: hidden` on document.body, and this\n  // technique has fewer side effects.\n  if (isIOS) {\n    var _window$visualViewpor, _window$visualViewpor2;\n    // iOS 12 does not support `visualViewport`.\n    const offsetLeft = ((_window$visualViewpor = window.visualViewport) == null ? void 0 : _window$visualViewpor.offsetLeft) || 0;\n    const offsetTop = ((_window$visualViewpor2 = window.visualViewport) == null ? void 0 : _window$visualViewpor2.offsetTop) || 0;\n    Object.assign(bodyStyle, {\n      position: 'fixed',\n      top: -(scrollY - Math.floor(offsetTop)) + \"px\",\n      left: -(scrollX - Math.floor(offsetLeft)) + \"px\",\n      right: '0'\n    });\n  }\n  return () => {\n    Object.assign(bodyStyle, {\n      overflow: '',\n      [paddingProp]: ''\n    });\n    bodyStyle.removeProperty(scrollbarProperty);\n    if (isIOS) {\n      Object.assign(bodyStyle, {\n        position: '',\n        top: '',\n        left: '',\n        right: ''\n      });\n      window.scrollTo(scrollX, scrollY);\n    }\n  };\n}\nlet cleanup = () => {};\n\n/**\n * Provides base styling for a fixed overlay element to dim content or block\n * pointer events behind a floating element.\n * It's a regular `<div>`, so it can be styled via any CSS solution you prefer.\n * @see https://floating-ui.com/docs/FloatingOverlay\n */\nconst FloatingOverlay = /*#__PURE__*/React.forwardRef(function FloatingOverlay(props, ref) {\n  const {\n    lockScroll = false,\n    ...rest\n  } = props;\n  useModernLayoutEffect(() => {\n    if (!lockScroll) return;\n    lockCount++;\n    if (lockCount === 1) {\n      cleanup = enableScrollLock();\n    }\n    return () => {\n      lockCount--;\n      if (lockCount === 0) {\n        cleanup();\n      }\n    };\n  }, [lockScroll]);\n  return /*#__PURE__*/jsx(\"div\", {\n    ref: ref,\n    ...rest,\n    style: {\n      position: 'fixed',\n      overflow: 'auto',\n      top: 0,\n      right: 0,\n      bottom: 0,\n      left: 0,\n      ...rest.style\n    }\n  });\n});\n\nfunction isButtonTarget(event) {\n  return isHTMLElement(event.target) && event.target.tagName === 'BUTTON';\n}\nfunction isAnchorTarget(event) {\n  return isHTMLElement(event.target) && event.target.tagName === 'A';\n}\nfunction isSpaceIgnored(element) {\n  return isTypeableElement(element);\n}\n/**\n * Opens or closes the floating element when clicking the reference element.\n * @see https://floating-ui.com/docs/useClick\n */\nfunction useClick(context, props) {\n  if (props === void 0) {\n    props = {};\n  }\n  const {\n    open,\n    onOpenChange,\n    dataRef,\n    elements: {\n      domReference\n    }\n  } = context;\n  const {\n    enabled = true,\n    event: eventOption = 'click',\n    toggle = true,\n    ignoreMouse = false,\n    keyboardHandlers = true,\n    stickIfOpen = true\n  } = props;\n  const pointerTypeRef = React.useRef();\n  const didKeyDownRef = React.useRef(false);\n  const reference = React.useMemo(() => ({\n    onPointerDown(event) {\n      pointerTypeRef.current = event.pointerType;\n    },\n    onMouseDown(event) {\n      const pointerType = pointerTypeRef.current;\n\n      // Ignore all buttons except for the \"main\" button.\n      // https://developer.mozilla.org/en-US/docs/Web/API/MouseEvent/button\n      if (event.button !== 0) return;\n      if (eventOption === 'click') return;\n      if (isMouseLikePointerType(pointerType, true) && ignoreMouse) return;\n      if (open && toggle && (dataRef.current.openEvent && stickIfOpen ? dataRef.current.openEvent.type === 'mousedown' : true)) {\n        onOpenChange(false, event.nativeEvent, 'click');\n      } else {\n        // Prevent stealing focus from the floating element\n        event.preventDefault();\n        onOpenChange(true, event.nativeEvent, 'click');\n      }\n    },\n    onClick(event) {\n      const pointerType = pointerTypeRef.current;\n      if (eventOption === 'mousedown' && pointerTypeRef.current) {\n        pointerTypeRef.current = undefined;\n        return;\n      }\n      if (isMouseLikePointerType(pointerType, true) && ignoreMouse) return;\n      if (open && toggle && (dataRef.current.openEvent && stickIfOpen ? dataRef.current.openEvent.type === 'click' : true)) {\n        onOpenChange(false, event.nativeEvent, 'click');\n      } else {\n        onOpenChange(true, event.nativeEvent, 'click');\n      }\n    },\n    onKeyDown(event) {\n      pointerTypeRef.current = undefined;\n      if (event.defaultPrevented || !keyboardHandlers || isButtonTarget(event)) {\n        return;\n      }\n      if (event.key === ' ' && !isSpaceIgnored(domReference)) {\n        // Prevent scrolling\n        event.preventDefault();\n        didKeyDownRef.current = true;\n      }\n      if (isAnchorTarget(event)) {\n        return;\n      }\n      if (event.key === 'Enter') {\n        if (open && toggle) {\n          onOpenChange(false, event.nativeEvent, 'click');\n        } else {\n          onOpenChange(true, event.nativeEvent, 'click');\n        }\n      }\n    },\n    onKeyUp(event) {\n      if (event.defaultPrevented || !keyboardHandlers || isButtonTarget(event) || isSpaceIgnored(domReference)) {\n        return;\n      }\n      if (event.key === ' ' && didKeyDownRef.current) {\n        didKeyDownRef.current = false;\n        if (open && toggle) {\n          onOpenChange(false, event.nativeEvent, 'click');\n        } else {\n          onOpenChange(true, event.nativeEvent, 'click');\n        }\n      }\n    }\n  }), [dataRef, domReference, eventOption, ignoreMouse, keyboardHandlers, onOpenChange, open, stickIfOpen, toggle]);\n  return React.useMemo(() => enabled ? {\n    reference\n  } : {}, [enabled, reference]);\n}\n\nfunction createVirtualElement(domElement, data) {\n  let offsetX = null;\n  let offsetY = null;\n  let isAutoUpdateEvent = false;\n  return {\n    contextElement: domElement || undefined,\n    getBoundingClientRect() {\n      var _data$dataRef$current;\n      const domRect = (domElement == null ? void 0 : domElement.getBoundingClientRect()) || {\n        width: 0,\n        height: 0,\n        x: 0,\n        y: 0\n      };\n      const isXAxis = data.axis === 'x' || data.axis === 'both';\n      const isYAxis = data.axis === 'y' || data.axis === 'both';\n      const canTrackCursorOnAutoUpdate = ['mouseenter', 'mousemove'].includes(((_data$dataRef$current = data.dataRef.current.openEvent) == null ? void 0 : _data$dataRef$current.type) || '') && data.pointerType !== 'touch';\n      let width = domRect.width;\n      let height = domRect.height;\n      let x = domRect.x;\n      let y = domRect.y;\n      if (offsetX == null && data.x && isXAxis) {\n        offsetX = domRect.x - data.x;\n      }\n      if (offsetY == null && data.y && isYAxis) {\n        offsetY = domRect.y - data.y;\n      }\n      x -= offsetX || 0;\n      y -= offsetY || 0;\n      width = 0;\n      height = 0;\n      if (!isAutoUpdateEvent || canTrackCursorOnAutoUpdate) {\n        width = data.axis === 'y' ? domRect.width : 0;\n        height = data.axis === 'x' ? domRect.height : 0;\n        x = isXAxis && data.x != null ? data.x : x;\n        y = isYAxis && data.y != null ? data.y : y;\n      } else if (isAutoUpdateEvent && !canTrackCursorOnAutoUpdate) {\n        height = data.axis === 'x' ? domRect.height : height;\n        width = data.axis === 'y' ? domRect.width : width;\n      }\n      isAutoUpdateEvent = true;\n      return {\n        width,\n        height,\n        x,\n        y,\n        top: y,\n        right: x + width,\n        bottom: y + height,\n        left: x\n      };\n    }\n  };\n}\nfunction isMouseBasedEvent(event) {\n  return event != null && event.clientX != null;\n}\n/**\n * Positions the floating element relative to a client point (in the viewport),\n * such as the mouse position. By default, it follows the mouse cursor.\n * @see https://floating-ui.com/docs/useClientPoint\n */\nfunction useClientPoint(context, props) {\n  if (props === void 0) {\n    props = {};\n  }\n  const {\n    open,\n    dataRef,\n    elements: {\n      floating,\n      domReference\n    },\n    refs\n  } = context;\n  const {\n    enabled = true,\n    axis = 'both',\n    x = null,\n    y = null\n  } = props;\n  const initialRef = React.useRef(false);\n  const cleanupListenerRef = React.useRef(null);\n  const [pointerType, setPointerType] = React.useState();\n  const [reactive, setReactive] = React.useState([]);\n  const setReference = useEffectEvent((x, y) => {\n    if (initialRef.current) return;\n\n    // Prevent setting if the open event was not a mouse-like one\n    // (e.g. focus to open, then hover over the reference element).\n    // Only apply if the event exists.\n    if (dataRef.current.openEvent && !isMouseBasedEvent(dataRef.current.openEvent)) {\n      return;\n    }\n    refs.setPositionReference(createVirtualElement(domReference, {\n      x,\n      y,\n      axis,\n      dataRef,\n      pointerType\n    }));\n  });\n  const handleReferenceEnterOrMove = useEffectEvent(event => {\n    if (x != null || y != null) return;\n    if (!open) {\n      setReference(event.clientX, event.clientY);\n    } else if (!cleanupListenerRef.current) {\n      // If there's no cleanup, there's no listener, but we want to ensure\n      // we add the listener if the cursor landed on the floating element and\n      // then back on the reference (i.e. it's interactive).\n      setReactive([]);\n    }\n  });\n\n  // If the pointer is a mouse-like pointer, we want to continue following the\n  // mouse even if the floating element is transitioning out. On touch\n  // devices, this is undesirable because the floating element will move to\n  // the dismissal touch point.\n  const openCheck = isMouseLikePointerType(pointerType) ? floating : open;\n  const addListener = React.useCallback(() => {\n    // Explicitly specified `x`/`y` coordinates shouldn't add a listener.\n    if (!openCheck || !enabled || x != null || y != null) return;\n    const win = getWindow(floating);\n    function handleMouseMove(event) {\n      const target = getTarget$1(event);\n      if (!contains$1(floating, target)) {\n        setReference(event.clientX, event.clientY);\n      } else {\n        win.removeEventListener('mousemove', handleMouseMove);\n        cleanupListenerRef.current = null;\n      }\n    }\n    if (!dataRef.current.openEvent || isMouseBasedEvent(dataRef.current.openEvent)) {\n      win.addEventListener('mousemove', handleMouseMove);\n      const cleanup = () => {\n        win.removeEventListener('mousemove', handleMouseMove);\n        cleanupListenerRef.current = null;\n      };\n      cleanupListenerRef.current = cleanup;\n      return cleanup;\n    }\n    refs.setPositionReference(domReference);\n  }, [openCheck, enabled, x, y, floating, dataRef, refs, domReference, setReference]);\n  React.useEffect(() => {\n    return addListener();\n  }, [addListener, reactive]);\n  React.useEffect(() => {\n    if (enabled && !floating) {\n      initialRef.current = false;\n    }\n  }, [enabled, floating]);\n  React.useEffect(() => {\n    if (!enabled && open) {\n      initialRef.current = true;\n    }\n  }, [enabled, open]);\n  useModernLayoutEffect(() => {\n    if (enabled && (x != null || y != null)) {\n      initialRef.current = false;\n      setReference(x, y);\n    }\n  }, [enabled, x, y, setReference]);\n  const reference = React.useMemo(() => {\n    function setPointerTypeRef(_ref) {\n      let {\n        pointerType\n      } = _ref;\n      setPointerType(pointerType);\n    }\n    return {\n      onPointerDown: setPointerTypeRef,\n      onPointerEnter: setPointerTypeRef,\n      onMouseMove: handleReferenceEnterOrMove,\n      onMouseEnter: handleReferenceEnterOrMove\n    };\n  }, [handleReferenceEnterOrMove]);\n  return React.useMemo(() => enabled ? {\n    reference\n  } : {}, [enabled, reference]);\n}\n\nconst bubbleHandlerKeys = {\n  pointerdown: 'onPointerDown',\n  mousedown: 'onMouseDown',\n  click: 'onClick'\n};\nconst captureHandlerKeys = {\n  pointerdown: 'onPointerDownCapture',\n  mousedown: 'onMouseDownCapture',\n  click: 'onClickCapture'\n};\nconst normalizeProp = normalizable => {\n  var _normalizable$escapeK, _normalizable$outside;\n  return {\n    escapeKey: typeof normalizable === 'boolean' ? normalizable : (_normalizable$escapeK = normalizable == null ? void 0 : normalizable.escapeKey) != null ? _normalizable$escapeK : false,\n    outsidePress: typeof normalizable === 'boolean' ? normalizable : (_normalizable$outside = normalizable == null ? void 0 : normalizable.outsidePress) != null ? _normalizable$outside : true\n  };\n};\n/**\n * Closes the floating element when a dismissal is requested — by default, when\n * the user presses the `escape` key or outside of the floating element.\n * @see https://floating-ui.com/docs/useDismiss\n */\nfunction useDismiss(context, props) {\n  if (props === void 0) {\n    props = {};\n  }\n  const {\n    open,\n    onOpenChange,\n    elements,\n    dataRef\n  } = context;\n  const {\n    enabled = true,\n    escapeKey = true,\n    outsidePress: unstable_outsidePress = true,\n    outsidePressEvent = 'pointerdown',\n    referencePress = false,\n    referencePressEvent = 'pointerdown',\n    ancestorScroll = false,\n    bubbles,\n    capture\n  } = props;\n  const tree = useFloatingTree();\n  const outsidePressFn = useEffectEvent(typeof unstable_outsidePress === 'function' ? unstable_outsidePress : () => false);\n  const outsidePress = typeof unstable_outsidePress === 'function' ? outsidePressFn : unstable_outsidePress;\n  const endedOrStartedInsideRef = React.useRef(false);\n  const {\n    escapeKey: escapeKeyBubbles,\n    outsidePress: outsidePressBubbles\n  } = normalizeProp(bubbles);\n  const {\n    escapeKey: escapeKeyCapture,\n    outsidePress: outsidePressCapture\n  } = normalizeProp(capture);\n  const isComposingRef = React.useRef(false);\n  const closeOnEscapeKeyDown = useEffectEvent(event => {\n    var _dataRef$current$floa;\n    if (!open || !enabled || !escapeKey || event.key !== 'Escape') {\n      return;\n    }\n\n    // Wait until IME is settled. Pressing `Escape` while composing should\n    // close the compose menu, but not the floating element.\n    if (isComposingRef.current) {\n      return;\n    }\n    const nodeId = (_dataRef$current$floa = dataRef.current.floatingContext) == null ? void 0 : _dataRef$current$floa.nodeId;\n    const children = tree ? getNodeChildren$1(tree.nodesRef.current, nodeId) : [];\n    if (!escapeKeyBubbles) {\n      event.stopPropagation();\n      if (children.length > 0) {\n        let shouldDismiss = true;\n        children.forEach(child => {\n          var _child$context;\n          if ((_child$context = child.context) != null && _child$context.open && !child.context.dataRef.current.__escapeKeyBubbles) {\n            shouldDismiss = false;\n            return;\n          }\n        });\n        if (!shouldDismiss) {\n          return;\n        }\n      }\n    }\n    onOpenChange(false, isReactEvent(event) ? event.nativeEvent : event, 'escape-key');\n  });\n  const closeOnEscapeKeyDownCapture = useEffectEvent(event => {\n    var _getTarget2;\n    const callback = () => {\n      var _getTarget;\n      closeOnEscapeKeyDown(event);\n      (_getTarget = getTarget$1(event)) == null || _getTarget.removeEventListener('keydown', callback);\n    };\n    (_getTarget2 = getTarget$1(event)) == null || _getTarget2.addEventListener('keydown', callback);\n  });\n  const closeOnPressOutside = useEffectEvent(event => {\n    var _dataRef$current$floa2;\n    // Given developers can stop the propagation of the synthetic event,\n    // we can only be confident with a positive value.\n    const insideReactTree = dataRef.current.insideReactTree;\n    dataRef.current.insideReactTree = false;\n\n    // When click outside is lazy (`click` event), handle dragging.\n    // Don't close if:\n    // - The click started inside the floating element.\n    // - The click ended inside the floating element.\n    const endedOrStartedInside = endedOrStartedInsideRef.current;\n    endedOrStartedInsideRef.current = false;\n    if (outsidePressEvent === 'click' && endedOrStartedInside) {\n      return;\n    }\n    if (insideReactTree) {\n      return;\n    }\n    if (typeof outsidePress === 'function' && !outsidePress(event)) {\n      return;\n    }\n    const target = getTarget$1(event);\n    const inertSelector = \"[\" + createAttribute('inert') + \"]\";\n    const markers = getDocument$1(elements.floating).querySelectorAll(inertSelector);\n    let targetRootAncestor = isElement(target) ? target : null;\n    while (targetRootAncestor && !isLastTraversableNode(targetRootAncestor)) {\n      const nextParent = getParentNode(targetRootAncestor);\n      if (isLastTraversableNode(nextParent) || !isElement(nextParent)) {\n        break;\n      }\n      targetRootAncestor = nextParent;\n    }\n\n    // Check if the click occurred on a third-party element injected after the\n    // floating element rendered.\n    if (markers.length && isElement(target) && !isRootElement(target) &&\n    // Clicked on a direct ancestor (e.g. FloatingOverlay).\n    !contains$1(target, elements.floating) &&\n    // If the target root element contains none of the markers, then the\n    // element was injected after the floating element rendered.\n    Array.from(markers).every(marker => !contains$1(targetRootAncestor, marker))) {\n      return;\n    }\n\n    // Check if the click occurred on the scrollbar\n    if (isHTMLElement(target) && floating) {\n      const lastTraversableNode = isLastTraversableNode(target);\n      const style = getComputedStyle(target);\n      const scrollRe = /auto|scroll/;\n      const isScrollableX = lastTraversableNode || scrollRe.test(style.overflowX);\n      const isScrollableY = lastTraversableNode || scrollRe.test(style.overflowY);\n      const canScrollX = isScrollableX && target.clientWidth > 0 && target.scrollWidth > target.clientWidth;\n      const canScrollY = isScrollableY && target.clientHeight > 0 && target.scrollHeight > target.clientHeight;\n      const isRTL = style.direction === 'rtl';\n\n      // Check click position relative to scrollbar.\n      // In some browsers it is possible to change the <body> (or window)\n      // scrollbar to the left side, but is very rare and is difficult to\n      // check for. Plus, for modal dialogs with backdrops, it is more\n      // important that the backdrop is checked but not so much the window.\n      const pressedVerticalScrollbar = canScrollY && (isRTL ? event.offsetX <= target.offsetWidth - target.clientWidth : event.offsetX > target.clientWidth);\n      const pressedHorizontalScrollbar = canScrollX && event.offsetY > target.clientHeight;\n      if (pressedVerticalScrollbar || pressedHorizontalScrollbar) {\n        return;\n      }\n    }\n    const nodeId = (_dataRef$current$floa2 = dataRef.current.floatingContext) == null ? void 0 : _dataRef$current$floa2.nodeId;\n    const targetIsInsideChildren = tree && getNodeChildren$1(tree.nodesRef.current, nodeId).some(node => {\n      var _node$context;\n      return isEventTargetWithin(event, (_node$context = node.context) == null ? void 0 : _node$context.elements.floating);\n    });\n    if (isEventTargetWithin(event, elements.floating) || isEventTargetWithin(event, elements.domReference) || targetIsInsideChildren) {\n      return;\n    }\n    const children = tree ? getNodeChildren$1(tree.nodesRef.current, nodeId) : [];\n    if (children.length > 0) {\n      let shouldDismiss = true;\n      children.forEach(child => {\n        var _child$context2;\n        if ((_child$context2 = child.context) != null && _child$context2.open && !child.context.dataRef.current.__outsidePressBubbles) {\n          shouldDismiss = false;\n          return;\n        }\n      });\n      if (!shouldDismiss) {\n        return;\n      }\n    }\n    onOpenChange(false, event, 'outside-press');\n  });\n  const closeOnPressOutsideCapture = useEffectEvent(event => {\n    var _getTarget4;\n    const callback = () => {\n      var _getTarget3;\n      closeOnPressOutside(event);\n      (_getTarget3 = getTarget$1(event)) == null || _getTarget3.removeEventListener(outsidePressEvent, callback);\n    };\n    (_getTarget4 = getTarget$1(event)) == null || _getTarget4.addEventListener(outsidePressEvent, callback);\n  });\n  React.useEffect(() => {\n    if (!open || !enabled) {\n      return;\n    }\n    dataRef.current.__escapeKeyBubbles = escapeKeyBubbles;\n    dataRef.current.__outsidePressBubbles = outsidePressBubbles;\n    let compositionTimeout = -1;\n    function onScroll(event) {\n      onOpenChange(false, event, 'ancestor-scroll');\n    }\n    function handleCompositionStart() {\n      window.clearTimeout(compositionTimeout);\n      isComposingRef.current = true;\n    }\n    function handleCompositionEnd() {\n      // Safari fires `compositionend` before `keydown`, so we need to wait\n      // until the next tick to set `isComposing` to `false`.\n      // https://bugs.webkit.org/show_bug.cgi?id=165004\n      compositionTimeout = window.setTimeout(() => {\n        isComposingRef.current = false;\n      },\n      // 0ms or 1ms don't work in Safari. 5ms appears to consistently work.\n      // Only apply to WebKit for the test to remain 0ms.\n      isWebKit() ? 5 : 0);\n    }\n    const doc = getDocument$1(elements.floating);\n    if (escapeKey) {\n      doc.addEventListener('keydown', escapeKeyCapture ? closeOnEscapeKeyDownCapture : closeOnEscapeKeyDown, escapeKeyCapture);\n      doc.addEventListener('compositionstart', handleCompositionStart);\n      doc.addEventListener('compositionend', handleCompositionEnd);\n    }\n    outsidePress && doc.addEventListener(outsidePressEvent, outsidePressCapture ? closeOnPressOutsideCapture : closeOnPressOutside, outsidePressCapture);\n    let ancestors = [];\n    if (ancestorScroll) {\n      if (isElement(elements.domReference)) {\n        ancestors = getOverflowAncestors(elements.domReference);\n      }\n      if (isElement(elements.floating)) {\n        ancestors = ancestors.concat(getOverflowAncestors(elements.floating));\n      }\n      if (!isElement(elements.reference) && elements.reference && elements.reference.contextElement) {\n        ancestors = ancestors.concat(getOverflowAncestors(elements.reference.contextElement));\n      }\n    }\n\n    // Ignore the visual viewport for scrolling dismissal (allow pinch-zoom)\n    ancestors = ancestors.filter(ancestor => {\n      var _doc$defaultView;\n      return ancestor !== ((_doc$defaultView = doc.defaultView) == null ? void 0 : _doc$defaultView.visualViewport);\n    });\n    ancestors.forEach(ancestor => {\n      ancestor.addEventListener('scroll', onScroll, {\n        passive: true\n      });\n    });\n    return () => {\n      if (escapeKey) {\n        doc.removeEventListener('keydown', escapeKeyCapture ? closeOnEscapeKeyDownCapture : closeOnEscapeKeyDown, escapeKeyCapture);\n        doc.removeEventListener('compositionstart', handleCompositionStart);\n        doc.removeEventListener('compositionend', handleCompositionEnd);\n      }\n      outsidePress && doc.removeEventListener(outsidePressEvent, outsidePressCapture ? closeOnPressOutsideCapture : closeOnPressOutside, outsidePressCapture);\n      ancestors.forEach(ancestor => {\n        ancestor.removeEventListener('scroll', onScroll);\n      });\n      window.clearTimeout(compositionTimeout);\n    };\n  }, [dataRef, elements, escapeKey, outsidePress, outsidePressEvent, open, onOpenChange, ancestorScroll, enabled, escapeKeyBubbles, outsidePressBubbles, closeOnEscapeKeyDown, escapeKeyCapture, closeOnEscapeKeyDownCapture, closeOnPressOutside, outsidePressCapture, closeOnPressOutsideCapture]);\n  React.useEffect(() => {\n    dataRef.current.insideReactTree = false;\n  }, [dataRef, outsidePress, outsidePressEvent]);\n  const reference = React.useMemo(() => ({\n    onKeyDown: closeOnEscapeKeyDown,\n    ...(referencePress && {\n      [bubbleHandlerKeys[referencePressEvent]]: event => {\n        onOpenChange(false, event.nativeEvent, 'reference-press');\n      },\n      ...(referencePressEvent !== 'click' && {\n        onClick(event) {\n          onOpenChange(false, event.nativeEvent, 'reference-press');\n        }\n      })\n    })\n  }), [closeOnEscapeKeyDown, onOpenChange, referencePress, referencePressEvent]);\n  const floating = React.useMemo(() => ({\n    onKeyDown: closeOnEscapeKeyDown,\n    onMouseDown() {\n      endedOrStartedInsideRef.current = true;\n    },\n    onMouseUp() {\n      endedOrStartedInsideRef.current = true;\n    },\n    [captureHandlerKeys[outsidePressEvent]]: () => {\n      dataRef.current.insideReactTree = true;\n    }\n  }), [closeOnEscapeKeyDown, outsidePressEvent, dataRef]);\n  return React.useMemo(() => enabled ? {\n    reference,\n    floating\n  } : {}, [enabled, reference, floating]);\n}\n\nfunction useFloatingRootContext(options) {\n  const {\n    open = false,\n    onOpenChange: onOpenChangeProp,\n    elements: elementsProp\n  } = options;\n  const floatingId = useId();\n  const dataRef = React.useRef({});\n  const [events] = React.useState(() => createEventEmitter());\n  const nested = useFloatingParentNodeId() != null;\n  if (process.env.NODE_ENV !== \"production\") {\n    const optionDomReference = elementsProp.reference;\n    if (optionDomReference && !isElement(optionDomReference)) {\n      error('Cannot pass a virtual element to the `elements.reference` option,', 'as it must be a real DOM element. Use `refs.setPositionReference()`', 'instead.');\n    }\n  }\n  const [positionReference, setPositionReference] = React.useState(elementsProp.reference);\n  const onOpenChange = useEffectEvent((open, event, reason) => {\n    dataRef.current.openEvent = open ? event : undefined;\n    events.emit('openchange', {\n      open,\n      event,\n      reason,\n      nested\n    });\n    onOpenChangeProp == null || onOpenChangeProp(open, event, reason);\n  });\n  const refs = React.useMemo(() => ({\n    setPositionReference\n  }), []);\n  const elements = React.useMemo(() => ({\n    reference: positionReference || elementsProp.reference || null,\n    floating: elementsProp.floating || null,\n    domReference: elementsProp.reference\n  }), [positionReference, elementsProp.reference, elementsProp.floating]);\n  return React.useMemo(() => ({\n    dataRef,\n    open,\n    onOpenChange,\n    elements,\n    events,\n    floatingId,\n    refs\n  }), [open, onOpenChange, elements, events, floatingId, refs]);\n}\n\n/**\n * Provides data to position a floating element and context to add interactions.\n * @see https://floating-ui.com/docs/useFloating\n */\nfunction useFloating(options) {\n  if (options === void 0) {\n    options = {};\n  }\n  const {\n    nodeId\n  } = options;\n  const internalRootContext = useFloatingRootContext({\n    ...options,\n    elements: {\n      reference: null,\n      floating: null,\n      ...options.elements\n    }\n  });\n  const rootContext = options.rootContext || internalRootContext;\n  const computedElements = rootContext.elements;\n  const [_domReference, setDomReference] = React.useState(null);\n  const [positionReference, _setPositionReference] = React.useState(null);\n  const optionDomReference = computedElements == null ? void 0 : computedElements.domReference;\n  const domReference = optionDomReference || _domReference;\n  const domReferenceRef = React.useRef(null);\n  const tree = useFloatingTree();\n  useModernLayoutEffect(() => {\n    if (domReference) {\n      domReferenceRef.current = domReference;\n    }\n  }, [domReference]);\n  const position = useFloating$1({\n    ...options,\n    elements: {\n      ...computedElements,\n      ...(positionReference && {\n        reference: positionReference\n      })\n    }\n  });\n  const setPositionReference = React.useCallback(node => {\n    const computedPositionReference = isElement(node) ? {\n      getBoundingClientRect: () => node.getBoundingClientRect(),\n      getClientRects: () => node.getClientRects(),\n      contextElement: node\n    } : node;\n    // Store the positionReference in state if the DOM reference is specified externally via the\n    // `elements.reference` option. This ensures that it won't be overridden on future renders.\n    _setPositionReference(computedPositionReference);\n    position.refs.setReference(computedPositionReference);\n  }, [position.refs]);\n  const setReference = React.useCallback(node => {\n    if (isElement(node) || node === null) {\n      domReferenceRef.current = node;\n      setDomReference(node);\n    }\n\n    // Backwards-compatibility for passing a virtual element to `reference`\n    // after it has set the DOM reference.\n    if (isElement(position.refs.reference.current) || position.refs.reference.current === null ||\n    // Don't allow setting virtual elements using the old technique back to\n    // `null` to support `positionReference` + an unstable `reference`\n    // callback ref.\n    node !== null && !isElement(node)) {\n      position.refs.setReference(node);\n    }\n  }, [position.refs]);\n  const refs = React.useMemo(() => ({\n    ...position.refs,\n    setReference,\n    setPositionReference,\n    domReference: domReferenceRef\n  }), [position.refs, setReference, setPositionReference]);\n  const elements = React.useMemo(() => ({\n    ...position.elements,\n    domReference: domReference\n  }), [position.elements, domReference]);\n  const context = React.useMemo(() => ({\n    ...position,\n    ...rootContext,\n    refs,\n    elements,\n    nodeId\n  }), [position, refs, elements, nodeId, rootContext]);\n  useModernLayoutEffect(() => {\n    rootContext.dataRef.current.floatingContext = context;\n    const node = tree == null ? void 0 : tree.nodesRef.current.find(node => node.id === nodeId);\n    if (node) {\n      node.context = context;\n    }\n  });\n  return React.useMemo(() => ({\n    ...position,\n    context,\n    refs,\n    elements\n  }), [position, refs, elements, context]);\n}\n\nfunction isMacSafari() {\n  return isMac() && isSafari();\n}\n/**\n * Opens the floating element while the reference element has focus, like CSS\n * `:focus`.\n * @see https://floating-ui.com/docs/useFocus\n */\nfunction useFocus(context, props) {\n  if (props === void 0) {\n    props = {};\n  }\n  const {\n    open,\n    onOpenChange,\n    events,\n    dataRef,\n    elements\n  } = context;\n  const {\n    enabled = true,\n    visibleOnly = true\n  } = props;\n  const blockFocusRef = React.useRef(false);\n  const timeoutRef = React.useRef(-1);\n  const keyboardModalityRef = React.useRef(true);\n  React.useEffect(() => {\n    if (!enabled) return;\n    const win = getWindow(elements.domReference);\n\n    // If the reference was focused and the user left the tab/window, and the\n    // floating element was not open, the focus should be blocked when they\n    // return to the tab/window.\n    function onBlur() {\n      if (!open && isHTMLElement(elements.domReference) && elements.domReference === activeElement(getDocument$1(elements.domReference))) {\n        blockFocusRef.current = true;\n      }\n    }\n    function onKeyDown() {\n      keyboardModalityRef.current = true;\n    }\n    function onPointerDown() {\n      keyboardModalityRef.current = false;\n    }\n    win.addEventListener('blur', onBlur);\n    if (isMacSafari()) {\n      win.addEventListener('keydown', onKeyDown, true);\n      win.addEventListener('pointerdown', onPointerDown, true);\n    }\n    return () => {\n      win.removeEventListener('blur', onBlur);\n      if (isMacSafari()) {\n        win.removeEventListener('keydown', onKeyDown, true);\n        win.removeEventListener('pointerdown', onPointerDown, true);\n      }\n    };\n  }, [elements.domReference, open, enabled]);\n  React.useEffect(() => {\n    if (!enabled) return;\n    function onOpenChange(_ref) {\n      let {\n        reason\n      } = _ref;\n      if (reason === 'reference-press' || reason === 'escape-key') {\n        blockFocusRef.current = true;\n      }\n    }\n    events.on('openchange', onOpenChange);\n    return () => {\n      events.off('openchange', onOpenChange);\n    };\n  }, [events, enabled]);\n  React.useEffect(() => {\n    return () => {\n      clearTimeoutIfSet(timeoutRef);\n    };\n  }, []);\n  const reference = React.useMemo(() => ({\n    onMouseLeave() {\n      blockFocusRef.current = false;\n    },\n    onFocus(event) {\n      if (blockFocusRef.current) return;\n      const target = getTarget$1(event.nativeEvent);\n      if (visibleOnly && isElement(target)) {\n        // Safari fails to match `:focus-visible` if focus was initially\n        // outside the document.\n        if (isMacSafari() && !event.relatedTarget) {\n          if (!keyboardModalityRef.current && !isTypeableElement(target)) {\n            return;\n          }\n        } else if (!matchesFocusVisible(target)) {\n          return;\n        }\n      }\n      onOpenChange(true, event.nativeEvent, 'focus');\n    },\n    onBlur(event) {\n      blockFocusRef.current = false;\n      const relatedTarget = event.relatedTarget;\n      const nativeEvent = event.nativeEvent;\n\n      // Hit the non-modal focus management portal guard. Focus will be\n      // moved into the floating element immediately after.\n      const movedToFocusGuard = isElement(relatedTarget) && relatedTarget.hasAttribute(createAttribute('focus-guard')) && relatedTarget.getAttribute('data-type') === 'outside';\n\n      // Wait for the window blur listener to fire.\n      timeoutRef.current = window.setTimeout(() => {\n        var _dataRef$current$floa;\n        const activeEl = activeElement(elements.domReference ? elements.domReference.ownerDocument : document);\n\n        // Focus left the page, keep it open.\n        if (!relatedTarget && activeEl === elements.domReference) return;\n\n        // When focusing the reference element (e.g. regular click), then\n        // clicking into the floating element, prevent it from hiding.\n        // Note: it must be focusable, e.g. `tabindex=\"-1\"`.\n        // We can not rely on relatedTarget to point to the correct element\n        // as it will only point to the shadow host of the newly focused element\n        // and not the element that actually has received focus if it is located\n        // inside a shadow root.\n        if (contains$1((_dataRef$current$floa = dataRef.current.floatingContext) == null ? void 0 : _dataRef$current$floa.refs.floating.current, activeEl) || contains$1(elements.domReference, activeEl) || movedToFocusGuard) {\n          return;\n        }\n        onOpenChange(false, nativeEvent, 'focus');\n      });\n    }\n  }), [dataRef, elements.domReference, onOpenChange, visibleOnly]);\n  return React.useMemo(() => enabled ? {\n    reference\n  } : {}, [enabled, reference]);\n}\n\nfunction mergeProps(userProps, propsList, elementKey) {\n  const map = new Map();\n  const isItem = elementKey === 'item';\n  let domUserProps = userProps;\n  if (isItem && userProps) {\n    const {\n      [ACTIVE_KEY]: _,\n      [SELECTED_KEY]: __,\n      ...validProps\n    } = userProps;\n    domUserProps = validProps;\n  }\n  return {\n    ...(elementKey === 'floating' && {\n      tabIndex: -1,\n      [FOCUSABLE_ATTRIBUTE]: ''\n    }),\n    ...domUserProps,\n    ...propsList.map(value => {\n      const propsOrGetProps = value ? value[elementKey] : null;\n      if (typeof propsOrGetProps === 'function') {\n        return userProps ? propsOrGetProps(userProps) : null;\n      }\n      return propsOrGetProps;\n    }).concat(userProps).reduce((acc, props) => {\n      if (!props) {\n        return acc;\n      }\n      Object.entries(props).forEach(_ref => {\n        let [key, value] = _ref;\n        if (isItem && [ACTIVE_KEY, SELECTED_KEY].includes(key)) {\n          return;\n        }\n        if (key.indexOf('on') === 0) {\n          if (!map.has(key)) {\n            map.set(key, []);\n          }\n          if (typeof value === 'function') {\n            var _map$get;\n            (_map$get = map.get(key)) == null || _map$get.push(value);\n            acc[key] = function () {\n              var _map$get2;\n              for (var _len = arguments.length, args = new Array(_len), _key = 0; _key < _len; _key++) {\n                args[_key] = arguments[_key];\n              }\n              return (_map$get2 = map.get(key)) == null ? void 0 : _map$get2.map(fn => fn(...args)).find(val => val !== undefined);\n            };\n          }\n        } else {\n          acc[key] = value;\n        }\n      });\n      return acc;\n    }, {})\n  };\n}\n/**\n * Merges an array of interaction hooks' props into prop getters, allowing\n * event handler functions to be composed together without overwriting one\n * another.\n * @see https://floating-ui.com/docs/useInteractions\n */\nfunction useInteractions(propsList) {\n  if (propsList === void 0) {\n    propsList = [];\n  }\n  const referenceDeps = propsList.map(key => key == null ? void 0 : key.reference);\n  const floatingDeps = propsList.map(key => key == null ? void 0 : key.floating);\n  const itemDeps = propsList.map(key => key == null ? void 0 : key.item);\n  const getReferenceProps = React.useCallback(userProps => mergeProps(userProps, propsList, 'reference'),\n  // eslint-disable-next-line react-hooks/exhaustive-deps\n  referenceDeps);\n  const getFloatingProps = React.useCallback(userProps => mergeProps(userProps, propsList, 'floating'),\n  // eslint-disable-next-line react-hooks/exhaustive-deps\n  floatingDeps);\n  const getItemProps = React.useCallback(userProps => mergeProps(userProps, propsList, 'item'),\n  // eslint-disable-next-line react-hooks/exhaustive-deps\n  itemDeps);\n  return React.useMemo(() => ({\n    getReferenceProps,\n    getFloatingProps,\n    getItemProps\n  }), [getReferenceProps, getFloatingProps, getItemProps]);\n}\n\nconst ESCAPE = 'Escape';\nfunction doSwitch(orientation, vertical, horizontal) {\n  switch (orientation) {\n    case 'vertical':\n      return vertical;\n    case 'horizontal':\n      return horizontal;\n    default:\n      return vertical || horizontal;\n  }\n}\nfunction isMainOrientationKey(key, orientation) {\n  const vertical = key === ARROW_UP || key === ARROW_DOWN;\n  const horizontal = key === ARROW_LEFT || key === ARROW_RIGHT;\n  return doSwitch(orientation, vertical, horizontal);\n}\nfunction isMainOrientationToEndKey(key, orientation, rtl) {\n  const vertical = key === ARROW_DOWN;\n  const horizontal = rtl ? key === ARROW_LEFT : key === ARROW_RIGHT;\n  return doSwitch(orientation, vertical, horizontal) || key === 'Enter' || key === ' ' || key === '';\n}\nfunction isCrossOrientationOpenKey(key, orientation, rtl) {\n  const vertical = rtl ? key === ARROW_LEFT : key === ARROW_RIGHT;\n  const horizontal = key === ARROW_DOWN;\n  return doSwitch(orientation, vertical, horizontal);\n}\nfunction isCrossOrientationCloseKey(key, orientation, rtl, cols) {\n  const vertical = rtl ? key === ARROW_RIGHT : key === ARROW_LEFT;\n  const horizontal = key === ARROW_UP;\n  if (orientation === 'both' || orientation === 'horizontal' && cols && cols > 1) {\n    return key === ESCAPE;\n  }\n  return doSwitch(orientation, vertical, horizontal);\n}\n/**\n * Adds arrow key-based navigation of a list of items, either using real DOM\n * focus or virtual focus.\n * @see https://floating-ui.com/docs/useListNavigation\n */\nfunction useListNavigation(context, props) {\n  const {\n    open,\n    onOpenChange,\n    elements,\n    floatingId\n  } = context;\n  const {\n    listRef,\n    activeIndex,\n    onNavigate: unstable_onNavigate = () => {},\n    enabled = true,\n    selectedIndex = null,\n    allowEscape = false,\n    loop = false,\n    nested = false,\n    rtl = false,\n    virtual = false,\n    focusItemOnOpen = 'auto',\n    focusItemOnHover = true,\n    openOnArrowKeyDown = true,\n    disabledIndices = undefined,\n    orientation = 'vertical',\n    parentOrientation,\n    cols = 1,\n    scrollItemIntoView = true,\n    virtualItemRef,\n    itemSizes,\n    dense = false\n  } = props;\n  if (process.env.NODE_ENV !== \"production\") {\n    if (allowEscape) {\n      if (!loop) {\n        warn('`useListNavigation` looping must be enabled to allow escaping.');\n      }\n      if (!virtual) {\n        warn('`useListNavigation` must be virtual to allow escaping.');\n      }\n    }\n    if (orientation === 'vertical' && cols > 1) {\n      warn('In grid list navigation mode (`cols` > 1), the `orientation` should', 'be either \"horizontal\" or \"both\".');\n    }\n  }\n  const floatingFocusElement = getFloatingFocusElement(elements.floating);\n  const floatingFocusElementRef = useLatestRef(floatingFocusElement);\n  const parentId = useFloatingParentNodeId();\n  const tree = useFloatingTree();\n  useModernLayoutEffect(() => {\n    context.dataRef.current.orientation = orientation;\n  }, [context, orientation]);\n  const onNavigate = useEffectEvent(() => {\n    unstable_onNavigate(indexRef.current === -1 ? null : indexRef.current);\n  });\n  const typeableComboboxReference = isTypeableCombobox(elements.domReference);\n  const focusItemOnOpenRef = React.useRef(focusItemOnOpen);\n  const indexRef = React.useRef(selectedIndex != null ? selectedIndex : -1);\n  const keyRef = React.useRef(null);\n  const isPointerModalityRef = React.useRef(true);\n  const previousOnNavigateRef = React.useRef(onNavigate);\n  const previousMountedRef = React.useRef(!!elements.floating);\n  const previousOpenRef = React.useRef(open);\n  const forceSyncFocusRef = React.useRef(false);\n  const forceScrollIntoViewRef = React.useRef(false);\n  const disabledIndicesRef = useLatestRef(disabledIndices);\n  const latestOpenRef = useLatestRef(open);\n  const scrollItemIntoViewRef = useLatestRef(scrollItemIntoView);\n  const selectedIndexRef = useLatestRef(selectedIndex);\n  const [activeId, setActiveId] = React.useState();\n  const [virtualId, setVirtualId] = React.useState();\n  const focusItem = useEffectEvent(() => {\n    function runFocus(item) {\n      if (virtual) {\n        var _item$id;\n        if ((_item$id = item.id) != null && _item$id.endsWith('-fui-option')) {\n          item.id = floatingId + \"-\" + Math.random().toString(16).slice(2, 10);\n        }\n        setActiveId(item.id);\n        tree == null || tree.events.emit('virtualfocus', item);\n        if (virtualItemRef) {\n          virtualItemRef.current = item;\n        }\n      } else {\n        enqueueFocus(item, {\n          sync: forceSyncFocusRef.current,\n          preventScroll: true\n        });\n      }\n    }\n    const initialItem = listRef.current[indexRef.current];\n    const forceScrollIntoView = forceScrollIntoViewRef.current;\n    if (initialItem) {\n      runFocus(initialItem);\n    }\n    const scheduler = forceSyncFocusRef.current ? v => v() : requestAnimationFrame;\n    scheduler(() => {\n      const waitedItem = listRef.current[indexRef.current] || initialItem;\n      if (!waitedItem) return;\n      if (!initialItem) {\n        runFocus(waitedItem);\n      }\n      const scrollIntoViewOptions = scrollItemIntoViewRef.current;\n      const shouldScrollIntoView = scrollIntoViewOptions && item && (forceScrollIntoView || !isPointerModalityRef.current);\n      if (shouldScrollIntoView) {\n        // JSDOM doesn't support `.scrollIntoView()` but it's widely supported\n        // by all browsers.\n        waitedItem.scrollIntoView == null || waitedItem.scrollIntoView(typeof scrollIntoViewOptions === 'boolean' ? {\n          block: 'nearest',\n          inline: 'nearest'\n        } : scrollIntoViewOptions);\n      }\n    });\n  });\n\n  // Sync `selectedIndex` to be the `activeIndex` upon opening the floating\n  // element. Also, reset `activeIndex` upon closing the floating element.\n  useModernLayoutEffect(() => {\n    if (!enabled) return;\n    if (open && elements.floating) {\n      if (focusItemOnOpenRef.current && selectedIndex != null) {\n        // Regardless of the pointer modality, we want to ensure the selected\n        // item comes into view when the floating element is opened.\n        forceScrollIntoViewRef.current = true;\n        indexRef.current = selectedIndex;\n        onNavigate();\n      }\n    } else if (previousMountedRef.current) {\n      // Since the user can specify `onNavigate` conditionally\n      // (onNavigate: open ? setActiveIndex : setSelectedIndex),\n      // we store and call the previous function.\n      indexRef.current = -1;\n      previousOnNavigateRef.current();\n    }\n  }, [enabled, open, elements.floating, selectedIndex, onNavigate]);\n\n  // Sync `activeIndex` to be the focused item while the floating element is\n  // open.\n  useModernLayoutEffect(() => {\n    if (!enabled) return;\n    if (!open) return;\n    if (!elements.floating) return;\n    if (activeIndex == null) {\n      forceSyncFocusRef.current = false;\n      if (selectedIndexRef.current != null) {\n        return;\n      }\n\n      // Reset while the floating element was open (e.g. the list changed).\n      if (previousMountedRef.current) {\n        indexRef.current = -1;\n        focusItem();\n      }\n\n      // Initial sync.\n      if ((!previousOpenRef.current || !previousMountedRef.current) && focusItemOnOpenRef.current && (keyRef.current != null || focusItemOnOpenRef.current === true && keyRef.current == null)) {\n        let runs = 0;\n        const waitForListPopulated = () => {\n          if (listRef.current[0] == null) {\n            // Avoid letting the browser paint if possible on the first try,\n            // otherwise use rAF. Don't try more than twice, since something\n            // is wrong otherwise.\n            if (runs < 2) {\n              const scheduler = runs ? requestAnimationFrame : queueMicrotask;\n              scheduler(waitForListPopulated);\n            }\n            runs++;\n          } else {\n            indexRef.current = keyRef.current == null || isMainOrientationToEndKey(keyRef.current, orientation, rtl) || nested ? getMinListIndex(listRef, disabledIndicesRef.current) : getMaxListIndex(listRef, disabledIndicesRef.current);\n            keyRef.current = null;\n            onNavigate();\n          }\n        };\n        waitForListPopulated();\n      }\n    } else if (!isIndexOutOfListBounds(listRef, activeIndex)) {\n      indexRef.current = activeIndex;\n      focusItem();\n      forceScrollIntoViewRef.current = false;\n    }\n  }, [enabled, open, elements.floating, activeIndex, selectedIndexRef, nested, listRef, orientation, rtl, onNavigate, focusItem, disabledIndicesRef]);\n\n  // Ensure the parent floating element has focus when a nested child closes\n  // to allow arrow key navigation to work after the pointer leaves the child.\n  useModernLayoutEffect(() => {\n    var _nodes$find;\n    if (!enabled || elements.floating || !tree || virtual || !previousMountedRef.current) {\n      return;\n    }\n    const nodes = tree.nodesRef.current;\n    const parent = (_nodes$find = nodes.find(node => node.id === parentId)) == null || (_nodes$find = _nodes$find.context) == null ? void 0 : _nodes$find.elements.floating;\n    const activeEl = activeElement(getDocument$1(elements.floating));\n    const treeContainsActiveEl = nodes.some(node => node.context && contains$1(node.context.elements.floating, activeEl));\n    if (parent && !treeContainsActiveEl && isPointerModalityRef.current) {\n      parent.focus({\n        preventScroll: true\n      });\n    }\n  }, [enabled, elements.floating, tree, parentId, virtual]);\n  useModernLayoutEffect(() => {\n    if (!enabled) return;\n    if (!tree) return;\n    if (!virtual) return;\n    if (parentId) return;\n    function handleVirtualFocus(item) {\n      setVirtualId(item.id);\n      if (virtualItemRef) {\n        virtualItemRef.current = item;\n      }\n    }\n    tree.events.on('virtualfocus', handleVirtualFocus);\n    return () => {\n      tree.events.off('virtualfocus', handleVirtualFocus);\n    };\n  }, [enabled, tree, virtual, parentId, virtualItemRef]);\n  useModernLayoutEffect(() => {\n    previousOnNavigateRef.current = onNavigate;\n    previousOpenRef.current = open;\n    previousMountedRef.current = !!elements.floating;\n  });\n  useModernLayoutEffect(() => {\n    if (!open) {\n      keyRef.current = null;\n      focusItemOnOpenRef.current = focusItemOnOpen;\n    }\n  }, [open, focusItemOnOpen]);\n  const hasActiveIndex = activeIndex != null;\n  const item = React.useMemo(() => {\n    function syncCurrentTarget(currentTarget) {\n      if (!latestOpenRef.current) return;\n      const index = listRef.current.indexOf(currentTarget);\n      if (index !== -1 && indexRef.current !== index) {\n        indexRef.current = index;\n        onNavigate();\n      }\n    }\n    const props = {\n      onFocus(_ref) {\n        let {\n          currentTarget\n        } = _ref;\n        forceSyncFocusRef.current = true;\n        syncCurrentTarget(currentTarget);\n      },\n      onClick: _ref2 => {\n        let {\n          currentTarget\n        } = _ref2;\n        return currentTarget.focus({\n          preventScroll: true\n        });\n      },\n      // Safari\n      onMouseMove(_ref3) {\n        let {\n          currentTarget\n        } = _ref3;\n        forceSyncFocusRef.current = true;\n        forceScrollIntoViewRef.current = false;\n        if (focusItemOnHover) {\n          syncCurrentTarget(currentTarget);\n        }\n      },\n      onPointerLeave(_ref4) {\n        let {\n          pointerType\n        } = _ref4;\n        if (!isPointerModalityRef.current || pointerType === 'touch') {\n          return;\n        }\n        forceSyncFocusRef.current = true;\n        if (!focusItemOnHover) {\n          return;\n        }\n        indexRef.current = -1;\n        onNavigate();\n        if (!virtual) {\n          var _floatingFocusElement;\n          (_floatingFocusElement = floatingFocusElementRef.current) == null || _floatingFocusElement.focus({\n            preventScroll: true\n          });\n        }\n      }\n    };\n    return props;\n  }, [latestOpenRef, floatingFocusElementRef, focusItemOnHover, listRef, onNavigate, virtual]);\n  const getParentOrientation = React.useCallback(() => {\n    var _tree$nodesRef$curren;\n    return parentOrientation != null ? parentOrientation : tree == null || (_tree$nodesRef$curren = tree.nodesRef.current.find(node => node.id === parentId)) == null || (_tree$nodesRef$curren = _tree$nodesRef$curren.context) == null || (_tree$nodesRef$curren = _tree$nodesRef$curren.dataRef) == null ? void 0 : _tree$nodesRef$curren.current.orientation;\n  }, [parentId, tree, parentOrientation]);\n  const commonOnKeyDown = useEffectEvent(event => {\n    isPointerModalityRef.current = false;\n    forceSyncFocusRef.current = true;\n\n    // When composing a character, Chrome fires ArrowDown twice. Firefox/Safari\n    // don't appear to suffer from this. `event.isComposing` is avoided due to\n    // Safari not supporting it properly (although it's not needed in the first\n    // place for Safari, just avoiding any possible issues).\n    if (event.which === 229) {\n      return;\n    }\n\n    // If the floating element is animating out, ignore navigation. Otherwise,\n    // the `activeIndex` gets set to 0 despite not being open so the next time\n    // the user ArrowDowns, the first item won't be focused.\n    if (!latestOpenRef.current && event.currentTarget === floatingFocusElementRef.current) {\n      return;\n    }\n    if (nested && isCrossOrientationCloseKey(event.key, orientation, rtl, cols)) {\n      // If the nested list's close key is also the parent navigation key,\n      // let the parent navigate. Otherwise, stop propagating the event.\n      if (!isMainOrientationKey(event.key, getParentOrientation())) {\n        stopEvent(event);\n      }\n      onOpenChange(false, event.nativeEvent, 'list-navigation');\n      if (isHTMLElement(elements.domReference)) {\n        if (virtual) {\n          tree == null || tree.events.emit('virtualfocus', elements.domReference);\n        } else {\n          elements.domReference.focus();\n        }\n      }\n      return;\n    }\n    const currentIndex = indexRef.current;\n    const minIndex = getMinListIndex(listRef, disabledIndices);\n    const maxIndex = getMaxListIndex(listRef, disabledIndices);\n    if (!typeableComboboxReference) {\n      if (event.key === 'Home') {\n        stopEvent(event);\n        indexRef.current = minIndex;\n        onNavigate();\n      }\n      if (event.key === 'End') {\n        stopEvent(event);\n        indexRef.current = maxIndex;\n        onNavigate();\n      }\n    }\n\n    // Grid navigation.\n    if (cols > 1) {\n      const sizes = itemSizes || Array.from({\n        length: listRef.current.length\n      }, () => ({\n        width: 1,\n        height: 1\n      }));\n      // To calculate movements on the grid, we use hypothetical cell indices\n      // as if every item was 1x1, then convert back to real indices.\n      const cellMap = createGridCellMap(sizes, cols, dense);\n      const minGridIndex = cellMap.findIndex(index => index != null && !isListIndexDisabled(listRef, index, disabledIndices));\n      // last enabled index\n      const maxGridIndex = cellMap.reduce((foundIndex, index, cellIndex) => index != null && !isListIndexDisabled(listRef, index, disabledIndices) ? cellIndex : foundIndex, -1);\n      const index = cellMap[getGridNavigatedIndex({\n        current: cellMap.map(itemIndex => itemIndex != null ? listRef.current[itemIndex] : null)\n      }, {\n        event,\n        orientation,\n        loop,\n        rtl,\n        cols,\n        // treat undefined (empty grid spaces) as disabled indices so we\n        // don't end up in them\n        disabledIndices: getGridCellIndices([...((typeof disabledIndices !== 'function' ? disabledIndices : null) || listRef.current.map((_, index) => isListIndexDisabled(listRef, index, disabledIndices) ? index : undefined)), undefined], cellMap),\n        minIndex: minGridIndex,\n        maxIndex: maxGridIndex,\n        prevIndex: getGridCellIndexOfCorner(indexRef.current > maxIndex ? minIndex : indexRef.current, sizes, cellMap, cols,\n        // use a corner matching the edge closest to the direction\n        // we're moving in so we don't end up in the same item. Prefer\n        // top/left over bottom/right.\n        event.key === ARROW_DOWN ? 'bl' : event.key === (rtl ? ARROW_LEFT : ARROW_RIGHT) ? 'tr' : 'tl'),\n        stopEvent: true\n      })];\n      if (index != null) {\n        indexRef.current = index;\n        onNavigate();\n      }\n      if (orientation === 'both') {\n        return;\n      }\n    }\n    if (isMainOrientationKey(event.key, orientation)) {\n      stopEvent(event);\n\n      // Reset the index if no item is focused.\n      if (open && !virtual && activeElement(event.currentTarget.ownerDocument) === event.currentTarget) {\n        indexRef.current = isMainOrientationToEndKey(event.key, orientation, rtl) ? minIndex : maxIndex;\n        onNavigate();\n        return;\n      }\n      if (isMainOrientationToEndKey(event.key, orientation, rtl)) {\n        if (loop) {\n          indexRef.current = currentIndex >= maxIndex ? allowEscape && currentIndex !== listRef.current.length ? -1 : minIndex : findNonDisabledListIndex(listRef, {\n            startingIndex: currentIndex,\n            disabledIndices\n          });\n        } else {\n          indexRef.current = Math.min(maxIndex, findNonDisabledListIndex(listRef, {\n            startingIndex: currentIndex,\n            disabledIndices\n          }));\n        }\n      } else {\n        if (loop) {\n          indexRef.current = currentIndex <= minIndex ? allowEscape && currentIndex !== -1 ? listRef.current.length : maxIndex : findNonDisabledListIndex(listRef, {\n            startingIndex: currentIndex,\n            decrement: true,\n            disabledIndices\n          });\n        } else {\n          indexRef.current = Math.max(minIndex, findNonDisabledListIndex(listRef, {\n            startingIndex: currentIndex,\n            decrement: true,\n            disabledIndices\n          }));\n        }\n      }\n      if (isIndexOutOfListBounds(listRef, indexRef.current)) {\n        indexRef.current = -1;\n      }\n      onNavigate();\n    }\n  });\n  const ariaActiveDescendantProp = React.useMemo(() => {\n    return virtual && open && hasActiveIndex && {\n      'aria-activedescendant': virtualId || activeId\n    };\n  }, [virtual, open, hasActiveIndex, virtualId, activeId]);\n  const floating = React.useMemo(() => {\n    return {\n      'aria-orientation': orientation === 'both' ? undefined : orientation,\n      ...(!typeableComboboxReference ? ariaActiveDescendantProp : {}),\n      onKeyDown: commonOnKeyDown,\n      onPointerMove() {\n        isPointerModalityRef.current = true;\n      }\n    };\n  }, [ariaActiveDescendantProp, commonOnKeyDown, orientation, typeableComboboxReference]);\n  const reference = React.useMemo(() => {\n    function checkVirtualMouse(event) {\n      if (focusItemOnOpen === 'auto' && isVirtualClick(event.nativeEvent)) {\n        focusItemOnOpenRef.current = true;\n      }\n    }\n    function checkVirtualPointer(event) {\n      // `pointerdown` fires first, reset the state then perform the checks.\n      focusItemOnOpenRef.current = focusItemOnOpen;\n      if (focusItemOnOpen === 'auto' && isVirtualPointerEvent(event.nativeEvent)) {\n        focusItemOnOpenRef.current = true;\n      }\n    }\n    return {\n      ...ariaActiveDescendantProp,\n      onKeyDown(event) {\n        isPointerModalityRef.current = false;\n        const isArrowKey = event.key.startsWith('Arrow');\n        const isHomeOrEndKey = ['Home', 'End'].includes(event.key);\n        const isMoveKey = isArrowKey || isHomeOrEndKey;\n        const isCrossOpenKey = isCrossOrientationOpenKey(event.key, orientation, rtl);\n        const isCrossCloseKey = isCrossOrientationCloseKey(event.key, orientation, rtl, cols);\n        const isParentCrossOpenKey = isCrossOrientationOpenKey(event.key, getParentOrientation(), rtl);\n        const isMainKey = isMainOrientationKey(event.key, orientation);\n        const isNavigationKey = (nested ? isParentCrossOpenKey : isMainKey) || event.key === 'Enter' || event.key.trim() === '';\n        if (virtual && open) {\n          const rootNode = tree == null ? void 0 : tree.nodesRef.current.find(node => node.parentId == null);\n          const deepestNode = tree && rootNode ? getDeepestNode(tree.nodesRef.current, rootNode.id) : null;\n          if (isMoveKey && deepestNode && virtualItemRef) {\n            const eventObject = new KeyboardEvent('keydown', {\n              key: event.key,\n              bubbles: true\n            });\n            if (isCrossOpenKey || isCrossCloseKey) {\n              var _deepestNode$context, _deepestNode$context2;\n              const isCurrentTarget = ((_deepestNode$context = deepestNode.context) == null ? void 0 : _deepestNode$context.elements.domReference) === event.currentTarget;\n              const dispatchItem = isCrossCloseKey && !isCurrentTarget ? (_deepestNode$context2 = deepestNode.context) == null ? void 0 : _deepestNode$context2.elements.domReference : isCrossOpenKey ? listRef.current.find(item => (item == null ? void 0 : item.id) === activeId) : null;\n              if (dispatchItem) {\n                stopEvent(event);\n                dispatchItem.dispatchEvent(eventObject);\n                setVirtualId(undefined);\n              }\n            }\n            if ((isMainKey || isHomeOrEndKey) && deepestNode.context) {\n              if (deepestNode.context.open && deepestNode.parentId && event.currentTarget !== deepestNode.context.elements.domReference) {\n                var _deepestNode$context$;\n                stopEvent(event);\n                (_deepestNode$context$ = deepestNode.context.elements.domReference) == null || _deepestNode$context$.dispatchEvent(eventObject);\n                return;\n              }\n            }\n          }\n          return commonOnKeyDown(event);\n        }\n        // If a floating element should not open on arrow key down, avoid\n        // setting `activeIndex` while it's closed.\n        if (!open && !openOnArrowKeyDown && isArrowKey) {\n          return;\n        }\n        if (isNavigationKey) {\n          const isParentMainKey = isMainOrientationKey(event.key, getParentOrientation());\n          keyRef.current = nested && isParentMainKey ? null : event.key;\n        }\n        if (nested) {\n          if (isParentCrossOpenKey) {\n            stopEvent(event);\n            if (open) {\n              indexRef.current = getMinListIndex(listRef, disabledIndicesRef.current);\n              onNavigate();\n            } else {\n              onOpenChange(true, event.nativeEvent, 'list-navigation');\n            }\n          }\n          return;\n        }\n        if (isMainKey) {\n          if (selectedIndex != null) {\n            indexRef.current = selectedIndex;\n          }\n          stopEvent(event);\n          if (!open && openOnArrowKeyDown) {\n            onOpenChange(true, event.nativeEvent, 'list-navigation');\n          } else {\n            commonOnKeyDown(event);\n          }\n          if (open) {\n            onNavigate();\n          }\n        }\n      },\n      onFocus() {\n        if (open && !virtual) {\n          indexRef.current = -1;\n          onNavigate();\n        }\n      },\n      onPointerDown: checkVirtualPointer,\n      onPointerEnter: checkVirtualPointer,\n      onMouseDown: checkVirtualMouse,\n      onClick: checkVirtualMouse\n    };\n  }, [activeId, ariaActiveDescendantProp, cols, commonOnKeyDown, disabledIndicesRef, focusItemOnOpen, listRef, nested, onNavigate, onOpenChange, open, openOnArrowKeyDown, orientation, getParentOrientation, rtl, selectedIndex, tree, virtual, virtualItemRef]);\n  return React.useMemo(() => enabled ? {\n    reference,\n    floating,\n    item\n  } : {}, [enabled, reference, floating, item]);\n}\n\nconst componentRoleToAriaRoleMap = /*#__PURE__*/new Map([['select', 'listbox'], ['combobox', 'listbox'], ['label', false]]);\n\n/**\n * Adds base screen reader props to the reference and floating elements for a\n * given floating element `role`.\n * @see https://floating-ui.com/docs/useRole\n */\nfunction useRole(context, props) {\n  var _elements$domReferenc, _componentRoleToAriaR;\n  if (props === void 0) {\n    props = {};\n  }\n  const {\n    open,\n    elements,\n    floatingId: defaultFloatingId\n  } = context;\n  const {\n    enabled = true,\n    role = 'dialog'\n  } = props;\n  const defaultReferenceId = useId();\n  const referenceId = ((_elements$domReferenc = elements.domReference) == null ? void 0 : _elements$domReferenc.id) || defaultReferenceId;\n  const floatingId = React.useMemo(() => {\n    var _getFloatingFocusElem;\n    return ((_getFloatingFocusElem = getFloatingFocusElement(elements.floating)) == null ? void 0 : _getFloatingFocusElem.id) || defaultFloatingId;\n  }, [elements.floating, defaultFloatingId]);\n  const ariaRole = (_componentRoleToAriaR = componentRoleToAriaRoleMap.get(role)) != null ? _componentRoleToAriaR : role;\n  const parentId = useFloatingParentNodeId();\n  const isNested = parentId != null;\n  const reference = React.useMemo(() => {\n    if (ariaRole === 'tooltip' || role === 'label') {\n      return {\n        [\"aria-\" + (role === 'label' ? 'labelledby' : 'describedby')]: open ? floatingId : undefined\n      };\n    }\n    return {\n      'aria-expanded': open ? 'true' : 'false',\n      'aria-haspopup': ariaRole === 'alertdialog' ? 'dialog' : ariaRole,\n      'aria-controls': open ? floatingId : undefined,\n      ...(ariaRole === 'listbox' && {\n        role: 'combobox'\n      }),\n      ...(ariaRole === 'menu' && {\n        id: referenceId\n      }),\n      ...(ariaRole === 'menu' && isNested && {\n        role: 'menuitem'\n      }),\n      ...(role === 'select' && {\n        'aria-autocomplete': 'none'\n      }),\n      ...(role === 'combobox' && {\n        'aria-autocomplete': 'list'\n      })\n    };\n  }, [ariaRole, floatingId, isNested, open, referenceId, role]);\n  const floating = React.useMemo(() => {\n    const floatingProps = {\n      id: floatingId,\n      ...(ariaRole && {\n        role: ariaRole\n      })\n    };\n    if (ariaRole === 'tooltip' || role === 'label') {\n      return floatingProps;\n    }\n    return {\n      ...floatingProps,\n      ...(ariaRole === 'menu' && {\n        'aria-labelledby': referenceId\n      })\n    };\n  }, [ariaRole, floatingId, referenceId, role]);\n  const item = React.useCallback(_ref => {\n    let {\n      active,\n      selected\n    } = _ref;\n    const commonProps = {\n      role: 'option',\n      ...(active && {\n        id: floatingId + \"-fui-option\"\n      })\n    };\n\n    // For `menu`, we are unable to tell if the item is a `menuitemradio`\n    // or `menuitemcheckbox`. For backwards-compatibility reasons, also\n    // avoid defaulting to `menuitem` as it may overwrite custom role props.\n    switch (role) {\n      case 'select':\n      case 'combobox':\n        return {\n          ...commonProps,\n          'aria-selected': selected\n        };\n    }\n    return {};\n  }, [floatingId, role]);\n  return React.useMemo(() => enabled ? {\n    reference,\n    floating,\n    item\n  } : {}, [enabled, reference, floating, item]);\n}\n\n// Converts a JS style key like `backgroundColor` to a CSS transition-property\n// like `background-color`.\nconst camelCaseToKebabCase = str => str.replace(/[A-Z]+(?![a-z])|[A-Z]/g, ($, ofs) => (ofs ? '-' : '') + $.toLowerCase());\nfunction execWithArgsOrReturn(valueOrFn, args) {\n  return typeof valueOrFn === 'function' ? valueOrFn(args) : valueOrFn;\n}\nfunction useDelayUnmount(open, durationMs) {\n  const [isMounted, setIsMounted] = React.useState(open);\n  if (open && !isMounted) {\n    setIsMounted(true);\n  }\n  React.useEffect(() => {\n    if (!open && isMounted) {\n      const timeout = setTimeout(() => setIsMounted(false), durationMs);\n      return () => clearTimeout(timeout);\n    }\n  }, [open, isMounted, durationMs]);\n  return isMounted;\n}\n/**\n * Provides a status string to apply CSS transitions to a floating element,\n * correctly handling placement-aware transitions.\n * @see https://floating-ui.com/docs/useTransition#usetransitionstatus\n */\nfunction useTransitionStatus(context, props) {\n  if (props === void 0) {\n    props = {};\n  }\n  const {\n    open,\n    elements: {\n      floating\n    }\n  } = context;\n  const {\n    duration = 250\n  } = props;\n  const isNumberDuration = typeof duration === 'number';\n  const closeDuration = (isNumberDuration ? duration : duration.close) || 0;\n  const [status, setStatus] = React.useState('unmounted');\n  const isMounted = useDelayUnmount(open, closeDuration);\n  if (!isMounted && status === 'close') {\n    setStatus('unmounted');\n  }\n  useModernLayoutEffect(() => {\n    if (!floating) return;\n    if (open) {\n      setStatus('initial');\n      const frame = requestAnimationFrame(() => {\n        // Ensure it opens before paint. With `FloatingDelayGroup`,\n        // this avoids a flicker when moving between floating elements\n        // to ensure one is always open with no missing frames.\n        ReactDOM.flushSync(() => {\n          setStatus('open');\n        });\n      });\n      return () => {\n        cancelAnimationFrame(frame);\n      };\n    }\n    setStatus('close');\n  }, [open, floating]);\n  return {\n    isMounted,\n    status\n  };\n}\n/**\n * Provides styles to apply CSS transitions to a floating element, correctly\n * handling placement-aware transitions. Wrapper around `useTransitionStatus`.\n * @see https://floating-ui.com/docs/useTransition#usetransitionstyles\n */\nfunction useTransitionStyles(context, props) {\n  if (props === void 0) {\n    props = {};\n  }\n  const {\n    initial: unstable_initial = {\n      opacity: 0\n    },\n    open: unstable_open,\n    close: unstable_close,\n    common: unstable_common,\n    duration = 250\n  } = props;\n  const placement = context.placement;\n  const side = placement.split('-')[0];\n  const fnArgs = React.useMemo(() => ({\n    side,\n    placement\n  }), [side, placement]);\n  const isNumberDuration = typeof duration === 'number';\n  const openDuration = (isNumberDuration ? duration : duration.open) || 0;\n  const closeDuration = (isNumberDuration ? duration : duration.close) || 0;\n  const [styles, setStyles] = React.useState(() => ({\n    ...execWithArgsOrReturn(unstable_common, fnArgs),\n    ...execWithArgsOrReturn(unstable_initial, fnArgs)\n  }));\n  const {\n    isMounted,\n    status\n  } = useTransitionStatus(context, {\n    duration\n  });\n  const initialRef = useLatestRef(unstable_initial);\n  const openRef = useLatestRef(unstable_open);\n  const closeRef = useLatestRef(unstable_close);\n  const commonRef = useLatestRef(unstable_common);\n  useModernLayoutEffect(() => {\n    const initialStyles = execWithArgsOrReturn(initialRef.current, fnArgs);\n    const closeStyles = execWithArgsOrReturn(closeRef.current, fnArgs);\n    const commonStyles = execWithArgsOrReturn(commonRef.current, fnArgs);\n    const openStyles = execWithArgsOrReturn(openRef.current, fnArgs) || Object.keys(initialStyles).reduce((acc, key) => {\n      acc[key] = '';\n      return acc;\n    }, {});\n    if (status === 'initial') {\n      setStyles(styles => ({\n        transitionProperty: styles.transitionProperty,\n        ...commonStyles,\n        ...initialStyles\n      }));\n    }\n    if (status === 'open') {\n      setStyles({\n        transitionProperty: Object.keys(openStyles).map(camelCaseToKebabCase).join(','),\n        transitionDuration: openDuration + \"ms\",\n        ...commonStyles,\n        ...openStyles\n      });\n    }\n    if (status === 'close') {\n      const styles = closeStyles || initialStyles;\n      setStyles({\n        transitionProperty: Object.keys(styles).map(camelCaseToKebabCase).join(','),\n        transitionDuration: closeDuration + \"ms\",\n        ...commonStyles,\n        ...styles\n      });\n    }\n  }, [closeDuration, closeRef, initialRef, openRef, commonRef, openDuration, status, fnArgs]);\n  return {\n    isMounted,\n    styles\n  };\n}\n\n/**\n * Provides a matching callback that can be used to focus an item as the user\n * types, often used in tandem with `useListNavigation()`.\n * @see https://floating-ui.com/docs/useTypeahead\n */\nfunction useTypeahead(context, props) {\n  var _ref;\n  const {\n    open,\n    dataRef\n  } = context;\n  const {\n    listRef,\n    activeIndex,\n    onMatch: unstable_onMatch,\n    onTypingChange: unstable_onTypingChange,\n    enabled = true,\n    findMatch = null,\n    resetMs = 750,\n    ignoreKeys = [],\n    selectedIndex = null\n  } = props;\n  const timeoutIdRef = React.useRef(-1);\n  const stringRef = React.useRef('');\n  const prevIndexRef = React.useRef((_ref = selectedIndex != null ? selectedIndex : activeIndex) != null ? _ref : -1);\n  const matchIndexRef = React.useRef(null);\n  const onMatch = useEffectEvent(unstable_onMatch);\n  const onTypingChange = useEffectEvent(unstable_onTypingChange);\n  const findMatchRef = useLatestRef(findMatch);\n  const ignoreKeysRef = useLatestRef(ignoreKeys);\n  useModernLayoutEffect(() => {\n    if (open) {\n      clearTimeoutIfSet(timeoutIdRef);\n      matchIndexRef.current = null;\n      stringRef.current = '';\n    }\n  }, [open]);\n  useModernLayoutEffect(() => {\n    // Sync arrow key navigation but not typeahead navigation.\n    if (open && stringRef.current === '') {\n      var _ref2;\n      prevIndexRef.current = (_ref2 = selectedIndex != null ? selectedIndex : activeIndex) != null ? _ref2 : -1;\n    }\n  }, [open, selectedIndex, activeIndex]);\n  const setTypingChange = useEffectEvent(value => {\n    if (value) {\n      if (!dataRef.current.typing) {\n        dataRef.current.typing = value;\n        onTypingChange(value);\n      }\n    } else {\n      if (dataRef.current.typing) {\n        dataRef.current.typing = value;\n        onTypingChange(value);\n      }\n    }\n  });\n  const onKeyDown = useEffectEvent(event => {\n    function getMatchingIndex(list, orderedList, string) {\n      const str = findMatchRef.current ? findMatchRef.current(orderedList, string) : orderedList.find(text => (text == null ? void 0 : text.toLocaleLowerCase().indexOf(string.toLocaleLowerCase())) === 0);\n      return str ? list.indexOf(str) : -1;\n    }\n    const listContent = listRef.current;\n    if (stringRef.current.length > 0 && stringRef.current[0] !== ' ') {\n      if (getMatchingIndex(listContent, listContent, stringRef.current) === -1) {\n        setTypingChange(false);\n      } else if (event.key === ' ') {\n        stopEvent(event);\n      }\n    }\n    if (listContent == null || ignoreKeysRef.current.includes(event.key) ||\n    // Character key.\n    event.key.length !== 1 ||\n    // Modifier key.\n    event.ctrlKey || event.metaKey || event.altKey) {\n      return;\n    }\n    if (open && event.key !== ' ') {\n      stopEvent(event);\n      setTypingChange(true);\n    }\n\n    // Bail out if the list contains a word like \"llama\" or \"aaron\". TODO:\n    // allow it in this case, too.\n    const allowRapidSuccessionOfFirstLetter = listContent.every(text => {\n      var _text$, _text$2;\n      return text ? ((_text$ = text[0]) == null ? void 0 : _text$.toLocaleLowerCase()) !== ((_text$2 = text[1]) == null ? void 0 : _text$2.toLocaleLowerCase()) : true;\n    });\n\n    // Allows the user to cycle through items that start with the same letter\n    // in rapid succession.\n    if (allowRapidSuccessionOfFirstLetter && stringRef.current === event.key) {\n      stringRef.current = '';\n      prevIndexRef.current = matchIndexRef.current;\n    }\n    stringRef.current += event.key;\n    clearTimeoutIfSet(timeoutIdRef);\n    timeoutIdRef.current = window.setTimeout(() => {\n      stringRef.current = '';\n      prevIndexRef.current = matchIndexRef.current;\n      setTypingChange(false);\n    }, resetMs);\n    const prevIndex = prevIndexRef.current;\n    const index = getMatchingIndex(listContent, [...listContent.slice((prevIndex || 0) + 1), ...listContent.slice(0, (prevIndex || 0) + 1)], stringRef.current);\n    if (index !== -1) {\n      onMatch(index);\n      matchIndexRef.current = index;\n    } else if (event.key !== ' ') {\n      stringRef.current = '';\n      setTypingChange(false);\n    }\n  });\n  const reference = React.useMemo(() => ({\n    onKeyDown\n  }), [onKeyDown]);\n  const floating = React.useMemo(() => {\n    return {\n      onKeyDown,\n      onKeyUp(event) {\n        if (event.key === ' ') {\n          setTypingChange(false);\n        }\n      }\n    };\n  }, [onKeyDown, setTypingChange]);\n  return React.useMemo(() => enabled ? {\n    reference,\n    floating\n  } : {}, [enabled, reference, floating]);\n}\n\nfunction getArgsWithCustomFloatingHeight(state, height) {\n  return {\n    ...state,\n    rects: {\n      ...state.rects,\n      floating: {\n        ...state.rects.floating,\n        height\n      }\n    }\n  };\n}\n/**\n * Positions the floating element such that an inner element inside of it is\n * anchored to the reference element.\n * @see https://floating-ui.com/docs/inner\n * @deprecated\n */\nconst inner = props => ({\n  name: 'inner',\n  options: props,\n  async fn(state) {\n    const {\n      listRef,\n      overflowRef,\n      onFallbackChange,\n      offset: innerOffset = 0,\n      index = 0,\n      minItemsVisible = 4,\n      referenceOverflowThreshold = 0,\n      scrollRef,\n      ...detectOverflowOptions\n    } = evaluate(props, state);\n    const {\n      rects,\n      elements: {\n        floating\n      }\n    } = state;\n    const item = listRef.current[index];\n    const scrollEl = (scrollRef == null ? void 0 : scrollRef.current) || floating;\n\n    // Valid combinations:\n    // 1. Floating element is the scrollRef and has a border (default)\n    // 2. Floating element is not the scrollRef, floating element has a border\n    // 3. Floating element is not the scrollRef, scrollRef has a border\n    // Floating > {...getFloatingProps()} wrapper > scrollRef > items is not\n    // allowed as VoiceOver doesn't work.\n    const clientTop = floating.clientTop || scrollEl.clientTop;\n    const floatingIsBordered = floating.clientTop !== 0;\n    const scrollElIsBordered = scrollEl.clientTop !== 0;\n    const floatingIsScrollEl = floating === scrollEl;\n    if (process.env.NODE_ENV !== \"production\") {\n      if (!state.placement.startsWith('bottom')) {\n        warn('`placement` side must be \"bottom\" when using the `inner`', 'middleware.');\n      }\n    }\n    if (!item) {\n      return {};\n    }\n    const nextArgs = {\n      ...state,\n      ...(await offset(-item.offsetTop - floating.clientTop - rects.reference.height / 2 - item.offsetHeight / 2 - innerOffset).fn(state))\n    };\n    const overflow = await detectOverflow(getArgsWithCustomFloatingHeight(nextArgs, scrollEl.scrollHeight + clientTop + floating.clientTop), detectOverflowOptions);\n    const refOverflow = await detectOverflow(nextArgs, {\n      ...detectOverflowOptions,\n      elementContext: 'reference'\n    });\n    const diffY = max(0, overflow.top);\n    const nextY = nextArgs.y + diffY;\n    const isScrollable = scrollEl.scrollHeight > scrollEl.clientHeight;\n    const rounder = isScrollable ? v => v : round;\n    const maxHeight = rounder(max(0, scrollEl.scrollHeight + (floatingIsBordered && floatingIsScrollEl || scrollElIsBordered ? clientTop * 2 : 0) - diffY - max(0, overflow.bottom)));\n    scrollEl.style.maxHeight = maxHeight + \"px\";\n    scrollEl.scrollTop = diffY;\n\n    // There is not enough space, fallback to standard anchored positioning\n    if (onFallbackChange) {\n      const shouldFallback = scrollEl.offsetHeight < item.offsetHeight * min(minItemsVisible, listRef.current.length) - 1 || refOverflow.top >= -referenceOverflowThreshold || refOverflow.bottom >= -referenceOverflowThreshold;\n      ReactDOM.flushSync(() => onFallbackChange(shouldFallback));\n    }\n    if (overflowRef) {\n      overflowRef.current = await detectOverflow(getArgsWithCustomFloatingHeight({\n        ...nextArgs,\n        y: nextY\n      }, scrollEl.offsetHeight + clientTop + floating.clientTop), detectOverflowOptions);\n    }\n    return {\n      y: nextY\n    };\n  }\n});\n/**\n * Changes the `inner` middleware's `offset` upon a `wheel` event to\n * expand the floating element's height, revealing more list items.\n * @see https://floating-ui.com/docs/inner\n * @deprecated\n */\nfunction useInnerOffset(context, props) {\n  const {\n    open,\n    elements\n  } = context;\n  const {\n    enabled = true,\n    overflowRef,\n    scrollRef,\n    onChange: unstable_onChange\n  } = props;\n  const onChange = useEffectEvent(unstable_onChange);\n  const controlledScrollingRef = React.useRef(false);\n  const prevScrollTopRef = React.useRef(null);\n  const initialOverflowRef = React.useRef(null);\n  React.useEffect(() => {\n    if (!enabled) return;\n    function onWheel(e) {\n      if (e.ctrlKey || !el || overflowRef.current == null) {\n        return;\n      }\n      const dY = e.deltaY;\n      const isAtTop = overflowRef.current.top >= -0.5;\n      const isAtBottom = overflowRef.current.bottom >= -0.5;\n      const remainingScroll = el.scrollHeight - el.clientHeight;\n      const sign = dY < 0 ? -1 : 1;\n      const method = dY < 0 ? 'max' : 'min';\n      if (el.scrollHeight <= el.clientHeight) {\n        return;\n      }\n      if (!isAtTop && dY > 0 || !isAtBottom && dY < 0) {\n        e.preventDefault();\n        ReactDOM.flushSync(() => {\n          onChange(d => d + Math[method](dY, remainingScroll * sign));\n        });\n      } else if (/firefox/i.test(getUserAgent())) {\n        // Needed to propagate scrolling during momentum scrolling phase once\n        // it gets limited by the boundary. UX improvement, not critical.\n        el.scrollTop += dY;\n      }\n    }\n    const el = (scrollRef == null ? void 0 : scrollRef.current) || elements.floating;\n    if (open && el) {\n      el.addEventListener('wheel', onWheel);\n\n      // Wait for the position to be ready.\n      requestAnimationFrame(() => {\n        prevScrollTopRef.current = el.scrollTop;\n        if (overflowRef.current != null) {\n          initialOverflowRef.current = {\n            ...overflowRef.current\n          };\n        }\n      });\n      return () => {\n        prevScrollTopRef.current = null;\n        initialOverflowRef.current = null;\n        el.removeEventListener('wheel', onWheel);\n      };\n    }\n  }, [enabled, open, elements.floating, overflowRef, scrollRef, onChange]);\n  const floating = React.useMemo(() => ({\n    onKeyDown() {\n      controlledScrollingRef.current = true;\n    },\n    onWheel() {\n      controlledScrollingRef.current = false;\n    },\n    onPointerMove() {\n      controlledScrollingRef.current = false;\n    },\n    onScroll() {\n      const el = (scrollRef == null ? void 0 : scrollRef.current) || elements.floating;\n      if (!overflowRef.current || !el || !controlledScrollingRef.current) {\n        return;\n      }\n      if (prevScrollTopRef.current !== null) {\n        const scrollDiff = el.scrollTop - prevScrollTopRef.current;\n        if (overflowRef.current.bottom < -0.5 && scrollDiff < -1 || overflowRef.current.top < -0.5 && scrollDiff > 1) {\n          ReactDOM.flushSync(() => onChange(d => d + scrollDiff));\n        }\n      }\n\n      // [Firefox] Wait for the height change to have been applied.\n      requestAnimationFrame(() => {\n        prevScrollTopRef.current = el.scrollTop;\n      });\n    }\n  }), [elements.floating, onChange, overflowRef, scrollRef]);\n  return React.useMemo(() => enabled ? {\n    floating\n  } : {}, [enabled, floating]);\n}\n\nfunction getNodeChildren(nodes, id, onlyOpenChildren) {\n  if (onlyOpenChildren === void 0) {\n    onlyOpenChildren = true;\n  }\n  const directChildren = nodes.filter(node => {\n    var _node$context;\n    return node.parentId === id && (!onlyOpenChildren || ((_node$context = node.context) == null ? void 0 : _node$context.open));\n  });\n  return directChildren.flatMap(child => [child, ...getNodeChildren(nodes, child.id, onlyOpenChildren)]);\n}\n\nfunction isPointInPolygon(point, polygon) {\n  const [x, y] = point;\n  let isInside = false;\n  const length = polygon.length;\n  for (let i = 0, j = length - 1; i < length; j = i++) {\n    const [xi, yi] = polygon[i] || [0, 0];\n    const [xj, yj] = polygon[j] || [0, 0];\n    const intersect = yi >= y !== yj >= y && x <= (xj - xi) * (y - yi) / (yj - yi) + xi;\n    if (intersect) {\n      isInside = !isInside;\n    }\n  }\n  return isInside;\n}\nfunction isInside(point, rect) {\n  return point[0] >= rect.x && point[0] <= rect.x + rect.width && point[1] >= rect.y && point[1] <= rect.y + rect.height;\n}\n/**\n * Generates a safe polygon area that the user can traverse without closing the\n * floating element once leaving the reference element.\n * @see https://floating-ui.com/docs/useHover#safepolygon\n */\nfunction safePolygon(options) {\n  if (options === void 0) {\n    options = {};\n  }\n  const {\n    buffer = 0.5,\n    blockPointerEvents = false,\n    requireIntent = true\n  } = options;\n  const timeoutRef = {\n    current: -1\n  };\n  let hasLanded = false;\n  let lastX = null;\n  let lastY = null;\n  let lastCursorTime = typeof performance !== 'undefined' ? performance.now() : 0;\n  function getCursorSpeed(x, y) {\n    const currentTime = performance.now();\n    const elapsedTime = currentTime - lastCursorTime;\n    if (lastX === null || lastY === null || elapsedTime === 0) {\n      lastX = x;\n      lastY = y;\n      lastCursorTime = currentTime;\n      return null;\n    }\n    const deltaX = x - lastX;\n    const deltaY = y - lastY;\n    const distance = Math.sqrt(deltaX * deltaX + deltaY * deltaY);\n    const speed = distance / elapsedTime; // px / ms\n\n    lastX = x;\n    lastY = y;\n    lastCursorTime = currentTime;\n    return speed;\n  }\n  const fn = _ref => {\n    let {\n      x,\n      y,\n      placement,\n      elements,\n      onClose,\n      nodeId,\n      tree\n    } = _ref;\n    return function onMouseMove(event) {\n      function close() {\n        clearTimeoutIfSet(timeoutRef);\n        onClose();\n      }\n      clearTimeoutIfSet(timeoutRef);\n      if (!elements.domReference || !elements.floating || placement == null || x == null || y == null) {\n        return;\n      }\n      const {\n        clientX,\n        clientY\n      } = event;\n      const clientPoint = [clientX, clientY];\n      const target = getTarget(event);\n      const isLeave = event.type === 'mouseleave';\n      const isOverFloatingEl = contains(elements.floating, target);\n      const isOverReferenceEl = contains(elements.domReference, target);\n      const refRect = elements.domReference.getBoundingClientRect();\n      const rect = elements.floating.getBoundingClientRect();\n      const side = placement.split('-')[0];\n      const cursorLeaveFromRight = x > rect.right - rect.width / 2;\n      const cursorLeaveFromBottom = y > rect.bottom - rect.height / 2;\n      const isOverReferenceRect = isInside(clientPoint, refRect);\n      const isFloatingWider = rect.width > refRect.width;\n      const isFloatingTaller = rect.height > refRect.height;\n      const left = (isFloatingWider ? refRect : rect).left;\n      const right = (isFloatingWider ? refRect : rect).right;\n      const top = (isFloatingTaller ? refRect : rect).top;\n      const bottom = (isFloatingTaller ? refRect : rect).bottom;\n      if (isOverFloatingEl) {\n        hasLanded = true;\n        if (!isLeave) {\n          return;\n        }\n      }\n      if (isOverReferenceEl) {\n        hasLanded = false;\n      }\n      if (isOverReferenceEl && !isLeave) {\n        hasLanded = true;\n        return;\n      }\n\n      // Prevent overlapping floating element from being stuck in an open-close\n      // loop: https://github.com/floating-ui/floating-ui/issues/1910\n      if (isLeave && isElement(event.relatedTarget) && contains(elements.floating, event.relatedTarget)) {\n        return;\n      }\n\n      // If any nested child is open, abort.\n      if (tree && getNodeChildren(tree.nodesRef.current, nodeId).length) {\n        return;\n      }\n\n      // If the pointer is leaving from the opposite side, the \"buffer\" logic\n      // creates a point where the floating element remains open, but should be\n      // ignored.\n      // A constant of 1 handles floating point rounding errors.\n      if (side === 'top' && y >= refRect.bottom - 1 || side === 'bottom' && y <= refRect.top + 1 || side === 'left' && x >= refRect.right - 1 || side === 'right' && x <= refRect.left + 1) {\n        return close();\n      }\n\n      // Ignore when the cursor is within the rectangular trough between the\n      // two elements. Since the triangle is created from the cursor point,\n      // which can start beyond the ref element's edge, traversing back and\n      // forth from the ref to the floating element can cause it to close. This\n      // ensures it always remains open in that case.\n      let rectPoly = [];\n      switch (side) {\n        case 'top':\n          rectPoly = [[left, refRect.top + 1], [left, rect.bottom - 1], [right, rect.bottom - 1], [right, refRect.top + 1]];\n          break;\n        case 'bottom':\n          rectPoly = [[left, rect.top + 1], [left, refRect.bottom - 1], [right, refRect.bottom - 1], [right, rect.top + 1]];\n          break;\n        case 'left':\n          rectPoly = [[rect.right - 1, bottom], [rect.right - 1, top], [refRect.left + 1, top], [refRect.left + 1, bottom]];\n          break;\n        case 'right':\n          rectPoly = [[refRect.right - 1, bottom], [refRect.right - 1, top], [rect.left + 1, top], [rect.left + 1, bottom]];\n          break;\n      }\n      function getPolygon(_ref2) {\n        let [x, y] = _ref2;\n        switch (side) {\n          case 'top':\n            {\n              const cursorPointOne = [isFloatingWider ? x + buffer / 2 : cursorLeaveFromRight ? x + buffer * 4 : x - buffer * 4, y + buffer + 1];\n              const cursorPointTwo = [isFloatingWider ? x - buffer / 2 : cursorLeaveFromRight ? x + buffer * 4 : x - buffer * 4, y + buffer + 1];\n              const commonPoints = [[rect.left, cursorLeaveFromRight ? rect.bottom - buffer : isFloatingWider ? rect.bottom - buffer : rect.top], [rect.right, cursorLeaveFromRight ? isFloatingWider ? rect.bottom - buffer : rect.top : rect.bottom - buffer]];\n              return [cursorPointOne, cursorPointTwo, ...commonPoints];\n            }\n          case 'bottom':\n            {\n              const cursorPointOne = [isFloatingWider ? x + buffer / 2 : cursorLeaveFromRight ? x + buffer * 4 : x - buffer * 4, y - buffer];\n              const cursorPointTwo = [isFloatingWider ? x - buffer / 2 : cursorLeaveFromRight ? x + buffer * 4 : x - buffer * 4, y - buffer];\n              const commonPoints = [[rect.left, cursorLeaveFromRight ? rect.top + buffer : isFloatingWider ? rect.top + buffer : rect.bottom], [rect.right, cursorLeaveFromRight ? isFloatingWider ? rect.top + buffer : rect.bottom : rect.top + buffer]];\n              return [cursorPointOne, cursorPointTwo, ...commonPoints];\n            }\n          case 'left':\n            {\n              const cursorPointOne = [x + buffer + 1, isFloatingTaller ? y + buffer / 2 : cursorLeaveFromBottom ? y + buffer * 4 : y - buffer * 4];\n              const cursorPointTwo = [x + buffer + 1, isFloatingTaller ? y - buffer / 2 : cursorLeaveFromBottom ? y + buffer * 4 : y - buffer * 4];\n              const commonPoints = [[cursorLeaveFromBottom ? rect.right - buffer : isFloatingTaller ? rect.right - buffer : rect.left, rect.top], [cursorLeaveFromBottom ? isFloatingTaller ? rect.right - buffer : rect.left : rect.right - buffer, rect.bottom]];\n              return [...commonPoints, cursorPointOne, cursorPointTwo];\n            }\n          case 'right':\n            {\n              const cursorPointOne = [x - buffer, isFloatingTaller ? y + buffer / 2 : cursorLeaveFromBottom ? y + buffer * 4 : y - buffer * 4];\n              const cursorPointTwo = [x - buffer, isFloatingTaller ? y - buffer / 2 : cursorLeaveFromBottom ? y + buffer * 4 : y - buffer * 4];\n              const commonPoints = [[cursorLeaveFromBottom ? rect.left + buffer : isFloatingTaller ? rect.left + buffer : rect.right, rect.top], [cursorLeaveFromBottom ? isFloatingTaller ? rect.left + buffer : rect.right : rect.left + buffer, rect.bottom]];\n              return [cursorPointOne, cursorPointTwo, ...commonPoints];\n            }\n        }\n      }\n      if (isPointInPolygon([clientX, clientY], rectPoly)) {\n        return;\n      }\n      if (hasLanded && !isOverReferenceRect) {\n        return close();\n      }\n      if (!isLeave && requireIntent) {\n        const cursorSpeed = getCursorSpeed(event.clientX, event.clientY);\n        const cursorSpeedThreshold = 0.1;\n        if (cursorSpeed !== null && cursorSpeed < cursorSpeedThreshold) {\n          return close();\n        }\n      }\n      if (!isPointInPolygon([clientX, clientY], getPolygon([x, y]))) {\n        close();\n      } else if (!hasLanded && requireIntent) {\n        timeoutRef.current = window.setTimeout(close, 40);\n      }\n    };\n  };\n  fn.__options = {\n    blockPointerEvents\n  };\n  return fn;\n}\n\nexport { Composite, CompositeItem, FloatingArrow, FloatingDelayGroup, FloatingFocusManager, FloatingList, FloatingNode, FloatingOverlay, FloatingPortal, FloatingTree, NextFloatingDelayGroup, inner, safePolygon, useClick, useClientPoint, useDelayGroup, useDelayGroupContext, useDismiss, useFloating, useFloatingNodeId, useFloatingParentNodeId, useFloatingPortalNode, useFloatingRootContext, useFloatingTree, useFocus, useHover, useId, useInnerOffset, useInteractions, useListItem, useListNavigation, useMergeRefs, useNextDelayGroup, useRole, useTransitionStatus, useTransitionStyles, useTypeahead };\n","import React, { Children, cloneElement, isValidElement, useCallback, useEffect, useRef, useState } from \"react\";\nimport styled from \"@emotion/styled\";\nimport { css } from \"@emotion/react\";\nimport { useResizeDetector } from \"react-resize-detector\";\nimport { Row } from \"@components\";\nimport { Icon } from \"@iconify/react\";\nimport { useHass } from \"@hakit/core\";\nimport { useFloating, FloatingArrow, shift, limitShift, arrow, offset, autoUpdate, type Placement } from \"@floating-ui/react\";\n\ntype Extendable = Omit<React.ComponentPropsWithoutRef<\"a\">, \"event\" | \"definition\">;\n\ninterface Item extends Extendable {\n  label: string;\n  icon?: string;\n  active?: boolean;\n  onClick?: () => void;\n}\n\nconst StyledIcon = styled(Icon)`\n  font-size: 1rem;\n  color: var(--ha-S400-contrast);\n  margin-right: 0.5rem;\n`;\n\nexport interface MenuProps extends React.ComponentPropsWithoutRef<\"div\"> {\n  /** the children should simply be the item to activate, it's used as a wrapped and binds the action automatically */\n  children?: React.ReactNode;\n  /** the placement of the popup @default 'bottom' */\n  placement?: Placement;\n  /** the items for the menu to render */\n  items: Item[];\n  /** if the menu/button should be disabled */\n  disabled?: boolean;\n}\n\nconst MenuPopup = styled.div<{\n  triggerWidth: number;\n}>`\n  z-index: 50;\n  display: flex;\n  min-width: 180px;\n  flex-direction: column;\n  overscroll-behavior: contain;\n  border-radius: 0.5rem;\n  border-width: 1px;\n  border-style: solid;\n  border-color: var(--ha-S500);\n  background-color: var(--ha-S400);\n  padding: 0.5rem;\n  color: var(--ha-S400-contrast);\n  box-shadow:\n    0 10px 15px -3px rgb(0 0 0 / 0.1),\n    0 4px 6px -4px rgb(0 0 0 / 0.1);\n  outline: none !important;\n  max-height: max-content;\n  max-height: 300px;\n  overflow-y: scroll;\n`;\n\nconst Parent = styled.div`\n  position: relative;\n`;\n\nconst MenuItem = styled.a`\n  display: flex;\n  scroll-margin: 0.5rem;\n  align-items: center;\n  gap: 0.5rem;\n  border-radius: 0.25rem;\n  padding: 0.8rem 0.5rem;\n  outline: none !important;\n  background-color: transparent;\n  cursor: pointer;\n  transition: background-color var(--ha-transition-duration) var(--ha-easing);\n  &:active,\n  &:focus,\n  &:hover {\n    background-color: var(--ha-S600);\n  }\n  &.active {\n    background-color: var(--ha-S700);\n  }\n`;\n\nexport function Menu({ children, placement = \"bottom\", items = [], disabled = false, cssStyles, ...props }: MenuProps) {\n  const [open, setOpen] = useState(false);\n  const globalComponentStyle = useHass((state) => state.globalComponentStyles);\n  const arrowRef = useRef(null);\n  const { refs, floatingStyles, context } = useFloating({\n    whileElementsMounted: autoUpdate,\n    placement,\n    middleware: [\n      shift({\n        limiter: limitShift({\n          // Start limiting 5px earlier\n          offset: 10,\n        }),\n      }),\n      offset(20),\n      arrow({\n        element: arrowRef,\n      }),\n    ],\n  });\n\n  const { width, ref } = useResizeDetector({\n    refreshMode: \"debounce\",\n    handleHeight: false,\n    refreshRate: 500,\n  });\n  // Reference to the menu popup\n  const menuRef = useRef<HTMLDivElement>(null);\n\n  // Function to check if the clicked area is outside the menu\n  const handleClickOutside = useCallback(\n    (event: MouseEvent) => {\n      const isMenu = menuRef.current && menuRef.current.contains(event.target as Node);\n      const isParent = ref.current && ref.current.contains(event.target as Node);\n      if (!isMenu && !isParent) {\n        setOpen(false);\n      }\n    },\n    [ref],\n  );\n\n  // Effect to add/remove document event listener\n  useEffect(() => {\n    if (open) {\n      document.addEventListener(\"mousedown\", handleClickOutside);\n    } else {\n      document.removeEventListener(\"mousedown\", handleClickOutside);\n    }\n\n    // Cleanup event listener\n    return () => {\n      document.removeEventListener(\"mousedown\", handleClickOutside);\n    };\n  }, [handleClickOutside, open]); // Only re-run if 'open' state changes\n\n  return (\n    <Parent\n      {...props}\n      ref={ref}\n      aria-disabled={disabled}\n      aria-controls=\"listbox\"\n      aria-expanded={open}\n      role=\"combobox\"\n      css={css`\n        ${globalComponentStyle.menu ?? \"\"}\n        ${cssStyles ?? \"\"}\n      `}\n    >\n      {Children.map(children, (child) => {\n        if (\n          isValidElement<\n            HTMLDivElement & {\n              onClick: () => void;\n              ref: (node: HTMLDivElement | null) => void;\n            }\n          >(child)\n        ) {\n          return cloneElement(child, {\n            ...child.props,\n            role: \"option\",\n            ref: refs.setReference,\n            onClick: () => {\n              if (disabled) return;\n              setOpen(!open);\n              child.props.onClick?.();\n            },\n          });\n        }\n        return child;\n      })}\n      {open && (\n        <div ref={refs.setFloating} style={floatingStyles} role=\"listbox\">\n          <FloatingArrow\n            ref={arrowRef}\n            context={context}\n            style={{\n              fill: \"var(--ha-S400)\",\n            }}\n          />\n          <MenuPopup triggerWidth={width ?? 0} className=\"menu\">\n            {items.map(({ onClick, active, label, icon, ...rest }, index) => {\n              return (\n                <MenuItem\n                  {...rest}\n                  key={index}\n                  aria-disabled={disabled}\n                  role=\"option\"\n                  onClick={() => {\n                    onClick?.();\n                    setOpen(false);\n                  }}\n                  className={`menu-item ${active ? \"active\" : \"\"}`}\n                >\n                  <Row fullWidth justifyContent=\"flex-start\">\n                    {icon && <StyledIcon icon={icon} />}\n                    {label}\n                  </Row>\n                </MenuItem>\n              );\n            })}\n          </MenuPopup>\n        </div>\n      )}\n    </Parent>\n  );\n}\n","import { useRef, useCallback, useEffect } from \"react\";\nimport styled from \"@emotion/styled\";\nimport { css } from \"@emotion/react\";\nimport {\n  temperature2rgb,\n  rgb2hex,\n  rgb2hs,\n  useEntity,\n  useLightTemperature,\n  ON,\n  lightSupportsColorMode,\n  LIGHT_COLOR_MODES,\n} from \"@hakit/core\";\nimport type { EntityName, FilterByDomain } from \"@hakit/core\";\nimport { useGesture } from \"@use-gesture/react\";\nimport { fallback, mq } from \"@components\";\nimport { ErrorBoundary } from \"react-error-boundary\";\n\nconst RENDER_SIZE = 400;\nconst canvasSize = RENDER_SIZE * (typeof window === \"undefined\" ? 1 : window.devicePixelRatio);\n\ntype HueSaturation = [number, number];\ntype Rgb = [number, number, number];\n\nexport interface ColorPickerOutputColors {\n  hex: string;\n  rgb: Rgb;\n  hs: HueSaturation;\n}\n\nexport interface ColorTempPickerProps extends Omit<React.ComponentProps<\"div\">, \"onChange\"> {\n  /** if the picker should be disabled @default false */\n  disabled?: boolean;\n  /** the light entity to use with the ColorTempPicker */\n  entity: FilterByDomain<EntityName, \"light\">;\n  /** will provide the value when the user has finished interacting */\n  onChangeApplied?: (kelvin: number, colors: ColorPickerOutputColors) => void;\n  /** will provide the value as it's changing but not actually finished updating */\n  onChange?: (kelvin: number, colors: ColorPickerOutputColors) => void;\n}\n\nconst Picker = styled.div`\n  ${() => {\n    return `\n    display: block;\n    outline: none;\n    height: 45vh;\n    max-height: 320px;\n    min-height: 200px;\n    ${mq(\n      [\"xxs\"],\n      `\n      min-height: 0;\n      height: 35vh;\n      max-height: 100%;\n    `,\n    )}\n    touch-action: none;\n    .container {\n      position: relative;\n      width: 100%;\n      height: 100%;\n      display: flex;\n    }\n    canvas {\n      width: 100%;\n      height: 100%;\n      object-fit: contain;\n      border-radius: 50%;\n      transition: box-shadow 180ms ease-in-out;\n      cursor: pointer;\n    }\n    :host(:focus-visible) canvas {\n      box-shadow: 0 0 0 2px rgb(255, 160, 0);\n    }\n    svg {\n      position: absolute;\n      top: 0;\n      left: 0;\n      width: 100%;\n      height: 100%;\n      pointer-events: none;\n    }\n    circle {\n      fill: black;\n      stroke: white;\n      stroke-width: 2;\n      filter: url(#marker-shadow);\n    }\n    &[pressed=\"touch\"] {\n      circle {\n        transform: translate(0px, -${RENDER_SIZE / 16}px) scale(2.5),\n      }\n    }\n    .cursor {\n      --cx: ((var(--value-x, 0) + 1) * ${RENDER_SIZE}) / 2;\n      --cy: ((var(--value-y, 0) + 1) * ${RENDER_SIZE}) / 2;\n      transform: translate(calc(var(--cx) * 1px), calc(var(--cy) * 1px));\n    }\n    &[pressed] {\n      circle {\n        transform: translate(0px, 0px) scale(1.5);\n      }\n    }\n    &:not([pressed]) circle {\n      transition: transform 100ms ease-in-out, fill 100ms ease-in-out;\n    }\n    &:not([pressed]) {\n      .cursor {\n        transition: transform 200ms ease-in-out, opacity 200ms ease-in-out;\n      }\n    }\n    .container.disabled {\n      .cursor {\n        opacity: 0;\n      }\n      cursor: not-allowed;\n      > * {\n        cursor: not-allowed;\n      }\n    }\n    `;\n  }}\n`;\n\nconst SAFE_ZONE_FACTOR = 0.9;\n\nfunction xy2polar(x: number, y: number) {\n  const r = Math.sqrt(x * x + y * y);\n  const phi = Math.atan2(y, x);\n  return [r, phi];\n}\n\nfunction polar2xy(r: number, phi: number) {\n  const x = Math.cos(phi) * r;\n  const y = Math.sin(phi) * r;\n  return [x, y];\n}\n\nfunction drawColorWheel(ctx: CanvasRenderingContext2D, minTemp: number, maxTemp: number) {\n  ctx.clearRect(0, 0, ctx.canvas.width, ctx.canvas.height);\n  const radius = ctx.canvas.width / 2;\n\n  const min = Math.max(minTemp, 2000);\n  const max = Math.min(maxTemp, 40000);\n\n  for (let y = -radius; y < radius; y += 1) {\n    const x = radius * Math.sqrt(1 - (y / radius) ** 2);\n\n    const fraction = (y / (radius * SAFE_ZONE_FACTOR) + 1) / 2;\n\n    const temperature = Math.max(Math.min(min + fraction * (max - min), max), min);\n\n    const color = rgb2hex(temperature2rgb(temperature));\n\n    ctx.fillStyle = color;\n    ctx.fillRect(radius - x, radius + y - 0.5, 2 * x, 2);\n    ctx.fill();\n  }\n}\n\nfunction InternalColorTempPicker({\n  disabled = false,\n  entity: _entity,\n  onChangeApplied,\n  onChange,\n  className,\n  cssStyles,\n  ...rest\n}: ColorTempPickerProps) {\n  const entity = useEntity(_entity);\n  const value = useLightTemperature(entity);\n  const canvasRef = useRef<HTMLCanvasElement>(null);\n  const parentRef = useRef<HTMLDivElement>(null);\n  const gRef = useRef<SVGGElement>(null);\n  const circleRef = useRef<SVGCircleElement>(null);\n  const timerRef = useRef<NodeJS.Timeout | undefined>(undefined);\n  const _cursorPosition = useRef<[number, number]>([0, 0]);\n  const min = entity.attributes.min_color_temp_kelvin || 2000;\n  const max = entity.attributes.max_color_temp_kelvin || 10000;\n  const isOn = entity.state === ON;\n  const supportsColorTemp = lightSupportsColorMode(entity, LIGHT_COLOR_MODES.COLOR_TEMP);\n  const getColoursFromTemperature = useCallback(\n    (temperature: number) => {\n      const rgb = temperature2rgb(temperature ?? Math.round((max + min) / 2));\n      const hex = rgb2hex(rgb);\n      const hs = rgb2hs(rgb);\n      return {\n        rgb,\n        hex,\n        hs,\n      };\n    },\n    [max, min],\n  );\n\n  const updateColours = useCallback(\n    (value: number) => {\n      const { hex } = getColoursFromTemperature(value);\n      if (gRef.current) {\n        gRef.current.style.fill = hex;\n      }\n      if (circleRef.current) {\n        circleRef.current.style.fill = hex;\n        circleRef.current.style.visibility = _cursorPosition.current ? \"\" : \"hidden\";\n      }\n    },\n    [getColoursFromTemperature],\n  );\n\n  const _generateColorWheel = useCallback(() => {\n    if (!canvasRef.current) return;\n    const ctx = canvasRef.current.getContext(\"2d\")!;\n    drawColorWheel(ctx, min, max);\n  }, [min, max]);\n\n  const setPressed = function (pressed: string) {\n    if (!parentRef.current) return;\n    if (pressed !== \"\") {\n      parentRef.current.setAttribute(\"pressed\", pressed);\n    } else {\n      parentRef.current.removeAttribute(\"pressed\");\n    }\n  };\n\n  const _getValueFromCoord = useCallback(\n    ([, y]: number[]): number => {\n      const fraction = (y / SAFE_ZONE_FACTOR + 1) / 2;\n      const temperature = Math.max(Math.min(min + fraction * (max - min), max), min);\n      return Math.round(temperature);\n    },\n    [min, max],\n  );\n\n  const setValue = useCallback(\n    (updatedValue?: [number, number]) => {\n      if (!parentRef.current || !updatedValue) return;\n      _cursorPosition.current = updatedValue;\n      parentRef.current.style.setProperty(\"--value-x\", disabled ? \"0\" : `${updatedValue[0]}`);\n      parentRef.current.style.setProperty(\"--value-y\", disabled ? \"0\" : `${updatedValue[1]}`);\n      _localValue.current = _getValueFromCoord(_cursorPosition.current);\n      updateColours(_localValue.current);\n      return () => {\n        if (!parentRef.current) return;\n        parentRef.current.style.removeProperty(\"--value-x\");\n        parentRef.current.style.removeProperty(\"--value-y\");\n      };\n    },\n    [disabled, updateColours, _getValueFromCoord],\n  );\n\n  const _getCoordsFromValue = useCallback(\n    (temperature?: number): [number, number] => {\n      if (value === min) {\n        return [0, -1];\n      }\n      if (value === max) {\n        return [0, 1];\n      }\n      const fraction = ((temperature || 0) - min) / (max - min);\n      const y = (2 * fraction - 1) * SAFE_ZONE_FACTOR;\n      return [0, y];\n    },\n    [value, min, max],\n  );\n\n  const _localValue = useRef<number>(_getValueFromCoord(_getCoordsFromValue(value)));\n\n  useEffect(() => {\n    updateColours(_localValue.current);\n  }, [updateColours]);\n\n  useEffect(() => {\n    const previousX = _cursorPosition.current[0];\n    _cursorPosition.current = [previousX, _getCoordsFromValue(value)[1]];\n    setValue(_cursorPosition.current);\n  }, [setValue, value, _getCoordsFromValue]);\n\n  const _getPositionFromEvent = useCallback((xy: [number, number], target: HTMLElement): [number, number] => {\n    const [x, y] = xy;\n    const boundingRect = target.getBoundingClientRect();\n    const offsetX = boundingRect.left;\n    const offsetY = boundingRect.top;\n    const maxX = target.clientWidth;\n    const maxY = target.clientHeight;\n\n    const _x = (2 * (x - offsetX)) / maxX - 1;\n    const _y = (2 * (y - offsetY)) / maxY - 1;\n\n    const [r, phi] = xy2polar(_x, _y);\n    const [__x, __y] = polar2xy(Math.min(1, r), phi);\n    return [__x, __y];\n  }, []);\n\n  const triggerOnChange = useCallback(\n    (updatedValue: number) => {\n      if (timerRef.current) clearTimeout(timerRef.current);\n      if (updatedValue === value) return;\n      timerRef.current = setTimeout(() => {\n        if (typeof onChangeApplied === \"function\") {\n          const colors = getColoursFromTemperature(updatedValue);\n          onChangeApplied(updatedValue, colors);\n        }\n        entity.service.turnOn({\n          serviceData: {\n            color_temp_kelvin: updatedValue,\n          },\n        });\n      }, 100);\n    },\n    [onChangeApplied, entity, value, getColoursFromTemperature],\n  );\n\n  useEffect(() => {\n    if (!supportsColorTemp) return;\n    _generateColorWheel();\n  }, [_generateColorWheel, supportsColorTemp]);\n\n  function renderSVGFilter() {\n    return (\n      <filter id=\"marker-shadow\" x=\"-50%\" y=\"-50%\" width=\"200%\" height=\"200%\" filterUnits=\"objectBoundingBox\">\n        <feDropShadow dx=\"0\" dy=\"1\" stdDeviation=\"2\" floodOpacity=\"0.3\" floodColor=\"rgba(0, 0, 0, 1)\" />\n        <feDropShadow dx=\"0\" dy=\"1\" stdDeviation=\"3\" floodOpacity=\"0.15\" floodColor=\"rgba(0, 0, 0, 1)\" />\n      </filter>\n    );\n  }\n\n  const bind = useGesture(\n    {\n      onDrag: (state) => {\n        if (disabled) return;\n        setValue(_getPositionFromEvent(state.xy, state.target as HTMLElement));\n        if (typeof onChange === \"function\") {\n          const colors = getColoursFromTemperature(_localValue.current);\n          onChange(_localValue.current, colors);\n        }\n      },\n      onDragStart: (state) => {\n        if (disabled) return;\n        setPressed(state.type);\n        setValue(_cursorPosition.current);\n      },\n      onDragEnd: (state) => {\n        if (disabled) return;\n        setPressed(\"\");\n        setValue(_getPositionFromEvent(state.xy, state.target as HTMLElement));\n        triggerOnChange(_localValue.current);\n      },\n      onClick: (state) => {\n        const x = state.event.clientX;\n        const y = state.event.clientY;\n        setValue(_getPositionFromEvent([x, y], state.event.target as HTMLElement));\n        triggerOnChange(_localValue.current);\n      },\n    },\n    {\n      drag: {\n        filterTaps: true,\n      },\n    },\n  );\n\n  return supportsColorTemp ? (\n    <Picker\n      css={css`\n        ${cssStyles ?? \"\"}\n      `}\n      className={`${className ?? \"\"} color-temp-picker`}\n      ref={parentRef}\n      {...bind()}\n      {...rest}\n    >\n      <div className={`container ${disabled ? \"disabled\" : \"\"}`}>\n        <canvas ref={canvasRef} width={canvasSize} height={canvasSize}></canvas>\n        <svg id=\"interaction\" viewBox={`0 0 ${RENDER_SIZE} ${RENDER_SIZE}`} overflow=\"visible\" aria-hidden=\"true\">\n          <defs>{renderSVGFilter()}</defs>\n          <g\n            ref={gRef}\n            className=\"cursor\"\n            style={{\n              visibility: typeof value === \"undefined\" || !isOn ? \"hidden\" : \"visible\",\n            }}\n          >\n            <circle ref={circleRef} cx=\"0\" cy=\"0\" r=\"16\"></circle>\n          </g>\n        </svg>\n      </div>\n    </Picker>\n  ) : null;\n}\n\n/** This color picker was designed to easily retrieve a value from a colour wheel based on values provided from a light entity, you can click or drag on the picker to pick a value */\nexport function ColorTempPicker(props: ColorTempPickerProps) {\n  return (\n    <ErrorBoundary {...fallback({ prefix: \"ColorTempPicker\" })}>\n      <InternalColorTempPicker {...props} />\n    </ErrorBoundary>\n  );\n}\n","import { useRef, useCallback, useEffect, useMemo } from \"react\";\nimport { css } from \"@emotion/react\";\nimport { useGesture } from \"@use-gesture/react\";\nimport styled from \"@emotion/styled\";\nimport {\n  rgbw2rgb,\n  rgbww2rgb,\n  hsv2rgb,\n  hs2rgb,\n  rgb2hex,\n  hex2rgb,\n  lightSupportsColorMode,\n  useEntity,\n  useLightColor,\n  lightSupportsColor,\n  LIGHT_COLOR_MODES,\n  ON,\n} from \"@hakit/core\";\nimport type { LightColor, EntityName, FilterByDomain } from \"@hakit/core\";\nimport { fallback, mq } from \"@components\";\nimport { ErrorBoundary } from \"react-error-boundary\";\n\nconst RENDER_SIZE = 400;\n\nfunction xy2polar(x: number, y: number) {\n  const r = Math.sqrt(x * x + y * y);\n  const phi = Math.atan2(y, x);\n  return [r, phi];\n}\n\nfunction polar2xy(r: number, phi: number) {\n  const x = Math.cos(phi) * r;\n  const y = Math.sin(phi) * r;\n  return [x, y];\n}\n\nfunction rad2deg(rad: number) {\n  return (rad / (2 * Math.PI)) * 360;\n}\n\nfunction deg2rad(deg: number) {\n  return (deg / 360) * 2 * Math.PI;\n}\n\nfunction adjustRgb(rgb: [number, number, number], wv?: number, cw?: number, ww?: number, minKelvin?: number, maxKelvin?: number) {\n  if (wv != null) {\n    return rgbw2rgb([...rgb, wv] as [number, number, number, number]);\n  }\n  if (cw != null && ww !== null) {\n    return rgbww2rgb([...rgb, cw, ww] as [number, number, number, number, number], minKelvin, maxKelvin);\n  }\n  return rgb;\n}\n\nfunction drawColorWheel(\n  ctx: CanvasRenderingContext2D,\n  colorBrightness = 255,\n  wv?: number,\n  cw?: number,\n  ww?: number,\n  minKelvin?: number,\n  maxKelvin?: number,\n) {\n  const radius = ctx.canvas.width / 2;\n\n  ctx.clearRect(0, 0, ctx.canvas.width, ctx.canvas.height);\n  ctx.beginPath();\n\n  const cX = ctx.canvas.width / 2;\n  const cY = ctx.canvas.width / 2;\n  for (let angle = 0; angle < 360; angle += 1) {\n    const startAngle = deg2rad(angle - 0.5);\n    const endAngle = deg2rad(angle + 1.5);\n\n    ctx.beginPath();\n    ctx.moveTo(cX, cY);\n    ctx.arc(cX, cY, radius, startAngle, endAngle);\n    ctx.closePath();\n\n    const gradient = ctx.createRadialGradient(cX, cY, 0, cX, cY, radius);\n    const start = rgb2hex(adjustRgb(hsv2rgb([angle, 0, colorBrightness]), wv, cw, ww, minKelvin, maxKelvin));\n    const end = rgb2hex(adjustRgb(hsv2rgb([angle, 1, colorBrightness]), wv, cw, ww, minKelvin, maxKelvin));\n    gradient.addColorStop(0, start);\n    gradient.addColorStop(1, end);\n    ctx.fillStyle = gradient;\n    ctx.fill();\n  }\n}\nconst ColorPickerWrapper = styled.div`\n  ${() => {\n    const markerPosition = `calc((var(--value-x, 0) + 1) * (${RENDER_SIZE} / 2) * 1px), calc((var(--value-y, 0) + 1) * (${RENDER_SIZE} / 2) * 1px)`;\n\n    return `\n    touch-action: none;\n    display: block;\n    outline: none;\n    height: 45vh;\n    max-height: 320px;\n    min-height: 200px;\n    ${mq(\n      [\"xxs\"],\n      `\n      min-height: 0;\n      height: 35vh;\n      max-height: 100%;\n    `,\n    )}\n    .container {\n      position: relative;\n      width: 100%;\n      height: 100%;\n      display: flex;\n    }\n    canvas {\n      width: 100%;\n      height: 100%;\n      object-fit: contain;\n      border-radius: 50%;\n      cursor: pointer;\n    }\n    svg {\n      position: absolute;\n      top: 0;\n      left: 0;\n      width: 100%;\n      height: 100%;\n      pointer-events: none;\n    }\n    .cursor {\n      will-change: transform;\n      transform: translate(${markerPosition});\n    }\n    circle {\n      fill: black;\n      stroke: white;\n      stroke-width: 2;\n      filter: url(#marker-shadow);\n    }\n    &:not([pressed]) circle {\n      transition:\n        transform 100ms ease-in-out,\n        fill 100ms ease-in-out;\n      translate(0px, 0px) scale(1);\n    }\n    &:not([pressed]) .cursor {\n      transition: opacity 200ms ease-in-out, transform 200ms ease-in-out;\n    }\n    &[pressed=\"pointerdown\"] circle {\n      translate(0px, -${RENDER_SIZE / 16}px) scale(1.5);\n    }\n    .container.disabled {\n      .cursor {\n        opacity: 0;\n      }\n      cursor: not-allowed;\n      > * {\n        cursor: not-allowed;\n      }\n    }\n  `;\n  }}\n`;\n\ntype HueSaturation = [number, number];\ntype Rgb = [number, number, number];\n\nexport interface ColorPickerOutputColors {\n  hex: string;\n  rgb: Rgb;\n  hs?: HueSaturation;\n}\n\nexport interface ColorPickerProps extends Omit<React.ComponentPropsWithoutRef<\"div\">, \"onChange\"> {\n  disabled?: boolean;\n  /** the name of the light entity to control */\n  entity: FilterByDomain<EntityName, \"light\">;\n  /** will provide the color output options when the user has finished interacting */\n  onChangeApplied?: (colors: ColorPickerOutputColors) => void;\n  /** will provide the color output as it's changing but not actually finished updating, the value may also trigger initially once the color calculations have been applied */\n  onChange?: (colors: ColorPickerOutputColors) => void;\n}\nfunction InternalColorPicker({ disabled = false, entity: _entity, onChange, onChangeApplied, className, cssStyles }: ColorPickerProps) {\n  const entity = useEntity(_entity);\n  const lightColors = useLightColor(entity);\n  const parentRef = useRef<HTMLDivElement>(null);\n  const canvasRef = useRef<HTMLCanvasElement>(null);\n  const gRef = useRef<SVGGElement>(null);\n  const hex = useRef<string>(undefined);\n  const circleRef = useRef<SVGCircleElement>(null);\n  const _pressed = useRef<string>(undefined);\n  const _cursorPosition = useRef<[number, number]>(undefined);\n  const _localValue = useRef<[number, number]>(undefined);\n  const canvasSize = useMemo(() => {\n    if (typeof window === \"undefined\") {\n      return RENDER_SIZE;\n    }\n    return RENDER_SIZE * window.devicePixelRatio;\n  }, []);\n  const minKelvin = entity.attributes.min_color_temp_kelvin;\n  const maxKelvin = entity.attributes.max_color_temp_kelvin;\n  const isOn = entity.state === ON;\n  const supportsColor = lightSupportsColor(entity);\n  const _generateColorWheel = useCallback(() => {\n    if (!canvasRef.current) return;\n    const ctx = canvasRef.current.getContext(\"2d\")!;\n    drawColorWheel(ctx, lightColors.colorBrightness, lightColors.white, lightColors.coolWhite, lightColors.warmWhite, minKelvin, maxKelvin);\n  }, [lightColors.colorBrightness, lightColors.white, lightColors.coolWhite, lightColors.warmWhite, minKelvin, maxKelvin]);\n\n  useEffect(() => {\n    if (!supportsColor) return;\n    _generateColorWheel();\n  }, [_generateColorWheel, supportsColor]);\n\n  const _getCoordsFromValue = useCallback((value: [number, number]): [number, number] => {\n    const phi = deg2rad(value[0]);\n    const r = Math.min(value[1], 1);\n    const [x, y] = polar2xy(r, phi);\n    return [x, y];\n  }, []);\n\n  const _getValueFromCoord = useCallback((x: number, y: number): [number, number] => {\n    const [r, phi] = xy2polar(x, y);\n    const deg = Math.round(rad2deg(phi)) % 360;\n    const hue = (deg + 360) % 360;\n    const saturation = Math.round(Math.min(r, 1) * 100) / 100;\n    return [hue, saturation];\n  }, []);\n\n  const _getPositionFromEvent = useCallback((xy: [number, number], target: HTMLElement): [number, number] => {\n    const [x, y] = xy;\n    const boundingRect = target.getBoundingClientRect();\n    const offsetX = boundingRect.left;\n    const offsetY = boundingRect.top;\n    const maxX = target.clientWidth;\n    const maxY = target.clientHeight;\n\n    const _x = (2 * (x - offsetX)) / maxX - 1;\n    const _y = (2 * (y - offsetY)) / maxY - 1;\n    const [r, phi] = xy2polar(_x, _y);\n    const [__x, __y] = polar2xy(Math.min(1, r), phi);\n    return [__x, __y];\n  }, []);\n\n  const _resetPosition = useCallback(() => {\n    if (lightColors.hs === undefined) {\n      _cursorPosition.current = undefined;\n      _localValue.current = undefined;\n      return;\n    }\n    _cursorPosition.current = _getCoordsFromValue(lightColors.hs);\n    _localValue.current = lightColors.hs;\n  }, [_getCoordsFromValue, lightColors.hs]);\n\n  useEffect(() => {\n    if (!supportsColor) return;\n    _resetPosition();\n  }, [lightColors.hs, _resetPosition, supportsColor]);\n\n  const setPressed = function (pressed: boolean, type?: string) {\n    _pressed.current = type;\n    if (!parentRef.current) return;\n    if (pressed) {\n      parentRef.current.setAttribute(\"pressed\", \"\");\n    } else {\n      parentRef.current.removeAttribute(\"pressed\");\n    }\n  };\n  const updateColours = useCallback(() => {\n    const rgb =\n      _localValue.current !== undefined\n        ? adjustRgb(\n            hsv2rgb([_localValue.current[0], _localValue.current[1], lightColors.colorBrightness ?? 255]),\n            lightColors.white,\n            lightColors.coolWhite,\n            lightColors.warmWhite,\n          )\n        : ([255, 255, 255] as [number, number, number]);\n    hex.current = rgb2hex(rgb);\n    if (circleRef.current) {\n      circleRef.current.style.fill = hex.current;\n      circleRef.current.style.visibility = _cursorPosition.current ? \"\" : \"hidden\";\n    }\n    if (gRef.current) {\n      gRef.current.style.fill = hex.current;\n    }\n  }, [lightColors.colorBrightness, lightColors.white, lightColors.coolWhite, lightColors.warmWhite]);\n\n  const setValue = useCallback(\n    (updatedValue?: [number, number]) => {\n      if (!parentRef.current || !updatedValue) return;\n      _cursorPosition.current = updatedValue;\n      parentRef.current.style.setProperty(\"--value-x\", disabled ? \"0\" : `${updatedValue[0]}`);\n      parentRef.current.style.setProperty(\"--value-y\", disabled ? \"0\" : `${updatedValue[1]}`);\n      _localValue.current = _getValueFromCoord(..._cursorPosition.current);\n      updateColours();\n      if (typeof onChange === \"function\")\n        onChange({\n          hex: hex.current as string,\n          rgb: hex2rgb(hex.current as string),\n          hs: _localValue.current,\n        });\n    },\n    [disabled, _getValueFromCoord, onChange, updateColours],\n  );\n\n  useEffect(() => {\n    const ref = parentRef.current;\n    return () => {\n      if (!ref) return;\n      ref.style.removeProperty(\"--value-x\");\n      ref.style.removeProperty(\"--value-y\");\n    };\n  }, []);\n\n  useEffect(() => {\n    if (!supportsColor || lightColors.hs === undefined) return;\n    _cursorPosition.current = _getCoordsFromValue(lightColors.hs);\n    setValue(_cursorPosition.current);\n  }, [lightColors.hs, supportsColor, setValue, _getCoordsFromValue]);\n\n  const _applyColor = useCallback(\n    (\n      color: LightColor,\n      params?: {\n        brightness_pct: number;\n      },\n    ) => {\n      entity.service.turnOn({\n        serviceData: {\n          ...color,\n          ...params,\n        },\n      });\n    },\n    [entity],\n  );\n\n  const _setRgbWColor = useCallback(\n    (rgbColor: [number, number, number]) => {\n      if (lightSupportsColorMode(entity, LIGHT_COLOR_MODES.RGBWW)) {\n        const rgbwwColor: [number, number, number, number, number] = entity.attributes.rgbww_color\n          ? [...entity.attributes.rgbww_color]\n          : [0, 0, 0, 0, 0];\n        const rgbww_color = rgbColor.concat(rgbwwColor.slice(3)) as [number, number, number, number, number];\n        _applyColor({ rgbww_color });\n      } else if (lightSupportsColorMode(entity, LIGHT_COLOR_MODES.RGBW)) {\n        const rgbwColor: [number, number, number, number] = entity.attributes.rgbw_color ? [...entity.attributes.rgbw_color] : [0, 0, 0, 0];\n        const rgbw_color = rgbColor.concat(rgbwColor.slice(3)) as [number, number, number, number];\n        _applyColor({ rgbw_color });\n      }\n    },\n    [entity, _applyColor],\n  );\n\n  const _adjustColorBrightness = useCallback((rgbColor: [number, number, number], value?: number, invert = false) => {\n    const isBlack = rgbColor.every((c) => c === 0);\n    if (isBlack) {\n      rgbColor[0] = 255;\n      rgbColor[1] = 255;\n      rgbColor[2] = 255;\n    }\n    if (value !== undefined && value !== 255) {\n      let ratio = value / 255;\n      if (invert) {\n        ratio = 1 / ratio;\n      }\n      rgbColor[0] = Math.min(255, Math.round(rgbColor[0] * ratio));\n      rgbColor[1] = Math.min(255, Math.round(rgbColor[1] * ratio));\n      rgbColor[2] = Math.min(255, Math.round(rgbColor[2] * ratio));\n    }\n    return rgbColor;\n  }, []);\n\n  const _updateColor = useCallback(\n    (value?: [number, number]) => {\n      if (!value) return;\n      const hs_color = [value![0], value![1] * 100] as [number, number];\n      const rgb_color = hs2rgb(value!);\n\n      if (lightSupportsColorMode(entity, LIGHT_COLOR_MODES.RGBWW) || lightSupportsColorMode(entity, LIGHT_COLOR_MODES.RGBW)) {\n        _setRgbWColor(\n          lightColors.colorBrightness ? _adjustColorBrightness(rgb_color, (lightColors.colorBrightness * 255) / 100) : rgb_color,\n        );\n      } else if (lightSupportsColorMode(entity, LIGHT_COLOR_MODES.RGB)) {\n        if (lightColors.brightnessAdjusted) {\n          const brightnessAdjust = (lightColors.brightnessAdjusted / 255) * 100;\n          const brightnessPercentage = Math.round(((entity.attributes.brightness || 0) * brightnessAdjust) / 255);\n          const ajustedRgbColor = _adjustColorBrightness(rgb_color, lightColors.brightnessAdjusted, true);\n          _applyColor({ rgb_color: ajustedRgbColor }, { brightness_pct: brightnessPercentage });\n        } else {\n          _applyColor({ rgb_color });\n        }\n      } else {\n        _applyColor({ hs_color });\n      }\n    },\n    [entity, _setRgbWColor, lightColors.colorBrightness, lightColors.brightnessAdjusted, _adjustColorBrightness, _applyColor],\n  );\n\n  const bind = useGesture(\n    {\n      onDrag: (state) => {\n        if (disabled) return;\n        _cursorPosition.current = _getPositionFromEvent(state.values, state.target as HTMLElement);\n        setValue(_cursorPosition.current);\n      },\n      onDragStart: (state) => {\n        if (disabled) return;\n        setPressed(true, state.type);\n        setValue(_cursorPosition.current);\n      },\n      onDragEnd: (state) => {\n        if (disabled) return;\n        setPressed(false, state.type);\n        _cursorPosition.current = _getPositionFromEvent(state.values, state.target as HTMLElement);\n        setValue(_cursorPosition.current);\n        if (typeof onChangeApplied === \"function\")\n          onChangeApplied({\n            hex: hex.current as string,\n            rgb: hex2rgb(hex.current as string),\n            hs: _localValue.current,\n          });\n        _updateColor(_localValue.current);\n      },\n      onClick: (state) => {\n        if (disabled) return;\n        setPressed(false, undefined);\n        const x = state.event.clientX;\n        const y = state.event.clientY;\n        _cursorPosition.current = _getPositionFromEvent([x, y], state.event.target as HTMLElement);\n        setValue(_cursorPosition.current);\n        if (typeof onChangeApplied === \"function\")\n          onChangeApplied({\n            hex: hex.current as string,\n            rgb: hex2rgb(hex.current as string),\n            hs: _localValue.current,\n          });\n        _updateColor(_localValue.current);\n      },\n    },\n    {\n      drag: {\n        filterTaps: true,\n      },\n    },\n  );\n\n  return supportsColor ? (\n    <ColorPickerWrapper\n      css={css`\n        ${cssStyles ?? \"\"}\n      `}\n      className={`${className ?? \"\"} color-picker`}\n      ref={parentRef}\n      {...bind()}\n    >\n      <div className={`container ${disabled ? \"disabled\" : \"\"}`}>\n        <canvas ref={canvasRef} width={canvasSize} height={canvasSize}></canvas>\n        <svg id=\"interaction\" viewBox={`0 0 ${RENDER_SIZE} ${RENDER_SIZE}`} overflow=\"visible\">\n          <defs>\n            <filter id=\"marker-shadow\" x=\"-50%\" y=\"-50%\" width=\"200%\" height=\"200%\" filterUnits=\"objectBoundingBox\">\n              <feDropShadow dx=\"0\" dy=\"1\" stdDeviation=\"2\" floodOpacity=\"0.3\" floodColor=\"rgba(0, 0, 0, 1)\" />\n              <feDropShadow dx=\"0\" dy=\"1\" stdDeviation=\"3\" floodOpacity=\"0.15\" floodColor=\"rgba(0, 0, 0, 1)\" />\n            </filter>\n          </defs>\n          <g\n            ref={gRef}\n            className=\"cursor\"\n            style={{\n              visibility: !isOn ? \"hidden\" : \"visible\",\n            }}\n          >\n            <circle ref={circleRef} cx=\"0\" cy=\"0\" r=\"16\"></circle>\n          </g>\n        </svg>\n      </div>\n    </ColorPickerWrapper>\n  ) : null;\n}\n\n/** This color picker was designed to easily retrieve a value from a color wheel based on values provided from a light entity, you can click or drag on the picker to pick a value, once applied the color wheel will automatically update your light entity, if the light entity provided does not support color it will not render at all */\nexport function ColorPicker(props: ColorPickerProps) {\n  return (\n    <ErrorBoundary {...fallback({ prefix: \"ColorPicker\" })}>\n      <InternalColorPicker {...props} />\n    </ErrorBoundary>\n  );\n}\n","import { localize, useEntity, type EntityName } from \"@hakit/core\";\nimport { fallback, Group, type GroupProps } from \"@components\";\nimport styled from \"@emotion/styled\";\nimport { useMemo } from \"react\";\nimport { ErrorBoundary } from \"react-error-boundary\";\n\nexport interface EntityAttributesProps extends Partial<GroupProps> {\n  /** the entity name to show the attributes for */\n  entity: EntityName;\n}\n\nconst Key = styled.div`\n  flex-grow: 1;\n`;\nconst Value = styled.div`\n  max-width: 60%;\n  overflow-wrap: break-word;\n  text-align: right;\n`;\nconst Entry = styled.div`\n  display: flex;\n  flex-direction: row;\n  justify-content: space-between;\n  width: 100%;\n  padding-bottom: 0.5rem;\n  border-bottom: 1px solid var(--ha-S400);\n`;\n\nfunction InternalEntityAttributes({ entity, title, ...rest }: EntityAttributesProps) {\n  const _entity = useEntity(entity);\n  const memoizedAttributes = useMemo(() => [...Object.entries(_entity.attributes), [\"state\", _entity.state]], [_entity]);\n\n  return (\n    <Group\n      collapsed\n      cssStyles={`\n    background-color: var(--ha-S300);\n    color: var(--ha-S300-contrast);\n    margin: 1rem 0;\n  `}\n      layout=\"column\"\n      alignItems=\"flex-start\"\n      title={title ?? localize(\"show_attributes\")}\n      {...rest}\n    >\n      {memoizedAttributes.map(([key, value]) => (\n        <Entry key={key}>\n          <Key>{key}</Key>\n          <Value>\n            {Array.isArray(value)\n              ? value.join(\", \")\n              : typeof value === \"object\" || typeof value === \"boolean\"\n                ? JSON.stringify(value)\n                : value}\n          </Value>\n        </Entry>\n      ))}\n    </Group>\n  );\n}\n\n/** A component that will render entity attributes in a simple table like display, This is useful for debugging or simply just wanting to visualize all the available properties and values.\n *\n * This is currently used in the Popup for all cards that support popups.\n */\nexport function EntityAttributes(props: EntityAttributesProps) {\n  return (\n    <ErrorBoundary {...fallback({ prefix: \"EntityAttributes\" })}>\n      <InternalEntityAttributes {...props} />\n    </ErrorBoundary>\n  );\n}\n","import { useEffect, memo } from \"react\";\nimport { css, Global } from \"@emotion/react\";\nimport { CSSInterpolation } from \"@emotion/serialize\";\nimport { isEqual, merge } from \"lodash\";\nimport { theme as defaultTheme } from \"./theme\";\nimport type { ThemeParams } from \"./theme\";\nimport { convertToCssVars } from \"./helpers\";\nimport { useBreakpoint, fallback, type BreakPoints, type BreakPointsWithXlg } from \"@components\";\nimport { ErrorBoundary } from \"react-error-boundary\";\nimport { LIGHT, DARK, ACCENT, DEFAULT_START_LIGHT, DEFAULT_START_DARK, DIFF, DEFAULT_THEME_OPTIONS } from \"./constants\";\nimport { useHass, type SupportedComponentOverrides } from \"@hakit/core\";\nimport { generateColumnBreakpoints } from \"./breakpoints\";\nimport createCache, { type Options } from \"@emotion/cache\";\nimport { CacheProvider } from \"@emotion/react\";\nimport weakMemoize from \"@emotion/weak-memoize\";\nimport { useThemeStore, type ThemeStore } from \"./store\";\n\ntype DeepPartial<T> = {\n  [K in keyof T]?: T[K] extends object ? DeepPartial<T[K]> : T[K];\n};\n\n// https://github.com/emotion-js/emotion/issues/760#issuecomment-404353706\nconst memoizedCreateCacheWithContainer = weakMemoize((options: Options) => {\n  return createCache(options);\n});\n\nfunction EmotionProvider({ children, options }: { children: React.ReactNode; options: Options }) {\n  return <CacheProvider value={memoizedCreateCacheWithContainer(options)}>{children}</CacheProvider>;\n}\n\nexport type ThemeProviderProps<T extends object> = ThemeStore[\"theme\"] & {\n  /** the theme properties */\n  theme?: DeepPartial<ThemeParams> & T;\n  /** Simple object to define some colors for for success, warning, info and error states, must be provided in [r,g,b] format [number, number, number] */\n  infoColors?: Partial<ThemeProviderInfoColors>;\n  /** any global style overrides */\n  globalStyles?: CSSInterpolation;\n  /** options to pass to the emotion cache provider, if an emotion cache is provided, or a different window context via HassConnect, you'll need to wrap your dashboard in the ThemeProvider\n   * otherwise the styles will not be applied correctly to child components.\n   * @example\n   * ```tsx\n   * <ThemeProvider emotionCache={{ key: \"my-key\", container: myContainer }}>\n   *  <App />\n   * </ThemeProvider>\n   */\n  emotionCache?: Options;\n  /** default breakpoint media query overrides @default {\n   * xxs: 600,\n   * xs: 900,\n   * sm: 1200,\n   * md: 1536,\n   * lg: 1700,\n   */\n  breakpoints?: BreakPoints;\n  /** styles to provide for a specific component type to override every instance */\n  globalComponentStyles?: Partial<Record<SupportedComponentOverrides, CSSInterpolation>>;\n  /** children to render within the ThemeProvider */\n  children?: React.ReactNode;\n};\n\nexport interface ThemeProviderInfoColors {\n  errorColor: [number, number, number];\n  warningColor: [number, number, number];\n  successColor: [number, number, number];\n  infoColor: [number, number, number];\n}\n\nconst INFO_COLORS: ThemeProviderInfoColors = {\n  errorColor: [219, 68, 55],\n  warningColor: [255, 166, 0],\n  successColor: [67, 160, 71],\n  infoColor: [3, 155, 229],\n};\n\nconst alphas = [0.1, 0.2, 0.3, 0.4, 0.5, 0.6, 0.7, 0.8, 0.9, 1];\n\nconst getLuminance = (rgb: number[], alpha: number): number => {\n  const [r, g, b] = rgb.map((value) => {\n    const channel = (value / 255) * alpha;\n    return channel <= 0.03928 ? channel / 12.92 : Math.pow((channel + 0.055) / 1.055, 2.4);\n  });\n  return 0.2126 * r + 0.7152 * g + 0.0722 * b;\n};\n\nconst getContrastColor = (rgb: number[], alpha: number): string => {\n  const luminance = getLuminance(rgb, alpha); // Scale luminance to 0-255 range\n  return luminance > 0.3 ? \"rgba(0, 0, 0, 1)\" : \"rgba(255, 255, 255, 1)\";\n};\n\nconst generateInfoColors = (infoColors = INFO_COLORS): string => {\n  return Object.entries(infoColors)\n    .map(([name, rgb]) =>\n      alphas\n        .map((alpha) => {\n          const suffix = alpha < 1 ? `-a${alpha * 10}` : \"\";\n          const varName = `--ha-${name\n            .replace(/([A-Z])/g, \"-$1\")\n            .toLowerCase()\n            .replace(\"-color\", \"\")}-color${suffix}`;\n          const contrastVarName = `${varName}-contrast`;\n          const rgba = `rgba(${rgb.join(\", \")}, ${alpha})`;\n          const contrastColor = getContrastColor([...rgb], alpha);\n          return `${varName}: ${rgba};\\n${contrastVarName}: ${contrastColor};`;\n        })\n        .join(\"\\n\"),\n    )\n    .join(\"\\n\");\n};\n\n// Function to generate light and dark variants\nconst generateVariantVars = (variants: string[], type: \"Light\" | \"Dark\", tint: number, darkMode: boolean): string => {\n  return variants\n    .map((variant, i) => {\n      const isLight = type === \"Light\";\n      const saturation = isLight\n        ? `calc(((var(--ha-s) - var(--mtc-light-s)) * var(--mtc-s-${variant}) + var(--mtc-light-s)) * 1%)`\n        : `calc(((1 - var(--mtc-s-${variant})) * 100 + var(--mtc-s-${variant}) * var(--ha-s)) * 1%)`;\n      const lightness = isLight\n        ? `calc(((var(--ha-l) - var(--mtc-light-l)) * var(--mtc-l-${variant}) + var(--mtc-light-l)) * 1%)`\n        : `calc(((1 - var(--mtc-l-${variant})) * var(--ha-l) * var(--ha-l) / 100 + var(--mtc-l-${variant}) * var(--ha-l)) * 1%)`;\n      const contrast = (alpha: number) =>\n        isLight\n          ? `hsla(0, 0%, calc(((((1 - var(--mtc-l-${variant})) * 100 + var(--mtc-l-${variant}) * var(--ha-l)) * 1%) - var(--ha-contrast-threshold, 50%)) * (-100)), ${alpha})`\n          : `hsla(0, 0%, calc(((((1 - var(--mtc-l-${variant})) * var(--ha-l) * var(--ha-l) / 100 + var(--mtc-l-${variant}) * var(--ha-l)) * 1%) - var(--ha-contrast-threshold, 50%)) * (-100)), ${alpha})`;\n\n      const baseLightness = darkMode ? DEFAULT_START_LIGHT : DEFAULT_START_DARK;\n      const indexOffset = !isLight ? LIGHT.length + 1 : 0;\n      const offsetBackground = darkMode ? baseLightness + DIFF * (i + indexOffset) : baseLightness - DIFF * (i + indexOffset);\n\n      const baseVars = `\n      --ha-${variant}-h: var(--ha-h);\n      --ha-${variant}-s: ${saturation};\n      --ha-${variant}-l: ${lightness};\n      `;\n      const varStyles = alphas\n        .map((alpha) => {\n          const suffix = alpha < 1 ? `-a${alpha * 10}` : \"\";\n          return `\n        --ha-${variant}${suffix}: hsla(var(--ha-${variant}-h), var(--ha-${variant}-s), var(--ha-${variant}-l), ${alpha});\n        --ha-${variant}${suffix}-contrast: ${contrast(alpha)};\n        --ha-S${variant}${suffix}: hsla(var(--ha-h), calc(var(--ha-${variant}-s) * ${tint}), ${offsetBackground}%, ${alpha});\n        --ha-S${variant}${suffix}-contrast: hsla(var(--ha-h), calc(var(--ha-${variant}-s) * ${tint}), calc(((100% - ${offsetBackground}%) + ${indexOffset} * 10%)), ${alpha});`;\n        })\n        .join(\"\");\n\n      return `\n        ${baseVars}\n        ${varStyles}\n        `;\n    })\n    .join(\"\");\n};\n\n// Function to generate accent variants\nconst generateAccentVars = (variants: string[], tint: number, darkMode: boolean): string => {\n  return variants\n    .map((variant, i) => {\n      const indexOffset = LIGHT.length + 1 + DARK.length;\n      const baseLightness = darkMode ? DEFAULT_START_LIGHT : DEFAULT_START_DARK;\n      const offsetBackground = darkMode ? baseLightness + DIFF * (indexOffset + i) : baseLightness - DIFF * (indexOffset + i);\n\n      const baseVars = `\n        --ha-${variant}-h: calc(var(--ha-h) * var(--mtc-h-${variant}));\n        --ha-${variant}-s: calc(var(--mtc-s-${variant}) * 100%);\n        --ha-${variant}-l: calc(var(--mtc-l-${variant}) * 100%);\n      `;\n      const varStyles = alphas\n        .map((alpha) => {\n          const suffix = alpha < 1 ? `-a${alpha * 10}` : \"\";\n          return `\n          --ha-${variant}${suffix}: hsla(var(--ha-${variant}-h), var(--ha-${variant}-s), var(--ha-${variant}-l), ${alpha});\n          --ha-S${variant}${suffix}: hsla(var(--ha-h), calc(var(--ha-${variant}-s) * ${tint}), ${offsetBackground}%, ${alpha});\n          --ha-S${variant}${suffix}-contrast: hsla(var(--ha-${variant}-s), calc(var(--ha-${variant}-s) * ${tint}), calc(((100% - ${offsetBackground}%))), ${alpha});`;\n        })\n        .join(\"\");\n\n      return `\n        ${baseVars}\n        ${varStyles}\n        `;\n    })\n    .join(\"\");\n};\n\n// Main function to generate all variables\nconst generateAllVars = (tint: number, infoColors: typeof INFO_COLORS, darkMode: boolean): string => {\n  const lightVars = generateVariantVars(LIGHT, \"Light\", tint, darkMode);\n  const darkVars = generateVariantVars(DARK, \"Dark\", tint, darkMode);\n  const accentVars = generateAccentVars(ACCENT, tint, darkMode);\n  const baseLightness = darkMode ? DEFAULT_START_LIGHT : DEFAULT_START_DARK;\n  const offsetBackground = darkMode ? baseLightness + DIFF * 5 : baseLightness - DIFF * 5;\n\n  const varStyles = alphas\n    .map((alpha) => {\n      const suffix = alpha < 1 ? `-a${alpha * 10}` : \"\";\n      return `\n      --ha-500${suffix}-contrast: hsla(0, 0%, calc(((var(--ha-l) * 1%) - var(--ha-contrast-threshold, 50%)) * (-100)), ${alpha});\n      --ha-S500${suffix}: hsla(var(--ha-h), calc(var(--ha-500-s) * ${tint}), ${offsetBackground}%, ${alpha});\n      --ha-S500${suffix}-contrast: hsla(var(--ha-h), calc(var(--ha-500-s) * ${tint}), calc(((100% - ${offsetBackground}%))), ${alpha});\n    `;\n    })\n    .join(\"\");\n\n  return `\n    ${generateInfoColors(infoColors)}\n    ${lightVars}\n    --ha-500-h: var(--ha-h);\n    --ha-500-s: calc(var(--ha-s) * 1%);\n    --ha-500-l: calc(var(--ha-l) * 1%);\n    --ha-500: var(--ha);\n    ${varStyles}\n    ${darkVars}\n    ${accentVars}\n  `;\n};\n\nfunction omitXlg(breakpoints: BreakPointsWithXlg): BreakPoints {\n  // eslint-disable-next-line @typescript-eslint/no-unused-vars\n  const { xlg, ...rest } = breakpoints;\n  return rest;\n}\n\nconst InternalThemeProvider = memo(function InternalThemeProvider<T extends object>({\n  theme,\n  darkMode,\n  tint: t,\n  hue: h,\n  saturation: s,\n  lightness: l,\n  contrastThreshold: c,\n  breakpoints,\n  globalStyles,\n  globalComponentStyles,\n  emotionCache,\n  infoColors = INFO_COLORS,\n  children,\n}: ThemeProviderProps<T>): React.ReactNode {\n  const themeStore = useThemeStore((store) => store.theme);\n  const setTheme = useThemeStore((store) => store.setTheme);\n  const setBreakpoints = useThemeStore((store) => store.setBreakpoints);\n  const setGlobalComponentStyles = useHass((store) => store.setGlobalComponentStyles);\n  const _breakpoints = useThemeStore((store) => store.breakpoints);\n  const device = useBreakpoint();\n  const windowContext = useHass((store) => store.windowContext);\n  const win = windowContext ?? window;\n\n  useEffect(() => {\n    if (globalComponentStyles) {\n      setGlobalComponentStyles(globalComponentStyles);\n    }\n  }, [setGlobalComponentStyles, globalComponentStyles]);\n\n  useEffect(() => {\n    const theme = {\n      hue: h,\n      lightness: l,\n      tint: t,\n      saturation: s,\n      darkMode: darkMode,\n      contrastThreshold: c,\n    } satisfies ThemeStore[\"theme\"];\n    setTheme(theme);\n  }, [c, darkMode, h, l, s, t, setTheme]);\n\n  const colorScheme = themeStore.darkMode ? \"dark\" : \"light\";\n\n  useEffect(() => {\n    if (typeof breakpoints !== \"undefined\") {\n      if (!isEqual(breakpoints, omitXlg(_breakpoints))) {\n        setBreakpoints(breakpoints);\n      }\n    }\n  }, [setBreakpoints, breakpoints, _breakpoints]);\n\n  useEffect(() => {\n    Object.entries(device).forEach(([breakpointKey, active]) => {\n      const className = `bp-${breakpointKey}`;\n      const container = emotionCache?.container ?? null;\n      let body = container ? (container.ownerDocument?.body ?? null) : win.document.body;\n      if (!body) {\n        console.error(\n          \"No valid <body> element found. Falling back to document.body. Ensure that emotionCache.container is a node within a document.\",\n        );\n        body = win.document.body;\n      }\n      if (active) {\n        body.classList.add(className);\n      } else {\n        body.classList.remove(className);\n      }\n    });\n  }, [device, win, emotionCache]);\n\n  return (\n    <EmotionProvider\n      options={\n        emotionCache ?? {\n          key: \"hakit\",\n          container: win.document.head,\n        }\n      }\n    >\n      <Global\n        styles={css`\n          :root {\n            ${convertToCssVars(merge(defaultTheme, theme))}\n            --is-dark-theme: ${themeStore.darkMode ? \"1\" : \"0\"};\n            color-scheme: ${colorScheme};\n            --ha-easing: cubic-bezier(0.25, 0.46, 0.45, 0.94);\n            --ha-transition-duration: 0.25s;\n            --ha-area-card-expanded-offset: 0;\n            --ha-background-opaque: ${themeStore.darkMode\n              ? `hsla(var(--ha-h), calc(var(--ha-s) * 1%), 10%, 0.9)`\n              : `hsla(var(--ha-h), calc(var(--ha-s) * 1%), 20%, 0.7)`};\n          }\n\n          :root {\n            --ha-h: ${themeStore.hue};\n            --ha-s: ${themeStore.saturation};\n            --ha-l: ${themeStore.lightness};\n            --ha-contrast-threshold: ${themeStore.contrastThreshold}%;\n            --ha-so: calc(var(--ha-s) * 1%);\n            --ha: hsla(var(--ha-h), calc(var(--ha-s) * 1%), calc(var(--ha-l) * 1%), 100%);\n            --mtc-h-A100: 1;\n            --mtc-h-A200: 1;\n            --mtc-h-A400: 1;\n            --mtc-h-A700: 1.01;\n            --mtc-s-50: 0.91;\n            --mtc-s-100: 0.98;\n            --mtc-s-200: 0.96;\n            --mtc-s-300: 0.95;\n            --mtc-s-400: 0.96;\n            --mtc-s-600: 1;\n            --mtc-s-700: 0.99;\n            --mtc-s-800: 0.89;\n            --mtc-s-900: 0.86;\n            --mtc-s-A100: 0.89;\n            --mtc-s-A200: 0.98;\n            --mtc-s-A400: 0.97;\n            --mtc-s-A700: 0.95;\n            --mtc-l-50: 0.12;\n            --mtc-l-100: 0.3;\n            --mtc-l-200: 0.5;\n            --mtc-l-300: 0.7;\n            --mtc-l-400: 0.86;\n            --mtc-l-600: 0.87;\n            --mtc-l-700: 0.66;\n            --mtc-l-800: 0.45;\n            --mtc-l-900: 0.16;\n            --mtc-l-A100: 0.76;\n            --mtc-l-A200: 0.64;\n            --mtc-l-A400: 0.49;\n            --mtc-l-A700: 0.44;\n            --mtc-light-h: 0;\n            --mtc-light-s: 0;\n            --mtc-light-l: 100;\n\n            ${generateAllVars(\n              themeStore.tint ?? DEFAULT_THEME_OPTIONS.tint,\n              {\n                ...INFO_COLORS,\n                ...infoColors,\n              },\n              themeStore.darkMode ?? DEFAULT_THEME_OPTIONS.darkMode,\n            )}\n          }\n\n          * {\n            box-sizing: border-box;\n            scrollbar-width: thin;\n            scrollbar-color: var(--ha-S500) var(--ha-S200);\n            font-family: var(--ha-font-family);\n            ::-webkit-scrollbar-corner {\n              background: rgba(0, 0, 0, 0.5);\n            }\n\n            /* Works on Chrome, Edge, and Safari */\n            &::-webkit-scrollbar {\n              width: 12px;\n              height: 12px;\n            }\n\n            &::-webkit-scrollbar-track {\n              background: var(--ha-S200); // track background color\n            }\n\n            &::-webkit-scrollbar-thumb {\n              background-color: var(--ha-S500);\n              border-radius: 20px;\n              border: 3px solid var(--ha-S200);\n            }\n          }\n\n          html,\n          body {\n            height: 100%;\n            width: 100%;\n            margin: 0;\n            padding: 0;\n          }\n          body {\n            -webkit-font-smoothing: antialiased;\n            -webkit-tap-highlight-color: transparent;\n            -webkit-overflow-scrolling: touch;\n            -moz-osx-font-smoothing: grayscale;\n            scroll-behavior: smooth;\n            background-color: var(--ha-S100);\n            font-family: var(--ha-font-family);\n            font-size: var(--ha-font-size);\n            color: var(--ha-S100-contrast);\n            overflow-x: hidden;\n            overflow-y: var(--ha-hide-body-overflow-y, inherit);\n          }\n          ${generateColumnBreakpoints(_breakpoints)}\n          ${globalStyles ?? \"\"}\n        `}\n      />\n      {children && children}\n    </EmotionProvider>\n  );\n});\n/**\n * A simple way of creating global styles and providing re-usable css variables to re-use across your application\n *\n * There's very little css shipped with this ThemeProvider, the main purpose of this provider is to create the css variables used for all components across @hakit/components, however it does ship with some base css to the body, html and scrollbars.\n * */\nexport function ThemeProvider<T extends object>(props: ThemeProviderProps<T>) {\n  return (\n    <ErrorBoundary {...fallback({ prefix: \"ThemeProvider\" })}>\n      <InternalThemeProvider {...props} />\n    </ErrorBoundary>\n  );\n}\n","import { useState, useEffect } from \"react\";\nimport { Column, RangeSlider, Row, FabCard, Tooltip, Alert } from \"@components\";\nimport styled from \"@emotion/styled\";\nimport { LIGHT, DARK, ACCENT } from \"./constants\";\nimport { useDebouncedCallback } from \"use-debounce\";\nimport { capitalize } from \"lodash\";\nimport { useThemeStore, type ThemeStore } from \"./store\";\n\nconst Title = styled.span`\n  font-size: 0.9rem;\n  color: var(--ha-S100-contrast);\n`;\n\nconst Pallette = styled(Row)`\n  font-size: 0.8rem;\n  width: 3.5rem;\n  height: 3.5rem;\n`;\n\nconst RangeSliderBox = styled.div`\n  padding: 0.5rem;\n  width: 100%;\n  background-color: var(--ha-S100);\n  border-radius: 0.5rem;\n`;\n\nexport function ThemeControls() {\n  const theme = useThemeStore((state) => state.theme);\n  const setTheme = useThemeStore((state) => state.setTheme);\n  const { hue, saturation, lightness, tint, contrastThreshold, darkMode } = theme;\n  const [h, setHue] = useState(hue);\n  const [l, setLight] = useState(lightness);\n  const [t, setTint] = useState(tint);\n  const [s, setSat] = useState(saturation);\n  const [dark, setDark] = useState(darkMode);\n  const [c, setContrastThreshold] = useState(contrastThreshold);\n\n  const debouncedOnChange = useDebouncedCallback(\n    (_theme: ThemeStore[\"theme\"]) => {\n      setTheme(_theme);\n    },\n    50,\n    {\n      trailing: true,\n      leading: true,\n    },\n  );\n\n  useEffect(() => {\n    debouncedOnChange({\n      hue: h,\n      saturation: s,\n      lightness: l,\n      tint: t,\n      contrastThreshold: c,\n      darkMode: dark,\n    });\n  }, [c, contrastThreshold, dark, darkMode, h, hue, l, lightness, debouncedOnChange, s, saturation, t, tint]);\n\n  return (\n    <Column\n      fullWidth\n      gap=\"1rem\"\n      wrap=\"nowrap\"\n      style={{\n        padding: \"1rem 0\",\n      }}\n    >\n      <Row fullWidth gap=\"1rem\" wrap=\"nowrap\">\n        <RangeSliderBox>\n          <RangeSlider\n            label=\"Shade Tint\"\n            description=\"Will change the hue tint for the shade colors\"\n            min={0}\n            max={1}\n            step={0.05}\n            value={t}\n            onChangeComplete={(value) => {\n              setTint(value);\n            }}\n          />\n        </RangeSliderBox>\n        <RangeSliderBox>\n          <RangeSlider\n            label=\"Contrast Threshold\"\n            description=\"Changes output calculation for text color\"\n            min={0}\n            max={100}\n            step={1}\n            value={c}\n            onChangeComplete={(value) => {\n              setContrastThreshold(value);\n            }}\n          />\n        </RangeSliderBox>\n      </Row>\n      <Row fullWidth gap=\"1rem\" wrap=\"nowrap\">\n        <RangeSliderBox>\n          <RangeSlider\n            label=\"Saturation\"\n            description=\"Control the saturation of the color\"\n            min={0}\n            max={100}\n            value={s}\n            onChangeComplete={(value) => {\n              setSat(value);\n            }}\n          />\n        </RangeSliderBox>\n        <RangeSliderBox>\n          <RangeSlider\n            label=\"Lightness\"\n            description=\"Control how bright the primary colors are\"\n            min={0}\n            max={100}\n            value={l}\n            onChangeComplete={(value) => {\n              setLight(value);\n            }}\n          />\n        </RangeSliderBox>\n      </Row>\n      <RangeSliderBox>\n        <RangeSlider\n          label=\"Hue\"\n          description=\"Change the overall hue of the colors\"\n          min={0}\n          max={360}\n          value={h}\n          onChangeComplete={(value) => {\n            setHue(value);\n          }}\n        />\n      </RangeSliderBox>\n\n      <Row justifyContent=\"flex-start\" fullWidth gap=\"1rem\">\n        <Title>Dark / Light mode</Title>\n        <FabCard\n          tooltipPlacement=\"right\"\n          title={dark ? \"Change to light mode\" : \"Change to dark mode\"}\n          icon={!dark ? \"ph:sun\" : \"ph:moon\"}\n          onClick={() => {\n            setDark(!dark);\n          }}\n        />\n      </Row>\n      <Row justifyContent=\"flex-start\" fullWidth>\n        <Alert>Hover over the pallette&apos;s below to see the respective css variables.</Alert>\n      </Row>\n      <Row wrap=\"nowrap\" fullWidth justifyContent=\"flex-start\">\n        {LIGHT.map((color, index) => {\n          return (\n            <Column gap=\"1rem\" key={color}>\n              <Title>{index === 0 ? \"Primary\" : <>&nbsp;</>}</Title>\n              <Tooltip\n                placement=\"top\"\n                title={\n                  <Column alignItems=\"flex-start\">\n                    <span>background-color: var(--ha-{color});</span>\n                    <span>color: var(--ha-{color}-contrast);</span>\n                  </Column>\n                }\n              >\n                <Pallette\n                  style={{\n                    color: `var(--ha-${color}-contrast)`,\n                    backgroundColor: `var(--ha-${color})`,\n                  }}\n                >\n                  {color}\n                </Pallette>\n              </Tooltip>\n              <Title>{index === 0 ? \"Shade\" : <>&nbsp;</>}</Title>\n              <Tooltip\n                placement=\"top\"\n                title={\n                  <Column alignItems=\"flex-start\">\n                    <span>background-color: var(--ha-S{color});</span>\n                    <span>color: var(--ha-S{color}-contrast);</span>\n                  </Column>\n                }\n              >\n                <Pallette\n                  style={{\n                    color: `var(--ha-S${color}-contrast)`,\n                    backgroundColor: `var(--ha-S${color})`,\n                  }}\n                >\n                  S{color}\n                </Pallette>\n              </Tooltip>\n            </Column>\n          );\n        })}\n        <Column gap=\"1rem\">\n          <Title>{<>&nbsp;</>}</Title>\n          <Tooltip\n            placement=\"top\"\n            title={\n              <Column alignItems=\"flex-start\">\n                <span>background-color: var(--ha-500);</span>\n                <span>color: var(--ha-500-contrast);</span>\n              </Column>\n            }\n          >\n            <Pallette\n              style={{\n                transform: \"scale(1.1)\",\n                transformOrigin: \"bottom\",\n                color: `var(--ha-500-contrast)`,\n                backgroundColor: `var(--ha-500)`,\n              }}\n            >\n              500\n            </Pallette>\n          </Tooltip>\n          <Title>{<>&nbsp;</>}</Title>\n          <Tooltip\n            placement=\"top\"\n            title={\n              <Column alignItems=\"flex-start\">\n                <span>background-color: var(--ha-S500);</span>\n                <span>color: var(--ha-S500-contrast);</span>\n              </Column>\n            }\n          >\n            <Pallette\n              style={{\n                transform: \"scale(1.1)\",\n                transformOrigin: \"top\",\n                color: `var(--ha-S500-contrast)`,\n                backgroundColor: `var(--ha-S500)`,\n              }}\n            >\n              S500\n            </Pallette>\n          </Tooltip>\n        </Column>\n        {DARK.map((color) => {\n          return (\n            <Column key={color} gap=\"1rem\">\n              <Title>{<>&nbsp;</>}</Title>\n              <Tooltip\n                placement=\"top\"\n                title={\n                  <Column alignItems=\"flex-start\">\n                    <span>background-color: var(--ha-{color});</span>\n                    <span>color: var(--ha-{color}-contrast);</span>\n                  </Column>\n                }\n              >\n                <Pallette\n                  style={{\n                    color: `var(--ha-${color}-contrast)`,\n                    backgroundColor: `var(--ha-${color})`,\n                  }}\n                >\n                  {color}\n                </Pallette>\n              </Tooltip>\n              <Title>{<>&nbsp;</>}</Title>\n              <Tooltip\n                placement=\"top\"\n                title={\n                  <Column alignItems=\"flex-start\">\n                    <span>background-color: var(--ha-S{color});</span>\n                    <span>color: var(--ha-S{color}-contrast);</span>\n                  </Column>\n                }\n              >\n                <Pallette\n                  style={{\n                    color: `var(--ha-S${color}-contrast)`,\n                    backgroundColor: `var(--ha-S${color})`,\n                  }}\n                >\n                  S{color}\n                </Pallette>\n              </Tooltip>\n            </Column>\n          );\n        })}\n      </Row>\n      <Row fullWidth justifyContent=\"flex-start\">\n        {ACCENT.map((color, index) => {\n          return (\n            <Column key={color} gap=\"1rem\">\n              <Title>{index === 0 ? \"Accent\" : <>&nbsp;</>}</Title>\n              <Tooltip\n                placement=\"top\"\n                title={\n                  <Column alignItems=\"flex-start\">\n                    <span>background-color: var(--ha-{color});</span>\n                    <span>color: var(--ha-{color}-contrast);</span>\n                  </Column>\n                }\n              >\n                <Pallette\n                  style={{\n                    color: `var(--ha-${color}-contrast)`,\n                    backgroundColor: `var(--ha-${color})`,\n                  }}\n                >\n                  {color}\n                </Pallette>\n              </Tooltip>\n              <Title>{index === 0 ? \"Shade\" : <>&nbsp;</>}</Title>\n              <Tooltip\n                placement=\"top\"\n                title={\n                  <Column alignItems=\"flex-start\">\n                    <span>background-color: var(--ha-S{color});</span>\n                    <span>color: var(--ha-S{color}-contrast);</span>\n                  </Column>\n                }\n              >\n                <Pallette\n                  style={{\n                    color: `var(--ha-S${color}-contrast)`,\n                    backgroundColor: `var(--ha-S${color})`,\n                  }}\n                >\n                  S{color}\n                </Pallette>\n              </Tooltip>\n            </Column>\n          );\n        })}\n      </Row>\n\n      {[\"info\", \"success\", \"error\", \"warning\"].map((color, _index) => {\n        return (\n          <Row fullWidth justifyContent=\"flex-start\" key={_index}>\n            {[0.1, 0.2, 0.3, 0.4, 0.5, 0.6, 0.7, 0.8, 0.9, 1].map((shade, index) => {\n              const suffix = shade === 1 ? \"\" : `-a${index + 1}`;\n              return (\n                <Column gap=\"1rem\" key={`${shade}-${color}-${_index}`}>\n                  <Title>{index === 0 ? capitalize(color) : <>&nbsp;</>}</Title>\n                  <Tooltip\n                    placement=\"top\"\n                    title={\n                      <Column alignItems=\"flex-start\">\n                        <span>\n                          background-color: var(--ha-{color}-color{suffix});\n                        </span>\n                        <span>\n                          color: var(--ha-{color}-color{suffix}-contrast);\n                        </span>\n                      </Column>\n                    }\n                  >\n                    <Pallette\n                      style={{\n                        color: `var(--ha-${color}-color${suffix}-contrast)`,\n                        backgroundColor: `var(--ha-${color}-color${suffix})`,\n                      }}\n                    >\n                      {suffix}\n                      {shade === 1 ? shade : \"\"}\n                    </Pallette>\n                  </Tooltip>\n                </Column>\n              );\n            })}\n          </Row>\n        );\n      })}\n    </Column>\n  );\n}\n","import { useState } from \"react\";\nimport styled from \"@emotion/styled\";\nimport { FabCard, Modal } from \"@components\";\nimport { ThemeControls } from \"./ThemeControls\";\nimport { localize } from \"@hakit/core\";\n\nconst ThemeControlsBox = styled.div`\n  position: fixed;\n  top: 1rem;\n  right: 1rem;\n  z-index: 1;\n`;\n\nexport function ThemeControlsModal() {\n  const [open, setOpen] = useState(false);\n  return (\n    <>\n      <ThemeControlsBox>\n        <FabCard onClick={() => setOpen(true)} tooltipPlacement=\"left\" title={localize(\"theme\")} icon=\"mdi:color\" />\n      </ThemeControlsBox>\n      <Modal\n        description=\"This interface showcases how the colors will behave and provides easy to access css variables\"\n        open={open}\n        title={localize(\"theme\")}\n        onClose={() => {\n          setOpen(false);\n        }}\n      >\n        <ThemeControls />\n      </Modal>\n    </>\n  );\n}\n"],"names":["useBreakpoint","breakpoints","useThemeStore","store","win","useHass","windowContext","window","queries","useMemo","getBreakpoints","matches","setMatches","useState","Object","fromEntries","allBreakpoints","map","bp","useEffect","context","mqlMap","Map","updateMatches","newMatches","get","query","mql","matchMedia","set","addEventListener","values","removeEventListener","weakMemoize","func","cache","arg","ret","getBaseElement","as","onlyFunctionality","_styled","process","env","NODE_ENV","target","label","shouldForwardProp","prop","isValidProp","props","disableActiveState","StyledRipples","jsx","Ripples","name","styles","toString","_EMOTION_STRINGIFIED_CSS_ERROR__","Trigger","DEFAULT_SIZES","xxs","xs","sm","md","lg","xlg","CardBaseInternal","entity","_entity","title","_title","active","service","serviceData","children","disabled","longPressCallback","onClick","disableModal","modalProps","disableRipples","disableScale","id","className","cssStyles","style","borderRadius","rippleProps","disableColumns","refCallback","key","relatedEntities","features","featureBarProps","graph","resizeDetectorProps","triggerClass","rest","_id","useId","globalComponentStyle","state","globalComponentStyles","openModal","setOpenModal","domain","computeDomain","useEntity","returnNullIfNotFound","internalRef","useRef","width","useResizeDetector","refreshMode","refreshRate","handleHeight","skipOnMount","targetRef","graphEntity","historyOptions","disable","isUnavailable","isUnavailableState","_borderRadius","StyledElement","bind","useLongPress","e","current","classList","remove","threshold","cancelOnMovement","cancelOutsideElement","filterEvents","button","onClickHandler","useCallback","event","caller","attributes","friendly_name","startCase","lowerCase","columnClassNames","mergedGrids","entries","reduce","acc","value","inputValue","join","filteredRelatedEntities","Children","toArray","filter","child","isValidElement","filteredFeaturedEntities","featuredElements","index","cloneElement","hasFeatures","length","featureBar","ButtonBar","calculateSvgHeight","parentWidth","aspectRatio","SVG_WIDTH","SVG_HEIGHT","adjustGraphSpaceBy","svgHeight","_classes","x","handlePointerDown","add","handlePointerUp","jsxs","Fragment","ref","css","cardBase","history","loading","Alert","localize","coordinates","SvgGraph","createElement","ModalByEntityDomain","onClose","open","CardBase","memo","ErrorBoundary","fallback","prefix","RelatedEntityEl","margin","padding","position","InternalRelatedEntity","icon","_icon","iconProps","render","iconElement","useIcon","domainIcon","useIconByDomain","entityIcon","useIconByEntity","RelatedEntity","_FeatureEntity","ButtonBarButton","preventPropagation","FeatureEntity","TooltipSpan","placement","InternalTooltip","offsetX","offsetY","tooltipRef","childRef","portalRoot","show","setShow","calculatePosition","el","childRect","getBoundingClientRect","top","left","height","right","bottom","setTimeout","opacity","visibility","handleMouseEnter","handleHide","tooltipEl","setAttribute","_unknown","document","createPortal","body","Tooltip","fallbackRender","error","resetErrorBoundary","message","StyledButtonCard","Contents","ToggleState","Toggle","Fab","brightness","LayoutBetween","Footer","Title","Description","InternalButtonCard","fabProps","description","layoutType","hideIcon","hideState","hideLastUpdated","hideDetails","hideToggle","customRenderState","formatter","iconNode","isDefaultLayout","undefined","isSlimLayout","on","entity_id","renderState","ON","OFF","attributeValue","stateValue","stateNode","separatorNode","descriptionSeparator","buildDescriptionContent","main","hasHeaderContent","buttonCard","marginBottom","custom","backgroundColor","rgbaColor","color","rgbColor","Column","relativeTime","ButtonCard","defaultColumns","RangeSliderParent","StyledRange","mq","handleSize","size","Label","InternalRangeSlider","_value","onChange","formatTooltipValue","hideTooltip","tooltipSize","min","_min","max","_max","step","_step","debounceThrottleValue","debounceType","onChangeComplete","setValue","setActive","rangeRef","parentRangeRef","parseFloat","roundedValue","valueAsNumber","toFixed","Math","abs","log10","percentage","tooltipValue","debouncedOnChange","useDebouncedCallback","useThrottledCallback","leading","trailing","RangeSlider","boxStyle","display","overflow","StyledRipple","ParentRipple","_Ripples","duration","rippleRef","timeoutId","clearTimeout","stopPropagation","pageX","pageY","currentTarget","rect","xMultiplier","scrollX","yMultiplier","scrollY","newStyles","isNaN","transform","transition","assign","displayName","StyledTriggerCard","ToggleMessage","hideArrow","Gap","InternalTriggerCard","_disabled","sliderIconProps","sliderIcon","_sliderIcon","sliderTextActive","sliderTextInactive","activeStateDuration","timeRef","powerIcon","arrowIcon","fontSize","useApiHandler","triggerCard","search","replace","computeDomainTitle","device_class","TriggerCard","StyledGroup","collapsed","collapsible","Header","InternalGroup","gap","justifyContent","alignItems","layout","_collapsed","setCollapsed","cssProps","onCollapseComplete","onHeaderClick","AutoHeight","Row","Group","Card","SubTitle","StyledIcon","Icon","LocationIcon","splitForecastsIntoRows","arr","rowCount","maxItemsPerRow","maxItems","limitedArray","slice","result","start","i","groupSize","ceil","push","Forecast","ForecastIcon","Day","Time","Temperature","TemperatureLow","FORECAST_ITEM_PROJECTED_WIDTH","InternalWeatherCard","temperatureSuffix","includeTitle","includeForecast","includeCurrent","includeTime","includeDay","details","apparentTemperatureAttribute","forecastType","forecastRows","allowForecastToggle","config","setWidth","itemsToRender","floor","timeZone","setTimeZone","s","shouldAmPm","helpers","dateTime","shouldUseAmPm","type","setType","weather","useWeather","getIconByEntity","temperature","temperature_unit","time_zone","supportedForecasts","getSupportedForecastTypes","weatherDetails","humidity","wind_speed","wind_speed_unit","additional","getAdditionalWeatherInformation","apparent_temperature","feelsLikeBase","feelsLike","forcastRowArrs","forecast","genForecastRows","forecastForRow","rowIdx","dateObj","Date","datetime","dayDisplay","formatDateWeekdayShort","hourNumeric","formatHour","suffix","formatAmPmSuffix","hourDisplay","condition","templow","onResize","_width","weatherCard","WeatherCardDetail","round","WeatherCard","DetailsRow","State","InternalWeatherCardDetail","unit_of_measurement","SvgGarbageBin","React","ASPECT_RATIO","Bin","textColor","iconColor","BinBox","VerticalText","text","newWidth","newHeight","textRef","setFontSize","resizeText","textLength","getComputedTextLength","oldFontSize","InternalGarbageCollectionCard","schedules","svg","dateSensor","defaultSVGProperties","today","getDay","currentWeek","getDate","dayNames","renderBin","bin","GarbageBin","formatTimeDisplay","days","findNextNonNullWeek","weeks","startWeek","collections","flatMap","schedule","daysUntilCollection","toLowerCase","indexOf","day","futureDate","setDate","bins","nextWeekIndex","frequency","nextBins","timeUntilCollection","hideNextCollection","nextFutureDate","incrementDays","daysUntilNextCollection","nextCollectionTime","garbageCollectionCard","marginTop","collection","GarbageCollectionCard","DEFAULT_TIME_FORMAT","DEFAULT_DATE_FORMAT","customFormatter","createDateFormatter","InternalTimeCard","timeEntity","dateEntity","timeFormat","dateFormat","throttleTime","hideDate","hideTime","center","currentTime","setCurrentTime","locale","language","formatDateWeekday","formatDateMonth","formatDateYear","formatTime","previousTimeRef","now","requestRef","timeSensor","dateIcon","formatted","amOrPm","raw","h","m","split","Number","entityDate","setHours","timeStr","match","hasOnClick","haFormatter","date","format","opts","timezone","timeValue","AmOrPm","console","dateValue","parts","d","daySuffix","updateClock","elapsed","requestAnimationFrame","needTicker","cancelAnimationFrame","timeCard","_","TimeCard","StyledAreaCard","PictureCardFooter","NavBar","FullScreen","ChildContainer","_ref","InternalAreaCard","hash","image","preloadProps","idRef","addRoute","getRoute","getState","dynamicHash","isPressed","useKeyPress","setOpen","route","location","Global","FabCard","areaCard","PreloadImage","AreaCard","StyledVacuumCard","StyledVacuumImage","VacuumImage","InternalVacuumCard","shortcuts","hideCurrentBatteryLevel","hideUpdated","hideToolbar","customImage","locatingNode","flash","setFlash","titleValue","status","locateFlash","getToolbarActions","onLocate","stateTitle","vacuumCard","feature","VacuumCard","StyledPictureCard","Inner","_PictureCard","PictureCard","StyledFabCard","hasChildren","InternalFabCard","tooltipPlacement","noIcon","_active","fabCard","FamilyBaseCard","FamilyCardContent","getColumnSizeCSS","InternalFamilyCard","len","count","childrenWithKeys","some","familyCard","FamilyCard","PersonBaseCard","PersonCardContent","UserAvatarDiv","withBorder","UserAvatarStateIcon","NameAndState","UserAvatar","iconSize","avatarSize","stateIcon","person","joinHassUrl","userImage","url","entity_picture","startsWith","userIcon","renderedStateIcon","InternalPersonCard","personStateMap","_personStateMap","home","not_home","stateText","personCard","PersonCard","StyledTimeCard","StyledSidebarCard","Menu","Divider","HamburgerMenu","Filler","StyledWeatherCard","WeatherCardCustom","InternalSidebarCard","weatherCardProps","timeCardProps","startOpen","tooltipsWhenClosed","menuItems","autoIncludeRoutes","includeTimeCard","sortSidebarMenuItems","routes","devices","concatenatedMenuItems","mappedRoutes","items","sort","maxWidth","flexDirection","item","innerItemContent","SidebarCard","SLIDER_MODES","auto","cool","dry","fan_only","heat","heat_cool","off","Wrapper","ClimateControlSlider","targetTempStep","showCurrent","_targetTemperature","setTargetTemperature","_selectTargetTemperature","setSelectTargetTemperature","min_temp","max_temp","target_temp_step","hvac_modes","unit_system","UNIT_F","low","target_temp_low","high","target_temp_high","supportsTargetTemperature","supportsFeatureFromAttributes","ClimateEntityFeature","TARGET_TEMPERATURE","supportsTargetTemperatureRange","TARGET_TEMPERATURE_RANGE","_callService","setTemperature","_debouncedCallService","_handleButton","defaultValue","temp","clamp","_handleSelectTemp","_renderLabel","UNAVAILABLE","action","hvac_action","actionLabel","toReadableString","_valueChanged","_valueChanging","_renderTemperatureButtons","colored","lowColor","colors","highColor","stateActive","borderColor","_renderTargetTemperature","digits","formatOptions","maximumFractionDigits","minimumFractionDigits","BigNumber","_renderCurrentTemperature","isOffState","current_temperature","mode","stateColor","actionColor","CLIMATE_HVAC_ACTION_TO_MODE","heatCoolModes","includes","sliderMode","ControlSliderCircular","ClimateHumiditySlider","_targetHumidity","setTargetHumidity","min_humidity","max_humidity","targetHumidity","setHumidity","_renderButtons","_renderTarget","_renderCurrentHumidity","current_humidity","supportsTargetHumidity","TARGET_HUMIDITY","currentHumidity","InternalClimateControls","hvacModes","hvacModeLabels","hideCurrentTemperature","hideHvacModes","hideSwingModes","hideFanModes","hidePresetModes","entityStateChanged","mainControl","_mainControl","setMainControl","isOff","preset_mode","fan_mode","fan_modes","preset_modes","swing_modes","modes","supportTargetHumidity","supportFanMode","FAN_MODE","supportPresetMode","PRESET_MODE","supportSwingMode","SWING_MODE","_handleFanModeChanged","setFanMode","_handleOperationModeChanged","setHvacMode","hvac_mode","_handleSwingmodeChanged","setSwingMode","swing_mode","_handlePresetmodeChanged","setPresetMode","concat","compareClimateHvacModes","computeHvacModeIcon","computePresetModeIcon","computeFanModeIcon","computeSwingModeIcon","ClimateControls","colorWheel","SWATCH_SIZE","Separator","FabCardColor","FabCardTemp","InternalLightControls","onStateChange","showFavoriteColors","favoriteColors","control","setControl","brightnessValue","useLightBrightness","device","DOMAIN_ATTRIBUTES_UNITS","light","supportsColorTemp","lightSupportsColorMode","LIGHT_COLOR_MODES","COLOR_TEMP","supportsColor","lightSupportsColor","supportsBrightness","lightSupportsBrightness","supportsWhite","WHITE","hasEffects","effect_list","supportsFavorites","lightSupportsFavoriteColors","computedFavorites","computeDefaultFavoriteColors","currentRgb","getLightCurrentModeRgbColor","currentKelvin","color_temp_kelvin","isFavoriteActive","fav","rgb_color","every","v","handleFavoriteClick","hs_color","rgbw_color","rgbww_color","turnOn","_handleEffectChange","effect","ControlToggle","toggle","ControlSlider","brightness_pct","ColorPicker","ColorTempPicker","kelvin","white","FavoritesWrapper","idx","r","g","b","getRgbColor","bg","contrastColor","luminosity","rgbToHex","vals","padStart","FavoriteFabCard","LightControls","entityAttributes","hs2rgb","temperature2rgb","rgbw2rgb","rgbww2rgb","min_color_temp_kelvin","max_color_temp_kelvin","BUTTONS","BUTTON_ROWS","_val","FORMAT_NUMBER","pulse","keyframes","ControlPanelSize","buttonGap","buttonSize","InternalAlarmControls","states","_states","defaultCode","hideCodeInput","hideKeypad","customActionColor","labelMap","slots","wrapperRef","inputVal","setInputVal","filterSupportedAlarmStates","DEFAULT_STATES","_handlePadClick","val","_handleActionClick","snakeCase","code","setProperty","_getActionColor","localizeState","isLoading","showKeypad","code_format","unpackSlot","find","slot","alarmCard","ButtonGroup","ButtonGroupButton","stateAction","ALARM_MODE_STATE_MAP","ALARM_MODES","_getActionLabel","TextField","buttons","j","zIndex","cursor","AlarmControls","computeTitleDisplay","statePosition","current_position","current_tilt_position","currentPosition","InternalCoverControls","orientation","reverse","supports","supportsPosition","CoverEntityFeature","supportsTiltPosition","supportsOpenClose","supportsTilt","_mode","setMode","setCoverPosition","setCoverTiltPosition","tilt_position","minHeight","maxHeight","minWidth","flexWrap","CoverControls","StyledMediaPlayerCard","StyledColumn","GroupLine","MediaPlayerControls","groupedEntities","allEntityIds","primaryEntity","supportsGrouping","mediaPlayersOrderedByGroup","flatten","groupBy","group_members","mediaPlayerService","useService","lastPlayedMedia","setLastPlayedMedia","media_content_id","media_content_type","handleMediaPlayerActionClick","entityId","playingSpeakers","playMedia","media","enqueue","mediaPlay","mediaPause","unjoin","getIcon","hasSomePlayingSpeakers","mediaPlayer","MediaPlayerCard","isPlaying","isLastOfGroup","friendlyName","supportsTurnOn","supportsTurnOff","capitalize","turnOff","VolumeControls","StyledMapContainer","MapContainer","MapMarker","marker","container","tagName","element","L","DomUtil","create","divIcon","DivIcon","html","portal","eventHandlers","Marker","InternalPersonControls","mapHeight","LatLng","latitude","longitude","TileLayer","PersonControls","StyledClimateCard","InternalClimateCard","showHvacModeLabels","showTemperatureControls","currentMode","icons","havacModesToUse","climateCard","activeColors","customLabel","ClimateCard","StyledEntitiesCard","InternalEntitiesCard","includeLastUpdated","entitiesCard","EntitiesCard","IconWrapper","Name","EntityRowInner","LAZY_LOAD_STATE_TYPES","climate","sensor","DOMAIN_TO_ELEMENT_TYPE","water_heater","alert","automation","fan","input_boolean","remote","siren","switch","vacuum","InternalEntitiesCardRow","_name","hexColor","lazyKey","LazyComponent","lazy","Suspense","EntitiesCardRow","VolumeSlider","StyledRangeSlider","volumeLayout","hideMute","volume_level","is_volume_muted","volume","_setVolume","mp","timerRef","supportsVolumeSet","supportsVolumeMute","setVolume","volumeSet","DEFAULT_FAB_SIZE","volumeMute","volumeDown","volumeUp","preventDefault","PlaybackControls","playing","supportsPreviousTrack","supportsNextTrack","supportsPlay","mediaPreviousTrack","mediaNextTrack","SmallText","AlternateControls","onSpeakerGroupClick","hideGrouping","groups","BackgroundImage","backgroundImage","MediaPlayerWrapper","Base","Empty","StyledMarquee","Marquee","InternalMediaPlayerCard","groupMembers","thumbnailSize","hideThumbnail","showArtworkBackground","hideAppName","hideEntityName","marqueeProps","interval","progressRef","playerRef","clockRef","entitiesById","entities","media_artist","media_title","media_playlist","app_name","media_duration","media_position","media_position_updated_at","deviceNames","friendlyNames","appName","artworkUrl","isIdle","isStandby","buffering","seekDisabled","isGroupingModalOpen","setIsGroupingModalOpen","currentTimeInSeconds","minutes","seconds","minutesStr","String","secondsStr","calculatePercentageViewed","progress","setInterval","lastUpdated","timeDifferenceInSeconds","getTime","newMediaPosition","clearInterval","seekTrack","mediaSeek","seek_position","debounceUpdateClock","bindProgress","useGesture","onMove","clientX","Error","mediaPlayerCard","paddingBottom","Thumbnail","ProgressBar","Clock","isIterable","obj","hasIterableEntries","compareEntries","valueA","valueB","mapA","mapB","compareIterables","iteratorA","iteratorB","nextA","nextB","shallow","useShallow","selector","prev","next","StyledCalendarCard","EventBody","StyledAlert","getCalendarDate","formatDate","dateString","optionsDate","month","year","optionsTime","hour","minute","formattedDate","Intl","DateTimeFormat","formattedStartTime","eventEndTime","formattedEndTime","defaultFullCalendarConfig","headerToolbar","plugins","dayGridPlugin","listPlugin","interactionPlugin","initialView","dayMaxEventRows","views","listWeek","eventTimeFormat","hour12","InternalCalendarCard","view","disableAutoView","disableNarrow","includeHeader","callApi","calRef","initialRequest","setError","setTitle","setLoading","narrow","setNarrow","widthRef","currentEvent","setCurrentEvent","calEntities","activeView","setActiveView","calendars","fetchEvents","info","successCallback","params","encodeURI","toISOString","end","calEvents","errors","apiCalls","method","then","data","Promise","all","forEach","getColorByIndex","ev","eventStart","eventEnd","eventData","uid","summary","dtstart","dtend","recurrence_id","rrule","calendar","changeView","fn","calendarApi","getApi","batchRendering","removeAllEventSources","addEventSource","measureCard","requestResize","api","setOption","_handleNext","_handlePrev","_handleToday","_handleView","newView","eventDisplay","_handleEventClick","entityStateObj","extendedProps","_handleDateClick","gotoDate","defaultView","calendarCard","toUpperCase","FullCalendar","Modal","textTransform","__html","Autolinker","link","newWindow","stripPrefix","CalendarCard","ButtonBarParent","fullWidth","FitContent","ButtonBarInner","wrap","fullHeight","InternalButtonBar","DEFAULT_ICON_SIZE","hideActiveBorder","ButtonGroupParent","thickness","InternalButtonGroup","maintainAspectRatio","Button","activeColor","InternalButtonGroupButton","showTitle","disableScaleEffect","HlsPlayer","posterUrl","controls","muted","autoPlay","playsInline","_videoEl","fatalError","setFatalError","retryableError","setRetryableError","_hlsPolyfillInstance","started","_renderHLSPolyfill","videoEl","Hls","hls","backBufferLength","fragLoadingTimeOut","manifestLoadingTimeOut","levelLoadingTimeOut","maxLiveSyncPlaybackRate","lowLatencyMode","_isLLHLSSupported","attachMedia","Events","MEDIA_ATTACHED","loadSource","FRAG_LOADED","ERROR","_event","fatal","ErrorTypes","NETWORK_ERROR","ErrorDetails","MANIFEST_LOAD_ERROR","response","MANIFEST_LOAD_TIMEOUT","startLoad","MEDIA_ERROR","recoverMediaError","_startHls","masterPlaylistPromise","fetch","default","hlsSupported","isSupported","canPlayType","masterPlaylist","playlistRegexp","exec","matchTwice","playlist_url","URL","href","_renderHLSNative","performance","getEntriesByType","perfEntry","nextHopProtocol","src","play","VideoPlayer","WebRTCPlayer","connection","_peerConnection","_remoteStream","_sessionId","_candidatesList","_unsub","fetchWebRtcSettings","sendMessagePromise","cleanUp","getTracks","track","stop","removeAttribute","load","peerConnection","close","onnegotiationneeded","onicecandidate","oniceconnectionstatechange","onicegatheringstatechange","ontrack","onsignalingstatechange","unsub_call","addTrack","srcObject","_startWebRtc","configuration","RTCPeerConnection","dataChannel","createDataChannel","addWebRtcCandidate","candidateSession","candidate","sendMessage","session_id","startNegotiation","offerOptions","offerToReceiveAudio","offerToReceiveVideo","offer","createOffer","setLocalDescription","candidates","getCandidatesUpfront","resolve","iceGatheringState","pop","handleAnswer","signalingState","remoteDesc","RTCSessionDescription","sdp","answer","setRemoteDescription","err","handleOfferEvent","toJSON","sdpMid","sdpMLineIndex","RTCIceCandidate","addIceCandidate","offer_sdp","subscribeMessage","handleIceCandidate","iceConnectionStateChanged","iceConnectionState","restartIce","log","MediaStream","addTransceiver","direction","localVideo","CameraStream","camera","useCamera","stream","poster","mjpeg","shouldRenderMJPEG","frontend_stream_types","STREAM_TYPE_WEB_RTC","STREAM_TYPE_HLS","StateFabCard","CameraName","DEFAULT_ICON_BUTTON_SIZE","InternalCameraCard","posterUpdateInterval","hideName","headerSensors","hideFooter","hideViewControls","cameraUpdater","loadingIconRef","stateValueRef","_view","setView","supportsLiveStream","_stopUpdateCameraInterval","_startUpdateCameraInterval","refresh","onImageLoad","onImageLoading","onVideoStateChange","innerText","viewButtons","cameraName","cameraCard","CameraCard","triggerDomains","hasContext","context_event_type","context_state","context_message","stripEntityId","InternalLogBookRenderer","hideIndicator","hideHeader","options","logs","useLogs","services","useDevice","_entityClicked","device_id","showMoreLogs","_renderEntity","entityName","hasState","formatTimeWithSecondsMem","second","hourCycle","_formatMessageWithPossibleEntity","seenEntities","possibleEntity","messageParts","messageEnd","splice","shift","possibleEntityName","endsWith","substring","formatDateMem","dateObject","_renderIndicator","_renderUnseenContextSourceEntity","seenEntityIds","context_entity_id","context_entity_id_name","_renderContextMessage","historicStateObj","createHistoricState","localizeStateMessage","context_domain","context_service","triggerMsg","context_source","contextTriggerSource","localizeTriggerSource","context_name","_renderMessage","itemHasContext","source","_renderLogbookItem","previous","currentStateObj","when","timeAgo","toDateString","LogBookRenderer","ModalContainer","ModalInner","ModalOverflow","ModalHeader","ModalBackdrop","InternalModal","backdropProps","headerActions","autocloseSeconds","animationDuration","autocloseRef","containerRef","backdropRef","doClose","removeCurrent","modal","flexShrink","transformOrigin","Updated","getLazyModal","cover","alarm_control_panel","media_player","hideAttributes","hideDeviceSettings","headerActionsPosition","hideLogbook","hideDefaultLayout","showLogbook","setShowLogbook","openDevice","childProps","stateRef","LazyModalComponent","defaultChildren","EntityAttributes","VacuumSize","ModeColumn","Push","spin","FanMode","speed","trim","silent","standard","medium","turbo","VacuumToolbar","buttonGroupProps","actions","VacuumControls","isDocked","battery_level","fan_speed","fan_speed_list","internalFanSpeed","setInternalFanSpeed","useDebounce","setFanSpeed","fanSpeedList","shouldShowFanControls","shouldShowBatteryLevel","currentIndex","findIndex","fanSpeed","batteryIconByLevel","Slider","defaultColor","sliderColor","showHandle","SliderHolder","SliderTrackBackground","SliderTrackBar","InternalControlSlider","vertical","onChangeApplied","clampValueToBaseline","trackBarRef","sliderRef","parentRef","inlineValue","boundedValue","valueToPercentage","baseline","percentageToValue","steppedValue","triggerOnChange","updatedValue","_getPercentageFromEvent","xy","y","offset","total","clientHeight","clientWidth","setPressed","pressed","onDrag","dragging","onDragStart","onDragEnd","clientY","drag","filterTaps","Switch","Background","InternalControlToggle","reversed","checked","propChecked","onIcon","_onIcon","offIcon","_offIcon","setChecked","switchRef","_toggle","hasAttribute","MAX_ANGLE","ROTATE_ANGLE","RADIUS","xy2polar","sqrt","phi","atan2","rad2deg","rad","PI","InternalControlSliderCircular","inactive","readonly","dual","_sliderRef","_svgRef","_activeSlider","_lastSlider","localValue","setLocalValue","localLow","setLocalLow","localHigh","setLocalHigh","trackPath","svgArc","lowValue","highValue","isNumber","_setActiveValue","_valueToPercentage","_percentageToValue","_steppedValue","_strokeDashArc","from","to","arc","arcOffset","strokeDasharray","strokeDashOffset","_strokeCircleDashArc","currentStroke","_boundedValue","renderArc","path","limit","_current","showActive","showTarget","activeArc","coloredArc","targetCircle","currentCircle","bound","angle","_findActiveSlider","lowDistance","highDistance","triggerOnChangeApplied","first","last","bounded","stepped","focus","onPointerDown","onPointerUp","hasWindow","getNodeName","node","isNode","getWindow","_node$ownerDocument","getDocumentElement","isElement","isHTMLElement","isShadowRoot","invalidOverflowDisplayValues","isOverflowElement","overflowX","overflowY","getComputedStyle","tableElements","isTableElement","topLayerSelectors","isTopLayer","transformProperties","willChangeValues","containValues","isContainingBlock","elementOrCss","webkit","isWebKit","getContainingBlock","currentNode","getParentNode","isLastTraversableNode","lastTraversableNodeNames","getNodeScroll","getNearestOverflowAncestor","parentNode","getOverflowAncestors","list","traverseIframes","_node$ownerDocument2","scrollableAncestor","isBody","frameElement","getFrameElement","createCoords","evaluate","param","getSide","getAlignment","getOppositeAxis","axis","getAxisLength","yAxisSides","getSideAxis","getAlignmentAxis","expandPaddingObject","getPaddingObject","rectToClientRect","isClient","noop","useLayoutEffect","SafeReact","useInsertionEffect","useSafeInsertionEffect","useEffectEvent","callback","_len","args","_key","computeCoordsFromPlacement","rtl","reference","floating","sideAxis","alignmentAxis","alignLength","side","isVertical","commonX","commonY","commonAlign","coords","computePosition","strategy","middleware","platform","validMiddleware","rects","statefulPlacement","middlewareData","resetCount","nextX","nextY","reset","detectOverflow","_await$platform$isEle","elements","boundary","rootBoundary","elementContext","altBoundary","paddingObject","clippingClientRect","offsetParent","offsetScale","elementClientRect","arrow","arrowDimensions","isYAxis","minProp","maxProp","clientProp","endDiff","startDiff","arrowOffsetParent","clientSize","centerToReference","largestPossiblePadding","minPadding","maxPadding","min$1","shouldAddOffset","alignmentOffset","originSides","convertValueToCoords","alignment","mainAxisMulti","crossAxisMulti","rawValue","mainAxis","crossAxis","_middlewareData$offse","_middlewareData$arrow","diffCoords","checkMainAxis","checkCrossAxis","limiter","detectOverflowOptions","mainAxisCoord","crossAxisCoord","minSide","maxSide","limitedCoords","limitShift","rawOffset","computedOffset","limitMin","limitMax","_middlewareData$offse2","isOriginSide","getCssDimensions","getComputedStyle$1","hasOffset","offsetWidth","offsetHeight","shouldFallback","unwrapElement","getScale","domElement","$","noOffsets","getVisualOffsets","shouldAddVisualOffsets","isFixed","floatingOffsetParent","includeScale","isFixedStrategy","clientRect","scale","visualOffsets","offsetWin","currentWin","currentIFrame","iframeScale","iframeRect","getWindowScrollBarX","leftScroll","getHTMLOffset","documentElement","scroll","htmlRect","convertOffsetParentRelativeRectToViewportRelativeRect","topLayer","offsets","isOffsetParentAnElement","offsetRect","htmlOffset","getClientRects","getDocumentRect","SCROLLBAR_MAX","getViewportRect","visualViewport","visualViewportBased","windowScrollbarX","doc","bodyStyles","bodyMarginInline","clippingStableScrollbarWidth","absoluteOrFixed","getInnerBoundingClientRect","getClientRectFromClippingAncestor","clippingAncestor","hasFixedPositionAncestor","stopNode","getClippingElementAncestors","cachedResult","currentContainingBlockComputedStyle","elementIsFixed","computedStyle","currentNodeIsContaining","ancestor","getClippingRect","clippingAncestors","firstClippingAncestor","clippingRect","accRect","getDimensions","getRectRelativeToOffsetParent","setLeftRTLScrollbarOffset","isStaticPositioned","getTrueOffsetParent","polyfill","rawOffsetParent","getOffsetParent","svgOffsetParent","getElementRects","getOffsetParentFn","getDimensionsFn","floatingDimensions","isRTL","rectsAreEqual","a","observeMove","io","root","cleanup","_io","skip","elementRectForRootMargin","insetTop","insetRight","insetBottom","insetLeft","isFirstUpdate","handleObserve","ratio","autoUpdate","update","ancestorScroll","ancestorResize","elementResize","layoutShift","animationFrame","referenceEl","ancestors","cleanupIo","reobserveFrame","resizeObserver","firstEntry","_resizeObserver","frameId","prevRefRect","frameLoop","nextRefRect","_resizeObserver2","offset$1","shift$1","arrow$1","limitShift$1","mergedOptions","platformWithCache","computePosition$1","deepEqual","keys","getDPR","roundByDPR","dpr","useLatestRef","useFloating","externalReference","externalFloating","whileElementsMounted","setData","latestMiddleware","setLatestMiddleware","_reference","_setReference","_floating","_setFloating","setReference","referenceRef","setFloating","floatingRef","floatingEl","dataRef","hasWhileElementsMounted","whileElementsMountedRef","platformRef","openRef","fullData","isMountedRef","ReactDOM","refs","floatingStyles","initialStyles","isRef","arrow$2","deps","serverHandoffComplete","genId","useFloatingId","setId","useModernLayoutEffect","useReactId","devMessageSet","warn","_devMessageSet","messages","_devMessageSet2","_devMessageSet3","_len2","_key2","_devMessageSet4","FloatingArrow","tipRadius","strokeWidth","staticOffset","stroke","restStyle","clipPathId","setIsRTL","isVerticalSide","computedStaticOffset","computedStrokeWidth","halfStrokeWidth","svgX","svgY","isCustomShape","yOffsetProp","xOffsetProp","arrowX","arrowY","dValue","rotation","t","createEventEmitter","_map$get","listener","_map$get2","FloatingNodeContext","FloatingTreeContext","useFloatingParentNodeId","_React$useContext","useFloatingTree","useFloatingRootContext","onOpenChangeProp","elementsProp","floatingId","events","nested","optionDomReference","positionReference","setPositionReference","onOpenChange","reason","nodeId","internalRootContext","rootContext","computedElements","_domReference","setDomReference","_setPositionReference","domReference","domReferenceRef","tree","useFloating$1","computedPositionReference","MenuPopup","Parent","MenuItem","arrowRef","menuRef","handleClickOutside","isMenu","contains","isParent","menu","role","fill","RENDER_SIZE","canvasSize","devicePixelRatio","Picker","SAFE_ZONE_FACTOR","polar2xy","cos","sin","drawColorWheel","ctx","minTemp","maxTemp","clearRect","canvas","radius","fraction","rgb2hex","fillStyle","fillRect","InternalColorTempPicker","useLightTemperature","canvasRef","gRef","circleRef","_cursorPosition","isOn","getColoursFromTemperature","rgb","hex","hs","rgb2hs","updateColours","_generateColorWheel","getContext","_getValueFromCoord","_localValue","removeProperty","_getCoordsFromValue","previousX","_getPositionFromEvent","boundingRect","maxX","maxY","_x","_y","__x","__y","renderSVGFilter","deg2rad","deg","adjustRgb","wv","cw","ww","minKelvin","maxKelvin","colorBrightness","beginPath","cX","cY","startAngle","endAngle","moveTo","closePath","gradient","createRadialGradient","hsv2rgb","addColorStop","ColorPickerWrapper","markerPosition","InternalColorPicker","lightColors","useLightColor","_pressed","coolWhite","warmWhite","hue","saturation","_resetPosition","hex2rgb","_applyColor","_setRgbWColor","RGBWW","rgbwwColor","RGBW","rgbwColor","_adjustColorBrightness","invert","c","_updateColor","RGB","brightnessAdjusted","brightnessAdjust","brightnessPercentage","ajustedRgbColor","Key","Value","Entry","InternalEntityAttributes","memoizedAttributes","Array","isArray","JSON","stringify","memoizedCreateCacheWithContainer","createCache","EmotionProvider","CacheProvider","INFO_COLORS","errorColor","warningColor","successColor","infoColor","alphas","getLuminance","alpha","channel","pow","getContrastColor","generateInfoColors","infoColors","varName","contrastVarName","rgba","generateVariantVars","variants","tint","darkMode","variant","isLight","lightness","contrast","baseLightness","DEFAULT_START_LIGHT","DEFAULT_START_DARK","indexOffset","LIGHT","offsetBackground","DIFF","baseVars","varStyles","generateAccentVars","DARK","generateAllVars","lightVars","darkVars","accentVars","ACCENT","omitXlg","InternalThemeProvider","theme","l","contrastThreshold","globalStyles","emotionCache","themeStore","setTheme","setBreakpoints","setGlobalComponentStyles","_breakpoints","colorScheme","isEqual","breakpointKey","ownerDocument","head","convertToCssVars","merge","defaultTheme","DEFAULT_THEME_OPTIONS","generateColumnBreakpoints","ThemeProvider","Pallette","RangeSliderBox","ThemeControls","setHue","setLight","setTint","setSat","dark","setDark","setContrastThreshold","_theme","_index","shade","ThemeControlsBox","ThemeControlsModal"],"mappings":"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","x_google_ignoreList":[1,41,42,60,61,62,63,64,65,66]}