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), +};