UNPKG

@stratakit/structures

Version:

Medium-sized component structures for the Strata design system

131 lines (130 loc) 3.94 kB
import { jsx, jsxs } from "react/jsx-runtime"; import * as React from "react"; import { Button as AriaButton } from "@ariakit/react/button"; import * as AriaDisclosure from "@ariakit/react/disclosure"; import { Focusable } from "@ariakit/react/focusable"; import { Role } from "@ariakit/react/role"; import { Text } from "@stratakit/bricks"; import { Icon } from "@stratakit/foundations"; import { forwardRef } from "@stratakit/foundations/secret-internals"; import cx from "classnames"; import { ChevronDown } from "./~utils.icons.js"; import { useInit } from "./~utils.useInit.js"; const NavigationListRoot = forwardRef((props, forwardedRef) => { useInit(); const { items, role = "list", ...rest } = props; const itemRole = role === "list" ? "listitem" : void 0; const { indented } = React.useContext(NavigationListRootContext); return /* @__PURE__ */ jsx(Role, { ...rest, role, className: cx("\u{1F95D}NavigationListRoot", props.className), "data-_sk-indented": indented ? "true" : void 0, ref: forwardedRef, children: React.Children.map(items, (item) => /* @__PURE__ */ jsx(Role, { role: itemRole, className: "\u{1F95D}NavigationListItem", "data-_sk-indented": indented ? "true" : void 0, children: item })) }); }); const NavigationListRootContext = React.createContext({ indented: false }); const NavigationListItemAction = forwardRef((props, forwardedRef) => { return /* @__PURE__ */ jsx(Focusable, { accessibleWhenDisabled: true, ...props, className: cx("\u{1F95D}NavigationListItemAction", props.className), ref: forwardedRef }); }); const NavigationListAnchor = forwardRef((props, forwardedRef) => { const { active, label, icon, ...rest } = props; return /* @__PURE__ */ jsxs(NavigationListItemAction, { ...rest, render: /* @__PURE__ */ jsx(Role.a, { "aria-current": active ? "true" : void 0, render: props.render }), ref: forwardedRef, children: [typeof icon === "string" ? /* @__PURE__ */ jsx(Icon, { href: icon }) : icon, /* @__PURE__ */ jsx(Text, { variant: "body-sm", render: /* @__PURE__ */ jsx("span", {}), children: label })] }); }); const NavigationListSubgroup = forwardRef((props, forwardedRef) => { const { label, icon, items, defaultOpen, ...rest } = props; return /* @__PURE__ */ jsx(Role, { ...rest, className: cx("\u{1F95D}NavigationListSubgroup", props.className), ref: forwardedRef, children: /* @__PURE__ */ jsxs(AriaDisclosure.DisclosureProvider, { defaultOpen, children: [/* @__PURE__ */ jsx(AriaDisclosure.Disclosure, { render: /* @__PURE__ */ jsx(NavigationListSubgroupButton, { label, icon }) }), /* @__PURE__ */ jsx(NavigationListRootContext.Provider, { value: { indented: true }, children: /* @__PURE__ */ jsx(AriaDisclosure.DisclosureContent, { render: /* @__PURE__ */ jsx(NavigationListRoot, { items }) }) })] }) }); }); const NavigationListSubgroupButton = forwardRef((props, forwardedRef) => { const { label, icon, ...rest } = props; return /* @__PURE__ */ jsxs(NavigationListItemAction, { render: /* @__PURE__ */ jsx(AriaButton, {}), ...rest, className: cx("\u{1F95D}NavigationListSubgroupButton", props.className), ref: forwardedRef, children: [typeof icon === "string" ? /* @__PURE__ */ jsx(Icon, { href: icon }) : icon, /* @__PURE__ */ jsx(Text, { variant: "body-sm", render: /* @__PURE__ */ jsx("span", {}), children: label }), /* @__PURE__ */ jsx(ChevronDown, { className: "\u{1F95D}NavigationListSubgroupChevron" })] }); }); export { NavigationListAnchor as Anchor, NavigationListRoot as Root, NavigationListSubgroup as Subgroup };