@chenhui996/gg-cli 1.0.0
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/README.md +15 -0
- package/bin/gg.js +2 -0
- package/dist/index.d.ts +2 -0
- package/dist/index.js +139 -0
- package/dist/index.js.map +1 -0
- package/dist/template/react-temp1/README.md +75 -0
- package/dist/template/react-temp1/eslint.config.js +23 -0
- package/dist/template/react-temp1/index.html +13 -0
- package/dist/template/react-temp1/package.json +34 -0
- package/dist/template/react-temp1/public/favicon.svg +1 -0
- package/dist/template/react-temp1/public/icons.svg +24 -0
- package/dist/template/react-temp1/src/App.css +184 -0
- package/dist/template/react-temp1/src/App.tsx +121 -0
- package/dist/template/react-temp1/src/assets/hero.png +0 -0
- package/dist/template/react-temp1/src/assets/react.svg +1 -0
- package/dist/template/react-temp1/src/assets/vite.svg +1 -0
- package/dist/template/react-temp1/src/index.css +111 -0
- package/dist/template/react-temp1/src/main.tsx +10 -0
- package/dist/template/react-temp1/tsconfig.app.json +28 -0
- package/dist/template/react-temp1/tsconfig.json +7 -0
- package/dist/template/react-temp1/tsconfig.node.json +26 -0
- package/dist/template/react-temp1/vite.config.ts +11 -0
- package/dist/template/react-temp2/README.md +75 -0
- package/dist/template/react-temp2/eslint.config.js +23 -0
- package/dist/template/react-temp2/index.html +13 -0
- package/dist/template/react-temp2/package.json +34 -0
- package/dist/template/react-temp2/public/favicon.svg +1 -0
- package/dist/template/react-temp2/public/icons.svg +24 -0
- package/dist/template/react-temp2/src/App.css +184 -0
- package/dist/template/react-temp2/src/App.tsx +121 -0
- package/dist/template/react-temp2/src/assets/hero.png +0 -0
- package/dist/template/react-temp2/src/assets/react.svg +1 -0
- package/dist/template/react-temp2/src/assets/vite.svg +1 -0
- package/dist/template/react-temp2/src/index.css +111 -0
- package/dist/template/react-temp2/src/main.tsx +10 -0
- package/dist/template/react-temp2/tsconfig.app.json +28 -0
- package/dist/template/react-temp2/tsconfig.json +7 -0
- package/dist/template/react-temp2/tsconfig.node.json +26 -0
- package/dist/template/react-temp2/vite.config.ts +11 -0
- package/package.json +38 -0
package/README.md
ADDED
package/bin/gg.js
ADDED
package/dist/index.d.ts
ADDED
package/dist/index.js
ADDED
|
@@ -0,0 +1,139 @@
|
|
|
1
|
+
// src/index.ts
|
|
2
|
+
import { Command } from "commander";
|
|
3
|
+
|
|
4
|
+
// src/commands/create.ts
|
|
5
|
+
import { input, select, confirm } from "@inquirer/prompts";
|
|
6
|
+
import chalk from "chalk";
|
|
7
|
+
import fs from "fs-extra";
|
|
8
|
+
import path from "path";
|
|
9
|
+
import { fileURLToPath } from "url";
|
|
10
|
+
import { execa } from "execa";
|
|
11
|
+
import ora from "ora";
|
|
12
|
+
|
|
13
|
+
// src/utils/pkg-manager.ts
|
|
14
|
+
function getUserPkgManager() {
|
|
15
|
+
const userAgent = process.env.npm_config_user_agent;
|
|
16
|
+
if (userAgent) {
|
|
17
|
+
if (userAgent.startsWith("yarn")) {
|
|
18
|
+
return "yarn";
|
|
19
|
+
} else if (userAgent.startsWith("pnpm")) {
|
|
20
|
+
return "pnpm";
|
|
21
|
+
} else if (userAgent.startsWith("bun")) {
|
|
22
|
+
return "bun";
|
|
23
|
+
}
|
|
24
|
+
}
|
|
25
|
+
return "npm";
|
|
26
|
+
}
|
|
27
|
+
|
|
28
|
+
// src/commands/create.ts
|
|
29
|
+
async function create(projectName) {
|
|
30
|
+
const pkgManager = getUserPkgManager();
|
|
31
|
+
const __filename = fileURLToPath(import.meta.url);
|
|
32
|
+
const __dirname = path.dirname(__filename);
|
|
33
|
+
const templateDir = path.resolve(__dirname, "template");
|
|
34
|
+
if (!fs.existsSync(templateDir)) {
|
|
35
|
+
console.error(chalk.red("\u274C \u9519\u8BEF\uFF1A\u672A\u627E\u5230\u6A21\u677F\u76EE\u5F55\uFF01"));
|
|
36
|
+
console.log(chalk.yellow(`\u9884\u671F\u8DEF\u5F84: ${templateDir}`));
|
|
37
|
+
process.exit(1);
|
|
38
|
+
}
|
|
39
|
+
const templates = fs.readdirSync(templateDir).filter((file) => {
|
|
40
|
+
return fs.statSync(path.join(templateDir, file)).isDirectory();
|
|
41
|
+
});
|
|
42
|
+
if (templates.length === 0) {
|
|
43
|
+
console.error(chalk.red("\u274C \u9519\u8BEF\uFF1A\u6A21\u677F\u76EE\u5F55\u4E3A\u7A7A\uFF01"));
|
|
44
|
+
process.exit(1);
|
|
45
|
+
}
|
|
46
|
+
try {
|
|
47
|
+
let finalProjectName = projectName;
|
|
48
|
+
if (!finalProjectName) {
|
|
49
|
+
finalProjectName = await input({
|
|
50
|
+
message: "\u8BF7\u8F93\u5165\u9879\u76EE\u540D\u79F0:",
|
|
51
|
+
validate: (value) => {
|
|
52
|
+
if (!value.trim()) return "\u9879\u76EE\u540D\u79F0\u4E0D\u80FD\u4E3A\u7A7A";
|
|
53
|
+
return true;
|
|
54
|
+
}
|
|
55
|
+
});
|
|
56
|
+
}
|
|
57
|
+
const template = await select({
|
|
58
|
+
message: "\u8BF7\u9009\u62E9\u9879\u76EE\u6A21\u677F:",
|
|
59
|
+
choices: templates.map((t) => ({
|
|
60
|
+
name: t,
|
|
61
|
+
value: t
|
|
62
|
+
}))
|
|
63
|
+
});
|
|
64
|
+
const install = await confirm({
|
|
65
|
+
message: "\u662F\u5426\u81EA\u52A8\u5B89\u88C5\u4F9D\u8D56?",
|
|
66
|
+
default: true
|
|
67
|
+
});
|
|
68
|
+
console.log(chalk.blue(`
|
|
69
|
+
\u{1F680} \u51C6\u5907\u521B\u5EFA\u9879\u76EE: ${finalProjectName}`));
|
|
70
|
+
const selectedTemplatePath = path.join(templateDir, template);
|
|
71
|
+
const targetPath = path.resolve(process.cwd(), finalProjectName);
|
|
72
|
+
if (fs.existsSync(targetPath)) {
|
|
73
|
+
const overwrite = await confirm({
|
|
74
|
+
message: `\u76EE\u5F55 ${finalProjectName} \u5DF2\u5B58\u5728\uFF0C\u662F\u5426\u8986\u76D6?`,
|
|
75
|
+
default: false
|
|
76
|
+
});
|
|
77
|
+
if (!overwrite) {
|
|
78
|
+
console.log(chalk.yellow("\u5DF2\u53D6\u6D88\u521B\u5EFA\u3002"));
|
|
79
|
+
return;
|
|
80
|
+
}
|
|
81
|
+
await fs.remove(targetPath);
|
|
82
|
+
}
|
|
83
|
+
const spinner = ora("\u6B63\u5728\u590D\u5236\u6A21\u677F...").start();
|
|
84
|
+
await fs.copy(selectedTemplatePath, targetPath);
|
|
85
|
+
const pkgPath = path.join(targetPath, "package.json");
|
|
86
|
+
if (await fs.pathExists(pkgPath)) {
|
|
87
|
+
const pkg = await fs.readJson(pkgPath);
|
|
88
|
+
pkg.name = finalProjectName;
|
|
89
|
+
await fs.writeJson(pkgPath, pkg, { spaces: 2 });
|
|
90
|
+
}
|
|
91
|
+
spinner.succeed("\u6A21\u677F\u590D\u5236\u5B8C\u6210");
|
|
92
|
+
if (install) {
|
|
93
|
+
const installSpinner = ora(`\u6B63\u5728\u5B89\u88C5\u4F9D\u8D56 (${pkgManager} install)...`).start();
|
|
94
|
+
try {
|
|
95
|
+
await execa(pkgManager, ["install"], { cwd: targetPath });
|
|
96
|
+
installSpinner.succeed("\u4F9D\u8D56\u5B89\u88C5\u6210\u529F");
|
|
97
|
+
} catch (error) {
|
|
98
|
+
installSpinner.fail("\u4F9D\u8D56\u5B89\u88C5\u5931\u8D25");
|
|
99
|
+
console.error(chalk.red(error));
|
|
100
|
+
}
|
|
101
|
+
}
|
|
102
|
+
const gitSpinner = ora("\u6B63\u5728\u521D\u59CB\u5316 Git \u4ED3\u5E93...").start();
|
|
103
|
+
try {
|
|
104
|
+
if (fs.existsSync(path.join(targetPath, ".git"))) {
|
|
105
|
+
gitSpinner.succeed("Git \u4ED3\u5E93\u5DF2\u5B58\u5728\uFF0C\u8DF3\u8FC7\u521D\u59CB\u5316");
|
|
106
|
+
} else {
|
|
107
|
+
await execa("git", ["init"], { cwd: targetPath });
|
|
108
|
+
gitSpinner.succeed("Git \u4ED3\u5E93\u521D\u59CB\u5316\u6210\u529F");
|
|
109
|
+
}
|
|
110
|
+
} catch (error) {
|
|
111
|
+
gitSpinner.warn("Git \u4ED3\u5E93\u521D\u59CB\u5316\u5931\u8D25 (\u53EF\u80FD\u662F\u672A\u5B89\u88C5 git)");
|
|
112
|
+
}
|
|
113
|
+
console.log(chalk.green(`
|
|
114
|
+
\u2705 \u9879\u76EE ${finalProjectName} \u521B\u5EFA\u6210\u529F\uFF01`));
|
|
115
|
+
console.log(`
|
|
116
|
+
\u63A5\u4E0B\u6765\u4F60\u53EF\u4EE5\uFF1A
|
|
117
|
+
`);
|
|
118
|
+
console.log(chalk.cyan(` cd ${finalProjectName}`));
|
|
119
|
+
if (!install) {
|
|
120
|
+
console.log(chalk.cyan(` ${pkgManager} install`));
|
|
121
|
+
}
|
|
122
|
+
console.log(chalk.cyan(` ${pkgManager === "npm" ? "npm run" : pkgManager} dev`));
|
|
123
|
+
} catch (err) {
|
|
124
|
+
if (err instanceof Error && err.message.includes("User force closed")) {
|
|
125
|
+
console.log(chalk.yellow("\n\u7528\u6237\u53D6\u6D88\u64CD\u4F5C"));
|
|
126
|
+
process.exit(0);
|
|
127
|
+
}
|
|
128
|
+
console.error(chalk.red("\u274C \u521B\u5EFA\u9879\u76EE\u5931\u8D25\uFF1A"), err);
|
|
129
|
+
}
|
|
130
|
+
}
|
|
131
|
+
|
|
132
|
+
// src/index.ts
|
|
133
|
+
var program = new Command();
|
|
134
|
+
program.name("gg-cli").description("\u524D\u7AEF\u811A\u624B\u67B6\u5DE5\u5177").version("1.0.0");
|
|
135
|
+
program.command("create [project-name]", { isDefault: true }).description("\u521B\u5EFA\u4E00\u4E2A\u65B0\u9879\u76EE").action((projectName) => {
|
|
136
|
+
create(projectName);
|
|
137
|
+
});
|
|
138
|
+
program.parse(process.argv);
|
|
139
|
+
//# sourceMappingURL=index.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"sources":["../src/index.ts","../src/commands/create.ts","../src/utils/pkg-manager.ts"],"sourcesContent":["import { Command } from 'commander';\nimport { create } from './commands/create.js';\n\nconst program = new Command();\n\nprogram\n .name('gg-cli')\n .description('前端脚手架工具')\n .version('1.0.0');\n\n// 将 create 设为默认命令,参数改为可选 [project-name]\nprogram\n .command('create [project-name]', { isDefault: true })\n .description('创建一个新项目')\n .action((projectName) => {\n create(projectName);\n });\n\nprogram.parse(process.argv);\n","import { input, select, confirm } from '@inquirer/prompts';\nimport chalk from 'chalk';\nimport fs from 'fs-extra';\nimport path from 'path';\nimport { fileURLToPath } from 'url';\nimport { execa } from 'execa';\nimport ora from 'ora';\nimport { getUserPkgManager } from '../utils/pkg-manager.js';\n\nexport async function create(projectName?: string) {\n // 获取包管理器\n const pkgManager = getUserPkgManager();\n\n // 获取当前文件路径 (dist/index.js)\n const __filename = fileURLToPath(import.meta.url);\n const __dirname = path.dirname(__filename);\n \n // 模板目录路径 (假设模板被复制到了 dist/template)\n const templateDir = path.resolve(__dirname, 'template');\n \n // 检查模板目录是否存在\n if (!fs.existsSync(templateDir)) {\n console.error(chalk.red('❌ 错误:未找到模板目录!'));\n console.log(chalk.yellow(`预期路径: ${templateDir}`));\n process.exit(1);\n }\n\n // 获取所有可用模板\n const templates = fs.readdirSync(templateDir).filter(file => {\n return fs.statSync(path.join(templateDir, file)).isDirectory();\n });\n\n if (templates.length === 0) {\n console.error(chalk.red('❌ 错误:模板目录为空!'));\n process.exit(1);\n }\n\n try {\n // 1. 如果没有传入项目名称,则询问\n let finalProjectName = projectName;\n if (!finalProjectName) {\n finalProjectName = await input({\n message: '请输入项目名称:',\n validate: (value) => {\n if (!value.trim()) return '项目名称不能为空';\n return true;\n }\n });\n }\n\n // 2. 选择模板\n const template = await select({\n message: '请选择项目模板:',\n choices: templates.map(t => ({\n name: t,\n value: t,\n })),\n });\n\n // 3. 是否安装依赖\n const install = await confirm({\n message: '是否自动安装依赖?',\n default: true,\n });\n\n console.log(chalk.blue(`\\n🚀 准备创建项目: ${finalProjectName}`));\n\n const selectedTemplatePath = path.join(templateDir, template);\n const targetPath = path.resolve(process.cwd(), finalProjectName!);\n\n // 检查目标目录是否已存在\n if (fs.existsSync(targetPath)) {\n const overwrite = await confirm({\n message: `目录 ${finalProjectName} 已存在,是否覆盖?`,\n default: false\n });\n\n if (!overwrite) {\n console.log(chalk.yellow('已取消创建。'));\n return;\n }\n await fs.remove(targetPath);\n }\n\n const spinner = ora('正在复制模板...').start();\n await fs.copy(selectedTemplatePath, targetPath);\n \n // 修改 package.json 中的 name\n const pkgPath = path.join(targetPath, 'package.json');\n if (await fs.pathExists(pkgPath)) {\n const pkg = await fs.readJson(pkgPath);\n pkg.name = finalProjectName;\n await fs.writeJson(pkgPath, pkg, { spaces: 2 });\n }\n spinner.succeed('模板复制完成');\n\n if (install) {\n const installSpinner = ora(`正在安装依赖 (${pkgManager} install)...`).start();\n try {\n await execa(pkgManager, ['install'], { cwd: targetPath });\n installSpinner.succeed('依赖安装成功');\n } catch (error) {\n installSpinner.fail('依赖安装失败');\n console.error(chalk.red(error));\n }\n }\n\n // 4. 初始化 git 仓库\n const gitSpinner = ora('正在初始化 Git 仓库...').start();\n try {\n // 先检查是否已经存在 .git 目录(防止覆盖模板自带的 git,虽然按理说模板不该带 .git)\n if (fs.existsSync(path.join(targetPath, '.git'))) {\n gitSpinner.succeed('Git 仓库已存在,跳过初始化');\n } else {\n await execa('git', ['init'], { cwd: targetPath });\n gitSpinner.succeed('Git 仓库初始化成功');\n }\n } catch (error) {\n gitSpinner.warn('Git 仓库初始化失败 (可能是未安装 git)');\n }\n\n console.log(chalk.green(`\\n✅ 项目 ${finalProjectName} 创建成功!`));\n console.log(`\\n接下来你可以:\\n`);\n console.log(chalk.cyan(` cd ${finalProjectName}`));\n if (!install) {\n console.log(chalk.cyan(` ${pkgManager} install`));\n }\n console.log(chalk.cyan(` ${pkgManager === 'npm' ? 'npm run' : pkgManager} dev`));\n\n } catch (err) {\n if (err instanceof Error && err.message.includes('User force closed')) {\n console.log(chalk.yellow('\\n用户取消操作'));\n process.exit(0);\n }\n console.error(chalk.red('❌ 创建项目失败:'), err);\n }\n}\n","export type PackageManager = 'npm' | 'yarn' | 'pnpm' | 'bun';\n\nexport function getUserPkgManager(): PackageManager {\n // 从环境变量中获取用户使用的包管理器信息\n const userAgent = process.env.npm_config_user_agent;\n\n if (userAgent) {\n if (userAgent.startsWith('yarn')) {\n return 'yarn';\n } else if (userAgent.startsWith('pnpm')) {\n return 'pnpm';\n } else if (userAgent.startsWith('bun')) {\n return 'bun';\n }\n }\n\n return 'npm';\n}\n"],"mappings":"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","names":[]}
|
|
@@ -0,0 +1,75 @@
|
|
|
1
|
+
# React + TypeScript + Vite
|
|
2
|
+
|
|
3
|
+
This template provides a minimal setup to get React working in Vite with HMR and some ESLint rules.
|
|
4
|
+
|
|
5
|
+
Currently, two official plugins are available:
|
|
6
|
+
|
|
7
|
+
- [@vitejs/plugin-react](https://github.com/vitejs/vite-plugin-react/blob/main/packages/plugin-react) uses [Oxc](https://oxc.rs)
|
|
8
|
+
- [@vitejs/plugin-react-swc](https://github.com/vitejs/vite-plugin-react/blob/main/packages/plugin-react-swc) uses [SWC](https://swc.rs/)
|
|
9
|
+
|
|
10
|
+
## React Compiler
|
|
11
|
+
|
|
12
|
+
The React Compiler is enabled on this template. See [this documentation](https://react.dev/learn/react-compiler) for more information.
|
|
13
|
+
|
|
14
|
+
Note: This will impact Vite dev & build performances.
|
|
15
|
+
|
|
16
|
+
## Expanding the ESLint configuration
|
|
17
|
+
|
|
18
|
+
If you are developing a production application, we recommend updating the configuration to enable type-aware lint rules:
|
|
19
|
+
|
|
20
|
+
```js
|
|
21
|
+
export default defineConfig([
|
|
22
|
+
globalIgnores(['dist']),
|
|
23
|
+
{
|
|
24
|
+
files: ['**/*.{ts,tsx}'],
|
|
25
|
+
extends: [
|
|
26
|
+
// Other configs...
|
|
27
|
+
|
|
28
|
+
// Remove tseslint.configs.recommended and replace with this
|
|
29
|
+
tseslint.configs.recommendedTypeChecked,
|
|
30
|
+
// Alternatively, use this for stricter rules
|
|
31
|
+
tseslint.configs.strictTypeChecked,
|
|
32
|
+
// Optionally, add this for stylistic rules
|
|
33
|
+
tseslint.configs.stylisticTypeChecked,
|
|
34
|
+
|
|
35
|
+
// Other configs...
|
|
36
|
+
],
|
|
37
|
+
languageOptions: {
|
|
38
|
+
parserOptions: {
|
|
39
|
+
project: ['./tsconfig.node.json', './tsconfig.app.json'],
|
|
40
|
+
tsconfigRootDir: import.meta.dirname,
|
|
41
|
+
},
|
|
42
|
+
// other options...
|
|
43
|
+
},
|
|
44
|
+
},
|
|
45
|
+
])
|
|
46
|
+
```
|
|
47
|
+
|
|
48
|
+
You can also install [eslint-plugin-react-x](https://github.com/Rel1cx/eslint-react/tree/main/packages/plugins/eslint-plugin-react-x) and [eslint-plugin-react-dom](https://github.com/Rel1cx/eslint-react/tree/main/packages/plugins/eslint-plugin-react-dom) for React-specific lint rules:
|
|
49
|
+
|
|
50
|
+
```js
|
|
51
|
+
// eslint.config.js
|
|
52
|
+
import reactX from 'eslint-plugin-react-x'
|
|
53
|
+
import reactDom from 'eslint-plugin-react-dom'
|
|
54
|
+
|
|
55
|
+
export default defineConfig([
|
|
56
|
+
globalIgnores(['dist']),
|
|
57
|
+
{
|
|
58
|
+
files: ['**/*.{ts,tsx}'],
|
|
59
|
+
extends: [
|
|
60
|
+
// Other configs...
|
|
61
|
+
// Enable lint rules for React
|
|
62
|
+
reactX.configs['recommended-typescript'],
|
|
63
|
+
// Enable lint rules for React DOM
|
|
64
|
+
reactDom.configs.recommended,
|
|
65
|
+
],
|
|
66
|
+
languageOptions: {
|
|
67
|
+
parserOptions: {
|
|
68
|
+
project: ['./tsconfig.node.json', './tsconfig.app.json'],
|
|
69
|
+
tsconfigRootDir: import.meta.dirname,
|
|
70
|
+
},
|
|
71
|
+
// other options...
|
|
72
|
+
},
|
|
73
|
+
},
|
|
74
|
+
])
|
|
75
|
+
```
|
|
@@ -0,0 +1,23 @@
|
|
|
1
|
+
import js from '@eslint/js'
|
|
2
|
+
import globals from 'globals'
|
|
3
|
+
import reactHooks from 'eslint-plugin-react-hooks'
|
|
4
|
+
import reactRefresh from 'eslint-plugin-react-refresh'
|
|
5
|
+
import tseslint from 'typescript-eslint'
|
|
6
|
+
import { defineConfig, globalIgnores } from 'eslint/config'
|
|
7
|
+
|
|
8
|
+
export default defineConfig([
|
|
9
|
+
globalIgnores(['dist']),
|
|
10
|
+
{
|
|
11
|
+
files: ['**/*.{ts,tsx}'],
|
|
12
|
+
extends: [
|
|
13
|
+
js.configs.recommended,
|
|
14
|
+
tseslint.configs.recommended,
|
|
15
|
+
reactHooks.configs.flat.recommended,
|
|
16
|
+
reactRefresh.configs.vite,
|
|
17
|
+
],
|
|
18
|
+
languageOptions: {
|
|
19
|
+
ecmaVersion: 2020,
|
|
20
|
+
globals: globals.browser,
|
|
21
|
+
},
|
|
22
|
+
},
|
|
23
|
+
])
|
|
@@ -0,0 +1,13 @@
|
|
|
1
|
+
<!doctype html>
|
|
2
|
+
<html lang="en">
|
|
3
|
+
<head>
|
|
4
|
+
<meta charset="UTF-8" />
|
|
5
|
+
<link rel="icon" type="image/svg+xml" href="/favicon.svg" />
|
|
6
|
+
<meta name="viewport" content="width=device-width, initial-scale=1.0" />
|
|
7
|
+
<title>react-temp1</title>
|
|
8
|
+
</head>
|
|
9
|
+
<body>
|
|
10
|
+
<div id="root"></div>
|
|
11
|
+
<script type="module" src="/src/main.tsx"></script>
|
|
12
|
+
</body>
|
|
13
|
+
</html>
|
|
@@ -0,0 +1,34 @@
|
|
|
1
|
+
{
|
|
2
|
+
"name": "react-temp1",
|
|
3
|
+
"private": true,
|
|
4
|
+
"version": "0.0.0",
|
|
5
|
+
"type": "module",
|
|
6
|
+
"scripts": {
|
|
7
|
+
"dev": "vite",
|
|
8
|
+
"build": "tsc -b && vite build",
|
|
9
|
+
"lint": "eslint .",
|
|
10
|
+
"preview": "vite preview"
|
|
11
|
+
},
|
|
12
|
+
"dependencies": {
|
|
13
|
+
"react": "^19.2.4",
|
|
14
|
+
"react-dom": "^19.2.4"
|
|
15
|
+
},
|
|
16
|
+
"devDependencies": {
|
|
17
|
+
"@babel/core": "^7.29.0",
|
|
18
|
+
"@eslint/js": "^9.39.4",
|
|
19
|
+
"@rolldown/plugin-babel": "^0.2.0",
|
|
20
|
+
"@types/babel__core": "^7.20.5",
|
|
21
|
+
"@types/node": "^24.12.0",
|
|
22
|
+
"@types/react": "^19.2.14",
|
|
23
|
+
"@types/react-dom": "^19.2.3",
|
|
24
|
+
"@vitejs/plugin-react": "^6.0.0",
|
|
25
|
+
"babel-plugin-react-compiler": "^1.0.0",
|
|
26
|
+
"eslint": "^9.39.4",
|
|
27
|
+
"eslint-plugin-react-hooks": "^7.0.1",
|
|
28
|
+
"eslint-plugin-react-refresh": "^0.5.2",
|
|
29
|
+
"globals": "^17.4.0",
|
|
30
|
+
"typescript": "~5.9.3",
|
|
31
|
+
"typescript-eslint": "^8.56.1",
|
|
32
|
+
"vite": "^8.0.0"
|
|
33
|
+
}
|
|
34
|
+
}
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
<svg xmlns="http://www.w3.org/2000/svg" width="48" height="46" fill="none" viewBox="0 0 48 46"><path fill="#863bff" d="M25.946 44.938c-.664.845-2.021.375-2.021-.698V33.937a2.26 2.26 0 0 0-2.262-2.262H10.287c-.92 0-1.456-1.04-.92-1.788l7.48-10.471c1.07-1.497 0-3.578-1.842-3.578H1.237c-.92 0-1.456-1.04-.92-1.788L10.013.474c.214-.297.556-.474.92-.474h28.894c.92 0 1.456 1.04.92 1.788l-7.48 10.471c-1.07 1.498 0 3.579 1.842 3.579h11.377c.943 0 1.473 1.088.89 1.83L25.947 44.94z" style="fill:#863bff;fill:color(display-p3 .5252 .23 1);fill-opacity:1"/><mask id="a" width="48" height="46" x="0" y="0" maskUnits="userSpaceOnUse" style="mask-type:alpha"><path fill="#000" d="M25.842 44.938c-.664.844-2.021.375-2.021-.698V33.937a2.26 2.26 0 0 0-2.262-2.262H10.183c-.92 0-1.456-1.04-.92-1.788l7.48-10.471c1.07-1.498 0-3.579-1.842-3.579H1.133c-.92 0-1.456-1.04-.92-1.787L9.91.473c.214-.297.556-.474.92-.474h28.894c.92 0 1.456 1.04.92 1.788l-7.48 10.471c-1.07 1.498 0 3.578 1.842 3.578h11.377c.943 0 1.473 1.088.89 1.832L25.843 44.94z" style="fill:#000;fill-opacity:1"/></mask><g mask="url(#a)"><g filter="url(#b)"><ellipse cx="5.508" cy="14.704" fill="#ede6ff" rx="5.508" ry="14.704" style="fill:#ede6ff;fill:color(display-p3 .9275 .9033 1);fill-opacity:1" transform="matrix(.00324 1 1 -.00324 -4.47 31.516)"/></g><g filter="url(#c)"><ellipse cx="10.399" cy="29.851" fill="#ede6ff" rx="10.399" ry="29.851" style="fill:#ede6ff;fill:color(display-p3 .9275 .9033 1);fill-opacity:1" transform="matrix(.00324 1 1 -.00324 -39.328 7.883)"/></g><g filter="url(#d)"><ellipse cx="5.508" cy="30.487" fill="#7e14ff" rx="5.508" ry="30.487" style="fill:#7e14ff;fill:color(display-p3 .4922 .0767 1);fill-opacity:1" transform="rotate(89.814 -25.913 -14.639)scale(1 -1)"/></g><g filter="url(#e)"><ellipse cx="5.508" cy="30.599" fill="#7e14ff" rx="5.508" ry="30.599" style="fill:#7e14ff;fill:color(display-p3 .4922 .0767 1);fill-opacity:1" transform="rotate(89.814 -32.644 -3.334)scale(1 -1)"/></g><g filter="url(#f)"><ellipse cx="5.508" cy="30.599" fill="#7e14ff" rx="5.508" ry="30.599" style="fill:#7e14ff;fill:color(display-p3 .4922 .0767 1);fill-opacity:1" transform="matrix(.00324 1 1 -.00324 -34.34 30.47)"/></g><g filter="url(#g)"><ellipse cx="14.072" cy="22.078" fill="#ede6ff" rx="14.072" ry="22.078" style="fill:#ede6ff;fill:color(display-p3 .9275 .9033 1);fill-opacity:1" transform="rotate(93.35 24.506 48.493)scale(-1 1)"/></g><g filter="url(#h)"><ellipse cx="3.47" cy="21.501" fill="#7e14ff" rx="3.47" ry="21.501" style="fill:#7e14ff;fill:color(display-p3 .4922 .0767 1);fill-opacity:1" transform="rotate(89.009 28.708 47.59)scale(-1 1)"/></g><g filter="url(#i)"><ellipse cx="3.47" cy="21.501" fill="#7e14ff" rx="3.47" ry="21.501" style="fill:#7e14ff;fill:color(display-p3 .4922 .0767 1);fill-opacity:1" transform="rotate(89.009 28.708 47.59)scale(-1 1)"/></g><g filter="url(#j)"><ellipse cx=".387" cy="8.972" fill="#7e14ff" rx="4.407" ry="29.108" style="fill:#7e14ff;fill:color(display-p3 .4922 .0767 1);fill-opacity:1" transform="rotate(39.51 .387 8.972)"/></g><g filter="url(#k)"><ellipse cx="47.523" cy="-6.092" fill="#7e14ff" rx="4.407" ry="29.108" style="fill:#7e14ff;fill:color(display-p3 .4922 .0767 1);fill-opacity:1" transform="rotate(37.892 47.523 -6.092)"/></g><g filter="url(#l)"><ellipse cx="41.412" cy="6.333" fill="#47bfff" rx="5.971" ry="9.665" style="fill:#47bfff;fill:color(display-p3 .2799 .748 1);fill-opacity:1" transform="rotate(37.892 41.412 6.333)"/></g><g filter="url(#m)"><ellipse cx="-1.879" cy="38.332" fill="#7e14ff" rx="4.407" ry="29.108" style="fill:#7e14ff;fill:color(display-p3 .4922 .0767 1);fill-opacity:1" transform="rotate(37.892 -1.88 38.332)"/></g><g filter="url(#n)"><ellipse cx="-1.879" cy="38.332" fill="#7e14ff" rx="4.407" ry="29.108" style="fill:#7e14ff;fill:color(display-p3 .4922 .0767 1);fill-opacity:1" transform="rotate(37.892 -1.88 38.332)"/></g><g filter="url(#o)"><ellipse cx="35.651" cy="29.907" fill="#7e14ff" rx="4.407" ry="29.108" style="fill:#7e14ff;fill:color(display-p3 .4922 .0767 1);fill-opacity:1" transform="rotate(37.892 35.651 29.907)"/></g><g filter="url(#p)"><ellipse cx="38.418" cy="32.4" fill="#47bfff" rx="5.971" ry="15.297" style="fill:#47bfff;fill:color(display-p3 .2799 .748 1);fill-opacity:1" transform="rotate(37.892 38.418 32.4)"/></g></g><defs><filter id="b" width="60.045" height="41.654" x="-19.77" y="16.149" color-interpolation-filters="sRGB" filterUnits="userSpaceOnUse"><feFlood flood-opacity="0" result="BackgroundImageFix"/><feBlend in="SourceGraphic" in2="BackgroundImageFix" result="shape"/><feGaussianBlur result="effect1_foregroundBlur_2002_17158" stdDeviation="7.659"/></filter><filter id="c" width="90.34" height="51.437" x="-54.613" y="-7.533" color-interpolation-filters="sRGB" filterUnits="userSpaceOnUse"><feFlood flood-opacity="0" result="BackgroundImageFix"/><feBlend in="SourceGraphic" in2="BackgroundImageFix" result="shape"/><feGaussianBlur result="effect1_foregroundBlur_2002_17158" stdDeviation="7.659"/></filter><filter id="d" width="79.355" height="29.4" x="-49.64" y="2.03" color-interpolation-filters="sRGB" filterUnits="userSpaceOnUse"><feFlood flood-opacity="0" result="BackgroundImageFix"/><feBlend in="SourceGraphic" in2="BackgroundImageFix" result="shape"/><feGaussianBlur result="effect1_foregroundBlur_2002_17158" stdDeviation="4.596"/></filter><filter id="e" width="79.579" height="29.4" x="-45.045" y="20.029" color-interpolation-filters="sRGB" filterUnits="userSpaceOnUse"><feFlood flood-opacity="0" result="BackgroundImageFix"/><feBlend in="SourceGraphic" in2="BackgroundImageFix" result="shape"/><feGaussianBlur result="effect1_foregroundBlur_2002_17158" stdDeviation="4.596"/></filter><filter id="f" width="79.579" height="29.4" x="-43.513" y="21.178" color-interpolation-filters="sRGB" filterUnits="userSpaceOnUse"><feFlood flood-opacity="0" result="BackgroundImageFix"/><feBlend in="SourceGraphic" in2="BackgroundImageFix" result="shape"/><feGaussianBlur result="effect1_foregroundBlur_2002_17158" stdDeviation="4.596"/></filter><filter id="g" width="74.749" height="58.852" x="15.756" y="-17.901" color-interpolation-filters="sRGB" filterUnits="userSpaceOnUse"><feFlood flood-opacity="0" result="BackgroundImageFix"/><feBlend in="SourceGraphic" in2="BackgroundImageFix" result="shape"/><feGaussianBlur result="effect1_foregroundBlur_2002_17158" stdDeviation="7.659"/></filter><filter id="h" width="61.377" height="25.362" x="23.548" y="2.284" color-interpolation-filters="sRGB" filterUnits="userSpaceOnUse"><feFlood flood-opacity="0" result="BackgroundImageFix"/><feBlend in="SourceGraphic" in2="BackgroundImageFix" result="shape"/><feGaussianBlur result="effect1_foregroundBlur_2002_17158" stdDeviation="4.596"/></filter><filter id="i" width="61.377" height="25.362" x="23.548" y="2.284" color-interpolation-filters="sRGB" filterUnits="userSpaceOnUse"><feFlood flood-opacity="0" result="BackgroundImageFix"/><feBlend in="SourceGraphic" in2="BackgroundImageFix" result="shape"/><feGaussianBlur result="effect1_foregroundBlur_2002_17158" stdDeviation="4.596"/></filter><filter id="j" width="56.045" height="63.649" x="-27.636" y="-22.853" color-interpolation-filters="sRGB" filterUnits="userSpaceOnUse"><feFlood flood-opacity="0" result="BackgroundImageFix"/><feBlend in="SourceGraphic" in2="BackgroundImageFix" result="shape"/><feGaussianBlur result="effect1_foregroundBlur_2002_17158" stdDeviation="4.596"/></filter><filter id="k" width="54.814" height="64.646" x="20.116" y="-38.415" color-interpolation-filters="sRGB" filterUnits="userSpaceOnUse"><feFlood flood-opacity="0" result="BackgroundImageFix"/><feBlend in="SourceGraphic" in2="BackgroundImageFix" result="shape"/><feGaussianBlur result="effect1_foregroundBlur_2002_17158" stdDeviation="4.596"/></filter><filter id="l" width="33.541" height="35.313" x="24.641" y="-11.323" color-interpolation-filters="sRGB" filterUnits="userSpaceOnUse"><feFlood flood-opacity="0" result="BackgroundImageFix"/><feBlend in="SourceGraphic" in2="BackgroundImageFix" result="shape"/><feGaussianBlur result="effect1_foregroundBlur_2002_17158" stdDeviation="4.596"/></filter><filter id="m" width="54.814" height="64.646" x="-29.286" y="6.009" color-interpolation-filters="sRGB" filterUnits="userSpaceOnUse"><feFlood flood-opacity="0" result="BackgroundImageFix"/><feBlend in="SourceGraphic" in2="BackgroundImageFix" result="shape"/><feGaussianBlur result="effect1_foregroundBlur_2002_17158" stdDeviation="4.596"/></filter><filter id="n" width="54.814" height="64.646" x="-29.286" y="6.009" color-interpolation-filters="sRGB" filterUnits="userSpaceOnUse"><feFlood flood-opacity="0" result="BackgroundImageFix"/><feBlend in="SourceGraphic" in2="BackgroundImageFix" result="shape"/><feGaussianBlur result="effect1_foregroundBlur_2002_17158" stdDeviation="4.596"/></filter><filter id="o" width="54.814" height="64.646" x="8.244" y="-2.416" color-interpolation-filters="sRGB" filterUnits="userSpaceOnUse"><feFlood flood-opacity="0" result="BackgroundImageFix"/><feBlend in="SourceGraphic" in2="BackgroundImageFix" result="shape"/><feGaussianBlur result="effect1_foregroundBlur_2002_17158" stdDeviation="4.596"/></filter><filter id="p" width="39.409" height="43.623" x="18.713" y="10.588" color-interpolation-filters="sRGB" filterUnits="userSpaceOnUse"><feFlood flood-opacity="0" result="BackgroundImageFix"/><feBlend in="SourceGraphic" in2="BackgroundImageFix" result="shape"/><feGaussianBlur result="effect1_foregroundBlur_2002_17158" stdDeviation="4.596"/></filter></defs></svg>
|
|
@@ -0,0 +1,24 @@
|
|
|
1
|
+
<svg xmlns="http://www.w3.org/2000/svg">
|
|
2
|
+
<symbol id="bluesky-icon" viewBox="0 0 16 17">
|
|
3
|
+
<g clip-path="url(#bluesky-clip)"><path fill="#08060d" d="M7.75 7.735c-.693-1.348-2.58-3.86-4.334-5.097-1.68-1.187-2.32-.981-2.74-.79C.188 2.065.1 2.812.1 3.251s.241 3.602.398 4.13c.52 1.744 2.367 2.333 4.07 2.145-2.495.37-4.71 1.278-1.805 4.512 3.196 3.309 4.38-.71 4.987-2.746.608 2.036 1.307 5.91 4.93 2.746 2.72-2.746.747-4.143-1.747-4.512 1.702.189 3.55-.4 4.07-2.145.156-.528.397-3.691.397-4.13s-.088-1.186-.575-1.406c-.42-.19-1.06-.395-2.741.79-1.755 1.24-3.64 3.752-4.334 5.099"/></g>
|
|
4
|
+
<defs><clipPath id="bluesky-clip"><path fill="#fff" d="M.1.85h15.3v15.3H.1z"/></clipPath></defs>
|
|
5
|
+
</symbol>
|
|
6
|
+
<symbol id="discord-icon" viewBox="0 0 20 19">
|
|
7
|
+
<path fill="#08060d" d="M16.224 3.768a14.5 14.5 0 0 0-3.67-1.153c-.158.286-.343.67-.47.976a13.5 13.5 0 0 0-4.067 0c-.128-.306-.317-.69-.476-.976A14.4 14.4 0 0 0 3.868 3.77C1.546 7.28.916 10.703 1.231 14.077a14.7 14.7 0 0 0 4.5 2.306q.545-.748.965-1.587a9.5 9.5 0 0 1-1.518-.74q.191-.14.372-.293c2.927 1.369 6.107 1.369 8.999 0q.183.152.372.294-.723.437-1.52.74.418.838.963 1.588a14.6 14.6 0 0 0 4.504-2.308c.37-3.911-.63-7.302-2.644-10.309m-9.13 8.234c-.878 0-1.599-.82-1.599-1.82 0-.998.705-1.82 1.6-1.82.894 0 1.614.82 1.599 1.82.001 1-.705 1.82-1.6 1.82m5.91 0c-.878 0-1.599-.82-1.599-1.82 0-.998.705-1.82 1.6-1.82.893 0 1.614.82 1.599 1.82 0 1-.706 1.82-1.6 1.82"/>
|
|
8
|
+
</symbol>
|
|
9
|
+
<symbol id="documentation-icon" viewBox="0 0 21 20">
|
|
10
|
+
<path fill="none" stroke="#aa3bff" stroke-linecap="round" stroke-linejoin="round" stroke-width="1.35" d="m15.5 13.333 1.533 1.322c.645.555.967.833.967 1.178s-.322.623-.967 1.179L15.5 18.333m-3.333-5-1.534 1.322c-.644.555-.966.833-.966 1.178s.322.623.966 1.179l1.534 1.321"/>
|
|
11
|
+
<path fill="none" stroke="#aa3bff" stroke-linecap="round" stroke-linejoin="round" stroke-width="1.35" d="M17.167 10.836v-4.32c0-1.41 0-2.117-.224-2.68-.359-.906-1.118-1.621-2.08-1.96-.599-.21-1.349-.21-2.848-.21-2.623 0-3.935 0-4.983.369-1.684.591-3.013 1.842-3.641 3.428C3 6.449 3 7.684 3 10.154v2.122c0 2.558 0 3.838.706 4.726q.306.383.713.671c.76.536 1.79.64 3.581.66"/>
|
|
12
|
+
<path fill="none" stroke="#aa3bff" stroke-linecap="round" stroke-linejoin="round" stroke-width="1.35" d="M3 10a2.78 2.78 0 0 1 2.778-2.778c.555 0 1.209.097 1.748-.047.48-.129.854-.503.982-.982.145-.54.048-1.194.048-1.749a2.78 2.78 0 0 1 2.777-2.777"/>
|
|
13
|
+
</symbol>
|
|
14
|
+
<symbol id="github-icon" viewBox="0 0 19 19">
|
|
15
|
+
<path fill="#08060d" fill-rule="evenodd" d="M9.356 1.85C5.05 1.85 1.57 5.356 1.57 9.694a7.84 7.84 0 0 0 5.324 7.44c.387.079.528-.168.528-.376 0-.182-.013-.805-.013-1.454-2.165.467-2.616-.935-2.616-.935-.349-.91-.864-1.143-.864-1.143-.71-.48.051-.48.051-.48.787.051 1.2.805 1.2.805.695 1.194 1.817.857 2.268.649.064-.507.27-.857.49-1.052-1.728-.182-3.545-.857-3.545-3.87 0-.857.31-1.558.8-2.104-.078-.195-.349-1 .077-2.078 0 0 .657-.208 2.14.805a7.5 7.5 0 0 1 1.946-.26c.657 0 1.328.092 1.946.26 1.483-1.013 2.14-.805 2.14-.805.426 1.078.155 1.883.078 2.078.502.546.799 1.247.799 2.104 0 3.013-1.818 3.675-3.558 3.87.284.247.528.714.528 1.454 0 1.052-.012 1.896-.012 2.156 0 .208.142.455.528.377a7.84 7.84 0 0 0 5.324-7.441c.013-4.338-3.48-7.844-7.773-7.844" clip-rule="evenodd"/>
|
|
16
|
+
</symbol>
|
|
17
|
+
<symbol id="social-icon" viewBox="0 0 20 20">
|
|
18
|
+
<path fill="none" stroke="#aa3bff" stroke-linecap="round" stroke-linejoin="round" stroke-width="1.35" d="M12.5 6.667a4.167 4.167 0 1 0-8.334 0 4.167 4.167 0 0 0 8.334 0"/>
|
|
19
|
+
<path fill="none" stroke="#aa3bff" stroke-linecap="round" stroke-linejoin="round" stroke-width="1.35" d="M2.5 16.667a5.833 5.833 0 0 1 8.75-5.053m3.837.474.513 1.035c.07.144.257.282.414.309l.93.155c.596.1.736.536.307.965l-.723.73a.64.64 0 0 0-.152.531l.207.903c.164.715-.213.991-.84.618l-.872-.52a.63.63 0 0 0-.577 0l-.872.52c-.624.373-1.003.094-.84-.618l.207-.903a.64.64 0 0 0-.152-.532l-.723-.729c-.426-.43-.289-.864.306-.964l.93-.156a.64.64 0 0 0 .412-.31l.513-1.034c.28-.562.735-.562 1.012 0"/>
|
|
20
|
+
</symbol>
|
|
21
|
+
<symbol id="x-icon" viewBox="0 0 19 19">
|
|
22
|
+
<path fill="#08060d" fill-rule="evenodd" d="M1.893 1.98c.052.072 1.245 1.769 2.653 3.77l2.892 4.114c.183.261.333.48.333.486s-.068.089-.152.183l-.522.593-.765.867-3.597 4.087c-.375.426-.734.834-.798.905a1 1 0 0 0-.118.148c0 .01.236.017.664.017h.663l.729-.83c.4-.457.796-.906.879-.999a692 692 0 0 0 1.794-2.038c.034-.037.301-.34.594-.675l.551-.624.345-.392a7 7 0 0 1 .34-.374c.006 0 .93 1.306 2.052 2.903l2.084 2.965.045.063h2.275c1.87 0 2.273-.003 2.266-.021-.008-.02-1.098-1.572-3.894-5.547-2.013-2.862-2.28-3.246-2.273-3.266.008-.019.282-.332 2.085-2.38l2-2.274 1.567-1.782c.022-.028-.016-.03-.65-.03h-.674l-.3.342a871 871 0 0 1-1.782 2.025c-.067.075-.405.458-.75.852a100 100 0 0 1-.803.91c-.148.172-.299.344-.99 1.127-.304.343-.32.358-.345.327-.015-.019-.904-1.282-1.976-2.808L6.365 1.85H1.8zm1.782.91 8.078 11.294c.772 1.08 1.413 1.973 1.425 1.984.016.017.241.02 1.05.017l1.03-.004-2.694-3.766L7.796 5.75 5.722 2.852l-1.039-.004-1.039-.004z" clip-rule="evenodd"/>
|
|
23
|
+
</symbol>
|
|
24
|
+
</svg>
|
|
@@ -0,0 +1,184 @@
|
|
|
1
|
+
.counter {
|
|
2
|
+
font-size: 16px;
|
|
3
|
+
padding: 5px 10px;
|
|
4
|
+
border-radius: 5px;
|
|
5
|
+
color: var(--accent);
|
|
6
|
+
background: var(--accent-bg);
|
|
7
|
+
border: 2px solid transparent;
|
|
8
|
+
transition: border-color 0.3s;
|
|
9
|
+
margin-bottom: 24px;
|
|
10
|
+
|
|
11
|
+
&:hover {
|
|
12
|
+
border-color: var(--accent-border);
|
|
13
|
+
}
|
|
14
|
+
&:focus-visible {
|
|
15
|
+
outline: 2px solid var(--accent);
|
|
16
|
+
outline-offset: 2px;
|
|
17
|
+
}
|
|
18
|
+
}
|
|
19
|
+
|
|
20
|
+
.hero {
|
|
21
|
+
position: relative;
|
|
22
|
+
|
|
23
|
+
.base,
|
|
24
|
+
.framework,
|
|
25
|
+
.vite {
|
|
26
|
+
inset-inline: 0;
|
|
27
|
+
margin: 0 auto;
|
|
28
|
+
}
|
|
29
|
+
|
|
30
|
+
.base {
|
|
31
|
+
width: 170px;
|
|
32
|
+
position: relative;
|
|
33
|
+
z-index: 0;
|
|
34
|
+
}
|
|
35
|
+
|
|
36
|
+
.framework,
|
|
37
|
+
.vite {
|
|
38
|
+
position: absolute;
|
|
39
|
+
}
|
|
40
|
+
|
|
41
|
+
.framework {
|
|
42
|
+
z-index: 1;
|
|
43
|
+
top: 34px;
|
|
44
|
+
height: 28px;
|
|
45
|
+
transform: perspective(2000px) rotateZ(300deg) rotateX(44deg) rotateY(39deg)
|
|
46
|
+
scale(1.4);
|
|
47
|
+
}
|
|
48
|
+
|
|
49
|
+
.vite {
|
|
50
|
+
z-index: 0;
|
|
51
|
+
top: 107px;
|
|
52
|
+
height: 26px;
|
|
53
|
+
width: auto;
|
|
54
|
+
transform: perspective(2000px) rotateZ(300deg) rotateX(40deg) rotateY(39deg)
|
|
55
|
+
scale(0.8);
|
|
56
|
+
}
|
|
57
|
+
}
|
|
58
|
+
|
|
59
|
+
#center {
|
|
60
|
+
display: flex;
|
|
61
|
+
flex-direction: column;
|
|
62
|
+
gap: 25px;
|
|
63
|
+
place-content: center;
|
|
64
|
+
place-items: center;
|
|
65
|
+
flex-grow: 1;
|
|
66
|
+
|
|
67
|
+
@media (max-width: 1024px) {
|
|
68
|
+
padding: 32px 20px 24px;
|
|
69
|
+
gap: 18px;
|
|
70
|
+
}
|
|
71
|
+
}
|
|
72
|
+
|
|
73
|
+
#next-steps {
|
|
74
|
+
display: flex;
|
|
75
|
+
border-top: 1px solid var(--border);
|
|
76
|
+
text-align: left;
|
|
77
|
+
|
|
78
|
+
& > div {
|
|
79
|
+
flex: 1 1 0;
|
|
80
|
+
padding: 32px;
|
|
81
|
+
@media (max-width: 1024px) {
|
|
82
|
+
padding: 24px 20px;
|
|
83
|
+
}
|
|
84
|
+
}
|
|
85
|
+
|
|
86
|
+
.icon {
|
|
87
|
+
margin-bottom: 16px;
|
|
88
|
+
width: 22px;
|
|
89
|
+
height: 22px;
|
|
90
|
+
}
|
|
91
|
+
|
|
92
|
+
@media (max-width: 1024px) {
|
|
93
|
+
flex-direction: column;
|
|
94
|
+
text-align: center;
|
|
95
|
+
}
|
|
96
|
+
}
|
|
97
|
+
|
|
98
|
+
#docs {
|
|
99
|
+
border-right: 1px solid var(--border);
|
|
100
|
+
|
|
101
|
+
@media (max-width: 1024px) {
|
|
102
|
+
border-right: none;
|
|
103
|
+
border-bottom: 1px solid var(--border);
|
|
104
|
+
}
|
|
105
|
+
}
|
|
106
|
+
|
|
107
|
+
#next-steps ul {
|
|
108
|
+
list-style: none;
|
|
109
|
+
padding: 0;
|
|
110
|
+
display: flex;
|
|
111
|
+
gap: 8px;
|
|
112
|
+
margin: 32px 0 0;
|
|
113
|
+
|
|
114
|
+
.logo {
|
|
115
|
+
height: 18px;
|
|
116
|
+
}
|
|
117
|
+
|
|
118
|
+
a {
|
|
119
|
+
color: var(--text-h);
|
|
120
|
+
font-size: 16px;
|
|
121
|
+
border-radius: 6px;
|
|
122
|
+
background: var(--social-bg);
|
|
123
|
+
display: flex;
|
|
124
|
+
padding: 6px 12px;
|
|
125
|
+
align-items: center;
|
|
126
|
+
gap: 8px;
|
|
127
|
+
text-decoration: none;
|
|
128
|
+
transition: box-shadow 0.3s;
|
|
129
|
+
|
|
130
|
+
&:hover {
|
|
131
|
+
box-shadow: var(--shadow);
|
|
132
|
+
}
|
|
133
|
+
.button-icon {
|
|
134
|
+
height: 18px;
|
|
135
|
+
width: 18px;
|
|
136
|
+
}
|
|
137
|
+
}
|
|
138
|
+
|
|
139
|
+
@media (max-width: 1024px) {
|
|
140
|
+
margin-top: 20px;
|
|
141
|
+
flex-wrap: wrap;
|
|
142
|
+
justify-content: center;
|
|
143
|
+
|
|
144
|
+
li {
|
|
145
|
+
flex: 1 1 calc(50% - 8px);
|
|
146
|
+
}
|
|
147
|
+
|
|
148
|
+
a {
|
|
149
|
+
width: 100%;
|
|
150
|
+
justify-content: center;
|
|
151
|
+
box-sizing: border-box;
|
|
152
|
+
}
|
|
153
|
+
}
|
|
154
|
+
}
|
|
155
|
+
|
|
156
|
+
#spacer {
|
|
157
|
+
height: 88px;
|
|
158
|
+
border-top: 1px solid var(--border);
|
|
159
|
+
@media (max-width: 1024px) {
|
|
160
|
+
height: 48px;
|
|
161
|
+
}
|
|
162
|
+
}
|
|
163
|
+
|
|
164
|
+
.ticks {
|
|
165
|
+
position: relative;
|
|
166
|
+
width: 100%;
|
|
167
|
+
|
|
168
|
+
&::before,
|
|
169
|
+
&::after {
|
|
170
|
+
content: '';
|
|
171
|
+
position: absolute;
|
|
172
|
+
top: -4.5px;
|
|
173
|
+
border: 5px solid transparent;
|
|
174
|
+
}
|
|
175
|
+
|
|
176
|
+
&::before {
|
|
177
|
+
left: 0;
|
|
178
|
+
border-left-color: var(--border);
|
|
179
|
+
}
|
|
180
|
+
&::after {
|
|
181
|
+
right: 0;
|
|
182
|
+
border-right-color: var(--border);
|
|
183
|
+
}
|
|
184
|
+
}
|