├── robots.txt ├── .eleventyignore ├── src ├── posts │ ├── 2018 │ │ ├── 10 │ │ │ └── web-typography-part-1.md │ │ └── 09 │ │ │ └── hardy-press-wp-ssg-with-twist.md │ ├── 2019 │ │ ├── 10 │ │ │ └── its-about-food-not-decor.md │ │ ├── 12 │ │ │ ├── code-comfort-eleventy-webpack.md │ │ │ └── previous-next-eleventy.md │ │ ├── 09 │ │ │ └── now-im-sixty-four.md │ │ └── 02 │ │ │ └── ia-for-io.md │ ├── 2020 │ │ ├── 11 │ │ │ └── mixed-nuts-2020-11.md │ │ ├── 09 │ │ │ ├── two-but-not-terrible.md │ │ │ ├── goodbye-hello-part-5.md │ │ │ └── goodbye-hello-part-4.md │ │ ├── 08 │ │ │ └── goodbye-hello-part-3.md │ │ ├── 03 │ │ │ └── welcome-sweet-little-early-bird.md │ │ └── 02 │ │ │ └── mixed-nuts-february-2020.md │ ├── 2021 │ │ ├── 08 │ │ │ └── boy-oh-grandboy.md │ │ ├── 01 │ │ │ └── leaner-cleaner.md │ │ ├── 06 │ │ │ ├── beginners-luck-3-adding-zola-starter.md │ │ │ └── mixed-nuts-2021-06.md │ │ ├── 02 │ │ │ ├── mixed-nuts-2021-02.md │ │ │ └── tailwind-head-hugo-pipes.md │ │ ├── 03 │ │ │ ├── gems-in-rough-03.md │ │ │ └── beginners-luck-update.md │ │ └── 07 │ │ │ └── gems-in-rough-07.md │ ├── posts.json │ └── posts.njk ├── images │ ├── icons │ │ ├── favicon.ico │ │ ├── apple-icon.png │ │ ├── favicon-16x16.png │ │ ├── favicon-32x32.png │ │ ├── favicon-45x45.png │ │ ├── favicon-57x57.png │ │ ├── favicon-76x76.png │ │ ├── favicon-90x90.png │ │ ├── favicon-96x96.png │ │ ├── ms-icon-70x70.png │ │ ├── apple-icon-57x57.png │ │ ├── apple-icon-60x60.png │ │ ├── apple-icon-72x72.png │ │ ├── apple-icon-76x76.png │ │ ├── favicon-128x128.png │ │ ├── favicon-192x192.png │ │ ├── favicon-196x196.png │ │ ├── favicon-228x228.png │ │ ├── favicon-512x512.png │ │ ├── ms-icon-144x144.png │ │ ├── ms-icon-150x150.png │ │ ├── ms-icon-310x310.png │ │ ├── apple-icon-114x114.png │ │ ├── apple-icon-120x120.png │ │ ├── apple-icon-144x144.png │ │ ├── apple-icon-152x152.png │ │ ├── apple-icon-180x180.png │ │ ├── apple-icon-1024x1024.png │ │ ├── favicon-16x16_minimal.png │ │ ├── apple-icon-precomposed.png │ │ ├── apple-touch-icon_1024x1024.png │ │ ├── apple-touch-icon_120x120.png │ │ ├── apple-touch-icon_152x152.png │ │ ├── apple-touch-icon_167x167.png │ │ ├── apple-touch-icon_180x180.png │ │ └── webmention-avatar-default.svg │ └── typewriter-monochrome_2242164_1280x720.jpg ├── assets │ ├── images │ │ └── my-pet-cat.jpg │ ├── fonts │ │ ├── Inter-3-19_subset_2021-06-18.woff2 │ │ ├── Public-Sans-Roman-VF-1-008_2020-01-08_subset.woff2 │ │ └── Public-Sans-Italic-VF-1-008_2020-01-08_subset.woff2 │ ├── js │ │ ├── lazyload-helper.js │ │ ├── lazyload-helper-1d2c58e751fd3b47be66ebbfa961cc0f.js │ │ ├── hash │ │ │ └── lazyload-helper-1d2c58e751fd3b47be66ebbfa961cc0f.js │ │ ├── search.js │ │ ├── mobile-menu-helper.js │ │ └── mobile-menu-helper-43fb7823038540f51b3a6b962b0b5089.js │ ├── css │ │ ├── ffoxobliq.css │ │ ├── lazyload.css │ │ ├── footnotes.css │ │ ├── index.css │ │ ├── intervf.css │ │ ├── fonts_Inter.css │ │ ├── tables.css │ │ ├── fonts_Public_Sans.css │ │ ├── reset.css │ │ ├── utility.css │ │ ├── global.css │ │ ├── nav.css │ │ └── prismjs.css │ ├── svg │ │ ├── svgPrevPageIcon.svg │ │ ├── svgNextPageIcon.svg │ │ ├── svgFirstPageIcon.svg │ │ ├── svgLastPageIcon.svg │ │ ├── svgRSSIcon.svg │ │ ├── svgLinkedInIcon.svg │ │ ├── svgTwitterIcon.svg │ │ ├── svgGitHubIcon.svg │ │ ├── svgNavIcon_reduced_black.svg │ │ ├── svgNavIcon_reduced.svg │ │ ├── svgNavIcon_reduced-2021-05-22.svg │ │ ├── svgJSONfeedIcon.svg │ │ ├── svgNavIcon.svg │ │ └── svgFooterIcon.svg │ └── utils │ │ ├── analytics.js │ │ ├── disclaimer.js │ │ └── imgc.js ├── sitemap │ └── index.md ├── index.md ├── _includes │ └── layouts │ │ ├── privacy │ │ └── privacy.njk │ │ ├── contact │ │ └── contact.njk │ │ ├── _default │ │ ├── base.njk │ │ └── index.njk │ │ ├── partials │ │ ├── billboard.njk │ │ ├── footer.njk │ │ ├── header.njk │ │ └── head.njk │ │ ├── sitemap │ │ └── sitemap.njk │ │ └── posts │ │ └── singlepost.njk ├── sitemap.html ├── 404.html ├── contact │ └── index.md ├── jsonfeed.html ├── feed.html ├── privacy │ └── index.md └── about │ └── index.md ├── favicon.ico ├── _data ├── projEnv.js ├── helpers.js ├── metadata.json ├── siteparams.json └── eleventyComputed.js ├── postcss.config.js ├── .editorconfig ├── browserconfig.xml ├── README.md ├── csshash.js ├── LICENSE ├── .gitignore ├── jshash.js ├── tailwind.config.js ├── package.json └── vercel.json /robots.txt: -------------------------------------------------------------------------------- 1 | User-agent: * 2 | Disallow: / -------------------------------------------------------------------------------- /.eleventyignore: -------------------------------------------------------------------------------- 1 | README.md 2 | **/_*.md 3 | /tweets -------------------------------------------------------------------------------- /src/posts/posts.json: -------------------------------------------------------------------------------- 1 | { 2 | "tags": [ 3 | "post" 4 | ] 5 | } -------------------------------------------------------------------------------- /favicon.ico: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/brycewray/eleventy_solo/HEAD/favicon.ico -------------------------------------------------------------------------------- /src/images/icons/favicon.ico: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/brycewray/eleventy_solo/HEAD/src/images/icons/favicon.ico -------------------------------------------------------------------------------- /src/assets/images/my-pet-cat.jpg: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/brycewray/eleventy_solo/HEAD/src/assets/images/my-pet-cat.jpg -------------------------------------------------------------------------------- /src/images/icons/apple-icon.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/brycewray/eleventy_solo/HEAD/src/images/icons/apple-icon.png -------------------------------------------------------------------------------- /src/images/icons/favicon-16x16.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/brycewray/eleventy_solo/HEAD/src/images/icons/favicon-16x16.png -------------------------------------------------------------------------------- /src/images/icons/favicon-32x32.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/brycewray/eleventy_solo/HEAD/src/images/icons/favicon-32x32.png -------------------------------------------------------------------------------- /src/images/icons/favicon-45x45.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/brycewray/eleventy_solo/HEAD/src/images/icons/favicon-45x45.png -------------------------------------------------------------------------------- /src/images/icons/favicon-57x57.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/brycewray/eleventy_solo/HEAD/src/images/icons/favicon-57x57.png -------------------------------------------------------------------------------- /src/images/icons/favicon-76x76.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/brycewray/eleventy_solo/HEAD/src/images/icons/favicon-76x76.png -------------------------------------------------------------------------------- /src/images/icons/favicon-90x90.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/brycewray/eleventy_solo/HEAD/src/images/icons/favicon-90x90.png -------------------------------------------------------------------------------- /src/images/icons/favicon-96x96.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/brycewray/eleventy_solo/HEAD/src/images/icons/favicon-96x96.png -------------------------------------------------------------------------------- /src/images/icons/ms-icon-70x70.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/brycewray/eleventy_solo/HEAD/src/images/icons/ms-icon-70x70.png -------------------------------------------------------------------------------- /src/images/icons/apple-icon-57x57.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/brycewray/eleventy_solo/HEAD/src/images/icons/apple-icon-57x57.png -------------------------------------------------------------------------------- /src/images/icons/apple-icon-60x60.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/brycewray/eleventy_solo/HEAD/src/images/icons/apple-icon-60x60.png -------------------------------------------------------------------------------- /src/images/icons/apple-icon-72x72.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/brycewray/eleventy_solo/HEAD/src/images/icons/apple-icon-72x72.png -------------------------------------------------------------------------------- /src/images/icons/apple-icon-76x76.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/brycewray/eleventy_solo/HEAD/src/images/icons/apple-icon-76x76.png -------------------------------------------------------------------------------- /src/images/icons/favicon-128x128.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/brycewray/eleventy_solo/HEAD/src/images/icons/favicon-128x128.png -------------------------------------------------------------------------------- /src/images/icons/favicon-192x192.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/brycewray/eleventy_solo/HEAD/src/images/icons/favicon-192x192.png -------------------------------------------------------------------------------- /src/images/icons/favicon-196x196.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/brycewray/eleventy_solo/HEAD/src/images/icons/favicon-196x196.png -------------------------------------------------------------------------------- /src/images/icons/favicon-228x228.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/brycewray/eleventy_solo/HEAD/src/images/icons/favicon-228x228.png -------------------------------------------------------------------------------- /src/images/icons/favicon-512x512.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/brycewray/eleventy_solo/HEAD/src/images/icons/favicon-512x512.png -------------------------------------------------------------------------------- /src/images/icons/ms-icon-144x144.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/brycewray/eleventy_solo/HEAD/src/images/icons/ms-icon-144x144.png -------------------------------------------------------------------------------- /src/images/icons/ms-icon-150x150.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/brycewray/eleventy_solo/HEAD/src/images/icons/ms-icon-150x150.png -------------------------------------------------------------------------------- /src/images/icons/ms-icon-310x310.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/brycewray/eleventy_solo/HEAD/src/images/icons/ms-icon-310x310.png -------------------------------------------------------------------------------- /src/images/icons/apple-icon-114x114.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/brycewray/eleventy_solo/HEAD/src/images/icons/apple-icon-114x114.png -------------------------------------------------------------------------------- /src/images/icons/apple-icon-120x120.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/brycewray/eleventy_solo/HEAD/src/images/icons/apple-icon-120x120.png -------------------------------------------------------------------------------- /src/images/icons/apple-icon-144x144.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/brycewray/eleventy_solo/HEAD/src/images/icons/apple-icon-144x144.png -------------------------------------------------------------------------------- /src/images/icons/apple-icon-152x152.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/brycewray/eleventy_solo/HEAD/src/images/icons/apple-icon-152x152.png -------------------------------------------------------------------------------- /src/images/icons/apple-icon-180x180.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/brycewray/eleventy_solo/HEAD/src/images/icons/apple-icon-180x180.png -------------------------------------------------------------------------------- /src/images/icons/apple-icon-1024x1024.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/brycewray/eleventy_solo/HEAD/src/images/icons/apple-icon-1024x1024.png -------------------------------------------------------------------------------- /src/images/icons/favicon-16x16_minimal.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/brycewray/eleventy_solo/HEAD/src/images/icons/favicon-16x16_minimal.png -------------------------------------------------------------------------------- /src/images/icons/apple-icon-precomposed.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/brycewray/eleventy_solo/HEAD/src/images/icons/apple-icon-precomposed.png -------------------------------------------------------------------------------- /src/images/icons/apple-touch-icon_1024x1024.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/brycewray/eleventy_solo/HEAD/src/images/icons/apple-touch-icon_1024x1024.png -------------------------------------------------------------------------------- /src/images/icons/apple-touch-icon_120x120.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/brycewray/eleventy_solo/HEAD/src/images/icons/apple-touch-icon_120x120.png -------------------------------------------------------------------------------- /src/images/icons/apple-touch-icon_152x152.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/brycewray/eleventy_solo/HEAD/src/images/icons/apple-touch-icon_152x152.png -------------------------------------------------------------------------------- /src/images/icons/apple-touch-icon_167x167.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/brycewray/eleventy_solo/HEAD/src/images/icons/apple-touch-icon_167x167.png -------------------------------------------------------------------------------- /src/images/icons/apple-touch-icon_180x180.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/brycewray/eleventy_solo/HEAD/src/images/icons/apple-touch-icon_180x180.png -------------------------------------------------------------------------------- /_data/projEnv.js: -------------------------------------------------------------------------------- 1 | // based on Eleventy documentation at https://11ty.dev/docs/data-js/ 2 | 3 | module.exports = { 4 | environment: process.env.ELEVENTY_ENV 5 | } -------------------------------------------------------------------------------- /src/assets/fonts/Inter-3-19_subset_2021-06-18.woff2: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/brycewray/eleventy_solo/HEAD/src/assets/fonts/Inter-3-19_subset_2021-06-18.woff2 -------------------------------------------------------------------------------- /src/images/typewriter-monochrome_2242164_1280x720.jpg: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/brycewray/eleventy_solo/HEAD/src/images/typewriter-monochrome_2242164_1280x720.jpg -------------------------------------------------------------------------------- /src/assets/fonts/Public-Sans-Roman-VF-1-008_2020-01-08_subset.woff2: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/brycewray/eleventy_solo/HEAD/src/assets/fonts/Public-Sans-Roman-VF-1-008_2020-01-08_subset.woff2 -------------------------------------------------------------------------------- /src/sitemap/index.md: -------------------------------------------------------------------------------- 1 | --- 2 | layout: sitemap 3 | title: "Sitemap (HTML form)" 4 | date: 2021-05-12T08:00:00-05:00 5 | --- 6 | 7 | (The text for the page is all in the appropriate template.) -------------------------------------------------------------------------------- /src/assets/fonts/Public-Sans-Italic-VF-1-008_2020-01-08_subset.woff2: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/brycewray/eleventy_solo/HEAD/src/assets/fonts/Public-Sans-Italic-VF-1-008_2020-01-08_subset.woff2 -------------------------------------------------------------------------------- /src/assets/js/lazyload-helper.js: -------------------------------------------------------------------------------- 1 | // runs in the base template after lazyload itself; 2 | // mitigates CSP's refusing to load inline script 3 | 4 | var lazyLoadInstance = new LazyLoad({ 5 | threshold: 150, 6 | }) -------------------------------------------------------------------------------- /_data/helpers.js: -------------------------------------------------------------------------------- 1 | module.exports = { 2 | currentYear() { 3 | const today = new Date() 4 | return today.getFullYear() 5 | } 6 | } 7 | // thanks to https://piccalil.li/quick-tip/dynamic-footer-copyright-date-in-eleventy -------------------------------------------------------------------------------- /postcss.config.js: -------------------------------------------------------------------------------- 1 | module.exports = { 2 | plugins: [ 3 | require('postcss-import'), 4 | require('tailwindcss'), 5 | require('autoprefixer'), 6 | require('postcss-nesting'), 7 | require('postcss-csso'), 8 | ], 9 | } -------------------------------------------------------------------------------- /.editorconfig: -------------------------------------------------------------------------------- 1 | # borrowing from Zach Leatherman 2 | root = true 3 | 4 | [*] 5 | indent_style = space 6 | indent_size = 2 7 | end_of_line = lf 8 | insert_final_newline = true 9 | trim_trailing_whitespace = true 10 | charset = utf-8 11 | -------------------------------------------------------------------------------- /src/assets/js/lazyload-helper-1d2c58e751fd3b47be66ebbfa961cc0f.js: -------------------------------------------------------------------------------- 1 | // runs in the base template after lazyload itself; 2 | // mitigates CSP's refusing to load inline script 3 | 4 | var lazyLoadInstance = new LazyLoad({ 5 | threshold: 150, 6 | }) -------------------------------------------------------------------------------- /src/assets/js/hash/lazyload-helper-1d2c58e751fd3b47be66ebbfa961cc0f.js: -------------------------------------------------------------------------------- 1 | // runs in the base template after lazyload itself; 2 | // mitigates CSP's refusing to load inline script 3 | 4 | var lazyLoadInstance = new LazyLoad({ 5 | threshold: 150, 6 | }) -------------------------------------------------------------------------------- /src/assets/css/ffoxobliq.css: -------------------------------------------------------------------------------- 1 | /* === handling system-font-stack obliquing issues in Firefox */ 2 | 3 | @supports (-moz-appearance: none) { 4 | .italic, i, cite, em, var, address, dfn, h3, .h3, h5, .h5 { 5 | font-style: oblique 8deg; 6 | } 7 | } 8 | 9 | /* === end, handling system-font-stack obliquing issues in Firefox */ -------------------------------------------------------------------------------- /browserconfig.xml: -------------------------------------------------------------------------------- 1 | 2 | 3 | 4 | 5 | 6 | 7 | #2b5797 8 | 9 | 10 | -------------------------------------------------------------------------------- /src/assets/js/search.js: -------------------------------------------------------------------------------- 1 | const searchForm = document.forms['searchForm']; 2 | 3 | window.addEventListener('load', () => { 4 | searchForm.query.value = ''; 5 | }); 6 | 7 | searchForm.addEventListener('submit', function(e){ 8 | e.preventDefault(); 9 | searchForm.query.value += ' site:www.brycewray.com'; 10 | e.currentTarget.submit(); 11 | }); -------------------------------------------------------------------------------- /src/assets/svg/svgPrevPageIcon.svg: -------------------------------------------------------------------------------- 1 | -------------------------------------------------------------------------------- /src/assets/svg/svgNextPageIcon.svg: -------------------------------------------------------------------------------- 1 | -------------------------------------------------------------------------------- /src/assets/svg/svgFirstPageIcon.svg: -------------------------------------------------------------------------------- 1 | -------------------------------------------------------------------------------- /src/assets/svg/svgLastPageIcon.svg: -------------------------------------------------------------------------------- 1 | -------------------------------------------------------------------------------- /src/index.md: -------------------------------------------------------------------------------- 1 | --- 2 | layout: index 3 | title: "Home page" 4 | description: "brycewray.com: Opinions, observations, nerdiness, miscellany." # quotation marks to allow colon 5 | author: Bryce Wray 6 | date: 2018-09-15T21:00:00-05:00 7 | lastmod: 2021-01-30T13:55:00-05:00 8 | # Nothing else needed because no longer using this text 9 | --- 10 | 11 | (The text for the home page is all in the appropriate template.) -------------------------------------------------------------------------------- /src/images/icons/webmention-avatar-default.svg: -------------------------------------------------------------------------------- 1 | 2 | 3 | 4 | 5 | -------------------------------------------------------------------------------- /src/assets/css/lazyload.css: -------------------------------------------------------------------------------- 1 | /* from vanilla-lazyload */ 2 | .lazy { 3 | @apply opacity-0; 4 | } 5 | 6 | .lazy:not(.initial) { 7 | @apply transition-opacity duration-500 ease-in-out; 8 | /* transition: opacity 0.4s; */ 9 | } 10 | 11 | .lazy.initial, 12 | .lazy.loaded, 13 | .lazy.error { 14 | @apply opacity-100; 15 | } 16 | 17 | .lazy:not([src]) { 18 | @apply invisible; 19 | } 20 | /* end of CSS from vanilla-lazyload */ -------------------------------------------------------------------------------- /src/_includes/layouts/privacy/privacy.njk: -------------------------------------------------------------------------------- 1 | --- 2 | title: privacy 3 | layout: base 4 | --- 5 | 6 |
7 | 8 | {% include 'layouts/partials/billboard.njk' %} 9 | 10 |
11 |
12 |
13 | {{ content | safe }} 14 |
15 |
16 | 17 |
-------------------------------------------------------------------------------- /src/_includes/layouts/contact/contact.njk: -------------------------------------------------------------------------------- 1 | --- 2 | title: contact 3 | layout: base 4 | --- 5 |
6 | 7 | {% include 'layouts/partials/billboard.njk' %} 8 | 9 | 10 |
11 | 12 |
13 | 14 |
15 | {{ content | safe }} 16 |
17 |
18 | 19 | -------------------------------------------------------------------------------- /src/assets/utils/analytics.js: -------------------------------------------------------------------------------- 1 | const metadata = require('../../../_data/metadata.json') 2 | 3 | var analyticsCode = `` 4 | metadata.domain == "brycewray.com" 5 | ? analyticsCode = /*HTML*/` 6 | 7 | 8 | 9 | ` 10 | : analyticsCode = `` 11 | 12 | module.exports = analyticsCode -------------------------------------------------------------------------------- /src/assets/css/footnotes.css: -------------------------------------------------------------------------------- 1 | /* start, footnotes */ 2 | 3 | .footnote-ref { 4 | font-size: 0.65em; 5 | } 6 | 7 | .footnote-ref a { 8 | @apply border-transparent; 9 | } 10 | 11 | .footnotes-sep { 12 | @apply mb-3; 13 | } 14 | 15 | .footnotes-list { 16 | @apply list-decimal pl-6; 17 | } 18 | 19 | .footnote-item, .footnote-item p { 20 | @apply text-sm tracking-normal; 21 | } 22 | 23 | .footnote-item pre, .footnote-item code { 24 | @apply text-xs; 25 | } 26 | 27 | /* == end, footnotes */ -------------------------------------------------------------------------------- /src/assets/css/index.css: -------------------------------------------------------------------------------- 1 | /*! purgecss start ignore */ 2 | @import 'reset.css'; 3 | @import 'fonts_Inter.css'; 4 | @import 'prismjs.css'; 5 | @import 'tailwindcss/base'; 6 | @import 'global.css'; 7 | @import 'utility.css'; 8 | @import 'tables.css'; 9 | @import 'footnotes.css'; 10 | /* @import 'nav.css'; */ 11 | @import 'lazyload.css'; 12 | @import 'intervf.css'; 13 | /* @import 'ffoxobliq.css'; */ 14 | @import 'tailwindcss/components'; 15 | /*! purgecss end ignore */ 16 | @import 'tailwindcss/utilities'; -------------------------------------------------------------------------------- /src/assets/js/mobile-menu-helper.js: -------------------------------------------------------------------------------- 1 | // based on https://www.creative-tim.com/learning-lab/tailwind-starter-kit/documentation/javascript/navbars 2 | 3 | document.getElementById('collapse-button').addEventListener("click", function() { 4 | document.getElementById('collapse-button').classList.toggle("hamburger") 5 | document.getElementById('collapse-navbar').classList.toggle("hidden") 6 | document.getElementById('collapse-button').classList.toggle("close") 7 | document.getElementById('collapse-navbar').classList.toggle("flex") 8 | }) -------------------------------------------------------------------------------- /_data/metadata.json: -------------------------------------------------------------------------------- 1 | { 2 | "title": "brycewray.com", 3 | "url": "https://www.brycewray.com", 4 | "domain": "brycewray.com", 5 | "description": "brycewray.com — Observations, opinions, geekery.", 6 | "feed": { 7 | "subtitle": "brycewray.com — Observations, opinions, geekery.", 8 | "filename": "index.xml", 9 | "path": "/index.xml", 10 | "url": "https://www.brycewray.com/index.xml", 11 | "id": "https://www.brycewray.com/" 12 | }, 13 | "author": { 14 | "name": "Bryce Wray", 15 | "email": "bw@brycewray.com" 16 | } 17 | } -------------------------------------------------------------------------------- /src/assets/js/mobile-menu-helper-43fb7823038540f51b3a6b962b0b5089.js: -------------------------------------------------------------------------------- 1 | // based on https://www.creative-tim.com/learning-lab/tailwind-starter-kit/documentation/javascript/navbars 2 | 3 | document.getElementById('collapse-button').addEventListener("click", function() { 4 | document.getElementById('collapse-button').classList.toggle("hamburger") 5 | document.getElementById('collapse-navbar').classList.toggle("hidden") 6 | document.getElementById('collapse-button').classList.toggle("close") 7 | document.getElementById('collapse-navbar').classList.toggle("flex") 8 | }) -------------------------------------------------------------------------------- /_data/siteparams.json: -------------------------------------------------------------------------------- 1 | { 2 | "siteURLforOG": "https://www.brycewray.com", 3 | "siteBaseURL": "/", 4 | "siteTitle": "BryceWray.com", 5 | "siteAuthor": "Bryce Wray", 6 | "siteDescription": "brycewray.com — Observations, opinions, geekery.", 7 | "feed": { 8 | "subtitle": "brycewray.com — Observations, opinions, geekery.", 9 | "filename": "index.xml", 10 | "path": "/index.xml", 11 | "url": "https://www.brycewray.com/index.xml", 12 | "id": "https://www.brycewray.com" 13 | }, 14 | "respSizes": [ 300, 450, 600, 750, 900, 1050, 1200, 1350, 1500 ] 15 | } -------------------------------------------------------------------------------- /src/sitemap.html: -------------------------------------------------------------------------------- 1 | --- 2 | permalink: /sitemap.xml 3 | eleventyExcludeFromCollections: true 4 | --- 5 | 6 | 7 | {%- for item in collections.all | reverse -%} 8 | 9 | {{ siteparams.siteURLforOG }}{{ item.url }} 10 | {%- if item.data.lastmod -%} 11 | {{ item.data.lastmod | dateStringISO }} 12 | {%- else -%} 13 | {{ item.date | dateStringISO }} 14 | {%- endif -%} 15 | 16 | {%- endfor -%} 17 | -------------------------------------------------------------------------------- /src/assets/utils/disclaimer.js: -------------------------------------------------------------------------------- 1 | module.exports = () => { 2 | var disclaimer = ` 3 |

General note: This site’s appearance, configuration, hosting, and other basic considerations will change over time. As a result, certain content on this page could be at variance with what you’re currently seeing on the site, but the two were consistent when this post originally appeared.

` 4 | return disclaimer 5 | } 6 | 7 | // The HTML above is escaped properly only if white space is *not* used, hence the lack of indentation above. For more details, see https://github.com/11ty/eleventy/issues/180. -------------------------------------------------------------------------------- /_data/eleventyComputed.js: -------------------------------------------------------------------------------- 1 | // for excluding "future" content from production builds 2 | // https://saneef.com/tutorials/hiding-posts-with-future-dates-in-eleventy/ 3 | 4 | const isPageFromFuture = ({ date }) => 5 | process.env.ELEVENTY_ENV === "production" && date.getTime() > Date.now() 6 | 7 | module.exports = { 8 | permalink: (data) => { 9 | const { permalink, page } = data 10 | if (isPageFromFuture(page)) return false 11 | 12 | return permalink 13 | }, 14 | eleventyExcludeFromCollections: (data) => { 15 | const { eleventyExcludeFromCollections, page } = data 16 | if (isPageFromFuture(page)) return true 17 | 18 | return eleventyExcludeFromCollections 19 | }, 20 | } -------------------------------------------------------------------------------- /src/assets/css/intervf.css: -------------------------------------------------------------------------------- 1 | /* === handling Inter VF obliquing */ 2 | .italic, i, cite, em, var, address, dfn, h3, h5 { /* dealing with Inter VF */ 3 | font-variation-settings: 'slnt' -8; 4 | /* previous is needed by Chromium and Safari; its presence makes Firefox "over-slant" Inter VF, so we override that below with the media query for Firefox */ 5 | font-style: oblique 8deg; 6 | /* previous is needed by Firefox and Safari; it apparently has no effect on Chromium */ 7 | } 8 | 9 | @supports (-moz-appearance: none) { 10 | .italic, i, cite, em, var, address, dfn, h3, h5 { 11 | /* font-variation-settings: normal; */ 12 | font-style: normal; 13 | } 14 | } 15 | /* === end, handling Inter VF obliquing */ -------------------------------------------------------------------------------- /src/404.html: -------------------------------------------------------------------------------- 1 | --- 2 | title: 404 - Page not found 3 | layout: base 4 | permalink: 404.html 5 | eleventyExcludeFromCollections: true 6 | #Comes into play only on Netlify -- see https://www.11ty.dev/docs/quicktips/not-found/ 7 | --- 8 | 9 |
10 |

Page not found

11 |

Sorry, that page isn’t on this site.

12 |

Please use the navigation menu (above) or the sitemap to find another page.

13 |
14 | -------------------------------------------------------------------------------- /src/assets/css/fonts_Inter.css: -------------------------------------------------------------------------------- 1 | /* === Inter, variable === */ 2 | /* === 3 | references: 4 | https://thetrevorharmon.com/blog/how-to-prepare-and-use-variable-fonts-on-the-web 5 | https://rwt.io/typography-tips/getting-bent-current-state-italics-variable-font-support 6 | === */ 7 | /* latin */ 8 | @font-face { 9 | font-family: 'Inter'; 10 | font-weight: 1 999; 11 | font-style: normal; 12 | font-display: swap; 13 | /* optional is best for first-run CLS checks; swap looks better on one-hit */ 14 | src: url('/assets/fonts/Inter-3-19_subset_2021-06-18.woff2') format('woff2-variations'); 15 | unicode-range: U+0000-00FF, U+0131, U+0152-0153, U+02BB-02BC, U+02C6, U+02DA, U+02DC, U+2000-206F, U+2074, U+20AC, U+2122, U+2191, U+2193, U+2212, U+2215, U+FEFF, U+FFFD; 16 | } -------------------------------------------------------------------------------- /src/_includes/layouts/_default/base.njk: -------------------------------------------------------------------------------- 1 | {% set eleventyEnv = projEnv.environment %} 2 | 3 | 4 | {% include 'layouts/partials/head.njk' %} 5 | 6 | {% include 'layouts/partials/header.njk' %} 7 | {{ content | safe }} 8 | {% include 'layouts/partials/footer.njk' %} 9 | 10 | {% if eleventyEnv == "production" %} 11 | 12 | 13 | {% else %} 14 | 15 | 16 | {% endif %} 17 | 18 | 19 | -------------------------------------------------------------------------------- /README.md: -------------------------------------------------------------------------------- 1 | # Repo for brycewray.com 2 | 3 | This is the repository from which the [Eleventy](https://11ty.dev)-generated version of [brycewray.com](https://www.brycewray.com/) was built (the current repo is https://github.com/brycewray/eleventy_site). I suggest you use it **only for reference** and, rather than cloning or forking it, use one of the **starter sets** based on it (see below). 4 | 5 | ## Starter sets based on this repo 6 | 7 | For a list of **starter sets** based on the design of the site that this repo builds, please see [this post on my website](https://www.brycewray.com/posts/2021/03/beginners-luck-update). 8 | 9 | **Note**: If you insist of cloning or forking **this** repo (rather than one of the starter sets) for your use, be sure to change the `_data/metadata.json` file to reflect **your** information rather than mine. 10 | -------------------------------------------------------------------------------- /src/assets/svg/svgRSSIcon.svg: -------------------------------------------------------------------------------- 1 | -------------------------------------------------------------------------------- /csshash.js: -------------------------------------------------------------------------------- 1 | const fs = require('fs') 2 | const md5 = require('md5') 3 | const globAll = require('glob-all') 4 | const DATAFILE = '_data/csshash.json' 5 | const PCSSFILE = 'csshash' 6 | cssFiles = globAll.sync([ 7 | 'src/assets/css/*.css' 8 | ]) 9 | 10 | var cssMd5Total = 0 11 | var cssContent = '' 12 | 13 | for(i=0; i 2 |

{{ title }}

3 | {% if subtitle %}

{{ subtitle }}

{% endif %} 4 | {% if description %}

{{ description }}

{% endif %} 5 |

6 | {{ page.date | htmlDateString }}{% if lastmod %}
Last modified {{ lastmod | htmlDateString }}{% endif %} 7 |

8 | 9 | -------------------------------------------------------------------------------- /src/contact/index.md: -------------------------------------------------------------------------------- 1 | --- 2 | layout: contact 3 | title: "Want to reach me?" 4 | description: "Here are several ways to get in contact." 5 | author: Bryce Wray 6 | date: 2020-12-30T09:00:00-06:00 7 | lastmod: 2021-07-02T10:35:00-05:00 8 | --- 9 | 10 | ## Send me an email 11 | 12 | bw@brycewray.com
13 | *(Spammers, you and your bots will never get past my **Junk** folder, so don't bother.)* 14 | 15 | **Note**: I'm always interested in *mentioning* what my readers have to say, so please let me know in your email if that's acceptable. To respect your [privacy](/privacy), I will **not** attribute your comments to you unless you give your explicit permission. *(However, I still may quote you while giving you anonymity. Even if you've given your permission to quote you by name, I reserve the right to quote you anonymously.)* 16 | {.yellowBox} 17 | 18 | ## Follow me 19 | 20 | - [brycewray on GitHub](https://github.com/brycewray/) 21 | - [@BryceWrayTX on Twitter](https://twitter.com/BryceWrayTX/) 22 | - This site’s news feed ([JSON](/index.json) or [RSS](/index.xml)) 23 | -------------------------------------------------------------------------------- /LICENSE: -------------------------------------------------------------------------------- 1 | MIT License 2 | 3 | (c) 2018–2021 Bryce Wray 4 | 5 | Permission is hereby granted, free of charge, to any person obtaining a copy 6 | of this software and associated documentation files (the "Software"), to deal 7 | in the Software without restriction, including without limitation the rights 8 | to use, copy, modify, merge, publish, distribute, sublicense, and/or sell 9 | copies of the Software, and to permit persons to whom the Software is 10 | furnished to do so, subject to the following conditions: 11 | 12 | The above copyright notice and this permission notice shall be included in all 13 | copies or substantial portions of the Software. 14 | 15 | THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR 16 | IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, 17 | FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE 18 | AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER 19 | LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, 20 | OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE 21 | SOFTWARE. -------------------------------------------------------------------------------- /src/assets/svg/svgLinkedInIcon.svg: -------------------------------------------------------------------------------- 1 | -------------------------------------------------------------------------------- /src/assets/css/tables.css: -------------------------------------------------------------------------------- 1 | 2 | table.leagues { 3 | @apply w-11/12 mt-4 mx-auto mb-0 border-0 border-collapse; 4 | } 5 | 6 | table.leagues td.col { 7 | @apply w-1/2; 8 | } 9 | 10 | @media (min-width: 900px) { 11 | table.leagues { 12 | @apply w-3/5; 13 | } 14 | table.noborders { 15 | @apply w-11/12; 16 | } 17 | } 18 | 19 | table.noborders { 20 | @apply w-full border-0 border-collapse mt-6 mx-auto mb-4; 21 | } 22 | 23 | table.noborders td { 24 | @apply text-gray-800 text-left align-middle py-1 pr-0 pl-2; 25 | /* text-align: left !important; */ 26 | } 27 | 28 | table.noborders td img { 29 | @apply inline-block align-middle m-0; 30 | } 31 | 32 | table.noborders tr { 33 | @apply bg-blue-100; 34 | } 35 | 36 | table.noborders tr:nth-child(even) { 37 | @apply bg-gray-200; 38 | } 39 | 40 | table.noborders thead tr { 41 | @apply bg-blue-700; 42 | } 43 | 44 | table.noborders thead td { 45 | @apply text-white font-bold; 46 | } 47 | 48 | table.noborders td.td70 { 49 | @apply w-[70%]; 50 | } 51 | 52 | table.noborders td.td70 img { 53 | @apply block w-1/2 h-auto max-w-[50%]; 54 | } 55 | 56 | table.noborders td.td30 { 57 | @apply w-[30%]; 58 | } 59 | -------------------------------------------------------------------------------- /src/assets/css/fonts_Public_Sans.css: -------------------------------------------------------------------------------- 1 | /* === Inter, variable === */ 2 | /* === 3 | references: 4 | https://thetrevorharmon.com/blog/how-to-prepare-and-use-variable-fonts-on-the-web 5 | https://rwt.io/typography-tips/getting-bent-current-state-italics-variable-font-support 6 | === */ 7 | /* latin */ 8 | @font-face { 9 | font-family: 'Public Sans'; 10 | font-weight: 1 999; 11 | font-style: normal; 12 | font-display: swap; 13 | /* optional is best for first-run CLS checks; swap looks better on one-hit */ 14 | src: url('/assets/fonts/Public-Sans-Roman-VF-1-008_2020-01-08_subset.woff2') format('woff2-variations'); 15 | unicode-range: U+0000-00FF, U+0131, U+0152-0153, U+02BB-02BC, U+02C6, U+02DA, U+02DC, U+2000-206F, U+2074, U+20AC, U+2122, U+2191, U+2193, U+2212, U+2215, U+FEFF, U+FFFD; 16 | } 17 | @font-face { 18 | font-family: 'Public Sans'; 19 | font-weight: 1 999; 20 | font-style: italic; 21 | font-display: swap; 22 | /* optional is best for first-run CLS checks; swap looks better on one-hit */ 23 | src: url('/assets/fonts/Public-Sans-Italic-VF-1-008_2020-01-08_subset.woff2') format('woff2-variations'); 24 | unicode-range: U+0000-00FF, U+0131, U+0152-0153, U+02BB-02BC, U+02C6, U+02DA, U+02DC, U+2000-206F, U+2074, U+20AC, U+2122, U+2191, U+2193, U+2212, U+2215, U+FEFF, U+FFFD; 25 | } -------------------------------------------------------------------------------- /.gitignore: -------------------------------------------------------------------------------- 1 | _site 2 | _cache 3 | .cache 4 | dist 5 | build 6 | node_modules 7 | 8 | # Compiled source # 9 | ################### 10 | *.com 11 | *.class 12 | *.dll 13 | *.exe 14 | *.o 15 | *.so 16 | 17 | # Packages # 18 | ############ 19 | # it's better to unpack these files and commit the raw source 20 | # git has its own built in compression methods 21 | *.7z 22 | *.dmg 23 | *.gz 24 | *.iso 25 | *.jar 26 | *.rar 27 | *.tar 28 | *.zip 29 | 30 | # Logs and databases # 31 | ###################### 32 | *.log 33 | *.sql 34 | *.sqlite 35 | 36 | # OS generated files # 37 | ###################### 38 | .DS_Store 39 | .DS_Store? 40 | ._* 41 | .Spotlight-V100 42 | .Trashes 43 | ehthumbs.db 44 | Thumbs.db 45 | _site 46 | _site 47 | 48 | *.code-workspace 49 | .env 50 | 51 | data/*.json 52 | 53 | .lazyimages.json 54 | 55 | pngquant* 56 | 57 | imgxfm_SAFE.js 58 | # Local Netlify folder 59 | .netlify 60 | 61 | .base64imgs.txt 62 | .base64imgs.json 63 | arraytest.js 64 | .firebase 65 | .vercel 66 | .firebaserc 67 | .Ulysses*.plist 68 | ztest.js 69 | 70 | .vscode 71 | 72 | gh-pages 73 | gh-pages.pub 74 | .nova 75 | 76 | src/_includes/css/*.* 77 | 78 | csshash 79 | 80 | csp.txt 81 | 82 | _data/csshash.json 83 | _data/year.json 84 | 85 | _data/jshash.json 86 | 87 | _data/lazyloadhelper.json 88 | _data/mobilemenuhelper.json -------------------------------------------------------------------------------- /src/assets/svg/svgTwitterIcon.svg: -------------------------------------------------------------------------------- 1 | -------------------------------------------------------------------------------- /jshash.js: -------------------------------------------------------------------------------- 1 | const fs = require('fs') 2 | const md5 = require('md5') 3 | const DIRECTORY = 'src/assets/js' 4 | const LAZYDATAFILE = '_data/lazyloadhelper.json' 5 | const MOBIDATAFILE = '_data/mobilemenuhelper.json' 6 | var lazyloadFile = DIRECTORY + '/' + 'lazyload-helper.js' 7 | var mobimenuFile = DIRECTORY + '/' + 'mobile-menu-helper.js' 8 | 9 | var lazyloadMd5Total = 0 10 | var lazyloadContent = '' 11 | var mobimenuMd5Total = 0 12 | var mobimenuContent = '' 13 | 14 | lazyloadContent = fs.readFileSync(lazyloadFile) 15 | mobimenuContent = fs.readFileSync(mobimenuFile) 16 | 17 | lazyloadMd5Total = md5(lazyloadContent) 18 | console.log(`lazyload MD5 result = `, lazyloadMd5Total) 19 | mobimenuMd5Total = md5(mobimenuContent) 20 | console.log(`mobimenu MD5 result = `, mobimenuMd5Total) 21 | 22 | var lazyloadValue = `{ 23 | "lazyloadJS": "lazyload-helper-${lazyloadMd5Total}.js" 24 | }` 25 | var mobimenuValue = `{ 26 | "mobimenuJS": "mobile-menu-helper-${mobimenuMd5Total}.js" 27 | }` 28 | 29 | // actual file-handling 30 | 31 | fs.writeFileSync(LAZYDATAFILE, lazyloadValue) 32 | fs.writeFileSync(MOBIDATAFILE, mobimenuValue) 33 | 34 | // create the actual JS files 35 | fs.writeFile(DIRECTORY + '/' + 'lazyload-helper-' + lazyloadMd5Total + '.js', lazyloadContent, (err) => { 36 | if (err) 37 | console.log(err) 38 | }) 39 | fs.writeFile(DIRECTORY + '/' + 'mobile-menu-helper-' + mobimenuMd5Total + '.js', mobimenuContent, (err) => { 40 | if (err) 41 | console.log(err) 42 | }) 43 | -------------------------------------------------------------------------------- /src/assets/svg/svgGitHubIcon.svg: -------------------------------------------------------------------------------- 1 | -------------------------------------------------------------------------------- /src/_includes/layouts/sitemap/sitemap.njk: -------------------------------------------------------------------------------- 1 | --- 2 | title: sitemap 3 | layout: base 4 | eleventyExcludeFromCollections: true 5 | --- 6 | 7 |
8 |
9 |

Sitemap

10 |
11 |

Main pages

12 | 18 |

Posts

19 |
    20 |
  • Complete list (first page of paginated list; five posts per page)
  • 21 | {% for post in collections.post | reverse %} 22 |
  • {{ post.data.title | safe }} • {{ post.date | htmlDateString }}
    23 | {{ post.data.subtitle | safe }}
    24 | {{ post.data.description | safe }} 25 |
  • 26 | {% endfor %} 27 |
28 |
29 |
30 | -------------------------------------------------------------------------------- /src/jsonfeed.html: -------------------------------------------------------------------------------- 1 | ---json 2 | { 3 | "permalink": "/index.json", 4 | "eleventyExcludeFromCollections": true, 5 | "metadata": { 6 | "title": "BryceWray.com", 7 | "description": "brycewray.com — Observations, opinions, geekery.", 8 | "url": "https://www.brycewray.com/", 9 | "feedUrl": "https://www.brycewray.com/index.json", 10 | "authors": { 11 | "name": "Bryce Wray", 12 | "url": "https://www.brycewray.com/about/" 13 | } 14 | } 15 | } 16 | --- 17 | { 18 | "version": "https://jsonfeed.org/version/1.1", 19 | "title": "{{ metadata.title }}", 20 | "home_page_url": "{{ metadata.url }}", 21 | "feed_url": "{{ metadata.feedUrl }}", 22 | "description": "{{ metadata.description }}", 23 | "items": [ 24 | {%- for item in collections.all | reverse -%} 25 | {%- if loop.index0 < 10 -%} 26 | {%- set absolutePostUrl -%}{{ item.url | url | absoluteUrl(metadata.url) }}{%- endset %} 27 | { 28 | "id": "{{ absolutePostUrl }}", 29 | "title": "{{ item.data.title }}", 30 | "url": "{{ absolutePostUrl }}", 31 | "date_published": "{{ item.date | dateFromRFC2822 }}", 32 | "summary": "{% if item.data.subtitle -%}{{ item.data.subtitle }} • {% endif -%}{%- if item.data.description -%}{{ item.data.description }}{%- else -%}No description{%- endif %}", 33 | "content_html": {%- if item.templateContent -%}{{ item.templateContent | htmlToAbsoluteUrls(absolutePostUrl) | dump | safe }}{%- else -%}""{%- endif -%} 34 | }{%- if not loop.last -%},{%- endif %} 35 | {%- endif -%} 36 | {%- endfor %} 37 | ] 38 | } -------------------------------------------------------------------------------- /src/assets/css/reset.css: -------------------------------------------------------------------------------- 1 | /* 2 | h/t to Andy Bell 3 | https://piccalil.li/blog/a-modern-css-reset/ 4 | . . . as of 2021-07-09 5 | */ 6 | 7 | /* Box sizing rules */ 8 | *, 9 | *::before, 10 | *::after { 11 | box-sizing: border-box; 12 | } 13 | 14 | /* Remove default margin */ 15 | body, 16 | h1, 17 | h2, 18 | h3, 19 | h4, 20 | p, 21 | figure, 22 | blockquote, 23 | dl, 24 | dd { 25 | margin: 0; 26 | } 27 | 28 | /* Remove list styles on ul, ol elements with a list role, which suggests default styling will be removed */ 29 | ul[role='list'], 30 | ol[role='list'] { 31 | list-style: none; 32 | } 33 | 34 | /* Set core root defaults */ 35 | html:focus-within { 36 | scroll-behavior: smooth; 37 | } 38 | 39 | /* Set core body defaults */ 40 | body { 41 | min-height: 100vh; 42 | text-rendering: optimizeSpeed; 43 | line-height: 1.5; 44 | } 45 | 46 | /* A elements that don't have a class get default styles */ 47 | a:not([class]) { 48 | text-decoration-skip-ink: auto; 49 | } 50 | 51 | /* Make images easier to work with */ 52 | img, 53 | picture { 54 | max-width: 100%; 55 | display: block; 56 | } 57 | 58 | /* Inherit fonts for inputs and buttons */ 59 | input, 60 | button, 61 | textarea, 62 | select { 63 | font: inherit; 64 | } 65 | 66 | /* Remove all animations, transitions and smooth scroll for people that prefer not to see them */ 67 | @media (prefers-reduced-motion: reduce) { 68 | html:focus-within { 69 | scroll-behavior: auto; 70 | } 71 | 72 | *, 73 | *::before, 74 | *::after { 75 | animation-duration: 0.01ms !important; 76 | animation-iteration-count: 1 !important; 77 | transition-duration: 0.01ms !important; 78 | scroll-behavior: auto !important; 79 | } 80 | } 81 | -------------------------------------------------------------------------------- /src/feed.html: -------------------------------------------------------------------------------- 1 | ---json 2 | { 3 | "permalink": "/index.xml", 4 | "eleventyExcludeFromCollections": true, 5 | "metadata": { 6 | "title": "BryceWray.com", 7 | "subtitle": "brycewray.com — Observations, opinions, geekery.", 8 | "description": "brycewray.com — Observations, opinions, geekery.", 9 | "url": "https://www.brycewray.com/", 10 | "feedUrl": "https://www.brycewray.com/index.xml", 11 | "authors": { 12 | "name": "Bryce Wray", 13 | "url": "https://www.brycewray.com/about/" 14 | } 15 | } 16 | } 17 | --- 18 | 19 | 20 | {{ metadata.title }} 21 | {{ metadata.subtitle }} 22 | 23 | 24 | {{ collections.all | getNewestCollectionItemDate | dateToRfc3339 }} 25 | {{ metadata.url }} 26 | 27 | {{ metadata.authors.name }} 28 | 29 | {%- for item in collections.all | reverse -%} 30 | {%- if loop.index0 < 10 -%} 31 | {%- set absolutePostUrl -%}{{ item.url | url | absoluteUrl(metadata.url) }}{%- endset -%} 32 | 33 | {{ item.data.title }} 34 | 35 | {{ item.date | dateToRfc3339 }} 36 | {{ absolutePostUrl }} 37 | {%- if item.data.subtitle -%}{{ item.data.subtitle }}{%- else -%}""{%- endif -%}{%- if item.data.description %} • {{ item.data.description }}{%- else -%}"[No description]"{%- endif -%} 38 | {{ item.templateContent | htmlToAbsoluteUrls(absolutePostUrl) }} 39 | 40 | {%- endif -%} 41 | {%- endfor %} 42 | -------------------------------------------------------------------------------- /tailwind.config.js: -------------------------------------------------------------------------------- 1 | const colors = require('tailwindcss/colors') 2 | 3 | module.exports = { 4 | mode: 'jit', 5 | purge: { 6 | content: [ 7 | './src/**/*.js', 8 | './src/**/*.11ty.js', 9 | './src/**/*.njk', 10 | './src/**/*.html' 11 | ], 12 | }, 13 | darkMode: 'media', 14 | theme: { 15 | fontWeight: { 16 | normal: 400, 17 | bold: 625, // not default of 700 18 | black: 900, 19 | }, 20 | colors: { 21 | transparent: 'transparent', 22 | white: '#ffffff', 23 | black: '#000000', 24 | blueGray: colors.blueGray, 25 | gray: colors.gray, 26 | red: colors.red, 27 | orange: colors.orange, 28 | amber: colors.amber, 29 | yellow: colors.yellow, 30 | green: colors.green, 31 | teal: colors.teal, 32 | sky: colors.sky, 33 | blue: { 34 | '50': '#e6f9ff', 35 | '100': '#bbeeff', 36 | '200': '#00aaff', 37 | '300': '#0088ff', 38 | '400': '#0033ff', 39 | '500': '#0000ff', 40 | '600': '#0000bb', 41 | '700': '#0000aa', 42 | '800': '#000088', 43 | '900': '#000066', 44 | }, 45 | }, 46 | fontFamily: { 47 | 'sans': ['Inter', 'ui-sans-serif', 'system-ui', '-apple-system', 'BlinkMacSystemFont', 'Roboto', 'Helvetica Neue', 'Helvetica', 'Arial', 'Noto Sans', 'Segoe UI', 'sans-serif', 'Apple Color Emoji', 'Segoe UI Emoji', 'Segoe UI Symbol', 'Noto Color Emoji'], 48 | 'serif': ['ui-serif', 'Georgia', 'Cambria', 'Times', 'Times New Roman', 'serif'], 49 | 'mono': ['ui-monospace', 'SFMono-Regular', 'SF Mono', 'Menlo', 'Monaco', 'Consolas', 'Liberation Mono', 'Courier New', 'monospace'] 50 | }, 51 | }, 52 | variants: {}, 53 | plugins: [], // if we add forms, do it here 54 | } 55 | -------------------------------------------------------------------------------- /src/posts/2018/09/hardy-press-wp-ssg-with-twist.md: -------------------------------------------------------------------------------- 1 | --- 2 | layout: singlepost 3 | tags: post 4 | title: "HardyPress: WP + SSG with a twist" 5 | subtitle: Trying to have the best of two worlds 6 | description: Here’s a brief look at an interesting way to have your WordPress cake and eat your SSG site, too—or something like that. 7 | author: Bryce Wray 8 | date: 2018-09-15T08:28:17-05:00 9 | lastmod: 2019-04-27T13:45:00-05:00 10 | discussionId: "2018-09-hardy-press-wp-ssg-with-twist" 11 | featured_image: "wordpress-macbook-pro-923188_5472x3648.jpg" 12 | featured_image_width: 5472 13 | featured_image_height: 3648 14 | featured_image_alt: "WordPress administrative interface in use on a laptop computer" 15 | featured_image_caption: | 16 | Image: StockSnap; Pixabay 17 | --- 18 | 19 | While researching the static-site generator (SSG) scene for the first time in a while yesterday, I happened upon [HardyPress](https://www.hardypress.com). 20 | 21 | It's an interesting proposition: it takes the whole WordPress-to-SSG idea one step further. HardyPress keeps your WordPress install on a hidden location where you edit to your heart's delight, and only **then** does the content get on the web---but as *static* files. So you get the advantage of ease-of-use in WordPress and the security of SSG. 22 | 23 | In addition, they host it on a CDN that, as nearly as I can tell, uses Amazon to hit 30 edge servers worldwide. They even provide SSL certs so you can avoid the nasty red blot on Chrome, Firefox, and other HTTPS-savvy browsers. 24 | -------------------------------------------------------------------------------- /src/assets/css/utility.css: -------------------------------------------------------------------------------- 1 | .yellowBox, .blueBox { 2 | @apply border border-gray-900 border-solid mx-auto my-8 w-full p-8 dark:bg-gray-800 dark:border-gray-500; 3 | } 4 | 5 | .yellowBox { 6 | @apply bg-yellow-100 dark:bg-amber-900; 7 | } 8 | 9 | .yellowBox a { 10 | @apply text-blue-700 border-blue-700 dark:text-blue-100 dark:border-blue-100; 11 | &:focus, &:active, &:hover { 12 | @apply dark:text-blue-200 dark:border-blue-200; 13 | } 14 | } 15 | 16 | .blueBox { 17 | @apply text-sm bg-blue-100 dark:bg-blue-900; 18 | } 19 | 20 | .lazypicturecaption, .imgcCaption { 21 | @apply text-sm p-0 mt-2 leading-snug text-center; 22 | } 23 | 24 | .indentAfterLI { 25 | @apply ml-8; 26 | } 27 | 28 | .punctuationExample { 29 | @apply font-serif text-2xl text-center; 30 | } 31 | 32 | .navWhite, .navWhite:visited { 33 | @apply text-white; 34 | } 35 | 36 | .navWhite:focus, .navWhite:active { 37 | @apply text-gray-400; 38 | } 39 | 40 | .text-blue-light { 41 | @apply text-blue-500; 42 | } 43 | 44 | .text-blue-dark { /* for dark mode */ 45 | @apply text-blue-200; 46 | } 47 | 48 | .ctr { 49 | @apply text-center; 50 | } 51 | 52 | .legal { 53 | @apply text-xs; 54 | } 55 | 56 | span.caption { 57 | text-shadow: none; /* keeps link borders from looking "dirty" */ 58 | } 59 | 60 | span.caption a { 61 | @apply text-blue-100 border-blue-100; 62 | &:focus, &:hover, &:active { 63 | @apply text-blueGray-200 border-blue-100; 64 | } 65 | } 66 | 67 | .imgCover { 68 | @apply object-cover object-center h-full w-full; 69 | } 70 | 71 | .background-hero-title-text { 72 | text-shadow: 4px 4px 2px #000; 73 | } 74 | 75 | .text-nowrap, .text-nobrk { 76 | @apply whitespace-nowrap; 77 | } 78 | 79 | #collapse-button.hamburger:before { 80 | font-size: 150%; 81 | content: "\2630"; /* same as ☰ HTML entity */ 82 | } 83 | 84 | #collapse-button.close:before { 85 | font-size: 170%; 86 | content: "\00D7"; /* same as × HTML entity */ 87 | } 88 | -------------------------------------------------------------------------------- /package.json: -------------------------------------------------------------------------------- 1 | { 2 | "name": "eleventy_solo", 3 | "description": "", 4 | "private": true, 5 | "scripts": { 6 | "clean": "rm -rf _site", 7 | "hasher": "node csshash.js && node jshash.js", 8 | "start": "TAILWIND_MODE=watch NODE_ENV=development npm-run-all clean --parallel dev:*", 9 | "dev:postcss": "postcss src/assets/css/index.css -o _site/css/index.css --config ./postcss.config.js --watch", 10 | "dev:eleventy": "ELEVENTY_ENV=development npx @11ty/eleventy --incremental --quiet --serve", 11 | "build": "NODE_ENV=production npm-run-all clean hasher --parallel prod:*", 12 | "prod:postcss": "postcss src/assets/css/index.css -o _site/css/$(cat csshash) --config ./postcss.config.js", 13 | "prod:eleventy": "ELEVENTY_ENV=production npx @11ty/eleventy --output=./_site" 14 | }, 15 | "keywords": [], 16 | "author": "", 17 | "license": "MIT", 18 | "browserslist": [ 19 | "last 4 versions", 20 | "> 1%", 21 | "maintained node versions" 22 | ], 23 | "devDependencies": { 24 | "@11ty/eleventy": "^0.12.1", 25 | "@11ty/eleventy-img": "^0.10.0", 26 | "@11ty/eleventy-plugin-rss": "^1.1.1", 27 | "autoprefixer": "^10.3.4", 28 | "cross-env": "^7.0.3", 29 | "eleventy-plugin-error-overlay": "^0.1.2", 30 | "eleventy-plugin-svg-contents": "^0.7.0", 31 | "eleventy-rss-helper": "^1.2.1", 32 | "glob": "^7.1.7", 33 | "glob-all": "^3.2.1", 34 | "html-minifier": "^4.0.0", 35 | "luxon": "^2.0.2", 36 | "markdown-it": "^12.2.0", 37 | "markdown-it-attrs": "^4.0.0", 38 | "markdown-it-bracketed-spans": "^1.0.1", 39 | "markdown-it-footnote": "^3.0.3", 40 | "markdown-it-link-attributes": "^3.0.0", 41 | "markdown-it-prism": "^2.2.1", 42 | "md5": "^2.3.0", 43 | "npm-run-all": "^4.1.5", 44 | "postcss": "^8.3.6", 45 | "postcss-cli": "^8.3.1", 46 | "postcss-csso": "^5.0.1", 47 | "postcss-import": "^14.0.2", 48 | "postcss-nesting": "^8.0.1", 49 | "rimraf": "^3.0.2", 50 | "rss": "^1.2.2", 51 | "tailwindcss": "^2.2.15" 52 | } 53 | } 54 | -------------------------------------------------------------------------------- /src/_includes/layouts/partials/footer.njk: -------------------------------------------------------------------------------- 1 | -------------------------------------------------------------------------------- /src/assets/svg/svgNavIcon_reduced_black.svg: -------------------------------------------------------------------------------- 1 | -------------------------------------------------------------------------------- /src/posts/2021/08/boy-oh-grandboy.md: -------------------------------------------------------------------------------- 1 | --- 2 | layout: singlepost 3 | title: "Boy, oh, grandboy" 4 | subtitle: "Another addition to our family" 5 | description: "A few words about the arrival of grandchild #2." 6 | author: Bryce Wray 7 | date: 2021-08-11T11:30:00-05:00 8 | #lastmod: 9 | discussionId: "2021-08-boy-oh-grandboy" 10 | featured_image: 2021-08-09_BW-holding-Dylan_2978x1675.jpg 11 | featured_image_width: 2978 12 | featured_image_height: 1675 13 | featured_image_alt: "Bryce Wray holds his grandson, Dylan Everett Beck, shortly after the child’s birth" 14 | featured_image_caption: | 15 | Image: Sarah Beck (a/k/a Kennedy’s and Dylan’s mom) 16 | 17 | --- 18 | 19 | We found out last Christmas Day that [our granddaughter, Kennedy Beck](/posts/2020/03/welcome-sweet-little-early-bird), was going to be a big sister this summer. Then, on Valentine's Day and just before millions of Texans (including yours truly) were plunged into a power grid meltdown in the midst of a fierce winter storm, we learned the new arrival would be a boy. 20 | 21 | At 2:55 PM this past Monday, that boy---all six pounds, 10 ounces of Dylan Everett Beck---came into the world. He went home the next afternoon and, at last report, the members of the newly expanded family all were doing very well. 22 | 23 | Incidentally: as I [recently mentioned](/posts/2021/08/gems-in-rough-08), I've been paying close attention to the new [Astro](https://astro.build) static site generator and running some tests with it, so I've filed a few issues in its GitHub repository. When it became obvious that Dylan's birth was going to happen **soon**, I responded to one issue's proposed solution to say that I "will have to wait a while before I can try it, however --- my daughter is in the process of delivering our second grandchild." To my delight, this got mentioned on the Astro Discord community, whereupon I was greeted with a slew of congratulatory comments (and accompanying emojis) that I shared with Dylan's proud parents: 24 | 25 | {% imgc "Astro-Discord-general_2021-08-09_1794x1462.png", "Screen capture from a Discord community chat session", 1794, 1462 %} -------------------------------------------------------------------------------- /src/assets/svg/svgNavIcon_reduced.svg: -------------------------------------------------------------------------------- 1 | 2 | -------------------------------------------------------------------------------- /src/assets/svg/svgNavIcon_reduced-2021-05-22.svg: -------------------------------------------------------------------------------- 1 | 2 | -------------------------------------------------------------------------------- /src/assets/svg/svgJSONfeedIcon.svg: -------------------------------------------------------------------------------- 1 | -------------------------------------------------------------------------------- /src/_includes/layouts/_default/index.njk: -------------------------------------------------------------------------------- 1 | --- 2 | title: BryceWray.com 3 | layout: base 4 | --- 5 | 6 |
7 |
8 |
9 |

Welcome to brycewray.com, offering its owner’s “observations, opinions, and geekiness” since 2018.

10 |
11 |
12 |
13 |

Latest posts

14 | {% for post in collections.post | reverse %} 15 | {% if loop.index0 < 3 %} 16 |
17 |

{{ post.data.title | safe }}

18 |

{{ post.data.subtitle | safe }}

19 |

20 | 21 | {% if post.data.lastmod %} 22 |
Last modified 23 | {% endif %} 24 |

25 |

26 | {{ post.data.description | safe }} 27 |

28 |
29 | {% endif %} 30 | {% endfor %} 31 |

All {{ collections.post.length }} posts (listed five per page)

32 |
33 |
34 |
-------------------------------------------------------------------------------- /src/assets/utils/imgc.js: -------------------------------------------------------------------------------- 1 | /* 2 | This shortcode takes the following form... 3 | {% imgc url, alt, width, height, tmpl %} 4 | ...with url in the form of (note NO leading or ending slash): 5 | filename.ext 6 | ...and 'temp[late]' optional in body copy. The template is used 7 | to specify hero images on post pages ('posts'). 8 | Without this parameter, the `switch` statement below defaults 9 | to body copy-style image-handling. 10 | */ 11 | 12 | const respSizes = require(`../../../_data/siteparams.json`).respSizes 13 | var cloudiBase = 'https://res.cloudinary.com/brycewray-com/image/upload/' 14 | var LQIPpholder = 'f_auto,q_1,w_20/' // note ending slash 15 | var xFmPart1 = 'f_auto,q_auto:eco,w_' 16 | var xFmPart2 = ',x_0,z_1/' // note ending slash 17 | 18 | module.exports = (url, alt, width, height, tmpl) => { 19 | if (!tmpl) tmpl == "none" 20 | 21 | switch(tmpl) { 22 | /* 23 | case 'index': 24 | divClass = `h-full` 25 | imgClass = `object-cover object-center h-full w-full containedImage lazy` 26 | nscClass = `imgCover hero` 27 | dataSzes = `100vw` 28 | break 29 | */ 30 | case 'posts': 31 | divClass = `h-full` 32 | imgClass = `imgCover hero lazy` 33 | nscClass = `imgCover` 34 | dataSzes = `100vw` 35 | break 36 | default: 37 | divClass = `relative` 38 | imgClass = `containedImage lazy` 39 | nscClass = `containedImage` 40 | dataSzes = `(min-width: 1024px) 100vw, 50vw` 41 | } 42 | 43 | var separator = ', ' 44 | 45 | var stringtoRet = `` 46 | stringtoRet = `
47 | ${alt} 60 |
61 | ` 64 | 65 | return stringtoRet 66 | } 67 | -------------------------------------------------------------------------------- /src/assets/css/global.css: -------------------------------------------------------------------------------- 1 | 2 | main { 3 | @apply pt-10 lg:pt-12; /* needed in Eleventy repo; handled elsewhere in Hugo repo */ 4 | } 5 | 6 | html, body { 7 | @apply dark:bg-black; 8 | } 9 | 10 | body { 11 | @apply dark:text-gray-100; 12 | /* font-feature-settings: "liga" 1; */ 13 | /* commenting out because of Menlo weirdness if browser uses */ 14 | } 15 | 16 | @media (prefers-color-scheme: dark) { 17 | body { 18 | font-weight: 375; 19 | } 20 | bold, strong { 21 | font-weight: 650; 22 | } 23 | } 24 | 25 | p, li { 26 | /* for handling Markdown-created

and

  • */ 27 | @apply mb-3 text-lg; 28 | } 29 | 30 | ul li li { 31 | list-style-type: circle; 32 | } 33 | 34 | ul li li li { 35 | list-style-type: square; 36 | } 37 | 38 | a { 39 | @apply no-underline border-b text-blue-500 border-blue-500 dark:text-blue-100 dark:border-blue-100; 40 | &:focus, &:hover, &:active { 41 | @apply text-blue-600 border-blue-600 dark:text-blue-50 dark:border-blue-50; 42 | } 43 | } 44 | 45 | sup a, a.previous, a.next, .footnote-return { 46 | @apply border-b-0; 47 | } 48 | 49 | h1, .h1, h2, .h2, h3, .h3, h4, .h4, h5, .h5, h6, .h6 { 50 | @apply font-bold leading-tight tracking-tight; 51 | } 52 | 53 | h1, .h1 { 54 | @apply text-4xl mb-4; 55 | font-weight: 825; 56 | } 57 | 58 | h2, .h2, h3, .h3, h4, .h4, h5, .h5, h6, .h6 { 59 | font-weight: 625; 60 | } 61 | 62 | h2, .h2 { 63 | @apply text-4xl; 64 | } 65 | 66 | h3, .h3 { 67 | @apply text-3xl; 68 | } 69 | 70 | h3, .h3, h5, .h5 { 71 | @apply italic; 72 | } 73 | 74 | h4, .h4 { 75 | @apply text-2xl; 76 | } 77 | 78 | h5, .h5, h6, .h6 { 79 | @apply text-lg; 80 | } 81 | 82 | article h1, article h2, article h3, article h4 { 83 | @apply tracking-tight mt-8 mb-6; 84 | } 85 | 86 | article p, li { 87 | @apply text-lg mt-6 mb-6 leading-relaxed; 88 | } 89 | 90 | article img.containedImage, article picture img { 91 | @apply min-w-full max-w-full w-full h-auto; 92 | /* latter two for no-jank in Chrome and Firefox */ 93 | } 94 | 95 | @media screen and (min-width: 769px) { 96 | article p, li { 97 | @apply text-xl leading-relaxed; 98 | } 99 | } 100 | 101 | @media screen and (min-width: 1920px) { 102 | article p, li { 103 | @apply text-2xl leading-relaxed; 104 | } 105 | } 106 | 107 | ul, ol { 108 | @apply pl-8; 109 | } 110 | 111 | ul { 112 | @apply list-disc; 113 | } 114 | 115 | ol { 116 | @apply list-decimal; 117 | } 118 | 119 | blockquote { 120 | @apply px-6 text-gray-700 dark:text-gray-300 border-l-4 border-gray-300 dark:border-gray-400; 121 | } 122 | 123 | hr { 124 | @apply border-solid border-gray-900 dark:border-gray-100; 125 | } 126 | -------------------------------------------------------------------------------- /src/privacy/index.md: -------------------------------------------------------------------------------- 1 | --- 2 | layout: privacy 3 | title: "Privacy policy" 4 | description: "Information regarding this site and its vendors" 5 | author: Bryce Wray 6 | date: 2020-08-02T09:00:00-05:00 7 | lastmod: 2021-08-15T16:52:00-05:00 8 | --- 9 | 10 | This site and its owner **do NOT** store your personal information **in any way**. However, the site does use certain **externally hosted** services, each of which has its own privacy policies and methods of complying with applicable privacy regulations. 11 | 12 | ## Notes about external services 13 | 14 | ### Cloudflare Browser Insights 15 | 16 | This site's traffic goes through [Cloudflare](https://cloudflare.com) and is configured to use its Browser Insights tool. Cloudflare says Browser Insights "collects the bare minimum amount of information, timing metrics, to show customers how their websites perform" and that "Cloudflare does not track individual end-users *[sic]* across our customers' Internet properties." For more details, see [this Cloudflare support article](https://support.cloudflare.com/hc/en-us/articles/360033929991-Cloudflare-Browser-Insights) and the Cloudflare blog post, "[Introducing Browser Insights](https://blog.cloudflare.com/introducing-browser-insights/)." 17 | 18 | ### Fathom Analytics 19 | 20 | This site uses [Fathom Analytics](https://usefathom.com), which [does not store your personal data in any way](https://usefathom.com/blog/anonymization). Please refer also to my article, "[Fathom Analytics: count on it](/posts/2020/06/fathom-analytics-count-on-it)." 21 | 22 | ### Google Fonts 23 | 24 | When I learned that the use of [Google Fonts](https://fonts.google.com) *served from* Google will transmit a visitor's apparently **not** anonymized IP address[^Issue1495] to Google, I quit using this product (and suggesting to others that they use it) and, instead, served from my own site any typefaces that aren't part of the so-called "[system fonts stack](/posts/2018/10/web-typography-part-2)." 25 | 26 | [^Issue1495]: For the discussion that convinced me to go this route after my initial skepticism about its necessity, see the Google Fonts GitHub issue, "[GDPR compliance](https://github.com/google/fonts/issues/1495)." 27 | 28 | ### Twitter 29 | 30 | This site *quotes* tweets in the form of purely static text (with, obviously, no tracking involved), rather than embeds of any kind. 31 | 32 | ## Other considerations 33 | 34 | ### Embedded videos 35 | 36 | I no longer embed YouTube or other sites’ videos, since they can and do transmit personal information through cookies. In the two instances where I formerly did---“[Some curmudgeonish thoughts](/posts/2018/11/some-curmudgeonish-thoughts)” and “[Coherence and COVID-19](/posts/2020/03/coherence-covid-19)”---I replaced them with clearly identified links to their original locations, and footnoted each link with a reference and link to this privacy policy. 37 | -------------------------------------------------------------------------------- /src/assets/svg/svgNavIcon.svg: -------------------------------------------------------------------------------- 1 | -------------------------------------------------------------------------------- /src/assets/svg/svgFooterIcon.svg: -------------------------------------------------------------------------------- 1 | -------------------------------------------------------------------------------- /src/posts/2020/09/two-but-not-terrible.md: -------------------------------------------------------------------------------- 1 | --- 2 | layout: singlepost 3 | tags: post 4 | title: "Two, but not terrible" 5 | subtitle: "Dual candles on the site’s cake" 6 | description: "“Reminiscin’” as this site celebrates its second birthday." 7 | author: Bryce Wray 8 | date: 2020-09-15T06:20:00-05:00 9 | #lastmod: 10 | discussionId: "2020-09-two-but-not-terrible" 11 | featured_image: "sahin-sezer-dincer-YhoQj_EUi50-unsplash_5063x3375.jpg" 12 | featured_image_width: 5063 13 | featured_image_height: 3375 14 | featured_image_alt: "Monochrome photograph of an hourglass sitting on a tree log" 15 | featured_image_caption: | 16 | Image: Şahin Sezer Dinçer; Unsplash 17 | --- 18 | 19 | Here we are, two years in. 20 | 21 | Although the site's officially [first post](/posts/2018/09/hardy-press-wp-ssg-with-twist) is actually dated as a day earlier, in point of fact it was two years ago today---Saturday, September 15, 2018---that I first put brycewray.com on the web. 22 | 23 | That was a Day Job ago, a [new grandchild](/posts/2020/03/welcome-sweet-little-early-bird) ago, a [worldwide pandemic](/posts/2020/03/coherence-covid-19) ago, a "[dance](/posts/2019/12/sorta-strange-ssg-trip)" ago, and a "[lurch](/posts/2020/09/goodbye-hello-part-5)" ago. 24 | 25 | The site's existence has allowed me to make new friends and acquaintances in amazing places I'll almost certainly never visit and fascinating fields of expertise in which I'll probably never be more than a curious newbie. I've been able to learn about stuff I didn't even know existed when the site first went live. And I've mostly had a ball doing all of that. I sincerely hope any of you who've spent some time here have enjoyed it, too. 26 | 27 | By most sites' likely standards, this one's traffic is anemic---typically, only a few hundred unique visitors a day, according to [Fathom Analytics](https://usefathom.com)---but, after all, as I've made clear in [the site's "About" page](/about) from the beginning: 28 | 29 | > Am I anybody special? Nope; just an ordinary working guy who, for decades, has used a multitude of computing devices, operating systems, and apps---and learned a few things (and formed more than a few opinions) along the way. I've been told I can make complicated things easier to understand, and I try to do the same here. 30 | 31 | That's an effort I shall continue to make. This site may be two years old, but I'm determined to make sure it won't be a "[terrible two](https://www.mayoclinic.org/healthy-lifestyle/infant-and-toddler-health/expert-answers/terrible-twos/faq-20058314)." 32 | 33 | To all of you who've been part of the site's visitors during its first two years, thanks for your time. To those who will come by in the future, I hope to make each visit worth your while. And, to those who've extended compliments about anything within the site, please know that those kind thoughts mean the world to me. -------------------------------------------------------------------------------- /src/posts/2020/08/goodbye-hello-part-3.md: -------------------------------------------------------------------------------- 1 | --- 2 | layout: singlepost 3 | tags: post 4 | title: "Goodbye and hello • Part 3" 5 | subtitle: "Performance is a heckuva drug" 6 | description: "Earlier considerations aside, I move the site to Vercel for a second time." 7 | author: Bryce Wray 8 | date: 2020-08-21T17:05:00-05:00 9 | lastmod: 2021-05-16T10:38:00-05:00 10 | discussionId: "2020-08-goodbye-hello-3" 11 | featured_image: "oscar-sutton-pBrHNFqcX-M-unsplash_3888x2592.jpg" 12 | featured_image_width: 4608 13 | featured_image_height: 2592 14 | featured_image_alt: "Exhaust flame resulting from a sport car’s turbo boost" 15 | featured_image_caption: | 16 | Image: Oscar Sutton; Unsplash 17 | --- 18 | 19 | {% disclaimer %} 20 | 21 | Perhaps by now you've read how I [moved the site](/posts/2020/07/goodbye-hello-part-2) back to [Netlify](https://netlify.com), its long-time home, following the [initial move](/posts/2020/07/goodbye-hello) to [Vercel](https://vercel.com). If so, you know it was largely a sentimental decision, born out of my having missed being a part, even if a small one, of the Netlify community. 22 | 23 | Well, that's nice and all, but . . . 24 | 25 | . . . I undid the undoing today and **returned** the site to Vercel.[^fastReturn] 26 | 27 | [^fastReturn]: Since I was going back off Netlify DNS to Google DNS, the return was stunningly quicker than the earlier move the other way---as in, minutes rather than hours. 28 | 29 | Why? 30 | 31 | - It's not exactly a "need for speed" thing, but I'm impressed by how considerably Vercel has [amped up its Edge Network infrastructure in recent weeks](https://vercel.com/blog/new-edge-dev-infrastructure). And, unlike Netlify's free tier, Vercel's free tier gives cheapos such as Yours Truly the full advantage of top-tier performance. I don't know **why** but, hey, gift horses' mouths and all that stuff. 32 | 33 | - By contrast, the performance of Netlify's free tier seems to be dragging even more lately---particularly in the [TTFB](https://en.wikipedia.org/wiki/Time_to_first_byte) category. ([Waterfalls, waterfalls, waterfalls](https://web.dev/identify-resources-via-network-panel/).) That said,I can certainly understand if Netlify chooses not to put significant resources toward the freebie level. It's all business, of course. Fair enough. 34 | 35 | - There's also the simple fact that I admire the opinions of the extremely smart guys who run Fathom Analytics, who are [moving their site to Vercel later this year](https://usefathom.com/blog/tech-stack). Learning that (which was after I'd moved back to Netlify, in my own defense) probably was the first thing that got me to re-thinking my re-think, if you will. 36 | 37 | So we'll see if I stick around this time. I hope this is not going to be the site-hosting equivalent of [last year's SSG "dance."](/posts/2019/12/sorta-strange-ssg-trip) And, if you're one of my few but highly appreciated regular visitors, I'm sure you share that hope. 38 | 39 | **Note**: [To be continued](/posts/2020/09/goodbye-hello-part-4) (sigh). {.yellowBox} -------------------------------------------------------------------------------- /src/posts/2020/03/welcome-sweet-little-early-bird.md: -------------------------------------------------------------------------------- 1 | --- 2 | layout: singlepost 3 | tags: post 4 | title: "Welcome, sweet little early bird" 5 | subtitle: "Plans, schmans" 6 | description: "The new grandchild arrives, and on her own timeline." 7 | author: Bryce Wray 8 | date: 2020-03-10T09:50:00-05:00 9 | #lastmod: TBD 10 | discussionId: "2020-03-welcome-sweet-little-early-bird" 11 | featured_image: "door-bear-for-newborn-Kennedy-Beck_edit_1280x720.jpg" 12 | featured_image_width: 1280 13 | featured_image_height: 720 14 | featured_image_alt: "Hospital room “door bear” to commemorate birth of Kennedy Beck" 15 | #featured_image_caption: "Image: [photographer]; [source site]" 16 | --- 17 | 18 | This'll be short. It's just an update on some good news I'd previously mentioned. 19 | 20 | The old saying is that "Life is what happens when you're making other plans." True dat, as the kids were saying a few years ago. 21 | 22 | I [told](/posts/2019/09/now-im-sixty-four) you back in September that we were awaiting our first grandchild; then, in November, I [noted](/posts/2019/11/mixed-nuts-2019-11) that we'd learned she'd be a granddaughter, arriving in April. 23 | 24 | Granddaughter? Check. But arriving in April? Well . . . 25 | 26 | This past Saturday morning, March 7, I ran a quick errand and, planning to have a restful weekend from there, started to write what was to have been the next post here. Suddenly, I heard my wife's distressed voice from down the hall: a text from our daughter said her "water" had "broken" and she was already at the hospital. 27 | 28 | Ohhhhhhkay. So much for plans. 29 | 30 | About nine hours after we received that "breaking" news (sorry), Kennedy Lane Beck arrived. She weighed five pounds, one ounce, and measured eighteen-and-a-quarter inches in length. Mom, Dad, and Kennedy are all fine---the normal sleepless experience for new parents notwithstanding---and are now home. 31 | 32 | As I close this little update about this new little one, please allow "Pawpaw"---as I apparently will be called---to share a small smattering of photos about this momentous event in our little family. Think of it as the online equivalent of what I'd have done if this were decades ago and we met on the street, in which case I'd be whipping out a wallet containing photographs of the new arrival. 33 | 34 | {% imgc "Mom-and-Dad-admire-Kennedy-first-night__1008x756.jpg", "Brad and Sarah Beck (the latter is our daughter) admire their new child, Kennedy, less than an hour after her arrival", 1008, 756 %} 35 | 36 | Our daughter and son-in-law, Sarah and Brad, admire their new baby, less than an hour after she arrived.{.imgcCaption} 37 | 38 | {% imgc "BW-holding-Kennedy-first-night__crop_1008x712.jpg", "Bryce Wray holds his new granddaughter, Kennedy Beck, on the night of her birth", 1008, 712 %} 39 | 40 | Your faithful correspondent holds his first grandchild for the first time, on the first night of her life. Enough "firsts" for you there?{.imgcCaption} 41 | 42 | {% imgc "Kennedy-goes-home__crop_1008x1021.jpg", "Kennedy Beck, a newborn baby, rests in a car seat as she goes home for the first time", 1008, 1021 %} 43 | 44 | Despite her slightly early arrival, Kennedy checked out just fine over the next couple of days, and Mom and Dad got to take her home when she was a bit over forty-three hours old.{.imgcCaption} -------------------------------------------------------------------------------- /src/posts/2019/09/now-im-sixty-four.md: -------------------------------------------------------------------------------- 1 | --- 2 | layout: singlepost 3 | tags: post 4 | title: "Now I’m sixty-four" 5 | subtitle: "Amending my obligatory earworm" 6 | description: "Having reached this milestone-of-sorts, I offer some different wording for a Lennon/McCartney classic that suits me today." 7 | author: Bryce Wray 8 | date: 2019-09-06T06:40:00-05:00 9 | lastmod: 2020-03-29T09:08:00-05:00 10 | discussionId: "2019-09-now-im-sixty-four" 11 | featured_image: "chevrolet-1955-stylized-829805_1280x720.jpg" 12 | featured_image_width: 1280 13 | featured_image_height: 720 14 | featured_image_alt: "Stylized view of a deep blue 1955 Chevrolet Bel Air two-door automobile" 15 | featured_image_caption: | 16 | Image: jchurch1977; Pixabay; edited in Affinity Photo 17 | oldComments: | 18 |
    19 |

    20 | (Older comments imported from previous comments host, Talkyard.) 21 |

    22 |

    Cap Pike 2019-09-07

    23 |

    People that use Word that don't "get" styles and formatting in general are generally just annoying. Like people who drive that don't bother with turn signals.
    24 | ...and then there's Excel...

    25 |
    26 | --- 27 | 28 | *(With apologies to the late John Lennon and the very much still-with-us Sir Paul McCartney. [Original lyrics](https://en.wikipedia.org/wiki/When_I'm_Sixty-Four) © Sony/ATV Music Publishing LLC.*) 29 | 30 | Long before aging, 31 | I lost my hair 32 | Many years ago, 33 | So there's no point belaboring that 34 | Or hiding it by wearing a hat. 35 | 36 | Quarter past three is 37 | About when I wake. 38 | [I can't sleep much more](https://www.sleepfoundation.org/articles/aging-and-sleep). 39 | That's just the way 40 | My life goes these days: 41 | Now I'm sixty-four. 42 | 43 | I'm still a tech nerd, 44 | Although some folks my age 45 | [Struggle to use Word](https://www.dummies.com/software/microsoft-office/office-2019-for-seniors-for-dummies-cheat-sheet/). 46 | 47 | When my employer's 48 | Websites need work, 49 | Or when my own does, too, 50 | I'm just glad that I can still code 51 | And that I still "get" Admin mode. 52 | 53 | Building `do-while` [loops](https://developer.mozilla.org/en-US/docs/Web/JavaScript/Reference/Statements/do...while), editing [styles](https://developer.mozilla.org/en-US/docs/Web/CSS): 54 | Who could ask for more? 55 | That's why work needs me 56 | And it still feeds me 57 | Though I'm sixty-four. 58 | 59 | Getting older is a thing you have to do 60 | In the course of life. That's just the deal. 61 | But it's not all bad. 62 | Now a grandchild's on the way: 63 | A little lass or lad. 64 | 65 | Thrilled with such good news, 66 | I've reached this day, 67 | Awaiting things to come, 68 | Knowing that a tiny face soon will see me 69 | And wonder just who I may be. 70 | 71 | "Kid, I'm your grandpa," I will explain. 72 | "Will be, forevermore." 73 | And on this birthday, 74 | Yes, sir, I do say: 75 | Now I'm sixty-four. -------------------------------------------------------------------------------- /src/posts/2021/01/leaner-cleaner.md: -------------------------------------------------------------------------------- 1 | --- 2 | layout: singlepost 3 | title: "Leaner and cleaner" 4 | subtitle: "Simpler is (usually) better" 5 | description: "After I remind myself of this site’s original, spartan appearance, changes result." 6 | author: Bryce Wray 7 | date: 2021-01-31T10:10:00-06:00 8 | lastmod: 2021-05-16T10:05:00-05:00 9 | #draft: false 10 | discussionId: "2021-01-leaner-cleaner" 11 | featured_image: "rest-5977908_6000x4000.jpg" 12 | featured_image_width: 6000 13 | featured_image_height: 4000 14 | featured_image_alt: "Concept photo of simplicity, showing single twig sticking out of still water" 15 | featured_image_caption: | 16 | Image: Achim Ruhnau; Pixabay 17 | --- 18 | 19 | {% disclaimer %} 20 | 21 | To those of you who've been here before: yep, this **is** the same site. It just looks considerably different than it did yesterday. 22 | 23 | The most notable change is that it's completely free of "hero images," even the familiar guy-typing-on-a-typewriter photo that used to grace the home page. Now, the only images you see on this site are those which offer explanatory value (*e.g.*, the one further down on this particular page). 24 | 25 | There are other stylistic changes here and there, but they pretty much speak for themselves. 26 | 27 | I also took this "housecleaning" opportunity to make the home page more useful to stoppers-by, or at least I hope so. My usual rambling "well-sonny-this-is-how-I-remember-the-early-days-of-the-web" monologue is now where it probably should've been all along, which is on the ["About me" page](/about). 28 | 29 | ## Why the changes? 30 | 31 | So why all these fairly radical adjustments? 32 | 33 | They happened because I wanted to recapture a cleanness and simplicity the site once had, even before any of you had a chance to see it. 34 | 35 | In recent weeks, I've been looking at an old repository which shows how the site looked in its earliest days, back in the late summer of 2018 while it was still in development on my Mac before I actually took it live: 36 | 37 | {% imgc "orig-site_screen-cap_1518x1356.png", "Screen capture of this website’s pre-launch appearance in 2018", "1518", "1356" %} 38 | 39 | Of course, that was over 100 [posts](/posts) ago and a lot has changed in the interim; but, in the end, I decided that the simpler and cleaner I could make the site look, the better.[^BTW] 40 | 41 | [^BTW]: By the way: these changes notwithstanding, I'm still using [Cloudinary](https://cloudinary.com) to [host the site's remaining images](/posts/2020/07/transformed). I see no reason to change that, especially because I don't want to go back to keeping those images in the site repo. And the styling is still from [Tailwind CSS](https://tailwindcss.com), as has been the case since [last spring](/posts/2020/05/going-solo-eleventy)---although I did give some serious thought to trying it in the site's original styling setup, which used [SCSS](https://sass-lang.com). I chose not to do so because, although I'm trying to simplify, I also don't want to get too far behind the web dev industry, where [Tailwind's popularity continues to grow](https://2020.stateofcss.com/en-US/technologies/css-frameworks/). 42 | 43 | All of this also considerably lowered the site's download sizes. That's a win-win. 44 | 45 | And that's the story: short, sweet, and---like the result itself---simple. -------------------------------------------------------------------------------- /src/posts/2021/06/beginners-luck-3-adding-zola-starter.md: -------------------------------------------------------------------------------- 1 | --- 2 | layout: singlepost 3 | tags: post 4 | title: "Beginner’s luck #3: adding a Zola starter" 5 | subtitle: "And then there were seven" 6 | description: "For those interested in a (somewhat) easy take on Hugo, here’s a starter set for you." 7 | author: Bryce Wray 8 | date: 2021-06-25T16:50:00-05:00 9 | lastmod: 2021-07-20T07:05:00-05:00 10 | discussionId: "2021-06-beginners-luck-3-adding-zola-starter" 11 | featured_image: susan-holt-simpson-H7SCRwU1aiM-unsplash_4608x3072.jpg 12 | featured_image_width: 4608 13 | featured_image_height: 3072 14 | featured_image_alt: "Colorful toy alphabet blocks" 15 | featured_image_caption: | 16 | Image: Susan Holt Simpson; Unsplash 17 | 18 | --- 19 | 20 | **Update, 2021-07-20**: Due to breaking changes introduced in Zola version 0.14.0 (released 2021-07-19), **DO NOT** use either starter set mentioned herein with that version or higher. 21 | {.yellowBox} 22 | 23 | This will be an unusually short entry. I just wanted to advise that I've built my seventh [static site generator (SSG)](https://jamstack.org/generators) [starter set](/posts/2021/03/beginners-luck-update). It uses [Zola](https://getzola.org), and you can find its GitHub repository at [https://github.com/brycewray/zola_solo](https://github.com/brycewray/zola_solo). There's also a [live demo](https://zola-solo.vercel.app). 24 | 25 | Unfamiliar with Zola? It's a [Rust](https://rust-lang.org)-based SSG that came about because its creator, [Vincent Prouillet](https://www.vincentprouillet.com/), was using the [Go](https://golang.org)-based [Hugo](https://gohugo.io). He loved the fact that Hugo was a single binary (see my article, "[Eleventy and Hugo: comparing and contrasting](/posts/2020/12/eleventy-hugo-comparing-contrasting)," for some insight into why that can be appealing) but became frustrated by the unwieldiness of Go templating. Instead, he decided to build a very Hugo-like SSG but with much simpler templating, based on his own creation: the [Tera](https://tera.netlify.app/) template engine. If you're familiar with how [Nunjucks](https://mozilla.github.io/nunjucks/) reads and works in [Eleventy](https://11ty.dev), you'll find Tera's syntax and feature set quite familiar and, therefore, comfortable. 26 | 27 | If you want to use this starter set, be sure to check the repo README for some important details---especially if you're interested in using footnotes in your Markdown. The README also notes that I don't plan any additional development on this set for the time being. This is for the same reasons as with my Hugo starter sets, mainly that there are certain needed features or compatibilities which each respective SSG lacks, as I [complained a few days ago about Hugo](/posts/2021/06/gems-in-rough-06). 28 | 29 | All that aside, I had some nerdy fun building this starter, debugging it, and generally learning more about how Zola works. Perhaps it will similarly appeal to your own geekiness. 30 | 31 | **Update, 2021-06-26**: I've now added an **eighth** starter repo. It's [another Zola starter](https://github.com/brycewray/zola_twcss) (with a [demo version](https://zola-twcss.vercel.app) also live), but uses [Tailwind CSS](https://tailwindcss.com)---**including** the [JIT mode](https://tailwindcss.com/docs/just-in-time-mode), which Hugo **still** doesn't support---rather than Sass. Unlike the other repo that I added yesterday, this one likely will stay in active development at least for a while because of Zola's ability to work with Tailwind and JIT, although I still am perturbed by Zola's own shortcomings (notably about footnote-handling). 32 | {.yellowBox} -------------------------------------------------------------------------------- /src/posts/2020/09/goodbye-hello-part-5.md: -------------------------------------------------------------------------------- 1 | --- 2 | layout: singlepost 3 | tags: post 4 | title: "Goodbye and hello • Part 5" 5 | subtitle: "Failing to plan" 6 | description: "Two embarrassments: another site move and the reason behind it." 7 | author: Bryce Wray 8 | date: 2020-09-09T14:30:00-05:00 9 | lastmod: 2021-05-16T10:39:00-05:00 10 | discussionId: "2020-09-goodbye-hello-5" 11 | featured_image: "pencil-two-with-erasers-macro-1277094_3872x2592.jpg" 12 | featured_image_width: 3872 13 | featured_image_height: 2592 14 | featured_image_alt: "Closeup of two pencils and their erasers" 15 | featured_image_caption: | 16 | Image: Jeff Weese; Pixabay 17 | --- 18 | 19 | {% disclaimer %} 20 | 21 | Just when I thought the site's "lurch"[^danceRef] among hosts was over with [last week's landing](/posts/2020/09/goodbye-hello-part-4) at [Render](https://render.com), I tripped on a banana peel whose presence in my path was entirely my own fault. 22 | 23 | [^danceRef]: Can't call it the "dance" because I [already ran that term into the ground for another purpose](/posts/2019/12/sorta-strange-ssg-trip). 24 | 25 | When I drew up the requirements I mentioned in [Part 1](/posts/2020/07/goodbye-hello) for the site's host, I thought I'd covered all the use cases to which I'd become accustomed in the nearly two years of this site's existence. 26 | 27 | *\* Wrong. Go to jail. Do not pass **Go**. Do not collect two hundred dollars. *(That's what I'm telling **myself**, you understand.)* 28 | 29 | Turns out there was one thing I'd forgotten, perhaps because it had been so long since I'd last needed to do it. 30 | 31 | Keep in mind that this site, like so many others built on the [Jamstack](https://jamstack.wtf), is auto-generated every time changes are pushed to the online repository where it lives. Well, sometimes, you may want to change *which* repository is "watched" so you can make some really major change to the site without having to shut it down---thus forcing the sometimes sluggish regeneration of the site's SSL certificate---and rebuild it. 32 | 33 | I've done it before, and, trust me, I know I'll need to do it again. 34 | 35 | And **that** was the scenario I forgot when evaluating the hosts I considered, which, again, were (in alphabetical order): [Firebase](https://firebase.google.com), [Netlify](https://netlify.com), the aforementioned Render, and [Vercel](https://vercel.com). With Firebase, you have to set it up yourself, but it's doable. With Netlify and Vercel, you simply point the site to a new repo and, just like that, you're done. 36 | 37 | Render, however, currently lacks the capability for a site owner to do this. One of Render's techs helpfully offered to handle it for me if I wished, but noted that "it's not something we often do and technically we don't support it." 38 | 39 | So that was all she wrote for the site on Render, just a few days into my second run with it. Again---entirely my fault, not Render's, for my failure to evaluate that particular capability upfront. 40 | 41 | Please learn from my bad example and, when you're evaluating website hosts, make sure you've run through *all* the possible needs you'll have. If you're new to having a site, of course, you may not know what those are. But I'm definitely *not* new to this, so I should've known better. Don't be me. 42 | 43 | Oh, and one more thing: if you're wondering whence the site *now* originates, I'd say simply: use your browser's inspector tool and check the headers. Otherwise, this unintentional saga about the "lurch" may stretch to an even more ridiculous number of parts, and I think we all could do without that. I certainly could. -------------------------------------------------------------------------------- /src/posts/2019/10/its-about-food-not-decor.md: -------------------------------------------------------------------------------- 1 | --- 2 | layout: singlepost 3 | tags: post 4 | title: "It’s about the food, not the decor" 5 | subtitle: "The delivery method matters far less than what’s being delivered" 6 | description: "Thoughts about my recent emphasis on switching between SSGs." 7 | author: Bryce Wray 8 | date: 2019-10-02T18:15:00-05:00 9 | lastmod: 2021-05-16T10:20:00-05:00 10 | discussionId: "2019-10-its-about-food-not-decor" 11 | featured_image: "mount-horeb-lunch-4162348_3000x2006.jpg" 12 | featured_image_width: 3000 13 | featured_image_height: 2006 14 | featured_image_alt: "Duotone photo of a diner with customers waiting to be served" 15 | featured_image_caption: | 16 | Image: Mike Goad; Pixabay 17 | --- 18 | 19 | {% disclaimer %} 20 | 21 | Keeping this brief, for once . . . 22 | 23 | I will no longer be boring you with endless agonizing over which [static site generator](https://staticgen.com) (SSG) I'm using on this site. 24 | 25 | While I plan to continue basing this site on [the JAMstack](https://jamstack.org), I won't commit to any particular way to do that. It's a decision that I will make based on whatever looks right at the time. As long as it isn't detrimental to the site's content, it's all good. 26 | 27 | I **will** occasionally offer observations **about** SSGs, including how to install and use them, because I'm interested in them and, I gather, many of you readers are, too. 28 | 29 | But I won't take sides again. At least, not overtly. (That is: those of you who like to peek at source code will be able to figure it out readily enough---if you care, which I'm guessing you don't.) 30 | 31 | In the last few months, I wrote several posts about switching or not switching around in the SSG arena. I portrayed each choice almost as something to be carved in one's arm as a ritual, an undying commitment. 32 | 33 | Yeah, right. 34 | 35 | No one cares about which make of truck brought the food to the restaurant; they just expect, by God, to have **good** food served to them. 36 | 37 | In the most recent such post, I had quoted "[The pros of using a boring stack](https://flaviocopes.com/boring-stack/)" by Flavio Copes, but apparently didn't grasp sufficiently the most telling point he made: 38 | 39 | > . . . if you want to create a blog and be serious at it, then use the most boring and bulletproof thing you can find. Definitely **don’t work on your blog infrastructure if you want to do any serious blogging**. 40 | > 41 | > **The tech must go out of the way**[;] you should only **focus on the content**. 42 | > 43 | > Otherwise you'll spend most of your free time tweaking the blog platform (which --- let's be clear --- **no one except you cares about**) instead of writing content. No one cares about that infrastructure. 44 | 45 | > One rule is that you know the pitfalls of your platform, the grass is always greener on the other side of the fence, and you like to imagine new platforms being 100% perfect. That never happens, and the devil is in the details. 46 | 47 | . . . because, even **in** that post where I quoted him, I was still going on about committing to one SSG over another. 48 | 49 | I am a curious tech geek, so I will keep learning, and perhaps even switching platforms from time to time as the learning may dictate. This ain't the Army, after all. But I will do so without compromising what I bring to you here. There aren't many of you, so Google Analytics tells me daily, but I still appreciate your choice to stop by, and I intend to help you make the most of that choice. 50 | 51 | And I **really** hope that's the last thing I need to say on that subject---almost as much as some of you probably do. -------------------------------------------------------------------------------- /src/assets/css/nav.css: -------------------------------------------------------------------------------- 1 | /* 2 | CSS-only and **accessible** menu based on... https://codepen.io/jonraedeke/pen/WRwJQX ...but considerably changed since then, especially due to change to Tailwind CSS 3 | */ 4 | 5 | .nav__item { 6 | @apply p-0 m-0; 7 | 8 | & a { 9 | @apply block py-1 px-4 mb-1 text-white no-underline border-0 transition-opacity duration-500 ease-linear; 10 | 11 | &:link, &:visited { 12 | @apply text-white; 13 | } 14 | 15 | &:hover, &:focus { 16 | @apply no-underline opacity-75; 17 | } 18 | } 19 | } 20 | 21 | @media (min-width: 900px) { 22 | .nav__item { 23 | @apply font-bold lowercase inline-block; 24 | font-variant: small-caps; 25 | & a { 26 | @apply text-sm inline-block pt-1 pb-0 no-underline uppercase 27 | } 28 | } 29 | } 30 | 31 | .nav__icon { 32 | @apply block absolute cursor-pointer; 33 | top: 15px; 34 | right: 13px; 35 | height: 27px; 36 | width: 27px; 37 | text-indent: -9999px; 38 | /* hide the label */ 39 | transition: all 1s cubic-bezier(.19, 1, .22, 1); 40 | /* Remove blinking cursor */ 41 | @apply border-none text-transparent text-center; 42 | text-shadow: 0 0 0 gray; 43 | &:focus { 44 | @apply outline-none; 45 | } 46 | } 47 | @media (min-width: 900px) { 48 | .nav__icon{ 49 | @apply hidden; 50 | } 51 | } 52 | 53 | .nav__icon-line { 54 | @apply absolute block bg-white rounded left-0 transition-all duration-500 w-6 h-1 ease-linear; 55 | 56 | &:first-child { 57 | @apply top-0; 58 | } 59 | 60 | &:nth-child(2) { 61 | top: 8px; 62 | } 63 | 64 | &:nth-child(3) { 65 | top: 16px; 66 | } 67 | } 68 | 69 | /* Checkbox hack for toggling mobile menu */ 70 | input[type=checkbox] { 71 | @apply hidden invisible; 72 | &:checked { 73 | & ~ nav .nav__items { 74 | @apply h-auto bg-black dark:bg-blue-900 transition-all duration-500 ease-linear; 75 | max-height: 30rem; 76 | } 77 | & ~ label .nav__icon-line:first-child { 78 | @apply top-0 transform -rotate-45 translate-y-2 w-6; 79 | } 80 | & ~ label .nav__icon-line:nth-child(2) { 81 | @apply opacity-0; 82 | } 83 | & ~ label .nav__icon-line:nth-child(3) { 84 | @apply transform rotate-45 -translate-y-2 w-6; 85 | } 86 | } 87 | } 88 | 89 | nav { 90 | @apply absolute text-left left-0 w-full transition duration-500 ease-linear transform scale-x-100 scale-y-0 origin-top; 91 | top: 100%; 92 | & ul { 93 | @apply pl-0 m-0 text-right list-none transition duration-500 ease-linear; 94 | } 95 | & li { 96 | @apply mb-2 inline; 97 | margin-right: 5%; 98 | @media screen and (max-width: 899px) { 99 | display: inherit; 100 | } 101 | } 102 | & a { 103 | @apply text-white border-b-0 no-underline text-lg opacity-0; 104 | } 105 | } 106 | 107 | .nav-toggle:checked ~ nav { 108 | transform: scale(1, 1); 109 | & a { 110 | @apply opacity-100; 111 | } 112 | } 113 | 114 | .site-logo-holder { 115 | @apply mt-1 pt-1 w-full; 116 | & a { 117 | @apply no-underline border-b-0; 118 | } 119 | } 120 | 121 | #nav-toggle:checked + #navMenu { 122 | @apply block; 123 | } 124 | 125 | a.navborderless { 126 | @apply border-b-0; 127 | } 128 | 129 | /* === Beginning of primary settings for larger screens === */ 130 | @media screen and (min-width: 900px) { 131 | .nav-toggle-label { 132 | @apply hidden; 133 | } 134 | 135 | header { 136 | @apply fixed grid grid-cols-6; 137 | } 138 | 139 | .site-logo { 140 | @apply z-50 text-left col-start-1 col-end-3 text-lg; 141 | padding-left: 8%; 142 | } 143 | 144 | nav { 145 | @apply mt-0 col-start-3 col-end-7 transform-none; 146 | top: 15%; 147 | & a { 148 | @apply opacity-100 relative; 149 | } 150 | & ul { 151 | padding-right: 5%; 152 | @apply text-right; 153 | } 154 | & li { 155 | @apply inline-block p-0 mb-0; 156 | } 157 | } 158 | } 159 | 160 | /* === End of primary settings for larger screens === */ -------------------------------------------------------------------------------- /src/assets/css/prismjs.css: -------------------------------------------------------------------------------- 1 | /* PrismJS 1.17.1 2 | https://prismjs.com/download.html#themes=prism-tomorrow&languages=markup+css+clike+javascript+bash+markup-templating+git+go+graphql+php+markdown+powershell+jsx+yaml+toml&plugins=toolbar */ 3 | /** 4 | * prism.js tomorrow night eighties for JavaScript, CoffeeScript, CSS and HTML 5 | * Based on https://github.com/chriskempson/tomorrow-theme 6 | * @author Rose Pritchard 7 | */ 8 | 9 | code { 10 | @apply bg-blue-50 dark:bg-blueGray-700; 11 | } 12 | 13 | code[class*="language-"], 14 | pre[class*="language-"] { 15 | @apply text-blueGray-200 bg-transparent text-base whitespace-pre text-left break-normal leading-normal; 16 | word-spacing: normal; 17 | word-wrap: normal; 18 | tab-size: 4; 19 | hyphens: none; 20 | 21 | } 22 | 23 | /* Code blocks */ 24 | pre[class*="language-"] { 25 | @apply p-4 my-2 mx-0 overflow-auto; 26 | } 27 | 28 | :not(pre) > code[class*="language-"], pre[class*="language-"] { 29 | @apply bg-blueGray-900; 30 | } 31 | 32 | /* Inline code */ 33 | :not(pre) > code[class*="language-"] { 34 | border-radius: .3em; 35 | @apply p-[0.1em] whitespace-normal; 36 | } 37 | 38 | .token.comment, 39 | .token.block-comment, 40 | .token.prolog, 41 | .token.doctype, 42 | .token.cdata { 43 | @apply text-teal-200; 44 | } 45 | 46 | .token.punctuation { 47 | @apply text-blueGray-300; 48 | } 49 | 50 | .token.tag, 51 | .token.attr-name, 52 | .token.namespace, 53 | .token.deleted { 54 | @apply text-red-300; 55 | } 56 | 57 | .token.function-name { 58 | @apply text-sky-400; 59 | } 60 | 61 | .token.boolean, 62 | .token.number, 63 | .token.function { 64 | @apply text-orange-300; 65 | } 66 | 67 | .token.property, 68 | .token.class-name, 69 | .token.constant, 70 | .token.symbol { 71 | @apply text-amber-300; 72 | } 73 | 74 | .token.selector, 75 | .token.important, 76 | .token.atrule, 77 | .token.keyword, 78 | .token.builtin { 79 | @apply text-sky-200; 80 | } 81 | 82 | .token.string, 83 | .token.char, 84 | .token.attr-value, 85 | .token.regex, 86 | .token.variable { 87 | @apply text-blueGray-300; 88 | } 89 | 90 | .token.operator, 91 | .token.entity, 92 | .token.url { 93 | @apply text-amber-400; 94 | } 95 | 96 | .token.inserted { 97 | @apply text-green-400; 98 | } 99 | 100 | .token.important, 101 | .token.bold { 102 | @apply font-bold; 103 | } 104 | 105 | .token.italic { 106 | font-style: italic; 107 | } 108 | 109 | .token.entity { 110 | cursor: help; 111 | } 112 | 113 | div.code-toolbar { 114 | @apply relative; 115 | } 116 | 117 | div.code-toolbar > .toolbar { 118 | @apply absolute opacity-100; 119 | top: .3em; 120 | right: .2em; 121 | } 122 | 123 | div.code-toolbar:hover > .toolbar { 124 | @apply opacity-100; 125 | } 126 | 127 | /* Separate line b/c rules are thrown out if selector is invalid. 128 | IE11 and old Edge versions don't support :focus-within. */ 129 | div.code-toolbar:focus-within > .toolbar { 130 | @apply opacity-100; 131 | } 132 | 133 | div.code-toolbar > .toolbar .toolbar-item { 134 | @apply inline-block; 135 | } 136 | 137 | div.code-toolbar > .toolbar .toolbar-item span { 138 | @apply text-white; 139 | } 140 | 141 | div.code-toolbar > .toolbar a { 142 | cursor: pointer; 143 | } 144 | 145 | div.code-toolbar > .toolbar button { 146 | @apply bg-transparent border-0 leading-normal overflow-visible p-0; 147 | color: inherit; 148 | font: inherit; 149 | user-select: none; /* for button */ 150 | } 151 | 152 | div.code-toolbar > .toolbar a, 153 | div.code-toolbar > .toolbar button, 154 | div.code-toolbar > .toolbar span { 155 | @apply bg-black text-white py-0 px-2; 156 | border-radius: .5em; 157 | box-shadow: 0 2px 0 0 rgba(0,0,0,0.2); 158 | font-size: .8em; 159 | } 160 | 161 | div.code-toolbar > .toolbar a:hover, 162 | div.code-toolbar > .toolbar a:focus, 163 | div.code-toolbar > .toolbar button:hover, 164 | div.code-toolbar > .toolbar button:focus, 165 | div.code-toolbar > .toolbar span:hover, 166 | div.code-toolbar > .toolbar span:focus { 167 | @apply no-underline; 168 | color: inherit; 169 | } 170 | 171 | article code { 172 | font-size: 0.9em; 173 | } -------------------------------------------------------------------------------- /src/posts/2020/02/mixed-nuts-february-2020.md: -------------------------------------------------------------------------------- 1 | --- 2 | layout: singlepost 3 | tags: post 4 | title: "Mixed nuts • February, 2020" 5 | subtitle: "Here and there, frick and frack, yadda and yadda" 6 | description: "Another sampling of my random thoughts—lucky you." 7 | author: Bryce Wray 8 | date: 2020-02-09T16:05:00-06:00 9 | #lastmod: TBD 10 | discussionId: "2020-02-mixed-nuts-2020-02" 11 | featured_image: "almond-21502_5000x3333.jpg" 12 | featured_image_width: 5000 13 | featured_image_height: 3333 14 | featured_image_alt: "Almonds and other nuts in a store" 15 | featured_image_caption: | 16 | Image: PublicDomainPictures; Pixabay 17 | --- 18 | 19 | The world didn't end when I issued the [inaugural set of Mixed Nuts](/posts/2019/11/mixed-nuts-2019-11) so, while that's hardly a proof of the wisdom of Going There again, I figure: hey, why not? With that ringing endorsement from your humble host, here goes nothing (which may be truer than I'd like to believe). 20 | 21 | ------- 22 | 23 | This hoary, old boomer has studiously avoided addressing the "OK, boomer" phenomenon. He shall continue to do so. 24 | 25 | *If you're in the market for a 2020-model SUV, I can highly endorse the Honda CR-V EX. Seems pretty much the best mix of features and value in the line.* 26 | 27 | One benefit I didn't expect from the [streaming](/posts/2020/01/streamers-party) experience: being able to find and store so many items in the [YouTube TV](https://tv.youtube.com) cloud DVD has let me introduce my wife to [wonderful](https://www.imdb.com/title/tt0025878/) [old](https://www.imdb.com/title/tt0040613/) [movies](https://www.imdb.com/title/tt0032904/) she'd never seen before. I love seeing her enjoy them on her first views as much as I long have on my many repeated viewings. 28 | 29 | *It never fails to amaze me when I view the source code of some elaborate-looking commercial website and see it was built on [WordPress](https://wordpress.org). Are these people totally unaware of the advantages, notably the cost savings and improved security, of [static site generators](https://staticgen.com)?* 30 | 31 | One thing I did *not* expect to occur when I made [this site's repository](https://github.com/brycewray/eleventy_bundler) [public](/posts/2019/12/code-comfort-eleventy-webpack) was that it would get GitHub stars. At this writing, the quantity is still in the single digits but, hey, man, it's actual *Github stars*. We Are Not Worthy. 32 | 33 | *For those reviewers out there who believe you can't do long-form writing in [iA Writer](https://ia.net/writer) because it requires you to rename individual chapters' files when you want to move around scenes . . .* **Really**? 34 | 35 | I long in vain for a return to the days when athletes *did not* engage in elaborate celebrations after every frigging accomplishment during a game[^Volleyball]. Celebrate when you win, folks---maybe (*i.e.*, if the win doesn't simply advance you to a .350 record). 36 | 37 | [^Volleyball]: This extends even to *NCAA volleyball*, for God's sake. High-fiving after *every point*?!? Man alive. 38 | 39 | *I shudder for those of my long-ago colleagues who are still in the terrestrial radio business. Between satellite radio and the ease of adding one's own music to a typical automobile sound system, how in the* world *can those folks compete, long-term?* 40 | 41 | Although I have nearly a year to go on my current subscription with [1Password](https://1password.com), have been impressed so far while trying out the open-source but fully featured [Bitwarden](https://bitwarden.com). If you're trying to sort out your own passwords, I strongly urge you to give Bitwarden a try. 42 | 43 | *Seeing how so many prominent individuals, institutions, and teams have succeeded by cheating and otherwise flouting the rules, perhaps society should just* eliminate *all rules and cut out the ineffective middleman. We could call this the "Systematic Correction and Repeal of Egregious Works' Interference via Total Annihilation of Limiting Legislation" (SCREWITALL).* -------------------------------------------------------------------------------- /src/_includes/layouts/partials/header.njk: -------------------------------------------------------------------------------- 1 |
    2 | 6 | 91 |
    92 | -------------------------------------------------------------------------------- /vercel.json: -------------------------------------------------------------------------------- 1 | { 2 | "build": {}, 3 | "github": { 4 | "silent": true 5 | }, 6 | "headers": [ 7 | { 8 | "source": "(.*)", 9 | "headers": [ 10 | { 11 | "key": "Permissions-Policy", 12 | "value": "interest-cohort=()" 13 | }, 14 | { 15 | "key": "Strict-Transport-Security", 16 | "value": "max-age=63072000; includeSubDomains; preload" 17 | }, 18 | { 19 | "key": "X-Frame-Options", 20 | "value": "SAMEORIGIN" 21 | }, 22 | { 23 | "key": "X-Content-Type-Options", 24 | "value": "nosniff" 25 | }, 26 | { 27 | "key": "X-XSS-Protection", 28 | "value": "1" 29 | }, 30 | { 31 | "key": "Content-Security-Policy", 32 | "value": "default-src 'none'; connect-src 'self'; base-uri 'self'; frame-ancestors 'self'; form-action 'self'; style-src 'self'; img-src 'self' https://*.brycewray.com https://*.cloudinary.com data:; font-src 'self'; script-src 'self' https://*.brycewray.com" 33 | }, 34 | { 35 | "key": "Referrer-Policy", 36 | "value": "no-referrer, strict-origin-when-cross-origin" 37 | }, 38 | { 39 | "key": "Report-To", 40 | "value": "{'group':'default','max_age':31536000,'endpoints':[{'url':'https://brycewray.report-uri.com/a/d/g'}],'include_subdomains':true}" 41 | }, 42 | { 43 | "key": "NEL", 44 | "value": "{'report_to':'default','max_age':31536000,'include_subdomains':true}" 45 | } 46 | ] 47 | }, 48 | { 49 | "source": "/css/(.*)", 50 | "headers": [ 51 | { 52 | "key": "Cache-Control", 53 | "value": "public, max-age=2592000, immutable" 54 | }, 55 | { 56 | "key": "CDN-Cache-Control", 57 | "value": "public, max-age=2592000, immutable" 58 | }, 59 | { 60 | "key": "X-Content-Type-Options", 61 | "value": "nosniff" 62 | } 63 | ] 64 | }, 65 | { 66 | "source": "/images/(.*)", 67 | "headers": [ 68 | { 69 | "key": "Cache-Control", 70 | "value": "public, max-age=2592000, immutable" 71 | }, 72 | { 73 | "key": "CDN-Cache-Control", 74 | "value": "public, max-age=2592000, immutable" 75 | }, 76 | { 77 | "key": "X-Content-Type-Options", 78 | "value": "nosniff" 79 | } 80 | ] 81 | }, 82 | { 83 | "source": "/images/icons/(.*)", 84 | "headers": [ 85 | { 86 | "key": "Cache-Control", 87 | "value": "public, max-age=2592000, immutable" 88 | }, 89 | { 90 | "key": "CDN-Cache-Control", 91 | "value": "public, max-age=2592000, immutable" 92 | }, 93 | { 94 | "key": "X-Content-Type-Options", 95 | "value": "nosniff" 96 | } 97 | ] 98 | }, 99 | { 100 | "source": "/assets/fonts/(.*)", 101 | "headers": [ 102 | { 103 | "key": "Cache-Control", 104 | "value": "public, max-age=2592000, immutable" 105 | }, 106 | { 107 | "key": "CDN-Cache-Control", 108 | "value": "public, max-age=2592000, immutable" 109 | }, 110 | { 111 | "key": "X-Content-Type-Options", 112 | "value": "nosniff" 113 | } 114 | ] 115 | }, 116 | { 117 | "source": "/assets/svg/(.*)", 118 | "headers": [ 119 | { 120 | "key": "Cache-Control", 121 | "value": "public, max-age=2592000, immutable" 122 | }, 123 | { 124 | "key": "CDN-Cache-Control", 125 | "value": "public, max-age=2592000, immutable" 126 | }, 127 | { 128 | "key": "X-Content-Type-Options", 129 | "value": "nosniff" 130 | } 131 | ] 132 | }, 133 | { 134 | "source": "/assets/js/(.*)", 135 | "headers": [ 136 | { 137 | "key": "Cache-Control", 138 | "value": "public, max-age=2592000, immutable" 139 | }, 140 | { 141 | "key": "CDN-Cache-Control", 142 | "value": "public, max-age=2592000, immutable" 143 | }, 144 | { 145 | "key": "X-Content-Type-Options", 146 | "value": "nosniff" 147 | } 148 | ] 149 | } 150 | ] 151 | } -------------------------------------------------------------------------------- /src/posts/2021/02/mixed-nuts-2021-02.md: -------------------------------------------------------------------------------- 1 | --- 2 | layout: singlepost 3 | title: "Mixed nuts • February, 2021" 4 | subtitle: "Free-association folderol for February" 5 | description: "No brain cells were even used, much less harmed, in the production of this post." 6 | author: Bryce Wray 7 | date: 2021-02-13T13:15:00-06:00 8 | lastmod: 2021-02-15T09:18:00-06:00 9 | #draft: false 10 | discussionId: "2021-02-mixed-nuts-2021-02" 11 | featured_image: "almonds-484268_5184x3456.jpg" 12 | featured_image_width: 5184 13 | featured_image_height: 3456 14 | featured_image_alt: "Mixed nuts, including almonds and hazelnuts" 15 | featured_image_caption: | 16 | Image: Matt Trostle; Pixabay 17 | --- 18 | 19 | A reader who [made contact with me](/contact) recently told me my writing style seems very stream-of-consciousness[^compliment]---to which I mused inwardly, "Well, if you think that about my *regular* stuff, wait ’til you read one of my 'Mixed nuts' posts.” 20 | 21 | [^compliment]: To be fair, he followed it up with a wonderful compliment (that I didn't deserve), but I felt the excerpt I used here was more appropriate to this series of posts. 22 | 23 | More to the point, friends, **you** are about to have that, uh, opportunity, as we commence with the seventh in the series. 24 | 25 | --- 26 | 27 | Although I [gave up](/posts/2021/02/simplify-simplify) using [Tailwind CSS](https://tailwindcss.com), I'm still happily using the [Tailwind `font-family` selections](https://tailwindcss.com/docs/font-family), only now in my own [SCSS](https://sass-lang.com). For serif type, the default is [`ui-serif`](https://developer.mozilla.org/en-US/docs/Web/CSS/font-family). As of this writing, `ui-serif` is supported only on Safari, where it brings up the modern form of [Apple's New York font](https://www.creativebloq.com/news/new-york-font). I say "modern form" because we Mac old-timers remember [the 1980s version](https://fontsinuse.com/typefaces/31775/new-york-1984).[^InterVF] 28 | 29 | [^InterVF]: **Update, 2021-02-15**: The lone exception is that, for sans-serif, I re-added the variable form of [Inter](https://rsms.me/inter) as the initial font, preferring a more consistent cross-platform look. 30 | 31 | *Incoming this August: grandchild #2, conferring upon [grandchild #1](/posts/2020/03/welcome-sweet-little-early-bird) the high and exalted status of Big Sister and [all the rights and privileges pertaining thereto](https://academia.stackexchange.com/questions/41735/what-are-all-the-rights-and-privileges-pertaining-thereto).*[^reveal] 32 | 33 | [^reveal]: **Update, 2021-02-14**: The next day after I posted this, we learned grandchild #2 will be a boy. 34 | 35 | Incoming soon to one of my arms: shot #1 of the [COVID-19](/posts/2020/03/coherence-covid-19) vaccine. As of this writing, I'm scheduled to get it on the morning of February 17 about ten miles from home, but the weather forecast for then is pretty nasty. Still: if I **can** get there that morning, you can bet I will. 36 | 37 | *To repeat my update to my recent article, "[Beta-testing Cloudflare Pages](/posts/2021/01/beta-testing-cloudflare-pages)," since the initial post really slammed the [platform](https://pages.cloudflare.com)'s build speeds:* 38 | 39 | > ***Update, 2021-02-12**: Yesterday afternoon, Cloudflare pushed a change that dramatically cut the **total** build times. For a newer Hugo-based test site I’ve put on Cloudflare Pages, build now happens in about 45 seconds. While this is still slower than several of the competitors, the trend is definitely in the right direction.* 40 | 41 | **Gaming-on-Macs, thought #1.** You may want to wait until macOS supports the newest set of Xbox controllers ([macOS 11.3, now in beta, adds that support](https://www.macrumors.com/2021/02/02/apple-seeds-macos-big-sur-11-3-beta-1/)), if the Xbox layout is to your liking as it is to mine. 42 | 43 | ***Gaming-on-Macs, thought #2.** If you choose the [SteelSeries Nimbus+](https://steelseries.com/gaming-controllers/nimbus-plus) controller, you **must immediately** update its firmware (or it will brick itself within days), and the only way to do it from a Mac is to connect it via a Lightning cable and use the **Windows 10** version of the SteelSeries Engine software running in [Parallels Desktop](https://www.parallels.com/products/desktop/). As of this writing, the **Mac** version of Engine is unable to detect the Nimbus+, even though it's been nearly a year since the controller debuted.* -------------------------------------------------------------------------------- /src/posts/2019/02/ia-for-io.md: -------------------------------------------------------------------------------- 1 | --- 2 | layout: singlepost 3 | tags: post 4 | title: "iA for IO?" 5 | subtitle: "Evaluating iA Writer for use with an SSG" 6 | description: "A re-consideration of using iA Writer in making Markdown files for this site’s posts." 7 | author: Bryce Wray 8 | date: 2019-02-03T09:25:00-06:00 9 | lastmod: 2020-09-27T13:45:00-05:00 10 | discussionId: "2019-02-ia-for-io" 11 | featured_image: "notebook-933362_4752x3168.jpg" 12 | featured_image_width: 4752 13 | featured_image_height: 3168 14 | featured_image_alt: "Stylized photograph of notebook and, in blurry background, a pencil" 15 | featured_image_caption: | 16 | Image: tookapic; Pixabay 17 | --- 18 | 19 | My comments at the end of my [previous post](/posts/2019/01/blox-sux) aside, I have to say [iA Writer](https://www.ia.net/writer) can be a halfway decent editor for [Markdown](https://daringfireball.net/projects/markdown/), after all. 20 | 21 | Once again, I'm **not** considering dropping [Ulysses](https://ulysses.app) from my small collection of much-loved apps that I utterly must have when the muse is with me and I feel like writing. It's just that I grow weary of the export-to-Markdown process inherent in writing something in Ulysses for this site, especially since I like to see my edits on my local version of the site as I save them to the target file. 22 | 23 | (Yes, you **can** save directly to a Markdown file from Ulysses, but I get the impression that's not really the best-practices way you're supposed to do it, since so many reviews out there stress the "Don't worry about files, just go to the Ulysses Library and find all your stuff there" approach. That approach is, indeed, wonderful for my **non**-[SSG](https://staticgen.com) writing, but not so much for this.) 24 | 25 | So this is yet another look at iA Writer as a potential "daily driver" for use with an SSG (stretching the definition of *daily*, obviously, since I write these posts just whenever). 26 | 27 | ## Okay, I was YAMmering; sorry 28 | 29 | Perhaps more to the point, I believe I was more concerned about how the [YAML](https://yaml.org) "front matter" looked in the iA Writer Preview window than how the SSG would handle the final Markdown file. (As I [already explained](/posts/2018/09/why-finally-settled-ulysses), I get distracted by such things.) It turns out that doesn't matter. You don't have to enclose front matter in a ```code block``` for the SSG to know what to do with it---in fact, it doesn't know what to do with it if you **do** put it in a code block. 30 | 31 | ## Footnote follies 32 | 33 | {% imgc "iA-Writer-inline-footnotes_1548x582.jpg", "Screen capture from iA Writer software showing how footnotes look in it", 1548, 582 %} 34 | 35 | That said, iA Writer's inline footnotes, while fine for export from iA Writer, don't fit [Pandoc](https://pandoc.org) standards, which are baked into how some SSGs "think" when converting Markdown to HTML for a site. So, while Pandoc-standard inline footnotes look bad in iA Writer, they work fine in an SSG.[^inlineNotes] However, that is something where Ulysses easily beats iA Writer for this stuff, since the inline footnotes in Ulysses---that is to say, all the ones I've included on [my other posts](/posts) before this one---work perfectly with an SSG. Same is true for [Typora](https://typora.io), as well. 36 | 37 | [^inlineNotes]: "Inline notes are easier to write, since you don't have to pick an identifier and move down to type the note." See [here](https://github.com/Witiko/markdown/issues/3)---the source of that quote---for an example of what I mean. 38 | 39 | ## Status quo, or no? 40 | 41 | Bottom line: I still haven't made up my mind about whether to go with a different editor for future Markdown work or stick with Ulysses for it as well as for my other creative writing (that WIP ain't finishing itself). However, if you are an SSG user and you're trying to decide about which editor to use for your writing, I hope these thoughts have been helpful. 42 | 43 |
    44 |
    45 | 46 | *One more thing before I end this quickie: if you haven't already read [Chris Rosser](https://chrisrosser.net)'s [most recent review of iA Writer](https://chrisrosser.net/posts/2019/01/26/ia-writer-5-review/), I definitely urge you to do so. His workflow is quite different from mine since he actually coded his own text-to-HTML setup (whoa) but his observations are always keen and useful. "[Joe Bob says check it out](https://en.wikipedia.org/wiki/Joe_Bob_Briggs)."* -------------------------------------------------------------------------------- /src/posts/2021/03/gems-in-rough-03.md: -------------------------------------------------------------------------------- 1 | --- 2 | layout: singlepost 3 | title: "Gems in the rough #3" 4 | subtitle: "Tips ’n’ tricks, this ’n’ that" 5 | description: "The latest installment of unrequested advice about tinkering with websites." 6 | author: Bryce Wray 7 | date: 2021-03-06T15:55:00-06:00 8 | lastmod: 2021-04-15T16:30:00-05:00 9 | #draft: false 10 | discussionId: "2021-03-gems-in-rough-03" 11 | featured_image: "gem-amethyst-3804830_4928x3264.jpg" 12 | featured_image_width: 4928 13 | featured_image_height: 3264 14 | featured_image_alt: "Closeup of purple gemstone - amethyst" 15 | featured_image_caption: | 16 | Image: PaulaPaulsen; Pixabay 17 | --- 18 | 19 | As one gathers navel from one's lint, so also do I gather little bits of information I hope will be helpful for those of you who, as I do, have found a hobby in fiddling with personal [SSG](https://jamstack.org/generators)-built websites. [Back in December](/posts/2020/12/gems-in-rough), I began issuing such items as "Gems in the rough." Here be the latest thereof. 20 | 21 | --- 22 | 23 | Some time back, I went through a [somewhat](/posts/2020/11/using-postcss-cache-busting-eleventy) [tortured](/posts/2020/12/cache-busting-eleventy-take-two) [series](/posts/2020/12/hashing-out-cache-busting-fix-eleventy/) of explaining how to cache-bust the CSS for a [Eleventy](https://11ty.dev)-based site which uses Tailwind CSS. Turns out that, if you're willing to use [SCSS](https://sass-lang.com) instead, you can skip the whole mess by using internal CSS---*i.e.*, where it's included site-wide in your HTML's `head` rather than as a separate file, as I [discussed a few weeks ago](/posts/2021/02/tailwind-head-hugo-pipes/) regarding Hugo's [asset pipeline](https://gohugo.io/hugo-pipes+). Check out "[My Eleventy + SCSS/Sass Setup](https://www.belter.io/eleventy-sass-workflow/)" by [Duncan McDougall](https://twitter.com/duncanmcdougall) for all the coolness (and, to be fair, **he** credits **his** inspiration to [Andy Bell](https://twitter.com/piccalilli_)'s well-known [Hylia Starter Kit](https://hylia.website/)). 24 | 25 | *Not a tip but just a note: I'm experimenting with other website-building apps and methods, due to some upcoming Day Job stuff. Since the Day Job is moving toward being a [React](https://reactjs.org) shop, I'm spending significant time in [Next.js](https://nextjs.org), in particular. As of now, that's the platform toward which I'm leaning as the best all-around recommendation when I get asked. Of course, the final decision ain't mine. [**Update, 2021-04-15**: After an initial miscommunication gave me the wrong impression of the thinking in higher places, the decision eventually went against me, so I won't be doing this after all.]* 26 | 27 | Wondering which `display` setting you should use when calling a web font with `@font-face` CSS , especially for reducing [CLS](https://web.dev/cls/)? Some writers suggest `display: optional`. With that in place, a browser probably won't show the web font on first arriving at your site, but should when the user either refreshes that initial page or visits one or more subsequent pages in the site. This means that your visitors likely won't see the consistent appearance for which you installed the web font in the first place. Besides, you don't know whether someone actually **will** visit a subsequent page after finding the first one to which a search sent him/her. My advice: use `display: swap` and live with whatever CLS it causes **or** just settle for the totally CLS-free [system fonts stack approach](/posts/2018/10/web-typography-part-2). 28 | 29 | *Still keeping my eye on the [Cloudflare Pages](https://pages.cloudflare.com) beta test, which [now is an open beta](https://twitter.com/CloudflareDev/status/1366875729829400578). Build times are getting faster, but quite a few bugs must die before Pages will be safe for production use. For now, if you want a static site that lives on Cloudflare, stick with a [Workers site](https://developers.cloudflare.com/workers/platform/sites).* 30 | 31 | If you've ever tried to figure out why you couldn't click on a link in a fixed-[position](https://developer.mozilla.org/en-US/docs/Web/CSS/position) element, like a header or footer that you want to stay in the same place, the [CSS `z-index` property](https://developer.mozilla.org/en-US/docs/Web/CSS/z-index) is your friend. Keep adjusting that setting for all elements concerned until each appears as it should while allowing you to click links to your heart's content. -------------------------------------------------------------------------------- /src/_includes/layouts/posts/singlepost.njk: -------------------------------------------------------------------------------- 1 | --- 2 | title: singlepost 3 | layout: base 4 | --- 5 | 6 |
    7 | {%- if featured_image -%} 8 |
    9 | {%- imgc featured_image, featured_image_alt, featured_image_width, featured_image_height, "posts" -%} 10 |
    11 | {%- else -%} 12 |
    13 |
    14 | {%- endif -%} 15 |
    16 |

    {{ title }}

    17 |

    18 | {% if subtitle %} 19 | {{ subtitle | safe }} 20 | {% else %} 21 |   22 | {% endif %} 23 |

    24 | 25 |

    26 | {{ page.date | htmlDateString }}
    27 | 28 | {% if lastmod %} 29 | Last modified {{ lastmod | htmlDateString }} 30 | {% else %} 31 |   32 | {% endif %} 33 | 34 |

    35 |

    36 | {% if featured_image_caption %} 37 | {{ featured_image_caption | safe }} 38 | {% else %} 39 |   40 | {% endif %} 41 |

    42 |
    43 |
    44 |
    45 | 46 |
    47 | 57 |
    58 | 59 | {% if page.url != "/about/" %} 60 |
    61 |

    Other posts

    62 | {% if nextPost.url %} 63 |

    64 | Next: 65 | {{ nextPost.data.title }} 66 |

    67 | {% endif %} 68 | {% if prevPost.url %} 69 |

    70 | Previous: 71 | {{ prevPost.data.title }} 72 |

    73 | {% else %} 74 |

     

    75 | {% endif %} 76 |
    77 | {% endif %} 78 | -------------------------------------------------------------------------------- /src/posts/2020/09/goodbye-hello-part-4.md: -------------------------------------------------------------------------------- 1 | --- 2 | layout: singlepost 3 | tags: post 4 | title: "Goodbye and hello • Part 4" 5 | subtitle: "The future is now, so to Render we go" 6 | description: "My curiosity overcomes me and, yet again, I move the site." 7 | author: Bryce Wray 8 | date: 2020-09-05T09:00:00-05:00 9 | lastmod: 2021-05-16T10:39:00-05:00 10 | discussionId: "2020-09-goodbye-hello-4" 11 | featured_image: "jeremy-thomas-E0AHdsENmDg-unsplash_5005x3417.jpg" 12 | featured_image_width: 5005 13 | featured_image_height: 3417 14 | featured_image_alt: "Time exposure of a star field" 15 | featured_image_caption: | 16 | Image: Jeremy Thomas; Unsplash 17 | --- 18 | 19 | {% disclaimer %} 20 | 21 | Rather than continuing to pile addenda on the original "[Goodbye and hello](/posts/2020/07/goodbye-hello)" post about how I moved this site from [Netlify](https://netlify.com) to [Vercel](https://vercel.com) some weeks back, I've turned those addenda into [separate](/posts/2020/07/goodbye-hello-part-2) [posts](/posts/2020/08/goodbye-hello-part-3), each dated according to when I'd added its content to the first post. When I look at others' sites, I gather this is the more common---not to mention less mutually aggravating---way of explaining such changes to one's readers. 22 | 23 | ---- 24 | 25 | So, to recapitulate: after having kept this site on Netlify for its first twenty-one-and-a-half months of existence, I moved it to [Render](https://render.com) in late June, [to Vercel a day later](/posts/2020/07/goodbye-hello), [back to Netlify a few weeks after that](/posts/2020/07/goodbye-hello-part-2), and [*again* to Vercel three weeks hence](/posts/2020/08/goodbye-hello-part-3). 26 | 27 | All the while, as you could probably tell in the first "Goodbye and hello," I was keenly interested in Render; but I ended up deciding that Render's older, somewhat more polished competitors were better fits. 28 | 29 | For a while, that was true. 30 | 31 | Still, throughout all the gyrations among these hosts, I'd never quite gotten past the idea that Render was special---a vendor with a bright future, and something I needed to keep watching. I found myself drawn to at least daily checks of the [Render Slack community](https://render-community.slack.com/join/shared_invite/zt-fs26mwq8-P98fMK7axMHNny54c_yzcg#/), where Render techs---and, surprisingly often, even Render CEO/Founder Anurag Goel himself---provided help to not only Render users (both free-tier and paying) but also those simply seeking more info about Render. 32 | 33 | ## All hands: prepare to jump (again) 34 | 35 | In recent days, the curiosity finally became too great. 36 | 37 | As a result, I created identical microsites on Vercel, Netlify, and Render (identical so comparing them would be a case of "apples *vs.* apples *vs.* apples"); then, I set up [Zach Leatherman's Speedlify tool](https://github.com/zachleat/speedlify/) to scan them three times a day, measuring each microsite's respective performance. 38 | 39 | As the days went by, a pattern emerged from the Speedlify results. While it didn't *always* win, the Render microsite *usually* won---this, despite the [vaunted advantages of Vercel's Global Edge Network](https://vercel.com/blog/new-edge-dev-infrastructure).[^1] 40 | 41 | Having determined early on that I would let the data be my guide, I found the case to be narrow, but clear, for Render. And, so, yesterday, my site was back on Render for the first time since that initial, one-day ride in late June. 42 | 43 | Of course, as is now achingly clear, whether I will let it *stay* there remains to be seen. 44 | 45 | That said: at least as of this writing, I am optimistic. Unlike the other moves, this one wasn't followed by a vague sense of unease that, maybe, I should've waited a little longer before I placed my "bet" on this "horse." 46 | 47 | It may not win every single race but, boy, does it have great days ahead of it, and I think I want to be around as it gets to them. 48 | 49 | **Note**: Unfortunately, it turned out I hadn't done my due diligence, and so there's a---wait for it---[Part 5](/posts/2020/09/goodbye-hello-part-5). (Arrgh.){.yellowBox} 50 | 51 | [^1]: Because of how hobbled Netlify's free tier is when compared to the free tiers of Render and Vercel, the Netlify microsite never really was in the ballgame. It served more as a point of comparison than anything else. The same was true for another identical microsite that I briefly had on [Firebase](https://firebase.google.com) at the beginning of the testing. I pulled it from the test after it became clear it almost never would exceed last place, and definitely never eclipse third place out of the (then) four competing microsites. Whether that's because of Firebase's [previously noted](/posts/2020/07/goodbye-hello) lack of [Brotli compression](https://opensource.googleblog.com/2015/09/introducing-brotli-new-compression.html), I can't say. -------------------------------------------------------------------------------- /src/posts/2019/12/code-comfort-eleventy-webpack.md: -------------------------------------------------------------------------------- 1 | --- 2 | layout: singlepost 3 | tags: post 4 | title: "Code comfort: Eleventy and webpack" 5 | subtitle: "Peeking inside this site" 6 | description: "Some words about my Eleventy/webpack configuration." 7 | author: Bryce Wray 8 | date: 2019-12-14T11:05:00-06:00 9 | lastmod: 2021-05-29T12:24:00-05:00 10 | discussionId: "2019-12-code-comfort-eleventy-webpack" 11 | featured_image: code-1486361_5760x3840.jpg 12 | featured_image_width: 5760 13 | featured_image_height: 3840 14 | featured_image_alt: "Computer code on a monitor" 15 | featured_image_caption: | 16 | Image: Markus Spiske; Pixabay 17 | --- 18 | 19 | **Note, 2020-09-09**: Although the site long since is no longer using the stack mentioned here, at least some parts of the repo [remain online for viewing by the curious](https://github.com/brycewray/eleventy_bundler).{.yellowBox} 20 | 21 | *Following up on my [recent post](/posts/2019/12/packing-up) about how I got this site back to my favorite [static site generator](https://staticgen.com) (SSG), [Eleventy](https://11ty.dev), and also provided some enhancements with the [webpack](https://webpack.js.org) bundler app . . .* 22 | 23 | As I mentioned, my process in making this happy transition was much easier than it might have been, thanks to the publicly available code from others who'd done it before me. Thus, I'm following their kind example by making this site's [GitHub repo](https://github.com/brycewray/eleventy_bundler) public. What follows, then, is some explanation of which code does what. 24 | 25 | ## A tale of three webpack config files 26 | 27 | A lot of tutorials for using webpack will have you go through the motions of constructing a `webpack.config.js` file, only to come in when things get hot and heavy and say, "*Au contraire*, sucker! Actually, you need *separate* configuration files for development and production." 28 | 29 | Not gonna pull that one on ya. 30 | 31 | You *can* do it with just a `webpack.config.js` file---one to rule them all, so to speak---but just about all the best-practices-kinda-stuff you'll see says to set things up as follows, so that's what I'm telling you, too:[^configNames] 32 | 33 | [^configNames]: You can call them whatever you want as long as each ends with a *.js* extension, but using names like these adheres sufficiently to standards-of-sorts that, when you look at other people's code, you'll probably find the examples more helpful than if you go into "[Silly Walks](https://en.wikipedia.org/wiki/The_Ministry_of_Silly_Walks)" mode and call them *fred.js*, *wilma.js*, and *pebbles.js*, or somesuch. 34 | 35 | - `webpack.dev.js`---Contains only config code for *development*. Or, to put it another way: the code in this file is *not* intended for when you actually build your site on, say, [Netlify](https://www.netlify.com). [See my site's `webpack.dev.js` file here](https://github.com/brycewray/eleventy_bundler/blob/master/webpack.dev.js). 36 | 37 | - `webpack.prod.js`---You guessed it: this is the first file's bro, except that this one contains only config code for *production*. [See my site's `webpack.prod.js` file here](https://github.com/brycewray/eleventy_bundler/blob/master/webpack.prod.js). 38 | 39 | - `webpack.common.js`---Contains everything you'll need for *either* production or development. The other two files ***merge*** this content when they're run, thus ensuring everything happens as it should. Having this separate file, rather than duplicating code between the other two files, is DRY-friendly (well, [maybe](https://thevaluable.dev/dru-principle-cost-benefit-example)) and thus keeps peace among all of [Babbage](https://www.computerhistory.org/babbage/)'s descendants, genetic or otherwise. [See my site's `webpack.common.js` file here](https://github.com/brycewray/eleventy_bundler/blob/master/webpack.common.js). 40 | 41 | ## Configuring Eleventy itself 42 | 43 | As for `.eleventy.js`, the main config file for Eleventy (thankfully, no separate `.dev` and `.prod` versions here), see [my site's `.eleventy.js` file here](https://github.com/brycewray/eleventy_bundler/blob/master/.eleventy.js). 44 | 45 | ## package.json 46 | 47 | By now, the more observant among you, having seen certain items mentioned in these files, may be wondering what's in the `package.json` file. [Wonder no longer](https://github.com/brycewray/eleventy_bundler/blob/master/package.json)---although, I caution you, there are things in there I no longer use but simply haven't gotten around to opening up a can of `npm uninstall` on 'em as yet. 48 | 49 | ## Copy-pasta meal? 50 | 51 | So, there you go. If you see anything in this site's repo that's helpful to your project, by all means, [copy-pasta](https://knowyourmeme.com/memes/copypasta) to your heart's content. If nothing else, perhaps the `package.json` file will give you some hints about cool npm packages to try if you, too, decide to weld Eleventy and webpack---which, I assure you, is a [worthy endeavor](/posts/2019/12/packing-up). -------------------------------------------------------------------------------- /src/posts/2021/06/mixed-nuts-2021-06.md: -------------------------------------------------------------------------------- 1 | --- 2 | layout: singlepost 3 | title: "Mixed nuts • June, 2021" 4 | subtitle: "More miscellany for your mental masochism" 5 | description: "The latest set of “takes” that don’t all fit in any one category." 6 | author: Bryce Wray 7 | date: 2021-06-11T16:30:00-05:00 8 | lastmod: 2021-07-11T09:57:00-05:00 9 | discussionId: "2021-06-mixed-nuts-2021-06" 10 | featured_image: "nuts-5503118_6000x4000.jpg" 11 | featured_image_width: 6000 12 | featured_image_height: 4000 13 | featured_image_alt: "Concept image: mixed nuts on a tabletop" 14 | featured_image_caption: | 15 | Image: Kai Reschke; Pixabay 16 | --- 17 | 18 | It's time once again to bounce around a few miscellaneous observations that, in fact, already have been bouncing in my brain like pinballs in a particularly old and janky machine. And I will try not to take too much offense at that reference on my own part. 19 | 20 | --- 21 | 22 | Everyday life with the internet requires manipulating passwords for a ridiculous number of sites and services. A common, but dangerous, response to that requirement is to use the same password on multiple sites. It's dangerous because, if *any one* of those sites gets cracked, the bad actors have your access to *all* of them. The smart response is to have a different and unguessable password on each site, and then [use a password manager app](https://www.howtogeek.com/141500/why-you-should-use-a-password-manager-and-how-to-get-started/)---preferably as cross-platform as possible---to keep them all straight. The one I've used for several years is [1Password](https://1password.com), but I've recently also begun using the [open-source](https://en.wikipedia.org/wiki/Open-source_software) [Bitwarden](https://bitwarden.com). 1Password has a free trial, after which it costs around $50/year. Bitwarden has a totally free version, although a $10/year subscription adds several highly desirable features, not to mention it's a low-pain way of supporting a worthy vendor in this space. 23 | 24 | *Also on the subject of personal cybersecurity: it was [announced](https://9to5mac.com/2021/06/07/ios-15-ipados-15-and-macos-monterey-gain-built-in-two-factor-code-generator-and-autofill/) at this week's 2021 edition of the [Apple Worldwide Developers Conference (WWDC)](https://en.wikipedia.org/wiki/Apple_Worldwide_Developers_Conference) that this fall's next major versions of iOS and macOS will make [time-based one-time password (TOTP) authentication](https://datatracker.ietf.org/doc/html/rfc6238) a built-in feature of the [iCloud Keychain](https://support.apple.com/en-us/HT204085). To my admittedly limited knowledge, they will be the first OSs with baked-in TOTP handling. Especially where the smartphone market is concerned, it remains to be seen how disruptive this may be to standalone password management providers such as, say, 1Password and Bitwarden.* 25 | 26 | If my recent visits to the [Firefox subreddit](https://reddit.com/r/firefox) constitute any indication, the Firefox community is sharply divided over the release of [the Proton UI in Firefox 89](https://www.xda-developers.com/mozilla-releases-firefox-89-update-with-new-proton-design/). I kinda like it myself; but my main problem with the latest ’fox version is that it seems to be a considerably greedier memory hog on macOS than Microsoft Edge, much less the memory-sippin' Safari (but definitely not the famously hungry Chrome). Speaking of Safari, it'll be getting a lot of new features this fall on both iOS and macOS, as [this WWDC 2021 video](https://developer.apple.com/videos/play/wwdc2021/10104/) makes clear. 27 | 28 | *It's not hard to find various ’net-based paeans to [VSCodium](https://vscodium.com/), which is a fully open-source version of the mostly-but-not-fully-open-source [Visual Studio Code](https://code.visualstudio.com). I gave VSCodium a try but didn't like how some of my favorite extensions, or at least their latest versions, are unavailable for it. I also disliked the hacky ways some suggest for getting around that, with which I simply chose not to futz. Given that VSCodium's main advantage over VS Code is that the former lacks Microsoft tracking but I already use Microsoft apps that, yeah, track me, I'll stick with the real thing. (I still use [Panic](https://panic.com)'s [Nova](https://nova.app), too, but not nearly as often.)* 29 | 30 | To end on an extremely non-techy note: it's nice when I can occasionally mosey out as a COVID-19-vaccinated human here in my little corner of the planet, especially when it's time to gather with similarly vaccinated relatives for a meal at a restaurant, something we wouldn't have considered not so long ago. One obviously also must be aware that the virus itself is far from ceasing its assault (especially in other parts of the world), but at least now---if/when you can get a vaccine to people and, just as important, get people to *accept* a vaccine---there would **appear** to be something of an end in sight for this trouble, albeit that it's taking its sweet time in arriving. -------------------------------------------------------------------------------- /src/posts/2019/12/previous-next-eleventy.md: -------------------------------------------------------------------------------- 1 | --- 2 | layout: singlepost 3 | tags: post 4 | title: "“Previous” and “next” in Eleventy" 5 | subtitle: "The answer to an authentic FAQ" 6 | description: "A brief description of code that easily enables this oft-requested feature." 7 | author: Bryce Wray 8 | date: 2019-12-23T15:16:00-06:00 9 | lastmod: 2019-12-25T08:05:00-06:00 10 | discussionId: "2019-12-previous-next-eleventy" 11 | featured_image: "sand-1522182_3216x2136.jpg" 12 | featured_image_width: 3216 13 | featured_image_height: 2136 14 | featured_image_alt: "View from above of directional arrow in sand" 15 | featured_image_caption: | 16 | Image: Maret H.; Pixabay 17 | --- 18 | 19 | This one will be uncharacteristically short, you'll be happy to know. But I learned something yesterday that I just have to share with my fellow and sister [Eleventy](https://11ty.dev) aficionados out there. 20 | 21 | In reading not only the Eleventy [docs](https://11ty.dev/docs) but also numerous "how-to" articles by various Eleventy users, I'd been unable to learn a way to automate the inclusion of "Previous post" and "Next post" links, such as those you see at the bottom of each of my posts. 22 | 23 | (Note that all the code herein assumes you assign each post a `post` tag in its front matter, as shown in [this example](https://www.11ty.dev/docs/collections/).) 24 | 25 | You see, the most workable method I'd found so far from among the [starter projects](https://11ty.dev/docs/starter) and [others](https://11ty.dev/docs/sites) listed on the Eleventy site was quite manual: give each post an index number in its front matter (`idx: 41`, for example), and then find it that way. For example **(WARNING: if you're looking through this in a hurry, THIS *ISN'T* THE FINAL ANSWER!)**: 26 | 27 | {% raw %} 28 | ```html 29 | {% if collections.post[idx] %} 30 |

    31 | Next: 32 | 33 |

    34 | {% endif %} 35 | {% if collections.post[idx-2] %} 36 |

    37 | Previous: 38 | 39 |

    40 | {% endif %} 41 | 42 | ``` 43 | {% endraw %} 44 | 45 | Yes, it worked, but I wanted a "set-and-forget" method---something that would survive post deletions or any other possibility that might come up, not to mention a simple human failure to give the correct and unique `idx` assignment to a new post. And [so](https://github.com/11ty/eleventy/issues/211) [did](https://github.com/11ty/eleventy/issues/529) [others](https://github.com/11ty/eleventy/issues/819). 46 | 47 | I suspected there was a solution in the Eleventy API that was so ridiculously simple that, if I found it, I'd have two immediate reactions: joy from finding it and pain from the slap I'd give myself on top of the head for having missed it. 48 | 49 | Early yesterday morning, after having asked about an [earlier](https://github.com/11ty/eleventy/issues/529#issuecomment-532393625) proposed answer to the question, I saw a [reply](https://github.com/11ty/eleventy/issues/529#issuecomment-568257426) that quickly proved to be *The* Answer **(THIS one is what you're seeking, folks)** from [Pascal Widdershoven](https://pascalw.me) in the form of a wonderfully simple and elegant addition to one's `.eleventy.js` file: 50 | 51 | {% raw %} 52 | ```js 53 | eleventyConfig.addCollection("posts", function(collection) { 54 | const coll = collection.getFilteredByTag("posts"); 55 | 56 | for(let i = 0; i < coll.length ; i++) { 57 | const prevPost = coll[i-1]; 58 | const nextPost = coll[i + 1]; 59 | 60 | coll[i].data["prevPost"] = prevPost; 61 | coll[i].data["nextPost"] = nextPost; 62 | } 63 | 64 | return coll; 65 | }); 66 | ``` 67 | 68 | {% endraw %} 69 | 70 | Ah. A thing of beauty. 71 | 72 | Once you've added that to your site's `.eleventy.js` file, all you have to do is put something like the following in the appropriate place in your Eleventy template for single posts (this is in [Nunjucks](https://www.11ty.dev/docs/languages/nunjucks/), so please adjust according to the [template language](https://www.11ty.dev/docs/languages/) of your choice): 73 | 74 | {% raw %} 75 | 76 | ```html 77 | {% if nextPost.url %} 78 |

    79 | Next: 80 | 81 |

    82 | {% endif %} 83 | {% if prevPost.url %} 84 |

    85 | Previous: 86 | 87 |

    88 | {% endif %} 89 | ``` 90 | 91 | {% endraw %} 92 | 93 | And, no, I didn't swat myself, but I did get the joy. 94 | 95 | **Thank you, Mr. Widdershoven**, for the eye-opener! This has been an FAQ in the truest sense of that term, and you got us over the goal line. As I gratefully [told you yesterday](https://github.com/11ty/eleventy/issues/529#issuecomment-568258911): "You da man!" -------------------------------------------------------------------------------- /src/posts/2021/03/beginners-luck-update.md: -------------------------------------------------------------------------------- 1 | --- 2 | layout: singlepost 3 | tags: post 4 | title: "Beginner’s luck: an update" 5 | subtitle: "New and updated starter sets for Eleventy and Hugo" 6 | description: "The inventory has grown, so here’s what I currently offer for those interested in the two best SSGs." 7 | author: Bryce Wray 8 | date: 2021-03-25T20:25:00-05:00 9 | lastmod: 2021-04-22T12:57:00-05:00 10 | discussionId: "2021-03-beginners-luck-update" 11 | featured_image: susan-holt-simpson-H7SCRwU1aiM-unsplash_4608x3072.jpg 12 | featured_image_width: 4608 13 | featured_image_height: 3072 14 | featured_image_alt: "Colorful toy alphabet blocks" 15 | featured_image_caption: | 16 | Image: Susan Holt Simpson; Unsplash 17 | 18 | --- 19 | 20 | Interested in building a new website with, or converting an existing site to, either of the two best [static site generators](https://jamstack.org/generators) (SSGs)? Please read on, my friend. 21 | 22 | Recently, I've been spending spare hours working on [Eleventy](https://11ty.dev) and [Hugo](https://gohugo.io) **starter sets** for folks like you. And they're not only updated versions of the ones I [announced last July](/posts/2020/07/beginners-luck), but also **two new ones** I'm announcing today. 23 | 24 | Rather than expect you to find them on your own in my various scattered references across my humble little site, I thought I'd write this brief post to list them all together. Maybe you'll find them helpful in whatever you choose to do in Eleventy or Hugo. Each is always based on the current appearance and layout of this site, which I hope will make clearer the connection between the code and the result. 25 | 26 | I'll list each by the name of its respective [repository](https://en.wikipedia.org/wiki/Software_repository) ("repo") in [GitHub](https://github.com). I've also linked each to its live demo on [Vercel](https://vercel.com). 27 | 28 | ## Eleventy starters 29 | 30 | Incidentally: the *eleventy_solo* in each Eleventy starter's name comes from that of [**this** site's repo](https://github.com/brycewray/eleventy_solo) (and, if you're wondering why I chose that name, you may want to see my [post from last year](/posts/2020/05/going-solo-eleventy) about when, and why, I converted the site over from Eleventy/[webpack](https://webpack.js.org) to Eleventy-only). 31 | 32 | The Eleventy starters are distinguished by two things: which of the [numerous Eleventy **templating choices**](https://www.11ty.dev/docs/languages/) they use, [JavaScript](https://www.11ty.dev/docs/languages/javascript/) or [Nunjucks](https://www.11ty.dev/docs/languages/nunjucks/); and how they're **styled**. 33 | 34 | So, here we go. 35 | 36 | - **[eleventy_solo_starter](https://github.com/brycewray/eleventy_solo_starter)**---JavaScript templating; [Tailwind CSS](https://tailwindcss.com), which as of version 2.1.0 includes the just-in-time (JIT) compiler (for details about the advantages of this experimental addition to Tailwind, refer to the [official announcement](https://blog.tailwindcss.com/just-in-time-the-next-generation-of-tailwind-css) as well as [my related post](/posts/2021/03/jit-game-changer-tailwind-css/)). [View the demo](https://eleventy-solo-starter-alpha.vercel.app/). 37 | - **[eleventy_solo_starter_njk](https://github.com/brycewray/eleventy_solo_starter_njk)**---[Nunjucks](https://mozilla.github.io/nunjucks) templating; Tailwind CSS, now with the JIT compiler. [View the demo](https://eleventy-solo-starter-njk.vercel.app/). 38 | - **[eleventy_solo_starter_scss](https://github.com/brycewray/eleventy_solo_starter_scss)** *(**new**)*---JavaScript templating; [Sass/SCSS](https://sass-lang.com). [View the demo](https://eleventy-solo-starter-scss.vercel.app). 39 | - **[eleventy_solo_starter_njk_scss](https://github.com/brycewray/eleventy_solo_starter_njk_scss)** *(**new**)*---Nunjucks templating; Sass/SCSS. [View the demo](https://eleventy-solo-starter-njk-scss.vercel.app). 40 | 41 | ## Hugo starters 42 | 43 | For now, I still have only two Hugo starters. This is for two reasons: there's only one form of templating in Hugo (Go-based templating); and the Tailwind JIT compiler isn't yet compatible with Hugo. One is based on Tailwind CSS (again, no JIT) and the other on Sass/SCSS. Once the Hugo-*vs.*-JIT issues are resolved, I'll likely add a JIT-equipped Hugo starter, too. 44 | 45 | - [hugo_twcss](https://github.com/brycewray/hugo_twcss)---Tailwind CSS. [View the demo](https://hugo-twcss.vercel.app). 46 | - [hugo_solo](https://github.com/brycewray/hugo_solo)---Sass/SCSS. [View the demo](https://hugo-solo.vercel.app). 47 | 48 | ## Enjoy 49 | 50 | As usual, I've learned a few things while working on these, including the need to fix some embarrassing oversights in the older ones. Regardless of your proficiency with Eleventy and/or Hugo, perhaps you'll find them similarly educational. Have fun with them. 51 | 52 | If you use one of the repos, you'll probably want to "watch" that repo for changes (which have been frequent of late). Also, please [let me know](/contact)---including with [GitHub issues](https://guides.github.com/features/issues/), if you prefer---if you encounter difficulties with any of them. 53 | 54 | Happy SSG-ing! -------------------------------------------------------------------------------- /src/posts/2018/10/web-typography-part-1.md: -------------------------------------------------------------------------------- 1 | --- 2 | layout: singlepost 3 | tags: post 4 | title: "Readable web text, pretty please" 5 | subtitle: "Part 1 of a two-part series on web typography" 6 | description: "Can we just agree that type on the web should be, y’know, readable?" 7 | author: Bryce Wray 8 | date: 2018-10-17T14:40:00-05:00 9 | lastmod: 2020-09-23T07:07:00-05:00 10 | discussionId: "2018-10-web-typography-part-1" 11 | featured_image: "letters-691842_2504x1676.jpg" 12 | featured_image_width: 2504 13 | featured_image_height: 1676 14 | featured_image_alt: "Letters for old-style typesetting" 15 | featured_image_caption: | 16 | Image: Free-Photos; Pixabay 17 | --- 18 | 19 | As I suggested in a [recent post](/posts/2018/09/why-finally-settled-ulysses), I'm more than a little hung up on on-screen type; so I thought I'd do a little two-part series on website typography and share some appropriate insights and tips. They come from two decades as a web designer and three-and-a-half decades as a writer and formatter---oh, and nearly six decades of reading. Perhaps you'll find them useful. 20 | 21 | ## Readability . . . ! Do you _speak_ it? 22 | 23 | One would hope the following statement wouldn't be too terribly controversial but, given the appearance of many pages on the web these days, I fear it may be: 24 | 25 | _At a minimum, body type on web pages should be **easily readable** by anyone with **reasonably** normal vision and a **reasonably** functional and **reasonably** sized display_. 26 | 27 | (Note that I said, "body type." That's an important distinction. There should be a little more leeway for headlines, especially large ones.) 28 | 29 | By "easily readable," I mean: 30 | 31 | - **It should have decent contrast**.---In other words, there should be enough difference between the color of the type and the color of the background. 32 | I don't mean stark black on stark white, or vice versa, because that's _too_ much contrast on a display---especially on a super-high-contrast [OLED](https://en.wikipedia.org/wiki/OLED) display such as is becoming _de rigueur_ for [smartphones](https://www.oled-info.com/oled_devices/mobile_phones). UI experts have told me they suggest a combination of #333 (really dark gray) on \#fff (white). That's what I have on this site, except for headlines and the nav menu. 33 | So, no, having a substantial part of your page's body text appear as light-to-medium gray on white (or, worse, dark gray on black) isn't a good idea. By the way, the same is true for link text, particularly if you don't underline links (which I formerly didn't because I thought it was too 1990s-ish, but changed my mind after learning about the [difficulty that non-underlined links can cause, especially for the visually impaired](https://webaim.org/techniques/hypertext/link_text)). Link text should be a **different** color from your body text and **not** some color that melts into the background. Don't make me come over there and lecture you about ["mystery meat" navigation](http://www.webpagesthatsuck.com/mysterymeatnavigation.html). 34 | However, there's more to this. 35 | - **It should have sufficient width**.---With the ready availability of web fonts (a separate subject which I'll address in Part 2), many website designers want to use some of the slick, ultra-thin type they've seen, or implemented, in video or print. And, again, that's fine in sufficiently large **headline** text. But I draw the line on body text for a web page; that's no place for super-thin type. Indeed, it's yet another barrier to sufficient contrast. 36 | 37 | ## Now that's (not) what I'm talkin' about 38 | 39 | But, rather than rant aimlessly, let me show you some examples of sins against either or both of these principles of web typography. They were current as of when I originally posted this. 40 | 41 | {% imgc "Typography-scr-cap-2-2018-10-16_1344x200.jpg", "Thin and dim text that is hard to read", 1344, 200 %} 42 | 43 | {% imgc "Typography-scr-cap-3-2018-10-16_1398x252.jpg", "More dim text that is hard to read", 1398, 252 %} 44 | 45 | {% imgc "Typography-scr-cap-4-2018-10-16_1398x164.jpg", "Still more dim text that is hard to read", 1398, 164 %} 46 | 47 | We can do better, friends. 48 | 49 | I close with these comments, by blogger Kevin Marks, taken from a [2016 article](https://www.telegraph.co.uk/science/2016/10/23/internet-is-becoming-unreadable-because-of-a-trend-towards-light/) in _The Telegraph_: 50 | 51 | > To arbitrarily throw away contrast based on a fashion that looks good on my perfect screen in my perfectly lit office is abdicating [designers'] responsibilities to the very people for whom they are designing. My plea to designers and software engineers: Ignore the fads and go back to the typographic principles of print. You'll be making things better for people who read on smaller, dimmer screens, even if their eyes aren't aging like mine. It may not be trendy, but it's time to consider who is being left out by the web's aesthetic. 52 | 53 |

     

    54 | 55 | _In [Part 2](/posts/2018/10/web-typography-part-2/), I'll cover why_ this _site's typography looks the way it does, including why it doesn't look the same on different platforms---and why that's not only on purpose but also just fine and dandy. (Heresy!)_ -------------------------------------------------------------------------------- /src/posts/2020/11/mixed-nuts-2020-11.md: -------------------------------------------------------------------------------- 1 | --- 2 | layout: singlepost 3 | title: "Mixed nuts • November, 2020" 4 | subtitle: "Another set of odd-servations" 5 | description: "Follow my erratic mind, if you dare, as it proves anew that it deserves that adjective." 6 | author: Bryce Wray 7 | date: 2020-11-07T10:10:00-06:00 8 | lastmod: 2020-12-12T13:20:00-06:00 9 | draft: false 10 | discussionId: "2020-11-mixed-nuts-2020-11" 11 | featured_image: "usman-yousaf-qHETVV5u7Wk-unsplash_5184x3456.jpg" 12 | featured_image_width: 5184 13 | featured_image_height: 3456 14 | featured_image_alt: "Overhead view of mixed nuts in a decorative glass dish on an orange surface" 15 | featured_image_caption: | 16 | Image: Usman Yousaf; Unsplash 17 | --- 18 | 19 | Given the course of recent events in our storm-tossed existence, both here in the United States and elsewhere, it seems a good time to whip out another set of those miscellaneous observations I typically call "mixed nuts" (most recent such assortment was [this example](/posts/2020/09/mixed-nuts-2020-09)) . . . 20 | 21 | ---- 22 | 23 | Regardless of which country you inhabit or which party (if any) you follow, you can be sure of this about elections: the good guys always want all legally qualified citizens to vote *and* want all the votes to be counted, no matter how long it takes. 24 | 25 | *Trying to sell your house? Don't rely on those "we-buy-it-quick-so-you-can-get-out" companies, hereafter referred to as* ZeeCOs. *Folks I know contracted with a ZeeCO to buy their old house so they could get a new one. Just days before the dual closings, the ZeeCO suddenly backed out because the neighborhood's homeowners' association (HOA) was being sued for reasons that had zero effect on the [saleability](https://dictionary.cambridge.org/us/dictionary/english/saleable) of these folks' old house.[^1] Fortunately, they made other arrangements and still got the new house, but they'd learned never to trust ZeeCOs.* 26 | 27 | O, for the return of *real* cable news channels, fashioned after the way they operated before the mid-1990s, back when they actually spent most of their 24-hour cycles *reporting* and (mostly) separated editorial comments into a blissfully few specific panel shows. 28 | 29 | *Although this site is [now more than two years old](/posts/2020/09/two-but-not-terrible), only recently have I grasped the [importance of making a website properly cache its static assets](https://gtmetrix.com/leverage-browser-caching.html)---so, for example, your browser doesn't have to reload the CSS file every time you go from one of my pages to another. Thus, it was my pleasant surprise, on this site's recent, temporary return to the [Hugo](https://gohugo.io) static site generator (SSG), to discover how easy Hugo makes this process, thanks to its [fingerprinting capability](https://gohugo.io/hugo-pipes/fingerprint/). With [Eleventy](https://11ty.dev), you need some additional, external trickiness about which I learned and will be writing in the near future.* 30 | 31 | While writing a few days ago in [Ulysses](https://ulysses.app), I suddenly found I couldn't add footnotes, among other usually available elements, within "sheets" (as they're called in Ulysses-ese) created with the latest version. Reported to Big U Support. Turned out that, somehow, I'd switched Ulysses to vanilla [Markdown](https://daringfireball.net/projects/markdown) rather than its default flavor, Markdown XL. Oops. Just noting it in case other Ulysses users run into similar problems. 32 | 33 | *My "lurch" among [Jamstack](https://jamstack.wtf)-savvy website hosts [over](/posts/2020/07/goodbye-hello) [the](/posts/2020/07/goodbye-hello-part-2) [last](/posts/2020/08/goodbye-hello-part-3) [few](/posts/2020/09/goodbye-hello-part-4) [months](/posts/2020/09/goodbye-hello-part-5) makes it clear that, of the "automatic" hosts[^2], [Vercel](https://vercel.com)'s free tier has by far the best combination of superior worldwide performance (especially because of the [recent enhancements](https://vercel.com/blog/new-edge-dev-infrastructure) to its [Edge Network](https://vercel.com/docs/edge-network/overview)) and clean, no-fuss maintenance. That said, my [experiment](/posts/2020/10/forward-paas) with [Cloudflare Workers sites](https://workers.cloudflare.com) and [Workers KV storage](https://developers.cloudflare.com/workers/learning/how-kv-works) was extremely interesting from a geekiness standpoint and, were I to drop Vercel for some reason, a Cloudflare Workers site---although **not** free---would be the very close second choice.* 34 | 35 | **Update**: Cloudflare's subsequent announcement of a **free** tier for Cloudflare Workers KV storage followed by my successful test of that tier's performance further changed the equation, as explained in the updates I've since made to "[Forward PaaS](/posts/2020/10/forward-paas)." {.yellowBox} 36 | 37 | [^1]: If you think HOAs don't often get sued, you're kidding yourself. 38 | 39 | [^2]: By "automatic" host, I mean one that deploys your website every time you push a change to the site's remote repository. By contrast, you have to set up your own continuous deployment---*e.g.*, a [GitHub Action](https://github.com/features/actions/)---to deploy a [Firebase](https://firebase.google.com) site or a [Cloudflare Workers site](https://workers.cloudflare.com) that way. -------------------------------------------------------------------------------- /src/about/index.md: -------------------------------------------------------------------------------- 1 | --- 2 | layout: singlepost 3 | title: About me 4 | subtitle: Just who do I think I am? 5 | description: Not a bio (you’d fall asleep), but just some explanatory observations. 6 | author: Bryce Wray 7 | date: 2018-09-14T15:00:00-05:00 8 | lastmod: 2021-01-30T13:55:00-05:00 9 | discussionId: "about" 10 | featured_image: question-mark-over-mac-keyboard-49958_1280x905.jpg 11 | featured_image_width: 1280 12 | featured_image_height: 905 13 | featured_image_alt: Stylistic image of question mark superimposed over computer keyboard 14 | featured_image_caption: | 15 | Image: Dalomo; Pixabay 16 | --- 17 | 18 | Welcome. 19 | 20 | Eons ago, when [the web was a new thing](http://info.cern.ch/hypertext/WWW/TheProject.html)---and people still capitalized *Web* and used two words for *Web site*, consarn it---[ISPs](https://en.wikipedia.org/wiki/Internet_service_provider) tended to provide free file space for people to have [little personal websites](https://consumerist.com/2015/03/20/where-did-everyone-from-the-90s-go-when-we-all-got-facebook-and-quit-web-1-0/). Back in those days, one did so with whatever [FTP](https://en.wikipedia.org/wiki/File_Transfer_Protocol) client one could find, what we now know as static [HTML](https://www.w3schools.com/html/html_intro.asp) files (but not [CSS](https://www.w3schools.com/Css/), not yet anyway), and lots and lots of [dialup modem noise](https://en.wikipedia.org/wiki/File:Dial_up_modem_noises.ogg). 21 | 22 | And, yes, I had one, back on what then was called [GTE.net](https://en.wikipedia.org/wiki/GTE). In fact, I was a "Charter Subscriber" to that ISP. 23 | 24 | {% imgc "gte-net_HTML_1997-04-17_crop_1280x715.jpg", "HTML code from a 1997 website", 1280, 715 %} 25 | 26 | Yet, as that free-file-space thing gradually went away, so, too, did many personal sites---mine among them. 27 | 28 | Over the years, database-driven content management systems ([CMSs](https://en.wikipedia.org/wiki/Web_content_management_system)) like [WordPress](https://wordpress.org) appeared. They provide click-and-drag ease in building a personal site, but they tend to be [security nightmares unless properly maintained](https://ithemes.com/2017/01/16/wordpress-security-issues/), which many aren't. They also introduce a great deal of technical overhead. 29 | 30 | And then there are creatures like Facebook, Instagram, and Twitter, which [for all too many people](https://ia.net/topics/take-the-power-back) have become the only Web-based locations for ordinary folks’ thoughts. Of course, [all these platforms want](https://adammclane.com/2013/03/in-social-media-you-are-the-product/) is to grab your information, show you ads, and---particularly in the case of Facebook---contribute to the [dumbing-down of your culture](https://www.salon.com/2017/07/16/how-social-media-is-dumbing-down-our-communication/) and the [political polarization of your society](https://www.sciencedirect.com/science/article/pii/S0736585317305208). What's the harm??!? 31 | 32 | (Don't worry. This site is, and will remain, apolitical by design unless we're nearing World War III or something along those lines. Maybe even then, since I doubt my little ol’ site is going to stop The Really Big One.) 33 | 34 | Anyway, it seemed a lot of the fun had gone out of puttering around on the web and actually creating content. Then---first among the techno-cognoscenti and, more recently, among us ordinary folks---came websites powered by [static site generators (SSGs)](https://www.staticgen.com) and written in [Markdown](https://daringfireball.net/projects/markdown/). I found them a source of curiosity at first but gradually became more interested in the prospect, especially as I learned more about their [technical advantages](https://www.makeuseof.com/tag/reasons-ditch-cms-static-site-generator/); and, so, here we are. 35 | 36 | ## As for me . . . 37 | 38 | So, who am I, and what business do I have putting yet another site on this already overstuffed web? 39 | 40 | I love to write. More often than not, the muse is in one of her oh-let's-go-"techy"-instead-of-"fictiony" moods and so she tells me to write more stuff on this site. Sometimes it's even about the app or apps I use to write, which leads me to the next point . . . 41 | 42 | Am I anybody special? Nope; just an ordinary working guy who, for decades, has used a multitude of computing devices, operating systems, and apps---and learned a few things (and formed more than a few opinions) along the way. I've been told I can make complicated things easier to understand, and I try to do the same here. 43 | 44 | Finally: since the Kewl Kids went off and left us non-SSG users in the dust, it behooved me and my geek's curiosity to give this stuff a try, and that was the main reason I started the site in the first place. As one who's long delighted in hand-coding websites whenever possible, I love seeing the comeback of static sites. 45 | 46 | Thank you for stopping by. I hope you find this site a source of various little nuggets of helpful info, and occasionally a laugh or two---even if I hadn't intended it, but especially if I had. 47 | 48 | Again, welcome. 49 | 50 | **Note**: For those familiar with the site, you'll see that this text now encompasses both the long-time "About me" text and the site's original home page "welcome" text. 51 | {.yellowBox} -------------------------------------------------------------------------------- /src/posts/2021/07/gems-in-rough-07.md: -------------------------------------------------------------------------------- 1 | --- 2 | layout: singlepost 3 | title: "Gems in the rough #7" 4 | subtitle: "Eleventy Meetup #1, Firefox’s woes, and other website-related arcana" 5 | description: "Static site generator fans, here’s another (sorta) brief set of goodies for your edification." 6 | author: Bryce Wray 7 | date: 2021-07-17T14:23:00-05:00 8 | lastmod: 2021-07-18T13:28:00-05:00 9 | discussionId: "2021-07-gems-in-rough-07" 10 | featured_image: "gemstones-1419780_3648x2736.jpg" 11 | featured_image_width: 3648 12 | featured_image_height: 2736 13 | featured_image_alt: "Close-up view of colorful gemstones" 14 | featured_image_caption: | 15 | Image: cabotots; Pixabay 16 | --- 17 | 18 | Each entry in the "Gems in the rough" series is a collection of tips, explanations, and/or idle observations which I hope will be at least somewhat useful to those of you with websites built by [static site generators (SSGs)](https://jamstack.org/generators). 19 | {.blueBox} 20 | 21 | ## Eleventy Meetup #1 22 | 23 | The inaugural **[Eleventy Meetup](https://11tymeetup.dev/)** occurred earlier this week, and it was a blast. We heard interesting talks from [Eleventy](https://11ty.dev) creator [Zach Leatherman](https://zachleat.com) and [Mike Aparicio](https://twitter.com/peruvianidol) of [11ty.recipes](https://11ty.recipes) fame (and Mike's dog, too, albeit briefly). A good time was had by all. If you have the slightest interest in Eleventy, I urge you to check the [Meetup site](https://11tymeetup.dev) and sign up for the newsletter so you can be advised of future sessions. 24 | 25 | ## Firefox slips further 26 | 27 | Things are not great in the world of [Mozilla Firefox](https://www.mozilla.org/en-US/firefox/) right now, and they got even sadder this week with news that, according to [StatCounter](https://gs.statcounter.com/browser-market-share), Firefox's share of the browser market in June dipped below that of [Microsoft Edge](https://www.microsoft.com/en-us/edge) and is nearing that of the [browser that ships with Samsung phones](https://en.wikipedia.org/wiki/Samsung_Internet) (which I'd guess many Samsung users eschew in favor of, yep, [Chrome](https://www.google.com/chrome/)): 28 | 29 | {% imgc "2021-07-17_StatCounter-browser-mkt-shr_June-2021_1872x576.png", "Screen capture of StatCounter’s June 2021 display of worldwide browser market share", 1872, 576 %} 30 | 31 | As for the elephant in the room represented by these numbers: we've clearly reached a phase of browser use like that of the "Internet Explorer *is* the internet" days where Chrome's massive and *non*-imperiled market share is concerned. Barring outside action by regulators that could affect this in ways not currently expected, I guess we who build websites will just have to hope our [new insect overlords](https://knowyourmeme.com/memes/i-for-one-welcome-our-new-insect-overlords) don't abuse this. (Yeah, right.) 32 | 33 | ## Azure Static Web Apps 34 | 35 | It escaped my notice until this week that Microsoft's [Azure Static Web Apps](https://azure.microsoft.com/en-us/services/app-service/static/) service [has been in general availability for two months](https://azure.microsoft.com/en-us/blog/develop-production-scale-modern-web-apps-quickly-with-azure-static-web-apps/). On learning this, I decided to give ASWA a try with the same Eleventy-based test repo I use on various [Jamstack](https://jamstack.org)-savvy hosts. 36 | 37 | Getting signed up was, well, challenging, as one tends to find for most things [Azure](https://azure.microsoft.com/en-us/); and the build process was lengthy[^ASWAslowbuild] and supports only a limited number of SSGs, *not* including Eleventy as of now. Still, I got it going. 38 | 39 | In my tests so far, the ASWA site's performance is so-so, especially compared to that of hosts with *far* less up-front hassle. It's not terrible, but I'd have expected more from an Azure-hosted site. Will keep a watch on it but, for now, I'm of the opinion that Microsoft is content to let the usual Jamstack hosts lead the way since ASWA probably doesn't fit its business model all that well. 40 | 41 | [^ASWAslowbuild]: To be fair, I should note that it depends on [GitHub Actions](https://github.com/features/actions), which in my experience adds about ninety to 120 seconds to the process on its own. That said, a build process taking nearly three times as long on ASWA compared to a similarly GitHub Actions-fueled one on a [CloudFlare Workers site](https://workers.cloudflare.com) doesn't augur well for Microsoft's setup right now. 42 | 43 | ## Comment-by-email 44 | 45 | On one of my at-least-daily visits to the [Eleventy Discord](https://www.11ty.dev/blog/discord/), I noticed a link to "[Emails, not comments](https://luke.work/blog/2021/07/alternative-to-comments/)" by [Luke Harris](https://twitter.com/lkhrs). The article described how, having decided not to have a commenting platform on his Eleventy site anymore, Mr. Harris made it a one-click action for anyone to reply to his articles by email. (He'd probably want me to add that he got the idea from [Kev Quirk's site](https://kevq.uk/), as the linked article duly notes.) 46 | 47 | The process was both appealingly simple and, to me, geekily interesting; so I stole, um, adopted his approach---as you can see at the bottom of this post, as well as all other pages on the site using the same template. Thank you, sir! -------------------------------------------------------------------------------- /src/posts/2021/02/tailwind-head-hugo-pipes.md: -------------------------------------------------------------------------------- 1 | --- 2 | layout: singlepost 3 | title: "Tailwind-to-head with Hugo Pipes" 4 | subtitle: "An easy way to get internal CSS" 5 | description: "If your website draws that “render-blocking resource” gripe during tests, here’s one method for fighting it." 6 | author: Bryce Wray 7 | date: 2021-02-02T16:25:00-06:00 8 | lastmod: 2021-03-20T17:30:00-05:00 9 | #draft: false 10 | discussionId: "2021-02-tailwind-head-hugo-pipes" 11 | featured_image: "code-html-head-5421210_5103x3403.jpg" 12 | featured_image_width: 5103 13 | featured_image_height: 3403 14 | featured_image_alt: "Closeup of display of web page's HTML HEAD section" 15 | featured_image_caption: | 16 | Image: Sárfi Benjámin; Pixabay 17 | --- 18 | 19 | **Note**: For a [Eleventy](https://11ty.dev)-based solution, see "[Tailwind-to-head with Eleventy](/posts/2021/03/tailwind-head-eleventy)" from a few weeks later. 20 | {.yellowBox} 21 | 22 | External *vs.* internal---that is the question. At least, it is when you're considering how and where to provide CSS in your website. 23 | 24 | Among the CSS *cognoscenti*, there are endless debates about whether your site's CSS should be in one or more separate files (external) or included in ` 52 | {{ end }} 53 | ``` 54 | {% endraw %} 55 | 56 | ## SCSS, anyone? 57 | 58 | Finally, as a bonus, here's how you do it if you prefer to use [SCSS](https://sass-lang.com) (for which Hugo Pipes has its own out-of-the-box capabilities, not requiring either PostCSS or Node.js) rather than Tailwind CSS. As before, **external** first: 59 | 60 | {% raw %} 61 | ```go 62 | {{ $options := (dict "targetPath" "css/index.css" "outputStyle" "compressed" ) }} 63 | {{ $css := resources.Get "scss/index.scss" | resources.ToCSS $options | fingerprint }} 64 | ``` 65 | {% endraw %} 66 | 67 | . . . and then, **internal**: 68 | 69 | {% raw %} 70 | ```go 71 | {{ with resources.Get "scss/index.scss" | resources.ToCSS (dict "outputStyle" "compressed") }} 72 | 73 | {{ end }} 74 | ``` 75 | {% endraw %} 76 | 77 | Whichever way you roll on each choice above---external *vs.* internal, Tailwind/PostCSS *vs.* SCSS---here's hoping this is useful information for you Hugo aficionados. -------------------------------------------------------------------------------- /src/posts/posts.njk: -------------------------------------------------------------------------------- 1 | --- 2 | layout: base 3 | tags: 4 | - nav 5 | navtitle: Posts 6 | title: Posts 7 | description: Posts for this website 8 | eleventyExcludeFromCollections: true 9 | pagination: 10 | data: collections.post 11 | size: 5 12 | reverse: true 13 | alias: posts 14 | --- 15 | 16 |
    17 |
    18 |

    Posts

    19 |
    20 |
    21 |

    22 | {% if pagination.firstPageHref != page.url %} 23 | {{ '/src/assets/svg/svgPrevPageIcon.svg' | svgContents | safe }}{{ '/src/assets/svg/svgPrevPageIcon.svg' | svgContents | safe }} 24 |            25 | {{ '/src/assets/svg/svgPrevPageIcon.svg' | svgContents | safe }} 26 | {% else %} 27 | {{ '/src/assets/svg/svgFirstPageIcon.svg' | svgContents | safe }}{{ '/src/assets/svg/svgFirstPageIcon.svg' | svgContents | safe }} 28 |            29 | {{ '/src/assets/svg/svgFirstPageIcon.svg' | svgContents | safe }} 30 | {% endif %} 31 |            32 | {% if pagination.lastPageHref != page.url %} 33 | {{ '/src/assets/svg/svgNextPageIcon.svg' | svgContents | safe }} 34 |            35 | {{ '/src/assets/svg/svgNextPageIcon.svg' | svgContents | safe }}{{ '/src/assets/svg/svgNextPageIcon.svg' | svgContents | safe }} 36 | {% else %} 37 | {{ '/src/assets/svg/svgLastPageIcon.svg' | svgContents | safe }} 38 |            39 | {{ '/src/assets/svg/svgLastPageIcon.svg' | svgContents | safe }}{{ '/src/assets/svg/svgLastPageIcon.svg' | svgContents | safe }} 40 | {% endif %} 41 |

    42 |
    43 | {% for post in posts %} 44 |
    45 |

    {{ post.data.title | safe }}

    46 |

    {{ post.data.subtitle | safe }}

    47 |

    48 | {% if post.data.lastmod %} 49 |
    Last modified 50 | {% endif %} 51 |

    52 |

    53 | {{ post.data.description | safe }} 54 |

    55 |
    56 | {% endfor %} 57 |
    58 |

    59 | {% if pagination.firstPageHref != page.url %} 60 | {{ '/src/assets/svg/svgPrevPageIcon.svg' | svgContents | safe }}{{ '/src/assets/svg/svgPrevPageIcon.svg' | svgContents | safe }} 61 |            62 | {{ '/src/assets/svg/svgPrevPageIcon.svg' | svgContents | safe }} 63 | {% else %} 64 | {{ '/src/assets/svg/svgFirstPageIcon.svg' | svgContents | safe }}{{ '/src/assets/svg/svgFirstPageIcon.svg' | svgContents | safe }} 65 |            66 | {{ '/src/assets/svg/svgFirstPageIcon.svg' | svgContents | safe }} 67 | {% endif %} 68 |            69 | {% if pagination.lastPageHref != page.url %} 70 | {{ '/src/assets/svg/svgNextPageIcon.svg' | svgContents | safe }} 71 |            72 | {{ '/src/assets/svg/svgNextPageIcon.svg' | svgContents | safe }}{{ '/src/assets/svg/svgNextPageIcon.svg' | svgContents | safe }} 73 | {% else %} 74 | {{ '/src/assets/svg/svgLastPageIcon.svg' | svgContents | safe }} 75 |            76 | {{ '/src/assets/svg/svgLastPageIcon.svg' | svgContents | safe }}{{ '/src/assets/svg/svgLastPageIcon.svg' | svgContents | safe }} 77 | {% endif %} 78 |

    79 |
    80 |
    81 | 82 |
    -------------------------------------------------------------------------------- /src/_includes/layouts/partials/head.njk: -------------------------------------------------------------------------------- 1 | {% set socialImg = "https://res.cloudinary.com/brycewray-com/image/upload/c_fill,w_1024,h_512,q_auto,f_auto,x_0,z_1/" %} 2 | {% set fallbackImg = "typewriter-monochrome_2242164_6260x4374.jpg" %} 3 | {% set eleventyVersion = pkg.devDependencies['@11ty/eleventy'] | replace("^", "") %} 4 | {% set eleventyEnv = projEnv.environment %} 5 | 6 | 7 | 8 | 9 | 10 | 11 | 12 | {% if page.url === "/" %} 13 | {{ siteparams.siteTitle }} 14 | 15 | 16 | {% else %} 17 | {{ title }} | {{ siteparams.siteTitle }} 18 | 19 | 20 | {% endif %} 21 | 22 | 23 | 24 | 25 | 26 | 27 | 28 | 29 | {% if page.url === "/" %} 30 | 31 | 32 | 33 | 34 | {% else %} 35 | 36 | 37 | 38 | 39 | {% endif %} 40 | 41 | 42 | 43 | 44 | 45 | 46 | {% if page.url === "/" %} 47 | 48 | 49 | {% else %} 50 | 51 | 52 | {% endif %} 53 | 54 | 55 | 56 | 57 | 58 | 59 | 60 | 61 | 62 | 63 | 64 | 65 | 66 | 67 | 68 | 69 | 70 | 71 | 72 | 73 | 74 | 75 | 76 | 77 | 78 | 79 | 80 | 81 | 82 | 83 | 84 | 85 | 86 | 87 | 88 | 89 | 90 | 91 | {% if eleventyEnv == "production" %} 92 | 93 | 94 | {% else %} 95 | 96 | {% endif %} 97 | 98 | 99 | 100 | 101 | 102 | 103 | 104 | 105 | 106 | 107 | --------------------------------------------------------------------------------