From f2b692682dda135d909f567261ee0994d63c096a Mon Sep 17 00:00:00 2001 From: Lochie Axon Date: Wed, 2 Apr 2025 17:39:34 +1100 Subject: [PATCH 01/13] update: outdated quality check version (#457) --- .github/workflows/quality.yml | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/.github/workflows/quality.yml b/.github/workflows/quality.yml index f944a0ec..e88d0b60 100644 --- a/.github/workflows/quality.yml +++ b/.github/workflows/quality.yml @@ -16,7 +16,7 @@ jobs: node-version: 16 - name: Use node_modules cache - uses: actions/cache@v2 + uses: actions/cache@v3 with: path: '**/node_modules' key: ${{ runner.os }}-modules-${{ hashFiles('**/pnpm-lock.yaml') }} From 2563679160eaf142225f0a32dca22e23eca5b453 Mon Sep 17 00:00:00 2001 From: Lochie Axon Date: Wed, 2 Apr 2025 17:45:59 +1100 Subject: [PATCH 02/13] update: optimism chain logo (#455) * update chain logos * flag checks * remove --- packages/connectkit/src/assets/chains.tsx | 9 +++++++++ packages/connectkit/src/assets/logos.tsx | 10 ++++++---- packages/connectkit/src/utils/wallets.ts | 2 ++ 3 files changed, 17 insertions(+), 4 deletions(-) diff --git a/packages/connectkit/src/assets/chains.tsx b/packages/connectkit/src/assets/chains.tsx index 9821efdc..0d8f1c26 100644 --- a/packages/connectkit/src/assets/chains.tsx +++ b/packages/connectkit/src/assets/chains.tsx @@ -152,6 +152,15 @@ export const Optimism = ({ testnet, ...props }: Logo) => ( d="M22.8188 27.6815C22.6977 27.6815 22.6041 27.6429 22.5381 27.5659C22.483 27.4778 22.4665 27.3788 22.4885 27.2687L24.7672 16.5358C24.7892 16.4147 24.8498 16.3156 24.9489 16.2385C25.0479 16.1615 25.1525 16.1229 25.2626 16.1229H29.6548C30.8767 16.1229 31.8564 16.3761 32.5939 16.8825C33.3426 17.3889 33.7168 18.1209 33.7168 19.0786C33.7168 19.3538 33.6838 19.64 33.6177 19.9372C33.3426 21.2032 32.7867 22.1389 31.95 22.7443C31.1244 23.3498 29.9905 23.6525 28.5485 23.6525H26.3194L25.5598 27.2687C25.5377 27.3898 25.4772 27.4888 25.3782 27.5659C25.2791 27.6429 25.1745 27.6815 25.0645 27.6815H22.8188ZM28.6641 21.3738C29.1264 21.3738 29.5282 21.2472 29.8695 20.994C30.2217 20.7408 30.4529 20.3776 30.563 19.9042C30.596 19.717 30.6125 19.552 30.6125 19.4089C30.6125 19.0896 30.519 18.8474 30.3318 18.6823C30.1446 18.5062 29.8255 18.4182 29.3741 18.4182H27.3926L26.7652 21.3738H28.6641Z" fill="white" /> + + + ); diff --git a/packages/connectkit/src/assets/logos.tsx b/packages/connectkit/src/assets/logos.tsx index d556a5b3..0a05ad5c 100644 --- a/packages/connectkit/src/assets/logos.tsx +++ b/packages/connectkit/src/assets/logos.tsx @@ -1,4 +1,4 @@ -import { isFamily, isRainbow, isZerion } from '../utils/wallets'; +import { isArgent, isPhantom, isSafe } from '../utils/wallets'; export const Mock = ({ ...props }) => ( {
-
{!isZerion() ? : }
+
{!isArgent() ? : }
-
{!isFamily() ? : }
-
{!isRainbow() ? : }
+
+ {!isPhantom() ? : } +
+
{!isSafe() ? : }
); diff --git a/packages/connectkit/src/utils/wallets.ts b/packages/connectkit/src/utils/wallets.ts index 53913922..13c8383a 100644 --- a/packages/connectkit/src/utils/wallets.ts +++ b/packages/connectkit/src/utils/wallets.ts @@ -25,6 +25,7 @@ export const isFrame = () => isWalletInstalled('Frame'); export const isPhantom = () => isWalletInstalled('Phantom'); export const isInfinityWallet = () => isWalletInstalled('InfinityWallet'); export const isRabby = () => isWalletInstalled('Rabby'); +export const isArgent = () => isWalletInstalled('Argent'); export const isFrontier = () => isWalletInstalled('Frontier'); export const isTrust = () => { if (typeof window === 'undefined') return false; @@ -39,3 +40,4 @@ export const isTalisman = () => isWalletInstalled('Talisman'); export const isFordefi = () => isWalletInstalled('Fordefi'); export const isRainbow = () => isWalletInstalled('Rainbow'); export const isZerion = () => isWalletInstalled('Zerion'); +export const isSafe = () => isWalletInstalled('Safe'); From 64280e2caded2bc76de73f7228297445f7525b75 Mon Sep 17 00:00:00 2001 From: Lochie Axon Date: Wed, 2 Apr 2025 22:23:51 +1100 Subject: [PATCH 03/13] add: lens chain icon (#458) --- packages/connectkit/src/assets/chains.tsx | 22 +++++++++++++++++++ .../connectkit/src/constants/chainConfigs.tsx | 10 +++++++++ 2 files changed, 32 insertions(+) diff --git a/packages/connectkit/src/assets/chains.tsx b/packages/connectkit/src/assets/chains.tsx index 0d8f1c26..19b0d77e 100644 --- a/packages/connectkit/src/assets/chains.tsx +++ b/packages/connectkit/src/assets/chains.tsx @@ -108,6 +108,27 @@ export const Ethereum = ({ testnet, ...props }: Logo) => { ); }; +export const LensChain = ({ testnet, ...props }: { testnet?: boolean }) => ( + + + +); + export const Polygon = ({ testnet, ...props }: Logo) => ( ( export default { UnknownChain, Base, + LensChain, Ethereum, Polygon, Optimism, diff --git a/packages/connectkit/src/constants/chainConfigs.tsx b/packages/connectkit/src/constants/chainConfigs.tsx index 94254b63..f62d87f3 100644 --- a/packages/connectkit/src/constants/chainConfigs.tsx +++ b/packages/connectkit/src/constants/chainConfigs.tsx @@ -37,6 +37,16 @@ export const chainConfigs: Chain[] = [ }, }, }, + { + id: 232, + name: 'Lens Chain', + logo: , + }, + { + id: 37111, + name: 'Lens Chain Testnet', + logo: , + }, { id: 3, name: 'Rinkeby', From a28540a7b22bcb52cd7bde94ce8de8b1f9ec23e3 Mon Sep 17 00:00:00 2001 From: Lochie Axon Date: Wed, 2 Apr 2025 22:34:53 +1100 Subject: [PATCH 04/13] fix: empty string (#459) --- packages/connectkit/src/components/Common/Button/index.tsx | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/packages/connectkit/src/components/Common/Button/index.tsx b/packages/connectkit/src/components/Common/Button/index.tsx index 1e1ecc99..0d722b47 100644 --- a/packages/connectkit/src/components/Common/Button/index.tsx +++ b/packages/connectkit/src/components/Common/Button/index.tsx @@ -42,7 +42,7 @@ const Button: React.FC = ({ : flattenChildren(children).join(''); // Need to generate a string for the key so we can automatically animate between content const hrefUrl = - typeof href === 'string' ? href : flattenChildren(href).join(''); // Need to have a flat string for the href + href && (typeof href === 'string' ? href : flattenChildren(href).join('')); // Need to have a flat string for the href return ( Date: Wed, 2 Apr 2025 23:55:43 +1100 Subject: [PATCH 05/13] add: family connector (#456) * locales * family support * add logo * Update CHANGELOG.md * clean up * cleanup --- CHANGELOG.md | 16 ++ .../testbench/src/components/Web3Provider.tsx | 1 + packages/connectkit/package.json | 1 + packages/connectkit/src/assets/logos.tsx | 23 +- .../components/Common/ConnectorList/index.tsx | 23 +- .../components/Common/ConnectorList/styles.ts | 6 + .../Common/FamilyAccountsButton/index.tsx | 41 ++++ .../Common/FamilyAccountsButton/styles.ts | 79 +++++++ .../src/components/Common/Modal/index.tsx | 10 +- .../src/components/Common/Modal/styles.ts | 8 +- .../components/ConnectModal/ConnectUsing.tsx | 2 + .../ConnectWithInjector/index.tsx | 41 +++- .../ConnectModal/ConnectWithQRCode.tsx | 10 +- .../src/components/Pages/Connectors/index.tsx | 123 ++++++---- .../src/components/Pages/Connectors/styles.ts | 6 + packages/connectkit/src/defaultConfig.ts | 8 + packages/connectkit/src/defaultConnectors.ts | 13 +- .../hooks/connectors/useWalletConnectUri.ts | 2 +- .../connectkit/src/hooks/useConnectors.ts | 9 +- .../src/localizations/locales/ar-AE.ts | 12 +- .../src/localizations/locales/ca-AD.ts | 223 +++++++++--------- .../src/localizations/locales/ee-EE.ts | 2 + .../src/localizations/locales/en-US.ts | 8 +- .../src/localizations/locales/es-ES.ts | 2 + .../src/localizations/locales/fa-IR.ts | 2 + .../src/localizations/locales/fr-FR.ts | 2 + .../src/localizations/locales/ja-JP.ts | 8 +- .../src/localizations/locales/pt-BR.ts | 13 +- .../src/localizations/locales/ru-RU.ts | 6 +- .../src/localizations/locales/tr-TR.ts | 5 +- .../src/localizations/locales/vi-VN.ts | 2 + .../src/localizations/locales/zh-CN.ts | 2 + packages/connectkit/src/styles/index.ts | 14 +- packages/connectkit/src/utils/index.ts | 6 + .../connectkit/src/wallets/walletConfigs.tsx | 7 + yarn.lock | 22 ++ 36 files changed, 567 insertions(+), 191 deletions(-) create mode 100644 packages/connectkit/src/components/Common/FamilyAccountsButton/index.tsx create mode 100644 packages/connectkit/src/components/Common/FamilyAccountsButton/styles.ts diff --git a/CHANGELOG.md b/CHANGELOG.md index 47c0fe2a..49746bf0 100644 --- a/CHANGELOG.md +++ b/CHANGELOG.md @@ -1,3 +1,19 @@ +# 1.9.0 + +We're thrilled to announce a major upgrade to ConnectKit—designed to make onboarding and navigating Ethereum simpler and safer than ever. + +Introducing [Family Accounts](https://app.family.co), simplified onboarding for new users. + +Learn more by reading the announcement [here](https://family.co/blog/family-accounts). + +## New + +- Support for [Family Accounts](https://app.family.co). + +## Improved + +- Updates chain logos for `zora`, `base`, `optimism` and `lens`. + # 1.8.2 This update includes improvements to the `CoinbaseWalletSDK` connect popup and `MockConnector`. diff --git a/examples/testbench/src/components/Web3Provider.tsx b/examples/testbench/src/components/Web3Provider.tsx index 82622c1e..18d42e94 100644 --- a/examples/testbench/src/components/Web3Provider.tsx +++ b/examples/testbench/src/components/Web3Provider.tsx @@ -41,6 +41,7 @@ export const ckConfig = getDefaultConfig({ appName: 'ConnectKit testbench', appIcon: '/app.png', walletConnectProjectId: process.env.NEXT_PUBLIC_WALLETCONNECT_PROJECT_ID!, + //enableFamily: false, }); const customConfig = { ...ckConfig, diff --git a/packages/connectkit/package.json b/packages/connectkit/package.json index 1ca01299..cfc0e62a 100644 --- a/packages/connectkit/package.json +++ b/packages/connectkit/package.json @@ -41,6 +41,7 @@ "dependencies": { "buffer": "^6.0.3", "detect-browser": "^5.3.0", + "family": "^0.1.1", "framer-motion": "^6.3.11", "qrcode": "^1.5.0", "react-transition-state": "^1.1.4", diff --git a/packages/connectkit/src/assets/logos.tsx b/packages/connectkit/src/assets/logos.tsx index 0a05ad5c..46d61899 100644 --- a/packages/connectkit/src/assets/logos.tsx +++ b/packages/connectkit/src/assets/logos.tsx @@ -384,6 +384,24 @@ export const Coinbase = ({ background = false, ...props }) => ( ); +export const FamilyAccount = () => ( + + + + +); + export const Family = ({ ...props }) => { const img = 'data:image/png;base64,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'; @@ -1262,12 +1280,12 @@ export const OtherWallets = ({ ...props }) => { position: 'relative', display: 'flex', flexDirection: 'column', - gap: 2, + gap: 3, }; const row: React.CSSProperties = { position: 'relative', display: 'flex', - gap: 2, + gap: 3, }; const cell: React.CSSProperties = { width: '50%', @@ -1331,6 +1349,7 @@ export default { MetaMask, Coinbase, Family, + FamilyAccount, Trust, Argent, ImToken, diff --git a/packages/connectkit/src/components/Common/ConnectorList/index.tsx b/packages/connectkit/src/components/Common/ConnectorList/index.tsx index 436c21d5..beea9c35 100644 --- a/packages/connectkit/src/components/Common/ConnectorList/index.tsx +++ b/packages/connectkit/src/components/Common/ConnectorList/index.tsx @@ -22,6 +22,11 @@ import { } from '../../../utils'; import { useLastConnector } from '../../../hooks/useLastConnector'; import { useConnect } from '../../../hooks/useConnect'; +import { + useFamilyAccountsConnector, + useFamilyConnector, +} from '../../../hooks/useConnectors'; +import { isFamily } from '../../../utils/wallets'; const ConnectorList = () => { const context = useContext(); @@ -29,17 +34,28 @@ const ConnectorList = () => { const wallets = useWallets(); const { lastConnectorId } = useLastConnector(); + const familyConnector = useFamilyConnector(); + const familyAccountsConnector = useFamilyAccountsConnector(); + + let filteredWallets = wallets.filter( + (wallet) => wallet.id !== familyAccountsConnector?.id + ); + if (familyConnector && isFamily()) { + filteredWallets = filteredWallets.filter( + (wallet) => wallet.id !== familyConnector?.id + ); + } const walletsToDisplay = context.options?.hideRecentBadge || lastConnectorId === 'walletConnect' // do not hoist walletconnect to top of list - ? wallets + ? filteredWallets : [ // move last used wallet to top of list // using .filter and spread to avoid mutating original array order with .sort - ...wallets.filter( + ...filteredWallets.filter( (wallet) => lastConnectorId === wallet.connector.id ), - ...wallets.filter( + ...filteredWallets.filter( (wallet) => lastConnectorId !== wallet.connector.id ), ]; @@ -134,6 +150,7 @@ const ConnectorItem = ({ {wallet.iconConnector ?? wallet.icon} diff --git a/packages/connectkit/src/components/Common/ConnectorList/styles.ts b/packages/connectkit/src/components/Common/ConnectorList/styles.ts index 0557aedf..0c4fbdbd 100644 --- a/packages/connectkit/src/components/Common/ConnectorList/styles.ts +++ b/packages/connectkit/src/components/Common/ConnectorList/styles.ts @@ -212,6 +212,12 @@ const styles = { &[data-shape='square'] { border-radius: 0; } + + &[data-background='true'] { + border-radius: 22.5%; + background: var(--ck-body-background-tertiary); + padding: 8%; + } `, }, }; diff --git a/packages/connectkit/src/components/Common/FamilyAccountsButton/index.tsx b/packages/connectkit/src/components/Common/FamilyAccountsButton/index.tsx new file mode 100644 index 00000000..7dbde54e --- /dev/null +++ b/packages/connectkit/src/components/Common/FamilyAccountsButton/index.tsx @@ -0,0 +1,41 @@ +import { + ButtonContainer, + InnerContainer, + IconContainer, + ButtonContainerInner, +} from './styles'; +import FitText from '../FitText'; +import useLocales from '../../../hooks/useLocales'; + +const FamilyLogo = () => ( + + + +); + +export const FamilyAccountsButton = ({ onClick }: { onClick: () => void }) => { + const locales = useLocales(); + return ( + + + + + + + {locales.continueWithFamily} + + + + ); +}; diff --git a/packages/connectkit/src/components/Common/FamilyAccountsButton/styles.ts b/packages/connectkit/src/components/Common/FamilyAccountsButton/styles.ts new file mode 100644 index 00000000..85016e55 --- /dev/null +++ b/packages/connectkit/src/components/Common/FamilyAccountsButton/styles.ts @@ -0,0 +1,79 @@ +import { motion } from 'framer-motion'; +import styled from './../../../styles/styled'; + +export const ButtonContainerInner = styled(motion.div)` + display: flex; + align-items: center; + justify-content: center; + inset: 0; + height: 100%; +`; +export const ButtonContainer = styled.button` + --color: #ffffff; + --background: var(--ck-family-accounts-brand); + --box-shadow: var(--ck-primary-button-box-shadow); + --border-radius: var(--ck-primary-button-border-radius); + --font-weight: var(--ck-primary-button-font-weight, 500); + + --hover-color: var(--ck-button-primary-hover-color, var(--color)); + --hover-background: var( + --ck-primary-button-hover-background, + var(--background) + ); + --hover-box-shadow: var( + --ck-primary-button-hover-box-shadow, + var(--box-shadow) + ); + --hover-border-radius: var( + --ck-primary-button-hover-border-radius, + var(--border-radius) + ); + --hover-font-weight: var(--ck-primary-button-font-weight, var(--font-weight)); + + appearance: none; + cursor: pointer; + user-select: none; + min-width: fit-content; + width: 100%; + display: block; + text-align: center; + height: 48px; + margin: 18px 0 2px; + line-height: 48px; + padding: 0 4px; + font-size: 16px; + font-weight: var(--font-weight, 500); + text-decoration: none; + white-space: nowrap; + transition: 100ms ease; + transition-property: box-shadow, background-color; + color: var(--color); + background: var(--background); + border-radius: var(--border-radius); + box-shadow: var(--box-shadow); + will-change: transform, box-shadow, background-color, color; +`; + +export const InnerContainer = styled.div` + transform: translateZ(0); // Shifting fix + position: relative; + display: inline-block; + vertical-align: middle; + max-width: calc(100% - 42px); + transition: opacity 300ms ease; +`; + +export const IconContainer = styled.div` + position: relative; + display: inline-block; + vertical-align: middle; + max-width: 20px; + max-height: 20px; + margin: 0 12px 0 0; + svg { + display: block; + position: relative; + max-width: 100%; + height: auto; + } +`; diff --git a/packages/connectkit/src/components/Common/Modal/index.tsx b/packages/connectkit/src/components/Common/Modal/index.tsx index 29e90aec..c80c429d 100644 --- a/packages/connectkit/src/components/Common/Modal/index.tsx +++ b/packages/connectkit/src/components/Common/Modal/index.tsx @@ -697,10 +697,16 @@ const Page: React.FC = ({ ); }; -export const OrDivider = ({ children }: { children?: React.ReactNode }) => { +export const OrDivider = ({ + children, + hideHr, +}: { + children?: React.ReactNode; + hideHr?: boolean; +}) => { const locales = useLocales(); return ( - + {children ?? locales.or} ); diff --git a/packages/connectkit/src/components/Common/Modal/styles.ts b/packages/connectkit/src/components/Common/Modal/styles.ts index 4d90071e..0c9dbd69 100644 --- a/packages/connectkit/src/components/Common/Modal/styles.ts +++ b/packages/connectkit/src/components/Common/Modal/styles.ts @@ -71,7 +71,9 @@ export const PageContent = styled(motion.div)` padding-top: 48px; `; -export const TextWithHr = styled(motion.div)` +export const TextWithHr = styled(motion.div)<{ + $disableHr?: boolean; +}>` user-select: none; position: relative; display: block; @@ -90,6 +92,9 @@ export const TextWithHr = styled(motion.div)` background: var(--ck-body-background); transition: background-color 200ms ease; } + ${(props) => + !props.$disableHr && + ` &:before { z-index: 2; content: ''; @@ -102,6 +107,7 @@ export const TextWithHr = styled(motion.div)` background: var(--ck-body-divider); box-shadow: var(--ck-body-divider-box-shadow); } + `} `; export const ModalHeading = styled(motion.div)` z-index: 3; diff --git a/packages/connectkit/src/components/ConnectModal/ConnectUsing.tsx b/packages/connectkit/src/components/ConnectModal/ConnectUsing.tsx index 877e945c..f41a416d 100644 --- a/packages/connectkit/src/components/ConnectModal/ConnectUsing.tsx +++ b/packages/connectkit/src/components/ConnectModal/ConnectUsing.tsx @@ -54,6 +54,7 @@ const ConnectUsing = () => { switchConnectMethod={(id?: string) => { //if (id) setId(id); setStatus(states.INJECTOR); + setTimeout(context.triggerResize, 10); // delay required here for modal to resize }} /> @@ -70,6 +71,7 @@ const ConnectUsing = () => { switchConnectMethod={(id?: string) => { //if (id) setId(id); setStatus(states.QRCODE); + setTimeout(context.triggerResize, 10); // delay required here for modal to resize }} /> diff --git a/packages/connectkit/src/components/ConnectModal/ConnectWithInjector/index.tsx b/packages/connectkit/src/components/ConnectModal/ConnectWithInjector/index.tsx index abacab0e..e8b93477 100644 --- a/packages/connectkit/src/components/ConnectModal/ConnectWithInjector/index.tsx +++ b/packages/connectkit/src/components/ConnectModal/ConnectWithInjector/index.tsx @@ -27,7 +27,11 @@ import SquircleSpinner from './SquircleSpinner'; import { RetryIconCircle, Scan } from '../../../assets/icons'; import BrowserIcon from '../../Common/BrowserIcon'; import { AlertIcon, TickIcon } from '../../../assets/icons'; -import { detectBrowser, isWalletConnectConnector } from '../../../utils'; +import { + detectBrowser, + isFamilyAccountsConnector, + isWalletConnectConnector, +} from '../../../utils'; import useLocales from '../../../hooks/useLocales'; import { useConnect } from '../../../hooks/useConnect'; import { useContext } from '../../ConnectKit'; @@ -340,6 +344,16 @@ const ConnectWithInjector: React.FC<{ {locales.injectionScreen_failed_p} + + {isFamilyAccountsConnector(wallet.id) && ( + <> + + + + )} + {/* Reason: Coinbase Wallet does not expose a QRURI when extension is installed */} {/* {wallet?.getWalletConnectDeeplink && @@ -365,11 +379,28 @@ const ConnectWithInjector: React.FC<{ exit={'exit'} variants={contentVariants} > - + {locales.injectionScreen_rejected_h1} {locales.injectionScreen_rejected_p} + {isFamilyAccountsConnector(wallet.id) && ( + <> + + + + )} + {/* Reason: Coinbase Wallet does not expose a QRURI when extension is installed */} {/* {wallet?.getWalletConnectDeeplink && @@ -395,7 +426,11 @@ const ConnectWithInjector: React.FC<{ exit={'exit'} variants={contentVariants} > - + {wallet.connector.id === 'injected' ? locales.injectionScreen_connecting_injected_h1 diff --git a/packages/connectkit/src/components/ConnectModal/ConnectWithQRCode.tsx b/packages/connectkit/src/components/ConnectModal/ConnectWithQRCode.tsx index 7bb7cae9..cfa6b9ba 100644 --- a/packages/connectkit/src/components/ConnectModal/ConnectWithQRCode.tsx +++ b/packages/connectkit/src/components/ConnectModal/ConnectWithQRCode.tsx @@ -5,7 +5,7 @@ import { useWalletConnectModal } from '../../hooks/useWalletConnectModal'; import { detectBrowser, - isCoinbaseWalletConnector, + isFamilyAccountsConnector, isWalletConnectConnector, } from '../../utils'; @@ -130,6 +130,14 @@ const ConnectWithQRCode: React.FC<{ )} + {isFamilyAccountsConnector(wallet.id) && ( + <> + + + + )} {/* {hasExtensionInstalled && ( // Run the extension - )} + + + {familyAccountsConnector && ( + <> + { + if (familyConnector && isFamily()) { + context.setConnector(familyConnector); + } else { + context.setConnector(familyAccountsConnector); + } + context.setRoute(routes.CONNECT); + }} + /> + {locales.orSelectWallet} + + )} +
+ + {isMobile ? ( + <> + + + {locales.connectorsScreen_h1} + {locales.connectorsScreen_p} + + + {!context.options?.hideQuestionMarkCTA && ( + + )} + {!context.options?.hideNoWalletCTA && ( + + )} + + + + ) : ( + <> {!context.options?.hideNoWalletCTA && ( - + + context.setRoute(routes.ONBOARDING)} + > + {locales.connectorsScreen_newcomer} + + )} - - - - ) : ( - <> - {!context.options?.hideNoWalletCTA && ( - - context.setRoute(routes.ONBOARDING)} - > - {locales.connectorsScreen_newcomer} - - + + )} + {context.options?.disclaimer && ( + +
{context.options?.disclaimer}
+
)} - - )} - {context.options?.disclaimer && ( - -
{context.options?.disclaimer}
-
- )} +
+
); }; diff --git a/packages/connectkit/src/components/Pages/Connectors/styles.ts b/packages/connectkit/src/components/Pages/Connectors/styles.ts index d439628e..22d9dd8b 100644 --- a/packages/connectkit/src/components/Pages/Connectors/styles.ts +++ b/packages/connectkit/src/components/Pages/Connectors/styles.ts @@ -9,6 +9,12 @@ const Shimmer = keyframes` 100%{ transform: translate(100%) rotate(-80deg); } `; +export const Container = styled(motion.div)` + display: flex; + flex-direction: column; + gap: 12px; +`; + export const InfoBox = styled.div` padding: 24px 24px 28px; border-radius: var(--ck-tertiary-border-radius, 24px); diff --git a/packages/connectkit/src/defaultConfig.ts b/packages/connectkit/src/defaultConfig.ts index 719a59cc..de685069 100644 --- a/packages/connectkit/src/defaultConfig.ts +++ b/packages/connectkit/src/defaultConfig.ts @@ -2,6 +2,7 @@ import { http } from 'wagmi'; import { type CreateConfigParameters } from '@wagmi/core'; import { mainnet, polygon, optimism, arbitrum } from 'wagmi/chains'; import { CoinbaseWalletParameters } from 'wagmi/connectors'; +import { EthereumProviderOptions as FamilyOptions } from 'family'; import defaultConnectors from './defaultConnectors'; @@ -21,6 +22,9 @@ type DefaultConfigProps = { walletConnectProjectId: string; // Coinbase Wallet preference coinbaseWalletPreference?: CoinbaseWalletParameters<'4'>['preference']; + // Family options (https://app.family.co) + enableFamily?: boolean; + familyOptions?: FamilyOptions; } & Partial; const defaultConfig = ({ @@ -32,6 +36,8 @@ const defaultConfig = ({ coinbaseWalletPreference, chains = [mainnet, polygon, optimism, arbitrum], client, + enableFamily = true, + familyOptions, ...props }: DefaultConfigProps): CreateConfigParameters => { globalAppName = appName; @@ -53,6 +59,8 @@ const defaultConfig = ({ }, walletConnectProjectId, coinbaseWalletPreference, + enableFamily, + familyOptions, }); const config: CreateConfigParameters = { diff --git a/packages/connectkit/src/defaultConnectors.ts b/packages/connectkit/src/defaultConnectors.ts index 514b2283..fd049103 100644 --- a/packages/connectkit/src/defaultConnectors.ts +++ b/packages/connectkit/src/defaultConnectors.ts @@ -7,6 +7,11 @@ import { safe, } from '@wagmi/connectors'; +import { + EthereumProviderOptions as FamilyOptions, + familyAccountsConnector, +} from 'family'; + type DefaultConnectorsProps = { app: { name: string; @@ -16,18 +21,24 @@ type DefaultConnectorsProps = { }; walletConnectProjectId?: string; coinbaseWalletPreference?: CoinbaseWalletParameters<'4'>['preference']; + enableFamily?: boolean; + familyOptions?: FamilyOptions; }; const defaultConnectors = ({ app, walletConnectProjectId, coinbaseWalletPreference, + enableFamily, + familyOptions, }: DefaultConnectorsProps): CreateConnectorFn[] => { const hasAllAppData = app.name && app.icon && app.description && app.url; const shouldUseSafeConnector = !(typeof window === 'undefined') && window?.parent !== window; - const connectors: CreateConnectorFn[] = []; + const connectors: CreateConnectorFn[] = enableFamily + ? [familyAccountsConnector(familyOptions)] + : []; // If we're in an iframe, include the SafeConnector if (shouldUseSafeConnector) { diff --git a/packages/connectkit/src/hooks/connectors/useWalletConnectUri.ts b/packages/connectkit/src/hooks/connectors/useWalletConnectUri.ts index b5b78563..b43db83a 100644 --- a/packages/connectkit/src/hooks/connectors/useWalletConnectUri.ts +++ b/packages/connectkit/src/hooks/connectors/useWalletConnectUri.ts @@ -18,7 +18,7 @@ export function useWalletConnectUri( const [uri, setUri] = useState(undefined); - const connector: Connector = useWalletConnectConnector(); + const connector = useWalletConnectConnector(); const { isConnected } = useAccount(); const { connectAsync } = useConnect(); diff --git a/packages/connectkit/src/hooks/useConnectors.ts b/packages/connectkit/src/hooks/useConnectors.ts index 8f9a1766..2ab20dc8 100644 --- a/packages/connectkit/src/hooks/useConnectors.ts +++ b/packages/connectkit/src/hooks/useConnectors.ts @@ -14,7 +14,14 @@ export function useConnector(id: string, uuid?: string) { (c) => c.id === id && c.name.includes('Injected') ) as Connector; } - return connectors.find((c) => c.id === id) as Connector; + return connectors.find((c) => c.id === id); +} + +export function useFamilyAccountsConnector() { + return useConnector('familyAccountsProvider'); +} +export function useFamilyConnector() { + return useConnector('co.family.wallet'); } export function useInjectedConnector(uuid?: string) { diff --git a/packages/connectkit/src/localizations/locales/ar-AE.ts b/packages/connectkit/src/localizations/locales/ar-AE.ts index 1bc9667e..8d7b9588 100644 --- a/packages/connectkit/src/localizations/locales/ar-AE.ts +++ b/packages/connectkit/src/localizations/locales/ar-AE.ts @@ -1,6 +1,8 @@ import { LocaleProps } from './'; +import enUS from './en-US'; const arAE: LocaleProps = { + ...enUS, // fallback connectWallet: 'الاتصال بالمحفظة', disconnect: 'قطع الاتصال', connected: 'متصل', @@ -16,7 +18,7 @@ const arAE: LocaleProps = { more: 'المزيد', tryAgain: 'حاول مجددًا', tryAgainQuestion: 'هل نحاول مرة أخرى؟', - dontHaveTheApp: "ليس لديك التطبيق؟", + dontHaveTheApp: 'ليس لديك التطبيق؟', scanTheQRCode: 'مسح رمز الاستجابة السريعة', useWalletConnectModal: 'استخدم نموذج ولِيت‌كنيكت', useModal: 'استخدم النموذج', @@ -46,7 +48,7 @@ const arAE: LocaleProps = { onboardingScreen_ctaUrl: `https://ethereum.org/ar/wallets/find-wallet/`, aboutScreen_heading: `حول المحافظ`, - aboutScreen_a_h1: `حافظ على أصولك الرقمية`, + aboutScreen_a_h1: `حافظ على أصولك الرقمية`, aboutScreen_a_p: `تمكنك المحافظ من إرسال واستقبال وتخزين والتفاعل مع الأصول الرقمية مثل NFTs ورموز إيثريوم الأخرى.`, aboutScreen_b_h1: `وسيلة أفضل لتسجيل الدخول`, aboutScreen_b_p: `في تطبيقات العصر الحديث، يمكن استخدام محفظتك كوسيلة سهلة لتسجيل الدخول بدلاً من الحاجة إلى تذكر كلمة مرور.`, @@ -102,17 +104,17 @@ const arAE: LocaleProps = { switchNetworkScreen_heading: 'تبديل الشبكات', signInWithEthereumScreen_tooltip: -'أنت غير مسجل الدخول حاليًا إلى هذا التطبيق.\n**سجل الدخول باستخدام إثيريوم** للمتابعة.', + 'أنت غير مسجل الدخول حاليًا إلى هذا التطبيق.\n**سجل الدخول باستخدام إثيريوم** للمتابعة.', signInWithEthereumScreen_signedOut_heading: 'سجل الدخول باستخدام إثيريوم', signInWithEthereumScreen_signedOut_h1: -'يود هذا التطبيق التحقق منك \n كصاحب لهذه المحفظة.', + 'يود هذا التطبيق التحقق منك \n كصاحب لهذه المحفظة.', signInWithEthereumScreen_signedOut_p: `يرجى تأكيد طلب الرسالة في محفظتك للمتابعة.`, signInWithEthereumScreen_signedOut_button: 'سجل الدخول', signInWithEthereumScreen_signedIn_heading: 'تم تسجيل الدخول باستخدام إثيريوم', signInWithEthereumScreen_signedIn_h1: -'لقد قمت بتأكيد نفسك كصاحب لهذه المحفظة بنجاح.', + 'لقد قمت بتأكيد نفسك كصاحب لهذه المحفظة بنجاح.', signInWithEthereumScreen_signedIn_p: `سيتطلب تسجيل الخروج منك إعادة المصادقة مرة أخرى في المستقبل.`, signInWithEthereumScreen_signedIn_button: 'تسجيل الخروج', }; diff --git a/packages/connectkit/src/localizations/locales/ca-AD.ts b/packages/connectkit/src/localizations/locales/ca-AD.ts index 490e639b..46b5c1d0 100644 --- a/packages/connectkit/src/localizations/locales/ca-AD.ts +++ b/packages/connectkit/src/localizations/locales/ca-AD.ts @@ -1,116 +1,121 @@ import { LocaleProps } from './'; +import enUS from './en-US'; const caAD: LocaleProps = { + ...enUS, // fallback connectWallet: 'Connecta la cartera', - disconnect: 'Desconnectar', - connected: 'Connectat', - wrongNetwork: 'Xarxa incorrecta', - switchNetworks: 'Canvi de xarxa', - chainNetwork: 'Xarxa {{ CHAIN }}', - copyToClipboard: 'Copia al portapapers', - copyCode: 'Copia codi', - moreInformation: 'Més informació', - back: 'Enrere', - close: 'Tanca', - or: 'o', - more: 'Més', - tryAgain: 'Torna-ho a intentar', - tryAgainQuestion: 'Tornar a intentar-ho?', - dontHaveTheApp: "No tens l'aplicació?", - scanTheQRCode: 'Escaneja el codi QR', - useWalletConnectModal: 'Utilitza WalletConnect Modal', - useModal: 'Utilitza Modal', - installTheExtension: "Instal·la l'extensió", - getWalletName: 'Obté {{ CONNECTORNAME }}', - otherWallets: 'Altres carteres', - learnMore: 'Més informació', - getWallet: 'Obté una cartera', - approveInWallet: 'Aprova a la cartera', - confirmInWallet: 'Confirma a la cartera', - awaitingConfirmation: 'Esperant confirmació', - signIn: 'Inicia sessió', - signOut: 'Tanca sessió', - signedIn: 'Sessió iniciada', - signedOut: 'Sessió tancada', - walletNotConnected: 'Cartera no connectada', - - warnings_walletSwitchingUnsupported: `La teva cartera no permet canviar de xarxa des d'aquesta aplicació.`, - warnings_walletSwitchingUnsupportedResolve: `Prova a canviar de xarxa des de la teva cartera.`, - warnings_chainUnsupported: `Aquesta aplicació no és compatible amb la xarxa connectada actualment.`, - warnings_chainUnsupportedResolve: `Canvia o desconnecta per continuar.`, - - onboardingScreen_heading: `Obté una cartera`, - onboardingScreen_h1: `Comença a explorar la Web3`, - onboardingScreen_p: `La teva cartera és el portal d'accés a tot el relacionat amb Ethereum, la tecnologia màgica que permet explorar la Web3.`, - onboardingScreen_ctaText: `Tria la teva primera cartera`, - onboardingScreen_ctaUrl: `https://ethereum.org/es/wallets/find-wallet/`, - - aboutScreen_heading: `Sobre les carteres`, - aboutScreen_a_h1: `Per als teus actius digitals`, - aboutScreen_a_p: `Les carteres et permeten enviar, rebre, emmagatzemar i interactuar amb actius digitals com els NFT i altres tokens d'Ethereum.`, - aboutScreen_b_h1: `Una manera millor d'iniciar sessió`, - aboutScreen_b_p: `Amb les aplicacions modernes, pots utilitzar la teva cartera per iniciar sessió fàcilment, en lloc de haver de recordar una contrasenya.`, - aboutScreen_c_h1: `Explora el món de la Web3`, - aboutScreen_c_p: `La teva cartera és una eina essencial que et permet explorar i participar en el món en ràpida evolució de la Web3.`, - aboutScreen_ctaText: `Més informació`, - aboutScreen_ctaUrl: `https://ethereum.org/es/wallets/`, - - connectorsScreen_heading: `Connecta una cartera`, - connectorsScreen_newcomer: `No tinc una cartera`, - connectorsScreen_h1: `Què és una cartera?`, - connectorsScreen_p: `Les carteres s'utilitzen per enviar, rebre i emmagatzemar actius digitals. Si connectes una cartera, podràs interactuar amb les aplicacions.`, - - mobileConnectorsScreen_heading: `Tria una cartera`, - - scanScreen_heading: `Escaneja amb el telèfon`, - scanScreen_heading_withConnector: `Escaneja amb {{ CONNECTORNAME }}`, - scanScreen_tooltip_walletConnect: `Obre una cartera compatible amb WalletConnect [WALLETCONNECTLOGO] per escanejar`, - scanScreen_tooltip_default: `Obre {{ CONNECTORNAME }} en el teu telèfon mòbil per escanejar`, - - downloadAppScreen_heading: `Obté {{ CONNECTORNAME }}`, - downloadAppScreen_iosAndroid: `Escaneja amb la càmera del teu telèfon per descarregar-la en iOS o Android.`, - downloadAppScreen_ios: `Escaneja amb la càmera del teu telèfon per descarregar-la en iOS.`, - downloadAppScreen_android: `Escaneja amb la càmera del teu telèfon per descarregar-la en Android.`, - - injectionScreen_unavailable_h1: `Navegador no compatible`, - injectionScreen_unavailable_p: `Per connectar la teva cartera de {{ CONNECTORSHORTNAME }}, instal·la l'extensió en {{ SUGGESTEDEXTENSIONBROWSER }}.`, - - injectionScreen_install_h1: `Instal·la {{ CONNECTORNAME }}`, - injectionScreen_install_p: `Per connectar la teva cartera de {{ CONNECTORSHORTNAME }}, instal·la l'extensió del navegador.`, - - injectionScreen_connecting_h1: `Sol·licitud de connexió`, - injectionScreen_connecting_p: `Obre l'extensió del navegador de {{ CONNECTORSHORTNAME }} per connectar la teva cartera.`, - - injectionScreen_connecting_injected_h1: `Sol·licitud de connexió`, - injectionScreen_connecting_injected_p: `Accepta la sol·licitud a través de la teva cartera per connectar-te a aquesta aplicació.`, - - injectionScreen_connected_h1: `Ja connectada`, - injectionScreen_connected_p: `Ja pots tancar aquesta finestra emergent`, - - injectionScreen_rejected_h1: `Sol·licitud cancel·lada`, - injectionScreen_rejected_p: `Has cancel·lat la sol·licitud. Fes clic a dalt per tornar-ho a intentar.`, - - injectionScreen_failed_h1: `Error de connexió`, - injectionScreen_failed_p: `Ho sentim, hi ha hagut un problema. Intenta connectar-te de nou.`, - - injectionScreen_notconnected_h1: `Inicia sessió en {{ CONNECTORNAME }}`, - injectionScreen_notconnected_p: `Per continuar, inicia sessió en la teva extensió de {{ CONNECTORNAME }}.`, - - profileScreen_heading: 'Connectat', - - switchNetworkScreen_heading: 'Canvi de xarxa', - - signInWithEthereumScreen_tooltip: 'No has iniciat sessió en aquesta aplicació.\n**Inicia sessió amb Ethereum** per continuar.', - - signInWithEthereumScreen_signedOut_heading: 'Inicia sessió amb Ethereum', - signInWithEthereumScreen_signedOut_h1: "Aquesta aplicació vol verificar que ets el propietari d'aquesta cartera.", - signInWithEthereumScreen_signedOut_p: `Signa la sol·licitud de missatge en la teva cartera per continuar.`, - signInWithEthereumScreen_signedOut_button: 'Inicia sessió', - - signInWithEthereumScreen_signedIn_heading: 'Sessió iniciada amb Ethereum', - signInWithEthereumScreen_signedIn_h1: "T'has verificat correctament com a propietari d'aquesta cartera.", - signInWithEthereumScreen_signedIn_p: `Si tanques la sessió, hauràs de tornar a autenticar-te més endavant.`, - signInWithEthereumScreen_signedIn_button: 'Tanca sessió', + disconnect: 'Desconnectar', + connected: 'Connectat', + wrongNetwork: 'Xarxa incorrecta', + switchNetworks: 'Canvi de xarxa', + chainNetwork: 'Xarxa {{ CHAIN }}', + copyToClipboard: 'Copia al portapapers', + copyCode: 'Copia codi', + moreInformation: 'Més informació', + back: 'Enrere', + close: 'Tanca', + or: 'o', + more: 'Més', + tryAgain: 'Torna-ho a intentar', + tryAgainQuestion: 'Tornar a intentar-ho?', + dontHaveTheApp: "No tens l'aplicació?", + scanTheQRCode: 'Escaneja el codi QR', + useWalletConnectModal: 'Utilitza WalletConnect Modal', + useModal: 'Utilitza Modal', + installTheExtension: "Instal·la l'extensió", + getWalletName: 'Obté {{ CONNECTORNAME }}', + otherWallets: 'Altres carteres', + learnMore: 'Més informació', + getWallet: 'Obté una cartera', + approveInWallet: 'Aprova a la cartera', + confirmInWallet: 'Confirma a la cartera', + awaitingConfirmation: 'Esperant confirmació', + signIn: 'Inicia sessió', + signOut: 'Tanca sessió', + signedIn: 'Sessió iniciada', + signedOut: 'Sessió tancada', + walletNotConnected: 'Cartera no connectada', + + warnings_walletSwitchingUnsupported: `La teva cartera no permet canviar de xarxa des d'aquesta aplicació.`, + warnings_walletSwitchingUnsupportedResolve: `Prova a canviar de xarxa des de la teva cartera.`, + warnings_chainUnsupported: `Aquesta aplicació no és compatible amb la xarxa connectada actualment.`, + warnings_chainUnsupportedResolve: `Canvia o desconnecta per continuar.`, + + onboardingScreen_heading: `Obté una cartera`, + onboardingScreen_h1: `Comença a explorar la Web3`, + onboardingScreen_p: `La teva cartera és el portal d'accés a tot el relacionat amb Ethereum, la tecnologia màgica que permet explorar la Web3.`, + onboardingScreen_ctaText: `Tria la teva primera cartera`, + onboardingScreen_ctaUrl: `https://ethereum.org/es/wallets/find-wallet/`, + + aboutScreen_heading: `Sobre les carteres`, + aboutScreen_a_h1: `Per als teus actius digitals`, + aboutScreen_a_p: `Les carteres et permeten enviar, rebre, emmagatzemar i interactuar amb actius digitals com els NFT i altres tokens d'Ethereum.`, + aboutScreen_b_h1: `Una manera millor d'iniciar sessió`, + aboutScreen_b_p: `Amb les aplicacions modernes, pots utilitzar la teva cartera per iniciar sessió fàcilment, en lloc de haver de recordar una contrasenya.`, + aboutScreen_c_h1: `Explora el món de la Web3`, + aboutScreen_c_p: `La teva cartera és una eina essencial que et permet explorar i participar en el món en ràpida evolució de la Web3.`, + aboutScreen_ctaText: `Més informació`, + aboutScreen_ctaUrl: `https://ethereum.org/es/wallets/`, + + connectorsScreen_heading: `Connecta una cartera`, + connectorsScreen_newcomer: `No tinc una cartera`, + connectorsScreen_h1: `Què és una cartera?`, + connectorsScreen_p: `Les carteres s'utilitzen per enviar, rebre i emmagatzemar actius digitals. Si connectes una cartera, podràs interactuar amb les aplicacions.`, + + mobileConnectorsScreen_heading: `Tria una cartera`, + + scanScreen_heading: `Escaneja amb el telèfon`, + scanScreen_heading_withConnector: `Escaneja amb {{ CONNECTORNAME }}`, + scanScreen_tooltip_walletConnect: `Obre una cartera compatible amb WalletConnect [WALLETCONNECTLOGO] per escanejar`, + scanScreen_tooltip_default: `Obre {{ CONNECTORNAME }} en el teu telèfon mòbil per escanejar`, + + downloadAppScreen_heading: `Obté {{ CONNECTORNAME }}`, + downloadAppScreen_iosAndroid: `Escaneja amb la càmera del teu telèfon per descarregar-la en iOS o Android.`, + downloadAppScreen_ios: `Escaneja amb la càmera del teu telèfon per descarregar-la en iOS.`, + downloadAppScreen_android: `Escaneja amb la càmera del teu telèfon per descarregar-la en Android.`, + + injectionScreen_unavailable_h1: `Navegador no compatible`, + injectionScreen_unavailable_p: `Per connectar la teva cartera de {{ CONNECTORSHORTNAME }}, instal·la l'extensió en {{ SUGGESTEDEXTENSIONBROWSER }}.`, + + injectionScreen_install_h1: `Instal·la {{ CONNECTORNAME }}`, + injectionScreen_install_p: `Per connectar la teva cartera de {{ CONNECTORSHORTNAME }}, instal·la l'extensió del navegador.`, + + injectionScreen_connecting_h1: `Sol·licitud de connexió`, + injectionScreen_connecting_p: `Obre l'extensió del navegador de {{ CONNECTORSHORTNAME }} per connectar la teva cartera.`, + + injectionScreen_connecting_injected_h1: `Sol·licitud de connexió`, + injectionScreen_connecting_injected_p: `Accepta la sol·licitud a través de la teva cartera per connectar-te a aquesta aplicació.`, + + injectionScreen_connected_h1: `Ja connectada`, + injectionScreen_connected_p: `Ja pots tancar aquesta finestra emergent`, + + injectionScreen_rejected_h1: `Sol·licitud cancel·lada`, + injectionScreen_rejected_p: `Has cancel·lat la sol·licitud. Fes clic a dalt per tornar-ho a intentar.`, + + injectionScreen_failed_h1: `Error de connexió`, + injectionScreen_failed_p: `Ho sentim, hi ha hagut un problema. Intenta connectar-te de nou.`, + + injectionScreen_notconnected_h1: `Inicia sessió en {{ CONNECTORNAME }}`, + injectionScreen_notconnected_p: `Per continuar, inicia sessió en la teva extensió de {{ CONNECTORNAME }}.`, + + profileScreen_heading: 'Connectat', + + switchNetworkScreen_heading: 'Canvi de xarxa', + + signInWithEthereumScreen_tooltip: + 'No has iniciat sessió en aquesta aplicació.\n**Inicia sessió amb Ethereum** per continuar.', + + signInWithEthereumScreen_signedOut_heading: 'Inicia sessió amb Ethereum', + signInWithEthereumScreen_signedOut_h1: + "Aquesta aplicació vol verificar que ets el propietari d'aquesta cartera.", + signInWithEthereumScreen_signedOut_p: `Signa la sol·licitud de missatge en la teva cartera per continuar.`, + signInWithEthereumScreen_signedOut_button: 'Inicia sessió', + + signInWithEthereumScreen_signedIn_heading: 'Sessió iniciada amb Ethereum', + signInWithEthereumScreen_signedIn_h1: + "T'has verificat correctament com a propietari d'aquesta cartera.", + signInWithEthereumScreen_signedIn_p: `Si tanques la sessió, hauràs de tornar a autenticar-te més endavant.`, + signInWithEthereumScreen_signedIn_button: 'Tanca sessió', }; export default caAD; diff --git a/packages/connectkit/src/localizations/locales/ee-EE.ts b/packages/connectkit/src/localizations/locales/ee-EE.ts index ce408882..b0607d04 100644 --- a/packages/connectkit/src/localizations/locales/ee-EE.ts +++ b/packages/connectkit/src/localizations/locales/ee-EE.ts @@ -1,6 +1,8 @@ import { LocaleProps } from './'; +import enUS from './en-US'; const eeEE: LocaleProps = { + ...enUS, // fallback connectWallet: 'Ühenda rahakott', disconnect: 'Katkesta ühendus', connected: 'Ühendatud', diff --git a/packages/connectkit/src/localizations/locales/en-US.ts b/packages/connectkit/src/localizations/locales/en-US.ts index 0fcbac9d..1ceb6374 100644 --- a/packages/connectkit/src/localizations/locales/en-US.ts +++ b/packages/connectkit/src/localizations/locales/en-US.ts @@ -1,4 +1,10 @@ const enUS = { + // Family Account + continueWithFamily: 'Continue with Family', + orSelectWallet: 'or select a wallet from the list below', + loginWithEmailOrPhone: 'Login with Email or Phone', + connectWithFamilyIOS: 'Connect with Family iOS', + // ConnectKit connectWallet: 'Connect Wallet', disconnect: 'Disconnect', connected: 'Connected', @@ -68,7 +74,7 @@ const enUS = { downloadAppScreen_heading: `Get {{ CONNECTORNAME }}`, downloadAppScreen_iosAndroid: `Scan with your phone camera to download on iOS or Android.`, downloadAppScreen_ios: `Scan with your phone camera to download on iOS.`, - downloadAppScreen_android: `Scan with your phone camera to download Android.`, + downloadAppScreen_android: `Scan with your phone camera to download on Android.`, injectionScreen_unavailable_h1: `Unsupported Browser`, injectionScreen_unavailable_p: `To connect your {{ CONNECTORSHORTNAME }} wallet,\ninstall the extension on {{ SUGGESTEDEXTENSIONBROWSER }}.`, diff --git a/packages/connectkit/src/localizations/locales/es-ES.ts b/packages/connectkit/src/localizations/locales/es-ES.ts index 56a44a8b..c183e9ec 100644 --- a/packages/connectkit/src/localizations/locales/es-ES.ts +++ b/packages/connectkit/src/localizations/locales/es-ES.ts @@ -1,6 +1,8 @@ import { LocaleProps } from './'; +import enUS from './en-US'; const esES: LocaleProps = { + ...enUS, // fallback connectWallet: 'Conecta una cartera', disconnect: 'Desconectar', connected: 'Conectado', diff --git a/packages/connectkit/src/localizations/locales/fa-IR.ts b/packages/connectkit/src/localizations/locales/fa-IR.ts index 0da6ab35..861f092f 100644 --- a/packages/connectkit/src/localizations/locales/fa-IR.ts +++ b/packages/connectkit/src/localizations/locales/fa-IR.ts @@ -1,6 +1,8 @@ import { LocaleProps } from './'; +import enUS from './en-US'; const faIR: LocaleProps = { + ...enUS, // fallback connectWallet: 'اتصال به کیف پول', disconnect: 'قطع ارتباط', connected: 'متصل شد', diff --git a/packages/connectkit/src/localizations/locales/fr-FR.ts b/packages/connectkit/src/localizations/locales/fr-FR.ts index 4cf37cb9..e8d15230 100644 --- a/packages/connectkit/src/localizations/locales/fr-FR.ts +++ b/packages/connectkit/src/localizations/locales/fr-FR.ts @@ -1,6 +1,8 @@ import { LocaleProps } from './'; +import enUS from './en-US'; const frFR: LocaleProps = { + ...enUS, // fallback connectWallet: 'Connecter le portefeuille', disconnect: 'Déconnecter', connected: 'Connecté', diff --git a/packages/connectkit/src/localizations/locales/ja-JP.ts b/packages/connectkit/src/localizations/locales/ja-JP.ts index 3d6ef9c3..ab7291bd 100644 --- a/packages/connectkit/src/localizations/locales/ja-JP.ts +++ b/packages/connectkit/src/localizations/locales/ja-JP.ts @@ -1,4 +1,8 @@ -export default { +import { LocaleProps } from './'; +import enUS from './en-US'; + +const jaJP: LocaleProps = { + ...enUS, // fallback connectWallet: 'ウォレットの接続', disconnect: '切断', connected: '接続されました', @@ -111,3 +115,5 @@ export default { signInWithEthereumScreen_signedIn_p: `サインアウトすると、今後 再度認証する必要があります。`, signInWithEthereumScreen_signedIn_button: 'サインアウト', }; + +export default jaJP; diff --git a/packages/connectkit/src/localizations/locales/pt-BR.ts b/packages/connectkit/src/localizations/locales/pt-BR.ts index d623fa53..0f649ca1 100644 --- a/packages/connectkit/src/localizations/locales/pt-BR.ts +++ b/packages/connectkit/src/localizations/locales/pt-BR.ts @@ -1,6 +1,8 @@ import { LocaleProps } from './'; +import enUS from './en-US'; const ptBR: LocaleProps = { + ...enUS, // fallback connectWallet: 'Conectar carteira', disconnect: 'Desconectar', connected: 'Conectado', @@ -101,16 +103,19 @@ const ptBR: LocaleProps = { switchNetworkScreen_heading: 'Alternar rede', - signInWithEthereumScreen_tooltip: 'Você não está conectado a este aplicativo.\n**Entre com Ethereum** para continuar.', + signInWithEthereumScreen_tooltip: + 'Você não está conectado a este aplicativo.\n**Entre com Ethereum** para continuar.', signInWithEthereumScreen_signedOut_heading: 'Entrar com Ethereum', - signInWithEthereumScreen_signedOut_h1: 'Este aplicativo gostaria de verificar você \n como o proprietário desta carteira.', + signInWithEthereumScreen_signedOut_h1: + 'Este aplicativo gostaria de verificar você \n como o proprietário desta carteira.', signInWithEthereumScreen_signedOut_p: `Por favor, assine o pedido de mensagem \n em sua carteira para continuar.`, signInWithEthereumScreen_signedOut_button: 'Entrar', signInWithEthereumScreen_signedIn_heading: 'Conectado com Ethereum', - signInWithEthereumScreen_signedIn_h1: 'Você se verificou com sucesso \n como o proprietário desta carteira', + signInWithEthereumScreen_signedIn_h1: + 'Você se verificou com sucesso \n como o proprietário desta carteira', signInWithEthereumScreen_signedIn_p: `Se sair, será necessário que você \n autentique novamente no futuro.`, - signInWithEthereumScreen_signedIn_button: 'Sair' + signInWithEthereumScreen_signedIn_button: 'Sair', }; export default ptBR; diff --git a/packages/connectkit/src/localizations/locales/ru-RU.ts b/packages/connectkit/src/localizations/locales/ru-RU.ts index 87accce0..1ff69778 100644 --- a/packages/connectkit/src/localizations/locales/ru-RU.ts +++ b/packages/connectkit/src/localizations/locales/ru-RU.ts @@ -1,6 +1,8 @@ import { LocaleProps } from './'; +import enUS from './en-US'; const ruRU: LocaleProps = { + ...enUS, // fallback connectWallet: 'Подключить кошелек', disconnect: 'Отключить', connected: 'Подключена', @@ -46,7 +48,7 @@ const ruRU: LocaleProps = { onboardingScreen_ctaUrl: `https://ethereum.org/en/wallets/find-wallet/`, aboutScreen_heading: `О кошельках`, - aboutScreen_a_h1: `Для ваших цифровых активов`, + aboutScreen_a_h1: `Для ваших цифровых активов`, aboutScreen_a_p: `Кошельки позволяют вам отправлять, получать, хранить и взаимодействовать с цифровыми активами, такими как NFT и другие токены Ethereum.`, aboutScreen_b_h1: `Лучший способ входа`, aboutScreen_b_p: `В современных приложениях ваш кошелек можно использовать как удобный способ входа без необходимости помнить пароль.`, @@ -115,4 +117,4 @@ const ruRU: LocaleProps = { signInWithEthereumScreen_signedIn_button: 'Выйти', }; -export default ruRU; \ No newline at end of file +export default ruRU; diff --git a/packages/connectkit/src/localizations/locales/tr-TR.ts b/packages/connectkit/src/localizations/locales/tr-TR.ts index ccc64fa5..d2bc30d0 100644 --- a/packages/connectkit/src/localizations/locales/tr-TR.ts +++ b/packages/connectkit/src/localizations/locales/tr-TR.ts @@ -1,6 +1,8 @@ import { LocaleProps } from './'; +import enUS from './en-US'; const trTR: LocaleProps = { + ...enUS, // fallback connectWallet: 'Cüzdan Bağla', disconnect: 'Bağlantıyı Kes', connected: 'Bağlandı', @@ -16,7 +18,7 @@ const trTR: LocaleProps = { more: 'Daha Fazla', tryAgain: 'Tekrar Dene', tryAgainQuestion: 'Tekrar Dene?', - dontHaveTheApp: "Uygulaman yok mu?", + dontHaveTheApp: 'Uygulaman yok mu?', scanTheQRCode: 'Karekodu tarat', useWalletConnectModal: 'WalletConnect Modalini Kullan ', useModal: 'Modal Kullan', @@ -74,7 +76,6 @@ const trTR: LocaleProps = { injectionScreen_unavailable_h1: `Desteklenmeyen Tarayıcı`, injectionScreen_unavailable_p: `{{ CONNECTORSHORTNAME }} cüzdanına bağlanmak için\n{{ SUGGESTEDEXTENSIONBROWSER }} üzerinde indirmen gerekiyor.`, - injectionScreen_install_h1: `{{ CONNECTORNAME }} İndir`, injectionScreen_install_p: `{{ CONNECTORSHORTNAME }} cüzdanına bağlanmak için,\ntarayıcı eklentisini indir.`, diff --git a/packages/connectkit/src/localizations/locales/vi-VN.ts b/packages/connectkit/src/localizations/locales/vi-VN.ts index f53debd4..cf834c80 100644 --- a/packages/connectkit/src/localizations/locales/vi-VN.ts +++ b/packages/connectkit/src/localizations/locales/vi-VN.ts @@ -1,6 +1,8 @@ import { LocaleProps } from './'; +import enUS from './en-US'; const viVN: LocaleProps = { + ...enUS, // fallback connectWallet: 'Kết nối ví', disconnect: 'Ngắt kết nối', connected: 'Đã kết nối', diff --git a/packages/connectkit/src/localizations/locales/zh-CN.ts b/packages/connectkit/src/localizations/locales/zh-CN.ts index f390c1bd..b16680ce 100644 --- a/packages/connectkit/src/localizations/locales/zh-CN.ts +++ b/packages/connectkit/src/localizations/locales/zh-CN.ts @@ -1,6 +1,8 @@ import { LocaleProps } from './'; +import enUS from './en-US'; const zhCN: LocaleProps = { + ...enUS, // fallback connectWallet: '绑定钱包', disconnect: '解除绑定', connected: '已绑定', diff --git a/packages/connectkit/src/styles/index.ts b/packages/connectkit/src/styles/index.ts index af0b9461..e8134d4a 100644 --- a/packages/connectkit/src/styles/index.ts +++ b/packages/connectkit/src/styles/index.ts @@ -31,7 +31,7 @@ const themeGlobals = { '--ck-graphic-scaniconwithlogos-04': '#F6F7F9', '--ck-chain-ethereum-01': '#25292E', - '--ck-chain-ethereum-02': '#fff', + '--ck-chain-ethereum-02': '#ffffff', '--ck-chain-ethereum-03': '#DFE0E0', }, dark: { @@ -90,6 +90,7 @@ const themeGlobals = { }, }, brand: { + '--ck-family-accounts-brand': '#0FCCCC', '--ck-family-brand': '#1A88F8', '--ck-brand-walletConnect': '#3B99FC', '--ck-brand-coinbaseWallet': '#0052FF', @@ -170,11 +171,11 @@ const themes = { nouns: createCssColors(themeColors.nouns), }; const globals = { - brand: createCssVars(themeGlobals.brand), - ensLight: createCssVars(themeGlobals.ens.light), - ensDark: createCssVars(themeGlobals.ens.dark), - graphicsLight: createCssVars(themeGlobals.graphics.light), - graphicsDark: createCssVars(themeGlobals.graphics.dark), + brand: createCssColors(themeGlobals.brand), + ensLight: createCssColors(themeGlobals.ens.light), + ensDark: createCssColors(themeGlobals.ens.dark), + graphicsLight: createCssColors(themeGlobals.graphics.light), + graphicsDark: createCssColors(themeGlobals.graphics.dark), }; const globalsLight = css` @@ -262,7 +263,6 @@ export const ResetContainer = styled(motion.div)<{ } }} - ${(props) => { if ( props.$customTheme && diff --git a/packages/connectkit/src/utils/index.ts b/packages/connectkit/src/utils/index.ts index 66f22e8a..4257156e 100644 --- a/packages/connectkit/src/utils/index.ts +++ b/packages/connectkit/src/utils/index.ts @@ -80,6 +80,12 @@ function flattenChildren(children: React.ReactNode): ReactChildArray { export const isWalletConnectConnector = (connectorId?: string) => connectorId === 'walletConnect'; +export const isFamilyAccountsConnector = (connectorId?: string) => + connectorId === 'familyAccountsProvider'; + +export const isFamilyConnector = (connectorId?: string) => + connectorId === 'co.family.wallet'; + export const isMetaMaskConnector = (connectorId?: string) => connectorId === 'metaMaskSDK'; diff --git a/packages/connectkit/src/wallets/walletConfigs.tsx b/packages/connectkit/src/wallets/walletConfigs.tsx index 557fb026..dadf9057 100644 --- a/packages/connectkit/src/wallets/walletConfigs.tsx +++ b/packages/connectkit/src/wallets/walletConfigs.tsx @@ -129,6 +129,13 @@ export const walletConfigs: { : `familywallet://wc?uri=${encodeURIComponent(uri)}`; }, }, + familyAccountsProvider: { + name: 'Family', + shortName: 'Family', + icon: , + iconConnector: , + iconShape: 'squircle', + }, frame: { name: 'Frame', icon: , diff --git a/yarn.lock b/yarn.lock index d73eb265..cf159037 100644 --- a/yarn.lock +++ b/yarn.lock @@ -7218,6 +7218,7 @@ __metadata: "@types/styled-components": ^5.1.25 buffer: ^6.0.3 detect-browser: ^5.3.0 + family: ^0.1.1 framer-motion: ^6.3.11 qrcode: ^1.5.0 react-transition-state: ^1.1.4 @@ -9691,6 +9692,27 @@ __metadata: languageName: unknown linkType: soft +"family@npm:^0.1.1": + version: 0.1.1 + resolution: "family@npm:0.1.1" + peerDependencies: + react: 17.x || 18.x || 19.x + react-dom: 17.x || 18.x || 19.x + viem: 2.x + wagmi: 2.x + peerDependenciesMeta: + react: + optional: true + react-dom: + optional: true + viem: + optional: true + wagmi: + optional: true + checksum: 520006079a7c3f8ac1b5c492d30ab7bfa7f19f396aa2992bbe42e24ae1f65b4511ff1e6c25b325428cbbaaaae61b44cb6fca2bbddcf5307758c8f7f44fe9fb59 + languageName: node + linkType: hard + "fast-deep-equal@npm:^3.1.1, fast-deep-equal@npm:^3.1.3": version: 3.1.3 resolution: "fast-deep-equal@npm:3.1.3" From 1d1e5ea8a39834e0d55a2be53a5895aa53baf1dd Mon Sep 17 00:00:00 2001 From: Lochie Axon Date: Thu, 3 Apr 2025 00:32:27 +1100 Subject: [PATCH 06/13] version 1.9.0 --- packages/connectkit/package.json | 2 +- packages/connectkit/src/index.ts | 2 +- 2 files changed, 2 insertions(+), 2 deletions(-) diff --git a/packages/connectkit/package.json b/packages/connectkit/package.json index cfc0e62a..a36eec5f 100644 --- a/packages/connectkit/package.json +++ b/packages/connectkit/package.json @@ -1,6 +1,6 @@ { "name": "connectkit", - "version": "1.8.2", + "version": "1.9.0", "author": "Family", "homepage": "https://docs.family.co/connectkit", "license": "BSD-2-Clause license", diff --git a/packages/connectkit/src/index.ts b/packages/connectkit/src/index.ts index a9a16a77..1c947ce7 100644 --- a/packages/connectkit/src/index.ts +++ b/packages/connectkit/src/index.ts @@ -1,4 +1,4 @@ -export const CONNECTKIT_VERSION = '1.8.2'; +export const CONNECTKIT_VERSION = '1.9.0'; export * as Types from './types'; export { default as getDefaultConfig } from './defaultConfig'; From 27cb532915495771f0c700f2ff7e29dbdcb93ad2 Mon Sep 17 00:00:00 2001 From: Lochie Axon Date: Wed, 21 May 2025 23:16:25 +1000 Subject: [PATCH 07/13] update: family branding --- packages/connectkit/src/styles/index.ts | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/packages/connectkit/src/styles/index.ts b/packages/connectkit/src/styles/index.ts index e8134d4a..7a358cd9 100644 --- a/packages/connectkit/src/styles/index.ts +++ b/packages/connectkit/src/styles/index.ts @@ -90,7 +90,7 @@ const themeGlobals = { }, }, brand: { - '--ck-family-accounts-brand': '#0FCCCC', + '--ck-family-accounts-brand': '#0090ff', '--ck-family-brand': '#1A88F8', '--ck-brand-walletConnect': '#3B99FC', '--ck-brand-coinbaseWallet': '#0052FF', From b9ba493a36fce9d2efb0824b8cceb75225c9c9bf Mon Sep 17 00:00:00 2001 From: Lochie Axon Date: Fri, 13 Jun 2025 15:23:11 +1000 Subject: [PATCH 08/13] update: family sdk version + features (#464) * improve locale handling * bump family * add switch wallet support in family connector * update family logo --- packages/connectkit/package.json | 2 +- packages/connectkit/src/assets/logos.tsx | 3 +- .../src/components/Pages/Profile/index.tsx | 35 ++++++++++++++++++- packages/connectkit/src/hooks/useLocales.tsx | 9 ++--- .../src/localizations/locales/en-US.ts | 1 + yarn.lock | 10 +++--- 6 files changed, 47 insertions(+), 13 deletions(-) diff --git a/packages/connectkit/package.json b/packages/connectkit/package.json index a36eec5f..9673f293 100644 --- a/packages/connectkit/package.json +++ b/packages/connectkit/package.json @@ -41,7 +41,7 @@ "dependencies": { "buffer": "^6.0.3", "detect-browser": "^5.3.0", - "family": "^0.1.1", + "family": "^0.1.2", "framer-motion": "^6.3.11", "qrcode": "^1.5.0", "react-transition-state": "^1.1.4", diff --git a/packages/connectkit/src/assets/logos.tsx b/packages/connectkit/src/assets/logos.tsx index 46d61899..1c2649ed 100644 --- a/packages/connectkit/src/assets/logos.tsx +++ b/packages/connectkit/src/assets/logos.tsx @@ -392,12 +392,11 @@ export const FamilyAccount = () => ( fill="none" xmlns="http://www.w3.org/2000/svg" > - ); diff --git a/packages/connectkit/src/components/Pages/Profile/index.tsx b/packages/connectkit/src/components/Pages/Profile/index.tsx index b4c65f55..04f6cbdb 100644 --- a/packages/connectkit/src/components/Pages/Profile/index.tsx +++ b/packages/connectkit/src/components/Pages/Profile/index.tsx @@ -1,6 +1,7 @@ import React, { useEffect, useState } from 'react'; import { useContext } from '../../ConnectKit'; import { + isFamilyAccountsConnector, isSafeConnector, nFormatter, truncateEthAddress, @@ -12,6 +13,7 @@ import { useAccount, useEnsName, useBalance, + useConnectorClient, } from 'wagmi'; import { @@ -50,6 +52,11 @@ const Profile: React.FC<{ closeModal?: () => void }> = ({ closeModal }) => { const { disconnect } = useDisconnect(); const { address, isConnected, connector, chain } = useAccount(); + const isFamilyConnector = isFamilyAccountsConnector(connector?.id); + const { data: connectorClient } = useConnectorClient({ + connector, + }); + const ensFallbackConfig = useEnsFallbackConfig(); const { data: ensName } = useEnsName({ chainId: 1, @@ -135,10 +142,36 @@ const Profile: React.FC<{ closeModal?: () => void }> = ({ closeModal }) => { )}
+ + {isFamilyConnector && ( + <> + + + )} {!isSafeConnector(connector?.id) && ( diff --git a/packages/connectkit/src/hooks/useLocales.tsx b/packages/connectkit/src/hooks/useLocales.tsx index 266f488a..452da38e 100644 --- a/packages/connectkit/src/hooks/useLocales.tsx +++ b/packages/connectkit/src/hooks/useLocales.tsx @@ -4,8 +4,9 @@ import Logos from '../assets/logos'; import { useContext } from '../components/ConnectKit'; import { getLocale } from './../localizations'; +import { LocaleProps } from '../localizations/locales'; -export default function useLocales(replacements?: any) { +export default function useLocales(replacements?: any): LocaleProps { const context = useContext(); const language = context.options?.language ?? 'en-US'; @@ -15,16 +16,16 @@ export default function useLocales(replacements?: any) { if (!translations) { console.error(`Missing translations for: ${language}`); - return `Missing translations for: ${language}`; + throw new Error(`Missing translations for: ${language}`); } - const translated: any = {}; + const translated = {}; Object.keys(translations).map((key) => { const string = translations[key]; return (translated[key] = localize(string, replacements)); }); - return translated; + return translated as LocaleProps; } const localize = (text: string, replacements?: any[string]) => { diff --git a/packages/connectkit/src/localizations/locales/en-US.ts b/packages/connectkit/src/localizations/locales/en-US.ts index 1ceb6374..c914bf0c 100644 --- a/packages/connectkit/src/localizations/locales/en-US.ts +++ b/packages/connectkit/src/localizations/locales/en-US.ts @@ -10,6 +10,7 @@ const enUS = { connected: 'Connected', wrongNetwork: 'Wrong Network', switchNetworks: 'Switch Networks', + switchWallets: 'Switch Wallets', chainNetwork: '{{ CHAIN }} Network', copyToClipboard: 'Copy to Clipboard', copyCode: 'Copy Code', diff --git a/yarn.lock b/yarn.lock index cf159037..fe62dc4d 100644 --- a/yarn.lock +++ b/yarn.lock @@ -7218,7 +7218,7 @@ __metadata: "@types/styled-components": ^5.1.25 buffer: ^6.0.3 detect-browser: ^5.3.0 - family: ^0.1.1 + family: ^0.1.2 framer-motion: ^6.3.11 qrcode: ^1.5.0 react-transition-state: ^1.1.4 @@ -9692,9 +9692,9 @@ __metadata: languageName: unknown linkType: soft -"family@npm:^0.1.1": - version: 0.1.1 - resolution: "family@npm:0.1.1" +"family@npm:^0.1.2": + version: 0.1.2 + resolution: "family@npm:0.1.2" peerDependencies: react: 17.x || 18.x || 19.x react-dom: 17.x || 18.x || 19.x @@ -9709,7 +9709,7 @@ __metadata: optional: true wagmi: optional: true - checksum: 520006079a7c3f8ac1b5c492d30ab7bfa7f19f396aa2992bbe42e24ae1f65b4511ff1e6c25b325428cbbaaaae61b44cb6fca2bbddcf5307758c8f7f44fe9fb59 + checksum: 2e2d43b773f7c8719fcb93331416ef7710151f961e6645ae3ff87a23584335b1fe36b29099b28d6d860bacc3722888cf5de0373ea976d620b43a8daf21422274 languageName: node linkType: hard From cf8a1e2f9c36cf9fdc5fed280c9a7db103dcce78 Mon Sep 17 00:00:00 2001 From: Lochie Axon Date: Fri, 13 Jun 2025 17:14:35 +1000 Subject: [PATCH 09/13] version 1.9.1 --- CHANGELOG.md | 12 ++++++++++++ packages/connectkit/package.json | 2 +- packages/connectkit/src/index.ts | 2 +- 3 files changed, 14 insertions(+), 2 deletions(-) diff --git a/CHANGELOG.md b/CHANGELOG.md index 49746bf0..c8a4592a 100644 --- a/CHANGELOG.md +++ b/CHANGELOG.md @@ -1,3 +1,15 @@ +# 1.9.1 + +This update includes updates to the peer dependencies and improvements to the Family Accounts features. + +## Updated + +- `family` package updated to latest. + +## Improved + +- Improved support for `family` features. + # 1.9.0 We're thrilled to announce a major upgrade to ConnectKit—designed to make onboarding and navigating Ethereum simpler and safer than ever. diff --git a/packages/connectkit/package.json b/packages/connectkit/package.json index 9673f293..9374bd10 100644 --- a/packages/connectkit/package.json +++ b/packages/connectkit/package.json @@ -1,6 +1,6 @@ { "name": "connectkit", - "version": "1.9.0", + "version": "1.9.1", "author": "Family", "homepage": "https://docs.family.co/connectkit", "license": "BSD-2-Clause license", diff --git a/packages/connectkit/src/index.ts b/packages/connectkit/src/index.ts index 1c947ce7..023b3f05 100644 --- a/packages/connectkit/src/index.ts +++ b/packages/connectkit/src/index.ts @@ -1,4 +1,4 @@ -export const CONNECTKIT_VERSION = '1.9.0'; +export const CONNECTKIT_VERSION = '1.9.1'; export * as Types from './types'; export { default as getDefaultConfig } from './defaultConfig'; From 6095ed1e940dff2386c27f50980f89309be0ab85 Mon Sep 17 00:00:00 2001 From: Lochie Axon Date: Thu, 21 Aug 2025 22:51:26 +1000 Subject: [PATCH 10/13] update: metamask branding (#471) --- packages/connectkit/src/assets/logos.tsx | 251 ++--------------------- packages/connectkit/src/styles/index.ts | 21 +- 2 files changed, 23 insertions(+), 249 deletions(-) diff --git a/packages/connectkit/src/assets/logos.tsx b/packages/connectkit/src/assets/logos.tsx index 1c2649ed..e1c77a1d 100644 --- a/packages/connectkit/src/assets/logos.tsx +++ b/packages/connectkit/src/assets/logos.tsx @@ -94,265 +94,44 @@ export const MetaMask = ({ background = false, ...props }) => ( style={ background ? { - background: - 'linear-gradient(0deg, var(--ck-brand-metamask-12), var(--ck-brand-metamask-11))', + background: 'var(--ck-brand-metamask-bg)', borderRadius: '27.5%', } : undefined } - width="32" - height="32" - viewBox="0 0 32 32" + width="88" + height="88" + viewBox="0 0 88 88" fill="none" xmlns="http://www.w3.org/2000/svg" > - {/** - - - - - - - - */} - - - - - - - - - - - - - - - - - - - - - - ); diff --git a/packages/connectkit/src/styles/index.ts b/packages/connectkit/src/styles/index.ts index 7a358cd9..2b89d1c9 100644 --- a/packages/connectkit/src/styles/index.ts +++ b/packages/connectkit/src/styles/index.ts @@ -94,19 +94,14 @@ const themeGlobals = { '--ck-family-brand': '#1A88F8', '--ck-brand-walletConnect': '#3B99FC', '--ck-brand-coinbaseWallet': '#0052FF', - '--ck-brand-metamask': '#f6851b', - '--ck-brand-metamask-01': '#F6851B', - '--ck-brand-metamask-02': '#E2761B', - '--ck-brand-metamask-03': '#CD6116', - '--ck-brand-metamask-04': '#161616', - '--ck-brand-metamask-05': '#763D16', - '--ck-brand-metamask-06': '#D7C1B3', - '--ck-brand-metamask-07': '#C0AD9E', - '--ck-brand-metamask-08': '#E4761B', - '--ck-brand-metamask-09': '#233447', - '--ck-brand-metamask-10': '#E4751F', - '--ck-brand-metamask-11': '#FEF5E7', - '--ck-brand-metamask-12': '#E3C8AB', + '--ck-brand-metamask': '#FF5C16', + '--ck-brand-metamask-bg': '#FFF2EB', + '--ck-brand-metamask-01': '#FF5C16', + '--ck-brand-metamask-02': '#E34807', + '--ck-brand-metamask-03': '#FF8D5D', + '--ck-brand-metamask-04': '#661800', + '--ck-brand-metamask-05': '#C0C4CD', + '--ck-brand-metamask-06': '#E7EBF6', '--ck-brand-trust-01': '#3375BB', '--ck-brand-trust-02': '#ffffff', '--ck-brand-trust-01b': '#ffffff', // dark Theme From 35b9af6f9361cf94ccd897207d23f253ce8e48c6 Mon Sep 17 00:00:00 2001 From: wizard <112275929+famouswizard@users.noreply.github.com> Date: Thu, 21 Aug 2025 16:06:08 +0300 Subject: [PATCH 11/13] fix: Correct symbol for billion from 'g' to 'b' (#445) Co-authored-by: Lochie Axon --- packages/connectkit/src/utils/index.ts | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/packages/connectkit/src/utils/index.ts b/packages/connectkit/src/utils/index.ts index 4257156e..8cfe1a2e 100644 --- a/packages/connectkit/src/utils/index.ts +++ b/packages/connectkit/src/utils/index.ts @@ -24,7 +24,7 @@ const nFormatter = (num: number, digits: number = 2) => { { value: 1, symbol: '' }, { value: 1e3, symbol: 'k' }, { value: 1e6, symbol: 'm' }, - { value: 1e9, symbol: 'g' }, + { value: 1e9, symbol: 'b' }, { value: 1e12, symbol: 't' }, { value: 1e15, symbol: 'p' }, { value: 1e18, symbol: 'e' }, From fc5026961857f6157a9245bef3a68af312f8ad9f Mon Sep 17 00:00:00 2001 From: jxom <7336481+jxom@users.noreply.github.com> Date: Thu, 11 Sep 2025 17:07:03 +1000 Subject: [PATCH 12/13] feat: add porto (#472) --- .../connectkit/src/components/Common/ConnectorList/index.tsx | 3 ++- packages/connectkit/src/utils/index.ts | 3 +++ 2 files changed, 5 insertions(+), 1 deletion(-) diff --git a/packages/connectkit/src/components/Common/ConnectorList/index.tsx b/packages/connectkit/src/components/Common/ConnectorList/index.tsx index beea9c35..4e68c691 100644 --- a/packages/connectkit/src/components/Common/ConnectorList/index.tsx +++ b/packages/connectkit/src/components/Common/ConnectorList/index.tsx @@ -18,6 +18,7 @@ import { WalletProps, useWallets } from '../../../wallets/useWallets'; import { detectBrowser, isCoinbaseWalletConnector, + isPortoConnector, isWalletConnectConnector, } from '../../../utils'; import { useLastConnector } from '../../../hooks/useLastConnector'; @@ -121,7 +122,7 @@ const ConnectorItem = ({ // Safari requires opening popup on user gesture, so we connect immediately here const shouldConnectImmediately = (detectBrowser() === 'safari' || detectBrowser() === 'ios') && - isCoinbaseWalletConnector(wallet.connector.id); + (isCoinbaseWalletConnector(wallet.connector.id) || isPortoConnector(wallet.connector.id)); if (redirectToMoreWallets || shouldConnectImmediately) deeplink = undefined; // mobile redirects to more wallets page diff --git a/packages/connectkit/src/utils/index.ts b/packages/connectkit/src/utils/index.ts index 8cfe1a2e..58980508 100644 --- a/packages/connectkit/src/utils/index.ts +++ b/packages/connectkit/src/utils/index.ts @@ -95,6 +95,9 @@ export const isCoinbaseWalletConnector = (connectorId?: string) => export const isLedgerConnector = (connectorId?: string) => connectorId === 'ledger'; +export const isPortoConnector = (connectorId?: string) => + connectorId === 'xyz.ithaca.porto'; + export const isSafeConnector = (connectorId?: string) => connectorId === 'safe'; export const isInjectedConnector = (connectorId?: string) => From e5c4efb2e8cc0065415a8aa7aab1c5dfb8fbe395 Mon Sep 17 00:00:00 2001 From: Franky Date: Wed, 17 Sep 2025 13:00:13 +0200 Subject: [PATCH 13/13] feat: Add dependency review (#474) --- .github/workflows/dependency-review.yml | 19 +++++++++++++++++++ 1 file changed, 19 insertions(+) create mode 100644 .github/workflows/dependency-review.yml diff --git a/.github/workflows/dependency-review.yml b/.github/workflows/dependency-review.yml new file mode 100644 index 00000000..078574c4 --- /dev/null +++ b/.github/workflows/dependency-review.yml @@ -0,0 +1,19 @@ +name: 'Dependency Review' +on: [pull_request] + +permissions: + contents: read + pull-requests: write + +jobs: + dependency-review: + runs-on: ubuntu-latest + steps: + - name: 'Checkout Repository' + uses: actions/checkout@v5 + - name: 'Dependency Review' + uses: actions/dependency-review-action@v4 + with: + comment-summary-in-pr: on-failure + fail-on-severity: moderate + license-check: false