Merge branch 'development'

This commit is contained in:
Bob Vandevliet 2024-07-13 13:43:42 +02:00
commit 91edf9733b
10 changed files with 217 additions and 21 deletions

View file

@ -50,13 +50,17 @@ jobs:
name: Compile CSS
run: pnpm run build
-
name: Append version as query arg to asset URLs
name: Append version query arg to asset URLs
env:
VERSION: ${{ steps.metadata.outputs.VERSION }}
run: |
echo "VERSION = $VERSION"
find public -type f -name '*.html' -exec sed -i "s/\"\([^\"?]\+\.css\)\"/\"\1?v=$VERSION\"/g" {} +
find public -type f -name '*.html' -exec sed -i "s/\"\([^\"?]\+\.js\)\"/\"\1?v=$VERSION\"/g" {} +
-
name: Minify HTML
run: |
pnpm html-minifier-terser --collapse-whitespace --collapse-inline-tag-whitespace --minify-css --minify-js --remove-comments --input-dir public --output-dir public --file-ext html
-
name: Copy files to public folder
run: mkdir -p /usr/share/nginx/static/fpv; cp -rf public/* /usr/share/nginx/static/fpv

7
.gitignore vendored
View file

@ -17,9 +17,10 @@ coverage
_docpress
.DS_Store
css
lib
dist
public/**/css/
public/**/js/
lib/
dist/
tsconfig.tsbuildinfo
# Visual Studio Code configs

View file

@ -6,9 +6,10 @@
"license": "MIT",
"packageManager": "pnpm@9.2.0+sha1.886364ebd6dae009284bebc56ed4296bb6dd557a",
"scripts": {
"build": "npm-run-all css-compile css-prefix",
"css-compile": "sass --style compressed --source-map --embed-sources --no-error-css --load-path=node_modules scss/:public/assets/css/",
"css-prefix": "postcss --replace public/assets/css/styles.css --use autoprefixer --map",
"build": "npm-run-all css-compile css-prefix js-minify",
"css-compile": "sass --style compressed --source-map --embed-sources --no-error-css --load-path=node_modules src/scss/styles.scss:public/assets/css/styles.min.css",
"css-prefix": "postcss --replace public/assets/css/styles.min.css --use autoprefixer --map",
"js-minify": "terser --compress --mangle --source-map --output public/assets/js/scripts.min.js -- src/js/scripts.js",
"server": "docker compose up -d",
"start": "npm-run-all build server"
},
@ -18,10 +19,13 @@
"devDependencies": {
"@eslint/js": "^8",
"autoprefixer": "^10",
"clean-css": "^5",
"eslint": "^8",
"html-minifier-terser": "^7",
"npm-run-all": "^4",
"postcss": "^8",
"postcss-cli": "^11",
"sass": "^1"
"sass": "^1",
"terser": "^5"
}
}

181
pnpm-lock.yaml generated
View file

@ -18,9 +18,15 @@ importers:
autoprefixer:
specifier: ^10
version: 10.4.19(postcss@8.4.38)
clean-css:
specifier: ^5
version: 5.3.3
eslint:
specifier: ^8
version: 8.57.0
html-minifier-terser:
specifier: ^7
version: 7.2.0
npm-run-all:
specifier: ^4
version: 4.1.5
@ -33,6 +39,9 @@ importers:
sass:
specifier: ^1
version: 1.77.6
terser:
specifier: ^5
version: 5.31.2
packages:
@ -67,6 +76,27 @@ packages:
resolution: {integrity: sha512-93zYdMES/c1D69yZiKDBj0V24vqNzB/koF26KPaagAfd3P/4gUlh3Dys5ogAK+Exi9QyzlD8x/08Zt7wIKcDcA==}
deprecated: Use @eslint/object-schema instead
'@jridgewell/gen-mapping@0.3.5':
resolution: {integrity: sha512-IzL8ZoEDIBRWEzlCcRhOaCupYyN5gdIK+Q6fbFdPDg6HqX6jpkItn7DFIpW9LQzXG6Df9sA7+OKnq0qlz/GaQg==}
engines: {node: '>=6.0.0'}
'@jridgewell/resolve-uri@3.1.2':
resolution: {integrity: sha512-bRISgCIjP20/tbWSPWMEi54QVPRZExkuD9lJL+UIxUKtwVJA8wW1Trb1jMs1RFXo1CBTNZ/5hpC9QvmKWdopKw==}
engines: {node: '>=6.0.0'}
'@jridgewell/set-array@1.2.1':
resolution: {integrity: sha512-R8gLRTZeyp03ymzP/6Lil/28tGeGEzhx1q2k703KGWRAI1VdvPIXdG70VJc2pAMw3NA6JKL5hhFu1sJX0Mnn/A==}
engines: {node: '>=6.0.0'}
'@jridgewell/source-map@0.3.6':
resolution: {integrity: sha512-1ZJTZebgqllO79ue2bm3rIGud/bOe0pP5BjSRCRxxYkEZS8STV7zN84UBbiYu7jy+eCKSnVIUgoWWE/tt+shMQ==}
'@jridgewell/sourcemap-codec@1.5.0':
resolution: {integrity: sha512-gv3ZRaISU3fjPAgNsriBRqGWQL6quFx04YMPW/zD8XMLsU32mhCCbfbO6KZFLjvYpCZ8zyDEgqsgf+PwPaM7GQ==}
'@jridgewell/trace-mapping@0.3.25':
resolution: {integrity: sha512-vNk6aEwybGtawWmy/PzwnGDOjCkLWSD2wqvjGGAgOAwCGWySYXfYoxt00IJkTF+8Lb57DwOb3Aa0o9CApepiYQ==}
'@nodelib/fs.scandir@2.1.5':
resolution: {integrity: sha512-vq24Bq3ym5HEQm2NKCr3yXDwjc7vTsEThRDnkp2DK9p1uqLR+DHurm/NOTo0KG7HYHU7eppKZj3MyqYuMBf62g==}
engines: {node: '>= 8'}
@ -164,6 +194,9 @@ packages:
engines: {node: ^6 || ^7 || ^8 || ^9 || ^10 || ^11 || ^12 || >=13.7}
hasBin: true
buffer-from@1.1.2:
resolution: {integrity: sha512-E+XQCRwSbaaiChtv6k6Dwgc+bx+Bs6vuKJHHl5kox/BaKbhiXzqQOwK4cO22yElGp2OCmjwVhT3HmxgyPGnJfQ==}
call-bind@1.0.7:
resolution: {integrity: sha512-GHTSNSYICQ7scH7sZ+M2rFopRoLh8t2bLSW6BbgrtLsahOIB5iyAVJf9GjWK3cYTDaMj4XdBpM1cA6pIS0Kv2w==}
engines: {node: '>= 0.4'}
@ -172,6 +205,9 @@ packages:
resolution: {integrity: sha512-P8BjAsXvZS+VIDUI11hHCQEv74YT67YUi5JJFNWIqL235sBmjX4+qx9Muvls5ivyNENctx46xQLQ3aTuE7ssaQ==}
engines: {node: '>=6'}
camel-case@4.1.2:
resolution: {integrity: sha512-gxGWBrTT1JuMx6R+o5PTXMmUnhnVzLQ9SNutD4YqKtI6ap897t3tKECYla6gCWEkplXnlNybEkZg9GEGxKFCgw==}
caniuse-lite@1.0.30001636:
resolution: {integrity: sha512-bMg2vmr8XBsbL6Lr0UHXy/21m84FTxDLWn2FSqMd5PrlbMxwJlQnC2YWYxVgp66PZE+BBNF2jYQUBKCo1FDeZg==}
@ -187,6 +223,10 @@ packages:
resolution: {integrity: sha512-7VT13fmjotKpGipCW9JEQAusEPE+Ei8nl6/g4FBAmIm0GOOLMua9NDDo/DWp0ZAxCr3cPq5ZpBqmPAQgDda2Pw==}
engines: {node: '>= 8.10.0'}
clean-css@5.3.3:
resolution: {integrity: sha512-D5J+kHaVb/wKSFcyyV75uCn8fiY4sV38XJoe4CUyGQ+mOU/fMVYUdH1hJC+CJQ5uY3EnW27SbJYS4X8BiLrAFg==}
engines: {node: '>= 10.0'}
cliui@8.0.1:
resolution: {integrity: sha512-BSeNnyus75C4//NQ9gQt1/csTXyo/8Sb+afLAkzAptFuMsod9HFokGNudZpi/oQV73hnVK+sR+5PVRMd+Dr7YQ==}
engines: {node: '>=12'}
@ -204,6 +244,13 @@ packages:
color-name@1.1.4:
resolution: {integrity: sha512-dOy+3AuW3a2wNbZHIuMZpTcgjGuLU/uBL/ubcZF9OXbDo8ff4O8yVp5Bf0efS8uEoYo5q4Fx7dY9OgQGXgAsQA==}
commander@10.0.1:
resolution: {integrity: sha512-y4Mg2tXshplEbSGzx7amzPwKKOCGuoSRP/CjEdwwk0FOGlUbq6lKuoyDZTNZkmxHdJtp54hdfY/JUrdL7Xfdug==}
engines: {node: '>=14'}
commander@2.20.3:
resolution: {integrity: sha512-GpVkmM8vF2vQUkj2LvZmD35JxeJOLCwJ9cUkugyk2nuhbv3+mJvpLYYt+0+USMxE+oj+ey/lJEnhZw75x/OMcQ==}
concat-map@0.0.1:
resolution: {integrity: sha512-/Srv4dswyQNBfohGpz9o6Yb3Gz3SrUDqBH5rTuhGR7ahtlbYKnVxw2bCFMRljaA7EXHaXZ8wsHdodFvbkhKmqg==}
@ -255,12 +302,19 @@ packages:
resolution: {integrity: sha512-yS+Q5i3hBf7GBkd4KG8a7eBNNWNGLTaEwwYWUijIYM7zrlYDM0BFXHjjPWlWZ1Rg7UaddZeIDmi9jF3HmqiQ2w==}
engines: {node: '>=6.0.0'}
dot-case@3.0.4:
resolution: {integrity: sha512-Kv5nKlh6yRrdrGvxeJ2e5y2eRUpkUosIW4A2AS38zwSz27zu7ufDwQPi5Jhs3XAlGNetl3bmnGhQsMtkKJnj3w==}
electron-to-chromium@1.4.808:
resolution: {integrity: sha512-0ItWyhPYnww2VOuCGF4s1LTfbrdAV2ajy/TN+ZTuhR23AHI6rWHCrBXJ/uxoXOvRRqw8qjYVrG81HFI7x/2wdQ==}
emoji-regex@8.0.0:
resolution: {integrity: sha512-MSjYzcWNOA0ewAHpz0MxpYFvwg6yjy1NG3xteoqz644VCo/RPgnr1/GGt+ic3iJTzQ8Eu3TdM14SawnVUmGE6A==}
entities@4.5.0:
resolution: {integrity: sha512-V0hjH4dGPh9Ao5p0MoRY6BVqtwCjhz6vI5LT8AJ55H+4g9/4vbHx1I54fS0XuclLhDHArPQCiMjDxjaL8fPxhw==}
engines: {node: '>=0.12'}
error-ex@1.3.2:
resolution: {integrity: sha512-7dFHNmqeFSEt2ZBsCriorKnn3Z2pj+fd9kmI6QoWw4//DL+icEBfc0U7qJCisqrTsKTjw4fNFy2pW9OqStD84g==}
@ -478,6 +532,11 @@ packages:
hosted-git-info@2.8.9:
resolution: {integrity: sha512-mxIDAb9Lsm6DoOJ7xH+5+X4y1LU/4Hi50L9C5sIswK3JzULS4bwk1FvjdBgvYR4bzT4tuUQiC15FE2f5HbLvYw==}
html-minifier-terser@7.2.0:
resolution: {integrity: sha512-tXgn3QfqPIpGl9o+K5tpcj3/MN4SfLtsx2GWwBC3SSd0tXQGyF3gsSqad8loJgKZGM3ZxbYDd5yhiBIdWpmvLA==}
engines: {node: ^14.13.1 || >=16.0.0}
hasBin: true
ignore@5.3.1:
resolution: {integrity: sha512-5Fytz/IraMjqpwfd34ke28PTVMjZjJG2MPn5t7OE4eUCUNf8BAa7b5WUS9/Qvr6mwOQS7Mk6vdsMno5he+T8Xw==}
engines: {node: '>= 4'}
@ -636,6 +695,9 @@ packages:
lodash.merge@4.6.2:
resolution: {integrity: sha512-0KpjqXRVvrYyCsX1swR/XTK0va6VQkQM6MNo7PqW77ByjAhoARA8EfrP1N4+KlKj8YS0ZUCtRT/YUuhyYDujIQ==}
lower-case@2.0.2:
resolution: {integrity: sha512-7fm3l3NAF9WfN6W3JOmf5drwpVqX78JtoGJ3A6W0a6ZnldM41w2fV5D490psKFTpMds8TJse/eHLFFsNHHjHgg==}
memorystream@0.3.1:
resolution: {integrity: sha512-S3UwM3yj5mtUSEfP41UZmt/0SCoVYUcU1rkXv+BQ5Ig8ndL4sPoJNBUJERafdPb5jjHJGuMgytgKvKIf58XNBw==}
engines: {node: '>= 0.10.0'}
@ -665,6 +727,9 @@ packages:
nice-try@1.0.5:
resolution: {integrity: sha512-1nh45deeb5olNY7eX82BkPO7SSxR5SSYJiPTrTdFUVYwAl8CKMA5N9PjTYkHiRjisVcxcQ1HXdLhx2qxxJzLNQ==}
no-case@3.0.4:
resolution: {integrity: sha512-fgAN3jGAh+RoxUGZHTSOLJIqUc2wmoBwGR4tbpNAKmmovFoWq0OdRkb0VkldReO2a2iBT/OEulG9XSUc10r3zg==}
node-releases@2.0.14:
resolution: {integrity: sha512-y10wOWt8yZpqXmOgRo77WaHEmhYQYGNA6y421PKsKYWEK8aW+cqAphborZDhqfyKrbZEN92CN1X2KbafY2s7Yw==}
@ -710,6 +775,9 @@ packages:
resolution: {integrity: sha512-LaNjtRWUBY++zB5nE/NwcaoMylSPk+S+ZHNB1TzdbMJMny6dynpAGt7X/tl/QYq3TIeE6nxHppbo2LGymrG5Pw==}
engines: {node: '>=10'}
param-case@3.0.4:
resolution: {integrity: sha512-RXlj7zCYokReqWpOPH9oYivUzLYZ5vAPIfEmCTNViosC78F8F0H9y7T7gG2M39ymgutxF5gcFEsyZQSph9Bp3A==}
parent-module@1.0.1:
resolution: {integrity: sha512-GQ2EWRpQV8/o+Aw8YqtfZZPfNRWZYkbidE9k5rpl/hC3vtHHBfGm2Ifi6qWV+coDGkrUKZAxE3Lot5kcsRlh+g==}
engines: {node: '>=6'}
@ -718,6 +786,9 @@ packages:
resolution: {integrity: sha512-aOIos8bujGN93/8Ox/jPLh7RwVnPEysynVFE+fQZyg6jKELEHwzgKdLRFHUgXJL6kylijVSBC4BvN9OmsB48Rw==}
engines: {node: '>=4'}
pascal-case@3.1.2:
resolution: {integrity: sha512-uWlGT3YSnK9x3BQJaOdcZwrnV6hPpd8jFH1/ucpiLRPh/2zCVJKS19E4GvYHvaCcACn3foXZ0cLB9Wrx1KGe5g==}
path-exists@4.0.0:
resolution: {integrity: sha512-ak9Qy5Q7jYb2Wwcey5Fpvg2KoAc/ZIhLSLOSBmRmygPsGwkVVt0fZa0qrtMz+m6tJTAHfZQ8FnmB4MG4LWy7/w==}
engines: {node: '>=8'}
@ -834,6 +905,10 @@ packages:
resolution: {integrity: sha512-NcDiDkTLuPR+++OCKB0nWafEmhg/Da8aUPLPMQbK+bxKKCm1/S5he+AqYa4PlMCVBalb4/yxIRub6qkEx5yJbw==}
engines: {node: '>= 0.4'}
relateurl@0.2.7:
resolution: {integrity: sha512-G08Dxvm4iDN3MLM0EsP62EDV9IuhXPR6blNz6Utcp7zyV3tr4HVNINt6MpaRWbxoOHT3Q7YN2P+jaHX8vUbgog==}
engines: {node: '>= 0.10'}
require-directory@2.1.1:
resolution: {integrity: sha512-fGxEI7+wsG9xrvdjsrlmL22OMTTiHRwAMroiEeMgq8gzoLC/PQr7RsRDSTLUg/bZAZtF+TVIkHc6/4RIKrui+Q==}
engines: {node: '>=0.10.0'}
@ -914,6 +989,13 @@ packages:
resolution: {integrity: sha512-itJW8lvSA0TXEphiRoawsCksnlf8SyvmFzIhltqAHluXd88pkCd+cXJVHTDwdCr0IzwptSm035IHQktUu1QUMg==}
engines: {node: '>=0.10.0'}
source-map-support@0.5.21:
resolution: {integrity: sha512-uBHU3L3czsIyYXKX88fdrGovxdSCoTGDRZ6SYXtSRxLZUzHg5P/66Ht6uoUlHu9EZod+inXhKo3qQgwXUT/y1w==}
source-map@0.6.1:
resolution: {integrity: sha512-UjgapumWlbMhkBgzT7Ykc5YXUT46F0iKu8SGXq0bcwP5dz/h0Plj6enJqjz1Zbq2l5WaqYnrVbwWOWMyF3F47g==}
engines: {node: '>=0.10.0'}
spdx-correct@3.2.0:
resolution: {integrity: sha512-kN9dJbvnySHULIluDHy32WHRUu3Og7B9sbY7tsFLctQkIqnMh3hErYgdMjTYuqmcXX+lK5T1lnUt3G7zNswmZA==}
@ -969,6 +1051,11 @@ packages:
resolution: {integrity: sha512-ot0WnXS9fgdkgIcePe6RHNk1WA8+muPa6cSjeR3V8K27q9BB1rTE3R1p7Hv0z1ZyAc8s6Vvv8DIyWf681MAt0w==}
engines: {node: '>= 0.4'}
terser@5.31.2:
resolution: {integrity: sha512-LGyRZVFm/QElZHy/CPr/O4eNZOZIzsrQ92y4v9UJe/pFJjypje2yI3C2FmPtvUEnhadlSbmG2nXtdcjHOjCfxw==}
engines: {node: '>=10'}
hasBin: true
text-table@0.2.0:
resolution: {integrity: sha512-N+8UisAXDGk8PFXP4HAzVR9nbfmVJ3zYLAWiTIoqC5v5isinhr+r5uaO8+7r3BMfuNIufIsA7RdpVgacC2cSpw==}
@ -979,6 +1066,9 @@ packages:
resolution: {integrity: sha512-65P7iz6X5yEr1cwcgvQxbbIw7Uk3gOy5dIdtZ4rDveLqhrdJP+Li/Hx6tyK0NEb+2GCyneCMJiGqrADCSNk8sQ==}
engines: {node: '>=8.0'}
tslib@2.6.3:
resolution: {integrity: sha512-xNvxJEOUiWPGhUuUdQgAJPKOOJfGnIyKySOc09XkKsgdUV/3E2zvwZYdejjmRgPCgcym1juLH3226yA7sEFJKQ==}
type-check@0.4.0:
resolution: {integrity: sha512-XleUoc9uwGXqjWwXaUTZAmzMcFZ5858QA2vvx1Ur5xIcixXIP+8LnFDgRplU30us6teqdlskFfu+ae4K79Ooew==}
engines: {node: '>= 0.8.0'}
@ -1111,6 +1201,28 @@ snapshots:
'@humanwhocodes/object-schema@2.0.3': {}
'@jridgewell/gen-mapping@0.3.5':
dependencies:
'@jridgewell/set-array': 1.2.1
'@jridgewell/sourcemap-codec': 1.5.0
'@jridgewell/trace-mapping': 0.3.25
'@jridgewell/resolve-uri@3.1.2': {}
'@jridgewell/set-array@1.2.1': {}
'@jridgewell/source-map@0.3.6':
dependencies:
'@jridgewell/gen-mapping': 0.3.5
'@jridgewell/trace-mapping': 0.3.25
'@jridgewell/sourcemap-codec@1.5.0': {}
'@jridgewell/trace-mapping@0.3.25':
dependencies:
'@jridgewell/resolve-uri': 3.1.2
'@jridgewell/sourcemap-codec': 1.5.0
'@nodelib/fs.scandir@2.1.5':
dependencies:
'@nodelib/fs.stat': 2.0.5
@ -1213,6 +1325,8 @@ snapshots:
node-releases: 2.0.14
update-browserslist-db: 1.0.16(browserslist@4.23.1)
buffer-from@1.1.2: {}
call-bind@1.0.7:
dependencies:
es-define-property: 1.0.0
@ -1223,6 +1337,11 @@ snapshots:
callsites@3.1.0: {}
camel-case@4.1.2:
dependencies:
pascal-case: 3.1.2
tslib: 2.6.3
caniuse-lite@1.0.30001636: {}
chalk@2.4.2:
@ -1248,6 +1367,10 @@ snapshots:
optionalDependencies:
fsevents: 2.3.3
clean-css@5.3.3:
dependencies:
source-map: 0.6.1
cliui@8.0.1:
dependencies:
string-width: 4.2.3
@ -1266,6 +1389,10 @@ snapshots:
color-name@1.1.4: {}
commander@10.0.1: {}
commander@2.20.3: {}
concat-map@0.0.1: {}
cross-spawn@6.0.5:
@ -1324,10 +1451,17 @@ snapshots:
dependencies:
esutils: 2.0.3
dot-case@3.0.4:
dependencies:
no-case: 3.0.4
tslib: 2.6.3
electron-to-chromium@1.4.808: {}
emoji-regex@8.0.0: {}
entities@4.5.0: {}
error-ex@1.3.2:
dependencies:
is-arrayish: 0.2.1
@ -1629,6 +1763,16 @@ snapshots:
hosted-git-info@2.8.9: {}
html-minifier-terser@7.2.0:
dependencies:
camel-case: 4.1.2
clean-css: 5.3.3
commander: 10.0.1
entities: 4.5.0
param-case: 3.0.4
relateurl: 0.2.7
terser: 5.31.2
ignore@5.3.1: {}
immutable@4.3.6: {}
@ -1776,6 +1920,10 @@ snapshots:
lodash.merge@4.6.2: {}
lower-case@2.0.2:
dependencies:
tslib: 2.6.3
memorystream@0.3.1: {}
merge2@1.4.1: {}
@ -1797,6 +1945,11 @@ snapshots:
nice-try@1.0.5: {}
no-case@3.0.4:
dependencies:
lower-case: 2.0.2
tslib: 2.6.3
node-releases@2.0.14: {}
normalize-package-data@2.5.0:
@ -1854,6 +2007,11 @@ snapshots:
dependencies:
p-limit: 3.1.0
param-case@3.0.4:
dependencies:
dot-case: 3.0.4
tslib: 2.6.3
parent-module@1.0.1:
dependencies:
callsites: 3.1.0
@ -1863,6 +2021,11 @@ snapshots:
error-ex: 1.3.2
json-parse-better-errors: 1.0.2
pascal-case@3.1.2:
dependencies:
no-case: 3.0.4
tslib: 2.6.3
path-exists@4.0.0: {}
path-is-absolute@1.0.1: {}
@ -1960,6 +2123,8 @@ snapshots:
es-errors: 1.3.0
set-function-name: 2.0.2
relateurl@0.2.7: {}
require-directory@2.1.1: {}
resolve-from@4.0.0: {}
@ -2042,6 +2207,13 @@ snapshots:
source-map-js@1.2.0: {}
source-map-support@0.5.21:
dependencies:
buffer-from: 1.1.2
source-map: 0.6.1
source-map@0.6.1: {}
spdx-correct@3.2.0:
dependencies:
spdx-expression-parse: 3.0.1
@ -2106,6 +2278,13 @@ snapshots:
supports-preserve-symlinks-flag@1.0.0: {}
terser@5.31.2:
dependencies:
'@jridgewell/source-map': 0.3.6
acorn: 8.12.0
commander: 2.20.3
source-map-support: 0.5.21
text-table@0.2.0: {}
thenby@1.3.4: {}
@ -2114,6 +2293,8 @@ snapshots:
dependencies:
is-number: 7.0.0
tslib@2.6.3: {}
type-check@0.4.0:
dependencies:
prelude-ls: 1.2.1

Binary file not shown.

Before

Width:  |  Height:  |  Size: 86 KiB

After

Width:  |  Height:  |  Size: 87 KiB

Before After
Before After

View file

@ -7,7 +7,7 @@
<div class="card-body">
<h5 class="card-title" id="section-contact">Contact</h5>
<h2>Bob Vandevliet</h2>
<p>Gecertificeerd FPV-dronepiloot voor open categorie A1, (binnenkort ook A2) en A3.</p>
<p>Gecertificeerd FPV-dronepiloot voor open categorie A1 en A3 (binnenkort ook A2).</p>
<h5>Email</h5>
<p><a href="mailto:bob@vandevliet-aerialshots.com">bob@vandevliet-aerialshots.com</a></p>
<!-- <h5>Telefoon</h5>

View file

@ -6,9 +6,9 @@
<title><!--# echo var="title" default="Title" --></title>
<link rel="stylesheet" href="assets/css/styles.css">
<link rel="stylesheet" href="assets/css/styles.min.css">
<script src="https://kit.fontawesome.com/7e7cf109ad.js" crossorigin="anonymous"></script>
<script src="https://cdn.jsdelivr.net/npm/bootstrap@5/dist/js/bootstrap.min.js" crossorigin="anonymous" defer></script>
<script src="assets/js/navigation.js" defer></script>
<script src="assets/js/scripts.min.js" defer></script>
</head>

View file

@ -122,11 +122,17 @@
<div class="row">
<div class="col-md-6 offset-md-6">
<p>
Als kind wilde ik luchtvaartpiloot worden en droomde ik ervan te kunnen vliegen als Superman. Ik was ook altijd bezig met filmen, videobewerking en elektronische muziek maken. Deze hobby's gaven me veel plezier, maar ik koos uiteindelijk voor een carrière als industrieel productontwerper. Naast mijn werk ontwikkelde ik een passie voor softwareontwikkeling, wat later mijn beroep werd.
Hi, ik ben Bob Vandevliet, gecertificeerd FPV-dronepiloot voor open categorie A1 en A3 (binnenkort ook A2). Ik maak FPV dronevideo's voor bedrijven, vastgoed en (sport)evenementen. Met mijn creatieve en technische achtergrond zorg ik ervoor dat jouw dronevideo er professioneel uitziet en jouw verhaal op een unieke manier verteld wordt.
</p>
<p>
Als kind wilde ik luchtvaartpiloot worden en droomde ik regelmatig dat ik kon vliegen zoals Superman. Ik was ook altijd bezig met filmen, videobewerking en elektronisch muziek maken. Deze hobby's gaven me veel plezier, maar ik koos uiteindelijk voor een carrière in de techniek als industrieel productontwerper. Naast mijn werk ontwikkelde ik een passie voor web- en softwareontwikkeling, wat later mijn beroep werd.
</p>
<p>
In 2022 ontdekte ik drones en FPV. Deze fascinerende hobby brengt al mijn interesses samen: techniek, vliegen, videografie, productontwikkeling en software engineering. In 2024 besloot ik van mijn ware passies mijn beroep te maken door luchtvideografie als dienst aan te bieden. Zo komen mijn vroegere hobby's en mijn carrière mooi samen.
</p>
<p>
Ik doe dit als ZZP'er naast mijn parttime baan als software engineer. Ik ben gevestigd in Arnhem, Gelderland, en werk voornamelijk in deze regio. Neem gerust contact met me op voor een vrijblijvend gesprek over jouw dronevideo.
</p>
</div>
</div>
</div>
@ -145,7 +151,7 @@
<br>Intake
</h4>
<p>
Elk project begint met een goede voorbereiding. Daarom plan ik graag een persoonlijk gesprek met je in. We bespreken jouw doelen, wensen en visie, creatieve ideeën over de inhoud, en de gewenste toon en stijl. Wat wil je bereiken met de video? Wat is de boodschap die je wilt overbrengen? Wie is je doelgroep? Op basis van deze informatie maak ik een passende offerte binnen jouw budget.
Elk project begint met een goede voorbereiding. Daarom plan ik graag een persoonlijk gesprek met je in. We bespreken jouw doelen, wensen en visie, creatieve ideeën over de inhoud, en de gewenste toon en stijl. Wat wil je bereiken met de dronevideo? Wat is de boodschap die je wilt overbrengen? Wie is je doelgroep? Op basis van deze informatie maak ik een passende offerte binnen jouw budget.
</p>
</div>
<div class="col-sm-6 col-lg">
@ -154,7 +160,7 @@
<br>Vluchtplan
</h4>
<p>
Zodra de offerte is goedgekeurd, start ik met de preproductiefase. Ik maak een vluchtplan en schrijf een script of draaiboek. Zo zorg ik ervoor dat jouw boodschap optimaal in beeld komt. Komen er ook mensen in beeld? Dan zorgen we er samen voor dat zij goed geïnstrueerd en voorbereid zijn, en weten wat er van hen verwacht wordt.
Zodra de offerte akkoord is, start ik met de preproductiefase. Ik maak een vluchtplan en schrijf een script of draaiboek. Zo zorg ik ervoor dat jouw boodschap optimaal in beeld komt. Komen er ook mensen in beeld? Dan zorgen we er samen voor dat zij goed geïnstrueerd en voorbereid zijn, en weten wat er van hen verwacht wordt.
</p>
</div>
<div class="col-sm-6 col-lg">
@ -163,7 +169,7 @@
<br>Opname
</h4>
<p>
Op de afgesproken datum en locatie begin ik met het opnemen van jouw video. Tijdens het filmen houd ik rekening met jouw wensen en zorg ik ervoor dat we binnen de afgesproken tijd en budget blijven. Zijn er opnames buiten gepland en werkt het weer niet mee? Dan plannen we gewoon een nieuwe datum om de opnames te voltooien.
Op de afgesproken datum en locatie begin ik met het opnemen van jouw dronevideo. Tijdens het filmen houd ik rekening met jouw wensen en zorg ik ervoor dat we binnen de afgesproken tijd en budget blijven. Zijn er drone opnames buiten gepland en werkt het weer niet mee? Dan plannen we gewoon een nieuwe datum om de drone opnames te voltooien.
</p>
</div>
<div class="col-sm-6 col-lg">
@ -172,7 +178,7 @@
<br>Montage
</h4>
<p>
Zodra de opnames zijn gemaakt, kiezen we samen de beste beelden uit. Daarna breng ik jouw verhaal tot leven met beeld-, geluids- en kleurbewerking. Ik bekijk elk frame zorgvuldig om jouw bedrijf, merk, product of dienst zo goed mogelijk te presenteren. Ik zorg ervoor dat de visuele montage aansluit bij je doelgroep en lever de video in de juiste formaten voor de gewenste mediakanalen.
Zodra de drone opnames zijn gemaakt, kiezen we samen de beste beelden uit. Daarna breng ik jouw verhaal zorgvuldig tot leven met beeld-, geluids- en kleurbewerking, zodat jouw bedrijf, merk, product of dienst zo goed mogelijk gepresenteerd wordt. Ik zorg ervoor dat de visuele montage aansluit bij je doelgroep en lever jouw dronevideo in de juiste formaten voor de gewenste mediakanalen.
</p>
</div>
</div>

View file

@ -3,11 +3,6 @@
*/
const parallaxElems = document.querySelectorAll('.parallax');
/**
* @type {NodeListOf<HTMLElement>}
*/
const sections = document.querySelectorAll('.section');
// Handle scroll events.
window.addEventListener('scroll', () =>
{
@ -28,6 +23,11 @@ window.addEventListener('scroll', () =>
});
});
/**
* @type {NodeListOf<HTMLElement>}
*/
const sections = document.querySelectorAll('.section');
sections.forEach(section =>
{
if (section.id)