Using Viselect as-is
Installation
To use Viselect without a framework, install it's vanilla package with:
sh
$ npm add -D @viselect/vanilla
sh
$ pnpm add -D @viselect/vanilla
sh
$ yarn add -D @viselect/vanilla
html
<script src="https://cdn.jsdelivr.net/npm/@viselect/vanilla/dist/viselect.umd.js"></script>
js
import SelectionArea from "https://cdn.jsdelivr.net/npm/@viselect/vanilla/dist/viselect.mjs"
Usage
As per our quickstart, you can use Viselect in your project by importing the SelectionArea
class from the @viselect/vanilla
package. For all the options available, check the API reference.
ts
import { SelectionArea } from '@viselect/vanilla';
import './styles.css';
// Generate some divs to select later
[
['.container.blue', 33],
['.container.green', 33]
].forEach(([selector, items]) => {
const container = document.querySelector(selector);
for (let i = 0; i < items; i++) {
container.appendChild(document.createElement('div'));
}
});
// Instantiate the selection area
const selection = new SelectionArea({
selectables: ['.container > div'], // Specifies the elements that can be selected
boundaries: ['.container'], // Specifies the boundaries of each selection
}).on('start', ({ store, event }) => {
if (!event.ctrlKey && !event.metaKey) { // Clear selection if no modifier key is pressed
store.stored.forEach(el => el.classList.remove('selected'));
selection.clearSelection();
}
}).on('move', ({ store: { changed: { added, removed } } }) => {
added.forEach(el => el.classList.add('selected'));
removed.forEach(el => el.classList.remove('selected'));
});
css
.container {
display: flex;
flex-wrap: wrap;
justify-content: space-evenly;
border: 1px dashed #4f5276;
border-radius: 15px;
padding: 15px;
margin: 15px 0;
user-select: none;
}
.container div {
height: 50px;
width: 50px;
margin: 3px;
background: rgba(66, 68, 90, 0.075);
border-radius: 10px;
cursor: pointer;
}
.container.green div.selected {
background: linear-gradient(45deg, #78b2ff, #218ad9);
}
.container.blue div.selected {
background: linear-gradient(45deg, #9e91ef, #5c51b4);
}
.selection-area {
background: rgba(46, 115, 252, 0.11);
border: 1px solid rgba(98, 155, 255, 0.85);
border-radius: 0.15em;
}
html
<div class="container blue"></div>
<div class="container green"></div>