From 84e895dcccd18011e02f63650e3553068721f9f1 Mon Sep 17 00:00:00 2001 From: dragonwocky Date: Fri, 23 Oct 2020 15:22:13 +1100 Subject: [PATCH 01/10] -n cli option, safer handling of application/removal file manipulation --- CHANGELOG.md | 4 +- README.md | 1 + bin.js | 6 +- package-lock.json | 198 ---------------------------------------------- pkg/apply.js | 37 +++++---- pkg/helpers.md | 20 +++-- pkg/remove.js | 58 ++++---------- 7 files changed, 58 insertions(+), 266 deletions(-) delete mode 100644 package-lock.json diff --git a/CHANGELOG.md b/CHANGELOG.md index 924f74a..ab57058 100644 --- a/CHANGELOG.md +++ b/CHANGELOG.md @@ -22,8 +22,10 @@ a flexibility update. - new: css variables for increasing line spacing/paragraph margins. - new: patch the notion:// url scheme/protocol to work on linux. - new: menu shows theme conflicts + a core mod option to auto-resolve theme conflicts. +- new: a `-n` cli option. - improved: menu will now respect integrated titlebar setting. - improved: use keyup listeners instead of a globalShortcut for the enhancements menu toggle. +- improved: overwrite `app.asar.bak` if already exists (e.g. for app updates). - bugfix: removed messenger emoji set as the provider no longer supports it. - bugfix: remove shadow around light mode board headers \+ minor text colour fixes for night shift theming. @@ -58,8 +60,6 @@ a fork of notion-deb-builder that does generate an app.asar has been created and - bugfix: night shift working on macOS. - bugfix: windows are properly hidden/shown on macOS. - extension: "tweaks" = common style/layout changes. -- new: a `-n` cli option. -- improved: overwrite `app.asar.bak` if already exists. - improved: additionally menu item descriptions on hover. ### v0.9.1 (2020-09-26) diff --git a/README.md b/README.md index 1f1f702..1decf7e 100644 --- a/README.md +++ b/README.md @@ -91,6 +91,7 @@ For more info, run any command with the `--help` flag: Options: -y, --yes : skip prompts (may overwrite data) + -n, --no : skip prompts (may cause failures) -d, --dev : show detailed error messages (not recommended) -h, --help : display usage information -v, --version : display version number diff --git a/bin.js b/bin.js index aab013f..d2ba145 100755 --- a/bin.js +++ b/bin.js @@ -20,6 +20,7 @@ const cli = require('cac')('notion-enhancer'), // ### error ### cli.option('-y, --yes', ': skip prompts (may overwrite data)'); +cli.option('-n, --no', ': skip prompts (may cause failures)'); cli.option('-d, --dev', ': show detailed error messages'); cli @@ -27,7 +28,7 @@ cli .action(async (options) => { console.info('=== NOTION ENHANCEMENT LOG ==='); await require('./pkg/apply.js')({ - overwrite_version: options.yes, + overwrite_version: options.yes ? 'y' : options.no ? 'n' : undefined, friendly_errors: !options.dev, }); console.info('=== END OF LOG ==='); @@ -37,8 +38,7 @@ cli .action(async (options) => { console.info('=== NOTION RESTORATION LOG ==='); await require('./pkg/remove.js')({ - overwrite_asar: options.yes, - delete_data: options.yes, + delete_data: options.yes ? 'y' : options.no ? 'n' : undefined, friendly_errors: !options.dev, }); console.info('=== END OF LOG ==='); diff --git a/package-lock.json b/package-lock.json deleted file mode 100644 index a9ea556..0000000 --- a/package-lock.json +++ /dev/null @@ -1,198 +0,0 @@ -{ - "name": "notion-enhancer", - "version": "0.9.1", - "lockfileVersion": 1, - "requires": true, - "dependencies": { - "@jsdevtools/file-path-filter": { - "version": "3.0.2", - "resolved": "https://registry.npmjs.org/@jsdevtools/file-path-filter/-/file-path-filter-3.0.2.tgz", - "integrity": "sha512-+SbZG6stIE/nRF2PpRnubtuzhh4pouDsk/hEWwM5mKsSKlFfr4ziAE5VMogGG/K++i9NHbUTxxW0y4vdM678ew==", - "requires": { - "glob-to-regexp": "^0.4.1" - } - }, - "@jsdevtools/readdir-enhanced": { - "version": "6.0.4", - "resolved": "https://registry.npmjs.org/@jsdevtools/readdir-enhanced/-/readdir-enhanced-6.0.4.tgz", - "integrity": "sha512-I6D6Omu6C7XWHzvlVbXeCS0FSxYYQ13XzdrFuo1K30unnRSpdt9AxY2KyJZbYJyfI2uNNidqDkG9/K/y699AjA==", - "requires": { - "@jsdevtools/file-path-filter": "^3.0.2" - } - }, - "@types/glob": { - "version": "7.1.3", - "resolved": "https://registry.npmjs.org/@types/glob/-/glob-7.1.3.tgz", - "integrity": "sha512-SEYeGAIQIQX8NN6LDKprLjbrd5dARM5EXsd8GI/A5l0apYI1fGMWgPHSe4ZKL4eozlAyI+doUE9XbYS4xCkQ1w==", - "optional": true, - "requires": { - "@types/minimatch": "*", - "@types/node": "*" - } - }, - "@types/minimatch": { - "version": "3.0.3", - "resolved": "https://registry.npmjs.org/@types/minimatch/-/minimatch-3.0.3.tgz", - "integrity": "sha512-tHq6qdbT9U1IRSGf14CL0pUlULksvY9OZ+5eEgl1N7t+OA3tGvNpxJCzuKQlsNgCVwbAs670L1vcVQi8j9HjnA==", - "optional": true - }, - "@types/node": { - "version": "14.11.2", - "resolved": "https://registry.npmjs.org/@types/node/-/node-14.11.2.tgz", - "integrity": "sha512-jiE3QIxJ8JLNcb1Ps6rDbysDhN4xa8DJJvuC9prr6w+1tIh+QAbYyNF3tyiZNLDBIuBCf4KEcV2UvQm/V60xfA==", - "optional": true - }, - "asar": { - "version": "3.0.3", - "resolved": "https://registry.npmjs.org/asar/-/asar-3.0.3.tgz", - "integrity": "sha512-k7zd+KoR+n8pl71PvgElcoKHrVNiSXtw7odKbyNpmgKe7EGRF9Pnu3uLOukD37EvavKwVFxOUpqXTIZC5B5Pmw==", - "requires": { - "@types/glob": "^7.1.1", - "chromium-pickle-js": "^0.2.0", - "commander": "^5.0.0", - "glob": "^7.1.6", - "minimatch": "^3.0.4" - } - }, - "at-least-node": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/at-least-node/-/at-least-node-1.0.0.tgz", - "integrity": "sha512-+q/t7Ekv1EDY2l6Gda6LLiX14rU9TV20Wa3ofeQmwPFZbOMo9DXrLbOjFaaclkXKWidIaopwAObQDqwWtGUjqg==" - }, - "balanced-match": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/balanced-match/-/balanced-match-1.0.0.tgz", - "integrity": "sha1-ibTRmasr7kneFk6gK4nORi1xt2c=" - }, - "brace-expansion": { - "version": "1.1.11", - "resolved": "https://registry.npmjs.org/brace-expansion/-/brace-expansion-1.1.11.tgz", - "integrity": "sha512-iCuPHDFgrHX7H2vEI/5xpz07zSHB00TpugqhmYtVmMO6518mCuRMoOYFldEBl0g187ufozdaHgWKcYFb61qGiA==", - "requires": { - "balanced-match": "^1.0.0", - "concat-map": "0.0.1" - } - }, - "cac": { - "version": "6.6.1", - "resolved": "https://registry.npmjs.org/cac/-/cac-6.6.1.tgz", - "integrity": "sha512-uhki4T3Ax68hw7Dufi0bATVAF8ayBSwOKUEJHjObPrUN4tlQ8Lf7oljpTje/mArLxYN0D743c2zJt4C1bVTCqg==" - }, - "chromium-pickle-js": { - "version": "0.2.0", - "resolved": "https://registry.npmjs.org/chromium-pickle-js/-/chromium-pickle-js-0.2.0.tgz", - "integrity": "sha1-BKEGZywYsIWrd02YPfo+oTjyIgU=" - }, - "commander": { - "version": "5.1.0", - "resolved": "https://registry.npmjs.org/commander/-/commander-5.1.0.tgz", - "integrity": "sha512-P0CysNDQ7rtVw4QIQtm+MRxV66vKFSvlsQvGYXZWR3qFU0jlMKHZZZgw8e+8DSah4UDKMqnknRDQz+xuQXQ/Zg==" - }, - "concat-map": { - "version": "0.0.1", - "resolved": "https://registry.npmjs.org/concat-map/-/concat-map-0.0.1.tgz", - "integrity": "sha1-2Klr13/Wjfd5OnMDajug1UBdR3s=" - }, - "fs-extra": { - "version": "9.0.1", - "resolved": "https://registry.npmjs.org/fs-extra/-/fs-extra-9.0.1.tgz", - "integrity": "sha512-h2iAoN838FqAFJY2/qVpzFXy+EBxfVE220PalAqQLDVsFOHLJrZvut5puAbCdNv6WJk+B8ihI+k0c7JK5erwqQ==", - "requires": { - "at-least-node": "^1.0.0", - "graceful-fs": "^4.2.0", - "jsonfile": "^6.0.1", - "universalify": "^1.0.0" - } - }, - "fs.realpath": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/fs.realpath/-/fs.realpath-1.0.0.tgz", - "integrity": "sha1-FQStJSMVjKpA20onh8sBQRmU6k8=" - }, - "glob": { - "version": "7.1.6", - "resolved": "https://registry.npmjs.org/glob/-/glob-7.1.6.tgz", - "integrity": "sha512-LwaxwyZ72Lk7vZINtNNrywX0ZuLyStrdDtabefZKAY5ZGJhVtgdznluResxNmPitE0SAO+O26sWTHeKSI2wMBA==", - "requires": { - "fs.realpath": "^1.0.0", - "inflight": "^1.0.4", - "inherits": "2", - "minimatch": "^3.0.4", - "once": "^1.3.0", - "path-is-absolute": "^1.0.0" - } - }, - "glob-to-regexp": { - "version": "0.4.1", - "resolved": "https://registry.npmjs.org/glob-to-regexp/-/glob-to-regexp-0.4.1.tgz", - "integrity": "sha512-lkX1HJXwyMcprw/5YUZc2s7DrpAiHB21/V+E1rHUrVNokkvB6bqMzT0VfV6/86ZNabt1k14YOIaT7nDvOX3Iiw==" - }, - "graceful-fs": { - "version": "4.2.4", - "resolved": "https://registry.npmjs.org/graceful-fs/-/graceful-fs-4.2.4.tgz", - "integrity": "sha512-WjKPNJF79dtJAVniUlGGWHYGz2jWxT6VhN/4m1NdkbZ2nOsEF+cI1Edgql5zCRhs/VsQYRvrXctxktVXZUkixw==" - }, - "inflight": { - "version": "1.0.6", - "resolved": "https://registry.npmjs.org/inflight/-/inflight-1.0.6.tgz", - "integrity": "sha1-Sb1jMdfQLQwJvJEKEHW6gWW1bfk=", - "requires": { - "once": "^1.3.0", - "wrappy": "1" - } - }, - "inherits": { - "version": "2.0.4", - "resolved": "https://registry.npmjs.org/inherits/-/inherits-2.0.4.tgz", - "integrity": "sha512-k/vGaX4/Yla3WzyMCvTQOXYeIHvqOKtnqBduzTHpzpQZzAskKMhZ2K+EnBiSM9zGSoIFeMpXKxa4dYeZIQqewQ==" - }, - "jsonfile": { - "version": "6.0.1", - "resolved": "https://registry.npmjs.org/jsonfile/-/jsonfile-6.0.1.tgz", - "integrity": "sha512-jR2b5v7d2vIOust+w3wtFKZIfpC2pnRmFAhAC/BuweZFQR8qZzxH1OyrQ10HmdVYiXWkYUqPVsz91cG7EL2FBg==", - "requires": { - "graceful-fs": "^4.1.6", - "universalify": "^1.0.0" - } - }, - "minimatch": { - "version": "3.0.4", - "resolved": "https://registry.npmjs.org/minimatch/-/minimatch-3.0.4.tgz", - "integrity": "sha512-yJHVQEhyqPLUTgt9B83PXu6W3rx4MvvHvSUvToogpwoGDOUQ+yDrR0HRot+yOCdCO7u4hX3pWft6kWBBcqh0UA==", - "requires": { - "brace-expansion": "^1.1.7" - } - }, - "once": { - "version": "1.4.0", - "resolved": "https://registry.npmjs.org/once/-/once-1.4.0.tgz", - "integrity": "sha1-WDsap3WWHUsROsF9nFC6753Xa9E=", - "requires": { - "wrappy": "1" - } - }, - "path-is-absolute": { - "version": "1.0.1", - "resolved": "https://registry.npmjs.org/path-is-absolute/-/path-is-absolute-1.0.1.tgz", - "integrity": "sha1-F0uSaHNVNP+8es5r9TpanhtcX18=" - }, - "readdir-enhanced": { - "version": "6.0.4", - "resolved": "https://registry.npmjs.org/readdir-enhanced/-/readdir-enhanced-6.0.4.tgz", - "integrity": "sha512-MWY048D/nEpHwqdnsBiUxpqjJPkEw2i2RmY5gM2Gadn0rkHS/DhUBqrYTkOqKHF4RoUlYZZ8GnP4ymlRGuo30A==", - "requires": { - "@jsdevtools/readdir-enhanced": "6.0.4" - } - }, - "universalify": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/universalify/-/universalify-1.0.0.tgz", - "integrity": "sha512-rb6X1W158d7pRQBg5gkR8uPaSfiids68LTJQYOtEUhoJUWBdaQHsuT/EUduxXYxcrt4r5PJ4fuHW1MHT6p0qug==" - }, - "wrappy": { - "version": "1.0.2", - "resolved": "https://registry.npmjs.org/wrappy/-/wrappy-1.0.2.tgz", - "integrity": "sha1-tSQ9jz7BqjXxNkYFvA0QNuMKtp8=" - } - } -} diff --git a/pkg/apply.js b/pkg/apply.js index 9956c07..1e2b2e3 100644 --- a/pkg/apply.js +++ b/pkg/apply.js @@ -31,31 +31,40 @@ module.exports = async function ({ overwrite_version, friendly_errors } = {}) { return true; case 2: console.warn(` * ${check_app.msg}`); - do { + const valid = () => + typeof overwrite_version === 'string' && + ['y', 'n', ''].includes(overwrite_version.toLowerCase()); + if (valid()) { + console.info( + ` > overwrite? [Y/n]: ${overwrite_version.toLowerCase()}` + ); + } + while (!valid()) { process.stdout.write(' > overwrite? [Y/n]: '); overwrite_version = await helpers.readline(); - } while ( - overwrite_version && - !['y', 'n'].includes(overwrite_version.toLowerCase()) - ); - overwrite_version = - !overwrite_version || overwrite_version.toLowerCase() === 'y'; - if (!overwrite_version) { + } + if (overwrite_version.toLowerCase() === 'n') { console.info(' ~~ keeping previous version: exiting.'); return false; } console.info( ' -- removing previous enhancements before applying new version.' ); - await require('./remove.js')({ - overwrite_asar: true, - delete_data: false, - }); + if ( + !(await require('./remove.js')({ + delete_data: 'n', + friendly_errors, + })) + ) { + return false; + } } console.info(' ...unpacking app.asar.'); - const asar_app = path.resolve(`${helpers.__notion}/app.asar`); + const asar_app = path.resolve(`${helpers.__notion}/app.asar`), + asar_bak = path.resolve(`${helpers.__notion}/app.asar.bak`); extractAll(asar_app, `${path.resolve(`${helpers.__notion}/app`)}`); - await fs.move(asar_app, path.resolve(`${helpers.__notion}/app.asar.bak`)); + if (await fs.pathExists(asar_bak)) fs.remove(asar_bak); + await fs.move(asar_app, asar_bak); // patching launch script target of custom wrappers if ( diff --git a/pkg/helpers.md b/pkg/helpers.md index 186ccca..d6967d8 100644 --- a/pkg/helpers.md +++ b/pkg/helpers.md @@ -108,19 +108,23 @@ example usage: ```js console.warn(' * conflicting file found.'); let overwrite; -do { +while ( + typeof overwrite !== 'string' || + !['y', 'n', ''].includes(overwrite.toLowerCase()) +) { // using stdout.write means that there is no newline // between prompt and input. - process.stdout.write(' > overwrite? [Y/n]: '); - overwrite = await helpers.readline(); + process.stdout.write(' > delete? [Y/n]: '); // ask for a Y/n until a valid answer is received. // pressing enter without input is assumed to be a "yes". -} while (overwrite && !['y', 'n'].includes(overwrite.toLowerCase())); -overwrite = !overwrite || overwrite.toLowerCase() === 'y'; -if (overwrite) { - console.info(' -- overwriting file.'); + overwrite = await helpers.readline(); +} +if (overwrite.toLowerCase() === 'n') { + console.info(' -- keeping file: skipping step.'); +} else { // do stuff -} else console.info(' -- keeping file: skipping step.'); + console.info(' -- overwriting file.'); +} ``` --- diff --git a/pkg/remove.js b/pkg/remove.js index 5528c3a..cfaff62 100644 --- a/pkg/remove.js +++ b/pkg/remove.js @@ -18,11 +18,7 @@ const fs = require('fs-extra'), // ~~ exit // ### error ### -module.exports = async function ({ - overwrite_asar, - delete_data, - friendly_errors, -} = {}) { +module.exports = async function ({ delete_data, friendly_errors } = {}) { try { // extracted asar: modded const app_folder = path.resolve(`${helpers.__notion}/app`); @@ -38,50 +34,30 @@ module.exports = async function ({ if (await fs.pathExists(path.resolve(`${helpers.__notion}/app.asar`))) { console.warn(' * app.asar already exists!'); - if (overwrite_asar === undefined) { - do { - process.stdout.write(' > overwrite? [Y/n]: '); - overwrite_asar = await helpers.readline(); - } while ( - overwrite_asar && - !['y', 'n'].includes(overwrite_asar.toLowerCase()) - ); - overwrite_asar = - !overwrite_asar || overwrite_asar.toLowerCase() === 'y'; - } - console.info( - overwrite_asar - ? ' -- overwriting app.asar with app.asar.bak' - : ' -- removing app.asar.bak' - ); - } - - await (overwrite_asar || overwrite_asar === undefined - ? fs.move(asar_bak, path.resolve(`${helpers.__notion}/app.asar`), { - overwrite: true, - }) - : fs.remove(asar_bak)); + console.info(' -- removing app.asar.bak'); + fs.remove(asar_bak); + } else + await fs.move(asar_bak, path.resolve(`${helpers.__notion}/app.asar`)); } else console.warn(` * ${asar_bak} not found: step skipped.`); // cleaning data folder: ~/.notion-enhancer if (await fs.pathExists(helpers.__data)) { console.info(` ...data folder ${helpers.__data} found.`); - if (delete_data === undefined) { - do { - process.stdout.write(' > delete? [Y/n]: '); - delete_data = await helpers.readline(); - } while ( - delete_data && - !['y', 'n'].includes(delete_data.toLowerCase()) - ); - delete_data = !delete_data || delete_data.toLowerCase() === 'y'; + const valid = () => + typeof delete_data === 'string' && + ['y', 'n', ''].includes(delete_data.toLowerCase()); + if (valid()) + console.info(` > delete? [Y/n]: ${delete_data.toLowerCase()}`); + while (!valid()) { + process.stdout.write(' > delete? [Y/n]: '); + delete_data = await helpers.readline(); } console.info( - delete_data - ? ` -- deleting ${helpers.__data}` - : ` -- keeping ${helpers.__data}` + delete_data.toLowerCase() === 'n' + ? ` -- keeping ${helpers.__data}` + : ` -- deleting ${helpers.__data}` ); - if (delete_data) await fs.remove(helpers.__data); + if (delete_data.toLowerCase() !== 'n') await fs.remove(helpers.__data); } else console.warn(` * ${helpers.__data} not found: step skipped.`); // patching launch script target of custom wrappers From c76750c0888130abf627787f6b22e4dfbeca3605 Mon Sep 17 00:00:00 2001 From: dragonwocky Date: Fri, 23 Oct 2020 16:49:58 +1100 Subject: [PATCH 02/10] additional menu option descriptions on hover --- CHANGELOG.md | 2 +- CONTRIBUTING.md | 2 +- DOCUMENTATION.md | 16 +++--- mods/core/client.js | 2 + mods/core/css/menu.css | 23 +++++++++ mods/core/enhancerMenu.js | 51 ++++++++++++++++--- .../{word-counter => core/icons}/question.svg | 0 mods/core/menu.html | 1 + mods/core/mod.js | 22 +++++++- mods/word-counter/mod.js | 2 +- mods/word-counter/styles.css | 3 +- 11 files changed, 103 insertions(+), 21 deletions(-) rename mods/{word-counter => core/icons}/question.svg (100%) diff --git a/CHANGELOG.md b/CHANGELOG.md index ab57058..b4d107d 100644 --- a/CHANGELOG.md +++ b/CHANGELOG.md @@ -26,6 +26,7 @@ a flexibility update. - improved: menu will now respect integrated titlebar setting. - improved: use keyup listeners instead of a globalShortcut for the enhancements menu toggle. - improved: overwrite `app.asar.bak` if already exists (e.g. for app updates). +- improved: additional menu option descriptions on hover. - bugfix: removed messenger emoji set as the provider no longer supports it. - bugfix: remove shadow around light mode board headers \+ minor text colour fixes for night shift theming. @@ -60,7 +61,6 @@ a fork of notion-deb-builder that does generate an app.asar has been created and - bugfix: night shift working on macOS. - bugfix: windows are properly hidden/shown on macOS. - extension: "tweaks" = common style/layout changes. -- improved: additionally menu item descriptions on hover. ### v0.9.1 (2020-09-26) diff --git a/CONTRIBUTING.md b/CONTRIBUTING.md index 515c48f..4d3399c 100644 --- a/CONTRIBUTING.md +++ b/CONTRIBUTING.md @@ -49,7 +49,7 @@ modules are either **extensions** or **themes**. each module is separately versioned, following the [semver](https://semver.org/) scheme. depending on the content and scale of a contribution, it may constitute an update on its own or may be merged into a larger update. -to keep a consistent informative code style it is preferred to name variables with +to keep a consistent & informative code style it is preferred to name variables with `snake_case`, functions/methods with `camelCase`, and classes with `PascalCase`. if a variable is a reference to a DOM element, it may be helpful to prefix it with a `$`. diff --git a/DOCUMENTATION.md b/DOCUMENTATION.md index ed22a83..7125130 100644 --- a/DOCUMENTATION.md +++ b/DOCUMENTATION.md @@ -51,6 +51,7 @@ module.exports = { options?: Array<{ key: String, label: String, + description?: String, type: String in ['toggle', 'select', 'input', 'file'], value: Boolean or Array or String or Number or null }>, @@ -94,13 +95,14 @@ if you'd rather customise this, pass this object: #### options -| key | value | type | -| ---------- | ---------------------------------------------------------------------------------------- | ----------------- | -| key | **required:** key to save value to the mod `store` | _string_ | -| label | **required:** short description/name of option to be shown in menu | _string_ | -| type | **required:** input type (see below) | _string_ | -| extensions | **optional:** allowed file extensions (only use with a file option), e.g. `['js', 'ts']` | _array\_ | -| value | **optional:** default or possible value/s for option | see below | +| key | value | type | +| ----------- | ---------------------------------------------------------------------------------------- | ----------------- | +| key | **required:** key to save value to the mod `store` | _string_ | +| label | **required:** short description/name of option to be shown in menu | _string_ | +| description | **optional:** extended information to be shown on hover | _string_ | +| type | **required:** input type (see below) | _string_ | +| extensions | **optional:** allowed file extensions (only use with a file option), e.g. `['js', 'ts']` | _array\_ | +| value | **optional:** default or possible value/s for option | see below | | type | value | | ------ | -------------------- | diff --git a/mods/core/client.js b/mods/core/client.js index 2d8d458..d094fea 100644 --- a/mods/core/client.js +++ b/mods/core/client.js @@ -156,8 +156,10 @@ module.exports = (store, __exports) => { '--theme--sidebar', '--theme--overlay', '--theme--dragarea', + '--theme--box-shadow_strong', '--theme--font_sans', '--theme--font_code', + '--theme--font_label-size', '--theme--scrollbar', '--theme--scrollbar-border', '--theme--scrollbar_hover', diff --git a/mods/core/css/menu.css b/mods/core/css/menu.css index 4e05425..d9a6b4a 100644 --- a/mods/core/css/menu.css +++ b/mods/core/css/menu.css @@ -342,6 +342,29 @@ s { margin-bottom: 0.5em; } +svg[data-tooltip] { + height: 1em; + width: 1em; + margin: 0 0 -2px 1px; + color: var(--theme--text_ui_info); +} +#tooltip { + pointer-events: none; + position: absolute; + padding: 0.25em 0.5em 0.5em 0.5em; + margin: 0 1em; + border-radius: 3px; + box-shadow: var(--theme--box-shadow_strong); + border-right-width: 1px; + font-size: calc(var(--theme--font_label-size) * 0.8); + background: var(--theme--interactive_hover); + opacity: 0; + transition: opacity 120ms ease-in; +} +#tooltip.active { + opacity: 1; +} + .toggle *, .input *, .select *, diff --git a/mods/core/enhancerMenu.js b/mods/core/enhancerMenu.js index aacb52e..28750ce 100644 --- a/mods/core/enhancerMenu.js +++ b/mods/core/enhancerMenu.js @@ -271,10 +271,13 @@ window['__start'] = async () => { let text = ''; for (let $node of elem.childNodes) { if ($node.nodeType === 3) text += $node.textContent; - if ($node.nodeType === 1) + if ($node.nodeType === 1) { + if ($node.getAttribute('data-tooltip')) + text += $node.getAttribute('data-tooltip'); text += ['text', 'number'].includes($node.type) ? $node.value : innerText($node); + } } return text; } @@ -387,24 +390,35 @@ window['__start'] = async () => { } const file_icon = await fs.readFile( - path.resolve(`${__dirname}/icons/file.svg`) - ); + path.resolve(`${__dirname}/icons/file.svg`) + ), + question_icon = ( + await fs.readFile(path.resolve(`${__dirname}/icons/question.svg`)) + ).toString(); function createOption(opt, id) { let $opt; + const description = opt.description + ? question_icon.replace( + ' `; break; case 'select': $opt = ` - + @@ -422,7 +438,7 @@ window['__start'] = async () => { break; case 'color': $opt = ` - + `; break; @@ -438,7 +454,7 @@ window['__start'] = async () => { }>