Add index.html
هذا الالتزام موجود في:
651
index.html
Normal file
651
index.html
Normal file
@@ -0,0 +1,651 @@
|
||||
<!DOCTYPE html>
|
||||
<html lang="en">
|
||||
<head>
|
||||
<meta charset="UTF-8">
|
||||
<meta name="viewport" content="width=device-width, initial-scale=1.0">
|
||||
<title>ONECLICKRETARGETING | Canadian Software Engineering</title>
|
||||
<style>
|
||||
/* --- CSS VARIABLES & RESET --- */
|
||||
:root {
|
||||
--canada-red: #D80621;
|
||||
--montreal-blue: #002654; /* Subtle nod to Quebec/Corporate Blue */
|
||||
--deep-slate: #0f172a;
|
||||
--light-slate: #1e293b;
|
||||
--white: #ffffff;
|
||||
--gray-text: #94a3b8;
|
||||
--glass-bg: rgba(255, 255, 255, 0.03);
|
||||
--glass-border: rgba(255, 255, 255, 0.08);
|
||||
--success-green: #10b981;
|
||||
}
|
||||
|
||||
* {
|
||||
margin: 0;
|
||||
padding: 0;
|
||||
box-sizing: border-box;
|
||||
font-family: 'Inter', system-ui, -apple-system, sans-serif;
|
||||
}
|
||||
|
||||
body {
|
||||
background-color: var(--deep-slate);
|
||||
color: var(--white);
|
||||
overflow-x: hidden;
|
||||
line-height: 1.6;
|
||||
}
|
||||
|
||||
a { text-decoration: none; color: inherit; transition: 0.3s; }
|
||||
ul { list-style: none; }
|
||||
|
||||
/* --- UTILITIES --- */
|
||||
.container {
|
||||
max-width: 1200px;
|
||||
margin: 0 auto;
|
||||
padding: 0 24px;
|
||||
}
|
||||
|
||||
.btn {
|
||||
display: inline-block;
|
||||
padding: 14px 36px;
|
||||
font-weight: 600;
|
||||
border-radius: 6px;
|
||||
text-transform: uppercase;
|
||||
letter-spacing: 0.5px;
|
||||
font-size: 0.85rem;
|
||||
cursor: pointer;
|
||||
transition: all 0.3s ease;
|
||||
}
|
||||
|
||||
.btn-primary {
|
||||
background: var(--canada-red);
|
||||
color: white;
|
||||
box-shadow: 0 4px 14px rgba(216, 6, 33, 0.4);
|
||||
border: 1px solid var(--canada-red);
|
||||
}
|
||||
|
||||
.btn-primary:hover {
|
||||
background: transparent;
|
||||
color: var(--canada-red);
|
||||
transform: translateY(-2px);
|
||||
}
|
||||
|
||||
.btn-outline {
|
||||
background: transparent;
|
||||
border: 1px solid var(--white);
|
||||
color: var(--white);
|
||||
}
|
||||
|
||||
.btn-outline:hover {
|
||||
background: var(--white);
|
||||
color: var(--deep-slate);
|
||||
}
|
||||
|
||||
.section-header {
|
||||
margin-bottom: 60px;
|
||||
text-align: center;
|
||||
}
|
||||
|
||||
.section-header h2 {
|
||||
font-size: 2.5rem;
|
||||
margin-bottom: 15px;
|
||||
font-weight: 700;
|
||||
}
|
||||
|
||||
.section-header p {
|
||||
color: var(--gray-text);
|
||||
max-width: 600px;
|
||||
margin: 0 auto;
|
||||
}
|
||||
|
||||
/* --- HEADER --- */
|
||||
header {
|
||||
position: fixed;
|
||||
top: 0;
|
||||
width: 100%;
|
||||
padding: 20px 0;
|
||||
z-index: 1000;
|
||||
background: rgba(15, 23, 42, 0.8);
|
||||
backdrop-filter: blur(12px);
|
||||
border-bottom: 1px solid var(--glass-border);
|
||||
}
|
||||
|
||||
nav {
|
||||
display: flex;
|
||||
justify-content: space-between;
|
||||
align-items: center;
|
||||
}
|
||||
|
||||
.logo {
|
||||
font-size: 1.4rem;
|
||||
font-weight: 800;
|
||||
letter-spacing: -0.5px;
|
||||
display: flex;
|
||||
align-items: center;
|
||||
gap: 12px;
|
||||
}
|
||||
|
||||
.logo-box {
|
||||
width: 30px;
|
||||
height: 30px;
|
||||
background: var(--canada-red);
|
||||
display: flex;
|
||||
align-items: center;
|
||||
justify-content: center;
|
||||
border-radius: 4px;
|
||||
font-size: 18px;
|
||||
}
|
||||
|
||||
.nav-links {
|
||||
display: flex;
|
||||
gap: 40px;
|
||||
}
|
||||
|
||||
.nav-links a {
|
||||
font-size: 0.9rem;
|
||||
font-weight: 500;
|
||||
color: var(--gray-text);
|
||||
}
|
||||
|
||||
.nav-links a:hover { color: var(--white); }
|
||||
|
||||
/* --- HERO SECTION --- */
|
||||
.hero {
|
||||
height: 100vh;
|
||||
display: flex;
|
||||
align-items: center;
|
||||
position: relative;
|
||||
overflow: hidden;
|
||||
padding-top: 80px;
|
||||
}
|
||||
|
||||
#canvas-bg {
|
||||
position: absolute;
|
||||
top: 0;
|
||||
left: 0;
|
||||
width: 100%;
|
||||
height: 100%;
|
||||
z-index: -1;
|
||||
opacity: 0.6;
|
||||
}
|
||||
|
||||
.hero-content {
|
||||
z-index: 1;
|
||||
max-width: 900px;
|
||||
}
|
||||
|
||||
.badge-row {
|
||||
display: flex;
|
||||
gap: 15px;
|
||||
margin-bottom: 30px;
|
||||
flex-wrap: wrap;
|
||||
}
|
||||
|
||||
.badge {
|
||||
background: rgba(255,255,255,0.1);
|
||||
border: 1px solid rgba(255,255,255,0.2);
|
||||
padding: 6px 16px;
|
||||
border-radius: 100px;
|
||||
font-size: 0.8rem;
|
||||
font-weight: 600;
|
||||
display: flex;
|
||||
align-items: center;
|
||||
gap: 8px;
|
||||
}
|
||||
|
||||
.badge svg { width: 14px; height: 14px; fill: var(--canada-red); }
|
||||
|
||||
.hero h1 {
|
||||
font-size: 4rem;
|
||||
line-height: 1.1;
|
||||
margin-bottom: 25px;
|
||||
font-weight: 800;
|
||||
letter-spacing: -1px;
|
||||
}
|
||||
|
||||
.hero h1 span {
|
||||
color: var(--canada-red);
|
||||
}
|
||||
|
||||
.hero p {
|
||||
font-size: 1.25rem;
|
||||
color: var(--gray-text);
|
||||
margin-bottom: 40px;
|
||||
max-width: 650px;
|
||||
}
|
||||
|
||||
/* --- TRUST & COMPLIANCE SECTION (NEW) --- */
|
||||
.trust-section {
|
||||
padding: 100px 0;
|
||||
background: var(--light-slate);
|
||||
border-top: 1px solid var(--glass-border);
|
||||
border-bottom: 1px solid var(--glass-border);
|
||||
}
|
||||
|
||||
.trust-grid {
|
||||
display: grid;
|
||||
grid-template-columns: repeat(4, 1fr);
|
||||
gap: 20px;
|
||||
margin-top: 50px;
|
||||
}
|
||||
|
||||
.trust-card {
|
||||
background: var(--deep-slate);
|
||||
padding: 30px;
|
||||
border-radius: 8px;
|
||||
border: 1px solid var(--glass-border);
|
||||
text-align: center;
|
||||
}
|
||||
|
||||
.trust-icon {
|
||||
font-size: 2rem;
|
||||
margin-bottom: 20px;
|
||||
display: inline-block;
|
||||
}
|
||||
|
||||
.trust-card h4 {
|
||||
font-size: 1.1rem;
|
||||
margin-bottom: 10px;
|
||||
color: var(--white);
|
||||
}
|
||||
|
||||
.trust-card p {
|
||||
font-size: 0.85rem;
|
||||
color: var(--gray-text);
|
||||
line-height: 1.5;
|
||||
}
|
||||
|
||||
.location-highlight {
|
||||
margin-top: 60px;
|
||||
display: flex;
|
||||
align-items: center;
|
||||
justify-content: center;
|
||||
gap: 20px;
|
||||
background: rgba(216, 6, 33, 0.1);
|
||||
padding: 20px;
|
||||
border-radius: 8px;
|
||||
border: 1px solid rgba(216, 6, 33, 0.3);
|
||||
}
|
||||
|
||||
.location-highlight strong { color: var(--canada-red); }
|
||||
|
||||
/* --- SERVICES --- */
|
||||
.services {
|
||||
padding: 100px 0;
|
||||
}
|
||||
|
||||
.service-grid {
|
||||
display: grid;
|
||||
grid-template-columns: repeat(3, 1fr);
|
||||
gap: 30px;
|
||||
}
|
||||
|
||||
.service-card {
|
||||
background: var(--glass-bg);
|
||||
padding: 40px;
|
||||
border-radius: 12px;
|
||||
border: 1px solid var(--glass-border);
|
||||
transition: 0.3s;
|
||||
}
|
||||
|
||||
.service-card:hover {
|
||||
border-color: var(--canada-red);
|
||||
transform: translateY(-5px);
|
||||
}
|
||||
|
||||
.service-card h3 {
|
||||
font-size: 1.5rem;
|
||||
margin-bottom: 15px;
|
||||
color: var(--white);
|
||||
}
|
||||
|
||||
.service-card p {
|
||||
color: var(--gray-text);
|
||||
font-size: 0.95rem;
|
||||
margin-bottom: 20px;
|
||||
}
|
||||
|
||||
.tech-stack {
|
||||
display: flex;
|
||||
gap: 10px;
|
||||
flex-wrap: wrap;
|
||||
}
|
||||
|
||||
.tech-tag {
|
||||
font-size: 0.75rem;
|
||||
background: rgba(255,255,255,0.1);
|
||||
padding: 4px 10px;
|
||||
border-radius: 4px;
|
||||
color: var(--white);
|
||||
}
|
||||
|
||||
/* --- CONTACT --- */
|
||||
.contact {
|
||||
padding: 100px 0;
|
||||
background: linear-gradient(to bottom, var(--deep-slate), #000);
|
||||
}
|
||||
|
||||
.contact-wrapper {
|
||||
max-width: 700px;
|
||||
margin: 0 auto;
|
||||
background: var(--light-slate);
|
||||
padding: 50px;
|
||||
border-radius: 16px;
|
||||
border: 1px solid var(--glass-border);
|
||||
}
|
||||
|
||||
.form-group {
|
||||
margin-bottom: 20px;
|
||||
}
|
||||
|
||||
.form-group label {
|
||||
display: block;
|
||||
margin-bottom: 8px;
|
||||
font-size: 0.9rem;
|
||||
color: var(--gray-text);
|
||||
}
|
||||
|
||||
.form-control {
|
||||
width: 100%;
|
||||
padding: 14px;
|
||||
background: rgba(0,0,0,0.3);
|
||||
border: 1px solid var(--glass-border);
|
||||
border-radius: 6px;
|
||||
color: white;
|
||||
font-size: 1rem;
|
||||
}
|
||||
|
||||
.form-control:focus {
|
||||
outline: none;
|
||||
border-color: var(--canada-red);
|
||||
}
|
||||
|
||||
/* --- FOOTER --- */
|
||||
footer {
|
||||
padding: 60px 0 30px;
|
||||
border-top: 1px solid var(--glass-border);
|
||||
font-size: 0.9rem;
|
||||
color: var(--gray-text);
|
||||
}
|
||||
|
||||
.footer-grid {
|
||||
display: grid;
|
||||
grid-template-columns: 1fr 1fr;
|
||||
margin-bottom: 40px;
|
||||
}
|
||||
|
||||
.footer-bottom {
|
||||
display: flex;
|
||||
justify-content: space-between;
|
||||
padding-top: 30px;
|
||||
border-top: 1px solid rgba(255,255,255,0.05);
|
||||
}
|
||||
|
||||
@media (max-width: 900px) {
|
||||
.hero h1 { font-size: 2.8rem; }
|
||||
.trust-grid { grid-template-columns: 1fr 1fr; }
|
||||
.service-grid { grid-template-columns: 1fr; }
|
||||
.nav-links { display: none; }
|
||||
.footer-grid { grid-template-columns: 1fr; gap: 30px; }
|
||||
}
|
||||
</style>
|
||||
</head>
|
||||
<body>
|
||||
|
||||
<!-- Header -->
|
||||
<header>
|
||||
<div class="container">
|
||||
<nav>
|
||||
<a href="#" class="logo">
|
||||
<div class="logo-box">1</div>
|
||||
ONECLICKretargeting <span style="color:var(--gray-text); font-weight:400; font-size:0.9em;">INC.</span>
|
||||
</a>
|
||||
<ul class="nav-links">
|
||||
<li><a href="#trust">Compliance</a></li>
|
||||
<li><a href="#services">Solutions</a></li>
|
||||
<li><a href="#about">About</a></li>
|
||||
</ul>
|
||||
<a href="#contact" class="btn btn-primary">Contact Us</a>
|
||||
</nav>
|
||||
</div>
|
||||
</header>
|
||||
|
||||
<!-- Hero Section -->
|
||||
<section class="hero">
|
||||
<canvas id="canvas-bg"></canvas>
|
||||
<div class="container">
|
||||
<div class="hero-content">
|
||||
<div class="badge-row">
|
||||
<div class="badge">
|
||||
<svg viewBox="0 0 24 24"><path d="M12 2L15.09 8.26L22 9.27L17 14.14L18.18 21.02L12 17.77L5.82 21.02L7 14.14L2 9.27L8.91 8.26L12 2Z"/></svg>
|
||||
Canadian Owned
|
||||
</div>
|
||||
<div class="badge">
|
||||
<svg viewBox="0 0 24 24"><path d="M12 1L3 5v6c0 5.55 3.84 10.74 9 12 5.16-1.26 9-6.45 9-12V5l-9-4zm0 6c1.4 0 2.8 1.1 2.8 2.5V11c.6 0 1.2.6 1.2 1.2v3.5c0 .7-.6 1.3-1.2 1.3H9.2c-.6 0-1.2-.6-1.2-1.3v-3.5c0-.6.6-1.2 1.2-1.2V9.5C9.2 8.1 10.6 7 12 7z"/></svg>
|
||||
Secure & Sovereign
|
||||
</div>
|
||||
<div class="badge">
|
||||
<svg viewBox="0 0 24 24"><path d="M12 2C6.48 2 2 6.48 2 12s4.48 10 10 10 10-4.48 10-10S17.52 2 12 2zm-1 17.93c-3.95-.49-7-3.85-7-7.93 0-.62.08-1.21.21-1.79L9 15v1c0 1.1.9 2 2 2v1.93zm6.9-2.54c-.26-.81-1-1.39-1.9-1.39h-1v-3c0-.55-.45-1-1-1H8v-2h2c.55 0 1-.45 1-1V7h2c1.1 0 2-.9 2-2v-.41c2.93 1.19 5 4.06 5 7.41 0 2.08-.8 3.97-2.1 5.39z"/></svg>
|
||||
HQ: Montreal, QC
|
||||
</div>
|
||||
</div>
|
||||
|
||||
<h1>Next-Gen Engineering for<br><span>Canadian Institutions</span></h1>
|
||||
<p>We specialize in high-performance Frontend architectures, Generative AI, and Autonomous Agents designed for innovative projects.</p>
|
||||
|
||||
<div style="display: flex; gap: 20px;">
|
||||
<a href="#contact" class="btn btn-primary">Request Consultation</a>
|
||||
<a href="#services" class="btn btn-outline">Explore Solutions</a>
|
||||
</div>
|
||||
</div>
|
||||
</div>
|
||||
</section>
|
||||
|
||||
<!-- Trust & Compliance Section (CRITICAL FOR GOV) -->
|
||||
<section id="trust" class="trust-section">
|
||||
<div class="container">
|
||||
<div class="section-header">
|
||||
<h2>Government-Grade Standards</h2>
|
||||
<p>ONECLICKretargeting Inc. adheres to the strictest security and accessibility protocols required by Canadian federal and provincial bodies.</p>
|
||||
</div>
|
||||
|
||||
<div class="trust-grid">
|
||||
<div class="trust-card">
|
||||
<div class="trust-icon">🛡️</div>
|
||||
<h4>Data Sovereignty</h4>
|
||||
<p>All data processing and storage occur strictly within Canadian borders, ensuring full compliance with privacy laws.</p>
|
||||
</div>
|
||||
<div class="trust-card">
|
||||
<div class="trust-icon">♿</div>
|
||||
<h4>WCAG 2.1 AA</h4>
|
||||
<p>We build accessible interfaces by default, ensuring your digital services are usable by all Canadians.</p>
|
||||
</div>
|
||||
<div class="trust-card">
|
||||
<div class="trust-icon">🔐</div>
|
||||
<h4>ITSG-33 Alignment</h4>
|
||||
<p>Our development lifecycle aligns with CSE (Communications Security Establishment) guidelines.</p>
|
||||
</div>
|
||||
<div class="trust-card">
|
||||
<div class="trust-icon">🇨🇦</div>
|
||||
<h4>Local Expertise</h4>
|
||||
<p>Headquartered in Montreal. We understand the bilingual and cultural nuances of Canadian governance.</p>
|
||||
</div>
|
||||
</div>
|
||||
|
||||
<div class="location-highlight">
|
||||
<span>📍 Proudly Based in</span>
|
||||
<strong>Montreal, Quebec</strong>
|
||||
<span>| Serving Clients Nationwide</span>
|
||||
</div>
|
||||
</div>
|
||||
</section>
|
||||
|
||||
<!-- Services Section -->
|
||||
<section id="services" class="services">
|
||||
<div class="container">
|
||||
<div class="section-header">
|
||||
<h2>Technical Capabilities</h2>
|
||||
<p>Delivering cutting-edge software solutions with a focus on maintainability and scale.</p>
|
||||
</div>
|
||||
|
||||
<div class="service-grid">
|
||||
<!-- Service 1 -->
|
||||
<div class="service-card">
|
||||
<h3>Frontend Engineering</h3>
|
||||
<p>Building complex, reactive user interfaces for government portals and dashboards. We prioritize performance and accessibility.</p>
|
||||
<div class="tech-stack">
|
||||
<span class="tech-tag">React / Next.js</span>
|
||||
<span class="tech-tag">TypeScript</span>
|
||||
<span class="tech-tag">Tailwind</span>
|
||||
</div>
|
||||
</div>
|
||||
|
||||
<!-- Service 2 -->
|
||||
<div class="service-card">
|
||||
<h3>AI & LLM Integration</h3>
|
||||
<p>Securely integrating Large Language Models to automate document processing, citizen support, and data analysis.</p>
|
||||
<div class="tech-stack">
|
||||
<span class="tech-tag">Python</span>
|
||||
<span class="tech-tag">LangChain</span>
|
||||
<span class="tech-tag">Private LLMs</span>
|
||||
</div>
|
||||
</div>
|
||||
|
||||
<!-- Service 3 -->
|
||||
<div class="service-card">
|
||||
<h3>Autonomous Agents</h3>
|
||||
<p>Developing intelligent agents that can execute multi-step workflows, reducing manual administrative burden.</p>
|
||||
<div class="tech-stack">
|
||||
<span class="tech-tag">Agentic Workflows</span>
|
||||
<span class="tech-tag">RAG Systems</span>
|
||||
<span class="tech-tag">API Orchestration</span>
|
||||
</div>
|
||||
</div>
|
||||
</div>
|
||||
</div>
|
||||
</section>
|
||||
|
||||
<!-- Contact Section -->
|
||||
<section id="contact" class="contact">
|
||||
<div class="container">
|
||||
<div class="contact-wrapper">
|
||||
<div class="section-header" style="margin-bottom: 30px;">
|
||||
<h2>Start a Secure Dialogue</h2>
|
||||
<p>Reach out to our Montreal team for a confidential consultation regarding your project requirements.</p>
|
||||
</div>
|
||||
|
||||
<form onsubmit="event.preventDefault(); alert('JazakAllah Khair. Your inquiry has been sent securely to our Montreal office.');">
|
||||
<div class="form-group">
|
||||
<label>Full Name</label>
|
||||
<input type="text" class="form-control" placeholder="John Doe" required>
|
||||
</div>
|
||||
<div class="form-group">
|
||||
<label>Official Email</label>
|
||||
<input type="email" class="form-control" placeholder="name@organization.ca" required>
|
||||
</div>
|
||||
<div class="form-group">
|
||||
<label>Department / Agency</label>
|
||||
<input type="text" class="form-control" placeholder="e.g. Service Canada, DND, etc.">
|
||||
</div>
|
||||
<div class="form-group">
|
||||
<label>Project Scope</label>
|
||||
<textarea class="form-control" rows="4" placeholder="Briefly describe your technical needs..."></textarea>
|
||||
</div>
|
||||
<button type="submit" class="btn btn-primary" style="width: 100%;">Submit Inquiry</button>
|
||||
</form>
|
||||
</div>
|
||||
</div>
|
||||
</section>
|
||||
|
||||
<!-- Footer -->
|
||||
<footer>
|
||||
<div class="container">
|
||||
<div class="footer-grid">
|
||||
<div>
|
||||
<h3 style="color:white; margin-bottom:15px;">ONECLICKretargeting INC.</h3>
|
||||
<p>Empowering Canadian institutions with secure, sovereign, and intelligent software solutions.</p>
|
||||
</div>
|
||||
<div style="text-align: right;">
|
||||
<p><strong>Headquarters:</strong><br>Montreal, Quebec, Canada</p>
|
||||
<p style="margin-top:10px;"><strong>Contact:</strong><br>hello@oneclickretargeting.ca</p>
|
||||
</div>
|
||||
</div>
|
||||
<div class="footer-bottom">
|
||||
<div>© 2026 ONECLICKretageting Inc. All Rights Reserved.</div>
|
||||
<div>Privacy Policy | Terms of Service</div>
|
||||
</div>
|
||||
</div>
|
||||
</footer>
|
||||
|
||||
<!-- JS for Particle Background -->
|
||||
<script>
|
||||
const canvas = document.getElementById('canvas-bg');
|
||||
const ctx = canvas.getContext('2d');
|
||||
|
||||
let width, height;
|
||||
let particles = [];
|
||||
|
||||
function resize() {
|
||||
width = canvas.width = window.innerWidth;
|
||||
height = canvas.height = window.innerHeight;
|
||||
}
|
||||
window.addEventListener('resize', resize);
|
||||
resize();
|
||||
|
||||
class Particle {
|
||||
constructor() {
|
||||
this.x = Math.random() * width;
|
||||
this.y = Math.random() * height;
|
||||
this.vx = (Math.random() - 0.5) * 0.5;
|
||||
this.vy = (Math.random() - 0.5) * 0.5;
|
||||
this.size = Math.random() * 2 + 1;
|
||||
// Canada Red or White
|
||||
this.color = Math.random() > 0.8 ? 'rgba(216, 6, 33, 0.5)' : 'rgba(255, 255, 255, 0.2)';
|
||||
}
|
||||
|
||||
update() {
|
||||
this.x += this.vx;
|
||||
this.y += this.vy;
|
||||
if (this.x < 0 || this.x > width) this.vx *= -1;
|
||||
if (this.y < 0 || this.y > height) this.vy *= -1;
|
||||
}
|
||||
|
||||
draw() {
|
||||
ctx.beginPath();
|
||||
ctx.arc(this.x, this.y, this.size, 0, Math.PI * 2);
|
||||
ctx.fillStyle = this.color;
|
||||
ctx.fill();
|
||||
}
|
||||
}
|
||||
|
||||
function init() {
|
||||
particles = [];
|
||||
const particleCount = Math.min(window.innerWidth / 10, 100);
|
||||
for (let i = 0; i < particleCount; i++) {
|
||||
particles.push(new Particle());
|
||||
}
|
||||
}
|
||||
init();
|
||||
|
||||
function animate() {
|
||||
ctx.clearRect(0, 0, width, height);
|
||||
for (let i = 0; i < particles.length; i++) {
|
||||
particles[i].update();
|
||||
particles[i].draw();
|
||||
for (let j = i; j < particles.length; j++) {
|
||||
const dx = particles[i].x - particles[j].x;
|
||||
const dy = particles[i].y - particles[j].y;
|
||||
const distance = Math.sqrt(dx * dx + dy * dy);
|
||||
if (distance < 150) {
|
||||
ctx.beginPath();
|
||||
ctx.strokeStyle = `rgba(255, 255, 255, ${0.1 - distance/1500})`;
|
||||
ctx.lineWidth = 0.5;
|
||||
ctx.moveTo(particles[i].x, particles[i].y);
|
||||
ctx.lineTo(particles[j].x, particles[j].y);
|
||||
ctx.stroke();
|
||||
}
|
||||
}
|
||||
}
|
||||
requestAnimationFrame(animate);
|
||||
}
|
||||
animate();
|
||||
</script>
|
||||
</body>
|
||||
</html>
|
||||
المرجع في مشكلة جديدة
حظر مستخدم