From de77e40e4d4d179cf3c0037c0b4e017dda453cd5 Mon Sep 17 00:00:00 2001 From: Henrik Giesel Date: Thu, 25 Mar 2021 21:11:40 +0100 Subject: [PATCH 01/97] Add ts/editor-toolbar --- qt/aqt/data/web/css/BUILD.bazel | 9 +++ qt/aqt/data/web/js/BUILD.bazel | 9 +++ ts/editor-toolbar/BUILD.bazel | 92 ++++++++++++++++++++++++++ ts/editor-toolbar/EditorToolbar.svelte | 10 +++ ts/editor-toolbar/LeftButton.svelte | 0 ts/editor-toolbar/RightButton.svelte | 0 ts/editor-toolbar/index.ts | 23 +++++++ ts/sveltelib/WithBase.svelte | 13 ++++ 8 files changed, 156 insertions(+) create mode 100644 ts/editor-toolbar/BUILD.bazel create mode 100644 ts/editor-toolbar/EditorToolbar.svelte create mode 100644 ts/editor-toolbar/LeftButton.svelte create mode 100644 ts/editor-toolbar/RightButton.svelte create mode 100644 ts/editor-toolbar/index.ts create mode 100644 ts/sveltelib/WithBase.svelte diff --git a/qt/aqt/data/web/css/BUILD.bazel b/qt/aqt/data/web/css/BUILD.bazel index e29acf7ed..cb92658a0 100644 --- a/qt/aqt/data/web/css/BUILD.bazel +++ b/qt/aqt/data/web/css/BUILD.bazel @@ -26,11 +26,20 @@ copy_files_into_group( package = "//ts/editor", ) +copy_files_into_group( + name = "editor-toolbar", + srcs = [ + "editor-toolbar.css", + ], + package = "//ts/editor-toolbar", +) + filegroup( name = "css", srcs = [ "css_local", "editor", + "editor-toolbar", ], visibility = ["//qt:__subpackages__"], ) diff --git a/qt/aqt/data/web/js/BUILD.bazel b/qt/aqt/data/web/js/BUILD.bazel index b138bd31b..83f4718fc 100644 --- a/qt/aqt/data/web/js/BUILD.bazel +++ b/qt/aqt/data/web/js/BUILD.bazel @@ -37,11 +37,20 @@ copy_files_into_group( package = "//ts/editor", ) +copy_files_into_group( + name = "editor-toolbar", + srcs = [ + "editor-toolbar.js", + ], + package = "//ts/editor-toolbar", +) + filegroup( name = "js", srcs = [ "aqt_es5", "editor", + "editor-toolbar", "mathjax.js", "//qt/aqt/data/web/js/vendor", ], diff --git a/ts/editor-toolbar/BUILD.bazel b/ts/editor-toolbar/BUILD.bazel new file mode 100644 index 000000000..e86d08974 --- /dev/null +++ b/ts/editor-toolbar/BUILD.bazel @@ -0,0 +1,92 @@ +load("@npm//@bazel/typescript:index.bzl", "ts_library") +load("//ts/svelte:svelte.bzl", "compile_svelte", "svelte_check") +load("//ts:prettier.bzl", "prettier_test") +load("//ts:eslint.bzl", "eslint_test") +load("//ts:esbuild.bzl", "esbuild") + +svelte_files = glob(["*.svelte"]) + +svelte_names = [f.replace(".svelte", "") for f in svelte_files] + +compile_svelte( + name = "svelte", + srcs = svelte_files, +) + +ts_library( + name = "index", + srcs = ["index.ts"], + deps = [ + "EditorToolbar", + "lib", + "//ts/lib", + "@npm//svelte", + "@npm//svelte2tsx", + ], +) + +ts_library( + name = "lib", + srcs = glob( + ["*.ts"], + exclude = ["index.ts"], + ), + deps = [ + "//ts/lib", + "//ts/lib:backend_proto", + "@npm//svelte", + ], +) + +esbuild( + name = "editor-toolbar", + srcs = [ + "//ts:protobuf-shim.js", + ], + args = [ + "--global-name=anki", + "--inject:ts/protobuf-shim.js", + ], + entry_point = "index.ts", + external = [ + "protobufjs/light", + ], + output_css = True, + visibility = ["//visibility:public"], + deps = [ + "//ts/lib", + "//ts/lib:backend_proto", + "//ts/lib:fluent_proto", + ":index", + "//ts/sass:core_css", + ] + svelte_names, +) + +# Tests +################ + +prettier_test( + name = "format_check", + srcs = glob([ + "*.ts", + "*.svelte", + ]), +) + +eslint_test( + name = "eslint", + srcs = glob( + [ + "*.ts", + ], + ), +) + +svelte_check( + name = "svelte_check", + srcs = glob([ + "*.ts", + "*.svelte", + ]), +) + diff --git a/ts/editor-toolbar/EditorToolbar.svelte b/ts/editor-toolbar/EditorToolbar.svelte new file mode 100644 index 000000000..b433dc59f --- /dev/null +++ b/ts/editor-toolbar/EditorToolbar.svelte @@ -0,0 +1,10 @@ + + + + +

Test

diff --git a/ts/editor-toolbar/LeftButton.svelte b/ts/editor-toolbar/LeftButton.svelte new file mode 100644 index 000000000..e69de29bb diff --git a/ts/editor-toolbar/RightButton.svelte b/ts/editor-toolbar/RightButton.svelte new file mode 100644 index 000000000..e69de29bb diff --git a/ts/editor-toolbar/index.ts b/ts/editor-toolbar/index.ts new file mode 100644 index 000000000..2cf8f5122 --- /dev/null +++ b/ts/editor-toolbar/index.ts @@ -0,0 +1,23 @@ +import type { SvelteComponent } from "svelte"; +import { setupI18n } from "anki/i18n"; +import { checkNightMode } from "anki/nightmode"; +import EditorToolbarSvelte from "./EditorToolbar.svelte"; + +class EditorToolbar extends HTMLElement { + component?: SvelteComponent; + + async connectedCallback(): Promise { + const nightMode = checkNightMode(); + const i18n = await setupI18n(); + + this.component = new EditorToolbarSvelte({ + target: this, + props: { + i18n, + nightMode, + }, + }); + } +} + +customElements.define("anki-editor-toolbar", EditorToolbar); diff --git a/ts/sveltelib/WithBase.svelte b/ts/sveltelib/WithBase.svelte new file mode 100644 index 000000000..9b9156843 --- /dev/null +++ b/ts/sveltelib/WithBase.svelte @@ -0,0 +1,13 @@ + + +{#if !$loading} + +{/if} From 7787a7827fe9cffe5ed08478bbc775e2aebd6c65 Mon Sep 17 00:00:00 2001 From: Henrik Giesel Date: Thu, 25 Mar 2021 23:32:23 +0100 Subject: [PATCH 02/97] First implementation --- qt/aqt/editor.py | 7 +- ts/editor-toolbar/ButtonBar.svelte | 20 ++++++ ts/editor-toolbar/ButtonBarOuter.svelte | 17 +++++ ts/editor-toolbar/ButtonItem.svelte | 7 ++ ts/editor-toolbar/EditorToolbar.svelte | 31 +++++++-- ts/editor-toolbar/LeftButton.svelte | 20 ++++++ ts/editor-toolbar/RightButton.svelte | 15 ++++ ts/editor-toolbar/_buttons.scss | 51 ++++++++++++++ ts/editor-toolbar/index.ts | 5 +- ts/editor/editor.scss | 91 ------------------------- 10 files changed, 159 insertions(+), 105 deletions(-) create mode 100644 ts/editor-toolbar/ButtonBar.svelte create mode 100644 ts/editor-toolbar/ButtonBarOuter.svelte create mode 100644 ts/editor-toolbar/ButtonItem.svelte create mode 100644 ts/editor-toolbar/_buttons.scss diff --git a/qt/aqt/editor.py b/qt/aqt/editor.py index e6db3b05f..f98e60d24 100644 --- a/qt/aqt/editor.py +++ b/qt/aqt/editor.py @@ -82,9 +82,7 @@ _html = """ }
-
- %s -
+
@@ -233,10 +231,13 @@ class Editor: _html % (bgcol, topbuts, tr.editing_show_duplicates()), css=[ "css/editor.css", + "css/editor-toolbar.css", ], js=[ "js/vendor/jquery.min.js", + "js/vendor/protobuf.min.js", "js/editor.js", + "js/editor-toolbar.js", ], context=self, default_css=False, diff --git a/ts/editor-toolbar/ButtonBar.svelte b/ts/editor-toolbar/ButtonBar.svelte new file mode 100644 index 000000000..fa8d980cb --- /dev/null +++ b/ts/editor-toolbar/ButtonBar.svelte @@ -0,0 +1,20 @@ + + +
diff --git a/ts/editor-toolbar/ButtonBarOuter.svelte b/ts/editor-toolbar/ButtonBarOuter.svelte new file mode 100644 index 000000000..064d60c4c --- /dev/null +++ b/ts/editor-toolbar/ButtonBarOuter.svelte @@ -0,0 +1,17 @@ + + +
diff --git a/ts/editor-toolbar/ButtonItem.svelte b/ts/editor-toolbar/ButtonItem.svelte new file mode 100644 index 000000000..88b9f924b --- /dev/null +++ b/ts/editor-toolbar/ButtonItem.svelte @@ -0,0 +1,7 @@ + + +
  • diff --git a/ts/editor-toolbar/EditorToolbar.svelte b/ts/editor-toolbar/EditorToolbar.svelte index b433dc59f..e2231c458 100644 --- a/ts/editor-toolbar/EditorToolbar.svelte +++ b/ts/editor-toolbar/EditorToolbar.svelte @@ -1,10 +1,27 @@ - - + + + {#each leftButtons as leftButton} + {leftButton} + {/each} + -

    Test

    + + {#each rightButtons as rightButton} + + {/each} + +
    diff --git a/ts/editor-toolbar/LeftButton.svelte b/ts/editor-toolbar/LeftButton.svelte index e69de29bb..c2b9388d5 100644 --- a/ts/editor-toolbar/LeftButton.svelte +++ b/ts/editor-toolbar/LeftButton.svelte @@ -0,0 +1,20 @@ + + + + + + diff --git a/ts/editor-toolbar/RightButton.svelte b/ts/editor-toolbar/RightButton.svelte index e69de29bb..cf0803e39 100644 --- a/ts/editor-toolbar/RightButton.svelte +++ b/ts/editor-toolbar/RightButton.svelte @@ -0,0 +1,15 @@ + + + + + + + diff --git a/ts/editor-toolbar/_buttons.scss b/ts/editor-toolbar/_buttons.scss new file mode 100644 index 000000000..0ad2baf32 --- /dev/null +++ b/ts/editor-toolbar/_buttons.scss @@ -0,0 +1,51 @@ +.rainbow { + background-image: -webkit-gradient( + linear, + left top, + left bottom, + color-stop(0, #f77), + color-stop(50%, #7f7), + color-stop(100%, #77f) + ); +} + +button.linkb { + -webkit-appearance: none; + margin-bottom: -3px; + border: 0; + box-shadow: none; + padding: 0px 2px; + background: transparent; + + &:disabled { + opacity: 0.3; + cursor: not-allowed; + } + + .nightMode & > img { + filter: invert(180); + } +} + +button:focus { + outline: none; +} + +button.highlighted { + #topbutsleft & { + background-color: lightgrey; + + .nightMode & { + background: linear-gradient(0deg, #333333 0%, #434343 100%); + } + } + + #topbutsright & { + border-bottom: 3px solid black; + border-radius: 3px; + + .nightMode & { + border-bottom-color: white; + } + } +} diff --git a/ts/editor-toolbar/index.ts b/ts/editor-toolbar/index.ts index 2cf8f5122..20c838afb 100644 --- a/ts/editor-toolbar/index.ts +++ b/ts/editor-toolbar/index.ts @@ -1,19 +1,16 @@ import type { SvelteComponent } from "svelte"; -import { setupI18n } from "anki/i18n"; import { checkNightMode } from "anki/nightmode"; import EditorToolbarSvelte from "./EditorToolbar.svelte"; class EditorToolbar extends HTMLElement { component?: SvelteComponent; - async connectedCallback(): Promise { + connectedCallback(): void { const nightMode = checkNightMode(); - const i18n = await setupI18n(); this.component = new EditorToolbarSvelte({ target: this, props: { - i18n, nightMode, }, }); diff --git a/ts/editor/editor.scss b/ts/editor/editor.scss index a23c4bbfe..ce7081d47 100644 --- a/ts/editor/editor.scss +++ b/ts/editor/editor.scss @@ -29,97 +29,6 @@ padding: 0; } -#topbutsOuter { - display: flex; - flex-wrap: wrap; - justify-content: space-between; - - position: sticky; - top: 0; - left: 0; - z-index: 5; - padding: 2px; - - background: var(--bg-color); - font-size: 13px; -} - -.topbuts { - margin-bottom: 2px; - - & > * { - margin: 0 1px; - - &:first-child { - margin-left: 0; - } - - &:last-child { - margin-right: 0; - } - } -} - -.topbut { - display: inline-block; - width: 16px; - height: 16px; - margin-top: 4px; - vertical-align: -0.125em; -} - -.rainbow { - background-image: -webkit-gradient( - linear, - left top, - left bottom, - color-stop(0, #f77), - color-stop(50%, #7f7), - color-stop(100%, #77f) - ); -} - -button.linkb { - -webkit-appearance: none; - margin-bottom: -3px; - border: 0; - box-shadow: none; - padding: 0px 2px; - background: transparent; - - &:disabled { - opacity: 0.3; - cursor: not-allowed; - } - - .nightMode & > img { - filter: invert(180); - } -} - -button:focus { - outline: none; -} - -button.highlighted { - #topbutsleft & { - background-color: lightgrey; - - .nightMode & { - background: linear-gradient(0deg, #333333 0%, #434343 100%); - } - } - - #topbutsright & { - border-bottom: 3px solid black; - border-radius: 3px; - - .nightMode & { - border-bottom-color: white; - } - } -} - #dupes { position: sticky; bottom: 0; From a0a961972211929212c751d94248c75d634be0db Mon Sep 17 00:00:00 2001 From: Henrik Giesel Date: Mon, 29 Mar 2021 14:54:10 +0200 Subject: [PATCH 03/97] Include icons directly in ts lib --- qt/aqt/data/web/imgs/vendor/BUILD.bazel | 19 +++++++++++++++ qt/aqt/editor.py | 2 +- ts/editor-toolbar/BUILD.bazel | 14 ++++++++++- ts/editor-toolbar/ButtonBar.svelte | 12 ---------- ts/editor-toolbar/EditorToolbar.svelte | 24 ++++++++++++++----- ts/editor-toolbar/IconButton.svelte | 24 +++++++++++++++++++ .../{LeftButton.svelte => LabelButton.svelte} | 13 ++++++---- ts/editor-toolbar/RightButton.svelte | 15 ------------ ts/licenses.json | 9 +++++++ ts/package.json | 1 + ts/vendor.bzl | 19 +++++++++++++-- ts/yarn.lock | 4 ++++ 12 files changed, 114 insertions(+), 42 deletions(-) create mode 100644 qt/aqt/data/web/imgs/vendor/BUILD.bazel create mode 100644 ts/editor-toolbar/IconButton.svelte rename ts/editor-toolbar/{LeftButton.svelte => LabelButton.svelte} (64%) delete mode 100644 ts/editor-toolbar/RightButton.svelte diff --git a/qt/aqt/data/web/imgs/vendor/BUILD.bazel b/qt/aqt/data/web/imgs/vendor/BUILD.bazel new file mode 100644 index 000000000..f316948a7 --- /dev/null +++ b/qt/aqt/data/web/imgs/vendor/BUILD.bazel @@ -0,0 +1,19 @@ +load("//ts:vendor.bzl", "copy_bootstrap_icons", "copy_fontawesome_icons") + +copy_bootstrap_icons(name = "bootstrap-icons") + +copy_fontawesome_icons(name = "fontawesome-icons") + +files = [ + "bootstrap-icons", + "fontawesome-icons", +] + +directories = [] + +filegroup( + name = "vendor", + srcs = ["//qt/aqt/data/web/imgs/vendor:{}".format(file) for file in files] + + ["//qt/aqt/data/web/imgs/vendor/{}".format(dir) for dir in directories], + visibility = ["//qt:__subpackages__"], +) diff --git a/qt/aqt/editor.py b/qt/aqt/editor.py index f98e60d24..c20c8f4be 100644 --- a/qt/aqt/editor.py +++ b/qt/aqt/editor.py @@ -228,7 +228,7 @@ class Editor: bgcol = self.mw.app.palette().window().color().name() # type: ignore # then load page self.web.stdHtml( - _html % (bgcol, topbuts, tr.editing_show_duplicates()), + _html % (bgcol, tr.editing_show_duplicates()), css=[ "css/editor.css", "css/editor-toolbar.css", diff --git a/ts/editor-toolbar/BUILD.bazel b/ts/editor-toolbar/BUILD.bazel index e86d08974..3d92ec0c5 100644 --- a/ts/editor-toolbar/BUILD.bazel +++ b/ts/editor-toolbar/BUILD.bazel @@ -3,6 +3,7 @@ load("//ts/svelte:svelte.bzl", "compile_svelte", "svelte_check") load("//ts:prettier.bzl", "prettier_test") load("//ts:eslint.bzl", "eslint_test") load("//ts:esbuild.bzl", "esbuild") +load("//ts:vendor.bzl", "copy_bootstrap_icons") svelte_files = glob(["*.svelte"]) @@ -38,6 +39,15 @@ ts_library( ], ) +copy_bootstrap_icons( + name = "bootstrap-icons", + icons = [ + "type-bold.svg", + "type-italic.svg", + "type-underline.svg", + ], +) + esbuild( name = "editor-toolbar", srcs = [ @@ -46,6 +56,7 @@ esbuild( args = [ "--global-name=anki", "--inject:ts/protobuf-shim.js", + "--loader:.svg=text", ], entry_point = "index.ts", external = [ @@ -56,9 +67,10 @@ esbuild( deps = [ "//ts/lib", "//ts/lib:backend_proto", - "//ts/lib:fluent_proto", ":index", "//ts/sass:core_css", + "//ts:image_module_support", + "bootstrap-icons", ] + svelte_names, ) diff --git a/ts/editor-toolbar/ButtonBar.svelte b/ts/editor-toolbar/ButtonBar.svelte index fa8d980cb..0842a70ba 100644 --- a/ts/editor-toolbar/ButtonBar.svelte +++ b/ts/editor-toolbar/ButtonBar.svelte @@ -2,18 +2,6 @@ ul { padding-left: 0; margin-bottom: 2px; - - & > :global(*) { - margin: 0 4px; - - &:first-child { - margin-left: 0; - } - - &:last-child { - margin-right: 0; - } - } } diff --git a/ts/editor-toolbar/EditorToolbar.svelte b/ts/editor-toolbar/EditorToolbar.svelte index e2231c458..de2bfb3fb 100644 --- a/ts/editor-toolbar/EditorToolbar.svelte +++ b/ts/editor-toolbar/EditorToolbar.svelte @@ -2,11 +2,23 @@ import ButtonBarOuter from "./ButtonBarOuter.svelte"; import ButtonBar from "./ButtonBar.svelte"; - import LeftButton from "./LeftButton.svelte"; - import RightButton from "./RightButton.svelte"; + import LabelButton from "./LabelButton.svelte"; + import IconButton from "./IconButton.svelte"; - export let leftButtons = ["Fields...", "Cards..."]; - export let rightButtons = ["bi bi-type-bold", "bi bi-pin-angle"]; + import boldIcon from "./type-bold.svg"; + import italicIcon from "./type-italic.svg"; + import underlineIcon from "./type-underline.svg"; + + export let leftButtons = [ + { component: LabelButton, label: "Fields..." }, + { component: LabelButton, label: "Cards..." }, + ]; + + export let rightButtons = [ + { component: IconButton, icon: boldIcon }, + { component: IconButton, icon: italicIcon }, + { component: IconButton, icon: underlineIcon }, + ]; export let nightMode: boolean; console.log(nightMode); @@ -15,13 +27,13 @@ {#each leftButtons as leftButton} - {leftButton} + {/each} {#each rightButtons as rightButton} - + {/each} diff --git a/ts/editor-toolbar/IconButton.svelte b/ts/editor-toolbar/IconButton.svelte new file mode 100644 index 000000000..a98934be4 --- /dev/null +++ b/ts/editor-toolbar/IconButton.svelte @@ -0,0 +1,24 @@ + + + + + + {@html icon} + diff --git a/ts/editor-toolbar/LeftButton.svelte b/ts/editor-toolbar/LabelButton.svelte similarity index 64% rename from ts/editor-toolbar/LeftButton.svelte rename to ts/editor-toolbar/LabelButton.svelte index c2b9388d5..b158383a7 100644 --- a/ts/editor-toolbar/LeftButton.svelte +++ b/ts/editor-toolbar/LabelButton.svelte @@ -1,20 +1,23 @@ + diff --git a/ts/editor-toolbar/RightButton.svelte b/ts/editor-toolbar/RightButton.svelte deleted file mode 100644 index cf0803e39..000000000 --- a/ts/editor-toolbar/RightButton.svelte +++ /dev/null @@ -1,15 +0,0 @@ - - - - - - - diff --git a/ts/licenses.json b/ts/licenses.json index f6c72a5c6..90aa38b59 100644 --- a/ts/licenses.json +++ b/ts/licenses.json @@ -7,6 +7,15 @@ "path": "node_modules/@fluent/bundle", "licenseFile": "node_modules/@fluent/bundle/README.md" }, + "@fortawesome/fontawesome-free@5.15.3": { + "licenses": "(CC-BY-4.0 AND OFL-1.1 AND MIT)", + "repository": "https://github.com/FortAwesome/Font-Awesome", + "publisher": "Dave Gandy", + "email": "dave@fontawesome.com", + "url": "http://twitter.com/davegandy", + "path": "node_modules/@fortawesome/fontawesome-free", + "licenseFile": "node_modules/@fortawesome/fontawesome-free/LICENSE.txt" + }, "@protobufjs/aspromise@1.1.2": { "licenses": "BSD-3-Clause", "repository": "https://github.com/dcodeIO/protobuf.js", diff --git a/ts/package.json b/ts/package.json index 4dd50d40d..6e6addf2a 100644 --- a/ts/package.json +++ b/ts/package.json @@ -54,6 +54,7 @@ }, "dependencies": { "@fluent/bundle": "^0.15.1", + "@fortawesome/fontawesome-free": "^5.15.3", "bootstrap": "^5.0.0-beta2", "bootstrap-icons": "^1.4.0", "css-browser-selector": "^0.6.5", diff --git a/ts/vendor.bzl b/ts/vendor.bzl index 9eb4dcde6..265c5b912 100644 --- a/ts/vendor.bzl +++ b/ts/vendor.bzl @@ -4,8 +4,11 @@ Helpers to copy runtime dependencies from node_modules. load("//ts:copy.bzl", "copy_select_files") +def _npm_base_from_name(name): + return "external/npm/node_modules/{}/".format(name) + def _vendor_js_lib_impl(ctx): - base = ctx.attr.base or "external/npm/node_modules/{}/".format(ctx.attr.name) + base = ctx.attr.base or _npm_base_from_name(ctx.attr.name) return copy_select_files( ctx = ctx, files = ctx.attr.pkg.files, @@ -27,7 +30,8 @@ vendor_js_lib = rule( ) def pkg_from_name(name): - return "@npm//{0}:{0}__files".format(name) + tail = name.split("/")[-1] + return "@npm//{0}:{1}__files".format(name, tail) # # These could be defined directly in BUILD files, but defining them as @@ -126,3 +130,14 @@ def copy_bootstrap_icons(name = "bootstrap-icons", icons = [], visibility = ["// strip_prefix = "icons/", visibility = visibility, ) + + +def copy_fontawesome_icons(name = "fontawesome-icons", icons = [], visibility = ["//visibility:public"]): + vendor_js_lib( + name = name, + pkg = _pkg_from_name("@fortawesome/fontawesome-free"), + base = _npm_base_from_name("@fortawesome/fontawesome-free"), + include = ["svgs/{}".format(icon) for icon in icons], + strip_prefix = "svgs/solid/", + visibility = visibility, + ) diff --git a/ts/yarn.lock b/ts/yarn.lock index 5d928e4de..2b5ed0fa5 100644 --- a/ts/yarn.lock +++ b/ts/yarn.lock @@ -502,6 +502,10 @@ "@types/node" "*" "@types/yargs" "^15.0.0" chalk "^4.0.0" +"@fortawesome/fontawesome-free@^5.15.3": + version "5.15.3" + resolved "https://registry.yarnpkg.com/@fortawesome/fontawesome-free/-/fontawesome-free-5.15.3.tgz#c36ffa64a2a239bf948541a97b6ae8d729e09a9a" + integrity sha512-rFnSUN/QOtnOAgqFRooTA3H57JLDm0QEG/jPdk+tLQNL/eWd+Aok8g3qCI+Q1xuDPWpGW/i9JySpJVsq8Q0s9w== "@jest/types@^27.0.0-next.8": version "27.0.0-next.8" From fee78d25706cd22e0c055f8be35a4f83a99a15a8 Mon Sep 17 00:00:00 2001 From: Henrik Giesel Date: Mon, 29 Mar 2021 15:27:42 +0200 Subject: [PATCH 04/97] Add remaining icons for toolbar --- ts/editor-toolbar/BUILD.bazel | 17 ++++++++++++++++- ts/editor-toolbar/EditorToolbar.svelte | 22 ++++++++++++++++++++++ ts/licenses.json | 14 ++++++-------- ts/package.json | 2 +- ts/vendor.bzl | 12 ++++++------ ts/yarn.lock | 9 +++++---- 6 files changed, 56 insertions(+), 20 deletions(-) diff --git a/ts/editor-toolbar/BUILD.bazel b/ts/editor-toolbar/BUILD.bazel index 3d92ec0c5..8b1962116 100644 --- a/ts/editor-toolbar/BUILD.bazel +++ b/ts/editor-toolbar/BUILD.bazel @@ -3,7 +3,7 @@ load("//ts/svelte:svelte.bzl", "compile_svelte", "svelte_check") load("//ts:prettier.bzl", "prettier_test") load("//ts:eslint.bzl", "eslint_test") load("//ts:esbuild.bzl", "esbuild") -load("//ts:vendor.bzl", "copy_bootstrap_icons") +load("//ts:vendor.bzl", "copy_bootstrap_icons", "copy_mdi_icons") svelte_files = glob(["*.svelte"]) @@ -45,6 +45,20 @@ copy_bootstrap_icons( "type-bold.svg", "type-italic.svg", "type-underline.svg", + "eraser.svg", + "square-fill.svg", + "paperclip.svg", + "mic.svg", + "three-dots.svg", + ], +) + +copy_mdi_icons( + name = "mdi-icons", + icons = [ + "format-superscript.svg", + "format-subscript.svg", + "code-brackets.svg", ], ) @@ -71,6 +85,7 @@ esbuild( "//ts/sass:core_css", "//ts:image_module_support", "bootstrap-icons", + "mdi-icons", ] + svelte_names, ) diff --git a/ts/editor-toolbar/EditorToolbar.svelte b/ts/editor-toolbar/EditorToolbar.svelte index de2bfb3fb..f355e9e4e 100644 --- a/ts/editor-toolbar/EditorToolbar.svelte +++ b/ts/editor-toolbar/EditorToolbar.svelte @@ -9,6 +9,16 @@ import italicIcon from "./type-italic.svg"; import underlineIcon from "./type-underline.svg"; + import superscriptIcon from "./format-superscript.svg"; + import subscriptIcon from "./format-subscript.svg"; + import bracketsIcon from "./code-brackets.svg"; + + import eraserIcon from "./eraser.svg"; + import squareFillIcon from "./square-fill.svg"; + import paperclipIcon from "./paperclip.svg"; + import micIcon from "./mic.svg"; + import threeDotsIcon from "./three-dots.svg"; + export let leftButtons = [ { component: LabelButton, label: "Fields..." }, { component: LabelButton, label: "Cards..." }, @@ -18,6 +28,18 @@ { component: IconButton, icon: boldIcon }, { component: IconButton, icon: italicIcon }, { component: IconButton, icon: underlineIcon }, + + { component: IconButton, icon: superscriptIcon }, + { component: IconButton, icon: subscriptIcon }, + + { component: IconButton, icon: eraserIcon }, + { component: IconButton, icon: squareFillIcon }, + { component: IconButton, icon: squareFillIcon }, + + { component: IconButton, icon: bracketsIcon }, + { component: IconButton, icon: paperclipIcon }, + { component: IconButton, icon: micIcon }, + { component: IconButton, icon: threeDotsIcon }, ]; export let nightMode: boolean; diff --git a/ts/licenses.json b/ts/licenses.json index 90aa38b59..3c74d8774 100644 --- a/ts/licenses.json +++ b/ts/licenses.json @@ -7,14 +7,12 @@ "path": "node_modules/@fluent/bundle", "licenseFile": "node_modules/@fluent/bundle/README.md" }, - "@fortawesome/fontawesome-free@5.15.3": { - "licenses": "(CC-BY-4.0 AND OFL-1.1 AND MIT)", - "repository": "https://github.com/FortAwesome/Font-Awesome", - "publisher": "Dave Gandy", - "email": "dave@fontawesome.com", - "url": "http://twitter.com/davegandy", - "path": "node_modules/@fortawesome/fontawesome-free", - "licenseFile": "node_modules/@fortawesome/fontawesome-free/LICENSE.txt" + "@mdi/svg@5.9.55": { + "licenses": "Apache-2.0", + "repository": "https://github.com/Templarian/MaterialDesign-SVG", + "publisher": "Austin Andrews", + "path": "node_modules/@mdi/svg", + "licenseFile": "node_modules/@mdi/svg/LICENSE" }, "@protobufjs/aspromise@1.1.2": { "licenses": "BSD-3-Clause", diff --git a/ts/package.json b/ts/package.json index 6e6addf2a..7df6203cc 100644 --- a/ts/package.json +++ b/ts/package.json @@ -54,7 +54,7 @@ }, "dependencies": { "@fluent/bundle": "^0.15.1", - "@fortawesome/fontawesome-free": "^5.15.3", + "@mdi/svg": "^5.9.55", "bootstrap": "^5.0.0-beta2", "bootstrap-icons": "^1.4.0", "css-browser-selector": "^0.6.5", diff --git a/ts/vendor.bzl b/ts/vendor.bzl index 265c5b912..b2b3972c8 100644 --- a/ts/vendor.bzl +++ b/ts/vendor.bzl @@ -131,13 +131,13 @@ def copy_bootstrap_icons(name = "bootstrap-icons", icons = [], visibility = ["// visibility = visibility, ) - -def copy_fontawesome_icons(name = "fontawesome-icons", icons = [], visibility = ["//visibility:public"]): +def copy_mdi_icons(name = "mdi-icons", icons = [], visibility = ["//visibility:public"]): vendor_js_lib( name = name, - pkg = _pkg_from_name("@fortawesome/fontawesome-free"), - base = _npm_base_from_name("@fortawesome/fontawesome-free"), - include = ["svgs/{}".format(icon) for icon in icons], - strip_prefix = "svgs/solid/", + pkg = _pkg_from_name("@mdi/svg"), + base = _npm_base_from_name("@mdi/svg"), + include = ["svg/{}".format(icon) for icon in icons], + strip_prefix = "svg/", visibility = visibility, ) + diff --git a/ts/yarn.lock b/ts/yarn.lock index 2b5ed0fa5..69c07b3b3 100644 --- a/ts/yarn.lock +++ b/ts/yarn.lock @@ -502,10 +502,11 @@ "@types/node" "*" "@types/yargs" "^15.0.0" chalk "^4.0.0" -"@fortawesome/fontawesome-free@^5.15.3": - version "5.15.3" - resolved "https://registry.yarnpkg.com/@fortawesome/fontawesome-free/-/fontawesome-free-5.15.3.tgz#c36ffa64a2a239bf948541a97b6ae8d729e09a9a" - integrity sha512-rFnSUN/QOtnOAgqFRooTA3H57JLDm0QEG/jPdk+tLQNL/eWd+Aok8g3qCI+Q1xuDPWpGW/i9JySpJVsq8Q0s9w== + +"@mdi/svg@^5.9.55": + version "5.9.55" + resolved "https://registry.yarnpkg.com/@mdi/svg/-/svg-5.9.55.tgz#7cba058135afd5d8a3da977f51b71ffc6a3a3699" + integrity sha512-gO0ZpKIeCn9vFg46QduK9MM+n1fuCNwSdcdlBTtbafnnuvwLveK2uj+byhdLtg/8VJGXDhp+DJ35QUMbeWeULA== "@jest/types@^27.0.0-next.8": version "27.0.0-next.8" From 0963d53e0c26bbc6f62ce1efe1dbe64dcafa7191 Mon Sep 17 00:00:00 2001 From: Henrik Giesel Date: Mon, 29 Mar 2021 17:32:43 +0200 Subject: [PATCH 05/97] Add color.ts for foreground color and color picker --- ts/editor-toolbar/BUILD.bazel | 9 +++++++ ts/editor-toolbar/ButtonBar.svelte | 4 +++- ts/editor-toolbar/ButtonBarOuter.svelte | 4 +++- ts/editor-toolbar/ButtonItem.svelte | 4 +++- ts/editor-toolbar/ColorPicker.svelte | 25 ++++++++++++++++++++ ts/editor-toolbar/EditorToolbar.svelte | 8 ++++--- ts/editor-toolbar/IconButton.svelte | 11 +++++++-- ts/editor-toolbar/LabelButton.svelte | 8 +++---- ts/editor-toolbar/_buttons.scss | 11 --------- ts/editor-toolbar/color.scss | 17 ++++++++++++++ ts/editor-toolbar/color.ts | 31 +++++++++++++++++++++++++ 11 files changed, 108 insertions(+), 24 deletions(-) create mode 100644 ts/editor-toolbar/ColorPicker.svelte create mode 100644 ts/editor-toolbar/color.scss create mode 100644 ts/editor-toolbar/color.ts diff --git a/ts/editor-toolbar/BUILD.bazel b/ts/editor-toolbar/BUILD.bazel index 8b1962116..b27308da8 100644 --- a/ts/editor-toolbar/BUILD.bazel +++ b/ts/editor-toolbar/BUILD.bazel @@ -3,6 +3,7 @@ load("//ts/svelte:svelte.bzl", "compile_svelte", "svelte_check") load("//ts:prettier.bzl", "prettier_test") load("//ts:eslint.bzl", "eslint_test") load("//ts:esbuild.bzl", "esbuild") +load("@io_bazel_rules_sass//:defs.bzl", "sass_binary") load("//ts:vendor.bzl", "copy_bootstrap_icons", "copy_mdi_icons") svelte_files = glob(["*.svelte"]) @@ -14,6 +15,12 @@ compile_svelte( srcs = svelte_files, ) +sass_binary( + name = "color_css", + src = "color.scss", + visibility = ["//visibility:public"], +) + ts_library( name = "index", srcs = ["index.ts"], @@ -35,6 +42,7 @@ ts_library( deps = [ "//ts/lib", "//ts/lib:backend_proto", + "//ts:image_module_support", "@npm//svelte", ], ) @@ -86,6 +94,7 @@ esbuild( "//ts:image_module_support", "bootstrap-icons", "mdi-icons", + ":color_css", ] + svelte_names, ) diff --git a/ts/editor-toolbar/ButtonBar.svelte b/ts/editor-toolbar/ButtonBar.svelte index 0842a70ba..8dc94e964 100644 --- a/ts/editor-toolbar/ButtonBar.svelte +++ b/ts/editor-toolbar/ButtonBar.svelte @@ -5,4 +5,6 @@ } -
    +
      + +
    diff --git a/ts/editor-toolbar/ButtonBarOuter.svelte b/ts/editor-toolbar/ButtonBarOuter.svelte index 064d60c4c..48231e41f 100644 --- a/ts/editor-toolbar/ButtonBarOuter.svelte +++ b/ts/editor-toolbar/ButtonBarOuter.svelte @@ -14,4 +14,6 @@ } -
    +
    + +
    diff --git a/ts/editor-toolbar/ButtonItem.svelte b/ts/editor-toolbar/ButtonItem.svelte index 88b9f924b..e3894af49 100644 --- a/ts/editor-toolbar/ButtonItem.svelte +++ b/ts/editor-toolbar/ButtonItem.svelte @@ -4,4 +4,6 @@ } -
  • +
  • + +
  • diff --git a/ts/editor-toolbar/ColorPicker.svelte b/ts/editor-toolbar/ColorPicker.svelte new file mode 100644 index 000000000..c4a950225 --- /dev/null +++ b/ts/editor-toolbar/ColorPicker.svelte @@ -0,0 +1,25 @@ + + + + + + + diff --git a/ts/editor-toolbar/EditorToolbar.svelte b/ts/editor-toolbar/EditorToolbar.svelte index f355e9e4e..e6e802d48 100644 --- a/ts/editor-toolbar/EditorToolbar.svelte +++ b/ts/editor-toolbar/EditorToolbar.svelte @@ -14,11 +14,12 @@ import bracketsIcon from "./code-brackets.svg"; import eraserIcon from "./eraser.svg"; - import squareFillIcon from "./square-fill.svg"; import paperclipIcon from "./paperclip.svg"; import micIcon from "./mic.svg"; import threeDotsIcon from "./three-dots.svg"; + import { forecolorButton, colorpickerButton } from "./color"; + export let leftButtons = [ { component: LabelButton, label: "Fields..." }, { component: LabelButton, label: "Cards..." }, @@ -33,8 +34,9 @@ { component: IconButton, icon: subscriptIcon }, { component: IconButton, icon: eraserIcon }, - { component: IconButton, icon: squareFillIcon }, - { component: IconButton, icon: squareFillIcon }, + + forecolorButton, + colorpickerButton, { component: IconButton, icon: bracketsIcon }, { component: IconButton, icon: paperclipIcon }, diff --git a/ts/editor-toolbar/IconButton.svelte b/ts/editor-toolbar/IconButton.svelte index a98934be4..133128a3d 100644 --- a/ts/editor-toolbar/IconButton.svelte +++ b/ts/editor-toolbar/IconButton.svelte @@ -3,6 +3,7 @@ export let className: string; export let icon: string; + export let onClick: (event: ClickEvent) => void; - {@html icon} + + {#if icon} + {@html icon} + {/if} + diff --git a/ts/editor-toolbar/LabelButton.svelte b/ts/editor-toolbar/LabelButton.svelte index b158383a7..5271eb8ba 100644 --- a/ts/editor-toolbar/LabelButton.svelte +++ b/ts/editor-toolbar/LabelButton.svelte @@ -7,17 +7,15 @@ - + diff --git a/ts/editor-toolbar/_buttons.scss b/ts/editor-toolbar/_buttons.scss index 0ad2baf32..bdb515e5b 100644 --- a/ts/editor-toolbar/_buttons.scss +++ b/ts/editor-toolbar/_buttons.scss @@ -1,14 +1,3 @@ -.rainbow { - background-image: -webkit-gradient( - linear, - left top, - left bottom, - color-stop(0, #f77), - color-stop(50%, #7f7), - color-stop(100%, #77f) - ); -} - button.linkb { -webkit-appearance: none; margin-bottom: -3px; diff --git a/ts/editor-toolbar/color.scss b/ts/editor-toolbar/color.scss new file mode 100644 index 000000000..f9d459eea --- /dev/null +++ b/ts/editor-toolbar/color.scss @@ -0,0 +1,17 @@ +:root { + --foreground-color: black; +} + +.forecolor { + color: var(--foreground-color); +} + +.rainbow { + background: linear-gradient(217deg, rgba(255, 0, 0, 0.8), rgba(255, 0, 0, 0) 70.71%), + linear-gradient(127deg, rgba(0, 255, 0, 0.8), rgba(0, 255, 0, 0) 70.71%), + linear-gradient(336deg, rgba(0, 0, 255, 0.8), rgba(0, 0, 255, 0) 70.71%); + + background-clip: content-box; + /* Boostrap .rounded has .25rem */ + border-radius: 0.375rem; +} diff --git a/ts/editor-toolbar/color.ts b/ts/editor-toolbar/color.ts new file mode 100644 index 000000000..c03ce380c --- /dev/null +++ b/ts/editor-toolbar/color.ts @@ -0,0 +1,31 @@ +import IconButton from "./IconButton.svelte"; +import ColorPicker from "./ColorPicker.svelte"; +import squareFillIcon from "./square-fill.svg"; +import "./color.css"; + +const foregroundColorKeyword = "--foreground-color"; + +function setForegroundColor(color: string): void { + document.documentElement.style.setProperty(foregroundColorKeyword, color); +} + +function getForecolor(): string { + return document.documentElement.style.getPropertyValue(foregroundColorKeyword); +} + +function wrapWithForecolor(color: string): void { + document.execCommand("forecolor", false, color); +} + +export const forecolorButton = { + component: IconButton, + icon: squareFillIcon, + className: "forecolor p-1", + onClick: () => wrapWithForecolor(getForecolor()), +}; + +export const colorpickerButton = { + component: ColorPicker, + className: "rainbow p-1", + onChange: ({ currentTarget }) => setForegroundColor(currentTarget.value), +}; From ccb7c5d68a839c67797e21e6cceba797b990bea9 Mon Sep 17 00:00:00 2001 From: Henrik Giesel Date: Mon, 29 Mar 2021 21:05:30 +0200 Subject: [PATCH 06/97] Add CommandIconButton functionality --- ts/editor-toolbar/ColorPicker.svelte | 14 +++++- ts/editor-toolbar/CommandIconButton.svelte | 57 ++++++++++++++++++++++ ts/editor-toolbar/EditorToolbar.svelte | 29 ++++++----- ts/editor-toolbar/IconButton.svelte | 29 +++-------- ts/editor-toolbar/IconButtonInner.svelte | 36 ++++++++++++++ ts/editor-toolbar/_buttons.scss | 13 ----- ts/editor-toolbar/format.ts | 48 ++++++++++++++++++ 7 files changed, 173 insertions(+), 53 deletions(-) create mode 100644 ts/editor-toolbar/CommandIconButton.svelte create mode 100644 ts/editor-toolbar/IconButtonInner.svelte create mode 100644 ts/editor-toolbar/format.ts diff --git a/ts/editor-toolbar/ColorPicker.svelte b/ts/editor-toolbar/ColorPicker.svelte index c4a950225..38b78965e 100644 --- a/ts/editor-toolbar/ColorPicker.svelte +++ b/ts/editor-toolbar/ColorPicker.svelte @@ -6,11 +6,19 @@ - + diff --git a/ts/editor-toolbar/CommandIconButton.svelte b/ts/editor-toolbar/CommandIconButton.svelte new file mode 100644 index 000000000..e5f19189b --- /dev/null +++ b/ts/editor-toolbar/CommandIconButton.svelte @@ -0,0 +1,57 @@ + + + + + + + {@html icon} + + diff --git a/ts/editor-toolbar/EditorToolbar.svelte b/ts/editor-toolbar/EditorToolbar.svelte index e6e802d48..7de984a03 100644 --- a/ts/editor-toolbar/EditorToolbar.svelte +++ b/ts/editor-toolbar/EditorToolbar.svelte @@ -5,19 +5,20 @@ import LabelButton from "./LabelButton.svelte"; import IconButton from "./IconButton.svelte"; - import boldIcon from "./type-bold.svg"; - import italicIcon from "./type-italic.svg"; - import underlineIcon from "./type-underline.svg"; - - import superscriptIcon from "./format-superscript.svg"; - import subscriptIcon from "./format-subscript.svg"; import bracketsIcon from "./code-brackets.svg"; - import eraserIcon from "./eraser.svg"; import paperclipIcon from "./paperclip.svg"; import micIcon from "./mic.svg"; import threeDotsIcon from "./three-dots.svg"; + import { + boldButton, + italicButton, + underlineButton, + superscriptButton, + subscriptButton, + eraserButton, + } from "./format"; import { forecolorButton, colorpickerButton } from "./color"; export let leftButtons = [ @@ -26,14 +27,12 @@ ]; export let rightButtons = [ - { component: IconButton, icon: boldIcon }, - { component: IconButton, icon: italicIcon }, - { component: IconButton, icon: underlineIcon }, - - { component: IconButton, icon: superscriptIcon }, - { component: IconButton, icon: subscriptIcon }, - - { component: IconButton, icon: eraserIcon }, + boldButton, + italicButton, + underlineButton, + superscriptButton, + subscriptButton, + eraserButton, forecolorButton, colorpickerButton, diff --git a/ts/editor-toolbar/IconButton.svelte b/ts/editor-toolbar/IconButton.svelte index 133128a3d..443ad0055 100644 --- a/ts/editor-toolbar/IconButton.svelte +++ b/ts/editor-toolbar/IconButton.svelte @@ -1,31 +1,14 @@ - - - - {#if icon} - {@html icon} - {/if} - + + {@html icon} + diff --git a/ts/editor-toolbar/IconButtonInner.svelte b/ts/editor-toolbar/IconButtonInner.svelte new file mode 100644 index 000000000..f98b0ccef --- /dev/null +++ b/ts/editor-toolbar/IconButtonInner.svelte @@ -0,0 +1,36 @@ + + + + + diff --git a/ts/editor-toolbar/_buttons.scss b/ts/editor-toolbar/_buttons.scss index bdb515e5b..42250394a 100644 --- a/ts/editor-toolbar/_buttons.scss +++ b/ts/editor-toolbar/_buttons.scss @@ -10,10 +10,6 @@ button.linkb { opacity: 0.3; cursor: not-allowed; } - - .nightMode & > img { - filter: invert(180); - } } button:focus { @@ -28,13 +24,4 @@ button.highlighted { background: linear-gradient(0deg, #333333 0%, #434343 100%); } } - - #topbutsright & { - border-bottom: 3px solid black; - border-radius: 3px; - - .nightMode & { - border-bottom-color: white; - } - } } diff --git a/ts/editor-toolbar/format.ts b/ts/editor-toolbar/format.ts new file mode 100644 index 000000000..ddf656fca --- /dev/null +++ b/ts/editor-toolbar/format.ts @@ -0,0 +1,48 @@ +// @ts-ignore +import CommandIconButton, { updateButtons } from "./CommandIconButton.svelte"; +import boldIcon from "./type-bold.svg"; +import italicIcon from "./type-italic.svg"; +import underlineIcon from "./type-underline.svg"; +import superscriptIcon from "./format-superscript.svg"; +import subscriptIcon from "./format-subscript.svg"; +import eraserIcon from "./eraser.svg"; + +export const boldButton = { + component: CommandIconButton, + icon: boldIcon, + command: "bold", +}; + +export const italicButton = { + component: CommandIconButton, + icon: italicIcon, + command: "italic", +}; + +export const underlineButton = { + component: CommandIconButton, + icon: underlineIcon, + command: "underline", +}; + +export const superscriptButton = { + component: CommandIconButton, + icon: superscriptIcon, + command: "superscript", +}; + +export const subscriptButton = { + component: CommandIconButton, + icon: subscriptIcon, + command: "subscript", +}; + +export const eraserButton = { + component: CommandIconButton, + icon: eraserIcon, + command: "removeFormat", + highlightable: false, +}; + +// TODO +setInterval(updateButtons, 2000); From 9563da37d3b22ffa659ffe94b69b51e204bcb5ab Mon Sep 17 00:00:00 2001 From: Henrik Giesel Date: Mon, 29 Mar 2021 21:48:31 +0200 Subject: [PATCH 07/97] Add ButtonGroup for grouping of toolbar items --- ts/editor-toolbar/ButtonBar.svelte | 2 +- ts/editor-toolbar/ButtonGroup.svelte | 33 ++++++++++++++++ ts/editor-toolbar/EditorToolbar.svelte | 52 ++++++++++++++++---------- 3 files changed, 66 insertions(+), 21 deletions(-) create mode 100644 ts/editor-toolbar/ButtonGroup.svelte diff --git a/ts/editor-toolbar/ButtonBar.svelte b/ts/editor-toolbar/ButtonBar.svelte index 8dc94e964..0a7610475 100644 --- a/ts/editor-toolbar/ButtonBar.svelte +++ b/ts/editor-toolbar/ButtonBar.svelte @@ -1,6 +1,6 @@ diff --git a/ts/editor-toolbar/ButtonGroup.svelte b/ts/editor-toolbar/ButtonGroup.svelte new file mode 100644 index 000000000..0d9b7f9a2 --- /dev/null +++ b/ts/editor-toolbar/ButtonGroup.svelte @@ -0,0 +1,33 @@ + + + + + +
      + +
    +
    diff --git a/ts/editor-toolbar/EditorToolbar.svelte b/ts/editor-toolbar/EditorToolbar.svelte index 7de984a03..92b927617 100644 --- a/ts/editor-toolbar/EditorToolbar.svelte +++ b/ts/editor-toolbar/EditorToolbar.svelte @@ -1,6 +1,7 @@ - + {@html icon} - + diff --git a/ts/editor-toolbar/IconButton.svelte b/ts/editor-toolbar/IconButton.svelte index 443ad0055..5588ddbc7 100644 --- a/ts/editor-toolbar/IconButton.svelte +++ b/ts/editor-toolbar/IconButton.svelte @@ -1,6 +1,6 @@ - + {@html icon} - + diff --git a/ts/editor-toolbar/IconButtonInner.svelte b/ts/editor-toolbar/InnerButton.svelte similarity index 55% rename from ts/editor-toolbar/IconButtonInner.svelte rename to ts/editor-toolbar/InnerButton.svelte index 23b51c82d..3df207d4c 100644 --- a/ts/editor-toolbar/IconButtonInner.svelte +++ b/ts/editor-toolbar/InnerButton.svelte @@ -1,17 +1,19 @@ - From 8c931af17c52e649dc8199fa0bc60ea3c61c594c Mon Sep 17 00:00:00 2001 From: Henrik Giesel Date: Mon, 29 Mar 2021 23:43:48 +0200 Subject: [PATCH 11/97] Make all Leaf buttons 30px high and give same vertical-align --- ts/editor-toolbar/ColorPicker.svelte | 2 +- ts/editor-toolbar/InnerButton.svelte | 14 +++++++------- ts/editor-toolbar/LabelButton.svelte | 6 +++++- 3 files changed, 13 insertions(+), 9 deletions(-) diff --git a/ts/editor-toolbar/ColorPicker.svelte b/ts/editor-toolbar/ColorPicker.svelte index ff02a15fd..eec03047f 100644 --- a/ts/editor-toolbar/ColorPicker.svelte +++ b/ts/editor-toolbar/ColorPicker.svelte @@ -8,10 +8,10 @@ diff --git a/ts/editor-toolbar/ButtonItem.svelte b/ts/editor-toolbar/ButtonItem.svelte index e3894af49..82eeda646 100644 --- a/ts/editor-toolbar/ButtonItem.svelte +++ b/ts/editor-toolbar/ButtonItem.svelte @@ -1,6 +1,7 @@ diff --git a/ts/editor-toolbar/EditorToolbar.svelte b/ts/editor-toolbar/EditorToolbar.svelte index 92b927617..2d4d2f758 100644 --- a/ts/editor-toolbar/EditorToolbar.svelte +++ b/ts/editor-toolbar/EditorToolbar.svelte @@ -22,14 +22,11 @@ } from "./format"; import { forecolorButton, colorpickerButton } from "./color"; - export let leftButtons = [ + export let buttons = [ [ { component: LabelButton, label: "Fields..." }, { component: LabelButton, label: "Cards..." }, ], - ]; - - export let rightButtons = [ [ boldButton, italicButton, @@ -53,20 +50,10 @@ - {#each leftButtons as leftGroup} + {#each buttons as group} - {#each leftGroup as leftButton} - - {/each} - - {/each} - - - - {#each rightButtons as rightGroup} - - {#each rightGroup as rightButton} - + {#each group as button} + {/each} {/each} From bf433f13be8b2f5d1b0b2ddee25f3e5e6e2f834a Mon Sep 17 00:00:00 2001 From: Henrik Giesel Date: Tue, 30 Mar 2021 00:51:44 +0200 Subject: [PATCH 13/97] Simplify General Toolbar structure --- ts/editor-toolbar/ButtonBar.svelte | 10 ---- ts/editor-toolbar/ButtonBarOuter.svelte | 19 -------- ts/editor-toolbar/ButtonGroup.svelte | 53 +++++++++++++++------- ts/editor-toolbar/ButtonItem.svelte | 10 ---- ts/editor-toolbar/ColorPicker.svelte | 10 ++-- ts/editor-toolbar/CommandIconButton.svelte | 9 ++-- ts/editor-toolbar/EditorToolbar.svelte | 31 +++++++------ ts/editor-toolbar/IconButton.svelte | 9 ++-- ts/editor-toolbar/LabelButton.svelte | 6 +-- ts/editor/editable.scss | 3 ++ ts/editor/editingArea.ts | 2 +- 11 files changed, 69 insertions(+), 93 deletions(-) delete mode 100644 ts/editor-toolbar/ButtonBar.svelte delete mode 100644 ts/editor-toolbar/ButtonBarOuter.svelte delete mode 100644 ts/editor-toolbar/ButtonItem.svelte diff --git a/ts/editor-toolbar/ButtonBar.svelte b/ts/editor-toolbar/ButtonBar.svelte deleted file mode 100644 index 50e1d9601..000000000 --- a/ts/editor-toolbar/ButtonBar.svelte +++ /dev/null @@ -1,10 +0,0 @@ - - -
      - -
    diff --git a/ts/editor-toolbar/ButtonBarOuter.svelte b/ts/editor-toolbar/ButtonBarOuter.svelte deleted file mode 100644 index 48231e41f..000000000 --- a/ts/editor-toolbar/ButtonBarOuter.svelte +++ /dev/null @@ -1,19 +0,0 @@ - - -
    - -
    diff --git a/ts/editor-toolbar/ButtonGroup.svelte b/ts/editor-toolbar/ButtonGroup.svelte index 2b531f5b1..4bb2d857a 100644 --- a/ts/editor-toolbar/ButtonGroup.svelte +++ b/ts/editor-toolbar/ButtonGroup.svelte @@ -1,34 +1,55 @@ - -
      - -
    -
    +
      + {#each buttons as button} +
    • + {#if Array.isArray(button)} + + {:else} + + {/if} +
    • + {/each} +
    diff --git a/ts/editor-toolbar/ButtonItem.svelte b/ts/editor-toolbar/ButtonItem.svelte deleted file mode 100644 index 82eeda646..000000000 --- a/ts/editor-toolbar/ButtonItem.svelte +++ /dev/null @@ -1,10 +0,0 @@ - - -
  • - -
  • diff --git a/ts/editor-toolbar/ColorPicker.svelte b/ts/editor-toolbar/ColorPicker.svelte index eec03047f..6ccc7ca20 100644 --- a/ts/editor-toolbar/ColorPicker.svelte +++ b/ts/editor-toolbar/ColorPicker.svelte @@ -1,6 +1,4 @@ @@ -28,8 +26,6 @@ } - - - + diff --git a/ts/editor-toolbar/CommandIconButton.svelte b/ts/editor-toolbar/CommandIconButton.svelte index 6e417fce3..2513c04bf 100644 --- a/ts/editor-toolbar/CommandIconButton.svelte +++ b/ts/editor-toolbar/CommandIconButton.svelte @@ -26,7 +26,6 @@ - - - {@html icon} - - + + {@html icon} + diff --git a/ts/editor-toolbar/EditorToolbar.svelte b/ts/editor-toolbar/EditorToolbar.svelte index 2d4d2f758..ede95cab5 100644 --- a/ts/editor-toolbar/EditorToolbar.svelte +++ b/ts/editor-toolbar/EditorToolbar.svelte @@ -1,6 +1,4 @@ - - - {#each buttons as group} - - {#each group as button} - - {/each} - - {/each} - - + + +
    + +
    diff --git a/ts/editor-toolbar/IconButton.svelte b/ts/editor-toolbar/IconButton.svelte index 5588ddbc7..613a53433 100644 --- a/ts/editor-toolbar/IconButton.svelte +++ b/ts/editor-toolbar/IconButton.svelte @@ -1,5 +1,4 @@ - - - {@html icon} - - + + {@html icon} + diff --git a/ts/editor-toolbar/LabelButton.svelte b/ts/editor-toolbar/LabelButton.svelte index 89c3488af..5e7c34049 100644 --- a/ts/editor-toolbar/LabelButton.svelte +++ b/ts/editor-toolbar/LabelButton.svelte @@ -1,6 +1,4 @@ @@ -20,6 +18,4 @@ } - - - + diff --git a/ts/editor/editable.scss b/ts/editor/editable.scss index 9cd7186f3..8a2e9e374 100644 --- a/ts/editor/editable.scss +++ b/ts/editor/editable.scss @@ -6,6 +6,9 @@ anki-editable { overflow: auto; padding: 6px; + /* Fit bootstraps .rounded */ + border-radius: 0.25rem; + &:empty::after { content: "\a"; white-space: pre; diff --git a/ts/editor/editingArea.ts b/ts/editor/editingArea.ts index 737493f6b..3db206d6e 100644 --- a/ts/editor/editingArea.ts +++ b/ts/editor/editingArea.ts @@ -24,7 +24,7 @@ export class EditingArea extends HTMLDivElement { constructor() { super(); this.attachShadow({ mode: "open" }); - this.className = "field"; + this.className = "field rounded"; const rootStyle = document.createElement("link"); rootStyle.setAttribute("rel", "stylesheet"); From 2f808fe60c3a3004af4a0ba60c6194d7100eb2c3 Mon Sep 17 00:00:00 2001 From: Henrik Giesel Date: Tue, 30 Mar 2021 01:23:39 +0200 Subject: [PATCH 14/97] Move initialization logic from EditorToolbar to index.ts --- ts/editor-toolbar/ButtonGroup.svelte | 6 ++- ts/editor-toolbar/EditorToolbar.svelte | 54 +++++++------------------- ts/editor-toolbar/extra.ts | 10 +++++ ts/editor-toolbar/index.ts | 33 ++++++++++++++++ 4 files changed, 61 insertions(+), 42 deletions(-) create mode 100644 ts/editor-toolbar/extra.ts diff --git a/ts/editor-toolbar/ButtonGroup.svelte b/ts/editor-toolbar/ButtonGroup.svelte index 4bb2d857a..a2b07fa8b 100644 --- a/ts/editor-toolbar/ButtonGroup.svelte +++ b/ts/editor-toolbar/ButtonGroup.svelte @@ -1,8 +1,10 @@ - + diff --git a/ts/editor-toolbar/EditorToolbar.svelte b/ts/editor-toolbar/EditorToolbar.svelte index ede95cab5..de2d7a7e5 100644 --- a/ts/editor-toolbar/EditorToolbar.svelte +++ b/ts/editor-toolbar/EditorToolbar.svelte @@ -1,46 +1,8 @@ @@ -44,7 +44,7 @@ let active = false; if (activatable) { - updateButton(command); + initializeButton(command); commandMap.subscribe((map: Record): void => { active = map.get(command); diff --git a/ts/editor-toolbar/EditorToolbar.svelte b/ts/editor-toolbar/EditorToolbar.svelte index 51c101347..4fef8b702 100644 --- a/ts/editor-toolbar/EditorToolbar.svelte +++ b/ts/editor-toolbar/EditorToolbar.svelte @@ -1,11 +1,17 @@ - diff --git a/ts/editor-toolbar/DropdownIconButton.svelte b/ts/editor-toolbar/DropdownIconButton.svelte new file mode 100644 index 000000000..f03a8dce8 --- /dev/null +++ b/ts/editor-toolbar/DropdownIconButton.svelte @@ -0,0 +1,25 @@ + + + diff --git a/ts/editor-toolbar/DropdownItem.svelte b/ts/editor-toolbar/DropdownItem.svelte new file mode 100644 index 000000000..4ea91de2f --- /dev/null +++ b/ts/editor-toolbar/DropdownItem.svelte @@ -0,0 +1,14 @@ + + +
  • + +
  • diff --git a/ts/editor-toolbar/EditorToolbar.svelte b/ts/editor-toolbar/EditorToolbar.svelte index 4fef8b702..5336136b2 100644 --- a/ts/editor-toolbar/EditorToolbar.svelte +++ b/ts/editor-toolbar/EditorToolbar.svelte @@ -1,4 +1,5 @@ -
    + + +
    + diff --git a/ts/editor-toolbar/index.ts b/ts/editor-toolbar/index.ts index 71f65f0d3..dff93d5c0 100644 --- a/ts/editor-toolbar/index.ts +++ b/ts/editor-toolbar/index.ts @@ -6,6 +6,7 @@ import { setupI18n, ModuleName } from "anki/i18n"; import EditorToolbarSvelte from "./EditorToolbar.svelte"; import LabelButton from "./LabelButton.svelte"; +import DropdownIconButton from "./DropdownIconButton.svelte"; // @ts-ignore export { updateActiveButtons, clearActiveButtons } from "./CommandIconButton.svelte"; @@ -45,6 +46,8 @@ const defaultButtons = [ ], [forecolorButton, colorpickerButton], [attachmentButton, recordButton, clozeButton, mathjaxButton, htmlButton], + [ { component: DropdownIconButton }], + ]; class EditorToolbar extends HTMLElement { From 391f64f64842aab15fd7b8a362861d35683d6d77 Mon Sep 17 00:00:00 2001 From: Henrik Giesel Date: Tue, 30 Mar 2021 18:57:50 +0200 Subject: [PATCH 24/97] Make it so you can include DropdownMenus on all kinds of buttons --- ts/editor-toolbar/ButtonGroup.svelte | 8 +--- ts/editor-toolbar/ColorPicker.svelte | 21 +++++---- ts/editor-toolbar/CommandIconButton.svelte | 9 ++-- ts/editor-toolbar/DropdownIconButton.svelte | 25 ---------- ts/editor-toolbar/DropdownMenu.svelte | 40 ++++++++++++++++ ts/editor-toolbar/EditorToolbar.svelte | 4 +- ts/editor-toolbar/IconButton.svelte | 9 ++-- ts/editor-toolbar/LabelButton.svelte | 47 +++++++++++++++++-- ...InnerButton.svelte => SquareButton.svelte} | 47 +++++++++++++------ ts/editor-toolbar/color.scss | 14 +++--- ts/editor-toolbar/color.ts | 4 +- ts/editor-toolbar/index.ts | 26 +++++----- ts/editor-toolbar/types.ts | 12 +++++ 13 files changed, 178 insertions(+), 88 deletions(-) delete mode 100644 ts/editor-toolbar/DropdownIconButton.svelte create mode 100644 ts/editor-toolbar/DropdownMenu.svelte rename ts/editor-toolbar/{InnerButton.svelte => SquareButton.svelte} (75%) create mode 100644 ts/editor-toolbar/types.ts diff --git a/ts/editor-toolbar/ButtonGroup.svelte b/ts/editor-toolbar/ButtonGroup.svelte index e139adfcd..9a9d876c6 100644 --- a/ts/editor-toolbar/ButtonGroup.svelte +++ b/ts/editor-toolbar/ButtonGroup.svelte @@ -1,10 +1,6 @@ - - diff --git a/ts/editor-toolbar/ColorPicker.svelte b/ts/editor-toolbar/ColorPicker.svelte index c53dbb24b..ac2a94d3e 100644 --- a/ts/editor-toolbar/ColorPicker.svelte +++ b/ts/editor-toolbar/ColorPicker.svelte @@ -1,15 +1,14 @@ - diff --git a/ts/editor-toolbar/CommandIconButton.svelte b/ts/editor-toolbar/CommandIconButton.svelte index b5efcaaa0..2d5232191 100644 --- a/ts/editor-toolbar/CommandIconButton.svelte +++ b/ts/editor-toolbar/CommandIconButton.svelte @@ -34,9 +34,12 @@ - + {@html icon} - + diff --git a/ts/editor-toolbar/DropdownIconButton.svelte b/ts/editor-toolbar/DropdownIconButton.svelte deleted file mode 100644 index f03a8dce8..000000000 --- a/ts/editor-toolbar/DropdownIconButton.svelte +++ /dev/null @@ -1,25 +0,0 @@ - - - diff --git a/ts/editor-toolbar/DropdownMenu.svelte b/ts/editor-toolbar/DropdownMenu.svelte new file mode 100644 index 000000000..d800a240d --- /dev/null +++ b/ts/editor-toolbar/DropdownMenu.svelte @@ -0,0 +1,40 @@ + + + diff --git a/ts/editor-toolbar/EditorToolbar.svelte b/ts/editor-toolbar/EditorToolbar.svelte index 5336136b2..33b00b8b8 100644 --- a/ts/editor-toolbar/EditorToolbar.svelte +++ b/ts/editor-toolbar/EditorToolbar.svelte @@ -5,7 +5,7 @@ import { disabledKey, nightModeKey } from "./contextKeys"; import ButtonGroup from "./ButtonGroup.svelte"; - import type { Buttons } from "./ButtonGroup.svelte"; + import type { Buttons } from "./types"; export let buttons: Buttons = []; export let nightMode: boolean; @@ -25,7 +25,7 @@ background: var(--bg-color); border-bottom: 1px solid var(--border); - /* Remove most outer marigns */ + /* Remove outermost marigns */ & > :global(ul) { & > :global(li:nth-child(1)) { margin-left: 0; diff --git a/ts/editor-toolbar/IconButton.svelte b/ts/editor-toolbar/IconButton.svelte index 613a53433..fc5960f48 100644 --- a/ts/editor-toolbar/IconButton.svelte +++ b/ts/editor-toolbar/IconButton.svelte @@ -1,11 +1,14 @@ - + {@html icon} - + diff --git a/ts/editor-toolbar/LabelButton.svelte b/ts/editor-toolbar/LabelButton.svelte index 9428dd568..4e366d18b 100644 --- a/ts/editor-toolbar/LabelButton.svelte +++ b/ts/editor-toolbar/LabelButton.svelte @@ -1,5 +1,27 @@ - + diff --git a/ts/editor-toolbar/InnerButton.svelte b/ts/editor-toolbar/SquareButton.svelte similarity index 75% rename from ts/editor-toolbar/InnerButton.svelte rename to ts/editor-toolbar/SquareButton.svelte index 43030ce7e..041e4548c 100644 --- a/ts/editor-toolbar/InnerButton.svelte +++ b/ts/editor-toolbar/SquareButton.svelte @@ -3,31 +3,24 @@ import type { Readable } from "svelte/store"; import { disabledKey } from "./contextKeys"; - export let className: string = ""; + export let id = ""; + export let className = ""; + export let props: Record = {}; + export let onClick: (event: ClickEvent) => void; export let active = false; - const disabledStore = getContext(disabledKey) + const disabledStore = getContext(disabledKey); $: disabled = $disabledStore; diff --git a/ts/editor-toolbar/color.scss b/ts/editor-toolbar/color.scss index f9d459eea..6e6077eb4 100644 --- a/ts/editor-toolbar/color.scss +++ b/ts/editor-toolbar/color.scss @@ -7,11 +7,11 @@ } .rainbow { - background: linear-gradient(217deg, rgba(255, 0, 0, 0.8), rgba(255, 0, 0, 0) 70.71%), - linear-gradient(127deg, rgba(0, 255, 0, 0.8), rgba(0, 255, 0, 0) 70.71%), - linear-gradient(336deg, rgba(0, 0, 255, 0.8), rgba(0, 0, 255, 0) 70.71%); - - background-clip: content-box; - /* Boostrap .rounded has .25rem */ - border-radius: 0.375rem; + background: content-box + linear-gradient(217deg, rgba(255, 0, 0, 0.8), rgba(255, 0, 0, 0) 70.71%), + content-box + linear-gradient(127deg, rgba(0, 255, 0, 0.8), rgba(0, 255, 0, 0) 70.71%), + content-box + linear-gradient(336deg, rgba(0, 0, 255, 0.8), rgba(0, 0, 255, 0) 70.71%), + border-box white; } diff --git a/ts/editor-toolbar/color.ts b/ts/editor-toolbar/color.ts index c03ce380c..862cb7801 100644 --- a/ts/editor-toolbar/color.ts +++ b/ts/editor-toolbar/color.ts @@ -20,12 +20,12 @@ function wrapWithForecolor(color: string): void { export const forecolorButton = { component: IconButton, icon: squareFillIcon, - className: "forecolor p-1", + className: "forecolor", onClick: () => wrapWithForecolor(getForecolor()), }; export const colorpickerButton = { component: ColorPicker, - className: "rainbow p-1", + className: "rainbow", onChange: ({ currentTarget }) => setForegroundColor(currentTarget.value), }; diff --git a/ts/editor-toolbar/index.ts b/ts/editor-toolbar/index.ts index dff93d5c0..bee5b626f 100644 --- a/ts/editor-toolbar/index.ts +++ b/ts/editor-toolbar/index.ts @@ -6,7 +6,7 @@ import { setupI18n, ModuleName } from "anki/i18n"; import EditorToolbarSvelte from "./EditorToolbar.svelte"; import LabelButton from "./LabelButton.svelte"; -import DropdownIconButton from "./DropdownIconButton.svelte"; +import DropdownMenu from "./DropdownMenu.svelte"; // @ts-ignore export { updateActiveButtons, clearActiveButtons } from "./CommandIconButton.svelte"; @@ -46,8 +46,6 @@ const defaultButtons = [ ], [forecolorButton, colorpickerButton], [attachmentButton, recordButton, clozeButton, mathjaxButton, htmlButton], - [ { component: DropdownIconButton }], - ]; class EditorToolbar extends HTMLElement { @@ -57,16 +55,18 @@ class EditorToolbar extends HTMLElement { connectedCallback(): void { this.disabled = writable(false); - setupI18n({ modules: [ModuleName.STATISTICS, ModuleName.SCHEDULING] }).then(() => { - this.component = new EditorToolbarSvelte({ - target: this, - props: { - buttons: defaultButtons, - nightMode: checkNightMode(), - disabled: this.disabled, - }, - }); - }) + setupI18n({ modules: [ModuleName.STATISTICS, ModuleName.SCHEDULING] }).then( + () => { + this.component = new EditorToolbarSvelte({ + target: this, + props: { + buttons: defaultButtons, + nightMode: checkNightMode(), + disabled: this.disabled, + }, + }); + } + ); } enableButtons(): void { diff --git a/ts/editor-toolbar/types.ts b/ts/editor-toolbar/types.ts new file mode 100644 index 000000000..0a47bda9c --- /dev/null +++ b/ts/editor-toolbar/types.ts @@ -0,0 +1,12 @@ +import type { SvelteComponent } from "svelte/internal"; + +export interface ButtonDefinition { + component: SvelteComponent; + id?: string; + className?: string; + props?: Record; + button: HTMLButtonElement; + [arg: string]: unknown; +} + +export type Buttons = ButtonDefinition | Buttons[]; From fa900e15657682b53a1cbe5e3193b401318b0869 Mon Sep 17 00:00:00 2001 From: Henrik Giesel Date: Wed, 31 Mar 2021 03:34:08 +0200 Subject: [PATCH 25/97] Add dropdown menu to mathjax button --- ts/editor-toolbar/CommandIconButton.svelte | 2 +- ts/editor-toolbar/DropdownItem.svelte | 14 ------ ts/editor-toolbar/DropdownMenu.svelte | 56 ++++++++-------------- ts/editor-toolbar/EditorToolbar.svelte | 18 ++++--- ts/editor-toolbar/IconButton.svelte | 2 +- ts/editor-toolbar/LabelButton.svelte | 3 +- ts/editor-toolbar/SquareButton.svelte | 8 +++- ts/editor-toolbar/WithDropdownMenu.svelte | 46 ++++++++++++++++++ ts/editor-toolbar/extra.ts | 7 ++- ts/editor-toolbar/index.ts | 26 +++++++--- ts/editor-toolbar/notetype.ts | 15 ++++++ 11 files changed, 124 insertions(+), 73 deletions(-) delete mode 100644 ts/editor-toolbar/DropdownItem.svelte create mode 100644 ts/editor-toolbar/WithDropdownMenu.svelte create mode 100644 ts/editor-toolbar/notetype.ts diff --git a/ts/editor-toolbar/CommandIconButton.svelte b/ts/editor-toolbar/CommandIconButton.svelte index 2d5232191..aed9e863a 100644 --- a/ts/editor-toolbar/CommandIconButton.svelte +++ b/ts/editor-toolbar/CommandIconButton.svelte @@ -60,6 +60,6 @@ } - + {@html icon} diff --git a/ts/editor-toolbar/DropdownItem.svelte b/ts/editor-toolbar/DropdownItem.svelte deleted file mode 100644 index 4ea91de2f..000000000 --- a/ts/editor-toolbar/DropdownItem.svelte +++ /dev/null @@ -1,14 +0,0 @@ - - -
  • - -
  • diff --git a/ts/editor-toolbar/DropdownMenu.svelte b/ts/editor-toolbar/DropdownMenu.svelte index d800a240d..6df513cd1 100644 --- a/ts/editor-toolbar/DropdownMenu.svelte +++ b/ts/editor-toolbar/DropdownMenu.svelte @@ -1,40 +1,26 @@ - + diff --git a/ts/editor-toolbar/EditorToolbar.svelte b/ts/editor-toolbar/EditorToolbar.svelte index 33b00b8b8..35330b03a 100644 --- a/ts/editor-toolbar/EditorToolbar.svelte +++ b/ts/editor-toolbar/EditorToolbar.svelte @@ -1,5 +1,4 @@ - +
    + {#each menus as menu} + + {/each} +