@nexttylabs/echo 0.4.0 → 0.6.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.
Files changed (262) hide show
  1. package/CHANGELOG.md +27 -0
  2. package/app/(dashboard)/admin/feedback/[id]/edit/page.tsx +12 -6
  3. package/app/(dashboard)/admin/feedback/new/page.tsx +19 -17
  4. package/app/(dashboard)/admin/layout.tsx +16 -6
  5. package/app/(dashboard)/layout.tsx +4 -2
  6. package/app/(dashboard)/settings/api-keys/page.tsx +13 -3
  7. package/app/(dashboard)/settings/layout.tsx +25 -2
  8. package/app/(dashboard)/settings/organization/page.tsx +8 -9
  9. package/app/(public)/[organizationSlug]/roadmap/page.tsx +19 -1
  10. package/app/api/admin/backup/route.ts +22 -4
  11. package/app/api/auth/register/handler.ts +1 -2
  12. package/app/api/feedback/[id]/comments/[commentId]/route.ts +13 -4
  13. package/app/api/feedback/[id]/reclassify/route.ts +4 -4
  14. package/app/api/organizations/handler.ts +2 -4
  15. package/components/settings/settings-sidebar.tsx +4 -4
  16. package/hooks/use-organization.tsx +116 -0
  17. package/hooks/use-permissions.ts +24 -11
  18. package/lib/auth/config.ts +0 -7
  19. package/lib/auth/organization.ts +20 -0
  20. package/lib/auth/permissions.ts +10 -0
  21. package/lib/db/migrations/0000_needy_leech.sql +335 -0
  22. package/lib/db/migrations/meta/0000_snapshot.json +2186 -1
  23. package/lib/db/migrations/meta/_journal.json +2 -135
  24. package/lib/db/schema/auth.ts +0 -1
  25. package/lib/db/schema/index.ts +0 -1
  26. package/lib/portal/public-context.tsx +5 -0
  27. package/package.json +20 -1
  28. package/.changeset/README.md +0 -21
  29. package/.changeset/config.json +0 -11
  30. package/.changeset/cozy-ghosts-care.md +0 -5
  31. package/.changeset/sharp-lines-stand.md +0 -5
  32. package/.changeset/sour-doodles-eat.md +0 -5
  33. package/.changeset/tender-moose-shop.md +0 -5
  34. package/.github/pull_request_template.md +0 -13
  35. package/.github/workflows/ci.yml +0 -41
  36. package/.github/workflows/publish.yml +0 -44
  37. package/.github/workflows/release.yml +0 -73
  38. package/AGENTS.md +0 -92
  39. package/Dockerfile +0 -57
  40. package/Makefile +0 -77
  41. package/bun.lock +0 -2503
  42. package/components/portal/project-switcher.tsx +0 -20
  43. package/docker-compose.dev.yml +0 -26
  44. package/docker-compose.yml +0 -98
  45. package/docs/architecture.md +0 -259
  46. package/docs/component-inventory.md +0 -261
  47. package/docs/database-migrations.md +0 -76
  48. package/docs/development-guide.md +0 -209
  49. package/docs/e2e-user-flows.csv +0 -31
  50. package/docs/er-diagram-feedback.mmd +0 -138
  51. package/docs/er-diagram.mmd +0 -281
  52. package/docs/i18n-check-report.md +0 -296
  53. package/docs/index.md +0 -214
  54. package/docs/logic-chain.md +0 -94
  55. package/docs/plans/2026-01-02-database-migration-scripts.md +0 -496
  56. package/docs/plans/2026-01-02-user-login-design.md +0 -37
  57. package/docs/plans/2026-01-02-user-login.md +0 -437
  58. package/docs/plans/2026-01-02-user-registration-design.md +0 -47
  59. package/docs/plans/2026-01-02-user-registration.md +0 -628
  60. package/docs/plans/2026-01-03-roles-permissions-design.md +0 -20
  61. package/docs/plans/2026-01-03-roles-permissions.md +0 -266
  62. package/docs/plans/2026-01-05-authentication-middleware.md +0 -207
  63. package/docs/plans/2026-01-05-member-removal.md +0 -186
  64. package/docs/plans/2026-01-05-organization-creation.md +0 -374
  65. package/docs/plans/2026-01-05-rbac-middleware.md +0 -112
  66. package/docs/plans/2026-01-05-role-configuration.md +0 -441
  67. package/docs/plans/2026-01-06-file-upload-support.md +0 -804
  68. package/docs/plans/2026-01-06-permission-check-hook.md +0 -155
  69. package/docs/plans/2026-01-06-resource-ownership-check.md +0 -231
  70. package/docs/plans/2026-01-07-feedback-tracking-link.md +0 -459
  71. package/docs/plans/2026-01-09-logout-redirect-design.md +0 -52
  72. package/docs/plans/2026-01-09-phase2-3-plan.md +0 -654
  73. package/docs/plans/2026-01-09-portal-execution-plan.md +0 -408
  74. package/docs/plans/2026-01-09-project-delete-feature-design.md +0 -163
  75. package/docs/plans/2026-01-09-project-delete-implementation.md +0 -451
  76. package/docs/plans/2026-01-09-project-edit-delete-design.md +0 -52
  77. package/docs/plans/2026-01-09-settings-center-design.md +0 -114
  78. package/docs/plans/2026-01-09-settings-center.md +0 -948
  79. package/docs/plans/2026-01-10-organization-only-design.md +0 -66
  80. package/docs/plans/2026-01-10-organization-only-implementation.md +0 -433
  81. package/docs/plans/2026-01-10-portal-settings-restructure-plan.md +0 -18
  82. package/docs/plans/2026-01-10-project-settings-tabs-design-implementation.md +0 -296
  83. package/docs/plans/2026-01-14-e2e-playwright-feedback.md +0 -173
  84. package/docs/plans/2026-01-15-feedback-management-org-context-design.md +0 -82
  85. package/docs/plans/2026-01-15-feedback-management-org-context-implementation-plan.md +0 -521
  86. package/docs/plans/2026-01-16-admin-feedback-filters-design.md +0 -75
  87. package/docs/plans/2026-01-16-admin-feedback-filters-implementation.md +0 -293
  88. package/docs/plans/2026-01-16-admin-feedback-route-consolidation.md +0 -180
  89. package/docs/plans/2026-01-16-e2e-test-fixes.md +0 -158
  90. package/docs/plans/2026-01-17-admin-feedback-filters.md +0 -214
  91. package/docs/plans/2026-01-17-admin-feedback-improvements.md +0 -453
  92. package/docs/plans/2026-01-18-changesets-design.md +0 -40
  93. package/docs/product_changes.md +0 -37
  94. package/docs/project-overview.md +0 -159
  95. package/docs/project-scan-report.json +0 -104
  96. package/docs/route-role-visibility.md +0 -51
  97. package/docs/source-tree-analysis.md +0 -150
  98. package/docs/testing/delete-project-manual-tests.md +0 -18
  99. package/docs/user-story-tracking.md +0 -191
  100. package/eslint.config.mjs +0 -19
  101. package/lib/db/migrations/.gitkeep +0 -0
  102. package/lib/db/migrations/0000_cynical_gladiator.sql +0 -53
  103. package/lib/db/migrations/0001_wandering_sunfire.sql +0 -27
  104. package/lib/db/migrations/0002_shallow_speedball.sql +0 -1
  105. package/lib/db/migrations/0003_add_org_description.sql +0 -1
  106. package/lib/db/migrations/0003_boring_wild_pack.sql +0 -13
  107. package/lib/db/migrations/0004_windy_tyrannus.sql +0 -27
  108. package/lib/db/migrations/0005_perpetual_doorman.sql +0 -5
  109. package/lib/db/migrations/0006_aberrant_captain_midlands.sql +0 -13
  110. package/lib/db/migrations/0007_clever_captain_cross.sql +0 -14
  111. package/lib/db/migrations/0008_sparkling_pandemic.sql +0 -2
  112. package/lib/db/migrations/0009_happy_black_tom.sql +0 -29
  113. package/lib/db/migrations/0010_kind_junta.sql +0 -8
  114. package/lib/db/migrations/0011_mute_squadron_supreme.sql +0 -25
  115. package/lib/db/migrations/0012_giant_power_man.sql +0 -24
  116. package/lib/db/migrations/0013_damp_titanium_man.sql +0 -17
  117. package/lib/db/migrations/0014_blue_alice.sql +0 -18
  118. package/lib/db/migrations/0015_webhook_tables.sql +0 -41
  119. package/lib/db/migrations/0016_github_integration.sql +0 -30
  120. package/lib/db/migrations/0016_overjoyed_ghost_rider.sql +0 -22
  121. package/lib/db/migrations/0017_slimy_inhumans.sql +0 -6
  122. package/lib/db/migrations/0018_same_spitfire.sql +0 -1
  123. package/lib/db/migrations/0019_jittery_loners.sql +0 -16
  124. package/lib/db/migrations/0019_remove_projects_add_org_settings.sql +0 -14
  125. package/lib/db/migrations/meta/0001_snapshot.json +0 -553
  126. package/lib/db/migrations/meta/0002_snapshot.json +0 -560
  127. package/lib/db/migrations/meta/0003_snapshot.json +0 -650
  128. package/lib/db/migrations/meta/0004_snapshot.json +0 -852
  129. package/lib/db/migrations/meta/0005_snapshot.json +0 -900
  130. package/lib/db/migrations/meta/0006_snapshot.json +0 -1011
  131. package/lib/db/migrations/meta/0007_snapshot.json +0 -1125
  132. package/lib/db/migrations/meta/0008_snapshot.json +0 -1146
  133. package/lib/db/migrations/meta/0009_snapshot.json +0 -1386
  134. package/lib/db/migrations/meta/0010_snapshot.json +0 -1419
  135. package/lib/db/migrations/meta/0011_snapshot.json +0 -1615
  136. package/lib/db/migrations/meta/0012_snapshot.json +0 -1805
  137. package/lib/db/migrations/meta/0013_snapshot.json +0 -1948
  138. package/lib/db/migrations/meta/0014_snapshot.json +0 -2082
  139. package/lib/db/migrations/meta/0015_snapshot.json +0 -2476
  140. package/lib/db/migrations/meta/0016_snapshot.json +0 -2633
  141. package/lib/db/migrations/meta/0017_snapshot.json +0 -2680
  142. package/lib/db/migrations/meta/0018_snapshot.json +0 -2686
  143. package/lib/db/migrations/meta/0019_snapshot.json +0 -2741
  144. package/lib/db/schema/projects.ts +0 -145
  145. package/lib/db/schema/user-profiles.ts +0 -31
  146. package/lib/validations/projects.ts +0 -49
  147. package/next-env.d.ts +0 -6
  148. package/playwright.config.ts +0 -44
  149. package/proxy.test.ts +0 -131
  150. package/proxy.ts +0 -116
  151. package/scripts/backup-db.sh +0 -57
  152. package/scripts/backup-db.ts +0 -24
  153. package/scripts/generate-openapi.ts +0 -22
  154. package/scripts/migration-helper.ts +0 -39
  155. package/scripts/pre-deploy.ts +0 -75
  156. package/scripts/restore-db.sh +0 -60
  157. package/scripts/rollback.ts +0 -72
  158. package/scripts/seed-tags.ts +0 -48
  159. package/tests/api/feedback-bulk.test.ts +0 -47
  160. package/tests/api/feedback-by-id.test.ts +0 -67
  161. package/tests/api/feedback-comments-route-import.test.ts +0 -26
  162. package/tests/api/feedback-create.test.ts +0 -71
  163. package/tests/api/feedback-delete.test.ts +0 -160
  164. package/tests/api/feedback-filter.test.ts +0 -250
  165. package/tests/api/feedback-list.test.ts +0 -234
  166. package/tests/api/feedback-route-assignee-condition.test.ts +0 -32
  167. package/tests/api/feedback-similar.test.ts +0 -46
  168. package/tests/api/feedback-sort.test.ts +0 -261
  169. package/tests/api/feedback-status-enum.test.ts +0 -49
  170. package/tests/api/feedback-status-filter.test.ts +0 -117
  171. package/tests/api/feedback-submit-on-behalf.test.ts +0 -269
  172. package/tests/api/feedback.test.ts +0 -175
  173. package/tests/api/identify-jwt.test.ts +0 -25
  174. package/tests/api/invitation-accept.test.ts +0 -213
  175. package/tests/api/organization-invitations.test.ts +0 -186
  176. package/tests/api/organization-members-list.test.ts +0 -79
  177. package/tests/api/organization-members.test.ts +0 -340
  178. package/tests/api/organizations.test.ts +0 -149
  179. package/tests/api/register.test.ts +0 -112
  180. package/tests/api/upload.test.ts +0 -103
  181. package/tests/api/vote.test.ts +0 -82
  182. package/tests/app/admin-feedback-detail-page.test.tsx +0 -25
  183. package/tests/app/admin-feedback-list-page.test.tsx +0 -25
  184. package/tests/app/admin-feedback-new-page.test.tsx +0 -25
  185. package/tests/app/health-route-helpers.test.ts +0 -27
  186. package/tests/app/login-page.test.ts +0 -26
  187. package/tests/app/portal-page.test.ts +0 -29
  188. package/tests/app/project-portal-overview.test.tsx +0 -25
  189. package/tests/app/widget-page-import.test.ts +0 -25
  190. package/tests/components/create-post-dialog-defaults.test.ts +0 -43
  191. package/tests/components/feedback/duplicate-suggestions-inline.test.tsx +0 -27
  192. package/tests/components/feedback/embedded-feedback-form.test.tsx +0 -96
  193. package/tests/components/feedback/feedback-detail.test.tsx +0 -25
  194. package/tests/components/feedback/feedback-stats.test.tsx +0 -49
  195. package/tests/components/feedback-bulk-actions.test.tsx +0 -39
  196. package/tests/components/feedback-i18n-keys.test.ts +0 -70
  197. package/tests/components/feedback-list-controls-compile.test.ts +0 -25
  198. package/tests/components/feedback-list-controls.test.tsx +0 -204
  199. package/tests/components/feedback-list-item.test.tsx +0 -67
  200. package/tests/components/landing/hero.test.tsx +0 -46
  201. package/tests/components/layout/language-switcher.test.tsx +0 -25
  202. package/tests/components/layout/sidebar.test.tsx +0 -157
  203. package/tests/components/login-form.test.ts +0 -25
  204. package/tests/components/organization-form.test.ts +0 -32
  205. package/tests/components/organization-switcher.test.ts +0 -25
  206. package/tests/components/pagination.test.tsx +0 -43
  207. package/tests/components/portal-overview.test.tsx +0 -25
  208. package/tests/components/profile-form.test.tsx +0 -139
  209. package/tests/components/role-selector.test.ts +0 -31
  210. package/tests/components/status-chart.test.tsx +0 -90
  211. package/tests/e2e/auth.e2e.ts +0 -323
  212. package/tests/e2e/feedback-actions.e2e.ts +0 -471
  213. package/tests/e2e/feedback-attachment.e2e.ts +0 -168
  214. package/tests/e2e/feedback-customer.e2e.ts +0 -226
  215. package/tests/e2e/feedback-management.e2e.ts +0 -565
  216. package/tests/e2e/feedback-submit.e2e.ts +0 -133
  217. package/tests/e2e/feedback-view.e2e.ts +0 -297
  218. package/tests/e2e/fixtures/test-data.ts +0 -235
  219. package/tests/e2e/health-check.e2e.ts +0 -230
  220. package/tests/e2e/helpers/test-utils-helpers.test.ts +0 -43
  221. package/tests/e2e/helpers/test-utils.ts +0 -298
  222. package/tests/e2e/integration-placeholders.e2e.ts +0 -199
  223. package/tests/e2e/organization.e2e.ts +0 -292
  224. package/tests/e2e/permissions.e2e.ts +0 -424
  225. package/tests/e2e/project-widget.e2e.ts +0 -63
  226. package/tests/feedback/filters.test.ts +0 -29
  227. package/tests/hooks/use-permissions.test.ts +0 -52
  228. package/tests/lib/ai/classifier.test.ts +0 -104
  229. package/tests/lib/ai/duplicate-detector.test.ts +0 -234
  230. package/tests/lib/attachments-schema.test.ts +0 -30
  231. package/tests/lib/auth/session.test.ts +0 -49
  232. package/tests/lib/auth-client.test.ts +0 -37
  233. package/tests/lib/auth-config.test.ts +0 -26
  234. package/tests/lib/feedback-prefill.test.ts +0 -52
  235. package/tests/lib/feedback-processor.test.ts +0 -41
  236. package/tests/lib/feedback-schema.test.ts +0 -33
  237. package/tests/lib/file-validator.test.ts +0 -48
  238. package/tests/lib/get-feedback-by-id.test.ts +0 -37
  239. package/tests/lib/invitations.test.ts +0 -35
  240. package/tests/lib/login-schema.test.ts +0 -36
  241. package/tests/lib/org-context.test.ts +0 -95
  242. package/tests/lib/organization-access.test.ts +0 -44
  243. package/tests/lib/organization-member-role-schema.test.ts +0 -41
  244. package/tests/lib/permissions.test.ts +0 -88
  245. package/tests/lib/portal-analytics.test.ts +0 -25
  246. package/tests/lib/portal-contributors.test.ts +0 -25
  247. package/tests/lib/portal-copy.test.ts +0 -27
  248. package/tests/lib/portal-i18n.test.ts +0 -30
  249. package/tests/lib/portal-leaderboard-settings.test.ts +0 -25
  250. package/tests/lib/portal-modules.test.ts +0 -25
  251. package/tests/lib/portal-seo.test.ts +0 -25
  252. package/tests/lib/portal-sharing.test.ts +0 -25
  253. package/tests/lib/portal-sorting.test.ts +0 -25
  254. package/tests/lib/portal-theme.test.ts +0 -25
  255. package/tests/lib/rate-limit.test.ts +0 -142
  256. package/tests/lib/resolve-locale.test.ts +0 -34
  257. package/tests/lib/services/backup.test.ts +0 -145
  258. package/tests/lib/user-organizations.test.ts +0 -42
  259. package/tests/lib/user-role-schema.test.ts +0 -33
  260. package/tests/lib/user-schema.test.ts +0 -25
  261. package/tests/setup.ts +0 -74
  262. package/vercel.json +0 -4
@@ -1,20 +0,0 @@
1
- /*
2
- * Copyright (c) 2026 Echo Team
3
- *
4
- * This program is free software: you can redistribute it and/or modify
5
- * it under the terms of the GNU Affero General Public License as published by
6
- * the Free Software Foundation, either version 3 of the License, or
7
- * (at your option) any later version.
8
- *
9
- * This program is distributed in the hope that it will be useful,
10
- * but WITHOUT ANY WARRANTY; without even the implied warranty of
11
- * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
12
- * GNU Affero General Public License for more details.
13
- *
14
- * You should have received a copy of the GNU Affero General Public License
15
- * along with this program. If not, see <https://www.gnu.org/licenses/>.
16
- */
17
-
18
- export function ProjectSwitcher() {
19
- return null;
20
- }
@@ -1,26 +0,0 @@
1
- # docker-compose.dev.yml
2
- version: "3.9"
3
-
4
- services:
5
- postgres:
6
- image: postgres:18-alpine
7
- container_name: echo-postgres-dev
8
- restart: unless-stopped
9
- environment:
10
- POSTGRES_USER: echo
11
- POSTGRES_PASSWORD: echo
12
- POSTGRES_DB: echo_dev
13
- volumes:
14
- - postgres_dev_data:/var/lib/postgresql/data
15
- - ./db/init:/docker-entrypoint-initdb.d
16
- ports:
17
- - "5433:5432"
18
- networks:
19
- - echo-dev-network
20
-
21
- volumes:
22
- postgres_dev_data:
23
-
24
- networks:
25
- echo-dev-network:
26
- driver: bridge
@@ -1,98 +0,0 @@
1
- version: "3.9"
2
-
3
- services:
4
- # PostgreSQL Database
5
- postgres:
6
- image: postgres:16-alpine
7
- container_name: echo-postgres
8
- restart: unless-stopped
9
- environment:
10
- POSTGRES_USER: ${POSTGRES_USER:-echo}
11
- POSTGRES_PASSWORD: ${POSTGRES_PASSWORD:-changeme}
12
- POSTGRES_DB: ${POSTGRES_DB:-echo}
13
- PGDATA: /var/lib/postgresql/data/pgdata
14
- volumes:
15
- - postgres_data:/var/lib/postgresql/data
16
- ports:
17
- - "${POSTGRES_PORT:-5432}:5432"
18
- healthcheck:
19
- test: ["CMD-SHELL", "pg_isready -U ${POSTGRES_USER:-echo} -d ${POSTGRES_DB:-echo}"]
20
- interval: 10s
21
- timeout: 5s
22
- retries: 5
23
- networks:
24
- - echo-network
25
-
26
- # Redis (optional - for caching/sessions in growth phase)
27
- redis:
28
- image: redis:7-alpine
29
- container_name: echo-redis
30
- restart: unless-stopped
31
- command: redis-server --requirepass ${REDIS_PASSWORD:-changeme}
32
- volumes:
33
- - redis_data:/data
34
- ports:
35
- - "${REDIS_PORT:-6379}:6379"
36
- healthcheck:
37
- test: ["CMD", "redis-cli", "--raw", "incr", "ping"]
38
- interval: 10s
39
- timeout: 5s
40
- retries: 5
41
- networks:
42
- - echo-network
43
- profiles:
44
- - with-redis
45
-
46
- # Next.js Application
47
- app:
48
- build:
49
- context: .
50
- dockerfile: Dockerfile
51
- container_name: echo-app
52
- restart: unless-stopped
53
- ports:
54
- - "${APP_PORT:-3000}:3000"
55
- environment:
56
- DATABASE_URL: postgresql://${POSTGRES_USER:-echo}:${POSTGRES_PASSWORD:-changeme}@postgres:5432/${POSTGRES_DB:-echo}
57
- REDIS_URL: redis://:${REDIS_PASSWORD:-changeme}@redis:6379
58
- NODE_ENV: production
59
- NEXT_PUBLIC_APP_URL: ${NEXT_PUBLIC_APP_URL:-http://localhost:3000}
60
- BETTER_AUTH_SECRET: ${BETTER_AUTH_SECRET}
61
- BETTER_AUTH_URL: ${BETTER_AUTH_URL:-http://localhost:3000}
62
- RESEND_API_KEY: ${RESEND_API_KEY}
63
- OPENAI_API_KEY: ${OPENAI_API_KEY}
64
- depends_on:
65
- postgres:
66
- condition: service_healthy
67
- healthcheck:
68
- test: ["CMD", "wget", "--no-verbose", "--tries=1", "--spider", "http://localhost:3000/api/health"]
69
- interval: 30s
70
- timeout: 10s
71
- retries: 3
72
- start_period: 40s
73
- networks:
74
- - echo-network
75
-
76
- # Migration service
77
- migrate:
78
- build: .
79
- command: ["bun", "run", "db:migrate"]
80
- environment:
81
- DATABASE_URL: postgresql://${POSTGRES_USER:-echo}:${POSTGRES_PASSWORD:-changeme}@postgres:5432/${POSTGRES_DB:-echo}
82
- depends_on:
83
- postgres:
84
- condition: service_healthy
85
- networks:
86
- - echo-network
87
- profiles:
88
- - migrate
89
-
90
- volumes:
91
- postgres_data:
92
- driver: local
93
- redis_data:
94
- driver: local
95
-
96
- networks:
97
- echo-network:
98
- driver: bridge
@@ -1,259 +0,0 @@
1
- # Architecture Documentation
2
-
3
- **Project:** Echo
4
- **Type:** Web Application (Next.js + React + TypeScript)
5
- **Generated:** 2025-12-31
6
-
7
- ## Executive Summary
8
-
9
- Echo 是一个基于 Next.js 16 和 React 19 的现代 Web 应用,使用 App Router 架构和 React Server Components。项目采用 TypeScript 严格模式,使用 Shadcn/ui 作为组件库,Tailwind CSS v4 进行样式管理。
10
-
11
- ## Technology Stack
12
-
13
- ### Core Framework
14
-
15
- | 技术 | 版本 | 用途 |
16
- |------|------|------|
17
- | **Next.js** | 16.1.1 | React 框架(App Router)|
18
- | **React** | 19.2.3 | UI 库(RSC enabled)|
19
- | **TypeScript** | 5.x | 类型系统(strict mode)|
20
-
21
- ### Styling
22
-
23
- | 技术 | 版本 | 用途 |
24
- |------|------|------|
25
- | **Tailwind CSS** | 4.x | 实用优先的 CSS 框架 |
26
- | **tw-animate-css** | 1.4.0 | 动画支持 |
27
-
28
- ### Component Library
29
-
30
- | 技术 | 版本 | 用途 |
31
- |------|------|------|
32
- | **Shadcn/ui** | 3.6.2 | 组件系统 |
33
- | **Radix UI** | 1.4.3 | 无障碍基础组件 |
34
- | **Base UI** | 1.0.0 | React 基础组件 |
35
- | **Lucide React** | 0.562.0 | 图标库 |
36
-
37
- ### Utilities
38
-
39
- | 技术 | 用途 |
40
- |------|------|
41
- | **clsx** | 条件类名 |
42
- | **tailwind-merge** | 合并 Tailwind 类名 |
43
- | **class-variance-authority** | 组件变体管理 |
44
-
45
- ## Architecture Pattern
46
-
47
- ### Next.js App Router
48
-
49
- 项目使用 Next.js 13+ 引入的 App Router 架构:
50
-
51
- ```
52
- app/
53
- ├── layout.tsx # 根布局(持久 UI)
54
- ├── page.tsx # 首页路由
55
- └── globals.css # 全局样式
56
- ```
57
-
58
- **特点:**
59
- - 基于文件系统的路由
60
- - 支持嵌套布局
61
- - React Server Components (RSC)
62
- - 流式渲染
63
- - 并行路由
64
-
65
- ### React Server Components
66
-
67
- | 特性 | 说明 |
68
- |------|------|
69
- | **默认服务器组件** | 减少客户端 JavaScript |
70
- | **选择性客户端组件** | 使用 'use client' 指令 |
71
- | **数据获取** | 在服务器组件中直接获取 |
72
-
73
- ### Component Architecture
74
-
75
- ```
76
- components/
77
- ├── ui/ # Shadcn/ui 基础组件(14 个)
78
- │ ├── alert-dialog.tsx
79
- │ ├── badge.tsx
80
- │ ├── button.tsx
81
- │ ├── card.tsx
82
- │ ├── combobox.tsx
83
- │ ├── dropdown-menu.tsx
84
- │ ├── field.tsx
85
- │ ├── input-group.tsx
86
- │ ├── input.tsx
87
- │ ├── label.tsx
88
- │ ├── select.tsx
89
- │ ├── separator.tsx
90
- │ └── textarea.tsx
91
- ├── component-example.tsx # 自定义组件
92
- └── example.tsx
93
- ```
94
-
95
- ## Data Architecture
96
-
97
- ### 当前状态
98
-
99
- **无数据层实现** - 项目目前是纯前端应用,没有:
100
-
101
- - ❌ 数据库连接
102
- - ❌ ORM/数据模型
103
- - ❌ API 集成
104
- - ❌ 状态管理
105
-
106
- ### 扩展点
107
-
108
- 当需要添加数据功能时:
109
-
110
- 1. **API 路由** - 在 `app/api/` 创建 RESTful 端点
111
- 2. **数据获取** - 在 Server Components 中获取
112
- 3. **状态管理** - 添加 React Context 或 Zustand
113
- 4. **数据库** - 集成 Prisma + PostgreSQL
114
-
115
- ## API Design
116
-
117
- ### 当前状态
118
-
119
- **无 API 实现** - 项目未定义 API 端点。
120
-
121
- ### 推荐扩展
122
-
123
- 在 `app/api/` 目录添加路由:
124
-
125
- ```
126
- app/api/
127
- ├── auth/
128
- │ └── route.ts # POST /api/auth
129
- ├── feedback/
130
- │ └── route.ts # POST /api/feedback
131
- └── users/
132
- └── route.ts # GET/POST /api/users
133
- ```
134
-
135
- ## Component Overview
136
-
137
- ### Shadcn/ui Components
138
-
139
- | 组件 | 用途 | 状态 |
140
- |------|------|------|
141
- | alert-dialog | 警告/确认对话框 | ✅ 已安装 |
142
- | badge | 徽章/标签 | ✅ 已安装 |
143
- | button | 按钮 | ✅ 已安装 |
144
- | card | 卡片容器 | ✅ 已安装 |
145
- | combobox | 组合输入框 | ✅ 已安装 |
146
- | dropdown-menu | 下拉菜单 | ✅ 已安装 |
147
- | field | 表单字段包装器 | ✅ 已安装 |
148
- | input-group | 输入组 | ✅ 已安装 |
149
- | input | 文本输入 | ✅ 已安装 |
150
- | label | 表单标签 | ✅ 已安装 |
151
- | select | 选择器 | ✅ 已安装 |
152
- | separator | 分隔线 | ✅ 已安装 |
153
- | textarea | 多行文本输入 | ✅ 已安装 |
154
-
155
- ### Custom Components
156
-
157
- | 组件 | 位置 | 状态 |
158
- |------|------|------|
159
- | ComponentExample | components/component-example.tsx | ✅ 示例 |
160
- | Example | components/example.tsx | ✅ 示例 |
161
-
162
- ## Source Tree
163
-
164
- 完整源代码树请参阅:[Source Tree Analysis](./source-tree-analysis.md)
165
-
166
- ## Development Workflow
167
-
168
- 开发流程请参阅:[Development Guide](./development-guide.md)
169
-
170
- ## Deployment Architecture
171
-
172
- ### 当前配置
173
-
174
- | 项目 | 状态 |
175
- |------|------|
176
- | **构建输出** | `.next/` 目录 |
177
- | **启动命令** | `bun start` |
178
- | **环境变量** | `.env.local` |
179
- | **Docker** | ❌ 未配置 |
180
- | **CI/CD** | ❌ 未配置 |
181
-
182
- ### 推荐部署
183
-
184
- - **Vercel** - Next.js 官方平台(零配置)
185
- - **Netlify** - 支持 Next.js
186
- - **自托管** - 使用 Docker 容器化
187
-
188
- ## Security Considerations
189
-
190
- ### 当前状态
191
-
192
- | 安全措施 | 状态 |
193
- |----------|------|
194
- | **环境变量** | `NEXT_PUBLIC_*` 前缀 |
195
- | **TypeScript** | Strict mode(类型安全)|
196
- | **ESLint** | 已配置 |
197
- | **认证/授权** | ❌ 未实现 |
198
- | **HTTPS** | 部署平台处理 |
199
-
200
- ### 推荐添加
201
-
202
- 1. **认证** - NextAuth.js 或 Clerk
203
- 2. **API 安全** - CSRF 保护、速率限制
204
- 3. **输入验证** - Zod schema 验证
205
- 4. **CORS** - API 路由配置
206
-
207
- ## Performance Considerations
208
-
209
- ### 优化措施
210
-
211
- | 优化 | 说明 |
212
- |------|------|
213
- | **Server Components** | 减少客户端 JavaScript |
214
- | **字体优化** | next/font (Geist, Inter) |
215
- | **图片优化** | next/image(未使用)|
216
- | **代码分割** | App Router 自动处理 |
217
-
218
- ### 推荐添加
219
-
220
- 1. **图片优化** - 使用 `next/image`
221
- 2. **动态导入** - `next/dynamic`
222
- 3. **缓存策略** - Next.js 缓存配置
223
- 4. **性能监控** - Vercel Analytics
224
-
225
- ## Testing Strategy
226
-
227
- ### 当前状态
228
-
229
- ❌ **无测试配置**
230
-
231
- ### 推荐添加
232
-
233
- 1. **单元测试** - Vitest + Testing Library
234
- 2. **组件测试** - Playwright 或 Cypress
235
- 3. **E2E 测试** - Playwright
236
- 4. **类型检查** - TypeScript + tsc
237
-
238
- ## Future Enhancements
239
-
240
- ### 短期(1-2 周)
241
-
242
- 1. 添加测试套件
243
- 2. 实现 API 路由
244
- 3. 添加状态管理
245
- 4. 配置 CI/CD
246
-
247
- ### 中期(1-2 月)
248
-
249
- 1. 数据库集成
250
- 2. 用户认证
251
- 3. 错误处理
252
- 4. 性能监控
253
-
254
- ### 长期(3+ 月)
255
-
256
- 1. 微服务架构(如需要)
257
- 2. 国际化 (i18n)
258
- 3. PWA 支持
259
- 4. 离线功能
@@ -1,261 +0,0 @@
1
- # Component Inventory
2
-
3
- **Project:** Echo
4
- **Generated:** 2025-12-31
5
-
6
- ## Overview
7
-
8
- 项目使用 **Shadcn/ui 3.6.2** 组件库,基于 Radix UI primitives 和 Base UI 构建。
9
-
10
- ## Design System Configuration
11
-
12
- | 配置 | 值 |
13
- |------|-----|
14
- | **样式变体** | radix-maia |
15
- | **基础颜色** | neutral |
16
- | **图标库** | lucide-react |
17
- | **RSC** | enabled |
18
- | **CSS 变量** | enabled |
19
-
20
- ## Shadcn/ui Components (14 个)
21
-
22
- ### Form Components
23
-
24
- | 组件 | 文件 | 描述 |
25
- |------|------|------|
26
- | **Input** | `input.tsx` | 单行文本输入 |
27
- | **Textarea** | `textarea.tsx` | 多行文本输入 |
28
- | **Label** | `label.tsx` | 表单标签 |
29
- | **Field** | `field.tsx` | 表单字段包装器 |
30
- | **Input Group** | `input-group.tsx` | 输入组容器 |
31
- | **Select** | `select.tsx` | 下拉选择器 |
32
- | **Combobox** | `combobox.tsx` | 组合输入/搜索 |
33
-
34
- ### Action Components
35
-
36
- | 组件 | 文件 | 描述 |
37
- |------|------|------|
38
- | **Button** | `button.tsx` | 按钮(多种变体)|
39
- | **Dropdown Menu** | `dropdown-menu.tsx` | 下拉菜单 |
40
- | **Alert Dialog** | `alert-dialog.tsx` | 警告/确认对话框 |
41
-
42
- ### Layout Components
43
-
44
- | 组件 | 文件 | 描述 |
45
- |------|------|------|
46
- | **Card** | `card.tsx` | 卡片容器 |
47
- | **Separator** | `separator.tsx` | 分隔线 |
48
-
49
- ### Display Components
50
-
51
- | 组件 | 文件 | 描述 |
52
- |------|------|------|
53
- | **Badge** | `badge.tsx` | 徽章/标签 |
54
-
55
- ## Component Usage
56
-
57
- ### Button
58
-
59
- ```tsx
60
- import { Button } from "@/components/ui/button";
61
-
62
- <Button variant="default">Click me</Button>
63
- <Button variant="outline">Outline</Button>
64
- <Button variant="ghost">Ghost</Button>
65
- ```
66
-
67
- ### Card
68
-
69
- ```tsx
70
- import { Card } from "@/components/ui/card";
71
-
72
- <Card>
73
- <CardHeader>
74
- <CardTitle>Title</CardTitle>
75
- </CardHeader>
76
- <CardContent>Content</CardContent>
77
- </Card>
78
- ```
79
-
80
- ### Input
81
-
82
- ```tsx
83
- import { Input } from "@/components/ui/input";
84
-
85
- <Input type="text" placeholder="Enter text..." />
86
- ```
87
-
88
- ## Custom Components
89
-
90
- | 组件 | 文件 | 描述 | 状态 |
91
- |------|------|------|------|
92
- | **ComponentExample** | `component-example.tsx` | 示例组件 | ✅ |
93
- | **Example** | `example.tsx` | 简单示例 | ✅ |
94
-
95
- ## Reusable Patterns
96
-
97
- ### cn() Utility
98
-
99
- 合并 Tailwind 类名:
100
-
101
- ```tsx
102
- import { cn } from "@/lib/utils";
103
-
104
- className={cn(
105
- "base-class",
106
- condition && "conditional-class",
107
- "another-class"
108
- )}
109
- ```
110
-
111
- ### Component Variants
112
-
113
- 使用 `class-variance-authority` 管理变体:
114
-
115
- ```tsx
116
- const buttonVariants = cva(
117
- "base-classes",
118
- {
119
- variants: {
120
- variant: {
121
- default: "default-classes",
122
- outline: "outline-classes",
123
- },
124
- },
125
- }
126
- );
127
- ```
128
-
129
- ## Component Organization
130
-
131
- ```
132
- components/
133
- ├── ui/ # Shadcn/ui 基础组件(不要直接修改)
134
- │ ├── alert-dialog.tsx
135
- │ ├── badge.tsx
136
- │ ├── button.tsx
137
- │ ├── card.tsx
138
- │ ├── combobox.tsx
139
- │ ├── dropdown-menu.tsx
140
- │ ├── field.tsx
141
- │ ├── input-group.tsx
142
- │ ├── input.tsx
143
- │ ├── label.tsx
144
- │ ├── select.tsx
145
- │ ├── separator.tsx
146
- │ └── textarea.tsx
147
- ├── component-example.tsx # 自定义组件
148
- └── example.tsx
149
- ```
150
-
151
- ## Adding New Components
152
-
153
- ### Option 1: Add Shadcn/ui Component
154
-
155
- 使用 Shadcn CLI 添加新组件:
156
-
157
- ```bash
158
- npx shadcn@latest add [component-name]
159
- ```
160
-
161
- 例如:
162
- ```bash
163
- npx shadcn@latest add dialog
164
- npx shadcn@latest add tooltip
165
- npx shadcn@latest add switch
166
- ```
167
-
168
- ### Option 2: Create Custom Component
169
-
170
- 1. 在 `components/` 创建新文件
171
- 2. 使用 Shadcn/ui 组件作为基础
172
- 3. 应用项目样式变体
173
-
174
- ```tsx
175
- // components/my-feature.tsx
176
- import { Button } from "@/components/ui/button";
177
- import { Card } from "@/components/ui/card";
178
-
179
- export function MyFeature() {
180
- return (
181
- <Card>
182
- <CardHeader>
183
- <CardTitle>My Feature</CardTitle>
184
- </CardHeader>
185
- <CardContent>
186
- <Button>Action</Button>
187
- </CardContent>
188
- </Card>
189
- );
190
- }
191
- ```
192
-
193
- ## Styling Conventions
194
-
195
- ### Tailwind Integration
196
-
197
- 所有组件使用 Tailwind CSS 实用类:
198
-
199
- ```tsx
200
- className="flex items-center justify-between p-4 rounded-lg"
201
- ```
202
-
203
- ### Theme Variables
204
-
205
- 使用 CSS 自定义属性:
206
-
207
- ```tsx
208
- className="bg-primary text-primary-foreground"
209
- ```
210
-
211
- 可用变量:
212
- - `background`, `foreground`
213
- - `primary`, `primary-foreground`
214
- - `secondary`, `secondary-foreground`
215
- - `accent`, `accent-foreground`
216
- - `muted`, `muted-foreground`
217
- - `card`, `card-foreground`
218
- - `popover`, `popover-foreground`
219
- - `border`, `input`, `ring`
220
-
221
- ## Icon Usage
222
-
223
- 使用 Lucide React 图标:
224
-
225
- ```tsx
226
- import { ChevronLeft, Search, User } from "lucide-react";
227
-
228
- <ChevronLeft className="h-4 w-4" />
229
- <Search className="h-5 w-5" />
230
- <User className="h-6 w-6" />
231
- ```
232
-
233
- ## Component Best Practices
234
-
235
- 1. **优先使用 Shadcn/ui 组件** - 避免重复造轮
236
- 2. **直接修改 ui/ 组件** - 项目采用直接修改方式,不是重新安装
237
- 3. **使用 cn() 合并类名** - 保持类名可预测
238
- 4. **遵循命名约定** - PascalCase 用于组件
239
- 5. **保持组件小而专注** - 单一职责原则
240
-
241
- ## Missing Components
242
-
243
- 以下常用组件未安装,可以根据需要添加:
244
-
245
- - dialog(对话框)
246
- - tooltip(工具提示)
247
- - toast(通知)
248
- - switch(开关)
249
- - checkbox(复选框)
250
- - radio(单选框)
251
- - tabs(选项卡)
252
- - table(表格)
253
- - avatar(头像)
254
- - progress(进度条)
255
- - slider(滑块)
256
- - calendar(日历)
257
-
258
- 要添加这些组件,运行:
259
- ```bash
260
- npx shadcn@latest add [component-name]
261
- ```