myWebLog theme (#16)

* Add myWebLog theme

* Remove Nuxt version

* Remove Azure link from README
This commit is contained in:
Daniel J. Summers 2022-06-22 22:14:38 -04:00 committed by GitHub
parent dcf28915f7
commit 0aaf06b050
No known key found for this signature in database
GPG Key ID: 4AEE18F83AFDEB23
80 changed files with 716 additions and 15195 deletions

View File

@ -1,5 +1,3 @@
# Bit Badger Solutions
[![Build status](https://danieljsummers.visualstudio.com/Bit%20Badger%20Solutions/_apis/build/status/Bit%20Badger%20Solutions-CI)](https://danieljsummers.visualstudio.com/Bit%20Badger%20Solutions/_build/latest?definitionId=2)
This is the source repository for the [Bit Badger Solutions](https://bitbadger.solutions) website
This repository contains the [myWebLog](https://bitbadger.solutions/open-source/myweblog/) theme for the [Bit Badger Solutions](https://bitbadger.solutions) website

View File

@ -1,13 +0,0 @@
# editorconfig.org
root = true
[*]
indent_style = space
indent_size = 2
end_of_line = lf
charset = utf-8
trim_trailing_whitespace = true
insert_final_newline = true
[*.md]
trim_trailing_whitespace = false

View File

@ -1,15 +0,0 @@
module.exports = {
root: true,
env: {
browser: true,
node: true
},
extends: [
'@nuxtjs/eslint-config-typescript',
'plugin:nuxt/recommended'
],
plugins: [
],
// add your custom rules here
rules: {}
}

View File

@ -1,90 +0,0 @@
# Created by .ignore support plugin (hsz.mobi)
### Node template
# Logs
/logs
*.log
npm-debug.log*
yarn-debug.log*
yarn-error.log*
# Runtime data
pids
*.pid
*.seed
*.pid.lock
# Directory for instrumented libs generated by jscoverage/JSCover
lib-cov
# 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 (https://nodejs.org/api/addons.html)
build/Release
# Dependency directories
node_modules/
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
# parcel-bundler cache (https://parceljs.org/)
.cache
# next.js build output
.next
# nuxt.js build output
.nuxt
# Nuxt generate
dist
# vuepress build output
.vuepress/dist
# Serverless directories
.serverless
# IDE / Editor
.idea
# Service worker
sw.*
# macOS
.DS_Store
# Vim swap files
*.swp

View File

@ -1,20 +0,0 @@
# bit-badger-solutions
## Build Setup
```bash
# install dependencies
$ npm install
# serve with hot reload at localhost:3000
$ npm run dev
# build for production and launch server
$ npm run build
$ npm run start
# generate static project
$ npm run generate
```
For detailed explanation on how things work, check out [Nuxt.js docs](https://nuxtjs.org).

View File

@ -1,29 +0,0 @@
<template>
<svg class="NuxtLogo" width="245" height="180" viewBox="0 0 452 342" xmlns="http://www.w3.org/2000/svg">
<path
d="M139 330l-1-2c-2-4-2-8-1-13H29L189 31l67 121 22-16-67-121c-1-2-9-14-22-14-6 0-15 2-22 15L5 303c-1 3-8 16-2 27 4 6 10 12 24 12h136c-14 0-21-6-24-12z"
fill="#00C58E"
/>
<path
d="M447 304L317 70c-2-2-9-15-22-15-6 0-15 3-22 15l-17 28v54l39-67 129 230h-49a23 23 0 0 1-2 14l-1 1c-6 11-21 12-23 12h76c3 0 17-1 24-12 3-5 5-14-2-26z"
fill="#108775"
/>
<path
d="M376 330v-1l1-2c1-4 2-8 1-12l-4-12-102-178-15-27h-1l-15 27-102 178-4 12a24 24 0 0 0 2 15c4 6 10 12 24 12h190c3 0 18-1 25-12zM256 152l93 163H163l93-163z"
fill="#2F495E"
/>
</svg>
</template>
<style>
.NuxtLogo {
animation: 1s appear;
margin: auto;
}
@keyframes appear {
0% {
opacity: 0;
}
}
</style>

View File

@ -1,19 +0,0 @@
<template>
<footer>
A <strong><nuxt-link to="/">Bit Badger Solutions</nuxt-link></strong> original design
</footer>
</template>
<style scoped>
footer {
padding: 20px 15px 10px 15px;
text-align: right;
font-size: 1rem;
color: black;
clear: both;
background-image: linear-gradient(to bottom, #FFFAFA, lightgray);
}
footer a:link, footer a:visited {
color: black;
}
</style>

View File

@ -1,70 +0,0 @@
<template>
<header class="site-header">
<div class="header-logo">
<nuxt-link to="/">
<img
src="/bitbadger.png"
alt="A cartoon badger looking at a computer screen, with his paw on a mouse"
title="Bit Badger Solutions">
</nuxt-link>
</div>
<div class="header-title">
<nuxt-link to="/">Bit Badger Solutions</nuxt-link>
</div>
<div class="header-spacer">
&nbsp;
</div>
<div class="header-social">
<a href="https://twitter.com/Bit_Badger" title="Bit_Badger on Twitter" target="_blank">
<img src="/twitter.png" alt="Twitter">
</a>&nbsp; &nbsp;<a href="https://www.facebook.com/bitbadger.solutions" title="Bit Badger Solutions on Facebook" _target="_blank">
<img src="/facebook.png" alt="Facebook">
</a>
</div>
</header>
</template>
<style scoped>
.site-header {
height: 100px;
display: flex;
flex-direction: row;
justify-content: space-between;
background-image: linear-gradient(to bottom, lightgray, #FFFAFA);
}
.site-header a, .site-header a:visited {
color: black;
}
.site-header a:hover {
border-bottom: none;
}
.header-title {
font-size: 3rem;
font-weight: bold;
line-height: 100px;
text-align: center;
}
.header-spacer {
flex-grow: 3;
}
.header-social {
padding: 25px .8rem 0 0;
}
.header-social img {
width: 50px;
height: 50px;
}
@media all and (max-width:40rem) {
.site-header {
height: auto;
flex-direction: column;
align-items: center;
}
.header-title {
line-height: 3rem;
}
.header-spacer {
display: none;
}
}
</style>

View File

@ -1,41 +0,0 @@
<template>
<section>
<h3 @click="toggle()">
{{ heading }}<span class="arrow" v-html="label"></span>
</h3>
<slot v-if="isVisible"></slot>
</section>
</template>
<script lang="ts">
import Vue from 'vue'
export default Vue.extend({
name: 'hidden-section',
props: [
'heading'
],
data () {
return {
isVisible: false,
label: '&#x25BC;'
}
},
methods: {
toggle () {
this.isVisible = !this.isVisible
this.label = this.isVisible ? '&#x25B2;' : '&#x25BC;'
}
}
})
</script>
<style scoped>
h3:hover {
cursor: hand;
cursor: pointer;
}
.arrow {
font-size: .75rem;
padding-left: 1rem;
}
</style>

View File

@ -1,108 +0,0 @@
<template>
<aside class="app-sidebar">
<div v-for="cat in sortedCats" :key="cat">
<div class="app-sidebar-head" v-text="cat" />
<div v-for="sln in displayForCategegory(cat)" :key="sln.title">
<p class="app-sidebar-name">
<strong>{{ sln.title }}</strong><br>
<span v-if="!sln.noAboutLink">
<nuxt-link :to="`/solutions/${sln.slug}`" :title="aboutTitle(sln.title)">About</nuxt-link> &bull;
</span>
<a :href="sln.url" :title="sln.title" target="_blank">Visit</a>
</p>
<p class="app-sidebar-description" v-html="sln.frontPage.text" />
</div>
</div>
</aside>
</template>
<script lang="ts">
import Vue from 'vue'
/**
* Sort the categories in a specific order; any not addressed will appear at the bottom.
*/
const categoryOrder = (x: string, y: string) => {
if (x === 'Web Sites and Applications') { return -1 }
if (x === 'WordPress' && y !== 'Web Sites and Applications') { return -1 }
if (x === 'Static Sites' && y !== 'Web Sites and Applications' && y !== 'WordPress') { return -1 }
return 1
}
export default Vue.extend({
name: 'home-sidebar',
props: ['catNames', 'solutions'],
computed: {
sortedCats (): string[] {
return [...this.catNames].sort(categoryOrder)
}
},
methods: {
displayForCategegory (category: string): any[] {
return this.solutions
.filter((x: any) => x.category === category)
.sort((x: any, y: any) => x.frontPage.order - y.frontPage.order)
},
aboutTitle (name: string): string {
return `About ${name} | Bit Badger Solutions`
}
}
})
</script>
<style scoped>
.app-sidebar {
text-align: center;
border-top: dotted 1px lightgray;
padding-top: 1rem;
font-size: .9rem;
display: flex;
flex-flow: row wrap;
justify-content: space-around;
}
.app-sidebar > div {
width: 20rem;
padding-bottom: 1rem;
}
@media all and (min-width: 68rem) {
.app-sidebar {
width: 66rem;
margin: auto;
}
}
@media all and (min-width: 80rem) {
.app-sidebar {
width: 12rem;
border-top: none;
border-left: dotted 1px lightgray;
padding-top: 0;
padding-left: 2rem;
flex-direction: column;
}
.app-sidebar > div {
width: auto;
}
}
.app-sidebar a {
font-size: 10pt;
font-family: sans-serif;
}
.app-sidebar-head {
font-family: "Oswald", "Segoe UI", Ubuntu, "DejaVu Sans", "Liberation Sans", Arial, sans-serif;
font-weight: bold;
color: maroon;
margin-bottom: .8rem;
padding: 3px 12px;
border-bottom: solid 2px lightgray;
font-size: 1rem;
}
.app-sidebar-name, .app-sidebar-description {
margin: 0;
padding: 0;
}
.app-sidebar-description {
font-style: italic;
color: #555555;
padding-bottom: .6rem;
}
</style>

View File

@ -1,29 +0,0 @@
<template>
<p>
<span class="app-name" v-html="solution.title"></span>
~ <nuxt-link :to="'/solutions/' + solution.slug">About</nuxt-link>
<span v-if="!solution.isInactive">~ <a :href="solution.url" target="_blank">Visit</a></span>
<span v-if="solution.isInactive && solution.archiveUrl">
~&nbsp;<a :href="solution.archiveUrl" target="_blank">Visit</a><em> (archive)</em>
</span>
<br>
<span v-html="solution.summary"></span>
</p>
</template>
<script lang="ts">
import Vue from 'vue'
export default Vue.extend({
name: 'solution-item',
props: ['solution']
})
</script>
<style scoped>
.app-name {
font-family: "Oswald", "Segoe UI", Ubuntu, "DejaVu Sans", "Liberation Sans", Arial, sans-serif;
font-size: 1.3rem;
font-weight: bold;
color: maroon;
}
</style>

View File

@ -1,58 +0,0 @@
<template>
<li>
<a v-if="hasLink(tech[0])" :href="techLinks[tech[0]]" target="_blank">{{ tech[0] }}</a>
<template v-else>{{ tech[0] }}</template>
for {{ tech[1] }}
</li>
</template>
<script lang="ts">
import Vue from 'vue'
/** Links to various technologies */
const techLinks: any = {
'ASP.NET MVC': 'https://dotnet.microsoft.com/apps/aspnet/mvc',
Azure: 'https://azure.microsoft.com/',
'BlogEngine.NET': 'http://www.dotnetblogengine.net/',
'Database Abstraction': 'https://github.com/danieljsummers/DatabaseAbstraction',
'Digital Ocean': 'https://www.digitalocean.com/',
Giraffe: 'https://github.com/giraffe-fsharp/Giraffe',
GitHub: 'https://github.com/',
'GitHub Pages': 'https://pages.github.com/',
Hexo: 'https://hexo.io/',
Hugo: 'https://gohugo.io/',
Jekyll: 'https://jekyllrb.com/',
MongoDB: 'https://www.mongodb.com/',
MySQL: 'https://www.mysql.com/',
myWebLog: 'https://github.com/bit-badger/myWebLog',
nginx: 'http://nginx.org/',
Orchard: 'https://orchardproject.net/',
PHP: 'https://www.php.net/',
PostgreSQL: 'https://www.postgresql.org/',
'Rackspace Cloud': 'https://www.rackspace.com/cloud',
RavenDB: 'https://ravendb.net/',
RethinkDB: 'https://rethinkdb.com/',
'SQL Server': 'https://www.microsoft.com/en-us/sql-server/',
'Vue.js': 'https://vuejs.org/',
WordPress: 'https://wordpress.org'
}
export default Vue.extend({
name: 'technology-item',
props: [ 'tech' ],
data () {
return { techLinks }
},
methods: {
/**
* Does the given technology have a known link?
*
* @param tech The technology to be checked
* @returns True if there is a link, false if not
*/
hasLink (tech: string): boolean {
return techLinks[tech] !== undefined
}
}
})
</script>

View File

@ -1,21 +0,0 @@
---
title: Information Publicizing and Blogging
---
In the early days of the World Wide Web, it was known as the &ldquo;information superhighway.&rdquo; From its inception, the web&rsquo;s primary goal is information. The open nature of the Internet allows anyone, anywhere to say anything, provided they can connect a machine to the network. In fact, there are software products to handle everything except creating the content; all you have to bring is the ability to form a coherent thought, and type that thought into a box. [WordPress](https://wordpress.org "WordPress") is one of the most popular <abbr title="Web Log">blog</abbr>ging platforms in use today; it allows authors to concentrate on the content of their websites, rather than forcing authors to turn into programmers.
## Custom-Built Sites
- We developed and maintained the site for [Emerald Mountain Christian School](http://www.emeraldmountainchristianschool.org)<small> (<nuxt-link to="/solutions/emerald-mountain-christian-school" title="Emerald Mountain Christian School &bull; Bit Badger Solutions">about</nuxt-link>)</small> for 9 years, where they had information about the type of curriculum they teach, the school&rsquo;s 40+-year history, a calendar of events, and how to get more information.
- We built and maintained the site for [Photography by Michelle](https://www.summershome.org)<small> (<nuxt-link to="/solutions/photography-by-michelle" title="Photography by Michelle &bull; Bit Badger Solutions">about</nuxt-link>)</small>, which had information, prices, and samples of the photographer&rsquo;s work, as well as the ability for customers to view proofs and make photo selections online.
- The site for [Bay Vista Baptist Church](https://bayvista.org "Bay Vista Baptist Church")<small> (<nuxt-link to="/solutions/bay-vista" title="Bay Vista Baptist Church &bull; Bit Badger Solutions">about</nuxt-link>)</small> utilizes a &ldquo;static site generator,&rdquo; where the entire site is generated from source files, then served. It requires no back-end database, which means that the server can send pages as fast as its clients can take them. This site even has a generated podcast feed! Adding content to these types of sites requires a bit more technical knowledge beyond &ldquo;typing text in a box,&rdquo; but it is a great way to build ultra-fast, scalable web sites.
- This site is also a statically-generated site, utilizing the [Nuxt](https://nuxtjs.org) project for the [Vue.js](https://vuejs.org) JavaScript framework. Using Nuxt&rsquo;s content plugin, the majority of pages are written in Markdown (a very writing-friendly format). We can include data at the top of each file that controls how it is displayed; this gives us both the flexibility of a database and the speed of not actually having one! (It&rsquo;s [open source](https://github.com/bit-badger/bitbadger.solutions) if you want to see how we did it.)
## WordPress Design, Customization, and Support
- For [Futility Closet](https://www.futilitycloset.com "Futility Closet")<small> (<nuxt-link to="/solutions/futility-closet" title="Futility Closet &bull; Bit Badger Solutions">about</nuxt-link>)</small>, we moved their site from a shared hosting platform to its own <abbr title="Virtual Private Server">VPS</abbr>, securing it from intrusion attempts and enabling it to handle its ever-increasing traffic.
- We took over [Mindy Mackenzie](https://mindymackenzie.com "Mindy Mackenzie")<small> (<nuxt-link to="/solutions/mindy-mackenzie" title="Mindy Mackenzie &bull; Bit Badger Solutions">about</nuxt-link>)</small> in advance of the release of her eventual _<abbr title="Wall Street Journal">WSJ</abbr>_ best-selling book _The Courage Solution_, and continue to support her as she hosts the annual _You First Integrative Leadership Summit_.
- We helped <nuxt-link to="/solutions/cassy-fiano" title="Cassy Fiano &bull; Bit Badger Solutions">Cassy Fiano</nuxt-link> and <nuxt-link to="/solutions/dr-melissa-clouthier" title="Dr. Melissa Clouthier &bull; Bit Badger Solutions">Dr. Melissa Clouthier</nuxt-link> both move their blogs from Blogspot to their own domains.
- We migrated <nuxt-link to="/solutions/liberty-pundits" title="Liberty Pundits &bull; Bit Badger Solutions">Liberty Pundits</nuxt-link> from a custom blog platform to WordPress, and set up and maintained their server, which routinely cleared 100,000 hits per day in its prime.
- <nuxt-link to="/solutions/tcms" title="The Clearinghouse Management System (TCMS) &bull; Bit Badger Solutions">TCMS</nuxt-link> and <nuxt-link to="/solutions/nsx" title="NSXapp &bull; Bit Badger Solutions">NSXapp</nuxt-link> both used WordPress as their front end, which also provided a public web presence that the customers could update themselves.
On _[The Bit Badger Blog](https://blog.bitbadger.solutions "The Bit Badger Blog")_ you can browse the [WordPress](https://blog.bitbadger.solutions/category/wordpress "WordPress &bull; The Bit Badger Blog") category for information on plug-ins, and we have supported theme customizations for nearly all of the WordPress sites linked on the sidebar/footer of the home page.

View File

@ -1,4 +0,0 @@
---
title: Legacy Data Solutions
---
Our background in mainframe applications gives us a knowledgeable perspective on retrieving information from older, &ldquo;legacy&rdquo; systems. This data can be migrated to a more modern relational or document database, where a web application can retrieve the information; in some cases, the data can even be exposed as a web service in place. These types of systems are often a great way for companies to expose their data to their customers, without having to move their day-to-day system from its current environment. While we currently have no active projects along these lines, we have done them in the past for other organizations; sadly, none can be linked publicly.

View File

@ -1,10 +0,0 @@
---
title: Process Automation and User Engagement
---
Computers can be used to augment or automate nearly any process; could you think of generating bank statements, processing mailing lists, or tracking orders without some form of automation? We develop web-based solutions to automate _your_ processes, ensuring that your business constraints are satisfied; these systems can run on the Internet or your private network. For Internet-facing solutions, we engineer solutions that allow them to interact with you securely, presented in an engaging manner. And, by &ldquo;engagement,&rdquo; we are not describing intrusive page pop-ups and other <span class="strike">marketing gimmicks</span> web annoyances; we determine an optimal user experience for _your_ customers, and tailor the solution to work for both of you.
Several of our solutions fit this description.
- <nuxt-link to="/solutions/virtual-prayer-room" title="Virtual Prayer Room &bull; Bit Badger Solutions">Virtual Prayer Room</nuxt-link> helped the prayer ministry of [Hoffmantown Church](https://www.hoffmantownchurch.org "Hoffmantown Church &bull; Albuquerque, New Mexico") enable their prayer warriors to have access to requests wherever they are, even in their inbox once a day!
- <nuxt-link to="/solutions/tcms" title="The Clearinghouse Management System (TCMS) &bull; Bit Badger Solutions">TCMS</nuxt-link> was an application that helped organizations such as [Love INC of South Albuquerque](http://www.loveincabq.org) connect people with needs to people who can help fulfill those needs. TCMS sprung from the [Not So Extreme Makeover: Community Edition](https://nsx.archive.bitbadger.solutions "Not So Extreme Makeover: Community Edition (Archive)") in Albuquerque, New Mexico during spring break 2008; we not only developed the public presence, but a private system called <nuxt-link to="/solutions/nsx" title="NSXapp &bull; Bit Badger Solutions">NSXapp</nuxt-link> that enabled the management of the volunteers, families, and things for this massive effort.
- We continue to offer [PrayerTracker](https://prayer.bitbadger.solutions "PrayerTracker")<small> (<nuxt-link to="/solutions/prayer-tracker" title="PrayerTracker &bull; Bit Badger Solutions">about</nuxt-link>)</small>, a free-to-use web application that helps Sunday School classes (or other small groups) generate a prayer request list; it provides a central place for list management and continuity.

View File

@ -1,10 +0,0 @@
---
title: Web Services Solutions
---
A web service is a way of using the Internet to provide or accept information that makes sense to computers; this allows other sites or applications to consume information from, or provide information to, your service. This enables communication between applications, without having to establish any communication channels other than the ones that web browsers already use. It isn&rsquo;t the best fit for every application, but when it is useful, it is _very_ useful.
An <abbr title="Application Programming Interface">API</abbr> can be a synonym for a web service, but it can also be a generally accessible way of providing data. For example, Twitter has a public API, which other applications can use to display tweets on their site.
- [myPrayerJournal](https://prayerjournal.me)<small> (<nuxt-link to="/solutions/my-prayer-journal" title="myPrayerJournal &bull; Bit Badger Solutions">about</nuxt-link>)</small> is a <abbr title="Single Page Application">SPA</abbr> which only downloads the structure of the site the first time you go there, then utilizes a stateless API to access data from the browser.
- <nuxt-link to="/solutions/photography-by-michelle" title="Photography by Michelle &bull; Bit Badger Solutions">Photography by Michelle</nuxt-link> had a private web API that a desktop application utilized to create the online proof sets right from the computer where the images resided.
- We [wrote a service](https://blog.bitbadger.solutions/2010/4040-web-service.html "40/40 Web Service &bull; The Bit Badger Blog") for the 2010 [40/40 Prayer Vigil](http://erlc.com/4040/ "40/40 Prayer Vigil &bull; Ethics and Religious Liberty Commission of the Southern Baptist Convention"), which was utilized by several sites to display the current day&rsquo;s (or hour&rsquo;s) prayer focus, and [wrote one for 2012](https://blog.bitbadger.solutions/2012/4040-web-service-for-2012.html "40/40 Web Service for 2012 &bull; The Bit Badger Blog") as well. _(As the ERLC does not host these any more, this service is no longer active.)_

View File

@ -1,8 +0,0 @@
---
title: Why &ldquo;Bit Badger&rdquo;?
---
A while back, our primary developer Daniel learned through genetic testing that he had one gene that was not right (technically known as a genetic mutation). He is currently fine _(thank you for asking)_, but his co-workers thought of another group of genetic mutants &ndash; the X-Men. They wanted to develop the mutant identity for him in that style; since Wolverine is already taken, they wanted something similar, but based on a member of the weasel family (for its normal private life and fierce tenacity, not its morals). They went through several different options, but when &ldquo;Bit Badger&rdquo; was mentioned, it was the winner. The Bit Badger's mutant superpower is the ability to shoot 1s and 0s out its nostrils!
Daniel liked this moniker, and decided to run with it. He had been growing dissatisfied with the name &ldquo;DJS Consulting,&rdquo; as he felt that name was passive. He enjoys taking problems and finding creative solutions for them, making our computers work for us instead of the other way around. While he can't actually breathe out 1s and 0s, they do flow from his fingers (in groups of 8, of course).
Do you have a problem that needs a solution? [Sic the Bit Badger on it](mailto:daniel@bitbadger.solutions)!

View File

@ -1,45 +0,0 @@
<p class="home-lead">Bit Badger Solutions develops the site you need to enable your success!</p>
These solutions can take several different forms.
## Process Automation and User Engagement
Do you have a process that requires recording the same thing multiple times? Do you have information in different places, but you need it all together? This solution is for you. [Learn more about how our solutions automate processes and engage users][automation].
## Information Publicizing and Blogging
From its inception, the Web has been about information. Do you need to get information out about an upcoming event? Are you wanting to start blogging, or breathe some fresh life into an existing blog? Those are but a few of the problems that this solution solves. [Find out more about our information publicizing and blogging solutions][information] (including WordPress and statically-generated sites).
## Web Services and APIs
Do you have a need for multiple computers to talk to each other? Do you have an interesting data set that you want to make available to the public? A web service or API may be just the solution for you. [Learn about web services, along with examples of current solutions][services].
## Legacy Data Sharing
Do you have data that's old &mdash; and by &ldquo;old,&rdquo; we aren&rsquo;t talking &ldquo;iPhone 6&rdquo; old, we&rsquo;re talking &ldquo;this data [could run for President][old]&rdquo; old? Just because the information is in an older &ldquo;legacy&rdquo; system doesn&rsquo;t mean it has to stay there. [Learn how our solutions can help get this data where you and your customers can access it more easily][legacy].
## Why Web-Based?
Web-based solutions have many advantages:
- They can be used just on a local, private network (an intranet) or on the public Internet.
- They are available to any device connected to the network.
- They require no special software; every device has a browser - which you're using to read this!)
- They can get your most critical needs met first, then evolved and improved over time.
## What Is a &ldquo;Bit Badger&rdquo;?
[Read the Bit Badger&rsquo;s origin story][origin].
## Solutions to Your Problems
We&rsquo;d be happy to discuss your information technology needs, and which of our solutions are right for you. Just [e-mail us](mailto:daniel@bitbadger.solutions) and let us know what we can do for you! You can also [browse a complete list of our current and previous solutions][solutions].
[automation]: /about/process-automation-solutions "Process Automation Solutions"
[information]: /about/information-publicizing-solutions "Information Publicizing Solutions"
[services]: /about/web-services-solutions "Web Services and API Solutions"
[old]: https://en.wikipedia.org/wiki/Age_of_candidacy#United_States "Age of Candidacy (United States) | Wikipedia"
[legacy]: /about/legacy-data "Legacy Data Sharing Solutions"
[origin]: /about/why-bit-badger "Why Bit Badger?"
[solutions]: /solutions "All Solutions"

View File

@ -1,10 +0,0 @@
---
title: A Word from the Word
url: https://devotions.summershome.org
category: Personal
noAboutLink: true
frontPage:
display: true
order: 2
text: Devotions by Daniel
---

View File

@ -1,49 +0,0 @@
---
title: Bay Vista Baptist Church
url: https://bayvista.org
summary: Southern Baptist church in Biloxi, Mississippi
category: Static Sites
frontPage:
display: true
order: 1
text: Biloxi, Mississippi
technologies:
- Hugo:
for: static site generation
isCurrent: true
- Azure:
for: podcast file storage, automated builds, and static site hosting
isCurrent: true
- GitHub:
for: source code control
isCurrent: true
- Hexo:
for: static site generation
- Jekyll:
for: static site generation
- WordPress:
for: content management
- MySQL:
for: data storage
---
### The Client
Bay Vista Baptist Church has served the spiritual needs of Mississippi&rsquo;s Gulf Coast for decades. They emphasize serving their community as well; they were a hub for <abbr title="Federal Emergency Management Agency">FEMA</abbr> during Hurricane Katrina relief and recovery efforts, and they are a relay point for each year&rsquo;s [Operation Christmas Child](https://www.samaritanspurse.org/what-we-do/operation-christmas-child/) campaign.
### The Problem
In late 2013, the authors of their current website were no longer around, and no one could get to the site to update it.
### The Solution
We developed and continue to maintain a fast, static website that can be updated by multiple trained church members. The site also has a repository for their sermons dating back to January 2014, and a podcast feed that gives their ministry a global reach.
<hidden-section heading="The Process">
Initially, we set up a WordPress-based site, where multiple people could have the ability to maintain the site. We manually downloaded all the publically-accessible parts of their old site, and used that content to form the basis for the new side, updating outdated information along the way. We maintained the same look-and-feel, but soon moved to a more mobile-friendly layout.
In 2016, we determined that we were the only ones updating the site, so we transformed the site to use a static site generator; this resulted in fast page loads, with automation providing scheduled updates. We also wrote a custom template for the podcast feed, which is also generated as a static file.
In 2019, we [open sourced](https://github.com/bayvistabc/www.bayvista.org) the site&rsquo;s source code. We also set up Azure Pipelines to automatically build and deploy the site both on demand and on a schedule. Finally, we trained other church members on updating the site&rsquo;s contents and the podcast feed. Although we continue to host the site, the church is now maintaining it themselves.
</hidden-section>

View File

@ -1,42 +0,0 @@
---
title: Cassy Fiano
url: http://www.cassyfiano.com
summary: A &ldquo;rising star&rdquo; conservative blogger
category: WordPress
isInactive: true
noLink: true
frontPage:
display: false
technologies:
- WordPress:
for: blogging (with a custom theme)
- MySQL:
for: data storage
- Rackspace Cloud:
for: backup and recovery
- Azure:
for: backup and recovery
---
### The Client
Cassy Fiano (now Cassy Chesser) began blogging back in 2007 on Blogger. She worked hard to network with other bloggers, wrote prolifically, and gained a large audience with her coverage of life issues and of Sarah Palin as the first female Republican vice-presidential nominee.
### The Problem
With her success, Cassy was quickly outgrowing Blogger. She was interested in moving to a different platform; specifically, Movable Type, as she had some authoring experience with that platform.
### The Solution
We migrated her content to a WordPress site, and customized a theme to look very similar to her Blogger theme (which she liked). We maintained the site, and began hosting it a few years later.
### The Epilogue
Cassy formally decommissioned this site in early 2014.
<hidden-section heading="The Process">
Initially, we assisted her with finding a theme, and customized it. We also modified her old Blogger template to send redirect users to her new blog after displaying a note that the blog had moved. A few years later, we developed an advertising banner to generate income from her writing.
In July 2012, we began hosting the site, as we were already hosting her military wife blog <nuxt-link to="/solutions/hard-corps-wife" title="Hard Corps Wife &bull; Bit Badger Solutions">Hard Corps Wife</nuxt-link>. When the time came to decommission the site, we backed up the data and ensured she had it.
</hidden-section>

View File

@ -1,10 +0,0 @@
---
title: Daniel J. Summers
url: https://daniel.summershome.org
category: Personal
noAboutLink: true
frontPage:
display: true
order: 1
text: Daniel&rsquo;s personal blog
---

View File

@ -1,42 +0,0 @@
---
title: Dr. Melissa Clouthier
url: http://melissablogs.com
summary: Politics, health, podcasts and more
category: WordPress
isInactive: true
noLink: true
frontPage:
display: false
technologies:
- WordPress:
for: blogging (with a custom theme)
- MySQL:
for: data storage
- Rackspace Cloud:
for: backup and recovery
- Azure:
for: backup and recovery
---
### The Client
Dr. Melissa Clouthier (now Mackenzie) blogged from the political right; she also covered health issues and social media techniques and utilization.
### The Problem
She had seen our work with <nuxt-link to="/solutions/cassy-fiano" title="Cassy Fiano &bull; Bit Badger Solutions">Cassy</nuxt-link>&rsquo;s site, also wanted to move off Blogger; however, she did not want to lose her years of posts up to that point.
### The Solution
We created a custom theme for her site, imported the content into a WordPress site, and created a specialized front-page template. She obtained hosting elsewhere; Bit Badger Solutions maintained it there.
<small>_(NOTE: The thumbnail of the site represents a new skin on the original theme; while the theme is the same, Bit Badger Solutions did not create the graphics.)_</small>
### The Epilogue
Melissa decommissioned this site in 2018; we took final snapshots of the data before shutting it down.
<hidden-section heading="The Process">
Initially, we created the theme based off another well-known blogger&rsquo;s site, which had been developed by one of WordPress&rsquo;s core contributors. We also advised on the type of hosting she would need for her site, and moved several domains there. We also took care of regular backups of her data.
</hidden-section>

View File

@ -1,43 +0,0 @@
---
title: Emerald Mountain Christian School
url: http://www.emeraldmountainchristianschool.org
summary: Classical, Christ-centered education near Wetumpka, Alabama
category: Web Sites and Applications
isInactive: true
frontPage:
display: false
technologies:
- PHP:
for: page generation and interactivity
- ASP.NET MVC:
for: page generation and interactivity
- PostgreSQL:
for: data storage
- Rackspace Cloud:
for: hosting
- Azure:
for: hosting
---
### The Client
Emerald Mountain Christian School is a private Christian school founded over 50 years ago. They use the Principle Approach&reg;, which emphasizes research, reasoning, relating, and recording to help students synthesize the information they learn, rather than just requiring rote memorization. More information about the school&rsquo;s rich history can be found on their site.
### The Problem
They had a website with very basic information and very little styling; they also had no way of updating it.
### The Solution
In 2004, we developed a theme that brought it in line with the design of their printed materials, adding the school calendar of events and the entirety of their Parent Information Packet, giving prospective families the information the needed to determine if the school was a good fit for their students.
### The Epilogue
In 2013, we passed off the content and hosting of the site to a new maintainer. They have since redesigned it; it is accessible via the URL above, and at [EMCSpatriots.org](http://emcspatriots.org "EMCS Patriots").
<hidden-section heading="The Process">
Initially, we downloaded the content from their old site, and put it into a custom PHP-based framework. We then added a database of events, and a calendar page that read that database, enabling us to display multiple years, as well as future and past years. The design of the online information packet looked like a tabbed notebook, with each page highlighting a different tab.
In 2011, we switched the site to use ASP.NET MVC instead of the custom PHP solution, and migrated the data from MySQL to PostgreSQL; these efforts increased the performance of the site.
</app-hide-section>

View File

@ -1,53 +0,0 @@
---
title: Futility Closet
url: https://www.futilitycloset.com
summary: An idler&rsquo;s miscellany of compendious amusements
category: WordPress
frontPage:
display: true
order: 1
text: An idler&rsquo;s miscellany of compendious amusements
technologies:
- WordPress:
for: blogging
isCurrent: true
- nginx:
for: the web server
isCurrent: true
- MySQL:
for: data storage
isCurrent: true
- Digital Ocean:
for: web site hosting
isCurrent: true
- Azure:
for: backup and recovery
isCurrent: true
- Rackspace Cloud:
for: web site hosting
---
### The Client
Futility Closet exists as a place to give people a break from the dullness of work, by providing puzzles, anecdotes, and more. They also publish a weekly podcast highlighting &ldquo;forgotten stories from the pages of history,&rdquo; along with story updates and lateral thinking puzzles.
### The Problem
The site was running on a shared host, but was growing too large for that platform. The site had also suffered regular security breaches.
### The Solution
We architected an environment that would support a Reddit or Slashdot deluge of requests, and moved the site to an implementation of that environment. We continue to maintain that environment and back up data and files for the over 10,000 posts.
### The Business Impact
> <p class="quote">Bit Badger Solutions has been an absolute godsend for Futility Closet. We have been with them since 2010, initially setting up and maintaining the site on a Rackspace VPS, and then hosting it completely. Daniel&rsquo;s never failed in being friendly, knowledgeable, thoughtful, and farsighted. I&rsquo;ve literally lost count of the number of times he&rsquo;s saved us from one emergency or another, always with diligence and good humor, or recommended an improvement or a protection that saved us later. We would be out of business many times over if it weren&rsquo;t for his reliability, expertise, and good judgment. And he&rsquo;s a joy to work with.</p>
>
> <p class="source"> &mdash; <strong>Greg Ross</strong>, Futility Closet</p>
<hidden-section heading="The Process">
In mid-2010, we obtained a backup of the previous site, and looked through it to ensure that none of the breaches had made any permanent changes to the site&rsquo;s structure and data. We also locked down the new server (hosted on Rackspace Cloud) to only required protocols, training the client on SSH so that they could have access. We also stood up nginx as the front-end server, boosting performance significantly while requiring a much smaller server.
In 2015, we began hosting Futility Closet (using Digital Ocean).
</app-hide-section>

View File

@ -1,32 +0,0 @@
---
title: Hard Corps Wife
url: http://www.hardcorpswife.com
summary: Cassy&rsquo;s life as a Marine wife
category: WordPress
isInactive: true
noLink: true
frontPage:
display: false
technologies:
- WordPress:
for: blogging
- MySQL:
for: data storage
- Rackspace Cloud:
for: web site hosting
---
### The Client
Our existing client <nuxt-link to="/solutions/cassy-fiano" title="Cassy Fiano &bull; Bit Badger Solutions">Cassy Fiano</nuxt-link>
### The Problem
Cassy (now Chesser) wanted a separate place from which to chronicle her experience as a military spouse.
### The Solution
In mid-2010, we set up her domain name, created a WordPress site, and customized the header and sidebar for her selected theme. We also hosted and maintained the site for the duration of its run.
### The Epilogue
In 2013, Cassy shifted priorities and closed this site down.

View File

@ -1,40 +0,0 @@
---
title: Liberty Pundits
url: http://libertypundits.net
summary: The home for conservatives
category: WordPress
isInactive: true
noLink: true
frontPage:
display: false
technologies:
- WordPress:
for: blogging
- PHP:
for: custom data migration software
- MySQL:
for: data storage
---
### The Client
<nuxt-link to="/solutions/dr-melissa-clouthier" title="Dr. Melissa Clouthier &bull; Bit Badger Solutions">Melissa Clouthier</nuxt-link>, Bill Dupray, and Clyde Middleton, all established conservative bloggers, started a joint venture called _Liberty Pundits_.
### The Problem
Bill and Clyde had a significant amount of content on a prior site. As they were starting this with established authors, they needed a site that would handle their expected traffic spikes on popular posts.
### The Solution
In early 2010, we migrated their content from a custom solution into WordPress&rsquo;s database; we then set them up on the same host where their podcast was being distributed. However, the combination of theme complexity and traffic overwhelmed that server, so we configured a standalone server with more memory and more efficient software; this allowed them to routinely eclipse 100,000 views per day, most of those coming on posts within the first few hours.
### The Epilogue
The site closed in late 2011, as its authors closed their joint venture and moved on to other sites and topics.
<hidden-section heading="The Process">
Before we could migrate the data from _Patriot Room_, Bill and Clyde&rsquo;s prior home, we had to get into the server and determine how data was stored in the custom solution. Once we identified where all the data was, we wrote a custom migration script to shape the data the way WordPress needed it.
Bit Badger Solutions maintained the server, keeping it current with performance and security upgrades. We also provided support to the primary 3 bloggers, when they had questions about WordPress or how the site was performing.
</hidden-section>

View File

@ -1,10 +0,0 @@
---
title: Linux Resources
url: https://blog.bitbadger.solutions/linux/
category: Web Sites and Applications
noAboutLink: true
frontPage:
display: true
order: 3
text: Handy information for Linux folks
---

View File

@ -1,53 +0,0 @@
---
title: Mindy Mackenzie
url: https://mindymackenzie.com
summary: <em>Wall Street Journal</em> best-selling author and C-suite advisor
category: WordPress
frontPage:
display: true
order: 2
text: WSJ-best-selling author of The Courage Solution
technologies:
- WordPress:
for: blogging and content management
isCurrent: true
- nginx:
for: the web server
isCurrent: true
- MySQL:
for: data storage
isCurrent: true
- Digital Ocean:
for: web site hosting
isCurrent: true
- Azure:
for: backup and recovery
isCurrent: true
---
### The Client
Mindy Mackenzie, the prior Chief Performance Officer of Beam, Inc., is known as the &ldquo;Velvet Hammer&rdquo; for her tough-yet-caring style of leadership. She is a _Wall Street Journal_ best-selling author of the book _The Courage Solution: The Power of Truth-Telling with Your Boss, Peers, and Team_, and the creator and host of the annual _You First Integrative Leadership Summit_, equipping women of influence to reach even greater heights.
### The Problem
Mindy was dissatisfied with the value she was receiving with her current web designer and host; in advance of her book launch, she needed a more responsive site that could easily be updated.
### The Solution
We took over hosting her site, updating it regularly for the book launch, and highlighting her media appearances in conjunction with that launch. We also created and continue to maintain the pages for her _You First Integrative Leadership Summit_, including online registration.
### The Business Impact
> <p class="quote">Daniel is the best partner you could hope for in a web designer and for handling web maintenance! He is smart, creative, resourceful and fast. Daniel is able to produce high quality work on short time frames and with minimal creative direction and hit the mark over and over. The best part, is Daniel is a joy to work with. He is smart, customer-centric and trustworthy. If he says he will get it done, he does. After having a poor experience with another firm, I can highly recommend Daniel for all your website design and support needs he&rsquo;s terrific!</p>
>
> <p class="source"> &mdash; <strong>Mindy Mackenzie</strong></p>
<hidden-section heading="The Process">
In late 2015, We assumed maintenance of her site several months in advance of the book launch. We created a custom WordPress type to highlight her Media Appearances, automatically ordered from most recent to older. She had a lot of short video content, and we implemented code that displays a different video each week on the front page.
In early 2018, we developed the pages for her _You First Integrative Leadership Summit_, with speaker bios, conference schedule, and an application form. We have continued to maintain these pages across the 2019 and 2020 summits.
We continue to provide backups, WordPress support, and content updates for Mindy&rsquo;s site.
</app-hide-section>

View File

@ -1,43 +0,0 @@
---
title: myPrayerJournal
url: https://prayerjournal.me
summary: Minimalist personal prayer journal
category: Web Sites and Applications
frontPage:
display: true
order: 2
text: Minimalist personal prayer journal
technologies:
- Vue.js:
for: the front-end
isCurrent: true
- Giraffe:
for: the back-end data API
isCurrent: true
- RavenDB:
for: data storage
isCurrent: true
- GitHub:
for: source code control
isCurrent: true
- GitHub Pages:
for: documentation
isCurrent: true
- PostgreSQL:
for: data storage
---
### The Problem
Daniel wanted to maintain a prayer journal, where he could record the prayer requests for which he had prayed, and the answer that eventually came to that request. He didn&rsquo;t want to do that on paper for several reasons &ndash; it's easy to lose, a long-running request can run out of space to make notes, etc.
### The Solution
We created a site where users can enter requests, pray through lists of these requests, make notes on them, and follow them through until they are answered. The site stores no identifying information, and works well on both desktop and mobile. Bit Badger Solutions hosts and maintains the instance of the site linked above.
<hidden-section heading="The Process">
Development of myPrayerJournal began in earnest in early 2017. As we were using this to learn new techniques, we ended up trying a host of different front and back end technologies before settling on Vue.js for the front end and Giraffe for the back end. This combination works well, and we wrote up an 8-post series entitled ["A Tour of myPrayerJournal"](https://blog.bitbadger.solutions/2018/a-tour-of-myprayerjournal/introduction.html "A Tour of myPrayerJournal: Introduction | The Bit Badger Blog") over on the _Bit Badger Blog_ that steps through all aspects of version 1 of this application.
Version 2 changed to a Material Design interface, and we changed the data store from PostgreSQL to RavenDB, an excellent document database. As this is an open-source project, anyone can review the source code on [GitHub](https://github.com/bit-badger/myPrayerJournal); we also track open issues there.
</app-hide-section>

View File

@ -1,36 +0,0 @@
---
title: "Not So Extreme Makeover: Community Edition"
url: http://notsoextreme.org
summary: Public site for the makeover; provides event-driven management of volunteers, donations, and families needing help
category: Web Sites and Applications
isInactive: true
noLink: true
linkToArchive: true
archiveUrl: https://nsx.archive.bitbadger.solutions
frontPage:
display: false
technologies:
- WordPress:
for: content management
- PHP:
for: NSXapp
- MySQL:
for: WordPress data storage
- PostgreSQL:
for: NSXapp data storage
---
### The Client
In January 2008, a few members of [Hoffmantown Church](https://www.hoffmantownchurch.org "Hoffmantown Church &bull; Albuquerque, New Mexico") in Albuquerque, New Mexico had an idea. The ABC show _[Extreme Makeover: Home Edition](http://abc.go.com/shows/extreme-makeover-home-edition)_ had just done [a build for a pastor in the &ldquo;war zone&rdquo; area of town](http://abc.go.com/shows/extreme-makeover-home-edition/episode-detail/martinez-family/224884 "Martinez Family &bull; Extreme Makeover: Home Edition"), and this brought attention to Gerald Martinez and the work he had done to help clean up this area of town. Through [Love INC of South Albuquerque](http://www.loveincabq.org/ "Love INC of South Albuquerque"), they learned that there were many other homes in that area that could use the &ldquo;Ty Pennington touch.&rdquo; While the goal was not to knock down homes and build new ones, the goal was no less extreme. The goal of the &ldquo;Not So Extreme Makeover: Community Edition&rdquo; was to help 50 families in 5 days during spring break week in 2008.
### The Problem
An effort of this magnitude, happening this quickly, would be unmanageable without software support. It would also require a lot of paperwork, and a lot of people processing that paperwork.
### The Solution
We obtained the domain name and stood up the public website quickly using WordPress, which also allowed the coordinators to put content up. We then developed an application (NSXapp) where volunteers could sign up for &ldquo;X Week&rdquo;, with over 80 different skill, talent, and ability categories. We then created a way to identify families and their needs, and a place for people with donations to let us know what they would be. From there, we created the ability to begin matching needs with goods (stuff) and abilities (people), organizing the stuff into donated trailers and people into teams. During X Week, NSXapp generated schedules and reports that were used to help guide the teams as they executed their projects.
### The Epilogue
From an idea in January, &ldquo;Not So Extreme Makeover: Community Edition&rdquo; was able to help 57 families by the end of X Week on March 29th. When Love INC saw how NSXapp worked, they expressed an interest in a version that would allow them to handle these same areas on an ongoing basis; this became <nuxt-link to="/solutions/tcms" title="The Clearinghouse Management System (TCMS) &bull; Bit Badger Solutions">TCMS</nuxt-link>. Finally, there is a [snapshot of the NSX public site](https://nsx.archive.bitbadger.solutions) that serves as a record of those three months in 2008.

View File

@ -1,46 +0,0 @@
---
title: Olivet Baptist Church
url: https://olivet-baptist.org
summary: Southern Baptist church in Gulfport, Mississippi
category: Static Sites
isInactive: true
noLink: true
linkToArchive: true
archiveUrl: https://olivet.archive.bitbadger.solutions
frontPage:
display: false
technologies:
- Vue.js:
for: the user interface for the PWA
- Hexo:
for: generating the site's pages
- Azure:
for: podcast file storage and archive site hosting
- WordPress:
for: content management
- MySQL:
for: data storage
---
### The Client
Olivet Baptist Church was a Southern Baptist church in Gulfport, Mississippi, who had seen our work with <nuxt-link to="/solutions/bay-vista" title="Bay Vista Baptist Church &bull; Bit Badger Solutions">Bay Vista</nuxt-link> and wanted something similar.
### The Problem
Olivet had no online presence.
### The Solution
Initially, we set up a WordPress site, configured it, and established a podcast feed; we also advised them on how to register that feed in iTunes. A few years later, we converted the site to behave like an app, where it could be installed as an icon, allowing quick access.
### The Epilogue
When the church closed its doors on February 24th, 2019, we converted the app-behaving site back to a static web site, set up an archive site, and worked with their personnel to ensure that the podcast links are all still available. We continue to host that archive site and podcast content.
<hidden-section heading="The Process">
In 2014, we registered the domain name for the church. They had expressed a desire to do as much of the content of the site themselves, so we supported them as they worked through its initial setup. After the site was originally set up, though, updates were rare (apart from the weekly podcast episodes), so we converted it to be a statically-generated site.
In 2018, we modified the site to be a Progressive Web Application (PWA), which allows users to &ldquo;install&rdquo; the site, like an app, to their phone&rsquo;s home screen. The site was also still accessible from the web via a browser. We converted the static content to generate page fragments that the PWA would load, providing the same navigation experience as before.
</hidden-section>

View File

@ -1,35 +0,0 @@
---
title: Photography by Michelle
url: https://www.summershome.org
summary: Photography services in Albuquerque, New Mexico
category: Web Sites and Applications
isInactive: true
frontPage:
display: false
technologies:
- ASP.NET MVC:
for: content management / gallery creation API
- PostgreSQL:
for: data storage
- C# / Windows Forms:
for: desktop gallery application
- WordPress:
for: content management
- MySQL:
for: data storage
---
### The Client
Michelle Summers had been photographing her children for years. When her sons were on sports teams, she was disappointed with the cost of team photography, and felt that she could do a better job at a lower cost. She specialized in outdoor photography of families, children, and sports teams, as well as maternity photography and holiday cards.
### The Problem
Michelle needed a site to showcase her previous work, as well as a place to allow her customers to view their proofs before selecting prints.
### The Solution
We created a WordPress site with image galleries for her existing work, and utilized a custom plug-in to support online proofs. This site was eventually replaced with one that had a matching Windows application; this application took a set of photos, resized them, applied a watermark, and created the proof gallery without having to even go to the site.
### The Epilogue
As Michelle is no longer doing professional photography, the current version of this site is a simple thank-you to her customers from 2007-2014.

View File

@ -1,50 +0,0 @@
---
title: PrayerTracker
url: https://prayer.bitbadger.solutions
summary: Provides an ongoing, centralized prayer list for Sunday School classes and other groups
category: Web Sites and Applications
frontPage:
display: true
order: 1
text: A prayer request tracking website (Free for any church or Sunday School class!)
technologies:
- Giraffe:
for: server-side logic and dynamic page generation
isCurrent: true
- PostgreSQL:
for: data storage
isCurrent: true
- GitHub:
for: source code control
isCurrent: true
- GitHub Pages:
for: documentation hosting
isCurrent: true
- MongoDB:
for: data storage
- ASP.NET MVC:
for: dynamic content generation
- Database Abstraction:
for: data access
- MySQL:
for: data storage
- PHP:
for: dynamic content generation
---
### The Problem
Back in 2005, Daniel was responsible for keeping up with prayer requests for his Sunday School class. However, simply sending out a mass e-mail has some significant drawbacks - everyone&rsquo;s e-mail address is visible to everyone else; mass e-mails are more likely to be flagged as suspicious; and it is difficult to have a single &ldquo;latest and greatest&rdquo; list of members.
### The Solution
We wrote a site so we could enter prayer requests and class members; this site would then send individual e-mails to each member. When requests were 15 days old, they would drop off the list. From there, PrayerTracker has grown to support multiple churches and groups within those churches, and the user interface is available in both English _y Español_. Bit Badger Solutions offers use of this site for free to any church, Sunday School class, or small group that desires a tool to help them establish a continuous list of prayer requests.
<hidden-section heading="The Process">
The first reimagining of PrayerTracker occurred in 2011; this was when we moved to a more modern (at the time) framework (ASP MVC 3), building in the multi-church/multi-group security additions, and posturing it for an interface with <nuxt-link to="/solutions/virtual-prayer-room" title="Virtual Prayer Room &bull; Bit Badger Solutions">Virtual Prayer Room</nuxt-link>. A year later, a visiting missionary saw the site and liked it, but needed the site (including the online help) in Spanish; we released version 4 a few months later which brought this support.
In late 2014, version 5 moved to a MongoDB data store, as we had some problems with columns not being large enough for some requests. In early 2017, we released version 6, which took PrayerTracker into the .NET Core environment; we also moved the data back to PostgreSQL, as it now supported the sizes we needed.
Version 7 was released in mid-2018, bringing full mobile accessibility and an upgrade to a modern, ultra-fast web framework (Giraffe). In early 2019, version 7.1 was the first release for PrayerTracker as an [open source project](https://github.com/bit-badger/PrayerTracker). Right on its heels, version 7.2 moved the embedded help files to GitHub Pages; this made the web application more streamlined.
</hidden-section>

View File

@ -1,30 +0,0 @@
---
title: Riehl World News
url: http://riehlworldview.com
summary: Riehl news for real people
category: WordPress
frontPage:
display: true
order: 3
text: Riehl news for real people
technologies:
- WordPress:
for: blogging
isCurrent: true
- MySQL:
for: data storage
isCurrent: true
- F#:
for: custom archive static page generation
---
### The Client
Dan Riehl began blogging as _The Carnivorous Conservative_ back in 2004, specializing in the areas of crime and politics. He changed to _Riehl World View_ a short time later, and writes both news and opinion pieces. He was a prolific blogger, publishing over 15 posts a day on most days.
### The Problem
He wanted to take his blog in a different direction, and was having trouble getting his Movable Type blog to move with him.
### The Solution
We stood up a WordPress site on a server he procured. We then assisted him in selecting a theme and customized it to his liking. Finally, we wrote custom migration code to get his past body of work into the new site. In 2018, we generated static files for most of his prior posts, to give him a clean slate for a new direction. We continue to maintain and support _Riehl World News_.

View File

@ -1,34 +0,0 @@
---
title: The Clearinghouse Management System
url: http://tcms.us
summary: Assists a needs clearinghouse in connecting people with needs to people that can help meet those needs
category: Web Sites and Applications
isInactive: true
noLink: true
frontPage:
display: false
technologies:
- PHP:
for: the TCMS application logic
- WordPress:
for: publicly-facing pages and authentication
- PostgreSQL:
for: application data storage
- MySQL:
for: WordPress data storage
---
### The Client
Love INC of South Albuquerque runs a &ldquo;needs clearinghouse&rdquo;; they have volunteers who accept donations, and people contact them with their needs. They are then able to match the person who needs something with that thing, or with someone who can assist them.
### The Problem
The files in their offices were multiplying; ensuring people&rsquo;s needs are not missed, while ensuring that their clients were not taking advantage of their services, required a lot of paper. They were tracking volunteers on a spreadsheet, but their contact info was in yet another file. Having worked with us on the <nuxt-link to="/solutions/nsx" title="Not So Extreme Makeover: Community Edition &bull; Bit Badger Solutions">&ldquo;Not So Extreme Makeover: Community Edition&rdquo;</nuxt-link>, and thought that the solution we developed for that project would help them.
### The Solution
We adapted NSXapp to handle an ongoing stream of people, volunteers, and donations. This enabled them to spend more time with the people who needed help. The WordPress front end also served as their public website, and allowed them to manage the volunteers who were using the system.
### The Epilogue
Love INC of South Albuquerque found a SalesForce system that would do things very similar to TCMS, and was able to get in on a program that let them use it at no cost; TCMS was decommissioned in 2014.

View File

@ -1,55 +0,0 @@
---
title: The Bit Badger Blog
url: https://blog.bitbadger.solutions
summary: Geek stuff from Bit Badger Solutions
category: Static Sites
frontPage:
display: true
order: 3
text: Technical information (&ldquo;geek stuff&rdquo;) from Bit Badger Solutions
technologies:
- Hexo:
for: static site generation
isCurrent: true
- Azure:
for: static site hosting
isCurrent: true
- GitHub:
for: source code control
isCurrent: true
- Custom software:
for: content management
- WordPress:
for: content management
- BlogEngine.NET:
for: content management
- Orchard:
for: content management
- myWebLog:
for: content management
- Jekyll:
for: static site generation
- MySQL:
for: data storage
- SQL Server:
for: data storage
- RethinkDB:
for: data storage
---
### The Problem
Daniel needed a place to journal his learning journey with the Linux operating system, and thought that allowing others read this journal would help them learn as well.
### The Solution
_The Bit Badger Blog_ contains that journal, plus tech tips and information for many different aspects of technology. It is written, maintained, and hosted by Bit Badger Solutions.
<hidden-section heading="The Process">
The initial posts were titled &ldquo;My Linux Adventure,&rdquo; and existed as static files that were edited to add each post. Daniel then wrote a rudimentary system that stored the posts in a database, which meant that the entire site did not need manual changes &ndash; what a breakthrough! :)
Over time, the _Bit Badger Blog_ (and the _DJS Consulting Tech Blog_ before it) has served as a place to support _(now inactive)_ WordPress plug-ins, and go in depth on servers, databases, programming languages, and open-source software. It has also served as a useful live website for learning and experimentation with different content management systems and blogging tools. It has existed in at least 8 different tools, with links preserved as systems change.
It is currently a statically-generated site, utilizing [Hexo](https://hexo.io), and its code is [open source](https://github.com/bit-badger/blog.bitbadger.solutions). New posts are infrequent, but the information it has is good. It may have more behind-the-scenes posts about future open-source efforts. Stay tuned!
</hidden-section>

View File

@ -1,28 +0,0 @@
---
title: The Shark Tank
url: http://shark-tank.net
summary: Floridas political feeding frenzy
category: WordPress
isInactive: true
noLink: true
frontPage:
display: false
technologies:
- WordPress:
for: blogging
---
### The Client
_The Shark Tank_ is a news and opinion site centered on south Florida politics (and the state at large). They provided extensive coverage of Rep. Allen West&rsquo;s winning campaign in 2010, and continue their focused news and opinion on current political races.
### The Problem
They were displeased with their current theme; it was struggling with the amount of content they were producing.
### The Solution
They had identified a theme that would better suit their needs. We set it up, ensuring that their content would fit in the new theme&rsquo;s requirements, and helped them turn off parts that they didn&rsquo;t need. We also converted the social media connections from their old site to a style that would work nicely in the new theme.
### The Epilogue
This was all they needed; they returned their focus to their writing.

View File

@ -1,30 +0,0 @@
---
title: Virtual Prayer Room
url: https://virtualprayerroom.us
summary: Gives prayer warriors access to requests from wherever they may be, and sends them daily updates
category: Web Sites and Applications
isInactive: true
noLink: true
frontPage:
display: false
technologies:
- PHP:
for: the application logic
- PostgreSQL:
for: data storage
---
### The Client
Our existing client [Hoffmantown Church](http://hoffmantown.org "Hoffmantown Church &bull; Albuquerque, New Mexico") in Albuquerque, New Mexico, with whom we had worked on the <nuxt-link to="/solutions/nsx/" title="Not So Extreme Makeover: Community Edition &bull; Bit Badger Solutions">Not So Extreme Makeover: Community Edition</nuxt-link>
### The Problem
Hoffmantown had seen the use of this physical prayer room dwindling over the years. People had become less willing to drive to the church, especially at night, and security became an issue as well; either prayer warriors had to know how to disable the security system, or the church would have to remain unlocked.
### The Solution
The development of Virtual Prayer Room extended the prayer room to anywhere a prayer warrior can get an Internet connection! Prayer warriors could enlist right from the site, and had to be approved. Requests and updates were tracked by date/time, and warriors could record when they&rsquo;ve prayed for a request from the site, or from clicking a link in the daily e-mail they received with requests from their interest areas. As many prayer needs are confidential, security and confidentiality were very important. Virtual Prayer Room ensured these by providing varying security levels for prayer warriors and the ability to mark each request as confidential.
### The Epilogue
In 2016, Hoffmantown Church elected to begin using another package for their prayer requests. While a few other churches had expressed interest in it, none ultimately decided to use it; so, in 2017, Virtual Prayer Room was officially decommissioned.

View File

@ -1,111 +0,0 @@
<template>
<div>
<PageHeader />
<Nuxt />
<PageFooter />
</div>
</template>
<script lang="ts">
import Vue from 'vue'
export default Vue.extend({
head () {
return {
link: [
{ rel: 'stylesheet',
href: 'https://fonts.googleapis.com/css?family=Oswald|Raleway'
}
]
}
}
})
</script>
<style>
html {
background-color: lightgray;
}
body {
margin: 0px;
font-family: "Raleway", "Segoe UI", Ubuntu, Tahoma, "DejaVu Sans", "Liberation Sans", Arial, sans-serif;
background-color: #FFFAFA;
}
a {
color: navy;
text-decoration: none;
}
a:hover {
border-bottom: dotted 1px navy;
}
a img {
border: 0;
}
acronym {
border-bottom: dotted 1px black;
}
header, h1, h2, h3, footer a {
font-family: "Oswald", "Segoe UI", Ubuntu, "DejaVu Sans", "Liberation Sans", Arial, sans-serif;
}
h1 {
text-align: center;
margin: 1.4rem 0;
font-size: 2rem;
}
h2 {
margin: 1.2rem 0;
}
h3 {
margin: 1rem 0;
}
h2, h3 {
border-bottom: solid 2px navy;
}
@media all and (min-width:40rem) {
h2, h3 {
width: 80%;
}
}
p {
margin: 1rem 0;
}
#content {
margin: 0 1rem;
}
.content {
font-size: 1.1rem;
}
.auto {
margin: 0 auto;
}
@media all and (min-width: 68rem) {
.content {
width: 66rem;
}
}
.hdr {
font-size: 14pt;
font-weight: bold;
}
.strike {
text-decoration: line-through;
}
.alignleft {
float: left;
padding-right: 5px;
}
ul {
padding-left: 40px;
}
li {
list-style-type: disc;
}
.app-info {
display: flex;
flex-flow: row-reverse wrap;
justify-content: center;
}
abbr[title] {
text-decoration: none;
border-bottom: dotted 1px rgba(0, 0, 0, .5)
}
</style>

View File

@ -1,71 +0,0 @@
export default {
/*
** Nuxt rendering mode
** See https://nuxtjs.org/api/configuration-mode
*/
mode: 'universal',
/*
** Nuxt target
** See https://nuxtjs.org/api/configuration-target
*/
target: 'static',
/*
** Headers of the page
** See https://nuxtjs.org/api/configuration-head
*/
head: {
title: process.env.npm_package_name || '',
meta: [
{ charset: 'utf-8' },
{ name: 'viewport', content: 'width=device-width, initial-scale=1' },
{ hid: 'description', name: 'description', content: process.env.npm_package_description || '' }
],
link: [
{ rel: 'icon', type: 'image/x-icon', href: '/favicon.ico' }
]
},
/*
** Global CSS
*/
css: [
],
/*
** Plugins to load before mounting the App
** https://nuxtjs.org/guide/plugins
*/
plugins: [
],
/*
** Auto import components
** See https://nuxtjs.org/api/configuration-components
*/
components: true,
/*
** Nuxt.js dev-modules
*/
buildModules: [
'@nuxt/typescript-build'
],
/*
** Nuxt.js modules
*/
modules: [
// Doc: https://github.com/nuxt/content
'@nuxt/content'
],
/*
** Content module configuration
** See https://content.nuxtjs.org/configuration
*/
content: {
liveEdit: false,
nestedProperties: ['frontPage.display']
},
/*
** Build configuration
** See https://nuxtjs.org/api/configuration-build/
*/
build: {
}
}

File diff suppressed because it is too large Load Diff

View File

@ -1,28 +0,0 @@
{
"name": "bit-badger-solutions",
"version": "3.0.0",
"private": true,
"scripts": {
"dev": "nuxt-ts",
"build": "nuxt-ts build",
"start": "nuxt-ts start",
"generate": "nuxt-ts generate",
"lint:js": "eslint --ext .js,.vue --ignore-path .gitignore .",
"lint": "npm run lint:js"
},
"dependencies": {
"@nuxt/content": "^1.5.0",
"@nuxt/typescript-runtime": "^1.0.0",
"nuxt": "^2.14.0"
},
"devDependencies": {
"@nuxt/types": "^2.14.0",
"@nuxt/typescript-build": "^2.0.2",
"@nuxtjs/eslint-config": "^3.1.0",
"@nuxtjs/eslint-config-typescript": "^3.0.0",
"@nuxtjs/eslint-module": "^2.0.0",
"babel-eslint": "^10.1.0",
"eslint": "^7.5.0",
"eslint-plugin-nuxt": "^1.0.0"
}
}

View File

@ -1,28 +0,0 @@
<template>
<article class="content auto">
<h1 v-html="page.title" />
<nuxt-content :document="page" />
<p><br><nuxt-link to="/" title="Home">&laquo; Home</nuxt-link></p>
</article>
</template>
<script lang="ts">
import Vue from 'vue'
import { siteTitle } from '../index.vue'
export default Vue.extend({
async asyncData ({ $content, params }) {
const page = await $content(`about/${params.slug}`).fetch()
return { page }
},
head () {
return { title: siteTitle((this as any).page.title) }
}
})
</script>
<style scoped>
li {
margin-bottom: .8rem;
}
</style>

View File

@ -1,53 +0,0 @@
<template>
<div class="home">
<article class="content auto">
<nuxt-content :document="home" />
</article>
<home-sidebar :cat-names="catNames" :solutions="slns" />
</div>
</template>
<script lang="ts">
import Vue from 'vue'
export default Vue.extend({
async asyncData ({ $content }) {
const home = await $content('home').fetch()
const cats: {category: string}[] = await $content('solutions').only(['category']).fetch()
const catNames = [...new Set(cats.map(x => x.category))]
const slns = await $content('solutions').where({ 'frontPage.display': true }).fetch()
return { home, catNames, slns }
},
head () {
return { title: siteTitle('Welcome!') }
}
})
/**
* Construct a title for the site
*
* @param pageTitle The title of the page
* @returns The page title, with the site title appended
*/
export function siteTitle (pageTitle: string) {
return `${pageTitle} « Bit Badger Solutions`
}
</script>
<style>
@media all and (min-width: 80rem) {
.home {
display: flex;
flex-flow: row;
align-items: flex-start;
justify-content: space-around;
}
}
.home-lead {
font-size: 1.3rem;
text-align: center;
}
</style>

View File

@ -1,139 +0,0 @@
<template>
<section>
<h1>
{{ solution.title }}<br>
<small><small>
<a v-if="!solution.noLink" :href="solution.url" target="_blank">{{ solution.url }}</a>
<span v-else>{{ solution.url }}</span>
<span v-if="solution.linkToArchive"> &nbsp;&nbsp;
<a :href="solution.archiveUrl"><small>(Archive)</small></a>
</span>
</small></small>
</h1>
<div class="app-info">
<article class="content">
<aside>
<span>&nbsp;</span>
<img :src="`/screenshots/${solution.slug}.png`" :alt="`Screen shot of ${solution.title}`">
</aside>
<nuxt-content :document="solution" />
<hidden-section v-if="hasTechStack" heading="The Technology Stack" class="tech-stack">
<template v-if="hasCurrent">
<p v-if="hasCurrent && hasPrevious">
<small><strong>Current:</strong></small>
</p>
<ul>
<technology-item v-for="tech in currentTech" :key="tech[0]" :tech="tech" />
</ul>
</template>
<template v-if="hasPrevious">
<p v-if="hasCurrent && hasPrevious">
<small><strong>Previously:</strong></small>
</p>
<ul>
<technology-item v-for="tech in previousTech" :key="tech[0]" :tech="tech" />
</ul>
</template>
</hidden-section>
<p><br><nuxt-link to="/solutions">&laquo; Back to All Solutions</nuxt-link></p>
</article>
</div>
</section>
</template>
<script lang="ts">
import Vue from 'vue'
import { siteTitle } from '../../index.vue'
export default Vue.extend({
async asyncData ({ $content, params }) {
const solution = await $content(`solutions/${params.id}`).fetch()
return { solution }
},
head () {
return { title: siteTitle((this as any).solution.title + ' « Solution') }
},
computed: {
/**
* Does this solution have a technology stack defined?
*
* @returns True if there are technologies defined, false if not
*/
hasTechStack (): boolean {
return ((this as any).solution.technologies || []).length > 0
},
/**
* Does this solution have any technology marked as current?
*
* @returns True if there are technologies marked as current, false if not
*/
hasCurrent (): boolean {
return (this as any).solution.technologies.filter((x: any) => x[Object.keys(x)[0]].isCurrent).length > 0
},
/**
* Retrieve the current technologies for this solution.
*
* @returns The current technologies for this solution
*/
currentTech (): [] {
return (this as any).solution.technologies
.filter((x: any) => x[Object.keys(x)[0]].isCurrent)
.map((x: any) => [ Object.keys(x)[0], x[Object.keys(x)[0]].for ])
},
/**
* Does this solutio have any technology not marked as current?
*
* @returns True if there are technologies not marked as current, false if not
*/
hasPrevious (): boolean {
return (this as any).solution.technologies.filter((x: any) => !x[Object.keys(x)[0]].isCurrent).length > 0
},
/**
* Retrieve the non-current technologies for this solution.
*
* @returns The non-current technologies for this solution.
*/
previousTech (): [] {
return (this as any).solution.technologies
.filter((x: any) => !x[Object.keys(x)[0]].isCurrent)
.map((x: any) => [ Object.keys(x)[0], x[Object.keys(x)[0]].for ])
}
}
})
</script>
<style scoped>
h1 {
line-height: 1.6rem;
}
aside {
float: right;
background-color: #FFFAFA;
}
aside > span {
padding-left: .75rem;
}
aside > img {
overflow: hidden;
border: dotted 1px darkgray;
border-radius: 10px;
}
.tech-stack p {
margin-bottom: 0;
}
.tech-stack ul {
margin-top: 0;
}
blockquote {
border-left: solid 1px darkgray;
margin-left: 25px;
padding-left: 15px;
}
.quote {
font-style: italic;
}
.source {
text-align: right;
padding-right: 60px;
}
</style>

View File

@ -1,32 +0,0 @@
<template>
<article class="content auto">
<h1>All Solutions</h1>
<h2>Active Solutions</h2>
<solution-item v-for="sln in active" :key="sln.slug" :solution="sln" />
<h2>Past Solutions</h2>
<solution-item v-for="sln in inactive" :key="sln.slug" :solution="sln" />
</article>
</template>
<script lang="ts">
import Vue from 'vue'
import { siteTitle } from '../index.vue'
const sortByName = (x: any, y: any): number =>
x.title.toLowerCase() < y.title.toLowerCase() ? -1 : x.title.toLowerCase() > y.title.toLowerCase() ? 1 : 0
export default Vue.extend({
async asyncData ({ $content }) {
const activeSlns = await $content('solutions')
.where({ isInactive: { $ne: true }, noAboutLink: { $ne: true } }).fetch()
const inactiveSlns = await $content('solutions')
.where({ isInactive: true, noAboutLink: { $ne: true } }).fetch()
const active = activeSlns.sort(sortByName)
const inactive = inactiveSlns.sort(sortByName)
return { active, inactive }
},
head () {
return { title: siteTitle('All Solutions') }
}
})
</script>

View File

@ -1,9 +0,0 @@
<svg width="389" height="82" viewBox="0 0 389 82" fill="none" xmlns="http://www.w3.org/2000/svg">
<path d="M182.001 28.178V14.089V0H175.001H168.001L167.964 6.75C167.944 10.462 167.667 27.563 167.349 44.75L166.77 76H174.386H182.001V57.073V38.145L184.636 36.073C188.115 33.336 194.3 33.299 197.001 36C198.861 37.86 199.001 39.333 199.001 57V76H206.587H214.173L213.837 54.75C213.535 35.659 213.298 33.155 211.501 30.105C208.475 24.967 204.818 22.732 198.589 22.216C191.69 21.644 188.955 22.326 185.078 25.589L182.001 28.178Z" fill="#333333"/>
<path d="M241.001 23V16.5V10H234.001H227.001V16.5V23H223.001H219.001V28.5V34H223.001H227.001L227.016 50.75C227.032 69.257 227.474 71.055 232.913 74.72C235.464 76.439 237.716 77 242.067 77C250.558 77 251.001 76.673 251.001 70.393V65L247.751 64.985C241.716 64.956 241.532 64.497 241.18 48.537L240.859 34H245.43H250.001V28.5V23H245.501H241.001Z" fill="#333333"/>
<path d="M299.429 27.201C298.577 25.984 296.579 24.316 294.99 23.494C290.431 21.137 282.086 21.581 276.65 24.472C272.192 26.842 272.001 26.863 272.001 24.972C272.001 23.197 271.301 23 265.001 23H258.001V49.5V76H265.001H272.001V57.455C272.001 39.098 272.026 38.884 274.456 36.455C276.22 34.69 278.003 34 280.801 34C287.696 34 288.001 34.966 288.001 56.829V76H295.501H303.001V57.455C303.001 39.098 303.026 38.884 305.456 36.455C308.565 33.345 314.127 33.126 317.001 36C318.861 37.86 319.001 39.333 319.001 57V76H326.501H334.001L333.995 56.75C333.992 45.986 333.509 35.737 332.9 33.5C330.814 25.849 325.253 21.998 316.301 22.004C310.396 22.008 305.023 24.22 302.24 27.794C301.098 29.259 300.832 29.203 299.429 27.201Z" fill="#333333"/>
<path d="M361.928 33.395C360.349 30.703 358.54 27.263 357.908 25.75C356.791 23.078 356.535 23 348.821 23C344.455 23 341.077 23.338 341.315 23.75C341.552 24.162 344.932 29.997 348.825 36.715L355.904 48.93L348.021 62.465L340.139 76H348.002H355.865L360.146 68.073C362.501 63.713 364.742 60.34 365.127 60.578C365.511 60.815 367.677 64.382 369.939 68.505L374.053 76H381.527C385.638 76 389.001 75.768 389.001 75.483C389.001 75.199 385.598 69.113 381.439 61.958L373.877 48.949L381.403 35.974L388.929 23L381.215 23.011L373.501 23.021L369.15 30.655L364.798 38.289L361.928 33.395Z" fill="#3D72D7"/>
<path d="M74.3377 44.7953C81.2334 24.3322 87.0228 6.91645 87.2037 6.09245C87.4555 4.94086 83.3472 4.52536 79.4177 4.29664L74.3028 4L61.7576 41.2516C54.8569 61.7407 48.9026 79.2903 48.5259 80.2521C47.9233 81.7873 48.5059 82 53.3199 82H61.7995L74.3377 44.7953Z" fill="#3D72D7"/>
<path d="M43.0572 35.8912V28.9816C43.0572 24.0716 42.6954 22.1 41.808 22.1649C41.1214 22.2158 31.5644 26.168 20.5712 30.9492L0.583636 39.6406L0.291818 45.6143L0 51.588L20.7791 60.3164C32.208 65.1166 41.8959 69.0378 42.3077 69.0298C42.7194 69.0218 43.0572 65.9206 43.0572 62.1372V55.2576L29.4747 50.4884L15.8921 45.7182L25.2273 42.4062C30.3611 40.5844 36.4733 38.3731 38.8098 37.4922L43.0572 35.8912Z" fill="#333333"/>
<path d="M134.986 39.5517L115.255 31.3467C104.403 26.8342 94.7381 22.854 93.7757 22.5005C92.2156 21.9282 92.0267 22.6143 92.0267 28.8627V35.8672L100.272 38.8216C104.806 40.4466 110.878 42.5471 113.763 43.4909C116.648 44.4338 119.01 45.3357 119.01 45.4935C119.01 45.6523 112.939 47.9145 105.518 50.5203L92.0267 55.2576V62.1372C92.0267 65.9206 92.3645 69.0218 92.7763 69.0298C93.188 69.0378 102.858 65.1455 114.263 60.3813L135 51.7179L134.993 45.6343L134.986 39.5517Z" fill="#333333"/>
</svg>

Before

Width:  |  Height:  |  Size: 3.3 KiB

View File

@ -1,37 +0,0 @@
{
"compilerOptions": {
"target": "ES2018",
"module": "ESNext",
"moduleResolution": "Node",
"lib": [
"ESNext",
"ESNext.AsyncIterable",
"DOM"
],
"esModuleInterop": true,
"allowJs": true,
"sourceMap": true,
"strict": true,
"noEmit": true,
"experimentalDecorators": true,
"baseUrl": ".",
"paths": {
"~/*": [
"./*"
],
"@/*": [
"./*"
]
},
"types": [
"@types/node",
"@nuxt/types",
"@nuxt/content"
]
},
"exclude": [
"node_modules",
".nuxt",
"dist"
]
}

131
theme/home-page.liquid Normal file
View File

@ -0,0 +1,131 @@
<div class="home">
<article class="content auto">
{{ page.text }}
{% if logged_on -%}
<p><small><a hx-boost="false" href="{{ page | edit_page_link }}">Edit This Page</a></small></p>
{% endif %}
</article>
<aside class="app-sidebar">
<div>
<div class="app-sidebar-head">Web Sites and Applications</div>
<div>
<p class="app-sidebar-name">
<strong>PrayerTracker</strong><br>
<a href="{{ "solutions/prayer-tracker" | relative_link }}"
title="About PrayerTracker &bull; Bit Badger Solutions">
About
</a> •
<a href="https://prayer.bitbadger.solutions" title="PrayerTracker" target="_blank" rel="noopener">Visit</a>
</p>
<p class="app-sidebar-description">
A prayer request tracking website (Free for any church or Sunday School class!)
</p>
</div>
<div>
<p class="app-sidebar-name">
<strong>myPrayerJournal</strong><br>
<a href="{{ "solutions/my-prayer-journal" | relative_link }}"
title="About myPrayerJournal &bull; Bit Badger Solutions">
About
</a> •
<a href="https://prayerjournal.me" title="myPrayerJournal" target="_blank" rel="noopener">Visit</a>
</p>
<p class="app-sidebar-description">Minimalist personal prayer journal</p>
</div>
<div>
<p class="app-sidebar-name">
<strong>Linux Resources</strong><br>
<a href="https://blog.bitbadger.solutions/linux/" title="Linux Resources" target="_blank" rel="noopener">
Visit
</a>
</p>
<p class="app-sidebar-description">Handy information for Linux folks</p>
</div>
</div>
<div>
<div class="app-sidebar-head">WordPress</div>
<div>
<p class="app-sidebar-name">
<strong>Futility Closet</strong><br>
<a href="{{ "solutions/futility-closet" | relative_link }}"
title="About Futility Closet &bull; Bit Badger Solutions">
About
</a> •
<a href="https://www.futilitycloset.com" title="Futility Closet" target="_blank" rel="noopener">Visit</a>
</p>
<p class="app-sidebar-description">An idlers miscellany of compendious amusements</p>
</div>
<div>
<p class="app-sidebar-name">
<strong>Mindy Mackenzie</strong><br>
<a href="{{ "solutions/mindy-mackenzie" | relative_link }}"
title="About Mindy Mackenzie &bull; Bit Badger Solutions">
About
</a> •
<a href="https://mindymackenzie.com" title="Mindy Mackenzie" target="_blank" rel="noopener">Visit</a>
</p>
<p class="app-sidebar-description"><em>WSJ</em>-best-selling author of <em>The Courage Solution</em></p>
</div>
<div>
<p class="app-sidebar-name">
<strong>Riehl World News</strong><br>
<a href="{{ "solutions/riehl-world-news" | relative_link }}"
title="About Riehl World News &bull; Bit Badger Solutions">
About
</a> •
<a href="http://riehlworldview.com" title="Riehl World News" target="_blank" rel="noopener">Visit</a>
</p>
<p class="app-sidebar-description">Riehl news for real people</p>
</div>
</div>
<div>
<div class="app-sidebar-head">Static Sites</div>
<div>
<p class="app-sidebar-name">
<strong>Bay Vista Baptist Church</strong><br>
<a href="{{ "solutions/bay-vista" | relative_link }}"
title="About Bay Vista Baptist Church &bull; Bit Badger Solutions">
About
</a> •
<a href="https://bayvista.org" title="Bay Vista Baptist Church" target="_blank" rel="noopener">Visit</a>
</p>
<p class="app-sidebar-description">Biloxi, Mississippi</p>
</div>
</div>
<div>
<div>
<div class="app-sidebar-head">myWebLog</div>
<p class="app-sidebar-name">
<strong>The Bit Badger Blog</strong><br>
<a href="{{ "solutions/tech-blog" | relative_link }}"
title="About The Bit Badger Blog &bull; Bit Badger Solutions">
About
</a> •
<a href="https://bitbadger.solutions/blog" title="The Bit Badger Blog" target="_blank" rel="noopener">
Visit
</a>
</p>
<p class="app-sidebar-description">Technical information (“geek stuff”) from Bit Badger Solutions</p>
</div>
</div>
<div>
<div class="app-sidebar-head">Personal</div>
<div>
<p class="app-sidebar-name">
<strong>Daniel J. Summers</strong><br>
<a href="https://daniel.summershome.org" title="Daniel J. Summers" target="_blank" rel="noopener">Visit</a>
</p>
<p class="app-sidebar-description">Daniels personal blog</p>
</div>
<div>
<p class="app-sidebar-name">
<strong>A Word from the Word</strong><br>
<a href="https://devotions.summershome.org" title="A Word from the Word" target="_blank" rel="noopener">
Visit
</a>
</p>
<p class="app-sidebar-description">Devotions by Daniel</p>
</div>
</div>
</aside>
</div>

View File

@ -0,0 +1,10 @@
<!DOCTYPE html>
<html lang="en">
<head>
<meta charset="UTF-8">
<title>{{ page_title }} &raquo; Bit Badger Solutions</title>
</head>
<body>
{{ content }}
</body>
</html>

49
theme/layout.liquid Normal file
View File

@ -0,0 +1,49 @@
<!DOCTYPE html>
<html lang="en">
<head>
<meta charset="UTF-8">
<meta name="viewport" content="width=device-width">
<title>{{ page_title }} &raquo; Bit Badger Solutions</title>
<link rel="stylesheet" href="https://fonts.googleapis.com/css?family=Oswald|Raleway">
{% page_head -%}
</head>
<body hx-boost="true" hx-target="main" hx-indicator="#loadOverlay" hx-swap="innerHTML show:body:top">
<header class="site-header">
<div class="header-logo">
<a href="{{ "" | relative_link }}">
<img src="{{ "bitbadger.png" | theme_asset }}"
alt="A cartoon badger looking at a computer screen, with his paw on a mouse"
title="Bit Badger Solutions">
</a>
</div>
<div class="header-title"><a href="{{ "" | relative_link }}">Bit Badger Solutions</a></div>
<div class="header-spacer"> &nbsp; </div>
<div class="header-social">
<a href="https://twitter.com/Bit_Badger" title="Bit_Badger on Twitter" target="_blank">
<img src="{{ "twitter.png" | theme_asset }}" alt="Twitter">
</a> &nbsp;
<a href="https://www.facebook.com/bitbadger.solutions" title="Bit Badger Solutions on Facebook" target="_blank">
<img src="{{ "facebook.png" | theme_asset }}" alt="Facebook">
</a>
</div>
</header>
<div class="load-overlay" id="loadOverlay"><h1>Loading&hellip;</h1></div>
<main>{{ content }}</main>
<footer hx-boost="false">
<div>
<small>
{% if logged_on -%}
<a href="{{ "admin/dashboard" | relative_link }}">Dashboard</a> ~
<a href="{{ "user/log-off" | relative_link }}">Log Off</a>
{% else %}
<a href="{{ "user/log-on" | relative_link }}">Log On</a>
{% endif %}
</small>
</div>
<div class="footer-by">
A <strong><a href="{{ "" | relative_link }}">Bit Badger Solutions</a></strong> original design
</div>
</footer>
{% page_foot %}
</body>
</html>

33
theme/project-page.liquid Normal file
View File

@ -0,0 +1,33 @@
<article class="content auto">
{%- assign parts = page.title | split: ' » ' -%}
{%- assign parts_count = parts | size -%}
<h1 class="project-title">
{% if parts_count == 1 -%}
{{ page.title }}<br>
<small><small>
<a href="https://github.com/bit-badger/{{ page.title }}" target="_blank" rel="noopener"
title="{{ parts[0] }} on GitHub">
View on GitHub
</a>
{% if logged_on %} &bull; <a hx-boost="false" href="{{ page | edit_page_link }}">Edit Page</a>{% endif %}
</small></small>
{%- else -%}
<small><small>
<a href="." title="{{ parts[0] }} Home">{{ parts[0] }}</a>
{% if logged_on %} &bull; <a hx-boost="false" href="{{ page | edit_page_link }}">Edit</a>{% endif %}
</small></small>
<br>
{{ parts[1] }}
{%- endif %}
</h1>
{{ page.text }}
{% if parts_count > 1 -%}
<p class="project-footer">
<a href="." title="{{ parts[0] }} Home">&laquo; {{ parts[0] }} Home</a>
<a href="https://github.com/bit-badger/{{ parts[0] }}" target="_blank" rel="noopener"
title="{{ parts[0] }} on GitHub">
View GitHub Repo
</a>
</p>
{%- endif %}
</article>

8
theme/single-page.liquid Normal file
View File

@ -0,0 +1,8 @@
<article class="content auto">
<h1>{{ page.title }}</h1>
{{ page.text }}
<p><br><a href="{{ "" | relative_link }}" title="Home">&laquo; Home</a></p>
{% if logged_on -%}
<p><small><a hx-boost="false" href="{{ page | edit_page_link }}">Edit This Page</a></small></p>
{% endif %}
</article>

112
theme/solution-page.liquid Normal file
View File

@ -0,0 +1,112 @@
<h1 class="solution-header">
{{ page.title }}<br>
<small><small>
{%- assign url = page.metadata | value: "url" -%}
{%- assign no_link = page.metadata | value: "no_link" -%}
{%- assign archive = page.metadata | where: "name", "archive_url" | size -%}
{% if no_link == "true" -%}
{{ url }}
{%- else -%}
<a href="{{ url }}" target="_blank" rel="noopener">{{ url }}</a>
{%- endif %}
{% if archive > 0 -%}
&nbsp;&nbsp;
<a href="{{ page.metadata | value: "archive_url" }}" target="_blank" rel="noopener"><small>(Archive)</small></a>
{%- endif %}
</small></small>
</h1>
<div class="app-info">
<article class="content">
<aside>
{%- capture screen_url %}screenshots/{{ page.permalink | split: "/" | last }}.png{% endcapture -%}
<img src="{{ screen_url | theme_asset }}" alt="Screen shot of {{ page.title | escape }}">
</aside>
{{ page.text }}
{%- assign curr_tech = page.metadata | where: "name", "tech" -%}
{%- assign past_tech = page.metadata | where: "name", "past_tech" -%}
{%- assign curr_count = curr_tech | size -%}
{%- assign past_count = past_tech | size -%}
{% if curr_count > 0 or past_count > 0 -%}
{% comment %} TODO / WIP
{% capture all_links -%}
ASP.NET MVC|https://dotnet.microsoft.com/apps/aspnet/mvc,
Azure|https://azure.microsoft.com/,
BlogEngine.NET|http://www.dotnetblogengine.net/,
Database Abstraction|https://github.com/danieljsummers/DatabaseAbstraction,
Digital Ocean|https://www.digitalocean.com/,
Giraffe|https://github.com/giraffe-fsharp/Giraffe,
GitHub|https://github.com/,
GitHub Pages|https://pages.github.com/,
Hexo|https://hexo.io/,
Hugo|https://gohugo.io/,
Jekyll|https://jekyllrb.com/,
MongoDB|https://www.mongodb.com/,
MySQL|https://www.mysql.com/,
myWebLog|https://github.com/bit-badger/myWebLog,
nginx|http://nginx.org/,
Orchard|https://orchardproject.net/,
PHP|https://www.php.net/,
PostgreSQL|https://www.postgresql.org/,
Rackspace Cloud|https://www.rackspace.com/cloud,
RavenDB|https://ravendb.net/,
RethinkDB|https://rethinkdb.com/,
SQL Server|https://www.microsoft.com/en-us/sql-server/,
Vue.js|https://vuejs.org/,
WordPress|https://wordpress.org
{%- endcapture %}
{% endcomment %}
<section>
<h3 onclick="toggle('techStack')">
The Technology Stack<span id="techStackArrow" class="arrow">&#x25BC;</span>
</h3>
<div id="techStack" class="collapse-panel hidden">
{% if curr_count > 0 -%}
{% if past_count > 0 -%}
<p><small><strong>Current:</strong></small></p>
{%- endif %}
<ul>
{% for curr in curr_tech -%}
{%- assign tech = curr.value | split: "|" -%}
<li>
{% comment %} <a v-if="hasLink(tech[0])" :href="techLinks[tech[0]]" target="_blank">{{ tech[0] }}</a> {% endcomment %}
{{ tech[0] }} for {{ tech[1] }}
</li>
{%- endfor %}
</ul>
{%- endif %}
{% if past_count > 0 -%}
{% if curr_count > 0 %}
<p><small><strong>Previously:</strong></small></p>
{% endif %}
<ul>
{% for past in past_tech -%}
{%- assign tech = past.value | split: "|" -%}
<li>
{% comment %} <a v-if="hasLink(tech[0])" :href="techLinks[tech[0]]" target="_blank">{{ tech[0] }}</a> {% endcomment %}
{{ tech[0] }} for {{ tech[1] }}
</li>
{%- endfor %}
</ul>
{% endif %}
</div>
</section>
{%- endif %}
<p><br><a href="{{ "solutions" | relative_link }}">&laquo; Back to All Solutions</a></p>
{% if logged_on -%}
<p><small><a hx-boost="false" href="{{ page | edit_page_link }}">Edit This Page</a></small></p>
{% endif %}
</article>
</div>
<script>
function toggle(id) {
const section = document.getElementById(id)
const arrow = document.getElementById(`${id}Arrow`)
if (section.className.indexOf("shown") === -1) {
section.className = `${section.className} shown`
arrow.innerHTML = "&#x25B2;"
} else {
section.className = section.className.replace(" shown", "")
arrow.innerHTML = "&#x25BC;"
}
}
</script>

0
theme/version.txt Normal file
View File

View File

Before

Width:  |  Height:  |  Size: 23 KiB

After

Width:  |  Height:  |  Size: 23 KiB

View File

Before

Width:  |  Height:  |  Size: 17 KiB

After

Width:  |  Height:  |  Size: 17 KiB

View File

Before

Width:  |  Height:  |  Size: 6.4 KiB

After

Width:  |  Height:  |  Size: 6.4 KiB

View File

Before

Width:  |  Height:  |  Size: 9.3 KiB

After

Width:  |  Height:  |  Size: 9.3 KiB

View File

Before

Width:  |  Height:  |  Size: 54 KiB

After

Width:  |  Height:  |  Size: 54 KiB

View File

Before

Width:  |  Height:  |  Size: 57 KiB

After

Width:  |  Height:  |  Size: 57 KiB

View File

Before

Width:  |  Height:  |  Size: 69 KiB

After

Width:  |  Height:  |  Size: 69 KiB

View File

Before

Width:  |  Height:  |  Size: 90 KiB

After

Width:  |  Height:  |  Size: 90 KiB

View File

Before

Width:  |  Height:  |  Size: 70 KiB

After

Width:  |  Height:  |  Size: 70 KiB

View File

Before

Width:  |  Height:  |  Size: 68 KiB

After

Width:  |  Height:  |  Size: 68 KiB

View File

Before

Width:  |  Height:  |  Size: 38 KiB

After

Width:  |  Height:  |  Size: 38 KiB

View File

Before

Width:  |  Height:  |  Size: 23 KiB

After

Width:  |  Height:  |  Size: 23 KiB

View File

Before

Width:  |  Height:  |  Size: 47 KiB

After

Width:  |  Height:  |  Size: 47 KiB

View File

Before

Width:  |  Height:  |  Size: 15 KiB

After

Width:  |  Height:  |  Size: 15 KiB

View File

Before

Width:  |  Height:  |  Size: 90 KiB

After

Width:  |  Height:  |  Size: 90 KiB

View File

Before

Width:  |  Height:  |  Size: 42 KiB

After

Width:  |  Height:  |  Size: 42 KiB

View File

Before

Width:  |  Height:  |  Size: 71 KiB

After

Width:  |  Height:  |  Size: 71 KiB

View File

Before

Width:  |  Height:  |  Size: 34 KiB

After

Width:  |  Height:  |  Size: 34 KiB

View File

Before

Width:  |  Height:  |  Size: 60 KiB

After

Width:  |  Height:  |  Size: 60 KiB

View File

Before

Width:  |  Height:  |  Size: 95 KiB

After

Width:  |  Height:  |  Size: 95 KiB

View File

Before

Width:  |  Height:  |  Size: 44 KiB

After

Width:  |  Height:  |  Size: 44 KiB

372
theme/wwwroot/style.css Normal file
View File

@ -0,0 +1,372 @@
:root {
--heading-fonts: Oswald, "Segoe UI", Ubuntu, "DejaVu Sans", "Liberation Sans", Arial, sans-serif;
--accent-color: navy;
--app-color: maroon;
--edge-color: lightgray;
--bkg-color: #fffafa;
}
html {
background-color: var(--edge-color);
}
body {
margin: 0;
font-family: Raleway, "Segoe UI", Ubuntu, Tahoma, "DejaVu Sans", "Liberation Sans", Arial, sans-serif;
background-color: var(--bkg-color);
}
a {
color: var(--accent-color);
text-decoration: none;
}
a:hover {
border-bottom: dotted 1px var(--accent-color);
}
a img {
border: 0;
}
acronym {
border-bottom: dotted 1px black;
}
header, h1, h2, h3, .footer-by a {
font-family: var(--heading-fonts);
}
h1 {
text-align: center;
margin: 1.4rem 0;
font-size: 2rem;
}
h1.project-title {
line-height: 1.2;
}
h2 {
margin: 1.2rem 0;
}
h3 {
margin: 1rem 0;
}
h2, h3 {
border-bottom: solid 2px var(--accent-color);
width: 95%;
}
@media all and (min-width: 40rem) {
h1 {
margin: 0 0 1.4rem 0;
}
h2, h3 {
width: 80%;
}
}
p {
margin: 1rem 0;
}
code, pre {
font-family: "JetBrains Mono","SFMono-Regular",Consolas,"Liberation Mono",Menlo,Courier,monospace;
font-size: 80%;
}
code {
background-color: rgba(0, 0, 0, .1);
padding: 0 .25rem;
white-space: pre;
}
pre {
background-color: rgba(0, 0, 0, .9);
color: rgba(255, 255, 255, .9);
padding: .5rem;
border-radius: .5rem;
overflow: auto;
}
pre > code {
background-color: unset;
}
div[style="color:#DADADA;background-color:#1E1E1E;"] {
background-color: unset !important;
}
#content {
margin: 0 1rem;
}
.content {
font-size: 1.1rem;
padding: 0 .5rem;
}
.auto {
margin: 0 auto;
}
@media all and (min-width: 68rem) {
.content {
width: 66rem;
padding: 0 1rem;
}
}
.hdr {
font-size: 14pt;
font-weight: bold;
}
.strike {
text-decoration: line-through;
}
.alignleft {
float: left;
padding-right: 5px;
}
ul {
padding-left: 1.5rem;
}
li {
list-style-type: disc;
}
.app-info {
display: flex;
flex-flow: row-reverse wrap;
justify-content: center;
}
abbr[title] {
text-decoration: none;
border-bottom: dotted 1px rgba(0, 0, 0, .5)
}
/* Page header */
.site-header {
height: 100px;
display: flex;
flex-direction: row;
justify-content: space-between;
background-image: linear-gradient(to bottom, var(--edge-color), var(--bkg-color));
}
.site-header a, .site-header a:visited {
color: black;
}
.site-header a:hover {
border-bottom: none;
}
.header-title {
font-size: 3rem;
font-weight: bold;
line-height: 100px;
text-align: center;
}
.header-spacer {
flex-grow: 3;
}
.header-social {
padding: 25px .8rem 0 0;
}
.header-social img {
width: 50px;
height: 50px;
}
@media all and (max-width: 40rem) {
.site-header {
height: auto;
flex-direction: column;
align-items: center;
}
.header-title {
line-height: 3rem;
}
.header-spacer {
display: none;
}
}
/* Home page */
@media all and (min-width: 80rem) {
.home {
display: flex;
flex-flow: row;
align-items: flex-start;
justify-content: space-around;
}
}
.home-lead {
font-size: 1.3rem;
text-align: center;
}
.app-sidebar {
text-align: center;
border-top: dotted 1px var(--edge-color);
padding-top: 1rem;
font-size: .9rem;
display: flex;
flex-flow: row wrap;
justify-content: space-around;
}
.app-sidebar > div {
width: 20rem;
padding-bottom: 1rem;
}
@media all and (min-width: 68rem) {
.app-sidebar {
width: 66rem;
margin: auto;
}
}
@media all and (min-width: 80rem) {
.app-sidebar {
width: 12rem;
border-top: none;
border-left: dotted 1px var(--edge-color);
padding-top: 0;
padding-left: 2rem;
flex-direction: column;
}
.app-sidebar > div {
width: auto;
}
}
.app-sidebar a {
font-size: 10pt;
font-family: sans-serif;
}
.app-sidebar-head {
font-family: var(--heading-fonts);
font-weight: bold;
color: var(--app-color);
margin-bottom: .8rem;
padding: 3px 12px;
border-bottom: solid 2px var(--edge-color);
font-size: 1rem;
}
.app-sidebar-name, .app-sidebar-description {
margin: 0;
padding: 0;
}
.app-sidebar-description {
font-style: italic;
color: #555555;
padding-bottom: .6rem;
}
/* All solution page */
.app-name {
font-family: var(--heading-fonts);
font-size: 1.3rem;
font-weight: bold;
color: var(--app-color);
}
/* Individual solution pages */
h1.solution-header {
line-height: 1;
}
.app-info aside {
float: right;
background-color: #FFFAFA;
padding-left: .5rem;
}
@media all and (max-width: 40rem) {
.app-info aside {
float: none;
text-align: center;
padding-left: 0;
}
}
.app-info aside > img {
overflow: hidden;
border: dotted 1px darkgray;
border-radius: .5rem;
}
.tech-stack p {
margin-bottom: 0;
}
.tech-stack ul {
margin-top: 0;
}
blockquote {
border-left: solid 1px darkgray;
margin-left: 25px;
padding-left: 15px;
}
.quote {
font-style: italic;
}
.source {
text-align: right;
padding-right: 60px;
}
.app-info h3:hover {
cursor: hand;
cursor: pointer;
}
.app-info .arrow {
font-size: .75rem;
padding-left: 1rem;
}
.collapse-panel {
max-height: 0;
transition: max-height .5s ease-in-out;
overflow: hidden;
}
.collapse-panel.shown {
max-height: 25rem;
overflow: auto;
}
.collapse-panel p:first-of-type {
margin-top: 0;
}
/* Footer */
.project-footer {
padding-top: 1rem;
display: flex;
flex-flow: row wrap;
justify-content: space-between;
}
footer {
display: flex;
flex-flow: row wrap;
justify-content: space-between;
padding: 20px 15px 10px 15px;
font-size: 1rem;
color: black;
clear: both;
background-image: linear-gradient(to bottom, var(--bkg-color), var(--edge-color));
}
footer a:link, footer a:visited {
color: black;
}
/* htmx "Loading" overlay */
.load-overlay {
position: fixed;
display: flex;
flex-flow: row;
align-items: center;
width: 95%;
margin-left: 2.5%;
height: 0;
z-index: 2000;
background-color: rgba(0, 0, 0, .5);
border-radius: 1rem;
animation: fadeOut .25s ease-in-out;
overflow: hidden;
}
.load-overlay h1 {
color: white;
background-color: rgba(0, 0, 0, .75);
margin-left: auto;
margin-right: auto;
border-radius: 1rem;
width: 50%;
padding: 1rem;
}
.load-overlay.htmx-request {
height: 80vh;
animation: fadeIn .25s ease-in-out;
}
@keyframes fadeIn {
0% {
opacity: 0;
height: 80vh;
}
100% {
opacity: 1;
height: 80vh;
}
}
@keyframes fadeOut {
0% {
opacity: 1;
height: 80vh;
}
99% {
opacity: 0;
height: 80vh;
}
100% {
opacity: 0;
height: 0;
}
}

View File

Before

Width:  |  Height:  |  Size: 10 KiB

After

Width:  |  Height:  |  Size: 10 KiB