{"_id":"@bradleywilkerson/site","_rev":"5-97c6df806137636bfaba37c25f6b3a3a","name":"@bradleywilkerson/site","dist-tags":{"latest":"2.2.0"},"versions":{"1.0.1":{"name":"@bradleywilkerson/site","version":"1.0.1","_id":"@bradleywilkerson/site@1.0.1","maintainers":[{"name":"bradleywilkerson","email":"wlkrsn@gmail.com"}],"homepage":"https://github.com/theabcagency/site#readme","bugs":{"url":"https://github.com/theabcagency/site/issues"},"dist":{"shasum":"c294ef39d91ee22cd5b58703162a992a3dc407d8","tarball":"https://registry.npmjs.org/@bradleywilkerson/site/-/site-1.0.1.tgz","fileCount":10,"integrity":"sha512-4caJf7kpFA44oWNF3JcsG1AI4qgVD4Z2cza7uCArAFwPKOsU9JKFxPVnckYpngwCawshejt6vKWSwVuDK3A0IQ==","signatures":[{"sig":"MEYCIQCRXCjrddWoyD2LJ6P+3QAoaJu3MNLpwLHlZtDfwA3+sAIhAPSHsnBaTjbqsTY5juV3BHu8d/2psHbsdk1Jf4ScLL4o","keyid":"SHA256:DhQ8wR5APBvFHLF/+Tc+AYvPOdTpcIDqOhxsBHRwC7U"}],"unpackedSize":24466},"type":"module","exports":{"./forms":"./src/forms/ContactForm.astro","./config":"./src/config/index.ts","./images":"./src/images/Img.astro","./schema":"./src/schema/index.ts","./content":"./src/config/content.ts","./reviews":"./src/reviews/Reviews.astro","./tracking":"./src/tracking/Tracking.astro","./middleware":"./src/middleware/index.ts"},"gitHead":"46aad10d1a642d59df4c3950ecf523a032d2616e","scripts":{"check":"tsc --noEmit"},"_npmUser":{"name":"bradleywilkerson","email":"wlkrsn@gmail.com"},"repository":{"url":"git+https://github.com/theabcagency/site.git","type":"git"},"_npmVersion":"10.9.8","description":"Shared building blocks every ABC Agency client site depends on.","directories":{},"_nodeVersion":"22.23.2","dependencies":{"zod":"^3.23.0"},"publishConfig":{"access":"public"},"_hasShrinkwrap":false,"devDependencies":{"astro":"^5.0.0","typescript":"^5.6.0"},"peerDependencies":{"astro":"^5.0.0"},"_npmOperationalInternal":{"tmp":"tmp/site_1.0.1_1787534889703_0.19987967273353768","host":"s3://npm-registry-packages-npm-production"}},"2.0.0":{"name":"@bradleywilkerson/site","version":"2.0.0","_id":"@bradleywilkerson/site@2.0.0","maintainers":[{"name":"bradleywilkerson","email":"wlkrsn@gmail.com"}],"homepage":"https://github.com/theabcagency/site#readme","bugs":{"url":"https://github.com/theabcagency/site/issues"},"dist":{"shasum":"6aec5ad0358c60aa3c8ff7634fa46ae9a6e76dd2","tarball":"https://registry.npmjs.org/@bradleywilkerson/site/-/site-2.0.0.tgz","fileCount":10,"integrity":"sha512-15IYaA/87FaF2+GGP2DFb3+4fIXgIlAI6PpuoxmHNidsb3tEKbCBsaY40hlEPvTIZNSnQG7YwET/y4oIi44QMQ==","signatures":[{"sig":"MEUCICsYFyTffl+Yy74Snp4GUUEH2noEsBdEEkSJgDrHTmPmAiEAx+/MkOUYYJMuUEJCVnlqfY6VoyUVC3v4M9r9E474IGg=","keyid":"SHA256:DhQ8wR5APBvFHLF/+Tc+AYvPOdTpcIDqOhxsBHRwC7U"}],"unpackedSize":28624},"type":"module","exports":{"./forms":"./src/forms/ContactForm.astro","./config":"./src/config/index.ts","./images":"./src/images/Img.astro","./schema":"./src/schema/index.ts","./content":"./src/config/content.ts","./reviews":"./src/reviews/Reviews.astro","./tracking":"./src/tracking/Tracking.astro","./middleware":"./src/middleware/index.ts"},"gitHead":"83561714b05dd80c5939969bb22678b33b80d7fe","scripts":{"check":"tsc --noEmit"},"_npmUser":{"name":"bradleywilkerson","email":"wlkrsn@gmail.com"},"repository":{"url":"git+https://github.com/theabcagency/site.git","type":"git"},"_npmVersion":"10.9.8","description":"Shared building blocks every ABC Agency client site depends on.","directories":{},"_nodeVersion":"22.23.2","dependencies":{"zod":"^3.23.0"},"publishConfig":{"access":"public"},"_hasShrinkwrap":false,"devDependencies":{"astro":"^5.0.0","typescript":"^5.6.0"},"peerDependencies":{"astro":"^5.0.0"},"_npmOperationalInternal":{"tmp":"tmp/site_2.0.0_1787540053906_0.7946902686907755","host":"s3://npm-registry-packages-npm-production"}},"2.0.1":{"name":"@bradleywilkerson/site","version":"2.0.1","_id":"@bradleywilkerson/site@2.0.1","maintainers":[{"name":"bradleywilkerson","email":"wlkrsn@gmail.com"}],"homepage":"https://github.com/theabcagency/site#readme","bugs":{"url":"https://github.com/theabcagency/site/issues"},"dist":{"shasum":"1d3b6de7a632d0454e900faebf169c1ef217c7b6","tarball":"https://registry.npmjs.org/@bradleywilkerson/site/-/site-2.0.1.tgz","fileCount":10,"integrity":"sha512-+i70+gbH8tjQ0LCy/MMTLOSIi9l86nFUWWalX+JZ54HXXlRvhuMFSfNxxJMt3ip5os7cPykQWYAqf7a2NbiXpA==","signatures":[{"sig":"MEUCID88L33/BCK31XaOlV8AmQTfJFRrznsJbDRwfjytjy9VAiEA2mr13r8/ulQaVXEamTBlohGD8yT0B8cmSg4jkfTTINU=","keyid":"SHA256:DhQ8wR5APBvFHLF/+Tc+AYvPOdTpcIDqOhxsBHRwC7U"}],"unpackedSize":28817},"type":"module","exports":{"./forms":"./src/forms/ContactForm.astro","./config":"./src/config/index.ts","./images":"./src/images/Img.astro","./schema":"./src/schema/index.ts","./content":"./src/config/content.ts","./reviews":"./src/reviews/Reviews.astro","./tracking":"./src/tracking/Tracking.astro","./middleware":"./src/middleware/index.ts"},"gitHead":"8e2f823a867947d55f704ee0ca56a4642a1b0fdb","scripts":{"check":"tsc --noEmit"},"_npmUser":{"name":"bradleywilkerson","email":"wlkrsn@gmail.com"},"repository":{"url":"git+https://github.com/theabcagency/site.git","type":"git"},"_npmVersion":"10.9.8","description":"Shared building blocks every ABC Agency client site depends on.","directories":{},"_nodeVersion":"22.23.2","dependencies":{"zod":"^3.23.0"},"publishConfig":{"access":"public"},"_hasShrinkwrap":false,"devDependencies":{"astro":"^5.0.0","typescript":"^5.6.0"},"peerDependencies":{"astro":"^5.0.0"},"_npmOperationalInternal":{"tmp":"tmp/site_2.0.1_1787541082244_0.835832670012602","host":"s3://npm-registry-packages-npm-production"}},"2.1.0":{"name":"@bradleywilkerson/site","version":"2.1.0","_id":"@bradleywilkerson/site@2.1.0","maintainers":[{"name":"bradleywilkerson","email":"wlkrsn@gmail.com"}],"homepage":"https://github.com/theabcagency/site#readme","bugs":{"url":"https://github.com/theabcagency/site/issues"},"dist":{"shasum":"ef318cc05472117c143918f12ebb347b7dea365e","tarball":"https://registry.npmjs.org/@bradleywilkerson/site/-/site-2.1.0.tgz","fileCount":10,"integrity":"sha512-BJrNZsxDkA62BfzUT3+d6eadGGoAGEcwmLBDfZ5hAAKueFHX+fZ8Vfv2hOTrHTYzikO3YzfplQ+e4IPQGvOLLQ==","signatures":[{"sig":"MEYCIQDJUC4QGaogT8auuc3P827my2JCqg3NS2VZNVauRfMQRgIhAIP8I2U2vX5v1BkPAUaB3q3y0PdWx6LWjZDY3jNis1km","keyid":"SHA256:DhQ8wR5APBvFHLF/+Tc+AYvPOdTpcIDqOhxsBHRwC7U"}],"unpackedSize":29430},"type":"module","exports":{"./forms":"./src/forms/ContactForm.astro","./config":"./src/config/index.ts","./images":"./src/images/Img.astro","./schema":"./src/schema/index.ts","./content":"./src/config/content.ts","./reviews":"./src/reviews/Reviews.astro","./tracking":"./src/tracking/Tracking.astro","./middleware":"./src/middleware/index.ts"},"gitHead":"507994cfaa5ac3cba6cf4ec350792ad79a2ae57c","scripts":{"check":"tsc --noEmit"},"_npmUser":{"name":"bradleywilkerson","email":"wlkrsn@gmail.com"},"repository":{"url":"git+https://github.com/theabcagency/site.git","type":"git"},"_npmVersion":"10.9.8","description":"Shared building blocks every ABC Agency client site depends on.","directories":{},"_nodeVersion":"22.23.2","dependencies":{"zod":"^3.23.0"},"publishConfig":{"access":"public"},"_hasShrinkwrap":false,"devDependencies":{"astro":"^5.0.0","typescript":"^5.6.0"},"peerDependencies":{"astro":"^5.0.0"},"_npmOperationalInternal":{"tmp":"tmp/site_2.1.0_1787545122669_0.6846353773807028","host":"s3://npm-registry-packages-npm-production"}},"2.2.0":{"name":"@bradleywilkerson/site","version":"2.2.0","description":"Shared building blocks every ABC Agency client site depends on.","type":"module","publishConfig":{"access":"public"},"repository":{"type":"git","url":"git+https://github.com/theabcagency/site.git"},"exports":{"./config":"./src/config/index.ts","./schema":"./src/schema/index.ts","./tracking":"./src/tracking/Tracking.astro","./images":"./src/images/Img.astro","./reviews":"./src/reviews/Reviews.astro","./forms":"./src/forms/ContactForm.astro","./middleware":"./src/middleware/index.ts","./content":"./src/config/content.ts"},"peerDependencies":{"astro":"^5.0.0"},"devDependencies":{"astro":"^5.0.0","typescript":"^5.6.0"},"scripts":{"check":"tsc --noEmit"},"dependencies":{"zod":"^3.23.0"},"_id":"@bradleywilkerson/site@2.2.0","gitHead":"9799362e9d2c484f4596c1fb6e5def7cd38cdc72","bugs":{"url":"https://github.com/theabcagency/site/issues"},"homepage":"https://github.com/theabcagency/site#readme","_nodeVersion":"22.23.2","_npmVersion":"10.9.8","dist":{"integrity":"sha512-VoUh57IVpnwxpkCDj5gBxaY9MK8w2JOBGbeI8aMYIwZcz1Juf9sGVw/+BZ9LpLvANV3gF0KmNLaTmQWOrWXhfA==","shasum":"3a467235f789dc4aaff12d58b0ecb642b3824602","tarball":"https://registry.npmjs.org/@bradleywilkerson/site/-/site-2.2.0.tgz","fileCount":10,"unpackedSize":29713,"signatures":[{"keyid":"SHA256:DhQ8wR5APBvFHLF/+Tc+AYvPOdTpcIDqOhxsBHRwC7U","sig":"MEQCIGdO8l5P0TSE775W5kyBb2yqdaWKteWZnnL/xlwgaI0UAiAbyFDTIwFz42pOYwWJE8prHKNrnDnY0CLUhX2FxwdX6w=="}]},"_npmUser":{"name":"bradleywilkerson","email":"wlkrsn@gmail.com"},"directories":{},"maintainers":[{"name":"bradleywilkerson","email":"wlkrsn@gmail.com"}],"_npmOperationalInternal":{"host":"s3://npm-registry-packages-npm-production","tmp":"tmp/site_2.2.0_1788794347437_0.8526157166469588"},"_hasShrinkwrap":false}},"time":{"created":"2026-08-24T01:28:09.518Z","modified":"2026-09-07T15:19:07.782Z","1.0.1":"2026-08-24T01:28:09.855Z","2.0.0":"2026-08-24T02:54:14.041Z","2.0.1":"2026-08-24T03:11:22.393Z","2.1.0":"2026-08-24T04:18:42.801Z","2.2.0":"2026-09-07T15:19:07.602Z"},"bugs":{"url":"https://github.com/theabcagency/site/issues"},"homepage":"https://github.com/theabcagency/site#readme","repository":{"type":"git","url":"git+https://github.com/theabcagency/site.git"},"description":"Shared building blocks every ABC Agency client site depends on.","maintainers":[{"name":"bradleywilkerson","email":"wlkrsn@gmail.com"}],"readme":"# @bradleywilkerson/site\n\nShared building blocks every ABC Agency client site depends on. Client sites are\ncreated from [client-site-template](https://github.com/theabcagency/client-site-template)\nand consume this package.\n\n## The contract\n\nClient sites pin `^`, so minors reach them automatically. That makes one rule\nnon-negotiable:\n\n**New config fields are always optional with a default.**\n\nAdding a required field to `ClientConfig` is a breaking change and needs a major.\nIt is also the mistake most likely to happen, because it feels harmless while\nyou are writing it.\n\nThree things are the contract: the `ClientConfig` shape, component prop\nsignatures, and export names. Everything else is free to change.\n\n## Exports\n\n| Import | What it gives you |\n|---|---|\n| `@bradleywilkerson/site/config` | `ClientConfig`, `displayPhone`, `formatPhone`, `validateConfig` |\n| `@bradleywilkerson/site/schema` | `localBusinessSchema`, `articleSchema` |\n| `@bradleywilkerson/site/tracking` | `Tracking.astro` |\n| `@bradleywilkerson/site/images` | `Img.astro` |\n| `@bradleywilkerson/site/reviews` | `Reviews.astro` |\n| `@bradleywilkerson/site/forms` | `ContactForm.astro` |\n| `@bradleywilkerson/site/middleware` | `createAbMiddleware` |\n| `@bradleywilkerson/site/content` | `articlesCollection` |\n\n## Installing in a client site\n\n```\nnpm install @bradleywilkerson/site\n```\n\nPublic on npm. No token, no `.npmrc`, nothing to configure in any build\nenvironment.\n\n## Behaviour worth knowing\n\n**Tracking ids that are blank emit nothing.** A tag pointing at nothing looks\ninstalled in an audit while collecting nothing, which is worse than absent.\n\n**GA4 loads directly only when there is no GTM container.** Loading both\ndouble-counts every pageview, and it is the most common tracking mistake on the\nsites we audit.\n\n**Meta Pixel and CallRail inject directly only when there is no container.**\nWith one, they belong inside it.\n\n**Form fields are defined per client**, not hardcoded. Every trade asks\nsomething different, and the server stores the payload as jsonb, so adding a\nfield is a template change with no backend work:\n\n```astro\n<ContactForm client={client} formId=\"quote\" fields={[\n  { name: \"name\", label: \"Name\", required: true, autocomplete: \"name\" },\n  { name: \"roof_type\", label: \"Roof type\", type: \"select\", options: [\"Asphalt shingle\", \"Metal\", \"Tile\"] },\n]} />\n```\n\n**The contact form always shows a direct channel**, not only on failure. Client\nlead capture must not depend on our uptime. For a local service business that\nchannel is the phone, and the call is the primary conversion anyway; online-only\nclients with no phone fall back to the business email.\n\n**Online-only clients** (businessType `OnlineStore`) may omit `phone`, `address`,\n`geo`, `serviceArea` and `openingHours`. The structured data omits what is absent\nrather than publishing empty facts, and `services` holds product names, emitted\nas a Product offer catalog. `productSchema` generates per-product markup.\n\n**The reviews component emits no AggregateRating.** Google stopped showing\nrich-result stars for self-serving review markup in 2019. This block is for\nconversion; the ranking value is in getting reviews onto Google.\n\n## Releasing\n\nPublishing does not push anything live. A client site only picks up a new\nversion when that repo is rebuilt, so a rollout means triggering a deploy per\nclient.\n\ntheabcagency.com consumes this package as client zero, so a breaking change\nlands on our own property before anyone's client.\n","readmeFilename":"README.md"}