refactor!: remove next.js (#3267)
84
apps/core/.webpack/cache-group.ts
Normal file
@@ -0,0 +1,84 @@
|
||||
import { hash } from './utils.js';
|
||||
|
||||
function testPackageName(regexp: RegExp): (module: any) => boolean {
|
||||
return (module: any) =>
|
||||
module.nameForCondition && regexp.test(module.nameForCondition());
|
||||
}
|
||||
|
||||
export const productionCacheGroups = {
|
||||
asyncVendor: {
|
||||
test: /[\\/]node_modules[\\/]/,
|
||||
name(module: any) {
|
||||
// https://hackernoon.com/the-100-correct-way-to-split-your-chunks-with-webpack-f8a9df5b7758
|
||||
const name =
|
||||
module.context.match(/[\\/]node_modules[\\/](.*?)([\\/]|$)/)?.[1] ??
|
||||
'unknown';
|
||||
return `npm-async-${hash(name)}`;
|
||||
},
|
||||
priority: Number.MAX_SAFE_INTEGER,
|
||||
chunks: 'async' as const,
|
||||
},
|
||||
mui: {
|
||||
name: `npm-mui`,
|
||||
test: testPackageName(/[\\/]node_modules[\\/](mui|@mui)[\\/]/),
|
||||
priority: 200,
|
||||
enforce: true,
|
||||
},
|
||||
blocksuite: {
|
||||
name: `npm-blocksuite`,
|
||||
test: testPackageName(/[\\/]node_modules[\\/](@blocksuite)[\\/]/),
|
||||
priority: 200,
|
||||
enforce: true,
|
||||
},
|
||||
react: {
|
||||
name: `npm-react`,
|
||||
test: testPackageName(
|
||||
/[\\/]node_modules[\\/](react|react-dom|scheduler)[\\/]/
|
||||
),
|
||||
priority: 200,
|
||||
enforce: true,
|
||||
},
|
||||
jotai: {
|
||||
name: `npm-jotai`,
|
||||
test: testPackageName(/[\\/]node_modules[\\/](jotai)[\\/]/),
|
||||
priority: 200,
|
||||
enforce: true,
|
||||
},
|
||||
rxjs: {
|
||||
name: `npm-rxjs`,
|
||||
test: testPackageName(/[\\/]node_modules[\\/]rxjs[\\/]/),
|
||||
priority: 200,
|
||||
enforce: true,
|
||||
},
|
||||
lodash: {
|
||||
name: `npm-lodash`,
|
||||
test: testPackageName(/[\\/]node_modules[\\/]lodash[\\/]/),
|
||||
priority: 200,
|
||||
enforce: true,
|
||||
},
|
||||
emotion: {
|
||||
name: `npm-emotion`,
|
||||
test: testPackageName(/[\\/]node_modules[\\/](@emotion)[\\/]/),
|
||||
priority: 200,
|
||||
enforce: true,
|
||||
},
|
||||
vendor: {
|
||||
name: 'vendor',
|
||||
test: /[\\/]node_modules[\\/]/,
|
||||
priority: 190,
|
||||
enforce: true,
|
||||
},
|
||||
styles: {
|
||||
name: 'styles',
|
||||
test: (module: any) =>
|
||||
module.nameForCondition &&
|
||||
/\.css$/.test(module.nameForCondition()) &&
|
||||
!/^javascript/.test(module.type),
|
||||
chunks: 'all' as const,
|
||||
minSize: 1,
|
||||
minChunks: 1,
|
||||
reuseExistingChunk: true,
|
||||
priority: 1000,
|
||||
enforce: true,
|
||||
},
|
||||
};
|
||||
306
apps/core/.webpack/config.ts
Normal file
@@ -0,0 +1,306 @@
|
||||
import { join, resolve } from 'node:path';
|
||||
import { fileURLToPath } from 'node:url';
|
||||
import { createRequire } from 'node:module';
|
||||
import HTMLPlugin from 'html-webpack-plugin';
|
||||
import type { Configuration as DevServerConfiguration } from 'webpack-dev-server';
|
||||
import { PerfseePlugin } from '@perfsee/webpack';
|
||||
import { sentryWebpackPlugin } from '@sentry/webpack-plugin';
|
||||
|
||||
import CopyPlugin from 'copy-webpack-plugin';
|
||||
import ReactRefreshWebpackPlugin from '@pmmmwh/react-refresh-webpack-plugin';
|
||||
import TerserPlugin from 'terser-webpack-plugin';
|
||||
import webpack from 'webpack';
|
||||
import MiniCssExtractPlugin from 'mini-css-extract-plugin';
|
||||
|
||||
import { productionCacheGroups } from './cache-group.js';
|
||||
import type { BuildFlags } from '@affine/cli/config';
|
||||
import { projectRoot } from '@affine/cli/config';
|
||||
import { VanillaExtractPlugin } from '@vanilla-extract/webpack-plugin';
|
||||
import { computeCacheKey } from './utils.js';
|
||||
import type { RuntimeConfig } from '@affine/env/global';
|
||||
|
||||
const IN_CI = !!process.env.CI;
|
||||
|
||||
export const rootPath = fileURLToPath(new URL('..', import.meta.url));
|
||||
|
||||
const require = createRequire(rootPath);
|
||||
|
||||
const OptimizeOptionOptions: (
|
||||
buildFlags: BuildFlags
|
||||
) => webpack.Configuration['optimization'] = buildFlags => ({
|
||||
minimize: buildFlags.mode === 'production',
|
||||
minimizer: [
|
||||
new TerserPlugin({
|
||||
minify: TerserPlugin.swcMinify,
|
||||
parallel: true,
|
||||
extractComments: true,
|
||||
terserOptions: {
|
||||
ecma: 2020,
|
||||
compress: {
|
||||
unused: true,
|
||||
},
|
||||
mangle: true,
|
||||
},
|
||||
}),
|
||||
],
|
||||
removeEmptyChunks: true,
|
||||
providedExports: true,
|
||||
usedExports: true,
|
||||
sideEffects: true,
|
||||
removeAvailableModules: true,
|
||||
runtimeChunk: {
|
||||
name: 'runtime',
|
||||
},
|
||||
splitChunks: {
|
||||
chunks: 'all',
|
||||
minSize: 1,
|
||||
minChunks: 1,
|
||||
maxInitialRequests: Number.MAX_SAFE_INTEGER,
|
||||
maxAsyncRequests: Number.MAX_SAFE_INTEGER,
|
||||
cacheGroups:
|
||||
buildFlags.mode === 'production'
|
||||
? productionCacheGroups
|
||||
: {
|
||||
default: false,
|
||||
vendors: false,
|
||||
},
|
||||
},
|
||||
});
|
||||
|
||||
export const createConfiguration: (
|
||||
buildFlags: BuildFlags,
|
||||
runtimeConfig: RuntimeConfig
|
||||
) => webpack.Configuration = (buildFlags, runtimeConfig) => {
|
||||
let publicPath = process.env.PUBLIC_PATH ?? '/';
|
||||
|
||||
const cacheKey = computeCacheKey(buildFlags);
|
||||
|
||||
const config = {
|
||||
name: 'affine',
|
||||
// to set a correct base path for the source map
|
||||
context: projectRoot,
|
||||
output: {
|
||||
environment: {
|
||||
module: true,
|
||||
dynamicImport: true,
|
||||
},
|
||||
filename: 'js/[name].js',
|
||||
// In some cases webpack will emit files starts with "_" which is reserved in web extension.
|
||||
chunkFilename: 'js/chunk.[name].js',
|
||||
assetModuleFilename: 'assets/[hash][ext][query]',
|
||||
devtoolModuleFilenameTemplate: 'webpack://[namespace]/[resource-path]',
|
||||
hotUpdateChunkFilename: 'hot/[id].[fullhash].js',
|
||||
hotUpdateMainFilename: 'hot/[runtime].[fullhash].json',
|
||||
path: join(rootPath, 'dist'),
|
||||
clean: buildFlags.mode === 'production',
|
||||
globalObject: 'globalThis',
|
||||
publicPath,
|
||||
},
|
||||
target: ['web', 'es2022'],
|
||||
|
||||
mode: buildFlags.mode,
|
||||
|
||||
devtool:
|
||||
buildFlags.mode === 'production'
|
||||
? buildFlags.distribution === 'desktop'
|
||||
? 'inline-source-map'
|
||||
: 'hidden-nosources-source-map'
|
||||
: 'eval-cheap-module-source-map',
|
||||
|
||||
resolve: {
|
||||
extensionAlias: {
|
||||
'.js': ['.js', '.tsx', '.ts'],
|
||||
'.mjs': ['.mjs', '.mts'],
|
||||
},
|
||||
extensions: ['.js', '.ts', '.tsx'],
|
||||
},
|
||||
|
||||
cache: {
|
||||
type: 'filesystem',
|
||||
buildDependencies: {
|
||||
config: [fileURLToPath(import.meta.url)],
|
||||
},
|
||||
version: cacheKey,
|
||||
},
|
||||
|
||||
module: {
|
||||
parser: {
|
||||
javascript: {
|
||||
// Treat as missing export as error
|
||||
strictExportPresence: true,
|
||||
},
|
||||
},
|
||||
rules: [
|
||||
{
|
||||
test: /\.m?js?$/,
|
||||
resolve: {
|
||||
fullySpecified: false,
|
||||
},
|
||||
},
|
||||
{
|
||||
oneOf: [
|
||||
{
|
||||
test: /\.tsx?$/,
|
||||
// Compile all ts files in the workspace
|
||||
include: resolve(rootPath, '..', '..'),
|
||||
loader: require.resolve('swc-loader'),
|
||||
options: {
|
||||
// https://swc.rs/docs/configuring-swc/
|
||||
jsc: {
|
||||
preserveAllComments: true,
|
||||
parser: {
|
||||
syntax: 'typescript',
|
||||
dynamicImport: true,
|
||||
topLevelAwait: false,
|
||||
tsx: true,
|
||||
},
|
||||
target: 'es2022',
|
||||
externalHelpers: true,
|
||||
transform: {
|
||||
react: {
|
||||
runtime: 'automatic',
|
||||
refresh: buildFlags.mode === 'development' && {
|
||||
refreshReg: '$RefreshReg$',
|
||||
refreshSig: '$RefreshSig$',
|
||||
emitFullSignatures: true,
|
||||
},
|
||||
},
|
||||
},
|
||||
experimental: {
|
||||
keepImportAssertions: true,
|
||||
plugins: [
|
||||
buildFlags.coverage && [
|
||||
'swc-plugin-coverage-instrument',
|
||||
{},
|
||||
],
|
||||
].filter(Boolean),
|
||||
},
|
||||
},
|
||||
},
|
||||
},
|
||||
{
|
||||
test: /\.svg$/,
|
||||
use: [
|
||||
'thread-loader',
|
||||
{
|
||||
loader: '@svgr/webpack',
|
||||
options: {
|
||||
icon: true,
|
||||
},
|
||||
},
|
||||
],
|
||||
exclude: [/node_modules/],
|
||||
},
|
||||
{
|
||||
test: /\.(png|jpg|gif|svg|webp)$/,
|
||||
type: 'asset/resource',
|
||||
},
|
||||
{
|
||||
test: /\.(ttf|eot|woff|woff2)$/i,
|
||||
type: 'asset/resource',
|
||||
},
|
||||
{
|
||||
test: /\.txt$/,
|
||||
loader: 'raw-loader',
|
||||
},
|
||||
{
|
||||
test: /\.css$/,
|
||||
use: [
|
||||
MiniCssExtractPlugin.loader,
|
||||
{
|
||||
loader: 'css-loader',
|
||||
options: {
|
||||
url: false,
|
||||
sourceMap: false,
|
||||
modules: false,
|
||||
import: true,
|
||||
importLoaders: 1,
|
||||
},
|
||||
},
|
||||
{
|
||||
loader: 'postcss-loader',
|
||||
options: {
|
||||
postcssOptions: {
|
||||
config: resolve(
|
||||
rootPath,
|
||||
'.webpack',
|
||||
'postcss.config.cjs'
|
||||
),
|
||||
},
|
||||
},
|
||||
},
|
||||
],
|
||||
},
|
||||
],
|
||||
},
|
||||
],
|
||||
},
|
||||
|
||||
plugins: [
|
||||
...(IN_CI ? [] : [new webpack.ProgressPlugin({ percentBy: 'entries' })]),
|
||||
...(buildFlags.mode === 'development'
|
||||
? [new ReactRefreshWebpackPlugin({ overlay: false, esModule: true })]
|
||||
: []),
|
||||
new HTMLPlugin({
|
||||
template: join(rootPath, '.webpack', 'template.html'),
|
||||
inject: 'body',
|
||||
scriptLoading: 'defer',
|
||||
minify: false,
|
||||
chunks: ['index'],
|
||||
filename: 'index.html',
|
||||
}),
|
||||
new MiniCssExtractPlugin({
|
||||
filename: `[name].[chunkhash:8].css`,
|
||||
ignoreOrder: true,
|
||||
}),
|
||||
new VanillaExtractPlugin(),
|
||||
new webpack.DefinePlugin({
|
||||
'process.env': JSON.stringify({}),
|
||||
runtimeConfig: JSON.stringify(runtimeConfig),
|
||||
}),
|
||||
new CopyPlugin({
|
||||
patterns: [
|
||||
{ from: resolve(rootPath, 'public'), to: resolve(rootPath, 'dist') },
|
||||
],
|
||||
}),
|
||||
],
|
||||
|
||||
optimization: OptimizeOptionOptions(buildFlags),
|
||||
|
||||
devServer: {
|
||||
hot: 'only',
|
||||
liveReload: false,
|
||||
client: undefined,
|
||||
historyApiFallback: true,
|
||||
static: {
|
||||
directory: resolve(rootPath, 'public'),
|
||||
publicPath: '/',
|
||||
},
|
||||
} as DevServerConfiguration,
|
||||
} satisfies webpack.Configuration;
|
||||
|
||||
if (buildFlags.mode === 'production' && process.env.PERFSEE_TOKEN) {
|
||||
config.devtool = 'hidden-nosources-source-map';
|
||||
config.plugins.push(
|
||||
new PerfseePlugin({
|
||||
project: 'affine-toeverything',
|
||||
})
|
||||
);
|
||||
}
|
||||
|
||||
if (
|
||||
process.env.SENTRY_AUTH_TOKEN &&
|
||||
process.env.SENTRY_ORG &&
|
||||
process.env.SENTRY_PROJECT
|
||||
) {
|
||||
config.plugins.push(
|
||||
sentryWebpackPlugin({
|
||||
org: process.env.SENTRY_ORG,
|
||||
project: process.env.SENTRY_PROJECT,
|
||||
authToken: process.env.SENTRY_AUTH_TOKEN,
|
||||
})
|
||||
);
|
||||
}
|
||||
|
||||
return config;
|
||||
};
|
||||
20
apps/core/.webpack/postcss.config.cjs
Normal file
@@ -0,0 +1,20 @@
|
||||
const cssnano = require('cssnano');
|
||||
|
||||
module.exports = function (context) {
|
||||
const plugins = [
|
||||
cssnano({
|
||||
preset: [
|
||||
'default',
|
||||
{
|
||||
convertValues: false,
|
||||
},
|
||||
],
|
||||
}),
|
||||
];
|
||||
|
||||
return {
|
||||
from: context.from,
|
||||
plugins,
|
||||
to: context.to,
|
||||
};
|
||||
};
|
||||
115
apps/core/.webpack/runtime-config.ts
Normal file
@@ -0,0 +1,115 @@
|
||||
import type { BlockSuiteFeatureFlags, RuntimeConfig } from '@affine/env/global';
|
||||
import type { BuildFlags } from '@affine/cli/config';
|
||||
import { createRequire } from 'node:module';
|
||||
|
||||
const require = createRequire(import.meta.url);
|
||||
const packageJson = require('../package.json');
|
||||
|
||||
const editorFlags: BlockSuiteFeatureFlags = {
|
||||
enable_database: true,
|
||||
enable_slash_menu: true,
|
||||
enable_edgeless_toolbar: true,
|
||||
enable_block_hub: true,
|
||||
enable_drag_handle: true,
|
||||
enable_surface: true,
|
||||
enable_linked_page: true,
|
||||
enable_bookmark_operation: false,
|
||||
};
|
||||
|
||||
export function getRuntimeConfig(buildFlags: BuildFlags): RuntimeConfig {
|
||||
const buildPreset: Record<string, RuntimeConfig> = {
|
||||
stable: {
|
||||
enablePlugin: false,
|
||||
enableTestProperties: false,
|
||||
enableBroadcastChannelProvider: true,
|
||||
enableDebugPage: true,
|
||||
changelogUrl: 'https://affine.pro/blog/what-is-new-affine-0717',
|
||||
imageProxyUrl: 'https://workers.toeverything.workers.dev/proxy/image',
|
||||
enablePreloading: true,
|
||||
enableNewSettingModal: true,
|
||||
enableNewSettingUnstableApi: false,
|
||||
enableSQLiteProvider: true,
|
||||
enableMoveDatabase: false,
|
||||
enableNotificationCenter: false,
|
||||
enableCloud: false,
|
||||
serverAPI: 'https://localhost:3010',
|
||||
editorFlags,
|
||||
appVersion: packageJson.version,
|
||||
editorVersion: packageJson.dependencies['@blocksuite/editor'],
|
||||
},
|
||||
// canary will be aggressive and enable all features
|
||||
canary: {
|
||||
enablePlugin: true,
|
||||
enableTestProperties: true,
|
||||
enableBroadcastChannelProvider: true,
|
||||
enableDebugPage: true,
|
||||
changelogUrl: 'https://affine.pro/blog/what-is-new-affine-0717',
|
||||
imageProxyUrl: 'https://workers.toeverything.workers.dev/proxy/image',
|
||||
enablePreloading: true,
|
||||
enableNewSettingModal: true,
|
||||
enableNewSettingUnstableApi: false,
|
||||
enableSQLiteProvider: true,
|
||||
enableMoveDatabase: false,
|
||||
enableNotificationCenter: true,
|
||||
enableCloud: false,
|
||||
serverAPI: 'https://localhost:3010',
|
||||
editorFlags,
|
||||
appVersion: packageJson.version,
|
||||
editorVersion: packageJson.dependencies['@blocksuite/editor'],
|
||||
},
|
||||
};
|
||||
|
||||
// beta and internal versions are the same as stable
|
||||
buildPreset.beta = buildPreset.stable;
|
||||
buildPreset.internal = buildPreset.stable;
|
||||
|
||||
const currentBuild = buildFlags.channel;
|
||||
|
||||
if (!(currentBuild in buildPreset)) {
|
||||
throw new Error(`BUILD_TYPE ${currentBuild} is not supported`);
|
||||
}
|
||||
|
||||
const currentBuildPreset = buildPreset[currentBuild];
|
||||
|
||||
const environmentPreset = {
|
||||
enablePlugin: process.env.ENABLE_PLUGIN
|
||||
? process.env.ENABLE_PLUGIN === 'true'
|
||||
: currentBuildPreset.enablePlugin,
|
||||
enableTestProperties: process.env.ENABLE_TEST_PROPERTIES
|
||||
? process.env.ENABLE_TEST_PROPERTIES === 'true'
|
||||
: currentBuildPreset.enableTestProperties,
|
||||
enableBroadcastChannelProvider: process.env.ENABLE_BC_PROVIDER
|
||||
? process.env.ENABLE_BC_PROVIDER !== 'false'
|
||||
: currentBuildPreset.enableBroadcastChannelProvider,
|
||||
changelogUrl: process.env.CHANGELOG_URL ?? currentBuildPreset.changelogUrl,
|
||||
enablePreloading: process.env.ENABLE_PRELOADING
|
||||
? process.env.ENABLE_PRELOADING === 'true'
|
||||
: currentBuildPreset.enablePreloading,
|
||||
enableNewSettingModal: process.env.ENABLE_NEW_SETTING_MODAL
|
||||
? process.env.ENABLE_NEW_SETTING_MODAL === 'true'
|
||||
: currentBuildPreset.enableNewSettingModal,
|
||||
enableSQLiteProvider: process.env.ENABLE_SQLITE_PROVIDER
|
||||
? process.env.ENABLE_SQLITE_PROVIDER === 'true'
|
||||
: currentBuildPreset.enableSQLiteProvider,
|
||||
enableNewSettingUnstableApi: process.env.ENABLE_NEW_SETTING_UNSTABLE_API
|
||||
? process.env.ENABLE_NEW_SETTING_UNSTABLE_API === 'true'
|
||||
: currentBuildPreset.enableNewSettingUnstableApi,
|
||||
enableNotificationCenter: process.env.ENABLE_NOTIFICATION_CENTER
|
||||
? process.env.ENABLE_NOTIFICATION_CENTER === 'true'
|
||||
: currentBuildPreset.enableNotificationCenter,
|
||||
enableCloud: process.env.ENABLE_CLOUD
|
||||
? process.env.ENABLE_CLOUD === 'true'
|
||||
: currentBuildPreset.enableCloud,
|
||||
enableMoveDatabase: process.env.ENABLE_MOVE_DATABASE
|
||||
? process.env.ENABLE_MOVE_DATABASE === 'true'
|
||||
: currentBuildPreset.enableMoveDatabase,
|
||||
};
|
||||
|
||||
return {
|
||||
...currentBuildPreset,
|
||||
// environment preset will overwrite current build preset
|
||||
// this environment variable is for debug proposes only
|
||||
// do not put them into CI
|
||||
...(process.env.CI ? {} : environmentPreset),
|
||||
};
|
||||
}
|
||||
45
apps/core/.webpack/template.html
Normal file
@@ -0,0 +1,45 @@
|
||||
<!doctype html>
|
||||
<html lang="en">
|
||||
<head>
|
||||
<meta charset="utf-8" />
|
||||
<meta
|
||||
name="viewport"
|
||||
content="width=device-width, initial-scale=1, maximum-scale=1"
|
||||
/>
|
||||
<title>AFFiNE</title>
|
||||
<meta name="theme-color" content="#fafafa" />
|
||||
<link rel="manifest" href="/manifest.json" />
|
||||
<link rel="apple-touch-icon" sizes="180x180" href="/apple-touch-icon.png" />
|
||||
<link rel="icon" sizes="192x192" href="/chrome-192x192.png" />
|
||||
<meta name="emotion-insertion-point" content="" />
|
||||
<meta property="description" content="{description}" />
|
||||
<meta name="twitter:card" content="summary_large_image" />
|
||||
<meta name="twitter:url" content="https://app.affine.pro/" />
|
||||
<meta
|
||||
name="twitter:title"
|
||||
content="AFFiNE:There can be more than Notion and Miro."
|
||||
/>
|
||||
<meta name="twitter:description" content="{description}" />
|
||||
<meta name="twitter:site" content="@AffineOfficial" />
|
||||
<meta name="twitter:image" content="https://affine.pro/og.jpeg" />
|
||||
<meta
|
||||
property="og:title"
|
||||
content="AFFiNE:There can be more than Notion and Miro."
|
||||
/>
|
||||
<meta property="og:type" content="website" />
|
||||
<meta
|
||||
property="og:description"
|
||||
content="There can be more than Notion and Miro. AFFiNE is a next-gen knowledge base that brings planning, sorting and creating all together."
|
||||
/>
|
||||
<meta property="og:url" content="https://app.affine.pro/" />
|
||||
<meta property="og:image" content="https://affine.pro/og.jpeg" />
|
||||
<link
|
||||
data-react-helmet="true"
|
||||
rel="shortcut icon"
|
||||
href="https://affine.pro/favicon.ico"
|
||||
/>
|
||||
</head>
|
||||
<body>
|
||||
<div id="app"></div>
|
||||
</body>
|
||||
</html>
|
||||
18
apps/core/.webpack/utils.ts
Normal file
@@ -0,0 +1,18 @@
|
||||
import { createHash } from 'node:crypto';
|
||||
import type { BuildFlags } from '@affine/cli/config';
|
||||
|
||||
export function hash(content: string): string {
|
||||
const hash = createHash('sha512');
|
||||
hash.update(content);
|
||||
const pkgHash = hash.digest('hex');
|
||||
return pkgHash.substring(0, 8);
|
||||
}
|
||||
|
||||
export function computeCacheKey(buildFlags: BuildFlags) {
|
||||
return [
|
||||
'1',
|
||||
'node' + process.version,
|
||||
buildFlags.mode,
|
||||
buildFlags.distribution,
|
||||
].join('-');
|
||||
}
|
||||
23
apps/core/.webpack/webpack.config.ts
Normal file
@@ -0,0 +1,23 @@
|
||||
import { createConfiguration, rootPath } from './config.js';
|
||||
import { merge } from 'webpack-merge';
|
||||
import { resolve } from 'node:path';
|
||||
import type { BuildFlags } from '@affine/cli/config';
|
||||
import { getRuntimeConfig } from './runtime-config.js';
|
||||
|
||||
export default async function (cli_env: any, _: any) {
|
||||
const flags: BuildFlags = JSON.parse(
|
||||
Buffer.from(cli_env.flags, 'hex').toString('utf-8')
|
||||
);
|
||||
console.log('build flags', flags);
|
||||
const runtimeConfig = getRuntimeConfig(flags);
|
||||
console.log('runtime config', runtimeConfig);
|
||||
const config = createConfiguration(flags, runtimeConfig);
|
||||
return merge(config, {
|
||||
entry: {
|
||||
index: {
|
||||
asyncChunks: true,
|
||||
import: resolve(rootPath, 'src/index.tsx'),
|
||||
},
|
||||
},
|
||||
});
|
||||
}
|
||||
80
apps/core/package.json
Normal file
@@ -0,0 +1,80 @@
|
||||
{
|
||||
"name": "@affine/core",
|
||||
"type": "module",
|
||||
"private": true,
|
||||
"version": "0.7.0-canary.47",
|
||||
"scripts": {
|
||||
"build": "yarn -T run build-core",
|
||||
"dev": "yarn -T run dev-core",
|
||||
"static-server": "ts-node-esm ./server.mts"
|
||||
},
|
||||
"dependencies": {
|
||||
"@affine-test/fixtures": "workspace:*",
|
||||
"@affine/component": "workspace:*",
|
||||
"@affine/debug": "workspace:*",
|
||||
"@affine/env": "workspace:*",
|
||||
"@affine/graphql": "workspace:*",
|
||||
"@affine/i18n": "workspace:*",
|
||||
"@affine/jotai": "workspace:*",
|
||||
"@affine/templates": "workspace:*",
|
||||
"@affine/workspace": "workspace:*",
|
||||
"@blocksuite/block-std": "0.0.0-20230717055529-79180930-nightly",
|
||||
"@blocksuite/blocks": "0.0.0-20230717055529-79180930-nightly",
|
||||
"@blocksuite/editor": "0.0.0-20230717055529-79180930-nightly",
|
||||
"@blocksuite/global": "0.0.0-20230717055529-79180930-nightly",
|
||||
"@blocksuite/icons": "^2.1.25",
|
||||
"@blocksuite/lit": "0.0.0-20230717055529-79180930-nightly",
|
||||
"@blocksuite/store": "0.0.0-20230717055529-79180930-nightly",
|
||||
"@dnd-kit/core": "^6.0.8",
|
||||
"@dnd-kit/sortable": "^7.0.2",
|
||||
"@emotion/cache": "^11.11.0",
|
||||
"@emotion/react": "^11.11.1",
|
||||
"@emotion/server": "^11.11.0",
|
||||
"@emotion/styled": "^11.11.0",
|
||||
"@mui/material": "^5.13.6",
|
||||
"@react-hookz/web": "^23.1.0",
|
||||
"async-call-rpc": "^6.3.1",
|
||||
"cmdk": "^0.2.0",
|
||||
"css-spring": "^4.1.0",
|
||||
"cssnano": "^6.0.1",
|
||||
"graphql": "^16.7.1",
|
||||
"jotai": "^2.2.2",
|
||||
"jotai-devtools": "^0.6.0",
|
||||
"lit": "^2.7.5",
|
||||
"lottie-web": "^5.12.2",
|
||||
"mini-css-extract-plugin": "^2.7.6",
|
||||
"next-themes": "^0.2.1",
|
||||
"postcss-loader": "^7.3.3",
|
||||
"react": "18.2.0",
|
||||
"react-dom": "18.2.0",
|
||||
"react-is": "18.2.0",
|
||||
"react-resizable-panels": "^0.0.53",
|
||||
"react-router-dom": "^6.14.1",
|
||||
"rxjs": "^7.8.1",
|
||||
"swr": "^2.1.5",
|
||||
"y-protocols": "^1.0.5",
|
||||
"yjs": "^13.6.6",
|
||||
"zod": "^3.21.4"
|
||||
},
|
||||
"devDependencies": {
|
||||
"@perfsee/webpack": "^1.8.2",
|
||||
"@pmmmwh/react-refresh-webpack-plugin": "^0.5.10",
|
||||
"@sentry/webpack-plugin": "^2.4.0",
|
||||
"@svgr/webpack": "^8.0.1",
|
||||
"@swc/core": "^1.3.70",
|
||||
"@types/webpack-env": "^1.18.1",
|
||||
"copy-webpack-plugin": "^11.0.0",
|
||||
"css-loader": "^6.8.1",
|
||||
"express": "^4.18.2",
|
||||
"html-webpack-plugin": "^5.5.3",
|
||||
"raw-loader": "^4.0.2",
|
||||
"swc-loader": "^0.2.3",
|
||||
"swc-plugin-coverage-instrument": "^0.0.19",
|
||||
"thread-loader": "^4.0.2",
|
||||
"ts-node": "^10.9.1",
|
||||
"webpack": "^5.88.1",
|
||||
"webpack-cli": "^5.1.4",
|
||||
"webpack-dev-server": "^4.15.1",
|
||||
"webpack-merge": "^5.9.0"
|
||||
}
|
||||
}
|
||||
40
apps/core/project.json
Normal file
@@ -0,0 +1,40 @@
|
||||
{
|
||||
"name": "@affine/core",
|
||||
"$schema": "../../node_modules/nx/schemas/project-schema.json",
|
||||
"projectType": "application",
|
||||
"root": "apps/core",
|
||||
"sourceRoot": "apps/core/src",
|
||||
"targets": {
|
||||
"build": {
|
||||
"executor": "nx:run-script",
|
||||
"dependsOn": ["^build"],
|
||||
"inputs": [
|
||||
"{projectRoot}/**/*",
|
||||
"{workspaceRoot}/packages/component/src/**/*",
|
||||
"{workspaceRoot}/packages/debug/src/**/*",
|
||||
"{workspaceRoot}/packages/graphql/src/**/*",
|
||||
"{workspaceRoot}/packages/hooks/src/**/*",
|
||||
"{workspaceRoot}/packages/jotai/src/**/*",
|
||||
"{workspaceRoot}/packages/templates/src/**/*",
|
||||
"{workspaceRoot}/packages/workspace/src/**/*",
|
||||
{
|
||||
"env": "BUILD_TYPE"
|
||||
},
|
||||
{
|
||||
"env": "PERFSEE_TOKEN"
|
||||
}
|
||||
],
|
||||
"options": {
|
||||
"script": "build"
|
||||
},
|
||||
"outputs": ["{projectRoot}/dist"]
|
||||
},
|
||||
"dev": {
|
||||
"executor": "nx:run-script",
|
||||
"options": {
|
||||
"script": "dev"
|
||||
},
|
||||
"outputs": ["{projectRoot}/dist"]
|
||||
}
|
||||
}
|
||||
}
|
||||
2
apps/core/public/.gitignore
vendored
Normal file
@@ -0,0 +1,2 @@
|
||||
*.js
|
||||
*.map
|
||||
BIN
apps/core/public/apple-touch-icon.png
Normal file
|
After Width: | Height: | Size: 7.5 KiB |
BIN
apps/core/public/editingVideo.mp4
Normal file
BIN
apps/core/public/favicon-144.png
Normal file
|
After Width: | Height: | Size: 6.0 KiB |
BIN
apps/core/public/favicon-192.png
Normal file
|
After Width: | Height: | Size: 8.5 KiB |
BIN
apps/core/public/favicon-36.png
Normal file
|
After Width: | Height: | Size: 1.3 KiB |
BIN
apps/core/public/favicon-48.png
Normal file
|
After Width: | Height: | Size: 1.8 KiB |
BIN
apps/core/public/favicon-72.png
Normal file
|
After Width: | Height: | Size: 2.8 KiB |
BIN
apps/core/public/favicon-96.png
Normal file
|
After Width: | Height: | Size: 3.8 KiB |
BIN
apps/core/public/favicon.ico
Normal file
|
After Width: | Height: | Size: 5.4 KiB |
BIN
apps/core/public/fonts/inter/Inter-VariableFont_slnt,wght.ttf
Normal file
93
apps/core/public/fonts/inter/OFL.txt
Normal file
@@ -0,0 +1,93 @@
|
||||
Copyright 2020 The Inter Project Authors (https://github.com/rsms/inter)
|
||||
|
||||
This Font Software is licensed under the SIL Open Font License, Version 1.1.
|
||||
This license is copied below, and is also available with a FAQ at:
|
||||
http://scripts.sil.org/OFL
|
||||
|
||||
|
||||
-----------------------------------------------------------
|
||||
SIL OPEN FONT LICENSE Version 1.1 - 26 February 2007
|
||||
-----------------------------------------------------------
|
||||
|
||||
PREAMBLE
|
||||
The goals of the Open Font License (OFL) are to stimulate worldwide
|
||||
development of collaborative font projects, to support the font creation
|
||||
efforts of academic and linguistic communities, and to provide a free and
|
||||
open framework in which fonts may be shared and improved in partnership
|
||||
with others.
|
||||
|
||||
The OFL allows the licensed fonts to be used, studied, modified and
|
||||
redistributed freely as long as they are not sold by themselves. The
|
||||
fonts, including any derivative works, can be bundled, embedded,
|
||||
redistributed and/or sold with any software provided that any reserved
|
||||
names are not used by derivative works. The fonts and derivatives,
|
||||
however, cannot be released under any other type of license. The
|
||||
requirement for fonts to remain under this license does not apply
|
||||
to any document created using the fonts or their derivatives.
|
||||
|
||||
DEFINITIONS
|
||||
"Font Software" refers to the set of files released by the Copyright
|
||||
Holder(s) under this license and clearly marked as such. This may
|
||||
include source files, build scripts and documentation.
|
||||
|
||||
"Reserved Font Name" refers to any names specified as such after the
|
||||
copyright statement(s).
|
||||
|
||||
"Original Version" refers to the collection of Font Software components as
|
||||
distributed by the Copyright Holder(s).
|
||||
|
||||
"Modified Version" refers to any derivative made by adding to, deleting,
|
||||
or substituting -- in part or in whole -- any of the components of the
|
||||
Original Version, by changing formats or by porting the Font Software to a
|
||||
new environment.
|
||||
|
||||
"Author" refers to any designer, engineer, programmer, technical
|
||||
writer or other person who contributed to the Font Software.
|
||||
|
||||
PERMISSION & CONDITIONS
|
||||
Permission is hereby granted, free of charge, to any person obtaining
|
||||
a copy of the Font Software, to use, study, copy, merge, embed, modify,
|
||||
redistribute, and sell modified and unmodified copies of the Font
|
||||
Software, subject to the following conditions:
|
||||
|
||||
1) Neither the Font Software nor any of its individual components,
|
||||
in Original or Modified Versions, may be sold by itself.
|
||||
|
||||
2) Original or Modified Versions of the Font Software may be bundled,
|
||||
redistributed and/or sold with any software, provided that each copy
|
||||
contains the above copyright notice and this license. These can be
|
||||
included either as stand-alone text files, human-readable headers or
|
||||
in the appropriate machine-readable metadata fields within text or
|
||||
binary files as long as those fields can be easily viewed by the user.
|
||||
|
||||
3) No Modified Version of the Font Software may use the Reserved Font
|
||||
Name(s) unless explicit written permission is granted by the corresponding
|
||||
Copyright Holder. This restriction only applies to the primary font name as
|
||||
presented to the users.
|
||||
|
||||
4) The name(s) of the Copyright Holder(s) or the Author(s) of the Font
|
||||
Software shall not be used to promote, endorse or advertise any
|
||||
Modified Version, except to acknowledge the contribution(s) of the
|
||||
Copyright Holder(s) and the Author(s) or with their explicit written
|
||||
permission.
|
||||
|
||||
5) The Font Software, modified or unmodified, in part or in whole,
|
||||
must be distributed entirely under this license, and must not be
|
||||
distributed under any other license. The requirement for fonts to
|
||||
remain under this license does not apply to any document created
|
||||
using the Font Software.
|
||||
|
||||
TERMINATION
|
||||
This license becomes null and void if any of the above conditions are
|
||||
not met.
|
||||
|
||||
DISCLAIMER
|
||||
THE FONT SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND,
|
||||
EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO ANY WARRANTIES OF
|
||||
MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT
|
||||
OF COPYRIGHT, PATENT, TRADEMARK, OR OTHER RIGHT. IN NO EVENT SHALL THE
|
||||
COPYRIGHT HOLDER BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY,
|
||||
INCLUDING ANY GENERAL, SPECIAL, INDIRECT, INCIDENTAL, OR CONSEQUENTIAL
|
||||
DAMAGES, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING
|
||||
FROM, OUT OF THE USE OR INABILITY TO USE THE FONT SOFTWARE OR FROM
|
||||
OTHER DEALINGS IN THE FONT SOFTWARE.
|
||||
BIN
apps/core/public/fonts/kalam/Kalam-Bold.ttf
Normal file
BIN
apps/core/public/fonts/kalam/Kalam-Light.ttf
Normal file
BIN
apps/core/public/fonts/kalam/Kalam-Regular.ttf
Normal file
93
apps/core/public/fonts/kalam/OFL.txt
Normal file
@@ -0,0 +1,93 @@
|
||||
Copyright (c) 2014, Indian Type Foundry (info@indiantypefoundry.com).
|
||||
|
||||
This Font Software is licensed under the SIL Open Font License, Version 1.1.
|
||||
This license is copied below, and is also available with a FAQ at:
|
||||
http://scripts.sil.org/OFL
|
||||
|
||||
|
||||
-----------------------------------------------------------
|
||||
SIL OPEN FONT LICENSE Version 1.1 - 26 February 2007
|
||||
-----------------------------------------------------------
|
||||
|
||||
PREAMBLE
|
||||
The goals of the Open Font License (OFL) are to stimulate worldwide
|
||||
development of collaborative font projects, to support the font creation
|
||||
efforts of academic and linguistic communities, and to provide a free and
|
||||
open framework in which fonts may be shared and improved in partnership
|
||||
with others.
|
||||
|
||||
The OFL allows the licensed fonts to be used, studied, modified and
|
||||
redistributed freely as long as they are not sold by themselves. The
|
||||
fonts, including any derivative works, can be bundled, embedded,
|
||||
redistributed and/or sold with any software provided that any reserved
|
||||
names are not used by derivative works. The fonts and derivatives,
|
||||
however, cannot be released under any other type of license. The
|
||||
requirement for fonts to remain under this license does not apply
|
||||
to any document created using the fonts or their derivatives.
|
||||
|
||||
DEFINITIONS
|
||||
"Font Software" refers to the set of files released by the Copyright
|
||||
Holder(s) under this license and clearly marked as such. This may
|
||||
include source files, build scripts and documentation.
|
||||
|
||||
"Reserved Font Name" refers to any names specified as such after the
|
||||
copyright statement(s).
|
||||
|
||||
"Original Version" refers to the collection of Font Software components as
|
||||
distributed by the Copyright Holder(s).
|
||||
|
||||
"Modified Version" refers to any derivative made by adding to, deleting,
|
||||
or substituting -- in part or in whole -- any of the components of the
|
||||
Original Version, by changing formats or by porting the Font Software to a
|
||||
new environment.
|
||||
|
||||
"Author" refers to any designer, engineer, programmer, technical
|
||||
writer or other person who contributed to the Font Software.
|
||||
|
||||
PERMISSION & CONDITIONS
|
||||
Permission is hereby granted, free of charge, to any person obtaining
|
||||
a copy of the Font Software, to use, study, copy, merge, embed, modify,
|
||||
redistribute, and sell modified and unmodified copies of the Font
|
||||
Software, subject to the following conditions:
|
||||
|
||||
1) Neither the Font Software nor any of its individual components,
|
||||
in Original or Modified Versions, may be sold by itself.
|
||||
|
||||
2) Original or Modified Versions of the Font Software may be bundled,
|
||||
redistributed and/or sold with any software, provided that each copy
|
||||
contains the above copyright notice and this license. These can be
|
||||
included either as stand-alone text files, human-readable headers or
|
||||
in the appropriate machine-readable metadata fields within text or
|
||||
binary files as long as those fields can be easily viewed by the user.
|
||||
|
||||
3) No Modified Version of the Font Software may use the Reserved Font
|
||||
Name(s) unless explicit written permission is granted by the corresponding
|
||||
Copyright Holder. This restriction only applies to the primary font name as
|
||||
presented to the users.
|
||||
|
||||
4) The name(s) of the Copyright Holder(s) or the Author(s) of the Font
|
||||
Software shall not be used to promote, endorse or advertise any
|
||||
Modified Version, except to acknowledge the contribution(s) of the
|
||||
Copyright Holder(s) and the Author(s) or with their explicit written
|
||||
permission.
|
||||
|
||||
5) The Font Software, modified or unmodified, in part or in whole,
|
||||
must be distributed entirely under this license, and must not be
|
||||
distributed under any other license. The requirement for fonts to
|
||||
remain under this license does not apply to any document created
|
||||
using the Font Software.
|
||||
|
||||
TERMINATION
|
||||
This license becomes null and void if any of the above conditions are
|
||||
not met.
|
||||
|
||||
DISCLAIMER
|
||||
THE FONT SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND,
|
||||
EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO ANY WARRANTIES OF
|
||||
MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT
|
||||
OF COPYRIGHT, PATENT, TRADEMARK, OR OTHER RIGHT. IN NO EVENT SHALL THE
|
||||
COPYRIGHT HOLDER BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY,
|
||||
INCLUDING ANY GENERAL, SPECIAL, INDIRECT, INCIDENTAL, OR CONSEQUENTIAL
|
||||
DAMAGES, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING
|
||||
FROM, OUT OF THE USE OR INABILITY TO USE THE FONT SOFTWARE OR FROM
|
||||
OTHER DEALINGS IN THE FONT SOFTWARE.
|
||||
93
apps/core/public/fonts/source-code-pro/OFL.txt
Normal file
@@ -0,0 +1,93 @@
|
||||
Copyright 2010, 2012 Adobe Systems Incorporated (http://www.adobe.com/), with Reserved Font Name 'Source'. All Rights Reserved. Source is a trademark of Adobe Systems Incorporated in the United States and/or other countries.
|
||||
|
||||
This Font Software is licensed under the SIL Open Font License, Version 1.1.
|
||||
This license is copied below, and is also available with a FAQ at:
|
||||
http://scripts.sil.org/OFL
|
||||
|
||||
|
||||
-----------------------------------------------------------
|
||||
SIL OPEN FONT LICENSE Version 1.1 - 26 February 2007
|
||||
-----------------------------------------------------------
|
||||
|
||||
PREAMBLE
|
||||
The goals of the Open Font License (OFL) are to stimulate worldwide
|
||||
development of collaborative font projects, to support the font creation
|
||||
efforts of academic and linguistic communities, and to provide a free and
|
||||
open framework in which fonts may be shared and improved in partnership
|
||||
with others.
|
||||
|
||||
The OFL allows the licensed fonts to be used, studied, modified and
|
||||
redistributed freely as long as they are not sold by themselves. The
|
||||
fonts, including any derivative works, can be bundled, embedded,
|
||||
redistributed and/or sold with any software provided that any reserved
|
||||
names are not used by derivative works. The fonts and derivatives,
|
||||
however, cannot be released under any other type of license. The
|
||||
requirement for fonts to remain under this license does not apply
|
||||
to any document created using the fonts or their derivatives.
|
||||
|
||||
DEFINITIONS
|
||||
"Font Software" refers to the set of files released by the Copyright
|
||||
Holder(s) under this license and clearly marked as such. This may
|
||||
include source files, build scripts and documentation.
|
||||
|
||||
"Reserved Font Name" refers to any names specified as such after the
|
||||
copyright statement(s).
|
||||
|
||||
"Original Version" refers to the collection of Font Software components as
|
||||
distributed by the Copyright Holder(s).
|
||||
|
||||
"Modified Version" refers to any derivative made by adding to, deleting,
|
||||
or substituting -- in part or in whole -- any of the components of the
|
||||
Original Version, by changing formats or by porting the Font Software to a
|
||||
new environment.
|
||||
|
||||
"Author" refers to any designer, engineer, programmer, technical
|
||||
writer or other person who contributed to the Font Software.
|
||||
|
||||
PERMISSION & CONDITIONS
|
||||
Permission is hereby granted, free of charge, to any person obtaining
|
||||
a copy of the Font Software, to use, study, copy, merge, embed, modify,
|
||||
redistribute, and sell modified and unmodified copies of the Font
|
||||
Software, subject to the following conditions:
|
||||
|
||||
1) Neither the Font Software nor any of its individual components,
|
||||
in Original or Modified Versions, may be sold by itself.
|
||||
|
||||
2) Original or Modified Versions of the Font Software may be bundled,
|
||||
redistributed and/or sold with any software, provided that each copy
|
||||
contains the above copyright notice and this license. These can be
|
||||
included either as stand-alone text files, human-readable headers or
|
||||
in the appropriate machine-readable metadata fields within text or
|
||||
binary files as long as those fields can be easily viewed by the user.
|
||||
|
||||
3) No Modified Version of the Font Software may use the Reserved Font
|
||||
Name(s) unless explicit written permission is granted by the corresponding
|
||||
Copyright Holder. This restriction only applies to the primary font name as
|
||||
presented to the users.
|
||||
|
||||
4) The name(s) of the Copyright Holder(s) or the Author(s) of the Font
|
||||
Software shall not be used to promote, endorse or advertise any
|
||||
Modified Version, except to acknowledge the contribution(s) of the
|
||||
Copyright Holder(s) and the Author(s) or with their explicit written
|
||||
permission.
|
||||
|
||||
5) The Font Software, modified or unmodified, in part or in whole,
|
||||
must be distributed entirely under this license, and must not be
|
||||
distributed under any other license. The requirement for fonts to
|
||||
remain under this license does not apply to any document created
|
||||
using the Font Software.
|
||||
|
||||
TERMINATION
|
||||
This license becomes null and void if any of the above conditions are
|
||||
not met.
|
||||
|
||||
DISCLAIMER
|
||||
THE FONT SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND,
|
||||
EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO ANY WARRANTIES OF
|
||||
MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT
|
||||
OF COPYRIGHT, PATENT, TRADEMARK, OR OTHER RIGHT. IN NO EVENT SHALL THE
|
||||
COPYRIGHT HOLDER BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY,
|
||||
INCLUDING ANY GENERAL, SPECIAL, INDIRECT, INCIDENTAL, OR CONSEQUENTIAL
|
||||
DAMAGES, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING
|
||||
FROM, OUT OF THE USE OR INABILITY TO USE THE FONT SOFTWARE OR FROM
|
||||
OTHER DEALINGS IN THE FONT SOFTWARE.
|
||||
91
apps/core/public/fonts/source-serif-4/OFL.txt
Normal file
@@ -0,0 +1,91 @@
|
||||
This Font Software is licensed under the SIL Open Font License, Version 1.1.
|
||||
This license is copied below, and is also available with a FAQ at:
|
||||
http://scripts.sil.org/OFL
|
||||
|
||||
|
||||
-----------------------------------------------------------
|
||||
SIL OPEN FONT LICENSE Version 1.1 - 26 February 2007
|
||||
-----------------------------------------------------------
|
||||
|
||||
PREAMBLE
|
||||
The goals of the Open Font License (OFL) are to stimulate worldwide
|
||||
development of collaborative font projects, to support the font creation
|
||||
efforts of academic and linguistic communities, and to provide a free and
|
||||
open framework in which fonts may be shared and improved in partnership
|
||||
with others.
|
||||
|
||||
The OFL allows the licensed fonts to be used, studied, modified and
|
||||
redistributed freely as long as they are not sold by themselves. The
|
||||
fonts, including any derivative works, can be bundled, embedded,
|
||||
redistributed and/or sold with any software provided that any reserved
|
||||
names are not used by derivative works. The fonts and derivatives,
|
||||
however, cannot be released under any other type of license. The
|
||||
requirement for fonts to remain under this license does not apply
|
||||
to any document created using the fonts or their derivatives.
|
||||
|
||||
DEFINITIONS
|
||||
"Font Software" refers to the set of files released by the Copyright
|
||||
Holder(s) under this license and clearly marked as such. This may
|
||||
include source files, build scripts and documentation.
|
||||
|
||||
"Reserved Font Name" refers to any names specified as such after the
|
||||
copyright statement(s).
|
||||
|
||||
"Original Version" refers to the collection of Font Software components as
|
||||
distributed by the Copyright Holder(s).
|
||||
|
||||
"Modified Version" refers to any derivative made by adding to, deleting,
|
||||
or substituting -- in part or in whole -- any of the components of the
|
||||
Original Version, by changing formats or by porting the Font Software to a
|
||||
new environment.
|
||||
|
||||
"Author" refers to any designer, engineer, programmer, technical
|
||||
writer or other person who contributed to the Font Software.
|
||||
|
||||
PERMISSION & CONDITIONS
|
||||
Permission is hereby granted, free of charge, to any person obtaining
|
||||
a copy of the Font Software, to use, study, copy, merge, embed, modify,
|
||||
redistribute, and sell modified and unmodified copies of the Font
|
||||
Software, subject to the following conditions:
|
||||
|
||||
1) Neither the Font Software nor any of its individual components,
|
||||
in Original or Modified Versions, may be sold by itself.
|
||||
|
||||
2) Original or Modified Versions of the Font Software may be bundled,
|
||||
redistributed and/or sold with any software, provided that each copy
|
||||
contains the above copyright notice and this license. These can be
|
||||
included either as stand-alone text files, human-readable headers or
|
||||
in the appropriate machine-readable metadata fields within text or
|
||||
binary files as long as those fields can be easily viewed by the user.
|
||||
|
||||
3) No Modified Version of the Font Software may use the Reserved Font
|
||||
Name(s) unless explicit written permission is granted by the corresponding
|
||||
Copyright Holder. This restriction only applies to the primary font name as
|
||||
presented to the users.
|
||||
|
||||
4) The name(s) of the Copyright Holder(s) or the Author(s) of the Font
|
||||
Software shall not be used to promote, endorse or advertise any
|
||||
Modified Version, except to acknowledge the contribution(s) of the
|
||||
Copyright Holder(s) and the Author(s) or with their explicit written
|
||||
permission.
|
||||
|
||||
5) The Font Software, modified or unmodified, in part or in whole,
|
||||
must be distributed entirely under this license, and must not be
|
||||
distributed under any other license. The requirement for fonts to
|
||||
remain under this license does not apply to any document created
|
||||
using the Font Software.
|
||||
|
||||
TERMINATION
|
||||
This license becomes null and void if any of the above conditions are
|
||||
not met.
|
||||
|
||||
DISCLAIMER
|
||||
THE FONT SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND,
|
||||
EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO ANY WARRANTIES OF
|
||||
MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT
|
||||
OF COPYRIGHT, PATENT, TRADEMARK, OR OTHER RIGHT. IN NO EVENT SHALL THE
|
||||
COPYRIGHT HOLDER BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY,
|
||||
INCLUDING ANY GENERAL, SPECIAL, INDIRECT, INCIDENTAL, OR CONSEQUENTIAL
|
||||
DAMAGES, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING
|
||||
FROM, OUT OF THE USE OR INABILITY TO USE THE FONT SOFTWARE OR FROM
|
||||
OTHER DEALINGS IN THE FONT SOFTWARE.
|
||||
BIN
apps/core/public/fonts/source-serif-4/SourceSerif4-Bold.ttf
Normal file
BIN
apps/core/public/fonts/source-serif-4/SourceSerif4-Italic.ttf
Normal file
BIN
apps/core/public/fonts/source-serif-4/SourceSerif4-Light.ttf
Normal file
BIN
apps/core/public/fonts/source-serif-4/SourceSerif4-Medium.ttf
Normal file
BIN
apps/core/public/fonts/source-serif-4/SourceSerif4-Regular.ttf
Normal file
BIN
apps/core/public/fonts/source-serif-4/SourceSerif4-SemiBold.ttf
Normal file
93
apps/core/public/fonts/space-mono/OFL.txt
Normal file
@@ -0,0 +1,93 @@
|
||||
Copyright 2016 Google Inc. All Rights Reserved.
|
||||
|
||||
This Font Software is licensed under the SIL Open Font License, Version 1.1.
|
||||
This license is copied below, and is also available with a FAQ at:
|
||||
http://scripts.sil.org/OFL
|
||||
|
||||
|
||||
-----------------------------------------------------------
|
||||
SIL OPEN FONT LICENSE Version 1.1 - 26 February 2007
|
||||
-----------------------------------------------------------
|
||||
|
||||
PREAMBLE
|
||||
The goals of the Open Font License (OFL) are to stimulate worldwide
|
||||
development of collaborative font projects, to support the font creation
|
||||
efforts of academic and linguistic communities, and to provide a free and
|
||||
open framework in which fonts may be shared and improved in partnership
|
||||
with others.
|
||||
|
||||
The OFL allows the licensed fonts to be used, studied, modified and
|
||||
redistributed freely as long as they are not sold by themselves. The
|
||||
fonts, including any derivative works, can be bundled, embedded,
|
||||
redistributed and/or sold with any software provided that any reserved
|
||||
names are not used by derivative works. The fonts and derivatives,
|
||||
however, cannot be released under any other type of license. The
|
||||
requirement for fonts to remain under this license does not apply
|
||||
to any document created using the fonts or their derivatives.
|
||||
|
||||
DEFINITIONS
|
||||
"Font Software" refers to the set of files released by the Copyright
|
||||
Holder(s) under this license and clearly marked as such. This may
|
||||
include source files, build scripts and documentation.
|
||||
|
||||
"Reserved Font Name" refers to any names specified as such after the
|
||||
copyright statement(s).
|
||||
|
||||
"Original Version" refers to the collection of Font Software components as
|
||||
distributed by the Copyright Holder(s).
|
||||
|
||||
"Modified Version" refers to any derivative made by adding to, deleting,
|
||||
or substituting -- in part or in whole -- any of the components of the
|
||||
Original Version, by changing formats or by porting the Font Software to a
|
||||
new environment.
|
||||
|
||||
"Author" refers to any designer, engineer, programmer, technical
|
||||
writer or other person who contributed to the Font Software.
|
||||
|
||||
PERMISSION & CONDITIONS
|
||||
Permission is hereby granted, free of charge, to any person obtaining
|
||||
a copy of the Font Software, to use, study, copy, merge, embed, modify,
|
||||
redistribute, and sell modified and unmodified copies of the Font
|
||||
Software, subject to the following conditions:
|
||||
|
||||
1) Neither the Font Software nor any of its individual components,
|
||||
in Original or Modified Versions, may be sold by itself.
|
||||
|
||||
2) Original or Modified Versions of the Font Software may be bundled,
|
||||
redistributed and/or sold with any software, provided that each copy
|
||||
contains the above copyright notice and this license. These can be
|
||||
included either as stand-alone text files, human-readable headers or
|
||||
in the appropriate machine-readable metadata fields within text or
|
||||
binary files as long as those fields can be easily viewed by the user.
|
||||
|
||||
3) No Modified Version of the Font Software may use the Reserved Font
|
||||
Name(s) unless explicit written permission is granted by the corresponding
|
||||
Copyright Holder. This restriction only applies to the primary font name as
|
||||
presented to the users.
|
||||
|
||||
4) The name(s) of the Copyright Holder(s) or the Author(s) of the Font
|
||||
Software shall not be used to promote, endorse or advertise any
|
||||
Modified Version, except to acknowledge the contribution(s) of the
|
||||
Copyright Holder(s) and the Author(s) or with their explicit written
|
||||
permission.
|
||||
|
||||
5) The Font Software, modified or unmodified, in part or in whole,
|
||||
must be distributed entirely under this license, and must not be
|
||||
distributed under any other license. The requirement for fonts to
|
||||
remain under this license does not apply to any document created
|
||||
using the Font Software.
|
||||
|
||||
TERMINATION
|
||||
This license becomes null and void if any of the above conditions are
|
||||
not met.
|
||||
|
||||
DISCLAIMER
|
||||
THE FONT SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND,
|
||||
EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO ANY WARRANTIES OF
|
||||
MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT
|
||||
OF COPYRIGHT, PATENT, TRADEMARK, OR OTHER RIGHT. IN NO EVENT SHALL THE
|
||||
COPYRIGHT HOLDER BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY,
|
||||
INCLUDING ANY GENERAL, SPECIAL, INDIRECT, INCIDENTAL, OR CONSEQUENTIAL
|
||||
DAMAGES, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING
|
||||
FROM, OUT OF THE USE OR INABILITY TO USE THE FONT SOFTWARE OR FROM
|
||||
OTHER DEALINGS IN THE FONT SOFTWARE.
|
||||
BIN
apps/core/public/fonts/space-mono/SpaceMono-Bold.ttf
Normal file
BIN
apps/core/public/fonts/space-mono/SpaceMono-BoldItalic.ttf
Normal file
BIN
apps/core/public/fonts/space-mono/SpaceMono-Italic.ttf
Normal file
BIN
apps/core/public/fonts/space-mono/SpaceMono-Regular.ttf
Normal file
BIN
apps/core/public/imgs/affine-text-logo.png
Normal file
|
After Width: | Height: | Size: 2.5 KiB |
123
apps/core/public/imgs/invite-error.svg
Normal file
@@ -0,0 +1,123 @@
|
||||
<svg width="360" height="270" viewBox="0 0 360 270" fill="none" xmlns="http://www.w3.org/2000/svg">
|
||||
<g clip-path="url(#clip0_10846_21602)">
|
||||
<path d="M292.787 230.795L287.378 203.916H265.671L260.263 230.795" fill="#FCF1D5"/>
|
||||
<path d="M293.22 230.676L287.812 203.796C287.773 203.604 287.565 203.465 287.379 203.465H265.672C265.486 203.465 265.278 203.604 265.239 203.796L259.831 230.676C259.717 231.242 260.583 231.485 260.697 230.915L266.105 204.036L265.672 204.367H287.379L286.945 204.036L292.354 230.915C292.468 231.484 293.334 231.243 293.22 230.676V230.676Z" fill="black"/>
|
||||
<path d="M348.75 109.628V198.98C348.75 202.859 345.614 206.008 341.751 206.008H211.299C207.435 206.008 204.299 202.859 204.299 198.98V109.628C204.299 105.749 207.435 102.601 211.299 102.601H341.751C345.614 102.601 348.75 105.749 348.75 109.628Z" fill="#FCF1D5"/>
|
||||
<path d="M341.751 206.459H211.3C207.192 206.459 203.851 203.104 203.851 198.98V109.628C203.85 105.505 207.191 102.15 211.3 102.15H341.752C345.859 102.15 349.201 105.505 349.201 109.628V198.98C349.2 203.104 345.858 206.459 341.751 206.459ZM211.3 103.052C207.687 103.052 204.748 106.003 204.748 109.628V198.98C204.748 202.607 207.687 205.557 211.299 205.557H341.751C345.363 205.557 348.301 202.606 348.301 198.98V109.628C348.301 106.002 345.362 103.052 341.751 103.052H211.3V103.052Z" fill="black"/>
|
||||
<path d="M299.152 240.749H253.897C253.481 240.749 253.081 240.583 252.787 240.287C252.493 239.992 252.327 239.591 252.327 239.173V232.417C252.327 231.547 253.03 230.841 253.897 230.841H299.151C300.018 230.841 300.721 231.547 300.721 232.417V239.173C300.721 239.38 300.68 239.585 300.601 239.776C300.523 239.967 300.407 240.141 300.261 240.287C300.116 240.434 299.943 240.55 299.752 240.629C299.562 240.708 299.358 240.749 299.152 240.749Z" fill="#FCF1D5"/>
|
||||
<path d="M299.152 241.2H253.897C253.362 241.199 252.849 240.985 252.47 240.605C252.092 240.225 251.879 239.71 251.878 239.172V232.416C251.879 231.879 252.092 231.364 252.471 230.984C252.849 230.604 253.362 230.39 253.897 230.389H299.152C299.687 230.39 300.201 230.604 300.579 230.984C300.958 231.364 301.171 231.879 301.171 232.416V239.172C301.171 239.71 300.958 240.225 300.579 240.605C300.201 240.985 299.688 241.199 299.152 241.2V241.2ZM253.897 231.291C253.279 231.291 252.777 231.797 252.777 232.416V239.172C252.777 239.793 253.28 240.298 253.897 240.298H299.152C299.77 240.298 300.273 239.793 300.273 239.172V232.416C300.273 231.796 299.77 231.291 299.152 231.291H253.897Z" fill="black"/>
|
||||
<path d="M341.391 114.881V192.989C341.391 196.38 338.574 199.132 335.104 199.132H217.945C214.475 199.132 211.659 196.38 211.659 192.989V114.881C211.659 111.49 214.475 108.738 217.945 108.738H335.103C338.574 108.738 341.391 111.49 341.391 114.881V114.881Z" fill="white"/>
|
||||
<path d="M337.664 145.944H216.363V123.615H337.664V145.944Z" fill="#F9C8B7"/>
|
||||
<path d="M337.663 145.493H216.363L216.812 145.944V123.615L216.363 124.066H337.663L337.214 123.615V145.944C337.214 146.524 338.112 146.526 338.112 145.944V123.615C338.112 123.372 337.907 123.164 337.663 123.164H216.363C216.12 123.164 215.914 123.371 215.914 123.615V145.944C215.914 146.187 216.119 146.395 216.363 146.395H337.663C338.241 146.395 338.243 145.493 337.663 145.493Z" fill="#F9C8B7"/>
|
||||
<path d="M253.539 183.086H222.177C221.945 183.086 221.714 183.04 221.499 182.95C221.284 182.861 221.089 182.73 220.925 182.565C220.76 182.4 220.63 182.204 220.541 181.988C220.452 181.772 220.406 181.541 220.406 181.308V161.53C220.406 161.297 220.452 161.065 220.541 160.85C220.63 160.634 220.76 160.438 220.925 160.273C221.089 160.107 221.284 159.976 221.499 159.887C221.714 159.798 221.945 159.752 222.177 159.752H253.539C253.771 159.752 254.002 159.798 254.217 159.887C254.431 159.976 254.627 160.107 254.791 160.273C254.956 160.438 255.086 160.634 255.175 160.85C255.264 161.065 255.31 161.297 255.31 161.53V181.308C255.31 181.541 255.264 181.772 255.175 181.988C255.086 182.204 254.956 182.4 254.791 182.565C254.627 182.73 254.431 182.861 254.217 182.95C254.002 183.04 253.771 183.086 253.539 183.086V183.086Z" fill="#F6A50C"/>
|
||||
<path d="M253.539 183.537H222.177C221.589 183.536 221.024 183.301 220.608 182.883C220.192 182.465 219.958 181.898 219.957 181.308V161.53C219.958 160.939 220.192 160.373 220.608 159.955C221.024 159.537 221.589 159.302 222.177 159.301H253.539C254.127 159.302 254.692 159.537 255.108 159.955C255.524 160.373 255.758 160.939 255.759 161.53V181.308C255.759 181.899 255.524 182.465 255.108 182.883C254.692 183.301 254.127 183.536 253.539 183.537V183.537ZM222.177 160.204C221.449 160.204 220.856 160.799 220.856 161.531V181.308C220.856 182.04 221.449 182.635 222.177 182.635H253.539C254.267 182.635 254.86 182.04 254.86 181.308V161.53C254.86 160.798 254.267 160.203 253.539 160.203H222.177V160.204ZM334.655 183.086H303.293C303.061 183.086 302.83 183.04 302.615 182.95C302.401 182.861 302.205 182.73 302.041 182.565C301.876 182.4 301.746 182.204 301.657 181.988C301.568 181.772 301.522 181.541 301.522 181.308V161.53C301.522 161.297 301.568 161.065 301.657 160.85C301.746 160.634 301.876 160.438 302.041 160.273C302.205 160.107 302.401 159.976 302.615 159.887C302.83 159.798 303.061 159.752 303.293 159.752H334.655C334.887 159.752 335.118 159.798 335.333 159.887C335.547 159.976 335.743 160.107 335.907 160.273C336.072 160.438 336.202 160.634 336.291 160.85C336.38 161.065 336.426 161.297 336.426 161.53V181.308C336.426 181.541 336.38 181.772 336.291 181.988C336.202 182.204 336.072 182.4 335.907 182.565C335.743 182.73 335.547 182.861 335.333 182.95C335.118 183.04 334.887 183.086 334.655 183.086V183.086Z" fill="#F6A50C"/>
|
||||
<path d="M334.655 183.537H303.294C302.705 183.536 302.141 183.301 301.725 182.883C301.309 182.465 301.074 181.899 301.074 181.308V161.53C301.074 160.939 301.309 160.373 301.725 159.955C302.141 159.537 302.705 159.302 303.294 159.301H334.655C335.244 159.302 335.808 159.537 336.225 159.955C336.641 160.373 336.875 160.939 336.876 161.53V181.308C336.875 181.899 336.641 182.465 336.225 182.883C335.808 183.301 335.244 183.536 334.655 183.537ZM303.293 160.204C302.564 160.204 301.971 160.8 301.971 161.531V181.309C301.971 182.04 302.564 182.636 303.293 182.636H334.654C335.383 182.636 335.976 182.04 335.976 181.309V161.53C335.976 160.799 335.383 160.203 334.654 160.203H303.293V160.204Z" fill="#F6A50C"/>
|
||||
<path d="M223.702 187.143H237.599C238.177 187.143 238.179 186.241 237.599 186.241H223.702C223.125 186.241 223.124 187.143 223.702 187.143ZM223.577 191.759H233.107C233.684 191.759 233.686 190.857 233.107 190.857H223.577C222.999 190.857 222.998 191.759 223.577 191.759V191.759ZM235.99 191.759H240.629C241.207 191.759 241.209 190.857 240.629 190.857H235.99C235.411 190.857 235.41 191.759 235.99 191.759ZM304.823 187.143H332.908C333.486 187.143 333.488 186.241 332.908 186.241H304.823C304.245 186.241 304.244 187.143 304.823 187.143V187.143ZM304.949 191.759H314.227C314.805 191.759 314.807 190.857 314.227 190.857H304.949C304.37 190.857 304.369 191.759 304.949 191.759ZM273.577 187.143H289.625C290.202 187.143 290.204 186.241 289.625 186.241H273.577C272.999 186.241 272.998 187.143 273.577 187.143ZM266.708 191.759H289.777C290.355 191.759 290.357 190.857 289.777 190.857H266.708C266.129 190.857 266.128 191.759 266.708 191.759ZM266.959 195.157H274.231C274.808 195.157 274.81 194.255 274.231 194.255H266.959C266.38 194.255 266.379 195.157 266.959 195.157Z" fill="black"/>
|
||||
</g>
|
||||
<g clip-path="url(#clip1_10846_21602)">
|
||||
<path d="M73.1029 240.3H350.116C350.694 240.3 350.696 239.85 350.116 239.85H73.1029C72.5239 239.85 72.523 240.3 73.1029 240.3ZM69.59 239.85H65.7004C65.1223 239.85 65.1205 240.3 65.7004 240.3H69.59C70.1681 240.3 70.169 239.85 69.59 239.85Z" fill="black"/>
|
||||
</g>
|
||||
<g clip-path="url(#clip2_10846_21602)">
|
||||
<path d="M214.826 102.214C217.088 97.0204 222.671 93.4646 228.331 93.6114C233.993 93.7582 239.382 97.5994 241.372 102.904L214.826 102.214Z" fill="#E34123"/>
|
||||
<path d="M215.217 102.443C216.967 98.4919 220.572 95.5288 224.752 94.4695C228.953 93.4048 233.432 94.552 236.758 97.2958C238.606 98.8199 240.079 100.782 240.936 103.024L241.373 102.451L232.385 102.217L218.119 101.846L214.825 101.761C214.242 101.746 214.243 102.652 214.825 102.667L223.813 102.901L238.079 103.272L241.373 103.357C241.645 103.364 241.914 103.058 241.809 102.783C240.174 98.5055 236.531 95.1663 232.169 93.8008C227.775 92.4253 222.944 93.3695 219.252 96.0825C217.175 97.6084 215.483 99.6219 214.435 101.986C214.2 102.513 214.98 102.976 215.217 102.443V102.443ZM181.08 54.7549L220.14 48.1328L259.312 41.4917L281.297 37.7647C281.78 37.6831 282.05 37.0878 281.929 36.6501C281.789 36.139 281.299 35.9352 280.815 36.0176L241.755 42.6397L202.583 49.2809L180.598 53.0079C180.115 53.0894 179.845 53.6848 179.966 54.1224C180.106 54.6335 180.596 54.8374 181.08 54.7549V54.7549Z" fill="#E34123"/>
|
||||
<path d="M230.225 42.6805C230.519 42.9841 230.481 43.4679 230.481 44.0986V97.5404H225.731V44.6903C225.731 44.1122 225.554 43.3556 225.86 42.8228C226.217 42.2021 226.849 42.4132 227.486 42.4132C228.156 42.4132 228.837 42.2519 229.506 42.3652C229.856 42.4241 230.081 42.531 230.225 42.6805V42.6805Z" fill="#E34123"/>
|
||||
<path d="M229.905 43.0006C230.092 43.2308 230.029 43.6403 230.029 43.914L230.028 45.1119V97.5416L230.48 97.0885H225.731L226.184 97.5416V50.8741C226.184 48.7891 226.241 46.6941 226.182 44.6099C226.17 44.2012 226.082 43.7699 226.157 43.364C226.266 42.7614 226.684 42.8275 227.169 42.8547C227.616 42.8792 228.052 42.8321 228.497 42.8013C228.919 42.7704 229.56 42.6907 229.905 43.0006C230.337 43.3893 230.98 42.7505 230.546 42.36C229.99 41.8598 229.205 41.8435 228.497 41.8942C228.08 41.9241 227.667 41.973 227.248 41.9522C226.89 41.935 226.526 41.8924 226.178 42.0038C225.511 42.2195 225.256 42.9181 225.23 43.5615C225.194 44.464 225.278 45.3901 225.278 46.2954V97.5407C225.278 97.7853 225.486 97.9937 225.731 97.9937H230.48C230.725 97.9937 230.933 97.7862 230.933 97.5407V44.3236C230.934 43.6286 231.008 42.929 230.546 42.36C230.178 41.9078 229.54 42.5521 229.905 43.0006V43.0006Z" fill="#E34123"/>
|
||||
<path d="M227.146 46.4219C226.107 45.0609 228.399 43.3601 229.363 44.8715C230.243 46.2516 228.105 47.6788 227.146 46.4219Z" fill="black"/>
|
||||
<path d="M227.536 46.1936C227.495 46.1395 227.458 46.0829 227.424 46.0242C227.408 45.9961 227.395 45.9671 227.38 45.9381C227.348 45.8746 227.398 45.977 227.399 45.9816C227.394 45.9607 227.381 45.9372 227.375 45.9172C227.356 45.8601 227.345 45.8031 227.332 45.7451C227.318 45.6771 227.341 45.7976 227.34 45.8012C227.342 45.794 227.336 45.7686 227.336 45.7587C227.335 45.7233 227.333 45.688 227.334 45.6526L227.34 45.5684C227.342 45.4959 227.315 45.6925 227.339 45.5856C227.351 45.5276 227.366 45.4704 227.385 45.4143C227.39 45.398 227.43 45.2956 227.397 45.3808C227.363 45.4642 227.408 45.36 227.419 45.34C227.447 45.2866 227.478 45.2358 227.513 45.186C227.521 45.1742 227.53 45.1633 227.537 45.1515C227.566 45.1071 227.47 45.2322 227.505 45.1923C227.524 45.1715 227.542 45.1479 227.561 45.1271C227.601 45.0818 227.644 45.0392 227.689 44.9984C227.71 44.9803 227.736 44.9631 227.754 44.9431C227.672 45.0356 227.706 44.9794 227.749 44.9495C227.802 44.9123 227.857 44.8788 227.913 44.848L227.989 44.8099C228.087 44.761 227.91 44.8362 227.978 44.8135C228.039 44.7936 228.098 44.771 228.159 44.7565L228.242 44.7392C228.254 44.7365 228.273 44.7374 228.283 44.732C228.282 44.7329 228.158 44.7438 228.225 44.7401C228.288 44.7374 228.35 44.732 228.412 44.7356C228.437 44.7365 228.47 44.7465 228.494 44.7429C228.492 44.7429 228.37 44.7202 228.436 44.7356L228.476 44.7438C228.535 44.7565 228.59 44.7773 228.647 44.7963C228.698 44.8126 228.551 44.7492 228.599 44.7764C228.611 44.7836 228.625 44.7891 228.638 44.7954C228.664 44.809 228.689 44.8235 228.714 44.8389L228.79 44.8897C228.835 44.9196 228.713 44.8235 228.753 44.8616L228.797 44.9005C228.849 44.9486 228.894 45.0011 228.941 45.0537C228.979 45.0963 228.887 44.9757 228.918 45.0247C228.927 45.0401 228.939 45.0537 228.949 45.0691C228.973 45.1035 228.994 45.1388 229.014 45.1751C229.031 45.2059 229.047 45.2385 229.063 45.2702C229.097 45.3364 229.05 45.2412 229.049 45.2331C229.051 45.2467 229.061 45.2666 229.067 45.2802C229.091 45.3491 229.098 45.4234 229.12 45.4922C229.119 45.4886 229.108 45.3699 229.113 45.4415L229.117 45.4877C229.118 45.5185 229.118 45.5484 229.118 45.5792C229.117 45.6091 229.111 45.6399 229.111 45.6689C229.11 45.5231 229.117 45.6291 229.105 45.6807C229.091 45.7387 229.071 45.794 229.053 45.8502C229.031 45.919 229.104 45.7433 229.054 45.8438C229.027 45.9007 228.994 45.9552 228.958 46.0069L228.933 46.0432C228.903 46.0885 228.998 45.9634 228.963 46.0051C228.918 46.0568 228.875 46.1075 228.826 46.1546L228.759 46.2154L228.724 46.2443C228.682 46.2797 228.807 46.1845 228.762 46.2154C228.708 46.2516 228.656 46.2887 228.599 46.3205C228.567 46.3395 228.533 46.3567 228.499 46.373C228.397 46.422 228.58 46.3449 228.493 46.3766C228.426 46.4016 228.357 46.4225 228.288 46.4392C228.252 46.4473 228.214 46.451 228.177 46.46C228.179 46.4591 228.302 46.4473 228.231 46.4519L228.176 46.4564C228.105 46.46 228.034 46.4482 227.965 46.451C227.966 46.451 228.089 46.4718 228.019 46.4582L227.965 46.4473C227.932 46.4401 227.899 46.4317 227.867 46.422C227.819 46.4075 227.729 46.3477 227.848 46.4192C227.815 46.3993 227.778 46.3857 227.745 46.3667C227.714 46.3485 227.684 46.3295 227.655 46.3096C227.639 46.2996 227.593 46.2661 227.652 46.3087C227.716 46.354 227.655 46.3096 227.641 46.2969C227.577 46.2388 227.518 46.1752 227.465 46.1066C227.319 45.919 226.976 45.9417 226.824 46.1066C226.641 46.306 226.669 46.547 226.824 46.7473C227.282 47.3344 228.096 47.5084 228.774 47.2339C229.457 46.9584 230.001 46.3422 230.022 45.5801C230.043 44.8262 229.475 44.0533 228.737 43.8775C228.082 43.7216 227.372 43.989 226.926 44.4819C226.651 44.7761 226.479 45.1511 226.435 45.5511C226.401 45.9457 226.514 46.3388 226.753 46.6548C226.894 46.8442 227.15 46.9602 227.372 46.817C227.561 46.6929 227.688 46.3966 227.536 46.1936V46.1936ZM175.659 52.9861L160.223 80.3354L144.788 107.685L136.126 123.032C135.839 123.54 136.622 123.998 136.908 123.49L152.343 96.1404L167.779 68.7902L176.441 53.4428C176.728 52.9353 175.946 52.4777 175.659 52.9861V52.9861ZM181.63 48.951L220.354 42.6279L258.966 36.3229L280.727 32.769C281.301 32.6757 281.058 31.8022 280.486 31.8955L241.762 38.2186L203.15 44.5236L181.389 48.0775C180.816 48.1708 181.059 49.0443 181.63 48.951V48.951ZM281.913 40.4033V113.306C281.913 113.889 282.818 113.891 282.818 113.306V40.4033C282.818 39.8207 281.913 39.8198 281.913 40.4033V40.4033Z" fill="black"/>
|
||||
<path d="M279.828 117.676C279.738 118.473 280.369 119.242 281.138 119.407C281.923 119.574 282.717 119.122 283.087 118.431C283.548 117.571 283.203 116.702 282.993 115.827C282.753 114.829 282.757 113.794 282.755 112.774C282.754 112.191 281.848 112.189 281.849 112.774C281.851 113.563 281.855 114.353 281.955 115.137C282.002 115.508 282.066 115.875 282.163 116.237C282.256 116.585 282.386 116.934 282.419 117.294C282.466 117.815 282.198 118.399 281.644 118.521C281.131 118.634 280.677 118.18 280.735 117.677C280.763 117.431 280.507 117.227 280.282 117.224C280.014 117.22 279.857 117.434 279.828 117.676V117.676Z" fill="black"/>
|
||||
<path d="M281.199 113.525L282.878 114.463C283.085 114.579 283.382 114.52 283.498 114.301C283.611 114.087 283.557 113.804 283.336 113.681L281.656 112.743C281.45 112.627 281.153 112.686 281.037 112.905C280.924 113.119 280.978 113.402 281.199 113.525ZM281.295 111.228L282.98 112.155C283.187 112.269 283.483 112.213 283.599 111.993C283.711 111.781 283.658 111.495 283.437 111.373L281.752 110.446C281.545 110.332 281.249 110.388 281.133 110.608C281.021 110.82 281.073 111.106 281.295 111.228ZM281.375 108.622L283.058 109.636C283.261 109.758 283.565 109.687 283.678 109.474C283.736 109.369 283.752 109.247 283.722 109.131C283.691 109.015 283.618 108.916 283.516 108.854L281.832 107.84C281.629 107.717 281.326 107.788 281.213 108.002C281.154 108.106 281.139 108.229 281.169 108.345C281.199 108.46 281.273 108.559 281.375 108.622V108.622Z" fill="black"/>
|
||||
<path d="M133.941 145.463C134.249 145.814 134.716 146.317 135.245 146.176C135.689 146.057 135.829 145.59 135.878 145.186C136.01 144.096 135.744 142.972 135.687 141.884C135.554 139.348 135.427 136.814 135.275 134.279C135.202 133.009 135.117 131.74 135.019 130.472C134.948 129.575 134.967 128.551 134.535 127.732C133.877 126.485 132.436 126.759 131.31 127.069C129.041 127.692 126.784 128.366 124.522 129.014C123.352 129.351 122.185 129.729 121.002 130.021C120.421 130.164 119.642 130.201 119.268 130.747C118.857 131.35 119.313 132.021 119.769 132.429C120.452 133.038 121.2 133.565 121.883 134.18C123.957 136.048 126.054 137.893 128.078 139.816C129.102 140.788 130.12 141.766 131.16 142.721C132.129 143.612 133.095 144.451 133.941 145.463C134.315 145.91 134.953 145.267 134.581 144.822C133.283 143.271 131.685 141.992 130.216 140.603C128.645 139.119 127.079 137.633 125.473 136.187C124.033 134.889 122.636 133.473 121.081 132.314C120.8 132.104 120.505 131.9 120.259 131.648C120.061 131.444 119.913 131.292 120.199 131.146C120.438 131.022 120.759 131 121.02 130.945C121.49 130.844 121.951 130.694 122.413 130.562C124.479 129.97 126.544 129.377 128.61 128.784C129.547 128.516 130.482 128.241 131.421 127.978C131.935 127.834 132.51 127.639 133.05 127.699C133.586 127.759 133.794 128.176 133.913 128.66C134.15 129.631 134.134 130.708 134.204 131.702C134.358 133.902 134.497 136.105 134.617 138.307C134.713 140.057 134.752 141.805 134.93 143.548C134.981 144.054 135.056 144.601 134.981 145.108C134.975 145.147 134.915 145.298 134.93 145.334C134.924 145.32 134.915 145.385 134.906 145.378C134.884 145.359 135.082 145.298 135.081 145.292C135.079 145.274 134.656 144.906 134.582 144.822C134.196 144.383 133.558 145.025 133.941 145.463V145.463Z" fill="#E34123"/>
|
||||
<path d="M133.762 124.28C134.333 123.421 135.713 123.221 136.483 123.962C136.697 124.167 136.862 124.426 136.953 124.709C137.026 124.928 137.055 125.16 137.039 125.39C137.037 125.422 137.015 125.612 137.03 125.513C137.002 125.708 136.951 125.899 136.877 126.082C136.919 125.978 136.865 126.101 136.851 126.128C136.832 126.167 136.81 126.206 136.788 126.243C136.766 126.281 136.742 126.316 136.718 126.352C136.654 126.449 136.746 126.33 136.684 126.398C136.628 126.459 136.574 126.521 136.514 126.577C136.484 126.604 136.452 126.629 136.421 126.656C136.376 126.696 136.492 126.607 136.441 126.64C136.42 126.654 136.4 126.669 136.38 126.684C136.313 126.728 136.244 126.769 136.172 126.805L136.064 126.857C136.163 126.811 136.059 126.857 136.017 126.871C135.908 126.909 135.795 126.939 135.681 126.96C135.661 126.964 135.641 126.967 135.622 126.971C135.519 126.994 135.726 126.964 135.621 126.972C135.457 126.987 135.293 126.99 135.129 126.982L135.006 126.971C134.944 126.967 135.086 126.986 134.973 126.966C134.805 126.939 134.64 126.896 134.48 126.837C134.466 126.832 134.339 126.783 134.406 126.81C134.465 126.833 134.343 126.781 134.321 126.77C134.248 126.735 134.177 126.696 134.108 126.654L134.007 126.59C133.988 126.577 133.881 126.498 133.932 126.538C133.989 126.581 133.885 126.499 133.874 126.489C133.845 126.463 133.816 126.437 133.788 126.409C133.728 126.351 133.674 126.289 133.62 126.226C133.69 126.307 133.622 126.228 133.596 126.189C133.572 126.153 133.549 126.116 133.528 126.079C133.503 126.037 133.484 125.992 133.461 125.95C133.428 125.892 133.486 126.031 133.45 125.924C133.42 125.833 133.395 125.744 133.375 125.651C133.37 125.631 133.368 125.611 133.365 125.591C133.354 125.536 133.368 125.69 133.367 125.605C133.367 125.552 133.36 125.5 133.36 125.447C133.36 125.403 133.361 125.361 133.365 125.317L133.37 125.251C133.375 125.141 133.348 125.347 133.372 125.238C133.394 125.132 133.415 125.027 133.448 124.924C133.467 124.863 133.49 124.803 133.513 124.743C133.48 124.827 133.538 124.69 133.549 124.666C133.611 124.532 133.682 124.403 133.762 124.28C134.076 123.786 133.292 123.331 132.981 123.822C132.454 124.649 132.232 125.706 132.773 126.584C133.239 127.339 134.084 127.76 134.943 127.868C135.782 127.973 136.707 127.731 137.283 127.086C138.17 126.097 138.137 124.544 137.313 123.529C136.195 122.151 133.935 122.386 132.981 123.822C132.657 124.31 133.441 124.764 133.762 124.28V124.28ZM117.522 131.413C123.591 136.68 129.499 142.133 135.451 147.531C136.153 148.168 137.329 148.276 138.013 147.531C138.649 146.837 138.762 145.648 138.013 144.968C132.06 139.57 126.153 134.117 120.084 128.85C119.368 128.23 118.216 128.094 117.522 128.85C116.897 129.531 116.758 130.75 117.522 131.413V131.413Z" fill="#E34123"/>
|
||||
<path d="M290.68 33.6996C291.366 36.1326 291.024 38.765 289.739 40.9416C289.442 41.4445 290.224 41.9012 290.52 41.3992C291.217 40.213 291.667 38.8987 291.844 37.5345C292.022 36.1704 291.923 34.7844 291.553 33.4595C291.395 32.8986 290.521 33.1369 290.68 33.6996V33.6996ZM294.188 36.351C294.449 37.5319 294.238 38.7677 293.6 39.7953C293.293 40.2928 294.077 40.7485 294.382 40.2529C295.139 39.0135 295.383 37.5274 295.061 36.1109C295.007 35.8726 294.733 35.7321 294.504 35.7946C294.26 35.8617 294.135 36.1118 294.188 36.351V36.351ZM179.875 65.7247C184.94 65.7582 189.825 62.951 192.348 58.5571C192.639 58.0505 191.857 57.5938 191.567 58.0994C189.199 62.2224 184.628 64.8493 179.875 64.8176C179.292 64.8149 179.291 65.721 179.875 65.7247ZM187.089 68.5817C189.256 67.9179 191.098 66.4695 192.255 64.5195C192.552 64.0157 191.77 63.5599 191.473 64.0619C190.439 65.8109 188.79 67.1111 186.848 67.7082C186.292 67.8768 186.528 68.7521 187.089 68.5817Z" fill="black"/>
|
||||
<path d="M275.864 32.1828C273.937 34.1056 273.592 37.356 274.924 39.731C278.381 45.8991 286.824 43.7289 287.486 37.0397C288.132 30.52 280.038 28.0163 275.864 32.1828V32.1828Z" fill="#E34123"/>
|
||||
<path d="M275.544 31.8631C272.936 34.5444 273.209 38.7824 275.616 41.4809C277.474 43.5641 280.437 44.3688 283.08 43.44C285.826 42.4749 287.63 39.974 287.932 37.1106C288.233 34.2544 286.767 31.5722 284.133 30.387C281.261 29.0939 277.802 29.6493 275.544 31.8631C275.126 32.2717 275.767 32.9124 276.184 32.5037C277.923 30.7992 280.483 30.1976 282.817 30.8627C285.104 31.5142 286.873 33.3954 287.052 35.8175C287.24 38.3565 286.012 40.8964 283.767 42.146C281.716 43.2878 279.151 43.1546 277.254 41.7609C274.354 39.6296 273.576 35.1877 276.185 32.5046C276.591 32.0851 275.95 31.4444 275.544 31.8631V31.8631ZM176.252 49.3934C174.326 51.3162 173.981 54.5666 175.312 56.9416C178.769 63.1097 187.213 60.9395 187.875 54.2503C188.521 47.7297 180.427 45.226 176.252 49.3934V49.3934Z" fill="#E34123"/>
|
||||
<path d="M175.932 49.0724C173.325 51.7537 173.597 55.9918 176.004 58.6903C177.863 60.7735 180.825 61.5781 183.468 60.6493C186.214 59.6843 188.018 57.1833 188.32 54.3199C188.622 51.4637 187.155 48.7815 184.522 47.5963C181.65 46.3032 178.191 46.8587 175.932 49.0724C175.514 49.4811 176.156 50.1217 176.572 49.7131C178.311 48.0086 180.872 47.4069 183.206 48.072C185.492 48.7235 187.261 50.6047 187.441 53.0268C187.628 55.5659 186.401 58.1058 184.156 59.3554C182.104 60.4971 179.539 60.3639 177.643 58.9703C174.743 56.839 173.964 52.3971 176.573 49.714C176.979 49.2953 176.34 48.6538 175.932 49.0724V49.0724Z" fill="#E34123"/>
|
||||
<path d="M278.984 37.8074C280.017 39.7302 283.109 38.7054 283.173 36.6647C283.241 34.5108 280.442 34.0197 279.224 35.4749C278.962 35.7986 278.8 36.1914 278.757 36.6056C278.715 37.0197 278.794 37.4373 278.984 37.8074Z" fill="black"/>
|
||||
<path d="M278.594 38.0358C279.697 40.0365 282.71 39.4158 283.472 37.454C283.857 36.4627 283.526 35.3055 282.673 34.6803C281.872 34.0922 280.755 34.0623 279.864 34.4483C278.488 35.0446 277.906 36.7028 278.594 38.0358C278.861 38.5541 279.644 38.0965 279.376 37.5782C279.268 37.3617 279.207 37.1248 279.198 36.8831C279.189 36.6414 279.231 36.4005 279.321 36.1764C279.408 35.9625 279.544 35.7758 279.71 35.6173C279.742 35.5874 279.774 35.5584 279.808 35.5294C279.877 35.4687 279.814 35.5194 279.87 35.4804C279.988 35.3986 280.112 35.3267 280.242 35.2657C280.308 35.2349 280.215 35.2711 280.311 35.2376C280.445 35.1901 280.582 35.1525 280.721 35.1252C280.743 35.1207 280.877 35.1035 280.789 35.1134C280.886 35.1026 280.984 35.0971 281.083 35.0971C281.397 35.098 281.721 35.1714 281.98 35.3128C282.056 35.3545 282.129 35.4007 282.199 35.4514C282.133 35.4034 282.227 35.4759 282.247 35.4931C282.316 35.5553 282.381 35.6222 282.441 35.6934C282.473 35.7332 282.436 35.687 282.431 35.6807C282.443 35.697 282.456 35.7133 282.467 35.7305C282.517 35.8076 282.563 35.8878 282.604 35.9707C282.614 35.9969 282.624 36.0241 282.633 36.0513C282.66 36.1354 282.682 36.221 282.699 36.3077C282.717 36.3965 282.706 36.3449 282.703 36.3241C282.708 36.3549 282.71 36.3866 282.712 36.4183C282.72 36.5234 282.72 36.6285 282.714 36.7336C282.712 36.7554 282.7 36.8614 282.705 36.8306C282.713 36.778 282.697 36.8686 282.694 36.8795L282.675 36.9656C282.513 37.6144 281.943 38.1055 281.298 38.2913C281.189 38.3229 281.078 38.3475 280.965 38.3647C281.048 38.3529 280.923 38.3674 280.896 38.3692C280.791 38.3762 280.686 38.3768 280.581 38.371C280.553 38.3692 280.405 38.3502 280.494 38.3647C280.344 38.3412 280.198 38.3008 280.057 38.2442C280.135 38.2768 279.999 38.2134 279.977 38.2007C279.91 38.1631 279.844 38.1219 279.781 38.0774C279.723 38.0358 279.828 38.1164 279.772 38.0702C279.604 37.938 279.468 37.7702 279.373 37.5791C279.094 37.068 278.312 37.5247 278.594 38.0358V38.0358ZM179.55 55.5733C180.843 56.8981 182.755 56.2094 183.28 54.5675C183.525 53.8009 183.377 52.8939 182.819 52.313C181.731 51.1794 179.554 51.9252 179.057 53.3052C178.924 53.6922 178.9 54.1083 178.987 54.5083C179.073 54.9082 179.268 55.2766 179.55 55.5733V55.5733Z" fill="black"/>
|
||||
<path d="M179.23 55.8939C180.016 56.6813 181.135 56.9432 182.163 56.4901C183.18 56.0425 183.84 54.9433 183.847 53.846C183.855 52.6879 183.119 51.567 181.94 51.355C180.952 51.1774 179.875 51.5471 179.186 52.2747C178.227 53.286 178.283 54.8926 179.23 55.8939C179.631 56.3179 180.271 55.6764 179.87 55.2532C179.283 54.6325 179.24 53.6566 179.723 53.0286C180.108 52.5266 180.845 52.195 181.504 52.2131C181.803 52.2213 182.134 52.3218 182.352 52.4958C182.677 52.755 182.871 53.151 182.927 53.5587C182.983 53.9674 182.9 54.4014 182.719 54.753C182.559 55.0751 182.316 55.3485 182.015 55.545C181.695 55.758 181.309 55.8513 180.927 55.8087C180.752 55.7821 180.582 55.7312 180.421 55.6574C180.217 55.5532 180.032 55.4164 179.872 55.2523C179.458 54.84 178.818 55.4807 179.23 55.8939V55.8939Z" fill="black"/>
|
||||
</g>
|
||||
<g clip-path="url(#clip3_10846_21602)">
|
||||
<path d="M289.246 125.16L285.596 121.04L283.834 119.052L282.953 118.058C282.74 117.816 282.581 117.581 282.276 117.489C282.04 117.418 281.903 117.436 281.712 117.617C281.369 117.943 281.044 118.295 280.711 118.633L278.775 120.598L274.969 124.46L270.563 128.932C270.217 129.283 270.742 129.838 271.088 129.488L282.304 118.104L281.943 118.205C282.198 118.283 282.24 118.4 282.428 118.613L283.31 119.607L285.135 121.667L288.722 125.715C289.049 126.085 289.573 125.529 289.246 125.16Z" fill="black"/>
|
||||
</g>
|
||||
<g clip-path="url(#clip4_10846_21602)">
|
||||
<path d="M318.498 174.753L244.594 190.336C244.363 190.384 244.125 190.387 243.893 190.345C243.661 190.303 243.44 190.216 243.243 190.089C243.045 189.962 242.874 189.798 242.741 189.606C242.607 189.414 242.513 189.197 242.464 188.969L232.223 141.455C232.174 141.227 232.171 140.991 232.213 140.762C232.256 140.533 232.344 140.314 232.473 140.118C232.601 139.923 232.767 139.754 232.961 139.622C233.155 139.49 233.374 139.397 233.604 139.348L307.509 123.766C307.974 123.668 308.46 123.756 308.86 124.012C309.259 124.268 309.539 124.671 309.639 125.131L319.879 172.647C319.929 172.875 319.932 173.111 319.889 173.34C319.846 173.569 319.758 173.788 319.63 173.983C319.502 174.179 319.336 174.348 319.141 174.48C318.947 174.612 318.729 174.705 318.498 174.753V174.753Z" fill="white"/>
|
||||
<path d="M317.772 172.148L312.481 173.263L299.202 176.063L281.821 179.728L264.226 183.438L250.335 186.367C248.209 186.816 246.054 187.197 243.943 187.715C243.606 187.798 244.658 187.695 244.139 187.672C244.184 187.674 244.835 187.828 244.429 187.695L244.811 187.863C244.724 187.821 244.64 187.772 244.561 187.717C244.596 187.722 245.1 188.149 244.792 187.85L245.046 188.163C244.945 187.974 244.948 187.992 245.055 188.218C245.246 188.555 245.112 188.357 245.092 188.226C245.051 187.966 244.98 187.706 244.925 187.448L244.012 183.212L240.688 167.785L237.002 150.688L234.913 140.996C234.897 140.918 234.885 140.836 234.862 140.759C234.8 140.553 234.892 141.516 234.917 141.006C234.882 141.729 234.825 141.489 234.893 141.293L234.724 141.671C234.767 141.584 234.816 141.502 234.871 141.424C234.806 141.688 234.505 141.875 234.737 141.652C234.37 141.915 234.308 141.975 234.551 141.832C234.148 141.983 234.05 142.031 234.254 141.974C234.391 141.965 234.544 141.91 234.678 141.881L237.385 141.31L248.975 138.867L265.625 135.356L283.538 131.58L298.779 128.366L307.463 126.535C307.693 126.486 307.927 126.446 308.156 126.389C308.332 126.345 308.465 126.395 307.814 126.431C308.345 126.402 307.266 126.292 307.603 126.39C307.944 126.489 306.973 126.044 307.42 126.309C307.787 126.526 307.237 126.17 307.212 126.149C307.611 126.485 306.873 125.612 307.13 126.07C307.085 125.99 306.947 125.448 307.007 125.858L307.012 125.883C307.151 126.746 307.383 127.604 307.568 128.458L310.529 142.198L314.305 159.719L316.946 171.973L317.195 173.13C317.211 173.202 317.222 173.279 317.243 173.349L317.246 173.365V173.367L317.187 172.95C317.18 173.243 317.2 173.149 317.246 172.671C317.17 172.987 317.158 172.619 317.379 172.434L317.31 172.56C317.154 172.791 317.209 172.723 317.472 172.354C317.358 172.488 317.066 172.623 317.682 172.201C317.242 172.501 318.303 172.012 317.772 172.148C316.388 172.501 315.414 174.099 315.864 175.472C316.326 176.883 317.742 177.738 319.224 177.359C321.166 176.863 322.63 175.1 322.649 173.097C322.653 172.672 322.576 172.245 322.492 171.828C322.425 171.498 322.35 171.169 322.279 170.84L321.268 166.148L317.793 150.023L314.117 132.968C313.506 130.131 312.98 127.259 312.279 124.443C312.133 123.861 311.872 123.315 311.511 122.834C311.15 122.353 310.696 121.947 310.176 121.64C309.122 121.022 307.946 120.938 306.768 121.162C306.592 121.195 306.417 121.235 306.243 121.272L303.232 121.907L290.94 124.499L273.719 128.131L255.689 131.933L240.836 135.064L233.191 136.676C232.72 136.776 232.32 136.895 231.862 137.134C229.903 138.154 229.193 140.248 229.616 142.306C229.827 143.327 230.055 144.344 230.276 145.363L233.394 159.833L237.195 177.468L239.656 188.883C239.711 189.142 239.76 189.404 239.823 189.662C240.109 190.785 240.817 191.758 241.803 192.383C242.87 193.067 244.113 193.171 245.333 192.939C245.898 192.832 246.459 192.702 247.021 192.583L257.414 190.392L273.77 186.943L291.964 183.108L308.008 179.725L317.87 177.645L319.224 177.359C320.624 177.064 321.568 175.368 321.132 174.036C320.655 172.575 319.272 171.832 317.772 172.148V172.148Z" fill="white"/>
|
||||
<path d="M318.498 174.753L244.594 190.335C244.363 190.384 244.125 190.387 243.893 190.345C243.661 190.303 243.44 190.216 243.243 190.089C243.045 189.962 242.874 189.798 242.741 189.606C242.607 189.413 242.513 189.197 242.464 188.969L232.223 141.455C232.174 141.227 232.171 140.991 232.213 140.762C232.256 140.533 232.344 140.314 232.473 140.118C232.601 139.923 232.767 139.754 232.961 139.622C233.155 139.49 233.374 139.396 233.604 139.348L307.509 123.766C307.739 123.717 307.977 123.714 308.209 123.756C308.441 123.798 308.662 123.885 308.86 124.012C309.058 124.139 309.228 124.303 309.362 124.495C309.496 124.688 309.59 124.904 309.639 125.132L319.879 172.647C319.929 172.875 319.932 173.111 319.889 173.34C319.846 173.569 319.758 173.788 319.63 173.983C319.502 174.179 319.336 174.347 319.141 174.48C318.947 174.612 318.729 174.705 318.498 174.753V174.753Z" fill="#E34123"/>
|
||||
<path d="M244.215 190.825C243.782 190.825 243.358 190.701 242.995 190.467C242.746 190.309 242.532 190.103 242.364 189.862C242.197 189.621 242.079 189.35 242.019 189.064L231.778 141.548C231.716 141.262 231.711 140.967 231.765 140.679C231.819 140.392 231.93 140.118 232.091 139.873C232.252 139.627 232.46 139.415 232.703 139.25C232.947 139.084 233.221 138.968 233.51 138.907L307.415 123.325C307.704 123.263 308.002 123.258 308.293 123.311C308.584 123.365 308.861 123.475 309.108 123.635C309.612 123.958 309.959 124.456 310.084 125.038L320.325 172.554C320.449 173.131 320.336 173.733 320.011 174.228C319.687 174.723 319.177 175.071 318.594 175.195L244.689 190.777C244.533 190.809 244.374 190.826 244.215 190.825V190.825ZM307.884 124.176C307.79 124.176 307.696 124.186 307.604 124.206L233.7 139.788C233.527 139.824 233.364 139.893 233.219 139.992C233.074 140.091 232.95 140.217 232.854 140.364C232.758 140.509 232.692 140.672 232.661 140.843C232.629 141.014 232.631 141.19 232.669 141.36L242.909 188.875C242.984 189.222 243.191 189.518 243.49 189.711C243.79 189.904 244.146 189.971 244.498 189.895L318.403 174.313C318.575 174.277 318.739 174.208 318.884 174.109C319.029 174.01 319.152 173.884 319.248 173.738C319.344 173.592 319.41 173.429 319.442 173.258C319.474 173.087 319.471 172.911 319.434 172.741L309.193 125.225C309.129 124.929 308.964 124.663 308.726 124.472C308.488 124.281 308.191 124.177 307.884 124.176V124.176Z" fill="#E34123"/>
|
||||
<path d="M295.295 166.419C294.895 167.824 294.039 168.491 292.928 168.662C289.222 169.202 282.629 164.285 280.161 162.844C278.659 165.113 274.989 172.652 271.374 173.85C270.299 174.201 269.234 173.994 268.232 172.913C267.294 171.895 265.4 170.859 265.2 169.644C265.027 168.617 266.129 166.96 266.575 166.095C267.813 163.681 269.398 161.475 270.791 159.151C271.073 158.683 271.356 158.223 271.647 157.764C270.317 156.935 268.997 156.089 267.686 155.224C266.174 154.233 263.634 153.369 262.368 152.279C260.884 151.009 261.94 149.946 262.832 148.451C263.634 147.109 264.435 144.695 266.074 144.281C267.285 143.984 269.125 145.019 270.154 145.533C272.576 146.758 274.67 148.505 277.019 149.865C278.458 147.631 279.515 145.182 281.09 143.029C281.773 142.11 282.938 140.363 284.159 140.093C285.807 139.724 287.628 141.516 288.957 142.353C290.433 143.29 291.862 143.758 291.125 145.56C290.487 147.1 288.621 149.009 287.728 150.568C286.981 151.882 286.207 153.197 285.424 154.494C285.861 154.756 286.289 155.017 286.717 155.287C289.021 156.737 291.443 157.998 293.656 159.601C294.448 160.169 296.188 161.15 296.506 162.141C296.879 163.312 295.668 165.086 295.295 166.419V166.419Z" fill="white"/>
|
||||
<path d="M294.855 166.299C293.813 169.714 289.607 167.803 287.449 166.713C284.984 165.466 282.762 163.85 280.39 162.455C280.172 162.326 279.9 162.414 279.767 162.616C277.67 165.808 276.109 169.436 273.266 172.091C272.648 172.668 271.93 173.232 271.098 173.461C269.657 173.859 268.872 172.81 267.897 171.98C267.175 171.366 265.766 170.559 265.64 169.526C265.519 168.533 266.375 167.409 266.828 166.582C268.434 163.645 270.251 160.822 272.039 157.991C272.173 157.779 272.079 157.502 271.876 157.375C269.867 156.121 267.941 154.737 265.802 153.707C264.912 153.278 264 152.866 263.174 152.32C262.788 152.064 262.341 151.75 262.16 151.311C261.984 150.885 262.16 150.458 262.366 150.076C262.794 149.282 263.316 148.55 263.725 147.744C264.123 146.96 264.506 146.124 265.096 145.461C265.724 144.754 266.428 144.557 267.346 144.801C268.255 145.043 269.091 145.498 269.923 145.922C272.342 147.157 274.45 148.887 276.789 150.254C276.894 150.312 277.017 150.328 277.133 150.297C277.249 150.267 277.349 150.194 277.412 150.093C278.693 148.084 279.686 145.909 281.012 143.928C281.525 143.161 282.074 142.388 282.689 141.698C283.294 141.019 284.01 140.346 284.996 140.532C285.959 140.714 286.808 141.374 287.579 141.935C288.308 142.464 289.059 142.927 289.822 143.405C290.612 143.9 291.083 144.415 290.711 145.366C290.359 146.266 289.707 147.066 289.127 147.83C288.459 148.708 287.775 149.571 287.226 150.529C286.507 151.783 285.775 153.029 285.029 154.267C284.97 154.371 284.954 154.493 284.985 154.608C285.015 154.723 285.089 154.822 285.192 154.883C288.047 156.594 290.918 158.285 293.667 160.159C294.485 160.716 296.06 161.47 296.117 162.59C296.149 163.216 295.838 163.876 295.597 164.439C295.338 165.054 295.046 165.658 294.855 166.299C294.689 166.857 295.568 167.095 295.733 166.539C296.122 165.23 297.102 163.934 297.028 162.523C296.96 161.246 295.676 160.424 294.713 159.773C291.76 157.776 288.712 155.939 285.653 154.106L285.816 154.722C286.562 153.484 287.294 152.237 288.013 150.984C288.577 149.999 289.283 149.116 289.968 148.213C290.984 146.873 292.746 144.69 291.052 143.185C290.333 142.545 289.414 142.148 288.633 141.59C287.761 140.967 286.915 140.279 285.909 139.874C284.993 139.505 284.023 139.487 283.18 140.041C282.343 140.593 281.721 141.413 281.132 142.206C279.392 144.551 278.188 147.187 276.624 149.639L277.247 149.478C274.908 148.11 272.8 146.381 270.381 145.145C268.777 144.327 266.622 143.049 264.943 144.363C264.192 144.95 263.702 145.812 263.269 146.64C262.801 147.534 262.304 148.413 261.778 149.275C261.303 150.059 260.92 150.967 261.404 151.843C261.9 152.738 262.962 153.292 263.842 153.749C264.955 154.328 266.127 154.804 267.2 155.454C268.626 156.318 270 157.271 271.414 158.154L271.251 157.538C269.475 160.35 267.658 163.151 266.07 166.073C265.533 167.062 264.8 168.126 264.729 169.281C264.657 170.451 265.669 171.308 266.493 171.992C266.977 172.394 267.464 172.784 267.908 173.232C268.419 173.748 269.003 174.199 269.727 174.372C270.76 174.619 271.801 174.272 272.666 173.714C274.5 172.528 275.845 170.634 277.034 168.852C278.287 166.972 279.313 164.957 280.552 163.071L279.929 163.233C281.929 164.408 283.816 165.758 285.848 166.885C287.848 167.993 290.339 169.348 292.719 169.136C294.276 168.998 295.292 167.982 295.732 166.539C295.903 165.983 295.024 165.745 294.855 166.299V166.299Z" fill="white"/>
|
||||
</g>
|
||||
<g clip-path="url(#clip5_10846_21602)">
|
||||
<path d="M89.0946 163.094L114.147 145.683L121.199 140.782C121.985 140.235 122.603 139.567 122.864 138.617C123.103 137.75 122.995 136.596 122.499 135.826C121.504 134.283 119.204 133.369 117.54 134.527L92.4878 151.937L85.4358 156.838C84.6493 157.385 84.0314 158.054 83.7704 159.004C83.5312 159.87 83.6391 161.025 84.1356 161.795C85.1314 163.338 87.4301 164.252 89.0946 163.094V163.094Z" fill="#1E7EC1"/>
|
||||
<path d="M110.224 154.506C113.979 159.117 117.076 164.253 119.461 169.699C123.082 177.983 125.058 186.892 125.28 195.93C125.483 204.362 123.93 213.667 117.042 219.506C113.579 222.442 109.221 223.813 104.711 223.816C97.1769 223.819 89.0412 220.037 89.1653 211.464C89.2505 205.637 94.1334 201.16 98.6293 197.449C88.1107 199.801 77.4824 202.166 66.7037 202.102C55.9249 202.039 44.8246 199.33 36.4705 192.522C25.5677 183.636 20.7682 167.943 24.8365 154.483C25.3827 152.683 26.0798 150.931 26.9205 149.248C43.9339 115.086 91.2149 131.166 110.224 154.506Z" fill="#1E7EC1"/>
|
||||
<path d="M109.904 154.825C115.7 161.965 119.907 170.338 122.349 179.194C123.596 183.705 124.381 188.33 124.694 192.999C124.956 196.933 124.926 200.92 124.255 204.814C123.624 208.472 122.42 212.063 120.332 215.158C118.075 218.504 114.824 221.112 110.974 222.381C107.469 223.538 103.609 223.66 100.013 222.853C97.0073 222.179 94.0489 220.806 92.0157 218.432C89.8031 215.849 89.0981 212.175 89.9843 208.913C91.0081 205.145 93.8967 202.171 96.7391 199.65C97.464 199.007 98.2042 198.384 98.9508 197.768C99.3232 197.46 98.9146 196.92 98.5105 197.01C88.9758 199.142 79.3632 201.292 69.5613 201.609C61.1719 201.881 52.5723 200.73 44.8951 197.196C41.2291 195.509 37.7896 193.289 34.8657 190.498C32.1955 187.95 29.9674 184.966 28.2269 181.715C24.7575 175.238 23.2489 167.706 24.077 160.398C24.8744 153.359 28.0665 146.604 32.7355 141.296C36.3321 137.201 40.9101 134.087 46.0404 132.244C51.128 130.422 56.5781 129.839 61.9565 130.126C67.6621 130.429 73.2979 131.696 78.6809 133.583C84.2044 135.519 89.4914 138.133 94.4177 141.291C99.1438 144.32 103.56 147.87 107.402 151.967C108.268 152.891 109.102 153.845 109.904 154.825C110.272 155.277 110.91 154.633 110.544 154.185C106.993 149.835 102.772 146.055 98.2178 142.779C93.3752 139.302 88.1454 136.399 82.6333 134.126C77.1868 131.877 71.4631 130.264 65.608 129.543C60.0665 128.861 54.3727 129.016 48.9471 130.407C43.6393 131.768 38.693 134.357 34.6419 138.057C29.6567 142.61 25.8783 148.808 24.126 155.321C22.1797 162.556 22.7034 170.373 25.2921 177.382C27.9279 184.521 32.6712 190.723 39.0128 194.957C46.0186 199.636 54.4316 201.852 62.7702 202.411C72.4788 203.063 82.182 201.444 91.6496 199.443C94.0197 198.937 96.3867 198.418 98.7506 197.884L98.3102 197.127C95.2142 199.686 92.0112 202.462 90.1356 206.084C88.4385 209.362 88.2038 213.29 89.7958 216.66C92.7623 222.941 100.986 224.883 107.32 224.109C111.554 223.592 115.481 221.778 118.517 218.767C121.282 216.024 123.153 212.522 124.258 208.81C125.369 205.073 125.756 201.138 125.751 197.25C125.744 192.477 125.207 187.694 124.216 183.025C122.22 173.625 118.286 164.602 112.598 156.843C111.935 155.94 111.25 155.054 110.544 154.185C110.176 153.732 109.539 154.377 109.904 154.825V154.825Z" fill="#1E7EC1"/>
|
||||
<path d="M86.9334 238.099L90.3965 239.691C91.0162 239.976 91.9196 239.917 92.2557 239.204C95.4908 232.35 98.1195 225.227 100.111 217.916C100.571 216.226 97.9486 215.505 97.4901 217.193C95.5703 224.281 93.0332 231.186 89.9081 237.832L91.7674 237.344L88.3043 235.752C87.6384 235.446 86.841 235.563 86.4451 236.24C86.1035 236.825 86.2638 237.79 86.9334 238.099V238.099ZM106.672 184.147L125.259 154.88L130.526 146.585C131.543 144.982 130.913 142.52 129.226 141.629C127.435 140.684 125.353 141.218 124.267 142.929L105.68 172.196L100.413 180.491C99.3956 182.094 100.026 184.556 101.713 185.447C103.504 186.392 105.586 185.858 106.672 184.147V184.147ZM110.88 217.81C109.136 220.901 107.467 224.168 108.013 227.82C108.239 229.325 108.905 230.8 109.97 231.898C111.222 233.189 112.98 233.803 114.749 233.88C116.928 233.974 119.002 233.176 120.949 232.288L118.904 231.115L119.302 234.657C119.385 235.386 119.868 236.015 120.661 236.015C121.333 236.015 122.103 235.39 122.02 234.657L121.622 231.115C121.501 230.043 120.572 229.487 119.577 229.942C117.944 230.687 116.106 231.384 114.278 231.128C112.729 230.912 111.623 230.006 111.061 228.712C110.472 227.352 110.492 225.823 110.851 224.407C111.326 222.535 112.286 220.852 113.228 219.183C114.088 217.656 111.74 216.285 110.88 217.81V217.81Z" fill="#1E7EC1"/>
|
||||
<path d="M75.9717 142.859C76.4926 145.422 75.766 148.197 74.6624 150.511C72.6708 154.688 68.038 157.677 63.3155 156.502C61.4273 156.032 59.5753 155.1 58.2252 153.677C51.8147 146.919 57.4215 133.818 66.9879 134.757C71.2863 135.18 75.1118 138.629 75.9717 142.859V142.859Z" fill="#FCF1D5"/>
|
||||
<path d="M75.5351 142.979C76.0525 145.69 75.2361 148.654 73.8887 151.015C72.7426 153.024 70.9521 154.697 68.8129 155.602C64.4601 157.443 59.1595 155.358 57.0185 151.197C53.9287 145.192 57.7134 136.448 64.5489 135.281C69.5523 134.426 74.4985 138.103 75.5351 142.979C75.6565 143.549 76.53 143.308 76.4086 142.738C75.3883 137.941 70.8652 134.216 65.9379 134.258C62.0635 134.29 58.6974 136.668 56.8074 139.959C54.959 143.178 54.4117 147.282 55.8315 150.766C57.6817 155.309 62.9016 158.139 67.7202 156.921C70.4456 156.233 72.8078 154.376 74.3264 152.038C76.0534 149.378 77.0093 145.884 76.4095 142.738C76.2998 142.167 75.4264 142.409 75.5351 142.979V142.979ZM81.7807 151.111C81.546 151.694 81.3086 152.329 81.4781 152.933C81.71 153.759 82.5916 154.194 83.3826 154.529C84.6176 155.053 85.9949 155.583 87.2625 155.146C88.2437 154.808 88.9614 153.931 89.3582 152.972C90.3549 150.561 89.3202 147.449 87.007 146.243C86.1154 145.778 85.1776 145.675 84.2851 146.175C83.5494 146.587 83.3709 147.355 83.0555 148.07C82.6142 149.077 82.1892 150.091 81.7807 151.111V151.111Z" fill="#FCF1D5"/>
|
||||
<path d="M81.3438 150.991C80.9551 151.966 80.743 153.014 81.4978 153.872C82.1293 154.592 83.1478 154.943 84.0176 155.273C85.0732 155.672 86.2765 155.963 87.3828 155.582C88.3124 155.262 89.0436 154.541 89.5139 153.69C90.3873 152.111 90.3765 150.171 89.6643 148.536C88.9566 146.913 87.3085 145.313 85.4184 145.395C84.2043 145.448 83.3698 146.151 82.914 147.232C82.3858 148.483 81.8512 149.731 81.3438 150.991C81.1263 151.532 82.0016 151.766 82.2172 151.232C82.6027 150.275 83.0008 149.324 83.4114 148.378C83.7005 147.713 83.8917 146.885 84.5875 146.527C86.1134 145.742 87.8077 147.081 88.5571 148.353C89.2565 149.539 89.4822 151.013 89.0989 152.342C88.8851 153.084 88.4755 153.807 87.8675 154.297C87.1436 154.88 86.2312 154.947 85.3513 154.744C84.4543 154.537 83.4975 154.175 82.7083 153.697C82.3649 153.489 82.0297 153.214 81.9146 152.814C81.7633 152.289 82.026 151.713 82.2172 151.233C82.4329 150.69 81.5567 150.455 81.3438 150.991V150.991Z" fill="#FCF1D5"/>
|
||||
<path d="M73.2852 148.33C73.2843 146.714 74.8246 145.601 76.4066 146.353C76.837 146.557 77.2357 146.951 77.2257 147.428C77.2166 147.859 76.8841 148.207 76.5579 148.491C75.8459 149.11 75.0637 149.643 74.2275 150.08C73.9899 149.939 73.7859 149.748 73.6293 149.521C73.4727 149.293 73.3673 149.035 73.3205 148.762C73.2973 148.62 73.2855 148.475 73.2852 148.33V148.33Z" fill="#E24122"/>
|
||||
<path d="M73.7382 148.33C73.7427 147.862 73.8994 147.41 74.2048 147.085C74.3497 146.927 74.5249 146.8 74.7201 146.71C74.9153 146.621 75.1265 146.572 75.341 146.566C75.7814 146.556 76.3966 146.718 76.6748 147.131C76.8025 147.32 76.8007 147.497 76.6702 147.709C76.5117 147.966 76.2516 148.163 76.0224 148.353C75.3963 148.867 74.7182 149.315 73.9991 149.689H74.4567C73.9665 149.391 73.7463 148.89 73.7382 148.33C73.73 147.748 72.8239 147.746 72.8321 148.33C72.8393 148.854 72.9635 149.367 73.2724 149.797C73.4238 150.007 73.5968 150.183 73.8034 150.338C73.8958 150.407 73.9946 150.485 74.1069 150.516C74.3072 150.571 74.4757 150.461 74.6433 150.37C75.1193 150.111 75.5773 149.819 76.0142 149.499C76.4229 149.199 76.8551 148.884 77.1939 148.504C77.5528 148.103 77.792 147.572 77.6225 147.032C77.4785 146.573 77.1088 146.204 76.6865 145.987C75.8983 145.581 74.9532 145.543 74.1676 145.975C73.315 146.444 72.8421 147.376 72.8321 148.33C72.8257 148.914 73.7318 148.914 73.7382 148.33V148.33Z" fill="#E24122"/>
|
||||
<path d="M83.7654 141.954C87.5836 145.876 80.5797 152.772 76.7125 148.26C74.3848 145.543 76.6862 141.269 79.9382 140.739C81.3118 140.515 82.795 140.958 83.7654 141.954V141.954Z" fill="#E24122"/>
|
||||
<path d="M83.4448 142.275C85.6801 144.613 83.6079 148.214 80.9314 149.084C79.4391 149.569 77.9468 149.087 76.9691 147.863C75.783 146.378 76.1292 144.296 77.2518 142.883C77.8924 142.076 78.7785 141.46 79.7897 141.228C80.438 141.084 81.112 141.104 81.7504 141.287C82.3888 141.47 82.9712 141.809 83.4448 142.275C83.858 142.687 84.4995 142.047 84.0854 141.634C82.2035 139.759 79.2216 139.856 77.2745 141.553C75.6444 142.974 74.7873 145.398 75.6752 147.449C76.4644 149.273 78.4107 150.423 80.3823 150.139C82.1265 149.888 83.684 148.681 84.5684 147.186C85.6366 145.379 85.5705 143.187 84.0863 141.634C83.6822 141.212 83.0416 141.853 83.4448 142.275V142.275Z" fill="#E24122"/>
|
||||
<path d="M81.6707 149.478C85.9139 153.835 78.1307 161.499 73.8341 156.484C71.2472 153.466 73.8051 148.715 77.4185 148.127C78.9444 147.878 80.5925 148.37 81.6707 149.478Z" fill="#E24122"/>
|
||||
<path d="M81.351 149.798C83.8626 152.425 81.5467 156.47 78.5358 157.449C76.8604 157.994 75.1833 157.451 74.0842 156.08C72.7459 154.41 73.1319 152.064 74.3986 150.475C75.1172 149.573 76.1093 148.882 77.241 148.622C77.9699 148.46 78.7277 148.483 79.4456 148.688C80.1634 148.894 80.8185 149.275 81.351 149.798C81.7641 150.21 82.4057 149.57 81.9916 149.158C79.9212 147.094 76.6376 147.199 74.4947 149.068C72.7015 150.631 71.7484 153.299 72.7251 155.559C73.5913 157.564 75.7297 158.835 77.8979 158.525C79.8233 158.248 81.5431 156.917 82.5189 155.266C83.6941 153.279 83.6243 150.868 81.9907 149.159C81.5875 148.735 80.9478 149.376 81.351 149.798V149.798Z" fill="#E24122"/>
|
||||
<path d="M76.3539 148.059C74.8389 145.551 75.9308 142.366 78.2984 140.826C78.7849 140.509 78.3319 139.725 77.8408 140.044C75.0673 141.849 73.7933 145.575 75.5711 148.516C75.8728 149.014 76.6565 148.559 76.3539 148.059V148.059Z" fill="black"/>
|
||||
<path d="M81.5585 155.412C83.5636 156.127 85.7346 157.268 87.911 156.563C89.3199 156.107 90.2641 154.962 90.7968 153.623C91.8026 151.096 91.3595 147.542 88.9312 145.985C86.8382 144.643 84.3555 144.036 81.8946 143.899C80.7294 143.835 80.733 145.646 81.8946 145.71C83.695 145.81 85.5081 146.203 87.1191 147.033C88.2526 147.618 88.9095 148.147 89.2583 149.366C89.7712 151.159 89.4269 153.916 87.6047 154.752C85.9212 155.523 83.6805 154.252 82.0405 153.667C80.9396 153.273 80.4657 155.023 81.5585 155.412Z" fill="#E24122"/>
|
||||
<path d="M73.1457 152.213C74.1071 149.265 77.658 147.42 80.5402 148.856C82.0181 149.593 83.0002 151.081 83.0057 152.745C83.0111 154.544 82.0534 156.474 80.7387 157.671C80.3065 158.064 80.9489 158.704 81.3793 158.312C83.7079 156.193 84.8921 152.222 82.8082 149.559C80.9942 147.242 77.6462 146.89 75.1853 148.349C73.8067 149.164 72.7714 150.452 72.2723 151.973C72.0911 152.528 72.9654 152.766 73.1457 152.213V152.213ZM62.6388 139.715L65.8101 153.269C65.9777 153.984 66.7941 154.407 67.4818 154.218C68.2139 154.017 68.599 153.264 68.4314 152.548L65.2601 138.994C65.0925 138.279 64.2761 137.856 63.5884 138.045C62.8554 138.246 62.4703 138.999 62.6388 139.715V139.715Z" fill="black"/>
|
||||
<path d="M60.4316 150.47L71.3118 142.541C71.9044 142.109 72.1961 141.361 71.7992 140.683C71.4577 140.099 70.5362 139.761 69.94 140.196L59.0598 148.125C58.4672 148.557 58.1754 149.305 58.5723 149.983C58.9139 150.567 59.8354 150.905 60.4316 150.47ZM82.6686 149.855C84.1717 149.114 85.2436 147.721 85.7266 146.13C86.2829 144.298 85.9522 142.36 85.163 140.649C84.9193 140.12 84.1382 140.58 84.3811 141.107C85.0697 142.599 85.3361 144.297 84.8531 145.89C84.4354 147.269 83.5103 148.433 82.2119 149.074C81.6891 149.332 82.1476 150.114 82.6686 149.855V149.855Z" fill="black"/>
|
||||
<path d="M52.7019 146.528C54.688 145.63 56.2392 143.794 56.7883 141.684C57.3863 139.389 56.7901 136.994 55.3522 135.143C55.0523 134.757 54.3863 134.828 54.071 135.143C53.6895 135.525 53.7702 136.036 54.071 136.424C55.1311 137.79 55.4754 139.692 55.0015 141.346C54.5331 142.98 53.3216 144.27 51.7867 144.964C51.341 145.166 51.2331 145.812 51.4615 146.202C51.7306 146.661 52.2543 146.729 52.7019 146.528V146.528Z" fill="#E24122"/>
|
||||
<path d="M108.929 192.839C103.111 194.729 97.9687 198.414 94.2592 203.271C93.1911 204.673 92.2519 206.168 91.4531 207.738C91.1894 208.256 91.9705 208.715 92.235 208.195C94.9342 202.897 99.2608 198.508 104.502 195.699C105.995 194.9 107.557 194.235 109.169 193.713C109.722 193.534 109.486 192.659 108.929 192.839ZM97.9624 204.134C95.1036 207.118 93.227 210.906 92.5848 214.988C92.4969 215.558 93.3694 215.804 93.4582 215.229C94.0624 211.3 95.8581 207.651 98.603 204.774C99.0062 204.353 98.3665 203.712 97.9624 204.134V204.134ZM97.8971 210.515C97.2141 211.392 96.7155 212.398 96.4312 213.473C96.1469 214.548 96.0827 215.668 96.2426 216.768C96.2771 217.011 96.5851 217.143 96.7999 217.084C97.0599 217.013 97.1514 216.77 97.1161 216.527C96.9876 215.583 97.047 214.622 97.291 213.7C97.5349 212.778 97.9586 211.913 98.5377 211.156C98.689 210.961 98.7244 210.705 98.5377 210.515C98.3837 210.358 98.0475 210.322 97.8971 210.515V210.515ZM48.5466 167.943C45.8492 168.54 43.5442 170.362 42.1597 172.731C40.6484 175.318 40.3838 178.447 41.1521 181.316C42.7677 187.351 48.5892 191.28 54.6002 191.957C57.7189 192.308 61.0116 191.696 63.5287 189.745C65.5691 188.164 67.3541 185.486 67.1439 182.796C67.0596 181.713 66.6229 180.465 65.6081 179.918C64.4864 179.313 63.1735 179.872 62.5419 180.908C61.0777 183.311 63.371 186.287 65.4958 187.322C67.6857 188.389 70.3804 188.29 72.2913 186.697C74.1479 185.15 74.9733 182.475 74.4206 180.138C74.282 179.564 74.0581 179.013 73.7565 178.505C73.462 178.002 72.6782 178.457 72.9745 178.962C74.0564 180.807 73.8471 183.171 72.6755 184.925C71.4849 186.709 69.3439 187.459 67.2744 186.996C65.1958 186.532 62.9053 184.71 63.0321 182.366C63.0919 181.264 64.2608 179.968 65.3671 180.84C66.1373 181.448 66.3203 182.656 66.2279 183.569C65.9823 185.999 64.3523 188.18 62.3444 189.481C60.0357 190.977 57.1934 191.365 54.4996 191.041C49.3195 190.416 44.1938 187.161 42.3572 182.132C41.3542 179.385 41.3324 176.25 42.7006 173.621C43.942 171.235 46.1401 169.402 48.7849 168.816C49.3567 168.69 49.1157 167.817 48.5466 167.943Z" fill="#FCF1D5"/>
|
||||
<path d="M55.3491 175.645C53.2026 175.337 50.9899 177.075 51.153 179.332C51.2282 180.368 51.7365 181.366 52.5511 182.016C52.962 182.344 53.443 182.573 53.9568 182.686C54.4706 182.798 55.0035 182.791 55.514 182.664C56.0923 182.527 56.6292 182.253 57.08 181.866C57.5308 181.478 57.8824 180.989 58.1054 180.438C58.1978 180.21 58.0048 179.943 57.7891 179.881C57.5318 179.807 57.3225 179.972 57.2319 180.197C56.6466 181.649 54.7003 182.323 53.3684 181.492C51.9984 180.638 51.5988 178.665 52.7169 177.449C53.3113 176.803 54.221 176.39 55.109 176.517C55.3527 176.552 55.5928 176.457 55.6662 176.201C55.7269 175.99 55.591 175.679 55.3491 175.645V175.645Z" fill="#FCF1D5"/>
|
||||
<path d="M124.623 198.644C125.65 196.952 126.917 195.418 128.383 194.087C129.124 193.416 129.914 192.8 130.746 192.246C131.485 191.755 132.364 191.092 133.257 190.944C133.817 190.851 134.231 191.139 134.243 191.73C134.254 192.261 133.925 192.742 133.651 193.172C133.075 194.072 132.46 194.947 131.81 195.794C130.49 197.512 129.034 199.121 127.454 200.604L128.095 201.244C129.26 200.036 130.571 198.978 131.997 198.093C132.7 197.66 133.429 197.269 134.18 196.924C134.644 196.712 136.011 195.966 136.311 196.753C136.6 197.51 135.544 198.32 135.102 198.779L133.062 200.898L128.983 205.136C128.578 205.557 129.2 206.179 129.623 205.776C130.953 204.513 132.587 203.496 134.362 202.996C134.766 202.882 135.323 202.755 135.709 202.995C136.115 203.245 136.178 203.772 136.085 204.198C135.893 205.069 135.154 205.887 134.61 206.565C132.379 209.335 129.511 211.524 126.251 212.946C124.33 213.782 121.678 214.657 119.965 212.938C119.553 212.524 118.913 213.164 119.325 213.578C121.011 215.271 123.511 214.957 125.56 214.195C127.599 213.434 129.516 212.38 131.251 211.066C132.961 209.775 134.481 208.251 135.768 206.539C136.369 205.739 137.076 204.824 137.031 203.768C136.992 202.853 136.39 202.104 135.465 201.984C134.336 201.836 133.101 202.43 132.116 202.92C130.967 203.499 129.912 204.245 128.984 205.135L129.624 205.776L134.645 200.56C135.376 199.801 136.243 199.068 136.843 198.196C137.272 197.572 137.449 196.683 136.941 196.048C136.423 195.399 135.543 195.442 134.824 195.68C133.914 195.983 133.029 196.452 132.197 196.923C130.448 197.917 128.851 199.157 127.454 200.603C127.047 201.022 127.671 201.643 128.095 201.243C130.266 199.201 132.206 196.927 133.881 194.462C134.368 193.747 134.978 192.974 135.116 192.098C135.232 191.358 134.976 190.55 134.278 190.191C133.573 189.829 132.752 190.081 132.083 190.403C130.506 191.165 129.036 192.272 127.743 193.445C126.222 194.83 124.908 196.426 123.842 198.185C123.536 198.686 124.32 199.141 124.623 198.644V198.644ZM124.619 144.052C124.22 143.067 124.284 142.014 124.719 141.05C125.1 140.206 125.596 139.358 126.307 138.749C126.751 138.37 126.108 137.731 125.667 138.109C124.859 138.799 124.28 139.788 123.866 140.754C123.383 141.879 123.28 143.143 123.745 144.292C123.836 144.519 124.046 144.679 124.302 144.609C124.518 144.55 124.711 144.28 124.619 144.052Z" fill="#1E7EC1"/>
|
||||
<path d="M125.761 143.636C127.805 141.483 129.047 138.693 129.278 135.734C129.323 135.152 128.417 135.156 128.372 135.734C128.15 138.455 127.002 141.017 125.12 142.996C124.719 143.418 125.358 144.059 125.761 143.636ZM128.067 143.667C129.723 141.772 130.703 139.382 130.855 136.871C130.89 136.289 129.984 136.291 129.949 136.871C129.808 139.144 128.921 141.308 127.426 143.026C127.044 143.464 127.682 144.107 128.067 143.667V143.667ZM129.497 144.547C131.14 142.851 132.168 140.654 132.417 138.306C132.443 138.062 132.189 137.853 131.964 137.853C131.696 137.853 131.537 138.061 131.511 138.306C131.282 140.405 130.326 142.396 128.856 143.907C128.448 144.325 129.089 144.966 129.497 144.547V144.547ZM129.834 147.456C131.609 145.314 132.919 142.826 133.681 140.151C133.84 139.59 132.966 139.35 132.807 139.91C132.094 142.437 130.863 144.788 129.193 146.815C128.824 147.262 129.462 147.906 129.834 147.456V147.456ZM121.654 140.46L124.876 137.533C125.057 137.368 125.043 137.06 124.876 136.893C124.79 136.81 124.675 136.764 124.555 136.764C124.436 136.764 124.321 136.81 124.235 136.893L121.013 139.82C120.832 139.985 120.845 140.293 121.013 140.46C121.099 140.543 121.214 140.589 121.333 140.589C121.453 140.589 121.568 140.543 121.654 140.46V140.46ZM121.512 137.83C123.06 136.188 124.933 134.886 127.011 134.005C127.237 133.909 127.286 133.578 127.173 133.386C127.037 133.153 126.779 133.128 126.554 133.223C124.406 134.14 122.471 135.49 120.871 137.19C120.472 137.614 121.112 138.256 121.512 137.83ZM120.052 137.001C121.633 135.221 123.586 133.812 125.773 132.872C125.997 132.775 126.05 132.445 125.936 132.253C125.799 132.021 125.542 131.993 125.316 132.091C123.059 133.065 121.044 134.523 119.412 136.36C119.026 136.795 119.665 137.438 120.052 137.001ZM118.284 136.207C119.979 134.362 122.08 132.935 124.421 132.04C124.961 131.835 124.726 130.96 124.18 131.167C121.689 132.107 119.451 133.613 117.642 135.566C117.249 135.995 117.888 136.637 118.284 136.207V136.207Z" fill="#1E7EC1"/>
|
||||
<path d="M114.84 138.115C116.865 134.906 119.766 132.342 123.2 130.726C123.727 130.478 123.268 129.696 122.743 129.944C119.172 131.637 116.159 134.313 114.057 137.658C113.746 138.153 114.53 138.608 114.84 138.115V138.115Z" fill="#1E7EC1"/>
|
||||
</g>
|
||||
<g clip-path="url(#clip6_10846_21602)">
|
||||
<path d="M33.82 138.894C33.2724 138.774 32.5508 138.972 31.9271 139.422C30.8348 140.209 30.212 141.6 29.0096 142.243C26.0696 143.816 22.457 142.539 19.1519 142.96C15.401 143.437 12.1383 146.26 10.745 149.792C9.3507 153.324 9.72138 157.428 11.365 160.85C12.1863 162.56 12.8975 164.357 14.0462 165.883C16.0181 168.503 20.5876 171.022 23.9472 170.179C25.6171 169.76 25.6952 167.557 26.1722 166.089C27.4329 162.207 34.2988 142.593 34.6469 140.503C34.8078 139.532 34.4155 139.025 33.82 138.894V138.894Z" fill="#F6A50C"/>
|
||||
<path d="M33.9436 138.437C31.9388 138.111 30.8701 139.88 29.6649 141.126C28.1963 142.645 25.8791 142.643 23.9185 142.546C21.9202 142.447 19.9003 142.211 17.9331 142.71C16.2218 143.145 14.646 144.048 13.3401 145.233C10.4679 147.842 9.15452 151.721 9.4584 155.56C9.62398 157.645 10.2468 159.574 11.1311 161.455C11.9929 163.285 12.7794 165.203 14.1361 166.734C16.3065 169.183 20.0019 171.177 23.3408 170.765C24.0709 170.675 24.7605 170.474 25.2629 169.903C25.7389 169.362 25.9845 168.659 26.1698 167.973C26.421 167.044 26.6506 166.123 26.9563 165.211C28.5228 160.538 30.1447 155.885 31.7234 151.216C32.5193 148.863 33.3114 146.509 34.0697 144.143C34.3306 143.34 34.5802 142.534 34.8186 141.723C35.0002 141.096 35.225 140.421 35.1253 139.761C35.0246 139.091 34.5919 138.611 33.9436 138.437C33.3585 138.281 33.1082 139.192 33.6934 139.349C34.8487 139.659 33.6247 142.432 33.4017 143.138C32.7352 145.232 32.049 147.319 31.3433 149.4C29.7966 154.001 28.2123 158.589 26.6496 163.184C26.3994 163.922 26.1491 164.658 25.9036 165.397C25.5752 166.384 25.4172 167.429 25.0521 168.4C24.8094 169.048 24.4397 169.564 23.7463 169.739C22.9862 169.931 22.1517 169.904 21.383 169.774C19.7103 169.492 18.1241 168.745 16.7392 167.776C15.2904 166.761 14.2047 165.476 13.3618 163.921C12.4332 162.207 11.5093 160.354 10.9524 158.482C9.86765 154.84 10.2204 150.74 12.4727 147.608C13.4867 146.198 14.8274 145.057 16.3789 144.284C18.0338 143.468 19.7997 143.287 21.6211 143.36C23.4914 143.435 25.3805 143.693 27.2395 143.345C28.0872 143.186 28.9687 142.89 29.6705 142.375C30.3272 141.893 30.807 141.235 31.3395 140.627C31.9162 139.969 32.7375 139.192 33.6924 139.347C34.2861 139.446 34.5411 138.535 33.9436 138.437V138.437Z" fill="#F6A50C"/>
|
||||
<path d="M12.5387 154.699C13.0402 150.677 15.5916 147.217 19.5571 146.122C20.546 145.848 21.5709 145.729 22.5959 145.769C23.69 145.813 24.7146 146.142 25.7861 146.321C26.7316 146.48 27.7637 146.576 28.6847 146.24C29.4684 145.954 30.0743 145.372 30.6924 144.831C31.1496 144.431 30.4817 143.765 30.0272 144.163C29.4985 144.626 28.9726 145.159 28.2886 145.379C27.4353 145.652 26.4579 145.502 25.6008 145.329C23.9497 144.994 22.4265 144.688 20.7321 144.92C17.603 145.351 14.8192 147.119 13.1963 149.853C12.3167 151.335 11.8105 152.993 11.5979 154.7C11.5236 155.301 12.4644 155.295 12.5387 154.699V154.699Z" fill="#1B6BA3"/>
|
||||
<path d="M25.5163 169.253C24.7956 171.195 22.2216 170.434 20.7342 170.021C18.8724 169.503 17.1018 168.611 15.6031 167.383C13.4675 165.633 11.9105 163.221 10.9706 160.632C9.15391 155.622 9.47096 149.222 14.0178 145.764C15.478 144.654 17.2956 143.682 19.1123 143.375C21.2507 143.013 23.424 143.455 25.5615 142.99C27.3377 142.603 28.9389 142.112 30.2749 140.822C30.9739 140.147 31.6541 139.582 32.5968 139.282C33.3014 139.058 34.6458 138.825 34.9967 139.727C35.1661 140.162 34.9685 140.672 34.8565 141.103C34.7512 141.509 34.6383 141.912 34.5226 142.316C34.226 143.341 33.9158 144.363 33.5921 145.38C32.7723 147.958 31.9262 150.528 31.0538 153.089C29.3651 158.083 27.6152 163.055 25.9218 168.048L25.5163 169.253C25.3234 169.831 26.2322 170.079 26.4232 169.504C28.1439 164.342 29.9691 159.215 31.7171 154.061C32.6748 151.26 33.6025 148.45 34.5 145.629C34.8396 144.552 35.1736 143.472 35.4822 142.385C35.7381 141.484 36.2179 140.337 35.8886 139.415C35.2451 137.614 32.8113 138.087 31.5073 138.706C30.5872 139.143 29.9587 139.876 29.2042 140.533C28.4281 141.208 27.4637 141.547 26.4834 141.803C25.4137 142.081 24.3478 142.289 23.2405 142.315C22.0843 142.342 20.9271 142.253 19.7727 142.349C17.6917 142.525 15.7414 143.452 14.0225 144.606C8.93659 148.023 8.07293 154.698 9.83129 160.202C10.71 162.952 12.2153 165.577 14.3471 167.538C16.5879 169.587 19.3923 170.907 22.3928 171.326C23.2405 171.445 24.1173 171.577 24.9208 171.207C25.6527 170.87 26.1457 170.251 26.4232 169.504C26.6349 168.933 25.7261 168.687 25.5163 169.253V169.253Z" fill="#1B6BA3"/>
|
||||
<path d="M17.8333 161.91L19.4045 164.638C19.5277 164.852 19.8354 164.945 20.048 164.807C20.1539 164.742 20.2307 164.639 20.2621 164.518C20.2936 164.397 20.2772 164.269 20.2164 164.161L18.6452 161.432C18.522 161.219 18.2144 161.125 18.0017 161.263C17.8958 161.328 17.819 161.432 17.7876 161.552C17.7562 161.673 17.7726 161.801 17.8333 161.91ZM18.9689 155.225L23.2599 163.314C23.5449 163.85 24.3568 163.374 24.0718 162.836L19.7808 154.748C19.4967 154.211 18.6838 154.688 18.9689 155.225V155.225ZM23.2994 153.444L25.6627 158.193C25.9336 158.737 26.7455 158.259 26.4746 157.715L24.1113 152.967C23.8403 152.422 23.0284 152.901 23.2994 153.444V153.444Z" fill="#1B6BA3"/>
|
||||
</g>
|
||||
<g clip-path="url(#clip7_10846_21602)">
|
||||
<path d="M305.594 117.663L306.532 110.272C306.564 110.017 306.293 109.803 306.061 109.8C305.78 109.797 305.623 110.02 305.591 110.272L304.653 117.663C304.621 117.918 304.892 118.132 305.124 118.135C305.404 118.138 305.562 117.915 305.594 117.663V117.663ZM311.91 119.562C313.713 116.624 315.619 113.753 317.565 110.909C317.908 110.407 317.093 109.933 316.752 110.432C314.807 113.276 312.9 116.148 311.098 119.085C310.779 119.605 311.592 120.08 311.91 119.562ZM315.997 124.15L323.307 120.667C323.854 120.406 323.377 119.591 322.832 119.851L315.521 123.334C314.974 123.594 315.451 124.409 315.997 124.15V124.15Z" fill="black"/>
|
||||
</g>
|
||||
<g clip-path="url(#clip8_10846_21602)">
|
||||
<path d="M234.623 129.252C228.131 132.486 223.79 139.195 223.579 146.251C223.56 146.85 224.521 146.849 224.539 146.251C224.741 139.508 228.915 133.14 235.108 130.054C235.657 129.78 235.172 128.977 234.623 129.252V129.252ZM225.09 129.219C222.948 130.455 221.555 132.693 221.401 135.098C221.363 135.696 222.323 135.693 222.362 135.098C222.494 133.024 223.733 131.084 225.574 130.022C226.105 129.715 225.622 128.911 225.09 129.219V129.219Z" fill="black"/>
|
||||
</g>
|
||||
<g clip-path="url(#clip9_10846_21602)">
|
||||
<path d="M146.285 189.04C149.656 196.27 149.305 205.013 145.367 211.945C145.009 212.574 145.96 213.181 146.318 212.55C150.463 205.254 150.828 196.121 147.28 188.512C146.973 187.853 145.979 188.384 146.285 189.04V189.04ZM154.209 196.252C154.835 199.945 154.392 203.739 152.933 207.187C152.652 207.855 153.732 208.18 154.011 207.517C155.539 203.885 155.974 199.875 155.307 195.994C155.184 195.279 154.087 195.539 154.209 196.252V196.252Z" fill="black"/>
|
||||
</g>
|
||||
<defs>
|
||||
<clipPath id="clip0_10846_21602">
|
||||
<rect width="145.35" height="139.05" fill="white" transform="translate(203.85 102.15)"/>
|
||||
</clipPath>
|
||||
<clipPath id="clip1_10846_21602">
|
||||
<rect width="284.85" height="0.45" fill="white" transform="translate(65.7002 239.85)"/>
|
||||
</clipPath>
|
||||
<clipPath id="clip2_10846_21602">
|
||||
<rect width="178.2" height="118.35" fill="white" transform="translate(117 29.7)"/>
|
||||
</clipPath>
|
||||
<clipPath id="clip3_10846_21602">
|
||||
<rect width="18.9" height="12.15" fill="white" transform="translate(270.45 117.45)"/>
|
||||
</clipPath>
|
||||
<clipPath id="clip4_10846_21602">
|
||||
<rect width="93.15" height="72" fill="white" transform="translate(229.5 121.05)"/>
|
||||
</clipPath>
|
||||
<clipPath id="clip5_10846_21602">
|
||||
<rect width="114.3" height="110.7" fill="white" transform="translate(22.9497 129.15)"/>
|
||||
</clipPath>
|
||||
<clipPath id="clip6_10846_21602">
|
||||
<rect width="27" height="33.3" fill="white" transform="translate(9 138.15)"/>
|
||||
</clipPath>
|
||||
<clipPath id="clip7_10846_21602">
|
||||
<rect width="18.9" height="14.4" fill="white" transform="translate(304.65 109.8)"/>
|
||||
</clipPath>
|
||||
<clipPath id="clip8_10846_21602">
|
||||
<rect width="13.95" height="17.55" fill="white" transform="translate(221.4 129.15)"/>
|
||||
</clipPath>
|
||||
<clipPath id="clip9_10846_21602">
|
||||
<rect width="23.85" height="13.05" fill="white" transform="translate(158.904 191.882) rotate(107.017)"/>
|
||||
</clipPath>
|
||||
</defs>
|
||||
</svg>
|
||||
|
After Width: | Height: | Size: 64 KiB |
58
apps/core/public/imgs/invite-success.svg
Normal file
@@ -0,0 +1,58 @@
|
||||
<svg width="300" height="300" viewBox="0 0 300 300" fill="none" xmlns="http://www.w3.org/2000/svg">
|
||||
<g clip-path="url(#clip0_10846_21558)">
|
||||
<path d="M276.304 178.466C275.944 175.885 274.553 173.514 272.648 171.758C271.454 170.658 270.059 169.798 268.539 169.226C271.653 168.181 274.328 165.591 275.322 162.521C276.769 158.055 273.947 153.135 270.128 150.838C269.152 150.25 268.085 149.829 266.969 149.593C270.711 147.387 272.499 142.584 271.563 138.138C270.914 135.054 269.038 132.257 266.597 130.292C263.829 128.063 260.321 127.002 256.8 126.802C253.148 126.595 249.531 127.376 245.967 128.125C248.024 124.223 253.418 111.908 251.68 98.4882C251.05 93.6252 249.283 88.6016 245.018 85.7808C242.226 83.9348 238.894 83.4878 235.723 84.6135C232.06 85.914 229.291 88.7883 227.802 92.3342C226.189 96.1726 226.065 100.398 225.765 104.49C225.637 106.241 225.113 112.885 224.758 114.425C223.983 117.794 221.98 120.837 219.266 122.982C217.84 124.11 216.24 125.037 214.666 125.939C209.76 128.752 204.651 131.216 199.55 133.65C193.696 136.444 172.788 145.967 168.306 148.182C160.69 151.948 153.04 156.194 146.86 162.103C140.995 167.708 136.897 175.139 137.002 183.41C137.104 191.36 141.319 199.025 147.317 204.129C151.646 207.814 156.987 210.082 162.588 210.963C165.63 211.441 192.055 210.983 196.976 210.855C202.503 210.711 208.03 210.562 213.556 210.407C218.936 210.256 259.333 211.175 266.46 204.622C268.045 203.165 269.504 201.556 270.078 199.461C270.737 197.06 270.502 194.433 269.009 192.387C268.522 191.729 267.938 191.15 267.275 190.668C270.19 189.855 272.84 187.945 274.544 185.481C275.961 183.434 276.649 180.946 276.304 178.466Z" fill="#2FB195"/>
|
||||
<path d="M194.64 207.524L192.969 220.285L190.311 240.594L189.707 245.216L191.493 243.433H185.751C183.453 243.433 183.448 246.999 185.751 246.999H191.493C192.55 246.999 193.154 246.174 193.279 245.216L194.949 232.455L197.607 212.146L198.212 207.524C198.337 206.567 197.301 205.741 196.426 205.741C195.357 205.741 194.766 206.565 194.64 207.524ZM210.92 208.102L214.909 220.782L221.262 240.976L222.712 245.587C223.025 246.582 223.924 246.988 224.909 246.833L229.895 246.04C230.848 245.888 231.377 244.701 231.143 243.847C230.864 242.833 229.902 242.449 228.946 242.601L223.96 243.394L226.157 244.639L222.168 231.959L215.815 211.765L214.365 207.154C213.678 204.972 210.228 205.904 210.92 208.102Z" fill="#2FB195"/>
|
||||
<path d="M195.703 153.4C191.527 150.165 185.52 151.474 182.481 155.539C179.528 159.489 180.037 165.29 184.122 168.306C184.983 168.931 185.964 169.374 187.003 169.608C191.027 170.548 195.99 168.786 198.004 165.327C200.228 161.505 199.201 156.109 195.703 153.4Z" fill="#FCF1D5"/>
|
||||
<path d="M196.004 152.886C192.73 150.412 188.193 150.447 184.772 152.628C181.395 154.781 179.519 158.75 180.128 162.72C180.784 167.004 184.276 170.165 188.6 170.433C192.482 170.673 196.871 168.833 198.714 165.269C200.809 161.22 199.705 155.824 196.125 152.979C195.532 152.507 194.682 153.342 195.283 153.819C198.099 156.057 199.254 159.977 198.199 163.405C197.128 166.882 193.638 168.941 190.137 169.227C188.22 169.384 186.228 169.041 184.622 167.935C183.139 166.915 182.053 165.357 181.547 163.639C180.552 160.264 181.758 156.583 184.44 154.336C187.562 151.721 192.13 151.439 195.404 153.913C196.014 154.374 196.608 153.342 196.004 152.886Z" fill="#FCF1D5"/>
|
||||
<path d="M189.904 158.411C187.445 156.579 183.835 156.895 181.957 159.429C181.567 159.963 181.292 160.572 181.147 161.216C180.561 163.713 181.658 166.792 183.812 168.04C186.191 169.419 189.55 168.783 191.237 166.612C193.25 164.023 192.434 160.296 189.904 158.411Z" fill="black"/>
|
||||
<path d="M190.204 157.898C188.145 156.402 185.224 156.206 183.057 157.602C180.641 159.158 179.915 162.12 180.717 164.783C181.499 167.375 183.593 169.236 186.35 169.357C188.963 169.471 191.514 168.006 192.518 165.564C193.654 162.803 192.511 159.658 190.204 157.898C189.596 157.433 189.002 158.465 189.603 158.924C191.26 160.188 192.14 162.436 191.627 164.476C191.104 166.557 189.218 167.987 187.103 168.154C184.897 168.327 183.026 167.202 182.128 165.187C181.198 163.101 181.397 160.458 183.235 158.934C185.071 157.411 187.733 157.564 189.603 158.922C190.224 159.375 190.819 158.345 190.204 157.898Z" fill="black"/>
|
||||
<path d="M225.197 157.44C224.205 153.534 220.917 150.398 216.907 149.764C212.202 149.021 207.467 151.739 206.29 156.458C205.429 160.32 206.696 164.892 209.85 167.416C213.018 169.949 217.76 169.926 221.145 167.828C224.662 165.646 226.203 161.407 225.197 157.44Z" fill="#FCF1D5"/>
|
||||
<path d="M218.535 158.187C217.107 155.934 214.363 154.952 211.803 155.618C209.321 156.264 207.318 158.352 206.907 160.898C206.415 163.94 208.163 167.007 211.229 167.772C213.761 168.331 216.73 167.492 218.349 165.403C219.931 163.361 219.895 160.332 218.535 158.187Z" fill="black"/>
|
||||
<path d="M192.463 171.142C192.001 170.518 191.342 170.106 190.603 169.88C189.112 169.425 187.397 169.681 186.003 170.324C185.148 170.719 184.283 171.393 184.021 172.336C183.868 172.891 183.957 173.521 184.311 173.982C184.707 174.5 185.316 174.638 185.931 174.714C187.032 174.831 188.188 174.749 189.281 174.61C190.411 174.466 192.055 174.27 192.734 173.212C193.162 172.545 192.902 171.734 192.463 171.142ZM222.507 171.407C222.35 170.499 221.566 169.819 220.774 169.427C219.407 168.751 217.727 168.551 216.243 168.912C215.53 169.086 214.824 169.428 214.313 169.965C213.787 170.519 213.322 171.395 213.596 172.166C214.027 173.378 215.755 173.573 216.84 173.678C218.137 173.803 219.51 173.804 220.799 173.584C221.345 173.482 221.871 173.287 222.211 172.825C222.512 172.418 222.591 171.899 222.507 171.407Z" fill="#E24122"/>
|
||||
<path d="M203.187 176.759C202.974 176.759 202.761 176.757 202.548 176.751C197.63 176.617 192.553 174.89 192.294 171.331C192.283 171.176 192.302 171.019 192.352 170.871C192.401 170.723 192.479 170.586 192.581 170.468C192.683 170.349 192.808 170.253 192.948 170.183C193.087 170.113 193.24 170.071 193.396 170.059C193.552 170.048 193.708 170.067 193.857 170.117C194.005 170.166 194.142 170.244 194.261 170.346C194.379 170.448 194.476 170.572 194.546 170.712C194.616 170.851 194.658 171.003 194.67 171.159C194.792 172.844 198.28 174.257 202.612 174.374C206.914 174.494 211.664 173.202 211.998 170.584C212.05 170.282 212.217 170.012 212.464 169.83C212.71 169.648 213.018 169.568 213.322 169.606C213.627 169.645 213.904 169.799 214.098 170.037C214.291 170.275 214.385 170.578 214.36 170.883C213.84 174.977 208.478 176.759 203.187 176.759ZM237.828 131.708C244.235 128.782 251.543 126.808 258.61 128.078C264.483 129.133 271.017 133.027 270.974 139.727C270.951 143.265 269.129 146.556 266.802 149.12C266.289 149.686 267.129 150.529 267.644 149.961C269.884 147.492 271.636 144.475 272.066 141.13C272.503 137.732 271.313 134.454 268.979 131.971C264.252 126.941 256.567 125.945 250.046 126.794C245.584 127.375 241.305 128.817 237.225 130.68C236.531 130.999 237.136 132.024 237.828 131.708Z" fill="black"/>
|
||||
<path d="M264.524 150.127C266.29 150.008 268.053 150.385 269.615 151.214C271.178 152.044 272.476 153.293 273.364 154.821C275.268 158.096 274.993 162.227 272.705 165.239C271.392 166.952 269.57 168.206 267.499 168.821C266.766 169.039 267.078 170.187 267.815 169.967C271.877 168.753 275.142 165.264 275.73 161.022C276.29 156.978 274.416 152.913 271.024 150.65C269.106 149.38 266.821 148.779 264.524 148.938C263.763 148.989 263.757 150.178 264.524 150.127Z" fill="black"/>
|
||||
<path d="M265.969 169.813C269.668 169.918 273.019 171.949 274.515 175.385C276.198 179.252 275.167 183.995 272.233 186.977C270.779 188.455 268.906 189.327 266.965 189.98C266.242 190.222 266.553 191.371 267.282 191.126C269.196 190.483 271.048 189.646 272.572 188.295C274.228 186.829 275.44 184.815 276.047 182.697C277.28 178.391 275.994 173.519 272.362 170.768C270.518 169.371 268.269 168.689 265.97 168.623C265.202 168.603 265.202 169.792 265.969 169.813Z" fill="black"/>
|
||||
<path d="M266.052 190.722C269.193 191.826 270.231 195.619 269.351 198.558C268.397 201.743 265.744 204.361 262.76 205.699C262.062 206.012 262.667 207.037 263.361 206.725C266.8 205.183 269.891 201.928 270.678 198.166C271.4 194.722 269.854 190.8 266.369 189.574C265.644 189.321 265.333 190.468 266.052 190.722ZM245.975 111.907C245.688 115.821 244.456 119.606 242.382 122.94C241.977 123.593 243.007 124.189 243.41 123.54C245.585 120.023 246.874 116.032 247.164 111.909C247.22 111.143 246.03 111.147 245.975 111.907ZM240.945 117.853C240.33 120.07 239.342 122.167 238.024 124.054C237.841 124.318 237.975 124.713 238.237 124.867C238.534 125.04 238.867 124.918 239.052 124.654C240.425 122.679 241.453 120.487 242.093 118.17C242.298 117.431 241.15 117.116 240.945 117.853ZM235.699 120.364L234.008 123.254C233.85 123.522 233.937 123.917 234.221 124.067C234.507 124.218 234.867 124.141 235.035 123.854L236.726 120.964C236.883 120.696 236.796 120.301 236.513 120.151C236.376 120.074 236.215 120.054 236.063 120.093C235.911 120.133 235.78 120.23 235.699 120.364ZM168.398 141.383L192.888 128.763C193.569 128.413 192.968 127.387 192.287 127.738L167.797 140.357C167.115 140.708 167.717 141.733 168.398 141.383Z" fill="black"/>
|
||||
<path d="M188.514 130.222C187.828 127.727 187.089 125.157 185.376 123.147C183.804 121.302 181.558 120.253 179.118 120.579C176.643 120.91 174.034 122.243 172.086 123.782C170.106 125.347 169.068 127.575 169.06 130.091C169.051 133.171 170.477 135.979 171.862 138.648C172.008 138.929 172.269 138.984 172.5 138.91C172.559 138.9 172.616 138.891 172.676 138.86L186.305 131.881L188.238 130.891C188.472 130.775 188.58 130.466 188.514 130.222Z" fill="black"/>
|
||||
<path d="M174.07 136.313L175.602 135.516C175.737 135.436 175.836 135.306 175.876 135.154C175.915 135.001 175.894 134.84 175.815 134.703C175.733 134.57 175.602 134.473 175.451 134.433C175.299 134.394 175.137 134.414 175 134.491L173.469 135.287C173.334 135.367 173.235 135.498 173.195 135.65C173.155 135.802 173.177 135.964 173.256 136.1C173.338 136.233 173.469 136.329 173.621 136.369C173.772 136.409 173.933 136.389 174.07 136.313ZM178.592 134.013L180.28 132.968C180.545 132.804 180.671 132.429 180.493 132.155C180.322 131.89 179.962 131.766 179.679 131.942L177.99 132.987C177.726 133.151 177.6 133.525 177.777 133.8C177.948 134.064 178.308 134.188 178.592 134.013ZM183.682 131.564L185.692 130.438C185.964 130.286 186.078 129.892 185.905 129.625C185.824 129.492 185.693 129.395 185.541 129.355C185.389 129.315 185.228 129.336 185.091 129.412L183.081 130.538C182.809 130.69 182.695 131.085 182.868 131.351C182.95 131.485 183.08 131.582 183.232 131.621C183.384 131.661 183.545 131.641 183.682 131.564ZM179.981 149.767C179.712 149.768 179.45 149.677 179.239 149.51C179.028 149.344 178.879 149.11 178.818 148.848C178.757 148.586 178.786 148.312 178.902 148.069C179.017 147.826 179.212 147.629 179.454 147.511C179.836 147.323 188.905 142.952 197.047 146.052C197.193 146.108 197.327 146.192 197.441 146.299C197.555 146.406 197.646 146.535 197.71 146.677C197.774 146.82 197.809 146.973 197.813 147.129C197.818 147.285 197.791 147.441 197.736 147.587C197.68 147.733 197.596 147.866 197.488 147.98C197.381 148.093 197.252 148.184 197.11 148.248C196.967 148.312 196.813 148.347 196.657 148.351C196.5 148.356 196.344 148.329 196.198 148.274C189.037 145.548 180.587 149.604 180.503 149.644C180.341 149.725 180.162 149.767 179.981 149.767ZM224.086 148.548C223.905 148.548 223.726 148.507 223.563 148.427C223.479 148.387 215.029 144.331 207.868 147.057C207.573 147.169 207.245 147.16 206.957 147.031C206.668 146.902 206.443 146.664 206.331 146.369C206.218 146.075 206.227 145.748 206.356 145.46C206.485 145.172 206.724 144.947 207.019 144.835C215.161 141.736 224.23 146.106 224.612 146.293C224.853 146.412 225.047 146.609 225.162 146.851C225.277 147.094 225.307 147.368 225.246 147.629C225.185 147.891 225.037 148.124 224.826 148.291C224.616 148.458 224.355 148.548 224.086 148.548Z" fill="#E24122"/>
|
||||
</g>
|
||||
<g clip-path="url(#clip1_10846_21558)">
|
||||
<path d="M176.364 244.053L140.476 127.163C140.287 126.536 139.899 125.986 139.369 125.596C138.84 125.206 138.199 124.997 137.54 125H49.4801C49.3959 125.001 49.3131 125.021 49.2369 125.056C49.2124 125.067 49.1915 125.082 49.1682 125.097C49.1399 125.114 49.108 125.125 49.0834 125.147L42.0438 131.098C41.6068 131.471 41.2831 131.958 41.1091 132.504C40.9352 133.049 40.9178 133.633 41.059 134.188L52.4295 178.18C52.3172 178.241 52.2273 178.336 52.1729 178.452L23.2627 243.713C22.8415 244.661 22.9299 245.745 23.4985 246.614C24.067 247.483 25.0285 248.001 26.071 248.001H60.2514C60.8805 248 61.494 247.807 62.0097 247.448C62.5253 247.089 62.9182 246.582 63.1358 245.995L67.14 235.09L69.8574 245.602C70.027 246.258 70.4106 246.839 70.948 247.254C71.4854 247.67 72.1462 247.895 72.8265 247.896L80.641 247.905C80.7352 247.965 80.8445 247.998 80.9566 248H173.428C174.411 248 175.31 247.549 175.896 246.762C176.482 245.975 176.65 244.989 176.364 244.053Z" fill="#F6A50C"/>
|
||||
<path d="M80.9566 248.001C80.8204 248.001 80.688 247.956 80.5805 247.873C80.4729 247.79 80.3961 247.673 80.3623 247.542L48.8846 125.764C48.8645 125.686 48.86 125.605 48.8713 125.526C48.8827 125.446 48.9097 125.37 48.9507 125.301C48.9918 125.232 49.0461 125.171 49.1106 125.123C49.1751 125.075 49.2485 125.04 49.3266 125.02C49.4047 125 49.4861 124.995 49.5659 125.006C49.6458 125.018 49.7226 125.045 49.7921 125.085C49.8615 125.126 49.9222 125.18 49.9706 125.245C50.0191 125.309 50.0543 125.382 50.0744 125.46L81.5522 247.237C81.5756 247.328 81.578 247.422 81.559 247.514C81.54 247.605 81.5003 247.691 81.4428 247.765C81.3853 247.839 81.3116 247.898 81.2273 247.939C81.143 247.98 81.0504 248.001 80.9566 248.001ZM67.199 236.959C67.0622 236.959 66.9293 236.914 66.8215 236.83C66.7136 236.747 66.6368 236.63 66.6035 236.497L51.8279 177.862C51.8083 177.784 51.8043 177.703 51.8161 177.623C51.828 177.544 51.8554 177.468 51.8968 177.399C51.9383 177.33 51.9929 177.27 52.0577 177.222C52.1224 177.174 52.196 177.14 52.2742 177.12C52.3524 177.101 52.4337 177.097 52.5135 177.109C52.5933 177.12 52.6699 177.148 52.739 177.189C52.8082 177.23 52.8685 177.285 52.9165 177.349C52.9646 177.413 52.9994 177.487 53.019 177.565L67.7946 236.199C67.8176 236.289 67.8196 236.384 67.8004 236.475C67.7813 236.566 67.7414 236.651 67.6839 236.725C67.6265 236.798 67.5529 236.857 67.4688 236.898C67.3848 236.939 67.2925 236.96 67.199 236.959Z" fill="black"/>
|
||||
<path d="M164.579 237.914L88.0774 238.383L61.2866 133.653L132.397 132.553L164.579 237.914Z" fill="white"/>
|
||||
<path d="M109.987 158.777C139.251 156.094 153.15 202.327 153.15 202.327L165.119 237.302L88.0771 238.382L82.1413 213.043C82.1413 213.044 75.3877 161.948 109.987 158.777Z" fill="#6166F0"/>
|
||||
<path d="M128.349 186.123C127.505 181.21 125.378 176.812 122.362 173.737C119.287 170.603 115.659 169.211 112.13 169.805C108.606 170.407 105.646 172.927 103.795 176.902C101.98 180.801 101.446 185.653 102.29 190.564C103.921 200.036 110.288 207.015 116.929 207.015C117.459 207.015 117.988 206.971 118.51 206.882C122.034 206.281 124.994 203.761 126.845 199.785C128.66 195.887 129.195 191.035 128.349 186.123Z" fill="#FCF1D5"/>
|
||||
<path d="M126.747 188.685C126.388 186.525 125.2 184.589 123.433 183.284C122.579 182.646 121.603 182.189 120.565 181.939C119.527 181.689 118.448 181.652 117.395 181.83C113.02 182.576 110.093 186.866 110.872 191.39C111.231 193.55 112.419 195.486 114.184 196.791C115.544 197.803 117.195 198.352 118.892 198.356C119.333 198.356 119.779 198.32 120.221 198.244C122.345 197.881 124.194 196.685 125.427 194.872C126.658 193.058 127.131 190.839 126.747 188.685Z" fill="black"/>
|
||||
<path d="M128.859 175.5C129.391 180.149 121.995 186.324 113.44 186.426C104.924 186.528 98.021 184.549 98.021 178.514C98.021 172.479 104.924 164.575 113.44 164.575C121.956 164.575 128.174 169.505 128.859 175.5Z" fill="#6166F0"/>
|
||||
<path d="M100.327 174.233C100.072 174.234 99.8228 174.156 99.6144 174.009C99.406 173.862 99.2487 173.655 99.1645 173.415C99.0803 173.175 99.0734 172.915 99.1447 172.671C99.216 172.427 99.362 172.212 99.5623 172.054C100.023 171.69 111.015 163.223 125.061 169.72C125.357 169.856 125.585 170.104 125.697 170.409C125.809 170.713 125.795 171.049 125.657 171.343C125.52 171.637 125.271 171.865 124.965 171.976C124.659 172.088 124.322 172.073 124.026 171.937C111.385 166.09 101.5 173.646 101.085 173.972C100.869 174.141 100.602 174.233 100.327 174.233ZM111.764 187.287C105.661 187.287 100.454 186.071 100.037 185.97C99.8778 185.936 99.7266 185.87 99.5929 185.776C99.4592 185.682 99.3456 185.563 99.2588 185.425C99.172 185.287 99.1137 185.134 99.0873 184.973C99.061 184.813 99.0671 184.648 99.1054 184.49C99.1437 184.332 99.2133 184.183 99.3101 184.052C99.407 183.921 99.5292 183.811 99.6696 183.727C99.8099 183.644 99.9656 183.589 100.127 183.566C100.289 183.543 100.454 183.553 100.612 183.595C100.799 183.639 119.297 187.95 126.597 180.165C126.822 179.937 127.127 179.805 127.447 179.797C127.768 179.79 128.079 179.908 128.314 180.125C128.548 180.343 128.688 180.644 128.703 180.963C128.717 181.282 128.606 181.594 128.393 181.832C124.334 186.161 117.635 187.287 111.764 187.287Z" fill="black"/>
|
||||
<path d="M131.538 183.349C129.107 183.349 127.002 182.129 126.868 182.05C126.588 181.885 126.385 181.615 126.305 181.301C126.224 180.987 126.272 180.654 126.437 180.375C126.603 180.097 126.874 179.895 127.189 179.814C127.505 179.734 127.839 179.781 128.12 179.947C128.179 179.981 131.682 181.976 133.881 180.076C134.127 179.863 134.448 179.757 134.773 179.779C135.098 179.802 135.4 179.952 135.614 180.197C135.827 180.442 135.935 180.761 135.912 181.084C135.889 181.408 135.738 181.709 135.492 181.921C134.249 182.996 132.846 183.349 131.538 183.349Z" fill="black"/>
|
||||
<path d="M137.036 201.307C136.455 199.973 134.993 199.262 133.633 198.97C131.319 198.471 128.735 198.795 126.613 199.836C125.594 200.336 124.666 201.062 124.04 202.015C123.408 202.976 122.934 204.505 123.556 205.568C124.532 207.239 127.265 206.892 128.848 206.673C131.024 206.374 133.281 205.838 135.3 204.96C135.992 204.647 136.685 204.235 137.035 203.531C137.381 202.834 137.342 202.008 137.036 201.307ZM111.139 202.385C109.157 201.098 106.533 200.654 104.207 200.941C102.755 201.121 101.169 201.62 100.271 202.849C99.7623 203.544 99.54 204.485 99.8102 205.32C100.096 206.201 100.872 206.707 101.678 207.071C103.431 207.834 105.36 208.312 107.239 208.644C108.942 208.946 111.636 209.457 113.058 208.13C113.937 207.31 113.777 205.959 113.362 204.944C112.922 203.867 112.11 203.014 111.139 202.385Z" fill="#E24122"/>
|
||||
<path d="M110.313 154.613C110.808 152.563 111.314 150.485 112.325 148.631C113.335 146.777 114.926 145.142 116.957 144.537C118.754 144.002 120.691 144.317 122.51 144.767C124.485 145.255 126.538 145.975 127.804 147.56C129.032 149.097 129.302 151.221 128.975 153.156C128.648 155.092 127.788 156.891 126.936 158.662" fill="#F9C8B7"/>
|
||||
<path d="M110.906 154.776C111.864 150.816 113.405 145.319 118.326 144.895C120.507 144.707 123.027 145.317 125.006 146.232C126.968 147.139 128.247 148.739 128.454 150.913C128.707 153.556 127.52 156.035 126.406 158.355C126.067 159.062 127.126 159.683 127.466 158.973C128.592 156.629 129.764 154.164 129.715 151.505C129.672 149.155 128.653 147.029 126.649 145.736C124.648 144.444 121.94 143.802 119.584 143.664C117.036 143.515 114.738 144.519 113.089 146.45C111.154 148.714 110.405 151.626 109.721 154.452C109.537 155.215 110.721 155.541 110.906 154.776Z" fill="black"/>
|
||||
<path d="M112.867 153.754L114.511 154.144C114.671 154.184 114.84 154.162 114.984 154.083C115.121 154.001 115.222 153.871 115.266 153.717C115.337 153.403 115.172 153.045 114.838 152.966L113.193 152.576C113.034 152.536 112.865 152.558 112.721 152.637C112.583 152.719 112.482 152.849 112.438 153.003C112.367 153.315 112.533 153.675 112.867 153.754ZM117.686 154.942L119.606 155.249C119.774 155.276 119.926 155.276 120.078 155.188C120.216 155.106 120.317 154.975 120.361 154.822C120.382 154.744 120.388 154.662 120.377 154.581C120.367 154.5 120.34 154.422 120.299 154.352C120.218 154.226 120.087 154.095 119.932 154.071L118.013 153.764C117.845 153.737 117.693 153.737 117.54 153.825C117.403 153.906 117.302 154.037 117.258 154.19C117.237 154.269 117.231 154.351 117.242 154.432C117.252 154.512 117.278 154.59 117.319 154.661C117.4 154.786 117.532 154.916 117.686 154.942ZM123.022 156.383L125.231 156.834C125.544 156.897 125.909 156.743 125.986 156.407C126.056 156.102 125.894 155.724 125.557 155.656L123.348 155.205C123.035 155.141 122.671 155.295 122.593 155.631C122.523 155.937 122.685 156.314 123.022 156.383ZM105.369 154.331L131.578 160.646C132.345 160.83 132.673 159.652 131.905 159.468L105.696 153.153C104.927 152.968 104.6 154.146 105.369 154.331Z" fill="black"/>
|
||||
<path d="M106.535 159.829C104.248 160.515 101.616 159.52 100.356 157.489C98.9049 155.151 99.8774 152.076 98.2001 149.798C95.6619 146.352 89.9202 146.552 88.1471 150.616C87.1905 152.807 87.5245 155.467 89.1982 157.22C89.6169 157.659 90.4028 157.207 90.2247 156.626C89.6844 154.87 89.0692 153.006 87.5442 151.845C86.2745 150.878 84.5419 150.584 83.1605 151.504C81.9203 152.33 81.2326 153.804 81.1455 155.261C81.0288 157.215 81.9657 159.073 82.8203 160.768L83.7843 160.027C82.5588 158.486 81.1663 156.863 79.1083 156.521C77.4199 156.241 75.7254 156.982 75.0734 158.611C74.4545 160.157 74.8425 161.987 75.4295 163.483C76.0164 164.978 76.9398 166.844 78.6761 167.225C80.0158 167.519 81.8012 166.667 81.8245 165.15C81.8478 163.621 79.5393 163.376 78.476 163.703C76.9349 164.179 75.9722 165.464 75.8679 167.052C75.7401 168.993 76.8625 170.865 78.1592 172.224C80.9551 175.157 85.4591 176.545 89.2571 174.809C89.9742 174.481 89.3517 173.426 88.637 173.754C86.2168 174.861 83.4061 174.38 81.1725 173.062C80.033 172.39 79.0003 171.491 78.2365 170.408C77.415 169.244 76.682 167.575 77.2996 166.16C77.6839 165.279 78.751 164.669 79.7112 164.771C80.0354 164.806 80.615 164.969 80.5671 165.316C80.4947 165.84 79.6253 166.079 79.2017 166.063C77.8964 166.016 77.1437 164.412 76.7102 163.389C76.251 162.306 75.89 161.066 76.0177 159.881C76.1859 158.32 77.4678 157.438 79.0101 157.741C80.7329 158.079 81.892 159.601 82.9186 160.891C83.3729 161.462 84.1784 160.736 83.8825 160.151C82.7872 157.981 81.2584 154.667 83.5927 152.704C84.6708 151.799 86.0989 152.148 87.069 153.035C88.1765 154.049 88.6161 155.565 89.0422 156.951L90.0688 156.357C88.6947 154.918 88.4897 152.641 89.3701 150.888C90.3033 149.032 92.3343 148.234 94.3284 148.693C96.6296 149.225 97.8231 150.955 98.1288 153.203C98.4506 155.577 98.5807 157.857 100.517 159.543C102.24 161.044 104.653 161.67 106.864 161.009C107.616 160.781 107.294 159.602 106.535 159.829Z" fill="#6166F0"/>
|
||||
<path d="M131.347 188.026C125.954 188.026 124.132 183.344 124.109 183.285C123.999 182.983 124.014 182.649 124.149 182.357C124.285 182.065 124.531 181.838 124.834 181.725C125.136 181.612 125.472 181.623 125.767 181.754C126.062 181.886 126.293 182.128 126.409 182.429C126.605 182.93 128.475 187.194 134.733 184.903C134.885 184.848 135.046 184.823 135.207 184.829C135.368 184.836 135.526 184.874 135.673 184.941C135.819 185.009 135.951 185.104 136.06 185.222C136.17 185.34 136.254 185.479 136.31 185.629C136.366 185.78 136.391 185.94 136.384 186.101C136.378 186.261 136.34 186.419 136.272 186.564C136.204 186.71 136.108 186.841 135.99 186.95C135.871 187.059 135.732 187.143 135.581 187.199C133.972 187.786 132.567 188.026 131.347 188.026Z" fill="black"/>
|
||||
<path d="M126.895 185.343C126.87 185.343 126.845 185.343 126.821 185.341C126.66 185.332 126.502 185.291 126.357 185.221C126.212 185.151 126.082 185.053 125.975 184.933C125.868 184.813 125.785 184.673 125.732 184.522C125.68 184.37 125.657 184.209 125.667 184.049L125.818 181.489C125.837 181.165 125.984 180.862 126.228 180.647C126.471 180.431 126.79 180.321 127.116 180.34C127.441 180.359 127.745 180.506 127.962 180.748C128.178 180.99 128.289 181.308 128.27 181.632L128.119 184.192C128.101 184.503 127.964 184.796 127.736 185.01C127.509 185.224 127.208 185.343 126.895 185.343Z" fill="black"/>
|
||||
<path d="M162.122 239.605H89.9673C89.1547 239.605 88.3651 239.337 87.7211 238.844C87.0772 238.35 86.615 237.659 86.4063 236.878L59.5431 135.936C59.3967 135.393 59.3785 134.824 59.4899 134.273C59.6013 133.722 59.8393 133.204 60.1853 132.76C60.5279 132.314 60.9697 131.953 61.476 131.705C61.9824 131.456 62.5397 131.328 63.1041 131.331H130.589C132.211 131.331 133.625 132.367 134.107 133.908L165.64 234.85C165.992 235.974 165.791 237.164 165.089 238.112C164.387 239.06 163.306 239.605 162.122 239.605ZM63.1041 133.775C62.916 133.774 62.7302 133.817 62.5615 133.899C62.3927 133.982 62.2455 134.103 62.1315 134.251C62.0162 134.399 61.9369 134.572 61.8998 134.756C61.8628 134.939 61.8689 135.129 61.9179 135.31L88.7799 236.252C88.9223 236.787 89.411 237.161 89.9673 237.161H162.122C162.315 237.162 162.505 237.118 162.677 237.031C162.849 236.945 162.998 236.819 163.111 236.664C163.226 236.51 163.303 236.331 163.335 236.142C163.367 235.953 163.353 235.759 163.295 235.576L131.762 134.634C131.685 134.384 131.53 134.166 131.318 134.012C131.107 133.857 130.852 133.774 130.589 133.775H63.1041Z" fill="#F6A50C"/>
|
||||
</g>
|
||||
<g clip-path="url(#clip2_10846_21558)">
|
||||
<path d="M167.983 99.1692C167.452 92.1953 159.352 90.9932 156.099 93.8281C155.501 90.3903 147.514 86.1373 143.273 91.6616C138.822 97.4588 147.248 110.049 150.112 114C154.655 112.299 168.542 106.489 167.983 99.1692Z" fill="#E24122"/>
|
||||
</g>
|
||||
<g clip-path="url(#clip3_10846_21558)">
|
||||
<path d="M147.961 62.5713C144.71 59.2943 140.166 62.1271 139.762 64.9307C137.992 63.4581 132.197 64.7108 132.452 69.2842C132.72 74.0842 142.304 76.8323 145.421 77.6013C146.953 74.8199 151.374 66.0102 147.961 62.5713Z" fill="#E24122"/>
|
||||
</g>
|
||||
<defs>
|
||||
<clipPath id="clip0_10846_21558">
|
||||
<rect width="139.5" height="163" fill="white" transform="translate(137 84)"/>
|
||||
</clipPath>
|
||||
<clipPath id="clip1_10846_21558">
|
||||
<rect width="153.5" height="123" fill="white" transform="translate(23 125)"/>
|
||||
</clipPath>
|
||||
<clipPath id="clip2_10846_21558">
|
||||
<rect width="26" height="25" fill="white" transform="translate(142 89)"/>
|
||||
</clipPath>
|
||||
<clipPath id="clip3_10846_21558">
|
||||
<rect width="17" height="16.5" fill="white" transform="translate(130.679 68.4878) rotate(-40.4556)"/>
|
||||
</clipPath>
|
||||
</defs>
|
||||
</svg>
|
||||
|
After Width: | Height: | Size: 25 KiB |
68
apps/core/public/imgs/no-result.svg
Normal file
@@ -0,0 +1,68 @@
|
||||
<svg
|
||||
width="156"
|
||||
height="100"
|
||||
viewBox="0 0 156 100"
|
||||
fill="none"
|
||||
xmlns="http://www.w3.org/2000/svg"
|
||||
>
|
||||
<g clip-path="url(#clip0_10846_21787)">
|
||||
<path
|
||||
d="M39.4187 37.5349C22.2581 37.5349 7.0595 50.1896 8.29792 65.6334C9.1854 76.6959 25.1286 93.4946 39.4187 93.732C56.5764 94.0171 70.5394 81.1271 70.5394 65.6334C70.5394 50.1397 56.5792 37.5349 39.4187 37.5349Z"
|
||||
fill="#6166F0"
|
||||
/>
|
||||
<path
|
||||
d="M39.4187 47.5859C34.3599 47.5859 30.2447 51.7124 30.2447 56.7849C30.2447 61.8575 34.3599 65.9847 39.4187 65.9847C44.4774 65.9847 48.5926 61.8575 48.5926 56.7849C48.5926 51.7124 44.4774 47.5859 39.4187 47.5859Z"
|
||||
fill="#FCF1D5"
|
||||
/>
|
||||
<path
|
||||
d="M39.708 61.191C42.1823 61.191 44.1881 59.1796 44.1881 56.6986C44.1881 54.2175 42.1823 52.2062 39.708 52.2062C37.2336 52.2062 35.2278 54.2175 35.2278 56.6986C35.2278 59.1796 37.2336 61.191 39.708 61.191Z"
|
||||
fill="black"
|
||||
/>
|
||||
<path
|
||||
d="M27.5711 39.8472C27.5424 39.8191 27.5172 39.7868 27.4884 39.7587C27.4632 39.7341 27.5781 39.9048 27.4919 39.7601C27.4219 39.6428 27.3469 39.5304 27.2825 39.4096C27.1767 39.2116 27.0804 39.0086 26.9939 38.8014C27.064 38.9643 26.933 38.6476 26.9148 38.6019C26.554 37.6762 26.2822 36.7153 26.0602 35.7474C25.4858 33.2491 25.254 30.6468 25.5012 28.0908C25.7576 25.4422 26.6416 22.7507 28.5216 20.8086C29.4798 19.8183 30.6601 18.9705 31.9174 18.4072C32.8729 17.9787 33.7786 17.7884 34.7991 17.9015C34.8222 17.9043 34.9364 17.9219 34.8131 17.9029C35.0842 17.9441 35.351 18.0099 35.6103 18.0996C35.6614 18.1171 35.943 18.2309 35.833 18.1824C36.2092 18.3496 36.6589 18.6369 36.8578 18.8061C37.58 19.4214 38.003 20.0058 38.4261 20.8746C39.2267 22.5189 39.4649 24.664 39.1301 26.4768C38.763 28.461 37.7775 30.2717 36.1055 31.3471C35.0758 32.0087 33.6455 31.9448 32.6032 31.3309C32.1374 31.057 31.7654 30.6545 31.6786 30.1116C31.5322 29.1999 31.8649 28.2552 32.3237 27.4826C34.2311 24.2713 38.5886 22.6741 42.1133 23.7881C43.6964 24.2882 45.1631 25.313 46.106 26.6917C47.102 28.1484 47.6918 30.1572 46.5241 31.6842C46.3189 31.9525 46.0681 32.2187 45.7802 32.3985C45.6745 32.4645 45.5512 32.4849 45.4503 32.5453C45.458 32.5404 45.5764 32.454 45.402 32.5425C45.4349 32.5256 45.5568 32.6148 45.4048 32.5214L45.7515 33.1276C45.7473 32.9871 45.7466 32.9702 45.8202 32.8642C45.8825 32.7743 45.755 32.9386 45.8258 32.8494C45.8538 32.8143 45.8853 32.7813 45.9175 32.7504C46.0352 32.6373 46.0128 32.6549 46.1165 32.5882C46.522 32.3262 46.9549 32.1892 47.4312 32.0831C48.5071 31.8429 49.7021 31.8436 50.7605 32.1653C53.2598 32.926 54.494 36.1843 53.3879 38.4902C52.0283 41.325 48.6479 42.3744 45.727 42.1348C44.0116 41.9944 42.3319 41.6706 40.6031 41.6952C39.1364 41.7162 37.6808 41.896 36.2232 42.0435C34.7725 42.1903 33.2693 42.3252 31.8236 42.0611C30.1943 41.7626 28.7822 40.9724 27.5711 39.8472C26.9106 39.2333 25.9173 40.2244 26.5806 40.8404C27.6565 41.8398 28.8802 42.6476 30.2777 43.114C31.4825 43.5157 32.7727 43.6323 34.0363 43.6021C36.7611 43.5368 39.4418 42.9517 42.1778 43.1392C43.8505 43.2537 45.5064 43.6485 47.1903 43.5761C48.7211 43.5126 50.2149 43.0842 51.5478 42.3266C54.0001 40.9225 55.6308 38.3294 55.0936 35.4489C54.8491 34.1362 54.1493 32.8677 53.1554 31.9764C52.2147 31.1335 51.1206 30.7121 49.88 30.5695C48.7677 30.4417 47.5741 30.5323 46.5059 30.8779C45.6331 31.1609 44.6679 31.6765 44.4066 32.6324C44.3415 32.8691 44.3163 33.1683 44.4129 33.3973C44.5607 33.7492 44.9705 33.9114 45.3291 33.9388C45.9161 33.9838 46.4415 33.6775 46.8821 33.3207C47.4258 32.8792 47.8614 32.3187 48.1557 31.6822C48.45 31.0457 48.5952 30.3501 48.58 29.6487C48.5015 26.6334 46.1585 23.9876 43.5045 22.8223C40.6753 21.5812 37.4567 21.8559 34.7711 23.3456C33.408 24.1014 32.1787 25.164 31.3101 26.4655C30.5088 27.6659 29.9253 29.3621 30.4115 30.7964C31.1708 33.0391 34.2829 33.7099 36.2617 32.8537C37.837 32.1716 39.0909 30.6173 39.7787 29.0798C41.1285 26.0631 41.0024 22.1916 39.1966 19.3786C38.3729 18.0953 37.1646 17.0474 35.6719 16.6506C33.9004 16.18 32.0589 16.6857 30.4955 17.5552C28.481 18.6762 26.7522 20.3338 25.6819 22.3883C24.6355 24.3985 24.164 26.6538 24.0387 28.9049C23.921 31.0198 24.1171 33.155 24.5213 35.2319C24.8225 36.7792 25.2351 38.3364 25.9005 39.7699C26.0749 40.1464 26.2794 40.5489 26.5806 40.8404C27.2293 41.469 28.2211 40.4765 27.5711 39.8472ZM69.6848 71.5538C65.7272 71.5538 62.3566 69.7375 61.2982 67.0334C61.2142 66.8187 61.1732 66.5895 61.1775 66.3589C61.1818 66.1283 61.2313 65.9008 61.3233 65.6895C61.4153 65.4781 61.5479 65.2869 61.7135 65.1269C61.8791 64.9669 62.0746 64.8412 62.2887 64.757C62.5028 64.6727 62.7313 64.6315 62.9613 64.6359C63.1912 64.6402 63.4181 64.6899 63.6289 64.7821C63.8397 64.8743 64.0303 65.0073 64.1899 65.1734C64.3495 65.3395 64.4748 65.5354 64.5589 65.7501C65.0702 67.0565 67.2739 68.042 69.6855 68.042C74.4998 68.042 76.9416 65.5183 77.3696 60.1002C77.6351 56.7464 77.0446 52.3909 75.6626 47.5031C75.542 47.057 75.6017 46.5813 75.8287 46.1791C76.0556 45.7768 76.4316 45.4806 76.875 45.3545C77.3184 45.2284 77.7935 45.2827 78.1973 45.5056C78.601 45.7284 78.9009 46.1019 79.0318 46.5451C80.5476 51.9049 81.1626 56.5588 80.8607 60.3776C80.2905 67.5847 76.3217 71.5538 69.6848 71.5538Z"
|
||||
fill="#6166F0"
|
||||
/>
|
||||
<path
|
||||
d="M39.2358 69.3196C35.4863 69.3196 31.6933 67.9204 28.5328 65.3167C28.4618 65.2582 28.4029 65.1862 28.3596 65.1049C28.3163 65.0235 28.2893 64.9345 28.2804 64.8427C28.2714 64.7509 28.2805 64.6583 28.3073 64.5701C28.334 64.4818 28.3778 64.3997 28.4361 64.3285C28.4945 64.2572 28.5663 64.1982 28.6474 64.1548C28.7285 64.1113 28.8174 64.0844 28.9089 64.0754C29.0004 64.0664 29.0928 64.0755 29.1808 64.1023C29.2688 64.1291 29.3506 64.173 29.4217 64.2316C32.9611 67.1471 37.3474 68.4233 41.4556 67.7301C45.4678 67.0537 48.9036 64.5448 51.393 60.4732C51.4403 60.393 51.5031 60.3231 51.5776 60.2675C51.6521 60.2118 51.7369 60.1717 51.8271 60.1492C51.9173 60.1268 52.011 60.1226 52.1028 60.1368C52.1946 60.151 52.2826 60.1834 52.3618 60.2321C52.441 60.2807 52.5098 60.3447 52.5641 60.4203C52.6184 60.4959 52.6572 60.5815 52.6782 60.6723C52.6992 60.763 52.7019 60.857 52.6863 60.9489C52.6707 61.0407 52.6371 61.1285 52.5873 61.2071C49.88 65.6349 46.1116 68.3693 41.6882 69.1152C40.8778 69.2517 40.0575 69.3201 39.2358 69.3196ZM43.4771 85.0387C43.2474 84.5056 40.6396 77.432 40.608 77.2508C40.6291 77.2262 41.6713 75.8446 42.1161 75.2996C42.4411 74.895 42.8404 74.4329 42.6576 73.8745C42.5126 73.4327 42.044 73.229 41.6209 73.163C40.3993 72.9719 39.1119 72.9768 37.8868 73.0583C37.3607 73.0934 36.8655 73.1876 36.6518 73.7558C36.4704 74.2397 36.6708 74.7159 36.9685 75.1022C37.339 75.5834 37.7551 76.0329 38.1501 76.4943L38.7728 77.222L38.8156 77.2705C38.7413 77.5058 38.6573 77.7389 38.576 77.9672C37.7534 80.2666 36.8658 82.542 35.9143 84.7908C35.908 84.8055 35.9094 84.8196 35.9052 84.8343C35.8975 84.8484 35.8855 84.8582 35.8792 84.8744C35.6453 85.4524 35.8589 85.8605 36.1685 86.3585C36.4886 86.8726 38.6748 89.784 39.5139 90.6627C39.58 90.7276 39.6689 90.7641 39.7615 90.7641C39.8541 90.7641 39.943 90.7276 40.0092 90.6627C40.6963 89.9378 43.3945 86.5292 43.5731 86.0923C43.7244 85.7179 43.6305 85.3948 43.4771 85.0387Z"
|
||||
fill="black"
|
||||
/>
|
||||
<path
|
||||
d="M76.6425 48.8123C76.3904 48.8123 74.165 48.7681 73.7048 47.2257C73.6515 47.0472 73.671 46.8548 73.7592 46.6908C73.8473 46.5268 73.9968 46.4047 74.1748 46.3512C74.3528 46.2977 74.5446 46.3174 74.7082 46.4057C74.8717 46.4941 74.9936 46.644 75.0469 46.8225C75.1575 47.1941 76.0618 47.4041 76.6439 47.4069C76.8298 47.4071 77.008 47.4813 77.1393 47.6132C77.2706 47.7451 77.3442 47.9239 77.344 48.1103C77.3438 48.2967 77.2698 48.4753 77.1383 48.607C77.0067 48.7387 76.8284 48.8125 76.6425 48.8123Z"
|
||||
fill="#6166F0"
|
||||
/>
|
||||
<path
|
||||
d="M76.2439 47.6098C76.1001 47.6098 75.9597 47.5654 75.8419 47.4826C75.7241 47.3997 75.6346 47.2826 75.5855 47.1469L74.628 44.4983C74.567 44.3237 74.5771 44.1321 74.6561 43.965C74.7352 43.7979 74.8768 43.6688 75.0502 43.6057C75.2235 43.5426 75.4148 43.5507 75.5823 43.6281C75.7498 43.7055 75.8801 43.8461 75.9449 44.0193L76.9024 46.6679C76.9408 46.774 76.9531 46.8878 76.9383 46.9997C76.9235 47.1115 76.8821 47.2182 76.8175 47.3106C76.7529 47.403 76.667 47.4784 76.5672 47.5305C76.4674 47.5826 76.3565 47.6098 76.2439 47.6098ZM77.6253 46.9643C77.4541 46.9642 77.289 46.9013 77.161 46.7874C77.0329 46.6735 76.9509 46.5166 76.9304 46.3462L76.611 43.7032C76.5887 43.5182 76.6406 43.3319 76.7553 43.1853C76.87 43.0387 77.038 42.9438 77.2225 42.9215C77.407 42.8991 77.5927 42.9511 77.7389 43.0661C77.8851 43.1811 77.9798 43.3497 78.0021 43.5346L78.3215 46.1777C78.3334 46.2764 78.3243 46.3765 78.2947 46.4714C78.2651 46.5663 78.2158 46.6538 78.15 46.7282C78.0842 46.8025 78.0034 46.862 77.9129 46.9028C77.8225 46.9435 77.7244 46.9645 77.6253 46.9643Z"
|
||||
fill="#6166F0"
|
||||
/>
|
||||
<path
|
||||
d="M78.559 47.3711C78.3971 47.3711 78.2401 47.3149 78.1149 47.2119C77.9896 47.109 77.9038 46.9658 77.872 46.8066C77.8402 46.6474 77.8644 46.482 77.9405 46.3387C78.0166 46.1953 78.1398 46.0829 78.2893 46.0204C78.3601 45.9874 78.8868 45.7099 78.8868 44.7624C78.8868 44.5762 78.9606 44.3975 79.092 44.2658C79.2233 44.1341 79.4015 44.0601 79.5873 44.0601C79.773 44.0601 79.9512 44.1341 80.0826 44.2658C80.2139 44.3975 80.2877 44.5762 80.2877 44.7624C80.2877 46.3259 79.3617 47.107 78.814 47.3226C78.7327 47.3546 78.6463 47.3711 78.559 47.3711Z"
|
||||
fill="#6166F0"
|
||||
/>
|
||||
<path
|
||||
d="M153.975 95.8553C152.352 99.2028 148.33 100.596 144.991 98.9689L88.0537 74.6765L93.932 62.5549L150.87 86.8473C151.663 87.2342 152.373 87.7742 152.959 88.4363C153.545 89.0985 153.995 89.8698 154.283 90.7063C154.571 91.5428 154.692 92.4281 154.64 93.3115C154.587 94.195 154.361 95.0594 153.975 95.8553Z"
|
||||
fill="#F9C8B7"
|
||||
/>
|
||||
<path
|
||||
d="M147.925 100.002C146.868 100.002 145.816 99.7612 144.839 99.2843L87.5781 74.8543L93.7632 62.0999L151.007 86.5236C152.722 87.3587 153.997 88.8007 154.614 90.591C155.231 92.3814 155.116 94.3052 154.29 96.0084L153.975 95.8546L154.29 96.0084C153.886 96.8473 153.32 97.5975 152.625 98.2155C151.93 98.8336 151.119 99.3071 150.241 99.6088C149.483 99.8722 148.702 100.002 147.925 100.002ZM88.53 74.4975L145.129 98.6452C146.675 99.3988 148.403 99.5027 150.011 98.9451C151.62 98.3874 152.916 97.2355 153.659 95.7008C154.403 94.1661 154.508 92.4326 153.952 90.82C153.395 89.2073 152.247 87.9079 150.716 87.162L94.1008 63.0073L88.53 74.4975Z"
|
||||
fill="#F9C8B7"
|
||||
/>
|
||||
<path
|
||||
d="M24.3413 7.24359C1.83337 20.8865 -5.38417 50.2416 8.22087 72.8117C21.8259 95.3819 51.1016 102.618 73.6095 88.9755C96.1174 75.3333 103.335 45.9775 89.7292 23.4081C76.1235 0.838624 46.8491 -6.39865 24.3413 7.24359ZM70.2144 83.3432C50.8088 95.1051 25.5685 88.8659 13.8379 69.4073C2.10865 49.948 8.33084 24.6386 27.7364 12.8766C47.1419 1.11466 72.3823 7.35386 84.1122 26.8132C95.8428 46.2711 89.6199 71.5812 70.2144 83.3432Z"
|
||||
fill="#F9C8B7"
|
||||
/>
|
||||
<path
|
||||
d="M49.0549 96.2008C32.8 96.2008 16.9262 87.931 7.92107 72.9929C1.29262 61.9972 -0.668668 49.0707 2.39865 36.5958C5.46596 24.1209 13.1941 13.5895 24.1598 6.94293C46.7966 -6.77727 76.3462 0.526733 90.0297 23.2261C103.713 45.9255 96.4284 75.5552 73.7909 89.2761C66.3322 93.8091 57.7766 96.2042 49.0549 96.2008ZM24.3413 7.24355L24.5227 7.54417C13.7167 14.0938 6.10128 24.4707 3.07879 36.7637C0.0563084 49.0567 1.98958 61.7943 8.52067 72.6298C22.0045 94.9977 51.1219 102.196 73.4288 88.6749C95.7356 75.1541 102.914 45.9571 89.4301 23.5892C75.947 1.22208 46.8288 -5.97656 24.5227 7.54417L24.3413 7.24355ZM49.0437 89.621C35.0128 89.621 21.3111 82.4827 13.5388 69.5885C1.72761 49.995 8.01564 24.4194 27.555 12.576C37.0203 6.83898 48.1478 5.14134 58.8865 7.79562C69.6253 10.4506 78.6907 17.1393 84.412 26.6312C90.1334 36.1224 91.8264 47.2797 89.1793 58.0485C86.5316 68.8166 79.8611 77.9067 70.3958 83.6437C63.9574 87.5566 56.5722 89.624 49.0437 89.621ZM48.9022 7.27516C41.5698 7.27516 34.3536 9.27622 27.9178 13.1772C8.70839 24.8198 2.52683 49.9627 14.1384 69.2254C25.7499 88.4873 50.8243 94.6858 70.0337 83.0425C79.3393 77.4024 85.897 68.4661 88.4999 57.8799C91.1028 47.2937 89.4378 36.3254 83.8131 26.9944C78.1884 17.6633 69.2765 11.0877 58.7191 8.47762C55.5072 7.68087 52.2109 7.27711 48.9022 7.27516Z"
|
||||
fill="#F9C8B7"
|
||||
/>
|
||||
</g>
|
||||
<defs>
|
||||
<clipPath id="clip0_10846_21787">
|
||||
<rect
|
||||
width="154.006"
|
||||
height="100"
|
||||
fill="white"
|
||||
transform="translate(0.997025)"
|
||||
/>
|
||||
</clipPath>
|
||||
</defs>
|
||||
</svg>
|
||||
|
After Width: | Height: | Size: 12 KiB |
42
apps/core/public/manifest.json
Executable file
@@ -0,0 +1,42 @@
|
||||
{
|
||||
"name": "AFFiNE",
|
||||
"short_name": "AFFiNE",
|
||||
"icons": [
|
||||
{
|
||||
"src": "/favicon-36.png",
|
||||
"sizes": "36x36",
|
||||
"type": "image/png",
|
||||
"density": 0.75
|
||||
},
|
||||
{
|
||||
"src": "/favicon-48.png",
|
||||
"sizes": "48x48",
|
||||
"type": "image/png",
|
||||
"density": 1
|
||||
},
|
||||
{
|
||||
"src": "/favicon-72.png",
|
||||
"sizes": "72x72",
|
||||
"type": "image/png",
|
||||
"density": 1.5
|
||||
},
|
||||
{
|
||||
"src": "/favicon-96.png",
|
||||
"sizes": "96x96",
|
||||
"type": "image/png",
|
||||
"density": 2
|
||||
},
|
||||
{
|
||||
"src": "/favicon-144.png",
|
||||
"sizes": "144x144",
|
||||
"type": "image/png",
|
||||
"density": 3
|
||||
},
|
||||
{
|
||||
"src": "/favicon-192.png",
|
||||
"sizes": "192x192",
|
||||
"type": "image/png",
|
||||
"density": 4
|
||||
}
|
||||
]
|
||||
}
|
||||
|
After Width: | Height: | Size: 710 KiB |
|
After Width: | Height: | Size: 1.3 MiB |
|
After Width: | Height: | Size: 822 KiB |
|
After Width: | Height: | Size: 363 KiB |
|
After Width: | Height: | Size: 945 KiB |
|
After Width: | Height: | Size: 1.4 MiB |
|
After Width: | Height: | Size: 380 KiB |
|
After Width: | Height: | Size: 6.8 MiB |
BIN
apps/core/public/switchVideo.mp4
Normal file
15
apps/core/server.mts
Normal file
@@ -0,0 +1,15 @@
|
||||
// static server for web app
|
||||
import express from 'express';
|
||||
const app = express();
|
||||
|
||||
const PORT = process.env.PORT || 8080;
|
||||
|
||||
app.use('/', express.static('dist'));
|
||||
|
||||
app.get('/*', (req, res) => {
|
||||
res.sendFile('index.html', { root: 'dist' });
|
||||
});
|
||||
|
||||
app.listen(PORT, () => {
|
||||
console.log(`Server is running on port ${PORT}`);
|
||||
});
|
||||
120
apps/core/src/adapters/local/index.tsx
Normal file
@@ -0,0 +1,120 @@
|
||||
import { DebugLogger } from '@affine/debug';
|
||||
import { initEmptyPage, initPageWithPreloading } from '@affine/env/blocksuite';
|
||||
import {
|
||||
DEFAULT_HELLO_WORLD_PAGE_ID_SUFFIX,
|
||||
DEFAULT_WORKSPACE_NAME,
|
||||
PageNotFoundError,
|
||||
} from '@affine/env/constant';
|
||||
import type { LocalIndexedDBDownloadProvider } from '@affine/env/workspace';
|
||||
import type { WorkspaceAdapter } from '@affine/env/workspace';
|
||||
import {
|
||||
LoadPriority,
|
||||
ReleaseType,
|
||||
WorkspaceFlavour,
|
||||
} from '@affine/env/workspace';
|
||||
import {
|
||||
CRUD,
|
||||
saveWorkspaceToLocalStorage,
|
||||
} from '@affine/workspace/local/crud';
|
||||
import { createIndexedDBDownloadProvider } from '@affine/workspace/providers';
|
||||
import { createEmptyBlockSuiteWorkspace } from '@affine/workspace/utils';
|
||||
import { nanoid } from '@blocksuite/store';
|
||||
import { useStaticBlockSuiteWorkspace } from '@toeverything/plugin-infra/__internal__/react';
|
||||
|
||||
import {
|
||||
BlockSuitePageList,
|
||||
NewWorkspaceSettingDetail,
|
||||
PageDetailEditor,
|
||||
WorkspaceHeader,
|
||||
} from '../shared';
|
||||
|
||||
const logger = new DebugLogger('use-create-first-workspace');
|
||||
|
||||
export const LocalAdapter: WorkspaceAdapter<WorkspaceFlavour.LOCAL> = {
|
||||
releaseType: ReleaseType.STABLE,
|
||||
flavour: WorkspaceFlavour.LOCAL,
|
||||
loadPriority: LoadPriority.LOW,
|
||||
Events: {
|
||||
'app:init': () => {
|
||||
const blockSuiteWorkspace = createEmptyBlockSuiteWorkspace(
|
||||
nanoid(),
|
||||
WorkspaceFlavour.LOCAL
|
||||
);
|
||||
blockSuiteWorkspace.meta.setName(DEFAULT_WORKSPACE_NAME);
|
||||
const page = blockSuiteWorkspace.createPage({
|
||||
id: `${blockSuiteWorkspace.id}-${DEFAULT_HELLO_WORLD_PAGE_ID_SUFFIX}`,
|
||||
});
|
||||
if (runtimeConfig.enablePreloading) {
|
||||
initPageWithPreloading(page).catch(err => {
|
||||
logger.error('init page with preloading failed', err);
|
||||
});
|
||||
} else {
|
||||
initEmptyPage(page).catch(error => {
|
||||
logger.error('init page with empty failed', error);
|
||||
});
|
||||
}
|
||||
blockSuiteWorkspace.setPageMeta(page.id, {
|
||||
jumpOnce: true,
|
||||
});
|
||||
const provider = createIndexedDBDownloadProvider(
|
||||
blockSuiteWorkspace.id,
|
||||
blockSuiteWorkspace.doc,
|
||||
{
|
||||
awareness: blockSuiteWorkspace.awarenessStore.awareness,
|
||||
}
|
||||
) as LocalIndexedDBDownloadProvider;
|
||||
provider.sync();
|
||||
provider.whenReady.catch(console.error);
|
||||
saveWorkspaceToLocalStorage(blockSuiteWorkspace.id);
|
||||
logger.debug('create first workspace');
|
||||
return [blockSuiteWorkspace.id];
|
||||
},
|
||||
},
|
||||
CRUD,
|
||||
UI: {
|
||||
Header: WorkspaceHeader,
|
||||
Provider: ({ children }) => {
|
||||
return <>{children}</>;
|
||||
},
|
||||
PageDetail: ({ currentWorkspaceId, currentPageId, onLoadEditor }) => {
|
||||
const workspace = useStaticBlockSuiteWorkspace(currentWorkspaceId);
|
||||
const page = workspace.getPage(currentPageId);
|
||||
if (!page) {
|
||||
throw new PageNotFoundError(workspace, currentPageId);
|
||||
}
|
||||
return (
|
||||
<>
|
||||
<PageDetailEditor
|
||||
pageId={currentPageId}
|
||||
onInit={initEmptyPage}
|
||||
onLoad={onLoadEditor}
|
||||
workspace={workspace}
|
||||
/>
|
||||
</>
|
||||
);
|
||||
},
|
||||
PageList: ({ blockSuiteWorkspace, onOpenPage, collection }) => {
|
||||
return (
|
||||
<BlockSuitePageList
|
||||
listType="all"
|
||||
collection={collection}
|
||||
onOpenPage={onOpenPage}
|
||||
blockSuiteWorkspace={blockSuiteWorkspace}
|
||||
/>
|
||||
);
|
||||
},
|
||||
NewSettingsDetail: ({
|
||||
currentWorkspaceId,
|
||||
onDeleteWorkspace,
|
||||
onTransformWorkspace,
|
||||
}) => {
|
||||
return (
|
||||
<NewWorkspaceSettingDetail
|
||||
onDeleteWorkspace={onDeleteWorkspace}
|
||||
workspaceId={currentWorkspaceId}
|
||||
onTransferWorkspace={onTransformWorkspace}
|
||||
/>
|
||||
);
|
||||
},
|
||||
},
|
||||
};
|
||||
29
apps/core/src/adapters/shared.ts
Normal file
@@ -0,0 +1,29 @@
|
||||
import { lazy } from 'react';
|
||||
|
||||
export const NewWorkspaceSettingDetail = lazy(() =>
|
||||
import('../components/affine/new-workspace-setting-detail').then(
|
||||
({ WorkspaceSettingDetail }) => ({
|
||||
default: WorkspaceSettingDetail,
|
||||
})
|
||||
)
|
||||
);
|
||||
|
||||
export const BlockSuitePageList = lazy(() =>
|
||||
import('../components/blocksuite/block-suite-page-list').then(
|
||||
({ BlockSuitePageList }) => ({
|
||||
default: BlockSuitePageList,
|
||||
})
|
||||
)
|
||||
);
|
||||
|
||||
export const PageDetailEditor = lazy(() =>
|
||||
import('../components/page-detail-editor').then(({ PageDetailEditor }) => ({
|
||||
default: PageDetailEditor,
|
||||
}))
|
||||
);
|
||||
|
||||
export const WorkspaceHeader = lazy(() =>
|
||||
import('../components/workspace-header').then(({ WorkspaceHeader }) => ({
|
||||
default: WorkspaceHeader,
|
||||
}))
|
||||
);
|
||||
79
apps/core/src/adapters/workspace.ts
Normal file
@@ -0,0 +1,79 @@
|
||||
import { Unreachable } from '@affine/env/constant';
|
||||
import type {
|
||||
AppEvents,
|
||||
WorkspaceAdapter,
|
||||
WorkspaceUISchema,
|
||||
} from '@affine/env/workspace';
|
||||
import {
|
||||
LoadPriority,
|
||||
ReleaseType,
|
||||
WorkspaceFlavour,
|
||||
} from '@affine/env/workspace';
|
||||
|
||||
import { LocalAdapter } from './local';
|
||||
|
||||
const unimplemented = () => {
|
||||
throw new Error('Not implemented');
|
||||
};
|
||||
|
||||
const bypassList = async () => {
|
||||
return [];
|
||||
};
|
||||
|
||||
export const WorkspaceAdapters = {
|
||||
[WorkspaceFlavour.LOCAL]: LocalAdapter,
|
||||
[WorkspaceFlavour.AFFINE_CLOUD]: {
|
||||
releaseType: ReleaseType.UNRELEASED,
|
||||
flavour: WorkspaceFlavour.AFFINE_CLOUD,
|
||||
loadPriority: LoadPriority.HIGH,
|
||||
Events: {} as Partial<AppEvents>,
|
||||
// todo: implement this
|
||||
CRUD: {
|
||||
get: unimplemented,
|
||||
list: bypassList,
|
||||
delete: unimplemented,
|
||||
create: unimplemented,
|
||||
},
|
||||
// todo: implement this
|
||||
UI: {
|
||||
Provider: unimplemented,
|
||||
Header: unimplemented,
|
||||
PageDetail: unimplemented,
|
||||
PageList: unimplemented,
|
||||
NewSettingsDetail: unimplemented,
|
||||
},
|
||||
},
|
||||
[WorkspaceFlavour.PUBLIC]: {
|
||||
releaseType: ReleaseType.UNRELEASED,
|
||||
flavour: WorkspaceFlavour.PUBLIC,
|
||||
loadPriority: LoadPriority.LOW,
|
||||
Events: {} as Partial<AppEvents>,
|
||||
// todo: implement this
|
||||
CRUD: {
|
||||
get: unimplemented,
|
||||
list: bypassList,
|
||||
delete: unimplemented,
|
||||
create: unimplemented,
|
||||
},
|
||||
// todo: implement this
|
||||
UI: {
|
||||
Provider: unimplemented,
|
||||
Header: unimplemented,
|
||||
PageDetail: unimplemented,
|
||||
PageList: unimplemented,
|
||||
NewSettingsDetail: unimplemented,
|
||||
},
|
||||
},
|
||||
} satisfies {
|
||||
[Key in WorkspaceFlavour]: WorkspaceAdapter<Key>;
|
||||
};
|
||||
|
||||
export function getUIAdapter<Flavour extends WorkspaceFlavour>(
|
||||
flavour: Flavour
|
||||
): WorkspaceUISchema<Flavour> {
|
||||
const ui = WorkspaceAdapters[flavour].UI as WorkspaceUISchema<Flavour>;
|
||||
if (!ui) {
|
||||
throw new Unreachable();
|
||||
}
|
||||
return ui;
|
||||
}
|
||||
158
apps/core/src/app.tsx
Normal file
@@ -0,0 +1,158 @@
|
||||
import '@affine/component/theme/global.css';
|
||||
import '@affine/component/theme/theme.css';
|
||||
|
||||
import { AffineContext } from '@affine/component/context';
|
||||
import { WorkspaceFallback } from '@affine/component/workspace';
|
||||
import { createI18n, setUpLanguage } from '@affine/i18n';
|
||||
import { CacheProvider } from '@emotion/react';
|
||||
import type { RouterState } from '@remix-run/router';
|
||||
import {
|
||||
currentPageIdAtom,
|
||||
currentWorkspaceIdAtom,
|
||||
} from '@toeverything/plugin-infra/manager';
|
||||
import type { PropsWithChildren, ReactElement } from 'react';
|
||||
import { lazy, memo, Suspense, useEffect } from 'react';
|
||||
import { createBrowserRouter, RouterProvider } from 'react-router-dom';
|
||||
|
||||
import { historyBaseAtom, MAX_HISTORY } from './atoms/history';
|
||||
import createEmotionCache from './utils/create-emotion-cache';
|
||||
|
||||
const router = createBrowserRouter([
|
||||
{
|
||||
path: '/',
|
||||
lazy: () => import('./pages/index'),
|
||||
},
|
||||
{
|
||||
path: '/404',
|
||||
lazy: () => import('./pages/404'),
|
||||
},
|
||||
{
|
||||
path: '/workspace/:workspaceId/all',
|
||||
lazy: () => import('./pages/workspace/all-page'),
|
||||
},
|
||||
{
|
||||
path: '/workspace/:workspaceId/trash',
|
||||
lazy: () => import('./pages/workspace/trash-page'),
|
||||
},
|
||||
{
|
||||
path: '/workspace/:workspaceId/:pageId',
|
||||
lazy: () => import('./pages/workspace/detail-page'),
|
||||
},
|
||||
]);
|
||||
|
||||
//#region atoms bootstrap
|
||||
|
||||
currentWorkspaceIdAtom.onMount = set => {
|
||||
const callback = (state: RouterState) => {
|
||||
const value = state.location.pathname.split('/')[2];
|
||||
if (value) {
|
||||
set(value);
|
||||
localStorage.setItem('last_workspace_id', value);
|
||||
} else {
|
||||
set(null);
|
||||
}
|
||||
};
|
||||
callback(router.state);
|
||||
|
||||
const unsubscribe = router.subscribe(callback);
|
||||
return () => {
|
||||
unsubscribe();
|
||||
};
|
||||
};
|
||||
|
||||
currentPageIdAtom.onMount = set => {
|
||||
const callback = (state: RouterState) => {
|
||||
const value = state.location.pathname.split('/')[3];
|
||||
if (value) {
|
||||
set(value);
|
||||
} else {
|
||||
set(null);
|
||||
}
|
||||
};
|
||||
callback(router.state);
|
||||
|
||||
const unsubscribe = router.subscribe(callback);
|
||||
return () => {
|
||||
unsubscribe();
|
||||
};
|
||||
};
|
||||
|
||||
historyBaseAtom.onMount = set => {
|
||||
const unsubscribe = router.subscribe(state => {
|
||||
set(prev => {
|
||||
const url = state.location.pathname;
|
||||
console.log('push', url, prev.skip, prev.stack.length, prev.current);
|
||||
if (prev.skip) {
|
||||
return {
|
||||
stack: [...prev.stack],
|
||||
current: prev.current,
|
||||
skip: false,
|
||||
};
|
||||
} else {
|
||||
if (prev.current < prev.stack.length - 1) {
|
||||
const newStack = prev.stack.slice(0, prev.current);
|
||||
newStack.push(url);
|
||||
if (newStack.length > MAX_HISTORY) {
|
||||
newStack.shift();
|
||||
}
|
||||
return {
|
||||
stack: newStack,
|
||||
current: newStack.length - 1,
|
||||
skip: false,
|
||||
};
|
||||
} else {
|
||||
const newStack = [...prev.stack, url];
|
||||
if (newStack.length > MAX_HISTORY) {
|
||||
newStack.shift();
|
||||
}
|
||||
return {
|
||||
stack: newStack,
|
||||
current: newStack.length - 1,
|
||||
skip: false,
|
||||
};
|
||||
}
|
||||
}
|
||||
});
|
||||
});
|
||||
return () => {
|
||||
unsubscribe();
|
||||
};
|
||||
};
|
||||
//#endregion
|
||||
|
||||
const i18n = createI18n();
|
||||
const cache = createEmotionCache();
|
||||
|
||||
const DevTools = lazy(() =>
|
||||
import('jotai-devtools').then(m => ({ default: m.DevTools }))
|
||||
);
|
||||
|
||||
const DebugProvider = ({ children }: PropsWithChildren): ReactElement => {
|
||||
return (
|
||||
<>
|
||||
<Suspense>{process.env.DEBUG_JOTAI === 'true' && <DevTools />}</Suspense>
|
||||
{children}
|
||||
</>
|
||||
);
|
||||
};
|
||||
|
||||
export const App = memo(function App() {
|
||||
useEffect(() => {
|
||||
document.documentElement.lang = i18n.language;
|
||||
// todo(himself65): this is a hack, we should use a better way to set the language
|
||||
setUpLanguage(i18n)?.catch(error => {
|
||||
console.error(error);
|
||||
});
|
||||
}, []);
|
||||
return (
|
||||
<CacheProvider value={cache}>
|
||||
<AffineContext>
|
||||
<DebugProvider>
|
||||
<Suspense fallback={<WorkspaceFallback key="RootPageLoading" />}>
|
||||
<RouterProvider router={router} />
|
||||
</Suspense>
|
||||
</DebugProvider>
|
||||
</AffineContext>
|
||||
</CacheProvider>
|
||||
);
|
||||
});
|
||||
45
apps/core/src/atoms/__tests__/atom.spec.ts
Normal file
@@ -0,0 +1,45 @@
|
||||
/**
|
||||
* @vitest-environment happy-dom
|
||||
*/
|
||||
import 'fake-indexeddb/auto';
|
||||
|
||||
import { createStore } from 'jotai';
|
||||
import { describe, expect, test } from 'vitest';
|
||||
|
||||
import {
|
||||
pageSettingFamily,
|
||||
pageSettingsAtom,
|
||||
recentPageSettingsAtom,
|
||||
} from '../index';
|
||||
|
||||
describe('page mode atom', () => {
|
||||
test('basic', () => {
|
||||
const store = createStore();
|
||||
const page0SettingAtom = pageSettingFamily('page0');
|
||||
store.set(page0SettingAtom, {
|
||||
mode: 'page',
|
||||
});
|
||||
|
||||
expect(store.get(pageSettingsAtom)).toEqual({
|
||||
page0: {
|
||||
mode: 'page',
|
||||
},
|
||||
});
|
||||
|
||||
expect(store.get(recentPageSettingsAtom)).toEqual([
|
||||
{
|
||||
id: 'page0',
|
||||
mode: 'page',
|
||||
},
|
||||
]);
|
||||
|
||||
const page1SettingAtom = pageSettingFamily('page1');
|
||||
store.set(page1SettingAtom, {
|
||||
mode: 'edgeless',
|
||||
});
|
||||
expect(store.get(recentPageSettingsAtom)).toEqual([
|
||||
{ id: 'page1', mode: 'edgeless' },
|
||||
{ id: 'page0', mode: 'page' },
|
||||
]);
|
||||
});
|
||||
});
|
||||
87
apps/core/src/atoms/guide.ts
Normal file
@@ -0,0 +1,87 @@
|
||||
// these atoms cannot be moved to @affine/jotai since they use atoms from @affine/component
|
||||
import { appSidebarOpenAtom } from '@affine/component/app-sidebar';
|
||||
import { atom } from 'jotai';
|
||||
import { atomWithStorage } from 'jotai/utils';
|
||||
|
||||
export type Guide = {
|
||||
// should show quick search tips
|
||||
quickSearchTips: boolean;
|
||||
// should show change log
|
||||
changeLog: boolean;
|
||||
// should show recording tips
|
||||
onBoarding: boolean;
|
||||
// should show download client tips
|
||||
downloadClientTip: boolean;
|
||||
};
|
||||
|
||||
const guidePrimitiveAtom = atomWithStorage<Guide>('helper-guide', {
|
||||
quickSearchTips: true,
|
||||
changeLog: true,
|
||||
onBoarding: true,
|
||||
downloadClientTip: true,
|
||||
});
|
||||
|
||||
export const guideQuickSearchTipsAtom = atom<
|
||||
Guide['quickSearchTips'],
|
||||
[open: boolean],
|
||||
void
|
||||
>(
|
||||
get => {
|
||||
const open = get(appSidebarOpenAtom);
|
||||
const guide = get(guidePrimitiveAtom);
|
||||
// only show the tips when the sidebar is closed
|
||||
return guide.quickSearchTips && open === false;
|
||||
},
|
||||
(_, set, open) => {
|
||||
set(guidePrimitiveAtom, tips => ({
|
||||
...tips,
|
||||
quickSearchTips: open,
|
||||
}));
|
||||
}
|
||||
);
|
||||
|
||||
export const guideChangeLogAtom = atom<
|
||||
Guide['changeLog'],
|
||||
[open: boolean],
|
||||
void
|
||||
>(
|
||||
get => {
|
||||
return get(guidePrimitiveAtom).changeLog;
|
||||
},
|
||||
(_, set, open) => {
|
||||
set(guidePrimitiveAtom, tips => ({
|
||||
...tips,
|
||||
changeLog: open,
|
||||
}));
|
||||
}
|
||||
);
|
||||
export const guideOnboardingAtom = atom<
|
||||
Guide['onBoarding'],
|
||||
[open: boolean],
|
||||
void
|
||||
>(
|
||||
get => {
|
||||
return get(guidePrimitiveAtom).onBoarding;
|
||||
},
|
||||
(_, set, open) => {
|
||||
set(guidePrimitiveAtom, tips => ({
|
||||
...tips,
|
||||
onBoarding: open,
|
||||
}));
|
||||
}
|
||||
);
|
||||
export const guideDownloadClientTipAtom = atom<
|
||||
Guide['downloadClientTip'],
|
||||
[open: boolean],
|
||||
void
|
||||
>(
|
||||
get => {
|
||||
return get(guidePrimitiveAtom).downloadClientTip;
|
||||
},
|
||||
(_, set, open) => {
|
||||
set(guidePrimitiveAtom, tips => ({
|
||||
...tips,
|
||||
downloadClientTip: open,
|
||||
}));
|
||||
}
|
||||
);
|
||||
52
apps/core/src/atoms/history.ts
Normal file
@@ -0,0 +1,52 @@
|
||||
import { useAtom } from 'jotai';
|
||||
import { atomWithStorage } from 'jotai/utils';
|
||||
import { useCallback } from 'react';
|
||||
import { useNavigate } from 'react-router-dom';
|
||||
|
||||
export type History = {
|
||||
stack: string[];
|
||||
current: number;
|
||||
skip: boolean;
|
||||
};
|
||||
|
||||
export const MAX_HISTORY = 50;
|
||||
|
||||
export const historyBaseAtom = atomWithStorage<History>('router-history', {
|
||||
stack: [],
|
||||
current: 0,
|
||||
skip: false,
|
||||
});
|
||||
|
||||
export function useHistoryAtom() {
|
||||
const navigate = useNavigate();
|
||||
const [base, setBase] = useAtom(historyBaseAtom);
|
||||
return [
|
||||
base,
|
||||
useCallback(
|
||||
(forward: boolean) => {
|
||||
setBase(prev => {
|
||||
if (forward) {
|
||||
const target = Math.min(prev.stack.length - 1, prev.current + 1);
|
||||
const url = prev.stack[target];
|
||||
navigate(url);
|
||||
return {
|
||||
...prev,
|
||||
current: target,
|
||||
skip: true,
|
||||
};
|
||||
} else {
|
||||
const target = Math.max(0, prev.current - 1);
|
||||
const url = prev.stack[target];
|
||||
navigate(url);
|
||||
return {
|
||||
...prev,
|
||||
current: target,
|
||||
skip: true,
|
||||
};
|
||||
}
|
||||
});
|
||||
},
|
||||
[setBase, navigate]
|
||||
),
|
||||
] as const;
|
||||
}
|
||||
102
apps/core/src/atoms/index.ts
Normal file
@@ -0,0 +1,102 @@
|
||||
import { atom } from 'jotai';
|
||||
import { atomFamily, atomWithStorage } from 'jotai/utils';
|
||||
|
||||
import type { CreateWorkspaceMode } from '../components/affine/create-workspace-modal';
|
||||
import type { SettingProps } from '../components/affine/setting-modal';
|
||||
|
||||
// modal atoms
|
||||
export const openWorkspacesModalAtom = atom(false);
|
||||
export const openCreateWorkspaceModalAtom = atom<CreateWorkspaceMode>(false);
|
||||
export const openQuickSearchModalAtom = atom(false);
|
||||
export const openOnboardingModalAtom = atom(false);
|
||||
|
||||
export type SettingAtom = Pick<SettingProps, 'activeTab' | 'workspaceId'> & {
|
||||
open: boolean;
|
||||
};
|
||||
|
||||
export const openSettingModalAtom = atom<SettingAtom>({
|
||||
activeTab: 'appearance',
|
||||
workspaceId: null,
|
||||
open: false,
|
||||
});
|
||||
|
||||
export const openDisableCloudAlertModalAtom = atom(false);
|
||||
|
||||
type PageMode = 'page' | 'edgeless';
|
||||
type PageLocalSetting = {
|
||||
mode: PageMode;
|
||||
};
|
||||
|
||||
type PartialPageLocalSettingWithPageId = Partial<PageLocalSetting> & {
|
||||
id: string;
|
||||
};
|
||||
|
||||
const pageSettingsBaseAtom = atomWithStorage(
|
||||
'pageSettings',
|
||||
{} as Record<string, PageLocalSetting>
|
||||
);
|
||||
|
||||
// readonly atom by design
|
||||
export const pageSettingsAtom = atom(get => get(pageSettingsBaseAtom));
|
||||
|
||||
const recentPageSettingsBaseAtom = atomWithStorage<string[]>(
|
||||
'recentPageSettings',
|
||||
[]
|
||||
);
|
||||
|
||||
export const recentPageSettingsAtom = atom<PartialPageLocalSettingWithPageId[]>(
|
||||
get => {
|
||||
const recentPageIDs = get(recentPageSettingsBaseAtom);
|
||||
const pageSettings = get(pageSettingsAtom);
|
||||
return recentPageIDs.map(id => ({
|
||||
...pageSettings[id],
|
||||
id,
|
||||
}));
|
||||
}
|
||||
);
|
||||
|
||||
const defaultPageSetting = {
|
||||
mode: 'page',
|
||||
} satisfies PageLocalSetting;
|
||||
|
||||
export const pageSettingFamily = atomFamily((pageId: string) =>
|
||||
atom(
|
||||
get =>
|
||||
get(pageSettingsBaseAtom)[pageId] ?? {
|
||||
...defaultPageSetting,
|
||||
},
|
||||
(
|
||||
get,
|
||||
set,
|
||||
patch:
|
||||
| Partial<PageLocalSetting>
|
||||
| ((prevSetting: PageLocalSetting | undefined) => void)
|
||||
) => {
|
||||
set(recentPageSettingsBaseAtom, ids => {
|
||||
// pick 3 recent page ids
|
||||
return [...new Set([pageId, ...ids]).values()].slice(0, 3);
|
||||
});
|
||||
const prevSetting = {
|
||||
...defaultPageSetting,
|
||||
...get(pageSettingsBaseAtom)[pageId],
|
||||
};
|
||||
set(pageSettingsBaseAtom, settings => ({
|
||||
...settings,
|
||||
[pageId]: {
|
||||
...prevSetting,
|
||||
...(typeof patch === 'function' ? patch(prevSetting) : patch),
|
||||
},
|
||||
}));
|
||||
}
|
||||
)
|
||||
);
|
||||
|
||||
export const setPageModeAtom = atom(
|
||||
void 0,
|
||||
(get, set, pageId: string, mode: PageMode) => {
|
||||
set(pageSettingFamily(pageId), { mode });
|
||||
}
|
||||
);
|
||||
|
||||
export type PageModeOption = 'all' | 'page' | 'edgeless';
|
||||
export const allPageModeSelectAtom = atom<PageModeOption>('all');
|
||||
34
apps/core/src/atoms/layout.ts
Normal file
@@ -0,0 +1,34 @@
|
||||
import type { ExpectedLayout } from '@toeverything/plugin-infra/type';
|
||||
import { atom } from 'jotai';
|
||||
|
||||
export const contentLayoutBaseAtom = atom<ExpectedLayout>('editor');
|
||||
|
||||
type SetStateAction<Value> = Value | ((prev: Value) => Value);
|
||||
export const contentLayoutAtom = atom<
|
||||
ExpectedLayout,
|
||||
[SetStateAction<ExpectedLayout>],
|
||||
void
|
||||
>(
|
||||
get => get(contentLayoutBaseAtom),
|
||||
(get, set, layout) => {
|
||||
set(contentLayoutBaseAtom, prev => {
|
||||
let setV: (prev: ExpectedLayout) => ExpectedLayout;
|
||||
if (typeof layout !== 'function') {
|
||||
setV = () => layout;
|
||||
} else {
|
||||
setV = layout;
|
||||
}
|
||||
const nextValue = setV(prev);
|
||||
if (nextValue === 'editor') {
|
||||
return nextValue;
|
||||
}
|
||||
if (nextValue.first !== 'editor') {
|
||||
throw new Error('The first element of the layout should be editor.');
|
||||
}
|
||||
if (nextValue.splitPercentage && nextValue.splitPercentage < 70) {
|
||||
throw new Error('The split percentage should be greater than 70.');
|
||||
}
|
||||
return nextValue;
|
||||
});
|
||||
}
|
||||
);
|
||||
12
apps/core/src/atoms/mode.ts
Normal file
@@ -0,0 +1,12 @@
|
||||
import { currentPageIdAtom } from '@toeverything/plugin-infra/manager';
|
||||
import { atom } from 'jotai/vanilla';
|
||||
|
||||
import { pageSettingFamily } from './index';
|
||||
|
||||
export const currentModeAtom = atom<'page' | 'edgeless'>(get => {
|
||||
const pageId = get(currentPageIdAtom);
|
||||
if (!pageId) {
|
||||
return 'page';
|
||||
}
|
||||
return get(pageSettingFamily(pageId)).mode;
|
||||
});
|
||||
82
apps/core/src/atoms/settings.ts
Normal file
@@ -0,0 +1,82 @@
|
||||
import { isDesktop } from '@affine/env/constant';
|
||||
import { atom, useAtom } from 'jotai';
|
||||
import { atomWithStorage } from 'jotai/utils';
|
||||
|
||||
export type DateFormats =
|
||||
| 'MM/dd/YYYY'
|
||||
| 'dd/MM/YYYY'
|
||||
| 'YYYY-MM-dd'
|
||||
| 'YYYY.MM.dd'
|
||||
| 'YYYY/MM/dd'
|
||||
| 'dd-MMM-YYYY'
|
||||
| 'dd MMMM YYYY';
|
||||
|
||||
export type AppSetting = {
|
||||
clientBorder: boolean;
|
||||
fullWidthLayout: boolean;
|
||||
windowFrameStyle: 'frameless' | 'NativeTitleBar';
|
||||
fontStyle: FontFamily;
|
||||
dateFormat: DateFormats;
|
||||
startWeekOnMonday: boolean;
|
||||
enableBlurBackground: boolean;
|
||||
enableNoisyBackground: boolean;
|
||||
autoCheckUpdate: boolean;
|
||||
autoDownloadUpdate: boolean;
|
||||
};
|
||||
export const windowFrameStyleOptions: AppSetting['windowFrameStyle'][] = [
|
||||
'frameless',
|
||||
'NativeTitleBar',
|
||||
];
|
||||
|
||||
export const dateFormatOptions: DateFormats[] = [
|
||||
'MM/dd/YYYY',
|
||||
'dd/MM/YYYY',
|
||||
'YYYY-MM-dd',
|
||||
'YYYY.MM.dd',
|
||||
'YYYY/MM/dd',
|
||||
'dd-MMM-YYYY',
|
||||
'dd MMMM YYYY',
|
||||
];
|
||||
|
||||
export type FontFamily = 'Sans' | 'Serif' | 'Mono';
|
||||
|
||||
export const fontStyleOptions = [
|
||||
{ key: 'Sans', value: 'var(--affine-font-sans-family)' },
|
||||
{ key: 'Serif', value: 'var(--affine-font-serif-family)' },
|
||||
{ key: 'Mono', value: 'var(--affine-font-mono-family)' },
|
||||
] satisfies {
|
||||
key: FontFamily;
|
||||
value: string;
|
||||
}[];
|
||||
|
||||
const appSettingBaseAtom = atomWithStorage<AppSetting>('affine-settings', {
|
||||
clientBorder: isDesktop,
|
||||
fullWidthLayout: false,
|
||||
windowFrameStyle: 'frameless',
|
||||
fontStyle: 'Sans',
|
||||
dateFormat: dateFormatOptions[0],
|
||||
startWeekOnMonday: false,
|
||||
enableBlurBackground: true,
|
||||
enableNoisyBackground: true,
|
||||
autoCheckUpdate: true,
|
||||
autoDownloadUpdate: true,
|
||||
});
|
||||
|
||||
type SetStateAction<Value> = Value | ((prev: Value) => Value);
|
||||
|
||||
const appSettingAtom = atom<
|
||||
AppSetting,
|
||||
[SetStateAction<Partial<AppSetting>>],
|
||||
void
|
||||
>(
|
||||
get => get(appSettingBaseAtom),
|
||||
(get, set, apply) => {
|
||||
const prev = get(appSettingBaseAtom);
|
||||
const next = typeof apply === 'function' ? apply(prev) : apply;
|
||||
set(appSettingBaseAtom, { ...prev, ...next });
|
||||
}
|
||||
);
|
||||
|
||||
export const useAppSetting = () => {
|
||||
return useAtom(appSettingAtom);
|
||||
};
|
||||
40
apps/core/src/components/__debug__/client/editor.tsx
Normal file
@@ -0,0 +1,40 @@
|
||||
import { initEmptyPage } from '@affine/env/blocksuite';
|
||||
import { WorkspaceFlavour } from '@affine/env/workspace';
|
||||
import { createEmptyBlockSuiteWorkspace } from '@affine/workspace/utils';
|
||||
import type { EditorContainer } from '@blocksuite/editor';
|
||||
import type { Page } from '@blocksuite/store';
|
||||
import type React from 'react';
|
||||
import { useCallback } from 'react';
|
||||
|
||||
import { BlockSuiteEditor } from '../../blocksuite/block-suite-editor';
|
||||
|
||||
const blockSuiteWorkspace = createEmptyBlockSuiteWorkspace(
|
||||
'test',
|
||||
WorkspaceFlavour.LOCAL
|
||||
);
|
||||
|
||||
const page = blockSuiteWorkspace.createPage({ id: 'page0' });
|
||||
|
||||
const Editor: React.FC = () => {
|
||||
const onLoad = useCallback((page: Page, editor: EditorContainer) => {
|
||||
// @ts-expect-error
|
||||
globalThis.page = page;
|
||||
// @ts-expect-error
|
||||
globalThis.editor = editor;
|
||||
return () => void 0;
|
||||
}, []);
|
||||
|
||||
if (!page) {
|
||||
return <>loading...</>;
|
||||
}
|
||||
return (
|
||||
<BlockSuiteEditor
|
||||
page={page}
|
||||
mode="page"
|
||||
onInit={initEmptyPage}
|
||||
onLoad={onLoad}
|
||||
/>
|
||||
);
|
||||
};
|
||||
|
||||
export default Editor;
|
||||
19
apps/core/src/components/affine/README.md
Normal file
@@ -0,0 +1,19 @@
|
||||
# Affine Official Workspace Component
|
||||
|
||||
This component need specific configuration to work properly.
|
||||
|
||||
## Configuration
|
||||
|
||||
### SWR
|
||||
|
||||
Each component use SWR to fetch data from the API. You need to provide a configuration to SWR to make it work.
|
||||
|
||||
```tsx
|
||||
const Wrapper = () => {
|
||||
return (
|
||||
<AffineSWRConfigProvider>
|
||||
<Component />
|
||||
</AffineSWRConfigProvider>
|
||||
);
|
||||
};
|
||||
```
|
||||
114
apps/core/src/components/affine/affine-error-eoundary.tsx
Normal file
@@ -0,0 +1,114 @@
|
||||
import type {
|
||||
QueryParamError,
|
||||
Unreachable,
|
||||
WorkspaceNotFoundError,
|
||||
} from '@affine/env/constant';
|
||||
import { PageNotFoundError } from '@affine/env/constant';
|
||||
import { rootWorkspacesMetadataAtom } from '@affine/workspace/atom';
|
||||
import {
|
||||
currentPageIdAtom,
|
||||
currentWorkspaceIdAtom,
|
||||
rootStore,
|
||||
} from '@toeverything/plugin-infra/manager';
|
||||
import { useAtomValue } from 'jotai/react';
|
||||
import { Provider } from 'jotai/react';
|
||||
import type { ErrorInfo, ReactElement, ReactNode } from 'react';
|
||||
import type React from 'react';
|
||||
import { Component } from 'react';
|
||||
import { useLocation, useParams } from 'react-router-dom';
|
||||
export type AffineErrorBoundaryProps = React.PropsWithChildren;
|
||||
|
||||
type AffineError =
|
||||
| QueryParamError
|
||||
| Unreachable
|
||||
| WorkspaceNotFoundError
|
||||
| PageNotFoundError
|
||||
| Error;
|
||||
|
||||
interface AffineErrorBoundaryState {
|
||||
error: AffineError | null;
|
||||
}
|
||||
|
||||
export const DumpInfo = () => {
|
||||
const location = useLocation();
|
||||
const metadata = useAtomValue(rootWorkspacesMetadataAtom);
|
||||
const currentWorkspaceId = useAtomValue(currentWorkspaceIdAtom);
|
||||
const currentPageId = useAtomValue(currentPageIdAtom);
|
||||
const path = location.pathname;
|
||||
const query = useParams();
|
||||
return (
|
||||
<>
|
||||
<div>
|
||||
Please copy the following information and send it to the developer.
|
||||
</div>
|
||||
<div
|
||||
style={{
|
||||
border: '1px solid red',
|
||||
}}
|
||||
>
|
||||
<div>path: {path}</div>
|
||||
<div>query: {JSON.stringify(query)}</div>
|
||||
<div>currentWorkspaceId: {currentWorkspaceId}</div>
|
||||
<div>currentPageId: {currentPageId}</div>
|
||||
<div>metadata: {JSON.stringify(metadata)}</div>
|
||||
</div>
|
||||
</>
|
||||
);
|
||||
};
|
||||
|
||||
export class AffineErrorBoundary extends Component<
|
||||
AffineErrorBoundaryProps,
|
||||
AffineErrorBoundaryState
|
||||
> {
|
||||
public override state: AffineErrorBoundaryState = {
|
||||
error: null,
|
||||
};
|
||||
|
||||
public static getDerivedStateFromError(
|
||||
error: AffineError
|
||||
): AffineErrorBoundaryState {
|
||||
return { error };
|
||||
}
|
||||
|
||||
public override componentDidCatch(error: AffineError, errorInfo: ErrorInfo) {
|
||||
console.error('Uncaught error:', error, errorInfo);
|
||||
}
|
||||
|
||||
public override render(): ReactNode {
|
||||
if (this.state.error) {
|
||||
let errorDetail: ReactElement | null = null;
|
||||
const error = this.state.error;
|
||||
if (error instanceof PageNotFoundError) {
|
||||
errorDetail = (
|
||||
<>
|
||||
<h1>Sorry.. there was an error</h1>
|
||||
<>
|
||||
<span> Page error </span>
|
||||
<span>
|
||||
Cannot find page {error.pageId} in workspace{' '}
|
||||
{error.workspace.id}
|
||||
</span>
|
||||
</>
|
||||
</>
|
||||
);
|
||||
} else {
|
||||
errorDetail = (
|
||||
<>
|
||||
<h1>Sorry.. there was an error</h1>
|
||||
{error.message ?? error.toString()}
|
||||
</>
|
||||
);
|
||||
}
|
||||
return (
|
||||
<>
|
||||
{errorDetail}
|
||||
<Provider key="JotaiProvider" store={rootStore}>
|
||||
<DumpInfo />
|
||||
</Provider>
|
||||
</>
|
||||
);
|
||||
}
|
||||
|
||||
return this.props.children;
|
||||
}
|
||||
}
|
||||
18
apps/core/src/components/affine/app-container.tsx
Normal file
@@ -0,0 +1,18 @@
|
||||
import {
|
||||
AppContainer as AppContainerWithoutSettings,
|
||||
type WorkspaceRootProps,
|
||||
} from '@affine/component/workspace';
|
||||
|
||||
import { useAppSetting } from '../../atoms/settings';
|
||||
|
||||
export const AppContainer = (props: WorkspaceRootProps) => {
|
||||
const [appSettings] = useAppSetting();
|
||||
|
||||
return (
|
||||
<AppContainerWithoutSettings
|
||||
useNoisyBackground={appSettings.enableNoisyBackground}
|
||||
useBlurBackground={!appSettings.enableBlurBackground}
|
||||
{...props}
|
||||
/>
|
||||
);
|
||||
};
|
||||
@@ -0,0 +1,43 @@
|
||||
import { globalStyle, style } from '@vanilla-extract/css';
|
||||
|
||||
export const header = style({
|
||||
position: 'relative',
|
||||
height: '44px',
|
||||
});
|
||||
|
||||
export const content = style({
|
||||
padding: '0 40px',
|
||||
fontSize: '18px',
|
||||
lineHeight: '26px',
|
||||
});
|
||||
|
||||
globalStyle(`${content} p`, {
|
||||
marginTop: '12px',
|
||||
marginBottom: '16px',
|
||||
});
|
||||
|
||||
export const contentTitle = style({
|
||||
fontSize: '20px',
|
||||
lineHeight: '28px',
|
||||
fontWeight: 600,
|
||||
paddingBottom: '16px',
|
||||
});
|
||||
|
||||
export const buttonGroup = style({
|
||||
display: 'flex',
|
||||
justifyContent: 'flex-end',
|
||||
gap: '20px',
|
||||
margin: '24px 0',
|
||||
});
|
||||
|
||||
export const radioGroup = style({
|
||||
display: 'flex',
|
||||
flexDirection: 'column',
|
||||
gap: '8px',
|
||||
});
|
||||
|
||||
export const radio = style({
|
||||
cursor: 'pointer',
|
||||
appearance: 'auto',
|
||||
marginRight: '12px',
|
||||
});
|
||||
397
apps/core/src/components/affine/create-workspace-modal/index.tsx
Normal file
@@ -0,0 +1,397 @@
|
||||
import {
|
||||
Button,
|
||||
Input,
|
||||
Modal,
|
||||
ModalCloseButton,
|
||||
ModalWrapper,
|
||||
toast,
|
||||
Tooltip,
|
||||
} from '@affine/component';
|
||||
import { DebugLogger } from '@affine/debug';
|
||||
import { useAFFiNEI18N } from '@affine/i18n/hooks';
|
||||
import { HelpIcon } from '@blocksuite/icons';
|
||||
import { useSetAtom } from 'jotai';
|
||||
import type { KeyboardEvent } from 'react';
|
||||
import { useEffect } from 'react';
|
||||
import { useLayoutEffect } from 'react';
|
||||
import { useCallback, useState } from 'react';
|
||||
|
||||
import { openDisableCloudAlertModalAtom } from '../../../atoms';
|
||||
import { useAppHelper } from '../../../hooks/use-workspaces';
|
||||
import * as style from './index.css';
|
||||
|
||||
type CreateWorkspaceStep =
|
||||
| 'set-db-location'
|
||||
| 'name-workspace'
|
||||
| 'set-syncing-mode';
|
||||
|
||||
export type CreateWorkspaceMode = 'add' | 'new' | false;
|
||||
|
||||
const logger = new DebugLogger('CreateWorkspaceModal');
|
||||
|
||||
interface ModalProps {
|
||||
mode: CreateWorkspaceMode; // false means not open
|
||||
onClose: () => void;
|
||||
onCreate: (id: string) => void;
|
||||
}
|
||||
|
||||
interface NameWorkspaceContentProps {
|
||||
onClose: () => void;
|
||||
onConfirmName: (name: string) => void;
|
||||
}
|
||||
|
||||
const NameWorkspaceContent = ({
|
||||
onConfirmName,
|
||||
onClose,
|
||||
}: NameWorkspaceContentProps) => {
|
||||
const [workspaceName, setWorkspaceName] = useState('');
|
||||
|
||||
const handleCreateWorkspace = useCallback(() => {
|
||||
onConfirmName(workspaceName);
|
||||
}, [onConfirmName, workspaceName]);
|
||||
|
||||
const handleKeyDown = useCallback(
|
||||
(event: KeyboardEvent<HTMLInputElement>) => {
|
||||
if (event.key === 'Enter' && workspaceName) {
|
||||
handleCreateWorkspace();
|
||||
}
|
||||
},
|
||||
[handleCreateWorkspace, workspaceName]
|
||||
);
|
||||
const t = useAFFiNEI18N();
|
||||
return (
|
||||
<div className={style.content}>
|
||||
<div className={style.contentTitle}>{t['Name Your Workspace']()}</div>
|
||||
<p>{t['Workspace description']()}</p>
|
||||
<Input
|
||||
ref={ref => {
|
||||
if (ref) {
|
||||
setTimeout(() => ref.focus(), 0);
|
||||
}
|
||||
}}
|
||||
data-testid="create-workspace-input"
|
||||
onKeyDown={handleKeyDown}
|
||||
placeholder={t['Set a Workspace name']()}
|
||||
maxLength={64}
|
||||
minLength={0}
|
||||
onChange={setWorkspaceName}
|
||||
/>
|
||||
<div className={style.buttonGroup}>
|
||||
<Button
|
||||
data-testid="create-workspace-close-button"
|
||||
type="light"
|
||||
onClick={onClose}
|
||||
>
|
||||
{t.Cancel()}
|
||||
</Button>
|
||||
<Button
|
||||
data-testid="create-workspace-create-button"
|
||||
disabled={!workspaceName}
|
||||
style={{
|
||||
opacity: !workspaceName ? 0.5 : 1,
|
||||
}}
|
||||
type="primary"
|
||||
onClick={handleCreateWorkspace}
|
||||
>
|
||||
{t.Create()}
|
||||
</Button>
|
||||
</div>
|
||||
</div>
|
||||
);
|
||||
};
|
||||
|
||||
interface SetDBLocationContentProps {
|
||||
onConfirmLocation: (dir?: string) => void;
|
||||
}
|
||||
|
||||
const useDefaultDBLocation = () => {
|
||||
const [defaultDBLocation, setDefaultDBLocation] = useState('');
|
||||
|
||||
useEffect(() => {
|
||||
window.apis?.db
|
||||
.getDefaultStorageLocation()
|
||||
.then(dir => {
|
||||
setDefaultDBLocation(dir);
|
||||
})
|
||||
.catch(err => {
|
||||
console.error(err);
|
||||
});
|
||||
}, []);
|
||||
|
||||
return defaultDBLocation;
|
||||
};
|
||||
|
||||
const SetDBLocationContent = ({
|
||||
onConfirmLocation,
|
||||
}: SetDBLocationContentProps) => {
|
||||
const t = useAFFiNEI18N();
|
||||
const defaultDBLocation = useDefaultDBLocation();
|
||||
const [opening, setOpening] = useState(false);
|
||||
|
||||
const handleSelectDBFileLocation = useCallback(() => {
|
||||
if (opening) {
|
||||
return;
|
||||
}
|
||||
setOpening(true);
|
||||
(async function () {
|
||||
const result = await window.apis?.dialog.selectDBFileLocation();
|
||||
setOpening(false);
|
||||
if (result?.filePath) {
|
||||
onConfirmLocation(result.filePath);
|
||||
} else if (result?.error) {
|
||||
// @ts-expect-error: result.error is dynamic so the type is unknown
|
||||
toast(t[result.error]());
|
||||
}
|
||||
})().catch(err => {
|
||||
logger.error(err);
|
||||
});
|
||||
}, [onConfirmLocation, opening, t]);
|
||||
|
||||
return (
|
||||
<div className={style.content}>
|
||||
<div className={style.contentTitle}>{t['Set database location']()}</div>
|
||||
<p>{t['Workspace database storage description']()}</p>
|
||||
<div className={style.buttonGroup}>
|
||||
<Button
|
||||
disabled={opening}
|
||||
data-testid="create-workspace-customize-button"
|
||||
type="light"
|
||||
onClick={handleSelectDBFileLocation}
|
||||
>
|
||||
{t['Customize']()}
|
||||
</Button>
|
||||
<Tooltip
|
||||
zIndex={1000}
|
||||
content={t['Default db location hint']({
|
||||
location: defaultDBLocation,
|
||||
})}
|
||||
placement="top-start"
|
||||
>
|
||||
<Button
|
||||
data-testid="create-workspace-default-location-button"
|
||||
type="primary"
|
||||
onClick={() => {
|
||||
onConfirmLocation();
|
||||
}}
|
||||
icon={<HelpIcon />}
|
||||
iconPosition="end"
|
||||
>
|
||||
{t['Default Location']()}
|
||||
</Button>
|
||||
</Tooltip>
|
||||
</div>
|
||||
</div>
|
||||
);
|
||||
};
|
||||
|
||||
interface SetSyncingModeContentProps {
|
||||
mode: CreateWorkspaceMode;
|
||||
onConfirmMode: (enableCloudSyncing: boolean) => void;
|
||||
}
|
||||
|
||||
const SetSyncingModeContent = ({
|
||||
mode,
|
||||
onConfirmMode,
|
||||
}: SetSyncingModeContentProps) => {
|
||||
const t = useAFFiNEI18N();
|
||||
const [enableCloudSyncing, setEnableCloudSyncing] = useState(false);
|
||||
return (
|
||||
<div className={style.content}>
|
||||
<div className={style.contentTitle}>
|
||||
{t[mode === 'new' ? 'Created Successfully' : 'Added Successfully']()}
|
||||
</div>
|
||||
|
||||
<div className={style.radioGroup}>
|
||||
<label onClick={() => setEnableCloudSyncing(false)}>
|
||||
<input
|
||||
className={style.radio}
|
||||
type="radio"
|
||||
readOnly
|
||||
checked={!enableCloudSyncing}
|
||||
/>
|
||||
{t['Use on current device only']()}
|
||||
</label>
|
||||
<label onClick={() => setEnableCloudSyncing(true)}>
|
||||
<input
|
||||
className={style.radio}
|
||||
type="radio"
|
||||
readOnly
|
||||
checked={enableCloudSyncing}
|
||||
/>
|
||||
{t['Sync across devices with AFFiNE Cloud']()}
|
||||
</label>
|
||||
</div>
|
||||
|
||||
<div className={style.buttonGroup}>
|
||||
<Button
|
||||
data-testid="create-workspace-continue-button"
|
||||
type="primary"
|
||||
onClick={() => {
|
||||
onConfirmMode(enableCloudSyncing);
|
||||
}}
|
||||
>
|
||||
{t['Continue']()}
|
||||
</Button>
|
||||
</div>
|
||||
</div>
|
||||
);
|
||||
};
|
||||
|
||||
export const CreateWorkspaceModal = ({
|
||||
mode,
|
||||
onClose,
|
||||
onCreate,
|
||||
}: ModalProps) => {
|
||||
const { createLocalWorkspace, addLocalWorkspace } = useAppHelper();
|
||||
const [step, setStep] = useState<CreateWorkspaceStep>();
|
||||
const [addedId, setAddedId] = useState<string>();
|
||||
const [workspaceName, setWorkspaceName] = useState<string>();
|
||||
const [dbFileLocation, setDBFileLocation] = useState<string>();
|
||||
const setOpenDisableCloudAlertModal = useSetAtom(
|
||||
openDisableCloudAlertModalAtom
|
||||
);
|
||||
const t = useAFFiNEI18N();
|
||||
|
||||
// todo: maybe refactor using xstate?
|
||||
useLayoutEffect(() => {
|
||||
let canceled = false;
|
||||
// if mode changed, reset step
|
||||
if (mode === 'add') {
|
||||
// a hack for now
|
||||
// when adding a workspace, we will immediately let user select a db file
|
||||
// after it is done, it will effectively add a new workspace to app-data folder
|
||||
// so after that, we will be able to load it via importLocalWorkspace
|
||||
(async () => {
|
||||
if (!window.apis) {
|
||||
return;
|
||||
}
|
||||
logger.info('load db file');
|
||||
setStep(undefined);
|
||||
const result = await window.apis.dialog.loadDBFile();
|
||||
if (result.workspaceId && !canceled) {
|
||||
setAddedId(result.workspaceId);
|
||||
setStep('set-syncing-mode');
|
||||
} else if (result.error || result.canceled) {
|
||||
if (result.error) {
|
||||
// @ts-expect-error: result.error is dynamic so the type is unknown
|
||||
toast(t[result.error]());
|
||||
}
|
||||
onClose();
|
||||
}
|
||||
})().catch(err => {
|
||||
console.error(err);
|
||||
});
|
||||
} else if (mode === 'new') {
|
||||
setStep(
|
||||
environment.isDesktop && runtimeConfig.enableSQLiteProvider
|
||||
? 'set-db-location'
|
||||
: 'name-workspace'
|
||||
);
|
||||
} else {
|
||||
setStep(undefined);
|
||||
}
|
||||
return () => {
|
||||
canceled = true;
|
||||
};
|
||||
}, [mode, onClose, t]);
|
||||
|
||||
const onConfirmEnableCloudSyncing = useCallback(
|
||||
(enableCloudSyncing: boolean) => {
|
||||
(async function () {
|
||||
if (!runtimeConfig.enableCloud && enableCloudSyncing) {
|
||||
setOpenDisableCloudAlertModal(true);
|
||||
} else {
|
||||
let id = addedId;
|
||||
// syncing mode is also the last step
|
||||
if (addedId && mode === 'add') {
|
||||
await addLocalWorkspace(addedId);
|
||||
} else if (mode === 'new' && workspaceName) {
|
||||
id = await createLocalWorkspace(workspaceName);
|
||||
// if dbFileLocation is set, move db file to that location
|
||||
if (dbFileLocation) {
|
||||
await window.apis?.dialog.moveDBFile(id, dbFileLocation);
|
||||
}
|
||||
} else {
|
||||
logger.error('invalid state');
|
||||
return;
|
||||
}
|
||||
if (id) {
|
||||
onCreate(id);
|
||||
}
|
||||
}
|
||||
})().catch(e => {
|
||||
logger.error(e);
|
||||
});
|
||||
},
|
||||
[
|
||||
addLocalWorkspace,
|
||||
addedId,
|
||||
createLocalWorkspace,
|
||||
dbFileLocation,
|
||||
mode,
|
||||
onCreate,
|
||||
setOpenDisableCloudAlertModal,
|
||||
workspaceName,
|
||||
]
|
||||
);
|
||||
|
||||
const onConfirmName = useCallback(
|
||||
(name: string) => {
|
||||
setWorkspaceName(name);
|
||||
if (environment.isDesktop && runtimeConfig.enableSQLiteProvider) {
|
||||
setStep('set-syncing-mode');
|
||||
} else {
|
||||
// this will be the last step for web for now
|
||||
// fix me later
|
||||
createLocalWorkspace(name)
|
||||
.then(id => {
|
||||
onCreate(id);
|
||||
})
|
||||
.catch(err => {
|
||||
logger.error(err);
|
||||
});
|
||||
}
|
||||
},
|
||||
[createLocalWorkspace, onCreate]
|
||||
);
|
||||
|
||||
const nameWorkspaceNode =
|
||||
step === 'name-workspace' ? (
|
||||
<NameWorkspaceContent
|
||||
// go to previous step instead?
|
||||
onClose={onClose}
|
||||
onConfirmName={onConfirmName}
|
||||
/>
|
||||
) : null;
|
||||
|
||||
const setDBLocationNode =
|
||||
step === 'set-db-location' ? (
|
||||
<SetDBLocationContent
|
||||
onConfirmLocation={dir => {
|
||||
setDBFileLocation(dir);
|
||||
setStep('name-workspace');
|
||||
}}
|
||||
/>
|
||||
) : null;
|
||||
|
||||
const setSyncingModeNode =
|
||||
step === 'set-syncing-mode' ? (
|
||||
<SetSyncingModeContent
|
||||
mode={mode}
|
||||
onConfirmMode={onConfirmEnableCloudSyncing}
|
||||
/>
|
||||
) : null;
|
||||
|
||||
return (
|
||||
<Modal open={mode !== false && !!step} onClose={onClose}>
|
||||
<ModalWrapper width={560} style={{ padding: '10px' }}>
|
||||
<div className={style.header}>
|
||||
<ModalCloseButton top={6} right={6} onClick={onClose} />
|
||||
</div>
|
||||
{nameWorkspaceNode}
|
||||
{setDBLocationNode}
|
||||
{setSyncingModeNode}
|
||||
</ModalWrapper>
|
||||
</Modal>
|
||||
);
|
||||
};
|
||||
@@ -0,0 +1,50 @@
|
||||
import { IconButton, Modal, ModalWrapper } from '@affine/component';
|
||||
import { useAFFiNEI18N } from '@affine/i18n/hooks';
|
||||
import { CloseIcon } from '@blocksuite/icons';
|
||||
import type React from 'react';
|
||||
|
||||
import { Content, ContentTitle, Header, StyleButton, StyleTips } from './style';
|
||||
|
||||
interface EnableAffineCloudModalProps {
|
||||
open: boolean;
|
||||
onConfirm: () => void;
|
||||
onClose: () => void;
|
||||
}
|
||||
|
||||
export const EnableAffineCloudModal: React.FC<EnableAffineCloudModalProps> = ({
|
||||
onConfirm,
|
||||
open,
|
||||
onClose,
|
||||
}) => {
|
||||
const t = useAFFiNEI18N();
|
||||
|
||||
return (
|
||||
<Modal open={open} onClose={onClose} data-testid="logout-modal">
|
||||
<ModalWrapper width={560} height={292}>
|
||||
<Header>
|
||||
<IconButton onClick={onClose}>
|
||||
<CloseIcon />
|
||||
</IconButton>
|
||||
</Header>
|
||||
<Content>
|
||||
<ContentTitle>{t['Enable AFFiNE Cloud']()}?</ContentTitle>
|
||||
<StyleTips>{t['Enable AFFiNE Cloud Description']()}</StyleTips>
|
||||
{/* <StyleTips>{t('Retain cached cloud data')}</StyleTips> */}
|
||||
<div>
|
||||
<StyleButton
|
||||
data-testid="confirm-enable-affine-cloud-button"
|
||||
shape="round"
|
||||
type="primary"
|
||||
onClick={onConfirm}
|
||||
>
|
||||
{t['Sign in and Enable']()}
|
||||
</StyleButton>
|
||||
<StyleButton shape="round" onClick={onClose}>
|
||||
{t['Not now']()}
|
||||
</StyleButton>
|
||||
</div>
|
||||
</Content>
|
||||
</ModalWrapper>
|
||||
</Modal>
|
||||
);
|
||||
};
|
||||
@@ -0,0 +1,40 @@
|
||||
import { Button, styled } from '@affine/component';
|
||||
|
||||
export const Header = styled('div')({
|
||||
height: '44px',
|
||||
display: 'flex',
|
||||
flexDirection: 'row-reverse',
|
||||
paddingRight: '10px',
|
||||
paddingTop: '10px',
|
||||
flexShrink: 0,
|
||||
});
|
||||
|
||||
export const Content = styled('div')({
|
||||
textAlign: 'center',
|
||||
});
|
||||
|
||||
export const ContentTitle = styled('h1')({
|
||||
fontSize: '20px',
|
||||
lineHeight: '28px',
|
||||
fontWeight: 600,
|
||||
textAlign: 'center',
|
||||
});
|
||||
|
||||
export const StyleTips = styled('div')(() => {
|
||||
return {
|
||||
userSelect: 'none',
|
||||
width: '400px',
|
||||
margin: 'auto',
|
||||
marginBottom: '32px',
|
||||
marginTop: '12px',
|
||||
};
|
||||
});
|
||||
|
||||
export const StyleButton = styled(Button)(() => {
|
||||
return {
|
||||
width: '284px',
|
||||
display: 'block',
|
||||
margin: 'auto',
|
||||
marginTop: '16px',
|
||||
};
|
||||
});
|
||||
79
apps/core/src/components/affine/language-menu/index.tsx
Normal file
@@ -0,0 +1,79 @@
|
||||
import {
|
||||
type ButtonProps,
|
||||
Menu,
|
||||
MenuItem,
|
||||
MenuTrigger,
|
||||
styled,
|
||||
} from '@affine/component';
|
||||
import { LOCALES } from '@affine/i18n';
|
||||
import { useI18N } from '@affine/i18n';
|
||||
import type { FC, ReactElement } from 'react';
|
||||
import { useCallback } from 'react';
|
||||
|
||||
export const StyledListItem = styled(MenuItem)(() => ({
|
||||
width: '132px',
|
||||
height: '38px',
|
||||
textTransform: 'capitalize',
|
||||
}));
|
||||
|
||||
const LanguageMenuContent: FC<{
|
||||
currentLanguage?: string;
|
||||
}> = ({ currentLanguage }) => {
|
||||
const i18n = useI18N();
|
||||
const changeLanguage = useCallback(
|
||||
(event: string) => {
|
||||
return i18n.changeLanguage(event);
|
||||
},
|
||||
[i18n]
|
||||
);
|
||||
return (
|
||||
<>
|
||||
{LOCALES.map(option => {
|
||||
return (
|
||||
<StyledListItem
|
||||
key={option.name}
|
||||
active={currentLanguage === option.originalName}
|
||||
title={option.name}
|
||||
onClick={() => {
|
||||
changeLanguage(option.tag).catch(err => {
|
||||
throw new Error('Failed to change language', err);
|
||||
});
|
||||
}}
|
||||
>
|
||||
{option.originalName}
|
||||
</StyledListItem>
|
||||
);
|
||||
})}
|
||||
</>
|
||||
);
|
||||
};
|
||||
export const LanguageMenu: FC<{ triggerProps: ButtonProps }> = ({
|
||||
triggerProps,
|
||||
}) => {
|
||||
const i18n = useI18N();
|
||||
|
||||
const currentLanguage = LOCALES.find(item => item.tag === i18n.language);
|
||||
|
||||
return (
|
||||
<Menu
|
||||
content={
|
||||
(
|
||||
<LanguageMenuContent
|
||||
currentLanguage={currentLanguage?.originalName}
|
||||
/>
|
||||
) as ReactElement
|
||||
}
|
||||
placement="bottom-end"
|
||||
trigger="click"
|
||||
disablePortal={true}
|
||||
>
|
||||
<MenuTrigger
|
||||
data-testid="language-menu-button"
|
||||
style={{ textTransform: 'capitalize' }}
|
||||
{...triggerProps}
|
||||
>
|
||||
{currentLanguage?.originalName}
|
||||
</MenuTrigger>
|
||||
</Menu>
|
||||
);
|
||||
};
|
||||
@@ -0,0 +1,112 @@
|
||||
import { Button, Input, Modal, ModalCloseButton } from '@affine/component';
|
||||
import { WorkspaceFlavour } from '@affine/env/workspace';
|
||||
import { Trans } from '@affine/i18n';
|
||||
import { useAFFiNEI18N } from '@affine/i18n/hooks';
|
||||
import { useBlockSuiteWorkspaceName } from '@toeverything/hooks/use-block-suite-workspace-name';
|
||||
import { useCallback, useState } from 'react';
|
||||
|
||||
import type { AffineOfficialWorkspace } from '../../../../../shared';
|
||||
import { toast } from '../../../../../utils';
|
||||
import {
|
||||
StyledButtonContent,
|
||||
StyledInputContent,
|
||||
StyledModalHeader,
|
||||
StyledModalWrapper,
|
||||
StyledTextContent,
|
||||
StyledWorkspaceName,
|
||||
} from './style';
|
||||
|
||||
interface WorkspaceDeleteProps {
|
||||
open: boolean;
|
||||
onClose: () => void;
|
||||
workspace: AffineOfficialWorkspace;
|
||||
onDeleteWorkspace: (id: string) => Promise<void>;
|
||||
}
|
||||
|
||||
export const WorkspaceDeleteModal = ({
|
||||
open,
|
||||
onClose,
|
||||
workspace,
|
||||
onDeleteWorkspace,
|
||||
}: WorkspaceDeleteProps) => {
|
||||
const [workspaceName] = useBlockSuiteWorkspaceName(
|
||||
workspace.blockSuiteWorkspace
|
||||
);
|
||||
const [deleteStr, setDeleteStr] = useState<string>('');
|
||||
const allowDelete = deleteStr === workspaceName;
|
||||
const t = useAFFiNEI18N();
|
||||
|
||||
const handleDelete = useCallback(() => {
|
||||
onDeleteWorkspace(workspace.id)
|
||||
.then(() => {
|
||||
toast(t['Successfully deleted'](), {
|
||||
portal: document.body,
|
||||
});
|
||||
onClose();
|
||||
})
|
||||
.catch(() => {
|
||||
// ignore error
|
||||
});
|
||||
}, [onClose, onDeleteWorkspace, t, workspace.id]);
|
||||
|
||||
return (
|
||||
<Modal open={open} onClose={onClose}>
|
||||
<StyledModalWrapper>
|
||||
<ModalCloseButton onClick={onClose} />
|
||||
<StyledModalHeader>{t['Delete Workspace']()}?</StyledModalHeader>
|
||||
{workspace.flavour === WorkspaceFlavour.LOCAL ? (
|
||||
<StyledTextContent>
|
||||
<Trans i18nKey="Delete Workspace Description">
|
||||
Deleting (
|
||||
<StyledWorkspaceName>
|
||||
{{ workspace: workspaceName } as any}
|
||||
</StyledWorkspaceName>
|
||||
) cannot be undone, please proceed with caution. All contents will
|
||||
be lost.
|
||||
</Trans>
|
||||
</StyledTextContent>
|
||||
) : (
|
||||
<StyledTextContent>
|
||||
<Trans i18nKey="Delete Workspace Description2">
|
||||
Deleting (
|
||||
<StyledWorkspaceName>
|
||||
{{ workspace: workspaceName } as any}
|
||||
</StyledWorkspaceName>
|
||||
) will delete both local and cloud data, this operation cannot be
|
||||
undone, please proceed with caution.
|
||||
</Trans>
|
||||
</StyledTextContent>
|
||||
)}
|
||||
<StyledInputContent>
|
||||
<Input
|
||||
ref={ref => {
|
||||
if (ref) {
|
||||
setTimeout(() => ref.focus(), 0);
|
||||
}
|
||||
}}
|
||||
onChange={setDeleteStr}
|
||||
data-testid="delete-workspace-input"
|
||||
placeholder={t['Placeholder of delete workspace']()}
|
||||
width={315}
|
||||
height={42}
|
||||
/>
|
||||
</StyledInputContent>
|
||||
<StyledButtonContent>
|
||||
<Button shape="circle" onClick={onClose}>
|
||||
{t['Cancel']()}
|
||||
</Button>
|
||||
<Button
|
||||
data-testid="delete-workspace-confirm-button"
|
||||
disabled={!allowDelete}
|
||||
onClick={handleDelete}
|
||||
type="danger"
|
||||
shape="circle"
|
||||
style={{ marginLeft: '24px' }}
|
||||
>
|
||||
{t['Delete']()}
|
||||
</Button>
|
||||
</StyledButtonContent>
|
||||
</StyledModalWrapper>
|
||||
</Modal>
|
||||
);
|
||||
};
|
||||
@@ -0,0 +1,76 @@
|
||||
import { styled } from '@affine/component';
|
||||
|
||||
export const StyledModalWrapper = styled('div')(() => {
|
||||
return {
|
||||
position: 'relative',
|
||||
padding: '0px',
|
||||
width: '560px',
|
||||
background: 'var(--affine-white)',
|
||||
borderRadius: '12px',
|
||||
// height: '312px',
|
||||
};
|
||||
});
|
||||
|
||||
export const StyledModalHeader = styled('div')(() => {
|
||||
return {
|
||||
margin: '44px 0px 12px 0px',
|
||||
width: '560px',
|
||||
fontWeight: '600',
|
||||
fontSize: '20px;',
|
||||
textAlign: 'center',
|
||||
};
|
||||
});
|
||||
|
||||
// export const StyledModalContent = styled('div')(({ theme }) => {});
|
||||
|
||||
export const StyledTextContent = styled('div')(() => {
|
||||
return {
|
||||
margin: 'auto',
|
||||
width: '425px',
|
||||
fontFamily: 'Avenir Next',
|
||||
fontStyle: 'normal',
|
||||
fontWeight: '400',
|
||||
fontSize: '18px',
|
||||
lineHeight: '26px',
|
||||
textAlign: 'left',
|
||||
};
|
||||
});
|
||||
|
||||
export const StyledInputContent = styled('div')(() => {
|
||||
return {
|
||||
display: 'flex',
|
||||
flexDirection: 'row',
|
||||
justifyContent: 'center',
|
||||
margin: '24px 0',
|
||||
fontSize: 'var(--affine-font-base)',
|
||||
};
|
||||
});
|
||||
|
||||
export const StyledButtonContent = styled('div')(() => {
|
||||
return {
|
||||
marginBottom: '42px',
|
||||
display: 'flex',
|
||||
flexDirection: 'row',
|
||||
justifyContent: 'center',
|
||||
};
|
||||
});
|
||||
|
||||
export const StyledWorkspaceName = styled('span')(() => {
|
||||
return {
|
||||
fontWeight: '600',
|
||||
};
|
||||
});
|
||||
|
||||
// export const StyledCancelButton = styled(Button)(({ theme }) => {
|
||||
// return {
|
||||
// width: '100px',
|
||||
// justifyContent: 'center',
|
||||
// };
|
||||
// });
|
||||
|
||||
// export const StyledDeleteButton = styled(Button)(({ theme }) => {
|
||||
// return {
|
||||
// width: '100px',
|
||||
// justifyContent: 'center',
|
||||
// };
|
||||
// });
|
||||
@@ -0,0 +1,59 @@
|
||||
import { SettingRow } from '@affine/component/setting-components';
|
||||
import { useAFFiNEI18N } from '@affine/i18n/hooks';
|
||||
import { ArrowRightSmallIcon } from '@blocksuite/icons';
|
||||
import { type FC, useState } from 'react';
|
||||
|
||||
import type { AffineOfficialWorkspace } from '../../../../shared';
|
||||
import type { WorkspaceSettingDetailProps } from '../index';
|
||||
import { WorkspaceDeleteModal } from './delete';
|
||||
import { WorkspaceLeave } from './leave';
|
||||
|
||||
export const DeleteLeaveWorkspace: FC<{
|
||||
workspace: AffineOfficialWorkspace;
|
||||
onDeleteWorkspace: WorkspaceSettingDetailProps['onDeleteWorkspace'];
|
||||
}> = ({ workspace, onDeleteWorkspace }) => {
|
||||
const t = useAFFiNEI18N();
|
||||
// fixme: cloud regression
|
||||
const isOwner = true;
|
||||
|
||||
const [showDelete, setShowDelete] = useState(false);
|
||||
const [showLeave, setShowLeave] = useState(false);
|
||||
return (
|
||||
<>
|
||||
<SettingRow
|
||||
name={
|
||||
<span style={{ color: 'var(--affine-error-color)' }}>
|
||||
{isOwner
|
||||
? t['com.affine.settings.workspace.remove']()
|
||||
: t['Leave Workspace']()}
|
||||
</span>
|
||||
}
|
||||
desc={t['com.affine.settings.workspace.remove.message']()}
|
||||
style={{ cursor: 'pointer' }}
|
||||
onClick={() => {
|
||||
setShowDelete(true);
|
||||
}}
|
||||
testId="delete-workspace-button"
|
||||
>
|
||||
<ArrowRightSmallIcon />
|
||||
</SettingRow>
|
||||
{isOwner ? (
|
||||
<WorkspaceDeleteModal
|
||||
onDeleteWorkspace={onDeleteWorkspace}
|
||||
open={showDelete}
|
||||
onClose={() => {
|
||||
setShowDelete(false);
|
||||
}}
|
||||
workspace={workspace}
|
||||
/>
|
||||
) : (
|
||||
<WorkspaceLeave
|
||||
open={showLeave}
|
||||
onClose={() => {
|
||||
setShowLeave(false);
|
||||
}}
|
||||
/>
|
||||
)}
|
||||
</>
|
||||
);
|
||||
};
|
||||
@@ -0,0 +1,50 @@
|
||||
import { Modal } from '@affine/component';
|
||||
import { ModalCloseButton } from '@affine/component';
|
||||
import { Button } from '@affine/component';
|
||||
import { useAFFiNEI18N } from '@affine/i18n/hooks';
|
||||
|
||||
import {
|
||||
StyledButtonContent,
|
||||
StyledModalHeader,
|
||||
StyledModalWrapper,
|
||||
StyledTextContent,
|
||||
} from './style';
|
||||
|
||||
interface WorkspaceDeleteProps {
|
||||
open: boolean;
|
||||
onClose: () => void;
|
||||
}
|
||||
|
||||
export const WorkspaceLeave = ({ open, onClose }: WorkspaceDeleteProps) => {
|
||||
// const { leaveWorkSpace } = useWorkspaceHelper();
|
||||
const t = useAFFiNEI18N();
|
||||
const handleLeave = async () => {
|
||||
// await leaveWorkSpace();
|
||||
onClose();
|
||||
};
|
||||
|
||||
return (
|
||||
<Modal open={open} onClose={onClose}>
|
||||
<StyledModalWrapper>
|
||||
<ModalCloseButton onClick={onClose} />
|
||||
<StyledModalHeader>{t['Leave Workspace']()}</StyledModalHeader>
|
||||
<StyledTextContent>
|
||||
{t['Leave Workspace Description']()}
|
||||
</StyledTextContent>
|
||||
<StyledButtonContent>
|
||||
<Button shape="circle" onClick={onClose}>
|
||||
{t['Cancel']()}
|
||||
</Button>
|
||||
<Button
|
||||
onClick={handleLeave}
|
||||
type="danger"
|
||||
shape="circle"
|
||||
style={{ marginLeft: '24px' }}
|
||||
>
|
||||
{t['Leave']()}
|
||||
</Button>
|
||||
</StyledButtonContent>
|
||||
</StyledModalWrapper>
|
||||
</Modal>
|
||||
);
|
||||
};
|
||||
@@ -0,0 +1,45 @@
|
||||
import { styled } from '@affine/component';
|
||||
|
||||
export const StyledModalWrapper = styled('div')(() => {
|
||||
return {
|
||||
position: 'relative',
|
||||
padding: '0px',
|
||||
width: '460px',
|
||||
background: 'var(--affine-white)',
|
||||
borderRadius: '12px',
|
||||
};
|
||||
});
|
||||
|
||||
export const StyledModalHeader = styled('div')(() => {
|
||||
return {
|
||||
margin: '44px 0px 12px 0px',
|
||||
width: '460px',
|
||||
fontWeight: '600',
|
||||
fontSize: '20px;',
|
||||
textAlign: 'center',
|
||||
};
|
||||
});
|
||||
|
||||
// export const StyledModalContent = styled('div')(({ theme }) => {});
|
||||
|
||||
export const StyledTextContent = styled('div')(() => {
|
||||
return {
|
||||
margin: 'auto',
|
||||
width: '425px',
|
||||
fontFamily: 'Avenir Next',
|
||||
fontStyle: 'normal',
|
||||
fontWeight: '400',
|
||||
fontSize: '18px',
|
||||
lineHeight: '26px',
|
||||
textAlign: 'center',
|
||||
};
|
||||
});
|
||||
|
||||
export const StyledButtonContent = styled('div')(() => {
|
||||
return {
|
||||
display: 'flex',
|
||||
flexDirection: 'row',
|
||||
justifyContent: 'center',
|
||||
margin: '0px 0 32px 0',
|
||||
};
|
||||
});
|
||||
@@ -0,0 +1,34 @@
|
||||
import { Button, toast } from '@affine/component';
|
||||
import { SettingRow } from '@affine/component/setting-components';
|
||||
import { useAFFiNEI18N } from '@affine/i18n/hooks';
|
||||
import type { FC } from 'react';
|
||||
|
||||
import type { AffineOfficialWorkspace } from '../../../shared';
|
||||
|
||||
export const ExportPanel: FC<{
|
||||
workspace: AffineOfficialWorkspace;
|
||||
}> = ({ workspace }) => {
|
||||
const workspaceId = workspace.id;
|
||||
const t = useAFFiNEI18N();
|
||||
return (
|
||||
<>
|
||||
<SettingRow name={t['Export']()} desc={t['Export Description']()}>
|
||||
<Button
|
||||
size="small"
|
||||
data-testid="export-affine-backup"
|
||||
onClick={async () => {
|
||||
const result = await window.apis?.dialog.saveDBFileAs(workspaceId);
|
||||
if (result?.error) {
|
||||
// @ts-expect-error: result.error is dynamic
|
||||
toast(t[result.error]());
|
||||
} else if (!result?.canceled) {
|
||||
toast(t['Export success']());
|
||||
}
|
||||
}}
|
||||
>
|
||||
{t['Export']()}
|
||||
</Button>
|
||||
</SettingRow>
|
||||
</>
|
||||
);
|
||||
};
|
||||
@@ -0,0 +1,91 @@
|
||||
import {
|
||||
SettingHeader,
|
||||
SettingRow,
|
||||
SettingWrapper,
|
||||
} from '@affine/component/setting-components';
|
||||
import type {
|
||||
WorkspaceFlavour,
|
||||
WorkspaceRegistry,
|
||||
} from '@affine/env/workspace';
|
||||
import { useAFFiNEI18N } from '@affine/i18n/hooks';
|
||||
import { useBlockSuiteWorkspaceName } from '@toeverything/hooks/use-block-suite-workspace-name';
|
||||
import { type FC, useMemo } from 'react';
|
||||
|
||||
import { useWorkspace } from '../../../hooks/use-workspace';
|
||||
import { DeleteLeaveWorkspace } from './delete-leave-workspace';
|
||||
import { ExportPanel } from './export';
|
||||
import { ProfilePanel } from './profile';
|
||||
import { PublishPanel } from './publish';
|
||||
import { StoragePanel } from './storage';
|
||||
|
||||
export type WorkspaceSettingDetailProps = {
|
||||
workspaceId: string;
|
||||
onDeleteWorkspace: (id: string) => Promise<void>;
|
||||
onTransferWorkspace: <
|
||||
From extends WorkspaceFlavour,
|
||||
To extends WorkspaceFlavour,
|
||||
>(
|
||||
from: From,
|
||||
to: To,
|
||||
workspace: WorkspaceRegistry[From]
|
||||
) => void;
|
||||
};
|
||||
|
||||
export const WorkspaceSettingDetail: FC<WorkspaceSettingDetailProps> = ({
|
||||
workspaceId,
|
||||
onDeleteWorkspace,
|
||||
...props
|
||||
}) => {
|
||||
const t = useAFFiNEI18N();
|
||||
const workspace = useWorkspace(workspaceId);
|
||||
const [name] = useBlockSuiteWorkspaceName(workspace.blockSuiteWorkspace);
|
||||
|
||||
const storageAndExportSetting = useMemo(() => {
|
||||
if (environment.isDesktop) {
|
||||
return (
|
||||
<SettingWrapper title={t['Storage and Export']()}>
|
||||
{runtimeConfig.enableMoveDatabase ? (
|
||||
<StoragePanel workspace={workspace} />
|
||||
) : null}
|
||||
<ExportPanel workspace={workspace} />
|
||||
</SettingWrapper>
|
||||
);
|
||||
} else {
|
||||
return null;
|
||||
}
|
||||
}, [t, workspace]);
|
||||
|
||||
return (
|
||||
<>
|
||||
<SettingHeader
|
||||
title={t[`Workspace Settings with name`]({ name })}
|
||||
subtitle={t['You can customize your workspace here.']()}
|
||||
/>
|
||||
<SettingWrapper title={t['Info']()}>
|
||||
<SettingRow
|
||||
name={t['Workspace Profile']()}
|
||||
desc={t[
|
||||
'Only an owner can edit the the Workspace avatar and name.Changes will be shown for everyone.'
|
||||
]()}
|
||||
spreadCol={false}
|
||||
>
|
||||
<ProfilePanel workspace={workspace} />
|
||||
</SettingRow>
|
||||
</SettingWrapper>
|
||||
<SettingWrapper title={t['AFFiNE Cloud']()}>
|
||||
<PublishPanel
|
||||
workspace={workspace}
|
||||
onDeleteWorkspace={onDeleteWorkspace}
|
||||
{...props}
|
||||
/>
|
||||
</SettingWrapper>
|
||||
{storageAndExportSetting}
|
||||
<SettingWrapper>
|
||||
<DeleteLeaveWorkspace
|
||||
workspace={workspace}
|
||||
onDeleteWorkspace={onDeleteWorkspace}
|
||||
/>
|
||||
</SettingWrapper>
|
||||
</>
|
||||
);
|
||||
};
|
||||
@@ -0,0 +1,103 @@
|
||||
import { IconButton, Input, toast } from '@affine/component';
|
||||
import { WorkspaceAvatar } from '@affine/component/workspace-avatar';
|
||||
import { useAFFiNEI18N } from '@affine/i18n/hooks';
|
||||
import { DoneIcon } from '@blocksuite/icons';
|
||||
import { useBlockSuiteWorkspaceAvatarUrl } from '@toeverything/hooks/use-block-suite-workspace-avatar-url';
|
||||
import { useBlockSuiteWorkspaceName } from '@toeverything/hooks/use-block-suite-workspace-name';
|
||||
import { type FC, useCallback, useState } from 'react';
|
||||
|
||||
import type { AffineOfficialWorkspace } from '../../../shared';
|
||||
import { Upload } from '../../pure/file-upload';
|
||||
import * as style from './style.css';
|
||||
|
||||
const CameraIcon = () => {
|
||||
return (
|
||||
<svg
|
||||
width="24"
|
||||
height="24"
|
||||
viewBox="0 0 24 24"
|
||||
fill="none"
|
||||
xmlns="http://www.w3.org/2000/svg"
|
||||
>
|
||||
<path
|
||||
fillRule="evenodd"
|
||||
clipRule="evenodd"
|
||||
d="M10.6236 4.25001C10.635 4.25001 10.6467 4.25002 10.6584 4.25002H13.3416C13.3533 4.25002 13.365 4.25001 13.3764 4.25001C13.5609 4.24995 13.7105 4.2499 13.8543 4.26611C14.5981 4.34997 15.2693 4.75627 15.6826 5.38026C15.7624 5.50084 15.83 5.63398 15.9121 5.79586C15.9173 5.80613 15.9226 5.81652 15.9279 5.82703C15.9538 5.87792 15.9679 5.90562 15.9789 5.9261C15.9832 5.9341 15.9857 5.93861 15.9869 5.94065C16.0076 5.97069 16.0435 5.99406 16.0878 5.99905L16.0849 5.99877C16.0849 5.99877 16.0907 5.99918 16.1047 5.99947C16.1286 5.99998 16.1604 6.00002 16.2181 6.00002L17.185 6.00001C17.6577 6 18.0566 5.99999 18.3833 6.02627C18.7252 6.05377 19.0531 6.11364 19.3656 6.27035C19.8402 6.50842 20.2283 6.88944 20.4723 7.36077C20.6336 7.67233 20.6951 7.99944 20.7232 8.33858C20.75 8.66166 20.75 9.05554 20.75 9.51992V16.2301C20.75 16.6945 20.75 17.0884 20.7232 17.4114C20.6951 17.7506 20.6336 18.0777 20.4723 18.3893C20.2283 18.8606 19.8402 19.2416 19.3656 19.4797C19.0531 19.6364 18.7252 19.6963 18.3833 19.7238C18.0566 19.75 17.6578 19.75 17.185 19.75H6.81497C6.34225 19.75 5.9434 19.75 5.61668 19.7238C5.27477 19.6963 4.94688 19.6364 4.63444 19.4797C4.15978 19.2416 3.77167 18.8606 3.52771 18.3893C3.36644 18.0777 3.30494 17.7506 3.27679 17.4114C3.24998 17.0884 3.24999 16.6945 3.25 16.2302V9.51987C3.24999 9.05551 3.24998 8.66164 3.27679 8.33858C3.30494 7.99944 3.36644 7.67233 3.52771 7.36077C3.77167 6.88944 4.15978 6.50842 4.63444 6.27035C4.94688 6.11364 5.27477 6.05377 5.61668 6.02627C5.9434 5.99999 6.34225 6 6.81498 6.00001L7.78191 6.00002C7.83959 6.00002 7.87142 5.99998 7.8953 5.99947C7.90607 5.99924 7.91176 5.99897 7.91398 5.99884C7.95747 5.99343 7.99267 5.9703 8.01312 5.94066C8.01429 5.93863 8.01684 5.93412 8.02113 5.9261C8.0321 5.90561 8.04622 5.87791 8.07206 5.82703C8.07739 5.81653 8.08266 5.80615 8.08787 5.79588C8.17004 5.63397 8.23759 5.50086 8.31745 5.38026C8.73067 4.75627 9.40192 4.34997 10.1457 4.26611C10.2895 4.2499 10.4391 4.24995 10.6236 4.25001ZM10.6584 5.75002C10.422 5.75002 10.3627 5.75114 10.3138 5.75666C10.0055 5.79142 9.73316 5.95919 9.56809 6.20845C9.54218 6.24758 9.51544 6.29761 9.40943 6.50633C9.40611 6.51287 9.40274 6.5195 9.39934 6.52622C9.36115 6.60161 9.31758 6.68761 9.26505 6.76694C8.9964 7.17261 8.56105 7.4354 8.08026 7.48961C7.98625 7.50021 7.89021 7.50011 7.80434 7.50003C7.79678 7.50002 7.7893 7.50002 7.78191 7.50002H6.84445C6.33444 7.50002 5.99634 7.50058 5.73693 7.52144C5.48594 7.54163 5.37478 7.57713 5.30693 7.61115C5.11257 7.70864 4.95675 7.86306 4.85983 8.05029C4.82733 8.11308 4.79194 8.21816 4.77165 8.46266C4.7506 8.71626 4.75 9.0474 4.75 9.55001V16.2C4.75 16.7026 4.7506 17.0338 4.77165 17.2874C4.79194 17.5319 4.82733 17.6369 4.85983 17.6997C4.95675 17.887 5.11257 18.0414 5.30693 18.1389C5.37478 18.1729 5.48594 18.2084 5.73693 18.2286C5.99634 18.2494 6.33444 18.25 6.84445 18.25H17.1556C17.6656 18.25 18.0037 18.2494 18.2631 18.2286C18.5141 18.2084 18.6252 18.1729 18.6931 18.1389C18.8874 18.0414 19.0433 17.887 19.1402 17.6997C19.1727 17.6369 19.2081 17.5319 19.2283 17.2874C19.2494 17.0338 19.25 16.7026 19.25 16.2V9.55001C19.25 9.0474 19.2494 8.71626 19.2283 8.46266C19.2081 8.21816 19.1727 8.11308 19.1402 8.05029C19.0433 7.86306 18.8874 7.70864 18.6931 7.61115C18.6252 7.57713 18.5141 7.54163 18.2631 7.52144C18.0037 7.50058 17.6656 7.50002 17.1556 7.50002H16.2181C16.2107 7.50002 16.2032 7.50002 16.1957 7.50003C16.1098 7.50011 16.0138 7.50021 15.9197 7.48961C15.4389 7.4354 15.0036 7.17261 14.735 6.76694C14.6824 6.68761 14.6389 6.60163 14.6007 6.52622C14.5973 6.5195 14.5939 6.51287 14.5906 6.50633C14.4846 6.29763 14.4578 6.24758 14.4319 6.20846C14.2668 5.95919 13.9945 5.79142 13.6862 5.75666C13.6373 5.75114 13.578 5.75002 13.3416 5.75002H10.6584ZM12 11C10.9303 11 10.0833 11.8506 10.0833 12.875C10.0833 13.8995 10.9303 14.75 12 14.75C13.0697 14.75 13.9167 13.8995 13.9167 12.875C13.9167 11.8506 13.0697 11 12 11ZM8.58333 12.875C8.58333 11 10.1242 9.50002 12 9.50002C13.8758 9.50002 15.4167 11 15.4167 12.875C15.4167 14.7501 13.8758 16.25 12 16.25C10.1242 16.25 8.58333 14.7501 8.58333 12.875Z"
|
||||
fill="white"
|
||||
/>
|
||||
</svg>
|
||||
);
|
||||
};
|
||||
|
||||
export const ProfilePanel: FC<{
|
||||
workspace: AffineOfficialWorkspace;
|
||||
}> = ({ workspace }) => {
|
||||
const t = useAFFiNEI18N();
|
||||
|
||||
const [, update] = useBlockSuiteWorkspaceAvatarUrl(
|
||||
workspace.blockSuiteWorkspace
|
||||
);
|
||||
|
||||
const [name, setName] = useBlockSuiteWorkspaceName(
|
||||
workspace.blockSuiteWorkspace
|
||||
);
|
||||
|
||||
const [input, setInput] = useState<string>(name);
|
||||
|
||||
const handleUpdateWorkspaceName = useCallback(
|
||||
(name: string) => {
|
||||
setName(name);
|
||||
toast(t['Update workspace name success']());
|
||||
},
|
||||
[setName, t]
|
||||
);
|
||||
|
||||
return (
|
||||
<div className={style.profileWrapper}>
|
||||
<div className={style.avatarWrapper}>
|
||||
<Upload
|
||||
accept="image/gif,image/jpeg,image/jpg,image/png,image/svg"
|
||||
fileChange={update}
|
||||
data-testid="upload-avatar"
|
||||
>
|
||||
<>
|
||||
<div className="camera-icon-wrapper">
|
||||
<CameraIcon />
|
||||
</div>
|
||||
<WorkspaceAvatar
|
||||
size={56}
|
||||
workspace={workspace.blockSuiteWorkspace}
|
||||
/>
|
||||
</>
|
||||
</Upload>
|
||||
</div>
|
||||
<div className={style.profileHandlerWrapper}>
|
||||
<Input
|
||||
width={280}
|
||||
height={32}
|
||||
defaultValue={input}
|
||||
data-testid="workspace-name-input"
|
||||
placeholder={t['Workspace Name']()}
|
||||
maxLength={64}
|
||||
minLength={0}
|
||||
onChange={setInput}
|
||||
/>
|
||||
{input === workspace.blockSuiteWorkspace.meta.name ? null : (
|
||||
<IconButton
|
||||
size="middle"
|
||||
data-testid="save-workspace-name"
|
||||
onClick={() => {
|
||||
handleUpdateWorkspaceName(input);
|
||||
}}
|
||||
style={{
|
||||
color: 'var(--affine-primary-color)',
|
||||
marginLeft: '12px',
|
||||
}}
|
||||
>
|
||||
<DoneIcon />
|
||||
</IconButton>
|
||||
)}
|
||||
</div>
|
||||
</div>
|
||||
);
|
||||
};
|
||||
@@ -0,0 +1,176 @@
|
||||
import { Button, FlexWrapper, Switch, Tooltip } from '@affine/component';
|
||||
import { SettingRow } from '@affine/component/setting-components';
|
||||
import { Unreachable } from '@affine/env/constant';
|
||||
import type {
|
||||
AffineCloudWorkspace,
|
||||
LocalWorkspace,
|
||||
} from '@affine/env/workspace';
|
||||
import { WorkspaceFlavour } from '@affine/env/workspace';
|
||||
import { useAFFiNEI18N } from '@affine/i18n/hooks';
|
||||
import { useBlockSuiteWorkspaceName } from '@toeverything/hooks/use-block-suite-workspace-name';
|
||||
import type { FC } from 'react';
|
||||
import { useCallback, useEffect, useState } from 'react';
|
||||
|
||||
import type { AffineOfficialWorkspace } from '../../../shared';
|
||||
import { toast } from '../../../utils';
|
||||
import { EnableAffineCloudModal } from '../enable-affine-cloud-modal';
|
||||
import { TmpDisableAffineCloudModal } from '../tmp-disable-affine-cloud-modal';
|
||||
import type { WorkspaceSettingDetailProps } from './index';
|
||||
import * as style from './style.css';
|
||||
|
||||
export type PublishPanelProps = Omit<
|
||||
WorkspaceSettingDetailProps,
|
||||
'workspaceId'
|
||||
> & {
|
||||
workspace: AffineOfficialWorkspace;
|
||||
};
|
||||
export type PublishPanelLocalProps = Omit<
|
||||
WorkspaceSettingDetailProps,
|
||||
'workspaceId'
|
||||
> & {
|
||||
workspace: LocalWorkspace;
|
||||
};
|
||||
export type PublishPanelAffineProps = Omit<
|
||||
WorkspaceSettingDetailProps,
|
||||
'workspaceId'
|
||||
> & {
|
||||
workspace: AffineCloudWorkspace;
|
||||
};
|
||||
|
||||
const PublishPanelAffine: FC<PublishPanelAffineProps> = props => {
|
||||
const { workspace } = props;
|
||||
const t = useAFFiNEI18N();
|
||||
// const toggleWorkspacePublish = useToggleWorkspacePublish(workspace);
|
||||
|
||||
const [origin, setOrigin] = useState('');
|
||||
const shareUrl = origin + '/public-workspace/' + workspace.id;
|
||||
|
||||
useEffect(() => {
|
||||
setOrigin(
|
||||
typeof window !== 'undefined' && window.location.origin
|
||||
? window.location.origin
|
||||
: ''
|
||||
);
|
||||
}, []);
|
||||
|
||||
const copyUrl = useCallback(async () => {
|
||||
await navigator.clipboard.writeText(shareUrl);
|
||||
toast(t['Copied link to clipboard']());
|
||||
}, [shareUrl, t]);
|
||||
return (
|
||||
<>
|
||||
<SettingRow
|
||||
name={t['Publish']()}
|
||||
desc={
|
||||
// workspace.public ? t['Unpublished hint']() : t['Published hint']()
|
||||
'UNFINISHED'
|
||||
}
|
||||
>
|
||||
{/* <Switch
|
||||
checked={workspace.public}
|
||||
onChange={checked => toggleWorkspacePublish(checked)}
|
||||
/> */}
|
||||
</SettingRow>
|
||||
<FlexWrapper justifyContent="space-between">
|
||||
<Button
|
||||
className={style.urlButton}
|
||||
size="middle"
|
||||
onClick={useCallback(() => {
|
||||
window.open(shareUrl, '_blank');
|
||||
}, [shareUrl])}
|
||||
title={shareUrl}
|
||||
>
|
||||
{shareUrl}
|
||||
</Button>
|
||||
<Button size="middle" onClick={copyUrl}>
|
||||
{t['Copy']()}
|
||||
</Button>
|
||||
</FlexWrapper>
|
||||
</>
|
||||
);
|
||||
};
|
||||
|
||||
const FakePublishPanelAffine: FC<{
|
||||
workspace: AffineOfficialWorkspace;
|
||||
}> = () => {
|
||||
const t = useAFFiNEI18N();
|
||||
return (
|
||||
<Tooltip
|
||||
content={t['com.affine.settings.workspace.publish.local-tooltip']()}
|
||||
placement="top"
|
||||
>
|
||||
<div className={style.fakeWrapper}>
|
||||
<SettingRow name={t['Publish']()} desc={t['Unpublished hint']()}>
|
||||
<Switch checked={false} />
|
||||
</SettingRow>
|
||||
</div>
|
||||
</Tooltip>
|
||||
);
|
||||
};
|
||||
const PublishPanelLocal: FC<PublishPanelLocalProps> = ({
|
||||
workspace,
|
||||
onTransferWorkspace,
|
||||
}) => {
|
||||
const t = useAFFiNEI18N();
|
||||
const [name] = useBlockSuiteWorkspaceName(workspace.blockSuiteWorkspace);
|
||||
|
||||
const [open, setOpen] = useState(false);
|
||||
|
||||
return (
|
||||
<>
|
||||
<SettingRow
|
||||
name={t['Workspace saved locally']({ name })}
|
||||
desc={t['Enable cloud hint']()}
|
||||
spreadCol={false}
|
||||
style={{
|
||||
padding: '10px',
|
||||
background: 'var(--affine-background-secondary-color)',
|
||||
}}
|
||||
>
|
||||
<Button
|
||||
data-testid="publish-enable-affine-cloud-button"
|
||||
type="primary"
|
||||
onClick={() => {
|
||||
setOpen(true);
|
||||
}}
|
||||
style={{ marginTop: '12px' }}
|
||||
>
|
||||
{t['Enable AFFiNE Cloud']()}
|
||||
</Button>
|
||||
</SettingRow>
|
||||
<FakePublishPanelAffine workspace={workspace} />
|
||||
{runtimeConfig.enableCloud ? (
|
||||
<EnableAffineCloudModal
|
||||
open={open}
|
||||
onClose={() => {
|
||||
setOpen(false);
|
||||
}}
|
||||
onConfirm={() => {
|
||||
onTransferWorkspace(
|
||||
WorkspaceFlavour.LOCAL,
|
||||
WorkspaceFlavour.AFFINE_CLOUD,
|
||||
workspace
|
||||
);
|
||||
setOpen(false);
|
||||
}}
|
||||
/>
|
||||
) : (
|
||||
<TmpDisableAffineCloudModal
|
||||
open={open}
|
||||
onClose={() => {
|
||||
setOpen(false);
|
||||
}}
|
||||
/>
|
||||
)}
|
||||
</>
|
||||
);
|
||||
};
|
||||
|
||||
export const PublishPanel: FC<PublishPanelProps> = props => {
|
||||
if (props.workspace.flavour === WorkspaceFlavour.AFFINE_CLOUD) {
|
||||
return <PublishPanelAffine {...props} workspace={props.workspace} />;
|
||||
} else if (props.workspace.flavour === WorkspaceFlavour.LOCAL) {
|
||||
return <PublishPanelLocal {...props} workspace={props.workspace} />;
|
||||
}
|
||||
throw new Unreachable();
|
||||
};
|
||||
@@ -0,0 +1,123 @@
|
||||
import { Button, FlexWrapper, toast, Tooltip } from '@affine/component';
|
||||
import { SettingRow } from '@affine/component/setting-components';
|
||||
import { useAFFiNEI18N } from '@affine/i18n/hooks';
|
||||
import { useMemo } from 'react';
|
||||
import { type FC, useCallback, useEffect, useState } from 'react';
|
||||
|
||||
import type { AffineOfficialWorkspace } from '../../../shared';
|
||||
import * as style from './style.css';
|
||||
|
||||
const useDBFileSecondaryPath = (workspaceId: string) => {
|
||||
const [path, setPath] = useState<string | undefined>(undefined);
|
||||
useEffect(() => {
|
||||
if (window.apis && window.events && environment.isDesktop) {
|
||||
window.apis?.workspace
|
||||
.getMeta(workspaceId)
|
||||
.then(meta => {
|
||||
setPath(meta.secondaryDBPath);
|
||||
})
|
||||
.catch(err => {
|
||||
console.error(err);
|
||||
});
|
||||
return window.events.workspace.onMetaChange((newMeta: any) => {
|
||||
if (newMeta.workspaceId === workspaceId) {
|
||||
const meta = newMeta.meta;
|
||||
setPath(meta.secondaryDBPath);
|
||||
}
|
||||
});
|
||||
}
|
||||
}, [workspaceId]);
|
||||
return path;
|
||||
};
|
||||
|
||||
export const StoragePanel: FC<{
|
||||
workspace: AffineOfficialWorkspace;
|
||||
}> = ({ workspace }) => {
|
||||
const workspaceId = workspace.id;
|
||||
const t = useAFFiNEI18N();
|
||||
const secondaryPath = useDBFileSecondaryPath(workspaceId);
|
||||
|
||||
const [moveToInProgress, setMoveToInProgress] = useState<boolean>(false);
|
||||
const onRevealDBFile = useCallback(() => {
|
||||
window.apis?.dialog.revealDBFile(workspaceId).catch(err => {
|
||||
console.error(err);
|
||||
});
|
||||
}, [workspaceId]);
|
||||
|
||||
const handleMoveTo = useCallback(() => {
|
||||
if (moveToInProgress) {
|
||||
return;
|
||||
}
|
||||
setMoveToInProgress(true);
|
||||
window.apis?.dialog
|
||||
.moveDBFile(workspaceId)
|
||||
.then(result => {
|
||||
if (!result?.error && !result?.canceled) {
|
||||
toast(t['Move folder success']());
|
||||
} else if (result?.error) {
|
||||
// @ts-expect-error: result.error is dynamic
|
||||
toast(t[result.error]());
|
||||
}
|
||||
})
|
||||
.catch(() => {
|
||||
toast(t['UNKNOWN_ERROR']());
|
||||
})
|
||||
.finally(() => {
|
||||
setMoveToInProgress(false);
|
||||
});
|
||||
}, [moveToInProgress, t, workspaceId]);
|
||||
|
||||
const rowContent = useMemo(
|
||||
() =>
|
||||
secondaryPath ? (
|
||||
<FlexWrapper justifyContent="space-between">
|
||||
<Tooltip
|
||||
zIndex={1000}
|
||||
content={t['com.affine.settings.storage.db-location.change-hint']()}
|
||||
placement="top-start"
|
||||
>
|
||||
<Button
|
||||
data-testid="move-folder"
|
||||
className={style.urlButton}
|
||||
size="middle"
|
||||
onClick={handleMoveTo}
|
||||
>
|
||||
{secondaryPath}
|
||||
</Button>
|
||||
</Tooltip>
|
||||
<Button
|
||||
size="small"
|
||||
data-testid="reveal-folder"
|
||||
data-disabled={moveToInProgress}
|
||||
onClick={onRevealDBFile}
|
||||
>
|
||||
{t['Open folder']()}
|
||||
</Button>
|
||||
</FlexWrapper>
|
||||
) : (
|
||||
<Button
|
||||
size="small"
|
||||
data-testid="move-folder"
|
||||
data-disabled={moveToInProgress}
|
||||
onClick={handleMoveTo}
|
||||
>
|
||||
{t['Move folder']()}
|
||||
</Button>
|
||||
),
|
||||
[handleMoveTo, moveToInProgress, onRevealDBFile, secondaryPath, t]
|
||||
);
|
||||
|
||||
return (
|
||||
<SettingRow
|
||||
name={t['Storage']()}
|
||||
desc={t[
|
||||
secondaryPath
|
||||
? 'com.affine.settings.storage.description-alt'
|
||||
: 'com.affine.settings.storage.description'
|
||||
]()}
|
||||
spreadCol={!secondaryPath}
|
||||
>
|
||||
{rowContent}
|
||||
</SettingRow>
|
||||
);
|
||||
};
|
||||
@@ -0,0 +1,73 @@
|
||||
import { globalStyle, style } from '@vanilla-extract/css';
|
||||
|
||||
export const profileWrapper = style({
|
||||
display: 'flex',
|
||||
alignItems: 'flex-end',
|
||||
marginTop: '12px',
|
||||
});
|
||||
export const profileHandlerWrapper = style({
|
||||
flexGrow: '1',
|
||||
display: 'flex',
|
||||
alignItems: 'center',
|
||||
marginLeft: '20px',
|
||||
});
|
||||
|
||||
export const avatarWrapper = style({
|
||||
width: '56px',
|
||||
height: '56px',
|
||||
borderRadius: '50%',
|
||||
position: 'relative',
|
||||
overflow: 'hidden',
|
||||
cursor: 'pointer',
|
||||
flexShrink: '0',
|
||||
selectors: {
|
||||
'&.disable': {
|
||||
cursor: 'default',
|
||||
pointerEvents: 'none',
|
||||
},
|
||||
},
|
||||
});
|
||||
globalStyle(`${avatarWrapper}:hover .camera-icon-wrapper`, {
|
||||
display: 'flex',
|
||||
});
|
||||
globalStyle(`${avatarWrapper} .camera-icon-wrapper`, {
|
||||
width: '100%',
|
||||
height: '100%',
|
||||
position: 'absolute',
|
||||
display: 'none',
|
||||
justifyContent: 'center',
|
||||
alignItems: 'center',
|
||||
backgroundColor: 'rgba(60, 61, 63, 0.5)',
|
||||
zIndex: '1',
|
||||
});
|
||||
|
||||
export const urlButton = style({
|
||||
width: 'calc(100% - 64px - 15px)',
|
||||
justifyContent: 'left',
|
||||
textAlign: 'left',
|
||||
});
|
||||
globalStyle(`${urlButton} span`, {
|
||||
width: '100%',
|
||||
overflow: 'hidden',
|
||||
textOverflow: 'ellipsis',
|
||||
whiteSpace: 'nowrap',
|
||||
color: 'var(--affine-placeholder-color)',
|
||||
fontWeight: '500',
|
||||
});
|
||||
|
||||
export const fakeWrapper = style({
|
||||
position: 'relative',
|
||||
opacity: 0.4,
|
||||
marginTop: '24px',
|
||||
selectors: {
|
||||
'&::after': {
|
||||
content: '""',
|
||||
width: '100%',
|
||||
height: '100%',
|
||||
position: 'absolute',
|
||||
left: 0,
|
||||
top: 0,
|
||||
cursor: 'not-allowed',
|
||||
},
|
||||
},
|
||||
});
|
||||
20
apps/core/src/components/affine/onboarding-modal.tsx
Normal file
@@ -0,0 +1,20 @@
|
||||
import { TourModal } from '@affine/component/tour-modal';
|
||||
import { useAtom } from 'jotai';
|
||||
import type { FC } from 'react';
|
||||
import { memo, useCallback } from 'react';
|
||||
|
||||
import { openOnboardingModalAtom } from '../../atoms';
|
||||
import { guideOnboardingAtom } from '../../atoms/guide';
|
||||
|
||||
export const OnboardingModal: FC = memo(function OnboardingModal() {
|
||||
const [open, setOpen] = useAtom(openOnboardingModalAtom);
|
||||
const [guideOpen, setShowOnboarding] = useAtom(guideOnboardingAtom);
|
||||
const onCloseTourModal = useCallback(() => {
|
||||
setShowOnboarding(false);
|
||||
setOpen(false);
|
||||
}, [setOpen, setShowOnboarding]);
|
||||
|
||||
return (
|
||||
<TourModal open={!open ? guideOpen : open} onClose={onCloseTourModal} />
|
||||
);
|
||||
});
|
||||
@@ -0,0 +1,3 @@
|
||||
export const AccountSetting = () => {
|
||||
return <div>AccountSetting</div>;
|
||||
};
|
||||
@@ -0,0 +1,41 @@
|
||||
import {
|
||||
DiscordIcon,
|
||||
GithubIcon,
|
||||
RedditIcon,
|
||||
TelegramIcon,
|
||||
TwitterIcon,
|
||||
YouTubeIcon,
|
||||
} from './icons';
|
||||
|
||||
export const relatedLinks = [
|
||||
{
|
||||
icon: <GithubIcon />,
|
||||
title: 'GitHub',
|
||||
link: 'https://github.com/toeverything/AFFiNE',
|
||||
},
|
||||
{
|
||||
icon: <TwitterIcon />,
|
||||
title: 'Twitter',
|
||||
link: 'https://twitter.com/AffineOfficial',
|
||||
},
|
||||
{
|
||||
icon: <DiscordIcon />,
|
||||
title: 'Discord',
|
||||
link: 'https://discord.gg/Arn7TqJBvG',
|
||||
},
|
||||
{
|
||||
icon: <YouTubeIcon />,
|
||||
title: 'YouTube',
|
||||
link: 'https://www.youtube.com/@affinepro',
|
||||
},
|
||||
{
|
||||
icon: <TelegramIcon />,
|
||||
title: 'Telegram',
|
||||
link: 'https://t.me/affineworkos',
|
||||
},
|
||||
{
|
||||
icon: <RedditIcon />,
|
||||
title: 'Reddit',
|
||||
link: 'https://www.reddit.com/r/Affine/',
|
||||
},
|
||||
];
|
||||
@@ -0,0 +1,189 @@
|
||||
export const LogoIcon = () => {
|
||||
return (
|
||||
<svg
|
||||
width="50"
|
||||
height="50"
|
||||
viewBox="0 0 50 50"
|
||||
fill="currentColor"
|
||||
xmlns="http://www.w3.org/2000/svg"
|
||||
>
|
||||
<path
|
||||
fillRule="evenodd"
|
||||
clipRule="evenodd"
|
||||
d="M21.1996 0L4 50H14.0741L25.0146 15.4186L35.96 50H46L28.7978 0H21.1996Z"
|
||||
/>
|
||||
</svg>
|
||||
);
|
||||
};
|
||||
export const DocIcon = () => {
|
||||
return (
|
||||
<svg
|
||||
width="50"
|
||||
height="50"
|
||||
viewBox="0 0 50 50"
|
||||
fill="currentColor"
|
||||
xmlns="http://www.w3.org/2000/svg"
|
||||
>
|
||||
<path
|
||||
fillRule="evenodd"
|
||||
clipRule="evenodd"
|
||||
d="M2 40.5353V9.46462C2 6.95444 2.99716 4.54708 4.77212 2.77212C6.54708 0.997163 8.95444 0 11.4646 0H37.7552C39.0224 0 40.0497 1.02726 40.0497 2.29445V33.3652C40.0497 33.4357 40.0465 33.5055 40.0403 33.5744C39.9882 34.1502 39.7234 34.6646 39.3251 35.0385C38.9147 35.4237 38.3625 35.6597 37.7552 35.6597H11.4646C11.0129 35.6597 10.5676 35.7224 10.1404 35.8429C8.60419 36.2781 7.37011 37.4505 6.85245 38.9541C6.67955 39.4584 6.58891 39.9922 6.58891 40.5354C6.58891 41.8285 7.1026 43.0687 8.01697 43.983C8.93134 44.8974 10.1715 45.4111 11.4646 45.4111H42.6309V4.68456C42.6309 3.41736 43.6582 2.3901 44.9254 2.3901C46.1926 2.3901 47.2198 3.41736 47.2198 4.68456V47.7055C47.2198 48.9727 46.1926 50 44.9254 50H11.4646C8.95445 50 6.54708 49.0028 4.77212 47.2279C2.99716 45.4529 2 43.0456 2 40.5353ZM12.6596 38.2409C11.3925 38.2409 10.3652 39.2682 10.3652 40.5354C10.3652 41.8026 11.3925 42.8298 12.6596 42.8298H36.5602C37.8274 42.8298 38.8546 41.8026 38.8546 40.5354C38.8546 39.2682 37.8274 38.2409 36.5602 38.2409H12.6596Z"
|
||||
/>
|
||||
</svg>
|
||||
);
|
||||
};
|
||||
|
||||
export const TwitterIcon = () => {
|
||||
return (
|
||||
<svg
|
||||
width="24"
|
||||
height="24"
|
||||
viewBox="0 0 24 24"
|
||||
fill="none"
|
||||
xmlns="http://www.w3.org/2000/svg"
|
||||
>
|
||||
<path
|
||||
d="M22 5.88235C21.2639 6.21176 20.4704 6.42824 19.6482 6.53176C20.4895 6.03294 21.1396 5.24235 21.4455 4.29176C20.652 4.76235 19.7725 5.09176 18.8451 5.28C18.0899 4.47059 17.0287 4 15.8241 4C13.5774 4 11.7419 5.80706 11.7419 8.03765C11.7419 8.35765 11.7801 8.66824 11.847 8.96C8.4436 8.79059 5.413 7.18118 3.39579 4.74353C3.04207 5.33647 2.8413 6.03294 2.8413 6.76706C2.8413 8.16941 3.55832 9.41176 4.6673 10.1176C3.98853 10.1176 3.35755 9.92941 2.80306 9.64706V9.67529C2.80306 11.6329 4.21797 13.2706 6.09178 13.6376C5.49018 13.7997 4.8586 13.8223 4.24665 13.7035C4.50632 14.5059 5.01485 15.2079 5.70078 15.711C6.38671 16.2141 7.21553 16.4929 8.07075 16.5082C6.62106 17.6381 4.82409 18.2488 2.97514 18.24C2.6501 18.24 2.32505 18.2212 2 18.1835C3.81644 19.3318 5.97706 20 8.29063 20C15.8241 20 19.9637 13.8447 19.9637 8.50824C19.9637 8.32941 19.9637 8.16 19.9541 7.98118C20.7572 7.41647 21.4455 6.70118 22 5.88235Z"
|
||||
fill="#1D9BF0"
|
||||
/>
|
||||
</svg>
|
||||
);
|
||||
};
|
||||
|
||||
export const GithubIcon = () => {
|
||||
return (
|
||||
<svg
|
||||
width="25"
|
||||
height="24"
|
||||
viewBox="0 0 25 24"
|
||||
fill="currentColor"
|
||||
xmlns="http://www.w3.org/2000/svg"
|
||||
>
|
||||
<g clipPath="url(#clip0_3073_4801)">
|
||||
<path
|
||||
fillRule="evenodd"
|
||||
clipRule="evenodd"
|
||||
d="M12.667 2C7.14199 2 2.66699 6.58819 2.66699 12.2529C2.66699 16.7899 5.52949 20.6219 9.50449 21.9804C10.0045 22.0701 10.192 21.7625 10.192 21.4934C10.192 21.2499 10.1795 20.4425 10.1795 19.5838C7.66699 20.058 7.01699 18.9558 6.81699 18.3791C6.70449 18.0843 6.21699 17.1743 5.79199 16.9308C5.44199 16.7386 4.94199 16.2644 5.77949 16.2516C6.56699 16.2388 7.12949 16.9949 7.31699 17.3025C8.21699 18.8533 9.65449 18.4175 10.2295 18.1484C10.317 17.4819 10.5795 17.0334 10.867 16.777C8.64199 16.5207 6.31699 15.6364 6.31699 11.7147C6.31699 10.5997 6.70449 9.67689 7.34199 8.95918C7.24199 8.70286 6.89199 7.65193 7.44199 6.24215C7.44199 6.24215 8.27949 5.97301 10.192 7.29308C10.992 7.06239 11.842 6.94704 12.692 6.94704C13.542 6.94704 14.392 7.06239 15.192 7.29308C17.1045 5.9602 17.942 6.24215 17.942 6.24215C18.492 7.65193 18.142 8.70286 18.042 8.95918C18.6795 9.67689 19.067 10.5868 19.067 11.7147C19.067 15.6492 16.7295 16.5207 14.5045 16.777C14.867 17.0975 15.1795 17.7126 15.1795 18.6738C15.1795 20.0452 15.167 21.1474 15.167 21.4934C15.167 21.7625 15.3545 22.0829 15.8545 21.9804C17.8396 21.2932 19.5646 19.9851 20.7867 18.2401C22.0088 16.4951 22.6664 14.4012 22.667 12.2529C22.667 6.58819 18.192 2 12.667 2Z"
|
||||
/>
|
||||
</g>
|
||||
<defs>
|
||||
<clipPath id="clip0_3073_4801">
|
||||
<rect width="25" height="24" fill="white" />
|
||||
</clipPath>
|
||||
</defs>
|
||||
</svg>
|
||||
);
|
||||
};
|
||||
export const DiscordIcon = () => {
|
||||
return (
|
||||
<svg
|
||||
width="25"
|
||||
height="24"
|
||||
viewBox="0 0 25 24"
|
||||
fill="none"
|
||||
xmlns="http://www.w3.org/2000/svg"
|
||||
>
|
||||
<g clipPath="url(#clip0_3073_4801)">
|
||||
<path
|
||||
d="M19.2565 5.64663C17.9898 5.05614 16.6183 4.62755 15.1897 4.37993C15.1772 4.37953 15.1647 4.38188 15.1532 4.38681C15.1417 4.39175 15.1314 4.39915 15.1231 4.4085C14.9516 4.72279 14.7516 5.13233 14.6183 5.44662C13.103 5.21804 11.562 5.21804 10.0467 5.44662C9.9134 5.1228 9.71339 4.72279 9.53243 4.4085C9.52291 4.38945 9.49434 4.37993 9.46576 4.37993C8.03715 4.62755 6.67521 5.05614 5.39899 5.64663C5.38946 5.64663 5.37994 5.65615 5.37041 5.66568C2.77987 9.54197 2.06556 13.3135 2.41795 17.0469C2.41795 17.066 2.42748 17.085 2.44652 17.0946C4.16086 18.3517 5.80852 19.1137 7.43714 19.6184C7.46571 19.628 7.49428 19.6184 7.50381 19.5994C7.88477 19.0756 8.22764 18.5232 8.52288 17.9422C8.54193 17.9041 8.52288 17.866 8.48479 17.8565C7.94191 17.647 7.42761 17.3993 6.92284 17.1136C6.88474 17.0946 6.88474 17.0374 6.91331 17.0088C7.01808 16.9327 7.12284 16.8469 7.22761 16.7707C7.24666 16.7517 7.27523 16.7517 7.29428 16.7612C10.5706 18.2565 14.104 18.2565 17.3422 16.7612C17.3612 16.7517 17.3898 16.7517 17.4088 16.7707C17.5136 16.8565 17.6184 16.9327 17.7231 17.0184C17.7612 17.0469 17.7612 17.1041 17.7136 17.1231C17.2184 17.4184 16.6945 17.6565 16.1517 17.866C16.1136 17.8755 16.104 17.9232 16.1136 17.9517C16.4183 18.5327 16.7612 19.0851 17.1326 19.6089C17.1612 19.6184 17.1898 19.628 17.2184 19.6184C18.8565 19.1137 20.5042 18.3517 22.2185 17.0946C22.2375 17.085 22.2471 17.066 22.2471 17.0469C22.6661 12.7325 21.5518 8.98958 19.2946 5.66568C19.2851 5.65615 19.2756 5.64663 19.2565 5.64663ZM9.01813 14.7707C8.03715 14.7707 7.21808 13.8659 7.21808 12.7516C7.21808 11.6373 8.01811 10.7325 9.01813 10.7325C10.0277 10.7325 10.8277 11.6468 10.8182 12.7516C10.8182 13.8659 10.0182 14.7707 9.01813 14.7707ZM15.6564 14.7707C14.6754 14.7707 13.8564 13.8659 13.8564 12.7516C13.8564 11.6373 14.6564 10.7325 15.6564 10.7325C16.666 10.7325 17.466 11.6468 17.4565 12.7516C17.4565 13.8659 16.666 14.7707 15.6564 14.7707Z"
|
||||
fill="#5865F2"
|
||||
/>
|
||||
</g>
|
||||
<defs>
|
||||
<clipPath id="clip0_3073_4801">
|
||||
<rect width="25" height="24" fill="white" />
|
||||
</clipPath>
|
||||
</defs>
|
||||
</svg>
|
||||
);
|
||||
};
|
||||
|
||||
export const TelegramIcon = () => {
|
||||
return (
|
||||
<svg
|
||||
width="24"
|
||||
height="24"
|
||||
viewBox="0 0 24 24"
|
||||
fill="none"
|
||||
xmlns="http://www.w3.org/2000/svg"
|
||||
>
|
||||
<path
|
||||
d="M12 2C9.34844 2 6.80312 3.05422 4.92969 4.92891C3.05432 6.80434 2.00052 9.34778 2 12C2 14.6511 3.05469 17.1964 4.92969 19.0711C6.80312 20.9458 9.34844 22 12 22C14.6516 22 17.1969 20.9458 19.0703 19.0711C20.9453 17.1964 22 14.6511 22 12C22 9.34891 20.9453 6.80359 19.0703 4.92891C17.1969 3.05422 14.6516 2 12 2Z"
|
||||
fill="url(#paint0_linear_8233_169329)"
|
||||
/>
|
||||
<path
|
||||
d="M6.5267 11.8943C9.44232 10.6243 11.3861 9.78694 12.3579 9.38241C15.1361 8.22726 15.7126 8.02663 16.0892 8.01983C16.172 8.01851 16.3564 8.03898 16.4767 8.13624C16.5767 8.21827 16.6048 8.32921 16.6189 8.4071C16.6314 8.48491 16.6486 8.66226 16.6345 8.80069C16.4845 10.3819 15.8329 14.2191 15.5017 15.9902C15.3626 16.7396 15.0861 16.9908 14.8189 17.0154C14.2376 17.0688 13.797 16.6316 13.2345 16.263C12.3548 15.686 11.8579 15.3269 11.0033 14.764C10.0158 14.1134 10.6564 13.7557 11.2189 13.1713C11.3658 13.0184 13.9251 10.691 13.9736 10.4799C13.9798 10.4535 13.9861 10.3551 13.9267 10.3032C13.8689 10.2512 13.7829 10.269 13.7204 10.283C13.6314 10.303 12.2267 11.2324 9.5017 13.071C9.10326 13.3451 8.74232 13.4787 8.41732 13.4716C8.06107 13.464 7.37357 13.2698 6.86264 13.1038C6.23764 12.9002 5.7392 12.7926 5.78295 12.4468C5.80482 12.2668 6.05326 12.0826 6.5267 11.8943Z"
|
||||
fill="white"
|
||||
/>
|
||||
<defs>
|
||||
<linearGradient
|
||||
id="paint0_linear_8233_169329"
|
||||
x1="1002"
|
||||
y1="2"
|
||||
x2="1002"
|
||||
y2="2002"
|
||||
gradientUnits="userSpaceOnUse"
|
||||
>
|
||||
<stop stopColor="#2AABEE" />
|
||||
<stop offset="1" stopColor="#229ED9" />
|
||||
</linearGradient>
|
||||
</defs>
|
||||
</svg>
|
||||
);
|
||||
};
|
||||
|
||||
export const RedditIcon = () => {
|
||||
return (
|
||||
<svg
|
||||
width="25"
|
||||
height="24"
|
||||
viewBox="0 0 25 24"
|
||||
fill="none"
|
||||
xmlns="http://www.w3.org/2000/svg"
|
||||
>
|
||||
<path
|
||||
d="M12.334 22C17.8568 22 22.334 17.5228 22.334 12C22.334 6.47715 17.8568 2 12.334 2C6.81114 2 2.33398 6.47715 2.33398 12C2.33398 17.5228 6.81114 22 12.334 22Z"
|
||||
fill="#FF4500"
|
||||
/>
|
||||
<path
|
||||
d="M18.9863 12.0954C18.9863 11.2848 18.3308 10.641 17.5319 10.641C17.1545 10.6404 16.7915 10.7857 16.5186 11.0463C15.5172 10.331 14.1461 9.86611 12.6202 9.8065L13.2877 6.68299L15.4574 7.14783C15.4814 7.69627 15.9343 8.13744 16.4948 8.13744C17.067 8.13744 17.5319 7.6726 17.5319 7.1001C17.5319 6.52791 17.067 6.06299 16.4948 6.06299C16.0895 6.06299 15.7316 6.30143 15.5648 6.64721L13.1448 6.13455C13.0732 6.12252 13.0016 6.13455 12.9539 6.17033C12.8943 6.20611 12.8586 6.26564 12.8468 6.33721L12.1074 9.8183C10.5577 9.86611 9.16273 10.331 8.14945 11.0583C7.87653 10.7976 7.51349 10.6524 7.13609 10.653C6.32539 10.653 5.68164 11.3085 5.68164 12.1074C5.68164 12.7035 6.03922 13.2041 6.54008 13.4308C6.51576 13.5766 6.50379 13.7241 6.5043 13.8719C6.5043 16.113 9.11524 17.9372 12.3341 17.9372C15.553 17.9372 18.1639 16.125 18.1639 13.8719C18.1638 13.7241 18.1519 13.5766 18.1281 13.4308C18.6288 13.2041 18.9863 12.6914 18.9863 12.0954ZM8.99586 13.1325C8.99586 12.5603 9.4607 12.0954 10.0332 12.0954C10.6054 12.0954 11.0703 12.5603 11.0703 13.1325C11.0703 13.7048 10.6055 14.1699 10.0332 14.1699C9.46078 14.1816 8.99586 13.7048 8.99586 13.1325ZM14.8019 15.8865C14.0866 16.6019 12.7274 16.6496 12.3341 16.6496C11.9288 16.6496 10.5697 16.5899 9.86609 15.8865C9.75898 15.7792 9.75898 15.6123 9.86609 15.505C9.97344 15.3979 10.1403 15.3979 10.2477 15.505C10.7008 15.9581 11.6545 16.113 12.3341 16.113C13.0137 16.113 13.9792 15.9581 14.4203 15.505C14.5277 15.3979 14.6945 15.3979 14.8019 15.505C14.8972 15.6123 14.8972 15.7792 14.8019 15.8865ZM14.611 14.1817C14.0387 14.1817 13.5739 13.7168 13.5739 13.1446C13.5739 12.5723 14.0387 12.1074 14.611 12.1074C15.1834 12.1074 15.6483 12.5723 15.6483 13.1446C15.6483 13.7047 15.1834 14.1817 14.611 14.1817Z"
|
||||
fill="white"
|
||||
/>
|
||||
</svg>
|
||||
);
|
||||
};
|
||||
|
||||
export const LinkIcon = () => {
|
||||
return (
|
||||
<svg
|
||||
width="16"
|
||||
height="16"
|
||||
viewBox="0 0 16 16"
|
||||
fill="currentColor"
|
||||
xmlns="http://www.w3.org/2000/svg"
|
||||
>
|
||||
<path
|
||||
fillRule="evenodd"
|
||||
clipRule="evenodd"
|
||||
d="M10.2917 1.33334C10.2917 0.988166 10.5715 0.708344 10.9167 0.708344H14.6667C15.0118 0.708344 15.2917 0.988166 15.2917 1.33334V5.08334C15.2917 5.42852 15.0118 5.70834 14.6667 5.70834C14.3215 5.70834 14.0417 5.42852 14.0417 5.08334V2.84223L8.44194 8.44195C8.19787 8.68603 7.80214 8.68603 7.55806 8.44195C7.31398 8.19787 7.31398 7.80215 7.55806 7.55807L13.1578 1.95834H10.9167C10.5715 1.95834 10.2917 1.67852 10.2917 1.33334ZM3.97464 1.54168L7.58334 1.54168C7.92851 1.54168 8.20834 1.8215 8.20834 2.16668C8.20834 2.51185 7.92851 2.79168 7.58334 2.79168H4C3.52298 2.79168 3.2028 2.79216 2.95623 2.81231C2.71697 2.83186 2.60256 2.86676 2.5271 2.90521C2.33109 3.00508 2.17174 3.16443 2.07187 3.36044C2.03342 3.4359 1.99852 3.55031 1.97897 3.78957C1.95882 4.03614 1.95834 4.35632 1.95834 4.83334V12C1.95834 12.477 1.95882 12.7972 1.97897 13.0438C1.99852 13.283 2.03342 13.3974 2.07187 13.4729C2.17174 13.6689 2.33109 13.8283 2.5271 13.9281C2.60256 13.9666 2.71697 14.0015 2.95623 14.021C3.2028 14.0412 3.52298 14.0417 4 14.0417H11.1667C11.6437 14.0417 11.9639 14.0412 12.2104 14.021C12.4497 14.0015 12.5641 13.9666 12.6396 13.9281C12.8356 13.8283 12.9949 13.6689 13.0948 13.4729C13.1333 13.3974 13.1682 13.283 13.1877 13.0438C13.2079 12.7972 13.2083 12.477 13.2083 12V8.41668C13.2083 8.0715 13.4882 7.79168 13.8333 7.79168C14.1785 7.79168 14.4583 8.0715 14.4583 8.41668V12.0254C14.4583 12.4705 14.4584 12.842 14.4336 13.1456C14.4077 13.4621 14.3518 13.7594 14.2086 14.0404C13.9888 14.4716 13.6383 14.8222 13.2071 15.0419C12.926 15.1851 12.6288 15.241 12.3122 15.2669C12.0087 15.2917 11.6372 15.2917 11.192 15.2917H3.97463C3.5295 15.2917 3.15797 15.2917 2.85444 15.2669C2.53787 15.241 2.24066 15.1851 1.95961 15.0419C1.5284 14.8222 1.17782 14.4716 0.958113 14.0404C0.81491 13.7594 0.758984 13.4621 0.733119 13.1456C0.70832 12.842 0.708327 12.4705 0.708336 12.0254V4.80798C0.708327 4.36285 0.70832 3.99131 0.733119 3.68779C0.758984 3.37121 0.81491 3.074 0.958113 2.79295C1.17782 2.36174 1.5284 2.01116 1.95961 1.79145C2.24066 1.64825 2.53787 1.59232 2.85444 1.56646C3.15797 1.54166 3.52951 1.54167 3.97464 1.54168Z"
|
||||
/>
|
||||
</svg>
|
||||
);
|
||||
};
|
||||
export const YouTubeIcon = () => {
|
||||
return (
|
||||
<svg
|
||||
width="25"
|
||||
height="24"
|
||||
viewBox="0 0 25 24"
|
||||
fill="none"
|
||||
xmlns="http://www.w3.org/2000/svg"
|
||||
>
|
||||
<path
|
||||
d="M21.7477 7.19232C21.6387 6.76858 21.4261 6.38227 21.1311 6.07186C20.8361 5.76145 20.4689 5.53776 20.0662 5.42308C18.5917 5 12.6575 5 12.6575 5C12.6575 5 6.72304 5.01281 5.24858 5.43589C4.84583 5.55057 4.47865 5.77427 4.18363 6.0847C3.88861 6.39512 3.67602 6.78145 3.56705 7.2052C3.12106 9.96155 2.94806 14.1616 3.5793 16.8077C3.68828 17.2314 3.90087 17.6177 4.19589 17.9281C4.49092 18.2386 4.85808 18.4622 5.26083 18.5769C6.73528 19 12.6696 19 12.6696 19C12.6696 19 18.6039 19 20.0783 18.5769C20.481 18.4623 20.8482 18.2386 21.1432 17.9282C21.4383 17.6177 21.6509 17.2314 21.7599 16.8077C22.2303 14.0474 22.3752 9.85004 21.7477 7.1924V7.19232Z"
|
||||
fill="#FF0000"
|
||||
/>
|
||||
<path d="M10.667 15L15.667 12L10.667 9V15Z" fill="white" />
|
||||
</svg>
|
||||
);
|
||||
};
|
||||
@@ -0,0 +1,135 @@
|
||||
import { Switch } from '@affine/component';
|
||||
import { SettingHeader } from '@affine/component/setting-components';
|
||||
import { SettingRow } from '@affine/component/setting-components';
|
||||
import { SettingWrapper } from '@affine/component/setting-components';
|
||||
import { useAFFiNEI18N } from '@affine/i18n/hooks';
|
||||
import { ArrowRightSmallIcon, OpenInNewIcon } from '@blocksuite/icons';
|
||||
import { useCallback } from 'react';
|
||||
|
||||
import { type AppSetting, useAppSetting } from '../../../../../atoms/settings';
|
||||
import { relatedLinks } from './config';
|
||||
import { communityItem, communityWrapper, link } from './style.css';
|
||||
|
||||
export const AboutAffine = () => {
|
||||
const t = useAFFiNEI18N();
|
||||
const [appSettings, setAppSettings] = useAppSetting();
|
||||
const changeSwitch = useCallback(
|
||||
(key: keyof AppSetting, checked: boolean) => {
|
||||
setAppSettings({ [key]: checked });
|
||||
},
|
||||
[setAppSettings]
|
||||
);
|
||||
return (
|
||||
<>
|
||||
<SettingHeader
|
||||
title={t['About AFFiNE']()}
|
||||
subtitle={t['com.affine.settings.about.message']()}
|
||||
data-testid="about-title"
|
||||
/>
|
||||
<SettingWrapper title={t['Version']()}>
|
||||
<SettingRow name={t['App Version']()} desc={runtimeConfig.appVersion} />
|
||||
<SettingRow
|
||||
name={t['Editor Version']()}
|
||||
desc={runtimeConfig.editorVersion}
|
||||
/>
|
||||
{runtimeConfig.enableNewSettingUnstableApi && environment.isDesktop ? (
|
||||
<>
|
||||
<SettingRow
|
||||
name={t['Check for updates']()}
|
||||
desc={t['New version is ready']()}
|
||||
></SettingRow>
|
||||
<SettingRow
|
||||
name={t['Check for updates automatically']()}
|
||||
desc={t['com.affine.settings.about.update.check.message']()}
|
||||
>
|
||||
<Switch
|
||||
checked={appSettings.autoCheckUpdate}
|
||||
onChange={checked => changeSwitch('autoCheckUpdate', checked)}
|
||||
/>
|
||||
</SettingRow>
|
||||
<SettingRow
|
||||
name={t['Download updates automatically']()}
|
||||
desc={t['com.affine.settings.about.update.download.message']()}
|
||||
>
|
||||
<Switch
|
||||
checked={appSettings.autoCheckUpdate}
|
||||
onChange={checked => changeSwitch('autoCheckUpdate', checked)}
|
||||
/>
|
||||
</SettingRow>
|
||||
<SettingRow
|
||||
name={t[`Discover what's new`]()}
|
||||
desc={t['View the AFFiNE Changelog.']()}
|
||||
style={{ cursor: 'pointer' }}
|
||||
onClick={() => {
|
||||
window.open(
|
||||
'https://affine.pro/blog/what-is-new-affine-0717',
|
||||
'_blank'
|
||||
);
|
||||
}}
|
||||
>
|
||||
<ArrowRightSmallIcon />
|
||||
</SettingRow>
|
||||
</>
|
||||
) : null}
|
||||
</SettingWrapper>
|
||||
<SettingWrapper title={t['Contact with us']()}>
|
||||
<a
|
||||
className={link}
|
||||
rel="noreferrer"
|
||||
href="https://affine.pro"
|
||||
target="_blank"
|
||||
>
|
||||
{t['Official Website']()}
|
||||
<OpenInNewIcon className="icon" />
|
||||
</a>
|
||||
<a
|
||||
className={link}
|
||||
rel="noreferrer"
|
||||
href="https://community.affine.pro"
|
||||
target="_blank"
|
||||
>
|
||||
{t['AFFiNE Community']()}
|
||||
<OpenInNewIcon className="icon" />
|
||||
</a>
|
||||
</SettingWrapper>
|
||||
<SettingWrapper title={t['Communities']()}>
|
||||
<div className={communityWrapper}>
|
||||
{relatedLinks.map(({ icon, title, link }) => {
|
||||
return (
|
||||
<div
|
||||
className={communityItem}
|
||||
onClick={() => {
|
||||
window.open(link, '_blank');
|
||||
}}
|
||||
key={title}
|
||||
>
|
||||
{icon}
|
||||
<p>{title}</p>
|
||||
</div>
|
||||
);
|
||||
})}
|
||||
</div>
|
||||
</SettingWrapper>
|
||||
<SettingWrapper title={t['Info of legal']()}>
|
||||
<a
|
||||
className={link}
|
||||
rel="noreferrer"
|
||||
href="https://affine.pro/privacy"
|
||||
target="_blank"
|
||||
>
|
||||
{t['Privacy']()}
|
||||
<OpenInNewIcon className="icon" />
|
||||
</a>
|
||||
<a
|
||||
className={link}
|
||||
rel="noreferrer"
|
||||
href="https://affine.pro/terms"
|
||||
target="_blank"
|
||||
>
|
||||
{t['Terms of Use']()}
|
||||
<OpenInNewIcon className="icon" />
|
||||
</a>
|
||||
</SettingWrapper>
|
||||
</>
|
||||
);
|
||||
};
|
||||
@@ -0,0 +1,45 @@
|
||||
import { globalStyle, style } from '@vanilla-extract/css';
|
||||
|
||||
export const link = style({
|
||||
height: '18px',
|
||||
display: 'flex',
|
||||
alignItems: 'center',
|
||||
color: 'var(--affine-text-primary-color)',
|
||||
fontSize: 'var(--affine-font-sm)',
|
||||
fontWeight: 600,
|
||||
marginBottom: '12px',
|
||||
selectors: {
|
||||
'&:last-of-type': {
|
||||
marginBottom: '0',
|
||||
},
|
||||
},
|
||||
});
|
||||
|
||||
globalStyle(`${link} .icon`, {
|
||||
color: 'var(--affine-icon-color)',
|
||||
fontSize: 'var(--affine-font-base)',
|
||||
marginLeft: '5px',
|
||||
});
|
||||
|
||||
export const communityWrapper = style({
|
||||
display: 'grid',
|
||||
gridTemplateColumns: '15% 15% 15% 15% 15% 15%',
|
||||
gap: '2%',
|
||||
});
|
||||
export const communityItem = style({
|
||||
borderRadius: '8px',
|
||||
border: '1px solid var(--affine-border-color)',
|
||||
color: 'var(--affine-text-primary-color)',
|
||||
cursor: 'pointer',
|
||||
padding: '6px 8px',
|
||||
});
|
||||
globalStyle(`${communityItem} svg`, {
|
||||
width: '24px',
|
||||
height: '24px',
|
||||
display: 'block',
|
||||
margin: '0 auto 2px',
|
||||
});
|
||||
globalStyle(`${communityItem} p`, {
|
||||
fontSize: 'var(--affine-font-xs)',
|
||||
textAlign: 'center',
|
||||
});
|
||||
@@ -0,0 +1,58 @@
|
||||
import { Menu, MenuItem, MenuTrigger } from '@affine/component';
|
||||
import dayjs from 'dayjs';
|
||||
import { type FC, useCallback } from 'react';
|
||||
|
||||
import {
|
||||
dateFormatOptions,
|
||||
type DateFormats,
|
||||
useAppSetting,
|
||||
} from '../../../../../atoms/settings';
|
||||
|
||||
const DateFormatMenuContent: FC<{
|
||||
currentOption: DateFormats;
|
||||
onSelect: (option: DateFormats) => void;
|
||||
}> = ({ onSelect, currentOption }) => {
|
||||
return (
|
||||
<>
|
||||
{dateFormatOptions.map(option => {
|
||||
return (
|
||||
<MenuItem
|
||||
key={option}
|
||||
active={currentOption === option}
|
||||
onClick={() => {
|
||||
onSelect(option);
|
||||
}}
|
||||
>
|
||||
{dayjs(new Date()).format(option)}
|
||||
</MenuItem>
|
||||
);
|
||||
})}
|
||||
</>
|
||||
);
|
||||
};
|
||||
export const DateFormatSetting = () => {
|
||||
const [appearanceSettings, setAppSettings] = useAppSetting();
|
||||
const handleSelect = useCallback(
|
||||
(option: DateFormats) => {
|
||||
setAppSettings({ dateFormat: option });
|
||||
},
|
||||
[setAppSettings]
|
||||
);
|
||||
return (
|
||||
<Menu
|
||||
content={
|
||||
<DateFormatMenuContent
|
||||
onSelect={handleSelect}
|
||||
currentOption={appearanceSettings.dateFormat}
|
||||
/>
|
||||
}
|
||||
placement="bottom-end"
|
||||
trigger="click"
|
||||
disablePortal={true}
|
||||
>
|
||||
<MenuTrigger data-testid="date-format-menu-trigger">
|
||||
{dayjs(new Date()).format(appearanceSettings.dateFormat)}
|
||||
</MenuTrigger>
|
||||
</Menu>
|
||||
);
|
||||
};
|
||||
@@ -0,0 +1,221 @@
|
||||
import { RadioButton, RadioButtonGroup, Switch } from '@affine/component';
|
||||
import { SettingHeader } from '@affine/component/setting-components';
|
||||
import { SettingRow } from '@affine/component/setting-components';
|
||||
import { SettingWrapper } from '@affine/component/setting-components';
|
||||
import { useAFFiNEI18N } from '@affine/i18n/hooks';
|
||||
import { useTheme } from 'next-themes';
|
||||
import { useCallback } from 'react';
|
||||
|
||||
import {
|
||||
type AppSetting,
|
||||
fontStyleOptions,
|
||||
useAppSetting,
|
||||
windowFrameStyleOptions,
|
||||
} from '../../../../../atoms/settings';
|
||||
import { LanguageMenu } from '../../../language-menu';
|
||||
import { DateFormatSetting } from './date-format-setting';
|
||||
import { settingWrapper } from './style.css';
|
||||
|
||||
export const ThemeSettings = () => {
|
||||
const t = useAFFiNEI18N();
|
||||
const { setTheme, theme } = useTheme();
|
||||
|
||||
return (
|
||||
<RadioButtonGroup
|
||||
width={250}
|
||||
className={settingWrapper}
|
||||
defaultValue={theme}
|
||||
onValueChange={useCallback(
|
||||
(value: string) => {
|
||||
setTheme(value);
|
||||
},
|
||||
[setTheme]
|
||||
)}
|
||||
>
|
||||
<RadioButton
|
||||
bold={true}
|
||||
value="system"
|
||||
data-testid="system-theme-trigger"
|
||||
>
|
||||
{t['system']()}
|
||||
</RadioButton>
|
||||
<RadioButton bold={true} value="light" data-testid="light-theme-trigger">
|
||||
{t['light']()}
|
||||
</RadioButton>
|
||||
<RadioButton bold={true} value="dark" data-testid="dark-theme-trigger">
|
||||
{t['dark']()}
|
||||
</RadioButton>
|
||||
</RadioButtonGroup>
|
||||
);
|
||||
};
|
||||
|
||||
const FontFamilySettings = () => {
|
||||
const [appSettings, setAppSettings] = useAppSetting();
|
||||
return (
|
||||
<RadioButtonGroup
|
||||
width={250}
|
||||
className={settingWrapper}
|
||||
defaultValue={appSettings.fontStyle}
|
||||
onValueChange={useCallback(
|
||||
(key: AppSetting['fontStyle']) => {
|
||||
setAppSettings({ fontStyle: key });
|
||||
},
|
||||
[setAppSettings]
|
||||
)}
|
||||
>
|
||||
{fontStyleOptions.map(({ key, value }) => {
|
||||
return (
|
||||
<RadioButton
|
||||
key={key}
|
||||
bold={true}
|
||||
value={key}
|
||||
data-testid="system-font-style-trigger"
|
||||
style={{
|
||||
fontFamily: value,
|
||||
}}
|
||||
>
|
||||
{key}
|
||||
</RadioButton>
|
||||
);
|
||||
})}
|
||||
</RadioButtonGroup>
|
||||
);
|
||||
};
|
||||
|
||||
export const AppearanceSettings = () => {
|
||||
const t = useAFFiNEI18N();
|
||||
|
||||
const [appSettings, setAppSettings] = useAppSetting();
|
||||
const changeSwitch = useCallback(
|
||||
(key: keyof AppSetting, checked: boolean) => {
|
||||
setAppSettings({ [key]: checked });
|
||||
},
|
||||
[setAppSettings]
|
||||
);
|
||||
return (
|
||||
<>
|
||||
<SettingHeader
|
||||
title={t['Appearance Settings']()}
|
||||
subtitle={t['Customize your AFFiNE Appearance']()}
|
||||
/>
|
||||
|
||||
<SettingWrapper title={t['Theme']()}>
|
||||
<SettingRow
|
||||
name={t['Color Scheme']()}
|
||||
desc={t['Choose your color scheme']()}
|
||||
>
|
||||
<ThemeSettings />
|
||||
</SettingRow>
|
||||
<SettingRow
|
||||
name={t['Font Style']()}
|
||||
desc={t['Choose your font style']()}
|
||||
>
|
||||
<FontFamilySettings />
|
||||
</SettingRow>
|
||||
<SettingRow
|
||||
name={t['Display Language']()}
|
||||
desc={t['Select the language for the interface.']()}
|
||||
>
|
||||
<div className={settingWrapper}>
|
||||
<LanguageMenu triggerProps={{ size: 'small' }} />
|
||||
</div>
|
||||
</SettingRow>
|
||||
{environment.isDesktop ? (
|
||||
<SettingRow
|
||||
name={t['Client Border Style']()}
|
||||
desc={t['Customize the appearance of the client.']()}
|
||||
>
|
||||
<Switch
|
||||
checked={appSettings.clientBorder}
|
||||
onChange={checked => changeSwitch('clientBorder', checked)}
|
||||
/>
|
||||
</SettingRow>
|
||||
) : null}
|
||||
|
||||
<SettingRow
|
||||
name={t['Full width Layout']()}
|
||||
desc={t['Maximum display of content within a page.']()}
|
||||
>
|
||||
<Switch
|
||||
data-testid="full-width-layout-trigger"
|
||||
checked={appSettings.fullWidthLayout}
|
||||
onChange={checked => changeSwitch('fullWidthLayout', checked)}
|
||||
/>
|
||||
</SettingRow>
|
||||
{runtimeConfig.enableNewSettingUnstableApi && environment.isDesktop ? (
|
||||
<SettingRow
|
||||
name={t['Window frame style']()}
|
||||
desc={t['Customize appearance of Windows Client.']()}
|
||||
>
|
||||
<RadioButtonGroup
|
||||
className={settingWrapper}
|
||||
width={250}
|
||||
defaultValue={appSettings.windowFrameStyle}
|
||||
onValueChange={(value: AppSetting['windowFrameStyle']) => {
|
||||
setAppSettings({ windowFrameStyle: value });
|
||||
}}
|
||||
>
|
||||
{windowFrameStyleOptions.map(option => {
|
||||
return (
|
||||
<RadioButton value={option} key={option}>
|
||||
{t[option]()}
|
||||
</RadioButton>
|
||||
);
|
||||
})}
|
||||
</RadioButtonGroup>
|
||||
</SettingRow>
|
||||
) : null}
|
||||
</SettingWrapper>
|
||||
{runtimeConfig.enableNewSettingUnstableApi ? (
|
||||
<SettingWrapper title={t['Date']()}>
|
||||
<SettingRow
|
||||
name={t['Date Format']()}
|
||||
desc={t['Customize your date style.']()}
|
||||
>
|
||||
<div className={settingWrapper}>
|
||||
<DateFormatSetting />
|
||||
</div>
|
||||
</SettingRow>
|
||||
<SettingRow
|
||||
name={t['Start Week On Monday']()}
|
||||
desc={t['By default, the week starts on Sunday.']()}
|
||||
>
|
||||
<Switch
|
||||
checked={appSettings.startWeekOnMonday}
|
||||
onChange={checked => changeSwitch('startWeekOnMonday', checked)}
|
||||
/>
|
||||
</SettingRow>
|
||||
</SettingWrapper>
|
||||
) : null}
|
||||
|
||||
{environment.isDesktop ? (
|
||||
<SettingWrapper title={t['Sidebar']()}>
|
||||
<SettingRow
|
||||
name={t['com.affine.settings.appearance.sidebar.noise']()}
|
||||
desc={t['com.affine.settings.appearance.sidebar.noise.message']()}
|
||||
>
|
||||
<Switch
|
||||
checked={appSettings.enableNoisyBackground}
|
||||
onChange={checked =>
|
||||
changeSwitch('enableNoisyBackground', checked)
|
||||
}
|
||||
/>
|
||||
</SettingRow>
|
||||
<SettingRow
|
||||
name={t['com.affine.settings.appearance.sidebar.translucent']()}
|
||||
desc={t[
|
||||
'com.affine.settings.appearance.sidebar.translucent.message'
|
||||
]()}
|
||||
>
|
||||
<Switch
|
||||
checked={appSettings.enableBlurBackground}
|
||||
onChange={checked =>
|
||||
changeSwitch('enableBlurBackground', checked)
|
||||
}
|
||||
/>
|
||||
</SettingRow>
|
||||
</SettingWrapper>
|
||||
) : null}
|
||||
</>
|
||||
);
|
||||
};
|
||||