diff --git a/src/components/InlineHint/index.tsx b/src/components/InlineHint/index.tsx new file mode 100644 index 00000000..110cdc20 --- /dev/null +++ b/src/components/InlineHint/index.tsx @@ -0,0 +1,36 @@ +import { InfoCircleOutlined } from "@ant-design/icons"; +import { Tooltip } from "antd"; +import React, { ReactElement, ReactNode, useRef } from "react"; + +type InlineHintProps = { + title?: ReactNode; +}; + +/** An icon that can be hovered or focused to show an informational tooltip. */ +export default function InlineHint(props: InlineHintProps): ReactElement { + const popupContainerRef = useRef(null); + + return ( +
+ popupContainerRef.current ?? document.body} + > + + +
+ ); +} diff --git a/src/components/LabeledSlider/index.tsx b/src/components/LabeledSlider/index.tsx index 07a20ec6..2df7d7f9 100644 --- a/src/components/LabeledSlider/index.tsx +++ b/src/components/LabeledSlider/index.tsx @@ -1,10 +1,10 @@ import { InputNumber, Row } from "antd"; import Slider, { SliderSingleProps } from "antd/es/slider"; -import React, { ReactElement, useEffect, useState } from "react"; +import React, { ReactElement, ReactNode, useEffect, useId, useState } from "react"; type LabeledSliderProps = { sliderProps: SliderSingleProps; - label: string; + label: string | ReactNode; labelWidth?: string; id?: string; inputMax?: number; @@ -25,7 +25,8 @@ export default function LabeledSlider(props: LabeledSliderProps): ReactElement { } }; - const inputId = props.id || `labeled-slider-${props.label.toLowerCase().replace(/\s+/g, "-")}`; + const generatedId = useId(); + const inputId = props.id || `labeled-slider-${generatedId}`; useEffect(() => { setInputValue(props.sliderProps.value); @@ -43,7 +44,10 @@ export default function LabeledSlider(props: LabeledSliderProps): ReactElement { }} wrap={false} > -