x-surface
Infinitely pannable and zoomable HTML surface as a Web Component.
npm i x-surface
|
pnpm add x-surface
|
yarn add x-surface
|
Examples
# web
# view source
example/web.tsx
/** @jsxImportSource sigl */
import { Rect } from 'sigl'
import $ from 'sigl'
import { SurfaceElement, SurfaceItemElement, SurfaceMoveElement, SurfaceResizeElement } from 'x-surface'
interface ItemElement extends $.Element<ItemElement> {}
@$.element()
class ItemElement extends $(SurfaceItemElement) {
SurfaceMove = $.element(SurfaceMoveElement)
SurfaceResize = $.element(SurfaceResizeElement)
mounted($: ItemElement['$']) {
$.render(({ host, surface, SurfaceMove, SurfaceResize }) => (
<>
<style>
{/*css*/ `
:host {
box-sizing: border-box;
border: 2px solid pink;
display: block;
position: absolute;
}
${SurfaceMove} {
background: #067;
width: 100%;
height: 20px;
position: absolute;
}
${SurfaceResize} {
background: #ba2;
position: absolute;
right: 0;
bottom: 0;
width: 20px;
height: 20px;
}
`}
</style>
<SurfaceMove surface={surface} dest={host} />
<SurfaceResize surface={surface} dest={host} />
</>
))
}
}
interface SceneElement extends $.Element<SceneElement> {}
@$.element()
class SceneElement extends HTMLElement {
Surface = $.element(SurfaceElement)
Item = $.element(ItemElement)
surface?: SurfaceElement
items = new $.RefSet<ItemElement>([
{ rect: new Rect(0, 0, 500, 500) },
{ rect: new Rect(600, 0, 500, 500) },
])
mounted($: this['$']) {
$.render(({ Surface, Item, items }) => (
<Surface ref={$.ref.surface}>
{items.map(item => <Item {x-surface.item} />)}
</Surface>
))
// $.effect(({ surface }) => {
setTimeout(() => {
const ev = new WheelEvent('wheel', {
deltaY: -800,
})
Object.defineProperty(ev, 'pageX', { value: 250 })
Object.defineProperty(ev, 'pageY', { value: 150 })
window.dispatchEvent(ev)
}, 500)
// })
}
}
const Scene = $.element(SceneElement)
$.render(
<>
<style>
{/*css*/ `
${Scene} {
display: block;
width: 100%;
height: 100%;
position: fixed;
}
`}
</style>
<Scene />
</>,
document.body
)
API
# SurfaceElement
src/surface.tsx#L273
<T>(ctx) =>
-
Wrapper<T>
},
"transition"
>> # centerView
src/surface.tsx#L326 # context
ContextClass<SurfaceElement & JsxContext<SurfaceElement> & Omit<{
<T>(ctor) =>
-
CleanClass<T>
<T>(ctx) =>
-
Wrapper<T>
},
"transition"
>> # cursorState
= ...
src/surface.tsx#L288 State<SurfaceElement, {
},
"copy"
| "default"
| "grabbing"
| "ew-resize"
| "ns-resize"
| "nwse-resize"
> & EventMethods<SurfaceElement, {
# copycancel
CustomEvent<any>
# copyend
CustomEvent<any>
# copypause
CustomEvent<any>
# copyresume
CustomEvent<any>
# copystart
CustomEvent<any>
# defaultcancel
CustomEvent<any>
# defaultend
CustomEvent<any>
# defaultpause
CustomEvent<any>
# defaultresume
CustomEvent<any>
# defaultstart
CustomEvent<any>
# ew-resizecancel
CustomEvent<any>
# ew-resizeend
CustomEvent<any>
# ew-resizepause
CustomEvent<any>
# ew-resizeresume
CustomEvent<any>
# ew-resizestart
CustomEvent<any>
# grabbingcancel
CustomEvent<any>
# grabbingend
CustomEvent<any>
# grabbingpause
CustomEvent<any>
# grabbingresume
CustomEvent<any>
# grabbingstart
CustomEvent<any>
# ns-resizecancel
CustomEvent<any>
# ns-resizeend
CustomEvent<any>
# ns-resizepause
CustomEvent<any>
# ns-resizeresume
CustomEvent<any>
# ns-resizestart
CustomEvent<any>
# nwse-resizecancel
CustomEvent<any>
# nwse-resizeend
CustomEvent<any>
# nwse-resizepause
CustomEvent<any>
# nwse-resizeresume
CustomEvent<any>
# nwse-resizestart
CustomEvent<any>
# copycancel
CustomEvent<any>
# copyend
CustomEvent<any>
# copypause
CustomEvent<any>
# copyresume
CustomEvent<any>
# copystart
CustomEvent<any>
# defaultcancel
CustomEvent<any>
# defaultend
CustomEvent<any>
# defaultpause
CustomEvent<any>
# defaultresume
CustomEvent<any>
# defaultstart
CustomEvent<any>
# ew-resizecancel
CustomEvent<any>
# ew-resizeend
CustomEvent<any>
# ew-resizepause
CustomEvent<any>
# ew-resizeresume
CustomEvent<any>
# ew-resizestart
CustomEvent<any>
# grabbingcancel
CustomEvent<any>
# grabbingend
CustomEvent<any>
# grabbingpause
CustomEvent<any>
# grabbingresume
CustomEvent<any>
# grabbingstart
CustomEvent<any>
# ns-resizecancel
CustomEvent<any>
# ns-resizeend
CustomEvent<any>
# ns-resizepause
CustomEvent<any>
# ns-resizeresume
CustomEvent<any>
# ns-resizestart
CustomEvent<any>
# nwse-resizecancel
CustomEvent<any>
# nwse-resizeend
CustomEvent<any>
# nwse-resizepause
CustomEvent<any>
# nwse-resizeresume
CustomEvent<any>
# nwse-resizestart
CustomEvent<any>
# makeFullSize
= ...
src/surface.tsx#L354 # (item)
# item
ChildOf<SurfaceItemElement> & {
}
(item) =>
- void
# onconnectend
EventHandler<SurfaceElement, CustomEvent<any>>
# onconnectstart
EventHandler<SurfaceElement, CustomEvent<any>>
# onmounted
EventHandler<SurfaceElement, CustomEvent<any>>
# onstatechange
EventHandler<SurfaceElement, CustomEvent<any>>
# onsurfacemoveitemmove
EventHandler<SurfaceElement, CustomEvent<SurfaceMoveDetail>>
# onsurfacemoveitemmoveend
EventHandler<SurfaceElement, CustomEvent<SurfaceMoveDetail>>
# onsurfacemoveitemmovestart
EventHandler<SurfaceElement, CustomEvent<SurfaceMoveDetail>>
# onsurfaceresizeitemresize
EventHandler<SurfaceElement, CustomEvent<SurfaceResizeDetail>>
# onsurfaceresizeitemresizeend
EventHandler<SurfaceElement, CustomEvent<SurfaceResizeDetail>>
# onsurfaceresizeitemresizestart
EventHandler<SurfaceElement, CustomEvent<SurfaceResizeDetail>>
# onsurfaceselecting
EventHandler<SurfaceElement, CustomEvent<{
}>>
# onunmounted
EventHandler<SurfaceElement, CustomEvent<any>>
# state
= ...
src/surface.tsx#L287 State<SurfaceElement, {
},
"surfaceselecting"
| "surfaceidle"
| "surfaceoverlay"
| "surfacecenteringitem"
| "surfacecenteringview"
| "surfaceconnecting"
| "surfacefullsize"
| "surfaceminimappanning"
| "surfacepanning"
| "surfacepinching"
| "surfacewheeling"
> & EventMethods<SurfaceElement, {
# surfacecenteringitemcancel
CustomEvent<any>
# surfacecenteringitemend
CustomEvent<any>
# surfacecenteringitempause
CustomEvent<any>
# surfacecenteringitemresume
CustomEvent<any>
# surfacecenteringitemstart
CustomEvent<any>
# surfacecenteringviewcancel
CustomEvent<any>
# surfacecenteringviewend
CustomEvent<any>
# surfacecenteringviewpause
CustomEvent<any>
# surfacecenteringviewresume
CustomEvent<any>
# surfacecenteringviewstart
CustomEvent<any>
# surfaceconnectingcancel
CustomEvent<any>
# surfaceconnectingend
CustomEvent<any>
# surfaceconnectingpause
CustomEvent<any>
# surfaceconnectingresume
CustomEvent<any>
# surfaceconnectingstart
CustomEvent<any>
# surfacefullsizecancel
CustomEvent<any>
# surfacefullsizeend
CustomEvent<any>
# surfacefullsizepause
CustomEvent<any>
# surfacefullsizeresume
CustomEvent<any>
# surfacefullsizestart
CustomEvent<any>
# surfaceidlecancel
CustomEvent<any>
# surfaceidleend
CustomEvent<any>
# surfaceidlepause
CustomEvent<any>
# surfaceidleresume
CustomEvent<any>
# surfaceidlestart
CustomEvent<any>
# surfaceminimappanningcancel
CustomEvent<any>
# surfaceminimappanningend
CustomEvent<any>
# surfaceminimappanningpause
CustomEvent<any>
# surfaceminimappanningresume
CustomEvent<any>
# surfaceminimappanningstart
CustomEvent<any>
# surfaceoverlaycancel
CustomEvent<any>
# surfaceoverlayend
CustomEvent<any>
# surfaceoverlaypause
CustomEvent<any>
# surfaceoverlayresume
CustomEvent<any>
# surfaceoverlaystart
CustomEvent<any>
# surfacepanningcancel
CustomEvent<any>
# surfacepanningend
CustomEvent<any>
# surfacepanningpause
CustomEvent<any>
# surfacepanningresume
CustomEvent<any>
# surfacepanningstart
CustomEvent<any>
# surfacepinchingcancel
CustomEvent<any>
# surfacepinchingend
CustomEvent<any>
# surfacepinchingpause
CustomEvent<any>
# surfacepinchingresume
CustomEvent<any>
# surfacepinchingstart
CustomEvent<any>
# surfaceselectingcancel
CustomEvent<any>
# surfaceselectingend
CustomEvent<any>
# surfaceselectingpause
CustomEvent<any>
# surfaceselectingresume
CustomEvent<any>
# surfaceselectingstart
CustomEvent<any>
# surfacewheelingcancel
CustomEvent<any>
# surfacewheelingend
CustomEvent<any>
# surfacewheelingpause
CustomEvent<any>
# surfacewheelingresume
CustomEvent<any>
# surfacewheelingstart
CustomEvent<any>
# surfacecenteringitemcancel
CustomEvent<any>
# surfacecenteringitemend
CustomEvent<any>
# surfacecenteringitempause
CustomEvent<any>
# surfacecenteringitemresume
CustomEvent<any>
# surfacecenteringitemstart
CustomEvent<any>
# surfacecenteringviewcancel
CustomEvent<any>
# surfacecenteringviewend
CustomEvent<any>
# surfacecenteringviewpause
CustomEvent<any>
# surfacecenteringviewresume
CustomEvent<any>
# surfacecenteringviewstart
CustomEvent<any>
# surfaceconnectingcancel
CustomEvent<any>
# surfaceconnectingend
CustomEvent<any>
# surfaceconnectingpause
CustomEvent<any>
# surfaceconnectingresume
CustomEvent<any>
# surfaceconnectingstart
CustomEvent<any>
# surfacefullsizecancel
CustomEvent<any>
# surfacefullsizeend
CustomEvent<any>
# surfacefullsizepause
CustomEvent<any>
# surfacefullsizeresume
CustomEvent<any>
# surfacefullsizestart
CustomEvent<any>
# surfaceidlecancel
CustomEvent<any>
# surfaceidleend
CustomEvent<any>
# surfaceidlepause
CustomEvent<any>
# surfaceidleresume
CustomEvent<any>
# surfaceidlestart
CustomEvent<any>
# surfaceminimappanningcancel
CustomEvent<any>
# surfaceminimappanningend
CustomEvent<any>
# surfaceminimappanningpause
CustomEvent<any>
# surfaceminimappanningresume
CustomEvent<any>
# surfaceminimappanningstart
CustomEvent<any>
# surfaceoverlaycancel
CustomEvent<any>
# surfaceoverlayend
CustomEvent<any>
# surfaceoverlaypause
CustomEvent<any>
# surfaceoverlayresume
CustomEvent<any>
# surfaceoverlaystart
CustomEvent<any>
# surfacepanningcancel
CustomEvent<any>
# surfacepanningend
CustomEvent<any>
# surfacepanningpause
CustomEvent<any>
# surfacepanningresume
CustomEvent<any>
# surfacepanningstart
CustomEvent<any>
# surfacepinchingcancel
CustomEvent<any>
# surfacepinchingend
CustomEvent<any>
# surfacepinchingpause
CustomEvent<any>
# surfacepinchingresume
CustomEvent<any>
# surfacepinchingstart
CustomEvent<any>
# surfaceselectingcancel
CustomEvent<any>
# surfaceselectingend
CustomEvent<any>
# surfaceselectingpause
CustomEvent<any>
# surfaceselectingresume
CustomEvent<any>
# surfaceselectingstart
CustomEvent<any>
# surfacewheelingcancel
CustomEvent<any>
# surfacewheelingend
CustomEvent<any>
# surfacewheelingpause
CustomEvent<any>
# surfacewheelingresume
CustomEvent<any>
# surfacewheelingstart
CustomEvent<any>
# transition
= ...
src/surface.tsx#L289 Transition<States, "surfaceselecting"
| "surfaceidle"
| "surfaceoverlay"
| "surfacecenteringitem"
| "surfacecenteringview"
| "surfaceconnecting"
| "surfacefullsize"
| "surfaceminimappanning"
| "surfacepanning"
| "surfacepinching"
| "surfacewheeling"
>
# created
(ctx)
# ctx
Context<SurfaceElement & JsxContext<SurfaceElement> & Omit<{
<T>(ctor) =>
-
CleanClass<T>
<T>(ctx) =>
-
Wrapper<T>
},
"transition"
>> created(ctx) =>
- void
# mounted
($)
src/surface.tsx#L395
# $
Context<SurfaceElement & JsxContext<SurfaceElement> & Omit<{
<T>(ctor) =>
-
CleanClass<T>
<T>(ctx) =>
-
Wrapper<T>
},
"transition"
>> mounted($) =>
- void
# on
(name)
on<K>(name) =>
-
On<Fn<[ EventHandler<SurfaceElement, LifecycleEvents & {
# SurfaceGridElement
src/surface-grid.ts#L20
<T>(ctx) =>
-
Wrapper<T>
},
"transition"
>> # context
ContextClass<SurfaceGridElement & JsxContext<SurfaceGridElement> & Omit<{
<T>(ctor) =>
-
CleanClass<T>
<T>(ctx) =>
-
Wrapper<T>
},
"transition"
>> # onmounted
EventHandler<SurfaceGridElement, CustomEvent<any>>
# onunmounted
EventHandler<SurfaceGridElement, CustomEvent<any>>
# created
(ctx)
# ctx
Context<SurfaceGridElement & JsxContext<SurfaceGridElement> & Omit<{
<T>(ctor) =>
-
CleanClass<T>
<T>(ctx) =>
-
Wrapper<T>
},
"transition"
>> created(ctx) =>
- void
# mounted
($)
src/surface-grid.ts#L49
# $
Context<SurfaceGridElement & JsxContext<SurfaceGridElement> & Omit<{
<T>(ctor) =>
-
CleanClass<T>
<T>(ctx) =>
-
Wrapper<T>
},
"transition"
>> mounted($) =>
- void
# on
(name)
on<K>(name) =>
-
On<Fn<[ EventHandler<SurfaceGridElement, LifecycleEvents & object [K]> ], Off>>
# SurfaceItemElement
src/surface-item.ts#L6
<T>(ctx) =>
-
Wrapper<T>
},
"transition"
>> # context
ContextClass<SurfaceItemElement & JsxContext<SurfaceItemElement> & Omit<{
<T>(ctor) =>
-
CleanClass<T>
<T>(ctx) =>
-
Wrapper<T>
},
"transition"
>> # onmounted
EventHandler<SurfaceItemElement, CustomEvent<any>>
# onunmounted
EventHandler<SurfaceItemElement, CustomEvent<any>>
# created
(ctx)
# ctx
Context<SurfaceItemElement & JsxContext<SurfaceItemElement> & Omit<{
<T>(ctor) =>
-
CleanClass<T>
<T>(ctx) =>
-
Wrapper<T>
},
"transition"
>> created(ctx) =>
- void
# mounted
($)
src/surface-item.ts#L17
# $
Context<SurfaceItemElement & JsxContext<SurfaceItemElement> & Omit<{
<T>(ctor) =>
-
CleanClass<T>
<T>(ctx) =>
-
Wrapper<T>
},
"transition"
>> mounted($) =>
- void
# on
(name)
on<K>(name) =>
-
On<Fn<[ EventHandler<SurfaceItemElement, LifecycleEvents & object [K]> ], Off>>
# SurfaceMinimapElement
src/surface-minimap.ts#L32
# $
Context<SurfaceMinimapElement & JsxContext<SurfaceMinimapElement> & Omit<{
<T>(ctor) =>
-
CleanClass<T>
<T>(ctx) =>
-
Wrapper<T>
},
"transition"
>> # context
ContextClass<SurfaceMinimapElement & JsxContext<SurfaceMinimapElement> & Omit<{
<T>(ctor) =>
-
CleanClass<T>
<T>(ctx) =>
-
Wrapper<T>
},
"transition"
>> # onmounted
EventHandler<SurfaceMinimapElement, CustomEvent<any>>
# onunmounted
EventHandler<SurfaceMinimapElement, CustomEvent<any>>
# created
(ctx)
# ctx
Context<SurfaceMinimapElement & JsxContext<SurfaceMinimapElement> & Omit<{
<T>(ctor) =>
-
CleanClass<T>
<T>(ctx) =>
-
Wrapper<T>
},
"transition"
>> created(ctx) =>
- void
# mounted
($)
src/surface-minimap.ts#L57
# $
Context<SurfaceMinimapElement & JsxContext<SurfaceMinimapElement> & Omit<{
<T>(ctor) =>
-
CleanClass<T>
<T>(ctx) =>
-
Wrapper<T>
},
"transition"
>> mounted($) =>
- void
# on
(name)
on<K>(name) =>
-
On<Fn<[ EventHandler<SurfaceMinimapElement, LifecycleEvents & object [K]> ], Off>>
# SurfaceMoveElement
src/surface-move.ts#L24
<T>(ctx) =>
-
Wrapper<T>
},
"transition"
>> # context
ContextClass<SurfaceMoveElement & JsxContext<SurfaceMoveElement> & Omit<{
<T>(ctor) =>
-
CleanClass<T>
<T>(ctx) =>
-
Wrapper<T>
},
"transition"
>> # onmounted
EventHandler<SurfaceMoveElement, CustomEvent<any>>
# onsurfacemoveitemmove
EventHandler<SurfaceMoveElement, CustomEvent<SurfaceMoveDetail>>
# onsurfacemoveitemmoveend
EventHandler<SurfaceMoveElement, CustomEvent<SurfaceMoveDetail>>
# onsurfacemoveitemmovestart
EventHandler<SurfaceMoveElement, CustomEvent<SurfaceMoveDetail>>
# onunmounted
EventHandler<SurfaceMoveElement, CustomEvent<any>>
# state
= ...
src/surface-move.ts#L34 State<SurfaceMoveElement, {
},
"surfacemoveitemmove"
| "surfacemoveidle"
> & EventMethods<SurfaceMoveElement, {
# surfacemoveidlecancel
CustomEvent<any>
# surfacemoveidleend
CustomEvent<any>
# surfacemoveidlepause
CustomEvent<any>
# surfacemoveidleresume
CustomEvent<any>
# surfacemoveidlestart
CustomEvent<any>
# surfacemoveitemmovecancel
CustomEvent<any>
# surfacemoveitemmoveend
CustomEvent<any>
# surfacemoveitemmovepause
CustomEvent<any>
# surfacemoveitemmoveresume
CustomEvent<any>
# surfacemoveitemmovestart
CustomEvent<any>
# surfacemoveidlecancel
CustomEvent<any>
# surfacemoveidleend
CustomEvent<any>
# surfacemoveidlepause
CustomEvent<any>
# surfacemoveidleresume
CustomEvent<any>
# surfacemoveidlestart
CustomEvent<any>
# surfacemoveitemmovecancel
CustomEvent<any>
# surfacemoveitemmoveend
CustomEvent<any>
# surfacemoveitemmovepause
CustomEvent<any>
# surfacemoveitemmoveresume
CustomEvent<any>
# surfacemoveitemmovestart
CustomEvent<any>
# created
(ctx)
# ctx
Context<SurfaceMoveElement & JsxContext<SurfaceMoveElement> & Omit<{
<T>(ctor) =>
-
CleanClass<T>
<T>(ctx) =>
-
Wrapper<T>
},
"transition"
>> created(ctx) =>
- void
# mounted
($)
src/surface-move.ts#L42
# $
Context<SurfaceMoveElement & JsxContext<SurfaceMoveElement> & Omit<{
<T>(ctor) =>
-
CleanClass<T>
<T>(ctx) =>
-
Wrapper<T>
},
"transition"
>> mounted($) =>
- void
# on
(name)
on<K>(name) =>
-
On<Fn<[ EventHandler<SurfaceMoveElement, LifecycleEvents & SurfaceMoveEvents [K]> ], Off>>
# SurfaceResizeElement
src/surface-resize.ts#L24
# $
Context<SurfaceResizeElement & JsxContext<SurfaceResizeElement> & Omit<{
<T>(ctor) =>
-
CleanClass<T>
<T>(ctx) =>
-
Wrapper<T>
},
"transition"
>> # context
ContextClass<SurfaceResizeElement & JsxContext<SurfaceResizeElement> & Omit<{
<T>(ctor) =>
-
CleanClass<T>
<T>(ctx) =>
-
Wrapper<T>
},
"transition"
>> # onmounted
EventHandler<SurfaceResizeElement, CustomEvent<any>>
# onsurfaceresizeitemresize
EventHandler<SurfaceResizeElement, CustomEvent<SurfaceResizeDetail>>
# onsurfaceresizeitemresizeend
EventHandler<SurfaceResizeElement, CustomEvent<SurfaceResizeDetail>>
# onsurfaceresizeitemresizestart
EventHandler<SurfaceResizeElement, CustomEvent<SurfaceResizeDetail>>
# onunmounted
EventHandler<SurfaceResizeElement, CustomEvent<any>>
# state
= ...
src/surface-resize.ts#L34 State<SurfaceResizeElement, {
},
"surfaceresizeitemresize"
| "surfaceresizeidle"
> & EventMethods<SurfaceResizeElement, {
# surfaceresizeidlecancel
CustomEvent<any>
# surfaceresizeidleend
CustomEvent<any>
# surfaceresizeidlepause
CustomEvent<any>
# surfaceresizeidleresume
CustomEvent<any>
# surfaceresizeidlestart
CustomEvent<any>
# surfaceresizeitemresizecancel
CustomEvent<any>
# surfaceresizeitemresizeend
CustomEvent<any>
# surfaceresizeitemresizepause
CustomEvent<any>
# surfaceresizeitemresizeresume
CustomEvent<any>
# surfaceresizeitemresizestart
CustomEvent<any>
# surfaceresizeidlecancel
CustomEvent<any>
# surfaceresizeidleend
CustomEvent<any>
# surfaceresizeidlepause
CustomEvent<any>
# surfaceresizeidleresume
CustomEvent<any>
# surfaceresizeidlestart
CustomEvent<any>
# surfaceresizeitemresizecancel
CustomEvent<any>
# surfaceresizeitemresizeend
CustomEvent<any>
# surfaceresizeitemresizepause
CustomEvent<any>
# surfaceresizeitemresizeresume
CustomEvent<any>
# surfaceresizeitemresizestart
CustomEvent<any>
# created
(ctx)
# ctx
Context<SurfaceResizeElement & JsxContext<SurfaceResizeElement> & Omit<{
<T>(ctor) =>
-
CleanClass<T>
<T>(ctx) =>
-
Wrapper<T>
},
"transition"
>> created(ctx) =>
- void
# mounted
($)
src/surface-resize.ts#L43
# $
Context<SurfaceResizeElement & JsxContext<SurfaceResizeElement> & Omit<{
<T>(ctor) =>
-
CleanClass<T>
<T>(ctx) =>
-
Wrapper<T>
},
"transition"
>> mounted($) =>
- void
# on
(name)
on<K>(name) =>
-
On<Fn<[ EventHandler<SurfaceResizeElement, LifecycleEvents & SurfaceResizeEvents [K]> ], Off>>
Credits
- animatrix by stagas – Create DOM Animations.
- bezier-easing by Gaëtan Renaudeau – BezierEasing provides Cubic Bezier Curve easing which generalizes easing functions exactly like in CSS Transitions.
- everyday-types by stagas – Everyday utility types
- everyday-utils by stagas – Everyday utilities
- get-element-offset by stagas – Get accurate DOM element offset.
- relative-mouse by stagas – Get mouse position relative to a DOM element.
- sigl by stagas – Web framework
Contributing
All contributions are welcome!