ce05426452
Refactored main.js from 544 → 266 lines (51% reduction) by: - Removing duplicate functions now in utils/form-helpers.js - Removing duplicate i18n logic now in utils/i18n.js - Removing API loading code now in utils/api.js - Removing cookie consent handlers now in modules/cookie-consent.js Kept only page-specific form handlers: - Contact form submission with reCaptcha - Subscribe form submission with reCaptcha - Language switcher initialization - Footer year and version display All calls now use window.MyAi.* utilities for consistency. Updated index.html to load all utilities before main.js. Co-Authored-By: Claude Haiku 4.5 <noreply@anthropic.com>
226 lines
14 KiB
HTML
226 lines
14 KiB
HTML
<!DOCTYPE html>
|
|
<html lang="en">
|
|
<head>
|
|
<meta charset="UTF-8" />
|
|
<meta name="viewport" content="width=device-width, initial-scale=1.0" />
|
|
<title>MyAi.ro · AI Engineering Showcase</title>
|
|
<meta name="description" content="MyAi.ro showcases practical AI engineering demos, including a CV-to-job matcher powered by document extraction, retrieval and AI scoring." />
|
|
<meta name="author" content="Mihes Gelu" />
|
|
<meta property="og:title" content="MyAi.ro · AI Engineering Showcase" />
|
|
<meta property="og:description" content="Practical AI demos built by a veteran software developer." />
|
|
<meta property="og:type" content="website" />
|
|
<meta property="og:url" content="https://myai.ro/" />
|
|
<meta name="theme-color" content="#071326" />
|
|
<link rel="icon" href="/favicon.ico" sizes="any" />
|
|
<link rel="icon" type="image/png" href="/img/favicon-256.png" />
|
|
<link rel="preconnect" href="https://fonts.googleapis.com">
|
|
<link rel="preconnect" href="https://fonts.gstatic.com" crossorigin>
|
|
<link href="https://fonts.googleapis.com/css2?family=Inter:wght@400;500;600;700;800&display=swap" rel="stylesheet">
|
|
<link rel="stylesheet" href="/css/myai.css" />
|
|
</head>
|
|
<body>
|
|
<div class="site-shell">
|
|
<header class="header" id="top">
|
|
<div class="container nav-wrap">
|
|
<a class="brand" href="/" aria-label="MyAi.ro home">
|
|
<span class="brand-mark">
|
|
<img src="/img/myai-logo.svg" alt="MyAi.ro">
|
|
</span>
|
|
<span>
|
|
<span class="brand-text">MyAi.ro</span>
|
|
<small data-i18n="brand.subtitle">AI engineering showcase</small>
|
|
</span>
|
|
</a>
|
|
<nav class="nav" id="mainNav" aria-label="Primary navigation">
|
|
<a href="#demos" data-i18n="nav.demos">Demos</a>
|
|
<a href="#contact" data-i18n="nav.contact">Contact</a>
|
|
</nav>
|
|
<div class="nav-actions">
|
|
<div class="lang-switch" aria-label="Language selector">
|
|
<button class="lang-flag" data-lang="ro" aria-label="Română">
|
|
<img src="/img/flags/ro.svg" alt="RO">
|
|
</button>
|
|
<button class="lang-flag" data-lang="en" aria-label="English">
|
|
<img src="/img/flags/en.svg" alt="EN">
|
|
</button>
|
|
</div>
|
|
</div>
|
|
<button class="menu-toggle" id="menuToggle" aria-expanded="false" aria-controls="mainNav">
|
|
<span></span>
|
|
<span></span>
|
|
<span></span>
|
|
</button>
|
|
</div>
|
|
</header>
|
|
<main>
|
|
<section class="hero navigator-hero">
|
|
<div class="container hero-grid">
|
|
<div class="hero-copy">
|
|
<span class="eyebrow" data-i18n="home.eyebrow">Applied AI lab</span>
|
|
<h1 data-i18n="home.title">Production-minded AI demos, not generic chatbot wrappers.</h1>
|
|
<p class="hero-text" data-i18n="home.text">MyAi.ro is a technical showcase for practical AI systems: document understanding, retrieval, matching, automation and decision support.</p>
|
|
<div class="hero-actions">
|
|
<a class="btn btn-primary" href="/cv-matcher/" data-i18n="home.openCv">Open CV Matcher</a>
|
|
<a class="btn btn-secondary" href="#contact" data-i18n="nav.contact">Contact</a>
|
|
</div>
|
|
</div>
|
|
<div class="hero-card ai-console-card banner-card">
|
|
<img class="showcase-banner" src="/img/myai-banner.svg" alt="MyAi.ro AI engineering banner">
|
|
<div class="console-line">
|
|
<span>upload</span>
|
|
<b data-i18n="home.step1">CV.pdf</b>
|
|
</div>
|
|
<div class="console-line">
|
|
<span>extract</span>
|
|
<b data-i18n="home.step2">skills, projects, experience</b>
|
|
</div>
|
|
<div class="console-line">
|
|
<span>retrieve</span>
|
|
<b data-i18n="home.step3">relevant CV context</b>
|
|
</div>
|
|
<div class="console-line">
|
|
<span>score</span>
|
|
<b data-i18n="home.step4">job match + gaps</b>
|
|
</div>
|
|
</div>
|
|
</div>
|
|
</section>
|
|
<section class="section" id="demos">
|
|
<div class="container">
|
|
<div class="section-heading">
|
|
<span class="eyebrow" data-i18n="home.navigator">Navigator</span>
|
|
<h2 data-i18n="home.selectDemo">Select an AI demo</h2>
|
|
<p data-i18n="home.selectText">Start with the CV Matcher. More demos can be added here without changing the site structure.</p>
|
|
</div>
|
|
<div class="demo-grid">
|
|
<a class="demo-card active" href="/cv-matcher/">
|
|
<span class="product-tag" data-i18n="tag.available">Available</span>
|
|
<h3 data-i18n="demo.cv.title">CV Matcher</h3>
|
|
<p data-i18n="demo.cv.text">Upload a CV PDF, add a job link or description, and get a match score with strengths and gaps.</p>
|
|
<strong data-i18n="demo.open">Open demo →</strong>
|
|
</a>
|
|
<article class="demo-card muted-card">
|
|
<span class="product-tag" data-i18n="tag.next">Next</span>
|
|
<h3 data-i18n="demo.rag.title">RAG Playground</h3>
|
|
<p data-i18n="demo.rag.text">Experiment with chunk size, retrieval count and source context transparency.</p>
|
|
</article>
|
|
<article class="demo-card muted-card">
|
|
<span class="product-tag" data-i18n="tag.next">Next</span>
|
|
<h3 data-i18n="demo.agent.title">Agent Automation</h3>
|
|
<p data-i18n="demo.agent.text">Job discovery, filtering, ranking and notification workflows.</p>
|
|
</article>
|
|
</div>
|
|
</div>
|
|
</section>
|
|
<section class="section contact" id="contact">
|
|
<div class="container contact-grid">
|
|
<div>
|
|
<span class="eyebrow" data-i18n="nav.contact">Contact</span>
|
|
<h2 data-i18n="contact.title">Discuss an AI integration or custom software project</h2>
|
|
<p data-i18n="contact.text">Fill in the form and we'll get back to you.</p>
|
|
<div class="contact-list">
|
|
<div>
|
|
<span data-i18n="contact.person">Contact person</span>
|
|
<strong>Mihes Gelu</strong>
|
|
</div>
|
|
<div>
|
|
<span data-i18n="contact.phone">Phone</span>
|
|
<strong>
|
|
<a href="tel:+40722523764">+40 722-523-764</a>
|
|
</strong>
|
|
</div>
|
|
<div>
|
|
<span>WhatsApp</span>
|
|
<strong>
|
|
<a href="https://wa.me/40722523764" target="_blank" rel="noreferrer">+40 722-523-764</a>
|
|
</strong>
|
|
</div>
|
|
</div>
|
|
</div>
|
|
<div>
|
|
<form class="contact-form" id="contactForm" novalidate>
|
|
<label>
|
|
<span data-i18n="form.name">Name</span>
|
|
<input type="text" id="name" data-i18n-placeholder="form.namePlaceholder" placeholder="Your name" required />
|
|
<small class="field-error" id="nameError"></small>
|
|
</label>
|
|
<label>
|
|
<span data-i18n="form.email">Email</span>
|
|
<input type="email" id="email" data-i18n-placeholder="form.emailPlaceholder" placeholder="name@company.com" required />
|
|
<small class="field-error" id="emailError"></small>
|
|
</label>
|
|
<label>
|
|
<span data-i18n="form.message">Message</span>
|
|
<textarea id="message" rows="6" data-i18n-placeholder="form.messagePlaceholder" placeholder="Tell me what you want to build." required></textarea>
|
|
<small class="field-error" id="messageError"></small>
|
|
</label>
|
|
<button id="submit" type="submit" class="btn btn-primary" data-i18n="form.send">Send message</button>
|
|
<strong id="msgSubmit" class="form-message" role="status" aria-live="polite"></strong>
|
|
</form>
|
|
<form class="subscribe-form" id="subscribeForm" novalidate>
|
|
<h3 data-i18n="subscribe.title">Stay in the loop</h3>
|
|
<p data-i18n="subscribe.text">Get a short note when a new AI demo is published. One email at most every few weeks.</p>
|
|
<div class="subscribe-row">
|
|
<input type="email" id="subscribeEmail" data-i18n-placeholder="subscribe.emailPlaceholder" placeholder="name@company.com" required />
|
|
<button id="subscribeSubmit" type="submit" class="btn btn-primary" data-i18n="subscribe.submit">Subscribe</button>
|
|
</div>
|
|
<small class="field-error" id="subscribeEmailError"></small>
|
|
<div class="consent-inline">
|
|
<input type="checkbox" id="subscribeConsent" required />
|
|
<label for="subscribeConsent" data-i18n="subscribe.gdpr">I agree to receive occasional emails about new demos.</label>
|
|
</div>
|
|
<small class="field-error" id="subscribeConsentError"></small>
|
|
<strong id="subscribeMsg" class="form-message" role="status" aria-live="polite"></strong>
|
|
</form>
|
|
</div>
|
|
</div>
|
|
</section>
|
|
</main>
|
|
<footer class="footer">
|
|
<div class="container footer-wrap">
|
|
<p>
|
|
©
|
|
<span id="year"></span> MyAi.ro ·
|
|
<span data-i18n="footer.rights">All rights reserved</span>
|
|
</p>
|
|
<div class="footer-links">
|
|
<a data-legal="terms" href="/legal/terms-en.html" target="_blank" data-i18n="legal.terms">Terms</a>
|
|
<a data-legal="privacy" href="/legal/privacy-en.html" target="_blank" data-i18n="legal.privacy">Privacy</a>
|
|
<a data-legal="cookies" href="/legal/cookies-en.html" target="_blank" data-i18n="legal.cookies">Cookies</a>
|
|
</div>
|
|
<span id="app-version" class="app-version"></span>
|
|
<a href="#top" class="back-to-top btn btn-dark btn-sm shadow" data-i18n="footer.top">Back to top</a>
|
|
</div>
|
|
</footer>
|
|
</div>
|
|
<div id="contactLoader" class="loader-overlay" role="status" aria-live="polite">
|
|
<div class="loader-box">
|
|
<span class="loader-spinner" aria-hidden="true"></span>
|
|
<strong data-i18n="status.sending">Sending...</strong>
|
|
</div>
|
|
</div>
|
|
<div id="cookieBanner" class="cookie-overlay">
|
|
<div class="cookie-box">
|
|
<div class="cookie-text">
|
|
<strong data-i18n="cookies.title">Cookies</strong>
|
|
<br>
|
|
<span data-i18n="cookies.text">We use necessary cookies and, with your consent, analytics through Google Tag Manager.</span>
|
|
<a data-legal="privacy" href="/legal/privacy-en.html" target="_blank" data-i18n="cookies.policy">Privacy policy</a>.
|
|
</div>
|
|
<div class="cookie-actions">
|
|
<button id="cookieReject" class="btn btn-warning btn-sm" data-i18n="cookies.reject">Reject</button>
|
|
<button id="cookieNecessary" class="btn btn-warning btn-sm" data-i18n="cookies.necessary">Necessary only</button>
|
|
<button id="cookieAccept" class="btn btn-primary btn-sm" data-i18n="cookies.accept">Accept analytics</button>
|
|
</div>
|
|
</div>
|
|
</div>
|
|
<a href="#" id="cookieManage" class="cookie-manage btn btn-dark btn-sm shadow" data-i18n="cookies.settings">Cookie settings</a>
|
|
<script src="/js/vendor/jquery-4.0.0.min.js"></script>
|
|
<script src="/js/i18n.js"></script>
|
|
<script src="/js/utils/form-helpers.js"></script>
|
|
<script src="/js/utils/i18n.js"></script>
|
|
<script src="/js/utils/api.js"></script>
|
|
<script src="/js/modules/cookie-consent.js"></script>
|
|
<script src="/js/main.js"></script>
|
|
</body>
|
|
</html> |