@crossed/primitive
Version:
A universal & performant styling library for React Native, Next.js & React
75 lines (74 loc) • 2.6 kB
JavaScript
import { jsx } from "react/jsx-runtime";
import { useUncontrolled, withStaticProperties } from "@crossed/core";
import { useMemo, useId } from "react";
import { createDropdownMain } from "./Dropdown";
import { createDropdownTrigger } from "./DropdownTrigger";
import { createDropdownContent } from "./DropdownContent";
import { createDropdownPortal } from "./DropdownPortal";
import { Provider } from "./context";
import { createDropdownItem } from "./DropdownItem";
import { createDropdownDivider } from "./DropdownDivider";
import { createDropdownLabel } from "./DropdownLabel";
import {
Provider as Provider2,
useContext
} from "./context";
const createDropdown = (components, { context } = {}) => {
const { Root, Trigger, Content, Portal, Item, Divider, Label } = components;
const Dropdown = createDropdownMain(Root);
const DropdownTrigger = createDropdownTrigger(Trigger);
const DropdownContent = createDropdownContent(Content);
const DropdownPortal = createDropdownPortal(Portal);
const DropdownItem = createDropdownItem(Item);
const DropdownDivider = createDropdownDivider(Divider);
const DropdownLabel = createDropdownLabel(Label);
Dropdown.displayName = "Dropdown";
DropdownTrigger.displayName = "Dropdown.Trigger";
DropdownContent.displayName = "Dropdown.Content";
DropdownPortal.displayName = "Dropdown.Portal";
DropdownItem.displayName = "Dropdown.Item";
DropdownDivider.displayName = "Dropdown.Divider";
DropdownLabel.displayName = "Dropdown.Label";
return withStaticProperties(
(props) => {
const id = useId();
const {
value,
defaultValue = false,
onChangeOpen,
...otherProps
} = props;
const [open, setOpen] = useUncontrolled({
value,
defaultValue,
onChange: onChangeOpen
});
const contextProps = useMemo(() => {
return Object.entries(context || {}).reduce(
(acc, [key]) => {
if (props[key]) {
acc[key] = props[key];
}
return acc;
},
context || {}
);
}, [props]);
return /* @__PURE__ */ jsx(Provider, { ...contextProps, id, open, setOpen, children: /* @__PURE__ */ jsx(Dropdown, { ...otherProps }) });
},
{
Trigger: DropdownTrigger,
Content: DropdownContent,
Portal: DropdownPortal,
Item: DropdownItem,
Divider: DropdownDivider,
Label: DropdownLabel
}
);
};
export {
Provider2 as ProviderDropdown,
createDropdown,
useContext as useDropdownContext
};
//# sourceMappingURL=index.js.map