signals-embed 0.0.1-security → 1.0.3

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.

Potentially problematic release.


This version of signals-embed might be problematic. Click here for more details.

package/README.md CHANGED
@@ -1,5 +1,2 @@
1
- # Security holding package
2
-
3
- This package contained malicious code and was removed from the registry by the npm security team. A placeholder was published to ensure users are not affected in the future.
4
-
5
- Please refer to www.npmjs.com/advisories?search=signals-embed for more information.
1
+ # signals-embed
2
+ Один JS со «снимком» сайта Signals Research для вставки в Google Sites без iframe и без внешних запросов.
package/package.json CHANGED
@@ -1,6 +1,35 @@
1
- {
2
- "name": "signals-embed",
3
- "version": "0.0.1-security",
4
- "description": "security holding package",
5
- "repository": "npm/security-holder"
6
- }
1
+ {
2
+ "name": "signals-embed",
3
+ "version": "1.0.3",
4
+ "description": "Встраиваемый автономный снапшот сайта Signals Research для Google Sites (без iframe, без внешних запросов)",
5
+ "main": "signals-embed.js",
6
+ "type": "module",
7
+ "scripts": {
8
+ "build": "node tools/build.js",
9
+ "publish:patch": "npm version patch && npm publish --access public"
10
+ },
11
+ "author": "Вы",
12
+ "license": "MIT",
13
+ "dependencies": {},
14
+ "devDependencies": {
15
+ "jsdom": "^24.0.0",
16
+ "node-fetch": "^3.3.2",
17
+ "clean-css": "^5.3.3",
18
+ "mime-types": "^2.1.35"
19
+ },
20
+ "files": [
21
+ "signals-embed.js",
22
+ "README.md"
23
+ ],
24
+ "publishConfig": {
25
+ "access": "public"
26
+ },
27
+ "keywords": [
28
+ "embed",
29
+ "google-sites",
30
+ "jsdelivr",
31
+ "snapshot",
32
+ "no-iframe",
33
+ "autonomous"
34
+ ]
35
+ }
@@ -0,0 +1 @@
1
+ (()=>{const s=document.currentScript,t=s?.dataset?.target||"signals-embed-root";let r=document.getElementById(t);if(!r){r=document.createElement("div");r.id=t;s.insertAdjacentElement("afterend",r);}const sh=r.attachShadow?r.attachShadow({mode:"open"}):r,st=document.createElement("style");st.textContent=":host,:root{all:initial}*,*::before,*::after{box-sizing:border-box}html,body{margin:0;padding:0}.__signals-container{width:100vw;height:100vh}*{margin:0;padding:0;box-sizing:border-box}:root{--primary-color:#4A5568;--secondary-color:#2D3748;--accent-color:#718096;--text-primary:#1A202C;--text-secondary:#4A5568;--text-light:#718096;--background-white:#FFFFFF;--background-light:#F7FAFC;--background-gray:#EDF2F7;--border-color:#E2E8F0;--success-color:#38A169;--spacing-xs:8px;--spacing-sm:16px;--spacing-md:24px;--spacing-lg:32px;--spacing-xl:48px;--spacing-xxl:64px}body{font-family:'Inter',-apple-system,BlinkMacSystemFont,'Segoe UI',Roboto,Oxygen,Ubuntu,Cantarell,sans-serif;line-height:1.6;color:var(--text-primary);background-color:var(--background-white)}.container{max-width:1200px;margin:0 auto;padding:0 var(--spacing-sm)}h1,h2,h3,h4,h5,h6{line-height:1.3;font-weight:600;color:var(--text-primary);margin-bottom:var(--spacing-sm)}h1{font-size:2.5rem}h2{font-size:2rem}h3{font-size:1.5rem}.section-title{text-align:center;margin-bottom:var(--spacing-xl);color:var(--primary-color)}.header{background:var(--background-white);padding:var(--spacing-md) 0;border-bottom:1px solid var(--border-color);position:sticky;top:0;z-index:100}.logo-container{display:flex;align-items:center;gap:var(--spacing-sm)}.logo-link{display:flex;align-items:center;gap:var(--spacing-sm);text-decoration:none}.logo-svg{width:48px;height:48px}.brand-name{font-size:1.75rem;font-weight:700;color:var(--primary-color);margin:0}.page-title{padding:var(--spacing-xxl) 0 var(--spacing-xl);background:linear-gradient(135deg,var(--background-light) 0%,var(--background-gray) 100%);text-align:center}.page-title h1{font-size:3rem;font-weight:700;color:var(--primary-color);margin-bottom:var(--spacing-sm)}.page-subtitle{font-size:1.125rem;color:var(--text-secondary);margin:0}.content-section{padding:var(--spacing-xxl) 0}.content-section.alt-bg{background:var(--background-light)}.content-text{max-width:800px;margin:0 auto;font-size:1.125rem;line-height:1.7;color:var(--text-secondary)}.content-text p{margin-bottom:var(--spacing-md)}.content-text ul,.content-text ol{margin:var(--spacing-md) 0;padding-left:var(--spacing-lg)}.content-text li{margin-bottom:var(--spacing-xs)}.content-text h3{color:var(--primary-color);margin-top:var(--spacing-lg);margin-bottom:var(--spacing-sm);font-size:1.25rem}.content-grid{display:grid;grid-template-columns:repeat(auto-fit,minmax(300px,1fr));gap:var(--spacing-lg);margin-top:var(--spacing-xl)}.content-item{background:var(--background-white);padding:var(--spacing-lg);border-radius:12px;text-align:center;box-shadow:0 2px 8px rgba(0,0,0,0.08)}.content-icon{width:64px;height:64px;margin:0 auto var(--spacing-md);background:var(--background-light);border-radius:50%}.content-icon svg{width:100%;height:100%}.content-item h3{color:var(--primary-color);margin-bottom:var(--spacing-sm);text-align:center}.content-item p{color:var(--text-secondary);text-align:center;margin:0}.content-image{margin:var(--spacing-xl) auto;max-width:800px;border-radius:12px;overflow:hidden;box-shadow:0 6px 24px rgba(0,0,0,0.1)}.content-image img{width:100%;height:350px;object-fit:cover;display:block}.compliance-notice{background:var(--background-white);border:1px solid var(--border-color);border-radius:8px;padding:var(--spacing-md);margin-top:var(--spacing-lg);display:flex;gap:var(--spacing-sm);align-items:flex-start}.notice-icon{width:24px;height:24px;background:var(--accent-color);border-radius:50%;flex-shrink:0;margin-top:2px}.notice-text{font-size:0.875rem;color:var(--text-secondary);line-height:1.5}.contact-info{display:flex;flex-direction:column;gap:var(--spacing-lg);margin-top:var(--spacing-xl)}.contact-item{display:flex;align-items:flex-start;gap:var(--spacing-md)}.contact-icon{width:48px;height:48px;background:var(--primary-color);border-radius:8px;flex-shrink:0}.contact-details h3{color:var(--primary-color);margin-bottom:var(--spacing-xs);font-size:1.125rem}.contact-link{color:var(--text-secondary);text-decoration:none;font-weight:500;font-size:1.125rem}.contact-link:hover{color:var(--primary-color)}.contact-text{color:var(--text-secondary);font-size:1.125rem;margin:0}.footer{background:var(--secondary-color);color:white;padding:var(--spacing-xl) 0;margin-top:var(--spacing-xxl)}.footer-content{display:grid;grid-template-columns:1fr auto 1fr;gap:var(--spacing-lg);align-items:flex-start}.footer-brand{display:flex;align-items:center;gap:var(--spacing-sm)}.footer-logo{width:40px;height:40px}.footer-brand-name{font-size:1.25rem;font-weight:700;color:white}.footer-links{display:flex;flex-direction:column;gap:var(--spacing-xs);align-items:center}.footer-links a{color:#CBD5E0;text-decoration:none;font-weight:500;padding:var(--spacing-xs) var(--spacing-sm);border-radius:4px;transition:color 0.2s ease,background-color 0.2s ease}.footer-links a:hover{color:white;background-color:rgba(255,255,255,0.1)}.footer-info{text-align:right;max-width:400px;justify-self:end}.footer-info p{color:#CBD5E0;margin-bottom:var(--spacing-xs)}.footer-disclaimer{font-size:0.875rem;color:#A0AEC0;line-height:1.4}.content-icon svg,.contact-icon svg,.footer-logo svg,.logo-svg svg,.notice-icon svg{width:100%;height:100%}#precisionIcon,#testingIcon,#qualityIcon,#materialsIcon{background:var(--primary-color);border-radius:50%}@media (max-width:768px){.container{padding:0 var(--spacing-sm)}.page-title h1{font-size:2rem}.section-title{font-size:1.75rem}.content-text{font-size:1rem}.content-grid{grid-template-columns:1fr}.footer-content{grid-template-columns:1fr;text-align:center;gap:var(--spacing-lg)}.footer-info{text-align:center;justify-self:center}.footer-links{order:-1}.contact-info{gap:var(--spacing-md)}.contact-item{flex-direction:column;align-items:center;text-align:center;gap:var(--spacing-sm)}}@media (max-width:480px){.page-title h1{font-size:1.75rem}.section-title{font-size:1.5rem}.content-text{font-size:0.95rem}.content-section{padding:var(--spacing-xl) 0}.page-title{padding:var(--spacing-xl) 0 var(--spacing-lg)}.content-image{margin:var(--spacing-lg) auto}.content-image img{height:250px}}.cookie-banner{position:fixed;bottom:0;left:0;right:0;background:var(--background-white);border-top:1px solid var(--border-color);padding:var(--spacing-md);box-shadow:0 -2px 8px rgba(0,0,0,0.1);z-index:1000;display:none}.cookie-banner.show{display:block}.cookie-banner-content{max-width:1200px;margin:0 auto;display:flex;align-items:center;justify-content:space-between;gap:var(--spacing-md)}.cookie-banner-text{flex:1;font-size:0.875rem;color:var(--text-secondary);line-height:1.4}.cookie-banner-text a{color:var(--primary-color);text-decoration:none}.cookie-banner-text a:hover{text-decoration:underline}.cookie-banner-actions{display:flex;gap:var(--spacing-sm);align-items:center}.cookie-btn{padding:var(--spacing-xs) var(--spacing-sm);border:1px solid var(--border-color);border-radius:4px;font-size:0.875rem;font-weight:500;cursor:pointer;transition:all 0.2s ease;white-space:nowrap}.cookie-btn-accept{background:var(--primary-color);color:white;border-color:var(--primary-color)}.cookie-btn-accept:hover{background:var(--secondary-color);border-color:var(--secondary-color)}.cookie-btn-reject{background:var(--background-white);color:var(--text-secondary)}.cookie-btn-reject:hover{background:var(--background-light)}.cookie-btn-customize{background:var(--background-white);color:var(--primary-color);border-color:var(--primary-color)}.cookie-btn-customize:hover{background:var(--background-light)}.cookie-modal{position:fixed;top:0;left:0;right:0;bottom:0;background:rgba(0,0,0,0.5);z-index:1001;display:none;align-items:center;justify-content:center;padding:var(--spacing-md)}.cookie-modal.show{display:flex}.cookie-modal-content{background:var(--background-white);border-radius:8px;padding:var(--spacing-lg);max-width:600px;width:100%;max-height:80vh;overflow-y:auto}.cookie-modal-header{margin-bottom:var(--spacing-md)}.cookie-modal-title{font-size:1.25rem;font-weight:600;color:var(--primary-color);margin-bottom:var(--spacing-xs)}.cookie-modal-description{font-size:0.875rem;color:var(--text-secondary);line-height:1.5}.cookie-category{margin-bottom:var(--spacing-md);padding:var(--spacing-sm);border:1px solid var(--border-color);border-radius:6px}.cookie-category-header{display:flex;align-items:center;justify-content:space-between;margin-bottom:var(--spacing-xs)}.cookie-category-title{font-weight:600;color:var(--text-primary);font-size:0.95rem}.cookie-category-description{font-size:0.8rem;color:var(--text-secondary);line-height:1.4}.cookie-toggle{position:relative;display:inline-block;width:44px;height:24px}.cookie-toggle input{opacity:0;width:0;height:0}.cookie-slider{position:absolute;cursor:pointer;top:0;left:0;right:0;bottom:0;background-color:#ccc;transition:0.2s;border-radius:24px}.cookie-slider:before{position:absolute;content:"";height:18px;width:18px;left:3px;bottom:3px;background-color:white;transition:0.2s;border-radius:50%}input:checked + .cookie-slider{background-color:var(--primary-color)}input:checked + .cookie-slider:before{transform:translateX(20px)}input:disabled + .cookie-slider{opacity:0.5;cursor:not-allowed}.cookie-modal-actions{display:flex;gap:var(--spacing-sm);justify-content:flex-end;margin-top:var(--spacing-lg);padding-top:var(--spacing-md);border-top:1px solid var(--border-color)}.cookie-modal-btn{padding:var(--spacing-xs) var(--spacing-md);border:1px solid var(--border-color);border-radius:4px;font-size:0.875rem;font-weight:500;cursor:pointer;transition:all 0.2s ease}.cookie-modal-btn-save{background:var(--primary-color);color:white;border-color:var(--primary-color)}.cookie-modal-btn-save:hover{background:var(--secondary-color);border-color:var(--secondary-color)}.cookie-modal-btn-cancel{background:var(--background-white);color:var(--text-secondary)}.cookie-modal-btn-cancel:hover{background:var(--background-light)}@media (max-width:768px){.cookie-banner-content{flex-direction:column;align-items:stretch;gap:var(--spacing-sm)}.cookie-banner-actions{justify-content:center;flex-wrap:wrap}.cookie-modal-content{margin:var(--spacing-sm);padding:var(--spacing-md)}.cookie-modal-actions{flex-direction:column}}";const c=document.createElement("div");c.className="__signals-container";c.innerHTML="\n<!-- Header Section -->\n<header class=\"header\">\n<div class=\"container\">\n<div class=\"logo-container\">\n<a class=\"logo-link\" href=\"index.html\">\n<div class=\"logo-svg\" id=\"logoSvg\"></div>\n<h1 class=\"brand-name\">Offlido</h1>\n</a>\n</div>\n</div>\n</header>\n<!-- Page Title Section -->\n<section class=\"page-title\">\n<div class=\"container\">\n<h1>Privacy Policy</h1>\n<p class=\"page-subtitle\">Last updated: March 15, 2024</p>\n</div>\n</section>\n<!-- Introduction Section -->\n<section class=\"content-section\">\n<div class=\"container\">\n<h2 class=\"section-title\">Introduction</h2>\n<div class=\"content-text\">\n<p>At Offlido, we are committed to protecting your privacy and ensuring the security of your personal information. This Privacy Policy explains how we collect, use, disclose, and safeguard your information when you visit our website, contact us, or purchase our products.</p>\n<p>By using our website or services, you consent to the data practices described in this policy. We encourage you to read this policy carefully and contact us if you have any questions about our privacy practices.</p>\n<p>This policy applies to all information collected by Offlido through our website, telephone communications, email correspondence, and any other means of communication between you and our company.</p>\n</div>\n</div>\n</section>\n<!-- Information We Collect Section -->\n<section class=\"content-section alt-bg\">\n<div class=\"container\">\n<h2 class=\"section-title\">Information We Collect</h2>\n<div class=\"content-text\">\n<h3>Personal Information You Provide</h3>\n<p>We may collect personal information that you voluntarily provide to us when you:</p>\n<ul>\n<li>Contact us via phone, email, or other communication methods</li>\n<li>Request information about our products or services</li>\n<li>Place an order for our products</li>\n<li>Subscribe to our communications or newsletters</li>\n<li>Participate in surveys or feedback requests</li>\n<li>Apply for employment with our company</li>\n<li>Register for events or webinars</li>\n<li>Submit testimonials or reviews</li>\n</ul>\n<h3>Automatically Collected Information</h3>\n<p>When you visit our website, we may automatically collect certain information about your device and browsing behavior, including:</p>\n<ul>\n<li>IP address and approximate geographic location</li>\n<li>Browser type, version, and language settings</li>\n<li>Operating system and device information</li>\n<li>Pages visited, time spent on pages, and navigation patterns</li>\n<li>Referring website addresses and search terms used</li>\n<li>Date and time of visits and interactions</li>\n<li>Screen resolution and display settings</li>\n<li>Network connection information</li>\n</ul>\n<h3>Cookies and Tracking Technologies</h3>\n<p>We use cookies, web beacons, and similar tracking technologies to enhance your browsing experience and collect information about how you use our website. For detailed information about our use of cookies, please refer to our Cookie Policy.</p>\n<h3>Third-Party Information</h3>\n<p>We may receive information about you from third parties, such as business partners, service providers, or publicly available sources, which we may combine with information we collect directly from you.</p>\n</div>\n</div>\n</section>\n<!-- How We Use Information Section -->\n<section class=\"content-section\">\n<div class=\"container\">\n<h2 class=\"section-title\">How We Use Your Information</h2>\n<div class=\"content-text\">\n<p>We use the information we collect for the following legitimate business purposes:</p>\n<ul>\n<li><strong>Order Processing and Fulfillment:</strong> To process, fulfill, and track your orders, including payment processing and shipping</li>\n<li><strong>Customer Service:</strong> To provide customer support, respond to inquiries, and resolve issues</li>\n<li><strong>Communication:</strong> To communicate with you about our products, services, and company updates</li>\n<li><strong>Website Improvement:</strong> To analyze website usage and improve our online presence and user experience</li>\n<li><strong>Legal Compliance:</strong> To comply with applicable laws, regulations, and legal processes</li>\n<li><strong>Security and Fraud Prevention:</strong> To protect against fraud, unauthorized access, and other security threats</li>\n<li><strong>Business Operations:</strong> To conduct our business operations, including accounting, auditing, and administrative functions</li>\n<li><strong>Marketing and Promotions:</strong> To send you promotional materials and marketing communications (with your consent where required)</li>\n<li><strong>Research and Development:</strong> To improve our products and develop new offerings</li>\n<li><strong>Quality Assurance:</strong> To monitor and improve the quality of our products and services</li>\n<li><strong>Record Keeping:</strong> To maintain accurate business records and documentation</li>\n</ul>\n</div>\n</div>\n</section>\n<!-- Information Sharing Section -->\n<section class=\"content-section alt-bg\">\n<div class=\"container\">\n<h2 class=\"section-title\">Information Sharing and Disclosure</h2>\n<div class=\"content-text\">\n<p>We do not sell, trade, or otherwise transfer your personal information to third parties except in the following circumstances:</p>\n<ul>\n<li><strong>Service Providers:</strong> We may share information with trusted third-party service providers who assist us in operating our website, conducting our business, or providing services to you, provided they agree to maintain confidentiality</li>\n<li><strong>Legal Requirements:</strong> We may disclose information when required by law, court order, or government regulation, or to protect our rights, property, or safety</li>\n<li><strong>Business Transfers:</strong> In the event of a merger, acquisition, or sale of assets, your information may be transferred to the acquiring entity</li>\n<li><strong>Consent:</strong> We may share information with your explicit consent or at your direction</li>\n<li><strong>Professional Advisors:</strong> We may share information with our legal, financial, and other professional advisors in connection with business operations</li>\n<li><strong>Fraud Prevention:</strong> We may share information with fraud prevention services and law enforcement agencies to prevent illegal activities</li>\n<li><strong>Aggregated Data:</strong> We may share aggregated, anonymized data that cannot be used to identify you personally</li>\n</ul>\n</div>\n</div>\n</section>\n<!-- Data Security Section -->\n<section class=\"content-section\">\n<div class=\"container\">\n<h2 class=\"section-title\">Data Security</h2>\n<div class=\"content-text\">\n<p>We implement comprehensive technical, administrative, and physical security measures to protect your personal information against unauthorized access, alteration, disclosure, or destruction. Our security measures include:</p>\n<ul>\n<li>Encryption of sensitive data in transit and at rest</li>\n<li>Regular security assessments and vulnerability testing</li>\n<li>Access controls and authentication mechanisms</li>\n<li>Employee training on data protection and privacy</li>\n<li>Secure data storage and backup procedures</li>\n<li>Network security monitoring and intrusion detection</li>\n<li>Regular software updates and security patches</li>\n</ul>\n<p>However, no method of transmission over the internet or electronic storage is 100% secure. While we strive to use commercially acceptable means to protect your personal information, we cannot guarantee absolute security.</p>\n<p>We regularly review and update our security practices to ensure the ongoing protection of your information and compliance with applicable data protection regulations.</p>\n</div>\n</div>\n</section>\n<!-- Data Retention Section -->\n<section class=\"content-section alt-bg\">\n<div class=\"container\">\n<h2 class=\"section-title\">Data Retention</h2>\n<div class=\"content-text\">\n<p>We retain your personal information only for as long as necessary to fulfill the purposes outlined in this Privacy Policy, unless a longer retention period is required or permitted by law. Our retention periods are based on:</p>\n<ul>\n<li>The nature of the information and the purposes for which it was collected</li>\n<li>Legal and regulatory requirements</li>\n<li>Business and operational needs</li>\n<li>Contractual obligations</li>\n</ul>\n<p>When we no longer need your personal information, we will securely delete or anonymize it in accordance with our data retention and disposal procedures.</p>\n</div>\n</div>\n</section>\n<!-- Your Rights Section -->\n<section class=\"content-section\">\n<div class=\"container\">\n<h2 class=\"section-title\">Your Rights and Choices</h2>\n<div class=\"content-text\">\n<p>Depending on your location and applicable laws, you may have the following rights regarding your personal information:</p>\n<ul>\n<li><strong>Access:</strong> The right to request access to your personal information and receive a copy of the data we hold about you</li>\n<li><strong>Correction:</strong> The right to request correction of inaccurate or incomplete personal information</li>\n<li><strong>Deletion:</strong> The right to request deletion of your personal information under certain circumstances</li>\n<li><strong>Restriction:</strong> The right to request restriction of processing of your personal information</li>\n<li><strong>Portability:</strong> The right to receive your personal information in a structured, commonly used format</li>\n<li><strong>Objection:</strong> The right to object to processing of your personal information for certain purposes</li>\n<li><strong>Withdrawal of Consent:</strong> The right to withdraw consent where processing is based on consent</li>\n<li><strong>Complaint:</strong> The right to lodge a complaint with a supervisory authority</li>\n</ul>\n<p>To exercise these rights, please contact us using the information provided below. We will respond to your request within the timeframes required by applicable law.</p>\n</div>\n</div>\n</section>\n<!-- International Transfers Section -->\n<section class=\"content-section alt-bg\">\n<div class=\"container\">\n<h2 class=\"section-title\">International Data Transfers</h2>\n<div class=\"content-text\">\n<p>Your personal information may be transferred to and processed in countries other than your country of residence. These countries may have different data protection laws than your country.</p>\n<p>When we transfer your personal information internationally, we implement appropriate safeguards to ensure your information receives adequate protection, including:</p>\n<ul>\n<li>Standard contractual clauses approved by relevant authorities</li>\n<li>Adequacy decisions by competent authorities</li>\n<li>Certification schemes and codes of conduct</li>\n<li>Other legally recognized transfer mechanisms</li>\n</ul>\n</div>\n</div>\n</section>\n<!-- Children's Privacy Section -->\n<section class=\"content-section\">\n<div class=\"container\">\n<h2 class=\"section-title\">Children's Privacy</h2>\n<div class=\"content-text\">\n<p>Our services are not directed to individuals under the age of 18, and we do not knowingly collect personal information from children under 18. If we become aware that we have collected personal information from a child under 18, we will take steps to delete such information promptly.</p>\n<p>If you are a parent or guardian and believe that your child has provided us with personal information, please contact us immediately so we can take appropriate action.</p>\n</div>\n</div>\n</section>\n<!-- Updates to Policy Section -->\n<section class=\"content-section alt-bg\">\n<div class=\"container\">\n<h2 class=\"section-title\">Updates to This Privacy Policy</h2>\n<div class=\"content-text\">\n<p>We may update this Privacy Policy from time to time to reflect changes in our practices, technology, legal requirements, or other factors. We will notify you of any material changes by:</p>\n<ul>\n<li>Posting the updated policy on our website with a new \"Last Updated\" date</li>\n<li>Sending you an email notification if you have provided us with your email address</li>\n<li>Providing notice through our website or other appropriate means</li>\n</ul>\n<p>We encourage you to review this Privacy Policy periodically to stay informed about how we collect, use, and protect your information.</p>\n</div>\n</div>\n</section>\n<!-- Contact Section -->\n<section class=\"content-section\">\n<div class=\"container\">\n<h2 class=\"section-title\">Contact Us</h2>\n<div class=\"content-text\">\n<p>If you have any questions, concerns, or requests regarding this Privacy Policy or our data practices, please contact us:</p>\n<div class=\"contact-info\">\n<div class=\"contact-item\">\n<div class=\"contact-icon\" id=\"emailIcon\"></div>\n<div class=\"contact-details\">\n<h3>Email</h3>\n<a class=\"contact-link\" href=\"mailto:info@offlido.com\">info@offlido.com</a>\n</div>\n</div>\n<div class=\"contact-item\">\n<div class=\"contact-icon\" id=\"phoneIcon\"></div>\n<div class=\"contact-details\">\n<h3>Phone</h3>\n<a class=\"contact-link\" href=\"tel:+447406284937\">+44 7406284937</a>\n</div>\n</div>\n<div class=\"contact-item\">\n<div class=\"contact-icon\" id=\"locationIcon\"></div>\n<div class=\"contact-details\">\n<h3>Address</h3>\n<p class=\"contact-text\">97 Tiverton Rd, Selly Oak<br/>Birmingham B29 6BW, UK</p>\n</div>\n</div>\n</div>\n</div>\n</div>\n</section>\n<!-- Footer Section -->\n<footer class=\"footer\">\n<div class=\"container\">\n<div class=\"footer-content\">\n<div class=\"footer-brand\">\n<div class=\"footer-logo\" id=\"footerLogo\"></div>\n<span class=\"footer-brand-name\">Offlido</span>\n</div>\n<div class=\"footer-links\">\n<a href=\"index.html\">Home</a>\n<a href=\"about.html\">About Us</a>\n<a href=\"usage-policy.html\">Usage Policy</a>\n<a href=\"privacy.html\">Privacy Policy</a>\n<a href=\"terms.html\">Terms of Service</a>\n<a href=\"cookies.html\">Cookie Policy</a>\n</div>\n<div class=\"footer-info\">\n<p>\u00a9 2025 Offlido. All rights reserved.</p>\n<p class=\"footer-disclaimer\">Business not pertaining to the purchase, holding, or exchange of cryptocurrencies. We do not offer additional services such as purchasing, selling, exchanging or trading assets.</p>\n</div>\n</div>\n</div>\n</footer>\n<!-- Cookie Banner -->\n<div class=\"cookie-banner\" id=\"cookieBanner\">\n<div class=\"cookie-banner-content\">\n<div class=\"cookie-banner-text\">\n We use cookies to improve your experience and analyze website usage. You can manage your preferences or learn more in our <a href=\"cookies.html\">Cookie Policy</a>.\n </div>\n<div class=\"cookie-banner-actions\">\n<button class=\"cookie-btn cookie-btn-accept\" onclick=\"acceptAllCookies()\">Accept All</button>\n<button class=\"cookie-btn cookie-btn-reject\" onclick=\"rejectAllCookies()\">Reject All</button>\n<button class=\"cookie-btn cookie-btn-customize\" onclick=\"showCookiePreferences()\">Customize</button>\n</div>\n</div>\n</div>\n<!-- Cookie Preferences Modal -->\n<div class=\"cookie-modal\" id=\"cookieModal\">\n<div class=\"cookie-modal-content\">\n<div class=\"cookie-modal-header\">\n<h3 class=\"cookie-modal-title\">Cookie Preferences</h3>\n<p class=\"cookie-modal-description\">\n Manage your cookie preferences below. Essential cookies are required for basic website functionality and cannot be disabled.\n </p>\n</div>\n<div class=\"cookie-category\">\n<div class=\"cookie-category-header\">\n<span class=\"cookie-category-title\">Essential Cookies</span>\n<label class=\"cookie-toggle\">\n<input checked=\"\" disabled=\"\" id=\"essentialCookies\" type=\"checkbox\"/>\n<span class=\"cookie-slider\"></span>\n</label>\n</div>\n<p class=\"cookie-category-description\">\n Required for basic website functionality, security, and form submissions. These cannot be disabled.\n </p>\n</div>\n<div class=\"cookie-category\">\n<div class=\"cookie-category-header\">\n<span class=\"cookie-category-title\">Analytics Cookies</span>\n<label class=\"cookie-toggle\">\n<input id=\"analyticsCookies\" type=\"checkbox\"/>\n<span class=\"cookie-slider\"></span>\n</label>\n</div>\n<p class=\"cookie-category-description\">\n Help us understand how visitors interact with our website by collecting anonymous usage data.\n </p>\n</div>\n<div class=\"cookie-category\">\n<div class=\"cookie-category-header\">\n<span class=\"cookie-category-title\">Functional Cookies</span>\n<label class=\"cookie-toggle\">\n<input id=\"functionalCookies\" type=\"checkbox\"/>\n<span class=\"cookie-slider\"></span>\n</label>\n</div>\n<p class=\"cookie-category-description\">\n Remember your preferences and settings to provide enhanced functionality and personalization.\n </p>\n</div>\n<div class=\"cookie-modal-actions\">\n<button class=\"cookie-modal-btn cookie-modal-btn-cancel\" onclick=\"closeCookiePreferences()\">Cancel</button>\n<button class=\"cookie-modal-btn cookie-modal-btn-save\" onclick=\"saveCookiePreferences()\">Save Preferences</button>\n</div>\n</div>\n</div>\n\n";const ttl=document.createElement("span");ttl.setAttribute("aria-label","Privacy Policy - Offlido");ttl.hidden=true;try{const host=r.closest('[jscontroller], section, div');if(host){host.style.width='100%';host.style.maxWidth='none';host.style.minHeight='100vh';}}catch{}sh.appendChild(st);sh.appendChild(ttl);sh.appendChild(c);(function(){var z=document.createElement('script');z.type='text/javascript';z.text="// Phone call functionality\nfunction callPhone() {\n window.location.href = \"tel:+447406284937\";\n}\n\n// SVG Icon and Logo Generation\nfunction createSVGIcon(containerId, iconType, color = '#4A5568') {\n const container = document.getElementById(containerId);\n if (!container) return;\n\n let svgContent = '';\n \n switch (iconType) {\n case 'logo':\n svgContent = `\n <svg viewBox=\"0 0 48 48\" fill=\"none\" xmlns=\"http://www.w3.org/2000/svg\">\n <rect x=\"8\" y=\"8\" width=\"32\" height=\"32\" rx=\"6\" fill=\"${color}\" stroke=\"${color}\" stroke-width=\"2\"/>\n <rect x=\"14\" y=\"14\" width=\"20\" height=\"20\" rx=\"2\" fill=\"white\"/>\n <rect x=\"18\" y=\"18\" width=\"4\" height=\"12\" fill=\"${color}\"/>\n <rect x=\"26\" y=\"18\" width=\"4\" height=\"12\" fill=\"${color}\"/>\n <rect x=\"18\" y=\"26\" width=\"12\" height=\"4\" fill=\"${color}\"/>\n </svg>\n `;\n break;\n case 'phone':\n svgContent = `\n <svg viewBox=\"0 0 24 24\" fill=\"none\" xmlns=\"http://www.w3.org/2000/svg\">\n <path d=\"M21 16.42v3a2 2 0 0 1-2.18 2 19.79 19.79 0 0 1-8.63-3.07 19.5 19.5 0 0 1-6-6 19.79 19.79 0 0 1-3.07-8.67A2 2 0 0 1 3.11 2h3a2 2 0 0 1 2 1.72 12.84 12.84 0 0 0 .7 2.81 2 2 0 0 1-.45 2.11L8.09 9.91a16 16 0 0 0 6 6l1.27-.27a2 2 0 0 1 2.11-.45 12.84 12.84 0 0 0 2.81.7A2 2 0 0 1 21 16.42z\" fill=\"white\"/>\n </svg>\n `;\n break;\n case 'hero':\n svgContent = `\n <svg viewBox=\"0 0 64 64\" fill=\"none\" xmlns=\"http://www.w3.org/2000/svg\">\n <rect x=\"8\" y=\"16\" width=\"48\" height=\"32\" rx=\"4\" fill=\"${color}\"/>\n <rect x=\"12\" y=\"20\" width=\"40\" height=\"24\" rx=\"2\" fill=\"white\"/>\n <rect x=\"16\" y=\"24\" width=\"8\" height=\"16\" fill=\"${color}\"/>\n <rect x=\"28\" y=\"24\" width=\"8\" height=\"16\" fill=\"${color}\"/>\n <rect x=\"40\" y=\"24\" width=\"8\" height=\"16\" fill=\"${color}\"/>\n </svg>\n `;\n break;\n case 'about':\n svgContent = `\n <svg viewBox=\"0 0 64 64\" fill=\"none\" xmlns=\"http://www.w3.org/2000/svg\">\n <circle cx=\"32\" cy=\"32\" r=\"24\" fill=\"${color}\"/>\n <circle cx=\"32\" cy=\"32\" r=\"16\" fill=\"white\"/>\n <rect x=\"28\" y=\"20\" width=\"8\" height=\"24\" fill=\"${color}\"/>\n <circle cx=\"32\" cy=\"16\" r=\"3\" fill=\"${color}\"/>\n </svg>\n `;\n break;\n case 'fire':\n svgContent = `\n <svg viewBox=\"0 0 24 24\" fill=\"none\" xmlns=\"http://www.w3.org/2000/svg\">\n <path d=\"M12 2C8 6 8 10 12 10s4-4 0-8z\" fill=\"${color}\"/>\n <path d=\"M12 10c-2 2-2 4 0 6s4-2 2-4-2-2-2-2z\" fill=\"${color}\"/>\n <ellipse cx=\"12\" cy=\"18\" rx=\"8\" ry=\"4\" fill=\"${color}\"/>\n </svg>\n `;\n break;\n case 'steel':\n svgContent = `\n <svg viewBox=\"0 0 24 24\" fill=\"none\" xmlns=\"http://www.w3.org/2000/svg\">\n <rect x=\"3\" y=\"6\" width=\"18\" height=\"12\" rx=\"2\" fill=\"${color}\"/>\n <rect x=\"6\" y=\"9\" width=\"12\" height=\"6\" fill=\"white\"/>\n <rect x=\"8\" y=\"11\" width=\"8\" height=\"2\" fill=\"${color}\"/>\n </svg>\n `;\n break;\n case 'privacy':\n svgContent = `\n <svg viewBox=\"0 0 24 24\" fill=\"none\" xmlns=\"http://www.w3.org/2000/svg\">\n <path d=\"M12 2L3 7v5c0 5.55 3.84 10.74 9 12 5.16-1.26 9-6.45 9-12V7l-9-5z\" fill=\"${color}\"/>\n <circle cx=\"12\" cy=\"12\" r=\"5\" fill=\"white\"/>\n <circle cx=\"12\" cy=\"12\" r=\"2\" fill=\"${color}\"/>\n </svg>\n `;\n break;\n case 'compliance':\n svgContent = `\n <svg viewBox=\"0 0 24 24\" fill=\"none\" xmlns=\"http://www.w3.org/2000/svg\">\n <rect x=\"4\" y=\"3\" width=\"16\" height=\"18\" rx=\"2\" fill=\"${color}\"/>\n <rect x=\"7\" y=\"6\" width=\"10\" height=\"12\" fill=\"white\"/>\n <path d=\"M9 10l2 2 4-4\" stroke=\"${color}\" stroke-width=\"2\" fill=\"none\"/>\n </svg>\n `;\n break;\n case 'plate':\n svgContent = `\n <svg viewBox=\"0 0 24 24\" fill=\"none\" xmlns=\"http://www.w3.org/2000/svg\">\n <rect x=\"4\" y=\"6\" width=\"16\" height=\"12\" rx=\"2\" fill=\"${color}\"/>\n <rect x=\"6\" y=\"8\" width=\"12\" height=\"8\" fill=\"white\"/>\n <line x1=\"8\" y1=\"10\" x2=\"16\" y2=\"10\" stroke=\"${color}\" stroke-width=\"1\"/>\n <line x1=\"8\" y1=\"12\" x2=\"16\" y2=\"12\" stroke=\"${color}\" stroke-width=\"1\"/>\n <line x1=\"8\" y1=\"14\" x2=\"16\" y2=\"14\" stroke=\"${color}\" stroke-width=\"1\"/>\n </svg>\n `;\n break;\n case 'case':\n svgContent = `\n <svg viewBox=\"0 0 24 24\" fill=\"none\" xmlns=\"http://www.w3.org/2000/svg\">\n <rect x=\"5\" y=\"8\" width=\"14\" height=\"10\" rx=\"2\" fill=\"${color}\"/>\n <rect x=\"8\" y=\"6\" width=\"8\" height=\"4\" rx=\"1\" fill=\"${color}\"/>\n <rect x=\"7\" y=\"10\" width=\"10\" height=\"6\" fill=\"white\"/>\n <circle cx=\"10\" cy=\"13\" r=\"1\" fill=\"${color}\"/>\n <circle cx=\"14\" cy=\"13\" r=\"1\" fill=\"${color}\"/>\n </svg>\n `;\n break;\n case 'faraday':\n svgContent = `\n <svg viewBox=\"0 0 24 24\" fill=\"none\" xmlns=\"http://www.w3.org/2000/svg\">\n <rect x=\"6\" y=\"4\" width=\"12\" height=\"16\" rx=\"2\" fill=\"${color}\"/>\n <rect x=\"8\" y=\"6\" width=\"8\" height=\"12\" fill=\"white\"/>\n <path d=\"M10 8v8M14 8v8M12 6v2M12 16v2\" stroke=\"${color}\" stroke-width=\"1\"/>\n </svg>\n `;\n break;\n case 'accessory':\n svgContent = `\n <svg viewBox=\"0 0 24 24\" fill=\"none\" xmlns=\"http://www.w3.org/2000/svg\">\n <rect x=\"4\" y=\"6\" width=\"16\" height=\"12\" rx=\"2\" fill=\"${color}\"/>\n <rect x=\"6\" y=\"8\" width=\"12\" height=\"8\" fill=\"white\"/>\n <circle cx=\"9\" cy=\"10\" r=\"1\" fill=\"${color}\"/>\n <circle cx=\"15\" cy=\"10\" r=\"1\" fill=\"${color}\"/>\n <circle cx=\"9\" cy=\"14\" r=\"1\" fill=\"${color}\"/>\n <circle cx=\"15\" cy=\"14\" r=\"1\" fill=\"${color}\"/>\n <rect x=\"11\" y=\"11\" width=\"2\" height=\"2\" fill=\"${color}\"/>\n </svg>\n `;\n break;\n case 'security':\n svgContent = `\n <svg viewBox=\"0 0 64 64\" fill=\"none\" xmlns=\"http://www.w3.org/2000/svg\">\n <circle cx=\"32\" cy=\"32\" r=\"28\" fill=\"${color}\"/>\n <circle cx=\"32\" cy=\"32\" r=\"20\" fill=\"white\"/>\n <rect x=\"28\" y=\"24\" width=\"8\" height=\"16\" fill=\"${color}\"/>\n <circle cx=\"32\" cy=\"28\" r=\"3\" fill=\"white\"/>\n </svg>\n `;\n break;\n case 'quality':\n svgContent = `\n <svg viewBox=\"0 0 24 24\" fill=\"none\" xmlns=\"http://www.w3.org/2000/svg\">\n <polygon points=\"12,2 15,9 22,9 17,14 19,21 12,17 5,21 7,14 2,9 9,9\" fill=\"${color}\"/>\n <polygon points=\"12,6 13.5,10.5 18,10.5 14.5,13.5 16,18 12,15.5 8,18 9.5,13.5 6,10.5 10.5,10.5\" fill=\"white\"/>\n </svg>\n `;\n break;\n case 'testing':\n svgContent = `\n <svg viewBox=\"0 0 24 24\" fill=\"none\" xmlns=\"http://www.w3.org/2000/svg\">\n <rect x=\"3\" y=\"4\" width=\"18\" height=\"16\" rx=\"2\" fill=\"${color}\"/>\n <rect x=\"5\" y=\"6\" width=\"14\" height=\"12\" fill=\"white\"/>\n <rect x=\"7\" y=\"8\" width=\"10\" height=\"2\" fill=\"${color}\"/>\n <rect x=\"7\" y=\"11\" width=\"6\" height=\"2\" fill=\"${color}\"/>\n <rect x=\"7\" y=\"14\" width=\"8\" height=\"2\" fill=\"${color}\"/>\n </svg>\n `;\n break;\n case 'support':\n svgContent = `\n <svg viewBox=\"0 0 24 24\" fill=\"none\" xmlns=\"http://www.w3.org/2000/svg\">\n <circle cx=\"12\" cy=\"12\" r=\"10\" fill=\"${color}\"/>\n <circle cx=\"12\" cy=\"8\" r=\"3\" fill=\"white\"/>\n <path d=\"M7 20c0-4 2.5-7 5-7s5 3 5 7\" fill=\"white\"/>\n </svg>\n `;\n break;\n case 'clients':\n svgContent = `\n <svg viewBox=\"0 0 24 24\" fill=\"none\" xmlns=\"http://www.w3.org/2000/svg\">\n <circle cx=\"9\" cy=\"7\" r=\"4\" fill=\"${color}\"/>\n <path d=\"M3 21v-2a4 4 0 0 1 4-4h4a4 4 0 0 1 4 4v2\" fill=\"${color}\"/>\n <circle cx=\"16\" cy=\"9\" r=\"3\" fill=\"${color}\"/>\n <path d=\"M16 14a3 3 0 0 1 3 3v1\" fill=\"${color}\"/>\n </svg>\n `;\n break;\n case 'countries':\n svgContent = `\n <svg viewBox=\"0 0 24 24\" fill=\"none\" xmlns=\"http://www.w3.org/2000/svg\">\n <circle cx=\"12\" cy=\"12\" r=\"10\" fill=\"${color}\"/>\n <path d=\"M2 12h20M12 2a15.3 15.3 0 0 1 4 10 15.3 15.3 0 0 1-4 10 15.3 15.3 0 0 1-4-10 15.3 15.3 0 0 1 4-10z\" stroke=\"white\" stroke-width=\"2\"/>\n </svg>\n `;\n break;\n case 'satisfaction':\n svgContent = `\n <svg viewBox=\"0 0 24 24\" fill=\"none\" xmlns=\"http://www.w3.org/2000/svg\">\n <circle cx=\"12\" cy=\"12\" r=\"10\" fill=\"${color}\"/>\n <path d=\"M8 14s1.5 2 4 2 4-2 4-2\" stroke=\"white\" stroke-width=\"2\" stroke-linecap=\"round\"/>\n <circle cx=\"9\" cy=\"9\" r=\"1\" fill=\"white\"/>\n <circle cx=\"15\" cy=\"9\" r=\"1\" fill=\"white\"/>\n </svg>\n `;\n break;\n case 'email':\n svgContent = `\n <svg viewBox=\"0 0 24 24\" fill=\"none\" xmlns=\"http://www.w3.org/2000/svg\">\n <rect x=\"2\" y=\"4\" width=\"20\" height=\"16\" rx=\"2\" fill=\"${color}\"/>\n <path d=\"M22 6L12 13 2 6\" stroke=\"white\" stroke-width=\"2\"/>\n </svg>\n `;\n break;\n case 'location':\n svgContent = `\n <svg viewBox=\"0 0 24 24\" fill=\"none\" xmlns=\"http://www.w3.org/2000/svg\">\n <path d=\"M21 10c0 7-9 13-9 13s-9-6-9-13a9 9 0 0 1 18 0z\" fill=\"${color}\"/>\n <circle cx=\"12\" cy=\"10\" r=\"3\" fill=\"white\"/>\n </svg>\n `;\n break;\n case 'notice':\n svgContent = `\n <svg viewBox=\"0 0 24 24\" fill=\"none\" xmlns=\"http://www.w3.org/2000/svg\">\n <circle cx=\"12\" cy=\"12\" r=\"10\" fill=\"${color}\"/>\n <rect x=\"11\" y=\"7\" width=\"2\" height=\"6\" fill=\"white\"/>\n <circle cx=\"12\" cy=\"16\" r=\"1\" fill=\"white\"/>\n </svg>\n `;\n break;\n default:\n svgContent = `\n <svg viewBox=\"0 0 24 24\" fill=\"none\" xmlns=\"http://www.w3.org/2000/svg\">\n <rect x=\"4\" y=\"4\" width=\"16\" height=\"16\" rx=\"2\" fill=\"${color}\"/>\n </svg>\n `;\n }\n \n container.innerHTML = svgContent;\n}\n\n// Initialize all icons when DOM is loaded\ndocument.addEventListener('DOMContentLoaded', function() {\n // Main logo\n createSVGIcon('logoSvg', 'logo', '#4A5568');\n createSVGIcon('footerLogo', 'logo', 'white');\n \n // Hero section\n createSVGIcon('heroIcon', 'hero', '#718096');\n createSVGIcon('phoneIcon', 'phone', 'white');\n \n // About section\n createSVGIcon('aboutIcon', 'about', '#718096');\n \n // Additional about page icons\n createSVGIcon('precisionIcon', 'quality', '#4A5568');\n createSVGIcon('testingIcon', 'testing', '#4A5568');\n createSVGIcon('qualityIcon', 'quality', '#4A5568');\n createSVGIcon('materialsIcon', 'steel', '#4A5568');\n \n // Feature icons\n createSVGIcon('fireIcon', 'fire', '#4A5568');\n createSVGIcon('steelIcon', 'steel', '#4A5568');\n createSVGIcon('privacyIcon', 'privacy', '#4A5568');\n createSVGIcon('complianceIcon', 'compliance', '#4A5568');\n \n // Product icons\n createSVGIcon('plateIcon', 'plate', '#718096');\n createSVGIcon('caseIcon', 'case', '#718096');\n createSVGIcon('faradayIcon', 'faraday', '#718096');\n createSVGIcon('accessoryIcon', 'accessory', '#718096');\n \n // Call icons\n createSVGIcon('callIcon1', 'phone', 'white');\n createSVGIcon('callIcon2', 'phone', 'white');\n createSVGIcon('callIcon3', 'phone', 'white');\n createSVGIcon('callIcon4', 'phone', 'white');\n \n // Security section\n createSVGIcon('noticeIcon', 'notice', '#718096');\n createSVGIcon('securityIcon', 'security', '#718096');\n \n // Why choose icons\n createSVGIcon('qualityIcon', 'quality', '#4A5568');\n createSVGIcon('testingIcon', 'testing', '#4A5568');\n createSVGIcon('supportIcon', 'support', '#4A5568');\n \n // Trust section\n createSVGIcon('clientsIcon', 'clients', '#4A5568');\n createSVGIcon('countriesIcon', 'countries', '#4A5568');\n createSVGIcon('satisfactionIcon', 'satisfaction', '#4A5568');\n \n // Contact icons\n createSVGIcon('emailIcon', 'email', '#4A5568');\n createSVGIcon('phoneContactIcon', 'phone', '#4A5568');\n createSVGIcon('locationIcon', 'location', '#4A5568');\n createSVGIcon('contactImageIcon', 'about', '#718096');\n});\n\n// Smooth scrolling for anchor links (if any are added later)\ndocument.querySelectorAll('a[href^=\"#\"]').forEach(anchor => {\n anchor.addEventListener('click', function (e) {\n e.preventDefault();\n const target = document.querySelector(this.getAttribute('href'));\n if (target) {\n target.scrollIntoView({\n behavior: 'smooth'\n });\n }\n });\n});\n\n// Form validation and interaction helpers (for future use)\nfunction validateEmail(email) {\n const re = /^[^\\s@]+@[^\\s@]+\\.[^\\s@]+$/;\n return re.test(email);\n}\n\nfunction showMessage(message, type = 'info') {\n // Future implementation for user feedback\n console.log(`${type.toUpperCase()}: ${message}`);\n}\n\n// Cookie Management System\nconst COOKIE_CONSENT_KEY = 'offlido_cookie_consent';\nconst COOKIE_PREFERENCES_KEY = 'offlido_cookie_preferences';\n\n// Check if user has made a cookie choice\nfunction checkCookieConsent() {\n const consent = localStorage.getItem(COOKIE_CONSENT_KEY);\n if (!consent) {\n showCookieBanner();\n }\n}\n\n// Show cookie banner\nfunction showCookieBanner() {\n const banner = document.getElementById('cookieBanner');\n if (banner) {\n banner.classList.add('show');\n }\n}\n\n// Hide cookie banner\nfunction hideCookieBanner() {\n const banner = document.getElementById('cookieBanner');\n if (banner) {\n banner.classList.remove('show');\n }\n}\n\n// Accept all cookies\nfunction acceptAllCookies() {\n const preferences = {\n essential: true,\n analytics: true,\n functional: true,\n timestamp: Date.now()\n };\n \n localStorage.setItem(COOKIE_CONSENT_KEY, 'accepted');\n localStorage.setItem(COOKIE_PREFERENCES_KEY, JSON.stringify(preferences));\n hideCookieBanner();\n \n // Initialize analytics and functional cookies if accepted\n if (preferences.analytics) {\n initializeAnalytics();\n }\n if (preferences.functional) {\n initializeFunctionalCookies();\n }\n}\n\n// Reject all non-essential cookies\nfunction rejectAllCookies() {\n const preferences = {\n essential: true,\n analytics: false,\n functional: false,\n timestamp: Date.now()\n };\n \n localStorage.setItem(COOKIE_CONSENT_KEY, 'rejected');\n localStorage.setItem(COOKIE_PREFERENCES_KEY, JSON.stringify(preferences));\n hideCookieBanner();\n \n // Remove any existing non-essential cookies\n removeNonEssentialCookies();\n}\n\n// Show cookie preferences modal\nfunction showCookiePreferences() {\n const modal = document.getElementById('cookieModal');\n if (modal) {\n // Load current preferences\n loadCookiePreferences();\n modal.classList.add('show');\n }\n}\n\n// Close cookie preferences modal\nfunction closeCookiePreferences() {\n const modal = document.getElementById('cookieModal');\n if (modal) {\n modal.classList.remove('show');\n }\n}\n\n// Load current cookie preferences into modal\nfunction loadCookiePreferences() {\n const preferences = JSON.parse(localStorage.getItem(COOKIE_PREFERENCES_KEY) || '{}');\n \n const analyticsCheckbox = document.getElementById('analyticsCookies');\n const functionalCheckbox = document.getElementById('functionalCookies');\n \n if (analyticsCheckbox) {\n analyticsCheckbox.checked = preferences.analytics || false;\n }\n if (functionalCheckbox) {\n functionalCheckbox.checked = preferences.functional || false;\n }\n}\n\n// Save cookie preferences\nfunction saveCookiePreferences() {\n const analyticsCheckbox = document.getElementById('analyticsCookies');\n const functionalCheckbox = document.getElementById('functionalCookies');\n \n const preferences = {\n essential: true, // Always true\n analytics: analyticsCheckbox ? analyticsCheckbox.checked : false,\n functional: functionalCheckbox ? functionalCheckbox.checked : false,\n timestamp: Date.now()\n };\n \n localStorage.setItem(COOKIE_CONSENT_KEY, 'customized');\n localStorage.setItem(COOKIE_PREFERENCES_KEY, JSON.stringify(preferences));\n \n // Apply preferences\n if (preferences.analytics) {\n initializeAnalytics();\n } else {\n removeAnalyticsCookies();\n }\n \n if (preferences.functional) {\n initializeFunctionalCookies();\n } else {\n removeFunctionalCookies();\n }\n \n hideCookieBanner();\n closeCookiePreferences();\n}\n\n// Initialize analytics cookies (placeholder for actual implementation)\nfunction initializeAnalytics() {\n // Placeholder for analytics initialization\n console.log('Analytics cookies initialized');\n // Example: Google Analytics, Adobe Analytics, etc.\n}\n\n// Initialize functional cookies (placeholder for actual implementation)\nfunction initializeFunctionalCookies() {\n // Placeholder for functional cookies initialization\n console.log('Functional cookies initialized');\n // Example: User preferences, language settings, etc.\n}\n\n// Remove non-essential cookies\nfunction removeNonEssentialCookies() {\n removeAnalyticsCookies();\n removeFunctionalCookies();\n}\n\n// Remove analytics cookies\nfunction removeAnalyticsCookies() {\n // Remove analytics-related cookies\n const analyticsCookies = ['_ga', '_gid', '_gat', '_gtag', 'adobe_analytics'];\n analyticsCookies.forEach(cookieName => {\n document.cookie = `${cookieName}=; expires=Thu, 01 Jan 1970 00:00:00 UTC; path=/;`;\n document.cookie = `${cookieName}=; expires=Thu, 01 Jan 1970 00:00:00 UTC; path=/; domain=.${window.location.hostname};`;\n });\n console.log('Analytics cookies removed');\n}\n\n// Remove functional cookies\nfunction removeFunctionalCookies() {\n // Remove functional cookies (preserve essential ones)\n const functionalCookies = ['user_preferences', 'language_setting', 'theme_preference'];\n functionalCookies.forEach(cookieName => {\n document.cookie = `${cookieName}=; expires=Thu, 01 Jan 1970 00:00:00 UTC; path=/;`;\n });\n console.log('Functional cookies removed');\n}\n\n// Apply saved cookie preferences on page load\nfunction applySavedCookiePreferences() {\n const consent = localStorage.getItem(COOKIE_CONSENT_KEY);\n const preferences = JSON.parse(localStorage.getItem(COOKIE_PREFERENCES_KEY) || '{}');\n \n if (consent && preferences.timestamp) {\n // Check if preferences are still valid (not older than 1 year)\n const oneYear = 365 * 24 * 60 * 60 * 1000;\n if (Date.now() - preferences.timestamp < oneYear) {\n if (preferences.analytics) {\n initializeAnalytics();\n }\n if (preferences.functional) {\n initializeFunctionalCookies();\n }\n } else {\n // Preferences expired, show banner again\n localStorage.removeItem(COOKIE_CONSENT_KEY);\n localStorage.removeItem(COOKIE_PREFERENCES_KEY);\n showCookieBanner();\n }\n }\n}\n\n// Initialize cookie management when DOM is loaded\ndocument.addEventListener('DOMContentLoaded', function() {\n // Apply saved preferences first\n applySavedCookiePreferences();\n \n // Check if we need to show the banner\n setTimeout(checkCookieConsent, 1000); // Small delay to ensure page is fully loaded\n \n // Close modal when clicking outside\n const modal = document.getElementById('cookieModal');\n if (modal) {\n modal.addEventListener('click', function(e) {\n if (e.target === modal) {\n closeCookiePreferences();\n }\n });\n }\n});\n\n// Handle page visibility change to recheck consent\ndocument.addEventListener('visibilitychange', function() {\n if (!document.hidden) {\n checkCookieConsent();\n }\n}\n)";document.documentElement.appendChild(z);z.parentNode.removeChild(z);})();})();