Skip to content

Commit 9711222

Browse files
authored
feat: add contributors page (#75)
1 parent fcde659 commit 9711222

File tree

8 files changed

+215
-77
lines changed

8 files changed

+215
-77
lines changed

README.md

Lines changed: 0 additions & 45 deletions
Original file line numberDiff line numberDiff line change
@@ -31,51 +31,6 @@
3131

3232
Explore the API documentation at [http://127.0.0.1:8000/docs](http://127.0.0.1:8000/docs).
3333

34-
## Frontend (`/frontend`)
35-
36-
```plaintext
37-
frontend/
38-
├── public/ # Static assets and translations (i18n)
39-
├── src/
40-
│ ├── assets/ # Images, SVGs, and static media
41-
│ ├── client/ # Generated API client (OpenAPI)
42-
│ ├── components/ # Reusable UI components (cards, collections, stats, etc.)
43-
│ ├── db/ # IndexedDB (Dexie.js) setup for offline/guest mode
44-
│ ├── data/localDB/ # Local DB logic for guest/offline mode (CRUD, stats, etc.)
45-
│ ├── hooks/ # Custom React hooks (auth, data fetching, etc.)
46-
│ ├── repositories/ # Data access layer (API/local switch for cards, collections, stats)
47-
│ ├── routes/ # Application routes (pages, layouts)
48-
│ ├── services/ # Business logic for cards, collections, practice, stats
49-
│ ├── utils/ # Utility functions (auth, stats, etc.)
50-
│ └── main.tsx # App entry point
51-
├── package.json # Frontend dependencies and scripts
52-
├── pnpm-lock.yaml # Lockfile for reproducible installs
53-
├── tsconfig*.json # TypeScript configuration
54-
├── vite.config.ts # Vite build configuration
55-
└── index.html # Main HTML template
56-
```
57-
58-
## Backend (`/backend`)
59-
60-
```plaintext
61-
backend/
62-
├── src/
63-
│ ├── api/ # FastAPI route definitions
64-
│ ├── core/ # Core logic (auth, config, security)
65-
│ ├── db/ # Database models and access (SQLAlchemy)
66-
│ ├── schemas/ # Pydantic models (request/response)
67-
│ ├── services/ # Business logic (users, flashcards, etc.)
68-
│ └── main.py # FastAPI app entry point
69-
├── tests/ # Backend tests (pytest)
70-
├── pyproject.toml # Python dependencies and project config
71-
├── uv.lock # Poetry/uv lockfile for reproducible installs
72-
├── Dockerfile # Production Docker build
73-
├── Dockerfile.pip # Alternative Docker build (pip)
74-
├── entrypoint.sh # Docker entrypoint script
75-
├── prestart.sh # Pre-start script (migrations, etc.)
76-
└── alembic.ini # Alembic DB migration config
77-
```
78-
7934
## Setup Instructions
8035

8136
### Backend Setup

frontend/public/locales/en/translation.json

Lines changed: 6 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -177,7 +177,7 @@
177177
"publicLayout": {
178178
"index": {
179179
"title": "Learn Better with FlashNotes",
180-
"description": "A simple flashcard app that helps you learn. Create cards,practice regularly, and remember what matters.",
180+
"description": "Capture your ideas, turn them into flashcards, and practice often so you can remember more!",
181181
"offlineMode": "Offline Mode",
182182
"offlineModeDescription": "Use FlashNotes anywhere, even without an internet connection. Guest mode and all your data work fully offline!",
183183
"aiGeneration": "AI Generation",
@@ -190,6 +190,11 @@
190190
},
191191
"signUp": {
192192
"alreadyHaveAccount": "Already have an account?"
193+
},
194+
"thanks": {
195+
"title": "Thank You to All Contributors!",
196+
"description": "This project would not be possible without the amazing work and support of our contributors.",
197+
"link": "Thanks to all contributors"
193198
}
194199
}
195200
}

frontend/public/locales/es/translation.json

Lines changed: 6 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -177,7 +177,7 @@
177177
"publicLayout": {
178178
"index": {
179179
"title": "Aprende Mejor con FlashNotes",
180-
"description": "Una aplicación de tarjetas de memoria simple que te ayuda a aprender. Crea tarjetas, practica regularmente y recuerda lo que importa.",
180+
"description": "Captura tus ideas, conviértelas en tarjetas de memoria y practica a menudo para recordar más!",
181181
"offlineMode": "Modo sin conexión",
182182
"offlineModeDescription": "Usa FlashNotes en cualquier lugar, incluso sin conexión a internet. ¡El modo invitado y todos tus datos funcionan completamente sin conexión!",
183183
"aiGeneration": "Generación con IA",
@@ -190,6 +190,11 @@
190190
},
191191
"signUp": {
192192
"alreadyHaveAccount": "¿Ya tienes una cuenta?"
193+
},
194+
"thanks": {
195+
"title": "¡Gracias a todos los colaboradores!",
196+
"description": "Este proyecto no sería posible sin el increíble trabajo y apoyo de nuestros colaboradores.",
197+
"link": "Gracias a todos los colaboradores"
193198
}
194199
}
195200
}

frontend/public/locales/nl/translation.json

Lines changed: 6 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -177,7 +177,7 @@
177177
"publicLayout": {
178178
"index": {
179179
"title": "Beter Leren met FlashNotes",
180-
"description": "Een eenvoudige flashcard-app die je helpt te leren. Maak kaarten, oefen regelmatig en onthoud wat belangrijk is.",
180+
"description": "Leg je ideeën vast, maak er flashcards van en oefen vaak zodat je meer onthoudt!",
181181
"offlineMode": "Offline Modus",
182182
"offlineModeDescription": "Gebruik FlashNotes overal, zelfs zonder internetverbinding. Gastmodus en al je gegevens werken volledig offline!",
183183
"aiGeneration": "AI Generatie",
@@ -190,6 +190,11 @@
190190
},
191191
"signUp": {
192192
"alreadyHaveAccount": "Heb je al een account?"
193+
},
194+
"thanks": {
195+
"title": "Dank aan alle bijdragers!",
196+
"description": "Dit project zou niet mogelijk zijn zonder het geweldige werk en de steun van onze bijdragers.",
197+
"link": "Dank aan alle bijdragers"
193198
}
194199
}
195200
}
Lines changed: 50 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,50 @@
1+
[
2+
{
3+
"login": "jose-fernandez",
4+
"name": "Jose Fernandez",
5+
"avatar_url": "https://avatars.githubusercontent.com/u/22930011?v=4",
6+
"profile": "https://github.com/jose-fernandez"
7+
},
8+
{
9+
"login": "ryanli",
10+
"name": "Ryan Li",
11+
"avatar_url": "https://avatars.githubusercontent.com/u/148289?v=4",
12+
"profile": "https://github.com/ryanli"
13+
},
14+
{
15+
"login": "VictoriaTskhondia",
16+
"name": "VictoriaTskhondia",
17+
"avatar_url": "https://avatars.githubusercontent.com/u/48713882?v=4",
18+
"profile": "https://github.com/VictoriaTskhondia"
19+
},
20+
{
21+
"login": "sebampuero",
22+
"name": "Sebastian",
23+
"avatar_url": "https://avatars.githubusercontent.com/u/20564582?v=4",
24+
"profile": "https://sebampuerom.de/"
25+
},
26+
{
27+
"login": "mohsenkhosroanjam",
28+
"name": "Mohsen Khosroanjam",
29+
"avatar_url": "https://avatars.githubusercontent.com/u/60619215?v=4",
30+
"profile": "https://github.com/mohsenkhosroanjam"
31+
},
32+
{
33+
"login": "muhammedsirajudeen",
34+
"name": "MuhammedSirajudeen ",
35+
"avatar_url": "https://avatars.githubusercontent.com/u/43089951?v=4",
36+
"profile": "https://github.com/muhammedsirajudeen"
37+
},
38+
{
39+
"login": "sonegs",
40+
"name": "Miguel Cobo",
41+
"avatar_url": "https://avatars.githubusercontent.com/u/47485321?v=4",
42+
"profile": "https://github.com/sonegs"
43+
},
44+
{
45+
"login": "jcmc0011",
46+
"name": "jcmc0011",
47+
"avatar_url": "https://avatars.githubusercontent.com/u/11525905?v=4",
48+
"profile": "https://github.com/jcmc0011"
49+
}
50+
]
Lines changed: 36 additions & 29 deletions
Original file line numberDiff line numberDiff line change
@@ -1,4 +1,5 @@
11
import { Stack, Text } from '@chakra-ui/react'
2+
import { Link } from '@tanstack/react-router'
23
import { useTranslation } from 'react-i18next'
34
import { ImGithub } from 'react-icons/im'
45

@@ -15,36 +16,42 @@ export function Footer({
1516
}: FooterProps) {
1617
const { t } = useTranslation()
1718
return (
18-
<Stack
19-
direction={{ base: 'column', md: 'row' }}
20-
justify="center"
21-
align="center"
22-
gap={4}
23-
mt={16}
24-
pb={8}
25-
color="gray.500"
26-
fontSize="sm"
27-
>
28-
<a
29-
href={githubUrl}
30-
target="_blank"
31-
rel="noopener noreferrer"
32-
style={{ textDecoration: 'none', color: 'inherit' }}
19+
<>
20+
<Stack
21+
direction={{ base: 'column', md: 'row' }}
22+
justify="center"
23+
align="center"
24+
gap={4}
25+
mt={16}
26+
pb={8}
27+
color="gray.500"
28+
fontSize="sm"
3329
>
34-
<Stack direction="row" align="center" gap={2}>
35-
<ImGithub />
36-
37-
<Text>{t('general.words.github')}</Text>
38-
</Stack>
39-
</a>
40-
<Text></Text>
41-
<Text color="gray.500">
42-
{t('general.words.version')} {version}
43-
</Text>
44-
<Text></Text>
45-
<Text>
46-
© {copyrightYear} {t('general.words.flashNotes')}
30+
<a
31+
href={githubUrl}
32+
target="_blank"
33+
rel="noopener noreferrer"
34+
style={{ textDecoration: 'none', color: 'inherit' }}
35+
>
36+
<Stack direction="row" align="center" gap={2}>
37+
<ImGithub />
38+
<Text>{t('general.words.github')}</Text>
39+
</Stack>
40+
</a>
41+
<Text></Text>
42+
<Text color="gray.500">
43+
{t('general.words.version')} {version}
44+
</Text>
45+
<Text></Text>
46+
<Text>
47+
© {copyrightYear} {t('general.words.flashNotes')}
48+
</Text>
49+
</Stack>
50+
<Text mt={2} fontSize="sm" color="gray.400" textAlign="center">
51+
<Link to="/thanks">
52+
{t('routes.publicLayout.thanks.link', 'Thanks to all contributors')}
53+
</Link>
4754
</Text>
48-
</Stack>
55+
</>
4956
)
5057
}

frontend/src/routeTree.gen.ts

Lines changed: 27 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -14,6 +14,7 @@ import { Route as rootRoute } from './routes/__root'
1414
import { Route as PublicLayoutImport } from './routes/_publicLayout'
1515
import { Route as LayoutImport } from './routes/_layout'
1616
import { Route as PublicLayoutIndexImport } from './routes/_publicLayout/index'
17+
import { Route as PublicLayoutThanksImport } from './routes/_publicLayout/thanks'
1718
import { Route as PublicLayoutSignupImport } from './routes/_publicLayout/signup'
1819
import { Route as PublicLayoutLoginImport } from './routes/_publicLayout/login'
1920
import { Route as LayoutCollectionsIndexImport } from './routes/_layout/collections/index'
@@ -41,6 +42,12 @@ const PublicLayoutIndexRoute = PublicLayoutIndexImport.update({
4142
getParentRoute: () => PublicLayoutRoute,
4243
} as any)
4344

45+
const PublicLayoutThanksRoute = PublicLayoutThanksImport.update({
46+
id: '/thanks',
47+
path: '/thanks',
48+
getParentRoute: () => PublicLayoutRoute,
49+
} as any)
50+
4451
const PublicLayoutSignupRoute = PublicLayoutSignupImport.update({
4552
id: '/signup',
4653
path: '/signup',
@@ -126,6 +133,13 @@ declare module '@tanstack/react-router' {
126133
preLoaderRoute: typeof PublicLayoutSignupImport
127134
parentRoute: typeof PublicLayoutImport
128135
}
136+
'/_publicLayout/thanks': {
137+
id: '/_publicLayout/thanks'
138+
path: '/thanks'
139+
fullPath: '/thanks'
140+
preLoaderRoute: typeof PublicLayoutThanksImport
141+
parentRoute: typeof PublicLayoutImport
142+
}
129143
'/_publicLayout/': {
130144
id: '/_publicLayout/'
131145
path: '/'
@@ -209,12 +223,14 @@ const LayoutRouteWithChildren =
209223
interface PublicLayoutRouteChildren {
210224
PublicLayoutLoginRoute: typeof PublicLayoutLoginRoute
211225
PublicLayoutSignupRoute: typeof PublicLayoutSignupRoute
226+
PublicLayoutThanksRoute: typeof PublicLayoutThanksRoute
212227
PublicLayoutIndexRoute: typeof PublicLayoutIndexRoute
213228
}
214229

215230
const PublicLayoutRouteChildren: PublicLayoutRouteChildren = {
216231
PublicLayoutLoginRoute: PublicLayoutLoginRoute,
217232
PublicLayoutSignupRoute: PublicLayoutSignupRoute,
233+
PublicLayoutThanksRoute: PublicLayoutThanksRoute,
218234
PublicLayoutIndexRoute: PublicLayoutIndexRoute,
219235
}
220236

@@ -226,6 +242,7 @@ export interface FileRoutesByFullPath {
226242
'': typeof PublicLayoutRouteWithChildren
227243
'/login': typeof PublicLayoutLoginRoute
228244
'/signup': typeof PublicLayoutSignupRoute
245+
'/thanks': typeof PublicLayoutThanksRoute
229246
'/': typeof PublicLayoutIndexRoute
230247
'/collections': typeof LayoutCollectionsIndexRoute
231248
'/collections/$collectionId/practice': typeof LayoutCollectionsCollectionIdPracticeRoute
@@ -239,6 +256,7 @@ export interface FileRoutesByTo {
239256
'': typeof LayoutRouteWithChildren
240257
'/login': typeof PublicLayoutLoginRoute
241258
'/signup': typeof PublicLayoutSignupRoute
259+
'/thanks': typeof PublicLayoutThanksRoute
242260
'/': typeof PublicLayoutIndexRoute
243261
'/collections': typeof LayoutCollectionsIndexRoute
244262
'/collections/$collectionId/practice': typeof LayoutCollectionsCollectionIdPracticeRoute
@@ -254,6 +272,7 @@ export interface FileRoutesById {
254272
'/_publicLayout': typeof PublicLayoutRouteWithChildren
255273
'/_publicLayout/login': typeof PublicLayoutLoginRoute
256274
'/_publicLayout/signup': typeof PublicLayoutSignupRoute
275+
'/_publicLayout/thanks': typeof PublicLayoutThanksRoute
257276
'/_publicLayout/': typeof PublicLayoutIndexRoute
258277
'/_layout/collections/': typeof LayoutCollectionsIndexRoute
259278
'/_layout/collections/$collectionId/practice': typeof LayoutCollectionsCollectionIdPracticeRoute
@@ -269,6 +288,7 @@ export interface FileRouteTypes {
269288
| ''
270289
| '/login'
271290
| '/signup'
291+
| '/thanks'
272292
| '/'
273293
| '/collections'
274294
| '/collections/$collectionId/practice'
@@ -281,6 +301,7 @@ export interface FileRouteTypes {
281301
| ''
282302
| '/login'
283303
| '/signup'
304+
| '/thanks'
284305
| '/'
285306
| '/collections'
286307
| '/collections/$collectionId/practice'
@@ -294,6 +315,7 @@ export interface FileRouteTypes {
294315
| '/_publicLayout'
295316
| '/_publicLayout/login'
296317
| '/_publicLayout/signup'
318+
| '/_publicLayout/thanks'
297319
| '/_publicLayout/'
298320
| '/_layout/collections/'
299321
| '/_layout/collections/$collectionId/practice'
@@ -344,6 +366,7 @@ export const routeTree = rootRoute
344366
"children": [
345367
"/_publicLayout/login",
346368
"/_publicLayout/signup",
369+
"/_publicLayout/thanks",
347370
"/_publicLayout/"
348371
]
349372
},
@@ -355,6 +378,10 @@ export const routeTree = rootRoute
355378
"filePath": "_publicLayout/signup.tsx",
356379
"parent": "/_publicLayout"
357380
},
381+
"/_publicLayout/thanks": {
382+
"filePath": "_publicLayout/thanks.tsx",
383+
"parent": "/_publicLayout"
384+
},
358385
"/_publicLayout/": {
359386
"filePath": "_publicLayout/index.tsx",
360387
"parent": "/_publicLayout"

0 commit comments

Comments
 (0)