import type { JSX, ValidComponent } from "@solidjs/web";
/**
* `
` — groups related menu items with a label. Mirrors
* `packages/react/src/menu/group/MenuGroup.tsx`.
*/
import { dynamic } from "@solidjs/web";
import { createSignal, 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 {
MenuGroupContext,
type MenuGroupContextValue,
} from "./menu-group-context";
export type MenuGroupState = Record;
export interface MenuGroupProps
extends BaseUIComponentProps<"div", MenuGroupState> {
/**
* Tag/component to render. Defaults to `"div"`. Replaces the
* pre-spike `render` prop (axis G).
*/
as?: ValidComponent;
children?: JSX.Element;
}
export function MenuGroup(props: MenuGroupProps): JSX.Element {
const [labelId, setLabelId] = createSignal(undefined, {
ownedWrite: true,
});
const contextValue: MenuGroupContextValue = { setLabelId };
const internal = {
role: "group",
get "aria-labelledby"() {
// Seed "" so Solid's spread subscribes to the key.
return labelId() ?? "";
},
};
const userClassStyle = resolveClassStyle(props, () => ({}));
const userProps = omit(props, "as", "class", "style", "attrs", "children");
let merged: Record = mergeRootProps(
internal,
userClassStyle,
);
merged = mergeRootProps(merged, userProps);
const Tag = dynamic(() => props.as ?? "div");
return (
{props.children}
);
}