docs(quick-start): add refine quick start
1
src/icons/optimized/refine.svg
Normal file
@@ -0,0 +1 @@
|
||||
<svg width="120" height="120" viewBox="0 0 120 120" fill="none" xmlns="http://www.w3.org/2000/svg"><path d="M57.700 0.119 C 57.370 0.167,56.249 0.395,55.209 0.627 C 53.461 1.016,51.678 1.868,31.526 11.939 C 19.541 17.929,9.193 23.198,8.530 23.648 C 4.667 26.271,1.597 30.863,0.472 35.700 C 0.121 37.210,0.100 38.576,0.100 60.000 C 0.100 85.317,0.026 83.862,1.501 87.538 C 2.867 90.940,5.824 94.598,8.800 96.568 C 9.515 97.041,19.730 102.239,31.500 108.119 C 56.162 120.439,54.821 119.883,59.900 119.894 C 63.173 119.901,64.630 119.643,67.341 118.578 C 69.506 117.727,109.700 97.557,111.200 96.569 C 114.030 94.704,117.087 90.984,118.394 87.815 C 118.710 87.048,119.179 85.628,119.435 84.660 L 119.900 82.900 119.900 60.100 C 119.900 38.578,119.879 37.210,119.528 35.700 C 118.403 30.863,115.333 26.271,111.470 23.648 C 110.807 23.198,100.463 17.931,88.483 11.943 C 64.080 -0.252,65.205 0.225,60.600 0.097 C 59.335 0.062,58.030 0.072,57.700 0.119 M64.791 20.601 C 68.105 21.410,71.646 23.417,74.114 25.886 C 76.593 28.364,78.562 31.847,79.445 35.312 L 79.900 37.100 79.900 60.000 L 79.900 82.900 79.445 84.688 C 77.610 91.893,72.167 97.429,65.024 99.355 C 63.343 99.808,62.709 99.874,60.000 99.874 C 57.291 99.874,56.657 99.808,54.976 99.355 C 50.269 98.086,46.201 95.231,43.562 91.344 C 42.366 89.582,41.073 86.720,40.555 84.688 L 40.100 82.900 40.100 60.000 L 40.100 37.100 40.555 35.312 C 41.078 33.258,42.363 30.425,43.611 28.575 C 46.518 24.265,51.684 21.073,57.163 20.202 C 58.917 19.922,62.858 20.129,64.791 20.601 M57.902 30.235 C 55.184 30.753,52.260 33.048,51.033 35.627 C 48.145 41.695,51.871 48.808,58.477 49.835 C 63.908 50.679,68.990 46.961,69.835 41.523 C 70.333 38.317,69.340 35.304,67.018 32.982 C 64.564 30.528,61.386 29.571,57.902 30.235 " fill="#14141F" stroke="none" fill-rule="evenodd"></path></svg>
|
||||
|
After Width: | Height: | Size: 1.8 KiB |
@@ -30,11 +30,12 @@ $aw-icon-nuxt: "\ea1d";
|
||||
$aw-icon-platform: "\ea1e";
|
||||
$aw-icon-plus: "\ea1f";
|
||||
$aw-icon-product-hunt: "\ea20";
|
||||
$aw-icon-rest: "\ea21";
|
||||
$aw-icon-search: "\ea22";
|
||||
$aw-icon-star: "\ea23";
|
||||
$aw-icon-system: "\ea24";
|
||||
$aw-icon-twitter: "\ea25";
|
||||
$aw-icon-vue: "\ea26";
|
||||
$aw-icon-x: "\ea27";
|
||||
$aw-icon-youtube: "\ea28";
|
||||
$aw-icon-refine: "\ea21";
|
||||
$aw-icon-rest: "\ea22";
|
||||
$aw-icon-search: "\ea23";
|
||||
$aw-icon-star: "\ea24";
|
||||
$aw-icon-system: "\ea25";
|
||||
$aw-icon-twitter: "\ea26";
|
||||
$aw-icon-vue: "\ea27";
|
||||
$aw-icon-x: "\ea28";
|
||||
$aw-icon-youtube: "\ea29";
|
||||
|
||||
@@ -49,11 +49,12 @@
|
||||
.aw-icon-platform:before { content: "\ea1e"; }
|
||||
.aw-icon-plus:before { content: "\ea1f"; }
|
||||
.aw-icon-product-hunt:before { content: "\ea20"; }
|
||||
.aw-icon-rest:before { content: "\ea21"; }
|
||||
.aw-icon-search:before { content: "\ea22"; }
|
||||
.aw-icon-star:before { content: "\ea23"; }
|
||||
.aw-icon-system:before { content: "\ea24"; }
|
||||
.aw-icon-twitter:before { content: "\ea25"; }
|
||||
.aw-icon-vue:before { content: "\ea26"; }
|
||||
.aw-icon-x:before { content: "\ea27"; }
|
||||
.aw-icon-youtube:before { content: "\ea28"; }
|
||||
.aw-icon-refine:before { content: "\ea21"; }
|
||||
.aw-icon-rest:before { content: "\ea22"; }
|
||||
.aw-icon-search:before { content: "\ea23"; }
|
||||
.aw-icon-star:before { content: "\ea24"; }
|
||||
.aw-icon-system:before { content: "\ea25"; }
|
||||
.aw-icon-twitter:before { content: "\ea26"; }
|
||||
.aw-icon-vue:before { content: "\ea27"; }
|
||||
.aw-icon-x:before { content: "\ea28"; }
|
||||
.aw-icon-youtube:before { content: "\ea29"; }
|
||||
|
||||
@@ -48,14 +48,15 @@
|
||||
.aw-icon-platform:before { content: "\ea1e"; }
|
||||
.aw-icon-plus:before { content: "\ea1f"; }
|
||||
.aw-icon-product-hunt:before { content: "\ea20"; }
|
||||
.aw-icon-rest:before { content: "\ea21"; }
|
||||
.aw-icon-search:before { content: "\ea22"; }
|
||||
.aw-icon-star:before { content: "\ea23"; }
|
||||
.aw-icon-system:before { content: "\ea24"; }
|
||||
.aw-icon-twitter:before { content: "\ea25"; }
|
||||
.aw-icon-vue:before { content: "\ea26"; }
|
||||
.aw-icon-x:before { content: "\ea27"; }
|
||||
.aw-icon-youtube:before { content: "\ea28"; }
|
||||
.aw-icon-refine:before { content: "\ea21"; }
|
||||
.aw-icon-rest:before { content: "\ea22"; }
|
||||
.aw-icon-search:before { content: "\ea23"; }
|
||||
.aw-icon-star:before { content: "\ea24"; }
|
||||
.aw-icon-system:before { content: "\ea25"; }
|
||||
.aw-icon-twitter:before { content: "\ea26"; }
|
||||
.aw-icon-vue:before { content: "\ea27"; }
|
||||
.aw-icon-x:before { content: "\ea28"; }
|
||||
.aw-icon-youtube:before { content: "\ea29"; }
|
||||
|
||||
$aw-icon-apple: "\ea01";
|
||||
$aw-icon-arrow-down: "\ea02";
|
||||
@@ -89,11 +90,12 @@ $aw-icon-nuxt: "\ea1d";
|
||||
$aw-icon-platform: "\ea1e";
|
||||
$aw-icon-plus: "\ea1f";
|
||||
$aw-icon-product-hunt: "\ea20";
|
||||
$aw-icon-rest: "\ea21";
|
||||
$aw-icon-search: "\ea22";
|
||||
$aw-icon-star: "\ea23";
|
||||
$aw-icon-system: "\ea24";
|
||||
$aw-icon-twitter: "\ea25";
|
||||
$aw-icon-vue: "\ea26";
|
||||
$aw-icon-x: "\ea27";
|
||||
$aw-icon-youtube: "\ea28";
|
||||
$aw-icon-refine: "\ea21";
|
||||
$aw-icon-rest: "\ea22";
|
||||
$aw-icon-search: "\ea23";
|
||||
$aw-icon-star: "\ea24";
|
||||
$aw-icon-system: "\ea25";
|
||||
$aw-icon-twitter: "\ea26";
|
||||
$aw-icon-vue: "\ea27";
|
||||
$aw-icon-x: "\ea28";
|
||||
$aw-icon-youtube: "\ea29";
|
||||
|
||||
|
Before Width: | Height: | Size: 107 KiB After Width: | Height: | Size: 111 KiB |
|
Before Width: | Height: | Size: 46 KiB After Width: | Height: | Size: 47 KiB |
@@ -191,52 +191,58 @@
|
||||
"className": "aw-icon-product-hunt",
|
||||
"unicode": ""
|
||||
},
|
||||
"rest": {
|
||||
"refine": {
|
||||
"encodedCode": "\\ea21",
|
||||
"prefix": "aw-icon",
|
||||
"className": "aw-icon-rest",
|
||||
"className": "aw-icon-refine",
|
||||
"unicode": ""
|
||||
},
|
||||
"search": {
|
||||
"rest": {
|
||||
"encodedCode": "\\ea22",
|
||||
"prefix": "aw-icon",
|
||||
"className": "aw-icon-search",
|
||||
"className": "aw-icon-rest",
|
||||
"unicode": ""
|
||||
},
|
||||
"star": {
|
||||
"search": {
|
||||
"encodedCode": "\\ea23",
|
||||
"prefix": "aw-icon",
|
||||
"className": "aw-icon-star",
|
||||
"className": "aw-icon-search",
|
||||
"unicode": ""
|
||||
},
|
||||
"system": {
|
||||
"star": {
|
||||
"encodedCode": "\\ea24",
|
||||
"prefix": "aw-icon",
|
||||
"className": "aw-icon-system",
|
||||
"className": "aw-icon-star",
|
||||
"unicode": ""
|
||||
},
|
||||
"twitter": {
|
||||
"system": {
|
||||
"encodedCode": "\\ea25",
|
||||
"prefix": "aw-icon",
|
||||
"className": "aw-icon-twitter",
|
||||
"className": "aw-icon-system",
|
||||
"unicode": ""
|
||||
},
|
||||
"vue": {
|
||||
"twitter": {
|
||||
"encodedCode": "\\ea26",
|
||||
"prefix": "aw-icon",
|
||||
"className": "aw-icon-vue",
|
||||
"className": "aw-icon-twitter",
|
||||
"unicode": ""
|
||||
},
|
||||
"x": {
|
||||
"vue": {
|
||||
"encodedCode": "\\ea27",
|
||||
"prefix": "aw-icon",
|
||||
"className": "aw-icon-x",
|
||||
"className": "aw-icon-vue",
|
||||
"unicode": ""
|
||||
},
|
||||
"youtube": {
|
||||
"x": {
|
||||
"encodedCode": "\\ea28",
|
||||
"prefix": "aw-icon",
|
||||
"className": "aw-icon-youtube",
|
||||
"className": "aw-icon-x",
|
||||
"unicode": ""
|
||||
},
|
||||
"youtube": {
|
||||
"encodedCode": "\\ea29",
|
||||
"prefix": "aw-icon",
|
||||
"className": "aw-icon-youtube",
|
||||
"unicode": ""
|
||||
}
|
||||
}
|
||||
|
||||
@@ -37,6 +37,11 @@
|
||||
name: 'Angular',
|
||||
href: '/docs/quick-starts/angular',
|
||||
image: `/images/platforms/${$themeInUse}/angular.svg`
|
||||
},
|
||||
{
|
||||
name: 'Refine',
|
||||
href: '/docs/quick-starts/refine',
|
||||
image: `/images/platforms/${$themeInUse}/refine.svg`
|
||||
},
|
||||
{
|
||||
name: 'Apple',
|
||||
@@ -47,7 +52,8 @@
|
||||
name: 'Android',
|
||||
href: '/docs/quick-starts/android',
|
||||
image: `/images/platforms/${$themeInUse}/android.svg`
|
||||
}
|
||||
},
|
||||
|
||||
] as Array<{
|
||||
name: string;
|
||||
href: string;
|
||||
|
||||
@@ -48,6 +48,12 @@
|
||||
icon: 'icon-svelte',
|
||||
image: '/images/blog/placeholder.png',
|
||||
href: 'sveltekit'
|
||||
},
|
||||
{
|
||||
title: 'Refine',
|
||||
icon: 'aw-icon-refine',
|
||||
image: '/images/blog/placeholder.png',
|
||||
href: 'refine'
|
||||
}
|
||||
]
|
||||
},
|
||||
|
||||
179
src/routes/docs/quick-starts/refine/+page.markdoc
Normal file
@@ -0,0 +1,179 @@
|
||||
---
|
||||
layout: article
|
||||
title: Start with Refine
|
||||
description: Build Refine apps with Appwrite and learn how to use our powerful backend to add authentication, user management, file storage, and more.
|
||||
difficulty: beginner
|
||||
readtime: 3
|
||||
back: /docs/quick-starts
|
||||
---
|
||||
|
||||
Learn how to setup your first Refine project powered by Appwrite.
|
||||
{% section #step-1 step=1 title="Create project" %}
|
||||
Head to the [Appwrite Console](https://cloud.appwrite.io/console).
|
||||
|
||||
{% only_dark %}
|
||||

|
||||
{% /only_dark %}
|
||||
{% only_light %}
|
||||

|
||||
{% /only_light %}
|
||||
|
||||
If this is your first time using Appwrite, create an account and create your first project.
|
||||
|
||||
Then, under **Add a platform**, add a **Web app**. The **Hostname** should be `localhost`.
|
||||
|
||||
{% only_dark %}
|
||||

|
||||
{% /only_dark %}
|
||||
{% only_light %}
|
||||

|
||||
{% /only_light %}
|
||||
|
||||
You can skip optional steps.
|
||||
|
||||
{% /section %}
|
||||
{% section #step-2 step=2 title="Create Refine project" %}
|
||||
Create a Refine project with Appwrite support.
|
||||
|
||||
```sh
|
||||
npm create refine-app@latest -- --preset refine-appwrite
|
||||
```
|
||||
{% /section %}
|
||||
{% section #step-3 step=3 title="Install Appwrite" %}
|
||||
|
||||
|
||||
Using the `refine-appwrite` preset eliminates the need for extra dependencies for a quick start.
|
||||
|
||||
If you want to integrate Appwrite into an existing Refine app, simply use this command:
|
||||
```sh
|
||||
npm install @refinedev/appwrite
|
||||
```
|
||||
Then follow [this](https://refine.dev/docs/packages/documentation/data-providers/appwrite) guide.
|
||||
|
||||
|
||||
{% /section %}
|
||||
{% section #step-4 step=4 title="Import Appwrite" %}
|
||||
Find your project's ID in the **Settings** page.
|
||||
|
||||
{% only_dark %}
|
||||

|
||||
{% /only_dark %}
|
||||
{% only_light %}
|
||||

|
||||
{% /only_light %}
|
||||
Navigate to `src/utility/appwriteClient.ts` and add your API credentials.
|
||||
|
||||
|
||||
```ts
|
||||
import { Account, Appwrite, Storage } from "@refinedev/appwrite";
|
||||
|
||||
const APPWRITE_URL = '<YOUR_API_ENDPOINT>'; // Replace with your Appwrite API Endpoint
|
||||
const APPWRITE_PROJECT = "<YOUR_PROJECT_ID>"; // Replace with your project ID
|
||||
|
||||
const appwriteClient = new Appwrite();
|
||||
|
||||
appwriteClient.setEndpoint(APPWRITE_URL).setProject(APPWRITE_PROJECT);
|
||||
const account = new Account(appwriteClient);
|
||||
const storage = new Storage(appwriteClient);
|
||||
|
||||
export { account, appwriteClient, storage };
|
||||
|
||||
```
|
||||
{% /section %}
|
||||
{% section #step-5 step=5 title="Create a login page" %}
|
||||
|
||||
Replace the code in `src/App.tsx` with the following.
|
||||
|
||||
```js
|
||||
import { Authenticated, Refine } from '@refinedev/core';
|
||||
import { dataProvider, liveProvider } from '@refinedev/appwrite';
|
||||
import {
|
||||
AuthPage,
|
||||
ErrorComponent,
|
||||
RefineThemes,
|
||||
ThemedLayoutV2,
|
||||
useNotificationProvider,
|
||||
} from '@refinedev/antd';
|
||||
import routerProvider, {
|
||||
CatchAllNavigate,
|
||||
NavigateToResource,
|
||||
} from '@refinedev/react-router-v6';
|
||||
import '@refinedev/antd/dist/reset.css';
|
||||
|
||||
import { App as AntdApp, ConfigProvider } from 'antd';
|
||||
import { BrowserRouter, Outlet, Route, Routes } from 'react-router-dom';
|
||||
|
||||
import { appwriteClient } from './utility';
|
||||
import { authProvider } from './authProvider';
|
||||
|
||||
const App: React.FC = () => {
|
||||
return (
|
||||
<BrowserRouter>
|
||||
<ConfigProvider theme={RefineThemes.Blue}>
|
||||
<AntdApp>
|
||||
<Refine
|
||||
dataProvider={dataProvider(appwriteClient, {
|
||||
databaseId: '<APPWRITE_DATABASE_ID>',
|
||||
})}
|
||||
liveProvider={liveProvider(appwriteClient, {
|
||||
databaseId: '<APPWRITE_DATABASE_ID>',
|
||||
})}
|
||||
authProvider={authProvider}
|
||||
routerProvider={routerProvider}
|
||||
notificationProvider={useNotificationProvider}
|
||||
>
|
||||
<Routes>
|
||||
<Route
|
||||
element={
|
||||
<Authenticated
|
||||
fallback={
|
||||
<CatchAllNavigate to="/login" />
|
||||
}
|
||||
>
|
||||
<ThemedLayoutV2>
|
||||
<Outlet />
|
||||
</ThemedLayoutV2>
|
||||
</Authenticated>
|
||||
}
|
||||
></Route>
|
||||
|
||||
<Route
|
||||
element={
|
||||
<Authenticated fallback={<Outlet />}>
|
||||
<NavigateToResource resource="<APPWRITE_COLLECTION_ID>" />
|
||||
</Authenticated>
|
||||
}
|
||||
>
|
||||
<Route path="/login" element={<AuthPage />} />
|
||||
<Route
|
||||
path="/register"
|
||||
element={<AuthPage type="register" />}
|
||||
/>
|
||||
</Route>
|
||||
|
||||
<Route
|
||||
element={
|
||||
<Authenticated>
|
||||
<ThemedLayoutV2>
|
||||
<Outlet />
|
||||
</ThemedLayoutV2>
|
||||
</Authenticated>
|
||||
}
|
||||
>
|
||||
<Route path="*" element={<ErrorComponent />} />
|
||||
</Route>
|
||||
</Routes>
|
||||
</Refine>
|
||||
</AntdApp>
|
||||
</ConfigProvider>
|
||||
</BrowserRouter>
|
||||
);
|
||||
};
|
||||
|
||||
export default App;
|
||||
```
|
||||
{% /section %}
|
||||
|
||||
{% section #step-6 step=6 title="All set" %}
|
||||
Run your project with `npm run dev -- --open --port 3000` and open [Localhost on Port 3000](http://localhost:3000) in your browser.
|
||||
{% /section %}
|
||||
@@ -76,7 +76,7 @@
|
||||
<li class="is-mobile-col-span-2">
|
||||
<a href="/docs/tutorials/refine" class="aw-card is-normal">
|
||||
<header class="u-flex u-cross-baseline u-gap-4">
|
||||
<span class="icon-svelte aw-u-font-size-24" aria-hidden="true" />
|
||||
<span class="aw-icon-refine aw-u-font-size-24" aria-hidden="true" />
|
||||
<h4 class="aw-sub-body-500 aw-u-color-text-primary">Refine</h4>
|
||||
</header>
|
||||
<p class="aw-sub-body-400 u-margin-block-start-4">
|
||||
|
||||
@@ -11,8 +11,13 @@ readtime: 10
|
||||
In this tutorial, you will build admin panel app with Appwrite and [Refine](https://github.com/refinedev/refine).
|
||||
|
||||
|
||||

|
||||
|
||||
{% only_dark %}
|
||||

|
||||
{% /only_dark %}
|
||||
{% only_light %}
|
||||

|
||||
{% /only_light %}
|
||||
|
||||
# Concepts {% #concepts %}
|
||||
|
||||
|
||||
@@ -36,16 +36,19 @@ This allows the framework to identify resources from routes and efficiently hand
|
||||
|
||||
|
||||
```ts
|
||||
import { authProvider } from './authProvider';
|
||||
import routerProvider from '@refinedev/react-router-v6';
|
||||
import { BrowserRouter } from 'react-router-dom';
|
||||
import { authProvider } from './authProvider';
|
||||
...
|
||||
|
||||
<BrowserRouter>
|
||||
<Refine
|
||||
...
|
||||
authProvider={authProvider}
|
||||
routerProvider={routerProvider}
|
||||
|
||||
>
|
||||
...
|
||||
</BrowserRouter>
|
||||
```
|
||||
|
||||
# Login page {% #login-page %}
|
||||
@@ -117,7 +120,7 @@ const App: React.FC = () => {
|
||||
</Authenticated>
|
||||
}
|
||||
>
|
||||
<Route path="/login" element={<AuthPage />} />
|
||||
<Route path="/login" element={<AuthPage forgotPasswordLink={false} />} />
|
||||
<Route
|
||||
path="/register"
|
||||
element={<AuthPage type="register" />}
|
||||
|
||||
|
Before Width: | Height: | Size: 52 KiB |
BIN
static/images/docs/tutorials/refine/refine-admin-panel-dark.png
Normal file
|
After Width: | Height: | Size: 106 KiB |
BIN
static/images/docs/tutorials/refine/refine-admin-panel-light.png
Normal file
|
After Width: | Height: | Size: 136 KiB |
3
static/images/platforms/dark/refine.svg
Normal file
@@ -0,0 +1,3 @@
|
||||
|
||||
<svg width="120" height="120" viewBox="0 0 120 120" xmlns="http://www.w3.org/2000/svg"><path d="M57.700 0.119 C 57.370 0.167,56.249 0.395,55.209 0.627 C 53.461 1.016,51.678 1.868,31.526 11.939 C 19.541 17.929,9.193 23.198,8.530 23.648 C 4.667 26.271,1.597 30.863,0.472 35.700 C 0.121 37.210,0.100 38.576,0.100 60.000 C 0.100 85.317,0.026 83.862,1.501 87.538 C 2.867 90.940,5.824 94.598,8.800 96.568 C 9.515 97.041,19.730 102.239,31.500 108.119 C 56.162 120.439,54.821 119.883,59.900 119.894 C 63.173 119.901,64.630 119.643,67.341 118.578 C 69.506 117.727,109.700 97.557,111.200 96.569 C 114.030 94.704,117.087 90.984,118.394 87.815 C 118.710 87.048,119.179 85.628,119.435 84.660 L 119.900 82.900 119.900 60.100 C 119.900 38.578,119.879 37.210,119.528 35.700 C 118.403 30.863,115.333 26.271,111.470 23.648 C 110.807 23.198,100.463 17.931,88.483 11.943 C 64.080 -0.252,65.205 0.225,60.600 0.097 C 59.335 0.062,58.030 0.072,57.700 0.119 M64.791 20.601 C 68.105 21.410,71.646 23.417,74.114 25.886 C 76.593 28.364,78.562 31.847,79.445 35.312 L 79.900 37.100 79.900 60.000 L 79.900 82.900 79.445 84.688 C 77.610 91.893,72.167 97.429,65.024 99.355 C 63.343 99.808,62.709 99.874,60.000 99.874 C 57.291 99.874,56.657 99.808,54.976 99.355 C 50.269 98.086,46.201 95.231,43.562 91.344 C 42.366 89.582,41.073 86.720,40.555 84.688 L 40.100 82.900 40.100 60.000 L 40.100 37.100 40.555 35.312 C 41.078 33.258,42.363 30.425,43.611 28.575 C 46.518 24.265,51.684 21.073,57.163 20.202 C 58.917 19.922,62.858 20.129,64.791 20.601 M57.902 30.235 C 55.184 30.753,52.260 33.048,51.033 35.627 C 48.145 41.695,51.871 48.808,58.477 49.835 C 63.908 50.679,68.990 46.961,69.835 41.523 C 70.333 38.317,69.340 35.304,67.018 32.982 C 64.564 30.528,61.386 29.571,57.902 30.235 " style="fill:#e4e4e7" ></path></svg>
|
||||
|
||||
|
After Width: | Height: | Size: 1.7 KiB |
3
static/images/platforms/light/refine.svg
Normal file
@@ -0,0 +1,3 @@
|
||||
|
||||
<svg width="120" height="120" viewBox="0 0 120 120" fill="none" xmlns="http://www.w3.org/2000/svg"><path d="M57.700 0.119 C 57.370 0.167,56.249 0.395,55.209 0.627 C 53.461 1.016,51.678 1.868,31.526 11.939 C 19.541 17.929,9.193 23.198,8.530 23.648 C 4.667 26.271,1.597 30.863,0.472 35.700 C 0.121 37.210,0.100 38.576,0.100 60.000 C 0.100 85.317,0.026 83.862,1.501 87.538 C 2.867 90.940,5.824 94.598,8.800 96.568 C 9.515 97.041,19.730 102.239,31.500 108.119 C 56.162 120.439,54.821 119.883,59.900 119.894 C 63.173 119.901,64.630 119.643,67.341 118.578 C 69.506 117.727,109.700 97.557,111.200 96.569 C 114.030 94.704,117.087 90.984,118.394 87.815 C 118.710 87.048,119.179 85.628,119.435 84.660 L 119.900 82.900 119.900 60.100 C 119.900 38.578,119.879 37.210,119.528 35.700 C 118.403 30.863,115.333 26.271,111.470 23.648 C 110.807 23.198,100.463 17.931,88.483 11.943 C 64.080 -0.252,65.205 0.225,60.600 0.097 C 59.335 0.062,58.030 0.072,57.700 0.119 M64.791 20.601 C 68.105 21.410,71.646 23.417,74.114 25.886 C 76.593 28.364,78.562 31.847,79.445 35.312 L 79.900 37.100 79.900 60.000 L 79.900 82.900 79.445 84.688 C 77.610 91.893,72.167 97.429,65.024 99.355 C 63.343 99.808,62.709 99.874,60.000 99.874 C 57.291 99.874,56.657 99.808,54.976 99.355 C 50.269 98.086,46.201 95.231,43.562 91.344 C 42.366 89.582,41.073 86.720,40.555 84.688 L 40.100 82.900 40.100 60.000 L 40.100 37.100 40.555 35.312 C 41.078 33.258,42.363 30.425,43.611 28.575 C 46.518 24.265,51.684 21.073,57.163 20.202 C 58.917 19.922,62.858 20.129,64.791 20.601 M57.902 30.235 C 55.184 30.753,52.260 33.048,51.033 35.627 C 48.145 41.695,51.871 48.808,58.477 49.835 C 63.908 50.679,68.990 46.961,69.835 41.523 C 70.333 38.317,69.340 35.304,67.018 32.982 C 64.564 30.528,61.386 29.571,57.902 30.235 " fill="#56565C" stroke="#56565C" fill-rule="evenodd"></path></svg>
|
||||
|
||||
|
After Width: | Height: | Size: 1.8 KiB |
3
static/images/platforms/refine.svg
Normal file
@@ -0,0 +1,3 @@
|
||||
|
||||
<svg width="120" height="120" viewBox="0 0 120 120" fill="none" xmlns="http://www.w3.org/2000/svg"><path d="M57.700 0.119 C 57.370 0.167,56.249 0.395,55.209 0.627 C 53.461 1.016,51.678 1.868,31.526 11.939 C 19.541 17.929,9.193 23.198,8.530 23.648 C 4.667 26.271,1.597 30.863,0.472 35.700 C 0.121 37.210,0.100 38.576,0.100 60.000 C 0.100 85.317,0.026 83.862,1.501 87.538 C 2.867 90.940,5.824 94.598,8.800 96.568 C 9.515 97.041,19.730 102.239,31.500 108.119 C 56.162 120.439,54.821 119.883,59.900 119.894 C 63.173 119.901,64.630 119.643,67.341 118.578 C 69.506 117.727,109.700 97.557,111.200 96.569 C 114.030 94.704,117.087 90.984,118.394 87.815 C 118.710 87.048,119.179 85.628,119.435 84.660 L 119.900 82.900 119.900 60.100 C 119.900 38.578,119.879 37.210,119.528 35.700 C 118.403 30.863,115.333 26.271,111.470 23.648 C 110.807 23.198,100.463 17.931,88.483 11.943 C 64.080 -0.252,65.205 0.225,60.600 0.097 C 59.335 0.062,58.030 0.072,57.700 0.119 M64.791 20.601 C 68.105 21.410,71.646 23.417,74.114 25.886 C 76.593 28.364,78.562 31.847,79.445 35.312 L 79.900 37.100 79.900 60.000 L 79.900 82.900 79.445 84.688 C 77.610 91.893,72.167 97.429,65.024 99.355 C 63.343 99.808,62.709 99.874,60.000 99.874 C 57.291 99.874,56.657 99.808,54.976 99.355 C 50.269 98.086,46.201 95.231,43.562 91.344 C 42.366 89.582,41.073 86.720,40.555 84.688 L 40.100 82.900 40.100 60.000 L 40.100 37.100 40.555 35.312 C 41.078 33.258,42.363 30.425,43.611 28.575 C 46.518 24.265,51.684 21.073,57.163 20.202 C 58.917 19.922,62.858 20.129,64.791 20.601 M57.902 30.235 C 55.184 30.753,52.260 33.048,51.033 35.627 C 48.145 41.695,51.871 48.808,58.477 49.835 C 63.908 50.679,68.990 46.961,69.835 41.523 C 70.333 38.317,69.340 35.304,67.018 32.982 C 64.564 30.528,61.386 29.571,57.902 30.235 " fill-rule="evenodd"></path></svg>
|
||||
|
||||
|
After Width: | Height: | Size: 1.8 KiB |