@xsolla/xui-b2b-sidebar 0.147.1

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
@@ -0,0 +1 @@
1
+ {"version":3,"sources":["../../src/Sidebar.tsx","../../src/SidebarContext.tsx","../../src/SidebarCollapsed.tsx","../../src/HideSidebarIcon.tsx","../../src/SidebarContent.tsx","../../../../foundation/primitives-native/src/Box.tsx","../../src/SidebarFooter.tsx","../../src/SidebarTrigger.tsx","../../src/SidebarGroup.tsx","../../src/SidebarMenu.tsx","../../src/SidebarMenuItem.tsx","../../src/constants.ts","../../src/SidebarMenuCollapsible.tsx","../../src/SidebarMenuSub.tsx","../../src/SidebarChatButton.tsx"],"sourcesContent":["/**\n * Sidebar — Composable compound component following Shadcn/Radix patterns.\n *\n * Usage:\n * <SidebarProvider collapsed={false} onCollapsedChange={fn} pathname={path} linkComponent={Link}>\n * <Sidebar>\n * <SidebarContent>\n * <SidebarGroup label=\"Main\">\n * <SidebarMenu>\n * <SidebarMenuItem to=\"/dashboard\" icon={<Icon />} label=\"Dashboard\" />\n * <SidebarMenuCollapsible icon={<Icon />} label=\"Finance\" matchPaths={['/finance']}>\n * <SidebarMenuSub>\n * <SidebarMenuItem to=\"/finance/payouts\" label=\"Payouts\" isNested />\n * </SidebarMenuSub>\n * </SidebarMenuCollapsible>\n * </SidebarMenu>\n * </SidebarGroup>\n * </SidebarContent>\n * <SidebarFooter>\n * <SidebarTrigger />\n * </SidebarFooter>\n * </Sidebar>\n * </SidebarProvider>\n */\nimport React, { type ReactNode } from \"react\";\nimport type { SidebarItemType } from \"./types\";\nimport styled from \"styled-components\";\nimport { useResolvedTheme } from \"@xsolla/xui-core\";\nimport { useSidebar } from \"./SidebarContext\";\nimport { SidebarCollapsed } from \"./SidebarCollapsed\";\n\ninterface OuterProps {\n $expanded: number;\n $collapsed: number;\n $width: number;\n $radius: number;\n $bg: string;\n $transition: string;\n}\n\nconst Outer = styled.div<OuterProps>`\n width: ${(p) => p.$width}px;\n height: 100%;\n max-height: 100%;\n flex-shrink: 0;\n position: relative;\n overflow: hidden;\n border-radius: ${(p) => p.$radius}px;\n background: ${(p) => p.$bg};\n transition: width ${(p) => p.$transition};\n\n a {\n text-decoration: none;\n }\n`;\n\ninterface PaneProps {\n $width: number;\n $hidden: boolean;\n $fadeIn: string;\n $fadeOut: string;\n}\n\nconst ExpandedPane = styled.div<PaneProps>`\n position: absolute;\n top: 0;\n left: 0;\n width: ${(p) => p.$width}px;\n height: 100%;\n display: flex;\n flex-direction: column;\n overflow: hidden;\n opacity: ${(p) => (p.$hidden ? 0 : 1)};\n pointer-events: ${(p) => (p.$hidden ? \"none\" : \"auto\")};\n transition: ${(p) => (p.$hidden ? p.$fadeOut : p.$fadeIn)};\n`;\n\nconst CollapsedPane = styled.div<PaneProps>`\n position: absolute;\n top: 0;\n left: 0;\n width: ${(p) => p.$width}px;\n height: 100%;\n opacity: ${(p) => (p.$hidden ? 0 : 1)};\n pointer-events: ${(p) => (p.$hidden ? \"none\" : \"auto\")};\n transition: ${(p) => (p.$hidden ? p.$fadeOut : p.$fadeIn)};\n\n & > div {\n background: transparent;\n border-radius: 0;\n }\n`;\n\nexport interface SidebarProps {\n /** Items for the collapsed icon strip (since collapsed layout is fundamentally different) */\n collapsedItems?: SidebarItemType[];\n /** Tool items shown below a spacer in collapsed mode */\n collapsedToolItems?: SidebarItemType[];\n /** Bottom items in collapsed mode (e.g. Billing, Settings) */\n collapsedBottomItems?: SidebarItemType[];\n /** Whether to render the chat button in collapsed mode (defaults to true) */\n showChat?: boolean;\n /** Click handler for the chat button (collapsed mode) */\n onChatClick?: () => void;\n /** Whether the chat button shows a notification badge */\n chatBadge?: boolean;\n children: ReactNode;\n}\n\nexport const Sidebar: React.FC<SidebarProps> = ({\n collapsedItems = [],\n collapsedToolItems = [],\n collapsedBottomItems = [],\n showChat = true,\n onChatClick,\n chatBadge = false,\n children,\n}) => {\n const { collapsed, onCollapsedChange } = useSidebar();\n const { theme } = useResolvedTheme();\n const sizing = theme.sizing.sidebar();\n\n return (\n <Outer\n role=\"navigation\"\n aria-label=\"Sidebar navigation\"\n $expanded={sizing.widthExpanded}\n $collapsed={sizing.widthCollapsed}\n $width={collapsed ? sizing.widthCollapsed : sizing.widthExpanded}\n $radius={sizing.radius}\n $bg={theme.colors.background.secondary}\n $transition={sizing.transitionWidth}\n >\n <ExpandedPane\n aria-hidden={collapsed}\n $width={sizing.widthExpanded}\n $hidden={collapsed}\n $fadeIn={sizing.transitionFadeIn}\n $fadeOut={sizing.transitionFadeOut}\n >\n {children}\n </ExpandedPane>\n\n <CollapsedPane\n aria-hidden={!collapsed}\n $width={sizing.widthCollapsed}\n $hidden={!collapsed}\n $fadeIn={sizing.transitionFadeIn}\n $fadeOut={sizing.transitionFadeOut}\n >\n <SidebarCollapsed\n items={collapsedItems}\n toolItems={collapsedToolItems}\n bottomItems={collapsedBottomItems}\n onToggleCollapse={() => onCollapsedChange(!collapsed)}\n showChat={showChat}\n onChatClick={onChatClick}\n chatBadge={chatBadge}\n />\n </CollapsedPane>\n </Outer>\n );\n};\n","import React, {\n type ReactNode,\n type MouseEvent,\n createContext,\n useContext,\n useMemo,\n useState,\n useCallback,\n} from \"react\";\n\nexport type SidebarLinkClickHandler = (event?: MouseEvent<HTMLElement>) => void;\n\nexport type SidebarLinkActiveCheck = (\n match: unknown,\n location: { pathname: string; search?: string; hash?: string }\n) => boolean;\n\nexport interface SidebarLinkProps {\n to?: string;\n exact?: boolean;\n external?: boolean;\n target?: string | null;\n className?: string;\n activeClassName?: string;\n isActive?: SidebarLinkActiveCheck;\n onClick?: SidebarLinkClickHandler;\n dataId?: string;\n children: ReactNode;\n}\n\ninterface SidebarContextValue {\n collapsed: boolean;\n onCollapsedChange: (collapsed: boolean) => void;\n pathname: string;\n LinkComponent: React.ComponentType<SidebarLinkProps>;\n expandedId: string | null;\n onExpandedIdChange: (id: string | null) => void;\n}\n\nconst DefaultLink: React.FC<SidebarLinkProps> = ({\n to,\n external,\n target,\n className,\n children,\n dataId,\n onClick,\n}) => (\n <a\n href={to}\n className={className}\n target={external ? (target ?? \"_blank\") : (target ?? undefined)}\n rel={external ? \"noopener noreferrer\" : undefined}\n data-id={dataId}\n onClick={onClick}\n >\n {children}\n </a>\n);\n\nconst SidebarContext = createContext<SidebarContextValue>({\n collapsed: false,\n onCollapsedChange: () => {},\n pathname: \"\",\n LinkComponent: DefaultLink,\n expandedId: null,\n onExpandedIdChange: () => {},\n});\n\nexport interface SidebarProviderProps {\n collapsed?: boolean;\n onCollapsedChange?: (collapsed: boolean) => void;\n pathname?: string;\n linkComponent?: React.ComponentType<SidebarLinkProps>;\n children: ReactNode;\n}\n\nexport const SidebarProvider: React.FC<SidebarProviderProps> = ({\n collapsed: collapsedProp,\n onCollapsedChange,\n pathname = \"\",\n linkComponent,\n children,\n}) => {\n const [internalCollapsed, setInternalCollapsed] = useState(false);\n const [expandedId, setExpandedId] = useState<string | null>(null);\n\n const collapsed = collapsedProp ?? internalCollapsed;\n\n const handleCollapsedChange = useCallback(\n (next: boolean) => {\n if (collapsedProp === undefined) setInternalCollapsed(next);\n onCollapsedChange?.(next);\n },\n [collapsedProp, onCollapsedChange]\n );\n\n const onExpandedIdChange = useCallback((id: string | null) => {\n setExpandedId(id);\n }, []);\n\n const value = useMemo<SidebarContextValue>(\n () => ({\n collapsed,\n onCollapsedChange: handleCollapsedChange,\n pathname,\n LinkComponent: linkComponent || DefaultLink,\n expandedId,\n onExpandedIdChange,\n }),\n [\n collapsed,\n handleCollapsedChange,\n pathname,\n linkComponent,\n expandedId,\n onExpandedIdChange,\n ]\n );\n\n return (\n <SidebarContext.Provider value={value}>{children}</SidebarContext.Provider>\n );\n};\n\nexport const useSidebar = () => useContext(SidebarContext);\n","import type { SidebarItemType } from \"./types\";\n\nimport React, {\n useCallback,\n useEffect,\n useLayoutEffect,\n useRef,\n useState,\n} from \"react\";\nimport { createPortal } from \"react-dom\";\nimport styled from \"styled-components\";\nimport { useResolvedTheme } from \"@xsolla/xui-core\";\nimport { Typography } from \"@xsolla/xui-typography\";\nimport { ChatTwoMessages } from \"@xsolla/xui-icons-base\";\nimport { useSidebar } from \"./SidebarContext\";\nimport { HideSidebarIcon } from \"./HideSidebarIcon\";\n\nconst POPOVER_GAP_PX = 12;\nconst POPOVER_VIEWPORT_PADDING_PX = 8;\nconst POPOVER_CLOSE_DELAY_MS = 150;\nconst POPOVER_ITEM_BASE_CLASS = \"xui-sb-popover-item\";\nconst POPOVER_ITEM_ACTIVE_CLASS = \"xui-sb-popover-item--active\";\n\ninterface OuterProps {\n $width: number;\n $radius: number;\n $bg: string;\n}\n\nconst Outer = styled.div<OuterProps>`\n display: flex;\n width: ${(p) => p.$width}px;\n height: 100%;\n max-height: 100%;\n box-sizing: border-box;\n flex-direction: column;\n flex-shrink: 0;\n overflow: hidden;\n background: ${(p) => p.$bg};\n border-radius: ${(p) => p.$radius}px;\n\n a {\n text-decoration: none;\n }\n`;\n\ninterface MainProps {\n $padding: number;\n}\n\nconst MainScroll = styled.div<MainProps>`\n display: flex;\n flex: 1;\n flex-direction: column;\n align-items: center;\n padding: ${(p) => p.$padding}px 0;\n min-height: 0;\n overflow-y: auto;\n\n &::-webkit-scrollbar {\n width: 0;\n }\n`;\n\ninterface IconButtonStyledProps {\n $size: number;\n $radius: number;\n $iconSize: number;\n $color: string;\n $hoverBg: string;\n $hoverColor: string;\n $activeBg: string;\n $activeOutline: string;\n $focusOutline: string;\n $focusOutlineWidth: number;\n $active?: boolean;\n}\n\nconst IconBtn = styled.button<IconButtonStyledProps>`\n display: flex;\n width: ${(p) => p.$size}px;\n height: ${(p) => p.$size}px;\n align-items: center;\n justify-content: center;\n border: 0;\n border-radius: ${(p) => p.$radius}px;\n background: ${(p) => (p.$active ? p.$hoverBg : \"transparent\")};\n color: ${(p) => (p.$active ? p.$hoverColor : p.$color)};\n cursor: pointer;\n padding: 0;\n font: inherit;\n transition:\n background-color 0.15s ease-in-out,\n color 0.15s ease-in-out;\n\n ${(p) =>\n p.$active &&\n `\n background-color: ${p.$activeBg};\n outline: 1px solid ${p.$activeOutline};\n outline-offset: -1px;\n `}\n\n &:hover {\n background-color: ${(p) => p.$hoverBg};\n color: ${(p) => p.$hoverColor};\n }\n\n &:focus-visible {\n outline: ${(p) => p.$focusOutlineWidth}px solid ${(p) => p.$focusOutline};\n outline-offset: -${(p) => p.$focusOutlineWidth}px;\n }\n\n & > span {\n display: flex;\n width: ${(p) => p.$iconSize}px;\n height: ${(p) => p.$iconSize}px;\n align-items: center;\n justify-content: center;\n\n svg {\n width: ${(p) => p.$iconSize}px;\n height: ${(p) => p.$iconSize}px;\n }\n }\n`;\n\nconst Spacer = styled.div`\n height: 16px;\n flex-shrink: 0;\n`;\n\ninterface FooterProps {\n $padding: number;\n $borderColor: string;\n}\n\nconst FixedBottom = styled.div<FooterProps>`\n display: flex;\n flex-direction: column;\n align-items: center;\n padding: ${(p) => p.$padding}px 0;\n flex-shrink: 0;\n`;\n\nconst Footer = styled.div<FooterProps>`\n display: flex;\n flex-direction: column;\n align-items: center;\n gap: 4px;\n padding: ${(p) => p.$padding}px 0;\n border-top: 1px solid ${(p) => p.$borderColor};\n flex-shrink: 0;\n`;\n\ninterface ChatBtnProps {\n $size: number;\n $radius: number;\n $bg: string;\n $border: string;\n $color: string;\n $focusOutline: string;\n $focusOutlineWidth: number;\n}\n\nconst CollapsedChat = styled.button<ChatBtnProps>`\n display: flex;\n width: ${(p) => p.$size}px;\n height: ${(p) => p.$size}px;\n align-items: center;\n justify-content: center;\n border: 1px solid ${(p) => p.$border};\n border-radius: ${(p) => p.$radius}px;\n background: ${(p) => p.$bg};\n color: ${(p) => p.$color};\n cursor: pointer;\n position: relative;\n padding: 0;\n font: inherit;\n\n &:hover {\n opacity: 0.9;\n }\n\n &:focus-visible {\n outline: ${(p) => p.$focusOutlineWidth}px solid ${(p) => p.$focusOutline};\n outline-offset: 2px;\n }\n\n svg {\n width: 16px;\n height: 16px;\n }\n`;\n\ninterface CollapsedToggleProps {\n $size: number;\n $radius: number;\n $iconSize: number;\n $borderColor: string;\n $hoverBg: string;\n $color: string;\n $focusOutline: string;\n $focusOutlineWidth: number;\n}\n\nconst CollapsedToggle = styled.button<CollapsedToggleProps>`\n display: flex;\n width: ${(p) => p.$size}px;\n height: ${(p) => p.$size}px;\n align-items: center;\n justify-content: center;\n border: 1px solid ${(p) => p.$borderColor};\n border-radius: ${(p) => p.$radius}px;\n background: transparent;\n cursor: pointer;\n color: ${(p) => p.$color};\n padding: 0;\n font: inherit;\n\n &:hover {\n background: ${(p) => p.$hoverBg};\n }\n\n &:focus-visible {\n outline: ${(p) => p.$focusOutlineWidth}px solid ${(p) => p.$focusOutline};\n outline-offset: 2px;\n }\n\n svg {\n width: ${(p) => p.$iconSize}px;\n height: ${(p) => p.$iconSize}px;\n }\n`;\n\ninterface BadgeProps {\n $size: number;\n $color: string;\n}\n\nconst ChatBadge = styled.span<BadgeProps>`\n position: absolute;\n top: -2px;\n right: -2px;\n width: ${(p) => p.$size}px;\n height: ${(p) => p.$size}px;\n background: ${(p) => p.$color};\n border-radius: 999px;\n`;\n\ninterface PopoverContainerProps {\n $minWidth: number;\n $maxWidth: number;\n $zIndex: number;\n}\n\nconst PopoverContainer = styled.div<PopoverContainerProps>`\n position: fixed;\n z-index: ${(p) => p.$zIndex};\n min-width: ${(p) => p.$minWidth}px;\n max-width: ${(p) => p.$maxWidth}px;\n`;\n\ninterface PopoverInnerProps {\n $itemHeight: number;\n $padding: number;\n $radius: number;\n $bg: string;\n $shadow: string;\n}\n\nconst PopoverInner = styled.div<PopoverInnerProps>`\n min-height: ${(p) => p.$itemHeight}px;\n padding: ${(p) => p.$padding}px;\n background: ${(p) => p.$bg};\n border-radius: ${(p) => p.$radius}px;\n display: flex;\n flex-direction: column;\n gap: 6px;\n box-shadow: ${(p) => p.$shadow};\n`;\n\nconst PopoverTitle = styled.div<{ $padding: number }>`\n display: flex;\n height: 20px;\n align-items: center;\n padding: 0 ${(p) => p.$padding}px;\n overflow: hidden;\n`;\n\nconst PopoverDivider = styled.div<{ $color: string }>`\n height: 1px;\n align-self: stretch;\n background: ${(p) => p.$color};\n`;\n\ninterface PopoverItemsProps {\n $itemHeight: number;\n $padding: number;\n $radius: number;\n $colorIdle: string;\n $colorActive: string;\n $hoverBg: string;\n $activeBg: string;\n $activeOutline: string;\n $focusOutline: string;\n $focusOutlineWidth: number;\n}\n\nconst PopoverItems = styled.div<PopoverItemsProps>`\n display: flex;\n flex-direction: column;\n\n & > .${POPOVER_ITEM_BASE_CLASS} {\n display: flex;\n max-height: ${(p) => p.$itemHeight}px;\n align-items: center;\n padding: 12px ${(p) => p.$padding}px;\n border-radius: ${(p) => p.$radius}px;\n color: ${(p) => p.$colorIdle};\n font-weight: 400;\n cursor: pointer;\n transition: background-color 0.15s ease-in-out;\n text-decoration: none;\n }\n\n & > .${POPOVER_ITEM_BASE_CLASS}:hover {\n background-color: ${(p) => p.$hoverBg};\n }\n\n & > .${POPOVER_ITEM_BASE_CLASS}:focus-visible {\n outline: ${(p) => p.$focusOutlineWidth}px solid ${(p) => p.$focusOutline};\n outline-offset: -${(p) => p.$focusOutlineWidth}px;\n }\n\n & > .${POPOVER_ITEM_ACTIVE_CLASS} {\n background-color: ${(p) => p.$activeBg};\n color: ${(p) => p.$colorActive};\n outline: 1px solid ${(p) => p.$activeOutline};\n outline-offset: -1px;\n font-weight: 500;\n }\n`;\n\ninterface SinglePopoverProps {\n $padding: number;\n $itemHeight: number;\n $radius: number;\n $bg: string;\n $shadow: string;\n}\n\nconst SinglePopoverPanel = styled.div<SinglePopoverProps>`\n padding: 4px;\n background: ${(p) => p.$bg};\n border-radius: ${(p) => p.$radius}px;\n display: inline-flex;\n flex-direction: column;\n box-shadow: ${(p) => p.$shadow};\n`;\n\ninterface SingleLinkProps {\n $itemHeight: number;\n $padding: number;\n $radius: number;\n $color: string;\n}\n\n// styled.span here so the consumer's LinkComponent (rendered inside) inherits\n// these styles via cascade — keeps the DOM single-element while letting us\n// scope styles. We use display:contents on the wrapper so it behaves as if\n// the link were a direct child of the popover panel.\nconst SingleLinkWrap = styled.div<SingleLinkProps>`\n display: contents;\n\n & > a,\n & > * {\n display: inline-flex;\n max-height: ${(p) => p.$itemHeight}px;\n align-items: center;\n padding: 0 ${(p) => p.$padding}px;\n border-radius: ${(p) => p.$radius}px;\n color: ${(p) => p.$color};\n cursor: pointer;\n font-size: 14px;\n font-weight: 400;\n line-height: 18px;\n white-space: nowrap;\n text-decoration: none;\n }\n`;\n\ninterface CollapsedIconItemProps {\n item: SidebarItemType;\n onPopoverOpen: (item: SidebarItemType, rect: DOMRect) => void;\n onPopoverClose: () => void;\n pathname?: string;\n}\n\nconst isChildActive = (item: SidebarItemType, pathname?: string): boolean => {\n if (!item.children || !pathname) {\n return false;\n }\n const pathWithoutMerchant = pathname.replace(/^\\/\\d+/, \"\");\n return item.children.some((child) => {\n if (typeof child.to !== \"string\") {\n return false;\n }\n return child.exact\n ? pathWithoutMerchant === child.to\n : pathWithoutMerchant === child.to ||\n pathWithoutMerchant.startsWith(`${child.to}/`);\n });\n};\n\nconst CollapsedIconItem: React.FC<\n CollapsedIconItemProps & {\n sizing: ReturnType<\n ReturnType<typeof useResolvedTheme>[\"theme\"][\"sizing\"][\"sidebar\"]\n >;\n colors: ReturnType<typeof useResolvedTheme>[\"theme\"][\"colors\"];\n }\n> = ({ item, onPopoverOpen, onPopoverClose, pathname, sizing, colors }) => {\n const ref = useRef<HTMLButtonElement | null>(null);\n const hasChildren = Boolean(item.children && item.children.length > 0);\n const isActive = hasChildren && isChildActive(item, pathname);\n\n const openPopover = useCallback(() => {\n if (ref.current) {\n onPopoverOpen(item, ref.current.getBoundingClientRect());\n }\n }, [item, onPopoverOpen]);\n\n const isSimpleActive =\n !hasChildren &&\n (() => {\n if (!item.to || !pathname) {\n return false;\n }\n const pathWithoutMerchant = pathname.replace(/^\\/\\d+/, \"\");\n return item.exact\n ? pathWithoutMerchant === item.to\n : pathWithoutMerchant === item.to ||\n pathWithoutMerchant.startsWith(`${item.to}/`);\n })();\n\n const handleKeyDown = (e: React.KeyboardEvent<HTMLButtonElement>) => {\n if (e.key === \"Enter\" || e.key === \" \") {\n e.preventDefault();\n openPopover();\n } else if (e.key === \"Escape\") {\n onPopoverClose();\n }\n };\n\n if (!item.icon) {\n return null;\n }\n\n return (\n <IconBtn\n ref={ref}\n type=\"button\"\n onMouseEnter={openPopover}\n onMouseLeave={onPopoverClose}\n onFocus={openPopover}\n onBlur={onPopoverClose}\n onKeyDown={handleKeyDown}\n data-id={item.dataId}\n aria-haspopup={hasChildren ? \"menu\" : \"false\"}\n $size={sizing.itemHeight}\n $radius={sizing.radius}\n $iconSize={sizing.iconSize}\n $color={colors.content.tertiary}\n $hoverBg={colors.overlay.mono}\n $hoverColor={colors.content.primary}\n $activeBg={colors.overlay.mono}\n $activeOutline={colors.border.secondary}\n $focusOutline={colors.border.brand}\n $focusOutlineWidth={sizing.focusOutlineWidth}\n $active={isActive || isSimpleActive}\n >\n <span>{item.icon}</span>\n </IconBtn>\n );\n};\n\ninterface PopoverProps {\n item: SidebarItemType;\n triggerRect: DOMRect;\n onClose: () => void;\n onMouseEnter: () => void;\n onMouseLeave: () => void;\n sizing: ReturnType<\n ReturnType<typeof useResolvedTheme>[\"theme\"][\"sizing\"][\"sidebar\"]\n >;\n colors: ReturnType<typeof useResolvedTheme>[\"theme\"][\"colors\"];\n}\n\nconst CollapsedPopover: React.FC<PopoverProps> = ({\n item,\n triggerRect,\n onClose,\n onMouseEnter,\n onMouseLeave,\n sizing,\n colors,\n}) => {\n const { LinkComponent } = useSidebar();\n const popoverRef = useRef<HTMLDivElement | null>(null);\n const hasChildren = Boolean(item.children && item.children.length > 0);\n const [position, setPosition] = useState<{ top: number; left: number }>({\n top: triggerRect.top,\n left: triggerRect.right + POPOVER_GAP_PX,\n });\n\n useLayoutEffect(() => {\n if (!popoverRef.current) {\n return;\n }\n const rect = popoverRef.current.getBoundingClientRect();\n const triggerCenterY = triggerRect.top + triggerRect.height / 2;\n const idealTop = hasChildren\n ? triggerRect.top\n : triggerCenterY - rect.height / 2;\n const maxTop = Math.max(\n POPOVER_VIEWPORT_PADDING_PX,\n window.innerHeight - rect.height - POPOVER_VIEWPORT_PADDING_PX\n );\n const top = Math.max(\n POPOVER_VIEWPORT_PADDING_PX,\n Math.min(idealTop, maxTop)\n );\n const left = Math.min(\n triggerRect.right + POPOVER_GAP_PX,\n window.innerWidth - rect.width - POPOVER_VIEWPORT_PADDING_PX\n );\n if (top !== position.top || left !== position.left) {\n setPosition({ top, left });\n }\n }, [\n triggerRect.top,\n triggerRect.right,\n triggerRect.height,\n hasChildren,\n item.dataId,\n position.top,\n position.left,\n ]);\n\n if (!hasChildren) {\n return (\n <PopoverContainer\n ref={popoverRef}\n style={{ top: position.top, left: position.left, minWidth: \"auto\" }}\n onMouseEnter={onMouseEnter}\n onMouseLeave={onMouseLeave}\n $minWidth={0}\n $maxWidth={sizing.popoverMaxWidth}\n $zIndex={sizing.popoverZIndex}\n >\n <SinglePopoverPanel\n $padding={sizing.padding}\n $itemHeight={sizing.itemHeight}\n $radius={sizing.radius}\n $bg={colors.layer.float}\n $shadow={sizing.popoverShadow}\n >\n <SingleLinkWrap\n $itemHeight={sizing.itemHeight}\n $padding={sizing.padding}\n $radius={sizing.radius}\n $color={colors.content.primary}\n >\n <LinkComponent\n to={item.to}\n exact={item.exact}\n external={item.external}\n target={item.target}\n dataId={item.dataId}\n onClick={onClose}\n >\n <Typography variant=\"bodySm\" color=\"primary\">\n {item.label}\n </Typography>\n </LinkComponent>\n </SingleLinkWrap>\n </SinglePopoverPanel>\n </PopoverContainer>\n );\n }\n\n return (\n <PopoverContainer\n ref={popoverRef}\n role=\"menu\"\n style={{ top: position.top, left: position.left }}\n onMouseEnter={onMouseEnter}\n onMouseLeave={onMouseLeave}\n $minWidth={sizing.popoverMinWidth}\n $maxWidth={sizing.popoverMaxWidth}\n $zIndex={sizing.popoverZIndex}\n >\n <PopoverInner\n $itemHeight={sizing.itemHeight}\n $padding={sizing.padding}\n $radius={sizing.radius}\n $bg={colors.layer.float}\n $shadow={sizing.popoverShadow}\n >\n <PopoverTitle $padding={sizing.padding}>\n <Typography variant=\"bodyXs\" color=\"primary\">\n {item.label}\n </Typography>\n </PopoverTitle>\n <PopoverDivider $color={colors.border.secondary} />\n <PopoverItems\n $itemHeight={sizing.itemHeight}\n $padding={sizing.padding}\n $radius={sizing.radius}\n $colorIdle={colors.content.tertiary}\n $colorActive={colors.content.primary}\n $hoverBg={colors.overlay.mono}\n $activeBg={colors.overlay.mono}\n $activeOutline={colors.border.secondary}\n $focusOutline={colors.border.brand}\n $focusOutlineWidth={sizing.focusOutlineWidth}\n >\n {(item.children || []).map((child, i) => (\n <LinkComponent\n key={\n child.dataId ||\n (typeof child.to === \"string\" ? child.to : `child-${i}`)\n }\n to={child.to}\n exact={child.exact}\n external={child.external}\n target={child.target}\n className={POPOVER_ITEM_BASE_CLASS}\n activeClassName={POPOVER_ITEM_ACTIVE_CLASS}\n dataId={child.dataId}\n onClick={onClose}\n >\n <Typography variant=\"bodySm\" color=\"inherit\">\n {child.label}\n </Typography>\n </LinkComponent>\n ))}\n </PopoverItems>\n </PopoverInner>\n </PopoverContainer>\n );\n};\n\nexport interface SidebarCollapsedProps {\n items: SidebarItemType[];\n toolItems?: SidebarItemType[];\n bottomItems?: SidebarItemType[];\n onToggleCollapse?: () => void;\n onChatClick?: () => void;\n showChat?: boolean;\n chatBadge?: boolean;\n}\n\nexport const SidebarCollapsed: React.FC<SidebarCollapsedProps> = ({\n items,\n toolItems = [],\n bottomItems = [],\n onToggleCollapse,\n onChatClick,\n showChat = true,\n chatBadge = false,\n}) => {\n const { pathname } = useSidebar();\n const { theme } = useResolvedTheme();\n const sizing = theme.sizing.sidebar();\n const colors = theme.colors;\n\n const [popover, setPopover] = useState<{\n item: SidebarItemType;\n triggerRect: DOMRect;\n } | null>(null);\n const closeTimerRef = useRef<ReturnType<typeof setTimeout> | null>(null);\n\n const cancelCloseTimer = useCallback(() => {\n if (closeTimerRef.current) {\n clearTimeout(closeTimerRef.current);\n closeTimerRef.current = null;\n }\n }, []);\n\n const startCloseTimer = useCallback(() => {\n cancelCloseTimer();\n closeTimerRef.current = setTimeout(() => {\n setPopover(null);\n }, POPOVER_CLOSE_DELAY_MS);\n }, [cancelCloseTimer]);\n\n useEffect(() => () => cancelCloseTimer(), [cancelCloseTimer]);\n\n const handlePopoverOpen = useCallback(\n (item: SidebarItemType, rect: DOMRect) => {\n cancelCloseTimer();\n setPopover({ item, triggerRect: rect });\n },\n [cancelCloseTimer]\n );\n\n return (\n <Outer\n $width={sizing.widthCollapsed}\n $radius={sizing.radius}\n $bg={colors.background.secondary}\n >\n <MainScroll $padding={sizing.padding}>\n {items.map((item, i) => (\n <CollapsedIconItem\n key={item.dataId || `item-${i}`}\n item={item}\n onPopoverOpen={handlePopoverOpen}\n onPopoverClose={startCloseTimer}\n pathname={pathname}\n sizing={sizing}\n colors={colors}\n />\n ))}\n {toolItems.length > 0 && (\n <>\n <Spacer />\n {toolItems.map((item, i) => (\n <CollapsedIconItem\n key={item.dataId || `tool-${i}`}\n item={item}\n onPopoverOpen={handlePopoverOpen}\n onPopoverClose={startCloseTimer}\n pathname={pathname}\n sizing={sizing}\n colors={colors}\n />\n ))}\n </>\n )}\n </MainScroll>\n\n <FixedBottom\n $padding={sizing.padding}\n $borderColor={colors.border.secondary}\n >\n {bottomItems.map((item, i) => (\n <CollapsedIconItem\n key={item.dataId || `bottom-${i}`}\n item={item}\n onPopoverOpen={handlePopoverOpen}\n onPopoverClose={startCloseTimer}\n pathname={pathname}\n sizing={sizing}\n colors={colors}\n />\n ))}\n </FixedBottom>\n\n <Footer $padding={sizing.padding} $borderColor={colors.border.secondary}>\n {showChat && (\n <CollapsedChat\n onClick={onChatClick}\n type=\"button\"\n aria-label=\"Open chat\"\n $size={sizing.itemHeight}\n $radius={sizing.radius}\n $bg={colors.control.brand.primary.bg}\n $border={colors.control.brand.primary.border}\n $color={colors.content.static.dark}\n $focusOutline={colors.border.brand}\n $focusOutlineWidth={sizing.focusOutlineWidth}\n >\n <ChatTwoMessages size={16} variant=\"line\" />\n {chatBadge && (\n <ChatBadge\n $size={sizing.chatBadgeSize}\n $color={colors.background.alert.primary}\n />\n )}\n </CollapsedChat>\n )}\n <CollapsedToggle\n onClick={onToggleCollapse}\n type=\"button\"\n aria-label=\"Expand sidebar\"\n aria-pressed={true}\n $size={sizing.itemHeight}\n $radius={sizing.radius}\n $iconSize={sizing.iconSize}\n $borderColor={colors.border.secondary}\n $hoverBg={colors.overlay.mono}\n $color={colors.content.tertiary}\n $focusOutline={colors.border.brand}\n $focusOutlineWidth={sizing.focusOutlineWidth}\n >\n <HideSidebarIcon flipped />\n </CollapsedToggle>\n </Footer>\n\n {popover &&\n typeof document !== \"undefined\" &&\n createPortal(\n <CollapsedPopover\n item={popover.item}\n triggerRect={popover.triggerRect}\n onClose={() => setPopover(null)}\n onMouseEnter={cancelCloseTimer}\n onMouseLeave={startCloseTimer}\n sizing={sizing}\n colors={colors}\n />,\n document.body\n )}\n </Outer>\n );\n};\n","import React from \"react\";\n\ninterface HideSidebarIconProps {\n /** Rotate icon 180° (e.g. when sidebar is collapsed and the button now expands it) */\n flipped?: boolean;\n}\n\nexport const HideSidebarIcon: React.FC<HideSidebarIconProps> = ({\n flipped,\n}) => (\n <svg\n width=\"18\"\n height=\"18\"\n viewBox=\"0 0 18 18\"\n fill=\"none\"\n xmlns=\"http://www.w3.org/2000/svg\"\n aria-hidden=\"true\"\n focusable=\"false\"\n style={flipped ? { transform: \"rotate(180deg)\" } : undefined}\n >\n <path\n d=\"M10.1519 3.75L10.9674 4.60262L7.33825 8.39704H15.75V9.60296H7.33825L10.9674 13.3974L10.1519 14.25L5.33446 9.21318C5.22185 9.09544 5.22185 8.90456 5.33446 8.78682L10.1519 3.75Z\"\n fill=\"currentColor\"\n />\n <path d=\"M2.25 3.75H3.75V15H2.25V3.75Z\" fill=\"currentColor\" />\n </svg>\n);\n","import React, { type ReactNode } from \"react\";\nimport styled from \"styled-components\";\nimport { useResolvedTheme } from \"@xsolla/xui-core\";\n\ninterface ScrollableProps {\n $padding: number;\n $thumbColor: string;\n}\n\n// Box can't express ::-webkit-scrollbar styling, so this drops directly to\n// styled-components like Markdown.tsx does for its element-specific rules.\nconst ScrollableArea = styled.div<ScrollableProps>`\n flex: 1;\n display: flex;\n flex-direction: column;\n padding: ${(p) => p.$padding}px;\n padding-bottom: 0;\n overflow: hidden auto;\n min-height: 0;\n\n &::-webkit-scrollbar {\n width: 4px;\n }\n &::-webkit-scrollbar-track {\n background: none;\n }\n &::-webkit-scrollbar-thumb {\n background-color: ${(p) => p.$thumbColor};\n border-radius: 2px;\n visibility: hidden;\n }\n &:hover::-webkit-scrollbar-thumb {\n visibility: visible;\n }\n`;\n\nexport const SidebarContent: React.FC<{ children: ReactNode }> = ({\n children,\n}) => {\n const { theme } = useResolvedTheme();\n const sizing = theme.sizing.sidebar();\n return (\n <ScrollableArea\n $padding={sizing.padding}\n $thumbColor={theme.colors.content.tertiary}\n >\n {children}\n </ScrollableArea>\n );\n};\n","import React from \"react\";\nimport {\n View,\n Pressable,\n Image,\n ViewStyle,\n ImageStyle,\n DimensionValue,\n AnimatableNumericValue,\n} from \"react-native\";\nimport { BoxProps } from \"@xsolla/xui-primitives-core\";\n\nexport const Box: React.FC<BoxProps> = ({\n children,\n onPress,\n onLayout,\n onMoveShouldSetResponder,\n onResponderGrant,\n onResponderMove,\n onResponderRelease,\n onResponderTerminate,\n backgroundColor,\n borderColor,\n borderWidth,\n borderBottomWidth,\n borderBottomColor,\n borderTopWidth,\n borderTopColor,\n borderLeftWidth,\n borderLeftColor,\n borderRightWidth,\n borderRightColor,\n borderRadius,\n borderStyle,\n height,\n padding,\n paddingHorizontal,\n paddingVertical,\n margin,\n marginTop,\n marginBottom,\n marginLeft,\n marginRight,\n flexDirection,\n alignItems,\n justifyContent,\n position,\n top,\n bottom,\n left,\n right,\n width,\n minWidth,\n minHeight,\n maxWidth,\n maxHeight,\n flex,\n overflow,\n zIndex,\n hoverStyle,\n pressStyle,\n style,\n \"data-testid\": dataTestId,\n testID,\n as,\n src,\n alt,\n ...rest\n}) => {\n const getContainerStyle = (pressed?: boolean): ViewStyle => ({\n backgroundColor:\n pressed && pressStyle?.backgroundColor\n ? pressStyle.backgroundColor\n : backgroundColor,\n borderColor,\n borderWidth,\n borderBottomWidth,\n borderBottomColor,\n borderTopWidth,\n borderTopColor,\n borderLeftWidth,\n borderLeftColor,\n borderRightWidth,\n borderRightColor,\n borderRadius: borderRadius as AnimatableNumericValue,\n borderStyle: borderStyle as ViewStyle[\"borderStyle\"],\n overflow,\n zIndex,\n height: height as DimensionValue,\n width: width as DimensionValue,\n minWidth: minWidth as DimensionValue,\n minHeight: minHeight as DimensionValue,\n maxWidth: maxWidth as DimensionValue,\n maxHeight: maxHeight as DimensionValue,\n padding: padding as DimensionValue,\n paddingHorizontal: paddingHorizontal as DimensionValue,\n paddingVertical: paddingVertical as DimensionValue,\n margin: margin as DimensionValue,\n marginTop: marginTop as DimensionValue,\n marginBottom: marginBottom as DimensionValue,\n marginLeft: marginLeft as DimensionValue,\n marginRight: marginRight as DimensionValue,\n flexDirection,\n alignItems,\n justifyContent,\n position: position as ViewStyle[\"position\"],\n top: top as DimensionValue,\n bottom: bottom as DimensionValue,\n left: left as DimensionValue,\n right: right as DimensionValue,\n flex,\n ...(style as ViewStyle),\n });\n\n const finalTestID = dataTestId || testID;\n\n // Destructure and drop web-only props from rest before passing to RN components\n // eslint-disable-next-line @typescript-eslint/no-unused-vars\n const {\n role,\n tabIndex,\n onKeyDown,\n onKeyUp,\n \"aria-label\": _ariaLabel,\n \"aria-labelledby\": _ariaLabelledBy,\n \"aria-current\": _ariaCurrent,\n \"aria-disabled\": _ariaDisabled,\n \"aria-live\": _ariaLive,\n className,\n \"data-testid\": _dataTestId,\n ...nativeRest\n } = rest as Record<string, unknown>;\n\n // Handle as=\"img\" for React Native\n if (as === \"img\" && src) {\n const imageStyle: ImageStyle = {\n width: width as DimensionValue,\n height: height as DimensionValue,\n borderRadius: borderRadius as number,\n position: position as ImageStyle[\"position\"],\n top: top as DimensionValue,\n bottom: bottom as DimensionValue,\n left: left as DimensionValue,\n right: right as DimensionValue,\n ...(style as ImageStyle),\n };\n\n return (\n <Image\n source={{ uri: src }}\n style={imageStyle}\n testID={finalTestID}\n resizeMode=\"cover\"\n {...nativeRest}\n />\n );\n }\n\n if (onPress) {\n return (\n <Pressable\n onPress={onPress}\n onLayout={onLayout}\n onMoveShouldSetResponder={onMoveShouldSetResponder}\n onResponderGrant={onResponderGrant}\n onResponderMove={onResponderMove}\n onResponderRelease={onResponderRelease}\n onResponderTerminate={onResponderTerminate}\n style={({ pressed }) => getContainerStyle(pressed)}\n testID={finalTestID}\n {...nativeRest}\n >\n {children}\n </Pressable>\n );\n }\n\n return (\n <View\n style={getContainerStyle()}\n testID={finalTestID}\n onLayout={onLayout}\n onMoveShouldSetResponder={onMoveShouldSetResponder}\n onResponderGrant={onResponderGrant}\n onResponderMove={onResponderMove}\n onResponderRelease={onResponderRelease}\n onResponderTerminate={onResponderTerminate}\n {...nativeRest}\n >\n {children}\n </View>\n );\n};\n","import React, { type ReactNode } from \"react\";\n// @ts-expect-error - this will be resolved at build time\nimport { Box } from \"@xsolla/xui-primitives\";\nimport { useResolvedTheme } from \"@xsolla/xui-core\";\n\nexport const SidebarFooter: React.FC<{ children: ReactNode }> = ({\n children,\n}) => {\n const { theme } = useResolvedTheme();\n const sizing = theme.sizing.sidebar();\n\n return (\n <Box\n flexDirection=\"row\"\n alignItems=\"flex-end\"\n justifyContent=\"space-between\"\n padding={sizing.padding}\n borderTopWidth={1}\n borderTopColor={theme.colors.border.secondary}\n flexShrink={0}\n >\n {children}\n </Box>\n );\n};\n","import React from \"react\";\nimport styled from \"styled-components\";\nimport { useResolvedTheme } from \"@xsolla/xui-core\";\nimport { useSidebar } from \"./SidebarContext\";\nimport { HideSidebarIcon } from \"./HideSidebarIcon\";\n\ninterface ToggleProps {\n $size: number;\n $radius: number;\n $iconSize: number;\n $borderColor: string;\n $hoverBg: string;\n $color: string;\n $focusOutline: string;\n $focusOutlineWidth: number;\n}\n\nconst ToggleButton = styled.button<ToggleProps>`\n display: flex;\n width: ${(p) => p.$size}px;\n height: ${(p) => p.$size}px;\n align-items: center;\n justify-content: center;\n border: 1px solid ${(p) => p.$borderColor};\n border-radius: ${(p) => p.$radius}px;\n background: transparent;\n backdrop-filter: blur(30px);\n cursor: pointer;\n color: ${(p) => p.$color};\n padding: 0;\n font: inherit;\n\n &:hover {\n background: ${(p) => p.$hoverBg};\n }\n\n &:focus-visible {\n outline: ${(p) => p.$focusOutlineWidth}px solid ${(p) => p.$focusOutline};\n outline-offset: 2px;\n }\n\n svg {\n width: ${(p) => p.$iconSize}px;\n height: ${(p) => p.$iconSize}px;\n }\n`;\n\nexport const SidebarTrigger: React.FC = () => {\n const { collapsed, onCollapsedChange } = useSidebar();\n const { theme } = useResolvedTheme();\n const sizing = theme.sizing.sidebar();\n\n return (\n <ToggleButton\n type=\"button\"\n onClick={() => onCollapsedChange(!collapsed)}\n aria-label={collapsed ? \"Expand sidebar\" : \"Collapse sidebar\"}\n aria-pressed={collapsed}\n $size={sizing.itemHeight}\n $radius={sizing.radius}\n $iconSize={sizing.iconSize}\n $borderColor={theme.colors.border.secondary}\n $hoverBg={theme.colors.overlay.mono}\n $color={theme.colors.content.tertiary}\n $focusOutline={theme.colors.border.brand}\n $focusOutlineWidth={sizing.focusOutlineWidth}\n >\n <HideSidebarIcon flipped={collapsed} />\n </ToggleButton>\n );\n};\n","import React, { type ReactNode } from \"react\";\n// @ts-expect-error - this will be resolved at build time\nimport { Box } from \"@xsolla/xui-primitives\";\nimport { useResolvedTheme } from \"@xsolla/xui-core\";\nimport { Typography } from \"@xsolla/xui-typography\";\n\ninterface SidebarGroupProps {\n label?: string;\n dataId?: string;\n children: ReactNode;\n}\n\nexport const SidebarGroup: React.FC<SidebarGroupProps> = ({\n label,\n dataId,\n children,\n}) => {\n const { theme } = useResolvedTheme();\n const sizing = theme.sizing.sidebar();\n\n return (\n <Box\n flexDirection=\"column\"\n data-id={dataId}\n role={label ? \"group\" : undefined}\n aria-label={label}\n >\n {label && (\n <Box\n flexDirection=\"row\"\n alignItems=\"center\"\n height={sizing.sectionLabelHeight}\n paddingHorizontal={sizing.padding}\n marginTop={sizing.padding}\n >\n <Typography variant=\"bodyXs\" color=\"secondary\">\n {label}\n </Typography>\n </Box>\n )}\n {children}\n </Box>\n );\n};\n","import React, { type ReactNode } from \"react\";\n// @ts-expect-error - this will be resolved at build time\nimport { Box } from \"@xsolla/xui-primitives\";\n\nexport const SidebarMenu: React.FC<{ children: ReactNode }> = ({\n children,\n}) => (\n <Box flexDirection=\"column\" alignItems=\"stretch\">\n {children}\n </Box>\n);\n","import React, { type ReactNode } from \"react\";\nimport {\n type SidebarLinkActiveCheck,\n type SidebarLinkClickHandler,\n useSidebar,\n} from \"./SidebarContext\";\nimport styled from \"styled-components\";\nimport { useResolvedTheme } from \"@xsolla/xui-core\";\nimport { Typography } from \"@xsolla/xui-typography\";\nimport { Tooltip } from \"@xsolla/xui-tooltip\";\nimport { OpenIn } from \"@xsolla/xui-icons-base\";\nimport { ITEM_BASE_CLASS, ITEM_ACTIVE_CLASS } from \"./constants\";\n\nconst TOOLTIP_TRUNCATE_LENGTH = 20;\n\ninterface WrapperProps {\n $itemHeight: number;\n $iconSize: number;\n $padding: number;\n $radius: number;\n $colorIdle: string;\n $colorActive: string;\n $hoverBg: string;\n $activeBg: string;\n $activeOutline: string;\n $focusOutline: string;\n $focusOutlineWidth: number;\n $multiLine?: boolean;\n}\n\n// Wraps the consumer-provided LinkComponent so we can attach hover/active/focus\n// styles without requiring the link to be styled-components-aware. The link\n// receives a className we own; active state is carried via activeClassName.\nconst ItemWrapper = styled.div<WrapperProps>`\n display: contents;\n\n & > .${ITEM_BASE_CLASS} {\n display: flex;\n height: ${(p) => (p.$multiLine ? \"auto\" : `${p.$itemHeight}px`)};\n max-height: ${(p) => (p.$multiLine ? \"none\" : `${p.$itemHeight}px`)};\n width: 100%;\n box-sizing: border-box;\n align-items: ${(p) => (p.$multiLine ? \"flex-start\" : \"center\")};\n gap: 8px;\n padding: 0 ${(p) => p.$padding}px;\n border-radius: ${(p) => p.$radius}px;\n color: ${(p) => p.$colorIdle};\n cursor: pointer;\n font-size: 14px;\n font-weight: 500;\n line-height: 18px;\n overflow: hidden;\n transition:\n background-color 0.15s ease-in-out,\n color 0.15s ease-in-out;\n white-space: ${(p) => (p.$multiLine ? \"normal\" : \"nowrap\")};\n text-align: left;\n text-decoration: none;\n }\n\n & > .${ITEM_BASE_CLASS}:hover {\n background-color: ${(p) => p.$hoverBg};\n }\n\n & > .${ITEM_BASE_CLASS}:focus-visible {\n outline: ${(p) => p.$focusOutlineWidth}px solid ${(p) => p.$focusOutline};\n outline-offset: -${(p) => p.$focusOutlineWidth}px;\n }\n\n & > .${ITEM_ACTIVE_CLASS} {\n background-color: ${(p) => p.$activeBg};\n outline: 1px solid ${(p) => p.$activeOutline};\n outline-offset: -1px;\n color: ${(p) => p.$colorActive};\n font-weight: 500;\n }\n`;\n\ninterface IconBoxProps {\n $size: number;\n $pin?: boolean;\n}\n\nconst IconBox = styled.div<IconBoxProps>`\n display: flex;\n width: ${(p) => p.$size}px;\n height: ${(p) => p.$size}px;\n flex-shrink: 0;\n align-items: center;\n justify-content: center;\n color: inherit;\n\n svg {\n width: ${(p) => (p.$pin ? \"12px\" : `${p.$size}px`)};\n height: ${(p) => (p.$pin ? \"12px\" : `${p.$size}px`)};\n }\n`;\n\nconst LabelBox = styled.span`\n display: flex;\n flex: 1;\n gap: 4px;\n height: 20px;\n align-items: center;\n min-width: 0;\n overflow: hidden;\n text-overflow: ellipsis;\n`;\n\ninterface BadgeDotProps {\n $size: number;\n $color: string;\n}\n\nconst BadgeDot = styled.span<BadgeDotProps>`\n width: ${(p) => p.$size}px;\n height: ${(p) => p.$size}px;\n flex-shrink: 0;\n background: ${(p) => p.$color};\n border-radius: 999px;\n`;\n\ninterface BetaTagProps {\n $bg: string;\n $color: string;\n $radius: number;\n}\n\nconst BetaTag = styled.span<BetaTagProps>`\n padding: 2px 6px;\n border-radius: ${(p) => p.$radius}px;\n background: ${(p) => p.$bg};\n color: ${(p) => p.$color};\n font-size: 11px;\n font-weight: 500;\n line-height: 14px;\n flex-shrink: 0;\n`;\n\ninterface ExternalIconBoxProps {\n $size: number;\n $color: string;\n}\n\nconst ExternalIconBox = styled.span<ExternalIconBoxProps>`\n display: flex;\n width: ${(p) => p.$size}px;\n height: ${(p) => p.$size}px;\n flex-shrink: 0;\n align-items: center;\n justify-content: center;\n margin-left: auto;\n color: ${(p) => p.$color};\n`;\n\nexport interface SidebarMenuItemProps {\n to?: string;\n label: ReactNode;\n icon?: ReactNode;\n exact?: boolean;\n external?: boolean;\n hasExternalIcon?: boolean;\n target?: string | null;\n onClick?: SidebarLinkClickHandler;\n dataId?: string;\n isActive?: SidebarLinkActiveCheck;\n isPinned?: boolean;\n showBadge?: boolean;\n hasTooltip?: boolean;\n beta?: boolean;\n multiLine?: boolean;\n extra?: ReactNode;\n /** Whether this item is inside a SidebarMenuSub (parent collapsible sets nested styling) */\n isNested?: boolean;\n}\n\nexport const SidebarMenuItem: React.FC<SidebarMenuItemProps> = ({\n to,\n label,\n icon,\n exact,\n external,\n hasExternalIcon,\n target,\n onClick,\n dataId,\n isActive,\n isPinned,\n showBadge,\n hasTooltip,\n beta,\n multiLine,\n extra,\n isNested = false,\n}) => {\n const { LinkComponent } = useSidebar();\n const { theme } = useResolvedTheme();\n const sizing = theme.sizing.sidebar();\n\n const shouldTruncate =\n Boolean(hasTooltip) &&\n typeof label === \"string\" &&\n label.length > TOOLTIP_TRUNCATE_LENGTH;\n\n const displayLabel: ReactNode = shouldTruncate ? (\n <Tooltip content={label as string} placement=\"right\" size=\"md\">\n <span>{`${(label as string).slice(0, TOOLTIP_TRUNCATE_LENGTH)}…`}</span>\n </Tooltip>\n ) : (\n label\n );\n\n return (\n <ItemWrapper\n $itemHeight={sizing.itemHeight}\n $iconSize={sizing.iconSize}\n $padding={sizing.padding}\n $radius={sizing.radius}\n $colorIdle={theme.colors.content.tertiary}\n $colorActive={theme.colors.content.primary}\n $hoverBg={theme.colors.overlay.mono}\n $activeBg={theme.colors.overlay.mono}\n $activeOutline={theme.colors.border.secondary}\n $focusOutline={theme.colors.border.brand}\n $focusOutlineWidth={sizing.focusOutlineWidth}\n $multiLine={multiLine}\n >\n <LinkComponent\n to={to}\n exact={exact}\n external={external}\n target={target}\n onClick={onClick}\n isActive={isActive}\n className={ITEM_BASE_CLASS}\n activeClassName={ITEM_ACTIVE_CLASS}\n dataId={dataId}\n >\n {icon && !isNested && (\n <IconBox $size={sizing.iconSize} $pin={isPinned}>\n {icon}\n </IconBox>\n )}\n {extra}\n <LabelBox>\n <Typography\n variant={isNested ? \"bodySm\" : \"bodySmAccent\"}\n color=\"inherit\"\n noWrap={!multiLine}\n >\n {displayLabel}\n </Typography>\n {showBadge && (\n <BadgeDot\n $size={sizing.itemBadgeSize}\n $color={theme.colors.background.alert.primary}\n />\n )}\n </LabelBox>\n {beta && (\n <BetaTag\n $bg={theme.colors.overlay.mono}\n $color={theme.colors.content.tertiary}\n $radius={sizing.radius}\n >\n Beta\n </BetaTag>\n )}\n {external && hasExternalIcon && (\n <ExternalIconBox\n $size={sizing.externalIconSize}\n $color={theme.colors.content.secondary}\n >\n <OpenIn size={18} variant=\"line\" />\n </ExternalIconBox>\n )}\n </LinkComponent>\n </ItemWrapper>\n );\n};\n","/**\n * Shared classnames for the link rendered by user-supplied LinkComponent.\n * SidebarMenuItem applies these via the className/activeClassName props of\n * the consumer link. Parent containers (collapsible regions, nested rails)\n * scope their styles by descendant-targeting these classes inside a\n * styled-component, so the auto-generated parent class keeps them isolated.\n */\nexport const ITEM_BASE_CLASS = \"xui-sb-item\";\nexport const ITEM_ACTIVE_CLASS = \"xui-sb-item--active\";\n","import React, { type ReactNode, useEffect, useMemo, useRef } from \"react\";\nimport styled from \"styled-components\";\nimport { useResolvedTheme } from \"@xsolla/xui-core\";\nimport { Typography } from \"@xsolla/xui-typography\";\nimport { ChevronRight, ChevronUp } from \"@xsolla/xui-icons-base\";\nimport { useSidebar } from \"./SidebarContext\";\nimport { ITEM_BASE_CLASS, ITEM_ACTIVE_CLASS } from \"./constants\";\n\ninterface HeaderProps {\n $itemHeight: number;\n $padding: number;\n $radius: number;\n $color: string;\n $hoverBg: string;\n $focusOutline: string;\n $focusOutlineWidth: number;\n}\n\nconst HeaderButton = styled.button<HeaderProps>`\n display: flex;\n height: ${(p) => p.$itemHeight}px;\n width: 100%;\n box-sizing: border-box;\n align-items: center;\n gap: 8px;\n padding: 0 ${(p) => p.$padding}px;\n border: 0;\n border-radius: ${(p) => p.$radius}px;\n background: transparent;\n color: ${(p) => p.$color};\n cursor: pointer;\n font-size: 14px;\n font-weight: 500;\n line-height: 18px;\n font-family: inherit;\n text-align: left;\n white-space: nowrap;\n overflow: hidden;\n transition:\n background-color 0.15s ease-in-out,\n color 0.15s ease-in-out;\n\n &:hover {\n background-color: ${(p) => p.$hoverBg};\n }\n\n &:focus-visible {\n outline: ${(p) => p.$focusOutlineWidth}px solid ${(p) => p.$focusOutline};\n outline-offset: -${(p) => p.$focusOutlineWidth}px;\n }\n`;\n\ninterface RegionProps {\n $expanded: boolean;\n $transition: string;\n $padding: number;\n $nestedPaddingLeft: number;\n $railLeft: number;\n $railColor: string;\n $colorActive: string;\n $activeBg: string;\n $activeOutline: string;\n}\n\n// Animated grid-template-rows trick (no fixed height needed). When expanded the\n// grid row goes 0fr → 1fr; the inner div has overflow:hidden so children clip.\n// Nested SidebarMenuItem links are styled here so they get the indent + rail.\nconst ExpandRegion = styled.div<RegionProps>`\n display: grid;\n grid-template-rows: ${(p) => (p.$expanded ? \"1fr\" : \"0fr\")};\n transition: ${(p) => p.$transition};\n\n & > div {\n overflow: hidden;\n }\n\n & .${ITEM_BASE_CLASS} {\n position: relative;\n padding: 0 ${(p) => p.$padding}px 0 ${(p) => p.$nestedPaddingLeft}px;\n font-weight: 400;\n\n &::before {\n content: \"\";\n position: absolute;\n left: ${(p) => p.$railLeft}px;\n top: 0;\n bottom: 0;\n width: 1px;\n background: ${(p) => p.$railColor};\n transform: translateX(-50%);\n }\n }\n\n & .${ITEM_ACTIVE_CLASS} {\n font-weight: 500;\n color: ${(p) => p.$colorActive};\n background-color: ${(p) => p.$activeBg};\n outline: 1px solid ${(p) => p.$activeOutline};\n outline-offset: -1px;\n }\n`;\n\ninterface IconBoxProps {\n $size: number;\n}\n\nconst IconBox = styled.div<IconBoxProps>`\n display: flex;\n width: ${(p) => p.$size}px;\n height: ${(p) => p.$size}px;\n flex-shrink: 0;\n align-items: center;\n justify-content: center;\n color: inherit;\n\n svg {\n width: ${(p) => p.$size}px;\n height: ${(p) => p.$size}px;\n }\n`;\n\nconst LabelBox = styled.span`\n display: flex;\n flex: 1;\n gap: 4px;\n height: 20px;\n align-items: center;\n min-width: 0;\n overflow: hidden;\n text-overflow: ellipsis;\n`;\n\ninterface ChevronBoxProps {\n $size: number;\n}\n\nconst ChevronBox = styled.span<ChevronBoxProps>`\n display: flex;\n width: ${(p) => p.$size}px;\n height: ${(p) => p.$size}px;\n flex-shrink: 0;\n align-items: center;\n justify-content: center;\n margin-left: auto;\n color: inherit;\n\n svg {\n width: ${(p) => p.$size}px;\n height: ${(p) => p.$size}px;\n }\n`;\n\nexport interface SidebarMenuCollapsibleProps {\n icon?: ReactNode;\n label: ReactNode;\n dataId?: string;\n /** Route prefixes that should auto-expand this collapsible */\n matchPaths?: string[];\n children: ReactNode;\n}\n\nconst computeRouteMatch = (pathname: string, matchPaths: string[]): boolean => {\n if (matchPaths.length === 0) {\n return false;\n }\n const pathWithoutMerchant = pathname.replace(/^\\/\\d+/, \"\");\n return matchPaths.some((p) => {\n if (p === \"/\") return pathWithoutMerchant === \"/\";\n return pathWithoutMerchant === p || pathWithoutMerchant.startsWith(`${p}/`);\n });\n};\n\nexport const SidebarMenuCollapsible: React.FC<SidebarMenuCollapsibleProps> = ({\n icon,\n label,\n dataId,\n matchPaths = [],\n children,\n}) => {\n const { pathname, expandedId, onExpandedIdChange } = useSidebar();\n const { theme } = useResolvedTheme();\n const sizing = theme.sizing.sidebar();\n\n // Stable id created once per instance; safe under React 16 (no useId).\n const idRef = useRef<string>();\n if (!idRef.current) {\n idRef.current =\n dataId || `sb-collapsible-${Math.random().toString(36).slice(2, 10)}`;\n }\n const collapsibleId = idRef.current;\n const contentId = `sidebar-collapsible-${collapsibleId}`;\n\n const matchKey = matchPaths.join(\"|\");\n const isRouteMatch = useMemo(\n () => computeRouteMatch(pathname, matchPaths),\n [pathname, matchKey, matchPaths]\n );\n\n const prevMatchRef = useRef<boolean>(isRouteMatch);\n\n useEffect(() => {\n if (prevMatchRef.current !== isRouteMatch) {\n prevMatchRef.current = isRouteMatch;\n if (isRouteMatch) {\n onExpandedIdChange(collapsibleId);\n }\n }\n }, [isRouteMatch, collapsibleId, onExpandedIdChange]);\n\n const mountRef = useRef(true);\n useEffect(() => {\n if (mountRef.current && isRouteMatch) {\n onExpandedIdChange(collapsibleId);\n mountRef.current = false;\n }\n }, [isRouteMatch, collapsibleId, onExpandedIdChange]);\n\n const isExpanded = expandedId === collapsibleId;\n\n const handleToggle = () => {\n onExpandedIdChange(isExpanded ? null : collapsibleId);\n };\n\n return (\n <>\n <HeaderButton\n type=\"button\"\n onClick={handleToggle}\n data-id={dataId}\n aria-expanded={isExpanded}\n aria-controls={contentId}\n $itemHeight={sizing.itemHeight}\n $padding={sizing.padding}\n $radius={sizing.radius}\n $color={theme.colors.content.tertiary}\n $hoverBg={theme.colors.control.mono.secondary.bgHover}\n $focusOutline={theme.colors.border.brand}\n $focusOutlineWidth={sizing.focusOutlineWidth}\n >\n {icon && <IconBox $size={sizing.iconSize}>{icon}</IconBox>}\n <LabelBox>\n <Typography variant=\"bodySmAccent\" color=\"inherit\" noWrap>\n {label}\n </Typography>\n </LabelBox>\n <ChevronBox $size={sizing.chevronSize}>\n {isExpanded ? (\n <ChevronUp size={14} variant=\"solid\" />\n ) : (\n <ChevronRight size={14} variant=\"solid\" />\n )}\n </ChevronBox>\n </HeaderButton>\n <ExpandRegion\n id={contentId}\n role=\"region\"\n $expanded={isExpanded}\n $transition={sizing.transitionRows}\n $padding={sizing.padding}\n $nestedPaddingLeft={sizing.nestedItemPaddingLeft}\n $railLeft={sizing.nestedItemRailLeft}\n $railColor={theme.colors.border.secondary}\n $colorActive={theme.colors.content.primary}\n $activeBg={theme.colors.overlay.mono}\n $activeOutline={theme.colors.border.secondary}\n >\n <div>{children}</div>\n </ExpandRegion>\n </>\n );\n};\n","import React, { type ReactNode } from \"react\";\n\n/**\n * Container for nested menu items inside a SidebarMenuCollapsible.\n * Child SidebarMenuItems automatically get nested styling via the parent\n * SidebarMenuCollapsible's CSS cascade (vertical rail + indent).\n */\nexport const SidebarMenuSub: React.FC<{ children: ReactNode }> = ({\n children,\n}) => <>{children}</>;\n","import React from \"react\";\nimport styled from \"styled-components\";\nimport { useResolvedTheme } from \"@xsolla/xui-core\";\nimport { Typography } from \"@xsolla/xui-typography\";\nimport { ChatTwoMessages } from \"@xsolla/xui-icons-base\";\n\ninterface ChatProps {\n $height: number;\n $padding: number;\n $radius: number;\n $bg: string;\n $border: string;\n $color: string;\n $focusOutline: string;\n $focusOutlineWidth: number;\n}\n\nconst ChatButton = styled.button<ChatProps>`\n display: flex;\n height: ${(p) => p.$height}px;\n align-items: center;\n gap: 8px;\n padding: 0 ${(p) => p.$padding}px;\n border: 1px solid ${(p) => p.$border};\n border-radius: ${(p) => p.$radius}px;\n background: ${(p) => p.$bg};\n color: ${(p) => p.$color};\n cursor: pointer;\n font: inherit;\n position: relative;\n\n &:hover {\n opacity: 0.9;\n }\n\n &:focus-visible {\n outline: ${(p) => p.$focusOutlineWidth}px solid ${(p) => p.$focusOutline};\n outline-offset: 2px;\n }\n\n svg {\n width: 16px;\n height: 16px;\n }\n`;\n\ninterface BadgeProps {\n $size: number;\n $color: string;\n}\n\nconst Badge = styled.span<BadgeProps>`\n position: absolute;\n top: -2px;\n right: -2px;\n width: ${(p) => p.$size}px;\n height: ${(p) => p.$size}px;\n background: ${(p) => p.$color};\n border-radius: 999px;\n`;\n\ninterface SidebarChatButtonProps {\n onClick?: () => void;\n badge?: boolean;\n}\n\nexport const SidebarChatButton: React.FC<SidebarChatButtonProps> = ({\n onClick,\n badge,\n}) => {\n const { theme } = useResolvedTheme();\n const sizing = theme.sizing.sidebar();\n\n return (\n <ChatButton\n onClick={onClick}\n type=\"button\"\n $height={sizing.itemHeight}\n $padding={sizing.padding}\n $radius={sizing.radius}\n $bg={theme.colors.control.brand.primary.bg}\n $border={theme.colors.control.brand.primary.border}\n $color={theme.colors.content.static.dark}\n $focusOutline={theme.colors.border.brand}\n $focusOutlineWidth={sizing.focusOutlineWidth}\n >\n <ChatTwoMessages size={16} variant=\"line\" />\n <Typography variant=\"bodySmAccent\" color=\"inherit\">\n Chat\n </Typography>\n {badge && (\n <Badge\n $size={sizing.chatBadgeSize}\n $color={theme.colors.background.alert.primary}\n />\n )}\n </ChatButton>\n );\n};\n"],"mappings":"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","names":["styled","useResolvedTheme","useCallback","useState","jsx","jsx","jsxs","useCallback","useState","jsx","jsxs","Outer","styled","useResolvedTheme","styled","useResolvedTheme","jsx","jsx","useResolvedTheme","jsx","styled","useResolvedTheme","jsx","styled","useResolvedTheme","useResolvedTheme","Typography","jsx","jsxs","jsx","styled","useResolvedTheme","Typography","jsx","jsxs","styled","useResolvedTheme","Typography","useEffect","useMemo","useRef","styled","useResolvedTheme","Typography","Fragment","jsx","jsxs","styled","IconBox","LabelBox","useResolvedTheme","useRef","useMemo","useEffect","Typography","Fragment","jsx","styled","useResolvedTheme","Typography","ChatTwoMessages","jsx","jsxs"]}
package/package.json ADDED
@@ -0,0 +1,61 @@
1
+ {
2
+ "name": "@xsolla/xui-b2b-sidebar",
3
+ "version": "0.147.1",
4
+ "main": "./web/index.js",
5
+ "module": "./web/index.mjs",
6
+ "types": "./web/index.d.ts",
7
+ "scripts": {
8
+ "build": "yarn build:web && yarn build:native",
9
+ "build:web": "PLATFORM=web tsup",
10
+ "build:native": "PLATFORM=native tsup",
11
+ "test": "vitest",
12
+ "test:run": "vitest run",
13
+ "test:coverage": "vitest run --coverage"
14
+ },
15
+ "dependencies": {
16
+ "@xsolla/xui-core": "0.147.1",
17
+ "@xsolla/xui-icons-base": "0.147.1",
18
+ "@xsolla/xui-primitives-core": "0.147.1",
19
+ "@xsolla/xui-tooltip": "0.147.1",
20
+ "@xsolla/xui-typography": "0.147.1"
21
+ },
22
+ "peerDependencies": {
23
+ "react": ">=16.8.0",
24
+ "react-dom": ">=16",
25
+ "styled-components": ">=4"
26
+ },
27
+ "devDependencies": {
28
+ "@testing-library/jest-dom": "^6.9.1",
29
+ "@testing-library/react": "^14.1.2",
30
+ "@vitest/coverage-v8": "^4.0.18",
31
+ "jsdom": "^24.0.0",
32
+ "react": "^18.0.0",
33
+ "react-dom": "^18.0.0",
34
+ "tsup": "^8.0.0",
35
+ "vitest": "^4.0.18"
36
+ },
37
+ "license": "MIT",
38
+ "sideEffects": false,
39
+ "react-native": "./native/index.js",
40
+ "exports": {
41
+ ".": {
42
+ "react-native": {
43
+ "types": "./native/index.d.ts",
44
+ "import": "./native/index.mjs",
45
+ "require": "./native/index.js"
46
+ },
47
+ "import": {
48
+ "types": "./web/index.d.ts",
49
+ "default": "./web/index.mjs"
50
+ },
51
+ "require": {
52
+ "types": "./web/index.d.ts",
53
+ "default": "./web/index.js"
54
+ },
55
+ "default": {
56
+ "types": "./web/index.d.ts",
57
+ "default": "./web/index.js"
58
+ }
59
+ }
60
+ }
61
+ }
@@ -0,0 +1,188 @@
1
+ import React, { MouseEvent, ReactNode } from 'react';
2
+
3
+ type SidebarLinkClickHandler = (event?: MouseEvent<HTMLElement>) => void;
4
+ type SidebarLinkActiveCheck = (match: unknown, location: {
5
+ pathname: string;
6
+ search?: string;
7
+ hash?: string;
8
+ }) => boolean;
9
+ interface SidebarLinkProps {
10
+ to?: string;
11
+ exact?: boolean;
12
+ external?: boolean;
13
+ target?: string | null;
14
+ className?: string;
15
+ activeClassName?: string;
16
+ isActive?: SidebarLinkActiveCheck;
17
+ onClick?: SidebarLinkClickHandler;
18
+ dataId?: string;
19
+ children: ReactNode;
20
+ }
21
+ interface SidebarContextValue {
22
+ collapsed: boolean;
23
+ onCollapsedChange: (collapsed: boolean) => void;
24
+ pathname: string;
25
+ LinkComponent: React.ComponentType<SidebarLinkProps>;
26
+ expandedId: string | null;
27
+ onExpandedIdChange: (id: string | null) => void;
28
+ }
29
+ interface SidebarProviderProps {
30
+ collapsed?: boolean;
31
+ onCollapsedChange?: (collapsed: boolean) => void;
32
+ pathname?: string;
33
+ linkComponent?: React.ComponentType<SidebarLinkProps>;
34
+ children: ReactNode;
35
+ }
36
+ declare const SidebarProvider: React.FC<SidebarProviderProps>;
37
+ declare const useSidebar: () => SidebarContextValue;
38
+
39
+ /**
40
+ * SidebarItemType — Config object for data-driven patterns (collapsed mode, dynamic lists).
41
+ * For the composable API, use SidebarMenuItem/SidebarMenuCollapsible props directly.
42
+ */
43
+ type SidebarItemType = {
44
+ to?: string;
45
+ label: ReactNode;
46
+ privileges?: Array<string>;
47
+ dataId?: string;
48
+ icon?: ReactNode;
49
+ reverse?: boolean;
50
+ target?: string | null;
51
+ exact?: boolean;
52
+ external?: boolean;
53
+ hasExternalIcon?: boolean;
54
+ onClick?: SidebarLinkClickHandler;
55
+ extra?: ReactNode;
56
+ hasTooltip?: boolean;
57
+ beta?: boolean;
58
+ multiLine?: boolean;
59
+ children?: Array<SidebarItemType>;
60
+ isActive?: SidebarLinkActiveCheck;
61
+ visibility?: string;
62
+ disallowedIntegrationTypes?: Array<string>;
63
+ isPinned?: boolean;
64
+ showBadge?: boolean;
65
+ };
66
+
67
+ /**
68
+ * Sidebar — Composable compound component following Shadcn/Radix patterns.
69
+ *
70
+ * Usage:
71
+ * <SidebarProvider collapsed={false} onCollapsedChange={fn} pathname={path} linkComponent={Link}>
72
+ * <Sidebar>
73
+ * <SidebarContent>
74
+ * <SidebarGroup label="Main">
75
+ * <SidebarMenu>
76
+ * <SidebarMenuItem to="/dashboard" icon={<Icon />} label="Dashboard" />
77
+ * <SidebarMenuCollapsible icon={<Icon />} label="Finance" matchPaths={['/finance']}>
78
+ * <SidebarMenuSub>
79
+ * <SidebarMenuItem to="/finance/payouts" label="Payouts" isNested />
80
+ * </SidebarMenuSub>
81
+ * </SidebarMenuCollapsible>
82
+ * </SidebarMenu>
83
+ * </SidebarGroup>
84
+ * </SidebarContent>
85
+ * <SidebarFooter>
86
+ * <SidebarTrigger />
87
+ * </SidebarFooter>
88
+ * </Sidebar>
89
+ * </SidebarProvider>
90
+ */
91
+
92
+ interface SidebarProps {
93
+ /** Items for the collapsed icon strip (since collapsed layout is fundamentally different) */
94
+ collapsedItems?: SidebarItemType[];
95
+ /** Tool items shown below a spacer in collapsed mode */
96
+ collapsedToolItems?: SidebarItemType[];
97
+ /** Bottom items in collapsed mode (e.g. Billing, Settings) */
98
+ collapsedBottomItems?: SidebarItemType[];
99
+ /** Whether to render the chat button in collapsed mode (defaults to true) */
100
+ showChat?: boolean;
101
+ /** Click handler for the chat button (collapsed mode) */
102
+ onChatClick?: () => void;
103
+ /** Whether the chat button shows a notification badge */
104
+ chatBadge?: boolean;
105
+ children: ReactNode;
106
+ }
107
+ declare const Sidebar: React.FC<SidebarProps>;
108
+
109
+ declare const SidebarContent: React.FC<{
110
+ children: ReactNode;
111
+ }>;
112
+
113
+ declare const SidebarFooter: React.FC<{
114
+ children: ReactNode;
115
+ }>;
116
+
117
+ declare const SidebarTrigger: React.FC;
118
+
119
+ interface SidebarGroupProps {
120
+ label?: string;
121
+ dataId?: string;
122
+ children: ReactNode;
123
+ }
124
+ declare const SidebarGroup: React.FC<SidebarGroupProps>;
125
+
126
+ declare const SidebarMenu: React.FC<{
127
+ children: ReactNode;
128
+ }>;
129
+
130
+ interface SidebarMenuItemProps {
131
+ to?: string;
132
+ label: ReactNode;
133
+ icon?: ReactNode;
134
+ exact?: boolean;
135
+ external?: boolean;
136
+ hasExternalIcon?: boolean;
137
+ target?: string | null;
138
+ onClick?: SidebarLinkClickHandler;
139
+ dataId?: string;
140
+ isActive?: SidebarLinkActiveCheck;
141
+ isPinned?: boolean;
142
+ showBadge?: boolean;
143
+ hasTooltip?: boolean;
144
+ beta?: boolean;
145
+ multiLine?: boolean;
146
+ extra?: ReactNode;
147
+ /** Whether this item is inside a SidebarMenuSub (parent collapsible sets nested styling) */
148
+ isNested?: boolean;
149
+ }
150
+ declare const SidebarMenuItem: React.FC<SidebarMenuItemProps>;
151
+
152
+ interface SidebarMenuCollapsibleProps {
153
+ icon?: ReactNode;
154
+ label: ReactNode;
155
+ dataId?: string;
156
+ /** Route prefixes that should auto-expand this collapsible */
157
+ matchPaths?: string[];
158
+ children: ReactNode;
159
+ }
160
+ declare const SidebarMenuCollapsible: React.FC<SidebarMenuCollapsibleProps>;
161
+
162
+ /**
163
+ * Container for nested menu items inside a SidebarMenuCollapsible.
164
+ * Child SidebarMenuItems automatically get nested styling via the parent
165
+ * SidebarMenuCollapsible's CSS cascade (vertical rail + indent).
166
+ */
167
+ declare const SidebarMenuSub: React.FC<{
168
+ children: ReactNode;
169
+ }>;
170
+
171
+ interface SidebarChatButtonProps {
172
+ onClick?: () => void;
173
+ badge?: boolean;
174
+ }
175
+ declare const SidebarChatButton: React.FC<SidebarChatButtonProps>;
176
+
177
+ interface SidebarCollapsedProps {
178
+ items: SidebarItemType[];
179
+ toolItems?: SidebarItemType[];
180
+ bottomItems?: SidebarItemType[];
181
+ onToggleCollapse?: () => void;
182
+ onChatClick?: () => void;
183
+ showChat?: boolean;
184
+ chatBadge?: boolean;
185
+ }
186
+ declare const SidebarCollapsed: React.FC<SidebarCollapsedProps>;
187
+
188
+ export { Sidebar, SidebarChatButton, SidebarCollapsed, type SidebarCollapsedProps, SidebarContent, SidebarFooter, SidebarGroup, type SidebarItemType, type SidebarLinkActiveCheck, type SidebarLinkClickHandler, type SidebarLinkProps, SidebarMenu, SidebarMenuCollapsible, type SidebarMenuCollapsibleProps, SidebarMenuItem, type SidebarMenuItemProps, SidebarMenuSub, type SidebarProps, SidebarProvider, type SidebarProviderProps, SidebarTrigger, useSidebar };
package/web/index.d.ts ADDED
@@ -0,0 +1,188 @@
1
+ import React, { MouseEvent, ReactNode } from 'react';
2
+
3
+ type SidebarLinkClickHandler = (event?: MouseEvent<HTMLElement>) => void;
4
+ type SidebarLinkActiveCheck = (match: unknown, location: {
5
+ pathname: string;
6
+ search?: string;
7
+ hash?: string;
8
+ }) => boolean;
9
+ interface SidebarLinkProps {
10
+ to?: string;
11
+ exact?: boolean;
12
+ external?: boolean;
13
+ target?: string | null;
14
+ className?: string;
15
+ activeClassName?: string;
16
+ isActive?: SidebarLinkActiveCheck;
17
+ onClick?: SidebarLinkClickHandler;
18
+ dataId?: string;
19
+ children: ReactNode;
20
+ }
21
+ interface SidebarContextValue {
22
+ collapsed: boolean;
23
+ onCollapsedChange: (collapsed: boolean) => void;
24
+ pathname: string;
25
+ LinkComponent: React.ComponentType<SidebarLinkProps>;
26
+ expandedId: string | null;
27
+ onExpandedIdChange: (id: string | null) => void;
28
+ }
29
+ interface SidebarProviderProps {
30
+ collapsed?: boolean;
31
+ onCollapsedChange?: (collapsed: boolean) => void;
32
+ pathname?: string;
33
+ linkComponent?: React.ComponentType<SidebarLinkProps>;
34
+ children: ReactNode;
35
+ }
36
+ declare const SidebarProvider: React.FC<SidebarProviderProps>;
37
+ declare const useSidebar: () => SidebarContextValue;
38
+
39
+ /**
40
+ * SidebarItemType — Config object for data-driven patterns (collapsed mode, dynamic lists).
41
+ * For the composable API, use SidebarMenuItem/SidebarMenuCollapsible props directly.
42
+ */
43
+ type SidebarItemType = {
44
+ to?: string;
45
+ label: ReactNode;
46
+ privileges?: Array<string>;
47
+ dataId?: string;
48
+ icon?: ReactNode;
49
+ reverse?: boolean;
50
+ target?: string | null;
51
+ exact?: boolean;
52
+ external?: boolean;
53
+ hasExternalIcon?: boolean;
54
+ onClick?: SidebarLinkClickHandler;
55
+ extra?: ReactNode;
56
+ hasTooltip?: boolean;
57
+ beta?: boolean;
58
+ multiLine?: boolean;
59
+ children?: Array<SidebarItemType>;
60
+ isActive?: SidebarLinkActiveCheck;
61
+ visibility?: string;
62
+ disallowedIntegrationTypes?: Array<string>;
63
+ isPinned?: boolean;
64
+ showBadge?: boolean;
65
+ };
66
+
67
+ /**
68
+ * Sidebar — Composable compound component following Shadcn/Radix patterns.
69
+ *
70
+ * Usage:
71
+ * <SidebarProvider collapsed={false} onCollapsedChange={fn} pathname={path} linkComponent={Link}>
72
+ * <Sidebar>
73
+ * <SidebarContent>
74
+ * <SidebarGroup label="Main">
75
+ * <SidebarMenu>
76
+ * <SidebarMenuItem to="/dashboard" icon={<Icon />} label="Dashboard" />
77
+ * <SidebarMenuCollapsible icon={<Icon />} label="Finance" matchPaths={['/finance']}>
78
+ * <SidebarMenuSub>
79
+ * <SidebarMenuItem to="/finance/payouts" label="Payouts" isNested />
80
+ * </SidebarMenuSub>
81
+ * </SidebarMenuCollapsible>
82
+ * </SidebarMenu>
83
+ * </SidebarGroup>
84
+ * </SidebarContent>
85
+ * <SidebarFooter>
86
+ * <SidebarTrigger />
87
+ * </SidebarFooter>
88
+ * </Sidebar>
89
+ * </SidebarProvider>
90
+ */
91
+
92
+ interface SidebarProps {
93
+ /** Items for the collapsed icon strip (since collapsed layout is fundamentally different) */
94
+ collapsedItems?: SidebarItemType[];
95
+ /** Tool items shown below a spacer in collapsed mode */
96
+ collapsedToolItems?: SidebarItemType[];
97
+ /** Bottom items in collapsed mode (e.g. Billing, Settings) */
98
+ collapsedBottomItems?: SidebarItemType[];
99
+ /** Whether to render the chat button in collapsed mode (defaults to true) */
100
+ showChat?: boolean;
101
+ /** Click handler for the chat button (collapsed mode) */
102
+ onChatClick?: () => void;
103
+ /** Whether the chat button shows a notification badge */
104
+ chatBadge?: boolean;
105
+ children: ReactNode;
106
+ }
107
+ declare const Sidebar: React.FC<SidebarProps>;
108
+
109
+ declare const SidebarContent: React.FC<{
110
+ children: ReactNode;
111
+ }>;
112
+
113
+ declare const SidebarFooter: React.FC<{
114
+ children: ReactNode;
115
+ }>;
116
+
117
+ declare const SidebarTrigger: React.FC;
118
+
119
+ interface SidebarGroupProps {
120
+ label?: string;
121
+ dataId?: string;
122
+ children: ReactNode;
123
+ }
124
+ declare const SidebarGroup: React.FC<SidebarGroupProps>;
125
+
126
+ declare const SidebarMenu: React.FC<{
127
+ children: ReactNode;
128
+ }>;
129
+
130
+ interface SidebarMenuItemProps {
131
+ to?: string;
132
+ label: ReactNode;
133
+ icon?: ReactNode;
134
+ exact?: boolean;
135
+ external?: boolean;
136
+ hasExternalIcon?: boolean;
137
+ target?: string | null;
138
+ onClick?: SidebarLinkClickHandler;
139
+ dataId?: string;
140
+ isActive?: SidebarLinkActiveCheck;
141
+ isPinned?: boolean;
142
+ showBadge?: boolean;
143
+ hasTooltip?: boolean;
144
+ beta?: boolean;
145
+ multiLine?: boolean;
146
+ extra?: ReactNode;
147
+ /** Whether this item is inside a SidebarMenuSub (parent collapsible sets nested styling) */
148
+ isNested?: boolean;
149
+ }
150
+ declare const SidebarMenuItem: React.FC<SidebarMenuItemProps>;
151
+
152
+ interface SidebarMenuCollapsibleProps {
153
+ icon?: ReactNode;
154
+ label: ReactNode;
155
+ dataId?: string;
156
+ /** Route prefixes that should auto-expand this collapsible */
157
+ matchPaths?: string[];
158
+ children: ReactNode;
159
+ }
160
+ declare const SidebarMenuCollapsible: React.FC<SidebarMenuCollapsibleProps>;
161
+
162
+ /**
163
+ * Container for nested menu items inside a SidebarMenuCollapsible.
164
+ * Child SidebarMenuItems automatically get nested styling via the parent
165
+ * SidebarMenuCollapsible's CSS cascade (vertical rail + indent).
166
+ */
167
+ declare const SidebarMenuSub: React.FC<{
168
+ children: ReactNode;
169
+ }>;
170
+
171
+ interface SidebarChatButtonProps {
172
+ onClick?: () => void;
173
+ badge?: boolean;
174
+ }
175
+ declare const SidebarChatButton: React.FC<SidebarChatButtonProps>;
176
+
177
+ interface SidebarCollapsedProps {
178
+ items: SidebarItemType[];
179
+ toolItems?: SidebarItemType[];
180
+ bottomItems?: SidebarItemType[];
181
+ onToggleCollapse?: () => void;
182
+ onChatClick?: () => void;
183
+ showChat?: boolean;
184
+ chatBadge?: boolean;
185
+ }
186
+ declare const SidebarCollapsed: React.FC<SidebarCollapsedProps>;
187
+
188
+ export { Sidebar, SidebarChatButton, SidebarCollapsed, type SidebarCollapsedProps, SidebarContent, SidebarFooter, SidebarGroup, type SidebarItemType, type SidebarLinkActiveCheck, type SidebarLinkClickHandler, type SidebarLinkProps, SidebarMenu, SidebarMenuCollapsible, type SidebarMenuCollapsibleProps, SidebarMenuItem, type SidebarMenuItemProps, SidebarMenuSub, type SidebarProps, SidebarProvider, type SidebarProviderProps, SidebarTrigger, useSidebar };