@liberfi.io/ui-chain-select 0.1.72 → 0.1.74

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 CHANGED
@@ -14,7 +14,7 @@ declare global {
14
14
  };
15
15
  }
16
16
  }
17
- declare const _default: "0.1.72";
17
+ declare const _default: "0.1.74";
18
18
 
19
19
  type ChainAtoms = {
20
20
  chainAtom: ReturnType<typeof atomWithStorage<Chain>>;
package/dist/index.d.ts CHANGED
@@ -14,7 +14,7 @@ declare global {
14
14
  };
15
15
  }
16
16
  }
17
- declare const _default: "0.1.72";
17
+ declare const _default: "0.1.74";
18
18
 
19
19
  type ChainAtoms = {
20
20
  chainAtom: ReturnType<typeof atomWithStorage<Chain>>;
package/dist/index.js CHANGED
@@ -1,2 +1,2 @@
1
- 'use strict';var react=require('react'),utils=require('jotai/utils'),types=require('@liberfi.io/types'),jsxRuntime=require('react/jsx-runtime'),ui=require('@liberfi.io/ui'),utils$1=require('@liberfi.io/utils'),jotai=require('jotai');typeof window<"u"&&(window.__LIBERFI_VERSION__=window.__LIBERFI_VERSION__||{},window.__LIBERFI_VERSION__["@liberfi.io/ui-chain-select"]="0.1.72");var M="0.1.72";var A={getOnInit:true};function f(e=""){let o=`${e}chain`,t=`${e}chainNamespace`;return {chainAtom:utils.atomWithStorage(o,types.Chain.SOLANA,void 0,A),chainNamespaceAtom:utils.atomWithStorage(t,types.ChainNamespace.SOLANA,void 0,A)}}var u=f(""),x=u,Se=u.chainAtom,ge=u.chainNamespaceAtom;var p=react.createContext(x);function ye({storageKeyPrefix:e="",children:o}){let t=react.useMemo(()=>f(e),[e]);return jsxRuntime.jsx(p.Provider,{value:t,children:o})}var J={[types.Chain.SOLANA]:ui.SolanaIcon,[types.Chain.ETHEREUM]:ui.EthereumIcon,[types.Chain.BINANCE]:ui.BinanceIcon};function l({chain:e,className:o}){let t=J[e];return t?jsxRuntime.jsx(t,{className:o}):jsxRuntime.jsx(ui.Avatar,{className:o,src:utils$1.chainIcon(e),name:utils$1.capitalize(utils$1.chainSlug(e)??"")})}var w=[types.Chain.SOLANA,types.Chain.ETHEREUM,types.Chain.BINANCE];function C(e){return e==="sm"?"w-4 h-4":e==="lg"?"w-6 h-6":"w-5 h-5"}function b({size:e,candidates:o,chain:t=o[0],onSelectChain:n,isSwitching:i,className:s}){let m=c=>{n?.(c);},a=C(e),r=utils$1.chainColor(t);return jsxRuntime.jsxs(ui.Dropdown,{placement:"bottom-end",className:s,classNames:{content:"w-38 bg-content1 border border-border"},children:[jsxRuntime.jsx(ui.DropdownTrigger,{children:jsxRuntime.jsx(ui.Button,{isLoading:i,size:e,variant:"bordered",radius:"full",style:{borderColor:r?`${r}60`:void 0},startContent:jsxRuntime.jsx(l,{chain:t,className:a}),children:utils$1.chainDisplayName(t)})}),jsxRuntime.jsx(ui.DropdownMenu,{"aria-label":"Select chain",selectionMode:"single",selectedKeys:t?[t]:[],onAction:m,classNames:{list:"gap-1"},itemClasses:{base:ui.cn("rounded-md px-3",e==="sm"?"h-8":e==="lg"?"h-12":"h-10")},children:o.map(c=>jsxRuntime.jsx(ui.DropdownItem,{startContent:jsxRuntime.jsx(l,{chain:c,className:a}),className:ui.cn(c===t?"bg-content2 text-foreground":"text-neutral","data-[hover=true]:bg-content2 data-[hover=true]:text-foreground","data-[selectable=true]:focus:bg-content2 data-[selectable=true]:focus:text-foreground"),children:utils$1.chainDisplayName(c)},c))})]})}function P({size:e,candidates:o,chain:t=o[0],onSelectChain:n,isSwitching:i,className:s}){let m=C(e);return jsxRuntime.jsx("div",{role:"group","aria-label":"Select chain",className:ui.cn("flex items-center gap-1",s),children:o.map(a=>{let r=utils$1.chainColor(a),c=utils$1.chainDisplayName(a);return jsxRuntime.jsx(ui.StyledTooltip,{content:c,children:jsxRuntime.jsx(ui.Button,{isIconOnly:true,"aria-label":c,isDisabled:i,radius:"full",className:ui.cn("min-w-0 min-h-0 border",e==="sm"?"w-6 h-6":e==="md"||e===void 0?"w-7 h-7":"w-8 h-8",a===t?"bg-content1 scale-110 hover:opacity-100":"bg-transparent scale-90 opacity-50 hover:opacity-100 border-transparent"),style:a===t&&r?{borderColor:`${r}`}:void 0,onPress:()=>n?.(a),children:jsxRuntime.jsx(l,{chain:a,className:m})})},a)})})}function D({size:e,candidates:o=w,chain:t=o[0],onSelectChain:n,isSwitching:i,className:s}){let{isMobile:m}=ui.useScreen();return m?jsxRuntime.jsx(P,{size:e,chain:t,onSelectChain:n,isSwitching:i,candidates:o,className:s}):jsxRuntime.jsx(b,{size:e,chain:t,onSelectChain:n,isSwitching:i,candidates:o,className:s})}function R(e){let{chainAtom:o,chainNamespaceAtom:t}=react.useContext(p),n=jotai.useSetAtom(o),i=jotai.useSetAtom(t),[s,m]=react.useState(false);return {selectChain:react.useCallback(async r=>{try{m(!0),await e?.onSwitchChain?.(r),i(utils$1.chainToNamespace(r)),n(r),e?.onSuccess?.(r);}catch(c){e?.onError?.(c);}finally{m(false);}},[n,i,e?.onSwitchChain,e?.onSuccess,e?.onError]),isSwitching:s}}function O(){let{chainAtom:e,chainNamespaceAtom:o}=react.useContext(p),t=jotai.useAtomValue(e),n=jotai.useAtomValue(o);return react.useMemo(()=>({chain:t,chainNamespace:n}),[t,n])}function ht({size:e,className:o,candidates:t,onSwitchChain:n,onSuccess:i,onError:s}){let{chain:m}=O(),{selectChain:a,isSwitching:r}=R({onSwitchChain:n,onSuccess:i,onError:s});return jsxRuntime.jsx(D,{chain:m,candidates:t,onSelectChain:a,isSwitching:r,size:e,className:o})}exports.ChainAvatar=l;exports.ChainSelectDesktopUI=b;exports.ChainSelectMobileUI=P;exports.ChainSelectProvider=ye;exports.ChainSelectStateContext=p;exports.ChainSelectUI=D;exports.ChainSelectWidget=ht;exports.chainAtom=Se;exports.chainNamespaceAtom=ge;exports.createChainAtoms=f;exports.defaultChainAtoms=x;exports.useCurrentChain=O;exports.useSelectChain=R;exports.version=M;//# sourceMappingURL=index.js.map
1
+ 'use strict';var react=require('react'),utils=require('jotai/utils'),types=require('@liberfi.io/types'),jsxRuntime=require('react/jsx-runtime'),ui=require('@liberfi.io/ui'),utils$1=require('@liberfi.io/utils'),jotai=require('jotai');typeof window<"u"&&(window.__LIBERFI_VERSION__=window.__LIBERFI_VERSION__||{},window.__LIBERFI_VERSION__["@liberfi.io/ui-chain-select"]="0.1.74");var M="0.1.74";var A={getOnInit:true};function f(e=""){let o=`${e}chain`,t=`${e}chainNamespace`;return {chainAtom:utils.atomWithStorage(o,types.Chain.SOLANA,void 0,A),chainNamespaceAtom:utils.atomWithStorage(t,types.ChainNamespace.SOLANA,void 0,A)}}var u=f(""),x=u,Se=u.chainAtom,ge=u.chainNamespaceAtom;var p=react.createContext(x);function ye({storageKeyPrefix:e="",children:o}){let t=react.useMemo(()=>f(e),[e]);return jsxRuntime.jsx(p.Provider,{value:t,children:o})}var J={[types.Chain.SOLANA]:ui.SolanaIcon,[types.Chain.ETHEREUM]:ui.EthereumIcon,[types.Chain.BINANCE]:ui.BinanceIcon};function l({chain:e,className:o}){let t=J[e];return t?jsxRuntime.jsx(t,{className:o}):jsxRuntime.jsx(ui.Avatar,{className:o,src:utils$1.chainIcon(e),name:utils$1.capitalize(utils$1.chainSlug(e)??"")})}var w=[types.Chain.SOLANA,types.Chain.ETHEREUM,types.Chain.BINANCE];function C(e){return e==="sm"?"w-4 h-4":e==="lg"?"w-6 h-6":"w-5 h-5"}function b({size:e,candidates:o,chain:t=o[0],onSelectChain:n,isSwitching:i,className:s}){let m=c=>{n?.(c);},a=C(e),r=utils$1.chainColor(t);return jsxRuntime.jsxs(ui.Dropdown,{placement:"bottom-end",className:s,classNames:{content:"w-38 bg-content1 border border-border"},children:[jsxRuntime.jsx(ui.DropdownTrigger,{children:jsxRuntime.jsx(ui.Button,{isLoading:i,size:e,variant:"bordered",radius:"full",style:{borderColor:r?`${r}60`:void 0},startContent:jsxRuntime.jsx(l,{chain:t,className:a}),children:utils$1.chainDisplayName(t)})}),jsxRuntime.jsx(ui.DropdownMenu,{"aria-label":"Select chain",selectionMode:"single",selectedKeys:t?[t]:[],onAction:m,classNames:{list:"gap-1"},itemClasses:{base:ui.cn("rounded-md px-3",e==="sm"?"h-8":e==="lg"?"h-12":"h-10")},children:o.map(c=>jsxRuntime.jsx(ui.DropdownItem,{startContent:jsxRuntime.jsx(l,{chain:c,className:a}),className:ui.cn(c===t?"bg-content2 text-foreground":"text-neutral","data-[hover=true]:bg-content2 data-[hover=true]:text-foreground","data-[selectable=true]:focus:bg-content2 data-[selectable=true]:focus:text-foreground"),children:utils$1.chainDisplayName(c)},c))})]})}function P({size:e,candidates:o,chain:t=o[0],onSelectChain:n,isSwitching:i,className:s}){let m=C(e);return jsxRuntime.jsx("div",{role:"group","aria-label":"Select chain",className:ui.cn("flex items-center gap-1",s),children:o.map(a=>{let r=utils$1.chainColor(a),c=utils$1.chainDisplayName(a);return jsxRuntime.jsx(ui.StyledTooltip,{content:c,children:jsxRuntime.jsx(ui.Button,{isIconOnly:true,"aria-label":c,isDisabled:i,radius:"full",className:ui.cn("min-w-0 min-h-0 border",e==="sm"?"w-6 h-6":e==="md"||e===void 0?"w-7 h-7":"w-8 h-8",a===t?"bg-content1 scale-110 hover:opacity-100":"bg-transparent scale-90 opacity-50 hover:opacity-100 border-transparent"),style:a===t&&r?{borderColor:`${r}`}:void 0,onPress:()=>n?.(a),children:jsxRuntime.jsx(l,{chain:a,className:m})})},a)})})}function D({size:e,candidates:o=w,chain:t=o[0],onSelectChain:n,isSwitching:i,className:s}){let{isMobile:m}=ui.useScreen();return m?jsxRuntime.jsx(P,{size:e,chain:t,onSelectChain:n,isSwitching:i,candidates:o,className:s}):jsxRuntime.jsx(b,{size:e,chain:t,onSelectChain:n,isSwitching:i,candidates:o,className:s})}function R(e){let{chainAtom:o,chainNamespaceAtom:t}=react.useContext(p),n=jotai.useSetAtom(o),i=jotai.useSetAtom(t),[s,m]=react.useState(false);return {selectChain:react.useCallback(async r=>{try{m(!0),await e?.onSwitchChain?.(r),i(utils$1.chainToNamespace(r)),n(r),e?.onSuccess?.(r);}catch(c){e?.onError?.(c);}finally{m(false);}},[n,i,e?.onSwitchChain,e?.onSuccess,e?.onError]),isSwitching:s}}function O(){let{chainAtom:e,chainNamespaceAtom:o}=react.useContext(p),t=jotai.useAtomValue(e),n=jotai.useAtomValue(o);return react.useMemo(()=>({chain:t,chainNamespace:n}),[t,n])}function ht({size:e,className:o,candidates:t,onSwitchChain:n,onSuccess:i,onError:s}){let{chain:m}=O(),{selectChain:a,isSwitching:r}=R({onSwitchChain:n,onSuccess:i,onError:s});return jsxRuntime.jsx(D,{chain:m,candidates:t,onSelectChain:a,isSwitching:r,size:e,className:o})}exports.ChainAvatar=l;exports.ChainSelectDesktopUI=b;exports.ChainSelectMobileUI=P;exports.ChainSelectProvider=ye;exports.ChainSelectStateContext=p;exports.ChainSelectUI=D;exports.ChainSelectWidget=ht;exports.chainAtom=Se;exports.chainNamespaceAtom=ge;exports.createChainAtoms=f;exports.defaultChainAtoms=x;exports.useCurrentChain=O;exports.useSelectChain=R;exports.version=M;//# sourceMappingURL=index.js.map
2
2
  //# sourceMappingURL=index.js.map
package/dist/index.js.map CHANGED
@@ -1 +1 @@
1
- {"version":3,"sources":["../src/version.ts","../src/states.ts","../src/chain-select.context.tsx","../src/components/chain-avatar.tsx","../src/constants.ts","../src/components/chain-select.desktop.ui.tsx","../src/components/chain-select.mobile.ui.tsx","../src/components/chain-select.ui.tsx","../src/hooks/useSelectChain.tsx","../src/hooks/useCurrentChain.tsx","../src/components/chain-select.widget.tsx"],"names":["version_default","storageOptions","createChainAtoms","storageKeyPrefix","chainKey","chainNamespaceKey","atomWithStorage","Chain","ChainNamespace","defaultAtoms","defaultChainAtoms","chainAtom","chainNamespaceAtom","ChainSelectStateContext","createContext","ChainSelectProvider","children","value","useMemo","jsx","CHAIN_ICON_MAP","SolanaIcon","EthereumIcon","BinanceIcon","ChainAvatar","chain","className","Icon","Avatar","chainIcon","capitalize","chainSlug","DEFAULT_CANDIDATES","chainAvatarSizeClass","size","ChainSelectDesktopUI","candidates","onSelectChain","isSwitching","handleAction","key","avatarSize","color","chainColor","jsxs","Dropdown","DropdownTrigger","Button","chainDisplayName","DropdownMenu","cn","it","DropdownItem","ChainSelectMobileUI","name","StyledTooltip","ChainSelectUI","isMobile","useScreen","useSelectChain","options","useContext","setChain","useSetAtom","setChainNamespace","setIsSwitching","useState","useCallback","chainToNamespace","e","useCurrentChain","useAtomValue","chainNamespace","ChainSelectWidget","onSwitchChain","onSuccess","onError","selectChain"],"mappings":"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","file":"index.js","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-chain-select\"] = \"0.1.72\";\n}\n\nexport default \"0.1.72\";\n","import { atomWithStorage } from \"jotai/utils\";\nimport { Chain, ChainNamespace } from \"@liberfi.io/types\";\n\nconst storageOptions = { getOnInit: true as const };\n\nexport type ChainAtoms = {\n chainAtom: ReturnType<typeof atomWithStorage<Chain>>;\n chainNamespaceAtom: ReturnType<typeof atomWithStorage<ChainNamespace>>;\n};\n\n/**\n * Creates chain state atoms with optional storage key prefix.\n * Use a prefix when multiple independent chain selectors must coexist on the same origin.\n */\nexport function createChainAtoms(storageKeyPrefix: string = \"\"): ChainAtoms {\n const chainKey = `${storageKeyPrefix}chain`;\n const chainNamespaceKey = `${storageKeyPrefix}chainNamespace`;\n return {\n chainAtom: atomWithStorage<Chain>(\n chainKey,\n Chain.SOLANA,\n undefined,\n storageOptions,\n ),\n chainNamespaceAtom: atomWithStorage<ChainNamespace>(\n chainNamespaceKey,\n ChainNamespace.SOLANA,\n undefined,\n storageOptions,\n ),\n };\n}\n\nconst defaultAtoms = createChainAtoms(\"\");\n\n/** Default atoms (used when not inside ChainSelectProvider) */\nexport const defaultChainAtoms = defaultAtoms;\n\n/** Current chain (default instance, key \"chain\") */\nexport const chainAtom = defaultAtoms.chainAtom;\n\n/** Current chain namespace (default instance, key \"chainNamespace\") */\nexport const chainNamespaceAtom = defaultAtoms.chainNamespaceAtom;\n","import { createContext, useMemo, type ReactNode } from \"react\";\nimport { createChainAtoms, defaultChainAtoms } from \"./states\";\n\nexport type ChainSelectStateContextValue = ReturnType<typeof createChainAtoms>;\n\nexport const ChainSelectStateContext =\n createContext<ChainSelectStateContextValue>(defaultChainAtoms);\n\nexport type ChainSelectProviderProps = {\n /** Optional storage key prefix so multiple instances can coexist (e.g. \"app1_\") */\n storageKeyPrefix?: string;\n children: ReactNode;\n};\n\nexport function ChainSelectProvider({\n storageKeyPrefix = \"\",\n children,\n}: ChainSelectProviderProps) {\n const value = useMemo(\n () => createChainAtoms(storageKeyPrefix),\n [storageKeyPrefix],\n );\n return (\n <ChainSelectStateContext.Provider value={value}>\n {children}\n </ChainSelectStateContext.Provider>\n );\n}\n","import type { ComponentType } from \"react\";\nimport { Chain } from \"@liberfi.io/types\";\nimport { Avatar, BinanceIcon, EthereumIcon, SolanaIcon } from \"@liberfi.io/ui\";\nimport { capitalize, chainIcon, chainSlug } from \"@liberfi.io/utils\";\n\nexport type ChainAvatarProps = {\n chain: Chain;\n className?: string;\n};\n\nconst CHAIN_ICON_MAP: Partial<\n Record<Chain, ComponentType<{ className?: string }>>\n> = {\n [Chain.SOLANA]: SolanaIcon,\n [Chain.ETHEREUM]: EthereumIcon,\n [Chain.BINANCE]: BinanceIcon,\n};\n\nexport function ChainAvatar({ chain, className }: ChainAvatarProps) {\n const Icon = CHAIN_ICON_MAP[chain];\n if (Icon) return <Icon className={className} />;\n return (\n <Avatar\n className={className}\n src={chainIcon(chain)}\n name={capitalize(chainSlug(chain) ?? \"\")}\n />\n );\n}\n","import { Chain } from \"@liberfi.io/types\";\n\n/** Default chain list when candidates are not provided */\nexport const DEFAULT_CANDIDATES: Chain[] = [\n Chain.SOLANA,\n Chain.ETHEREUM,\n Chain.BINANCE,\n];\n\n/** Maps the component `size` prop to Tailwind classes for chain avatar dimensions */\nexport function chainAvatarSizeClass(size?: \"sm\" | \"md\" | \"lg\"): string {\n if (size === \"sm\") return \"w-4 h-4\";\n if (size === \"lg\") return \"w-6 h-6\";\n return \"w-5 h-5\";\n}\n","import { type Key } from \"react\";\nimport { Chain } from \"@liberfi.io/types\";\nimport {\n Button,\n cn,\n Dropdown,\n DropdownItem,\n DropdownMenu,\n DropdownTrigger,\n} from \"@liberfi.io/ui\";\nimport { chainColor, chainDisplayName } from \"@liberfi.io/utils\";\nimport { chainAvatarSizeClass } from \"../constants\";\nimport { ChainAvatar } from \"./chain-avatar\";\n\nexport type ChainSelectDesktopUIProps = {\n size?: \"sm\" | \"md\" | \"lg\";\n candidates: Chain[];\n chain?: Chain;\n onSelectChain?: (chain: Chain) => void | Promise<void>;\n isSwitching?: boolean;\n className?: string;\n};\n\nexport function ChainSelectDesktopUI({\n size,\n candidates,\n chain = candidates[0],\n onSelectChain,\n isSwitching,\n className,\n}: ChainSelectDesktopUIProps) {\n const handleAction = (key: Key) => {\n onSelectChain?.(key as Chain);\n };\n\n const avatarSize = chainAvatarSizeClass(size);\n const color = chainColor(chain);\n\n return (\n <Dropdown\n placement=\"bottom-end\"\n className={className}\n classNames={{ content: \"w-38 bg-content1 border border-border\" }}\n >\n <DropdownTrigger>\n <Button\n isLoading={isSwitching}\n size={size}\n variant=\"bordered\"\n radius=\"full\"\n style={{\n borderColor: color ? `${color}60` : undefined,\n }}\n startContent={<ChainAvatar chain={chain} className={avatarSize} />}\n >\n {chainDisplayName(chain)}\n </Button>\n </DropdownTrigger>\n <DropdownMenu\n aria-label=\"Select chain\"\n selectionMode=\"single\"\n selectedKeys={chain ? [chain] : []}\n onAction={handleAction}\n classNames={{ list: \"gap-1\" }}\n itemClasses={{\n base: cn(\n \"rounded-md px-3\",\n size === \"sm\" ? \"h-8\" : size === \"lg\" ? \"h-12\" : \"h-10\",\n ),\n }}\n >\n {candidates.map((it) => (\n <DropdownItem\n key={it}\n startContent={<ChainAvatar chain={it} className={avatarSize} />}\n className={cn(\n it === chain ? \"bg-content2 text-foreground\" : \"text-neutral\",\n \"data-[hover=true]:bg-content2 data-[hover=true]:text-foreground\",\n \"data-[selectable=true]:focus:bg-content2 data-[selectable=true]:focus:text-foreground\",\n )}\n >\n {chainDisplayName(it)}\n </DropdownItem>\n ))}\n </DropdownMenu>\n </Dropdown>\n );\n}\n","import { Chain } from \"@liberfi.io/types\";\nimport { Button, cn, StyledTooltip } from \"@liberfi.io/ui\";\nimport { chainColor, chainDisplayName } from \"@liberfi.io/utils\";\nimport { chainAvatarSizeClass } from \"../constants\";\nimport { ChainAvatar } from \"./chain-avatar\";\n\nexport type ChainSelectMobileUIProps = {\n size?: \"sm\" | \"md\" | \"lg\";\n candidates: Chain[];\n chain?: Chain;\n onSelectChain?: (chain: Chain) => void | Promise<void>;\n isSwitching?: boolean;\n className?: string;\n};\n\nexport function ChainSelectMobileUI({\n size,\n candidates,\n chain = candidates[0],\n onSelectChain,\n isSwitching,\n className,\n}: ChainSelectMobileUIProps) {\n const avatarSize = chainAvatarSizeClass(size);\n\n return (\n <div\n role=\"group\"\n aria-label=\"Select chain\"\n className={cn(\"flex items-center gap-1\", className)}\n >\n {candidates.map((it) => {\n const color = chainColor(it);\n const name = chainDisplayName(it);\n return (\n <StyledTooltip content={name} key={it}>\n <Button\n isIconOnly\n aria-label={name}\n isDisabled={isSwitching}\n radius=\"full\"\n className={cn(\n \"min-w-0 min-h-0 border\",\n size === \"sm\"\n ? \"w-6 h-6\"\n : size === \"md\" || size === undefined\n ? \"w-7 h-7\"\n : \"w-8 h-8\",\n it === chain\n ? \"bg-content1 scale-110 hover:opacity-100\"\n : \"bg-transparent scale-90 opacity-50 hover:opacity-100 border-transparent\",\n )}\n style={\n it === chain && color ? { borderColor: `${color}` } : undefined\n }\n onPress={() => onSelectChain?.(it)}\n >\n <ChainAvatar chain={it} className={avatarSize} />\n </Button>\n </StyledTooltip>\n );\n })}\n </div>\n );\n}\n","import { Chain } from \"@liberfi.io/types\";\nimport { useScreen } from \"@liberfi.io/ui\";\nimport { DEFAULT_CANDIDATES } from \"../constants\";\nimport { ChainSelectDesktopUI } from \"./chain-select.desktop.ui\";\nimport { ChainSelectMobileUI } from \"./chain-select.mobile.ui\";\n\nexport type ChainSelectUIProps = {\n size?: \"sm\" | \"md\" | \"lg\";\n chain?: Chain;\n candidates?: Chain[];\n onSelectChain?: (chain: Chain) => void | Promise<void>;\n isSwitching?: boolean;\n className?: string;\n};\n\nexport function ChainSelectUI({\n size,\n candidates = DEFAULT_CANDIDATES,\n chain = candidates[0],\n onSelectChain,\n isSwitching,\n className,\n}: ChainSelectUIProps) {\n const { isMobile } = useScreen();\n\n if (isMobile) {\n return (\n <ChainSelectMobileUI\n size={size}\n chain={chain}\n onSelectChain={onSelectChain}\n isSwitching={isSwitching}\n candidates={candidates}\n className={className}\n />\n );\n } else {\n return (\n <ChainSelectDesktopUI\n size={size}\n chain={chain}\n onSelectChain={onSelectChain}\n isSwitching={isSwitching}\n candidates={candidates}\n className={className}\n />\n );\n }\n}\n","import { useCallback, useContext, useState } from \"react\";\nimport { useSetAtom } from \"jotai\";\nimport { Chain } from \"@liberfi.io/types\";\nimport { chainToNamespace } from \"@liberfi.io/utils\";\nimport { ChainSelectStateContext } from \"../chain-select.context\";\n\nexport type UseSelectChainOptions = {\n onSwitchChain?: (chain: Chain) => Promise<void>;\n /** Called when switching chain succeeds; caller can toast / analytics here */\n onSuccess?: (chain: Chain) => void;\n /** Called when switching chain fails; caller can toast / modal / report here */\n onError?: (error: unknown) => void;\n};\n\nexport function useSelectChain(options?: UseSelectChainOptions) {\n const { chainAtom, chainNamespaceAtom } = useContext(ChainSelectStateContext);\n const setChain = useSetAtom(chainAtom);\n const setChainNamespace = useSetAtom(chainNamespaceAtom);\n const [isSwitching, setIsSwitching] = useState(false);\n\n const selectChain = useCallback(\n async (chain: Chain) => {\n try {\n setIsSwitching(true);\n await options?.onSwitchChain?.(chain);\n\n setChainNamespace(chainToNamespace(chain));\n setChain(chain);\n options?.onSuccess?.(chain);\n } catch (e) {\n options?.onError?.(e);\n } finally {\n setIsSwitching(false);\n }\n },\n [\n setChain,\n setChainNamespace,\n options?.onSwitchChain,\n options?.onSuccess,\n options?.onError,\n ],\n );\n\n return { selectChain, isSwitching };\n}\n","import { useMemo, useContext } from \"react\";\nimport { useAtomValue } from \"jotai\";\nimport { ChainSelectStateContext } from \"../chain-select.context\";\n\nexport function useCurrentChain() {\n const { chainAtom, chainNamespaceAtom } = useContext(ChainSelectStateContext);\n const chain = useAtomValue(chainAtom);\n const chainNamespace = useAtomValue(chainNamespaceAtom);\n return useMemo(() => ({ chain, chainNamespace }), [chain, chainNamespace]);\n}\n","import { Chain } from \"@liberfi.io/types\";\nimport { useSelectChain, useCurrentChain } from \"../hooks\";\nimport { ChainSelectUI } from \"./chain-select.ui\";\n\nexport type ChainSelectWidgetProps = {\n size?: \"sm\" | \"md\" | \"lg\";\n className?: string;\n /** Optional list of chains to show. Defaults to [SOLANA, ETHEREUM, BINANCE] when not provided. */\n candidates?: Chain[];\n onSwitchChain?: (chain: Chain) => Promise<void>;\n /** Called when switching chain succeeds; caller can toast / analytics here */\n onSuccess?: (chain: Chain) => void;\n /** Called when switching chain fails; caller can toast / modal / report here */\n onError?: (error: unknown) => void;\n};\n\nexport function ChainSelectWidget({\n size,\n className,\n candidates,\n onSwitchChain,\n onSuccess,\n onError,\n}: ChainSelectWidgetProps) {\n const { chain } = useCurrentChain();\n const { selectChain, isSwitching } = useSelectChain({\n onSwitchChain,\n onSuccess,\n onError,\n });\n\n return (\n <ChainSelectUI\n chain={chain}\n candidates={candidates}\n onSelectChain={selectChain}\n isSwitching={isSwitching}\n size={size}\n className={className}\n />\n );\n}\n"]}
1
+ {"version":3,"sources":["../src/version.ts","../src/states.ts","../src/chain-select.context.tsx","../src/components/chain-avatar.tsx","../src/constants.ts","../src/components/chain-select.desktop.ui.tsx","../src/components/chain-select.mobile.ui.tsx","../src/components/chain-select.ui.tsx","../src/hooks/useSelectChain.tsx","../src/hooks/useCurrentChain.tsx","../src/components/chain-select.widget.tsx"],"names":["version_default","storageOptions","createChainAtoms","storageKeyPrefix","chainKey","chainNamespaceKey","atomWithStorage","Chain","ChainNamespace","defaultAtoms","defaultChainAtoms","chainAtom","chainNamespaceAtom","ChainSelectStateContext","createContext","ChainSelectProvider","children","value","useMemo","jsx","CHAIN_ICON_MAP","SolanaIcon","EthereumIcon","BinanceIcon","ChainAvatar","chain","className","Icon","Avatar","chainIcon","capitalize","chainSlug","DEFAULT_CANDIDATES","chainAvatarSizeClass","size","ChainSelectDesktopUI","candidates","onSelectChain","isSwitching","handleAction","key","avatarSize","color","chainColor","jsxs","Dropdown","DropdownTrigger","Button","chainDisplayName","DropdownMenu","cn","it","DropdownItem","ChainSelectMobileUI","name","StyledTooltip","ChainSelectUI","isMobile","useScreen","useSelectChain","options","useContext","setChain","useSetAtom","setChainNamespace","setIsSwitching","useState","useCallback","chainToNamespace","e","useCurrentChain","useAtomValue","chainNamespace","ChainSelectWidget","onSwitchChain","onSuccess","onError","selectChain"],"mappings":"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","file":"index.js","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-chain-select\"] = \"0.1.74\";\n}\n\nexport default \"0.1.74\";\n","import { atomWithStorage } from \"jotai/utils\";\nimport { Chain, ChainNamespace } from \"@liberfi.io/types\";\n\nconst storageOptions = { getOnInit: true as const };\n\nexport type ChainAtoms = {\n chainAtom: ReturnType<typeof atomWithStorage<Chain>>;\n chainNamespaceAtom: ReturnType<typeof atomWithStorage<ChainNamespace>>;\n};\n\n/**\n * Creates chain state atoms with optional storage key prefix.\n * Use a prefix when multiple independent chain selectors must coexist on the same origin.\n */\nexport function createChainAtoms(storageKeyPrefix: string = \"\"): ChainAtoms {\n const chainKey = `${storageKeyPrefix}chain`;\n const chainNamespaceKey = `${storageKeyPrefix}chainNamespace`;\n return {\n chainAtom: atomWithStorage<Chain>(\n chainKey,\n Chain.SOLANA,\n undefined,\n storageOptions,\n ),\n chainNamespaceAtom: atomWithStorage<ChainNamespace>(\n chainNamespaceKey,\n ChainNamespace.SOLANA,\n undefined,\n storageOptions,\n ),\n };\n}\n\nconst defaultAtoms = createChainAtoms(\"\");\n\n/** Default atoms (used when not inside ChainSelectProvider) */\nexport const defaultChainAtoms = defaultAtoms;\n\n/** Current chain (default instance, key \"chain\") */\nexport const chainAtom = defaultAtoms.chainAtom;\n\n/** Current chain namespace (default instance, key \"chainNamespace\") */\nexport const chainNamespaceAtom = defaultAtoms.chainNamespaceAtom;\n","import { createContext, useMemo, type ReactNode } from \"react\";\nimport { createChainAtoms, defaultChainAtoms } from \"./states\";\n\nexport type ChainSelectStateContextValue = ReturnType<typeof createChainAtoms>;\n\nexport const ChainSelectStateContext =\n createContext<ChainSelectStateContextValue>(defaultChainAtoms);\n\nexport type ChainSelectProviderProps = {\n /** Optional storage key prefix so multiple instances can coexist (e.g. \"app1_\") */\n storageKeyPrefix?: string;\n children: ReactNode;\n};\n\nexport function ChainSelectProvider({\n storageKeyPrefix = \"\",\n children,\n}: ChainSelectProviderProps) {\n const value = useMemo(\n () => createChainAtoms(storageKeyPrefix),\n [storageKeyPrefix],\n );\n return (\n <ChainSelectStateContext.Provider value={value}>\n {children}\n </ChainSelectStateContext.Provider>\n );\n}\n","import type { ComponentType } from \"react\";\nimport { Chain } from \"@liberfi.io/types\";\nimport { Avatar, BinanceIcon, EthereumIcon, SolanaIcon } from \"@liberfi.io/ui\";\nimport { capitalize, chainIcon, chainSlug } from \"@liberfi.io/utils\";\n\nexport type ChainAvatarProps = {\n chain: Chain;\n className?: string;\n};\n\nconst CHAIN_ICON_MAP: Partial<\n Record<Chain, ComponentType<{ className?: string }>>\n> = {\n [Chain.SOLANA]: SolanaIcon,\n [Chain.ETHEREUM]: EthereumIcon,\n [Chain.BINANCE]: BinanceIcon,\n};\n\nexport function ChainAvatar({ chain, className }: ChainAvatarProps) {\n const Icon = CHAIN_ICON_MAP[chain];\n if (Icon) return <Icon className={className} />;\n return (\n <Avatar\n className={className}\n src={chainIcon(chain)}\n name={capitalize(chainSlug(chain) ?? \"\")}\n />\n );\n}\n","import { Chain } from \"@liberfi.io/types\";\n\n/** Default chain list when candidates are not provided */\nexport const DEFAULT_CANDIDATES: Chain[] = [\n Chain.SOLANA,\n Chain.ETHEREUM,\n Chain.BINANCE,\n];\n\n/** Maps the component `size` prop to Tailwind classes for chain avatar dimensions */\nexport function chainAvatarSizeClass(size?: \"sm\" | \"md\" | \"lg\"): string {\n if (size === \"sm\") return \"w-4 h-4\";\n if (size === \"lg\") return \"w-6 h-6\";\n return \"w-5 h-5\";\n}\n","import { type Key } from \"react\";\nimport { Chain } from \"@liberfi.io/types\";\nimport {\n Button,\n cn,\n Dropdown,\n DropdownItem,\n DropdownMenu,\n DropdownTrigger,\n} from \"@liberfi.io/ui\";\nimport { chainColor, chainDisplayName } from \"@liberfi.io/utils\";\nimport { chainAvatarSizeClass } from \"../constants\";\nimport { ChainAvatar } from \"./chain-avatar\";\n\nexport type ChainSelectDesktopUIProps = {\n size?: \"sm\" | \"md\" | \"lg\";\n candidates: Chain[];\n chain?: Chain;\n onSelectChain?: (chain: Chain) => void | Promise<void>;\n isSwitching?: boolean;\n className?: string;\n};\n\nexport function ChainSelectDesktopUI({\n size,\n candidates,\n chain = candidates[0],\n onSelectChain,\n isSwitching,\n className,\n}: ChainSelectDesktopUIProps) {\n const handleAction = (key: Key) => {\n onSelectChain?.(key as Chain);\n };\n\n const avatarSize = chainAvatarSizeClass(size);\n const color = chainColor(chain);\n\n return (\n <Dropdown\n placement=\"bottom-end\"\n className={className}\n classNames={{ content: \"w-38 bg-content1 border border-border\" }}\n >\n <DropdownTrigger>\n <Button\n isLoading={isSwitching}\n size={size}\n variant=\"bordered\"\n radius=\"full\"\n style={{\n borderColor: color ? `${color}60` : undefined,\n }}\n startContent={<ChainAvatar chain={chain} className={avatarSize} />}\n >\n {chainDisplayName(chain)}\n </Button>\n </DropdownTrigger>\n <DropdownMenu\n aria-label=\"Select chain\"\n selectionMode=\"single\"\n selectedKeys={chain ? [chain] : []}\n onAction={handleAction}\n classNames={{ list: \"gap-1\" }}\n itemClasses={{\n base: cn(\n \"rounded-md px-3\",\n size === \"sm\" ? \"h-8\" : size === \"lg\" ? \"h-12\" : \"h-10\",\n ),\n }}\n >\n {candidates.map((it) => (\n <DropdownItem\n key={it}\n startContent={<ChainAvatar chain={it} className={avatarSize} />}\n className={cn(\n it === chain ? \"bg-content2 text-foreground\" : \"text-neutral\",\n \"data-[hover=true]:bg-content2 data-[hover=true]:text-foreground\",\n \"data-[selectable=true]:focus:bg-content2 data-[selectable=true]:focus:text-foreground\",\n )}\n >\n {chainDisplayName(it)}\n </DropdownItem>\n ))}\n </DropdownMenu>\n </Dropdown>\n );\n}\n","import { Chain } from \"@liberfi.io/types\";\nimport { Button, cn, StyledTooltip } from \"@liberfi.io/ui\";\nimport { chainColor, chainDisplayName } from \"@liberfi.io/utils\";\nimport { chainAvatarSizeClass } from \"../constants\";\nimport { ChainAvatar } from \"./chain-avatar\";\n\nexport type ChainSelectMobileUIProps = {\n size?: \"sm\" | \"md\" | \"lg\";\n candidates: Chain[];\n chain?: Chain;\n onSelectChain?: (chain: Chain) => void | Promise<void>;\n isSwitching?: boolean;\n className?: string;\n};\n\nexport function ChainSelectMobileUI({\n size,\n candidates,\n chain = candidates[0],\n onSelectChain,\n isSwitching,\n className,\n}: ChainSelectMobileUIProps) {\n const avatarSize = chainAvatarSizeClass(size);\n\n return (\n <div\n role=\"group\"\n aria-label=\"Select chain\"\n className={cn(\"flex items-center gap-1\", className)}\n >\n {candidates.map((it) => {\n const color = chainColor(it);\n const name = chainDisplayName(it);\n return (\n <StyledTooltip content={name} key={it}>\n <Button\n isIconOnly\n aria-label={name}\n isDisabled={isSwitching}\n radius=\"full\"\n className={cn(\n \"min-w-0 min-h-0 border\",\n size === \"sm\"\n ? \"w-6 h-6\"\n : size === \"md\" || size === undefined\n ? \"w-7 h-7\"\n : \"w-8 h-8\",\n it === chain\n ? \"bg-content1 scale-110 hover:opacity-100\"\n : \"bg-transparent scale-90 opacity-50 hover:opacity-100 border-transparent\",\n )}\n style={\n it === chain && color ? { borderColor: `${color}` } : undefined\n }\n onPress={() => onSelectChain?.(it)}\n >\n <ChainAvatar chain={it} className={avatarSize} />\n </Button>\n </StyledTooltip>\n );\n })}\n </div>\n );\n}\n","import { Chain } from \"@liberfi.io/types\";\nimport { useScreen } from \"@liberfi.io/ui\";\nimport { DEFAULT_CANDIDATES } from \"../constants\";\nimport { ChainSelectDesktopUI } from \"./chain-select.desktop.ui\";\nimport { ChainSelectMobileUI } from \"./chain-select.mobile.ui\";\n\nexport type ChainSelectUIProps = {\n size?: \"sm\" | \"md\" | \"lg\";\n chain?: Chain;\n candidates?: Chain[];\n onSelectChain?: (chain: Chain) => void | Promise<void>;\n isSwitching?: boolean;\n className?: string;\n};\n\nexport function ChainSelectUI({\n size,\n candidates = DEFAULT_CANDIDATES,\n chain = candidates[0],\n onSelectChain,\n isSwitching,\n className,\n}: ChainSelectUIProps) {\n const { isMobile } = useScreen();\n\n if (isMobile) {\n return (\n <ChainSelectMobileUI\n size={size}\n chain={chain}\n onSelectChain={onSelectChain}\n isSwitching={isSwitching}\n candidates={candidates}\n className={className}\n />\n );\n } else {\n return (\n <ChainSelectDesktopUI\n size={size}\n chain={chain}\n onSelectChain={onSelectChain}\n isSwitching={isSwitching}\n candidates={candidates}\n className={className}\n />\n );\n }\n}\n","import { useCallback, useContext, useState } from \"react\";\nimport { useSetAtom } from \"jotai\";\nimport { Chain } from \"@liberfi.io/types\";\nimport { chainToNamespace } from \"@liberfi.io/utils\";\nimport { ChainSelectStateContext } from \"../chain-select.context\";\n\nexport type UseSelectChainOptions = {\n onSwitchChain?: (chain: Chain) => Promise<void>;\n /** Called when switching chain succeeds; caller can toast / analytics here */\n onSuccess?: (chain: Chain) => void;\n /** Called when switching chain fails; caller can toast / modal / report here */\n onError?: (error: unknown) => void;\n};\n\nexport function useSelectChain(options?: UseSelectChainOptions) {\n const { chainAtom, chainNamespaceAtom } = useContext(ChainSelectStateContext);\n const setChain = useSetAtom(chainAtom);\n const setChainNamespace = useSetAtom(chainNamespaceAtom);\n const [isSwitching, setIsSwitching] = useState(false);\n\n const selectChain = useCallback(\n async (chain: Chain) => {\n try {\n setIsSwitching(true);\n await options?.onSwitchChain?.(chain);\n\n setChainNamespace(chainToNamespace(chain));\n setChain(chain);\n options?.onSuccess?.(chain);\n } catch (e) {\n options?.onError?.(e);\n } finally {\n setIsSwitching(false);\n }\n },\n [\n setChain,\n setChainNamespace,\n options?.onSwitchChain,\n options?.onSuccess,\n options?.onError,\n ],\n );\n\n return { selectChain, isSwitching };\n}\n","import { useMemo, useContext } from \"react\";\nimport { useAtomValue } from \"jotai\";\nimport { ChainSelectStateContext } from \"../chain-select.context\";\n\nexport function useCurrentChain() {\n const { chainAtom, chainNamespaceAtom } = useContext(ChainSelectStateContext);\n const chain = useAtomValue(chainAtom);\n const chainNamespace = useAtomValue(chainNamespaceAtom);\n return useMemo(() => ({ chain, chainNamespace }), [chain, chainNamespace]);\n}\n","import { Chain } from \"@liberfi.io/types\";\nimport { useSelectChain, useCurrentChain } from \"../hooks\";\nimport { ChainSelectUI } from \"./chain-select.ui\";\n\nexport type ChainSelectWidgetProps = {\n size?: \"sm\" | \"md\" | \"lg\";\n className?: string;\n /** Optional list of chains to show. Defaults to [SOLANA, ETHEREUM, BINANCE] when not provided. */\n candidates?: Chain[];\n onSwitchChain?: (chain: Chain) => Promise<void>;\n /** Called when switching chain succeeds; caller can toast / analytics here */\n onSuccess?: (chain: Chain) => void;\n /** Called when switching chain fails; caller can toast / modal / report here */\n onError?: (error: unknown) => void;\n};\n\nexport function ChainSelectWidget({\n size,\n className,\n candidates,\n onSwitchChain,\n onSuccess,\n onError,\n}: ChainSelectWidgetProps) {\n const { chain } = useCurrentChain();\n const { selectChain, isSwitching } = useSelectChain({\n onSwitchChain,\n onSuccess,\n onError,\n });\n\n return (\n <ChainSelectUI\n chain={chain}\n candidates={candidates}\n onSelectChain={selectChain}\n isSwitching={isSwitching}\n size={size}\n className={className}\n />\n );\n}\n"]}
package/dist/index.mjs CHANGED
@@ -1,2 +1,2 @@
1
- import {createContext,useMemo,useContext,useState,useCallback}from'react';import {atomWithStorage}from'jotai/utils';import {Chain,ChainNamespace}from'@liberfi.io/types';import {jsx,jsxs}from'react/jsx-runtime';import {BinanceIcon,EthereumIcon,SolanaIcon,Avatar,Dropdown,DropdownTrigger,Button,DropdownMenu,cn,DropdownItem,StyledTooltip,useScreen}from'@liberfi.io/ui';import {capitalize,chainIcon,chainSlug,chainColor,chainDisplayName,chainToNamespace}from'@liberfi.io/utils';import {useSetAtom,useAtomValue}from'jotai';typeof window<"u"&&(window.__LIBERFI_VERSION__=window.__LIBERFI_VERSION__||{},window.__LIBERFI_VERSION__["@liberfi.io/ui-chain-select"]="0.1.72");var M="0.1.72";var A={getOnInit:true};function f(e=""){let o=`${e}chain`,t=`${e}chainNamespace`;return {chainAtom:atomWithStorage(o,Chain.SOLANA,void 0,A),chainNamespaceAtom:atomWithStorage(t,ChainNamespace.SOLANA,void 0,A)}}var u=f(""),x=u,Se=u.chainAtom,ge=u.chainNamespaceAtom;var p=createContext(x);function ye({storageKeyPrefix:e="",children:o}){let t=useMemo(()=>f(e),[e]);return jsx(p.Provider,{value:t,children:o})}var J={[Chain.SOLANA]:SolanaIcon,[Chain.ETHEREUM]:EthereumIcon,[Chain.BINANCE]:BinanceIcon};function l({chain:e,className:o}){let t=J[e];return t?jsx(t,{className:o}):jsx(Avatar,{className:o,src:chainIcon(e),name:capitalize(chainSlug(e)??"")})}var w=[Chain.SOLANA,Chain.ETHEREUM,Chain.BINANCE];function C(e){return e==="sm"?"w-4 h-4":e==="lg"?"w-6 h-6":"w-5 h-5"}function b({size:e,candidates:o,chain:t=o[0],onSelectChain:n,isSwitching:i,className:s}){let m=c=>{n?.(c);},a=C(e),r=chainColor(t);return jsxs(Dropdown,{placement:"bottom-end",className:s,classNames:{content:"w-38 bg-content1 border border-border"},children:[jsx(DropdownTrigger,{children:jsx(Button,{isLoading:i,size:e,variant:"bordered",radius:"full",style:{borderColor:r?`${r}60`:void 0},startContent:jsx(l,{chain:t,className:a}),children:chainDisplayName(t)})}),jsx(DropdownMenu,{"aria-label":"Select chain",selectionMode:"single",selectedKeys:t?[t]:[],onAction:m,classNames:{list:"gap-1"},itemClasses:{base:cn("rounded-md px-3",e==="sm"?"h-8":e==="lg"?"h-12":"h-10")},children:o.map(c=>jsx(DropdownItem,{startContent:jsx(l,{chain:c,className:a}),className:cn(c===t?"bg-content2 text-foreground":"text-neutral","data-[hover=true]:bg-content2 data-[hover=true]:text-foreground","data-[selectable=true]:focus:bg-content2 data-[selectable=true]:focus:text-foreground"),children:chainDisplayName(c)},c))})]})}function P({size:e,candidates:o,chain:t=o[0],onSelectChain:n,isSwitching:i,className:s}){let m=C(e);return jsx("div",{role:"group","aria-label":"Select chain",className:cn("flex items-center gap-1",s),children:o.map(a=>{let r=chainColor(a),c=chainDisplayName(a);return jsx(StyledTooltip,{content:c,children:jsx(Button,{isIconOnly:true,"aria-label":c,isDisabled:i,radius:"full",className:cn("min-w-0 min-h-0 border",e==="sm"?"w-6 h-6":e==="md"||e===void 0?"w-7 h-7":"w-8 h-8",a===t?"bg-content1 scale-110 hover:opacity-100":"bg-transparent scale-90 opacity-50 hover:opacity-100 border-transparent"),style:a===t&&r?{borderColor:`${r}`}:void 0,onPress:()=>n?.(a),children:jsx(l,{chain:a,className:m})})},a)})})}function D({size:e,candidates:o=w,chain:t=o[0],onSelectChain:n,isSwitching:i,className:s}){let{isMobile:m}=useScreen();return m?jsx(P,{size:e,chain:t,onSelectChain:n,isSwitching:i,candidates:o,className:s}):jsx(b,{size:e,chain:t,onSelectChain:n,isSwitching:i,candidates:o,className:s})}function R(e){let{chainAtom:o,chainNamespaceAtom:t}=useContext(p),n=useSetAtom(o),i=useSetAtom(t),[s,m]=useState(false);return {selectChain:useCallback(async r=>{try{m(!0),await e?.onSwitchChain?.(r),i(chainToNamespace(r)),n(r),e?.onSuccess?.(r);}catch(c){e?.onError?.(c);}finally{m(false);}},[n,i,e?.onSwitchChain,e?.onSuccess,e?.onError]),isSwitching:s}}function O(){let{chainAtom:e,chainNamespaceAtom:o}=useContext(p),t=useAtomValue(e),n=useAtomValue(o);return useMemo(()=>({chain:t,chainNamespace:n}),[t,n])}function ht({size:e,className:o,candidates:t,onSwitchChain:n,onSuccess:i,onError:s}){let{chain:m}=O(),{selectChain:a,isSwitching:r}=R({onSwitchChain:n,onSuccess:i,onError:s});return jsx(D,{chain:m,candidates:t,onSelectChain:a,isSwitching:r,size:e,className:o})}export{l as ChainAvatar,b as ChainSelectDesktopUI,P as ChainSelectMobileUI,ye as ChainSelectProvider,p as ChainSelectStateContext,D as ChainSelectUI,ht as ChainSelectWidget,Se as chainAtom,ge as chainNamespaceAtom,f as createChainAtoms,x as defaultChainAtoms,O as useCurrentChain,R as useSelectChain,M as version};//# sourceMappingURL=index.mjs.map
1
+ import {createContext,useMemo,useContext,useState,useCallback}from'react';import {atomWithStorage}from'jotai/utils';import {Chain,ChainNamespace}from'@liberfi.io/types';import {jsx,jsxs}from'react/jsx-runtime';import {BinanceIcon,EthereumIcon,SolanaIcon,Avatar,Dropdown,DropdownTrigger,Button,DropdownMenu,cn,DropdownItem,StyledTooltip,useScreen}from'@liberfi.io/ui';import {capitalize,chainIcon,chainSlug,chainColor,chainDisplayName,chainToNamespace}from'@liberfi.io/utils';import {useSetAtom,useAtomValue}from'jotai';typeof window<"u"&&(window.__LIBERFI_VERSION__=window.__LIBERFI_VERSION__||{},window.__LIBERFI_VERSION__["@liberfi.io/ui-chain-select"]="0.1.74");var M="0.1.74";var A={getOnInit:true};function f(e=""){let o=`${e}chain`,t=`${e}chainNamespace`;return {chainAtom:atomWithStorage(o,Chain.SOLANA,void 0,A),chainNamespaceAtom:atomWithStorage(t,ChainNamespace.SOLANA,void 0,A)}}var u=f(""),x=u,Se=u.chainAtom,ge=u.chainNamespaceAtom;var p=createContext(x);function ye({storageKeyPrefix:e="",children:o}){let t=useMemo(()=>f(e),[e]);return jsx(p.Provider,{value:t,children:o})}var J={[Chain.SOLANA]:SolanaIcon,[Chain.ETHEREUM]:EthereumIcon,[Chain.BINANCE]:BinanceIcon};function l({chain:e,className:o}){let t=J[e];return t?jsx(t,{className:o}):jsx(Avatar,{className:o,src:chainIcon(e),name:capitalize(chainSlug(e)??"")})}var w=[Chain.SOLANA,Chain.ETHEREUM,Chain.BINANCE];function C(e){return e==="sm"?"w-4 h-4":e==="lg"?"w-6 h-6":"w-5 h-5"}function b({size:e,candidates:o,chain:t=o[0],onSelectChain:n,isSwitching:i,className:s}){let m=c=>{n?.(c);},a=C(e),r=chainColor(t);return jsxs(Dropdown,{placement:"bottom-end",className:s,classNames:{content:"w-38 bg-content1 border border-border"},children:[jsx(DropdownTrigger,{children:jsx(Button,{isLoading:i,size:e,variant:"bordered",radius:"full",style:{borderColor:r?`${r}60`:void 0},startContent:jsx(l,{chain:t,className:a}),children:chainDisplayName(t)})}),jsx(DropdownMenu,{"aria-label":"Select chain",selectionMode:"single",selectedKeys:t?[t]:[],onAction:m,classNames:{list:"gap-1"},itemClasses:{base:cn("rounded-md px-3",e==="sm"?"h-8":e==="lg"?"h-12":"h-10")},children:o.map(c=>jsx(DropdownItem,{startContent:jsx(l,{chain:c,className:a}),className:cn(c===t?"bg-content2 text-foreground":"text-neutral","data-[hover=true]:bg-content2 data-[hover=true]:text-foreground","data-[selectable=true]:focus:bg-content2 data-[selectable=true]:focus:text-foreground"),children:chainDisplayName(c)},c))})]})}function P({size:e,candidates:o,chain:t=o[0],onSelectChain:n,isSwitching:i,className:s}){let m=C(e);return jsx("div",{role:"group","aria-label":"Select chain",className:cn("flex items-center gap-1",s),children:o.map(a=>{let r=chainColor(a),c=chainDisplayName(a);return jsx(StyledTooltip,{content:c,children:jsx(Button,{isIconOnly:true,"aria-label":c,isDisabled:i,radius:"full",className:cn("min-w-0 min-h-0 border",e==="sm"?"w-6 h-6":e==="md"||e===void 0?"w-7 h-7":"w-8 h-8",a===t?"bg-content1 scale-110 hover:opacity-100":"bg-transparent scale-90 opacity-50 hover:opacity-100 border-transparent"),style:a===t&&r?{borderColor:`${r}`}:void 0,onPress:()=>n?.(a),children:jsx(l,{chain:a,className:m})})},a)})})}function D({size:e,candidates:o=w,chain:t=o[0],onSelectChain:n,isSwitching:i,className:s}){let{isMobile:m}=useScreen();return m?jsx(P,{size:e,chain:t,onSelectChain:n,isSwitching:i,candidates:o,className:s}):jsx(b,{size:e,chain:t,onSelectChain:n,isSwitching:i,candidates:o,className:s})}function R(e){let{chainAtom:o,chainNamespaceAtom:t}=useContext(p),n=useSetAtom(o),i=useSetAtom(t),[s,m]=useState(false);return {selectChain:useCallback(async r=>{try{m(!0),await e?.onSwitchChain?.(r),i(chainToNamespace(r)),n(r),e?.onSuccess?.(r);}catch(c){e?.onError?.(c);}finally{m(false);}},[n,i,e?.onSwitchChain,e?.onSuccess,e?.onError]),isSwitching:s}}function O(){let{chainAtom:e,chainNamespaceAtom:o}=useContext(p),t=useAtomValue(e),n=useAtomValue(o);return useMemo(()=>({chain:t,chainNamespace:n}),[t,n])}function ht({size:e,className:o,candidates:t,onSwitchChain:n,onSuccess:i,onError:s}){let{chain:m}=O(),{selectChain:a,isSwitching:r}=R({onSwitchChain:n,onSuccess:i,onError:s});return jsx(D,{chain:m,candidates:t,onSelectChain:a,isSwitching:r,size:e,className:o})}export{l as ChainAvatar,b as ChainSelectDesktopUI,P as ChainSelectMobileUI,ye as ChainSelectProvider,p as ChainSelectStateContext,D as ChainSelectUI,ht as ChainSelectWidget,Se as chainAtom,ge as chainNamespaceAtom,f as createChainAtoms,x as defaultChainAtoms,O as useCurrentChain,R as useSelectChain,M as version};//# sourceMappingURL=index.mjs.map
2
2
  //# sourceMappingURL=index.mjs.map
@@ -1 +1 @@
1
- {"version":3,"sources":["../src/version.ts","../src/states.ts","../src/chain-select.context.tsx","../src/components/chain-avatar.tsx","../src/constants.ts","../src/components/chain-select.desktop.ui.tsx","../src/components/chain-select.mobile.ui.tsx","../src/components/chain-select.ui.tsx","../src/hooks/useSelectChain.tsx","../src/hooks/useCurrentChain.tsx","../src/components/chain-select.widget.tsx"],"names":["version_default","storageOptions","createChainAtoms","storageKeyPrefix","chainKey","chainNamespaceKey","atomWithStorage","Chain","ChainNamespace","defaultAtoms","defaultChainAtoms","chainAtom","chainNamespaceAtom","ChainSelectStateContext","createContext","ChainSelectProvider","children","value","useMemo","jsx","CHAIN_ICON_MAP","SolanaIcon","EthereumIcon","BinanceIcon","ChainAvatar","chain","className","Icon","Avatar","chainIcon","capitalize","chainSlug","DEFAULT_CANDIDATES","chainAvatarSizeClass","size","ChainSelectDesktopUI","candidates","onSelectChain","isSwitching","handleAction","key","avatarSize","color","chainColor","jsxs","Dropdown","DropdownTrigger","Button","chainDisplayName","DropdownMenu","cn","it","DropdownItem","ChainSelectMobileUI","name","StyledTooltip","ChainSelectUI","isMobile","useScreen","useSelectChain","options","useContext","setChain","useSetAtom","setChainNamespace","setIsSwitching","useState","useCallback","chainToNamespace","e","useCurrentChain","useAtomValue","chainNamespace","ChainSelectWidget","onSwitchChain","onSuccess","onError","selectChain"],"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-chain-select\"] = \"0.1.72\";\n}\n\nexport default \"0.1.72\";\n","import { atomWithStorage } from \"jotai/utils\";\nimport { Chain, ChainNamespace } from \"@liberfi.io/types\";\n\nconst storageOptions = { getOnInit: true as const };\n\nexport type ChainAtoms = {\n chainAtom: ReturnType<typeof atomWithStorage<Chain>>;\n chainNamespaceAtom: ReturnType<typeof atomWithStorage<ChainNamespace>>;\n};\n\n/**\n * Creates chain state atoms with optional storage key prefix.\n * Use a prefix when multiple independent chain selectors must coexist on the same origin.\n */\nexport function createChainAtoms(storageKeyPrefix: string = \"\"): ChainAtoms {\n const chainKey = `${storageKeyPrefix}chain`;\n const chainNamespaceKey = `${storageKeyPrefix}chainNamespace`;\n return {\n chainAtom: atomWithStorage<Chain>(\n chainKey,\n Chain.SOLANA,\n undefined,\n storageOptions,\n ),\n chainNamespaceAtom: atomWithStorage<ChainNamespace>(\n chainNamespaceKey,\n ChainNamespace.SOLANA,\n undefined,\n storageOptions,\n ),\n };\n}\n\nconst defaultAtoms = createChainAtoms(\"\");\n\n/** Default atoms (used when not inside ChainSelectProvider) */\nexport const defaultChainAtoms = defaultAtoms;\n\n/** Current chain (default instance, key \"chain\") */\nexport const chainAtom = defaultAtoms.chainAtom;\n\n/** Current chain namespace (default instance, key \"chainNamespace\") */\nexport const chainNamespaceAtom = defaultAtoms.chainNamespaceAtom;\n","import { createContext, useMemo, type ReactNode } from \"react\";\nimport { createChainAtoms, defaultChainAtoms } from \"./states\";\n\nexport type ChainSelectStateContextValue = ReturnType<typeof createChainAtoms>;\n\nexport const ChainSelectStateContext =\n createContext<ChainSelectStateContextValue>(defaultChainAtoms);\n\nexport type ChainSelectProviderProps = {\n /** Optional storage key prefix so multiple instances can coexist (e.g. \"app1_\") */\n storageKeyPrefix?: string;\n children: ReactNode;\n};\n\nexport function ChainSelectProvider({\n storageKeyPrefix = \"\",\n children,\n}: ChainSelectProviderProps) {\n const value = useMemo(\n () => createChainAtoms(storageKeyPrefix),\n [storageKeyPrefix],\n );\n return (\n <ChainSelectStateContext.Provider value={value}>\n {children}\n </ChainSelectStateContext.Provider>\n );\n}\n","import type { ComponentType } from \"react\";\nimport { Chain } from \"@liberfi.io/types\";\nimport { Avatar, BinanceIcon, EthereumIcon, SolanaIcon } from \"@liberfi.io/ui\";\nimport { capitalize, chainIcon, chainSlug } from \"@liberfi.io/utils\";\n\nexport type ChainAvatarProps = {\n chain: Chain;\n className?: string;\n};\n\nconst CHAIN_ICON_MAP: Partial<\n Record<Chain, ComponentType<{ className?: string }>>\n> = {\n [Chain.SOLANA]: SolanaIcon,\n [Chain.ETHEREUM]: EthereumIcon,\n [Chain.BINANCE]: BinanceIcon,\n};\n\nexport function ChainAvatar({ chain, className }: ChainAvatarProps) {\n const Icon = CHAIN_ICON_MAP[chain];\n if (Icon) return <Icon className={className} />;\n return (\n <Avatar\n className={className}\n src={chainIcon(chain)}\n name={capitalize(chainSlug(chain) ?? \"\")}\n />\n );\n}\n","import { Chain } from \"@liberfi.io/types\";\n\n/** Default chain list when candidates are not provided */\nexport const DEFAULT_CANDIDATES: Chain[] = [\n Chain.SOLANA,\n Chain.ETHEREUM,\n Chain.BINANCE,\n];\n\n/** Maps the component `size` prop to Tailwind classes for chain avatar dimensions */\nexport function chainAvatarSizeClass(size?: \"sm\" | \"md\" | \"lg\"): string {\n if (size === \"sm\") return \"w-4 h-4\";\n if (size === \"lg\") return \"w-6 h-6\";\n return \"w-5 h-5\";\n}\n","import { type Key } from \"react\";\nimport { Chain } from \"@liberfi.io/types\";\nimport {\n Button,\n cn,\n Dropdown,\n DropdownItem,\n DropdownMenu,\n DropdownTrigger,\n} from \"@liberfi.io/ui\";\nimport { chainColor, chainDisplayName } from \"@liberfi.io/utils\";\nimport { chainAvatarSizeClass } from \"../constants\";\nimport { ChainAvatar } from \"./chain-avatar\";\n\nexport type ChainSelectDesktopUIProps = {\n size?: \"sm\" | \"md\" | \"lg\";\n candidates: Chain[];\n chain?: Chain;\n onSelectChain?: (chain: Chain) => void | Promise<void>;\n isSwitching?: boolean;\n className?: string;\n};\n\nexport function ChainSelectDesktopUI({\n size,\n candidates,\n chain = candidates[0],\n onSelectChain,\n isSwitching,\n className,\n}: ChainSelectDesktopUIProps) {\n const handleAction = (key: Key) => {\n onSelectChain?.(key as Chain);\n };\n\n const avatarSize = chainAvatarSizeClass(size);\n const color = chainColor(chain);\n\n return (\n <Dropdown\n placement=\"bottom-end\"\n className={className}\n classNames={{ content: \"w-38 bg-content1 border border-border\" }}\n >\n <DropdownTrigger>\n <Button\n isLoading={isSwitching}\n size={size}\n variant=\"bordered\"\n radius=\"full\"\n style={{\n borderColor: color ? `${color}60` : undefined,\n }}\n startContent={<ChainAvatar chain={chain} className={avatarSize} />}\n >\n {chainDisplayName(chain)}\n </Button>\n </DropdownTrigger>\n <DropdownMenu\n aria-label=\"Select chain\"\n selectionMode=\"single\"\n selectedKeys={chain ? [chain] : []}\n onAction={handleAction}\n classNames={{ list: \"gap-1\" }}\n itemClasses={{\n base: cn(\n \"rounded-md px-3\",\n size === \"sm\" ? \"h-8\" : size === \"lg\" ? \"h-12\" : \"h-10\",\n ),\n }}\n >\n {candidates.map((it) => (\n <DropdownItem\n key={it}\n startContent={<ChainAvatar chain={it} className={avatarSize} />}\n className={cn(\n it === chain ? \"bg-content2 text-foreground\" : \"text-neutral\",\n \"data-[hover=true]:bg-content2 data-[hover=true]:text-foreground\",\n \"data-[selectable=true]:focus:bg-content2 data-[selectable=true]:focus:text-foreground\",\n )}\n >\n {chainDisplayName(it)}\n </DropdownItem>\n ))}\n </DropdownMenu>\n </Dropdown>\n );\n}\n","import { Chain } from \"@liberfi.io/types\";\nimport { Button, cn, StyledTooltip } from \"@liberfi.io/ui\";\nimport { chainColor, chainDisplayName } from \"@liberfi.io/utils\";\nimport { chainAvatarSizeClass } from \"../constants\";\nimport { ChainAvatar } from \"./chain-avatar\";\n\nexport type ChainSelectMobileUIProps = {\n size?: \"sm\" | \"md\" | \"lg\";\n candidates: Chain[];\n chain?: Chain;\n onSelectChain?: (chain: Chain) => void | Promise<void>;\n isSwitching?: boolean;\n className?: string;\n};\n\nexport function ChainSelectMobileUI({\n size,\n candidates,\n chain = candidates[0],\n onSelectChain,\n isSwitching,\n className,\n}: ChainSelectMobileUIProps) {\n const avatarSize = chainAvatarSizeClass(size);\n\n return (\n <div\n role=\"group\"\n aria-label=\"Select chain\"\n className={cn(\"flex items-center gap-1\", className)}\n >\n {candidates.map((it) => {\n const color = chainColor(it);\n const name = chainDisplayName(it);\n return (\n <StyledTooltip content={name} key={it}>\n <Button\n isIconOnly\n aria-label={name}\n isDisabled={isSwitching}\n radius=\"full\"\n className={cn(\n \"min-w-0 min-h-0 border\",\n size === \"sm\"\n ? \"w-6 h-6\"\n : size === \"md\" || size === undefined\n ? \"w-7 h-7\"\n : \"w-8 h-8\",\n it === chain\n ? \"bg-content1 scale-110 hover:opacity-100\"\n : \"bg-transparent scale-90 opacity-50 hover:opacity-100 border-transparent\",\n )}\n style={\n it === chain && color ? { borderColor: `${color}` } : undefined\n }\n onPress={() => onSelectChain?.(it)}\n >\n <ChainAvatar chain={it} className={avatarSize} />\n </Button>\n </StyledTooltip>\n );\n })}\n </div>\n );\n}\n","import { Chain } from \"@liberfi.io/types\";\nimport { useScreen } from \"@liberfi.io/ui\";\nimport { DEFAULT_CANDIDATES } from \"../constants\";\nimport { ChainSelectDesktopUI } from \"./chain-select.desktop.ui\";\nimport { ChainSelectMobileUI } from \"./chain-select.mobile.ui\";\n\nexport type ChainSelectUIProps = {\n size?: \"sm\" | \"md\" | \"lg\";\n chain?: Chain;\n candidates?: Chain[];\n onSelectChain?: (chain: Chain) => void | Promise<void>;\n isSwitching?: boolean;\n className?: string;\n};\n\nexport function ChainSelectUI({\n size,\n candidates = DEFAULT_CANDIDATES,\n chain = candidates[0],\n onSelectChain,\n isSwitching,\n className,\n}: ChainSelectUIProps) {\n const { isMobile } = useScreen();\n\n if (isMobile) {\n return (\n <ChainSelectMobileUI\n size={size}\n chain={chain}\n onSelectChain={onSelectChain}\n isSwitching={isSwitching}\n candidates={candidates}\n className={className}\n />\n );\n } else {\n return (\n <ChainSelectDesktopUI\n size={size}\n chain={chain}\n onSelectChain={onSelectChain}\n isSwitching={isSwitching}\n candidates={candidates}\n className={className}\n />\n );\n }\n}\n","import { useCallback, useContext, useState } from \"react\";\nimport { useSetAtom } from \"jotai\";\nimport { Chain } from \"@liberfi.io/types\";\nimport { chainToNamespace } from \"@liberfi.io/utils\";\nimport { ChainSelectStateContext } from \"../chain-select.context\";\n\nexport type UseSelectChainOptions = {\n onSwitchChain?: (chain: Chain) => Promise<void>;\n /** Called when switching chain succeeds; caller can toast / analytics here */\n onSuccess?: (chain: Chain) => void;\n /** Called when switching chain fails; caller can toast / modal / report here */\n onError?: (error: unknown) => void;\n};\n\nexport function useSelectChain(options?: UseSelectChainOptions) {\n const { chainAtom, chainNamespaceAtom } = useContext(ChainSelectStateContext);\n const setChain = useSetAtom(chainAtom);\n const setChainNamespace = useSetAtom(chainNamespaceAtom);\n const [isSwitching, setIsSwitching] = useState(false);\n\n const selectChain = useCallback(\n async (chain: Chain) => {\n try {\n setIsSwitching(true);\n await options?.onSwitchChain?.(chain);\n\n setChainNamespace(chainToNamespace(chain));\n setChain(chain);\n options?.onSuccess?.(chain);\n } catch (e) {\n options?.onError?.(e);\n } finally {\n setIsSwitching(false);\n }\n },\n [\n setChain,\n setChainNamespace,\n options?.onSwitchChain,\n options?.onSuccess,\n options?.onError,\n ],\n );\n\n return { selectChain, isSwitching };\n}\n","import { useMemo, useContext } from \"react\";\nimport { useAtomValue } from \"jotai\";\nimport { ChainSelectStateContext } from \"../chain-select.context\";\n\nexport function useCurrentChain() {\n const { chainAtom, chainNamespaceAtom } = useContext(ChainSelectStateContext);\n const chain = useAtomValue(chainAtom);\n const chainNamespace = useAtomValue(chainNamespaceAtom);\n return useMemo(() => ({ chain, chainNamespace }), [chain, chainNamespace]);\n}\n","import { Chain } from \"@liberfi.io/types\";\nimport { useSelectChain, useCurrentChain } from \"../hooks\";\nimport { ChainSelectUI } from \"./chain-select.ui\";\n\nexport type ChainSelectWidgetProps = {\n size?: \"sm\" | \"md\" | \"lg\";\n className?: string;\n /** Optional list of chains to show. Defaults to [SOLANA, ETHEREUM, BINANCE] when not provided. */\n candidates?: Chain[];\n onSwitchChain?: (chain: Chain) => Promise<void>;\n /** Called when switching chain succeeds; caller can toast / analytics here */\n onSuccess?: (chain: Chain) => void;\n /** Called when switching chain fails; caller can toast / modal / report here */\n onError?: (error: unknown) => void;\n};\n\nexport function ChainSelectWidget({\n size,\n className,\n candidates,\n onSwitchChain,\n onSuccess,\n onError,\n}: ChainSelectWidgetProps) {\n const { chain } = useCurrentChain();\n const { selectChain, isSwitching } = useSelectChain({\n onSwitchChain,\n onSuccess,\n onError,\n });\n\n return (\n <ChainSelectUI\n chain={chain}\n candidates={candidates}\n onSelectChain={selectChain}\n isSwitching={isSwitching}\n size={size}\n className={className}\n />\n );\n}\n"]}
1
+ {"version":3,"sources":["../src/version.ts","../src/states.ts","../src/chain-select.context.tsx","../src/components/chain-avatar.tsx","../src/constants.ts","../src/components/chain-select.desktop.ui.tsx","../src/components/chain-select.mobile.ui.tsx","../src/components/chain-select.ui.tsx","../src/hooks/useSelectChain.tsx","../src/hooks/useCurrentChain.tsx","../src/components/chain-select.widget.tsx"],"names":["version_default","storageOptions","createChainAtoms","storageKeyPrefix","chainKey","chainNamespaceKey","atomWithStorage","Chain","ChainNamespace","defaultAtoms","defaultChainAtoms","chainAtom","chainNamespaceAtom","ChainSelectStateContext","createContext","ChainSelectProvider","children","value","useMemo","jsx","CHAIN_ICON_MAP","SolanaIcon","EthereumIcon","BinanceIcon","ChainAvatar","chain","className","Icon","Avatar","chainIcon","capitalize","chainSlug","DEFAULT_CANDIDATES","chainAvatarSizeClass","size","ChainSelectDesktopUI","candidates","onSelectChain","isSwitching","handleAction","key","avatarSize","color","chainColor","jsxs","Dropdown","DropdownTrigger","Button","chainDisplayName","DropdownMenu","cn","it","DropdownItem","ChainSelectMobileUI","name","StyledTooltip","ChainSelectUI","isMobile","useScreen","useSelectChain","options","useContext","setChain","useSetAtom","setChainNamespace","setIsSwitching","useState","useCallback","chainToNamespace","e","useCurrentChain","useAtomValue","chainNamespace","ChainSelectWidget","onSwitchChain","onSuccess","onError","selectChain"],"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-chain-select\"] = \"0.1.74\";\n}\n\nexport default \"0.1.74\";\n","import { atomWithStorage } from \"jotai/utils\";\nimport { Chain, ChainNamespace } from \"@liberfi.io/types\";\n\nconst storageOptions = { getOnInit: true as const };\n\nexport type ChainAtoms = {\n chainAtom: ReturnType<typeof atomWithStorage<Chain>>;\n chainNamespaceAtom: ReturnType<typeof atomWithStorage<ChainNamespace>>;\n};\n\n/**\n * Creates chain state atoms with optional storage key prefix.\n * Use a prefix when multiple independent chain selectors must coexist on the same origin.\n */\nexport function createChainAtoms(storageKeyPrefix: string = \"\"): ChainAtoms {\n const chainKey = `${storageKeyPrefix}chain`;\n const chainNamespaceKey = `${storageKeyPrefix}chainNamespace`;\n return {\n chainAtom: atomWithStorage<Chain>(\n chainKey,\n Chain.SOLANA,\n undefined,\n storageOptions,\n ),\n chainNamespaceAtom: atomWithStorage<ChainNamespace>(\n chainNamespaceKey,\n ChainNamespace.SOLANA,\n undefined,\n storageOptions,\n ),\n };\n}\n\nconst defaultAtoms = createChainAtoms(\"\");\n\n/** Default atoms (used when not inside ChainSelectProvider) */\nexport const defaultChainAtoms = defaultAtoms;\n\n/** Current chain (default instance, key \"chain\") */\nexport const chainAtom = defaultAtoms.chainAtom;\n\n/** Current chain namespace (default instance, key \"chainNamespace\") */\nexport const chainNamespaceAtom = defaultAtoms.chainNamespaceAtom;\n","import { createContext, useMemo, type ReactNode } from \"react\";\nimport { createChainAtoms, defaultChainAtoms } from \"./states\";\n\nexport type ChainSelectStateContextValue = ReturnType<typeof createChainAtoms>;\n\nexport const ChainSelectStateContext =\n createContext<ChainSelectStateContextValue>(defaultChainAtoms);\n\nexport type ChainSelectProviderProps = {\n /** Optional storage key prefix so multiple instances can coexist (e.g. \"app1_\") */\n storageKeyPrefix?: string;\n children: ReactNode;\n};\n\nexport function ChainSelectProvider({\n storageKeyPrefix = \"\",\n children,\n}: ChainSelectProviderProps) {\n const value = useMemo(\n () => createChainAtoms(storageKeyPrefix),\n [storageKeyPrefix],\n );\n return (\n <ChainSelectStateContext.Provider value={value}>\n {children}\n </ChainSelectStateContext.Provider>\n );\n}\n","import type { ComponentType } from \"react\";\nimport { Chain } from \"@liberfi.io/types\";\nimport { Avatar, BinanceIcon, EthereumIcon, SolanaIcon } from \"@liberfi.io/ui\";\nimport { capitalize, chainIcon, chainSlug } from \"@liberfi.io/utils\";\n\nexport type ChainAvatarProps = {\n chain: Chain;\n className?: string;\n};\n\nconst CHAIN_ICON_MAP: Partial<\n Record<Chain, ComponentType<{ className?: string }>>\n> = {\n [Chain.SOLANA]: SolanaIcon,\n [Chain.ETHEREUM]: EthereumIcon,\n [Chain.BINANCE]: BinanceIcon,\n};\n\nexport function ChainAvatar({ chain, className }: ChainAvatarProps) {\n const Icon = CHAIN_ICON_MAP[chain];\n if (Icon) return <Icon className={className} />;\n return (\n <Avatar\n className={className}\n src={chainIcon(chain)}\n name={capitalize(chainSlug(chain) ?? \"\")}\n />\n );\n}\n","import { Chain } from \"@liberfi.io/types\";\n\n/** Default chain list when candidates are not provided */\nexport const DEFAULT_CANDIDATES: Chain[] = [\n Chain.SOLANA,\n Chain.ETHEREUM,\n Chain.BINANCE,\n];\n\n/** Maps the component `size` prop to Tailwind classes for chain avatar dimensions */\nexport function chainAvatarSizeClass(size?: \"sm\" | \"md\" | \"lg\"): string {\n if (size === \"sm\") return \"w-4 h-4\";\n if (size === \"lg\") return \"w-6 h-6\";\n return \"w-5 h-5\";\n}\n","import { type Key } from \"react\";\nimport { Chain } from \"@liberfi.io/types\";\nimport {\n Button,\n cn,\n Dropdown,\n DropdownItem,\n DropdownMenu,\n DropdownTrigger,\n} from \"@liberfi.io/ui\";\nimport { chainColor, chainDisplayName } from \"@liberfi.io/utils\";\nimport { chainAvatarSizeClass } from \"../constants\";\nimport { ChainAvatar } from \"./chain-avatar\";\n\nexport type ChainSelectDesktopUIProps = {\n size?: \"sm\" | \"md\" | \"lg\";\n candidates: Chain[];\n chain?: Chain;\n onSelectChain?: (chain: Chain) => void | Promise<void>;\n isSwitching?: boolean;\n className?: string;\n};\n\nexport function ChainSelectDesktopUI({\n size,\n candidates,\n chain = candidates[0],\n onSelectChain,\n isSwitching,\n className,\n}: ChainSelectDesktopUIProps) {\n const handleAction = (key: Key) => {\n onSelectChain?.(key as Chain);\n };\n\n const avatarSize = chainAvatarSizeClass(size);\n const color = chainColor(chain);\n\n return (\n <Dropdown\n placement=\"bottom-end\"\n className={className}\n classNames={{ content: \"w-38 bg-content1 border border-border\" }}\n >\n <DropdownTrigger>\n <Button\n isLoading={isSwitching}\n size={size}\n variant=\"bordered\"\n radius=\"full\"\n style={{\n borderColor: color ? `${color}60` : undefined,\n }}\n startContent={<ChainAvatar chain={chain} className={avatarSize} />}\n >\n {chainDisplayName(chain)}\n </Button>\n </DropdownTrigger>\n <DropdownMenu\n aria-label=\"Select chain\"\n selectionMode=\"single\"\n selectedKeys={chain ? [chain] : []}\n onAction={handleAction}\n classNames={{ list: \"gap-1\" }}\n itemClasses={{\n base: cn(\n \"rounded-md px-3\",\n size === \"sm\" ? \"h-8\" : size === \"lg\" ? \"h-12\" : \"h-10\",\n ),\n }}\n >\n {candidates.map((it) => (\n <DropdownItem\n key={it}\n startContent={<ChainAvatar chain={it} className={avatarSize} />}\n className={cn(\n it === chain ? \"bg-content2 text-foreground\" : \"text-neutral\",\n \"data-[hover=true]:bg-content2 data-[hover=true]:text-foreground\",\n \"data-[selectable=true]:focus:bg-content2 data-[selectable=true]:focus:text-foreground\",\n )}\n >\n {chainDisplayName(it)}\n </DropdownItem>\n ))}\n </DropdownMenu>\n </Dropdown>\n );\n}\n","import { Chain } from \"@liberfi.io/types\";\nimport { Button, cn, StyledTooltip } from \"@liberfi.io/ui\";\nimport { chainColor, chainDisplayName } from \"@liberfi.io/utils\";\nimport { chainAvatarSizeClass } from \"../constants\";\nimport { ChainAvatar } from \"./chain-avatar\";\n\nexport type ChainSelectMobileUIProps = {\n size?: \"sm\" | \"md\" | \"lg\";\n candidates: Chain[];\n chain?: Chain;\n onSelectChain?: (chain: Chain) => void | Promise<void>;\n isSwitching?: boolean;\n className?: string;\n};\n\nexport function ChainSelectMobileUI({\n size,\n candidates,\n chain = candidates[0],\n onSelectChain,\n isSwitching,\n className,\n}: ChainSelectMobileUIProps) {\n const avatarSize = chainAvatarSizeClass(size);\n\n return (\n <div\n role=\"group\"\n aria-label=\"Select chain\"\n className={cn(\"flex items-center gap-1\", className)}\n >\n {candidates.map((it) => {\n const color = chainColor(it);\n const name = chainDisplayName(it);\n return (\n <StyledTooltip content={name} key={it}>\n <Button\n isIconOnly\n aria-label={name}\n isDisabled={isSwitching}\n radius=\"full\"\n className={cn(\n \"min-w-0 min-h-0 border\",\n size === \"sm\"\n ? \"w-6 h-6\"\n : size === \"md\" || size === undefined\n ? \"w-7 h-7\"\n : \"w-8 h-8\",\n it === chain\n ? \"bg-content1 scale-110 hover:opacity-100\"\n : \"bg-transparent scale-90 opacity-50 hover:opacity-100 border-transparent\",\n )}\n style={\n it === chain && color ? { borderColor: `${color}` } : undefined\n }\n onPress={() => onSelectChain?.(it)}\n >\n <ChainAvatar chain={it} className={avatarSize} />\n </Button>\n </StyledTooltip>\n );\n })}\n </div>\n );\n}\n","import { Chain } from \"@liberfi.io/types\";\nimport { useScreen } from \"@liberfi.io/ui\";\nimport { DEFAULT_CANDIDATES } from \"../constants\";\nimport { ChainSelectDesktopUI } from \"./chain-select.desktop.ui\";\nimport { ChainSelectMobileUI } from \"./chain-select.mobile.ui\";\n\nexport type ChainSelectUIProps = {\n size?: \"sm\" | \"md\" | \"lg\";\n chain?: Chain;\n candidates?: Chain[];\n onSelectChain?: (chain: Chain) => void | Promise<void>;\n isSwitching?: boolean;\n className?: string;\n};\n\nexport function ChainSelectUI({\n size,\n candidates = DEFAULT_CANDIDATES,\n chain = candidates[0],\n onSelectChain,\n isSwitching,\n className,\n}: ChainSelectUIProps) {\n const { isMobile } = useScreen();\n\n if (isMobile) {\n return (\n <ChainSelectMobileUI\n size={size}\n chain={chain}\n onSelectChain={onSelectChain}\n isSwitching={isSwitching}\n candidates={candidates}\n className={className}\n />\n );\n } else {\n return (\n <ChainSelectDesktopUI\n size={size}\n chain={chain}\n onSelectChain={onSelectChain}\n isSwitching={isSwitching}\n candidates={candidates}\n className={className}\n />\n );\n }\n}\n","import { useCallback, useContext, useState } from \"react\";\nimport { useSetAtom } from \"jotai\";\nimport { Chain } from \"@liberfi.io/types\";\nimport { chainToNamespace } from \"@liberfi.io/utils\";\nimport { ChainSelectStateContext } from \"../chain-select.context\";\n\nexport type UseSelectChainOptions = {\n onSwitchChain?: (chain: Chain) => Promise<void>;\n /** Called when switching chain succeeds; caller can toast / analytics here */\n onSuccess?: (chain: Chain) => void;\n /** Called when switching chain fails; caller can toast / modal / report here */\n onError?: (error: unknown) => void;\n};\n\nexport function useSelectChain(options?: UseSelectChainOptions) {\n const { chainAtom, chainNamespaceAtom } = useContext(ChainSelectStateContext);\n const setChain = useSetAtom(chainAtom);\n const setChainNamespace = useSetAtom(chainNamespaceAtom);\n const [isSwitching, setIsSwitching] = useState(false);\n\n const selectChain = useCallback(\n async (chain: Chain) => {\n try {\n setIsSwitching(true);\n await options?.onSwitchChain?.(chain);\n\n setChainNamespace(chainToNamespace(chain));\n setChain(chain);\n options?.onSuccess?.(chain);\n } catch (e) {\n options?.onError?.(e);\n } finally {\n setIsSwitching(false);\n }\n },\n [\n setChain,\n setChainNamespace,\n options?.onSwitchChain,\n options?.onSuccess,\n options?.onError,\n ],\n );\n\n return { selectChain, isSwitching };\n}\n","import { useMemo, useContext } from \"react\";\nimport { useAtomValue } from \"jotai\";\nimport { ChainSelectStateContext } from \"../chain-select.context\";\n\nexport function useCurrentChain() {\n const { chainAtom, chainNamespaceAtom } = useContext(ChainSelectStateContext);\n const chain = useAtomValue(chainAtom);\n const chainNamespace = useAtomValue(chainNamespaceAtom);\n return useMemo(() => ({ chain, chainNamespace }), [chain, chainNamespace]);\n}\n","import { Chain } from \"@liberfi.io/types\";\nimport { useSelectChain, useCurrentChain } from \"../hooks\";\nimport { ChainSelectUI } from \"./chain-select.ui\";\n\nexport type ChainSelectWidgetProps = {\n size?: \"sm\" | \"md\" | \"lg\";\n className?: string;\n /** Optional list of chains to show. Defaults to [SOLANA, ETHEREUM, BINANCE] when not provided. */\n candidates?: Chain[];\n onSwitchChain?: (chain: Chain) => Promise<void>;\n /** Called when switching chain succeeds; caller can toast / analytics here */\n onSuccess?: (chain: Chain) => void;\n /** Called when switching chain fails; caller can toast / modal / report here */\n onError?: (error: unknown) => void;\n};\n\nexport function ChainSelectWidget({\n size,\n className,\n candidates,\n onSwitchChain,\n onSuccess,\n onError,\n}: ChainSelectWidgetProps) {\n const { chain } = useCurrentChain();\n const { selectChain, isSwitching } = useSelectChain({\n onSwitchChain,\n onSuccess,\n onError,\n });\n\n return (\n <ChainSelectUI\n chain={chain}\n candidates={candidates}\n onSelectChain={selectChain}\n isSwitching={isSwitching}\n size={size}\n className={className}\n />\n );\n}\n"]}
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "@liberfi.io/ui-chain-select",
3
- "version": "0.1.72",
3
+ "version": "0.1.74",
4
4
  "description": "Chain Management for Liberfi React SDK",
5
5
  "main": "dist/index.js",
6
6
  "module": "dist/index.mjs",
@@ -14,8 +14,8 @@
14
14
  "access": "public"
15
15
  },
16
16
  "dependencies": {
17
- "@liberfi.io/types": "0.1.81",
18
- "@liberfi.io/utils": "0.1.78"
17
+ "@liberfi.io/types": "0.1.83",
18
+ "@liberfi.io/utils": "0.1.80"
19
19
  },
20
20
  "devDependencies": {
21
21
  "@testing-library/jest-dom": "^6.6.3",
@@ -32,14 +32,14 @@
32
32
  "ts-jest": "^29.3.0",
33
33
  "tsup": "^8.5.0",
34
34
  "typescript": "^5.9.2",
35
- "@liberfi.io/ui": "0.1.81",
36
- "tsconfig": "0.1.69"
35
+ "@liberfi.io/ui": "0.1.83",
36
+ "tsconfig": "0.1.71"
37
37
  },
38
38
  "peerDependencies": {
39
39
  "jotai": ">=2.15.1",
40
40
  "react": ">=18",
41
41
  "react-dom": ">=18",
42
- "@liberfi.io/ui": "0.1.81"
42
+ "@liberfi.io/ui": "0.1.83"
43
43
  },
44
44
  "scripts": {
45
45
  "dev": "tsup --watch",