lumidot 0.5.1 → 0.6.0

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 CHANGED
@@ -1,6 +1,6 @@
1
1
  # lumidot
2
2
 
3
- A 3x3 dot-grid loader for React. 36 patterns, 20 colors, under 5KB.
3
+ Dot-grid loading animations for React. Tiny, flexible, beautiful.
4
4
 
5
5
  ![lumidot](./lumidot.gif)
6
6
 
@@ -13,26 +13,33 @@ npm install lumidot
13
13
  ## Usage
14
14
 
15
15
  ```tsx
16
- import { Lumidot } from 'lumidot'
16
+ import { Lumidot } from 'lumidot';
17
17
 
18
18
  function App() {
19
- return <Lumidot />
19
+ return (
20
+ <>
21
+ <Lumidot />
22
+ <Lumidot rows={5} cols={5} pattern="all" />
23
+ </>
24
+ );
20
25
  }
21
26
  ```
22
27
 
23
28
  ## Props
24
29
 
25
- | Prop | Type | Default | Description |
26
- |------|------|---------|-------------|
27
- | `pattern` | `LumidotPattern` | `'all'` | Dot layout pattern (36 options) |
28
- | `variant` | `LumidotVariant` | `'blue'` | Color variant (20 options) |
29
- | `direction` | `LumidotDirection` | `'ltr'` | Wave direction `'ltr'`, `'rtl'`, `'ttb'`, `'btt'` |
30
- | `scale` | `number` | `1` | Size multiplier (1 = 20px) |
31
- | `glow` | `number` | `8` | Glow intensity |
32
- | `duration` | `number` | `0.7` | Wave cycle duration in seconds |
33
- | `className` | `string` | | Additional CSS classes |
34
- | `style` | `CSSProperties` | | Inline styles |
35
- | `testId` | `string` | — | Sets `data-testid` attribute |
30
+ | Prop | Type | Default | Description |
31
+ | ----------- | ------------------ | -------- | --------------------------------------------------- |
32
+ | `pattern` | `LumidotPattern` | `'all'` | Dot layout pattern (36 options) |
33
+ | `variant` | `LumidotVariant` | `'blue'` | Color variant (20 options) |
34
+ | `rows` | `number` | `3` | Number of rows in the dot grid |
35
+ | `cols` | `number` | `3` | Number of columns in the dot grid |
36
+ | `direction` | `LumidotDirection` | `'ltr'` | Wave direction — `'ltr'`, `'rtl'`, `'ttb'`, `'btt'` |
37
+ | `scale` | `number` | `1` | Size multiplier (1 = 20px) |
38
+ | `glow` | `number` | `8` | Glow intensity |
39
+ | `duration` | `number` | `0.7` | Wave cycle duration in seconds |
40
+ | `className` | `string` | — | Additional CSS classes |
41
+ | `style` | `CSSProperties` | — | Inline styles |
42
+ | `testId` | `string` | — | Sets `data-testid` attribute |
36
43
 
37
44
  ## Patterns
38
45
 
package/dist/index.cjs CHANGED
@@ -1,2 +1,2 @@
1
- "use client";Object.defineProperty(exports,"__esModule",{value:!0});var e=require("react"),t=e&&e.__esModule?e:{default:e};let a=[0,1,2,3,4,5,6,7,8],r={"solo-center":[[4]],"solo-tl":[[0]],"solo-br":[[8]],"line-h-top":[[0,1,2]],"line-h-mid":[[3,4,5]],"line-h-bot":[[6,7,8]],"line-v-left":[[0,3,6]],"line-v-mid":[[1,4,7]],"line-v-right":[[2,5,8]],"line-diag-1":[[0,4,8]],"line-diag-2":[[2,4,6]],"corners-only":[[0],[2],[8],[6]],"corners-sync":[[0,2,6,8]],"plus-hollow":[[1],[3],[5],[7]],"l-tl":[[0,3,6,7,8]],"l-tr":[[2,5,6,7,8]],"l-bl":[[0,1,2,3,6]],"l-br":[[0,1,2,5,8]],"t-top":[[0,1,2,4,7]],"t-bot":[[1,4,6,7,8]],"t-left":[[0,1,3,6,7]],"t-right":[[1,2,5,7,8]],"duo-h":[[3,5]],"duo-v":[[1,7]],"duo-diag":[[0,8]],frame:[[0,1,2,5,8,7,6,3]],"frame-sync":[[0,1,2,3,5,6,7,8]],"sparse-1":[[0,4,8]],"sparse-2":[[2,3,7]],"sparse-3":[[1,5,6]],"wave-lr":[a],"wave-rl":[a],"wave-tb":[a],"wave-bt":[a],spiral:[[0,1,2],[2,5,8],[8,7,6],[6,3,0]],all:[a]},l=new Set(["corners-sync","frame-sync"]),n={"wave-lr":"lr","wave-rl":"rl","wave-tb":"tb","wave-bt":"bt"},o={amber:"#fcd34d",blue:"#93c5fd",cyan:"#67e8f9",emerald:"#6ee7b7",fuchsia:"#f0abfc",green:"#86efac",indigo:"#a5b4fc",lime:"#bef264",orange:"#fdba74",pink:"#f9a8d4",purple:"#d8b4fe",red:"#fca5a5",rose:"#fda4af",sky:"#7dd3fc",slate:"#cbd5e1",teal:"#5eead4",violet:"#c4b5fd",white:"#ffffff",black:"#000000",yellow:"#fde047"};!function(e){if(!e||"u"<typeof document)return;let t=document.head||document.getElementsByTagName("head")[0],a=document.createElement("style");a.type="text/css",t.appendChild(a),a.styleSheet?a.styleSheet.cssText=e:a.appendChild(document.createTextNode(e))}("@keyframes lumidot-wave{0%,100%{opacity:1}50%{opacity:.22}}[data-lumidot-dot]{border-radius:0;transform-origin:center;will-change:opacity,transform,box-shadow}[data-lumidot-mode=wave] [data-lumidot-dot-active=true]{animation:lumidot-wave var(--lumidot-duration,.7s) ease-in-out infinite;animation-delay:var(--lumidot-delay, 0s)}@media (prefers-reduced-motion:reduce){[data-lumidot-mode=wave] [data-lumidot-dot-active=true]{animation:none}[data-lumidot-dot]{transition:none!important;transform:none!important}}");let d=Array.from({length:9},(e,t)=>t),i=t.default.forwardRef(({variant:e="blue",pattern:a="all",glow:i=8,scale:s=1,duration:u=.7,direction:c="ltr",className:m,style:f,testId:h},p)=>{var b,w,v;let g=null!=(b=o[e])?b:o.blue,y=20*s,S=y/3,x=function(e,t){if(e<=0)return"none";let a=function(e,t=.5){let a=parseInt(e.slice(1,3),16),r=parseInt(e.slice(3,5),16),l=parseInt(e.slice(5,7),16),n=e=>Math.round(e+(255-e)*t).toString(16).padStart(2,"0");return`#${n(a)}${n(r)}${n(l)}`}(t);return`0 0 ${.4*e}px ${t}, 0 0 ${e}px ${a}60`}(i,g),E=null!=(w=r[a])?w:r.all,$=E.length>1,M=t.default.useMemo(()=>E.length<=1?E:"rtl"===c||"btt"===c?[...E].reverse():E,[E,c]),T=t.default.useMemo(()=>new Set(M.flat()),[M]),C=l.has(a),I=null!=(v=n[a])?v:c,[N,k]=t.default.useState(0),L=function(e){let[a,r]=t.default.useState(!1);return t.default.useEffect(()=>{if(!e)return;let t=window.matchMedia("(prefers-reduced-motion: reduce)");r(t.matches);let a=e=>r(e.matches);return t.addEventListener("change",a),()=>t.removeEventListener("change",a)},[e]),a}($);t.default.useEffect(()=>{if(!$||(k(0),M.length<=1||L))return;let e=window.setInterval(()=>k(e=>(e+1)%M.length),1250);return()=>window.clearInterval(e)},[M,L,$]);let _=t.default.useMemo(()=>$?L||M.length<=1?T:new Set(M[N%M.length]):new Set(E[0]),[$,E,L,M,N,T]),R=t.default.useMemo(()=>d.map(e=>{let t=_.has(e);return $?{width:S,height:S,backgroundColor:T.has(e)?g:"transparent",boxShadow:T.has(e)?x:"none",opacity:+!!t,transform:t?"scale(1)":"scale(0.7)",transition:M.length>1&&!L?`opacity ${t?37:250}ms ${t?"ease-out":"ease-in"}, transform 250ms ease`:void 0}:{width:S,height:S,backgroundColor:t?g:"transparent",boxShadow:t?x:"none","--lumidot-delay":`${t?C?0:function(e,t,a){let r=e%3,l=Math.floor(e/3),n=a/5;switch(t){case"ltr":default:return(r+l)*n;case"rtl":return(2-r+l)*n;case"ttb":return(l+r)*n;case"btt":return(2-l+r)*n;case"lr":return r*n;case"rl":return(2-r)*n;case"tb":return l*n;case"bt":return(2-l)*n}}(e,I,u):0}s`,"--lumidot-duration":`${u}s`}}),[_,g,S,u,I,37,M.length,x,$,C,T,L]);return t.default.createElement("span",{ref:p,role:"status","aria-label":"Loading","data-lumidot":"","data-lumidot-pattern":a,"data-lumidot-variant":e,"data-lumidot-direction":c,"data-lumidot-mode":$?"sequence":"wave","data-testid":h,className:m,style:{display:"inline-grid",gridTemplateColumns:"repeat(3, 1fr)",placeItems:"center",width:y,height:y,...f}},d.map(e=>t.default.createElement("span",{key:e,"data-lumidot-dot":"","data-lumidot-dot-active":_.has(e),style:R[e]})))});i.displayName="Lumidot",exports.COLORS=o,exports.Lumidot=i,exports.PATTERNS=r,exports.SYNC_PATTERNS=l,exports.WAVE_DIRECTIONS=n;
1
+ "use client";Object.defineProperty(exports,"__esModule",{value:!0});var e=require("react"),t=e&&e.__esModule?e:{default:e};let r=new Set(["corners-sync","frame-sync"]),a={"wave-lr":"lr","wave-rl":"rl","wave-tb":"tb","wave-bt":"bt"},n={amber:"#fcd34d",blue:"#93c5fd",cyan:"#67e8f9",emerald:"#6ee7b7",fuchsia:"#f0abfc",green:"#86efac",indigo:"#a5b4fc",lime:"#bef264",orange:"#fdba74",pink:"#f9a8d4",purple:"#d8b4fe",red:"#fca5a5",rose:"#fda4af",sky:"#7dd3fc",slate:"#cbd5e1",teal:"#5eead4",violet:"#c4b5fd",white:"#ffffff",black:"#000000",yellow:"#fde047"};!function(e){if(!e||"u"<typeof document)return;let t=document.head||document.getElementsByTagName("head")[0],r=document.createElement("style");r.type="text/css",t.appendChild(r),r.styleSheet?r.styleSheet.cssText=e:r.appendChild(document.createTextNode(e))}("@keyframes lumidot-wave{0%,100%{opacity:1}50%{opacity:.22}}[data-lumidot-dot]{margin:0;padding:0;border:none;border-radius:0;transform-origin:center;will-change:opacity,transform,box-shadow}[data-lumidot-mode=wave] [data-lumidot-dot-active=true]{animation:lumidot-wave var(--lumidot-duration,.7s) ease-in-out infinite;animation-delay:var(--lumidot-delay, 0s)}@media (prefers-reduced-motion:reduce){[data-lumidot-mode=wave] [data-lumidot-dot-active=true]{animation:none}[data-lumidot-dot]{transition:none!important;transform:none!important}}");let o=3;function l(e,t){return Array.from({length:t},(e,t)=>t)}function s(e,t){return Array.from({length:t},(r,a)=>(e-1)*t+a)}function i(e,t){return Array.from({length:e},(e,r)=>r*t)}function d(e,t){return Array.from({length:e},(e,r)=>r*t+(t-1))}function u(e,t){let r=Math.floor(e/2);return Array.from({length:t},(e,a)=>r*t+a)}function c(e,t){let r=Math.floor(t/2);return Array.from({length:e},(e,a)=>a*t+r)}let f=t.default.forwardRef(({variant:e="blue",pattern:f="all",rows:m=o,cols:h=o,glow:p=8,scale:g=1,duration:w=.7,direction:b="ltr",className:v,style:y,testId:M},S)=>{var x,E;let A=null!=(x=n[e])?x:n.blue,$=m*h,T=t.default.useMemo(()=>Array.from({length:$},(e,t)=>t),[$]),N=20*g/Math.max(m,h),k=function(e,t){if(e<=0)return"none";let r=function(e,t=.5){let r=parseInt(e.slice(1,3),16),a=parseInt(e.slice(3,5),16),n=parseInt(e.slice(5,7),16),o=e=>Math.round(e+(255-e)*t).toString(16).padStart(2,"0");return`#${o(r)}${o(a)}${o(n)}`}(t);return`0 0 ${.4*e}px ${t}, 0 0 ${e}px ${r}60`}(p,A),C=t.default.useMemo(()=>(function(e,t,r,a){let n=t*r;switch(e){case"solo-center":return[[Math.floor(t/2)*r+Math.floor(r/2)]];case"solo-tl":return[[0]];case"solo-br":return[[n-1]];case"line-h-top":return[l(t,r)];case"line-h-mid":return[u(t,r)];case"line-h-bot":return[s(t,r)];case"line-v-left":return[i(t,r)];case"line-v-mid":return[c(t,r)];case"line-v-right":return[d(t,r)];case"line-diag-1":case"sparse-1":return[Array.from({length:Math.min(t,r)},(e,t)=>t*r+t)];case"line-diag-2":return[Array.from({length:Math.min(t,r)},(e,t)=>t*r+(r-1-t))];case"corners-only":return[[0],[r-1],[n-1],[(t-1)*r]];case"corners-sync":return[[0,r-1,n-1,(t-1)*r]];case"plus-hollow":return[[Math.floor(r/2)],[Math.floor(t/2)*r+(r-1)],[(t-1)*r+Math.floor(r/2)],[Math.floor(t/2)*r]];case"l-tl":return[[...new Set([...l(t,r),...i(t,r)])]];case"l-tr":return[[...new Set([...l(t,r),...d(t,r)])]];case"l-bl":return[[...new Set([...s(t,r),...i(t,r)])]];case"l-br":return[[...new Set([...s(t,r),...d(t,r)])]];case"t-top":return[[...new Set([...l(t,r),...c(t,r)])]];case"t-bot":return[[...new Set([...s(t,r),...c(t,r)])]];case"t-left":return[[...new Set([...i(t,r),...u(t,r)])]];case"t-right":return[[...new Set([...d(t,r),...u(t,r)])]];case"duo-h":return[[Math.floor(t/2)*r,Math.floor(t/2)*r+(r-1)]];case"duo-v":return[[Math.floor(r/2),(t-1)*r+Math.floor(r/2)]];case"duo-diag":return[[0,n-1]];case"frame":var o,f;return[(o=t,f=r,o<2||f<2?o*f==1?[0]:l(o,f).concat(s(o,f)):[...l(o,f),...d(o,f).slice(1),...s(o,f).slice(0,-1).reverse(),...i(o,f).slice(1,-1).reverse()])];case"frame-sync":return[function(e,t){if(e<=1&&t<=1)return[0];let r=new Set;return l(e,t).forEach(e=>r.add(e)),d(e,t).forEach(e=>r.add(e)),s(e,t).forEach(e=>r.add(e)),i(e,t).forEach(e=>r.add(e)),Array.from(r)}(t,r)];case"sparse-2":return[[r-1,Math.floor(t/2)*r,(t-1)*r+Math.floor(r/2)]];case"sparse-3":return[[Math.floor(r/2),Math.floor(t/2)*r+(r-1),(t-1)*r]];case"all":case"wave-lr":case"wave-rl":case"wave-tb":case"wave-bt":default:return[Array.from({length:t*r},(e,t)=>t)];case"spiral":{let e=t<2||r<2?[[0]]:[l(t,r),d(t,r),s(t,r).reverse(),i(t,r).reverse()];return"rtl"===a||"btt"===a?[...e].reverse():e}}})(f,m,h,b),[f,m,h,b]),I=C.length>1,_=t.default.useMemo(()=>new Set(C.flat()),[C]),L=r.has(f),R=null!=(E=a[f])?E:b,[O,P]=t.default.useState(0),q=function(e){let[r,a]=t.default.useState(!1);return t.default.useEffect(()=>{if(!e)return;let t=window.matchMedia("(prefers-reduced-motion: reduce)");a(t.matches);let r=e=>a(e.matches);return t.addEventListener("change",r),()=>t.removeEventListener("change",r)},[e]),r}(I);t.default.useEffect(()=>{if(!I||(P(0),C.length<=1||q))return;let e=window.setInterval(()=>P(e=>(e+1)%C.length),1250);return()=>window.clearInterval(e)},[C,q,I]);let H=t.default.useMemo(()=>I?q||C.length<=1?_:new Set(C[O%C.length]):new Set(C[0]),[I,C,q,O,_]),W=t.default.useMemo(()=>T.map(e=>{let t=H.has(e),r={display:"block",width:N,height:N,minWidth:N,minHeight:N,boxSizing:"border-box"};return I?{...r,backgroundColor:_.has(e)?A:"transparent",boxShadow:_.has(e)?k:"none",opacity:+!!t,transform:t?"scale(1)":"scale(0.7)",transition:C.length>1&&!q?`opacity ${t?37:250}ms ${t?"ease-out":"ease-in"}, transform 250ms ease`:void 0}:{...r,backgroundColor:t?A:"transparent",boxShadow:t?k:"none","--lumidot-delay":`${t?L?0:function(e,t,r,a,n){let o=e%a,l=Math.floor(e/a),s=r/Math.max(5,a+n-2),i=a-1,d=n-1;switch(t){case"ltr":default:return(o+l)*s;case"rtl":return(i-o+l)*s;case"ttb":return(l+o)*s;case"btt":return(d-l+o)*s;case"lr":return o*s;case"rl":return(i-o)*s;case"tb":return l*s;case"bt":return(d-l)*s}}(e,R,w,h,m):0}s`,"--lumidot-duration":`${w}s`}}),[H,A,N,w,R,37,C.length,k,I,L,_,q,T,h,m]);return t.default.createElement("span",{ref:S,role:"status","aria-label":"Loading","data-lumidot":"","data-lumidot-pattern":f,"data-lumidot-variant":e,"data-lumidot-rows":m,"data-lumidot-cols":h,"data-lumidot-direction":b,"data-lumidot-mode":I?"sequence":"wave","data-testid":M,className:v,style:{display:"inline-grid",gridTemplateColumns:`repeat(${h}, ${N}px)`,gridTemplateRows:`repeat(${m}, ${N}px)`,gap:0,width:h*N,height:m*N,lineHeight:0,...y}},T.map(e=>t.default.createElement("span",{key:e,"data-lumidot-dot":"","data-lumidot-dot-active":H.has(e),style:W[e]})))});f.displayName="Lumidot",exports.COLORS=n,exports.Lumidot=f,exports.PATTERN_NAMES=["solo-center","solo-tl","solo-br","line-h-top","line-h-mid","line-h-bot","line-v-left","line-v-mid","line-v-right","line-diag-1","line-diag-2","corners-only","corners-sync","plus-hollow","l-tl","l-tr","l-bl","l-br","t-top","t-bot","t-left","t-right","duo-h","duo-v","duo-diag","frame","frame-sync","sparse-1","sparse-2","sparse-3","wave-lr","wave-rl","wave-tb","wave-bt","spiral","all"],exports.SYNC_PATTERNS=r,exports.WAVE_DIRECTIONS=a;
2
2
  //# sourceMappingURL=index.cjs.map
package/dist/index.d.mts CHANGED
@@ -1,45 +1,6 @@
1
1
  import React, { CSSProperties } from 'react';
2
2
 
3
- type DotIndex = 0 | 1 | 2 | 3 | 4 | 5 | 6 | 7 | 8;
4
- type DotFrame = readonly DotIndex[];
5
- declare const PATTERNS: {
6
- readonly 'solo-center': readonly [readonly [4]];
7
- readonly 'solo-tl': readonly [readonly [0]];
8
- readonly 'solo-br': readonly [readonly [8]];
9
- readonly 'line-h-top': readonly [readonly [0, 1, 2]];
10
- readonly 'line-h-mid': readonly [readonly [3, 4, 5]];
11
- readonly 'line-h-bot': readonly [readonly [6, 7, 8]];
12
- readonly 'line-v-left': readonly [readonly [0, 3, 6]];
13
- readonly 'line-v-mid': readonly [readonly [1, 4, 7]];
14
- readonly 'line-v-right': readonly [readonly [2, 5, 8]];
15
- readonly 'line-diag-1': readonly [readonly [0, 4, 8]];
16
- readonly 'line-diag-2': readonly [readonly [2, 4, 6]];
17
- readonly 'corners-only': readonly [readonly [0], readonly [2], readonly [8], readonly [6]];
18
- readonly 'corners-sync': readonly [DotFrame];
19
- readonly 'plus-hollow': readonly [readonly [1], readonly [3], readonly [5], readonly [7]];
20
- readonly 'l-tl': readonly [readonly [0, 3, 6, 7, 8]];
21
- readonly 'l-tr': readonly [readonly [2, 5, 6, 7, 8]];
22
- readonly 'l-bl': readonly [readonly [0, 1, 2, 3, 6]];
23
- readonly 'l-br': readonly [readonly [0, 1, 2, 5, 8]];
24
- readonly 't-top': readonly [readonly [0, 1, 2, 4, 7]];
25
- readonly 't-bot': readonly [readonly [1, 4, 6, 7, 8]];
26
- readonly 't-left': readonly [readonly [0, 1, 3, 6, 7]];
27
- readonly 't-right': readonly [readonly [1, 2, 5, 7, 8]];
28
- readonly 'duo-h': readonly [readonly [3, 5]];
29
- readonly 'duo-v': readonly [readonly [1, 7]];
30
- readonly 'duo-diag': readonly [readonly [0, 8]];
31
- readonly frame: readonly [DotFrame];
32
- readonly 'frame-sync': readonly [readonly [0, 1, 2, 3, 5, 6, 7, 8]];
33
- readonly 'sparse-1': readonly [readonly [0, 4, 8]];
34
- readonly 'sparse-2': readonly [readonly [2, 3, 7]];
35
- readonly 'sparse-3': readonly [readonly [1, 5, 6]];
36
- readonly 'wave-lr': readonly [DotFrame];
37
- readonly 'wave-rl': readonly [DotFrame];
38
- readonly 'wave-tb': readonly [DotFrame];
39
- readonly 'wave-bt': readonly [DotFrame];
40
- readonly spiral: readonly [readonly [0, 1, 2], readonly [2, 5, 8], readonly [8, 7, 6], readonly [6, 3, 0]];
41
- readonly all: readonly [DotFrame];
42
- };
3
+ declare const PATTERN_NAMES: readonly ["solo-center", "solo-tl", "solo-br", "line-h-top", "line-h-mid", "line-h-bot", "line-v-left", "line-v-mid", "line-v-right", "line-diag-1", "line-diag-2", "corners-only", "corners-sync", "plus-hollow", "l-tl", "l-tr", "l-bl", "l-br", "t-top", "t-bot", "t-left", "t-right", "duo-h", "duo-v", "duo-diag", "frame", "frame-sync", "sparse-1", "sparse-2", "sparse-3", "wave-lr", "wave-rl", "wave-tb", "wave-bt", "spiral", "all"];
43
4
  declare const SYNC_PATTERNS: Set<string>;
44
5
  declare const WAVE_DIRECTIONS: {
45
6
  readonly 'wave-lr': "lr";
@@ -70,11 +31,13 @@ declare const COLORS: {
70
31
  readonly yellow: "#fde047";
71
32
  };
72
33
  type LumidotVariant = keyof typeof COLORS;
73
- type LumidotPattern = keyof typeof PATTERNS;
34
+ type LumidotPattern = (typeof PATTERN_NAMES)[number];
74
35
  type LumidotDirection = 'ltr' | 'rtl' | 'ttb' | 'btt';
75
36
  interface LumidotProps {
76
37
  variant?: LumidotVariant;
77
38
  pattern?: LumidotPattern;
39
+ rows?: number;
40
+ cols?: number;
78
41
  glow?: number;
79
42
  scale?: number;
80
43
  duration?: number;
@@ -86,5 +49,5 @@ interface LumidotProps {
86
49
 
87
50
  declare const Lumidot: React.ForwardRefExoticComponent<LumidotProps & React.RefAttributes<HTMLSpanElement>>;
88
51
 
89
- export { COLORS, Lumidot, PATTERNS, SYNC_PATTERNS, WAVE_DIRECTIONS };
52
+ export { COLORS, Lumidot, PATTERN_NAMES, SYNC_PATTERNS, WAVE_DIRECTIONS };
90
53
  export type { LumidotDirection, LumidotPattern, LumidotProps, LumidotVariant };
package/dist/index.d.ts CHANGED
@@ -1,45 +1,6 @@
1
1
  import React, { CSSProperties } from 'react';
2
2
 
3
- type DotIndex = 0 | 1 | 2 | 3 | 4 | 5 | 6 | 7 | 8;
4
- type DotFrame = readonly DotIndex[];
5
- declare const PATTERNS: {
6
- readonly 'solo-center': readonly [readonly [4]];
7
- readonly 'solo-tl': readonly [readonly [0]];
8
- readonly 'solo-br': readonly [readonly [8]];
9
- readonly 'line-h-top': readonly [readonly [0, 1, 2]];
10
- readonly 'line-h-mid': readonly [readonly [3, 4, 5]];
11
- readonly 'line-h-bot': readonly [readonly [6, 7, 8]];
12
- readonly 'line-v-left': readonly [readonly [0, 3, 6]];
13
- readonly 'line-v-mid': readonly [readonly [1, 4, 7]];
14
- readonly 'line-v-right': readonly [readonly [2, 5, 8]];
15
- readonly 'line-diag-1': readonly [readonly [0, 4, 8]];
16
- readonly 'line-diag-2': readonly [readonly [2, 4, 6]];
17
- readonly 'corners-only': readonly [readonly [0], readonly [2], readonly [8], readonly [6]];
18
- readonly 'corners-sync': readonly [DotFrame];
19
- readonly 'plus-hollow': readonly [readonly [1], readonly [3], readonly [5], readonly [7]];
20
- readonly 'l-tl': readonly [readonly [0, 3, 6, 7, 8]];
21
- readonly 'l-tr': readonly [readonly [2, 5, 6, 7, 8]];
22
- readonly 'l-bl': readonly [readonly [0, 1, 2, 3, 6]];
23
- readonly 'l-br': readonly [readonly [0, 1, 2, 5, 8]];
24
- readonly 't-top': readonly [readonly [0, 1, 2, 4, 7]];
25
- readonly 't-bot': readonly [readonly [1, 4, 6, 7, 8]];
26
- readonly 't-left': readonly [readonly [0, 1, 3, 6, 7]];
27
- readonly 't-right': readonly [readonly [1, 2, 5, 7, 8]];
28
- readonly 'duo-h': readonly [readonly [3, 5]];
29
- readonly 'duo-v': readonly [readonly [1, 7]];
30
- readonly 'duo-diag': readonly [readonly [0, 8]];
31
- readonly frame: readonly [DotFrame];
32
- readonly 'frame-sync': readonly [readonly [0, 1, 2, 3, 5, 6, 7, 8]];
33
- readonly 'sparse-1': readonly [readonly [0, 4, 8]];
34
- readonly 'sparse-2': readonly [readonly [2, 3, 7]];
35
- readonly 'sparse-3': readonly [readonly [1, 5, 6]];
36
- readonly 'wave-lr': readonly [DotFrame];
37
- readonly 'wave-rl': readonly [DotFrame];
38
- readonly 'wave-tb': readonly [DotFrame];
39
- readonly 'wave-bt': readonly [DotFrame];
40
- readonly spiral: readonly [readonly [0, 1, 2], readonly [2, 5, 8], readonly [8, 7, 6], readonly [6, 3, 0]];
41
- readonly all: readonly [DotFrame];
42
- };
3
+ declare const PATTERN_NAMES: readonly ["solo-center", "solo-tl", "solo-br", "line-h-top", "line-h-mid", "line-h-bot", "line-v-left", "line-v-mid", "line-v-right", "line-diag-1", "line-diag-2", "corners-only", "corners-sync", "plus-hollow", "l-tl", "l-tr", "l-bl", "l-br", "t-top", "t-bot", "t-left", "t-right", "duo-h", "duo-v", "duo-diag", "frame", "frame-sync", "sparse-1", "sparse-2", "sparse-3", "wave-lr", "wave-rl", "wave-tb", "wave-bt", "spiral", "all"];
43
4
  declare const SYNC_PATTERNS: Set<string>;
44
5
  declare const WAVE_DIRECTIONS: {
45
6
  readonly 'wave-lr': "lr";
@@ -70,11 +31,13 @@ declare const COLORS: {
70
31
  readonly yellow: "#fde047";
71
32
  };
72
33
  type LumidotVariant = keyof typeof COLORS;
73
- type LumidotPattern = keyof typeof PATTERNS;
34
+ type LumidotPattern = (typeof PATTERN_NAMES)[number];
74
35
  type LumidotDirection = 'ltr' | 'rtl' | 'ttb' | 'btt';
75
36
  interface LumidotProps {
76
37
  variant?: LumidotVariant;
77
38
  pattern?: LumidotPattern;
39
+ rows?: number;
40
+ cols?: number;
78
41
  glow?: number;
79
42
  scale?: number;
80
43
  duration?: number;
@@ -86,5 +49,5 @@ interface LumidotProps {
86
49
 
87
50
  declare const Lumidot: React.ForwardRefExoticComponent<LumidotProps & React.RefAttributes<HTMLSpanElement>>;
88
51
 
89
- export { COLORS, Lumidot, PATTERNS, SYNC_PATTERNS, WAVE_DIRECTIONS };
52
+ export { COLORS, Lumidot, PATTERN_NAMES, SYNC_PATTERNS, WAVE_DIRECTIONS };
90
53
  export type { LumidotDirection, LumidotPattern, LumidotProps, LumidotVariant };
package/dist/index.mjs CHANGED
@@ -1,2 +1,2 @@
1
- "use client";import e from"react";let t=[0,1,2,3,4,5,6,7,8],a={"solo-center":[[4]],"solo-tl":[[0]],"solo-br":[[8]],"line-h-top":[[0,1,2]],"line-h-mid":[[3,4,5]],"line-h-bot":[[6,7,8]],"line-v-left":[[0,3,6]],"line-v-mid":[[1,4,7]],"line-v-right":[[2,5,8]],"line-diag-1":[[0,4,8]],"line-diag-2":[[2,4,6]],"corners-only":[[0],[2],[8],[6]],"corners-sync":[[0,2,6,8]],"plus-hollow":[[1],[3],[5],[7]],"l-tl":[[0,3,6,7,8]],"l-tr":[[2,5,6,7,8]],"l-bl":[[0,1,2,3,6]],"l-br":[[0,1,2,5,8]],"t-top":[[0,1,2,4,7]],"t-bot":[[1,4,6,7,8]],"t-left":[[0,1,3,6,7]],"t-right":[[1,2,5,7,8]],"duo-h":[[3,5]],"duo-v":[[1,7]],"duo-diag":[[0,8]],frame:[[0,1,2,5,8,7,6,3]],"frame-sync":[[0,1,2,3,5,6,7,8]],"sparse-1":[[0,4,8]],"sparse-2":[[2,3,7]],"sparse-3":[[1,5,6]],"wave-lr":[t],"wave-rl":[t],"wave-tb":[t],"wave-bt":[t],spiral:[[0,1,2],[2,5,8],[8,7,6],[6,3,0]],all:[t]},r=new Set(["corners-sync","frame-sync"]),n={"wave-lr":"lr","wave-rl":"rl","wave-tb":"tb","wave-bt":"bt"},l={amber:"#fcd34d",blue:"#93c5fd",cyan:"#67e8f9",emerald:"#6ee7b7",fuchsia:"#f0abfc",green:"#86efac",indigo:"#a5b4fc",lime:"#bef264",orange:"#fdba74",pink:"#f9a8d4",purple:"#d8b4fe",red:"#fca5a5",rose:"#fda4af",sky:"#7dd3fc",slate:"#cbd5e1",teal:"#5eead4",violet:"#c4b5fd",white:"#ffffff",black:"#000000",yellow:"#fde047"};!function(e){if(!e||"u"<typeof document)return;let t=document.head||document.getElementsByTagName("head")[0],a=document.createElement("style");a.type="text/css",t.appendChild(a),a.styleSheet?a.styleSheet.cssText=e:a.appendChild(document.createTextNode(e))}("@keyframes lumidot-wave{0%,100%{opacity:1}50%{opacity:.22}}[data-lumidot-dot]{border-radius:0;transform-origin:center;will-change:opacity,transform,box-shadow}[data-lumidot-mode=wave] [data-lumidot-dot-active=true]{animation:lumidot-wave var(--lumidot-duration,.7s) ease-in-out infinite;animation-delay:var(--lumidot-delay, 0s)}@media (prefers-reduced-motion:reduce){[data-lumidot-mode=wave] [data-lumidot-dot-active=true]{animation:none}[data-lumidot-dot]{transition:none!important;transform:none!important}}");let o=Array.from({length:9},(e,t)=>t),i=e.forwardRef(({variant:t="blue",pattern:i="all",glow:d=8,scale:s=1,duration:u=.7,direction:c="ltr",className:m,style:f,testId:h},p)=>{var b,w,g;let v=null!=(b=l[t])?b:l.blue,y=20*s,S=y/3,E=function(e,t){if(e<=0)return"none";let a=function(e,t=.5){let a=parseInt(e.slice(1,3),16),r=parseInt(e.slice(3,5),16),n=parseInt(e.slice(5,7),16),l=e=>Math.round(e+(255-e)*t).toString(16).padStart(2,"0");return`#${l(a)}${l(r)}${l(n)}`}(t);return`0 0 ${.4*e}px ${t}, 0 0 ${e}px ${a}60`}(d,v),$=null!=(w=a[i])?w:a.all,x=$.length>1,T=e.useMemo(()=>$.length<=1?$:"rtl"===c||"btt"===c?[...$].reverse():$,[$,c]),C=e.useMemo(()=>new Set(T.flat()),[T]),I=r.has(i),N=null!=(g=n[i])?g:c,[k,M]=e.useState(0),L=function(t){let[a,r]=e.useState(!1);return e.useEffect(()=>{if(!t)return;let e=window.matchMedia("(prefers-reduced-motion: reduce)");r(e.matches);let a=e=>r(e.matches);return e.addEventListener("change",a),()=>e.removeEventListener("change",a)},[t]),a}(x);e.useEffect(()=>{if(!x||(M(0),T.length<=1||L))return;let e=window.setInterval(()=>M(e=>(e+1)%T.length),1250);return()=>window.clearInterval(e)},[T,L,x]);let R=e.useMemo(()=>x?L||T.length<=1?C:new Set(T[k%T.length]):new Set($[0]),[x,$,L,T,k,C]),A=e.useMemo(()=>o.map(e=>{let t=R.has(e);return x?{width:S,height:S,backgroundColor:C.has(e)?v:"transparent",boxShadow:C.has(e)?E:"none",opacity:+!!t,transform:t?"scale(1)":"scale(0.7)",transition:T.length>1&&!L?`opacity ${t?37:250}ms ${t?"ease-out":"ease-in"}, transform 250ms ease`:void 0}:{width:S,height:S,backgroundColor:t?v:"transparent",boxShadow:t?E:"none","--lumidot-delay":`${t?I?0:function(e,t,a){let r=e%3,n=Math.floor(e/3),l=a/5;switch(t){case"ltr":default:return(r+n)*l;case"rtl":return(2-r+n)*l;case"ttb":return(n+r)*l;case"btt":return(2-n+r)*l;case"lr":return r*l;case"rl":return(2-r)*l;case"tb":return n*l;case"bt":return(2-n)*l}}(e,N,u):0}s`,"--lumidot-duration":`${u}s`}}),[R,v,S,u,N,37,T.length,E,x,I,C,L]);return e.createElement("span",{ref:p,role:"status","aria-label":"Loading","data-lumidot":"","data-lumidot-pattern":i,"data-lumidot-variant":t,"data-lumidot-direction":c,"data-lumidot-mode":x?"sequence":"wave","data-testid":h,className:m,style:{display:"inline-grid",gridTemplateColumns:"repeat(3, 1fr)",placeItems:"center",width:y,height:y,...f}},o.map(t=>e.createElement("span",{key:t,"data-lumidot-dot":"","data-lumidot-dot-active":R.has(t),style:A[t]})))});i.displayName="Lumidot";export{l as COLORS,i as Lumidot,a as PATTERNS,r as SYNC_PATTERNS,n as WAVE_DIRECTIONS};
1
+ "use client";import e from"react";let t=["solo-center","solo-tl","solo-br","line-h-top","line-h-mid","line-h-bot","line-v-left","line-v-mid","line-v-right","line-diag-1","line-diag-2","corners-only","corners-sync","plus-hollow","l-tl","l-tr","l-bl","l-br","t-top","t-bot","t-left","t-right","duo-h","duo-v","duo-diag","frame","frame-sync","sparse-1","sparse-2","sparse-3","wave-lr","wave-rl","wave-tb","wave-bt","spiral","all"],r=new Set(["corners-sync","frame-sync"]),a={"wave-lr":"lr","wave-rl":"rl","wave-tb":"tb","wave-bt":"bt"},n={amber:"#fcd34d",blue:"#93c5fd",cyan:"#67e8f9",emerald:"#6ee7b7",fuchsia:"#f0abfc",green:"#86efac",indigo:"#a5b4fc",lime:"#bef264",orange:"#fdba74",pink:"#f9a8d4",purple:"#d8b4fe",red:"#fca5a5",rose:"#fda4af",sky:"#7dd3fc",slate:"#cbd5e1",teal:"#5eead4",violet:"#c4b5fd",white:"#ffffff",black:"#000000",yellow:"#fde047"};!function(e){if(!e||"u"<typeof document)return;let t=document.head||document.getElementsByTagName("head")[0],r=document.createElement("style");r.type="text/css",t.appendChild(r),r.styleSheet?r.styleSheet.cssText=e:r.appendChild(document.createTextNode(e))}("@keyframes lumidot-wave{0%,100%{opacity:1}50%{opacity:.22}}[data-lumidot-dot]{margin:0;padding:0;border:none;border-radius:0;transform-origin:center;will-change:opacity,transform,box-shadow}[data-lumidot-mode=wave] [data-lumidot-dot-active=true]{animation:lumidot-wave var(--lumidot-duration,.7s) ease-in-out infinite;animation-delay:var(--lumidot-delay, 0s)}@media (prefers-reduced-motion:reduce){[data-lumidot-mode=wave] [data-lumidot-dot-active=true]{animation:none}[data-lumidot-dot]{transition:none!important;transform:none!important}}");let o=3;function l(e,t){return Array.from({length:t},(e,t)=>t)}function s(e,t){return Array.from({length:t},(r,a)=>(e-1)*t+a)}function i(e,t){return Array.from({length:e},(e,r)=>r*t)}function d(e,t){return Array.from({length:e},(e,r)=>r*t+(t-1))}function u(e,t){let r=Math.floor(e/2);return Array.from({length:t},(e,a)=>r*t+a)}function c(e,t){let r=Math.floor(t/2);return Array.from({length:e},(e,a)=>a*t+r)}let f=e.forwardRef(({variant:t="blue",pattern:f="all",rows:m=o,cols:h=o,glow:p=8,scale:g=1,duration:w=.7,direction:b="ltr",className:v,style:y,testId:M},S)=>{var E,x;let A=null!=(E=n[t])?E:n.blue,$=m*h,T=e.useMemo(()=>Array.from({length:$},(e,t)=>t),[$]),N=20*g/Math.max(m,h),k=function(e,t){if(e<=0)return"none";let r=function(e,t=.5){let r=parseInt(e.slice(1,3),16),a=parseInt(e.slice(3,5),16),n=parseInt(e.slice(5,7),16),o=e=>Math.round(e+(255-e)*t).toString(16).padStart(2,"0");return`#${o(r)}${o(a)}${o(n)}`}(t);return`0 0 ${.4*e}px ${t}, 0 0 ${e}px ${r}60`}(p,A),C=e.useMemo(()=>(function(e,t,r,a){let n=t*r;switch(e){case"solo-center":return[[Math.floor(t/2)*r+Math.floor(r/2)]];case"solo-tl":return[[0]];case"solo-br":return[[n-1]];case"line-h-top":return[l(t,r)];case"line-h-mid":return[u(t,r)];case"line-h-bot":return[s(t,r)];case"line-v-left":return[i(t,r)];case"line-v-mid":return[c(t,r)];case"line-v-right":return[d(t,r)];case"line-diag-1":case"sparse-1":return[Array.from({length:Math.min(t,r)},(e,t)=>t*r+t)];case"line-diag-2":return[Array.from({length:Math.min(t,r)},(e,t)=>t*r+(r-1-t))];case"corners-only":return[[0],[r-1],[n-1],[(t-1)*r]];case"corners-sync":return[[0,r-1,n-1,(t-1)*r]];case"plus-hollow":return[[Math.floor(r/2)],[Math.floor(t/2)*r+(r-1)],[(t-1)*r+Math.floor(r/2)],[Math.floor(t/2)*r]];case"l-tl":return[[...new Set([...l(t,r),...i(t,r)])]];case"l-tr":return[[...new Set([...l(t,r),...d(t,r)])]];case"l-bl":return[[...new Set([...s(t,r),...i(t,r)])]];case"l-br":return[[...new Set([...s(t,r),...d(t,r)])]];case"t-top":return[[...new Set([...l(t,r),...c(t,r)])]];case"t-bot":return[[...new Set([...s(t,r),...c(t,r)])]];case"t-left":return[[...new Set([...i(t,r),...u(t,r)])]];case"t-right":return[[...new Set([...d(t,r),...u(t,r)])]];case"duo-h":return[[Math.floor(t/2)*r,Math.floor(t/2)*r+(r-1)]];case"duo-v":return[[Math.floor(r/2),(t-1)*r+Math.floor(r/2)]];case"duo-diag":return[[0,n-1]];case"frame":var o,f;return[(o=t,f=r,o<2||f<2?o*f==1?[0]:l(o,f).concat(s(o,f)):[...l(o,f),...d(o,f).slice(1),...s(o,f).slice(0,-1).reverse(),...i(o,f).slice(1,-1).reverse()])];case"frame-sync":return[function(e,t){if(e<=1&&t<=1)return[0];let r=new Set;return l(e,t).forEach(e=>r.add(e)),d(e,t).forEach(e=>r.add(e)),s(e,t).forEach(e=>r.add(e)),i(e,t).forEach(e=>r.add(e)),Array.from(r)}(t,r)];case"sparse-2":return[[r-1,Math.floor(t/2)*r,(t-1)*r+Math.floor(r/2)]];case"sparse-3":return[[Math.floor(r/2),Math.floor(t/2)*r+(r-1),(t-1)*r]];case"all":case"wave-lr":case"wave-rl":case"wave-tb":case"wave-bt":default:return[Array.from({length:t*r},(e,t)=>t)];case"spiral":{let e=t<2||r<2?[[0]]:[l(t,r),d(t,r),s(t,r).reverse(),i(t,r).reverse()];return"rtl"===a||"btt"===a?[...e].reverse():e}}})(f,m,h,b),[f,m,h,b]),I=C.length>1,L=e.useMemo(()=>new Set(C.flat()),[C]),R=r.has(f),O=null!=(x=a[f])?x:b,[_,H]=e.useState(0),P=function(t){let[r,a]=e.useState(!1);return e.useEffect(()=>{if(!t)return;let e=window.matchMedia("(prefers-reduced-motion: reduce)");a(e.matches);let r=e=>a(e.matches);return e.addEventListener("change",r),()=>e.removeEventListener("change",r)},[t]),r}(I);e.useEffect(()=>{if(!I||(H(0),C.length<=1||P))return;let e=window.setInterval(()=>H(e=>(e+1)%C.length),1250);return()=>window.clearInterval(e)},[C,P,I]);let W=e.useMemo(()=>I?P||C.length<=1?L:new Set(C[_%C.length]):new Set(C[0]),[I,C,P,_,L]),q=e.useMemo(()=>T.map(e=>{let t=W.has(e),r={display:"block",width:N,height:N,minWidth:N,minHeight:N,boxSizing:"border-box"};return I?{...r,backgroundColor:L.has(e)?A:"transparent",boxShadow:L.has(e)?k:"none",opacity:+!!t,transform:t?"scale(1)":"scale(0.7)",transition:C.length>1&&!P?`opacity ${t?37:250}ms ${t?"ease-out":"ease-in"}, transform 250ms ease`:void 0}:{...r,backgroundColor:t?A:"transparent",boxShadow:t?k:"none","--lumidot-delay":`${t?R?0:function(e,t,r,a,n){let o=e%a,l=Math.floor(e/a),s=r/Math.max(5,a+n-2),i=a-1,d=n-1;switch(t){case"ltr":default:return(o+l)*s;case"rtl":return(i-o+l)*s;case"ttb":return(l+o)*s;case"btt":return(d-l+o)*s;case"lr":return o*s;case"rl":return(i-o)*s;case"tb":return l*s;case"bt":return(d-l)*s}}(e,O,w,h,m):0}s`,"--lumidot-duration":`${w}s`}}),[W,A,N,w,O,37,C.length,k,I,R,L,P,T,h,m]);return e.createElement("span",{ref:S,role:"status","aria-label":"Loading","data-lumidot":"","data-lumidot-pattern":f,"data-lumidot-variant":t,"data-lumidot-rows":m,"data-lumidot-cols":h,"data-lumidot-direction":b,"data-lumidot-mode":I?"sequence":"wave","data-testid":M,className:v,style:{display:"inline-grid",gridTemplateColumns:`repeat(${h}, ${N}px)`,gridTemplateRows:`repeat(${m}, ${N}px)`,gap:0,width:h*N,height:m*N,lineHeight:0,...y}},T.map(t=>e.createElement("span",{key:t,"data-lumidot-dot":"","data-lumidot-dot-active":W.has(t),style:q[t]})))});f.displayName="Lumidot";export{n as COLORS,f as Lumidot,t as PATTERN_NAMES,r as SYNC_PATTERNS,a as WAVE_DIRECTIONS};
2
2
  //# sourceMappingURL=index.mjs.map
package/package.json CHANGED
@@ -1,7 +1,7 @@
1
1
  {
2
2
  "name": "lumidot",
3
- "version": "0.5.1",
4
- "description": "A 3x3 dot-grid loader for React, inspired by the RGB spinner animation",
3
+ "version": "0.6.0",
4
+ "description": "Dot-grid loading animations for React. Tiny, flexible, beautiful.",
5
5
  "license": "MIT",
6
6
  "author": {
7
7
  "email": "zainzafar90@gmail.com",