From 966387b5c70e7df2af24bd58bc1c6202cbc2b130 Mon Sep 17 00:00:00 2001 From: "Felix W. Dekker" Date: Sun, 3 May 2020 00:25:55 +0200 Subject: [PATCH] Include CSS, revamp development structure --- README.md | 32 ++++++++++- package-lock.json | Bin 1608 -> 188582 bytes package.json | 20 +++++-- src/main/css/common.css | 124 ++++++++++++++++++++++++++++++++++++++++ src/main/js/Template.js | 41 +++++++++++-- webpack.config.js | 26 +++++++++ 6 files changed, 232 insertions(+), 11 deletions(-) create mode 100644 src/main/css/common.css create mode 100644 webpack.config.js diff --git a/README.md b/README.md index 0e0901c..c1c225e 100644 --- a/README.md +++ b/README.md @@ -1,2 +1,32 @@ # FWDekker Template -The template used on many pages on fwdekker.com. +The base template for pages on fwdekker.com. + +This module contains templating functions (e.g. `header`, `footer`), CSS libraries, and some common utility methods that +are used on nearly all pages anyway. + + +## Development +### Requirements +* [npm](https://www.npmjs.com/) + +### Setting up +```shell script +# Install dependencies (only needed once) +$> npm ci +``` + +### Building +```shell script +# Build the application in `build/` for development +$> npm run dev +# Build the application in `build/` for deployment +$> npm run deploy +``` + +### Publishing +```shell script +# Log in to npm +$> npm login +# Push to npm +$> npm publish --access public +``` diff --git a/package-lock.json b/package-lock.json index 8d9f95a103927567687db785293c782e113e35b9..0cf07afb514e6efdf23377193dda486b55f0ed2f 100644 GIT binary patch literal 188582 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 d4^kzNAhOL3WWRTrluGk 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 ImaCQv01fLAQ~&?~ diff --git a/package.json b/package.json index 779a6e4..5b619c4 100644 --- a/package.json +++ b/package.json @@ -1,7 +1,7 @@ { "name": "@fwdekker/template", - "version": "0.0.5", - "description": "The template used on many pages on fwdekker.com.", + "version": "0.0.6", + "description": "The base template for pages on fwdekker.com.", "author": "Felix W. Dekker (https://fwdekker.com)", "license": "MIT", "homepage": "https://git.fwdekker.com/FWDekker/fwdekker-template", @@ -12,8 +12,20 @@ "bugs": { "url": "https://git.fwdekker.com/FWDekker/fwdekker-template/issues" }, - "main": "src/main/js/Template.js", + "module": "dist/index.js", + "scripts": { + "dev": "webpack --mode=development", + "deploy": "webpack --mode=production" + }, "dependencies": { - "hyperscript": "^2.0.2" + "hyperscript": "^2.0.2", + "milligram": "^1.3.0", + "normalize.css": "^8.0.1" + }, + "devDependencies": { + "css-loader": "^3.5.3", + "style-loader": "^1.2.1", + "webpack": "^4.42.1", + "webpack-cli": "^3.3.11" } } diff --git a/src/main/css/common.css b/src/main/css/common.css new file mode 100644 index 0000000..35e10e7 --- /dev/null +++ b/src/main/css/common.css @@ -0,0 +1,124 @@ +:root { + --fwdekker-theme-color: #0033cc; +} + +html { + height: 100%; +} + +body { + position: relative; + + padding-top: 5rem; + padding-bottom: 9rem; /* Vertical footer paddings + 1 */ + min-height: 100%; +} + +.footer { + position: absolute; + bottom: 0; + + padding-top: 5rem; + padding-bottom: 3rem; + width: 100%; +} + + +/* Make arrow next to dropdown visible */ +select { + -webkit-appearance: menulist; + -moz-appearance: menulist; + appearance: auto; +} + + +/* Override color scheme */ +/* Replaces #9b4dca with #0033cc */ +.button, +button, +input[type='button'], +input[type='reset'], +input[type='submit'] { + background-color: var(--fwdekker-theme-color); + border: 0.1rem solid var(--fwdekker-theme-color); +} + +.button[disabled]:focus, .button[disabled]:hover, +button[disabled]:focus, +button[disabled]:hover, +input[type='button'][disabled]:focus, +input[type='button'][disabled]:hover, +input[type='reset'][disabled]:focus, +input[type='reset'][disabled]:hover, +input[type='submit'][disabled]:focus, +input[type='submit'][disabled]:hover { + background-color: var(--fwdekker-theme-color); + border-color: var(--fwdekker-theme-color); +} + +.button.button-outline, +button.button-outline, +input[type='button'].button-outline, +input[type='reset'].button-outline, +input[type='submit'].button-outline { + color: var(--fwdekker-theme-color); +} + +.button.button-outline[disabled]:focus, .button.button-outline[disabled]:hover, +button.button-outline[disabled]:focus, +button.button-outline[disabled]:hover, +input[type='button'].button-outline[disabled]:focus, +input[type='button'].button-outline[disabled]:hover, +input[type='reset'].button-outline[disabled]:focus, +input[type='reset'].button-outline[disabled]:hover, +input[type='submit'].button-outline[disabled]:focus, +input[type='submit'].button-outline[disabled]:hover { + color: var(--fwdekker-theme-color); +} + +.button.button-clear, +button.button-clear, +input[type='button'].button-clear, +input[type='reset'].button-clear, +input[type='submit'].button-clear { + color: var(--fwdekker-theme-color); +} + +.button.button-clear[disabled]:focus, .button.button-clear[disabled]:hover, +button.button-clear[disabled]:focus, +button.button-clear[disabled]:hover, +input[type='button'].button-clear[disabled]:focus, +input[type='button'].button-clear[disabled]:hover, +input[type='reset'].button-clear[disabled]:focus, +input[type='reset'].button-clear[disabled]:hover, +input[type='submit'].button-clear[disabled]:focus, +input[type='submit'].button-clear[disabled]:hover { + color: var(--fwdekker-theme-color); +} + +pre { + border-left: 0.3rem solid var(--fwdekker-theme-color); +} + +input[type='email']:focus, +input[type='number']:focus, +input[type='password']:focus, +input[type='search']:focus, +input[type='tel']:focus, +input[type='text']:focus, +input[type='url']:focus, +input[type='color']:focus, +input[type='date']:focus, +input[type='month']:focus, +input[type='week']:focus, +input[type='datetime']:focus, +input[type='datetime-local']:focus, +input:not([type]):focus, +textarea:focus, +select:focus { + border-color: var(--fwdekker-theme-color); +} + +a { + color: var(--fwdekker-theme-color); +} diff --git a/src/main/js/Template.js b/src/main/js/Template.js index df96d75..2148da2 100644 --- a/src/main/js/Template.js +++ b/src/main/js/Template.js @@ -1,4 +1,33 @@ -const h = require("hyperscript"); +import h from "hyperscript"; +import "milligram/dist/milligram.css"; +import "normalize.css/normalize.css"; +import "../css/common.css"; + + +/** + * Alias for `document.querySelector`. + * + * @param q {string} the query string + * @returns {HTMLElement} the element identified by the query string + */ +export const $ = q => document.querySelector(q); + +/** + * Runs the given function once the page is loaded. + * + * This function can be used multiple times. It does not overwrite existing callbacks for the page load event. + * + * @param fun {function(...*): *} the function to run + */ +export const doAfterLoad = function (fun) { + const oldOnLoad = window.onload || (() => { + }); + + window.onload = (() => { + oldOnLoad(); + fun(); + }); +}; /** @@ -8,14 +37,14 @@ const h = require("hyperscript"); * @param description {string} the description to display * @returns {HTMLElement} a header element */ -exports.header = function ({title, description}) { +export const header = function ({title, description}) { return h("header.header", h("section.container", h("h1", title), h("p", h("em", description)) ) ); -} +}; /** * Creates a footer element with the given data. @@ -29,7 +58,7 @@ exports.header = function ({title, description}) { * @param [version] {string} the page version * @returns {HTMLElement} a footer element */ -exports.footer = function ({author, authorURL, license, licenseURL, vcs, vcsURL, version}) { +export const footer = function ({author, authorURL, license, licenseURL, vcs, vcsURL, version}) { return h("footer.footer", h("section.container", footerLink("Made by ", author, authorURL, ". "), @@ -38,7 +67,7 @@ exports.footer = function ({author, authorURL, license, licenseURL, vcs, vcsURL, h("div", version || "", {style: {"float": "right"}}) ) ); -} +}; /** @@ -60,4 +89,4 @@ const footerLink = function (prefix, text, url, suffix) { : h("span", text), h("span", suffix) ); -} +}; diff --git a/webpack.config.js b/webpack.config.js new file mode 100644 index 0000000..ade1ebe --- /dev/null +++ b/webpack.config.js @@ -0,0 +1,26 @@ +const path = require("path"); + +module.exports = { + entry: "./src/main/js/Template.js", + module: { + rules: [ + { + test: /\.js$/i, + exclude: /node_modules/, + }, + { + test: /\.css$/i, + use: ["style-loader", "css-loader"], + }, + ], + }, + resolve: { + extensions: [".js", ".css"], + }, + output: { + library: "fwdekker-template", + libraryTarget: "umd", + filename: "index.js", + path: path.resolve(__dirname, "dist"), + } +};