@ienlab/cloud-functions-library 0.9.5 → 1.0.0-dev.1

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 (45) hide show
  1. package/dist/__vite-browser-external-BrdF6Ba4.js +1 -0
  2. package/dist/__vite-browser-external-C4yfM1ew.mjs +25 -0
  3. package/dist/dist-B3gFypMh.js +5 -0
  4. package/dist/dist-BHRQIx5i.mjs +460 -0
  5. package/dist/dist-CkUzyZvx.js +1 -0
  6. package/dist/dist-Cum8lv5j.mjs +16 -0
  7. package/dist/from-BPj5eOuj.mjs +2443 -0
  8. package/dist/from-jzy6jn2J.js +4 -0
  9. package/dist/index.d.ts +25 -0
  10. package/dist/index.js +66 -0
  11. package/dist/index.mjs +49920 -0
  12. package/dist/multipart-parser-9TgDfPGH.mjs +149 -0
  13. package/dist/multipart-parser-D41wkGe-.js +2 -0
  14. package/dist/multipart-parser-DOk5BsUv.js +2 -0
  15. package/dist/multipart-parser-D_l0qnsO.mjs +149 -0
  16. package/dist/src-C0B8QY6h.js +3 -0
  17. package/dist/src-CNjb2Vfu.js +3 -0
  18. package/dist/src-CYCYovTl.mjs +666 -0
  19. package/dist/src-M25oq7Q_.mjs +666 -0
  20. package/package.json +17 -18
  21. package/.gemini/config.yaml +0 -47
  22. package/.github/ISSUE_TEMPLATE/bug_report.yaml +0 -74
  23. package/.github/ISSUE_TEMPLATE/documentation.yaml +0 -23
  24. package/.github/ISSUE_TEMPLATE/feature_request.yaml +0 -60
  25. package/.github/ISSUE_TEMPLATE/question.yaml +0 -17
  26. package/.github/ISSUE_TEMPLATE/refactor.yaml +0 -42
  27. package/.github/RELEASE_TEMPLATE.md +0 -17
  28. package/.github/workflows/publish.yml +0 -30
  29. package/eslint.config.js +0 -23
  30. package/index.html +0 -13
  31. package/public/favicon.svg +0 -1
  32. package/public/icons.svg +0 -24
  33. package/src/App.css +0 -184
  34. package/src/App.tsx +0 -121
  35. package/src/assets/hero.png +0 -0
  36. package/src/assets/react.svg +0 -1
  37. package/src/assets/vite.svg +0 -1
  38. package/src/index.css +0 -111
  39. package/src/index.ts +0 -16
  40. package/src/main.tsx +0 -10
  41. package/tsconfig.app.json +0 -25
  42. package/tsconfig.build.json +0 -17
  43. package/tsconfig.json +0 -7
  44. package/tsconfig.node.json +0 -24
  45. package/vite.config.ts +0 -33
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "@ienlab/cloud-functions-library",
3
- "version": "0.9.5",
3
+ "version": "1.0.0-dev.1",
4
4
  "main": "./dist/index.js",
5
5
  "module": "./dist/index.mjs",
6
6
  "types": "./dist/index.d.ts",
@@ -11,27 +11,26 @@
11
11
  "types": "./dist/index.d.ts"
12
12
  }
13
13
  },
14
+ "files": ["dist"],
14
15
  "scripts": {
15
16
  "build": "vite build"
16
17
  },
17
- "dependencies": {
18
- "firebase-admin": "^13.6.0",
19
- "firebase-functions": "^7.0.0"
18
+ "dependencies": {},
19
+ "peerDependencies": {
20
+ "firebase-admin": ">=12.0.0",
21
+ "firebase-functions": ">=6.0.0"
20
22
  },
21
23
  "devDependencies": {
22
- "firebase-functions-test": "^3.1.0",
23
- "@eslint/js": "^9.39.4",
24
- "@types/node": "^24.12.2",
25
- "@types/react": "^19.2.14",
26
- "@types/react-dom": "^19.2.3",
27
- "@vitejs/plugin-react": "^6.0.1",
28
- "eslint": "^9.39.4",
29
- "eslint-plugin-react-hooks": "^7.0.1",
30
- "eslint-plugin-react-refresh": "^0.5.2",
31
- "globals": "^17.4.0",
32
- "typescript": "~6.0.2",
33
- "typescript-eslint": "^8.58.0",
34
- "vite": "^8.0.4",
35
- "vite-plugin-dts": "^4.5.4"
24
+ "firebase-admin": "^13.10.0",
25
+ "firebase-functions": "^7.2.5",
26
+ "firebase-functions-test": "^3.5.0",
27
+ "@eslint/js": "^10.0.1",
28
+ "@types/node": "^25.9.1",
29
+ "eslint": "^10.4.1",
30
+ "globals": "^17.6.0",
31
+ "typescript": "~6.0.3",
32
+ "typescript-eslint": "^8.60.0",
33
+ "vite": "^8.0.14",
34
+ "vite-plugin-dts": "^5.0.1"
36
35
  }
37
36
  }
@@ -1,47 +0,0 @@
1
- # Gemini Code Review Configuration
2
- version: 1
3
-
4
- language: "ko-KR"
5
-
6
- review:
7
- prompt: |
8
- 당신은 Firebase Cloud Functions 및 TypeScript 백엔드 아키텍처 전문가입니다.
9
- 코드 리뷰 시 친절하고 상세하게 설명하며, 즉시 커밋 가능한 코드 해결책을 제공하세요.
10
-
11
- focus_areas:
12
- - performance # Cold Start 최적화 및 리소스 관리
13
- - security # IAM 권한 및 데이터 검증
14
- - clean_code # 비즈니스 로직 분리 및 에러 처리
15
- - cost_optimization # DB 호출 최적화
16
-
17
- guidelines:
18
- - "비동기 작업(Promise)이 올바르게 리턴되는지 엄격히 확인하세요."
19
- - "Firebase Admin SDK의 권한 최소화 원칙을 준수하는지 검토하세요."
20
- - "비즈니스 로직이 Service 레이어로 잘 분리되어 유지보수가 용이한지 확인하세요."
21
- - "불필요한 DB 접근을 줄이기 위한 배치 처리나 트랜잭션을 제안하세요."
22
-
23
- commit_message:
24
- enabled: true
25
- language: "ko-KR"
26
- prompt: |
27
- 당신은 Git 커밋 메시지 전문가입니다. $COMMIT_DIFF를 분석하여 규칙에 맞게 작성하세요.
28
-
29
- ## Output Format
30
- <Gitmoji> <Type>(<Scope>): <Subject>
31
- <Body (optional)>
32
-
33
- ## Rules
34
- - 한국어로 작성하고 마침표 없이 명령형 어조를 사용하세요.
35
- - 제목 앞에 반드시 Gitmoji를 붙이세요. (✨, 🐛, ♻️, ⚡, 🔒, 🔧 등)
36
- - 마크다운 블록 없이 커밋 메시지만 출력하세요.
37
-
38
- ignore:
39
- - "**/node_modules/**"
40
- - "**/lib/**"
41
- - "**/dist/**"
42
- - "**/firebase-debug.log"
43
- - "**/package-lock.json"
44
-
45
- output:
46
- style: "detailed"
47
- include_solutions: true
@@ -1,74 +0,0 @@
1
- name: 🐛 버그 리포트
2
- description: 발견된 버그를 작성해 주세요.
3
- title: '[BUG] '
4
- labels: ['bug']
5
-
6
- body:
7
- - type: checkboxes
8
- id: function-type
9
- attributes:
10
- label: "🔧 Functions 유형"
11
- options:
12
- - label: "1st gen (firebase-functions v3/v4)"
13
- - label: "2nd gen (v4+/v5+)"
14
- - label: "Callable"
15
- - label: "HTTP"
16
- - label: "Firestore Trigger"
17
- - label: "Auth Trigger"
18
- - label: "Storage Trigger"
19
- - label: "Pub/Sub 등 기타"
20
-
21
- - type: input
22
- id: versions
23
- attributes:
24
- label: "📦 버전 정보"
25
- placeholder: "firebase-functions: 6.0.0, firebase-admin: 13.0.1, Node: 20.x"
26
- validations:
27
- required: true
28
-
29
- - type: textarea
30
- id: description
31
- attributes:
32
- label: "📝 버그 설명"
33
- placeholder: "어떤 함수에서 어떤 문제가 발생하나요?"
34
- validations:
35
- required: true
36
-
37
- - type: textarea
38
- id: reproduce
39
- attributes:
40
- label: "🚀 재현 절차"
41
- placeholder: |
42
- 1.
43
- 2.
44
- 3.
45
- validations:
46
- required: true
47
-
48
- - type: textarea
49
- id: expected
50
- attributes:
51
- label: "🎯 기대 결과"
52
- placeholder: "정상 동작은?"
53
- validations:
54
- required: true
55
-
56
- - type: textarea
57
- id: code
58
- attributes:
59
- label: "📄 관련 코드"
60
- placeholder: |
61
- ```ts
62
- // 최소 재현 코드
63
- ```
64
-
65
- - type: textarea
66
- id: logs
67
- attributes:
68
- label: "📸 로그 / 에러"
69
- placeholder: |
70
- ```text
71
- // Cloud Logging, deploy 로그, 에뮬레이터 출력 등
72
- ```
73
- validations:
74
- required: true
@@ -1,23 +0,0 @@
1
- name: 📚 문서 개선
2
- description: 문서 개선 요청입니다.
3
- title: '[DOCS] '
4
- labels: ['documentation']
5
- body:
6
- - type: dropdown
7
- id: target
8
- attributes:
9
- label: "📖 개선 대상"
10
- options:
11
- - "README.md"
12
- - "API 문서"
13
- - "코드 주석"
14
- - "튜토리얼"
15
- validations:
16
- required: true
17
- - type: textarea
18
- id: suggestion
19
- attributes:
20
- label: "💡 개선 제안"
21
- placeholder: "어떻게 개선할까요?"
22
- validations:
23
- required: true
@@ -1,60 +0,0 @@
1
- name: ✨ 기능 추가
2
- description: 새로운 기능이나 개선 사항을 제안합니다.
3
- title: '[FEATURE] '
4
- labels: ['enhancement']
5
-
6
- body:
7
- - type: textarea
8
- id: background
9
- attributes:
10
- label: "💡 제안 배경"
11
- placeholder: "왜 필요한 기능인가요? (예: 새로운 트리거 필요, 성능 개선 등)"
12
- validations:
13
- required: true
14
-
15
- - type: textarea
16
- id: details
17
- attributes:
18
- label: "🧩 제안 내용"
19
- placeholder: |
20
- ```typescript
21
- // 예시 코드나 API 스펙
22
- export const newFeature = functions.firestore
23
- .document('users/{userId}')
24
- .onCreate(async (event, context) => {
25
- // 새로운 로직
26
- });
27
- ```
28
- render: typescript
29
- validations:
30
- required: true
31
-
32
- - type: textarea
33
- id: expected
34
- attributes:
35
- label: "🚀 기대 동작 & 효과"
36
- placeholder: "추가 후 서버/클라이언트 동작, 예상 성능 이득(콜드 스타트, 비용 등)"
37
-
38
- - type: checkboxes
39
- id: targets
40
- attributes:
41
- label: "🎯 적용 대상"
42
- options:
43
- - label: "1st gen Functions"
44
- - label: "2nd gen Functions"
45
- - label: "Callable Functions"
46
- - label: "HTTP Functions"
47
- - label: "Firestore Triggers"
48
- - label: "Auth Triggers"
49
- - label: "Storage Triggers"
50
- - label: "Pub/Sub 등"
51
-
52
- - type: checkboxes
53
- id: impact
54
- attributes:
55
- label: "⚡ 예상 영향"
56
- options:
57
- - label: "클라이언트 앱 변경 필요"
58
- - label: "배포 재시작 필요"
59
- - label: "Firestore 스키마 변경"
60
- - label: "비용 증가 가능"
@@ -1,17 +0,0 @@
1
- name: ❓ 질문
2
- description: 코드나 프로젝트에 대한 질문입니다.
3
- title: '[QUESTION] '
4
- labels: ['question']
5
- body:
6
- - type: textarea
7
- id: question
8
- attributes:
9
- label: "💬 질문 내용"
10
- placeholder: "궁금하신 점을 자세히..."
11
- validations:
12
- required: true
13
- - type: textarea
14
- id: code
15
- attributes:
16
- label: "📱 관련 코드 (선택)"
17
- render: kotlin
@@ -1,42 +0,0 @@
1
- name: 🔄 리팩토링
2
- description: 코드 리팩토링 요청입니다.
3
- title: '[REFACTOR] '
4
- labels: ['refactoring']
5
-
6
- body:
7
- - type: textarea
8
- id: code
9
- attributes:
10
- label: "🎯 리팩토링 대상 코드"
11
- description: "index.ts 또는 관련 파일의 해당 부분을 붙여넣으세요."
12
- placeholder: |
13
- ```typescript
14
- // 리팩토링할 Functions 코드
15
- export const sample = functions.https.onRequest((req, res) => {
16
- // ...
17
- });
18
- ```
19
- render: typescript
20
- validations:
21
- required: true
22
-
23
- - type: dropdown
24
- id: reason
25
- attributes:
26
- label: "💡 개선 이유 (복수 선택)"
27
- multiple: true
28
- options:
29
- - "가독성 향상"
30
- - "성능 최적화 (콜드 스타트, 메모리)"
31
- - "유지보수성 개선"
32
- - "코드 중복 제거"
33
- - "배포 크기/빌드 시간 최적화"
34
- - "에러 핸들링 강화"
35
- - "TypeScript 타입 안전성"
36
- - "테스트 커버리지 향상"
37
-
38
- - type: textarea
39
- id: details
40
- attributes:
41
- label: "📝 세부 개선 사항"
42
- placeholder: "어떤 부분을 어떻게 바꿀지, 예상 이득(예: 콜드 스타트 200ms 단축)을 적어주세요."
@@ -1,17 +0,0 @@
1
- # {{ tag_name }}
2
-
3
- **릴리스 날짜**: {{ date: YYYY-MM-DD }}
4
-
5
- ## ✨ 주요 변경사항
6
- {{ changelog }}
7
-
8
- ## 📱 플랫폼 지원
9
- - ✅ Android
10
- - ✅ iOS
11
- - ✅ Common (KMP)
12
-
13
- ## 🔗 연관 PR/이슈
14
- {{ linked_issues }}
15
-
16
- ---
17
- *자동 생성됨 - [Changelog Builder]*
@@ -1,30 +0,0 @@
1
- name: Publish to NPM
2
-
3
- on:
4
- release:
5
- types: [created] # GitHub Release 생성 시 트리거
6
-
7
- jobs:
8
- publish:
9
- runs-on: ubuntu-latest
10
-
11
- steps:
12
- - name: Checkout
13
- uses: actions/checkout@v4
14
-
15
- - name: Setup Node.js
16
- uses: actions/setup-node@v4
17
- with:
18
- node-version: '20'
19
- registry-url: 'https://registry.npmjs.org'
20
-
21
- - name: Install dependencies
22
- run: npm ci
23
-
24
- - name: Build
25
- run: npm run build
26
-
27
- - name: Publish
28
- run: npm publish --access public
29
- env:
30
- NODE_AUTH_TOKEN: ${{ secrets.NPM_TOKEN }}
package/eslint.config.js DELETED
@@ -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
- ])
package/index.html DELETED
@@ -1,13 +0,0 @@
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>ienlab-cloud-functions-library</title>
8
- </head>
9
- <body>
10
- <div id="root"></div>
11
- <script type="module" src="/src/main.tsx"></script>
12
- </body>
13
- </html>
@@ -1 +0,0 @@
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>
package/public/icons.svg DELETED
@@ -1,24 +0,0 @@
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>
package/src/App.css DELETED
@@ -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
- }