import type { JSX, ValidComponent } from "@solidjs/web";
import { dynamic } from "@solidjs/web";
import { omit } from "solid-js";
import { userRef } from "../../internals/compose-refs";
import { mergeRootProps } from "../../internals/merge-root-props";
import { resolveClassStyle } from "../../internals/resolve-class-style";
import type { BaseUIComponentProps } from "../../internals/types";
import {
type SliderRootState,
useSliderRootContext,
} from "../slider-root-context.ts";
import { sliderDataAttrs } from "../utils/state-attrs.ts";
export interface SliderTrackState extends SliderRootState {}
export interface SliderTrackProps
extends BaseUIComponentProps<"div", SliderTrackState> {
/** Tag/component to render. Defaults to `"div"`. */
as?: ValidComponent;
}
/**
* Contains the slider indicator and represents the entire range of the
* slider. Renders a `
` (or `as` override).
*
* ยง1 wave 3: replaces `renderElement` with `dynamic(() => props.as ?? "div")`.
* The slider state-attr projection is contributed by `sliderDataAttrs`.
*/
export function SliderTrack(props: SliderTrackProps): JSX.Element {
const context = useSliderRootContext();
// Resolve `class`/`style` here so function values (stateful styling) are
// invoked with the slider state instead of being spread to the DOM raw.
const userClassStyle = resolveClassStyle(props, () => context.state());
const userProps = omit(props, "as", "class", "style", "attrs");
const internalSlot = {
style: { position: "relative" } as JSX.CSSProperties,
};
let merged: Record = mergeRootProps(
internalSlot,
sliderDataAttrs(context.state),
);
merged = mergeRootProps(merged, userClassStyle);
merged = mergeRootProps(merged, userProps);
const Tag = dynamic(() => props.as ?? "div");
return ;
}
export namespace SliderTrack {
export type State = SliderTrackState;
export type Props = SliderTrackProps;
}