From 73f69bc9b63b936cda6b6efa6e66aee4f5b5f10c Mon Sep 17 00:00:00 2001
From: Dominic Masters
Date: Tue, 16 Mar 2021 23:04:04 +1100
Subject: [PATCH] Rebuilt site
---
.gitignore | 3 +-
.travis.yml | 32 --
main.yml | 25 +
package.json | 16 +
src/compile.ts | 3 +
src/compiler.ts | 75 +++
src/pages/home/home.css | 0
src/pages/home/home.html | 107 ++++
src/pages/privacy/privacy.html | 175 ++++++
src/partials/layout/layout.css | 69 +++
src/partials/layout/layout.html | 45 ++
src/private/.gitignore | 3 -
src/private/jest.config.js | 14 -
src/private/package.json | 51 --
src/private/serverless.yml | 53 --
.../src/functions/mail/__tests__/send.test.ts | 8 -
src/private/src/functions/mail/send.ts | 56 --
.../src/functions/ping/__tests__/ping.test.ts | 8 -
src/private/src/functions/ping/ping.ts | 5 -
.../src/handler/__tests__/handler.test.ts | 43 --
src/private/src/handler/handler.ts | 71 ---
src/private/tsconfig.json | 14 -
src/public/.gitignore | 2 -
src/public/gatsby-browser.js | 1 -
src/public/gatsby-config.js | 49 --
src/public/package.json | 71 ---
src/public/serverless.yml | 28 -
src/public/src/api/APIRequest.tsx | 11 -
src/public/src/api/SendMail.tsx | 7 -
.../assets/images/branding/cpp/cpp-logo.svg | 25 -
.../images/branding/csharp/csharp-logo.svg | 32 --
.../digitalocean/digitalocean-logo.svg | 40 --
.../images/branding/discord/discord-logo.svg | 1 -
.../google-cloud/google-cloud-logo.svg | 12 -
.../images/branding/graphql/graphql-logo.svg | 64 ---
.../images/branding/heroku/heroku-logo.svg | 18 -
.../assets/images/branding/java/java-logo.svg | 10 -
.../images/branding/jquery/jquery-logo.svg | 1 -
.../images/branding/lwjgl/lwjgl-logo.svg | 32 --
.../branding/monogame/monogame-logo.svg | 30 --
.../images/branding/mysql/mysql-logo.svg | 47 --
.../assets/images/branding/neto/neto-logo.svg | 13 -
.../images/branding/nodejs/nodejs-logo.svg | 1 -
.../images/branding/opengl/opengl-logo.svg | 18 -
.../images/branding/pgsql/pgsql-logo.svg | 20 -
.../assets/images/branding/php/php-logo.svg | 96 ----
.../images/branding/react/react-logo.svg | 37 --
.../images/branding/redux/redux-logo.svg | 22 -
.../images/branding/shopify/shopify-logo.svg | 23 -
.../images/branding/twitch/twitch-logo.svg | 1 -
.../images/branding/twitter/twitter-logo.svg | 1 -
.../branding/typescript/typescript-logo.svg | 40 --
.../images/branding/unity/unity-logo.svg | 11 -
.../images/branding/webpack/webpack-logo.svg | 1 -
.../src/assets/images/people/dominic/head.png | Bin 24928 -> 0 bytes
.../src/assets/images/websites/bundlfresh.jpg | Bin 342852 -> 0 bytes
.../src/assets/images/websites/cocksox.jpg | Bin 514232 -> 0 bytes
.../src/assets/images/websites/domsPlace.jpg | Bin 45716 -> 0 bytes
.../src/assets/images/websites/earjobs.jpg | Bin 128909 -> 0 bytes
.../src/assets/images/websites/kopalife.jpg | Bin 89225 -> 0 bytes
.../assets/images/websites/solinvictus.jpg | Bin 170977 -> 0 bytes
.../assets/images/websites/stateofescape.jpg | Bin 227924 -> 0 bytes
src/public/src/components/effects/Observe.tsx | 29 -
.../src/components/effects/ScrollFade.tsx | 74 ---
.../src/components/forms/ContactForm.tsx | 80 ---
.../src/components/layout/Background.tsx | 68 ---
src/public/src/components/layout/Boundary.tsx | 20 -
src/public/src/components/layout/Frame.tsx | 31 --
src/public/src/components/layout/Section.tsx | 15 -
.../src/components/navigation/Footer.tsx | 101 ----
.../src/components/navigation/Header.tsx | 33 --
.../src/components/page/PageWrapper.tsx | 23 -
.../src/components/sections/BannerImage.tsx | 87 ---
.../src/components/sections/ButtonTitle.tsx | 34 --
.../src/components/sections/IconGrid.tsx | 118 ----
src/public/src/components/sections/Mosaic.tsx | 117 ----
.../src/components/sections/SplitFrames.tsx | 98 ----
.../src/components/sections/StackedMosaic.tsx | 99 ----
src/public/src/layouts/main.tsx | 65 ---
src/public/src/objects/branding/Logo.tsx | 26 -
src/public/src/objects/code/CodeBlock.tsx | 12 -
src/public/src/objects/feedback/Loader.tsx | 54 --
src/public/src/objects/feedback/Panel.tsx | 18 -
src/public/src/objects/interactive/Button.tsx | 43 --
src/public/src/objects/interactive/Input.tsx | 87 ---
src/public/src/objects/media/Image.tsx | 16 -
src/public/src/objects/typography/Heading.tsx | 40 --
src/public/src/objects/typography/Title.tsx | 23 -
src/public/src/pages/404.tsx | 53 --
src/public/src/pages/contact.tsx | 37 --
src/public/src/pages/index.tsx | 175 ------
src/public/src/pages/legal/privacy.tsx | 164 ------
src/public/src/settings/all.ts | 8 -
src/public/src/settings/styles/Animation.ts | 11 -
src/public/src/settings/styles/Border.ts | 5 -
src/public/src/settings/styles/Color.ts | 22 -
src/public/src/settings/styles/Font.ts | 23 -
src/public/src/settings/styles/Gutter.ts | 9 -
src/public/src/settings/styles/Responsive.ts | 27 -
src/public/src/settings/styles/Widget.ts | 65 ---
src/public/src/settings/styles/ZIndex.ts | 3 -
src/public/src/styles/all.tsx | 7 -
src/public/src/styles/anchor.tsx | 10 -
src/public/src/styles/body.tsx | 18 -
src/public/src/styles/index.tsx | 3 -
src/public/src/tools/styles.ts | 9 -
src/public/tsconfig.json | 36 --
src/serve.ts | 20 +
yarn.lock | 502 +++++++++++++++++-
109 files changed, 1019 insertions(+), 3240 deletions(-)
delete mode 100644 .travis.yml
create mode 100644 main.yml
create mode 100644 package.json
create mode 100644 src/compile.ts
create mode 100644 src/compiler.ts
create mode 100644 src/pages/home/home.css
create mode 100644 src/pages/home/home.html
create mode 100644 src/pages/privacy/privacy.html
create mode 100644 src/partials/layout/layout.css
create mode 100644 src/partials/layout/layout.html
delete mode 100644 src/private/.gitignore
delete mode 100644 src/private/jest.config.js
delete mode 100644 src/private/package.json
delete mode 100644 src/private/serverless.yml
delete mode 100644 src/private/src/functions/mail/__tests__/send.test.ts
delete mode 100644 src/private/src/functions/mail/send.ts
delete mode 100644 src/private/src/functions/ping/__tests__/ping.test.ts
delete mode 100644 src/private/src/functions/ping/ping.ts
delete mode 100644 src/private/src/handler/__tests__/handler.test.ts
delete mode 100644 src/private/src/handler/handler.ts
delete mode 100644 src/private/tsconfig.json
delete mode 100644 src/public/.gitignore
delete mode 100644 src/public/gatsby-browser.js
delete mode 100644 src/public/gatsby-config.js
delete mode 100644 src/public/package.json
delete mode 100644 src/public/serverless.yml
delete mode 100644 src/public/src/api/APIRequest.tsx
delete mode 100644 src/public/src/api/SendMail.tsx
delete mode 100644 src/public/src/assets/images/branding/cpp/cpp-logo.svg
delete mode 100644 src/public/src/assets/images/branding/csharp/csharp-logo.svg
delete mode 100644 src/public/src/assets/images/branding/digitalocean/digitalocean-logo.svg
delete mode 100644 src/public/src/assets/images/branding/discord/discord-logo.svg
delete mode 100644 src/public/src/assets/images/branding/google-cloud/google-cloud-logo.svg
delete mode 100644 src/public/src/assets/images/branding/graphql/graphql-logo.svg
delete mode 100644 src/public/src/assets/images/branding/heroku/heroku-logo.svg
delete mode 100644 src/public/src/assets/images/branding/java/java-logo.svg
delete mode 100644 src/public/src/assets/images/branding/jquery/jquery-logo.svg
delete mode 100644 src/public/src/assets/images/branding/lwjgl/lwjgl-logo.svg
delete mode 100644 src/public/src/assets/images/branding/monogame/monogame-logo.svg
delete mode 100644 src/public/src/assets/images/branding/mysql/mysql-logo.svg
delete mode 100644 src/public/src/assets/images/branding/neto/neto-logo.svg
delete mode 100644 src/public/src/assets/images/branding/nodejs/nodejs-logo.svg
delete mode 100644 src/public/src/assets/images/branding/opengl/opengl-logo.svg
delete mode 100644 src/public/src/assets/images/branding/pgsql/pgsql-logo.svg
delete mode 100644 src/public/src/assets/images/branding/php/php-logo.svg
delete mode 100644 src/public/src/assets/images/branding/react/react-logo.svg
delete mode 100644 src/public/src/assets/images/branding/redux/redux-logo.svg
delete mode 100644 src/public/src/assets/images/branding/shopify/shopify-logo.svg
delete mode 100644 src/public/src/assets/images/branding/twitch/twitch-logo.svg
delete mode 100644 src/public/src/assets/images/branding/twitter/twitter-logo.svg
delete mode 100644 src/public/src/assets/images/branding/typescript/typescript-logo.svg
delete mode 100644 src/public/src/assets/images/branding/unity/unity-logo.svg
delete mode 100644 src/public/src/assets/images/branding/webpack/webpack-logo.svg
delete mode 100644 src/public/src/assets/images/people/dominic/head.png
delete mode 100644 src/public/src/assets/images/websites/bundlfresh.jpg
delete mode 100644 src/public/src/assets/images/websites/cocksox.jpg
delete mode 100644 src/public/src/assets/images/websites/domsPlace.jpg
delete mode 100644 src/public/src/assets/images/websites/earjobs.jpg
delete mode 100644 src/public/src/assets/images/websites/kopalife.jpg
delete mode 100644 src/public/src/assets/images/websites/solinvictus.jpg
delete mode 100644 src/public/src/assets/images/websites/stateofescape.jpg
delete mode 100644 src/public/src/components/effects/Observe.tsx
delete mode 100644 src/public/src/components/effects/ScrollFade.tsx
delete mode 100644 src/public/src/components/forms/ContactForm.tsx
delete mode 100644 src/public/src/components/layout/Background.tsx
delete mode 100644 src/public/src/components/layout/Boundary.tsx
delete mode 100644 src/public/src/components/layout/Frame.tsx
delete mode 100644 src/public/src/components/layout/Section.tsx
delete mode 100644 src/public/src/components/navigation/Footer.tsx
delete mode 100644 src/public/src/components/navigation/Header.tsx
delete mode 100644 src/public/src/components/page/PageWrapper.tsx
delete mode 100644 src/public/src/components/sections/BannerImage.tsx
delete mode 100644 src/public/src/components/sections/ButtonTitle.tsx
delete mode 100644 src/public/src/components/sections/IconGrid.tsx
delete mode 100644 src/public/src/components/sections/Mosaic.tsx
delete mode 100644 src/public/src/components/sections/SplitFrames.tsx
delete mode 100644 src/public/src/components/sections/StackedMosaic.tsx
delete mode 100644 src/public/src/layouts/main.tsx
delete mode 100644 src/public/src/objects/branding/Logo.tsx
delete mode 100644 src/public/src/objects/code/CodeBlock.tsx
delete mode 100644 src/public/src/objects/feedback/Loader.tsx
delete mode 100644 src/public/src/objects/feedback/Panel.tsx
delete mode 100644 src/public/src/objects/interactive/Button.tsx
delete mode 100644 src/public/src/objects/interactive/Input.tsx
delete mode 100644 src/public/src/objects/media/Image.tsx
delete mode 100644 src/public/src/objects/typography/Heading.tsx
delete mode 100644 src/public/src/objects/typography/Title.tsx
delete mode 100644 src/public/src/pages/404.tsx
delete mode 100644 src/public/src/pages/contact.tsx
delete mode 100644 src/public/src/pages/index.tsx
delete mode 100644 src/public/src/pages/legal/privacy.tsx
delete mode 100644 src/public/src/settings/all.ts
delete mode 100644 src/public/src/settings/styles/Animation.ts
delete mode 100644 src/public/src/settings/styles/Border.ts
delete mode 100644 src/public/src/settings/styles/Color.ts
delete mode 100644 src/public/src/settings/styles/Font.ts
delete mode 100644 src/public/src/settings/styles/Gutter.ts
delete mode 100644 src/public/src/settings/styles/Responsive.ts
delete mode 100644 src/public/src/settings/styles/Widget.ts
delete mode 100644 src/public/src/settings/styles/ZIndex.ts
delete mode 100644 src/public/src/styles/all.tsx
delete mode 100644 src/public/src/styles/anchor.tsx
delete mode 100644 src/public/src/styles/body.tsx
delete mode 100644 src/public/src/styles/index.tsx
delete mode 100644 src/public/src/tools/styles.ts
delete mode 100644 src/public/tsconfig.json
create mode 100644 src/serve.ts
diff --git a/.gitignore b/.gitignore
index 9cfc02d..00f8379 100644
--- a/.gitignore
+++ b/.gitignore
@@ -63,4 +63,5 @@ typings/
/nbproject/private/
.vscode
.serverless
-.cache
\ No newline at end of file
+.cache
+yarn.lock
\ No newline at end of file
diff --git a/.travis.yml b/.travis.yml
deleted file mode 100644
index 9afebea..0000000
--- a/.travis.yml
+++ /dev/null
@@ -1,32 +0,0 @@
-language: node_js
-
-node_js:
- - "10.16.3"
-
-cache:
- yarn: true
- directories:
- - node_modules
-
-matrix:
- include:
- - env: PROJECT=src/private/
- include:
- - env: PROJECT=src/public/
-
-install:
- - cd $PROJECT
- - yarn global add serverless
- - yarn install
-
-script:
- - yarn test
- - yarn build
-
-deploy:
- provider: script
- script:
- - yarn deploy
- skip_cleanup: true
- on:
- branch: master
\ No newline at end of file
diff --git a/main.yml b/main.yml
new file mode 100644
index 0000000..f04d624
--- /dev/null
+++ b/main.yml
@@ -0,0 +1,25 @@
+name: CI
+on:
+ push:
+ branches: [ master ]
+ pull_request:
+ branches: [ master ]
+ workflow_dispatch:
+
+jobs:
+ build-and-deploy:
+ runs-on: ubuntu-latest
+ steps:
+ - name: Checkout 🛎️
+ uses: actions/checkout@v2.3.1
+
+ - name: Install and Build
+ run: |
+ npm install
+ npm run compile
+
+ - name: Deploy
+ uses: JamesIves/github-pages-deploy-action@4.1.0
+ with:
+ branch: gh-pages
+ folder: dist
\ No newline at end of file
diff --git a/package.json b/package.json
new file mode 100644
index 0000000..f197a35
--- /dev/null
+++ b/package.json
@@ -0,0 +1,16 @@
+{
+ "name": "domsplace",
+ "version": "7.0.0",
+ "main": "index.js",
+ "license": "MIT",
+ "scripts": {
+ "start": "ts-node ./src/serve",
+ "compile": "ts-node ./src/compile"
+ },
+ "dependencies": {
+ "@types/express": "^4.17.11",
+ "express": "^4.17.1",
+ "ts-node": "^9.1.1",
+ "typescript": "^4.2.3"
+ }
+}
diff --git a/src/compile.ts b/src/compile.ts
new file mode 100644
index 0000000..2515c5d
--- /dev/null
+++ b/src/compile.ts
@@ -0,0 +1,3 @@
+import { pageCompileAll } from "./compiler";
+
+pageCompileAll();
\ No newline at end of file
diff --git a/src/compiler.ts b/src/compiler.ts
new file mode 100644
index 0000000..ae97eff
--- /dev/null
+++ b/src/compiler.ts
@@ -0,0 +1,75 @@
+// Copyright (c) 2021 Dominic Masters
+//
+// This software is released under the MIT License.
+// https://opensource.org/licenses/MIT
+
+import * as fs from 'fs';
+import * as path from 'path';
+
+// Path Definitions
+export const PATH_HTML = path.join(__dirname, 'html');
+export const PATH_CSS = path.join(__dirname, 'css');
+export const PATH_OUT = path.join(__dirname, '..', 'dist');
+
+// Load Methods
+const loadFile = (dir:string, ext:string) => {
+ const bits = dir.split('/').join('\\').split('\\');
+ const fileName = bits.pop();
+ const fullDir = path.join(__dirname, ...bits, `${fileName}.${ext}`);
+
+ if(!fs.existsSync(fullDir)) return '';
+ return fs.readFileSync(fullDir, 'utf-8');
+}
+
+const loadHtml = (fn:string) => loadFile(fn, 'html');
+const loadCss = (fn:string) => loadFile(fn, 'css');
+
+const pageCompile = (page:string) => {
+ // Load Layout
+ const htmlLayout = loadHtml('partials/layout/layout');
+ const cssLayout = loadCss('partials/layout/layout');
+
+ // Load Page
+ const htmlPage = loadHtml(`pages/${page}/${page}`);
+ const cssPage = loadCss(`pages/${page}/${page}`);
+
+ // Inject styles
+ let compiled = htmlLayout.replace('{{styles}}', [
+ cssLayout,
+ cssPage
+ ].join('\n'));
+
+ // Inject content
+ compiled = compiled.replace('{{main}}', htmlPage);
+
+ // Inject variables
+ Object.entries({
+ 'year': new Date().getFullYear()
+ }).forEach(entry => {
+ const [ key, value ] = entry;
+ const variable = `{{${key}}}`;
+ while(compiled.includes(variable)) {
+ compiled = compiled.replace(variable, `${value}`);
+ }
+ });
+
+ return compiled;
+}
+
+const pageGenerate = (out:string, page:string) => {
+ const compiled = pageCompile(page);
+ console.log(page, '->', out);
+ if(!fs.existsSync(PATH_OUT)) fs.mkdirSync(PATH_OUT);
+ fs.writeFileSync(path.join(PATH_OUT, `${out}.html`), compiled);
+}
+
+export const pageCompileAll = () => {
+ // Read pages
+ Object.entries({
+ 'index': 'home',
+ 'privacy': 'privacy'
+ }).forEach(entry => {
+ const [ out, page ] = entry;
+ pageGenerate(out, page);
+ });
+}
diff --git a/src/pages/home/home.css b/src/pages/home/home.css
new file mode 100644
index 0000000..e69de29
diff --git a/src/pages/home/home.html b/src/pages/home/home.html
new file mode 100644
index 0000000..7893ade
--- /dev/null
+++ b/src/pages/home/home.html
@@ -0,0 +1,107 @@
+
+ Dominic Masters
+ Developer, Nerd, Occasionally Funny.
+
+
+ Australian nerd with a passion for all things computing, coffee and
+ video games. Currently residing in Sydney, Australia.
+
+
+
+ Programming since before the internet was cool.
+
+
+
+
+
+
+ Programming Technical Lead
+
+ I am a programmer born and bred. Developing since I was old enough to
+ type on a keyboard and continue to refine my skills more and more
+ every day. Backed by 14 years of experience and countless lines of code
+ committed.
+
+
+
+ Background with more anagrams than a bureaucrat, here are some of the
+ highlights only;
+
+ eCommerce ( Shopify, Magento, WooCommerce, neto )
+ Traditional Web ( HTML, CSS, JS )
+ Modern Web ( ES6, TS, GraphQL )
+ Server Side ( NodeJS, PHP, .NET )
+ Client Side ( C/C++, Java )
+ Database Side ( SQL, NoSQL )
+ Frameworks ( React, Web Components )
+ Antiques ( Lua, jQuery, SOAPXML )
+ Flashy ( OpenGL, Vulkan, Unity )
+ Boring ( Google Data Studio )
+ Servers ( AWS, CloudFlare, Heroku, Azure )
+ Every "API"
+ Ask me for a comprehensive list.
+
+
+
+
+
+
+
+
+ Shopify Expert
+
+ I'm currently working full-time as a Technical Lead working with the
+ Shopify Plus platform. I have been working with the platform
+ every day for over 4 years, and enjoy working with it immensely.
+
+
+
+ Working with Liquid, REST and GraphQL App Development and general
+ Shopify consulting. I have had the privilage of working with countless
+ Shopify Plus clients.
+
+
+
+ Despite Shopify's reputation, I have been able to make it do tricks
+ thought impossible. I find working with Shopify's unique quirks very
+ rewarding, and continuously find ways to surprise everyone, including
+ myself.
+
+
+
+
+
+
+ Personal
+
+ I spend most of my spare time considering programming concepts, and
+ take a very pragmatic approach to planning software development. I
+ enjoy unpacking what programming itself means and entails to come up
+ with new paradigms to use in my job.
+
+
+
+ I also have an appreciation for the raw power of technology and making
+ something beautiful and intricate out of the minimal amount of tools.
+ Hence this website appearing so basic.
+
+
+
+ I also enjoy video games and antique electronics. I still own four old
+ CRT Monitors that I love and use as my primary video game displays.
+
+
+
+
+
+
+ Social
+
+ I don't do social media often, however you can find me below.
+ For business enquiries contact I suggest LinkedIn.
+
+
+ LinkedIn
+ GitHub
+ Twitter
+
\ No newline at end of file
diff --git a/src/pages/privacy/privacy.html b/src/pages/privacy/privacy.html
new file mode 100644
index 0000000..2f0a0a4
--- /dev/null
+++ b/src/pages/privacy/privacy.html
@@ -0,0 +1,175 @@
+Privacy Policy
+Effective date: June 27, 2018
+
+ domsPlace ("us", "we", or "our") operates
+ the https://domsplace.com website (the
+ "Service").
+
+
+
+ This page informs you of our policies regarding the collection, use, and
+ disclosure of personal data when you use our Service and the choices you
+ have associated with that data.
+
+
+
+ We use your data to provide and improve the Service. By using the
+ Service, you agree to the collection and use of information in
+ accordance with this policy. Unless otherwise defined in this Privacy
+ Policy, terms used in this Privacy Policy have the same meanings as in
+ our Terms and Conditions, accessible from
+ https://domsplace.com
+
+
+
+
+
+
+
+Information Collection And Use
+
+ We collect several different types of information for various purposes
+ to provide and improve our Service to you.
+
+
+Types of Data Collected
+Personal Data
+
+ While using our Service, we may ask you to provide us with certain
+ personally identifiable information that can be used to contact or
+ identify you ("Personal Data"). Personally identifiable information may
+ include, but is not limited to:
+
+
+ Email address
+ First name and last name
+ Phone number
+ Cookies and Usage Data
+
+
+Usage Data
+
+ We may also collect information how the Service is accessed and used =
+ ("Usage Data"). This Usage Data may include information such as your
+ computer's Internet Protocol address (e.g. IP address), browser type,
+ browser version, the pages of our Service that you visit, the time and
+ date of your visit, the time spent on those pages, unique device
+ identifiers and other diagnostic data.
+
+
+Tracking & Cookies Data
+
+ We use cookies and similar tracking technologies to track the activity
+ on our Service and hold certain information.
+
+
+ Cookies are files with small amount of data which may include an
+ anonymous unique identifier. Cookies are sent to your browser from a
+ website and stored on your device. Tracking technologies also used are
+ beacons, tags, and scripts to collect and track information and to
+ improve and analyze our Service.
+
+
+ You can instruct your browser to refuse all cookies or to indicate when
+ a cookie is being sent. However, if you do not accept cookies, you may
+ not be able to use some portions of our Service.
+
+Examples of Cookies we use:
+
+ Session Cookies. We use Session Cookies to operate our Service.
+ Preference Cookies. We use Preference Cookies to remember your preferences and various settings.
+ Security Cookies. We use Security Cookies for security purposes.
+
+
+
+
+
+
+Use of Data
+domsPlace uses the collected data for various purposes:
+
+ To provide and maintain the Service
+ To notify you about changes to our Service
+ To allow you to participate in interactive features of our Service when you choose to do so
+ To provide customer care and support
+ To provide analysis or valuable information so that we can improve the Service
+ To monitor the usage of the Service
+ To detect, prevent and address technical issues
+
+
+
+
+
+
+Transfer Of Data
+Your information, including Personal Data, may be transferred to — and maintained on — computers located outside of your state, province, country or other governmental jurisdiction where the data protection laws may differ than those from your jurisdiction.
+If you are located outside Australia and choose to provide information to us, please note that we transfer the data, including Personal Data, to Australia and process it there.
+Your consent to this Privacy Policy followed by your submission of such information represents your agreement to that transfer.
+domsPlace will take all steps reasonably necessary to ensure that your data is treated securely and in accordance with this Privacy Policy and no transfer of your Personal Data will take place to an organization or a country unless there are adequate controls in place including the security of your data and other personal information.
+
+
+
+
+
+Disclosure Of Data
+Legal Requirements
+domsPlace may disclose your Personal Data in the good faith belief that such action is necessary to:
+
+ To comply with a legal obligation
+ To protect and defend the rights or property of domsPlace
+ To prevent or investigate possible wrongdoing in connection with the Service
+ To protect the personal safety of users of the Service or the public
+ To protect against legal liability
+
+
+
+
+
+
+Security Of Data
+The security of your data is important to us, but remember that no method of transmission over the Internet, or method of electronic storage is 100% secure. While we strive to use commercially acceptable means to protect your Personal Data, we cannot guarantee its absolute security.
+
+
+
+
+
+Service Providers
+We may employ third party companies and individuals to facilitate our Service ("Service Providers"), to provide the Service on our behalf, to perform Service-related services or to assist us in analyzing how our Service is used.
+These third parties have access to your Personal Data only to perform these tasks on our behalf and are obligated not to disclose or use it for any other purpose.
+
+Analytics
+We may use third-party Service Providers to monitor and analyze the use of our Service.
+
+
+ Google Analytics
+ Google Analytics is a web analytics service offered by Google that tracks and reports website traffic. Google uses the data collected to track and monitor the use of our Service. This data is shared with other Google services. Google may use the collected data to contextualize and personalize the ads of its own advertising network.
+ You can opt-out of having made your activity on the Service available to Google Analytics by installing the Google Analytics opt-out browser add-on. The add-on prevents the Google Analytics JavaScript (ga.js, analytics.js, and dc.js) from sharing information with Google Analytics about visits activity.
+ For more information on the privacy practices of Google, please visit the Google Privacy & Terms web page: https://policies.google.com/privacy?hl=en
+
+
+
+
+
+
+
+
+Links To Other Sites
+Our Service may contain links to other sites that are not operated by us. If you click on a third party link, you will be directed to that third party's site. We strongly advise you to review the Privacy Policy of every site you visit.
+We have no control over and assume no responsibility for the content, privacy policies or practices of any third party sites or services.
+
+
+
+
+
+Children's Privacy
+Our Service does not address anyone under the age of 18 ("Children").
+We do not knowingly collect personally identifiable information from anyone under the age of 18. If you are a parent or guardian and you are aware that your Children has provided us with Personal Data, please contact us. If we become aware that we have collected Personal Data from children without verification of parental consent, we take steps to remove that information from our servers.
+
+
+
+
+
+Changes To This Privacy Policy
+We may update our Privacy Policy from time to time. We will notify you of any changes by posting the new Privacy Policy on this page.
+We will let you know via email and/or a prominent notice on our Service, prior to the change becoming effective and update the "effective date" at the top of this Privacy Policy.
+You are advised to review this Privacy Policy periodically for any changes. Changes to this Privacy Policy are effective when they are posted on this page.
\ No newline at end of file
diff --git a/src/partials/layout/layout.css b/src/partials/layout/layout.css
new file mode 100644
index 0000000..be145d3
--- /dev/null
+++ b/src/partials/layout/layout.css
@@ -0,0 +1,69 @@
+/* Elements */
+* {
+ box-sizing: border-box;
+}
+
+html,body {
+ margin: 0;
+ padding: 0;
+ font-size: 16px;
+ background: #000;
+ color: #FFF;
+ font-family: monospace;
+}
+
+a { color: #00F; text-decoration: underline; }
+a:visited,a:active { color: #C0F; }
+a:hover { text-decoration: none; }
+
+
+/* Objects */
+.o-break {
+ padding: 3rem 0;
+}
+
+
+/* Components */
+.c-header {
+ text-align: center;
+ padding: 4rem 1rem;
+ font-weight: bold;
+ max-width: 800px;
+ margin: auto;
+}
+
+.c-header__title {
+ font-size: 1.5rem;
+}
+
+.c-header__title-link {
+ color: inherit;
+ text-decoration: none;
+}
+.c-header__title-link:visited,.c-header__title-link:active {
+ color: inherit;
+}
+
+.c-header__subtitle {
+ font-style: italic;
+}
+
+
+.c-main {
+ max-width: 800px;
+ margin: auto;
+ padding: 0 1em;
+}
+
+
+.c-footer {
+ text-align: center;
+ padding: 12rem 1rem 10rem;
+ font-weight: bold;
+ max-width: 800px;
+ margin: auto;
+}
+
+.c-footer__link + .c-footer__link {
+ margin-left: 0.5rem;
+}
\ No newline at end of file
diff --git a/src/partials/layout/layout.html b/src/partials/layout/layout.html
new file mode 100644
index 0000000..ce2e5fd
--- /dev/null
+++ b/src/partials/layout/layout.html
@@ -0,0 +1,45 @@
+
+
+
+
+
+
+ domsPlace, Personal Website of Technical Lead Dominic Masters
+
+
+
+
+
+
+
+
+
+
+ {{main}}
+
+
+
+
+
\ No newline at end of file
diff --git a/src/private/.gitignore b/src/private/.gitignore
deleted file mode 100644
index f770a93..0000000
--- a/src/private/.gitignore
+++ /dev/null
@@ -1,3 +0,0 @@
-dist/
-*.log
-*.lock
\ No newline at end of file
diff --git a/src/private/jest.config.js b/src/private/jest.config.js
deleted file mode 100644
index af3e56e..0000000
--- a/src/private/jest.config.js
+++ /dev/null
@@ -1,14 +0,0 @@
-module.exports = {
- "roots": [
- "/src"
- ],
- "transform": {
- "^.+\\.ts?$": "ts-jest"
- },
- "testRegex": "(/__tests__/.*|(\\.|/)(test|spec))\\.ts?$",
- "moduleFileExtensions": [
- "ts",
- "js",
- "json"
- ]
-}
diff --git a/src/private/package.json b/src/private/package.json
deleted file mode 100644
index f438fa1..0000000
--- a/src/private/package.json
+++ /dev/null
@@ -1,51 +0,0 @@
-{
- "name": "domsplace-backend",
- "version": "7.0.0",
- "description": "Personal website for Dominic \"YouWish\" Masters.",
- "main": "./dist/private/",
- "scripts": {
- "build": "tsc -p .",
- "start:prod": "cross-env NODE_ENV=production \"serverless offline\"",
- "start:dev": "cross-env NODE_ENV=development \"serverless offline --port 3001\"",
- "start": "npm run start:prod",
- "watch": "npm run start:dev",
- "deploy": "serverless deploy",
- "test": "yarn jest"
- },
- "repository": {
- "type": "git",
- "url": "git+https://github.com/YourWishes/domsPlace.git"
- },
- "keywords": [
- "domsplace",
- "personal",
- "portfolio",
- "website"
- ],
- "author": "Dominic Masters",
- "license": "MIT",
- "bugs": {
- "url": "https://github.com/YourWishes/domsPlace/issues"
- },
- "homepage": "https://github.com/YourWishes/domsPlace#readme",
- "dependencies": {
- "email-validator": "^2.0.4",
- "nodemailer": "^6.3.0",
- "serverless-plugin-include-dependencies": "^3.2.1"
- },
- "devDependencies": {
- "@types/jest": "^25.1.1",
- "@types/node": "^12.7.1",
- "@types/nodemailer": "^6.2.1",
- "cross-env": "^5.2.0",
- "escape-html": "^1.0.3",
- "jest": "^24.9.0",
- "serverless": "^1.51.0",
- "serverless-finch": "^2.4.3",
- "serverless-offline": "^5.11.0",
- "ts-jest": "^24.1.0",
- "ts-node": "^8.3.0",
- "typescript": "^3.5.3",
- "utility-types": "^3.7.0"
- }
-}
diff --git a/src/private/serverless.yml b/src/private/serverless.yml
deleted file mode 100644
index 31bfe21..0000000
--- a/src/private/serverless.yml
+++ /dev/null
@@ -1,53 +0,0 @@
-org: yourwishes
-service: domsplace
-
-frameworkVersion: ">=1.26.0"
-
-package:
- excludeDevDependencies: false
- individually: true
- include:
- - dist/**
-
-provider:
- name: aws
- runtime: nodejs10.x
- stage: ${opt:stage, "prod"}
- region: ap-southeast-2
- memorySize: 512
- deploymentBucket:
- name: domsplace-${self:provider.stage}-${self:provider.region}-private
- environment:
- EMAIL_HOST: ${self:custom.variables.email.host}
- EMAIL_PORT: ${self:custom.variables.email.port}
- EMAIL_USER: ${self:custom.variables.email.user}
- EMAIL_PASS: ${self:custom.variables.email.pass}
- EMAIL_DEST: ${self:custom.variables.email.dest}
-
-functions:
- ping:
- handler: dist/functions/ping/ping.ping
- events:
- - http:
- method: GET
- path: ping
- cors: true
- sendMail:
- handler: dist/functions/mail/send.sendMail
- events:
- - http:
- method: POST
- path: mail/send
- cors: true
-
-plugins:
- - serverless-plugin-include-dependencies
- - serverless-offline
-
-custom:
- ssm: '/aws/reference/secretsmanager/prod.domsPlace.'
- serverless-offline:
- disableCookieValidation: true
- port: 3001
- variables:
- email: ${ssm:${self:custom.ssm}email~true}
\ No newline at end of file
diff --git a/src/private/src/functions/mail/__tests__/send.test.ts b/src/private/src/functions/mail/__tests__/send.test.ts
deleted file mode 100644
index 37a2a39..0000000
--- a/src/private/src/functions/mail/__tests__/send.test.ts
+++ /dev/null
@@ -1,8 +0,0 @@
-import { sendMail } from './../send';
-
-describe('sendMail', () => {
- it('should require a body', async () => {
- await expect(sendMail({ body: null })).resolves.toHaveProperty('statusCode', 400);
- });
-
-})
\ No newline at end of file
diff --git a/src/private/src/functions/mail/send.ts b/src/private/src/functions/mail/send.ts
deleted file mode 100644
index 0b83717..0000000
--- a/src/private/src/functions/mail/send.ts
+++ /dev/null
@@ -1,56 +0,0 @@
-import { withHandler } from "../../handler/handler";
-import { validate } from 'email-validator';
-import { createTransport } from 'nodemailer';
-import * as escapeHTML from 'escape-html';
-
-export interface sendMailParams {
- name:string;
- email:string;
- message:string;
-}
-
-export const sendMail = withHandler(async (e,c) => {
- if(!e.body) return { statusCode: 400, body: 'Missing Contact Details' };
-
- let { name, email, message } = e.body;
- if(!name) return { statusCode: 400, body: 'Missing Contact Name' };
- if(!email) return { statusCode: 400, body: 'Missing Contact Email' };
- if(!message) return { statusCode: 400, body: 'Missing Contact Message' };
-
- //Validate
- if(name.length > 128 || !name.replace(/\s/g, '').length) return { statusCode: 400, body: 'Invalid Name' };
- if(!validate(email)) return { statusCode: 400, body: 'Invalid Email' };
- if(message.length > 10000 || !message.replace(/\s/g,'').length) {
- return { statusCode: 400, body: 'Invalid Messatge' };
- }
-
- //Prepare mail
- let {
- EMAIL_HOST, EMAIL_PORT, EMAIL_USER, EMAIL_PASS, EMAIL_DEST, EMAIL_FROM
- } = process.env
-
- let transporter = createTransport({
- host: EMAIL_HOST,
- port: parseInt(EMAIL_PORT),
- secure: true,
- auth: {
- user: EMAIL_USER, pass: EMAIL_PASS
- }
- });
-
- let x = await transporter.sendMail({
- from: `${name} <${email}>`,
- to: EMAIL_DEST,
- subject: 'Contact Message Received',
- text: `Contact Message Received:\n${message}\nFrom: ${name} ${email}`,
- html: `
- Contact Message Received
- You have received a contact message from ${escapeHTML(name)} - ${escapeHTML(email)} who wrote:
-
- ${escapeHTML(message)}
-
- Time: ${new Date().toLocaleString()}
- `
- });
- return { statusCode: 200, body: x && x.accepted && x.accepted.length ? true : false }
-});
\ No newline at end of file
diff --git a/src/private/src/functions/ping/__tests__/ping.test.ts b/src/private/src/functions/ping/__tests__/ping.test.ts
deleted file mode 100644
index e143b7a..0000000
--- a/src/private/src/functions/ping/__tests__/ping.test.ts
+++ /dev/null
@@ -1,8 +0,0 @@
-import { ping } from './../ping';
-
-describe('ping', () => {
- it('shold return a hello world and a 200 code', async () => {
- await expect(ping()).resolves.toHaveProperty('body', 'Thank funk!');
- await expect(ping()).resolves.toHaveProperty('statusCode', 200);
- })
-})
\ No newline at end of file
diff --git a/src/private/src/functions/ping/ping.ts b/src/private/src/functions/ping/ping.ts
deleted file mode 100644
index d95417c..0000000
--- a/src/private/src/functions/ping/ping.ts
+++ /dev/null
@@ -1,5 +0,0 @@
-import { withHandler } from "../../handler/handler";
-
-export const ping = withHandler(async () => {
- return { statusCode: 200, body: 'Thank funk!' };
-});
\ No newline at end of file
diff --git a/src/private/src/handler/__tests__/handler.test.ts b/src/private/src/handler/__tests__/handler.test.ts
deleted file mode 100644
index a2fcd41..0000000
--- a/src/private/src/handler/__tests__/handler.test.ts
+++ /dev/null
@@ -1,43 +0,0 @@
-import { withHandler, APICallable, DEFAULT_HEADERS } from './../handler';
-
-describe('withHandler', () => {
- it('should wrap an async function into a serverless callbackable function', () => {
- let callbackable = jest.fn(async () => ({ body: 'Hello World', statusCode: 200 }));
- let x = withHandler(callbackable);
- expect(typeof x).toBe('function');
- });
-
- it('should call the promise and pass the result to the callback', async () => {
- let callbackable = async () => ({ body: 'Hello World', statusCode: 200 });
- let x = withHandler(callbackable);
- let fn = jest.fn();
-
- x({} as any, null, fn);
-
- await new Promise(resolve => setImmediate(resolve));
-
- expect(fn).toHaveBeenCalled();
- });
-
- it('should set the content type', async () => {
- let x = withHandler(async () => ({ body: 'Hello World', statusCode: 200 }));
- let fn = jest.fn();
-
- x({} as any, null, fn);
-
- await new Promise(resolve => setImmediate(resolve));
-
- expect(fn).toHaveBeenCalledWith(null, { body: '"Hello World"', statusCode: 200,
- headers: DEFAULT_HEADERS
- });
- });
-
- it('should return the invoked functions returned promise', async () => {
- let x = withHandler(async () => ({ body: 'Hello World', statusCode: 200 }));
- let fn = jest.fn();
- let prom = x({} as any, null, fn);
-
- let result = await prom;
- expect(result).toStrictEqual({ body: 'Hello World', statusCode: 200 });
- })
-})
\ No newline at end of file
diff --git a/src/private/src/handler/handler.ts b/src/private/src/handler/handler.ts
deleted file mode 100644
index 04a99c8..0000000
--- a/src/private/src/handler/handler.ts
+++ /dev/null
@@ -1,71 +0,0 @@
-export const DEFAULT_HEADERS = {
- 'Content-Type': 'application/json',
- 'Access-Control-Allow-Origin': '*',
- 'Access-Control-Allow-Credentials': true
-}
-
-export type APIResponse = {
- statusCode?:number;
- body:any;
- headers?:{
- [key:string]:string,
- "Content-Type"?:string
- };
-}
-
-export type APICallable = (event:APIEvent, context:any) => Promise;
-
-export type APIMethod = 'GET'|'POST'|'PUT'|'PATCH'|'DELETE'|'TRACE'|'OPTIONS'|'CONNECT';
-
-export interface APIEvent {
- body:T;
- headers?:{[key:string]:string};
- httpMethod?:APIMethod;
- isOffline?:boolean;
- multiValueHeaders?:{[key:string]:string};
- multiValueQueryStringParameters?:{[key:string]:string};
- path?:string;
- pathParameters?:never;
- queryStringParameters?:{[key:string]:string};
- requestContext?:{[key:string]:string};
- resource?:string;
- stageVariables?:any;
-}
-
-export const withHandler = (callable:APICallable) => {
- return (event?:APIEvent, context?, callback?) => {
- try {
- if(!event) throw new Error();
- if(event.body) event.body = JSON.parse(event.body as any) as T;
- } catch(e) {
- console.error(e);
- callback(null, {
- statusCode: 400, headers: DEFAULT_HEADERS,
- body: JSON.stringify('Invalid body')
- });
- }
-
- return callable(event, context).then(d => {
- if(!callback) return d;
- let contentType = (d.headers?d.headers['Content-Type']:null) || 'application/json';
- let json = contentType.indexOf('application/json') !== -1;
-
- callback(null, {
- ...d,
- body: json ? JSON.stringify(d.body) : d.body,
- statusCode: d.statusCode || 200,
- headers: {
- ...DEFAULT_HEADERS,
- ...(d.headers||{})
- }
- });
-
- return d;
- }).catch(ex => {
- if(callback) {
- callback(null, { statusCode: 500, body: null, headers: DEFAULT_HEADERS });
- }
- throw ex;
- })
- };
-}
\ No newline at end of file
diff --git a/src/private/tsconfig.json b/src/private/tsconfig.json
deleted file mode 100644
index 4764d7d..0000000
--- a/src/private/tsconfig.json
+++ /dev/null
@@ -1,14 +0,0 @@
-{
- "compilerOptions": {
- "outDir": "./dist",
- "target": "es5",
- "module": "commonjs",
- "noImplicitAny": false,
- "sourceMap": true,
- "baseUrl": "./src/"
- },
- "include": [
- "./src/**/*.ts"
- ],
- "exclude": ["node_modules", "**/*.test.ts"]
-}
diff --git a/src/public/.gitignore b/src/public/.gitignore
deleted file mode 100644
index 56af776..0000000
--- a/src/public/.gitignore
+++ /dev/null
@@ -1,2 +0,0 @@
-public/
-*.lock
diff --git a/src/public/gatsby-browser.js b/src/public/gatsby-browser.js
deleted file mode 100644
index 55a9428..0000000
--- a/src/public/gatsby-browser.js
+++ /dev/null
@@ -1 +0,0 @@
-import 'normalize.css';
\ No newline at end of file
diff --git a/src/public/gatsby-config.js b/src/public/gatsby-config.js
deleted file mode 100644
index 19c17e9..0000000
--- a/src/public/gatsby-config.js
+++ /dev/null
@@ -1,49 +0,0 @@
-const path = require('path');
-const TSConfig = require('./tsconfig.json');
-
-module.exports = {
- plugins: [
- {
- resolve: `gatsby-source-filesystem`,
- options: {
- path: path.join(__dirname, 'src', 'assets', 'images'),
- name: 'images'
- }
- },
-
- 'gatsby-plugin-typescript',
- 'gatsby-plugin-react-helmet',
- 'gatsby-plugin-styled-components',
- 'gatsby-transformer-sharp',
- 'gatsby-plugin-sharp',
-
- {
- resolve: 'gatsby-plugin-alias-imports',
- options: {
- alias: Object.entries(TSConfig.compilerOptions.paths).reduce((x, [key, value]) => {
- let k = key.split('/').filter(f => f && f != '*').join('/');
- let v = value.find(v => v).split('/').filter(f => f && f != '*');
- return { ...x, [k]: path.resolve(__dirname, TSConfig.compilerOptions.baseUrl, ...v) };
- }, {})
- }
- },
-
- {
- resolve: 'gatsby-plugin-google-fonts',
- options: {
- fonts: [
- 'Bitter',
- 'Nanum Gothic'
- ],
- display: 'swap'
- }
- },
-
- {
- resolve: `gatsby-plugin-layout`,
- options: {
- component: require.resolve(`./src/layouts/main.tsx`),
- },
- }
- ]
-}
diff --git a/src/public/package.json b/src/public/package.json
deleted file mode 100644
index 7d921eb..0000000
--- a/src/public/package.json
+++ /dev/null
@@ -1,71 +0,0 @@
-{
- "name": "domsplace-frontend",
- "version": "8.0.0",
- "description": "Personal website for Dominic \"YourWishes\" Masters.",
- "scripts": {
- "build": "gatsby build",
- "develop": "gatsby develop",
- "start": "npm run develop",
- "serve": "gatsby serve",
- "deploy": "serverless client deploy --no-confirm",
- "clean": "gatsby clean",
- "test": "echo \"No tests defined\""
- },
- "repository": {
- "type": "git",
- "url": "git+https://github.com/YourWishes/domsPlaceNew.git"
- },
- "keywords": [
- "domsplace",
- "personal",
- "portfolio",
- "website"
- ],
- "author": "Dominic Masters",
- "license": "MIT",
- "bugs": {
- "url": "https://github.com/YourWishes/domsPlaceNew/issues"
- },
- "homepage": "https://domsplace.com",
- "dependencies": {
- "babel-plugin-styled-components": "^1.10.7",
- "gatsby": "^2.18.12",
- "gatsby-image": "^2.2.39",
- "gatsby-plugin-alias-imports": "^1.0.5",
- "gatsby-plugin-google-fonts": "^1.0.1",
- "gatsby-plugin-layout": "^1.1.22",
- "gatsby-plugin-react-helmet": "^3.1.21",
- "gatsby-plugin-sharp": "^2.4.3",
- "gatsby-plugin-styled-components": "^3.1.18",
- "gatsby-plugin-typescript": "^2.1.26",
- "gatsby-source-filesystem": "^2.1.46",
- "gatsby-transformer-sharp": "^2.3.13",
- "normalize.css": "^8.0.1",
- "react": "^16.12.0",
- "react-dom": "^16.12.0",
- "react-helmet": "^5.2.1",
- "react-hook-form": "^4.8.0",
- "react-syntax-highlighter": "^12.2.1",
- "react-transition-group": "^4.3.0",
- "styled-components": "^5.0.0",
- "yup": "^0.28.1"
- },
- "devDependencies": {
- "@types/node": "^13.5.0",
- "@types/react": "^16.9.19",
- "@types/react-dom": "^16.9.5",
- "@types/react-helmet": "^5.0.15",
- "@types/react-transition-group": "^4.2.3",
- "@types/styled-components": "^4.4.2",
- "@types/yup": "^0.26.29",
- "serverless": "^1.63.0",
- "serverless-finch": "^2.5.2",
- "serverless-plugin-include-dependencies": "^4.0.1"
- },
- "browserslist": [
- ">0.2%",
- "not dead",
- "not ie <= 11",
- "not op_mini all"
- ]
-}
diff --git a/src/public/serverless.yml b/src/public/serverless.yml
deleted file mode 100644
index d88e129..0000000
--- a/src/public/serverless.yml
+++ /dev/null
@@ -1,28 +0,0 @@
-org: yourwishes
-service: domsplace
-
-frameworkVersion: ">=1.26.0"
-
-provider:
- name: aws
- runtime: nodejs10.x
- stage: ${opt:stage, "prod"}
- region: ap-southeast-2
- memorySize: 512
-
-package:
- excludeDevDependencies: false
- individually: true
- include:
- - public/**
-
-plugins:
- - serverless-plugin-include-dependencies
- - serverless-finch
-
-custom:
- client:
- bucketName: domsplace-${self:provider.stage}-${self:provider.region}-public
- distributionFolder: public/
- indexDocument: index.html
- errorDocument: index.html
\ No newline at end of file
diff --git a/src/public/src/api/APIRequest.tsx b/src/public/src/api/APIRequest.tsx
deleted file mode 100644
index fbff0a6..0000000
--- a/src/public/src/api/APIRequest.tsx
+++ /dev/null
@@ -1,11 +0,0 @@
-export const APIRequest = (url:string, body?:object) => {
- return fetch(`https://api.domsplace.com/v1/${url}`, {
- method: body ? 'POST' : 'GET',
- body: body ? JSON.stringify(body) : null,
- mode: 'no-cors',
- headers: {
- 'Content-Type': 'application/json',
- 'Accept': 'application/json'
- }
- }).then(e => e.json());
-}
\ No newline at end of file
diff --git a/src/public/src/api/SendMail.tsx b/src/public/src/api/SendMail.tsx
deleted file mode 100644
index e2e38f8..0000000
--- a/src/public/src/api/SendMail.tsx
+++ /dev/null
@@ -1,7 +0,0 @@
-import { APIRequest } from "./APIRequest";
-
-export interface SendMailParams {
- name:string, email:string, message:string
-};
-
-export const sendMail = (data:SendMailParams) => APIRequest('mail/send', data).then(e => e.body);
\ No newline at end of file
diff --git a/src/public/src/assets/images/branding/cpp/cpp-logo.svg b/src/public/src/assets/images/branding/cpp/cpp-logo.svg
deleted file mode 100644
index 5e11707..0000000
--- a/src/public/src/assets/images/branding/cpp/cpp-logo.svg
+++ /dev/null
@@ -1,25 +0,0 @@
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
diff --git a/src/public/src/assets/images/branding/csharp/csharp-logo.svg b/src/public/src/assets/images/branding/csharp/csharp-logo.svg
deleted file mode 100644
index ddc79cd..0000000
--- a/src/public/src/assets/images/branding/csharp/csharp-logo.svg
+++ /dev/null
@@ -1,32 +0,0 @@
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
diff --git a/src/public/src/assets/images/branding/digitalocean/digitalocean-logo.svg b/src/public/src/assets/images/branding/digitalocean/digitalocean-logo.svg
deleted file mode 100644
index 0026c1b..0000000
--- a/src/public/src/assets/images/branding/digitalocean/digitalocean-logo.svg
+++ /dev/null
@@ -1,40 +0,0 @@
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
\ No newline at end of file
diff --git a/src/public/src/assets/images/branding/discord/discord-logo.svg b/src/public/src/assets/images/branding/discord/discord-logo.svg
deleted file mode 100644
index 65c9fcc..0000000
--- a/src/public/src/assets/images/branding/discord/discord-logo.svg
+++ /dev/null
@@ -1 +0,0 @@
-
\ No newline at end of file
diff --git a/src/public/src/assets/images/branding/google-cloud/google-cloud-logo.svg b/src/public/src/assets/images/branding/google-cloud/google-cloud-logo.svg
deleted file mode 100644
index 6fd725f..0000000
--- a/src/public/src/assets/images/branding/google-cloud/google-cloud-logo.svg
+++ /dev/null
@@ -1,12 +0,0 @@
-
-
-
-
-
-
-
-
-
-
-
-
diff --git a/src/public/src/assets/images/branding/graphql/graphql-logo.svg b/src/public/src/assets/images/branding/graphql/graphql-logo.svg
deleted file mode 100644
index 14082a5..0000000
--- a/src/public/src/assets/images/branding/graphql/graphql-logo.svg
+++ /dev/null
@@ -1,64 +0,0 @@
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
\ No newline at end of file
diff --git a/src/public/src/assets/images/branding/heroku/heroku-logo.svg b/src/public/src/assets/images/branding/heroku/heroku-logo.svg
deleted file mode 100644
index c287cd8..0000000
--- a/src/public/src/assets/images/branding/heroku/heroku-logo.svg
+++ /dev/null
@@ -1,18 +0,0 @@
-
-
-
-
-
- image/svg+xml
-
-
-
-
-
-
-
-
-
-
-
-
diff --git a/src/public/src/assets/images/branding/java/java-logo.svg b/src/public/src/assets/images/branding/java/java-logo.svg
deleted file mode 100644
index 28d4a95..0000000
--- a/src/public/src/assets/images/branding/java/java-logo.svg
+++ /dev/null
@@ -1,10 +0,0 @@
-
-
-
-
-
-
-
-
-
-
\ No newline at end of file
diff --git a/src/public/src/assets/images/branding/jquery/jquery-logo.svg b/src/public/src/assets/images/branding/jquery/jquery-logo.svg
deleted file mode 100644
index 621989a..0000000
--- a/src/public/src/assets/images/branding/jquery/jquery-logo.svg
+++ /dev/null
@@ -1 +0,0 @@
-
\ No newline at end of file
diff --git a/src/public/src/assets/images/branding/lwjgl/lwjgl-logo.svg b/src/public/src/assets/images/branding/lwjgl/lwjgl-logo.svg
deleted file mode 100644
index 3410765..0000000
--- a/src/public/src/assets/images/branding/lwjgl/lwjgl-logo.svg
+++ /dev/null
@@ -1,32 +0,0 @@
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
diff --git a/src/public/src/assets/images/branding/monogame/monogame-logo.svg b/src/public/src/assets/images/branding/monogame/monogame-logo.svg
deleted file mode 100644
index 226a1d2..0000000
--- a/src/public/src/assets/images/branding/monogame/monogame-logo.svg
+++ /dev/null
@@ -1,30 +0,0 @@
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
\ No newline at end of file
diff --git a/src/public/src/assets/images/branding/mysql/mysql-logo.svg b/src/public/src/assets/images/branding/mysql/mysql-logo.svg
deleted file mode 100644
index 98ebde9..0000000
--- a/src/public/src/assets/images/branding/mysql/mysql-logo.svg
+++ /dev/null
@@ -1,47 +0,0 @@
-
-
-
-
-
-
-
-
-
diff --git a/src/public/src/assets/images/branding/neto/neto-logo.svg b/src/public/src/assets/images/branding/neto/neto-logo.svg
deleted file mode 100644
index fad1b20..0000000
--- a/src/public/src/assets/images/branding/neto/neto-logo.svg
+++ /dev/null
@@ -1,13 +0,0 @@
-
-
-
-
-
-
-
-
-
-
-
\ No newline at end of file
diff --git a/src/public/src/assets/images/branding/nodejs/nodejs-logo.svg b/src/public/src/assets/images/branding/nodejs/nodejs-logo.svg
deleted file mode 100644
index b51f302..0000000
--- a/src/public/src/assets/images/branding/nodejs/nodejs-logo.svg
+++ /dev/null
@@ -1 +0,0 @@
-
\ No newline at end of file
diff --git a/src/public/src/assets/images/branding/opengl/opengl-logo.svg b/src/public/src/assets/images/branding/opengl/opengl-logo.svg
deleted file mode 100644
index 84c5d12..0000000
--- a/src/public/src/assets/images/branding/opengl/opengl-logo.svg
+++ /dev/null
@@ -1,18 +0,0 @@
-
-
-
-
-
-
-
diff --git a/src/public/src/assets/images/branding/pgsql/pgsql-logo.svg b/src/public/src/assets/images/branding/pgsql/pgsql-logo.svg
deleted file mode 100644
index 8666f75..0000000
--- a/src/public/src/assets/images/branding/pgsql/pgsql-logo.svg
+++ /dev/null
@@ -1,20 +0,0 @@
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
\ No newline at end of file
diff --git a/src/public/src/assets/images/branding/php/php-logo.svg b/src/public/src/assets/images/branding/php/php-logo.svg
deleted file mode 100644
index e4f137c..0000000
--- a/src/public/src/assets/images/branding/php/php-logo.svg
+++ /dev/null
@@ -1,96 +0,0 @@
-
-
- Official PHP Logo
-
-
-
- image/svg+xml
-
- Official PHP Logo
-
-
- Colin Viebrock
-
-
-
-
-
-
-
-
-
-
-
- Copyright Colin Viebrock 1997 - All rights reserved.
-
-
- 1997
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
\ No newline at end of file
diff --git a/src/public/src/assets/images/branding/react/react-logo.svg b/src/public/src/assets/images/branding/react/react-logo.svg
deleted file mode 100644
index b3887f3..0000000
--- a/src/public/src/assets/images/branding/react/react-logo.svg
+++ /dev/null
@@ -1,37 +0,0 @@
-
-
-
-
-
-
-
-
-
-
-
diff --git a/src/public/src/assets/images/branding/redux/redux-logo.svg b/src/public/src/assets/images/branding/redux/redux-logo.svg
deleted file mode 100644
index 62f4d5c..0000000
--- a/src/public/src/assets/images/branding/redux/redux-logo.svg
+++ /dev/null
@@ -1,22 +0,0 @@
-
-
-
-
-
-
-
-
-
-
diff --git a/src/public/src/assets/images/branding/shopify/shopify-logo.svg b/src/public/src/assets/images/branding/shopify/shopify-logo.svg
deleted file mode 100644
index 7c88138..0000000
--- a/src/public/src/assets/images/branding/shopify/shopify-logo.svg
+++ /dev/null
@@ -1,23 +0,0 @@
-
-
-
-
-
-
-
-
-
-
diff --git a/src/public/src/assets/images/branding/twitch/twitch-logo.svg b/src/public/src/assets/images/branding/twitch/twitch-logo.svg
deleted file mode 100644
index 905e364..0000000
--- a/src/public/src/assets/images/branding/twitch/twitch-logo.svg
+++ /dev/null
@@ -1 +0,0 @@
-Glitch
\ No newline at end of file
diff --git a/src/public/src/assets/images/branding/twitter/twitter-logo.svg b/src/public/src/assets/images/branding/twitter/twitter-logo.svg
deleted file mode 100644
index 2832e7b..0000000
--- a/src/public/src/assets/images/branding/twitter/twitter-logo.svg
+++ /dev/null
@@ -1 +0,0 @@
-Twitter_Logo_Blue
\ No newline at end of file
diff --git a/src/public/src/assets/images/branding/typescript/typescript-logo.svg b/src/public/src/assets/images/branding/typescript/typescript-logo.svg
deleted file mode 100644
index bbf2809..0000000
--- a/src/public/src/assets/images/branding/typescript/typescript-logo.svg
+++ /dev/null
@@ -1,40 +0,0 @@
-
-
-
-
-
-
diff --git a/src/public/src/assets/images/branding/unity/unity-logo.svg b/src/public/src/assets/images/branding/unity/unity-logo.svg
deleted file mode 100644
index 88622dd..0000000
--- a/src/public/src/assets/images/branding/unity/unity-logo.svg
+++ /dev/null
@@ -1,11 +0,0 @@
-
-
-
-
-
-
diff --git a/src/public/src/assets/images/branding/webpack/webpack-logo.svg b/src/public/src/assets/images/branding/webpack/webpack-logo.svg
deleted file mode 100644
index 8f7eaa5..0000000
--- a/src/public/src/assets/images/branding/webpack/webpack-logo.svg
+++ /dev/null
@@ -1 +0,0 @@
-icon
\ No newline at end of file
diff --git a/src/public/src/assets/images/people/dominic/head.png b/src/public/src/assets/images/people/dominic/head.png
deleted file mode 100644
index 74513560b35a13ec77381023267c245233af3a7b..0000000000000000000000000000000000000000
GIT binary patch
literal 0
HcmV?d00001
literal 24928
zcmeHPZA?>V6uu0Z9|Rp=q8p*eEUn^D>dY*&GO(r6Nb9AH*kKTrLdGIhsIgM9%$Z<2
zHn+7|#6WRv45(En#K{beV#+2RSTYMF(^c#oAgFxQu2I`{?|UnM_G3S`WK(xY?kU{9
z_ul4k&hwme-gBznDCCFDd36p!5Mf#Cxj6(8qCiK~tYCB|=NHXl^fIF)Jv*Hs&K(Z*
zZVe%bU}EEjTpl`)etjeM<-#>#gw9X+{l}#-7Nx*dm+wEb)9?3F3qXJdUQ7*iTF~4cvAY+tkSiXyTjp0j_)@ytj&*JX=>z~6twLP
zOykhH`u%a|oK>}O0cZ(K1N`CHLJjl8B~>*^X7YRkv92OgNTX{i3Okh@v`<+}tk-N&rg$cK}QPU<7smiu_ZYAecWUK}i!1B2F?ANoRqqQ<*L_
zcyCvtyb1>)#!+>au5BQHvfwiC%K(M|r~=CXH~#CvLRwC{W102-aCj;mSO0b$&dDc}9O~Xr
z$jqLaLrUFGn)fD!2g_qyrkXWa2`40-L5U%h5TrRH!C^L+Gq
zXTz+Y7f9{<4z=-5oNkUD=Z<`bOUxFIU44QfcSg;TKcjk)T*G
zA8-RekWw}-KvUi
zZQm2T1MLp*r4VtfNgt3nLn`RSyUTsoDJjMoRA{OclW{=ebVr$vx25w$0ZCE#hz>LH
zT}lQ>m)g(f1SG}Z$HbV1n*tK2TQSs*wL2i;!+>T&z-C0?O@K3iz<-yU1UsZYmn@^H
z`*pNY+02elL^n!%Vs~8{qSA6W0r~)Q0B-;=0C4=zxxs*Ip7vHDXN;@P;)wcfYu(uwcs{7F_+&_v77THO)5tH^gxZ1ZcTP%RWKbDJXRiS9KL3fAD3
zpi3|!@E(8-z)K*C=aM1&x8NZm)W_o2JoeBg(p1&EM^QJG#9$JO0!=HP12_0xS-N(<
zqzN?}*3+%2?x#&D%iF4S_1rF{4lV(Wfx&>k1U6LwE&wfoEPyK^RCrz@C7*{@*nnoT
z%D-fe*&_q($mYS{$npsKIN5&!&0m$MTZEja9nPU;G&+Nvij%@6pfNBQ@E5Ax2H*nF
z637C$5<-P%K2lN@U2PofF+7xUREnV{%VNRJF*Fr1a=Nmd3fx<%8I{=NC`J4NtV>gx?a$zW38KmZs292_t8B&e>ayxAkS_8x4tM{3z$JI#Zt
zKCK7-1Z{vZfG+?PJl9C*i)YvISO2i@s>butovOIo%Up|+9P_@w@ZMcxQlzbS42NH1
u(OR6o_`Qv=5Yz)k@dCL*><
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