Compare commits

...

5 Commits

33 changed files with 1294 additions and 1332 deletions

1
.gitignore vendored
View File

@ -2,3 +2,4 @@ _site/
.sass-cache/ .sass-cache/
.jekyll-cache/ .jekyll-cache/
.jekyll-metadata .jekyll-metadata
.gitattributes

View File

@ -7,7 +7,7 @@ source "https://rubygems.org"
# #
# This will help ensure the proper Jekyll version is running. # This will help ensure the proper Jekyll version is running.
# Happy Jekylling! # Happy Jekylling!
gem "jekyll", "~> 4.0.0" gem "jekyll", "~> 4.2.2"
# This is the default theme for new Jekyll sites. You may change this to anything you like. # This is the default theme for new Jekyll sites. You may change this to anything you like.
# gem "minima", "~> 2.5" # gem "minima", "~> 2.5"
@ -23,6 +23,7 @@ group :jekyll_plugins do
gem "jekyll-paginate-v2" gem "jekyll-paginate-v2"
gem 'jekyll_picture_tag', '~> 1.6' gem 'jekyll_picture_tag', '~> 1.6'
gem 'jekyll-strapi' gem 'jekyll-strapi'
gem 'jekyll-admin'
end end
# Windows and JRuby does not include zoneinfo files, so bundle the tzinfo-data gem # Windows and JRuby does not include zoneinfo files, so bundle the tzinfo-data gem

View File

@ -1,53 +1,58 @@
GEM GEM
remote: https://rubygems.org/ remote: https://rubygems.org/
specs: specs:
addressable (2.7.0) addressable (2.8.0)
public_suffix (>= 2.0.2, < 5.0) public_suffix (>= 2.0.2, < 5.0)
backports (3.23.0)
colorator (1.1.0) colorator (1.1.0)
concurrent-ruby (1.1.7) concurrent-ruby (1.1.10)
domain_name (0.5.20190701) domain_name (0.5.20190701)
unf (>= 0.0.5, < 1.0.0) unf (>= 0.0.5, < 1.0.0)
em-websocket (0.5.2) em-websocket (0.5.3)
eventmachine (>= 0.12.9) eventmachine (>= 0.12.9)
http_parser.rb (~> 0.6.0) http_parser.rb (~> 0)
eventmachine (1.2.7) eventmachine (1.2.7)
ffi (1.13.1) ffi (1.15.5)
forwardable-extended (2.6.0) forwardable-extended (2.6.0)
http (3.3.0) http (3.3.0)
addressable (~> 2.3) addressable (~> 2.3)
http-cookie (~> 1.0) http-cookie (~> 1.0)
http-form_data (~> 2.0) http-form_data (~> 2.0)
http_parser.rb (~> 0.6.0) http_parser.rb (~> 0.6.0)
http-cookie (1.0.3) http-cookie (1.0.4)
domain_name (~> 0.5) domain_name (~> 0.5)
http-form_data (2.3.0) http-form_data (2.3.0)
http_parser.rb (0.6.0) http_parser.rb (0.6.0)
i18n (1.8.5) i18n (1.10.0)
concurrent-ruby (~> 1.0) concurrent-ruby (~> 1.0)
jekyll (4.0.1) jekyll (4.2.2)
addressable (~> 2.4) addressable (~> 2.4)
colorator (~> 1.0) colorator (~> 1.0)
em-websocket (~> 0.5) em-websocket (~> 0.5)
i18n (>= 0.9.5, < 2) i18n (~> 1.0)
jekyll-sass-converter (~> 2.0) jekyll-sass-converter (~> 2.0)
jekyll-watch (~> 2.0) jekyll-watch (~> 2.0)
kramdown (~> 2.1) kramdown (~> 2.3)
kramdown-parser-gfm (~> 1.0) kramdown-parser-gfm (~> 1.0)
liquid (~> 4.0) liquid (~> 4.0)
mercenary (~> 0.3.3) mercenary (~> 0.4.0)
pathutil (~> 0.9) pathutil (~> 0.9)
rouge (~> 3.0) rouge (~> 3.0)
safe_yaml (~> 1.0) safe_yaml (~> 1.0)
terminal-table (~> 1.8) terminal-table (~> 2.0)
jekyll-admin (0.11.0)
jekyll (>= 3.7, < 5.0)
sinatra (~> 1.4)
sinatra-contrib (~> 1.4)
jekyll-archives (2.2.1) jekyll-archives (2.2.1)
jekyll (>= 3.6, < 5.0) jekyll (>= 3.6, < 5.0)
jekyll-feed (0.15.1) jekyll-feed (0.16.0)
jekyll (>= 3.7, < 5.0) jekyll (>= 3.7, < 5.0)
jekyll-menus (0.6.1) jekyll-menus (0.6.1)
jekyll (>= 3.6, < 5.0) jekyll (>= 3.6, < 5.0)
jekyll-paginate-v2 (3.0.0) jekyll-paginate-v2 (3.0.0)
jekyll (>= 3.0, < 5.0) jekyll (>= 3.0, < 5.0)
jekyll-sass-converter (2.1.0) jekyll-sass-converter (2.2.0)
sassc (> 2.0.1, < 3.0) sassc (> 2.0.1, < 3.0)
jekyll-strapi (0.1.3) jekyll-strapi (0.1.3)
http (~> 3.2) http (~> 3.2)
@ -57,57 +62,76 @@ GEM
nuggets nuggets
jekyll-watch (2.2.1) jekyll-watch (2.2.1)
listen (~> 3.0) listen (~> 3.0)
jekyll_picture_tag (1.12.0) jekyll_picture_tag (1.14.0)
addressable (~> 2.6) addressable (~> 2.6)
jekyll (< 5) jekyll (< 5)
mime-types (~> 3) mime-types (~> 3.0)
mini_magick (~> 4) mini_magick (~> 4.0)
objective_elements (~> 1.1.2) objective_elements (~> 1.1)
json (2.5.1) json (2.6.1)
kramdown (2.3.0) kramdown (2.4.0)
rexml rexml
kramdown-parser-gfm (1.1.0) kramdown-parser-gfm (1.1.0)
kramdown (~> 2.0) kramdown (~> 2.0)
liquid (4.0.3) liquid (4.0.3)
listen (3.3.1) listen (3.7.1)
rb-fsevent (~> 0.10, >= 0.10.3) rb-fsevent (~> 0.10, >= 0.10.3)
rb-inotify (~> 0.9, >= 0.9.10) rb-inotify (~> 0.9, >= 0.9.10)
mercenary (0.3.6) mercenary (0.4.0)
mime-types (3.3.1) mime-types (3.4.1)
mime-types-data (~> 3.2015) mime-types-data (~> 3.2015)
mime-types-data (3.2020.1104) mime-types-data (3.2022.0105)
mini_magick (4.11.0) mini_magick (4.11.0)
multi_json (1.15.0)
nuggets (1.6.0) nuggets (1.6.0)
objective_elements (1.1.2) objective_elements (1.1.2)
pathutil (0.16.2) pathutil (0.16.2)
forwardable-extended (~> 2.6) forwardable-extended (~> 2.6)
public_suffix (4.0.6) public_suffix (4.0.7)
rb-fsevent (0.10.4) rack (1.6.13)
rack-protection (1.5.5)
rack
rack-test (1.1.0)
rack (>= 1.0, < 3)
rb-fsevent (0.11.1)
rb-inotify (0.10.1) rb-inotify (0.10.1)
ffi (~> 1.0) ffi (~> 1.0)
rexml (3.2.4) rexml (3.2.5)
rouge (3.25.0) rouge (3.28.0)
safe_yaml (1.0.5) safe_yaml (1.0.5)
sassc (2.4.0) sassc (2.4.0)
ffi (~> 1.9) ffi (~> 1.9)
terminal-table (1.8.0) sinatra (1.4.8)
rack (~> 1.5)
rack-protection (~> 1.4)
tilt (>= 1.3, < 3)
sinatra-contrib (1.4.7)
backports (>= 2.0)
multi_json
rack-protection
rack-test
sinatra (~> 1.4.0)
tilt (>= 1.3, < 3)
terminal-table (2.0.0)
unicode-display_width (~> 1.1, >= 1.1.1) unicode-display_width (~> 1.1, >= 1.1.1)
thread_safe (0.3.6) thread_safe (0.3.6)
tzinfo (1.2.8) tilt (2.0.10)
tzinfo (1.2.9)
thread_safe (~> 0.1) thread_safe (~> 0.1)
tzinfo-data (1.2020.4) tzinfo-data (1.2022.1)
tzinfo (>= 1.0.0) tzinfo (>= 1.0.0)
unf (0.1.4) unf (0.1.4)
unf_ext unf_ext
unf_ext (0.0.7.7) unf_ext (0.0.8.1)
unicode-display_width (1.7.0) unicode-display_width (1.8.0)
wdm (0.1.1) wdm (0.1.1)
PLATFORMS PLATFORMS
ruby x86_64-linux-musl
DEPENDENCIES DEPENDENCIES
jekyll (~> 4.0.0) jekyll (~> 4.2.2)
jekyll-admin
jekyll-archives jekyll-archives
jekyll-feed (~> 0.12) jekyll-feed (~> 0.12)
jekyll-menus jekyll-menus
@ -120,4 +144,4 @@ DEPENDENCIES
wdm (~> 0.1.1) wdm (~> 0.1.1)
BUNDLED WITH BUNDLED WITH
2.1.4 2.2.24

View File

@ -37,8 +37,8 @@ No proprietary operating system dependencies required, only Docker Engine super
*All Ruby dependencies are created and stored in the Docker container. Simple, smooth and sweet :)* *All Ruby dependencies are created and stored in the Docker container. Simple, smooth and sweet :)*
# API's # API's
* Siteleaf CMS * Strapi CMS, Jekyll-Admin CMS
* Staticman with GitHub * ISSO (Comments)
* Snipcart with Stripe * Snipcart with Stripe
* Mailjet Newsletters * Mailjet Newsletters
* Algolia Search * Algolia Search

View File

@ -20,6 +20,7 @@
baseurl: "/" # the subpath of your site, e.g. /blog /galacticsociety.github.io baseurl: "/" # the subpath of your site, e.g. /blog /galacticsociety.github.io
url: "https://sharpetronics.github.io" # the base hostname & protocol for your site, e.g. https://sharpetronics.github.io url: "https://sharpetronics.github.io" # the base hostname & protocol for your site, e.g. https://sharpetronics.github.io
source: .
#Latent Semantic Indexing for similarity bewtween documents. #Latent Semantic Indexing for similarity bewtween documents.
lsi: true lsi: true
@ -67,6 +68,7 @@ picture:
# Build settings # Build settings
plugins: plugins:
- jekyll-feed #manually generated rss.xml https://jekyllrb.com/tutorials/convert-site-to-jekyll/#10-rss-feed - jekyll-feed #manually generated rss.xml https://jekyllrb.com/tutorials/convert-site-to-jekyll/#10-rss-feed
- jekyll-admin
- jekyll-strapi - jekyll-strapi
- jekyll-menus - jekyll-menus
- jekyll-archives - jekyll-archives

View File

@ -0,0 +1,6 @@
#Product list for all items for SharpeTronics
global-product:
tax: 6%
shipping: $5.00
delivery: 3-5 days
warranty: 30 days money back

View File

@ -1,166 +0,0 @@
#Product list for all items for SharpeTronics
global-product:
tax: 6%
shipping: $5.00
delivery: 3-5 days
warranty: 30 days money back
product-ten:
title: Peppermint Lip Balm
image: assets/images/Peppermint-Lip-Balm.jpg
description: Our all natural Peppermint lip balm was a great hit with our family & friends. We hope you enjoy it too!
excerpt: Our BEST SELLING lip balm - you'll love it!
category: Lip Balm
tag: Health
id: 201806
sku: 2020
quantity: 14
price: $5.00
weight: Peppermint
format: Physical
material: Wood, Steel
dimension: 15in x 35in
product-one:
title: Peppermint Lip Balm
image: assets/images/Peppermint-Lip-Balm.jpg
description: Our all natural Peppermint lip balm was a great hit with our family & friends. We hope you enjoy it too!
excerpt: Our BEST SELLING lip balm - you'll love it!
category: Lip Balm
tag: Health
id: 201806
sku: 2020
quantity: 14
price: $5.00
weight: Peppermint
format: Physical
material: Wood, Steel
dimension: 15in x 35in
product-nine:
title: Peppermint Lip Balm
image: assets/images/Peppermint-Lip-Balm.jpg
description: Our all natural Peppermint lip balm was a great hit with our family & friends. We hope you enjoy it too!
excerpt: Our BEST SELLING lip balm - you'll love it!
category: Lip Balm
tag: Health
id: 201806
sku: 2020
quantity: 14
price: $5.00
weight: Peppermint
format: Physical
material: Wood, Steel
dimension: 15in x 35in
product-two:
title: Peppermint Lip Balm
image: assets/images/Peppermint-Lip-Balm.jpg
description: Our all natural Peppermint lip balm was a great hit with our family & friends. We hope you enjoy it too!
excerpt: Our BEST SELLING lip balm - you'll love it!
category: Lip Balm
tag: Health
id: 201806
sku: 2020
quantity: 14
price: $5.00
weight: Peppermint
format: Physical
material: Wood, Steel
dimension: 15in x 35in
product-three:
title: Peppermint Lip Balm
image: assets/images/Peppermint-Lip-Balm.jpg
description: Our all natural Peppermint lip balm was a great hit with our family & friends. We hope you enjoy it too!
excerpt: Our BEST SELLING lip balm - you'll love it!
category: Lip Balm
tag: Health
id: 201806
sku: 2020
quantity: 14
price: $5.00
weight: Peppermint
format: Physical
material: Wood, Steel
dimension: 15in x 35in
product-four:
title: Peppermint Lip Balm
image: assets/images/Peppermint-Lip-Balm.jpg
description: Our all natural Peppermint lip balm was a great hit with our family & friends. We hope you enjoy it too!
excerpt: Our BEST SELLING lip balm - you'll love it!
category: Lip Balm
tag: Health
id: 201806
sku: 2020
quantity: 14
price: $5.00
weight: Peppermint
format: Physical
material: Wood, Steel
dimension: 15in x 35in
product-five:
title: Peppermint Lip Balm
image: assets/images/Peppermint-Lip-Balm.jpg
description: Our all natural Peppermint lip balm was a great hit with our family & friends. We hope you enjoy it too!
excerpt: Our BEST SELLING lip balm - you'll love it!
category: Lip Balm
tag: Health
id: 201806
sku: 2020
quantity: 14
price: $5.00
weight: Peppermint
format: Physical
material: Wood, Steel
dimension: 15in x 35in
product-six:
title: Peppermint Lip Balm
image: assets/images/Peppermint-Lip-Balm.jpg
description: Our all natural Peppermint lip balm was a great hit with our family & friends. We hope you enjoy it too!
excerpt: Our BEST SELLING lip balm - you'll love it!
category: Lip Balm
tag: Health
id: 201806
sku: 2020
quantity: 14
price: $5.00
weight: Peppermint
format: Physical
material: Wood, Steel
dimension: 15in x 35in
product-seven:
title: Peppermint Lip Balm
image: assets/images/Peppermint-Lip-Balm.jpg
description: Our all natural Peppermint lip balm was a great hit with our family & friends. We hope you enjoy it too!
excerpt: Our BEST SELLING lip balm - you'll love it!
category: Lip Balm
tag: Health
id: 201806
sku: 2020
quantity: 14
price: $5.00
weight: Peppermint
format: Physical
material: Wood, Steel
dimension: 15in x 35in
product-eight:
title: Peppermint Lip Balm
image: assets/images/Peppermint-Lip-Balm.jpg
description: Our all natural Peppermint lip balm was a great hit with our family & friends. We hope you enjoy it too!
excerpt: Our BEST SELLING lip balm - you'll love it!
category: Lip Balm
tag: Health
id: 201806
sku: 2020
quantity: 14
price: $5.00
weight: Peppermint
format: Physical
material: Wood, Steel
dimension: 15in x 35in

View File

@ -0,0 +1,15 @@
title: Cup
url: /products/2020-06-03-cup/
id: 201806
sku: 202055478373
image: assets/images/Peppermint-Lip-Balm.jpg
description: Our all natural Peppermint lip balm was a great hit with our family & friends. We hope you enjoy it too!
excerpt: Our BEST SELLING lip balm - you'll love it!
category: Lip Balm
tag: Health
quantity: 14
price: 125.00
weight: Peppermint
format: Physical
material: Wood, Steel
dimension: 15in x 35in

15
_data/products/sample.yml Normal file
View File

@ -0,0 +1,15 @@
title: Dragon
url: /products/2017-02-03-dragon/
id: 201806
sku: 202055478373
image: assets/images/Peppermint-Lip-Balm.jpg
description: Our all natural Peppermint lip balm was a great hit with our family & friends. We hope you enjoy it too!
excerpt: Our BEST SELLING lip balm - you'll love it!
category: Lip Balm
tag: Health
quantity: 14
price: 5.00
weight: Peppermint
format: Physical
material: Wood, Steel
dimension: 15in x 35in

View File

@ -10,7 +10,7 @@
<p class="copyright"> <p class="copyright">
&copy; 2020 SharpeTronics <a href="{{ site.data.global.creator_link }}" target="_blank"></a><br /> &copy; 2020 SharpeTronics <a href="{{ site.data.global.creator_link }}" target="_blank"></a><br />
<a href="/humans.txt" target="_blank">Imagined by humans</a>, <a href="https://jekyllrb.com/" target="_blank">built with Jekyll</a>, <a href="/humans.txt" target="_blank">Imagined by humans</a>, <a href="https://jekyllrb.com/" target="_blank">built with Jekyll</a>,
<a href="https://github.com/" target="_blank">hosted by GitHub</a><br /> <a href="https://git.sharpetronics.com/SharpeTronics/sharpetronics" target="_blank">hosted by SharpeTronics</a><br />
<!-- Creative Commons Attribution-NoDerivs 3.0 United States License --> <!-- Creative Commons Attribution-NoDerivs 3.0 United States License -->
This work is licensed under a <a rel="license" href="http://creativecommons.org/licenses/by-nc-sa/4.0/">Creative Commons Attribution-NonCommercial-ShareAlike 4.0 International License</a>. This work is licensed under a <a rel="license" href="http://creativecommons.org/licenses/by-nc-sa/4.0/">Creative Commons Attribution-NonCommercial-ShareAlike 4.0 International License</a>.
</p> </p>

View File

@ -1,70 +1,70 @@
// Reset. // Reset.
// Based on meyerweb.com/eric/tools/css/reset (v2.0 | 20110126 | License: public domain) // Based on meyerweb.com/eric/tools/css/reset (v2.0 | 20110126 | License: public domain)
html, body, div, span, applet, object, html, body, div, span, applet, object,
iframe, h1, h2, h3, h4, h5, h6, p, blockquote, iframe, h1, h2, h3, h4, h5, h6, p, blockquote,
pre, a, abbr, acronym, address, big, cite, pre, a, abbr, acronym, address, big, cite,
code, del, dfn, em, img, ins, kbd, q, s, samp, code, del, dfn, em, img, ins, kbd, q, s, samp,
small, strike, strong, sub, sup, tt, var, b, small, strike, strong, sub, sup, tt, var, b,
u, i, center, dl, dt, dd, ol, ul, li, fieldset, u, i, center, dl, dt, dd, ol, ul, li, fieldset,
form, label, legend, table, caption, tbody, form, label, legend, table, caption, tbody,
tfoot, thead, tr, th, td, article, aside, tfoot, thead, tr, th, td, article, aside,
canvas, details, embed, figure, figcaption, canvas, details, embed, figure, figcaption,
footer, header, hgroup, menu, nav, output, ruby, footer, header, hgroup, menu, nav, output, ruby,
section, summary, time, mark, audio, video { section, summary, time, mark, audio, video {
margin: 0; margin: 0;
padding: 0; padding: 0;
border: 0; border: 0;
font-size: 100%; font-size: 100%;
font: inherit; font: inherit;
vertical-align: baseline; vertical-align: baseline;
} }
article, aside, details, figcaption, figure, article, aside, details, figcaption, figure,
footer, header, hgroup, menu, nav, section { footer, header, hgroup, menu, nav, section {
display: block; display: block;
} }
body { body {
line-height: 1; line-height: 1;
} }
ol, ul { ol, ul {
list-style: none; list-style: none;
} }
blockquote, q { blockquote, q {
quotes: none; quotes: none;
&:before, &:before,
&:after { &:after {
content: ''; content: '';
content: none; content: none;
} }
} }
table { table {
border-collapse: collapse; border-collapse: collapse;
border-spacing: 0; border-spacing: 0;
} }
body { body {
-webkit-text-size-adjust: none; -webkit-text-size-adjust: none;
} }
mark { mark {
background-color: transparent; background-color: transparent;
color: inherit; color: inherit;
} }
input::-moz-focus-inner { input::-moz-focus-inner {
border: 0; border: 0;
padding: 0; padding: 0;
} }
input, select, textarea { input, select, textarea {
-moz-appearance: none; -moz-appearance: none;
-webkit-appearance: none; -webkit-appearance: none;
-ms-appearance: none; -ms-appearance: none;
appearance: none; appearance: none;
} }

View File

@ -1,95 +1,95 @@
/* Actions */ /* Actions */
ul.actions { ul.actions {
@include vendor('display', 'flex'); @include vendor('display', 'flex');
cursor: default; cursor: default;
list-style: none; list-style: none;
margin-left: (_size(element-margin) * -0.5); margin-left: (_size(element-margin) * -0.5);
padding-left: 0; padding-left: 0;
li { li {
padding: 0 0 0 (_size(element-margin) * 0.5); padding: 0 0 0 (_size(element-margin) * 0.5);
vertical-align: middle; vertical-align: middle;
} }
&.special { &.special {
@include vendor('justify-content', 'center'); @include vendor('justify-content', 'center');
width: 100%; width: 100%;
margin-left: 0; margin-left: 0;
li { li {
&:first-child { &:first-child {
padding-left: 0; padding-left: 0;
} }
} }
} }
&.stacked { &.stacked {
@include vendor('flex-direction', 'column'); @include vendor('flex-direction', 'column');
margin-left: 0; margin-left: 0;
li { li {
padding: (_size(element-margin) * 0.65) 0 0 0; padding: (_size(element-margin) * 0.65) 0 0 0;
&:first-child { &:first-child {
padding-top: 0; padding-top: 0;
} }
} }
} }
&.fit { &.fit {
width: calc(100% + #{_size(element-margin) * 0.5}); width: calc(100% + #{_size(element-margin) * 0.5});
li { li {
@include vendor('flex-grow', '1'); @include vendor('flex-grow', '1');
@include vendor('flex-shrink', '1'); @include vendor('flex-shrink', '1');
width: 100%; width: 100%;
> * { > * {
width: 100%; width: 100%;
} }
} }
&.stacked { &.stacked {
width: 100%; width: 100%;
} }
} }
@include breakpoint('<=xsmall') { @include breakpoint('<=xsmall') {
&:not(.fixed) { &:not(.fixed) {
@include vendor('flex-direction', 'column'); @include vendor('flex-direction', 'column');
margin-left: 0; margin-left: 0;
width: 100% !important; width: 100% !important;
li { li {
@include vendor('flex-grow', '1'); @include vendor('flex-grow', '1');
@include vendor('flex-shrink', '1'); @include vendor('flex-shrink', '1');
padding: (_size(element-margin) * 0.5) 0 0 0; padding: (_size(element-margin) * 0.5) 0 0 0;
text-align: center; text-align: center;
width: 100%; width: 100%;
> * { > * {
width: 100%; width: 100%;
} }
&:first-child { &:first-child {
padding-top: 0; padding-top: 0;
} }
input[type="submit"], input[type="submit"],
input[type="reset"], input[type="reset"],
input[type="button"], input[type="button"],
button, button,
.button { .button {
width: 100%; width: 100%;
&.icon { &.icon {
&:before { &:before {
margin-left: -0.5em; margin-left: -0.5em;
} }
} }
} }
} }
} }
} }
} }

View File

@ -1,25 +1,25 @@
/* Row */ /* Row */
.row { .row {
@include html-grid(2em); @include html-grid(2em);
@include breakpoint('<=xlarge') { @include breakpoint('<=xlarge') {
@include html-grid(2em, 'xlarge'); @include html-grid(2em, 'xlarge');
} }
@include breakpoint('<=large') { @include breakpoint('<=large') {
@include html-grid(1.5em, 'large'); @include html-grid(1.5em, 'large');
} }
@include breakpoint('<=medium') { @include breakpoint('<=medium') {
@include html-grid(1.5em, 'medium'); @include html-grid(1.5em, 'medium');
} }
@include breakpoint('<=small') { @include breakpoint('<=small') {
@include html-grid(1.25em, 'small'); @include html-grid(1.25em, 'small');
} }
@include breakpoint('<=xsmall') { @include breakpoint('<=xsmall') {
@include html-grid(1.25em, 'xsmall'); @include html-grid(1.25em, 'xsmall');
} }
} }

View File

@ -1,90 +1,90 @@
/// Removes a specific item from a list. /// Removes a specific item from a list.
/// @author Hugo Giraudel /// @author Hugo Giraudel
/// @param {list} $list List. /// @param {list} $list List.
/// @param {integer} $index Index. /// @param {integer} $index Index.
/// @return {list} Updated list. /// @return {list} Updated list.
@function remove-nth($list, $index) { @function remove-nth($list, $index) {
$result: null; $result: null;
@if type-of($index) != number { @if type-of($index) != number {
@warn "$index: #{quote($index)} is not a number for `remove-nth`."; @warn "$index: #{quote($index)} is not a number for `remove-nth`.";
} }
@else if $index == 0 { @else if $index == 0 {
@warn "List index 0 must be a non-zero integer for `remove-nth`."; @warn "List index 0 must be a non-zero integer for `remove-nth`.";
} }
@else if abs($index) > length($list) { @else if abs($index) > length($list) {
@warn "List index is #{$index} but list is only #{length($list)} item long for `remove-nth`."; @warn "List index is #{$index} but list is only #{length($list)} item long for `remove-nth`.";
} }
@else { @else {
$result: (); $result: ();
$index: if($index < 0, length($list) + $index + 1, $index); $index: if($index < 0, length($list) + $index + 1, $index);
@for $i from 1 through length($list) { @for $i from 1 through length($list) {
@if $i != $index { @if $i != $index {
$result: append($result, nth($list, $i)); $result: append($result, nth($list, $i));
} }
} }
} }
@return $result; @return $result;
} }
/// Gets a value from a map. /// Gets a value from a map.
/// @author Hugo Giraudel /// @author Hugo Giraudel
/// @param {map} $map Map. /// @param {map} $map Map.
/// @param {string} $keys Key(s). /// @param {string} $keys Key(s).
/// @return {string} Value. /// @return {string} Value.
@function val($map, $keys...) { @function val($map, $keys...) {
@if nth($keys, 1) == null { @if nth($keys, 1) == null {
$keys: remove-nth($keys, 1); $keys: remove-nth($keys, 1);
} }
@each $key in $keys { @each $key in $keys {
$map: map-get($map, $key); $map: map-get($map, $key);
} }
@return $map; @return $map;
} }
/// Gets a duration value. /// Gets a duration value.
/// @param {string} $keys Key(s). /// @param {string} $keys Key(s).
/// @return {string} Value. /// @return {string} Value.
@function _duration($keys...) { @function _duration($keys...) {
@return val($duration, $keys...); @return val($duration, $keys...);
} }
/// Gets a font value. /// Gets a font value.
/// @param {string} $keys Key(s). /// @param {string} $keys Key(s).
/// @return {string} Value. /// @return {string} Value.
@function _font($keys...) { @function _font($keys...) {
@return val($font, $keys...); @return val($font, $keys...);
} }
/// Gets a misc value. /// Gets a misc value.
/// @param {string} $keys Key(s). /// @param {string} $keys Key(s).
/// @return {string} Value. /// @return {string} Value.
@function _misc($keys...) { @function _misc($keys...) {
@return val($misc, $keys...); @return val($misc, $keys...);
} }
/// Gets a palette value. /// Gets a palette value.
/// @param {string} $keys Key(s). /// @param {string} $keys Key(s).
/// @return {string} Value. /// @return {string} Value.
@function _palette($keys...) { @function _palette($keys...) {
@return val($palette, $keys...); @return val($palette, $keys...);
} }
/// Gets a size value. /// Gets a size value.
/// @param {string} $keys Key(s). /// @param {string} $keys Key(s).
/// @return {string} Value. /// @return {string} Value.
@function _size($keys...) { @function _size($keys...) {
@return val($size, $keys...); @return val($size, $keys...);
} }

View File

@ -1,149 +1,149 @@
// html-grid.scss v1.0 | @ajlkn | MIT licensed */ // html-grid.scss v1.0 | @ajlkn | MIT licensed */
// Mixins. // Mixins.
/// Initializes the current element as an HTML grid. /// Initializes the current element as an HTML grid.
/// @param {mixed} $gutters Gutters (either a single number to set both column/row gutters, or a list to set them individually). /// @param {mixed} $gutters Gutters (either a single number to set both column/row gutters, or a list to set them individually).
/// @param {mixed} $suffix Column class suffix (optional; either a single suffix or a list). /// @param {mixed} $suffix Column class suffix (optional; either a single suffix or a list).
@mixin html-grid($gutters: 1.5em, $suffix: '') { @mixin html-grid($gutters: 1.5em, $suffix: '') {
// Initialize. // Initialize.
$cols: 12; $cols: 12;
$multipliers: 0, 0.25, 0.5, 1, 1.50, 2.00; $multipliers: 0, 0.25, 0.5, 1, 1.50, 2.00;
$unit: 100% / $cols; $unit: 100% / $cols;
// Suffixes. // Suffixes.
$suffixes: null; $suffixes: null;
@if (type-of($suffix) == 'list') { @if (type-of($suffix) == 'list') {
$suffixes: $suffix; $suffixes: $suffix;
} }
@else { @else {
$suffixes: ($suffix); $suffixes: ($suffix);
} }
// Gutters. // Gutters.
$guttersCols: null; $guttersCols: null;
$guttersRows: null; $guttersRows: null;
@if (type-of($gutters) == 'list') { @if (type-of($gutters) == 'list') {
$guttersCols: nth($gutters, 1); $guttersCols: nth($gutters, 1);
$guttersRows: nth($gutters, 2); $guttersRows: nth($gutters, 2);
} }
@else { @else {
$guttersCols: $gutters; $guttersCols: $gutters;
$guttersRows: 0; $guttersRows: 0;
} }
// Row. // Row.
display: flex; display: flex;
flex-wrap: wrap; flex-wrap: wrap;
box-sizing: border-box; box-sizing: border-box;
align-items: stretch; align-items: stretch;
// Columns. // Columns.
> * { > * {
box-sizing: border-box; box-sizing: border-box;
} }
// Gutters. // Gutters.
&.gtr-uniform { &.gtr-uniform {
> * { > * {
> :last-child { > :last-child {
margin-bottom: 0; margin-bottom: 0;
} }
} }
} }
// Alignment. // Alignment.
&.aln-left { &.aln-left {
justify-content: flex-start; justify-content: flex-start;
} }
&.aln-center { &.aln-center {
justify-content: center; justify-content: center;
} }
&.aln-right { &.aln-right {
justify-content: flex-end; justify-content: flex-end;
} }
&.aln-top { &.aln-top {
align-items: flex-start; align-items: flex-start;
} }
&.aln-middle { &.aln-middle {
align-items: center; align-items: center;
} }
&.aln-bottom { &.aln-bottom {
align-items: flex-end; align-items: flex-end;
} }
// Step through suffixes. // Step through suffixes.
@each $suffix in $suffixes { @each $suffix in $suffixes {
// Suffix. // Suffix.
@if ($suffix != '') { @if ($suffix != '') {
$suffix: '-' + $suffix; $suffix: '-' + $suffix;
} }
@else { @else {
$suffix: ''; $suffix: '';
} }
// Row. // Row.
// Important. // Important.
> .imp#{$suffix} { > .imp#{$suffix} {
order: -1; order: -1;
} }
// Columns, offsets. // Columns, offsets.
@for $i from 1 through $cols { @for $i from 1 through $cols {
> .col-#{$i}#{$suffix} { > .col-#{$i}#{$suffix} {
width: $unit * $i; width: $unit * $i;
} }
> .off-#{$i}#{$suffix} { > .off-#{$i}#{$suffix} {
margin-left: $unit * $i; margin-left: $unit * $i;
} }
} }
// Step through multipliers. // Step through multipliers.
@each $multiplier in $multipliers { @each $multiplier in $multipliers {
// Gutters. // Gutters.
$class: null; $class: null;
@if ($multiplier != 1) { @if ($multiplier != 1) {
$class: '.gtr-' + ($multiplier * 100); $class: '.gtr-' + ($multiplier * 100);
} }
&#{$class} { &#{$class} {
margin-top: ($guttersRows * $multiplier * -1); margin-top: ($guttersRows * $multiplier * -1);
margin-left: ($guttersCols * $multiplier * -1); margin-left: ($guttersCols * $multiplier * -1);
> * { > * {
padding: ($guttersRows * $multiplier) 0 0 ($guttersCols * $multiplier); padding: ($guttersRows * $multiplier) 0 0 ($guttersCols * $multiplier);
} }
// Uniform. // Uniform.
&.gtr-uniform { &.gtr-uniform {
margin-top: $guttersCols * $multiplier * -1; margin-top: $guttersCols * $multiplier * -1;
> * { > * {
padding-top: $guttersCols * $multiplier; padding-top: $guttersCols * $multiplier;
} }
} }
} }
} }
} }
} }

View File

@ -1,78 +1,78 @@
/// Makes an element's :before pseudoelement a FontAwesome icon. /// Makes an element's :before pseudoelement a FontAwesome icon.
/// @param {string} $content Optional content value to use. /// @param {string} $content Optional content value to use.
/// @param {string} $category Optional category to use. /// @param {string} $category Optional category to use.
/// @param {string} $where Optional pseudoelement to target (before or after). /// @param {string} $where Optional pseudoelement to target (before or after).
@mixin icon($content: false, $category: regular, $where: before) { @mixin icon($content: false, $category: regular, $where: before) {
text-decoration: none; text-decoration: none;
&:#{$where} { &:#{$where} {
@if $content { @if $content {
content: $content; content: $content;
} }
-moz-osx-font-smoothing: grayscale; -moz-osx-font-smoothing: grayscale;
-webkit-font-smoothing: antialiased; -webkit-font-smoothing: antialiased;
display: inline-block; display: inline-block;
font-style: normal; font-style: normal;
font-variant: normal; font-variant: normal;
text-rendering: auto; text-rendering: auto;
line-height: 1; line-height: 1;
text-transform: none !important; text-transform: none !important;
@if ($category == brands) { @if ($category == brands) {
font-family: 'Font Awesome 5 Brands'; font-family: 'Font Awesome 5 Brands';
} }
@elseif ($category == solid) { @elseif ($category == solid) {
font-family: 'Font Awesome 5 Free'; font-family: 'Font Awesome 5 Free';
font-weight: 900; font-weight: 900;
} }
@else { @else {
font-family: 'Font Awesome 5 Free'; font-family: 'Font Awesome 5 Free';
font-weight: 400; font-weight: 400;
} }
} }
} }
/// Applies padding to an element, taking the current element-margin value into account. /// Applies padding to an element, taking the current element-margin value into account.
/// @param {mixed} $tb Top/bottom padding. /// @param {mixed} $tb Top/bottom padding.
/// @param {mixed} $lr Left/right padding. /// @param {mixed} $lr Left/right padding.
/// @param {list} $pad Optional extra padding (in the following order top, right, bottom, left) /// @param {list} $pad Optional extra padding (in the following order top, right, bottom, left)
/// @param {bool} $important If true, adds !important. /// @param {bool} $important If true, adds !important.
@mixin padding($tb, $lr, $pad: (0,0,0,0), $important: null) { @mixin padding($tb, $lr, $pad: (0,0,0,0), $important: null) {
@if $important { @if $important {
$important: '!important'; $important: '!important';
} }
$x: 0.1em; $x: 0.1em;
@if unit(_size(element-margin)) == 'rem' { @if unit(_size(element-margin)) == 'rem' {
$x: 0.1rem; $x: 0.1rem;
} }
padding: ($tb + nth($pad,1)) ($lr + nth($pad,2)) max($x, $tb - _size(element-margin) + nth($pad,3)) ($lr + nth($pad,4)) #{$important}; padding: ($tb + nth($pad,1)) ($lr + nth($pad,2)) max($x, $tb - _size(element-margin) + nth($pad,3)) ($lr + nth($pad,4)) #{$important};
} }
/// Encodes a SVG data URL so IE doesn't choke (via codepen.io/jakob-e/pen/YXXBrp). /// Encodes a SVG data URL so IE doesn't choke (via codepen.io/jakob-e/pen/YXXBrp).
/// @param {string} $svg SVG data URL. /// @param {string} $svg SVG data URL.
/// @return {string} Encoded SVG data URL. /// @return {string} Encoded SVG data URL.
@function svg-url($svg) { @function svg-url($svg) {
$svg: str-replace($svg, '"', '\''); $svg: str-replace($svg, '"', '\'');
$svg: str-replace($svg, '%', '%25'); $svg: str-replace($svg, '%', '%25');
$svg: str-replace($svg, '<', '%3C'); $svg: str-replace($svg, '<', '%3C');
$svg: str-replace($svg, '>', '%3E'); $svg: str-replace($svg, '>', '%3E');
$svg: str-replace($svg, '&', '%26'); $svg: str-replace($svg, '&', '%26');
$svg: str-replace($svg, '#', '%23'); $svg: str-replace($svg, '#', '%23');
$svg: str-replace($svg, '{', '%7B'); $svg: str-replace($svg, '{', '%7B');
$svg: str-replace($svg, '}', '%7D'); $svg: str-replace($svg, '}', '%7D');
$svg: str-replace($svg, ';', '%3B'); $svg: str-replace($svg, ';', '%3B');
@return url("data:image/svg+xml;charset=utf8,#{$svg}"); @return url("data:image/svg+xml;charset=utf8,#{$svg}");
} }

13
api/pages.json Normal file
View File

@ -0,0 +1,13 @@
---
layout: none
permalink: /api/pages/
---
[
{%- for page in site.pages %}
{
"title": {{- page.title | jsonify }},
"url": {{- page.url | jsonify }}
}
{% unless forloop.last %},{% endunless %}
{% endfor -%}
]

22
api/posts.json Normal file
View File

@ -0,0 +1,22 @@
---
layout: none
permalink: /api/posts/
---
[
{%- for post in site.posts %}
{
"id": {{- post.id | jsonify -}},
"url": {{- post.url | jsonify }},
"image": {{- post.banner_image | jsonify -}},
"image-alt": {{- post.banner_image_alt | jsonify -}},
"sub_heading":{{- post.sub_heading | jsonify -}},
"title": {{- post.title | jsonify }},
"author": {{- post.author | jsonify }},
"date": {{- post.date | jsonify }},
"tags": {{- post.tags | jsonify }},
"categories": {{- post.categories | jsonify }},
"content": {{- post.content | jsonify }}
}
{% unless forloop.last %},{% endunless %}
{% endfor -%}
]

15
api/products.json Normal file
View File

@ -0,0 +1,15 @@
---
layout: none
permalink: /api/products/
---
[
{%- for product_hash in site.data.products %}
{% assign product = product_hash[1] %}
{
"title": {{- product.title | jsonify }},
"url": {{- product.url | jsonify }},
"price": {{- product.price | jsonify }}
}
{% unless forloop.last %},{% endunless %}
{% endfor -%}
]

View File

@ -1,2 +1,2 @@
/* breakpoints.js v1.0 | @ajlkn | MIT licensed */ /* breakpoints.js v1.0 | @ajlkn | MIT licensed */
var breakpoints=function(){"use strict";function e(e){t.init(e)}var t={list:null,media:{},events:[],init:function(e){t.list=e,window.addEventListener("resize",t.poll),window.addEventListener("orientationchange",t.poll),window.addEventListener("load",t.poll),window.addEventListener("fullscreenchange",t.poll)},active:function(e){var n,a,s,i,r,d,c;if(!(e in t.media)){if(">="==e.substr(0,2)?(a="gte",n=e.substr(2)):"<="==e.substr(0,2)?(a="lte",n=e.substr(2)):">"==e.substr(0,1)?(a="gt",n=e.substr(1)):"<"==e.substr(0,1)?(a="lt",n=e.substr(1)):"!"==e.substr(0,1)?(a="not",n=e.substr(1)):(a="eq",n=e),n&&n in t.list)if(i=t.list[n],Array.isArray(i)){if(r=parseInt(i[0]),d=parseInt(i[1]),isNaN(r)){if(isNaN(d))return;c=i[1].substr(String(d).length)}else c=i[0].substr(String(r).length);if(isNaN(r))switch(a){case"gte":s="screen";break;case"lte":s="screen and (max-width: "+d+c+")";break;case"gt":s="screen and (min-width: "+(d+1)+c+")";break;case"lt":s="screen and (max-width: -1px)";break;case"not":s="screen and (min-width: "+(d+1)+c+")";break;default:s="screen and (max-width: "+d+c+")"}else if(isNaN(d))switch(a){case"gte":s="screen and (min-width: "+r+c+")";break;case"lte":s="screen";break;case"gt":s="screen and (max-width: -1px)";break;case"lt":s="screen and (max-width: "+(r-1)+c+")";break;case"not":s="screen and (max-width: "+(r-1)+c+")";break;default:s="screen and (min-width: "+r+c+")"}else switch(a){case"gte":s="screen and (min-width: "+r+c+")";break;case"lte":s="screen and (max-width: "+d+c+")";break;case"gt":s="screen and (min-width: "+(d+1)+c+")";break;case"lt":s="screen and (max-width: "+(r-1)+c+")";break;case"not":s="screen and (max-width: "+(r-1)+c+"), screen and (min-width: "+(d+1)+c+")";break;default:s="screen and (min-width: "+r+c+") and (max-width: "+d+c+")"}}else s="("==i.charAt(0)?"screen and "+i:i;t.media[e]=!!s&&s}return t.media[e]!==!1&&window.matchMedia(t.media[e]).matches},on:function(e,n){t.events.push({query:e,handler:n,state:!1}),t.active(e)&&n()},poll:function(){var e,n;for(e=0;e<t.events.length;e++)n=t.events[e],t.active(n.query)?n.state||(n.state=!0,n.handler()):n.state&&(n.state=!1)}};return e._=t,e.on=function(e,n){t.on(e,n)},e.active=function(e){return t.active(e)},e}();!function(e,t){"function"==typeof define&&define.amd?define([],t):"object"==typeof exports?module.exports=t():e.breakpoints=t()}(this,function(){return breakpoints}); var breakpoints=function(){"use strict";function e(e){t.init(e)}var t={list:null,media:{},events:[],init:function(e){t.list=e,window.addEventListener("resize",t.poll),window.addEventListener("orientationchange",t.poll),window.addEventListener("load",t.poll),window.addEventListener("fullscreenchange",t.poll)},active:function(e){var n,a,s,i,r,d,c;if(!(e in t.media)){if(">="==e.substr(0,2)?(a="gte",n=e.substr(2)):"<="==e.substr(0,2)?(a="lte",n=e.substr(2)):">"==e.substr(0,1)?(a="gt",n=e.substr(1)):"<"==e.substr(0,1)?(a="lt",n=e.substr(1)):"!"==e.substr(0,1)?(a="not",n=e.substr(1)):(a="eq",n=e),n&&n in t.list)if(i=t.list[n],Array.isArray(i)){if(r=parseInt(i[0]),d=parseInt(i[1]),isNaN(r)){if(isNaN(d))return;c=i[1].substr(String(d).length)}else c=i[0].substr(String(r).length);if(isNaN(r))switch(a){case"gte":s="screen";break;case"lte":s="screen and (max-width: "+d+c+")";break;case"gt":s="screen and (min-width: "+(d+1)+c+")";break;case"lt":s="screen and (max-width: -1px)";break;case"not":s="screen and (min-width: "+(d+1)+c+")";break;default:s="screen and (max-width: "+d+c+")"}else if(isNaN(d))switch(a){case"gte":s="screen and (min-width: "+r+c+")";break;case"lte":s="screen";break;case"gt":s="screen and (max-width: -1px)";break;case"lt":s="screen and (max-width: "+(r-1)+c+")";break;case"not":s="screen and (max-width: "+(r-1)+c+")";break;default:s="screen and (min-width: "+r+c+")"}else switch(a){case"gte":s="screen and (min-width: "+r+c+")";break;case"lte":s="screen and (max-width: "+d+c+")";break;case"gt":s="screen and (min-width: "+(d+1)+c+")";break;case"lt":s="screen and (max-width: "+(r-1)+c+")";break;case"not":s="screen and (max-width: "+(r-1)+c+"), screen and (min-width: "+(d+1)+c+")";break;default:s="screen and (min-width: "+r+c+") and (max-width: "+d+c+")"}}else s="("==i.charAt(0)?"screen and "+i:i;t.media[e]=!!s&&s}return t.media[e]!==!1&&window.matchMedia(t.media[e]).matches},on:function(e,n){t.events.push({query:e,handler:n,state:!1}),t.active(e)&&n()},poll:function(){var e,n;for(e=0;e<t.events.length;e++)n=t.events[e],t.active(n.query)?n.state||(n.state=!0,n.handler()):n.state&&(n.state=!1)}};return e._=t,e.on=function(e,n){t.on(e,n)},e.active=function(e){return t.active(e)},e}();!function(e,t){"function"==typeof define&&define.amd?define([],t):"object"==typeof exports?module.exports=t():e.breakpoints=t()}(this,function(){return breakpoints});

View File

@ -1,2 +1,2 @@
/* browser.js v1.0 | @ajlkn | MIT licensed */ /* browser.js v1.0 | @ajlkn | MIT licensed */
var browser=function(){"use strict";var e={name:null,version:null,os:null,osVersion:null,touch:null,mobile:null,_canUse:null,canUse:function(n){e._canUse||(e._canUse=document.createElement("div"));var o=e._canUse.style,r=n.charAt(0).toUpperCase()+n.slice(1);return n in o||"Moz"+r in o||"Webkit"+r in o||"O"+r in o||"ms"+r in o},init:function(){var n,o,r,i,t=navigator.userAgent;for(n="other",o=0,r=[["firefox",/Firefox\/([0-9\.]+)/],["bb",/BlackBerry.+Version\/([0-9\.]+)/],["bb",/BB[0-9]+.+Version\/([0-9\.]+)/],["opera",/OPR\/([0-9\.]+)/],["opera",/Opera\/([0-9\.]+)/],["edge",/Edge\/([0-9\.]+)/],["safari",/Version\/([0-9\.]+).+Safari/],["chrome",/Chrome\/([0-9\.]+)/],["ie",/MSIE ([0-9]+)/],["ie",/Trident\/.+rv:([0-9]+)/]],i=0;i<r.length;i++)if(t.match(r[i][1])){n=r[i][0],o=parseFloat(RegExp.$1);break}for(e.name=n,e.version=o,n="other",o=0,r=[["ios",/([0-9_]+) like Mac OS X/,function(e){return e.replace("_",".").replace("_","")}],["ios",/CPU like Mac OS X/,function(e){return 0}],["wp",/Windows Phone ([0-9\.]+)/,null],["android",/Android ([0-9\.]+)/,null],["mac",/Macintosh.+Mac OS X ([0-9_]+)/,function(e){return e.replace("_",".").replace("_","")}],["windows",/Windows NT ([0-9\.]+)/,null],["bb",/BlackBerry.+Version\/([0-9\.]+)/,null],["bb",/BB[0-9]+.+Version\/([0-9\.]+)/,null],["linux",/Linux/,null],["bsd",/BSD/,null],["unix",/X11/,null]],i=0;i<r.length;i++)if(t.match(r[i][1])){n=r[i][0],o=parseFloat(r[i][2]?r[i][2](RegExp.$1):RegExp.$1);break}e.os=n,e.osVersion=o,e.touch="wp"==e.os?navigator.msMaxTouchPoints>0:!!("ontouchstart"in window),e.mobile="wp"==e.os||"android"==e.os||"ios"==e.os||"bb"==e.os}};return e.init(),e}();!function(e,n){"function"==typeof define&&define.amd?define([],n):"object"==typeof exports?module.exports=n():e.browser=n()}(this,function(){return browser}); var browser=function(){"use strict";var e={name:null,version:null,os:null,osVersion:null,touch:null,mobile:null,_canUse:null,canUse:function(n){e._canUse||(e._canUse=document.createElement("div"));var o=e._canUse.style,r=n.charAt(0).toUpperCase()+n.slice(1);return n in o||"Moz"+r in o||"Webkit"+r in o||"O"+r in o||"ms"+r in o},init:function(){var n,o,r,i,t=navigator.userAgent;for(n="other",o=0,r=[["firefox",/Firefox\/([0-9\.]+)/],["bb",/BlackBerry.+Version\/([0-9\.]+)/],["bb",/BB[0-9]+.+Version\/([0-9\.]+)/],["opera",/OPR\/([0-9\.]+)/],["opera",/Opera\/([0-9\.]+)/],["edge",/Edge\/([0-9\.]+)/],["safari",/Version\/([0-9\.]+).+Safari/],["chrome",/Chrome\/([0-9\.]+)/],["ie",/MSIE ([0-9]+)/],["ie",/Trident\/.+rv:([0-9]+)/]],i=0;i<r.length;i++)if(t.match(r[i][1])){n=r[i][0],o=parseFloat(RegExp.$1);break}for(e.name=n,e.version=o,n="other",o=0,r=[["ios",/([0-9_]+) like Mac OS X/,function(e){return e.replace("_",".").replace("_","")}],["ios",/CPU like Mac OS X/,function(e){return 0}],["wp",/Windows Phone ([0-9\.]+)/,null],["android",/Android ([0-9\.]+)/,null],["mac",/Macintosh.+Mac OS X ([0-9_]+)/,function(e){return e.replace("_",".").replace("_","")}],["windows",/Windows NT ([0-9\.]+)/,null],["bb",/BlackBerry.+Version\/([0-9\.]+)/,null],["bb",/BB[0-9]+.+Version\/([0-9\.]+)/,null],["linux",/Linux/,null],["bsd",/BSD/,null],["unix",/X11/,null]],i=0;i<r.length;i++)if(t.match(r[i][1])){n=r[i][0],o=parseFloat(r[i][2]?r[i][2](RegExp.$1):RegExp.$1);break}e.os=n,e.osVersion=o,e.touch="wp"==e.os?navigator.msMaxTouchPoints>0:!!("ontouchstart"in window),e.mobile="wp"==e.os||"android"==e.os||"ios"==e.os||"bb"==e.os}};return e.init(),e}();!function(e,n){"function"==typeof define&&define.amd?define([],n):"object"==typeof exports?module.exports=n():e.browser=n()}(this,function(){return browser});

View File

@ -1,2 +1,2 @@
/* jquery.scrollex v0.2.1 | (c) @ajlkn | github.com/ajlkn/jquery.scrollex | MIT licensed */ /* jquery.scrollex v0.2.1 | (c) @ajlkn | github.com/ajlkn/jquery.scrollex | MIT licensed */
!function(t){function e(t,e,n){return"string"==typeof t&&("%"==t.slice(-1)?t=parseInt(t.substring(0,t.length-1))/100*e:"vh"==t.slice(-2)?t=parseInt(t.substring(0,t.length-2))/100*n:"px"==t.slice(-2)&&(t=parseInt(t.substring(0,t.length-2)))),t}var n=t(window),i=1,o={};n.on("scroll",function(){var e=n.scrollTop();t.map(o,function(t){window.clearTimeout(t.timeoutId),t.timeoutId=window.setTimeout(function(){t.handler(e)},t.options.delay)})}).on("load",function(){n.trigger("scroll")}),jQuery.fn.scrollex=function(l){var s=t(this);if(0==this.length)return s;if(this.length>1){for(var r=0;r<this.length;r++)t(this[r]).scrollex(l);return s}if(s.data("_scrollexId"))return s;var a,u,h,c,p;switch(a=i++,u=jQuery.extend({top:0,bottom:0,delay:0,mode:"default",enter:null,leave:null,initialize:null,terminate:null,scroll:null},l),u.mode){case"top":h=function(t,e,n,i,o){return t>=i&&o>=t};break;case"bottom":h=function(t,e,n,i,o){return n>=i&&o>=n};break;case"middle":h=function(t,e,n,i,o){return e>=i&&o>=e};break;case"top-only":h=function(t,e,n,i,o){return i>=t&&n>=i};break;case"bottom-only":h=function(t,e,n,i,o){return n>=o&&o>=t};break;default:case"default":h=function(t,e,n,i,o){return n>=i&&o>=t}}return c=function(t){var i,o,l,s,r,a,u=this.state,h=!1,c=this.$element.offset();i=n.height(),o=t+i/2,l=t+i,s=this.$element.outerHeight(),r=c.top+e(this.options.top,s,i),a=c.top+s-e(this.options.bottom,s,i),h=this.test(t,o,l,r,a),h!=u&&(this.state=h,h?this.options.enter&&this.options.enter.apply(this.element):this.options.leave&&this.options.leave.apply(this.element)),this.options.scroll&&this.options.scroll.apply(this.element,[(o-r)/(a-r)])},p={id:a,options:u,test:h,handler:c,state:null,element:this,$element:s,timeoutId:null},o[a]=p,s.data("_scrollexId",p.id),p.options.initialize&&p.options.initialize.apply(this),s},jQuery.fn.unscrollex=function(){var e=t(this);if(0==this.length)return e;if(this.length>1){for(var n=0;n<this.length;n++)t(this[n]).unscrollex();return e}var i,l;return(i=e.data("_scrollexId"))?(l=o[i],window.clearTimeout(l.timeoutId),delete o[i],e.removeData("_scrollexId"),l.options.terminate&&l.options.terminate.apply(this),e):e}}(jQuery); !function(t){function e(t,e,n){return"string"==typeof t&&("%"==t.slice(-1)?t=parseInt(t.substring(0,t.length-1))/100*e:"vh"==t.slice(-2)?t=parseInt(t.substring(0,t.length-2))/100*n:"px"==t.slice(-2)&&(t=parseInt(t.substring(0,t.length-2)))),t}var n=t(window),i=1,o={};n.on("scroll",function(){var e=n.scrollTop();t.map(o,function(t){window.clearTimeout(t.timeoutId),t.timeoutId=window.setTimeout(function(){t.handler(e)},t.options.delay)})}).on("load",function(){n.trigger("scroll")}),jQuery.fn.scrollex=function(l){var s=t(this);if(0==this.length)return s;if(this.length>1){for(var r=0;r<this.length;r++)t(this[r]).scrollex(l);return s}if(s.data("_scrollexId"))return s;var a,u,h,c,p;switch(a=i++,u=jQuery.extend({top:0,bottom:0,delay:0,mode:"default",enter:null,leave:null,initialize:null,terminate:null,scroll:null},l),u.mode){case"top":h=function(t,e,n,i,o){return t>=i&&o>=t};break;case"bottom":h=function(t,e,n,i,o){return n>=i&&o>=n};break;case"middle":h=function(t,e,n,i,o){return e>=i&&o>=e};break;case"top-only":h=function(t,e,n,i,o){return i>=t&&n>=i};break;case"bottom-only":h=function(t,e,n,i,o){return n>=o&&o>=t};break;default:case"default":h=function(t,e,n,i,o){return n>=i&&o>=t}}return c=function(t){var i,o,l,s,r,a,u=this.state,h=!1,c=this.$element.offset();i=n.height(),o=t+i/2,l=t+i,s=this.$element.outerHeight(),r=c.top+e(this.options.top,s,i),a=c.top+s-e(this.options.bottom,s,i),h=this.test(t,o,l,r,a),h!=u&&(this.state=h,h?this.options.enter&&this.options.enter.apply(this.element):this.options.leave&&this.options.leave.apply(this.element)),this.options.scroll&&this.options.scroll.apply(this.element,[(o-r)/(a-r)])},p={id:a,options:u,test:h,handler:c,state:null,element:this,$element:s,timeoutId:null},o[a]=p,s.data("_scrollexId",p.id),p.options.initialize&&p.options.initialize.apply(this),s},jQuery.fn.unscrollex=function(){var e=t(this);if(0==this.length)return e;if(this.length>1){for(var n=0;n<this.length;n++)t(this[n]).unscrollex();return e}var i,l;return(i=e.data("_scrollexId"))?(l=o[i],window.clearTimeout(l.timeoutId),delete o[i],e.removeData("_scrollexId"),l.options.terminate&&l.options.terminate.apply(this),e):e}}(jQuery);

View File

@ -1,2 +1,2 @@
/* jquery.scrolly v1.0.0-dev | (c) @ajlkn | MIT licensed */ /* jquery.scrolly v1.0.0-dev | (c) @ajlkn | MIT licensed */
(function(e){function u(s,o){var u,a,f;if((u=e(s))[t]==0)return n;a=u[i]()[r];switch(o.anchor){case"middle":f=a-(e(window).height()-u.outerHeight())/2;break;default:case r:f=Math.max(a,0)}return typeof o[i]=="function"?f-=o[i]():f-=o[i],f}var t="length",n=null,r="top",i="offset",s="click.scrolly",o=e(window);e.fn.scrolly=function(i){var o,a,f,l,c=e(this);if(this[t]==0)return c;if(this[t]>1){for(o=0;o<this[t];o++)e(this[o]).scrolly(i);return c}l=n,f=c.attr("href");if(f.charAt(0)!="#"||f[t]<2)return c;a=jQuery.extend({anchor:r,easing:"swing",offset:0,parent:e("body,html"),pollOnce:!1,speed:1e3},i),a.pollOnce&&(l=u(f,a)),c.off(s).on(s,function(e){var t=l!==n?l:u(f,a);t!==n&&(e.preventDefault(),a.parent.stop().animate({scrollTop:t},a.speed,a.easing))})}})(jQuery); (function(e){function u(s,o){var u,a,f;if((u=e(s))[t]==0)return n;a=u[i]()[r];switch(o.anchor){case"middle":f=a-(e(window).height()-u.outerHeight())/2;break;default:case r:f=Math.max(a,0)}return typeof o[i]=="function"?f-=o[i]():f-=o[i],f}var t="length",n=null,r="top",i="offset",s="click.scrolly",o=e(window);e.fn.scrolly=function(i){var o,a,f,l,c=e(this);if(this[t]==0)return c;if(this[t]>1){for(o=0;o<this[t];o++)e(this[o]).scrolly(i);return c}l=n,f=c.attr("href");if(f.charAt(0)!="#"||f[t]<2)return c;a=jQuery.extend({anchor:r,easing:"swing",offset:0,parent:e("body,html"),pollOnce:!1,speed:1e3},i),a.pollOnce&&(l=u(f,a)),c.off(s).on(s,function(e){var t=l!==n?l:u(f,a);t!==n&&(e.preventDefault(),a.parent.stop().animate({scrollTop:t},a.speed,a.easing))})}})(jQuery);

File diff suppressed because it is too large Load Diff

View File

@ -4,7 +4,7 @@ layout: journal_single
author: Charles #case sensitive, please use capitalization for names. author: Charles #case sensitive, please use capitalization for names.
title: Privacy Policy title: Privacy Policy
sub_heading: Maecenas faucibus mollis interdum. Vivamus sagittis lacus sub_heading: Your data is always yours.
banner_image: "/assets/images/pic01.jpg" #Size of banner_image 840x341 banner_image: "/assets/images/pic01.jpg" #Size of banner_image 840x341
banner_image_alt: "privacy policy" banner_image_alt: "privacy policy"

View File

@ -4,7 +4,7 @@ layout: journal_single
author: Charles #case sensitive, please use capitalization for names. author: Charles #case sensitive, please use capitalization for names.
title: Terms & Conditions title: Terms & Conditions
sub_heading: Maecenas faucibus mollis interdum. Vivamus sagittis lacus sub_heading: Our rules and regulations.
banner_image: "/assets/images/pic01.jpg" #Size of banner_image 840x341 banner_image: "/assets/images/pic01.jpg" #Size of banner_image 840x341
banner_image_alt: "terms and conditions" banner_image_alt: "terms and conditions"

View File

@ -36,13 +36,17 @@ For this tutorial, we will launch a secure SSL NGINX web server for your website
Let's Begin! We begin by installing nginx, certbot and verifying versions Strapi needs. Keep in mind, if you are reading this from the future, the versions will change. Let's Begin! We begin by installing nginx, certbot and verifying versions Strapi needs. Keep in mind, if you are reading this from the future, the versions will change.
### Update System ### Update System
```sudo apt update``` ```sudo apt update```
### Install Nginx Certbot Packages ### Install Nginx Certbot Packages
```sudo apt install certbot python3-certbot-nginx``
```sudo apt install certbot python3-certbot-nginx```
### Install NGINX & verify version ### Install NGINX & verify version
```sudo apt install nginx``` ```sudo apt install nginx```
```node -v && nginx -v``` ```node -v && nginx -v```
**Tip:** Strapi recommends nodejs v14, but v12 works. **Tip:** Strapi recommends nodejs v14, but v12 works.
@ -54,10 +58,13 @@ Let's Begin! We begin by installing nginx, certbot and verifying versions Strapi
Next, we will configure your newly installed Nginx server. By default the configurations are located at: /etc/nginx/ & /etc/nginx/sites-available/. To keep things tidy and organized, we create a new api.example.org conf for each domain we are publicly facing to WWW. Next, we will configure your newly installed Nginx server. By default the configurations are located at: /etc/nginx/ & /etc/nginx/sites-available/. To keep things tidy and organized, we create a new api.example.org conf for each domain we are publicly facing to WWW.
### Make Directory & Copy Default HTML page ### Make Directory & Copy Default HTML page
```sudo mkdir -p /var/www/api.example.org/html/``` ```sudo mkdir -p /var/www/api.example.org/html/```
```sudo cp -R /var/www/html/index.nginx-debian.html /var/www/api.example.org/html/index.html``` ```sudo cp -R /var/www/html/index.nginx-debian.html /var/www/api.example.org/html/index.html```
### Duplicate Default Config ### Duplicate Default Config
```sudo cp /etc/nginx/sites-available/default /etc/nginx/sites-available/api.example.org``` ```sudo cp /etc/nginx/sites-available/default /etc/nginx/sites-available/api.example.org```
### Update NGINX api.example.org Config File ### Update NGINX api.example.org Config File
@ -131,16 +138,21 @@ We run the automated tool Certbot and create all the needed files and update our
### Run Certbot ### Run Certbot
```sudo certbot --nginx``` ```sudo certbot --nginx```
```Choose api.example.org for the site to create certs. for.``` ```Choose api.example.org for the site to create certs. for.```
```Choose option 1 to disable auto redirect HTTP traffic to HTTPS since we already redirected the traffic manually.``` ```Choose option 1 to disable auto redirect HTTP traffic to HTTPS since we already redirected the traffic manually.```
**Note** sudo certbot renew --dry-run will test for automatic renewal for your certs. [Certbot Insturctions] **Note** sudo certbot renew --dry-run will test for automatic renewal for your certs. [Certbot Insturctions]
### Verify api.example.org Updated with Correct Domain ### Verify api.example.org Updated with Correct Domain
```sudo nano /etc/nginx/sites-enabled/api.example.org``` ```sudo nano /etc/nginx/sites-enabled/api.example.org```
### Test Config & Restart Nginx ### Test Config & Restart Nginx
```sudo nginx -t``` ```sudo nginx -t```
```sudo systemctl restart nginx``` ```sudo systemctl restart nginx```
## Firewall Configuration ## Firewall Configuration
@ -148,10 +160,12 @@ Allow public to connect via HTTPS, we need to open up ports 80 & 443 (HTTP & HTT
### Allow UFW Ports for Public Traffic ### Allow UFW Ports for Public Traffic
```sudo ufw allow HTTPS``` ```sudo ufw allow HTTPS```
```sudo ufw allow HTTP``` ```sudo ufw allow HTTP```
### Verify Status & Reload UFW ### Verify Status & Reload UFW
```sudo ufw status``` ```sudo ufw status```
```sudo ufw reload``` ```sudo ufw reload```
**Tip** sudo ufw allow 'Nginx Full' opens both port 80 & 443 (For SSL / TLS encryption). **Tip** sudo ufw allow 'Nginx Full' opens both port 80 & 443 (For SSL / TLS encryption).
@ -161,25 +175,31 @@ Now, we must install Strapi 4.0 on the server and launch the Strapi server.
### Strapi Default Installation ### Strapi Default Installation
Goto desired place to install Strapi project i.e. ~/development/my-strapi-project, then, Goto desired place to install Strapi project i.e. ~/development/my-strapi-project, then,
```yarn create strapi-app my-project``` ```yarn create strapi-app my-project```
**Note:** The default Strapi installation uses SQLite as the database. You are able to use other databases like PostgreSQL. See [Strapi Installation] for more details. **Note:** The default Strapi installation uses SQLite as the database. You are able to use other databases like PostgreSQL. See **[Strapi Installation]** for more details.
### Launch Strapi Development Server ### Launch Strapi Development Server
```yarn develop``` ```yarn develop```
### Launch Strapi from Domain URL ### Launch Strapi from Domain URL
```Goto: api.example.com via web browser of your choice```
```Goto: api.example.com via web browser of your choice.```
```Follow the instructions and continue creating a new Strapi administrator.``` ```Follow the instructions and continue creating a new Strapi administrator.```
## References: #### References:
[Nginx Strapi Configuration:](https://docs.strapi.io/developer-docs/latest/setup-deployment-guides/deployment/optional-software/nginx-proxy.html#nginx-upstream) [Nginx Strapi Configuration](https://docs.strapi.io/developer-docs/latest/setup-deployment-guides/deployment/optional-software/nginx-proxy.html#nginx-upstream)
[Strapi Installation](https://docs.strapi.io/developer-docs/latest/setup-deployment-guides/installation/cli.html#creating-a-strapi-project) [Strapi Installation](https://docs.strapi.io/developer-docs/latest/setup-deployment-guides/installation/cli.html#creating-a-strapi-project)
[Nginx Server Blocks:](https://www.digitalocean.com/community/tutorials/how-to-set-up-nginx-server-blocks-virtual-hosts-on-ubuntu-16-04)
[Install Yarn:](https://yarnpkg.com/getting-started/install)
[Certbot Insturctions:](https://certbot.eff.org/instructions?ws=nginx&os=ubuntufocal)
## Donations Are Welcome [Nginx Server Blocks](https://www.digitalocean.com/community/tutorials/how-to-set-up-nginx-server-blocks-virtual-hosts-on-ubuntu-16-04)
[Install Yarn](https://yarnpkg.com/getting-started/install)
[Certbot Insturctions](https://certbot.eff.org/instructions?ws=nginx&os=ubuntufocal)
#### Donations Are Welcome
[Cash App](https://cash.app/$sharpeee) [Cash App](https://cash.app/$sharpeee)
<script type="text/javascript" src="https://cdnjs.buymeacoffee.com/1.0.0/button.prod.min.js" data-name="bmc-button" data-slug="odinzu" data-color="#FFDD00" data-emoji="🍕" data-font="Cookie" data-text="Buy me a pizza" data-outline-color="#000000" data-font-color="#000000" data-coffee-color="#ffffff" ></script>

View File

@ -1,11 +1,11 @@
____ __ ______ ____ __ ______
/\ _`\ /\ \ /\__ _\ __ /\ _`\ /\ \ /\__ _\ __
\ \,\L\_\ \ \___ __ _ __ _____ _\/_/\ \/ _ __ ___ ___ /\_\ ___ ____ \ \,\L\_\ \ \___ __ _ __ _____ _\/_/\ \/ _ __ ___ ___ /\_\ ___ ____
\/_\__ \\ \ _ `\ /'__`\ /\`'__/\ '__`\ /'__`\\ \ \/\`'__/ __`\/' _ `\/\ \ /'___\ /',__\ \/_\__ \\ \ _ `\ /'__`\ /\`'__/\ '__`\ /'__`\\ \ \/\`'__/ __`\/' _ `\/\ \ /'___\ /',__\
/\ \L\ \ \ \ \ \/\ \L\.\\ \ \/\ \ \L\ /\ __/ \ \ \ \ \/\ \L\ /\ \/\ \ \ \/\ \__//\__, `\ /\ \L\ \ \ \ \ \/\ \L\.\\ \ \/\ \ \L\ /\ __/ \ \ \ \ \/\ \L\ /\ \/\ \ \ \/\ \__//\__, `\
\/_____/\/_/\/_/\/__/\/_/\/_/ \ \ \/ \/____/ \/_/\/_/\/___/ \/_/\/_/\/_/\/____/\/___/ \/_____/\/_/\/_/\/__/\/_/\/_/ \ \ \/ \/____/ \/_/\/_/\/___/ \/_/\/_/\/_/\/____/\/___/
\ \_\ \ \_\
\/_/ \/_/
Owner: @csharpe_me (Charles Sharpe) Owner: @csharpe_me (Charles Sharpe)
Designer: @ajlkn, @csharpe_me Designer: @ajlkn, @csharpe_me
Developer: @ajlkn, @csharpe_me Developer: @ajlkn, @csharpe_me
@ -32,12 +32,6 @@ SPECIAL THANKS
@ajlkn @ajlkn
aj.lkn.io aj.lkn.io
@oakstudios
oak.is
@AlainHelaili
helaili.github.io
TECHNOLOGY TECHNOLOGY
---------- ----------
@ -62,7 +56,7 @@ yaml.org
Docker - Container virtualization Docker - Container virtualization
docker.com docker.com
Git, GitHub, GitHub Actions & GitHub Pages - Code collaboration, continuous delivery, version management, DevOps & static hosting Git, Gitea, Drone, GitHub (Mirror) & Gitea Pages - Code collaboration, continuous delivery, version management, DevOps & static hosting
github.com github.com
Font Awesome - Premium Web icons Font Awesome - Premium Web icons
@ -103,10 +97,10 @@ Licensing - Use & distribute software
creativecommons.org, gnu.org, fsf.org creativecommons.org, gnu.org, fsf.org
Web Browser Testing - Testing UI/UX of the website Web Browser Testing - Testing UI/UX of the website
google.com/chrome/, www.mozilla.org/en-US/firefox google.com/chrome/, mozilla.org/en-US/firefox
DuckDuckGo - Search engine privacy Startpage - Search engine privacy
duckduckgo.com startpage.com
FONTS FONTS