import {JSX, mergeProps, splitProps} from "solid-js"; import classNames from "./classnames"; import {createControlledProp, SelectableContext, SelectCallback} from "solid-bootstrap-core"; import {createWithBsPrefix} from "./createWithBsPrefix"; import NavbarBrand from "./NavbarBrand"; import NavbarCollapse from "./NavbarCollapse"; import NavbarToggle from "./NavbarToggle"; import NavbarOffcanvas from "./NavbarOffcanvas"; import {useBootstrapPrefix} from "./ThemeProvider"; import NavbarContext, {NavbarContextType} from "./NavbarContext"; import {BsPrefixProps, BsPrefixRefForwardingComponent} from "./helpers"; import {Dynamic} from "solid-js/web"; const NavbarText = createWithBsPrefix("navbar-text", { Component: "span", }); export interface NavbarProps extends BsPrefixProps, Omit, "onSelect"> { variant?: "light" | "dark"; expand?: boolean | string | "sm" | "md" | "lg" | "xl" | "xxl"; bg?: string; fixed?: "top" | "bottom"; sticky?: "top"; onToggle?: (expanded: boolean) => void; onSelect?: SelectCallback; collapseOnSelect?: boolean; expanded?: boolean; defaultExpanded?: boolean; } const defaultProps: Partial = { as: "nav", expand: true, variant: "light" as const, collapseOnSelect: false, }; const Navbar: BsPrefixRefForwardingComponent<"nav", NavbarProps> = (p: NavbarProps) => { const [local, props] = splitProps(mergeProps(defaultProps, p), [ "as", "bsPrefix", "expand", "variant", "bg", "fixed", "sticky", "class", "expanded", "defaultExpanded", "onToggle", "onSelect", "collapseOnSelect", ]); const bsPrefix = useBootstrapPrefix(local.bsPrefix, "navbar"); const [expanded, onToggle] = createControlledProp( () => local.expanded, () => local.defaultExpanded, local.onToggle, ); const handleCollapse: SelectCallback = (...args) => { local.onSelect?.(...args); if (local.collapseOnSelect && expanded()) { onToggle?.(false); } }; const expandClass = () => { let expandClass = `${bsPrefix}-expand`; if (typeof local.expand === "string") expandClass = `${expandClass}-${local.expand}`; return expandClass; }; const navbarContext: NavbarContextType = { get onToggle() { return () => onToggle?.(!expanded()); }, bsPrefix, get expanded() { return !!expanded(); }, }; return ( ); }; export default Object.assign(Navbar, { Brand: NavbarBrand, Collapse: NavbarCollapse, Offcanvas: NavbarOffcanvas, Text: NavbarText, Toggle: NavbarToggle, });