@provex/components 1.6.2 → 1.7.0-rc.20260522231639.cd6b976

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.
package/LICENSE ADDED
@@ -0,0 +1,21 @@
1
+ MIT License
2
+
3
+ Copyright (c) 2026 Provex
4
+
5
+ Permission is hereby granted, free of charge, to any person obtaining a copy
6
+ of this software and associated documentation files (the "Software"), to deal
7
+ in the Software without restriction, including without limitation the rights
8
+ to use, copy, modify, merge, publish, distribute, sublicense, and/or sell
9
+ copies of the Software, and to permit persons to whom the Software is
10
+ furnished to do so, subject to the following conditions:
11
+
12
+ The above copyright notice and this permission notice shall be included in all
13
+ copies or substantial portions of the Software.
14
+
15
+ THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
16
+ IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
17
+ FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE
18
+ AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
19
+ LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,
20
+ OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE
21
+ SOFTWARE.
package/README.md ADDED
@@ -0,0 +1,48 @@
1
+ # @provex/components
2
+
3
+ Theme-agnostic React UI primitives used across the Provex applications. Small set, focused on filling gaps that Chakra UI and other component libraries leave open — anchored popovers that survive ancestor transforms, URL-synced state hooks, and a few primitives we re-use enough to extract.
4
+
5
+ This package is intentionally small. It is **not** a general-purpose component library; it's the shared surface for Provex apps. External integrators are welcome to use it, but the API stability bar is "we don't break our own apps," not "we don't break yours."
6
+
7
+ ## Install
8
+
9
+ ```bash
10
+ npm install @provex/components react viem
11
+ ```
12
+
13
+ ### Peer Dependencies
14
+
15
+ | Package | Version | Required? |
16
+ |---------|---------|-----------|
17
+ | `react` | `^18.3.1` | yes |
18
+ | `@chakra-ui/react` | `^2.0.0 \|\| ^3.0.0` | optional — only the components that render Chakra primitives |
19
+ | `react-router-dom` | `^6.0.0 \|\| ^7.0.0` | optional — only `url-state` |
20
+ | `viem` | `^2.0.0` | optional — type-level only |
21
+
22
+ ## Exports
23
+
24
+ ```ts
25
+ import { Tooltip, MenuSelect, Card /* ... */ } from '@provex/components'
26
+ import { useUrlState } from '@provex/components/url-state'
27
+ ```
28
+
29
+ | Export | What it is |
30
+ |--------|------------|
31
+ | `Tooltip` | Replacement for Chakra's `Tooltip` with better mobile + portal behavior |
32
+ | `MenuSelect` | Anchored popover-style select that survives ancestor `transform` (uses `getBoundingClientRect` + absolute positioning) |
33
+ | `Card` | Page-shell card with consistent padding/border, used as the standard content container |
34
+ | `useUrlState` | React-Router-aware state hook that round-trips state through query params |
35
+
36
+ See the source for the full export list and prop types.
37
+
38
+ ## Why "theme-agnostic"
39
+
40
+ The components use Chakra primitives when present but don't import Chakra theme tokens directly — colors and spacing come through props or CSS variables. The same component renders sensibly in a Chakra v2, Chakra v3, or no-Chakra app.
41
+
42
+ ## Integration
43
+
44
+ For the buy-flow UI built on these primitives, see [@provex/react](https://www.npmjs.com/package/@provex/react).
45
+
46
+ ## License
47
+
48
+ MIT
package/dist/index.cjs CHANGED
@@ -1169,9 +1169,11 @@ function Tooltip({ label, children, isDisabled, placement = "top", display = "in
1169
1169
  if (isDisabled) setVisible(false);
1170
1170
  }, [isDisabled]);
1171
1171
  if (isDisabled) return /* @__PURE__ */ jsxRuntime.jsx(jsxRuntime.Fragment, { children });
1172
+ const isEnd = placement === "top-end" || placement === "bottom-end";
1173
+ const isTop = placement === "top" || placement === "top-end";
1172
1174
  const tipStyle = {
1173
1175
  position: "absolute",
1174
- left: 0,
1176
+ ...isEnd ? { right: 0 } : { left: 0 },
1175
1177
  width: "max-content",
1176
1178
  maxWidth: 280,
1177
1179
  background: "rgba(0,0,0,0.82)",
@@ -1183,7 +1185,7 @@ function Tooltip({ label, children, isDisabled, placement = "top", display = "in
1183
1185
  zIndex: 9999,
1184
1186
  pointerEvents: "none",
1185
1187
  borderRadius: 2,
1186
- ...placement === "top" ? { bottom: "calc(100% + 5px)" } : { top: "calc(100% + 5px)" }
1188
+ ...isTop ? { bottom: "calc(100% + 5px)" } : { top: "calc(100% + 5px)" }
1187
1189
  };
1188
1190
  return /* @__PURE__ */ jsxRuntime.jsxs(
1189
1191
  "span",
@@ -1 +1 @@
1
- {"version":3,"sources":["../src/Card.tsx","../src/CurrencyIcon.tsx","../src/OverlappingStack.tsx","../src/DepositIdentifier.tsx","../src/FlagIcon.tsx","../src/Popover.tsx","../src/ScrollContainer.tsx","../src/MenuSelect.tsx","../src/MultiSelectFilter.tsx","../src/PaymentCurrencyCombo.tsx","../src/PaymentMethodIcon.tsx","../src/Tooltip.tsx","../src/VersionBadge.tsx"],"names":["jsx","Box","getCurrencyByContractId","jsxs","React","useRef","useState","useEffect","forwardRef","useCallback","Icon","useMemo","Fragment"],"mappings":"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","file":"index.cjs","sourcesContent":["/**\n * @fileoverview Card container components.\n *\n * Provides styled card containers for content sections with:\n * - Semantic token support for automatic light/dark mode\n * - Optional horizontal-rule variant for edge-aligned content\n * - No border radius for efficient horizontal space usage\n */\n\nimport \"react\";\nimport { Box, type BoxProps } from \"@chakra-ui/react\";\n\n/**\n * Card component for wrapping content sections.\n * Features:\n * - No border radius for better horizontal space usage\n * - Box shadow instead of border to avoid affecting scrolling behavior\n * - Configurable padding and background\n * - Uses Chakra semantic tokens for automatic theming\n */\nexport function Card(props: BoxProps): JSX.Element {\n const { children, bg, ...rest } = props;\n\n return (\n <Box\n bg={bg ?? \"surface.card\"}\n color=\"text.primary\"\n boxShadow=\"0 0 0 1px var(--chakra-colors-border-default)\"\n minW={0}\n mb=\"1px\"\n {...rest}\n >\n {children}\n </Box>\n );\n}\n\n/**\n * Card variant with only top and bottom borders.\n * Useful for content that should align with full-width elements\n * without side padding or margins.\n *\n * Features:\n * - Only top and bottom borders (no side borders)\n * - No side margin to align with container edges\n * - Configurable padding and background\n * - Uses Chakra semantic tokens for automatic theming\n *\n * @example\n * ```tsx\n * <CardHorizontalRule>\n * <CurrencyList currencies={currencies} />\n * </CardHorizontalRule>\n * ```\n */\nexport function CardHorizontalRule(props: BoxProps): JSX.Element {\n const { children, bg, ...rest } = props;\n\n return (\n <Box\n bg={bg ?? \"surface.card\"}\n color=\"text.primary\"\n borderTop=\"1px solid\"\n borderBottom=\"1px solid\"\n borderColor=\"border.default\"\n minW={0}\n {...rest}\n >\n {children}\n </Box>\n );\n}\n","/**\n * @fileoverview Currency flag icon component.\n *\n * Displays a country/region flag representing a fiat currency.\n * Uses the currency's contractId (keccak256 hash) to look up flag data.\n */\n\nimport { getCurrencyByContractId } from \"@provex/utils/currencies\";\nimport type { Hex } from \"viem\";\n\n/**\n * Display a fiat currency's flag icon in a circular frame.\n *\n * Looks up the currency by its contract ID (keccak256 hash of the ticker)\n * and displays the associated country flag. Falls back to a \"?\" indicator\n * for unknown currencies.\n *\n * @param currencyId - The currency contract ID (keccak256 hash of ticker like \"USD\")\n * @param size - The size of the icon in pixels (default: 16)\n * @param useZoom - Whether to apply the currency's zoom level for better framing (default: true)\n *\n * @example\n * ```tsx\n * // Display USD flag\n * <CurrencyIcon currencyId=\"0x...\" size={24} />\n * ```\n */\nexport const CurrencyIcon = ({\n currencyId,\n size = 16,\n useZoom = true\n}: {\n currencyId: Hex;\n size?: number;\n useZoom?: boolean;\n}): JSX.Element => {\n let currency = null;\n\n try {\n currency = getCurrencyByContractId(currencyId);\n } catch (err) {\n console.warn('Invalid currency ID:', currencyId, err);\n }\n\n if (!currency) {\n return (\n <span\n style={{\n fontSize: size * 0.75,\n fontWeight: 600,\n color: '#888',\n fontFamily: 'monospace',\n }}\n title={`Unknown currency: ${currencyId}`}\n >\n ?\n </span>\n );\n }\n\n const zoom = useZoom ? (currency.zoom ?? 1.5) : 1;\n const objectFit = 'cover' as const;\n\n return (\n <span\n style={{\n display: 'inline-block',\n width: size,\n height: size,\n overflow: 'hidden',\n borderRadius: '100%',\n }}\n >\n <img\n src={currency.flag}\n alt={currency.ticker}\n title={`${currency.name} (${currency.ticker})`}\n style={{\n width: size,\n height: size,\n objectFit,\n transform: `scale(${zoom})`,\n transformOrigin: 'center center',\n }}\n />\n </span>\n );\n};\n","/**\n * @fileoverview Overlapping stack layout component.\n *\n * Displays items in a horizontal row with configurable overlap/spacing.\n * Commonly used for showing multiple icons (currencies, chains) in a compact space.\n */\n\nimport { ReactNode } from \"react\";\n\n/**\n * Props for OverlappingStack component.\n */\nexport interface OverlappingStackProps {\n /** Array of items to display */\n items: ReactNode[];\n /** Maximum items to show before \"+X\" */\n limit?: number;\n /**\n * Overlap/spacing distance in pixels (default: 8)\n * - Positive values create overlap (e.g., 8 = items overlap by 8px)\n * - Zero creates no spacing (items are side-by-side)\n * - Negative values create spacing (e.g., -2 = 2px gap between items)\n */\n overlap?: number;\n /** Size of each item (for consistent sizing) */\n itemSize?: number;\n /**\n * If true, rightmost items will overlap leftmost items (default: false)\n * By default, leftmost items overlap rightmost items\n */\n reverseZIndex?: boolean;\n}\n\n/**\n * Component to display items in an overlapping stack with overflow count.\n * Useful for showing chain icons, version badges, and IDs in a compact space.\n *\n * @param items - Array of ReactNode items to display\n * @param limit - Maximum items to show (default: 3)\n * @param overlap - Overlap/spacing distance in pixels (default: 8). Use negative values for spacing.\n * @param itemSize - Size of each item in pixels (default: 24)\n * @param reverseZIndex - If true, rightmost items overlap leftmost (default: false)\n */\nexport function OverlappingStack({\n items,\n limit = 3,\n overlap = 8,\n itemSize = 24,\n reverseZIndex = false,\n}: OverlappingStackProps) {\n const visibleItems = items.slice(0, limit);\n const remainingCount = items.length - limit;\n\n return (\n <div\n style={{\n display: \"flex\",\n alignItems: \"center\",\n }}\n >\n {visibleItems.map((item, index) => (\n <div\n key={index}\n style={{\n marginLeft: index > 0 ? -overlap : 0,\n // Only apply z-index when there's actual overlap (positive overlap value)\n ...(overlap > 0 ? { position: \"relative\" as const, zIndex: reverseZIndex ? index + 1 : limit - index } : {}),\n display: \"flex\",\n alignItems: \"center\",\n justifyContent: \"center\",\n minWidth: itemSize,\n minHeight: itemSize,\n }}\n >\n {item}\n </div>\n ))}\n {remainingCount > 0 && (\n <div\n style={{\n fontSize: 11,\n marginLeft: 4,\n fontWeight: 600,\n opacity: 0.7,\n }}\n >\n +{remainingCount}\n </div>\n )}\n </div>\n );\n}\n","/**\n * @fileoverview Deposit identifier display component.\n *\n * Displays a compact deposit identifier showing [chain icon][#id].\n * Used throughout the UI to identify deposits uniquely across chains.\n */\n\nimport React, { ReactNode } from \"react\";\nimport { OverlappingStack } from \"./OverlappingStack\";\n\n/**\n * Props for DepositIdentifier component.\n */\nexport interface DepositIdentifierProps {\n /** Chain icon element to display */\n chainIcon: ReactNode;\n /** @deprecated Version badge has been removed - this prop is ignored */\n version?: \"v2\" | \"v3\";\n /** The local deposit ID */\n localId: bigint | number | string;\n /** @deprecated Version badge has been removed - this prop is ignored */\n versionBadgeColors?: { bgV2: string; bgV3: string; text: string };\n /** Size for each item in the stack (default: 20) */\n itemSize?: number;\n /** Gap between items in pixels (default: 2) */\n gap?: number;\n /** Text color for the ID (default: inherit) */\n textColor?: string;\n}\n\n/**\n * A compound identifier component that displays [chain][localId] in a compact stack.\n * Used to uniquely identify deposits across chains.\n *\n * @example\n * ```tsx\n * <DepositIdentifier\n * chainIcon={<ChainIcon chainId={1} size={20} />}\n * localId={42}\n * />\n * ```\n */\nexport function DepositIdentifier({\n chainIcon,\n localId,\n itemSize = 20,\n gap = 2,\n textColor,\n}: DepositIdentifierProps): JSX.Element {\n const idString = typeof localId === \"bigint\" ? localId.toString() : String(localId);\n\n return (\n <OverlappingStack\n items={[\n <React.Fragment key=\"chain\">{chainIcon}</React.Fragment>,\n <span\n key=\"id\"\n style={{\n fontSize: \"14px\",\n fontWeight: 500,\n color: textColor,\n }}\n >\n #{idString}\n </span>,\n ]}\n overlap={-gap}\n itemSize={itemSize}\n limit={2}\n />\n );\n}\n","/**\n * @fileoverview Flag icon component with error handling.\n *\n * Displays a flag image in a circular frame with graceful fallback\n * when the image fails to load. Creates a canvas-based placeholder\n * showing the first 3 characters of the alt text.\n */\n\nimport React from 'react';\n\n/**\n * Props for FlagIcon component.\n */\ninterface FlagIconProps {\n flag: string;\n alt?: string;\n size?: number;\n className?: string;\n borderColor?: string;\n}\n\n/**\n * Display a flag icon with error handling fallback\n * @param flag - URL to the flag image\n * @param alt - Alt text for the image\n * @param size - Size of the icon in pixels (default: 32)\n * @param className - Additional CSS class names\n * @param borderColor - Border color (default: #e5e7eb)\n */\nexport const FlagIcon: React.FC<FlagIconProps> = ({\n flag,\n alt = 'Flag',\n size = 32,\n className = '',\n borderColor = '#e5e7eb',\n}) => {\n const handleError = (e: React.SyntheticEvent<HTMLImageElement, Event>) => {\n const target = e.target as HTMLImageElement;\n // Create a simple placeholder with the currency code\n const canvas = document.createElement('canvas');\n const ctx = canvas.getContext('2d');\n if (ctx) {\n canvas.width = size;\n canvas.height = size;\n ctx.fillStyle = '#e0e0e0';\n ctx.fillRect(0, 0, size, size);\n ctx.fillStyle = '#666';\n ctx.font = `${Math.floor(size * 0.3)}px Arial`;\n ctx.textAlign = 'center';\n ctx.textBaseline = 'middle';\n ctx.fillText(alt.slice(0, 3), size / 2, size / 2);\n target.src = canvas.toDataURL();\n }\n };\n\n return (\n <img\n src={flag}\n alt={alt}\n className={`inline-block rounded-full ${className}`}\n onError={handleError}\n style={{\n width: `${size}px`,\n height: `${size}px`,\n borderWidth: '1px',\n borderStyle: 'solid',\n borderColor,\n minWidth: `${size}px`,\n minHeight: `${size}px`,\n maxWidth: `${size}px`,\n maxHeight: `${size}px`,\n borderRadius: '50%',\n objectFit: 'cover',\n objectPosition: 'center',\n flexShrink: 0,\n display: 'block'\n }}\n />\n );\n};\n","/**\n * @fileoverview Popover component for dropdown menus and tooltips.\n *\n * Provides a reusable popover with:\n * - Automatic positioning to stay within viewport\n * - Click-outside and Escape key handling\n * - Header, section, and footer sub-components\n * - Theme color customization\n */\n\nimport { useEffect, useRef, ReactNode, useState } from \"react\";\n\n/**\n * Colors required by Popover components.\n * Pass these from your app's theme context.\n */\nexport interface PopoverColors {\n bgCard: string;\n border: string;\n text: string;\n textMuted: string;\n}\n\nexport interface PopoverProps {\n /** Whether the popover is open */\n isOpen: boolean;\n /** Callback when popover should close */\n onClose: () => void;\n /** The trigger button */\n trigger: ReactNode;\n /** The popover content */\n children: ReactNode;\n /** Theme colors */\n colors: PopoverColors;\n /** Placement of popover relative to trigger */\n placement?: \"bottom-start\" | \"bottom-end\" | \"top-start\" | \"top-end\";\n /** Width of popover */\n width?: number;\n /** Min width of popover */\n minWidth?: number;\n /** When true, wrapper uses display:block and dropdown matches trigger width */\n fullWidth?: boolean;\n /** Gap in pixels between trigger and dropdown (default: 4) */\n gap?: number;\n}\n\n/**\n * Reusable popover component with positioning and click-outside handling.\n * Uses fixed positioning to avoid clipping by overflow containers.\n * @param isOpen - Whether the popover is open\n * @param onClose - Callback when popover should close\n * @param trigger - The trigger button element\n * @param children - The popover content\n * @param colors - Theme colors for styling\n * @param placement - Placement relative to trigger (default: \"bottom-start\")\n * @param width - Width of popover in pixels\n * @param minWidth - Min width of popover in pixels (default: 200)\n */\nexport function Popover({\n isOpen,\n onClose,\n trigger,\n children,\n colors,\n placement = \"bottom-start\",\n width,\n minWidth = 200,\n fullWidth = false,\n gap = 4,\n}: PopoverProps): JSX.Element {\n const popoverRef = useRef<HTMLDivElement>(null);\n const triggerRef = useRef<HTMLDivElement>(null);\n const [position, setPosition] = useState<{ top: number; left: number } | null>(null);\n const [triggerWidth, setTriggerWidth] = useState<number | undefined>(undefined);\n\n // Calculate popover position when opened or on scroll/resize\n useEffect(() => {\n if (!isOpen || !triggerRef.current) return;\n\n const updatePosition = () => {\n if (!triggerRef.current || !popoverRef.current) return;\n\n const rect = triggerRef.current.getBoundingClientRect();\n if (fullWidth) setTriggerWidth(rect.width);\n const popoverRect = popoverRef.current.getBoundingClientRect();\n const popoverWidth = popoverRect.width || width || (fullWidth ? rect.width : minWidth);\n const popoverHeight = popoverRect.height || 400;\n \n let top = 0;\n let left = 0;\n\n // Calculate vertical position with boundary detection\n if (placement.startsWith(\"bottom\")) {\n top = rect.bottom + gap;\n // If popover would go below viewport, show above instead\n if (top + popoverHeight > window.innerHeight - 8) {\n top = rect.top - popoverHeight - gap;\n }\n } else {\n top = rect.top - popoverHeight - gap;\n // If popover would go above viewport, show below instead\n if (top < 8) {\n top = rect.bottom + gap;\n }\n }\n\n // Calculate horizontal position with boundary detection\n if (placement.endsWith(\"start\")) {\n left = rect.left;\n // If popover would go off right edge, shift it left\n if (left + popoverWidth > window.innerWidth - 8) {\n left = window.innerWidth - popoverWidth - 8;\n }\n } else {\n left = rect.right - popoverWidth;\n // If popover would go off left edge, shift it right\n if (left < 8) {\n left = 8;\n }\n }\n\n // Final boundary enforcement - ensure popover stays within viewport\n left = Math.max(8, Math.min(left, window.innerWidth - popoverWidth - 8));\n top = Math.max(8, Math.min(top, window.innerHeight - popoverHeight - 8));\n\n setPosition({ top, left });\n };\n\n // Use requestAnimationFrame to ensure popover is rendered before calculating position\n const rafId = requestAnimationFrame(() => {\n updatePosition();\n });\n\n // Update position on scroll and resize\n window.addEventListener(\"scroll\", updatePosition, true);\n window.addEventListener(\"resize\", updatePosition);\n\n return () => {\n cancelAnimationFrame(rafId);\n window.removeEventListener(\"scroll\", updatePosition, true);\n window.removeEventListener(\"resize\", updatePosition);\n };\n }, [isOpen, placement, width, minWidth, fullWidth, gap]);\n\n // Handle click outside to close popover\n useEffect(() => {\n if (!isOpen) return;\n\n const handleClickOutside = (event: MouseEvent) => {\n const target = event.target as HTMLElement;\n \n // Check if click is outside both popover and trigger\n const isOutsidePopover = popoverRef.current && !popoverRef.current.contains(target);\n const isOutsideTrigger = triggerRef.current && !triggerRef.current.contains(target);\n \n if (isOutsidePopover && isOutsideTrigger) {\n // Small delay to ensure button onClick handlers complete first\n requestAnimationFrame(() => {\n onClose();\n });\n }\n };\n\n // Add small delay to avoid immediate close when opening\n const timeoutId = setTimeout(() => {\n // Use capture phase with a delay so button clicks register first\n document.addEventListener(\"click\", handleClickOutside, { capture: false });\n }, 50);\n\n return () => {\n clearTimeout(timeoutId);\n document.removeEventListener(\"click\", handleClickOutside, { capture: false });\n };\n }, [isOpen, onClose]);\n\n // Handle escape key to close popover\n useEffect(() => {\n if (!isOpen) return;\n\n const handleEscape = (event: KeyboardEvent) => {\n if (event.key === \"Escape\") {\n onClose();\n }\n };\n\n document.addEventListener(\"keydown\", handleEscape);\n return () => {\n document.removeEventListener(\"keydown\", handleEscape);\n };\n }, [isOpen, onClose]);\n\n return (\n <div style={{ display: fullWidth ? \"block\" : \"inline-block\" }}>\n <div ref={triggerRef}>{trigger}</div>\n\n {isOpen && (\n <div\n ref={popoverRef}\n style={{\n position: \"fixed\",\n zIndex: 1000,\n background: colors.bgCard,\n border: \"none\",\n boxShadow: `0 0 0 1px ${colors.border}, 0 4px 12px rgba(0, 0, 0, 0.15)`,\n minWidth: fullWidth ? triggerWidth : minWidth,\n overflow: \"hidden\",\n ...(width ? { width } : {}),\n ...(position ? { top: position.top, left: position.left } : { opacity: 0 }),\n }}\n >\n {children}\n </div>\n )}\n </div>\n );\n}\n\nexport interface PopoverHeaderProps {\n children: ReactNode;\n colors: Pick<PopoverColors, \"text\">;\n}\n\n/**\n * Popover header component with padding\n * @param children - Header content\n * @param colors - Theme colors for styling\n */\nexport function PopoverHeader({ children, colors }: PopoverHeaderProps): JSX.Element {\n return (\n <div\n style={{\n fontSize: 14,\n fontWeight: 600,\n padding: \"12px 12px 0 12px\",\n marginBottom: 12,\n color: colors.text,\n }}\n >\n {children}\n </div>\n );\n}\n\n/**\n * Popover section component for scrollable content.\n * No padding so scrollbar hugs the edge.\n * Items inside should have their own padding.\n * @param children - Section content\n */\nexport function PopoverSection({ children }: { children: ReactNode }): JSX.Element {\n return <div>{children}</div>;\n}\n\n/**\n * Popover footer component - no padding so buttons can hug edges\n * @param children - Footer content\n */\nexport function PopoverFooter({ children }: { children: ReactNode }): JSX.Element {\n return <div>{children}</div>;\n}\n","/**\n * @fileoverview Scrollable container component with customizable scrollbar.\n *\n * Provides consistent scrollbar styling across the application with:\n * - Horizontal, vertical, or both scroll directions\n * - Synchronized scrolling support (for linked containers like chart + axis)\n * - Scroll-to-end behavior for showing latest data\n * - Edge extension option for full-bleed layouts\n * - Left-side scrollbar positioning\n * - Sharp-cornered scrollbar injected into <head> for reliable specificity\n *\n * IMPORTANT: Only uses ::-webkit-scrollbar pseudo-elements, NEVER standard\n * scrollbar-width/scrollbar-color. In Chromium 121+, standard properties\n * cause the browser to ignore webkit pseudo-elements entirely, resulting\n * in rounded corners that can't be overridden.\n */\n\nimport { type ReactNode, forwardRef, type CSSProperties, useEffect, useRef, useCallback } from \"react\";\n\ntype ScrollDirection = \"horizontal\" | \"vertical\" | \"both\";\n\n/**\n * Injects scrollbar CSS into <head> once per direction.\n * Exported so non-ScrollContainer elements (e.g. modal bodies)\n * can opt into the same scrollbar styling via className.\n */\nconst injectedDirections = new Set<string>();\n\nexport function injectScrollbarStyles(direction: string): void {\n if (typeof document === \"undefined\") return;\n if (injectedDirections.has(direction)) return;\n injectedDirections.add(direction);\n\n const scrollClass = scrollbarClassName(direction);\n const isHorizontal = direction === \"horizontal\" || direction === \"both\";\n const isVertical = direction === \"vertical\" || direction === \"both\";\n\n const css = `\n .${scrollClass}::-webkit-scrollbar {\n display: block;\n ${isHorizontal ? \"height: 8px;\" : \"\"}\n ${isVertical ? \"width: 8px;\" : \"\"}\n }\n .${scrollClass}::-webkit-scrollbar-track {\n background: rgba(0, 0, 0, 0.1);\n border-radius: 0;\n }\n .${scrollClass}::-webkit-scrollbar-thumb {\n background: rgba(0, 0, 0, 0.2);\n border-radius: 0;\n }\n .${scrollClass}::-webkit-scrollbar-thumb:hover {\n background: rgba(0, 0, 0, 0.4);\n }\n `;\n\n const style = document.createElement(\"style\");\n style.setAttribute(\"data-scroll-container\", direction);\n style.textContent = css;\n document.head.appendChild(style);\n}\n\n/** Returns the CSS class name for a given scroll direction. */\nexport function scrollbarClassName(direction: string): string {\n return `scroll-container-${direction}`;\n}\n\nexport interface ScrollContainerProps {\n children: ReactNode;\n /** Scroll direction (default: \"both\") */\n direction?: ScrollDirection;\n /** Container height */\n height?: number | string;\n /** Maximum container height */\n maxHeight?: number | string;\n /** Container width */\n width?: number | string;\n /** Use negative margin to extend scrollbar to parent edges */\n extendToEdges?: boolean;\n /** Padding value when extendToEdges is true (default: 16) */\n edgePadding?: number;\n /** Additional CSS class name */\n className?: string;\n /** Additional inline styles */\n style?: CSSProperties;\n /** Scroll event handler */\n onScroll?: (e: React.UIEvent<HTMLDivElement>) => void;\n /** Controlled scroll position (0 to 1) for synchronized scrolling */\n scrollPosition?: number;\n /** Callback when scroll position changes (0 to 1) */\n onScrollPositionChange?: (position: number) => void;\n /** Scroll to end on initial mount */\n scrollToEnd?: boolean;\n /** Scrollbar position (default: \"right\") */\n scrollbarPosition?: \"left\" | \"right\";\n}\n\nexport const ScrollContainer = forwardRef<HTMLDivElement, ScrollContainerProps>(\n (\n {\n children,\n direction = \"both\",\n height,\n maxHeight,\n width,\n extendToEdges = false,\n edgePadding = 16,\n className = \"\",\n style = {},\n onScroll,\n scrollPosition,\n onScrollPositionChange,\n scrollToEnd = false,\n scrollbarPosition = \"right\",\n },\n ref\n ) => {\n const internalRef = useRef<HTMLDivElement>(null);\n const scrollRef = (ref as React.RefObject<HTMLDivElement>) || internalRef;\n\n const isUpdatingScroll = useRef(false);\n const hasScrolledToEnd = useRef(false);\n\n const scrollClass = scrollbarClassName(direction);\n const isHorizontal = direction === \"horizontal\" || direction === \"both\";\n const isScrollbarLeft = scrollbarPosition === \"left\";\n\n // Inject scrollbar styles into <head> on first render of each direction\n injectScrollbarStyles(direction);\n\n const handleScroll = useCallback((e: React.UIEvent<HTMLDivElement>) => {\n onScroll?.(e);\n\n if (isUpdatingScroll.current) return;\n\n if (onScrollPositionChange) {\n const target = e.currentTarget;\n if (isHorizontal) {\n const maxScroll = target.scrollWidth - target.clientWidth;\n if (maxScroll > 0) {\n onScrollPositionChange(target.scrollLeft / maxScroll);\n }\n } else {\n const maxScroll = target.scrollHeight - target.clientHeight;\n if (maxScroll > 0) {\n onScrollPositionChange(target.scrollTop / maxScroll);\n }\n }\n }\n }, [isHorizontal, onScroll, onScrollPositionChange]);\n\n useEffect(() => {\n if (scrollPosition === undefined) return;\n const container = scrollRef.current;\n if (!container) return;\n\n if (isHorizontal) {\n const maxScroll = container.scrollWidth - container.clientWidth;\n if (maxScroll > 0) {\n const target = scrollPosition * maxScroll;\n if (Math.abs(container.scrollLeft - target) > 1) {\n isUpdatingScroll.current = true;\n container.scrollLeft = target;\n requestAnimationFrame(() => { isUpdatingScroll.current = false; });\n }\n }\n } else {\n const maxScroll = container.scrollHeight - container.clientHeight;\n if (maxScroll > 0) {\n const target = scrollPosition * maxScroll;\n if (Math.abs(container.scrollTop - target) > 1) {\n isUpdatingScroll.current = true;\n container.scrollTop = target;\n requestAnimationFrame(() => { isUpdatingScroll.current = false; });\n }\n }\n }\n }, [scrollPosition, isHorizontal, scrollRef]);\n\n useEffect(() => {\n if (!scrollToEnd || hasScrolledToEnd.current) return;\n const container = scrollRef.current;\n if (!container) return;\n\n const timeoutId = setTimeout(() => {\n if (isHorizontal) {\n container.scrollLeft = container.scrollWidth;\n } else {\n container.scrollTop = container.scrollHeight;\n }\n hasScrolledToEnd.current = true;\n }, 100);\n\n return () => clearTimeout(timeoutId);\n }, [scrollToEnd, isHorizontal, scrollRef, children]);\n\n const defaultOverflowX: CSSProperties[\"overflowX\"] = isHorizontal ? \"auto\" : \"hidden\";\n const defaultOverflowY: CSSProperties[\"overflowY\"] = direction === \"vertical\" || direction === \"both\" ? \"auto\" : \"hidden\";\n\n const containerStyle: CSSProperties = {\n overflowX: (style?.overflowX ?? defaultOverflowX) as CSSProperties[\"overflowX\"],\n overflowY: (style?.overflowY ?? defaultOverflowY) as CSSProperties[\"overflowY\"],\n ...(height !== undefined ? { height } : {}),\n ...(maxHeight !== undefined ? { maxHeight } : {}),\n ...(width !== undefined ? { width } : {}),\n ...(extendToEdges\n ? { margin: `-${edgePadding}px`, padding: edgePadding }\n : {}),\n ...(isScrollbarLeft ? { direction: \"rtl\" as const } : {}),\n ...style,\n };\n\n return (\n <div\n ref={scrollRef}\n className={`${scrollClass} ${className}`.trim()}\n style={containerStyle}\n onScroll={handleScroll}\n >\n {isScrollbarLeft ? (\n <div style={{ direction: \"ltr\", width: \"100%\", height: \"100%\" }}>\n {children}\n </div>\n ) : (\n children\n )}\n </div>\n );\n }\n);\n\nScrollContainer.displayName = \"ScrollContainer\";\n","/**\n * @fileoverview Single-select dropdown menu built on the Popover primitive.\n *\n * Unified menu component for all select-pattern dropdowns. Supports:\n * - Default bordered trigger or custom trigger via renderTrigger\n * - Per-option disabled state and icons\n * - Consistent sizing: sm (32px) and md (40px) for both triggers and options\n * - Fixed checkmark column (no layout shift on selection)\n * - Keyboard navigation (Arrow keys, Enter, Escape)\n * - ScrollContainer for consistent scrollbar styling\n */\n\nimport { useState, useRef, useCallback, useEffect, type ReactNode, type KeyboardEvent } from \"react\";\nimport { Icon } from \"@iconify/react\";\nimport { Popover, type PopoverColors } from \"./Popover\";\nimport { ScrollContainer } from \"./ScrollContainer\";\n\nexport interface MenuSelectOption<T extends string = string> {\n value: T;\n label: string;\n icon?: ReactNode;\n isDisabled?: boolean;\n}\n\nexport interface MenuSelectColors extends PopoverColors {\n bg: string;\n}\n\n/** Trigger render prop args */\nexport interface MenuSelectTriggerProps {\n /** Currently selected option (undefined if no selection) */\n selected: { value: string; label: string; icon?: ReactNode } | undefined;\n /** Whether the dropdown is open */\n isOpen: boolean;\n /** Whether the control is disabled */\n isDisabled: boolean;\n}\n\n/** Fixed sizing per variant */\nconst SIZES = {\n sm: { triggerHeight: 32, optionHeight: 32, triggerPadding: \"4px 8px\", optionPadding: \"0 12px\", fontSize: 13, chevronSize: 14 },\n md: { triggerHeight: 40, optionHeight: 40, triggerPadding: \"8px 12px\", optionPadding: \"0 12px\", fontSize: 14, chevronSize: 16 },\n} as const;\n\nexport interface MenuSelectProps<T extends string = string> {\n /** Available options */\n options: MenuSelectOption<T>[];\n /** Currently selected value (empty string for no selection) */\n value: T | \"\";\n /** Callback when a new value is selected */\n onChange: (value: T) => void;\n /** Placeholder text when no value is selected */\n placeholder?: string;\n /** Whether the control is disabled */\n isDisabled?: boolean;\n /** Theme colors */\n colors: MenuSelectColors;\n /** Size variant — controls trigger and option heights uniformly */\n size?: \"sm\" | \"md\";\n /** Minimum width in pixels */\n minWidth?: number;\n /** Maximum dropdown height in pixels (default: 240) */\n maxDropdownHeight?: number;\n /** Dropdown placement relative to trigger (default: \"bottom-start\") */\n placement?: \"bottom-start\" | \"bottom-end\" | \"top-start\" | \"top-end\";\n /**\n * Custom trigger render prop. When provided, replaces the default bordered\n * trigger button. The rendered element receives click/keyboard handlers\n * automatically via wrapper — just return the visual element.\n */\n renderTrigger?: (props: MenuSelectTriggerProps) => ReactNode;\n}\n\nexport function MenuSelect<T extends string = string>({\n options,\n value,\n onChange,\n placeholder = \"Select...\",\n isDisabled = false,\n colors,\n size = \"md\",\n minWidth,\n maxDropdownHeight = 240,\n placement = \"bottom-start\",\n renderTrigger,\n}: MenuSelectProps<T>): JSX.Element {\n const [isOpen, setIsOpen] = useState(false);\n const [focusedIndex, setFocusedIndex] = useState(-1);\n const listRef = useRef<HTMLDivElement>(null);\n\n const selectedOption = options.find((o) => o.value === value);\n const s = SIZES[size];\n\n const handleSelect = useCallback(\n (optionValue: T) => {\n onChange(optionValue);\n setIsOpen(false);\n },\n [onChange],\n );\n\n const handleToggle = useCallback(() => {\n if (isDisabled) return;\n setIsOpen((prev) => {\n if (!prev) {\n const idx = options.findIndex((o) => o.value === value && !o.isDisabled);\n setFocusedIndex(idx >= 0 ? idx : options.findIndex((o) => !o.isDisabled));\n }\n return !prev;\n });\n }, [isDisabled, options, value]);\n\n // Skip disabled items during keyboard navigation\n const findNextEnabled = useCallback((from: number, direction: 1 | -1): number => {\n let idx = from + direction;\n while (idx >= 0 && idx < options.length) {\n if (!options[idx]?.isDisabled) return idx;\n idx += direction;\n }\n return from;\n }, [options]);\n\n const handleKeyDown = useCallback(\n (e: KeyboardEvent) => {\n if (!isOpen) {\n if (e.key === \"ArrowDown\" || e.key === \"Enter\" || e.key === \" \") {\n e.preventDefault();\n handleToggle();\n }\n return;\n }\n\n switch (e.key) {\n case \"ArrowDown\":\n e.preventDefault();\n setFocusedIndex((prev) => findNextEnabled(prev, 1));\n break;\n case \"ArrowUp\":\n e.preventDefault();\n setFocusedIndex((prev) => findNextEnabled(prev, -1));\n break;\n case \"Enter\":\n case \" \":\n e.preventDefault();\n if (focusedIndex >= 0 && focusedIndex < options.length && !options[focusedIndex]?.isDisabled) {\n handleSelect(options[focusedIndex]!.value);\n }\n break;\n case \"Escape\":\n e.preventDefault();\n setIsOpen(false);\n break;\n }\n },\n [isOpen, focusedIndex, options, handleSelect, handleToggle, findNextEnabled],\n );\n\n // Scroll focused item into view\n useEffect(() => {\n if (!isOpen || focusedIndex < 0 || !listRef.current) return;\n const listbox = listRef.current.querySelector(\"[role=listbox]\");\n if (!listbox) return;\n const items = listbox.children;\n if (items[focusedIndex]) {\n (items[focusedIndex] as HTMLElement).scrollIntoView({ block: \"nearest\" });\n }\n }, [isOpen, focusedIndex]);\n\n const triggerElement = renderTrigger ? (\n <div\n role=\"button\"\n tabIndex={isDisabled ? -1 : 0}\n onClick={handleToggle}\n onKeyDown={handleKeyDown}\n style={{ cursor: isDisabled ? \"not-allowed\" : \"pointer\" }}\n >\n {renderTrigger({ selected: selectedOption, isOpen, isDisabled })}\n </div>\n ) : (\n <button\n type=\"button\"\n onClick={handleToggle}\n onKeyDown={handleKeyDown}\n disabled={isDisabled}\n style={{\n display: \"flex\",\n alignItems: \"center\",\n justifyContent: \"space-between\",\n gap: 8,\n width: \"100%\",\n minWidth,\n padding: s.triggerPadding,\n fontSize: s.fontSize,\n fontWeight: 400,\n fontFamily: \"inherit\",\n border: \"none\",\n borderRadius: 0,\n boxShadow: `0 0 0 1px ${colors.border}`,\n background: colors.bg,\n color: selectedOption ? colors.text : colors.textMuted,\n cursor: isDisabled ? \"not-allowed\" : \"pointer\",\n opacity: isDisabled ? 0.5 : 1,\n minHeight: s.triggerHeight,\n }}\n >\n <span\n style={{\n display: \"flex\",\n alignItems: \"center\",\n gap: 8,\n overflow: \"hidden\",\n }}\n >\n {selectedOption?.icon}\n <span\n style={{\n overflow: \"hidden\",\n textOverflow: \"ellipsis\",\n whiteSpace: \"nowrap\",\n }}\n >\n {selectedOption?.label ?? placeholder}\n </span>\n </span>\n <Icon\n icon=\"feather:chevron-down\"\n width={s.chevronSize}\n height={s.chevronSize}\n style={{\n flexShrink: 0,\n transition: \"transform 0.2s\",\n transform: isOpen ? \"rotate(180deg)\" : \"rotate(0deg)\",\n }}\n />\n </button>\n );\n\n return (\n <Popover\n isOpen={isOpen}\n onClose={() => setIsOpen(false)}\n trigger={triggerElement}\n colors={colors}\n minWidth={minWidth}\n fullWidth={!renderTrigger}\n gap={0}\n placement={placement}\n >\n <ScrollContainer\n ref={listRef}\n direction=\"vertical\"\n maxHeight={maxDropdownHeight}\n >\n <div role=\"listbox\" onKeyDown={handleKeyDown}>\n {options.map((option, index) => {\n const isSelected = option.value === value;\n const isFocused = index === focusedIndex;\n const optDisabled = option.isDisabled ?? false;\n return (\n <button\n type=\"button\"\n key={option.value}\n role=\"option\"\n aria-selected={isSelected}\n aria-disabled={optDisabled}\n onClick={() => !optDisabled && handleSelect(option.value)}\n onMouseEnter={() => !optDisabled && setFocusedIndex(index)}\n style={{\n display: \"flex\",\n alignItems: \"center\",\n gap: 8,\n width: \"100%\",\n padding: s.optionPadding,\n minHeight: s.optionHeight,\n fontSize: s.fontSize,\n fontFamily: \"inherit\",\n border: \"none\",\n borderRadius: 0,\n background: isFocused && !optDisabled ? `${colors.border}40` : \"transparent\",\n color: optDisabled ? colors.textMuted : colors.text,\n cursor: optDisabled ? \"not-allowed\" : \"pointer\",\n fontWeight: isSelected ? 500 : 400,\n textAlign: \"left\",\n opacity: optDisabled ? 0.5 : 1,\n }}\n >\n {option.icon}\n <span\n style={{\n overflow: \"hidden\",\n textOverflow: \"ellipsis\",\n whiteSpace: \"nowrap\",\n flex: 1,\n }}\n >\n {option.label}\n </span>\n <span style={{ width: 14, flexShrink: 0, display: \"flex\", justifyContent: \"center\" }}>\n {isSelected && (\n <Icon\n icon=\"feather:check\"\n width={14}\n height={14}\n />\n )}\n </span>\n </button>\n );\n })}\n </div>\n </ScrollContainer>\n </Popover>\n );\n}\n","/**\n * @fileoverview Multi-select filter component with icon stack display.\n *\n * A reusable filter pattern for selecting multiple items (currencies, payment methods, etc.)\n * with a compact button showing selected items as an overlapping icon stack, and a\n * popover dropdown for making selections.\n */\n\nimport { useState, ReactNode, useMemo } from \"react\";\nimport { Popover, PopoverHeader, PopoverSection, PopoverFooter, type PopoverColors } from \"./Popover\";\nimport { OverlappingStack } from \"./OverlappingStack\";\n\n/**\n * Colors required by MultiSelectFilter component.\n * Pass these from your app's theme context.\n */\nexport interface MultiSelectFilterColors extends PopoverColors {\n bg: string;\n}\n\n/**\n * Item with usage count for ordering\n */\nexport interface ItemStat<T> {\n item: T;\n count: number;\n}\n\n/**\n * Props for MultiSelectFilter component\n */\nexport interface MultiSelectFilterProps<T extends string> {\n /** All available item IDs */\n allItems: Set<T>;\n /** Currently selected item IDs */\n selectedItems: Set<T>;\n /** Callback when selection changes */\n onSelectionChange: (items: Set<T>) => void;\n /** Item usage stats for ordering (most used first) - used as fallback if getVolumeRank not provided */\n itemStats: ItemStat<T>[];\n /** Render function for item icon in the button's OverlappingStack */\n renderIcon: (item: T) => ReactNode;\n /** Render function for item icon in the dropdown list (can be smaller/different) */\n renderListIcon?: (item: T) => ReactNode;\n /** Get display label for an item */\n getLabel: (item: T) => string;\n /** Title shown in popover header */\n title: string;\n /** Theme colors */\n colors: MultiSelectFilterColors;\n /** Placeholder text when no items available */\n placeholder?: string;\n /** Button min/max width */\n buttonWidth?: number;\n /** Icon size in OverlappingStack */\n iconSize?: number;\n /** Max icons to show in button */\n iconLimit?: number;\n /** Overlap amount for icons */\n iconOverlap?: number;\n /** Whether rightmost icons overlap leftmost */\n reverseZIndex?: boolean;\n /**\n * Optional function to get volume rank for an item (lower = more volume).\n * If provided, items are sorted by volume rank first, then by stats count.\n * This enables sorting by monthly usage data from MonthlyStatsContext.\n */\n getVolumeRank?: (item: T) => number;\n}\n\n/**\n * Reusable multi-select filter component with icon stack button and popover.\n * Used for currencies, payment methods, and similar filter patterns.\n *\n * @param allItems - Set of all available item IDs\n * @param selectedItems - Currently selected item IDs\n * @param onSelectionChange - Callback when selection changes\n * @param itemStats - Item usage stats for ordering\n * @param renderIcon - Render function for item icon in button\n * @param renderListIcon - Render function for item icon in list (defaults to renderIcon)\n * @param getLabel - Get display label for an item\n * @param title - Title shown in popover header\n * @param colors - Theme colors for styling\n * @param placeholder - Placeholder when no items (default: title)\n * @param buttonWidth - Button width (default: 112)\n * @param iconSize - Icon size in stack (default: 24)\n * @param iconLimit - Max icons in button (default: 3)\n * @param iconOverlap - Overlap amount (default: 8)\n * @param reverseZIndex - Rightmost icons overlap leftmost (default: true)\n * @param getVolumeRank - Optional function to get volume rank for sorting by monthly data\n */\nexport function MultiSelectFilter<T extends string>({\n allItems,\n selectedItems,\n onSelectionChange,\n itemStats,\n renderIcon,\n renderListIcon,\n getLabel,\n title,\n colors,\n placeholder: _placeholder,\n buttonWidth = 112,\n iconSize = 24,\n iconLimit = 3,\n iconOverlap = 8,\n reverseZIndex = true,\n getVolumeRank,\n}: MultiSelectFilterProps<T>): JSX.Element {\n const [isOpen, setIsOpen] = useState(false);\n const [localSelection, setLocalSelection] = useState(selectedItems);\n\n // Create a map for quick lookup of stats\n const statsMap = useMemo(\n () => new Map(itemStats.map((stat) => [stat.item, stat.count])),\n [itemStats]\n );\n\n // Sort items by volume rank (if provided), then by stats count, then alphabetically\n const sortedItems = useMemo(() => {\n return Array.from(allItems).sort((a, b) => {\n // Primary sort: volume rank (if available)\n if (getVolumeRank) {\n const rankA = getVolumeRank(a);\n const rankB = getVolumeRank(b);\n if (rankA !== rankB) {\n return rankA - rankB; // Lower rank = higher volume = first\n }\n }\n // Secondary sort: stats count\n const countA = statsMap.get(a) ?? 0;\n const countB = statsMap.get(b) ?? 0;\n if (countA !== countB) {\n return countB - countA;\n }\n // Tertiary sort: alphabetical\n return getLabel(a).localeCompare(getLabel(b));\n });\n }, [allItems, getVolumeRank, statsMap, getLabel]);\n\n const handleToggle = (item: T) => {\n const newSelection = new Set(localSelection);\n if (newSelection.has(item)) {\n newSelection.delete(item);\n } else {\n newSelection.add(item);\n }\n setLocalSelection(newSelection);\n };\n\n const handleSelectAll = () => {\n setLocalSelection(new Set());\n };\n\n const handleSelectNone = () => {\n setLocalSelection(new Set());\n };\n\n const handleApply = () => {\n onSelectionChange(localSelection);\n setIsOpen(false);\n };\n\n const handleToggleOpen = () => {\n if (isOpen) {\n setIsOpen(false);\n } else {\n setLocalSelection(selectedItems);\n setIsOpen(true);\n }\n };\n\n const selectedCount = selectedItems.size;\n const totalCount = allItems.size;\n const isShowingAll = selectedCount === 0 || selectedCount === totalCount;\n const hasFilter = selectedCount > 0 && selectedCount < totalCount;\n\n // Items to display in button (all when showing all, selected when filtered)\n // Use same sorting logic for consistency\n const itemsToDisplay = useMemo(() => {\n if (isShowingAll) {\n return sortedItems;\n }\n return Array.from(selectedItems).sort((a, b) => {\n // Primary sort: volume rank (if available)\n if (getVolumeRank) {\n const rankA = getVolumeRank(a);\n const rankB = getVolumeRank(b);\n if (rankA !== rankB) {\n return rankA - rankB;\n }\n }\n // Secondary sort: stats count\n const countA = statsMap.get(a) ?? 0;\n const countB = statsMap.get(b) ?? 0;\n if (countA !== countB) {\n return countB - countA;\n }\n // Tertiary sort: alphabetical\n return getLabel(a).localeCompare(getLabel(b));\n });\n }, [isShowingAll, sortedItems, selectedItems, getVolumeRank, statsMap, getLabel]);\n\n // Create overlapping stack of icons\n const iconItems = itemsToDisplay.map((item) => (\n <div\n key={item}\n style={{\n width: iconSize,\n height: iconSize,\n borderRadius: \"50%\",\n boxShadow: `0 0 0 1px ${colors.border}`,\n overflow: \"hidden\",\n background: colors.bgCard,\n display: \"flex\",\n alignItems: \"center\",\n justifyContent: \"center\",\n }}\n >\n {renderIcon(item)}\n </div>\n ));\n\n const triggerButton = (\n <button\n onClick={handleToggleOpen}\n style={{\n padding: \"8px 12px\",\n fontSize: 13,\n fontWeight: 500,\n border: `1px solid ${hasFilter ? \"#3182ce\" : colors.border}`,\n background: hasFilter ? \"#3182ce\" : colors.bgCard,\n color: hasFilter ? \"#fff\" : colors.text,\n cursor: \"pointer\",\n display: \"flex\",\n alignItems: \"center\",\n gap: 6,\n minWidth: buttonWidth,\n maxWidth: buttonWidth,\n minHeight: 38,\n maxHeight: 38,\n justifyContent: \"center\",\n }}\n >\n <OverlappingStack\n items={iconItems}\n limit={iconLimit}\n overlap={iconOverlap}\n itemSize={iconSize}\n reverseZIndex={reverseZIndex}\n />\n </button>\n );\n\n // Use renderListIcon if provided, otherwise fall back to renderIcon\n const listIconRenderer = renderListIcon ?? renderIcon;\n\n return (\n <Popover isOpen={isOpen} onClose={() => setIsOpen(false)} trigger={triggerButton} colors={colors}>\n <PopoverHeader colors={colors}>\n <div style={{ display: \"flex\", justifyContent: \"space-between\", alignItems: \"center\" }}>\n <span>{title}</span>\n <div style={{ display: \"flex\", gap: 4 }}>\n <button\n onClick={handleSelectAll}\n style={{\n padding: \"2px 8px\",\n fontSize: 11,\n border: \"none\",\n background: \"transparent\",\n color: colors.textMuted,\n cursor: \"pointer\",\n }}\n >\n All\n </button>\n <button\n onClick={handleSelectNone}\n style={{\n padding: \"2px 8px\",\n fontSize: 11,\n border: \"none\",\n background: \"transparent\",\n color: colors.textMuted,\n cursor: \"pointer\",\n }}\n >\n None\n </button>\n </div>\n </div>\n </PopoverHeader>\n\n <PopoverSection>\n <div style={{ position: \"relative\" }}>\n <div style={{ maxHeight: 300, overflowY: \"auto\", paddingBottom: 12 }}>\n {sortedItems.map((item) => (\n <label\n key={item}\n style={{\n display: \"flex\",\n alignItems: \"center\",\n justifyContent: \"space-between\",\n padding: \"4px 12px\",\n cursor: \"pointer\",\n fontSize: 13,\n }}\n >\n <div style={{ display: \"flex\", alignItems: \"center\", gap: 8 }}>\n <input\n type=\"checkbox\"\n checked={localSelection.has(item)}\n onChange={() => handleToggle(item)}\n style={{ cursor: \"pointer\" }}\n />\n <div\n style={{\n width: iconSize,\n height: iconSize,\n borderRadius: \"50%\",\n boxShadow: `0 0 0 1px ${colors.border}`,\n overflow: \"hidden\",\n background: colors.bgCard,\n display: \"flex\",\n alignItems: \"center\",\n justifyContent: \"center\",\n flexShrink: 0,\n }}\n >\n {listIconRenderer(item)}\n </div>\n <span>{getLabel(item)}</span>\n </div>\n {statsMap.size > 0 && (\n <span\n style={{\n fontSize: 11,\n color: colors.textMuted,\n background: colors.bg,\n padding: \"2px 6px\",\n }}\n >\n {statsMap.get(item) ?? 0}\n </span>\n )}\n </label>\n ))}\n </div>\n {/* Gradient overlay to indicate more content */}\n <div\n style={{\n position: \"absolute\",\n bottom: 0,\n left: 0,\n right: 0,\n height: 12,\n background: `linear-gradient(to bottom, transparent, ${colors.bgCard})`,\n pointerEvents: \"none\",\n }}\n />\n </div>\n </PopoverSection>\n\n <PopoverFooter>\n <button\n onClick={handleApply}\n style={{\n width: \"100%\",\n padding: \"8px 12px\",\n fontSize: 13,\n fontWeight: 500,\n border: \"none\",\n background: \"#3182ce\",\n color: \"#fff\",\n cursor: \"pointer\",\n minHeight: 38,\n }}\n >\n Apply\n </button>\n </PopoverFooter>\n </Popover>\n );\n}\n","/**\n * @fileoverview Combined payment method and currency icon component.\n *\n * Displays a composite icon with the currency flag as background and\n * the payment method icon as a small badge overlay. Used in tables\n * and lists to show both the payment method and currency in a single\n * compact visual element.\n */\n\nimport React from \"react\";\nimport { CurrencyIcon } from \"./CurrencyIcon\";\nimport type { Hex } from \"viem\";\n\n/**\n * Colors required by PaymentCurrencyCombo component.\n * Pass these from your app's theme context.\n */\nexport interface PaymentCurrencyComboColors {\n bg: string;\n}\n\n/**\n * Display a combined payment method and currency icon\n * Shows currency flag as background with payment provider badge overlay\n * @param paymentMethodIcon - React node for the payment method icon\n * @param currencyId - The currency contract ID (keccak256 hash of ticker)\n * @param size - The height of the container in pixels (default: 20)\n * @param colors - Theme colors\n */\nexport const PaymentCurrencyCombo = ({\n paymentMethodIcon,\n currencyId,\n size = 20,\n colors,\n}: {\n paymentMethodIcon: React.ReactNode;\n currencyId: Hex;\n size?: number;\n colors: PaymentCurrencyComboColors;\n}): JSX.Element => {\n const badgeSize = size * 0.60;\n\n return (\n <div\n style={{\n display: 'flex',\n alignItems: 'center',\n justifyContent: 'center',\n boxSizing: 'border-box',\n borderRadius: '100%',\n height: size,\n width: size,\n position: 'relative',\n overflow: 'hidden',\n }}\n >\n {/* Background - Currency flag (zoomed to fill square) */}\n <div\n style={{\n position: 'absolute',\n top: 0,\n left: 0,\n width: '100%',\n height: '100%',\n display: 'flex',\n alignItems: 'center',\n justifyContent: 'center',\n overflow: 'hidden',\n }}\n >\n <CurrencyIcon currencyId={currencyId} size={size} />\n </div>\n\n {/* Foreground - Payment method badge (bottom right) */}\n <div\n style={{\n position: 'absolute',\n bottom: 0,\n right: 0,\n width: badgeSize,\n height: badgeSize,\n display: 'flex',\n alignItems: 'center',\n justifyContent: 'center',\n background: colors.bg,\n borderRadius: 0,\n }}\n >\n {paymentMethodIcon}\n </div>\n </div>\n );\n};\n","/**\n * @fileoverview Payment method icon component.\n *\n * Displays payment provider icons (Venmo, Zelle, etc.) using Iconify.\n * This is a pure rendering component - the host app determines which\n * icon, color, and properties to display.\n */\n\nimport { Icon } from \"@iconify/react\";\n\n/**\n * Props for PaymentMethodIcon component.\n */\nexport interface PaymentMethodIconProps {\n /** Iconify icon identifier (e.g., \"simple-icons:zelle\") */\n icon: string;\n /** Icon color */\n color?: string;\n /** Background color for icons that need contrast */\n backgroundColor?: string;\n /** Size of the icon in pixels */\n size?: number;\n /** Whether this is an unknown/unrecognized payment method */\n isUnknown?: boolean;\n /** Tooltip text */\n tooltip?: string;\n}\n\n/**\n * Display a payment method icon using Iconify.\n * This is a pure rendering component - use your app's payment method\n * resolution logic to determine the icon, color, and other properties.\n *\n * @param icon - Iconify icon identifier (e.g., \"simple-icons:zelle\", \"mdi:credit-card\")\n * @param color - Icon color (default: \"#6b7280\" for gray)\n * @param backgroundColor - Optional background color for icons that need contrast (e.g., Revolut white on blue)\n * @param size - Size of the icon in pixels (default: 16)\n * @param isUnknown - Whether this is an unknown payment method (shows warning indicator)\n * @param tooltip - Tooltip text on hover\n */\nexport function PaymentMethodIcon({\n icon,\n color = \"#6b7280\",\n backgroundColor,\n size = 16,\n isUnknown = false,\n tooltip,\n}: PaymentMethodIconProps): JSX.Element {\n const effectiveColor = isUnknown ? \"#ef4444\" : color;\n\n return (\n <span\n style={{\n display: \"flex\",\n alignItems: \"center\",\n justifyContent: \"center\",\n width: size,\n height: size,\n opacity: isUnknown ? 0.6 : 1,\n position: \"relative\",\n backgroundColor,\n borderRadius: backgroundColor ? \"4px\" : undefined,\n padding: backgroundColor ? \"2px\" : undefined,\n boxSizing: \"border-box\",\n }}\n title={tooltip}\n >\n <Icon\n icon={icon}\n width={backgroundColor ? size - 4 : size}\n height={backgroundColor ? size - 4 : size}\n style={{ color: effectiveColor }}\n />\n {isUnknown && (\n <span\n style={{\n position: \"absolute\",\n bottom: -2,\n right: -2,\n width: size * 0.35,\n height: size * 0.35,\n borderRadius: \"50%\",\n background: \"#ef4444\",\n border: \"1px solid white\",\n }}\n title=\"Unknown payment method\"\n />\n )}\n </span>\n );\n}\n\n/**\n * Default icon for unknown payment methods\n */\nexport const DEFAULT_PAYMENT_ICON = \"mdi:credit-card\";\n\n/**\n * Default color for unknown payment methods\n */\nexport const DEFAULT_PAYMENT_COLOR = \"#6b7280\";\n","/**\n * @fileoverview Tooltip component for hover hints.\n *\n * Simple hover tooltip with automatic top/bottom placement.\n * Uses inline positioning — no portal or z-index layering required.\n */\n\nimport { useState, useRef, useEffect, type ReactNode, type CSSProperties } from \"react\";\n\nexport interface TooltipProps {\n /** Text shown in the tooltip */\n label: string;\n children: ReactNode;\n /** Suppress the tooltip entirely */\n isDisabled?: boolean;\n /** Preferred placement relative to the trigger (default: \"top\") */\n placement?: \"top\" | \"bottom\";\n /**\n * CSS display mode for the wrapper span.\n * - \"inline-flex\" (default): wraps tightly around inline children\n * - \"flex\" or \"block\": takes full width — use for block-level children\n * - \"contents\": wrapper is invisible to layout — children render as if unwrapped\n */\n display?: CSSProperties[\"display\"];\n}\n\n/**\n * Wraps any element and shows a tooltip on hover.\n *\n * @example\n * ```tsx\n * <Tooltip label=\"Loaded from: https://rpc.pulsechain.com\">\n * <Badge>RPC</Badge>\n * </Tooltip>\n * ```\n */\nexport function Tooltip({ label, children, isDisabled, placement = \"top\", display = \"inline-flex\" }: TooltipProps): JSX.Element {\n const [visible, setVisible] = useState(false);\n const ref = useRef<HTMLSpanElement>(null);\n\n useEffect(() => {\n if (isDisabled) setVisible(false);\n }, [isDisabled]);\n\n if (isDisabled) return <>{children}</>;\n\n const tipStyle: CSSProperties = {\n position: \"absolute\",\n left: 0,\n width: \"max-content\",\n maxWidth: 280,\n background: \"rgba(0,0,0,0.82)\",\n color: \"#fff\",\n fontSize: 11,\n lineHeight: 1.4,\n padding: \"4px 8px\",\n whiteSpace: \"normal\",\n zIndex: 9999,\n pointerEvents: \"none\",\n borderRadius: 2,\n ...(placement === \"top\"\n ? { bottom: \"calc(100% + 5px)\" }\n : { top: \"calc(100% + 5px)\" }),\n };\n\n return (\n <span\n ref={ref}\n style={{ position: \"relative\", display, alignItems: display === \"inline-flex\" ? \"center\" : undefined }}\n onMouseEnter={() => setVisible(true)}\n onMouseLeave={() => setVisible(false)}\n >\n {children}\n {visible && <span style={tipStyle}>{label}</span>}\n </span>\n );\n}\n","/**\n * @fileoverview Version badge component.\n *\n * Displays a small badge indicating the protocol version (v2 or v3).\n * Used to visually distinguish deposits and transactions from different\n * protocol versions.\n */\n\nimport React from \"react\";\n\n/**\n * Color props for VersionBadge component.\n * Pass these from your app's theme context.\n */\nexport interface VersionBadgeColors {\n /** Background color for v2 version */\n bgV2: string;\n /** Background color for v3 version */\n bgV3: string;\n /** Text color */\n text: string;\n}\n\nexport type Version = \"v2\" | \"v3\";\n\n/**\n * VersionBadge displays the protocol version (v2 or v3) as a small badge.\n * Use this to indicate which version of the zkp2p protocol a deposit or\n * transaction belongs to.\n *\n * @example\n * ```tsx\n * <VersionBadge version=\"v3\" colors={themeColors} />\n * ```\n */\nexport function VersionBadge(props: {\n /** The protocol version to display */\n version: Version;\n /** Color configuration for the badge */\n colors: VersionBadgeColors;\n /** Optional additional styles */\n style?: React.CSSProperties;\n}): JSX.Element {\n const { version, colors, style } = props;\n\n const bgColor = version === \"v3\" ? colors.bgV3 : colors.bgV2;\n\n return (\n <span\n style={{\n display: \"inline-flex\",\n alignItems: \"center\",\n justifyContent: \"center\",\n padding: \"2px 4px\",\n fontSize: \"10px\",\n fontWeight: 600,\n textTransform: \"uppercase\",\n letterSpacing: \"0.25px\",\n borderRadius: \"4px\",\n backgroundColor: bgColor,\n color: colors.text,\n ...style,\n }}\n >\n {version}\n </span>\n );\n}\n"]}
1
+ {"version":3,"sources":["../src/Card.tsx","../src/CurrencyIcon.tsx","../src/OverlappingStack.tsx","../src/DepositIdentifier.tsx","../src/FlagIcon.tsx","../src/Popover.tsx","../src/ScrollContainer.tsx","../src/MenuSelect.tsx","../src/MultiSelectFilter.tsx","../src/PaymentCurrencyCombo.tsx","../src/PaymentMethodIcon.tsx","../src/Tooltip.tsx","../src/VersionBadge.tsx"],"names":["jsx","Box","getCurrencyByContractId","jsxs","React","useRef","useState","useEffect","forwardRef","useCallback","Icon","useMemo","Fragment"],"mappings":"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","file":"index.cjs","sourcesContent":["/**\n * @fileoverview Card container components.\n *\n * Provides styled card containers for content sections with:\n * - Semantic token support for automatic light/dark mode\n * - Optional horizontal-rule variant for edge-aligned content\n * - No border radius for efficient horizontal space usage\n */\n\nimport \"react\";\nimport { Box, type BoxProps } from \"@chakra-ui/react\";\n\n/**\n * Card component for wrapping content sections.\n * Features:\n * - No border radius for better horizontal space usage\n * - Box shadow instead of border to avoid affecting scrolling behavior\n * - Configurable padding and background\n * - Uses Chakra semantic tokens for automatic theming\n */\nexport function Card(props: BoxProps): JSX.Element {\n const { children, bg, ...rest } = props;\n\n return (\n <Box\n bg={bg ?? \"surface.card\"}\n color=\"text.primary\"\n boxShadow=\"0 0 0 1px var(--chakra-colors-border-default)\"\n minW={0}\n mb=\"1px\"\n {...rest}\n >\n {children}\n </Box>\n );\n}\n\n/**\n * Card variant with only top and bottom borders.\n * Useful for content that should align with full-width elements\n * without side padding or margins.\n *\n * Features:\n * - Only top and bottom borders (no side borders)\n * - No side margin to align with container edges\n * - Configurable padding and background\n * - Uses Chakra semantic tokens for automatic theming\n *\n * @example\n * ```tsx\n * <CardHorizontalRule>\n * <CurrencyList currencies={currencies} />\n * </CardHorizontalRule>\n * ```\n */\nexport function CardHorizontalRule(props: BoxProps): JSX.Element {\n const { children, bg, ...rest } = props;\n\n return (\n <Box\n bg={bg ?? \"surface.card\"}\n color=\"text.primary\"\n borderTop=\"1px solid\"\n borderBottom=\"1px solid\"\n borderColor=\"border.default\"\n minW={0}\n {...rest}\n >\n {children}\n </Box>\n );\n}\n","/**\n * @fileoverview Currency flag icon component.\n *\n * Displays a country/region flag representing a fiat currency.\n * Uses the currency's contractId (keccak256 hash) to look up flag data.\n */\n\nimport { getCurrencyByContractId } from \"@provex/utils/currencies\";\nimport type { Hex } from \"viem\";\n\n/**\n * Display a fiat currency's flag icon in a circular frame.\n *\n * Looks up the currency by its contract ID (keccak256 hash of the ticker)\n * and displays the associated country flag. Falls back to a \"?\" indicator\n * for unknown currencies.\n *\n * @param currencyId - The currency contract ID (keccak256 hash of ticker like \"USD\")\n * @param size - The size of the icon in pixels (default: 16)\n * @param useZoom - Whether to apply the currency's zoom level for better framing (default: true)\n *\n * @example\n * ```tsx\n * // Display USD flag\n * <CurrencyIcon currencyId=\"0x...\" size={24} />\n * ```\n */\nexport const CurrencyIcon = ({\n currencyId,\n size = 16,\n useZoom = true\n}: {\n currencyId: Hex;\n size?: number;\n useZoom?: boolean;\n}): JSX.Element => {\n let currency = null;\n\n try {\n currency = getCurrencyByContractId(currencyId);\n } catch (err) {\n console.warn('Invalid currency ID:', currencyId, err);\n }\n\n if (!currency) {\n return (\n <span\n style={{\n fontSize: size * 0.75,\n fontWeight: 600,\n color: '#888',\n fontFamily: 'monospace',\n }}\n title={`Unknown currency: ${currencyId}`}\n >\n ?\n </span>\n );\n }\n\n const zoom = useZoom ? (currency.zoom ?? 1.5) : 1;\n const objectFit = 'cover' as const;\n\n return (\n <span\n style={{\n display: 'inline-block',\n width: size,\n height: size,\n overflow: 'hidden',\n borderRadius: '100%',\n }}\n >\n <img\n src={currency.flag}\n alt={currency.ticker}\n title={`${currency.name} (${currency.ticker})`}\n style={{\n width: size,\n height: size,\n objectFit,\n transform: `scale(${zoom})`,\n transformOrigin: 'center center',\n }}\n />\n </span>\n );\n};\n","/**\n * @fileoverview Overlapping stack layout component.\n *\n * Displays items in a horizontal row with configurable overlap/spacing.\n * Commonly used for showing multiple icons (currencies, chains) in a compact space.\n */\n\nimport { ReactNode } from \"react\";\n\n/**\n * Props for OverlappingStack component.\n */\nexport interface OverlappingStackProps {\n /** Array of items to display */\n items: ReactNode[];\n /** Maximum items to show before \"+X\" */\n limit?: number;\n /**\n * Overlap/spacing distance in pixels (default: 8)\n * - Positive values create overlap (e.g., 8 = items overlap by 8px)\n * - Zero creates no spacing (items are side-by-side)\n * - Negative values create spacing (e.g., -2 = 2px gap between items)\n */\n overlap?: number;\n /** Size of each item (for consistent sizing) */\n itemSize?: number;\n /**\n * If true, rightmost items will overlap leftmost items (default: false)\n * By default, leftmost items overlap rightmost items\n */\n reverseZIndex?: boolean;\n}\n\n/**\n * Component to display items in an overlapping stack with overflow count.\n * Useful for showing chain icons, version badges, and IDs in a compact space.\n *\n * @param items - Array of ReactNode items to display\n * @param limit - Maximum items to show (default: 3)\n * @param overlap - Overlap/spacing distance in pixels (default: 8). Use negative values for spacing.\n * @param itemSize - Size of each item in pixels (default: 24)\n * @param reverseZIndex - If true, rightmost items overlap leftmost (default: false)\n */\nexport function OverlappingStack({\n items,\n limit = 3,\n overlap = 8,\n itemSize = 24,\n reverseZIndex = false,\n}: OverlappingStackProps) {\n const visibleItems = items.slice(0, limit);\n const remainingCount = items.length - limit;\n\n return (\n <div\n style={{\n display: \"flex\",\n alignItems: \"center\",\n }}\n >\n {visibleItems.map((item, index) => (\n <div\n key={index}\n style={{\n marginLeft: index > 0 ? -overlap : 0,\n // Only apply z-index when there's actual overlap (positive overlap value)\n ...(overlap > 0 ? { position: \"relative\" as const, zIndex: reverseZIndex ? index + 1 : limit - index } : {}),\n display: \"flex\",\n alignItems: \"center\",\n justifyContent: \"center\",\n minWidth: itemSize,\n minHeight: itemSize,\n }}\n >\n {item}\n </div>\n ))}\n {remainingCount > 0 && (\n <div\n style={{\n fontSize: 11,\n marginLeft: 4,\n fontWeight: 600,\n opacity: 0.7,\n }}\n >\n +{remainingCount}\n </div>\n )}\n </div>\n );\n}\n","/**\n * @fileoverview Deposit identifier display component.\n *\n * Displays a compact deposit identifier showing [chain icon][#id].\n * Used throughout the UI to identify deposits uniquely across chains.\n */\n\nimport React, { ReactNode } from \"react\";\nimport { OverlappingStack } from \"./OverlappingStack\";\n\n/**\n * Props for DepositIdentifier component.\n */\nexport interface DepositIdentifierProps {\n /** Chain icon element to display */\n chainIcon: ReactNode;\n /** @deprecated Version badge has been removed - this prop is ignored */\n version?: \"v2\" | \"v3\";\n /** The local deposit ID */\n localId: bigint | number | string;\n /** @deprecated Version badge has been removed - this prop is ignored */\n versionBadgeColors?: { bgV2: string; bgV3: string; text: string };\n /** Size for each item in the stack (default: 20) */\n itemSize?: number;\n /** Gap between items in pixels (default: 2) */\n gap?: number;\n /** Text color for the ID (default: inherit) */\n textColor?: string;\n}\n\n/**\n * A compound identifier component that displays [chain][localId] in a compact stack.\n * Used to uniquely identify deposits across chains.\n *\n * @example\n * ```tsx\n * <DepositIdentifier\n * chainIcon={<ChainIcon chainId={1} size={20} />}\n * localId={42}\n * />\n * ```\n */\nexport function DepositIdentifier({\n chainIcon,\n localId,\n itemSize = 20,\n gap = 2,\n textColor,\n}: DepositIdentifierProps): JSX.Element {\n const idString = typeof localId === \"bigint\" ? localId.toString() : String(localId);\n\n return (\n <OverlappingStack\n items={[\n <React.Fragment key=\"chain\">{chainIcon}</React.Fragment>,\n <span\n key=\"id\"\n style={{\n fontSize: \"14px\",\n fontWeight: 500,\n color: textColor,\n }}\n >\n #{idString}\n </span>,\n ]}\n overlap={-gap}\n itemSize={itemSize}\n limit={2}\n />\n );\n}\n","/**\n * @fileoverview Flag icon component with error handling.\n *\n * Displays a flag image in a circular frame with graceful fallback\n * when the image fails to load. Creates a canvas-based placeholder\n * showing the first 3 characters of the alt text.\n */\n\nimport React from 'react';\n\n/**\n * Props for FlagIcon component.\n */\ninterface FlagIconProps {\n flag: string;\n alt?: string;\n size?: number;\n className?: string;\n borderColor?: string;\n}\n\n/**\n * Display a flag icon with error handling fallback\n * @param flag - URL to the flag image\n * @param alt - Alt text for the image\n * @param size - Size of the icon in pixels (default: 32)\n * @param className - Additional CSS class names\n * @param borderColor - Border color (default: #e5e7eb)\n */\nexport const FlagIcon: React.FC<FlagIconProps> = ({\n flag,\n alt = 'Flag',\n size = 32,\n className = '',\n borderColor = '#e5e7eb',\n}) => {\n const handleError = (e: React.SyntheticEvent<HTMLImageElement, Event>) => {\n const target = e.target as HTMLImageElement;\n // Create a simple placeholder with the currency code\n const canvas = document.createElement('canvas');\n const ctx = canvas.getContext('2d');\n if (ctx) {\n canvas.width = size;\n canvas.height = size;\n ctx.fillStyle = '#e0e0e0';\n ctx.fillRect(0, 0, size, size);\n ctx.fillStyle = '#666';\n ctx.font = `${Math.floor(size * 0.3)}px Arial`;\n ctx.textAlign = 'center';\n ctx.textBaseline = 'middle';\n ctx.fillText(alt.slice(0, 3), size / 2, size / 2);\n target.src = canvas.toDataURL();\n }\n };\n\n return (\n <img\n src={flag}\n alt={alt}\n className={`inline-block rounded-full ${className}`}\n onError={handleError}\n style={{\n width: `${size}px`,\n height: `${size}px`,\n borderWidth: '1px',\n borderStyle: 'solid',\n borderColor,\n minWidth: `${size}px`,\n minHeight: `${size}px`,\n maxWidth: `${size}px`,\n maxHeight: `${size}px`,\n borderRadius: '50%',\n objectFit: 'cover',\n objectPosition: 'center',\n flexShrink: 0,\n display: 'block'\n }}\n />\n );\n};\n","/**\n * @fileoverview Popover component for dropdown menus and tooltips.\n *\n * Provides a reusable popover with:\n * - Automatic positioning to stay within viewport\n * - Click-outside and Escape key handling\n * - Header, section, and footer sub-components\n * - Theme color customization\n */\n\nimport { useEffect, useRef, ReactNode, useState } from \"react\";\n\n/**\n * Colors required by Popover components.\n * Pass these from your app's theme context.\n */\nexport interface PopoverColors {\n bgCard: string;\n border: string;\n text: string;\n textMuted: string;\n}\n\nexport interface PopoverProps {\n /** Whether the popover is open */\n isOpen: boolean;\n /** Callback when popover should close */\n onClose: () => void;\n /** The trigger button */\n trigger: ReactNode;\n /** The popover content */\n children: ReactNode;\n /** Theme colors */\n colors: PopoverColors;\n /** Placement of popover relative to trigger */\n placement?: \"bottom-start\" | \"bottom-end\" | \"top-start\" | \"top-end\";\n /** Width of popover */\n width?: number;\n /** Min width of popover */\n minWidth?: number;\n /** When true, wrapper uses display:block and dropdown matches trigger width */\n fullWidth?: boolean;\n /** Gap in pixels between trigger and dropdown (default: 4) */\n gap?: number;\n}\n\n/**\n * Reusable popover component with positioning and click-outside handling.\n * Uses fixed positioning to avoid clipping by overflow containers.\n * @param isOpen - Whether the popover is open\n * @param onClose - Callback when popover should close\n * @param trigger - The trigger button element\n * @param children - The popover content\n * @param colors - Theme colors for styling\n * @param placement - Placement relative to trigger (default: \"bottom-start\")\n * @param width - Width of popover in pixels\n * @param minWidth - Min width of popover in pixels (default: 200)\n */\nexport function Popover({\n isOpen,\n onClose,\n trigger,\n children,\n colors,\n placement = \"bottom-start\",\n width,\n minWidth = 200,\n fullWidth = false,\n gap = 4,\n}: PopoverProps): JSX.Element {\n const popoverRef = useRef<HTMLDivElement>(null);\n const triggerRef = useRef<HTMLDivElement>(null);\n const [position, setPosition] = useState<{ top: number; left: number } | null>(null);\n const [triggerWidth, setTriggerWidth] = useState<number | undefined>(undefined);\n\n // Calculate popover position when opened or on scroll/resize\n useEffect(() => {\n if (!isOpen || !triggerRef.current) return;\n\n const updatePosition = () => {\n if (!triggerRef.current || !popoverRef.current) return;\n\n const rect = triggerRef.current.getBoundingClientRect();\n if (fullWidth) setTriggerWidth(rect.width);\n const popoverRect = popoverRef.current.getBoundingClientRect();\n const popoverWidth = popoverRect.width || width || (fullWidth ? rect.width : minWidth);\n const popoverHeight = popoverRect.height || 400;\n \n let top = 0;\n let left = 0;\n\n // Calculate vertical position with boundary detection\n if (placement.startsWith(\"bottom\")) {\n top = rect.bottom + gap;\n // If popover would go below viewport, show above instead\n if (top + popoverHeight > window.innerHeight - 8) {\n top = rect.top - popoverHeight - gap;\n }\n } else {\n top = rect.top - popoverHeight - gap;\n // If popover would go above viewport, show below instead\n if (top < 8) {\n top = rect.bottom + gap;\n }\n }\n\n // Calculate horizontal position with boundary detection\n if (placement.endsWith(\"start\")) {\n left = rect.left;\n // If popover would go off right edge, shift it left\n if (left + popoverWidth > window.innerWidth - 8) {\n left = window.innerWidth - popoverWidth - 8;\n }\n } else {\n left = rect.right - popoverWidth;\n // If popover would go off left edge, shift it right\n if (left < 8) {\n left = 8;\n }\n }\n\n // Final boundary enforcement - ensure popover stays within viewport\n left = Math.max(8, Math.min(left, window.innerWidth - popoverWidth - 8));\n top = Math.max(8, Math.min(top, window.innerHeight - popoverHeight - 8));\n\n setPosition({ top, left });\n };\n\n // Use requestAnimationFrame to ensure popover is rendered before calculating position\n const rafId = requestAnimationFrame(() => {\n updatePosition();\n });\n\n // Update position on scroll and resize\n window.addEventListener(\"scroll\", updatePosition, true);\n window.addEventListener(\"resize\", updatePosition);\n\n return () => {\n cancelAnimationFrame(rafId);\n window.removeEventListener(\"scroll\", updatePosition, true);\n window.removeEventListener(\"resize\", updatePosition);\n };\n }, [isOpen, placement, width, minWidth, fullWidth, gap]);\n\n // Handle click outside to close popover\n useEffect(() => {\n if (!isOpen) return;\n\n const handleClickOutside = (event: MouseEvent) => {\n const target = event.target as HTMLElement;\n \n // Check if click is outside both popover and trigger\n const isOutsidePopover = popoverRef.current && !popoverRef.current.contains(target);\n const isOutsideTrigger = triggerRef.current && !triggerRef.current.contains(target);\n \n if (isOutsidePopover && isOutsideTrigger) {\n // Small delay to ensure button onClick handlers complete first\n requestAnimationFrame(() => {\n onClose();\n });\n }\n };\n\n // Add small delay to avoid immediate close when opening\n const timeoutId = setTimeout(() => {\n // Use capture phase with a delay so button clicks register first\n document.addEventListener(\"click\", handleClickOutside, { capture: false });\n }, 50);\n\n return () => {\n clearTimeout(timeoutId);\n document.removeEventListener(\"click\", handleClickOutside, { capture: false });\n };\n }, [isOpen, onClose]);\n\n // Handle escape key to close popover\n useEffect(() => {\n if (!isOpen) return;\n\n const handleEscape = (event: KeyboardEvent) => {\n if (event.key === \"Escape\") {\n onClose();\n }\n };\n\n document.addEventListener(\"keydown\", handleEscape);\n return () => {\n document.removeEventListener(\"keydown\", handleEscape);\n };\n }, [isOpen, onClose]);\n\n return (\n <div style={{ display: fullWidth ? \"block\" : \"inline-block\" }}>\n <div ref={triggerRef}>{trigger}</div>\n\n {isOpen && (\n <div\n ref={popoverRef}\n style={{\n position: \"fixed\",\n zIndex: 1000,\n background: colors.bgCard,\n border: \"none\",\n boxShadow: `0 0 0 1px ${colors.border}, 0 4px 12px rgba(0, 0, 0, 0.15)`,\n minWidth: fullWidth ? triggerWidth : minWidth,\n overflow: \"hidden\",\n ...(width ? { width } : {}),\n ...(position ? { top: position.top, left: position.left } : { opacity: 0 }),\n }}\n >\n {children}\n </div>\n )}\n </div>\n );\n}\n\nexport interface PopoverHeaderProps {\n children: ReactNode;\n colors: Pick<PopoverColors, \"text\">;\n}\n\n/**\n * Popover header component with padding\n * @param children - Header content\n * @param colors - Theme colors for styling\n */\nexport function PopoverHeader({ children, colors }: PopoverHeaderProps): JSX.Element {\n return (\n <div\n style={{\n fontSize: 14,\n fontWeight: 600,\n padding: \"12px 12px 0 12px\",\n marginBottom: 12,\n color: colors.text,\n }}\n >\n {children}\n </div>\n );\n}\n\n/**\n * Popover section component for scrollable content.\n * No padding so scrollbar hugs the edge.\n * Items inside should have their own padding.\n * @param children - Section content\n */\nexport function PopoverSection({ children }: { children: ReactNode }): JSX.Element {\n return <div>{children}</div>;\n}\n\n/**\n * Popover footer component - no padding so buttons can hug edges\n * @param children - Footer content\n */\nexport function PopoverFooter({ children }: { children: ReactNode }): JSX.Element {\n return <div>{children}</div>;\n}\n","/**\n * @fileoverview Scrollable container component with customizable scrollbar.\n *\n * Provides consistent scrollbar styling across the application with:\n * - Horizontal, vertical, or both scroll directions\n * - Synchronized scrolling support (for linked containers like chart + axis)\n * - Scroll-to-end behavior for showing latest data\n * - Edge extension option for full-bleed layouts\n * - Left-side scrollbar positioning\n * - Sharp-cornered scrollbar injected into <head> for reliable specificity\n *\n * IMPORTANT: Only uses ::-webkit-scrollbar pseudo-elements, NEVER standard\n * scrollbar-width/scrollbar-color. In Chromium 121+, standard properties\n * cause the browser to ignore webkit pseudo-elements entirely, resulting\n * in rounded corners that can't be overridden.\n */\n\nimport { type ReactNode, forwardRef, type CSSProperties, useEffect, useRef, useCallback } from \"react\";\n\ntype ScrollDirection = \"horizontal\" | \"vertical\" | \"both\";\n\n/**\n * Injects scrollbar CSS into <head> once per direction.\n * Exported so non-ScrollContainer elements (e.g. modal bodies)\n * can opt into the same scrollbar styling via className.\n */\nconst injectedDirections = new Set<string>();\n\nexport function injectScrollbarStyles(direction: string): void {\n if (typeof document === \"undefined\") return;\n if (injectedDirections.has(direction)) return;\n injectedDirections.add(direction);\n\n const scrollClass = scrollbarClassName(direction);\n const isHorizontal = direction === \"horizontal\" || direction === \"both\";\n const isVertical = direction === \"vertical\" || direction === \"both\";\n\n const css = `\n .${scrollClass}::-webkit-scrollbar {\n display: block;\n ${isHorizontal ? \"height: 8px;\" : \"\"}\n ${isVertical ? \"width: 8px;\" : \"\"}\n }\n .${scrollClass}::-webkit-scrollbar-track {\n background: rgba(0, 0, 0, 0.1);\n border-radius: 0;\n }\n .${scrollClass}::-webkit-scrollbar-thumb {\n background: rgba(0, 0, 0, 0.2);\n border-radius: 0;\n }\n .${scrollClass}::-webkit-scrollbar-thumb:hover {\n background: rgba(0, 0, 0, 0.4);\n }\n `;\n\n const style = document.createElement(\"style\");\n style.setAttribute(\"data-scroll-container\", direction);\n style.textContent = css;\n document.head.appendChild(style);\n}\n\n/** Returns the CSS class name for a given scroll direction. */\nexport function scrollbarClassName(direction: string): string {\n return `scroll-container-${direction}`;\n}\n\nexport interface ScrollContainerProps {\n children: ReactNode;\n /** Scroll direction (default: \"both\") */\n direction?: ScrollDirection;\n /** Container height */\n height?: number | string;\n /** Maximum container height */\n maxHeight?: number | string;\n /** Container width */\n width?: number | string;\n /** Use negative margin to extend scrollbar to parent edges */\n extendToEdges?: boolean;\n /** Padding value when extendToEdges is true (default: 16) */\n edgePadding?: number;\n /** Additional CSS class name */\n className?: string;\n /** Additional inline styles */\n style?: CSSProperties;\n /** Scroll event handler */\n onScroll?: (e: React.UIEvent<HTMLDivElement>) => void;\n /** Controlled scroll position (0 to 1) for synchronized scrolling */\n scrollPosition?: number;\n /** Callback when scroll position changes (0 to 1) */\n onScrollPositionChange?: (position: number) => void;\n /** Scroll to end on initial mount */\n scrollToEnd?: boolean;\n /** Scrollbar position (default: \"right\") */\n scrollbarPosition?: \"left\" | \"right\";\n}\n\nexport const ScrollContainer = forwardRef<HTMLDivElement, ScrollContainerProps>(\n (\n {\n children,\n direction = \"both\",\n height,\n maxHeight,\n width,\n extendToEdges = false,\n edgePadding = 16,\n className = \"\",\n style = {},\n onScroll,\n scrollPosition,\n onScrollPositionChange,\n scrollToEnd = false,\n scrollbarPosition = \"right\",\n },\n ref\n ) => {\n const internalRef = useRef<HTMLDivElement>(null);\n const scrollRef = (ref as React.RefObject<HTMLDivElement>) || internalRef;\n\n const isUpdatingScroll = useRef(false);\n const hasScrolledToEnd = useRef(false);\n\n const scrollClass = scrollbarClassName(direction);\n const isHorizontal = direction === \"horizontal\" || direction === \"both\";\n const isScrollbarLeft = scrollbarPosition === \"left\";\n\n // Inject scrollbar styles into <head> on first render of each direction\n injectScrollbarStyles(direction);\n\n const handleScroll = useCallback((e: React.UIEvent<HTMLDivElement>) => {\n onScroll?.(e);\n\n if (isUpdatingScroll.current) return;\n\n if (onScrollPositionChange) {\n const target = e.currentTarget;\n if (isHorizontal) {\n const maxScroll = target.scrollWidth - target.clientWidth;\n if (maxScroll > 0) {\n onScrollPositionChange(target.scrollLeft / maxScroll);\n }\n } else {\n const maxScroll = target.scrollHeight - target.clientHeight;\n if (maxScroll > 0) {\n onScrollPositionChange(target.scrollTop / maxScroll);\n }\n }\n }\n }, [isHorizontal, onScroll, onScrollPositionChange]);\n\n useEffect(() => {\n if (scrollPosition === undefined) return;\n const container = scrollRef.current;\n if (!container) return;\n\n if (isHorizontal) {\n const maxScroll = container.scrollWidth - container.clientWidth;\n if (maxScroll > 0) {\n const target = scrollPosition * maxScroll;\n if (Math.abs(container.scrollLeft - target) > 1) {\n isUpdatingScroll.current = true;\n container.scrollLeft = target;\n requestAnimationFrame(() => { isUpdatingScroll.current = false; });\n }\n }\n } else {\n const maxScroll = container.scrollHeight - container.clientHeight;\n if (maxScroll > 0) {\n const target = scrollPosition * maxScroll;\n if (Math.abs(container.scrollTop - target) > 1) {\n isUpdatingScroll.current = true;\n container.scrollTop = target;\n requestAnimationFrame(() => { isUpdatingScroll.current = false; });\n }\n }\n }\n }, [scrollPosition, isHorizontal, scrollRef]);\n\n useEffect(() => {\n if (!scrollToEnd || hasScrolledToEnd.current) return;\n const container = scrollRef.current;\n if (!container) return;\n\n const timeoutId = setTimeout(() => {\n if (isHorizontal) {\n container.scrollLeft = container.scrollWidth;\n } else {\n container.scrollTop = container.scrollHeight;\n }\n hasScrolledToEnd.current = true;\n }, 100);\n\n return () => clearTimeout(timeoutId);\n }, [scrollToEnd, isHorizontal, scrollRef, children]);\n\n const defaultOverflowX: CSSProperties[\"overflowX\"] = isHorizontal ? \"auto\" : \"hidden\";\n const defaultOverflowY: CSSProperties[\"overflowY\"] = direction === \"vertical\" || direction === \"both\" ? \"auto\" : \"hidden\";\n\n const containerStyle: CSSProperties = {\n overflowX: (style?.overflowX ?? defaultOverflowX) as CSSProperties[\"overflowX\"],\n overflowY: (style?.overflowY ?? defaultOverflowY) as CSSProperties[\"overflowY\"],\n ...(height !== undefined ? { height } : {}),\n ...(maxHeight !== undefined ? { maxHeight } : {}),\n ...(width !== undefined ? { width } : {}),\n ...(extendToEdges\n ? { margin: `-${edgePadding}px`, padding: edgePadding }\n : {}),\n ...(isScrollbarLeft ? { direction: \"rtl\" as const } : {}),\n ...style,\n };\n\n return (\n <div\n ref={scrollRef}\n className={`${scrollClass} ${className}`.trim()}\n style={containerStyle}\n onScroll={handleScroll}\n >\n {isScrollbarLeft ? (\n <div style={{ direction: \"ltr\", width: \"100%\", height: \"100%\" }}>\n {children}\n </div>\n ) : (\n children\n )}\n </div>\n );\n }\n);\n\nScrollContainer.displayName = \"ScrollContainer\";\n","/**\n * @fileoverview Single-select dropdown menu built on the Popover primitive.\n *\n * Unified menu component for all select-pattern dropdowns. Supports:\n * - Default bordered trigger or custom trigger via renderTrigger\n * - Per-option disabled state and icons\n * - Consistent sizing: sm (32px) and md (40px) for both triggers and options\n * - Fixed checkmark column (no layout shift on selection)\n * - Keyboard navigation (Arrow keys, Enter, Escape)\n * - ScrollContainer for consistent scrollbar styling\n */\n\nimport { useState, useRef, useCallback, useEffect, type ReactNode, type KeyboardEvent } from \"react\";\nimport { Icon } from \"@iconify/react\";\nimport { Popover, type PopoverColors } from \"./Popover\";\nimport { ScrollContainer } from \"./ScrollContainer\";\n\nexport interface MenuSelectOption<T extends string = string> {\n value: T;\n label: string;\n icon?: ReactNode;\n isDisabled?: boolean;\n}\n\nexport interface MenuSelectColors extends PopoverColors {\n bg: string;\n}\n\n/** Trigger render prop args */\nexport interface MenuSelectTriggerProps {\n /** Currently selected option (undefined if no selection) */\n selected: { value: string; label: string; icon?: ReactNode } | undefined;\n /** Whether the dropdown is open */\n isOpen: boolean;\n /** Whether the control is disabled */\n isDisabled: boolean;\n}\n\n/** Fixed sizing per variant */\nconst SIZES = {\n sm: { triggerHeight: 32, optionHeight: 32, triggerPadding: \"4px 8px\", optionPadding: \"0 12px\", fontSize: 13, chevronSize: 14 },\n md: { triggerHeight: 40, optionHeight: 40, triggerPadding: \"8px 12px\", optionPadding: \"0 12px\", fontSize: 14, chevronSize: 16 },\n} as const;\n\nexport interface MenuSelectProps<T extends string = string> {\n /** Available options */\n options: MenuSelectOption<T>[];\n /** Currently selected value (empty string for no selection) */\n value: T | \"\";\n /** Callback when a new value is selected */\n onChange: (value: T) => void;\n /** Placeholder text when no value is selected */\n placeholder?: string;\n /** Whether the control is disabled */\n isDisabled?: boolean;\n /** Theme colors */\n colors: MenuSelectColors;\n /** Size variant — controls trigger and option heights uniformly */\n size?: \"sm\" | \"md\";\n /** Minimum width in pixels */\n minWidth?: number;\n /** Maximum dropdown height in pixels (default: 240) */\n maxDropdownHeight?: number;\n /** Dropdown placement relative to trigger (default: \"bottom-start\") */\n placement?: \"bottom-start\" | \"bottom-end\" | \"top-start\" | \"top-end\";\n /**\n * Custom trigger render prop. When provided, replaces the default bordered\n * trigger button. The rendered element receives click/keyboard handlers\n * automatically via wrapper — just return the visual element.\n */\n renderTrigger?: (props: MenuSelectTriggerProps) => ReactNode;\n}\n\nexport function MenuSelect<T extends string = string>({\n options,\n value,\n onChange,\n placeholder = \"Select...\",\n isDisabled = false,\n colors,\n size = \"md\",\n minWidth,\n maxDropdownHeight = 240,\n placement = \"bottom-start\",\n renderTrigger,\n}: MenuSelectProps<T>): JSX.Element {\n const [isOpen, setIsOpen] = useState(false);\n const [focusedIndex, setFocusedIndex] = useState(-1);\n const listRef = useRef<HTMLDivElement>(null);\n\n const selectedOption = options.find((o) => o.value === value);\n const s = SIZES[size];\n\n const handleSelect = useCallback(\n (optionValue: T) => {\n onChange(optionValue);\n setIsOpen(false);\n },\n [onChange],\n );\n\n const handleToggle = useCallback(() => {\n if (isDisabled) return;\n setIsOpen((prev) => {\n if (!prev) {\n const idx = options.findIndex((o) => o.value === value && !o.isDisabled);\n setFocusedIndex(idx >= 0 ? idx : options.findIndex((o) => !o.isDisabled));\n }\n return !prev;\n });\n }, [isDisabled, options, value]);\n\n // Skip disabled items during keyboard navigation\n const findNextEnabled = useCallback((from: number, direction: 1 | -1): number => {\n let idx = from + direction;\n while (idx >= 0 && idx < options.length) {\n if (!options[idx]?.isDisabled) return idx;\n idx += direction;\n }\n return from;\n }, [options]);\n\n const handleKeyDown = useCallback(\n (e: KeyboardEvent) => {\n if (!isOpen) {\n if (e.key === \"ArrowDown\" || e.key === \"Enter\" || e.key === \" \") {\n e.preventDefault();\n handleToggle();\n }\n return;\n }\n\n switch (e.key) {\n case \"ArrowDown\":\n e.preventDefault();\n setFocusedIndex((prev) => findNextEnabled(prev, 1));\n break;\n case \"ArrowUp\":\n e.preventDefault();\n setFocusedIndex((prev) => findNextEnabled(prev, -1));\n break;\n case \"Enter\":\n case \" \":\n e.preventDefault();\n if (focusedIndex >= 0 && focusedIndex < options.length && !options[focusedIndex]?.isDisabled) {\n handleSelect(options[focusedIndex]!.value);\n }\n break;\n case \"Escape\":\n e.preventDefault();\n setIsOpen(false);\n break;\n }\n },\n [isOpen, focusedIndex, options, handleSelect, handleToggle, findNextEnabled],\n );\n\n // Scroll focused item into view\n useEffect(() => {\n if (!isOpen || focusedIndex < 0 || !listRef.current) return;\n const listbox = listRef.current.querySelector(\"[role=listbox]\");\n if (!listbox) return;\n const items = listbox.children;\n if (items[focusedIndex]) {\n (items[focusedIndex] as HTMLElement).scrollIntoView({ block: \"nearest\" });\n }\n }, [isOpen, focusedIndex]);\n\n const triggerElement = renderTrigger ? (\n <div\n role=\"button\"\n tabIndex={isDisabled ? -1 : 0}\n onClick={handleToggle}\n onKeyDown={handleKeyDown}\n style={{ cursor: isDisabled ? \"not-allowed\" : \"pointer\" }}\n >\n {renderTrigger({ selected: selectedOption, isOpen, isDisabled })}\n </div>\n ) : (\n <button\n type=\"button\"\n onClick={handleToggle}\n onKeyDown={handleKeyDown}\n disabled={isDisabled}\n style={{\n display: \"flex\",\n alignItems: \"center\",\n justifyContent: \"space-between\",\n gap: 8,\n width: \"100%\",\n minWidth,\n padding: s.triggerPadding,\n fontSize: s.fontSize,\n fontWeight: 400,\n fontFamily: \"inherit\",\n border: \"none\",\n borderRadius: 0,\n boxShadow: `0 0 0 1px ${colors.border}`,\n background: colors.bg,\n color: selectedOption ? colors.text : colors.textMuted,\n cursor: isDisabled ? \"not-allowed\" : \"pointer\",\n opacity: isDisabled ? 0.5 : 1,\n minHeight: s.triggerHeight,\n }}\n >\n <span\n style={{\n display: \"flex\",\n alignItems: \"center\",\n gap: 8,\n overflow: \"hidden\",\n }}\n >\n {selectedOption?.icon}\n <span\n style={{\n overflow: \"hidden\",\n textOverflow: \"ellipsis\",\n whiteSpace: \"nowrap\",\n }}\n >\n {selectedOption?.label ?? placeholder}\n </span>\n </span>\n <Icon\n icon=\"feather:chevron-down\"\n width={s.chevronSize}\n height={s.chevronSize}\n style={{\n flexShrink: 0,\n transition: \"transform 0.2s\",\n transform: isOpen ? \"rotate(180deg)\" : \"rotate(0deg)\",\n }}\n />\n </button>\n );\n\n return (\n <Popover\n isOpen={isOpen}\n onClose={() => setIsOpen(false)}\n trigger={triggerElement}\n colors={colors}\n minWidth={minWidth}\n fullWidth={!renderTrigger}\n gap={0}\n placement={placement}\n >\n <ScrollContainer\n ref={listRef}\n direction=\"vertical\"\n maxHeight={maxDropdownHeight}\n >\n <div role=\"listbox\" onKeyDown={handleKeyDown}>\n {options.map((option, index) => {\n const isSelected = option.value === value;\n const isFocused = index === focusedIndex;\n const optDisabled = option.isDisabled ?? false;\n return (\n <button\n type=\"button\"\n key={option.value}\n role=\"option\"\n aria-selected={isSelected}\n aria-disabled={optDisabled}\n onClick={() => !optDisabled && handleSelect(option.value)}\n onMouseEnter={() => !optDisabled && setFocusedIndex(index)}\n style={{\n display: \"flex\",\n alignItems: \"center\",\n gap: 8,\n width: \"100%\",\n padding: s.optionPadding,\n minHeight: s.optionHeight,\n fontSize: s.fontSize,\n fontFamily: \"inherit\",\n border: \"none\",\n borderRadius: 0,\n background: isFocused && !optDisabled ? `${colors.border}40` : \"transparent\",\n color: optDisabled ? colors.textMuted : colors.text,\n cursor: optDisabled ? \"not-allowed\" : \"pointer\",\n fontWeight: isSelected ? 500 : 400,\n textAlign: \"left\",\n opacity: optDisabled ? 0.5 : 1,\n }}\n >\n {option.icon}\n <span\n style={{\n overflow: \"hidden\",\n textOverflow: \"ellipsis\",\n whiteSpace: \"nowrap\",\n flex: 1,\n }}\n >\n {option.label}\n </span>\n <span style={{ width: 14, flexShrink: 0, display: \"flex\", justifyContent: \"center\" }}>\n {isSelected && (\n <Icon\n icon=\"feather:check\"\n width={14}\n height={14}\n />\n )}\n </span>\n </button>\n );\n })}\n </div>\n </ScrollContainer>\n </Popover>\n );\n}\n","/**\n * @fileoverview Multi-select filter component with icon stack display.\n *\n * A reusable filter pattern for selecting multiple items (currencies, payment methods, etc.)\n * with a compact button showing selected items as an overlapping icon stack, and a\n * popover dropdown for making selections.\n */\n\nimport { useState, ReactNode, useMemo } from \"react\";\nimport { Popover, PopoverHeader, PopoverSection, PopoverFooter, type PopoverColors } from \"./Popover\";\nimport { OverlappingStack } from \"./OverlappingStack\";\n\n/**\n * Colors required by MultiSelectFilter component.\n * Pass these from your app's theme context.\n */\nexport interface MultiSelectFilterColors extends PopoverColors {\n bg: string;\n}\n\n/**\n * Item with usage count for ordering\n */\nexport interface ItemStat<T> {\n item: T;\n count: number;\n}\n\n/**\n * Props for MultiSelectFilter component\n */\nexport interface MultiSelectFilterProps<T extends string> {\n /** All available item IDs */\n allItems: Set<T>;\n /** Currently selected item IDs */\n selectedItems: Set<T>;\n /** Callback when selection changes */\n onSelectionChange: (items: Set<T>) => void;\n /** Item usage stats for ordering (most used first) - used as fallback if getVolumeRank not provided */\n itemStats: ItemStat<T>[];\n /** Render function for item icon in the button's OverlappingStack */\n renderIcon: (item: T) => ReactNode;\n /** Render function for item icon in the dropdown list (can be smaller/different) */\n renderListIcon?: (item: T) => ReactNode;\n /** Get display label for an item */\n getLabel: (item: T) => string;\n /** Title shown in popover header */\n title: string;\n /** Theme colors */\n colors: MultiSelectFilterColors;\n /** Placeholder text when no items available */\n placeholder?: string;\n /** Button min/max width */\n buttonWidth?: number;\n /** Icon size in OverlappingStack */\n iconSize?: number;\n /** Max icons to show in button */\n iconLimit?: number;\n /** Overlap amount for icons */\n iconOverlap?: number;\n /** Whether rightmost icons overlap leftmost */\n reverseZIndex?: boolean;\n /**\n * Optional function to get volume rank for an item (lower = more volume).\n * If provided, items are sorted by volume rank first, then by stats count.\n * This enables sorting by monthly usage data from MonthlyStatsContext.\n */\n getVolumeRank?: (item: T) => number;\n}\n\n/**\n * Reusable multi-select filter component with icon stack button and popover.\n * Used for currencies, payment methods, and similar filter patterns.\n *\n * @param allItems - Set of all available item IDs\n * @param selectedItems - Currently selected item IDs\n * @param onSelectionChange - Callback when selection changes\n * @param itemStats - Item usage stats for ordering\n * @param renderIcon - Render function for item icon in button\n * @param renderListIcon - Render function for item icon in list (defaults to renderIcon)\n * @param getLabel - Get display label for an item\n * @param title - Title shown in popover header\n * @param colors - Theme colors for styling\n * @param placeholder - Placeholder when no items (default: title)\n * @param buttonWidth - Button width (default: 112)\n * @param iconSize - Icon size in stack (default: 24)\n * @param iconLimit - Max icons in button (default: 3)\n * @param iconOverlap - Overlap amount (default: 8)\n * @param reverseZIndex - Rightmost icons overlap leftmost (default: true)\n * @param getVolumeRank - Optional function to get volume rank for sorting by monthly data\n */\nexport function MultiSelectFilter<T extends string>({\n allItems,\n selectedItems,\n onSelectionChange,\n itemStats,\n renderIcon,\n renderListIcon,\n getLabel,\n title,\n colors,\n placeholder: _placeholder,\n buttonWidth = 112,\n iconSize = 24,\n iconLimit = 3,\n iconOverlap = 8,\n reverseZIndex = true,\n getVolumeRank,\n}: MultiSelectFilterProps<T>): JSX.Element {\n const [isOpen, setIsOpen] = useState(false);\n const [localSelection, setLocalSelection] = useState(selectedItems);\n\n // Create a map for quick lookup of stats\n const statsMap = useMemo(\n () => new Map(itemStats.map((stat) => [stat.item, stat.count])),\n [itemStats]\n );\n\n // Sort items by volume rank (if provided), then by stats count, then alphabetically\n const sortedItems = useMemo(() => {\n return Array.from(allItems).sort((a, b) => {\n // Primary sort: volume rank (if available)\n if (getVolumeRank) {\n const rankA = getVolumeRank(a);\n const rankB = getVolumeRank(b);\n if (rankA !== rankB) {\n return rankA - rankB; // Lower rank = higher volume = first\n }\n }\n // Secondary sort: stats count\n const countA = statsMap.get(a) ?? 0;\n const countB = statsMap.get(b) ?? 0;\n if (countA !== countB) {\n return countB - countA;\n }\n // Tertiary sort: alphabetical\n return getLabel(a).localeCompare(getLabel(b));\n });\n }, [allItems, getVolumeRank, statsMap, getLabel]);\n\n const handleToggle = (item: T) => {\n const newSelection = new Set(localSelection);\n if (newSelection.has(item)) {\n newSelection.delete(item);\n } else {\n newSelection.add(item);\n }\n setLocalSelection(newSelection);\n };\n\n const handleSelectAll = () => {\n setLocalSelection(new Set());\n };\n\n const handleSelectNone = () => {\n setLocalSelection(new Set());\n };\n\n const handleApply = () => {\n onSelectionChange(localSelection);\n setIsOpen(false);\n };\n\n const handleToggleOpen = () => {\n if (isOpen) {\n setIsOpen(false);\n } else {\n setLocalSelection(selectedItems);\n setIsOpen(true);\n }\n };\n\n const selectedCount = selectedItems.size;\n const totalCount = allItems.size;\n const isShowingAll = selectedCount === 0 || selectedCount === totalCount;\n const hasFilter = selectedCount > 0 && selectedCount < totalCount;\n\n // Items to display in button (all when showing all, selected when filtered)\n // Use same sorting logic for consistency\n const itemsToDisplay = useMemo(() => {\n if (isShowingAll) {\n return sortedItems;\n }\n return Array.from(selectedItems).sort((a, b) => {\n // Primary sort: volume rank (if available)\n if (getVolumeRank) {\n const rankA = getVolumeRank(a);\n const rankB = getVolumeRank(b);\n if (rankA !== rankB) {\n return rankA - rankB;\n }\n }\n // Secondary sort: stats count\n const countA = statsMap.get(a) ?? 0;\n const countB = statsMap.get(b) ?? 0;\n if (countA !== countB) {\n return countB - countA;\n }\n // Tertiary sort: alphabetical\n return getLabel(a).localeCompare(getLabel(b));\n });\n }, [isShowingAll, sortedItems, selectedItems, getVolumeRank, statsMap, getLabel]);\n\n // Create overlapping stack of icons\n const iconItems = itemsToDisplay.map((item) => (\n <div\n key={item}\n style={{\n width: iconSize,\n height: iconSize,\n borderRadius: \"50%\",\n boxShadow: `0 0 0 1px ${colors.border}`,\n overflow: \"hidden\",\n background: colors.bgCard,\n display: \"flex\",\n alignItems: \"center\",\n justifyContent: \"center\",\n }}\n >\n {renderIcon(item)}\n </div>\n ));\n\n const triggerButton = (\n <button\n onClick={handleToggleOpen}\n style={{\n padding: \"8px 12px\",\n fontSize: 13,\n fontWeight: 500,\n border: `1px solid ${hasFilter ? \"#3182ce\" : colors.border}`,\n background: hasFilter ? \"#3182ce\" : colors.bgCard,\n color: hasFilter ? \"#fff\" : colors.text,\n cursor: \"pointer\",\n display: \"flex\",\n alignItems: \"center\",\n gap: 6,\n minWidth: buttonWidth,\n maxWidth: buttonWidth,\n minHeight: 38,\n maxHeight: 38,\n justifyContent: \"center\",\n }}\n >\n <OverlappingStack\n items={iconItems}\n limit={iconLimit}\n overlap={iconOverlap}\n itemSize={iconSize}\n reverseZIndex={reverseZIndex}\n />\n </button>\n );\n\n // Use renderListIcon if provided, otherwise fall back to renderIcon\n const listIconRenderer = renderListIcon ?? renderIcon;\n\n return (\n <Popover isOpen={isOpen} onClose={() => setIsOpen(false)} trigger={triggerButton} colors={colors}>\n <PopoverHeader colors={colors}>\n <div style={{ display: \"flex\", justifyContent: \"space-between\", alignItems: \"center\" }}>\n <span>{title}</span>\n <div style={{ display: \"flex\", gap: 4 }}>\n <button\n onClick={handleSelectAll}\n style={{\n padding: \"2px 8px\",\n fontSize: 11,\n border: \"none\",\n background: \"transparent\",\n color: colors.textMuted,\n cursor: \"pointer\",\n }}\n >\n All\n </button>\n <button\n onClick={handleSelectNone}\n style={{\n padding: \"2px 8px\",\n fontSize: 11,\n border: \"none\",\n background: \"transparent\",\n color: colors.textMuted,\n cursor: \"pointer\",\n }}\n >\n None\n </button>\n </div>\n </div>\n </PopoverHeader>\n\n <PopoverSection>\n <div style={{ position: \"relative\" }}>\n <div style={{ maxHeight: 300, overflowY: \"auto\", paddingBottom: 12 }}>\n {sortedItems.map((item) => (\n <label\n key={item}\n style={{\n display: \"flex\",\n alignItems: \"center\",\n justifyContent: \"space-between\",\n padding: \"4px 12px\",\n cursor: \"pointer\",\n fontSize: 13,\n }}\n >\n <div style={{ display: \"flex\", alignItems: \"center\", gap: 8 }}>\n <input\n type=\"checkbox\"\n checked={localSelection.has(item)}\n onChange={() => handleToggle(item)}\n style={{ cursor: \"pointer\" }}\n />\n <div\n style={{\n width: iconSize,\n height: iconSize,\n borderRadius: \"50%\",\n boxShadow: `0 0 0 1px ${colors.border}`,\n overflow: \"hidden\",\n background: colors.bgCard,\n display: \"flex\",\n alignItems: \"center\",\n justifyContent: \"center\",\n flexShrink: 0,\n }}\n >\n {listIconRenderer(item)}\n </div>\n <span>{getLabel(item)}</span>\n </div>\n {statsMap.size > 0 && (\n <span\n style={{\n fontSize: 11,\n color: colors.textMuted,\n background: colors.bg,\n padding: \"2px 6px\",\n }}\n >\n {statsMap.get(item) ?? 0}\n </span>\n )}\n </label>\n ))}\n </div>\n {/* Gradient overlay to indicate more content */}\n <div\n style={{\n position: \"absolute\",\n bottom: 0,\n left: 0,\n right: 0,\n height: 12,\n background: `linear-gradient(to bottom, transparent, ${colors.bgCard})`,\n pointerEvents: \"none\",\n }}\n />\n </div>\n </PopoverSection>\n\n <PopoverFooter>\n <button\n onClick={handleApply}\n style={{\n width: \"100%\",\n padding: \"8px 12px\",\n fontSize: 13,\n fontWeight: 500,\n border: \"none\",\n background: \"#3182ce\",\n color: \"#fff\",\n cursor: \"pointer\",\n minHeight: 38,\n }}\n >\n Apply\n </button>\n </PopoverFooter>\n </Popover>\n );\n}\n","/**\n * @fileoverview Combined payment method and currency icon component.\n *\n * Displays a composite icon with the currency flag as background and\n * the payment method icon as a small badge overlay. Used in tables\n * and lists to show both the payment method and currency in a single\n * compact visual element.\n */\n\nimport React from \"react\";\nimport { CurrencyIcon } from \"./CurrencyIcon\";\nimport type { Hex } from \"viem\";\n\n/**\n * Colors required by PaymentCurrencyCombo component.\n * Pass these from your app's theme context.\n */\nexport interface PaymentCurrencyComboColors {\n bg: string;\n}\n\n/**\n * Display a combined payment method and currency icon\n * Shows currency flag as background with payment provider badge overlay\n * @param paymentMethodIcon - React node for the payment method icon\n * @param currencyId - The currency contract ID (keccak256 hash of ticker)\n * @param size - The height of the container in pixels (default: 20)\n * @param colors - Theme colors\n */\nexport const PaymentCurrencyCombo = ({\n paymentMethodIcon,\n currencyId,\n size = 20,\n colors,\n}: {\n paymentMethodIcon: React.ReactNode;\n currencyId: Hex;\n size?: number;\n colors: PaymentCurrencyComboColors;\n}): JSX.Element => {\n const badgeSize = size * 0.60;\n\n return (\n <div\n style={{\n display: 'flex',\n alignItems: 'center',\n justifyContent: 'center',\n boxSizing: 'border-box',\n borderRadius: '100%',\n height: size,\n width: size,\n position: 'relative',\n overflow: 'hidden',\n }}\n >\n {/* Background - Currency flag (zoomed to fill square) */}\n <div\n style={{\n position: 'absolute',\n top: 0,\n left: 0,\n width: '100%',\n height: '100%',\n display: 'flex',\n alignItems: 'center',\n justifyContent: 'center',\n overflow: 'hidden',\n }}\n >\n <CurrencyIcon currencyId={currencyId} size={size} />\n </div>\n\n {/* Foreground - Payment method badge (bottom right) */}\n <div\n style={{\n position: 'absolute',\n bottom: 0,\n right: 0,\n width: badgeSize,\n height: badgeSize,\n display: 'flex',\n alignItems: 'center',\n justifyContent: 'center',\n background: colors.bg,\n borderRadius: 0,\n }}\n >\n {paymentMethodIcon}\n </div>\n </div>\n );\n};\n","/**\n * @fileoverview Payment method icon component.\n *\n * Displays payment provider icons (Venmo, Zelle, etc.) using Iconify.\n * This is a pure rendering component - the host app determines which\n * icon, color, and properties to display.\n */\n\nimport { Icon } from \"@iconify/react\";\n\n/**\n * Props for PaymentMethodIcon component.\n */\nexport interface PaymentMethodIconProps {\n /** Iconify icon identifier (e.g., \"simple-icons:zelle\") */\n icon: string;\n /** Icon color */\n color?: string;\n /** Background color for icons that need contrast */\n backgroundColor?: string;\n /** Size of the icon in pixels */\n size?: number;\n /** Whether this is an unknown/unrecognized payment method */\n isUnknown?: boolean;\n /** Tooltip text */\n tooltip?: string;\n}\n\n/**\n * Display a payment method icon using Iconify.\n * This is a pure rendering component - use your app's payment method\n * resolution logic to determine the icon, color, and other properties.\n *\n * @param icon - Iconify icon identifier (e.g., \"simple-icons:zelle\", \"mdi:credit-card\")\n * @param color - Icon color (default: \"#6b7280\" for gray)\n * @param backgroundColor - Optional background color for icons that need contrast (e.g., Revolut white on blue)\n * @param size - Size of the icon in pixels (default: 16)\n * @param isUnknown - Whether this is an unknown payment method (shows warning indicator)\n * @param tooltip - Tooltip text on hover\n */\nexport function PaymentMethodIcon({\n icon,\n color = \"#6b7280\",\n backgroundColor,\n size = 16,\n isUnknown = false,\n tooltip,\n}: PaymentMethodIconProps): JSX.Element {\n const effectiveColor = isUnknown ? \"#ef4444\" : color;\n\n return (\n <span\n style={{\n display: \"flex\",\n alignItems: \"center\",\n justifyContent: \"center\",\n width: size,\n height: size,\n opacity: isUnknown ? 0.6 : 1,\n position: \"relative\",\n backgroundColor,\n borderRadius: backgroundColor ? \"4px\" : undefined,\n padding: backgroundColor ? \"2px\" : undefined,\n boxSizing: \"border-box\",\n }}\n title={tooltip}\n >\n <Icon\n icon={icon}\n width={backgroundColor ? size - 4 : size}\n height={backgroundColor ? size - 4 : size}\n style={{ color: effectiveColor }}\n />\n {isUnknown && (\n <span\n style={{\n position: \"absolute\",\n bottom: -2,\n right: -2,\n width: size * 0.35,\n height: size * 0.35,\n borderRadius: \"50%\",\n background: \"#ef4444\",\n border: \"1px solid white\",\n }}\n title=\"Unknown payment method\"\n />\n )}\n </span>\n );\n}\n\n/**\n * Default icon for unknown payment methods\n */\nexport const DEFAULT_PAYMENT_ICON = \"mdi:credit-card\";\n\n/**\n * Default color for unknown payment methods\n */\nexport const DEFAULT_PAYMENT_COLOR = \"#6b7280\";\n","/**\n * @fileoverview Tooltip component for hover hints.\n *\n * Simple hover tooltip with automatic top/bottom placement.\n * Uses inline positioning — no portal or z-index layering required.\n */\n\nimport { useState, useRef, useEffect, type ReactNode, type CSSProperties } from \"react\";\n\nexport interface TooltipProps {\n /** Text shown in the tooltip */\n label: string;\n children: ReactNode;\n /** Suppress the tooltip entirely */\n isDisabled?: boolean;\n /**\n * Preferred placement relative to the trigger (default: \"top\").\n * Use \"top-end\" or \"bottom-end\" for triggers near the right viewport edge\n * — the tooltip anchors to the right side of the trigger instead of the left,\n * preventing horizontal overflow.\n */\n placement?: \"top\" | \"bottom\" | \"top-end\" | \"bottom-end\";\n /**\n * CSS display mode for the wrapper span.\n * - \"inline-flex\" (default): wraps tightly around inline children\n * - \"flex\" or \"block\": takes full width — use for block-level children\n * - \"contents\": wrapper is invisible to layout — children render as if unwrapped\n */\n display?: CSSProperties[\"display\"];\n}\n\n/**\n * Wraps any element and shows a tooltip on hover.\n *\n * @example\n * ```tsx\n * <Tooltip label=\"Loaded from: https://rpc.pulsechain.com\">\n * <Badge>RPC</Badge>\n * </Tooltip>\n * ```\n */\nexport function Tooltip({ label, children, isDisabled, placement = \"top\", display = \"inline-flex\" }: TooltipProps): JSX.Element {\n const [visible, setVisible] = useState(false);\n const ref = useRef<HTMLSpanElement>(null);\n\n useEffect(() => {\n if (isDisabled) setVisible(false);\n }, [isDisabled]);\n\n if (isDisabled) return <>{children}</>;\n\n const isEnd = placement === \"top-end\" || placement === \"bottom-end\";\n const isTop = placement === \"top\" || placement === \"top-end\";\n\n const tipStyle: CSSProperties = {\n position: \"absolute\",\n ...(isEnd ? { right: 0 } : { left: 0 }),\n width: \"max-content\",\n maxWidth: 280,\n background: \"rgba(0,0,0,0.82)\",\n color: \"#fff\",\n fontSize: 11,\n lineHeight: 1.4,\n padding: \"4px 8px\",\n whiteSpace: \"normal\",\n zIndex: 9999,\n pointerEvents: \"none\",\n borderRadius: 2,\n ...(isTop ? { bottom: \"calc(100% + 5px)\" } : { top: \"calc(100% + 5px)\" }),\n };\n\n return (\n <span\n ref={ref}\n style={{ position: \"relative\", display, alignItems: display === \"inline-flex\" ? \"center\" : undefined }}\n onMouseEnter={() => setVisible(true)}\n onMouseLeave={() => setVisible(false)}\n >\n {children}\n {visible && <span style={tipStyle}>{label}</span>}\n </span>\n );\n}\n","/**\n * @fileoverview Version badge component.\n *\n * Displays a small badge indicating the protocol version (v2 or v3).\n * Used to visually distinguish deposits and transactions from different\n * protocol versions.\n */\n\nimport React from \"react\";\n\n/**\n * Color props for VersionBadge component.\n * Pass these from your app's theme context.\n */\nexport interface VersionBadgeColors {\n /** Background color for v2 version */\n bgV2: string;\n /** Background color for v3 version */\n bgV3: string;\n /** Text color */\n text: string;\n}\n\nexport type Version = \"v2\" | \"v3\";\n\n/**\n * VersionBadge displays the protocol version (v2 or v3) as a small badge.\n * Use this to indicate which version of the zkp2p protocol a deposit or\n * transaction belongs to.\n *\n * @example\n * ```tsx\n * <VersionBadge version=\"v3\" colors={themeColors} />\n * ```\n */\nexport function VersionBadge(props: {\n /** The protocol version to display */\n version: Version;\n /** Color configuration for the badge */\n colors: VersionBadgeColors;\n /** Optional additional styles */\n style?: React.CSSProperties;\n}): JSX.Element {\n const { version, colors, style } = props;\n\n const bgColor = version === \"v3\" ? colors.bgV3 : colors.bgV2;\n\n return (\n <span\n style={{\n display: \"inline-flex\",\n alignItems: \"center\",\n justifyContent: \"center\",\n padding: \"2px 4px\",\n fontSize: \"10px\",\n fontWeight: 600,\n textTransform: \"uppercase\",\n letterSpacing: \"0.25px\",\n borderRadius: \"4px\",\n backgroundColor: bgColor,\n color: colors.text,\n ...style,\n }}\n >\n {version}\n </span>\n );\n}\n"]}
package/dist/index.d.cts CHANGED
@@ -536,8 +536,13 @@ interface TooltipProps {
536
536
  children: ReactNode;
537
537
  /** Suppress the tooltip entirely */
538
538
  isDisabled?: boolean;
539
- /** Preferred placement relative to the trigger (default: "top") */
540
- placement?: "top" | "bottom";
539
+ /**
540
+ * Preferred placement relative to the trigger (default: "top").
541
+ * Use "top-end" or "bottom-end" for triggers near the right viewport edge
542
+ * — the tooltip anchors to the right side of the trigger instead of the left,
543
+ * preventing horizontal overflow.
544
+ */
545
+ placement?: "top" | "bottom" | "top-end" | "bottom-end";
541
546
  /**
542
547
  * CSS display mode for the wrapper span.
543
548
  * - "inline-flex" (default): wraps tightly around inline children
package/dist/index.d.ts CHANGED
@@ -536,8 +536,13 @@ interface TooltipProps {
536
536
  children: ReactNode;
537
537
  /** Suppress the tooltip entirely */
538
538
  isDisabled?: boolean;
539
- /** Preferred placement relative to the trigger (default: "top") */
540
- placement?: "top" | "bottom";
539
+ /**
540
+ * Preferred placement relative to the trigger (default: "top").
541
+ * Use "top-end" or "bottom-end" for triggers near the right viewport edge
542
+ * — the tooltip anchors to the right side of the trigger instead of the left,
543
+ * preventing horizontal overflow.
544
+ */
545
+ placement?: "top" | "bottom" | "top-end" | "bottom-end";
541
546
  /**
542
547
  * CSS display mode for the wrapper span.
543
548
  * - "inline-flex" (default): wraps tightly around inline children