From 183da75d41bda06e10cf9f793b0a33bafdafec60 Mon Sep 17 00:00:00 2001 From: Kevin Bridges Date: Wed, 17 Mar 2021 08:48:38 -0500 Subject: [PATCH 01/12] prelimininary library deployment setup --- .gitignore | 4 ++-- TOOLING.md | 13 ++++++++----- babel.config.js | 1 - package.json | 20 ++++++++++++++++++-- 4 files changed, 28 insertions(+), 10 deletions(-) diff --git a/.gitignore b/.gitignore index e2e6293..c99efac 100644 --- a/.gitignore +++ b/.gitignore @@ -4,8 +4,8 @@ # not really interested in package-lock.json in repo /package-lock.json -# ?? REFINE LATER -# bundled distribution (generated via "npm run build") +# bundled NPM distribution (generated via "npm run lib:build") +# ... currently only using /lib/ /dist/ /lib/ /es/ diff --git a/TOOLING.md b/TOOLING.md index d04a0dd..ef55f31 100644 --- a/TOOLING.md +++ b/TOOLING.md @@ -118,7 +118,8 @@ tw-themes/ .git/ ................ our local git repo .gitignore ........... git repo exclusions (typically machine generated) _book/ ............... machine generated docs (output of GitBook) see: "Setup Docs Tooling" - babel.config.js ...... babel configuration used by jest see: "Setup Unit Testing" + babel.config.js ...... babel configuration used by jest (see: "Setup Unit Testing") + and library build (see: "Setup Library Deployment") book.json ............ GitBook configuration see: "Setup Docs Tooling" docs/ ................ master source of GitBook project docs see: "Setup Docs Tooling" *.md ............... various Markdown files making up our docs @@ -363,15 +364,17 @@ At the end of this process you should have: - Impacted Files: ``` tw-themes/ - babel.config.js ...... babel configuration used by jest [see: "Setup Unit Testing") - jest.config.js ....... jest unit testing configuration [see: "Setup Unit Testing") + babel.config.js + jest.config.js ``` **Installation Details**: -**NOTE**: Jest requires babel (installed here) +- Install required dependencies (Jest and Babel). + + NOTE: Some of these dependencies overlap with other setup (ex: + "Setup Unit Testing"). Install what is missing. -- Install required dependencies (Jest and Babel): ``` $ npm install --save-dev @babel/core @babel/preset-env jest babel-jest + babel-jest@26.6.3 diff --git a/babel.config.js b/babel.config.js index f5a0a13..223b8fe 100644 --- a/babel.config.js +++ b/babel.config.js @@ -1,4 +1,3 @@ -// babel needed for jest unit tests :-( module.exports = { presets: [ [ diff --git a/package.json b/package.json index b7241d0..ebdf152 100644 --- a/package.json +++ b/package.json @@ -7,6 +7,9 @@ "type": "git", "url": "https://github.com/KevinAst/tw-themes.git" }, + "bugs": { + "url": "https://github.com/KevinAst/tw-themes/issues" + }, "keywords": [ "tailwind", "themes", @@ -21,17 +24,30 @@ ], "author": "Kevin J. Bridges (https://github.com/KevinAst)", "license": "MIT", + "main": "lib/index.js", + "files": [ + "package.json", + "LICENSE.md", + "README.md", + "lib", + "src" + ], "scripts": { "docs:build": "gitbook build", "docs:serve": "gitbook serve", - "predocs:publish": "npm run docs:build", "docs:publish": "gh-pages --dist _book", "docs:gitbook:help": "gitbook help", "docs:clean": "rimraf _book", + "predocs:publish": "npm run docs:build", "test": "jest src", - "test:watch": "npm run test -- --watch" + "test:watch": "npm run test -- --watch", + "lib:build": "babel src --out-dir lib", + "lib:clean": "rimraf lib", + "prelib:build": "npm run test", + "prepare": "npm run lib:build" }, "devDependencies": { + "@babel/cli": "^7.13.10", "@babel/core": "^7.13.10", "@babel/preset-env": "^7.13.10", "babel-jest": "^26.6.3", From 2831007a969a50dc039c7d0dd9822a8e967ac20f Mon Sep 17 00:00:00 2001 From: Kevin Bridges Date: Wed, 17 Mar 2021 09:26:10 -0500 Subject: [PATCH 02/12] tweak library deployment setup --- .npmignore | 2 ++ package.json | 2 +- 2 files changed, 3 insertions(+), 1 deletion(-) create mode 100644 .npmignore diff --git a/.npmignore b/.npmignore new file mode 100644 index 0000000..a3a741b --- /dev/null +++ b/.npmignore @@ -0,0 +1,2 @@ +# do NOT publish any spec/ directory (unit tests spread throughout our src/ code base) +spec diff --git a/package.json b/package.json index ebdf152..5dd9f68 100644 --- a/package.json +++ b/package.json @@ -41,7 +41,7 @@ "predocs:publish": "npm run docs:build", "test": "jest src", "test:watch": "npm run test -- --watch", - "lib:build": "babel src --out-dir lib", + "lib:build": "babel src --out-dir lib --no-comments", "lib:clean": "rimraf lib", "prelib:build": "npm run test", "prepare": "npm run lib:build" From ad0a751eb82ac308a35ff29d30111daf97b4831a Mon Sep 17 00:00:00 2001 From: Kevin Bridges Date: Thu, 18 Mar 2021 09:27:43 -0500 Subject: [PATCH 03/12] minor typo --- docs/api/Themes.md | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/docs/api/Themes.md b/docs/api/Themes.md index c8330f4..1b6be47 100644 --- a/docs/api/Themes.md +++ b/docs/api/Themes.md @@ -91,7 +91,7 @@ Themes: { **NOTE:** You typically cannot use CSS color names (ex: `'red'`) because they routinely clash with the **tailwind** color names _(which takes precedence)_. As a result, if you - use specify `'red'` it will be referencing the **tailwind** + specify `'red'` it will be referencing the **tailwind** definition _(not the CSS keyword)_. Most **tailwind** color names are shaded, which may be a source of confusion on some errors you may receive. For example: From f871cecb08735d7c675e5f23174f5157249cae50 Mon Sep 17 00:00:00 2001 From: Kevin Bridges Date: Thu, 18 Mar 2021 10:18:39 -0500 Subject: [PATCH 04/12] prep history.md for next release --- TOOLING.md | 10 +++++----- docs/history.md | 34 +++++++++++++++++++--------------- docs/toc.md | 3 ++- 3 files changed, 26 insertions(+), 21 deletions(-) diff --git a/TOOLING.md b/TOOLING.md index ef55f31..09ca8d5 100644 --- a/TOOLING.md +++ b/TOOLING.md @@ -14,7 +14,7 @@ development of the **tw-themes** project. - [Setup Unit Testing] - [Setup Docs Tooling] - [Setup js.org sub-domain] - - [Setup Library Deployment] + - [Setup Lib Deployment] @@ -119,7 +119,7 @@ tw-themes/ .gitignore ........... git repo exclusions (typically machine generated) _book/ ............... machine generated docs (output of GitBook) see: "Setup Docs Tooling" babel.config.js ...... babel configuration used by jest (see: "Setup Unit Testing") - and library build (see: "Setup Library Deployment") + and library build (see: "Setup Lib Deployment") book.json ............ GitBook configuration see: "Setup Docs Tooling" docs/ ................ master source of GitBook project docs see: "Setup Docs Tooling" *.md ............... various Markdown files making up our docs @@ -158,7 +158,7 @@ were carried out, however in some cases the order can be changed. - [Setup Unit Testing] - [Setup Docs Tooling] - [Setup js.org sub-domain] - - [Setup Library Deployment] + - [Setup Lib Deployment] @@ -859,7 +859,7 @@ KJB Notes ---> -# Setup Library Deployment +# Setup Lib Deployment This task will setup the basic Node/NPM tooling needed to package/build/deploy the **tw-themes** library. @@ -1139,7 +1139,7 @@ KJB Notes ---> [Setup Unit Testing]: #setup-unit-testing [Setup Docs Tooling]: #setup-docs-tooling [Setup js.org sub-domain]: #setup-jsorg-sub-domain - [Setup Library Deployment]: #setup-library-deployment + [Setup Lib Deployment]: #setup-lib-deployment [js.org]: https://js.org/ [npm]: https://www.npmjs.com/ diff --git a/docs/history.md b/docs/history.md index 9eaecd0..e2b0fc4 100644 --- a/docs/history.md +++ b/docs/history.md @@ -68,21 +68,18 @@ page and contains migration instructions _(as needed)_. ## Summary: -Release | What | *When* -------------------|----------------------------------------|------------------ -[v0.1.0](#v0_1_0) | Initial Release | *March 19, 2021* - +Release | What | *When* +------------------|----------------------|------------------ +[v0.1.1](#v0_1_1) | Finalize Tooling | *March 18, 2021* +[v0.1.0](#v0_1_0) | Initial Release | *March 17, 2021* ## Details: - +1. **Docs**: ?? A "See It Live" section was introduced. + +1. **Docs**: ?? An inproved **tw-themes** logo was introduced. + +1. **Internal**: Project tooling was finalized. + + - The following sections were added to TOOLING.md: + * ?? "Setup Lib Deployment" + * ?? "Deploy Project" + + - ?? Attempt to remove unit tests from deployment bundle + _(by moving `.npmignore` into `src/` directory)_. +

- v0.1.0 - Initial Release (March 19, 2021) + v0.1.0 - Initial Release (March 17, 2021)

[GitHub Release](https://github.com/KevinAst/tw-themes/releases/tag/v0.1.0) diff --git a/docs/toc.md b/docs/toc.md index 8a758fa..e42eb9e 100644 --- a/docs/toc.md +++ b/docs/toc.md @@ -37,5 +37,6 @@ ---- * [Revision History](history.md) - * [v0.1.0 (March 19, 2021)](history.md#v0_1_0) + * [v0.1.1 (March 18, 2021)](history.md#v0_1_1) + * [v0.1.0 (March 17, 2021)](history.md#v0_1_0) * [MIT License](LICENSE.md) From 8e29a5858f5179c6b1a098f497e9b2ec114f473f Mon Sep 17 00:00:00 2001 From: Kevin Bridges Date: Thu, 18 Mar 2021 11:14:33 -0500 Subject: [PATCH 05/12] update TOOLING with work-around for docs:server script --- TOOLING.md | 33 ++++++++++++++++++++++----------- 1 file changed, 22 insertions(+), 11 deletions(-) diff --git a/TOOLING.md b/TOOLING.md index 09ca8d5..0e42eae 100644 --- a/TOOLING.md +++ b/TOOLING.md @@ -27,10 +27,14 @@ _(organized by task)_: ``` DEVELOPMENT =========== +JS: test:watch ..... run test suite, continuously watching for module changes -docs:serve ..... launch documentation server, continuously watching for docs changes - NOTE: adding `--log=debug --debug` to this npm script CAN BE USEFUL +DOCS: +docs:build ... manually build the docs (into the _book/ dir) + 1. start an internal web server pointing to _book/ dir + 2. manually re-execute docs:build whenever docs/ change + TESTING ======= @@ -40,20 +44,27 @@ test:watch ..... run test suite, continuously watching for module changes DOCS NOTE: we PUBLISH our docs ==== -docs:serve ..... launch docs server, continuously watching for docs changes - NOTE: adding `--log=debug --debug` to this npm script CAN BE USEFUL - +docs:build ... manually build the docs (into the _book/ dir) + - NOTE: this build is executed as the first step in docs:publish + - FOR DOCS DEVELOPMENT: + 1. start an internal web server pointing to _book/ dir + 2. manually re-execute docs:build whenever docs/ change + - this is MUCH PREFERRED over docs:serve + * it is MUCH FASTER! + * docs:serve is very antiquated (a dead project) + * it is extremely slow + * it constantly stops when any file changes + docs:publish ... publish the latest docs to https://tw-themes.js.org/ NOTE: this script FIRST builds the docs from scratch ... via predocs:publish - >>> OPTIONALLY: -docs:build ... you can manually build the docs (into the _book/ dir) - HOWEVER it is not typically necessary - BECAUSE this build is executed as the first step in docs:publish - docs:clean ... clean all machine-generated docs directories + >>> ANTIQUATED (see notes on docs:build) +docs:serve ..... launch docs server, continuously watching for docs changes + NOTE: adding `--log=debug --debug` to this npm script CAN BE USEFUL + BUNDLE/DEPLOY NOTE: we DEPLOY our bundled library to NPM ============= @@ -870,7 +881,7 @@ At the end of this process you should have: - ?? more -??$$ retrofit +?? retrofit NOPE: **tw-themes** app is deployed on [GitHub Pages] <<< NOT From 2e9c9bdca954283991273362f170f80c7e701b9b Mon Sep 17 00:00:00 2001 From: Kevin Bridges Date: Thu, 18 Mar 2021 11:25:16 -0500 Subject: [PATCH 06/12] minor tweaks --- docs/history.md | 6 ++++-- 1 file changed, 4 insertions(+), 2 deletions(-) diff --git a/docs/history.md b/docs/history.md index e2b0fc4..b0d5f94 100644 --- a/docs/history.md +++ b/docs/history.md @@ -92,7 +92,7 @@ Release | What | *When* 1. **Docs**: ?? A "See It Live" section was introduced. -1. **Docs**: ?? An inproved **tw-themes** logo was introduced. +1. **Docs**: ?? An improved **tw-themes** logo was introduced. 1. **Internal**: Project tooling was finalized. @@ -100,7 +100,9 @@ Release | What | *When* * ?? "Setup Lib Deployment" * ?? "Deploy Project" - - ?? Attempt to remove unit tests from deployment bundle + - Devised a MUCH IMPROVED work-around for the docs:server npm script. + + - ?? Remove unit test modules from deployment bundle _(by moving `.npmignore` into `src/` directory)_. From b321b76d664467c2379866e8686b64bfdde84ff0 Mon Sep 17 00:00:00 2001 From: Kevin Bridges Date: Thu, 18 Mar 2021 13:29:39 -0500 Subject: [PATCH 07/12] add "Setup Lib Packaging" TOOLING section --- TOOLING.md | 401 +++++++++++++---------------------- .npmignore => src/.npmignore | 0 2 files changed, 144 insertions(+), 257 deletions(-) rename .npmignore => src/.npmignore (100%) diff --git a/TOOLING.md b/TOOLING.md index 0e42eae..7788307 100644 --- a/TOOLING.md +++ b/TOOLING.md @@ -14,7 +14,7 @@ development of the **tw-themes** project. - [Setup Unit Testing] - [Setup Docs Tooling] - [Setup js.org sub-domain] - - [Setup Lib Deployment] + - [Setup Lib Packaging] @@ -59,7 +59,7 @@ docs:publish ... publish the latest docs to https://tw-themes.js.org/ NOTE: this script FIRST builds the docs from scratch ... via predocs:publish -docs:clean ... clean all machine-generated docs directories +docs:clean ... clean machine-generated docs/ directory >>> ANTIQUATED (see notes on docs:build) docs:serve ..... launch docs server, continuously watching for docs changes @@ -68,20 +68,22 @@ docs:serve ..... launch docs server, continuously watching for docs changes BUNDLE/DEPLOY NOTE: we DEPLOY our bundled library to NPM ============= -lib:deploy ..... AI: ?? deploy latest library to NPM - NOTE: This script FIRST builds the app from scratch - ... via prelib:deploy +lib:build ...... build library bundle in lib/ directory + NOTE: This script FIRST insures all unit tests pass + ... via prelib:build -lib:prodBuild .. AI: ?? build production bundle (to: public/build) - NOTE: This is implicitly invoked from lib:deploy +lib:clean ...... clean machine-generated lib/ directory - -lib:clean ...... AI: ?? clean all machine-generated app/build directories + NOTE: to deploy libary: + $ npm publish + ... will auto build lib/ directory + via: "prepare": "npm run lib:build" + ... and deploy to NPM MISC ==== -clean .......... AI: ?? cleans ALL machine-generated directories +clean .......... AI: cleans ALL machine-generated directories ``` @@ -106,15 +108,16 @@ looking at `package.json`, the inevitable questions are: The following table itemizes the **tw-themes** dependencies, referencing when/where they were introduced/configured. -Dependency | Type | Usage | Refer To ---------------------------------- | ----------- | ------------------------- | ---------------- -`@babel/core` | **TOOLING** | Jest Testing related | [Setup Unit Testing] -`@babel/preset-env` | **TOOLING** | Jest Testing related | [Setup Unit Testing] -`babel-jest` | **TOOLING** | Jest Testing related | [Setup Unit Testing] -`gh-pages` | **TOOLING** | Docs Deployment | [Setup Docs Tooling] -`gitbook-cli` | **TOOLING** | Docs Generation | [Setup Docs Tooling] -`jest` | **TOOLING** | Jest Testing Framework | [Setup Unit Testing] -`rimraf` | **TOOLING** | Various NPM Clean Scripts | [Setup Docs Tooling] +Dependency | Type | Usage | Refer To +--------------------------------- | ----------- | ------------------------------ | ---------------- +`@babel/cli` | **TOOLING** | Lib Packaging | [Setup Lib Packaging] +`@babel/core` | **TOOLING** | Lib Packaging
Jest Testing | [Setup Lib Packaging]
[Setup Unit Testing] +`@babel/preset-env` | **TOOLING** | Lib Packaging
Jest Testing | [Setup Lib Packaging]
[Setup Unit Testing] +`babel-jest` | **TOOLING** | Jest Testing | [Setup Unit Testing] +`gh-pages` | **TOOLING** | Docs Deployment | [Setup Docs Tooling] +`gitbook-cli` | **TOOLING** | Docs Generation | [Setup Docs Tooling] +`jest` | **TOOLING** | Jest Testing Framework | [Setup Unit Testing] +`rimraf` | **TOOLING** | Various NPM Clean Scripts | [Setup Docs Tooling] `tailwindcss` | **TOOLING**
**APP** | our peerDependency
(what tw-themes is built on) | [Initialize NPM Project]
and app code: `src/...` @@ -129,8 +132,9 @@ tw-themes/ .git/ ................ our local git repo .gitignore ........... git repo exclusions (typically machine generated) _book/ ............... machine generated docs (output of GitBook) see: "Setup Docs Tooling" - babel.config.js ...... babel configuration used by jest (see: "Setup Unit Testing") - and library build (see: "Setup Lib Deployment") + babel.config.js ...... babel configuration used by: + - library packaging (see: "Setup Lib Packaging") + - jest (see: "Setup Unit Testing") book.json ............ GitBook configuration see: "Setup Docs Tooling" docs/ ................ master source of GitBook project docs see: "Setup Docs Tooling" *.md ............... various Markdown files making up our docs @@ -169,7 +173,7 @@ were carried out, however in some cases the order can be changed. - [Setup Unit Testing] - [Setup Docs Tooling] - [Setup js.org sub-domain] - - [Setup Lib Deployment] + - [Setup Lib Packaging] @@ -383,8 +387,8 @@ At the end of this process you should have: - Install required dependencies (Jest and Babel). - NOTE: Some of these dependencies overlap with other setup (ex: - "Setup Unit Testing"). Install what is missing. + **NOTE**: Some of these dependencies overlap with other setup (Install + only what is missing): ``` $ npm install --save-dev @babel/core @babel/preset-env jest babel-jest @@ -870,270 +874,154 @@ KJB Notes ---> -# Setup Lib Deployment - -This task will setup the basic Node/NPM tooling needed to -package/build/deploy the **tw-themes** library. - -At the end of this process you should have: - -- The tooling needed to build/deploy the **tw-themes** utility. +# Setup Lib Packaging -- ?? more +This task will setup the tooling needed to package and deploy the +**tw-themes** library to NPM. -?? retrofit +Currently we use a very simple packaging process that employs babel +only. In other words, no bundler is used _(such as webpack or +rollup)_. -NOPE: **tw-themes** app is deployed on [GitHub Pages] <<< NOT +**Links**: [How to publish a npm package?](https://www.robinwieruch.de/publish-npm-package-node) At the end of this process you should have: -- ?? retrofit +- The ability to deploy the **tw-themes** library to NPM. -- The ability to deploy the demo app (to github pages) +- Impacted Dependencies: ``` - $ npm run lib:deploy + @babel/cli + @babel/core + @babel/preset-env ``` -- Impacted Dependencies: +- Impacted Files: ``` - gh-pages + tw-themes/ + .gitignore + package.json + babel.config.js ``` -- Impacted Scripts: +**Installation Details**: + +- Install required dependencies (Babel). + + **NOTE**: Some of these dependencies overlap with other setup (Install + only what is missing): + ``` - lib:deploy + $ npm install --save-dev @babel/core @babel/preset-env @babel/cli ``` -**Relative App Resources** +- modify `package.json` with deployment-specific fields: -Because our app is deployed to a sub-directory of github pages, all -startup html resource references should be relative. Simply change -`public/index.html` as follows: + **package.json** _(leave comments out)_: + ```js + { + "name": "tw-themes", // the name of the npm package + "version": "0.1.0", // the npm package version + + // referenced in npm registry + "description": "powerful tailwind color themes (dynamically selectable at run-time)", + "homepage": "https://tw-themes.js.org/", + "repository": { + "type": "git", + "url": "https://github.com/KevinAst/tw-themes.git" + }, + "bugs": { + "url": "https://github.com/KevinAst/tw-themes/issues" + }, + "keywords": [ + "tailwind", + "themes", + "theme", + "dark", + "dark-mode", + "colors", + "web", + "utility", + "geeku", + "astx" + ], + "author": "Kevin J. Bridges (https://github.com/KevinAst)", + "license": "MIT", + + "main": "lib/index.js", // references the generated library bundle + + "files": [ // resources to include in the NPM package + "package.json", + "LICENSE.md", + "README.md", + "lib", + "src" + ], -```diff -public/index.html -================= -- -+ + ... snip snip + } + ``` -- -+ +- Configure Babel: -- -+ + **babel.config.js**: + ```js + module.exports = { + presets: [ + "@babel/preset-env" + ] + } + ``` -- -+ -``` +- define a `src/.npmignore` to omit modules that should NOT + be included in the bundle (ex: unit tests): -**Add `lib:deploy` Script** + **src/.npmignore** + ``` + # do NOT publish any spec/ directory (unit tests spread throughout our src/ code base) + spec + ``` -Add the following scripts to `package.json`: +- Setup the **lib: NPM Scripts**: -``` -package.json -============ -{ - ... - "scripts": { - "prelib:deploy": "npm run lib:prodBuild", - "lib:deploy": "gh-pages --dist public --dest app", - ... snip snip - } -} -``` + **package.json** _(leave comments out)_: + ```js + { + ... + "scripts": { + ... -**Add `docs:publish` Script** ?? AI + "lib:build": "babel src --out-dir lib --no-comments", + "prelib:build": "npm run test", // don't build unless unit tests are OK + "lib:clean": "rimraf lib" - @@ -1150,8 +1038,7 @@ KJB Notes ---> [Setup Unit Testing]: #setup-unit-testing [Setup Docs Tooling]: #setup-docs-tooling [Setup js.org sub-domain]: #setup-jsorg-sub-domain - [Setup Lib Deployment]: #setup-lib-deployment - + [Setup Lib Packaging]: #setup-lib-packaging [js.org]: https://js.org/ [npm]: https://www.npmjs.com/ [Svelte]: https://svelte.dev/ diff --git a/.npmignore b/src/.npmignore similarity index 100% rename from .npmignore rename to src/.npmignore From 3e67cff595c32a254582b83c8669f87f95e826a2 Mon Sep 17 00:00:00 2001 From: Kevin Bridges Date: Thu, 18 Mar 2021 14:09:48 -0500 Subject: [PATCH 08/12] add "Deploy Project" TOOLING section --- TOOLING.md | 104 ++++++++++++++++++++++++++++++++++++++++++++++++++++- 1 file changed, 103 insertions(+), 1 deletion(-) diff --git a/TOOLING.md b/TOOLING.md index 7788307..91770ec 100644 --- a/TOOLING.md +++ b/TOOLING.md @@ -15,6 +15,8 @@ development of the **tw-themes** project. - [Setup Docs Tooling] - [Setup js.org sub-domain] - [Setup Lib Packaging] +- [Deploy Project] +- [Setup New Feature Branch] @@ -74,7 +76,7 @@ lib:build ...... build library bundle in lib/ directory lib:clean ...... clean machine-generated lib/ directory - NOTE: to deploy libary: + NOTE: to deploy library: $ npm publish ... will auto build lib/ directory via: "prepare": "npm run lib:build" @@ -1024,6 +1026,103 @@ At the end of this process you should have: + +# Deploy Project + +This section chronicles the steps in deploying **tw-themes** to NPM. + +**Feature Branch**: + +Typically all development is done in a **feature branch**. If you are +about to deploy, presumably your branch is complete and documented. + +1. insure all tests are operational + + ``` + $ npm run test + ``` + +2. finalize version -and- history notes: + + - for the new version, use [semantic standards](http://semver.org/) + + - update version in: + * `package.json` + * `docs/toc.md` (version is referenced at top) + * `docs/history.md` (within the "running" notes) + + - review/finalize all documentation impacted by change + + - optionally: save a neutral version of change history comments (to use in git tagging) + * pull from history.md _(normalizing any reference links)_ + * ALTERNATE: simply reference the documentation history section (in the git tag) + + EX: https://tw-themes.js.org/history.html#v0_1_0 + +**main Branch**: + +1. issue PR (pull request) and merge to main branch + +2. sync main to local machine (where the deployment will occur) + +3. verify version is correct in: + * `package.json` + * `docs/toc.md` + * `docs/history.md` + +4. now, everything should be checked in to main and ready to publish + +5. tag the release (in github) + +6. publish **tw-themes** to npm **_(THIS IS IT!)_**: + + ``` + $ npm publish + + tw-themes@v.v.v + ``` + + verify publish was successful + - receive email from npm + - npm package: https://www.npmjs.com/package/tw-themes + - unpkg.com: https://unpkg.com/tw-themes/ + +7. publish **tw-themes** documentation: + + ``` + $ npm run docs:publish + ``` + + verify publish docs was successful + - https://tw-themes.js.org/ + * see new version + * see correct history + +8. optionally test the new package in an external project (by installing it) + + + +# Setup New Feature Branch + +This section documents the steps to setup a new **feature branch** +(where all development is typically done): + +1. create a new branch (typically spawned from the "main" branch). + + **EX**: `next7` + +2. devise "best guess" as to the next version number _(may be + premature, but this can subsequently change)_. + + Reflect this in: + * `package.json` + * `docs/toc.md` (version is referenced at top) + * `docs/history.md` (within the "running" notes) + +3. setup new running Revision History (in `docs/history.md`) + + This provides a place where we can incrementally maintain "running" + revision notes. + @@ -1039,6 +1138,9 @@ At the end of this process you should have: [Setup Docs Tooling]: #setup-docs-tooling [Setup js.org sub-domain]: #setup-jsorg-sub-domain [Setup Lib Packaging]: #setup-lib-packaging +[Deploy Project]: #deploy-project +[Setup New Feature Branch]: #setup-new-feature-branch + [js.org]: https://js.org/ [npm]: https://www.npmjs.com/ [Svelte]: https://svelte.dev/ From 2b1edf1f3843d6d9e3288c63d82567417e6684d1 Mon Sep 17 00:00:00 2001 From: Kevin Bridges Date: Thu, 18 Mar 2021 17:33:39 -0500 Subject: [PATCH 09/12] enhance tw-themes logo --- docs/history.md | 13 +++++++------ docs/img/tw-themes-logo.png | Bin 15565 -> 20320 bytes docs/img/tw-themes.png | Bin 4723 -> 8460 bytes 3 files changed, 7 insertions(+), 6 deletions(-) diff --git a/docs/history.md b/docs/history.md index b0d5f94..ba817d9 100644 --- a/docs/history.md +++ b/docs/history.md @@ -70,7 +70,7 @@ page and contains migration instructions _(as needed)_. Release | What | *When* ------------------|----------------------|------------------ -[v0.1.1](#v0_1_1) | Finalize Tooling | *March 18, 2021* +[v0.1.1](#v0_1_1) | Finalize Tooling | *March 18, 2021* ?? confirm date [v0.1.0](#v0_1_0) | Initial Release | *March 17, 2021* @@ -90,19 +90,20 @@ Release | What | *When* **NOTE**: This release is a **non-breaking change** _(i.e. no API was affected)_. -1. **Docs**: ?? A "See It Live" section was introduced. +1. **Docs**: ?? The "See It Live" section was introduced. ?? LINK -1. **Docs**: ?? An improved **tw-themes** logo was introduced. +1. **Docs**: An improved **tw-themes** logo was introduced. 1. **Internal**: Project tooling was finalized. - The following sections were added to TOOLING.md: - * ?? "Setup Lib Deployment" - * ?? "Deploy Project" + * "Setup Lib Packaging" + * "Deploy Project" + * "Setup New Feature Branch" - Devised a MUCH IMPROVED work-around for the docs:server npm script. - - ?? Remove unit test modules from deployment bundle + - Remove unit test modules from deployment bundle _(by moving `.npmignore` into `src/` directory)_. diff --git a/docs/img/tw-themes-logo.png b/docs/img/tw-themes-logo.png index 09b995acd2371065f9adce9940491f4f8b15871a..a7326797ddd48cf4019f8f39a9fc06514276daa4 100644 GIT binary patch literal 20320 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 OE&xodjFE=k$^QqNw&KwM literal 15565 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 diff --git a/docs/img/tw-themes.png b/docs/img/tw-themes.png index 71dee57cf85c8c6d359690ac8bcd296f49178ae7..ede1a065a45d269a12655a5dddc189c0bd01162b 100644 GIT binary patch literal 8460 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 Date: Fri, 19 Mar 2021 09:16:39 -0500 Subject: [PATCH 10/12] added the "See It Live" section (with demo app in an +

+ +For the purposes of demonstrating **tw-themes**, we are merely focused +on changing the active theme ... _found the upper right dropdown +menu_: + +

+ Theme Selection Dropdown +

+ +You can select your "theme color", and toggle "Dark Mode" +... try it (in the live demo above). + +From a "theme coding" perspective, there are only a few modules of +interest: + +1. {{book.ext.snf_colorTheme_js}} + + This is the primary module that promotes our {{book.api.TwThemes}} + object, through the {{book.api.initTwThemes}} invocation, fusing + the relationship between our {{book.api.Schema}} and + {{book.api.Themes}}. + + - The {{book.api.Schema}} is defined as follows: + + ```js + const schema = [ + 'primaryLight', + 'primary', + 'primaryDark', + + 'secondaryLight', + 'secondary', + 'secondaryDark', + + 'onLight', // typically black + 'onDark', // typically white + + 'accentBorder', // typically a gray tone (e.g. 'coolGray-600') + // ... used for borders in SideBar/NavBar/Menu/Dialog/etc. + + 'backdrop', // universal background + // ... can be a gray tone (e.g. 'coolGray-200') + // ... or lighter primary shade (e.g. `${primary}-100`) + // ... lighter that 'primaryLight' + // providing NOT too much of same color + ]; + ``` + + - Our {{book.api.Themes}} are defined as follows: + + ```js + const themes = { + 'Warm': { contextColors: gen('warmGray', 'amber'), }, + 'Cool': { contextColors: gen('coolGray', 'orange'), }, + 'Mono': { + contextColors: { + ...gen('coolGray', 'red'), // ... base colors + 'primaryLight': 'white', // ... overrides: + 'primaryDark': 'black', + 'backdrop': 'white', + } + }, + 'Amber': { contextColors: gen('amber', 'indigo'), }, + 'Teal': { contextColors: gen('teal', 'rose'), }, + 'Cyan': { contextColors: gen('cyan', 'orange'), }, + 'Indigo': { contextColors: gen('indigo', 'amber'), }, + }; + ``` + + - Notice that we utilize a helper function that generates the + default contextColors _(which can be overridden)_: + + ```js + function gen(primary, secondary) { + return { + 'primaryLight': `${primary}-300`, + 'primary': `${primary}-500`, + 'primaryDark': `${primary}-900`, + + 'secondaryLight': `${secondary}-300`, + 'secondary': `${secondary}-500`, + 'secondaryDark': `${secondary}-900`, + + 'onLight': 'black', + 'onDark': 'white', + + 'accentBorder': 'coolGray-600', + + 'backdrop': `${primary}-100`, // or: 'coolGray-200' + }; + } + ``` + + - Finally, we invoke {{book.api.initTwThemes}} and promote the + {{book.api.TwThemes}} object through an export. + + ```js + const initialThemeName = 'Warm'; // AI: ENHANCE TO pull from local storage + const initialInvertShade = true; // ditto + + const TwThemes = initTwThemes(schema, themes, initialThemeName, initialInvertShade); + export default TwThemes; + ``` + +1. {{book.ext.snf_ThemeSelector_svelte}} + + The `` component is an **extremely simple solution** + to changing the theme. It merely invokes the + {{book.api.activatePriorTheme}} / {{book.api.activateNextTheme}} + functions on the arrow clicks. + + While I don't expect you to be a svelte user, the relevant code + snippets are: + + ```html + + + + + theme = TwThemes.activatePriorTheme()}/> + + {theme} + + theme = TwThemes.activateNextTheme()}/> + + ``` + + **Easy Peasy**! + +1. {{book.ext.snf_ThemeInversionSelector_svelte}} + + The `` component is an **equally simple + solution** to changing the theme's dark mode. + + It merely invokes the {{book.api.toggleInvertShade}} function. + +1. {{book.ext.snf_tailwind_config_js}} + + Of course, we communicate our {{book.guide.contextColors}} to + **tailwind** through `TwThemes`'s {{book.api.colorConfig}} + function: + + **`tailwind.config.js`** + ```js + export default { + ... snip snip + theme: { + extend: { + colors: TwThemes.colorConfig(), + }, + }, + ... snip snip + }; + ``` + +1. Lastly, the **html markup** found throughout the project is + utilizing the context colors defined by our app. + + ```html + + That's All Folks :-) + + ``` diff --git a/docs/start.md b/docs/start.md index 116a1e6..b43f916 100644 --- a/docs/start.md +++ b/docs/start.md @@ -5,12 +5,8 @@ to setup your color themes. This is not so much a reflection of the **tw-themes** utility, but rather the nature of the beast. **tw-themes** itself is easy to use, and _simplifies a number of burdensome details_. -> Want to see **tw-themes** in action? Take a peek at my [Svelte -> Native Forms Demo App](https://svelte-native-forms.js.org/app/) -> _([source -> here](https://github.com/KevinAst/svelte-native-forms/tree/main/src))_. -> The theme selection and dark mode controls are in the top-right -> NavBar drop-down. +> Want to see **tw-themes** in action? ... take a peek at the +> {{book.guide.seeItLive}} section. 1. **First**: You must determine the {{book.guide.contextColors}} that you will use in your application. diff --git a/docs/toc.md b/docs/toc.md index e42eb9e..18b1974 100644 --- a/docs/toc.md +++ b/docs/toc.md @@ -2,10 +2,12 @@ ### tw-themes (0.1.0) * [Install](install.md) -* [Getting Started](start.md) ---- +* [Getting Started](start.md) +* [See It Live](seeItLive.md) +---- * [Concepts](concepts.md) * [Context Colors](concepts/contextColors.md) * [Themes](concepts/themes.md) @@ -39,4 +41,6 @@ * [Revision History](history.md) * [v0.1.1 (March 18, 2021)](history.md#v0_1_1) * [v0.1.0 (March 17, 2021)](history.md#v0_1_0) + +---- * [MIT License](LICENSE.md) From 2eb4b023c0f6b3108be1f10b6914d5ab5f1a6006 Mon Sep 17 00:00:00 2001 From: Kevin Bridges Date: Fri, 19 Mar 2021 09:46:56 -0500 Subject: [PATCH 11/12] minor TOOLING tweaks: README change reminder -and- verify history github tagged links --- TOOLING.md | 4 +++- 1 file changed, 3 insertions(+), 1 deletion(-) diff --git a/TOOLING.md b/TOOLING.md index 91770ec..8318b71 100644 --- a/TOOLING.md +++ b/TOOLING.md @@ -1052,8 +1052,9 @@ about to deploy, presumably your branch is complete and documented. * `docs/history.md` (within the "running" notes) - review/finalize all documentation impacted by change + * also insure README.md does NOT need to change - - optionally: save a neutral version of change history comments (to use in git tagging) + - optionally: save a link-neutral version of change history comments (to use in git tagging) * pull from history.md _(normalizing any reference links)_ * ALTERNATE: simply reference the documentation history section (in the git tag) @@ -1073,6 +1074,7 @@ about to deploy, presumably your branch is complete and documented. 4. now, everything should be checked in to main and ready to publish 5. tag the release (in github) + * verify the history page github links are correct (now that the tag exists) 6. publish **tw-themes** to npm **_(THIS IS IT!)_**: From 07bc12c41d3a94799093d26de196bf0abda4efe9 Mon Sep 17 00:00:00 2001 From: Kevin Bridges Date: Fri, 19 Mar 2021 10:00:35 -0500 Subject: [PATCH 12/12] prep for release - v0.1.1 Finalize Tooling --- docs/history.md | 4 ++-- docs/toc.md | 4 ++-- package.json | 2 +- 3 files changed, 5 insertions(+), 5 deletions(-) diff --git a/docs/history.md b/docs/history.md index d06e89d..cf57d21 100644 --- a/docs/history.md +++ b/docs/history.md @@ -70,7 +70,7 @@ page and contains migration instructions _(as needed)_. Release | What | *When* ------------------|----------------------|------------------ -[v0.1.1](#v0_1_1) | Finalize Tooling | *March 18, 2021* ?? confirm date +[v0.1.1](#v0_1_1) | Finalize Tooling | *March 19, 2021* [v0.1.0](#v0_1_0) | Initial Release | *March 17, 2021* @@ -79,7 +79,7 @@ Release | What | *When*

- v0.1.1 - Finalize Tooling (March 18, 2021) + v0.1.1 - Finalize Tooling (March 19, 2021)

[GitHub Release](https://github.com/KevinAst/tw-themes/releases/tag/v0.1.1) diff --git a/docs/toc.md b/docs/toc.md index 18b1974..d0afbc0 100644 --- a/docs/toc.md +++ b/docs/toc.md @@ -1,6 +1,6 @@ # Table of content -### tw-themes (0.1.0) +### tw-themes (0.1.1) * [Install](install.md) ---- @@ -39,7 +39,7 @@ ---- * [Revision History](history.md) - * [v0.1.1 (March 18, 2021)](history.md#v0_1_1) + * [v0.1.1 (March 19, 2021)](history.md#v0_1_1) * [v0.1.0 (March 17, 2021)](history.md#v0_1_0) ---- diff --git a/package.json b/package.json index 5dd9f68..3be2aab 100644 --- a/package.json +++ b/package.json @@ -1,6 +1,6 @@ { "name": "tw-themes", - "version": "0.1.0", + "version": "0.1.1", "description": "powerful tailwind color themes (dynamically selectable at run-time)", "homepage": "https://tw-themes.js.org/", "repository": {