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"; ViewData["Title"] = "Reading List";
} }
<h1 class="display-4">Reading List</h1> <main class="container">
<p> <h1 class="display-4">Reading List</h1>
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, <p>
but I will update this list as I try to remember what it is I've read in the past. 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
</p> 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> This list is also available on <a href="https://www.goodreads.com/review/list/145592619">Goodreads</a>.
</p>
<p class="lead">Currently Reading</p> <p class="lead">Currently Reading</p>
<table class="table reading-list"> <table class="table reading-list">
<thead> <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> <tr>
<td> <th style="width: 50%">Title</th>
<img class="book-cover" src="https://cdn.olivr.me/img/books/@(book.Isbn.Trim()).jpg" alt="Book Cover"> <th style="width: 25%">Author</th>
@book.Title.Trim() <th style="width: 25%">ISBN</th>
</td>
<td>@book.Author.Trim()</td>
<td style="font-family: monospace">@book.Isbn.Trim()<br><img src="@book.GetBarcode()" alt="@book.Isbn"></td>
</tr> </tr>
} </thead>
</tbody>
</table>
<p class="lead">Plan to Read</p> <tbody>
<table class="table reading-list"> @foreach (IBook book in Model.CurrentlyReading.OrderBy(b => b.Author).ThenBy(b => b.Title))
<thead> {
<tr> <tr>
<th style="width: 50%">Title</th> <td>
<th style="width: 25%">Author</th> <img class="book-cover" src="https://cdn.olivr.me/img/books/@(book.Isbn.Trim()).jpg" alt="Book Cover">
<th style="width: 25%">ISBN</th> @book.Title.Trim()
</tr> </td>
</thead> <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> <p class="lead">Plan to Read</p>
@foreach (IBook book in Model.PlanToRead.OrderBy(b => b.Author).ThenBy(b => b.Title)) <table class="table reading-list">
{ <thead>
<tr> <tr>
<td> <th style="width: 50%">Title</th>
<img class="book-cover" src="https://cdn.olivr.me/img/books/@(book.Isbn.Trim()).jpg" alt="Book Cover"> <th style="width: 25%">Author</th>
@book.Title.Trim() <th style="width: 25%">ISBN</th>
</td>
<td>@book.Author.Trim()</td>
<td style="font-family: monospace">@book.Isbn.Trim()<br><img src="@book.GetBarcode()" alt="@book.Isbn"></td>
</tr> </tr>
} </thead>
</tbody>
</table>
<p class="lead">Read</p> <tbody>
<table class="table reading-list"> @foreach (IBook book in Model.PlanToRead.OrderBy(b => b.Author).ThenBy(b => b.Title))
<thead> {
<tr> <tr>
<th style="width: 50%">Title</th> <td>
<th style="width: 25%">Author</th> <img class="book-cover" src="https://cdn.olivr.me/img/books/@(book.Isbn.Trim()).jpg" alt="Book Cover">
<th style="width: 25%">ISBN</th> @book.Title.Trim()
</tr> </td>
</thead> <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> <p class="lead">Read</p>
@foreach (IBook book in Model.Read.OrderBy(b => b.Author).ThenBy(b => b.Title)) <table class="table reading-list">
{ <thead>
<tr> <tr>
<td> <th style="width: 50%">Title</th>
<img class="book-cover" src="https://cdn.olivr.me/img/books/@(book.Isbn.Trim()).jpg" alt="Book Cover"> <th style="width: 25%">Author</th>
@book.Title.Trim() <th style="width: 25%">ISBN</th>
</td>
<td>@book.Author.Trim()</td>
<td style="font-family: monospace">@book.Isbn.Trim()<br><img src="@book.GetBarcode()" alt="@book.Isbn"></td>
</tr> </tr>
} </thead>
</tbody>
</table> <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"; ViewData["Title"] = "Blacklist";
} }
<h1 class="display-4">Contact Blacklist</h1> <main class="container">
<p> <h1 class="display-4">Contact Blacklist</h1>
Below is a list of email addresses that have been blocked from contacting me. This list is public so that others may <p>
also block these addresses if they wish. Any email address that contains an asterisk (*) is a wildcard, meaning that Below is a list of email addresses that have been blocked from contacting me. This list is public so that others
any email address that matches the pattern will be blocked. may also block these addresses if they wish. Any email address that contains an asterisk (*) is a wildcard,
</p> meaning that any email address that matches the pattern will be blocked.
</p>
<p> <p>
You can view this list in JSON format You can view this list in JSON format
<a asp-controller="FormattedBlacklist" asp-action="OnGet" asp-route-format="json">here</a>, <a asp-controller="FormattedBlacklist" asp-action="OnGet" asp-route-format="json">here</a>,
or in CSV format or in CSV format
<a asp-controller="FormattedBlacklist" asp-action="OnGet" asp-route-format="csv">here</a>. <a asp-controller="FormattedBlacklist" asp-action="OnGet" asp-route-format="csv">here</a>.
</p> </p>
<table class="table"> <table class="table">
<tr>
<th>Name / Email</th>
<th>Reason</th>
</tr>
@foreach (IBlacklistEntry entry in ContactService.GetBlacklist())
{
<tr> <tr>
<td>@entry.Name &lt;@entry.EmailAddress&gt;</td> <th>Name / Email</th>
<td>@entry.Reason</td> <th>Reason</th>
</tr> </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"; ViewData["Title"] = "Contact";
} }
<h1 class="display-4">Contact</h1> <main class="container">
<p> <h1 class="display-4">Contact</h1>
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>
<p> <p>
I am politely asking that you respect my inbox and keep your unsolicited advertising away. This is a simple Thanks for getting in touch! While I do my best to read to all inquiries, I cannot guarantee that I will be able
request. If you send me any kind of spam after this, you have demonstrated that you do not have the basic human to respond to your message. Nevertheless, I appreciate you taking the time to reach out to me and I will respond
decency to respect my wishes or my privacy, and you have lost the privilege for me to respect yours. I if I can.
<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> </p>
</div>
<div class="alert alert-info"> <div class="alert alert-warning">
<p class="lead"><i class="fa-solid fa-circle-info"></i> Dear SEO marketing teams</p> <p class="lead"><i class="fa-solid fa-triangle-exclamation"></i> Spam warning</p>
<p> <p>
While I don't necessarily consider receiving legitimate offers for SEO services to be spam, I am not interested I am politely asking that you respect my inbox and keep your unsolicited advertising away. This is a simple
in your services at this time. I understand that you are just doing your job, but hopefully you can do it more request. If you send me any kind of spam after this, you have demonstrated that you do not have the basic
efficiently by going to others who are more receptive to your services. human decency to respect my wishes or my privacy, and you have lost the privilege for me to respect yours. I
</p> <strong>will</strong> block your email address, and I will add your name to my public blacklist of spammers,
<p> which you can find <a asp-page="/Contact/Blacklist">here</a>.
Do not contact me about SEO services. If you do, while I will not publicly blacklist your address, you will - </p>
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> </div>
<div class="form-group" style="margin-top: 10px;"> <div class="alert alert-info">
<label for="email">Your Email Address</label> <p class="lead"><i class="fa-solid fa-circle-info"></i> Dear SEO marketing teams</p>
<input type="email" class="form-control" id="email" name="email" placeholder="How can I reach you?" required> <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>
<div class="form-group" style="margin-top: 10px;"> <form method="post" asp-controller="Contact" asp-action="HandleForm">
<label for="subject">Subject</label> <input type="hidden" name="contact-type" value="other">
<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;"> <div class="form-group" style="margin-top: 10px;">
<label for="message">Message</label> <label for="name">Your Name</label>
<textarea class="form-control" id="message" name="message" rows="5" required placeholder="What's on your mind?"></textarea> <input type="text" class="form-control" id="name" name="name" placeholder="Who are you?" required>
</div> </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> <div class="form-group" style="margin-top: 10px;">
</form> <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"; ViewData["Title"] = "Donate";
} }
<h1 class="display-4">Donate</h1> <main class="container">
<h1 class="display-4">Donate</h1>
<p> <p>
I believe in free and open exchange of information, and I want to keep my educational content free for everyone to I believe in free and open exchange of information, and I want to keep my educational content free for everyone
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 access. I will never put ads on my site, and I don't want to put behind a paywall resources that should be
to everybody, regardless of their financial situation. available to everybody, regardless of their financial situation.
</p> </p>
<p> <p>
However, writing tutorials takes time, and I do have to pay for hosting. While I will never ask you for money, I 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 will always appreciate it if you do decide to donate. It also helps me to know that people are finding my
useful, and that I should continue to make more. content useful, and that I should continue to make more.
</p> </p>
<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 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
the links below. Thank you for your support! using the links below. Thank you for your support!
</p> </p>
<p> <p>
<script type="text/javascript" src="https://storage.ko-fi.com/cdn/widget/Widget_2.js"></script> <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> <script type="text/javascript">kofiwidget2.init('Support Me on Ko-fi', '#29abe0', 'C0C4DVDZX');kofiwidget2.draw();</script>
</p> </p>
<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> <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>
<p>I also accept cryptocurrency donations.</p> <p>I also accept cryptocurrency donations.</p>
<ul> <ul>
<li>BTC: 1LmXvavJr1omscfkXjp7A4VyNf3XhKP9JK</li> <li>BTC: 1LmXvavJr1omscfkXjp7A4VyNf3XhKP9JK</li>
<li>ETH: 0x972C6641e36e2736823A6B1e6BA4D2A814b69fD2</li> <li>ETH: 0x972C6641e36e2736823A6B1e6BA4D2A814b69fD2</li>
</ul> </ul>
</main>

View File

@ -1,30 +1,33 @@
@page @page
<h1 class="display-4">Hi, I'm Oliver.</h1> <main class="container">
<p class="lead">I'm a tech enthusiast, coffee drinker, and software developer.</p> <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"> <p class="text-center">
<img src="~/img/headshot_512x512_2023.jpg" style="width: 512px; max-width: 100%;"> <img src="~/img/headshot_512x512_2023.jpg" style="width: 512px; max-width: 100%;">
</p> </p>
<p> <p>
My primary focus is C#, though I have dabbled in several other languages such as Java, Kotlin, VB, C/C++, Python, My primary focus is C#, though I have dabbled in several other languages such as Java, Kotlin, VB, C/C++,
and others. Over the years I've built up a collection of projects. Some of which I'm extremely proud of, and others Python, and others. Over the years I've built up a collection of projects. Some of which I'm extremely proud of,
I've quietly abandoned and buried. I'm currently working on a few projects that I hope to release in the near and others I've quietly abandoned and buried. I'm currently working on a few projects that I hope to release in
future, but in the meantime, feel free to check out some of my <a asp-page="/Projects/Index">previous work</a>. the near future, but in the meantime, feel free to check out some of my
</p> <a asp-page="/Projects/Index">previous work</a>.
</p>
<p> <p>
I've also written a few <a asp-page="/Tutorials/Index">tutorials</a> on various topics, usually involving 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 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 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>. <a asp-page="/Blog/Index">my thoughts on the state of the world or the tech industry</a>.
</p> </p>
<p> <p>
If you want a general overview of stuff I've made, check out my <a href="https://github.com/oliverbooth">GitHub</a>, If you want a general overview of stuff I've made, check out my
<a href="https://oliverbooth.itch.io">itch.io</a>, and <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>. <a href="https://play.google.com/store/apps/dev?id=9010459220239503006">Google Play</a>.
</p> </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"; ViewData["Title"] = "It's 5 O'Clock Somewhere Privacy Policy";
} }
<h1 class="display-4">@ViewData["Title"]</h1> <main class="container">
<p class="lead">Last Updated: 24 September 2023</p> <h1 class="display-4">@ViewData["Title"]</h1>
<div class="alert alert-primary"> <p class="lead">Last Updated: 24 September 2023</p>
This Privacy Policy differs from the policy that applies to other applications that I published on Google Play. For <div class="alert alert-primary">
the generalised privacy policy, please <a asp-page="/Privacy/GooglePlay">click here</a>. This Privacy Policy differs from the policy that applies to other applications that I published on Google Play. For
</div> the generalised privacy policy, please <a asp-page="/Privacy/GooglePlay">click here</a>.
</div>
<p> <p>
This Privacy Policy describes how your personal information is collected, used, and shared when you use or interact 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"). with the application <em>It's 5 O'Clock Somewhere</em> (the "Application").
</p> </p>
<h2>Introduction</h2> <h2>Introduction</h2>
<p> <p>
I am committed to protecting your privacy and ensuring the security of any information you provide to me when using I am committed to protecting your privacy and ensuring the security of any information you provide to me when
my applications. This Privacy Policy outlines my practices regarding the collection, use, and disclosure of using my applications. This Privacy Policy outlines my practices regarding the collection, use, and disclosure
information I may gather from users of the Application. of information I may gather from users of the Application.
</p> </p>
<h2>Information I Collect</h2> <h2>Information I Collect</h2>
<p> <p>
The Application will temporarily read your device's clock to determine the current time. This information is sent to The Application will temporarily read your device's clock to determine the current time. This information is
the Application's server to determine an accurate and time-zone aware response to you, the user. This information is sent to the Application's server to determine an accurate and time-zone aware response to you, the user. This
not stored or retained on the server. I do not use cookies, tracking technologies, or any other means to collect or information is not stored or retained on the server. I do not use cookies, tracking technologies, or any other
track your usage behavior within the Application. I do not have access to any personal data, including your name, means to collect or track your usage behavior within the Application. I do not have access to any personal data,
email address, or any other personally identifiable information. including your name, email address, or any other personally identifiable information.
</p> </p>
<h2>Use of Information</h2> <h2>Use of Information</h2>
<p> <p>
The Application uses the little information it collects from you to provide the Application's functionality to you. The Application uses the little information it collects from you to provide the Application's functionality to
This information is not used for any other purpose. you. This information is not used for any other purpose.
</p> </p>
<h2>Disclosure of Information</h2> <h2>Disclosure of Information</h2>
<p> <p>
I do not disclose your personal information to any third parties unless required by law or with your explicit 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 consent. I maintain strict confidentiality and take reasonable precautions to protect your personal information
unauthorized access, use, or disclosure. from unauthorized access, use, or disclosure.
</p> </p>
<h2>Security</h2> <h2>Security</h2>
<p> <p>
I prioritize the security of your personal information and take reasonable precautions to protect it. However, 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 please be aware that no method of transmission over the internet or electronic storage is 100% secure, and I
guarantee absolute security. cannot guarantee absolute security.
</p> </p>
<h2>Changes to this Privacy Policy</h2> <h2>Changes to this Privacy Policy</h2>
<p> <p>
I may update this Privacy Policy from time to time to reflect changes in my practices or for other operational, 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 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. revised policy will be effective immediately upon posting.
</p> </p>
<h2>Contact Me</h2> <h2>Contact Me</h2>
<p> <p>
If you have any questions or concerns about this Privacy Policy or my privacy practices, please 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>. <a asp-page="/Contact/Index">get in touch</a>.
</p> </p>
</main>

View File

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

View File

@ -3,84 +3,86 @@
ViewData["Title"] = "Privacy Policy"; ViewData["Title"] = "Privacy Policy";
} }
<h1 class="display-4">@ViewData["Title"]</h1> <main class="container">
<p class="lead">Last Updated: 26 May 2023</p> <h1 class="display-4">@ViewData["Title"]</h1>
<div class="alert alert-primary"> <p class="lead">Last Updated: 26 May 2023</p>
This Privacy Policy differs from the policy that applies to my applications published to Google Play. For my <div class="alert alert-primary">
applications' privacy policy, please <a asp-page="/Privacy/GooglePlay">click here</a>. This Privacy Policy differs from the policy that applies to my applications published to Google Play. For my
</div> applications' privacy policy, please <a asp-page="/Privacy/GooglePlay">click here</a>.
</div>
<p> <p>
This Privacy Policy describes how your personal information is collected, used, and shared when you visit or 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>. interact with my website <a href="https://oliverbooth.dev/">oliverbooth.dev</a>.
</p> </p>
<h2>Introduction</h2> <h2>Introduction</h2>
<p> <p>
I am committed to protecting your privacy and ensuring the security of any information you provide to me when using I am committed to protecting your privacy and ensuring the security of any information you provide to me when
my website. This Privacy Policy outlines my practices regarding the collection, use, and disclosure of information I using my website. This Privacy Policy outlines my practices regarding the collection, use, and disclosure of
may gather from users of my website. information I may gather from users of my website.
</p> </p>
<h2>Information I Collect</h2> <h2>Information I Collect</h2>
<p> <p>
When you choose to contact me via the contact form on my website, I collect your name and email address. This 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 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 conversation. I do not collect any additional personally identifiable information about you through the contact
form. form.
</p> </p>
<p>I do not use any cookies or similar tracking technologies that can identify individual users.</p> <p>I do not use any cookies or similar tracking technologies that can identify individual users.</p>
<p> <p>
Please note that my website includes a Disqus integration for commenting on blog posts. Disqus is a third-party 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. service, and their use of cookies and collection of personal information are governed by their own privacy
I have no control over the information collected by Disqus, and I encourage you to review their privacy policy to policies. I have no control over the information collected by Disqus, and I encourage you to review their
understand how your information may be used by them. privacy policy to understand how your information may be used by them.
</p> </p>
<h2>Use of Information</h2> <h2>Use of Information</h2>
<p> <p>
The name and email address you provide through the contact form are used solely for the purpose of responding to 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, 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. sell, or share it with any third parties unless required by law or with your explicit consent.
</p> </p>
<p> <p>
I do not use your personal information for marketing purposes or send you any unsolicited communications. Once our I do not use your personal information for marketing purposes or send you any unsolicited communications. Once
conversation is complete and no longer necessary, I will securely delete your personal information unless otherwise our conversation is complete and no longer necessary, I will securely delete your personal information unless
required to retain it by applicable laws or regulations. otherwise required to retain it by applicable laws or regulations.
</p> </p>
<h2>Disclosure of Information</h2> <h2>Disclosure of Information</h2>
<p> <p>
I do not disclose your personal information to any third parties unless required by law or with your explicit 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 consent. I maintain strict confidentiality and take reasonable precautions to protect your personal information
unauthorized access, use, or disclosure. from unauthorized access, use, or disclosure.
</p> </p>
<p> <p>
However, please be aware that my website contains links to third-party websites and services. I am not responsible However, please be aware that my website contains links to third-party websites and services. I am not
for the privacy practices or content of these third-party sites. I encourage you to review the privacy policies of responsible for the privacy practices or content of these third-party sites. I encourage you to review the
those third-party sites before providing any personal information. privacy policies of those third-party sites before providing any personal information.
</p> </p>
<h2>Security</h2> <h2>Security</h2>
<p> <p>
I prioritize the security of your personal information and take reasonable precautions to protect it. However, 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 please be aware that no method of transmission over the internet or electronic storage is 100% secure, and I
guarantee absolute security. cannot guarantee absolute security.
</p> </p>
<h2>Changes to this Privacy Policy</h2> <h2>Changes to this Privacy Policy</h2>
<p> <p>
I may update this Privacy Policy from time to time to reflect changes in my practices or for other operational, 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 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. revised policy will be effective immediately upon posting.
</p> </p>
<h2>Contact Me</h2> <h2>Contact Me</h2>
<p> <p>
If you have any questions or concerns about this Privacy Policy or my privacy practices, please 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>. <a asp-page="/Contact/Index">get in touch</a>.
</p> </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"; 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)) @foreach (IProject[] chunk in ProjectService.GetProjects(ProjectStatus.Ongoing).OrderBy(p => p.Rank).Chunk(2))
{ {
<div class="card-group row" style="margin-top: 20px;"> <div class="card-group row" style="margin-top: 20px;">
@foreach (IProject project in chunk) @foreach (IProject project in chunk)
{ {
<div class="col-xs-1 col-md-6 col-lg-6 d-flex align-items-stretch"> <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 border-success project-card">
<div class="card-header text-bg-success">In Active Development</div> <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"> <img src="https://cdn.olivr.me/projects/hero/@project.HeroUrl" class="card-img-top" alt="@project.Name">
<div class="card-body"> <div class="card-body">
<h5 class="card-title">@project.Name</h5> <h5 class="card-title">@project.Name</h5>
<p class="card-text">@Html.Raw(ProjectService.GetDescription(project))</p> <p class="card-text">@Html.Raw(ProjectService.GetDescription(project))</p>
@if (!string.IsNullOrWhiteSpace(project.RemoteUrl)) @if (!string.IsNullOrWhiteSpace(project.RemoteUrl))
{ {
<a href="@project.RemoteUrl" class="btn btn-primary"> <a href="@project.RemoteUrl" class="btn btn-primary">
@if (string.IsNullOrWhiteSpace(project.RemoteTarget)) @if (string.IsNullOrWhiteSpace(project.RemoteTarget))
{ {
<span>View website</span> <span>View website</span>
} }
else else
{ {
<span>View on @project.RemoteTarget</span> <span>View on @project.RemoteTarget</span>
} }
</a> </a>
} }
</div>
</div> </div>
</div> </div>
</div> }
} </div>
</div> }
}
@foreach (IProject[] chunk in ProjectService.GetProjects(ProjectStatus.Past).Chunk(2)) @foreach (IProject[] chunk in ProjectService.GetProjects(ProjectStatus.Past).Chunk(2))
{ {
<div class="card-group row" style="margin-top: 20px;"> <div class="card-group row" style="margin-top: 20px;">
@foreach (IProject project in chunk) @foreach (IProject project in chunk)
{ {
<div class="col-xs-1 col-md-6 col-lg-6 d-flex align-items-stretch"> <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 border-info project-card">
<div class="card-header text-bg-info">Past Work</div> <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"> <img src="https://cdn.olivr.me/projects/hero/@project.HeroUrl" class="card-img-top" alt="@project.Name">
<div class="card-body"> <div class="card-body">
<h5 class="card-title">@project.Name</h5> <h5 class="card-title">@project.Name</h5>
<p class="card-text">@Html.Raw(ProjectService.GetDescription(project))</p> <p class="card-text">@Html.Raw(ProjectService.GetDescription(project))</p>
@if (!string.IsNullOrWhiteSpace(project.RemoteUrl)) @if (!string.IsNullOrWhiteSpace(project.RemoteUrl))
{ {
<a href="@project.RemoteUrl" class="btn btn-primary"> <a href="@project.RemoteUrl" class="btn btn-primary">
@if (string.IsNullOrWhiteSpace(project.RemoteTarget)) @if (string.IsNullOrWhiteSpace(project.RemoteTarget))
{ {
<span>View website</span> <span>View website</span>
} }
else else
{ {
<span>View on @project.RemoteTarget</span> <span>View on @project.RemoteTarget</span>
} }
</a> </a>
} }
</div>
</div> </div>
</div> </div>
</div> }
} </div>
</div> }
}
@foreach (IProject[] chunk in ProjectService.GetProjects(ProjectStatus.Hiatus).Chunk(2)) @foreach (IProject[] chunk in ProjectService.GetProjects(ProjectStatus.Hiatus).Chunk(2))
{ {
<div class="card-group row" style="margin-top: 20px;"> <div class="card-group row" style="margin-top: 20px;">
@foreach (IProject project in chunk) @foreach (IProject project in chunk)
{ {
<div class="col-xs-1 col-md-6 col-lg-6 d-flex align-items-stretch"> <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 border-dark project-card">
<div class="card-header text-bg-dark">On Hiatus</div> <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"> <img src="https://cdn.olivr.me/projects/hero/@project.HeroUrl" class="card-img-top" alt="@project.Name">
<div class="card-body"> <div class="card-body">
<h5 class="card-title">@project.Name</h5> <h5 class="card-title">@project.Name</h5>
<p class="card-text">@Html.Raw(ProjectService.GetDescription(project))</p> <p class="card-text">@Html.Raw(ProjectService.GetDescription(project))</p>
@if (!string.IsNullOrWhiteSpace(project.RemoteUrl)) @if (!string.IsNullOrWhiteSpace(project.RemoteUrl))
{ {
<a href="@project.RemoteUrl" class="btn btn-primary"> <a href="@project.RemoteUrl" class="btn btn-primary">
@if (string.IsNullOrWhiteSpace(project.RemoteTarget)) @if (string.IsNullOrWhiteSpace(project.RemoteTarget))
{ {
<span>View website</span> <span>View website</span>
} }
else else
{ {
<span>View on @project.RemoteTarget</span> <span>View on @project.RemoteTarget</span>
} }
</a> </a>
} }
</div>
</div> </div>
</div> </div>
</div> }
} </div>
</div> }
} </main>

View File

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