Research
Security News
Malicious PyPI Package ‘pycord-self’ Targets Discord Developers with Token Theft and Backdoor Exploit
Socket researchers uncover the risks of a malicious Python package targeting Discord developers.
rough-notation
Advanced tools
A small JavaScript library to create and animate annotations on a web page.
Rough Notation uses RoughJS to create a hand-drawn look and feel. Elements can be annotated in a number of different styles. Animation duration can be configured, or just turned off.
Rough Notation is 3.83kb in size when gzipped.
Visit website to see it in action and check out the source code for the website
You can add rough-notation to your project via npm
npm install --save rough-notation
Or load the ES module directly
<script type="module" src="https://unpkg.com/rough-notation?module"></script>
Or load the IIFE version which created a RoughNotation
object in your scope.
<script type="module" src="https://unpkg.com/rough-notation/lib/rough-notation.iife.js"></script>
Create an annotation
object by passing the element to annotate, and a config to describe the annotation style.
Once you have the annotation object, you can call show()
on it to show the annotation
import { annotate } from 'rough-notation';
// Or using unpkg
// import { annotate } from 'https://unpkg.com/rough-notation?module';
const e = document.querySelector('#myElement');
const annotation = annotate(e, { type: 'underline' });
annotation.show();
Note: This will add an SVG element as a sibling to the element, which may be troublesome in certain situations like in a <table>
. You may want to create an inner <span>
or <div>
for the content to annotate.
rough-notation provides a way to order the animation of annotations by creating an annotation-group. Pass the list of annotations to create a group. When show is called on the group, the annotations are animated in order.
import { annotate, annotationGroup } from 'rough-notation';
const a1 = annotate(document.querySelector('#e1'), { type: 'underline' });
const a2 = annotate(document.querySelector('#e3'), { type: 'box' });
const a3 = annotate(document.querySelector('#e3'), { type: 'circle' });
const ag = annotationGroup([a3, a1, a2]);
ag.show();
I have created some basic examples on Glitch for you to remix and play with the code:
When you create an annotation object, you pass in a config. The config only has one mandatory field, which is the type
of the annotation. But you can configure the annotation in many ways.
This is a mandatory field. It sets the annotation style. Following are the list of supported annotation types:
Boolean property to turn on/off animation when annotating. Default value is true
.
Duration of the animation in milliseconds. Default is 800ms
.
String value representing the color of the annotation sketch. Default value is currentColor
.
Width of the annotation strokes. Default value is 1
.
Padding between the element and roughly where the annotation is drawn. Default value is 5
(in pixels).
If you wish to specify different top
, left
, right
, bottom
paddings, you can set the value to an array akin to CSS style padidng [top, right, bottom, left]
or just [top & bottom, left & right]
.
This property only applies to inline text. To annotate multiline text (each line separately), set this property to true
.
By default annotations are drawn in two iterations, e.g. when underlining, drawing from left to right and then back from right to left. Setting this property can let you configure the number of iterations.
Value could be a string or an array of strings, each string being one of these values: left, right, top, bottom. When drawing a bracket, this configures which side(s) of the element to bracket. Default value is right
.
When you call the annotate
function, you get back an annotation object, which has the following methods:
Returns if the annotation is showing
Draws the annotation. If the annotation is set to animate (default), it will animate the drawing. If called again, it will re-render the annotation, updating any size or location changes.
*Note: to reanimate the annotation, call hide()
and then show()
again.
Hides the annotation if showing. This is not animated.
Unlinks the annotation from the element.
All the properties in the configuration are also exposed in this object. e.g. if you'd like to change the color, you can do that after the annotation has been drawn.
const e = document.querySelector('#myElement');
const annotation = annotate(e, { type: 'underline', color: 'red' });
annotation.show();
annotation.color = 'green';
Note: the type of the annotation cannot be changed. Create a new annotation for that.
When you call the annotationGroup
function, you get back an annotation group object, which has the following methods:
Draws all the annotations in order. If the annotation is set to animate (default), it will animate the drawing.
Hides all the annotations if showing. This is not animated.
Others have created handy Rough Notation wrappers for multiple libraries and frameworks:
FAQs
Create and animate hand-drawn annotations on a web page
The npm package rough-notation receives a total of 6,258 weekly downloads. As such, rough-notation popularity was classified as popular.
We found that rough-notation demonstrated a not healthy version release cadence and project activity because the last version was released a year ago. It has 1 open source maintainer collaborating on the project.
Did you know?
Socket for GitHub automatically highlights issues in each pull request and monitors the health of all your open source dependencies. Discover the contents of your packages and block harmful activity before you install or update your dependencies.
Research
Security News
Socket researchers uncover the risks of a malicious Python package targeting Discord developers.
Security News
The UK is proposing a bold ban on ransomware payments by public entities to disrupt cybercrime, protect critical services, and lead global cybersecurity efforts.
Security News
Snyk's use of malicious npm packages for research raises ethical concerns, highlighting risks in public deployment, data exfiltration, and unauthorized testing.