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 {
type ProgressRootState,
useProgressRootContext,
} from "../progress-root-context.ts";
export interface ProgressTrackState extends ProgressRootState {}
export interface ProgressTrackProps
extends BaseUIComponentProps<"div", ProgressTrackState> {
/**
* Tag/component to render. Defaults to `"div"`. Replaces the
* pre-spike `render` prop (axis G).
*/
as?: ValidComponent;
}
/**
* Contains the progress bar indicator. Renders a `
` (or `as` override).
*
* §1 wave 2: replaces `renderElement` with `dynamic(() => props.as ?? "div")`.
* The progress status (`indeterminate` | `progressing` | `complete`) projects
* to `data-indeterminate` / `data-progressing` / `data-complete` via inline
* reactive getters on the internal slot bag.
*/
export function ProgressTrack(props: ProgressTrackProps): JSX.Element {
const context = useProgressRootContext();
// Resolve `class`/`style` here so function values (stateful styling) are
// invoked with the progress state — otherwise a `class={(state) => …}` is
// spread to the DOM raw and never applied (no class attribute at all).
const userClassStyle = resolveClassStyle(props, () => ({
status: context.status(),
}));
const userProps = omit(props, "as", "class", "style", "attrs");
const internalSlot = {
get "data-indeterminate"(): "" | undefined {
return context.status() === "indeterminate" ? "" : undefined;
},
get "data-progressing"(): "" | undefined {
return context.status() === "progressing" ? "" : undefined;
},
get "data-complete"(): "" | undefined {
return context.status() === "complete" ? "" : undefined;
},
};
let merged: Record = mergeRootProps(
internalSlot,
userClassStyle,
);
merged = mergeRootProps(merged, userProps);
const Tag = dynamic(() => props.as ?? "div");
return ;
}