minor content changes, adding hash to js
This commit is contained in:
parent
201522c09f
commit
d4a5a971bf
12 changed files with 115 additions and 76 deletions
43
.eleventy.js
43
.eleventy.js
|
|
@ -17,16 +17,22 @@ const {
|
||||||
toAbsoluteUrl,
|
toAbsoluteUrl,
|
||||||
stripHtml,
|
stripHtml,
|
||||||
minifyCss,
|
minifyCss,
|
||||||
|
minifyJs,
|
||||||
mdInline
|
mdInline
|
||||||
} = require('./config/filters/index.js');
|
} = require('./config/filters/index.js');
|
||||||
|
|
||||||
// module import shortcodes
|
// module import shortcodes
|
||||||
const {imageShortcodePlaceholder, liteYoutube} = require('./config/shortcodes/index.js');
|
const {
|
||||||
|
imageShortcodePlaceholder,
|
||||||
|
includeRaw,
|
||||||
|
liteYoutube
|
||||||
|
} = require('./config/shortcodes/index.js');
|
||||||
|
|
||||||
// module import collections
|
// module import collections
|
||||||
const {getAllPosts} = require('./config/collections/index.js');
|
const {getAllPosts} = require('./config/collections/index.js');
|
||||||
|
|
||||||
// module import transforms
|
// module import events
|
||||||
|
const {before} = require('./config/events/before.js');
|
||||||
|
|
||||||
// plugins
|
// plugins
|
||||||
const markdownLib = require('./config/plugins/markdown.js');
|
const markdownLib = require('./config/plugins/markdown.js');
|
||||||
|
|
@ -38,9 +44,6 @@ const pluginRss = require('@11ty/eleventy-plugin-rss');
|
||||||
const inclusiveLangPlugin = require('@11ty/eleventy-plugin-inclusive-language');
|
const inclusiveLangPlugin = require('@11ty/eleventy-plugin-inclusive-language');
|
||||||
|
|
||||||
module.exports = eleventyConfig => {
|
module.exports = eleventyConfig => {
|
||||||
// Tell 11ty to use the .eleventyignore and ignore our .gitignore file
|
|
||||||
eleventyConfig.setUseGitIgnore(false);
|
|
||||||
|
|
||||||
// --------------------- Custom Watch Targets -----------------------
|
// --------------------- Custom Watch Targets -----------------------
|
||||||
eleventyConfig.addWatchTarget('./src/assets');
|
eleventyConfig.addWatchTarget('./src/assets');
|
||||||
eleventyConfig.addWatchTarget('./utils/*.js');
|
eleventyConfig.addWatchTarget('./utils/*.js');
|
||||||
|
|
@ -65,6 +68,7 @@ module.exports = eleventyConfig => {
|
||||||
eleventyConfig.addFilter('toJson', JSON.stringify);
|
eleventyConfig.addFilter('toJson', JSON.stringify);
|
||||||
eleventyConfig.addFilter('fromJson', JSON.parse);
|
eleventyConfig.addFilter('fromJson', JSON.parse);
|
||||||
eleventyConfig.addFilter('cssmin', minifyCss);
|
eleventyConfig.addFilter('cssmin', minifyCss);
|
||||||
|
eleventyConfig.addNunjucksAsyncFilter('jsmin', minifyJs);
|
||||||
eleventyConfig.addFilter('md', mdInline);
|
eleventyConfig.addFilter('md', mdInline);
|
||||||
eleventyConfig.addFilter('keys', Object.keys);
|
eleventyConfig.addFilter('keys', Object.keys);
|
||||||
eleventyConfig.addFilter('values', Object.values);
|
eleventyConfig.addFilter('values', Object.values);
|
||||||
|
|
@ -73,17 +77,19 @@ module.exports = eleventyConfig => {
|
||||||
// --------------------- Custom shortcodes ---------------------
|
// --------------------- Custom shortcodes ---------------------
|
||||||
eleventyConfig.addNunjucksAsyncShortcode('imagePlaceholder', imageShortcodePlaceholder);
|
eleventyConfig.addNunjucksAsyncShortcode('imagePlaceholder', imageShortcodePlaceholder);
|
||||||
eleventyConfig.addShortcode('youtube', liteYoutube);
|
eleventyConfig.addShortcode('youtube', liteYoutube);
|
||||||
|
eleventyConfig.addShortcode('include_raw', includeRaw);
|
||||||
eleventyConfig.addShortcode('year', () => `${new Date().getFullYear()}`); // current year, stephanie eckles
|
eleventyConfig.addShortcode('year', () => `${new Date().getFullYear()}`); // current year, stephanie eckles
|
||||||
|
|
||||||
// --------------------- Custom transforms ---------------------
|
// --------------------- Custom transforms ---------------------
|
||||||
|
|
||||||
eleventyConfig.addPlugin(require('./config/transforms/html-config.js'));
|
eleventyConfig.addPlugin(require('./config/transforms/html-config.js'));
|
||||||
|
|
||||||
// --------------------- Custom Template Languages ---------------------
|
// --------------------- Custom Template Languages ---------------------
|
||||||
|
|
||||||
eleventyConfig.addPlugin(require('./config/template-languages/css-config.js'));
|
eleventyConfig.addPlugin(require('./config/template-languages/css-config.js'));
|
||||||
eleventyConfig.addPlugin(require('./config/template-languages/js-config.js'));
|
eleventyConfig.addPlugin(require('./config/template-languages/js-config.js'));
|
||||||
|
|
||||||
|
// --------------------- Custom events ---------------------
|
||||||
|
// eleventyConfig.addPlugin(require('./config/events/before.js'));
|
||||||
|
|
||||||
// --------------------- Custom collections -----------------------
|
// --------------------- Custom collections -----------------------
|
||||||
eleventyConfig.addCollection('posts', getAllPosts);
|
eleventyConfig.addCollection('posts', getAllPosts);
|
||||||
|
|
||||||
|
|
@ -95,28 +101,35 @@ module.exports = eleventyConfig => {
|
||||||
eleventyConfig.addPlugin(inclusiveLangPlugin);
|
eleventyConfig.addPlugin(inclusiveLangPlugin);
|
||||||
|
|
||||||
// --------------------- Passthrough File Copy -----------------------
|
// --------------------- Passthrough File Copy -----------------------
|
||||||
|
|
||||||
// same path
|
// same path
|
||||||
['src/assets/fonts/', 'src/assets/images/'].forEach(path =>
|
['src/assets/fonts/', 'src/assets/images/'].forEach(path =>
|
||||||
eleventyConfig.addPassthroughCopy(path)
|
eleventyConfig.addPassthroughCopy(path)
|
||||||
);
|
);
|
||||||
|
|
||||||
// social icons to root directory
|
// social icons to root directory
|
||||||
eleventyConfig.addPassthroughCopy({
|
eleventyConfig.addPassthroughCopy({
|
||||||
'src/assets/images/favicon/*': '/'
|
'src/assets/images/favicon/*': '/'
|
||||||
});
|
});
|
||||||
|
|
||||||
// --------------------- general config -----------------------
|
eleventyConfig.addPassthroughCopy({
|
||||||
|
'src/assets/css/global.css': 'src/_includes/global.css'
|
||||||
|
});
|
||||||
|
|
||||||
|
// --------------------- general config -----------------------
|
||||||
return {
|
return {
|
||||||
|
// Pre-process *.md, *.html and global data files files with: (default: `liquid`)
|
||||||
|
markdownTemplateEngine: 'njk',
|
||||||
|
htmlTemplateEngine: 'njk',
|
||||||
|
dataTemplateEngine: 'njk',
|
||||||
|
|
||||||
|
// Optional (default is set): If your site deploys to a subdirectory, change `pathPrefix`, for example with with GitHub pages
|
||||||
|
pathPrefix: '/',
|
||||||
|
|
||||||
dir: {
|
dir: {
|
||||||
input: 'src',
|
|
||||||
output: 'dist',
|
output: 'dist',
|
||||||
|
input: 'src',
|
||||||
includes: '_includes',
|
includes: '_includes',
|
||||||
layouts: '_layouts'
|
layouts: '_layouts'
|
||||||
},
|
}
|
||||||
markdownTemplateEngine: 'njk',
|
|
||||||
dataTemplateEngine: 'njk',
|
|
||||||
htmlTemplateEngine: 'njk'
|
|
||||||
};
|
};
|
||||||
};
|
};
|
||||||
|
|
|
||||||
|
|
@ -1 +0,0 @@
|
||||||
node_modules
|
|
||||||
24
.gitignore
vendored
24
.gitignore
vendored
|
|
@ -1,16 +1,14 @@
|
||||||
# Misc
|
# Node modules
|
||||||
*.log
|
|
||||||
npm-debug.*
|
|
||||||
*.scssc
|
|
||||||
*.log
|
|
||||||
*.swp
|
|
||||||
.DS_Store
|
|
||||||
Thumbs.db
|
|
||||||
.sass-cache
|
|
||||||
.env
|
|
||||||
.cache
|
|
||||||
|
|
||||||
# Node modules and output
|
|
||||||
node_modules
|
node_modules
|
||||||
|
|
||||||
|
# generated files
|
||||||
dist
|
dist
|
||||||
src/_includes/css
|
src/_includes/css
|
||||||
|
src/_includes/scripts
|
||||||
|
|
||||||
|
# cache
|
||||||
|
.cache
|
||||||
|
|
||||||
|
# secret data
|
||||||
|
.env
|
||||||
|
|
||||||
|
|
|
||||||
9
config/events/before.js
Normal file
9
config/events/before.js
Normal file
|
|
@ -0,0 +1,9 @@
|
||||||
|
var fs = require('fs');
|
||||||
|
|
||||||
|
module.exports = eleventyConfig => {
|
||||||
|
eleventyConfig.on('eleventy.before', async () => {
|
||||||
|
fs.copyFile('src/assets/scripts/app.js', 'src/_includes/app-min.js', err => {
|
||||||
|
if (err) throw err;
|
||||||
|
});
|
||||||
|
});
|
||||||
|
};
|
||||||
|
|
@ -48,6 +48,29 @@ const formatDate = (date, format) => dayjs(date).format(format);
|
||||||
|
|
||||||
const minifyCss = code => new CleanCSS({}).minify(code).styles;
|
const minifyCss = code => new CleanCSS({}).minify(code).styles;
|
||||||
|
|
||||||
|
const minifyJs = async (code, ...rest) => {
|
||||||
|
const callback = rest.pop();
|
||||||
|
const cacheKey = rest.length > 0 ? rest[0] : null;
|
||||||
|
|
||||||
|
try {
|
||||||
|
if (cacheKey && jsminCache.hasOwnProperty(cacheKey)) {
|
||||||
|
const cacheValue = await Promise.resolve(jsminCache[cacheKey]); // Wait for the data, wrapped in a resolved promise in case the original value already was resolved
|
||||||
|
callback(null, cacheValue.code); // Access the code property of the cached value
|
||||||
|
} else {
|
||||||
|
const minified = esbuild.transform(code, {
|
||||||
|
minify: true
|
||||||
|
});
|
||||||
|
if (cacheKey) {
|
||||||
|
jsminCache[cacheKey] = minified; // Store the promise which has the minified output (an object with a code property)
|
||||||
|
}
|
||||||
|
callback(null, (await minified).code); // Await and use the return value in the callback
|
||||||
|
}
|
||||||
|
} catch (err) {
|
||||||
|
console.error('jsmin error: ', err);
|
||||||
|
callback(null, code); // Fail gracefully.
|
||||||
|
}
|
||||||
|
};
|
||||||
|
|
||||||
/**
|
/**
|
||||||
* Render content as inline markdown if single line, or full
|
* Render content as inline markdown if single line, or full
|
||||||
* markdown if multiline. for md in yaml
|
* markdown if multiline. for md in yaml
|
||||||
|
|
@ -85,5 +108,6 @@ module.exports = {
|
||||||
toAbsoluteUrl,
|
toAbsoluteUrl,
|
||||||
stripHtml,
|
stripHtml,
|
||||||
minifyCss,
|
minifyCss,
|
||||||
|
minifyJs,
|
||||||
mdInline
|
mdInline
|
||||||
};
|
};
|
||||||
|
|
|
||||||
17
config/shortcodes/includeRaw/index.js
Normal file
17
config/shortcodes/includeRaw/index.js
Normal file
|
|
@ -0,0 +1,17 @@
|
||||||
|
// Because Nunjucks's include doesn't like CSS with "{#". Source: https://github.com/nhoizey/pack11ty/blob/781248b92480701208f69e2161165e58d79a23ee/src/_11ty/shortcodes/include_raw.js
|
||||||
|
|
||||||
|
const fs = require('fs');
|
||||||
|
|
||||||
|
let memoizedIncludes = {};
|
||||||
|
|
||||||
|
const includeRaw = file => {
|
||||||
|
if (file in memoizedIncludes) {
|
||||||
|
return memoizedIncludes[file];
|
||||||
|
} else {
|
||||||
|
let content = fs.readFileSync(file, 'utf8');
|
||||||
|
memoizedIncludes[file] = content;
|
||||||
|
return content;
|
||||||
|
}
|
||||||
|
};
|
||||||
|
|
||||||
|
module.exports = includeRaw;
|
||||||
|
|
@ -1,6 +1,8 @@
|
||||||
const imageShortcodePlaceholder = require('./imagePlaceholder');
|
const imageShortcodePlaceholder = require('./imagePlaceholder');
|
||||||
|
const includeRaw = require('./includeRaw');
|
||||||
const liteYoutube = require('./youtube-lite');
|
const liteYoutube = require('./youtube-lite');
|
||||||
module.exports = {
|
module.exports = {
|
||||||
imageShortcodePlaceholder,
|
imageShortcodePlaceholder,
|
||||||
|
includeRaw,
|
||||||
liteYoutube
|
liteYoutube
|
||||||
};
|
};
|
||||||
|
|
|
||||||
4
package-lock.json
generated
4
package-lock.json
generated
|
|
@ -1,12 +1,12 @@
|
||||||
{
|
{
|
||||||
"name": "eleventy-excellent",
|
"name": "eleventy-excellent",
|
||||||
"version": "1.1.7",
|
"version": "1.2.0",
|
||||||
"lockfileVersion": 2,
|
"lockfileVersion": 2,
|
||||||
"requires": true,
|
"requires": true,
|
||||||
"packages": {
|
"packages": {
|
||||||
"": {
|
"": {
|
||||||
"name": "eleventy-excellent",
|
"name": "eleventy-excellent",
|
||||||
"version": "1.1.7",
|
"version": "1.2.0",
|
||||||
"license": "ISC",
|
"license": "ISC",
|
||||||
"dependencies": {
|
"dependencies": {
|
||||||
"@11ty/eleventy": "^2.0.0-canary.23",
|
"@11ty/eleventy": "^2.0.0-canary.23",
|
||||||
|
|
|
||||||
|
|
@ -1,8 +0,0 @@
|
||||||
module.exports = {
|
|
||||||
plugins: [
|
|
||||||
require('postcss-import-ext-glob'),
|
|
||||||
require('postcss-import'),
|
|
||||||
require('tailwindcss'),
|
|
||||||
require('cssnano')
|
|
||||||
]
|
|
||||||
};
|
|
||||||
|
|
@ -58,7 +58,7 @@
|
||||||
{% endif %}
|
{% endif %}
|
||||||
|
|
||||||
<!-- defered js -->
|
<!-- defered js -->
|
||||||
<script type="module" src="/assets/scripts/app.js" defer></script>
|
<script type="module" src="/assets/scripts/app.js?{{ assetHash }}" defer></script>
|
||||||
|
|
||||||
<!-- everything else: meta tags, icons, open graph etc. -->
|
<!-- everything else: meta tags, icons, open graph etc. -->
|
||||||
{% include "partials/meta-info.njk" %}
|
{% include "partials/meta-info.njk" %}
|
||||||
|
|
|
||||||
|
|
@ -1,36 +1,4 @@
|
||||||
// ------------------- cards redundant click, accessible whole card clickable solution by Heydon Pickering
|
// ------------------- responsive accessible nav by Manuel Matuzović: https://web.dev/website-navigation/
|
||||||
|
|
||||||
// const cards = [...document.querySelectorAll('.card')];
|
|
||||||
// cards.forEach(card => {
|
|
||||||
// card.style.cursor = 'pointer';
|
|
||||||
// let down,
|
|
||||||
// up,
|
|
||||||
// link = card.querySelector('a');
|
|
||||||
// card.onmousedown = () => (down = +new Date());
|
|
||||||
// card.onmouseup = () => {
|
|
||||||
// up = +new Date();
|
|
||||||
// if (up - down < 200) {
|
|
||||||
// link.click();
|
|
||||||
// }
|
|
||||||
// };
|
|
||||||
// });
|
|
||||||
|
|
||||||
const cards = document.querySelectorAll('.card');
|
|
||||||
Array.prototype.forEach.call(cards, card => {
|
|
||||||
let down,
|
|
||||||
up,
|
|
||||||
link = card.querySelector(':is(h1, h2, h3, h4, h5, h6) a');
|
|
||||||
card.style.cursor = 'pointer';
|
|
||||||
card.onmousedown = () => (down = +new Date());
|
|
||||||
card.onmouseup = () => {
|
|
||||||
up = +new Date();
|
|
||||||
if (up - down < 200) {
|
|
||||||
link.click();
|
|
||||||
}
|
|
||||||
};
|
|
||||||
});
|
|
||||||
|
|
||||||
// ------------------- responsive accessible nav
|
|
||||||
|
|
||||||
const nav = document.querySelector('nav');
|
const nav = document.querySelector('nav');
|
||||||
const list = nav.querySelector('ul');
|
const list = nav.querySelector('ul');
|
||||||
|
|
@ -65,3 +33,20 @@ document.addEventListener('click', e => {
|
||||||
});
|
});
|
||||||
|
|
||||||
nav.insertBefore(burgerClone, list);
|
nav.insertBefore(burgerClone, list);
|
||||||
|
|
||||||
|
// ------------------- accessible clickable cards solution by Heydon Pickering: https://inclusive-components.design/cards/
|
||||||
|
|
||||||
|
const cards = [...document.querySelectorAll('.card')];
|
||||||
|
cards.forEach(card => {
|
||||||
|
card.style.cursor = 'pointer';
|
||||||
|
let down,
|
||||||
|
up,
|
||||||
|
link = card.querySelector('a');
|
||||||
|
card.onmousedown = () => (down = +new Date());
|
||||||
|
card.onmouseup = () => {
|
||||||
|
up = +new Date();
|
||||||
|
if (up - down < 200) {
|
||||||
|
link.click();
|
||||||
|
}
|
||||||
|
};
|
||||||
|
});
|
||||||
|
|
|
||||||
|
|
@ -6,9 +6,9 @@ layout: page
|
||||||
youtube: true
|
youtube: true
|
||||||
---
|
---
|
||||||
|
|
||||||
Based on the companion website of Andy Bell's talk 'Be the browser’s mentor, not its micromanager'. It takes over the core functionality, which is using Tailwind CSS to generate CSS variables based on design tokens.
|
Based on the [companion website](https://buildexcellentwebsit.es/) of Andy Bell's talk 'Be the browser’s mentor, not its micromanager'. It takes over a core functionality: Using Tailwind CSS to generate CSS variables based on design tokens.
|
||||||
|
|
||||||
Just like the original and role model, this starter uses modern CSS, fluid type & space, flexible Layouts and Progressive Enhancement, wrapped in a basic template, ideal for personal websites and other small projects.
|
Like buildexcellentwebsit.es, this starter uses modern CSS, fluid type & space, flexible Layouts and Progressive Enhancement, wrapped in a basic template, ideal for personal websites and other small projects.
|
||||||
|
|
||||||
The aim is to hopefully spread the use of this _excellent_ workflow. To work with it efficiently you should be familiar with [cube.fyi](https://cube.fyi/), [utopia.fyi](https://utopia.fyi/) and [every-layout.dev](https://every-layout.dev/).
|
The aim is to hopefully spread the use of this _excellent_ workflow. To work with it efficiently you should be familiar with [cube.fyi](https://cube.fyi/), [utopia.fyi](https://utopia.fyi/) and [every-layout.dev](https://every-layout.dev/).
|
||||||
|
|
||||||
|
|
@ -19,4 +19,4 @@ Edit your preferences (colors, fonts, fluid text sizes etc.) in `src/assets/css/
|
||||||
|
|
||||||
## Watch the talk
|
## Watch the talk
|
||||||
|
|
||||||
{% youtube '5uhIiI9Ld5M', 'Andy Bell – Be the browser’s mentor, not its micromanager' %}
|
{% youtube 'JqnMI1AXl6w', 'Andy Bell – Be the browser’s mentor, not its micromanager' %}
|
||||||
|
|
|
||||||
Loading…
Reference in a new issue