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