Files
Achraf Ghellach 60f5d8e19f feat: add WhatsApp Business Cloud API adapter (#102)
* feat: add WhatsApp Business Cloud API adapter

Add @chat-adapter/whatsapp with support for sending/receiving messages,
reactions, interactive reply buttons, typing indicators, and webhook
verification via the Meta Graph API. Includes full test suite,
documentation updates, and workspace/turbo configuration.

Co-Authored-By: Claude Opus 4.6 <noreply@anthropic.com>

* feat: add media download, attachments, and location support to WhatsApp adapter

- Add downloadMedia() public method for fetching images, documents,
  audio, video, and stickers via the Graph API (two-step: URL then binary)
- Populate message attachments with lazy fetchData() for all media types
- Add location support with Google Maps URL and structured text
- Add audio, video, sticker, and location fields to WhatsAppInboundMessage
- Set isMention: true on all messages (WhatsApp DMs are always direct)
- Update parseMessage to include attachments and isMention
- Add 10 new tests covering all media types, locations, and isMention
- Update docs feature matrix to reflect media receive support

Co-Authored-By: Claude Opus 4.6 <noreply@anthropic.com>

* fix: address PR review feedback for WhatsApp adapter

- Validate Graph API response before accessing messages[0].id in
  sendTextMessage and sendInteractiveMessage
- Escape backticks and backslashes in escapeWhatsApp()
- Apply escapeWhatsApp() to renderText() content in all style branches
- Use webhook phoneNumberId in buildMessage() instead of this.phoneNumberId
- Encode proper threadId in parseMessage() instead of empty string
- Strict decodeThreadId() validation (exactly 2 segments after prefix)
- Add tests for extra segments in decodeThreadId and threadId in parseMessage

Co-Authored-By: Claude Opus 4.6 <noreply@anthropic.com>

* Migrate improvements from #179

Bring over several enhancements from chitru's WhatsApp adapter PR (#179):

- Voice message support (separate from audio)
- Legacy button response handling (template quick replies)
- Callback data encoding/decoding for interactive reply round-trips
- Message truncation at WhatsApp's 4096 char limit
- Example app integration (adapters, webhook route, package.json)
- GET webhook forwarding for WhatsApp verification challenges
- Package README and changeset
- Tests for all new functionality (68 total)

Co-Authored-By: Chitru Shrestha <chitra.shrestha@akuru.com.au>
Co-Authored-By: Claude Opus 4.6 <noreply@anthropic.com>

* fix(whatsapp): add error handling for inbound message processing

Wrap handleInboundMessage calls in try/catch to log errors if
synchronous processing fails (e.g., thread ID encoding). The async
processing already has its own error handling in Chat.processMessage.

Co-Authored-By: Claude Opus 4.6 <noreply@anthropic.com>

* fix(whatsapp): prevent markdown regex from matching across newlines

Use [^\n*] and [^\n~] in fromWhatsAppFormat regex to prevent bold/strike
spans from merging across line boundaries. Adds a regression test.

Co-Authored-By: Claude Opus 4.6 <noreply@anthropic.com>

* fix(whatsapp): use WhatsAppInteractiveMessage type instead of object

Replace the untyped `object` parameter in sendInteractiveMessage with
the proper WhatsAppInteractiveMessage type for full type safety.

Co-Authored-By: Claude Opus 4.6 <noreply@anthropic.com>

* fix(whatsapp): hoist emoji mapping to module-level constant

Move the emoji name-to-unicode mapping out of resolveEmoji() so it is
not re-allocated on every call.

Co-Authored-By: Claude Opus 4.6 <noreply@anthropic.com>

* fix(whatsapp): remove duplicate JSDoc comment in types

Co-Authored-By: Claude Opus 4.6 <noreply@anthropic.com>

* fix(example): add startTyping to WhatsApp recording methods

The adapter supports typing indicators but the method was missing from
the recording proxy list.

Co-Authored-By: Claude Opus 4.6 <noreply@anthropic.com>

* fix(whatsapp): fix formatting and add package to readme test allowlist

Fix line-length formatting in markdown.ts regex and add
@chat-adapter/whatsapp to the valid packages list in readme tests.

Co-Authored-By: Claude Opus 4.6 <noreply@anthropic.com>

* fix(whatsapp): use defaultEmojiResolver instead of custom emoji map

Replace the hand-rolled EMOJI_MAP with the shared defaultEmojiResolver
from the chat SDK. WhatsApp uses unicode emoji like GChat, so toGChat()
provides the correct mapping with broader coverage.

Co-Authored-By: Claude Opus 4.6 <noreply@anthropic.com>

* fix(whatsapp): make Graph API version configurable

Add apiVersion option to WhatsAppAdapterConfig (defaults to v21.0)
so users can upgrade without waiting for a package release.

Co-Authored-By: Claude Opus 4.6 <noreply@anthropic.com>

* fix(whatsapp): validate lat/lng before constructing Google Maps URL

Coerce and validate latitude/longitude with Number.isFinite() to
prevent unexpected URL construction from malformed webhook payloads.

Co-Authored-By: Claude Opus 4.6 <noreply@anthropic.com>

* fix(whatsapp): throw on editMessage instead of silently sending new message

Callers expecting an edit would get duplicate messages with the silent
fallback. Throwing makes the unsupported operation explicit.

Co-Authored-By: Claude Opus 4.6 <noreply@anthropic.com>

* fix(whatsapp): document regex asymmetry between toWhatsApp and fromWhatsApp

Explain why toWhatsAppFormat doesn't need newline guards like
fromWhatsAppFormat does — the standard markdown parser output
never produces spans crossing line boundaries.

Co-Authored-By: Claude Opus 4.6 <noreply@anthropic.com>

* fix(whatsapp): document callback data passthrough behavior

Add comments explaining that non-prefixed and malformed callback data
is intentionally passed through for legacy/external button IDs.

Co-Authored-By: Claude Opus 4.6 <noreply@anthropic.com>

* fix(whatsapp): add editMessage and deleteMessage to recording methods

Include all adapter methods in the recording list for complete
debugging traces, even for unsupported operations.

Co-Authored-By: Claude Opus 4.6 <noreply@anthropic.com>

* fix(whatsapp): preserve escaped formatting chars in toWhatsAppFormat

Escaped asterisks and tildes in standard markdown (e.g. \* and \~) are
now preserved through the conversion pipeline so WhatsApp renders them
as literal characters instead of misinterpreting them as formatting.

Co-Authored-By: Claude Opus 4.6 <noreply@anthropic.com>

* fix(whatsapp): split long messages instead of truncating

Replace silent truncation at 4096 chars with message splitting that
breaks on paragraph (\n\n) then line (\n) boundaries, sending multiple
messages so no content is lost. Adds 8 tests for the splitting logic.

Co-Authored-By: Claude Opus 4.6 <noreply@anthropic.com>

* fix(whatsapp): align editMessage/deleteMessage behavior and docs

- Fix README: editMessage/deleteMessage both throw, not fallback/no-op
- Fix editMessage JSDoc to reflect it throws
- Make deleteMessage throw instead of silently warning (consistent with editMessage)
- Bump @types/node to ^25.3.2 to match monorepo
- Add sample-messages.md with webhook payload examples

Co-Authored-By: Claude Opus 4.6 <noreply@anthropic.com>

* docs(whatsapp): add adapter documentation page

Add whatsapp.mdx covering installation, usage, Meta app setup,
webhook config, interactive messages, media attachments, 24-hour
messaging window, configuration, features, and troubleshooting.
Also add WhatsApp to the adapters navigation in meta.json.

Co-Authored-By: Claude Opus 4.6 <noreply@anthropic.com>

* fix: add whatsapp adapter debug logging and try/catch

Co-Authored-By: Claude Opus 4.6 (1M context) <noreply@anthropic.com>

* fix(whatsapp): convert emoji placeholders in outgoing messages

WhatsApp adapter was sending raw {{emoji:wave}} placeholders instead of
Unicode emoji. Apply convertEmojiPlaceholders on all outgoing paths:
text messages, card fallback text, and interactive message fields.

Co-Authored-By: Claude Opus 4.6 (1M context) <noreply@anthropic.com>

* Fix button rendering and streaming (needs to buffer)

* fix(example): handle editMessage failure on WhatsApp

WhatsApp Cloud API doesn't support message editing. Catch the error
in the demo "processing" animation and send a follow-up instead.

Co-Authored-By: Claude Opus 4.6 (1M context) <noreply@anthropic.com>

* feat(chat): add onDirectMessage handler, stop treating DMs as mentions

DMs now route to dedicated onDirectMessage handlers instead of being
forced through onNewMention. If no DM handlers registered, DMs fall
through to onNewMention for backward compat. Adapters no longer set
isMention=true for DMs — the Chat SDK handles routing via adapter.isDM().

Co-Authored-By: Claude Opus 4.6 (1M context) <noreply@anthropic.com>

* feat(chat): always route DMs to onDirectMessage regardless of subscription

Previously, onDirectMessage only fired for unsubscribed DM threads.
Subscribed DMs were routed to onSubscribedMessage, which was confusing
on non-threaded platforms (WhatsApp, Telegram) where all DMs share one
threadId — after the first message, onDirectMessage never fired again.

Now, DMs always route to onDirectMessage first, and onSubscribedMessage
only handles non-DM subscribed threads. Backward compat is preserved:
if no onDirectMessage handlers are registered, DMs fall through as
mentions.

The example bot is simplified accordingly — onDirectMessage now fetches
conversation history via fetchMessages each time instead of relying on
subscribe() and stored state.

Co-Authored-By: Claude Opus 4.6 (1M context) <noreply@anthropic.com>

* feat(chat): pass channel as third argument to DirectMessageHandler

Co-Authored-By: Claude Opus 4.6 (1M context) <noreply@anthropic.com>

* fix(example): reply to channel instead of thread in DM handler

Co-Authored-By: Claude Opus 4.6 (1M context) <noreply@anthropic.com>

* fix(example): use thread instead of channel for DM operations

Channel ID is only two parts (whatsapp:{phoneNumberId}) which isn't a
valid conversation target on WhatsApp. The thread ID includes the user
phone and is required for startTyping/post/fetchMessages.

Co-Authored-By: Claude Opus 4.6 (1M context) <noreply@anthropic.com>

* Revert "fix(example): use thread instead of channel for DM operations"

This reverts commit f4801d7015.

* fix(adapters): return valid thread IDs from channelIdFromThreadId

WhatsApp's channelIdFromThreadId was stripping the user WA ID, producing
an invalid ID that caused ValidationError on channel operations like
startTyping(). Since every WhatsApp conversation is a 1:1 DM, channel
and thread are identical.

Telegram's channelIdFromThreadId was returning a raw chatId without the
telegram: prefix, which is not a valid thread ID for adapter operations.

Co-Authored-By: Claude Opus 4.6 (1M context) <noreply@anthropic.com>

* fix(chat): normalize fullStream in Channel.post() to extract text deltas

Channel.post() was coercing AI SDK fullStream objects to strings via +=,
producing "[object Object]" output. Now uses fromFullStream() to extract
text-delta events, matching how Thread.post() already handles streams.

Co-Authored-By: Claude Opus 4.6 (1M context) <noreply@anthropic.com>

* fix(example): use thread.allMessages for DM history instead of adapter directly

The DM handler was calling channel.adapter.fetchMessages() which always
returns empty on WhatsApp (no native history API). Now uses
thread.allMessages which falls back to the persisted message history
cache, giving the AI conversation context.

Co-Authored-By: Claude Opus 4.6 (1M context) <noreply@anthropic.com>

* feat(chat): add message history support to Channel for DM platforms

Channel now falls back to the persisted message history cache when the
adapter lacks native message fetch (e.g. WhatsApp, Telegram). Incoming
messages are persisted under both thread and channel IDs. Outgoing
messages from channel.post() are also persisted.

The example DM handler now uses channel.messages instead of calling the
adapter directly.

Co-Authored-By: Claude Opus 4.6 (1M context) <noreply@anthropic.com>

* fix(whatsapp): improve markdown rendering and remove broken typing indicator

- Convert headings to bold text, thematic breaks to text separators,
  and tables to code blocks (WhatsApp doesn't support these)
- Convert standard italic (*text*) to WhatsApp italic (_text_) since
  WhatsApp uses *text* for bold
- Make startTyping a no-op (Cloud API doesn't support typing indicators)
- Update channelIdFromThreadId test for channel===thread change

Co-Authored-By: Claude Opus 4.6 (1M context) <noreply@anthropic.com>

* fix(example): reverse channel.messages to chronological order for AI

channel.messages yields newest first but AI expects chronological order.

Co-Authored-By: Claude Opus 4.6 (1M context) <noreply@anthropic.com>

* fix(chat): auto-sort messages chronologically in toAiMessages

toAiMessages now sorts by dateSent (oldest first) so callers don't need
to worry about iteration order from channel.messages or thread.messages.

Co-Authored-By: Claude Opus 4.6 (1M context) <noreply@anthropic.com>

* fix(chat): pass accumulated stream text as markdown in Channel.post()

Stream text was posted as a plain string, bypassing the adapter's format
converter. Now wraps it as { markdown: accumulated } so headings, bold,
italic etc. are properly converted for each platform.

Co-Authored-By: Claude Opus 4.6 (1M context) <noreply@anthropic.com>

* fix(whatsapp): use stringifier options for emphasis and bullets

Use emphasis: '_' and bullet: '-' options in stringifyMarkdown so the
only * in output is **strong**, avoiding conflicts between list bullets
and italic markers. Simplifies toWhatsAppFormat to only convert
**bold** -> *bold* and ~~strike~~ -> ~strike~.

Co-Authored-By: Claude Opus 4.6 (1M context) <noreply@anthropic.com>

* fix(whatsapp): flatten bold inside headings to avoid triple asterisks

When AI outputs headings with bold text like `## **Choose React if:**`,
the heading-to-bold conversion created nested strong nodes producing
`***text***`. Now flattens strong children in headings so they merge
into a single bold span.

Co-Authored-By: Claude Opus 4.6 (1M context) <noreply@anthropic.com>

* test(whatsapp): add full toBe assertion for complex markdown conversion

Also use ━━━ for thematic breaks instead of --- to avoid remark escaping.

Co-Authored-By: Claude Opus 4.6 (1M context) <noreply@anthropic.com>

* test: add WhatsApp replay tests from production recordings

Adds WhatsApp DM replay test infrastructure:
- Fixture from real webhook recordings (dm/whatsapp.json)
- WhatsApp test utilities with HMAC-signed request factory and
  Graph API fetch mock (whatsapp-utils.ts)
- 6 replay tests covering DM handling, thread/channel IDs, message
  sending, status update filtering, sequential messages, and
  message history persistence

Co-Authored-By: Claude Opus 4.6 (1M context) <noreply@anthropic.com>

* fix(whatsapp): fix type narrowing in replay test after merge

Co-Authored-By: Claude Opus 4.6 <noreply@anthropic.com>

* Update WhatsApp logo

* Update adapters.json

* Update logos.tsx

---------

Co-authored-by: Claude Opus 4.6 <noreply@anthropic.com>
Co-authored-by: Hayden Bleasel <hello@haydenbleasel.com>
Co-authored-by: Chitru Shrestha <chitra.shrestha@akuru.com.au>
Co-authored-by: Malte Ubl <malte.ubl@gmail.com>
2026-03-10 15:16:10 -07:00

498 lines
30 KiB
TypeScript

import type { ComponentProps } from "react";
export const github = (props: ComponentProps<"svg">) => (
<svg
fill="none"
viewBox="0 0 1024 1024"
xmlns="http://www.w3.org/2000/svg"
{...props}
>
<path
clipRule="evenodd"
d="M512 0C229.12 0 0 229.12 0 512C0 738.56 146.56 929.92 350.08 997.76C375.68 1002.24 385.28 986.88 385.28 973.44C385.28 961.28 384.64 920.96 384.64 878.08C256 901.76 222.72 846.72 212.48 817.92C206.72 803.2 181.76 757.76 160 745.6C142.08 736 116.48 712.32 159.36 711.68C199.68 711.04 228.48 748.8 238.08 764.16C284.16 841.6 357.76 819.84 387.2 806.4C391.68 773.12 405.12 750.72 419.84 737.92C305.92 725.12 186.88 680.96 186.88 485.12C186.88 429.44 206.72 383.36 239.36 347.52C234.24 334.72 216.32 282.24 244.48 211.84C244.48 211.84 287.36 198.4 385.28 264.32C426.24 252.8 469.76 247.04 513.28 247.04C556.8 247.04 600.32 252.8 641.28 264.32C739.2 197.76 782.08 211.84 782.08 211.84C810.24 282.24 792.32 334.72 787.2 347.52C819.84 383.36 839.68 428.8 839.68 485.12C839.68 681.6 720 725.12 606.08 737.92C624.64 753.92 640.64 784.64 640.64 832.64C640.64 901.12 640 956.16 640 973.44C640 986.88 649.6 1002.88 675.2 997.76C877.44 929.92 1024 737.92 1024 512C1024 229.12 794.88 0 512 0Z"
fill="currentColor"
fillRule="evenodd"
/>
</svg>
);
export const slack = (props: ComponentProps<"svg">) => (
<svg
fill="none"
viewBox="0 0 126 126"
xmlns="http://www.w3.org/2000/svg"
{...props}
>
<path
d="M26.5 79.4C26.5 86.7 20.6 92.6 13.3 92.6C6.00001 92.6 0.100006 86.7 0.100006 79.4C0.100006 72.1 6.00001 66.2 13.3 66.2H26.5V79.4ZM33.1 79.4C33.1 72.1 39 66.2 46.3 66.2C53.6 66.2 59.5 72.1 59.5 79.4V112.4C59.5 119.7 53.6 125.6 46.3 125.6C39 125.6 33.1 119.7 33.1 112.4V79.4Z"
fill="#E01E5A"
/>
<path
d="M46.3 26.4C39 26.4 33.1 20.5 33.1 13.2C33.1 5.9 39 0 46.3 0C53.6 0 59.5 5.9 59.5 13.2V26.4H46.3ZM46.3 33.1C53.6 33.1 59.5 39 59.5 46.3C59.5 53.6 53.6 59.5 46.3 59.5H13.2C5.9 59.5 0 53.6 0 46.3C0 39 5.9 33.1 13.2 33.1H46.3Z"
fill="#36C5F0"
/>
<path
d="M99.2 46.3C99.2 39 105.1 33.1 112.4 33.1C119.7 33.1 125.6 39 125.6 46.3C125.6 53.6 119.7 59.5 112.4 59.5H99.2V46.3ZM92.6 46.3C92.6 53.6 86.7 59.5 79.4 59.5C72.1 59.5 66.2 53.6 66.2 46.3V13.2C66.2 5.9 72.1 0 79.4 0C86.7 0 92.6 5.9 92.6 13.2V46.3Z"
fill="#2EB67D"
/>
<path
d="M79.4 99.2C86.7 99.2 92.6 105.1 92.6 112.4C92.6 119.7 86.7 125.6 79.4 125.6C72.1 125.6 66.2 119.7 66.2 112.4V99.2H79.4ZM79.4 92.6C72.1 92.6 66.2 86.7 66.2 79.4C66.2 72.1 72.1 66.2 79.4 66.2H112.5C119.8 66.2 125.7 72.1 125.7 79.4C125.7 86.7 119.8 92.6 112.5 92.6H79.4Z"
fill="#ECB22E"
/>
</svg>
);
export const teams = (props: ComponentProps<"svg">) => (
<svg
fill="none"
viewBox="0 0 2229 2074"
xmlns="http://www.w3.org/2000/svg"
{...props}
>
<path
d="M1554.64 777.5H2130.35C2184.74 777.5 2228.83 821.592 2228.83 875.983V1400.38C2228.83 1600.28 2066.78 1762.33 1866.88 1762.33H1865.17C1665.27 1762.36 1503.2 1600.33 1503.17 1400.43C1503.17 1400.42 1503.17 1400.4 1503.17 1400.38V828.971C1503.17 800.544 1526.21 777.5 1554.64 777.5Z"
fill="#5059C9"
/>
<path
d="M1943.75 673.833C2072.57 673.833 2177 569.403 2177 440.583C2177 311.763 2072.57 207.333 1943.75 207.333C1814.93 207.333 1710.5 311.763 1710.5 440.583C1710.5 569.403 1814.93 673.833 1943.75 673.833Z"
fill="#5059C9"
/>
<path
d="M1218.08 673.834C1404.16 673.834 1555 522.991 1555 336.917C1555 150.843 1404.16 0 1218.08 0C1032.01 0 881.166 150.843 881.166 336.917C881.166 522.991 1032.01 673.834 1218.08 673.834Z"
fill="#7B83EB"
/>
<path
d="M1667.32 777.5H717.01C663.267 778.83 620.753 823.431 622 877.176V1475.28C614.495 1797.8 869.657 2065.44 1192.17 2073.33C1514.68 2065.44 1769.84 1797.8 1762.33 1475.28V877.176C1763.58 823.431 1721.07 778.83 1667.32 777.5Z"
fill="#7B83EB"
/>
<path
d="M1244 777.5V1615.65C1243.74 1654.08 1220.45 1688.61 1184.91 1703.24C1173.59 1708.03 1161.43 1710.5 1149.14 1710.5H667.613C660.875 1693.4 654.655 1676.29 649.471 1658.67C631.327 1599.19 622.069 1537.36 621.999 1475.18V877.02C620.753 823.361 663.197 778.83 716.854 777.5H1244Z"
fill="black"
opacity="0.1"
/>
<path
d="M1192.17 777.5V1667.48C1192.16 1679.77 1189.7 1691.93 1184.91 1703.24C1170.28 1738.78 1135.75 1762.08 1097.31 1762.33H691.975C683.163 1745.23 674.87 1728.12 667.613 1710.5C660.356 1692.88 654.655 1676.29 649.471 1658.67C631.327 1599.19 622.069 1537.36 621.999 1475.18V877.02C620.753 823.361 663.197 778.83 716.854 777.5H1192.17Z"
fill="black"
opacity="0.2"
/>
<path
d="M1192.17 777.5V1563.81C1191.77 1616.04 1149.53 1658.27 1097.31 1658.67H649.472C631.328 1599.19 622.07 1537.36 622 1475.18V877.02C620.754 823.361 663.198 778.83 716.855 777.5H1192.17Z"
fill="black"
opacity="0.2"
/>
<path
d="M1140.33 777.5V1563.81C1139.94 1616.04 1097.7 1658.27 1045.48 1658.67H649.472C631.328 1599.19 622.07 1537.36 622 1475.18V877.02C620.754 823.361 663.198 778.83 716.855 777.5H1140.33Z"
fill="black"
opacity="0.2"
/>
<path
d="M1244 509.522V672.797C1235.19 673.315 1226.9 673.834 1218.08 673.834C1209.27 673.834 1200.98 673.316 1192.17 672.797C1174.67 671.636 1157.32 668.86 1140.33 664.504C1035.37 639.647 948.654 566.035 907.083 466.501C899.93 449.786 894.377 432.43 890.496 414.668H1149.14C1201.45 414.866 1243.8 457.217 1244 509.522Z"
fill="black"
opacity="0.1"
/>
<path
d="M1192.17 561.355V672.797C1174.67 671.636 1157.32 668.86 1140.33 664.504C1035.37 639.647 948.655 566.035 907.084 466.501H1097.31C1149.62 466.699 1191.97 509.051 1192.17 561.355Z"
fill="black"
opacity="0.2"
/>
<path
d="M1192.17 561.355V672.797C1174.67 671.636 1157.32 668.86 1140.33 664.504C1035.37 639.647 948.655 566.035 907.084 466.501H1097.31C1149.62 466.699 1191.97 509.051 1192.17 561.355Z"
fill="black"
opacity="0.2"
/>
<path
d="M1140.33 561.355V664.503C1035.37 639.646 948.654 566.034 907.083 466.5H1045.48C1097.78 466.699 1140.13 509.051 1140.33 561.355Z"
fill="black"
opacity="0.2"
/>
<path
d="M95.01 466.5H1045.32C1097.8 466.5 1140.33 509.038 1140.33 561.51V1511.82C1140.33 1564.3 1097.79 1606.83 1045.32 1606.83H95.01C42.537 1606.83 0 1564.29 0 1511.82V561.51C0 509.038 42.538 466.5 95.01 466.5Z"
fill="url(#paint0_linear_1_50)"
/>
<path
d="M820.211 828.193H630.241V1345.49H509.211V828.193H320.123V727.844H820.211V828.193Z"
fill="white"
/>
<defs>
<linearGradient
gradientUnits="userSpaceOnUse"
id="paint0_linear_1_50"
x1="198.099"
x2="942.234"
y1="392.261"
y2="1681.07"
>
<stop stopColor="#5A62C3" />
<stop offset="0.5" stopColor="#4D55BD" />
<stop offset="1" stopColor="#3940AB" />
</linearGradient>
</defs>
</svg>
);
export const linear = (props: ComponentProps<"svg">) => (
<svg
fill="none"
viewBox="0 0 200 200"
xmlns="http://www.w3.org/2000/svg"
{...props}
>
<path
d="M2.45082 123.046C2.00582 121.149 4.26578 119.954 5.64358 121.332L78.6684 194.356C80.0462 195.734 78.8514 197.994 76.9544 197.549C40.103 188.904 11.0956 159.897 2.45082 123.046ZM0.00378269 93.7782C-0.0315048 94.3448 0.181527 94.898 0.582926 95.2994L104.701 199.417C105.102 199.818 105.655 200.032 106.222 199.996C110.96 199.701 115.609 199.076 120.147 198.144C121.676 197.83 122.207 195.952 121.103 194.848L5.1519 78.897C4.04818 77.7932 2.16956 78.3244 1.85555 79.8534C0.923722 84.3906 0.298912 89.0398 0.00378269 93.7782ZM8.42186 59.4108C8.08888 60.1584 8.25848 61.032 8.83716 61.6108L138.389 191.163C138.968 191.742 139.842 191.911 140.589 191.578C144.161 189.987 147.623 188.193 150.96 186.21C152.064 185.554 152.235 184.037 151.327 183.129L16.8713 48.6734C15.9631 47.7652 14.4459 47.9356 13.7898 49.0398C11.8072 52.3766 10.013 55.8386 8.42186 59.4108ZM25.3174 36.148C24.5772 35.4078 24.5314 34.2206 25.2288 33.4398C43.559 12.9186 70.2228 0 99.9038 0C155.185 0 200 44.8146 200 100.096C200 129.777 187.081 156.441 166.56 174.771C165.78 175.469 164.592 175.423 163.852 174.683L25.3174 36.148Z"
fill="currentColor"
/>
</svg>
);
export const gchat = (props: ComponentProps<"svg">) => (
<svg
fill="none"
viewBox="0 0 311 320"
xmlns="http://www.w3.org/2000/svg"
{...props}
>
<path
d="M76.3704 0.356201L76.3804 76.8262"
stroke="#7E916F"
strokeWidth="2"
/>
<path
d="M76.3802 76.8262L0.000244141 76.8062"
stroke="#1375EB"
strokeWidth="2"
/>
<path
d="M235.08 0.936279C234.974 0.976279 234.884 1.01961 234.81 1.06628C234.697 1.12628 234.64 1.21961 234.64 1.34628L234.62 76.8563"
stroke="#F3801D"
strokeWidth="2"
/>
<path
d="M234.62 76.8562C234.607 76.8562 234.59 76.8562 234.57 76.8562"
stroke="#7EB426"
strokeWidth="2"
/>
<path
d="M76.4101 76.8562C76.4035 76.8495 76.3935 76.8395 76.3801 76.8262"
stroke="#91A080"
strokeWidth="2"
/>
<path d="M310.53 76.6162L234.62 76.8562" stroke="#75783E" strokeWidth="2" />
<path
d="M76.4302 182.536L0.000244141 182.516"
stroke="#138495"
strokeWidth="2"
/>
<path
d="M76.4402 258.976L76.4302 220.696"
stroke="#00983A"
strokeWidth="2"
/>
<path
d="M76.3702 0.356201L76.3802 76.8262L0.000244141 76.8062V20.6162C0.566911 16.6429 1.74358 13.3062 3.53024 10.6062C7.93691 3.9262 14.3436 0.562868 22.7502 0.516201C40.5236 0.422868 58.3969 0.369535 76.3702 0.356201Z"
fill="#0066DA"
/>
<path
d="M76.3704 0.356201L233.79 0.376201C234.122 0.376071 234.443 0.477401 234.71 0.666201L235.08 0.936201C234.974 0.976201 234.884 1.01953 234.81 1.0662C234.697 1.1262 234.64 1.21953 234.64 1.3462L234.62 76.8562C234.607 76.8562 234.59 76.8562 234.57 76.8562H76.4104C76.4037 76.8495 76.3937 76.8395 76.3804 76.8262L76.3704 0.356201Z"
fill="#FBBC04"
/>
<path
d="M235.08 0.936279L310.53 76.6163L234.62 76.8563L234.64 1.34628C234.64 1.21961 234.697 1.12628 234.81 1.06628C234.884 1.01961 234.974 0.976279 235.08 0.936279Z"
fill="#EA4335"
/>
<path
d="M0.000244141 76.8062L76.3802 76.8262C76.3936 76.8395 76.4036 76.8495 76.4102 76.8562L76.4302 182.536L0.000244141 182.516V76.8062Z"
fill="#2684FC"
/>
<path
d="M310.53 76.6162L311 76.9562V238.856C309.227 248.543 304.207 254.8 295.94 257.626C292.994 258.64 288.65 259.14 282.91 259.126C245.65 259.066 208.01 259.01 169.99 258.956C164.47 258.95 158.87 258.99 153.19 259.076C152.877 259.083 152.61 259.196 152.39 259.416C133.79 277.93 115.124 296.603 96.3902 315.436C93.5202 318.326 90.2702 319.936 86.1502 319.326C82.3102 318.76 79.4802 316.78 77.6602 313.386C76.8935 311.946 76.5035 309.32 76.4902 305.506C76.4435 290.046 76.4268 274.536 76.4402 258.976L76.4302 220.696L114.21 182.916C114.375 182.751 114.571 182.621 114.787 182.531C115.003 182.442 115.235 182.396 115.47 182.396L233.77 182.436C233.99 182.436 234.201 182.349 234.357 182.193C234.513 182.037 234.6 181.826 234.6 181.606L234.57 76.8562C234.59 76.8562 234.607 76.8562 234.62 76.8562L310.53 76.6162Z"
fill="#00AC47"
/>
<path
d="M76.4302 182.536V220.696L76.4402 258.976C60.4602 259.069 44.6169 259.099 28.9102 259.066C22.3636 259.053 17.6469 258.539 14.7602 257.526C6.66691 254.699 1.74691 248.433 0.000244141 238.726V182.516L76.4302 182.536Z"
fill="#00832D"
/>
</svg>
);
export const discord = (props: ComponentProps<"svg">) => (
<svg
fill="none"
viewBox="0 0 800 620"
xmlns="http://www.w3.org/2000/svg"
{...props}
>
<path
d="M677.676 51.8644C625.891 27.6353 570.519 10.0266 512.63 0C505.52 12.8537 497.214 30.1422 491.488 43.8951C429.95 34.6406 368.978 34.6406 308.572 43.8951C302.846 30.1422 294.352 12.8537 287.179 0C229.227 10.0266 173.792 27.7 122.006 51.9927C17.5548 209.833 -10.7604 363.753 3.39722 515.487C72.6751 567.222 139.814 598.649 205.819 619.214C222.116 596.785 236.651 572.942 249.173 547.813C225.325 538.752 202.484 527.569 180.902 514.587C186.628 510.346 192.229 505.911 197.639 501.348C329.273 562.916 472.297 562.916 602.358 501.348C607.832 505.911 613.432 510.346 619.095 514.587C597.449 527.633 574.546 538.815 550.699 547.878C563.22 572.942 577.692 596.849 594.052 619.278C660.121 598.713 727.322 567.286 796.6 515.487C813.212 339.588 768.222 187.082 677.676 51.8644ZM267.106 422.172C227.591 422.172 195.185 385.282 195.185 340.359C195.185 295.436 226.899 258.483 267.106 258.483C307.314 258.483 339.719 295.372 339.027 340.359C339.089 385.282 307.314 422.172 267.106 422.172ZM532.891 422.172C493.376 422.172 460.971 385.282 460.971 340.359C460.971 295.436 492.683 258.483 532.891 258.483C573.098 258.483 605.504 295.372 604.812 340.359C604.812 385.282 573.098 422.172 532.891 422.172Z"
fill="#5865F2"
/>
</svg>
);
export const telegram = (props: ComponentProps<"svg">) => (
<svg
fill="none"
viewBox="0 0 240 240"
xmlns="http://www.w3.org/2000/svg"
{...props}
>
<path
d="M120 240C186.274 240 240 186.274 240 120C240 53.7258 186.274 0 120 0C53.7258 0 0 53.7258 0 120C0 186.274 53.7258 240 120 240Z"
fill="url(#paint0_linear_1_52)"
/>
<path
d="M81.229 128.772L95.466 168.178C95.466 168.178 97.246 171.865 99.152 171.865C101.058 171.865 129.407 142.373 129.407 142.373L160.932 81.4829L81.737 118.6L81.229 128.772Z"
fill="#C8DAEA"
/>
<path
d="M100.106 138.878L97.3731 167.924C97.3731 167.924 96.2291 176.824 105.127 167.924C114.025 159.024 122.542 152.161 122.542 152.161"
fill="#A9C6D8"
/>
<path
d="M81.486 130.178L52.2 120.636C52.2 120.636 48.7 119.216 49.827 115.996C50.059 115.332 50.527 114.767 51.927 113.796C58.416 109.273 172.033 68.4359 172.033 68.4359C172.033 68.4359 175.241 67.3549 177.133 68.0739C177.601 68.2188 178.022 68.4854 178.353 68.8465C178.685 69.2076 178.914 69.6501 179.018 70.1289C179.222 70.9746 179.308 71.8446 179.272 72.7139C179.263 73.4659 179.172 74.1629 179.103 75.2559C178.411 86.4209 157.703 169.749 157.703 169.749C157.703 169.749 156.464 174.625 152.025 174.792C150.934 174.827 149.847 174.642 148.829 174.249C147.811 173.855 146.883 173.26 146.1 172.5C137.389 165.007 107.281 144.773 100.628 140.323C100.478 140.221 100.352 140.087 100.257 139.932C100.163 139.777 100.103 139.603 100.082 139.423C99.989 138.954 100.499 138.373 100.499 138.373C100.499 138.373 152.925 91.7729 154.32 86.8809C154.428 86.5019 154.02 86.3149 153.472 86.4809C149.99 87.7619 89.628 125.881 82.966 130.088C82.4864 130.233 81.9796 130.264 81.486 130.178Z"
fill="white"
/>
<defs>
<linearGradient
gradientUnits="userSpaceOnUse"
id="paint0_linear_1_52"
x1="120"
x2="120"
y1="240"
y2="0"
>
<stop stopColor="#1D93D2" />
<stop offset="1" stopColor="#38B0E3" />
</linearGradient>
</defs>
</svg>
);
export const memory = (props: ComponentProps<"svg">) => (
<svg
fill="none"
viewBox="0 0 14 16"
xmlns="http://www.w3.org/2000/svg"
{...props}
>
<path
clipRule="evenodd"
d="M12.5 1.5H1.5V4.5C1.5 5.05228 1.94772 5.5 2.5 5.5H11.5C12.0523 5.5 12.5 5.05228 12.5 4.5V1.5ZM14 0H12.5H1.5H0V1.5V4.5C0 5.88071 1.11929 7 2.5 7H11.5C12.8807 7 14 5.88071 14 4.5V1.5V0ZM1.5 13.5V10.5H12.5V13.5C12.5 14.0523 12.0523 14.5 11.5 14.5H2.5C1.94772 14.5 1.5 14.0523 1.5 13.5ZM0 9H1.5H12.5H14V10.5V13.5C14 14.8807 12.8807 16 11.5 16H2.5C1.11929 16 0 14.8807 0 13.5V10.5V9ZM3.75 13.25C4.16421 13.25 4.5 12.9142 4.5 12.5C4.5 12.0858 4.16421 11.75 3.75 11.75C3.33579 11.75 3 12.0858 3 12.5C3 12.9142 3.33579 13.25 3.75 13.25ZM7 12.5C7 12.9142 6.66421 13.25 6.25 13.25C5.83579 13.25 5.5 12.9142 5.5 12.5C5.5 12.0858 5.83579 11.75 6.25 11.75C6.66421 11.75 7 12.0858 7 12.5ZM9.5 3.5C9.5 3.91421 9.8358 4.25 10.25 4.25C10.6642 4.25 11 3.91421 11 3.5C11 3.08579 10.6642 2.75 10.25 2.75C9.8358 2.75 9.5 3.08579 9.5 3.5ZM7.75 4.25C7.33579 4.25 7 3.91421 7 3.5C7 3.08579 7.33579 2.75 7.75 2.75C8.16421 2.75 8.5 3.08579 8.5 3.5C8.5 3.91421 8.16421 4.25 7.75 4.25Z"
fill="currentColor"
fillRule="evenodd"
/>
</svg>
);
export const redis = (props: ComponentProps<"svg">) => (
<svg
fill="none"
viewBox="0 0 800 800"
xmlns="http://www.w3.org/2000/svg"
{...props}
>
<path
d="M768.656 584.197C725.963 606.45 504.8 697.384 457.716 721.931C410.631 746.481 384.475 746.244 347.278 728.463C310.084 710.681 74.7281 615.613 32.3312 595.347C11.1437 585.222 0 576.672 0 568.597V487.734C0 487.734 306.406 421.031 355.872 403.284C405.334 385.538 422.497 384.897 464.591 400.316C506.691 415.741 758.397 461.153 800 476.391L799.981 556.109C799.988 564.103 790.388 572.872 768.656 584.197Z"
fill="#912626"
/>
<path
d="M768.641 503.813C725.95 526.056 504.794 616.994 457.709 641.538C410.628 666.091 384.472 665.85 347.278 648.069C310.081 630.3 74.7343 535.216 32.3406 514.962C-10.0532 494.697 -10.9407 480.75 30.7031 464.444C72.3468 448.131 306.403 356.303 355.875 338.556C405.337 320.816 422.497 320.169 464.591 335.594C506.687 351.013 726.525 438.516 768.122 453.75C809.734 469.003 811.331 481.563 768.641 503.813Z"
fill="#C6302B"
/>
<path
d="M768.656 453.356C725.963 475.612 504.8 566.544 457.716 591.1C410.631 615.641 384.475 615.403 347.278 597.622C310.081 579.85 74.7281 484.772 32.3312 464.506C11.1437 454.381 0 445.844 0 437.766V356.894C0 356.894 306.406 290.194 355.872 272.447C405.334 254.7 422.497 254.056 464.591 269.478C506.694 284.9 758.4 330.303 800 345.544L799.981 425.272C799.988 433.262 790.388 442.031 768.656 453.356Z"
fill="#912626"
/>
<path
d="M768.641 372.972C725.95 395.222 504.794 486.153 457.709 510.706C410.628 535.25 384.472 535.009 347.278 517.228C310.081 499.459 74.7343 404.378 32.3406 384.122C-10.0532 363.862 -10.9407 349.912 30.7031 333.6C72.3468 317.297 306.406 225.462 355.875 207.719C405.337 189.975 422.497 189.331 464.591 204.753C506.687 220.172 726.525 307.669 768.122 322.909C809.734 338.159 811.331 350.722 768.641 372.972Z"
fill="#C6302B"
/>
<path
d="M768.656 317.666C725.963 339.916 504.8 430.853 457.716 455.409C410.631 479.953 384.475 479.712 347.278 461.931C310.081 444.159 74.7281 349.078 32.3312 328.822C11.1437 318.688 0 310.147 0 302.078V221.203C0 221.203 306.406 154.506 355.872 136.763C405.334 119.013 422.497 118.375 464.591 133.794C506.694 149.216 758.4 194.619 800 209.859L799.981 289.584C799.988 297.569 790.388 306.338 768.656 317.666Z"
fill="#912626"
/>
<path
d="M768.641 237.281C725.95 259.531 504.794 350.469 457.709 375.012C410.628 399.556 384.472 399.316 347.278 381.544C310.084 363.762 74.7344 268.687 32.3437 248.428C-10.0531 228.172 -10.9375 214.219 30.7031 197.909C72.3469 181.603 306.406 89.7813 355.875 72.0313C405.337 54.2844 422.497 53.6469 464.591 69.0688C506.688 84.4906 726.525 171.987 768.122 187.228C809.734 202.466 811.331 215.031 768.641 237.281Z"
fill="#C6302B"
/>
<path
d="M497.759 158.616L428.978 165.756L413.581 202.806L388.712 161.463L309.291 154.325L368.553 132.953L350.772 100.147L406.256 121.847L458.562 104.722L444.425 138.644L497.759 158.616ZM409.475 338.359L281.109 285.119L465.047 256.884L409.475 338.359ZM231.506 179.209C285.803 179.209 329.819 196.272 329.819 217.316C329.819 238.366 285.803 255.425 231.506 255.425C177.209 255.425 133.194 238.363 133.194 217.316C133.194 196.272 177.209 179.209 231.506 179.209Z"
fill="white"
/>
<path
d="M579.047 168.744L687.909 211.763L579.141 254.741L579.047 168.744Z"
fill="#621B1C"
/>
<path
d="M458.609 216.384L579.047 168.744L579.141 254.741L567.331 259.359L458.609 216.384Z"
fill="#9A2928"
/>
</svg>
);
export const ioredis = (props: ComponentProps<"svg">) => (
<svg
fill="none"
viewBox="0 0 91 87"
xmlns="http://www.w3.org/2000/svg"
{...props}
>
<g clipPath="url(#clip0_4_2)">
<path
d="M48.79 57.91L87.99 64.21C89.59 64.51 90.89 65.11 90.89 65.61V78.21C90.89 78.71 89.59 79.31 87.99 79.61L48.79 85.91C47.19 86.21 44.59 86.21 42.99 85.91L3.79 79.61C2.19 79.31 0.89 78.71 0.89 78.21V65.61C0.89 65.11 2.19 64.51 3.79 64.21L42.99 57.91C44.59 57.61 47.19 57.61 48.79 57.91Z"
fill="#A21B14"
/>
<path
d="M48.79 51.71L87.99 58.01C89.59 58.31 90.89 58.91 90.89 59.41V72.01C90.89 72.51 89.59 73.11 87.99 73.41L48.79 79.71C47.19 80.01 44.59 80.01 42.99 79.71L3.79 73.41C2.19 73.11 0.89 72.51 0.89 72.01V59.41C0.89 58.91 2.19 58.31 3.79 58.01L42.99 51.71C44.59 51.51 47.19 51.51 48.79 51.71Z"
fill="#C0392B"
/>
<path
d="M48.46 31.87L87.66 38.17C89.26 38.47 90.56 39.07 90.56 39.57V52.17C90.56 52.67 89.26 53.27 87.66 53.57L48.46 59.87C46.86 60.17 44.26 60.17 42.66 59.87L3.46 53.57C1.86 53.27 0.56 52.67 0.56 52.17V39.57C0.56 39.07 1.86 38.47 3.46 38.17L42.66 31.87C44.26 31.57 46.86 31.57 48.46 31.87Z"
fill="#A21B14"
/>
<path
d="M48.46 25.67L87.66 31.97C89.26 32.27 90.56 32.87 90.56 33.37V45.97C90.56 46.47 89.26 47.07 87.66 47.37L48.46 53.67C46.86 53.97 44.26 53.97 42.66 53.67L3.46 47.37C1.86 47.07 0.56 46.47 0.56 45.97V33.37C0.56 32.87 1.86 32.27 3.46 31.97L42.66 25.67C44.26 25.47 46.86 25.47 48.46 25.67Z"
fill="#C0392B"
/>
<path
d="M48.46 7.08L87.66 13.38C89.26 13.68 90.56 14.28 90.56 14.78V27.38C90.56 27.88 89.26 28.48 87.66 28.78L48.46 35.08C46.86 35.38 44.26 35.38 42.66 35.08L3.46 28.78C1.86 28.48 0.56 27.88 0.56 27.38V14.78C0.56 14.28 1.86 13.68 3.46 13.38L42.66 7.08C44.26 6.78 46.86 6.78 48.46 7.08Z"
fill="#A21B14"
/>
<path
d="M48.46 0.88L87.66 7.18C89.26 7.48 90.56 8.08 90.56 8.58V21.18C90.56 21.68 89.26 22.28 87.66 22.58L48.46 28.88C46.86 29.18 44.26 29.18 42.66 28.88L3.46 22.58C1.86 22.28 0.56 21.68 0.56 21.18V8.58C0.56 8.08 1.86 7.48 3.46 7.18L42.66 0.88C44.26 0.68 46.86 0.68 48.46 0.88Z"
fill="#C0392B"
/>
</g>
<defs>
<clipPath id="clip0_4_2">
<rect fill="white" height="87" width="91" />
</clipPath>
</defs>
</svg>
);
export const postgres = (props: ComponentProps<"svg">) => (
<svg
fill="none"
viewBox="0 0 577 594"
xmlns="http://www.w3.org/2000/svg"
{...props}
>
<g clipPath="url(#clip0_10_2)">
<path
d="M430.94 432.303C434.717 400.835 433.585 396.22 457.024 401.317L462.975 401.84C480.997 402.66 504.573 398.941 518.424 392.507C548.24 378.672 565.92 355.573 536.52 361.643C469.457 375.477 464.847 352.769 464.847 352.769C535.661 247.699 565.264 114.321 539.712 81.6734C470.019 -7.3786 349.381 34.7321 347.363 35.8254L346.72 35.9441C333.469 33.1947 318.64 31.5521 301.981 31.2827C271.633 30.7841 248.605 39.2387 231.137 52.4881C231.137 52.4881 15.9267 -36.1759 25.9387 163.992C28.068 206.573 86.9747 486.199 157.232 401.739C182.911 370.855 207.727 344.741 207.727 344.741C220.049 352.928 234.803 357.104 250.276 355.604L251.472 354.584C251.097 358.419 251.263 362.169 251.951 366.609C233.855 386.832 239.172 390.383 202.987 397.831C166.377 405.376 187.885 418.809 201.924 422.32C218.948 426.577 258.331 432.608 284.948 395.355L283.888 399.605C290.988 405.285 290.508 440.431 291.515 465.541C292.523 490.653 294.204 514.087 299.323 527.903C304.441 541.716 310.481 577.303 358.037 567.111C397.783 558.593 428.171 546.336 430.94 432.303Z"
fill="black"
stroke="black"
strokeWidth="49.8604"
/>
<path
d="M536.527 361.64C469.457 375.475 464.847 352.767 464.847 352.767C535.661 247.689 565.264 114.309 539.717 81.6654C470.024 -7.38131 349.381 34.732 347.368 35.8254L346.72 35.9414C333.469 33.1907 318.64 31.552 301.973 31.28C271.625 30.7827 248.605 39.236 231.137 52.4827C231.137 52.4827 15.9227 -36.1773 25.932 163.989C28.0613 206.573 86.9667 486.199 157.227 401.739C182.907 370.855 207.719 344.741 207.719 344.741C220.043 352.928 234.796 357.104 250.263 355.604L251.464 354.584C251.091 358.419 251.261 362.169 251.945 366.609C233.845 386.832 239.164 390.383 202.981 397.831C166.369 405.376 187.877 418.809 201.92 422.32C218.944 426.577 258.329 432.608 284.941 395.355L283.88 399.605C290.972 405.285 295.952 436.553 295.117 464.897C294.283 493.243 293.725 512.703 299.313 527.903C304.901 543.103 310.471 577.303 358.036 567.111C397.781 558.593 418.377 536.521 421.243 499.704C423.276 473.529 427.877 477.399 428.168 453.997L431.859 442.919C436.115 407.437 432.535 395.991 457.021 401.315L462.972 401.837C480.995 402.657 504.583 398.939 518.427 392.504C548.237 378.669 565.917 355.571 536.524 361.64H536.527Z"
fill="#336791"
/>
<path
d="M287.821 381.979C285.975 448 288.285 514.481 294.745 530.639C301.209 546.796 315.043 578.223 362.612 568.032C402.353 559.512 416.813 543.024 423.088 506.631C427.709 479.855 436.619 405.492 437.761 390.256"
stroke="white"
strokeLinecap="round"
strokeLinejoin="round"
strokeWidth="16.6201"
/>
<path
d="M230.805 51.0081C230.805 51.0081 15.444 -37.0133 25.456 163.153C27.5853 205.737 86.4947 485.372 156.753 400.908C182.428 370.02 205.648 345.795 205.648 345.795"
stroke="white"
strokeLinecap="round"
strokeLinejoin="round"
strokeWidth="16.6201"
/>
<path
d="M347.132 34.9427C339.677 37.28 466.929 -11.576 539.248 80.832C564.793 113.477 535.191 246.857 464.377 351.937"
stroke="white"
strokeLinecap="round"
strokeLinejoin="round"
strokeWidth="16.6201"
/>
<path
d="M464.376 351.937C464.376 351.937 468.991 374.652 536.061 360.808C565.448 354.739 547.763 377.84 517.959 391.681C493.499 403.033 438.66 405.943 437.764 390.256C435.459 349.783 466.625 362.079 464.376 351.937ZM464.376 351.937C462.343 342.804 448.405 333.84 439.185 311.487C431.136 291.976 328.791 142.355 467.568 164.576C472.652 163.524 431.373 32.5734 301.497 30.4441C171.651 28.3147 175.911 190.127 175.911 190.127"
stroke="white"
strokeLinecap="round"
strokeLinejoin="bevel"
strokeWidth="16.6201"
/>
<path
d="M251.472 365.779C233.369 386 238.693 389.551 202.508 397.001C165.896 404.548 187.407 417.979 201.445 421.488C218.469 425.748 257.855 431.779 284.467 394.516C292.571 383.171 284.419 365.068 273.287 360.453C267.908 358.225 260.716 355.433 251.472 365.779Z"
stroke="white"
strokeLinecap="round"
strokeLinejoin="round"
strokeWidth="16.6201"
/>
<path
d="M250.287 365.425C248.463 353.536 254.193 339.388 260.335 322.836C269.564 298.001 290.859 273.163 273.824 194.384C261.127 135.679 175.963 182.167 175.909 190.127C175.857 198.084 179.761 230.473 174.487 268.191C167.604 317.408 205.804 359.033 249.792 354.775"
stroke="white"
strokeLinecap="round"
strokeLinejoin="round"
strokeWidth="16.6201"
/>
<path
d="M230.023 188.933C229.639 191.652 235 198.907 241.991 199.876C248.969 200.849 254.943 195.18 255.321 192.464C255.7 189.745 250.345 186.751 243.352 185.777C236.369 184.803 230.393 186.221 230.024 188.933H230.023Z"
fill="white"
stroke="white"
strokeWidth="5.54"
/>
<path
d="M442.588 183.391C442.967 186.109 437.612 193.364 430.62 194.333C423.636 195.307 417.663 189.637 417.28 186.921C416.911 184.203 422.267 181.208 429.252 180.235C436.237 179.261 442.209 180.679 442.588 183.392V183.391Z"
fill="white"
stroke="white"
strokeWidth="2.77"
/>
<path
d="M467.568 164.576C468.719 185.901 462.975 200.427 462.251 223.128C461.179 256.125 477.983 293.893 452.663 331.708"
stroke="white"
strokeLinecap="round"
strokeLinejoin="round"
strokeWidth="16.6201"
/>
</g>
<defs>
<clipPath id="clip0_10_2">
<rect fill="white" height="593.844" width="576.095" />
</clipPath>
</defs>
</svg>
);
export const whatsapp = (props: ComponentProps<"svg">) => (
<svg
fill="none"
viewBox="0 0 148 149"
xmlns="http://www.w3.org/2000/svg"
{...props}
>
<title>WhatsApp</title>
<path
d="M0 148.436L10.439 110.322C3.98991 99.141 0.60242 86.4575 0.618 73.55C0.635 32.994 33.639 0 74.196 0C93.877 0.01 112.35 7.669 126.243 21.572C140.136 35.475 147.78 53.955 147.773 73.609C147.755 114.162 114.746 147.162 74.195 147.162H74.163C61.85 147.157 49.751 144.068 39.004 138.208L0 148.436Z"
fill="white"
/>
<path
d="M74.2181 12.425C40.4851 12.425 13.0521 39.848 13.0401 73.555C13.0235 85.065 16.2647 96.3446 22.3891 106.09L23.8441 108.403L17.6651 130.961L40.8111 124.892L43.0461 126.216C52.4331 131.787 63.1961 134.733 74.1721 134.739H74.1951C107.902 134.739 135.335 107.313 135.348 73.604C135.374 65.5696 133.805 57.6099 130.733 50.1858C127.662 42.7617 123.148 36.0207 117.453 30.353C111.79 24.6543 105.053 20.1354 97.6315 17.0581C90.2102 13.9807 82.2521 12.406 74.2181 12.425Z"
fill="url(#paint0_linear_103_9)"
/>
<path
clipRule="evenodd"
d="M55.8061 42.801C54.4281 39.74 52.9781 39.678 51.6691 39.625L48.1451 39.582C46.9191 39.582 44.9271 40.042 43.2431 41.882C41.5591 43.722 36.8081 48.169 36.8081 57.214C36.8081 66.259 43.3961 74.999 44.3141 76.227C45.2321 77.455 57.0321 96.608 75.7191 103.977C91.2481 110.101 94.4081 108.883 97.7801 108.577C101.152 108.271 108.657 104.13 110.188 99.837C111.719 95.544 111.72 91.866 111.261 91.097C110.802 90.328 109.576 89.871 107.736 88.951C105.896 88.031 96.8591 83.584 95.1741 82.97C93.4891 82.356 92.2641 82.051 91.0371 83.891C89.8101 85.731 86.2911 89.87 85.2181 91.097C84.1451 92.324 83.0741 92.478 81.2341 91.559C79.3941 90.64 73.4741 88.698 66.4501 82.435C60.9851 77.562 57.2961 71.544 56.2221 69.705C55.1481 67.866 56.1081 66.87 57.0301 65.954C57.8551 65.13 58.8681 63.807 59.7891 62.734C60.7101 61.661 61.0131 60.894 61.6251 59.669C62.2371 58.444 61.9321 57.368 61.4721 56.449C61.0121 55.53 57.4401 46.437 55.8061 42.801Z"
fill="white"
fillRule="evenodd"
/>
<defs>
<linearGradient
gradientUnits="userSpaceOnUse"
id="paint0_linear_103_9"
x1="72.9491"
x2="73.5691"
y1="19.765"
y2="124.29"
>
<stop stopColor="#57D163" />
<stop offset="1" stopColor="#23B33A" />
</linearGradient>
</defs>
</svg>
);