import type { JSX, ValidComponent } from "@solidjs/web"; import { dynamic } from "@solidjs/web"; import { omit } from "solid-js"; import { userRef } from "../../internals/compose-refs"; import { isHydrating } from "../../internals/is-hydrating.ts"; import { mergeRootProps } from "../../internals/merge-root-props"; import { resolveClassStyle } from "../../internals/resolve-class-style"; import type { BaseUIComponentProps } from "../../internals/types"; import { valueToPercent } from "../../internals/value-to-percent"; import { type SliderRootState, useSliderRootContext, } from "../slider-root-context.ts"; import { sliderDataAttrs } from "../utils/state-attrs.ts"; export interface SliderIndicatorState extends SliderRootState {} export interface SliderIndicatorProps extends BaseUIComponentProps<"div", SliderIndicatorState> { /** Tag/component to render. Defaults to `"div"`. */ as?: ValidComponent; } function getCenteredStyles( vertical: boolean, range: boolean, startPercent: number, endPercent: number, ): JSX.CSSProperties { const startEdge = vertical ? "bottom" : "inset-inline-start"; const mainSide = vertical ? "height" : "width"; const crossSide = vertical ? "width" : "height"; const styles: JSX.CSSProperties = { position: vertical ? "absolute" : "relative", [crossSide]: "inherit", }; if (!range) { styles[startEdge] = 0; styles[mainSide] = `${startPercent}%`; return styles; } styles[startEdge] = `${startPercent}%`; styles[mainSide] = `${endPercent - startPercent}%`; return styles; } function getInsetStyles( vertical: boolean, range: boolean, start: number | undefined, end: number | undefined, renderBeforeHydration: boolean, isHydrating: boolean, ): JSX.CSSProperties { const visibility = start === undefined || (range && end === undefined) ? "hidden" : undefined; const startEdge = vertical ? "bottom" : "inset-inline-start"; const mainSide = vertical ? "height" : "width"; const crossSide = vertical ? "width" : "height"; const styles: JSX.CSSProperties = { visibility: renderBeforeHydration && isHydrating ? "hidden" : visibility, position: vertical ? "absolute" : "relative", [crossSide]: "inherit", "--start-position": `${start ?? 0}%`, }; if (!range) { styles[startEdge] = 0; styles[mainSide] = "var(--start-position)"; return styles; } styles["--relative-size"] = `${(end ?? 0) - (start ?? 0)}%`; styles[startEdge] = "var(--start-position)"; styles[mainSide] = "var(--relative-size)"; return styles; } /** * Visualizes the current value of the slider. Renders a `