ipad-cursor
Advanced tools
Comparing version 0.2.0 to 0.3.0
@@ -47,2 +47,6 @@ export type ICursorType = "normal" | "text" | "block"; | ||
enableAutoTextCursor?: boolean; | ||
/** | ||
* whether to enable lighting effect | ||
*/ | ||
enableLighting?: boolean; | ||
} | ||
@@ -49,0 +53,0 @@ /** |
@@ -1,1 +0,1 @@ | ||
let t=!1,e=null,r=!1,o=!1,n=null;const s={x:0,y:0},a="undefined"==typeof document,i=new Set,u=new Map,c={blockPadding:"auto",adsorptionStrength:10,className:"ipad-cursor",normalStyle:{width:"20px",height:"20px",radius:"50%",durationBase:"0.23s",durationPosition:"0s",durationBackdropFilter:"0s",background:"rgba(150, 150, 150, 0.2)",border:"1px solid rgba(100, 100, 100, 0.1)",zIndex:9999,scale:1,backdropBlur:"0px",backdropSaturate:"180%"},textStyle:{width:"4px",height:"1.2em",border:"0px solid rgba(100, 100, 100, 0)",background:"rgba(100, 100, 100, 0.3)",durationBackdropFilter:"1s",radius:"10px"},blockStyle:{background:"rgba(100, 100, 100, 0.1)",border:"1px solid rgba(100, 100, 100, 0.05)",backdropBlur:"0px",durationBase:"0.23s",durationBackdropFilter:"0.1s",backdropSaturate:"120%",radius:"10px"}};class d{static clamp(t,e,r){return Math.min(Math.max(t,e),r)}static isNum(t){return"number"==typeof t||/^\d+$/.test(t)}static getSize(t){return this.isNum(t)?`${t}px`:t}static getDuration(t){return this.isNum(t)?`${t}ms`:`${t}`}static getColor(t){return t}static objectKeys(t){return Object.keys(t)}static style2Vars(t){const e={backdropBlur:"--cursor-bg-blur",backdropSaturate:"--cursor-bg-saturate",background:"--cursor-bg",border:"--cursor-border",durationBackdropFilter:"--cursor-blur-duration",durationBase:"--cursor-duration",durationPosition:"--cursor-position-duration",height:"--cursor-height",radius:"--cursor-radius",scale:"--cursor-scale",width:"--cursor-width",zIndex:"--cursor-z-index"};return this.objectKeys(t).reduce(((r,o)=>{let n=t[o];if(void 0===n)return r;const s=["background","border"].includes(o),a=["width","height","radius","backdropBlur"].includes(o),i=o.startsWith("duration");s&&(n=this.getColor(n)),a&&(n=this.getSize(n)),i&&(n=this.getDuration(n));const u=e[o]||o;return{...r,[u]:n}}),{})}static isMergebleObject(t){return(e=t)&&"object"==typeof e&&!Array.isArray(e)&&Object.keys(t).length>0;var e}static mergeDeep(t,...e){if(!e.length)return t;const r=e.shift();return r?(this.isMergebleObject(t)&&this.isMergebleObject(r)&&d.objectKeys(r).forEach((e=>{this.isMergebleObject(r[e])?(t[e]||Object.assign(t,{[e]:{}}),this.mergeDeep(t[e],r[e])):Object.assign(t,{[e]:r[e]})})),this.mergeDeep(t,...e)):t}}function l(t,r){e&&("string"==typeof t?r&&e.style.setProperty(t,r):Object.entries(t).forEach((([t,r])=>{e&&e.style.setProperty(t,r)})))}function p(t){s.x=t.clientX,s.y=t.clientY,function(t){var e;if(r||o||!c.enableAutoTextCursor)return;if(t&&1===t.childNodes.length){const r=t.childNodes[0];if(3===r.nodeType&&""!==(null===(e=r.textContent)||void 0===e?void 0:e.trim()))return t.setAttribute("data-cursor","text"),void k(t)}x()}(t.target)}function h(r){a||t||(r&&b(r),t=!0,window.addEventListener("mousemove",p),function(){if(a)return;e=document.createElement("div"),e.classList.add(c.className),document.body.appendChild(e),x()}(),function(){if(n)return;n=document.createElement("style"),n.innerHTML=`\n body, * {\n cursor: none;\n }\n .${c.className.split(/\s+/).join(".")} {\n pointer-events: none;\n position: fixed;\n left: var(--cursor-x);\n top: var(--cursor-y);\n width: var(--cursor-width);\n height: var(--cursor-height);\n border-radius: var(--cursor-radius);\n background-color: var(--cursor-bg);\n border: var(--cursor-border);\n z-index: var(--cursor-z-index);\n font-size: var(--cursor-font-size);\n backdrop-filter: \n blur(var(--cursor-bg-blur)) \n saturate(var(--cursor-bg-saturate));\n transition:\n width var(--cursor-duration) ease,\n height var(--cursor-duration) ease,\n border-radius var(--cursor-duration) ease,\n border var(--cursor-duration) ease,\n background-color var(--cursor-duration) ease,\n left var(--cursor-position-duration) ease,\n top var(--cursor-position-duration) ease,\n backdrop-filter var(--cursor-blur-duration) ease;\n transform: \n translate(calc(-50% + var(--cursor-translateX)), calc(-50% + var(--cursor-translateY))) \n scale(var(--cursor-scale));\n }\n `,document.head.appendChild(n)}(),g(),m())}function v(){t&&(t=!1,window.removeEventListener("mousemove",p),e&&e.remove(),n&&n.remove(),n=null,e=null,i.forEach((t=>f(t))))}function b(t){return"adsorptionStrength"in t&&(c.adsorptionStrength=d.clamp(t.adsorptionStrength||10,0,30)),d.mergeDeep(c,t)}function g(){!a&&e&&(r||(l("--cursor-x",`${s.x}px`),l("--cursor-y",`${s.y}px`)),window.requestAnimationFrame(g))}function m(){if(a||!t)return;const n=new Map;(a||!t?[]:document.querySelectorAll("[data-cursor]")).forEach((t=>{n.set(t,!0),i.has(t)||function(t){let n=t.getAttribute("data-cursor");i.add(t),"text"===n&&function(t){let e;function r(t){e&&clearTimeout(e),o=!0,e=setTimeout((()=>o=!0)),k(t.target)}function n(){e&&clearTimeout(e),e=setTimeout((()=>o=!1)),x()}t.addEventListener("mouseover",r,{passive:!0}),t.addEventListener("mouseleave",n,{passive:!0}),u.set(t,[{event:"mouseover",handler:r},{event:"mouseleave",handler:x}])}(t);"block"===n?function(t){const o=t;let n;function a(){var t,s;const a=o.getBoundingClientRect();n&&clearTimeout(n),r=!0,n=setTimeout((()=>r=!0));let i=c.blockPadding||0;if("auto"===i){const t=Math.min(a.width,a.height);i=Math.max(2,Math.floor(t/25))}e.classList.add("focus"),l("--cursor-x",`${a.left+a.width/2}px`),l("--cursor-y",`${a.top+a.height/2}px`),l("--cursor-width",`${a.width+2*i}px`),l("--cursor-height",`${a.height+2*i}px`);const u={...c.blockStyle||{},...y(o)};void 0===u.durationPosition&&(u.durationPosition=null!==(t=u.durationBase)&&void 0!==t?t:null===(s=c.normalStyle)||void 0===s?void 0:s.durationBase),l(d.style2Vars(u)),h(!0),o.style.setProperty("transform","translate(var(--translateX), var(--translateY))")}function i(){const t=o.getBoundingClientRect(),e=t.height/2,r=(s.y-t.top-e)/e,n=t.width/2,a=(s.x-t.left-n)/n,i=c.adsorptionStrength||10;l("--cursor-translateX",a*(t.width/100*i)+"px"),l("--cursor-translateY",r*(t.height/100*i)+"px"),h(!1),o.style.setProperty("--translateX",a*(t.width/100*i)+"px"),o.style.setProperty("--translateY",r*(t.height/100*i)+"px")}function p(){n&&clearTimeout(n),n=setTimeout((()=>{r=!1,e&&e.classList.remove("focus")})),x(),h(!0),o.style.setProperty("transform","translate(0px, 0px)")}function h(t){var e,r,n,s,a,i;const u=t?d.getDuration(null!==(i=null!==(s=null!==(r=null===(e=null==c?void 0:c.blockStyle)||void 0===e?void 0:e.durationPosition)&&void 0!==r?r:null===(n=null==c?void 0:c.blockStyle)||void 0===n?void 0:n.durationBase)&&void 0!==s?s:null===(a=null==c?void 0:c.normalStyle)||void 0===a?void 0:a.durationBase)&&void 0!==i?i:"0.23s"):"";o.style.setProperty("transition",u?`all ${u} cubic-bezier(.58,.09,.46,1.46)`:"none")}o.addEventListener("mouseenter",a,{passive:!0}),o.addEventListener("mousemove",i,{passive:!0}),o.addEventListener("mouseleave",p,{passive:!0}),u.set(o,[{event:"mouseenter",handler:a},{event:"mousemove",handler:i},{event:"mouseleave",handler:p}])}(t):i.delete(t)}(t)})),i.forEach((t=>{n.has(t)||f(t)}))}function f(t){var e;i.delete(t),null===(e=u.get(t))||void 0===e||e.forEach((({event:e,handler:r})=>{t.removeEventListener(e,r)})),u.delete(t),t.style.setProperty("transform","none")}function y(t){const e=t.getAttribute("data-cursor-style"),r={};return e&&e.split(/(;)/).forEach((t=>{const[e,o]=t.split(":").map((t=>t.trim()));r[e]=o})),r}function x(){l(d.style2Vars(c.normalStyle||{}))}function k(t){l(d.style2Vars(c.textStyle||{}));l("--cursor-font-size",window.getComputedStyle(t).fontSize),l(d.style2Vars({...c.textStyle,...y(t)}))}function w(t){return Object.entries(t).map((([t,e])=>`${t}: ${e}`)).join("; ")}const S={TEXT:"text",BLOCK:"block"},B={CursorType:S,initCursor:h,updateCursor:m,disposeCursor:v,updateConfig:b,customCursorStyle:w};export{S as CursorType,w as customCursorStyle,B as default,v as disposeCursor,h as initCursor,b as updateConfig,m as updateCursor}; | ||
let t=!1,e=null,r=!1,n=!1,o=null;const i={x:0,y:0},s="undefined"==typeof document,a=new Set,u=new Map,l={blockPadding:"auto",adsorptionStrength:10,className:"ipad-cursor",normalStyle:{width:"20px",height:"20px",radius:"50%",durationBase:"0.23s",durationPosition:"0s",durationBackdropFilter:"0s",background:"rgba(150, 150, 150, 0.2)",border:"1px solid rgba(100, 100, 100, 0.1)",zIndex:9999,scale:1,backdropBlur:"0px",backdropSaturate:"180%"},textStyle:{width:"4px",height:"1.2em",border:"0px solid rgba(100, 100, 100, 0)",background:"rgba(100, 100, 100, 0.3)",durationBackdropFilter:"1s",radius:"10px"},blockStyle:{background:"rgba(100, 100, 100, 0.1)",border:"1px solid rgba(100, 100, 100, 0.05)",backdropBlur:"0px",durationBase:"0.23s",durationBackdropFilter:"0.1s",backdropSaturate:"120%",radius:"10px"}};class c{static clamp(t,e,r){return Math.min(Math.max(t,e),r)}static isNum(t){return"number"==typeof t||/^\d+$/.test(t)}static getSize(t){return this.isNum(t)?`${t}px`:t}static getDuration(t){return this.isNum(t)?`${t}ms`:`${t}`}static getColor(t){return t}static objectKeys(t){return Object.keys(t)}static style2Vars(t){const e={backdropBlur:"--cursor-bg-blur",backdropSaturate:"--cursor-bg-saturate",background:"--cursor-bg",border:"--cursor-border",durationBackdropFilter:"--cursor-blur-duration",durationBase:"--cursor-duration",durationPosition:"--cursor-position-duration",height:"--cursor-height",radius:"--cursor-radius",scale:"--cursor-scale",width:"--cursor-width",zIndex:"--cursor-z-index"};return this.objectKeys(t).reduce(((r,n)=>{let o=t[n];if(void 0===o)return r;const i=["background","border"].includes(n),s=["width","height","radius","backdropBlur"].includes(n),a=n.startsWith("duration");i&&(o=this.getColor(o)),s&&(o=this.getSize(o)),a&&(o=this.getDuration(o));const u=e[n]||n;return{...r,[u]:o}}),{})}static isMergebleObject(t){return(e=t)&&"object"==typeof e&&!Array.isArray(e)&&Object.keys(t).length>0;var e}static mergeDeep(t,...e){if(!e.length)return t;const r=e.shift();return r?(this.isMergebleObject(t)&&this.isMergebleObject(r)&&c.objectKeys(r).forEach((e=>{this.isMergebleObject(r[e])?(t[e]||Object.assign(t,{[e]:{}}),this.mergeDeep(t[e],r[e])):Object.assign(t,{[e]:r[e]})})),this.mergeDeep(t,...e)):t}}function d(t,r){e&&("string"==typeof t?r&&e.style.setProperty(t,r):Object.entries(t).forEach((([t,r])=>{e&&e.style.setProperty(t,r)})))}function h(t){i.x=t.clientX,i.y=t.clientY,function(t){var e;if(r||n||!l.enableAutoTextCursor)return;if(t&&1===t.childNodes.length){const r=t.childNodes[0];if(3===r.nodeType&&""!==(null===(e=r.textContent)||void 0===e?void 0:e.trim()))return t.setAttribute("data-cursor","text"),void S(t)}k()}(t.target)}let g=null;const v=()=>{const t=document.elementFromPoint(i.x,i.y),e=new MouseEvent("mouseleave",{bubbles:!0,cancelable:!0,view:window});t!==g&&g&&e&&g.dispatchEvent(e),g=t};function p(r){s||t||(r&&m(r),t=!0,window.addEventListener("mousemove",h),window.addEventListener("scroll",v),function(){if(s)return;e=document.createElement("div");const t=document.createElement("div");e.classList.add(l.className),t.classList.add("lighting"),e.appendChild(t),document.body.appendChild(e),k()}(),function(){if(o)return;const t=`.${l.className.split(/\s+/).join(".")}`;o=document.createElement("style"),o.innerHTML=`\n body, * {\n cursor: none;\n }\n ${t} {\n overflow: hidden;\n pointer-events: none;\n position: fixed;\n left: var(--cursor-x);\n top: var(--cursor-y);\n width: var(--cursor-width);\n height: var(--cursor-height);\n border-radius: var(--cursor-radius);\n background-color: var(--cursor-bg);\n border: var(--cursor-border);\n z-index: var(--cursor-z-index);\n font-size: var(--cursor-font-size);\n backdrop-filter: \n blur(var(--cursor-bg-blur)) \n saturate(var(--cursor-bg-saturate));\n transition:\n width var(--cursor-duration) ease,\n height var(--cursor-duration) ease,\n border-radius var(--cursor-duration) ease,\n border var(--cursor-duration) ease,\n background-color var(--cursor-duration) ease,\n left var(--cursor-position-duration) ease,\n top var(--cursor-position-duration) ease,\n backdrop-filter var(--cursor-blur-duration) ease;\n transform: \n translate(calc(-50% + var(--cursor-translateX)), calc(-50% + var(--cursor-translateY))) \n scale(var(--cursor-scale));\n }\n ${t} .lighting {\n display: none;\n }\n ${t}.lighting--on .lighting {\n display: block;\n width: 0;\n height: 0;\n position: absolute;\n left: calc(var(--lighting-size) / -2);\n top: calc(var(--lighting-size) / -2);\n transform: translateX(var(--lighting-offset-x, 0)) translateY(var(--lighting-offset-y, 0));\n background-image: radial-gradient(\n circle at center,\n rgba(255, 255, 255, 0.1) 0%,\n rgba(255, 255, 255, 0) 30%\n );\n border-radius: 50%;\n }\n ${t}.block-active .lighting {\n width: var(--lighting-size, 20px);\n height: var(--lighting-size, 20px);\n }\n `,document.head.appendChild(o)}(),f(),y())}function b(){t&&(t=!1,window.removeEventListener("mousemove",h),window.removeEventListener("scroll",v),e&&e.remove(),o&&o.remove(),o=null,e=null,a.forEach((t=>x(t))))}function m(t){return"adsorptionStrength"in t&&(l.adsorptionStrength=c.clamp(t.adsorptionStrength||10,0,30)),c.mergeDeep(l,t)}function f(){!s&&e&&(r||(d("--cursor-x",`${i.x}px`),d("--cursor-y",`${i.y}px`)),window.requestAnimationFrame(f))}function y(){if(s||!t)return;const o=new Map;(s||!t?[]:document.querySelectorAll("[data-cursor]")).forEach((t=>{o.set(t,!0),a.has(t)||function(t){let o=t.getAttribute("data-cursor");a.add(t),"text"===o&&function(t){let r;function o(t){n=!!t,e&&(t?e.classList.add("text-active"):e.classList.remove("text-active"))}function i(t){r&&clearTimeout(r),o(!0),r=setTimeout((()=>o(!0))),S(t.target)}function s(){r&&clearTimeout(r),r=setTimeout((()=>o(!1))),k()}t.addEventListener("mouseover",i,{passive:!0}),t.addEventListener("mouseleave",s,{passive:!0}),u.set(t,[{event:"mouseover",handler:i},{event:"mouseleave",handler:k}])}(t);"block"===o?function(t){const n=t;let o;function s(t){r=!!t,e&&(t?e.classList.add("block-active"):e.classList.remove("block-active"))}function a(){var t,r;e&&e.classList.toggle("lighting--on",!!l.enableLighting);const i=n.getBoundingClientRect();o&&clearTimeout(o),s(!0),o=setTimeout((()=>s(!0))),e&&e.classList.add("block-active");let a=l.blockPadding||0;if("auto"===a){const t=Math.min(i.width,i.height);a=Math.max(2,Math.floor(t/25))}d("--cursor-x",`${i.left+i.width/2}px`),d("--cursor-y",`${i.top+i.height/2}px`),d("--cursor-width",`${i.width+2*a}px`),d("--cursor-height",`${i.height+2*a}px`);const u={...l.blockStyle||{},...w(n)};void 0===u.durationPosition&&(u.durationPosition=null!==(t=u.durationBase)&&void 0!==t?t:null===(r=l.normalStyle)||void 0===r?void 0:r.durationBase),d(c.style2Vars(u)),v(!0),n.style.setProperty("transform","translate(var(--translateX), var(--translateY))")}function h(){r||a();const t=n.getBoundingClientRect(),e=t.height/2,o=(i.y-t.top-e)/e,s=t.width/2,u=(i.x-t.left-s)/s,c=l.adsorptionStrength||10;d("--cursor-translateX",u*(t.width/100*c)+"px"),d("--cursor-translateY",o*(t.height/100*c)+"px"),v(!1);const h=u*(t.width/100*c),g=o*(t.height/100*c);if(n.style.setProperty("--translateX",`${h}px`),n.style.setProperty("--translateY",`${g}px`),l.enableLighting){const e=3*Math.max(t.width,t.height)*1.2,r=i.x-t.left,n=i.y-t.top;d("--lighting-size",`${e}px`),d("--lighting-offset-x",`${r}px`),d("--lighting-offset-y",`${n}px`)}}function g(){o&&clearTimeout(o),o=setTimeout((()=>s(!1))),k(),v(!0),n.style.setProperty("transform","translate(0px, 0px)")}function v(t){var e,r,o,i,s,a;const u=t?c.getDuration(null!==(a=null!==(i=null!==(r=null===(e=null==l?void 0:l.blockStyle)||void 0===e?void 0:e.durationPosition)&&void 0!==r?r:null===(o=null==l?void 0:l.blockStyle)||void 0===o?void 0:o.durationBase)&&void 0!==i?i:null===(s=null==l?void 0:l.normalStyle)||void 0===s?void 0:s.durationBase)&&void 0!==a?a:"0.23s"):"";n.style.setProperty("transition",u?`all ${u} cubic-bezier(.58,.09,.46,1.46)`:"none")}n.addEventListener("mouseenter",a,{passive:!0}),n.addEventListener("mousemove",h,{passive:!0}),n.addEventListener("mouseleave",g,{passive:!0}),u.set(n,[{event:"mouseenter",handler:a},{event:"mousemove",handler:h},{event:"mouseleave",handler:g}])}(t):a.delete(t)}(t)})),a.forEach((t=>{o.has(t)||x(t)}))}function x(t){var e;a.delete(t),null===(e=u.get(t))||void 0===e||e.forEach((({event:e,handler:r})=>{t.removeEventListener(e,r)})),u.delete(t),t.style.setProperty("transform","none")}function w(t){const e=t.getAttribute("data-cursor-style"),r={};return e&&e.split(/(;)/).forEach((t=>{const[e,n]=t.split(":").map((t=>t.trim()));r[e]=n})),r}function k(){d(c.style2Vars(l.normalStyle||{}))}function S(t){d(c.style2Vars(l.textStyle||{}));d("--cursor-font-size",window.getComputedStyle(t).fontSize),d(c.style2Vars({...l.textStyle,...w(t)}))}function E(t){return Object.entries(t).map((([t,e])=>`${t}: ${e}`)).join("; ")}const $={TEXT:"text",BLOCK:"block"},L={CursorType:$,initCursor:p,updateCursor:y,disposeCursor:b,updateConfig:m,customCursorStyle:E};export{$ as CursorType,E as customCursorStyle,L as default,b as disposeCursor,p as initCursor,m as updateConfig,y as updateCursor}; |
{ | ||
"name": "ipad-cursor", | ||
"version": "0.2.0", | ||
"version": "0.3.0", | ||
"description": "Mouse effect of iPad in browser that can be used in any framework", | ||
@@ -5,0 +5,0 @@ "type": "module", |
@@ -64,3 +64,3 @@ <!-- Logo --> | ||
After your dom loaded, call `initCursor` to start the effect. You may need to call `initCursor` when dom updated. | ||
After your dom loaded, call `initCursor` to start the effect. You may need to call `updateCursor()` when dom updated. | ||
@@ -151,11 +151,12 @@ ```js | ||
| Name | Type | Default | Description | required | | ||
| --------------------------------- | ----------------- | ------------------- | ------------------------------------------------------------------------------------ | -------- | | ||
| `adsorptionStrength` | `number` | `0.2` | The strength of adsorption effect, number between 0 and 30 | No | | ||
| `className` | `string` | `'ipad-cursor'` | The class name of fake cursor | No | | ||
| `blockPadding` | `number` | `auto` | The padding of cursor when hover on block, set to `auto` will calculate automatic | No | | ||
| `enableAutoTextCursor`(`v0.2.0+`) | `boolean` | `false` | Auto detect text cursor, see [#12](https://github.com/CatsJuice/ipad-cursor/pull/12) | No | | ||
| `normalStyle` | `IpadCursorStyle` | see [Style](#style) | The style of normal cursor, see [Style](#style) | No | | ||
| `textStyle` | `IpadCursorStyle` | see [Style](#style) | The style of text cursor, see [Style](#style) | No | | ||
| `blockStyle` | `IpadCursorStyle` | see [Style](#style) | The style of block cursor, see [Style](#style) | No | | ||
| Name | Type | Default | Description | required | | ||
| --------------------------------- | ----------------- | ------------------- | -------------------------------------------------------------------------------------- | -------- | | ||
| `adsorptionStrength` | `number` | `0.2` | The strength of adsorption effect, number between 0 and 30 | No | | ||
| `className` | `string` | `'ipad-cursor'` | The class name of fake cursor | No | | ||
| `blockPadding` | `number` | `auto` | The padding of cursor when hover on block, set to `auto` will calculate automatic | No | | ||
| `enableAutoTextCursor`(`v0.2.0+`) | `boolean` | `false` | Auto detect text cursor, see [#12](https://github.com/CatsJuice/ipad-cursor/pull/12) | No | | ||
| `enableLighting`(`v0.3.0+`) | `boolean` | `false` | Add a lighting effect to block [#14](https://github.com/CatsJuice/ipad-cursor/pull/14) | No | | ||
| `normalStyle` | `IpadCursorStyle` | see [Style](#style) | The style of normal cursor, see [Style](#style) | No | | ||
| `textStyle` | `IpadCursorStyle` | see [Style](#style) | The style of text cursor, see [Style](#style) | No | | ||
| `blockStyle` | `IpadCursorStyle` | see [Style](#style) | The style of block cursor, see [Style](#style) | No | | ||
@@ -187,3 +188,3 @@ ## Style | ||
- [x] Add Chinese document | ||
- [ ] API Docs | ||
- [x] API Docs | ||
- [ ] More examples | ||
@@ -190,0 +191,0 @@ - [ ] Auto detect dom update, and call `updateCursor` automatically |
Sorry, the diff of this file is not supported yet
Sorry, the diff of this file is not supported yet
License Policy Violation
LicenseThis package is not allowed per your license policy. Review the package's license to ensure compliance.
Found 1 instance in 1 package
License Policy Violation
LicenseThis package is not allowed per your license policy. Review the package's license to ensure compliance.
Found 1 instance in 1 package
63684
1325
196