@initweb-fr/datacamp 0.0.0 → 0.0.2

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/index.js CHANGED
@@ -1 +1 @@
1
- "use strict";(()=>{var r=(e=document)=>{let o="Last Published:";for(let t of e.childNodes)if(t.nodeType===Node.COMMENT_NODE&&t.textContent?.includes(o)){let n=t.textContent.trim().split(o)[1];if(n)return new Date(n)}};var s=e=>{let o=r();console.log(`Hello ${e}!`),console.log(`This site was last published on ${o?.toLocaleDateString("en-US",{year:"numeric",month:"long",day:"2-digit"})}.`)};window.Webflow||(window.Webflow=[]);window.Webflow.push(()=>{s("John Doe")});})();
1
+ "use strict";(()=>{function T(){document.querySelectorAll('input[type="radio"][name="access"]').forEach(e=>{e.addEventListener("click",o=>{o.preventDefault(),m(e.value)})})}function I(t){document.querySelectorAll(".w-radio").forEach(e=>{let o=e.querySelector('input[type="radio"]'),n=e.querySelector(".w-radio-input");if(!o||!n)return;let r=o.value===t;o.checked=r,n.classList.toggle("w--redirected-checked",r)})}var S="access";function A(){let e=new URLSearchParams(window.location.search).get(S)||"global";console.log("accessID from URL :",e),m(e)}function F(t){let e=new URL(window.location.href);t==="global"?e.searchParams.delete(S):e.searchParams.set(S,t),window.history.replaceState({},"",e.toString())}var f="test";function M(){return f}function m(t){f!==t&&(f=t,console.log("accessID State:",f),F(f),I(f))}function D(){document.querySelectorAll("[dc-access-id]").forEach(e=>{e.addEventListener("click",()=>{let o=e.getAttribute("dc-access-id");o&&m(o)})})}var p="dc_forms_data",c=R();function w(t){if(t?.storageKey&&t.storageKey!==p){p=t.storageKey;let e=R();Object.keys(c.pages).forEach(o=>delete c.pages[o]),Object.assign(c.pages,e.pages)}}function R(){try{let t=localStorage.getItem(p);if(t)return JSON.parse(t)}catch(t){console.error("Error loading forms state:",t),console.error("[formsState] Invalid localStorage data")}return{pages:{}}}function x(){localStorage.setItem(p,JSON.stringify(c))}function H(t,e){c.pages[t]||(c.pages[t]={forms:{}});let{forms:o}=c.pages[t];if(e==="global"){c.pages[t].forms={global:{submitted:!0}},x();return}o.global?.submitted||(o[e]={submitted:!0},x())}function _(t,e){let o=c.pages[t];return o?o.forms.global?.submitted?!0:!!o.forms[e]?.submitted:!1}function O(t){return t?t.split(",").map(e=>e.trim()).filter(Boolean):[]}function C(t,e){return e.some(o=>_(t,o))}function g(){let t=window.location.pathname;document.querySelectorAll("[data-show-if-form]").forEach(e=>{let o=O(e.dataset.showIfForm),n=C(t,o);e.style.display=n?"flex":"none"}),document.querySelectorAll("[data-hide-if-form]").forEach(e=>{let o=O(e.dataset.hideIfForm),n=C(t,o);e.style.display=n?"none":"flex"})}var N={storageKey:"form_data",fieldsToSave:[],logPrefix:"[formDataStorage]"},l={...N},u={user:{}};function y(t){typeof console<"u"&&console.error(`${l.logPrefix} ${t}`)}function k(t){return l.fieldsToSave.length===0?!0:l.fieldsToSave.includes(t)}function Q(){try{let t=localStorage.getItem(l.storageKey);if(!t)return{user:{}};let e=JSON.parse(t);return e&&typeof e=="object"&&e.user&&typeof e.user=="object"?e:(y("Invalid data structure in localStorage, using default"),{user:{}})}catch(t){return y(`Error loading form data: ${t}`),{user:{}}}}function P(t){try{let e={...t.user};if(l.fieldsToSave.length>0){let r={};for(let i of l.fieldsToSave)i in e&&(r[i]=e[i]);for(let i of Object.keys(e))l.fieldsToSave.includes(i)||(r[i]=e[i]);e=r}let o={user:e},n=JSON.stringify(o);localStorage.setItem(l.storageKey,n),u=o}catch(e){y(`Error saving form data: ${e}`)}}function q(t){try{let e=localStorage.getItem(t);if(!e)return;let o=JSON.parse(e),n={};o.user?.infos&&typeof o.user.infos=="object"?n=o.user.infos:o.user&&typeof o.user=="object"?n=o.user:typeof o=="object"&&!Array.isArray(o)&&(n=o),Object.keys(n).length>0&&(u={user:n},P(u),localStorage.removeItem(t))}catch(e){y(`Error migrating old data: ${e}`)}}function W(t){return u.user[t]}function V(t){let e=t?[t]:Array.from(document.querySelectorAll("form"));for(let o of e){let n=o.querySelectorAll("input[name], textarea[name], select[name]");for(let r of n){let i=r.getAttribute("name");if(!i||!k(i))continue;let a=r.value.trim();u.user[i]=a}}P(u)}function X(){let t=document.querySelectorAll("input[name], textarea[name], select[name]");for(let e of t){let o=e.getAttribute("name");if(!o||!k(o))continue;let n=W(o);n&&e.value===""&&(e.value=n)}}function z(t){l={...N,...t},u=Q(),q("user_form_data"),l.storageKey!=="form_data"&&q(l.storageKey),X()}function U(t){let e=document.querySelectorAll("form");e.length&&e.forEach(o=>{o.addEventListener("submit",()=>{V(o);let n=M();H(t,n),g()})})}function Z(){document.body.style.overflow="hidden"}function ee(){document.body.style.overflow=""}function te(t){let e=document.querySelector(`[dc-modal-element="wrapper"][dc-modal-id="${t}"]`);e&&(e.style.display="flex",e.setAttribute("data-modal-open","true"),Z())}function oe(t){t.style.display="none",t.setAttribute("data-modal-open","false"),document.querySelector('[data-modal-open="true"]')||ee()}function j(){let t=document.querySelectorAll('[dc-button-action="modal"]'),e=document.querySelectorAll('[dc-modal-element="overlay"]');t.forEach(o=>{o.addEventListener("click",n=>{n.preventDefault();let r=o.getAttribute("dc-modal-id");r&&te(r)})}),e.forEach(o=>{o.addEventListener("click",n=>{n.preventDefault();let r=o.closest('[dc-modal-element="wrapper"][dc-modal-id]');r&&oe(r)})})}var B={fr:"Veuillez entrer une adresse email valide.",en:"Please enter a valid email address.",es:"Introduce una direcci\xF3n de correo v\xE1lida.",de:"Bitte geben Sie eine g\xFCltige E-Mail-Adresse ein.",it:"Inserisci un indirizzo email valido.",pt:"Insira um endere\xE7o de email v\xE1lido.",nl:"Voer een geldig e-mailadres in.",default:"Please enter a valid email address."};function E(t){let e=t||navigator.language.split("-")[0].toLowerCase();return B[e]||B.default}function ne(t){return/\S+@\S+\.\S+/.test(t)}function K(){document.querySelectorAll("form").forEach(e=>{let o=e.querySelector('input[type="email"]'),n=e.querySelector('button[type="submit"], input[type="submit"]');if(!o||!n)return;let r=e.querySelector("[data-error-email]");if(!r){r=document.createElement("div"),r.setAttribute("data-error-email","");let s;s=E("en"),r.textContent=s,r.style.color="red",r.style.fontSize="0.85rem",r.style.marginTop="4px",r.style.display="none",o.insertAdjacentElement("afterend",r)}let i=!1,a=()=>{let s=o.value.trim(),d=ne(s);!i&&s.length>0&&(i=!0),d?(n.style.opacity="1",n.style.pointerEvents="auto",r.style.display="none"):(n.style.opacity="0.5",n.style.pointerEvents="none",r.style.display=i?"block":"none")};o.addEventListener("input",a),o.addEventListener("blur",a)})}function J(){if(typeof window>"u")return;let t=window.intlTelInput;if(!t){console.warn("intlTelInput is not loaded (CDN missing)");return}let e=document.querySelectorAll('input[type="tel"]');e.length&&(e.forEach(o=>{if(o.dataset.itiInitialized)return;o.dataset.itiInitialized="true";let n=t(o,{initialCountry:"us",separateDialCode:!0,nationalMode:!1,autoPlaceholder:"polite",formatOnDisplay:!0,dropdownContainer:document.body});o._iti=n;let i=o.closest("form")?.querySelector("input[data-phone-dial-code]"),a=()=>{if(!i)return;let d=n.getSelectedCountryData();i.value=d?`+${d.dialCode}`:""};o.addEventListener("countrychange",a),o.addEventListener("input",a)}),document.addEventListener("click",o=>{let n=o.target?.closest(".iti__flag-container");if(!n)return;let r=n.closest(".iti");if(!r)return;let i=r.querySelector('input[type="tel"]'),a=document.querySelector(".iti__country-list");if(!i||!a)return;let s=i.getBoundingClientRect();a.style.width=`${s.width}px`}),window.addEventListener("resize",()=>{let o=document.querySelector(".iti__country-list");if(!o||o.style.display==="none")return;let n=document.querySelector(".iti input[type='tel']:focus");if(!n)return;let r=n.getBoundingClientRect();o.style.width=`${r.width}px`}))}var b={fr:"Veuillez entrer un num\xE9ro de t\xE9l\xE9phone valide.",be:"Veuillez entrer un num\xE9ro de t\xE9l\xE9phone valide.",ch:"Veuillez entrer un num\xE9ro de t\xE9l\xE9phone valide.",lu:"Veuillez entrer un num\xE9ro de t\xE9l\xE9phone valide.",mc:"Veuillez entrer un num\xE9ro de t\xE9l\xE9phone valide.",us:"Enter a valid phone number.",gb:"Enter a valid phone number.",ca:"Enter a valid phone number.",au:"Enter a valid phone number.",nz:"Enter a valid phone number.",ie:"Enter a valid phone number.",es:"Introduce un n\xFAmero de tel\xE9fono v\xE1lido.",mx:"Introduce un n\xFAmero de tel\xE9fono v\xE1lido.",ar:"Introduce un n\xFAmero de tel\xE9fono v\xE1lido.",co:"Introduce un n\xFAmero de tel\xE9fono v\xE1lido.",cl:"Introduce un n\xFAmero de tel\xE9fono v\xE1lido.",de:"Bitte geben Sie eine g\xFCltige Telefonnummer ein.",at:"Bitte geben Sie eine g\xFCltige Telefonnummer ein.",it:"Inserisci un numero di telefono valido.",pt:"Insira um n\xFAmero de telefone v\xE1lido.",br:"Insira um n\xFAmero de telefone v\xE1lido.",nl:"Voer een geldig telefoonnummer in.",default:"Enter a valid phone number."};function h(t){if(!t)return b.default;let e=t.toLowerCase();return b[e]||b.default}function $(){if(!1){let t=navigator.language.split("-")[0].toLowerCase();return h(t)}return h("us")}function re(t){t.textContent=$()}function G(){document.querySelectorAll("form").forEach(e=>{let o=e.querySelector('input[type="tel"]'),n=e.querySelector('button[type="submit"], input[type="submit"]');if(!o||!n)return;let r=o._iti;if(!r)return;let i=e.querySelector("[data-error-phone]");i||(i=document.createElement("div"),i.setAttribute("data-error-phone",""),i.textContent=$(),i.style.color="red",i.style.fontSize="0.85rem",i.style.marginTop="4px",i.style.display="none",o.insertAdjacentElement("afterend",i));let a=!1,s=()=>{let L=o.value.trim(),Y=L.length>0&&r.isValidNumber();!a&&L.length>0&&(a=!0),Y?(n.style.opacity="1",n.style.pointerEvents="auto",i.style.display="none"):(n.style.opacity="0.5",n.style.pointerEvents="none",i.style.display=a?"block":"none")},d=()=>{re(i),s()};o.addEventListener("input",s),o.addEventListener("blur",s),o.addEventListener("countrychange",d)})}var ie=window.location.pathname;document.addEventListener("DOMContentLoaded",()=>{j(),A(),T(),D(),g(),J(),G(),K(),z({storageKey:"dc_user_data",fieldsToSave:["firstName","lastName","jobTitle","company","companyEmail"]}),w({storageKey:"dc_forms_data"}),U(ie)});})();
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "@initweb-fr/datacamp",
3
- "version": "0.0.0",
3
+ "version": "0.0.2",
4
4
  "description": "Custom Code for Datacamp Webflow Ecosystem.",
5
5
  "homepage": "https://github.com/initweb-fr/datacamp#readme",
6
6
  "license": "ISC",
@@ -22,19 +22,6 @@
22
22
  "files": [
23
23
  "dist"
24
24
  ],
25
- "packageManager": "pnpm@10.11.0",
26
- "scripts": {
27
- "dev": "cross-env NODE_ENV=development node ./bin/build.js",
28
- "build": "cross-env NODE_ENV=production node ./bin/build.js",
29
- "lint": "eslint ./src && prettier --check ./src",
30
- "lint:fix": "eslint ./src --fix",
31
- "check": "tsc --noEmit",
32
- "format": "prettier --write ./src",
33
- "test": "playwright test",
34
- "test:ui": "playwright test --ui",
35
- "release": "changeset publish",
36
- "update": "pnpm update -i -L -r"
37
- },
38
25
  "devDependencies": {
39
26
  "@changesets/changelog-git": "^0.2.0",
40
27
  "@changesets/cli": "^2.27.12",
@@ -60,5 +47,17 @@
60
47
  },
61
48
  "publishConfig": {
62
49
  "provenance": false
50
+ },
51
+ "scripts": {
52
+ "dev": "cross-env NODE_ENV=development node ./bin/build.js",
53
+ "build": "cross-env NODE_ENV=production node ./bin/build.js",
54
+ "lint": "eslint ./src && prettier --check ./src",
55
+ "lint:fix": "eslint ./src --fix",
56
+ "check": "tsc --noEmit",
57
+ "format": "prettier --write ./src",
58
+ "test": "playwright test",
59
+ "test:ui": "playwright test --ui",
60
+ "release": "changeset publish",
61
+ "update": "pnpm update -i -L -r"
63
62
  }
64
- }
63
+ }
package/src/index.ts CHANGED
@@ -1,2 +1,47 @@
1
- window.Webflow ||= [];
2
- window.Webflow.push(() => {});
1
+ import { initAccessButtons } from './scripts/ui/accessButtons';
2
+ import { initAccessRadios } from './scripts/ui/accessRadios';
3
+ import { updateConditionalDisplay } from './scripts/ui/conditionalDisplay';
4
+ import { initFormSubmitListener } from './scripts/ui/formSubmit';
5
+ import { initModals } from './scripts/ui/modals';
6
+ import { initAccessFromURL } from './scripts/users/access';
7
+ import { initFormDataStorage } from './scripts/users/formDataStorage';
8
+ import { initFormsState } from './scripts/users/formsState';
9
+ import { initEmailValidation } from './scripts/validation/emailField/emailValidation';
10
+ import { initPhoneFields } from './scripts/validation/phoneField/phoneField';
11
+ import { initPhoneValidation } from './scripts/validation/phoneField/phoneValidation';
12
+
13
+ const PAGE_PATH = window.location.pathname;
14
+
15
+ document.addEventListener('DOMContentLoaded', () => {
16
+ // Ceci est un commentaire de test pour la release
17
+ // Initialize modals
18
+ initModals();
19
+
20
+ // Access control (URL, radio, button)
21
+ initAccessFromURL();
22
+ initAccessRadios();
23
+ initAccessButtons();
24
+
25
+ // Update UI based on conditions (conditional display)
26
+ updateConditionalDisplay();
27
+
28
+ // Initialize form fields and validation
29
+ initPhoneFields(); // Phone field input UI
30
+ initPhoneValidation(); // Phone input validation
31
+ initEmailValidation(); // Email input validation
32
+
33
+ // Save form data to localStorage on form submission
34
+ // Les données sont stockées dans un JSON unique : { user: { firstName: xxx, lastName: xxx, ... } }
35
+ initFormDataStorage({
36
+ storageKey: 'dc_user_data',
37
+ fieldsToSave: ['firstName', 'lastName', 'jobTitle', 'company', 'companyEmail'],
38
+ });
39
+
40
+ // Initialize forms state (tracking of form submissions)
41
+ initFormsState({
42
+ storageKey: 'dc_forms_data',
43
+ });
44
+
45
+ // Listen to form submissions
46
+ initFormSubmitListener(PAGE_PATH);
47
+ });