Socket
Socket
Sign inDemoInstall

@floating-ui/core

Package Overview
Dependencies
Maintainers
1
Versions
54
Alerts
File Explorer

Advanced tools

Socket logo

Install Socket

Detect and block malicious and high-risk dependencies

Install

@floating-ui/core - npm Package Compare versions

Comparing version 0.0.1 to 0.1.0

2

dist/floating-ui.core.js
(function (global, factory) {
typeof exports === 'object' && typeof module !== 'undefined' ? factory(exports) :
typeof define === 'function' && define.amd ? define(['exports'], factory) :
(global = typeof globalThis !== 'undefined' ? globalThis : global || self, factory(global.FloatingUIPosition = {}));
(global = typeof globalThis !== 'undefined' ? globalThis : global || self, factory(global.FloatingUICore = {}));
})(this, (function (exports) { 'use strict';

@@ -6,0 +6,0 @@

@@ -1,1 +0,1 @@

!function(e,t){"object"==typeof exports&&"undefined"!=typeof module?t(exports):"function"==typeof define&&define.amd?define(["exports"],t):t((e="undefined"!=typeof globalThis?globalThis:e||self).FloatingUIPosition={})}(this,(function(e){"use strict";function t(e){return e.split("-")[0]}function n(e){return e.split("-")[1]}function o(e){return["top","bottom"].includes(t(e))?"x":"y"}function i(e){return"y"===e?"height":"width"}function r(e){let{reference:r,floating:a,placement:l}=e;const s=r.x+r.width/2-a.width/2,c=r.y+r.height/2-a.height/2;let f;switch(t(l)){case"top":f={x:s,y:r.y-a.height};break;case"bottom":f={x:s,y:r.y+r.height};break;case"right":f={x:r.x+r.width,y:c};break;case"left":f={x:r.x-a.width,y:c};break;default:f={x:r.x,y:r.y}}const m=o(l),u=i(m);switch(n(l)){case"start":f[m]=f[m]-(r[u]/2-a[u]/2);break;case"end":f[m]=f[m]+(r[u]/2-a[u]/2)}return f}function a(e){return"number"!=typeof e?function(e){return{top:0,right:0,bottom:0,left:0,...e}}(e):{top:e,right:e,bottom:e,left:e}}function l(e){return{...e,top:e.y,left:e.x,right:e.x+e.width,bottom:e.y+e.height}}async function s(e){let t=arguments.length>1&&void 0!==arguments[1]?arguments[1]:{};const{x:n,y:o,platform:i,rects:r,elements:s,strategy:c}=e,{boundary:f="clippingParents",rootBoundary:m="viewport",elementContext:u="floating",altBoundary:d=!1,padding:p=0}=t,g=a(p),y="floating"===u?"reference":"floating",h=s[d?y:u],x=await i.getClippingClientRect({element:await i.isElement(h)?h:h.contextElement||await i.getDocumentElement({element:s.floating}),boundary:f,rootBoundary:m}),w=l(await i.convertOffsetParentRelativeRectToViewportRelativeRect({rect:"floating"===u?{...r.floating,x:n,y:o}:r.reference,offsetParent:await i.getOffsetParent({element:s.floating}),strategy:c}));return{top:x.top-w.top+g.top,bottom:w.bottom-x.bottom+g.bottom,left:x.left-w.left+g.left,right:w.right-x.right+g.right}}function c(e,t,n){return Math.max(e,Math.min(t,n))}const f={left:"right",right:"left",bottom:"top",top:"bottom"};function m(e){return e.replace(/left|right|bottom|top/g,(e=>f[e]))}function u(e,t){const r="start"===n(e),a=o(e),l=i(a);let s="x"===a?r?"right":"left":r?"bottom":"top";return t.reference[l]>t.floating[l]&&(s=m(s)),{main:s,cross:m(s)}}const d={start:"end",end:"start"};function p(e){return e.replace(/start|end/g,(e=>d[e]))}const g=["top","right","bottom","left"],y=g.reduce(((e,t)=>e.concat(t,`${t}-start`,`${t}-end`)),[]);function h(e,o,i){return i.filter((i=>e?n(i)===e||!!o&&p(i)!==i:t(i)===i))}function x(e){const t=m(e);return[p(e),t,p(t)]}function w(e,t){return{top:e.top-t.height,right:e.right-t.width,bottom:e.bottom-t.height,left:e.left-t.width}}function v(e){return g.some((t=>e[t]>=0))}function b(e){return"x"===e?"y":"x"}e.arrow=e=>({name:"arrow",async fn(n){const{element:r,padding:l=0}=e??{},{x:s,y:f,placement:m,rects:u,platform:d}=n;if(null==r)return{};const p=a(l),g={x:s,y:f},y=o(t(m)),h=i(y),x=await d.getDimensions({element:r}),w="y"===y?"top":"left",v="y"===y?"bottom":"right",b=u.reference[h]+u.reference[y]-g[y]-u.floating[h],A=g[y]-u.reference[y],P=await d.getOffsetParent({element:r}),k=P?"y"===y?P.clientHeight||0:P.clientWidth||0:0,D=b/2-A/2,O=p[w],R=k-x[h]-p[v],C=k/2-x[h]/2+D,E=c(O,C,R);return{data:{[y]:E,centerOffset:C-E}}}}),e.autoPlacement=function(){let e=arguments.length>0&&void 0!==arguments[0]?arguments[0]:{};return{name:"autoPlacement",async fn(o){var i,r,a,l;const{x:c,y:f,rects:m,middlewareData:d,placement:p}=o,{alignment:g=null,crossAxis:x=!1,allowedPlacements:w=y,autoAlignment:v=!0,...b}=e;if(null!==(i=d.autoPlacement)&&void 0!==i&&i.skip)return{};const A=h(g,v,w),P=await s(o,b),k=(null===(r=d.autoPlacement)||void 0===r?void 0:r.index)??0,D=A[k],{main:O,cross:R}=u(D,m);if(p!==D)return{x:c,y:f,reset:{placement:A[0]}};const C=[P[t(D)],P[O],P[R]],E=[...(null===(a=d.autoPlacement)||void 0===a?void 0:a.overflows)??[],{placement:D,overflows:C}],B=A[k+1];if(B)return{data:{index:k+1,overflows:E},reset:{placement:B}};const T=E.slice().sort(x||v&&n(p)?(e,t)=>e.overflows.reduce(((e,t)=>e+t),0)-t.overflows.reduce(((e,t)=>e+t),0):(e,t)=>e.overflows[0]-t.overflows[0]),j=null===(l=T.find((e=>{let{overflows:t}=e;return t.every((e=>e<=0))})))||void 0===l?void 0:l.placement;return{data:{skip:!0},reset:{placement:j??T[0].placement}}}}},e.computePosition=async(e,t,n)=>{const{placement:o="bottom",strategy:i="absolute",middleware:a=[],platform:l}=n;let s=await l.getElementRects({reference:e,floating:t,strategy:i}),{x:c,y:f}=r({...s,placement:o}),m=o,u={};for(let n=0;n<a.length;n++){0===n&&({x:c,y:f}=r({...s,placement:m}));const{name:d,fn:p}=a[n],{x:g,y:y,data:h,reset:x}=await p({x:c,y:f,initialPlacement:o,placement:m,strategy:i,middlewareData:u,rects:s,platform:l,elements:{reference:e,floating:t}});c=g??c,f=y??f,u={...u,[d]:h??{}},x&&("object"==typeof x&&x.placement&&(m=x.placement),s=await l.getElementRects({reference:e,floating:t,strategy:i}),n=-1)}return{x:c,y:f,placement:m,strategy:i,middlewareData:u}},e.detectOverflow=s,e.flip=function(){let e=arguments.length>0&&void 0!==arguments[0]?arguments[0]:{};return{name:"flip",async fn(n){var o,i;const{placement:r,middlewareData:a,rects:l,initialPlacement:c}=n;if(null!==(o=a.flip)&&void 0!==o&&o.skip)return{};const{mainAxis:f=!0,crossAxis:d=!0,fallbackPlacements:p,fallbackStrategy:g="bestFit",flipAlignment:y=!0,...h}=e,w=t(r),v=[c,...p||(w===c||!y?[m(c)]:x(c))],b=await s(n,h),A=[];let P=(null===(i=a.flip)||void 0===i?void 0:i.overflows)||[];if(f&&A.push(b[w]),d){const{main:e,cross:t}=u(r,l);A.push(b[e],b[t])}if(P=[...P,{placement:r,overflows:A}],!A.every((e=>e<=0))){var k;const e=((null===(k=a.flip)||void 0===k?void 0:k.index)??0)+1,t=v[e];if(t)return{data:{index:e,overflows:P},reset:{placement:t}};let n="bottom";switch(g){case"bestFit":{var D;const e=null===(D=P.slice().sort(((e,t)=>e.overflows.filter((e=>e>0)).reduce(((e,t)=>e+t),0)-t.overflows.filter((e=>e>0)).reduce(((e,t)=>e+t),0)))[0])||void 0===D?void 0:D.placement;e&&(n=e);break}case"initialPlacement":n=c}return{data:{skip:!0},reset:{placement:n}}}return{}}}},e.hide=()=>({name:"hide",async fn(e){const t=await s(e,{elementContext:"reference"}),n=await s(e,{altBoundary:!0}),o=w(t,e.rects.reference),i=w(n,e.rects.floating);return{data:{referenceHidden:v(o),referenceHiddenOffsets:o,escaped:v(i),escapedOffsets:i}}}}),e.limitShift=function(){let e=arguments.length>0&&void 0!==arguments[0]?arguments[0]:{};return async n=>{const{x:i,y:r,placement:a,rects:l,middlewareData:s}=n,{offset:c=0,mainAxis:f=!0,crossAxis:m=!0}=e,u={x:i,y:r},d=o(t(a)),p=b(d);let g=u[d],y=u[p];const h="function"==typeof c?c({...l,placement:a}):{mainAxis:c,crossAxis:0},x="number"==typeof h?{mainAxis:h,crossAxis:0}:{mainAxis:0,crossAxis:0,...h};if(f){const e="y"===d?"height":"width",t=l.reference[d]-l.floating[e]+x.mainAxis,n=l.reference[d]+l.reference[e]-x.mainAxis;g<t?g=t:g>n&&(g=n)}if(m){var w,v;const e="y"===d?"width":"height",t=l.reference[p]-l.floating[e]-((null===(w=s.offset)||void 0===w?void 0:w[d])??0)+x.crossAxis,n=l.reference[p]+l.reference[e]+((null===(v=s.offset)||void 0===v?void 0:v[d])??0)+x.crossAxis;y<t?y=t:y>n&&(y=n)}return{[d]:g,[p]:y}}},e.offset=e=>({name:"offset",fn(n){const{x:i,y:r,placement:a,rects:l}=n,s=function(e){let{placement:n,rects:i,value:r}=e;const a=t(n),l=["left","top"].includes(a)?-1:1,s="function"==typeof r?r({...i,placement:n}):r,{mainAxis:c,crossAxis:f}="number"==typeof s?{mainAxis:s,crossAxis:0}:{mainAxis:0,crossAxis:0,...s};return"x"===o(a)?{x:f,y:c*l}:{x:c*l,y:f}}({placement:a,rects:l,value:e});return{x:i+s.x,y:r+s.y,data:s}}}),e.rectToClientRect=l,e.shift=function(){let e=arguments.length>0&&void 0!==arguments[0]?arguments[0]:{};return{name:"shift",async fn(n){const{x:i,y:r,placement:a}=n,{mainAxis:l=!0,crossAxis:f=!1,limiter:m=(e=>{let{x:t,y:n}=e;return{x:t,y:n}}),...u}=e,d={x:i,y:r},p=await s(n,u),g=o(t(a)),y=b(g);let h=d[g],x=d[y];if(l){const e="y"===g?"bottom":"right";h=c(h+p["y"===g?"top":"left"],h,h-p[e])}if(f){const e="y"===y?"bottom":"right";x=c(x+p["y"===y?"top":"left"],x,x-p[e])}return m({...n,[g]:h,[y]:x})}}},e.size=function(){let e=arguments.length>0&&void 0!==arguments[0]?arguments[0]:{};return{name:"size",async fn(o){var i;const{placement:r,rects:a,middlewareData:l}=o,{apply:c,...f}=e,m=await s(o,f),u=t(r),d="end"===n(r);let p,g;"top"===u||"bottom"===u?(p=u,g=d?"left":"right"):(g=u,p=d?"top":"bottom");const y={height:a.floating.height-m[p],width:a.floating.width-m[g]};return null!==(i=l.size)&&void 0!==i&&i.skip?{}:(null==c||c(y),{data:{skip:!0},reset:!0})}}},Object.defineProperty(e,"__esModule",{value:!0})}));
!function(e,t){"object"==typeof exports&&"undefined"!=typeof module?t(exports):"function"==typeof define&&define.amd?define(["exports"],t):t((e="undefined"!=typeof globalThis?globalThis:e||self).FloatingUICore={})}(this,(function(e){"use strict";function t(e){return e.split("-")[0]}function n(e){return e.split("-")[1]}function o(e){return["top","bottom"].includes(t(e))?"x":"y"}function i(e){return"y"===e?"height":"width"}function r(e){let{reference:r,floating:a,placement:l}=e;const s=r.x+r.width/2-a.width/2,c=r.y+r.height/2-a.height/2;let f;switch(t(l)){case"top":f={x:s,y:r.y-a.height};break;case"bottom":f={x:s,y:r.y+r.height};break;case"right":f={x:r.x+r.width,y:c};break;case"left":f={x:r.x-a.width,y:c};break;default:f={x:r.x,y:r.y}}const m=o(l),u=i(m);switch(n(l)){case"start":f[m]=f[m]-(r[u]/2-a[u]/2);break;case"end":f[m]=f[m]+(r[u]/2-a[u]/2)}return f}function a(e){return"number"!=typeof e?function(e){return{top:0,right:0,bottom:0,left:0,...e}}(e):{top:e,right:e,bottom:e,left:e}}function l(e){return{...e,top:e.y,left:e.x,right:e.x+e.width,bottom:e.y+e.height}}async function s(e){let t=arguments.length>1&&void 0!==arguments[1]?arguments[1]:{};const{x:n,y:o,platform:i,rects:r,elements:s,strategy:c}=e,{boundary:f="clippingParents",rootBoundary:m="viewport",elementContext:u="floating",altBoundary:d=!1,padding:p=0}=t,g=a(p),y="floating"===u?"reference":"floating",h=s[d?y:u],x=await i.getClippingClientRect({element:await i.isElement(h)?h:h.contextElement||await i.getDocumentElement({element:s.floating}),boundary:f,rootBoundary:m}),w=l(await i.convertOffsetParentRelativeRectToViewportRelativeRect({rect:"floating"===u?{...r.floating,x:n,y:o}:r.reference,offsetParent:await i.getOffsetParent({element:s.floating}),strategy:c}));return{top:x.top-w.top+g.top,bottom:w.bottom-x.bottom+g.bottom,left:x.left-w.left+g.left,right:w.right-x.right+g.right}}function c(e,t,n){return Math.max(e,Math.min(t,n))}const f={left:"right",right:"left",bottom:"top",top:"bottom"};function m(e){return e.replace(/left|right|bottom|top/g,(e=>f[e]))}function u(e,t){const r="start"===n(e),a=o(e),l=i(a);let s="x"===a?r?"right":"left":r?"bottom":"top";return t.reference[l]>t.floating[l]&&(s=m(s)),{main:s,cross:m(s)}}const d={start:"end",end:"start"};function p(e){return e.replace(/start|end/g,(e=>d[e]))}const g=["top","right","bottom","left"],y=g.reduce(((e,t)=>e.concat(t,`${t}-start`,`${t}-end`)),[]);function h(e,o,i){return i.filter((i=>e?n(i)===e||!!o&&p(i)!==i:t(i)===i))}function x(e){const t=m(e);return[p(e),t,p(t)]}function w(e,t){return{top:e.top-t.height,right:e.right-t.width,bottom:e.bottom-t.height,left:e.left-t.width}}function v(e){return g.some((t=>e[t]>=0))}function b(e){return"x"===e?"y":"x"}e.arrow=e=>({name:"arrow",async fn(n){const{element:r,padding:l=0}=e??{},{x:s,y:f,placement:m,rects:u,platform:d}=n;if(null==r)return{};const p=a(l),g={x:s,y:f},y=o(t(m)),h=i(y),x=await d.getDimensions({element:r}),w="y"===y?"top":"left",v="y"===y?"bottom":"right",b=u.reference[h]+u.reference[y]-g[y]-u.floating[h],A=g[y]-u.reference[y],P=await d.getOffsetParent({element:r}),k=P?"y"===y?P.clientHeight||0:P.clientWidth||0:0,D=b/2-A/2,O=p[w],R=k-x[h]-p[v],C=k/2-x[h]/2+D,E=c(O,C,R);return{data:{[y]:E,centerOffset:C-E}}}}),e.autoPlacement=function(){let e=arguments.length>0&&void 0!==arguments[0]?arguments[0]:{};return{name:"autoPlacement",async fn(o){var i,r,a,l;const{x:c,y:f,rects:m,middlewareData:d,placement:p}=o,{alignment:g=null,crossAxis:x=!1,allowedPlacements:w=y,autoAlignment:v=!0,...b}=e;if(null!==(i=d.autoPlacement)&&void 0!==i&&i.skip)return{};const A=h(g,v,w),P=await s(o,b),k=(null===(r=d.autoPlacement)||void 0===r?void 0:r.index)??0,D=A[k],{main:O,cross:R}=u(D,m);if(p!==D)return{x:c,y:f,reset:{placement:A[0]}};const C=[P[t(D)],P[O],P[R]],E=[...(null===(a=d.autoPlacement)||void 0===a?void 0:a.overflows)??[],{placement:D,overflows:C}],B=A[k+1];if(B)return{data:{index:k+1,overflows:E},reset:{placement:B}};const T=E.slice().sort(x||v&&n(p)?(e,t)=>e.overflows.reduce(((e,t)=>e+t),0)-t.overflows.reduce(((e,t)=>e+t),0):(e,t)=>e.overflows[0]-t.overflows[0]),j=null===(l=T.find((e=>{let{overflows:t}=e;return t.every((e=>e<=0))})))||void 0===l?void 0:l.placement;return{data:{skip:!0},reset:{placement:j??T[0].placement}}}}},e.computePosition=async(e,t,n)=>{const{placement:o="bottom",strategy:i="absolute",middleware:a=[],platform:l}=n;let s=await l.getElementRects({reference:e,floating:t,strategy:i}),{x:c,y:f}=r({...s,placement:o}),m=o,u={};for(let n=0;n<a.length;n++){0===n&&({x:c,y:f}=r({...s,placement:m}));const{name:d,fn:p}=a[n],{x:g,y:y,data:h,reset:x}=await p({x:c,y:f,initialPlacement:o,placement:m,strategy:i,middlewareData:u,rects:s,platform:l,elements:{reference:e,floating:t}});c=g??c,f=y??f,u={...u,[d]:h??{}},x&&("object"==typeof x&&x.placement&&(m=x.placement),s=await l.getElementRects({reference:e,floating:t,strategy:i}),n=-1)}return{x:c,y:f,placement:m,strategy:i,middlewareData:u}},e.detectOverflow=s,e.flip=function(){let e=arguments.length>0&&void 0!==arguments[0]?arguments[0]:{};return{name:"flip",async fn(n){var o,i;const{placement:r,middlewareData:a,rects:l,initialPlacement:c}=n;if(null!==(o=a.flip)&&void 0!==o&&o.skip)return{};const{mainAxis:f=!0,crossAxis:d=!0,fallbackPlacements:p,fallbackStrategy:g="bestFit",flipAlignment:y=!0,...h}=e,w=t(r),v=[c,...p||(w===c||!y?[m(c)]:x(c))],b=await s(n,h),A=[];let P=(null===(i=a.flip)||void 0===i?void 0:i.overflows)||[];if(f&&A.push(b[w]),d){const{main:e,cross:t}=u(r,l);A.push(b[e],b[t])}if(P=[...P,{placement:r,overflows:A}],!A.every((e=>e<=0))){var k;const e=((null===(k=a.flip)||void 0===k?void 0:k.index)??0)+1,t=v[e];if(t)return{data:{index:e,overflows:P},reset:{placement:t}};let n="bottom";switch(g){case"bestFit":{var D;const e=null===(D=P.slice().sort(((e,t)=>e.overflows.filter((e=>e>0)).reduce(((e,t)=>e+t),0)-t.overflows.filter((e=>e>0)).reduce(((e,t)=>e+t),0)))[0])||void 0===D?void 0:D.placement;e&&(n=e);break}case"initialPlacement":n=c}return{data:{skip:!0},reset:{placement:n}}}return{}}}},e.hide=()=>({name:"hide",async fn(e){const t=await s(e,{elementContext:"reference"}),n=await s(e,{altBoundary:!0}),o=w(t,e.rects.reference),i=w(n,e.rects.floating);return{data:{referenceHidden:v(o),referenceHiddenOffsets:o,escaped:v(i),escapedOffsets:i}}}}),e.limitShift=function(){let e=arguments.length>0&&void 0!==arguments[0]?arguments[0]:{};return async n=>{const{x:i,y:r,placement:a,rects:l,middlewareData:s}=n,{offset:c=0,mainAxis:f=!0,crossAxis:m=!0}=e,u={x:i,y:r},d=o(t(a)),p=b(d);let g=u[d],y=u[p];const h="function"==typeof c?c({...l,placement:a}):{mainAxis:c,crossAxis:0},x="number"==typeof h?{mainAxis:h,crossAxis:0}:{mainAxis:0,crossAxis:0,...h};if(f){const e="y"===d?"height":"width",t=l.reference[d]-l.floating[e]+x.mainAxis,n=l.reference[d]+l.reference[e]-x.mainAxis;g<t?g=t:g>n&&(g=n)}if(m){var w,v;const e="y"===d?"width":"height",t=l.reference[p]-l.floating[e]-((null===(w=s.offset)||void 0===w?void 0:w[d])??0)+x.crossAxis,n=l.reference[p]+l.reference[e]+((null===(v=s.offset)||void 0===v?void 0:v[d])??0)+x.crossAxis;y<t?y=t:y>n&&(y=n)}return{[d]:g,[p]:y}}},e.offset=e=>({name:"offset",fn(n){const{x:i,y:r,placement:a,rects:l}=n,s=function(e){let{placement:n,rects:i,value:r}=e;const a=t(n),l=["left","top"].includes(a)?-1:1,s="function"==typeof r?r({...i,placement:n}):r,{mainAxis:c,crossAxis:f}="number"==typeof s?{mainAxis:s,crossAxis:0}:{mainAxis:0,crossAxis:0,...s};return"x"===o(a)?{x:f,y:c*l}:{x:c*l,y:f}}({placement:a,rects:l,value:e});return{x:i+s.x,y:r+s.y,data:s}}}),e.rectToClientRect=l,e.shift=function(){let e=arguments.length>0&&void 0!==arguments[0]?arguments[0]:{};return{name:"shift",async fn(n){const{x:i,y:r,placement:a}=n,{mainAxis:l=!0,crossAxis:f=!1,limiter:m=(e=>{let{x:t,y:n}=e;return{x:t,y:n}}),...u}=e,d={x:i,y:r},p=await s(n,u),g=o(t(a)),y=b(g);let h=d[g],x=d[y];if(l){const e="y"===g?"bottom":"right";h=c(h+p["y"===g?"top":"left"],h,h-p[e])}if(f){const e="y"===y?"bottom":"right";x=c(x+p["y"===y?"top":"left"],x,x-p[e])}return m({...n,[g]:h,[y]:x})}}},e.size=function(){let e=arguments.length>0&&void 0!==arguments[0]?arguments[0]:{};return{name:"size",async fn(o){var i;const{placement:r,rects:a,middlewareData:l}=o,{apply:c,...f}=e,m=await s(o,f),u=t(r),d="end"===n(r);let p,g;"top"===u||"bottom"===u?(p=u,g=d?"left":"right"):(g=u,p=d?"top":"bottom");const y={height:a.floating.height-m[p],width:a.floating.width-m[g]};return null!==(i=l.size)&&void 0!==i&&i.skip?{}:(null==c||c(y),{data:{skip:!0},reset:!0})}}},Object.defineProperty(e,"__esModule",{value:!0})}));
{
"name": "@floating-ui/core",
"version": "0.0.1",
"version": "0.1.0",
"description": "Positioning library for floating elements: tooltips, popovers, dropdowns, and more",

@@ -5,0 +5,0 @@ "main": "dist/floating-ui.core.js",

SocketSocket SOC 2 Logo

Product

  • Package Alerts
  • Integrations
  • Docs
  • Pricing
  • FAQ
  • Roadmap
  • Changelog

Packages

npm

Stay in touch

Get open source security insights delivered straight into your inbox.


  • Terms
  • Privacy
  • Security

Made with ⚡️ by Socket Inc