1---
2/**
3 * A row of provider brand marks, for cards that point at the provider
4 * directory. Icons come from the same table the docs tab bar uses, so
5 * they stay in sync with the providers Alchemy ships.
6 */
7import { TAB_ICONS } from "../docs-icons";
8
9interface Props {
10 /** Tab labels from `TAB_ICONS`, in display order. */
11 names?: string[];
12}
13
14const {
15 names = [
16 "Hetzner",
17 "Fly",
18 "Railway",
19 "Kubernetes",
20 "Docker",
21 "Neon",
22 "PlanetScale",
23 "Prisma",
24 "Drizzle",
25 "GitHub",
26 ],
27} = Astro.props;
28
29const icons = names
30 .map((name) => ({ name, body: TAB_ICONS[name] }))
31 .filter((i): i is { name: string; body: string } => Boolean(i.body));
32---
33
34<span class="provider-icons" aria-label={names.join(", ")}>
35 {
36 icons.map((icon) => (
37 <svg
38 aria-hidden="true"
39 width="22"
40 height="22"
41 viewBox="0 0 24 24"
42 set:html={icon.body}
43 />
44 ))
45 }
46</span>