Huge News!Announcing our $40M Series B led by Abstract Ventures.Learn More
Socket
Sign inDemoInstall
Socket

@lrnwebcomponents/parallax-image

Package Overview
Dependencies
Maintainers
4
Versions
113
Alerts
File Explorer

Advanced tools

Socket logo

Install Socket

Detect and block malicious and high-risk dependencies

Install

@lrnwebcomponents/parallax-image - npm Package Compare versions

Comparing version 2.7.7 to 2.7.10

20

analysis.json

@@ -20,3 +20,3 @@ {

"end": {
"line": 75,
"line": 78,
"column": 3

@@ -34,7 +34,7 @@ }

"start": {
"line": 98,
"line": 108,
"column": 2
},
"end": {
"line": 107,
"line": 117,
"column": 3

@@ -59,7 +59,7 @@ }

"start": {
"line": 109,
"line": 119,
"column": 2
},
"end": {
"line": 116,
"line": 126,
"column": 3

@@ -84,7 +84,7 @@ }

"start": {
"line": 117,
"line": 127,
"column": 2
},
"end": {
"line": 122,
"line": 132,
"column": 3

@@ -105,7 +105,7 @@ }

"start": {
"line": 123,
"line": 133,
"column": 2
},
"end": {
"line": 126,
"line": 136,
"column": 3

@@ -139,3 +139,3 @@ }

"end": {
"line": 176,
"line": 195,
"column": 1

@@ -142,0 +142,0 @@ }

@@ -20,3 +20,3 @@ {

},
"version": "2.7.7",
"version": "2.7.10",
"description": "Automated conversion of parallax-image/",

@@ -32,9 +32,9 @@ "repository": {

"scripts": {
"test": "../../node_modules/.bin/wct --configFile ../../wct.conf.json node_modules/@lrnwebcomponents/parallax-image/test/",
"test": "wct --configFile ../../wct.conf.json node_modules/@lrnwebcomponents/parallax-image/test/",
"start": "yarn run dev",
"build": "../../node_modules/.bin/gulp --gulpfile=gulpfile.cjs && ../../node_modules/.bin/rollup -c && ../../node_modules/.bin/prettier --ignore-path ../../.prettierignore --write '**/*.{js,json}' && wca analyze \"**/*.js\" --format vscode --outFile vscode-html-custom-data.json",
"dev": "../../node_modules/.bin/concurrently --kill-others \"yarn run watch\" \"yarn run serve\"",
"watch": "../../node_modules/.bin/gulp dev --gulpfile=gulpfile.cjs",
"serve": "../../node_modules/.bin/es-dev-server -c ../../es-dev-server.config.js",
"lighthouse": "../../node_modules/.bin/gulp lighthouse --gulpfile=gulpfile.cjs"
"build": "gulp --gulpfile=gulpfile.cjs && rollup -c && prettier --ignore-path ../../.prettierignore --write \"**/*.{js,json}\" && wca analyze \"**/*.js\" --format vscode --outFile vscode-html-custom-data.json",
"dev": "concurrently --kill-others \"yarn run watch\" \"yarn run serve\"",
"watch": "gulp dev --gulpfile=gulpfile.cjs",
"serve": "es-dev-server -c ../../es-dev-server.config.js",
"lighthouse": "gulp lighthouse --gulpfile=gulpfile.cjs"
},

@@ -46,12 +46,12 @@ "author": {

"dependencies": {
"@lrnwebcomponents/schema-behaviors": "^2.7.7",
"lit-element": "^2.3.1"
"@lrnwebcomponents/schema-behaviors": "^2.7.10",
"lit-element": "2.4.0"
},
"devDependencies": {
"@lrnwebcomponents/deduping-fix": "^2.7.7",
"@lrnwebcomponents/storybook-utilities": "^2.7.7",
"@lrnwebcomponents/storybook-utilities": "^2.7.10",
"@polymer/iron-component-page": "github:PolymerElements/iron-component-page",
"@polymer/iron-demo-helpers": "3.1.0",
"@webcomponents/webcomponentsjs": "2.4.1",
"concurrently": "5.1.0",
"@webcomponents/webcomponentsjs": "2.4.4",
"concurrently": "5.3.0",
"gulp-babel": "8.0.0",

@@ -70,3 +70,3 @@ "lodash": "4.17.19",

],
"gitHead": "5b346a23a41445900c73e9b8748be86b6f7db550"
"gitHead": "5b8d225cec2bf64160b4f4cab0630b187fdcd2d8"
}

@@ -63,3 +63,3 @@ import { LitElement, html, css } from "lit-element/lit-element.js";

}
`
`,
];

@@ -95,3 +95,3 @@ }

attribute: "image-bg",
reflect: true
reflect: true,
},

@@ -103,4 +103,4 @@ /**

type: String,
attribute: "described-by"
}
attribute: "described-by",
},
};

@@ -156,8 +156,8 @@ }

url: "source",
ariaDescribedby: "describedBy"
}
ariaDescribedby: "describedBy",
},
],
meta: {
author: "ELMS:LN"
}
author: "ELMS:LN",
},
},

@@ -171,4 +171,4 @@ settings: {

inputMethod: "haxupload",
icon: "image"
}
icon: "image",
},
],

@@ -180,3 +180,3 @@ configure: [

description: "image to be involved in the background",
inputMethod: "haxupload"
inputMethod: "haxupload",
},

@@ -187,4 +187,4 @@ {

description: "Heading text area",
inputMethod: "textarea"
}
inputMethod: "textarea",
},
],

@@ -197,6 +197,6 @@ advanced: [

"Space-separated list of IDs for elements that describe the image.",
inputMethod: "textfield"
}
]
}
inputMethod: "textfield",
},
],
},
};

@@ -203,0 +203,0 @@ }

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

!function(e,t){"object"==typeof exports&&"undefined"!=typeof module?t(exports,require("lit-element/lit-element.js"),require("@lrnwebcomponents/schema-behaviors/schema-behaviors.js")):"function"==typeof define&&define.amd?define(["exports","lit-element/lit-element.js","@lrnwebcomponents/schema-behaviors/schema-behaviors.js"],t):t((e=e||self).ParallaxImage={},e.litElement_js,e.schemaBehaviors_js)}(this,function(e,t,n){"use strict";function r(e,t){for(var n=0;n<t.length;n++){var r=t[n];r.enumerable=r.enumerable||!1,r.configurable=!0,"value"in r&&(r.writable=!0),Object.defineProperty(e,r.key,r)}}function a(e,t,n){return t&&r(e.prototype,t),n&&r(e,n),e}function o(e,t,n){return t in e?Object.defineProperty(e,t,{value:n,enumerable:!0,configurable:!0,writable:!0}):e[t]=n,e}function i(e,t){var n=Object.keys(e);if(Object.getOwnPropertySymbols){var r=Object.getOwnPropertySymbols(e);t&&(r=r.filter(function(t){return Object.getOwnPropertyDescriptor(e,t).enumerable})),n.push.apply(n,r)}return n}function l(e){return(l=Object.setPrototypeOf?Object.getPrototypeOf:function(e){return e.__proto__||Object.getPrototypeOf(e)})(e)}function c(e,t){return(c=Object.setPrototypeOf||function(e,t){return e.__proto__=t,e})(e,t)}function u(e,t){return!t||"object"!=typeof t&&"function"!=typeof t?function(e){if(void 0===e)throw new ReferenceError("this hasn't been initialised - super() hasn't been called");return e}(e):t}function s(e,t,n){return(s="undefined"!=typeof Reflect&&Reflect.get?Reflect.get:function(e,t,n){var r=function(e,t){for(;!Object.prototype.hasOwnProperty.call(e,t)&&null!==(e=l(e)););return e}(e,t);if(r){var a=Object.getOwnPropertyDescriptor(r,t);return a.get?a.get.call(n):a.value}})(e,t,n||e)}function p(e,t){return t||(t=e.slice(0)),Object.freeze(Object.defineProperties(e,{raw:{value:Object.freeze(t)}}))}function f(){var e=p(['\n :host {\n display: block;\n --parallax-image-background: "";\n --parallax-title-background: rgba(0, 0, 0, 0.3);\n --parallax-title-font: #fff;\n }\n\n .parallax_container {\n height: 400px;\n width: 100%;\n overflow: hidden;\n display: flex;\n justify-content: center;\n }\n\n .parallax {\n background-image: var(--parallax-image-background);\n background-attachment: fixed;\n background-position: top center;\n background-repeat: no-repeat;\n background-size: cover;\n width: 100%;\n height: 100%;\n justify-content: center;\n }\n\n #bgParallax {\n display: flex;\n align-items: center;\n }\n\n .title {\n background: var(--parallax-title-background);\n display: block;\n padding: 20px 15px;\n text-align: center;\n width: 40%;\n color: var(--parallax-title-font);\n font-size: 32px;\n position: absolute;\n margin-top: 120px;\n }\n\n @media screen and (max-width: 900px) {\n .title {\n font-size: 16px;\n }\n }\n ']);return f=function(){return e},e}function d(){var e=p(['\n <div class="parallax_container">\n <div id="bgParallax" class="parallax">\n <div class="title" id="titleParallax">\n <slot name="parallax_heading"></slot>\n </div>\n </div>\n </div>\n ']);return d=function(){return e},e}var g=function(e){function r(){var e;return function(e,t){if(!(e instanceof t))throw new TypeError("Cannot call a class as a function")}(this,r),(e=u(this,l(r).call(this))).imageBg="",e}return function(e,t){if("function"!=typeof t&&null!==t)throw new TypeError("Super expression must either be null or a function");e.prototype=Object.create(t&&t.prototype,{constructor:{value:e,writable:!0,configurable:!0}}),t&&c(e,t)}(r,n.SchemaBehaviors(t.LitElement)),a(r,[{key:"render",value:function(){return t.html(d())}}],[{key:"styles",get:function(){return[t.css(f())]}},{key:"tag",get:function(){return"parallax-image"}},{key:"properties",get:function(){return function(e){for(var t=1;t<arguments.length;t++){var n=null!=arguments[t]?arguments[t]:{};t%2?i(Object(n),!0).forEach(function(t){o(e,t,n[t])}):Object.getOwnPropertyDescriptors?Object.defineProperties(e,Object.getOwnPropertyDescriptors(n)):i(Object(n)).forEach(function(t){Object.defineProperty(e,t,Object.getOwnPropertyDescriptor(n,t))})}return e}({},s(l(r),"properties",this),{imageBg:{type:String,attribute:"image-bg",reflect:!0}})}}]),a(r,[{key:"updated",value:function(e){var t=this;e.forEach(function(e,n){"imageBg"==n&&t.style.setProperty("--parallax-image-background","url(".concat(t.imageBg,")"))})}},{key:"scrollBy",value:function(e){var t=this.shadowRoot.querySelector("#bgParallax"),n=this.shadowRoot.querySelector("#titleParallax"),r=-.2*window.scrollY,a=1.4*r;t.style.backgroundPosition="center ".concat(r,"px"),n.style.transform="translate3D(0, ".concat(a,"px, 0)")}},{key:"connectedCallback",value:function(){var e=this;s(l(r.prototype),"connectedCallback",this).call(this),setTimeout(function(){window.addEventListener("scroll",e.scrollBy.bind(e))},0)}},{key:"disconnectedCallback",value:function(){window.removeEventListener("scroll",this.scrollBy.bind(this)),s(l(r.prototype),"disconnectedCallback",this).call(this)}}],[{key:"haxProperties",get:function(){return{canScale:!0,canPosition:!0,canEditSource:!1,gizmo:{title:"Parallax image",description:"Image scroll by",icon:"av:play-circle-filled",color:"grey",groups:["Image","Media"],handles:[{type:"image",url:"source"}],meta:{author:"ELMS:LN"}},settings:{quick:[{property:"imageBg",title:"Image",description:"image",inputMethod:"haxupload",icon:"image"}],configure:[{property:"imageBg",title:"Image",description:"image to be involved in the background",inputMethod:"haxupload"},{slot:"parallax_heading",title:"Heading area",description:"Heading text area",inputMethod:"textarea"}],advanced:[]}}}}]),r}();window.customElements.define(g.tag,g),e.ParallaxImage=g,Object.defineProperty(e,"__esModule",{value:!0})});
//# sourceMappingURL=parallax-image.umd.js.map
!function(e,t){"object"==typeof exports&&"undefined"!=typeof module?t(exports,require("lit-element/lit-element.js"),require("@lrnwebcomponents/schema-behaviors/schema-behaviors.js")):"function"==typeof define&&define.amd?define(["exports","lit-element/lit-element.js","@lrnwebcomponents/schema-behaviors/schema-behaviors.js"],t):t((e=e||self).ParallaxImage={},e.litElement_js,e.schemaBehaviors_js)}(this,function(e,t,n){"use strict";function r(e,t){for(var n=0;n<t.length;n++){var r=t[n];r.enumerable=r.enumerable||!1,r.configurable=!0,"value"in r&&(r.writable=!0),Object.defineProperty(e,r.key,r)}}function a(e,t,n){return t&&r(e.prototype,t),n&&r(e,n),e}function i(e,t,n){return t in e?Object.defineProperty(e,t,{value:n,enumerable:!0,configurable:!0,writable:!0}):e[t]=n,e}function o(e,t){var n=Object.keys(e);if(Object.getOwnPropertySymbols){var r=Object.getOwnPropertySymbols(e);t&&(r=r.filter(function(t){return Object.getOwnPropertyDescriptor(e,t).enumerable})),n.push.apply(n,r)}return n}function c(e){for(var t=1;t<arguments.length;t++){var n=null!=arguments[t]?arguments[t]:{};t%2?o(Object(n),!0).forEach(function(t){i(e,t,n[t])}):Object.getOwnPropertyDescriptors?Object.defineProperties(e,Object.getOwnPropertyDescriptors(n)):o(Object(n)).forEach(function(t){Object.defineProperty(e,t,Object.getOwnPropertyDescriptor(n,t))})}return e}function l(e){return(l=Object.setPrototypeOf?Object.getPrototypeOf:function(e){return e.__proto__||Object.getPrototypeOf(e)})(e)}function s(e,t){return(s=Object.setPrototypeOf||function(e,t){return e.__proto__=t,e})(e,t)}function u(e,t){return!t||"object"!=typeof t&&"function"!=typeof t?function(e){if(void 0===e)throw new ReferenceError("this hasn't been initialised - super() hasn't been called");return e}(e):t}function p(e){var t=function(){if("undefined"==typeof Reflect||!Reflect.construct)return!1;if(Reflect.construct.sham)return!1;if("function"==typeof Proxy)return!0;try{return Date.prototype.toString.call(Reflect.construct(Date,[],function(){})),!0}catch(e){return!1}}();return function(){var n,r=l(e);if(t){var a=l(this).constructor;n=Reflect.construct(r,arguments,a)}else n=r.apply(this,arguments);return u(this,n)}}function f(e,t,n){return(f="undefined"!=typeof Reflect&&Reflect.get?Reflect.get:function(e,t,n){var r=function(e,t){for(;!Object.prototype.hasOwnProperty.call(e,t)&&null!==(e=l(e)););return e}(e,t);if(r){var a=Object.getOwnPropertyDescriptor(r,t);return a.get?a.get.call(n):a.value}})(e,t,n||e)}function d(e,t){return t||(t=e.slice(0)),Object.freeze(Object.defineProperties(e,{raw:{value:Object.freeze(t)}}))}function b(){var e=d(['\n :host {\n display: block;\n --parallax-image-background: "";\n --parallax-title-background: rgba(0, 0, 0, 0.3);\n --parallax-title-font: #fff;\n }\n\n .parallax_container {\n height: 400px;\n width: 100%;\n overflow: hidden;\n display: flex;\n justify-content: center;\n }\n\n .parallax {\n background-image: var(--parallax-image-background);\n background-attachment: fixed;\n background-position: top center;\n background-repeat: no-repeat;\n background-size: cover;\n width: 100%;\n height: 100%;\n justify-content: center;\n }\n\n #bgParallax {\n display: flex;\n align-items: center;\n }\n\n .title {\n background: var(--parallax-title-background);\n display: block;\n padding: 20px 15px;\n text-align: center;\n width: 40%;\n color: var(--parallax-title-font);\n font-size: 32px;\n position: absolute;\n margin-top: 120px;\n }\n\n @media screen and (max-width: 900px) {\n .title {\n font-size: 16px;\n }\n }\n ']);return b=function(){return e},e}function g(){var e=d(['\n <div\n class="parallax_container"\n aria-describedby="','"\n >\n <div id="bgParallax" class="parallax">\n <div class="title" id="titleParallax">\n <slot name="parallax_heading"></slot>\n </div>\n </div>\n </div>\n ']);return g=function(){return e},e}var y=function(e){!function(e,t){if("function"!=typeof t&&null!==t)throw new TypeError("Super expression must either be null or a function");e.prototype=Object.create(t&&t.prototype,{constructor:{value:e,writable:!0,configurable:!0}}),t&&s(e,t)}(i,n.SchemaBehaviors(t.LitElement));var r=p(i);function i(){var e;return function(e,t){if(!(e instanceof t))throw new TypeError("Cannot call a class as a function")}(this,i),(e=r.call(this)).imageBg="",e}return a(i,[{key:"render",value:function(){return t.html(g(),this.describedBy||"")}}],[{key:"styles",get:function(){return[t.css(b())]}},{key:"tag",get:function(){return"parallax-image"}},{key:"properties",get:function(){return c(c({},f(l(i),"properties",this)),{},{imageBg:{type:String,attribute:"image-bg",reflect:!0},describedBy:{type:String,attribute:"described-by"}})}}]),a(i,[{key:"updated",value:function(e){var t=this;e.forEach(function(e,n){"imageBg"==n&&t.style.setProperty("--parallax-image-background","url(".concat(t.imageBg,")"))})}},{key:"scrollBy",value:function(e){var t=this.shadowRoot.querySelector("#bgParallax"),n=this.shadowRoot.querySelector("#titleParallax"),r=-.2*window.scrollY,a=1.4*r;t.style.backgroundPosition="center ".concat(r,"px"),n.style.transform="translate3D(0, ".concat(a,"px, 0)")}},{key:"connectedCallback",value:function(){var e=this;f(l(i.prototype),"connectedCallback",this).call(this),setTimeout(function(){window.addEventListener("scroll",e.scrollBy.bind(e))},0)}},{key:"disconnectedCallback",value:function(){window.removeEventListener("scroll",this.scrollBy.bind(this)),f(l(i.prototype),"disconnectedCallback",this).call(this)}}],[{key:"haxProperties",get:function(){return{canScale:!0,canPosition:!0,canEditSource:!1,gizmo:{title:"Parallax image",description:"Image scroll by",icon:"av:play-circle-filled",color:"grey",groups:["Image","Media"],handles:[{type:"image",url:"source",ariaDescribedby:"describedBy"}],meta:{author:"ELMS:LN"}},settings:{quick:[{property:"imageBg",title:"Image",description:"image",inputMethod:"haxupload",icon:"image"}],configure:[{property:"imageBg",title:"Image",description:"image to be involved in the background",inputMethod:"haxupload"},{slot:"parallax_heading",title:"Heading area",description:"Heading text area",inputMethod:"textarea"}],advanced:[{property:"describedBy",title:"aria-describedby",description:"Space-separated list of IDs for elements that describe the image.",inputMethod:"textfield"}]}}}}]),i}();window.customElements.define(y.tag,y),e.ParallaxImage=y,Object.defineProperty(e,"__esModule",{value:!0})});

@@ -63,3 +63,3 @@ import { LitElement, html, css } from "lit-element/lit-element.js";

}
`
`,
];

@@ -95,3 +95,3 @@ }

attribute: "image-bg",
reflect: true
reflect: true,
},

@@ -103,4 +103,4 @@ /**

type: String,
attribute: "described-by"
}
attribute: "described-by",
},
};

@@ -156,8 +156,8 @@ }

url: "source",
ariaDescribedby: "describedBy"
}
ariaDescribedby: "describedBy",
},
],
meta: {
author: "ELMS:LN"
}
author: "ELMS:LN",
},
},

@@ -171,4 +171,4 @@ settings: {

inputMethod: "haxupload",
icon: "image"
}
icon: "image",
},
],

@@ -180,3 +180,3 @@ configure: [

description: "image to be involved in the background",
inputMethod: "haxupload"
inputMethod: "haxupload",
},

@@ -187,4 +187,4 @@ {

description: "Heading text area",
inputMethod: "textarea"
}
inputMethod: "textarea",
},
],

@@ -197,6 +197,6 @@ advanced: [

"Space-separated list of IDs for elements that describe the image.",
inputMethod: "textfield"
}
]
}
inputMethod: "textfield",
},
],
},
};

@@ -203,0 +203,0 @@ }

@@ -6,7 +6,19 @@ {

"name": "parallax-image",
"description": "`parallax-image`\n\nAttributes:\n\n * `image-bg` {`string`} - Image\n\nProperties:\n\n * `imageBg` {`string`} - Image",
"description": "`parallax-image`\n\nAttributes:\n\n * `described-by` {`string`} - Aria-describedby data passed down to appropriate tag\n\n * `image-bg` {`string`} - Image\n\n * `schema-resource-id` {`string`} - Unique Resource ID, generated when schemaMap processes.\n\n * `schemaMap` - Schema Map for the element, used to generate a valid prefix on the fly\nProps set for Polymer compatibility\n\nProperties:\n\n * `describedBy` {`string`} - Aria-describedby data passed down to appropriate tag\n\n * `imageBg` {`string`} - Image\n\n * `schemaResourceID` {`string`} - Unique Resource ID, generated when schemaMap processes.\n\n * `schemaMap` - Schema Map for the element, used to generate a valid prefix on the fly\nProps set for Polymer compatibility",
"attributes": [
{
"name": "described-by",
"description": "`described-by` {`string`} - Aria-describedby data passed down to appropriate tag\n\nProperty: describedBy"
},
{
"name": "image-bg",
"description": "`image-bg` {`string`} - Image\n\nProperty: imageBg\n\nDefault: "
},
{
"name": "schema-resource-id",
"description": "`schema-resource-id` {`string`} - Unique Resource ID, generated when schemaMap processes.\n\nProperty: schemaResourceID\n\nDefault: "
},
{
"name": "schemaMap",
"description": "`schemaMap` - Schema Map for the element, used to generate a valid prefix on the fly\nProps set for Polymer compatibility\n\nProperty: schemaMap\n\nDefault: [object Object]"
}

@@ -17,21 +29,19 @@ ]

"name": "parallax-image",
"description": "`parallax-image`\n\nAttributes:\n\n * `image-bg` {`string`} - Image\n\nProperties:\n\n * `imageBg` {`string`} - Image",
"description": "`parallax-image`\n\nAttributes:\n\n * `described-by` {`string`} - Aria-describedby data passed down to appropriate tag\n\n * `image-bg` {`string`} - Image\n\n * `schema-resource-id` {`string`} - Unique Resource ID, generated when schemaMap processes.\n\n * `schemaMap` - Schema Map for the element, used to generate a valid prefix on the fly\nProps set for Polymer compatibility\n\nProperties:\n\n * `describedBy` {`string`} - Aria-describedby data passed down to appropriate tag\n\n * `imageBg` {`string`} - Image\n\n * `schemaResourceID` {`string`} - Unique Resource ID, generated when schemaMap processes.\n\n * `schemaMap` - Schema Map for the element, used to generate a valid prefix on the fly\nProps set for Polymer compatibility",
"attributes": [
{
"name": "described-by",
"description": "`described-by` {`string`} - Aria-describedby data passed down to appropriate tag\n\nProperty: describedBy"
},
{
"name": "image-bg",
"description": "`image-bg` {`string`} - Image\n\nProperty: imageBg\n\nDefault: "
}
]
},
{
"name": "tag",
"attributes": []
},
{
"name": "parallax-image",
"description": "`parallax-image`\n\nAttributes:\n\n * `image-bg` {`string`} - Image\n\nProperties:\n\n * `imageBg` {`string`} - Image",
"attributes": [
},
{
"name": "image-bg",
"description": "`image-bg` {`string`} - Image\n\nProperty: imageBg\n\nDefault: "
"name": "schema-resource-id",
"description": "`schema-resource-id` {`string`} - Unique Resource ID, generated when schemaMap processes.\n\nProperty: schemaResourceID\n\nDefault: "
},
{
"name": "schemaMap",
"description": "`schemaMap` - Schema Map for the element, used to generate a valid prefix on the fly\nProps set for Polymer compatibility\n\nProperty: schemaMap\n\nDefault: [object Object]"
}

@@ -38,0 +48,0 @@ ]

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