Skip to content

Commit e92a81c

Browse files
authored
Brands icons and stk template (#37)
* feat: added brands logic * feat: added brand icons for lido and etherfi * feat: added stk logic * fix: added usds asset
1 parent 04db6fb commit e92a81c

Some content is hidden

Large Commits have some content hidden by default. Use the searchbox below for content that may be hidden.

73 files changed

+717
-288
lines changed

README.md

Lines changed: 12 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -54,6 +54,18 @@ Package with some of web3 assets, chains and web3 wallets icons for easy use in
5454
"identityFlag": "isMetaMask"
5555
}
5656
```
57+
### Adding new brand icon
58+
1. Add new `svg` icon files to `src/assets` folder
59+
2. Naming convention is `[brandName.toLowerCase()].svg`
60+
3. Prepare a metadata file in `src/assets` folder with the same name as the icon file, but with `.json` extension:
61+
62+
```json
63+
{
64+
"type": ["brand"],
65+
"brandName": "Lido",
66+
"addressAliases": ["0x4e033931ad43597d96D6bcc25c280717730B58B1"]
67+
}
68+
```
5769
### Adding new combine asset and chain icon
5870
1. Add new `svg` icon files to `src/assets` folder
5971
2. Naming convention is `[symbol]_mono.svg` and `[symbol]_full.svg`

apps/docs/src/app/icons/page.tsx

Lines changed: 32 additions & 59 deletions
Original file line numberDiff line numberDiff line change
@@ -3,13 +3,18 @@ import Fuse from "fuse.js";
33
import React, { useMemo } from "react";
44

55
import { AssetIconCard } from "@/components/AssetIconCard";
6+
import { BrandIconCard } from "@/components/BrandIconCard";
67
import { Branding } from "@/components/Branding";
78
import { ChainIconCard } from "@/components/ChainIconCard";
89
import { Search } from "@/components/Search";
910
import { WalletIconCard } from "@/components/WalletIconCard";
1011

1112
import icons from "../../../../../icons/icons.json";
12-
import { IconInfo, IconType } from "../../../../../src/scripts/types";
13+
import {
14+
IconFormat,
15+
IconInfo,
16+
IconType,
17+
} from "../../../../../src/scripts/types";
1318

1419
async function IconsPage({
1520
searchParams,
@@ -23,7 +28,7 @@ async function IconsPage({
2328
const filteredIcons = useMemo(
2429
() =>
2530
new Fuse(icons as IconInfo[], {
26-
keys: ["chainId", "symbol", "identityFlag", "walletName"],
31+
keys: ["chainId", "symbol", "identityFlag", "walletName", "brandName"],
2732
threshold: 0.3,
2833
distance: 1000,
2934
})
@@ -42,16 +47,16 @@ async function IconsPage({
4247
.map((item) => {
4348
const asset = item;
4449
if (asset.type.includes(IconType.asset)) {
45-
if (asset.icons.aToken && !asset.icons.stataToken) {
46-
return (
47-
<React.Fragment key={asset?.symbol ?? asset?.chainId}>
48-
<AssetIconCard
49-
name={asset.name ?? ""}
50-
symbol={asset?.symbol ?? ""}
51-
chainId={asset.chainId}
52-
chainName={asset.chainName}
53-
icons={asset.icons}
54-
/>
50+
return (
51+
<React.Fragment key={asset?.symbol ?? asset?.chainId}>
52+
<AssetIconCard
53+
name={asset.name ?? ""}
54+
symbol={asset?.symbol ?? ""}
55+
chainId={asset.chainId}
56+
chainName={asset.chainName}
57+
icons={asset.icons}
58+
/>
59+
{asset.icons[IconFormat.aToken] && (
5560
<AssetIconCard
5661
name={asset.name ?? ""}
5762
symbol={asset?.symbol ?? ""}
@@ -60,18 +65,8 @@ async function IconsPage({
6065
icons={asset.icons}
6166
assetTag={AssetTag.AToken}
6267
/>
63-
</React.Fragment>
64-
);
65-
} else if (!asset.icons.aToken && asset.icons.stataToken) {
66-
return (
67-
<React.Fragment key={asset?.symbol ?? asset?.chainId}>
68-
<AssetIconCard
69-
name={asset.name ?? ""}
70-
symbol={asset?.symbol ?? ""}
71-
chainId={asset.chainId}
72-
chainName={asset.chainName}
73-
icons={asset.icons}
74-
/>
68+
)}
69+
{asset.icons[IconFormat.stataToken] && (
7570
<AssetIconCard
7671
name={asset.name ?? ""}
7772
symbol={asset?.symbol ?? ""}
@@ -80,48 +75,19 @@ async function IconsPage({
8075
icons={asset.icons}
8176
assetTag={AssetTag.StataToken}
8277
/>
83-
</React.Fragment>
84-
);
85-
} else if (asset.icons.aToken && asset.icons.stataToken) {
86-
return (
87-
<React.Fragment key={asset?.symbol ?? asset?.chainId}>
88-
<AssetIconCard
89-
name={asset.name ?? ""}
90-
symbol={asset?.symbol ?? ""}
91-
chainId={asset.chainId}
92-
chainName={asset.chainName}
93-
icons={asset.icons}
94-
/>
78+
)}
79+
{asset.icons[IconFormat.stkToken] && (
9580
<AssetIconCard
9681
name={asset.name ?? ""}
9782
symbol={asset?.symbol ?? ""}
9883
chainId={asset.chainId}
9984
chainName={asset.chainName}
10085
icons={asset.icons}
101-
assetTag={AssetTag.AToken}
102-
/>
103-
<AssetIconCard
104-
name={asset.name ?? ""}
105-
symbol={asset?.symbol ?? ""}
106-
chainId={asset.chainId}
107-
chainName={asset.chainName}
108-
icons={asset.icons}
109-
assetTag={AssetTag.StataToken}
86+
assetTag={AssetTag.STKToken}
11087
/>
111-
</React.Fragment>
112-
);
113-
} else {
114-
return (
115-
<AssetIconCard
116-
key={asset?.symbol ?? asset?.chainId}
117-
name={asset.name ?? ""}
118-
symbol={asset?.symbol ?? ""}
119-
chainId={asset.chainId}
120-
chainName={asset.chainName}
121-
icons={asset.icons}
122-
/>
123-
);
124-
}
88+
)}
89+
</React.Fragment>
90+
);
12591
} else if (asset.type.includes(IconType.chain)) {
12692
return (
12793
<ChainIconCard
@@ -138,6 +104,13 @@ async function IconsPage({
138104
name={asset?.walletName ?? "Unknown"}
139105
/>
140106
);
107+
} else if (asset.type.includes(IconType.brand)) {
108+
return (
109+
<BrandIconCard
110+
icons={asset.icons}
111+
name={asset?.brandName ?? "Unknown"}
112+
/>
113+
);
141114
}
142115
})}
143116
{!filteredIcons.length && searchString !== "" && (
Lines changed: 33 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,33 @@
1+
"use client";
2+
3+
import { githubIconsPath } from "@bgd-labs/react-web3-icons/dist/constants";
4+
import {
5+
IconInfoIcons,
6+
IconVariant,
7+
} from "@bgd-labs/react-web3-icons/dist/utils";
8+
import { useState } from "react";
9+
10+
import { IconCard } from "@/components/IconCard";
11+
import { BrandIcon } from "@/components/Web3Icons/BrandIcon";
12+
13+
export const BrandIconCard = ({
14+
name,
15+
icons,
16+
}: {
17+
name: string;
18+
icons: IconInfoIcons;
19+
}) => {
20+
const [variant, setVariant] = useState(IconVariant.Full);
21+
return (
22+
<IconCard
23+
svgPath={`${githubIconsPath}/${icons[variant]}`}
24+
name={name}
25+
subName={""}
26+
fileName={name}
27+
setActiveType={setVariant}
28+
activeType={variant}
29+
>
30+
<BrandIcon addressOrName={name} mono={variant === IconVariant.Mono} />
31+
</IconCard>
32+
);
33+
};
Lines changed: 34 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,34 @@
1+
"use client";
2+
3+
import { BrandIcon as BI } from "@bgd-labs/react-web3-icons";
4+
import { ExternalComponentBaseProps } from "@bgd-labs/react-web3-icons/dist/utils/index";
5+
6+
import { cn } from "@/utils/cn";
7+
8+
interface BrandIconProps extends ExternalComponentBaseProps {
9+
addressOrName: string;
10+
}
11+
/**
12+
* Renders a wallet icon specified by walletName.
13+
*/
14+
export const BrandIcon = ({
15+
addressOrName,
16+
className,
17+
...props
18+
}: BrandIconProps) => {
19+
return (
20+
<BI
21+
addressOrName={addressOrName}
22+
className={cn("size-[70px]", className)}
23+
loader={
24+
<div
25+
className={cn(
26+
"size-[70px] animate-pulse rounded-full bg-brand-300",
27+
className,
28+
)}
29+
/>
30+
}
31+
{...props}
32+
/>
33+
);
34+
};

icons/full/aldo.svg

Lines changed: 1 addition & 1 deletion
Loading

icons/full/ausds.svg

Lines changed: 1 addition & 0 deletions
Loading

icons/full/etherfi.svg

Lines changed: 1 addition & 0 deletions
Loading

icons/full/ldo.svg

Lines changed: 1 addition & 1 deletion
Loading

icons/full/lido.svg

Lines changed: 1 addition & 0 deletions
Loading

0 commit comments

Comments
 (0)