diff --git a/templates/billing/cancel.html b/templates/billing/cancel.html index dc22926..c7dfbee 100644 --- a/templates/billing/cancel.html +++ b/templates/billing/cancel.html @@ -8,7 +8,9 @@ {# ===== HERO ===== #}
- +

PAIEMENT ANNULÉ

Aucun problème — aucun montant prélevé. diff --git a/templates/billing/success.html b/templates/billing/success.html index 8cd0924..40cb537 100644 --- a/templates/billing/success.html +++ b/templates/billing/success.html @@ -8,7 +8,9 @@ {# ===== HERO ===== #}
- +

PAIEMENT CONFIRMÉ

Merci ! Votre paiement est confirmé. diff --git a/templates/legal/_layout.html b/templates/legal/_layout.html index 8752c38..15cf9f1 100644 --- a/templates/legal/_layout.html +++ b/templates/legal/_layout.html @@ -269,8 +269,9 @@ @@ -282,8 +283,9 @@ @@ -292,8 +294,8 @@ {% endif %} diff --git a/templates/legal/index.html b/templates/legal/index.html index a514a40..694e81b 100644 --- a/templates/legal/index.html +++ b/templates/legal/index.html @@ -79,12 +79,12 @@

- {{ page.title }}{% if page.external %}{% endif %} + {{ page.title }}{% if page.external %}{% endif %}

{{ page.description }}

{% if page.external %} -

- +

+ {{ page.url }} (s'ouvre dans un nouvel onglet)

diff --git a/templates/macros/bento.html b/templates/macros/bento.html index c05f84a..3fd8687 100644 --- a/templates/macros/bento.html +++ b/templates/macros/bento.html @@ -1,12 +1,15 @@ {# Reusable bento card macro. FlexiHub style: dark navy2 surface, decorative watermark number, gradient icon corner. `span` controls column span via a static lookup table (Tailwind's content scanner only sees literal class strings, - so dynamic `col-span-{{ span }}` would produce dead classes — the lookup keeps the utilities discoverable). #} -{% macro bento_card(number, title, description, icon='✦', span='1') %} + so dynamic `col-span-{{ span }}` would produce dead classes — the lookup keeps the utilities discoverable). + `icon` is rendered via `| safe` so callers can pass either inline SVG markup (preferred) or a plain string. + The default is a small inline sparkle SVG to avoid any emoji fallback. #} +{% macro bento_card(number, title, description, icon=None, span='1') %} {%- set span_classes = {'1': 'col-span-1', '2': 'sm:col-span-2', '3': 'sm:col-span-2 md:col-span-3'} -%} +{%- set default_icon = '' -%}
-
{{ icon }}
+

{{ title | safe }}

{{ description | safe }}

diff --git a/templates/macros/pricing_card.html b/templates/macros/pricing_card.html index 672b010..13301d1 100644 --- a/templates/macros/pricing_card.html +++ b/templates/macros/pricing_card.html @@ -16,7 +16,7 @@ (verified: "DictIA 8", "DictIA 16", "DictIA Cloud" are all entity-free). #} {%- macro pricing_card(slug, name, price_setup, price_monthly, target, features, recommended=False, cta_url='/checkout') -%}

+ {# Icons (heroicons-style outline) — pin (QC), scale (Loi 25), building (Cadre IA), code (AGPL). #} + {%- set svg_pin = '' -%} + {%- set svg_scale = '' -%} + {%- set svg_building = '' -%} + {%- set svg_code = '' -%}
{% for card in [ { - 'icon': '🍁', + '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': '⚖️', + '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': '🏛️', + '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': '🔓', + 'icon': svg_code, 'title': 'Code source AGPL v3 vérifiable', 'desc': 'Fork du projet open source Speakr — architecture entièrement auditable sur Gitea public. Aucune boîte noire. Vos auditeurs peuvent examiner chaque ligne.' } ] %}
- +

{{ card.title | safe }}

{{ card.desc | safe }}

@@ -121,7 +126,7 @@

{% 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='↗', target='_blank', rel='noopener') }} + {{ button('Code source sur Gitea', href='https://gitea.dictia.ca/Innova-AI/dictia-public', variant='primary', size='lg', icon='', 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') }}
@@ -138,7 +143,7 @@

{% 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='✉️') }} + {{ button('Demander un dossier conformité', href='mailto:info@dictia.ca?subject=Demande%20dossier%20conformit%C3%A9', variant='primary', size='lg', icon='') }} {{ button('Voir les forfaits', href='/tarifs', variant='secondary', size='lg') }}
diff --git a/templates/marketing/contact.html b/templates/marketing/contact.html index ee38b3a..1352c58 100644 --- a/templates/marketing/contact.html +++ b/templates/marketing/contact.html @@ -13,7 +13,7 @@ Parlons de votre projet.

- Réponse sous 2 jours ouvrables. Pour les urgences techniques des clients existants, voyez la console DictIA → Support. + Réponse sous 2 jours ouvrables. Pour les urgences techniques des clients existants, voyez la section Support de la console DictIA.

@@ -26,7 +26,9 @@ {# Email card #}
- +

Courriel

Privilégiez le courriel pour : pré-inscription, devis, démonstration, dossier de conformité, partenariats. @@ -36,7 +38,9 @@ {# Phone card #}

- +

Téléphone

Du lundi au vendredi, 9 h à 17 h (heure de l'Est). Laissez un message en dehors de ces heures. @@ -46,7 +50,9 @@ {# Mailing address card #}

- +

Bureau

Sur rendez-vous uniquement. Visites en personne pour démonstrations on-premise et déploiements DictIA 16 corporatifs. @@ -73,18 +79,25 @@

+ {# Shortcut icons (heroicons-style outline). Each is a self-contained inline SVG passed via | safe in the loop. #} + {%- set svg_target = '' -%} + {%- set svg_office = '' -%} + {%- set svg_play = '' -%} + {%- set svg_scale_sm = '' -%} + {%- set svg_handshake = '' -%} + {%- set svg_news = '' -%}
{% for shortcut in [ - {'label': 'Pré-inscription DictIA', 'subject': 'Pr%C3%A9-inscription%20DictIA', 'icon': '🎯'}, - {'label': 'Devis multi-sites', 'subject': 'Devis%20multi-sites', 'icon': '🏢'}, - {'label': 'Demande de démonstration', 'subject': 'Demande%20de%20d%C3%A9monstration', 'icon': '📺'}, - {'label': 'Dossier conformité Loi 25', 'subject': 'Dossier%20conformit%C3%A9%20Loi%2025', 'icon': '⚖️'}, - {'label': 'Partenariat / intégration', 'subject': 'Partenariat%20/%20int%C3%A9gration', 'icon': '🤝'}, - {'label': 'Question média / presse', 'subject': 'Question%20m%C3%A9dia', 'icon': '📰'} + {'label': 'Pré-inscription DictIA', 'subject': 'Pr%C3%A9-inscription%20DictIA', 'icon': svg_target}, + {'label': 'Devis multi-sites', 'subject': 'Devis%20multi-sites', 'icon': svg_office}, + {'label': 'Demande de démonstration', 'subject': 'Demande%20de%20d%C3%A9monstration', 'icon': svg_play}, + {'label': 'Dossier conformité Loi 25', 'subject': 'Dossier%20conformit%C3%A9%20Loi%2025', 'icon': svg_scale_sm}, + {'label': 'Partenariat / intégration', 'subject': 'Partenariat%20/%20int%C3%A9gration', 'icon': svg_handshake}, + {'label': 'Question média / presse', 'subject': 'Question%20m%C3%A9dia', 'icon': svg_news} ] %} - + {{ shortcut.label | safe }} {% endfor %} diff --git a/templates/marketing/fonctionnalites.html b/templates/marketing/fonctionnalites.html index 1597c89..864b33e 100644 --- a/templates/marketing/fonctionnalites.html +++ b/templates/marketing/fonctionnalites.html @@ -23,15 +23,22 @@

Six fonctionnalités principales

{# NOTE: bento card content is duplicated between landing.html and fonctionnalites.html. - When editing, sync both files. Future refactor: extract to _partials/_bento_features.html. #} + When editing, sync both files. Future refactor: extract to _partials/_bento_features.html. + Icon SVGs (heroicons-style outline) are inlined directly because the macro renders `icon | safe`. #} {% from 'macros/bento.html' import bento_card %} + {%- set icon_microphone = '' -%} + {%- set icon_users = '' -%} + {%- set icon_document = '' -%} + {%- set icon_chat = '' -%} + {%- set icon_export = '' -%} + {%- set icon_plug = '' -%}
- {{ bento_card('01', 'Transcription WhisperX', 'Large-v3 fine-tuné FR-CA. Précision 95 %+ sur réunions, dictées, audiences (méthodologie disponible sur demande).', '🎙️') }} - {{ bento_card('02', 'Diarisation 8 locuteurs', 'pyannote sépare automatiquement les intervenants. Identification par embeddings vocaux.', '👥') }} - {{ bento_card('03', 'Résumés Mistral 7B', 'IA locale génère résumés, points d\'action et procès-verbaux. Aucune connexion cloud.', '📝') }} - {{ bento_card('04', 'Q&R sur enregistrement', 'Posez des questions à vos réunions. RAG local sur embeddings sentence-transformers.', '💬') }} - {{ bento_card('05', 'Exports multiples', 'DOCX, PDF, SRT, VTT, TXT, JSON, MD. Formats avocat, notaire, CPA.', '📄') }} - {{ bento_card('06', 'Intégrations', 'Word, Outlook, Teams, Notion, Obsidian, Zapier, Make, n8n.', '🔌') }} + {{ bento_card('01', 'Transcription WhisperX', 'Large-v3 fine-tuné FR-CA. Précision 95 %+ sur réunions, dictées, audiences (méthodologie disponible sur demande).', icon_microphone) }} + {{ bento_card('02', 'Diarisation 8 locuteurs', 'pyannote sépare automatiquement les intervenants. Identification par embeddings vocaux.', icon_users) }} + {{ bento_card('03', 'Résumés Mistral 7B', 'IA locale génère résumés, points d\'action et procès-verbaux. Aucune connexion cloud.', icon_document) }} + {{ bento_card('04', 'Q&R sur enregistrement', 'Posez des questions à vos réunions. RAG local sur embeddings sentence-transformers.', icon_chat) }} + {{ bento_card('05', 'Exports multiples', 'DOCX, PDF, SRT, VTT, TXT, JSON, MD. Formats avocat, notaire, CPA.', icon_export) }} + {{ bento_card('06', 'Intégrations', 'Word, Outlook, Teams, Notion, Obsidian, Zapier, Make, n8n.', icon_plug) }}
@@ -137,7 +144,7 @@

{% from 'macros/button.html' import button %} - {{ button('Pré-inscription par courriel', href='mailto:info@dictia.ca?subject=Pré-inscription%20DictIA', variant='primary', size='lg', icon='✉️') }} + {{ button('Pré-inscription par courriel', href='mailto:info@dictia.ca?subject=Pré-inscription%20DictIA', variant='primary', size='lg', icon='') }} {{ button('Voir les tarifs', href='/tarifs', variant='secondary', size='lg') }}
diff --git a/templates/marketing/landing.html b/templates/marketing/landing.html index 2de342b..381e978 100644 --- a/templates/marketing/landing.html +++ b/templates/marketing/landing.html @@ -20,7 +20,7 @@ {# Subtle grid overlay (FlexiHub signature) #}
- {# Horizontal accent line — gradient blue→cyan→transparent #} + {# Horizontal accent line — gradient blue to cyan to transparent #}
@@ -47,7 +47,7 @@
{% from 'macros/button.html' import button %} {{ button('Réserver une démo', href='/contact', variant='primary', size='lg') }} - {{ button('Voir les tarifs →', href='/tarifs', variant='ghost', size='lg') }} + {{ button('Voir les tarifs', href='/tarifs', variant='ghost', size='lg', icon='') }}
{# Social proof microcopy — defensible: refers to pre-launch waitlist + factual ordres pros count #} @@ -136,12 +136,15 @@ {# 3 problem cards on white surface — Cloud Act, Loi 25, Sanctions #}
{% for card in [ - ('Cloud Act', 'Loi américaine 2018', 'Microsoft, Google et OpenAI sont soumis au Cloud Act. Vos données peuvent être saisies par les autorités américaines sans votre consentement ni notification — y compris les enregistrements de vos réunions client.', '⚖️'), - ('Loi 25 — biométrie', 'Sanctions CAI jusqu\'à 25 M$', 'La voix est une donnée biométrique au sens des articles 44-45 de la LCCJTI et un renseignement sensible au sens de la Loi 25 (art. 12 LSP). Tout traitement nécessite un consentement explicite, une déclaration préalable à la CAI et un transfert vers un territoire offrant une protection équivalente — ce que les États-Unis n\'offrent pas.', '🛡️'), - ('Sanctions disciplinaires', '~250 000 pros réglementés QC (CIQ)', 'Les ordres professionnels québécois — au premier rang desquels le Barreau, la Chambre des notaires et CPA Québec — exigent une obligation stricte de confidentialité. Le transfert de données client hors-juridiction sans consentement explicite peut être qualifié de manquement, jusqu\'à la radiation pour les fautes graves.', '⚠️') + ('Cloud Act', 'Loi américaine 2018', 'Microsoft, Google et OpenAI sont soumis au Cloud Act. Vos données peuvent être saisies par les autorités américaines sans votre consentement ni notification — y compris les enregistrements de vos réunions client.', + ''), + ('Loi 25 — biométrie', 'Sanctions CAI jusqu\'à 25 M$', 'La voix est une donnée biométrique au sens des articles 44-45 de la LCCJTI et un renseignement sensible au sens de la Loi 25 (art. 12 LSP). Tout traitement nécessite un consentement explicite, une déclaration préalable à la CAI et un transfert vers un territoire offrant une protection équivalente — ce que les États-Unis n\'offrent pas.', + ''), + ('Sanctions disciplinaires', '~250 000 pros réglementés QC (CIQ)', 'Les ordres professionnels québécois — au premier rang desquels le Barreau, la Chambre des notaires et CPA Québec — exigent une obligation stricte de confidentialité. Le transfert de données client hors-juridiction sans consentement explicite peut être qualifié de manquement, jusqu\'à la radiation pour les fautes graves.', + '') ] %}
- +

{{ card[0] }}

{{ card[1] | safe }}

{{ card[2] | safe }}

@@ -176,7 +179,9 @@ ('Précision FR-CA', 'WhisperX Large-v3 fine-tuné français québécois. Diarisation pyannote 8 locuteurs. Résumés Mistral 7B local — aucune connexion OpenAI/Google/Microsoft.') ] %}
- +

{{ pillar[0] | safe }}

{{ pillar[1] | safe }}

@@ -196,15 +201,22 @@
{# NOTE: bento card content is duplicated between landing.html and fonctionnalites.html. - When editing, sync both files. Future refactor: extract to _partials/_bento_features.html. #} + When editing, sync both files. Future refactor: extract to _partials/_bento_features.html. + Icon SVGs (heroicons-style outline) are inlined directly because the macro renders `icon | safe`. #} {% from 'macros/bento.html' import bento_card %} + {%- set icon_microphone = '' -%} + {%- set icon_users = '' -%} + {%- set icon_document = '' -%} + {%- set icon_chat = '' -%} + {%- set icon_export = '' -%} + {%- set icon_plug = '' -%}
- {{ bento_card('01', 'Transcription WhisperX', 'Large-v3 fine-tuné FR-CA. Précision 95 %+ sur réunions, dictées, audiences (méthodologie disponible sur demande).', '🎙️') }} - {{ bento_card('02', 'Diarisation 8 locuteurs', 'pyannote sépare automatiquement les intervenants. Identification par embeddings vocaux.', '👥') }} - {{ bento_card('03', 'Résumés Mistral 7B', 'IA locale génère résumés, points d\'action et procès-verbaux. Aucune connexion cloud.', '📝') }} - {{ bento_card('04', 'Q&R sur enregistrement', 'Posez des questions à vos réunions. RAG local sur embeddings sentence-transformers.', '💬') }} - {{ bento_card('05', 'Exports multiples', 'DOCX, PDF, SRT, VTT, TXT, JSON, MD. Formats avocat, notaire, CPA.', '📄') }} - {{ bento_card('06', 'Intégrations', 'Word, Outlook, Teams, Notion, Obsidian, Zapier, Make, n8n.', '🔌') }} + {{ bento_card('01', 'Transcription WhisperX', 'Large-v3 fine-tuné FR-CA. Précision 95 %+ sur réunions, dictées, audiences (méthodologie disponible sur demande).', icon_microphone) }} + {{ bento_card('02', 'Diarisation 8 locuteurs', 'pyannote sépare automatiquement les intervenants. Identification par embeddings vocaux.', icon_users) }} + {{ bento_card('03', 'Résumés Mistral 7B', 'IA locale génère résumés, points d\'action et procès-verbaux. Aucune connexion cloud.', icon_document) }} + {{ bento_card('04', 'Q&R sur enregistrement', 'Posez des questions à vos réunions. RAG local sur embeddings sentence-transformers.', icon_chat) }} + {{ bento_card('05', 'Exports multiples', 'DOCX, PDF, SRT, VTT, TXT, JSON, MD. Formats avocat, notaire, CPA.', icon_export) }} + {{ bento_card('06', 'Intégrations', 'Word, Outlook, Teams, Notion, Obsidian, Zapier, Make, n8n.', icon_plug) }}
@@ -284,59 +296,82 @@ Whisper local (DIY) + {# Status SVGs — check (green), x (red), warning (amber). `aria-label` preserves the meaning for AT users. #} + {%- set svg_check = '' -%} + {%- set svg_x = '' -%} + {%- set svg_warn = '' -%} {% for row in [ { 'critere': 'Conforme Loi 25 sans transfert hors-Québec', - 'dictia': '✓ Hébergement OVH Beauharnois', - 'teams': '✗ Soumis Cloud Act (US)', - 'otter': '✗ Hébergement US', - 'whisper': '✓ Aucun transfert (local)' + 'dictia': {'status': 'check', 'text': 'Hébergement OVH Beauharnois'}, + 'teams': {'status': 'x', 'text': 'Soumis Cloud Act (US)'}, + 'otter': {'status': 'x', 'text': 'Hébergement US'}, + 'whisper':{'status': 'check', 'text': 'Aucun transfert (local)'} }, { 'critere': 'Souveraineté hors Cloud Act US', - 'dictia': '✓ Aucune exposition', - 'teams': '✗ Microsoft = entité US', - 'otter': '✗ Otter.ai Inc. = US', - 'whisper': '✓ Local' + 'dictia': {'status': 'check', 'text': 'Aucune exposition'}, + 'teams': {'status': 'x', 'text': 'Microsoft = entité US'}, + 'otter': {'status': 'x', 'text': 'Otter.ai Inc. = US'}, + 'whisper':{'status': 'check', 'text': 'Local'} }, { 'critere': 'WhisperX Large-v3 fine-tuné FR-CA', - 'dictia': '✓ FR-CA optimisé', - 'teams': '⚠ FR générique (FR-FR)', - 'otter': '✗ Anglais privilégié', - 'whisper': '⚠ FR générique de base' + 'dictia': {'status': 'check', 'text': 'FR-CA optimisé'}, + 'teams': {'status': 'warn', 'text': 'FR générique (FR-FR)'}, + 'otter': {'status': 'x', 'text': 'Anglais privilégié'}, + 'whisper':{'status': 'warn', 'text': 'FR générique de base'} }, { 'critere': 'Diarisation jusqu\'à 8 locuteurs (pyannote)', - 'dictia': '✓ Inclus par défaut', - 'teams': '⚠ Limité ~6 (Premium)', - 'otter': '⚠ Variable selon le forfait', - 'whisper': '✗ Non incluse' + 'dictia': {'status': 'check', 'text': 'Inclus par défaut'}, + 'teams': {'status': 'warn', 'text': 'Limité ~6 (Premium)'}, + 'otter': {'status': 'warn', 'text': 'Variable selon le forfait'}, + 'whisper':{'status': 'x', 'text': 'Non incluse'} }, { 'critere': 'Coût mensuel par utilisateur', - 'dictia': '0 $ (forfait fixe)', - 'teams': '~14 $ CAD (Premium)', - 'otter': '~20 $ US (Business)', - 'whisper': '0 $ (mais GPU + DevOps requis)' + 'dictia': {'status': None, 'text': '0 $ (forfait fixe)'}, + 'teams': {'status': None, 'text': '~14 $ CAD (Premium)'}, + 'otter': {'status': None, 'text': '~20 $ US (Business)'}, + 'whisper':{'status': None, 'text': '0 $ (mais GPU + DevOps requis)'} }, { 'critere': 'Audit trail intégré (Loi 25 art. 3.5)', - 'dictia': '✓ Inclus par défaut', - 'teams': '⚠ Via M365 Audit séparé', - 'otter': '⚠ Logs basiques seulement', - 'whisper': '✗ À développer soi-même' + 'dictia': {'status': 'check', 'text': 'Inclus par défaut'}, + 'teams': {'status': 'warn', 'text': 'Via M365 Audit séparé'}, + 'otter': {'status': 'warn', 'text': 'Logs basiques seulement'}, + 'whisper':{'status': 'x', 'text': 'À développer soi-même'} } ] %} + {%- set status_svg = {'check': svg_check, 'x': svg_x, 'warn': svg_warn} -%} {{ row.critere | safe }} - {{ row.dictia | safe }} + + {%- if row.dictia.status -%}{{ status_svg[row.dictia.status] | safe }}{%- endif -%} + {{ row.dictia.text | safe }} + + + + + {%- if row.teams.status -%}{{ status_svg[row.teams.status] | safe }}{%- endif -%} + {{ row.teams.text | safe }} + + + + + {%- if row.otter.status -%}{{ status_svg[row.otter.status] | safe }}{%- endif -%} + {{ row.otter.text | safe }} + + + + + {%- if row.whisper.status -%}{{ status_svg[row.whisper.status] | safe }}{%- endif -%} + {{ row.whisper.text | safe }} + - {{ row.teams | safe }} - {{ row.otter | safe }} - {{ row.whisper | safe }} {% endfor %} @@ -366,32 +401,37 @@

- {# 4 conformity pillars — dark cards with grad-bg icon corners (matches Solution pillars style) #} + {# 4 conformity pillars — dark cards with grad-bg icon corners (matches Solution pillars style). + Icons (heroicons-style outline): map-pin (Québec), scale (Loi 25), building-library (LGGRI), code-bracket (AGPL). #} + {%- set svg_pin = '' -%} + {%- set svg_scale = '' -%} + {%- set svg_building = '' -%} + {%- set svg_code = '' -%}
{% for card in [ { - 'icon': '🍁', + 'icon': svg_pin, 'title': 'Hébergement OVH Beauharnois', 'desc': 'Centre de données opéré par OVHcloud Canada en territoire québécois. Conformité documentée selon les services (ISO 27001, SOC 2 selon le périmètre). Détails sur demande.' }, { - 'icon': '⚖️', + 'icon': svg_scale, 'title': 'Mappé Loi 25 (LPRPSP)', 'desc': 'Audit trail art. 3.5, EFVP préparée art. 3.3, registre des consentements art. 14. Modèles de déclaration CAI fournis.' }, { - 'icon': '🏛️', + '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': '🔓', + 'icon': svg_code, 'title': 'Code source AGPL v3 vérifiable', 'desc': 'Architecture entièrement auditable sur Gitea public. Aucune boîte noire. Vos auditeurs peuvent examiner chaque ligne.' } ] %}
- +

{{ card.title | safe }}

{{ card.desc | safe }}

@@ -423,10 +463,13 @@ {% for t in testimonials %}
-