Header
This commit is contained in:
25
.github/workflows/main.yml
vendored
25
.github/workflows/main.yml
vendored
@@ -1,25 +0,0 @@
|
||||
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
|
||||
96
.gitignore
vendored
96
.gitignore
vendored
@@ -1,67 +1,41 @@
|
||||
# Logs
|
||||
logs
|
||||
*.log
|
||||
# See https://help.github.com/articles/ignoring-files/ for more about ignoring files.
|
||||
|
||||
# dependencies
|
||||
/node_modules
|
||||
/.pnp
|
||||
.pnp.*
|
||||
.yarn/*
|
||||
!.yarn/patches
|
||||
!.yarn/plugins
|
||||
!.yarn/releases
|
||||
!.yarn/versions
|
||||
|
||||
# testing
|
||||
/coverage
|
||||
|
||||
# next.js
|
||||
/.next/
|
||||
/out/
|
||||
|
||||
# production
|
||||
/build
|
||||
|
||||
# misc
|
||||
.DS_Store
|
||||
*.pem
|
||||
|
||||
# debug
|
||||
npm-debug.log*
|
||||
yarn-debug.log*
|
||||
yarn-error.log*
|
||||
.pnpm-debug.log*
|
||||
|
||||
# Runtime data
|
||||
pids
|
||||
*.pid
|
||||
*.seed
|
||||
*.pid.lock
|
||||
# env files (can opt-in for committing if needed)
|
||||
.env*
|
||||
|
||||
# Directory for instrumented libs generated by jscoverage/JSCover
|
||||
lib-cov
|
||||
# vercel
|
||||
.vercel
|
||||
|
||||
# Coverage directory used by tools like istanbul
|
||||
coverage
|
||||
|
||||
# nyc test coverage
|
||||
.nyc_output
|
||||
|
||||
# Grunt intermediate storage (http://gruntjs.com/creating-plugins#storing-task-files)
|
||||
.grunt
|
||||
|
||||
# Bower dependency directory (https://bower.io/)
|
||||
bower_components
|
||||
|
||||
# node-waf configuration
|
||||
.lock-wscript
|
||||
|
||||
# Compiled binary addons (http://nodejs.org/api/addons.html)
|
||||
build/Release
|
||||
|
||||
# Dependency directories
|
||||
node_modules/
|
||||
node_modules_pc/
|
||||
node_modules_surface/
|
||||
jspm_packages/
|
||||
|
||||
# Typescript v1 declaration files
|
||||
typings/
|
||||
|
||||
# Optional npm cache directory
|
||||
.npm
|
||||
|
||||
# Optional eslint cache
|
||||
.eslintcache
|
||||
|
||||
# Optional REPL history
|
||||
.node_repl_history
|
||||
|
||||
# Output of 'npm pack'
|
||||
*.tgz
|
||||
|
||||
# Yarn Integrity file
|
||||
.yarn-integrity
|
||||
|
||||
# dotenv environment variables file
|
||||
.env
|
||||
|
||||
/package-lock.json
|
||||
/nbproject/private/
|
||||
.vscode
|
||||
.serverless
|
||||
.cache
|
||||
yarn.lock
|
||||
# typescript
|
||||
*.tsbuildinfo
|
||||
next-env.d.ts
|
||||
|
||||
36
README.md
Normal file
36
README.md
Normal file
@@ -0,0 +1,36 @@
|
||||
This is a [Next.js](https://nextjs.org) project bootstrapped with [`create-next-app`](https://nextjs.org/docs/app/api-reference/cli/create-next-app).
|
||||
|
||||
## Getting Started
|
||||
|
||||
First, run the development server:
|
||||
|
||||
```bash
|
||||
npm run dev
|
||||
# or
|
||||
yarn dev
|
||||
# or
|
||||
pnpm dev
|
||||
# or
|
||||
bun dev
|
||||
```
|
||||
|
||||
Open [http://localhost:3000](http://localhost:3000) with your browser to see the result.
|
||||
|
||||
You can start editing the page by modifying `app/page.tsx`. The page auto-updates as you edit the file.
|
||||
|
||||
This project uses [`next/font`](https://nextjs.org/docs/app/building-your-application/optimizing/fonts) to automatically optimize and load [Geist](https://vercel.com/font), a new font family for Vercel.
|
||||
|
||||
## Learn More
|
||||
|
||||
To learn more about Next.js, take a look at the following resources:
|
||||
|
||||
- [Next.js Documentation](https://nextjs.org/docs) - learn about Next.js features and API.
|
||||
- [Learn Next.js](https://nextjs.org/learn) - an interactive Next.js tutorial.
|
||||
|
||||
You can check out [the Next.js GitHub repository](https://github.com/vercel/next.js) - your feedback and contributions are welcome!
|
||||
|
||||
## Deploy on Vercel
|
||||
|
||||
The easiest way to deploy your Next.js app is to use the [Vercel Platform](https://vercel.com/new?utm_medium=default-template&filter=next.js&utm_source=create-next-app&utm_campaign=create-next-app-readme) from the creators of Next.js.
|
||||
|
||||
Check out our [Next.js deployment documentation](https://nextjs.org/docs/app/building-your-application/deploying) for more details.
|
||||
226
dist/index.html
vendored
226
dist/index.html
vendored
@@ -1,226 +0,0 @@
|
||||
|
||||
<!DOCTYPE html>
|
||||
<html lang="en">
|
||||
<!--
|
||||
Copyright (c) 2021 Dominic Masters
|
||||
|
||||
This software is released under the MIT License.
|
||||
https://opensource.org/licenses/MIT
|
||||
-->
|
||||
|
||||
<head>
|
||||
<title>domsPlace, Personal Website of Technical Lead Dominic Masters</title>
|
||||
<meta charset="utf-8" />
|
||||
<meta name="viewport" content="width=device-width, initial-scale=1.0" />
|
||||
<meta name="description" content="Personal website of Technical Lead, Dominic Masters, eCommerce Senior Full-Stack Developer using modern web technologies.">
|
||||
|
||||
|
||||
<style type="text/css">/* Elements */
|
||||
* {
|
||||
box-sizing: border-box;
|
||||
}
|
||||
|
||||
html,body {
|
||||
margin: 0;
|
||||
padding: 0;
|
||||
font-size: 16px;
|
||||
line-height: 1.6;
|
||||
|
||||
background: #000;
|
||||
color: #DDD;
|
||||
font-family: Arial, Helvetica, sans-serif;
|
||||
}
|
||||
|
||||
a {
|
||||
color: #56C0F1;
|
||||
text-decoration: underline;
|
||||
}
|
||||
a:visited,a:active { color: #D84DAC; }
|
||||
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;
|
||||
}
|
||||
</style>
|
||||
</head>
|
||||
|
||||
<body>
|
||||
<header class="c-header">
|
||||
<p class="c-header__title">
|
||||
<a href="/" class="c-header__title-link">
|
||||
domsPlace, Personal website of Dominic Masters.
|
||||
</a>
|
||||
</p>
|
||||
|
||||
<p class="c-header__subtitle">
|
||||
Wow, I can't believe it's not React!
|
||||
</p>
|
||||
</header>
|
||||
|
||||
<main class="c-main">
|
||||
<section>
|
||||
<h1>Dominic Masters</h1>
|
||||
<h2>Developer, Nerd, Occasionally Funny.</h2>
|
||||
|
||||
<p>
|
||||
Australian-American nerd with a passion for all things computing, coffee and
|
||||
video games. Currently residing in Los Angeles, California.
|
||||
</p>
|
||||
|
||||
<p>
|
||||
Programming since before the internet was cool.
|
||||
</p>
|
||||
</section>
|
||||
|
||||
<div class="o-break"></div>
|
||||
|
||||
<section>
|
||||
<h2>Programming Technical Lead</h2>
|
||||
<p>
|
||||
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.
|
||||
</p>
|
||||
|
||||
<p>
|
||||
Background with more anagrams than a bureaucrat, here are some of the
|
||||
highlights only;
|
||||
<ul>
|
||||
<li>eCommerce ( Shopify, Magento, WooCommerce, neto )</li>
|
||||
<li>Traditional Web ( HTML, CSS, JS )</li>
|
||||
<li>Modern Web ( ES6, TS, GraphQL )</li>
|
||||
<li>Server Side ( NodeJS, PHP, .NET )</li>
|
||||
<li>Client Side ( C/C++, Java )</li>
|
||||
<li>Database Side ( SQL, NoSQL )</li>
|
||||
<li>Frameworks ( React, Web Components )</li>
|
||||
<li>Antiques ( Lua, jQuery, SOAPXML )</li>
|
||||
<li>Flashy ( OpenGL, Vulkan, Unity )</li>
|
||||
<li>Boring ( Google Data Studio )</li>
|
||||
<li>Servers ( AWS, CloudFlare, Heroku, Azure )</li>
|
||||
<li>Every "API"</li>
|
||||
<li>Ask me for a comprehensive list.</li>
|
||||
</ul>
|
||||
</p>
|
||||
</section>
|
||||
|
||||
<div class="o-break"></div>
|
||||
|
||||
|
||||
<section>
|
||||
<h2>Shopify Expert</h2>
|
||||
<p>
|
||||
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.
|
||||
</p>
|
||||
|
||||
<p>
|
||||
Working with Liquid, REST and GraphQL App Development and general
|
||||
Shopify consulting. I have had the privilage of working with countless
|
||||
Shopify Plus clients.
|
||||
</p>
|
||||
|
||||
<p>
|
||||
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.
|
||||
</p>
|
||||
</section>
|
||||
|
||||
<div class="o-break"></div>
|
||||
|
||||
<section>
|
||||
<h2>Personal</h2>
|
||||
<p>
|
||||
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.
|
||||
</p>
|
||||
|
||||
<p>
|
||||
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.
|
||||
</p>
|
||||
|
||||
<p>
|
||||
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.
|
||||
</p>
|
||||
</section>
|
||||
|
||||
<div class="o-break"></div>
|
||||
|
||||
<section>
|
||||
<h2>Social</h2>
|
||||
<p>
|
||||
I don't do social media often, however you can find me below.
|
||||
For business enquiries contact I suggest LinkedIn.
|
||||
</p>
|
||||
|
||||
<p><a href="//www.linkedin.com/in/dominic-masters-86732678/">LinkedIn</a></p>
|
||||
<p><a href="//github.com/YourWishes">GitHub</a></p>
|
||||
</section>
|
||||
</main>
|
||||
|
||||
<footer class="c-footer">
|
||||
<p>2012 ~ 2021 - Dominic Masters</p>
|
||||
|
||||
<p>
|
||||
<a href="/" class="c-footer__link">Home</a>
|
||||
<a href="/privacy" class="c-footer__link">Privacy Policy</a>
|
||||
</p>
|
||||
</footer>
|
||||
</body>
|
||||
</html>
|
||||
295
dist/privacy.html
vendored
295
dist/privacy.html
vendored
@@ -1,295 +0,0 @@
|
||||
|
||||
<!DOCTYPE html>
|
||||
<html lang="en">
|
||||
<!--
|
||||
Copyright (c) 2021 Dominic Masters
|
||||
|
||||
This software is released under the MIT License.
|
||||
https://opensource.org/licenses/MIT
|
||||
-->
|
||||
|
||||
<head>
|
||||
<title>domsPlace, Personal Website of Technical Lead Dominic Masters</title>
|
||||
<meta charset="utf-8" />
|
||||
<meta name="viewport" content="width=device-width, initial-scale=1.0" />
|
||||
<meta name="description" content="Personal website of Technical Lead, Dominic Masters, eCommerce Senior Full-Stack Developer using modern web technologies.">
|
||||
|
||||
|
||||
<style type="text/css">/* Elements */
|
||||
* {
|
||||
box-sizing: border-box;
|
||||
}
|
||||
|
||||
html,body {
|
||||
margin: 0;
|
||||
padding: 0;
|
||||
font-size: 16px;
|
||||
line-height: 1.6;
|
||||
|
||||
background: #000;
|
||||
color: #DDD;
|
||||
font-family: Arial, Helvetica, sans-serif;
|
||||
}
|
||||
|
||||
a {
|
||||
color: #56C0F1;
|
||||
text-decoration: underline;
|
||||
}
|
||||
a:visited,a:active { color: #D84DAC; }
|
||||
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;
|
||||
}
|
||||
</style>
|
||||
</head>
|
||||
|
||||
<body>
|
||||
<header class="c-header">
|
||||
<p class="c-header__title">
|
||||
<a href="/" class="c-header__title-link">
|
||||
domsPlace, Personal website of Dominic Masters.
|
||||
</a>
|
||||
</p>
|
||||
|
||||
<p class="c-header__subtitle">
|
||||
Wow, I can't believe it's not React!
|
||||
</p>
|
||||
</header>
|
||||
|
||||
<main class="c-main">
|
||||
<h1>Privacy Policy</h1>
|
||||
<p>Effective date: June 27, 2018</p>
|
||||
<p>
|
||||
domsPlace ("us", "we", or "our") operates
|
||||
the <a href="//domsplace.com">https://domsplace.com</a> website (the
|
||||
"Service").
|
||||
</p>
|
||||
|
||||
<p>
|
||||
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.
|
||||
</p>
|
||||
|
||||
<p>
|
||||
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 <a href="//domsplace.com">
|
||||
https://domsplace.com
|
||||
</a>
|
||||
</p>
|
||||
|
||||
|
||||
<div class="o-break"></div>
|
||||
|
||||
|
||||
<h2>Information Collection And Use</h2>
|
||||
<p>
|
||||
We collect several different types of information for various purposes
|
||||
to provide and improve our Service to you.
|
||||
</p>
|
||||
|
||||
<h3>Types of Data Collected</h3>
|
||||
<h4>Personal Data</h4>
|
||||
<p>
|
||||
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:
|
||||
</p>
|
||||
<ul>
|
||||
<li>Email address</li>
|
||||
<li>First name and last name</li>
|
||||
<li>Phone number</li>
|
||||
<li>Cookies and Usage Data</li>
|
||||
</ul>
|
||||
|
||||
<h4>Usage Data</h4>
|
||||
<p>
|
||||
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.
|
||||
</p>
|
||||
|
||||
<h4>Tracking & Cookies Data</h4>
|
||||
<p>
|
||||
We use cookies and similar tracking technologies to track the activity
|
||||
on our Service and hold certain information.
|
||||
</p>
|
||||
<p>
|
||||
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.
|
||||
</p>
|
||||
<p>
|
||||
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.
|
||||
</p>
|
||||
<p>Examples of Cookies we use:</p>
|
||||
<ul>
|
||||
<li><strong>Session Cookies.</strong> We use Session Cookies to operate our Service.</li>
|
||||
<li><strong>Preference Cookies.</strong> We use Preference Cookies to remember your preferences and various settings.</li>
|
||||
<li><strong>Security Cookies.</strong> We use Security Cookies for security purposes.</li>
|
||||
</ul>
|
||||
|
||||
|
||||
<div class="o-break"></div>
|
||||
|
||||
|
||||
<h2>Use of Data</h2>
|
||||
<p>domsPlace uses the collected data for various purposes:</p>
|
||||
<ul>
|
||||
<li>To provide and maintain the Service</li>
|
||||
<li>To notify you about changes to our Service</li>
|
||||
<li>To allow you to participate in interactive features of our Service when you choose to do so</li>
|
||||
<li>To provide customer care and support</li>
|
||||
<li>To provide analysis or valuable information so that we can improve the Service</li>
|
||||
<li>To monitor the usage of the Service</li>
|
||||
<li>To detect, prevent and address technical issues</li>
|
||||
</ul>
|
||||
|
||||
|
||||
<div class="o-break"></div>
|
||||
|
||||
|
||||
<h2>Transfer Of Data</h2>
|
||||
<p>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.</p>
|
||||
<p>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.</p>
|
||||
<p>Your consent to this Privacy Policy followed by your submission of such information represents your agreement to that transfer.</p>
|
||||
<p>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.</p>
|
||||
|
||||
|
||||
<div class="o-break"></div>
|
||||
|
||||
|
||||
<h2>Disclosure Of Data</h2>
|
||||
<h3>Legal Requirements</h3>
|
||||
<p>domsPlace may disclose your Personal Data in the good faith belief that such action is necessary to:</p>
|
||||
<ul>
|
||||
<li>To comply with a legal obligation</li>
|
||||
<li>To protect and defend the rights or property of domsPlace</li>
|
||||
<li>To prevent or investigate possible wrongdoing in connection with the Service</li>
|
||||
<li>To protect the personal safety of users of the Service or the public</li>
|
||||
<li>To protect against legal liability</li>
|
||||
</ul>
|
||||
|
||||
|
||||
<div class="o-break"></div>
|
||||
|
||||
|
||||
<h2>Security Of Data</h2>
|
||||
<p>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.</p>
|
||||
|
||||
|
||||
<div class="o-break"></div>
|
||||
|
||||
|
||||
<h2>Service Providers</h2>
|
||||
<p>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.</p>
|
||||
<p>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.</p>
|
||||
|
||||
<h3>Analytics</h3>
|
||||
<p>We may use third-party Service Providers to monitor and analyze the use of our Service.</p>
|
||||
<ul>
|
||||
<li>
|
||||
<p><strong>Google Analytics</strong></p>
|
||||
<p>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.</p>
|
||||
<p>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.</p>
|
||||
<p>For more information on the privacy practices of Google, please visit the Google Privacy & Terms web page: <a href="https://policies.google.com/privacy?hl=en" target="_blank" rel="noopener">https://policies.google.com/privacy?hl=en</a>
|
||||
</p>
|
||||
</li>
|
||||
</ul>
|
||||
|
||||
|
||||
<div class="o-break"></div>
|
||||
|
||||
|
||||
<h2>Links To Other Sites</h2>
|
||||
<p>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.</p>
|
||||
<p>We have no control over and assume no responsibility for the content, privacy policies or practices of any third party sites or services.</p>
|
||||
|
||||
|
||||
<div class="o-break"></div>
|
||||
|
||||
|
||||
<h2>Children's Privacy</h2>
|
||||
<p>Our Service does not address anyone under the age of 18 ("Children").</p>
|
||||
<p>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.</p>
|
||||
|
||||
|
||||
<div class="o-break"></div>
|
||||
|
||||
|
||||
<h2>Changes To This Privacy Policy</h2>
|
||||
<p>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.</p>
|
||||
<p>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.</p>
|
||||
<p>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.</p>
|
||||
</main>
|
||||
|
||||
<footer class="c-footer">
|
||||
<p>2012 ~ 2021 - Dominic Masters</p>
|
||||
|
||||
<p>
|
||||
<a href="/" class="c-footer__link">Home</a>
|
||||
<a href="/privacy" class="c-footer__link">Privacy Policy</a>
|
||||
</p>
|
||||
</footer>
|
||||
</body>
|
||||
</html>
|
||||
8
next.config.ts
Normal file
8
next.config.ts
Normal file
@@ -0,0 +1,8 @@
|
||||
import type { NextConfig } from "next";
|
||||
|
||||
const nextConfig: NextConfig = {
|
||||
/* config options here */
|
||||
reactCompiler: true,
|
||||
};
|
||||
|
||||
export default nextConfig;
|
||||
1025
package-lock.json
generated
Normal file
1025
package-lock.json
generated
Normal file
File diff suppressed because it is too large
Load Diff
25
package.json
25
package.json
@@ -1,16 +1,23 @@
|
||||
{
|
||||
"name": "domsplace",
|
||||
"version": "7.0.0",
|
||||
"main": "index.js",
|
||||
"license": "MIT",
|
||||
"version": "0.1.0",
|
||||
"private": true,
|
||||
"scripts": {
|
||||
"start": "ts-node ./src/serve",
|
||||
"compile": "ts-node ./src/compile"
|
||||
"start:dev": "next dev",
|
||||
"build:prod": "next build",
|
||||
"start:prod": "next start"
|
||||
},
|
||||
"dependencies": {
|
||||
"@types/express": "^4.17.11",
|
||||
"express": "^4.17.3",
|
||||
"ts-node": "^9.1.1",
|
||||
"typescript": "^4.2.3"
|
||||
"next": "16.2.2",
|
||||
"react": "19.2.4",
|
||||
"react-dom": "19.2.4",
|
||||
"sass": "^1.98.0"
|
||||
},
|
||||
"devDependencies": {
|
||||
"@types/node": "^20",
|
||||
"@types/react": "^19",
|
||||
"@types/react-dom": "^19",
|
||||
"babel-plugin-react-compiler": "1.0.0",
|
||||
"typescript": "^5"
|
||||
}
|
||||
}
|
||||
|
||||
1
public/file.svg
Normal file
1
public/file.svg
Normal file
@@ -0,0 +1 @@
|
||||
<svg fill="none" viewBox="0 0 16 16" xmlns="http://www.w3.org/2000/svg"><path d="M14.5 13.5V5.41a1 1 0 0 0-.3-.7L9.8.29A1 1 0 0 0 9.08 0H1.5v13.5A2.5 2.5 0 0 0 4 16h8a2.5 2.5 0 0 0 2.5-2.5m-1.5 0v-7H8v-5H3v12a1 1 0 0 0 1 1h8a1 1 0 0 0 1-1M9.5 5V2.12L12.38 5zM5.13 5h-.62v1.25h2.12V5zm-.62 3h7.12v1.25H4.5zm.62 3h-.62v1.25h7.12V11z" clip-rule="evenodd" fill="#666" fill-rule="evenodd"/></svg>
|
||||
|
After Width: | Height: | Size: 391 B |
1
public/globe.svg
Normal file
1
public/globe.svg
Normal file
@@ -0,0 +1 @@
|
||||
<svg fill="none" xmlns="http://www.w3.org/2000/svg" viewBox="0 0 16 16"><g clip-path="url(#a)"><path fill-rule="evenodd" clip-rule="evenodd" d="M10.27 14.1a6.5 6.5 0 0 0 3.67-3.45q-1.24.21-2.7.34-.31 1.83-.97 3.1M8 16A8 8 0 1 0 8 0a8 8 0 0 0 0 16m.48-1.52a7 7 0 0 1-.96 0H7.5a4 4 0 0 1-.84-1.32q-.38-.89-.63-2.08a40 40 0 0 0 3.92 0q-.25 1.2-.63 2.08a4 4 0 0 1-.84 1.31zm2.94-4.76q1.66-.15 2.95-.43a7 7 0 0 0 0-2.58q-1.3-.27-2.95-.43a18 18 0 0 1 0 3.44m-1.27-3.54a17 17 0 0 1 0 3.64 39 39 0 0 1-4.3 0 17 17 0 0 1 0-3.64 39 39 0 0 1 4.3 0m1.1-1.17q1.45.13 2.69.34a6.5 6.5 0 0 0-3.67-3.44q.65 1.26.98 3.1M8.48 1.5l.01.02q.41.37.84 1.31.38.89.63 2.08a40 40 0 0 0-3.92 0q.25-1.2.63-2.08a4 4 0 0 1 .85-1.32 7 7 0 0 1 .96 0m-2.75.4a6.5 6.5 0 0 0-3.67 3.44 29 29 0 0 1 2.7-.34q.31-1.83.97-3.1M4.58 6.28q-1.66.16-2.95.43a7 7 0 0 0 0 2.58q1.3.27 2.95.43a18 18 0 0 1 0-3.44m.17 4.71q-1.45-.12-2.69-.34a6.5 6.5 0 0 0 3.67 3.44q-.65-1.27-.98-3.1" fill="#666"/></g><defs><clipPath id="a"><path fill="#fff" d="M0 0h16v16H0z"/></clipPath></defs></svg>
|
||||
|
After Width: | Height: | Size: 1.0 KiB |
1
public/next.svg
Normal file
1
public/next.svg
Normal file
@@ -0,0 +1 @@
|
||||
<svg xmlns="http://www.w3.org/2000/svg" fill="none" viewBox="0 0 394 80"><path fill="#000" d="M262 0h68.5v12.7h-27.2v66.6h-13.6V12.7H262V0ZM149 0v12.7H94v20.4h44.3v12.6H94v21h55v12.6H80.5V0h68.7zm34.3 0h-17.8l63.8 79.4h17.9l-32-39.7 32-39.6h-17.9l-23 28.6-23-28.6zm18.3 56.7-9-11-27.1 33.7h17.8l18.3-22.7z"/><path fill="#000" d="M81 79.3 17 0H0v79.3h13.6V17l50.2 62.3H81Zm252.6-.4c-1 0-1.8-.4-2.5-1s-1.1-1.6-1.1-2.6.3-1.8 1-2.5 1.6-1 2.6-1 1.8.3 2.5 1a3.4 3.4 0 0 1 .6 4.3 3.7 3.7 0 0 1-3 1.8zm23.2-33.5h6v23.3c0 2.1-.4 4-1.3 5.5a9.1 9.1 0 0 1-3.8 3.5c-1.6.8-3.5 1.3-5.7 1.3-2 0-3.7-.4-5.3-1s-2.8-1.8-3.7-3.2c-.9-1.3-1.4-3-1.4-5h6c.1.8.3 1.6.7 2.2s1 1.2 1.6 1.5c.7.4 1.5.5 2.4.5 1 0 1.8-.2 2.4-.6a4 4 0 0 0 1.6-1.8c.3-.8.5-1.8.5-3V45.5zm30.9 9.1a4.4 4.4 0 0 0-2-3.3 7.5 7.5 0 0 0-4.3-1.1c-1.3 0-2.4.2-3.3.5-.9.4-1.6 1-2 1.6a3.5 3.5 0 0 0-.3 4c.3.5.7.9 1.3 1.2l1.8 1 2 .5 3.2.8c1.3.3 2.5.7 3.7 1.2a13 13 0 0 1 3.2 1.8 8.1 8.1 0 0 1 3 6.5c0 2-.5 3.7-1.5 5.1a10 10 0 0 1-4.4 3.5c-1.8.8-4.1 1.2-6.8 1.2-2.6 0-4.9-.4-6.8-1.2-2-.8-3.4-2-4.5-3.5a10 10 0 0 1-1.7-5.6h6a5 5 0 0 0 3.5 4.6c1 .4 2.2.6 3.4.6 1.3 0 2.5-.2 3.5-.6 1-.4 1.8-1 2.4-1.7a4 4 0 0 0 .8-2.4c0-.9-.2-1.6-.7-2.2a11 11 0 0 0-2.1-1.4l-3.2-1-3.8-1c-2.8-.7-5-1.7-6.6-3.2a7.2 7.2 0 0 1-2.4-5.7 8 8 0 0 1 1.7-5 10 10 0 0 1 4.3-3.5c2-.8 4-1.2 6.4-1.2 2.3 0 4.4.4 6.2 1.2 1.8.8 3.2 2 4.3 3.4 1 1.4 1.5 3 1.5 5h-5.8z"/></svg>
|
||||
|
After Width: | Height: | Size: 1.3 KiB |
1
public/vercel.svg
Normal file
1
public/vercel.svg
Normal file
@@ -0,0 +1 @@
|
||||
<svg fill="none" xmlns="http://www.w3.org/2000/svg" viewBox="0 0 1155 1000"><path d="m577.3 0 577.4 1000H0z" fill="#fff"/></svg>
|
||||
|
After Width: | Height: | Size: 128 B |
1
public/window.svg
Normal file
1
public/window.svg
Normal file
@@ -0,0 +1 @@
|
||||
<svg fill="none" xmlns="http://www.w3.org/2000/svg" viewBox="0 0 16 16"><path fill-rule="evenodd" clip-rule="evenodd" d="M1.5 2.5h13v10a1 1 0 0 1-1 1h-11a1 1 0 0 1-1-1zM0 1h16v11.5a2.5 2.5 0 0 1-2.5 2.5h-11A2.5 2.5 0 0 1 0 12.5zm3.75 4.5a.75.75 0 1 0 0-1.5.75.75 0 0 0 0 1.5M7 4.75a.75.75 0 1 1-1.5 0 .75.75 0 0 1 1.5 0m1.75.75a.75.75 0 1 0 0-1.5.75.75 0 0 0 0 1.5" fill="#666"/></svg>
|
||||
|
After Width: | Height: | Size: 385 B |
BIN
src/app/favicon.ico
Normal file
BIN
src/app/favicon.ico
Normal file
Binary file not shown.
|
After Width: | Height: | Size: 25 KiB |
7
src/app/globals.scss
Normal file
7
src/app/globals.scss
Normal file
@@ -0,0 +1,7 @@
|
||||
@use '@/styles/elements/root';
|
||||
|
||||
@use '@/styles/elements/a';
|
||||
@use '@/styles/elements/all';
|
||||
@use '@/styles/elements/button';
|
||||
@use '@/styles/elements/body';
|
||||
@use '@/styles/elements/html';
|
||||
23
src/app/layout.tsx
Normal file
23
src/app/layout.tsx
Normal file
@@ -0,0 +1,23 @@
|
||||
import type { Metadata } from "next";
|
||||
import "./globals.scss";
|
||||
import { Header } from "@/components/Header/Header";
|
||||
|
||||
export const metadata: Metadata = {
|
||||
title: "Create Next App",
|
||||
description: "Generated by create next app",
|
||||
};
|
||||
|
||||
export default function RootLayout({
|
||||
children,
|
||||
}: Readonly<{
|
||||
children: React.ReactNode;
|
||||
}>) {
|
||||
return (
|
||||
<html lang="en">
|
||||
<body>
|
||||
<Header />
|
||||
{children}
|
||||
</body>
|
||||
</html>
|
||||
);
|
||||
}
|
||||
11
src/app/page.tsx
Normal file
11
src/app/page.tsx
Normal file
@@ -0,0 +1,11 @@
|
||||
import React from 'react';
|
||||
|
||||
const Home:React.FC<{}> = () => {
|
||||
return (
|
||||
<main>
|
||||
Homepage
|
||||
</main>
|
||||
);
|
||||
}
|
||||
|
||||
export default Home;
|
||||
@@ -1,3 +0,0 @@
|
||||
import { pageCompileAll } from "./compiler";
|
||||
|
||||
pageCompileAll();
|
||||
@@ -1,75 +0,0 @@
|
||||
// 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);
|
||||
});
|
||||
}
|
||||
59
src/components/Header.scss
Normal file
59
src/components/Header.scss
Normal file
@@ -0,0 +1,59 @@
|
||||
|
||||
.header {
|
||||
margin-bottom: 2rem;
|
||||
display: flex;
|
||||
align-items: center;
|
||||
justify-content: space-between;
|
||||
border-radius: var(--radius-large);
|
||||
border: 1px solid var(--color-neumorph-light);
|
||||
background: var(--color-header-bg);
|
||||
padding: 1rem 1.5rem;
|
||||
box-shadow:
|
||||
var(--color-header-shadow1),
|
||||
var(--color-header-shadow2),
|
||||
var(--color-header-shadow3);
|
||||
backdrop-filter: blur(12px);
|
||||
}
|
||||
|
||||
.header__brand {}
|
||||
.header__subtitle {
|
||||
color: var(--color-header-subtitle);
|
||||
}
|
||||
.header__title {
|
||||
color: var(--color-header-title);
|
||||
}
|
||||
|
||||
.header__nav {
|
||||
display: none;
|
||||
align-items: center;
|
||||
gap: 0.75rem;
|
||||
}
|
||||
|
||||
@media (min-width: 768px) {
|
||||
.header__nav {
|
||||
display: flex;
|
||||
}
|
||||
}
|
||||
|
||||
.header__nav-btn {
|
||||
border-radius: 9999px;
|
||||
border: 1px solid var(--color-neumorph-light);
|
||||
background: var(--color-header-btn-bg);
|
||||
padding: 0.5rem 1rem;
|
||||
font-size: 0.875rem;
|
||||
color: var(--color-header-btn-text);
|
||||
box-shadow:
|
||||
var(--color-header-btn-shadow1),
|
||||
var(--color-header-btn-shadow2);
|
||||
transition: color 0.2s, box-shadow 0.2s;
|
||||
border-width: 1px;
|
||||
border-style: solid;
|
||||
border-color: var(--color-neumorph-light);
|
||||
}
|
||||
|
||||
.header__nav-btn:hover {
|
||||
color: var(--color-header-btn-hover-text);
|
||||
box-shadow:
|
||||
var(--color-header-btn-hover-shadow1),
|
||||
var(--color-header-btn-hover-shadow2);
|
||||
}
|
||||
29
src/components/Header/Header.module.scss
Normal file
29
src/components/Header/Header.module.scss
Normal file
@@ -0,0 +1,29 @@
|
||||
|
||||
.header {
|
||||
display: flex;
|
||||
align-items: center;
|
||||
justify-content: space-between;
|
||||
padding: 1rem 1.5rem;
|
||||
border-radius: var(--radius-large);
|
||||
border: 1px solid var(--color-neumorph-light);
|
||||
background: var( --color-surface);
|
||||
box-shadow: var(--box-shadow-deep);
|
||||
max-width: var(--max-width-large);
|
||||
margin: auto auto 2rem auto;
|
||||
|
||||
&__brand {
|
||||
|
||||
}
|
||||
|
||||
&__nav {
|
||||
display: none;
|
||||
align-items: center;
|
||||
gap: 0.75rem;
|
||||
}
|
||||
|
||||
@media (min-width: 768px) {
|
||||
&__nav {
|
||||
display: flex;
|
||||
}
|
||||
}
|
||||
}
|
||||
21
src/components/Header/Header.tsx
Normal file
21
src/components/Header/Header.tsx
Normal file
@@ -0,0 +1,21 @@
|
||||
import HeaderButton from './HeaderButton';
|
||||
import styles from './Header.module.scss';
|
||||
|
||||
export const Header: React.FC<{}> = () => {
|
||||
return (
|
||||
<header className={styles['header']}>
|
||||
<div className={styles['header__brand']}>
|
||||
|
||||
</div>
|
||||
<nav className={styles['header__nav']}>
|
||||
{['Home', 'Features', 'Work', 'Contact'].map((item) => (
|
||||
<HeaderButton
|
||||
key={item}
|
||||
>
|
||||
{item}
|
||||
</HeaderButton>
|
||||
))}
|
||||
</nav>
|
||||
</header>
|
||||
);
|
||||
}
|
||||
14
src/components/Header/HeaderButton.module.scss
Normal file
14
src/components/Header/HeaderButton.module.scss
Normal file
@@ -0,0 +1,14 @@
|
||||
.HeaderButton {
|
||||
padding: 0.5rem 1rem;
|
||||
font-size: 0.875rem;
|
||||
border-radius: 999em;
|
||||
background: var(--color-surface);
|
||||
box-shadow: var(--box-shadow-raised-low);
|
||||
border: 1px solid var(--color-neumorph-light);
|
||||
transition: all 1s ease;
|
||||
cursor: pointer;
|
||||
|
||||
&:hover {
|
||||
box-shadow: var(--box-shadow-lowered-low);
|
||||
}
|
||||
}
|
||||
14
src/components/Header/HeaderButton.tsx
Normal file
14
src/components/Header/HeaderButton.tsx
Normal file
@@ -0,0 +1,14 @@
|
||||
import React from 'react';
|
||||
import styles from './HeaderButton.module.scss';
|
||||
|
||||
const HeaderButton:React.FC<{
|
||||
children:React.ReactNode;
|
||||
}> = ({ children }) => {
|
||||
return (
|
||||
<button className={styles.HeaderButton}>
|
||||
{children}
|
||||
</button>
|
||||
);
|
||||
}
|
||||
|
||||
export default HeaderButton;
|
||||
@@ -1,106 +0,0 @@
|
||||
<section>
|
||||
<h1>Dominic Masters</h1>
|
||||
<h2>Developer, Nerd, Occasionally Funny.</h2>
|
||||
|
||||
<p>
|
||||
Australian-American nerd with a passion for all things computing, coffee and
|
||||
video games. Currently residing in Peoria, Illinois.
|
||||
</p>
|
||||
|
||||
<p>
|
||||
Programming since before the internet was cool.
|
||||
</p>
|
||||
</section>
|
||||
|
||||
<div class="o-break"></div>
|
||||
|
||||
<section>
|
||||
<h2>Programming Technical Lead</h2>
|
||||
<p>
|
||||
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 16 years of experience and countless lines of code
|
||||
committed.
|
||||
</p>
|
||||
|
||||
<p>
|
||||
Background with more anagrams than a bureaucrat, here are some of the
|
||||
highlights only;
|
||||
<ul>
|
||||
<li>eCommerce ( Shopify, Magento, WooCommerce, neto )</li>
|
||||
<li>Traditional Web ( HTML, CSS, JS )</li>
|
||||
<li>Modern Web ( ES6, TS, GraphQL )</li>
|
||||
<li>Server Side ( NodeJS, PHP, .NET )</li>
|
||||
<li>Client Side ( C/C++, Java )</li>
|
||||
<li>Database Side ( SQL, NoSQL )</li>
|
||||
<li>Frameworks ( React, Web Components )</li>
|
||||
<li>Antiques ( Lua, jQuery, SOAPXML )</li>
|
||||
<li>Flashy ( OpenGL, Vulkan, Unity )</li>
|
||||
<li>Boring ( Google Data Studio )</li>
|
||||
<li>Servers ( AWS, CloudFlare, Heroku, Azure )</li>
|
||||
<li>Every "API"</li>
|
||||
<li>Ask me for a comprehensive list.</li>
|
||||
</ul>
|
||||
</p>
|
||||
</section>
|
||||
|
||||
<div class="o-break"></div>
|
||||
|
||||
|
||||
<section>
|
||||
<h2>Shopify Expert</h2>
|
||||
<p>
|
||||
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 8 years, and enjoy working with it immensely.
|
||||
</p>
|
||||
|
||||
<p>
|
||||
Working with Liquid, REST and GraphQL App Development and general
|
||||
Shopify consulting. I have had the privilage of working with countless
|
||||
Shopify Plus clients.
|
||||
</p>
|
||||
|
||||
<p>
|
||||
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.
|
||||
</p>
|
||||
</section>
|
||||
|
||||
<div class="o-break"></div>
|
||||
|
||||
<section>
|
||||
<h2>Personal</h2>
|
||||
<p>
|
||||
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.
|
||||
</p>
|
||||
|
||||
<p>
|
||||
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.
|
||||
</p>
|
||||
|
||||
<p>
|
||||
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.
|
||||
</p>
|
||||
</section>
|
||||
|
||||
<div class="o-break"></div>
|
||||
|
||||
<section>
|
||||
<h2>Social</h2>
|
||||
<p>
|
||||
I don't do social media often, however you can find me below.
|
||||
For business enquiries contact I suggest LinkedIn.
|
||||
</p>
|
||||
|
||||
<p><a href="//www.linkedin.com/in/dominic-masters-86732678/">LinkedIn</a></p>
|
||||
<p><a href="//git.wish.moe/YourWishes">GitHub</a></p>
|
||||
</section>
|
||||
@@ -1,175 +0,0 @@
|
||||
<h1>Privacy Policy</h1>
|
||||
<p>Effective date: June 27, 2018</p>
|
||||
<p>
|
||||
domsPlace ("us", "we", or "our") operates
|
||||
the <a href="//domsplace.com">https://domsplace.com</a> website (the
|
||||
"Service").
|
||||
</p>
|
||||
|
||||
<p>
|
||||
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.
|
||||
</p>
|
||||
|
||||
<p>
|
||||
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 <a href="//domsplace.com">
|
||||
https://domsplace.com
|
||||
</a>
|
||||
</p>
|
||||
|
||||
|
||||
<div class="o-break"></div>
|
||||
|
||||
|
||||
<h2>Information Collection And Use</h2>
|
||||
<p>
|
||||
We collect several different types of information for various purposes
|
||||
to provide and improve our Service to you.
|
||||
</p>
|
||||
|
||||
<h3>Types of Data Collected</h3>
|
||||
<h4>Personal Data</h4>
|
||||
<p>
|
||||
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:
|
||||
</p>
|
||||
<ul>
|
||||
<li>Email address</li>
|
||||
<li>First name and last name</li>
|
||||
<li>Phone number</li>
|
||||
<li>Cookies and Usage Data</li>
|
||||
</ul>
|
||||
|
||||
<h4>Usage Data</h4>
|
||||
<p>
|
||||
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.
|
||||
</p>
|
||||
|
||||
<h4>Tracking & Cookies Data</h4>
|
||||
<p>
|
||||
We use cookies and similar tracking technologies to track the activity
|
||||
on our Service and hold certain information.
|
||||
</p>
|
||||
<p>
|
||||
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.
|
||||
</p>
|
||||
<p>
|
||||
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.
|
||||
</p>
|
||||
<p>Examples of Cookies we use:</p>
|
||||
<ul>
|
||||
<li><strong>Session Cookies.</strong> We use Session Cookies to operate our Service.</li>
|
||||
<li><strong>Preference Cookies.</strong> We use Preference Cookies to remember your preferences and various settings.</li>
|
||||
<li><strong>Security Cookies.</strong> We use Security Cookies for security purposes.</li>
|
||||
</ul>
|
||||
|
||||
|
||||
<div class="o-break"></div>
|
||||
|
||||
|
||||
<h2>Use of Data</h2>
|
||||
<p>domsPlace uses the collected data for various purposes:</p>
|
||||
<ul>
|
||||
<li>To provide and maintain the Service</li>
|
||||
<li>To notify you about changes to our Service</li>
|
||||
<li>To allow you to participate in interactive features of our Service when you choose to do so</li>
|
||||
<li>To provide customer care and support</li>
|
||||
<li>To provide analysis or valuable information so that we can improve the Service</li>
|
||||
<li>To monitor the usage of the Service</li>
|
||||
<li>To detect, prevent and address technical issues</li>
|
||||
</ul>
|
||||
|
||||
|
||||
<div class="o-break"></div>
|
||||
|
||||
|
||||
<h2>Transfer Of Data</h2>
|
||||
<p>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.</p>
|
||||
<p>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.</p>
|
||||
<p>Your consent to this Privacy Policy followed by your submission of such information represents your agreement to that transfer.</p>
|
||||
<p>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.</p>
|
||||
|
||||
|
||||
<div class="o-break"></div>
|
||||
|
||||
|
||||
<h2>Disclosure Of Data</h2>
|
||||
<h3>Legal Requirements</h3>
|
||||
<p>domsPlace may disclose your Personal Data in the good faith belief that such action is necessary to:</p>
|
||||
<ul>
|
||||
<li>To comply with a legal obligation</li>
|
||||
<li>To protect and defend the rights or property of domsPlace</li>
|
||||
<li>To prevent or investigate possible wrongdoing in connection with the Service</li>
|
||||
<li>To protect the personal safety of users of the Service or the public</li>
|
||||
<li>To protect against legal liability</li>
|
||||
</ul>
|
||||
|
||||
|
||||
<div class="o-break"></div>
|
||||
|
||||
|
||||
<h2>Security Of Data</h2>
|
||||
<p>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.</p>
|
||||
|
||||
|
||||
<div class="o-break"></div>
|
||||
|
||||
|
||||
<h2>Service Providers</h2>
|
||||
<p>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.</p>
|
||||
<p>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.</p>
|
||||
|
||||
<h3>Analytics</h3>
|
||||
<p>We may use third-party Service Providers to monitor and analyze the use of our Service.</p>
|
||||
<ul>
|
||||
<li>
|
||||
<p><strong>Google Analytics</strong></p>
|
||||
<p>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.</p>
|
||||
<p>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.</p>
|
||||
<p>For more information on the privacy practices of Google, please visit the Google Privacy & Terms web page: <a href="https://policies.google.com/privacy?hl=en" target="_blank" rel="noopener">https://policies.google.com/privacy?hl=en</a>
|
||||
</p>
|
||||
</li>
|
||||
</ul>
|
||||
|
||||
|
||||
<div class="o-break"></div>
|
||||
|
||||
|
||||
<h2>Links To Other Sites</h2>
|
||||
<p>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.</p>
|
||||
<p>We have no control over and assume no responsibility for the content, privacy policies or practices of any third party sites or services.</p>
|
||||
|
||||
|
||||
<div class="o-break"></div>
|
||||
|
||||
|
||||
<h2>Children's Privacy</h2>
|
||||
<p>Our Service does not address anyone under the age of 18 ("Children").</p>
|
||||
<p>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.</p>
|
||||
|
||||
|
||||
<div class="o-break"></div>
|
||||
|
||||
|
||||
<h2>Changes To This Privacy Policy</h2>
|
||||
<p>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.</p>
|
||||
<p>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.</p>
|
||||
<p>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.</p>
|
||||
@@ -1,74 +0,0 @@
|
||||
/* Elements */
|
||||
* {
|
||||
box-sizing: border-box;
|
||||
}
|
||||
|
||||
html,body {
|
||||
margin: 0;
|
||||
padding: 0;
|
||||
font-size: 16px;
|
||||
line-height: 1.6;
|
||||
|
||||
background: #000;
|
||||
color: #DDD;
|
||||
font-family: Arial, Helvetica, sans-serif;
|
||||
}
|
||||
|
||||
a {
|
||||
color: #56C0F1;
|
||||
text-decoration: underline;
|
||||
}
|
||||
a:visited,a:active { color: #D84DAC; }
|
||||
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;
|
||||
}
|
||||
@@ -1,47 +0,0 @@
|
||||
|
||||
<!DOCTYPE html>
|
||||
<html lang="en">
|
||||
<!--
|
||||
Copyright (c) 2021 Dominic Masters
|
||||
|
||||
This software is released under the MIT License.
|
||||
https://opensource.org/licenses/MIT
|
||||
-->
|
||||
|
||||
<head>
|
||||
<title>domsPlace, Personal Website of Technical Lead Dominic Masters</title>
|
||||
<meta charset="utf-8" />
|
||||
<meta name="viewport" content="width=device-width, initial-scale=1.0" />
|
||||
<meta name="description" content="Personal website of Technical Lead, Dominic Masters, eCommerce Senior Full-Stack Developer using modern web technologies.">
|
||||
|
||||
|
||||
<style type="text/css">{{styles}}</style>
|
||||
</head>
|
||||
|
||||
<body>
|
||||
<header class="c-header">
|
||||
<p class="c-header__title">
|
||||
<a href="/" class="c-header__title-link">
|
||||
domsPlace, Personal website of Dominic Masters.
|
||||
</a>
|
||||
</p>
|
||||
|
||||
<p class="c-header__subtitle">
|
||||
Wow, I can't believe it's not React!
|
||||
</p>
|
||||
</header>
|
||||
|
||||
<main class="c-main">
|
||||
{{main}}
|
||||
</main>
|
||||
|
||||
<footer class="c-footer">
|
||||
<p>2012 ~ {{year}} - Dominic Masters</p>
|
||||
|
||||
<p>
|
||||
<a href="/" class="c-footer__link">Home</a>
|
||||
<a href="/privacy" class="c-footer__link">Privacy Policy</a>
|
||||
</p>
|
||||
</footer>
|
||||
</body>
|
||||
</html>
|
||||
20
src/serve.ts
20
src/serve.ts
@@ -1,20 +0,0 @@
|
||||
// Copyright (c) 2021 Dominic Masters
|
||||
//
|
||||
// This software is released under the MIT License.
|
||||
// https://opensource.org/licenses/MIT
|
||||
|
||||
import * as express from 'express';
|
||||
import { pageCompileAll, PATH_OUT } from './compiler';
|
||||
|
||||
const app = express()
|
||||
const port = 80;
|
||||
|
||||
app.use((req, res, next) => {
|
||||
pageCompileAll();
|
||||
next();
|
||||
})
|
||||
app.use(express.static(PATH_OUT));
|
||||
|
||||
app.listen(port, () => {
|
||||
console.log(`Example app listening at http://localhost:${port}`)
|
||||
})
|
||||
4
src/styles/elements/a.scss
Normal file
4
src/styles/elements/a.scss
Normal file
@@ -0,0 +1,4 @@
|
||||
a {
|
||||
color: inherit;
|
||||
text-decoration: none;
|
||||
}
|
||||
3
src/styles/elements/all.scss
Normal file
3
src/styles/elements/all.scss
Normal file
@@ -0,0 +1,3 @@
|
||||
* {
|
||||
box-sizing: border-box;
|
||||
}
|
||||
16
src/styles/elements/body.scss
Normal file
16
src/styles/elements/body.scss
Normal file
@@ -0,0 +1,16 @@
|
||||
body {
|
||||
margin: 0;
|
||||
padding: 1rem;
|
||||
max-width: 100vw;
|
||||
overflow-x: hidden;
|
||||
min-height: 100%;
|
||||
font-family: Arial, Helvetica, sans-serif;
|
||||
|
||||
background-color: var(--color-background);
|
||||
background:
|
||||
radial-gradient(circle at top left, rgba(255, 0, 170, 0.18), transparent 28%),
|
||||
radial-gradient(circle at bottom right, rgba(130, 70, 255, 0.22), transparent 30%),
|
||||
linear-gradient(180deg, var(--color-background) 0%, var(--color-background-secondary) 100%)
|
||||
;
|
||||
color: white;
|
||||
}
|
||||
9
src/styles/elements/button.scss
Normal file
9
src/styles/elements/button.scss
Normal file
@@ -0,0 +1,9 @@
|
||||
button {
|
||||
padding: 0;
|
||||
border: none;
|
||||
background: none;
|
||||
font-family: inherit;
|
||||
cursor: inherit;
|
||||
color: inherit;
|
||||
font-size: inherit;
|
||||
}
|
||||
5
src/styles/elements/html.scss
Normal file
5
src/styles/elements/html.scss
Normal file
@@ -0,0 +1,5 @@
|
||||
html {
|
||||
height: 100%;
|
||||
max-width: 100vw;
|
||||
overflow-x: hidden;
|
||||
}
|
||||
31
src/styles/elements/root.scss
Normal file
31
src/styles/elements/root.scss
Normal file
@@ -0,0 +1,31 @@
|
||||
:root {
|
||||
--color-background: #12091f;
|
||||
--color-background-secondary: #0e0718;
|
||||
|
||||
--color-surface: rgba(26, 15, 44, 1);
|
||||
|
||||
--color-neumorph-light: rgba(255, 255, 255, 0.1);
|
||||
--color-neumorph-dark: rgba(0, 0, 0, 0.25);
|
||||
|
||||
--radius-large: 1.75rem;
|
||||
|
||||
--box-shadow-raised-high:
|
||||
10px 10px 24px rgba(5,2,10,0.85),
|
||||
-8px -8px 20px rgba(91,53,141,0.08),
|
||||
inset 1px 1px 0 rgba(255,255,255,0.03)
|
||||
;
|
||||
|
||||
--box-shadow-raised-low:
|
||||
6px 6px 14px rgba(8,3,15,0.9),
|
||||
-5px -5px 14px rgba(103,64,156,0.1)
|
||||
;
|
||||
--box-shadow-lowered-low:
|
||||
inset 3px 3px 8px rgba(6,2,12,0.95),
|
||||
inset -2px -2px 8px rgba(118,76,176,0.08)
|
||||
;
|
||||
|
||||
--backdrop-raised-high: blur(12px);
|
||||
--backdrop-raised-low: blur(6px);
|
||||
|
||||
--max-width-large: 1600px;
|
||||
}
|
||||
34
tsconfig.json
Normal file
34
tsconfig.json
Normal file
@@ -0,0 +1,34 @@
|
||||
{
|
||||
"compilerOptions": {
|
||||
"target": "ES2017",
|
||||
"lib": ["dom", "dom.iterable", "esnext"],
|
||||
"allowJs": true,
|
||||
"skipLibCheck": true,
|
||||
"strict": true,
|
||||
"noEmit": true,
|
||||
"esModuleInterop": true,
|
||||
"module": "esnext",
|
||||
"moduleResolution": "bundler",
|
||||
"resolveJsonModule": true,
|
||||
"isolatedModules": true,
|
||||
"jsx": "react-jsx",
|
||||
"incremental": true,
|
||||
"plugins": [
|
||||
{
|
||||
"name": "next"
|
||||
}
|
||||
],
|
||||
"paths": {
|
||||
"@/*": ["./src/*"]
|
||||
}
|
||||
},
|
||||
"include": [
|
||||
"next-env.d.ts",
|
||||
"**/*.ts",
|
||||
"**/*.tsx",
|
||||
".next/types/**/*.ts",
|
||||
".next/dev/types/**/*.ts",
|
||||
"**/*.mts"
|
||||
],
|
||||
"exclude": ["node_modules"]
|
||||
}
|
||||
145
types/cache-life.d.ts
vendored
Normal file
145
types/cache-life.d.ts
vendored
Normal file
@@ -0,0 +1,145 @@
|
||||
// Type definitions for Next.js cacheLife configs
|
||||
|
||||
declare module 'next/cache' {
|
||||
export { unstable_cache } from 'next/dist/server/web/spec-extension/unstable-cache'
|
||||
export {
|
||||
updateTag,
|
||||
revalidateTag,
|
||||
revalidatePath,
|
||||
refresh,
|
||||
} from 'next/dist/server/web/spec-extension/revalidate'
|
||||
export { unstable_noStore } from 'next/dist/server/web/spec-extension/unstable-no-store'
|
||||
|
||||
|
||||
/**
|
||||
* Cache this `"use cache"` for a timespan defined by the `"default"` profile.
|
||||
* ```
|
||||
* stale: 300 seconds (5 minutes)
|
||||
* revalidate: 900 seconds (15 minutes)
|
||||
* expire: never
|
||||
* ```
|
||||
*
|
||||
* This cache may be stale on clients for 5 minutes before checking with the server.
|
||||
* If the server receives a new request after 15 minutes, start revalidating new values in the background.
|
||||
* It lives for the maximum age of the server cache. If this entry has no traffic for a while, it may serve an old value the next request.
|
||||
*/
|
||||
export function cacheLife(profile: "default"): void
|
||||
|
||||
/**
|
||||
* Cache this `"use cache"` for a timespan defined by the `"seconds"` profile.
|
||||
* ```
|
||||
* stale: 30 seconds
|
||||
* revalidate: 1 seconds
|
||||
* expire: 60 seconds (1 minute)
|
||||
* ```
|
||||
*
|
||||
* This cache may be stale on clients for 30 seconds before checking with the server.
|
||||
* If the server receives a new request after 1 seconds, start revalidating new values in the background.
|
||||
* If this entry has no traffic for 1 minute it will expire. The next request will recompute it.
|
||||
*/
|
||||
export function cacheLife(profile: "seconds"): void
|
||||
|
||||
/**
|
||||
* Cache this `"use cache"` for a timespan defined by the `"minutes"` profile.
|
||||
* ```
|
||||
* stale: 300 seconds (5 minutes)
|
||||
* revalidate: 60 seconds (1 minute)
|
||||
* expire: 3600 seconds (1 hour)
|
||||
* ```
|
||||
*
|
||||
* This cache may be stale on clients for 5 minutes before checking with the server.
|
||||
* If the server receives a new request after 1 minute, start revalidating new values in the background.
|
||||
* If this entry has no traffic for 1 hour it will expire. The next request will recompute it.
|
||||
*/
|
||||
export function cacheLife(profile: "minutes"): void
|
||||
|
||||
/**
|
||||
* Cache this `"use cache"` for a timespan defined by the `"hours"` profile.
|
||||
* ```
|
||||
* stale: 300 seconds (5 minutes)
|
||||
* revalidate: 3600 seconds (1 hour)
|
||||
* expire: 86400 seconds (1 day)
|
||||
* ```
|
||||
*
|
||||
* This cache may be stale on clients for 5 minutes before checking with the server.
|
||||
* If the server receives a new request after 1 hour, start revalidating new values in the background.
|
||||
* If this entry has no traffic for 1 day it will expire. The next request will recompute it.
|
||||
*/
|
||||
export function cacheLife(profile: "hours"): void
|
||||
|
||||
/**
|
||||
* Cache this `"use cache"` for a timespan defined by the `"days"` profile.
|
||||
* ```
|
||||
* stale: 300 seconds (5 minutes)
|
||||
* revalidate: 86400 seconds (1 day)
|
||||
* expire: 604800 seconds (1 week)
|
||||
* ```
|
||||
*
|
||||
* This cache may be stale on clients for 5 minutes before checking with the server.
|
||||
* If the server receives a new request after 1 day, start revalidating new values in the background.
|
||||
* If this entry has no traffic for 1 week it will expire. The next request will recompute it.
|
||||
*/
|
||||
export function cacheLife(profile: "days"): void
|
||||
|
||||
/**
|
||||
* Cache this `"use cache"` for a timespan defined by the `"weeks"` profile.
|
||||
* ```
|
||||
* stale: 300 seconds (5 minutes)
|
||||
* revalidate: 604800 seconds (1 week)
|
||||
* expire: 2592000 seconds (1 month)
|
||||
* ```
|
||||
*
|
||||
* This cache may be stale on clients for 5 minutes before checking with the server.
|
||||
* If the server receives a new request after 1 week, start revalidating new values in the background.
|
||||
* If this entry has no traffic for 1 month it will expire. The next request will recompute it.
|
||||
*/
|
||||
export function cacheLife(profile: "weeks"): void
|
||||
|
||||
/**
|
||||
* Cache this `"use cache"` for a timespan defined by the `"max"` profile.
|
||||
* ```
|
||||
* stale: 300 seconds (5 minutes)
|
||||
* revalidate: 2592000 seconds (1 month)
|
||||
* expire: 31536000 seconds (365 days)
|
||||
* ```
|
||||
*
|
||||
* This cache may be stale on clients for 5 minutes before checking with the server.
|
||||
* If the server receives a new request after 1 month, start revalidating new values in the background.
|
||||
* If this entry has no traffic for 365 days it will expire. The next request will recompute it.
|
||||
*/
|
||||
export function cacheLife(profile: "max"): void
|
||||
|
||||
/**
|
||||
* Cache this `"use cache"` using a custom timespan.
|
||||
* ```
|
||||
* stale: ... // seconds
|
||||
* revalidate: ... // seconds
|
||||
* expire: ... // seconds
|
||||
* ```
|
||||
*
|
||||
* This is similar to Cache-Control: max-age=`stale`,s-max-age=`revalidate`,stale-while-revalidate=`expire-revalidate`
|
||||
*
|
||||
* If a value is left out, the lowest of other cacheLife() calls or the default, is used instead.
|
||||
*/
|
||||
export function cacheLife(profile: {
|
||||
/**
|
||||
* This cache may be stale on clients for ... seconds before checking with the server.
|
||||
*/
|
||||
stale?: number,
|
||||
/**
|
||||
* If the server receives a new request after ... seconds, start revalidating new values in the background.
|
||||
*/
|
||||
revalidate?: number,
|
||||
/**
|
||||
* If this entry has no traffic for ... seconds it will expire. The next request will recompute it.
|
||||
*/
|
||||
expire?: number
|
||||
}): void
|
||||
|
||||
|
||||
import { cacheTag } from 'next/dist/server/use-cache/cache-tag'
|
||||
export { cacheTag }
|
||||
|
||||
export const unstable_cacheTag: typeof cacheTag
|
||||
export const unstable_cacheLife: typeof cacheLife
|
||||
}
|
||||
57
types/routes.d.ts
vendored
Normal file
57
types/routes.d.ts
vendored
Normal file
@@ -0,0 +1,57 @@
|
||||
// This file is generated automatically by Next.js
|
||||
// Do not edit this file manually
|
||||
|
||||
type AppRoutes = "/"
|
||||
type PageRoutes = never
|
||||
type LayoutRoutes = "/"
|
||||
type RedirectRoutes = never
|
||||
type RewriteRoutes = never
|
||||
type Routes = AppRoutes | PageRoutes | LayoutRoutes | RedirectRoutes | RewriteRoutes
|
||||
|
||||
|
||||
interface ParamMap {
|
||||
"/": {}
|
||||
}
|
||||
|
||||
|
||||
export type ParamsOf<Route extends Routes> = ParamMap[Route]
|
||||
|
||||
interface LayoutSlotMap {
|
||||
"/": never
|
||||
}
|
||||
|
||||
|
||||
export type { AppRoutes, PageRoutes, LayoutRoutes, RedirectRoutes, RewriteRoutes, ParamMap }
|
||||
|
||||
declare global {
|
||||
/**
|
||||
* Props for Next.js App Router page components
|
||||
* @example
|
||||
* ```tsx
|
||||
* export default function Page(props: PageProps<'/blog/[slug]'>) {
|
||||
* const { slug } = await props.params
|
||||
* return <div>Blog post: {slug}</div>
|
||||
* }
|
||||
* ```
|
||||
*/
|
||||
interface PageProps<AppRoute extends AppRoutes> {
|
||||
params: Promise<ParamMap[AppRoute]>
|
||||
searchParams: Promise<Record<string, string | string[] | undefined>>
|
||||
}
|
||||
|
||||
/**
|
||||
* Props for Next.js App Router layout components
|
||||
* @example
|
||||
* ```tsx
|
||||
* export default function Layout(props: LayoutProps<'/dashboard'>) {
|
||||
* return <div>{props.children}</div>
|
||||
* }
|
||||
* ```
|
||||
*/
|
||||
type LayoutProps<LayoutRoute extends LayoutRoutes> = {
|
||||
params: Promise<ParamMap[LayoutRoute]>
|
||||
children: React.ReactNode
|
||||
} & {
|
||||
[K in LayoutSlotMap[LayoutRoute]]: React.ReactNode
|
||||
}
|
||||
}
|
||||
61
types/validator.ts
Normal file
61
types/validator.ts
Normal file
@@ -0,0 +1,61 @@
|
||||
// This file is generated automatically by Next.js
|
||||
// Do not edit this file manually
|
||||
// This file validates that all pages and layouts export the correct types
|
||||
|
||||
import type { AppRoutes, LayoutRoutes, ParamMap } from "./routes.js"
|
||||
import type { ResolvingMetadata, ResolvingViewport } from "next/types.js"
|
||||
|
||||
type AppPageConfig<Route extends AppRoutes = AppRoutes> = {
|
||||
default: React.ComponentType<{ params: Promise<ParamMap[Route]> } & any> | ((props: { params: Promise<ParamMap[Route]> } & any) => React.ReactNode | Promise<React.ReactNode> | never | void | Promise<void>)
|
||||
generateStaticParams?: (props: { params: ParamMap[Route] }) => Promise<any[]> | any[]
|
||||
generateMetadata?: (
|
||||
props: { params: Promise<ParamMap[Route]> } & any,
|
||||
parent: ResolvingMetadata
|
||||
) => Promise<any> | any
|
||||
generateViewport?: (
|
||||
props: { params: Promise<ParamMap[Route]> } & any,
|
||||
parent: ResolvingViewport
|
||||
) => Promise<any> | any
|
||||
metadata?: any
|
||||
viewport?: any
|
||||
}
|
||||
|
||||
type LayoutConfig<Route extends LayoutRoutes = LayoutRoutes> = {
|
||||
default: React.ComponentType<LayoutProps<Route>> | ((props: LayoutProps<Route>) => React.ReactNode | Promise<React.ReactNode> | never | void | Promise<void>)
|
||||
generateStaticParams?: (props: { params: ParamMap[Route] }) => Promise<any[]> | any[]
|
||||
generateMetadata?: (
|
||||
props: { params: Promise<ParamMap[Route]> } & any,
|
||||
parent: ResolvingMetadata
|
||||
) => Promise<any> | any
|
||||
generateViewport?: (
|
||||
props: { params: Promise<ParamMap[Route]> } & any,
|
||||
parent: ResolvingViewport
|
||||
) => Promise<any> | any
|
||||
metadata?: any
|
||||
viewport?: any
|
||||
}
|
||||
|
||||
|
||||
// Validate ../../src/app/page.tsx
|
||||
{
|
||||
type __IsExpected<Specific extends AppPageConfig<"/">> = Specific
|
||||
const handler = {} as typeof import("../../src/app/page.js")
|
||||
type __Check = __IsExpected<typeof handler>
|
||||
// @ts-ignore
|
||||
type __Unused = __Check
|
||||
}
|
||||
|
||||
|
||||
|
||||
|
||||
|
||||
|
||||
|
||||
// Validate ../../src/app/layout.tsx
|
||||
{
|
||||
type __IsExpected<Specific extends LayoutConfig<"/">> = Specific
|
||||
const handler = {} as typeof import("../../src/app/layout.js")
|
||||
type __Check = __IsExpected<typeof handler>
|
||||
// @ts-ignore
|
||||
type __Unused = __Check
|
||||
}
|
||||
Reference in New Issue
Block a user