@rtstic.dev/pulse 0.0.42 → 0.0.43
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/dist/.tsbuildinfo +1 -1
- package/dist/form/book-a-demo.js.map +2 -2
- package/dist/form/index.js +2 -0
- package/dist/form/index.js.map +7 -0
- package/dist/form/pricing.css +0 -0
- package/dist/form/pricing.css.map +7 -0
- package/dist/form/pricing.js +2 -0
- package/dist/form/pricing.js.map +7 -0
- package/dist/form/styles.css +1 -1
- package/dist/form/styles.css.map +2 -2
- package/dist/global/styles.css +1 -1
- package/dist/global/styles.css.map +2 -2
- package/package.json +1 -1
package/dist/.tsbuildinfo
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"fileNames":["../../../../../opt/homebrew/lib/node_modules/typescript/lib/lib.es5.d.ts","../../../../../opt/homebrew/lib/node_modules/typescript/lib/lib.es2015.d.ts","../../../../../opt/homebrew/lib/node_modules/typescript/lib/lib.es2016.d.ts","../../../../../opt/homebrew/lib/node_modules/typescript/lib/lib.es2017.d.ts","../../../../../opt/homebrew/lib/node_modules/typescript/lib/lib.es2018.d.ts","../../../../../opt/homebrew/lib/node_modules/typescript/lib/lib.es2019.d.ts","../../../../../opt/homebrew/lib/node_modules/typescript/lib/lib.es2020.d.ts","../../../../../opt/homebrew/lib/node_modules/typescript/lib/lib.dom.d.ts","../../../../../opt/homebrew/lib/node_modules/typescript/lib/lib.dom.iterable.d.ts","../../../../../opt/homebrew/lib/node_modules/typescript/lib/lib.es2015.core.d.ts","../../../../../opt/homebrew/lib/node_modules/typescript/lib/lib.es2015.collection.d.ts","../../../../../opt/homebrew/lib/node_modules/typescript/lib/lib.es2015.generator.d.ts","../../../../../opt/homebrew/lib/node_modules/typescript/lib/lib.es2015.iterable.d.ts","../../../../../opt/homebrew/lib/node_modules/typescript/lib/lib.es2015.promise.d.ts","../../../../../opt/homebrew/lib/node_modules/typescript/lib/lib.es2015.proxy.d.ts","../../../../../opt/homebrew/lib/node_modules/typescript/lib/lib.es2015.reflect.d.ts","../../../../../opt/homebrew/lib/node_modules/typescript/lib/lib.es2015.symbol.d.ts","../../../../../opt/homebrew/lib/node_modules/typescript/lib/lib.es2015.symbol.wellknown.d.ts","../../../../../opt/homebrew/lib/node_modules/typescript/lib/lib.es2016.array.include.d.ts","../../../../../opt/homebrew/lib/node_modules/typescript/lib/lib.es2016.intl.d.ts","../../../../../opt/homebrew/lib/node_modules/typescript/lib/lib.es2017.arraybuffer.d.ts","../../../../../opt/homebrew/lib/node_modules/typescript/lib/lib.es2017.date.d.ts","../../../../../opt/homebrew/lib/node_modules/typescript/lib/lib.es2017.object.d.ts","../../../../../opt/homebrew/lib/node_modules/typescript/lib/lib.es2017.sharedmemory.d.ts","../../../../../opt/homebrew/lib/node_modules/typescript/lib/lib.es2017.string.d.ts","../../../../../opt/homebrew/lib/node_modules/typescript/lib/lib.es2017.intl.d.ts","../../../../../opt/homebrew/lib/node_modules/typescript/lib/lib.es2017.typedarrays.d.ts","../../../../../opt/homebrew/lib/node_modules/typescript/lib/lib.es2018.asyncgenerator.d.ts","../../../../../opt/homebrew/lib/node_modules/typescript/lib/lib.es2018.asynciterable.d.ts","../../../../../opt/homebrew/lib/node_modules/typescript/lib/lib.es2018.intl.d.ts","../../../../../opt/homebrew/lib/node_modules/typescript/lib/lib.es2018.promise.d.ts","../../../../../opt/homebrew/lib/node_modules/typescript/lib/lib.es2018.regexp.d.ts","../../../../../opt/homebrew/lib/node_modules/typescript/lib/lib.es2019.array.d.ts","../../../../../opt/homebrew/lib/node_modules/typescript/lib/lib.es2019.object.d.ts","../../../../../opt/homebrew/lib/node_modules/typescript/lib/lib.es2019.string.d.ts","../../../../../opt/homebrew/lib/node_modules/typescript/lib/lib.es2019.symbol.d.ts","../../../../../opt/homebrew/lib/node_modules/typescript/lib/lib.es2019.intl.d.ts","../../../../../opt/homebrew/lib/node_modules/typescript/lib/lib.es2020.bigint.d.ts","../../../../../opt/homebrew/lib/node_modules/typescript/lib/lib.es2020.date.d.ts","../../../../../opt/homebrew/lib/node_modules/typescript/lib/lib.es2020.promise.d.ts","../../../../../opt/homebrew/lib/node_modules/typescript/lib/lib.es2020.sharedmemory.d.ts","../../../../../opt/homebrew/lib/node_modules/typescript/lib/lib.es2020.string.d.ts","../../../../../opt/homebrew/lib/node_modules/typescript/lib/lib.es2020.symbol.wellknown.d.ts","../../../../../opt/homebrew/lib/node_modules/typescript/lib/lib.es2020.intl.d.ts","../../../../../opt/homebrew/lib/node_modules/typescript/lib/lib.es2020.number.d.ts","../../../../../opt/homebrew/lib/node_modules/typescript/lib/lib.decorators.d.ts","../../../../../opt/homebrew/lib/node_modules/typescript/lib/lib.decorators.legacy.d.ts","../node_modules/.pnpm/@splinetool+runtime@1.10.91/node_modules/@splinetool/runtime/runtime.d.ts","../node_modules/.pnpm/gsap@3.13.0/node_modules/gsap/types/animation.d.ts","../node_modules/.pnpm/gsap@3.13.0/node_modules/gsap/types/custom-bounce.d.ts","../node_modules/.pnpm/gsap@3.13.0/node_modules/gsap/types/custom-ease.d.ts","../node_modules/.pnpm/gsap@3.13.0/node_modules/gsap/types/custom-wiggle.d.ts","../node_modules/.pnpm/gsap@3.13.0/node_modules/gsap/types/css-plugin.d.ts","../node_modules/.pnpm/gsap@3.13.0/node_modules/gsap/types/css-rule-plugin.d.ts","../node_modules/.pnpm/gsap@3.13.0/node_modules/gsap/types/draggable.d.ts","../node_modules/.pnpm/gsap@3.13.0/node_modules/gsap/types/draw-svg-plugin.d.ts","../node_modules/.pnpm/gsap@3.13.0/node_modules/gsap/types/ease.d.ts","../node_modules/.pnpm/gsap@3.13.0/node_modules/gsap/types/easel-plugin.d.ts","../node_modules/.pnpm/gsap@3.13.0/node_modules/gsap/types/flip.d.ts","../node_modules/.pnpm/gsap@3.13.0/node_modules/gsap/types/gs-dev-tools.d.ts","../node_modules/.pnpm/gsap@3.13.0/node_modules/gsap/types/gsap-plugins.d.ts","../node_modules/.pnpm/gsap@3.13.0/node_modules/gsap/types/gsap-utils.d.ts","../node_modules/.pnpm/gsap@3.13.0/node_modules/gsap/types/inertia-plugin.d.ts","../node_modules/.pnpm/gsap@3.13.0/node_modules/gsap/types/morph-svg-plugin.d.ts","../node_modules/.pnpm/gsap@3.13.0/node_modules/gsap/types/motion-path-plugin.d.ts","../node_modules/.pnpm/gsap@3.13.0/node_modules/gsap/types/motion-path-helper.d.ts","../node_modules/.pnpm/gsap@3.13.0/node_modules/gsap/types/observer.d.ts","../node_modules/.pnpm/gsap@3.13.0/node_modules/gsap/types/physics-2d-plugin.d.ts","../node_modules/.pnpm/gsap@3.13.0/node_modules/gsap/types/physics-props-plugin.d.ts","../node_modules/.pnpm/gsap@3.13.0/node_modules/gsap/types/pixi-plugin.d.ts","../node_modules/.pnpm/gsap@3.13.0/node_modules/gsap/types/scramble-text-plugin.d.ts","../node_modules/.pnpm/gsap@3.13.0/node_modules/gsap/types/scroll-to-plugin.d.ts","../node_modules/.pnpm/gsap@3.13.0/node_modules/gsap/types/scroll-trigger.d.ts","../node_modules/.pnpm/gsap@3.13.0/node_modules/gsap/types/scroll-smoother.d.ts","../node_modules/.pnpm/gsap@3.13.0/node_modules/gsap/types/split-text.d.ts","../node_modules/.pnpm/gsap@3.13.0/node_modules/gsap/types/text-plugin.d.ts","../node_modules/.pnpm/gsap@3.13.0/node_modules/gsap/types/timeline.d.ts","../node_modules/.pnpm/gsap@3.13.0/node_modules/gsap/types/tween.d.ts","../node_modules/.pnpm/gsap@3.13.0/node_modules/gsap/types/utils/velocity-tracker.d.ts","../node_modules/.pnpm/gsap@3.13.0/node_modules/gsap/types/gsap-core.d.ts","../node_modules/.pnpm/gsap@3.13.0/node_modules/gsap/types/index.d.ts","../src/archive/index.ts","../node_modules/.pnpm/@studio-freight+lenis@1.0.42/node_modules/@studio-freight/lenis/dist/types/index.d.ts","../src/archive/lenis.ts","../src/archive/spline.ts","../src/global/accordions-v2.ts","../src/global/accordions.ts","../src/global/faqs.ts","../src/global/index.ts","../src/global/loader.ts","../src/glossary/alphabets.js","../src/glossary/index.ts","../src/glossary/old.js","../src/home/depth.ts","../src/home/horizontal-scroll.ts","../src/home/tabs.ts","../src/home/hero-animation/loader.ts","../src/home/hero-animation/scroll.ts","../src/home/hero-animation/torch.ts","../src/slider/freescroll-cards.ts","../src/slider/freescroll-slider.ts","../src/slider/testimonial.ts","../node_modules/.pnpm/esbuild@0.25.5/node_modules/esbuild/lib/main.d.ts","../bin/build.js","../bin/cdn.js"],"fileIdsList":[[50,51,52,53,54,55,56,57,58,59,60,62,63,64,65,66,67,68,69,70,71,72,73,74,75,76,80,81],[50,51,52,53,54,55,56,57,58,59,60,62,63,64,65,66,67,68,69,70,71,72,73,74,75,76,80,81,103],[50,51,52,53,54,55,56,57,58,59,60,63,64,65,66,67,68,69,70,71,72,73,74,75,76,80,81],[49,50,51,52,53,54,55,56,57,58,59,60,61,62,63,64,65,66,67,68,69,70,71,72,73,74,75,76,77,78,79,80,81],[50,51,52,53,54,55,56,57,58,59,60,62,63,64,65,66,67,68,69,70,71,72,73,74,75,76,79,80,81],[48,50,51,52,53,54,55,56,57,58,59,60,62,63,64,65,66,67,68,69,70,71,72,73,74,75,76,80,81],[50,51,52,53,54,55,56,57,58,59,60,62,63,64,65,66,67,68,69,70,71,72,73,74,75,76,80,81,83]],"fileInfos":[{"version":"69684132aeb9b5642cbcd9e22dff7818ff0ee1aa831728af0ecf97d3364d5546","affectsGlobalScope":true,"impliedFormat":1},{"version":"45b7ab580deca34ae9729e97c13cfd999df04416a79116c3bfb483804f85ded4","impliedFormat":1},{"version":"3facaf05f0c5fc569c5649dd359892c98a85557e3e0c847964caeb67076f4d75","impliedFormat":1},{"version":"e44bb8bbac7f10ecc786703fe0a6a4b952189f908707980ba8f3c8975a760962","impliedFormat":1},{"version":"5e1c4c362065a6b95ff952c0eab010f04dcd2c3494e813b493ecfd4fcb9fc0d8","impliedFormat":1},{"version":"68d73b4a11549f9c0b7d352d10e91e5dca8faa3322bfb77b661839c42b1ddec7","impliedFormat":1},{"version":"5efce4fc3c29ea84e8928f97adec086e3dc876365e0982cc8479a07954a3efd4","impliedFormat":1},{"version":"092c2bfe125ce69dbb1223c85d68d4d2397d7d8411867b5cc03cec902c233763","affectsGlobalScope":true,"impliedFormat":1},{"version":"07f073f19d67f74d732b1adea08e1dc66b1b58d77cb5b43931dee3d798a2fd53","affectsGlobalScope":true,"impliedFormat":1},{"version":"c57796738e7f83dbc4b8e65132f11a377649c00dd3eee333f672b8f0a6bea671","affectsGlobalScope":true,"impliedFormat":1},{"version":"dc2df20b1bcdc8c2d34af4926e2c3ab15ffe1160a63e58b7e09833f616efff44","affectsGlobalScope":true,"impliedFormat":1},{"version":"515d0b7b9bea2e31ea4ec968e9edd2c39d3eebf4a2d5cbd04e88639819ae3b71","affectsGlobalScope":true,"impliedFormat":1},{"version":"0559b1f683ac7505ae451f9a96ce4c3c92bdc71411651ca6ddb0e88baaaad6a3","affectsGlobalScope":true,"impliedFormat":1},{"version":"0dc1e7ceda9b8b9b455c3a2d67b0412feab00bd2f66656cd8850e8831b08b537","affectsGlobalScope":true,"impliedFormat":1},{"version":"ce691fb9e5c64efb9547083e4a34091bcbe5bdb41027e310ebba8f7d96a98671","affectsGlobalScope":true,"impliedFormat":1},{"version":"8d697a2a929a5fcb38b7a65594020fcef05ec1630804a33748829c5ff53640d0","affectsGlobalScope":true,"impliedFormat":1},{"version":"4ff2a353abf8a80ee399af572debb8faab2d33ad38c4b4474cff7f26e7653b8d","affectsGlobalScope":true,"impliedFormat":1},{"version":"936e80ad36a2ee83fc3caf008e7c4c5afe45b3cf3d5c24408f039c1d47bdc1df","affectsGlobalScope":true,"impliedFormat":1},{"version":"d15bea3d62cbbdb9797079416b8ac375ae99162a7fba5de2c6c505446486ac0a","affectsGlobalScope":true,"impliedFormat":1},{"version":"68d18b664c9d32a7336a70235958b8997ebc1c3b8505f4f1ae2b7e7753b87618","affectsGlobalScope":true,"impliedFormat":1},{"version":"eb3d66c8327153d8fa7dd03f9c58d351107fe824c79e9b56b462935176cdf12a","affectsGlobalScope":true,"impliedFormat":1},{"version":"38f0219c9e23c915ef9790ab1d680440d95419ad264816fa15009a8851e79119","affectsGlobalScope":true,"impliedFormat":1},{"version":"69ab18c3b76cd9b1be3d188eaf8bba06112ebbe2f47f6c322b5105a6fbc45a2e","affectsGlobalScope":true,"impliedFormat":1},{"version":"fef8cfad2e2dc5f5b3d97a6f4f2e92848eb1b88e897bb7318cef0e2820bceaab","affectsGlobalScope":true,"impliedFormat":1},{"version":"2f11ff796926e0832f9ae148008138ad583bd181899ab7dd768a2666700b1893","affectsGlobalScope":true,"impliedFormat":1},{"version":"4de680d5bb41c17f7f68e0419412ca23c98d5749dcaaea1896172f06435891fc","affectsGlobalScope":true,"impliedFormat":1},{"version":"954296b30da6d508a104a3a0b5d96b76495c709785c1d11610908e63481ee667","affectsGlobalScope":true,"impliedFormat":1},{"version":"ac9538681b19688c8eae65811b329d3744af679e0bdfa5d842d0e32524c73e1c","affectsGlobalScope":true,"impliedFormat":1},{"version":"0a969edff4bd52585473d24995c5ef223f6652d6ef46193309b3921d65dd4376","affectsGlobalScope":true,"impliedFormat":1},{"version":"9e9fbd7030c440b33d021da145d3232984c8bb7916f277e8ffd3dc2e3eae2bdb","affectsGlobalScope":true,"impliedFormat":1},{"version":"811ec78f7fefcabbda4bfa93b3eb67d9ae166ef95f9bff989d964061cbf81a0c","affectsGlobalScope":true,"impliedFormat":1},{"version":"717937616a17072082152a2ef351cb51f98802fb4b2fdabd32399843875974ca","affectsGlobalScope":true,"impliedFormat":1},{"version":"d7e7d9b7b50e5f22c915b525acc5a49a7a6584cf8f62d0569e557c5cfc4b2ac2","affectsGlobalScope":true,"impliedFormat":1},{"version":"71c37f4c9543f31dfced6c7840e068c5a5aacb7b89111a4364b1d5276b852557","affectsGlobalScope":true,"impliedFormat":1},{"version":"576711e016cf4f1804676043e6a0a5414252560eb57de9faceee34d79798c850","affectsGlobalScope":true,"impliedFormat":1},{"version":"89c1b1281ba7b8a96efc676b11b264de7a8374c5ea1e6617f11880a13fc56dc6","affectsGlobalScope":true,"impliedFormat":1},{"version":"74f7fa2d027d5b33eb0471c8e82a6c87216223181ec31247c357a3e8e2fddc5b","affectsGlobalScope":true,"impliedFormat":1},{"version":"d6d7ae4d1f1f3772e2a3cde568ed08991a8ae34a080ff1151af28b7f798e22ca","affectsGlobalScope":true,"impliedFormat":1},{"version":"063600664504610fe3e99b717a1223f8b1900087fab0b4cad1496a114744f8df","affectsGlobalScope":true,"impliedFormat":1},{"version":"934019d7e3c81950f9a8426d093458b65d5aff2c7c1511233c0fd5b941e608ab","affectsGlobalScope":true,"impliedFormat":1},{"version":"52ada8e0b6e0482b728070b7639ee42e83a9b1c22d205992756fe020fd9f4a47","affectsGlobalScope":true,"impliedFormat":1},{"version":"3bdefe1bfd4d6dee0e26f928f93ccc128f1b64d5d501ff4a8cf3c6371200e5e6","affectsGlobalScope":true,"impliedFormat":1},{"version":"59fb2c069260b4ba00b5643b907ef5d5341b167e7d1dbf58dfd895658bda2867","affectsGlobalScope":true,"impliedFormat":1},{"version":"639e512c0dfc3fad96a84caad71b8834d66329a1f28dc95e3946c9b58176c73a","affectsGlobalScope":true,"impliedFormat":1},{"version":"368af93f74c9c932edd84c58883e736c9e3d53cec1fe24c0b0ff451f529ceab1","affectsGlobalScope":true,"impliedFormat":1},{"version":"8e7f8264d0fb4c5339605a15daadb037bf238c10b654bb3eee14208f860a32ea","affectsGlobalScope":true,"impliedFormat":1},{"version":"782dec38049b92d4e85c1585fbea5474a219c6984a35b004963b00beb1aab538","affectsGlobalScope":true,"impliedFormat":1},{"version":"9297ab1e9e3e40a9e95bd4a9d2d397e226e963317970731de71490efa4a34eb2","impliedFormat":99},{"version":"a0815a09aed3b0279eb15c335aaa2fdbaaa1794a76ccb3bd9c6032915c03bb76","affectsGlobalScope":true,"impliedFormat":1},{"version":"af4f7a54357c1868ff9caf7991f1833cdb338c4afcec37a03cf104f3782ddf9b","affectsGlobalScope":true,"impliedFormat":1},{"version":"0e335736c960d3b971ad3ad79159df8252caa29d0a8114a0029e09cfe4a7cbc0","affectsGlobalScope":true,"impliedFormat":1},{"version":"770a83a0cd5cf52044ea1ec7c17ff32608f5b0e75d1cfe72f2fac13add3b8df6","affectsGlobalScope":true,"impliedFormat":1},{"version":"033cc8d0cf4529bc62746a9a026e43454f06f86d560b533e2726e677caf43c5f","affectsGlobalScope":true,"impliedFormat":1},{"version":"56ed2fc77c5587ed572b52c0c679ab284a84254875628d39d63a1ad84aa47993","affectsGlobalScope":true,"impliedFormat":1},{"version":"da04a353ae1f194880392596c1c65bd16039d7cb7d8c95394c8cc833bbeb5600","affectsGlobalScope":true,"impliedFormat":1},{"version":"7f0b457714a6a7dc40d51506cf9e5ab38aec893d78d10dc853d51e4ece6c8a86","affectsGlobalScope":true,"impliedFormat":1},{"version":"42dc1c1fb9a082bfc981edb18b50e12f7fda5009a15468ef6e6f939e86300fbd","affectsGlobalScope":true,"impliedFormat":1},{"version":"4b36ac8539e453915ead7ddf25653d6a7691e6dac52003372c12244965480df2","affectsGlobalScope":true,"impliedFormat":1},{"version":"b98109e756e7e1adf0f305b3f1e9d65a40da0c71ec6d23ffddd9c0ea75cb312a","affectsGlobalScope":true,"impliedFormat":1},{"version":"b3bee285d6a28772aba2633b6bcd9cd53a517f7a4862cf7893197222e73cfddc","affectsGlobalScope":true,"impliedFormat":1},{"version":"122c612162cb2e09d70ebdd670941441e902a26ee79b37f006c5b9d38868ed32","affectsGlobalScope":true,"impliedFormat":1},{"version":"c5af587b79f02783d656cbacf0c2ef79e95b93fb237b313f62e7bb5fbf4e3fe5","affectsGlobalScope":true,"impliedFormat":1},{"version":"f98e2b5fcf96686f2432d1823f195a2ad443762006d7fbda7b4d8d25efd0e384","affectsGlobalScope":true,"impliedFormat":1},{"version":"d3f5b5ecd76cd87ee280a5e72e69f941481e62f12430db4f27aa885c3addfdc7","affectsGlobalScope":true,"impliedFormat":1},{"version":"598710556d7994badb8c5c72d65a602121488d233b70e1c1318faf476a3a76d6","affectsGlobalScope":true,"impliedFormat":1},{"version":"5dabdd06cdb220b33a81312a965f8cab510044ccc522dfac4704baf7ae8aaa79","affectsGlobalScope":true,"impliedFormat":1},{"version":"29c8673e8a6fe0116035c345438591056032a76cad5744c81b5feb039d26789a","affectsGlobalScope":true,"impliedFormat":1},{"version":"9569b7fdc41e43e971cdd193685b085d682a3f2c7243c9a41360521cb21265fa","affectsGlobalScope":true,"impliedFormat":1},{"version":"a66a81b1b7e9582442c41807d62a7baee789e65a8ce6951e6a0b2553a94859a1","affectsGlobalScope":true,"impliedFormat":1},{"version":"f4a2170e218a95ea4352470799614733e6ac9576e9f2d10b57a986dc26763936","affectsGlobalScope":true,"impliedFormat":1},{"version":"1eb62bccdb763ded6f74a2ccd5eb939e3d63fc2a25677409d9c45bd982dec75e","affectsGlobalScope":true,"impliedFormat":1},{"version":"4bcb4739ebaa38c7c8bb85a5b40971ab83809c6f1f217e4d26c4418d9b9b07ad","affectsGlobalScope":true,"impliedFormat":1},{"version":"b83d4344e841547f1f5f791abc348c465b39fc81b1aa3090191e8d38a53a5e70","affectsGlobalScope":true,"impliedFormat":1},{"version":"8f54dfac75c73a9e55bb938d2dab1b48fb6fa8fc677dc7a21c3f90e92dae38b0","affectsGlobalScope":true,"impliedFormat":1},{"version":"ed91ce329a07818d9ad47f86644ec23991b202aca41849e076f2bce1006f1869","affectsGlobalScope":true,"impliedFormat":1},{"version":"3bac8c62839badb7cf43d2a507d8df73e61a5313bb6bf0eb0e373b51b1d94e1b","affectsGlobalScope":true,"impliedFormat":1},{"version":"5d94554e80c2392a2b51be4baad4619268158eccb18d23e5d7107849bc409485","affectsGlobalScope":true,"impliedFormat":1},{"version":"ceb1a78b91d40a8cef51b498546780d8842cd42811597af2c5584fa68defe048","affectsGlobalScope":true,"impliedFormat":1},{"version":"07cc2729a92e8293f16fa19e56aaeb9f350b4442a24724d358073131222e0bae","affectsGlobalScope":true,"impliedFormat":1},{"version":"9f352c8cba96c98d43bc7bcc5c807626c466df52c2d8168da48e969d1a9d994f","affectsGlobalScope":true,"impliedFormat":1},{"version":"fbaebab968e6f4a972ce9ef52028f07ab258bafe8944e18a490397361fcb8133","affectsGlobalScope":true,"impliedFormat":1},"11c1903fa9bdb7d530e60ad15aecb663c227c2962dcacdf752198c7085150a50",{"version":"a1a6b891bcafdeab5e9f1ba28d18e76f7ce3cc1dfebe68ae1884373863125e76","impliedFormat":1},"48d47f69298df4a2600b0fd8b3d2731d688d6a904995b8bdc09f0814ee5c46f1","4d2d609a8a550012fb8970969ec2959c426a5625d47130543945410117aa99bb",{"version":"c72c1cac28941e61369f6a375dc2991ce838741072f322e94853e323056ef1f5","affectsGlobalScope":true},{"version":"643bf7da4d950cfbebda9875eb6c31480018c8d7b66b580eb89bd6a06e13ba22","affectsGlobalScope":true},{"version":"983964ad2f53906dcac06b217e139d37f1b6324167577a5f244d65a70d93d150","affectsGlobalScope":true},"e3b0c44298fc1c149afbf4c8996fb92427ae41e4649b934ca495991b7852b855","b8a3f9d0db3a6fa9b64a08d518085813f676ea589152e474377d8c28d9e59533",{"version":"4aa925d66ce2ce3c9673ca50a6218165079efe123bb3ac95dd1368882b2907c3","affectsGlobalScope":true},"e3b0c44298fc1c149afbf4c8996fb92427ae41e4649b934ca495991b7852b855",{"version":"7549e5863a3c96e2c0945fa0860e16dd5263e59ec225a2eb273396b4e68c7808","affectsGlobalScope":true},{"version":"4ac4b59e494ecb87f39b89111d70414e7cb9159b7db968dd27bed6646ba73d46","affectsGlobalScope":true},{"version":"a3be4143a358b4d7a4715a05822d00eeb78d9c2935c264ce48d82ec02d37ffa0","affectsGlobalScope":true},{"version":"211d84242d434b292183db7ebfd542a3a9c064ebfdc0217aff8140cd73d214bf","affectsGlobalScope":true},{"version":"adadc0e566eb5ab4b104212a277bd8584aacf3734455a3b5cf657bbf90594d84","affectsGlobalScope":true},{"version":"220fa276d8acc4fb2f7f4ffe1697713b97b4e6dedea305edb7061baecf8ff5cd","affectsGlobalScope":true},{"version":"9f599e276a5f12e79205d7cca121710d2084604cae9098904db01c1ad59d5d8d","affectsGlobalScope":true},{"version":"4f97a393a51c1f38d00a92f6a85d6fec1f4e44b138991395e53ce284ff654279","affectsGlobalScope":true},{"version":"cc7fbe2c04f1a8997bd24f04dd7c9596d242b9a18cedef08214ba153533ab3f7","affectsGlobalScope":true},{"version":"d700ccd6f475f56727de561dd9a90cb0935b9bd47b9d07cdaeb9f4fc82e75e9f","affectsGlobalScope":true},{"version":"dd7ca4f0ef3661dac7043fb2cdf1b99e008d2b6bc5cd998dd1fa5a2968034984","affectsGlobalScope":true,"impliedFormat":1},"94a8462c3d4072b62cfe9028e367a543f970a0c5154e812f5d0ecaaccfb1a363","3140dca2a082687a84d6bfde0f613d8ebe3e6d1936abfad086b65c7fd988a6d3"],"root":[82,[84,102],104,105],"options":{"allowJs":true,"allowSyntheticDefaultImports":true,"declaration":true,"declarationMap":true,"esModuleInterop":true,"module":99,"outDir":"./","rootDir":"..","skipLibCheck":true,"sourceMap":true,"strict":true,"target":7,"tsBuildInfoFile":"./.tsbuildinfo"},"referencedMap":[[46,1],[47,1],[8,1],[9,1],[11,1],[10,1],[2,1],[12,1],[13,1],[14,1],[15,1],[16,1],[17,1],[18,1],[19,1],[3,1],[20,1],[21,1],[4,1],[22,1],[26,1],[23,1],[24,1],[25,1],[27,1],[28,1],[29,1],[5,1],[30,1],[31,1],[32,1],[33,1],[6,1],[37,1],[34,1],[35,1],[36,1],[38,1],[7,1],[39,1],[44,1],[45,1],[40,1],[41,1],[42,1],[43,1],[1,1],[104,2],[105,1],[48,1],[83,1],[103,1],[49,1],[53,1],[54,1],[50,1],[51,1],[52,1],[55,1],[56,1],[57,1],[58,1],[59,1],[60,1],[80,1],[61,1],[62,3],[81,4],[63,5],[64,1],[66,1],[65,1],[67,1],[68,1],[69,1],[70,1],[71,1],[74,1],[72,1],[73,1],[75,1],[76,1],[77,1],[78,1],[79,5],[82,6],[84,7],[85,6],[86,1],[87,1],[88,1],[89,1],[90,1],[91,1],[92,1],[93,1],[94,1],[97,6],[98,1],[99,1],[95,1],[96,1],[100,1],[101,1],[102,1]],"semanticDiagnosticsPerFile":[[86,[{"start":2781,"length":18,"messageText":"Duplicate function implementation.","category":1,"code":2393},{"start":3664,"length":13,"messageText":"Duplicate function implementation.","category":1,"code":2393},{"start":5226,"length":14,"messageText":"Duplicate function implementation.","category":1,"code":2393},{"start":6320,"length":20,"messageText":"Duplicate function implementation.","category":1,"code":2393},{"start":6759,"length":18,"messageText":"Duplicate function implementation.","category":1,"code":2393},{"start":7198,"length":20,"messageText":"Duplicate function implementation.","category":1,"code":2393}]],[87,[{"start":2806,"length":18,"messageText":"Duplicate function implementation.","category":1,"code":2393},{"start":3689,"length":13,"messageText":"Duplicate function implementation.","category":1,"code":2393},{"start":5327,"length":14,"messageText":"Duplicate function implementation.","category":1,"code":2393},{"start":6482,"length":20,"messageText":"Duplicate function implementation.","category":1,"code":2393},{"start":7534,"length":18,"messageText":"Duplicate function implementation.","category":1,"code":2393},{"start":7972,"length":20,"messageText":"Duplicate function implementation.","category":1,"code":2393}]]],"affectedFilesPendingEmit":[104,105,82,84,85,86,87,88,89,90,91,92,93,94,97,98,99,95,96,100,101,102],"version":"5.8.3"}
|
|
1
|
+
{"fileNames":["../../../../../opt/homebrew/lib/node_modules/typescript/lib/lib.es5.d.ts","../../../../../opt/homebrew/lib/node_modules/typescript/lib/lib.es2015.d.ts","../../../../../opt/homebrew/lib/node_modules/typescript/lib/lib.es2016.d.ts","../../../../../opt/homebrew/lib/node_modules/typescript/lib/lib.es2017.d.ts","../../../../../opt/homebrew/lib/node_modules/typescript/lib/lib.es2018.d.ts","../../../../../opt/homebrew/lib/node_modules/typescript/lib/lib.es2019.d.ts","../../../../../opt/homebrew/lib/node_modules/typescript/lib/lib.es2020.d.ts","../../../../../opt/homebrew/lib/node_modules/typescript/lib/lib.dom.d.ts","../../../../../opt/homebrew/lib/node_modules/typescript/lib/lib.dom.iterable.d.ts","../../../../../opt/homebrew/lib/node_modules/typescript/lib/lib.es2015.core.d.ts","../../../../../opt/homebrew/lib/node_modules/typescript/lib/lib.es2015.collection.d.ts","../../../../../opt/homebrew/lib/node_modules/typescript/lib/lib.es2015.generator.d.ts","../../../../../opt/homebrew/lib/node_modules/typescript/lib/lib.es2015.iterable.d.ts","../../../../../opt/homebrew/lib/node_modules/typescript/lib/lib.es2015.promise.d.ts","../../../../../opt/homebrew/lib/node_modules/typescript/lib/lib.es2015.proxy.d.ts","../../../../../opt/homebrew/lib/node_modules/typescript/lib/lib.es2015.reflect.d.ts","../../../../../opt/homebrew/lib/node_modules/typescript/lib/lib.es2015.symbol.d.ts","../../../../../opt/homebrew/lib/node_modules/typescript/lib/lib.es2015.symbol.wellknown.d.ts","../../../../../opt/homebrew/lib/node_modules/typescript/lib/lib.es2016.array.include.d.ts","../../../../../opt/homebrew/lib/node_modules/typescript/lib/lib.es2016.intl.d.ts","../../../../../opt/homebrew/lib/node_modules/typescript/lib/lib.es2017.arraybuffer.d.ts","../../../../../opt/homebrew/lib/node_modules/typescript/lib/lib.es2017.date.d.ts","../../../../../opt/homebrew/lib/node_modules/typescript/lib/lib.es2017.object.d.ts","../../../../../opt/homebrew/lib/node_modules/typescript/lib/lib.es2017.sharedmemory.d.ts","../../../../../opt/homebrew/lib/node_modules/typescript/lib/lib.es2017.string.d.ts","../../../../../opt/homebrew/lib/node_modules/typescript/lib/lib.es2017.intl.d.ts","../../../../../opt/homebrew/lib/node_modules/typescript/lib/lib.es2017.typedarrays.d.ts","../../../../../opt/homebrew/lib/node_modules/typescript/lib/lib.es2018.asyncgenerator.d.ts","../../../../../opt/homebrew/lib/node_modules/typescript/lib/lib.es2018.asynciterable.d.ts","../../../../../opt/homebrew/lib/node_modules/typescript/lib/lib.es2018.intl.d.ts","../../../../../opt/homebrew/lib/node_modules/typescript/lib/lib.es2018.promise.d.ts","../../../../../opt/homebrew/lib/node_modules/typescript/lib/lib.es2018.regexp.d.ts","../../../../../opt/homebrew/lib/node_modules/typescript/lib/lib.es2019.array.d.ts","../../../../../opt/homebrew/lib/node_modules/typescript/lib/lib.es2019.object.d.ts","../../../../../opt/homebrew/lib/node_modules/typescript/lib/lib.es2019.string.d.ts","../../../../../opt/homebrew/lib/node_modules/typescript/lib/lib.es2019.symbol.d.ts","../../../../../opt/homebrew/lib/node_modules/typescript/lib/lib.es2019.intl.d.ts","../../../../../opt/homebrew/lib/node_modules/typescript/lib/lib.es2020.bigint.d.ts","../../../../../opt/homebrew/lib/node_modules/typescript/lib/lib.es2020.date.d.ts","../../../../../opt/homebrew/lib/node_modules/typescript/lib/lib.es2020.promise.d.ts","../../../../../opt/homebrew/lib/node_modules/typescript/lib/lib.es2020.sharedmemory.d.ts","../../../../../opt/homebrew/lib/node_modules/typescript/lib/lib.es2020.string.d.ts","../../../../../opt/homebrew/lib/node_modules/typescript/lib/lib.es2020.symbol.wellknown.d.ts","../../../../../opt/homebrew/lib/node_modules/typescript/lib/lib.es2020.intl.d.ts","../../../../../opt/homebrew/lib/node_modules/typescript/lib/lib.es2020.number.d.ts","../../../../../opt/homebrew/lib/node_modules/typescript/lib/lib.decorators.d.ts","../../../../../opt/homebrew/lib/node_modules/typescript/lib/lib.decorators.legacy.d.ts","../node_modules/.pnpm/@splinetool+runtime@1.10.91/node_modules/@splinetool/runtime/runtime.d.ts","../node_modules/.pnpm/gsap@3.13.0/node_modules/gsap/types/animation.d.ts","../node_modules/.pnpm/gsap@3.13.0/node_modules/gsap/types/custom-bounce.d.ts","../node_modules/.pnpm/gsap@3.13.0/node_modules/gsap/types/custom-ease.d.ts","../node_modules/.pnpm/gsap@3.13.0/node_modules/gsap/types/custom-wiggle.d.ts","../node_modules/.pnpm/gsap@3.13.0/node_modules/gsap/types/css-plugin.d.ts","../node_modules/.pnpm/gsap@3.13.0/node_modules/gsap/types/css-rule-plugin.d.ts","../node_modules/.pnpm/gsap@3.13.0/node_modules/gsap/types/draggable.d.ts","../node_modules/.pnpm/gsap@3.13.0/node_modules/gsap/types/draw-svg-plugin.d.ts","../node_modules/.pnpm/gsap@3.13.0/node_modules/gsap/types/ease.d.ts","../node_modules/.pnpm/gsap@3.13.0/node_modules/gsap/types/easel-plugin.d.ts","../node_modules/.pnpm/gsap@3.13.0/node_modules/gsap/types/flip.d.ts","../node_modules/.pnpm/gsap@3.13.0/node_modules/gsap/types/gs-dev-tools.d.ts","../node_modules/.pnpm/gsap@3.13.0/node_modules/gsap/types/gsap-plugins.d.ts","../node_modules/.pnpm/gsap@3.13.0/node_modules/gsap/types/gsap-utils.d.ts","../node_modules/.pnpm/gsap@3.13.0/node_modules/gsap/types/inertia-plugin.d.ts","../node_modules/.pnpm/gsap@3.13.0/node_modules/gsap/types/morph-svg-plugin.d.ts","../node_modules/.pnpm/gsap@3.13.0/node_modules/gsap/types/motion-path-plugin.d.ts","../node_modules/.pnpm/gsap@3.13.0/node_modules/gsap/types/motion-path-helper.d.ts","../node_modules/.pnpm/gsap@3.13.0/node_modules/gsap/types/observer.d.ts","../node_modules/.pnpm/gsap@3.13.0/node_modules/gsap/types/physics-2d-plugin.d.ts","../node_modules/.pnpm/gsap@3.13.0/node_modules/gsap/types/physics-props-plugin.d.ts","../node_modules/.pnpm/gsap@3.13.0/node_modules/gsap/types/pixi-plugin.d.ts","../node_modules/.pnpm/gsap@3.13.0/node_modules/gsap/types/scramble-text-plugin.d.ts","../node_modules/.pnpm/gsap@3.13.0/node_modules/gsap/types/scroll-to-plugin.d.ts","../node_modules/.pnpm/gsap@3.13.0/node_modules/gsap/types/scroll-trigger.d.ts","../node_modules/.pnpm/gsap@3.13.0/node_modules/gsap/types/scroll-smoother.d.ts","../node_modules/.pnpm/gsap@3.13.0/node_modules/gsap/types/split-text.d.ts","../node_modules/.pnpm/gsap@3.13.0/node_modules/gsap/types/text-plugin.d.ts","../node_modules/.pnpm/gsap@3.13.0/node_modules/gsap/types/timeline.d.ts","../node_modules/.pnpm/gsap@3.13.0/node_modules/gsap/types/tween.d.ts","../node_modules/.pnpm/gsap@3.13.0/node_modules/gsap/types/utils/velocity-tracker.d.ts","../node_modules/.pnpm/gsap@3.13.0/node_modules/gsap/types/gsap-core.d.ts","../node_modules/.pnpm/gsap@3.13.0/node_modules/gsap/types/index.d.ts","../src/archive/index.ts","../node_modules/.pnpm/@studio-freight+lenis@1.0.42/node_modules/@studio-freight/lenis/dist/types/index.d.ts","../src/archive/lenis.ts","../src/archive/spline.ts","../src/form/book-a-demo.ts","../src/form/utils/initintltelinput.ts","../src/form/index.ts","../src/form/utils/collectformfields.ts","../src/form/utils/initformcontrols.ts","../src/form/utils/updaterequiredfields.ts","../src/form/utils/updateflowtype.ts","../src/form/utils/fillmirrorvalues.ts","../src/form/utils/validateform.ts","../src/form/pricing.ts","../src/global/accordions-v2.ts","../src/global/accordions.ts","../src/global/faqs.ts","../src/global/index.ts","../src/global/loader.ts","../src/glossary/alphabets.js","../src/glossary/index.ts","../src/glossary/old.js","../src/home/depth.ts","../src/home/horizontal-scroll.ts","../src/home/tabs-v2.ts","../src/home/tabs.ts","../src/home/hero-animation/loader.ts","../src/home/hero-animation/scroll.ts","../src/home/hero-animation/torch.ts","../src/marquee/index.ts","../src/slider/freescroll-cards.ts","../src/slider/freescroll-slider.ts","../src/slider/testimonial.ts","../node_modules/.pnpm/esbuild@0.25.5/node_modules/esbuild/lib/main.d.ts","../bin/build.js","../bin/cdn.js"],"fileIdsList":[[50,51,52,53,54,55,56,57,58,59,60,62,63,64,65,66,67,68,69,70,71,72,73,74,75,76,80,81],[50,51,52,53,54,55,56,57,58,59,60,62,63,64,65,66,67,68,69,70,71,72,73,74,75,76,80,81,115],[50,51,52,53,54,55,56,57,58,59,60,63,64,65,66,67,68,69,70,71,72,73,74,75,76,80,81],[49,50,51,52,53,54,55,56,57,58,59,60,61,62,63,64,65,66,67,68,69,70,71,72,73,74,75,76,77,78,79,80,81],[50,51,52,53,54,55,56,57,58,59,60,62,63,64,65,66,67,68,69,70,71,72,73,74,75,76,79,80,81],[48,50,51,52,53,54,55,56,57,58,59,60,62,63,64,65,66,67,68,69,70,71,72,73,74,75,76,80,81],[50,51,52,53,54,55,56,57,58,59,60,62,63,64,65,66,67,68,69,70,71,72,73,74,75,76,80,81,83],[50,51,52,53,54,55,56,57,58,59,60,62,63,64,65,66,67,68,69,70,71,72,73,74,75,76,80,81,87],[50,51,52,53,54,55,56,57,58,59,60,62,63,64,65,66,67,68,69,70,71,72,73,74,75,76,80,81,87,90,91,92,93,94],[50,51,52,53,54,55,56,57,58,59,60,62,63,64,65,66,67,68,69,70,71,72,73,74,75,76,80,81,89],[50,51,52,53,54,55,56,57,58,59,60,62,63,64,65,66,67,68,69,70,71,72,73,74,75,76,80,81,89,91]],"fileInfos":[{"version":"69684132aeb9b5642cbcd9e22dff7818ff0ee1aa831728af0ecf97d3364d5546","affectsGlobalScope":true,"impliedFormat":1},{"version":"45b7ab580deca34ae9729e97c13cfd999df04416a79116c3bfb483804f85ded4","impliedFormat":1},{"version":"3facaf05f0c5fc569c5649dd359892c98a85557e3e0c847964caeb67076f4d75","impliedFormat":1},{"version":"e44bb8bbac7f10ecc786703fe0a6a4b952189f908707980ba8f3c8975a760962","impliedFormat":1},{"version":"5e1c4c362065a6b95ff952c0eab010f04dcd2c3494e813b493ecfd4fcb9fc0d8","impliedFormat":1},{"version":"68d73b4a11549f9c0b7d352d10e91e5dca8faa3322bfb77b661839c42b1ddec7","impliedFormat":1},{"version":"5efce4fc3c29ea84e8928f97adec086e3dc876365e0982cc8479a07954a3efd4","impliedFormat":1},{"version":"092c2bfe125ce69dbb1223c85d68d4d2397d7d8411867b5cc03cec902c233763","affectsGlobalScope":true,"impliedFormat":1},{"version":"07f073f19d67f74d732b1adea08e1dc66b1b58d77cb5b43931dee3d798a2fd53","affectsGlobalScope":true,"impliedFormat":1},{"version":"c57796738e7f83dbc4b8e65132f11a377649c00dd3eee333f672b8f0a6bea671","affectsGlobalScope":true,"impliedFormat":1},{"version":"dc2df20b1bcdc8c2d34af4926e2c3ab15ffe1160a63e58b7e09833f616efff44","affectsGlobalScope":true,"impliedFormat":1},{"version":"515d0b7b9bea2e31ea4ec968e9edd2c39d3eebf4a2d5cbd04e88639819ae3b71","affectsGlobalScope":true,"impliedFormat":1},{"version":"0559b1f683ac7505ae451f9a96ce4c3c92bdc71411651ca6ddb0e88baaaad6a3","affectsGlobalScope":true,"impliedFormat":1},{"version":"0dc1e7ceda9b8b9b455c3a2d67b0412feab00bd2f66656cd8850e8831b08b537","affectsGlobalScope":true,"impliedFormat":1},{"version":"ce691fb9e5c64efb9547083e4a34091bcbe5bdb41027e310ebba8f7d96a98671","affectsGlobalScope":true,"impliedFormat":1},{"version":"8d697a2a929a5fcb38b7a65594020fcef05ec1630804a33748829c5ff53640d0","affectsGlobalScope":true,"impliedFormat":1},{"version":"4ff2a353abf8a80ee399af572debb8faab2d33ad38c4b4474cff7f26e7653b8d","affectsGlobalScope":true,"impliedFormat":1},{"version":"936e80ad36a2ee83fc3caf008e7c4c5afe45b3cf3d5c24408f039c1d47bdc1df","affectsGlobalScope":true,"impliedFormat":1},{"version":"d15bea3d62cbbdb9797079416b8ac375ae99162a7fba5de2c6c505446486ac0a","affectsGlobalScope":true,"impliedFormat":1},{"version":"68d18b664c9d32a7336a70235958b8997ebc1c3b8505f4f1ae2b7e7753b87618","affectsGlobalScope":true,"impliedFormat":1},{"version":"eb3d66c8327153d8fa7dd03f9c58d351107fe824c79e9b56b462935176cdf12a","affectsGlobalScope":true,"impliedFormat":1},{"version":"38f0219c9e23c915ef9790ab1d680440d95419ad264816fa15009a8851e79119","affectsGlobalScope":true,"impliedFormat":1},{"version":"69ab18c3b76cd9b1be3d188eaf8bba06112ebbe2f47f6c322b5105a6fbc45a2e","affectsGlobalScope":true,"impliedFormat":1},{"version":"fef8cfad2e2dc5f5b3d97a6f4f2e92848eb1b88e897bb7318cef0e2820bceaab","affectsGlobalScope":true,"impliedFormat":1},{"version":"2f11ff796926e0832f9ae148008138ad583bd181899ab7dd768a2666700b1893","affectsGlobalScope":true,"impliedFormat":1},{"version":"4de680d5bb41c17f7f68e0419412ca23c98d5749dcaaea1896172f06435891fc","affectsGlobalScope":true,"impliedFormat":1},{"version":"954296b30da6d508a104a3a0b5d96b76495c709785c1d11610908e63481ee667","affectsGlobalScope":true,"impliedFormat":1},{"version":"ac9538681b19688c8eae65811b329d3744af679e0bdfa5d842d0e32524c73e1c","affectsGlobalScope":true,"impliedFormat":1},{"version":"0a969edff4bd52585473d24995c5ef223f6652d6ef46193309b3921d65dd4376","affectsGlobalScope":true,"impliedFormat":1},{"version":"9e9fbd7030c440b33d021da145d3232984c8bb7916f277e8ffd3dc2e3eae2bdb","affectsGlobalScope":true,"impliedFormat":1},{"version":"811ec78f7fefcabbda4bfa93b3eb67d9ae166ef95f9bff989d964061cbf81a0c","affectsGlobalScope":true,"impliedFormat":1},{"version":"717937616a17072082152a2ef351cb51f98802fb4b2fdabd32399843875974ca","affectsGlobalScope":true,"impliedFormat":1},{"version":"d7e7d9b7b50e5f22c915b525acc5a49a7a6584cf8f62d0569e557c5cfc4b2ac2","affectsGlobalScope":true,"impliedFormat":1},{"version":"71c37f4c9543f31dfced6c7840e068c5a5aacb7b89111a4364b1d5276b852557","affectsGlobalScope":true,"impliedFormat":1},{"version":"576711e016cf4f1804676043e6a0a5414252560eb57de9faceee34d79798c850","affectsGlobalScope":true,"impliedFormat":1},{"version":"89c1b1281ba7b8a96efc676b11b264de7a8374c5ea1e6617f11880a13fc56dc6","affectsGlobalScope":true,"impliedFormat":1},{"version":"74f7fa2d027d5b33eb0471c8e82a6c87216223181ec31247c357a3e8e2fddc5b","affectsGlobalScope":true,"impliedFormat":1},{"version":"d6d7ae4d1f1f3772e2a3cde568ed08991a8ae34a080ff1151af28b7f798e22ca","affectsGlobalScope":true,"impliedFormat":1},{"version":"063600664504610fe3e99b717a1223f8b1900087fab0b4cad1496a114744f8df","affectsGlobalScope":true,"impliedFormat":1},{"version":"934019d7e3c81950f9a8426d093458b65d5aff2c7c1511233c0fd5b941e608ab","affectsGlobalScope":true,"impliedFormat":1},{"version":"52ada8e0b6e0482b728070b7639ee42e83a9b1c22d205992756fe020fd9f4a47","affectsGlobalScope":true,"impliedFormat":1},{"version":"3bdefe1bfd4d6dee0e26f928f93ccc128f1b64d5d501ff4a8cf3c6371200e5e6","affectsGlobalScope":true,"impliedFormat":1},{"version":"59fb2c069260b4ba00b5643b907ef5d5341b167e7d1dbf58dfd895658bda2867","affectsGlobalScope":true,"impliedFormat":1},{"version":"639e512c0dfc3fad96a84caad71b8834d66329a1f28dc95e3946c9b58176c73a","affectsGlobalScope":true,"impliedFormat":1},{"version":"368af93f74c9c932edd84c58883e736c9e3d53cec1fe24c0b0ff451f529ceab1","affectsGlobalScope":true,"impliedFormat":1},{"version":"8e7f8264d0fb4c5339605a15daadb037bf238c10b654bb3eee14208f860a32ea","affectsGlobalScope":true,"impliedFormat":1},{"version":"782dec38049b92d4e85c1585fbea5474a219c6984a35b004963b00beb1aab538","affectsGlobalScope":true,"impliedFormat":1},{"version":"9297ab1e9e3e40a9e95bd4a9d2d397e226e963317970731de71490efa4a34eb2","impliedFormat":99},{"version":"a0815a09aed3b0279eb15c335aaa2fdbaaa1794a76ccb3bd9c6032915c03bb76","affectsGlobalScope":true,"impliedFormat":1},{"version":"af4f7a54357c1868ff9caf7991f1833cdb338c4afcec37a03cf104f3782ddf9b","affectsGlobalScope":true,"impliedFormat":1},{"version":"0e335736c960d3b971ad3ad79159df8252caa29d0a8114a0029e09cfe4a7cbc0","affectsGlobalScope":true,"impliedFormat":1},{"version":"770a83a0cd5cf52044ea1ec7c17ff32608f5b0e75d1cfe72f2fac13add3b8df6","affectsGlobalScope":true,"impliedFormat":1},{"version":"033cc8d0cf4529bc62746a9a026e43454f06f86d560b533e2726e677caf43c5f","affectsGlobalScope":true,"impliedFormat":1},{"version":"56ed2fc77c5587ed572b52c0c679ab284a84254875628d39d63a1ad84aa47993","affectsGlobalScope":true,"impliedFormat":1},{"version":"da04a353ae1f194880392596c1c65bd16039d7cb7d8c95394c8cc833bbeb5600","affectsGlobalScope":true,"impliedFormat":1},{"version":"7f0b457714a6a7dc40d51506cf9e5ab38aec893d78d10dc853d51e4ece6c8a86","affectsGlobalScope":true,"impliedFormat":1},{"version":"42dc1c1fb9a082bfc981edb18b50e12f7fda5009a15468ef6e6f939e86300fbd","affectsGlobalScope":true,"impliedFormat":1},{"version":"4b36ac8539e453915ead7ddf25653d6a7691e6dac52003372c12244965480df2","affectsGlobalScope":true,"impliedFormat":1},{"version":"b98109e756e7e1adf0f305b3f1e9d65a40da0c71ec6d23ffddd9c0ea75cb312a","affectsGlobalScope":true,"impliedFormat":1},{"version":"b3bee285d6a28772aba2633b6bcd9cd53a517f7a4862cf7893197222e73cfddc","affectsGlobalScope":true,"impliedFormat":1},{"version":"122c612162cb2e09d70ebdd670941441e902a26ee79b37f006c5b9d38868ed32","affectsGlobalScope":true,"impliedFormat":1},{"version":"c5af587b79f02783d656cbacf0c2ef79e95b93fb237b313f62e7bb5fbf4e3fe5","affectsGlobalScope":true,"impliedFormat":1},{"version":"f98e2b5fcf96686f2432d1823f195a2ad443762006d7fbda7b4d8d25efd0e384","affectsGlobalScope":true,"impliedFormat":1},{"version":"d3f5b5ecd76cd87ee280a5e72e69f941481e62f12430db4f27aa885c3addfdc7","affectsGlobalScope":true,"impliedFormat":1},{"version":"598710556d7994badb8c5c72d65a602121488d233b70e1c1318faf476a3a76d6","affectsGlobalScope":true,"impliedFormat":1},{"version":"5dabdd06cdb220b33a81312a965f8cab510044ccc522dfac4704baf7ae8aaa79","affectsGlobalScope":true,"impliedFormat":1},{"version":"29c8673e8a6fe0116035c345438591056032a76cad5744c81b5feb039d26789a","affectsGlobalScope":true,"impliedFormat":1},{"version":"9569b7fdc41e43e971cdd193685b085d682a3f2c7243c9a41360521cb21265fa","affectsGlobalScope":true,"impliedFormat":1},{"version":"a66a81b1b7e9582442c41807d62a7baee789e65a8ce6951e6a0b2553a94859a1","affectsGlobalScope":true,"impliedFormat":1},{"version":"f4a2170e218a95ea4352470799614733e6ac9576e9f2d10b57a986dc26763936","affectsGlobalScope":true,"impliedFormat":1},{"version":"1eb62bccdb763ded6f74a2ccd5eb939e3d63fc2a25677409d9c45bd982dec75e","affectsGlobalScope":true,"impliedFormat":1},{"version":"4bcb4739ebaa38c7c8bb85a5b40971ab83809c6f1f217e4d26c4418d9b9b07ad","affectsGlobalScope":true,"impliedFormat":1},{"version":"b83d4344e841547f1f5f791abc348c465b39fc81b1aa3090191e8d38a53a5e70","affectsGlobalScope":true,"impliedFormat":1},{"version":"8f54dfac75c73a9e55bb938d2dab1b48fb6fa8fc677dc7a21c3f90e92dae38b0","affectsGlobalScope":true,"impliedFormat":1},{"version":"ed91ce329a07818d9ad47f86644ec23991b202aca41849e076f2bce1006f1869","affectsGlobalScope":true,"impliedFormat":1},{"version":"3bac8c62839badb7cf43d2a507d8df73e61a5313bb6bf0eb0e373b51b1d94e1b","affectsGlobalScope":true,"impliedFormat":1},{"version":"5d94554e80c2392a2b51be4baad4619268158eccb18d23e5d7107849bc409485","affectsGlobalScope":true,"impliedFormat":1},{"version":"ceb1a78b91d40a8cef51b498546780d8842cd42811597af2c5584fa68defe048","affectsGlobalScope":true,"impliedFormat":1},{"version":"07cc2729a92e8293f16fa19e56aaeb9f350b4442a24724d358073131222e0bae","affectsGlobalScope":true,"impliedFormat":1},{"version":"9f352c8cba96c98d43bc7bcc5c807626c466df52c2d8168da48e969d1a9d994f","affectsGlobalScope":true,"impliedFormat":1},{"version":"fbaebab968e6f4a972ce9ef52028f07ab258bafe8944e18a490397361fcb8133","affectsGlobalScope":true,"impliedFormat":1},{"version":"11c1903fa9bdb7d530e60ad15aecb663c227c2962dcacdf752198c7085150a50","signature":"8e609bb71c20b858c77f0e9f90bb1319db8477b13f9f965f1a1e18524bf50881"},{"version":"a1a6b891bcafdeab5e9f1ba28d18e76f7ce3cc1dfebe68ae1884373863125e76","impliedFormat":1},{"version":"48d47f69298df4a2600b0fd8b3d2731d688d6a904995b8bdc09f0814ee5c46f1","signature":"8e609bb71c20b858c77f0e9f90bb1319db8477b13f9f965f1a1e18524bf50881"},{"version":"4d2d609a8a550012fb8970969ec2959c426a5625d47130543945410117aa99bb","signature":"8e609bb71c20b858c77f0e9f90bb1319db8477b13f9f965f1a1e18524bf50881"},{"version":"902708a44156aa44c0cee4028afc993c4907f67e1038d98100fa8d14e93749d0","signature":"8e609bb71c20b858c77f0e9f90bb1319db8477b13f9f965f1a1e18524bf50881"},{"version":"8a3b49fccabd0b528361b36abeda18fcbfb832dbd192e38ed9eca3d21750e581","signature":"4d33056ae5413f014922d931f81b3e90d060dcbd4d7ae298837eea28f6de4743"},{"version":"5fc59293f9fd24e436ea13a40980fc308a0979b86ca362b0d71f3e000224041a","signature":"8e609bb71c20b858c77f0e9f90bb1319db8477b13f9f965f1a1e18524bf50881"},{"version":"bb3912f4028ddf747da8edf06b80e66d88ddc187f7804327c95ce5130a6ae619","signature":"16bc3467f6c2e4f3dae0bbc78f6bedc379d3c6232a2970c8339bcf21f92a8402"},{"version":"848b0c3261f77c94a8c08ff5b6e6eb5b18c4cbb1803c8ddaeb32791241698e4f","signature":"9100b2b6cdcef7deb7ed4be8e72cedd50d6eb895d1833333f7ca097c1fd53817"},{"version":"c51c4441fb6de0c05f70a08843327a315b3ffe525198996bd04076699da83d39","signature":"75096dfbeb28809d0c52c0f517533114ad4a02110f30f9decf9dc1ed66af7bd8"},{"version":"1aa3e4d926f5510ea2fe92662e9ce095e9b7ec1e08dc98ba4ef66293366d77e6","signature":"7798b5561356ceb2451347f969064a9583adc7a593d5c353c69cc33155573728"},{"version":"cccdb1efd35e9709e29433ccd951ec00764430c834a90c876a3ba7e132e36493","signature":"730e888c1d16a4f30e15ad72b4249ed8131582161ac30eed633276b2e9c52494"},{"version":"f91744d80493c5987c6471c175df5e4478daa5629dadfa34a3a07b6c8186bbc6","signature":"6eb932d5253be849b48cf59ac6b5b0a27ab89479e55b326527132344f42e1dce"},{"version":"7397c577c489a07224eb6a50b34f2b8d65b9c55262ef8d89a275bf9ad2dc63a7","signature":"8e609bb71c20b858c77f0e9f90bb1319db8477b13f9f965f1a1e18524bf50881"},{"version":"46788c74dafa1dcafe79ec48a8d862dfbe86603cd4adab1fde184fd55213b28d","signature":"14e6edfcfc2db204bc9bf5faad8d7cded218d6923998817a97d2abbbae84b758","affectsGlobalScope":true},{"version":"643bf7da4d950cfbebda9875eb6c31480018c8d7b66b580eb89bd6a06e13ba22","signature":"d2cec74985d8f670812a16a604f259828d8353ad816e8b47f902bc0755ac74f5","affectsGlobalScope":true},{"version":"983964ad2f53906dcac06b217e139d37f1b6324167577a5f244d65a70d93d150","signature":"270e76a412d3b700090d2a3c9151b51748d773067fc716545cb2021d32c96c85","affectsGlobalScope":true},"e3b0c44298fc1c149afbf4c8996fb92427ae41e4649b934ca495991b7852b855",{"version":"b8a3f9d0db3a6fa9b64a08d518085813f676ea589152e474377d8c28d9e59533","signature":"f33001c29e9dbde58620a4a18ba6014f45d0198438f0541fe21eb87ee9dfc0e5"},{"version":"4aa925d66ce2ce3c9673ca50a6218165079efe123bb3ac95dd1368882b2907c3","signature":"b3557fa4f494e76ddb8a55918ad11e5c73d97443b0e078e530172e822b536097","affectsGlobalScope":true},"e3b0c44298fc1c149afbf4c8996fb92427ae41e4649b934ca495991b7852b855",{"version":"7549e5863a3c96e2c0945fa0860e16dd5263e59ec225a2eb273396b4e68c7808","signature":"e3b0c44298fc1c149afbf4c8996fb92427ae41e4649b934ca495991b7852b855","affectsGlobalScope":true},{"version":"4ac4b59e494ecb87f39b89111d70414e7cb9159b7db968dd27bed6646ba73d46","signature":"bcbcedfc9db0891b46d6d2a08825a42475fa8771a7418ecc65313333ee6b6325","affectsGlobalScope":true},{"version":"a3be4143a358b4d7a4715a05822d00eeb78d9c2935c264ce48d82ec02d37ffa0","signature":"7021f84110533716167feb4f480b9f99e7117299985a3928019e1c814d4e940a","affectsGlobalScope":true},{"version":"213bca3cac0ba3abec990cfbf45f1a403d7256cef53b76b57468409c2e50d93a","signature":"aa55186cdbe8870e03691b021b9126ea50862ad2b31f8f55d314b8ee1d3ec720","affectsGlobalScope":true},{"version":"211d84242d434b292183db7ebfd542a3a9c064ebfdc0217aff8140cd73d214bf","signature":"b6ec4209e47844db15b31760e1126d3dbf841b1aa7d503a3f8c640c3f19ac905","affectsGlobalScope":true},{"version":"adadc0e566eb5ab4b104212a277bd8584aacf3734455a3b5cf657bbf90594d84","signature":"015cc837bf00efc736af8638fd92f6ac6a9454c9dbecb42b4f1fd15e6383e454","affectsGlobalScope":true},{"version":"220fa276d8acc4fb2f7f4ffe1697713b97b4e6dedea305edb7061baecf8ff5cd","signature":"7665968bcce507c500833be7022b8a86545628c3688b7719fe8fb36b0b004480","affectsGlobalScope":true},{"version":"9f599e276a5f12e79205d7cca121710d2084604cae9098904db01c1ad59d5d8d","signature":"57feaab70419d6b1f50c067154b1d374d3f2bc84d8aa5d9c3c454c8cbe55ec0a","affectsGlobalScope":true},{"version":"d51236b70b5d510a704eedd237f4a1efb4b748039782333f1acd2b96427e1468","signature":"8e609bb71c20b858c77f0e9f90bb1319db8477b13f9f965f1a1e18524bf50881"},{"version":"f640ad8fc22bf70a77e7db101a396916012b1a46d8bbbdd77b1e7ea38bf9fb3f","signature":"e3b0c44298fc1c149afbf4c8996fb92427ae41e4649b934ca495991b7852b855","affectsGlobalScope":true},{"version":"cc7fbe2c04f1a8997bd24f04dd7c9596d242b9a18cedef08214ba153533ab3f7","signature":"e3b0c44298fc1c149afbf4c8996fb92427ae41e4649b934ca495991b7852b855","affectsGlobalScope":true},{"version":"d700ccd6f475f56727de561dd9a90cb0935b9bd47b9d07cdaeb9f4fc82e75e9f","signature":"981b78187314af3a928d965d3cc1873492f32b46620445f609f11669e0b8fca4","affectsGlobalScope":true},{"version":"dd7ca4f0ef3661dac7043fb2cdf1b99e008d2b6bc5cd998dd1fa5a2968034984","affectsGlobalScope":true,"impliedFormat":1},{"version":"f1ae30ad0ae60f04f5ab8488eb1631b066d0a41a624e94eadc58ecb2eb82f598","signature":"8e609bb71c20b858c77f0e9f90bb1319db8477b13f9f965f1a1e18524bf50881"},{"version":"3140dca2a082687a84d6bfde0f613d8ebe3e6d1936abfad086b65c7fd988a6d3","signature":"8e609bb71c20b858c77f0e9f90bb1319db8477b13f9f965f1a1e18524bf50881"}],"root":[82,[84,114],116,117],"options":{"allowJs":true,"allowSyntheticDefaultImports":true,"declaration":true,"declarationMap":true,"esModuleInterop":true,"module":99,"outDir":"./","rootDir":"..","skipLibCheck":true,"sourceMap":true,"strict":true,"target":7,"tsBuildInfoFile":"./.tsbuildinfo"},"referencedMap":[[46,1],[47,1],[8,1],[9,1],[11,1],[10,1],[2,1],[12,1],[13,1],[14,1],[15,1],[16,1],[17,1],[18,1],[19,1],[3,1],[20,1],[21,1],[4,1],[22,1],[26,1],[23,1],[24,1],[25,1],[27,1],[28,1],[29,1],[5,1],[30,1],[31,1],[32,1],[33,1],[6,1],[37,1],[34,1],[35,1],[36,1],[38,1],[7,1],[39,1],[44,1],[45,1],[40,1],[41,1],[42,1],[43,1],[1,1],[116,2],[117,1],[48,1],[83,1],[115,1],[49,1],[53,1],[54,1],[50,1],[51,1],[52,1],[55,1],[56,1],[57,1],[58,1],[59,1],[60,1],[80,1],[61,1],[62,3],[81,4],[63,5],[64,1],[66,1],[65,1],[67,1],[68,1],[69,1],[70,1],[71,1],[74,1],[72,1],[73,1],[75,1],[76,1],[77,1],[78,1],[79,5],[82,6],[84,7],[85,6],[86,1],[88,8],[95,9],[89,1],[93,10],[90,10],[87,1],[92,11],[91,10],[94,10],[96,1],[97,1],[98,1],[99,1],[100,1],[101,1],[102,1],[103,1],[104,1],[108,6],[109,1],[110,1],[105,1],[106,1],[107,1],[111,1],[112,1],[113,1],[114,1]],"semanticDiagnosticsPerFile":[[96,[{"start":3479,"length":18,"messageText":"Duplicate function implementation.","category":1,"code":2393},{"start":4362,"length":13,"messageText":"Duplicate function implementation.","category":1,"code":2393},{"start":6441,"length":14,"messageText":"Duplicate function implementation.","category":1,"code":2393},{"start":8049,"length":20,"messageText":"Duplicate function implementation.","category":1,"code":2393},{"start":8488,"length":18,"messageText":"Duplicate function implementation.","category":1,"code":2393},{"start":8927,"length":20,"messageText":"Duplicate function implementation.","category":1,"code":2393}]],[97,[{"start":2806,"length":18,"messageText":"Duplicate function implementation.","category":1,"code":2393},{"start":3689,"length":13,"messageText":"Duplicate function implementation.","category":1,"code":2393},{"start":5327,"length":14,"messageText":"Duplicate function implementation.","category":1,"code":2393},{"start":6482,"length":20,"messageText":"Duplicate function implementation.","category":1,"code":2393},{"start":7534,"length":18,"messageText":"Duplicate function implementation.","category":1,"code":2393},{"start":7972,"length":20,"messageText":"Duplicate function implementation.","category":1,"code":2393}]]],"affectedFilesPendingEmit":[116,117,82,84,85,86,88,95,89,93,90,87,92,91,94,96,97,98,99,100,101,102,103,104,108,109,110,105,106,107,111,112,113,114],"version":"5.8.3"}
|
|
@@ -1,7 +1,7 @@
|
|
|
1
1
|
{
|
|
2
2
|
"version": 3,
|
|
3
3
|
"sources": ["../../src/form/book-a-demo.ts"],
|
|
4
|
-
"sourcesContent": ["export { };\n// \u2500\u2500\u2500 Types \u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\nconsole.log(\"Book a demo form script loaded\");\n\ntype FormBlockType = \"text\" | \"email\" | \"phone\" | \"checkbox\" | \"radio\" | \"select\" | \"legal\";\ntype RequiredSelection = \"true\" | \"atleast-one\" | \"only-one\";\n\ninterface PulseFormField {\n \"form-block\": FormBlockType;\n \"field-name\": string;\n value: string | string[] | boolean | null;\n required: RequiredSelection | null;\n \"mirror-value\": boolean;\n error: { code: string; message: string } | null;\n}\n\ninterface CalendarEntry {\n type: \"pulse\" | \"industry\";\n name: string;\n \"calender-name\": string;\n \"embed-url\": string;\n}\n\n// \u2500\u2500\u2500 Constants \u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\n\nconst VALID_BLOCK_TYPES: FormBlockType[] = [\n \"text\",\n \"email\",\n \"phone\",\n \"checkbox\",\n \"radio\",\n \"select\",\n \"legal\",\n];\n\nconst CALENDAR_ENTRIES: CalendarEntry[] = [\n {\n type: \"pulse\",\n name: \"pulse\",\n \"calender-name\": \"david\",\n \"embed-url\": \"https://meetings.hubspot.com/valeria-angelini/pulse-valeria-and-alessandra?embed=true\",\n },\n {\n type: \"industry\",\n name: \"Financial Services\",\n \"calender-name\": \"david\",\n \"embed-url\": \"https://meetings.hubspot.com/david-zarate2?embed=true\",\n },\n {\n type: \"industry\",\n name: \"Sports\",\n \"calender-name\": \"steven\",\n \"embed-url\": \"https://meetings.hubspot.com/steven-campos?embed=true\",\n },\n {\n type: \"industry\",\n name: \"Beauty\",\n \"calender-name\": \"albany\",\n \"embed-url\": \"https://meetings.hubspot.com/david-zarate2?embed=true\",\n },\n {\n type: \"industry\",\n name: \"Music\",\n \"calender-name\": \"steven\",\n \"embed-url\": \"https://meetings.hubspot.com/steven-campos?embed=true\",\n },\n {\n type: \"industry\",\n name: \"Customer Packaged Goods\",\n \"calender-name\": \"david\",\n \"embed-url\": \"https://meetings.hubspot.com/david-zarate2?embed=true\",\n },\n {\n type: \"industry\",\n name: \"Other\",\n \"calender-name\": \"david\",\n \"embed-url\": \"https://meetings.hubspot.com/david-zarate2?embed=true\",\n },\n];\n\nconst VALID_REQUIRED_VALUES: RequiredSelection[] = [\n \"true\",\n \"atleast-one\",\n \"only-one\",\n];\n\n// \u2500\u2500\u2500 Error Codes & Messages \u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\n\nconst ERROR_CODES = {\n REQUIRED_INPUT: \"ERR_REQUIRED\",\n REQUIRED_LEGAL: \"ERR_LEGAL_REQUIRED\",\n REQUIRED_SELECT: \"ERR_SELECT_REQUIRED\",\n ATLEAST_ONE: \"ERR_ATLEAST_ONE\",\n ONLY_ONE_NONE: \"ERR_ONLY_ONE_NONE\",\n ONLY_ONE_EXCEEDED: \"ERR_ONLY_ONE_EXCEEDED\",\n INVALID_EMAIL: \"ERR_INVALID_EMAIL\",\n INVALID_PHONE: \"ERR_INVALID_PHONE\",\n PHONE_TOO_SHORT: \"ERR_PHONE_TOO_SHORT\",\n PHONE_TOO_LONG: \"ERR_PHONE_TOO_LONG\",\n PHONE_INVALID_COUNTRY: \"ERR_PHONE_INVALID_COUNTRY\",\n} as const;\n\nconst ERROR_MESSAGES: Record<string, string> = {\n [ERROR_CODES.REQUIRED_INPUT]: \"This field is required.\",\n [ERROR_CODES.REQUIRED_LEGAL]: \"You must accept this to continue.\",\n [ERROR_CODES.REQUIRED_SELECT]: \"Please select an option.\",\n [ERROR_CODES.ATLEAST_ONE]: \"Please select at least one option.\",\n [ERROR_CODES.ONLY_ONE_NONE]: \"Please select one option.\",\n [ERROR_CODES.ONLY_ONE_EXCEEDED]: \"Only one option can be selected.\",\n [ERROR_CODES.INVALID_EMAIL]: \"Please enter a valid email address.\",\n [ERROR_CODES.INVALID_PHONE]: \"Please enter a valid phone number.\",\n [ERROR_CODES.PHONE_TOO_SHORT]: \"Phone number is too short.\",\n [ERROR_CODES.PHONE_TOO_LONG]: \"Phone number is too long.\",\n [ERROR_CODES.PHONE_INVALID_COUNTRY]: \"Invalid country code.\",\n};\n\nconst ERROR_SPAN_CLASS = \"pulse-form-error\";\n\n// \u2500\u2500\u2500 intl-tel-input \u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\n\nconst itiInstances = new Map<HTMLInputElement, any>();\n\nfunction fillCountryCodeInput(iti: any): void {\n try {\n const countryData = iti.getSelectedCountryData?.();\n if (!countryData?.dialCode) return;\n\n const inputs = document.querySelectorAll<HTMLInputElement>(\n 'input[pulse-form-field=\"country-code\"]'\n );\n inputs.forEach((input) => {\n input.value = `+${countryData.dialCode}`;\n });\n } catch (err) {\n console.warn(\"[PulseForm] Error filling country code:\", err);\n }\n}\n\nfunction initIntlTelInput(): void {\n const intlTelInput = (window as any).intlTelInput;\n if (!intlTelInput) {\n console.warn(\n \"[PulseForm] intlTelInput not found on window. \" +\n \"Make sure you include the intl-tel-input script before this script.\\n\" +\n 'e.g. <script src=\"https://cdn.jsdelivr.net/npm/intl-tel-input@25/build/js/intlTelInput.min.js\"></script>'\n );\n return;\n }\n\n const phoneInputs = document.querySelectorAll<HTMLInputElement>(\n '[pulse-form-block=\"phone\"] input[type=\"tel\"]'\n );\n\n phoneInputs.forEach((input) => {\n try {\n const iti = intlTelInput(input, {\n initialCountry: \"us\",\n separateDialCode: true,\n strictMode: false,\n // @ts-ignore \u2014 runtime CDN import, not a TS module\n loadUtils: () => import(\"https://cdn.jsdelivr.net/npm/intl-tel-input@25/build/js/utils.js\"),\n });\n\n itiInstances.set(input, iti);\n\n fillCountryCodeInput(iti);\n\n input.addEventListener(\"countrychange\", () => {\n fillCountryCodeInput(iti);\n });\n\n console.log(\n `[PulseForm] intl-tel-input initialized for \"${input.closest(\"[pulse-form-block]\")?.getAttribute(\"pulse-field-name\") || \"unknown\"}\"`\n );\n } catch (err) {\n console.warn(\"[PulseForm] Failed to init intl-tel-input:\", err);\n }\n });\n}\n\n// \u2500\u2500\u2500 Format Validators \u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\n\nconst PHONE_ITI_ERROR_MAP: Record<number, string> = {\n 0: ERROR_CODES.INVALID_PHONE,\n 1: ERROR_CODES.PHONE_INVALID_COUNTRY,\n 2: ERROR_CODES.PHONE_TOO_SHORT,\n 3: ERROR_CODES.PHONE_TOO_LONG,\n 4: ERROR_CODES.INVALID_PHONE,\n};\n\nfunction validateEmail(value: string): PulseFormField[\"error\"] {\n if (!value) return null;\n const emailRegex = /^[^\\s@]+@[^\\s@]+\\.[^\\s@]+$/;\n if (!emailRegex.test(value)) {\n return { code: ERROR_CODES.INVALID_EMAIL, message: ERROR_MESSAGES[ERROR_CODES.INVALID_EMAIL] };\n }\n return null;\n}\n\nfunction validatePhone(input: HTMLInputElement): PulseFormField[\"error\"] {\n const value = input.value.trim();\n if (!value) return null;\n\n const iti = itiInstances.get(input);\n\n if (iti) {\n try {\n if (iti.isValidNumber()) return null;\n const errorCode: number = iti.getValidationError?.() ?? 0;\n const code = PHONE_ITI_ERROR_MAP[errorCode] || ERROR_CODES.INVALID_PHONE;\n return { code, message: ERROR_MESSAGES[code] };\n } catch {\n return { code: ERROR_CODES.INVALID_PHONE, message: ERROR_MESSAGES[ERROR_CODES.INVALID_PHONE] };\n }\n }\n\n // Fallback: basic digit length\n const digits = value.replace(/\\D/g, \"\");\n if (digits.length < 7)\n return { code: ERROR_CODES.PHONE_TOO_SHORT, message: ERROR_MESSAGES[ERROR_CODES.PHONE_TOO_SHORT] };\n if (digits.length > 15)\n return { code: ERROR_CODES.PHONE_TOO_LONG, message: ERROR_MESSAGES[ERROR_CODES.PHONE_TOO_LONG] };\n return null;\n}\n\n// \u2500\u2500\u2500 Value Extractors \u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\n\nfunction extractTextValue(wrapper: HTMLElement): string | null {\n const input = wrapper.querySelector<HTMLInputElement | HTMLTextAreaElement>(\n \"input, textarea\"\n );\n if (!input) return null;\n return input.value.trim();\n}\n\nfunction extractEmailValue(wrapper: HTMLElement): string | null {\n const input = wrapper.querySelector<HTMLInputElement>('input[type=\"email\"]');\n if (!input) return null;\n return input.value.trim();\n}\n\nfunction extractPhoneValue(wrapper: HTMLElement): string | null {\n const input = wrapper.querySelector<HTMLInputElement>('input[type=\"tel\"]');\n if (!input) return null;\n return input.value.trim();\n}\n\nfunction extractCheckboxValues(wrapper: HTMLElement): string[] {\n const checkboxes = wrapper.querySelectorAll<HTMLInputElement>(\n 'input[type=\"checkbox\"]'\n );\n const values: string[] = [];\n checkboxes.forEach((cb) => {\n if (cb.checked) {\n const name = cb.getAttribute(\"data-name\")?.trim();\n values.push(name || cb.value || \"on\");\n }\n });\n return values;\n}\n\nfunction extractRadioValue(wrapper: HTMLElement): string | null {\n const radios = wrapper.querySelectorAll<HTMLInputElement>(\n 'input[type=\"radio\"]'\n );\n for (const radio of radios) {\n if (radio.checked) {\n const label = radio.closest(\"label\")?.textContent?.trim();\n return label || radio.value || \"on\";\n }\n }\n return null;\n}\n\nfunction extractSelectValue(wrapper: HTMLElement): string | null {\n const select = wrapper.querySelector<HTMLSelectElement>(\"select\");\n if (!select) return null;\n const val = select.value.trim();\n if (!val || select.selectedIndex === 0) return null;\n return val;\n}\n\nfunction extractLegalValue(wrapper: HTMLElement): boolean {\n const checkbox = wrapper.querySelector<HTMLInputElement>(\n 'input[type=\"checkbox\"]'\n );\n if (!checkbox) return false;\n return checkbox.checked;\n}\n\n// \u2500\u2500\u2500 Core Parser \u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\n\nfunction extractValue(\n type: FormBlockType,\n wrapper: HTMLElement\n): PulseFormField[\"value\"] {\n switch (type) {\n case \"text\":\n return extractTextValue(wrapper);\n case \"email\":\n return extractEmailValue(wrapper);\n case \"phone\":\n return extractPhoneValue(wrapper);\n case \"checkbox\":\n return extractCheckboxValues(wrapper);\n case \"radio\":\n return extractRadioValue(wrapper);\n case \"select\":\n return extractSelectValue(wrapper);\n case \"legal\":\n return extractLegalValue(wrapper);\n default:\n return null;\n }\n}\n\nfunction parseRequired(wrapper: HTMLElement): RequiredSelection | null {\n const raw = wrapper.getAttribute(\"required-selection\")?.trim().toLowerCase();\n if (!raw || !VALID_REQUIRED_VALUES.includes(raw as RequiredSelection))\n return null;\n return raw as RequiredSelection;\n}\n\nfunction parseMirrorValue(wrapper: HTMLElement): boolean {\n return wrapper.getAttribute(\"mirror-value\")?.trim().toLowerCase() === \"true\";\n}\n\n// \u2500\u2500\u2500 Validation Logic (per field) \u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\n\nfunction getFieldError(\n type: FormBlockType,\n required: RequiredSelection | null,\n value: PulseFormField[\"value\"],\n wrapper: HTMLElement\n): PulseFormField[\"error\"] {\n // 1. Required checks\n if (required) {\n switch (required) {\n case \"true\": {\n if (type === \"legal\" && value !== true)\n return { code: ERROR_CODES.REQUIRED_LEGAL, message: ERROR_MESSAGES[ERROR_CODES.REQUIRED_LEGAL] };\n if (type === \"select\" && !value)\n return { code: ERROR_CODES.REQUIRED_SELECT, message: ERROR_MESSAGES[ERROR_CODES.REQUIRED_SELECT] };\n if (\n (type === \"text\" || type === \"email\" || type === \"phone\") &&\n (!value || (typeof value === \"string\" && value === \"\"))\n )\n return { code: ERROR_CODES.REQUIRED_INPUT, message: ERROR_MESSAGES[ERROR_CODES.REQUIRED_INPUT] };\n break;\n }\n\n case \"atleast-one\": {\n const empty = Array.isArray(value) ? value.length === 0 : !value;\n if (empty)\n return { code: ERROR_CODES.ATLEAST_ONE, message: ERROR_MESSAGES[ERROR_CODES.ATLEAST_ONE] };\n break;\n }\n\n case \"only-one\": {\n if (Array.isArray(value)) {\n if (value.length === 0)\n return { code: ERROR_CODES.ONLY_ONE_NONE, message: ERROR_MESSAGES[ERROR_CODES.ONLY_ONE_NONE] };\n if (value.length > 1)\n return { code: ERROR_CODES.ONLY_ONE_EXCEEDED, message: ERROR_MESSAGES[ERROR_CODES.ONLY_ONE_EXCEEDED] };\n } else if (!value) {\n return { code: ERROR_CODES.ONLY_ONE_NONE, message: ERROR_MESSAGES[ERROR_CODES.ONLY_ONE_NONE] };\n }\n break;\n }\n }\n }\n\n // 2. Format checks (only when there's a value)\n if (type === \"email\" && typeof value === \"string\" && value) {\n const emailError = validateEmail(value);\n if (emailError) return emailError;\n }\n\n if (type === \"phone\" && typeof value === \"string\" && value) {\n const phoneInput = wrapper.querySelector<HTMLInputElement>('input[type=\"tel\"]');\n if (phoneInput) {\n const phoneError = validatePhone(phoneInput);\n if (phoneError) return phoneError;\n }\n }\n\n return null;\n}\n\n// \u2500\u2500\u2500 Collect Fields \u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\n\nfunction collectFormFields(withValidation: boolean): PulseFormField[] {\n const wrappers = document.querySelectorAll<HTMLElement>(\"[pulse-form-block]\");\n const fields: PulseFormField[] = [];\n\n wrappers.forEach((wrapper) => {\n const rawType = wrapper\n .getAttribute(\"pulse-form-block\")\n ?.trim()\n .toLowerCase();\n\n if (!rawType || !VALID_BLOCK_TYPES.includes(rawType as FormBlockType))\n return;\n\n const blockType = rawType as FormBlockType;\n const fieldName = wrapper.getAttribute(\"pulse-field-name\")?.trim();\n if (!fieldName) return;\n\n const required = parseRequired(wrapper);\n const mirrorValue = parseMirrorValue(wrapper);\n const value = extractValue(blockType, wrapper);\n const error = withValidation\n ? getFieldError(blockType, required, value, wrapper)\n : null;\n\n fields.push({\n \"form-block\": blockType,\n \"field-name\": fieldName,\n value,\n required,\n \"mirror-value\": mirrorValue,\n error,\n });\n });\n\n return fields;\n}\n\n// \u2500\u2500\u2500 Error UI \u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\n\nfunction clearAllErrors(): void {\n document\n .querySelectorAll<HTMLElement>(`.${ERROR_SPAN_CLASS}`)\n .forEach((el) => el.remove());\n\n document\n .querySelectorAll<HTMLElement>(\"[pulse-form-block]\")\n .forEach((el) => el.classList.remove(\"has-error\"));\n}\n\nfunction clearErrorOnWrapper(wrapper: HTMLElement): void {\n const span = wrapper.querySelector(`.${ERROR_SPAN_CLASS}`);\n if (span) span.remove();\n wrapper.classList.remove(\"has-error\");\n}\n\nfunction showErrorOnWrapper(\n wrapper: HTMLElement,\n error: { code: string; message: string }\n): void {\n const existing = wrapper.querySelector(`.${ERROR_SPAN_CLASS}`);\n if (existing) existing.remove();\n\n const span = document.createElement(\"span\");\n span.className = ERROR_SPAN_CLASS;\n span.textContent = error.message;\n span.setAttribute(\"data-error-code\", error.code);\n span.setAttribute(\n \"data-field-name\",\n wrapper.getAttribute(\"pulse-field-name\")?.trim() || \"\"\n );\n\n wrapper.classList.add(\"has-error\");\n wrapper.appendChild(span);\n}\n\nfunction renderErrors(fields: PulseFormField[]): void {\n clearAllErrors();\n\n const wrappers = document.querySelectorAll<HTMLElement>(\"[pulse-form-block]\");\n\n wrappers.forEach((wrapper) => {\n const fieldName = wrapper.getAttribute(\"pulse-field-name\")?.trim();\n if (!fieldName) return;\n\n const field = fields.find((f) => f[\"field-name\"] === fieldName);\n if (!field || !field.error) return;\n\n showErrorOnWrapper(wrapper, field.error);\n });\n}\n\nfunction focusFirstError(): void {\n const first = document.querySelector<HTMLElement>(\n `[pulse-form-block].has-error`\n );\n if (!first) return;\n\n first.scrollIntoView({ behavior: \"smooth\", block: \"center\" });\n\n const focusable = first.querySelector<HTMLElement>(\n \"input, textarea, select\"\n );\n if (focusable) setTimeout(() => focusable.focus(), 400);\n}\n\n// \u2500\u2500\u2500 Mirror Value Fill \u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\n\nfunction fillMirrorValues(): void {\n // 1. Get all fields with mirror-value true\n const mirrorFields = _currentFields.filter((f) => f[\"mirror-value\"] === true);\n if (mirrorFields.length === 0) return;\n\n // 2. Select all mirror target elements\n const mirrorTargets = document.querySelectorAll<HTMLElement>(\"[pulse-form-block-mirror]\");\n\n // 3. For each mirror field, find matching target and fill\n mirrorFields.forEach((field) => {\n const fieldName = field[\"field-name\"];\n let found = false;\n\n mirrorTargets.forEach((target) => {\n const mirrorAttr = target.getAttribute(\"pulse-form-block-mirror\")?.trim();\n if (mirrorAttr !== fieldName) return;\n\n found = true;\n\n // Find the input inside the mirror target and fill it\n const input = target.querySelector<HTMLInputElement | HTMLTextAreaElement | HTMLSelectElement>(\n \"input, textarea, select\"\n );\n\n if (!input) {\n console.warn(\n `[PulseForm] Mirror target for \"${fieldName}\" found, but no input element inside it.`\n );\n return;\n }\n\n // Set value based on type\n const value = field.value;\n if (typeof value === \"string\") {\n input.value = value;\n } else if (typeof value === \"boolean\") {\n if (input instanceof HTMLInputElement && input.type === \"checkbox\") {\n input.checked = value;\n } else {\n input.value = String(value);\n }\n } else if (Array.isArray(value)) {\n input.value = value.join(\", \");\n } else {\n input.value = \"\";\n }\n });\n\n if (!found) {\n console.warn(\n `[PulseForm] No mirror target found for field \"${fieldName}\". ` +\n `Add an element with attribute pulse-form-block-mirror=\"${fieldName}\" to mirror this value.`\n );\n }\n });\n}\n\n\nfunction loadCalendarEmbed(): void {\n const container = document.querySelector<HTMLElement>(\"[hs-calender-block]\");\n if (!container) {\n console.warn(\"[PulseForm] No element with attribute 'hs-calender-block' found.\");\n return;\n }\n\n // Determine which entry to use based on flow-type\n const flowField = _currentFields.find((f) => f[\"field-name\"] === \"flow-type\");\n const flowValue = flowField?.value;\n\n let entry: CalendarEntry | undefined;\n\n if (flowValue === \"Pulse demo\") {\n // Use the pulse entry\n entry = CALENDAR_ENTRIES.find((e) => e.type === \"pulse\");\n } else if (flowValue === \"White Glove services\") {\n // Use the industry entry based on selected industry\n const industryField = _currentFields.find((f) => f[\"field-name\"] === \"industry\");\n const industryValue = industryField?.value;\n\n if (typeof industryValue === \"string\" && industryValue) {\n entry = CALENDAR_ENTRIES.find(\n (e) => e.type === \"industry\" && e.name.toLowerCase() === industryValue.toLowerCase()\n );\n }\n }\n\n if (!entry) {\n // Fallback to \"Other\"\n entry = CALENDAR_ENTRIES.find((e) => e.type === \"industry\" && e.name === \"Other\");\n }\n\n if (!entry) {\n console.warn(\"[PulseForm] No matching calendar entry found.\");\n return;\n }\n\n // Clear existing content\n container.innerHTML = \"\";\n\n // Add the HubSpot meetings embed\n const meetingsDiv = document.createElement(\"div\");\n meetingsDiv.className = \"meetings-iframe-container\";\n meetingsDiv.setAttribute(\"data-src\", entry[\"embed-url\"]);\n container.appendChild(meetingsDiv);\n\n // Load the HubSpot embed script\n const script = document.createElement(\"script\");\n script.type = \"text/javascript\";\n script.src = \"https://static.hsappstatic.net/MeetingsEmbed/ex/MeetingsEmbedCode.js\";\n container.appendChild(script);\n\n console.log(`[PulseForm] Loaded calendar: ${entry[\"calender-name\"]} (${entry.name})`);\n}\n\nfunction updateFlowType(): void {\n // 1. Get the value of field-name=\"flow-type\" from the JSON\n const flowField = _currentFields.find((f) => f[\"field-name\"] === \"flow-type\");\n if (!flowField) return;\n\n const flowValue = flowField.value;\n\n // 2. Select all elements with attribute \"form-flow\"\n const flowElements = document.querySelectorAll<HTMLElement>(\"[form-flow]\");\n\n // 3. Set form-flow-active based on matching value\n flowElements.forEach((el) => {\n const elFlowValue = el.getAttribute(\"form-flow\")?.trim();\n if (elFlowValue === flowValue) {\n el.setAttribute(\"form-flow-active\", \"true\");\n } else {\n el.setAttribute(\"form-flow-active\", \"false\");\n }\n });\n\n}\n\n// \u2500\u2500\u2500 Conditional Required \u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\n\nfunction updateConditionalRequired(): void {\n const flowField = _currentFields.find((f) => f[\"field-name\"] === \"flow-type\");\n if (!flowField) return;\n\n const flowValue = flowField.value;\n\n // Reset both fields to not required first\n const industryIdx = _currentFields.findIndex((f) => f[\"field-name\"] === \"industry\");\n const lookingForIdx = _currentFields.findIndex((f) => f[\"field-name\"] === \"what-are-you-looking-for\");\n\n if (industryIdx !== -1) {\n _currentFields[industryIdx] = { ..._currentFields[industryIdx], required: null };\n }\n if (lookingForIdx !== -1) {\n _currentFields[lookingForIdx] = { ..._currentFields[lookingForIdx], required: null };\n }\n\n // Set required based on flow-type value\n if (flowValue === \"White Glove services\" && industryIdx !== -1) {\n _currentFields[industryIdx] = { ..._currentFields[industryIdx], required: \"true\" };\n } else if (flowValue === \"Pulse demo\" && lookingForIdx !== -1) {\n _currentFields[lookingForIdx] = { ..._currentFields[lookingForIdx], required: \"atleast-one\" };\n }\n\n (window as any).PulseFormData = _currentFields;\n}\n\n// \u2500\u2500\u2500 Reactive State \u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\n\nlet _currentFields: PulseFormField[] = [];\n\nfunction updateFieldInState(\n fieldName: string,\n value: PulseFormField[\"value\"],\n error: PulseFormField[\"error\"]\n): void {\n const idx = _currentFields.findIndex((f) => f[\"field-name\"] === fieldName);\n if (idx === -1) return;\n _currentFields[idx] = { ..._currentFields[idx], value, error };\n (window as any).PulseFormData = _currentFields;\n updateConditionalRequired();\n fillMirrorValues();\n updateFlowType();\n}\n\nfunction handleFieldChange(wrapper: HTMLElement): void {\n const rawType = wrapper\n .getAttribute(\"pulse-form-block\")\n ?.trim()\n .toLowerCase() as FormBlockType;\n const fieldName = wrapper.getAttribute(\"pulse-field-name\")?.trim();\n if (!fieldName) return;\n\n const required = parseRequired(wrapper);\n const value = extractValue(rawType, wrapper);\n const hasError = wrapper.classList.contains(\"has-error\");\n\n if (hasError) {\n const error = getFieldError(rawType, required, value, wrapper);\n if (!error) {\n clearErrorOnWrapper(wrapper);\n updateFieldInState(fieldName, value, null);\n } else {\n showErrorOnWrapper(wrapper, error);\n updateFieldInState(fieldName, value, error);\n }\n } else {\n updateFieldInState(fieldName, value, null);\n }\n}\n\nfunction bindChangeListeners(): void {\n const wrappers = document.querySelectorAll<HTMLElement>(\"[pulse-form-block]\");\n\n wrappers.forEach((wrapper) => {\n const type = wrapper\n .getAttribute(\"pulse-form-block\")\n ?.trim()\n .toLowerCase() as FormBlockType | undefined;\n\n if (!type || !VALID_BLOCK_TYPES.includes(type)) return;\n\n const onChange = () => handleFieldChange(wrapper);\n\n switch (type) {\n case \"text\":\n case \"email\": {\n const input = wrapper.querySelector<HTMLInputElement | HTMLTextAreaElement>(\n \"input, textarea\"\n );\n if (input) {\n input.addEventListener(\"input\", onChange);\n input.addEventListener(\"change\", onChange);\n }\n break;\n }\n\n case \"phone\": {\n const phoneInput = wrapper.querySelector<HTMLInputElement>('input[type=\"tel\"]');\n if (phoneInput) {\n phoneInput.addEventListener(\"input\", onChange);\n phoneInput.addEventListener(\"change\", onChange);\n phoneInput.addEventListener(\"keyup\", onChange);\n phoneInput.addEventListener(\"countrychange\", onChange);\n }\n break;\n }\n\n case \"checkbox\":\n case \"legal\": {\n wrapper\n .querySelectorAll<HTMLInputElement>('input[type=\"checkbox\"]')\n .forEach((cb) => cb.addEventListener(\"change\", onChange));\n break;\n }\n\n case \"radio\": {\n wrapper\n .querySelectorAll<HTMLInputElement>('input[type=\"radio\"]')\n .forEach((r) => r.addEventListener(\"change\", onChange));\n break;\n }\n\n case \"select\": {\n const select = wrapper.querySelector<HTMLSelectElement>(\"select\");\n if (select) select.addEventListener(\"change\", onChange);\n break;\n }\n }\n });\n}\n\n// \u2500\u2500\u2500 Public API \u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\n\nconst PulseForm = {\n get fields(): PulseFormField[] {\n return _currentFields;\n },\n\n refresh(): PulseFormField[] {\n _currentFields = collectFormFields(false);\n (window as any).PulseFormData = _currentFields;\n updateConditionalRequired();\n fillMirrorValues();\n updateFlowType();\n return _currentFields;\n },\n\n validate(): { fields: PulseFormField[]; isValid: boolean } {\n const fields = collectFormFields(true);\n\n _currentFields = fields;\n (window as any).PulseFormData = _currentFields;\n updateConditionalRequired();\n\n // Re-validate fields whose required was changed by updateConditionalRequired\n const wrappers = document.querySelectorAll<HTMLElement>(\"[pulse-form-block]\");\n _currentFields.forEach((field, idx) => {\n const wrapper = Array.from(wrappers).find(\n (w) => w.getAttribute(\"pulse-field-name\")?.trim() === field[\"field-name\"]\n );\n if (!wrapper) return;\n const error = getFieldError(\n field[\"form-block\"],\n field.required,\n field.value,\n wrapper\n );\n _currentFields[idx] = { ..._currentFields[idx], error };\n });\n\n (window as any).PulseFormData = _currentFields;\n const isValid = _currentFields.every((f) => f.error === null);\n\n fillMirrorValues();\n updateFlowType();\n\n renderErrors(_currentFields);\n if (!isValid) focusFirstError();\n\n return { fields: _currentFields, isValid };\n },\n\n clearErrors(): void {\n clearAllErrors();\n _currentFields = _currentFields.map((f) => ({ ...f, error: null }));\n (window as any).PulseFormData = _currentFields;\n updateConditionalRequired();\n fillMirrorValues();\n updateFlowType();\n },\n\n ERROR_CODES,\n ERROR_MESSAGES,\n};\n\n// \u2500\u2500\u2500 Initialize on DOM Ready \u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\n\ndocument.addEventListener(\"DOMContentLoaded\", () => {\n const count = document.querySelectorAll(\"[pulse-form-block]\").length;\n console.log(`[PulseForm] Initialized \u2014 found ${count} form blocks.`);\n\n initIntlTelInput();\n\n _currentFields = collectFormFields(false);\n (window as any).PulseFormData = _currentFields;\n updateConditionalRequired();\n fillMirrorValues();\n updateFlowType();\n\n bindChangeListeners();\n\n // \u2500\u2500\u2500 Submit Button \u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\n const triggerBtn = document.getElementById(\"trigger-webflow-form-submit\");\n if (triggerBtn) {\n triggerBtn.addEventListener(\"click\", (e) => {\n e.preventDefault();\n const { isValid } = PulseForm.validate();\n if (!isValid) return;\n\n\n\n // Change button text\n const originalText = triggerBtn.textContent;\n triggerBtn.textContent = \"Submitting...\";\n\n // Load the calendar embed BEFORE submitting\n loadCalendarEmbed();\n\n const submitBtn = document.getElementById(\"webflow-form-submit\") as HTMLButtonElement | null;\n if (submitBtn) {\n submitBtn.click();\n } else {\n console.warn('[PulseForm] Button with id \"webflow-form-submit\" not found.');\n }\n\n const hubspotBtn = document.getElementById(\"hubspot-form-submit\") as HTMLButtonElement | null;\n if (hubspotBtn) {\n hubspotBtn.click();\n } else {\n console.warn('[PulseForm] Button with id \"hubspot-form-submit\" not found.');\n }\n\n setTimeout(() => {\n document.getElementById(\"form-anchor\")?.scrollIntoView({ behavior: \"smooth\", block: \"start\" });\n }, 700);\n });\n }\n\n (window as any).PulseForm = PulseForm;\n});\n\n// \u2500\u2500\u2500 \u26A0\uFE0F DEV ONLY \u2014 Remove or disable in production \u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\n\nfunction devAutoFill(): void {\n const firstNames = [\"Jordan\", \"Morgan\", \"Riley\", \"Avery\", \"Quinn\", \"Casey\", \"Blake\", \"Harper\", \"Sage\", \"Rowan\"];\n const lastNames = [\"Nakamura\", \"Lindqvist\", \"Okafor\", \"Brennan\", \"Castellano\", \"Pham\", \"Eriksen\", \"Moreira\", \"Ashworth\", \"Dubois\"];\n const domains = [\"inbox.co\", \"mailbox.org\", \"zipmail.net\", \"postly.io\", \"demobox.dev\"];\n\n const pick = (arr: string[]) => arr[Math.floor(Math.random() * arr.length)];\n const rand = () => Math.random().toString(36).substring(2, 8);\n\n const firstName = pick(firstNames);\n const lastName = pick(lastNames);\n const email = `${firstName.toLowerCase()}.${rand()}@${pick(domains)}`;\n const phone = `${2000000000 + Math.floor(Math.random() * 8000000000)}`;\n\n const fieldMap: Record<string, string> = {\n \"first-name\": firstName,\n \"last-name\": lastName,\n \"email\": email,\n \"phone\": phone,\n \"anything-else\": \"Ignore this is a test form submission\",\n };\n\n Object.entries(fieldMap).forEach(([fieldName, value]) => {\n const wrapper = document.querySelector<HTMLElement>(\n `[pulse-field-name=\"${fieldName}\"]`\n );\n if (!wrapper) return;\n\n if (fieldName === \"phone\") {\n const phoneInput = wrapper.querySelector<HTMLInputElement>('input[type=\"tel\"]');\n if (!phoneInput) return;\n const iti = itiInstances.get(phoneInput);\n if (iti) {\n iti.setNumber(`+1${value}`);\n } else {\n phoneInput.value = value;\n }\n phoneInput.dispatchEvent(new Event(\"input\", { bubbles: true }));\n phoneInput.dispatchEvent(new Event(\"change\", { bubbles: true }));\n phoneInput.dispatchEvent(new Event(\"keyup\", { bubbles: true }));\n return;\n }\n\n const el = fieldName === \"anything-else\"\n ? wrapper.querySelector<HTMLTextAreaElement>(\"textarea\")\n : wrapper.querySelector<HTMLInputElement>(\"input\");\n if (!el) return;\n\n el.value = value;\n el.dispatchEvent(new Event(\"input\", { bubbles: true }));\n el.dispatchEvent(new Event(\"change\", { bubbles: true }));\n });\n\n console.log(\"[PulseForm][DEV] Auto-filled:\", fieldMap);\n}\n\nsetTimeout(devAutoFill, 500);\n// \u2500\u2500\u2500 \u26A0\uFE0F END DEV ONLY \u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500"],
|
|
5
|
-
"mappings": "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",
|
|
4
|
+
"sourcesContent": ["export { };\n// \u2500\u2500\u2500 Types \u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\nconsole.log(\"Book a demo form script loaded\");\n\ntype FormBlockType = \"text\" | \"email\" | \"phone\" | \"checkbox\" | \"radio\" | \"select\" | \"legal\";\ntype RequiredSelection = \"true\" | \"atleast-one\" | \"only-one\";\n\ninterface PulseFormField {\n \"form-block\": FormBlockType;\n \"field-name\": string;\n value: string | string[] | boolean | null;\n required: RequiredSelection | null;\n \"mirror-value\": boolean;\n error: { code: string; message: string } | null;\n}\n\ninterface CalendarEntry {\n type: \"pulse\" | \"industry\";\n name: string;\n \"calender-name\": string;\n \"embed-url\": string;\n}\n\n// \u2500\u2500\u2500 Constants \u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\n\nconst VALID_BLOCK_TYPES: FormBlockType[] = [\n \"text\",\n \"email\",\n \"phone\",\n \"checkbox\",\n \"radio\",\n \"select\",\n \"legal\",\n];\n\nconst CALENDAR_ENTRIES: CalendarEntry[] = [\n {\n type: \"pulse\",\n name: \"pulse\",\n \"calender-name\": \"david\",\n \"embed-url\": \"https://meetings.hubspot.com/valeria-angelini/pulse-valeria-and-alessandra?embed=true\",\n },\n {\n type: \"industry\",\n name: \"Financial Services\",\n \"calender-name\": \"david\",\n \"embed-url\": \"https://meetings.hubspot.com/david-zarate2?embed=true\",\n },\n {\n type: \"industry\",\n name: \"Sports\",\n \"calender-name\": \"steven\",\n \"embed-url\": \"https://meetings.hubspot.com/steven-campos?embed=true\",\n },\n {\n type: \"industry\",\n name: \"Beauty\",\n \"calender-name\": \"albany\",\n \"embed-url\": \"https://meetings.hubspot.com/david-zarate2?embed=true\",\n },\n {\n type: \"industry\",\n name: \"Music\",\n \"calender-name\": \"steven\",\n \"embed-url\": \"https://meetings.hubspot.com/steven-campos?embed=true\",\n },\n {\n type: \"industry\",\n name: \"Customer Packaged Goods\",\n \"calender-name\": \"david\",\n \"embed-url\": \"https://meetings.hubspot.com/david-zarate2?embed=true\",\n },\n {\n type: \"industry\",\n name: \"Other\",\n \"calender-name\": \"david\",\n \"embed-url\": \"https://meetings.hubspot.com/david-zarate2?embed=true\",\n },\n];\n\nconst VALID_REQUIRED_VALUES: RequiredSelection[] = [\n \"true\",\n \"atleast-one\",\n \"only-one\",\n];\n\n// \u2500\u2500\u2500 Error Codes & Messages \u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\n\nconst ERROR_CODES = {\n REQUIRED_INPUT: \"ERR_REQUIRED\",\n REQUIRED_LEGAL: \"ERR_LEGAL_REQUIRED\",\n REQUIRED_SELECT: \"ERR_SELECT_REQUIRED\",\n ATLEAST_ONE: \"ERR_ATLEAST_ONE\",\n ONLY_ONE_NONE: \"ERR_ONLY_ONE_NONE\",\n ONLY_ONE_EXCEEDED: \"ERR_ONLY_ONE_EXCEEDED\",\n INVALID_EMAIL: \"ERR_INVALID_EMAIL\",\n INVALID_PHONE: \"ERR_INVALID_PHONE\",\n PHONE_TOO_SHORT: \"ERR_PHONE_TOO_SHORT\",\n PHONE_TOO_LONG: \"ERR_PHONE_TOO_LONG\",\n PHONE_INVALID_COUNTRY: \"ERR_PHONE_INVALID_COUNTRY\",\n} as const;\n\nconst ERROR_MESSAGES: Record<string, string> = {\n [ERROR_CODES.REQUIRED_INPUT]: \"This field is required.\",\n [ERROR_CODES.REQUIRED_LEGAL]: \"You must accept this to continue.\",\n [ERROR_CODES.REQUIRED_SELECT]: \"Please select an option.\",\n [ERROR_CODES.ATLEAST_ONE]: \"Please select at least one option.\",\n [ERROR_CODES.ONLY_ONE_NONE]: \"Please select one option.\",\n [ERROR_CODES.ONLY_ONE_EXCEEDED]: \"Only one option can be selected.\",\n [ERROR_CODES.INVALID_EMAIL]: \"Please enter a valid email address.\",\n [ERROR_CODES.INVALID_PHONE]: \"Please enter a valid phone number.\",\n [ERROR_CODES.PHONE_TOO_SHORT]: \"Phone number is too short.\",\n [ERROR_CODES.PHONE_TOO_LONG]: \"Phone number is too long.\",\n [ERROR_CODES.PHONE_INVALID_COUNTRY]: \"Invalid country code.\",\n};\n\nconst ERROR_SPAN_CLASS = \"pulse-form-error\";\n\n// \u2500\u2500\u2500 intl-tel-input \u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\n\nconst itiInstances = new Map<HTMLInputElement, any>();\n\nfunction fillCountryCodeInput(iti: any): void {\n try {\n const countryData = iti.getSelectedCountryData?.();\n if (!countryData?.dialCode) return;\n\n const inputs = document.querySelectorAll<HTMLInputElement>(\n 'input[pulse-form-field=\"country-code\"]'\n );\n inputs.forEach((input) => {\n input.value = `+${countryData.dialCode}`;\n });\n } catch (err) {\n console.warn(\"[PulseForm] Error filling country code:\", err);\n }\n}\n\nfunction initIntlTelInput(): void {\n const intlTelInput = (window as any).intlTelInput;\n if (!intlTelInput) {\n console.warn(\n \"[PulseForm] intlTelInput not found on window. \" +\n \"Make sure you include the intl-tel-input script before this script.\\n\" +\n 'e.g. <script src=\"https://cdn.jsdelivr.net/npm/intl-tel-input@25/build/js/intlTelInput.min.js\"></script>'\n );\n return;\n }\n\n const phoneInputs = document.querySelectorAll<HTMLInputElement>(\n '[pulse-form-block=\"phone\"] input[type=\"tel\"]'\n );\n\n phoneInputs.forEach((input) => {\n try {\n const iti = intlTelInput(input, {\n initialCountry: \"us\",\n separateDialCode: true,\n strictMode: false,\n // @ts-ignore \u2014 runtime CDN import, not a TS module\n loadUtils: () => import(\"https://cdn.jsdelivr.net/npm/intl-tel-input@25/build/js/utils.js\"),\n });\n\n itiInstances.set(input, iti);\n\n fillCountryCodeInput(iti);\n\n input.addEventListener(\"countrychange\", () => {\n fillCountryCodeInput(iti);\n });\n\n console.log(\n `[PulseForm] intl-tel-input initialized for \"${input.closest(\"[pulse-form-block]\")?.getAttribute(\"pulse-field-name\") || \"unknown\"}\"`\n );\n } catch (err) {\n console.warn(\"[PulseForm] Failed to init intl-tel-input:\", err);\n }\n });\n}\n\n// \u2500\u2500\u2500 Format Validators \u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\n\nconst PHONE_ITI_ERROR_MAP: Record<number, string> = {\n 0: ERROR_CODES.INVALID_PHONE,\n 1: ERROR_CODES.PHONE_INVALID_COUNTRY,\n 2: ERROR_CODES.PHONE_TOO_SHORT,\n 3: ERROR_CODES.PHONE_TOO_LONG,\n 4: ERROR_CODES.INVALID_PHONE,\n};\n\nfunction validateEmail(value: string): PulseFormField[\"error\"] {\n if (!value) return null;\n const emailRegex = /^[^\\s@]+@[^\\s@]+\\.[^\\s@]+$/;\n if (!emailRegex.test(value)) {\n return { code: ERROR_CODES.INVALID_EMAIL, message: ERROR_MESSAGES[ERROR_CODES.INVALID_EMAIL] };\n }\n return null;\n}\n\nfunction validatePhone(input: HTMLInputElement): PulseFormField[\"error\"] {\n const value = input.value.trim();\n if (!value) return null;\n\n const iti = itiInstances.get(input);\n\n if (iti) {\n try {\n if (iti.isValidNumber()) return null;\n const errorCode: number = iti.getValidationError?.() ?? 0;\n const code = PHONE_ITI_ERROR_MAP[errorCode] || ERROR_CODES.INVALID_PHONE;\n return { code, message: ERROR_MESSAGES[code] };\n } catch {\n return { code: ERROR_CODES.INVALID_PHONE, message: ERROR_MESSAGES[ERROR_CODES.INVALID_PHONE] };\n }\n }\n\n // Fallback: basic digit length\n const digits = value.replace(/\\D/g, \"\");\n if (digits.length < 7)\n return { code: ERROR_CODES.PHONE_TOO_SHORT, message: ERROR_MESSAGES[ERROR_CODES.PHONE_TOO_SHORT] };\n if (digits.length > 15)\n return { code: ERROR_CODES.PHONE_TOO_LONG, message: ERROR_MESSAGES[ERROR_CODES.PHONE_TOO_LONG] };\n return null;\n}\n\n// \u2500\u2500\u2500 Value Extractors \u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\n\nfunction extractTextValue(wrapper: HTMLElement): string | null {\n const input = wrapper.querySelector<HTMLInputElement | HTMLTextAreaElement>(\n \"input, textarea\"\n );\n if (!input) return null;\n return input.value.trim();\n}\n\nfunction extractEmailValue(wrapper: HTMLElement): string | null {\n const input = wrapper.querySelector<HTMLInputElement>('input[type=\"email\"]');\n if (!input) return null;\n return input.value.trim();\n}\n\nfunction extractPhoneValue(wrapper: HTMLElement): string | null {\n const input = wrapper.querySelector<HTMLInputElement>('input[type=\"tel\"]');\n if (!input) return null;\n return input.value.trim();\n}\n\nfunction extractCheckboxValues(wrapper: HTMLElement): string[] {\n const checkboxes = wrapper.querySelectorAll<HTMLInputElement>(\n 'input[type=\"checkbox\"]'\n );\n const values: string[] = [];\n checkboxes.forEach((cb) => {\n if (cb.checked) {\n const name = cb.getAttribute(\"data-name\")?.trim();\n values.push(name || cb.value || \"on\");\n }\n });\n return values;\n}\n\nfunction extractRadioValue(wrapper: HTMLElement): string | null {\n const radios = wrapper.querySelectorAll<HTMLInputElement>(\n 'input[type=\"radio\"]'\n );\n for (const radio of radios) {\n if (radio.checked) {\n const label = radio.closest(\"label\")?.textContent?.trim();\n return label || radio.value || \"on\";\n }\n }\n return null;\n}\n\nfunction extractSelectValue(wrapper: HTMLElement): string | null {\n const select = wrapper.querySelector<HTMLSelectElement>(\"select\");\n if (!select) return null;\n const val = select.value.trim();\n if (!val || select.selectedIndex === 0) return null;\n return val;\n}\n\nfunction extractLegalValue(wrapper: HTMLElement): boolean {\n const checkbox = wrapper.querySelector<HTMLInputElement>(\n 'input[type=\"checkbox\"]'\n );\n if (!checkbox) return false;\n return checkbox.checked;\n}\n\n// \u2500\u2500\u2500 Core Parser \u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\n\nfunction extractValue(\n type: FormBlockType,\n wrapper: HTMLElement\n): PulseFormField[\"value\"] {\n switch (type) {\n case \"text\":\n return extractTextValue(wrapper);\n case \"email\":\n return extractEmailValue(wrapper);\n case \"phone\":\n return extractPhoneValue(wrapper);\n case \"checkbox\":\n return extractCheckboxValues(wrapper);\n case \"radio\":\n return extractRadioValue(wrapper);\n case \"select\":\n return extractSelectValue(wrapper);\n case \"legal\":\n return extractLegalValue(wrapper);\n default:\n return null;\n }\n}\n\nfunction parseRequired(wrapper: HTMLElement): RequiredSelection | null {\n const raw = wrapper.getAttribute(\"required-selection\")?.trim().toLowerCase();\n if (!raw || !VALID_REQUIRED_VALUES.includes(raw as RequiredSelection))\n return null;\n return raw as RequiredSelection;\n}\n\nfunction parseMirrorValue(wrapper: HTMLElement): boolean {\n return wrapper.getAttribute(\"mirror-value\")?.trim().toLowerCase() === \"true\";\n}\n\n// \u2500\u2500\u2500 Validation Logic (per field) \u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\n\nfunction getFieldError(\n type: FormBlockType,\n required: RequiredSelection | null,\n value: PulseFormField[\"value\"],\n wrapper: HTMLElement\n): PulseFormField[\"error\"] {\n // 1. Required checks\n if (required) {\n switch (required) {\n case \"true\": {\n if (type === \"legal\" && value !== true)\n return { code: ERROR_CODES.REQUIRED_LEGAL, message: ERROR_MESSAGES[ERROR_CODES.REQUIRED_LEGAL] };\n if (type === \"select\" && !value)\n return { code: ERROR_CODES.REQUIRED_SELECT, message: ERROR_MESSAGES[ERROR_CODES.REQUIRED_SELECT] };\n if (\n (type === \"text\" || type === \"email\" || type === \"phone\") &&\n (!value || (typeof value === \"string\" && value === \"\"))\n )\n return { code: ERROR_CODES.REQUIRED_INPUT, message: ERROR_MESSAGES[ERROR_CODES.REQUIRED_INPUT] };\n break;\n }\n\n case \"atleast-one\": {\n const empty = Array.isArray(value) ? value.length === 0 : !value;\n if (empty)\n return { code: ERROR_CODES.ATLEAST_ONE, message: ERROR_MESSAGES[ERROR_CODES.ATLEAST_ONE] };\n break;\n }\n\n case \"only-one\": {\n if (Array.isArray(value)) {\n if (value.length === 0)\n return { code: ERROR_CODES.ONLY_ONE_NONE, message: ERROR_MESSAGES[ERROR_CODES.ONLY_ONE_NONE] };\n if (value.length > 1)\n return { code: ERROR_CODES.ONLY_ONE_EXCEEDED, message: ERROR_MESSAGES[ERROR_CODES.ONLY_ONE_EXCEEDED] };\n } else if (!value) {\n return { code: ERROR_CODES.ONLY_ONE_NONE, message: ERROR_MESSAGES[ERROR_CODES.ONLY_ONE_NONE] };\n }\n break;\n }\n }\n }\n\n // 2. Format checks (only when there's a value)\n if (type === \"email\" && typeof value === \"string\" && value) {\n const emailError = validateEmail(value);\n if (emailError) return emailError;\n }\n\n if (type === \"phone\" && typeof value === \"string\" && value) {\n const phoneInput = wrapper.querySelector<HTMLInputElement>('input[type=\"tel\"]');\n if (phoneInput) {\n const phoneError = validatePhone(phoneInput);\n if (phoneError) return phoneError;\n }\n }\n\n return null;\n}\n\n// \u2500\u2500\u2500 Collect Fields \u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\n\nfunction collectFormFields(withValidation: boolean): PulseFormField[] {\n const wrappers = document.querySelectorAll<HTMLElement>(\"[pulse-form-block]\");\n const fields: PulseFormField[] = [];\n\n wrappers.forEach((wrapper) => {\n const rawType = wrapper\n .getAttribute(\"pulse-form-block\")\n ?.trim()\n .toLowerCase();\n\n if (!rawType || !VALID_BLOCK_TYPES.includes(rawType as FormBlockType))\n return;\n\n const blockType = rawType as FormBlockType;\n const fieldName = wrapper.getAttribute(\"pulse-field-name\")?.trim();\n if (!fieldName) return;\n\n const required = parseRequired(wrapper);\n const mirrorValue = parseMirrorValue(wrapper);\n const value = extractValue(blockType, wrapper);\n const error = withValidation\n ? getFieldError(blockType, required, value, wrapper)\n : null;\n\n fields.push({\n \"form-block\": blockType,\n \"field-name\": fieldName,\n value,\n required,\n \"mirror-value\": mirrorValue,\n error,\n });\n });\n\n return fields;\n}\n\n// \u2500\u2500\u2500 Error UI \u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\n\nfunction clearAllErrors(): void {\n document\n .querySelectorAll<HTMLElement>(`.${ERROR_SPAN_CLASS}`)\n .forEach((el) => el.remove());\n\n document\n .querySelectorAll<HTMLElement>(\"[pulse-form-block]\")\n .forEach((el) => el.classList.remove(\"has-error\"));\n}\n\nfunction clearErrorOnWrapper(wrapper: HTMLElement): void {\n const span = wrapper.querySelector(`.${ERROR_SPAN_CLASS}`);\n if (span) span.remove();\n wrapper.classList.remove(\"has-error\");\n}\n\nfunction showErrorOnWrapper(\n wrapper: HTMLElement,\n error: { code: string; message: string }\n): void {\n const existing = wrapper.querySelector(`.${ERROR_SPAN_CLASS}`);\n if (existing) existing.remove();\n\n const span = document.createElement(\"span\");\n span.className = ERROR_SPAN_CLASS;\n span.textContent = error.message;\n span.setAttribute(\"data-error-code\", error.code);\n span.setAttribute(\n \"data-field-name\",\n wrapper.getAttribute(\"pulse-field-name\")?.trim() || \"\"\n );\n\n wrapper.classList.add(\"has-error\");\n wrapper.appendChild(span);\n}\n\nfunction renderErrors(fields: PulseFormField[]): void {\n clearAllErrors();\n\n const wrappers = document.querySelectorAll<HTMLElement>(\"[pulse-form-block]\");\n\n wrappers.forEach((wrapper) => {\n const fieldName = wrapper.getAttribute(\"pulse-field-name\")?.trim();\n if (!fieldName) return;\n\n const field = fields.find((f) => f[\"field-name\"] === fieldName);\n if (!field || !field.error) return;\n\n showErrorOnWrapper(wrapper, field.error);\n });\n}\n\nfunction focusFirstError(): void {\n const first = document.querySelector<HTMLElement>(\n `[pulse-form-block].has-error`\n );\n if (!first) return;\n\n first.scrollIntoView({ behavior: \"smooth\", block: \"center\" });\n\n const focusable = first.querySelector<HTMLElement>(\n \"input, textarea, select\"\n );\n if (focusable) setTimeout(() => focusable.focus(), 400);\n}\n\n// \u2500\u2500\u2500 Mirror Value Fill \u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\n\nfunction fillMirrorValues(): void {\n // 1. Get all fields with mirror-value true\n const mirrorFields = _currentFields.filter((f) => f[\"mirror-value\"] === true);\n if (mirrorFields.length === 0) return;\n\n // 2. Select all mirror target elements\n const mirrorTargets = document.querySelectorAll<HTMLElement>(\"[pulse-form-block-mirror]\");\n\n // 3. For each mirror field, find matching target and fill\n mirrorFields.forEach((field) => {\n const fieldName = field[\"field-name\"];\n let found = false;\n\n mirrorTargets.forEach((target) => {\n const mirrorAttr = target.getAttribute(\"pulse-form-block-mirror\")?.trim();\n if (mirrorAttr !== fieldName) return;\n\n found = true;\n\n // Find the input inside the mirror target and fill it\n const input = target.querySelector<HTMLInputElement | HTMLTextAreaElement | HTMLSelectElement>(\n \"input, textarea, select\"\n );\n\n if (!input) {\n console.warn(\n `[PulseForm] Mirror target for \"${fieldName}\" found, but no input element inside it.`\n );\n return;\n }\n\n // Set value based on type\n const value = field.value;\n if (typeof value === \"string\") {\n input.value = value;\n } else if (typeof value === \"boolean\") {\n if (input instanceof HTMLInputElement && input.type === \"checkbox\") {\n input.checked = value;\n } else {\n input.value = String(value);\n }\n } else if (Array.isArray(value)) {\n input.value = value.join(\", \");\n } else {\n input.value = \"\";\n }\n });\n\n if (!found) {\n console.warn(\n `[PulseForm] No mirror target found for field \"${fieldName}\". ` +\n `Add an element with attribute pulse-form-block-mirror=\"${fieldName}\" to mirror this value.`\n );\n }\n });\n}\n\n\nfunction loadCalendarEmbed(): void {\n const container = document.querySelector<HTMLElement>(\"[hs-calender-block]\");\n if (!container) {\n console.warn(\"[PulseForm] No element with attribute 'hs-calender-block' found.\");\n return;\n }\n\n // Determine which entry to use based on flow-type\n const flowField = _currentFields.find((f) => f[\"field-name\"] === \"flow-type\");\n const flowValue = flowField?.value;\n\n let entry: CalendarEntry | undefined;\n\n if (flowValue === \"Pulse demo\") {\n // Use the pulse entry\n entry = CALENDAR_ENTRIES.find((e) => e.type === \"pulse\");\n } else if (flowValue === \"White Glove services\") {\n // Use the industry entry based on selected industry\n const industryField = _currentFields.find((f) => f[\"field-name\"] === \"industry\");\n const industryValue = industryField?.value;\n\n if (typeof industryValue === \"string\" && industryValue) {\n entry = CALENDAR_ENTRIES.find(\n (e) => e.type === \"industry\" && e.name.toLowerCase() === industryValue.toLowerCase()\n );\n }\n }\n\n if (!entry) {\n // Fallback to \"Other\"\n entry = CALENDAR_ENTRIES.find((e) => e.type === \"industry\" && e.name === \"Other\");\n }\n\n if (!entry) {\n console.warn(\"[PulseForm] No matching calendar entry found.\");\n return;\n }\n\n // Clear existing content\n container.innerHTML = \"\";\n\n // Add the HubSpot meetings embed\n const meetingsDiv = document.createElement(\"div\");\n meetingsDiv.className = \"meetings-iframe-container\";\n meetingsDiv.setAttribute(\"data-src\", entry[\"embed-url\"]);\n container.appendChild(meetingsDiv);\n\n // Load the HubSpot embed script\n const script = document.createElement(\"script\");\n script.type = \"text/javascript\";\n script.src = \"https://static.hsappstatic.net/MeetingsEmbed/ex/MeetingsEmbedCode.js\";\n container.appendChild(script);\n\n console.log(`[PulseForm] Loaded calendar: ${entry[\"calender-name\"]} (${entry.name})`);\n}\n\nfunction updateFlowType(): void {\n // 1. Get the value of field-name=\"flow-type\" from the JSON\n const flowField = _currentFields.find((f) => f[\"field-name\"] === \"flow-type\");\n if (!flowField) return;\n\n const flowValue = flowField.value;\n\n // 2. Select all elements with attribute \"form-flow\"\n const flowElements = document.querySelectorAll<HTMLElement>(\"[form-flow]\");\n\n // 3. Set form-flow-active based on matching value\n flowElements.forEach((el) => {\n const elFlowValue = el.getAttribute(\"form-flow\")?.trim();\n if (elFlowValue === flowValue) {\n el.setAttribute(\"form-flow-active\", \"true\");\n } else {\n el.setAttribute(\"form-flow-active\", \"false\");\n }\n });\n\n}\n\n// \u2500\u2500\u2500 Conditional Required \u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\n\nfunction updateConditionalRequired(): void {\n const flowField = _currentFields.find((f) => f[\"field-name\"] === \"flow-type\");\n if (!flowField) return;\n\n const flowValue = flowField.value;\n\n // Reset both fields to not required first\n const industryIdx = _currentFields.findIndex((f) => f[\"field-name\"] === \"industry\");\n const lookingForIdx = _currentFields.findIndex((f) => f[\"field-name\"] === \"what-are-you-looking-for\");\n\n if (industryIdx !== -1) {\n _currentFields[industryIdx] = { ..._currentFields[industryIdx], required: null };\n }\n if (lookingForIdx !== -1) {\n _currentFields[lookingForIdx] = { ..._currentFields[lookingForIdx], required: null };\n }\n\n // Set required based on flow-type value\n if (flowValue === \"White Glove services\" && industryIdx !== -1) {\n _currentFields[industryIdx] = { ..._currentFields[industryIdx], required: \"true\" };\n } else if (flowValue === \"Pulse demo\" && lookingForIdx !== -1) {\n _currentFields[lookingForIdx] = { ..._currentFields[lookingForIdx], required: \"atleast-one\" };\n }\n\n (window as any).PulseFormData = _currentFields;\n}\n\n// \u2500\u2500\u2500 Reactive State \u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\n\nlet _currentFields: PulseFormField[] = [];\n\nfunction updateFieldInState(\n fieldName: string,\n value: PulseFormField[\"value\"],\n error: PulseFormField[\"error\"]\n): void {\n const idx = _currentFields.findIndex((f) => f[\"field-name\"] === fieldName);\n if (idx === -1) return;\n _currentFields[idx] = { ..._currentFields[idx], value, error };\n (window as any).PulseFormData = _currentFields;\n updateConditionalRequired();\n fillMirrorValues();\n updateFlowType();\n}\n\nfunction handleFieldChange(wrapper: HTMLElement): void {\n const rawType = wrapper\n .getAttribute(\"pulse-form-block\")\n ?.trim()\n .toLowerCase() as FormBlockType;\n const fieldName = wrapper.getAttribute(\"pulse-field-name\")?.trim();\n if (!fieldName) return;\n\n const required = parseRequired(wrapper);\n const value = extractValue(rawType, wrapper);\n const hasError = wrapper.classList.contains(\"has-error\");\n\n if (hasError) {\n const error = getFieldError(rawType, required, value, wrapper);\n if (!error) {\n clearErrorOnWrapper(wrapper);\n updateFieldInState(fieldName, value, null);\n } else {\n showErrorOnWrapper(wrapper, error);\n updateFieldInState(fieldName, value, error);\n }\n } else {\n updateFieldInState(fieldName, value, null);\n }\n}\n\nfunction bindChangeListeners(): void {\n const wrappers = document.querySelectorAll<HTMLElement>(\"[pulse-form-block]\");\n\n wrappers.forEach((wrapper) => {\n const type = wrapper\n .getAttribute(\"pulse-form-block\")\n ?.trim()\n .toLowerCase() as FormBlockType | undefined;\n\n if (!type || !VALID_BLOCK_TYPES.includes(type)) return;\n\n const onChange = () => handleFieldChange(wrapper);\n\n switch (type) {\n case \"text\":\n case \"email\": {\n const input = wrapper.querySelector<HTMLInputElement | HTMLTextAreaElement>(\n \"input, textarea\"\n );\n if (input) {\n input.addEventListener(\"input\", onChange);\n input.addEventListener(\"change\", onChange);\n }\n break;\n }\n\n case \"phone\": {\n const phoneInput = wrapper.querySelector<HTMLInputElement>('input[type=\"tel\"]');\n if (phoneInput) {\n phoneInput.addEventListener(\"input\", onChange);\n phoneInput.addEventListener(\"change\", onChange);\n phoneInput.addEventListener(\"keyup\", onChange);\n phoneInput.addEventListener(\"countrychange\", onChange);\n }\n break;\n }\n\n case \"checkbox\":\n case \"legal\": {\n wrapper\n .querySelectorAll<HTMLInputElement>('input[type=\"checkbox\"]')\n .forEach((cb) => cb.addEventListener(\"change\", onChange));\n break;\n }\n\n case \"radio\": {\n wrapper\n .querySelectorAll<HTMLInputElement>('input[type=\"radio\"]')\n .forEach((r) => r.addEventListener(\"change\", onChange));\n break;\n }\n\n case \"select\": {\n const select = wrapper.querySelector<HTMLSelectElement>(\"select\");\n if (select) select.addEventListener(\"change\", onChange);\n break;\n }\n }\n });\n}\n\n// \u2500\u2500\u2500 Public API \u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\n\nconst PulseForm = {\n get fields(): PulseFormField[] {\n return _currentFields;\n },\n\n refresh(): PulseFormField[] {\n _currentFields = collectFormFields(false);\n (window as any).PulseFormData = _currentFields;\n updateConditionalRequired();\n fillMirrorValues();\n updateFlowType();\n return _currentFields;\n },\n\n validate(): { fields: PulseFormField[]; isValid: boolean } {\n const fields = collectFormFields(true);\n\n _currentFields = fields;\n (window as any).PulseFormData = _currentFields;\n updateConditionalRequired();\n\n // Re-validate fields whose required was changed by updateConditionalRequired\n const wrappers = document.querySelectorAll<HTMLElement>(\"[pulse-form-block]\");\n _currentFields.forEach((field, idx) => {\n const wrapper = Array.from(wrappers).find(\n (w) => w.getAttribute(\"pulse-field-name\")?.trim() === field[\"field-name\"]\n );\n if (!wrapper) return;\n const error = getFieldError(\n field[\"form-block\"],\n field.required,\n field.value,\n wrapper\n );\n _currentFields[idx] = { ..._currentFields[idx], error };\n });\n\n (window as any).PulseFormData = _currentFields;\n const isValid = _currentFields.every((f) => f.error === null);\n\n fillMirrorValues();\n updateFlowType();\n\n renderErrors(_currentFields);\n if (!isValid) focusFirstError();\n\n return { fields: _currentFields, isValid };\n },\n\n clearErrors(): void {\n clearAllErrors();\n _currentFields = _currentFields.map((f) => ({ ...f, error: null }));\n (window as any).PulseFormData = _currentFields;\n updateConditionalRequired();\n fillMirrorValues();\n updateFlowType();\n },\n\n ERROR_CODES,\n ERROR_MESSAGES,\n};\n\n// \u2500\u2500\u2500 Initialize on DOM Ready \u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\n\ndocument.addEventListener(\"DOMContentLoaded\", () => {\n const count = document.querySelectorAll(\"[pulse-form-block]\").length;\n console.log(`[PulseForm] Initialized \u2014 found ${count} form blocks.`);\n\n initIntlTelInput();\n\n _currentFields = collectFormFields(false);\n (window as any).PulseFormData = _currentFields;\n updateConditionalRequired();\n fillMirrorValues();\n updateFlowType();\n\n bindChangeListeners();\n\n // \u2500\u2500\u2500 Submit Button \u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\n const triggerBtn = document.getElementById(\"trigger-webflow-form-submit\");\n if (triggerBtn) {\n triggerBtn.addEventListener(\"click\", (e) => {\n e.preventDefault();\n const { isValid } = PulseForm.validate();\n if (!isValid) return;\n\n\n\n // Change button text\n const originalText = triggerBtn.textContent;\n triggerBtn.textContent = \"Submitting...\";\n\n // Load the calendar embed BEFORE submitting\n loadCalendarEmbed();\n\n const submitBtn = document.getElementById(\"webflow-form-submit\") as HTMLButtonElement | null;\n if (submitBtn) {\n submitBtn.click();\n } else {\n console.warn('[PulseForm] Button with id \"webflow-form-submit\" not found.');\n }\n\n const hubspotBtn = document.getElementById(\"hubspot-form-submit\") as HTMLButtonElement | null;\n if (hubspotBtn) {\n hubspotBtn.click();\n } else {\n console.warn('[PulseForm] Button with id \"hubspot-form-submit\" not found.');\n }\n\n setTimeout(() => {\n window.scrollTo({ top: 0, behavior: \"smooth\" });\n }, 1200);\n });\n }\n\n (window as any).PulseForm = PulseForm;\n});\n\n// \u2500\u2500\u2500 \u26A0\uFE0F DEV ONLY \u2014 Remove or disable in production \u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\n\nfunction devAutoFill(): void {\n const firstNames = [\"Jordan\", \"Morgan\", \"Riley\", \"Avery\", \"Quinn\", \"Casey\", \"Blake\", \"Harper\", \"Sage\", \"Rowan\"];\n const lastNames = [\"Nakamura\", \"Lindqvist\", \"Okafor\", \"Brennan\", \"Castellano\", \"Pham\", \"Eriksen\", \"Moreira\", \"Ashworth\", \"Dubois\"];\n const domains = [\"inbox.co\", \"mailbox.org\", \"zipmail.net\", \"postly.io\", \"demobox.dev\"];\n\n const pick = (arr: string[]) => arr[Math.floor(Math.random() * arr.length)];\n const rand = () => Math.random().toString(36).substring(2, 8);\n\n const firstName = pick(firstNames);\n const lastName = pick(lastNames);\n const email = `${firstName.toLowerCase()}.${rand()}@${pick(domains)}`;\n const phone = `${2000000000 + Math.floor(Math.random() * 8000000000)}`;\n\n const fieldMap: Record<string, string> = {\n \"first-name\": firstName,\n \"last-name\": lastName,\n \"email\": email,\n \"phone\": phone,\n \"anything-else\": \"Ignore this is a test form submission\",\n };\n\n Object.entries(fieldMap).forEach(([fieldName, value]) => {\n const wrapper = document.querySelector<HTMLElement>(\n `[pulse-field-name=\"${fieldName}\"]`\n );\n if (!wrapper) return;\n\n if (fieldName === \"phone\") {\n const phoneInput = wrapper.querySelector<HTMLInputElement>('input[type=\"tel\"]');\n if (!phoneInput) return;\n const iti = itiInstances.get(phoneInput);\n if (iti) {\n iti.setNumber(`+1${value}`);\n } else {\n phoneInput.value = value;\n }\n phoneInput.dispatchEvent(new Event(\"input\", { bubbles: true }));\n phoneInput.dispatchEvent(new Event(\"change\", { bubbles: true }));\n phoneInput.dispatchEvent(new Event(\"keyup\", { bubbles: true }));\n return;\n }\n\n const el = fieldName === \"anything-else\"\n ? wrapper.querySelector<HTMLTextAreaElement>(\"textarea\")\n : wrapper.querySelector<HTMLInputElement>(\"input\");\n if (!el) return;\n\n el.value = value;\n el.dispatchEvent(new Event(\"input\", { bubbles: true }));\n el.dispatchEvent(new Event(\"change\", { bubbles: true }));\n });\n\n console.log(\"[PulseForm][DEV] Auto-filled:\", fieldMap);\n}\n\n// setTimeout(devAutoFill, 500);\n// \u2500\u2500\u2500 \u26A0\uFE0F END DEV ONLY \u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500"],
|
|
5
|
+
"mappings": "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",
|
|
6
6
|
"names": []
|
|
7
7
|
}
|
|
@@ -0,0 +1,2 @@
|
|
|
1
|
+
"use strict";(()=>{var S=Object.create;var f=Object.defineProperty;var T=Object.getOwnPropertyDescriptor;var v=Object.getOwnPropertyNames;var g=Object.getPrototypeOf,L=Object.prototype.hasOwnProperty;var M=(l=>typeof require<"u"?require:typeof Proxy<"u"?new Proxy(l,{get:(t,e)=>(typeof require<"u"?require:t)[e]}):l)(function(l){if(typeof require<"u")return require.apply(this,arguments);throw Error('Dynamic require of "'+l+'" is not supported')});var b=(l,t,e,r)=>{if(t&&typeof t=="object"||typeof t=="function")for(let n of v(t))!L.call(l,n)&&n!==e&&f(l,n,{get:()=>t[n],enumerable:!(r=T(t,n))||r.enumerable});return l};var H=(l,t,e)=>(e=l!=null?S(g(l)):{},b(t||!l||!l.__esModule?f(e,"default",{value:l,enumerable:!0}):e,l));function E(l={}){let{root:t=document,initialCountry:e="us",separateDialCode:r=!0,countryCodeSelector:n='input[pulse-form-field="country-code"]',onInit:i,onError:a=c=>console.warn(`[initIntlTelInput] ${c}`)}=l,s=new Map,o=window.intlTelInput;return o?(t.querySelectorAll('input[type="tel"]').forEach(c=>{try{let d=o(c,{initialCountry:e,separateDialCode:r,strictMode:!1,loadUtils:()=>import("https://cdn.jsdelivr.net/npm/intl-tel-input@25/build/js/utils.js")});s.set(c,d),h(d,n),c.addEventListener("countrychange",()=>{h(d,n)}),i?.(c,d)}catch(d){a(`Failed to init on input inside "${q(c)}"`,d)}}),s):(a(`intlTelInput not found on window. Include the script before calling this function.
|
|
2
|
+
e.g. <script src="https://cdn.jsdelivr.net/npm/intl-tel-input@25/build/js/intlTelInput.min.js"><\/script>`),s)}function h(l,t){try{let e=l.getSelectedCountryData?.();if(!e?.dialCode)return;document.querySelectorAll(t).forEach(r=>{r.value=`+${e.dialCode}`})}catch{}}function q(l){return l.closest("[pulse-form-block]")?.getAttribute("pulse-field-name")??"unknown"}var y={required:"This field is required",email_invalid:"Please enter a valid email address",email_company:"Please use your company email address",phone_invalid:"Please enter a valid phone number",selection_required:"Please select at least one option",legal_required:"You must accept this to continue"},I={"pulse-demo":["pulse-demo-only","common-fields"],"white-glove-services":["white-glove-only","common-fields"]},x={1:{heading:"Your info",subheading:"Pulse is launching March 2025. Spots for onboarding cohort 1 are limited.",counter:"Step 1/2"},2:{heading:"Personalize",subheading:"Help us personalize your demo.",counter:"Step 2/2"}},m=class{constructor(t,e){this.currentStepIndex=0;this.stepHasBeenValidated=!1;this.originalRequired=new WeakMap;this.fieldState=new Map;this.form=t,this.itiInstances=e,this.steps=Array.from(t.querySelectorAll('[data-msf="step"]')),this.bindEvents(),this.cacheOriginalRequiredState(),this.initializeFieldState(),this.showStep(0),this.applyFlowConditions(),this.syncAllFieldState()}bindEvents(){this.form.addEventListener("click",t=>{let e=t.target;if(!e)return;let r=e.closest("[data-action]");if(!r)return;let n=r.dataset.action;n==="next"&&(t.preventDefault(),this.next()),n==="back"&&(t.preventDefault(),this.back())}),this.form.addEventListener("submit",t=>{t.preventDefault()}),this.form.addEventListener("input",t=>{let e=t.target;e&&(!(e instanceof HTMLInputElement)&&!(e instanceof HTMLTextAreaElement)&&!(e instanceof HTMLSelectElement)||this.handleLiveValidation())}),this.itiInstances.forEach((t,e)=>{e.addEventListener("countrychange",()=>{this.stepHasBeenValidated&&this.handleLiveValidation()})}),this.form.addEventListener("change",t=>{let e=t.target;e&&e instanceof HTMLInputElement&&e.type==="radio"&&e.name==="flow-type"&&this.applyFlowConditions()}),this.form.addEventListener("input",t=>{let e=t.target;if(!e)return;let r=e.closest("[data-field-key]");if(!r)return;let n=r.dataset.fieldKey;n&&this.updateFieldState(n)}),this.form.addEventListener("change",t=>{let e=t.target;if(!e)return;let r=e.closest("[data-field-key]");if(!r)return;let n=r.dataset.fieldKey;n&&this.updateFieldState(n)})}handleLiveValidation(){if(!this.stepHasBeenValidated)return;let t=this.validateStep(this.currentStepIndex);this.clearErrors(),Object.keys(t).length>0&&this.showErrors(t)}showStep(t){this.steps.forEach((r,n)=>{r.style.display=n===t?"flex":"none"}),this.currentStepIndex=t,this.stepHasBeenValidated=!1,this.clearErrors();let e=t+1;this.updateStepText(e)}next(){this.stepHasBeenValidated=!0;let t=this.validateStep(this.currentStepIndex);if(Object.keys(t).length>0){this.clearErrors(),this.showErrors(t),this.focusFirstError(t);return}this.clearErrors(),this.stepHasBeenValidated=!1;let e=this.currentStepIndex+1;if(e>=this.steps.length){console.log("Validation passed");let n=this.steps[this.currentStepIndex].querySelector('[data-action="next"]');if(n){let s=n.querySelector("[data-action-text]");s&&(s.textContent="Submitting...")}this.mirrorFieldStateToDOM();let i=document.getElementById("webflow-form-submit"),a=document.getElementById("hubspot-form-submit");i&&a?(i.click(),a.click()):console.warn("Submit button not found");return}this.showStep(e)}showErrors(t){Object.entries(t).forEach(([e,r])=>{let n=this.form.querySelector(`[data-required-group="${e}"]`)||this.form.querySelector(`[data-required-legal="${e}"]`);if(n){n.classList.add("has-error");let s=n.querySelector(".field-error");s||(s=document.createElement("div"),s.className="field-error",n.appendChild(s)),s.textContent=y[r],s.setAttribute("data-error-code",r);return}let i=this.form.querySelector(`[name="${e}"]`);if(!i)return;i.classList.add("has-error");let a=i.parentElement?.querySelector(".field-error");a||(a=document.createElement("div"),a.className="field-error",i.parentElement?.appendChild(a)),a.textContent=y[r],a.setAttribute("data-error-code",r)})}clearErrors(){this.form.querySelectorAll(".field-error").forEach(t=>t.remove()),this.form.querySelectorAll(".has-error").forEach(t=>t.classList.remove("has-error"))}back(){let t=this.currentStepIndex-1;t<0||this.showStep(t)}getFieldsForStep(t){let e=this.steps[t];return Array.from(e.querySelectorAll("input, select, textarea"))}validateStep(t){let e={};this.getFieldsForStep(t).forEach(a=>{let s=a.name;if(!s||a.type==="checkbox"||a.type==="radio")return;let o=a.value.trim();if(a.hasAttribute("required")&&!o){e[s]="required";return}if(a.type==="email"&&o){if(!this.isValidEmailFormat(o)){e[s]="email_invalid";return}if(!this.isCompanyEmail(o)){e[s]="email_company";return}}if(a.type==="tel"&&o&&this.validatePhoneField(a)){e[s]="phone_invalid";return}});let n=this.validateRequiredSelectionGroups(t),i=this.validateLegalGroups(t);return{...e,...n,...i}}validateRequiredSelectionGroups(t){let e=this.steps[t],r={};return e.querySelectorAll("[data-required-group]").forEach(i=>{let a=i.dataset.requiredGroup;if(!a)return;let o=Array.from(i.querySelectorAll('input[type="checkbox"], input[type="radio"]')).filter(c=>!c.disabled);if(o.length===0)return;o.some(c=>c.checked)||(r[a]="selection_required")}),r}validateLegalGroups(t){let e=this.steps[t],r={};return e.querySelectorAll("[data-required-legal]").forEach(i=>{let a=i.dataset.requiredLegal;if(!a)return;let s=i.querySelector('input[type="checkbox"]');!s||s.disabled||s.checked||(r[a]="legal_required")}),r}isValidEmailFormat(t){return/^[^\s@]+@[^\s@]+\.[^\s@]+$/.test(t)}isCompanyEmail(t){let e=["gmail.com","yahoo.com","hotmail.com","outlook.com","icloud.com","aol.com"],r=t.split("@")[1]?.toLowerCase();return r?!e.includes(r):!1}validatePhoneField(t){let e=this.itiInstances.get(t);return!e||!t.value.trim()||e.isValidNumber()?null:"phone_invalid"}focusFirstError(t){let e=Object.keys(t)[0];if(!e)return;let r=this.form.querySelector(`[data-required-group="${e}"]`)||this.form.querySelector(`[data-required-legal="${e}"]`);if(r){r.querySelector("input, select, textarea")?.focus();return}this.form.querySelector(`[name="${e}"]`)?.focus()}getFlowType(){let t=this.form.querySelector('[data-required-group="flow-type"]');return t?t.querySelector('input[type="radio"]:checked')?.value??null:null}applyFlowConditions(){let t=this.getFlowType();if(!t)return;let e=I[t]||[];this.form.querySelectorAll("[data-conditional]").forEach(n=>{let i=n.dataset.conditional;if(!i)return;let a=e.includes(i),s=n.querySelectorAll("input, select, textarea");if(a)n.style.display="",s.forEach(o=>{o.disabled=!1,this.originalRequired.get(o)&&o.setAttribute("required","true")});else{n.style.display="none",s.forEach(u=>{u.disabled=!0,u.removeAttribute("required");let c=u.closest("[data-field-key]");if(!c)return;let d=c.dataset.fieldKey;if(!d)return;let p=this.fieldState.get(d);p&&(p.required=!1,p.valid=!0,p.value="",this.fieldState.set(d,p))});let o=n.dataset.fieldKey;if(o){let u=this.fieldState.get(o);u&&(u.required=!1,u.valid=!0,u.value="",this.fieldState.set(o,u))}this.clearErrorsInBlock(n)}}),this.updateValidityForStep(this.currentStepIndex+1)}cacheOriginalRequiredState(){this.form.querySelectorAll("input, select, textarea").forEach(e=>{this.originalRequired.set(e,e.hasAttribute("required"))})}clearErrorsInBlock(t){t.querySelectorAll(".field-error").forEach(e=>e.remove()),t.querySelectorAll(".has-error").forEach(e=>e.classList.remove("has-error"))}initializeFieldState(){this.form.querySelectorAll("[data-field-key]").forEach(e=>{let r=e.dataset.fieldKey;if(!r)return;let n=e.closest("[data-msf='step']"),i=n?Number(n.dataset.step):this.currentStepIndex+1;this.fieldState.set(r,{"field-name":r,value:"",required:!1,valid:!0,"step-number":i})})}updateFieldState(t){let e=this.form.querySelector(`[data-field-key="${t}"]`);if(!e)return;let r="",n=!1;if(e.hasAttribute("data-group")){let o=Array.from(e.querySelectorAll("input[type='radio'], input[type='checkbox']")).filter(u=>!u.disabled);if(n=e.hasAttribute("data-required-group"),o.some(u=>u.type==="radio")){let u=o.find(c=>c.checked);u?r=u.closest("label")?.querySelector("span")?.textContent?.trim()??u.value??"":r=""}else r=o.filter(c=>c.checked).map(c=>c.closest("label")?.querySelector("span")?.textContent?.trim()??c.value??"").join(",")}else if(e.hasAttribute("data-required-legal")){let o=e.querySelector("input[type='checkbox']");o&&!o.disabled&&(n=!0,r=o.checked?"true":"false")}else(e instanceof HTMLInputElement||e instanceof HTMLSelectElement||e instanceof HTMLTextAreaElement)&&(n=e.hasAttribute("required")&&!e.disabled,e instanceof HTMLInputElement&&e.type==="checkbox"?r=e.checked?"true":"false":r=e.value.trim());let i=e.closest("[data-msf='step']"),a=i?Number(i.dataset.step):this.currentStepIndex+1,s=this.fieldState.get(t);s&&(s.value=r,s.required=n,s["step-number"]=a,this.fieldState.set(t,s),this.updateValidityForStep(a))}updateValidityForStep(t){let e=this.steps.findIndex(i=>Number(i.dataset.step)===t);if(e===-1)return;let r=this.validateStep(e);Array.from(this.fieldState.values()).filter(i=>i["step-number"]===t).forEach(i=>{i.valid=!r[i["field-name"]]})}getFormStateJSON(){return Array.from(this.fieldState.values())}updateStepText(t){let e=x[t];if(e){if(e.heading){let r=this.form.querySelector('[data-dynamic-text="heading"]');r&&(r.textContent=e.heading)}if(e.subheading){let r=this.form.querySelector('[data-dynamic-text="subheading"]');r&&(r.textContent=e.subheading)}if(e.counter){let r=this.form.querySelector('[data-dynamic-text="counter"]');r&&(r.textContent=e.counter)}}}syncAllFieldState(){this.fieldState.forEach((t,e)=>{this.updateFieldState(e)})}mirrorFieldStateToDOM(){let t=this.getFormStateJSON(),e=document.getElementById("form-hubspot-book-a-demo");t.forEach(r=>{let n=e?.querySelector(`[data-mirror="${r["field-name"]}"]`);if(!n){console.warn(`[Mirror] No element found with data-mirror="${r["field-name"]}"`);return}n instanceof HTMLInputElement&&n.disabled||(n instanceof HTMLInputElement?n.type==="checkbox"?n.checked=r.value==="true":n.type==="radio"?n.checked=n.value===r.value:n.value=r.value:n.value=r.value)})}};document.addEventListener("DOMContentLoaded",()=>{let l=document.querySelector('[data-msf="form"]');if(!l)return;let t=E({root:l}),e=new m(l,t);window.msf=e});})();
|
|
@@ -0,0 +1,7 @@
|
|
|
1
|
+
{
|
|
2
|
+
"version": 3,
|
|
3
|
+
"sources": ["../../src/form/utils/initIntlTelInput.ts", "../../src/form/index.ts"],
|
|
4
|
+
"sourcesContent": ["// \u2500\u2500\u2500 initIntlTelInput.ts \u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\n// Reusable utility that initialises intl-tel-input on every phone field\n// inside a given root. Returns the instance map so callers can pass it\n// to collectFormFields / validatePhone when needed.\n//\n// Usage:\n// import { initIntlTelInput } from \"./initIntlTelInput\";\n// const itiInstances = initIntlTelInput();\n// const itiInstances = initIntlTelInput({ root: myDiv, initialCountry: \"gb\" });\n// \u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\n\nexport interface IntlTelInputOptions {\n /** Root element to scan for phone inputs. Default: document */\n root?: ParentNode;\n /** ISO-2 country code for default selection. Default: \"us\" */\n initialCountry?: string;\n /** Show dial code separately from the input. Default: true */\n separateDialCode?: boolean;\n /** Selector for hidden input(s) that should receive the dial code. Default: 'input[pulse-form-field=\"country-code\"]' */\n countryCodeSelector?: string;\n /** Called after each input is successfully initialised */\n onInit?: (input: HTMLInputElement, iti: any) => void;\n /** Called when intlTelInput is missing from window or an input fails */\n onError?: (message: string, error?: unknown) => void;\n}\n\n/**\n * Finds every `input[type=\"tel\"]` inside `[pulse-form-block=\"phone\"]`\n * wrappers, attaches intl-tel-input, and returns a Map of\n * `HTMLInputElement \u2192 iti instance` for downstream use (validation, etc.).\n */\nexport function initIntlTelInput(\n options: IntlTelInputOptions = {}\n): Map<HTMLInputElement, any> {\n const {\n root = document,\n initialCountry = \"us\",\n separateDialCode = true,\n countryCodeSelector = 'input[pulse-form-field=\"country-code\"]',\n onInit,\n onError = (msg) => console.warn(`[initIntlTelInput] ${msg}`),\n } = options;\n\n const instances = new Map<HTMLInputElement, any>();\n\n // \u2500\u2500 Guard: library must be loaded first \u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\n const intlTelInput = (window as any).intlTelInput;\n if (!intlTelInput) {\n onError(\n \"intlTelInput not found on window. \" +\n \"Include the script before calling this function.\\n\" +\n 'e.g. <script src=\"https://cdn.jsdelivr.net/npm/intl-tel-input@25/build/js/intlTelInput.min.js\"></script>'\n );\n return instances;\n }\n\n // \u2500\u2500 Find phone inputs \u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\n const phoneInputs = root.querySelectorAll<HTMLInputElement>(\n 'input[type=\"tel\"]'\n );\n\n phoneInputs.forEach((input) => {\n try {\n const iti = intlTelInput(input, {\n initialCountry,\n separateDialCode,\n strictMode: false,\n // @ts-ignore \u2014 runtime CDN import\n loadUtils: () =>\n import(\n // @ts-ignore \u2014 runtime CDN import, not a TS module\n \"https://cdn.jsdelivr.net/npm/intl-tel-input@25/build/js/utils.js\"\n ),\n });\n\n instances.set(input, iti);\n\n // Fill hidden country-code input(s) on load + on change\n fillCountryCode(iti, countryCodeSelector);\n input.addEventListener(\"countrychange\", () => {\n fillCountryCode(iti, countryCodeSelector);\n });\n\n onInit?.(input, iti);\n } catch (err) {\n onError(`Failed to init on input inside \"${fieldNameOf(input)}\"`, err);\n }\n });\n\n return instances;\n}\n\n// \u2500\u2500\u2500 Helpers \u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\n\nfunction fillCountryCode(iti: any, selector: string): void {\n try {\n const countryData = iti.getSelectedCountryData?.();\n if (!countryData?.dialCode) return;\n\n document.querySelectorAll<HTMLInputElement>(selector).forEach((input) => {\n input.value = `+${countryData.dialCode}`;\n });\n } catch {\n // silently ignore \u2014 non-critical\n }\n}\n\nfunction fieldNameOf(input: HTMLInputElement): string {\n return (\n input.closest(\"[pulse-form-block]\")?.getAttribute(\"pulse-field-name\") ??\n \"unknown\"\n );\n}", "import { initIntlTelInput } from \"./utils/initIntlTelInput\";\n\ntype StepEl = HTMLElement;\n\ntype ErrorCode =\n | \"required\"\n | \"email_invalid\"\n | \"email_company\"\n | \"phone_invalid\"\n | \"selection_required\"\n | \"legal_required\";\n\nconst ERROR_MESSAGES: Record<ErrorCode, string> = {\n required: \"This field is required\",\n email_invalid: \"Please enter a valid email address\",\n email_company: \"Please use your company email address\",\n phone_invalid: \"Please enter a valid phone number\",\n selection_required: \"Please select at least one option\",\n legal_required: \"You must accept this to continue\"\n};\n\ntype FieldState = {\n \"field-name\": string;\n value: string;\n required: boolean;\n valid: boolean;\n \"step-number\": number;\n};\n\nconst FLOW_CONDITIONS: Record<string, string[]> = {\n \"pulse-demo\": [\n \"pulse-demo-only\",\n \"common-fields\"\n ],\n \"white-glove-services\": [\n \"white-glove-only\",\n \"common-fields\"\n ]\n};\n\nconst STEP_TEXT: Record<number, { heading?: string; subheading?: string; counter?: string }> = {\n 1: {\n heading: \"Your info\",\n subheading: \"Pulse is launching March 2025. Spots for onboarding cohort 1 are limited.\",\n counter: \"Step 1/2\"\n },\n 2: {\n heading: \"Personalize\",\n subheading: \"Help us personalize your demo.\",\n counter: \"Step 2/2\"\n }\n};\n\nclass MultiStepForm {\n private form: HTMLFormElement;\n private steps: StepEl[];\n private currentStepIndex = 0;\n private itiInstances: Map<HTMLInputElement, any>;\n private stepHasBeenValidated = false;\n private originalRequired = new WeakMap<HTMLElement, boolean>();\n private fieldState = new Map<string, FieldState>();\n\n\n constructor(form: HTMLFormElement, itiInstances: Map<HTMLInputElement, any>) {\n this.form = form;\n this.itiInstances = itiInstances;\n\n this.steps = Array.from(\n form.querySelectorAll<HTMLElement>('[data-msf=\"step\"]')\n );\n\n this.bindEvents();\n this.cacheOriginalRequiredState();\n this.initializeFieldState();\n this.showStep(0);\n this.applyFlowConditions();\n this.syncAllFieldState();\n }\n\n private bindEvents() {\n this.form.addEventListener(\"click\", (e) => {\n const target = e.target as HTMLElement | null;\n if (!target) return;\n\n const btn = target.closest<HTMLElement>(\"[data-action]\");\n if (!btn) return;\n\n const action = btn.dataset.action;\n\n if (action === \"next\") {\n e.preventDefault();\n this.next();\n }\n\n if (action === \"back\") {\n e.preventDefault();\n this.back();\n }\n });\n\n // Prevent Webflow native submit until you decide\n this.form.addEventListener(\"submit\", (e) => {\n e.preventDefault();\n });\n\n this.form.addEventListener(\"input\", (e) => {\n const target = e.target as HTMLElement | null;\n if (!target) return;\n\n // Only care about fields\n if (\n !(target instanceof HTMLInputElement) &&\n !(target instanceof HTMLTextAreaElement) &&\n !(target instanceof HTMLSelectElement)\n ) return;\n\n this.handleLiveValidation();\n });\n\n this.itiInstances.forEach((_iti, input) => {\n input.addEventListener(\"countrychange\", () => {\n if (!this.stepHasBeenValidated) return;\n this.handleLiveValidation();\n });\n });\n\n this.form.addEventListener(\"change\", (e) => {\n const target = e.target as HTMLElement | null;\n if (!target) return;\n\n if (\n target instanceof HTMLInputElement &&\n target.type === \"radio\" &&\n target.name === \"flow-type\"\n ) {\n this.applyFlowConditions();\n }\n });\n\n this.form.addEventListener(\"input\", (e) => {\n const target = e.target as HTMLElement | null;\n if (!target) return;\n\n const trackable = target.closest<HTMLElement>(\"[data-field-key]\");\n if (!trackable) return;\n\n const key = trackable.dataset.fieldKey;\n if (!key) return;\n\n this.updateFieldState(key);\n });\n\n this.form.addEventListener(\"change\", (e) => {\n const target = e.target as HTMLElement | null;\n if (!target) return;\n\n const trackable = target.closest<HTMLElement>(\"[data-field-key]\");\n if (!trackable) return;\n\n const key = trackable.dataset.fieldKey;\n if (!key) return;\n\n this.updateFieldState(key);\n });\n }\n\n private handleLiveValidation() {\n if (!this.stepHasBeenValidated) return;\n\n const errors = this.validateStep(this.currentStepIndex);\n\n this.clearErrors();\n\n if (Object.keys(errors).length > 0) {\n this.showErrors(errors);\n }\n }\n private showStep(index: number) {\n this.steps.forEach((step, i) => {\n step.style.display = i === index ? \"flex\" : \"none\";\n });\n\n this.currentStepIndex = index;\n\n this.stepHasBeenValidated = false;\n this.clearErrors();\n\n const stepNumber = index + 1;\n this.updateStepText(stepNumber);\n }\n\n private next() {\n this.stepHasBeenValidated = true;\n\n const errors = this.validateStep(this.currentStepIndex);\n\n if (Object.keys(errors).length > 0) {\n this.clearErrors();\n this.showErrors(errors);\n this.focusFirstError(errors);\n return;\n }\n\n this.clearErrors();\n this.stepHasBeenValidated = false;\n\n const nextIndex = this.currentStepIndex + 1;\n\n // If this is the last step \u2192 treat as submit\n if (nextIndex >= this.steps.length) {\n console.log(\"Validation passed\");\n\n // Find the current step\n const currentStep = this.steps[this.currentStepIndex];\n\n // Find the next button inside this step\n const nextButton = currentStep.querySelector<HTMLElement>('[data-action=\"next\"]');\n\n if (nextButton) {\n const actionTextEl = nextButton.querySelector<HTMLElement>('[data-action-text]');\n if (actionTextEl) {\n actionTextEl.textContent = \"Submitting...\";\n }\n }\n\n this.mirrorFieldStateToDOM();\n\n const webflowSubmitBtn = document.getElementById(\"webflow-form-submit\") as HTMLButtonElement | null;\n const hubspotSubmitBtn = document.getElementById(\"hubspot-form-submit\") as HTMLButtonElement | null;\n\n if (webflowSubmitBtn && hubspotSubmitBtn) {\n webflowSubmitBtn.click();\n hubspotSubmitBtn.click();\n } else {\n console.warn(\"Submit button not found\");\n }\n\n return;\n }\n\n // Otherwise go to next step normally\n this.showStep(nextIndex);\n }\n\n private showErrors(errors: Record<string, ErrorCode>) {\n Object.entries(errors).forEach(([name, message]) => {\n\n // First check for group wrapper\n const groupEl =\n this.form.querySelector<HTMLElement>(`[data-required-group=\"${name}\"]`) ||\n this.form.querySelector<HTMLElement>(`[data-required-legal=\"${name}\"]`);\n\n if (groupEl) {\n groupEl.classList.add(\"has-error\");\n\n let errorEl = groupEl.querySelector<HTMLElement>(\".field-error\");\n if (!errorEl) {\n errorEl = document.createElement(\"div\");\n errorEl.className = \"field-error\";\n groupEl.appendChild(errorEl);\n }\n\n errorEl.textContent = ERROR_MESSAGES[message];\n errorEl.setAttribute(\"data-error-code\", message);\n return;\n }\n\n // Otherwise treat as normal field\n const field = this.form.querySelector<HTMLInputElement>(`[name=\"${name}\"]`);\n if (!field) return;\n\n field.classList.add(\"has-error\");\n\n let errorEl = field.parentElement?.querySelector<HTMLElement>(\".field-error\");\n if (!errorEl) {\n errorEl = document.createElement(\"div\");\n errorEl.className = \"field-error\";\n field.parentElement?.appendChild(errorEl);\n }\n\n errorEl.textContent = ERROR_MESSAGES[message];\n errorEl.setAttribute(\"data-error-code\", message);\n });\n }\n\n private clearErrors() {\n this.form.querySelectorAll(\".field-error\").forEach((el) => el.remove());\n this.form.querySelectorAll(\".has-error\").forEach((el) =>\n el.classList.remove(\"has-error\")\n );\n }\n\n private back() {\n const prevIndex = this.currentStepIndex - 1;\n if (prevIndex < 0) return;\n this.showStep(prevIndex);\n }\n\n private getFieldsForStep(index: number): HTMLInputElement[] {\n const step = this.steps[index];\n return Array.from(\n step.querySelectorAll<HTMLInputElement | HTMLSelectElement | HTMLTextAreaElement>(\n \"input, select, textarea\"\n )\n ) as HTMLInputElement[];\n }\n\n private validateStep(index: number): Record<string, ErrorCode> {\n const errors: Record<string, ErrorCode> = {};\n\n const fields = this.getFieldsForStep(index);\n\n fields.forEach((field) => {\n const name = field.name;\n if (!name) return;\n\n if (field.type === \"checkbox\" || field.type === \"radio\") return;\n\n const value = field.value.trim();\n const isRequired = field.hasAttribute(\"required\");\n\n if (isRequired && !value) {\n errors[name] = \"required\";\n return;\n }\n\n // Custom email validation\n if (field.type === \"email\" && value) {\n if (!this.isValidEmailFormat(value)) {\n errors[name] = \"email_invalid\";\n return;\n }\n\n if (!this.isCompanyEmail(value)) {\n errors[name] = \"email_company\";\n return;\n }\n }\n\n // Custom phone validation\n if (field.type === \"tel\" && value) {\n const phoneError = this.validatePhoneField(field as HTMLInputElement);\n if (phoneError) {\n errors[name] = \"phone_invalid\";\n return;\n }\n }\n });\n\n const selectionGroupErrors = this.validateRequiredSelectionGroups(index);\n const legalErrors = this.validateLegalGroups(index);\n\n return {\n ...errors,\n ...selectionGroupErrors,\n ...legalErrors\n };\n }\n\n private validateRequiredSelectionGroups(index: number): Record<string, ErrorCode> {\n const step = this.steps[index];\n const errors: Record<string, ErrorCode> = {};\n\n const groups = step.querySelectorAll<HTMLElement>(\"[data-required-group]\");\n\n groups.forEach((groupEl) => {\n const groupName = groupEl.dataset.requiredGroup;\n if (!groupName) return;\n\n const inputs = Array.from(\n groupEl.querySelectorAll<HTMLInputElement>(\n 'input[type=\"checkbox\"], input[type=\"radio\"]'\n )\n );\n\n // Only consider enabled inputs\n const enabledInputs = inputs.filter((input) => !input.disabled);\n\n // If no enabled inputs \u2192 group is structurally inactive \u2192 skip validation\n if (enabledInputs.length === 0) return;\n\n const isChecked = enabledInputs.some((input) => input.checked);\n\n if (!isChecked) {\n errors[groupName] = \"selection_required\";\n }\n });\n\n return errors;\n }\n\n private validateLegalGroups(index: number): Record<string, ErrorCode> {\n const step = this.steps[index];\n const errors: Record<string, ErrorCode> = {};\n\n const legalGroups = step.querySelectorAll<HTMLElement>(\"[data-required-legal]\");\n\n legalGroups.forEach((groupEl) => {\n const groupName = groupEl.dataset.requiredLegal;\n if (!groupName) return;\n\n const checkbox = groupEl.querySelector<HTMLInputElement>(\n 'input[type=\"checkbox\"]'\n );\n\n // If checkbox doesn't exist or is disabled \u2192 skip validation\n if (!checkbox || checkbox.disabled) return;\n\n if (!checkbox.checked) {\n errors[groupName] = \"legal_required\";\n }\n });\n\n return errors;\n }\n\n private isValidEmailFormat(email: string): boolean {\n const emailRegex =\n /^[^\\s@]+@[^\\s@]+\\.[^\\s@]+$/;\n return emailRegex.test(email);\n }\n\n private isCompanyEmail(email: string): boolean {\n const publicDomains = [\n \"gmail.com\",\n \"yahoo.com\",\n \"hotmail.com\",\n \"outlook.com\",\n \"icloud.com\",\n \"aol.com\"\n ];\n\n const domain = email.split(\"@\")[1]?.toLowerCase();\n if (!domain) return false;\n\n return !publicDomains.includes(domain);\n }\n private validatePhoneField(field: HTMLInputElement): ErrorCode | null {\n const iti = this.itiInstances.get(field);\n if (!iti) return null;\n\n const value = field.value.trim();\n if (!value) return null;\n\n if (!iti.isValidNumber()) {\n return \"phone_invalid\";\n }\n\n return null;\n }\n\n private focusFirstError(errors: Record<string, ErrorCode>) {\n const firstErrorName = Object.keys(errors)[0];\n if (!firstErrorName) return;\n\n const groupEl =\n this.form.querySelector<HTMLElement>(\n `[data-required-group=\"${firstErrorName}\"]`\n ) ||\n this.form.querySelector<HTMLElement>(\n `[data-required-legal=\"${firstErrorName}\"]`\n );\n\n if (groupEl) {\n const firstInput = groupEl.querySelector<\n HTMLInputElement | HTMLSelectElement | HTMLTextAreaElement\n >(\"input, select, textarea\");\n\n firstInput?.focus();\n return;\n }\n\n const field = this.form.querySelector<\n HTMLInputElement | HTMLSelectElement | HTMLTextAreaElement\n >(`[name=\"${firstErrorName}\"]`);\n\n field?.focus();\n }\n\n private getFlowType(): string | null {\n const flowWrapper = this.form.querySelector<HTMLElement>(\n '[data-required-group=\"flow-type\"]'\n );\n if (!flowWrapper) return null;\n\n const checked = flowWrapper.querySelector<HTMLInputElement>(\n 'input[type=\"radio\"]:checked'\n );\n\n return checked?.value ?? null;\n }\n\n private applyFlowConditions() {\n const flowType = this.getFlowType();\n if (!flowType) return;\n\n const visibleKeys = FLOW_CONDITIONS[flowType] || [];\n\n const conditionalBlocks = this.form.querySelectorAll<HTMLElement>(\n \"[data-conditional]\"\n );\n\n conditionalBlocks.forEach((block) => {\n const key = block.dataset.conditional;\n if (!key) return;\n\n const shouldShow = visibleKeys.includes(key);\n\n const inputs = block.querySelectorAll<\n HTMLInputElement | HTMLSelectElement | HTMLTextAreaElement\n >(\"input, select, textarea\");\n\n if (shouldShow) {\n block.style.display = \"\";\n\n inputs.forEach((input) => {\n input.disabled = false;\n\n const wasRequired = this.originalRequired.get(input);\n if (wasRequired) {\n input.setAttribute(\"required\", \"true\");\n }\n });\n } else {\n block.style.display = \"none\";\n\n inputs.forEach((input) => {\n input.disabled = true;\n input.removeAttribute(\"required\");\n\n // Sync fieldState for hidden inputs\n const trackable = input.closest<HTMLElement>(\"[data-field-key]\");\n if (!trackable) return;\n\n const fieldKey = trackable.dataset.fieldKey;\n if (!fieldKey) return;\n\n const state = this.fieldState.get(fieldKey);\n if (!state) return;\n\n state.required = false;\n state.valid = true;\n state.value = \"\";\n\n this.fieldState.set(fieldKey, state);\n });\n\n // Sync wrapper-level fieldState if wrapper itself is tracked\n const wrapperKey = block.dataset.fieldKey;\n if (wrapperKey) {\n const state = this.fieldState.get(wrapperKey);\n if (state) {\n state.required = false;\n state.valid = true;\n state.value = \"\";\n this.fieldState.set(wrapperKey, state);\n }\n }\n\n this.clearErrorsInBlock(block);\n }\n });\n\n // \uD83D\uDD25 Recalculate validity after structural changes\n this.updateValidityForStep(this.currentStepIndex + 1);\n }\n\n private cacheOriginalRequiredState() {\n const inputs = this.form.querySelectorAll<\n HTMLInputElement | HTMLSelectElement | HTMLTextAreaElement\n >(\"input, select, textarea\");\n\n inputs.forEach((input) => {\n this.originalRequired.set(input, input.hasAttribute(\"required\"));\n });\n }\n\n private clearErrorsInBlock(block: HTMLElement) {\n block.querySelectorAll(\".field-error\").forEach((el) => el.remove());\n block.querySelectorAll(\".has-error\").forEach((el) =>\n el.classList.remove(\"has-error\")\n );\n }\n\n private initializeFieldState() {\n const trackables = this.form.querySelectorAll<HTMLElement>(\n \"[data-field-key]\"\n );\n\n trackables.forEach((el) => {\n const key = el.dataset.fieldKey;\n if (!key) return;\n\n const stepWrapper = el.closest<HTMLElement>(\"[data-msf='step']\");\n const stepNumber = stepWrapper\n ? Number(stepWrapper.dataset.step)\n : this.currentStepIndex + 1;\n\n this.fieldState.set(key, {\n \"field-name\": key,\n value: \"\",\n required: false,\n valid: true,\n \"step-number\": stepNumber\n });\n });\n }\n\n private updateFieldState(key: string) {\n const element = this.form.querySelector<HTMLElement>(\n `[data-field-key=\"${key}\"]`\n );\n if (!element) return;\n\n let value = \"\";\n let required = false;\n\n // If wrapper group\n if (element.hasAttribute(\"data-group\")) {\n const inputs = Array.from(\n element.querySelectorAll<HTMLInputElement>(\n \"input[type='radio'], input[type='checkbox']\"\n )\n ).filter((i) => !i.disabled);\n\n required = element.hasAttribute(\"data-required-group\");\n\n if (inputs.some((i) => i.type === \"radio\")) {\n const checked = inputs.find((i) => i.checked);\n\n if (checked) {\n const span = checked.closest(\"label\")?.querySelector(\"span\");\n value = span?.textContent?.trim() ?? checked.value ?? \"\";\n } else {\n value = \"\";\n }\n } else {\n const checkedValues = inputs\n .filter((i) => i.checked)\n .map((i) => {\n const span = i.closest(\"label\")?.querySelector(\"span\");\n return span?.textContent?.trim() ?? i.value ?? \"\";\n });\n\n value = checkedValues.join(\",\");\n }\n }\n // Legal wrapper\n else if (element.hasAttribute(\"data-required-legal\")) {\n const checkbox = element.querySelector<HTMLInputElement>(\n \"input[type='checkbox']\"\n );\n\n if (checkbox && !checkbox.disabled) {\n required = true;\n value = checkbox.checked ? \"true\" : \"false\";\n }\n }\n // Normal input\n else if (\n element instanceof HTMLInputElement ||\n element instanceof HTMLSelectElement ||\n element instanceof HTMLTextAreaElement\n ) {\n required = element.hasAttribute(\"required\") && !element.disabled;\n\n if (element instanceof HTMLInputElement && element.type === \"checkbox\") {\n value = element.checked ? \"true\" : \"false\";\n } else {\n value = (element as HTMLInputElement | HTMLTextAreaElement | HTMLSelectElement).value.trim();\n }\n }\n\n const stepWrapper = element.closest<HTMLElement>(\"[data-msf='step']\");\n const stepNumber = stepWrapper\n ? Number(stepWrapper.dataset.step)\n : this.currentStepIndex + 1;\n\n const state = this.fieldState.get(key);\n if (!state) return;\n\n state.value = value;\n state.required = required;\n state[\"step-number\"] = stepNumber;\n\n this.fieldState.set(key, state);\n\n this.updateValidityForStep(stepNumber);\n }\n\n private updateValidityForStep(stepNumber: number) {\n const stepIndex = this.steps.findIndex(\n (step) => Number(step.dataset.step) === stepNumber\n );\n\n if (stepIndex === -1) return;\n\n const errors = this.validateStep(stepIndex);\n\n const keysInStep = Array.from(this.fieldState.values()).filter(\n (f) => f[\"step-number\"] === stepNumber\n );\n\n keysInStep.forEach((field) => {\n field.valid = !errors[field[\"field-name\"]];\n });\n }\n\n public getFormStateJSON(): FieldState[] {\n return Array.from(this.fieldState.values());\n }\n\n private updateStepText(stepNumber: number) {\n const config = STEP_TEXT[stepNumber];\n if (!config) return;\n\n if (config.heading) {\n const headingEl = this.form.querySelector<HTMLElement>(\n '[data-dynamic-text=\"heading\"]'\n );\n if (headingEl) headingEl.textContent = config.heading;\n }\n\n if (config.subheading) {\n const subheadingEl = this.form.querySelector<HTMLElement>(\n '[data-dynamic-text=\"subheading\"]'\n );\n if (subheadingEl) subheadingEl.textContent = config.subheading;\n }\n\n if (config.counter) {\n const counterEl = this.form.querySelector<HTMLElement>(\n '[data-dynamic-text=\"counter\"]'\n );\n if (counterEl) counterEl.textContent = config.counter;\n }\n }\n\n private syncAllFieldState() {\n this.fieldState.forEach((_state, key) => {\n this.updateFieldState(key);\n });\n }\n\n private mirrorFieldStateToDOM() {\n const allFields = this.getFormStateJSON();\n const hubspotForm = document.getElementById(\"form-hubspot-book-a-demo\");\n\n allFields.forEach((field) => {\n const mirrorEl = hubspotForm?.querySelector<\n HTMLInputElement | HTMLTextAreaElement | HTMLSelectElement\n >(`[data-mirror=\"${field[\"field-name\"]}\"]`);\n\n if (!mirrorEl) {\n console.warn(\n `[Mirror] No element found with data-mirror=\"${field[\"field-name\"]}\"`\n );\n return;\n }\n\n // Skip disabled mirrors just in case\n if (\n mirrorEl instanceof HTMLInputElement &&\n mirrorEl.disabled\n ) {\n return;\n }\n\n if (mirrorEl instanceof HTMLInputElement) {\n if (mirrorEl.type === \"checkbox\") {\n mirrorEl.checked = field.value === \"true\";\n } else if (mirrorEl.type === \"radio\") {\n mirrorEl.checked = mirrorEl.value === field.value;\n } else {\n mirrorEl.value = field.value;\n }\n } else {\n mirrorEl.value = field.value;\n }\n });\n }\n\n}\n\n// Boot\ndocument.addEventListener(\"DOMContentLoaded\", () => {\n const form = document.querySelector<HTMLFormElement>('[data-msf=\"form\"]');\n if (!form) return;\n\n const itiInstances = initIntlTelInput({ root: form });\n\n const msf = new MultiStepForm(form, itiInstances);\n\n // expose globally for debugging\n (window as any).msf = msf;\n});"],
|
|
5
|
+
"mappings": "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",
|
|
6
|
+
"names": ["errorEl"]
|
|
7
|
+
}
|
|
File without changes
|
|
@@ -0,0 +1,2 @@
|
|
|
1
|
+
"use strict";(()=>{var Q=Object.create;var R=Object.defineProperty;var G=Object.getOwnPropertyDescriptor;var $=Object.getOwnPropertyNames;var X=Object.getPrototypeOf,j=Object.prototype.hasOwnProperty;var J=(e=>typeof require<"u"?require:typeof Proxy<"u"?new Proxy(e,{get:(t,r)=>(typeof require<"u"?require:t)[r]}):e)(function(e){if(typeof require<"u")return require.apply(this,arguments);throw Error('Dynamic require of "'+e+'" is not supported')});var K=(e,t,r,o)=>{if(t&&typeof t=="object"||typeof t=="function")for(let l of $(t))!j.call(e,l)&&l!==r&&R(e,l,{get:()=>t[l],enumerable:!(o=G(t,l))||o.enumerable});return e};var W=(e,t,r)=>(r=e!=null?Q(X(e)):{},K(t||!e||!e.__esModule?R(r,"default",{value:e,enumerable:!0}):r,e));function S(e={}){let{root:t=document,initialCountry:r="us",separateDialCode:o=!0,countryCodeSelector:l='input[pulse-form-field="country-code"]',onInit:n,onError:i=m=>console.warn(`[initIntlTelInput] ${m}`)}=e,u=new Map,d=window.intlTelInput;return d?(t.querySelectorAll('input[type="tel"]').forEach(m=>{try{let a=d(m,{initialCountry:r,separateDialCode:o,strictMode:!1,loadUtils:()=>import("https://cdn.jsdelivr.net/npm/intl-tel-input@25/build/js/utils.js")});u.set(m,a),M(a,l),m.addEventListener("countrychange",()=>{M(a,l)}),n?.(m,a)}catch(a){i(`Failed to init on input inside "${z(m)}"`,a)}}),u):(i(`intlTelInput not found on window. Include the script before calling this function.
|
|
2
|
+
e.g. <script src="https://cdn.jsdelivr.net/npm/intl-tel-input@25/build/js/intlTelInput.min.js"><\/script>`),u)}function M(e,t){try{let r=e.getSelectedCountryData?.();if(!r?.dialCode)return;document.querySelectorAll(t).forEach(o=>{o.value=`+${r.dialCode}`})}catch{}}function z(e){return e.closest("[pulse-form-block]")?.getAttribute("pulse-field-name")??"unknown"}var Z=["text","email","phone","checkbox","radio","select","legal"],ee=["true","atleast-one","only-one"],s={REQUIRED_INPUT:"ERR_REQUIRED",REQUIRED_LEGAL:"ERR_LEGAL_REQUIRED",REQUIRED_SELECT:"ERR_SELECT_REQUIRED",ATLEAST_ONE:"ERR_ATLEAST_ONE",ONLY_ONE_NONE:"ERR_ONLY_ONE_NONE",ONLY_ONE_EXCEEDED:"ERR_ONLY_ONE_EXCEEDED",INVALID_EMAIL:"ERR_INVALID_EMAIL",INVALID_PHONE:"ERR_INVALID_PHONE",PHONE_TOO_SHORT:"ERR_PHONE_TOO_SHORT",PHONE_TOO_LONG:"ERR_PHONE_TOO_LONG",PHONE_INVALID_COUNTRY:"ERR_PHONE_INVALID_COUNTRY"},T={[s.REQUIRED_INPUT]:"This field is required.",[s.REQUIRED_LEGAL]:"You must accept this to continue.",[s.REQUIRED_SELECT]:"Please select an option.",[s.ATLEAST_ONE]:"Please select at least one option.",[s.ONLY_ONE_NONE]:"Please select one option.",[s.ONLY_ONE_EXCEEDED]:"Only one option can be selected.",[s.INVALID_EMAIL]:"Please enter a valid email address.",[s.INVALID_PHONE]:"Please enter a valid phone number.",[s.PHONE_TOO_SHORT]:"Phone number is too short.",[s.PHONE_TOO_LONG]:"Phone number is too long.",[s.PHONE_INVALID_COUNTRY]:"Invalid country code."};function te(e){let t=e.querySelector("input, textarea");return t?t.value.trim():null}function re(e){let t=e.querySelector('input[type="email"]');return t?t.value.trim():null}function ne(e){let t=e.querySelector('input[type="tel"]');return t?t.value.trim():null}function oe(e){let t=e.querySelectorAll('input[type="checkbox"]'),r=[];return t.forEach(o=>{if(o.checked){let l=o.getAttribute("data-name")?.trim();r.push(l||o.value||"on")}}),r}function le(e){let t=e.querySelectorAll('input[type="radio"]');for(let r of t)if(r.checked)return r.closest("label")?.textContent?.trim()||r.value||"on";return null}function ie(e){let t=e.querySelector("select");if(!t)return null;let r=t.value.trim();return!r||t.selectedIndex===0?null:r}function se(e){let t=e.querySelector('input[type="checkbox"]');return t?t.checked:!1}function I(e,t){switch(e){case"text":return te(t);case"email":return re(t);case"phone":return ne(t);case"checkbox":return oe(t);case"radio":return le(t);case"select":return ie(t);case"legal":return se(t);default:return null}}function ce(e){let t=e.getAttribute("required-selection")?.trim().toLowerCase();return!t||!ee.includes(t)?null:t}function ae(e){return e.getAttribute("mirror-value")?.trim().toLowerCase()==="true"}var ue={0:s.INVALID_PHONE,1:s.PHONE_INVALID_COUNTRY,2:s.PHONE_TOO_SHORT,3:s.PHONE_TOO_LONG,4:s.INVALID_PHONE};function de(e){return e?/^[^\s@]+@[^\s@]+\.[^\s@]+$/.test(e)?null:{code:s.INVALID_EMAIL,message:T[s.INVALID_EMAIL]}:null}function me(e,t){let r=e.value.trim();if(!r)return null;let o=t?.get(e);if(o)try{if(o.isValidNumber())return null;let n=o.getValidationError?.()??0,i=ue[n]||s.INVALID_PHONE;return{code:i,message:T[i]}}catch{return{code:s.INVALID_PHONE,message:T[s.INVALID_PHONE]}}let l=r.replace(/\D/g,"");return l.length<7?{code:s.PHONE_TOO_SHORT,message:T[s.PHONE_TOO_SHORT]}:l.length>15?{code:s.PHONE_TOO_LONG,message:T[s.PHONE_TOO_LONG]}:null}function O(e,t,r,o,l){if(t)switch(t){case"true":{if(e==="legal"&&r!==!0)return{code:s.REQUIRED_LEGAL,message:T[s.REQUIRED_LEGAL]};if(e==="select"&&!r)return{code:s.REQUIRED_SELECT,message:T[s.REQUIRED_SELECT]};if((e==="text"||e==="email"||e==="phone")&&(!r||typeof r=="string"&&r===""))return{code:s.REQUIRED_INPUT,message:T[s.REQUIRED_INPUT]};break}case"atleast-one":{if(Array.isArray(r)?r.length===0:!r)return{code:s.ATLEAST_ONE,message:T[s.ATLEAST_ONE]};break}case"only-one":{if(Array.isArray(r)){if(r.length===0)return{code:s.ONLY_ONE_NONE,message:T[s.ONLY_ONE_NONE]};if(r.length>1)return{code:s.ONLY_ONE_EXCEEDED,message:T[s.ONLY_ONE_EXCEEDED]}}else if(!r)return{code:s.ONLY_ONE_NONE,message:T[s.ONLY_ONE_NONE]};break}}if(e==="email"&&typeof r=="string"&&r){let n=de(r);if(n)return n}if(e==="phone"&&typeof r=="string"&&r){let n=o.querySelector('input[type="tel"]');if(n){let i=me(n,l);if(i)return i}}return null}function x(e={}){let{validate:t=!1,root:r=document,itiInstances:o}=e,l=r.querySelectorAll("[pulse-form-block]"),n=[];return l.forEach(i=>{let u=i.getAttribute("pulse-form-block")?.trim().toLowerCase();if(!u||!Z.includes(u))return;let d=u,f=i.getAttribute("pulse-field-name")?.trim();if(!f)return;let m=ce(i),a=ae(i),p=I(d,i),E=t?O(d,m,p,i,o):null;n.push({"form-block":d,"field-name":f,value:p,required:m,"mirror-value":a,error:E})}),n}var F=[],Ee=["text","email","phone","checkbox","radio","select","legal"],A=[];function _(e){return A.push(e),()=>{let t=A.indexOf(e);t!==-1&&A.splice(t,1)}}function P(){for(let e of A)try{e(F)}catch(t){console.error("[SampleForm] Error in onFieldsUpdate callback:",t)}}function v(e=document){return F=x({root:e}),window.PulseFormData=F,P(),console.log(`[SampleForm] Initialised ${F.length} fields.`),F}function k(e=document){let t=e.querySelectorAll("[pulse-form-block]");t.forEach(r=>{let o=r.getAttribute("pulse-form-block")?.trim().toLowerCase();if(!o||!Ee.includes(o))return;let l=()=>fe(r,e);switch(o){case"text":case"email":{let n=r.querySelector("input, textarea");n&&(n.addEventListener("input",l),n.addEventListener("change",l));break}case"phone":{let n=r.querySelector('input[type="tel"]');n&&(n.addEventListener("input",l),n.addEventListener("change",l),n.addEventListener("keyup",l),n.addEventListener("countrychange",l));break}case"checkbox":case"legal":{r.querySelectorAll('input[type="checkbox"]').forEach(n=>n.addEventListener("change",l));break}case"radio":{r.querySelectorAll('input[type="radio"]').forEach(n=>n.addEventListener("change",l));break}case"select":{let n=r.querySelector("select");n&&n.addEventListener("change",l);break}}}),console.log(`[SampleForm] Listeners bound to ${t.length} blocks.`)}function fe(e,t){let r=e.getAttribute("pulse-form-block")?.trim().toLowerCase(),o=e.getAttribute("pulse-field-name")?.trim();if(!o)return;let l=I(r,e),n=F.findIndex(i=>i["field-name"]===o);n!==-1&&(F[n]={...F[n],value:l,error:null},window.PulseFormData=F,P())}function y(){return F}var pe=["true","atleast-one","only-one"];function q(e,t={}){let{root:r=document,requiredAttribute:o="required-selection"}=t,l=[...e];return r.querySelectorAll("[pulse-form-block]").forEach(n=>{let i=n.getAttribute("pulse-field-name")?.trim();if(!i)return;let u=l.findIndex(m=>m["field-name"]===i);if(u===-1)return;let d=n.getAttribute(o)?.trim().toLowerCase()||"",f=pe.includes(d)?d:null;l[u]={...l[u],required:f}}),l}function C(e,t=document){t.querySelectorAll("[pulse-form-block]").forEach(r=>{let o=r.getAttribute("pulse-field-name")?.trim();if(!o)return;let l=e.find(n=>n["field-name"]===o);l&&(l.required?r.setAttribute("required-selection",l.required):r.removeAttribute("required-selection"))})}var Le="data-original-required-selection";function D(e,t={}){let{root:r=document,fieldName:o="flow-type",flowAttribute:l="form-flow",activeAttribute:n="form-flow-active",requiredAttribute:i="required-selection",originalRequiredAttribute:u=Le}=t,d=e.find(a=>a["field-name"]===o);if(!d)return e;let f=d.value;return r.querySelectorAll(`[${l}]`).forEach(a=>{let E=a.getAttribute(l)?.trim()===f;a.setAttribute(n,E?"true":"false");let c=[];a.hasAttribute("pulse-form-block")&&c.push(a),a.querySelectorAll("[pulse-form-block]").forEach(L=>{c.push(L)}),c.forEach(L=>{if(!L.hasAttribute(u)){let g=L.getAttribute(i)?.trim()||"";L.setAttribute(u,g)}if(E){let g=L.getAttribute(u)||"";L.setAttribute(i,g||"false")}else L.setAttribute(i,"false")})}),q(e,{root:r,requiredAttribute:i})}function V(e,t={}){let{root:r=document,onMissingInput:o,onMissingTarget:l}=t,n=e.filter(u=>u["mirror-value"]===!0);if(n.length===0)return;let i=r.querySelectorAll("[pulse-form-block-mirror]");n.forEach(u=>{let d=u["field-name"],f=!1;i.forEach(m=>{if(m.getAttribute("pulse-form-block-mirror")?.trim()!==d)return;f=!0;let p=m.querySelector("input, textarea, select");if(!p){o?.(d,m);return}Te(p,u.value)}),f||l?.(d)})}function Te(e,t){typeof t=="string"?e.value=t:typeof t=="boolean"?e instanceof HTMLInputElement&&e.type==="checkbox"?e.checked=t:e.value=String(t):Array.isArray(t)?e.value=t.join(", "):e.value=""}var N={errorClass:"pulse-form-error",wrapperErrorClass:"has-error",focusFirst:!0};function U(e,t){return t??e}function ge(e){let t=new Set;return e.querySelectorAll("[pulse-form-block]").forEach(r=>{let o=r.getAttribute("pulse-field-name")?.trim();o&&t.add(o)}),t}function h(e,t={}){let{root:r=document,scope:o,itiInstances:l,errorClass:n=N.errorClass,wrapperErrorClass:i=N.wrapperErrorClass,focusFirst:u=N.focusFirst}=t,d=U(r,o),f=d.querySelectorAll("[pulse-form-block]"),m=ge(d);ye(d,n,i);let a=e.map(c=>{if(!m.has(c["field-name"]))return c;let L=Ne(f,c["field-name"]);if(!L)return{...c,error:null};let g=O(c["form-block"],c.required,c.value,L,l);return g&&w(L,g,n,i),{...c,error:g}}),E=a.filter(c=>m.has(c["field-name"])).every(c=>c.error===null);return!E&&u&&Ie(d,i),{fields:a,isValid:E}}function H(e){let{root:t=document,scope:r,itiInstances:o,errorClass:l=N.errorClass,wrapperErrorClass:n=N.wrapperErrorClass,getFields:i,onFieldValidated:u}=e,d=["text","email","phone","checkbox","radio","select","legal"];U(t,r).querySelectorAll("[pulse-form-block]").forEach(a=>{let p=a.getAttribute("pulse-form-block")?.trim().toLowerCase();if(!p||!d.includes(p))return;let E=()=>{if(!a.classList.contains(n))return;let c=a.getAttribute("pulse-field-name")?.trim();if(!c)return;let g=i().find(Y=>Y["field-name"]===c);if(!g)return;let B=I(p,a),b=O(p,g.required,B,a,o);b?w(a,b,l,n):Fe(a,l,n),u?.(c,b)};switch(p){case"text":case"email":{let c=a.querySelector("input, textarea");c&&(c.addEventListener("input",E),c.addEventListener("change",E));break}case"phone":{let c=a.querySelector('input[type="tel"]');c&&(c.addEventListener("input",E),c.addEventListener("change",E),c.addEventListener("keyup",E),c.addEventListener("countrychange",E));break}case"checkbox":case"legal":{a.querySelectorAll('input[type="checkbox"]').forEach(c=>c.addEventListener("change",E));break}case"radio":{a.querySelectorAll('input[type="radio"]').forEach(c=>c.addEventListener("change",E));break}case"select":{let c=a.querySelector("select");c&&c.addEventListener("change",E);break}}})}function w(e,t,r,o){let l=e.querySelector(`.${r}`);l&&l.remove();let n=document.createElement("span");n.className=r,n.textContent=t.message,n.setAttribute("data-error-code",t.code),n.setAttribute("data-field-name",e.getAttribute("pulse-field-name")?.trim()||""),e.classList.add(o),e.appendChild(n)}function Fe(e,t,r){let o=e.querySelector(`.${t}`);o&&o.remove(),e.classList.remove(r)}function ye(e,t,r){e.querySelectorAll(`.${t}`).forEach(o=>o.remove()),e.querySelectorAll("[pulse-form-block]").forEach(o=>o.classList.remove(r))}function Ie(e,t){let r=e.querySelector(`[pulse-form-block].${t}`);if(!r)return;r.scrollIntoView({behavior:"smooth",block:"center"});let o=r.querySelector("input, textarea, select");o&&setTimeout(()=>o.focus(),400)}function Ne(e,t){return Array.from(e).find(r=>r.getAttribute("pulse-field-name")?.trim()===t)}document.addEventListener("DOMContentLoaded",()=>{let e=S();_(n=>{let i=D(n);window.PulseFormData=i}),_(n=>V(n)),v(),C(y()),k();let t=document.getElementById("step-2-container"),r=document.getElementById("step-2-button");H({scope:t,getFields:y,itiInstances:e}),r.addEventListener("click",n=>{n.preventDefault();let{fields:i,isValid:u}=h(y(),{scope:t,itiInstances:e});window.PulseFormData=i,u&&console.log("Step 2 valid, moving on...")});let o=document.getElementById("step-3-container"),l=document.getElementById("step-3-button");H({scope:o,getFields:y,itiInstances:e}),l.addEventListener("click",n=>{n.preventDefault(),console.log("step 3 clicked");let{fields:i,isValid:u}=h(y(),{scope:o,itiInstances:e});window.PulseFormData=i,console.log("Step 3 valid",u),u&&console.log("Step 3 valid, proceeding to submit...")})});})();
|
|
@@ -0,0 +1,7 @@
|
|
|
1
|
+
{
|
|
2
|
+
"version": 3,
|
|
3
|
+
"sources": ["../../src/form/utils/initIntlTelInput.ts", "../../src/form/utils/collectFormFields.ts", "../../src/form/utils/initFormControls.ts", "../../src/form/utils/updateRequiredFields.ts", "../../src/form/utils/updateFlowType.ts", "../../src/form/utils/fillMirrorValues.ts", "../../src/form/utils/validateForm.ts", "../../src/form/pricing.ts"],
|
|
4
|
+
"sourcesContent": ["// \u2500\u2500\u2500 initIntlTelInput.ts \u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\n// Reusable utility that initialises intl-tel-input on every phone field\n// inside a given root. Returns the instance map so callers can pass it\n// to collectFormFields / validatePhone when needed.\n//\n// Usage:\n// import { initIntlTelInput } from \"./initIntlTelInput\";\n// const itiInstances = initIntlTelInput();\n// const itiInstances = initIntlTelInput({ root: myDiv, initialCountry: \"gb\" });\n// \u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\n\nexport interface IntlTelInputOptions {\n /** Root element to scan for phone inputs. Default: document */\n root?: ParentNode;\n /** ISO-2 country code for default selection. Default: \"us\" */\n initialCountry?: string;\n /** Show dial code separately from the input. Default: true */\n separateDialCode?: boolean;\n /** Selector for hidden input(s) that should receive the dial code. Default: 'input[pulse-form-field=\"country-code\"]' */\n countryCodeSelector?: string;\n /** Called after each input is successfully initialised */\n onInit?: (input: HTMLInputElement, iti: any) => void;\n /** Called when intlTelInput is missing from window or an input fails */\n onError?: (message: string, error?: unknown) => void;\n}\n\n/**\n * Finds every `input[type=\"tel\"]` inside `[pulse-form-block=\"phone\"]`\n * wrappers, attaches intl-tel-input, and returns a Map of\n * `HTMLInputElement \u2192 iti instance` for downstream use (validation, etc.).\n */\nexport function initIntlTelInput(\n options: IntlTelInputOptions = {}\n): Map<HTMLInputElement, any> {\n const {\n root = document,\n initialCountry = \"us\",\n separateDialCode = true,\n countryCodeSelector = 'input[pulse-form-field=\"country-code\"]',\n onInit,\n onError = (msg) => console.warn(`[initIntlTelInput] ${msg}`),\n } = options;\n\n const instances = new Map<HTMLInputElement, any>();\n\n // \u2500\u2500 Guard: library must be loaded first \u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\n const intlTelInput = (window as any).intlTelInput;\n if (!intlTelInput) {\n onError(\n \"intlTelInput not found on window. \" +\n \"Include the script before calling this function.\\n\" +\n 'e.g. <script src=\"https://cdn.jsdelivr.net/npm/intl-tel-input@25/build/js/intlTelInput.min.js\"></script>'\n );\n return instances;\n }\n\n // \u2500\u2500 Find phone inputs \u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\n const phoneInputs = root.querySelectorAll<HTMLInputElement>(\n 'input[type=\"tel\"]'\n );\n\n phoneInputs.forEach((input) => {\n try {\n const iti = intlTelInput(input, {\n initialCountry,\n separateDialCode,\n strictMode: false,\n // @ts-ignore \u2014 runtime CDN import\n loadUtils: () =>\n import(\n // @ts-ignore \u2014 runtime CDN import, not a TS module\n \"https://cdn.jsdelivr.net/npm/intl-tel-input@25/build/js/utils.js\"\n ),\n });\n\n instances.set(input, iti);\n\n // Fill hidden country-code input(s) on load + on change\n fillCountryCode(iti, countryCodeSelector);\n input.addEventListener(\"countrychange\", () => {\n fillCountryCode(iti, countryCodeSelector);\n });\n\n onInit?.(input, iti);\n } catch (err) {\n onError(`Failed to init on input inside \"${fieldNameOf(input)}\"`, err);\n }\n });\n\n return instances;\n}\n\n// \u2500\u2500\u2500 Helpers \u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\n\nfunction fillCountryCode(iti: any, selector: string): void {\n try {\n const countryData = iti.getSelectedCountryData?.();\n if (!countryData?.dialCode) return;\n\n document.querySelectorAll<HTMLInputElement>(selector).forEach((input) => {\n input.value = `+${countryData.dialCode}`;\n });\n } catch {\n // silently ignore \u2014 non-critical\n }\n}\n\nfunction fieldNameOf(input: HTMLInputElement): string {\n return (\n input.closest(\"[pulse-form-block]\")?.getAttribute(\"pulse-field-name\") ??\n \"unknown\"\n );\n}", "// \u2500\u2500\u2500 collectFormFields.ts \u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\n// Standalone, reusable module for scanning DOM form blocks and producing a\n// typed JSON array. Zero side-effects \u2014 it only *reads* the DOM.\n//\n// Usage:\n// import { collectFormFields, PulseFormField } from \"./collectFormFields\";\n// const fields = collectFormFields(); // no validation\n// const fields = collectFormFields({ validate: true, itiInstances }); // with validation\n// \u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\n\nexport type FormBlockType =\n | \"text\"\n | \"email\"\n | \"phone\"\n | \"checkbox\"\n | \"radio\"\n | \"select\"\n | \"legal\";\n\nexport type RequiredSelection = \"true\" | \"atleast-one\" | \"only-one\";\n\nexport interface FieldError {\n code: string;\n message: string;\n}\n\nexport interface PulseFormField {\n \"form-block\": FormBlockType;\n \"field-name\": string;\n value: string | string[] | boolean | null;\n required: RequiredSelection | null;\n \"mirror-value\": boolean;\n error: FieldError | null;\n}\n\nexport interface CollectOptions {\n /** Run validation while collecting. Default: false */\n validate?: boolean;\n /** Root element to scan inside. Default: document */\n root?: ParentNode;\n /** intl-tel-input instance map \u2014 needed only when validate is true and phone fields exist */\n itiInstances?: Map<HTMLInputElement, any>;\n}\n\n// \u2500\u2500\u2500 Constants \u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\n\nconst VALID_BLOCK_TYPES: FormBlockType[] = [\n \"text\",\n \"email\",\n \"phone\",\n \"checkbox\",\n \"radio\",\n \"select\",\n \"legal\",\n];\n\nconst VALID_REQUIRED_VALUES: RequiredSelection[] = [\n \"true\",\n \"atleast-one\",\n \"only-one\",\n];\n\n// \u2500\u2500\u2500 Error Codes & Messages \u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\n\nexport const ERROR_CODES = {\n REQUIRED_INPUT: \"ERR_REQUIRED\",\n REQUIRED_LEGAL: \"ERR_LEGAL_REQUIRED\",\n REQUIRED_SELECT: \"ERR_SELECT_REQUIRED\",\n ATLEAST_ONE: \"ERR_ATLEAST_ONE\",\n ONLY_ONE_NONE: \"ERR_ONLY_ONE_NONE\",\n ONLY_ONE_EXCEEDED: \"ERR_ONLY_ONE_EXCEEDED\",\n INVALID_EMAIL: \"ERR_INVALID_EMAIL\",\n INVALID_PHONE: \"ERR_INVALID_PHONE\",\n PHONE_TOO_SHORT: \"ERR_PHONE_TOO_SHORT\",\n PHONE_TOO_LONG: \"ERR_PHONE_TOO_LONG\",\n PHONE_INVALID_COUNTRY: \"ERR_PHONE_INVALID_COUNTRY\",\n} as const;\n\nexport const ERROR_MESSAGES: Record<string, string> = {\n [ERROR_CODES.REQUIRED_INPUT]: \"This field is required.\",\n [ERROR_CODES.REQUIRED_LEGAL]: \"You must accept this to continue.\",\n [ERROR_CODES.REQUIRED_SELECT]: \"Please select an option.\",\n [ERROR_CODES.ATLEAST_ONE]: \"Please select at least one option.\",\n [ERROR_CODES.ONLY_ONE_NONE]: \"Please select one option.\",\n [ERROR_CODES.ONLY_ONE_EXCEEDED]: \"Only one option can be selected.\",\n [ERROR_CODES.INVALID_EMAIL]: \"Please enter a valid email address.\",\n [ERROR_CODES.INVALID_PHONE]: \"Please enter a valid phone number.\",\n [ERROR_CODES.PHONE_TOO_SHORT]: \"Phone number is too short.\",\n [ERROR_CODES.PHONE_TOO_LONG]: \"Phone number is too long.\",\n [ERROR_CODES.PHONE_INVALID_COUNTRY]: \"Invalid country code.\",\n};\n\n// \u2500\u2500\u2500 Value Extractors \u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\n\nfunction extractTextValue(wrapper: HTMLElement): string | null {\n const input = wrapper.querySelector<HTMLInputElement | HTMLTextAreaElement>(\n \"input, textarea\"\n );\n return input ? input.value.trim() : null;\n}\n\nfunction extractEmailValue(wrapper: HTMLElement): string | null {\n const input = wrapper.querySelector<HTMLInputElement>('input[type=\"email\"]');\n return input ? input.value.trim() : null;\n}\n\nfunction extractPhoneValue(wrapper: HTMLElement): string | null {\n const input = wrapper.querySelector<HTMLInputElement>('input[type=\"tel\"]');\n return input ? input.value.trim() : null;\n}\n\nfunction extractCheckboxValues(wrapper: HTMLElement): string[] {\n const checkboxes = wrapper.querySelectorAll<HTMLInputElement>(\n 'input[type=\"checkbox\"]'\n );\n const values: string[] = [];\n checkboxes.forEach((cb) => {\n if (cb.checked) {\n const name = cb.getAttribute(\"data-name\")?.trim();\n values.push(name || cb.value || \"on\");\n }\n });\n return values;\n}\n\nfunction extractRadioValue(wrapper: HTMLElement): string | null {\n const radios = wrapper.querySelectorAll<HTMLInputElement>(\n 'input[type=\"radio\"]'\n );\n for (const radio of radios) {\n if (radio.checked) {\n const label = radio.closest(\"label\")?.textContent?.trim();\n return label || radio.value || \"on\";\n }\n }\n return null;\n}\n\nfunction extractSelectValue(wrapper: HTMLElement): string | null {\n const select = wrapper.querySelector<HTMLSelectElement>(\"select\");\n if (!select) return null;\n const val = select.value.trim();\n if (!val || select.selectedIndex === 0) return null;\n return val;\n}\n\nfunction extractLegalValue(wrapper: HTMLElement): boolean {\n const checkbox = wrapper.querySelector<HTMLInputElement>(\n 'input[type=\"checkbox\"]'\n );\n return checkbox ? checkbox.checked : false;\n}\n\nexport function extractValue(\n type: FormBlockType,\n wrapper: HTMLElement\n): PulseFormField[\"value\"] {\n switch (type) {\n case \"text\":\n return extractTextValue(wrapper);\n case \"email\":\n return extractEmailValue(wrapper);\n case \"phone\":\n return extractPhoneValue(wrapper);\n case \"checkbox\":\n return extractCheckboxValues(wrapper);\n case \"radio\":\n return extractRadioValue(wrapper);\n case \"select\":\n return extractSelectValue(wrapper);\n case \"legal\":\n return extractLegalValue(wrapper);\n default:\n return null;\n }\n}\n\n// \u2500\u2500\u2500 Attribute Parsers \u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\n\nexport function parseRequired(wrapper: HTMLElement): RequiredSelection | null {\n const raw = wrapper.getAttribute(\"required-selection\")?.trim().toLowerCase();\n if (!raw || !VALID_REQUIRED_VALUES.includes(raw as RequiredSelection))\n return null;\n return raw as RequiredSelection;\n}\n\nexport function parseMirrorValue(wrapper: HTMLElement): boolean {\n return wrapper.getAttribute(\"mirror-value\")?.trim().toLowerCase() === \"true\";\n}\n\n// \u2500\u2500\u2500 Format Validators \u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\n\nconst PHONE_ITI_ERROR_MAP: Record<number, string> = {\n 0: ERROR_CODES.INVALID_PHONE,\n 1: ERROR_CODES.PHONE_INVALID_COUNTRY,\n 2: ERROR_CODES.PHONE_TOO_SHORT,\n 3: ERROR_CODES.PHONE_TOO_LONG,\n 4: ERROR_CODES.INVALID_PHONE,\n};\n\nexport function validateEmail(value: string): FieldError | null {\n if (!value) return null;\n const emailRegex = /^[^\\s@]+@[^\\s@]+\\.[^\\s@]+$/;\n if (!emailRegex.test(value)) {\n return {\n code: ERROR_CODES.INVALID_EMAIL,\n message: ERROR_MESSAGES[ERROR_CODES.INVALID_EMAIL],\n };\n }\n return null;\n}\n\nexport function validatePhone(\n input: HTMLInputElement,\n itiInstances?: Map<HTMLInputElement, any>\n): FieldError | null {\n const value = input.value.trim();\n if (!value) return null;\n\n const iti = itiInstances?.get(input);\n\n if (iti) {\n try {\n if (iti.isValidNumber()) return null;\n const errorCode: number = iti.getValidationError?.() ?? 0;\n const code =\n PHONE_ITI_ERROR_MAP[errorCode] || ERROR_CODES.INVALID_PHONE;\n return { code, message: ERROR_MESSAGES[code] };\n } catch {\n return {\n code: ERROR_CODES.INVALID_PHONE,\n message: ERROR_MESSAGES[ERROR_CODES.INVALID_PHONE],\n };\n }\n }\n\n // Fallback: basic digit length\n const digits = value.replace(/\\D/g, \"\");\n if (digits.length < 7)\n return {\n code: ERROR_CODES.PHONE_TOO_SHORT,\n message: ERROR_MESSAGES[ERROR_CODES.PHONE_TOO_SHORT],\n };\n if (digits.length > 15)\n return {\n code: ERROR_CODES.PHONE_TOO_LONG,\n message: ERROR_MESSAGES[ERROR_CODES.PHONE_TOO_LONG],\n };\n return null;\n}\n\n// \u2500\u2500\u2500 Field-Level Validation \u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\n\nexport function getFieldError(\n type: FormBlockType,\n required: RequiredSelection | null,\n value: PulseFormField[\"value\"],\n wrapper: HTMLElement,\n itiInstances?: Map<HTMLInputElement, any>\n): FieldError | null {\n // 1. Required checks\n if (required) {\n switch (required) {\n case \"true\": {\n if (type === \"legal\" && value !== true)\n return {\n code: ERROR_CODES.REQUIRED_LEGAL,\n message: ERROR_MESSAGES[ERROR_CODES.REQUIRED_LEGAL],\n };\n if (type === \"select\" && !value)\n return {\n code: ERROR_CODES.REQUIRED_SELECT,\n message: ERROR_MESSAGES[ERROR_CODES.REQUIRED_SELECT],\n };\n if (\n (type === \"text\" || type === \"email\" || type === \"phone\") &&\n (!value || (typeof value === \"string\" && value === \"\"))\n )\n return {\n code: ERROR_CODES.REQUIRED_INPUT,\n message: ERROR_MESSAGES[ERROR_CODES.REQUIRED_INPUT],\n };\n break;\n }\n case \"atleast-one\": {\n const empty = Array.isArray(value) ? value.length === 0 : !value;\n if (empty)\n return {\n code: ERROR_CODES.ATLEAST_ONE,\n message: ERROR_MESSAGES[ERROR_CODES.ATLEAST_ONE],\n };\n break;\n }\n case \"only-one\": {\n if (Array.isArray(value)) {\n if (value.length === 0)\n return {\n code: ERROR_CODES.ONLY_ONE_NONE,\n message: ERROR_MESSAGES[ERROR_CODES.ONLY_ONE_NONE],\n };\n if (value.length > 1)\n return {\n code: ERROR_CODES.ONLY_ONE_EXCEEDED,\n message: ERROR_MESSAGES[ERROR_CODES.ONLY_ONE_EXCEEDED],\n };\n } else if (!value) {\n return {\n code: ERROR_CODES.ONLY_ONE_NONE,\n message: ERROR_MESSAGES[ERROR_CODES.ONLY_ONE_NONE],\n };\n }\n break;\n }\n }\n }\n\n // 2. Format checks (only when there's a value)\n if (type === \"email\" && typeof value === \"string\" && value) {\n const emailError = validateEmail(value);\n if (emailError) return emailError;\n }\n\n if (type === \"phone\" && typeof value === \"string\" && value) {\n const phoneInput = wrapper.querySelector<HTMLInputElement>(\n 'input[type=\"tel\"]'\n );\n if (phoneInput) {\n const phoneError = validatePhone(phoneInput, itiInstances);\n if (phoneError) return phoneError;\n }\n }\n\n return null;\n}\n\n// \u2500\u2500\u2500 Main Export \u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\n\n/**\n * Scans the DOM for `[pulse-form-block]` elements and returns a typed JSON\n * array describing every field's current state.\n *\n * Pure read \u2014 no DOM mutations, no global side-effects.\n */\nexport function collectFormFields(\n options: CollectOptions = {}\n): PulseFormField[] {\n const { validate = false, root = document, itiInstances } = options;\n\n const wrappers = root.querySelectorAll<HTMLElement>(\"[pulse-form-block]\");\n const fields: PulseFormField[] = [];\n\n wrappers.forEach((wrapper) => {\n const rawType = wrapper\n .getAttribute(\"pulse-form-block\")\n ?.trim()\n .toLowerCase();\n\n if (!rawType || !VALID_BLOCK_TYPES.includes(rawType as FormBlockType))\n return;\n\n const blockType = rawType as FormBlockType;\n const fieldName = wrapper.getAttribute(\"pulse-field-name\")?.trim();\n if (!fieldName) return;\n\n const required = parseRequired(wrapper);\n const mirrorValue = parseMirrorValue(wrapper);\n const value = extractValue(blockType, wrapper);\n const error = validate\n ? getFieldError(blockType, required, value, wrapper, itiInstances)\n : null;\n\n fields.push({\n \"form-block\": blockType,\n \"field-name\": fieldName,\n value,\n required,\n \"mirror-value\": mirrorValue,\n error,\n });\n });\n\n return fields;\n}", "// \u2500\u2500\u2500 sample.ts \u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\n// Drop-in usage of the reusable form modules on any page with\n// [pulse-form-block] elements. Two things happen:\n// 1. initFormJSON() \u2014 scans the DOM, builds the fields array\n// 2. bindFormListeners() \u2014 keeps the JSON in sync as the user interacts\n//\n// Register post-update hooks via onFieldsUpdate():\n// onFieldsUpdate((fields) => updateFlowType(fields));\n// onFieldsUpdate((fields) => fillMirrorValues(fields));\n// \u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\n\nimport {\n collectFormFields,\n extractValue,\n type PulseFormField,\n type FormBlockType,\n} from \"./collectFormFields\";\n\n// \u2500\u2500\u2500 State \u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\n\nlet _fields: PulseFormField[] = [];\n\nconst VALID_BLOCK_TYPES: FormBlockType[] = [\n \"text\", \"email\", \"phone\", \"checkbox\", \"radio\", \"select\", \"legal\",\n];\n\n// \u2500\u2500\u2500 Post-Update Hook System \u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\n\ntype FieldsUpdateCallback = (fields: PulseFormField[]) => void;\n\nconst _updateCallbacks: FieldsUpdateCallback[] = [];\n\n/**\n * Register a function that runs every time the fields JSON is updated.\n * Callbacks fire in the order they were registered.\n *\n * Returns an unsubscribe function.\n *\n * @example\n * const unsub = onFieldsUpdate((fields) => updateFlowType(fields));\n * // later: unsub();\n */\nexport function onFieldsUpdate(cb: FieldsUpdateCallback): () => void {\n _updateCallbacks.push(cb);\n return () => {\n const idx = _updateCallbacks.indexOf(cb);\n if (idx !== -1) _updateCallbacks.splice(idx, 1);\n };\n}\n\n/** Runs all registered callbacks with the current fields. */\nfunction notifyUpdate(): void {\n for (const cb of _updateCallbacks) {\n try {\n cb(_fields);\n } catch (err) {\n console.error(\"[SampleForm] Error in onFieldsUpdate callback:\", err);\n }\n }\n}\n\n// \u2500\u2500\u2500 1. Initialise JSON \u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\n\n/**\n * Scans the DOM (or a subtree) for form blocks, builds the typed JSON array,\n * and fires all registered update callbacks.\n *\n * Call once on page load / after dynamic content is injected.\n */\nexport function initFormJSON(root: ParentNode = document): PulseFormField[] {\n _fields = collectFormFields({ root });\n (window as any).PulseFormData = _fields;\n\n notifyUpdate();\n\n console.log(`[SampleForm] Initialised ${_fields.length} fields.`);\n return _fields;\n}\n\n// \u2500\u2500\u2500 2. Bind Reactive Listeners \u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\n\n/**\n * Attaches input / change listeners to every form block so the JSON\n * array stays up-to-date as the user types, selects, or checks.\n *\n * Call once after `initFormJSON()`.\n */\nexport function bindFormListeners(root: ParentNode = document): void {\n const wrappers = root.querySelectorAll<HTMLElement>(\"[pulse-form-block]\");\n\n wrappers.forEach((wrapper) => {\n const type = wrapper\n .getAttribute(\"pulse-form-block\")\n ?.trim()\n .toLowerCase() as FormBlockType | undefined;\n\n if (!type || !VALID_BLOCK_TYPES.includes(type)) return;\n\n const onChange = () => handleChange(wrapper, root);\n\n switch (type) {\n case \"text\":\n case \"email\": {\n const input = wrapper.querySelector<HTMLInputElement | HTMLTextAreaElement>(\n \"input, textarea\"\n );\n if (input) {\n input.addEventListener(\"input\", onChange);\n input.addEventListener(\"change\", onChange);\n }\n break;\n }\n\n case \"phone\": {\n const phoneInput = wrapper.querySelector<HTMLInputElement>('input[type=\"tel\"]');\n if (phoneInput) {\n phoneInput.addEventListener(\"input\", onChange);\n phoneInput.addEventListener(\"change\", onChange);\n phoneInput.addEventListener(\"keyup\", onChange);\n phoneInput.addEventListener(\"countrychange\", onChange);\n }\n break;\n }\n\n case \"checkbox\":\n case \"legal\": {\n wrapper\n .querySelectorAll<HTMLInputElement>('input[type=\"checkbox\"]')\n .forEach((cb) => cb.addEventListener(\"change\", onChange));\n break;\n }\n\n case \"radio\": {\n wrapper\n .querySelectorAll<HTMLInputElement>('input[type=\"radio\"]')\n .forEach((r) => r.addEventListener(\"change\", onChange));\n break;\n }\n\n case \"select\": {\n const select = wrapper.querySelector<HTMLSelectElement>(\"select\");\n if (select) select.addEventListener(\"change\", onChange);\n break;\n }\n }\n });\n\n console.log(`[SampleForm] Listeners bound to ${wrappers.length} blocks.`);\n}\n\n// \u2500\u2500\u2500 Internal: handle a single field change \u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\n\nfunction handleChange(wrapper: HTMLElement, root: ParentNode): void {\n const rawType = wrapper\n .getAttribute(\"pulse-form-block\")\n ?.trim()\n .toLowerCase() as FormBlockType;\n const fieldName = wrapper.getAttribute(\"pulse-field-name\")?.trim();\n if (!fieldName) return;\n\n const value = extractValue(rawType, wrapper);\n\n const idx = _fields.findIndex((f) => f[\"field-name\"] === fieldName);\n if (idx === -1) return;\n\n _fields[idx] = { ..._fields[idx], value, error: null };\n (window as any).PulseFormData = _fields;\n\n notifyUpdate();\n}\n\n// \u2500\u2500\u2500 Convenience: read current state from anywhere \u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\n\nexport function getFormFields(): PulseFormField[] {\n return _fields;\n}", "// \u2500\u2500\u2500 updateRequiredFields.ts \u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\n// Reads `required-selection` from every `[pulse-form-block]` in the DOM\n// and syncs it into the fields JSON array.\n//\n// Usage:\n// import { updateRequiredFields } from \"./updateRequiredFields\";\n// const updated = updateRequiredFields(fields);\n// \u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\n\nimport type { PulseFormField, RequiredSelection } from \"./collectFormFields\";\n\nexport interface UpdateRequiredOptions {\n /** Root element to scan. Default: document */\n root?: ParentNode;\n /** The attribute to read from. Default: \"required-selection\" */\n requiredAttribute?: string;\n}\n\nconst VALID_REQUIRED: RequiredSelection[] = [\"true\", \"atleast-one\", \"only-one\"];\n\n/**\n * Scans all `[pulse-form-block]` elements, reads their current\n * `required-selection` attribute, and returns a new fields array\n * with `required` updated to match the DOM.\n */\nexport function updateRequiredFields(\n fields: PulseFormField[],\n options: UpdateRequiredOptions = {}\n): PulseFormField[] {\n const {\n root = document,\n requiredAttribute = \"required-selection\",\n } = options;\n\n const updated = [...fields];\n\n root.querySelectorAll<HTMLElement>(\"[pulse-form-block]\").forEach((block) => {\n const fieldName = block.getAttribute(\"pulse-field-name\")?.trim();\n if (!fieldName) return;\n\n const idx = updated.findIndex((f) => f[\"field-name\"] === fieldName);\n if (idx === -1) return;\n\n const raw = block.getAttribute(requiredAttribute)?.trim().toLowerCase() || \"\";\n const parsed = VALID_REQUIRED.includes(raw as RequiredSelection)\n ? (raw as RequiredSelection)\n : null;\n\n updated[idx] = { ...updated[idx], required: parsed };\n });\n\n return updated;\n}\n\n\n/**\n * Syncs `required` from the fields JSON back into the DOM attributes,\n * so that `collectFormFields` reads the correct values.\n */\nexport function syncRequiredToDOM(\n fields: PulseFormField[],\n root: ParentNode = document\n): void {\n root.querySelectorAll<HTMLElement>(\"[pulse-form-block]\").forEach((block) => {\n const name = block.getAttribute(\"pulse-field-name\")?.trim();\n if (!name) return;\n\n const field = fields.find((f) => f[\"field-name\"] === name);\n if (!field) return;\n\n if (field.required) {\n block.setAttribute(\"required-selection\", field.required);\n } else {\n block.removeAttribute(\"required-selection\");\n }\n });\n}", "// \u2500\u2500\u2500 updateFlowType.ts \u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\n// Reusable utility that toggles `form-flow-active` and `required-selection`\n// attributes on DOM elements based on the current flow field value,\n// then syncs the updated required values back into the fields JSON.\n//\n// Usage:\n// import { updateFlowType } from \"./updateFlowType\";\n// const updatedFields = updateFlowType(fields);\n// \u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\n\nimport type { PulseFormField } from \"./collectFormFields\";\nimport { updateRequiredFields } from \"./updateRequiredFields\";\n\nexport interface FlowTypeOptions {\n /** Root element to scan for [form-flow] elements. Default: document */\n root?: ParentNode;\n /** The field-name to read the flow value from. Default: \"flow-type\" */\n fieldName?: string;\n /** The attribute on target elements that holds the flow identifier. Default: \"form-flow\" */\n flowAttribute?: string;\n /** The attribute toggled to \"true\"/\"false\". Default: \"form-flow-active\" */\n activeAttribute?: string;\n /** The attribute set on pulse-form-blocks. Default: \"required-selection\" */\n requiredAttribute?: string;\n /** Data attribute used to persist the original required value. Default: \"data-original-required-selection\" */\n originalRequiredAttribute?: string;\n}\n\nconst ORIGINAL_ATTR_DEFAULT = \"data-original-required-selection\";\n\n/**\n * 1. Updates DOM attributes (`form-flow-active`, `required-selection`)\n * 2. Calls `updateRequiredFields()` to sync DOM \u2192 JSON\n * 3. Returns the updated fields array\n */\nexport function updateFlowType(\n fields: PulseFormField[],\n options: FlowTypeOptions = {}\n): PulseFormField[] {\n const {\n root = document,\n fieldName = \"flow-type\",\n flowAttribute = \"form-flow\",\n activeAttribute = \"form-flow-active\",\n requiredAttribute = \"required-selection\",\n originalRequiredAttribute = ORIGINAL_ATTR_DEFAULT,\n } = options;\n\n const flowField = fields.find((f) => f[\"field-name\"] === fieldName);\n if (!flowField) return fields;\n\n const flowValue = flowField.value;\n\n root.querySelectorAll<HTMLElement>(`[${flowAttribute}]`).forEach((el) => {\n const elValue = el.getAttribute(flowAttribute)?.trim();\n const isActive = elValue === flowValue;\n\n el.setAttribute(activeAttribute, isActive ? \"true\" : \"false\");\n\n const blocks: HTMLElement[] = [];\n\n if (el.hasAttribute(\"pulse-form-block\")) {\n blocks.push(el);\n }\n\n el.querySelectorAll<HTMLElement>(\"[pulse-form-block]\").forEach((child) => {\n blocks.push(child);\n });\n\n blocks.forEach((block) => {\n if (!block.hasAttribute(originalRequiredAttribute)) {\n const current = block.getAttribute(requiredAttribute)?.trim() || \"\";\n block.setAttribute(originalRequiredAttribute, current);\n }\n\n if (isActive) {\n const original = block.getAttribute(originalRequiredAttribute) || \"\";\n block.setAttribute(requiredAttribute, original || \"false\");\n } else {\n block.setAttribute(requiredAttribute, \"false\");\n }\n });\n });\n\n // Sync DOM \u2192 JSON immediately (no setTimeout)\n const updated = updateRequiredFields(fields, { root, requiredAttribute });\n return updated;\n}", "// \u2500\u2500\u2500 fillMirrorValues.ts \u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\n// Standalone, reusable module for copying form-field values into \"mirror\"\n// target elements elsewhere in the DOM.\n//\n// A mirror target is any element with attribute:\n// pulse-form-block-mirror=\"<field-name>\"\n//\n// The module finds the matching field in the provided array, then writes\n// its value into the first <input | textarea | select> inside the target.\n//\n// Usage:\n// import { fillMirrorValues } from \"./fillMirrorValues\";\n// fillMirrorValues(fields); // scans whole document\n// fillMirrorValues(fields, { root: myDiv }); // scans within a subtree\n// \u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\n\nimport type { PulseFormField } from \"./collectFormFields\";\n\nexport interface MirrorOptions {\n /**\n * Root element to search for mirror targets.\n * Defaults to `document`.\n */\n root?: ParentNode;\n\n /**\n * Called when a mirror target element is found but contains no\n * input / textarea / select. Useful for logging in dev.\n */\n onMissingInput?: (fieldName: string, targetEl: HTMLElement) => void;\n\n /**\n * Called when a field has `mirror-value: true` but no matching\n * target element exists in the DOM.\n */\n onMissingTarget?: (fieldName: string) => void;\n}\n\n/**\n * Writes every field whose `mirror-value` is `true` into the corresponding\n * mirror-target element(s) in the DOM.\n *\n * @param fields The current form-field state array (e.g. from `collectFormFields`).\n * @param options Optional configuration \u2014 root scope, callbacks.\n */\nexport function fillMirrorValues(\n fields: PulseFormField[],\n options: MirrorOptions = {}\n): void {\n const { root = document, onMissingInput, onMissingTarget } = options;\n\n // 1. Filter to only fields that opt-in to mirroring\n const mirrorFields = fields.filter((f) => f[\"mirror-value\"] === true);\n if (mirrorFields.length === 0) return;\n\n // 2. Grab all mirror-target elements once\n const mirrorTargets = root.querySelectorAll<HTMLElement>(\n \"[pulse-form-block-mirror]\"\n );\n\n // 3. For each mirror field, find matching target(s) and write value\n mirrorFields.forEach((field) => {\n const fieldName = field[\"field-name\"];\n let found = false;\n\n mirrorTargets.forEach((target) => {\n const mirrorAttr = target\n .getAttribute(\"pulse-form-block-mirror\")\n ?.trim();\n if (mirrorAttr !== fieldName) return;\n\n found = true;\n\n const input = target.querySelector<\n HTMLInputElement | HTMLTextAreaElement | HTMLSelectElement\n >(\"input, textarea, select\");\n\n if (!input) {\n onMissingInput?.(fieldName, target);\n return;\n }\n\n writeValueToInput(input, field.value);\n });\n\n if (!found) {\n onMissingTarget?.(fieldName);\n }\n });\n}\n\n// \u2500\u2500\u2500 Helpers \u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\n\n/**\n * Sets the value of a form control element, handling checkboxes,\n * arrays, booleans, and strings uniformly.\n */\nfunction writeValueToInput(\n input: HTMLInputElement | HTMLTextAreaElement | HTMLSelectElement,\n value: PulseFormField[\"value\"]\n): void {\n if (typeof value === \"string\") {\n input.value = value;\n } else if (typeof value === \"boolean\") {\n if (input instanceof HTMLInputElement && input.type === \"checkbox\") {\n input.checked = value;\n } else {\n input.value = String(value);\n }\n } else if (Array.isArray(value)) {\n input.value = value.join(\", \");\n } else {\n input.value = \"\";\n }\n}", "// \u2500\u2500\u2500 validateForm.ts \u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\n// Reusable validation utility. Call `validateForm(fields)` to validate all\n// fields, render errors, and focus the first invalid one. Call\n// `bindValidationListeners()` so errors clear themselves as the user fixes them.\n//\n// Usage:\n// import { validateForm, bindValidationListeners } from \"./validateForm\";\n//\n// // Validate ALL fields (default)\n// const { fields, isValid } = validateForm(fields);\n//\n// // Validate only fields inside a specific container\n// const step1 = document.getElementById(\"step-1\")!;\n// const { fields, isValid } = validateForm(fields, { scope: step1 });\n// \u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\n\nimport {\n collectFormFields,\n extractValue,\n getFieldError,\n parseRequired,\n type PulseFormField,\n type FormBlockType,\n type FieldError,\n} from \"./collectFormFields\";\n\n// \u2500\u2500\u2500 Options \u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\n\nexport interface ValidateFormOptions {\n /** Root element to query from. Default: document */\n root?: ParentNode;\n /**\n * Scope validation to only fields inside this container element.\n * When omitted, all fields inside `root` are validated.\n * When provided, only `[pulse-form-block]` elements that are\n * descendants of `scope` are validated \u2014 the rest are left untouched.\n */\n scope?: HTMLElement;\n /** intl-tel-input instance map \u2014 needed for phone validation */\n itiInstances?: Map<HTMLInputElement, any>;\n /** CSS class added to the error <span>. Default: \"pulse-form-error\" */\n errorClass?: string;\n /** CSS class added to the wrapper when it has an error. Default: \"has-error\" */\n wrapperErrorClass?: string;\n /** Scroll + focus the first invalid field. Default: true */\n focusFirst?: boolean;\n}\n\nexport interface ValidateFormResult {\n fields: PulseFormField[];\n isValid: boolean;\n}\n\nconst DEFAULTS = {\n errorClass: \"pulse-form-error\",\n wrapperErrorClass: \"has-error\",\n focusFirst: true,\n} as const;\n\n// \u2500\u2500\u2500 Internal: resolve the query target \u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\n\n/**\n * Returns the element to querySelectorAll from.\n * `scope` takes priority over `root` \u2014 if scope is set, we only look inside it.\n */\nfunction resolveTarget(root: ParentNode, scope?: HTMLElement): ParentNode {\n return scope ?? root;\n}\n\n/**\n * Returns the set of field names present inside the target element.\n * Used to decide which entries in the fields array should be validated.\n */\nfunction getScopedFieldNames(target: ParentNode): Set<string> {\n const names = new Set<string>();\n target.querySelectorAll<HTMLElement>(\"[pulse-form-block]\").forEach((w) => {\n const name = w.getAttribute(\"pulse-field-name\")?.trim();\n if (name) names.add(name);\n });\n return names;\n}\n\n// \u2500\u2500\u2500 1. Validate Fields \u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\n\n/**\n * Validates `[pulse-form-block]` elements, renders error messages on invalid\n * fields, and optionally focuses the first one.\n *\n * - **No `scope`** \u2192 validates every field inside `root` (default: document).\n * - **With `scope`** \u2192 validates only fields inside that container.\n * Fields outside the scope are returned unchanged (errors untouched).\n *\n * `isValid` reflects only the scoped fields.\n */\nexport function validateForm(\n fields: PulseFormField[],\n options: ValidateFormOptions = {}\n): ValidateFormResult {\n const {\n root = document,\n scope,\n itiInstances,\n errorClass = DEFAULTS.errorClass,\n wrapperErrorClass = DEFAULTS.wrapperErrorClass,\n focusFirst = DEFAULTS.focusFirst,\n } = options;\n\n const target = resolveTarget(root, scope);\n const wrappers = target.querySelectorAll<HTMLElement>(\"[pulse-form-block]\");\n const scopedNames = getScopedFieldNames(target);\n\n // Clear existing errors only inside the target\n clearAllErrors(target, errorClass, wrapperErrorClass);\n\n // Validate scoped fields, pass through the rest untouched\n const validated = fields.map((field) => {\n // Not in scope \u2192 leave as-is\n if (!scopedNames.has(field[\"field-name\"])) return field;\n\n const wrapper = findWrapper(wrappers, field[\"field-name\"]);\n if (!wrapper) return { ...field, error: null };\n\n const error = getFieldError(\n field[\"form-block\"],\n field.required,\n field.value,\n wrapper,\n itiInstances\n );\n\n if (error) {\n showError(wrapper, error, errorClass, wrapperErrorClass);\n }\n\n return { ...field, error };\n });\n\n // isValid only considers fields that were in scope\n const scopedFields = validated.filter((f) => scopedNames.has(f[\"field-name\"]));\n const isValid = scopedFields.every((f) => f.error === null);\n\n if (!isValid && focusFirst) {\n focusFirstError(target, wrapperErrorClass);\n }\n\n return { fields: validated, isValid };\n}\n\n// \u2500\u2500\u2500 2. Bind Reactive Error Clearing \u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\n\n/**\n * Attaches listeners to form blocks so that when a field with an error\n * is edited and its value becomes valid, the error clears immediately.\n *\n * - **No `scope`** \u2192 binds to all fields inside `root`.\n * - **With `scope`** \u2192 binds only to fields inside that container.\n *\n * Call once after DOM is ready.\n */\nexport function bindValidationListeners(\n options: ValidateFormOptions & {\n /** Live fields getter \u2014 return the current fields array */\n getFields: () => PulseFormField[];\n /** Called with the updated field after reactive validation */\n onFieldValidated?: (fieldName: string, error: FieldError | null) => void;\n }\n): void {\n const {\n root = document,\n scope,\n itiInstances,\n errorClass = DEFAULTS.errorClass,\n wrapperErrorClass = DEFAULTS.wrapperErrorClass,\n getFields,\n onFieldValidated,\n } = options;\n\n const VALID_TYPES: FormBlockType[] = [\n \"text\", \"email\", \"phone\", \"checkbox\", \"radio\", \"select\", \"legal\",\n ];\n\n const target = resolveTarget(root, scope);\n const wrappers = target.querySelectorAll<HTMLElement>(\"[pulse-form-block]\");\n\n wrappers.forEach((wrapper) => {\n const type = wrapper\n .getAttribute(\"pulse-form-block\")\n ?.trim()\n .toLowerCase() as FormBlockType | undefined;\n\n if (!type || !VALID_TYPES.includes(type)) return;\n\n const onChange = () => {\n // Only react if this field currently has an error shown\n if (!wrapper.classList.contains(wrapperErrorClass)) return;\n\n const fieldName = wrapper.getAttribute(\"pulse-field-name\")?.trim();\n if (!fieldName) return;\n\n const fields = getFields();\n const field = fields.find((f) => f[\"field-name\"] === fieldName);\n if (!field) return;\n\n // Re-extract live value and validate\n const value = extractValue(type, wrapper);\n const error = getFieldError(type, field.required, value, wrapper, itiInstances);\n\n if (!error) {\n clearError(wrapper, errorClass, wrapperErrorClass);\n } else {\n // Update the error message (e.g. \"too short\" \u2192 \"invalid format\")\n showError(wrapper, error, errorClass, wrapperErrorClass);\n }\n\n onFieldValidated?.(fieldName, error);\n };\n\n switch (type) {\n case \"text\":\n case \"email\": {\n const input = wrapper.querySelector<HTMLInputElement | HTMLTextAreaElement>(\n \"input, textarea\"\n );\n if (input) {\n input.addEventListener(\"input\", onChange);\n input.addEventListener(\"change\", onChange);\n }\n break;\n }\n\n case \"phone\": {\n const phoneInput = wrapper.querySelector<HTMLInputElement>('input[type=\"tel\"]');\n if (phoneInput) {\n phoneInput.addEventListener(\"input\", onChange);\n phoneInput.addEventListener(\"change\", onChange);\n phoneInput.addEventListener(\"keyup\", onChange);\n phoneInput.addEventListener(\"countrychange\", onChange);\n }\n break;\n }\n\n case \"checkbox\":\n case \"legal\": {\n wrapper\n .querySelectorAll<HTMLInputElement>('input[type=\"checkbox\"]')\n .forEach((cb) => cb.addEventListener(\"change\", onChange));\n break;\n }\n\n case \"radio\": {\n wrapper\n .querySelectorAll<HTMLInputElement>('input[type=\"radio\"]')\n .forEach((r) => r.addEventListener(\"change\", onChange));\n break;\n }\n\n case \"select\": {\n const select = wrapper.querySelector<HTMLSelectElement>(\"select\");\n if (select) select.addEventListener(\"change\", onChange);\n break;\n }\n }\n });\n}\n\n// \u2500\u2500\u2500 3. Manual single-field validation \u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\n\n/**\n * Validate a single field by name. Shows or clears the error on its wrapper.\n * Respects `scope` \u2014 if set, the field must be inside it to be found.\n */\nexport function validateField(\n fieldName: string,\n fields: PulseFormField[],\n options: ValidateFormOptions = {}\n): FieldError | null {\n const {\n root = document,\n scope,\n itiInstances,\n errorClass = DEFAULTS.errorClass,\n wrapperErrorClass = DEFAULTS.wrapperErrorClass,\n } = options;\n\n const field = fields.find((f) => f[\"field-name\"] === fieldName);\n if (!field) return null;\n\n const target = resolveTarget(root, scope);\n const wrapper = target.querySelector<HTMLElement>(\n `[pulse-field-name=\"${fieldName}\"]`\n );\n if (!wrapper) return null;\n\n const value = extractValue(field[\"form-block\"], wrapper);\n const error = getFieldError(\n field[\"form-block\"],\n field.required,\n value,\n wrapper,\n itiInstances\n );\n\n if (error) {\n showError(wrapper, error, errorClass, wrapperErrorClass);\n } else {\n clearError(wrapper, errorClass, wrapperErrorClass);\n }\n\n return error;\n}\n\n// \u2500\u2500\u2500 Error DOM Helpers \u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\n\nfunction showError(\n wrapper: HTMLElement,\n error: FieldError,\n errorClass: string,\n wrapperErrorClass: string\n): void {\n const existing = wrapper.querySelector(`.${errorClass}`);\n if (existing) existing.remove();\n\n const span = document.createElement(\"span\");\n span.className = errorClass;\n span.textContent = error.message;\n span.setAttribute(\"data-error-code\", error.code);\n span.setAttribute(\n \"data-field-name\",\n wrapper.getAttribute(\"pulse-field-name\")?.trim() || \"\"\n );\n\n wrapper.classList.add(wrapperErrorClass);\n wrapper.appendChild(span);\n}\n\nfunction clearError(\n wrapper: HTMLElement,\n errorClass: string,\n wrapperErrorClass: string\n): void {\n const span = wrapper.querySelector(`.${errorClass}`);\n if (span) span.remove();\n wrapper.classList.remove(wrapperErrorClass);\n}\n\nfunction clearAllErrors(\n target: ParentNode,\n errorClass: string,\n wrapperErrorClass: string\n): void {\n target\n .querySelectorAll<HTMLElement>(`.${errorClass}`)\n .forEach((el) => el.remove());\n target\n .querySelectorAll<HTMLElement>(\"[pulse-form-block]\")\n .forEach((el) => el.classList.remove(wrapperErrorClass));\n}\n\nfunction focusFirstError(target: ParentNode, wrapperErrorClass: string): void {\n const first = target.querySelector<HTMLElement>(\n `[pulse-form-block].${wrapperErrorClass}`\n );\n if (!first) return;\n\n first.scrollIntoView({ behavior: \"smooth\", block: \"center\" });\n\n const focusable = first.querySelector<HTMLElement>(\n \"input, textarea, select\"\n );\n if (focusable) setTimeout(() => focusable.focus(), 400);\n}\n\nfunction findWrapper(\n wrappers: NodeListOf<HTMLElement>,\n fieldName: string\n): HTMLElement | undefined {\n return Array.from(wrappers).find(\n (w) => w.getAttribute(\"pulse-field-name\")?.trim() === fieldName\n );\n}", "import { initIntlTelInput } from \"./utils/initIntlTelInput\";\nimport { initFormJSON, bindFormListeners, onFieldsUpdate, getFormFields } from \"./utils/initFormControls\";\nimport { updateFlowType } from \"./utils/updateFlowType\";\nimport { fillMirrorValues } from \"./utils/fillMirrorValues\";\nimport { bindValidationListeners, validateForm } from \"./utils/validateForm\";\nimport { syncRequiredToDOM } from \"./utils/updateRequiredFields\";\n\ndocument.addEventListener(\"DOMContentLoaded\", () => {\n const itiInstances = initIntlTelInput();\n\n onFieldsUpdate((fields) => {\n const updated = updateFlowType(fields);\n (window as any).PulseFormData = updated;\n });\n onFieldsUpdate((fields) => fillMirrorValues(fields));\n\n initFormJSON();\n syncRequiredToDOM(getFormFields());\n bindFormListeners();\n\n // \u2500\u2500\u2500 Step 2 \u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\n const step2Container = document.getElementById(\"step-2-container\")!;\n const step2Button = document.getElementById(\"step-2-button\")!;\n\n // Reactive clearing \u2014 errors disappear as user fixes them inside step-2\n bindValidationListeners({\n scope: step2Container,\n getFields: getFormFields,\n itiInstances,\n });\n\n // On click \u2014 validate only fields inside step-2\n step2Button.addEventListener(\"click\", (e) => {\n e.preventDefault();\n\n const { fields, isValid } = validateForm(getFormFields(), {\n scope: step2Container,\n itiInstances,\n });\n\n (window as any).PulseFormData = fields;\n\n if (!isValid) return;\n\n // Step 2 passed \u2014 proceed to next step, submit, etc.\n console.log(\"Step 2 valid, moving on...\");\n });\n\n // \u2500\u2500\u2500 Step 3 \u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\n const step3Container = document.getElementById(\"step-3-container\")!;\n const step3Button = document.getElementById(\"step-3-button\")!;\n\n bindValidationListeners({\n scope: step3Container,\n getFields: getFormFields,\n itiInstances,\n });\n\n step3Button.addEventListener(\"click\", (e) => {\n e.preventDefault();\n\n console.log(\"step 3 clicked\");\n const { fields, isValid } = validateForm(getFormFields(), {\n scope: step3Container,\n itiInstances,\n });\n\n (window as any).PulseFormData = fields;\n\n console.log(\"Step 3 valid\", isValid);\n\n if (!isValid) return;\n\n console.log(\"Step 3 valid, proceeding to submit...\");\n });\n});"],
|
|
5
|
+
"mappings": "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",
|
|
6
|
+
"names": ["VALID_BLOCK_TYPES"]
|
|
7
|
+
}
|
package/dist/form/styles.css
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
.w-form-formradioinput--inputType-custom.w--redirected-focus{box-shadow:none}.radio-checked{display:none}.w-form-formradioinput.w--redirected-checked~.radio-checked{display:flex}.w-checkbox-input--inputType-custom.w--redirected-focus{box-shadow:none}.w-input:focus,.w-select:focus{border-color:transparent;outline:0}.radio-inner-label{color:var(--text-colors--subtext)}input[type=radio]:checked+.radio-inner-label{color:var(--text-colors--title)}.checkbox-label{color:var(--text-colors--subtext)}.w-checkbox-input--inputType-custom.w--redirected-checked{background-color:#f66025;border-color:#f66025}input[type=checkbox]:checked+.checkbox-label{color:var(--text-colors--title)}.checkbox-field:has(input[type=checkbox]:checked){border-color:#f66025}.radio-inner-label,.checkbox-label{transition:color .3s ease}.checkbox-field{transition:border-color .3s ease}.w-checkbox-input--inputType-custom{transition:background-color .3s ease,border-color .3s ease}span.pulse-form-error{color:#e55757;font-size:var(--_text-size---body--s);line-height:var(--_line-height---line-height-body--s);font-weight:var(--_font-weight---font-weight-body--s);letter-spacing:var(--_letter-spacing---letter-spacing-body--s)}[data-error-code=ERR_LEGAL_REQUIRED]{padding-left:18px}[form-flow-active=false]{display:none}[form-flow-active=true]{display:flex}[fullwidth]{width:100%}[hs-calender-active=true]{display:block;width:100%}[hs-calender-active=false]{display:none}div#iti-0__dropdown-content{background-color:#121212;border-color:#242424}#iti-0__search-input{background:#242424}.iti__search-input-wrapper{border-color:#242424}iframe{border:1px solid transparent!important}.w-form-done{border:1px solid transparent}
|
|
1
|
+
.w-form-formradioinput--inputType-custom.w--redirected-focus{box-shadow:none}.radio-checked{display:none}.w-form-formradioinput.w--redirected-checked~.radio-checked{display:flex}.w-checkbox-input--inputType-custom.w--redirected-focus{box-shadow:none}.w-input:focus,.w-select:focus{border-color:transparent;outline:0}.radio-inner-label{color:var(--text-colors--subtext)}input[type=radio]:checked+.radio-inner-label{color:var(--text-colors--title)}.checkbox-label{color:var(--text-colors--subtext)}.w-checkbox-input--inputType-custom.w--redirected-checked{background-color:#f66025;border-color:#f66025}input[type=checkbox]:checked+.checkbox-label{color:var(--text-colors--title)}.checkbox-field:has(input[type=checkbox]:checked){border-color:#f66025}.radio-inner-label,.checkbox-label{transition:color .3s ease}.checkbox-field{transition:border-color .3s ease}.w-checkbox-input--inputType-custom{transition:background-color .3s ease,border-color .3s ease}span.pulse-form-error,.field-error{color:#e55757;font-size:var(--_text-size---body--s);line-height:var(--_line-height---line-height-body--s);font-weight:var(--_font-weight---font-weight-body--s);letter-spacing:var(--_letter-spacing---letter-spacing-body--s)}[data-error-code=ERR_LEGAL_REQUIRED]{padding-left:18px}[form-flow-active=false]{display:none}[form-flow-active=true]{display:flex}[fullwidth]{width:100%}[hs-calender-active=true]{display:block;width:100%}[hs-calender-active=false]{display:none}div#iti-0__dropdown-content{background-color:#121212;border-color:#242424}#iti-0__search-input{background:#242424}.iti__search-input-wrapper{border-color:#242424}iframe{border:1px solid transparent!important}.w-form-done{border:1px solid transparent}.hubspot-submitted-form{display:none!important}
|
package/dist/form/styles.css.map
CHANGED
|
@@ -1,7 +1,7 @@
|
|
|
1
1
|
{
|
|
2
2
|
"version": 3,
|
|
3
3
|
"sources": ["../../src/form/styles.css"],
|
|
4
|
-
"sourcesContent": [".w-form-formradioinput--inputType-custom.w--redirected-focus {\n box-shadow: none;\n}\n\n/* Hide by default */\n.radio-checked {\n display: none;\n}\n\n/* Show when the custom radio is checked */\n.w-form-formradioinput.w--redirected-checked~.radio-checked {\n display: flex;\n}\n\n.w-checkbox-input--inputType-custom.w--redirected-focus {\n box-shadow: none;\n}\n\n.w-input:focus,\n.w-select:focus {\n border-color: transparent;\n outline: 0;\n}\n\n/* Default state */\n.radio-inner-label {\n color: var(--text-colors--subtext);\n}\n\n/* When radio is checked */\ninput[type=\"radio\"]:checked+.radio-inner-label {\n color: var(--text-colors--title);\n}\n\n/* Default (unchecked) */\n.checkbox-label {\n color: var(--text-colors--subtext);\n}\n\n/* When checked */\ninput[type=\"checkbox\"]:checked+.checkbox-label {\n color: var(--text-colors--title);\n}\n\n.w-checkbox-input--inputType-custom.w--redirected-checked {\n background-color: #F66025;\n border-color: #F66025;\n}\n\n/* Change label color when checked */\ninput[type=\"checkbox\"]:checked+.checkbox-label {\n color: var(--text-colors--title);\n}\n\n/* Change parent border when checked */\n.checkbox-field:has(input[type=\"checkbox\"]:checked) {\n border-color: #F66025;\n}\n\n/* Smooth color transition for labels */\n.radio-inner-label,\n.checkbox-label {\n transition: color 300ms ease;\n}\n\n/* Smooth border transition for parent checkbox field */\n.checkbox-field {\n transition: border-color 300ms ease;\n}\n\n/* Smooth background + border transition for custom checkbox input */\n.w-checkbox-input--inputType-custom {\n transition: background-color 300ms ease, border-color 300ms ease;\n}\n\nspan.pulse-form-error {\n color: #e55757;\n font-size: var(--_text-size---body--s);\n line-height: var(--_line-height---line-height-body--s);\n font-weight: var(--_font-weight---font-weight-body--s);\n letter-spacing: var(--_letter-spacing---letter-spacing-body--s);\n}\n\n[data-error-code=\"ERR_LEGAL_REQUIRED\"] {\n padding-left: 18px;\n}\n\n[form-flow-active=\"false\"] {\n display: none;\n}\n\n[form-flow-active=\"true\"] {\n display: flex;\n}\n\n[fullwidth] {\n width: 100%;\n}\n\n[hs-calender-active=\"true\"] {\n display: block;\n width: 100%;\n}\n\n[hs-calender-active=\"false\"] {\n display: none;\n}\n\ndiv#iti-0__dropdown-content {\n background-color: #121212;\n border-color: #242424;\n}\n\n#iti-0__search-input {\n background: #242424;\n}\n\n.iti__search-input-wrapper {\n border-color: #242424;\n}"],
|
|
5
|
-
"mappings": ";AAAA,CAAC,uCAAuC,CAAC;AACrC,cAAY;AAChB;AAGA,CAAC;AACG,WAAS;AACb;AAGA,CAAC,qBAAqB,CAAC,sBAAqB,EAAC,CAL5C;AAMG,WAAS;AACb;AAEA,CAAC,kCAAkC,CAdM;AAerC,cAAY;AAChB;AAEA,CAAC,OAAO;AACR,CAAC,QAAQ;AACL,gBAAc;AACd,WAAS;AACb;AAGA,CAAC;AACG,SAAO,IAAI;AACf;AAGA,KAAK,CAAC,WAAa,SAAQ,EAAC,CAL3B;AAMG,SAAO,IAAI;AACf;AAGA,CAAC;AACG,SAAO,IAAI;AACf;AAGA,KAAK,CAAC,cAAgB,SAAQ,EAAC,CAL9B;AAMG,SAAO,IAAI;AACf;AAEA,CA9BC,kCA8BkC,CAlCZ;AAmCnB,oBAAkB;AAClB,gBAAc;AAClB;AAGA,KAAK,CAAC,cAAgB,SAAQ,EAAC,CAf9B;AAgBG,SAAO,IAAI;AACf;AAGA,CAAC,cAAc,KAAK,KAAK,CAAC,cAAgB;AACtC,gBAAc;AAClB;AAGA,CAnCC;AAoCD,CA1BC;AA2BG,cAAY,MAAM,MAAM;AAC5B;AAGA,CAXC;AAYG,cAAY,aAAa,MAAM;AACnC;AAGA,CAzDC;AA0DG,cAAY,iBAAiB,MAAM,IAAI,EAAE,aAAa,MAAM;AAChE;AAEA,IAAI,CAAC;AACD,SAAO;AACP,aAAW,IAAI;AACf,eAAa,IAAI;AACjB,eAAa,IAAI;AACjB,kBAAgB,IAAI;AACxB;AAEA,CAAC;AACG,gBAAc;AAClB;AAEA,CAAC;AACG,WAAS;AACb;AAEA,CAAC;AACG,WAAS;AACb;AAEA,CAAC;AACG,SAAO;AACX;AAEA,CAAC;AACG,WAAS;AACT,SAAO;AACX;AAEA,CAAC;AACG,WAAS;AACb;AAEA,GAAG,CAAC;AACA,oBAAkB;AAClB,gBAAc;AAClB;AAEA,CAAC;AACG,cAAY;AAChB;AAEA,CAAC;AACG,gBAAc;AAClB;",
|
|
4
|
+
"sourcesContent": [".w-form-formradioinput--inputType-custom.w--redirected-focus {\n box-shadow: none;\n}\n\n/* Hide by default */\n.radio-checked {\n display: none;\n}\n\n/* Show when the custom radio is checked */\n.w-form-formradioinput.w--redirected-checked~.radio-checked {\n display: flex;\n}\n\n.w-checkbox-input--inputType-custom.w--redirected-focus {\n box-shadow: none;\n}\n\n.w-input:focus,\n.w-select:focus {\n border-color: transparent;\n outline: 0;\n}\n\n/* Default state */\n.radio-inner-label {\n color: var(--text-colors--subtext);\n}\n\n/* When radio is checked */\ninput[type=\"radio\"]:checked+.radio-inner-label {\n color: var(--text-colors--title);\n}\n\n/* Default (unchecked) */\n.checkbox-label {\n color: var(--text-colors--subtext);\n}\n\n/* When checked */\ninput[type=\"checkbox\"]:checked+.checkbox-label {\n color: var(--text-colors--title);\n}\n\n.w-checkbox-input--inputType-custom.w--redirected-checked {\n background-color: #F66025;\n border-color: #F66025;\n}\n\n/* Change label color when checked */\ninput[type=\"checkbox\"]:checked+.checkbox-label {\n color: var(--text-colors--title);\n}\n\n/* Change parent border when checked */\n.checkbox-field:has(input[type=\"checkbox\"]:checked) {\n border-color: #F66025;\n}\n\n/* Smooth color transition for labels */\n.radio-inner-label,\n.checkbox-label {\n transition: color 300ms ease;\n}\n\n/* Smooth border transition for parent checkbox field */\n.checkbox-field {\n transition: border-color 300ms ease;\n}\n\n/* Smooth background + border transition for custom checkbox input */\n.w-checkbox-input--inputType-custom {\n transition: background-color 300ms ease, border-color 300ms ease;\n}\n\nspan.pulse-form-error {\n color: #e55757;\n font-size: var(--_text-size---body--s);\n line-height: var(--_line-height---line-height-body--s);\n font-weight: var(--_font-weight---font-weight-body--s);\n letter-spacing: var(--_letter-spacing---letter-spacing-body--s);\n}\n.field-error{\n color: #e55757;\n font-size: var(--_text-size---body--s);\n line-height: var(--_line-height---line-height-body--s);\n font-weight: var(--_font-weight---font-weight-body--s);\n letter-spacing: var(--_letter-spacing---letter-spacing-body--s);\n}\n\n[data-error-code=\"ERR_LEGAL_REQUIRED\"] {\n padding-left: 18px;\n}\n\n[form-flow-active=\"false\"] {\n display: none;\n}\n\n[form-flow-active=\"true\"] {\n display: flex;\n}\n\n[fullwidth] {\n width: 100%;\n}\n\n[hs-calender-active=\"true\"] {\n display: block;\n width: 100%;\n}\n\n[hs-calender-active=\"false\"] {\n display: none;\n}\n\ndiv#iti-0__dropdown-content {\n background-color: #121212;\n border-color: #242424;\n}\n\n#iti-0__search-input {\n background: #242424;\n}\n\n.iti__search-input-wrapper {\n border-color: #242424;\n}\n\niframe {\n border: 1px solid transparent !important;\n}\n\n.w-form-done {\n border: 1px solid transparent;\n}\n\n.hubspot-submitted-form {\n display: none !important;\n}"],
|
|
5
|
+
"mappings": ";AAAA,CAAC,uCAAuC,CAAC;AACrC,cAAY;AAChB;AAGA,CAAC;AACG,WAAS;AACb;AAGA,CAAC,qBAAqB,CAAC,sBAAqB,EAAC,CAL5C;AAMG,WAAS;AACb;AAEA,CAAC,kCAAkC,CAdM;AAerC,cAAY;AAChB;AAEA,CAAC,OAAO;AACR,CAAC,QAAQ;AACL,gBAAc;AACd,WAAS;AACb;AAGA,CAAC;AACG,SAAO,IAAI;AACf;AAGA,KAAK,CAAC,WAAa,SAAQ,EAAC,CAL3B;AAMG,SAAO,IAAI;AACf;AAGA,CAAC;AACG,SAAO,IAAI;AACf;AAGA,KAAK,CAAC,cAAgB,SAAQ,EAAC,CAL9B;AAMG,SAAO,IAAI;AACf;AAEA,CA9BC,kCA8BkC,CAlCZ;AAmCnB,oBAAkB;AAClB,gBAAc;AAClB;AAGA,KAAK,CAAC,cAAgB,SAAQ,EAAC,CAf9B;AAgBG,SAAO,IAAI;AACf;AAGA,CAAC,cAAc,KAAK,KAAK,CAAC,cAAgB;AACtC,gBAAc;AAClB;AAGA,CAnCC;AAoCD,CA1BC;AA2BG,cAAY,MAAM,MAAM;AAC5B;AAGA,CAXC;AAYG,cAAY,aAAa,MAAM;AACnC;AAGA,CAzDC;AA0DG,cAAY,iBAAiB,MAAM,IAAI,EAAE,aAAa,MAAM;AAChE;AAEA,IAAI,CAAC;AACD,SAAO;AACP,aAAW,IAAI;AACf,eAAa,IAAI;AACjB,eAAa,IAAI;AACjB,kBAAgB,IAAI;AACxB;AACA,CAAC;AACG,SAAO;AACP,aAAW,IAAI;AACf,eAAa,IAAI;AACjB,eAAa,IAAI;AACjB,kBAAgB,IAAI;AACxB;AAEA,CAAC;AACG,gBAAc;AAClB;AAEA,CAAC;AACG,WAAS;AACb;AAEA,CAAC;AACG,WAAS;AACb;AAEA,CAAC;AACG,SAAO;AACX;AAEA,CAAC;AACG,WAAS;AACT,SAAO;AACX;AAEA,CAAC;AACG,WAAS;AACb;AAEA,GAAG,CAAC;AACA,oBAAkB;AAClB,gBAAc;AAClB;AAEA,CAAC;AACG,cAAY;AAChB;AAEA,CAAC;AACG,gBAAc;AAClB;AAEA;AACI,UAAQ,IAAI,MAAM;AACtB;AAEA,CAAC;AACG,UAAQ,IAAI,MAAM;AACtB;AAEA,CAAC;AACG,WAAS;AACb;",
|
|
6
6
|
"names": []
|
|
7
7
|
}
|
package/dist/global/styles.css
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
[ai-gradient="1"]{background:linear-gradient(90deg,#ff84d2 2%,#ffa49d 46%,#ff5c2a 88%)}[ai-gradient="2"]{background:linear-gradient(90deg,#fd4fad 17%,#ff5200)}[style-bg-color=foreground]{background-color:var(--background-colors--foreground)}[style-bg-color=background]{background-color:var(--background-colors--background)}[style-type^=h]{font-family:var(--_font-family---heading);margin:0}[style-type=h1]{font-size:var(--_text-size---heading--h1);line-height:var(--_line-height---line-height-heading-tags--h1);font-weight:var(--_font-weight---font-weight-heading-tags--h1);letter-spacing:var(--_letter-spacing---letter-spacing-heading-tags--h1)}[style-type=h2]{font-size:var(--_text-size---heading--h2);line-height:var(--_line-height---line-height-heading-tags--h2);font-weight:var(--_font-weight---font-weight-heading-tags--h2);letter-spacing:var(--_letter-spacing---letter-spacing-heading-tags--h2)}[style-type=h3]{font-size:var(--_text-size---heading--h3);line-height:var(--_line-height---line-height-heading-tags--h3);font-weight:var(--_font-weight---font-weight-heading-tags--h3);letter-spacing:var(--_letter-spacing---letter-spacing-heading-tags--h3)}[style-type=h4]{font-size:var(--_text-size---heading--h4);line-height:var(--_line-height---line-height-heading-tags--h4);font-weight:var(--_font-weight---font-weight-heading-tags--h4);letter-spacing:var(--_letter-spacing---letter-spacing-heading-tags--h4)}[style-type=h5]{font-size:var(--_text-size---heading--h5);line-height:var(--_line-height---line-height-heading-tags--h5);font-weight:var(--_font-weight---font-weight-heading-tags--h5);letter-spacing:var(--_letter-spacing---letter-spacing-heading-tags--h5)}[style-type=h6]{font-size:var(--_text-size---heading--h6);line-height:var(--_line-height---line-height-heading-tags--h6);font-weight:var(--_font-weight---font-weight-heading-tags--h6);letter-spacing:var(--_letter-spacing---letter-spacing-heading-tags--h6)}[style-type^=title-]{font-family:var(--_font-family---title)}[style-type=title-l]{font-size:var(--_text-size---title--l);line-height:var(--_line-height---line-height-title--l);font-weight:var(--_font-weight---font-weight-title--l);letter-spacing:var(--_letter-spacing---letter-spacing-body--l)}[style-type=title-m]{font-size:var(--_text-size---title--m);line-height:var(--_line-height---line-height-title--m);font-weight:var(--_font-weight---font-weight-title--m);letter-spacing:var(--_letter-spacing---letter-spacing-title--m)}[style-type=title-s]{font-size:var(--_text-size---title--s);line-height:var(--_line-height---line-height-title--s);font-weight:var(--_font-weight---font-weight-title--s);letter-spacing:var(--_letter-spacing---letter-spacing-title--s)}[style-type^=display-]{font-family:var(--_font-family---display)}[style-type=display-l]{font-size:var(--_text-size---display--l);line-height:var(--_line-height---line-height-display--l);font-weight:var(--_font-weight---font-weight-display--l);letter-spacing:var(--_letter-spacing---letter-spacing-display--l)}[style-type=display-m]{font-size:var(--_text-size---display--m);line-height:var(--_line-height---line-height-display--m);font-weight:var(--_font-weight---font-weight-display--m);letter-spacing:var(--_letter-spacing---letter-spacing-display--m)}[style-type=display-s]{font-size:var(--_text-size---display--s);line-height:var(--_line-height---line-height-display--s);font-weight:var(--_font-weight---font-weight-display--s);letter-spacing:var(--_letter-spacing---letter-spacing-display--s)}[style-type^=body-]{font-family:var(--_font-family---body)}[style-type=body-l]{font-size:var(--_text-size---body--l);line-height:var(--_line-height---line-height-body--l);font-weight:var(--_font-weight---font-weight-body--l);letter-spacing:var(--_letter-spacing---letter-spacing-body--l)}[style-type=body-m]{font-size:var(--_text-size---body--m);line-height:var(--_line-height---line-height-body--m);font-weight:var(--_font-weight---font-weight-body--m);letter-spacing:var(--_letter-spacing---letter-spacing-body--m)}[style-type=body-s]{font-size:var(--_text-size---body--s);line-height:var(--_line-height---line-height-body--s);font-weight:var(--_font-weight---font-weight-body--s);letter-spacing:var(--_letter-spacing---letter-spacing-body--s)}[style-text-align=left]{text-align:left}[style-text-align=center]{text-align:center}[style-text-align=right]{text-align:right}[style-text-color=title]{color:var(--text-colors--title)}[style-text-color=subtext]{color:var(--text-colors--subtext)}[style-text-color=orange]{color:var(--text-colors--orange)}[style-button-color=orange]{background-color:var(--orange--orange40);border-color:var(--orange--orange40);color:var(--text-colors--title-inverse)}[style-button-color=white]{background-color:var(--white);border:1px solid var(--white);color:var(--text-colors--title-inverse)}[style-button-color=transparent]{background-color:var(--transparent);border:1px solid var(--white);color:var(--white)}[style-padding-y=small]{padding-top:var(--_spaces---padding--small);padding-bottom:var(--_spaces---padding--small)}[style-padding-y=large]{padding-top:var(--_spaces---padding--large);padding-bottom:var(--_spaces---padding--large)}[style-flex]{display:flex}[style-flex=center]{justify-content:center;align-items:center}[style-flex=left]{flex-direction:column;align-items:flex-start}[style-flex=right]{flex-direction:column;align-items:flex-end}[style-text-gradient=radial]{background:radial-gradient(circle,#ff84d2 18%,#ffa49d 63%,#ff5c2a 98%);-webkit-background-clip:text;-webkit-text-fill-color:transparent}.gradient-text{background:linear-gradient(70.54deg,#ff84d2 22.76%,#ffa49d 29.68%,#ff5c2a 38.24%);background-clip:text;-webkit-background-clip:text;color:transparent;-webkit-text-fill-color:transparent}[background-clip]{background-clip:text;-webkit-background-clip:text;color:transparent;-webkit-text-fill-color:transparent}[style-scrollbar=none]{scrollbar-width:none;-ms-overflow-style:none}[style-scrollbar=none]::-webkit-scrollbar{display:none}[custom-col-span="2"]{grid-area:span 1 / span 2 / span 1 / span 2}[custom-col-span="3"]{grid-area:span 1 / span 3 / span 1 / span 3}[custom-col-span="4"]{grid-area:span 1 / span 4 / span 1 / span 4}[custom-col-span="5"]{grid-area:span 1 / span 5 / span 1 / span 5}[style-height=full]{height:100%}[style-overflow=hidden]{overflow:hidden}[code-embed]{position:absolute;z-index:-100;opacity:0;pointer-events:none}
|
|
1
|
+
[ai-gradient="1"]{background:linear-gradient(90deg,#ff84d2 2%,#ffa49d 46%,#ff5c2a 88%)}[ai-gradient="2"]{background:linear-gradient(90deg,#fd4fad 17%,#ff5200)}[style-bg-color=foreground]{background-color:var(--background-colors--foreground)}[style-bg-color=background]{background-color:var(--background-colors--background)}[style-bg-gradient="1"]{background:linear-gradient(90deg,#ff84d2 2%,#ffa49d 46%,#ff5c2a 88%)}[style-type^=h]{font-family:var(--_font-family---heading);margin:0}[style-type=h1]{font-size:var(--_text-size---heading--h1);line-height:var(--_line-height---line-height-heading-tags--h1);font-weight:var(--_font-weight---font-weight-heading-tags--h1);letter-spacing:var(--_letter-spacing---letter-spacing-heading-tags--h1)}[style-type=h2]{font-size:var(--_text-size---heading--h2);line-height:var(--_line-height---line-height-heading-tags--h2);font-weight:var(--_font-weight---font-weight-heading-tags--h2);letter-spacing:var(--_letter-spacing---letter-spacing-heading-tags--h2)}[style-type=h3]{font-size:var(--_text-size---heading--h3);line-height:var(--_line-height---line-height-heading-tags--h3);font-weight:var(--_font-weight---font-weight-heading-tags--h3);letter-spacing:var(--_letter-spacing---letter-spacing-heading-tags--h3)}[style-type=h4]{font-size:var(--_text-size---heading--h4);line-height:var(--_line-height---line-height-heading-tags--h4);font-weight:var(--_font-weight---font-weight-heading-tags--h4);letter-spacing:var(--_letter-spacing---letter-spacing-heading-tags--h4)}[style-type=h5]{font-size:var(--_text-size---heading--h5);line-height:var(--_line-height---line-height-heading-tags--h5);font-weight:var(--_font-weight---font-weight-heading-tags--h5);letter-spacing:var(--_letter-spacing---letter-spacing-heading-tags--h5)}[style-type=h6]{font-size:var(--_text-size---heading--h6);line-height:var(--_line-height---line-height-heading-tags--h6);font-weight:var(--_font-weight---font-weight-heading-tags--h6);letter-spacing:var(--_letter-spacing---letter-spacing-heading-tags--h6)}[style-type^=title-]{font-family:var(--_font-family---title)}[style-type=title-l]{font-size:var(--_text-size---title--l);line-height:var(--_line-height---line-height-title--l);font-weight:var(--_font-weight---font-weight-title--l);letter-spacing:var(--_letter-spacing---letter-spacing-body--l)}[style-type=title-m]{font-size:var(--_text-size---title--m);line-height:var(--_line-height---line-height-title--m);font-weight:var(--_font-weight---font-weight-title--m);letter-spacing:var(--_letter-spacing---letter-spacing-title--m)}[style-type=title-s]{font-size:var(--_text-size---title--s);line-height:var(--_line-height---line-height-title--s);font-weight:var(--_font-weight---font-weight-title--s);letter-spacing:var(--_letter-spacing---letter-spacing-title--s)}[style-type^=display-]{font-family:var(--_font-family---display)}[style-type=display-l]{font-size:var(--_text-size---display--l);line-height:var(--_line-height---line-height-display--l);font-weight:var(--_font-weight---font-weight-display--l);letter-spacing:var(--_letter-spacing---letter-spacing-display--l)}[style-type=display-m]{font-size:var(--_text-size---display--m);line-height:var(--_line-height---line-height-display--m);font-weight:var(--_font-weight---font-weight-display--m);letter-spacing:var(--_letter-spacing---letter-spacing-display--m)}[style-type=display-s]{font-size:var(--_text-size---display--s);line-height:var(--_line-height---line-height-display--s);font-weight:var(--_font-weight---font-weight-display--s);letter-spacing:var(--_letter-spacing---letter-spacing-display--s)}[style-type^=body-]{font-family:var(--_font-family---body)}[style-type=body-l]{font-size:var(--_text-size---body--l);line-height:var(--_line-height---line-height-body--l);font-weight:var(--_font-weight---font-weight-body--l);letter-spacing:var(--_letter-spacing---letter-spacing-body--l)}[style-type=body-m]{font-size:var(--_text-size---body--m);line-height:var(--_line-height---line-height-body--m);font-weight:var(--_font-weight---font-weight-body--m);letter-spacing:var(--_letter-spacing---letter-spacing-body--m)}[style-type=body-s]{font-size:var(--_text-size---body--s);line-height:var(--_line-height---line-height-body--s);font-weight:var(--_font-weight---font-weight-body--s);letter-spacing:var(--_letter-spacing---letter-spacing-body--s)}[style-text-align=left]{text-align:left}[style-text-align=center]{text-align:center}[style-text-align=right]{text-align:right}[style-text-color=title]{color:var(--text-colors--title)}[style-text-color=subtext]{color:var(--text-colors--subtext)}[style-text-color=subtext-light]{color:var(--text-colors--subtext-light)}[style-text-color=orange]{color:var(--text-colors--orange)}[style-button-color=orange]{background-color:var(--orange--orange40);border-color:var(--orange--orange40);color:var(--text-colors--title-inverse)}[style-button-color=white]{background-color:var(--white);border:1px solid var(--white);color:var(--text-colors--title-inverse)}[style-button-color=transparent]{background-color:var(--transparent);border:1px solid var(--white);color:var(--white)}[style-padding-y=small]{padding-top:var(--_spaces---padding--small);padding-bottom:var(--_spaces---padding--small)}[style-padding-y=large]{padding-top:var(--_spaces---padding--large);padding-bottom:var(--_spaces---padding--large)}[style-flex]{display:flex}[style-flex=center]{justify-content:center;align-items:center}[style-flex=left]{flex-direction:column;align-items:flex-start}[style-flex=right]{flex-direction:column;align-items:flex-end}[style-text-gradient=radial]{background:radial-gradient(circle,#ff84d2 18%,#ffa49d 63%,#ff5c2a 98%);-webkit-background-clip:text;-webkit-text-fill-color:transparent}.gradient-text{background:linear-gradient(70.54deg,#ff84d2 22.76%,#ffa49d 29.68%,#ff5c2a 38.24%);background-clip:text;-webkit-background-clip:text;color:transparent;-webkit-text-fill-color:transparent}[background-clip]{background-clip:text;-webkit-background-clip:text;color:transparent;-webkit-text-fill-color:transparent}[style-scrollbar=none]{scrollbar-width:none;-ms-overflow-style:none}[style-scrollbar=none]::-webkit-scrollbar{display:none}[custom-col-span="2"]{grid-area:span 1 / span 2 / span 1 / span 2}[custom-col-span="3"]{grid-area:span 1 / span 3 / span 1 / span 3}[custom-col-span="4"]{grid-area:span 1 / span 4 / span 1 / span 4}[custom-col-span="5"]{grid-area:span 1 / span 5 / span 1 / span 5}[style-height=full]{height:100%}[style-overflow=hidden]{overflow:hidden}[code-embed]{position:absolute;z-index:-100;opacity:0;pointer-events:none}
|
|
@@ -1,7 +1,7 @@
|
|
|
1
1
|
{
|
|
2
2
|
"version": 3,
|
|
3
3
|
"sources": ["../../src/global/styles.css"],
|
|
4
|
-
"sourcesContent": ["/* ==================================================\n Gradient Backgrounds\n================================================== */\n\n[ai-gradient=\"1\"] {\n background: linear-gradient(
|
|
5
|
-
"mappings": ";AAIA,CAAC;AACC;AAAA,IAAY;AAAA,
|
|
4
|
+
"sourcesContent": ["/* ==================================================\n Gradient Backgrounds\n================================================== */\n\n[ai-gradient=\"1\"] {\n background: linear-gradient(90deg,\n #ff84d2 2%,\n #ffa49d 46%,\n #ff5c2a 88%);\n}\n\n[ai-gradient=\"2\"] {\n background: linear-gradient(90deg,\n #fd4fad 17%,\n #ff5200 100%);\n}\n\n\n/* ==================================================\n Solid Backgrounds\n================================================== */\n\n[style-bg-color=\"foreground\"] {\n background-color: var(--background-colors--foreground);\n}\n\n[style-bg-color=\"background\"] {\n background-color: var(--background-colors--background);\n}\n\n/* ==================================================\n Gradient Backgrounds\n================================================== */\n[style-bg-gradient=\"1\"] {\n background: linear-gradient(90deg,\n #FF84D2 2%,\n #FFA49D 46%,\n #FF5C2A 88%);\n}\n\n/* ==================================================\n Typography \u2013 Headings\n================================================== */\n\n[style-type^=\"h\"] {\n font-family: var(--_font-family---heading);\n margin: 0;\n}\n\n[style-type=\"h1\"] {\n font-size: var(--_text-size---heading--h1);\n line-height: var(--_line-height---line-height-heading-tags--h1);\n font-weight: var(--_font-weight---font-weight-heading-tags--h1);\n letter-spacing: var(--_letter-spacing---letter-spacing-heading-tags--h1);\n}\n\n[style-type=\"h2\"] {\n font-size: var(--_text-size---heading--h2);\n line-height: var(--_line-height---line-height-heading-tags--h2);\n font-weight: var(--_font-weight---font-weight-heading-tags--h2);\n letter-spacing: var(--_letter-spacing---letter-spacing-heading-tags--h2);\n}\n\n[style-type=\"h3\"] {\n font-size: var(--_text-size---heading--h3);\n line-height: var(--_line-height---line-height-heading-tags--h3);\n font-weight: var(--_font-weight---font-weight-heading-tags--h3);\n letter-spacing: var(--_letter-spacing---letter-spacing-heading-tags--h3);\n}\n\n[style-type=\"h4\"] {\n font-size: var(--_text-size---heading--h4);\n line-height: var(--_line-height---line-height-heading-tags--h4);\n font-weight: var(--_font-weight---font-weight-heading-tags--h4);\n letter-spacing: var(--_letter-spacing---letter-spacing-heading-tags--h4);\n}\n\n[style-type=\"h5\"] {\n font-size: var(--_text-size---heading--h5);\n line-height: var(--_line-height---line-height-heading-tags--h5);\n font-weight: var(--_font-weight---font-weight-heading-tags--h5);\n letter-spacing: var(--_letter-spacing---letter-spacing-heading-tags--h5);\n}\n\n[style-type=\"h6\"] {\n font-size: var(--_text-size---heading--h6);\n line-height: var(--_line-height---line-height-heading-tags--h6);\n font-weight: var(--_font-weight---font-weight-heading-tags--h6);\n letter-spacing: var(--_letter-spacing---letter-spacing-heading-tags--h6);\n}\n\n\n/* ==================================================\n Typography \u2013 Titles\n================================================== */\n\n[style-type^=\"title-\"] {\n font-family: var(--_font-family---title);\n}\n\n[style-type=\"title-l\"] {\n font-size: var(--_text-size---title--l);\n line-height: var(--_line-height---line-height-title--l);\n font-weight: var(--_font-weight---font-weight-title--l);\n letter-spacing: var(--_letter-spacing---letter-spacing-body--l);\n}\n\n[style-type=\"title-m\"] {\n font-size: var(--_text-size---title--m);\n line-height: var(--_line-height---line-height-title--m);\n font-weight: var(--_font-weight---font-weight-title--m);\n letter-spacing: var(--_letter-spacing---letter-spacing-title--m);\n}\n\n[style-type=\"title-s\"] {\n font-size: var(--_text-size---title--s);\n line-height: var(--_line-height---line-height-title--s);\n font-weight: var(--_font-weight---font-weight-title--s);\n letter-spacing: var(--_letter-spacing---letter-spacing-title--s);\n}\n\n\n/* ==================================================\n Typography \u2013 Display\n================================================== */\n\n[style-type^=\"display-\"] {\n font-family: var(--_font-family---display);\n}\n\n[style-type=\"display-l\"] {\n font-size: var(--_text-size---display--l);\n line-height: var(--_line-height---line-height-display--l);\n font-weight: var(--_font-weight---font-weight-display--l);\n letter-spacing: var(--_letter-spacing---letter-spacing-display--l);\n}\n\n[style-type=\"display-m\"] {\n font-size: var(--_text-size---display--m);\n line-height: var(--_line-height---line-height-display--m);\n font-weight: var(--_font-weight---font-weight-display--m);\n letter-spacing: var(--_letter-spacing---letter-spacing-display--m);\n}\n\n[style-type=\"display-s\"] {\n font-size: var(--_text-size---display--s);\n line-height: var(--_line-height---line-height-display--s);\n font-weight: var(--_font-weight---font-weight-display--s);\n letter-spacing: var(--_letter-spacing---letter-spacing-display--s);\n}\n\n\n/* ==================================================\n Typography \u2013 Body\n================================================== */\n\n[style-type^=\"body-\"] {\n font-family: var(--_font-family---body);\n}\n\n[style-type=\"body-l\"] {\n font-size: var(--_text-size---body--l);\n line-height: var(--_line-height---line-height-body--l);\n font-weight: var(--_font-weight---font-weight-body--l);\n letter-spacing: var(--_letter-spacing---letter-spacing-body--l);\n}\n\n[style-type=\"body-m\"] {\n font-size: var(--_text-size---body--m);\n line-height: var(--_line-height---line-height-body--m);\n font-weight: var(--_font-weight---font-weight-body--m);\n letter-spacing: var(--_letter-spacing---letter-spacing-body--m);\n}\n\n[style-type=\"body-s\"] {\n font-size: var(--_text-size---body--s);\n line-height: var(--_line-height---line-height-body--s);\n font-weight: var(--_font-weight---font-weight-body--s);\n letter-spacing: var(--_letter-spacing---letter-spacing-body--s);\n}\n\n\n/* ==================================================\n Text Alignment & Color\n================================================== */\n\n[style-text-align=\"left\"] {\n text-align: left;\n}\n\n[style-text-align=\"center\"] {\n text-align: center;\n}\n\n[style-text-align=\"right\"] {\n text-align: right;\n}\n\n[style-text-color=\"title\"] {\n color: var(--text-colors--title);\n}\n\n[style-text-color=\"subtext\"] {\n color: var(--text-colors--subtext);\n}\n\n[style-text-color=\"subtext-light\"] {\n color: var(--text-colors--subtext-light)\n}\n\n[style-text-color=\"orange\"] {\n color: var(--text-colors--orange);\n}\n\n\n/* ==================================================\n Buttons\n================================================== */\n\n[style-button-color=\"orange\"] {\n background-color: var(--orange--orange40);\n border-color: var(--orange--orange40);\n color: var(--text-colors--title-inverse);\n}\n\n[style-button-color=\"white\"] {\n background-color: var(--white);\n border: 1px solid var(--white);\n color: var(--text-colors--title-inverse);\n}\n\n[style-button-color=\"transparent\"] {\n background-color: var(--transparent);\n border: 1px solid var(--white);\n color: var(--white);\n}\n\n\n/* ==================================================\n Spacing Utilities\n================================================== */\n\n[style-padding-y=\"small\"] {\n padding-top: var(--_spaces---padding--small);\n padding-bottom: var(--_spaces---padding--small);\n}\n\n[style-padding-y=\"large\"] {\n padding-top: var(--_spaces---padding--large);\n padding-bottom: var(--_spaces---padding--large);\n}\n\n\n/* ==================================================\n Flex Utilities\n================================================== */\n\n[style-flex] {\n display: flex;\n}\n\n[style-flex=\"center\"] {\n justify-content: center;\n align-items: center;\n}\n\n[style-flex=\"left\"] {\n flex-direction: column;\n align-items: flex-start;\n}\n\n[style-flex=\"right\"] {\n flex-direction: column;\n align-items: flex-end;\n}\n\n\n/* ==================================================\n Text Gradients\n================================================== */\n\n[style-text-gradient=\"radial\"] {\n background: radial-gradient(circle,\n #ff84d2 18%,\n #ffa49d 63%,\n #ff5c2a 98%);\n -webkit-background-clip: text;\n -webkit-text-fill-color: transparent;\n}\n\n.gradient-text {\n background: linear-gradient(70.54deg,\n #ff84d2 22.76%,\n #ffa49d 29.68%,\n #ff5c2a 38.24%);\n background-clip: text;\n -webkit-background-clip: text;\n color: transparent;\n -webkit-text-fill-color: transparent;\n}\n\n[background-clip] {\n background-clip: text;\n -webkit-background-clip: text;\n color: transparent;\n -webkit-text-fill-color: transparent;\n}\n\n\n/* ==================================================\n Scrollbar Utilities\n================================================== */\n\n[style-scrollbar=\"none\"] {\n scrollbar-width: none;\n -ms-overflow-style: none;\n}\n\n[style-scrollbar=\"none\"]::-webkit-scrollbar {\n display: none;\n}\n\n\n/* ==================================================\n Grid Utilities\n================================================== */\n\n[custom-col-span=\"2\"] {\n grid-area: span 1 / span 2 / span 1 / span 2;\n}\n\n[custom-col-span=\"3\"] {\n grid-area: span 1 / span 3 / span 1 / span 3;\n}\n\n[custom-col-span=\"4\"] {\n grid-area: span 1 / span 4 / span 1 / span 4;\n}\n\n[custom-col-span=\"5\"] {\n grid-area: span 1 / span 5 / span 1 / span 5;\n}\n\n\n/* ==================================================\n Layout & Misc\n================================================== */\n\n[style-height=\"full\"] {\n height: 100%;\n}\n\n[style-overflow=\"hidden\"] {\n overflow: hidden;\n}\n\n[code-embed] {\n position: absolute;\n z-index: -100;\n opacity: 0;\n pointer-events: none;\n}"],
|
|
5
|
+
"mappings": "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",
|
|
6
6
|
"names": []
|
|
7
7
|
}
|