{"version":3,"file":"index.modern.mjs","sources":["../src/TruConsent.jsx","../src/TruConsentModal.jsx"],"sourcesContent":["import React, { useEffect, useState } from \"react\";\n\nexport default function TruConsent({\n  bannerId,\n  apiUrl = \"https://your-api.com\",\n  userId = \"anonymous\"\n}) {\n  const [banner, setBanner] = useState(null);\n\n  useEffect(() => {\n    fetch(`${apiUrl}/banners/${bannerId}`)\n      .then((r) => r.json())\n      .then(setBanner)\n      .catch(console.error);\n  }, [bannerId, apiUrl]);\n\n  if (!banner) return null;\n\n  const submitConsent = (override = null) => {\n    const consentData = {};\n    banner.purposes.forEach((p) => {\n      if (override !== null) {\n        consentData[p] = override;\n      } else {\n        const el = document.querySelector(\n          `[data-purpose=\"${p}\"] input[type=\"checkbox\"]`\n        );\n        consentData[p] = el.checked;\n      }\n    });\n\n    fetch(`${apiUrl}/banners/${bannerId}/consent`, {\n      method: \"POST\",\n      headers: { \"Content-Type\": \"application/json\" },\n      body: JSON.stringify({ userId, consentData }),\n    }).then(() => setBanner(null));\n  };\n\n  return (\n    <div style={{\n      fontFamily: \"'Segoe UI', sans-serif\",\n      maxWidth: 500,\n      margin: \"20px auto\",\n      border: \"1px solid #e0e0e0\",\n      borderRadius: 8,\n      boxShadow: \"0 2px 8px rgba(0,0,0,0.1)\",\n      background: \"#fff\",\n      overflow: \"hidden\",\n    }}>\n      <div style={{ background: \"#f7f7f7\", padding: 16, borderBottom: \"1px solid #e0e0e0\" }}>\n        <h3 style={{ margin: 0, fontSize: 18, fontWeight: 600 }}>\n          Consents by {banner.legal_entities.join(\", \")}\n        </h3>\n      </div>\n      <div style={{ padding: 16 }}>\n        <p style={{ fontSize: 13, color: \"#555\", marginBottom: 16 }}>\n          You have all the rights to decline consents you feel are not required.\n        </p>\n        {banner.purposes.map((p) => (\n          <div key={p} data-purpose={p} style={{\n            border: \"1px solid #eee\",\n            borderRadius: 6,\n            padding: 12,\n            marginBottom: 16\n          }}>\n            <div style={{\n              display: \"flex\",\n              justifyContent: \"space-between\",\n              alignItems: \"center\",\n              marginBottom: 8\n            }}>\n              <div>\n                <b>{p}</b><br/>\n                <small style={{ color: \"#666\" }}>{banner.collection_point}</small>\n              </div>\n              <label style={{ position: \"relative\", display: \"inline-block\", width: 36, height: 20 }}>\n                <input type=\"checkbox\" defaultChecked style={{ display: \"none\" }}/>\n                <span style={{\n                  position: \"absolute\",\n                  cursor: \"pointer\",\n                  top: 0, left: 0, right: 0, bottom: 0,\n                  backgroundColor: \"#ccc\",\n                  borderRadius: 34,\n                  transition: \"0.2s\"\n                }} />\n                <span style={{\n                  position: \"absolute\",\n                  height: 14, width: 14,\n                  left: 3, bottom: 3,\n                  backgroundColor: \"#fff\",\n                  borderRadius: \"50%\",\n                  transition: \"0.2s\"\n                }} />\n              </label>\n            </div>\n            <div>\n              <b>Data Elements:</b>{\" \"}\n              {banner.data_elements.map((e) => (\n                <span key={e} style={{\n                  display: \"inline-block\",\n                  padding: \"4px 8px\",\n                  fontSize: 12,\n                  background: \"#f0f0f0\",\n                  borderRadius: 12,\n                  margin: \"4px 6px 0 0\"\n                }}>{e}</span>\n              ))}\n            </div>\n          </div>\n        ))}\n      </div>\n      <div style={{ textAlign: \"right\", padding: 16, background: \"#f7f7f7\", borderTop: \"1px solid #e0e0e0\" }}>\n        <button onClick={() => submitConsent(false)} style={{\n          padding: \"8px 16px\",\n          border: \"1px solid #ccc\",\n          background: \"#fff\",\n          borderRadius: 6,\n          cursor: \"pointer\",\n          marginRight: 8\n        }}>Reject All</button>\n        <button onClick={() => submitConsent(true)} style={{\n          padding: \"8px 16px\",\n          background: \"#F15B5B\",\n          color: \"#fff\",\n          border: \"none\",\n          borderRadius: 6,\n          cursor: \"pointer\"\n        }}>I Consent</button>\n      </div>\n    </div>\n  );\n}\n","import React, { useEffect, useState } from 'react';\nimport ReactDOM from 'react-dom';\nimport './MarsConsentModal.css';\n\n// a tiny default SVG as a data-URI\nconst DEFAULT_LOGO = `data:image/svg+xml;utf8,\n<svg xmlns=\"http://www.w3.org/2000/svg\" width=\"48\" height=\"48\" viewBox=\"0 0 100 100\">\n  <rect width=\"100\" height=\"100\" fill=\"#8e44ad\"/>\n  <text x=\"50\" y=\"55\" font-size=\"50\" text-anchor=\"middle\" fill=\"#fff\" font-family=\"Arial\">M</text>\n</svg>`;\n\nexport default function TruConsentModal({\n  bannerId,\n  apiBaseUrl = 'https://7nd6pu6evh.execute-api.ap-south-1.amazonaws.com/dev/banners',\n  logoUrl = DEFAULT_LOGO,\n  companyName = 'Mars Financial Technologies Private Limited'\n}) {\n  const [banner, setBanner] = useState(null);\n\n  useEffect(() => {\n    if (!bannerId) return;\n    fetch(`${apiBaseUrl}/${bannerId}`)\n      .then(res => res.json())\n      .then(data => setBanner(data))\n      .catch(console.error);\n  }, [bannerId, apiBaseUrl]);\n\n  if (!banner) return null;\n\n  return ReactDOM.createPortal(\n    <div className=\"mcm-overlay\">\n      <div className=\"mcm-container\">\n\n        {/* HEADER */}\n        <header className=\"mcm-header\">\n          <img src={logoUrl} alt=\"Logo\" className=\"mcm-logo\" />\n          <div className=\"mcm-header-text\">\n            <h1>Consents by {companyName}</h1>\n            <p>\n              You have all the rights to decline consents which you feel are not required by {companyName}.\n            </p>\n          </div>\n        </header>\n\n        <div className=\"mcm-separator\" />\n\n        {/* PURPOSE CARDS */}\n        <div className=\"mcm-body\">\n          {banner.purposes.map(purpose => (\n            <ConsentCard\n              key={purpose.id}\n              banner={banner}\n              purpose={purpose}\n            />\n          ))}\n        </div>\n\n        <div className=\"mcm-separator\" />\n\n        {/* FOOTER */}\n        <footer className=\"mcm-footer\">\n          <button className=\"mcm-btn reject\">Reject All</button>\n          <button className=\"mcm-btn consent\">I Consent</button>\n        </footer>\n      </div>\n    </div>,\n    document.body\n  );\n}\n\n// ConsentCard, Chevron, formatExpiry are unchanged from the previous version\nfunction ConsentCard({ banner, purpose }) {\n  const [openData, setOpenData] = useState(false);\n  const [openLegal, setOpenLegal] = useState(false);\n  const [openTools, setOpenTools] = useState(false);\n\n  return (\n    <div className=\"mcm-card\">\n      <div className=\"mcm-card-header\">\n        <div>\n          <h2>{purpose.name}</h2>\n          <p className=\"mcm-purpose-desc\">{purpose.description}</p>\n        </div>\n        <div className=\"mcm-card-actions\">\n          {purpose.is_mandatory && <span className=\"badge mandatory\">Mandatory</span>}\n          <span className=\"badge expiry\">Expiry Type: {formatExpiry(purpose.expiry_period)}</span>\n          <label className=\"switch\">\n            <input type=\"checkbox\" defaultChecked />\n            <span className=\"track\" />\n            <span className=\"thumb\" />\n          </label>\n          <span className=\"toggle-label\">Accept</span>\n        </div>\n      </div>\n\n      <div className=\"accordion\">\n        <button className=\"accordion-btn\" onClick={()=>setOpenData(!openData)}>\n          Data Elements\n          <Chevron open={openData} />\n        </button>\n        {openData && (\n          <div className=\"panel\">\n            {banner.data_elements.map(el => (\n              <span key={el.id} className=\"pill\">{el.name}</span>\n            ))}\n          </div>\n        )}\n\n        <button className=\"accordion-btn\" onClick={()=>setOpenLegal(!openLegal)}>\n          Legal Entities\n          <Chevron open={openLegal} />\n        </button>\n        {openLegal && (\n          <div className=\"panel\">\n            {banner.legal_entities.map(le => (\n              <span key={le.id} className=\"pill\">{le.name}</span>\n            ))}\n          </div>\n        )}\n\n        <button className=\"accordion-btn\" onClick={()=>setOpenTools(!openTools)}>\n          Tools\n          <Chevron open={openTools} />\n        </button>\n        {openTools && (\n          <div className=\"panel\">\n            {banner.tools?.map((t,i) => (\n              <span key={i} className=\"pill\">{t}</span>\n            ))}\n          </div>\n        )}\n      </div>\n    </div>\n  );\n}\n\nfunction Chevron({ open }) {\n  return (\n    <svg\n      className={`chevron ${open ? 'open' : ''}`}\n      width=\"16\" height=\"16\"\n      viewBox=\"0 0 24 24\"\n    >\n      <path d=\"M6 9l6 6 6-6\" fill=\"none\" stroke=\"#333\" strokeWidth=\"2\"/>\n    </svg>\n  );\n}\n\nfunction formatExpiry(uuid) {\n  const map = {\n    '7a203e84-016b-4f61-b776-2375dd1755e4': 'One Year'\n  };\n  return map[uuid] || uuid;\n}\n"],"names":["TruConsent","bannerId","apiUrl","userId","banner","setBanner","useState","useEffect","fetch","then","r","json","catch","console","error","submitConsent","override","consentData","purposes","forEach","p","el","document","querySelector","checked","method","headers","body","JSON","stringify","React","createElement","style","fontFamily","maxWidth","margin","border","borderRadius","boxShadow","background","overflow","padding","borderBottom","fontSize","fontWeight","legal_entities","join","color","marginBottom","map","key","display","justifyContent","alignItems","collection_point","position","width","height","type","defaultChecked","cursor","top","left","right","bottom","backgroundColor","transition","data_elements","e","textAlign","borderTop","onClick","marginRight","TruConsentModal","apiBaseUrl","logoUrl","companyName","res","data","ReactDOM","createPortal","className","src","alt","purpose","ConsentCard","id","_banner$tools","openData","setOpenData","openLegal","setOpenLegal","openTools","setOpenTools","name","description","is_mandatory","uuid","expiry_period","Chevron","open","le","tools","t","i","viewBox","d","fill","stroke","strokeWidth"],"mappings":"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"}