style: add backing panel to page contents

This commit is contained in:
Oliver Booth 2023-12-22 14:49:16 +00:00
parent 1f6825c9df
commit c2a5dd4ee6
Signed by: oliverbooth
GPG Key ID: E60B570D1B7557B5
11 changed files with 510 additions and 478 deletions

View File

@ -10,86 +10,94 @@
ViewData["Title"] = "Reading List";
}
<h1 class="display-4">Reading List</h1>
<p>
This is a list of the books I've read, I'm currently reading, or that I plan to read. Not every book is listed here,
but I will update this list as I try to remember what it is I've read in the past.
</p>
<p>
This list is also available on <a href="https://www.goodreads.com/review/list/145592619">Goodreads</a>.
</p>
<main class="container">
<h1 class="display-4">Reading List</h1>
<p>
This is a list of the books I've read, I'm currently reading, or that I plan to read. Not every book is listed
here, but I will update this list as I try to remember what it is I've read in the past.
</p>
<p>
This list is also available on <a href="https://www.goodreads.com/review/list/145592619">Goodreads</a>.
</p>
<p class="lead">Currently Reading</p>
<table class="table reading-list">
<thead>
<tr>
<th style="width: 50%">Title</th>
<th style="width: 25%">Author</th>
<th style="width: 25%">ISBN</th>
</tr>
</thead>
<tbody>
@foreach (IBook book in Model.CurrentlyReading.OrderBy(b => b.Author).ThenBy(b => b.Title))
{
<p class="lead">Currently Reading</p>
<table class="table reading-list">
<thead>
<tr>
<td>
<img class="book-cover" src="https://cdn.olivr.me/img/books/@(book.Isbn.Trim()).jpg" alt="Book Cover">
@book.Title.Trim()
</td>
<td>@book.Author.Trim()</td>
<td style="font-family: monospace">@book.Isbn.Trim()<br><img src="@book.GetBarcode()" alt="@book.Isbn"></td>
<th style="width: 50%">Title</th>
<th style="width: 25%">Author</th>
<th style="width: 25%">ISBN</th>
</tr>
}
</tbody>
</table>
</thead>
<p class="lead">Plan to Read</p>
<table class="table reading-list">
<thead>
<tr>
<th style="width: 50%">Title</th>
<th style="width: 25%">Author</th>
<th style="width: 25%">ISBN</th>
</tr>
</thead>
<tbody>
@foreach (IBook book in Model.CurrentlyReading.OrderBy(b => b.Author).ThenBy(b => b.Title))
{
<tr>
<td>
<img class="book-cover" src="https://cdn.olivr.me/img/books/@(book.Isbn.Trim()).jpg" alt="Book Cover">
@book.Title.Trim()
</td>
<td>@book.Author.Trim()</td>
<td style="font-family: monospace">
@book.Isbn.Trim()<br><img src="@book.GetBarcode()" alt="@book.Isbn">
</td>
</tr>
}
</tbody>
</table>
<tbody>
@foreach (IBook book in Model.PlanToRead.OrderBy(b => b.Author).ThenBy(b => b.Title))
{
<p class="lead">Plan to Read</p>
<table class="table reading-list">
<thead>
<tr>
<td>
<img class="book-cover" src="https://cdn.olivr.me/img/books/@(book.Isbn.Trim()).jpg" alt="Book Cover">
@book.Title.Trim()
</td>
<td>@book.Author.Trim()</td>
<td style="font-family: monospace">@book.Isbn.Trim()<br><img src="@book.GetBarcode()" alt="@book.Isbn"></td>
<th style="width: 50%">Title</th>
<th style="width: 25%">Author</th>
<th style="width: 25%">ISBN</th>
</tr>
}
</tbody>
</table>
</thead>
<p class="lead">Read</p>
<table class="table reading-list">
<thead>
<tr>
<th style="width: 50%">Title</th>
<th style="width: 25%">Author</th>
<th style="width: 25%">ISBN</th>
</tr>
</thead>
<tbody>
@foreach (IBook book in Model.PlanToRead.OrderBy(b => b.Author).ThenBy(b => b.Title))
{
<tr>
<td>
<img class="book-cover" src="https://cdn.olivr.me/img/books/@(book.Isbn.Trim()).jpg" alt="Book Cover">
@book.Title.Trim()
</td>
<td>@book.Author.Trim()</td>
<td style="font-family: monospace">
@book.Isbn.Trim()<br><img src="@book.GetBarcode()" alt="@book.Isbn">
</td>
</tr>
}
</tbody>
</table>
<tbody>
@foreach (IBook book in Model.Read.OrderBy(b => b.Author).ThenBy(b => b.Title))
{
<p class="lead">Read</p>
<table class="table reading-list">
<thead>
<tr>
<td>
<img class="book-cover" src="https://cdn.olivr.me/img/books/@(book.Isbn.Trim()).jpg" alt="Book Cover">
@book.Title.Trim()
</td>
<td>@book.Author.Trim()</td>
<td style="font-family: monospace">@book.Isbn.Trim()<br><img src="@book.GetBarcode()" alt="@book.Isbn"></td>
<th style="width: 50%">Title</th>
<th style="width: 25%">Author</th>
<th style="width: 25%">ISBN</th>
</tr>
}
</tbody>
</table>
</thead>
<tbody>
@foreach (IBook book in Model.Read.OrderBy(b => b.Author).ThenBy(b => b.Title))
{
<tr>
<td>
<img class="book-cover" src="https://cdn.olivr.me/img/books/@(book.Isbn.Trim()).jpg" alt="Book Cover">
@book.Title.Trim()
</td>
<td>@book.Author.Trim()</td>
<td style="font-family: monospace">
@book.Isbn.Trim()<br><img src="@book.GetBarcode()" alt="@book.Isbn">
</td>
</tr>
}
</tbody>
</table>
</main>

View File

@ -6,31 +6,33 @@
ViewData["Title"] = "Blacklist";
}
<h1 class="display-4">Contact Blacklist</h1>
<p>
Below is a list of email addresses that have been blocked from contacting me. This list is public so that others may
also block these addresses if they wish. Any email address that contains an asterisk (*) is a wildcard, meaning that
any email address that matches the pattern will be blocked.
</p>
<main class="container">
<h1 class="display-4">Contact Blacklist</h1>
<p>
Below is a list of email addresses that have been blocked from contacting me. This list is public so that others
may also block these addresses if they wish. Any email address that contains an asterisk (*) is a wildcard,
meaning that any email address that matches the pattern will be blocked.
</p>
<p>
You can view this list in JSON format
<a asp-controller="FormattedBlacklist" asp-action="OnGet" asp-route-format="json">here</a>,
or in CSV format
<a asp-controller="FormattedBlacklist" asp-action="OnGet" asp-route-format="csv">here</a>.
</p>
<p>
You can view this list in JSON format
<a asp-controller="FormattedBlacklist" asp-action="OnGet" asp-route-format="json">here</a>,
or in CSV format
<a asp-controller="FormattedBlacklist" asp-action="OnGet" asp-route-format="csv">here</a>.
</p>
<table class="table">
<tr>
<th>Name / Email</th>
<th>Reason</th>
</tr>
@foreach (IBlacklistEntry entry in ContactService.GetBlacklist())
{
<table class="table">
<tr>
<td>@entry.Name &lt;@entry.EmailAddress&gt;</td>
<td>@entry.Reason</td>
<th>Name / Email</th>
<th>Reason</th>
</tr>
}
</table>
@foreach (IBlacklistEntry entry in ContactService.GetBlacklist())
{
<tr>
<td>@entry.Name &lt;@entry.EmailAddress&gt;</td>
<td>@entry.Reason</td>
</tr>
}
</table>
</main>

View File

@ -3,61 +3,63 @@
ViewData["Title"] = "Contact";
}
<h1 class="display-4">Contact</h1>
<p>
Thanks for getting in touch! While I do my best to read to all inquiries, I cannot guarantee that I will be able to
respond to your message. Nevertheless, I appreciate you taking the time to reach out to me and I will respond if I
can.
</p>
<div class="alert alert-warning">
<p class="lead"><i class="fa-solid fa-triangle-exclamation"></i> Spam warning</p>
<main class="container">
<h1 class="display-4">Contact</h1>
<p>
I am politely asking that you respect my inbox and keep your unsolicited advertising away. This is a simple
request. If you send me any kind of spam after this, you have demonstrated that you do not have the basic human
decency to respect my wishes or my privacy, and you have lost the privilege for me to respect yours. I
<strong>will</strong> block your email address, and I will add your name to my public blacklist of spammers,
which you can find <a asp-page="/Contact/Blacklist">here</a>.
Thanks for getting in touch! While I do my best to read to all inquiries, I cannot guarantee that I will be able
to respond to your message. Nevertheless, I appreciate you taking the time to reach out to me and I will respond
if I can.
</p>
</div>
<div class="alert alert-info">
<p class="lead"><i class="fa-solid fa-circle-info"></i> Dear SEO marketing teams</p>
<p>
While I don't necessarily consider receiving legitimate offers for SEO services to be spam, I am not interested
in your services at this time. I understand that you are just doing your job, but hopefully you can do it more
efficiently by going to others who are more receptive to your services.
</p>
<p>
Do not contact me about SEO services. If you do, while I will not publicly blacklist your address, you will -
however - be blocked.
</p>
</div>
<form method="post" asp-controller="Contact" asp-action="HandleForm">
<input type="hidden" name="contact-type" value="other">
<div class="form-group" style="margin-top: 10px;">
<label for="name">Your Name</label>
<input type="text" class="form-control" id="name" name="name" placeholder="Who are you?" required>
<div class="alert alert-warning">
<p class="lead"><i class="fa-solid fa-triangle-exclamation"></i> Spam warning</p>
<p>
I am politely asking that you respect my inbox and keep your unsolicited advertising away. This is a simple
request. If you send me any kind of spam after this, you have demonstrated that you do not have the basic
human decency to respect my wishes or my privacy, and you have lost the privilege for me to respect yours. I
<strong>will</strong> block your email address, and I will add your name to my public blacklist of spammers,
which you can find <a asp-page="/Contact/Blacklist">here</a>.
</p>
</div>
<div class="form-group" style="margin-top: 10px;">
<label for="email">Your Email Address</label>
<input type="email" class="form-control" id="email" name="email" placeholder="How can I reach you?" required>
<div class="alert alert-info">
<p class="lead"><i class="fa-solid fa-circle-info"></i> Dear SEO marketing teams</p>
<p>
While I don't necessarily consider receiving legitimate offers for SEO services to be spam, I am not
interested in your services at this time. I understand that you are just doing your job, but hopefully you
can do it more efficiently by going to others who are more receptive to your services.
</p>
<p>
Do not contact me about SEO services. If you do, while I will not publicly blacklist your address, you
will - however - be blocked.
</p>
</div>
<div class="form-group" style="margin-top: 10px;">
<label for="subject">Subject</label>
<input type="text" class="form-control" id="subject" name="subject" placeholder="What's the gist?" maxlength="100" required>
</div>
<form method="post" asp-controller="Contact" asp-action="HandleForm">
<input type="hidden" name="contact-type" value="other">
<div class="form-group" style="margin-top: 10px;">
<label for="message">Message</label>
<textarea class="form-control" id="message" name="message" rows="5" required placeholder="What's on your mind?"></textarea>
</div>
<div class="form-group" style="margin-top: 10px;">
<label for="name">Your Name</label>
<input type="text" class="form-control" id="name" name="name" placeholder="Who are you?" required>
</div>
<recaptcha/>
<div class="form-group" style="margin-top: 10px;">
<label for="email">Your Email Address</label>
<input type="email" class="form-control" id="email" name="email" placeholder="How can I reach you?" required>
</div>
<button class="btn btn-primary" style="margin-top: 10px;">Submit</button>
</form>
<div class="form-group" style="margin-top: 10px;">
<label for="subject">Subject</label>
<input type="text" class="form-control" id="subject" name="subject" placeholder="What's the gist?" maxlength="100" required>
</div>
<div class="form-group" style="margin-top: 10px;">
<label for="message">Message</label>
<textarea class="form-control" id="message" name="message" rows="5" required placeholder="What's on your mind?"></textarea>
</div>
<recaptcha/>
<button class="btn btn-primary" style="margin-top: 10px;">Submit</button>
</form>
</main>

View File

@ -3,35 +3,37 @@
ViewData["Title"] = "Donate";
}
<h1 class="display-4">Donate</h1>
<main class="container">
<h1 class="display-4">Donate</h1>
<p>
I believe in free and open exchange of information, and I want to keep my educational content free for everyone to
access. I will never put ads on my site, and I don't want to put behind a paywall resources that should be available
to everybody, regardless of their financial situation.
</p>
<p>
However, writing tutorials takes time, and I do have to pay for hosting. While I will never ask you for money, I
will always appreciate it if you do decide to donate. It also helps me to know that people are finding my content
useful, and that I should continue to make more.
</p>
<p>
If you like what I do and are both willing and able to donate money to me and fund all of this, you can do so using
the links below. Thank you for your support!
</p>
<p>
I believe in free and open exchange of information, and I want to keep my educational content free for everyone
to access. I will never put ads on my site, and I don't want to put behind a paywall resources that should be
available to everybody, regardless of their financial situation.
</p>
<p>
However, writing tutorials takes time, and I do have to pay for hosting. While I will never ask you for money, I
will always appreciate it if you do decide to donate. It also helps me to know that people are finding my
content useful, and that I should continue to make more.
</p>
<p>
If you like what I do and are both willing and able to donate money to me and fund all of this, you can do so
using the links below. Thank you for your support!
</p>
<p>
<script type="text/javascript" src="https://storage.ko-fi.com/cdn/widget/Widget_2.js"></script>
<script type="text/javascript">kofiwidget2.init('Support Me on Ko-fi', '#29abe0', 'C0C4DVDZX');kofiwidget2.draw();</script>
</p>
<p>
<script type="text/javascript" src="https://storage.ko-fi.com/cdn/widget/Widget_2.js"></script>
<script type="text/javascript">kofiwidget2.init('Support Me on Ko-fi', '#29abe0', 'C0C4DVDZX');kofiwidget2.draw();</script>
</p>
<p>
<script type="text/javascript" src="https://cdnjs.buymeacoffee.com/1.0.0/button.prod.min.js" data-name="bmc-button" data-slug="oliverbooth" data-color="#FFDD00" data-emoji="" data-font="Cookie" data-text="Buy me a coffee" data-outline-color="#000000" data-font-color="#000000" data-coffee-color="#ffffff"></script>
</p>
<p>
<script type="text/javascript" src="https://cdnjs.buymeacoffee.com/1.0.0/button.prod.min.js" data-name="bmc-button" data-slug="oliverbooth" data-color="#FFDD00" data-emoji="" data-font="Cookie" data-text="Buy me a coffee" data-outline-color="#000000" data-font-color="#000000" data-coffee-color="#ffffff"></script>
</p>
<p>I also accept cryptocurrency donations.</p>
<p>I also accept cryptocurrency donations.</p>
<ul>
<li>BTC: 1LmXvavJr1omscfkXjp7A4VyNf3XhKP9JK</li>
<li>ETH: 0x972C6641e36e2736823A6B1e6BA4D2A814b69fD2</li>
</ul>
<ul>
<li>BTC: 1LmXvavJr1omscfkXjp7A4VyNf3XhKP9JK</li>
<li>ETH: 0x972C6641e36e2736823A6B1e6BA4D2A814b69fD2</li>
</ul>
</main>

View File

@ -1,30 +1,33 @@
@page
<h1 class="display-4">Hi, I'm Oliver.</h1>
<p class="lead">I'm a tech enthusiast, coffee drinker, and software developer.</p>
<main class="container">
<h1 class="display-4">Hi, I'm Oliver.</h1>
<p class="lead">I'm a tech enthusiast, coffee drinker, and software developer.</p>
<p class="text-center">
<img src="~/img/headshot_512x512_2023.jpg" style="width: 512px; max-width: 100%;">
</p>
<p class="text-center">
<img src="~/img/headshot_512x512_2023.jpg" style="width: 512px; max-width: 100%;">
</p>
<p>
My primary focus is C#, though I have dabbled in several other languages such as Java, Kotlin, VB, C/C++, Python,
and others. Over the years I've built up a collection of projects. Some of which I'm extremely proud of, and others
I've quietly abandoned and buried. I'm currently working on a few projects that I hope to release in the near
future, but in the meantime, feel free to check out some of my <a asp-page="/Projects/Index">previous work</a>.
</p>
<p>
My primary focus is C#, though I have dabbled in several other languages such as Java, Kotlin, VB, C/C++,
Python, and others. Over the years I've built up a collection of projects. Some of which I'm extremely proud of,
and others I've quietly abandoned and buried. I'm currently working on a few projects that I hope to release in
the near future, but in the meantime, feel free to check out some of my
<a asp-page="/Projects/Index">previous work</a>.
</p>
<p>
I've also written a few <a asp-page="/Tutorials/Index">tutorials</a> on various topics, usually involving
information not readily available elsewhere. I hope you find them useful. On occasion, I also write about other
topics that I find interesting, such as
<a asp-page="/Blog/Index">my thoughts on the state of the world or the tech industry</a>.
</p>
<p>
I've also written a few <a asp-page="/Tutorials/Index">tutorials</a> on various topics, usually involving
information not readily available elsewhere. I hope you find them useful. On occasion, I also write about other
topics that I find interesting, such as
<a asp-page="/Blog/Index">my thoughts on the state of the world or the tech industry</a>.
</p>
<p>
If you want a general overview of stuff I've made, check out my <a href="https://github.com/oliverbooth">GitHub</a>,
<a href="https://oliverbooth.itch.io">itch.io</a>, and
<a href="https://play.google.com/store/apps/dev?id=9010459220239503006">Google Play</a>.
</p>
<p>
If you want a general overview of stuff I've made, check out my
<a href="https://github.com/oliverbooth">GitHub</a>, <a href="https://oliverbooth.itch.io">itch.io</a>, and
<a href="https://play.google.com/store/apps/dev?id=9010459220239503006">Google Play</a>.
</p>
<p>If you'd like to get in touch, you can do so by <a asp-page="/Contact/Index">clicking here</a>.</p>
<p>If you'd like to get in touch, you can do so by <a asp-page="/Contact/Index">clicking here</a>.</p>
</main>

View File

@ -3,64 +3,66 @@
ViewData["Title"] = "It's 5 O'Clock Somewhere Privacy Policy";
}
<h1 class="display-4">@ViewData["Title"]</h1>
<p class="lead">Last Updated: 24 September 2023</p>
<div class="alert alert-primary">
This Privacy Policy differs from the policy that applies to other applications that I published on Google Play. For
the generalised privacy policy, please <a asp-page="/Privacy/GooglePlay">click here</a>.
</div>
<main class="container">
<h1 class="display-4">@ViewData["Title"]</h1>
<p class="lead">Last Updated: 24 September 2023</p>
<div class="alert alert-primary">
This Privacy Policy differs from the policy that applies to other applications that I published on Google Play. For
the generalised privacy policy, please <a asp-page="/Privacy/GooglePlay">click here</a>.
</div>
<p>
This Privacy Policy describes how your personal information is collected, used, and shared when you use or interact
with the application <em>It's 5 O'Clock Somewhere</em> (the "Application").
</p>
<p>
This Privacy Policy describes how your personal information is collected, used, and shared when you use or interact
with the application <em>It's 5 O'Clock Somewhere</em> (the "Application").
</p>
<h2>Introduction</h2>
<p>
I am committed to protecting your privacy and ensuring the security of any information you provide to me when using
my applications. This Privacy Policy outlines my practices regarding the collection, use, and disclosure of
information I may gather from users of the Application.
</p>
<h2>Introduction</h2>
<p>
I am committed to protecting your privacy and ensuring the security of any information you provide to me when
using my applications. This Privacy Policy outlines my practices regarding the collection, use, and disclosure
of information I may gather from users of the Application.
</p>
<h2>Information I Collect</h2>
<p>
The Application will temporarily read your device's clock to determine the current time. This information is sent to
the Application's server to determine an accurate and time-zone aware response to you, the user. This information is
not stored or retained on the server. I do not use cookies, tracking technologies, or any other means to collect or
track your usage behavior within the Application. I do not have access to any personal data, including your name,
email address, or any other personally identifiable information.
</p>
<h2>Information I Collect</h2>
<p>
The Application will temporarily read your device's clock to determine the current time. This information is
sent to the Application's server to determine an accurate and time-zone aware response to you, the user. This
information is not stored or retained on the server. I do not use cookies, tracking technologies, or any other
means to collect or track your usage behavior within the Application. I do not have access to any personal data,
including your name, email address, or any other personally identifiable information.
</p>
<h2>Use of Information</h2>
<p>
The Application uses the little information it collects from you to provide the Application's functionality to you.
This information is not used for any other purpose.
</p>
<h2>Use of Information</h2>
<p>
The Application uses the little information it collects from you to provide the Application's functionality to
you. This information is not used for any other purpose.
</p>
<h2>Disclosure of Information</h2>
<p>
I do not disclose your personal information to any third parties unless required by law or with your explicit
consent. I maintain strict confidentiality and take reasonable precautions to protect your personal information from
unauthorized access, use, or disclosure.
</p>
<h2>Disclosure of Information</h2>
<p>
I do not disclose your personal information to any third parties unless required by law or with your explicit
consent. I maintain strict confidentiality and take reasonable precautions to protect your personal information
from unauthorized access, use, or disclosure.
</p>
<h2>Security</h2>
<p>
I prioritize the security of your personal information and take reasonable precautions to protect it. However,
please be aware that no method of transmission over the internet or electronic storage is 100% secure, and I cannot
guarantee absolute security.
</p>
<h2>Security</h2>
<p>
I prioritize the security of your personal information and take reasonable precautions to protect it. However,
please be aware that no method of transmission over the internet or electronic storage is 100% secure, and I
cannot guarantee absolute security.
</p>
<h2>Changes to this Privacy Policy</h2>
<p>
I may update this Privacy Policy from time to time to reflect changes in my practices or for other operational,
legal, or regulatory reasons. I encourage you to review this Privacy Policy periodically for any updates. The
revised policy will be effective immediately upon posting.
</p>
<h2>Changes to this Privacy Policy</h2>
<p>
I may update this Privacy Policy from time to time to reflect changes in my practices or for other operational,
legal, or regulatory reasons. I encourage you to review this Privacy Policy periodically for any updates. The
revised policy will be effective immediately upon posting.
</p>
<h2>Contact Me</h2>
<p>
If you have any questions or concerns about this Privacy Policy or my privacy practices, please
<a asp-page="/Contact/Index">get in touch</a>.
</p>
<h2>Contact Me</h2>
<p>
If you have any questions or concerns about this Privacy Policy or my privacy practices, please
<a asp-page="/Contact/Index">get in touch</a>.
</p>
</main>

View File

@ -3,68 +3,70 @@
ViewData["Title"] = "Google Play Privacy Policy";
}
<h1 class="display-4">@ViewData["Title"]</h1>
<p class="lead">Last Updated: 24 September 2023</p>
<div class="alert alert-primary">
This Privacy Policy differs from the policy that applies to this website. For this website's privacy policy, please
<a asp-page="/Privacy/Index">click here</a>.
</div>
<div class="alert alert-warning">
This Privacy Policy does not apply to the application <em>It's 5 O'Clock Somewhere</em>. For the privacy policy that
applies to that application, please <a asp-page="/Privacy/FiveOClockSomewhere">click here</a>.
</div>
<main class="container">
<h1 class="display-4">@ViewData["Title"]</h1>
<p class="lead">Last Updated: 24 September 2023</p>
<div class="alert alert-primary">
This Privacy Policy differs from the policy that applies to this website. For this website's privacy policy,
please <a asp-page="/Privacy/Index">click here</a>.
</div>
<div class="alert alert-warning">
This Privacy Policy does not apply to the application <em>It's 5 O'Clock Somewhere</em>. For the privacy policy
that applies to that application, please <a asp-page="/Privacy/FiveOClockSomewhere">click here</a>.
</div>
<p>
This Privacy Policy describes how your personal information is collected, used, and shared when you use or interact
with applications that I publish on the <a href="https://play.google.com/store/">Google Play Store</a>.
</p>
<p>
This Privacy Policy describes how your personal information is collected, used, and shared when you use or
interact with applications that I publish on the <a href="https://play.google.com/store/">Google Play Store</a>.
</p>
<h2>Introduction</h2>
<p>
I am committed to protecting your privacy and ensuring the security of any information you provide to me when using
my applications. This Privacy Policy outlines my practices regarding the collection, use, and disclosure of
information I may gather from users of my applications.
</p>
<h2>Introduction</h2>
<p>
I am committed to protecting your privacy and ensuring the security of any information you provide to me when
using my applications. This Privacy Policy outlines my practices regarding the collection, use, and disclosure
of information I may gather from users of my applications.
</p>
<h2>Information I Collect</h2>
<p>
I do not collect any personally identifiable information about you when you use my applications. I do not use any
cookies or similar tracking technologies that can identify individual users or track your usage behavior within the
application.
</p>
<p>
However, please note that my applications may make use of third party integrations such as Google Play Services or
others. I am not responsible for the privacy practices or content of these third-party services. I encourage you to
review the privacy policies of those third-party services before providing any personal information.
</p>
<h2>Information I Collect</h2>
<p>
I do not collect any personally identifiable information about you when you use my applications. I do not use any
cookies or similar tracking technologies that can identify individual users or track your usage behavior within
the application.
</p>
<p>
However, please note that my applications may make use of third party integrations such as Google Play Services
or others. I am not responsible for the privacy practices or content of these third-party services. I encourage
you to review the privacy policies of those third-party services before providing any personal information.
</p>
<h2>Use of Information</h2>
<p>Since I do not collect any personal information about you, I do not use it for any purpose.</p>
<h2>Use of Information</h2>
<p>Since I do not collect any personal information about you, I do not use it for any purpose.</p>
<h2>Disclosure of Information</h2>
<p>I do not share any personal information about you because I do not collect any such information.</p>
<p>
However, please be aware that my applications contains links to third-party websites and services. I am not
responsible for the privacy practices or content of these third-party sites. I encourage you to review the privacy
policies of those third-party sites before providing any personal information.
</p>
<h2>Disclosure of Information</h2>
<p>I do not share any personal information about you because I do not collect any such information.</p>
<p>
However, please be aware that my applications contains links to third-party websites and services. I am not
responsible for the privacy practices or content of these third-party sites. I encourage you to review the
privacy policies of those third-party sites before providing any personal information.
</p>
<h2>Security</h2>
<p>
I prioritize the security of your personal information and take reasonable precautions to protect it. However,
please be aware that no method of transmission over the internet or electronic storage is 100% secure, and I cannot
guarantee absolute security.
</p>
<h2>Security</h2>
<p>
I prioritize the security of your personal information and take reasonable precautions to protect it. However,
please be aware that no method of transmission over the internet or electronic storage is 100% secure, and I
cannot guarantee absolute security.
</p>
<h2>Changes to this Privacy Policy</h2>
<p>
I may update this Privacy Policy from time to time to reflect changes in my practices or for other operational,
legal, or regulatory reasons. I encourage you to review this Privacy Policy periodically for any updates. The
revised policy will be effective immediately upon posting.
</p>
<h2>Changes to this Privacy Policy</h2>
<p>
I may update this Privacy Policy from time to time to reflect changes in my practices or for other operational,
legal, or regulatory reasons. I encourage you to review this Privacy Policy periodically for any updates. The
revised policy will be effective immediately upon posting.
</p>
<h2>Contact Me</h2>
<p>
If you have any questions or concerns about this Privacy Policy or my privacy practices, please
<a asp-page="/Contact/Index">get in touch</a>.
</p>
<h2>Contact Me</h2>
<p>
If you have any questions or concerns about this Privacy Policy or my privacy practices, please
<a asp-page="/Contact/Index">get in touch</a>.
</p>
</main>

View File

@ -3,84 +3,86 @@
ViewData["Title"] = "Privacy Policy";
}
<h1 class="display-4">@ViewData["Title"]</h1>
<p class="lead">Last Updated: 26 May 2023</p>
<div class="alert alert-primary">
This Privacy Policy differs from the policy that applies to my applications published to Google Play. For my
applications' privacy policy, please <a asp-page="/Privacy/GooglePlay">click here</a>.
</div>
<main class="container">
<h1 class="display-4">@ViewData["Title"]</h1>
<p class="lead">Last Updated: 26 May 2023</p>
<div class="alert alert-primary">
This Privacy Policy differs from the policy that applies to my applications published to Google Play. For my
applications' privacy policy, please <a asp-page="/Privacy/GooglePlay">click here</a>.
</div>
<p>
This Privacy Policy describes how your personal information is collected, used, and shared when you visit or
interact with my website <a href="https://oliverbooth.dev/">oliverbooth.dev</a>.
</p>
<p>
This Privacy Policy describes how your personal information is collected, used, and shared when you visit or
interact with my website <a href="https://oliverbooth.dev/">oliverbooth.dev</a>.
</p>
<h2>Introduction</h2>
<p>
I am committed to protecting your privacy and ensuring the security of any information you provide to me when using
my website. This Privacy Policy outlines my practices regarding the collection, use, and disclosure of information I
may gather from users of my website.
</p>
<h2>Introduction</h2>
<p>
I am committed to protecting your privacy and ensuring the security of any information you provide to me when
using my website. This Privacy Policy outlines my practices regarding the collection, use, and disclosure of
information I may gather from users of my website.
</p>
<h2>Information I Collect</h2>
<p>
When you choose to contact me via the contact form on my website, I collect your name and email address. This
information is provided voluntarily by you and is necessary for me to respond to your inquiries and engage in a
conversation. I do not collect any additional personally identifiable information about you through the contact
form.
</p>
<p>I do not use any cookies or similar tracking technologies that can identify individual users.</p>
<p>
Please note that my website includes a Disqus integration for commenting on blog posts. Disqus is a third-party
service, and their use of cookies and collection of personal information are governed by their own privacy policies.
I have no control over the information collected by Disqus, and I encourage you to review their privacy policy to
understand how your information may be used by them.
</p>
<h2>Information I Collect</h2>
<p>
When you choose to contact me via the contact form on my website, I collect your name and email address. This
information is provided voluntarily by you and is necessary for me to respond to your inquiries and engage in a
conversation. I do not collect any additional personally identifiable information about you through the contact
form.
</p>
<p>I do not use any cookies or similar tracking technologies that can identify individual users.</p>
<p>
Please note that my website includes a Disqus integration for commenting on blog posts. Disqus is a third-party
service, and their use of cookies and collection of personal information are governed by their own privacy
policies. I have no control over the information collected by Disqus, and I encourage you to review their
privacy policy to understand how your information may be used by them.
</p>
<h2>Use of Information</h2>
<p>
The name and email address you provide through the contact form are used solely for the purpose of responding to
your inquiries and engaging in relevant conversation. I keep this information confidential and do not disclose,
sell, or share it with any third parties unless required by law or with your explicit consent.
</p>
<p>
I do not use your personal information for marketing purposes or send you any unsolicited communications. Once our
conversation is complete and no longer necessary, I will securely delete your personal information unless otherwise
required to retain it by applicable laws or regulations.
</p>
<h2>Use of Information</h2>
<p>
The name and email address you provide through the contact form are used solely for the purpose of responding to
your inquiries and engaging in relevant conversation. I keep this information confidential and do not disclose,
sell, or share it with any third parties unless required by law or with your explicit consent.
</p>
<p>
I do not use your personal information for marketing purposes or send you any unsolicited communications. Once
our conversation is complete and no longer necessary, I will securely delete your personal information unless
otherwise required to retain it by applicable laws or regulations.
</p>
<h2>Disclosure of Information</h2>
<p>
I do not disclose your personal information to any third parties unless required by law or with your explicit
consent. I maintain strict confidentiality and take reasonable precautions to protect your personal information from
unauthorized access, use, or disclosure.
</p>
<p>
However, please be aware that my website contains links to third-party websites and services. I am not responsible
for the privacy practices or content of these third-party sites. I encourage you to review the privacy policies of
those third-party sites before providing any personal information.
</p>
<h2>Disclosure of Information</h2>
<p>
I do not disclose your personal information to any third parties unless required by law or with your explicit
consent. I maintain strict confidentiality and take reasonable precautions to protect your personal information
from unauthorized access, use, or disclosure.
</p>
<p>
However, please be aware that my website contains links to third-party websites and services. I am not
responsible for the privacy practices or content of these third-party sites. I encourage you to review the
privacy policies of those third-party sites before providing any personal information.
</p>
<h2>Security</h2>
<p>
I prioritize the security of your personal information and take reasonable precautions to protect it. However,
please be aware that no method of transmission over the internet or electronic storage is 100% secure, and I cannot
guarantee absolute security.
</p>
<h2>Security</h2>
<p>
I prioritize the security of your personal information and take reasonable precautions to protect it. However,
please be aware that no method of transmission over the internet or electronic storage is 100% secure, and I
cannot guarantee absolute security.
</p>
<h2>Changes to this Privacy Policy</h2>
<p>
I may update this Privacy Policy from time to time to reflect changes in my practices or for other operational,
legal, or regulatory reasons. I encourage you to review this Privacy Policy periodically for any updates. The
revised policy will be effective immediately upon posting.
</p>
<h2>Changes to this Privacy Policy</h2>
<p>
I may update this Privacy Policy from time to time to reflect changes in my practices or for other operational,
legal, or regulatory reasons. I encourage you to review this Privacy Policy periodically for any updates. The
revised policy will be effective immediately upon posting.
</p>
<h2>Contact Me</h2>
<p>
If you have any questions or concerns about this Privacy Policy or my privacy practices, please
<a asp-page="/Contact/Index">get in touch</a>.
</p>
<h2>Contact Me</h2>
<p>
If you have any questions or concerns about this Privacy Policy or my privacy practices, please
<a asp-page="/Contact/Index">get in touch</a>.
</p>
<hr/>
<hr/>
<p>By using my website, you signify your acceptance of this Privacy Policy.</p>
<p>By using my website, you signify your acceptance of this Privacy Policy.</p>
</main>

View File

@ -6,100 +6,102 @@
ViewData["Title"] = "Projects";
}
<h1 class="display-4">Projects</h1>
<main class="container">
<h1 class="display-4">Projects</h1>
@foreach (IProject[] chunk in ProjectService.GetProjects(ProjectStatus.Ongoing).OrderBy(p => p.Rank).Chunk(2))
{
<div class="card-group row" style="margin-top: 20px;">
@foreach (IProject project in chunk)
{
<div class="col-xs-1 col-md-6 col-lg-6 d-flex align-items-stretch">
<div class="card border-success project-card">
<div class="card-header text-bg-success">In Active Development</div>
<img src="https://cdn.olivr.me/projects/hero/@project.HeroUrl" class="card-img-top" alt="@project.Name">
<div class="card-body">
<h5 class="card-title">@project.Name</h5>
<p class="card-text">@Html.Raw(ProjectService.GetDescription(project))</p>
@if (!string.IsNullOrWhiteSpace(project.RemoteUrl))
{
<a href="@project.RemoteUrl" class="btn btn-primary">
@if (string.IsNullOrWhiteSpace(project.RemoteTarget))
{
<span>View website</span>
}
else
{
<span>View on @project.RemoteTarget</span>
}
</a>
}
@foreach (IProject[] chunk in ProjectService.GetProjects(ProjectStatus.Ongoing).OrderBy(p => p.Rank).Chunk(2))
{
<div class="card-group row" style="margin-top: 20px;">
@foreach (IProject project in chunk)
{
<div class="col-xs-1 col-md-6 col-lg-6 d-flex align-items-stretch">
<div class="card border-success project-card">
<div class="card-header text-bg-success">In Active Development</div>
<img src="https://cdn.olivr.me/projects/hero/@project.HeroUrl" class="card-img-top" alt="@project.Name">
<div class="card-body">
<h5 class="card-title">@project.Name</h5>
<p class="card-text">@Html.Raw(ProjectService.GetDescription(project))</p>
@if (!string.IsNullOrWhiteSpace(project.RemoteUrl))
{
<a href="@project.RemoteUrl" class="btn btn-primary">
@if (string.IsNullOrWhiteSpace(project.RemoteTarget))
{
<span>View website</span>
}
else
{
<span>View on @project.RemoteTarget</span>
}
</a>
}
</div>
</div>
</div>
</div>
}
</div>
}
}
</div>
}
@foreach (IProject[] chunk in ProjectService.GetProjects(ProjectStatus.Past).Chunk(2))
{
<div class="card-group row" style="margin-top: 20px;">
@foreach (IProject project in chunk)
{
<div class="col-xs-1 col-md-6 col-lg-6 d-flex align-items-stretch">
<div class="card border-info project-card">
<div class="card-header text-bg-info">Past Work</div>
<img src="https://cdn.olivr.me/projects/hero/@project.HeroUrl" class="card-img-top" alt="@project.Name">
<div class="card-body">
<h5 class="card-title">@project.Name</h5>
<p class="card-text">@Html.Raw(ProjectService.GetDescription(project))</p>
@if (!string.IsNullOrWhiteSpace(project.RemoteUrl))
{
<a href="@project.RemoteUrl" class="btn btn-primary">
@if (string.IsNullOrWhiteSpace(project.RemoteTarget))
{
<span>View website</span>
}
else
{
<span>View on @project.RemoteTarget</span>
}
</a>
}
@foreach (IProject[] chunk in ProjectService.GetProjects(ProjectStatus.Past).Chunk(2))
{
<div class="card-group row" style="margin-top: 20px;">
@foreach (IProject project in chunk)
{
<div class="col-xs-1 col-md-6 col-lg-6 d-flex align-items-stretch">
<div class="card border-info project-card">
<div class="card-header text-bg-info">Past Work</div>
<img src="https://cdn.olivr.me/projects/hero/@project.HeroUrl" class="card-img-top" alt="@project.Name">
<div class="card-body">
<h5 class="card-title">@project.Name</h5>
<p class="card-text">@Html.Raw(ProjectService.GetDescription(project))</p>
@if (!string.IsNullOrWhiteSpace(project.RemoteUrl))
{
<a href="@project.RemoteUrl" class="btn btn-primary">
@if (string.IsNullOrWhiteSpace(project.RemoteTarget))
{
<span>View website</span>
}
else
{
<span>View on @project.RemoteTarget</span>
}
</a>
}
</div>
</div>
</div>
</div>
}
</div>
}
}
</div>
}
@foreach (IProject[] chunk in ProjectService.GetProjects(ProjectStatus.Hiatus).Chunk(2))
{
<div class="card-group row" style="margin-top: 20px;">
@foreach (IProject project in chunk)
{
<div class="col-xs-1 col-md-6 col-lg-6 d-flex align-items-stretch">
<div class="card border-dark project-card">
<div class="card-header text-bg-dark">On Hiatus</div>
<img src="https://cdn.olivr.me/projects/hero/@project.HeroUrl" class="card-img-top" alt="@project.Name">
<div class="card-body">
<h5 class="card-title">@project.Name</h5>
<p class="card-text">@Html.Raw(ProjectService.GetDescription(project))</p>
@if (!string.IsNullOrWhiteSpace(project.RemoteUrl))
{
<a href="@project.RemoteUrl" class="btn btn-primary">
@if (string.IsNullOrWhiteSpace(project.RemoteTarget))
{
<span>View website</span>
}
else
{
<span>View on @project.RemoteTarget</span>
}
</a>
}
@foreach (IProject[] chunk in ProjectService.GetProjects(ProjectStatus.Hiatus).Chunk(2))
{
<div class="card-group row" style="margin-top: 20px;">
@foreach (IProject project in chunk)
{
<div class="col-xs-1 col-md-6 col-lg-6 d-flex align-items-stretch">
<div class="card border-dark project-card">
<div class="card-header text-bg-dark">On Hiatus</div>
<img src="https://cdn.olivr.me/projects/hero/@project.HeroUrl" class="card-img-top" alt="@project.Name">
<div class="card-body">
<h5 class="card-title">@project.Name</h5>
<p class="card-text">@Html.Raw(ProjectService.GetDescription(project))</p>
@if (!string.IsNullOrWhiteSpace(project.RemoteUrl))
{
<a href="@project.RemoteUrl" class="btn btn-primary">
@if (string.IsNullOrWhiteSpace(project.RemoteTarget))
{
<span>View website</span>
}
else
{
<span>View on @project.RemoteTarget</span>
}
</a>
}
</div>
</div>
</div>
</div>
}
</div>
}
}
</div>
}
</main>

View File

@ -3,19 +3,21 @@
ViewData["Title"] = "Tutorials";
}
<h1 class="display-4">Tutorials</h1>
<p class="lead">Coming Soon</p>
<p>
Due to Unity's poor corporate decision-making, I'm left in a position where I find it infeasible to write Unity
tutorials. I plan to write tutorials for things like Unreal and MonoGame as I learn them, and C# tutorials are
still on the table for sure. But tutorials take a lot of time and effort, so unfortunately it may be a while before
I can get around to publishing them.
</p>
<p>
However, in the meantime, I do have various blog posts that contain some tutorials and guides. You can find them
<a asp-page="/Blog/Index">here</a>!
</p>
<p>
I'm sorry for the inconvenience, but I hope you understand my position. Watch this space! New tutorials will be
coming. If you have any questions or requests, please feel free to <a asp-page="/Contact/Index">contact me</a>.
</p>
<main class="container">
<h1 class="display-4">Tutorials</h1>
<p class="lead">Coming Soon</p>
<p>
Due to Unity's poor corporate decision-making, I'm left in a position where I find it infeasible to write Unity
tutorials. I plan to write tutorials for things like Unreal and MonoGame as I learn them, and C# tutorials are
still on the table for sure. But tutorials take a lot of time and effort, so unfortunately it may be a while
before I can get around to publishing them.
</p>
<p>
However, in the meantime, I do have various blog posts that contain some tutorials and guides. You can find them
<a asp-page="/Blog/Index">here</a>!
</p>
<p>
I'm sorry for the inconvenience, but I hope you understand my position. Watch this space! New tutorials will be
coming. If you have any questions or requests, please feel free to <a asp-page="/Contact/Index">contact me</a>.
</p>
</main>

View File

@ -23,6 +23,11 @@ body {
margin-bottom: 60px;
}
main.container {
background: #333;
padding: 20px;
}
a {
&:link, &:visited, &:hover, &:active {
text-decoration: none;