import type { JSX, ValidComponent } from "@solidjs/web"; import { dynamic } from "@solidjs/web"; import { omit } from "solid-js"; 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 { useMeterRootContext } from "../meter-root-context.ts"; import type { MeterRootState } from "../root/meter-root.tsx"; export interface MeterIndicatorState extends MeterRootState {} export interface MeterIndicatorProps extends BaseUIComponentProps<"div", MeterIndicatorState> { /** Tag/component to render. Defaults to `"div"`. */ as?: ValidComponent; } /** * Visualizes the position of the value along the range. Renders a `
` * (or `as` override). * * ยง1 wave 2: replaces `renderElement` with a `dynamic()` element. Sizing style is a * reactive getter on the internal slot bag. */ export function MeterIndicator(props: MeterIndicatorProps): JSX.Element { const context = useMeterRootContext(); const style = (): JSX.CSSProperties => { const pct = valueToPercent(context.value(), context.min(), context.max()); return { "inset-inline-start": 0, height: "inherit", width: `${pct}%`, }; }; const userClassStyle = resolveClassStyle(props, () => ({})); const userProps = omit(props, "as", "class", "style", "attrs"); const internalSlot = { get style(): JSX.CSSProperties { return style(); }, }; let merged = mergeRootProps(internalSlot, userClassStyle); merged = mergeRootProps(merged, userProps); const Tag = dynamic(() => props.as ?? "div"); return ; }