@liberfi.io/ui-tokens 0.1.0
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/dist/index.d.mts +267 -0
- package/dist/index.d.ts +267 -0
- package/dist/index.js +22 -0
- package/dist/index.js.map +1 -0
- package/dist/index.mjs +22 -0
- package/dist/index.mjs.map +1 -0
- package/package.json +49 -0
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"sources":["../src/version.ts","../src/components/token-avatar/token-avatar.ui.tsx","../src/components/token-list/filters/token-list-keywords-filter.ui.tsx","../src/components/token-list/filters/token-list-protocol-filter.ui.tsx","../src/components/token-list/filters/token-list-minmax-filter.ui.tsx","../src/components/token-list/filters/token-list-audits-filter.ui.tsx","../src/components/token-list/filters/token-list-metrics-filter.ui.tsx","../src/components/token-list/filters/token-list-stats-filter.ui.tsx","../src/components/token-list/token-list-filter.ui.tsx","../src/components/token-list/token-list-filter-modal.ui.tsx","../src/components/token-list/token-list-filter-popover.ui.tsx","../src/components/token-list/token-list-resolution-selector.ui.tsx","../src/components/token-list/cells/token-cell.ui.tsx","../src/components/token-list/cells/token-info-cell.ui.tsx","../src/components/token-list/cells/token-liquidity-cell.ui.tsx","../src/components/token-list/cells/token-market-cap-cell.ui.tsx","../src/components/token-list/cells/token-price-cell.ui.tsx","../src/components/token-list/cells/token-traders-cell.ui.tsx","../src/components/token-list/cells/token-trades-cell.ui.tsx","../src/components/token-list/cells/token-volumes-cell.ui.tsx","../src/components/token-list/token-list-skeleton.ui.tsx","../src/components/token-list/token-list.ui.tsx","../src/components/token-list/new-token-list.script.ts","../src/components/token-list/new-token-list.widget.tsx","../src/components/token-list/stock-token-list.script.ts","../src/components/token-list/stock-token-list.widget.tsx","../src/components/token-list/trending-token-list.script.ts","../src/components/token-list/trending-token-list.widget.tsx"],"names":["version_default","TokenAvatar","token","enablePreview","enableSearch","showProgress","showProtocolFamily","radius","className","classNames","formattedProtocolFamily","useMemo","parseTokenProtocolFamily","displayProtocolFamily","displayProgress","SafeBigNumber","displaySearch","fallbackName","isHovered","setIsHovered","useState","handleMouseEnter","useCallback","handleMouseLeave","handleSearch","e","url","searchImageUrl","jsxs","clsx","jsx","ProgressTrack","PreviewWrapper","Avatar","CameraIcon","StyledTooltip","Image","children","Preview","progress","strokeDashoffset","TokenListKeywordsFilter","keywords","excludeKeywords","onKeywordsChange","onExcludeKeywordsChange","t","useTranslation","keywordsText","setKeywordsText","excludeKeywordsText","setExcludeKeywordsText","useEffect","prev","prevKeywords","parseKeywords","prevExcludeKeywords","handleKeywordsValueChange","value","handleExcludeKeywordsValueChange","StyledInput","parsedKeywords","v","TokenListProtocolFilter","protocols","selectedProtocols","onSelectedProtocolsChange","selected","setSelected","isAllSelected","protocol","handleSelectAll","handleSelect","newSelected","p","StyledButton","formatTokenProtocolName","TokenListMinMaxFilter","title","field","onChange","min","setMin","parseValue","max","setMax","handleMinChange","formatValue","handleMaxChange","StyledNumberInput","TokenListAuditsFilter","values","onValuesChange","currentValues","setCurrentValues","handleValueChange","newValues","TokenListMetricsFilter","resolution","TokenListStatsFilter","curTab","setCurTab","handleValuesChange","auditsFiltersCount","fields","metricsFiltersCount","StyledTabs","Tab","StyledBadge","TokenListFilter","filters","onFiltersChange","setSelectedProtocols","parseSelectedProtocols","searchKeywords","setSearchKeywords","excludeSearchKeywords","setExcludeSearchKeywords","filterValues","setFilterValues","handleProtocolsChange","toFilters","handleKeywordsChange","handleExcludeKeywordsChange","handleFilterValuesChange","Fragment","StyledDivider","filter","it","TokenListFilterModal","isOpen","onOpen","onClose","onOpenChange","useDisclosure","editingFilters","setEditingFilters","handleReset","handleApply","isEmptyFilters","FilterIcon","ChevronDownIcon","StyledModal","ModalContent","ModalHeader","ModalBody","ScrollShadow","ModalFooter","RefreshIcon","TokenListFilterPopover","popoverProps","StyledPopover","PopoverTrigger","PopoverContent","TokenListResolutionSelector","onResolutionChange","resolutionOptions","handleResolutionChange","key","option","TokenCell","copyToClipboard","useCopyToClipboard","handleCopyToClipboard","age","useTickAge","CopyIcon","formatAge","Link","WebsiteIcon","TwitterIcon","TelegramIcon","DiscordIcon","searchTwitterUrl","SearchIcon","TokenInfoCell","holders","devHoldingsRatio","devHoldingsRatioWarning","top10HoldingsRatio","top10HoldingsRatioWarning","top100HoldingsRatio","top100HoldingsRatioWarning","Chip","PeopleIcon","formatAmount","CookIcon","formatPercent","UserWithStarBadgeIcon","UserIcon","TokenLiquidityCell","liquidity","formatAmountUSD","TokenMarketCapCell","marketCap","TokenPriceCell","price","priceChange","priceChangeAbs","bullish","formatPriceUSD","TriangleUpIcon","TriangleDownIcon","TokenTradersCell","traders","buyers","sellers","TokenTradesCell","txs","buys","sells","TokenVolumesCell","volumes","buyVolumes","sellVolumes","skeletonCount","TokenListSkeleton","rowHeight","hasActions","_","index","TokenListRowSkeleton","hasBorderBottom","TokenCellSkeleton","TokenPriceCellSkeleton","TokenMarketCapCellSkeleton","TokenLiquidityCellSkeleton","TokenVolumesCellSkeleton","TokenTxsCellSkeleton","TokenTradersCellSkeleton","TokenInfoCellSkeleton","TokenActionsSkeleton","Skeleton","TokenList","tokens","isLoading","ActionsComponent","onSelectToken","sortDirections","onSortChange","height","itemHeight","itemHeightMobile","isMobile","useScreen","handleRowClick","sorts","setSorts","handleSortChange","sort","StyledTable","TableHeader","TableColumn","Sortable","TableBody","EmptyIcon","TableRow","TableCell","useNewTokensScript","chain","options","refetchInterval","queryParams","prevParamsRef","useRef","isParamsChanged","setIsParamsChanged","setTokens","fetchedTokens","isPending","useNewTokensQuery","NewTokenListWidget","setSortDirections","sortBy","sortDirection","useStockTokensScript","useStockTokensQuery","StockTokenListWidget","useTrendingTokensScript","useTrendingTokensQuery","TrendingTokenListWidget"],"mappings":"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","file":"index.mjs","sourcesContent":["declare global {\n interface Window {\n __LIBERFI_VERSION__?: {\n [key: string]: string;\n };\n }\n}\nif (typeof window !== \"undefined\") {\n window.__LIBERFI_VERSION__ = window.__LIBERFI_VERSION__ || {};\n window.__LIBERFI_VERSION__[\"@liberfi.io/ui-tokens\"] = \"0.1.0\";\n}\n\nexport default \"0.1.0\";\n","import {\n MouseEvent,\n PropsWithChildren,\n useCallback,\n useMemo,\n useState,\n} from \"react\";\nimport { Token } from \"@liberfi.io/types\";\nimport { Avatar, CameraIcon, Image, StyledTooltip, clsx } from \"@liberfi.io/ui\";\nimport {\n parseTokenProtocolFamily,\n searchImageUrl,\n SafeBigNumber,\n} from \"@liberfi.io/utils\";\n\nexport type TokenAvatarProps = {\n /** token data to display */\n token: Token;\n /** whether hover to preview the avatar */\n enablePreview?: boolean;\n /** whether click to search the avatar */\n enableSearch?: boolean;\n /** whether show the bonding curve progress */\n showProgress?: boolean;\n /** whether show the launch protocol family icon */\n showProtocolFamily?: boolean;\n /** radius of the avatar */\n radius?: \"none\" | \"sm\" | \"md\" | \"lg\";\n /** use this class to adjust the size of the avatar */\n className?: string;\n /** customize the styles */\n classNames?: {\n /** use this class to adjust the color of the avatar background, background is displayed when progress is not displayed */\n background?: string;\n /** use this class to adjust the color of the progress track */\n progress?: string;\n /** use this class to adjust the color of the avatar wrapper */\n avatarWrapper?: string;\n /** use this class to adjust the size of the avatar */\n avatar?: string;\n /** use this class to adjust the size of the protocol family icon's wrapper */\n protocolFamilyIconWrapper?: string;\n /** use this class to adjust the size of the protocol family icon */\n protocolFamilyIcon?: string;\n /** use this class to adjust the size & background color of the search wrapper */\n searchWrapper?: string;\n /** use this class to adjust the size & color of the search icon */\n searchIcon?: string;\n /** use this class to adjust the size of the preview wrapper */\n previewWrapper?: string;\n /** use this class to adjust the size of the avatar in the preview */\n previewAvatar?: string;\n /** use this class to adjust the size & background color of the search wrapper in the preview */\n previewSearchWrapper?: string;\n /** use this class to adjust the size & color of the search icon in the preview */\n previewSearchIcon?: string;\n };\n};\n\nexport function TokenAvatar({\n token,\n enablePreview = true,\n enableSearch = true,\n showProgress = true,\n showProtocolFamily = true,\n radius = \"sm\",\n className,\n classNames,\n}: TokenAvatarProps) {\n const formattedProtocolFamily = useMemo(\n () =>\n token.launchedFrom?.protocolFamily\n ? parseTokenProtocolFamily(\n token.chain,\n token.launchedFrom.protocolFamily,\n )\n : undefined,\n [token.chain, token.launchedFrom?.protocolFamily],\n );\n\n const displayProtocolFamily = useMemo(\n () => showProtocolFamily && formattedProtocolFamily,\n [showProtocolFamily, formattedProtocolFamily],\n );\n\n const displayProgress = useMemo(\n () =>\n showProgress &&\n token.migrateProgress &&\n new SafeBigNumber(token.migrateProgress).lt(100),\n [showProgress, token.migrateProgress],\n );\n\n const displaySearch = useMemo(\n () => enableSearch && token.image,\n [enableSearch, token.image],\n );\n\n const fallbackName = useMemo(\n () =>\n (token.symbol ?? token.name ?? token.address ?? \"L\")\n .slice(0, 1)\n .toUpperCase(),\n [token.symbol, token.name, token.address],\n );\n\n const [isHovered, setIsHovered] = useState(false);\n\n const handleMouseEnter = useCallback(() => {\n setIsHovered(true);\n }, []);\n\n const handleMouseLeave = useCallback(() => {\n setIsHovered(false);\n }, []);\n\n // TODO use router adapter\n const handleSearch = useCallback(\n (e: MouseEvent<HTMLDivElement>) => {\n e.stopPropagation();\n if (!token.image) return;\n const url = searchImageUrl(token.image);\n window.open(url, \"_blank\");\n },\n [token.image],\n );\n\n return (\n <div\n className={clsx(\n \"relative justify-center items-center\",\n className ?? \"w-15 h-15\",\n )}\n >\n {/* if progress is not displayed, fill the background with the protocol family color */}\n {!displayProgress && (\n <div\n className={clsx(\n \"absolute inset-0\",\n `rounded-${radius}`,\n formattedProtocolFamily\n ? `bg-${formattedProtocolFamily}`\n : \"bg-bullish\",\n classNames?.background,\n )}\n />\n )}\n\n {/* if progress is displayed, display the progress track with the protocol family color */}\n {displayProgress && (\n <div className={clsx(\"absolute -inset-0.5\", `rounded-${radius}`)}>\n <ProgressTrack\n className={clsx(\n formattedProtocolFamily\n ? `text-${formattedProtocolFamily}`\n : \"text-bullish\",\n classNames?.progress,\n )}\n progress={token.migrateProgress ?? \"0\"}\n />\n </div>\n )}\n\n {/* avatar fallback border */}\n <div\n className={clsx(\n \"absolute inset-0 p-px flex items-center justify-center\",\n `rounded-${radius}`,\n formattedProtocolFamily\n ? `bg-${formattedProtocolFamily}/20`\n : \"bg-bullish/20\",\n classNames?.avatarWrapper,\n )}\n >\n {/* preview the avatar */}\n <PreviewWrapper\n token={token}\n radius={radius}\n enableSearch={enableSearch}\n enablePreview={enablePreview}\n classNames={classNames}\n >\n {/* this is the gap between border & avatar, should fill with the gray background color */}\n <div\n className={clsx(\n \"relative w-full h-full bg-content1 flex items-center justify-center p-0.5\",\n `rounded-${radius}`,\n // click to search\n isHovered && displaySearch && \"cursor-pointer\",\n )}\n onMouseEnter={handleMouseEnter}\n onMouseLeave={handleMouseLeave}\n >\n {/* avatar */}\n <Avatar\n showFallback\n src={token.image}\n name={fallbackName}\n className={clsx(\n \"w-full h-full bg-content1 text-neutral text-2xl\",\n `rounded-${radius}`,\n classNames?.avatar,\n )}\n />\n\n {/* hover to search mask */}\n {isHovered && displaySearch && (\n <div\n className={clsx(\n \"absolute inset-0 bg-content1/80 flex items-center justify-center\",\n `rounded-${radius}`,\n classNames?.searchWrapper,\n )}\n onClick={handleSearch}\n >\n <CameraIcon\n className={clsx(\"w-6 h-6\", classNames?.searchIcon)}\n />\n </div>\n )}\n </div>\n </PreviewWrapper>\n </div>\n\n {/* protocol family icon */}\n {displayProtocolFamily && (\n <div className=\"contents\">\n <StyledTooltip\n content={\n token.launchedFrom?.protocolFamily ?? formattedProtocolFamily\n }\n placement=\"bottom\"\n closeDelay={0}\n >\n <div\n className={clsx(\n \"absolute -bottom-1 -right-1 rounded-full p-px w-4 h-4\",\n `bg-${formattedProtocolFamily}`,\n classNames?.protocolFamilyIconWrapper,\n )}\n >\n <Image\n removeWrapper\n src={`/images/protocols/${formattedProtocolFamily}.svg`}\n className={clsx(\n \"w-full h-full rounded-full bg-content1\",\n classNames?.protocolFamilyIcon,\n )}\n />\n </div>\n </StyledTooltip>\n </div>\n )}\n </div>\n );\n}\n\nfunction PreviewWrapper({\n token,\n radius,\n enableSearch,\n enablePreview,\n classNames,\n children,\n}: PropsWithChildren<\n Pick<\n TokenAvatarProps,\n \"token\" | \"radius\" | \"enableSearch\" | \"enablePreview\" | \"classNames\"\n >\n>) {\n const displayPreview = useMemo(\n () => enablePreview && token.image,\n [enablePreview, token.image],\n );\n\n return displayPreview ? (\n <StyledTooltip\n content={\n <Preview\n token={token}\n radius={radius}\n enableSearch={enableSearch}\n classNames={classNames}\n />\n }\n closeDelay={100}\n placement=\"bottom-start\"\n classNames={{ content: \"p-1\" }}\n >\n {children}\n </StyledTooltip>\n ) : (\n children\n );\n}\n\nfunction Preview({\n token,\n enableSearch,\n radius,\n classNames,\n}: Pick<TokenAvatarProps, \"token\" | \"radius\" | \"enableSearch\" | \"classNames\">) {\n const displaySearch = useMemo(\n () => enableSearch && token.image,\n [enableSearch, token.image],\n );\n\n const fallbackName = useMemo(\n () =>\n (token.symbol ?? token.name ?? token.address ?? \"L\")\n .slice(0, 1)\n .toUpperCase(),\n [token.symbol, token.name, token.address],\n );\n\n const [isHovered, setIsHovered] = useState(false);\n\n const handleMouseEnter = useCallback(() => {\n setIsHovered(true);\n }, []);\n\n const handleMouseLeave = useCallback(() => {\n setIsHovered(false);\n }, []);\n\n // TODO use router adapter\n const handleSearch = useCallback(\n (e: MouseEvent<HTMLDivElement>) => {\n e.stopPropagation();\n if (!token.image) return;\n const url = searchImageUrl(token.image);\n window.open(url, \"_blank\");\n },\n [token.image],\n );\n\n return (\n <div\n className={clsx(\n \"relative flex items-center justify-center w-60 h-60\",\n `rounded-${radius}`,\n isHovered && displaySearch && \"cursor-pointer\",\n classNames?.previewWrapper,\n )}\n onMouseEnter={handleMouseEnter}\n onMouseLeave={handleMouseLeave}\n >\n <Avatar\n showFallback\n src={token.image}\n name={fallbackName}\n className={clsx(\n \"w-full h-full bg-content1 text-neutral text-3xl\",\n `rounded-${radius}`,\n classNames?.previewAvatar,\n )}\n />\n\n {/* hover to search mask */}\n {isHovered && displaySearch && (\n <div\n className={clsx(\n \"absolute inset-0 bg-content1/80 flex items-center justify-center\",\n `rounded-${radius}`,\n classNames?.previewSearchWrapper,\n )}\n onClick={handleSearch}\n >\n <CameraIcon\n className={clsx(\"w-10 h-10\", classNames?.previewSearchIcon)}\n />\n </div>\n )}\n </div>\n );\n}\n\nfunction ProgressTrack({\n progress,\n className,\n}: {\n progress: string | number;\n className?: string;\n}) {\n const strokeDashoffset = useMemo(\n () => 296 - (Number(progress) * 296) / 100,\n [progress],\n );\n return (\n <svg viewBox=\"0 0 78 78\" className=\"w-full h-full\">\n <path\n className={`${className} opacity-40`}\n stroke=\"currentColor\"\n fill=\"transparent\"\n strokeWidth=\"1\"\n d=\"\n M 76 76\n L 6 76\n Q 2 76 2 72\n L 2 6\n Q 2 2 6 2\n L 72 2\n Q 76 2 76 6\n L 76 72\n Q 76 76 76 76\n \"\n ></path>\n <path\n className={`${className} transition-all duration-300 ease-in-out`}\n stroke=\"currentColor\"\n fill=\"transparent\"\n strokeWidth=\"1\"\n strokeLinecap=\"round\"\n strokeDasharray=\"296\"\n strokeDashoffset={strokeDashoffset}\n d=\"\n M 76 76\n L 6 76\n Q 2 76 2 72\n L 2 6\n Q 2 2 6 2\n L 72 2\n Q 76 2 76 6\n L 76 72\n Q 76 76 76 76\n \"\n ></path>\n </svg>\n );\n}\n","import { useCallback, useEffect, useState } from \"react\";\nimport { useTranslation } from \"@liberfi.io/i18n\";\nimport { clsx, StyledInput } from \"@liberfi.io/ui\";\n\nexport interface TokenListKeywordsFilterProps {\n /** default keywords */\n keywords?: Array<string>;\n /** default exclude keywords */\n excludeKeywords?: Array<string>;\n /** callback when keywords change */\n onKeywordsChange?: (keywords?: Array<string>) => void;\n /** callback when exclude keywords change */\n onExcludeKeywordsChange?: (excludeKeywords?: Array<string>) => void;\n /** custom class name */\n className?: string;\n}\n\nexport function TokenListKeywordsFilter({\n keywords,\n excludeKeywords,\n onKeywordsChange,\n onExcludeKeywordsChange,\n className,\n}: TokenListKeywordsFilterProps) {\n const { t } = useTranslation();\n\n const [keywordsText, setKeywordsText] = useState(keywords?.join(\", \") ?? \"\");\n\n const [excludeKeywordsText, setExcludeKeywordsText] = useState(\n excludeKeywords?.join(\", \") ?? \"\",\n );\n\n useEffect(() => {\n setKeywordsText((prev) => {\n const prevKeywords = parseKeywords(prev);\n if (prevKeywords === undefined && keywords === undefined) {\n return prev;\n } else if (prevKeywords === undefined) {\n return keywords?.join(\", \") ?? \"\";\n } else if (keywords === undefined) {\n return \"\";\n } else if (prevKeywords.join(\"\") === keywords.join(\"\")) {\n return prev;\n } else {\n return keywords.join(\", \");\n }\n });\n }, [keywords]);\n\n useEffect(() => {\n setExcludeKeywordsText((prev) => {\n const prevExcludeKeywords = parseKeywords(prev);\n if (prevExcludeKeywords === undefined && excludeKeywords === undefined) {\n return prev;\n } else if (prevExcludeKeywords === undefined) {\n return excludeKeywords?.join(\", \") ?? \"\";\n } else if (excludeKeywords === undefined) {\n return \"\";\n } else if (prevExcludeKeywords.join(\"\") === excludeKeywords.join(\"\")) {\n return prev;\n } else {\n return excludeKeywords.join(\", \");\n }\n });\n }, [excludeKeywords]);\n\n const handleKeywordsValueChange = useCallback(\n (value: string) => {\n setKeywordsText(value);\n onKeywordsChange?.(parseKeywords(value));\n },\n [onKeywordsChange],\n );\n\n const handleExcludeKeywordsValueChange = useCallback(\n (value: string) => {\n setExcludeKeywordsText(value);\n onExcludeKeywordsChange?.(parseKeywords(value));\n },\n [onExcludeKeywordsChange],\n );\n\n return (\n <div className={clsx(\"grid grid-cols-2 gap-3 px-4\", className)}>\n <div className=\"flex flex-col gap-3\">\n <h3 className=\"text-xs text-neutral\">\n {t(\"tokens.filters.keywords.title\")}\n </h3>\n <StyledInput\n variant=\"bordered\"\n radius=\"lg\"\n size=\"sm\"\n placeholder={t(\"tokens.filters.keywords.placeholder\")}\n value={keywordsText}\n onValueChange={handleKeywordsValueChange}\n />\n </div>\n <div className=\"flex flex-col gap-3\">\n <h3 className=\"text-xs text-neutral\">\n {t(\"tokens.filters.keywords.exclude.title\")}\n </h3>\n <StyledInput\n variant=\"bordered\"\n radius=\"lg\"\n size=\"sm\"\n placeholder={t(\"tokens.filters.keywords.placeholder\")}\n value={excludeKeywordsText}\n onValueChange={handleExcludeKeywordsValueChange}\n />\n </div>\n </div>\n );\n}\n\nfunction parseKeywords(keywords: string): Array<string> | undefined {\n const parsedKeywords = keywords\n .split(\",\")\n .map((v) => v.trim())\n .filter(Boolean);\n return parsedKeywords.length > 0 ? parsedKeywords : undefined;\n}\n","import { useCallback, useEffect, useMemo, useState } from \"react\";\nimport { useTranslation } from \"@liberfi.io/i18n\";\nimport { TokenProtocol } from \"@liberfi.io/types\";\nimport { clsx, Image, StyledButton } from \"@liberfi.io/ui\";\nimport { formatTokenProtocolName } from \"@liberfi.io/utils\";\n\nexport interface TokenListProtocolFilterProps {\n /** protocol filter options */\n protocols: Array<TokenProtocol>;\n /** selected protocols */\n selectedProtocols?: Array<TokenProtocol>;\n /** callback when selected protocols change */\n onSelectedProtocolsChange?: (protocols: Array<TokenProtocol>) => void;\n /** custom class name */\n className?: string;\n}\n\nexport function TokenListProtocolFilter({\n protocols,\n selectedProtocols = [],\n onSelectedProtocolsChange,\n className,\n}: TokenListProtocolFilterProps) {\n const { t } = useTranslation();\n\n // current selections\n const [selected, setSelected] =\n useState<Array<TokenProtocol>>(selectedProtocols);\n\n useEffect(() => {\n setSelected(selectedProtocols);\n }, [selectedProtocols]);\n\n const isAllSelected = useMemo(\n () => protocols.every((protocol) => selected.includes(protocol)),\n [protocols, selected],\n );\n\n const handleSelectAll = useCallback(() => {\n if (isAllSelected) {\n const selected = [] as Array<TokenProtocol>;\n setSelected(selected);\n onSelectedProtocolsChange?.(selected);\n } else {\n const selected = [...protocols];\n setSelected(selected);\n onSelectedProtocolsChange?.(selected);\n }\n }, [protocols, onSelectedProtocolsChange, isAllSelected]);\n\n const handleSelect = useCallback(\n (protocol: TokenProtocol) => () => {\n if (selected.includes(protocol)) {\n const newSelected = selected.filter((p) => p !== protocol);\n setSelected(newSelected);\n onSelectedProtocolsChange?.(newSelected);\n } else {\n const newSelected = [...selected, protocol];\n setSelected(newSelected);\n onSelectedProtocolsChange?.(newSelected);\n }\n },\n [selected, onSelectedProtocolsChange],\n );\n\n return (\n <div className={clsx(\"flex flex-col gap-3 px-4\", className)}>\n {/* header */}\n <div className=\"flex justify-between items-center\">\n {/* title */}\n <h3 className=\"text-xs text-neutral\">\n {t(\"tokens.filters.protocols.title\")}\n </h3>\n {/* select all */}\n <StyledButton\n variant=\"light\"\n color=\"content3\"\n size=\"xs\"\n radius=\"full\"\n onPress={handleSelectAll}\n >\n {isAllSelected\n ? t(\"tokens.filters.protocols.unselectAll\")\n : t(\"tokens.filters.protocols.selectAll\")}\n </StyledButton>\n </div>\n\n {/* options */}\n <div className=\"grid grid-cols-3 gap-3\">\n {protocols.map((protocol) => (\n <StyledButton\n key={protocol}\n variant=\"bordered\"\n size=\"xs\"\n radius=\"full\"\n className={clsx(\n \"w-fit\",\n `text-${protocol}`,\n `bg-${protocol}/5`,\n `border border-${protocol}`,\n { \"opacity-40\": !selected.includes(protocol) },\n )}\n startContent={\n <Image\n width={14}\n height={14}\n src={`/images/protocols/${protocol}.svg`}\n alt={formatTokenProtocolName(protocol)}\n />\n }\n onPress={handleSelect(protocol)}\n >\n {formatTokenProtocolName(protocol)}\n </StyledButton>\n ))}\n </div>\n </div>\n );\n}\n","import { useCallback, useEffect, useState } from \"react\";\nimport { useTranslation } from \"@liberfi.io/i18n\";\nimport { API } from \"@liberfi.io/types\";\nimport { StyledNumberInput } from \"@liberfi.io/ui\";\n\nexport interface TokenListMinMaxFilterProps {\n field: API.TokenFieldOption;\n value?: API.TokenFilterOption;\n onChange?: (value?: API.TokenFilterOption) => void;\n title?: string;\n}\n\nexport function TokenListMinMaxFilter({\n title,\n field,\n value,\n onChange,\n}: TokenListMinMaxFilterProps) {\n const { t } = useTranslation();\n\n const [min, setMin] = useState<number>(value ? parseValue(value).min : NaN);\n\n const [max, setMax] = useState<number>(value ? parseValue(value).max : NaN);\n\n useEffect(() => {\n if (value === undefined) {\n setMin(NaN);\n setMax(NaN);\n } else {\n const { min, max } = parseValue(value);\n setMin(min);\n setMax(max);\n }\n }, [value]);\n\n const handleMinChange = useCallback(\n (value: number) => {\n setMin(value);\n onChange?.(formatValue(field, value, max));\n },\n [field, onChange, max],\n );\n\n const handleMaxChange = useCallback(\n (value: number) => {\n setMax(value);\n onChange?.(formatValue(field, min, value));\n },\n [field, onChange, min],\n );\n\n return (\n <div className=\"flex flex-col gap-1\">\n {title && <h3 className=\"text-xs text-neutral\">{title}</h3>}\n <div className=\"grid grid-cols-2 gap-3\">\n <StyledNumberInput\n value={min}\n onValueChange={handleMinChange}\n variant=\"bordered\"\n radius=\"lg\"\n size=\"sm\"\n placeholder={t(\"tokens.filters.stats.min\")}\n aria-label={`${title} min`}\n />\n <StyledNumberInput\n value={max}\n onValueChange={handleMaxChange}\n variant=\"bordered\"\n radius=\"lg\"\n size=\"sm\"\n placeholder={t(\"tokens.filters.stats.max\")}\n aria-label={`${title} max`}\n />\n </div>\n </div>\n );\n}\n\nfunction parseValue(value: API.TokenFilterOption) {\n if (value.operator === \"between\") {\n const [min, max] = value.value as [number, number];\n return { min, max };\n }\n if (value.operator === \"gte\") {\n const min = value.value as number;\n return { min, max: NaN };\n }\n if (value.operator === \"lte\") {\n const max = value.value as number;\n return { min: NaN, max };\n }\n return { min: NaN, max: NaN };\n}\n\nfunction formatValue(\n field: API.TokenFieldOption,\n min: number,\n max: number,\n): API.TokenFilterOption | undefined {\n if (isNaN(min) && isNaN(max)) {\n return undefined;\n }\n if (isNaN(min)) {\n return { field, operator: \"lte\", value: max };\n }\n if (isNaN(max)) {\n return { field, operator: \"gte\", value: min };\n }\n return { field, operator: \"between\", value: [min, max] };\n}\n","import { useCallback, useEffect, useState } from \"react\";\nimport { useTranslation } from \"@liberfi.io/i18n\";\nimport { API } from \"@liberfi.io/types\";\nimport { clsx } from \"@liberfi.io/ui\";\nimport { TokenListMinMaxFilter } from \"./token-list-minmax-filter.ui\";\n\nexport interface TokenListAuditsFilterProps {\n /** default values */\n values?: Array<API.TokenFilterOption>;\n /** callback when values change */\n onValuesChange?: (values?: Array<API.TokenFilterOption>) => void;\n /** custom class name */\n className?: string;\n}\n\nexport function TokenListAuditsFilter({\n values,\n onValuesChange,\n className,\n}: TokenListAuditsFilterProps) {\n const { t } = useTranslation();\n\n const [currentValues, setCurrentValues] = useState<\n Array<API.TokenFilterOption> | undefined\n >(values);\n\n useEffect(() => {\n setCurrentValues(values);\n }, [values]);\n\n const handleValueChange = useCallback(\n (field: API.TokenFieldOption) => (value?: API.TokenFilterOption) => {\n if (value === undefined) {\n // remove filter\n let newValues: Array<API.TokenFilterOption> | undefined = (\n currentValues ?? []\n ).filter((v) => v.field !== field);\n newValues = newValues.length > 0 ? newValues : undefined;\n setCurrentValues(newValues);\n onValuesChange?.(newValues);\n } else {\n // add or replace filter\n const newValues = [\n ...(currentValues ?? []).filter((v) => v.field !== field),\n value,\n ];\n setCurrentValues(newValues);\n onValuesChange?.(newValues);\n }\n },\n [currentValues, onValuesChange],\n );\n\n return (\n <div className={clsx(\"flex flex-col gap-4\", className)}>\n <TokenListMinMaxFilter\n field=\"holders\"\n title={t(\"tokens.filters.stats.audits.holders\")}\n value={currentValues?.find((v) => v.field === \"holders\")}\n onChange={handleValueChange(\"holders\")}\n />\n <TokenListMinMaxFilter\n field=\"top10Ratio\"\n title={t(\"tokens.filters.stats.audits.top10HoldingsRatio\")}\n value={currentValues?.find((v) => v.field === \"top10Ratio\")}\n onChange={handleValueChange(\"top10Ratio\")}\n />\n <TokenListMinMaxFilter\n field=\"top100Ratio\"\n title={t(\"tokens.filters.stats.audits.top100HoldingsRatio\")}\n value={currentValues?.find((v) => v.field === \"top100Ratio\")}\n onChange={handleValueChange(\"top100Ratio\")}\n />\n <TokenListMinMaxFilter\n field=\"creatorsRatio\"\n title={t(\"tokens.filters.stats.audits.devHoldingsRatio\")}\n value={currentValues?.find((v) => v.field === \"creatorsRatio\")}\n onChange={handleValueChange(\"creatorsRatio\")}\n />\n </div>\n );\n}\n","import { useCallback, useEffect, useState } from \"react\";\nimport { useTranslation } from \"@liberfi.io/i18n\";\nimport { API } from \"@liberfi.io/types\";\nimport { clsx } from \"@liberfi.io/ui\";\nimport { TokenListResolution } from \"../types\";\nimport { TokenListMinMaxFilter } from \"./token-list-minmax-filter.ui\";\n\nexport interface TokenListMetricsFilterProps {\n /** current resolution */\n resolution: TokenListResolution;\n /** default values */\n values?: Array<API.TokenFilterOption>;\n /** callback when values change */\n onValuesChange?: (values?: Array<API.TokenFilterOption>) => void;\n /** custom class name */\n className?: string;\n}\n\nexport function TokenListMetricsFilter({\n resolution,\n values,\n onValuesChange,\n className,\n}: TokenListMetricsFilterProps) {\n const { t } = useTranslation();\n\n const [currentValues, setCurrentValues] = useState<\n Array<API.TokenFilterOption> | undefined\n >(values);\n\n useEffect(() => {\n setCurrentValues(values);\n }, [values]);\n\n const handleValueChange = useCallback(\n (field: API.TokenFieldOption) => (value?: API.TokenFilterOption) => {\n if (value === undefined) {\n // remove filter\n let newValues: Array<API.TokenFilterOption> | undefined = (\n currentValues ?? []\n ).filter((v) => v.field !== field);\n newValues = newValues.length > 0 ? newValues : undefined;\n setCurrentValues(newValues);\n onValuesChange?.(newValues);\n } else {\n // add or replace filter\n const newValues = [\n ...(currentValues ?? []).filter((v) => v.field !== field),\n value,\n ];\n setCurrentValues(newValues);\n onValuesChange?.(newValues);\n }\n },\n [currentValues, onValuesChange],\n );\n\n return (\n <div className={clsx(\"flex flex-col gap-4\", className)}>\n <TokenListMinMaxFilter\n field=\"marketCap\"\n title={t(\"tokens.filters.stats.metrics.marketCap\")}\n value={currentValues?.find((v) => v.field === \"marketCap\")}\n onChange={handleValueChange(\"marketCap\")}\n />\n <TokenListMinMaxFilter\n field=\"tvl\"\n title={t(\"tokens.filters.stats.metrics.liquidity\")}\n value={currentValues?.find((v) => v.field === \"tvl\")}\n onChange={handleValueChange(\"tvl\")}\n />\n <TokenListMinMaxFilter\n field={`volumes${resolution}`}\n title={t(\"tokens.filters.stats.metrics.volumes\", {\n resolution: t(`common.resolution.${resolution}`),\n })}\n value={currentValues?.find((v) => v.field === `volumes${resolution}`)}\n onChange={handleValueChange(`volumes${resolution}`)}\n />\n <TokenListMinMaxFilter\n field={`trades${resolution}`}\n title={t(\"tokens.filters.stats.metrics.txns\", {\n resolution: t(`common.resolution.${resolution}`),\n })}\n value={currentValues?.find((v) => v.field === `trades${resolution}`)}\n onChange={handleValueChange(`trades${resolution}`)}\n />\n </div>\n );\n}\n","import { Key, useCallback, useEffect, useMemo, useState } from \"react\";\nimport { useTranslation } from \"@liberfi.io/i18n\";\nimport { API } from \"@liberfi.io/types\";\nimport { clsx, StyledBadge, StyledTabs, Tab } from \"@liberfi.io/ui\";\nimport { TokenListResolution } from \"../types\";\nimport { TokenListAuditsFilter } from \"./token-list-audits-filter.ui\";\nimport { TokenListMetricsFilter } from \"./token-list-metrics-filter.ui\";\n\nexport interface TokenListStatsFilterProps {\n /** current resolution */\n resolution: TokenListResolution;\n /** default values */\n values?: Array<API.TokenFilterOption>;\n /** callback when values change */\n onValuesChange?: (values?: Array<API.TokenFilterOption>) => void;\n /** custom class name */\n className?: string;\n}\n\nexport function TokenListStatsFilter({\n resolution,\n values,\n onValuesChange,\n className,\n}: TokenListStatsFilterProps) {\n const { t } = useTranslation();\n\n const [curTab, setCurTab] = useState<\"audits\" | \"metrics\">(\"audits\");\n\n const [currentValues, setCurrentValues] = useState<\n Array<API.TokenFilterOption> | undefined\n >(values);\n\n useEffect(() => {\n setCurrentValues(values);\n }, [values]);\n\n const handleValuesChange = useCallback(\n (values?: Array<API.TokenFilterOption>) => {\n setCurrentValues(values);\n onValuesChange?.(values);\n },\n [onValuesChange],\n );\n\n const auditsFiltersCount = useMemo(() => {\n const fields = [\"holders\", \"top10Ratio\", \"top100Ratio\", \"creatorsRatio\"];\n return currentValues?.filter((v) => fields.includes(v.field))?.length ?? 0;\n }, [currentValues]);\n\n const metricsFiltersCount = useMemo(() => {\n const fields = [\n \"marketCap\",\n \"tvl\",\n `volumes${resolution}`,\n `trades${resolution}`,\n ];\n return currentValues?.filter((v) => fields.includes(v.field)).length ?? 0;\n }, [currentValues, resolution]);\n\n return (\n <div className={clsx(\"flex flex-col gap-3 px-4\", className)}>\n <StyledTabs\n variant=\"light\"\n radius=\"full\"\n size=\"sm\"\n selectedKey={curTab}\n onSelectionChange={setCurTab as (key: Key) => void}\n >\n <Tab\n key=\"audits\"\n title={\n auditsFiltersCount === 0 ? (\n t(\"tokens.filters.stats.audits\")\n ) : (\n <StyledBadge\n color=\"primary\"\n size=\"sm\"\n content={auditsFiltersCount}\n shape=\"circle\"\n >\n {t(\"tokens.filters.stats.audits\")}\n </StyledBadge>\n )\n }\n />\n <Tab\n key=\"metrics\"\n title={\n metricsFiltersCount === 0 ? (\n t(\"tokens.filters.stats.metrics\")\n ) : (\n <StyledBadge\n color=\"primary\"\n size=\"sm\"\n content={metricsFiltersCount}\n shape=\"circle\"\n >\n {t(\"tokens.filters.stats.metrics\")}\n </StyledBadge>\n )\n }\n />\n </StyledTabs>\n\n <TokenListAuditsFilter\n values={currentValues}\n onValuesChange={handleValuesChange}\n className={clsx({ hidden: curTab !== \"audits\" })}\n />\n <TokenListMetricsFilter\n values={currentValues}\n onValuesChange={handleValuesChange}\n resolution={resolution}\n className={clsx({ hidden: curTab !== \"metrics\" })}\n />\n </div>\n );\n}\n","import { useCallback, useEffect, useState } from \"react\";\nimport { API, TokenProtocol } from \"@liberfi.io/types\";\nimport { clsx, StyledDivider } from \"@liberfi.io/ui\";\nimport {\n TokenListKeywordsFilter,\n TokenListProtocolFilter,\n TokenListStatsFilter,\n} from \"./filters\";\nimport { TokenListResolution } from \"./types\";\n\nexport type TokenListFiltersType = Pick<\n API.GetTokenListOptions,\n \"filters\" | \"keywords\" | \"excludeKeywords\"\n>;\n\nexport interface TokenListFilterProps {\n /** protocol filter options */\n protocols?: Array<TokenProtocol>;\n /** current resolution */\n resolution: TokenListResolution;\n /** filters */\n filters?: TokenListFiltersType;\n /** callback when filters change */\n onFiltersChange?: (filters?: TokenListFiltersType) => void;\n /** custom class name */\n className?: string;\n}\n\nexport function TokenListFilter({\n protocols,\n resolution,\n filters,\n onFiltersChange,\n className,\n}: TokenListFilterProps) {\n const [selectedProtocols, setSelectedProtocols] = useState<\n Array<TokenProtocol>\n >(parseSelectedProtocols(filters?.filters, protocols));\n\n useEffect(() => {\n setSelectedProtocols(parseSelectedProtocols(filters?.filters, protocols));\n }, [filters?.filters, protocols]);\n\n const [searchKeywords, setSearchKeywords] = useState<\n Array<string> | undefined\n >(filters?.keywords);\n\n useEffect(() => {\n setSearchKeywords(filters?.keywords);\n }, [filters?.keywords]);\n\n const [excludeSearchKeywords, setExcludeSearchKeywords] = useState<\n Array<string> | undefined\n >(filters?.excludeKeywords);\n\n useEffect(() => {\n setExcludeSearchKeywords(filters?.excludeKeywords);\n }, [filters?.excludeKeywords]);\n\n const [filterValues, setFilterValues] = useState<\n Array<API.TokenFilterOption> | undefined\n >(filters?.filters);\n\n useEffect(() => {\n setFilterValues(filters?.filters);\n }, [filters?.filters]);\n\n const handleProtocolsChange = useCallback(\n (values: Array<TokenProtocol>) => {\n setSelectedProtocols(values);\n onFiltersChange?.(\n toFilters(\n protocols,\n values,\n searchKeywords,\n excludeSearchKeywords,\n filterValues,\n ),\n );\n },\n [\n protocols,\n searchKeywords,\n excludeSearchKeywords,\n filterValues,\n onFiltersChange,\n ],\n );\n\n const handleKeywordsChange = useCallback(\n (values?: Array<string>) => {\n setSearchKeywords(values);\n onFiltersChange?.(\n toFilters(\n protocols,\n selectedProtocols,\n values,\n excludeSearchKeywords,\n filterValues,\n ),\n );\n },\n [\n protocols,\n selectedProtocols,\n excludeSearchKeywords,\n filterValues,\n onFiltersChange,\n ],\n );\n\n const handleExcludeKeywordsChange = useCallback(\n (values?: Array<string>) => {\n setExcludeSearchKeywords(values);\n onFiltersChange?.(\n toFilters(\n protocols,\n selectedProtocols,\n searchKeywords,\n values,\n filterValues,\n ),\n );\n },\n [\n protocols,\n selectedProtocols,\n searchKeywords,\n filterValues,\n onFiltersChange,\n ],\n );\n\n const handleFilterValuesChange = useCallback(\n (values?: Array<API.TokenFilterOption>) => {\n setFilterValues(values);\n onFiltersChange?.(\n toFilters(\n protocols,\n selectedProtocols,\n searchKeywords,\n excludeSearchKeywords,\n values,\n ),\n );\n },\n [\n protocols,\n selectedProtocols,\n searchKeywords,\n excludeSearchKeywords,\n onFiltersChange,\n ],\n );\n\n return (\n <div className={clsx(\"flex flex-col gap-4\", className)}>\n {/* filter by protocols */}\n {protocols && protocols.length > 0 && (\n <>\n <TokenListProtocolFilter\n protocols={protocols}\n selectedProtocols={selectedProtocols}\n onSelectedProtocolsChange={handleProtocolsChange}\n />\n <StyledDivider />\n </>\n )}\n\n {/* search keywords */}\n <TokenListKeywordsFilter\n keywords={searchKeywords}\n excludeKeywords={excludeSearchKeywords}\n onKeywordsChange={handleKeywordsChange}\n onExcludeKeywordsChange={handleExcludeKeywordsChange}\n />\n <StyledDivider />\n\n {/* filter by values */}\n <TokenListStatsFilter\n resolution={resolution}\n values={filterValues}\n onValuesChange={handleFilterValuesChange}\n />\n </div>\n );\n}\n\nfunction parseSelectedProtocols(\n filters?: Array<API.TokenFilterOption>,\n protocols?: Array<TokenProtocol>,\n): Array<TokenProtocol> {\n const filter = filters?.find(\n (it) => it.field === \"launchedFromProtocolFamily\",\n );\n if (!filter) {\n // select all protocols default\n return [...(protocols || [])];\n }\n if (filter.operator === \"in\") {\n return filter.value as Array<TokenProtocol>;\n }\n console.warn(\"invalid token protocols filter\", filter);\n return [...(protocols || [])];\n}\n\nfunction toFilters(\n protocols: Array<TokenProtocol> | undefined,\n selectedProtocols: Array<TokenProtocol>,\n keywords: Array<string> | undefined,\n excludeKeywords: Array<string> | undefined,\n filterValues: Array<API.TokenFilterOption> | undefined,\n): TokenListFiltersType | undefined {\n const filters = filterValues\n ? [\n ...filterValues.filter(\n (it) => it.field !== \"launchedFromProtocolFamily\",\n ),\n ]\n : [];\n\n if (protocols && protocols.length > 0) {\n const allProtocolsSelected = protocols.every((protocol) =>\n selectedProtocols.includes(protocol),\n );\n if (!allProtocolsSelected) {\n filters.push({\n field: \"launchedFromProtocolFamily\",\n operator: \"in\",\n value: selectedProtocols,\n });\n }\n }\n\n return keywords === undefined &&\n excludeKeywords === undefined &&\n filters.length === 0\n ? undefined\n : {\n keywords,\n excludeKeywords,\n filters: filters.length > 0 ? filters : undefined,\n };\n}\n","import { useCallback, useEffect, useMemo, useState } from \"react\";\nimport { useTranslation } from \"@liberfi.io/i18n\";\nimport {\n ChevronDownIcon,\n FilterIcon,\n ModalBody,\n ModalContent,\n ModalFooter,\n ModalHeader,\n RefreshIcon,\n ScrollShadow,\n StyledBadge,\n StyledButton,\n StyledModal,\n useDisclosure,\n} from \"@liberfi.io/ui\";\nimport {\n TokenListFilter,\n TokenListFilterProps,\n TokenListFiltersType,\n} from \"./token-list-filter.ui\";\n\nexport type TokenListFilterModalProps = Pick<\n TokenListFilterProps,\n \"protocols\" | \"resolution\" | \"filters\" | \"onFiltersChange\"\n>;\n\nexport function TokenListFilterModal({\n protocols,\n resolution,\n filters,\n onFiltersChange,\n}: TokenListFilterModalProps) {\n const { t } = useTranslation();\n\n const { isOpen, onOpen, onClose, onOpenChange } = useDisclosure();\n\n const [editingFilters, setEditingFilters] = useState<\n TokenListFiltersType | undefined\n >(filters);\n\n const handleReset = useCallback(() => {\n setEditingFilters(undefined);\n }, []);\n\n const handleApply = useCallback(() => {\n onFiltersChange?.(editingFilters);\n onClose();\n }, [editingFilters, onFiltersChange, onClose]);\n\n useEffect(() => {\n setEditingFilters(filters);\n }, [isOpen, filters]);\n\n const isEmptyFilters = useMemo(() => {\n return Object.values(filters || {}).every((value) => value === undefined);\n }, [filters]);\n\n return (\n <>\n <StyledButton\n color=\"content2\"\n size=\"sm\"\n radius=\"full\"\n className=\"font-bold text-sm\"\n startContent={\n isEmptyFilters ? (\n <FilterIcon width={16} height={16} />\n ) : (\n <StyledBadge color=\"primary\" size=\"sm\" content=\"\" shape=\"circle\">\n <FilterIcon width={16} height={16} />\n </StyledBadge>\n )\n }\n endContent={\n <ChevronDownIcon\n width={16}\n height={16}\n className=\"data-[open=true]:-rotate-180 transition-transform\"\n data-open={isOpen}\n />\n }\n onPress={onOpen}\n >\n {t(\"tokens.listHeader.filter\")}\n </StyledButton>\n <StyledModal\n isOpen={isOpen}\n onOpenChange={onOpenChange}\n size=\"md\"\n scrollBehavior=\"inside\"\n >\n <ModalContent>\n <ModalHeader>{t(\"tokens.filters.modal.title\")}</ModalHeader>\n <ModalBody>\n <ScrollShadow>\n <TokenListFilter\n protocols={protocols}\n resolution={resolution}\n filters={editingFilters}\n onFiltersChange={setEditingFilters}\n className=\"pb-4\"\n />\n </ScrollShadow>\n </ModalBody>\n <ModalFooter>\n <div className=\"w-full px-4 flex justify-between items-center\">\n <StyledButton\n color=\"transparent\"\n size=\"xs\"\n radius=\"full\"\n startContent={<RefreshIcon width={16} height={16} />}\n onPress={handleReset}\n >\n {t(\"common.reset\")}\n </StyledButton>\n <StyledButton\n color=\"primary\"\n size=\"sm\"\n radius=\"full\"\n onPress={handleApply}\n >\n {t(\"common.apply\")}\n </StyledButton>\n </div>\n </ModalFooter>\n </ModalContent>\n </StyledModal>\n </>\n );\n}\n","import { useCallback, useEffect, useMemo, useState } from \"react\";\nimport { useTranslation } from \"@liberfi.io/i18n\";\nimport {\n ChevronDownIcon,\n FilterIcon,\n PopoverContent,\n PopoverProps,\n PopoverTrigger,\n RefreshIcon,\n ScrollShadow,\n StyledBadge,\n StyledButton,\n StyledDivider,\n StyledPopover,\n useDisclosure,\n} from \"@liberfi.io/ui\";\nimport {\n TokenListFilter,\n TokenListFilterProps,\n TokenListFiltersType,\n} from \"./token-list-filter.ui\";\n\nexport type TokenListFilterPopoverProps = Pick<PopoverProps, \"placement\"> &\n Pick<\n TokenListFilterProps,\n \"protocols\" | \"resolution\" | \"filters\" | \"onFiltersChange\"\n >;\n\nexport function TokenListFilterPopover({\n protocols,\n resolution,\n filters,\n onFiltersChange,\n ...popoverProps\n}: TokenListFilterPopoverProps) {\n const { t } = useTranslation();\n\n const { isOpen, onClose, onOpenChange } = useDisclosure();\n\n const [editingFilters, setEditingFilters] = useState<\n TokenListFiltersType | undefined\n >(filters);\n\n const handleReset = useCallback(() => {\n setEditingFilters(undefined);\n }, []);\n\n const handleApply = useCallback(() => {\n onFiltersChange?.(editingFilters);\n onClose();\n }, [editingFilters, onFiltersChange, onClose]);\n\n useEffect(() => {\n setEditingFilters(filters);\n }, [isOpen, filters]);\n\n const isEmptyFilters = useMemo(() => {\n return Object.values(filters || {}).every((value) => value === undefined);\n }, [filters]);\n\n return (\n <StyledPopover\n {...popoverProps}\n isOpen={isOpen}\n onOpenChange={onOpenChange}\n >\n <PopoverTrigger>\n <StyledButton\n color=\"content2\"\n size=\"sm\"\n radius=\"full\"\n className=\"font-bold text-sm\"\n startContent={\n isEmptyFilters ? (\n <FilterIcon width={16} height={16} />\n ) : (\n <StyledBadge color=\"primary\" size=\"sm\" content=\"\" shape=\"circle\">\n <FilterIcon width={16} height={16} />\n </StyledBadge>\n )\n }\n endContent={\n <ChevronDownIcon\n width={16}\n height={16}\n className=\"data-[open=true]:-rotate-180 transition-transform\"\n data-open={isOpen}\n />\n }\n >\n {t(\"tokens.listHeader.filter\")}\n </StyledButton>\n </PopoverTrigger>\n <PopoverContent>\n <div className=\"w-md py-4 px-0 flex flex-col gap-4\">\n <ScrollShadow className=\"w-full max-h-120\">\n <TokenListFilter\n protocols={protocols}\n resolution={resolution}\n filters={editingFilters}\n onFiltersChange={setEditingFilters}\n />\n </ScrollShadow>\n <StyledDivider />\n <div className=\"w-full px-4 flex justify-between items-center\">\n <StyledButton\n color=\"transparent\"\n size=\"xs\"\n radius=\"full\"\n startContent={<RefreshIcon width={16} height={16} />}\n onPress={handleReset}\n >\n {t(\"common.reset\")}\n </StyledButton>\n <StyledButton\n color=\"primary\"\n size=\"sm\"\n radius=\"full\"\n onPress={handleApply}\n >\n {t(\"common.apply\")}\n </StyledButton>\n </div>\n </div>\n </PopoverContent>\n </StyledPopover>\n );\n}\n","import { Key, useCallback } from \"react\";\nimport { useTranslation } from \"@liberfi.io/i18n\";\nimport { StyledTabs, Tab } from \"@liberfi.io/ui\";\nimport { TokenListResolution } from \"./types\";\n\nexport interface TokenListResolutionSelectorProps {\n /** current resolution */\n resolution?: TokenListResolution;\n /** callback function when resolution changes */\n onResolutionChange?: (\n resolution: TokenListResolution,\n ) => void | Promise<void>;\n /** resolution options */\n resolutionOptions?: TokenListResolution[];\n}\n\nexport function TokenListResolutionSelector({\n resolution,\n onResolutionChange,\n resolutionOptions = [\"1m\", \"5m\", \"1h\", \"4h\", \"24h\"],\n}: TokenListResolutionSelectorProps) {\n const { t } = useTranslation();\n\n const handleResolutionChange = useCallback(\n (key: Key) => {\n onResolutionChange?.(key as TokenListResolution);\n },\n [onResolutionChange],\n );\n\n return (\n <StyledTabs\n variant=\"radio\"\n radius=\"lg\"\n selectedKey={resolution}\n onSelectionChange={handleResolutionChange}\n aria-label=\"Select Resolution\"\n >\n {resolutionOptions.map((option) => (\n <Tab key={option} title={t(`common.resolution.${option}`)} />\n ))}\n </StyledTabs>\n );\n}\n","import { MouseEvent, useCallback } from \"react\";\nimport { useTickAge } from \"@liberfi.io/hooks\";\nimport { useTranslation } from \"@liberfi.io/i18n\";\nimport {\n CopyIcon,\n DiscordIcon,\n Link,\n SearchIcon,\n TelegramIcon,\n TwitterIcon,\n WebsiteIcon,\n StyledTooltip,\n useCopyToClipboard,\n} from \"@liberfi.io/ui\";\nimport { formatAge, searchTwitterUrl } from \"@liberfi.io/utils\";\nimport { TokenAvatar } from \"../../token-avatar\";\nimport { TokenCellProps } from \"./types\";\n\nexport function TokenCell({ token }: TokenCellProps) {\n const copyToClipboard = useCopyToClipboard();\n\n const { t } = useTranslation();\n\n const handleCopyToClipboard = useCallback(\n (e: MouseEvent<HTMLDivElement>) => {\n e.preventDefault();\n e.stopPropagation();\n copyToClipboard(token.address, t(\"tokens.copied.address\"));\n },\n [copyToClipboard, token.address, t],\n );\n\n const age = useTickAge(token.createdAt);\n\n return (\n <div className=\"w-full flex justify-start items-center gap-3\">\n {/* avatar */}\n <TokenAvatar\n token={token}\n className=\"w-10 h-10 sm:w-16 sm:h-16 flex-none\"\n />\n\n {/* symbol & name & social media ...etc */}\n <div className=\"flex-auto flex flex-col gap-1 min-w-0\">\n {/* symbol & name */}\n <div className=\"flex items-center gap-1\">\n <span className=\"flex-none font-medium tracking-[-0.02em]\">\n {token.symbol}\n </span>\n <StyledTooltip content={token.name} closeDelay={0}>\n <div\n className=\"flex-initial flex items-center gap-1 min-w-0 text-neutral hover:text-primary-200 cursor-pointer\"\n onClick={handleCopyToClipboard}\n >\n <div className=\"flex-initial whitespace-nowrap truncate\">\n {token.name}\n </div>\n <CopyIcon className=\"flex-none w-3 h-3 sm:w-3.5 sm:h-3.5\" />\n </div>\n </StyledTooltip>\n </div>\n\n {/* social medias */}\n <div className=\"flex items-center gap-2\">\n {/* age */}\n <span className=\"text-primary text-xs sm:text-sm font-medium\">\n {formatAge(age)}\n </span>\n {/* website */}\n {token.socialMedias?.website && (\n <Link\n href={token.socialMedias.website}\n className=\"text-neutral hover:text-primary\"\n target=\"_blank\"\n >\n <WebsiteIcon className=\"w-3.5 h-3.5 sm:w-4 sm:h-4\" />\n </Link>\n )}\n {/* twitter */}\n {token.socialMedias?.twitter && (\n <Link\n href={token.socialMedias.twitter}\n className=\"text-neutral hover:text-primary\"\n target=\"_blank\"\n >\n <TwitterIcon className=\"w-3.5 h-3.5 sm:w-4 sm:h-4\" />\n </Link>\n )}\n {/* telegram */}\n {token.socialMedias?.telegram && (\n <Link\n href={token.socialMedias.telegram}\n className=\"text-neutral hover:text-primary\"\n target=\"_blank\"\n >\n <TelegramIcon className=\"w-3.5 h-3.5 sm:w-4 sm:h-4\" />\n </Link>\n )}\n {/* discord */}\n {token.socialMedias?.discord && (\n <Link\n href={token.socialMedias.discord}\n className=\"text-neutral hover:text-primary\"\n target=\"_blank\"\n >\n <DiscordIcon className=\"w-3.5 h-3.5 sm:w-4 sm:h-4\" />\n </Link>\n )}\n {/* search on twitter */}\n <Link\n href={searchTwitterUrl(`${token.symbol} OR ${token.address}`)}\n className=\"text-neutral hover:text-primary\"\n target=\"_blank\"\n >\n <SearchIcon className=\"w-3.5 h-3.5 sm:w-4 sm:h-4\" />\n </Link>\n </div>\n </div>\n </div>\n );\n}\n","import { useMemo } from \"react\";\nimport { useTranslation } from \"@liberfi.io/i18n\";\nimport {\n Chip,\n CookIcon,\n PeopleIcon,\n StyledTooltip,\n UserIcon,\n UserWithStarBadgeIcon,\n} from \"@liberfi.io/ui\";\nimport { formatAmount, formatPercent, SafeBigNumber } from \"@liberfi.io/utils\";\nimport { TokenCellProps } from \"./types\";\n\nexport function TokenInfoCell({ token }: TokenCellProps) {\n const { t } = useTranslation();\n\n const holders = useMemo(\n () => token.marketData?.holders,\n [token.marketData?.holders],\n );\n\n const devHoldingsRatio = useMemo(\n () => token.marketData?.creatorsRatio,\n [token.marketData?.creatorsRatio],\n );\n\n const devHoldingsRatioWarning = useMemo(\n () => new SafeBigNumber(devHoldingsRatio).gte(0.1),\n [devHoldingsRatio],\n );\n\n const top10HoldingsRatio = useMemo(\n () => token.marketData?.top10Ratio,\n [token.marketData?.top10Ratio],\n );\n\n const top10HoldingsRatioWarning = useMemo(\n () => new SafeBigNumber(top10HoldingsRatio).gte(0.1),\n [top10HoldingsRatio],\n );\n\n const top100HoldingsRatio = useMemo(\n () => token.marketData?.top100Ratio,\n [token.marketData?.top100Ratio],\n );\n\n const top100HoldingsRatioWarning = useMemo(\n () => new SafeBigNumber(top100HoldingsRatio).gte(0.1),\n [top100HoldingsRatio],\n );\n\n return (\n <div className=\"w-full h-full flex gap-1 justify-start items-center\">\n {/* column 1 */}\n <div className=\"flex flex-col gap-1 items-start justify-start\">\n {/* Holders */}\n <StyledTooltip content={t(\"tokens.tokenInfo.holders\")} closeDelay={0}>\n <Chip\n className=\"pl-2 pr-1.5 gap-0.5 h-5\"\n startContent={<PeopleIcon width={14} height={14} />}\n variant=\"flat\"\n size=\"sm\"\n color={holders ? \"primary\" : \"default\"}\n >\n {formatAmount(holders)}\n </Chip>\n </StyledTooltip>\n\n {/* Dev holdings */}\n <StyledTooltip\n content={t(\"tokens.tokenInfo.devHoldingsRatio\")}\n closeDelay={0}\n >\n <Chip\n className=\"pl-2 pr-1.5 gap-0.5 h-5\"\n startContent={<CookIcon width={13} height={13} />}\n variant=\"flat\"\n size=\"sm\"\n color={\n devHoldingsRatioWarning\n ? \"danger\"\n : devHoldingsRatio === undefined\n ? \"default\"\n : \"primary\"\n }\n >\n {formatPercent(devHoldingsRatio)}\n </Chip>\n </StyledTooltip>\n </div>\n {/* column 2 */}\n <div className=\"flex flex-col gap-1 items-start justify-start\">\n {/* Top 10 holdings */}\n <StyledTooltip\n content={t(\"tokens.tokenInfo.top10HoldingsRatio\")}\n closeDelay={0}\n >\n <Chip\n className=\"pl-2 pr-1.5 gap-0.5 h-5\"\n startContent={<UserWithStarBadgeIcon width={14} height={14} />}\n variant=\"flat\"\n size=\"sm\"\n color={\n top10HoldingsRatioWarning\n ? \"danger\"\n : top10HoldingsRatio === undefined\n ? \"default\"\n : \"primary\"\n }\n >\n {formatPercent(top10HoldingsRatio)}\n </Chip>\n </StyledTooltip>\n {/* Top 100 holdings */}\n <StyledTooltip\n content={t(\"tokens.tokenInfo.top100HoldingsRatio\")}\n closeDelay={0}\n >\n <Chip\n className=\"pl-2 pr-1.5 gap-0.5 h-5\"\n startContent={<UserIcon width={14} height={14} />}\n variant=\"flat\"\n size=\"sm\"\n color={\n top100HoldingsRatioWarning\n ? \"danger\"\n : top100HoldingsRatio === undefined\n ? \"default\"\n : \"primary\"\n }\n >\n {formatPercent(top100HoldingsRatio)}\n </Chip>\n </StyledTooltip>\n </div>\n </div>\n );\n}\n","import { useMemo } from \"react\";\nimport { formatAmountUSD } from \"@liberfi.io/utils\";\nimport { TokenCellProps } from \"./types\";\n\nexport function TokenLiquidityCell({ token }: TokenCellProps) {\n const liquidity = useMemo(\n () => token.marketData?.tvlInUsd,\n [token.marketData?.tvlInUsd],\n );\n return <>{formatAmountUSD(liquidity)}</>;\n}\n","import { useMemo } from \"react\";\nimport { formatAmountUSD } from \"@liberfi.io/utils\";\nimport { TokenCellProps } from \"./types\";\n\nexport function TokenMarketCapCell({ token }: TokenCellProps) {\n const marketCap = useMemo(\n () => token.marketData?.marketCapInUsd,\n [token.marketData?.marketCapInUsd],\n );\n return <>{formatAmountUSD(marketCap)}</>;\n}\n","import { useMemo } from \"react\";\nimport { clsx, TriangleDownIcon, TriangleUpIcon } from \"@liberfi.io/ui\";\nimport {\n formatPercent,\n formatPriceUSD,\n SafeBigNumber,\n} from \"@liberfi.io/utils\";\nimport { TokenCellProps } from \"./types\";\n\nexport function TokenPriceCell({ token, resolution }: TokenCellProps) {\n const price = useMemo(() => token.marketData?.priceInUsd, [token]);\n\n const priceChange = useMemo(\n () => token.stats?.[resolution]?.priceChange,\n [token, resolution],\n );\n\n const priceChangeAbs = useMemo(\n () =>\n priceChange ? new SafeBigNumber(priceChange).abs().toString() : undefined,\n [priceChange],\n );\n\n const bullish = useMemo(\n () => priceChange && new SafeBigNumber(priceChange).gte(0),\n [priceChange],\n );\n\n return (\n <div className=\"flex flex-col gap-1 justify-center items-start\">\n <span>{formatPriceUSD(price)}</span>\n <span\n className={clsx(\n \"inline-flex gap-1 items-center text-xs\",\n bullish ? \"text-bullish\" : \"text-bearish\",\n )}\n >\n {bullish ? (\n <TriangleUpIcon width={10} height={10} />\n ) : (\n <TriangleDownIcon width={10} height={10} />\n )}\n <span>{formatPercent(priceChangeAbs)}</span>\n </span>\n </div>\n );\n}\n","import { useMemo } from \"react\";\nimport { formatAmount } from \"@liberfi.io/utils\";\nimport { TokenCellProps } from \"./types\";\n\nexport function TokenTradersCell({ token, resolution }: TokenCellProps) {\n const traders = useMemo(\n () => token.stats?.[resolution]?.traders,\n [token.stats?.[resolution]?.traders],\n );\n\n const buyers = useMemo(\n () => token.stats?.[resolution]?.buyers,\n [token.stats?.[resolution]?.buyers],\n );\n\n const sellers = useMemo(\n () => token.stats?.[resolution]?.sellers,\n [token.stats?.[resolution]?.sellers],\n );\n\n return (\n <div className=\"flex flex-col gap-1 justify-center items-start\">\n <span>{formatAmount(traders)}</span>\n <div className=\"flex gap-1 text-xs\">\n <span className=\"text-bullish\">{formatAmount(buyers)}</span>/\n <span className=\"text-bearish\">{formatAmount(sellers)}</span>\n </div>\n </div>\n );\n}\n","import { useMemo } from \"react\";\nimport { formatAmount } from \"@liberfi.io/utils\";\nimport { TokenCellProps } from \"./types\";\n\nexport function TokenTradesCell({ token, resolution }: TokenCellProps) {\n const txs = useMemo(\n () => token.stats?.[resolution]?.trades,\n [token.stats?.[resolution]?.trades],\n );\n\n const buys = useMemo(\n () => token.stats?.[resolution]?.buys,\n [token.stats?.[resolution]?.buys],\n );\n\n const sells = useMemo(\n () => token.stats?.[resolution]?.sells,\n [token.stats?.[resolution]?.sells],\n );\n\n return (\n <div className=\"flex flex-col gap-1 justify-center items-start\">\n <span>{formatAmount(txs)}</span>\n <div className=\"flex gap-1 text-xs\">\n <span className=\"text-bullish\">{formatAmount(buys)}</span>/\n <span className=\"text-bearish\">{formatAmount(sells)}</span>\n </div>\n </div>\n );\n}\n","import { useMemo } from \"react\";\nimport { formatAmountUSD } from \"@liberfi.io/utils\";\nimport { TokenCellProps } from \"./types\";\n\nexport function TokenVolumesCell({ token, resolution }: TokenCellProps) {\n const volumes = useMemo(\n () => token.stats?.[resolution]?.volumesInUsd,\n [token.stats?.[resolution]?.volumesInUsd],\n );\n\n const buyVolumes = useMemo(\n () => token.stats?.[resolution]?.buyVolumesInUsd,\n [token.stats?.[resolution]?.buyVolumesInUsd],\n );\n\n const sellVolumes = useMemo(\n () => token.stats?.[resolution]?.sellVolumesInUsd,\n [token.stats?.[resolution]?.sellVolumesInUsd],\n );\n\n return (\n <div className=\"flex flex-col gap-1 justify-center items-start\">\n <span>{formatAmountUSD(volumes)}</span>\n <div className=\"flex gap-1 text-xs\">\n <span className=\"text-bullish\">{formatAmountUSD(buyVolumes)}</span>/\n <span className=\"text-bearish\">{formatAmountUSD(sellVolumes)}</span>\n </div>\n </div>\n );\n}\n","import { clsx, Skeleton } from \"@liberfi.io/ui\";\n\nexport interface TokenListSkeletonProps {\n rowHeight: number;\n hasActions: boolean;\n}\n\nconst skeletonCount = 5;\n\nexport function TokenListSkeleton({\n rowHeight,\n hasActions,\n}: TokenListSkeletonProps) {\n return (\n <>\n {Array.from({ length: skeletonCount }).map((_, index) => (\n <TokenListRowSkeleton\n key={index}\n rowHeight={rowHeight}\n hasBorderBottom={index !== skeletonCount - 1}\n hasActions={hasActions}\n />\n ))}\n </>\n );\n}\n\ninterface TokenListRowSkeletonProps {\n rowHeight: number;\n hasBorderBottom: boolean;\n hasActions: boolean;\n}\n\nfunction TokenListRowSkeleton({\n rowHeight,\n hasBorderBottom,\n hasActions,\n}: TokenListRowSkeletonProps) {\n return (\n <div\n className={clsx(\n \"relative flex items-center\",\n \"[&>div]:first:sm:pl-6 [&>div]:last:sm:pr-6\",\n hasBorderBottom &&\n \"after:content-[''] after:absolute after:left-0 after:bottom-0\",\n hasBorderBottom && \"after:w-full after:h-px after:bg-border/50\",\n )}\n style={{ height: `${rowHeight}px` }}\n >\n <TokenCellSkeleton />\n <TokenPriceCellSkeleton />\n <TokenMarketCapCellSkeleton />\n <TokenLiquidityCellSkeleton />\n <TokenVolumesCellSkeleton />\n <TokenTxsCellSkeleton />\n <TokenTradersCellSkeleton />\n <TokenInfoCellSkeleton />\n {hasActions && <TokenActionsSkeleton />}\n </div>\n );\n}\n\nfunction TokenCellSkeleton() {\n return (\n <div className=\"w-56 sm:w-81 px-3 h-full flex justify-start items-center gap-3\">\n <Skeleton className=\"w-10 h-10 sm:w-16 sm:h-16 flex-none rounded-md\" />\n <div className=\"flex flex-col gap-1\">\n <div className=\"w-18 sm:w-24 h-4 sm:h-6 flex items-center\">\n <Skeleton className=\"w-full h-3 sm:h-4 rounded-md\" />\n </div>\n <div className=\"w-32 sm:w-40 h-4 sm:h-6 flex items-center\">\n <Skeleton className=\"w-full h-3 sm:h-3.5 rounded-md\" />\n </div>\n </div>\n </div>\n );\n}\n\nfunction TokenPriceCellSkeleton() {\n return (\n <div className=\"w-23.5 sm:w-36 h-full px-3 flex flex-col gap-1 justify-center items-start\">\n <div className=\"w-10 sm:w-14 h-4 sm:h-6 flex items-center\">\n <Skeleton className=\"w-full h-3 sm:h-4 rounded-md\" />\n </div>\n <div className=\"w-18 sm:w-24 h-4 flex items-center\">\n <Skeleton className=\"w-full h-3 rounded-md\" />\n </div>\n </div>\n );\n}\n\nfunction TokenMarketCapCellSkeleton() {\n return (\n <div className=\"w-23.5 sm:w-36 h-full px-3 flex items-center\">\n <Skeleton className=\"w-18 sm:w-24 h-3 sm:h-4 rounded-md\" />\n </div>\n );\n}\n\nfunction TokenLiquidityCellSkeleton() {\n return (\n <div className=\"w-23.5 sm:w-36 h-full px-3 flex items-center\">\n <Skeleton className=\"w-18 sm:w-24 h-3 sm:h-4 rounded-md\" />\n </div>\n );\n}\n\nfunction TokenVolumesCellSkeleton() {\n return (\n <div className=\"w-31.5 sm:w-36 h-full px-3 flex flex-col gap-1 justify-center items-start\">\n <div className=\"w-10 sm:w-14 h-4 sm:h-6 flex items-center\">\n <Skeleton className=\"w-full h-3 sm:h-4 rounded-md\" />\n </div>\n <div className=\"w-18 sm:w-24 h-4 flex items-center\">\n <Skeleton className=\"w-full h-3 rounded-md\" />\n </div>\n </div>\n );\n}\n\nfunction TokenTxsCellSkeleton() {\n return (\n <div className=\"w-31.5 sm:w-36 h-full px-3 py-2 flex flex-col gap-1 justify-center items-start\">\n <div className=\"w-10 sm:w-14 h-4 sm:h-6 flex items-center\">\n <Skeleton className=\"w-full h-3 sm:h-4 rounded-md\" />\n </div>\n <div className=\"w-18 sm:w-24 h-4 flex items-center\">\n <Skeleton className=\"w-full h-3 rounded-md\" />\n </div>\n </div>\n );\n}\n\nfunction TokenTradersCellSkeleton() {\n return (\n <div className=\"w-31.5 sm:w-36 h-full px-3 py-2 flex flex-col gap-1 justify-center items-start\">\n <div className=\"w-10 sm:w-14 h-4 sm:h-6 flex items-center\">\n <Skeleton className=\"w-full h-3 sm:h-4 rounded-md\" />\n </div>\n <div className=\"w-18 sm:w-24 h-4 flex items-center\">\n <Skeleton className=\"w-full h-3 rounded-md\" />\n </div>\n </div>\n );\n}\n\nfunction TokenInfoCellSkeleton() {\n return (\n <div className=\"w-51 sm:w-56 h-full px-3 py-2 flex gap-1.5 justify-start items-center\">\n <div className=\"flex flex-col gap-1 items-start justify-start\">\n <Skeleton className=\"w-18 h-5 rounded-full\" />\n <Skeleton className=\"w-18 h-5 rounded-full\" />\n </div>\n <div className=\"flex flex-col gap-1 items-start justify-start\">\n <Skeleton className=\"w-18 h-5 rounded-full\" />\n <Skeleton className=\"w-18 h-5 rounded-full\" />\n </div>\n </div>\n );\n}\n\nfunction TokenActionsSkeleton() {\n return <div className=\"w-51 sm:w-56 h-full px-3 py-2\"></div>;\n}\n","import {\n ComponentType,\n MouseEvent,\n ReactElement,\n useCallback,\n useEffect,\n useState,\n} from \"react\";\nimport { useTranslation } from \"@liberfi.io/i18n\";\nimport { API, Token } from \"@liberfi.io/types\";\nimport {\n clsx,\n EmptyIcon,\n Sortable,\n StyledTable,\n TableBody,\n TableCell,\n TableCellProps,\n TableColumn,\n TableColumnProps,\n TableHeader,\n TableRow,\n useScreen,\n} from \"@liberfi.io/ui\";\nimport {\n TokenCell,\n TokenInfoCell,\n TokenLiquidityCell,\n TokenMarketCapCell,\n TokenPriceCell,\n TokenTradersCell,\n TokenTradesCell,\n TokenVolumesCell,\n} from \"./cells\";\nimport { TokenListSkeleton } from \"./token-list-skeleton.ui\";\nimport { TokenListResolution } from \"./types\";\n\ntype SortDirection = \"asc\" | \"desc\" | undefined;\n\nexport type TokenListSortDirections = {\n [key in API.TokenFieldOption]?: SortDirection;\n};\n\nexport interface TokenListActionsProps {\n token: Token;\n resolution: TokenListResolution;\n}\n\nexport type TokenListActionsComponent = ComponentType<TokenListActionsProps>;\n\nexport interface TokenListProps {\n /** tokens to display */\n tokens: Array<Token>;\n /** resolution of the token prices */\n resolution?: TokenListResolution;\n /** whether the list is loading */\n isLoading?: boolean;\n /** custom token actions component */\n ActionsComponent?: TokenListActionsComponent;\n /** callback function when select a token */\n onSelectToken?: (token: Token) => void | Promise<void>;\n /** current sort directions */\n sortDirections?: TokenListSortDirections;\n /** callback function when sort direction changes */\n onSortChange?: (\n sortDirections: TokenListSortDirections,\n ) => void | Promise<void>;\n /**\n * list container height, required for virtualized list.\n * you can use useResizeObserver hook to get the container's height.\n * default is 600\n */\n height?: number;\n /** custom item height, default is 88 */\n itemHeight?: number;\n /** custom item height on mobile, default is 72 */\n itemHeightMobile?: number;\n /** custom styles, if ActionsComponent is provided, please provide the max-width for the list */\n className?: string;\n}\n\n/**\n * Token List UI Component\n */\nexport function TokenList({\n tokens,\n resolution = \"24h\",\n isLoading,\n ActionsComponent,\n onSelectToken,\n sortDirections,\n onSortChange,\n height = 600,\n itemHeight = 88,\n itemHeightMobile = 72,\n className,\n}: TokenListProps) {\n const { isMobile } = useScreen();\n\n const { t } = useTranslation();\n\n const handleRowClick = useCallback(\n (token: Token) => (e: MouseEvent<HTMLTableRowElement>) => {\n e.preventDefault();\n e.stopPropagation();\n onSelectToken?.(token);\n },\n [onSelectToken],\n );\n\n // latest sort directions\n const [sorts, setSorts] = useState<TokenListSortDirections>(\n sortDirections ?? {},\n );\n\n // update sort directions when they change\n useEffect(() => {\n setSorts(sortDirections ?? {});\n }, [sortDirections]);\n\n // only one field can be sorted at a time\n const handleSortChange = useCallback(\n (field: API.TokenFieldOption) => (sort: \"asc\" | \"desc\" | undefined) => {\n const sorts = { [field]: sort };\n setSorts(sorts);\n onSortChange?.(sorts);\n },\n [onSortChange],\n );\n\n return (\n <StyledTable\n isHeaderSticky\n isVirtualized\n radius=\"lg\"\n className={clsx(\n \"h-full mx-auto\",\n className ??\n (ActionsComponent\n ? \"max-w-346 sm:max-w-414\"\n : \"max-w-290 sm:max-w-358\"),\n )}\n classNames={{\n loadingWrapper: \"flex-col justify-start items-start\",\n emptyWrapper: \"pt-30\",\n }}\n maxTableHeight={height}\n rowHeight={isMobile ? itemHeightMobile : itemHeight}\n aria-label=\"Tokens\"\n >\n <TableHeader>\n {\n [\n <TableColumn\n key=\"token\"\n textValue={t(\"tokens.listHeader.token\")}\n width={isMobile ? 224 : 324}\n >\n {t(\"tokens.listHeader.token\")}\n </TableColumn>,\n <TableColumn\n key=\"price\"\n textValue={t(\"tokens.listHeader.price\")}\n width={isMobile ? 128 : 150}\n >\n <div className=\"flex items-center gap-1\">\n <Sortable\n sort={sorts.price}\n onSortChange={handleSortChange(\"price\")}\n >\n {t(\"tokens.listHeader.price\")}\n </Sortable>\n <span>/</span>\n <Sortable\n sort={sorts[`priceChange${resolution}`]}\n onSortChange={handleSortChange(`priceChange${resolution}`)}\n >\n {t(\"tokens.listHeader.priceChange\", { resolution })}\n </Sortable>\n </div>\n </TableColumn>,\n <TableColumn\n key=\"marketCap\"\n textValue={t(\"tokens.listHeader.marketCap\")}\n width={isMobile ? 106 : 144}\n >\n <Sortable\n sort={sorts.marketCap}\n onSortChange={handleSortChange(\"marketCap\")}\n >\n {t(\"tokens.listHeader.marketCap\")}\n </Sortable>\n </TableColumn>,\n <TableColumn\n key=\"liquidity\"\n textValue={t(\"tokens.listHeader.liquidity\")}\n width={isMobile ? 106 : 144}\n >\n <Sortable sort={sorts.tvl} onSortChange={handleSortChange(\"tvl\")}>\n {t(\"tokens.listHeader.liquidity\")}\n </Sortable>\n </TableColumn>,\n <TableColumn\n key=\"volumes\"\n textValue={t(\"tokens.listHeader.volumes\", { resolution })}\n width={isMobile ? 138 : 156}\n >\n <Sortable\n sort={sorts[`volumes${resolution}`]}\n onSortChange={handleSortChange(`volumes${resolution}`)}\n >\n {t(\"tokens.listHeader.volumes\", { resolution })}\n </Sortable>\n </TableColumn>,\n <TableColumn\n key=\"txs\"\n textValue={t(\"tokens.listHeader.txs\", { resolution })}\n width={isMobile ? 126 : 144}\n >\n <Sortable\n sort={sorts[`trades${resolution}`]}\n onSortChange={handleSortChange(`trades${resolution}`)}\n >\n {t(\"tokens.listHeader.txs\", { resolution })}\n </Sortable>\n </TableColumn>,\n <TableColumn\n key=\"traders\"\n textValue={t(\"tokens.listHeader.traders\", { resolution })}\n width={isMobile ? 126 : 144}\n >\n <Sortable\n sort={sorts[`traders${resolution}`]}\n onSortChange={handleSortChange(`traders${resolution}`)}\n >\n {t(\"tokens.listHeader.traders\", { resolution })}\n </Sortable>\n </TableColumn>,\n <TableColumn\n key=\"tokenInfo\"\n textValue={t(\"tokens.listHeader.tokenInfo\")}\n width={isMobile ? 204 : 224}\n >\n {t(\"tokens.listHeader.tokenInfo\")}\n </TableColumn>,\n ActionsComponent ? (\n <TableColumn\n key=\"actions\"\n textValue={t(\"tokens.listHeader.actions\")}\n minWidth={224}\n >\n {t(\"tokens.listHeader.actions\")}\n </TableColumn>\n ) : undefined,\n ].filter(Boolean) as ReactElement<TableColumnProps<unknown>>[]\n }\n </TableHeader>\n\n <TableBody\n // don't show the loaded content when loading\n items={isLoading ? [] : tokens}\n isLoading={isLoading}\n loadingContent={\n <TokenListSkeleton\n rowHeight={isMobile ? itemHeightMobile : itemHeight}\n hasActions={!!ActionsComponent}\n />\n }\n emptyContent={\n <div>\n <EmptyIcon className=\"w-10 h-10 mx-auto text-neutral\" />\n <p className=\"mt-2 text-sm text-neutral text-center\">\n {t(\"common.empty\")}\n </p>\n </div>\n }\n >\n {(token) => (\n <TableRow\n key={token.address}\n onClick={onSelectToken ? handleRowClick(token) : undefined}\n >\n {\n [\n <TableCell key=\"token\">\n <TokenCell token={token} resolution={resolution} />\n </TableCell>,\n <TableCell key=\"price\">\n <TokenPriceCell token={token} resolution={resolution} />\n </TableCell>,\n <TableCell key=\"marketCap\">\n <TokenMarketCapCell token={token} resolution={resolution} />\n </TableCell>,\n <TableCell key=\"liquidity\">\n <TokenLiquidityCell token={token} resolution={resolution} />\n </TableCell>,\n <TableCell key=\"volumes\">\n <TokenVolumesCell token={token} resolution={resolution} />\n </TableCell>,\n <TableCell key=\"trades\">\n <TokenTradesCell token={token} resolution={resolution} />\n </TableCell>,\n <TableCell key=\"traders\">\n <TokenTradersCell token={token} resolution={resolution} />\n </TableCell>,\n <TableCell key=\"info\">\n <TokenInfoCell token={token} resolution={resolution} />\n </TableCell>,\n ActionsComponent ? (\n <TableCell key=\"actions\">\n <ActionsComponent token={token} resolution={resolution} />\n </TableCell>\n ) : undefined,\n ].filter(Boolean) as ReactElement<TableCellProps>[]\n }\n </TableRow>\n )}\n </TableBody>\n </StyledTable>\n );\n}\n","import { useEffect, useMemo, useRef, useState } from \"react\";\nimport { useNewTokensQuery } from \"@liberfi.io/hooks\";\nimport { API, Chain, Token } from \"@liberfi.io/types\";\nimport { TokenListResolution } from \"./types\";\n\nexport type UseNewTokensScriptParams = {\n /** chain id */\n chain: Chain;\n /** resolution */\n resolution: TokenListResolution;\n /** fetch tokens options */\n options?: API.GetTokenListOptions;\n /** refetch tokens interval */\n refetchInterval?: number;\n};\n\nexport type UseNewTokensScriptResult = {\n /** is fetching tokens, return true if initially fetching tokens or refetching tokens due to query params change */\n isLoading: boolean;\n /** tokens */\n tokens: Array<Token>;\n};\n\nexport function useNewTokensScript({\n chain,\n resolution,\n options,\n refetchInterval = 12e3,\n}: UseNewTokensScriptParams): UseNewTokensScriptResult {\n // calculate query params\n const queryParams = useMemo(\n () => ({ chain, resolution, ...options }),\n [chain, resolution, options],\n );\n\n // used to check if query params have changed\n const prevParamsRef = useRef(queryParams);\n\n // is fetching tokens due to query params change\n const [isParamsChanged, setIsParamsChanged] = useState(true);\n\n // params changed\n useEffect(() => {\n const changed =\n JSON.stringify(queryParams) !== JSON.stringify(prevParamsRef.current);\n if (changed) {\n setIsParamsChanged(true);\n prevParamsRef.current = queryParams;\n }\n }, [queryParams]);\n\n // latest tokens\n const [tokens, setTokens] = useState<Array<Token>>([]);\n\n // fetch latest tokens periodically\n const {\n // fetched latest tokens\n data: fetchedTokens,\n // haven't initially fetched tokens yet\n isPending,\n } = useNewTokensQuery(queryParams, { refetchInterval });\n\n useEffect(() => {\n if (fetchedTokens) {\n // sync latest tokens\n setTokens(fetchedTokens);\n // the refetch, which is caused by query params change, is completed\n setIsParamsChanged(false);\n }\n }, [fetchedTokens]);\n\n const isLoading = useMemo(() => {\n // haven't initially fetched tokens yet\n if (isPending) return true;\n // is refetching due to query params change\n if (isParamsChanged) return true;\n return false;\n }, [isPending, isParamsChanged]);\n\n return { tokens, isLoading };\n}\n","import { useMemo, useState } from \"react\";\nimport { Chain, Token } from \"@liberfi.io/types\";\nimport { useNewTokensScript } from \"./new-token-list.script\";\nimport { TokenListFiltersType } from \"./token-list-filter.ui\";\nimport {\n TokenList,\n TokenListActionsComponent,\n TokenListSortDirections,\n} from \"./token-list.ui\";\nimport { TokenListResolution } from \"./types\";\n\nexport type NewTokenListWidgetProps = {\n /** chain id */\n chain: Chain;\n /** resolution of the token prices */\n resolution: TokenListResolution;\n /** fetch tokens filters */\n filters?: TokenListFiltersType;\n /** custom token actions component */\n ActionsComponent?: TokenListActionsComponent;\n /** callback function when select a token */\n onSelectToken?: (token: Token) => void | Promise<void>;\n /**\n * list container height, required for virtualized list.\n * you can use useResizeObserver hook to get the container's height.\n * default is 600\n */\n height?: number;\n /** custom item height, default is 88 */\n itemHeight?: number;\n /** custom item height on mobile, default is 72 */\n itemHeightMobile?: number;\n /** custom styles, if ActionsComponent is provided, please provide the max-width for the list */\n className?: string;\n};\n\nexport function NewTokenListWidget({\n chain,\n resolution,\n filters,\n ActionsComponent,\n onSelectToken,\n height,\n itemHeight,\n itemHeightMobile,\n className,\n}: NewTokenListWidgetProps) {\n const [sortDirections, setSortDirections] = useState<\n TokenListSortDirections | undefined\n >();\n\n const options = useMemo(() => {\n const sortBy = Object.keys(sortDirections ?? {})[0];\n const sortDirection = sortDirections?.[sortBy];\n const sort =\n sortBy && sortDirection ? { sortBy, sortDirection } : undefined;\n return {\n ...filters,\n ...sort,\n };\n }, [filters, sortDirections]);\n\n const { tokens, isLoading } = useNewTokensScript({\n chain,\n resolution,\n options,\n });\n\n return (\n <TokenList\n tokens={tokens}\n isLoading={isLoading}\n resolution={resolution}\n height={height}\n itemHeight={itemHeight}\n itemHeightMobile={itemHeightMobile}\n ActionsComponent={ActionsComponent}\n onSelectToken={onSelectToken}\n sortDirections={sortDirections}\n onSortChange={setSortDirections}\n className={className}\n />\n );\n}\n","import { useEffect, useMemo, useRef, useState } from \"react\";\nimport { useStockTokensQuery } from \"@liberfi.io/hooks\";\nimport { API, Chain, Token } from \"@liberfi.io/types\";\nimport { TokenListResolution } from \"./types\";\n\nexport type UseStockTokensScriptParams = {\n /** chain id */\n chain: Chain;\n /** resolution */\n resolution: TokenListResolution;\n /** fetch tokens options */\n options?: API.GetTokenListOptions;\n /** refetch tokens interval */\n refetchInterval?: number;\n};\n\nexport type UseStockTokensScriptResult = {\n /** is fetching tokens, return true if initially fetching tokens or refetching tokens due to query params change */\n isLoading: boolean;\n /** tokens */\n tokens: Array<Token>;\n};\n\nexport function useStockTokensScript({\n chain,\n resolution,\n options,\n refetchInterval = 12e3,\n}: UseStockTokensScriptParams): UseStockTokensScriptResult {\n // calculate query params\n const queryParams = useMemo(\n () => ({ chain, resolution, ...options }),\n [chain, resolution, options],\n );\n\n // used to check if query params have changed\n const prevParamsRef = useRef(queryParams);\n\n // is fetching tokens due to query params change\n const [isParamsChanged, setIsParamsChanged] = useState(true);\n\n // params changed\n useEffect(() => {\n const changed =\n JSON.stringify(queryParams) !== JSON.stringify(prevParamsRef.current);\n if (changed) {\n setIsParamsChanged(true);\n prevParamsRef.current = queryParams;\n }\n }, [queryParams]);\n\n // latest tokens\n const [tokens, setTokens] = useState<Array<Token>>([]);\n\n // fetch latest tokens periodically\n const {\n // fetched latest tokens\n data: fetchedTokens,\n // haven't initially fetched tokens yet\n isPending,\n } = useStockTokensQuery(queryParams, { refetchInterval });\n\n useEffect(() => {\n if (fetchedTokens) {\n // sync latest tokens\n setTokens(fetchedTokens);\n // the refetch, which is caused by query params change, is completed\n setIsParamsChanged(false);\n }\n }, [fetchedTokens]);\n\n const isLoading = useMemo(() => {\n // haven't initially fetched tokens yet\n if (isPending) return true;\n // is refetching due to query params change\n if (isParamsChanged) return true;\n return false;\n }, [isPending, isParamsChanged]);\n\n return { tokens, isLoading };\n}\n","import { useMemo, useState } from \"react\";\nimport { Chain, Token } from \"@liberfi.io/types\";\nimport { useStockTokensScript } from \"./stock-token-list.script\";\nimport { TokenListFiltersType } from \"./token-list-filter.ui\";\nimport {\n TokenList,\n TokenListActionsComponent,\n TokenListSortDirections,\n} from \"./token-list.ui\";\nimport { TokenListResolution } from \"./types\";\n\nexport type StockTokenListWidgetProps = {\n /** chain id */\n chain: Chain;\n /** resolution of the token prices */\n resolution: TokenListResolution;\n /** fetch tokens filters */\n filters?: TokenListFiltersType;\n /** custom token actions component */\n ActionsComponent?: TokenListActionsComponent;\n /** callback function when select a token */\n onSelectToken?: (token: Token) => void | Promise<void>;\n /**\n * list container height, required for virtualized list.\n * you can use useResizeObserver hook to get the container's height.\n * default is 600\n */\n height?: number;\n /** custom item height, default is 88 */\n itemHeight?: number;\n /** custom item height on mobile, default is 72 */\n itemHeightMobile?: number;\n /** custom styles, if ActionsComponent is provided, please provide the max-width for the list */\n className?: string;\n};\n\nexport function StockTokenListWidget({\n chain,\n resolution,\n filters,\n ActionsComponent,\n onSelectToken,\n height,\n itemHeight,\n itemHeightMobile,\n className,\n}: StockTokenListWidgetProps) {\n const [sortDirections, setSortDirections] = useState<\n TokenListSortDirections | undefined\n >();\n\n const options = useMemo(() => {\n const sortBy = Object.keys(sortDirections ?? {})[0];\n const sortDirection = sortDirections?.[sortBy];\n const sort =\n sortBy && sortDirection ? { sortBy, sortDirection } : undefined;\n return {\n ...filters,\n ...sort,\n };\n }, [filters, sortDirections]);\n\n const { tokens, isLoading } = useStockTokensScript({\n chain,\n resolution,\n options,\n });\n\n return (\n <TokenList\n tokens={tokens}\n isLoading={isLoading}\n resolution={resolution}\n height={height}\n itemHeight={itemHeight}\n itemHeightMobile={itemHeightMobile}\n ActionsComponent={ActionsComponent}\n onSelectToken={onSelectToken}\n sortDirections={sortDirections}\n onSortChange={setSortDirections}\n className={className}\n />\n );\n}\n","import { useEffect, useMemo, useRef, useState } from \"react\";\nimport { useTrendingTokensQuery } from \"@liberfi.io/hooks\";\nimport { API, Chain, Token } from \"@liberfi.io/types\";\nimport { TokenListResolution } from \"./types\";\n\nexport type UseTrendingTokensScriptParams = {\n /** chain id */\n chain: Chain;\n /** resolution */\n resolution: TokenListResolution;\n /** fetch tokens options */\n options?: API.GetTokenListOptions;\n /** refetch tokens interval */\n refetchInterval?: number;\n};\n\nexport type UseTrendingTokensScriptResult = {\n /** is fetching tokens, return true if initially fetching tokens or refetching tokens due to query params change */\n isLoading: boolean;\n /** tokens */\n tokens: Array<Token>;\n};\n\nexport function useTrendingTokensScript({\n chain,\n resolution,\n options,\n refetchInterval = 12e3,\n}: UseTrendingTokensScriptParams): UseTrendingTokensScriptResult {\n // calculate query params\n const queryParams = useMemo(\n () => ({ chain, resolution, ...options }),\n [chain, resolution, options],\n );\n\n // used to check if query params have changed\n const prevParamsRef = useRef(queryParams);\n\n // is fetching tokens due to query params change\n const [isParamsChanged, setIsParamsChanged] = useState(true);\n\n // params changed\n useEffect(() => {\n const changed =\n JSON.stringify(queryParams) !== JSON.stringify(prevParamsRef.current);\n if (changed) {\n setIsParamsChanged(true);\n prevParamsRef.current = queryParams;\n }\n }, [queryParams]);\n\n // latest tokens\n const [tokens, setTokens] = useState<Array<Token>>([]);\n\n // fetch latest tokens periodically\n const {\n // fetched latest tokens\n data: fetchedTokens,\n // haven't initially fetched tokens yet\n isPending,\n } = useTrendingTokensQuery(queryParams, { refetchInterval });\n\n useEffect(() => {\n if (fetchedTokens) {\n // sync latest tokens\n setTokens(fetchedTokens);\n // the refetch, which is caused by query params change, is completed\n setIsParamsChanged(false);\n }\n }, [fetchedTokens]);\n\n const isLoading = useMemo(() => {\n // haven't initially fetched tokens yet\n if (isPending) return true;\n // is refetching due to query params change\n if (isParamsChanged) return true;\n return false;\n }, [isPending, isParamsChanged]);\n\n return { tokens, isLoading };\n}\n","import { useMemo, useState } from \"react\";\nimport { API, Chain, Token } from \"@liberfi.io/types\";\nimport { TokenListFiltersType } from \"./token-list-filter.ui\";\nimport {\n TokenList,\n TokenListActionsComponent,\n TokenListSortDirections,\n} from \"./token-list.ui\";\nimport { useTrendingTokensScript } from \"./trending-token-list.script\";\nimport { TokenListResolution } from \"./types\";\n\nexport type TrendingTokenListWidgetProps = {\n /** chain id */\n chain: Chain;\n /** resolution of the token prices */\n resolution: TokenListResolution;\n /** fetch tokens filters */\n filters?: TokenListFiltersType;\n /** custom token actions component */\n ActionsComponent?: TokenListActionsComponent;\n /** callback function when select a token */\n onSelectToken?: (token: Token) => void | Promise<void>;\n /**\n * list container height, required for virtualized list.\n * you can use useResizeObserver hook to get the container's height.\n * default is 600\n */\n height?: number;\n /** custom item height, default is 88 */\n itemHeight?: number;\n /** custom item height on mobile, default is 72 */\n itemHeightMobile?: number;\n /** custom styles, if ActionsComponent is provided, please provide the max-width for the list */\n className?: string;\n};\n\nexport function TrendingTokenListWidget({\n chain,\n resolution,\n filters,\n ActionsComponent,\n onSelectToken,\n height,\n itemHeight,\n itemHeightMobile,\n className,\n}: TrendingTokenListWidgetProps) {\n const [sortDirections, setSortDirections] = useState<\n TokenListSortDirections | undefined\n >();\n\n const options = useMemo(() => {\n const sortBy = Object.keys(sortDirections ?? {})[0];\n const sortDirection = sortDirections?.[sortBy];\n const sort =\n sortBy && sortDirection ? { sortBy, sortDirection } : undefined;\n return {\n ...filters,\n ...sort,\n };\n }, [filters, sortDirections]);\n\n const { tokens, isLoading } = useTrendingTokensScript({\n chain,\n resolution,\n options,\n });\n\n return (\n <TokenList\n tokens={tokens}\n isLoading={isLoading}\n resolution={resolution}\n height={height}\n itemHeight={itemHeight}\n itemHeightMobile={itemHeightMobile}\n ActionsComponent={ActionsComponent}\n onSelectToken={onSelectToken}\n sortDirections={sortDirections}\n onSortChange={setSortDirections}\n className={className}\n />\n );\n}\n"]}
|
package/package.json
ADDED
|
@@ -0,0 +1,49 @@
|
|
|
1
|
+
{
|
|
2
|
+
"name": "@liberfi.io/ui-tokens",
|
|
3
|
+
"version": "0.1.0",
|
|
4
|
+
"description": "Token Components for Liberfi React SDK",
|
|
5
|
+
"main": "dist/index.js",
|
|
6
|
+
"module": "dist/index.mjs",
|
|
7
|
+
"types": "dist/index.d.ts",
|
|
8
|
+
"keywords": [],
|
|
9
|
+
"author": "liberfi.io",
|
|
10
|
+
"files": [
|
|
11
|
+
"dist"
|
|
12
|
+
],
|
|
13
|
+
"publishConfig": {
|
|
14
|
+
"access": "public"
|
|
15
|
+
},
|
|
16
|
+
"dependencies": {
|
|
17
|
+
"react": "^19.1.1",
|
|
18
|
+
"react-dom": "^19.1.1",
|
|
19
|
+
"@liberfi.io/core": "0.1.0",
|
|
20
|
+
"@liberfi.io/types": "0.1.0",
|
|
21
|
+
"@liberfi.io/ui": "0.1.0",
|
|
22
|
+
"@liberfi.io/hooks": "0.1.0",
|
|
23
|
+
"@liberfi.io/i18n": "0.1.2",
|
|
24
|
+
"@liberfi.io/utils": "0.1.1"
|
|
25
|
+
},
|
|
26
|
+
"devDependencies": {
|
|
27
|
+
"@tailwindcss/cli": "^4.1.13",
|
|
28
|
+
"@tailwindcss/postcss": "^4.1.13",
|
|
29
|
+
"@types/node": "^24.5.0",
|
|
30
|
+
"@types/react": "^19.1.13",
|
|
31
|
+
"@types/react-dom": "^19.1.9",
|
|
32
|
+
"@types/react-portal": "^4.0.7",
|
|
33
|
+
"autoprefixer": "^10.4.21",
|
|
34
|
+
"postcss": "^8.5.6",
|
|
35
|
+
"tailwindcss": "^4.1.13",
|
|
36
|
+
"tsup": "^8.5.0",
|
|
37
|
+
"typescript": "^5.9.2",
|
|
38
|
+
"tsconfig": "0.1.0"
|
|
39
|
+
},
|
|
40
|
+
"peerDependencies": {
|
|
41
|
+
"react": ">=18",
|
|
42
|
+
"react-dom": ">=18"
|
|
43
|
+
},
|
|
44
|
+
"scripts": {
|
|
45
|
+
"build": "tsup",
|
|
46
|
+
"build:css": "pnpm dlx @tailwindcss/cli -i ./src/tailwind/tailwind.css -o ./dist/styles.css",
|
|
47
|
+
"test": "echo \"Error: no test specified\" && exit 1"
|
|
48
|
+
}
|
|
49
|
+
}
|