Compare commits

..

18 Commits

Author SHA1 Message Date
latest-changes[bot] aabb901269 📝 Update release notes
[skip ci]
2026-11-03 13:46:49 +00:00
dependabot[bot] 42e7ed7df3 ⬆ Bump the npm-packages group across 1 directory with 30 updates (#2525)
Signed-off-by: dependabot[bot] <support@github.com>
Co-authored-by: dependabot[bot] <49699333+dependabot[bot]@users.noreply.github.com>
Co-authored-by: Yurii Motov <yurii.motov.monte@gmail.com>
Co-authored-by: pr-push[bot] <pr-push[bot]@users.noreply.github.com>
2026-11-03 14:46:45 +01:00
latest-changes[bot] 9c81b46ff7 📝 Update release notes
[skip ci]
2026-11-03 11:19:51 +00:00
dependabot[bot] 58570c6353 ⬆ Bump playwright from v1.63.0-noble to v1.64.1-noble in /frontend in the docker group across 1 directory (#2521)
Signed-off-by: dependabot[bot] <support@github.com>
Co-authored-by: dependabot[bot] <49699333+dependabot[bot]@users.noreply.github.com>
Co-authored-by: Yurii Motov <yurii.motov.monte@gmail.com>
2026-11-03 12:19:47 +01:00
latest-changes[bot] 0a6ec28757 📝 Update release notes
[skip ci]
2026-11-03 11:04:00 +00:00
dependabot[bot] df6f7a501c ⬆ Bump the github-actions group with 6 updates (#2520)
Signed-off-by: dependabot[bot] <support@github.com>
Co-authored-by: dependabot[bot] <49699333+dependabot[bot]@users.noreply.github.com>
2026-11-03 12:03:55 +01:00
latest-changes[bot] 85579cd465 📝 Update release notes
[skip ci]
2026-11-03 11:00:41 +00:00
pr-submit[bot] 2fae9be8f5 ⬆ Bump pre-commit hooks (#2523)
Co-authored-by: pr-submit[bot] <pr-submit[bot]@users.noreply.github.com>
2026-11-03 12:00:37 +01:00
latest-changes[bot] c1c1b204b0 📝 Update release notes
[skip ci]
2026-11-03 10:59:19 +00:00
dependabot[bot] 27a82c4c1c ⬆ Bump dnspython from 2.8.0 to 2.9.0 (#2524)
Signed-off-by: dependabot[bot] <support@github.com>
Co-authored-by: dependabot[bot] <49699333+dependabot[bot]@users.noreply.github.com>
2026-11-03 11:59:16 +01:00
latest-changes[bot] f4bcfaba7c 📝 Update release notes
[skip ci]
2026-10-26 10:47:35 +00:00
dependabot[bot] 0a351e3629 ⬆ Bump certifi from 2026.6.17 to 2026.10.19 (#2518)
Signed-off-by: dependabot[bot] <support@github.com>
Co-authored-by: dependabot[bot] <49699333+dependabot[bot]@users.noreply.github.com>
2026-10-26 11:47:31 +01:00
latest-changes[bot] b1125d8839 📝 Update release notes
[skip ci]
2026-10-15 16:04:31 +00:00
Sebastián Ramírez 99e9ec1ec1 🎨 Enable Ruff formatting for Python in Markdown (#2517) 2026-10-15 18:04:28 +02:00
latest-changes[bot] 7257e606cb 📝 Update release notes
[skip ci]
2026-10-08 15:50:29 +00:00
Yurii Motov 0007f609ec ⬆️ Migrate @tanstack/react-table to 9.x (#2509) 2026-10-08 17:50:25 +02:00
latest-changes[bot] f27b472150 📝 Update release notes
[skip ci]
2026-10-07 07:55:25 +00:00
dependabot[bot] 96d9db1272 ⬆ Bump the npm-packages group across 1 directory with 25 updates (#2506)
Signed-off-by: dependabot[bot] <support@github.com>
Co-authored-by: dependabot[bot] <49699333+dependabot[bot]@users.noreply.github.com>
Co-authored-by: Yurii Motov <yurii.motov.monte@gmail.com>
2026-10-07 09:55:21 +02:00
24 changed files with 554 additions and 409 deletions
+2 -2
View File
@@ -24,11 +24,11 @@ jobs:
with: with:
persist-credentials: false persist-credentials: false
- name: Set up Python - name: Set up Python
uses: actions/setup-python@5fda3b95a4ea91299a34e894583c3862153e4b97 # v7.0.0 uses: actions/setup-python@6d4fd22b20465ccc0f7354476588e8df7c9ca0e0 # v7.1.0
with: with:
python-version-file: ".python-version" python-version-file: ".python-version"
- name: Setup uv - name: Setup uv
uses: astral-sh/setup-uv@c18668ad3cf93ea998bef934396af7bb5c839dc7 # v10.2.0 uses: astral-sh/setup-uv@07a047e608db84b3d8c06cd9a7c7dcc9c355c18e # v10.3.2
with: with:
version: "latest-known" version: "latest-known"
cache-dependency-glob: | cache-dependency-glob: |
+2 -2
View File
@@ -25,11 +25,11 @@ jobs:
ref: ${{ github.event.repository.default_branch }} ref: ${{ github.event.repository.default_branch }}
persist-credentials: false persist-credentials: false
- name: Set up Python - name: Set up Python
uses: actions/setup-python@5fda3b95a4ea91299a34e894583c3862153e4b97 # v7.0.0 uses: actions/setup-python@6d4fd22b20465ccc0f7354476588e8df7c9ca0e0 # v7.1.0
with: with:
python-version-file: ".python-version" python-version-file: ".python-version"
- name: Install uv - name: Install uv
uses: astral-sh/setup-uv@c18668ad3cf93ea998bef934396af7bb5c839dc7 # v10.2.0 uses: astral-sh/setup-uv@07a047e608db84b3d8c06cd9a7c7dcc9c355c18e # v10.3.2
with: with:
version: "latest-known" version: "latest-known"
- name: Extract release details - name: Extract release details
+1 -1
View File
@@ -35,7 +35,7 @@ jobs:
# Override frontend/.env so the deployed frontend uses the same origin as the API # Override frontend/.env so the deployed frontend uses the same origin as the API
VITE_API_URL: "" VITE_API_URL: ""
- name: Set up uv - name: Set up uv
uses: astral-sh/setup-uv@c18668ad3cf93ea998bef934396af7bb5c839dc7 # v10.2.0 uses: astral-sh/setup-uv@07a047e608db84b3d8c06cd9a7c7dcc9c355c18e # v10.3.2
with: with:
version: "latest-known" version: "latest-known"
- name: Prepare database - name: Prepare database
+5 -5
View File
@@ -57,7 +57,7 @@ jobs:
- uses: oven-sh/setup-bun@0c5077e51419868618aeaa5fe8019c62421857d6 # v2.2.0 - uses: oven-sh/setup-bun@0c5077e51419868618aeaa5fe8019c62421857d6 # v2.2.0
with: with:
bun-version: 1.3.12 bun-version: 1.3.12
- uses: actions/setup-python@5fda3b95a4ea91299a34e894583c3862153e4b97 # v7.0.0 - uses: actions/setup-python@6d4fd22b20465ccc0f7354476588e8df7c9ca0e0 # v7.1.0
with: with:
python-version-file: .python-version python-version-file: .python-version
- name: Setup tmate session - name: Setup tmate session
@@ -66,7 +66,7 @@ jobs:
with: with:
limit-access-to-actor: true limit-access-to-actor: true
- name: Install uv - name: Install uv
uses: astral-sh/setup-uv@c18668ad3cf93ea998bef934396af7bb5c839dc7 # v10.2.0 uses: astral-sh/setup-uv@07a047e608db84b3d8c06cd9a7c7dcc9c355c18e # v10.3.2
with: with:
version: "latest-known" version: "latest-known"
- run: uv sync - run: uv sync
@@ -82,7 +82,7 @@ jobs:
- run: docker compose down -v --remove-orphans - run: docker compose down -v --remove-orphans
- name: Upload blob report to GitHub Actions Artifacts - name: Upload blob report to GitHub Actions Artifacts
if: ${{ !cancelled() }} if: ${{ !cancelled() }}
uses: actions/upload-artifact@043fb46d1a93c77aae656e7c1c64a875d1fc6a0a # v7.0.1 uses: actions/upload-artifact@cf430e030ddbb5b0abf93d22962f4752f3646cd9 # v7.0.2
with: with:
name: blob-report-${{ matrix.shardIndex }} name: blob-report-${{ matrix.shardIndex }}
path: frontend/blob-report path: frontend/blob-report
@@ -107,7 +107,7 @@ jobs:
- name: Install dependencies - name: Install dependencies
run: bun ci run: bun ci
- name: Download blob reports from GitHub Actions Artifacts - name: Download blob reports from GitHub Actions Artifacts
uses: actions/download-artifact@3e5f45b2cfb9172054b4087a40e8e0b5a5461e7c # v8.0.1 uses: actions/download-artifact@9000827ccba6bdab643e8b6fd33ac0654aef8333 # v8.0.2
with: with:
path: frontend/all-blob-reports path: frontend/all-blob-reports
pattern: blob-report-* pattern: blob-report-*
@@ -116,7 +116,7 @@ jobs:
run: bunx playwright merge-reports --reporter html ./all-blob-reports run: bunx playwright merge-reports --reporter html ./all-blob-reports
working-directory: frontend working-directory: frontend
- name: Upload HTML report - name: Upload HTML report
uses: actions/upload-artifact@043fb46d1a93c77aae656e7c1c64a875d1fc6a0a # v7.0.1 uses: actions/upload-artifact@cf430e030ddbb5b0abf93d22962f4752f3646cd9 # v7.0.2
with: with:
name: html-report--attempt-${{ github.run_attempt }} name: html-report--attempt-${{ github.run_attempt }}
path: frontend/playwright-report path: frontend/playwright-report
+3 -3
View File
@@ -42,11 +42,11 @@ jobs:
with: with:
bun-version: 1.3.12 bun-version: 1.3.12
- name: Set up Python - name: Set up Python
uses: actions/setup-python@5fda3b95a4ea91299a34e894583c3862153e4b97 # v7.0.0 uses: actions/setup-python@6d4fd22b20465ccc0f7354476588e8df7c9ca0e0 # v7.1.0
with: with:
python-version-file: .python-version python-version-file: .python-version
- name: Setup uv - name: Setup uv
uses: astral-sh/setup-uv@c18668ad3cf93ea998bef934396af7bb5c839dc7 # v10.2.0 uses: astral-sh/setup-uv@07a047e608db84b3d8c06cd9a7c7dcc9c355c18e # v10.3.2
with: with:
version: "latest-known" version: "latest-known"
cache-dependency-glob: | cache-dependency-glob: |
@@ -88,7 +88,7 @@ jobs:
git commit -m "🎨 Auto format and update with pre-commit" git commit -m "🎨 Auto format and update with pre-commit"
git push git push
fi fi
- uses: pre-commit-ci/lite-action@5d6cc0eb514c891a40562a58a8e71576c5c7fb43 # v1.1.0 - uses: pre-commit-ci/lite-action@062bca0919bc9d6e66755cc05074b70c77e111fc # v1.2.0
if: env.CAN_PUSH == 'false' if: env.CAN_PUSH == 'false'
with: with:
msg: 🎨 Auto format and update with pre-commit msg: 🎨 Auto format and update with pre-commit
+2 -2
View File
@@ -34,11 +34,11 @@ jobs:
with: with:
persist-credentials: false persist-credentials: false
- name: Set up Python - name: Set up Python
uses: actions/setup-python@5fda3b95a4ea91299a34e894583c3862153e4b97 # v7.0.0 uses: actions/setup-python@6d4fd22b20465ccc0f7354476588e8df7c9ca0e0 # v7.1.0
with: with:
python-version-file: ".python-version" python-version-file: ".python-version"
- name: Install uv - name: Install uv
uses: astral-sh/setup-uv@c18668ad3cf93ea998bef934396af7bb5c839dc7 # v10.2.0 uses: astral-sh/setup-uv@07a047e608db84b3d8c06cd9a7c7dcc9c355c18e # v10.3.2
with: with:
version: "latest-known" version: "latest-known"
- name: Prepare release - name: Prepare release
+3 -3
View File
@@ -20,18 +20,18 @@ jobs:
- uses: actions/checkout@3d3c42e5aac5ba805825da76410c181273ba90b1 # v7.0.1 - uses: actions/checkout@3d3c42e5aac5ba805825da76410c181273ba90b1 # v7.0.1
with: with:
persist-credentials: false persist-credentials: false
- uses: actions/setup-python@5fda3b95a4ea91299a34e894583c3862153e4b97 # v7.0.0 - uses: actions/setup-python@6d4fd22b20465ccc0f7354476588e8df7c9ca0e0 # v7.1.0
with: with:
python-version-file: .python-version python-version-file: .python-version
- name: Setup uv - name: Setup uv
uses: astral-sh/setup-uv@c18668ad3cf93ea998bef934396af7bb5c839dc7 # v10.2.0 uses: astral-sh/setup-uv@07a047e608db84b3d8c06cd9a7c7dcc9c355c18e # v10.3.2
with: with:
version: "latest-known" version: "latest-known"
cache-dependency-glob: | cache-dependency-glob: |
pyproject.toml pyproject.toml
uv.lock uv.lock
- run: uv sync --all-packages --no-dev --group github-actions - run: uv sync --all-packages --no-dev --group github-actions
- uses: actions/download-artifact@3e5f45b2cfb9172054b4087a40e8e0b5a5461e7c # v8.0.1 - uses: actions/download-artifact@9000827ccba6bdab643e8b6fd33ac0654aef8333 # v8.0.2
with: with:
name: coverage-html name: coverage-html
path: backend/htmlcov path: backend/htmlcov
+3 -3
View File
@@ -18,11 +18,11 @@ jobs:
with: with:
persist-credentials: false persist-credentials: false
- name: Set up Python - name: Set up Python
uses: actions/setup-python@5fda3b95a4ea91299a34e894583c3862153e4b97 # v7.0.0 uses: actions/setup-python@6d4fd22b20465ccc0f7354476588e8df7c9ca0e0 # v7.1.0
with: with:
python-version-file: .python-version python-version-file: .python-version
- name: Install uv - name: Install uv
uses: astral-sh/setup-uv@c18668ad3cf93ea998bef934396af7bb5c839dc7 # v10.2.0 uses: astral-sh/setup-uv@07a047e608db84b3d8c06cd9a7c7dcc9c355c18e # v10.3.2
with: with:
version: "latest-known" version: "latest-known"
- run: docker compose down -v --remove-orphans - run: docker compose down -v --remove-orphans
@@ -35,7 +35,7 @@ jobs:
working-directory: backend working-directory: backend
- run: docker compose down -v --remove-orphans - run: docker compose down -v --remove-orphans
- name: Store coverage files - name: Store coverage files
uses: actions/upload-artifact@043fb46d1a93c77aae656e7c1c64a875d1fc6a0a # v7.0.1 uses: actions/upload-artifact@cf430e030ddbb5b0abf93d22962f4752f3646cd9 # v7.0.2
with: with:
name: coverage-html name: coverage-html
path: backend/htmlcov path: backend/htmlcov
+1 -1
View File
@@ -24,7 +24,7 @@ jobs:
with: with:
persist-credentials: false persist-credentials: false
- name: Run zizmor - name: Run zizmor
uses: zizmorcore/zizmor-action@cc914d7f3750a2d13d75c7f184a1060aa0e9d482 # v0.6.4 uses: zizmorcore/zizmor-action@53290badfa369cb0bf7ad16342cb62c2fa47ac7b # v0.8.0
with: with:
advanced-security: ${{ github.repository_owner == 'fastapi' }} advanced-security: ${{ github.repository_owner == 'fastapi' }}
annotations: ${{ github.repository_owner != 'fastapi' }} annotations: ${{ github.repository_owner != 'fastapi' }}
+2 -2
View File
@@ -18,7 +18,7 @@ repos:
- id: trailing-whitespace - id: trailing-whitespace
exclude: ^frontend/src/client/.* exclude: ^frontend/src/client/.*
- repo: https://github.com/crate-ci/typos - repo: https://github.com/crate-ci/typos
rev: 00f422f3b19c57bc6338715ebfe3316d38768461 # frozen: v1.50.3 rev: 7f9d0819ca1c008ade73f4b41fa9d258d48f605b # frozen: v1.51.1
hooks: hooks:
- id: typos - id: typos
args: [--force-exclude] args: [--force-exclude]
@@ -43,7 +43,7 @@ repos:
entry: uv run ruff format --force-exclude --exit-non-zero-on-format entry: uv run ruff format --force-exclude --exit-non-zero-on-format
require_serial: true require_serial: true
language: unsupported language: unsupported
types: [python] types_or: [python, markdown]
- id: local-mypy - id: local-mypy
name: mypy check name: mypy check
+1 -1
View File
@@ -25,7 +25,7 @@ dev = [
"pytest<10.0.0,>=7.4.3", "pytest<10.0.0,>=7.4.3",
"mypy<3.0.0,>=1.8.0", "mypy<3.0.0,>=1.8.0",
"ty>=0.0.25", "ty>=0.0.25",
"ruff<1.0.0,>=0.2.2", "ruff<1.0.0,>=0.16.0",
"coverage<8.0.0,>=7.4.3", "coverage<8.0.0,>=7.4.3",
] ]
+418 -290
View File
File diff suppressed because it is too large Load Diff
+1 -1
View File
@@ -1,4 +1,4 @@
FROM mcr.microsoft.com/playwright:v1.63.0-noble FROM mcr.microsoft.com/playwright:v1.64.1-noble
WORKDIR /app WORKDIR /app
+19 -19
View File
@@ -27,17 +27,17 @@ Check `frontend/package.json` to see the other available commands.
If you are developing an API-only app and want to remove the frontend, you can do it easily: If you are developing an API-only app and want to remove the frontend, you can do it easily:
* Remove the `./frontend` directory. - Remove the `./frontend` directory.
* In the `backend/app/main.py` file, remove the `app.frontend()` call. - In the `backend/app/main.py` file, remove the `app.frontend()` call.
* In the `backend/Dockerfile` file, remove the frontend build stage and the `COPY --from=frontend-build` instruction. - In the `backend/Dockerfile` file, remove the frontend build stage and the `COPY --from=frontend-build` instruction.
* In the `compose.override.yml` file, remove the `playwright` service. - In the `compose.override.yml` file, remove the `playwright` service.
* In the `.github/workflows/deploy.yml` file, remove the **Set up Bun**, **Install frontend dependencies**, and **Build frontend** steps. - In the `.github/workflows/deploy.yml` file, remove the **Set up Bun**, **Install frontend dependencies**, and **Build frontend** steps.
* In the `.fastapicloudignore` file, remove the `!backend/app/frontend/` entry. - In the `.fastapicloudignore` file, remove the `!backend/app/frontend/` entry.
Done, you now have an API-only app. 🤓 Done, you now have an API-only app. 🤓
@@ -45,27 +45,27 @@ Done, you now have an API-only app. 🤓
### Automatically ### Automatically
* From the project root, run the script: - From the project root, run the script:
```bash ```bash
bash ./scripts/generate-client.sh bash ./scripts/generate-client.sh
``` ```
* Commit the changes. - Commit the changes.
### Manually ### Manually
* Make sure the backend is running. - Make sure the backend is running.
* Download the OpenAPI JSON file from `http://localhost:8000/api/v1/openapi.json` and copy it to a new file `openapi.json` at the root of the `frontend` directory. - Download the OpenAPI JSON file from `http://localhost:8000/api/v1/openapi.json` and copy it to a new file `openapi.json` at the root of the `frontend` directory.
* To generate the frontend client, run: - To generate the frontend client, run:
```bash ```bash
bun run generate-client bun run generate-client
``` ```
* Commit the changes. - Commit the changes.
Regenerate the client whenever backend changes affect the OpenAPI schema. Regenerate the client whenever backend changes affect the OpenAPI schema.
@@ -83,13 +83,13 @@ Then, when you run the frontend, it will use that URL as the base URL for the AP
The frontend code is structured as follows: The frontend code is structured as follows:
* `frontend/src` - The main frontend code. - `frontend/src` - The main frontend code.
* `frontend/public` - Static assets. - `frontend/public` - Static assets.
* `frontend/src/client` - The generated OpenAPI client. - `frontend/src/client` - The generated OpenAPI client.
* `frontend/src/components` - The components of the frontend, including the shadcn/ui components in `frontend/src/components/ui`. - `frontend/src/components` - The components of the frontend, including the shadcn/ui components in `frontend/src/components/ui`.
* `frontend/src/hooks` - Custom hooks. - `frontend/src/hooks` - Custom hooks.
* `frontend/src/lib` - Shared frontend utilities. - `frontend/src/lib` - Shared frontend utilities.
* `frontend/src/routes` - The frontend routes and pages. - `frontend/src/routes` - The frontend routes and pages.
## End-to-End Testing with Playwright ## End-to-End Testing with Playwright
+1 -1
View File
@@ -1,5 +1,5 @@
{ {
"$schema": "https://biomejs.dev/schemas/2.5.6/schema.json", "$schema": "https://biomejs.dev/schemas/2.6.3/schema.json",
"assist": { "actions": { "source": { "organizeImports": "on" } } }, "assist": { "actions": { "source": { "organizeImports": "on" } } },
"files": { "files": {
"includes": [ "includes": [
+34 -34
View File
@@ -13,53 +13,53 @@
"test:ui": "bunx playwright test --ui" "test:ui": "bunx playwright test --ui"
}, },
"dependencies": { "dependencies": {
"@hookform/resolvers": "^5.7.1", "@hookform/resolvers": "^6.0.1",
"@radix-ui/react-avatar": "^1.2.6", "@radix-ui/react-avatar": "^1.3.1",
"@radix-ui/react-checkbox": "^1.3.11", "@radix-ui/react-checkbox": "^1.4.1",
"@radix-ui/react-dialog": "^1.1.23", "@radix-ui/react-dialog": "^1.3.1",
"@radix-ui/react-dropdown-menu": "^2.1.24", "@radix-ui/react-dropdown-menu": "^2.2.1",
"@radix-ui/react-label": "^2.1.15", "@radix-ui/react-label": "^2.1.17",
"@radix-ui/react-radio-group": "^1.4.7", "@radix-ui/react-radio-group": "^1.5.1",
"@radix-ui/react-scroll-area": "^1.2.18", "@radix-ui/react-scroll-area": "^1.4.0",
"@radix-ui/react-select": "^2.3.7", "@radix-ui/react-select": "^2.4.1",
"@radix-ui/react-separator": "^1.1.15", "@radix-ui/react-separator": "^1.2.0",
"@radix-ui/react-slot": "^1.2.4", "@radix-ui/react-slot": "^1.2.4",
"@radix-ui/react-tabs": "^1.1.21", "@radix-ui/react-tabs": "^1.2.1",
"@radix-ui/react-tooltip": "^1.2.16", "@radix-ui/react-tooltip": "^1.4.1",
"@tailwindcss/vite": "^4.3.3", "@tailwindcss/vite": "^4.3.3",
"@tanstack/react-query": "^5.101.4", "@tanstack/react-query": "^5.105.0",
"@tanstack/react-query-devtools": "^5.101.4", "@tanstack/react-query-devtools": "^5.105.0",
"@tanstack/react-router": "^1.170.18", "@tanstack/react-router": "^1.170.46",
"@tanstack/react-router-devtools": "^1.167.0", "@tanstack/react-router-devtools": "^1.167.2",
"@tanstack/react-table": "^8.21.3", "@tanstack/react-table": "^9.3.1",
"axios": "1.20.0", "axios": "1.20.0",
"class-variance-authority": "^0.7.1", "class-variance-authority": "^0.7.1",
"clsx": "^2.1.1", "clsx": "^2.1.1",
"form-data": "4.0.6", "form-data": "4.0.6",
"lucide-react": "^1.28.0", "lucide-react": "^1.62.0",
"react": "^19.2.8", "react": "^19.3.1",
"react-dom": "^19.2.8", "react-dom": "^19.3.1",
"react-error-boundary": "^6.1.2", "react-error-boundary": "^6.1.6",
"react-hook-form": "^7.84.0", "react-hook-form": "^7.91.0",
"react-icons": "^5.7.0", "react-icons": "^5.7.0",
"sonner": "^2.0.7", "sonner": "^2.0.8",
"tailwind-merge": "^3.6.0", "tailwind-merge": "^3.7.0",
"tailwindcss": "^4.2.1", "tailwindcss": "^4.2.1",
"zod": "^4.4.3" "zod": "^4.6.7"
}, },
"devDependencies": { "devDependencies": {
"@biomejs/biome": "^2.5.6", "@biomejs/biome": "^2.6.3",
"@hey-api/openapi-ts": "0.97.3", "@hey-api/openapi-ts": "0.97.3",
"@playwright/test": "1.63.0", "@playwright/test": "1.64.1",
"@tanstack/router-devtools": "^1.167.0", "@tanstack/router-devtools": "^1.167.2",
"@tanstack/router-plugin": "^1.168.23", "@tanstack/router-plugin": "^1.168.48",
"@types/node": "^26.1.2", "@types/node": "^26.6.5",
"@types/react": "^19.2.18", "@types/react": "^19.3.0",
"@types/react-dom": "^19.2.4", "@types/react-dom": "^19.3.0",
"@vitejs/plugin-react-swc": "^4.3.3", "@vitejs/plugin-react-swc": "^4.3.3",
"dotenv": "^17.4.2", "dotenv": "^18.0.9",
"tw-animate-css": "^1.4.0", "tw-animate-css": "^1.4.0",
"typescript": "^6.0.3", "typescript": "^6.0.3",
"vite": "^8.2.0" "vite": "^8.3.5"
} }
} }
@@ -66,7 +66,7 @@
style="fill:#ffffff;fill-opacity:0.980392;stroke:none;stroke-width:0.136325;stop-color:#000000" style="fill:#ffffff;fill-opacity:0.980392;stroke:none;stroke-width:0.136325;stop-color:#000000"
d="M 32.092357,-1.166849e-4 A 32.092354,31.988569 0 0 0 -2.5752734e-4,31.988628 32.092354,31.988569 0 0 0 32.092357,63.977374 32.092354,31.988569 0 0 0 64.184455,31.988628 32.092354,31.988569 0 0 0 32.092357,-1.166849e-4 Z M 29.878022,14.484271 H 50.070588 L 29.794823,28.73353 H 43.654442 L 14.114126,49.49247 20.530789,35.243727 23.462393,28.73353 Z" /> d="M 32.092357,-1.166849e-4 A 32.092354,31.988569 0 0 0 -2.5752734e-4,31.988628 32.092354,31.988569 0 0 0 32.092357,63.977374 32.092354,31.988569 0 0 0 64.184455,31.988628 32.092354,31.988569 0 0 0 32.092357,-1.166849e-4 Z M 29.878022,14.484271 H 50.070588 L 29.794823,28.73353 H 43.654442 L 14.114126,49.49247 20.530789,35.243727 23.462393,28.73353 Z" />
<path <path
style="font-size:79.7151px;line-height:1.25;font-family:Ubuntu;-inkscape-font-specification:Ubuntu;letter-spacing:0px;word-spacing:0px;fill:#ffffff;stroke-width:1.99288" style="fill:#ffffff;stroke-width:1.99288"
d="M 89.762163,59.410606 V 4.1680399 H 121.88735 V 9.5089518 H 95.979941 V 28.082571 h 22.957949 v 5.340912 H 95.979941 v 25.987123 z m 51.017587,0.876867 q -4.46405,0 -7.97152,-1.275442 -3.50746,-1.275442 -5.50034,-4.145185 -1.99288,-2.869744 -1.99288,-7.572935 0,-4.543761 2.23203,-7.33379 2.23202,-2.869743 6.13806,-4.145185 3.98576,-1.275442 8.92809,-1.275442 2.23203,0 4.70319,0.398576 2.47117,0.398575 3.10889,0.717436 v -2.391453 q 0,-2.710314 -0.71743,-5.181482 -0.63772,-2.550883 -2.71032,-4.145186 -2.07259,-1.594302 -6.29749,-1.594302 -4.38433,0 -6.69607,0.637721 -2.31174,0.637721 -3.42775,1.036297 l -0.79715,-5.101767 q 1.43487,-0.637721 4.38433,-1.195727 2.94946,-0.558005 6.93522,-0.558005 5.65977,0 8.92809,1.992877 3.34803,1.992878 4.7829,5.500342 1.51459,3.42775 1.51459,7.891796 v 25.907408 q -1.67402,0.398576 -5.97863,1.116012 -4.30462,0.717436 -9.56581,0.717436 z m 0.87686,-5.101767 q 2.79003,0 5.02205,-0.15943 2.23203,-0.239146 3.74661,-0.558006 V 40.597842 q -0.79715,-0.398575 -2.71031,-0.797151 -1.91316,-0.398576 -4.94234,-0.398576 -2.55088,0 -5.18148,0.558006 -2.6306,0.558006 -4.46404,2.232023 -1.75374,1.674017 -1.75374,5.022052 0,4.464045 2.79003,6.217778 2.79003,1.753732 7.49322,1.753732 z m 36.4298,5.181482 q -5.34092,0 -8.37009,-0.956582 -2.94946,-0.876866 -3.98575,-1.355156 l 1.43487,-5.261197 q 0.87686,0.31886 3.58718,1.355157 2.71031,1.036296 7.33379,1.036296 4.38433,0 7.09464,-1.355157 2.71031,-1.355157 2.71031,-4.703191 0,-2.152308 -0.95658,-3.427749 -0.95658,-1.355157 -3.10889,-2.471169 -2.07259,-1.116011 -5.73948,-2.550883 -3.10889,-1.275442 -5.73949,-2.710313 -2.6306,-1.434872 -4.30462,-3.666895 -1.5943,-2.232023 -1.5943,-5.739488 0,-3.427749 1.75373,-5.978632 1.75374,-2.550884 4.94234,-3.985755 3.26832,-1.434872 7.73237,-1.434872 4.14518,0 7.01492,0.717436 2.86975,0.717436 4.06547,1.275441 l -1.35515,5.181482 q -1.0363,-0.558006 -3.34804,-1.275442 -2.31173,-0.797151 -6.53663,-0.797151 -3.34804,0 -5.81921,1.434872 -2.47117,1.355157 -2.47117,4.384331 0,2.152308 1.0363,3.507464 1.0363,1.275442 3.10889,2.311738 2.07259,1.036297 5.10177,2.232023 3.42775,1.355157 6.13806,2.869744 2.79003,1.434872 4.46405,3.74661 1.67401,2.311738 1.67401,6.138063 0,3.74661 -1.91316,6.377208 -1.91316,2.550883 -5.50034,3.826325 -3.50747,1.275442 -8.4498,1.275442 z m 39.21967,-0.07972 q -5.2612,0 -8.29037,-1.833448 -3.02917,-1.833447 -4.30461,-5.500342 -1.19573,-3.666895 -1.19573,-9.167237 V 6.1609175 L 209.494,5.1246211 V 18.118183 h 16.18217 v 5.022051 H 209.494 v 21.124503 q 0,4.38433 0.95658,6.696068 1.0363,2.311738 2.86975,3.188605 1.91316,0.797151 4.46404,0.797151 3.02918,0 5.02205,-0.717436 2.0726,-0.717436 3.26832,-1.275442 l 1.27544,4.862621 q -1.19572,0.717436 -3.98575,1.594302 -2.71031,0.876867 -6.05835,0.876867 z m 11.95723,-0.876867 q 4.30462,-11.55869 7.8918,-21.044787 3.58718,-9.486097 7.01493,-17.776468 3.50746,-8.370086 7.4135,-16.4213111 h 5.58006 q 2.86974,6.0583481 5.50034,12.2761261 2.71032,6.138063 5.34091,12.754416 2.6306,6.616354 5.42063,14.109574 2.86975,7.413504 6.05835,16.10245 h -6.77578 q -1.43488,-3.985755 -2.79003,-7.572934 -1.35516,-3.666895 -2.55089,-7.17436 h -26.30598 q -1.27544,3.507465 -2.6306,7.17436 -1.35516,3.587179 -2.71031,7.572934 z M 242.8946,39.402115 h 22.63909 q -1.51459,-3.985755 -2.94946,-7.732365 -1.43487,-3.746609 -2.86975,-7.254074 -1.35515,-3.507464 -2.79002,-6.775784 -1.35516,-3.348034 -2.79003,-6.536638 -1.35516,3.188604 -2.79003,6.536638 -1.35516,3.26832 -2.79003,6.775784 -1.35516,3.507465 -2.79003,7.254074 -1.43487,3.74661 -2.86974,7.732365 z m 44.481,20.008491 V 5.2043362 q 3.02917,-0.797151 6.93521,-1.1160114 3.98576,-0.3985755 7.33379,-0.3985755 11.71812,0 17.53732,4.5437609 5.89892,4.4640458 5.89892,12.7544168 0,6.297493 -2.94946,10.123818 -2.86974,3.826325 -8.37008,5.580057 -5.42063,1.674017 -13.07328,1.674017 h -7.09465 v 21.044787 z m 6.21777,-26.385699 h 6.53664 q 5.65978,0 9.80496,-0.956581 4.14519,-1.036296 6.37721,-3.666895 2.31174,-2.630598 2.31174,-7.493219 0,-4.703192 -2.39146,-7.254075 -2.39145,-2.550883 -6.21777,-3.587179 -3.82633,-1.0362968 -8.13094,-1.0362968 -2.79003,0 -4.86263,0.2391453 -1.99287,0.1594302 -3.42775,0.3188604 z M 335.0452,59.410606 V 4.1680399 h 6.21778 V 59.410606 Z" d="M 89.762163,59.410606 V 4.1680399 H 121.88735 V 9.5089518 H 95.979941 V 28.082571 h 22.957949 v 5.340912 H 95.979941 v 25.987123 z m 51.017587,0.876867 q -4.46405,0 -7.97152,-1.275442 -3.50746,-1.275442 -5.50034,-4.145185 -1.99288,-2.869744 -1.99288,-7.572935 0,-4.543761 2.23203,-7.33379 2.23202,-2.869743 6.13806,-4.145185 3.98576,-1.275442 8.92809,-1.275442 2.23203,0 4.70319,0.398576 2.47117,0.398575 3.10889,0.717436 v -2.391453 q 0,-2.710314 -0.71743,-5.181482 -0.63772,-2.550883 -2.71032,-4.145186 -2.07259,-1.594302 -6.29749,-1.594302 -4.38433,0 -6.69607,0.637721 -2.31174,0.637721 -3.42775,1.036297 l -0.79715,-5.101767 q 1.43487,-0.637721 4.38433,-1.195727 2.94946,-0.558005 6.93522,-0.558005 5.65977,0 8.92809,1.992877 3.34803,1.992878 4.7829,5.500342 1.51459,3.42775 1.51459,7.891796 v 25.907408 q -1.67402,0.398576 -5.97863,1.116012 -4.30462,0.717436 -9.56581,0.717436 z m 0.87686,-5.101767 q 2.79003,0 5.02205,-0.15943 2.23203,-0.239146 3.74661,-0.558006 V 40.597842 q -0.79715,-0.398575 -2.71031,-0.797151 -1.91316,-0.398576 -4.94234,-0.398576 -2.55088,0 -5.18148,0.558006 -2.6306,0.558006 -4.46404,2.232023 -1.75374,1.674017 -1.75374,5.022052 0,4.464045 2.79003,6.217778 2.79003,1.753732 7.49322,1.753732 z m 36.4298,5.181482 q -5.34092,0 -8.37009,-0.956582 -2.94946,-0.876866 -3.98575,-1.355156 l 1.43487,-5.261197 q 0.87686,0.31886 3.58718,1.355157 2.71031,1.036296 7.33379,1.036296 4.38433,0 7.09464,-1.355157 2.71031,-1.355157 2.71031,-4.703191 0,-2.152308 -0.95658,-3.427749 -0.95658,-1.355157 -3.10889,-2.471169 -2.07259,-1.116011 -5.73948,-2.550883 -3.10889,-1.275442 -5.73949,-2.710313 -2.6306,-1.434872 -4.30462,-3.666895 -1.5943,-2.232023 -1.5943,-5.739488 0,-3.427749 1.75373,-5.978632 1.75374,-2.550884 4.94234,-3.985755 3.26832,-1.434872 7.73237,-1.434872 4.14518,0 7.01492,0.717436 2.86975,0.717436 4.06547,1.275441 l -1.35515,5.181482 q -1.0363,-0.558006 -3.34804,-1.275442 -2.31173,-0.797151 -6.53663,-0.797151 -3.34804,0 -5.81921,1.434872 -2.47117,1.355157 -2.47117,4.384331 0,2.152308 1.0363,3.507464 1.0363,1.275442 3.10889,2.311738 2.07259,1.036297 5.10177,2.232023 3.42775,1.355157 6.13806,2.869744 2.79003,1.434872 4.46405,3.74661 1.67401,2.311738 1.67401,6.138063 0,3.74661 -1.91316,6.377208 -1.91316,2.550883 -5.50034,3.826325 -3.50747,1.275442 -8.4498,1.275442 z m 39.21967,-0.07972 q -5.2612,0 -8.29037,-1.833448 -3.02917,-1.833447 -4.30461,-5.500342 -1.19573,-3.666895 -1.19573,-9.167237 V 6.1609175 L 209.494,5.1246211 V 18.118183 h 16.18217 v 5.022051 H 209.494 v 21.124503 q 0,4.38433 0.95658,6.696068 1.0363,2.311738 2.86975,3.188605 1.91316,0.797151 4.46404,0.797151 3.02918,0 5.02205,-0.717436 2.0726,-0.717436 3.26832,-1.275442 l 1.27544,4.862621 q -1.19572,0.717436 -3.98575,1.594302 -2.71031,0.876867 -6.05835,0.876867 z m 11.95723,-0.876867 q 4.30462,-11.55869 7.8918,-21.044787 3.58718,-9.486097 7.01493,-17.776468 3.50746,-8.370086 7.4135,-16.4213111 h 5.58006 q 2.86974,6.0583481 5.50034,12.2761261 2.71032,6.138063 5.34091,12.754416 2.6306,6.616354 5.42063,14.109574 2.86975,7.413504 6.05835,16.10245 h -6.77578 q -1.43488,-3.985755 -2.79003,-7.572934 -1.35516,-3.666895 -2.55089,-7.17436 h -26.30598 q -1.27544,3.507465 -2.6306,7.17436 -1.35516,3.587179 -2.71031,7.572934 z M 242.8946,39.402115 h 22.63909 q -1.51459,-3.985755 -2.94946,-7.732365 -1.43487,-3.746609 -2.86975,-7.254074 -1.35515,-3.507464 -2.79002,-6.775784 -1.35516,-3.348034 -2.79003,-6.536638 -1.35516,3.188604 -2.79003,6.536638 -1.35516,3.26832 -2.79003,6.775784 -1.35516,3.507465 -2.79003,7.254074 -1.43487,3.74661 -2.86974,7.732365 z m 44.481,20.008491 V 5.2043362 q 3.02917,-0.797151 6.93521,-1.1160114 3.98576,-0.3985755 7.33379,-0.3985755 11.71812,0 17.53732,4.5437609 5.89892,4.4640458 5.89892,12.7544168 0,6.297493 -2.94946,10.123818 -2.86974,3.826325 -8.37008,5.580057 -5.42063,1.674017 -13.07328,1.674017 h -7.09465 v 21.044787 z m 6.21777,-26.385699 h 6.53664 q 5.65978,0 9.80496,-0.956581 4.14519,-1.036296 6.37721,-3.666895 2.31174,-2.630598 2.31174,-7.493219 0,-4.703192 -2.39146,-7.254075 -2.39145,-2.550883 -6.21777,-3.587179 -3.82633,-1.0362968 -8.13094,-1.0362968 -2.79003,0 -4.86263,0.2391453 -1.99287,0.1594302 -3.42775,0.3188604 z M 335.0452,59.410606 V 4.1680399 h 6.21778 V 59.410606 Z"
id="text979-3" id="text979-3"
aria-label="FastAPI" /> aria-label="FastAPI" />

Before

Width:  |  Height:  |  Size: 7.0 KiB

After

Width:  |  Height:  |  Size: 6.9 KiB

@@ -74,7 +74,7 @@
d="m 962.2685,-187.40837 -6.64403,14.80375 -3.03599,6.76393 -6.64456,14.80375 30.59142,-21.56768 h -14.35312 l 20.99715,-14.80375 z" /> d="m 962.2685,-187.40837 -6.64403,14.80375 -3.03599,6.76393 -6.64456,14.80375 30.59142,-21.56768 h -14.35312 l 20.99715,-14.80375 z" />
</g> </g>
<path <path
style="font-size:79.7151px;line-height:1.25;font-family:Ubuntu;-inkscape-font-specification:Ubuntu;letter-spacing:0px;word-spacing:0px;fill:#009688;stroke-width:1.99288" style="fill:#009688;stroke-width:1.99288"
d="M 89.762163,59.410606 V 4.1680399 H 121.88735 V 9.5089518 H 95.979941 V 28.082571 h 22.957949 v 5.340912 H 95.979941 v 25.987123 z m 51.017587,0.876867 q -4.46405,0 -7.97152,-1.275442 -3.50746,-1.275442 -5.50034,-4.145185 -1.99288,-2.869744 -1.99288,-7.572935 0,-4.543761 2.23203,-7.33379 2.23202,-2.869743 6.13806,-4.145185 3.98576,-1.275442 8.92809,-1.275442 2.23203,0 4.70319,0.398576 2.47117,0.398575 3.10889,0.717436 v -2.391453 q 0,-2.710314 -0.71743,-5.181482 -0.63772,-2.550883 -2.71032,-4.145186 -2.07259,-1.594302 -6.29749,-1.594302 -4.38433,0 -6.69607,0.637721 -2.31174,0.637721 -3.42775,1.036297 l -0.79715,-5.101767 q 1.43487,-0.637721 4.38433,-1.195727 2.94946,-0.558005 6.93522,-0.558005 5.65977,0 8.92809,1.992877 3.34803,1.992878 4.7829,5.500342 1.51459,3.42775 1.51459,7.891796 v 25.907408 q -1.67402,0.398576 -5.97863,1.116012 -4.30462,0.717436 -9.56581,0.717436 z m 0.87686,-5.101767 q 2.79003,0 5.02205,-0.15943 2.23203,-0.239146 3.74661,-0.558006 V 40.597842 q -0.79715,-0.398575 -2.71031,-0.797151 -1.91316,-0.398576 -4.94234,-0.398576 -2.55088,0 -5.18148,0.558006 -2.6306,0.558006 -4.46404,2.232023 -1.75374,1.674017 -1.75374,5.022052 0,4.464045 2.79003,6.217778 2.79003,1.753732 7.49322,1.753732 z m 36.4298,5.181482 q -5.34092,0 -8.37009,-0.956582 -2.94946,-0.876866 -3.98575,-1.355156 l 1.43487,-5.261197 q 0.87686,0.31886 3.58718,1.355157 2.71031,1.036296 7.33379,1.036296 4.38433,0 7.09464,-1.355157 2.71031,-1.355157 2.71031,-4.703191 0,-2.152308 -0.95658,-3.427749 -0.95658,-1.355157 -3.10889,-2.471169 -2.07259,-1.116011 -5.73948,-2.550883 -3.10889,-1.275442 -5.73949,-2.710313 -2.6306,-1.434872 -4.30462,-3.666895 -1.5943,-2.232023 -1.5943,-5.739488 0,-3.427749 1.75373,-5.978632 1.75374,-2.550884 4.94234,-3.985755 3.26832,-1.434872 7.73237,-1.434872 4.14518,0 7.01492,0.717436 2.86975,0.717436 4.06547,1.275441 l -1.35515,5.181482 q -1.0363,-0.558006 -3.34804,-1.275442 -2.31173,-0.797151 -6.53663,-0.797151 -3.34804,0 -5.81921,1.434872 -2.47117,1.355157 -2.47117,4.384331 0,2.152308 1.0363,3.507464 1.0363,1.275442 3.10889,2.311738 2.07259,1.036297 5.10177,2.232023 3.42775,1.355157 6.13806,2.869744 2.79003,1.434872 4.46405,3.74661 1.67401,2.311738 1.67401,6.138063 0,3.74661 -1.91316,6.377208 -1.91316,2.550883 -5.50034,3.826325 -3.50747,1.275442 -8.4498,1.275442 z m 39.21967,-0.07972 q -5.2612,0 -8.29037,-1.833448 -3.02917,-1.833447 -4.30461,-5.500342 -1.19573,-3.666895 -1.19573,-9.167237 V 6.1609175 L 209.494,5.1246211 V 18.118183 h 16.18217 v 5.022051 H 209.494 v 21.124503 q 0,4.38433 0.95658,6.696068 1.0363,2.311738 2.86975,3.188605 1.91316,0.797151 4.46404,0.797151 3.02918,0 5.02205,-0.717436 2.0726,-0.717436 3.26832,-1.275442 l 1.27544,4.862621 q -1.19572,0.717436 -3.98575,1.594302 -2.71031,0.876867 -6.05835,0.876867 z m 11.95723,-0.876867 q 4.30462,-11.55869 7.8918,-21.044787 3.58718,-9.486097 7.01493,-17.776468 3.50746,-8.370086 7.4135,-16.4213111 h 5.58006 q 2.86974,6.0583481 5.50034,12.2761261 2.71032,6.138063 5.34091,12.754416 2.6306,6.616354 5.42063,14.109574 2.86975,7.413504 6.05835,16.10245 h -6.77578 q -1.43488,-3.985755 -2.79003,-7.572934 -1.35516,-3.666895 -2.55089,-7.17436 h -26.30598 q -1.27544,3.507465 -2.6306,7.17436 -1.35516,3.587179 -2.71031,7.572934 z M 242.8946,39.402115 h 22.63909 q -1.51459,-3.985755 -2.94946,-7.732365 -1.43487,-3.746609 -2.86975,-7.254074 -1.35515,-3.507464 -2.79002,-6.775784 -1.35516,-3.348034 -2.79003,-6.536638 -1.35516,3.188604 -2.79003,6.536638 -1.35516,3.26832 -2.79003,6.775784 -1.35516,3.507465 -2.79003,7.254074 -1.43487,3.74661 -2.86974,7.732365 z m 44.481,20.008491 V 5.2043362 q 3.02917,-0.797151 6.93521,-1.1160114 3.98576,-0.3985755 7.33379,-0.3985755 11.71812,0 17.53732,4.5437609 5.89892,4.4640458 5.89892,12.7544168 0,6.297493 -2.94946,10.123818 -2.86974,3.826325 -8.37008,5.580057 -5.42063,1.674017 -13.07328,1.674017 h -7.09465 v 21.044787 z m 6.21777,-26.385699 h 6.53664 q 5.65978,0 9.80496,-0.956581 4.14519,-1.036296 6.37721,-3.666895 2.31174,-2.630598 2.31174,-7.493219 0,-4.703192 -2.39146,-7.254075 -2.39145,-2.550883 -6.21777,-3.587179 -3.82633,-1.0362968 -8.13094,-1.0362968 -2.79003,0 -4.86263,0.2391453 -1.99287,0.1594302 -3.42775,0.3188604 z M 335.0452,59.410606 V 4.1680399 h 6.21778 V 59.410606 Z" d="M 89.762163,59.410606 V 4.1680399 H 121.88735 V 9.5089518 H 95.979941 V 28.082571 h 22.957949 v 5.340912 H 95.979941 v 25.987123 z m 51.017587,0.876867 q -4.46405,0 -7.97152,-1.275442 -3.50746,-1.275442 -5.50034,-4.145185 -1.99288,-2.869744 -1.99288,-7.572935 0,-4.543761 2.23203,-7.33379 2.23202,-2.869743 6.13806,-4.145185 3.98576,-1.275442 8.92809,-1.275442 2.23203,0 4.70319,0.398576 2.47117,0.398575 3.10889,0.717436 v -2.391453 q 0,-2.710314 -0.71743,-5.181482 -0.63772,-2.550883 -2.71032,-4.145186 -2.07259,-1.594302 -6.29749,-1.594302 -4.38433,0 -6.69607,0.637721 -2.31174,0.637721 -3.42775,1.036297 l -0.79715,-5.101767 q 1.43487,-0.637721 4.38433,-1.195727 2.94946,-0.558005 6.93522,-0.558005 5.65977,0 8.92809,1.992877 3.34803,1.992878 4.7829,5.500342 1.51459,3.42775 1.51459,7.891796 v 25.907408 q -1.67402,0.398576 -5.97863,1.116012 -4.30462,0.717436 -9.56581,0.717436 z m 0.87686,-5.101767 q 2.79003,0 5.02205,-0.15943 2.23203,-0.239146 3.74661,-0.558006 V 40.597842 q -0.79715,-0.398575 -2.71031,-0.797151 -1.91316,-0.398576 -4.94234,-0.398576 -2.55088,0 -5.18148,0.558006 -2.6306,0.558006 -4.46404,2.232023 -1.75374,1.674017 -1.75374,5.022052 0,4.464045 2.79003,6.217778 2.79003,1.753732 7.49322,1.753732 z m 36.4298,5.181482 q -5.34092,0 -8.37009,-0.956582 -2.94946,-0.876866 -3.98575,-1.355156 l 1.43487,-5.261197 q 0.87686,0.31886 3.58718,1.355157 2.71031,1.036296 7.33379,1.036296 4.38433,0 7.09464,-1.355157 2.71031,-1.355157 2.71031,-4.703191 0,-2.152308 -0.95658,-3.427749 -0.95658,-1.355157 -3.10889,-2.471169 -2.07259,-1.116011 -5.73948,-2.550883 -3.10889,-1.275442 -5.73949,-2.710313 -2.6306,-1.434872 -4.30462,-3.666895 -1.5943,-2.232023 -1.5943,-5.739488 0,-3.427749 1.75373,-5.978632 1.75374,-2.550884 4.94234,-3.985755 3.26832,-1.434872 7.73237,-1.434872 4.14518,0 7.01492,0.717436 2.86975,0.717436 4.06547,1.275441 l -1.35515,5.181482 q -1.0363,-0.558006 -3.34804,-1.275442 -2.31173,-0.797151 -6.53663,-0.797151 -3.34804,0 -5.81921,1.434872 -2.47117,1.355157 -2.47117,4.384331 0,2.152308 1.0363,3.507464 1.0363,1.275442 3.10889,2.311738 2.07259,1.036297 5.10177,2.232023 3.42775,1.355157 6.13806,2.869744 2.79003,1.434872 4.46405,3.74661 1.67401,2.311738 1.67401,6.138063 0,3.74661 -1.91316,6.377208 -1.91316,2.550883 -5.50034,3.826325 -3.50747,1.275442 -8.4498,1.275442 z m 39.21967,-0.07972 q -5.2612,0 -8.29037,-1.833448 -3.02917,-1.833447 -4.30461,-5.500342 -1.19573,-3.666895 -1.19573,-9.167237 V 6.1609175 L 209.494,5.1246211 V 18.118183 h 16.18217 v 5.022051 H 209.494 v 21.124503 q 0,4.38433 0.95658,6.696068 1.0363,2.311738 2.86975,3.188605 1.91316,0.797151 4.46404,0.797151 3.02918,0 5.02205,-0.717436 2.0726,-0.717436 3.26832,-1.275442 l 1.27544,4.862621 q -1.19572,0.717436 -3.98575,1.594302 -2.71031,0.876867 -6.05835,0.876867 z m 11.95723,-0.876867 q 4.30462,-11.55869 7.8918,-21.044787 3.58718,-9.486097 7.01493,-17.776468 3.50746,-8.370086 7.4135,-16.4213111 h 5.58006 q 2.86974,6.0583481 5.50034,12.2761261 2.71032,6.138063 5.34091,12.754416 2.6306,6.616354 5.42063,14.109574 2.86975,7.413504 6.05835,16.10245 h -6.77578 q -1.43488,-3.985755 -2.79003,-7.572934 -1.35516,-3.666895 -2.55089,-7.17436 h -26.30598 q -1.27544,3.507465 -2.6306,7.17436 -1.35516,3.587179 -2.71031,7.572934 z M 242.8946,39.402115 h 22.63909 q -1.51459,-3.985755 -2.94946,-7.732365 -1.43487,-3.746609 -2.86975,-7.254074 -1.35515,-3.507464 -2.79002,-6.775784 -1.35516,-3.348034 -2.79003,-6.536638 -1.35516,3.188604 -2.79003,6.536638 -1.35516,3.26832 -2.79003,6.775784 -1.35516,3.507465 -2.79003,7.254074 -1.43487,3.74661 -2.86974,7.732365 z m 44.481,20.008491 V 5.2043362 q 3.02917,-0.797151 6.93521,-1.1160114 3.98576,-0.3985755 7.33379,-0.3985755 11.71812,0 17.53732,4.5437609 5.89892,4.4640458 5.89892,12.7544168 0,6.297493 -2.94946,10.123818 -2.86974,3.826325 -8.37008,5.580057 -5.42063,1.674017 -13.07328,1.674017 h -7.09465 v 21.044787 z m 6.21777,-26.385699 h 6.53664 q 5.65978,0 9.80496,-0.956581 4.14519,-1.036296 6.37721,-3.666895 2.31174,-2.630598 2.31174,-7.493219 0,-4.703192 -2.39146,-7.254075 -2.39145,-2.550883 -6.21777,-3.587179 -3.82633,-1.0362968 -8.13094,-1.0362968 -2.79003,0 -4.86263,0.2391453 -1.99287,0.1594302 -3.42775,0.3188604 z M 335.0452,59.410606 V 4.1680399 h 6.21778 V 59.410606 Z"
id="text979-3" id="text979-3"
aria-label="FastAPI" /> aria-label="FastAPI" />

Before

Width:  |  Height:  |  Size: 7.1 KiB

After

Width:  |  Height:  |  Size: 6.9 KiB

+2 -1
View File
@@ -1,6 +1,7 @@
import type { ColumnDef } from "@tanstack/react-table" import type { ColumnDef } from "@tanstack/react-table"
import type { UserPublic } from "@/client" import type { UserPublic } from "@/client"
import type { DataTableFeatures } from "@/components/Common/DataTable"
import { Badge } from "@/components/ui/badge" import { Badge } from "@/components/ui/badge"
import { cn } from "@/lib/utils" import { cn } from "@/lib/utils"
import { UserActionsMenu } from "./UserActionsMenu" import { UserActionsMenu } from "./UserActionsMenu"
@@ -9,7 +10,7 @@ export type UserTableData = UserPublic & {
isCurrentUser: boolean isCurrentUser: boolean
} }
export const columns: ColumnDef<UserTableData>[] = [ export const columns: ColumnDef<DataTableFeatures, UserTableData>[] = [
{ {
accessorKey: "full_name", accessorKey: "full_name",
header: "Full Name", header: "Full Name",
+26 -20
View File
@@ -1,9 +1,11 @@
import { import {
type ColumnDef, type ColumnDef,
createPaginatedRowModel,
flexRender, flexRender,
getCoreRowModel, type RowData,
getPaginationRowModel, rowPaginationFeature,
useReactTable, tableFeatures,
useTable,
} from "@tanstack/react-table" } from "@tanstack/react-table"
import { import {
ChevronLeft, ChevronLeft,
@@ -29,20 +31,26 @@ import {
TableRow, TableRow,
} from "@/components/ui/table" } from "@/components/ui/table"
interface DataTableProps<TData, TValue> { const dataTableFeatures = tableFeatures({
columns: ColumnDef<TData, TValue>[] rowPaginationFeature,
paginatedRowModel: createPaginatedRowModel(),
})
export type DataTableFeatures = typeof dataTableFeatures
interface DataTableProps<TData extends RowData> {
columns: ColumnDef<DataTableFeatures, TData>[]
data: TData[] data: TData[]
} }
export function DataTable<TData, TValue>({ export function DataTable<TData extends RowData>({
columns, columns,
data, data,
}: DataTableProps<TData, TValue>) { }: DataTableProps<TData>) {
const table = useReactTable({ const table = useTable({
features: dataTableFeatures,
data, data,
columns, columns,
getCoreRowModel: getCoreRowModel(),
getPaginationRowModel: getPaginationRowModel(),
}) })
return ( return (
@@ -70,7 +78,7 @@ export function DataTable<TData, TValue>({
{table.getRowModel().rows.length ? ( {table.getRowModel().rows.length ? (
table.getRowModel().rows.map((row) => ( table.getRowModel().rows.map((row) => (
<TableRow key={row.id}> <TableRow key={row.id}>
{row.getVisibleCells().map((cell) => ( {row.getAllCells().map((cell) => (
<TableCell key={cell.id}> <TableCell key={cell.id}>
{flexRender(cell.column.columnDef.cell, cell.getContext())} {flexRender(cell.column.columnDef.cell, cell.getContext())}
</TableCell> </TableCell>
@@ -95,13 +103,13 @@ export function DataTable<TData, TValue>({
<div className="flex flex-col sm:flex-row sm:items-center gap-4"> <div className="flex flex-col sm:flex-row sm:items-center gap-4">
<div className="text-sm text-muted-foreground"> <div className="text-sm text-muted-foreground">
Showing{" "} Showing{" "}
{table.getState().pagination.pageIndex * {table.state.pagination.pageIndex *
table.getState().pagination.pageSize + table.state.pagination.pageSize +
1}{" "} 1}{" "}
to{" "} to{" "}
{Math.min( {Math.min(
(table.getState().pagination.pageIndex + 1) * (table.state.pagination.pageIndex + 1) *
table.getState().pagination.pageSize, table.state.pagination.pageSize,
data.length, data.length,
)}{" "} )}{" "}
of{" "} of{" "}
@@ -111,15 +119,13 @@ export function DataTable<TData, TValue>({
<div className="flex items-center gap-x-2"> <div className="flex items-center gap-x-2">
<p className="text-sm text-muted-foreground">Rows per page</p> <p className="text-sm text-muted-foreground">Rows per page</p>
<Select <Select
value={`${table.getState().pagination.pageSize}`} value={`${table.state.pagination.pageSize}`}
onValueChange={(value) => { onValueChange={(value) => {
table.setPageSize(Number(value)) table.setPageSize(Number(value))
}} }}
> >
<SelectTrigger className="h-8 w-[70px]"> <SelectTrigger className="h-8 w-[70px]">
<SelectValue <SelectValue placeholder={table.state.pagination.pageSize} />
placeholder={table.getState().pagination.pageSize}
/>
</SelectTrigger> </SelectTrigger>
<SelectContent side="top"> <SelectContent side="top">
{[5, 10, 25, 50].map((pageSize) => ( {[5, 10, 25, 50].map((pageSize) => (
@@ -136,7 +142,7 @@ export function DataTable<TData, TValue>({
<div className="flex items-center gap-x-1 text-sm text-muted-foreground"> <div className="flex items-center gap-x-1 text-sm text-muted-foreground">
<span>Page</span> <span>Page</span>
<span className="font-medium text-foreground"> <span className="font-medium text-foreground">
{table.getState().pagination.pageIndex + 1} {table.state.pagination.pageIndex + 1}
</span> </span>
<span>of</span> <span>of</span>
<span className="font-medium text-foreground"> <span className="font-medium text-foreground">
+2 -1
View File
@@ -2,6 +2,7 @@ import type { ColumnDef } from "@tanstack/react-table"
import { Check, Copy } from "lucide-react" import { Check, Copy } from "lucide-react"
import type { ItemPublic } from "@/client" import type { ItemPublic } from "@/client"
import type { DataTableFeatures } from "@/components/Common/DataTable"
import { Button } from "@/components/ui/button" import { Button } from "@/components/ui/button"
import { useCopyToClipboard } from "@/hooks/useCopyToClipboard" import { useCopyToClipboard } from "@/hooks/useCopyToClipboard"
import { cn } from "@/lib/utils" import { cn } from "@/lib/utils"
@@ -31,7 +32,7 @@ function CopyId({ id }: { id: string }) {
) )
} }
export const columns: ColumnDef<ItemPublic>[] = [ export const columns: ColumnDef<DataTableFeatures, ItemPublic>[] = [
{ {
accessorKey: "id", accessorKey: "id",
header: "ID", header: "ID",
+7 -7
View File
@@ -10,14 +10,14 @@
}, },
"dependencies": { "dependencies": {
"@react-email/components": "1.0.12", "@react-email/components": "1.0.12",
"react": "^19.2.8", "react": "^19.3.1",
"react-dom": "^19.2.8", "react-dom": "^19.3.1",
"react-email": "6.9.1" "react-email": "6.11.3"
}, },
"devDependencies": { "devDependencies": {
"@biomejs/biome": "^2.5.6", "@biomejs/biome": "^2.6.3",
"@react-email/ui": "6.9.1", "@react-email/ui": "6.11.3",
"@types/react": "^19.2.18", "@types/react": "^19.3.0",
"@types/react-dom": "^19.2.4" "@types/react-dom": "^19.3.0"
} }
} }
+9
View File
@@ -16,11 +16,20 @@
### Docs ### Docs
* 🎨 Enable Ruff formatting for Python in Markdown. PR [#2517](https://github.com/fastapi/full-stack-fastapi-template/pull/2517) by [@tiangolo](https://github.com/tiangolo).
* 📝 Update README.md with Mailpit and React Email. PR [#2452](https://github.com/fastapi/full-stack-fastapi-template/pull/2452) by [@alejsdev](https://github.com/alejsdev). * 📝 Update README.md with Mailpit and React Email. PR [#2452](https://github.com/fastapi/full-stack-fastapi-template/pull/2452) by [@alejsdev](https://github.com/alejsdev).
* 📝 Simplify project documentation. PR [#2442](https://github.com/fastapi/full-stack-fastapi-template/pull/2442) by [@tiangolo](https://github.com/tiangolo). * 📝 Simplify project documentation. PR [#2442](https://github.com/fastapi/full-stack-fastapi-template/pull/2442) by [@tiangolo](https://github.com/tiangolo).
### Internal ### Internal
* ⬆ Bump the npm-packages group across 1 directory with 30 updates. PR [#2525](https://github.com/fastapi/full-stack-fastapi-template/pull/2525) by [@dependabot[bot]](https://github.com/apps/dependabot).
* ⬆ Bump playwright from v1.63.0-noble to v1.64.1-noble in /frontend in the docker group across 1 directory. PR [#2521](https://github.com/fastapi/full-stack-fastapi-template/pull/2521) by [@dependabot[bot]](https://github.com/apps/dependabot).
* ⬆ Bump the github-actions group with 6 updates. PR [#2520](https://github.com/fastapi/full-stack-fastapi-template/pull/2520) by [@dependabot[bot]](https://github.com/apps/dependabot).
* ⬆ Bump pre-commit hooks. PR [#2523](https://github.com/fastapi/full-stack-fastapi-template/pull/2523) by [@pr-submit[bot]](https://github.com/apps/pr-submit).
* ⬆ Bump dnspython from 2.8.0 to 2.9.0. PR [#2524](https://github.com/fastapi/full-stack-fastapi-template/pull/2524) by [@dependabot[bot]](https://github.com/apps/dependabot).
* ⬆ Bump certifi from 2026.6.17 to 2026.10.19. PR [#2518](https://github.com/fastapi/full-stack-fastapi-template/pull/2518) by [@dependabot[bot]](https://github.com/apps/dependabot).
* ⬆️ Migrate `@tanstack/react-table` to 9.x. PR [#2509](https://github.com/fastapi/full-stack-fastapi-template/pull/2509) by [@YuriiMotov](https://github.com/YuriiMotov).
* ⬆ Bump the npm-packages group across 1 directory with 25 updates. PR [#2506](https://github.com/fastapi/full-stack-fastapi-template/pull/2506) by [@dependabot[bot]](https://github.com/apps/dependabot).
* ⬆ Bump mako from 1.3.12 to 1.4.2. PR [#2507](https://github.com/fastapi/full-stack-fastapi-template/pull/2507) by [@dependabot[bot]](https://github.com/apps/dependabot). * ⬆ Bump mako from 1.3.12 to 1.4.2. PR [#2507](https://github.com/fastapi/full-stack-fastapi-template/pull/2507) by [@dependabot[bot]](https://github.com/apps/dependabot).
* ⬆ Bump the python-packages group across 1 directory with 8 updates. PR [#2497](https://github.com/fastapi/full-stack-fastapi-template/pull/2497) by [@dependabot[bot]](https://github.com/apps/dependabot). * ⬆ Bump the python-packages group across 1 directory with 8 updates. PR [#2497](https://github.com/fastapi/full-stack-fastapi-template/pull/2497) by [@dependabot[bot]](https://github.com/apps/dependabot).
* Bump axios from 1.18.0 to 1.20.0 in /frontend. PR [#2505](https://github.com/fastapi/full-stack-fastapi-template/pull/2505) by [@dependabot[bot]](https://github.com/apps/dependabot). * Bump axios from 1.18.0 to 1.20.0 in /frontend. PR [#2505](https://github.com/fastapi/full-stack-fastapi-template/pull/2505) by [@dependabot[bot]](https://github.com/apps/dependabot).
Generated
+8 -8
View File
@@ -1,5 +1,5 @@
version = 1 version = 1
revision = 3 revision = 5
requires-python = ">=3.14, <4.0" requires-python = ">=3.14, <4.0"
resolution-markers = [ resolution-markers = [
"python_full_version >= '3.15'", "python_full_version >= '3.15'",
@@ -116,7 +116,7 @@ dev = [
{ name = "coverage", specifier = ">=7.4.3,<8.0.0" }, { name = "coverage", specifier = ">=7.4.3,<8.0.0" },
{ name = "mypy", specifier = ">=1.8.0,<3.0.0" }, { name = "mypy", specifier = ">=1.8.0,<3.0.0" },
{ name = "pytest", specifier = ">=7.4.3,<10.0.0" }, { name = "pytest", specifier = ">=7.4.3,<10.0.0" },
{ name = "ruff", specifier = ">=0.2.2,<1.0.0" }, { name = "ruff", specifier = ">=0.16.0,<1.0.0" },
{ name = "ty", specifier = ">=0.0.25" }, { name = "ty", specifier = ">=0.0.25" },
] ]
@@ -280,11 +280,11 @@ wheels = [
[[package]] [[package]]
name = "certifi" name = "certifi"
version = "2026.6.17" version = "2026.10.19"
source = { registry = "https://pypi.org/simple" } source = { registry = "https://pypi.org/simple" }
sdist = { url = "https://files.pythonhosted.org/packages/c9/c7/424b75da314c1045981bd9777432fad05a9e0c69daa4ed7e308bbaffe405/certifi-2026.6.17.tar.gz", hash = "sha256:024c88eeec92ca068db80f02b8b07c9cef7b9fe261d1d535abfd5abd6f6af432", size = 134594, upload-time = "2026-06-17T10:31:07.894Z" } sdist = { url = "https://files.pythonhosted.org/packages/a6/bd/1436c50cc46699de0230fbaacc1d1de7bfec413176099949e9d5112e88f2/certifi-2026.10.19.tar.gz", hash = "sha256:035c1e85572b141bf1c3a3eff0e33a8eb74917522f2559075ff8d2fea780a1ae", size = 137598, upload-time = "2026-10-20T02:24:16.604Z" }
wheels = [ wheels = [
{ url = "https://files.pythonhosted.org/packages/ef/2f/c5464532e965badff2f4c4c1a3a83f5697f0d7c407ed0cda44aaa99bb451/certifi-2026.6.17-py3-none-any.whl", hash = "sha256:2227dcbaafe0d2f59279d1762ddddc37783ed4354594f194ffc31d20f41fc3db", size = 133289, upload-time = "2026-06-17T10:31:06.348Z" }, { url = "https://files.pythonhosted.org/packages/c4/51/29046e48f693c54e5b7412216d447a1d8362c9653148d98c02cdf65fa733/certifi-2026.10.19-py3-none-any.whl", hash = "sha256:42d35340cc5b9ba78e818ddbff0c5b1c2b779de448a340fd1b989f5fa8670e1b", size = 136464, upload-time = "2026-10-20T02:24:15.072Z" },
] ]
[[package]] [[package]]
@@ -430,11 +430,11 @@ sdist = { url = "https://files.pythonhosted.org/packages/f0/6f/84e91828186bbfced
[[package]] [[package]]
name = "dnspython" name = "dnspython"
version = "2.8.0" version = "2.9.0"
source = { registry = "https://pypi.org/simple" } source = { registry = "https://pypi.org/simple" }
sdist = { url = "https://files.pythonhosted.org/packages/8c/8b/57666417c0f90f08bcafa776861060426765fdb422eb10212086fb811d26/dnspython-2.8.0.tar.gz", hash = "sha256:181d3c6996452cb1189c4046c61599b84a5a86e099562ffde77d26984ff26d0f", size = 368251, upload-time = "2025-09-07T18:58:00.022Z" } sdist = { url = "https://files.pythonhosted.org/packages/ef/4a/50822184bd67cc6493f0fb6a880749158fcd31ab3fa07409acfd91f9fc85/dnspython-2.9.0.tar.gz", hash = "sha256:b44dc6b18f07a8b1c56676a19fbfdb5209415b046a9cece286baafa87ff3f7f1", size = 423560, upload-time = "2026-10-09T00:07:24.352Z" }
wheels = [ wheels = [
{ url = "https://files.pythonhosted.org/packages/ba/5a/18ad964b0086c6e62e2e7500f7edc89e3faa45033c71c1893d34eed2b2de/dnspython-2.8.0-py3-none-any.whl", hash = "sha256:01d9bbc4a2d76bf0db7c1f729812ded6d912bd318d3b1cf81d30c0f845dbf3af", size = 331094, upload-time = "2025-09-07T18:57:58.071Z" }, { url = "https://files.pythonhosted.org/packages/10/02/cdcc9b7c051786a103c3b09e1003a82fa0c66bcb91ffbdabcfbf7b4163b9/dnspython-2.9.0-py3-none-any.whl", hash = "sha256:9a4aedb833c3c1b49214d04d44d3032ab7a9135f7c1d29a549b4ff78fd82fda9", size = 354822, upload-time = "2026-10-09T00:07:22.622Z" },
] ]
[[package]] [[package]]