diff --git a/.eslintrc.cjs b/.eslintrc.cjs new file mode 100644 index 0000000..7a1ae3f --- /dev/null +++ b/.eslintrc.cjs @@ -0,0 +1,26 @@ +module.exports = { + extends: [ + "plugin:astro/recommended", + "eslint:recommended", + "plugin:@typescript-eslint/recommended" + ], + overrides: [ + { + files: ["*.astro"], + parser: "astro-eslint-parser", + parserOptions: { + ecmaVersion: "latest", + parser: "@typescript-eslint/parser", + extraFileExtensions: [".astro"], + project: "./tsconfig.json" + }, + rules: {} + } + ], + env: { + node: true + }, + rules: { + "@typescript-eslint/ban-ts-comment": "warn" + } +}; diff --git a/.prettierignore b/.prettierignore new file mode 100644 index 0000000..db4c6d9 --- /dev/null +++ b/.prettierignore @@ -0,0 +1,2 @@ +dist +node_modules \ No newline at end of file diff --git a/.prettierrc.json b/.prettierrc.json new file mode 100644 index 0000000..4790cba --- /dev/null +++ b/.prettierrc.json @@ -0,0 +1,18 @@ +{ + "trailingComma": "none", + "overrides": [ + { + "files": "*.svg", + "options": { + "parser": "html" + } + }, + { + "files": "*.astro", + "options": { + "parser": "astro" + } + } + ], + "plugins": ["prettier-plugin-astro", "prettier-plugin-tailwindcss"] +} \ No newline at end of file diff --git a/.vscode/settings.json b/.vscode/settings.json new file mode 100644 index 0000000..863e4f3 --- /dev/null +++ b/.vscode/settings.json @@ -0,0 +1,21 @@ +{ + "files.autoSave": "onFocusChange", + "editor.formatOnSave": true, + "editor.defaultFormatter": "esbenp.prettier-vscode", + "editor.codeActionsOnSave": { + "source.organizeImports": "explicit" + }, + "eslint.validate": [ + "javascript", + "javascriptreact", + "astro", // Enable .astro + "typescript", // Enable .ts + ], + "prettier.documentSelectors": [ + "**/*.svg", + "**/*.astro" + ], + "css.customData": [ + ".vscode/tailwind.json" + ] +} \ No newline at end of file diff --git a/.vscode/tailwind.json b/.vscode/tailwind.json new file mode 100644 index 0000000..e01ada0 --- /dev/null +++ b/.vscode/tailwind.json @@ -0,0 +1,95 @@ +{ + "version": 1.2, + "atDirectives": [ + { + "name": "@theme", + "description": "Use the `@theme` directive to define your project's custom design tokens, like fonts, colors, and breakpoints.", + "references": [ + { + "name": "Tailwind Documentation", + "url": "https://tailwindcss.com/docs/functions-and-directives#theme-directive" + } + ] + }, + { + "name": "@source", + "description": "Use the `@source` directive to explicitly specify source files that aren't picked up by Tailwind's automatic content detection.", + "references": [ + { + "name": "Tailwind Documentation", + "url": "https://tailwindcss.com/docs/functions-and-directives#source-directive" + } + ] + }, + { + "name": "@utility", + "description": "Use the `@utility` directive to add custom utilities to your project that work with variants like `hover`, `focus` and `lg`.", + "references": [ + { + "name": "Tailwind Documentation", + "url": "https://tailwindcss.com/docs/functions-and-directives#utility-directive" + } + ] + }, + { + "name": "@variant", + "description": "Use the `@variant` directive to apply a Tailwind variant to styles in your CSS.", + "references": [ + { + "name": "Tailwind Documentation", + "url": "https://tailwindcss.com/docs/functions-and-directives#variant-directive" + } + ] + }, + { + "name": "@custom-variant", + "description": "Use the `@custom-variant` directive to add a custom variant in your project.", + "references": [ + { + "name": "Tailwind Documentation", + "url": "https://tailwindcss.com/docs/functions-and-directives#custom-variant-directive" + } + ] + }, + { + "name": "@apply", + "description": "Use the `@apply` directive to inline any existing utility classes into your own custom CSS.", + "references": [ + { + "name": "Tailwind Documentation", + "url": "https://tailwindcss.com/docs/functions-and-directives#apply-directive" + } + ] + }, + { + "name": "@reference", + "description": "If you want to use `@apply` or `@variant` in the ` - diff --git a/public/fonts/lutschine-bold.otf b/public/fonts/lutschine-bold.otf new file mode 100644 index 0000000..928dd59 Binary files /dev/null and b/public/fonts/lutschine-bold.otf differ diff --git a/public/fonts/lutschine-regular.otf b/public/fonts/lutschine-regular.otf new file mode 100644 index 0000000..2fcf136 Binary files /dev/null and b/public/fonts/lutschine-regular.otf differ diff --git a/public/js/howler.min.js b/public/js/howler.min.js new file mode 100644 index 0000000..40f9a2f --- /dev/null +++ b/public/js/howler.min.js @@ -0,0 +1,4 @@ +/*! howler.js v2.2.4 | (c) 2013-2020, James Simpson of GoldFire Studios | MIT License | howlerjs.com */ +!function(){"use strict";var e=function(){this.init()};e.prototype={init:function(){var e=this||n;return e._counter=1e3,e._html5AudioPool=[],e.html5PoolSize=10,e._codecs={},e._howls=[],e._muted=!1,e._volume=1,e._canPlayEvent="canplaythrough",e._navigator="undefined"!=typeof window&&window.navigator?window.navigator:null,e.masterGain=null,e.noAudio=!1,e.usingWebAudio=!0,e.autoSuspend=!0,e.ctx=null,e.autoUnlock=!0,e._setup(),e},volume:function(e){var o=this||n;if(e=parseFloat(e),o.ctx||_(),void 0!==e&&e>=0&&e<=1){if(o._volume=e,o._muted)return o;o.usingWebAudio&&o.masterGain.gain.setValueAtTime(e,n.ctx.currentTime);for(var t=0;t=0;o--)e._howls[o].unload();return e.usingWebAudio&&e.ctx&&void 0!==e.ctx.close&&(e.ctx.close(),e.ctx=null,_()),e},codecs:function(e){return(this||n)._codecs[e.replace(/^x-/,"")]},_setup:function(){var e=this||n;if(e.state=e.ctx?e.ctx.state||"suspended":"suspended",e._autoSuspend(),!e.usingWebAudio)if("undefined"!=typeof Audio)try{var o=new Audio;void 0===o.oncanplaythrough&&(e._canPlayEvent="canplay")}catch(n){e.noAudio=!0}else e.noAudio=!0;try{var o=new Audio;o.muted&&(e.noAudio=!0)}catch(e){}return e.noAudio||e._setupCodecs(),e},_setupCodecs:function(){var e=this||n,o=null;try{o="undefined"!=typeof Audio?new Audio:null}catch(n){return e}if(!o||"function"!=typeof o.canPlayType)return e;var t=o.canPlayType("audio/mpeg;").replace(/^no$/,""),r=e._navigator?e._navigator.userAgent:"",a=r.match(/OPR\/(\d+)/g),u=a&&parseInt(a[0].split("/")[1],10)<33,d=-1!==r.indexOf("Safari")&&-1===r.indexOf("Chrome"),i=r.match(/Version\/(.*?) /),_=d&&i&&parseInt(i[1],10)<15;return e._codecs={mp3:!(u||!t&&!o.canPlayType("audio/mp3;").replace(/^no$/,"")),mpeg:!!t,opus:!!o.canPlayType('audio/ogg; codecs="opus"').replace(/^no$/,""),ogg:!!o.canPlayType('audio/ogg; codecs="vorbis"').replace(/^no$/,""),oga:!!o.canPlayType('audio/ogg; codecs="vorbis"').replace(/^no$/,""),wav:!!(o.canPlayType('audio/wav; codecs="1"')||o.canPlayType("audio/wav")).replace(/^no$/,""),aac:!!o.canPlayType("audio/aac;").replace(/^no$/,""),caf:!!o.canPlayType("audio/x-caf;").replace(/^no$/,""),m4a:!!(o.canPlayType("audio/x-m4a;")||o.canPlayType("audio/m4a;")||o.canPlayType("audio/aac;")).replace(/^no$/,""),m4b:!!(o.canPlayType("audio/x-m4b;")||o.canPlayType("audio/m4b;")||o.canPlayType("audio/aac;")).replace(/^no$/,""),mp4:!!(o.canPlayType("audio/x-mp4;")||o.canPlayType("audio/mp4;")||o.canPlayType("audio/aac;")).replace(/^no$/,""),weba:!(_||!o.canPlayType('audio/webm; codecs="vorbis"').replace(/^no$/,"")),webm:!(_||!o.canPlayType('audio/webm; codecs="vorbis"').replace(/^no$/,"")),dolby:!!o.canPlayType('audio/mp4; codecs="ec-3"').replace(/^no$/,""),flac:!!(o.canPlayType("audio/x-flac;")||o.canPlayType("audio/flac;")).replace(/^no$/,"")},e},_unlockAudio:function(){var e=this||n;if(!e._audioUnlocked&&e.ctx){e._audioUnlocked=!1,e.autoUnlock=!1,e._mobileUnloaded||44100===e.ctx.sampleRate||(e._mobileUnloaded=!0,e.unload()),e._scratchBuffer=e.ctx.createBuffer(1,1,22050);var o=function(n){for(;e._html5AudioPool.length0?d._seek:t._sprite[e][0]/1e3),s=Math.max(0,(t._sprite[e][0]+t._sprite[e][1])/1e3-_),l=1e3*s/Math.abs(d._rate),c=t._sprite[e][0]/1e3,f=(t._sprite[e][0]+t._sprite[e][1])/1e3;d._sprite=e,d._ended=!1;var p=function(){d._paused=!1,d._seek=_,d._start=c,d._stop=f,d._loop=!(!d._loop&&!t._sprite[e][2])};if(_>=f)return void t._ended(d);var m=d._node;if(t._webAudio){var v=function(){t._playLock=!1,p(),t._refreshBuffer(d);var e=d._muted||t._muted?0:d._volume;m.gain.setValueAtTime(e,n.ctx.currentTime),d._playStart=n.ctx.currentTime,void 0===m.bufferSource.start?d._loop?m.bufferSource.noteGrainOn(0,_,86400):m.bufferSource.noteGrainOn(0,_,s):d._loop?m.bufferSource.start(0,_,86400):m.bufferSource.start(0,_,s),l!==1/0&&(t._endTimers[d._id]=setTimeout(t._ended.bind(t,d),l)),o||setTimeout(function(){t._emit("play",d._id),t._loadQueue()},0)};"running"===n.state&&"interrupted"!==n.ctx.state?v():(t._playLock=!0,t.once("resume",v),t._clearTimer(d._id))}else{var h=function(){m.currentTime=_,m.muted=d._muted||t._muted||n._muted||m.muted,m.volume=d._volume*n.volume(),m.playbackRate=d._rate;try{var r=m.play();if(r&&"undefined"!=typeof Promise&&(r instanceof Promise||"function"==typeof r.then)?(t._playLock=!0,p(),r.then(function(){t._playLock=!1,m._unlocked=!0,o?t._loadQueue():t._emit("play",d._id)}).catch(function(){t._playLock=!1,t._emit("playerror",d._id,"Playback was unable to start. This is most commonly an issue on mobile devices and Chrome where playback was not within a user interaction."),d._ended=!0,d._paused=!0})):o||(t._playLock=!1,p(),t._emit("play",d._id)),m.playbackRate=d._rate,m.paused)return void t._emit("playerror",d._id,"Playback was unable to start. This is most commonly an issue on mobile devices and Chrome where playback was not within a user interaction.");"__default"!==e||d._loop?t._endTimers[d._id]=setTimeout(t._ended.bind(t,d),l):(t._endTimers[d._id]=function(){t._ended(d),m.removeEventListener("ended",t._endTimers[d._id],!1)},m.addEventListener("ended",t._endTimers[d._id],!1))}catch(e){t._emit("playerror",d._id,e)}};"data:audio/wav;base64,UklGRigAAABXQVZFZm10IBIAAAABAAEARKwAAIhYAQACABAAAABkYXRhAgAAAAEA"===m.src&&(m.src=t._src,m.load());var y=window&&window.ejecta||!m.readyState&&n._navigator.isCocoonJS;if(m.readyState>=3||y)h();else{t._playLock=!0,t._state="loading";var g=function(){t._state="loaded",h(),m.removeEventListener(n._canPlayEvent,g,!1)};m.addEventListener(n._canPlayEvent,g,!1),t._clearTimer(d._id)}}return d._id},pause:function(e){var n=this;if("loaded"!==n._state||n._playLock)return n._queue.push({event:"pause",action:function(){n.pause(e)}}),n;for(var o=n._getSoundIds(e),t=0;t=0?o=parseInt(r[0],10):e=parseFloat(r[0])}else r.length>=2&&(e=parseFloat(r[0]),o=parseInt(r[1],10));var a;if(!(void 0!==e&&e>=0&&e<=1))return a=o?t._soundById(o):t._sounds[0],a?a._volume:0;if("loaded"!==t._state||t._playLock)return t._queue.push({event:"volume",action:function(){t.volume.apply(t,r)}}),t;void 0===o&&(t._volume=e),o=t._getSoundIds(o);for(var u=0;u0?t/_:t),l=Date.now();e._fadeTo=o,e._interval=setInterval(function(){var r=(Date.now()-l)/t;l=Date.now(),d+=i*r,d=Math.round(100*d)/100,d=i<0?Math.max(o,d):Math.min(o,d),u._webAudio?e._volume=d:u.volume(d,e._id,!0),a&&(u._volume=d),(on&&d>=o)&&(clearInterval(e._interval),e._interval=null,e._fadeTo=null,u.volume(o,e._id),u._emit("fade",e._id))},s)},_stopFade:function(e){var o=this,t=o._soundById(e);return t&&t._interval&&(o._webAudio&&t._node.gain.cancelScheduledValues(n.ctx.currentTime),clearInterval(t._interval),t._interval=null,o.volume(t._fadeTo,e),t._fadeTo=null,o._emit("fade",e)),o},loop:function(){var e,n,o,t=this,r=arguments;if(0===r.length)return t._loop;if(1===r.length){if("boolean"!=typeof r[0])return!!(o=t._soundById(parseInt(r[0],10)))&&o._loop;e=r[0],t._loop=e}else 2===r.length&&(e=r[0],n=parseInt(r[1],10));for(var a=t._getSoundIds(n),u=0;u=0?o=parseInt(r[0],10):e=parseFloat(r[0])}else 2===r.length&&(e=parseFloat(r[0]),o=parseInt(r[1],10));var d;if("number"!=typeof e)return d=t._soundById(o),d?d._rate:t._rate;if("loaded"!==t._state||t._playLock)return t._queue.push({event:"rate",action:function(){t.rate.apply(t,r)}}),t;void 0===o&&(t._rate=e),o=t._getSoundIds(o);for(var i=0;i=0?o=parseInt(r[0],10):t._sounds.length&&(o=t._sounds[0]._id,e=parseFloat(r[0]))}else 2===r.length&&(e=parseFloat(r[0]),o=parseInt(r[1],10));if(void 0===o)return 0;if("number"==typeof e&&("loaded"!==t._state||t._playLock))return t._queue.push({event:"seek",action:function(){t.seek.apply(t,r)}}),t;var d=t._soundById(o);if(d){if(!("number"==typeof e&&e>=0)){if(t._webAudio){var i=t.playing(o)?n.ctx.currentTime-d._playStart:0,_=d._rateSeek?d._rateSeek-d._seek:0;return d._seek+(_+i*Math.abs(d._rate))}return d._node.currentTime}var s=t.playing(o);s&&t.pause(o,!0),d._seek=e,d._ended=!1,t._clearTimer(o),t._webAudio||!d._node||isNaN(d._node.duration)||(d._node.currentTime=e);var l=function(){s&&t.play(o,!0),t._emit("seek",o)};if(s&&!t._webAudio){var c=function(){t._playLock?setTimeout(c,0):l()};setTimeout(c,0)}else l()}return t},playing:function(e){var n=this;if("number"==typeof e){var o=n._soundById(e);return!!o&&!o._paused}for(var t=0;t=0&&n._howls.splice(a,1);var u=!0;for(t=0;t=0){u=!1;break}return r&&u&&delete r[e._src],n.noAudio=!1,e._state="unloaded",e._sounds=[],e=null,null},on:function(e,n,o,t){var r=this,a=r["_on"+e];return"function"==typeof n&&a.push(t?{id:o,fn:n,once:t}:{id:o,fn:n}),r},off:function(e,n,o){var t=this,r=t["_on"+e],a=0;if("number"==typeof n&&(o=n,n=null),n||o)for(a=0;a=0;a--)r[a].id&&r[a].id!==n&&"load"!==e||(setTimeout(function(e){e.call(this,n,o)}.bind(t,r[a].fn),0),r[a].once&&t.off(e,r[a].fn,r[a].id));return t._loadQueue(e),t},_loadQueue:function(e){var n=this;if(n._queue.length>0){var o=n._queue[0];o.event===e&&(n._queue.shift(),n._loadQueue()),e||o.action()}return n},_ended:function(e){var o=this,t=e._sprite;if(!o._webAudio&&e._node&&!e._node.paused&&!e._node.ended&&e._node.currentTime=0;t--){if(o<=n)return;e._sounds[t]._ended&&(e._webAudio&&e._sounds[t]._node&&e._sounds[t]._node.disconnect(0),e._sounds.splice(t,1),o--)}}},_getSoundIds:function(e){var n=this;if(void 0===e){for(var o=[],t=0;t=0;if(!e.bufferSource)return o;if(n._scratchBuffer&&e.bufferSource&&(e.bufferSource.onended=null,e.bufferSource.disconnect(0),t))try{e.bufferSource.buffer=n._scratchBuffer}catch(e){}return e.bufferSource=null,o},_clearSound:function(e){/MSIE |Trident\//.test(n._navigator&&n._navigator.userAgent)||(e.src="data:audio/wav;base64,UklGRigAAABXQVZFZm10IBIAAAABAAEARKwAAIhYAQACABAAAABkYXRhAgAAAAEA")}};var t=function(e){this._parent=e,this.init()};t.prototype={init:function(){var e=this,o=e._parent;return e._muted=o._muted,e._loop=o._loop,e._volume=o._volume,e._rate=o._rate,e._seek=0,e._paused=!0,e._ended=!0,e._sprite="__default",e._id=++n._counter,o._sounds.push(e),e.create(),e},create:function(){var e=this,o=e._parent,t=n._muted||e._muted||e._parent._muted?0:e._volume;return o._webAudio?(e._node=void 0===n.ctx.createGain?n.ctx.createGainNode():n.ctx.createGain(),e._node.gain.setValueAtTime(t,n.ctx.currentTime),e._node.paused=!0,e._node.connect(n.masterGain)):n.noAudio||(e._node=n._obtainHtml5Audio(),e._errorFn=e._errorListener.bind(e),e._node.addEventListener("error",e._errorFn,!1),e._loadFn=e._loadListener.bind(e),e._node.addEventListener(n._canPlayEvent,e._loadFn,!1),e._endFn=e._endListener.bind(e),e._node.addEventListener("ended",e._endFn,!1),e._node.src=o._src,e._node.preload=!0===o._preload?"auto":o._preload,e._node.volume=t*n.volume(),e._node.load()),e},reset:function(){var e=this,o=e._parent;return e._muted=o._muted,e._loop=o._loop,e._volume=o._volume,e._rate=o._rate,e._seek=0,e._rateSeek=0,e._paused=!0,e._ended=!0,e._sprite="__default",e._id=++n._counter,e},_errorListener:function(){var e=this;e._parent._emit("loaderror",e._id,e._node.error?e._node.error.code:0),e._node.removeEventListener("error",e._errorFn,!1)},_loadListener:function(){var e=this,o=e._parent;o._duration=Math.ceil(10*e._node.duration)/10,0===Object.keys(o._sprite).length&&(o._sprite={__default:[0,1e3*o._duration]}),"loaded"!==o._state&&(o._state="loaded",o._emit("load"),o._loadQueue()),e._node.removeEventListener(n._canPlayEvent,e._loadFn,!1)},_endListener:function(){var e=this,n=e._parent;n._duration===1/0&&(n._duration=Math.ceil(10*e._node.duration)/10,n._sprite.__default[1]===1/0&&(n._sprite.__default[1]=1e3*n._duration),n._ended(e)),e._node.removeEventListener("ended",e._endFn,!1)}};var r={},a=function(e){var n=e._src;if(r[n])return e._duration=r[n].duration,void i(e);if(/^data:[^;]+;base64,/.test(n)){for(var o=atob(n.split(",")[1]),t=new Uint8Array(o.length),a=0;a0?(r[o._src]=e,i(o,e)):t()};"undefined"!=typeof Promise&&1===n.ctx.decodeAudioData.length?n.ctx.decodeAudioData(e).then(a).catch(t):n.ctx.decodeAudioData(e,a,t)},i=function(e,n){n&&!e._duration&&(e._duration=n.duration),0===Object.keys(e._sprite).length&&(e._sprite={__default:[0,1e3*e._duration]}),"loaded"!==e._state&&(e._state="loaded",e._emit("load"),e._loadQueue())},_=function(){if(n.usingWebAudio){try{"undefined"!=typeof AudioContext?n.ctx=new AudioContext:"undefined"!=typeof webkitAudioContext?n.ctx=new webkitAudioContext:n.usingWebAudio=!1}catch(e){n.usingWebAudio=!1}n.ctx||(n.usingWebAudio=!1);var e=/iP(hone|od|ad)/.test(n._navigator&&n._navigator.platform),o=n._navigator&&n._navigator.appVersion.match(/OS (\d+)_(\d+)_?(\d+)?/),t=o?parseInt(o[1],10):null;if(e&&t&&t<9){var r=/safari/.test(n._navigator&&n._navigator.userAgent.toLowerCase());n._navigator&&!r&&(n.usingWebAudio=!1)}n.usingWebAudio&&(n.masterGain=void 0===n.ctx.createGain?n.ctx.createGainNode():n.ctx.createGain(),n.masterGain.gain.setValueAtTime(n._muted?0:n._volume,n.ctx.currentTime),n.masterGain.connect(n.ctx.destination)),n._setup()}};"function"==typeof define&&define.amd&&define([],function(){return{Howler:n,Howl:o}}),"undefined"!=typeof exports&&(exports.Howler=n,exports.Howl=o),"undefined"!=typeof global?(global.HowlerGlobal=e,global.Howler=n,global.Howl=o,global.Sound=t):"undefined"!=typeof window&&(window.HowlerGlobal=e,window.Howler=n,window.Howl=o,window.Sound=t)}(); +/*! Spatial Plugin */ +!function(){"use strict";HowlerGlobal.prototype._pos=[0,0,0],HowlerGlobal.prototype._orientation=[0,0,-1,0,1,0],HowlerGlobal.prototype.stereo=function(e){var n=this;if(!n.ctx||!n.ctx.listener)return n;for(var t=n._howls.length-1;t>=0;t--)n._howls[t].stereo(e);return n},HowlerGlobal.prototype.pos=function(e,n,t){var r=this;return r.ctx&&r.ctx.listener?(n="number"!=typeof n?r._pos[1]:n,t="number"!=typeof t?r._pos[2]:t,"number"!=typeof e?r._pos:(r._pos=[e,n,t],void 0!==r.ctx.listener.positionX?(r.ctx.listener.positionX.setTargetAtTime(r._pos[0],Howler.ctx.currentTime,.1),r.ctx.listener.positionY.setTargetAtTime(r._pos[1],Howler.ctx.currentTime,.1),r.ctx.listener.positionZ.setTargetAtTime(r._pos[2],Howler.ctx.currentTime,.1)):r.ctx.listener.setPosition(r._pos[0],r._pos[1],r._pos[2]),r)):r},HowlerGlobal.prototype.orientation=function(e,n,t,r,o,i){var a=this;if(!a.ctx||!a.ctx.listener)return a;var p=a._orientation;return n="number"!=typeof n?p[1]:n,t="number"!=typeof t?p[2]:t,r="number"!=typeof r?p[3]:r,o="number"!=typeof o?p[4]:o,i="number"!=typeof i?p[5]:i,"number"!=typeof e?p:(a._orientation=[e,n,t,r,o,i],void 0!==a.ctx.listener.forwardX?(a.ctx.listener.forwardX.setTargetAtTime(e,Howler.ctx.currentTime,.1),a.ctx.listener.forwardY.setTargetAtTime(n,Howler.ctx.currentTime,.1),a.ctx.listener.forwardZ.setTargetAtTime(t,Howler.ctx.currentTime,.1),a.ctx.listener.upX.setTargetAtTime(r,Howler.ctx.currentTime,.1),a.ctx.listener.upY.setTargetAtTime(o,Howler.ctx.currentTime,.1),a.ctx.listener.upZ.setTargetAtTime(i,Howler.ctx.currentTime,.1)):a.ctx.listener.setOrientation(e,n,t,r,o,i),a)},Howl.prototype.init=function(e){return function(n){var t=this;return t._orientation=n.orientation||[1,0,0],t._stereo=n.stereo||null,t._pos=n.pos||null,t._pannerAttr={coneInnerAngle:void 0!==n.coneInnerAngle?n.coneInnerAngle:360,coneOuterAngle:void 0!==n.coneOuterAngle?n.coneOuterAngle:360,coneOuterGain:void 0!==n.coneOuterGain?n.coneOuterGain:0,distanceModel:void 0!==n.distanceModel?n.distanceModel:"inverse",maxDistance:void 0!==n.maxDistance?n.maxDistance:1e4,panningModel:void 0!==n.panningModel?n.panningModel:"HRTF",refDistance:void 0!==n.refDistance?n.refDistance:1,rolloffFactor:void 0!==n.rolloffFactor?n.rolloffFactor:1},t._onstereo=n.onstereo?[{fn:n.onstereo}]:[],t._onpos=n.onpos?[{fn:n.onpos}]:[],t._onorientation=n.onorientation?[{fn:n.onorientation}]:[],e.call(this,n)}}(Howl.prototype.init),Howl.prototype.stereo=function(n,t){var r=this;if(!r._webAudio)return r;if("loaded"!==r._state)return r._queue.push({event:"stereo",action:function(){r.stereo(n,t)}}),r;var o=void 0===Howler.ctx.createStereoPanner?"spatial":"stereo";if(void 0===t){if("number"!=typeof n)return r._stereo;r._stereo=n,r._pos=[n,0,0]}for(var i=r._getSoundIds(t),a=0;a diff --git a/src/assets/awards/2010-young-composers-awards-asme.mdx b/src/assets/awards/2010-young-composers-awards-asme.mdx new file mode 100644 index 0000000..cd80add --- /dev/null +++ b/src/assets/awards/2010-young-composers-awards-asme.mdx @@ -0,0 +1,7 @@ +--- +title: First and Second Places +giver: Australian Society of Music Educators Young Composers Awards (SA) +date: 2011-09-01 +--- + +Multiple awards in various categories ranging from first to second place between 2010 and 2014. diff --git a/src/assets/awards/2011-national-representative-asme.mdx b/src/assets/awards/2011-national-representative-asme.mdx new file mode 100644 index 0000000..b660c39 --- /dev/null +++ b/src/assets/awards/2011-national-representative-asme.mdx @@ -0,0 +1,7 @@ +--- +title: National Representative +giver: Australian Society of Music Educators +date: 2011-10-01 +--- + +South Australian Young Composer Representative in the Australian Society of Music Educators Bi-annual National Conference. diff --git a/src/assets/awards/2012-special-interest-music-award-governor-of-south-australia.mdx b/src/assets/awards/2012-special-interest-music-award-governor-of-south-australia.mdx new file mode 100644 index 0000000..bd732fb --- /dev/null +++ b/src/assets/awards/2012-special-interest-music-award-governor-of-south-australia.mdx @@ -0,0 +1,7 @@ +--- +title: Special Interest Music Centre Award +giver: Governor of South Australia +date: 2012-02-01 +--- + +Awarded by His Excellency Rear Admiral Kevin Scarce. diff --git a/src/assets/awards/2013-best-composer-sasa.mdx b/src/assets/awards/2013-best-composer-sasa.mdx new file mode 100644 index 0000000..1660fbc --- /dev/null +++ b/src/assets/awards/2013-best-composer-sasa.mdx @@ -0,0 +1,7 @@ +--- +title: Best Composer (Nomination) +giver: South Australian Screen Awards +date: 2013-10-01 +--- + +Nomination for Best Composer with the score for the short film _Ella_. diff --git a/src/assets/awards/2014-music-directors-award-elder-con.mdx b/src/assets/awards/2014-music-directors-award-elder-con.mdx new file mode 100644 index 0000000..29184e9 --- /dev/null +++ b/src/assets/awards/2014-music-directors-award-elder-con.mdx @@ -0,0 +1,7 @@ +--- +title: Music Director's Award +giver: Elder Conservatorium +date: 2014-06-01 +--- + +Awarded by Graeme Koehne for excellence in orchestration and active community involvement with the Woodville Concert Band. diff --git a/src/assets/awards/2022-bos-independent-short-awards.mdx b/src/assets/awards/2022-bos-independent-short-awards.mdx new file mode 100644 index 0000000..f70523d --- /dev/null +++ b/src/assets/awards/2022-bos-independent-short-awards.mdx @@ -0,0 +1,7 @@ +--- +title: Best Original Score (Silver) +giver: Independent Short Awards +date: 2022-04-14 +--- + +Silver Award for Best Original Score with _Scooter_. diff --git a/src/assets/awards/2022-young-citizen-of-the-year-city-of-charles-sturt.mdx b/src/assets/awards/2022-young-citizen-of-the-year-city-of-charles-sturt.mdx new file mode 100644 index 0000000..12dd06d --- /dev/null +++ b/src/assets/awards/2022-young-citizen-of-the-year-city-of-charles-sturt.mdx @@ -0,0 +1,7 @@ +--- +title: Young Citizen of the Year (Nomination) +giver: City of Charles Sturt +date: 2022-01-26 +--- + +Nomination for Young Citizen of the Year in the Volunteer Awards for the City of Charles Sturt. diff --git a/src/assets/awards/2025-event-of-the-year-city-of-charles-sturt.mdx b/src/assets/awards/2025-event-of-the-year-city-of-charles-sturt.mdx new file mode 100644 index 0000000..06e4922 --- /dev/null +++ b/src/assets/awards/2025-event-of-the-year-city-of-charles-sturt.mdx @@ -0,0 +1,7 @@ +--- +title: Event of the Year (Nomination) +giver: City of Charles Sturt +date: 2025-01-26 +--- + +Nomination for Event of the Year with _The Lion and the Mouse_ in partnership with the [Woodville Concert Band](https://www.woodvillecb.com.au). diff --git a/src/assets/awards/2025-local-legend-mark-butler.mdx b/src/assets/awards/2025-local-legend-mark-butler.mdx new file mode 100644 index 0000000..df97e83 --- /dev/null +++ b/src/assets/awards/2025-local-legend-mark-butler.mdx @@ -0,0 +1,7 @@ +--- +title: Local Legend (Nomination) +giver: Mark Butler Volunteer Awards +date: 2025-06-14 +--- + +For contribution to the community. diff --git a/src/assets/background.svg b/src/assets/background.svg deleted file mode 100644 index 4b2be0a..0000000 --- a/src/assets/background.svg +++ /dev/null @@ -1 +0,0 @@ - diff --git a/src/assets/bios/about.mdx b/src/assets/bios/about.mdx new file mode 100644 index 0000000..131c6a2 --- /dev/null +++ b/src/assets/bios/about.mdx @@ -0,0 +1,15 @@ +Nathan Cummins is an award-winning composer, orchestrator, conductor, and performer, based in Adelaide, South Australia. +He specialises in crafted orchestration for video games, film, and television with a focus on live and vibrant textures across multiple genres and mediums. +His original works and orchestrations have featured prominently in media and in the concert hall, including performances by the Australian String Quartet, the Elder Conservatorium Wind Orchestra, and the Gold Coast Philharmonic Orchestra. +His orchestrations have been used in concerts and recording sessions throughout the world. + +Nathan's research interests include accessible forms of music performance and composition using virtual reality technologies. +He was awarded his Doctor of Philosophy in Sonic Arts and Music Composition from the Elder Conservatorium of Music in 2021. +Previously, he graduated with a Bachelor of Music (Composition) with First Class Honours, studying under Graeme Koehne AO, John Polglaise, Charles Bodman Rae, and Luke Harrald. + +Nathan is a leading figure of the Adelaide music scene and is amongst Australia's leading directors, arrangers, and organisers for concerts involving music related to video games. +As a player of many different instruments, he has instrumental residencies in ensembles of various genres and has appeared as a session musician in many studio recordings on trumpet, sousaphone, voice, and as a conductor. +He is the Artistic Director of the [Woodville Concert Band](https://www.woodvillecb.com.au). + +Nathan is currently composing and orchestrating music spanning many genres, from Classical, Choral, and Electronic, to Jazz and Big Band, for a number of creators around Australia, including film directors, dance choreographers, game designers, studio producers, composers, and lyricists. +He is always keen to be involved in new projects, whether composing, orchestrating, conducting, recording, or performing. diff --git a/src/assets/bios/short.mdx b/src/assets/bios/short.mdx new file mode 100644 index 0000000..2895220 --- /dev/null +++ b/src/assets/bios/short.mdx @@ -0,0 +1,2 @@ +Nathan Cummins is an award-winning composer, orchestrator, sound designer, and conductor known for his vibrant music across video games, film, and live performance. +Based in Adelaide, he brings classical craft, bold creativity, and technical innovation to every project—from the playful music of _Dungeons and Dining Tables_, to the orchestration on _Awoken_ (composed by Christopher Larkin), and to directing multimedia concert events that bring game music to life on stage. diff --git a/src/assets/img/about.jpg b/src/assets/img/about.jpg new file mode 100644 index 0000000..38d21c0 Binary files /dev/null and b/src/assets/img/about.jpg differ diff --git a/src/assets/img/hero/nathan-cummins-composer-orchestrator-conductor-1.jpg b/src/assets/img/hero/nathan-cummins-composer-orchestrator-conductor-1.jpg new file mode 100644 index 0000000..e6a7525 Binary files /dev/null and b/src/assets/img/hero/nathan-cummins-composer-orchestrator-conductor-1.jpg differ diff --git a/src/assets/img/hero/nathan-cummins-composer-orchestrator-conductor-2.png b/src/assets/img/hero/nathan-cummins-composer-orchestrator-conductor-2.png new file mode 100644 index 0000000..104548b Binary files /dev/null and b/src/assets/img/hero/nathan-cummins-composer-orchestrator-conductor-2.png differ diff --git a/src/assets/img/hero/nathan-cummins-composer-orchestrator-conductor-3.jpg b/src/assets/img/hero/nathan-cummins-composer-orchestrator-conductor-3.jpg new file mode 100644 index 0000000..d80c507 Binary files /dev/null and b/src/assets/img/hero/nathan-cummins-composer-orchestrator-conductor-3.jpg differ diff --git a/src/assets/img/hero/nathan-cummins-composer-orchestrator-conductor-4.jpg b/src/assets/img/hero/nathan-cummins-composer-orchestrator-conductor-4.jpg new file mode 100644 index 0000000..76928bc Binary files /dev/null and b/src/assets/img/hero/nathan-cummins-composer-orchestrator-conductor-4.jpg differ diff --git a/src/assets/img/hero/nathan-cummins-composer-orchestrator-conductor-5.jpg b/src/assets/img/hero/nathan-cummins-composer-orchestrator-conductor-5.jpg new file mode 100644 index 0000000..9d4c8cf Binary files /dev/null and b/src/assets/img/hero/nathan-cummins-composer-orchestrator-conductor-5.jpg differ diff --git a/src/assets/img/hero/nathan-cummins-composer-orchestrator-conductor-6.jpg b/src/assets/img/hero/nathan-cummins-composer-orchestrator-conductor-6.jpg new file mode 100644 index 0000000..97afd2d Binary files /dev/null and b/src/assets/img/hero/nathan-cummins-composer-orchestrator-conductor-6.jpg differ diff --git a/src/assets/img/project-heros/nathan-cummins-awoken-1.jpg b/src/assets/img/project-heros/nathan-cummins-awoken-1.jpg new file mode 100644 index 0000000..12c82d6 Binary files /dev/null and b/src/assets/img/project-heros/nathan-cummins-awoken-1.jpg differ diff --git a/src/assets/img/project-heros/nathan-cummins-barbecue-1.jpg b/src/assets/img/project-heros/nathan-cummins-barbecue-1.jpg new file mode 100644 index 0000000..a713d4a Binary files /dev/null and b/src/assets/img/project-heros/nathan-cummins-barbecue-1.jpg differ diff --git a/src/assets/img/project-heros/nathan-cummins-down-to-earth-1.jpg b/src/assets/img/project-heros/nathan-cummins-down-to-earth-1.jpg new file mode 100644 index 0000000..c438a9b Binary files /dev/null and b/src/assets/img/project-heros/nathan-cummins-down-to-earth-1.jpg differ diff --git a/src/assets/img/project-heros/nathan-cummins-dungeons-and-dining-tables-1.jpg b/src/assets/img/project-heros/nathan-cummins-dungeons-and-dining-tables-1.jpg new file mode 100644 index 0000000..1528b8d Binary files /dev/null and b/src/assets/img/project-heros/nathan-cummins-dungeons-and-dining-tables-1.jpg differ diff --git a/src/assets/img/project-heros/nathan-cummins-ella-1.jpg b/src/assets/img/project-heros/nathan-cummins-ella-1.jpg new file mode 100644 index 0000000..37d987f Binary files /dev/null and b/src/assets/img/project-heros/nathan-cummins-ella-1.jpg differ diff --git a/src/assets/img/project-heros/nathan-cummins-frontier-quest-1.jpg b/src/assets/img/project-heros/nathan-cummins-frontier-quest-1.jpg new file mode 100644 index 0000000..8d7bb4e Binary files /dev/null and b/src/assets/img/project-heros/nathan-cummins-frontier-quest-1.jpg differ diff --git a/src/assets/img/project-heros/nathan-cummins-lucies-potager-1.jpg b/src/assets/img/project-heros/nathan-cummins-lucies-potager-1.jpg new file mode 100644 index 0000000..317e00b Binary files /dev/null and b/src/assets/img/project-heros/nathan-cummins-lucies-potager-1.jpg differ diff --git a/src/assets/img/project-heros/nathan-cummins-meowing-point-1.jpg b/src/assets/img/project-heros/nathan-cummins-meowing-point-1.jpg new file mode 100644 index 0000000..3571806 Binary files /dev/null and b/src/assets/img/project-heros/nathan-cummins-meowing-point-1.jpg differ diff --git a/src/assets/img/project-heros/nathan-cummins-music-with-motion-down-under-1.png b/src/assets/img/project-heros/nathan-cummins-music-with-motion-down-under-1.png new file mode 100644 index 0000000..4885b44 Binary files /dev/null and b/src/assets/img/project-heros/nathan-cummins-music-with-motion-down-under-1.png differ diff --git a/src/assets/img/project-heros/nathan-cummins-pixelated-symphonies-1.jpg b/src/assets/img/project-heros/nathan-cummins-pixelated-symphonies-1.jpg new file mode 100644 index 0000000..a6f1803 Binary files /dev/null and b/src/assets/img/project-heros/nathan-cummins-pixelated-symphonies-1.jpg differ diff --git a/src/assets/img/project-heros/nathan-cummins-rocs-odyssey-1.jpg b/src/assets/img/project-heros/nathan-cummins-rocs-odyssey-1.jpg new file mode 100644 index 0000000..4c7fbc0 Binary files /dev/null and b/src/assets/img/project-heros/nathan-cummins-rocs-odyssey-1.jpg differ diff --git a/src/assets/img/project-heros/nathan-cummins-scooter-1.jpg b/src/assets/img/project-heros/nathan-cummins-scooter-1.jpg new file mode 100644 index 0000000..430ab30 Binary files /dev/null and b/src/assets/img/project-heros/nathan-cummins-scooter-1.jpg differ diff --git a/src/assets/img/project-heros/nathan-cummins-submerged-1.jpg b/src/assets/img/project-heros/nathan-cummins-submerged-1.jpg new file mode 100644 index 0000000..3f7482f Binary files /dev/null and b/src/assets/img/project-heros/nathan-cummins-submerged-1.jpg differ diff --git a/src/assets/img/project-heros/nathan-cummins-the-lion-and-the-mouse-1.png b/src/assets/img/project-heros/nathan-cummins-the-lion-and-the-mouse-1.png new file mode 100644 index 0000000..c614c8e Binary files /dev/null and b/src/assets/img/project-heros/nathan-cummins-the-lion-and-the-mouse-1.png differ diff --git a/src/assets/img/project-heros/nathan-cummins-tohu-1.jpg b/src/assets/img/project-heros/nathan-cummins-tohu-1.jpg new file mode 100644 index 0000000..2017452 Binary files /dev/null and b/src/assets/img/project-heros/nathan-cummins-tohu-1.jpg differ diff --git a/src/assets/img/projects/awoken/nathan-cummins-awoken-1.jpg b/src/assets/img/projects/awoken/nathan-cummins-awoken-1.jpg new file mode 100644 index 0000000..9ff8ad6 Binary files /dev/null and b/src/assets/img/projects/awoken/nathan-cummins-awoken-1.jpg differ diff --git a/src/assets/img/projects/barbecue/nathan-cummins-barbecue-1.jpg b/src/assets/img/projects/barbecue/nathan-cummins-barbecue-1.jpg new file mode 100644 index 0000000..93f2494 Binary files /dev/null and b/src/assets/img/projects/barbecue/nathan-cummins-barbecue-1.jpg differ diff --git a/src/assets/img/projects/dungeons-and-dining-tables/nathan-cummins-dungeons-and-dining-tables-1.jpg b/src/assets/img/projects/dungeons-and-dining-tables/nathan-cummins-dungeons-and-dining-tables-1.jpg new file mode 100644 index 0000000..a317939 Binary files /dev/null and b/src/assets/img/projects/dungeons-and-dining-tables/nathan-cummins-dungeons-and-dining-tables-1.jpg differ diff --git a/src/assets/img/projects/dungeons-and-dining-tables/nathan-cummins-dungeons-and-dining-tables-10.jpg b/src/assets/img/projects/dungeons-and-dining-tables/nathan-cummins-dungeons-and-dining-tables-10.jpg new file mode 100644 index 0000000..130590e Binary files /dev/null and b/src/assets/img/projects/dungeons-and-dining-tables/nathan-cummins-dungeons-and-dining-tables-10.jpg differ diff --git a/src/assets/img/projects/dungeons-and-dining-tables/nathan-cummins-dungeons-and-dining-tables-11.jpg b/src/assets/img/projects/dungeons-and-dining-tables/nathan-cummins-dungeons-and-dining-tables-11.jpg new file mode 100644 index 0000000..2d6c1c0 Binary files /dev/null and b/src/assets/img/projects/dungeons-and-dining-tables/nathan-cummins-dungeons-and-dining-tables-11.jpg differ diff --git a/src/assets/img/projects/dungeons-and-dining-tables/nathan-cummins-dungeons-and-dining-tables-12.jpg b/src/assets/img/projects/dungeons-and-dining-tables/nathan-cummins-dungeons-and-dining-tables-12.jpg new file mode 100644 index 0000000..f544482 Binary files /dev/null and b/src/assets/img/projects/dungeons-and-dining-tables/nathan-cummins-dungeons-and-dining-tables-12.jpg differ diff --git a/src/assets/img/projects/dungeons-and-dining-tables/nathan-cummins-dungeons-and-dining-tables-13.jpg b/src/assets/img/projects/dungeons-and-dining-tables/nathan-cummins-dungeons-and-dining-tables-13.jpg new file mode 100644 index 0000000..27b83a2 Binary files /dev/null and b/src/assets/img/projects/dungeons-and-dining-tables/nathan-cummins-dungeons-and-dining-tables-13.jpg differ diff --git a/src/assets/img/projects/dungeons-and-dining-tables/nathan-cummins-dungeons-and-dining-tables-14.jpg b/src/assets/img/projects/dungeons-and-dining-tables/nathan-cummins-dungeons-and-dining-tables-14.jpg new file mode 100644 index 0000000..9f6afc9 Binary files /dev/null and b/src/assets/img/projects/dungeons-and-dining-tables/nathan-cummins-dungeons-and-dining-tables-14.jpg differ diff --git a/src/assets/img/projects/dungeons-and-dining-tables/nathan-cummins-dungeons-and-dining-tables-15.jpg b/src/assets/img/projects/dungeons-and-dining-tables/nathan-cummins-dungeons-and-dining-tables-15.jpg new file mode 100644 index 0000000..d350baa Binary files /dev/null and b/src/assets/img/projects/dungeons-and-dining-tables/nathan-cummins-dungeons-and-dining-tables-15.jpg differ diff --git a/src/assets/img/projects/dungeons-and-dining-tables/nathan-cummins-dungeons-and-dining-tables-16.jpg b/src/assets/img/projects/dungeons-and-dining-tables/nathan-cummins-dungeons-and-dining-tables-16.jpg new file mode 100644 index 0000000..ee22a2f Binary files /dev/null and b/src/assets/img/projects/dungeons-and-dining-tables/nathan-cummins-dungeons-and-dining-tables-16.jpg differ diff --git a/src/assets/img/projects/dungeons-and-dining-tables/nathan-cummins-dungeons-and-dining-tables-17.jpg b/src/assets/img/projects/dungeons-and-dining-tables/nathan-cummins-dungeons-and-dining-tables-17.jpg new file mode 100644 index 0000000..d60ebf6 Binary files /dev/null and b/src/assets/img/projects/dungeons-and-dining-tables/nathan-cummins-dungeons-and-dining-tables-17.jpg differ diff --git a/src/assets/img/projects/dungeons-and-dining-tables/nathan-cummins-dungeons-and-dining-tables-18.jpg b/src/assets/img/projects/dungeons-and-dining-tables/nathan-cummins-dungeons-and-dining-tables-18.jpg new file mode 100644 index 0000000..08b8bfc Binary files /dev/null and b/src/assets/img/projects/dungeons-and-dining-tables/nathan-cummins-dungeons-and-dining-tables-18.jpg differ diff --git a/src/assets/img/projects/dungeons-and-dining-tables/nathan-cummins-dungeons-and-dining-tables-19.jpeg b/src/assets/img/projects/dungeons-and-dining-tables/nathan-cummins-dungeons-and-dining-tables-19.jpeg new file mode 100644 index 0000000..69d4f2b Binary files /dev/null and b/src/assets/img/projects/dungeons-and-dining-tables/nathan-cummins-dungeons-and-dining-tables-19.jpeg differ diff --git a/src/assets/img/projects/dungeons-and-dining-tables/nathan-cummins-dungeons-and-dining-tables-2.jpeg b/src/assets/img/projects/dungeons-and-dining-tables/nathan-cummins-dungeons-and-dining-tables-2.jpeg new file mode 100644 index 0000000..0720498 Binary files /dev/null and b/src/assets/img/projects/dungeons-and-dining-tables/nathan-cummins-dungeons-and-dining-tables-2.jpeg differ diff --git a/src/assets/img/projects/dungeons-and-dining-tables/nathan-cummins-dungeons-and-dining-tables-20.png b/src/assets/img/projects/dungeons-and-dining-tables/nathan-cummins-dungeons-and-dining-tables-20.png new file mode 100644 index 0000000..21292a6 Binary files /dev/null and b/src/assets/img/projects/dungeons-and-dining-tables/nathan-cummins-dungeons-and-dining-tables-20.png differ diff --git a/src/assets/img/projects/dungeons-and-dining-tables/nathan-cummins-dungeons-and-dining-tables-3.png b/src/assets/img/projects/dungeons-and-dining-tables/nathan-cummins-dungeons-and-dining-tables-3.png new file mode 100644 index 0000000..9a99a86 Binary files /dev/null and b/src/assets/img/projects/dungeons-and-dining-tables/nathan-cummins-dungeons-and-dining-tables-3.png differ diff --git a/src/assets/img/projects/dungeons-and-dining-tables/nathan-cummins-dungeons-and-dining-tables-4.jpeg b/src/assets/img/projects/dungeons-and-dining-tables/nathan-cummins-dungeons-and-dining-tables-4.jpeg new file mode 100644 index 0000000..70eb505 Binary files /dev/null and b/src/assets/img/projects/dungeons-and-dining-tables/nathan-cummins-dungeons-and-dining-tables-4.jpeg differ diff --git a/src/assets/img/projects/dungeons-and-dining-tables/nathan-cummins-dungeons-and-dining-tables-5.png b/src/assets/img/projects/dungeons-and-dining-tables/nathan-cummins-dungeons-and-dining-tables-5.png new file mode 100644 index 0000000..a8960f4 Binary files /dev/null and b/src/assets/img/projects/dungeons-and-dining-tables/nathan-cummins-dungeons-and-dining-tables-5.png differ diff --git a/src/assets/img/projects/dungeons-and-dining-tables/nathan-cummins-dungeons-and-dining-tables-6.png b/src/assets/img/projects/dungeons-and-dining-tables/nathan-cummins-dungeons-and-dining-tables-6.png new file mode 100644 index 0000000..f0789b1 Binary files /dev/null and b/src/assets/img/projects/dungeons-and-dining-tables/nathan-cummins-dungeons-and-dining-tables-6.png differ diff --git a/src/assets/img/projects/dungeons-and-dining-tables/nathan-cummins-dungeons-and-dining-tables-7.png b/src/assets/img/projects/dungeons-and-dining-tables/nathan-cummins-dungeons-and-dining-tables-7.png new file mode 100644 index 0000000..861c51a Binary files /dev/null and b/src/assets/img/projects/dungeons-and-dining-tables/nathan-cummins-dungeons-and-dining-tables-7.png differ diff --git a/src/assets/img/projects/dungeons-and-dining-tables/nathan-cummins-dungeons-and-dining-tables-8.png b/src/assets/img/projects/dungeons-and-dining-tables/nathan-cummins-dungeons-and-dining-tables-8.png new file mode 100644 index 0000000..dc7d6d1 Binary files /dev/null and b/src/assets/img/projects/dungeons-and-dining-tables/nathan-cummins-dungeons-and-dining-tables-8.png differ diff --git a/src/assets/img/projects/dungeons-and-dining-tables/nathan-cummins-dungeons-and-dining-tables-9.jpg b/src/assets/img/projects/dungeons-and-dining-tables/nathan-cummins-dungeons-and-dining-tables-9.jpg new file mode 100644 index 0000000..1baef28 Binary files /dev/null and b/src/assets/img/projects/dungeons-and-dining-tables/nathan-cummins-dungeons-and-dining-tables-9.jpg differ diff --git a/src/assets/img/projects/ella/nathan-cummins-ella-1.jpg b/src/assets/img/projects/ella/nathan-cummins-ella-1.jpg new file mode 100644 index 0000000..e95b1e1 Binary files /dev/null and b/src/assets/img/projects/ella/nathan-cummins-ella-1.jpg differ diff --git a/src/assets/img/projects/music-with-motion-down-under/nathan-cummins-music-with-motion-1.jpg b/src/assets/img/projects/music-with-motion-down-under/nathan-cummins-music-with-motion-1.jpg new file mode 100644 index 0000000..13822b6 Binary files /dev/null and b/src/assets/img/projects/music-with-motion-down-under/nathan-cummins-music-with-motion-1.jpg differ diff --git a/src/assets/img/projects/music-with-motion-down-under/nathan-cummins-music-with-motion-2.jpg b/src/assets/img/projects/music-with-motion-down-under/nathan-cummins-music-with-motion-2.jpg new file mode 100644 index 0000000..ac8ddd4 Binary files /dev/null and b/src/assets/img/projects/music-with-motion-down-under/nathan-cummins-music-with-motion-2.jpg differ diff --git a/src/assets/img/projects/music-with-motion-down-under/nathan-cummins-music-with-motion-3.jpg b/src/assets/img/projects/music-with-motion-down-under/nathan-cummins-music-with-motion-3.jpg new file mode 100644 index 0000000..e6a7525 Binary files /dev/null and b/src/assets/img/projects/music-with-motion-down-under/nathan-cummins-music-with-motion-3.jpg differ diff --git a/src/assets/img/projects/music-with-motion-down-under/nathan-cummins-music-with-motion-4.jpg b/src/assets/img/projects/music-with-motion-down-under/nathan-cummins-music-with-motion-4.jpg new file mode 100644 index 0000000..76928bc Binary files /dev/null and b/src/assets/img/projects/music-with-motion-down-under/nathan-cummins-music-with-motion-4.jpg differ diff --git a/src/assets/img/projects/music-with-motion-down-under/nathan-cummins-music-with-motion-5.jpg b/src/assets/img/projects/music-with-motion-down-under/nathan-cummins-music-with-motion-5.jpg new file mode 100644 index 0000000..caf8702 Binary files /dev/null and b/src/assets/img/projects/music-with-motion-down-under/nathan-cummins-music-with-motion-5.jpg differ diff --git a/src/assets/img/projects/rocs-odyssey/nathan-cummins-rocs-odyssey-1.jpg b/src/assets/img/projects/rocs-odyssey/nathan-cummins-rocs-odyssey-1.jpg new file mode 100644 index 0000000..8ff50ae Binary files /dev/null and b/src/assets/img/projects/rocs-odyssey/nathan-cummins-rocs-odyssey-1.jpg differ diff --git a/src/assets/img/projects/rocs-odyssey/nathan-cummins-rocs-odyssey-2.jpg b/src/assets/img/projects/rocs-odyssey/nathan-cummins-rocs-odyssey-2.jpg new file mode 100644 index 0000000..ac91ecc Binary files /dev/null and b/src/assets/img/projects/rocs-odyssey/nathan-cummins-rocs-odyssey-2.jpg differ diff --git a/src/assets/img/projects/rocs-odyssey/nathan-cummins-rocs-odyssey-3.jpg b/src/assets/img/projects/rocs-odyssey/nathan-cummins-rocs-odyssey-3.jpg new file mode 100644 index 0000000..0dd895c Binary files /dev/null and b/src/assets/img/projects/rocs-odyssey/nathan-cummins-rocs-odyssey-3.jpg differ diff --git a/src/assets/img/projects/the-lion-and-the-mouse/nathan-cummins-the-lion-and-the-mouse-1.jpg b/src/assets/img/projects/the-lion-and-the-mouse/nathan-cummins-the-lion-and-the-mouse-1.jpg new file mode 100644 index 0000000..0b375ef Binary files /dev/null and b/src/assets/img/projects/the-lion-and-the-mouse/nathan-cummins-the-lion-and-the-mouse-1.jpg differ diff --git a/src/assets/img/projects/the-lion-and-the-mouse/nathan-cummins-the-lion-and-the-mouse-10.jpg b/src/assets/img/projects/the-lion-and-the-mouse/nathan-cummins-the-lion-and-the-mouse-10.jpg new file mode 100644 index 0000000..db96fc9 Binary files /dev/null and b/src/assets/img/projects/the-lion-and-the-mouse/nathan-cummins-the-lion-and-the-mouse-10.jpg differ diff --git a/src/assets/img/projects/the-lion-and-the-mouse/nathan-cummins-the-lion-and-the-mouse-11.jpg b/src/assets/img/projects/the-lion-and-the-mouse/nathan-cummins-the-lion-and-the-mouse-11.jpg new file mode 100644 index 0000000..eb8bbbb Binary files /dev/null and b/src/assets/img/projects/the-lion-and-the-mouse/nathan-cummins-the-lion-and-the-mouse-11.jpg differ diff --git a/src/assets/img/projects/the-lion-and-the-mouse/nathan-cummins-the-lion-and-the-mouse-12.jpg b/src/assets/img/projects/the-lion-and-the-mouse/nathan-cummins-the-lion-and-the-mouse-12.jpg new file mode 100644 index 0000000..0ea52ea Binary files /dev/null and b/src/assets/img/projects/the-lion-and-the-mouse/nathan-cummins-the-lion-and-the-mouse-12.jpg differ diff --git a/src/assets/img/projects/the-lion-and-the-mouse/nathan-cummins-the-lion-and-the-mouse-13.jpg b/src/assets/img/projects/the-lion-and-the-mouse/nathan-cummins-the-lion-and-the-mouse-13.jpg new file mode 100644 index 0000000..37bfd45 Binary files /dev/null and b/src/assets/img/projects/the-lion-and-the-mouse/nathan-cummins-the-lion-and-the-mouse-13.jpg differ diff --git a/src/assets/img/projects/the-lion-and-the-mouse/nathan-cummins-the-lion-and-the-mouse-14.jpg b/src/assets/img/projects/the-lion-and-the-mouse/nathan-cummins-the-lion-and-the-mouse-14.jpg new file mode 100644 index 0000000..ffcf78c Binary files /dev/null and b/src/assets/img/projects/the-lion-and-the-mouse/nathan-cummins-the-lion-and-the-mouse-14.jpg differ diff --git a/src/assets/img/projects/the-lion-and-the-mouse/nathan-cummins-the-lion-and-the-mouse-15.jpg b/src/assets/img/projects/the-lion-and-the-mouse/nathan-cummins-the-lion-and-the-mouse-15.jpg new file mode 100644 index 0000000..2b6aa98 Binary files /dev/null and b/src/assets/img/projects/the-lion-and-the-mouse/nathan-cummins-the-lion-and-the-mouse-15.jpg differ diff --git a/src/assets/img/projects/the-lion-and-the-mouse/nathan-cummins-the-lion-and-the-mouse-16.jpg b/src/assets/img/projects/the-lion-and-the-mouse/nathan-cummins-the-lion-and-the-mouse-16.jpg new file mode 100644 index 0000000..4447333 Binary files /dev/null and b/src/assets/img/projects/the-lion-and-the-mouse/nathan-cummins-the-lion-and-the-mouse-16.jpg differ diff --git a/src/assets/img/projects/the-lion-and-the-mouse/nathan-cummins-the-lion-and-the-mouse-17.jpg b/src/assets/img/projects/the-lion-and-the-mouse/nathan-cummins-the-lion-and-the-mouse-17.jpg new file mode 100644 index 0000000..51f4867 Binary files /dev/null and b/src/assets/img/projects/the-lion-and-the-mouse/nathan-cummins-the-lion-and-the-mouse-17.jpg differ diff --git a/src/assets/img/projects/the-lion-and-the-mouse/nathan-cummins-the-lion-and-the-mouse-18.jpg b/src/assets/img/projects/the-lion-and-the-mouse/nathan-cummins-the-lion-and-the-mouse-18.jpg new file mode 100644 index 0000000..6c1b48b Binary files /dev/null and b/src/assets/img/projects/the-lion-and-the-mouse/nathan-cummins-the-lion-and-the-mouse-18.jpg differ diff --git a/src/assets/img/projects/the-lion-and-the-mouse/nathan-cummins-the-lion-and-the-mouse-19.jpg b/src/assets/img/projects/the-lion-and-the-mouse/nathan-cummins-the-lion-and-the-mouse-19.jpg new file mode 100644 index 0000000..53bd141 Binary files /dev/null and b/src/assets/img/projects/the-lion-and-the-mouse/nathan-cummins-the-lion-and-the-mouse-19.jpg differ diff --git a/src/assets/img/projects/the-lion-and-the-mouse/nathan-cummins-the-lion-and-the-mouse-2.jpg b/src/assets/img/projects/the-lion-and-the-mouse/nathan-cummins-the-lion-and-the-mouse-2.jpg new file mode 100644 index 0000000..018c59b Binary files /dev/null and b/src/assets/img/projects/the-lion-and-the-mouse/nathan-cummins-the-lion-and-the-mouse-2.jpg differ diff --git a/src/assets/img/projects/the-lion-and-the-mouse/nathan-cummins-the-lion-and-the-mouse-20.jpg b/src/assets/img/projects/the-lion-and-the-mouse/nathan-cummins-the-lion-and-the-mouse-20.jpg new file mode 100644 index 0000000..188206d Binary files /dev/null and b/src/assets/img/projects/the-lion-and-the-mouse/nathan-cummins-the-lion-and-the-mouse-20.jpg differ diff --git a/src/assets/img/projects/the-lion-and-the-mouse/nathan-cummins-the-lion-and-the-mouse-21.jpg b/src/assets/img/projects/the-lion-and-the-mouse/nathan-cummins-the-lion-and-the-mouse-21.jpg new file mode 100644 index 0000000..cdd9021 Binary files /dev/null and b/src/assets/img/projects/the-lion-and-the-mouse/nathan-cummins-the-lion-and-the-mouse-21.jpg differ diff --git a/src/assets/img/projects/the-lion-and-the-mouse/nathan-cummins-the-lion-and-the-mouse-22.jpg b/src/assets/img/projects/the-lion-and-the-mouse/nathan-cummins-the-lion-and-the-mouse-22.jpg new file mode 100644 index 0000000..61022dc Binary files /dev/null and b/src/assets/img/projects/the-lion-and-the-mouse/nathan-cummins-the-lion-and-the-mouse-22.jpg differ diff --git a/src/assets/img/projects/the-lion-and-the-mouse/nathan-cummins-the-lion-and-the-mouse-3.jpg b/src/assets/img/projects/the-lion-and-the-mouse/nathan-cummins-the-lion-and-the-mouse-3.jpg new file mode 100644 index 0000000..11e4cc7 Binary files /dev/null and b/src/assets/img/projects/the-lion-and-the-mouse/nathan-cummins-the-lion-and-the-mouse-3.jpg differ diff --git a/src/assets/img/projects/the-lion-and-the-mouse/nathan-cummins-the-lion-and-the-mouse-4.jpg b/src/assets/img/projects/the-lion-and-the-mouse/nathan-cummins-the-lion-and-the-mouse-4.jpg new file mode 100644 index 0000000..0d35976 Binary files /dev/null and b/src/assets/img/projects/the-lion-and-the-mouse/nathan-cummins-the-lion-and-the-mouse-4.jpg differ diff --git a/src/assets/img/projects/the-lion-and-the-mouse/nathan-cummins-the-lion-and-the-mouse-5.jpg b/src/assets/img/projects/the-lion-and-the-mouse/nathan-cummins-the-lion-and-the-mouse-5.jpg new file mode 100644 index 0000000..efd3632 Binary files /dev/null and b/src/assets/img/projects/the-lion-and-the-mouse/nathan-cummins-the-lion-and-the-mouse-5.jpg differ diff --git a/src/assets/img/projects/the-lion-and-the-mouse/nathan-cummins-the-lion-and-the-mouse-6.jpg b/src/assets/img/projects/the-lion-and-the-mouse/nathan-cummins-the-lion-and-the-mouse-6.jpg new file mode 100644 index 0000000..e783977 Binary files /dev/null and b/src/assets/img/projects/the-lion-and-the-mouse/nathan-cummins-the-lion-and-the-mouse-6.jpg differ diff --git a/src/assets/img/projects/the-lion-and-the-mouse/nathan-cummins-the-lion-and-the-mouse-7.jpg b/src/assets/img/projects/the-lion-and-the-mouse/nathan-cummins-the-lion-and-the-mouse-7.jpg new file mode 100644 index 0000000..3444723 Binary files /dev/null and b/src/assets/img/projects/the-lion-and-the-mouse/nathan-cummins-the-lion-and-the-mouse-7.jpg differ diff --git a/src/assets/img/projects/the-lion-and-the-mouse/nathan-cummins-the-lion-and-the-mouse-8.jpg b/src/assets/img/projects/the-lion-and-the-mouse/nathan-cummins-the-lion-and-the-mouse-8.jpg new file mode 100644 index 0000000..c1c20cf Binary files /dev/null and b/src/assets/img/projects/the-lion-and-the-mouse/nathan-cummins-the-lion-and-the-mouse-8.jpg differ diff --git a/src/assets/img/projects/the-lion-and-the-mouse/nathan-cummins-the-lion-and-the-mouse-9.jpg b/src/assets/img/projects/the-lion-and-the-mouse/nathan-cummins-the-lion-and-the-mouse-9.jpg new file mode 100644 index 0000000..612e49b Binary files /dev/null and b/src/assets/img/projects/the-lion-and-the-mouse/nathan-cummins-the-lion-and-the-mouse-9.jpg differ diff --git a/src/assets/img/projects/tohu/nathan-cummins-tohu-1.png b/src/assets/img/projects/tohu/nathan-cummins-tohu-1.png new file mode 100644 index 0000000..25f132d Binary files /dev/null and b/src/assets/img/projects/tohu/nathan-cummins-tohu-1.png differ diff --git a/src/assets/img/tracks/nathan-cummins-centenary-fanfare-1.jpg b/src/assets/img/tracks/nathan-cummins-centenary-fanfare-1.jpg new file mode 100644 index 0000000..e5b3870 Binary files /dev/null and b/src/assets/img/tracks/nathan-cummins-centenary-fanfare-1.jpg differ diff --git a/src/assets/img/tracks/nathan-cummins-end-of-ember-1.jpg b/src/assets/img/tracks/nathan-cummins-end-of-ember-1.jpg new file mode 100644 index 0000000..13f13f5 Binary files /dev/null and b/src/assets/img/tracks/nathan-cummins-end-of-ember-1.jpg differ diff --git a/src/assets/img/tracks/nathan-cummins-guardian-dragon-1.jpg b/src/assets/img/tracks/nathan-cummins-guardian-dragon-1.jpg new file mode 100644 index 0000000..6466daf Binary files /dev/null and b/src/assets/img/tracks/nathan-cummins-guardian-dragon-1.jpg differ diff --git a/src/assets/img/tracks/nathan-cummins-lampshade-grove-1.jpg b/src/assets/img/tracks/nathan-cummins-lampshade-grove-1.jpg new file mode 100644 index 0000000..0a3ecdd Binary files /dev/null and b/src/assets/img/tracks/nathan-cummins-lampshade-grove-1.jpg differ diff --git a/src/assets/img/tracks/nathan-cummins-lucies-potager-1.jpg b/src/assets/img/tracks/nathan-cummins-lucies-potager-1.jpg new file mode 100644 index 0000000..b1865b6 Binary files /dev/null and b/src/assets/img/tracks/nathan-cummins-lucies-potager-1.jpg differ diff --git a/src/assets/img/tracks/nathan-cummins-meowing-point-1.jpg b/src/assets/img/tracks/nathan-cummins-meowing-point-1.jpg new file mode 100644 index 0000000..3571806 Binary files /dev/null and b/src/assets/img/tracks/nathan-cummins-meowing-point-1.jpg differ diff --git a/src/assets/img/tracks/nathan-cummins-odi-et-amo-1.jpg b/src/assets/img/tracks/nathan-cummins-odi-et-amo-1.jpg new file mode 100644 index 0000000..2495921 Binary files /dev/null and b/src/assets/img/tracks/nathan-cummins-odi-et-amo-1.jpg differ diff --git a/src/assets/img/tracks/nathan-cummins-rocs-odyssey-1.jpg b/src/assets/img/tracks/nathan-cummins-rocs-odyssey-1.jpg new file mode 100644 index 0000000..4c7fbc0 Binary files /dev/null and b/src/assets/img/tracks/nathan-cummins-rocs-odyssey-1.jpg differ diff --git a/src/assets/img/tracks/nathan-cummins-string-quartet-no-I-1.jpg b/src/assets/img/tracks/nathan-cummins-string-quartet-no-I-1.jpg new file mode 100644 index 0000000..77454ba Binary files /dev/null and b/src/assets/img/tracks/nathan-cummins-string-quartet-no-I-1.jpg differ diff --git a/src/assets/menu-primary.ts b/src/assets/menu-primary.ts new file mode 100644 index 0000000..e88de80 --- /dev/null +++ b/src/assets/menu-primary.ts @@ -0,0 +1,14 @@ +interface Link { + href: string; + label: string; +} + +const links: Link[] = [ + { href: "/", label: "Home" }, + { href: "/about/", label: "About" }, + { href: "/projects/", label: "Projects" }, + { href: "/recognition/", label: "Recognition" }, + { href: "/contact/", label: "Contact" } +]; + +export default links; diff --git a/src/assets/projects/awoken.mdx b/src/assets/projects/awoken.mdx new file mode 100644 index 0000000..c558ae6 --- /dev/null +++ b/src/assets/projects/awoken.mdx @@ -0,0 +1,24 @@ +--- +title: Awoken +role: Principal Orchestrator +type: Feature Film +date: 2019-07-01 +description: Three young misfits venture into the Australian outback to find what they believe is a meteorite that has crash landed near their country town, only to discover it's something far more mysterious. +images: + { + "hero": + { + "src": "nathan-cummins-awoken-1.jpg", + "alt": "The key poster for the film showing a person covered in blood approaching walking down a hallway to the camera." + }, + "other": "awoken" + } +externalLinks: + [ + { + "name": "Website", + "href": "https://www.screenaustralia.gov.au/the-screen-guide/t/awoken-2019/36883/", + "icon": "mdi:web" + } + ] +--- diff --git a/src/assets/projects/barbecue.mdx b/src/assets/projects/barbecue.mdx new file mode 100644 index 0000000..2b68c1f --- /dev/null +++ b/src/assets/projects/barbecue.mdx @@ -0,0 +1,29 @@ +--- +title: Barbecue +role: Additional Orchestration +type: Feature Film +date: 2017-07-01 +description: The rituals, stories and traditions surrounding the process of cooking meat over an open flame are shared by numerous cultures around the world. +images: + { + "hero": + { + "src": "nathan-cummins-barbecue-1.jpg", + "alt": "A single flaming barbecue in grassy hillside with gray stormy skies." + }, + "other": "barbecue" + } +externalLinks: + [ + { + "name": "Website", + "href": "https://www.urtextfilms.com/barbecue/", + "icon": "mdi:web" + }, + { + "name": "IMDb", + "href": "https://www.imdb.com/title/tt6090268/", + "icon": "fa:imdb" + } + ] +--- diff --git a/src/assets/projects/down-to-earth.mdx b/src/assets/projects/down-to-earth.mdx new file mode 100644 index 0000000..81f130f --- /dev/null +++ b/src/assets/projects/down-to-earth.mdx @@ -0,0 +1,23 @@ +--- +title: Down To Earth +role: Composer +type: Short Film +date: 2020-07-01 +description: Three young misfits venture into the Australian outback to find what they believe is a meteorite that has crash landed near their country town, only to discover it's something far more mysterious. +images: + { + "hero": + { + "src": "nathan-cummins-down-to-earth-1.jpg", + "alt": "The three main characters looking forward at a shooting start seemingly falling to Earth." + } + } +externalLinks: + [ + { + "name": "Website", + "href": "http://downtoearthshortfilm.com/", + "icon": "mdi:web" + } + ] +--- diff --git a/src/assets/projects/dungeons-and-dining-tables.mdx b/src/assets/projects/dungeons-and-dining-tables.mdx new file mode 100644 index 0000000..1755296 --- /dev/null +++ b/src/assets/projects/dungeons-and-dining-tables.mdx @@ -0,0 +1,28 @@ +--- +title: Dungeons and Dining Tables +role: Composer and Sound Designer +type: Video Game +date: 2026-07-01 +description: "Delve dungeons to collect rare furniture, take that furniture back to your home to decorate and the cosier your house is, the higher your stats! 🪑🏡⚔️ Go forth and drive the grumpiness from the land: Your perfect home is just a dungeon away! Oh, and you play as an Axolotl 🥳" +frontPage: { "order": 1 } +images: + { + "hero": + { + "src": "nathan-cummins-dungeons-and-dining-tables-1.jpg", + "alt": "The Dungeons and Dining Tables main character, an axolotl, looking over a valley." + }, + "other": "dungeons-and-dining-tables" + } +externalLinks: + [ + { "name": "Website", "href": "https://dndt.link", "icon": "mdi:web" }, + { + "name": "Steam", + "href": "https://dndt.link/steam", + "icon": "fa7-brands:steam" + } + ] +--- + +I have been enjoying working with Catalyst Games on Dungeons and Dining Tables. diff --git a/src/assets/projects/ella.mdx b/src/assets/projects/ella.mdx new file mode 100644 index 0000000..e23a055 --- /dev/null +++ b/src/assets/projects/ella.mdx @@ -0,0 +1,24 @@ +--- +title: Ella +role: Composer +type: Short Film +date: 2013-07-01 +description: When Ella learns that her sister Gracie is sick, Ella must turn to the stars to help heal her sister. +images: + { + "hero": + { + "src": "nathan-cummins-ella-1.jpg", + "alt": "The key poster showing Ella gazing up to a night sky filled with stars." + }, + "other": "ella" + } +externalLinks: + [ + { + "name": "IMDb", + "href": "https://www.imdb.com/title/tt4564592/", + "icon": "fa:imdb" + } + ] +--- diff --git a/src/assets/projects/frontier-quest.mdx b/src/assets/projects/frontier-quest.mdx new file mode 100644 index 0000000..fd34ba1 --- /dev/null +++ b/src/assets/projects/frontier-quest.mdx @@ -0,0 +1,23 @@ +--- +title: Frontier Quest +role: Composer and Sound Designer +type: Video Game +date: 2021-02-01 +description: Rebuild a frontier town and become acquainted with its community in puzzle-RPG Frontier Quest! Explore the frontier, collect materials and defeat monsters with the right equipment in order to restore the town and uncover the secrets of the frontier. +images: + { + "hero": + { + "src": "nathan-cummins-frontier-quest-1.jpg", + "alt": "A stylised picture of the Frontier Quest main character walking toward the camera." + } + } +externalLinks: + [ + { + "name": "Steam", + "href": "https://store.steampowered.com/app/1384880/Frontier_Quest/", + "icon": "fa7-brands:steam" + } + ] +--- diff --git a/src/assets/projects/lucies-potager.mdx b/src/assets/projects/lucies-potager.mdx new file mode 100644 index 0000000..6b8a091 --- /dev/null +++ b/src/assets/projects/lucies-potager.mdx @@ -0,0 +1,23 @@ +--- +title: Lucie's Potager +role: Composer and Sound Designer +type: Video Game +date: 2023-02-01 +description: Farm and sell exotic plants with Lucie in this shopkeeping RPG! +images: + { + "hero": + { + "src": "nathan-cummins-lucies-potager-1.jpg", + "alt": "A stylised picture of the Lucie's Potager main character, Lucie, walking toward the camera." + } + } +externalLinks: + [ + { + "name": "Steam", + "href": "https://store.steampowered.com/app/1882960/Lucies_Potager/", + "icon": "fa7-brands:steam" + } + ] +--- diff --git a/src/assets/projects/meowing-point.mdx b/src/assets/projects/meowing-point.mdx new file mode 100644 index 0000000..b56781a --- /dev/null +++ b/src/assets/projects/meowing-point.mdx @@ -0,0 +1,28 @@ +--- +title: Meowing Point +role: Additional Music +type: Video Game +date: 2023-10-01 +description: Point and meow. 3D hidden cat game. These creatures have been turned into stone. Find and save them all. +images: + { + "hero": + { + "src": "nathan-cummins-meowing-point-1.jpg", + "alt": "A screenshot of the first main area of the game: a small shop with a cat as its owner." + } + } +externalLinks: + [ + { + "name": "Website", + "href": "https://meowingpoint.com/", + "icon": "mdi:web" + }, + { + "name": "Steam", + "href": "https://store.steampowered.com/app/2528710/Meowing_Point/", + "icon": "fa7-brands:steam" + } + ] +--- diff --git a/src/assets/projects/music-with-motion-down-under.mdx b/src/assets/projects/music-with-motion-down-under.mdx new file mode 100644 index 0000000..bf2beaf --- /dev/null +++ b/src/assets/projects/music-with-motion-down-under.mdx @@ -0,0 +1,25 @@ +--- +title: "Music With Motion: Down Under" +role: Conductor / Artistic Director +type: Concert +date: 2025-11-15 +description: "Music With Motion: Down Under is a dynamic celebration of Australia's video game soundtracks—performed live by a full wind orchestra and synchronised in real time with stunning visuals on the big screen. Premiering all-new orchestrations created especially for this event by award-winning Artistic Director Dr Nathan Cummins, the performance showcases music from games developed across the country, including several from right here in South Australia. Many of these games have never had their music performed live, and you'll be among the very first to hear it." +frontPage: { "order": 2 } +images: + { + "hero": + { + "src": "nathan-cummins-music-with-motion-down-under-1.png", + "alt": "The key poster and artwork for the concert Music With Motion: Down Under." + }, + "other": "music-with-motion-down-under" + } +externalLinks: + [ + { + "name": "Website", + "href": "https://www.woodvillecb.com.au/2025/music-with-motion-down-under/", + "icon": "mdi:web" + } + ] +--- diff --git a/src/assets/projects/pixelated-symphonies.mdx b/src/assets/projects/pixelated-symphonies.mdx new file mode 100644 index 0000000..0569272 --- /dev/null +++ b/src/assets/projects/pixelated-symphonies.mdx @@ -0,0 +1,16 @@ +--- +title: Pixelated Symphonies +role: Conductor / Artistic Director +type: Concert +date: 2025-03-09 +description: "Experience the magic of these legendary symphonic video game soundtracks like never before! Join [the Adelaide Wind Orchestra] for an unforgettable concert of musical enchantment as video game industry insider and composer Dr Nathan Cummins and AWO take you on a wild ride through this iconic music. From the epic adventures of Super Mario to the heartwarming melodies of The Legend of Zelda, immerse yourself and be swept away by the brilliance of Australia's leading symphonic wind orchestra." +frontPage: { "order": 3 } +images: + { + "hero": + { + "src": "nathan-cummins-pixelated-symphonies-1.jpg", + "alt": "The key artwork for the concert Pixelated Symphonies." + } + } +--- diff --git a/src/assets/projects/rocs-odyssey.mdx b/src/assets/projects/rocs-odyssey.mdx new file mode 100644 index 0000000..35cc0b4 --- /dev/null +++ b/src/assets/projects/rocs-odyssey.mdx @@ -0,0 +1,30 @@ +--- +title: Roc's Odyssey +role: Composer and Sound Designer +type: Video Game +date: 2025-02-21 +description: Explore vast landscapes and get lost in a beautiful yet dangerous world in Roc's Odyssey. Filled with intense combat, strange allies, platforming, enemies, treasures, secrets, upgrades, friendships and lore this hand drawn action adventure will have you hooked! +frontPage: { "order": 4 } +images: + { + "hero": + { + "src": "nathan-cummins-rocs-odyssey-1.jpg", + "alt": "The key artwork for Roc's Odyssey: Roc, the main character, looking towards the screen with the title of the game to the left." + }, + "other": "rocs-odyssey" + } +externalLinks: + [ + { + "name": "Website", + "href": "https://www.sunshinefestivalstudios.com/", + "icon": "mdi:web" + }, + { + "name": "Steam", + "href": "https://store.steampowered.com/app/2521270/Rocs_Odyssey/", + "icon": "fa7-brands:steam" + } + ] +--- diff --git a/src/assets/projects/scooter.mdx b/src/assets/projects/scooter.mdx new file mode 100644 index 0000000..f1c1d9e --- /dev/null +++ b/src/assets/projects/scooter.mdx @@ -0,0 +1,23 @@ +--- +title: Scooter +role: Composer +type: Short Film +date: 2022-02-21 +description: An eccentric senior citizen who would like to visit his daughter one last time sets him off on an epic 250km journey from the outback to the city on his trusty scooter. +images: + { + "hero": + { + "src": "nathan-cummins-scooter-1.jpg", + "alt": "A capture of a key point in the short film, the main character travelling on a highway on his mobility scooter." + } + } +externalLinks: + [ + { + "name": "Watch", + "href": "https://www.youtube.com/watch?v=u6P2uyO_DgU", + "icon": "fa7-brands:youtube" + } + ] +--- diff --git a/src/assets/projects/submerged-hidden-depths.mdx b/src/assets/projects/submerged-hidden-depths.mdx new file mode 100644 index 0000000..18783de --- /dev/null +++ b/src/assets/projects/submerged-hidden-depths.mdx @@ -0,0 +1,23 @@ +--- +title: "Submerged: Hidden Depths" +role: Music Transcription & Preparation +type: Video Game +date: 2020-10-22 +description: Boat, climb, interact and explore in the beautiful ruins of a sunken world. +images: + { + "hero": + { + "src": "nathan-cummins-submerged-1.jpg", + "alt": "Both lead characters in travelling on a boat, moving towards the camera." + } + } +externalLinks: + [ + { + "name": "Steam", + "href": "https://store.steampowered.com/app/1614270/Submerged_Hidden_Depths/", + "icon": "fa7-brands:steam" + } + ] +--- diff --git a/src/assets/projects/the-lion-and-the-mouse.mdx b/src/assets/projects/the-lion-and-the-mouse.mdx new file mode 100644 index 0000000..2709b8b --- /dev/null +++ b/src/assets/projects/the-lion-and-the-mouse.mdx @@ -0,0 +1,25 @@ +--- +title: The Lion and the Mouse +role: Composer +type: Concert Music +date: 2024-10-12 +description: "A piece for narrator and orchestra (or wind orchestra) that aims to teach children about music and the instruments of the orchestra. Experience the beloved Aesop fable come to life, through wind instruments and storytelling designed to inspire the imagination of children and families." +frontPage: { "order": 5 } +images: + { + "hero": + { + "src": "nathan-cummins-the-lion-and-the-mouse-1.png", + "alt": "The lion playing the tuba while the mouse looks up at him." + }, + "other": "the-lion-and-the-mouse" + } +externalLinks: + [ + { + "name": "Website", + "href": "https://www.woodvillecb.com.au/2024/the-lion-and-the-mouse/", + "icon": "mdi:web" + } + ] +--- diff --git a/src/assets/projects/tohu.mdx b/src/assets/projects/tohu.mdx new file mode 100644 index 0000000..d1e22f7 --- /dev/null +++ b/src/assets/projects/tohu.mdx @@ -0,0 +1,24 @@ +--- +title: TOHU +role: Brass Arrangement (Junkle), Orchestration (Circus) +type: Video Game +date: 2021-10-22 +description: Experience a brand new adventure game set amongst a world of weird and wonderful fish planets. Explore beautiful environments, solve intricate puzzles and discover the truth about a mysterious little girl and her mechanical alter-ego, Cubus. +images: + { + "hero": + { + "src": "nathan-cummins-tohu-1.jpg", + "alt": "The key hero artwork for TOHU. The main character gazes up to the title of the game." + }, + "other": "tohu" + } +externalLinks: + [ + { + "name": "Steam", + "href": "https://store.steampowered.com/app/1075200/TOHU/", + "icon": "fa7-brands:steam" + } + ] +--- diff --git a/src/assets/socials.ts b/src/assets/socials.ts new file mode 100644 index 0000000..97d282d --- /dev/null +++ b/src/assets/socials.ts @@ -0,0 +1,31 @@ +interface SocialPlatform { + name: string; + url: string; + icon: string; +} + +const github: SocialPlatform = { + name: "GitHub", + url: "https://github.com/encie22", + icon: "fa7-brands:github" +}; + +const imdb: SocialPlatform = { + name: "IMDb", + url: "https://www.imdb.com/name/nm7228362/", + icon: "fa:imdb" +}; + +const linkedin: SocialPlatform = { + name: "LinkedIn", + url: "https://au.linkedin.com/in/nathan-cummins-38492954", + icon: "fa7-brands:linkedin" +}; + +const bluesky: SocialPlatform = { + name: "Bluesky", + url: "https://bsky.app/profile/nathancummins.au", + icon: "fa7-brands:bluesky" +}; + +export const socials: SocialPlatform[] = [imdb, linkedin, github, bluesky]; diff --git a/src/assets/tracks/centenary-fanfare.json b/src/assets/tracks/centenary-fanfare.json new file mode 100644 index 0000000..e51701f --- /dev/null +++ b/src/assets/tracks/centenary-fanfare.json @@ -0,0 +1,22 @@ +{ + "src": "concert-music/Centenary_Fanfare.mp3", + "metadata": { + "title": "Centenary Fanfare", + "subtitle": "Commissioned Works", + "extra": "Elder Conservatorium Wind Orchestra", + "artwork": "nathan-cummins-centenary-fanfare-1.jpg" + }, + "autoQueue": { + "order": 9 + }, + "card": { + "image": { + "src": "nathan-cummins-centenary-fanfare-1.jpg", + "alt": "The Elder Conservatorium Wind Orchestra performing Centenary Fanfare." + }, + "text": { + "primary": "Centenary Fanfare", + "secondary": "Commissioned Works (Wind Ensemble)" + } + } +} diff --git a/src/assets/tracks/end-of-ember.json b/src/assets/tracks/end-of-ember.json new file mode 100644 index 0000000..7878a4e --- /dev/null +++ b/src/assets/tracks/end-of-ember.json @@ -0,0 +1,22 @@ +{ + "src": "end-of-ember/End_of_Ember.mp3", + "metadata": { + "title": "Trailer", + "subtitle": "End of Ember", + "extra": "Synthetic Orchestra and Guitars", + "artwork": "nathan-cummins-end-of-ember-1.jpg" + }, + "autoQueue": { + "order": 3 + }, + "card": { + "image": { + "src": "nathan-cummins-end-of-ember-1.jpg", + "alt": "The main character Ember fighting a hoard of outlandish enemies." + }, + "text": { + "primary": "End of Ember", + "secondary": "Trailer Music" + } + } +} diff --git a/src/assets/tracks/frontier-quest.json b/src/assets/tracks/frontier-quest.json new file mode 100644 index 0000000..9d6ab30 --- /dev/null +++ b/src/assets/tracks/frontier-quest.json @@ -0,0 +1,22 @@ +{ + "src": "frontier-quest/Guardian_Dragon_(Phase_1).mp3", + "metadata": { + "title": "Guardian Dragon (Phase 1)", + "subtitle": "Frontier Quest", + "extra": "Synthetic Orchestra", + "artwork": "nathan-cummins-guardian-dragon-1.jpg" + }, + "autoQueue": { + "order": 8 + }, + "card": { + "image": { + "src": "nathan-cummins-guardian-dragon-1.jpg", + "alt": "The final battle against guardian dragon." + }, + "text": { + "primary": "Guardian Dragon", + "secondary": "Battle Music" + } + } +} diff --git a/src/assets/tracks/lampshade-grove.json b/src/assets/tracks/lampshade-grove.json new file mode 100644 index 0000000..451c1b7 --- /dev/null +++ b/src/assets/tracks/lampshade-grove.json @@ -0,0 +1,22 @@ +{ + "src": "dungeons-and-dining-tables/Lampshade_Grove.mp3", + "metadata": { + "title": "Lampshade Grove", + "subtitle": "Dungeons and Dining Tables", + "extra": "Synthetic Orchestra", + "artwork": "nathan-cummins-lampshade-grove-1.jpg" + }, + "autoQueue": { + "order": 1 + }, + "card": { + "image": { + "src": "nathan-cummins-lampshade-grove-1.jpg", + "alt": "A stylised commissioned artwork of a bird sitting on a tree looking up at plants that appear as lampshades." + }, + "text": { + "primary": "Lampshade Grove", + "secondary": "Level Music (Dungeons and Dining Tables)" + } + } +} diff --git a/src/assets/tracks/lucies-potager.json b/src/assets/tracks/lucies-potager.json new file mode 100644 index 0000000..deee4a5 --- /dev/null +++ b/src/assets/tracks/lucies-potager.json @@ -0,0 +1,22 @@ +{ + "src": "lucies-potager/Lucies_Potager.mp3", + "metadata": { + "title": "Title Theme", + "subtitle": "Lucie's Potager", + "extra": "Synthetic Orchestra", + "artwork": "nathan-cummins-lucies-potager-1.jpg" + }, + "autoQueue": { + "order": 4 + }, + "card": { + "image": { + "src": "nathan-cummins-lucies-potager-1.jpg", + "alt": "Lucie, the main character, in her garden." + }, + "text": { + "primary": "Lucie's Potager", + "secondary": "Main Menu Music" + } + } +} diff --git a/src/assets/tracks/meowing-point.json b/src/assets/tracks/meowing-point.json new file mode 100644 index 0000000..fe01638 --- /dev/null +++ b/src/assets/tracks/meowing-point.json @@ -0,0 +1,22 @@ +{ + "src": "meowing-point/The_Meowing.mp3", + "metadata": { + "title": "The Meowing", + "subtitle": "Meowing Point", + "extra": "Synthesisers (with meows kindly provided by Tomo and Nero)", + "artwork": "nathan-cummins-meowing-point-1.jpg" + }, + "autoQueue": { + "order": 7 + }, + "card": { + "image": { + "src": "nathan-cummins-meowing-point-1.jpg", + "alt": "A screenshot of the first main area of the game: a small shop with a cat as its owner." + }, + "text": { + "primary": "Meowing Point", + "secondary": "Backing Soundtrack" + } + } +} diff --git a/src/assets/tracks/odi-et-amo.json b/src/assets/tracks/odi-et-amo.json new file mode 100644 index 0000000..e5ead0e --- /dev/null +++ b/src/assets/tracks/odi-et-amo.json @@ -0,0 +1,22 @@ +{ + "src": "concert-music/Odi_et_Amo.mp3", + "metadata": { + "title": "Odi et Amo", + "subtitle": "Concert Music (Vocal)", + "extra": "A Cappella Vocal Ensemble", + "artwork": "nathan-cummins-odi-et-amo-1.jpg" + }, + "autoQueue": { + "order": 9 + }, + "card": { + "image": { + "src": "nathan-cummins-odi-et-amo-1.jpg", + "alt": "A few singers holding choral books." + }, + "text": { + "primary": "Odi et Amo", + "secondary": "Concert Music (A Cappella)" + } + } +} diff --git a/src/assets/tracks/rocs-odyssey.json b/src/assets/tracks/rocs-odyssey.json new file mode 100644 index 0000000..14d8407 --- /dev/null +++ b/src/assets/tracks/rocs-odyssey.json @@ -0,0 +1,22 @@ +{ + "src": "rocs-odyssey/Rocs_Odyssey.mp3", + "metadata": { + "title": "Main Theme", + "subtitle": "Roc's Odyssey", + "extra": "Orchestra and Metal Band (Joshua Julian and Scott Stattmann)", + "artwork": "nathan-cummins-rocs-odyssey-1.jpg" + }, + "autoQueue": { + "order": 2 + }, + "card": { + "image": { + "src": "nathan-cummins-rocs-odyssey-1.jpg", + "alt": "The key artwork for Roc's Odyssey: Roc, the main character, looking towards the screen with the title of the game to the left." + }, + "text": { + "primary": "Roc's Odyssey", + "secondary": "Main Theme" + } + } +} diff --git a/src/assets/tracks/string-quartet-no-1.json b/src/assets/tracks/string-quartet-no-1.json new file mode 100644 index 0000000..c332844 --- /dev/null +++ b/src/assets/tracks/string-quartet-no-1.json @@ -0,0 +1,22 @@ +{ + "src": "concert-music/String_Quartet_No._I.mp3", + "metadata": { + "title": "String Quartet No. 1", + "subtitle": "String Quartet", + "extra": "The Australian String Quartet (ASQ)", + "artwork": "nathan-cummins-string-quartet-no-I-1.jpg" + }, + "autoQueue": { + "order": 5 + }, + "card": { + "image": { + "src": "nathan-cummins-string-quartet-no-I-1.jpg", + "alt": "The Australian String Quartet standing in a line facing the camera." + }, + "text": { + "primary": "String Quartet No. I", + "secondary": "Concert Music" + } + } +} diff --git a/src/components/Analytics.astro b/src/components/Analytics.astro new file mode 100644 index 0000000..5dc2a06 --- /dev/null +++ b/src/components/Analytics.astro @@ -0,0 +1,4 @@ + diff --git a/src/components/Award.astro b/src/components/Award.astro new file mode 100644 index 0000000..70c32f6 --- /dev/null +++ b/src/components/Award.astro @@ -0,0 +1,28 @@ +--- +import type { CollectionEntry } from "astro:content"; +import { render } from "astro:content"; + +import Link from "@components/Link.astro"; + +interface Props { + award: CollectionEntry<"awards">; +} + +const { award } = Astro.props as Props; + +const { Content } = await render(award); +--- + +
+
+
+

{award.data.title}

+ + {award.data.giver} ({award.data.date.getFullYear()}) + +
+ +
+ +
+
diff --git a/src/components/AwardCard.astro b/src/components/AwardCard.astro new file mode 100644 index 0000000..09bc4a6 --- /dev/null +++ b/src/components/AwardCard.astro @@ -0,0 +1,30 @@ +--- +import type { CollectionEntry } from "astro:content"; +import { render } from "astro:content"; + +import Link from "@components/Link.astro"; + +interface Props { + award: CollectionEntry<"awards">; +} + +const { award } = Astro.props as Props; + +const { Content } = await render(award); +--- + +
+
+
+
{award.data.title}
+
+ {award.data.giver} ({award.data.date.getFullYear()}) +
+
+
+
+ +
+
+
+
diff --git a/src/components/Footer.astro b/src/components/Footer.astro new file mode 100644 index 0000000..5a4427f --- /dev/null +++ b/src/components/Footer.astro @@ -0,0 +1,60 @@ +--- +import { Icon } from "astro-icon/components"; + +import { socials } from "@assets/socials.ts"; +import Link from "@components/Link.astro"; +--- + +
+
+
    + { + socials.map((social) => ( +
  • + +
  • + )) + } +
+
+

+ Copyright © Nathan Cummins. +

+
+

+ I support and believe in the values of open source software and + communities. This website is made from scratch using the Astro framework + and with Tailwind CSS. The + full source code is available on my self-hosted + Gitea repository. +

+

+ I acknowledge that the land on which I work and live is the traditional + lands of the Kaurna people. I pay respect to their cultural beliefs and to + their Elders past, present, and emerging. +

+
+
+ + diff --git a/src/components/HeroImageNative.astro b/src/components/HeroImageNative.astro new file mode 100644 index 0000000..afb218e --- /dev/null +++ b/src/components/HeroImageNative.astro @@ -0,0 +1,62 @@ +--- +import type { ImageMetadata } from "astro"; + +interface Props { + images: Record Promise<{ default: ImageMetadata }>>; + transitionStyle?: string; +} + +const { images, transitionStyle = "ease-in-out" } = Astro.props as Props; + +const imagesArray = await Promise.all( + Object.values(images).map(async (image) => image()) +); +--- + +
+ + + + diff --git a/src/components/ImageCarousel.astro b/src/components/ImageCarousel.astro new file mode 100644 index 0000000..ecc1359 --- /dev/null +++ b/src/components/ImageCarousel.astro @@ -0,0 +1,126 @@ +--- +import { Image } from "astro:assets"; +import type { ImageMetadata } from "astro"; + +import { shuffleArray } from "@lib/utils"; + +interface Props { + images: Array; + className: string; + altText?: string | ((index: number) => string); + interval?: number; + backgroundColour?: string; + backgroundOpacity?: string; + transitionStyle?: string; + transitionDuration?: string; + foreground?: boolean; + foregroundColour?: string; + foregroundOpacity?: string; + quality?: number; + height?: number; + shuffle?: boolean; +} + +const { + images, + className, + altText = null, + interval = 5000, + backgroundColour = "bg-black", + backgroundOpacity = "opacity-100", + transitionStyle = "ease-in-out", + transitionDuration = "duration-2000", + foreground = false, + foregroundColour = "bg-black", + foregroundOpacity = "opacity-50", + quality = "80", + height, + shuffle = false +} = Astro.props as Props; + +const IDs: string[] = []; + +const imagesArray = shuffle ? shuffleArray(images) : images; +--- + +
+
+
+
+ + { + imagesArray.map((image, index) => { + const ID = `image-carousel-${Math.random().toString(36)}`; + IDs.push(ID); + + return ( + 0 ? "opacity-0" : "", + index < 2 ? "" : "hidden" + ]} + src={image} + alt={ + typeof altText === "function" ? altText(index) : (altText ?? "") + } + loading={index < 2 ? "eager" : "lazy"} + aria-hidden={index === 0 ? "false" : "true"} + layout="full-width" + fit="cover" + style="height: 100% !important;" + quality={quality} + height={height === undefined ? undefined : height} + /> + ); + }) + } + + { + foreground && ( +
+ ) + } + + +
+
+ + diff --git a/src/components/Link.astro b/src/components/Link.astro new file mode 100644 index 0000000..6520ecb --- /dev/null +++ b/src/components/Link.astro @@ -0,0 +1,42 @@ +--- +import type { HTMLAttributes } from "astro/types"; + +interface Props extends HTMLAttributes<"a"> { + className?: string; + includeExternalLinkIcon?: boolean; +} + +import { Icon } from "astro-icon/components"; + +const { + href, + className, + includeExternalLinkIcon = true, + ...attrs +} = Astro.props as Props; + +const linkIsExternal: boolean = + href !== undefined && href !== null + ? href.toString().startsWith("http") + : false; +--- + +{ + includeExternalLinkIcon && linkIsExternal && ( + + + + ) + } + diff --git a/src/components/Navbar.astro b/src/components/Navbar.astro new file mode 100644 index 0000000..3481383 --- /dev/null +++ b/src/components/Navbar.astro @@ -0,0 +1,150 @@ +--- +const pathName = new URL(Astro.request.url).pathname; + +interface Props { + navbarDisplay: "normal" | "transparent"; +} + +import person from "@data/person"; +import links from "@assets/menu-primary"; +import ThemeSwitcher from "@components/ThemeSwitcher.astro"; + +const { navbarDisplay = "normal" } = Astro.props as Props; +--- + + + + +
+
+ + + + + + diff --git a/src/components/Paragraph.astro b/src/components/Paragraph.astro new file mode 100644 index 0000000..4cf45b2 --- /dev/null +++ b/src/components/Paragraph.astro @@ -0,0 +1,13 @@ +--- +import type { HTMLAttributes } from "astro/types"; + +interface Props extends HTMLAttributes<"p"> { + className?: string; +} + +const { className = "my-4", ...attrs } = Astro.props as Props; +--- + +

+ +

diff --git a/src/components/Player.astro b/src/components/Player.astro new file mode 100644 index 0000000..9d08707 --- /dev/null +++ b/src/components/Player.astro @@ -0,0 +1,425 @@ +--- +import { Icon } from "astro-icon/components"; + +interface Props { + height?: string; +} + +const { height = "h-28" } = Astro.props as Props; +--- + +
+
+
+
+
+
+
+
+
+ + +
+
+
+ + + + + + + + + +
+
+ + + +
+
+
+
+
+ + + + + + + + + + + + + + + + + + + + diff --git a/src/components/ProjectCard.astro b/src/components/ProjectCard.astro new file mode 100644 index 0000000..95a777a --- /dev/null +++ b/src/components/ProjectCard.astro @@ -0,0 +1,188 @@ +--- +import { getAllProjectImages } from '@lib/utils'; + +import Link from "@components/Link.astro"; +import Paragraph from "@components/Paragraph.astro"; +import Token from "@components/Token.astro"; +import { Icon } from "astro-icon/components"; +import { Image } from "astro:assets"; +import type { CollectionEntry } from "astro:content"; + +interface Props { + project: CollectionEntry<"projects">; + textOn?: "left" | "right"; + quality?: number; +} + +const { project, textOn = "left", quality = "80" } = Astro.props as Props; + +const images = getAllProjectImages(project); + +const translateXOptions = [ + "group-hover:translate-x-8", + "group-hover:translate-x-9", + "group-hover:translate-x-10", + "group-hover:translate-x-11", + "group-hover:translate-x-12", + "group-hover:translate-x-13", + "group-hover:translate-x-14", + "group-hover:translate-x-15", + "group-hover:translate-x-16", + "group-hover:translate-x-17", + "group-hover:translate-x-18", + "group-hover:translate-x-19", + "group-hover:translate-x-20", + "group-hover:translate-x-21", + "group-hover:translate-x-22", + "group-hover:translate-x-23", + "group-hover:translate-x-24", + "group-hover:-translate-x-8", + "group-hover:-translate-x-9", + "group-hover:-translate-x-10", + "group-hover:-translate-x-11", + "group-hover:-translate-x-12", + "group-hover:-translate-x-13", + "group-hover:-translate-x-14", + "group-hover:-translate-x-15", + "group-hover:-translate-x-16", + "group-hover:-translate-x-17", + "group-hover:-translate-x-18", + "group-hover:-translate-x-19", + "group-hover:-translate-x-20", + "group-hover:-translate-x-21", + "group-hover:-translate-x-22", + "group-hover:-translate-x-23", + "group-hover:-translate-x-24" +]; + +const translateYOptions = [ + "group-hover:translate-y-8", + "group-hover:translate-y-9", + "group-hover:translate-y-10", + "group-hover:translate-y-11", + "group-hover:translate-y-12", + "group-hover:translate-y-13", + "group-hover:translate-y-14", + "group-hover:translate-y-15", + "group-hover:translate-y-16", + "group-hover:translate-y-17", + "group-hover:translate-y-18", + "group-hover:translate-y-19", + "group-hover:translate-y-20", + "group-hover:translate-y-21", + "group-hover:translate-y-22", + "group-hover:translate-y-23", + "group-hover:translate-y-24", + "group-hover:-translate-y-9", + "group-hover:-translate-y-10", + "group-hover:-translate-y-11", + "group-hover:-translate-y-12", + "group-hover:-translate-y-13", + "group-hover:-translate-y-14", + "group-hover:-translate-y-15", + "group-hover:-translate-y-16", + "group-hover:-translate-y-17", + "group-hover:-translate-y-18", + "group-hover:-translate-y-19", + "group-hover:-translate-y-20", + "group-hover:-translate-y-21", + "group-hover:-translate-y-22", + "group-hover:-translate-y-23", + "group-hover:-translate-y-24" +]; + +const rotateOptions = [ + "rotate-1", + "rotate-2", + "rotate-3", + "rotate-4", + "rotate-5", + "rotate-6", + "rotate-7", + "rotate-8", + "rotate-9", + "rotate-10", + "rotate-11", + "rotate-12", + "-rotate-1", + "-rotate-2", + "-rotate-3", + "-rotate-4", + "-rotate-5", + "-rotate-6", + "-rotate-7", + "-rotate-8", + "-rotate-9", + "-rotate-10", + "-rotate-11", + "-rotate-12" +]; + +const projectHasBody = project.body && project.body.trim().length > 0; +--- + +
+
+

+ {projectHasBody && {project.data.title}}{!projectHasBody && project.data.title }

+

+ {project.data.role} +

+
+ {project.data.type} +
+ {project.data.description} + { + project.data.externalLinks !== undefined && ( + + {project.data.externalLinks.map((link, index) => ( + + + + ))} + + ) + } +
+
+ { + images + .reverse() + .map((image, index) => ( + + )) + } +
+
diff --git a/src/components/SEO.astro b/src/components/SEO.astro new file mode 100644 index 0000000..c2d3986 --- /dev/null +++ b/src/components/SEO.astro @@ -0,0 +1,57 @@ +--- +interface Props { + title: string; + description: string; + url?: string; + image?: SiteImage; +} + +const { title, description, url = Astro.url, image } = Astro.props; + +import site from "@data/site"; +--- + + + + + + + + + + + + + + + + + + + + + + + + + diff --git a/src/components/SectionTitle.astro b/src/components/SectionTitle.astro new file mode 100644 index 0000000..7f43000 --- /dev/null +++ b/src/components/SectionTitle.astro @@ -0,0 +1,16 @@ +--- +interface Props { + Tag?: "h1" | "h2" | "h3" | "h4" | "h5" | "h6"; + lineColour?: string; + lineColourDark?: string; +} + +const { + Tag = "h1", + lineColour = "border-primary", + lineColourDark = "dark:text-primary" +} = Astro.props as Props; +--- + + +
diff --git a/src/components/ThemeManager.astro b/src/components/ThemeManager.astro new file mode 100644 index 0000000..d82c249 --- /dev/null +++ b/src/components/ThemeManager.astro @@ -0,0 +1,62 @@ +--- +type Props = { + defaultTheme?: "auto" | "dark" | "light" | undefined; +}; + +const { defaultTheme = "auto" } = Astro.props; +--- + + + diff --git a/src/components/ThemeSelect.astro b/src/components/ThemeSelect.astro new file mode 100644 index 0000000..cdb384f --- /dev/null +++ b/src/components/ThemeSelect.astro @@ -0,0 +1,35 @@ +--- +const { class: providedClasses, selectClass, optionClass } = Astro.props; +--- + + + diff --git a/src/components/ThemeSwitcher.astro b/src/components/ThemeSwitcher.astro new file mode 100644 index 0000000..b3781ef --- /dev/null +++ b/src/components/ThemeSwitcher.astro @@ -0,0 +1,114 @@ +--- +import { Icon } from "astro-icon/components"; +--- + + + + + + + + + + + diff --git a/src/components/Token.astro b/src/components/Token.astro new file mode 100644 index 0000000..0862f94 --- /dev/null +++ b/src/components/Token.astro @@ -0,0 +1,30 @@ +--- +interface Props { + colour?: String; + textColour?: String; + size?: String; + hover?: String; + className?: String; +} + +const { + colour = "bg-primary", + textColour = "text-white", + size = "text-xs", + hover = "hover:bg-white hover:text-primary hover:ring-primary hover:ring-2", + className, + ...attrs +} = Astro.props as Props; +--- + + diff --git a/src/components/TrackCard.astro b/src/components/TrackCard.astro new file mode 100644 index 0000000..b8f275a --- /dev/null +++ b/src/components/TrackCard.astro @@ -0,0 +1,37 @@ +--- +import type { CollectionEntry } from "astro:content"; + +interface Props { + track: CollectionEntry<"tracks">; + index: number; +} + +const { track, index } = Astro.props as Props; + +import Image from "astro/components/Image.astro"; +--- + +
+ {track.data.card.image.alt} + +
+ {track.data.card.text.secondary} + {track.data.card.text.primary} +
+
diff --git a/src/components/Welcome.astro b/src/components/Welcome.astro deleted file mode 100644 index 52e0333..0000000 --- a/src/components/Welcome.astro +++ /dev/null @@ -1,210 +0,0 @@ ---- -import astroLogo from '../assets/astro.svg'; -import background from '../assets/background.svg'; ---- - - - - diff --git a/src/content.config.ts b/src/content.config.ts new file mode 100644 index 0000000..e0aa0fa --- /dev/null +++ b/src/content.config.ts @@ -0,0 +1,80 @@ +import { glob } from "astro/loaders"; +import { defineCollection, z } from "astro:content"; + +const projects = defineCollection({ + loader: glob({ pattern: "**/*.mdx", base: "./src/assets/projects" }), + schema: z.object({ + title: z.string(), + role: z.string(), + type: z.string(), + date: z.date(), + description: z.string(), + frontPage: z + .object({ + order: z.number() + }) + .optional(), + images: z.object({ + hero: z.object({ + src: z.preprocess( + (val) => `/src/assets/img/project-heros/${val}`, + z.string() + ), + alt: z.string() + }), + other: z + .preprocess((val) => `/src/assets/img/projects/${val}`, z.string()) + .optional() + }), + externalLinks: z + .array( + z.object({ + name: z.string(), + href: z.string(), + icon: z.string() + }) + ) + .optional() + }) +}); + +const awards = defineCollection({ + loader: glob({ pattern: "**/*.mdx", base: "./src/assets/awards" }), + schema: z.object({ + title: z.string(), + giver: z.string(), + date: z.date() + }) +}); + +const tracks = defineCollection({ + loader: glob({ pattern: "**/*.json", base: "./src/assets/tracks" }), + schema: ({ image }) => + z.object({ + src: z.string(), + metadata: z.object({ + title: z.string(), + subtitle: z.string().optional(), + extra: z.string().optional(), + artist: z.string().optional().default("Nathan Cummins"), + artwork: z.preprocess((val) => `/src/assets/img/tracks/${val}`, image()) + }), + autoQueue: z + .object({ + order: z.number() + }) + .optional(), + card: z.object({ + image: z.object({ + src: z.preprocess((val) => `/src/assets/img/tracks/${val}`, image()), + alt: z.string() + }), + text: z.object({ + primary: z.string(), + secondary: z.string() + }) + }) + }) +}); + +export const collections = { projects, awards, tracks }; diff --git a/src/data/person.ts b/src/data/person.ts new file mode 100644 index 0000000..514ac58 --- /dev/null +++ b/src/data/person.ts @@ -0,0 +1,7 @@ +export default { + names: { + first: "Nathan", + last: "Cummins" + }, + title: "Dr" +}; diff --git a/src/data/site.ts b/src/data/site.ts new file mode 100644 index 0000000..dd888b2 --- /dev/null +++ b/src/data/site.ts @@ -0,0 +1,13 @@ +import person from "@data/person"; + +export default { + title: `${person.names.first} ${person.names.last} - Adelaide Composer, Orchestrator, Conductor, and Performer`, + description: + "Nathan Cummins is an award-winning composer, orchestrator, sound designer, and conductor known for his vibrant music across video games, film, and live performance. Based in Adelaide, he brings classical craft, bold creativity, and technical innovation to every project", + tagline: "Composer, Orchestrator, Conductor, Performer", + image: { + externalURL: `${import.meta.env.SITE}/nathan-cummins-composer-orchestrator-conductor.png`, + src: "nathan-cummins-composer-orchestrator-conductor.png", + alt: "Nathan Cummins" + } as SiteImage +}; diff --git a/src/env.d.ts b/src/env.d.ts new file mode 100644 index 0000000..c604245 --- /dev/null +++ b/src/env.d.ts @@ -0,0 +1,12 @@ +/// +/// + +interface Window { + theme: { + setTheme: (theme: "auto" | "dark" | "light") => void; + getTheme: () => "auto" | "dark" | "light"; + getSystemTheme: () => "light" | "dark"; + getDefaultTheme: () => "auto" | "dark" | "light"; + }; + navbarDisplay: "normal" | "transparent"; +} diff --git a/src/layouts/Layout.astro b/src/layouts/Layout.astro deleted file mode 100644 index e455c61..0000000 --- a/src/layouts/Layout.astro +++ /dev/null @@ -1,22 +0,0 @@ - - - - - - - - Astro Basics - - - - - - - diff --git a/src/layouts/MainHead.astro b/src/layouts/MainHead.astro new file mode 100644 index 0000000..779d9db --- /dev/null +++ b/src/layouts/MainHead.astro @@ -0,0 +1,36 @@ +--- +import site from "../data/site"; + +import { ClientRouter } from "astro:transitions"; + +import Analytics from "@components/Analytics.astro"; +import SEO from "@components/SEO.astro"; +import ThemeManager from "@components/ThemeManager.astro"; + +const { title, subtitle, description } = Astro.props; + +// if a title is provided, use it as follows "title | site.title - site.suffix". If no title is provided, instead do "site.title - site.suffix" +const headTitle: string = + (title ? `${title}${subtitle ? ` - ${subtitle}` : ""} | ` : "") + + (site.title != title ? `${site.title}` : ""); +const headDescription: string = description || site.description; +--- + + + + + + {headTitle} + + + + + + + + + + + + + diff --git a/src/layouts/MainLayout.astro b/src/layouts/MainLayout.astro new file mode 100644 index 0000000..c74f1c2 --- /dev/null +++ b/src/layouts/MainLayout.astro @@ -0,0 +1,43 @@ +--- +interface Props { + title?: string; + subtitle?: string; + description?: string; + navbarDisplay?: "normal" | "transparent"; +} + +import "@/styles/global.css"; + +import { getCollection } from "astro:content"; +import Footer from "@components/Footer.astro"; +import Navbar from "@components/Navbar.astro"; +import Player from "@components/Player.astro"; +import MainHead from "@layouts/MainHead.astro"; + +const { title, subtitle, description, navbarDisplay = "normal" } = Astro.props; + +const autoQueuedTracks = ( + await getCollection("tracks", ({ data }) => data.autoQueue) +).sort( + (a, b) => (a.data.autoQueue?.order || -1) - (b.data.autoQueue?.order || 1) +); +--- + + + + + + +
+ +
+