Skip to main content

Add an element palette

To create an element palette, we use the Stencil plugin of JointJS+. The plugin populates an ordinary <div> HTML element with a selection of JointJS Elements and allows the user to drag those into the Paper.

In our example, we define <div id="stencil"> to be the host HTML element for our Stencil. Note that it is our responsibility as programmers to make sure that the Stencil and Paper host HTML elements are both visible - we do that with absolute positioning specified in our example's CSS.

Let's define a Stencil that allows dragging to our paper component, uses the same shapes namespace as our Paper, and presents the element palette in a double column layout:

const stencil = new ui.Stencil({
paper: paper,
width: 170,
height: '100%',
layout: true,
dropAnimation: true
});
stencil.render();
document.getElementById('stencil').appendChild(stencil.el);

We also need to populate the Stencil with Elements. Let's choose a few of JointJS's standard shapes, which we get via the shapes namespace:

const elements = [
{
type: 'standard.Rectangle',
size: { width: 70, height: 50 },
attrs: {
body: {
stroke: '#C94A46',
rx: 2,
ry: 2
}
}
},
{
type: 'standard.Ellipse',
size: { width: 70, height: 50 },
attrs: {
body: {
stroke: '#C94A46',
}
}
},
{
type: 'standard.Polygon',
size: { width: 70, height: 50 },
attrs: {
body: {
stroke: '#C94A46',
points: 'calc(w/2),0 calc(w),calc(h/2) calc(w/2),calc(h) 0,calc(h/2)'
}
}
},
{
type: 'standard.Cylinder',
size: { width: 70, height: 50 },
attrs: {
body: {
stroke: '#C94A46',
},
top: {
fill: '#C94A46',
stroke: '#C94A46'
}
}
}
];
stencil.load(elements);
Note about imports...

Stencil is a feature of the ui module of JointJS+. We need to modify the first line of our code in order to import the module:

import { dia, shapes, ui } from '@joint/plus';

See it in action

Try dragging some Elements from the Stencil into our example Paper:

💡 Would you prefer to learn more about Element palette? We have many demos illustrating it on our Demos & examples page.