handleSelect(chain.chainId)}
+ onKeyDown={(e) => {
+ // ArrowDown / ArrowRight: next row.
+ // ArrowUp / ArrowLeft: previous row (with wrap-around).
+ // Home / End: jump to ends. Enter / Space: select.
+ switch (e.key) {
+ case "ArrowDown":
+ case "ArrowRight": {
+ e.preventDefault();
+ const i = flatChains.findIndex((c) => c.chainId === chain.chainId);
+ focusChainAt(i + 1);
+ break;
+ }
+ case "ArrowUp":
+ case "ArrowLeft": {
+ e.preventDefault();
+ const i = flatChains.findIndex((c) => c.chainId === chain.chainId);
+ focusChainAt(i - 1);
+ break;
+ }
+ case "Home":
+ e.preventDefault();
+ focusChainAt(0);
+ break;
+ case "End":
+ e.preventDefault();
+ focusChainAt(flatChains.length - 1);
+ break;
+ case "Enter":
+ case " ":
+ case "Spacebar":
+ e.preventDefault();
+ handleSelect(chain.chainId);
+ break;
+ default:
+ }
+ }}
+ className={cn(
+ "flex w-full cursor-pointer items-center gap-3 rounded-xl px-3 py-2.5 text-left transition-colors",
+ "focus:outline-none focus:ring-2 focus:ring-gray-300 dark:focus:ring-gray-700",
+ isSelected
+ ? "bg-gray-100 dark:bg-gray-800"
+ : "hover:bg-gray-50 dark:hover:bg-gray-800/50",
+ )}
+ >
+
+
+
+ {chain.name}
+
+ {chain.currency && (
+
+ {chain.currency}
+ {chain.testnet && (
+
+ testnet
+
+ )}
+
+ )}
+
+
+ {chain.chainId}
+
+ {isSelected &&
}
+
+ );
+ };
+
+ return (
+
+ {/* Header */}
+
+
+ Choose a chain
+
+ {shouldShowToggle && (
+
+ )}
+
+
+ {/* Search */}
+ {searchable && (
+
+
+
+ setSearch(e.target.value)}
+ placeholder="Search chains..."
+ aria-label="Search chains"
+ className={cn(
+ "w-full rounded-lg border border-gray-200 bg-transparent py-2 pl-8 pr-8 text-sm text-gray-900 placeholder:text-gray-400",
+ "focus:border-gray-300 focus:outline-none dark:border-gray-700 dark:text-gray-100 dark:focus:border-gray-600",
+ )}
+ />
+ {search && (
+
+ )}
+
+
+ )}
+
+ {/* Chain groups */}
+
+ {grouped.evm.length > 0 && (
+
+
+ EVM
+
+
+ {grouped.evm.map((c) => {
+ const i = flatChains.findIndex((x) => x.chainId === c.chainId);
+ return renderRow(c, i === focusIndex);
+ })}
+
+
+ )}
+ {grouped.sol.length > 0 && (
+
+
+ Solana
+
+
+ {grouped.sol.map((c) => {
+ const i = flatChains.findIndex((x) => x.chainId === c.chainId);
+ return renderRow(c, i === focusIndex);
+ })}
+
+
+ )}
+ {filtered.length === 0 && (
+
+ No chains found
+
+ )}
+
+
+
+
+ {filtered.length} chain{filtered.length !== 1 ? "s" : ""}
+
+
+
+ );
+}
+
+export default ChainSelector;
diff --git a/registry/w3-kit/chain-selector/types.ts b/registry/w3-kit/chain-selector/types.ts
new file mode 100644
index 0000000..27f1e61
--- /dev/null
+++ b/registry/w3-kit/chain-selector/types.ts
@@ -0,0 +1,46 @@
+/**
+ * Public types for the