Skip to content

Commit

Permalink
feat: site search
Browse files Browse the repository at this point in the history
  • Loading branch information
SiTaggart committed Oct 11, 2023
1 parent 1a70ec0 commit 43bca5d
Show file tree
Hide file tree
Showing 28 changed files with 1,023 additions and 494 deletions.
4 changes: 2 additions & 2 deletions biome.json
Original file line number Diff line number Diff line change
Expand Up @@ -28,8 +28,8 @@
".codesandbox/ci.json",
"build.icon-list.js",
"**/*.hbs",
"docs",
"apps/backend/supabase/schema.gen.ts"
"apps/backend/supabase/schema.gen.ts",
"package.json"
]
},
"organizeImports": {
Expand Down
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);
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.

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 cerated 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.

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
13 changes: 11 additions & 2 deletions package.json
Original file line number Diff line number Diff line change
Expand Up @@ -6,7 +6,12 @@
"author": "Twilio Inc.",
"license": "MIT",
"workspaces": {
"packages": ["apps/**/*", "packages/**/*", "templates/**/*", "!packages/paste-core/core-bundle/**/*"]
"packages": [
"apps/**/*",
"packages/**/*",
"templates/**/*",
"!packages/paste-core/core-bundle/**/*"
]
},
"types": "./types/index.d.ts",
"engines": {
Expand Down Expand Up @@ -228,5 +233,9 @@
}
},
"packageManager": "[email protected]",
"browserslist": ["last 2 versions", "not dead", "not IE 11"]
"browserslist": [
"last 2 versions",
"not dead",
"not IE 11"
]
}
3 changes: 1 addition & 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 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,126 @@
/* DISCLAIMER: this is an example, not meant to be used in production */

export const SearchEmptyIllustration = ({
width,
height,
...props
}: { width: number; height: number }): JSX.Element => (
<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="a" 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(#a)">
<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

0 comments on commit 43bca5d

Please sign in to comment.