@chenhui996/gg-cli 1.0.1 → 1.0.3

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.
Files changed (58) hide show
  1. package/dist/index.js +15 -0
  2. package/dist/index.js.map +1 -1
  3. package/dist/template/operations-tem/.env +1 -0
  4. package/dist/template/operations-tem/README.md +146 -0
  5. package/dist/template/operations-tem/eslint.config.js +27 -0
  6. package/dist/template/operations-tem/package-lock.json +4672 -0
  7. package/dist/template/{react-temp2 → operations-tem}/package.json +11 -2
  8. package/dist/template/operations-tem/src/api/user.ts +21 -0
  9. package/dist/template/operations-tem/src/assets/Frame 20.png +0 -0
  10. package/dist/template/operations-tem/src/components/Chart/index.tsx +22 -0
  11. package/dist/template/operations-tem/src/layouts/BasicLayout.tsx +183 -0
  12. package/dist/template/operations-tem/src/main.tsx +38 -0
  13. package/dist/template/operations-tem/src/pages/404.tsx +32 -0
  14. package/dist/template/operations-tem/src/pages/about/index.tsx +8 -0
  15. package/dist/template/operations-tem/src/pages/calendar/index.tsx +8 -0
  16. package/dist/template/operations-tem/src/pages/dashboard/index.tsx +72 -0
  17. package/dist/template/operations-tem/src/pages/home/index.less +59 -0
  18. package/dist/template/operations-tem/src/pages/home/index.tsx +188 -0
  19. package/dist/template/operations-tem/src/pages/settings/index.tsx +8 -0
  20. package/dist/template/operations-tem/src/pages/workspace/index.tsx +8 -0
  21. package/dist/template/operations-tem/src/router/index.tsx +75 -0
  22. package/dist/template/operations-tem/src/store/useCounterStore.ts +24 -0
  23. package/dist/template/operations-tem/src/style.less +3 -0
  24. package/dist/template/operations-tem/src/utils/request/index.ts +108 -0
  25. package/dist/template/{react-temp2 → operations-tem}/vite.config.ts +7 -0
  26. package/dist/template/{react-temp2 → react19}/index.html +1 -1
  27. package/dist/template/{react-temp1 → react19}/src/main.tsx +1 -1
  28. package/package.json +1 -1
  29. package/dist/template/react-temp2/README.md +0 -75
  30. package/dist/template/react-temp2/eslint.config.js +0 -23
  31. package/dist/template/react-temp2/src/App.css +0 -184
  32. package/dist/template/react-temp2/src/App.tsx +0 -121
  33. package/dist/template/react-temp2/src/assets/hero.png +0 -0
  34. package/dist/template/react-temp2/src/assets/vite.svg +0 -1
  35. package/dist/template/react-temp2/src/index.css +0 -111
  36. package/dist/template/react-temp2/src/main.tsx +0 -10
  37. /package/dist/template/{react-temp1 → operations-tem}/index.html +0 -0
  38. /package/dist/template/{react-temp1 → operations-tem}/public/favicon.svg +0 -0
  39. /package/dist/template/{react-temp1 → operations-tem}/public/icons.svg +0 -0
  40. /package/dist/template/{react-temp1 → operations-tem}/src/assets/react.svg +0 -0
  41. /package/dist/template/{react-temp1 → operations-tem}/tsconfig.app.json +0 -0
  42. /package/dist/template/{react-temp1 → operations-tem}/tsconfig.json +0 -0
  43. /package/dist/template/{react-temp1 → operations-tem}/tsconfig.node.json +0 -0
  44. /package/dist/template/{react-temp1 → react19}/README.md +0 -0
  45. /package/dist/template/{react-temp1 → react19}/eslint.config.js +0 -0
  46. /package/dist/template/{react-temp1 → react19}/package.json +0 -0
  47. /package/dist/template/{react-temp2 → react19}/public/favicon.svg +0 -0
  48. /package/dist/template/{react-temp2 → react19}/public/icons.svg +0 -0
  49. /package/dist/template/{react-temp1 → react19}/src/App.css +0 -0
  50. /package/dist/template/{react-temp1 → react19}/src/App.tsx +0 -0
  51. /package/dist/template/{react-temp1 → react19}/src/assets/hero.png +0 -0
  52. /package/dist/template/{react-temp2 → react19}/src/assets/react.svg +0 -0
  53. /package/dist/template/{react-temp1 → react19}/src/assets/vite.svg +0 -0
  54. /package/dist/template/{react-temp1 → react19}/src/index.css +0 -0
  55. /package/dist/template/{react-temp2 → react19}/tsconfig.app.json +0 -0
  56. /package/dist/template/{react-temp2 → react19}/tsconfig.json +0 -0
  57. /package/dist/template/{react-temp2 → react19}/tsconfig.node.json +0 -0
  58. /package/dist/template/{react-temp1 → react19}/vite.config.ts +0 -0
@@ -0,0 +1,75 @@
1
+ /**
2
+ * 路由配置 (React Router Data API)
3
+ * 采用对象配置模式,便于管理和扩展
4
+ */
5
+ import { lazy, Suspense, type ComponentType, type LazyExoticComponent } from "react";
6
+ import { createBrowserRouter } from "react-router-dom";
7
+ import { Spin } from "antd";
8
+ import BasicLayout from "../layouts/BasicLayout";
9
+
10
+ // 路由懒加载配置
11
+ const Home = lazy(() => import("../pages/home"));
12
+ const About = lazy(() => import("../pages/about"));
13
+ const Dashboard = lazy(() => import("../pages/dashboard"));
14
+ const Workspace = lazy(() => import("../pages/workspace"));
15
+ const Calendar = lazy(() => import("../pages/calendar"));
16
+ const Settings = lazy(() => import("../pages/settings"));
17
+ const NotFound = lazy(() => import("../pages/404"));
18
+
19
+ // 全局 Loading 组件
20
+ const Loading = () => (
21
+ <div style={{ display: 'flex', justifyContent: 'center', alignItems: 'center', height: '100%', minHeight: 400 }}>
22
+ <Spin size="large" />
23
+ </div>
24
+ );
25
+
26
+ // 包装懒加载组件,统一添加 Suspense
27
+ function withSuspense(Component: LazyExoticComponent<ComponentType<any>>) {
28
+ return (
29
+ <Suspense fallback={<Loading />}>
30
+ <Component />
31
+ </Suspense>
32
+ );
33
+ }
34
+
35
+
36
+
37
+ export const router = createBrowserRouter([
38
+ {
39
+ path: "/",
40
+ // 根布局:BasicLayout (包含侧边栏和 Header)
41
+ element: <BasicLayout />,
42
+ // 子路由:渲染在 BasicLayout 的 <Outlet /> 中
43
+ children: [
44
+ {
45
+ index: true, // 默认子路由 (首页)
46
+ element: withSuspense(Home),
47
+ },
48
+ {
49
+ path: "dashboard",
50
+ element: withSuspense(Dashboard),
51
+ },
52
+ {
53
+ path: "about",
54
+ element: withSuspense(About),
55
+ },
56
+ {
57
+ path: "workspace",
58
+ element: withSuspense(Workspace),
59
+ },
60
+ {
61
+ path: "calendar",
62
+ element: withSuspense(Calendar),
63
+ },
64
+ {
65
+ path: "settings",
66
+ element: withSuspense(Settings),
67
+ },
68
+ // 404 页面配置
69
+ {
70
+ path: "*",
71
+ element: withSuspense(NotFound),
72
+ },
73
+ ],
74
+ },
75
+ ]);
@@ -0,0 +1,24 @@
1
+ import { create } from 'zustand'
2
+
3
+ // 1. 定义状态接口
4
+ interface CounterState {
5
+ count: number
6
+ increment: () => void
7
+ decrement: () => void
8
+ }
9
+
10
+ /**
11
+ * 全局计数器状态 (Zustand Store)
12
+ * 这是一个简单的状态管理示例,演示如何使用 Zustand
13
+ *
14
+ * @example
15
+ * // 在组件中使用
16
+ * const { count, increment } = useCounterStore()
17
+ */
18
+ export const useCounterStore = create<CounterState>()((set) => ({
19
+ // 初始状态
20
+ count: 0,
21
+ // 修改状态的方法 (Action)
22
+ increment: () => set((state) => ({ count: state.count + 1 })),
23
+ decrement: () => set((state) => ({ count: state.count - 1 })),
24
+ }))
@@ -0,0 +1,3 @@
1
+ *{
2
+ box-sizing: border-box;
3
+ }
@@ -0,0 +1,108 @@
1
+ /**
2
+ * 通用网络请求工具 (Axios Encapsulation)
3
+ * 封装了全局请求拦截、响应处理和错误统一处理
4
+ */
5
+ import axios, { type AxiosRequestConfig, type AxiosResponse } from 'axios';
6
+
7
+ // 定义通用的后端响应结构
8
+ export interface BaseResponse<T = unknown> {
9
+ code: number; // 业务状态码 (0/200: 成功, 其他: 失败)
10
+ data: T; // 业务数据
11
+ message: string; // 提示信息
12
+ }
13
+
14
+ // 创建 Axios 实例的工厂函数
15
+ function createRequest(config: AxiosRequestConfig) {
16
+ const instance = axios.create(config);
17
+
18
+ // 请求拦截器
19
+ instance.interceptors.request.use(
20
+ (reqConfig) => {
21
+ // 在发送请求之前做些什么,例如添加 token
22
+ const token = localStorage.getItem('token');
23
+ if (token && reqConfig.headers) {
24
+ reqConfig.headers.Authorization = `Bearer ${token}`;
25
+ }
26
+ return reqConfig;
27
+ },
28
+ (error) => {
29
+ return Promise.reject(error);
30
+ }
31
+ );
32
+
33
+ // 响应拦截器
34
+ instance.interceptors.response.use(
35
+ (response: AxiosResponse<BaseResponse>) => {
36
+ const { data } = response;
37
+ // 根据自定义的 code 判断请求是否成功 (假设 0 或 200 为成功)
38
+ if (data.code === 0 || data.code === 200) {
39
+ return data.data as any; // 拆包返回 data
40
+ } else {
41
+ // 处理业务错误,例如提示用户
42
+ console.error(data.message || '请求失败');
43
+ return Promise.reject(new Error(data.message || '请求失败'));
44
+ }
45
+ },
46
+ (error) => {
47
+ // 处理 HTTP 错误,例如 401, 404, 500 等
48
+ if (error.response) {
49
+ const status = error.response.status;
50
+ switch (status) {
51
+ case 401:
52
+ console.error('未授权,请重新登录');
53
+ // 执行登出逻辑等
54
+ break;
55
+ case 403:
56
+ console.error('拒绝访问');
57
+ break;
58
+ case 404:
59
+ console.error('请求地址错误');
60
+ break;
61
+ case 500:
62
+ console.error('服务器内部错误');
63
+ break;
64
+ default:
65
+ console.error(`请求错误: ${status}`);
66
+ }
67
+ } else {
68
+ console.error('网络连接异常,请稍后再试!');
69
+ }
70
+ return Promise.reject(error);
71
+ }
72
+ );
73
+
74
+ // 返回封装好的请求方法对象
75
+ return {
76
+ /**
77
+ * 发送 GET 请求
78
+ * @param url 请求地址
79
+ * @param config Axios 配置
80
+ */
81
+ get: <T = unknown>(url: string, config?: AxiosRequestConfig): Promise<T> => {
82
+ return instance.get(url, config);
83
+ },
84
+ /**
85
+ * 发送 POST 请求
86
+ * @param url 请求地址
87
+ * @param data 请求体数据
88
+ * @param config Axios 配置
89
+ */
90
+ post: <T = unknown>(url: string, data?: unknown, config?: AxiosRequestConfig): Promise<T> => {
91
+ return instance.post(url, data, config);
92
+ },
93
+ put: <T = unknown>(url: string, data?: unknown, config?: AxiosRequestConfig): Promise<T> => {
94
+ return instance.put(url, data, config);
95
+ },
96
+ delete: <T = unknown>(url: string, config?: AxiosRequestConfig): Promise<T> => {
97
+ return instance.delete(url, config);
98
+ }
99
+ };
100
+ }
101
+
102
+ // 导出默认 request 实例
103
+ // 可以直接 import { request } from '@/utils/request' 使用
104
+ export const request = createRequest({
105
+ // 从环境变量 VITE_API_BASE_URL 获取基础地址,默认为 /api
106
+ baseURL: import.meta.env.VITE_API_BASE_URL || '/api',
107
+ timeout: 10000, // 超时时间 10s
108
+ });
@@ -8,4 +8,11 @@ export default defineConfig({
8
8
  react(),
9
9
  babel({ presets: [reactCompilerPreset()] })
10
10
  ],
11
+ css: {
12
+ preprocessorOptions: {
13
+ less: {
14
+ javascriptEnabled: true,
15
+ },
16
+ },
17
+ },
11
18
  })
@@ -4,7 +4,7 @@
4
4
  <meta charset="UTF-8" />
5
5
  <link rel="icon" type="image/svg+xml" href="/favicon.svg" />
6
6
  <meta name="viewport" content="width=device-width, initial-scale=1.0" />
7
- <title>react-temp2</title>
7
+ <title>react-temp1</title>
8
8
  </head>
9
9
  <body>
10
10
  <div id="root"></div>
@@ -1,7 +1,7 @@
1
1
  import { StrictMode } from 'react'
2
2
  import { createRoot } from 'react-dom/client'
3
3
  import './index.css'
4
- import App from './App.tsx'
4
+ import App from './App.js'
5
5
 
6
6
  createRoot(document.getElementById('root')!).render(
7
7
  <StrictMode>
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "@chenhui996/gg-cli",
3
- "version": "1.0.1",
3
+ "version": "1.0.3",
4
4
  "description": "一个轻量级的现代前端脚手架工具,公网测试",
5
5
  "type": "module",
6
6
  "main": "dist/index.js",
@@ -1,75 +0,0 @@
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
- ```
@@ -1,23 +0,0 @@
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
- ])
@@ -1,184 +0,0 @@
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
- }
@@ -1,121 +0,0 @@
1
- import { useState } from 'react'
2
- import reactLogo from './assets/react.svg'
3
- import viteLogo from './assets/vite.svg'
4
- import heroImg from './assets/hero.png'
5
- import './App.css'
6
-
7
- function App() {
8
- const [count, setCount] = useState(0)
9
-
10
- return (
11
- <>
12
- <section id="center">
13
- <div className="hero">
14
- <img src={heroImg} className="base" width="170" height="179" alt="" />
15
- <img src={reactLogo} className="framework" alt="React logo" />
16
- <img src={viteLogo} className="vite" alt="Vite logo" />
17
- </div>
18
- <div>
19
- <h1>Get started</h1>
20
- <p>
21
- Edit <code>src/App.tsx</code> and save to test <code>HMR</code>
22
- </p>
23
- </div>
24
- <button
25
- className="counter"
26
- onClick={() => setCount((count) => count + 1)}
27
- >
28
- Count is {count}
29
- </button>
30
- </section>
31
-
32
- <div className="ticks"></div>
33
-
34
- <section id="next-steps">
35
- <div id="docs">
36
- <svg className="icon" role="presentation" aria-hidden="true">
37
- <use href="/icons.svg#documentation-icon"></use>
38
- </svg>
39
- <h2>Documentation</h2>
40
- <p>Your questions, answered</p>
41
- <ul>
42
- <li>
43
- <a href="https://vite.dev/" target="_blank">
44
- <img className="logo" src={viteLogo} alt="" />
45
- Explore Vite
46
- </a>
47
- </li>
48
- <li>
49
- <a href="https://react.dev/" target="_blank">
50
- <img className="button-icon" src={reactLogo} alt="" />
51
- Learn more
52
- </a>
53
- </li>
54
- </ul>
55
- </div>
56
- <div id="social">
57
- <svg className="icon" role="presentation" aria-hidden="true">
58
- <use href="/icons.svg#social-icon"></use>
59
- </svg>
60
- <h2>Connect with us</h2>
61
- <p>Join the Vite community</p>
62
- <ul>
63
- <li>
64
- <a href="https://github.com/vitejs/vite" target="_blank">
65
- <svg
66
- className="button-icon"
67
- role="presentation"
68
- aria-hidden="true"
69
- >
70
- <use href="/icons.svg#github-icon"></use>
71
- </svg>
72
- GitHub
73
- </a>
74
- </li>
75
- <li>
76
- <a href="https://chat.vite.dev/" target="_blank">
77
- <svg
78
- className="button-icon"
79
- role="presentation"
80
- aria-hidden="true"
81
- >
82
- <use href="/icons.svg#discord-icon"></use>
83
- </svg>
84
- Discord
85
- </a>
86
- </li>
87
- <li>
88
- <a href="https://x.com/vite_js" target="_blank">
89
- <svg
90
- className="button-icon"
91
- role="presentation"
92
- aria-hidden="true"
93
- >
94
- <use href="/icons.svg#x-icon"></use>
95
- </svg>
96
- X.com
97
- </a>
98
- </li>
99
- <li>
100
- <a href="https://bsky.app/profile/vite.dev" target="_blank">
101
- <svg
102
- className="button-icon"
103
- role="presentation"
104
- aria-hidden="true"
105
- >
106
- <use href="/icons.svg#bluesky-icon"></use>
107
- </svg>
108
- Bluesky
109
- </a>
110
- </li>
111
- </ul>
112
- </div>
113
- </section>
114
-
115
- <div className="ticks"></div>
116
- <section id="spacer"></section>
117
- </>
118
- )
119
- }
120
-
121
- export default App
@@ -1 +0,0 @@
1
- <svg xmlns="http://www.w3.org/2000/svg" width="77" height="47" fill="none" aria-labelledby="vite-logo-title" viewBox="0 0 77 47"><title id="vite-logo-title">Vite</title><style>.parenthesis{fill:#000}@media (prefers-color-scheme:dark){.parenthesis{fill:#fff}}</style><path fill="#9135ff" d="M40.151 45.71c-.663.844-2.02.374-2.02-.699V34.708a2.26 2.26 0 0 0-2.262-2.262H24.493c-.92 0-1.457-1.04-.92-1.788l7.479-10.471c1.07-1.498 0-3.578-1.842-3.578H15.443c-.92 0-1.456-1.04-.92-1.788l9.696-13.576c.213-.297.556-.474.92-.474h28.894c.92 0 1.456 1.04.92 1.788l-7.48 10.472c-1.07 1.497 0 3.578 1.842 3.578h11.376c.944 0 1.474 1.087.89 1.83L40.153 45.712z"/><mask id="a" width="48" height="47" x="14" y="0" maskUnits="userSpaceOnUse" style="mask-type:alpha"><path fill="#000" d="M40.047 45.71c-.663.843-2.02.374-2.02-.699V34.708a2.26 2.26 0 0 0-2.262-2.262H24.389c-.92 0-1.457-1.04-.92-1.788l7.479-10.472c1.07-1.497 0-3.578-1.842-3.578H15.34c-.92 0-1.456-1.04-.92-1.788l9.696-13.575c.213-.297.556-.474.92-.474H53.93c.92 0 1.456 1.04.92 1.788L47.37 13.03c-1.07 1.498 0 3.578 1.842 3.578h11.376c.944 0 1.474 1.088.89 1.831L40.049 45.712z"/></mask><g mask="url(#a)"><g filter="url(#b)"><ellipse cx="5.508" cy="14.704" fill="#eee6ff" rx="5.508" ry="14.704" transform="rotate(269.814 20.96 11.29)scale(-1 1)"/></g><g filter="url(#c)"><ellipse cx="10.399" cy="29.851" fill="#eee6ff" rx="10.399" ry="29.851" transform="rotate(89.814 -16.902 -8.275)scale(1 -1)"/></g><g filter="url(#d)"><ellipse cx="5.508" cy="30.487" fill="#8900ff" rx="5.508" ry="30.487" transform="rotate(89.814 -19.197 -7.127)scale(1 -1)"/></g><g filter="url(#e)"><ellipse cx="5.508" cy="30.599" fill="#8900ff" rx="5.508" ry="30.599" transform="rotate(89.814 -25.928 4.177)scale(1 -1)"/></g><g filter="url(#f)"><ellipse cx="5.508" cy="30.599" fill="#8900ff" rx="5.508" ry="30.599" transform="rotate(89.814 -25.738 5.52)scale(1 -1)"/></g><g filter="url(#g)"><ellipse cx="14.072" cy="22.078" fill="#eee6ff" rx="14.072" ry="22.078" transform="rotate(93.35 31.245 55.578)scale(-1 1)"/></g><g filter="url(#h)"><ellipse cx="3.47" cy="21.501" fill="#8900ff" rx="3.47" ry="21.501" transform="rotate(89.009 35.419 55.202)scale(-1 1)"/></g><g filter="url(#i)"><ellipse cx="3.47" cy="21.501" fill="#8900ff" rx="3.47" ry="21.501" transform="rotate(89.009 35.419 55.202)scale(-1 1)"/></g><g filter="url(#j)"><ellipse cx="14.592" cy="9.743" fill="#8900ff" rx="4.407" ry="29.108" transform="rotate(39.51 14.592 9.743)"/></g><g filter="url(#k)"><ellipse cx="61.728" cy="-5.321" fill="#8900ff" rx="4.407" ry="29.108" transform="rotate(37.892 61.728 -5.32)"/></g><g filter="url(#l)"><ellipse cx="55.618" cy="7.104" fill="#00c2ff" rx="5.971" ry="9.665" transform="rotate(37.892 55.618 7.104)"/></g><g filter="url(#m)"><ellipse cx="12.326" cy="39.103" fill="#8900ff" rx="4.407" ry="29.108" transform="rotate(37.892 12.326 39.103)"/></g><g filter="url(#n)"><ellipse cx="12.326" cy="39.103" fill="#8900ff" rx="4.407" ry="29.108" transform="rotate(37.892 12.326 39.103)"/></g><g filter="url(#o)"><ellipse cx="49.857" cy="30.678" fill="#8900ff" rx="4.407" ry="29.108" transform="rotate(37.892 49.857 30.678)"/></g><g filter="url(#p)"><ellipse cx="52.623" cy="33.171" fill="#00c2ff" rx="5.971" ry="15.297" transform="rotate(37.892 52.623 33.17)"/></g></g><path d="M6.919 0c-9.198 13.166-9.252 33.575 0 46.789h6.215c-9.25-13.214-9.196-33.623 0-46.789zm62.424 0h-6.215c9.198 13.166 9.252 33.575 0 46.789h6.215c9.25-13.214 9.196-33.623 0-46.789" class="parenthesis"/><defs><filter id="b" width="60.045" height="41.654" x="-5.564" y="16.92" color-interpolation-filters="sRGB" filterUnits="userSpaceOnUse"><feFlood flood-opacity="0" result="BackgroundImageFix"/><feBlend in="SourceGraphic" in2="BackgroundImageFix" result="shape"/><feGaussianBlur result="effect1_foregroundBlur_2002_17286" stdDeviation="7.659"/></filter><filter id="c" width="90.34" height="51.437" x="-40.407" y="-6.762" color-interpolation-filters="sRGB" filterUnits="userSpaceOnUse"><feFlood flood-opacity="0" result="BackgroundImageFix"/><feBlend in="SourceGraphic" in2="BackgroundImageFix" result="shape"/><feGaussianBlur result="effect1_foregroundBlur_2002_17286" stdDeviation="7.659"/></filter><filter id="d" width="79.355" height="29.4" x="-35.435" y="2.801" color-interpolation-filters="sRGB" filterUnits="userSpaceOnUse"><feFlood flood-opacity="0" result="BackgroundImageFix"/><feBlend in="SourceGraphic" in2="BackgroundImageFix" result="shape"/><feGaussianBlur result="effect1_foregroundBlur_2002_17286" stdDeviation="4.596"/></filter><filter id="e" width="79.579" height="29.4" x="-30.84" y="20.8" color-interpolation-filters="sRGB" filterUnits="userSpaceOnUse"><feFlood flood-opacity="0" result="BackgroundImageFix"/><feBlend in="SourceGraphic" in2="BackgroundImageFix" result="shape"/><feGaussianBlur result="effect1_foregroundBlur_2002_17286" stdDeviation="4.596"/></filter><filter id="f" width="79.579" height="29.4" x="-29.307" y="21.949" color-interpolation-filters="sRGB" filterUnits="userSpaceOnUse"><feFlood flood-opacity="0" result="BackgroundImageFix"/><feBlend in="SourceGraphic" in2="BackgroundImageFix" result="shape"/><feGaussianBlur result="effect1_foregroundBlur_2002_17286" stdDeviation="4.596"/></filter><filter id="g" width="74.749" height="58.852" x="29.961" y="-17.13" color-interpolation-filters="sRGB" filterUnits="userSpaceOnUse"><feFlood flood-opacity="0" result="BackgroundImageFix"/><feBlend in="SourceGraphic" in2="BackgroundImageFix" result="shape"/><feGaussianBlur result="effect1_foregroundBlur_2002_17286" stdDeviation="7.659"/></filter><filter id="h" width="61.377" height="25.362" x="37.754" y="3.055" color-interpolation-filters="sRGB" filterUnits="userSpaceOnUse"><feFlood flood-opacity="0" result="BackgroundImageFix"/><feBlend in="SourceGraphic" in2="BackgroundImageFix" result="shape"/><feGaussianBlur result="effect1_foregroundBlur_2002_17286" stdDeviation="4.596"/></filter><filter id="i" width="61.377" height="25.362" x="37.754" y="3.055" color-interpolation-filters="sRGB" filterUnits="userSpaceOnUse"><feFlood flood-opacity="0" result="BackgroundImageFix"/><feBlend in="SourceGraphic" in2="BackgroundImageFix" result="shape"/><feGaussianBlur result="effect1_foregroundBlur_2002_17286" stdDeviation="4.596"/></filter><filter id="j" width="56.045" height="63.649" x="-13.43" y="-22.082" color-interpolation-filters="sRGB" filterUnits="userSpaceOnUse"><feFlood flood-opacity="0" result="BackgroundImageFix"/><feBlend in="SourceGraphic" in2="BackgroundImageFix" result="shape"/><feGaussianBlur result="effect1_foregroundBlur_2002_17286" stdDeviation="4.596"/></filter><filter id="k" width="54.814" height="64.646" x="34.321" y="-37.644" color-interpolation-filters="sRGB" filterUnits="userSpaceOnUse"><feFlood flood-opacity="0" result="BackgroundImageFix"/><feBlend in="SourceGraphic" in2="BackgroundImageFix" result="shape"/><feGaussianBlur result="effect1_foregroundBlur_2002_17286" stdDeviation="4.596"/></filter><filter id="l" width="33.541" height="35.313" x="38.847" y="-10.552" color-interpolation-filters="sRGB" filterUnits="userSpaceOnUse"><feFlood flood-opacity="0" result="BackgroundImageFix"/><feBlend in="SourceGraphic" in2="BackgroundImageFix" result="shape"/><feGaussianBlur result="effect1_foregroundBlur_2002_17286" stdDeviation="4.596"/></filter><filter id="m" width="54.814" height="64.646" x="-15.081" y="6.78" color-interpolation-filters="sRGB" filterUnits="userSpaceOnUse"><feFlood flood-opacity="0" result="BackgroundImageFix"/><feBlend in="SourceGraphic" in2="BackgroundImageFix" result="shape"/><feGaussianBlur result="effect1_foregroundBlur_2002_17286" stdDeviation="4.596"/></filter><filter id="n" width="54.814" height="64.646" x="-15.081" y="6.78" color-interpolation-filters="sRGB" filterUnits="userSpaceOnUse"><feFlood flood-opacity="0" result="BackgroundImageFix"/><feBlend in="SourceGraphic" in2="BackgroundImageFix" result="shape"/><feGaussianBlur result="effect1_foregroundBlur_2002_17286" stdDeviation="4.596"/></filter><filter id="o" width="54.814" height="64.646" x="22.45" y="-1.645" color-interpolation-filters="sRGB" filterUnits="userSpaceOnUse"><feFlood flood-opacity="0" result="BackgroundImageFix"/><feBlend in="SourceGraphic" in2="BackgroundImageFix" result="shape"/><feGaussianBlur result="effect1_foregroundBlur_2002_17286" stdDeviation="4.596"/></filter><filter id="p" width="39.409" height="43.623" x="32.919" y="11.36" color-interpolation-filters="sRGB" filterUnits="userSpaceOnUse"><feFlood flood-opacity="0" result="BackgroundImageFix"/><feBlend in="SourceGraphic" in2="BackgroundImageFix" result="shape"/><feGaussianBlur result="effect1_foregroundBlur_2002_17286" stdDeviation="4.596"/></filter></defs></svg>