@jojovms/tilt-card-core 0.0.1

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
package/README.md ADDED
@@ -0,0 +1,28 @@
1
+ # @jojovms/tilt-card-core
2
+
3
+ A premium 3D tilt effect library for your UI.
4
+
5
+ ## Installation
6
+ ```bash
7
+ npm install @jojovms/tilt-card-core
8
+ ```
9
+
10
+ ## Usage
11
+ ```javascript
12
+ import { Tiltō } from '@jojovms/tilt-card-core';
13
+
14
+ new Tiltō('#my-card', {
15
+ max: 15,
16
+ scale: 1.05,
17
+ glare: true
18
+ });
19
+ ```
20
+
21
+ ## Options
22
+ | Option | Type | Default | Description |
23
+ |--------|------|---------|-------------|
24
+ | `max` | number | 15 | Max tilt rotation (deg) |
25
+ | `perspective` | number | 1000 | Transform perspective |
26
+ | `scale` | number | 1.05 | Element scale on hover |
27
+ | `glare` | boolean | false | Enable glare effect |
28
+ | `glareMaxOpacity` | number | 0.5 | Max opacity of glare |
@@ -0,0 +1,2 @@
1
+ export { Tiltō } from './tilt';
2
+ export type { TiltOptions } from './tilt';
package/dist/index.js ADDED
@@ -0,0 +1,6 @@
1
+ "use strict";var g=Object.defineProperty;var y=(i,e,t)=>e in i?g(i,e,{enumerable:!0,configurable:!0,writable:!0,value:t}):i[e]=t;var s=(i,e,t)=>y(i,typeof e!="symbol"?e+"":e,t);Object.defineProperty(exports,Symbol.toStringTag,{value:"Module"});class u{constructor(e,t={}){s(this,"element");s(this,"options");s(this,"glareElement",null);s(this,"bounds",null);s(this,"onMouseEnter",()=>{var e;this.bounds=this.element.getBoundingClientRect(),this.element.style.transition="none",(e=this.glareElement)!=null&&e.firstChild&&(this.glareElement.firstChild.style.transition="opacity 100ms")});s(this,"onMouseMove",e=>{var r;if(!this.bounds)return;const t=e.clientX-this.bounds.left,h=e.clientY-this.bounds.top,n=t/this.bounds.width,l=h/this.bounds.height,o=this.options.max||15,m=(.5-l)*o*2,d=(n-.5)*o*2;if(this.element.style.transform=`
2
+ perspective(${this.options.perspective}px)
3
+ rotateX(${m}deg)
4
+ rotateY(${d}deg)
5
+ scale3d(${this.options.scale}, ${this.options.scale}, ${this.options.scale})
6
+ `,this.options.glare&&((r=this.glareElement)!=null&&r.firstChild)){const a=this.glareElement.firstChild,p=Math.atan2(e.clientX-(this.bounds.left+this.bounds.width/2),-(e.clientY-(this.bounds.top+this.bounds.height/2)))*(180/Math.PI),c=Math.sqrt(Math.pow(n-.5,2)+Math.pow(l-.5,2))*2;a.style.transform=`translate(-50%, -50%) rotate(${p}deg)`,a.style.opacity=(c*(this.options.glareMaxOpacity||.5)).toString()}});s(this,"onMouseLeave",()=>{var e;if(this.element.style.transition="transform 300ms ease-out",this.element.style.transform=`perspective(${this.options.perspective}px) rotateX(0deg) rotateY(0deg) scale3d(1, 1, 1)`,this.options.glare&&((e=this.glareElement)!=null&&e.firstChild)){const t=this.glareElement.firstChild;t.style.opacity="0",t.style.transition="opacity 300ms"}});this.element=typeof e=="string"?document.querySelector(e):e,this.options={max:15,perspective:1e3,scale:1.05,glare:!1,glareMaxOpacity:.5,...t},this.element&&this.init()}init(){this.element.style.transformStyle="preserve-3d",this.element.style.transform=`perspective(${this.options.perspective}px)`,this.options.glare&&this.addGlare(),this.element.addEventListener("mouseenter",this.onMouseEnter),this.element.addEventListener("mousemove",this.onMouseMove),this.element.addEventListener("mouseleave",this.onMouseLeave)}addGlare(){this.glareElement=document.createElement("div"),this.glareElement.style.position="absolute",this.glareElement.style.top="0",this.glareElement.style.left="0",this.glareElement.style.width="100%",this.glareElement.style.height="100%",this.glareElement.style.overflow="hidden",this.glareElement.style.pointerEvents="none",this.glareElement.style.borderRadius=getComputedStyle(this.element).borderRadius;const e=document.createElement("div");e.style.position="absolute",e.style.top="50%",e.style.left="50%",e.style.pointerEvents="none",e.style.backgroundImage="linear-gradient(0deg, rgba(255,255,255,0) 0%, rgba(255,255,255,1) 100%)",e.style.width="200%",e.style.height="200%",e.style.transform="translate(-50%, -50%) rotate(0deg)",e.style.opacity="0",e.style.transition="opacity 300ms",this.glareElement.appendChild(e),this.element.appendChild(this.glareElement)}destroy(){this.element.removeEventListener("mouseenter",this.onMouseEnter),this.element.removeEventListener("mousemove",this.onMouseMove),this.element.removeEventListener("mouseleave",this.onMouseLeave),this.glareElement&&this.glareElement.remove()}}exports.Tiltō=u;
package/dist/index.mjs ADDED
@@ -0,0 +1,58 @@
1
+ var g = Object.defineProperty;
2
+ var y = (i, e, t) => e in i ? g(i, e, { enumerable: !0, configurable: !0, writable: !0, value: t }) : i[e] = t;
3
+ var s = (i, e, t) => y(i, typeof e != "symbol" ? e + "" : e, t);
4
+ class v {
5
+ constructor(e, t = {}) {
6
+ s(this, "element");
7
+ s(this, "options");
8
+ s(this, "glareElement", null);
9
+ s(this, "bounds", null);
10
+ s(this, "onMouseEnter", () => {
11
+ var e;
12
+ this.bounds = this.element.getBoundingClientRect(), this.element.style.transition = "none", (e = this.glareElement) != null && e.firstChild && (this.glareElement.firstChild.style.transition = "opacity 100ms");
13
+ });
14
+ s(this, "onMouseMove", (e) => {
15
+ var r;
16
+ if (!this.bounds) return;
17
+ const t = e.clientX - this.bounds.left, h = e.clientY - this.bounds.top, n = t / this.bounds.width, l = h / this.bounds.height, o = this.options.max || 15, m = (0.5 - l) * o * 2, d = (n - 0.5) * o * 2;
18
+ if (this.element.style.transform = `
19
+ perspective(${this.options.perspective}px)
20
+ rotateX(${m}deg)
21
+ rotateY(${d}deg)
22
+ scale3d(${this.options.scale}, ${this.options.scale}, ${this.options.scale})
23
+ `, this.options.glare && ((r = this.glareElement) != null && r.firstChild)) {
24
+ const a = this.glareElement.firstChild, p = Math.atan2(e.clientX - (this.bounds.left + this.bounds.width / 2), -(e.clientY - (this.bounds.top + this.bounds.height / 2))) * (180 / Math.PI), c = Math.sqrt(Math.pow(n - 0.5, 2) + Math.pow(l - 0.5, 2)) * 2;
25
+ a.style.transform = `translate(-50%, -50%) rotate(${p}deg)`, a.style.opacity = (c * (this.options.glareMaxOpacity || 0.5)).toString();
26
+ }
27
+ });
28
+ s(this, "onMouseLeave", () => {
29
+ var e;
30
+ if (this.element.style.transition = "transform 300ms ease-out", this.element.style.transform = `perspective(${this.options.perspective}px) rotateX(0deg) rotateY(0deg) scale3d(1, 1, 1)`, this.options.glare && ((e = this.glareElement) != null && e.firstChild)) {
31
+ const t = this.glareElement.firstChild;
32
+ t.style.opacity = "0", t.style.transition = "opacity 300ms";
33
+ }
34
+ });
35
+ this.element = typeof e == "string" ? document.querySelector(e) : e, this.options = {
36
+ max: 15,
37
+ perspective: 1e3,
38
+ scale: 1.05,
39
+ glare: !1,
40
+ glareMaxOpacity: 0.5,
41
+ ...t
42
+ }, this.element && this.init();
43
+ }
44
+ init() {
45
+ this.element.style.transformStyle = "preserve-3d", this.element.style.transform = `perspective(${this.options.perspective}px)`, this.options.glare && this.addGlare(), this.element.addEventListener("mouseenter", this.onMouseEnter), this.element.addEventListener("mousemove", this.onMouseMove), this.element.addEventListener("mouseleave", this.onMouseLeave);
46
+ }
47
+ addGlare() {
48
+ this.glareElement = document.createElement("div"), this.glareElement.style.position = "absolute", this.glareElement.style.top = "0", this.glareElement.style.left = "0", this.glareElement.style.width = "100%", this.glareElement.style.height = "100%", this.glareElement.style.overflow = "hidden", this.glareElement.style.pointerEvents = "none", this.glareElement.style.borderRadius = getComputedStyle(this.element).borderRadius;
49
+ const e = document.createElement("div");
50
+ e.style.position = "absolute", e.style.top = "50%", e.style.left = "50%", e.style.pointerEvents = "none", e.style.backgroundImage = "linear-gradient(0deg, rgba(255,255,255,0) 0%, rgba(255,255,255,1) 100%)", e.style.width = "200%", e.style.height = "200%", e.style.transform = "translate(-50%, -50%) rotate(0deg)", e.style.opacity = "0", e.style.transition = "opacity 300ms", this.glareElement.appendChild(e), this.element.appendChild(this.glareElement);
51
+ }
52
+ destroy() {
53
+ this.element.removeEventListener("mouseenter", this.onMouseEnter), this.element.removeEventListener("mousemove", this.onMouseMove), this.element.removeEventListener("mouseleave", this.onMouseLeave), this.glareElement && this.glareElement.remove();
54
+ }
55
+ }
56
+ export {
57
+ v as Tiltō
58
+ };
@@ -0,0 +1,6 @@
1
+ (function(s,t){typeof exports=="object"&&typeof module<"u"?t(exports):typeof define=="function"&&define.amd?define(["exports"],t):(s=typeof globalThis<"u"?globalThis:s||self,t(s.TiltCardCore={}))})(this,function(s){"use strict";var y=Object.defineProperty;var f=(s,t,o)=>t in s?y(s,t,{enumerable:!0,configurable:!0,writable:!0,value:o}):s[t]=o;var i=(s,t,o)=>f(s,typeof t!="symbol"?t+"":t,o);class t{constructor(e,n={}){i(this,"element");i(this,"options");i(this,"glareElement",null);i(this,"bounds",null);i(this,"onMouseEnter",()=>{var e;this.bounds=this.element.getBoundingClientRect(),this.element.style.transition="none",(e=this.glareElement)!=null&&e.firstChild&&(this.glareElement.firstChild.style.transition="opacity 100ms")});i(this,"onMouseMove",e=>{var h;if(!this.bounds)return;const n=e.clientX-this.bounds.left,m=e.clientY-this.bounds.top,l=n/this.bounds.width,r=m/this.bounds.height,a=this.options.max||15,p=(.5-r)*a*2,c=(l-.5)*a*2;if(this.element.style.transform=`
2
+ perspective(${this.options.perspective}px)
3
+ rotateX(${p}deg)
4
+ rotateY(${c}deg)
5
+ scale3d(${this.options.scale}, ${this.options.scale}, ${this.options.scale})
6
+ `,this.options.glare&&((h=this.glareElement)!=null&&h.firstChild)){const d=this.glareElement.firstChild,g=Math.atan2(e.clientX-(this.bounds.left+this.bounds.width/2),-(e.clientY-(this.bounds.top+this.bounds.height/2)))*(180/Math.PI),u=Math.sqrt(Math.pow(l-.5,2)+Math.pow(r-.5,2))*2;d.style.transform=`translate(-50%, -50%) rotate(${g}deg)`,d.style.opacity=(u*(this.options.glareMaxOpacity||.5)).toString()}});i(this,"onMouseLeave",()=>{var e;if(this.element.style.transition="transform 300ms ease-out",this.element.style.transform=`perspective(${this.options.perspective}px) rotateX(0deg) rotateY(0deg) scale3d(1, 1, 1)`,this.options.glare&&((e=this.glareElement)!=null&&e.firstChild)){const n=this.glareElement.firstChild;n.style.opacity="0",n.style.transition="opacity 300ms"}});this.element=typeof e=="string"?document.querySelector(e):e,this.options={max:15,perspective:1e3,scale:1.05,glare:!1,glareMaxOpacity:.5,...n},this.element&&this.init()}init(){this.element.style.transformStyle="preserve-3d",this.element.style.transform=`perspective(${this.options.perspective}px)`,this.options.glare&&this.addGlare(),this.element.addEventListener("mouseenter",this.onMouseEnter),this.element.addEventListener("mousemove",this.onMouseMove),this.element.addEventListener("mouseleave",this.onMouseLeave)}addGlare(){this.glareElement=document.createElement("div"),this.glareElement.style.position="absolute",this.glareElement.style.top="0",this.glareElement.style.left="0",this.glareElement.style.width="100%",this.glareElement.style.height="100%",this.glareElement.style.overflow="hidden",this.glareElement.style.pointerEvents="none",this.glareElement.style.borderRadius=getComputedStyle(this.element).borderRadius;const e=document.createElement("div");e.style.position="absolute",e.style.top="50%",e.style.left="50%",e.style.pointerEvents="none",e.style.backgroundImage="linear-gradient(0deg, rgba(255,255,255,0) 0%, rgba(255,255,255,1) 100%)",e.style.width="200%",e.style.height="200%",e.style.transform="translate(-50%, -50%) rotate(0deg)",e.style.opacity="0",e.style.transition="opacity 300ms",this.glareElement.appendChild(e),this.element.appendChild(this.glareElement)}destroy(){this.element.removeEventListener("mouseenter",this.onMouseEnter),this.element.removeEventListener("mousemove",this.onMouseMove),this.element.removeEventListener("mouseleave",this.onMouseLeave),this.glareElement&&this.glareElement.remove()}}s.Tiltō=t,Object.defineProperty(s,Symbol.toStringTag,{value:"Module"})});
package/dist/tilt.d.ts ADDED
@@ -0,0 +1,20 @@
1
+ export interface TiltOptions {
2
+ max?: number;
3
+ perspective?: number;
4
+ scale?: number;
5
+ glare?: boolean;
6
+ glareMaxOpacity?: number;
7
+ }
8
+ export declare class Tiltō {
9
+ private element;
10
+ private options;
11
+ private glareElement;
12
+ private bounds;
13
+ constructor(target: string | HTMLElement, options?: TiltOptions);
14
+ private init;
15
+ private addGlare;
16
+ private onMouseEnter;
17
+ private onMouseMove;
18
+ private onMouseLeave;
19
+ destroy(): void;
20
+ }
package/package.json ADDED
@@ -0,0 +1,38 @@
1
+ {
2
+ "name": "@jojovms/tilt-card-core",
3
+ "version": "0.0.1",
4
+ "description": "Tiltō: A premium 3D tilt interaction effect for your cards.",
5
+ "keywords": [
6
+ "tilto",
7
+ "tilt-card",
8
+ "3d",
9
+ "hover",
10
+ "ui",
11
+ "framework",
12
+ "jojovms"
13
+ ],
14
+ "author": "Shijo Shaji (https://shijoshaji.in)",
15
+ "homepage": "https://shijoshaji.in",
16
+ "repository": {
17
+ "type": "git",
18
+ "url": "https://github.com/shijoshaji/tilt-card.git",
19
+ "directory": "core"
20
+ },
21
+ "bugs": {
22
+ "url": "https://github.com/shijoshaji/tilt-card/issues"
23
+ },
24
+ "main": "dist/index.js",
25
+ "module": "dist/index.mjs",
26
+ "types": "dist/index.d.ts",
27
+ "scripts": {
28
+ "build": "vite build"
29
+ },
30
+ "files": [
31
+ "dist"
32
+ ],
33
+ "devDependencies": {
34
+ "typescript": "^5.3.3",
35
+ "vite": "^5.0.10",
36
+ "vite-plugin-dts": "^3.6.4"
37
+ }
38
+ }