js-draw derives its colors from a set of CSS variables. By default, these variables are automatically
set based on whether the user's browser is in dark mode
(using the CSS prefers-color-scheme@media selector).
Here's a runnable example:
/* A yellowish theme! */
:root .imageEditorContainer {
/* Try changing the below values and clicking run again! */
/* Unselected buttons and dialog text. */
--background-color-1: #ffff77;
--foreground-color-1: black;
/* Some menu/toolbar backgrounds. */
--background-color-2: #ffff99;
--foreground-color-2: #111;
/* menu/toolbar backgrounds. */
--background-color-3: #ffffaa;
--foreground-color-3: #121100;
/* Used for selected buttons. */
--selection-background-color: #9f7;
--selection-foreground-color: #00f;
/* Used for dialog backgrounds */
--background-color-transparent: rgba(0, 0, 100, 0.5);
/* Used for shadows */
--shadow-color: rgba(0, 0, 0, 0.5);
/* Color used for some button/input foregrounds */
--primary-action-foreground-color: #f00;
/* Use light mode for controls. */
color-scheme: light;
}
---ts---
import { Editor, makeEdgeToolbar, makeDropdownToolbar } from 'js-draw';
import 'js-draw/styles';
import { MaterialIconProvider } from '@js-draw/material-icons';
const makeToolbar = (newToolbar: boolean, editor: Editor) => {
const toolbar = newToolbar ? makeEdgeToolbar(editor) : makeDropdownToolbar(editor);
toolbar.addDefaults();
toolbar.addExitButton(() => {
alert('Not implemented for this editor!');
});
toolbar.addSaveButton(() => {
const saveData = editor.toSVG().outerHTML;
// Do something with saveData
alert('Not implemented for this editor!');
});
return toolbar;
};
const makeEditor = async () => {
const editor = new Editor(document.body, {
iconProvider: new MaterialIconProvider(),
wheelEventsEnabled: 'only-if-focused',
});
// Template generated with https://js-draw.web.app/
await editor.loadFromSVG(`
<svg viewBox="0 0 500 500" width="500" height="500" version="1.1" baseProfile="full" xmlns="http://www.w3.org/2000/svg">
<g class="js-draw-image-background js-draw-image-background-grid js-draw-image-background-grid-25">
<path d="M500,500L500,0L0,0L0,500L500,500" fill="#f1ffa4"></path>
<path d="M0,0L500,0M0,25L500,25M0,50L500,50M0,75L500,75M0,100L500,100M0,125L500,125M0,150L500,150M0,175L500,175M0,200L500,200M0,225L500,225M0,250L500,250M0,275L500,275M0,300L500,300M0,325L500,325M0,350L500,350M0,375L500,375M0,400L500,400M0,425L500,425M0,450L500,450M0,475L500,475M0,500L500,500M0,0L0,500M25,0L25,500M50,0L50,500M75,0L75,500M100,0L100,500M125,0L125,500M150,0L150,500M175,0L175,500M200,0L200,500M225,0L225,500M250,0L250,500M275,0L275,500M300,0L300,500M325,0L325,500M350,0L350,500M375,0L375,500M400,0L400,500M425,0L425,500M450,0L450,500M475,0L475,500M500,0L500,500" fill="none" stroke="#0e005b33" stroke-width=".7"></path>
</g>
</svg>
`);
let isNewToolbar = true;
let toolbar = makeToolbar(isNewToolbar, editor);
const toolbarSelector = document.createElement('button');
toolbarSelector.innerText = 'Change toolbar type';
document.body.appendChild(toolbarSelector);
toolbarSelector.onclick = () => {
isNewToolbar = !isNewToolbar;
toolbar.remove();
toolbar = makeToolbar(isNewToolbar, editor);
};
};
makeEditor();
Notice the :root prefix — this adds specificity to the selectors to ensure that they override
the defaults.
Writing a theme for
js-draw
js-draw
derives its colors from a set of CSS variables. By default, these variables are automatically set based on whether the user's browser is in dark mode (using the CSSprefers-color-scheme
@media
selector).Here's a runnable example:
Notice the
:root
prefix — this adds specificity to the selectors to ensure that they override the defaults.See also
js-draw
: js-draw.IconProvider and "@js-draw/material-icons"