npm package discovery and stats viewer.

Discover Tips

  • General search

    [free text search, go nuts!]

  • Package details

    pkg:[package-name]

  • User packages

    @[username]

Sponsor

Optimize Toolset

I’ve always been into building performant and accessible sites, but lately I’ve been taking it extremely seriously. So much so that I’ve been building a tool to help me optimize and monitor the sites that I build to make sure that I’m making an attempt to offer the best experience to those who visit them. If you’re into performant, accessible and SEO friendly sites, you might like it too! You can check it out at Optimize Toolset.

About

Hi, 👋, I’m Ryan Hefner  and I built this site for me, and you! The goal of this site was to provide an easy way for me to check the stats on my npm packages, both for prioritizing issues and updates, and to give me a little kick in the pants to keep up on stuff.

As I was building it, I realized that I was actually using the tool to build the tool, and figured I might as well put this out there and hopefully others will find it to be a fast and useful way to search and browse npm packages as I have.

If you’re interested in other things I’m working on, follow me on Twitter or check out the open source projects I’ve been publishing on GitHub.

I am also working on a Twitter bot for this site to tweet the most popular, newest, random packages from npm. Please follow that account now and it will start sending out packages soon–ish.

Open Software & Tools

This site wouldn’t be possible without the immense generosity and tireless efforts from the people who make contributions to the world and share their work via open source initiatives. Thank you 🙏

© 2024 – Pkg Stats / Ryan Hefner

textura-renderer

v1.0.41

Published

Optimized small library for convenient work with coordinates and render loop. Aimed on creating websites scroll animations

Downloads

10

Readme

Renderer

Optimized small library for convenient work with coordinates and render loop. Renderer is written on typescipt. You can use with frontend frameworks or native js. Aimed on creating websites animations

  • excellent support projects on native JS or TS
  • excellent support React.js
  • partable support Vue.js. If you get errors, and use typescript, try import all components from "textura-renderer/src".
  • no support for Angular.js. But you are able to copy "textura-renderer" folder from "node_modules/" and put the file directly in your project. If u still get errors, try import all methods from "src" folder.

Current Updates (24.02.2023, v1.0.4)

  • "label" & "delay" parameteries now is not required in "setToRender" method.
  • Fix "getInterpolated" method. Now it works stable.
  • Fix error in "getInterpolated" method example.

Next Update (v1.0.5)

  • Add new methods: getMouseVelocity, getMouseVelocityX, getMouseVelocityY.
  • Add new methods: getScrollVelocityX, getScrollVelocityY.

Future Updates (v1.0.x)

  • Add hooks for React and Vue.
  • ...

Quick start

Installation

npm

For module bundlers such as Webpack or Browserify.

npm i textura-renderer
import {
	startRender,
	stopRender,
	...
} from 'textura-renderer'
CDN

Recommended for learning purposes, you can use the latest version:

<script src="https://cdn.jsdelivr.net/npm/textura-renderer/dist/index.js"></script>

All methods are available on the object "Renderer":

<script type="text/javascript">
	Renderer.startRender()
	Renderer.stopRender()
	...
</script>

Docs

All methods

import {
	startRender,
	stopRender,
	setToRender,
	removeFromRender,
	getRendering,
	subscribeMouse,
	unsubscribeMouse,
	getMouseCoords,
	getMouseCoordsFromElement,
	getElementDocumentCoords,
	getElementWindowCoords,
	getScrollCoordsFromElement,
	isElementHovered,
	isElementFullyVisibleX,
	isElementFullyVisibleY,
	isElementFullyVisible,
	isElementPartableVisibleX,
	isElementPartableVisibleY,
	isElementPartableVisible,
	getInterpolated,
	Tween,
	Ease,
	lerp
} from 'textura-renderer'

| Methods | Props | Return Type | Description | | ------------ | ------------ | ------------ | ------------ | | startRender | -- | void | start global render loop in app | | stopRender | -- | void | stop global render loop in app | | setToRender | { label?: string / number; handler: (time: number) => {}, delay?: number } | void | add handler to global render loop | | removeFromRender | label?: string / number | void | remove handler from global render loop | | getRendering | -- | [] | return array of handlers in rendering | | subscribeMouse | -- | void | start saving mouse position | | unsubscribeMouse | -- | void | stop saving mouse position | | getMouseCoords | domElement: HTMLElement | { document: { x: number / null, y: number / null }, window: { x: number / null, y: number / null } } | return mouse coords relatively document and window | | getMouseCoordsFromElement | domElement: HTMLElement | { top: { left: { x, y }, right: { x, y } }, center: { center: { x, y } }, bottom: { left: { x, y }, right: { x, y } } } | return mouse coords relatively dom element | | isElementHovered | domElement: HTMLElement, additionalRadius: number | boolean | return is element hovered | | getElementDocumentCoords | domElement: HTMLElement | {} | return element coords relativity document | | getElementWindowCoords | domElement: HTMLElement | {} | return element coords relativity window (can be negative) | | getScrollCoordsFromElement | domElement: HTMLElement | {} | return scroll coords relativity dom element (can be negative) | | isElementFullyVisibleX | domElement: HTMLElement | boolean | return is element fully visible on x axe | | isElementFullyVisibleY | domElement: HTMLElement | boolean | return is element fully visible on y axe | | isElementFullyVisible | domElement: HTMLElement | boolean | return is element fully visible (true if fully visible on x and y axes) | | isElementPartableVisibleX | domElement: HTMLElement | boolean | return is element partable visible on x axe | | isElementPartableVisibleY | domElement: HTMLElement | boolean | return is element partable visible on y axe | | isElementPartableVisible | domElement: HTMLElement | boolean | return is element partable visible (true if partable visible on x or y axes) | | getInterpolated | config: { timeline: timelineType, interface: InterfaceType }, time: number | { [key] : { [innerKey]: number }, ... } | return object of keys which contains keys with number values in current time. this version uses only piecewise function for interpolation | | Tween.to | {}: TweenPropsType | void | -- | | Ease.Line | time: number | number | Bezier Linear | | Ease.In | time: number | number | Bezier In | | Ease.InCubic | t:ime number | number | Bezier In (pow 3) | | Ease.InQuartic | t:ime number | number | Bezier In (pow 4) | | Ease.InQuintic | time: number | number | Bezier In (pow 5) | | Ease.InCustom | time: number, strength?: number | number | Bezier In | | Ease.Out | time: number | number | Bezier Out | | Ease.OutCubic | time: number | number | Bezier Out (pow 3) | | Ease.OutQuartic | time: number | number | Bezier Out (pow 4) | | Ease.OutQuintic | time: number | number | Bezier Out (pow 5) | | Ease.OutCustom | time: number, strength?: number | number | Bezier Out | | Ease.InOut | time: number | number | Bezier InOut | | Ease.InOutCubic | time: number | number | Bezier InOut (pow 3) | | Ease.InOutQuartic | time: number | number | Bezier InOut (pow 4) | | Ease.InOutQuintic | time: number | number | Bezier InOut (pow 5) | | Ease.InOutCustom | time: number, strengthIn?: number, strengthOut?: number | number | Bezier InOut | | lerp | start: number, end: number, t?: number | number | -- |


Core renderer methods

Add "startRender()" at the top level of the app to use renderer. Then to add code to render loop use "setToRender()" where you want

Example
//App.tsx
useEffect(() => {
	startRender()
	return () => stopRender()
}, [])


// component.tsx
useEffect(() => {
	const label = 'myCustomAnimation'
	setToRender({
		label,
		handler: ( time: number ) => { /* your code */ },
		delay: 10 //ms
	})
	return () => removeFromRender( label )
}, [])

| Methods | Props | Return Type | Description | | ------------ | ------------ | ------------ | ------------ | | startRender | -- | void | start global render loop in app | | stopRender | -- | void | stop global render loop in app | | setToRender | { label?: string / number; handler: (time: number) => {}, delay?: number } | void | add handler to global render loop | | removeFromRender | label?: string / number | void | remove handler from global render loop | | getRendering | -- | [] | return array of handlers in rendering |


Mouse methods

Add "subscribeMouse()" at the top level of the app to use mouse methods.

Example using with renderer
//App.tsx
useEffect(() => {
	subscribeMouse()
	startRender()
	return () => { 
		unsubscribeMouse() 
		stopRender()
	}
}, [])


// component.tsx
function myAnimation() {
	if ( !myRef.current ) { return }
	const isHovered: boolean = isElementHovered(myRef.current)
	if ( isHovered ) {
		console.log( 'Hovered!' )
	}
}
useEffect(() => {
	const label = 'myCustomAnimation'
	setToRender({
		label,
		handler: ( time: number ) => myAnimation(),
		delay: 10 //ms
	})
	return () => removeFromRender( label )
}, [])

| Methods | Props | Return Type | Description | | ------------ | ------------ | ------------ | ------------ | | subscribeMouse | -- | void | start saving mouse position | | unsubscribeMouse | -- | void | stop saving mouse position | | getMouseCoords | domElement: HTMLElement | { document: { x: number / null, y: number / null }, window: { x: number / null, y: number / null } } | return mouse coords relatively document and window | | getMouseCoordsFromElement | domElement: HTMLElement | { top: { left: { x, y }, right: { x, y } }, center: { center: { x, y } }, bottom: { left: { x, y }, right: { x, y } } } | return mouse coords relatively dom element | | isElementHovered | domElement: HTMLElement, additionalRadius: number | boolean | return is element hovered |


Coordinates methods

Convinient functions for dom elements coords. Use this methods anywhere.

Example
const isVisible = isElementPartableVisibleY(myRef.current)

| Methods | Props | Return Type | Description | | ------------ | ------------ | ------------ | ------------ | | getElementDocumentCoords | domElement: HTMLElement | {} | return element coords relativity document | | getElementWindowCoords | domElement: HTMLElement | {} | return element coords relativity window (can be negative) | | getScrollCoordsFromElement | domElement: HTMLElement | {} | return scroll coords relativity dom element (can be negative) | | isElementFullyVisibleX | domElement: HTMLElement | boolean | return is element fully visible on x axe | | isElementFullyVisibleY | domElement: HTMLElement | boolean | return is element fully visible on y axe | | isElementFullyVisible | domElement: HTMLElement | boolean | return is element fully visible (true if fully visible on x and y axes) | | isElementPartableVisibleX | domElement: HTMLElement | boolean | return is element partable visible on x axe | | isElementPartableVisibleY | domElement: HTMLElement | boolean | return is element partable visible on y axe | | isElementPartableVisible | domElement: HTMLElement | boolean | return is element partable visible (true if partable visible on x or y axes) |


Interpolation

Use "getInterpolated(config, time)" to create frameByFrame animation. For example on scroll. Or animate any looped object in render loop. U able to scroll video, transform any html content and so on

Example
const Timeline = ( scrollContainer ) => {
	const dist = scrollContainer.getBoundingClientRect().height

	const START = 0
	const MIDDLE = dist / 2
	const END = dist

	const timelineInterface = {
		header: {
			opacity: 0,
			translateY: 0,
			$TIME: [ START, MIDDLE, END ]
		},
		svg: {
			rotate: 0,
			$TIME: [ MIDDLE, END ]
		}
	}
	
	const timeline = [
		{
			$TIME: START,
			header: {
				opacity: 0,
				translateY: 0
			}
		},
		{
			$TIME: MIDDLE,
			header: {
				opacity: 1,
				translateY: 100
			},
			svg: {
				rotate: 30
			}
		},
		{
			$TIME: END,
			header: {
				opacity: .5,
				translateY: -50
			},
			svg: {
				rotate: -180
			}
		}
	]

	return { timeline, interface: timelineInterface }
}

useEffect(() => {
	const label = 'myScrollAnimation'
	setToRender({
		label,
		handler: ( time ) => {
			if (!scrollContainer.current || !header.current || !svg.current) { return }
			const config = Timeline( scrollContainer.current )
			const t = getInterpolated( config, window.scrollY )
			header.current.style.cssText = `
				opacity: ${t.header.opacity};
				transform: translateY(t.header.translateY);
			`
			svg.current.style.cssText = `
				transform: rotate(t.svg.rotate);
			`
		},
	})
	return () => removeFromRender( label )
}, [])

| Methods | Props | Return Type | Description | | ------------ | ------------ | ------------ | ------------ | | getInterpolated | config: { timeline: timelineType, interface: InterfaceType }, time: number | { [key] : { [innerKey]: number }, ... } | return object of keys which contains keys with number values in current time. this version uses only piecwise function for interpolation |


Tweening

Light tween and easing functions for interpolating between two values.

TweenPropsType = {
	from: number / {}, 
	to: number / {}, 
	{ 
		duration?: number, 
		renderDelay?: number, 
		delay?: number, 
		onChange?: Function, 	
		onComplete?: Functions 
		ease?: Function //Ease.InOut by default
	}
}

| Methods | Props | Return Type | Description | | ------------ | ------------ | ------------ | ------------ | | Tween.to | {}: TweenPropsType | void | -- | | Ease.Line | time: number | number | Bezier Linear | | Ease.In | time: number | number | Bezier In | | Ease.InCubic | t:ime number | number | Bezier In (pow 3) | | Ease.InQuartic | t:ime number | number | Bezier In (pow 4) | | Ease.InQuintic | time: number | number | Bezier In (pow 5) | | Ease.InCustom | time: number, strength?: number | number | Bezier In | | Ease.Out | time: number | number | Bezier Out | | Ease.OutCubic | time: number | number | Bezier Out (pow 3) | | Ease.OutQuartic | time: number | number | Bezier Out (pow 4) | | Ease.OutQuintic | time: number | number | Bezier Out (pow 5) | | Ease.OutCustom | time: number, strength?: number | number | Bezier Out | | Ease.InOut | time: number | number | Bezier InOut | | Ease.InOutCubic | time: number | number | Bezier InOut (pow 3) | | Ease.InOutQuartic | time: number | number | Bezier InOut (pow 4) | | Ease.InOutQuintic | time: number | number | Bezier InOut (pow 5) | | Ease.InOutCustom | time: number, strengthIn?: number, strengthOut?: number | number | Bezier InOut |

| Methods | Props | Return Type | Description | | ----------- | ------------ | ----------- | ------------ | | lerp | start: number, end: number, t?: number | number | -- |

@author: [email protected]