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"