import type { JSX, ValidComponent } from "@solidjs/web";
/**
* `
` — label element automatically associated with its
* parent ``. Mirrors React.
*/
import { dynamic } from "@solidjs/web";
import { createRenderEffect, omit, onCleanup } from "solid-js";
import { useBaseUiId } from "../../internals/base-ui-id";
import { mergeRootProps } from "../../internals/merge-root-props";
import { resolveClassStyle } from "../../internals/resolve-class-style";
import type { BaseUIComponentProps } from "../../internals/types";
import { useMenuGroupContext } from "../group/menu-group-context";
export type MenuGroupLabelState = Record;
export interface MenuGroupLabelProps
extends Omit, "id"> {
/**
* Tag/component to render. Defaults to `"div"`. Replaces the
* pre-spike `render` prop (axis G).
*/
as?: ValidComponent;
id?: string | undefined;
}
export function MenuGroupLabel(props: MenuGroupLabelProps): JSX.Element {
const group = useMenuGroupContext();
const fallbackId = useBaseUiId();
const resolvedId = (): string | undefined =>
typeof props.id === "string" ? props.id : fallbackId;
createRenderEffect(
() => resolvedId(),
(id) => {
group.setLabelId(id);
},
);
onCleanup(() => {
group.setLabelId(undefined);
});
const internal = {
role: "presentation",
get id() {
return resolvedId();
},
};
const userClassStyle = resolveClassStyle(props, () => ({}));
const userProps = omit(props, "as", "class", "style", "attrs", "id");
let merged: Record = mergeRootProps(
internal,
userClassStyle,
);
merged = mergeRootProps(merged, userProps);
const Tag = dynamic(() => props.as ?? "div");
return ;
}