From f0748969930523e66b42f815344ad2c31937d051 Mon Sep 17 00:00:00 2001 From: Antonio Wang <--edit> Date: Fri, 27 Mar 2026 09:32:43 +0100 Subject: [PATCH 01/11] feat: add @videojs/react dependency to project --- package-lock.json | 385 +++++++++++++++++++++++++++++++++++++++++++++- package.json | 1 + 2 files changed, 385 insertions(+), 1 deletion(-) diff --git a/package-lock.json b/package-lock.json index 108004b..abc6c38 100644 --- a/package-lock.json +++ b/package-lock.json @@ -9,6 +9,7 @@ "version": "1.8.0", "dependencies": { "@gsap/react": "^2.1.2", + "@videojs/react": "^10.0.0-beta.11", "gsap": "^3.14.2", "next": "16.2.1", "react": "19.2.4", @@ -1628,6 +1629,129 @@ "dev": true, "license": "MIT" }, + "node_modules/@svta/cml-608": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/@svta/cml-608/-/cml-608-1.0.1.tgz", + "integrity": "sha512-Y/Ier9VPUSOBnf0bJqdDyTlPrt4dDB+jk5mYHa1bnD2kcRl8qn7KkW3PRuj4w1aVN+BS2eHmsLxodt7P2hylUg==", + "license": "Apache-2.0", + "engines": { + "node": ">=20" + } + }, + "node_modules/@svta/cml-cmcd": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/@svta/cml-cmcd/-/cml-cmcd-1.0.1.tgz", + "integrity": "sha512-eox305g+QUJgXqOLVrbgxeQHCgl90ewwQ9O2bIoo7m+hanR8Xswu5CknFnT5qqIbLOHfw80ug+raycoAFHTQ+w==", + "license": "Apache-2.0", + "engines": { + "node": ">=20" + }, + "peerDependencies": { + "@svta/cml-cta": "1.0.1", + "@svta/cml-structured-field-values": "1.0.1", + "@svta/cml-utils": "1.0.1" + } + }, + "node_modules/@svta/cml-cmsd": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/@svta/cml-cmsd/-/cml-cmsd-1.0.1.tgz", + "integrity": "sha512-+nIB8PuSfb/qw+xGaArPhNqPm84tBJUbe3H1DnPL5QUsjSUI7mUIUQwAtRV1ZdEu0+80g9i0op79woB0OIwr/g==", + "license": "Apache-2.0", + "engines": { + "node": ">=20" + }, + "peerDependencies": { + "@svta/cml-cta": "1.0.1", + "@svta/cml-structured-field-values": "1.0.1", + "@svta/cml-utils": "1.0.1" + } + }, + "node_modules/@svta/cml-cta": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/@svta/cml-cta/-/cml-cta-1.0.1.tgz", + "integrity": "sha512-jcXqNIPv26bmFxIOFh8/c3+6WLH4qBjKpq9qTQcggDPoHuV1YBydMsJLOnYPDeK8rNMKcAkFLbnDRvyJthu5yw==", + "license": "Apache-2.0", + "peer": true, + "engines": { + "node": ">=20" + }, + "peerDependencies": { + "@svta/cml-structured-field-values": "1.0.1", + "@svta/cml-utils": "1.0.1" + } + }, + "node_modules/@svta/cml-dash": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/@svta/cml-dash/-/cml-dash-1.0.1.tgz", + "integrity": "sha512-lYnD1I7FUbbQND+xICI+kcRaRXuT+whKk27R8m8me5VMVu2sMsAMc7Yui6l9sxw2cBKt8pSETPYRm/1+n4LZkw==", + "license": "Apache-2.0", + "engines": { + "node": ">=20" + }, + "peerDependencies": { + "@svta/cml-utils": "1.0.1" + } + }, + "node_modules/@svta/cml-id3": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/@svta/cml-id3/-/cml-id3-1.0.1.tgz", + "integrity": "sha512-90fGlL1qRI88CcaB89k6NG6cC3kky4Eu2jwqU4HefqK+S5k2OASUxf8JXkGz+DsdaiY7sh51vGPYdolfBZS7ug==", + "license": "Apache-2.0", + "engines": { + "node": ">=20" + }, + "peerDependencies": { + "@svta/cml-utils": "1.0.1" + } + }, + "node_modules/@svta/cml-request": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/@svta/cml-request/-/cml-request-1.0.1.tgz", + "integrity": "sha512-enL19BuXUjFkDDDF9jdNwUclMNPRsagnjGAetVC7xcmpDMpEx+ZLgsDip6BFNg5p6izSEk/OyujTWW1r8bDNiA==", + "license": "Apache-2.0", + "engines": { + "node": ">=20" + }, + "peerDependencies": { + "@svta/cml-utils": "1.0.1", + "@svta/cml-xml": "1.0.1" + } + }, + "node_modules/@svta/cml-structured-field-values": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/@svta/cml-structured-field-values/-/cml-structured-field-values-1.0.1.tgz", + "integrity": "sha512-Kibciki59Pon3Pn/sl5uyrbJcSpZQDKqdCfDrokBvOdLoqqcd0oFrkEPsZBiuuIODX1CB80612xe8hopeFDyBA==", + "license": "Apache-2.0", + "peer": true, + "engines": { + "node": ">=20" + }, + "peerDependencies": { + "@svta/cml-utils": "1.0.1" + } + }, + "node_modules/@svta/cml-utils": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/@svta/cml-utils/-/cml-utils-1.0.1.tgz", + "integrity": "sha512-kso3curTJfp00I1mKFoBliBApjn4aPE+wF8cPucf7TrSDVWZDeLLuF14ASmUE9m7rnrqTTK4878VvmXaXcCCfQ==", + "license": "Apache-2.0", + "peer": true, + "engines": { + "node": ">=20" + } + }, + "node_modules/@svta/cml-xml": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/@svta/cml-xml/-/cml-xml-1.0.1.tgz", + "integrity": "sha512-11LkJa5kDEcsRMWkVI1ABH3KLCxGoiSVe4kQ293ItVj8ncTTQ7htmCGiJDjS+Cmy35UgF3e/vc0ysJIiWRTx2g==", + "license": "Apache-2.0", + "engines": { + "node": ">=20" + }, + "peerDependencies": { + "@svta/cml-utils": "1.0.1" + } + }, "node_modules/@swc/helpers": { "version": "0.5.15", "resolved": "https://registry.npmjs.org/@swc/helpers/-/helpers-0.5.15.tgz", @@ -2549,6 +2673,70 @@ "win32" ] }, + "node_modules/@videojs/core": { + "version": "10.0.0-beta.11", + "resolved": "https://registry.npmjs.org/@videojs/core/-/core-10.0.0-beta.11.tgz", + "integrity": "sha512-E4K3SvSQtztiP+UxumURNIXDMOPpTl6AbdWNizRhdDdohMZVI+ndv2QoZq91IS96ctKe/GtpATS+hBPgA/3grA==", + "license": "Apache-2.0", + "dependencies": { + "@videojs/spf": "10.0.0-beta.11", + "@videojs/store": "10.0.0-beta.11", + "@videojs/utils": "10.0.0-beta.11", + "dashjs": "^5.0.0", + "hls.js": "^1.6.7" + } + }, + "node_modules/@videojs/react": { + "version": "10.0.0-beta.11", + "resolved": "https://registry.npmjs.org/@videojs/react/-/react-10.0.0-beta.11.tgz", + "integrity": "sha512-K5whZOiKsaa9ndlfFmCPY4/rk7GYxJb7PvuZ8odPMuUrXA4Nrk12mtmTnt2pTYRvEjqdtGINrw62O+MjJGksfw==", + "license": "Apache-2.0", + "dependencies": { + "@videojs/core": "10.0.0-beta.11", + "@videojs/spf": "10.0.0-beta.11", + "@videojs/store": "10.0.0-beta.11", + "@videojs/utils": "10.0.0-beta.11" + }, + "peerDependencies": { + "react": ">=16.8.0" + } + }, + "node_modules/@videojs/spf": { + "version": "10.0.0-beta.11", + "resolved": "https://registry.npmjs.org/@videojs/spf/-/spf-10.0.0-beta.11.tgz", + "integrity": "sha512-3NInNjZdGeNY4wrx/3xEG4VbWPzc1iYp7GQiF/rN9QHHVtT32iEm8gLJekA6JoygkDi2CqDkmu02EG2O5BkKew==", + "license": "Apache-2.0", + "dependencies": { + "@videojs/utils": "10.0.0-beta.11" + } + }, + "node_modules/@videojs/store": { + "version": "10.0.0-beta.11", + "resolved": "https://registry.npmjs.org/@videojs/store/-/store-10.0.0-beta.11.tgz", + "integrity": "sha512-xG0eJ13MP6AxnoyClQlMNAw/UijQXjT0rUtd7xbo06rkfK36apev/YRZx4WMmliMavm5ZZcRUSOdV9JMUi+b3Q==", + "license": "Apache-2.0", + "dependencies": { + "@videojs/utils": "10.0.0-beta.11" + }, + "peerDependencies": { + "@videojs/element": "10.0.0-beta.11", + "react": "^18.0.0 || ^19.0.0" + }, + "peerDependenciesMeta": { + "@videojs/element": { + "optional": true + }, + "react": { + "optional": true + } + } + }, + "node_modules/@videojs/utils": { + "version": "10.0.0-beta.11", + "resolved": "https://registry.npmjs.org/@videojs/utils/-/utils-10.0.0-beta.11.tgz", + "integrity": "sha512-uCba7vwQIJSSW0sN9fdnfom26Is/KLT8iZCyT3q7J/JaR8bdkkJA+nzz+2DklodHhrE2gxJjz/RF42Os8PGKeg==", + "license": "Apache-2.0" + }, "node_modules/acorn": { "version": "8.15.0", "resolved": "https://registry.npmjs.org/acorn/-/acorn-8.15.0.tgz", @@ -2854,6 +3042,45 @@ "node": ">=6.0.0" } }, + "node_modules/bcp-47": { + "version": "2.1.0", + "resolved": "https://registry.npmjs.org/bcp-47/-/bcp-47-2.1.0.tgz", + "integrity": "sha512-9IIS3UPrvIa1Ej+lVDdDwO7zLehjqsaByECw0bu2RRGP73jALm6FYbzI5gWbgHLvNdkvfXB5YrSbocZdOS0c0w==", + "license": "MIT", + "dependencies": { + "is-alphabetical": "^2.0.0", + "is-alphanumerical": "^2.0.0", + "is-decimal": "^2.0.0" + }, + "funding": { + "type": "github", + "url": "https://github.com/sponsors/wooorm" + } + }, + "node_modules/bcp-47-match": { + "version": "2.0.3", + "resolved": "https://registry.npmjs.org/bcp-47-match/-/bcp-47-match-2.0.3.tgz", + "integrity": "sha512-JtTezzbAibu8G0R9op9zb3vcWZd9JF6M0xOYGPn0fNCd7wOpRB1mU2mH9T8gaBGbAAyIIVgB2G7xG0GP98zMAQ==", + "license": "MIT", + "funding": { + "type": "github", + "url": "https://github.com/sponsors/wooorm" + } + }, + "node_modules/bcp-47-normalize": { + "version": "2.3.0", + "resolved": "https://registry.npmjs.org/bcp-47-normalize/-/bcp-47-normalize-2.3.0.tgz", + "integrity": "sha512-8I/wfzqQvttUFz7HVJgIZ7+dj3vUaIyIxYXaTRP1YWoSDfzt6TUmxaKZeuXR62qBmYr+nvuWINFRl6pZ5DlN4Q==", + "license": "MIT", + "dependencies": { + "bcp-47": "^2.0.0", + "bcp-47-match": "^2.0.0" + }, + "funding": { + "type": "github", + "url": "https://github.com/sponsors/wooorm" + } + }, "node_modules/brace-expansion": { "version": "5.0.4", "resolved": "https://registry.npmjs.org/brace-expansion/-/brace-expansion-5.0.4.tgz", @@ -3027,6 +3254,12 @@ "integrity": "sha512-IV3Ou0jSMzZrd3pZ48nLkT9DA7Ag1pnPzaiQhpW7c3RbcqqzvzzVu+L8gfqMp/8IM2MQtSiqaCxrrcfu8I8rMA==", "license": "MIT" }, + "node_modules/codem-isoboxer": { + "version": "0.3.10", + "resolved": "https://registry.npmjs.org/codem-isoboxer/-/codem-isoboxer-0.3.10.tgz", + "integrity": "sha512-eNk3TRV+xQMJ1PEj0FQGY8KD4m0GPxT487XJ+Iftm7mVa9WpPFDMWqPt+46buiP5j5Wzqe5oMIhqBcAeKfygSA==", + "license": "MIT" + }, "node_modules/color-convert": { "version": "2.0.1", "resolved": "https://registry.npmjs.org/color-convert/-/color-convert-2.0.1.tgz", @@ -3090,6 +3323,30 @@ "dev": true, "license": "BSD-2-Clause" }, + "node_modules/dashjs": { + "version": "5.1.1", + "resolved": "https://registry.npmjs.org/dashjs/-/dashjs-5.1.1.tgz", + "integrity": "sha512-BzNXlUgzEjhuZ5M5hlSp1qIyQHZ7NpXAR0loP9DAAFVZj/ntL1DHeZ7qp/L3bvI4rq50X5indkAZQ3zEHWJoCA==", + "license": "BSD-3-Clause", + "dependencies": { + "@svta/cml-608": "1.0.1", + "@svta/cml-cmcd": "1.0.1", + "@svta/cml-cmsd": "1.0.1", + "@svta/cml-dash": "1.0.1", + "@svta/cml-id3": "1.0.1", + "@svta/cml-request": "1.0.1", + "@svta/cml-xml": "1.0.1", + "bcp-47-match": "^2.0.3", + "bcp-47-normalize": "^2.3.0", + "codem-isoboxer": "0.3.10", + "fast-deep-equal": "3.1.3", + "html-entities": "^2.5.2", + "imsc": "^1.1.5", + "localforage": "^1.10.0", + "path-browserify": "^1.0.1", + "ua-parser-js": "^1.0.37" + } + }, "node_modules/data-view-buffer": { "version": "1.0.2", "resolved": "https://registry.npmjs.org/data-view-buffer/-/data-view-buffer-1.0.2.tgz", @@ -4136,7 +4393,6 @@ "version": "3.1.3", "resolved": "https://registry.npmjs.org/fast-deep-equal/-/fast-deep-equal-3.1.3.tgz", "integrity": "sha512-f3qQ9oQy9j2AhBe/H9VC91wLmKBCCU/gDOnKNAYG5hswO7BLKj09Hc5HYNz9cGI++xlpDCIgDaitVs03ATR84Q==", - "dev": true, "license": "MIT" }, "node_modules/fast-diff": { @@ -4609,6 +4865,28 @@ "hermes-estree": "0.25.1" } }, + "node_modules/hls.js": { + "version": "1.6.15", + "resolved": "https://registry.npmjs.org/hls.js/-/hls.js-1.6.15.tgz", + "integrity": "sha512-E3a5VwgXimGHwpRGV+WxRTKeSp2DW5DI5MWv34ulL3t5UNmyJWCQ1KmLEHbYzcfThfXG8amBL+fCYPneGHC4VA==", + "license": "Apache-2.0" + }, + "node_modules/html-entities": { + "version": "2.6.0", + "resolved": "https://registry.npmjs.org/html-entities/-/html-entities-2.6.0.tgz", + "integrity": "sha512-kig+rMn/QOVRvr7c86gQ8lWXq+Hkv6CbAH1hLu+RG338StTpE8Z0b44SDVaqVu7HGKf27frdmUYEs9hTUX/cLQ==", + "funding": [ + { + "type": "github", + "url": "https://github.com/sponsors/mdevils" + }, + { + "type": "patreon", + "url": "https://patreon.com/mdevils" + } + ], + "license": "MIT" + }, "node_modules/ignore": { "version": "7.0.5", "resolved": "https://registry.npmjs.org/ignore/-/ignore-7.0.5.tgz", @@ -4619,6 +4897,12 @@ "node": ">= 4" } }, + "node_modules/immediate": { + "version": "3.0.6", + "resolved": "https://registry.npmjs.org/immediate/-/immediate-3.0.6.tgz", + "integrity": "sha512-XXOFtyqDjNDAQxVfYxuF7g9Il/IbWmmlQg2MYKOH8ExIT1qg6xc4zyS3HaEEATgs1btfzxq15ciUiY7gjSXRGQ==", + "license": "MIT" + }, "node_modules/import-fresh": { "version": "3.3.1", "resolved": "https://registry.npmjs.org/import-fresh/-/import-fresh-3.3.1.tgz", @@ -4636,6 +4920,15 @@ "url": "https://github.com/sponsors/sindresorhus" } }, + "node_modules/imsc": { + "version": "1.1.5", + "resolved": "https://registry.npmjs.org/imsc/-/imsc-1.1.5.tgz", + "integrity": "sha512-V8je+CGkcvGhgl2C1GlhqFFiUOIEdwXbXLiu1Fcubvvbo+g9inauqT3l0pNYXGoLPBj3jxtZz9t+wCopMkwadQ==", + "license": "BSD-2-Clause", + "dependencies": { + "sax": "1.2.1" + } + }, "node_modules/imurmurhash": { "version": "0.1.4", "resolved": "https://registry.npmjs.org/imurmurhash/-/imurmurhash-0.1.4.tgz", @@ -4661,6 +4954,30 @@ "node": ">= 0.4" } }, + "node_modules/is-alphabetical": { + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/is-alphabetical/-/is-alphabetical-2.0.1.tgz", + "integrity": "sha512-FWyyY60MeTNyeSRpkM2Iry0G9hpr7/9kD40mD/cGQEuilcZYS4okz8SN2Q6rLCJ8gbCt6fN+rC+6tMGS99LaxQ==", + "license": "MIT", + "funding": { + "type": "github", + "url": "https://github.com/sponsors/wooorm" + } + }, + "node_modules/is-alphanumerical": { + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/is-alphanumerical/-/is-alphanumerical-2.0.1.tgz", + "integrity": "sha512-hmbYhX/9MUMF5uh7tOXyK/n0ZvWpad5caBA17GsC6vyuCqaWliRG5K1qS9inmUhEMaOBIW7/whAnSwveW/LtZw==", + "license": "MIT", + "dependencies": { + "is-alphabetical": "^2.0.0", + "is-decimal": "^2.0.0" + }, + "funding": { + "type": "github", + "url": "https://github.com/sponsors/wooorm" + } + }, "node_modules/is-array-buffer": { "version": "3.0.5", "resolved": "https://registry.npmjs.org/is-array-buffer/-/is-array-buffer-3.0.5.tgz", @@ -4806,6 +5123,16 @@ "url": "https://github.com/sponsors/ljharb" } }, + "node_modules/is-decimal": { + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/is-decimal/-/is-decimal-2.0.1.tgz", + "integrity": "sha512-AAB9hiomQs5DXWcRB1rqsxGUstbRroFOPPVAomNk/3XHR5JyEZChOyTWe2oayKnsSsr/kcGqF+z6yuH6HHpN0A==", + "license": "MIT", + "funding": { + "type": "github", + "url": "https://github.com/sponsors/wooorm" + } + }, "node_modules/is-extglob": { "version": "2.1.1", "resolved": "https://registry.npmjs.org/is-extglob/-/is-extglob-2.1.1.tgz", @@ -5232,6 +5559,15 @@ "node": ">= 0.8.0" } }, + "node_modules/lie": { + "version": "3.1.1", + "resolved": "https://registry.npmjs.org/lie/-/lie-3.1.1.tgz", + "integrity": "sha512-RiNhHysUjhrDQntfYSfY4MU24coXXdEOgw9WGcKHNeEwffDYbF//u87M1EWaMGzuFoSbqW0C9C6lEEhDOAswfw==", + "license": "MIT", + "dependencies": { + "immediate": "~3.0.5" + } + }, "node_modules/lightningcss": { "version": "1.32.0", "resolved": "https://registry.npmjs.org/lightningcss/-/lightningcss-1.32.0.tgz", @@ -5493,6 +5829,15 @@ "url": "https://opencollective.com/parcel" } }, + "node_modules/localforage": { + "version": "1.10.0", + "resolved": "https://registry.npmjs.org/localforage/-/localforage-1.10.0.tgz", + "integrity": "sha512-14/H1aX7hzBBmmh7sGPd+AOMkkIrHM3Z1PAyGgZigA1H1p5O5ANnMyWzvpAETtG68/dC4pC0ncy3+PPGzXZHPg==", + "license": "Apache-2.0", + "dependencies": { + "lie": "3.1.1" + } + }, "node_modules/locate-path": { "version": "6.0.0", "resolved": "https://registry.npmjs.org/locate-path/-/locate-path-6.0.0.tgz", @@ -5995,6 +6340,12 @@ "node": ">=6" } }, + "node_modules/path-browserify": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/path-browserify/-/path-browserify-1.0.1.tgz", + "integrity": "sha512-b7uo2UCUOYZcnF/3ID0lulOJi/bafxa1xPe7ZPsammBSpjSWQkjNxlt635YGS2MiR9GjvuXCtz2emr3jbsz98g==", + "license": "MIT" + }, "node_modules/path-exists": { "version": "4.0.0", "resolved": "https://registry.npmjs.org/path-exists/-/path-exists-4.0.0.tgz", @@ -6453,6 +6804,12 @@ "url": "https://github.com/sponsors/ljharb" } }, + "node_modules/sax": { + "version": "1.2.1", + "resolved": "https://registry.npmjs.org/sax/-/sax-1.2.1.tgz", + "integrity": "sha512-8I2a3LovHTOpm7NV5yOyO8IHqgVsfK4+UuySrXU8YXkSRX7k6hCV9b3HrkKCr3nMpgj+0bmocaJJWpvp1oc7ZA==", + "license": "ISC" + }, "node_modules/scheduler": { "version": "0.27.0", "resolved": "https://registry.npmjs.org/scheduler/-/scheduler-0.27.0.tgz", @@ -7106,6 +7463,32 @@ "typescript": ">=4.8.4 <6.0.0" } }, + "node_modules/ua-parser-js": { + "version": "1.0.41", + "resolved": "https://registry.npmjs.org/ua-parser-js/-/ua-parser-js-1.0.41.tgz", + "integrity": "sha512-LbBDqdIC5s8iROCUjMbW1f5dJQTEFB1+KO9ogbvlb3nm9n4YHa5p4KTvFPWvh2Hs8gZMBuiB1/8+pdfe/tDPug==", + "funding": [ + { + "type": "opencollective", + "url": "https://opencollective.com/ua-parser-js" + }, + { + "type": "paypal", + "url": "https://paypal.me/faisalman" + }, + { + "type": "github", + "url": "https://github.com/sponsors/faisalman" + } + ], + "license": "MIT", + "bin": { + "ua-parser-js": "script/cli.js" + }, + "engines": { + "node": "*" + } + }, "node_modules/unbox-primitive": { "version": "1.1.0", "resolved": "https://registry.npmjs.org/unbox-primitive/-/unbox-primitive-1.1.0.tgz", diff --git a/package.json b/package.json index efff4d8..8bd5e64 100644 --- a/package.json +++ b/package.json @@ -13,6 +13,7 @@ }, "dependencies": { "@gsap/react": "^2.1.2", + "@videojs/react": "^10.0.0-beta.11", "gsap": "^3.14.2", "next": "16.2.1", "react": "19.2.4", From 3a6bc7abd55b770ac8109585c42939199aa743fa Mon Sep 17 00:00:00 2001 From: Antonio Wang <--edit> Date: Fri, 27 Mar 2026 09:32:58 +0100 Subject: [PATCH 02/11] feat: update font styles for improved readability on productions page --- src/app/(snap)/page.tsx | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/src/app/(snap)/page.tsx b/src/app/(snap)/page.tsx index ad39ea7..b46b2cc 100644 --- a/src/app/(snap)/page.tsx +++ b/src/app/(snap)/page.tsx @@ -329,7 +329,7 @@ export default function Home() {
Architecture -
+
We build blazing fast, accessible, and visually stunning websites using the latest stacks (React, Vue, WebGL). We turn designs into interactive reality. @@ -353,7 +353,7 @@ export default function Home() { // Rental
Gear Room
-
+
Need a RED Komodo for the weekend? Or a full Aputure lighting kit? Download our updated catalog or request a quick quote. From 7c6d8d23f22405df74182de3bc9273739df06aee Mon Sep 17 00:00:00 2001 From: Antonio Wang <--edit> Date: Fri, 27 Mar 2026 09:33:10 +0100 Subject: [PATCH 03/11] feat: add WorkProcessGrid component for displaying process steps --- src/components/WorkProcessGrid.tsx | 46 ++++++++++++++++++++++++++++++ 1 file changed, 46 insertions(+) create mode 100644 src/components/WorkProcessGrid.tsx diff --git a/src/components/WorkProcessGrid.tsx b/src/components/WorkProcessGrid.tsx new file mode 100644 index 0000000..571dbb3 --- /dev/null +++ b/src/components/WorkProcessGrid.tsx @@ -0,0 +1,46 @@ +import React from "react"; + +type Props = { + steps: { + description: string; + icon: React.ReactElement; + title: string; + }[]; +}; + +const WorkProcessGrid = ({ steps }: Props) => ( +
+ {steps.map((step, index) => ( +
+ {step.icon} +
+ {step.title} +
+
+ {step.description} +
+
+ ))} +
+); + +export default WorkProcessGrid; From aeb8d980f122556cd7457ec794485d01812dfd2d Mon Sep 17 00:00:00 2001 From: Antonio Wang <--edit> Date: Fri, 27 Mar 2026 09:33:28 +0100 Subject: [PATCH 04/11] feat: refactor WorkProcessGrid integration and define process steps in Events page --- .../events/_components/WorkProcessGrid.tsx | 75 ------------------- src/app/events/page.tsx | 41 +++++++++- 2 files changed, 39 insertions(+), 77 deletions(-) delete mode 100644 src/app/events/_components/WorkProcessGrid.tsx diff --git a/src/app/events/_components/WorkProcessGrid.tsx b/src/app/events/_components/WorkProcessGrid.tsx deleted file mode 100644 index 6d64266..0000000 --- a/src/app/events/_components/WorkProcessGrid.tsx +++ /dev/null @@ -1,75 +0,0 @@ -import React from "react"; -import { - FiCamera, - FiDownloadCloud, - FiEdit, - FiMessageSquare, -} from "react-icons/fi"; - -const WORK_PROCESS_STEPS: { - description: string; - icon: React.ReactElement; - title: string; -}[] = [ - { - description: - "Defining goals, visual style, and key moments that must be captured.", - icon: , - title: "01. Client Briefing", - }, - { - description: - "Discreet, professional, and comprehensive documentation of your event.", - icon: , - title: "02. Event Coverage", - }, - { - description: - "Color grading, editing, and cinematic retouching to our studio standard.", - icon: , - title: "03. Post-Production", - }, - { - description: - "Full resolution digital gallery and cinematic highlight reel delivered.", - icon: , - title: "04. Delivery", - }, -]; - -const WorkProcessGrid = () => ( -
- {WORK_PROCESS_STEPS.map((step, index) => ( -
- {step.icon} -
- {step.title} -
-
- {step.description} -
-
- ))} -
-); - -export default WorkProcessGrid; diff --git a/src/app/events/page.tsx b/src/app/events/page.tsx index a6c2ddc..f43b6cb 100644 --- a/src/app/events/page.tsx +++ b/src/app/events/page.tsx @@ -12,13 +12,50 @@ import SecondaryLink from "@/components/SecondaryLink"; import Image from "next/image"; import type { StaticImageData } from "next/image"; import images from "@/utils/images"; -import WorkProcessGrid from "./_components/WorkProcessGrid"; +import WorkProcessGrid from "@/components/WorkProcessGrid"; +import { + FiMessageSquare, + FiCamera, + FiEdit, + FiDownloadCloud, +} from "react-icons/fi"; const PHILOSOPHY_IMAGES: StaticImageData[] = [ images.birthdays.header[0], images.birthdays.header[1], ]; +const WORK_PROCESS_STEPS: { + description: string; + icon: React.ReactElement; + title: string; +}[] = [ + { + description: + "Defining goals, visual style, and key moments that must be captured.", + icon: , + title: "01. Client Briefing", + }, + { + description: + "Discreet, professional, and comprehensive documentation of your event.", + icon: , + title: "02. Event Coverage", + }, + { + description: + "Color grading, editing, and cinematic retouching to our studio standard.", + icon: , + title: "03. Post-Production", + }, + { + description: + "Full resolution digital gallery and cinematic highlight reel delivered.", + icon: , + title: "04. Delivery", + }, +]; + export default function Events() { const { isNavOpen } = useNav(); @@ -132,7 +169,7 @@ export default function Events() { From concept to delivery in 14 days.
- + {/* Call to Action Section */} From 4b6beab538937a0acb68a8cb8b034f3f0ac6ed22 Mon Sep 17 00:00:00 2001 From: Antonio Wang <--edit> Date: Fri, 27 Mar 2026 09:33:36 +0100 Subject: [PATCH 05/11] feat: add media border radius variable and apply to media-default-skin --- src/app/globals.css | 6 ++++++ 1 file changed, 6 insertions(+) diff --git a/src/app/globals.css b/src/app/globals.css index 106c502..f604bb5 100644 --- a/src/app/globals.css +++ b/src/app/globals.css @@ -26,6 +26,8 @@ --transition-duration: 150ms; --grid-fade-in-duration: 500ms; + + --media-border-radius: 0rem; } /* @@ -44,6 +46,10 @@ ::file-selector-button { border-color: var(--color-gray-200, currentcolor); } + + .media-default-skin { + border-radius: var(--media-border-radius); + } } /* Hero */ From 800e09ecc93f316ddd53ccab9cc1872dc456c37e Mon Sep 17 00:00:00 2001 From: Antonio Wang <--edit> Date: Fri, 27 Mar 2026 09:33:45 +0100 Subject: [PATCH 06/11] feat: add components for production categories, selected productions, showcase reel video player, and visual language section --- .../_components/ProductionCategoriesGrid.tsx | 115 ++++++++++++++++++ .../_components/SelectedProductionsGrid.tsx | 70 +++++++++++ .../_components/ShowcaseReelVideoPlayer.tsx | 32 +++++ .../_components/VisualLanguageSection.tsx | 53 ++++++++ 4 files changed, 270 insertions(+) create mode 100644 src/app/productions/_components/ProductionCategoriesGrid.tsx create mode 100644 src/app/productions/_components/SelectedProductionsGrid.tsx create mode 100644 src/app/productions/_components/ShowcaseReelVideoPlayer.tsx create mode 100644 src/app/productions/_components/VisualLanguageSection.tsx diff --git a/src/app/productions/_components/ProductionCategoriesGrid.tsx b/src/app/productions/_components/ProductionCategoriesGrid.tsx new file mode 100644 index 0000000..97e9767 --- /dev/null +++ b/src/app/productions/_components/ProductionCategoriesGrid.tsx @@ -0,0 +1,115 @@ +import images from "@/utils/images"; +import Image, { StaticImageData } from "next/image"; + +const PRODUCTION_CATEGORIES: { + title: string; + description: string; + src: StaticImageData; +}[] = [ + { + title: "Commercials", + description: + "High-impact brand storytelling designed for global reach and digital conversion. We build brand equity through precision framing.", + src: images.event[0], + }, + { + title: "Event Videos", + description: + "Dynamic coverage for high-end activations, runway shows, and corporate summits. Capturing energy in its purest form.", + src: images.event[1], + }, + { + title: "Documentaries", + description: + "Long-form narratives exploring human culture, technology, and art. Authentic stories told with a cinematic edge.", + src: images.event[2], + }, + { + title: "Social Media", + description: + "Vertically optimized content that disrupts the scroll. Fast-paced, high-energy visuals for modern digital platforms.", + src: images.event[3], + }, +]; + +const ProductionCategoriesGrid = () => ( + //
+ // {PRODUCTION_CATEGORIES.map((category, index) => ( + //
1 ? "md:border-t" : ""} + // p-8 + // flex flex-col gap-4 bg-secondary + // `} + // > + //
+ //
{category.title}
+ //
+ // {category.description} + //
+ //
+ // {category.title} + //
+ // ))} + //
+
+ {PRODUCTION_CATEGORIES.map((category, index) => ( +
+ {category.title} +
+
+ {category.title} +
+
+ {category.description} +
+
+
+ ))} +
+); + +export default ProductionCategoriesGrid; diff --git a/src/app/productions/_components/SelectedProductionsGrid.tsx b/src/app/productions/_components/SelectedProductionsGrid.tsx new file mode 100644 index 0000000..1e1e107 --- /dev/null +++ b/src/app/productions/_components/SelectedProductionsGrid.tsx @@ -0,0 +1,70 @@ +import images from "@/utils/images"; +import Image, { StaticImageData } from "next/image"; +import { FiArrowUpRight } from "react-icons/fi"; + +const SELECTED_PRODUCTIOS_IMAGES: { + description: string; + src: StaticImageData; + title: string; + type: string; +}[] = [ + { + description: "Luxury Real Estate Campaign", + src: images.birthdays.carousels[0][0], + title: "Concrete Dreams", + type: "Commercial", + }, + { + description: "Luxury Real Estate Campaign", + src: images.birthdays.carousels[0][1], + title: "Concrete Dreams", + type: "Commercial", + }, + { + description: "Luxury Real Estate Campaign", + src: images.birthdays.carousels[0][2], + title: "Concrete Dreams", + type: "Commercial", + }, +]; + +const SelectedProductionsGrid = () => ( +
+ {SELECTED_PRODUCTIOS_IMAGES.map((image, index) => ( +
+ {`Lavoro +
+ {image.type} +
+ +
+
+ {image.title} +
+
+ {image.description} +
+
+
+ ))} +
+); + +export default SelectedProductionsGrid; diff --git a/src/app/productions/_components/ShowcaseReelVideoPlayer.tsx b/src/app/productions/_components/ShowcaseReelVideoPlayer.tsx new file mode 100644 index 0000000..e7c0c09 --- /dev/null +++ b/src/app/productions/_components/ShowcaseReelVideoPlayer.tsx @@ -0,0 +1,32 @@ +"use client"; + +import "@videojs/react/video/skin.css"; +import { createPlayer, videoFeatures } from "@videojs/react"; +import { VideoSkin, Video } from "@videojs/react/video"; + +const REEL_VIDEO: { + poster: string; + src: string; +} = { + poster: + "https://cdn.antoniowang.dev/Screenshot%202026-03-24%20at%2022.27.59.png", + src: "https://cdn.antoniowang.dev/Soggetti%20Erotici%20-%20Ah%20ah%20ah%20(Official%20Video)%20%5BKWAXNLzGk9g%5D.webm", +}; + +const ShowcaseReelVideoPlayer = () => { + const Player = createPlayer({ + features: videoFeatures.filter( + (feature) => !["pip", "playbackRate"].includes(feature.name ?? "") + ), + }); + + return ( + + + + + ); +}; + +export default ShowcaseReelVideoPlayer; diff --git a/src/app/productions/_components/VisualLanguageSection.tsx b/src/app/productions/_components/VisualLanguageSection.tsx new file mode 100644 index 0000000..f2c77d4 --- /dev/null +++ b/src/app/productions/_components/VisualLanguageSection.tsx @@ -0,0 +1,53 @@ +import images from "@/utils/images"; +import Image from "next/image"; +import type { StaticImageData } from "next/image"; + +const VISUAL_LANGUAGE_SECTION_IMAGES: StaticImageData[] = [ + images.birthdays.carousels[0][0], + images.birthdays.carousels[0][1], +]; + +const VisualLanguageSection = () => ( +
+
+
The Visual Language of Space
+
+ + We believe every frame is an architectural decision. Our approach to + video production is rooted in structural integrity—treating the + viewport as a canvas for depth and tension. + + + By blending the brutalist aesthetic with cinematic warmth, we create + content that feels both monumental and deeply personal. We don't + just capture events; we curate them into enduring visual legacies. + +
+
+ {/* Horizontal line */} +
+
+ Studio Philosophy +
+
+
+ +
+ {/* Two images */} +
+ {VISUAL_LANGUAGE_SECTION_IMAGES.map((image, index) => ( +
+ {"Visual +
+ ))} +
+
+
+
+); + +export default VisualLanguageSection; From 5133760ce6eea91ad3971ba814cd12ef3fe0558d Mon Sep 17 00:00:00 2001 From: Antonio Wang <--edit> Date: Fri, 27 Mar 2026 09:33:48 +0100 Subject: [PATCH 07/11] feat: enhance productions page with new components and layout adjustments --- src/app/productions/page.tsx | 342 +++++++++++++++-------------------- 1 file changed, 145 insertions(+), 197 deletions(-) diff --git a/src/app/productions/page.tsx b/src/app/productions/page.tsx index 3afed52..5729f35 100644 --- a/src/app/productions/page.tsx +++ b/src/app/productions/page.tsx @@ -1,226 +1,174 @@ "use client"; +import Button from "@/components/Button"; +import Metadata from "@/components/Metadata"; import Navbar from "@/components/Navbar"; -import HorizontalSeparatorLine from "@/components/HorizontalSeparatorLine"; -import Gsap from "gsap"; -import { ScrollSmoother } from "gsap/ScrollSmoother"; -import { ScrollTrigger } from "gsap/ScrollTrigger"; -import { useGSAP } from "@gsap/react"; -import { useRef } from "react"; -import images from "@/utils/images"; -import Image from "next/image"; -import { createSmoothWrapper } from "@/utils/gsap"; - -const productionVideos: { +import { useNav } from "@/contexts/NavContext"; +import { Activity, Suspense } from "react"; +import ShowcaseReelVideoPlayer from "./_components/ShowcaseReelVideoPlayer"; +import Footer from "@/components/Footer"; +import SelectedProductionsGrid from "./_components/SelectedProductionsGrid"; +import ProductionCategoriesGrid from "./_components/ProductionCategoriesGrid"; +import VisualLanguageSection from "./_components/VisualLanguageSection"; +import WorkProcessGrid from "@/components/WorkProcessGrid"; +import { + FiMessageSquare, + FiEdit, + FiDownloadCloud, + FiFilm, +} from "react-icons/fi"; + +const WORK_PROCESS_STEPS: { + description: string; + icon: React.ReactElement; title: string; - id: string; }[] = [ { - title: "Silarus - La Moda che Scorre", - id: "aW9yPWg4ryA", + description: + "Scripting, storyboarding, and strategic alignment to define the visual north star.", + icon: , + title: "01. Concept & Planning", }, { - title: "Spot Morra De Sanctis - CASA Sanremo", - id: "upkRLaQNOFc", + description: + "Execution with industry-standard glass and lighting by our specialized field crew.", + icon: , + title: "02. Shooting", }, { - title: "10 Anni InfoIrpinia", - id: "FwNtA1SdZSQ", + description: + "Non-linear assembly, sound design, and color grading for a distinct aesthetic.", + icon: , + title: "03. Editing", + }, + { + description: + "Platform-optimized assets delivered through our secure client cloud.", + icon: , + title: "04. Final Delivery", }, ]; -Gsap.registerPlugin(ScrollSmoother, ScrollTrigger); - -export default function Works() { - const scrollSmootherWrapper = useRef(null); - - useGSAP( - () => { - // Horizontal scrolling gallery - const panels = Gsap.utils.toArray(".horizontal-gallery-panel"); - const mainEl = document.querySelector("main"); - - if (mainEl === null) return; - - const panelsOffsetWidth = ( - document.querySelector( - ".horizontal-gallery-container" - ) as unknown as HTMLElement - ).offsetWidth; - - createSmoothWrapper({ - content: "#smooth-content", - wrapper: "#smooth-wrapper", - }); - - Gsap.to(panels, { - x: -panelsOffsetWidth, - ease: "none", - scrollTrigger: { - trigger: ".horizontal-gallery-container", - pin: true, - pinSpacing: true, - scrub: 1, - end: `+=${panelsOffsetWidth}`, - }, - }); - - // Brands images marquee infinite scroll - const marquee = document.querySelector( - ".marquee" - ) as unknown as HTMLElement | null; - - if (!marquee) return; - - // Get the children elements from the marquee div - const marqueeChildren = Array.from(marquee.children) as HTMLElement[]; - - // Wait for any images inside the marquee to load so measurements are accurate - void (async () => { - const marqueeImages = Array.from(marquee.querySelectorAll("img")); - await Promise.all( - marqueeImages.map((img) => - img.complete - ? Promise.resolve() - : new Promise((res) => { - img.addEventListener("load", res, { once: true }); - }) - ) - ); - - // One set of a marquee (if there are 8 images it's gonna be the width of 8 images combined) - const singleSetWidth = marquee.scrollWidth; - // The target width: usually we want pretty much more than the viewport - // obviously because otherwise there's gonna be empty spaces - const targetWidth = window.innerWidth + singleSetWidth; - - while (marquee.scrollWidth < targetWidth) { - const fragment = document.createDocumentFragment(); - // For every child of the marquee children, append it to the document fragment - for (const child of marqueeChildren) - fragment.appendChild(child.cloneNode(true)); - - // As a result, append the document fragment to the marquee - marquee.appendChild(fragment); - } - - const totalWidth = singleSetWidth; - let x = 0; - const speed = 1; - - // Once the thing reaches the end then we can "snap" without snapping as it's - // smoothly to the initial position (which is going to be 0). - const setX = Gsap.quickSetter(marquee, "x", "px"); - const tick = () => { - x -= speed; - if (x <= -totalWidth) x += totalWidth; - setX(x); - }; - - Gsap.ticker.add(tick); - })(); - }, - { - scope: scrollSmootherWrapper, - } - ); +export default function Productions() { + const { isNavOpen } = useNav(); return ( <> - {/* Meta tags */} - Lavori - Frame - - -
- {/* Navbar */} - - -
-
-
- I Nostri Lavori -
- -
- Lorem ipsum dolor sit amet consectetur adipiscing elit. Quisque - faucibus ex sapien vitae pellentesque sem placerat. In id cursus - mi pretium tellus duis convallis. Tempus leo eu aenean sed diam - urna tempor. Pulvinar vivamus fringilla lacus nec metus bibendum - egestas. Iaculis massa nisl malesuada lacinia integer nunc - posuere. Ut hendrerit semper vel class aptent taciti sociosqu. Ad - litora torquent per conubia nostra inceptos himenaeos. -
-
- - {/* Horizontal scrolling section */} -
- {images.worksGrid.map((image, index) => ( - {`Production - ))} -
- {/* Production video cards */} - {productionVideos.map((video) => ( +
+ + + + {/* Hero Section */} +
+
+ + {/* Showcase Reel Video Section */} +
+
+
+ Music Video +
+
+ Soggetti Erotici - Ah ah ah +
+
-
- {video.title} -
-
+ +
+ + {/* Selected Productions Grid */} +
+
Selected Productions
+ +
+ + {/* Production Categories Grid */} +
+
+ Categories +
+
Our Expertise
+ +
+ + {/* Visual language section */} +
+ +
+ + {/* The Process Section */} +
+
The Process
+
+ From concept to delivery in 14 days.
- ))} - {/* Brands grid */} -
-
- BRAND CON CUI ABBIAMO COLLABORATO + +
+ + {/* Call to Action Section */} +
+
+ Have a project in mind?
-
- {images.worksBrands.map((image, index) => ( - Logo Brand - ))} + +
+
-
-
-
+ + + {/* Footer */} + }> +