Compare commits
131 Commits
9e3e4cb0b3
...
website-co
| Author | SHA1 | Date | |
|---|---|---|---|
| 6ff2249955 | |||
| ec6cfba9ba | |||
| 22b6a06b32 | |||
| dac9e80efd | |||
| 8fd744118f | |||
| adcbce68c8 | |||
| 33fbbe96b3 | |||
| 076618784a | |||
| 91ce9aa6c6 | |||
| 52eac520e8 | |||
| 2583e4e99b | |||
| 1b1db88a2a | |||
| 028637fdd3 | |||
| 649b596c7c | |||
| 25c08f7a1d | |||
| c320190a8d | |||
| e17d28914e | |||
| 95c9f186bb | |||
| 4f571b3ae1 | |||
| c5fdcf6b10 | |||
| a38cd26894 | |||
| 37e7b3617a | |||
| 87224a6dbb | |||
| 4b5f65bfdd | |||
| f9a837f0fa | |||
| 4847e9f172 | |||
| 3aa75e1a10 | |||
| 91cd9af0f8 | |||
| 4a59e44716 | |||
| 67eb549ed2 | |||
| 8fd009ffda | |||
| 4b1eb3777f | |||
| 7858d95f58 | |||
| b91d37db45 | |||
| 109996989e | |||
| 96151d6512 | |||
| ac266b98ec | |||
| 8fa3c0b3ab | |||
| cef1b3381f | |||
| 049861c255 | |||
| ba948e4181 | |||
| 68b6d7f785 | |||
| 1f9264a409 | |||
| 7774e31c36 | |||
| c9f921ba5b | |||
| 85a86f3681 | |||
| b8cf035890 | |||
| c966f9302b | |||
| 47e10ba05f | |||
| 199074f10b | |||
| 4741b36003 | |||
| c3673b76b6 | |||
| d0f5838cac | |||
| 5c0152d234 | |||
| c6796e782a | |||
| 2d7f2904a8 | |||
| 6bb862e6e5 | |||
| 083d52d3a5 | |||
| 69c811854c | |||
| adcd336a16 | |||
| 4cd7e565eb | |||
| cf3b740907 | |||
| 297a56e7d6 | |||
| ee76972667 | |||
| 005e092344 | |||
| ffbc3beaf7 | |||
| 506987c164 | |||
| a807a39b09 | |||
| 40a673a418 | |||
| 9a4ecdd073 | |||
| d24a3054c1 | |||
| d1bc55e556 | |||
| f0319c4446 | |||
| 221587eff9 | |||
| 9ac3295127 | |||
| c5dde92023 | |||
| f91be707d9 | |||
| 7fe9303d5e | |||
| 33388f59ee | |||
| 3e34b94ec5 | |||
| 128dc14459 | |||
| d6e75ae2ea | |||
| 6f728ad146 | |||
| b342f7b1cb | |||
| 5b0829eac4 | |||
| f7825ed740 | |||
| 3d88f23e88 | |||
| efaa02ae20 | |||
| 396b6d210b | |||
| 594bc9bc4f | |||
| e4a87c3941 | |||
| 3ba6db7f83 | |||
| b37ee3f94c | |||
| da2fc876d4 | |||
| 4c6aa09c12 | |||
| 88996012d7 | |||
| cb2c9dece3 | |||
| d6a3341944 | |||
| bb39ed567f | |||
| 548118e13e | |||
| 3ecb9b2994 | |||
| 7de03b565a | |||
| ba121c6479 | |||
| 0924c7ba00 | |||
| a0e66ec8e2 | |||
| d515e581b5 | |||
| 65e05066ea | |||
| 4aa7a85f6b | |||
| 46bcd35375 | |||
| 603a6a0887 | |||
| cd397b1d15 | |||
| d860a03aaa | |||
| 5d56e7eeed | |||
| b12968a3ab | |||
| 41ca21416e | |||
| 088af03276 | |||
| 9e69bb6195 | |||
| 8f968de567 | |||
| a14cf2c004 | |||
| dfc7ca20bf | |||
| 3987e21804 | |||
| a355bb1bcd | |||
| 94b55eb245 | |||
| 076cd05388 | |||
| 462b08911d | |||
| 9050faa239 | |||
| 04e08a8873 | |||
| 87c8a15fe6 | |||
| 5544a08add | |||
| ef4572e0a6 | |||
| b319386274 |
@@ -1,3 +1,17 @@
|
||||
.DS_Store
|
||||
node_modules
|
||||
dist
|
||||
|
||||
.gitea/
|
||||
.astro/
|
||||
.idea/
|
||||
|
||||
*/dist/
|
||||
*/build/
|
||||
*/node_modules/
|
||||
*/playwright-report/
|
||||
*/test-results/
|
||||
|
||||
.gitignore
|
||||
Dockerfile
|
||||
Makefile
|
||||
new-words.txt
|
||||
README.md
|
||||
7
.editorconfig
Normal file
@@ -0,0 +1,7 @@
|
||||
[*]
|
||||
charset = utf-8
|
||||
insert_final_newline = true
|
||||
end_of_line = lf
|
||||
indent_style = space
|
||||
indent_size = 2
|
||||
max_line_length = 80
|
||||
113
.gitea/workflows/build-production.yaml
Normal file
@@ -0,0 +1,113 @@
|
||||
name: Build and Test - Production
|
||||
on:
|
||||
push:
|
||||
branches: [main]
|
||||
|
||||
jobs:
|
||||
test:
|
||||
runs-on: ubuntu-latest
|
||||
outputs:
|
||||
repo_name: ${{ steps.project_metadata.outputs.REPO_NAME }}
|
||||
repo_version_hash: ${{ steps.project_metadata.outputs.REPO_VERSION_HASH }}
|
||||
project_version: ${{ steps.project_metadata.outputs.PROJECT_VERSION }}
|
||||
steps:
|
||||
- name: Checkout Repository
|
||||
uses: actions/checkout@v5
|
||||
|
||||
- name: Setup Node Environment
|
||||
uses: actions/setup-node@v6
|
||||
with:
|
||||
node-version: ">=22.20"
|
||||
|
||||
- name: Setup Project Dependencies
|
||||
run: |
|
||||
npm ci
|
||||
npx playwright install --with-deps
|
||||
|
||||
- name: Code Formatting Check
|
||||
run: npx prettier . --check
|
||||
|
||||
- name: Spelling Check
|
||||
run: npx cspell .
|
||||
|
||||
- name: Build Project
|
||||
run: npm run build
|
||||
|
||||
- name: Run Unit Tests
|
||||
run: npm run test
|
||||
|
||||
- name: Run E2E Tests
|
||||
run: npm run e2e-test
|
||||
|
||||
- name: Set Project Metadata
|
||||
id: project_metadata
|
||||
run: |
|
||||
echo REPO_NAME=$(echo ${GITHUB_REPOSITORY} | awk -F"/" '{print $2}') >> $GITHUB_OUTPUT
|
||||
echo REPO_VERSION_HASH=$(git describe --tags --always | sed 's/^v//') >> $GITHUB_OUTPUT
|
||||
|
||||
build_and_push:
|
||||
runs-on: ubuntu-latest
|
||||
needs: test
|
||||
steps:
|
||||
- name: Checkout caperren-com Repository
|
||||
uses: actions/checkout@v5
|
||||
with:
|
||||
path: caperren-com
|
||||
|
||||
- name: Login to Docker Registry
|
||||
uses: docker/login-action@v3
|
||||
with:
|
||||
registry: 192.168.1.36:30008
|
||||
username: ${{ secrets.REGISTRY_USERNAME }}
|
||||
password: ${{ secrets.ACTIONS_TOKEN }}
|
||||
|
||||
- name: Set up Docker Buildx
|
||||
uses: docker/setup-buildx-action@v3
|
||||
with:
|
||||
buildkitd-config-inline: |
|
||||
[registry."192.168.1.36:30008"]
|
||||
http = true
|
||||
|
||||
- name: Build and Push
|
||||
uses: docker/build-push-action@v6
|
||||
with:
|
||||
context: caperren-com
|
||||
push: true
|
||||
tags: |
|
||||
192.168.1.36:30008/caperren/${{ needs.test.outputs.repo_name }}:${{ needs.test.outputs.repo_version_hash }}
|
||||
192.168.1.36:30008/caperren/caperren-com:latest
|
||||
build-args: |
|
||||
REPO_VERSION_HASH=${{ needs.test.outputs.repo_version_hash }}
|
||||
BUILD_ENVIRONMENT=production
|
||||
|
||||
deploy_production:
|
||||
runs-on: ubuntu-latest
|
||||
needs: test
|
||||
steps:
|
||||
- name: Pull New Image For App
|
||||
run: |
|
||||
curl -k -X 'POST' \
|
||||
'https://caperren.com:444/api/v2.0/app/pull_images' \
|
||||
-H 'accept: */*' \
|
||||
-H 'Authorization: Bearer ${{ secrets.TRUENAS_CAPERRENCOM_API_KEY }}' \
|
||||
-H 'Content-Type: application/json' \
|
||||
-d '{
|
||||
"name": "caperren-com",
|
||||
"options": {}
|
||||
}'
|
||||
- name: Stop App
|
||||
run: |
|
||||
curl -k -X 'POST' \
|
||||
'https://caperren.com:444/api/v2.0/app/stop' \
|
||||
-H 'accept: */*' \
|
||||
-H 'Authorization: Bearer ${{ secrets.TRUENAS_CAPERRENCOM_API_KEY }}' \
|
||||
-H 'Content-Type: application/json' \
|
||||
-d '"caperren-com"'
|
||||
- name: Start App
|
||||
run: |
|
||||
curl -k -X 'POST' \
|
||||
'https://caperren.com:444/api/v2.0/app/start' \
|
||||
-H 'accept: */*' \
|
||||
-H 'Authorization: Bearer ${{ secrets.TRUENAS_CAPERRENCOM_API_KEY }}' \
|
||||
-H 'Content-Type: application/json' \
|
||||
-d '"caperren-com"'
|
||||
113
.gitea/workflows/build-staging.yaml
Normal file
@@ -0,0 +1,113 @@
|
||||
name: Build and Test - Staging
|
||||
on:
|
||||
pull_request:
|
||||
types: [opened, synchronize, reopened]
|
||||
|
||||
jobs:
|
||||
test:
|
||||
runs-on: ubuntu-latest
|
||||
outputs:
|
||||
repo_name: ${{ steps.project_metadata.outputs.REPO_NAME }}
|
||||
repo_version_hash: ${{ steps.project_metadata.outputs.REPO_VERSION_HASH }}
|
||||
project_version: ${{ steps.project_metadata.outputs.PROJECT_VERSION }}
|
||||
steps:
|
||||
- name: Checkout Repository
|
||||
uses: actions/checkout@v5
|
||||
|
||||
- name: Setup Node Environment
|
||||
uses: actions/setup-node@v6
|
||||
with:
|
||||
node-version: ">=22.20"
|
||||
|
||||
- name: Setup Project Dependencies
|
||||
run: |
|
||||
npm ci
|
||||
npx playwright install --with-deps
|
||||
|
||||
- name: Code Formatting Check
|
||||
run: npx prettier . --check
|
||||
|
||||
- name: Spelling Check
|
||||
run: npx cspell .
|
||||
|
||||
- name: Build Project
|
||||
run: npm run build
|
||||
|
||||
- name: Run Unit Tests
|
||||
run: npm run test
|
||||
|
||||
- name: Run E2E Tests
|
||||
run: npm run e2e-test
|
||||
|
||||
- name: Set Project Metadata
|
||||
id: project_metadata
|
||||
run: |
|
||||
echo REPO_NAME=$(echo ${GITHUB_REPOSITORY} | awk -F"/" '{print $2}') >> $GITHUB_OUTPUT
|
||||
echo REPO_VERSION_HASH=$(git describe --tags --always | sed 's/^v//') >> $GITHUB_OUTPUT
|
||||
|
||||
build_and_push:
|
||||
runs-on: ubuntu-latest
|
||||
needs: test
|
||||
steps:
|
||||
- name: Checkout caperren-com Repository
|
||||
uses: actions/checkout@v5
|
||||
with:
|
||||
path: caperren-com
|
||||
|
||||
- name: Login to Docker Registry
|
||||
uses: docker/login-action@v3
|
||||
with:
|
||||
registry: 192.168.1.36:30008
|
||||
username: ${{ secrets.REGISTRY_USERNAME }}
|
||||
password: ${{ secrets.ACTIONS_TOKEN }}
|
||||
|
||||
- name: Set up Docker Buildx
|
||||
uses: docker/setup-buildx-action@v3
|
||||
with:
|
||||
buildkitd-config-inline: |
|
||||
[registry."192.168.1.36:30008"]
|
||||
http = true
|
||||
|
||||
- name: Build and Push
|
||||
uses: docker/build-push-action@v6
|
||||
with:
|
||||
context: caperren-com
|
||||
push: true
|
||||
tags: |
|
||||
192.168.1.36:30008/caperren/caperren-com:latest-staging
|
||||
build-args: |
|
||||
REPO_VERSION_HASH=${{ needs.test.outputs.repo_version_hash }}
|
||||
BUILD_ENVIRONMENT=staging
|
||||
|
||||
deploy_staging:
|
||||
runs-on: ubuntu-latest
|
||||
needs: test
|
||||
steps:
|
||||
- name: Pull New Image For App
|
||||
run: |
|
||||
curl -k -X 'POST' \
|
||||
'https://caperren.com:444/api/v2.0/app/pull_images' \
|
||||
-H 'accept: */*' \
|
||||
-H 'Authorization: Bearer ${{ secrets.TRUENAS_CAPERRENCOM_API_KEY }}' \
|
||||
-H 'Content-Type: application/json' \
|
||||
-d '{
|
||||
"name": "caperren-com-stg",
|
||||
"options": {}
|
||||
}'
|
||||
|
||||
- name: Stop App
|
||||
run: |
|
||||
curl -k -X 'POST' \
|
||||
'https://caperren.com:444/api/v2.0/app/stop' \
|
||||
-H 'accept: */*' \
|
||||
-H 'Authorization: Bearer ${{ secrets.TRUENAS_CAPERRENCOM_API_KEY }}' \
|
||||
-H 'Content-Type: application/json' \
|
||||
-d '"caperren-com-stg"'
|
||||
- name: Start App
|
||||
run: |
|
||||
curl -k -X 'POST' \
|
||||
'https://caperren.com:444/api/v2.0/app/start' \
|
||||
-H 'accept: */*' \
|
||||
-H 'Authorization: Bearer ${{ secrets.TRUENAS_CAPERRENCOM_API_KEY }}' \
|
||||
-H 'Content-Type: application/json' \
|
||||
-d '"caperren-com-stg"'
|
||||
@@ -1,42 +0,0 @@
|
||||
name: Build and Test
|
||||
run-name: ${{ gitea.actor }} is triggered a new
|
||||
on: [ push ]
|
||||
|
||||
jobs:
|
||||
build_and_push:
|
||||
runs-on: ubuntu-latest
|
||||
steps:
|
||||
- name: Checkout Repository
|
||||
uses: actions/checkout@v4
|
||||
|
||||
- name: Login to Docker Registry
|
||||
uses: docker/login-action@v3
|
||||
with:
|
||||
registry: gitea.perren.cloud
|
||||
username: ${{ secrets.REGISTRY_USERNAME }}
|
||||
password: ${{ secrets.REGISTRY_TOKEN }}
|
||||
|
||||
- name: Set up Docker Buildx
|
||||
uses: docker/setup-buildx-action@v3
|
||||
|
||||
- name: Build and Push
|
||||
uses: docker/build-push-action@v5
|
||||
with:
|
||||
context: .
|
||||
push: true
|
||||
tags: gitea.perren.cloud/caperren/caperren-com:latest
|
||||
test:
|
||||
runs-on: ubuntu-latest
|
||||
steps:
|
||||
- run: echo "Tests would go here"
|
||||
# - run: echo "🎉 The job was automatically triggered by a ${{ gitea.event_name }} event."
|
||||
# - run: echo "🐧 This job is now running on a ${{ runner.os }} server hosted by Gitea!"
|
||||
# - run: echo "🔎 The name of your branch is ${{ gitea.ref }} and your repository is ${{ gitea.repository }}."
|
||||
# - name: Check out repository code
|
||||
# uses: actions/checkout@v4
|
||||
# - run: echo "💡 The ${{ gitea.repository }} repository has been cloned to the runner."
|
||||
# - run: echo "🖥️ The workflow is now ready to test your code on the runner."
|
||||
# - name: List files in the repository
|
||||
# run: |
|
||||
# ls ${{ gitea.workspace }}
|
||||
# - run: echo "🍏 This job's status is ${{ job.status }}."
|
||||
10
.gitignore
vendored
@@ -22,3 +22,13 @@ pnpm-debug.log*
|
||||
|
||||
# jetbrains setting folder
|
||||
.idea/
|
||||
|
||||
# Playwright
|
||||
/test-results/
|
||||
/playwright-report/
|
||||
/blob-report/
|
||||
/playwright/.cache/
|
||||
/playwright/.auth/
|
||||
|
||||
# Local temporary storage files
|
||||
new-words.txt
|
||||
|
||||
34
.prettierignore
Normal file
@@ -0,0 +1,34 @@
|
||||
# build output
|
||||
dist/
|
||||
|
||||
# generated types
|
||||
.astro/
|
||||
|
||||
# dependencies
|
||||
node_modules/
|
||||
|
||||
# logs
|
||||
npm-debug.log*
|
||||
yarn-debug.log*
|
||||
yarn-error.log*
|
||||
pnpm-debug.log*
|
||||
|
||||
# environment variables
|
||||
.env
|
||||
.env.production
|
||||
|
||||
# macOS-specific files
|
||||
.DS_Store
|
||||
|
||||
# jetbrains setting folder
|
||||
.idea/
|
||||
|
||||
# Playwright
|
||||
/test-results/
|
||||
/playwright-report/
|
||||
/blob-report/
|
||||
/playwright/.cache/
|
||||
/playwright/.auth/
|
||||
|
||||
# Local temporary storage files
|
||||
new-words.txt
|
||||
29
.prettierrc
Normal file
@@ -0,0 +1,29 @@
|
||||
{
|
||||
"astroOrganizeImportsMode": "All",
|
||||
"importOrder": [
|
||||
"^@core/(.*)$",
|
||||
"^@server/(.*)$",
|
||||
"^@ui/(.*)$",
|
||||
"^@layouts/(.*)$",
|
||||
"^@components/(.*)$",
|
||||
"^@interfaces/(.*)$",
|
||||
"^@assets/(.*)$",
|
||||
"^[./]"
|
||||
],
|
||||
"importOrderSeparation": true,
|
||||
"importOrderSortSpecifiers": true,
|
||||
"plugins": [
|
||||
"prettier-plugin-astro",
|
||||
"prettier-plugin-tailwindcss",
|
||||
"@trivago/prettier-plugin-sort-imports",
|
||||
"prettier-plugin-astro-organize-imports"
|
||||
],
|
||||
"overrides": [
|
||||
{
|
||||
"files": "*.astro",
|
||||
"options": {
|
||||
"parser": "astro"
|
||||
}
|
||||
}
|
||||
]
|
||||
}
|
||||
45
Dockerfile
@@ -5,21 +5,50 @@ WORKDIR /app
|
||||
# Therefore, the `-deps` steps will be skipped if only the source code changes.
|
||||
COPY package.json package-lock.json tsconfig.json astro.config.mjs ./
|
||||
|
||||
CMD [ "/bin/bash" ]
|
||||
|
||||
FROM base AS prod-deps
|
||||
RUN npm install --omit=dev
|
||||
|
||||
FROM base AS build-deps
|
||||
RUN npm install
|
||||
FROM prod-deps AS test-base
|
||||
|
||||
FROM build-deps AS build
|
||||
COPY . .
|
||||
RUN npm ci
|
||||
RUN npx playwright install --with-deps
|
||||
|
||||
FROM prod-deps AS build
|
||||
|
||||
COPY --exclude=test \
|
||||
--exclude=test-e2e \
|
||||
--exclude=playwright.config.ts \
|
||||
--exclude=vitest.config.ts \
|
||||
--exclude=.prettierrc \
|
||||
--exclude=.prettierignore \
|
||||
--exclude=cspell.json \
|
||||
--exclude=project-words.txt \
|
||||
. .
|
||||
|
||||
ARG REPO_VERSION_HASH
|
||||
ARG BUILD_ENVIRONMENT
|
||||
|
||||
RUN echo "PUBLIC_REPO_VERSION_HASH=\"${REPO_VERSION_HASH}\" \n\
|
||||
PUBLIC_BUILD_ENVIRONMENT=\"${BUILD_ENVIRONMENT}\"" >> .env
|
||||
RUN npm run build
|
||||
|
||||
FROM httpd:latest AS runtime
|
||||
WORKDIR /usr/local/apache2/htdocs
|
||||
FROM test-base AS test
|
||||
|
||||
RUN rm index.html
|
||||
COPY . .
|
||||
COPY --from=build /app/dist /app/dist
|
||||
|
||||
COPY --from=build /app/dist .
|
||||
RUN npx prettier . --check
|
||||
RUN npx cspell .
|
||||
RUN npm run test
|
||||
RUN npm run e2e-test
|
||||
|
||||
FROM nginx:alpine AS runtime
|
||||
|
||||
COPY ./nginx/nginx.conf /etc/nginx/nginx.conf
|
||||
COPY --from=build /app/dist /usr/share/nginx/html
|
||||
|
||||
RUN chown -R nginx:nginx /usr/share/nginx/html
|
||||
|
||||
EXPOSE 80
|
||||
100
Makefile
Normal file
@@ -0,0 +1,100 @@
|
||||
# Makefile for caperren.com
|
||||
|
||||
.PHONY: \
|
||||
install \
|
||||
fix \
|
||||
astro_upgrade \
|
||||
build \
|
||||
dev \
|
||||
dev-hosted \
|
||||
test \
|
||||
_spelling-generate-new-words \
|
||||
spelling-find-new-words \
|
||||
spelling-add-new-words \
|
||||
spelling-check \
|
||||
cleanup-check \
|
||||
cleanup-code \
|
||||
convert_video \
|
||||
convert_video_times \
|
||||
generate_asset_imports
|
||||
|
||||
default: dev
|
||||
|
||||
install:
|
||||
npm install
|
||||
|
||||
fix:
|
||||
npm audit fix
|
||||
|
||||
astro_upgrade:
|
||||
npx @astrojs/upgrade
|
||||
|
||||
build:
|
||||
npm run build
|
||||
|
||||
dev:
|
||||
npm run dev
|
||||
|
||||
dev-hosted:
|
||||
npm run dev-hosted
|
||||
|
||||
test: spelling-check
|
||||
@npx playwright install --with-deps
|
||||
npm run test --ui
|
||||
npx playwright test --ui
|
||||
|
||||
_spelling-generate-new-words:
|
||||
@cspell --words-only --unique . 2>/dev/null | sort --ignore-case -o new-words.txt
|
||||
|
||||
spelling-find-new-words: _spelling-generate-new-words
|
||||
@echo "Found the following new words:"
|
||||
@cat new-words.txt
|
||||
@rm -f new-words.txt
|
||||
|
||||
spelling-add-new-words: _spelling-generate-new-words
|
||||
@echo "Adding to project-words.txt"
|
||||
@cat new-words.txt >> project-words.txt
|
||||
@rm -f new-words.txt
|
||||
@cat project-words.txt | sort --ignore-case -o project-words.txt
|
||||
|
||||
spelling-check:
|
||||
npx cspell .
|
||||
|
||||
cleanup-check:
|
||||
npx prettier . --check
|
||||
|
||||
cleanup-code:
|
||||
npx prettier . --write
|
||||
|
||||
convert_video:
|
||||
ffmpeg \
|
||||
-init_hw_device vaapi=va:/dev/dri/renderD128 \
|
||||
-filter_hw_device va \
|
||||
-i $(input) \
|
||||
-vf 'format=nv12,hwupload,scale_vaapi=-2:720' \
|
||||
-c:v h264_vaapi \
|
||||
-rc_mode CQP \
|
||||
-qp 28 \
|
||||
-an \
|
||||
$(extra_args) \
|
||||
$(output)
|
||||
|
||||
convert_video_times:
|
||||
ffmpeg \
|
||||
-init_hw_device vaapi=va:/dev/dri/renderD128 \
|
||||
-filter_hw_device va \
|
||||
-i $(input) \
|
||||
-ss $(start) \
|
||||
-to $(end) \
|
||||
-vf 'format=nv12,hwupload,scale_vaapi=-2:720' \
|
||||
-c:v h264_vaapi \
|
||||
-rc_mode CQP \
|
||||
-qp 28 \
|
||||
-an \
|
||||
$(output)
|
||||
|
||||
generate_asset_imports:
|
||||
@for assets_path in `find "src/assets/${assets_relative_path}" -maxdepth 1 -type f -printf "%f\n"`; do \
|
||||
without_extension=$${assets_path/%.*}; \
|
||||
echo "import $${without_extension//-/_} from \"@assets/${assets_relative_path}/$$assets_path\";"; \
|
||||
done;
|
||||
49
README.md
@@ -1,48 +1,3 @@
|
||||
# Astro Starter Kit: Basics
|
||||
# Corwin Perren's Personal Portfolio Website
|
||||
|
||||
```sh
|
||||
npm create astro@latest -- --template basics
|
||||
```
|
||||
|
||||
[](https://stackblitz.com/github/withastro/astro/tree/latest/examples/basics)
|
||||
[](https://codesandbox.io/p/sandbox/github/withastro/astro/tree/latest/examples/basics)
|
||||
[](https://codespaces.new/withastro/astro?devcontainer_path=.devcontainer/basics/devcontainer.json)
|
||||
|
||||
> 🧑🚀 **Seasoned astronaut?** Delete this file. Have fun!
|
||||
|
||||

|
||||
|
||||
## 🚀 Project Structure
|
||||
|
||||
Inside of your Astro project, you'll see the following folders and files:
|
||||
|
||||
```text
|
||||
/
|
||||
├── public/
|
||||
│ └── favicon.svg
|
||||
├── src/
|
||||
│ ├── layouts/
|
||||
│ │ └── Layout.astro
|
||||
│ └── pages/
|
||||
│ └── index.astro
|
||||
└── package.json
|
||||
```
|
||||
|
||||
To learn more about the folder structure of an Astro project, refer to [our guide on project structure](https://docs.astro.build/en/basics/project-structure/).
|
||||
|
||||
## 🧞 Commands
|
||||
|
||||
All commands are run from the root of the project, from a terminal:
|
||||
|
||||
| Command | Action |
|
||||
| :------------------------ | :----------------------------------------------- |
|
||||
| `npm install` | Installs dependencies |
|
||||
| `npm run dev` | Starts local dev server at `localhost:4321` |
|
||||
| `npm run build` | Build your production site to `./dist/` |
|
||||
| `npm run preview` | Preview your build locally, before deploying |
|
||||
| `npm run astro ...` | Run CLI commands like `astro add`, `astro check` |
|
||||
| `npm run astro -- --help` | Get help using the Astro CLI |
|
||||
|
||||
## 👀 Want to learn more?
|
||||
|
||||
Feel free to check [our documentation](https://docs.astro.build) or jump into our [Discord server](https://astro.build/chat).
|
||||
Check the Makefile and/or package.json for the commands needed to build and run this project.
|
||||
|
||||
@@ -1,11 +1,32 @@
|
||||
// @ts-check
|
||||
import { defineConfig } from 'astro/config';
|
||||
import rehypeAstroRelativeMarkdownLinks from "astro-rehype-relative-markdown-links";
|
||||
import sitemap from "@astrojs/sitemap";
|
||||
import tailwindcss from "@tailwindcss/vite";
|
||||
import { defineConfig } from "astro/config";
|
||||
|
||||
// We don't have access to short imports this early in the build chain
|
||||
// noinspection ES6PreferShortImport
|
||||
import { getPaths, siteLayout } from "./src/data/site-layout.ts";
|
||||
|
||||
const disabledPaths = getPaths(siteLayout, [], true);
|
||||
|
||||
// https://astro.build/config
|
||||
|
||||
export default defineConfig({
|
||||
integrations: [],
|
||||
markdown: {
|
||||
rehypePlugins: [rehypeAstroRelativeMarkdownLinks],
|
||||
},
|
||||
site: "https://caperren.com",
|
||||
trailingSlash: "never",
|
||||
prefetch: {
|
||||
prefetchAll: true,
|
||||
},
|
||||
integrations: [
|
||||
sitemap({
|
||||
filter: (pagePath) =>
|
||||
!disabledPaths.some((disabledPath) => pagePath.includes(disabledPath)),
|
||||
}),
|
||||
],
|
||||
vite: {
|
||||
plugins: [
|
||||
// @ts-ignore
|
||||
tailwindcss(),
|
||||
],
|
||||
},
|
||||
});
|
||||
|
||||
23
cspell.json
Normal file
@@ -0,0 +1,23 @@
|
||||
{
|
||||
"$schema": "https://raw.githubusercontent.com/streetsidesoftware/cspell/main/cspell.schema.json",
|
||||
"version": "0.2",
|
||||
"dictionaryDefinitions": [
|
||||
{
|
||||
"name": "project-words",
|
||||
"path": "./project-words.txt",
|
||||
"addWords": true
|
||||
}
|
||||
],
|
||||
"dictionaries": ["project-words"],
|
||||
"ignorePaths": [
|
||||
".astro",
|
||||
".idea",
|
||||
"dist",
|
||||
"node_modules",
|
||||
"playwright-report",
|
||||
"test-results",
|
||||
"new-words.txt",
|
||||
"playwright.config.ts",
|
||||
"/project-words.txt"
|
||||
]
|
||||
}
|
||||
35
nginx/nginx.conf
Normal file
@@ -0,0 +1,35 @@
|
||||
worker_processes 4;
|
||||
|
||||
events {
|
||||
worker_connections 1024;
|
||||
}
|
||||
|
||||
http {
|
||||
proxy_cache_path /var/cache/nginx levels=1:2 keys_zone=my_cache:10m max_size=1g inactive=60m use_temp_path=off;
|
||||
|
||||
server {
|
||||
listen 80;
|
||||
server_name _;
|
||||
|
||||
root /usr/share/nginx/html;
|
||||
index index.html index.htm;
|
||||
include /etc/nginx/mime.types;
|
||||
|
||||
gzip on;
|
||||
gzip_proxied any;
|
||||
gzip_types text/plain text/css application/json application/javascript application/x-javascript text/xml application/xml application/xml+rss text/javascript;
|
||||
|
||||
error_page 404 /404.html;
|
||||
location = /404.html {
|
||||
root /usr/share/nginx/html;
|
||||
internal;
|
||||
}
|
||||
|
||||
location / {
|
||||
proxy_cache my_cache;
|
||||
proxy_cache_valid 200 1h;
|
||||
|
||||
try_files $uri $uri/index.html =404;
|
||||
}
|
||||
}
|
||||
}
|
||||
4886
package-lock.json
generated
30
package.json
@@ -1,15 +1,35 @@
|
||||
{
|
||||
"name": "my-project",
|
||||
"name": "caperren-com",
|
||||
"type": "module",
|
||||
"version": "0.0.1",
|
||||
"scripts": {
|
||||
"dev": "astro dev",
|
||||
"dev-hosted": "astro dev --host",
|
||||
"build": "astro build",
|
||||
"preview": "astro preview",
|
||||
"astro": "astro"
|
||||
"astro": "astro",
|
||||
"test": "vitest",
|
||||
"e2e-test": "playwright test"
|
||||
},
|
||||
"dependencies": {
|
||||
"astro": "^5.4.2",
|
||||
"astro-rehype-relative-markdown-links": "^0.18.1"
|
||||
"@astrojs/sitemap": "^3.6.0",
|
||||
"@tailwindcss/vite": "^4.1.11",
|
||||
"astro": "^5.16.3",
|
||||
"flowbite": "^3.1.2",
|
||||
"leader-line-new": "^1.1.9",
|
||||
"luxon": "^3.7.2",
|
||||
"tailwindcss": "^4.1.11",
|
||||
"uuid": "^13.0.0"
|
||||
},
|
||||
"devDependencies": {
|
||||
"@playwright/test": "^1.56.1",
|
||||
"@trivago/prettier-plugin-sort-imports": "^6.0.0",
|
||||
"@types/luxon": "^3.7.1",
|
||||
"@types/node": "^24.10.0",
|
||||
"cspell": "^9.3.2",
|
||||
"prettier": "3.7.3",
|
||||
"prettier-plugin-astro": "0.14.1",
|
||||
"prettier-plugin-astro-organize-imports": "^0.4.11",
|
||||
"prettier-plugin-tailwindcss": "0.7.1",
|
||||
"vitest": "^4.0.7"
|
||||
}
|
||||
}
|
||||
|
||||
80
playwright.config.ts
Normal file
@@ -0,0 +1,80 @@
|
||||
import { defineConfig, devices } from "@playwright/test";
|
||||
|
||||
/**
|
||||
* Read environment variables from file.
|
||||
* https://github.com/motdotla/dotenv
|
||||
*/
|
||||
// import dotenv from 'dotenv';
|
||||
// import path from 'path';
|
||||
// dotenv.config({ path: path.resolve(__dirname, '.env') });
|
||||
|
||||
/**
|
||||
* See https://playwright.dev/docs/test-configuration.
|
||||
*/
|
||||
export default defineConfig({
|
||||
testDir: "./test-e2e",
|
||||
/* Run tests in files in parallel */
|
||||
fullyParallel: true,
|
||||
/* Fail the build on CI if you accidentally left test.only in the source code. */
|
||||
forbidOnly: !!process.env.CI,
|
||||
/* Retry on CI only */
|
||||
retries: process.env.CI ? 2 : 0,
|
||||
/* Opt out of parallel tests on CI. */
|
||||
workers: process.env.CI ? 1 : undefined,
|
||||
/* Reporter to use. See https://playwright.dev/docs/test-reporters */
|
||||
reporter: "html",
|
||||
/* Shared settings for all the projects below. See https://playwright.dev/docs/api/class-testoptions. */
|
||||
use: {
|
||||
/* Base URL to use in actions like `await page.goto('')`. */
|
||||
baseURL: "http://localhost:4321",
|
||||
|
||||
/* Collect trace when retrying the failed test. See https://playwright.dev/docs/trace-viewer */
|
||||
trace: "on-first-retry",
|
||||
},
|
||||
|
||||
/* Configure projects for major browsers */
|
||||
projects: [
|
||||
{
|
||||
name: "chromium",
|
||||
use: { ...devices["Desktop Chrome"] },
|
||||
},
|
||||
|
||||
{
|
||||
name: "firefox",
|
||||
use: { ...devices["Desktop Firefox"] },
|
||||
},
|
||||
|
||||
{
|
||||
name: "webkit",
|
||||
use: { ...devices["Desktop Safari"] },
|
||||
},
|
||||
|
||||
/* Test against mobile viewports. */
|
||||
{
|
||||
name: "Mobile Chrome",
|
||||
use: { ...devices["Pixel 5"] },
|
||||
},
|
||||
{
|
||||
name: "Mobile Safari",
|
||||
use: { ...devices["iPhone 12"] },
|
||||
},
|
||||
|
||||
/* Test against branded browsers. */
|
||||
// {
|
||||
// name: 'Microsoft Edge',
|
||||
// use: { ...devices['Desktop Edge'], channel: 'msedge' },
|
||||
// },
|
||||
// {
|
||||
// name: 'Google Chrome',
|
||||
// use: { ...devices['Desktop Chrome'], channel: 'chrome' },
|
||||
// },
|
||||
],
|
||||
|
||||
/* Run your local dev server before starting the tests */
|
||||
webServer: {
|
||||
command: "npm run preview",
|
||||
url: "http://localhost:4321",
|
||||
timeout: 120 * 1000,
|
||||
reuseExistingServer: !process.env.CI,
|
||||
},
|
||||
});
|
||||
96
project-words.txt
Normal file
@@ -0,0 +1,96 @@
|
||||
ADCP
|
||||
Altium
|
||||
ASSEM
|
||||
astrojs
|
||||
Atmel
|
||||
automations
|
||||
barebones
|
||||
beaglebone
|
||||
Bitwarden
|
||||
Candian
|
||||
caperren
|
||||
CEOAS
|
||||
COMSC
|
||||
Concours
|
||||
CONSERV
|
||||
Corwin
|
||||
dangerousthings
|
||||
dechorionation
|
||||
Dechorionator
|
||||
dechorionators
|
||||
dockerization
|
||||
dockerizing
|
||||
drumheller
|
||||
ebox
|
||||
ELMI
|
||||
fhhs
|
||||
flowbite
|
||||
flowrate
|
||||
gcode
|
||||
gerbers
|
||||
Gitea
|
||||
HDFS
|
||||
headshot
|
||||
Homelab
|
||||
hwupload
|
||||
iceops
|
||||
ITAR
|
||||
Jetson
|
||||
KFSK
|
||||
Labjack
|
||||
leconte
|
||||
Loctite
|
||||
luxon
|
||||
MGMT
|
||||
microcontroller
|
||||
microcontroller's
|
||||
Micropumps
|
||||
Millis
|
||||
modbus
|
||||
Mokai
|
||||
Multimeters
|
||||
nixos
|
||||
nvme
|
||||
offroad
|
||||
Onshape
|
||||
OSSM
|
||||
OSURC
|
||||
panelized
|
||||
Passthroughs
|
||||
pcbs
|
||||
Perren
|
||||
Perren's
|
||||
Pixhawk
|
||||
Protocase
|
||||
pubpath
|
||||
RFID
|
||||
Rito
|
||||
RSSI
|
||||
SARL
|
||||
SCARA
|
||||
showerheads
|
||||
Shuttlebox
|
||||
simplemotion
|
||||
sinnhuber
|
||||
sitemapindex
|
||||
Smartsheet
|
||||
solderable
|
||||
ssds
|
||||
Starlink
|
||||
steller
|
||||
Steller
|
||||
Tanguay
|
||||
Teamcenter
|
||||
timelapse
|
||||
touchoff
|
||||
triaging
|
||||
trivago
|
||||
Truong
|
||||
Ubiquiti
|
||||
Unstow
|
||||
uuidv
|
||||
vaapi
|
||||
vitest
|
||||
Waterjet
|
||||
Zebrafish
|
||||
zscan
|
||||
BIN
public/16x16-favicon.png
Normal file
|
After Width: | Height: | Size: 308 B |
BIN
public/180x180-favicon.png
Normal file
|
After Width: | Height: | Size: 3.9 KiB |
BIN
public/192x192-favicon.png
Normal file
|
After Width: | Height: | Size: 4.5 KiB |
BIN
public/32x32-favicon.png
Normal file
|
After Width: | Height: | Size: 500 B |
BIN
public/48x48-favicon.png
Normal file
|
After Width: | Height: | Size: 785 B |
BIN
public/512x512-favicon.png
Normal file
|
After Width: | Height: | Size: 18 KiB |
@@ -1,9 +0,0 @@
|
||||
<svg xmlns="http://www.w3.org/2000/svg" fill="none" viewBox="0 0 128 128">
|
||||
<path d="M50.4 78.5a75.1 75.1 0 0 0-28.5 6.9l24.2-65.7c.7-2 1.9-3.2 3.4-3.2h29c1.5 0 2.7 1.2 3.4 3.2l24.2 65.7s-11.6-7-28.5-7L67 45.5c-.4-1.7-1.6-2.8-2.9-2.8-1.3 0-2.5 1.1-2.9 2.7L50.4 78.5Zm-1.1 28.2Zm-4.2-20.2c-2 6.6-.6 15.8 4.2 20.2a17.5 17.5 0 0 1 .2-.7 5.5 5.5 0 0 1 5.7-4.5c2.8.1 4.3 1.5 4.7 4.7.2 1.1.2 2.3.2 3.5v.4c0 2.7.7 5.2 2.2 7.4a13 13 0 0 0 5.7 4.9v-.3l-.2-.3c-1.8-5.6-.5-9.5 4.4-12.8l1.5-1a73 73 0 0 0 3.2-2.2 16 16 0 0 0 6.8-11.4c.3-2 .1-4-.6-6l-.8.6-1.6 1a37 37 0 0 1-22.4 2.7c-5-.7-9.7-2-13.2-6.2Z" />
|
||||
<style>
|
||||
path { fill: #000; }
|
||||
@media (prefers-color-scheme: dark) {
|
||||
path { fill: #FFF; }
|
||||
}
|
||||
</style>
|
||||
</svg>
|
||||
|
Before Width: | Height: | Size: 749 B |
BIN
src/assets/about/headshot.jpg
Normal file
|
After Width: | Height: | Size: 3.2 MiB |
@@ -1 +0,0 @@
|
||||
<svg xmlns="http://www.w3.org/2000/svg" fill="none" width="115" height="48"><path fill="#17191E" d="M7.77 36.35C6.4 35.11 6 32.51 6.57 30.62c.99 1.2 2.35 1.57 3.75 1.78 2.18.33 4.31.2 6.33-.78.23-.12.44-.27.7-.42.18.55.23 1.1.17 1.67a4.56 4.56 0 0 1-1.94 3.23c-.43.32-.9.61-1.34.91-1.38.94-1.76 2.03-1.24 3.62l.05.17a3.63 3.63 0 0 1-1.6-1.38 3.87 3.87 0 0 1-.63-2.1c0-.37 0-.74-.05-1.1-.13-.9-.55-1.3-1.33-1.32a1.56 1.56 0 0 0-1.63 1.26c0 .06-.03.12-.05.2Z"/><path fill="url(#a)" d="M7.77 36.35C6.4 35.11 6 32.51 6.57 30.62c.99 1.2 2.35 1.57 3.75 1.78 2.18.33 4.31.2 6.33-.78.23-.12.44-.27.7-.42.18.55.23 1.1.17 1.67a4.56 4.56 0 0 1-1.94 3.23c-.43.32-.9.61-1.34.91-1.38.94-1.76 2.03-1.24 3.62l.05.17a3.63 3.63 0 0 1-1.6-1.38 3.87 3.87 0 0 1-.63-2.1c0-.37 0-.74-.05-1.1-.13-.9-.55-1.3-1.33-1.32a1.56 1.56 0 0 0-1.63 1.26c0 .06-.03.12-.05.2Z"/><path fill="#17191E" d="M.02 30.31s4.02-1.95 8.05-1.95l3.04-9.4c.11-.45.44-.76.82-.76.37 0 .7.31.82.76l3.04 9.4c4.77 0 8.05 1.95 8.05 1.95L17 11.71c-.2-.56-.53-.91-.98-.91H7.83c-.44 0-.76.35-.97.9L.02 30.31Zm42.37-5.97c0 1.64-2.05 2.62-4.88 2.62-1.85 0-2.5-.45-2.5-1.41 0-1 .8-1.49 2.65-1.49 1.67 0 3.09.03 4.73.23v.05Zm.03-2.04a21.37 21.37 0 0 0-4.37-.36c-5.32 0-7.82 1.25-7.82 4.18 0 3.04 1.71 4.2 5.68 4.2 3.35 0 5.63-.84 6.46-2.92h.14c-.03.5-.05 1-.05 1.4 0 1.07.18 1.16 1.06 1.16h4.15a16.9 16.9 0 0 1-.36-4c0-1.67.06-2.93.06-4.62 0-3.45-2.07-5.64-8.56-5.64-2.8 0-5.9.48-8.26 1.19.22.93.54 2.83.7 4.06 2.04-.96 4.95-1.37 7.2-1.37 3.11 0 3.97.71 3.97 2.15v.57Zm11.37 3c-.56.07-1.33.07-2.12.07-.83 0-1.6-.03-2.12-.1l-.02.58c0 2.85 1.87 4.52 8.45 4.52 6.2 0 8.2-1.64 8.2-4.55 0-2.74-1.33-4.09-7.2-4.39-4.58-.2-4.99-.7-4.99-1.28 0-.66.59-1 3.65-1 3.18 0 4.03.43 4.03 1.35v.2a46.13 46.13 0 0 1 4.24.03l.02-.55c0-3.36-2.8-4.46-8.2-4.46-6.08 0-8.13 1.49-8.13 4.39 0 2.6 1.64 4.23 7.48 4.48 4.3.14 4.77.62 4.77 1.28 0 .7-.7 1.03-3.71 1.03-3.47 0-4.35-.48-4.35-1.47v-.13Zm19.82-12.05a17.5 17.5 0 0 1-6.24 3.48c.03.84.03 2.4.03 3.24l1.5.02c-.02 1.63-.04 3.6-.04 4.9 0 3.04 1.6 5.32 6.58 5.32 2.1 0 3.5-.23 5.23-.6a43.77 43.77 0 0 1-.46-4.13c-1.03.34-2.34.53-3.78.53-2 0-2.82-.55-2.82-2.13 0-1.37 0-2.65.03-3.84 2.57.02 5.13.07 6.64.11-.02-1.18.03-2.9.1-4.04-2.2.04-4.65.07-6.68.07l.07-2.93h-.16Zm13.46 6.04a767.33 767.33 0 0 1 .07-3.18H82.6c.07 1.96.07 3.98.07 6.92 0 2.95-.03 4.99-.07 6.93h5.18c-.09-1.37-.11-3.68-.11-5.65 0-3.1 1.26-4 4.12-4 1.33 0 2.28.16 3.1.46.03-1.16.26-3.43.4-4.43-.86-.25-1.81-.41-2.96-.41-2.46-.03-4.26.98-5.1 3.38l-.17-.02Zm22.55 3.65c0 2.5-1.8 3.66-4.64 3.66-2.81 0-4.61-1.1-4.61-3.66s1.82-3.52 4.61-3.52c2.82 0 4.64 1.03 4.64 3.52Zm4.71-.11c0-4.96-3.87-7.18-9.35-7.18-5.5 0-9.23 2.22-9.23 7.18 0 4.94 3.49 7.59 9.21 7.59 5.77 0 9.37-2.65 9.37-7.6Z"/><defs><linearGradient id="a" x1="6.33" x2="19.43" y1="40.8" y2="34.6" gradientUnits="userSpaceOnUse"><stop stop-color="#D83333"/><stop offset="1" stop-color="#F041FF"/></linearGradient></defs></svg>
|
||||
|
Before Width: | Height: | Size: 2.8 KiB |
@@ -1 +0,0 @@
|
||||
<svg xmlns="http://www.w3.org/2000/svg" width="1440" height="1024" fill="none"><path fill="url(#a)" fill-rule="evenodd" d="M-217.58 475.75c91.82-72.02 225.52-29.38 341.2-44.74C240 415.56 372.33 315.14 466.77 384.9c102.9 76.02 44.74 246.76 90.31 366.31 29.83 78.24 90.48 136.14 129.48 210.23 57.92 109.99 169.67 208.23 155.9 331.77-13.52 121.26-103.42 264.33-224.23 281.37-141.96 20.03-232.72-220.96-374.06-196.99-151.7 25.73-172.68 330.24-325.85 315.72-128.6-12.2-110.9-230.73-128.15-358.76-12.16-90.14 65.87-176.25 44.1-264.57-26.42-107.2-167.12-163.46-176.72-273.45-10.15-116.29 33.01-248.75 124.87-320.79Z" clip-rule="evenodd" style="opacity:.154"/><path fill="url(#b)" fill-rule="evenodd" d="M1103.43 115.43c146.42-19.45 275.33-155.84 413.5-103.59 188.09 71.13 409 212.64 407.06 413.88-1.94 201.25-259.28 278.6-414.96 405.96-130 106.35-240.24 294.39-405.6 265.3-163.7-28.8-161.93-274.12-284.34-386.66-134.95-124.06-436-101.46-445.82-284.6-9.68-180.38 247.41-246.3 413.54-316.9 101.01-42.93 207.83 21.06 316.62 6.61Z" clip-rule="evenodd" style="opacity:.154"/><defs><linearGradient id="b" x1="373" x2="1995.44" y1="1100" y2="118.03" gradientUnits="userSpaceOnUse"><stop stop-color="#D83333"/><stop offset="1" stop-color="#F041FF"/></linearGradient><linearGradient id="a" x1="107.37" x2="1130.66" y1="1993.35" y2="1026.31" gradientUnits="userSpaceOnUse"><stop stop-color="#3245FF"/><stop offset="1" stop-color="#BC52EE"/></linearGradient></defs></svg>
|
||||
|
Before Width: | Height: | Size: 1.4 KiB |
BIN
src/assets/education/fhhs-diploma.jpg
Normal file
|
After Width: | Height: | Size: 3.7 MiB |
BIN
src/assets/education/osu-bs-cs-diploma.jpg
Normal file
|
After Width: | Height: | Size: 5.0 MiB |
|
After Width: | Height: | Size: 3.1 MiB |
|
After Width: | Height: | Size: 2.6 MiB |
|
After Width: | Height: | Size: 4.2 MiB |
|
After Width: | Height: | Size: 4.1 MiB |
|
After Width: | Height: | Size: 2.6 MiB |
|
After Width: | Height: | Size: 5.1 MiB |
|
After Width: | Height: | Size: 2.5 MiB |
|
After Width: | Height: | Size: 4.1 MiB |
|
After Width: | Height: | Size: 5.1 MiB |
|
After Width: | Height: | Size: 6.8 MiB |
|
After Width: | Height: | Size: 5.0 MiB |
|
After Width: | Height: | Size: 2.7 MiB |
|
After Width: | Height: | Size: 3.3 MiB |
|
After Width: | Height: | Size: 3.9 MiB |
|
After Width: | Height: | Size: 851 KiB |
|
After Width: | Height: | Size: 3.9 MiB |
|
After Width: | Height: | Size: 1.2 MiB |
|
After Width: | Height: | Size: 2.6 MiB |
|
After Width: | Height: | Size: 3.9 MiB |
|
After Width: | Height: | Size: 902 KiB |
|
After Width: | Height: | Size: 2.3 MiB |
|
After Width: | Height: | Size: 2.7 MiB |
|
After Width: | Height: | Size: 10 MiB |
|
After Width: | Height: | Size: 1.9 MiB |
|
After Width: | Height: | Size: 3.3 MiB |
|
After Width: | Height: | Size: 10 MiB |
|
After Width: | Height: | Size: 1.9 MiB |
|
After Width: | Height: | Size: 10 MiB |
|
After Width: | Height: | Size: 14 MiB |
|
After Width: | Height: | Size: 12 MiB |
|
After Width: | Height: | Size: 1.2 MiB |
|
After Width: | Height: | Size: 4.7 MiB |
|
After Width: | Height: | Size: 1.8 MiB |
|
After Width: | Height: | Size: 4.0 MiB |
|
After Width: | Height: | Size: 3.5 MiB |
|
After Width: | Height: | Size: 4.0 MiB |
|
After Width: | Height: | Size: 3.1 MiB |
|
After Width: | Height: | Size: 3.6 MiB |
|
After Width: | Height: | Size: 4.2 MiB |
|
After Width: | Height: | Size: 3.7 MiB |
|
After Width: | Height: | Size: 7.7 MiB |
|
After Width: | Height: | Size: 7.3 MiB |
|
After Width: | Height: | Size: 8.3 MiB |
|
After Width: | Height: | Size: 7.6 MiB |
|
After Width: | Height: | Size: 4.4 MiB |
|
After Width: | Height: | Size: 3.5 MiB |
|
After Width: | Height: | Size: 3.8 MiB |
|
After Width: | Height: | Size: 4.1 MiB |
|
After Width: | Height: | Size: 166 KiB |
|
After Width: | Height: | Size: 239 KiB |
|
After Width: | Height: | Size: 3.8 MiB |
|
After Width: | Height: | Size: 3.9 MiB |
|
After Width: | Height: | Size: 4.6 MiB |
|
After Width: | Height: | Size: 4.2 MiB |
|
After Width: | Height: | Size: 4.2 MiB |
|
After Width: | Height: | Size: 4.3 MiB |
|
After Width: | Height: | Size: 4.4 MiB |
|
After Width: | Height: | Size: 4.4 MiB |
|
After Width: | Height: | Size: 6.4 MiB |
|
After Width: | Height: | Size: 7.9 MiB |
|
After Width: | Height: | Size: 8.9 MiB |
|
After Width: | Height: | Size: 8.7 MiB |
|
After Width: | Height: | Size: 7.8 MiB |