Pass de modernisation visuelle : remplacement de TOUS les emojis Unicode dans les templates marketing/legal/billing/auth par des SVG inline (style heroicons) ou par du texte propre, pour un look SaaS pro à la Linear/Vercel/Stripe. Mapping principal : - ✓ / ✗ / ⚠ → SVG check / x / triangle (text-brand-b3 / red / amber) - → / ← / ↗ → SVG arrow-right / arrow-left / arrow-up-right - 🍁 / 🏛️ / ⚖️ / 🔓 → SVG map-pin / building / scale / code-brackets - 🎙️ / 👥 / 📝 / 💬 / 📄 / 🔌 → 6 SVG bento icons (microphone, users, doc, chat, export, plug) - ✉️ / ☎️ / 📬 → SVG envelope / phone / map-pin - ↺ → SVG refresh-counter-clockwise - ★ → SVG star (RECOMMANDÉ badge) - 🎯/🏢/📺/🤝/📰 → SVG target / office / play / handshake / news (raccourcis contact) - ⚖️/📊/🏛️ (testimonials) → SVG scale / bar-chart / building - ✦ (default bento icon) → SVG sparkle inline Tous les SVG utilisent stroke="currentColor" pour héritage Tailwind text-*. Les SVG informationnels du tableau comparatif portent un aria-label sémantique (Conforme/Non conforme/Partiel) ; les SVG décoratifs portent aria-hidden. Tests : - 18/18 legal pages passent (test_legal_pages.py) - test_comparatif_check_marks_consistently_mean_good ajusté pour asserter sur les aria-label SVG plutôt que les caractères ✓/✗ - 4 échecs pré-existants non liés (manque /blog dans nav, SOC 2 hedge dans conformite.html, gitea.innova-ai.ca url) — confirmés présents avant ce commit Fichiers modifiés (14) : - templates/macros/{bento,pricing_card}.html (sources de vérité) - templates/marketing/{base,_footer,landing,fonctionnalites,tarifs,conformite,contact}.html - templates/legal/{_layout,index}.html - templates/billing/{cancel,success}.html - tests/test_marketing_landing_template.py (assert sur aria-label) Audit final : 0 emoji restant dans les fichiers in-scope ; 0 emoji dans le HTML rendu de toutes les pages marketing/legal vérifiées. Co-Authored-By: Claude Opus 4.7 (1M context) <noreply@anthropic.com>
153 lines
11 KiB
HTML
153 lines
11 KiB
HTML
{% extends 'marketing/base.html' %}
|
|
|
|
{% block title %}Conformité DictIA — Loi 25 (LPRPSP), LGGRI, AGPL v3, audit trail{% endblock %}
|
|
{% block description %}DictIA mappe son architecture aux exigences Loi 25 (LPRPSP), au cadre IA du secteur public québécois (LGGRI), avec hébergement OVH Beauharnois et code source AGPL v3 vérifiable.{% endblock %}
|
|
|
|
{% block content %}
|
|
|
|
{# ===== HEADER ===== #}
|
|
<section class="bg-brand-navy text-white py-20 overflow-hidden relative" aria-labelledby="page-title">
|
|
<div class="absolute top-1/3 left-1/4 w-[500px] h-[500px] rounded-full pointer-events-none" aria-hidden="true"
|
|
style="background: radial-gradient(circle, rgba(0,200,150,0.07) 0%, transparent 60%); filter: blur(60px);"></div>
|
|
<div class="relative max-w-[820px] mx-auto px-6 text-center">
|
|
<p class="eyebrow grad-text mb-4">CONFORMITÉ — FORTERESSE QUÉBÉCOISE</p>
|
|
<h1 id="page-title" class="text-[clamp(2.25rem,4vw,3.5rem)] font-black mb-4">
|
|
Architecture <span class="grad-text">conçue avec</span> les exigences professionnelles québécoises.
|
|
</h1>
|
|
<p class="text-lg text-white/80">
|
|
Détails techniques, EFVP type, modèles de déclaration CAI : disponibles sur demande à <a href="mailto:info@dictia.ca" class="grad-text font-semibold hover:underline">info@dictia.ca</a>.
|
|
</p>
|
|
</div>
|
|
</section>
|
|
|
|
{# ===== 4 PILLARS (same as landing's Conformité section, content-identical for SEO single source of truth on /conformite landing page) ===== #}
|
|
<section class="bg-white py-20" aria-labelledby="pillars-title">
|
|
<div class="max-w-[1200px] mx-auto px-6">
|
|
<div class="text-center max-w-2xl mx-auto mb-12">
|
|
<p class="eyebrow grad-text mb-4">QUATRE PILIERS</p>
|
|
<h2 id="pillars-title" class="text-[clamp(2rem,3vw,2.75rem)] font-black mb-4 text-brand-navy">
|
|
Pourquoi la conformité est <span class="grad-text">structurelle</span>, pas optionnelle.
|
|
</h2>
|
|
</div>
|
|
{# Icons (heroicons-style outline) — pin (QC), scale (Loi 25), building (Cadre IA), code (AGPL). #}
|
|
{%- set svg_pin = '<svg xmlns="http://www.w3.org/2000/svg" viewBox="0 0 24 24" fill="none" stroke="currentColor" stroke-width="2" stroke-linecap="round" stroke-linejoin="round" class="w-5 h-5" aria-hidden="true"><path d="M21 10c0 7-9 13-9 13s-9-6-9-13a9 9 0 0 1 18 0z"/><circle cx="12" cy="10" r="3"/></svg>' -%}
|
|
{%- set svg_scale = '<svg xmlns="http://www.w3.org/2000/svg" viewBox="0 0 24 24" fill="none" stroke="currentColor" stroke-width="2" stroke-linecap="round" stroke-linejoin="round" class="w-5 h-5" aria-hidden="true"><path d="M12 3v18"/><path d="M5 7h14"/><path d="M5 7l-2 6a4 4 0 0 0 8 0L9 7"/><path d="M19 7l2 6a4 4 0 0 1-8 0l2-6"/><path d="M8 21h8"/></svg>' -%}
|
|
{%- set svg_building = '<svg xmlns="http://www.w3.org/2000/svg" viewBox="0 0 24 24" fill="none" stroke="currentColor" stroke-width="2" stroke-linecap="round" stroke-linejoin="round" class="w-5 h-5" aria-hidden="true"><path d="M3 21h18"/><path d="M5 21V8l7-4 7 4v13"/><path d="M9 21v-6h6v6"/><path d="M9 11h.01"/><path d="M15 11h.01"/></svg>' -%}
|
|
{%- set svg_code = '<svg xmlns="http://www.w3.org/2000/svg" viewBox="0 0 24 24" fill="none" stroke="currentColor" stroke-width="2" stroke-linecap="round" stroke-linejoin="round" class="w-5 h-5" aria-hidden="true"><polyline points="16 18 22 12 16 6"/><polyline points="8 6 2 12 8 18"/><line x1="14" y1="4" x2="10" y2="20"/></svg>' -%}
|
|
<div class="grid md:grid-cols-2 lg:grid-cols-4 gap-6">
|
|
{% for card in [
|
|
{
|
|
'icon': svg_pin,
|
|
'title': 'Stockage OVH Beauharnois (QC)',
|
|
'desc': 'Stockage persistant chez OVHcloud Canada à Beauharnois, Québec. Traitement GPU temporaire sur GCP Toronto (Ontario) : RAM uniquement, durée maximale 5 minutes par session, zéro persistance — encadré par EFVP signée. Données médicales et biométriques jamais hors du Canada.'
|
|
},
|
|
{
|
|
'icon': svg_scale,
|
|
'title': 'Mappé Loi 25 (LPRPSP)',
|
|
'desc': 'Audit trail art. 3.5, EFVP signées art. 3.3 et 17 (GCP, HubSpot), registre des consentements art. 14, déclaration CAI biométrie (formulaire K1) préparée. Modèles disponibles sur demande.'
|
|
},
|
|
{
|
|
'icon': svg_building,
|
|
'title': 'Compatible Cadre IA secteur public',
|
|
'desc': 'DictIA est conçu pour s\'inscrire dans le cadre de gestion des systèmes d\'IA du secteur public québécois (LGGRI). Documentation détaillée sur demande.'
|
|
},
|
|
{
|
|
'icon': svg_code,
|
|
'title': 'Code source AGPL v3 vérifiable',
|
|
'desc': 'Fork du projet open source Speakr — architecture entièrement auditable sur <a href="https://gitea.dictia.ca/Innova-AI/dictia-public" target="_blank" rel="noopener" class="underline hover:text-brand-navy">Gitea public</a>. Aucune boîte noire. Vos auditeurs peuvent examiner chaque ligne.'
|
|
}
|
|
] %}
|
|
<article class="bg-brand-bg p-6 rounded border border-brand-border">
|
|
<div class="w-10 h-10 grad-bg rounded-none mb-4 flex items-center justify-center text-white shadow-cta" aria-hidden="true">{{ card.icon | safe }}</div>
|
|
<h3 class="text-lg font-bold mb-2 text-brand-navy">{{ card.title | safe }}</h3>
|
|
<p class="text-sm text-brand-navy/80 leading-relaxed">{{ card.desc | safe }}</p>
|
|
</article>
|
|
{% endfor %}
|
|
</div>
|
|
</div>
|
|
</section>
|
|
|
|
{# ===== LOI 25 DETAIL ===== #}
|
|
<section class="bg-brand-bg py-20" aria-labelledby="loi25-title">
|
|
<div class="max-w-[1060px] mx-auto px-6">
|
|
<div class="text-center max-w-2xl mx-auto mb-12">
|
|
<p class="eyebrow grad-text mb-4">LOI 25 (LPRPSP)</p>
|
|
<h2 id="loi25-title" class="text-[clamp(2rem,3vw,2.75rem)] font-black mb-4 text-brand-navy">
|
|
Trois articles centraux que DictIA adresse par construction.
|
|
</h2>
|
|
<p class="text-base text-brand-navy/80">
|
|
La <em>Loi sur la protection des renseignements personnels dans le secteur privé</em> (LPRPSP, communément appelée « Loi 25 ») impose une discipline stricte sur les données biométriques et confidentielles. Les voix capturées en réunion en font partie. Voici comment notre architecture y répond.
|
|
</p>
|
|
</div>
|
|
|
|
<div class="space-y-6">
|
|
{% for art in [
|
|
{
|
|
'num': 'Art. 3.3',
|
|
'title': 'Évaluation des facteurs relatifs à la vie privée (EFVP)',
|
|
'desc': 'Tout déploiement de DictIA dans un cabinet ou un organisme public déclenche une EFVP. Nous fournissons un modèle pré-rempli pour la voix professionnelle (catégories de données, finalités, mesures de sécurité, durée de conservation, transferts) — à compléter avec votre responsable de la protection des renseignements personnels (RPRP).'
|
|
},
|
|
{
|
|
'num': 'Art. 3.5',
|
|
'title': 'Audit trail intégré',
|
|
'desc': 'Chaque enregistrement, écoute, export, partage ou suppression est journalisé : utilisateur, IP, date/heure UTC, action. Le journal est consultable par votre RPRP et exportable pour audits CAI ou ordres professionnels. Aucun moyen de désactiver le journal côté client.'
|
|
},
|
|
{
|
|
'num': 'Art. 14',
|
|
'title': 'Consentement explicite et tracé',
|
|
'desc': 'Avant tout enregistrement, DictIA exige une confirmation que les participants ont consenti à l\'enregistrement et à la transcription IA. Le consentement est tracé dans le journal d\'audit. Vous pouvez configurer une demande de consentement automatique en début de session.'
|
|
}
|
|
] %}
|
|
<article class="bg-white p-6 rounded border border-brand-border">
|
|
<div class="flex flex-col md:flex-row md:items-start gap-4">
|
|
<div class="flex-shrink-0">
|
|
<span class="inline-block bg-brand-navy text-white text-xs font-black px-3 py-1.5 rounded-none">{{ art.num | safe }}</span>
|
|
</div>
|
|
<div>
|
|
<h3 class="text-lg font-bold mb-2 text-brand-navy">{{ art.title | safe }}</h3>
|
|
<p class="text-sm text-brand-navy/80 leading-relaxed">{{ art.desc | safe }}</p>
|
|
</div>
|
|
</div>
|
|
</article>
|
|
{% endfor %}
|
|
</div>
|
|
</div>
|
|
</section>
|
|
|
|
{# ===== AGPL TRANSPARENCY ===== #}
|
|
<section class="bg-brand-navy text-white py-20" aria-labelledby="agpl-title">
|
|
<div class="max-w-[820px] mx-auto px-6 text-center">
|
|
<p class="eyebrow grad-text mb-4">AGPL V3 — TRANSPARENCE</p>
|
|
<h2 id="agpl-title" class="text-[clamp(2rem,3vw,2.75rem)] font-black mb-4">
|
|
Code <span class="grad-text">vérifiable ligne par ligne</span>.
|
|
</h2>
|
|
<p class="text-base text-white/80 mb-8">
|
|
DictIA est publié sous licence <strong>GNU AGPL v3</strong>. Conséquence pratique : tout fork hébergé doit publier ses modifications sous la même licence. Vos auditeurs internes ou un tiers de confiance peuvent inspecter chaque ligne — modèle ML, pipeline audio, gestion d'identité, journal d'audit, exports. Aucune boîte noire propriétaire.
|
|
</p>
|
|
<div class="flex flex-col sm:flex-row gap-4 justify-center">
|
|
{% from 'macros/button.html' import button %}
|
|
{{ button('Code source sur Gitea', href='https://gitea.dictia.ca/Innova-AI/dictia-public', variant='primary', size='lg', icon='<svg xmlns="http://www.w3.org/2000/svg" viewBox="0 0 24 24" fill="none" stroke="currentColor" stroke-width="2" stroke-linecap="round" stroke-linejoin="round" class="w-4 h-4" aria-hidden="true"><path d="M7 17l9.2-9.2M17 17V8h-9"/></svg>', target='_blank', rel='noopener') }}
|
|
{{ button('Comprendre AGPL v3', href='https://www.gnu.org/licenses/agpl-3.0.fr.html', variant='ghost', size='lg', target='_blank', rel='noopener') }}
|
|
</div>
|
|
</div>
|
|
</section>
|
|
|
|
{# ===== CTA ===== #}
|
|
<section class="bg-brand-bg py-20" aria-labelledby="conformite-cta-title">
|
|
<div class="max-w-[820px] mx-auto px-6 text-center">
|
|
<h2 id="conformite-cta-title" class="text-[clamp(2rem,3vw,2.75rem)] font-black mb-6 text-brand-navy">
|
|
Une <span class="grad-text">question de conformité</span> ?
|
|
</h2>
|
|
<p class="text-lg text-brand-navy/80 mb-8">
|
|
Nous accompagnons votre RPRP, votre comptable d'ordre ou votre service juridique dans l'évaluation. Modèle d'EFVP, registre de consentements et exemple de déclaration CAI sur demande.
|
|
</p>
|
|
<div class="flex flex-col sm:flex-row gap-4 justify-center">
|
|
{% from 'macros/button.html' import button %}
|
|
{{ button('Demander un dossier conformité', href='mailto:info@dictia.ca?subject=Demande%20dossier%20conformit%C3%A9', variant='primary', size='lg', icon='<svg xmlns="http://www.w3.org/2000/svg" viewBox="0 0 24 24" fill="none" stroke="currentColor" stroke-width="2" stroke-linecap="round" stroke-linejoin="round" class="w-4 h-4" aria-hidden="true"><path d="M4 4h16c1.1 0 2 .9 2 2v12c0 1.1-.9 2-2 2H4c-1.1 0-2-.9-2-2V6c0-1.1.9-2 2-2z"/><polyline points="22,6 12,13 2,6"/></svg>') }}
|
|
{{ button('Voir les forfaits', href='/tarifs', variant='secondary', size='lg') }}
|
|
</div>
|
|
</div>
|
|
</section>
|
|
|
|
{% endblock %}
|