{"_id":"@afixt/shareable","_rev":"7-a8243064f05cee7a5fe00a7d89dc6a26","name":"@afixt/shareable","dist-tags":{"latest":"0.3.1"},"versions":{"0.1.0":{"name":"@afixt/shareable","version":"0.1.0","keywords":["social-sharing","widget","accessibility","a11y","wcag","facebook","twitter","linkedin","whatsapp","telegram","reddit","embeddable","lightweight","no-dependencies"],"author":{"name":"AFixt","email":"hello@afixt.com"},"license":"MIT","_id":"@afixt/shareable@0.1.0","maintainers":[{"name":"karlgroves","email":"karlgroves@gmail.com"}],"homepage":"https://github.com/AFixt/shareable#readme","bugs":{"url":"https://github.com/AFixt/shareable/issues"},"dist":{"shasum":"e9b20f113eaa3be829bd48bf2f3ab7c551cdd9bd","tarball":"https://registry.npmjs.org/@afixt/shareable/-/shareable-0.1.0.tgz","fileCount":37,"integrity":"sha512-7EW0aPqwuWf77qd/Wol4aE0gTZ7pm80ubgcc9zTf+Kjkzsa41Mku+2fUlY+HBeeUmfllKHSGTATf/7jZwNMaew==","signatures":[{"sig":"MEUCIFd3ju6tMMGDwDYDIyF19mtPKfBYMHXAf9H2Oj+9SS3vAiEA2AfDJRpM9EYKLQ1I4w2WZayfV3zkakCQyWQ/PJ8A1GI=","keyid":"SHA256:DhQ8wR5APBvFHLF/+Tc+AYvPOdTpcIDqOhxsBHRwC7U"}],"unpackedSize":442567},"jest":{"preset":"ts-jest","testMatch":["<rootDir>/tests/**/*.test.ts","<rootDir>/tests/**/*.test.tsx","<rootDir>/tests/**/*.test.vue"],"transform":{"^.+\\.vue$":"@vue/vue3-jest","^.+\\.(ts|tsx)$":["ts-jest",{"tsconfig":{"jsx":"react-jsx"}}]},"testEnvironment":"jsdom","moduleNameMapper":{"@angular/(.*)":"<rootDir>/node_modules/@angular/$1/fesm2022/$1.mjs","^(\\.{1,2}/.*)\\.js$":"$1"},"coverageThreshold":{"global":{"lines":90,"branches":90,"functions":90,"statements":90}},"setupFilesAfterEnv":["<rootDir>/tests/setup.ts"],"collectCoverageFrom":["src/**/*.ts","src/**/*.tsx","!src/**/*.d.ts"],"extensionsToTreatAsEsm":[".ts"],"testEnvironmentOptions":{"customExportConditions":["node","node-addons"]},"transformIgnorePatterns":["node_modules/(?!(@angular|zone.js)/)"]},"main":"dist/shareable.min.js","types":"dist/shareable.d.ts","module":"dist/shareable.esm.js","engines":{"npm":">=8.0.0","node":">=16.0.0"},"gitHead":"b8d209ad2f8a694467c5133747c298bafc3b8464","scripts":{"qa":"npm run test && npm run test:a11y-audit && npm run test:perf && npm run test:security","dev":"rollup -c rollup.config.js --environment NODE_ENV:development --watch","lint":"eslint \"src/**/*.{js,ts}\" --fix","test":"jest","build":"npm run build:dev && npm run build:prod","serve":"serve examples -l 3000","format":"prettier --write \"src/**/*.{ts,js}\"","prepare":"husky install","release":"npm run build && npm run test && npm run version:patch","version":"node scripts/version.js","test:e2e":"playwright test","build:dev":"rollup -c rollup.config.js --environment NODE_ENV:development","postbuild":"npm run bundle-analyze","test:a11y":"pa11y-ci --sitemap ./pa11y-sitemap.xml","test:perf":"node scripts/perf-test.js","typecheck":"tsc --noEmit","build:prod":"rollup -c rollup.config.js --environment NODE_ENV:production","size-check":"bundlesize","test:watch":"jest --watch","test:e2e:ui":"playwright test --ui","version:dry":"node scripts/version.js patch --dry-run","release:major":"npm run build && npm run test && npm run version:major","release:minor":"npm run build && npm run test && npm run version:minor","test:coverage":"jest --coverage","test:security":"node scripts/security-audit.js","version:major":"node scripts/version.js major","version:minor":"node scripts/version.js minor","version:patch":"node scripts/version.js patch","bundle-analyze":"node scripts/bundle-analyze.js","prepublishOnly":"npm run test && npm run build","integrity-check":"node scripts/integrity-check.js","test:a11y-audit":"node scripts/a11y-audit.js"},"_npmUser":{"name":"karlgroves","email":"karlgroves@gmail.com"},"bundlesize":[{"path":"dist/shareable.min.js","maxSize":"30 kB","compression":"gzip"}],"repository":{"url":"git+https://github.com/AFixt/shareable.git","type":"git"},"_npmVersion":"11.6.0","description":"A lightweight, embeddable JavaScript widget for accessible social sharing functionality","directories":{},"_nodeVersion":"22.16.0","browserslist":["Chrome >= 90","Firefox >= 88","Safari >= 14","Edge >= 90"],"_hasShrinkwrap":false,"devDependencies":{"vue":"^3.5.18","jest":"^29.7.0","husky":"^8.0.3","react":"^19.1.1","serve":"^14.2.1","tslib":"^2.8.1","eslint":"^8.54.0","rollup":"^4.6.1","postcss":"^8.5.6","ts-jest":"^29.1.1","zone.js":"^0.14.10","jest-axe":"^8.0.0","pa11y-ci":"^3.0.1","prettier":"^3.1.0","react-dom":"^19.1.1","bundlesize":"^0.18.1","playwright":"^1.40.1","typescript":"^5.3.2","@types/jest":"^29.5.8","@types/react":"^19.1.9","@angular/core":"^18.2.13","@vue/vue3-jest":"^29.2.6","@angular/common":"^18.2.13","@vue/test-utils":"^2.4.6","@playwright/test":"^1.54.2","@types/react-dom":"^19.1.7","@angular/compiler":"^18.2.13","@vitejs/plugin-vue":"^6.0.1","@rollup/plugin-terser":"^0.4.4","rollup-plugin-postcss":"^4.0.2","@testing-library/react":"^16.3.0","eslint-plugin-jsx-a11y":"^6.8.0","jest-environment-jsdom":"^29.7.0","@rollup/plugin-commonjs":"^25.0.7","@angular/platform-browser":"^18.2.13","@rollup/plugin-typescript":"^11.1.6","@testing-library/jest-dom":"^6.6.4","@typescript-eslint/parser":"^6.21.0","@rollup/plugin-node-resolve":"^15.2.3","@typescript-eslint/eslint-plugin":"^6.21.0","@angular/platform-browser-dynamic":"^18.2.13"},"_npmOperationalInternal":{"tmp":"tmp/shareable_0.1.0_1758305773964_0.7727857097334159","host":"s3://npm-registry-packages-npm-production"}},"0.2.1":{"name":"@afixt/shareable","version":"0.2.1","keywords":["social-sharing","widget","accessibility","a11y","wcag","facebook","twitter","linkedin","whatsapp","telegram","reddit","embeddable","lightweight","no-dependencies","react","vue","angular","typescript","privacy-first","csp-compliant"],"author":{"name":"AFixt","email":"talktous@afixt.com"},"license":"MIT","_id":"@afixt/shareable@0.2.1","maintainers":[{"name":"karlgroves","email":"karlgroves@gmail.com"}],"homepage":"https://github.com/AFixt/shareable#readme","bugs":{"url":"https://github.com/AFixt/shareable/issues"},"dist":{"shasum":"f0f00992091c60270b24e99b91dfd8c74f877496","tarball":"https://registry.npmjs.org/@afixt/shareable/-/shareable-0.2.1.tgz","fileCount":43,"integrity":"sha512-BriulXm7BB9Nct0IVwH6xug+ZiR0CchhhTyXXc+5Qy3HEwoEyznXby6dW40R+in1Sw9ORpM1dCZpvY45IQWZVg==","signatures":[{"sig":"MEQCIA+a244uaXRI/+NDGakQjwEKFGnCyEhMMiAr/gK5QKy/AiA6OAjn4c9Ew51y0pUlbwXYEJuf82uF4BKHJCohOP5hEA==","keyid":"SHA256:DhQ8wR5APBvFHLF/+Tc+AYvPOdTpcIDqOhxsBHRwC7U"}],"unpackedSize":530954},"jest":{"preset":"ts-jest","testMatch":["<rootDir>/tests/**/*.test.ts","<rootDir>/tests/**/*.test.tsx","<rootDir>/tests/**/*.test.vue"],"transform":{"^.+\\.vue$":"@vue/vue3-jest","^.+\\.(ts|tsx)$":["ts-jest",{"tsconfig":{"jsx":"react-jsx"}}]},"testEnvironment":"jsdom","moduleNameMapper":{"@angular/(.*)":"<rootDir>/node_modules/@angular/$1/fesm2022/$1.mjs","^(\\.{1,2}/.*)\\.js$":"$1"},"coverageThreshold":{"global":{"lines":90,"branches":90,"functions":90,"statements":90}},"setupFilesAfterEnv":["<rootDir>/tests/setup.ts"],"collectCoverageFrom":["src/**/*.ts","src/**/*.tsx","!src/**/*.d.ts"],"extensionsToTreatAsEsm":[".ts"],"testEnvironmentOptions":{"customExportConditions":["node","node-addons"]},"transformIgnorePatterns":["node_modules/(?!(@angular|zone.js)/)"]},"main":"dist/shareable.min.js","types":"dist/shareable.d.ts","module":"dist/shareable.esm.js","engines":{"npm":">=8.0.0","node":">=16.0.0"},"exports":{".":{"types":"./dist/shareable.d.ts","import":"./dist/shareable.esm.js","require":"./dist/shareable.min.js"},"./vue":{"types":"./dist/vue-wrapper.d.ts","import":"./dist/vue-wrapper.js"},"./react":{"types":"./dist/react-wrapper.d.ts","import":"./dist/react-wrapper.js"},"./dist/*":"./dist/*","./angular":{"types":"./dist/angular-wrapper.d.ts","import":"./dist/angular-wrapper.js"}},"gitHead":"b618c8b1eb5acb054f639008e45193dece0e2eec","scripts":{"qa":"npm run test && npm run test:a11y-audit && npm run test:perf && npm run test:security","dev":"rollup -c rollup.config.js --environment NODE_ENV:development --watch","lint":"eslint \"src/**/*.{js,ts}\" --fix","test":"jest","build":"npm run build:dev && npm run build:prod","serve":"serve examples -l 3000","format":"prettier --write \"src/**/*.{ts,js}\"","prepare":"husky install","release":"npm run build && npm run test && npm run version:patch","version":"node scripts/version.js","test:e2e":"playwright test","build:dev":"rollup -c rollup.config.js --environment NODE_ENV:development","postbuild":"npm run bundle-analyze","test:perf":"node scripts/perf-test.js","typecheck":"tsc --noEmit","build:prod":"rollup -c rollup.config.js --environment NODE_ENV:production","size-check":"bundlesize","test:watch":"jest --watch","test:e2e:ui":"playwright test --ui","version:dry":"node scripts/version.js patch --dry-run","release:major":"npm run build && npm run test && npm run version:major","release:minor":"npm run build && npm run test && npm run version:minor","test:coverage":"jest --coverage","test:security":"node scripts/security-audit.js","version:major":"node scripts/version.js major","version:minor":"node scripts/version.js minor","version:patch":"node scripts/version.js patch","bundle-analyze":"node scripts/bundle-analyze.js","prepublishOnly":"npm run test && npm run build","integrity-check":"node scripts/integrity-check.js","test:a11y-audit":"node scripts/a11y-audit.js"},"_npmUser":{"name":"karlgroves","email":"karlgroves@gmail.com"},"bundlesize":[{"path":"dist/shareable.min.js","maxSize":"30 kB","compression":"gzip"}],"repository":{"url":"git+https://github.com/AFixt/shareable.git","type":"git"},"_npmVersion":"11.6.0","description":"A lightweight, accessible, and customizable social sharing widget for modern web applications","directories":{},"_nodeVersion":"22.16.0","browserslist":["Chrome >= 90","Firefox >= 88","Safari >= 14","Edge >= 90"],"_hasShrinkwrap":false,"devDependencies":{"vue":"^3.5.18","jest":"^29.7.0","husky":"^8.0.3","react":"^19.1.1","serve":"^14.2.1","tslib":"^2.8.1","eslint":"^8.54.0","rollup":"^4.6.1","postcss":"^8.5.6","ts-jest":"^29.1.1","zone.js":"^0.14.10","jest-axe":"^8.0.0","prettier":"^3.1.0","react-dom":"^19.1.1","bundlesize":"^0.18.1","playwright":"^1.40.1","typescript":"^5.3.2","@types/jest":"^29.5.8","@types/react":"^19.1.9","@angular/core":"^18.2.13","@vue/vue3-jest":"^29.2.6","@angular/common":"^18.2.13","@vue/test-utils":"^2.4.6","@playwright/test":"^1.54.2","@types/react-dom":"^19.1.7","@angular/compiler":"^18.2.13","@vitejs/plugin-vue":"^6.0.1","@rollup/plugin-terser":"^0.4.4","rollup-plugin-postcss":"^4.0.2","@testing-library/react":"^16.3.0","eslint-plugin-jsx-a11y":"^6.8.0","jest-environment-jsdom":"^29.7.0","@rollup/plugin-commonjs":"^25.0.7","@angular/platform-browser":"^18.2.13","@rollup/plugin-typescript":"^11.1.6","@testing-library/jest-dom":"^6.6.4","@typescript-eslint/parser":"^6.21.0","@rollup/plugin-node-resolve":"^15.2.3","@typescript-eslint/eslint-plugin":"^6.21.0","@angular/platform-browser-dynamic":"^18.2.13"},"_npmOperationalInternal":{"tmp":"tmp/shareable_0.2.1_1758754636014_0.9537915588055943","host":"s3://npm-registry-packages-npm-production"}},"0.2.2":{"name":"@afixt/shareable","version":"0.2.2","keywords":["social-sharing","widget","accessibility","a11y","wcag","facebook","twitter","linkedin","whatsapp","telegram","reddit","embeddable","lightweight","no-dependencies","react","vue","angular","typescript","privacy-first","csp-compliant"],"author":{"name":"AFixt","email":"talktous@afixt.com"},"license":"MIT","_id":"@afixt/shareable@0.2.2","maintainers":[{"name":"macmilan","email":"marko.macmilan@gmail.com"},{"name":"jw1982","email":"john.watts@afixt.com"},{"name":"karlgroves","email":"karlgroves@gmail.com"}],"homepage":"https://github.com/AFixt/shareable#readme","bugs":{"url":"https://github.com/AFixt/shareable/issues"},"dist":{"shasum":"4f1270d892c51f0802b4aac79a3362ead9467320","tarball":"https://registry.npmjs.org/@afixt/shareable/-/shareable-0.2.2.tgz","fileCount":55,"integrity":"sha512-V0vSvIrv8TV3dWogMsHqv7A1u5RaEG7bz4JIZ70xJUTVqgeYHxfr8R6zmvYvsA8L1kaIAG+oYc7hgyh9Qi+npA==","signatures":[{"sig":"MEYCIQDzoC5qaDwSxo+t+2J5CujPeQjFLZLq/+cd+UKN3ouKPwIhALXYMZVcwa1XT5cbxEUGy0Bv/NvOxDRH8q/igFfgXgl9","keyid":"SHA256:DhQ8wR5APBvFHLF/+Tc+AYvPOdTpcIDqOhxsBHRwC7U"}],"unpackedSize":611725},"jest":{"preset":"ts-jest","testMatch":["<rootDir>/tests/**/*.test.ts","<rootDir>/tests/**/*.test.tsx","<rootDir>/tests/**/*.test.vue"],"transform":{"^.+\\.vue$":"@vue/vue3-jest","^.+\\.(ts|tsx)$":["ts-jest",{"tsconfig":{"jsx":"react-jsx"}}]},"testEnvironment":"jsdom","moduleNameMapper":{"@angular/(.*)":"<rootDir>/node_modules/@angular/$1/fesm2022/$1.mjs","^(\\.{1,2}/.*)\\.js$":"$1"},"coverageThreshold":{"global":{"lines":70,"branches":60,"functions":40,"statements":70}},"setupFilesAfterEnv":["<rootDir>/tests/setup.ts"],"collectCoverageFrom":["src/**/*.ts","src/**/*.tsx","!src/**/*.d.ts"],"extensionsToTreatAsEsm":[".ts"],"testEnvironmentOptions":{"customExportConditions":["node","node-addons"]},"transformIgnorePatterns":["node_modules/(?!(@angular|zone.js)/)"]},"main":"dist/shareable.min.js","types":"dist/shareable.d.ts","module":"dist/shareable.esm.js","engines":{"npm":">=8.0.0","node":">=16.0.0"},"exports":{".":{"types":"./dist/shareable.d.ts","import":"./dist/shareable.esm.js","require":"./dist/shareable.min.js"},"./vue":{"types":"./dist/vue-wrapper.d.ts","import":"./dist/vue-wrapper.js"},"./react":{"types":"./dist/react-wrapper.d.ts","import":"./dist/react-wrapper.js"},"./dist/*":"./dist/*","./angular":{"types":"./dist/angular-wrapper.d.ts","import":"./dist/angular-wrapper.js"}},"gitHead":"ca5c6f09580f4f55ab5c12c7667d96d5438c3dde","scripts":{"qa":"npm run test && npm run test:a11y-audit && npm run test:perf && npm run test:security","dev":"rollup -c rollup.config.mjs --environment NODE_ENV:development --watch","lint":"eslint \"src/**/*.{js,ts}\" --fix","test":"jest","build":"npm run build:dev && npm run build:prod","serve":"serve examples -l 3000","format":"prettier --write \"src/**/*.{ts,js}\"","lint:md":"markdownlint '**/*.md' --ignore node_modules --ignore CHANGELOG.md","prepare":"husky install","release":"npm run build && npm run test && npm run version:patch","version":"node scripts/version.js","lint:cpd":"jscpd . --config .jscpd.json","lint:css":"stylelint \"src/**/*.css\"","test:e2e":"playwright test","build:dev":"rollup -c rollup.config.mjs --environment NODE_ENV:development","postbuild":"npm run bundle-analyze","test:perf":"node scripts/perf-test.js","typecheck":"tsc --noEmit","build:prod":"rollup -c rollup.config.mjs --environment NODE_ENV:production","commitlint":"commitlint --from HEAD~1 --to HEAD --verbose","size-check":"bundlesize","test:watch":"jest --watch","lint:cpd:ci":"jscpd . --config .jscpd.json --threshold 5","test:e2e:ui":"playwright test --ui","version:dry":"node scripts/version.js patch --dry-run","format:check":"prettier --check \"src/**/*.{ts,js}\"","lint:css:fix":"stylelint \"src/**/*.css\" --fix","release:major":"npm run build && npm run test && npm run version:major","release:minor":"npm run build && npm run test && npm run version:minor","test:coverage":"jest --coverage","test:security":"node scripts/security-audit.js","version:major":"node scripts/version.js major","version:minor":"node scripts/version.js minor","version:patch":"node scripts/version.js patch","bundle-analyze":"node scripts/bundle-analyze.js","prepublishOnly":"npm run test && npm run build","security:audit":"npm audit","security:check":"npm audit --audit-level=high","integrity-check":"node scripts/integrity-check.js","test:a11y-audit":"node scripts/a11y-audit.js","changelog:preview":"node scripts/version.js patch --dry-run"},"_npmUser":{"name":"karlgroves","email":"karlgroves@gmail.com"},"bundlesize":[{"path":"dist/shareable.min.js","maxSize":"30 kB","compression":"gzip"}],"repository":{"url":"git+https://github.com/AFixt/shareable.git","type":"git"},"_npmVersion":"10.2.4","description":"A lightweight, accessible, and customizable social sharing widget for modern web applications","directories":{},"_nodeVersion":"22.16.0","browserslist":["Chrome >= 90","Firefox >= 88","Safari >= 14","Edge >= 90"],"_hasShrinkwrap":false,"devDependencies":{"vue":"^3.5.18","jest":"^29.7.0","husky":"^8.0.3","jscpd":"^4.0.8","react":"^19.1.1","serve":"^14.2.1","tslib":"^2.8.1","eslint":"^8.54.0","rollup":"^4.6.1","semver":"^7.7.3","postcss":"^8.5.6","ts-jest":"^29.1.1","zone.js":"^0.16.0","prettier":"^3.1.0","react-dom":"^19.1.1","stylelint":"^17.1.1","bundlesize":"^0.18.1","playwright":"^1.40.1","typescript":"^5.3.2","@types/jest":"^29.5.8","@types/react":"^19.1.9","@angular/core":"^18.2.13","@vue/vue3-jest":"^29.2.6","@angular/common":"^18.2.13","@commitlint/cli":"^20.4.0","@vue/test-utils":"^2.4.6","@playwright/test":"^1.54.2","@types/react-dom":"^19.1.7","markdownlint-cli":"^0.47.0","@angular/compiler":"^18.2.13","@vitejs/plugin-vue":"^6.0.1","@testing-library/dom":"^10.4.1","@rollup/plugin-terser":"^0.4.4","rollup-plugin-postcss":"^4.0.2","@testing-library/react":"^16.3.0","eslint-plugin-jsx-a11y":"^6.8.0","jest-environment-jsdom":"^29.7.0","@rollup/plugin-commonjs":"^29.0.0","@angular/platform-browser":"^18.2.13","@rollup/plugin-typescript":"^11.1.6","@testing-library/jest-dom":"^6.6.4","@typescript-eslint/parser":"^6.21.0","stylelint-config-standard":"^40.0.0","@rollup/plugin-node-resolve":"^15.2.3","@commitlint/config-conventional":"^20.4.0","@typescript-eslint/eslint-plugin":"^6.21.0","@angular/platform-browser-dynamic":"^18.2.13"},"_npmOperationalInternal":{"tmp":"tmp/shareable_0.2.2_1774190059885_0.025524203300072434","host":"s3://npm-registry-packages-npm-production"}},"0.3.0":{"name":"@afixt/shareable","version":"0.3.0","keywords":["social-sharing","widget","accessibility","a11y","wcag","facebook","twitter","linkedin","whatsapp","telegram","reddit","embeddable","lightweight","no-dependencies","react","vue","angular","typescript","privacy-first","csp-compliant"],"author":{"name":"AFixt","email":"talktous@afixt.com"},"license":"MIT","_id":"@afixt/shareable@0.3.0","maintainers":[{"name":"macmilan","email":"marko.macmilan@gmail.com"},{"name":"jw1982","email":"john.watts@afixt.com"},{"name":"karlgroves","email":"karlgroves@gmail.com"}],"homepage":"https://github.com/AFixt/shareable#readme","bugs":{"url":"https://github.com/AFixt/shareable/issues"},"dist":{"shasum":"1ad6d2d04b02c9602805aedc5557f879c7531ee0","tarball":"https://registry.npmjs.org/@afixt/shareable/-/shareable-0.3.0.tgz","fileCount":78,"integrity":"sha512-+XJLRvuGZdLdxg0IjCK6YOKPDifyqs5X8FaqF6VDsd/wyABnj7/6PObj38zOia+Qt9R0IaSoBEOobJnFAGobQA==","signatures":[{"sig":"MEUCIEFOpS6dfBhmOnABX9EAnxnQ2k6mkliVKQa9jeY8PxagAiEAyzlOEySceUZikmld4hZdZHrHM3OwWpGb6EWIech5wrA=","keyid":"SHA256:DhQ8wR5APBvFHLF/+Tc+AYvPOdTpcIDqOhxsBHRwC7U"}],"unpackedSize":496887},"jest":{"preset":"ts-jest","testMatch":["<rootDir>/tests/**/*.test.ts","<rootDir>/tests/**/*.test.tsx","<rootDir>/tests/**/*.test.vue"],"transform":{"^.+\\.vue$":"@vue/vue3-jest","^.+\\.(ts|tsx)$":["ts-jest",{"tsconfig":{"jsx":"react-jsx"}}]},"testEnvironment":"jsdom","moduleNameMapper":{"@angular/(.*)":"<rootDir>/node_modules/@angular/$1/fesm2022/$1.mjs","^(\\.{1,2}/.*)\\.js$":"$1"},"coverageThreshold":{"global":{"lines":70,"branches":60,"functions":40,"statements":70}},"setupFilesAfterEnv":["<rootDir>/tests/setup.ts"],"collectCoverageFrom":["src/**/*.ts","src/**/*.tsx","!src/**/*.d.ts"],"extensionsToTreatAsEsm":[".ts"],"testEnvironmentOptions":{"customExportConditions":["node","node-addons"]},"transformIgnorePatterns":["node_modules/(?!(@angular|zone.js)/)"]},"main":"dist/shareable.min.js","types":"dist/shareable.d.ts","module":"dist/shareable.esm.js","engines":{"npm":">=8.0.0","node":">=22.13.0"},"exports":{".":{"types":"./dist/shareable.d.ts","import":"./dist/shareable.esm.js","require":"./dist/shareable.min.js"},"./vue":{"types":"./dist/vue-wrapper.d.ts","import":"./dist/vue-wrapper.js"},"./react":{"types":"./dist/react-wrapper.d.ts","import":"./dist/react-wrapper.js"},"./dist/*":"./dist/*","./angular":{"types":"./dist/angular-wrapper.d.ts","import":"./dist/angular-wrapper.js"}},"gitHead":"17461bded812e43fe5343a6c01b7dabeef83dd33","scripts":{"qa":"npm run test && npm run test:a11y-audit && npm run test:perf && npm run test:security","dev":"rollup -c rollup.config.mjs --environment NODE_ENV:development --watch","lint":"eslint \"src/**/*.{js,ts,tsx}\"","test":"jest","build":"npm run build:dev && npm run build:prod","check":"npm run lint && npm run format:check && npm run typecheck && npm run validate:usecases && npm test","serve":"serve . -l 3000","format":"prettier --write \"src/**/*.{ts,js}\"","lint:md":"markdownlint-cli2 \"**/*.md\"","prepare":"husky install","release":"npm run build && npm run test && npm run version:patch","version":"node scripts/version.js","lint:cpd":"jscpd . --config .jscpd.json","lint:css":"stylelint \"src/**/*.css\"","lint:fix":"eslint \"src/**/*.{js,ts,tsx}\" --fix","test:e2e":"playwright test --grep-invert @a11y","build:dev":"rollup -c rollup.config.mjs --environment NODE_ENV:development","check:all":"npm run check && npm run lint:cpd:ci && npm run security:check && npm run security:licenses && npm run security:semgrep","postbuild":"npm run bundle-analyze","test:perf":"node scripts/perf-test.js","typecheck":"tsc --noEmit","ai:context":"node scripts/ai-context.js","build:prod":"rollup -c rollup.config.mjs --environment NODE_ENV:production","commitlint":"commitlint --from HEAD~1 --to HEAD --verbose","size-check":"size-limit","test:watch":"jest --watch","lint:cpd:ci":"jscpd . --config .jscpd.json --threshold 5","lint:md:fix":"markdownlint-cli2 --fix \"**/*.md\"","test:e2e:ui":"playwright test --ui","version:dry":"node scripts/version.js patch --dry-run","format:check":"prettier --check \"src/**/*.{ts,js}\"","lint:css:fix":"stylelint \"src/**/*.css\" --fix","security:osv":"bash scripts/run-osv.sh","test:e2e:all":"playwright test","release:major":"npm run build && npm run test && npm run version:major","release:minor":"npm run build && npm run test && npm run version:minor","test:coverage":"jest --coverage","test:e2e:a11y":"playwright test --grep @a11y","test:security":"node scripts/security-audit.js","version:major":"node scripts/version.js major","version:minor":"node scripts/version.js minor","version:patch":"node scripts/version.js patch","bundle-analyze":"node scripts/bundle-analyze.js","prepublishOnly":"npm run test && npm run build","security:audit":"npm audit","security:check":"npm audit --audit-level=high --omit=dev","security:links":"bash scripts/run-lychee.sh","security:local":"npm run security:check && npm run security:licenses && npm run security:trufflehog && npm run security:osv && npm run security:semgrep && npm run security:links","integrity-check":"node scripts/integrity-check.js","test:a11y-audit":"node scripts/a11y-audit.js","security:semgrep":"bash scripts/run-semgrep.sh","changelog:preview":"node scripts/version.js patch --dry-run","security:licenses":"license-checker-rseidelsohn --production --excludePrivatePackages --onlyAllow 'MIT;Apache-2.0;BSD-2-Clause;BSD-3-Clause;ISC;0BSD;CC0-1.0;CC-BY-3.0;CC-BY-4.0;Unlicense;BlueOak-1.0.0;Python-2.0' --summary","validate:usecases":"bash scripts/validate-usecases.sh","security:trufflehog":"bash scripts/run-trufflehog.sh"},"_npmUser":{"name":"karlgroves","email":"karlgroves@gmail.com"},"overrides":{"axe-core":"npm:empty-npm-package@1.0.0"},"devEngines":{"runtime":{"name":"node","onFail":"error","version":">=24.15.0"}},"repository":{"url":"git+https://github.com/AFixt/shareable.git","type":"git"},"_npmVersion":"11.17.0","description":"A lightweight, accessible, and customizable social sharing widget for modern web applications","directories":{},"_nodeVersion":"24.19.0","browserslist":["Chrome >= 90","Firefox >= 88","Safari >= 14","Edge >= 90"],"publishConfig":{"access":"public"},"_hasShrinkwrap":false,"devDependencies":{"vue":"^3.5.18","jest":"^29.7.0","husky":"^8.0.3","jscpd":"^4.0.8","react":"^19.1.1","serve":"^14.2.1","tslib":"^2.8.1","eslint":"9.39.4","rollup":"^4.6.1","semver":"^7.7.3","globals":"17.6.0","postcss":"^8.5.6","ts-jest":"^29.1.1","zone.js":"0.16.2","prettier":"^3.1.0","react-dom":"^19.1.1","stylelint":"^17.1.1","babel-jest":"29.7.0","playwright":"^1.40.1","size-limit":"12.1.0","typescript":"^6.0.3","@types/jest":"^29.5.14","lint-staged":"17.0.5","@types/react":"^19.1.9","@angular/core":"21.2.21","@vue/vue3-jest":"^29.2.6","@angular/common":"21.2.21","@commitlint/cli":"^20.4.0","@vue/test-utils":"^2.4.6","eslint-plugin-n":"18.0.1","@playwright/test":"^1.54.2","@types/react-dom":"^19.1.7","@angular/compiler":"21.2.21","markdownlint-cli2":"0.23.2","typescript-eslint":"8.60.0","@afixt/a11y-assert":"3.0.0","@vitejs/plugin-vue":"^6.0.1","eslint-plugin-jsdoc":"63.0.0","eslint-plugin-react":"7.37.5","@testing-library/dom":"^10.4.1","@afixt/usecase-runner":"2.0.1","@rollup/plugin-terser":"1.0.0","eslint-plugin-promise":"7.3.0","eslint-plugin-sonarjs":"4.0.3","eslint-plugin-unicorn":"64.0.0","rollup-plugin-postcss":"^4.0.2","@testing-library/react":"^16.3.0","eslint-plugin-import-x":"4.16.2","eslint-plugin-security":"4.0.0","jest-environment-jsdom":"^29.7.0","@rollup/plugin-commonjs":"^29.0.0","eslint-plugin-no-secrets":"2.3.3","@angular/platform-browser":"21.2.21","@rollup/plugin-typescript":"^11.1.6","@testing-library/jest-dom":"^6.6.4","eslint-plugin-react-hooks":"7.1.1","stylelint-config-standard":"^40.0.0","@total-typescript/ts-reset":"0.6.1","@afixt/a11y-assert-reporter":"2.0.1","@rollup/plugin-node-resolve":"^15.2.3","eslint-plugin-react-refresh":"0.5.2","license-checker-rseidelsohn":"4.4.2","@double-great/stylelint-a11y":"3.4.14","@size-limit/preset-small-lib":"12.1.0","@commitlint/config-conventional":"^21.0.1","prettier-plugin-organize-imports":"4.3.0","@angular/platform-browser-dynamic":"21.2.21","eslint-import-resolver-typescript":"4.4.4","stylelint-declaration-strict-value":"1.11.1"},"_npmOperationalInternal":{"tmp":"tmp/shareable_0.3.0_1787928896348_0.013390438411342132","host":"s3://npm-registry-packages-npm-production"}},"0.3.1":{"name":"@afixt/shareable","version":"0.3.1","publishConfig":{"access":"public"},"description":"A lightweight, accessible, and customizable social sharing widget for modern web applications","main":"dist/shareable.min.js","module":"dist/shareable.esm.js","types":"dist/shareable.d.ts","exports":{".":{"import":"./dist/shareable.esm.js","require":"./dist/shareable.min.js","types":"./dist/shareable.d.ts"},"./react":{"import":"./dist/react-wrapper.js","types":"./dist/react-wrapper.d.ts"},"./vue":{"import":"./dist/vue-wrapper.js","types":"./dist/vue-wrapper.d.ts"},"./angular":{"import":"./dist/angular-wrapper.js","types":"./dist/angular-wrapper.d.ts"},"./dist/*":"./dist/*"},"scripts":{"build":"npm run build:dev && npm run build:prod","build:dev":"rollup -c rollup.config.mjs --environment NODE_ENV:development","build:prod":"rollup -c rollup.config.mjs --environment NODE_ENV:production","dev":"rollup -c rollup.config.mjs --environment NODE_ENV:development --watch","test":"jest","test:watch":"jest --watch","test:coverage":"jest --coverage","test:e2e":"playwright test --grep-invert @a11y","test:e2e:a11y":"playwright test --grep @a11y","test:e2e:all":"playwright test","test:e2e:ui":"playwright test --ui","lint":"eslint \"src/**/*.{js,ts,tsx}\"","lint:fix":"eslint \"src/**/*.{js,ts,tsx}\" --fix","lint:css":"stylelint \"src/**/*.css\"","lint:css:fix":"stylelint \"src/**/*.css\" --fix","lint:md":"markdownlint-cli2 \"**/*.md\"","lint:md:fix":"markdownlint-cli2 --fix \"**/*.md\"","lint:cpd":"jscpd . --config .jscpd.json","lint:cpd:ci":"jscpd . --config .jscpd.json --threshold 5","format":"prettier --write \"src/**/*.{ts,js}\"","format:check":"prettier --check \"src/**/*.{ts,js}\"","security:audit":"npm audit","security:check":"npm audit --audit-level=high --omit=dev","security:licenses":"license-checker-rseidelsohn --production --excludePrivatePackages --onlyAllow 'MIT;Apache-2.0;BSD-2-Clause;BSD-3-Clause;ISC;0BSD;CC0-1.0;CC-BY-3.0;CC-BY-4.0;Unlicense;BlueOak-1.0.0;Python-2.0' --summary","security:osv":"bash scripts/run-osv.sh","security:trufflehog":"bash scripts/run-trufflehog.sh","security:semgrep":"bash scripts/run-semgrep.sh","security:links":"bash scripts/run-lychee.sh","security:local":"npm run security:check && npm run security:licenses && npm run security:trufflehog && npm run security:osv && npm run security:semgrep && npm run security:links","typecheck":"tsc --noEmit","validate:usecases":"bash scripts/validate-usecases.sh","check":"npm run lint && npm run format:check && npm run typecheck && npm run validate:usecases && npm test","check:all":"npm run check && npm run lint:cpd:ci && npm run security:check && npm run security:licenses && npm run security:semgrep","serve":"serve . -l 3000","prepare":"husky install","prepublishOnly":"npm run test && npm run build","size-check":"size-limit","release:prepare":"node scripts/version.js","release:prepare:dry":"node scripts/version.js patch --dry-run","release":"npm run build && npm run test && node scripts/version.js patch","release:minor":"npm run build && npm run test && node scripts/version.js minor","release:major":"npm run build && npm run test && node scripts/version.js major","integrity-check":"node scripts/integrity-check.js","bundle-analyze":"node scripts/bundle-analyze.js","postbuild":"npm run bundle-analyze","test:a11y-audit":"node scripts/a11y-audit.js","test:perf":"node scripts/perf-test.js","test:security":"node scripts/security-audit.js","qa":"npm run test && npm run test:a11y-audit && npm run test:perf && npm run test:security","commitlint":"commitlint --from HEAD~1 --to HEAD --verbose","changelog:preview":"npm run release:prepare:dry","ai:context":"node scripts/ai-context.js"},"keywords":["social-sharing","widget","accessibility","a11y","wcag","facebook","twitter","linkedin","whatsapp","telegram","reddit","embeddable","lightweight","no-dependencies","react","vue","angular","typescript","privacy-first","csp-compliant"],"author":{"name":"AFixt","email":"talktous@afixt.com"},"license":"MIT","homepage":"https://github.com/AFixt/shareable#readme","repository":{"type":"git","url":"git+https://github.com/AFixt/shareable.git"},"bugs":{"url":"https://github.com/AFixt/shareable/issues"},"engines":{"node":">=22.13.0","npm":">=8.0.0"},"devEngines":{"runtime":{"name":"node","version":">=24.15.0","onFail":"error"}},"browserslist":["Chrome >= 90","Firefox >= 88","Safari >= 14","Edge >= 90"],"overrides":{"axe-core":"npm:empty-npm-package@1.0.0"},"devDependencies":{"@afixt/a11y-assert":"3.0.0","@afixt/a11y-assert-reporter":"2.0.1","@afixt/usecase-runner":"2.0.1","@angular/common":"21.2.21","@angular/compiler":"21.2.21","@angular/core":"21.2.21","@angular/platform-browser":"21.2.21","@angular/platform-browser-dynamic":"21.2.21","@commitlint/cli":"^20.4.0","@commitlint/config-conventional":"^21.0.1","@double-great/stylelint-a11y":"3.4.14","@playwright/test":"^1.54.2","@rollup/plugin-commonjs":"^29.0.0","@rollup/plugin-node-resolve":"^15.2.3","@rollup/plugin-terser":"1.0.0","@rollup/plugin-typescript":"^11.1.6","@size-limit/preset-small-lib":"12.1.0","@testing-library/dom":"^10.4.1","@testing-library/jest-dom":"^6.6.4","@testing-library/react":"^16.3.0","@total-typescript/ts-reset":"0.6.1","@types/jest":"^29.5.14","@types/react":"^19.1.9","@types/react-dom":"^19.1.7","@vitejs/plugin-vue":"^6.0.1","@vue/test-utils":"^2.4.6","@vue/vue3-jest":"^29.2.6","babel-jest":"29.7.0","eslint":"9.39.4","eslint-import-resolver-typescript":"4.4.4","eslint-plugin-import-x":"4.16.2","eslint-plugin-jsdoc":"63.0.0","eslint-plugin-n":"18.0.1","eslint-plugin-no-secrets":"2.3.3","eslint-plugin-promise":"7.3.0","eslint-plugin-react":"7.37.5","eslint-plugin-react-hooks":"7.1.1","eslint-plugin-react-refresh":"0.5.2","eslint-plugin-security":"4.0.0","eslint-plugin-sonarjs":"4.0.3","eslint-plugin-unicorn":"64.0.0","globals":"17.6.0","husky":"^8.0.3","jest":"^29.7.0","jest-environment-jsdom":"^29.7.0","jscpd":"^4.0.8","license-checker-rseidelsohn":"4.4.2","lint-staged":"17.0.5","markdownlint-cli2":"0.23.2","playwright":"^1.40.1","postcss":"^8.5.6","prettier":"^3.1.0","prettier-plugin-organize-imports":"4.3.0","react":"^19.1.1","react-dom":"^19.1.1","rollup":"^4.6.1","rollup-plugin-postcss":"^4.0.2","semver":"^7.7.3","serve":"^14.2.1","size-limit":"12.1.0","stylelint":"^17.1.1","stylelint-config-standard":"^40.0.0","stylelint-declaration-strict-value":"1.11.1","ts-jest":"^29.1.1","tslib":"^2.8.1","typescript":"^6.0.3","typescript-eslint":"8.60.0","vue":"^3.5.18","zone.js":"0.16.2"},"jest":{"preset":"ts-jest","testEnvironment":"jsdom","setupFilesAfterEnv":["<rootDir>/tests/setup.ts"],"testEnvironmentOptions":{"customExportConditions":["node","node-addons"]},"testMatch":["<rootDir>/tests/**/*.test.ts","<rootDir>/tests/**/*.test.tsx","<rootDir>/tests/**/*.test.vue"],"transform":{"^.+\\.(ts|tsx)$":["ts-jest",{"tsconfig":{"jsx":"react-jsx"}}],"^.+\\.vue$":"@vue/vue3-jest"},"transformIgnorePatterns":["node_modules/(?!(@angular|zone.js)/)"],"extensionsToTreatAsEsm":[".ts"],"moduleNameMapper":{"^(\\.{1,2}/.*)\\.js$":"$1","@angular/(.*)":"<rootDir>/node_modules/@angular/$1/fesm2022/$1.mjs"},"collectCoverageFrom":["src/**/*.ts","src/**/*.tsx","!src/**/*.d.ts"],"coverageThreshold":{"global":{"branches":60,"functions":40,"lines":70,"statements":70}}},"gitHead":"4bc1e6f95b0c6d88f663ec987e914a78eaafb985","_id":"@afixt/shareable@0.3.1","_nodeVersion":"24.19.0","_npmVersion":"11.17.0","dist":{"integrity":"sha512-6pPSrrormyPcgGqcCSIB9sXBzULvOH9YklqOckPKf5WotEHNHD3lJApku1MCtz83fdcIwU6hdbj60juBI6kfnw==","shasum":"222ea78c8bb21acda7b729c30b27bb41fdb67174","tarball":"https://registry.npmjs.org/@afixt/shareable/-/shareable-0.3.1.tgz","fileCount":78,"unpackedSize":497894,"signatures":[{"keyid":"SHA256:DhQ8wR5APBvFHLF/+Tc+AYvPOdTpcIDqOhxsBHRwC7U","sig":"MEUCIE5vFKsmvXHAqwzfVn+tt4ma+zUetkAgxbH5fZ3QaM+MAiEA7+kKMUqm90O57e0Hk/l4iUgO/8Q60qUrIa74NtP8Yzo="}]},"_npmUser":{"name":"karlgroves","email":"karlgroves@gmail.com"},"directories":{},"maintainers":[{"name":"macmilan","email":"marko.macmilan@gmail.com"},{"name":"jw1982","email":"john.watts@afixt.com"},{"name":"karlgroves","email":"karlgroves@gmail.com"}],"_npmOperationalInternal":{"host":"s3://npm-registry-packages-npm-production","tmp":"tmp/shareable_0.3.1_1788023189397_0.8696780314807993"},"_hasShrinkwrap":false}},"time":{"created":"2025-09-19T18:16:13.836Z","modified":"2026-08-29T17:06:29.771Z","0.1.0":"2025-09-19T18:16:14.140Z","0.2.1":"2025-09-24T22:57:16.206Z","0.2.2":"2026-03-22T14:34:20.081Z","0.3.0":"2026-08-28T14:54:56.509Z","0.3.1":"2026-08-29T17:06:29.615Z"},"bugs":{"url":"https://github.com/AFixt/shareable/issues"},"author":{"name":"AFixt","email":"talktous@afixt.com"},"license":"MIT","homepage":"https://github.com/AFixt/shareable#readme","keywords":["social-sharing","widget","accessibility","a11y","wcag","facebook","twitter","linkedin","whatsapp","telegram","reddit","embeddable","lightweight","no-dependencies","react","vue","angular","typescript","privacy-first","csp-compliant"],"repository":{"type":"git","url":"git+https://github.com/AFixt/shareable.git"},"description":"A lightweight, accessible, and customizable social sharing widget for modern web applications","maintainers":[{"name":"macmilan","email":"marko.macmilan@gmail.com"},{"name":"jw1982","email":"john.watts@afixt.com"},{"name":"karlgroves","email":"karlgroves@gmail.com"}],"readme":"# @afixt/shareable\n\n[![CI](https://github.com/AFixt/shareable/actions/workflows/ci.yml/badge.svg)](https://github.com/AFixt/shareable/actions/workflows/ci.yml)\n[![Security](https://github.com/AFixt/shareable/actions/workflows/security.yml/badge.svg)](https://github.com/AFixt/shareable/actions/workflows/security.yml)\n\nA lightweight, accessible, and customizable social sharing widget for modern web applications.\n\n## ✨ Features\n\n- 🪶 **Lightweight**: < 10KB gzipped with zero dependencies\n- ♿ **Accessible**: WCAG 2.2 Level AA compliant with full keyboard support\n- 🎨 **Customizable**: Multiple styles, themes, and layouts\n- 🔒 **Privacy-First**: No tracking, cookies, or third-party API calls\n- ⚡ **Performant**: < 100ms script execution on page load\n- 🌐 **Framework Support**: Works with React, Vue, Angular, or vanilla JS\n\n## 📦 Installation\n\n### NPM\n\n```bash\nnpm install @afixt/shareable\n```\n\n### Framework-Specific Packages\n\n```bash\nnpm install react-shareable    # React wrapper\nnpm install vue-shareable      # Vue wrapper\nnpm install angular-shareable  # Angular wrapper\n```\n\n## 🚀 Quick Start\n\n### Vanilla JavaScript\n\n```html\n<!-- Using data attributes -->\n<div\n  class=\"shareable\"\n  data-networks=\"facebook,twitter,linkedin\"\n  data-title=\"Check out this awesome content!\"\n></div>\n\n<!-- Using JavaScript API -->\n<div id=\"share-buttons\"></div>\n<script>\n  Shareable.init({\n    container: '#share-buttons',\n    networks: ['facebook', 'twitter', 'linkedin', 'email'],\n    style: 'icon-text',\n    theme: 'auto',\n  });\n</script>\n```\n\n### React\n\n```jsx\nimport { ShareableWidget } from 'react-shareable';\n\nfunction App() {\n  return (\n    <ShareableWidget\n      networks={['facebook', 'twitter', 'linkedin']}\n      title='Check out this content!'\n      onShare={(event) => console.log('Shared on:', event.network)}\n    />\n  );\n}\n```\n\n### Vue\n\n```vue\n<template>\n  <shareable-widget\n    :networks=\"['facebook', 'twitter', 'linkedin']\"\n    :title=\"articleTitle\"\n    @share=\"handleShare\"\n  />\n</template>\n\n<script>\nimport { ShareableWidget } from 'vue-shareable';\nexport default {\n  components: { ShareableWidget },\n};\n</script>\n```\n\n### Angular\n\n```typescript\n<shareable-widget\n  [networks]=\"['facebook', 'twitter', 'linkedin']\"\n  [title]=\"articleTitle\"\n  (onShare)=\"handleShare($event)\">\n</shareable-widget>\n```\n\n## 📱 Supported Networks\n\n- **Facebook** - Share to Facebook feed\n- **X (Twitter)** - Post on X/Twitter\n- **LinkedIn** - Share professional content\n- **WhatsApp** - Direct message sharing\n- **Telegram** - Share via Telegram\n- **Reddit** - Post to Reddit\n- **Email** - Share via email\n- **Copy Link** - Copy URL to clipboard\n\nPlus support for custom networks via the `customNetworks` API.\n\n## ⚙️ Configuration Options\n\n### Three Ways to Configure\n\n#### 1. HTML Data Attributes\n\n```html\n<div\n  class=\"shareable\"\n  data-networks=\"facebook,twitter,linkedin\"\n  data-style=\"icon-text\"\n  data-size=\"medium\"\n  data-theme=\"dark\"\n  data-title=\"Amazing Article\"\n  data-url=\"https://example.com\"\n></div>\n```\n\n#### 2. JavaScript API\n\n```javascript\nShareable.init({\n  container: '#share-buttons',\n  networks: ['facebook', 'twitter', 'linkedin'],\n  style: 'icon-only', // 'icon-only' | 'text-only' | 'icon-text'\n  size: 'medium', // 'small' | 'medium' | 'large'\n  theme: 'dark', // 'light' | 'dark' | 'auto'\n  layout: 'horizontal', // 'horizontal' | 'vertical' | 'floating-left' | 'floating-right'\n  spacing: 12, // Gap between buttons in pixels\n  counters: true, // Show share counts\n  title: 'Check out this article',\n  url: 'https://example.com/article',\n  hashtags: ['webdev', 'javascript'],\n  via: 'username', // Twitter @mention\n  utm: {\n    source: 'shareable',\n    medium: 'social',\n    campaign: 'share',\n  },\n});\n```\n\n#### 3. JSON Configuration\n\n```html\n<script type=\"application/json\" id=\"shareable-config\">\n  {\n    \"networks\": [\"facebook\", \"twitter\", \"linkedin\"],\n    \"style\": \"icon-text\",\n    \"theme\": \"auto\",\n    \"size\": \"large\"\n  }\n</script>\n<div id=\"share-widget\"></div>\n```\n\n## 🎨 Customization\n\n### Styles & Themes\n\n- **Styles**: `icon-only`, `text-only`, `icon-text`\n- **Themes**: `light`, `dark`, `auto` (follows system preference)\n- **Sizes**: `small` (24px), `medium` (32px), `large` (40px)\n- **Layouts**: `horizontal`, `vertical`, `floating-left`, `floating-right`\n\n### Custom Colors\n\n```javascript\nShareable.init({\n  colors: {\n    background: '#ff6b6b',\n    foreground: '#ffffff',\n  },\n});\n```\n\n### Custom Networks\n\n```javascript\nShareable.init({\n  networks: ['facebook', 'custom-slack'],\n  customNetworks: {\n    'custom-slack': {\n      name: 'Slack',\n      url: 'slack://channel?team={team}&id={channel}',\n      icon: '<svg>...</svg>',\n      color: '#4A154B',\n    },\n  },\n});\n```\n\n## 📊 Events & Tracking\n\n```javascript\n// Track share clicks\nShareable.on('click', function (event) {\n  console.log('Network:', event.network);\n  console.log('URL:', event.url);\n  console.log('Title:', event.title);\n\n  // Send to analytics\n  gtag('event', 'share', {\n    method: event.network,\n    content_type: 'article',\n    item_id: event.url,\n  });\n});\n\n// Widget loaded event\nShareable.on('load', function (event) {\n  console.log('Widget loaded with networks:', event.networks);\n});\n```\n\n## ♿ Accessibility Features\n\n- **Full keyboard navigation** - Tab, Enter, Space support\n- **Screen reader support** - Descriptive ARIA labels\n- **Focus indicators** - Clear visual focus states\n- **Touch targets** - Minimum 44×44px interactive areas\n- **Motion preferences** - Respects `prefers-reduced-motion`\n- **Live regions** - Announces actions to screen readers\n- **WCAG 2.2 AA compliant** - Meets all Level AA criteria\n\n## 📖 API Reference\n\n### Methods\n\n```javascript\n// Initialize widget\nconst widget = Shareable.init(config);\n\n// Update configuration\nwidget.update({ theme: 'dark', title: 'New Title' });\n\n// Destroy widget\nwidget.destroy();\n\n// Global event handlers\nShareable.on('click', callback);\nShareable.on('load', callback);\nShareable.off('click', callback);\n```\n\n### Configuration Object\n\n| Option      | Type    | Default                             | Description                      |\n| ----------- | ------- | ----------------------------------- | -------------------------------- |\n| `container` | string  | '.shareable'                        | CSS selector or element          |\n| `networks`  | array   | ['facebook', 'twitter', 'linkedin'] | Social networks to display       |\n| `style`     | string  | 'icon-only'                         | Button style                     |\n| `size`      | string  | 'medium'                            | Button size                      |\n| `theme`     | string  | 'light'                             | Color theme                      |\n| `layout`    | string  | 'horizontal'                        | Widget layout                    |\n| `spacing`   | number  | 8                                   | Gap between buttons (px)         |\n| `counters`  | boolean | false                               | Show share counts                |\n| `title`     | string  | Auto-detected                       | Share title                      |\n| `url`       | string  | Current URL                         | Share URL                        |\n| `text`      | string  | Auto-detected                       | Share description                |\n| `hashtags`  | array   | []                                  | Hashtags for applicable networks |\n| `via`       | string  | null                                | Twitter username                 |\n| `utm`       | object  | {}                                  | UTM tracking parameters          |\n\n## 🌐 Browser Support\n\n| Browser        | Minimum Version |\n| -------------- | --------------- |\n| Chrome         | 90+             |\n| Firefox        | 88+             |\n| Safari         | 14+             |\n| Edge           | 90+             |\n| iOS Safari     | 14+             |\n| Chrome Android | 90+             |\n\n## 📚 Examples\n\nView comprehensive examples for all frameworks:\n\n- [**Live Examples**](https://shareablejs.com/examples/)\n- [**Vanilla JavaScript**](examples/vanilla/) - Pure JS implementation\n- [**React**](examples/react/) - React hooks and components\n- [**Vue**](examples/vue/) - Vue 3 Composition API\n- [**Angular**](examples/angular/) - Angular directives and services\n\n## 🤝 Contributing\n\nWe welcome contributions! Please see our [Contributing Guide](CONTRIBUTING.md) for details.\n\n### Setup\n\n```bash\n# Clone and install\ngit clone https://github.com/AFixt/shareable.git\ncd shareable\nnpm install --legacy-peer-deps\n\n# Install the non-npm security tools used by git hooks\nbash scripts/bootstrap.sh\n\n# Verify your environment\nnpm run check:all\n```\n\nNode 24 (>= 24.15) is pinned via `.nvmrc` / `.node-version` and enforced by `devEngines` in `package.json`; the floor is set by `@afixt/a11y-assert` 3.x. The published package's `engines.node` stays at >= 22.13 — the widget itself needs nothing from Node.\n\n### Common commands\n\n| Command                  | What it does                                   |\n| ------------------------ | ---------------------------------------------- |\n| `npm run dev`            | Watch-mode Rollup build                        |\n| `npm run build`          | Production build                               |\n| `npm test`               | Jest unit + integration                        |\n| `npm run test:e2e`       | Playwright end-to-end (excludes `@a11y` specs) |\n| `npm run test:e2e:a11y`  | Playwright `@afixt/a11y-assert` audits only    |\n| `npm run test:e2e:all`   | Every Playwright spec                          |\n| `npm run lint`           | ESLint (no autofix)                            |\n| `npm run lint:fix`       | ESLint with `--fix`                            |\n| `npm run typecheck`      | `tsc --noEmit`                                 |\n| `npm run check`          | lint + format:check + typecheck + test         |\n| `npm run check:all`      | `check` + duplicate-code + license compliance  |\n| `npm run security:local` | audit + licenses + trufflehog + OSV + lychee   |\n\nHusky hooks run `lint-staged` + `trufflehog` on `pre-commit`, `commitlint` on `commit-msg`, `check:all` on `pre-push`, and `npm install` + `npm audit` on `post-merge` if `package-lock.json` changed. Never bypass with `--no-verify`.\n\nSee [docs/adr/](docs/adr/) for architecture decision records.\n\n## 📄 License\n\nMIT © [AFixt](https://github.com/afixt)\n\n## 🔗 Links\n\n- [Documentation](https://shareablejs.com/docs)\n- [NPM Package](https://www.npmjs.com/package/@afixt/shareable)\n- [GitHub Repository](https://github.com/AFixt/shareable)\n- [Issue Tracker](https://github.com/AFixt/shareable/issues)\n- [Changelog](CHANGELOG.md)\n\n---\n\n<p align=\"center\">\n  Made with ❤️ by the AFixt team<br>\n  <a href=\"https://shareablejs.com\">shareablejs.com</a>\n</p>\n","readmeFilename":"README.md"}