Skip to content
New issue

Have a question about this project? Sign up for a free GitHub account to open an issue and contact its maintainers and the community.

By clicking “Sign up for GitHub”, you agree to our terms of service and privacy statement. We’ll occasionally send you account related emails.

Already on GitHub? Sign in to your account

feat: updated site search #3534

Merged
merged 11 commits into from
Oct 17, 2023
Merged
Show file tree
Hide file tree
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension


Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
14 changes: 9 additions & 5 deletions cypress/integration/site-search/index.spec.ts
Original file line number Diff line number Diff line change
Expand Up @@ -5,7 +5,7 @@ describe("Docs website search", () => {
});

beforeEach(() => {
cy.intercept({ url: "https://**.algolia.net/**", method: "POST" }).as("searchRequest");
cy.intercept({ url: "/api/docs-search", method: "POST" }).as("searchRequest");
});

beforeEach(() => {
Expand All @@ -14,10 +14,14 @@ describe("Docs website search", () => {

it("should handle a search string", () => {
cy.get("@searchButtonEl").scrollIntoView().should("be.visible").click({ force: true });
cy.get(".DocSearch-Input").should("be.visible").should("be.focused").type("checkbox");
cy.get('[data-cy="paste-docsearch-input"]')
.should("be.visible")
.should("be.focused")
.type("checkbox")
.type("{enter}");
cy.wait("@searchRequest");
cy.get(".DocSearch-Hits").should("have.length.above", 0);
cy.get('.DocSearch-Hits [role="listbox"]').should("have.length.above", 0);
cy.get('.DocSearch-Hits [role="option"]').should("have.length.above", 0);
cy.get('[data-cy="paste-docsearch-hits"] h2').should("have.length.above", 0);
Copy link
Contributor

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

praise: it's great we can reuse this file!

cy.get('[data-cy="paste-docsearch-hits"] ul').should("have.length.above", 0);
cy.get('[data-cy="paste-docsearch-hits"] li').should("have.length.above", 0);
});
});
18 changes: 0 additions & 18 deletions internal-docs/engineering/developing-locally.md
Original file line number Diff line number Diff line change
Expand Up @@ -180,24 +180,6 @@ DATADOG_CLIENT_TOKEN=xxxxxxxxxxxxxxxxxxxxxxxxx
<td>ID of the Airtable that contains our roadmap
</td>
</tr>
<tr>
<td>NEXT_PUBLIC_DOCSEARCHV3_APIKEY
</td>
<td>API key for powering our docs search
</td>
</tr>
<tr>
<td>NEXT_PUBLIC_DOCSEARCHV3_APPID
</td>
<td>Docs search app ID
</td>
</tr>
<tr>
<td>NEXT_PUBLIC_DOCSEARCHV3_INDEXNAME
</td>
<td>twilio_paste
</td>
</tr>
</table>

## Building packages
Expand Down
22 changes: 14 additions & 8 deletions internal-docs/engineering/doc-site/docsearch.md
Original file line number Diff line number Diff line change
@@ -1,17 +1,23 @@
# Docsearch

The search is provided by [Algolia Docsearch v3](https://docsearch.algolia.com/docs/DocSearch-v3/).
The search is provided a custom index hosted on Supabase and created by us on a [nightly Cron Github Action](https://github.com/twilio-labs/paste/blob/main/.github/workflows/update_docs_embed.yml).

The docsearch app login is stored in OnePassword, where you can [login here](https://www.algolia.com/).
The Supabase login is stored in OnePassword.

The dashboard will give you analytics and some configurations and insights into the index that is created.
## Creating Embeddings

## Crawler
We use the same technology that powers our GPT4 powered Discussions and Chat bot, to create our Site Search.

Docsearch crawls the website automatically via the crawler. It is recrawled every day. To configure the website crawler you must log into the [crawler application](https://crawler.algolia.com/).
On a nightly basis we index new or updated content in our MDX files and Github Discussions.

The crawler is configured via the editor, and a configuration object. It controls where the sitemap live, how often to crawl, and how to extract data from the website pages into the search index.
For MDX files we create "sections" of "pages" by chunking mdx files by headings. Those sections are then converted to OPENAI Vector embeds and stored in the Supabase Vector DB.

Use the Crawler app to visualize what Algolia can extract from our web pages as it crawls, and test any configuration changes you make.
The same happens with Github discussions. The discussion is a page and is split into two sections, the initial post and the answer.

Crawler documentation can be found [here](https://www.algolia.com/doc/tools/crawler/apis/configuration/).
We can then perform a similarity search using the user input as the query.

Embeddings are generated using the the [embedding script](../../../packages/paste-website/scripts/search/).

## Returning results

We have a [NextJS API route](https://nextjs.org/docs/pages/building-your-application/routing/api-routes) `/api/documentation-search`. It will return the top 10 most similar page sections across MDX and Github discussions based on a user `prompt`.
3 changes: 0 additions & 3 deletions internal-docs/engineering/environment-variables.md
Original file line number Diff line number Diff line change
Expand Up @@ -12,9 +12,6 @@ Full list of Environment variables and where they are needed.
| DATADOG_CLIENT_TOKEN | Datadog client token for remix RUM tracking | ✅ | | | ✅ |
| NEXT_PUBLIC_DATADOG_APPLICATION_ID | Datadog application ID for docsite RUM tracking | ✅ | | ✅ | |
| NEXT_PUBLIC_DATADOG_CLIENT_TOKEN | Datadog client token for docsite RUM tracking | ✅ | | ✅ | |
| NEXT_PUBLIC_DOCSEARCHV3_APIKEY | Algolia API key | ✅ | | ✅ | |
| NEXT_PUBLIC_DOCSEARCHV3_APPID | Algolia app ID | ✅ | | ✅ | |
| NEXT_PUBLIC_DOCSEARCHV3_INDEXNAME | Algolia Index name | ✅ | | ✅ | |
| NEXT_PUBLIC_ENVIRONMENT_CONTEXT | Informs Next which deployment environment its in | ✅ | | ✅ | |
| NETLIFY_SITE_ID | Docsite site ID for Netlify deployment wait in GH actions | | ✅ | | |
| NETLIFY_TOKEN | Docsite token for Netlify deployment wait in GH actions | | ✅ | | |
Expand Down
2 changes: 1 addition & 1 deletion internal-docs/engineering/technologies.md
Original file line number Diff line number Diff line change
Expand Up @@ -96,7 +96,7 @@ The documentation site is a [NextJS](https://nextjs.org/) website using the late

The content is largely written in [MDX](https://mdxjs.com/) pages.

The search is provided by [Algolia Docsearch](https://docsearch.algolia.com/).
The search is custom built based on OpenAI embeddings, a vector DB and a similarity search that allows us to return results across mdx pages and Github discussions. [Learn more](https://github.com/twilio-labs/paste/blob/main/internal-docs/engineering/doc-site/docsearch.md).

The [roadmap](https://paste.twilio.design/roadmap/) is stored in an [Airtable](https://airtable.com/) and imported upon building the website via the [Airtable JS client](https://github.com/Airtable/airtable.js).

Expand Down
4 changes: 2 additions & 2 deletions packages/paste-website/package.json
Original file line number Diff line number Diff line change
Expand Up @@ -20,8 +20,6 @@
},
"dependencies": {
"@datadog/browser-rum": "^4.46.0",
"@docsearch/css": "^3.3.3",
"@docsearch/react": "^3.3.3",
"@hookform/error-message": "2.0.0",
"@mdx-js/loader": "^1.6.22",
"@mdx-js/mdx": "^1.6.22",
Expand Down Expand Up @@ -170,6 +168,7 @@
"react-dom": "^18.0.0",
"react-github-button": "^0.1.11",
"react-hook-form": "^7.30.0",
"react-hotkeys-hook": "^4.4.1",
"react-live": "^3.1.1",
"react-scrollspy": "^3.4.0",
"react-visibility-sensor": "5.1.1",
Expand All @@ -186,6 +185,7 @@
},
"devDependencies": {
"@next/eslint-plugin-next": "^13.1.6",
"@storybook/react": "7.0.6",
"@testing-library/react": "^13.4.0",
"tsx": "^3.12.10"
},
Expand Down
6 changes: 4 additions & 2 deletions packages/paste-website/src/components/ContactUsMenu.tsx
Original file line number Diff line number Diff line change
Expand Up @@ -20,7 +20,9 @@ export const ContactUsMenu: React.FC = () => {
<>
<MenuButton
{...menu}
variant="secondary_icon"
color="colorTextIcon"
variant="reset"
borderRadius="borderRadius10"
size="reset"
onClick={() =>
event({
Expand All @@ -30,7 +32,7 @@ export const ContactUsMenu: React.FC = () => {
})
}
>
<ProductSupportIcon decorative={false} title="Contact us" />
<ProductSupportIcon decorative={false} title="Contact us" size="sizeIcon40" />
</MenuButton>
<Menu {...menu} aria-label="Contact us">
<MenuItem
Expand Down
Original file line number Diff line number Diff line change
@@ -0,0 +1,131 @@
/* DISCLAIMER: this is an example, not meant to be used in production */

import { useUID } from "@twilio-paste/uid-library";

export const SearchEmptyIllustration = ({
width,
height,
...props
}: { width: number; height: number }): JSX.Element => {
const maskID = useUID();
return (
<svg xmlns="http://www.w3.org/2000/svg" width={width} height={height} viewBox="0 0 190 80" fill="none" {...props}>
<path
fill="#EDF6FF"
d="M35.57 23.35c-3.66 5.08-5.84 11.28-5.98 17.49-.09 4.29.59 8.62 2.05 12.65 2.34 6.45 7 11.81 13.21 14.78 5.66 2.7 12.18 3.32 18.38 2.36 9.75-1.51 19.15-7.35 23.27-16.32 5.37-11.69 1.62-26.83-7.68-35.02-8.2-7.22-21.43-9.32-31.8-5.13-4.61 1.86-8.57 5.17-11.46 9.19h.01Z"
/>
<path
fill="#FBEDE3"
d="M129.32 29.72c-2.13 2.96-3.4 6.57-3.48 10.18-.05 2.5.34 5.02 1.2 7.37 1.36 3.75 4.07 6.88 7.69 8.61 3.29 1.57 7.09 1.94 10.7 1.38 5.68-.88 11.15-4.28 13.55-9.5 3.13-6.81.94-15.62-4.47-20.39-4.77-4.2-12.48-5.43-18.51-2.99-2.68 1.08-4.99 3.01-6.67 5.35l-.01-.01Z"
/>
<path
fill="#fff"
d="M116.23 2.98h-.68c-.45 0-.9 0-1.34-.01-.88 0-1.75-.02-2.59-.02-1.69-.02-3.3-.03-4.84-.04-3.08-.02-5.87-.05-8.39-.07-5.04-.03-9.02-.04-12.11-.03-6.2.02-8.89.07-9.64.08-1.91.04-3.33.09-4.27.15-.94.06-1.4.12-1.41.17v.02c-.17-.29-.41 3.42-.59 12.63-.04 2.01-.19 10.11-.42 21.64-.2 5.77.04 12.41-.08 19.54 0 .22-.01.45-.02.67v1.02c0 .11 0 .26.02.38.04.26.12.52.25.75.25.47.69.85 1.2 1.02.5.15.96.21 1.44.24s.94.03 1.41.04c.47 0 .93.01 1.4.02h2.84c3.8-.02 7.69-.12 11.63-.16 1.97-.02 3.95-.03 5.93 0 1.99.04 3.98.07 5.98.11l5.99.12 1.49.03 1.49.05c1 .03 2.02.06 3.04-.15.51-.11 1.03-.28 1.48-.59.46-.31.82-.78 1-1.3.2-.51.21-1.07.23-1.54.02-.49.05-.98.07-1.47.09-1.96.18-3.91.25-5.84.14-3.86.25-7.64.32-11.31.15-7.34.2-14.21.17-20.28 0-3.04-.05-5.87-.09-8.47-.03-1.3-.05-2.54-.08-3.71-.02-.59-.03-1.16-.05-1.71 0-.28-.01-.55-.02-.82"
/>
<path
fill="#121C2D"
d="M117.14 9.52c0 1.52.07 5.43.06 11.14-.03 2.85-.06 6.15-.1 9.83-.06 3.67-.01 7.72-.18 12.06-.12 4.34-.25 8.98-.49 13.84-.11 1.21.07 2.51-.6 3.39-.65.9-1.92 1.16-3.13 1.22-1.23.06-2.52-.06-3.81-.07-1.29-.03-2.59-.05-3.9-.08-2.62-.05-5.27-.1-7.96-.16-2.68-.03-5.4-.02-8.13 0-2.73.04-5.47.07-8.23.11-1.38.02-2.76.04-4.13.03-1.38 0-2.77 0-4.11-.09a4.84 4.84 0 0 1-.95-.18c-.27-.08-.52-.23-.73-.43-.43-.42-.58-.97-.55-1.63.02-1.38.03-2.76.05-4.13 0-2.75-.01-5.49-.02-8.22-.07-5.44.15-10.79.22-16 .1-5.21.2-10.27.3-15.09.05-2.41.11-4.77.2-7.05.04-1.14.09-2.27.17-3.37.03-.48.13-1.33.11-1.1l.31-.04.4-.03c.27-.02.53-.03.8-.04 8.55-.29 15.94-.19 21.48-.19 5.55.03 9.28.06 10.58.06 13.59.12 17.16-.66-1.23-.82-1.29 0-5.06-.02-10.69-.05-2.82 0-6.1-.03-9.77.02-1.83.02-3.76.03-5.78.05-1.01 0-2.04.06-3.1.09l-1.6.06c-.27 0-.54.02-.81.04l-.41.04c-.16.02-.22.01-.53.08-.12.03-.25.12-.27.15-.08.09-.12.22-.15.34-.05.26-.05.32-.07.49l-.07.84c-.03.56-.06 1.12-.1 1.68-.04 1.13-.09 2.27-.13 3.44-.05 2.32-.11 4.72-.17 7.17-.09 4.89-.19 10.02-.28 15.29-.05 2.64-.11 5.31-.16 8.02-.04 2.71 0 5.44.01 8.19.02 2.75.03 5.51 0 8.28-.02.69-.04 1.39-.02 2.09-.02.79.37 1.61 1.03 2.08.69.5 1.47.54 2.17.61.7.02 1.41.05 2.11.05 5.57.06 11.13-.15 16.59-.16 5.46-.06 10.85.13 16.07.2 1.31.02 2.59.06 3.88.1 1.28.02 2.64.03 3.89-.57.62-.3 1.15-.84 1.43-1.48.29-.63.32-1.34.34-1.93.05-1.23.11-2.45.16-3.65.23-4.81.29-9.39.42-13.64.07-8.51.13-15.73.18-21.04-.06-5.31-.1-8.71-.11-9.56-.22-7.62-.63-7.38-.52-.27l.03-.01Z"
/>
<path
fill="#121C2D"
d="M82.4 9.88c-.4-.1-5.74-.18-6.08-.18-.44 0-.58.81.02.81.34 0 5.84-.07 6.06-.12.25-.05.23-.46 0-.52v.01ZM111.44 9.91c-1.49.05-21.95-.53-23.26-.41-1.69.02-2.11.83.16.81 1.26-.11 22.22.31 23.07.11.94-.06.91-.47.03-.52v.01Z"
/>
<path
fill="#51A5DF"
d="M110.5 13.22c-2.12-.12-31.01-.56-32.83-.58-2.37-.03-3.01.77.21.81 1.79.02 31.38.31 32.57.28 1.33-.03 1.3-.44.06-.51h-.01Z"
/>
<path
fill="#EE2F46"
d="M100.46 17.04c-1.52-.1-22.19-.23-23.5-.23-1.7 0-2.16.8.14.81 1.29 0 22.48-.02 23.33-.06.95-.05.92-.46.03-.52Z"
/>
<path
fill="#121C2D"
d="M110.93 17.05c-.52-.1-7.51-.18-7.95-.18-.57 0-.74.81.04.81.44 0 7.62-.07 7.91-.12.32-.05.31-.46 0-.52v.01ZM109.97 21.45c-1.04-.08-8.68-.29-16.28-.34-7.6-.07-15.16-.14-16.06-.15-2.34-.03-2.96.77.2.81.88 0 8.61.03 16.26.05 7.65 0 15.22.14 15.81.14 1.31-.02 1.28-.43.06-.51h.01ZM82.4 24.98c-.4-.1-5.74-.18-6.08-.18-.44 0-.58.81.02.81.34 0 5.84-.07 6.06-.12.25-.05.23-.46 0-.52v.01Z"
/>
<path
fill="#EE2F46"
d="M111.44 25.01c-1.49.05-21.95-.53-23.26-.41-1.69.02-2.11.83.16.81 1.26-.11 22.22.31 23.07.11.94-.06.91-.47.03-.52v.01Z"
/>
<path
fill="#121C2D"
d="M110.5 28.31c-2.12-.12-31.01-.56-32.83-.58-2.37-.03-3.01.77.21.81 1.79.02 31.38.31 32.57.28 1.33-.03 1.3-.44.06-.51h-.01ZM100.46 32.14c-1.52-.1-22.19-.23-23.5-.23-1.7 0-2.16.8.14.81 1.29 0 22.48-.02 23.33-.06.95-.05.92-.46.03-.52Z"
/>
<path
fill="#EE2F46"
d="M110.93 32.14c-.52-.1-7.51-.18-7.95-.18-.57 0-.74.81.04.81.44 0 7.62-.07 7.91-.12.32-.05.31-.46 0-.52v.01Z"
/>
<path
fill="#51A5DF"
d="M109.97 36.54c-1.04-.08-8.68-.29-16.28-.34-7.6-.07-15.16-.14-16.06-.15-2.34-.03-2.96.77.2.81.88 0 8.61.03 16.26.05 7.65 0 15.22.14 15.81.14 1.31-.02 1.28-.43.06-.51h.01Z"
/>
<path
fill="#EE2F46"
d="M90.84 40.02c-.91-.09-13.26-.15-14.04-.15-1.01 0-1.3.81.07.81.77 0 13.45-.1 13.96-.14.57-.05.54-.46.01-.52Z"
/>
<path
fill="#121C2D"
d="M111.62 40.8c-1.08.08-15.93-.57-16.89-.42-1.23.01-1.53.82.12.81.46-.01 4.48-.05 8.48.1 4 .14 7.97.06 8.28.03.69-.06.66-.47.02-.52h-.01Z"
/>
<path
fill="#EE2F46"
d="M110.5 44.1c-2.12-.12-31.01-.56-32.83-.58-2.37-.03-3.01.77.21.81 1.79.02 31.38.31 32.57.28 1.33-.03 1.3-.44.06-.51h-.01Z"
/>
<path
fill="#51A5DF"
d="M100.46 47.93c-1.52-.1-22.19-.23-23.5-.23-1.7 0-2.16.8.14.81 1.29 0 22.48-.02 23.33-.06.95-.05.92-.46.03-.52Z"
/>
<path
fill="#EE2F46"
d="M110.93 47.93c-.52-.1-7.51-.18-7.95-.18-.57 0-.74.81.04.81.44 0 7.62-.07 7.91-.12.32-.05.31-.46 0-.52v.01Z"
/>
<path
fill="#121C2D"
d="M109.97 52.33c-1.04-.08-8.68-.29-16.28-.34-7.6-.07-15.16-.14-16.06-.15-2.34-.03-2.96.77.2.81.88 0 8.61.03 16.26.05 7.65 0 15.22.14 15.81.14 1.31-.02 1.28-.43.06-.51h.01Z"
/>
<path
fill="#fff"
d="M111.53 29.63c-6.02 1.75-8.72 8.18-8.18 14.1.18 1.96.88 3.87 2.01 5.47 2.6 3.68 7.11 5.14 11.42 4.76 1.26-.11 2.5-.38 3.69-.81 6.26-2.3 8.57-9.19 6.97-15.41-.28-1.07-.67-2.12-1.17-3.1-1.22-2.37-3.11-4.23-5.61-5.11-2.5-.88-5.29-1.04-7.84-.37"
/>
<path
fill="#121C2D"
d="M114.84 29.06c.56-.03 2.04-.17 4.13.29 1.04.24 2.23.6 3.37 1.33 1.14.72 2.24 1.79 3.09 3.15.86 1.36 1.51 3 1.85 4.78.37 1.77.41 3.7.04 5.61-.34 1.91-1.18 3.78-2.42 5.36-1.29 1.54-3.01 2.74-4.96 3.36-3.88 1.27-8.36.8-11.56-1.33-1.6-1.06-2.82-2.53-3.59-4.13-.78-1.6-1.1-3.29-1.11-4.88-.06-3.2.83-5.89 1.86-7.64 1.02-1.79 2.11-2.66 2.46-2.98 1.92-1.59 3.5-2.07 3.53-2.34.02-.12-.31-.11-1.09.09-.75.25-1.98.72-3.32 1.96-.37.34-1.49 1.38-2.53 3.33-1.01 1.95-1.87 4.85-1.65 8.26.07 1.7.56 3.53 1.51 5.21.96 1.67 2.4 3.19 4.22 4.19 3.62 2.03 8.37 2.28 12.38.61 1.02-.39 1.94-1 2.8-1.66.83-.7 1.57-1.5 2.18-2.39 1.2-1.78 1.89-3.83 2.12-5.84.45-4.05-.69-7.92-2.66-10.59-.99-1.33-2.21-2.34-3.44-2.98-1.24-.64-2.43-.93-3.44-1.12-2.03-.35-3.37-.18-3.69-.16-1.48.16-2.13.52-2.1.62.03.12.72 0 2.04-.1l-.02-.01ZM147.37 77.37c.3-.05 1.07-.18 2.02-.75.92-.57 2.1-1.59 2.54-3.31.1-.43.1-.92-.04-1.38-.13-.46-.35-.88-.61-1.27-.52-.77-1.09-1.52-1.72-2.29-1.24-1.52-2.64-3.07-4.08-4.59-2.89-3.05-5.98-6-8.63-8.31-1.33-1.16-2.55-2.15-3.6-2.91-.53-.38-1-.7-1.45-.94-.46-.23-.8-.45-1.32-.42h.07c-1.22-.1-1.41-.27-1.52-.29a1.87 1.87 0 0 1-1-.86c-.16-.29-.17-.52-.27-.59-.07-.06-.3.08-.3.61.01.26.1.59.35.91.24.33.68.62 1.18.77.08 0 .22.14 1.51.25h.07c.06 0 .31.05.66.22.34.18.77.43 1.25.76.97.66 2.16 1.61 3.49 2.74 2.66 2.26 5.85 5.27 8.85 8.38 1.5 1.55 2.95 3.14 4.23 4.68 1.19 1.54 2.71 3.06 2.24 4.54-.43 1.47-1.52 2.42-2.34 2.9-.85.49-1.48.58-1.63.63-.73.15-1.1.22-1.11.34-.01.1.38.27 1.15.17l.01.01Z"
/>
<path
fill="#121C2D"
d="M144.92 75.37c-.53-.62-4.25-4.24-8.34-8.21-2.03-1.99-4.15-4.08-5.94-5.98-.89-.95-1.71-1.85-2.38-2.66-.67-.8-1.21-1.58-1.43-2.08-.24-1.8-.48-2.64-.73-2.93-.39-.53-.95-.72-1.33-.69-.39.03-.55.23-.54.32.01.11.17.13.4.23.21.08.63.3.88.73.03.11.22.29.53 2.57.41 1.04 1.71 2.55 3.48 4.45 1.77 1.88 3.98 4.05 6.16 6.15 4.36 4.17 8.49 8.11 8.85 8.45.87.81 1.14.5.4-.33l-.01-.02Z"
/>
<path
fill="#121C2D"
d="M129.66 47.76c.29-.61.86-2.3.95-4.8.05-1.25.05-2.7-.16-4.3-.21-1.6-.65-3.36-1.53-5.08-1.71-3.43-5.33-6.62-9.96-7.47-4.6-.84-9.75.72-13.33 4.09-1.79 1.67-3.19 3.77-3.98 6.06-.8 2.28-1.07 4.71-.8 7 .22 2.3.97 4.47 2 6.34 1.07 1.86 2.43 3.44 3.98 4.57 1.53 1.16 3.23 1.85 4.8 2.2 1.57.35 3.02.41 4.24.36 2.46-.1 4.07-.62 4.62-.79 1.44-.48 2.52-1.18 3.15-1.79.64-.61.88-1.08.85-1.18-.04-.12-.34.12-1.03.61-.7.48-1.86 1.2-3.72 1.74-.51.14-2.07.59-4.46.62-2.34.03-5.7-.42-8.52-2.84-2.86-2.3-4.99-6.33-5.23-10.8-.11-2.23.25-4.55 1.17-6.69.46-1.07 1.05-2.08 1.75-3.03.72-.93 1.54-1.78 2.44-2.54 3.64-3.01 8.7-4.19 12.98-3.04 4.3 1.15 7.52 4.39 8.89 7.7 1.41 3.35 1.36 6.56 1.25 8.81-.12 2.28-.65 3.63-.78 3.96-.59 1.49-1.15 2.07-1.04 2.18.05.07.8-.4 1.47-1.86v-.03ZM150.33 72.77c-.15-.48-1.2-2.12-2.97-4.07-1.74-1.97-4.1-4.34-6.52-6.62-2.42-2.29-4.91-4.49-6.89-6.16-.5-.42-.96-.8-1.37-1.15-.43-.33-.74-.68-1.25-.92-.91-.35-1.45-.34-1.63-.4-.49-.09-.82-.16-1.06-.24-.23-.08-.4-.16-.5-.12-.09.02-.14.22.1.52.24.31.8.56 1.49.67.18.05.8.07 1.41.38.12.07.3.22.49.38.19.15.39.32.6.49.42.35.89.74 1.39 1.16 2 1.68 4.53 3.89 6.98 6.17 2.45 2.27 4.81 4.62 6.5 6.51 1.73 1.88 2.66 3.37 2.72 3.59.26.48.29.67.42.71.11.05.3-.34.07-.88l.02-.02Z"
/>
<mask id={maskID} width="25" height="25" x="103" y="29" maskUnits="userSpaceOnUse">
<path
fill="#fff"
d="M111.66 29.85c-5.86 1.72-8.49 8.01-7.96 13.81a11.1 11.1 0 0 0 1.95 5.36c2.53 3.6 6.92 5.03 11.12 4.66 1.22-.11 2.44-.37 3.59-.79 6.09-2.25 8.34-9 6.78-15.09-.27-1.05-.65-2.07-1.14-3.03-1.19-2.32-3.02-4.14-5.46-5-2.44-.86-5.15-1.02-7.63-.36l-1.24.46-.01-.02Z"
/>
</mask>
<g mask={`url(#${maskID})`}>
<path
fill="#EE2F46"
d="M125.69 30.05c-1.15-.13-16.79-.74-17.78-.78-1.29-.05-1.65.75.09.81.97.03 17 .5 17.65.48.72-.03.72-.44.04-.51Z"
/>
<path
fill="#51A5DF"
d="M126.59 36.33c-1.76-.11-14.62-.42-27.41-.46-12.8-.04-25.53-.14-27.04-.18-3.93-.06-4.98.74.35.82 1.49.04 14.5.09 27.38.08 12.88-.01 25.64.23 26.62.25 2.21 0 2.15-.41.09-.51h.01Z"
/>
<path
fill="#121C2D"
d="M128.71 42.41c-.96-.02-7.89-.14-14.8-.26-6.91-.13-13.8-.07-14.61-.06-2.13.02-2.67.84.2.81.8-.01 7.82-.11 14.78-.03 6.96.08 13.85.08 14.38.06 1.19-.04 1.16-.45.05-.52Z"
/>
<path
fill="#EE2F46"
d="M131.71 49.17c-1.7-.09-14.12-.29-26.47-.41-12.36-.12-24.65-.38-26.11-.43-3.8-.1-4.82.69.33.82 2.88.22 50.27.47 52.17.54 2.13-.01 2.08-.43.09-.51l-.01-.01Z"
/>
</g>
<path
fill="#121C2D"
d="M113.18 64.31c-1.6-.02-8.24-.09-17.39-.19-4.58 0-9.78.05-15.29-.01-2.75-.04-5.59-.09-8.44-.26-.71-.05-1.43-.1-2.13-.19-.35-.04-.7-.1-1.03-.17-.35-.08-.55-.15-.8-.39-.97-.85-1.11-2.38-1.12-3.78.02-23.25.58-46.41.69-49.15.11-3.57.03-5.83-.17-6-.19-.17-.51 1.78-.66 6.62-.04 1.35-.22 7.95-.35 17.13-.05 4.59-.11 9.83-.17 15.39l-.06 8.53c0 1.45 0 2.91-.01 4.37.02 1.47-.04 2.92.08 4.43.09.75.25 1.53.66 2.23.21.35.49.66.81.91.14.12.38.25.58.31.2.06.39.11.57.14 1.49.26 2.93.32 4.38.4 2.89.13 5.72.16 8.48.18 5.5-.01 10.65-.03 15.13-.04 8.96.04 15.21.07 16.11.07 4.01-.02 3.89-.43.14-.51l-.01-.02Z"
/>
</svg>
);
};
Loading
Loading