<?xml version="1.0" encoding="UTF-8"?><rss version="2.0"
	xmlns:content="http://purl.org/rss/1.0/modules/content/"
	xmlns:wfw="http://wellformedweb.org/CommentAPI/"
	xmlns:dc="http://purl.org/dc/elements/1.1/"
	xmlns:atom="http://www.w3.org/2005/Atom"
	xmlns:sy="http://purl.org/rss/1.0/modules/syndication/"
	xmlns:slash="http://purl.org/rss/1.0/modules/slash/"
	>

<channel>
	<title>Applications Archives - Présent Composé design</title>
	<atom:link href="https://presentcomposedesign.fr/category/applications/feed/" rel="self" type="application/rss+xml" />
	<link>https://presentcomposedesign.fr/category/applications/</link>
	<description>Direction Artistique, concepts &#38; innovations, Design 2D/3D/ia/AR/VR</description>
	<lastBuildDate>Wed, 07 Oct 2026 10:40:17 +0000</lastBuildDate>
	<language>fr-FR</language>
	<sy:updatePeriod>
	hourly	</sy:updatePeriod>
	<sy:updateFrequency>
	1	</sy:updateFrequency>
	<generator>https://wordpress.org/?v=7.1.3</generator>

<image>
	<url>https://presentcomposedesign.fr/wp-content/uploads/2025/07/cropped-logo_PCd_2025-512-32x32.png</url>
	<title>Applications Archives - Présent Composé design</title>
	<link>https://presentcomposedesign.fr/category/applications/</link>
	<width>32</width>
	<height>32</height>
</image> 
	<item>
		<title>StereoptiX</title>
		<link>https://presentcomposedesign.fr/stereoptix-infos/</link>
		
		<dc:creator><![CDATA[admin]]></dc:creator>
		<pubDate>Tue, 06 Oct 2026 21:21:03 +0000</pubDate>
				<category><![CDATA[[VR]]]></category>
		<category><![CDATA[Applications]]></category>
		<category><![CDATA[Design graphique]]></category>
		<guid isPermaLink="false">https://presentcomposedesign.fr/?p=36980</guid>

					<description><![CDATA[<p>Étude de cas &#183; Application web sur mesure StereoptiX Une application web qui transforme chaque photo en relief : anaglyphe rouge-cyan pour les lunettes 3D, côte à côte, ou wiggle, ce GIF animé qui se voit en relief sans rien sur le nez. La profondeur est calculée par une intelligence artificielle qui tourne dans le navigateur : aucune photo n&#8217;est envoyée. Imaginée, nommée, dessinée, développée et mise en ligne à Toulouse. Idéation Naming Identité graphique UX / UI IA embarquée WebGL Paiement en ligne Hébergement Voir l&#8217;application Demander un rendez-vous Le cœur de l&#8217;application Une photo, et le relief apparaît Un modèle d&#8217;intelligence artificielle estime, pour chaque pixel, ce qui est proche et ce qui est loin. L&#8217;application en tire deux points de vue, celui de l&#8217;œil gauche et celui de l&#8217;œil droit, puis les recompose selon le type de relief choisi. Essayez ci-dessous : la scène est calculée en direct dans cette page, avec les réglages de l&#8217;application. Calculé en direct StereoptiX Wiggle Rouge-cyan Dubois Côte à côte croisé Carte de profondeur Sans lunettes. Glissez sur l&#8217;image pour tourner autour de la scène. Pour la démonstration, la scène est dessinée en plans dont la profondeur est connue. Dans l&#8217;application, cette profondeur est déduite de votre photo : le relief d&#8217;une seule image est une reconstruction, pas une mesure. 1. CapterUne photo, deux photos décalées d&#8217;un pas, ou une vidéo de cinq secondes. Prises à la caméra ou importées. 2. Estimer la profondeurLe modèle Depth Anything V2, exécuté sur l&#8217;appareil, par sa carte graphique quand elle le permet. Aucun serveur. 3. RecomposerDeux vues calculées en WebGL2, puis l&#8217;un des dix types de relief, à enregistrer ou partager. Points clés Ce que j&#8217;ai réalisé Idéation, positionnement et naming de l&#8217;application Création du logo, de l&#8217;icône, de la signature des images et de l&#8217;identité graphique, en thème clair et sombre Conception de l&#8217;atelier et des parcours, pensés d&#8217;abord pour le téléphone Intelligence artificielle de profondeur exécutée dans le navigateur, et rendu de dix types de relief Prise de vue guidée à la caméra : une photo, deux photos ou une vidéo Modèle économique, paiement en ligne et licences signées, sans compte client Bibliothèque en ligne, sécurisation, mise en ligne et documentation Sans magasin d&#8217;applications Elle s&#8217;installe sur tous les téléphones, gratuitement StereoptiX est une application web. Elle s&#8217;ouvre dans un navigateur, puis s&#8217;installe d&#8217;un geste sur l&#8217;écran d&#8217;accueil ou le bureau, avec son icône. Aucun magasin d&#8217;applications, aucun compte, aucun abonnement. Une seule adresse, et le même atelier sur Android, sur iPhone, sur ordinateur. Gratuit Android iPhone et iPad Windows et macOS Ouvrir et installer 10types de relief 1photo suffit 0photo envoyée 559contrôles auto Prise de vue Une photo suffit. Deux font mieux. L&#8217;atelier a un seul départ, « Prendre 2 photos », et la caméra s&#8217;ouvre avec ses commandes posées sur l&#8217;image, comme dans un appareil photo. On y choisit entre trois prises, ou l&#8217;on importe une photo existante. Une photo Le modèle de profondeur devine ce qui est proche et ce qui est loin. Prise à la caméra ou importée : JPEG, PNG, WebP, AVIF, GIF, et HEIC sur Safari. Deux photos Un pas de côté entre les deux prises, et c&#8217;est le vrai relief de la scène. L&#8217;atelier guide le geste avec une image fantôme à superposer au sujet. Une vidéo Jusqu&#8217;à cinq secondes. Chaque image reçoit son relief, calculé sur l&#8217;appareil, et le tout s&#8217;enregistre en MP4, jusqu&#8217;en 1080p. le fond, plus lointain le sujet 1 2 6 à 7 cm 2 m La règle du trentième écart = distance du premier plan&#160;÷&#160;30 Pour un sujet à deux mètres, l&#8217;écart vaut 6&#160;à&#160;7&#160;cm, celui de vos yeux. Pour un paysage lointain, il monte à trente centimètres et plus. Entre les deux prises, l&#8217;appareil se décale sans tourner, et rien ne doit bouger. Dix sorties Dix façons de voir en relief Avec ou sans lunettes, pour un écran, une visionneuse ou un autre logiciel. L&#8217;anaglyphe conseillé applique les matrices calculées par Eric Dubois en lumière linéaire : les couleurs les plus justes, et le moins d&#8217;images fantômes à travers les filtres. Rouge-cyan DuboisLunettes rouge-cyanConseillé : les couleurs les plus justes et le moins d&#8217;images fantômes. WiggleSans lunettesUne animation qui balance entre les vues. S&#8217;exporte en GIF. Rouge-cyan couleurLunettes rouge-cyanCouleurs vives, mais les rouges francs scintillent d&#8217;un œil à l&#8217;autre. Rouge-cyan demi-couleurLunettes rouge-cyanUn bon compromis quand l&#8217;image contient beaucoup de rouge. Rouge-cyan grisLunettes rouge-cyanLe plus reposant pour les yeux, sans couleur. Rouge-vertLunettes rouge-vertPour les anciennes lunettes rouge-vert. Rouge-bleuLunettes rouge-bleuPour les lunettes rouge-bleu. GD Côte à côte parallèleCasque VR ou visionneuseVue gauche à gauche, pour un casque ou une visionneuse. DG Côte à côte croiséSans lunettes, en louchantLouchez jusqu&#8217;à voir une troisième image au milieu : elle est en relief. Carte de profondeurPour d&#8217;autres logicielsProche en blanc, loin en noir. Incliner le téléphone pour orienter les cartes Les dix sorties d&#8217;une même prise de vue, une route d&#8217;Occitanie. Chacune s&#8217;enregistre en PNG, JPEG ou WebP, le wiggle en GIF animé qui tourne en boucle, et la vidéo en MP4. Partagé, le GIF est allégé pour les messageries : 720&#160;pixels et 2&#160;Mo au plus, pour qu&#8217;il arrive animé. Modèle économique Le gratuit est un troc, pas un essai La formule gratuite n&#8217;expire pas et ne bride pas le relief : une photo, prise ou importée, les dix types de relief, l&#8217;enregistrement et le partage, sans compte. En échange, ce qui sort de l&#8217;atelier s&#8217;arrête au 720p, assez pour un écran ou une conversation, et porte une petite signature StereoptiX, celle que vous voyez en bas à gauche de la démonstration. Chaque image partagée fait ainsi connaître l&#8217;application : c&#8217;est elle qui paie la version gratuite. Les licences ouvrent le reste : deux photos pour le vrai relief d&#8217;une scène, la vidéo, la pleine définition sans signature, et avec Premium, une bibliothèque en ligne. Elles s&#8217;achètent une seule fois, sans abonnement et sans compte. Découverte 0 € pour toujours Tout le relief, sans compte et sans payer. Une photo, prise ou importée Les</p>
<p>Cet article <a href="https://presentcomposedesign.fr/stereoptix-infos/">StereoptiX</a> est apparu en premier sur <a href="https://presentcomposedesign.fr">Présent Composé design</a>.</p>
]]></description>
										<content:encoded><![CDATA[		<div data-elementor-type="wp-post" data-elementor-id="36980" class="elementor elementor-36980">
				<div class="elementor-element elementor-element-62b59ec e-con-full e-flex wpr-particle-no wpr-jarallax-no wpr-parallax-no wpr-sticky-section-no wpr-column-slider-no wpr-equal-height-no e-con e-parent" data-id="62b59ec" data-element_type="container" data-e-type="container">
				<div class="elementor-element elementor-element-1ac1979 elementor-widget elementor-widget-html" data-id="1ac1979" data-element_type="widget" data-e-type="widget" data-widget_type="html.default">
				<div class="elementor-widget-container">
					<!--
// StereoptiX, 3D & ANAGLYPH MODE for cameras, © All rights reserved.
// PCdlabs · Dev-Xprmnts · VR_Xprmnts · Present Compound Design     ║
// ║ Alban DESBARAX - Designer 360° / Creative Technologist         ║
// ║ Toulouse, FRANCE                                               ║
// ║                                                                ║
// ║   · Expertise & Support 2D, 3D, AR, VR, XR, AI                 ║
// ║   · Product Design & Industrial Design                         ║
// ║   · Digital communication                                      ║
// ║   · Immersive experiences  -ᯅ- ✔️                             ║
// ║                                                                ║                   
// · 🡺 https://presentcomposedesign.fr/      
//
//                                                       ++++++++++                                    
//                                                    =+++++++++===============                        
//                                                    +++++++++++++=====================+              
//                                                   ++++++++   *+++++=======================+*#       
//                                                    ==++++*          *++++==============*#%%%%       
//                                                     +==++=               *+======+*%%%%%%%%%%       
//       ==-===--=**+**                                                      @%%#%%%%%#-...=%%%%       
//      ==================+***                                          ##%%%%%%%%+:.......=%%%%       
//      =================------=+++***                           ##%#%%%%%%%%%%%%+::.......*%%%        
//      ====================-----------=+*++**             %%%%%%%%%%##%%%%%%%%%%=:::::::..#%%%        
//      -======     +=+==========-------------===+*   #%%%%%%%%#+==----=%%%%%%%%%=.......:#%%%@        
//       ----==            +======------------------=#%%%%%+=----------+%%%%%%%%%=..:+*%%%%%%          
//         ===+               ======----------------=#%%%%=------------#%%%%**%%%%%%%%%#+=             
//                              =======-------------=#%%%*=------------#%%%@  =*%%%***                 
//                                @+===---------=====#%%%*------------*%%%                             
//                                   +--------=======#%%%*------==*%%%%%%                              
//                                     =-----=======+#%%%#=-+#%%%%%%##%                                
//                                        ---=======+#%%%%%%%%###*#                                    
//                                               ===+##%%%%##@                                         
//                                                     +*                                              
//
// @@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@//*
// @@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@%#*++==------===**%%@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@
// @@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@#++-::::::::::::::::::::::-=*%@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@
// @@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@#+-::::::::::::::::::::::::::::::::=*%@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@
// @@@@@@@@@@@@@@@@@@@@@@@@@@@@#+::::::::::::::::::::::::::::::::::::::::=%@@@@@@@@@@@@@@@@@@@@@@@@@@@@
// @@@@@@@@@@@@@@@@@@@@@@@@@%+:::::::::::::::::=++***+=-::::::::::::::::::::=%@@@@@@@@@@@@@@@@@@@@@@@@@
// @@@@@@@@@@@@@@@@@@@@@@@#=::::::::::::::::+%@@@@@@@@@@%+-:::::::::::::::::::=#@@@@@@@@@@@@@@@@@@@@@@@
// @@@@@@@@@@@@@@@@@@@@@#-::::::::::::::::#@@@@@@@@@@@@@@@@%-:::::::::::::::::::=#@@@@@@@@@@@@@@@@@@@@@
// @@@@@@@@@@@@@@@@@@@%=::::::::::::::::*@@@@@@**==-=+##@@@@@*-:::::::::::::::::::=%@@@@@@@@@@@@@@@@@@@
// @@@@@@@@@@@@@@@@@=:::::::::::::::::%@@@@@+::::::::::-*@@@@#-::::::::::::::::::::=@@@@@@@@@@@@@@@@@@@
// @@@@@@@@@@@@@@@@#::::::::::::::::::%@@@@=::::::::::::::-%@@@#-:::::::::::::::::::::#@@@@@@@@@@@@@@@@
// @@@@@@@@@@@@@@@=::::::::::::::::::*@@@@=::::::::::::::::-%@@@*::::::::::::::::::::::=@@@@@@@@@@@@@@@
// @@@@@@@@@@@@@%-::::::::::::::::::-@@@@=::::::::::::::::::-%@@@-::::::::::::::::::::::-%@@@@@@@@@@@@@
// @@@@@@@@@@@@#::::::::::::::::::::*@@@#::::::::::::::::::::=@@@*::::::::::::::::::::::::*@@@@@@@@@@@@
// @@@@@@@@@@@#:::::::::::::::::::::%@@@+::::::::::::::::::::-@@@%:::::::::::::::::::::::::*@@@@@@@@@@@
// @@@@@@@@@@+::::::::::::::::::::::@@@@-:::::::::::::::::::::%@@@::::::::::::::::::::::::::*@@@@@@@@@@
// @@@@@@@@@*:::::::::::::::::::::::@@@@=:::::::::::::::::::::@@@@:::::::::::::::::::::::::::*@@@@@@@@@
// @@@@@@@@%::::::::::::::::::::::::@@@@*:::::::::::::::::::::@@@%::::::::::::::::::::::::::::*@@@@@@@@
// @@@@@@@%:::::::::::::::::::::::::@@@@%::::::::::::::::::::+@@@*:::::::::::::::::::::::::::::%@@@@@@@
// @@@@@@@::::::::::::::::::::::::::@@@@@*::::::::::::::::::-@@@@::::::::::::::::::::::::::::::-@@@@@@@
// @@@@@@=::::::::::::::::::::::::::@@@@@@*::::::::::::::::-@@@@+:::::::::::::::::::::::::::::::*@@@@@@
// @@@@@%:::::::::::::::::::::::::::@@@@@@@*::::::::::::::-%@@@#:::::::::::::::::::::::::::::::::*@@@@@
// @@@@@::::::::::::::::::::::::::::@@@@@@@@@*::::::::::+@@@@@*::::::::::::::::::::::::::::::::::-@@@@@
// @@@@*::::::::::::::::::::::::::::@@@#=@@@@@@%#*+=**%@@@@@@=::::::::::::::::::::::::::::::::::::*@@@@
// @@@@:::::::::::::::::::::::::::::@@@#::*@@@@@@@@@@@@@@@@*:::::::::::::::::::::::::::::::::::::::@@@@
// @@@*:::::::::::::::::::::::::::::@@@#::::=*@@@@@@@@@%#=:::::::::::::::::::::::::::::::::::::::::#@@@
// @@@=:::::::::::::::::::::::::::::@@@#::::::::-==+=-:::::::::::::::::::::::::::::::::::::::::::::=@@@
// @@@::::::::::::::::::::::::::::::@@@#:::::::::::::::::::::::::::::::::::::::::::::::::--:::::::::@@@
// @@*::::::::::::::::::::::::::::::@@@#:::::::::+######*:::::::::::::::::::::::::::::::+@=:::::::::#@@
// @@*::::::::::::::::::::::::::::::@@@#:::--::::===+*+==:::::=-:::::::=-::::::-::::::::+@=:::::::::+@@
// @@:::::::::::::::::::::::::::::::@@@#::+@#@@::-#@@%@%=::=@@@@+:::+@@@@@+-::@@@@%*-::#@@%#:::::::::@@
// @@:::::::::::::::::+*##%%#*=-::::@@@#::+@@=::-%@:::-*@=:%@-:=:::*@*:::-@*::@@-:=@%::=*@*=:::::::::@@
// @@::::::::::::::+%@@@@@@@@@@@%*-:@@@#::+@*:::*@@@@@@@@#:+@%*-:::@@@@@@@@@-:@%:::#@:::+@=::::::::::@@
// @%::::::::::::*@@@@@@@@@@@@@@@@@#+@@#::+@+:::+@=-------:::=%@*::@%-------::@%:::#@:::+@=::::::::::%@
// @%::::::::::-@@@@@@++-::::-=#@@@@@+*#::+@+:::-@%=-:+%%-:-=::#@::*@*-::+%=::@%:::#@:::+@=::::::::::#@
// @%:::::::::=@@@@%+::::::::::::#@@@@**::+@+::::-#@@@@%=::#@%%@+:::+@@@@@*:::@%:::#@:::+@=::::::::::%@
// @%::::::::-@@@@+:::::::::::::::-@@@@+:::-::::::::--:::::::=-:::::::-=-:::::--:::-=----=-::::::::::%@
// @@:::::::-@@@@*:::::::::::::::::-%%%*:::::::::::::::::::::::::::::::::::::::::::+%%%%%%#::::::::::@@
// @@:::::::*@@@#:::::::+#@%*-::::::=+*#*=+#*=-:::::+#%%#-::::::=#%%#=::::-#@@#-::::=##%#+-::::::::::@@
// @@-::::::@@@@-:::::-%@#+*%@*:::::%@#+#@@+*@*::::%@+==#@*::::%@#+=%@*-::%@-=*=:::*@*+=+@%-::::::::-@@
// @@+:::::-@@@@::::::#@=::::#@=::::%@::=@*::#@-::*@=::::-@+::*@*::::*@*::*@*-::::-@@####%@#::::::::*@@
// @@#:::::-@@@*::::::@@:::::=@*::::%@::=@*::#@-::%@::::::@*::%@-::::-@%:::=%@%-::*@#******+::::::::*@@
// @@@-::::-@@@%::::::#@+::::%@-::::%@::=@*::#@-::@@-::::=@-::*@*::::*@*:::-::@%::=@*::::-=-::::::::@@@
// @@@+:::::@@@@-::::::%@%*#@@+:::::%@::=@*::#@-::@@@#=+#@+::::*@%*+@@*:::#@*+@*:::*@%*+%@%::::::::-@@@
// @@@#:::::#@@@+:::::::=*##+-::::::+*::-*=::+*:::@%=*%#*-::::::=*%#*-:::::=*#+:::::-*##*=--=::::::*@@@
// @@@@-::::=@@@@-::::::::::::::::::=**+::::::::::@%:::::::::::::::::::::::-==++**##%%@@@@@@@-::::-@@@@
// @@@@*:::::*@@@@-::::::::::::::::+@@@#::::::::::::::::::::-==++**##=-#@@@@@@@@@@@@@@@@@@@@@=::::*@@@@
// @@@@@-:::::#@@@@+-:::::::::::::*@@@@::::::-==++--##%@@@@@@@@@#*#@@%%@@@@@@@@@@@#@@@@@*#@@@+:::-@@@@@
// @@@@@%::::::*@@@@@+-:::::::::+@@@@%:=@@@@@@@@@@==@@@**%@@@@*-#@*-@@*@@@*-+**@@@:%@@==@++@@*:::%@@@@@
// @@@@@@*::::::=@@@@@@@%%**##@@@@@@=::=@@@@#-:--=-=@@=+@+=@@@:%@@@=+@-*@*-@@@+:@@=#@:*@@%-@@#::+@@@@@@
// @@@@@@@-:::::::+%@@@@@@@@@@@@@@#-::::@@@+-%@@@*--@@:@@=*@@@%=*%@@@@*=@-*@@@*:+@=+=#@@@%:@@%:-@@@@@@@
// @@@@@@@@-::::::::=*%@@@@@@@##-:::::::@@@:#@@@@@*:@@:%==@@@@@@%+-%@@#-@*+@@@:+:@*:*@@@@@:%@@-@@@@@@@@
// @@@@@@@@#-:::::::::::::-:::::::::::::@@%:%@@@@@*-@@-#@@@#-@*%@@@-#@@:@@#=+:%@-#@:@@@@@@*=@@%@@@@@@@@
// @@@@@@@@@*:::::::::::::::::::::::::::#@@--@@@@%:*@@%*+*=*@@=+@@@=+@@-#@@@@@@@=#@#@@@@@@@@@@@@@@@@@@@
// @@@@@@@@@@*-:::::::::::::::::::::::::#@@@+-==-:#@@@@@@@@@@@@#++*#@@@@@@@#@@@%:@@@@@@@@@@@@@@@@@@@@@@
// @@@@@@@@@@@*-::::::::::::::::::::::::+@@@@@%%@@@@@@@@@@@@@@@@@@@@@@@@@@@@-=-:+**++==--::%@@@@@@@@@@@
// @@@@@@@@@@@@#-:::::::::::::::::::::::=@@@@@@@@@@@@@@@@@@@@@%%##**++=---::::::::::::::::%@@@@@@@@@@@@
// @@@@@@@@@@@@@@-::::::::::::::::::::::-@@@@@@%###**++=--::::::::::::::::::::::::::::::-%@@@@@@@@@@@@@
// @@@@@@@@@@@@@@@+::::::::::::::::::::::--::::::::::::::::::::::::::::::::::::::::::::+@@@@@@@@@@@@@@@
// @@@@@@@@@@@@@@@@%-::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::-%@@@@@@@@@@@@@@@@
// @@@@@@@@@@@@@@@@@@+-:::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::+@@@@@@@@@@@@@@@@@@
// @@@@@@@@@@@@@@@@@@@%=::::::::::::::::::::::::::::::::::::::::::::::::::::::::::+%@@@@@@@@@@@@@@@@@@@
// @@@@@@@@@@@@@@@@@@@@@%=::::::::::::::::::::::::::::::::::::::::::::::::::::::=%@@@@@@@@@@@@@@@@@@@@@
// @@@@@@@@@@@@@@@@@@@@@@@%=-:::::::::::::::::::::::::::::::::::::::::::::::::+%@@@@@@@@@@@@@@@@@@@@@@@
// @@@@@@@@@@@@@@@@@@@@@@@@@@*-:::::::::::::::::::::::::::::::::::::::::::::#@@@@@@@@@@@@@@@@@@@@@@@@@@
// @@@@@@@@@@@@@@@@@@@@@@@@@@@@%+-:::::::::::::::::::::::::::::::::::::::+%@@@@@@@@@@@@@@@@@@@@@@@@@@@@
// @@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@%*=-:::::::::::::::::::::::::::::::+#@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@
// @@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@%**=-:::::::::::::::::::::=+#@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@
// @@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@%%**++=====+++*##@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@
// @@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@#****+++++****##%@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@
// @@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@**+-::::::::::::::::::::==*#%@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@
// @@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@*+-::::::::::::::::::::::::::::::==#%@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@
// @@@@@@@@@@@@@@@@@@@@@@@@@@@@@#+-::::::::::::::::::::::::::::::::::::::=*%@@@@@@@@@@@@@@@@@@@@@@@@@@@
// @@@@@@@@@@@@@@@@@@@@@@@@@@@*-::::::::::::::::::::::::::::::::::::::::::::=*%@@@@@@@@@@@@@@@@@@@@@@@@
// @@@@@@@@@@@@@@@@@@@@@@@@#+:::::::::::::::++****%%@@@@@%%##**=--:::::::::::::=#@@@@@@@@@@@@@@@@@@@@@@
// @@@@@@@@@@@@@@@@@@@@@@*=:::::::::::::+*%@@@@@@@@@@@@@@@@@@@@@@@#*=-:::::::::::=#@@@@@@@@@@@@@@@@@@@@
// @@@@@@@@@@@@@@@@@@@@#=:::::::::::+*%@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@#=-::::::::::=#@@@@@@@@@@@@@@@@@@
// @@@@@@@@@@@@@@@@@%=::::::::::+%@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@*=::::::::::=%@@@@@@@@@@@@@@@@@
// @@@@@@@@@@@@@@@@*::::::::::*%@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@#+-:::::::::*%@@@@@@@@@@@@@@@
// @@@@@@@@@@@@@@%=::::::::=*@@@@@@@@@@@@@@%#*********#%%@@@@@@@@@@@@@@@@@@@%+-::::::::=%@@@@@@@@@@@@@@
// @@@@@@@@@@@@@#:::::::::#@@@@@@@@@@@**+-::::::::::::::::-+#%@%@@@@@@@@@@@@@@%+-::::::::*@@@@@@@@@@@@@
// @@@@@@@@@@@@+::::::::+@@@@@@@@@@*-::::::::::::::::::::::#@@@##%%@@@@@@@@@@@@@@+::::::::*%@@@@@@@@@@@
// @@@@@@@@@@@=:::::::=#@@@@@@@@@+::::::::::::::::::::::::-*@@@@@@#%%@@@@@@@@@@@@@*-:::::::=%@@@@@@@@@@
// @@@@@@@@@@=:::::::*@@@@@@@@@%=::::::::::::::::::::::::::*@@@@@@@@##%@@@@@@@@@@@@%+:::::::=%@@@@@@@@@
// @@@@@@@@@%=:::::::#@@@@@@@@@%:::::::::::::::::::::::::::+@@@@@@@@@@@%%@@@@@@@@@@@@@*-::::::-%@@@@@@@
// @@@@@@@@@=::::::-#@@@@@@@@@%-:::::::::::::::::::::::::==#@@@@@@@@@@@@%#@@@@@@@@@@@@@#-::::::=%@@@@@@
// @@@@@@@@=::::::-%@@@@@@@@@@=:::::::::::::::::::::::::*=#%@@@@@@@@@@@@@%#@@@@@@@@@@@@@#-::::::*@@@@@@
// @@@@@@@*::::::-#@@@@@@@@@@*::::::::::::::::::::::::*=#+%@@@%@@@@@@@@@@@%%@@@@@@@@@@@@@%-::::::*@@@@@
// @@@@@@%:::::::#@@@@@@@@@@%:::::::::::::::::::---:::-:-+*@%%@@@@@@@@@@@@@*%@@@@@@@@@@@@@%-::::::%@@@@
// @@@@@@-::::::#@@@@@@@@@@@-::::::::::::::::::::+=#-=#*#=+%%@@@@@@@@@@@@@@@%@@@@@@@@@@@@@@#-:::::-%@@@
// @@@@@*::::::*@@@@@@@@@@@#:::::::::::::::::::::-++=#==#+-%%%@@@@@@@@@@@@@@%@@@@@@@@@@@@@@@*::::::*@@@
// @@@@%::::::-@@@@@@@@@@@@=::::::::::::::::::::::::+=++#%=%*@@@@@@@@@@@@@@@@*@@@@@@@@@@@@@@@-::::::%@@
// @@@@*::::::#@@@@@@@@@@@%:::::::::::::::::::::::::+#:+@%+%@@@@@@@@@@@@@@@@@@#@@@@@@@@@@@@@@%-:::::*@@
// @@@%::::::=@@@@@@@@@@@@*::::::::::::::::::::::::-#*-#+=@@%@%@@@@@@@@@@@@@@@#@@@@@@@@@@@@@@@*::::::%@
// @@@*::::::%@@@@@@@@@@@@=:::::::::::::::::::::::+=#@++=+%@@@@@@@@@@@@@@#@@@+-%@@@@@@@@@@@@@@@-:::::*@
// @@::::::*@@@@@@@@@@@@@-:::::::::::::::::::::::-**+@+*=%@%@@@@@@@@@@@#@@%=::*@@@@@@@@@@@@@@@*::::::%@
// @%::::::#@@@@@@@@@@@@@::::::::::::::::::::::::::==#@%+@%+*%%@@@@@@@#==+::=-#@@@@@@@@@@@@@@@#::::::*@
// @*:::::-@@@@@@@@@@@@@@::::::::::::::::::::::::::::***%-@*@%%@@@@@@@%%=+*%%%@@@@@@@@@@@@@@@@@-:::::+@
// @=:::::*@@@@@@@@@@@@@@-::::::::::::::::::::::::::-+@+=+*%*%@@@@@@@%@@@%*=:*@@@@@@@@@@@@@@@@@+:::::=@
// %::::::*@@@@@@@@@@@@@@*::::::::::::::::::::::-=-=+#**#=%+@@*@@@@@@@@@@@+=**%@@@@@@@@@@@@@@@@#::::::%
// %::::::%@@@@@@@@@@@@@@#:::::::::::::::::::+#@++@%@@#*+*+#=@@@@@@@@@@@@@@*%@#%@@@@@@@@@@@@@@@#::::::#
// *::::::@@@@@@@@@@@@@@@@-:::::::::::::::::*@@@:::%@@@@*---**@@@@@@@@@@@@@@@@@@%@@@@@@@@@@@@@@%::::::*
// *::::::@@@@@@@@@@@@@@@@+:::::::::::::::::@@@@%::*@@@@@+-:=%+@@@@@@@@@@@@@@@@@@%@@@@@@@@@@@@@@::::::*
// *:::::-@@@@@@@@@@@@@@@@#:::::::::::::::::%=%@@-:+@@@@@*::%*@@@@@@@@@@@@@@@@@@@@%@@@@@@@@@@@@@-:::::*  
// *:::::=@@@@@@@@@@@@@@@@@+::::::::::::::::*:-@*::*-*@@@@-:-=%@%@@@@@@@@@@@@@@@@@#@@@@@@@@@@@@@::::::*
// *:::::-@@@@@@@@@@@@@@@@@%-:::::::::::::::*+:%@@:::-@@@@-:=+%%@%@@@@@@@@@@@*@@@@@@@@@@@@@@@@@@::::::*
// *::::::%@@@@@@@@@@@@@@@@@*::::::::::::::::*=-@*::::%@@@+:+*@@@%@@@@@@@@@@@%@@%#@@@@@@@@@@@@@%::::::*
// #::::::%@@@@@@@@@@@@@@@@@%-::::::::::::::::#+**:::::%@@*:-=%@*@@@@@@@@@@@#**%@@@@@@@@@@@@@@@%::::::#
// @::::::*@@@@@@@@@@@@@@@@@@*::::::::::::::::-%@@@@@**@@%=::=+@@@@@%@@@@@@@@@%@@@@@@@@@@@@@@@@*::::::@
// @-:::::*@@@@@@@@@@@@@@@@@@@=:::::::::::::::::#@@@@@@@@%:::+=%@@@@@@@@@@@@@@@%@@@@@@@@@@@@@@@*:::::-@
// @+:::::=@@@@@@@@@@@@@@@@@@@%-:::::::::::::::::*%@@@*%@-:::-*=*%@@@@@@@@@@@@@%@@@@@@@@@@@@@@@::::::*@
// @*::::::%@@@@@@@@@@@@@@@@@@@*:::::::::::::::::::=%%+#@=:::=*++@@@@@@@@@@@@@#@@@@@@@@@@@@@@@%::::::*@
// @@-:::::*@@@@@@@@@@@@@@@@@@@#::::::::::::::::----:=###::::=**%%@@@@@@@@@@@+%@@@@@@@@@@@@@@@@+:::::-@
// @@+:::::-%@@@@@@@@@@@@@@@@@@@-:::::::::::::=@@@@@+::::::::-*#%%%@@@@@@@@@%*%@@@@@@@@@@@@@@%::::::*@@
// @@#::::::*@@@@@@@@@@@@@@@@@@@+::::::::::::::%@@@@@-:::::::+%@%%%@@@@@@@@@%@@@@@@@@@@@@@@@@+::::::%@@
// @@@+::::::%@@@@@@@@@@@@@@@@@@*::::::::::::::*@@@@@-:::::::-+#@%%@%@@@@@@@%@@@@@@@@@@@@@@@%::::::=@@@
// @@@%-:::::*@@@@@@@@@@@@@@@@@@*::::::::::::::#@@@@@::::::::::*@%**%@@@@@@@#@@@@@@@@@@@@@@@=::::::%@@@
// @@@@*::::::%@@@@@@@@@@@@@@@@@*::::::::::::::*@@@@@#-::::::::===+-%%@@@@@@%%@@@@@@@@@@@@@*::::::*@@@@
// @@@@@-:::::-%@@@@@@@@@@@@@@@@+::::::::::::::=#%@@@@*--#=::::::--:=@@%%%@@%@@@@@@@@@@@@@#::::::-@@@@@
// @@@@@#-:::::-%@@@@@@@@@@@@@@@=::::::::::::::==@%@%%%#+%%*:::::::-=#%%*%@#*@@@@@@@@@@@@%:::::::#@@@@@
// @@@@@@*::::::*%@@@@@@@@@@**+-:::::::::::::::@#@@%@@@%#%@*::::-::::==::%%*@@@@@@@@@@@@%=::::::*@@@@@@
// @@@@@@@+::::::*@@@@@@@@*::::::::::::::::::-##%%@#@@@@%%%*-==*%:-::==+**@@@@@@@@@@@@@%=::::::=@@@@@@@
// @@@@@@@@-::::::*%@@@@*::::::::::::::::::::::%%%%%@@@@@@@#%@@%%@@@@@@@@@@@@@@@@@@@@@%=::::::=@@@@@@@@
// @@@@@@@@%-::::::=%@@%:::::::::::::::::::::#@%%@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@#:::::::-@@@@@@@@@
// @@@@@@@@@@-::::::-%@#::::::::::::::::::::+@@@@@%@@@@@@@@@@@%%@@@@@@@@@@@@@@@@@@@@*:::::::=@@@@@@@@@@
// @@@@@@@@@@@-:::::::*@-:::::::::::::::::::-%@@@@@@@@@@@@@@@@*@@@@@@@@@@@@@@@@@@@@=:::::::=@@@@@@@@@@@
// @@@@@@@@@@@@+:::::::==:::::::::::::::::::-%@@@@@@@@@@@@@@@%@@@@@@@@@@@@@@@@@@@#-:::::::+@@@@@@@@@@@@
// @@@@@@@@@@@@@*-:::::::::::::::::::::::::::=@@@@@@@@@@@@@@%#@@@@@@@@@@@@@@@@@%=::::::::#@@@@@@@@@@@@@
// @@@@@@@@@@@@@@#-:::::::::::::::::::::::::::*@@@@@@@@@@@@#@@@@@@@@@@@@@@@@@@+::::::::=#@@@@@@@@@@@@@@
// @@@@@@@@@@@@@@@@*-::::::::::::::::::::::::::*%@@@@@@@@@@*@@@@@@@@@@@@@@@@+:::::::::*@@@@@@@@@@@@@@@@
// @@@@@@@@@@@@@@@@@%=:::::::::::::::::::::::::::*%@@@@@@@@#@@@@@@@@@@@@@*=:::::::::=%@@@@@@@@@@@@@@@@@
// @@@@@@@@@@@@@@@@@@@#-:::::::::::::::::::::::::::*%@@@@@@@%#@@@@@@@@*+-:::::::::=#@@@@@@@@@@@@@@@@@@@
// @@@@@@@@@@@@@@@@@@@@@#-:::::::::::::::::::::::::::*%@@@@@@@%@@@@*+:::::::::::=#@@@@@@@@@@@@@@@@@@@@@
// @@@@@@@@@@@@@@@@@@@@@@@@#=-::::::::::::::::::::::::::+%@@@@%**--::::::::::::+#@@@@@@@@@@@@@@@@@@@@@@
// @@@@@@@@@@@@@@@@@@@@@@@@@@%*-:::::::::::::::::::::::::::::::::::::::::::::*%@@@@@@@@@@@@@@@@@@@@@@@@
// @@@@@@@@@@@@@@@@@@@@@@@@@@@@#*-:::::::::::::::::::::::::::::::::::::::+%@@@@@@@@@@@@@@@@@@@@@@@@@@@@
// @@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@##=-:::::::::::::::::::::::::::::::+*%@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@
// @@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@##*=-::::::::::::::::::::-+**%@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@
// @@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@%##****+++++****%%@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@
// @@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@
// @@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@
-->

<!--
  ============================================================================
  STEREOPTIX · ETUDE DE CAS
  Bloc HTML personnalise Elementor, pour https://presentcomposedesign.fr/stereoptix-infos/

  A COLLER TEL QUEL dans un widget "HTML" d'Elementor. Le bloc est autonome :
  styles et scripts vivent dedans et sont tous prefixes "sxa-", de sorte qu'ils
  ne peuvent ni deborder sur le theme ni en recevoir.

  RIEN N'EST A REMPLIR. Le signe, les declinaisons du logo et la
  demonstration sont dessines ici meme, en SVG et en canvas. Les images
  viennent du serveur de l'application, dossier assets/img :
    - l'en-tete, Header-stereoptix-wiggle-2026-10-07.gif ;
    - les dix sorties d'une meme prise de vue, route-d'occitanie-stereoptix-*.
  Une image absente laisse voir le schema de la carte, jamais un cadre vide.
  Elles s'affichent depuis presentcomposedesign.fr parce que le serveur de
  l'application n'envoie pas d'en-tete Cross-Origin-Resource-Policy : en
  ajouter un un jour (same-origin) les ferait disparaitre de cette page.

  LA DEMONSTRATION n'est pas une video. C'est une scene dessinee en plans
  successifs, chacun a sa profondeur, dont le script tire les memes sorties
  que l'application : le wiggle a la cadence du GIF exporte, l'anaglyphe
  rouge-cyan avec les matrices de Dubois appliquees en lumiere lineaire,
  le cote a cote croise et la carte de profondeur. Sans script, une image
  fixe de la meme scene prend sa place : la page reste entiere.

  Le second bloc (fiche de faits, questions frequentes, donnees structurees)
  est dans stereoptix-infos-seo-geo.html, a placer JUSTE SOUS celui-ci.
  ============================================================================
-->

<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+Tight:wght@300;400;500;600;700;800&display=swap" rel="stylesheet">

<style>
/* ===========================================================================
   Tout est enferme sous #sxa. Aucune regle ne vise un selecteur global : un
   bloc insere dans un theme ne doit jamais pouvoir repeindre ce qui l'entoure.
   =========================================================================== */
#sxa {
  --sxa-blue: #1001ef;
  --sxa-soft: #eeecff;
  --sxa-ink: #0d1020;
  --sxa-mid: #5d6479;
  --sxa-line: #e4e6f0;
  --sxa-wash: #f7f8fc;
  --sxa-night: #12141f;
  /* Les couleurs du produit, recopiees de l'application (base.css). */
  --sxa-red: #ff2d55;
  --sxa-cyan: #00d4ff;
  --sxa-violet: #9b5cff;
  --sxa-cyan-text: #3fdcff;
  --sxa-tile: #0b0c10;

  box-sizing: border-box;
  margin: 0; padding: 0;
  font-family: "Inter Tight", "Helvetica Neue", Arial, system-ui, sans-serif;
  color: var(--sxa-ink); background: #fff;
  line-height: 1.5;
  -webkit-font-smoothing: antialiased;
}
#sxa *, #sxa *::before, #sxa *::after { box-sizing: border-box; }
#sxa p, #sxa h1, #sxa h2, #sxa h3, #sxa ul, #sxa li, #sxa figure { margin: 0; }
/* Un theme vise souvent les balises elles-memes (« h2 { font-family } »,
   « p { line-height: 2 } », « ul li { list-style } ») : une telle regle bat
   l'heritage. Chaque propriete qu'un theme aime poser est donc reprise ici,
   sur les balises, et les classes du bloc l'emportent ensuite. */
#sxa h1, #sxa h2, #sxa h3, #sxa p, #sxa li, #sxa figcaption, #sxa button, #sxa strong, #sxa em, #sxa b {
  font-family: inherit; color: inherit; text-transform: none;
}
#sxa p, #sxa li { font-size: inherit; line-height: 1.5; }
#sxa ul, #sxa li { padding: 0; list-style: none; }
#sxa img { border: 0; border-radius: 0; box-shadow: none; height: auto; }
#sxa img, #sxa svg, #sxa canvas { max-width: 100%; display: block; }
#sxa [hidden] { display: none; }
#sxa a { color: inherit; text-decoration: none; }
#sxa button { font-family: inherit; }

#sxa .sxa-wrap { width: 100%; max-width: 1060px; margin: 0 auto; padding: 0 20px; }

/* ------------------------------------------------------------------ en-tete
   Le GIF des lunettes, a sa taille native au plus (1080 px) : agrandi, il
   deviendrait flou. Sur un grand ecran, les bords sont remplis par le meme
   GIF, flou et etire, plutot que par un aplat qui ferait cadre. */
#sxa .sxa-banner { position: relative; overflow: hidden; background: #e7e6e3; }
#sxa .sxa-banner-fill {
  position: absolute; inset: -40px; width: calc(100% + 80px); max-width: none; height: calc(100% + 80px);
  object-fit: cover; filter: blur(30px) saturate(.85); opacity: .9;
}
#sxa .sxa-banner-img { position: relative; display: block; width: 100%; max-width: 1080px; height: auto; margin: 0 auto; }
/* Plus large que le GIF, l'ecran montrerait la couture entre l'image nette et
   son remplissage flou : les bords de l'image s'y fondent. */
@media (min-width: 1100px) {
  #sxa .sxa-banner-img {
    -webkit-mask-image: linear-gradient(90deg, transparent, #000 7%, #000 93%, transparent);
            mask-image: linear-gradient(90deg, transparent, #000 7%, #000 93%, transparent);
  }
}
#sxa .sxa-sec { padding: 76px 0; position: relative; overflow: hidden; }
#sxa .sxa-sec--wash { background: var(--sxa-wash); }
#sxa .sxa-sec--night { background: var(--sxa-night); color: #eef0f8; }

/* --------------------------------------------------------------- typographie */
#sxa .sxa-kicker {
  display: inline-flex; align-items: center; gap: 8px;
  font-size: 11.5px; font-weight: 700; letter-spacing: .16em; text-transform: uppercase;
  color: var(--sxa-blue); margin-bottom: 14px;
}
#sxa .sxa-kicker::before { content: ""; width: 24px; height: 2px; background: currentColor; }
/* Sur fond sombre, le bleu de marque devient illisible : le cyan de
   l'application prend le relais, celui de ses propres textes d'accent. */
#sxa .sxa-sec--night .sxa-kicker { color: var(--sxa-cyan-text); }
#sxa h1.sxa-h1 { font-size: clamp(2.6rem, 7vw, 4.6rem); font-weight: 800; line-height: .98; letter-spacing: -.04em; }
#sxa h2.sxa-h2 { font-size: clamp(1.55rem, 3.4vw, 2.3rem); font-weight: 800; line-height: 1.1; letter-spacing: -.03em; margin-bottom: 14px; }
#sxa .sxa-sec--night h2.sxa-h2 { color: #fff; }
#sxa h3.sxa-h3 { font-size: 1.05rem; font-weight: 700; letter-spacing: -.015em; margin-bottom: 6px; }
#sxa .sxa-lede { font-size: clamp(1.05rem, 2vw, 1.25rem); color: var(--sxa-mid); max-width: 58ch; }
#sxa .sxa-p { color: var(--sxa-mid); font-size: 15px; max-width: 62ch; }
#sxa .sxa-p + .sxa-p { margin-top: 10px; }
#sxa .sxa-sec--night .sxa-p, #sxa .sxa-sec--night .sxa-lede { color: #aeb5cb; }
#sxa .sxa-p strong, #sxa .sxa-lede strong { color: var(--sxa-ink); font-weight: 700; }
#sxa .sxa-sec--night .sxa-p strong { color: #fff; }
#sxa .sxa-p a, #sxa .sxa-cap a { color: var(--sxa-blue); font-weight: 600; text-decoration: underline; text-underline-offset: 3px; }
#sxa .sxa-sec--night .sxa-p a, #sxa .sxa-sec--night .sxa-cap a { color: var(--sxa-cyan-text); }

/* ---------------------------------------------------------- titre en relief
   Le procede de l'application, a l'identique : les couches rouge et cyan sont
   dessinees par le CSS (attr(data-text)), DERRIERE le texte, et se melent comme
   des encres sur fond clair (multiply). Ecrites en vraies balises, elles
   feraient lire « StereoptiX StereoptiX StereoptiX » a un moteur de recherche. */
#sxa .sxa-relief { position: relative; display: inline-block; isolation: isolate; }
#sxa .sxa-relief::before,
#sxa .sxa-relief::after {
  content: attr(data-text); position: absolute; inset: 0; z-index: -1;
  mix-blend-mode: multiply; pointer-events: none;
  transition: transform 1.1s cubic-bezier(.2,.8,.2,1) .55s;
}
#sxa .sxa-relief::before { color: var(--sxa-red); transform: translateX(-.05em); }
#sxa .sxa-relief::after { color: var(--sxa-cyan); transform: translateX(.05em); }
#sxa.sxa-js .sxa-relief::before, #sxa.sxa-js .sxa-relief::after { transform: none; }
#sxa.sxa-js .sxa-in .sxa-relief::before { transform: translateX(-.05em); }
#sxa.sxa-js .sxa-in .sxa-relief::after { transform: translateX(.05em); }

/* ---------------------------------------------------------------------- hero */
#sxa .sxa-hero {
  position: relative; overflow: hidden; padding: 92px 0 68px;
  background:
    radial-gradient(900px 460px at 82% -8%, rgba(0,212,255,.14), transparent 60%),
    radial-gradient(760px 420px at 0% 110%, rgba(255,45,85,.11), transparent 58%),
    #fff;
}
#sxa .sxa-hero-grid { display: grid; gap: 40px; align-items: center; grid-template-columns: minmax(0,1.2fr) minmax(0,.8fr); }
#sxa .sxa-mark { width: min(280px, 72%); margin-inline: auto; }
#sxa .sxa-mark svg { width: 100%; filter: drop-shadow(0 26px 46px rgba(11,12,16,.28)); }

/* Les deux disques : ils arrivent confondus, se separent, puis se rejoignent
   de temps en temps, comme pendant le chargement de l'atelier. Sans script,
   ils restent a leur place definitive. Les decalages sont en unites du
   dessin (512), que le CSS lit comme des pixels sur un element SVG. */
#sxa.sxa-js .sxa-in .sxa-disc-r { animation: sxa-join-r 8s cubic-bezier(.45,0,.2,1) .35s infinite both; }
#sxa.sxa-js .sxa-in .sxa-disc-c { animation: sxa-join-c 8s cubic-bezier(.45,0,.2,1) .35s infinite both; }
@keyframes sxa-join-r { 0% { transform: translateX(50px); } 16%, 78% { transform: none; } 92%, 100% { transform: translateX(50px); } }
@keyframes sxa-join-c { 0% { transform: translateX(-50px); } 16%, 78% { transform: none; } 92%, 100% { transform: translateX(-50px); } }

#sxa .sxa-tags { display: flex; flex-wrap: wrap; gap: 7px; margin-top: 22px; }
#sxa .sxa-tag {
  font-size: 12px; font-weight: 600; padding: 6px 12px; border-radius: 999px;
  border: 1px solid var(--sxa-line); background: #fff; color: var(--sxa-mid);
}
#sxa .sxa-tag--on { background: var(--sxa-blue); border-color: var(--sxa-blue); color: #fff; }

/* ------------------------------------------------------------------- boutons */
#sxa .sxa-cta { display: flex; flex-wrap: wrap; gap: 10px; margin-top: 26px; }
#sxa .sxa-btn {
  display: inline-flex; align-items: center; gap: 8px;
  padding: 13px 22px; border-radius: 13px; font-weight: 700; font-size: 14.5px;
  border: 1px solid var(--sxa-blue); background: var(--sxa-blue); color: #fff;
  transition: transform .16s ease, box-shadow .16s ease, background .16s ease;
}
#sxa .sxa-btn:hover { transform: translateY(-2px); box-shadow: 0 14px 28px rgba(16,1,239,.3); }
#sxa .sxa-btn--ghost { background: transparent; color: var(--sxa-blue); }
#sxa .sxa-btn--ghost:hover { background: var(--sxa-soft); box-shadow: none; }
#sxa .sxa-sec--night .sxa-btn--ghost { color: #bfefff; border-color: rgba(63,220,255,.45); }
#sxa .sxa-sec--night .sxa-btn--ghost:hover { background: rgba(63,220,255,.12); }

/* =========================================================================
   DEMONSTRATION
   ========================================================================= */
#sxa .sxa-demo {
  position: relative; border-radius: 18px; overflow: hidden; margin-top: 26px;
  border: 1px solid rgba(255,255,255,.12); background: #121433;
  aspect-ratio: 16 / 9; container-type: inline-size;
  touch-action: pan-y; cursor: ew-resize;
}
#sxa .sxa-demo canvas, #sxa .sxa-demo-fond {
  position: absolute; inset: 0; width: 100%; height: 100%; display: block;
}
#sxa .sxa-demo-fond { object-fit: cover; }
#sxa .sxa-demo-legend {
  position: absolute; left: 14px; top: 12px; display: flex; gap: 8px; align-items: center;
  font-size: 11px; font-weight: 700; letter-spacing: .12em; text-transform: uppercase; color: #fff;
  pointer-events: none; text-shadow: 0 1px 6px rgba(11,12,16,.7);
}
#sxa .sxa-demo-legend i {
  width: 7px; height: 7px; border-radius: 50%; background: var(--sxa-cyan);
  animation: sxa-pulse 1.8s ease-out infinite;
}
@keyframes sxa-pulse {
  0% { box-shadow: 0 0 0 0 rgba(0,212,255,.55); }
  70% { box-shadow: 0 0 0 10px rgba(0,212,255,0); }
  100% { box-shadow: 0 0 0 0 rgba(0,212,255,0); }
}
/* La signature des versions gratuites, comme dans l'apercu de l'atelier : en
   bas a gauche, disques et nom, a 4,5 % du petit cote de l'image. Pour une
   image en 16/9, le petit cote vaut 56,25 % de la largeur, d'ou 2,53cqw. */
#sxa .sxa-stamp {
  position: absolute; left: 2.2cqw; bottom: 1.8cqw;
  display: inline-flex; align-items: center; gap: .32em;
  font-size: max(11px, 2.53cqw); font-weight: 800; line-height: 1; color: #fff;
  /* Double ombre : la carte de profondeur est blanche au premier plan, et le
     nom s'y effacait. */
  text-shadow: 0 1px 3px rgba(11,12,16,.7), 0 0 10px rgba(11,12,16,.55); pointer-events: none;
}
#sxa .sxa-stamp svg { width: 1.45em; height: 1em; }

#sxa .sxa-modes { display: none; }
#sxa.sxa-js .sxa-modes { display: flex; flex-wrap: wrap; gap: 8px; margin-top: 14px; }
#sxa .sxa-mode {
  appearance: none; cursor: pointer;
  font-size: 13px; font-weight: 700; padding: 9px 15px; border-radius: 999px;
  border: 1px solid rgba(255,255,255,.18); background: rgba(255,255,255,.05); color: #d6dbea;
  transition: background .18s ease, border-color .18s ease, color .18s ease;
}
#sxa .sxa-mode:hover { border-color: rgba(63,220,255,.5); color: #fff; }
#sxa .sxa-mode[aria-pressed="true"] {
  color: #0b0c10; border-color: transparent;
  background: linear-gradient(100deg, #ff6b88, #c9a2ff 50%, #5fe3ff);
}
#sxa .sxa-cap { font-size: 12.5px; color: var(--sxa-mid); margin-top: 10px; font-style: italic; max-width: 74ch; }
#sxa .sxa-sec--night .sxa-cap { color: #8b92a8; }
#sxa .sxa-hint { font-size: 14px; font-weight: 600; color: #dfe3f0; margin-top: 12px; min-height: 1.5em; }
#sxa .sxa-hint { display: none; }
#sxa.sxa-js .sxa-hint { display: block; }

#sxa .sxa-chain { display: grid; grid-template-columns: repeat(3, minmax(0,1fr)); gap: 12px; margin-top: 22px; }
#sxa .sxa-chain div {
  border: 1px solid rgba(255,255,255,.12); border-radius: 14px; padding: 16px;
  background: rgba(255,255,255,.04);
}
#sxa .sxa-chain b { display: block; font-size: 13px; color: #fff; font-weight: 700; margin-bottom: 4px; }
#sxa .sxa-chain span { font-size: 12.5px; color: #aeb5cb; }
#sxa .sxa-chain a { color: var(--sxa-cyan-text); font-weight: 600; }

/* --------------------------------------------------------------- points cles */
#sxa .sxa-keys { display: grid; gap: 10px; margin-top: 8px; }
#sxa .sxa-keys li {
  display: flex; gap: 12px; align-items: flex-start;
  font-size: 15.5px; font-weight: 600; color: var(--sxa-ink);
  padding: 13px 16px; border: 1px solid var(--sxa-line); border-radius: 13px; background: #fff;
  transition: transform .2s ease, border-color .2s ease, box-shadow .2s ease;
}
#sxa .sxa-keys li:hover { transform: translateX(4px); border-color: rgba(16,1,239,.3); box-shadow: 0 10px 26px rgba(13,16,32,.07); }
/* La puce est le signe en miniature : deux disques qui se recouvrent. */
#sxa .sxa-keys li::before {
  content: ""; flex: 0 0 auto; width: 15px; height: 9px; margin-top: 7px;
  background:
    radial-gradient(circle at 4.5px 4.5px, var(--sxa-red) 4.4px, transparent 4.6px),
    radial-gradient(circle at 10.5px 4.5px, var(--sxa-cyan) 4.4px, transparent 4.6px);
}

/* ------------------------------------------------- installable, et chiffres */
#sxa .sxa-os { display: flex; flex-wrap: wrap; gap: 8px; margin-top: 22px; }
#sxa .sxa-os li {
  display: inline-flex; align-items: center; gap: 7px;
  font-size: 12.5px; font-weight: 600; color: var(--sxa-ink);
  border: 1px solid var(--sxa-line); background: #fff;
  border-radius: 999px; padding: 7px 13px;
}
#sxa .sxa-os svg { width: 15px; height: 15px; flex: 0 0 auto; fill: none; stroke: var(--sxa-blue); stroke-width: 1.8; stroke-linecap: round; stroke-linejoin: round; }
#sxa .sxa-os .sxa-os--free { background: var(--sxa-blue); border-color: var(--sxa-blue); color: #fff; letter-spacing: .06em; text-transform: uppercase; font-weight: 800; font-size: 11.5px; }
#sxa .sxa-os .sxa-os--free svg { stroke: #fff; }
#sxa .sxa-stats { display: grid; grid-template-columns: repeat(4, minmax(0,1fr)); gap: 14px; margin-top: 30px; }
#sxa .sxa-stat { text-align: center; padding: 20px 10px; border-radius: 16px; background: #fff; border: 1px solid var(--sxa-line); }
#sxa .sxa-stat b {
  display: block; font-size: clamp(1.6rem, 3.6vw, 2.3rem); font-weight: 800; letter-spacing: -.04em; color: var(--sxa-ink);
  text-shadow: -.04em 0 rgba(255,45,85,.55), .04em 0 rgba(0,212,255,.55);
}
#sxa .sxa-stat span { font-size: 11px; text-transform: uppercase; letter-spacing: .1em; color: var(--sxa-blue); font-weight: 700; }

/* --------------------------------------------------------------------- etapes */
#sxa .sxa-steps { display: grid; gap: 14px; margin-top: 30px; grid-template-columns: repeat(2, minmax(0,1fr)); }
#sxa .sxa-steps--3 { grid-template-columns: repeat(3, minmax(0,1fr)); }
#sxa .sxa-step {
  border: 1px solid var(--sxa-line); border-radius: 16px; padding: 22px; background: #fff;
  transition: transform .2s ease, box-shadow .2s ease, border-color .2s ease;
}
#sxa .sxa-step:hover { transform: translateY(-3px); border-color: rgba(16,1,239,.35); box-shadow: 0 16px 36px rgba(13,16,32,.08); }
#sxa .sxa-num {
  display: inline-grid; place-items: center; width: 30px; height: 30px; border-radius: 9px;
  background: var(--sxa-soft); color: var(--sxa-blue); font-weight: 800; font-size: 13px; margin-bottom: 12px;
}
#sxa .sxa-step svg.sxa-ico { width: 34px; height: 34px; margin-bottom: 12px; fill: none; stroke: var(--sxa-blue); stroke-width: 1.7; stroke-linecap: round; stroke-linejoin: round; }

/* ------------------------------------------------------- la regle du trentieme */
#sxa .sxa-rule {
  display: grid; grid-template-columns: minmax(0,1.15fr) minmax(0,.85fr); gap: 26px; align-items: center;
  margin-top: 26px; border: 1px solid var(--sxa-line); border-radius: 18px; padding: 24px; background: var(--sxa-wash);
}
#sxa .sxa-rule svg { width: 100%; height: auto; }
#sxa .sxa-rule text { font-family: inherit; }
#sxa .sxa-rule b.sxa-formula {
  display: block; font-size: clamp(1.2rem, 2.6vw, 1.6rem); font-weight: 800; letter-spacing: -.02em; margin: 4px 0 10px;
}

/* ------------------------------------------------------------ les dix types
   Deux grandes cartes (Dubois, le conseille ; wiggle, le plus partage), puis
   huit, quatre par ligne. Chaque carte montre l'image REELLE qu'enregistre
   l'application, une route d'Occitanie ; le schema reste dessous, et
   reprend sa place si l'image ne se charge pas. */
#sxa .sxa-types { display: grid; grid-template-columns: repeat(4, minmax(0,1fr)); gap: 14px; margin-top: 30px; }
#sxa .sxa-cell { display: flex; }
#sxa .sxa-cell > .sxa-tilt { flex: 1 1 auto; min-width: 0; }
#sxa .sxa-cell--wide { grid-column: span 2; }
#sxa .sxa-type {
  border: 1px solid rgba(255,255,255,.12); border-radius: 16px; overflow: hidden;
  background: rgba(255,255,255,.04); display: flex; flex-direction: column;
}
#sxa .sxa-type:hover { border-color: rgba(63,220,255,.45); background: rgba(255,255,255,.07); }
#sxa .sxa-shot { position: relative; aspect-ratio: 16 / 9; background: #0b0c10; overflow: hidden; }
#sxa .sxa-shot svg { position: absolute; inset: 0; margin: auto; width: 70%; height: 60%; }
#sxa .sxa-shot img { position: absolute; inset: 0; width: 100%; height: 100%; object-fit: cover; }
/* Un cote a cote montre ses deux vues entieres, sur fond noir. */
#sxa .sxa-shot--dual img { object-fit: contain; }
#sxa .sxa-type-text { padding: 14px 15px 16px; }
#sxa .sxa-type b { display: block; font-size: 14px; font-weight: 700; color: #fff; line-height: 1.2; }
#sxa .sxa-cell--wide .sxa-type b { font-size: 16px; }
#sxa .sxa-type em { display: block; font-style: normal; font-size: 11px; font-weight: 700; letter-spacing: .08em; text-transform: uppercase; color: var(--sxa-cyan-text); margin: 5px 0 6px; }
#sxa .sxa-type span { display: block; font-size: 12.5px; color: #aeb5cb; line-height: 1.4; }
#sxa .sxa-type--star { border-color: rgba(63,220,255,.4); }

/* ------------------------------------------------- cartes qui s'inclinent
   La carte suit la souris sur ordinateur et l'inclinaison du telephone. Le
   mouvement est porte par la carte elle-meme, et l'apparition par sa
   cellule : deux transformations sur un meme element s'ecraseraient. */
#sxa .sxa-tilt {
  position: relative;
  transform: perspective(900px) rotateX(var(--rx, 0deg)) rotateY(var(--ry, 0deg));
  transition: transform .5s cubic-bezier(.2,.8,.2,1), border-color .2s ease, background .2s ease, box-shadow .3s ease;
}
#sxa .sxa-tilt.sxa-tilting { transition: transform .1s linear, border-color .2s ease, background .2s ease, box-shadow .3s ease; }
#sxa .sxa-glare {
  position: absolute; inset: 0; border-radius: inherit; pointer-events: none; z-index: 2;
  background: radial-gradient(70% 90% at var(--gx, 50%) var(--gy, 0%), rgba(255,255,255,.2), transparent 60%);
  opacity: 0; transition: opacity .35s ease;
}
#sxa .sxa-plan .sxa-glare { background: radial-gradient(70% 90% at var(--gx, 50%) var(--gy, 0%), rgba(0,212,255,.13), transparent 62%); }
#sxa .sxa-tilt.sxa-tilting .sxa-glare, #sxa.sxa-gyro .sxa-tilt .sxa-glare { opacity: 1; }
#sxa .sxa-gyro-ask { display: none; }
#sxa.sxa-js .sxa-gyro-ask.sxa-gyro-ask--on {
  display: inline-flex; align-items: center; gap: 8px; margin-top: 16px; cursor: pointer;
  font-family: inherit; font-size: 13px; font-weight: 700; line-height: 1.2; padding: 10px 16px; border-radius: 999px;
  border: 1px solid rgba(63,220,255,.45); background: transparent; color: var(--sxa-cyan-text);
}
#sxa.sxa-js .sxa-sec--wash .sxa-gyro-ask.sxa-gyro-ask--on { color: var(--sxa-blue); border-color: rgba(16,1,239,.35); }
#sxa .sxa-gyro-ask svg { width: 16px; height: 16px; fill: none; stroke: currentColor; stroke-width: 1.8; stroke-linecap: round; stroke-linejoin: round; }

/* ------------------------------------------------------------- les offres */
#sxa .sxa-plans { display: grid; grid-template-columns: repeat(3, minmax(0,1fr)); gap: 14px; margin-top: 30px; }
#sxa .sxa-plans .sxa-cell { display: flex; }
#sxa .sxa-plan {
  border: 1px solid var(--sxa-line); border-radius: 18px; padding: 24px 22px; background: #fff;
  display: flex; flex-direction: column; overflow: hidden;
}
#sxa .sxa-plan:hover { box-shadow: 0 16px 36px rgba(13,16,32,.08); }
#sxa .sxa-plan ul { margin-bottom: 18px; }
#sxa .sxa-plan-cta { display: grid; gap: 8px; margin-top: auto; position: relative; z-index: 3; }
#sxa .sxa-plan-cta .sxa-btn { justify-content: center; width: 100%; }
#sxa .sxa-plan--free { border-color: rgba(16,1,239,.35); box-shadow: 0 0 0 3px rgba(16,1,239,.07); }
#sxa .sxa-plan-name { font-size: 12px; font-weight: 800; letter-spacing: .12em; text-transform: uppercase; color: var(--sxa-blue); }
#sxa .sxa-price { white-space: nowrap; font-size: clamp(1.9rem, 3.8vw, 2.4rem); font-weight: 800; letter-spacing: -.04em; margin-top: 8px; line-height: 1; }
#sxa .sxa-period { font-size: 13px; font-weight: 600; color: var(--sxa-mid); margin-top: 4px; }
#sxa .sxa-plan-tag { font-size: 14px; color: var(--sxa-ink); font-weight: 600; margin: 14px 0 12px; }
#sxa .sxa-plan ul { display: grid; gap: 8px; }
#sxa .sxa-plan li { font-size: 13.5px; color: var(--sxa-mid); padding-left: 20px; position: relative; }
#sxa .sxa-plan li::before {
  content: ""; position: absolute; left: 2px; top: .5em; width: 9px; height: 5px;
  border-left: 2px solid var(--sxa-blue); border-bottom: 2px solid var(--sxa-blue); transform: rotate(-45deg);
}
#sxa .sxa-plan .sxa-inherit { font-weight: 700; color: var(--sxa-ink); padding-left: 0; }
#sxa .sxa-plan .sxa-inherit::before { display: none; }
#sxa .sxa-trust { display: grid; grid-template-columns: repeat(3, minmax(0,1fr)); gap: 12px; margin-top: 18px; }
#sxa .sxa-trust div { border-radius: 14px; padding: 16px; background: #fff; border: 1px dashed rgba(16,1,239,.25); }
#sxa .sxa-trust b { display: block; font-size: 13px; font-weight: 700; margin-bottom: 4px; }
#sxa .sxa-trust span { font-size: 12.5px; color: var(--sxa-mid); }

/* ===========================================================================
   DECLINAISONS DU LOGO
   =========================================================================== */
#sxa .sxa-logos { display: grid; grid-template-columns: repeat(3, minmax(0,1fr)); gap: 14px; margin-top: 28px; }
#sxa .sxa-logo {
  border: 1px solid var(--sxa-line); border-radius: 16px; background: #fff; overflow: hidden;
  transition: transform .2s ease, box-shadow .2s ease, border-color .2s ease;
}
#sxa .sxa-logo:hover { transform: translateY(-4px); border-color: rgba(16,1,239,.3); box-shadow: 0 16px 36px rgba(13,16,32,.09); }
#sxa .sxa-logo-art { aspect-ratio: 1; display: grid; place-items: center; padding: 22px; position: relative; overflow: hidden; }
#sxa .sxa-logo-art > svg { width: 78%; }
#sxa .sxa-logo-art--dark { background: var(--sxa-tile); }
#sxa .sxa-logo-art--photo { background: linear-gradient(180deg, #2a2160 0%, #a54f8f 52%, #ffb27f 70%, #3b2a66 71%, #1c1638 100%); padding: 0; }
#sxa .sxa-logo-lab { font-size: 11.5px; font-weight: 700; padding: 11px 14px; border-top: 1px solid var(--sxa-line); }
#sxa .sxa-logo-lab span { display: block; font-weight: 500; color: var(--sxa-mid); font-size: 11px; }
#sxa .sxa-wordmark {
  font-size: clamp(1.5rem, 3.2vw, 2.1rem); font-weight: 800; letter-spacing: .01em; color: #f2f4f9;
  text-shadow: -2px 0 rgba(255,45,85,.75), 2px 0 rgba(0,212,255,.75);
}
#sxa .sxa-slogan { font-size: clamp(1.25rem, 2.6vw, 1.7rem); font-weight: 800; letter-spacing: -.02em; text-align: center; line-height: 1.15; }
#sxa .sxa-logo-art--photo canvas { position: absolute; inset: 0; width: 100%; height: 100%; }
#sxa .sxa-logo-art--photo .sxa-stamp { font-size: 15px; left: 12px; bottom: 11px; }
#sxa .sxa-favrow { display: flex; align-items: flex-end; gap: 16px; justify-content: center; }
#sxa .sxa-favrow figure { text-align: center; }
#sxa .sxa-favrow figcaption { font-size: 9px; color: var(--sxa-mid); margin-top: 6px; font-weight: 600; }

/* ---------------------------------------------------------------- services */
#sxa .sxa-serv { display: grid; grid-template-columns: repeat(3, minmax(0,1fr)); gap: 14px; margin-top: 30px; }
#sxa .sxa-serv .sxa-step { background: var(--sxa-wash); }

/* ---------------------------------------------------------------------- final */
#sxa .sxa-final { text-align: center; }
#sxa .sxa-final .sxa-lede { margin-inline: auto; }
#sxa .sxa-final .sxa-cta { justify-content: center; }
#sxa .sxa-more { font-size: 14px; color: var(--sxa-mid); margin-top: 22px; }
#sxa .sxa-more a { color: var(--sxa-blue); font-weight: 700; }
#sxa .sxa-legal { font-size: 12px; color: var(--sxa-mid); margin-top: 34px; max-width: 74ch; margin-inline: auto; }

/* ===========================================================================
   APPARITIONS
   L'etat cache n'existe QUE si le script a pu poser .sxa-js : un script bloque
   laisse l'article lisible, sans animation. L'animation est un supplement,
   jamais la condition d'affichage.
   =========================================================================== */
#sxa .sxa-rise, #sxa .sxa-left, #sxa .sxa-zoom {
  transition: opacity .65s ease, transform .65s cubic-bezier(.2,.75,.25,1);
  transition-delay: calc(var(--i, 0) * 70ms);
}
#sxa.sxa-js .sxa-rise { opacity: 0; transform: translateY(24px); }
#sxa.sxa-js .sxa-left { opacity: 0; transform: translateX(-26px); }
#sxa.sxa-js .sxa-zoom { opacity: 0; transform: scale(.93); }
#sxa.sxa-js .sxa-in.sxa-rise, #sxa.sxa-js .sxa-in .sxa-rise,
#sxa.sxa-js .sxa-in.sxa-left, #sxa.sxa-js .sxa-in .sxa-left,
#sxa.sxa-js .sxa-in.sxa-zoom, #sxa.sxa-js .sxa-in .sxa-zoom { opacity: 1; transform: none; }

/* ------------------------------------------------------------------ responsive */
@media (max-width: 900px) {
  #sxa .sxa-hero-grid { grid-template-columns: 1fr; }
  #sxa .sxa-mark { width: min(190px, 52%); margin-inline: 0; }
  #sxa .sxa-serv, #sxa .sxa-stats, #sxa .sxa-chain, #sxa .sxa-steps--3, #sxa .sxa-trust { grid-template-columns: repeat(2, minmax(0,1fr)); }
  #sxa .sxa-types { grid-template-columns: repeat(2, minmax(0,1fr)); }
  #sxa .sxa-plans { grid-template-columns: 1fr; max-width: 520px; }
  #sxa .sxa-rule { grid-template-columns: 1fr; }
  #sxa .sxa-sec { padding: 58px 0; }
  #sxa .sxa-hero { padding: 64px 0 50px; }
}
@media (max-width: 620px) {
  #sxa .sxa-steps, #sxa .sxa-steps--3, #sxa .sxa-serv, #sxa .sxa-chain, #sxa .sxa-trust { grid-template-columns: 1fr; }
  #sxa .sxa-types { gap: 10px; }
  #sxa .sxa-type-text { padding: 11px 11px 13px; }
  #sxa .sxa-logos { grid-template-columns: repeat(2, minmax(0,1fr)); }
  #sxa .sxa-demo { aspect-ratio: 4 / 3; }
  #sxa .sxa-stamp { font-size: max(11px, 3.38cqw); }
  #sxa .sxa-mode { font-size: 12.5px; padding: 8px 12px; }
}

@media (prefers-reduced-motion: reduce) {
  #sxa .sxa-rise, #sxa .sxa-left, #sxa .sxa-zoom,
  #sxa.sxa-js .sxa-rise, #sxa.sxa-js .sxa-left, #sxa.sxa-js .sxa-zoom {
    opacity: 1; transform: none; transition: none;
  }
  #sxa .sxa-relief::before, #sxa .sxa-relief::after { transition: none; }
  #sxa.sxa-js .sxa-relief::before { transform: translateX(-.05em); }
  #sxa.sxa-js .sxa-relief::after { transform: translateX(.05em); }
  #sxa.sxa-js .sxa-in .sxa-disc-r, #sxa.sxa-js .sxa-in .sxa-disc-c { animation: none; }
  #sxa .sxa-demo-legend i { animation: none; }
  #sxa .sxa-btn:hover, #sxa .sxa-step:hover, #sxa .sxa-logo:hover, #sxa .sxa-keys li:hover,
  /* L'inclinaison reste : elle repond a un geste du lecteur, elle n'est pas
     un mouvement autonome. Seul son retour au repos devient immediat. */
  #sxa .sxa-tilt { transition: border-color .2s ease, background .2s ease, box-shadow .3s ease; }
}
</style>

<div id="sxa">

  <!-- Les deux disques sont definis UNE fois : ils reviennent dans la puce de
       signature, la vignette du signe et les favicons. Deux copies d'un dessin
       sont deux occasions de les voir diverger. -->
  <svg width="0" height="0" style="position:absolute" aria-hidden="true" focusable="false">
    <defs>
      <symbol id="sxa-discs" viewBox="0 0 64 44">
        <g style="isolation:isolate">
          <circle cx="24.5" cy="22" r="17" fill="#ff2d55"/>
          <circle cx="39.5" cy="22" r="17" fill="#00d4ff" style="mix-blend-mode:screen"/>
        </g>
      </symbol>
    </defs>
  </svg>

  <!-- ============================== EN-TETE ============================= -->
  <div class="sxa-banner">
    <img decoding="async" class="sxa-banner-fill" src="https://pcdlabs.presentcomposedesign.fr/tools/StereoptiX/assets/img/Header-stereoptix-wiggle-2026-10-07.gif" alt="" aria-hidden="true">
    <img fetchpriority="high" class="sxa-banner-img" src="https://pcdlabs.presentcomposedesign.fr/tools/StereoptiX/assets/img/Header-stereoptix-wiggle-2026-10-07.gif"
         alt="Des lunettes 3D rouge-cyan en carton, en wiggle : l'image balance d'un œil à l'autre et se voit en relief sans lunettes"
         width="1080" height="635" fetchpriority="high" decoding="async">
  </div>

  <!-- ============================== HERO ================================ -->
  <header class="sxa-hero" data-sxa-reveal>
    <div class="sxa-wrap">
      <div class="sxa-hero-grid">
        <div>
          <p class="sxa-kicker sxa-rise">Étude de cas &middot; Application web sur mesure</p>
          <h1 class="sxa-h1 sxa-rise" style="--i:1"><span class="sxa-relief" data-text="StereoptiX">StereoptiX</span></h1>
          <p class="sxa-lede sxa-rise" style="--i:2;margin-top:18px">
            Une application web qui transforme chaque <strong>photo en relief</strong> :
            anaglyphe rouge-cyan pour les lunettes 3D, côte à côte, ou wiggle, ce
            GIF animé qui se voit en relief sans rien sur le nez. La profondeur est
            calculée par une intelligence artificielle <strong>qui tourne dans le
            navigateur</strong> : aucune photo n'est envoyée. Imaginée, nommée,
            dessinée, développée et mise en ligne à Toulouse.
          </p>
          <div class="sxa-tags sxa-rise" style="--i:3">
            <span class="sxa-tag sxa-tag--on">Idéation</span>
            <span class="sxa-tag">Naming</span>
            <span class="sxa-tag">Identité graphique</span>
            <span class="sxa-tag">UX / UI</span>
            <span class="sxa-tag">IA embarquée</span>
            <span class="sxa-tag">WebGL</span>
            <span class="sxa-tag">Paiement en ligne</span>
            <span class="sxa-tag">Hébergement</span>
          </div>
          <div class="sxa-cta sxa-rise" style="--i:4">
            <a class="sxa-btn" href="https://pcdlabs.presentcomposedesign.fr/tools/StereoptiX/" target="_blank" rel="noopener">Voir l'application</a>
            <a class="sxa-btn sxa-btn--ghost" href="https://presentcomposedesign.fr/contact/">Demander un rendez-vous</a>
          </div>
        </div>

        <div class="sxa-mark sxa-zoom" aria-hidden="true">
          <!-- L'icone de l'application, redessinee a ses proportions exactes
               (icon-512.png) : tuile #0b0c10, disques de rayon 150. -->
          <svg viewBox="0 0 512 512">
            <rect width="512" height="512" rx="112" fill="#0b0c10"/>
            <g style="isolation:isolate">
              <circle class="sxa-disc-r" cx="206" cy="256" r="150" fill="#ff2d55"/>
              <circle class="sxa-disc-c" cx="306" cy="256" r="150" fill="#00d4ff" style="mix-blend-mode:screen"/>
            </g>
          </svg>
        </div>
      </div>
    </div>
  </header>

  <!-- ============================== DEMONSTRATION ======================= -->
  <section class="sxa-sec sxa-sec--night" data-sxa-reveal>
    <div class="sxa-wrap">
      <p class="sxa-kicker sxa-rise">Le cœur de l'application</p>
      <h2 class="sxa-h2 sxa-rise" style="--i:1">Une photo, et le relief apparaît</h2>
      <p class="sxa-p sxa-rise" style="--i:2">
        Un modèle d'intelligence artificielle estime, pour chaque pixel, ce qui
        est proche et ce qui est loin. L'application en tire deux points de vue,
        celui de l'œil gauche et celui de l'œil droit, puis les recompose selon le
        type de relief choisi. <strong>Essayez ci-dessous</strong> : la scène est
        calculée en direct dans cette page, avec les réglages de l'application.
      </p>

      <div class="sxa-demo sxa-zoom" style="--i:3" data-sxa-demo>
        <img class="sxa-demo-fond" src="data:image/jpeg;base64,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"
             alt="Démonstration de photo en relief : un paysage au crépuscule dessiné en plans successifs, montagnes, collines, sapins et herbes au premier plan"
             width="960" height="540" decoding="async">
        <canvas aria-hidden="true"></canvas>
        <p class="sxa-demo-legend"><i></i> <span data-sxa-legend>Calculé en direct</span></p>
        <span class="sxa-stamp" aria-hidden="true"><svg viewBox="0 0 64 44"><use href="#sxa-discs"/></svg>StereoptiX</span>
      </div>
      <div class="sxa-modes" role="group" aria-label="Type de relief de la démonstration">
        <button class="sxa-mode" type="button" data-sxa-mode="wiggle" aria-pressed="true">Wiggle</button>
        <button class="sxa-mode" type="button" data-sxa-mode="dubois" aria-pressed="false">Rouge-cyan Dubois</button>
        <button class="sxa-mode" type="button" data-sxa-mode="cross" aria-pressed="false">Côte à côte croisé</button>
        <button class="sxa-mode" type="button" data-sxa-mode="depth" aria-pressed="false">Carte de profondeur</button>
      </div>
      <p class="sxa-hint" data-sxa-hint aria-live="polite">Sans lunettes. Glissez sur l'image pour tourner autour de la scène.</p>
      <p class="sxa-cap">
        Pour la démonstration, la scène est dessinée en plans dont la profondeur
        est connue. Dans l'application, cette profondeur est déduite de votre
        photo : le relief d'une seule image est une reconstruction, pas une mesure.
      </p>

      <div class="sxa-chain">
        <div class="sxa-rise" style="--i:1"><b>1. Capter</b><span>Une photo, deux photos décalées d'un pas, ou une vidéo de cinq secondes. Prises à la caméra ou importées.</span></div>
        <div class="sxa-rise" style="--i:2"><b>2. Estimer la profondeur</b><span>Le modèle <a href="https://github.com/DepthAnything/Depth-Anything-V2" target="_blank" rel="noopener">Depth Anything V2</a>, exécuté sur l'appareil, par sa carte graphique quand elle le permet. Aucun serveur.</span></div>
        <div class="sxa-rise" style="--i:3"><b>3. Recomposer</b><span>Deux vues calculées en WebGL2, puis l'un des dix types de relief, à enregistrer ou partager.</span></div>
      </div>
    </div>
  </section>

  <!-- ============================== POINTS CLES ========================= -->
  <section class="sxa-sec" data-sxa-reveal>
    <div class="sxa-wrap">
      <p class="sxa-kicker sxa-rise">Points clés</p>
      <h2 class="sxa-h2 sxa-rise" style="--i:1">Ce que j'ai réalisé</h2>
      <ul class="sxa-keys">
        <li class="sxa-left" style="--i:1">Idéation, positionnement et naming de l'application</li>
        <li class="sxa-left" style="--i:2">Création du logo, de l'icône, de la signature des images et de l'identité graphique, en thème clair et sombre</li>
        <li class="sxa-left" style="--i:3">Conception de l'atelier et des parcours, pensés d'abord pour le téléphone</li>
        <li class="sxa-left" style="--i:4">Intelligence artificielle de profondeur exécutée dans le navigateur, et rendu de dix types de relief</li>
        <li class="sxa-left" style="--i:5">Prise de vue guidée à la caméra : une photo, deux photos ou une vidéo</li>
        <li class="sxa-left" style="--i:6">Modèle économique, paiement en ligne et licences signées, sans compte client</li>
        <li class="sxa-left" style="--i:7">Bibliothèque en ligne, sécurisation, mise en ligne et documentation</li>
      </ul>
    </div>
  </section>

  <!-- ============================== INSTALLABLE ========================= -->
  <section class="sxa-sec sxa-sec--wash" data-sxa-reveal>
    <div class="sxa-wrap">
      <p class="sxa-kicker sxa-rise">Sans magasin d'applications</p>
      <h2 class="sxa-h2 sxa-rise" style="--i:1">Elle s'installe sur tous les téléphones, gratuitement</h2>
      <p class="sxa-p sxa-rise" style="--i:2">
        StereoptiX est une application web. Elle s'ouvre dans un navigateur, puis
        s'installe d'un geste sur l'écran d'accueil ou le bureau, avec son icône.
        <strong>Aucun magasin d'applications, aucun compte, aucun abonnement.</strong>
        Une seule adresse, et le même atelier sur Android, sur iPhone, sur ordinateur.
      </p>
      <ul class="sxa-os sxa-rise" style="--i:3">
        <li class="sxa-os--free">
          <svg viewBox="0 0 24 24" aria-hidden="true"><path d="M12 4v16M4 12h16"/></svg>
          Gratuit
        </li>
        <li>
          <svg viewBox="0 0 24 24" aria-hidden="true"><rect x="6" y="2" width="12" height="20" rx="2.5"/><path d="M10.5 18.5h3"/></svg>
          Android
        </li>
        <li>
          <svg viewBox="0 0 24 24" aria-hidden="true"><rect x="6" y="2" width="12" height="20" rx="3"/><path d="M10 5h4"/></svg>
          iPhone et iPad
        </li>
        <li>
          <svg viewBox="0 0 24 24" aria-hidden="true"><rect x="3" y="5" width="18" height="12" rx="1.5"/><path d="M2 20h20"/></svg>
          Windows et macOS
        </li>
      </ul>
      <div class="sxa-cta sxa-rise" style="--i:4">
        <a class="sxa-btn" href="https://pcdlabs.presentcomposedesign.fr/tools/StereoptiX/" target="_blank" rel="noopener">Ouvrir et installer</a>
      </div>
      <div class="sxa-stats">
        <div class="sxa-stat sxa-rise" style="--i:0"><b data-sxa-count="10">10</b><span>types de relief</span></div>
        <div class="sxa-stat sxa-rise" style="--i:1"><b data-sxa-count="1">1</b><span>photo suffit</span></div>
        <div class="sxa-stat sxa-rise" style="--i:2"><b data-sxa-count="0">0</b><span>photo envoyée</span></div>
        <div class="sxa-stat sxa-rise" style="--i:3"><b data-sxa-count="559">559</b><span>contrôles auto</span></div>
      </div>
    </div>
  </section>

  <!-- ============================== PRISE DE VUE ======================== -->
  <section class="sxa-sec" data-sxa-reveal>
    <div class="sxa-wrap">
      <p class="sxa-kicker sxa-rise">Prise de vue</p>
      <h2 class="sxa-h2 sxa-rise" style="--i:1">Une photo suffit. Deux font mieux.</h2>
      <p class="sxa-p sxa-rise" style="--i:2">
        L'atelier a un seul départ, « Prendre 2 photos », et la caméra s'ouvre avec
        ses commandes posées sur l'image, comme dans un appareil photo. On y choisit
        entre trois prises, ou l'on importe une photo existante.
      </p>
      <div class="sxa-steps sxa-steps--3">
        <article class="sxa-step sxa-rise" style="--i:1">
          <svg class="sxa-ico" viewBox="0 0 32 32" aria-hidden="true"><rect x="3" y="8" width="26" height="18" rx="3"/><circle cx="16" cy="17" r="5"/><path d="M11 8l2-3h6l2 3"/></svg>
          <h3 class="sxa-h3">Une photo</h3>
          <p class="sxa-p">Le modèle de profondeur devine ce qui est proche et ce qui est loin. Prise à la caméra ou importée : JPEG, PNG, WebP, AVIF, GIF, et HEIC sur Safari.</p>
        </article>
        <article class="sxa-step sxa-rise" style="--i:2">
          <svg class="sxa-ico" viewBox="0 0 32 32" aria-hidden="true"><rect x="2" y="10" width="12" height="9" rx="2"/><rect x="18" y="10" width="12" height="9" rx="2"/><path d="M8 24h16M20 22l4 2-4 2"/></svg>
          <h3 class="sxa-h3">Deux photos</h3>
          <p class="sxa-p">Un pas de côté entre les deux prises, et c'est le vrai relief de la scène. L'atelier guide le geste avec une image fantôme à superposer au sujet.</p>
        </article>
        <article class="sxa-step sxa-rise" style="--i:3">
          <svg class="sxa-ico" viewBox="0 0 32 32" aria-hidden="true"><rect x="3" y="8" width="19" height="16" rx="3"/><path d="M22 14l7-4v12l-7-4z"/></svg>
          <h3 class="sxa-h3">Une vidéo</h3>
          <p class="sxa-p">Jusqu'à cinq secondes. Chaque image reçoit son relief, calculé sur l'appareil, et le tout s'enregistre en MP4, jusqu'en 1080p.</p>
        </article>
      </div>

      <figure class="sxa-rule sxa-zoom" style="--i:4">
        <!-- Schema de la prise en deux temps : vue de dessus, deux positions de
             l'appareil, le sujet devant, le fond derriere. -->
        <!-- Cadre serre sur le dessin : sur un telephone, le schema fait 300 px
             de large, et ses legendes doivent y rester au-dessus de 12 px. -->
        <svg viewBox="0 0 340 250" role="img" aria-label="Vue de dessus : deux positions de l'appareil séparées de 6 à 7 centimètres, face à un sujet à deux mètres">
          <defs>
            <marker id="sxa-arr" viewBox="0 0 10 10" refX="9" refY="5" markerWidth="6" markerHeight="6" orient="auto-start-reverse"><path d="M0 0L10 5L0 10z" fill="#5d6479"/></marker>
          </defs>
          <path d="M8 34H332" stroke="#c9cede" stroke-width="2" stroke-dasharray="4 6"/>
          <text x="170" y="22" text-anchor="middle" font-size="14" font-weight="600" fill="#5d6479">le fond, plus lointain</text>
          <circle cx="170" cy="96" r="20" fill="#1001ef" opacity=".12"/>
          <circle cx="170" cy="96" r="9" fill="#1001ef"/>
          <text x="198" y="101" font-size="15" font-weight="700" fill="#0d1020">le sujet</text>
          <path d="M136 204L168 108" stroke="#ff2d55" stroke-width="1.8" stroke-dasharray="3 4"/>
          <path d="M204 204L172 108" stroke="#00d4ff" stroke-width="1.8" stroke-dasharray="3 4"/>
          <rect x="114" y="202" width="44" height="24" rx="5" fill="#ff2d55"/>
          <rect x="182" y="202" width="44" height="24" rx="5" fill="#00d4ff"/>
          <text x="136" y="219" text-anchor="middle" font-size="13" font-weight="800" fill="#fff">1</text>
          <text x="204" y="219" text-anchor="middle" font-size="13" font-weight="800" fill="#0b0c10">2</text>
          <path d="M140 240H200" stroke="#5d6479" stroke-width="1.6" marker-start="url(#sxa-arr)" marker-end="url(#sxa-arr)"/>
          <text x="236" y="219" font-size="15" font-weight="700" fill="#0d1020">6 à 7 cm</text>
          <path d="M78 96V202" stroke="#5d6479" stroke-width="1.6" marker-start="url(#sxa-arr)" marker-end="url(#sxa-arr)"/>
          <text x="66" y="154" text-anchor="end" font-size="15" font-weight="700" fill="#0d1020">2 m</text>
        </svg>
        <figcaption>
          <p class="sxa-kicker" style="margin-bottom:6px">La règle du trentième</p>
          <b class="sxa-formula">écart = distance du premier plan&nbsp;÷&nbsp;30</b>
          <p class="sxa-p">Pour un sujet à deux mètres, l'écart vaut 6&nbsp;à&nbsp;7&nbsp;cm, celui de vos yeux.
          Pour un paysage lointain, il monte à trente centimètres et plus. Entre les
          deux prises, l'appareil se décale sans tourner, et rien ne doit bouger.</p>
        </figcaption>
      </figure>
    </div>
  </section>

  <!-- ============================== LES DIX TYPES ======================= -->
  <section class="sxa-sec sxa-sec--night" data-sxa-reveal>
    <div class="sxa-wrap">
      <p class="sxa-kicker sxa-rise">Dix sorties</p>
      <h2 class="sxa-h2 sxa-rise" style="--i:1">Dix façons de voir en relief</h2>
      <p class="sxa-p sxa-rise" style="--i:2">
        Avec ou sans lunettes, pour un écran, une visionneuse ou un autre logiciel.
        L'anaglyphe conseillé applique les matrices calculées par
        <a href="http://www.site.uottawa.ca/~edubois/anaglyph/" target="_blank" rel="noopener">Eric Dubois</a>
        en lumière linéaire : les couleurs les plus justes, et le moins d'images
        fantômes à travers les filtres.
      </p>
      <!-- Les intitules et les conseils sont recopies de l'application
           (core/modes.js), mot pour mot. Les images sont celles du serveur de
           l'application : une meme prise de vue, une route d'Occitanie. -->
      <div class="sxa-types">
        <div class="sxa-cell sxa-cell--wide sxa-zoom" style="--i:1">
          <article class="sxa-type sxa-type--star sxa-tilt" data-sxa-tilt>
            <figure class="sxa-shot">
              <svg viewBox="0 0 120 54" aria-hidden="true"><path d="M8 20h104" stroke="#3a3f55" stroke-width="3"/><circle cx="38" cy="30" r="17" fill="#ff2d55"/><circle cx="82" cy="30" r="17" fill="#00d4ff"/><path d="M55 28q5-6 10 0" fill="none" stroke="#3a3f55" stroke-width="3"/></svg>
              <img loading="lazy" src="https://pcdlabs.presentcomposedesign.fr/tools/StereoptiX/assets/img/route-d%27occitanie-stereoptix-Dubois-2026-10-03.jpg" alt="Une route d'Occitanie en anaglyphe rouge-cyan, méthode de Dubois" width="1898" height="1060" loading="lazy" decoding="async">
            </figure>
            <div class="sxa-type-text"><b>Rouge-cyan Dubois</b><em>Lunettes rouge-cyan</em><span>Conseillé : les couleurs les plus justes et le moins d'images fantômes.</span></div>
            <i class="sxa-glare" aria-hidden="true"></i>
          </article>
        </div>
        <div class="sxa-cell sxa-cell--wide sxa-zoom" style="--i:2">
          <article class="sxa-type sxa-type--star sxa-tilt" data-sxa-tilt>
            <figure class="sxa-shot">
              <svg viewBox="0 0 120 54" aria-hidden="true"><rect x="34" y="7" width="52" height="40" rx="6" fill="#2a2160"/><path d="M34 37l14-12 10 8 12-14 16 18v4a6 6 0 01-6 6H40a6 6 0 01-6-6z" fill="#a54f8f"/><path d="M18 27h10M102 27H92M18 27l4-4M18 27l4 4M102 27l-4-4M102 27l-4 4" stroke="#8890a6" stroke-width="2" stroke-linecap="round"/></svg>
              <img loading="lazy" src="https://pcdlabs.presentcomposedesign.fr/tools/StereoptiX/assets/img/route-d%27occitanie-stereoptix-anim-2026-10-03%20watermark.gif" alt="La même route en wiggle : un GIF qui balance d'un œil à l'autre, avec la signature StereoptiX de la version gratuite" width="1080" height="603" loading="lazy" decoding="async">
            </figure>
            <div class="sxa-type-text"><b>Wiggle</b><em>Sans lunettes</em><span>Une animation qui balance entre les vues. S'exporte en GIF.</span></div>
            <i class="sxa-glare" aria-hidden="true"></i>
          </article>
        </div>
        <div class="sxa-cell sxa-zoom" style="--i:3">
          <article class="sxa-type sxa-tilt" data-sxa-tilt>
            <figure class="sxa-shot">
              <svg viewBox="0 0 120 54" aria-hidden="true"><path d="M8 20h104" stroke="#3a3f55" stroke-width="3"/><circle cx="38" cy="30" r="17" fill="#ff2d55"/><circle cx="82" cy="30" r="17" fill="#00d4ff"/><path d="M55 28q5-6 10 0" fill="none" stroke="#3a3f55" stroke-width="3"/></svg>
              <img loading="lazy" src="https://pcdlabs.presentcomposedesign.fr/tools/StereoptiX/assets/img/route-d%27occitanie-stereoptix-color-2026-10-03.jpg" alt="La route en anaglyphe rouge-cyan couleur" width="1817" height="1060" loading="lazy" decoding="async">
            </figure>
            <div class="sxa-type-text"><b>Rouge-cyan couleur</b><em>Lunettes rouge-cyan</em><span>Couleurs vives, mais les rouges francs scintillent d'un œil à l'autre.</span></div>
            <i class="sxa-glare" aria-hidden="true"></i>
          </article>
        </div>
        <div class="sxa-cell sxa-zoom" style="--i:4">
          <article class="sxa-type sxa-tilt" data-sxa-tilt>
            <figure class="sxa-shot">
              <svg viewBox="0 0 120 54" aria-hidden="true"><path d="M8 20h104" stroke="#3a3f55" stroke-width="3"/><circle cx="38" cy="30" r="17" fill="#ff2d55"/><circle cx="82" cy="30" r="17" fill="#00d4ff"/><path d="M55 28q5-6 10 0" fill="none" stroke="#3a3f55" stroke-width="3"/></svg>
              <img loading="lazy" src="https://pcdlabs.presentcomposedesign.fr/tools/StereoptiX/assets/img/route-d%27occitanie-stereoptix-Demi-couleur-2026-10-03.jpg" alt="La route en anaglyphe rouge-cyan demi-couleur" width="1898" height="1060" loading="lazy" decoding="async">
            </figure>
            <div class="sxa-type-text"><b>Rouge-cyan demi-couleur</b><em>Lunettes rouge-cyan</em><span>Un bon compromis quand l'image contient beaucoup de rouge.</span></div>
            <i class="sxa-glare" aria-hidden="true"></i>
          </article>
        </div>
        <div class="sxa-cell sxa-zoom" style="--i:5">
          <article class="sxa-type sxa-tilt" data-sxa-tilt>
            <figure class="sxa-shot">
              <svg viewBox="0 0 120 54" aria-hidden="true"><path d="M8 20h104" stroke="#3a3f55" stroke-width="3"/><circle cx="38" cy="30" r="17" fill="#ff2d55"/><circle cx="82" cy="30" r="17" fill="#00d4ff"/><path d="M55 28q5-6 10 0" fill="none" stroke="#3a3f55" stroke-width="3"/></svg>
              <img loading="lazy" src="https://pcdlabs.presentcomposedesign.fr/tools/StereoptiX/assets/img/route-d%27occitanie-stereoptix-B%26W-2026-10-03.jpg" alt="La route en anaglyphe rouge-cyan gris, avec la signature StereoptiX" width="1898" height="1060" loading="lazy" decoding="async">
            </figure>
            <div class="sxa-type-text"><b>Rouge-cyan gris</b><em>Lunettes rouge-cyan</em><span>Le plus reposant pour les yeux, sans couleur.</span></div>
            <i class="sxa-glare" aria-hidden="true"></i>
          </article>
        </div>
        <div class="sxa-cell sxa-zoom" style="--i:6">
          <article class="sxa-type sxa-tilt" data-sxa-tilt>
            <figure class="sxa-shot">
              <svg viewBox="0 0 120 54" aria-hidden="true"><path d="M8 20h104" stroke="#3a3f55" stroke-width="3"/><circle cx="38" cy="30" r="17" fill="#ff2d55"/><circle cx="82" cy="30" r="17" fill="#22c55e"/><path d="M55 28q5-6 10 0" fill="none" stroke="#3a3f55" stroke-width="3"/></svg>
              <img loading="lazy" src="https://pcdlabs.presentcomposedesign.fr/tools/StereoptiX/assets/img/route-d%27occitanie-stereoptix-Rouge%26vert-2026-10-03.jpg" alt="La route en anaglyphe rouge-vert" width="1898" height="1060" loading="lazy" decoding="async">
            </figure>
            <div class="sxa-type-text"><b>Rouge-vert</b><em>Lunettes rouge-vert</em><span>Pour les anciennes lunettes rouge-vert.</span></div>
            <i class="sxa-glare" aria-hidden="true"></i>
          </article>
        </div>
        <div class="sxa-cell sxa-zoom" style="--i:7">
          <article class="sxa-type sxa-tilt" data-sxa-tilt>
            <figure class="sxa-shot">
              <svg viewBox="0 0 120 54" aria-hidden="true"><path d="M8 20h104" stroke="#3a3f55" stroke-width="3"/><circle cx="38" cy="30" r="17" fill="#ff2d55"/><circle cx="82" cy="30" r="17" fill="#3b5bff"/><path d="M55 28q5-6 10 0" fill="none" stroke="#3a3f55" stroke-width="3"/></svg>
              <img loading="lazy" src="https://pcdlabs.presentcomposedesign.fr/tools/StereoptiX/assets/img/route-d%27occitanie-stereoptix-Rouge%26bleu-2026-10-03.jpg" alt="La route en anaglyphe rouge-bleu" width="1898" height="1060" loading="lazy" decoding="async">
            </figure>
            <div class="sxa-type-text"><b>Rouge-bleu</b><em>Lunettes rouge-bleu</em><span>Pour les lunettes rouge-bleu.</span></div>
            <i class="sxa-glare" aria-hidden="true"></i>
          </article>
        </div>
        <div class="sxa-cell sxa-zoom" style="--i:8">
          <article class="sxa-type sxa-tilt" data-sxa-tilt>
            <figure class="sxa-shot sxa-shot--dual">
              <svg viewBox="0 0 120 54" aria-hidden="true"><rect x="10" y="9" width="46" height="36" rx="5" fill="none" stroke="#ff6b88" stroke-width="2.5"/><rect x="64" y="9" width="46" height="36" rx="5" fill="none" stroke="#5fe3ff" stroke-width="2.5"/><text x="33" y="32" text-anchor="middle" font-size="14" font-weight="800" fill="#ff6b88">G</text><text x="87" y="32" text-anchor="middle" font-size="14" font-weight="800" fill="#5fe3ff">D</text></svg>
              <img loading="lazy" src="https://pcdlabs.presentcomposedesign.fr/tools/StereoptiX/assets/img/route-d%27occitanie-stereoptix-VRdual-2026-10-03.jpg" alt="La route en côte à côte parallèle : la vue de l'œil gauche à gauche, celle de l'œil droit à droite" width="3796" height="1060" loading="lazy" decoding="async">
            </figure>
            <div class="sxa-type-text"><b>Côte à côte parallèle</b><em>Casque VR ou visionneuse</em><span>Vue gauche à gauche, pour un casque ou une visionneuse.</span></div>
            <i class="sxa-glare" aria-hidden="true"></i>
          </article>
        </div>
        <div class="sxa-cell sxa-zoom" style="--i:9">
          <article class="sxa-type sxa-tilt" data-sxa-tilt>
            <figure class="sxa-shot sxa-shot--dual">
              <svg viewBox="0 0 120 54" aria-hidden="true"><rect x="10" y="9" width="46" height="36" rx="5" fill="none" stroke="#5fe3ff" stroke-width="2.5"/><rect x="64" y="9" width="46" height="36" rx="5" fill="none" stroke="#ff6b88" stroke-width="2.5"/><text x="33" y="32" text-anchor="middle" font-size="14" font-weight="800" fill="#5fe3ff">D</text><text x="87" y="32" text-anchor="middle" font-size="14" font-weight="800" fill="#ff6b88">G</text></svg>
              <img loading="lazy" src="https://pcdlabs.presentcomposedesign.fr/tools/StereoptiX/assets/img/route-d%27occitanie-stereoptix-VRcross-2026-10-03.jpg" alt="La route en côte à côte croisé : la vue de l'œil droit à gauche, à regarder en louchant" width="3796" height="1060" loading="lazy" decoding="async">
            </figure>
            <div class="sxa-type-text"><b>Côte à côte croisé</b><em>Sans lunettes, en louchant</em><span>Louchez jusqu'à voir une troisième image au milieu : elle est en relief.</span></div>
            <i class="sxa-glare" aria-hidden="true"></i>
          </article>
        </div>
        <div class="sxa-cell sxa-zoom" style="--i:10">
          <article class="sxa-type sxa-tilt" data-sxa-tilt>
            <figure class="sxa-shot">
              <svg viewBox="0 0 120 54" aria-hidden="true"><rect x="28" y="7" width="64" height="40" rx="6" fill="#333"/><path d="M28 36l16-12 12 9 14-15 22 22v1a6 6 0 01-6 6H34a6 6 0 01-6-6z" fill="#cfcfcf" opacity=".9"/></svg>
              <img loading="lazy" src="https://pcdlabs.presentcomposedesign.fr/tools/StereoptiX/assets/img/route-d%27occitanie-stereoptix-zdepth-2026-10-03.jpg" alt="La carte de profondeur de la route : le proche en blanc, le lointain en noir" width="1898" height="1060" loading="lazy" decoding="async">
            </figure>
            <div class="sxa-type-text"><b>Carte de profondeur</b><em>Pour d'autres logiciels</em><span>Proche en blanc, loin en noir.</span></div>
            <i class="sxa-glare" aria-hidden="true"></i>
          </article>
        </div>
      </div>
      <button class="sxa-gyro-ask" type="button" data-sxa-gyro><svg viewBox="0 0 24 24" aria-hidden="true"><rect x="7" y="3" width="10" height="18" rx="2.5" transform="rotate(-14 12 12)"/><path d="M3.5 8.5a9 9 0 0 0 0 7M20.5 8.5a9 9 0 0 1 0 7"/></svg>Incliner le téléphone pour orienter les cartes</button>
      <p class="sxa-cap" style="margin-top:16px">
        Les dix sorties d'une même prise de vue, une route d'Occitanie. Chacune
        s'enregistre en PNG, JPEG ou WebP, le wiggle en GIF animé qui tourne en
        boucle, et la vidéo en MP4. Partagé, le GIF est allégé pour les
        messageries : 720&nbsp;pixels et 2&nbsp;Mo au plus, pour qu'il arrive animé.
      </p>
    </div>
  </section>

  <!-- ============================== LE MODELE =========================== -->
  <section class="sxa-sec sxa-sec--wash" data-sxa-reveal>
    <div class="sxa-wrap">
      <p class="sxa-kicker sxa-rise">Modèle économique</p>
      <h2 class="sxa-h2 sxa-rise" style="--i:1">Le gratuit est un troc, pas un essai</h2>
      <p class="sxa-p sxa-rise" style="--i:2">
        La formule gratuite n'expire pas et ne bride pas le relief : une photo,
        prise ou importée, les dix types de relief, l'enregistrement et le
        partage, sans compte.
      </p>
      <p class="sxa-p sxa-rise" style="--i:3">
        En échange, ce qui sort de l'atelier s'arrête au 720p, assez pour un écran
        ou une conversation, et porte une <strong>petite signature StereoptiX</strong>,
        celle que vous voyez en bas à gauche de la démonstration. Chaque image
        partagée fait ainsi connaître l'application : c'est elle qui paie la
        version gratuite.
      </p>
      <p class="sxa-p sxa-rise" style="--i:4">
        Les licences ouvrent le reste : deux photos pour le vrai relief d'une
        scène, la vidéo, la pleine définition sans signature, et avec Premium, une
        bibliothèque en ligne. Elles s'achètent <strong>une seule fois</strong>,
        sans abonnement et sans compte.
      </p>
      <div class="sxa-plans">
        <div class="sxa-cell sxa-rise" style="--i:1">
        <article class="sxa-plan sxa-plan--free sxa-tilt" data-sxa-tilt>
          <p class="sxa-plan-name">Découverte</p>
          <p class="sxa-price">0 €</p>
          <p class="sxa-period">pour toujours</p>
          <p class="sxa-plan-tag">Tout le relief, sans compte et sans payer.</p>
          <ul>
            <li>Une photo, prise ou importée</li>
            <li>Les dix types de relief</li>
            <li>Téléchargement et partage en 720p</li>
            <li>Petite signature StereoptiX sur l'image</li>
          </ul>
          <div class="sxa-plan-cta">
            <a class="sxa-btn" href="https://pcdlabs.presentcomposedesign.fr/tools/StereoptiX/index.html#prendre-1" target="_blank" rel="noopener">Prendre 1 photo</a>
          </div>
          <i class="sxa-glare" aria-hidden="true"></i>
        </article>
        </div>
        <div class="sxa-cell sxa-rise" style="--i:2">
        <article class="sxa-plan sxa-tilt" data-sxa-tilt>
          <p class="sxa-plan-name">Studio</p>
          <p class="sxa-price">4,99 €</p>
          <p class="sxa-period">une seule fois</p>
          <p class="sxa-plan-tag">Vos images, sans signature et en pleine définition.</p>
          <ul>
            <li>Deux photos : le vrai relief de la scène</li>
            <li>La vidéo en relief, en MP4 jusqu'en 1080p</li>
            <li>Pleine définition, selon l'appareil</li>
            <li>Signature retirée, ou gardée si vous le voulez</li>
          </ul>
          <div class="sxa-plan-cta">
            <a class="sxa-btn" href="https://pcdlabs.presentcomposedesign.fr/tools/StereoptiX/tarifs.html#offres" target="_blank" rel="noopener">Acheter</a>
            <a class="sxa-btn sxa-btn--ghost" href="https://pcdlabs.presentcomposedesign.fr/tools/StereoptiX/index.html#prendre" target="_blank" rel="noopener">Prendre 2 photos</a>
          </div>
          <i class="sxa-glare" aria-hidden="true"></i>
        </article>
        </div>
        <div class="sxa-cell sxa-rise" style="--i:3">
        <article class="sxa-plan sxa-tilt" data-sxa-tilt>
          <p class="sxa-plan-name">Premium</p>
          <p class="sxa-price">19,99 €</p>
          <p class="sxa-period">à vie</p>
          <p class="sxa-plan-tag">Tout Studio, et vos reliefs gardés en ligne.</p>
          <ul>
            <li class="sxa-inherit">Tout de Studio, plus :</li>
            <li>Mes clichés, une bibliothèque privée de 100&nbsp;Go</li>
            <li>Chaque cliché reste retouchable, sa source et ses réglages avec lui</li>
          </ul>
          <div class="sxa-plan-cta">
            <a class="sxa-btn" href="https://pcdlabs.presentcomposedesign.fr/tools/StereoptiX/tarifs.html#offres" target="_blank" rel="noopener">Acheter</a>
            <a class="sxa-btn sxa-btn--ghost" href="https://pcdlabs.presentcomposedesign.fr/tools/StereoptiX/index.html#prendre" target="_blank" rel="noopener">Prendre 2 photos</a>
          </div>
          <i class="sxa-glare" aria-hidden="true"></i>
        </article>
        </div>
      </div>
      <button class="sxa-gyro-ask" type="button" data-sxa-gyro><svg viewBox="0 0 24 24" aria-hidden="true"><rect x="7" y="3" width="10" height="18" rx="2.5" transform="rotate(-14 12 12)"/><path d="M3.5 8.5a9 9 0 0 0 0 7M20.5 8.5a9 9 0 0 1 0 7"/></svg>Incliner le téléphone pour orienter les cartes</button>
      <div class="sxa-trust">
        <div class="sxa-rise" style="--i:1"><b>Sans compte client</b><span>Le serveur demande à Stripe si le paiement est fait, puis signe une licence rangée sur l'appareil.</span></div>
        <div class="sxa-rise" style="--i:2"><b>Vérifiée sur place</b><span>La page reconnaît la signature de la licence elle-même, y compris hors connexion.</span></div>
        <div class="sxa-rise" style="--i:3"><b>Un code à garder</b><span>Il passe la licence sur un autre appareil. Une licence vit sur un appareil à la fois.</span></div>
      </div>
      <div class="sxa-cta sxa-rise" style="--i:4">
        <a class="sxa-btn sxa-btn--ghost" href="https://pcdlabs.presentcomposedesign.fr/tools/StereoptiX/tarifs.html" target="_blank" rel="noopener">Voir les offres en détail</a>
      </div>
    </div>
  </section>

  <!-- ============================== IDENTITE ============================ -->
  <section class="sxa-sec" data-sxa-reveal>
    <div class="sxa-wrap">
      <p class="sxa-kicker sxa-rise">Identité graphique</p>
      <h2 class="sxa-h2 sxa-rise" style="--i:1">Deux disques, une addition de lumière</h2>
      <p class="sxa-p sxa-rise" style="--i:2">
        Le signe est un anaglyphe à lui seul : un disque rouge, un disque cyan, les
        deux couleurs des lunettes 3D, qui s'additionnent comme deux faisceaux de
        lumière. Là où ils se croisent, la lumière devient presque blanche. Le nom,
        le slogan et la signature des images reprennent le même geste : deux
        couches légèrement décalées, que l'œil réunit.
      </p>

      <div class="sxa-logos">
        <figure class="sxa-logo sxa-zoom" style="--i:1">
          <div class="sxa-logo-art sxa-logo-art--dark">
            <svg viewBox="0 0 64 44" style="width:72%"><use href="#sxa-discs"/></svg>
          </div>
          <figcaption class="sxa-logo-lab">Icône d'application<span>Disques en lumière sur #0b0c10</span></figcaption>
        </figure>
        <figure class="sxa-logo sxa-zoom" style="--i:2">
          <div class="sxa-logo-art">
            <svg viewBox="0 0 64 44" style="width:72%"><use href="#sxa-discs"/></svg>
          </div>
          <figcaption class="sxa-logo-lab">Le signe<span>Le même fichier, sur fond clair comme sombre</span></figcaption>
        </figure>
        <figure class="sxa-logo sxa-zoom" style="--i:3">
          <div class="sxa-logo-art sxa-logo-art--dark">
            <span class="sxa-wordmark">StereoptiX</span>
          </div>
          <figcaption class="sxa-logo-lab">Le nom<span>Ses deux couches, rouge à gauche, cyan à droite</span></figcaption>
        </figure>
        <figure class="sxa-logo sxa-zoom" style="--i:4">
          <div class="sxa-logo-art">
            <p class="sxa-slogan">Vos photos<br><span class="sxa-relief" data-text="en relief">en relief</span></p>
          </div>
          <figcaption class="sxa-logo-lab">Le slogan<span>« en relief » arrive superposé, puis se décompose</span></figcaption>
        </figure>
        <figure class="sxa-logo sxa-zoom" style="--i:5">
          <div class="sxa-logo-art sxa-logo-art--photo">
            <!-- La scene de la demonstration, recadree par le script ; sans
                 script, le degrade du fond la remplace. -->
            <canvas data-sxa-thumb aria-hidden="true"></canvas>
            <span class="sxa-stamp"><svg viewBox="0 0 64 44"><use href="#sxa-discs"/></svg>StereoptiX</span>
          </div>
          <figcaption class="sxa-logo-lab">La signature des images<span>4,5 % du petit côté, lisible une fois partagée</span></figcaption>
        </figure>
        <figure class="sxa-logo sxa-zoom" style="--i:6">
          <div class="sxa-logo-art">
            <div class="sxa-favrow">
              <figure><svg viewBox="0 0 64 44" style="width:48px;height:33px"><use href="#sxa-discs"/></svg><figcaption>48</figcaption></figure>
              <figure><svg viewBox="0 0 64 44" style="width:32px;height:22px"><use href="#sxa-discs"/></svg><figcaption>32</figcaption></figure>
              <figure><svg viewBox="0 0 64 44" style="width:16px;height:11px"><use href="#sxa-discs"/></svg><figcaption>16</figcaption></figure>
            </div>
          </div>
          <figcaption class="sxa-logo-lab">Lisibilité<span>Validé à sa plus petite taille</span></figcaption>
        </figure>
      </div>
    </div>
  </section>

  <!-- ============================== METHODE ============================= -->
  <section class="sxa-sec sxa-sec--wash" data-sxa-reveal>
    <div class="sxa-wrap">
      <p class="sxa-kicker sxa-rise">Méthode</p>
      <h2 class="sxa-h2 sxa-rise" style="--i:1">De l'idée à la mise en ligne</h2>
      <div class="sxa-steps">
        <article class="sxa-step sxa-rise" style="--i:1"><span class="sxa-num">01</span>
          <h3 class="sxa-h3">Idéation et positionnement</h3>
          <p class="sxa-p">Une photo de téléphone, et le relief en quelques secondes, sans matériel ni compétence. Ce que l'application refuse de faire est décidé aussi tôt que ce qu'elle fait.</p></article>
        <article class="sxa-step sxa-rise" style="--i:2"><span class="sxa-num">02</span>
          <h3 class="sxa-h3">Naming</h3>
          <p class="sxa-p">Un nom qui dit la stéréoscopie et l'optique, et se prononce en français comme en anglais. Le premier s'est révélé déjà pris : l'application a été renommée sans qu'une seule licence vendue cesse de fonctionner.</p></article>
        <article class="sxa-step sxa-rise" style="--i:3"><span class="sxa-num">03</span>
          <h3 class="sxa-h3">Logo et identité graphique</h3>
          <p class="sxa-p">Deux disques en addition de lumière, déclinés en icône d'application, favicon, nom en anaglyphe et signature des images, en thème clair et sombre.</p></article>
        <article class="sxa-step sxa-rise" style="--i:4"><span class="sxa-num">04</span>
          <h3 class="sxa-h3">Architecture et UX</h3>
          <p class="sxa-p">Un atelier pensé d'abord pour le téléphone, un seul départ, et une architecture sans étape de compilation, choisie pour tenir sur un hébergement mutualisé.</p></article>
        <article class="sxa-step sxa-rise" style="--i:5"><span class="sxa-num">05</span>
          <h3 class="sxa-h3">Développement</h3>
          <p class="sxa-p">Profondeur par intelligence artificielle, rendu WebGL2, caméra, vidéo MP4, GIF animé, paiement, licences signées, bibliothèque en ligne, et 559 contrôles automatiques.</p></article>
        <article class="sxa-step sxa-rise" style="--i:6"><span class="sxa-num">06</span>
          <h3 class="sxa-h3">Mise en ligne et suivi</h3>
          <p class="sxa-p">Sécurisation, conditions de vente, mentions légales, application installable, réglages de l'éditeur sans toucher au code, documentation et mises à jour.</p></article>
      </div>
    </div>
  </section>

  <!-- ============================== SERVICES ============================ -->
  <section class="sxa-sec" data-sxa-reveal>
    <div class="sxa-wrap">
      <p class="sxa-kicker sxa-rise">Ce que cela veut dire pour vous</p>
      <h2 class="sxa-h2 sxa-rise" style="--i:1">Un seul interlocuteur, du premier croquis à la mise en ligne</h2>
      <div class="sxa-serv">
        <article class="sxa-step sxa-rise" style="--i:1">
          <h3 class="sxa-h3">Application web sur mesure</h3>
          <p class="sxa-p">Outil métier, configurateur, application mobile installable, vente en ligne. Conçue, développée et hébergée.</p></article>
        <article class="sxa-step sxa-rise" style="--i:2">
          <h3 class="sxa-h3">Identité et design produit</h3>
          <p class="sxa-p">Naming, logo, système d'icônes, interface et déclinaisons, pensés pour tenir à toutes les tailles.</p></article>
        <article class="sxa-step sxa-rise" style="--i:3">
          <h3 class="sxa-h3">3D, relief et expériences immersives</h3>
          <p class="sxa-p">Images en relief, configurateurs 3D temps réel, visualiseurs, réalité augmentée, directement dans le navigateur.</p></article>
      </div>
    </div>
  </section>

  <!-- ============================== APPEL =============================== -->
  <section class="sxa-sec sxa-sec--wash sxa-final" data-sxa-reveal>
    <div class="sxa-wrap">
      <h2 class="sxa-h2 sxa-rise">Vous souhaitez faire appel à mes services ?</h2>
      <p class="sxa-lede sxa-rise" style="--i:1">
        Parlons de votre projet. J'interviens sur l'ensemble de la chaîne, ou sur la
        partie qui vous manque.
      </p>
      <div class="sxa-cta sxa-rise" style="--i:2">
        <a class="sxa-btn" href="https://presentcomposedesign.fr/contact/">Demander un rendez-vous</a>
        <a class="sxa-btn sxa-btn--ghost" href="https://presentcomposedesign.fr/realisations/">Voir les autres réalisations</a>
      </div>
      <p class="sxa-more sxa-rise" style="--i:3">
        Une autre étude de cas : <a href="https://presentcomposedesign.fr/birdsignal-infos/">BirdSignal, l'application qui identifie les oiseaux à leur chant</a>.
      </p>
      <p class="sxa-legal sxa-rise" style="--i:4">
        StereoptiX est une application de Present Composé Design, nom commercial de
        l'entreprise individuelle Alban DESBARAX, à Toulouse. Le relief tiré d'une
        seule photo est estimé par un modèle d'intelligence artificielle : c'est une
        reconstruction plausible, pas une mesure de la scène.
      </p>
    </div>
  </section>
</div>

<script>
(function () {
  var root = document.getElementById('sxa');
  if (!root) return;

  /* Marque la presence du script AVANT tout le reste : c'est cette classe, et
     elle seule, qui autorise la feuille de style a cacher ce qui va apparaitre. */
  root.classList.add('sxa-js');

  var calme = window.matchMedia && window.matchMedia('(prefers-reduced-motion: reduce)').matches;

  /* ----------------------------------------------------------- apparitions
     Seuil a zero, et non a un pourcentage : sur un ecran court, 12 % d'une
     section haute peut depasser la hauteur de la fenetre, et la section ne
     s'afficherait jamais. */
  var sections = root.querySelectorAll('[data-sxa-reveal]');
  if (calme || !('IntersectionObserver' in window)) {
    for (var k = 0; k < sections.length; k++) sections[k].classList.add('sxa-in');
  } else {
    var io = new IntersectionObserver(function (es) {
      es.forEach(function (e) {
        if (e.isIntersecting) { e.target.classList.add('sxa-in'); io.unobserve(e.target); }
      });
    }, { threshold: 0, rootMargin: '0px 0px -10% 0px' });
    for (var j = 0; j < sections.length; j++) io.observe(sections[j]);
  }

  /* -------------------------------------------------------------- compteurs
     Le HTML porte deja la valeur finale : sans script, les chiffres restent
     justes. C'est ici, et seulement ici, qu'on repart de zero. */
  function compte(el) {
    var cible = parseInt(el.getAttribute('data-sxa-count'), 10) || 0;
    if (calme || cible < 2) { el.textContent = String(cible); return; }
    el.textContent = '0';
    var t0 = null, duree = 1000;
    function pas(t) {
      if (t0 === null) t0 = t;
      var p = Math.min(1, (t - t0) / duree);
      el.textContent = String(Math.round(cible * (1 - Math.pow(1 - p, 3))));
      if (p < 1) requestAnimationFrame(pas);
    }
    requestAnimationFrame(pas);
  }
  var compteurs = root.querySelectorAll('[data-sxa-count]');
  if (!('IntersectionObserver' in window)) {
    for (var m = 0; m < compteurs.length; m++) compte(compteurs[m]);
  } else {
    var io2 = new IntersectionObserver(function (es) {
      es.forEach(function (e) { if (e.isIntersecting) { compte(e.target); io2.unobserve(e.target); } });
    }, { threshold: 0.5 });
    for (var q = 0; q < compteurs.length; q++) io2.observe(compteurs[q]);
  }

  /* --------------------------------------------- images des dix sorties
     Une image qui ne se charge pas laisse voir le schema pose dessous, au
     lieu d'un cadre vide marque d'une icone cassee. */
  var shots = root.querySelectorAll('.sxa-shot img');
  for (var si = 0; si < shots.length; si++) {
    shots[si].addEventListener('error', function () { this.hidden = true; });
  }

  /* =============================================== CARTES QUI S'INCLINENT
   *
   * Sur ordinateur, la carte suit la souris. Sur telephone, toutes les cartes
   * suivent l'inclinaison de l'appareil : c'est l'equivalent tactile du
   * survol. Le calcul est celui de l'application (core/orientation.js) :
   *   - le repos est l'horizontale vraie, jamais la premiere mesure, et il
   *     DERIVE vers la posture tenue. Il reste exp(-t/1600) de l'ecart au
   *     bout de t : une posture de lecture a perdu les deux tiers de son
   *     inclinaison en deux secondes, un geste de poignet (100 ms) ne deplace
   *     le repos que de 6 % ;
   *   - la derive suit le temps ecoule, pas le nombre de mesures (10 a 60 par
   *     seconde selon l'appareil), avec un ecart borne a 250 ms pour qu'un
   *     retour d'onglet ne fasse pas sauter le repos ;
   *   - l'ecart se mesure AVANT la derive, sinon le geste est mange ;
   *   - 26 degres valent une inclinaison complete ; en paysage, les axes de
   *     l'appareil sont ramenes a ceux de l'ecran.
   * Sur iPhone et iPad, le capteur ne s'ouvre que par un geste du lecteur :
   * un bouton le demande, et n'apparait que la.
   */
  var tilts = root.querySelectorAll('[data-sxa-tilt]');
  var TILT_X = 8, TILT_Y = 10;            // degres : avant-arriere, gauche-droite
  var gyroOn = false, gx = 0, gy = 0, gsx = 0, gsy = 0, gyroRaf = 0;
  var origin = { beta: 0, gamma: 0 }, lastAt = 0, hovered = null;

  function clamp1(v) { return v < -1 ? -1 : v > 1 ? 1 : v; }
  function tiltFrom(o, r) { return { x: clamp1((r.gamma - o.gamma) / 26), y: clamp1((r.beta - o.beta) / 26) }; }
  function settleOrigin(o, r, dtMs) {
    var dt = Math.min(250, Math.max(0, dtMs)), k = 1 - Math.exp(-dt / 1600);
    return { beta: o.beta + (r.beta - o.beta) * k, gamma: o.gamma + (r.gamma - o.gamma) * k };
  }
  function screenPosture(r, angle) {
    var a = ((Math.round(angle / 90) * 90) % 360 + 360) % 360;
    if (a === 90) return { beta: -r.gamma, gamma: r.beta };
    if (a === 180) return { beta: -r.beta, gamma: -r.gamma };
    if (a === 270) return { beta: r.gamma, gamma: -r.beta };
    return { beta: r.beta, gamma: r.gamma };
  }

  /* La carte penche vers le point vise : le bord sous la souris s'enfonce,
     comme sous le doigt, et le reflet glisse avec lui. */
  function lean(card, x, y) {
    card.style.setProperty('--ry', (x * TILT_Y).toFixed(2) + 'deg');
    card.style.setProperty('--rx', (-y * TILT_X).toFixed(2) + 'deg');
    card.style.setProperty('--gx', (50 + x * 45).toFixed(1) + '%');
    card.style.setProperty('--gy', (50 + y * 45).toFixed(1) + '%');
  }

  for (var ti = 0; ti < tilts.length; ti++) {
    (function (card) {
      card.addEventListener('pointermove', function (e) {
        // La souris et le stylet seulement : un doigt qui fait defiler la page
        // ne doit pas faire basculer la carte qu'il traverse.
        if (e.pointerType !== 'mouse' && e.pointerType !== 'pen') return;
        var r = card.getBoundingClientRect();
        hovered = card;
        card.classList.add('sxa-tilting');
        lean(card, clamp1(2 * (e.clientX - r.left) / r.width - 1), clamp1(2 * (e.clientY - r.top) / r.height - 1));
      });
      card.addEventListener('pointerleave', function () {
        if (hovered === card) hovered = null;
        card.classList.remove('sxa-tilting');
        lean(card, gyroOn ? gsx : 0, gyroOn ? gsy : 0);
      });
    })(tilts[ti]);
  }

  /* Le capteur, lisse dans la boucle d'affichage : il est bruite. */
  function gyroFrame() {
    gyroRaf = 0;
    gsx += (gx - gsx) * 0.09;
    gsy += (gy - gsy) * 0.09;
    for (var k3 = 0; k3 < tilts.length; k3++) if (tilts[k3] !== hovered) lean(tilts[k3], gsx, gsy);
    if (Math.abs(gx - gsx) > 0.002 || Math.abs(gy - gsy) > 0.002) gyroRaf = requestAnimationFrame(gyroFrame);
  }
  function onOrientation(e) {
    if (e.beta === null || e.gamma === null || e.beta === undefined) return;
    var angle = (screen.orientation && screen.orientation.angle) || window.orientation || 0;
    var reading = screenPosture({ beta: e.beta, gamma: e.gamma }, angle);
    var t = tiltFrom(origin, reading);
    gx = t.x; gy = t.y;
    var now = performance.now(), dt = lastAt ? now - lastAt : 16;
    lastAt = now;
    origin = settleOrigin(origin, reading, dt);
    if (!gyroRaf) gyroRaf = requestAnimationFrame(gyroFrame);
  }
  function startGyro() {
    if (gyroOn) return;
    gyroOn = true;
    origin = { beta: 0, gamma: 0 }; lastAt = 0;
    root.classList.add('sxa-gyro');
    window.addEventListener('deviceorientation', onOrientation);
  }

  /* Le capteur n'a de sens que la ou il n'y a pas de vrai pointeur. Le test
     combine deux indices : un iPad a clavier se declare en pointeur fin. */
  var coarse = window.matchMedia && window.matchMedia('(pointer: coarse)').matches;
  var touch = coarse || (navigator.maxTouchPoints || 0) > 0;
  if (touch && typeof DeviceOrientationEvent !== 'undefined') {
    var asks = root.querySelectorAll('[data-sxa-gyro]');
    var offer = function () {
      // iPhone et iPad : la demande DOIT partir d'un geste, sinon iOS la
      // rejette sans rien afficher. Le bouton fournit ce geste.
      for (var ai = 0; ai < asks.length; ai++) {
        asks[ai].classList.add('sxa-gyro-ask--on');
        asks[ai].addEventListener('click', function () {
          DeviceOrientationEvent.requestPermission().then(function (answer) {
            if (answer !== 'granted') return;
            startGyro();
            for (var aj = 0; aj < asks.length; aj++) asks[aj].classList.remove('sxa-gyro-ask--on');
          }).catch(function () {});
        });
      }
    };
    if (typeof DeviceOrientationEvent.requestPermission === 'function') {
      /* On demande d'abord SANS geste. Chrome expose aussi cette demande
         depuis peu (vu sur la version 154) et l'accorde aussitôt : le capteur
         s'ouvre alors seul, comme avant. iOS la refuse hors geste : le bouton
         apparaît. Supposer « demande = iOS » laissait Android sans capteur. */
      DeviceOrientationEvent.requestPermission().then(function (answer) {
        if (answer === 'granted') startGyro(); else offer();
      }).catch(offer);
    } else {
      startGyro();
    }
  }

  /* ======================================================= DEMONSTRATION
   *
   * Une scene en plans, chacun avec sa profondeur z (0 = le ciel, 1 = l'herbe
   * du premier plan). Chaque plan est dessine UNE fois dans son propre canvas,
   * un peu plus large que l'image ; une vue n'est ensuite qu'un empilement de
   * ces plans, chacun decale de  oeil x ecart x (z - convergence).
   * C'est exactement ce que fait l'application avec la profondeur qu'elle
   * deduit d'une photo, en continu au lieu de six plans.
   *
   * Les valeurs qui comptent sont celles de l'application :
   *   - le wiggle balance en cosinus sur 12 images de 70 ms (engine/gif.js) ;
   *   - l'anaglyphe Dubois applique ses deux matrices en lumiere LINEAIRE
   *     (core/modes.js) : appliquees aux valeurs d'ecran, elles assombrissent
   *     les tons moyens.
   */
  var demo = root.querySelector('[data-sxa-demo]');
  var cv = demo && demo.querySelector('canvas');
  if (!cv || !cv.getContext) return;
  var ctx = cv.getContext('2d');
  if (!ctx) return;

  var DUBOIS_L = [0.456, 0.500, 0.176, -0.040, -0.038, -0.016, -0.015, -0.021, -0.005];
  var DUBOIS_R = [-0.043, -0.088, -0.002, 0.378, 0.734, -0.018, -0.072, -0.113, 1.226];
  var CONV = 0.42;                       // plan de l'ecran : les collines
  var SWAY_MS = 12 * 70;                 // une periode du wiggle exporte
  var HINTS = {
    wiggle: "Sans lunettes. Glissez sur l'image pour tourner autour de la scène.",
    dubois: "Avec des lunettes rouge-cyan, filtre rouge sur l'œil gauche.",
    cross: "Sans lunettes : louchez jusqu'à voir une troisième image au milieu, elle est en relief.",
    depth: "Ce que l'intelligence artificielle calcule : proche en blanc, loin en noir."
  };

  /* Hasard reproductible : la meme scene a chaque visite. */
  function rng(seed) {
    return function () {
      seed = (seed + 0x6D2B79F5) | 0;
      var t = Math.imul(seed ^ (seed >>> 15), 1 | seed);
      t = (t + Math.imul(t ^ (t >>> 7), 61 | t)) ^ t;
      return ((t ^ (t >>> 14)) >>> 0) / 4294967296;
    };
  }
  /* Une ligne de crete : une somme de sinus aux phases tirees au sort. */
  function ridge(seed, n) {
    var r = rng(seed), p = [];
    for (var i = 0; i < n; i++) p.push({ f: (i + 1) * (1.1 + r() * 0.9), ph: r() * 6.283, a: 1 / (i + 1.3) });
    return function (u) {
      var s = 0, t = 0;
      for (var i = 0; i < p.length; i++) { s += p[i].a * Math.sin(u * p[i].f * 6.283 + p[i].ph); t += p[i].a; }
      return s / t;
    };
  }
  function pine(g, x, base, h) {
    var w = h * 0.36;
    g.fillRect(x - h * 0.03, base - h * 0.16, h * 0.06, h * 0.18);
    for (var i = 0; i < 4; i++) {
      var y0 = base - h * 0.12 - i * h * 0.21, ww = w * (1 - i * 0.2);
      g.beginPath(); g.moveTo(x - ww / 2, y0); g.lineTo(x, y0 - h * 0.34); g.lineTo(x + ww / 2, y0); g.closePath(); g.fill();
    }
  }
  function range(g, W, H, M, seed, base, amp, n) {
    var f = ridge(seed, n);
    g.beginPath(); g.moveTo(0, H);
    for (var x = 0; x <= W + 2 * M; x += 3) g.lineTo(x, H * (base + amp * f((x - M) / W)));
    g.lineTo(W + 2 * M, H); g.closePath(); g.fill();
  }

  /* Les plans, du plus lointain au plus proche. `paint(g, W, H, M, prof)`
     dessine en couleur, ou en gris de profondeur quand `prof` est vrai. */
  var PLANS = [
    { z: 0, paint: function (g, W, H, M, prof) {
      if (prof) { g.fillStyle = '#000'; g.fillRect(0, 0, W + 2 * M, H); return; }
      var sky = g.createLinearGradient(0, 0, 0, H);
      sky.addColorStop(0, '#141638'); sky.addColorStop(0.3, '#35286c');
      sky.addColorStop(0.5, '#93488e'); sky.addColorStop(0.63, '#f2826e');
      sky.addColorStop(0.72, '#ffc996'); sky.addColorStop(1, '#ffd9ad');
      g.fillStyle = sky; g.fillRect(0, 0, W + 2 * M, H);
      var r = rng(3);
      for (var i = 0; i < 70; i++) {
        g.fillStyle = 'rgba(255,255,255,' + (0.25 + r() * 0.55).toFixed(2) + ')';
        var sx = r() * (W + 2 * M), sy = Math.pow(r(), 1.6) * H * 0.36, sr = 0.4 + r() * 1.1;
        g.beginPath(); g.arc(sx, sy, sr * W / 960, 0, 6.283); g.fill();
      }
      var cx = M + W * 0.64, cy = H * 0.6, sr2 = H * 0.075;
      var glow = g.createRadialGradient(cx, cy, sr2 * 0.6, cx, cy, sr2 * 4.2);
      glow.addColorStop(0, 'rgba(255,230,190,.55)'); glow.addColorStop(1, 'rgba(255,230,190,0)');
      g.fillStyle = glow; g.fillRect(0, 0, W + 2 * M, H);
      g.fillStyle = '#fff0d2'; g.beginPath(); g.arc(cx, cy, sr2, 0, 6.283); g.fill();
    } },
    { z: 0.16, paint: function (g, W, H, M, prof) {
      g.fillStyle = prof ? 'rgb(48,48,48)' : '#a0609c';
      range(g, W, H, M, 7, 0.6, 0.09, 4);
    } },
    { z: 0.3, paint: function (g, W, H, M, prof) {
      g.fillStyle = prof ? 'rgb(84,84,84)' : '#69417f';
      range(g, W, H, M, 11, 0.67, 0.07, 4);
    } },
    { z: 0.42, paint: function (g, W, H, M, prof) {
      g.fillStyle = prof ? 'rgb(118,118,118)' : '#432c63';
      range(g, W, H, M, 19, 0.75, 0.04, 3);
      var r = rng(5);
      for (var i = 0; i < 9; i++) pine(g, M + W * (0.05 + i * 0.035 + r() * 0.02), H * (0.765 + r() * 0.02), H * (0.11 + r() * 0.05));
    } },
    { z: 0.62, paint: function (g, W, H, M, prof) {
      g.fillStyle = prof ? 'rgb(166,166,166)' : '#2a1d47';
      g.beginPath(); g.moveTo(M + W * 0.58, H);
      g.quadraticCurveTo(M + W * 0.72, H * 0.78, M + W * 1.05, H * 0.8); g.lineTo(M + W * 1.05, H); g.closePath(); g.fill();
      var r = rng(9);
      var xs = [0.7, 0.76, 0.81, 0.86, 0.9, 0.95];
      for (var i = 0; i < xs.length; i++) pine(g, M + W * xs[i], H * (0.83 + r() * 0.02), H * (0.2 + r() * 0.12));
    } },
    { z: 0.82, paint: function (g, W, H, M, prof) {
      g.fillStyle = prof ? 'rgb(212,212,212)' : '#191230';
      range(g, W, H, M, 23, 0.91, 0.025, 3);
      // Un rocher, en ellipse entiere : sa moitie basse s'enfonce dans le sol.
      g.beginPath();
      g.ellipse(M + W * 0.25, H * 0.95, W * 0.07, H * 0.075, -0.08, 0, 2 * Math.PI); g.fill();
    } },
    { z: 1, paint: function (g, W, H, M, prof) {
      g.strokeStyle = prof ? '#fff' : '#0c0819';
      g.lineCap = 'round';
      var r = rng(31);
      function tuft(x0, x1, n, hmax) {
        for (var i = 0; i < n; i++) {
          var x = M + W * (x0 + r() * (x1 - x0)), h = H * (0.06 + r() * hmax), lean = (r() - 0.5) * W * 0.05;
          g.lineWidth = (1.4 + r() * 2.2) * W / 960;
          g.beginPath(); g.moveTo(x, H + 2); g.quadraticCurveTo(x + lean * 0.2, H - h * 0.6, x + lean, H - h); g.stroke();
        }
      }
      tuft(-0.02, 0.17, 46, 0.26);
      tuft(0.88, 1.03, 34, 0.2);
      tuft(0.4, 0.5, 8, 0.07);
    } }
  ];

  var mode = 'wiggle';
  var W = 0, H = 0, M = 0, D = 0;
  var layers = [];                       // { z, color: canvas, depth: canvas }
  var view = document.createElement('canvas'), vctx = view.getContext('2d');
  var view2 = document.createElement('canvas'), vctx2 = view2.getContext('2d');
  var eye = 0, target = null, raf = 0, visible = false, t0 = performance.now();

  function build() {
    var cssW = demo.clientWidth, cssH = demo.clientHeight;
    if (!cssW || !cssH) return false;
    var ratio = Math.min(window.devicePixelRatio || 1, 2);
    var nw = Math.min(1280, Math.round(cssW * ratio)), nh = Math.round(nw * cssH / cssW);
    if (nw === W && nh === H && layers.length) return true;
    W = nw; H = nh; cv.width = W; cv.height = H;
    view.width = view2.width = W; view.height = view2.height = H;
    D = W * 0.045;                     // ecart maximal entre les deux yeux
    M = Math.ceil(D) + 4;
    layers = PLANS.map(function (p) { return { plan: p, z: p.z, color: null, depth: null }; });
    return true;
  }

  /* Un plan n'est peint qu'au premier besoin : les calques de profondeur ne
     servent qu'a un bouton sur quatre, et quatorze grands canvas pesent
     plusieurs dizaines de megaoctets sur un telephone. */
  function plate(L, prof) {
    var key = prof ? 'depth' : 'color';
    if (!L[key]) {
      var c = document.createElement('canvas');
      c.width = W + 2 * M; c.height = H;
      L.plan.paint(c.getContext('2d'), W, H, M, prof);
      L[key] = c;
    }
    return L[key];
  }

  /* Une vue : les plans empiles, chacun decale selon sa profondeur. `e` va
     de -1 (oeil droit) a +1 (oeil gauche) ; `gap` regle l'ecart. */
  function compose(g, e, gap, prof) {
    for (var i = 0; i < layers.length; i++) {
      var L = layers[i];
      g.drawImage(plate(L, prof), -M + e * gap * (L.z - CONV), 0);
    }
  }

  var toLin = new Float32Array(256);
  for (var i = 0; i < 256; i++) { var c = i / 255; toLin[i] = c <= 0.04045 ? c / 12.92 : Math.pow((c + 0.055) / 1.055, 2.4); }
  var toSrgb = new Uint8ClampedArray(4096);
  for (var s = 0; s < 4096; s++) { var l = s / 4095; toSrgb[s] = Math.round(255 * (l <= 0.0031308 ? l * 12.92 : 1.055 * Math.pow(l, 1 / 2.4) - 0.055)); }
  function enc(v) { return v <= 0 ? 0 : v >= 1 ? 255 : toSrgb[(v * 4095) | 0]; }

  function anaglyph() {
    var gap = D * 0.55;
    compose(vctx, 0.5, gap, false);
    compose(vctx2, -0.5, gap, false);
    var a = vctx.getImageData(0, 0, W, H), b = vctx2.getImageData(0, 0, W, H);
    var A = a.data, B = b.data, n = A.length, ML = DUBOIS_L, MR = DUBOIS_R;
    for (var p = 0; p < n; p += 4) {
      var lr = toLin[A[p]], lg = toLin[A[p + 1]], lb = toLin[A[p + 2]];
      var rr = toLin[B[p]], rg = toLin[B[p + 1]], rb = toLin[B[p + 2]];
      A[p]     = enc(ML[0] * lr + ML[1] * lg + ML[2] * lb + MR[0] * rr + MR[1] * rg + MR[2] * rb);
      A[p + 1] = enc(ML[3] * lr + ML[4] * lg + ML[5] * lb + MR[3] * rr + MR[4] * rg + MR[5] * rb);
      A[p + 2] = enc(ML[6] * lr + ML[7] * lg + ML[8] * lb + MR[6] * rr + MR[7] * rg + MR[8] * rb);
    }
    ctx.putImageData(a, 0, 0);
  }

  /* Cote a cote croise : la vue de l'oeil DROIT a gauche. Chaque moitie montre
     le centre de sa vue, sans la deformer. */
  function cross() {
    var gap = D * 0.55;
    compose(vctx, 0.5, gap, false);
    compose(vctx2, -0.5, gap, false);
    var half = Math.floor(W / 2), sx = Math.floor((W - half) / 2);
    ctx.fillStyle = '#0b0c10'; ctx.fillRect(0, 0, W, H);
    ctx.drawImage(view2, sx, 0, half, H, 0, 0, half, H);
    ctx.drawImage(view, sx, 0, half, H, W - half, 0, half, H);
    ctx.fillRect(half - Math.max(1, W / 480), 0, Math.max(2, W / 240), H);
  }

  function still() {
    if (!build()) return;
    if (mode === 'dubois') anaglyph();
    else if (mode === 'cross') cross();
    else if (mode === 'depth') compose(ctx, 0, 0, true);
    else compose(ctx, eye, D, false);
  }

  function frame(now) {
    raf = 0;
    if (!visible || document.hidden || mode !== 'wiggle') return;
    var goal = target !== null ? target : (calme ? 0 : Math.cos(2 * Math.PI * ((now - t0) % SWAY_MS) / SWAY_MS));
    eye += (goal - eye) * (target !== null ? 0.35 : 1);
    if (!build()) return;
    compose(ctx, eye, D, false);
    if (!calme || target !== null) raf = requestAnimationFrame(frame);
  }
  function wake() {
    if (mode === 'wiggle' && visible && !document.hidden && !raf) raf = requestAnimationFrame(frame);
  }

  /* Le doigt ou la souris prennent la place du balancement : la scene tourne
     sous le geste, comme l'apercu de l'atelier suit l'inclinaison. */
  function aim(ev) {
    if (mode !== 'wiggle') return;
    var r = demo.getBoundingClientRect();
    target = Math.max(-1, Math.min(1, 1 - 2 * (ev.clientX - r.left) / r.width));
    wake();
  }
  demo.addEventListener('pointermove', aim);
  demo.addEventListener('pointerdown', aim);
  demo.addEventListener('pointerleave', function () { target = null; t0 = performance.now() - SWAY_MS * Math.acos(Math.max(-1, Math.min(1, eye))) / (2 * Math.PI); wake(); });
  demo.addEventListener('pointercancel', function () { target = null; wake(); });

  var buttons = root.querySelectorAll('[data-sxa-mode]');
  var hint = root.querySelector('[data-sxa-hint]');
  var legend = root.querySelector('[data-sxa-legend]');
  for (var b = 0; b < buttons.length; b++) {
    buttons[b].addEventListener('click', function () {
      mode = this.getAttribute('data-sxa-mode');
      for (var k2 = 0; k2 < buttons.length; k2++) buttons[k2].setAttribute('aria-pressed', String(buttons[k2] === this));
      if (hint) hint.textContent = HINTS[mode];
      if (legend) legend.textContent = mode === 'depth' ? 'Profondeur' : 'Calculé en direct';
      demo.style.cursor = mode === 'wiggle' ? '' : 'default';
      if (mode === 'wiggle') wake(); else still();
    });
  }

  /* La vignette « signature des images » montre la meme scene, recadree au
     carre, la signature posee dessus comme sur une image exportee. */
  var thumbCv = root.querySelector('[data-sxa-thumb]');
  function thumb() {
    if (!thumbCv || !build()) return;
    var tw = thumbCv.clientWidth, th = thumbCv.clientHeight;
    if (!tw || !th) return;
    var ratio = Math.min(window.devicePixelRatio || 1, 2);
    thumbCv.width = Math.round(tw * ratio); thumbCv.height = Math.round(th * ratio);
    compose(vctx, 0, D, false);
    var side = Math.min(W, H), sx = Math.min(W - side, Math.round(W * 0.3));
    thumbCv.getContext('2d').drawImage(view, sx, 0, side, side, 0, 0, thumbCv.width, thumbCv.height);
  }

  var resizeTimer = 0;
  window.addEventListener('resize', function () {
    clearTimeout(resizeTimer);
    resizeTimer = setTimeout(function () { layers = []; W = 0; still(); thumb(); wake(); }, 150);
  });
  document.addEventListener('visibilitychange', wake);

  if ('IntersectionObserver' in window) {
    /* La DERNIERE entree fait foi : un saut de page (ancre, retour arriere)
       livre parfois « cache » puis « visible » dans le meme appel, et lire la
       premiere laissait la demonstration figee pour de bon. */
    new IntersectionObserver(function (es) {
      visible = es[es.length - 1].isIntersecting;
      if (visible) { still(); wake(); }
    }, { threshold: 0 }).observe(demo);
    if (thumbCv) {
      var io3 = new IntersectionObserver(function (es) {
        if (es[es.length - 1].isIntersecting) { thumb(); io3.disconnect(); }
      }, { threshold: 0 });
      io3.observe(thumbCv);
    }
  } else {
    visible = true; still(); thumb(); wake();
  }
})();
</script>
				</div>
				</div>
				</div>
		<div class="elementor-element elementor-element-bdab5e9 e-con-full e-flex wpr-particle-no wpr-jarallax-no wpr-parallax-no wpr-sticky-section-no wpr-column-slider-no wpr-equal-height-no e-con e-parent" data-id="bdab5e9" data-element_type="container" data-e-type="container">
				<div class="elementor-element elementor-element-87002b9 elementor-widget elementor-widget-html" data-id="87002b9" data-element_type="widget" data-e-type="widget" data-widget_type="html.default">
				<div class="elementor-widget-container">
					<!--
// StereoptiX, 3D & ANAGLYPH MODE for cameras, © All rights reserved.
// PCdlabs · Dev-Xprmnts · VR_Xprmnts · Present Compound Design     ║
// ║ Alban DESBARAX - Designer 360° / Creative Technologist         ║
// ║ Toulouse, FRANCE                                               ║
// ║                                                                ║
// ║   · Expertise & Support 2D, 3D, AR, VR, XR, AI                 ║
// ║   · Product Design & Industrial Design                         ║
// ║   · Digital communication                                      ║
// ║   · Immersive experiences  -ᯅ- ✔️                             ║
// ║                                                                ║                   
// · 🡺 https://presentcomposedesign.fr/      
//
//                                                       ++++++++++                                    
//                                                    =+++++++++===============                        
//                                                    +++++++++++++=====================+              
//                                                   ++++++++   *+++++=======================+*#       
//                                                    ==++++*          *++++==============*#%%%%       
//                                                     +==++=               *+======+*%%%%%%%%%%       
//       ==-===--=**+**                                                      @%%#%%%%%#-...=%%%%       
//      ==================+***                                          ##%%%%%%%%+:.......=%%%%       
//      =================------=+++***                           ##%#%%%%%%%%%%%%+::.......*%%%        
//      ====================-----------=+*++**             %%%%%%%%%%##%%%%%%%%%%=:::::::..#%%%        
//      -======     +=+==========-------------===+*   #%%%%%%%%#+==----=%%%%%%%%%=.......:#%%%@        
//       ----==            +======------------------=#%%%%%+=----------+%%%%%%%%%=..:+*%%%%%%          
//         ===+               ======----------------=#%%%%=------------#%%%%**%%%%%%%%%#+=             
//                              =======-------------=#%%%*=------------#%%%@  =*%%%***                 
//                                @+===---------=====#%%%*------------*%%%                             
//                                   +--------=======#%%%*------==*%%%%%%                              
//                                     =-----=======+#%%%#=-+#%%%%%%##%                                
//                                        ---=======+#%%%%%%%%###*#                                    
//                                               ===+##%%%%##@                                         
//                                                     +*                                              
//
// @@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@//*
// @@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@%#*++==------===**%%@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@
// @@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@#++-::::::::::::::::::::::-=*%@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@
// @@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@#+-::::::::::::::::::::::::::::::::=*%@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@
// @@@@@@@@@@@@@@@@@@@@@@@@@@@@#+::::::::::::::::::::::::::::::::::::::::=%@@@@@@@@@@@@@@@@@@@@@@@@@@@@
// @@@@@@@@@@@@@@@@@@@@@@@@@%+:::::::::::::::::=++***+=-::::::::::::::::::::=%@@@@@@@@@@@@@@@@@@@@@@@@@
// @@@@@@@@@@@@@@@@@@@@@@@#=::::::::::::::::+%@@@@@@@@@@%+-:::::::::::::::::::=#@@@@@@@@@@@@@@@@@@@@@@@
// @@@@@@@@@@@@@@@@@@@@@#-::::::::::::::::#@@@@@@@@@@@@@@@@%-:::::::::::::::::::=#@@@@@@@@@@@@@@@@@@@@@
// @@@@@@@@@@@@@@@@@@@%=::::::::::::::::*@@@@@@**==-=+##@@@@@*-:::::::::::::::::::=%@@@@@@@@@@@@@@@@@@@
// @@@@@@@@@@@@@@@@@=:::::::::::::::::%@@@@@+::::::::::-*@@@@#-::::::::::::::::::::=@@@@@@@@@@@@@@@@@@@
// @@@@@@@@@@@@@@@@#::::::::::::::::::%@@@@=::::::::::::::-%@@@#-:::::::::::::::::::::#@@@@@@@@@@@@@@@@
// @@@@@@@@@@@@@@@=::::::::::::::::::*@@@@=::::::::::::::::-%@@@*::::::::::::::::::::::=@@@@@@@@@@@@@@@
// @@@@@@@@@@@@@%-::::::::::::::::::-@@@@=::::::::::::::::::-%@@@-::::::::::::::::::::::-%@@@@@@@@@@@@@
// @@@@@@@@@@@@#::::::::::::::::::::*@@@#::::::::::::::::::::=@@@*::::::::::::::::::::::::*@@@@@@@@@@@@
// @@@@@@@@@@@#:::::::::::::::::::::%@@@+::::::::::::::::::::-@@@%:::::::::::::::::::::::::*@@@@@@@@@@@
// @@@@@@@@@@+::::::::::::::::::::::@@@@-:::::::::::::::::::::%@@@::::::::::::::::::::::::::*@@@@@@@@@@
// @@@@@@@@@*:::::::::::::::::::::::@@@@=:::::::::::::::::::::@@@@:::::::::::::::::::::::::::*@@@@@@@@@
// @@@@@@@@%::::::::::::::::::::::::@@@@*:::::::::::::::::::::@@@%::::::::::::::::::::::::::::*@@@@@@@@
// @@@@@@@%:::::::::::::::::::::::::@@@@%::::::::::::::::::::+@@@*:::::::::::::::::::::::::::::%@@@@@@@
// @@@@@@@::::::::::::::::::::::::::@@@@@*::::::::::::::::::-@@@@::::::::::::::::::::::::::::::-@@@@@@@
// @@@@@@=::::::::::::::::::::::::::@@@@@@*::::::::::::::::-@@@@+:::::::::::::::::::::::::::::::*@@@@@@
// @@@@@%:::::::::::::::::::::::::::@@@@@@@*::::::::::::::-%@@@#:::::::::::::::::::::::::::::::::*@@@@@
// @@@@@::::::::::::::::::::::::::::@@@@@@@@@*::::::::::+@@@@@*::::::::::::::::::::::::::::::::::-@@@@@
// @@@@*::::::::::::::::::::::::::::@@@#=@@@@@@%#*+=**%@@@@@@=::::::::::::::::::::::::::::::::::::*@@@@
// @@@@:::::::::::::::::::::::::::::@@@#::*@@@@@@@@@@@@@@@@*:::::::::::::::::::::::::::::::::::::::@@@@
// @@@*:::::::::::::::::::::::::::::@@@#::::=*@@@@@@@@@%#=:::::::::::::::::::::::::::::::::::::::::#@@@
// @@@=:::::::::::::::::::::::::::::@@@#::::::::-==+=-:::::::::::::::::::::::::::::::::::::::::::::=@@@
// @@@::::::::::::::::::::::::::::::@@@#:::::::::::::::::::::::::::::::::::::::::::::::::--:::::::::@@@
// @@*::::::::::::::::::::::::::::::@@@#:::::::::+######*:::::::::::::::::::::::::::::::+@=:::::::::#@@
// @@*::::::::::::::::::::::::::::::@@@#:::--::::===+*+==:::::=-:::::::=-::::::-::::::::+@=:::::::::+@@
// @@:::::::::::::::::::::::::::::::@@@#::+@#@@::-#@@%@%=::=@@@@+:::+@@@@@+-::@@@@%*-::#@@%#:::::::::@@
// @@:::::::::::::::::+*##%%#*=-::::@@@#::+@@=::-%@:::-*@=:%@-:=:::*@*:::-@*::@@-:=@%::=*@*=:::::::::@@
// @@::::::::::::::+%@@@@@@@@@@@%*-:@@@#::+@*:::*@@@@@@@@#:+@%*-:::@@@@@@@@@-:@%:::#@:::+@=::::::::::@@
// @%::::::::::::*@@@@@@@@@@@@@@@@@#+@@#::+@+:::+@=-------:::=%@*::@%-------::@%:::#@:::+@=::::::::::%@
// @%::::::::::-@@@@@@++-::::-=#@@@@@+*#::+@+:::-@%=-:+%%-:-=::#@::*@*-::+%=::@%:::#@:::+@=::::::::::#@
// @%:::::::::=@@@@%+::::::::::::#@@@@**::+@+::::-#@@@@%=::#@%%@+:::+@@@@@*:::@%:::#@:::+@=::::::::::%@
// @%::::::::-@@@@+:::::::::::::::-@@@@+:::-::::::::--:::::::=-:::::::-=-:::::--:::-=----=-::::::::::%@
// @@:::::::-@@@@*:::::::::::::::::-%%%*:::::::::::::::::::::::::::::::::::::::::::+%%%%%%#::::::::::@@
// @@:::::::*@@@#:::::::+#@%*-::::::=+*#*=+#*=-:::::+#%%#-::::::=#%%#=::::-#@@#-::::=##%#+-::::::::::@@
// @@-::::::@@@@-:::::-%@#+*%@*:::::%@#+#@@+*@*::::%@+==#@*::::%@#+=%@*-::%@-=*=:::*@*+=+@%-::::::::-@@
// @@+:::::-@@@@::::::#@=::::#@=::::%@::=@*::#@-::*@=::::-@+::*@*::::*@*::*@*-::::-@@####%@#::::::::*@@
// @@#:::::-@@@*::::::@@:::::=@*::::%@::=@*::#@-::%@::::::@*::%@-::::-@%:::=%@%-::*@#******+::::::::*@@
// @@@-::::-@@@%::::::#@+::::%@-::::%@::=@*::#@-::@@-::::=@-::*@*::::*@*:::-::@%::=@*::::-=-::::::::@@@
// @@@+:::::@@@@-::::::%@%*#@@+:::::%@::=@*::#@-::@@@#=+#@+::::*@%*+@@*:::#@*+@*:::*@%*+%@%::::::::-@@@
// @@@#:::::#@@@+:::::::=*##+-::::::+*::-*=::+*:::@%=*%#*-::::::=*%#*-:::::=*#+:::::-*##*=--=::::::*@@@
// @@@@-::::=@@@@-::::::::::::::::::=**+::::::::::@%:::::::::::::::::::::::-==++**##%%@@@@@@@-::::-@@@@
// @@@@*:::::*@@@@-::::::::::::::::+@@@#::::::::::::::::::::-==++**##=-#@@@@@@@@@@@@@@@@@@@@@=::::*@@@@
// @@@@@-:::::#@@@@+-:::::::::::::*@@@@::::::-==++--##%@@@@@@@@@#*#@@%%@@@@@@@@@@@#@@@@@*#@@@+:::-@@@@@
// @@@@@%::::::*@@@@@+-:::::::::+@@@@%:=@@@@@@@@@@==@@@**%@@@@*-#@*-@@*@@@*-+**@@@:%@@==@++@@*:::%@@@@@
// @@@@@@*::::::=@@@@@@@%%**##@@@@@@=::=@@@@#-:--=-=@@=+@+=@@@:%@@@=+@-*@*-@@@+:@@=#@:*@@%-@@#::+@@@@@@
// @@@@@@@-:::::::+%@@@@@@@@@@@@@@#-::::@@@+-%@@@*--@@:@@=*@@@%=*%@@@@*=@-*@@@*:+@=+=#@@@%:@@%:-@@@@@@@
// @@@@@@@@-::::::::=*%@@@@@@@##-:::::::@@@:#@@@@@*:@@:%==@@@@@@%+-%@@#-@*+@@@:+:@*:*@@@@@:%@@-@@@@@@@@
// @@@@@@@@#-:::::::::::::-:::::::::::::@@%:%@@@@@*-@@-#@@@#-@*%@@@-#@@:@@#=+:%@-#@:@@@@@@*=@@%@@@@@@@@
// @@@@@@@@@*:::::::::::::::::::::::::::#@@--@@@@%:*@@%*+*=*@@=+@@@=+@@-#@@@@@@@=#@#@@@@@@@@@@@@@@@@@@@
// @@@@@@@@@@*-:::::::::::::::::::::::::#@@@+-==-:#@@@@@@@@@@@@#++*#@@@@@@@#@@@%:@@@@@@@@@@@@@@@@@@@@@@
// @@@@@@@@@@@*-::::::::::::::::::::::::+@@@@@%%@@@@@@@@@@@@@@@@@@@@@@@@@@@@-=-:+**++==--::%@@@@@@@@@@@
// @@@@@@@@@@@@#-:::::::::::::::::::::::=@@@@@@@@@@@@@@@@@@@@@%%##**++=---::::::::::::::::%@@@@@@@@@@@@
// @@@@@@@@@@@@@@-::::::::::::::::::::::-@@@@@@%###**++=--::::::::::::::::::::::::::::::-%@@@@@@@@@@@@@
// @@@@@@@@@@@@@@@+::::::::::::::::::::::--::::::::::::::::::::::::::::::::::::::::::::+@@@@@@@@@@@@@@@
// @@@@@@@@@@@@@@@@%-::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::-%@@@@@@@@@@@@@@@@
// @@@@@@@@@@@@@@@@@@+-:::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::+@@@@@@@@@@@@@@@@@@
// @@@@@@@@@@@@@@@@@@@%=::::::::::::::::::::::::::::::::::::::::::::::::::::::::::+%@@@@@@@@@@@@@@@@@@@
// @@@@@@@@@@@@@@@@@@@@@%=::::::::::::::::::::::::::::::::::::::::::::::::::::::=%@@@@@@@@@@@@@@@@@@@@@
// @@@@@@@@@@@@@@@@@@@@@@@%=-:::::::::::::::::::::::::::::::::::::::::::::::::+%@@@@@@@@@@@@@@@@@@@@@@@
// @@@@@@@@@@@@@@@@@@@@@@@@@@*-:::::::::::::::::::::::::::::::::::::::::::::#@@@@@@@@@@@@@@@@@@@@@@@@@@
// @@@@@@@@@@@@@@@@@@@@@@@@@@@@%+-:::::::::::::::::::::::::::::::::::::::+%@@@@@@@@@@@@@@@@@@@@@@@@@@@@
// @@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@%*=-:::::::::::::::::::::::::::::::+#@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@
// @@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@%**=-:::::::::::::::::::::=+#@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@
// @@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@%%**++=====+++*##@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@
// @@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@#****+++++****##%@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@
// @@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@**+-::::::::::::::::::::==*#%@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@
// @@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@*+-::::::::::::::::::::::::::::::==#%@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@
// @@@@@@@@@@@@@@@@@@@@@@@@@@@@@#+-::::::::::::::::::::::::::::::::::::::=*%@@@@@@@@@@@@@@@@@@@@@@@@@@@
// @@@@@@@@@@@@@@@@@@@@@@@@@@@*-::::::::::::::::::::::::::::::::::::::::::::=*%@@@@@@@@@@@@@@@@@@@@@@@@
// @@@@@@@@@@@@@@@@@@@@@@@@#+:::::::::::::::++****%%@@@@@%%##**=--:::::::::::::=#@@@@@@@@@@@@@@@@@@@@@@
// @@@@@@@@@@@@@@@@@@@@@@*=:::::::::::::+*%@@@@@@@@@@@@@@@@@@@@@@@#*=-:::::::::::=#@@@@@@@@@@@@@@@@@@@@
// @@@@@@@@@@@@@@@@@@@@#=:::::::::::+*%@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@#=-::::::::::=#@@@@@@@@@@@@@@@@@@
// @@@@@@@@@@@@@@@@@%=::::::::::+%@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@*=::::::::::=%@@@@@@@@@@@@@@@@@
// @@@@@@@@@@@@@@@@*::::::::::*%@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@#+-:::::::::*%@@@@@@@@@@@@@@@
// @@@@@@@@@@@@@@%=::::::::=*@@@@@@@@@@@@@@%#*********#%%@@@@@@@@@@@@@@@@@@@%+-::::::::=%@@@@@@@@@@@@@@
// @@@@@@@@@@@@@#:::::::::#@@@@@@@@@@@**+-::::::::::::::::-+#%@%@@@@@@@@@@@@@@%+-::::::::*@@@@@@@@@@@@@
// @@@@@@@@@@@@+::::::::+@@@@@@@@@@*-::::::::::::::::::::::#@@@##%%@@@@@@@@@@@@@@+::::::::*%@@@@@@@@@@@
// @@@@@@@@@@@=:::::::=#@@@@@@@@@+::::::::::::::::::::::::-*@@@@@@#%%@@@@@@@@@@@@@*-:::::::=%@@@@@@@@@@
// @@@@@@@@@@=:::::::*@@@@@@@@@%=::::::::::::::::::::::::::*@@@@@@@@##%@@@@@@@@@@@@%+:::::::=%@@@@@@@@@
// @@@@@@@@@%=:::::::#@@@@@@@@@%:::::::::::::::::::::::::::+@@@@@@@@@@@%%@@@@@@@@@@@@@*-::::::-%@@@@@@@
// @@@@@@@@@=::::::-#@@@@@@@@@%-:::::::::::::::::::::::::==#@@@@@@@@@@@@%#@@@@@@@@@@@@@#-::::::=%@@@@@@
// @@@@@@@@=::::::-%@@@@@@@@@@=:::::::::::::::::::::::::*=#%@@@@@@@@@@@@@%#@@@@@@@@@@@@@#-::::::*@@@@@@
// @@@@@@@*::::::-#@@@@@@@@@@*::::::::::::::::::::::::*=#+%@@@%@@@@@@@@@@@%%@@@@@@@@@@@@@%-::::::*@@@@@
// @@@@@@%:::::::#@@@@@@@@@@%:::::::::::::::::::---:::-:-+*@%%@@@@@@@@@@@@@*%@@@@@@@@@@@@@%-::::::%@@@@
// @@@@@@-::::::#@@@@@@@@@@@-::::::::::::::::::::+=#-=#*#=+%%@@@@@@@@@@@@@@@%@@@@@@@@@@@@@@#-:::::-%@@@
// @@@@@*::::::*@@@@@@@@@@@#:::::::::::::::::::::-++=#==#+-%%%@@@@@@@@@@@@@@%@@@@@@@@@@@@@@@*::::::*@@@
// @@@@%::::::-@@@@@@@@@@@@=::::::::::::::::::::::::+=++#%=%*@@@@@@@@@@@@@@@@*@@@@@@@@@@@@@@@-::::::%@@
// @@@@*::::::#@@@@@@@@@@@%:::::::::::::::::::::::::+#:+@%+%@@@@@@@@@@@@@@@@@@#@@@@@@@@@@@@@@%-:::::*@@
// @@@%::::::=@@@@@@@@@@@@*::::::::::::::::::::::::-#*-#+=@@%@%@@@@@@@@@@@@@@@#@@@@@@@@@@@@@@@*::::::%@
// @@@*::::::%@@@@@@@@@@@@=:::::::::::::::::::::::+=#@++=+%@@@@@@@@@@@@@@#@@@+-%@@@@@@@@@@@@@@@-:::::*@
// @@::::::*@@@@@@@@@@@@@-:::::::::::::::::::::::-**+@+*=%@%@@@@@@@@@@@#@@%=::*@@@@@@@@@@@@@@@*::::::%@
// @%::::::#@@@@@@@@@@@@@::::::::::::::::::::::::::==#@%+@%+*%%@@@@@@@#==+::=-#@@@@@@@@@@@@@@@#::::::*@
// @*:::::-@@@@@@@@@@@@@@::::::::::::::::::::::::::::***%-@*@%%@@@@@@@%%=+*%%%@@@@@@@@@@@@@@@@@-:::::+@
// @=:::::*@@@@@@@@@@@@@@-::::::::::::::::::::::::::-+@+=+*%*%@@@@@@@%@@@%*=:*@@@@@@@@@@@@@@@@@+:::::=@
// %::::::*@@@@@@@@@@@@@@*::::::::::::::::::::::-=-=+#**#=%+@@*@@@@@@@@@@@+=**%@@@@@@@@@@@@@@@@#::::::%
// %::::::%@@@@@@@@@@@@@@#:::::::::::::::::::+#@++@%@@#*+*+#=@@@@@@@@@@@@@@*%@#%@@@@@@@@@@@@@@@#::::::#
// *::::::@@@@@@@@@@@@@@@@-:::::::::::::::::*@@@:::%@@@@*---**@@@@@@@@@@@@@@@@@@%@@@@@@@@@@@@@@%::::::*
// *::::::@@@@@@@@@@@@@@@@+:::::::::::::::::@@@@%::*@@@@@+-:=%+@@@@@@@@@@@@@@@@@@%@@@@@@@@@@@@@@::::::*
// *:::::-@@@@@@@@@@@@@@@@#:::::::::::::::::%=%@@-:+@@@@@*::%*@@@@@@@@@@@@@@@@@@@@%@@@@@@@@@@@@@-:::::*  
// *:::::=@@@@@@@@@@@@@@@@@+::::::::::::::::*:-@*::*-*@@@@-:-=%@%@@@@@@@@@@@@@@@@@#@@@@@@@@@@@@@::::::*
// *:::::-@@@@@@@@@@@@@@@@@%-:::::::::::::::*+:%@@:::-@@@@-:=+%%@%@@@@@@@@@@@*@@@@@@@@@@@@@@@@@@::::::*
// *::::::%@@@@@@@@@@@@@@@@@*::::::::::::::::*=-@*::::%@@@+:+*@@@%@@@@@@@@@@@%@@%#@@@@@@@@@@@@@%::::::*
// #::::::%@@@@@@@@@@@@@@@@@%-::::::::::::::::#+**:::::%@@*:-=%@*@@@@@@@@@@@#**%@@@@@@@@@@@@@@@%::::::#
// @::::::*@@@@@@@@@@@@@@@@@@*::::::::::::::::-%@@@@@**@@%=::=+@@@@@%@@@@@@@@@%@@@@@@@@@@@@@@@@*::::::@
// @-:::::*@@@@@@@@@@@@@@@@@@@=:::::::::::::::::#@@@@@@@@%:::+=%@@@@@@@@@@@@@@@%@@@@@@@@@@@@@@@*:::::-@
// @+:::::=@@@@@@@@@@@@@@@@@@@%-:::::::::::::::::*%@@@*%@-:::-*=*%@@@@@@@@@@@@@%@@@@@@@@@@@@@@@::::::*@
// @*::::::%@@@@@@@@@@@@@@@@@@@*:::::::::::::::::::=%%+#@=:::=*++@@@@@@@@@@@@@#@@@@@@@@@@@@@@@%::::::*@
// @@-:::::*@@@@@@@@@@@@@@@@@@@#::::::::::::::::----:=###::::=**%%@@@@@@@@@@@+%@@@@@@@@@@@@@@@@+:::::-@
// @@+:::::-%@@@@@@@@@@@@@@@@@@@-:::::::::::::=@@@@@+::::::::-*#%%%@@@@@@@@@%*%@@@@@@@@@@@@@@%::::::*@@
// @@#::::::*@@@@@@@@@@@@@@@@@@@+::::::::::::::%@@@@@-:::::::+%@%%%@@@@@@@@@%@@@@@@@@@@@@@@@@+::::::%@@
// @@@+::::::%@@@@@@@@@@@@@@@@@@*::::::::::::::*@@@@@-:::::::-+#@%%@%@@@@@@@%@@@@@@@@@@@@@@@%::::::=@@@
// @@@%-:::::*@@@@@@@@@@@@@@@@@@*::::::::::::::#@@@@@::::::::::*@%**%@@@@@@@#@@@@@@@@@@@@@@@=::::::%@@@
// @@@@*::::::%@@@@@@@@@@@@@@@@@*::::::::::::::*@@@@@#-::::::::===+-%%@@@@@@%%@@@@@@@@@@@@@*::::::*@@@@
// @@@@@-:::::-%@@@@@@@@@@@@@@@@+::::::::::::::=#%@@@@*--#=::::::--:=@@%%%@@%@@@@@@@@@@@@@#::::::-@@@@@
// @@@@@#-:::::-%@@@@@@@@@@@@@@@=::::::::::::::==@%@%%%#+%%*:::::::-=#%%*%@#*@@@@@@@@@@@@%:::::::#@@@@@
// @@@@@@*::::::*%@@@@@@@@@@**+-:::::::::::::::@#@@%@@@%#%@*::::-::::==::%%*@@@@@@@@@@@@%=::::::*@@@@@@
// @@@@@@@+::::::*@@@@@@@@*::::::::::::::::::-##%%@#@@@@%%%*-==*%:-::==+**@@@@@@@@@@@@@%=::::::=@@@@@@@
// @@@@@@@@-::::::*%@@@@*::::::::::::::::::::::%%%%%@@@@@@@#%@@%%@@@@@@@@@@@@@@@@@@@@@%=::::::=@@@@@@@@
// @@@@@@@@%-::::::=%@@%:::::::::::::::::::::#@%%@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@#:::::::-@@@@@@@@@
// @@@@@@@@@@-::::::-%@#::::::::::::::::::::+@@@@@%@@@@@@@@@@@%%@@@@@@@@@@@@@@@@@@@@*:::::::=@@@@@@@@@@
// @@@@@@@@@@@-:::::::*@-:::::::::::::::::::-%@@@@@@@@@@@@@@@@*@@@@@@@@@@@@@@@@@@@@=:::::::=@@@@@@@@@@@
// @@@@@@@@@@@@+:::::::==:::::::::::::::::::-%@@@@@@@@@@@@@@@%@@@@@@@@@@@@@@@@@@@#-:::::::+@@@@@@@@@@@@
// @@@@@@@@@@@@@*-:::::::::::::::::::::::::::=@@@@@@@@@@@@@@%#@@@@@@@@@@@@@@@@@%=::::::::#@@@@@@@@@@@@@
// @@@@@@@@@@@@@@#-:::::::::::::::::::::::::::*@@@@@@@@@@@@#@@@@@@@@@@@@@@@@@@+::::::::=#@@@@@@@@@@@@@@
// @@@@@@@@@@@@@@@@*-::::::::::::::::::::::::::*%@@@@@@@@@@*@@@@@@@@@@@@@@@@+:::::::::*@@@@@@@@@@@@@@@@
// @@@@@@@@@@@@@@@@@%=:::::::::::::::::::::::::::*%@@@@@@@@#@@@@@@@@@@@@@*=:::::::::=%@@@@@@@@@@@@@@@@@
// @@@@@@@@@@@@@@@@@@@#-:::::::::::::::::::::::::::*%@@@@@@@%#@@@@@@@@*+-:::::::::=#@@@@@@@@@@@@@@@@@@@
// @@@@@@@@@@@@@@@@@@@@@#-:::::::::::::::::::::::::::*%@@@@@@@%@@@@*+:::::::::::=#@@@@@@@@@@@@@@@@@@@@@
// @@@@@@@@@@@@@@@@@@@@@@@@#=-::::::::::::::::::::::::::+%@@@@%**--::::::::::::+#@@@@@@@@@@@@@@@@@@@@@@
// @@@@@@@@@@@@@@@@@@@@@@@@@@%*-:::::::::::::::::::::::::::::::::::::::::::::*%@@@@@@@@@@@@@@@@@@@@@@@@
// @@@@@@@@@@@@@@@@@@@@@@@@@@@@#*-:::::::::::::::::::::::::::::::::::::::+%@@@@@@@@@@@@@@@@@@@@@@@@@@@@
// @@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@##=-:::::::::::::::::::::::::::::::+*%@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@
// @@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@##*=-::::::::::::::::::::-+**%@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@
// @@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@%##****+++++****%%@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@
// @@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@
// @@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@
-->

<!--
  ============================================================================
  STEREOPTIX · BLOC SEO ET GEO
  Second bloc HTML personnalise Elementor, a placer JUSTE SOUS l'article,
  sur https://presentcomposedesign.fr/stereoptix-infos/

  CE QU'IL CONTIENT
    1. Une definition en une phrase, vraie hors de tout contexte.
    2. Une fiche de faits, visible, compacte, citable telle quelle.
    3. Une foire aux questions, visible, dix questions reellement posees.
    4. Un bloc JSON-LD qui decrit la page, l'application, ses trois offres,
       l'auteur et l'entreprise, et relie chaque entite a une adresse
       verifiable.

  CE QU'IL NE PEUT PAS CONTENIR, ET POURQUOI
    Un widget HTML d'Elementor s'insere dans le CORPS de la page. Un <title>
    ou un <meta name="description"> poses ici seraient decoratifs : Google ne
    lit la description que dans le <head>. Ces champs se reglent dans Yoast.
    Les valeurs a y coller sont dans stereoptix-infos-reglages-seo.md.

  UNE SEULE CHOSE A REMPLACER (chercher "A-REMPLACER")
    L'adresse de l'image de partage, une fois stereoptix-partage-1200x630.jpg
    televersee dans la mediatheque WordPress.

  A VERIFIER UNE FOIS EN LIGNE
    · Coller l'adresse de la page dans https://validator.schema.org/
    · Puis dans https://search.google.com/test/rich-results
    · Toutes les adresses de ce bloc repondaient le 7 octobre 2026.
  ============================================================================
-->

<style>
/* ===========================================================================
   Tout est enferme sous #sxa-faq, comme l'article sous #sxa : un bloc insere
   dans un theme ne doit jamais pouvoir repeindre ce qui l'entoure, ni en
   recevoir.
   =========================================================================== */
#sxa-faq {
  --f-blue: #1001ef;
  --f-ink: #0d1020;
  --f-mid: #5d6479;
  --f-line: #e4e6f0;
  --f-wash: #f7f8fc;

  box-sizing: border-box;
  margin: 0; padding: 72px 0;
  font-family: "Inter Tight", "Helvetica Neue", Arial, system-ui, sans-serif;
  color: var(--f-ink); background: #fff;
  line-height: 1.55;
  -webkit-font-smoothing: antialiased;
}
#sxa-faq *, #sxa-faq *::before, #sxa-faq *::after { box-sizing: border-box; }
#sxa-faq p, #sxa-faq h2, #sxa-faq h3, #sxa-faq dl, #sxa-faq dt, #sxa-faq dd { margin: 0; }
/* Un theme vise souvent les balises elles-memes : chaque propriete qu'il aime
   poser est reprise ici, et les classes du bloc l'emportent ensuite. */
#sxa-faq h2, #sxa-faq h3, #sxa-faq p, #sxa-faq dt, #sxa-faq dd, #sxa-faq strong {
  font-family: inherit; color: inherit; text-transform: none;
}
#sxa-faq p, #sxa-faq dd { font-size: inherit; line-height: 1.55; }
#sxa-faq a { color: var(--f-blue); text-decoration: none; font-weight: 600; }
#sxa-faq a:hover { text-decoration: underline; }

#sxa-faq .f-wrap { width: 100%; max-width: 1060px; margin: 0 auto; padding: 0 20px; }

#sxa-faq .f-kicker {
  display: inline-flex; align-items: center; gap: 8px;
  font-size: 11.5px; font-weight: 700; letter-spacing: .16em; text-transform: uppercase;
  color: var(--f-blue); margin-bottom: 14px;
}
#sxa-faq .f-kicker::before { content: ""; width: 24px; height: 2px; background: currentColor; }
#sxa-faq h2 { font-size: clamp(1.5rem, 3.2vw, 2.1rem); font-weight: 800; line-height: 1.12; letter-spacing: -.03em; }
#sxa-faq h3 { font-size: 1rem; font-weight: 700; letter-spacing: -.01em; margin-bottom: 6px; line-height: 1.35; }
#sxa-faq .f-lede { font-size: clamp(1.02rem, 1.9vw, 1.18rem); color: var(--f-mid); max-width: 62ch; margin-top: 12px; }
#sxa-faq .f-lede strong { color: var(--f-ink); }

/* ------------------------------------------------------------ fiche de faits
   Un tableau court, sans phrase, ou chaque ligne se lit seule. C'est la forme
   que les moteurs generatifs reprennent le plus volontiers, parce qu'elle ne
   demande aucun contexte pour etre exacte. */
#sxa-faq .f-facts {
  display: grid; grid-template-columns: repeat(2, minmax(0, 1fr)); gap: 0;
  margin-top: 30px; border: 1px solid var(--f-line); border-radius: 18px; overflow: hidden;
  background: var(--f-wash);
}
#sxa-faq .f-facts > div {
  padding: 15px 18px; border-bottom: 1px solid var(--f-line); background: #fff;
}
#sxa-faq .f-facts > div:nth-child(odd) { border-right: 1px solid var(--f-line); }
#sxa-faq .f-facts dt {
  font-size: 10.5px; font-weight: 700; letter-spacing: .12em; text-transform: uppercase;
  color: var(--f-mid); margin-bottom: 4px;
}
#sxa-faq .f-facts dd { font-size: 14.5px; font-weight: 600; margin: 0; }

/* -------------------------------------------------------------------- foire */
#sxa-faq .f-qa { margin-top: 44px; display: grid; gap: 12px; }
#sxa-faq .f-qa article {
  border: 1px solid var(--f-line); border-radius: 16px; padding: 20px 22px; background: #fff;
  transition: border-color .2s ease, box-shadow .2s ease;
}
#sxa-faq .f-qa article:hover { border-color: rgba(16,1,239,.28); box-shadow: 0 14px 32px rgba(13,16,32,.07); }
#sxa-faq .f-qa p { color: var(--f-mid); font-size: 14.5px; max-width: 78ch; }
#sxa-faq .f-qa p + p { margin-top: 8px; }

/* ------------------------------------------------------------------- liens */
#sxa-faq .f-links {
  margin-top: 40px; padding-top: 26px; border-top: 1px solid var(--f-line);
  display: grid; grid-template-columns: repeat(3, minmax(0, 1fr)); gap: 14px;
}
#sxa-faq .f-links a {
  display: block; border: 1px solid var(--f-line); border-radius: 14px; padding: 16px 18px;
  font-weight: 700; font-size: 14.5px; text-decoration: none;
  transition: transform .18s ease, border-color .18s ease;
}
#sxa-faq .f-links a:hover { transform: translateY(-2px); border-color: rgba(16,1,239,.35); text-decoration: none; }
#sxa-faq .f-links span { display: block; font-weight: 500; font-size: 12.5px; color: var(--f-mid); margin-top: 3px; }

@media (max-width: 760px) {
  #sxa-faq { padding: 52px 0; }
  #sxa-faq .f-facts { grid-template-columns: 1fr; }
  #sxa-faq .f-facts > div:nth-child(odd) { border-right: 0; }
  #sxa-faq .f-links { grid-template-columns: 1fr; }
}
@media (prefers-reduced-motion: reduce) {
  #sxa-faq .f-links a:hover { transform: none; }
}
</style>

<div id="sxa-faq">
  <div class="f-wrap">

    <p class="f-kicker">Questions fréquentes</p>
    <h2>StereoptiX en clair</h2>

    <!--
      Une definition autoportante, en une phrase. Un moteur generatif cite une
      phrase, pas un paragraphe : celle-ci doit donc etre vraie hors de tout
      contexte, sans « elle » ni « cette application ».
    -->
    <p class="f-lede">
      <strong>StereoptiX est une application web qui transforme une photo en
      image en relief, anaglyphe rouge-cyan, côte à côte ou wiggle GIF, en
      calculant la profondeur dans le navigateur, sans compte et sans envoyer
      la photo sur un serveur.</strong>
      Elle a été conçue et développée par Alban Desbarax, designer et
      développeur à Toulouse, sous le nom Present Composé Design.
    </p>

    <dl class="f-facts">
      <div><dt>Nom</dt><dd>StereoptiX</dd></div>
      <div><dt>Type</dt><dd>Application web installable (PWA)</dd></div>
      <div><dt>Fonction</dt><dd>Transformer une photo en image en relief</dd></div>
      <div><dt>Types de relief</dt><dd>10 : anaglyphes, côte à côte, wiggle GIF, carte de profondeur</dd></div>
      <div><dt>Prix</dt><dd>Gratuit ; licences Studio 4,99 € et Premium 19,99 €, payées une fois</dd></div>
      <div><dt>Compte requis</dt><dd>Aucun</dd></div>
      <div><dt>Calcul de la profondeur</dt><dd>Sur l'appareil, modèle Depth Anything V2 Small</dd></div>
      <div><dt>Photos envoyées</dt><dd>Aucune, sauf Mes clichés, à la demande (Premium)</dd></div>
      <div><dt>Export gratuit</dt><dd>720p, avec une petite signature</dd></div>
      <div><dt>Appareils</dt><dd>Android, iPhone, iPad, Windows, macOS, Linux</dd></div>
      <div><dt>Langue</dt><dd>Français</dd></div>
      <div><dt>Hébergement</dt><dd>IONOS, en Europe</dd></div>
      <div><dt>Auteur</dt><dd>Alban Desbarax, Present Composé Design, Toulouse</dd></div>
      <div><dt>En ligne depuis</dt><dd>Le 1er octobre 2026 (version 2.0.2)</dd></div>
    </dl>

    <!-- Chaque reponse est recopiee MOT POUR MOT dans le JSON-LD plus bas :
         une reponse balisee qui differe de la reponse visible est un motif
         de refus des resultats enrichis. Modifier l'une, c'est modifier
         l'autre. -->
    <div class="f-qa">

      <article>
        <h3>Qu'est-ce que StereoptiX ?</h3>
        <p>StereoptiX est une application web qui transforme une photo en image
        en relief. Elle produit un anaglyphe rouge-cyan pour les lunettes 3D, une
        image côte à côte pour un casque ou une visionneuse, un wiggle, c'est-à-dire
        un GIF animé qui se voit en relief sans lunettes, ou une carte de
        profondeur. La profondeur est estimée par un modèle d'intelligence
        artificielle qui s'exécute dans le navigateur de l'utilisateur.</p>
      </article>

      <article>
        <h3>StereoptiX est-elle gratuite ?</h3>
        <p>Oui. La formule Découverte est gratuite, sans limite de durée et sans
        compte : une photo, les dix types de relief, l'enregistrement et le
        partage, en 720p avec une petite signature StereoptiX sur l'image.</p>
        <p>Deux licences s'achètent une seule fois, sans abonnement. Studio, à
        4,99 €, ouvre la prise en deux photos, la vidéo, la pleine définition, et
        retire la signature. Premium, à 19,99 € à vie, y ajoute Mes clichés, une
        bibliothèque en ligne privée de 100 Go.</p>
      </article>

      <article>
        <h3>Faut-il créer un compte pour utiliser StereoptiX ?</h3>
        <p>Non. L'application s'utilise sans inscription ni adresse électronique.
        Une licence achetée est vérifiée auprès de Stripe, signée par le serveur
        et rangée dans le navigateur de l'appareil, qui la reconnaît même hors
        connexion. Un code de licence permet de la passer sur un autre appareil ;
        elle vit sur un appareil à la fois.</p>
      </article>

      <article>
        <h3>Mes photos sont-elles envoyées sur un serveur ?</h3>
        <p>Non. Le calcul de la profondeur et du relief se fait entièrement sur
        l'appareil, avec ou sans licence. La seule exception est volontaire : avec
        la licence Premium, un cliché que l'utilisateur range dans Mes clichés est
        conservé sur l'hébergement de l'application, chez IONOS en Europe, jusqu'à
        ce qu'il le supprime.</p>
      </article>

      <article>
        <h3>Comment voir une photo en relief sans lunettes 3D ?</h3>
        <p>De deux façons. Le wiggle alterne rapidement les vues de l'œil gauche et
        de l'œil droit : le relief se voit sans rien sur le nez, et l'animation
        s'enregistre en GIF qui tourne en boucle. Le côté à côte croisé se regarde
        en louchant, jusqu'à voir une troisième image au milieu, qui est en
        relief.</p>
      </article>

      <article>
        <h3>Quelles lunettes faut-il pour regarder un anaglyphe ?</h3>
        <p>Des lunettes rouge-cyan, filtre rouge sur l'œil gauche. StereoptiX
        propose quatre anaglyphes rouge-cyan, dont la méthode d'Eric Dubois,
        conseillée pour ses couleurs justes et ses images fantômes réduites, ainsi
        que des versions rouge-vert et rouge-bleu pour les lunettes plus
        anciennes.</p>
      </article>

      <article>
        <h3>Une seule photo suffit-elle pour obtenir une image en relief ?</h3>
        <p>Oui. Le modèle Depth Anything V2 estime, pour chaque pixel, ce qui est
        proche et ce qui est loin, et l'application en déduit les deux points de
        vue. Ce relief est une reconstruction plausible, pas une mesure.</p>
        <p>Pour le vrai relief d'une scène, on prend deux photos décalées d'un pas
        de côté : environ un trentième de la distance du premier plan, soit 6 à 7
        cm pour un sujet à deux mètres.</p>
      </article>

      <article>
        <h3>Peut-on partager un wiggle en GIF animé dans une messagerie ?</h3>
        <p>Oui, sur toutes les formules, y compris la formule gratuite. Le wiggle
        partagé est un GIF animé qui tourne en boucle, allégé pour les messageries
        à 720 pixels et 2 Mo au plus. Le fichier enregistré sur l'appareil garde la
        définition de la formule.</p>
      </article>

      <article>
        <h3>Sur quels appareils StereoptiX fonctionne-t-elle, et comment l'installer ?</h3>
        <p>StereoptiX fonctionne dans un navigateur récent, Chrome, Edge, Firefox
        ou Safari, sur Android, iPhone, iPad, Windows, macOS et Linux. C'est une
        application web progressive : elle s'installe depuis le navigateur sur
        l'écran d'accueil ou le bureau, sans magasin d'applications.</p>
        <p>À la première photo, le navigateur télécharge le modèle de profondeur,
        de 40 à 73 Mo selon l'appareil, puis le garde : les photos suivantes sont
        immédiates.</p>
      </article>

      <article>
        <h3>Qui a développé StereoptiX, et comment soutenir le projet ?</h3>
        <p>StereoptiX a été imaginée, nommée, dessinée, développée et mise en
        ligne par une seule personne : Alban Desbarax, designer et creative
        technologist à Toulouse, sous le nom Present Composé Design.</p>
        <p>Le projet est autofinancé. Il vit des licences Studio et Premium, et
        d'un soutien libre sur Buy Me a Coffee, qui ne débloque rien dans
        l'application.</p>
      </article>

    </div>

    <div class="f-links">
      <a href="https://pcdlabs.presentcomposedesign.fr/tools/StereoptiX/" rel="noopener">
        Ouvrir StereoptiX
        <span>L'application, sans inscription</span>
      </a>
      <a href="https://buymeacoffee.com/presentcomposedesign" rel="noopener nofollow">
        Soutenir le projet
        <span>Un café pour le créateur</span>
      </a>
      <a href="https://presentcomposedesign.fr/contact/">
        Parler d'un projet
        <span>Present Composé Design, Toulouse</span>
      </a>
    </div>

  </div>
</div>

<!--
  ============================================================================
  DONNEES STRUCTUREES

  Un seul graphe, un seul bloc. Chaque entite porte un @id stable, et les
  autres la designent par cet @id plutot que de la recopier. Les @id de
  l'entreprise, de l'auteur et du site sont LES MEMES que sur la page
  BirdSignal : c'est ce qui dit a un moteur que les deux applications ont le
  meme createur.

  AUCUNE NOTE, AUCUN AVIS, AUCUN NOMBRE D'UTILISATEURS n'est declare ici. Un
  aggregateRating invente est la premiere cause de sanction manuelle sur ce
  type de balisage. Consequence assumee : Google n'affichera pas d'etoiles
  pour l'application, il les reserve aux pages qui portent de vrais avis.
  ============================================================================
-->
<script type="application/ld+json">
{
  "@context": "https://schema.org",
  "@graph": [
    {
      "@type": "ProfessionalService",
      "@id": "https://presentcomposedesign.fr/#organisation",
      "name": "Present Composé Design",
      "alternateName": "PCD",
      "legalName": "Alban DESBARAX",
      "url": "https://presentcomposedesign.fr/",
      "email": "contact@presentcomposedesign.fr",
      "telephone": "+33683949667",
      "founder": { "@id": "https://presentcomposedesign.fr/#alban" },
      "foundingDate": "2012-10-01",
      "taxID": "789583242",
      "identifier": [
        { "@type": "PropertyValue", "name": "SIREN", "value": "789583242" },
        { "@type": "PropertyValue", "name": "SIRET", "value": "78958324200035" },
        { "@type": "PropertyValue", "name": "APE", "value": "74.10Z" }
      ],
      "address": {
        "@type": "PostalAddress",
        "streetAddress": "12B rue Louis Plana",
        "postalCode": "31500",
        "addressLocality": "Toulouse",
        "addressRegion": "Occitanie",
        "addressCountry": "FR"
      },
      "areaServed": [
        { "@type": "City", "name": "Toulouse" },
        { "@type": "AdministrativeArea", "name": "Occitanie" },
        { "@type": "Country", "name": "France" }
      ],
      "knowsLanguage": ["fr", "en"],
      "knowsAbout": [
        "Design produit",
        "Identité visuelle et naming",
        "Développement web",
        "Application web progressive",
        "Intelligence artificielle embarquée",
        "Stéréoscopie et images en relief",
        "3D temps réel et WebGL",
        "Réalité augmentée et WebXR",
        "Paiement en ligne"
      ],
      "sameAs": [
        "https://www.linkedin.com/in/alban-desbarax-present-compose-design/",
        "https://buymeacoffee.com/presentcomposedesign"
      ]
    },

    {
      "@type": "Person",
      "@id": "https://presentcomposedesign.fr/#alban",
      "name": "Alban Desbarax",
      "givenName": "Alban",
      "familyName": "Desbarax",
      "jobTitle": "Designer 360 et Creative Technologist",
      "url": "https://presentcomposedesign.fr/",
      "email": "contact@presentcomposedesign.fr",
      "worksFor": { "@id": "https://presentcomposedesign.fr/#organisation" },
      "homeLocation": {
        "@type": "Place",
        "address": {
          "@type": "PostalAddress",
          "addressLocality": "Toulouse",
          "addressRegion": "Occitanie",
          "addressCountry": "FR"
        }
      },
      "sameAs": [
        "https://www.linkedin.com/in/alban-desbarax-present-compose-design/"
      ]
    },

    {
      "@type": "WebSite",
      "@id": "https://presentcomposedesign.fr/#site",
      "url": "https://presentcomposedesign.fr/",
      "name": "Present Composé Design",
      "inLanguage": "fr-FR",
      "publisher": { "@id": "https://presentcomposedesign.fr/#organisation" }
    },

    {
      "@type": ["WebPage", "FAQPage"],
      "@id": "https://presentcomposedesign.fr/stereoptix-infos/#page",
      "url": "https://presentcomposedesign.fr/stereoptix-infos/",
      "name": "StereoptiX : photo en relief, anaglyphe et wiggle 3D",
      "description": "Étude de cas complète de StereoptiX, application web qui transforme une photo en image en relief : intelligence artificielle embarquée, dix types de relief, identité, modèle économique et mise en ligne.",
      "inLanguage": "fr-FR",
      "isPartOf": { "@id": "https://presentcomposedesign.fr/#site" },
      "about": { "@id": "https://pcdlabs.presentcomposedesign.fr/tools/StereoptiX/#application" },
      "primaryImageOfPage": { "@id": "https://presentcomposedesign.fr/stereoptix-infos/#image" },
      "breadcrumb": { "@id": "https://presentcomposedesign.fr/stereoptix-infos/#fil" },
      "mainEntity": [
        {
          "@type": "Question",
          "name": "Qu'est-ce que StereoptiX ?",
          "acceptedAnswer": {
            "@type": "Answer",
            "text": "StereoptiX est une application web qui transforme une photo en image en relief. Elle produit un anaglyphe rouge-cyan pour les lunettes 3D, une image côte à côte pour un casque ou une visionneuse, un wiggle, c'est-à-dire un GIF animé qui se voit en relief sans lunettes, ou une carte de profondeur. La profondeur est estimée par un modèle d'intelligence artificielle qui s'exécute dans le navigateur de l'utilisateur."
          }
        },
        {
          "@type": "Question",
          "name": "StereoptiX est-elle gratuite ?",
          "acceptedAnswer": {
            "@type": "Answer",
            "text": "Oui. La formule Découverte est gratuite, sans limite de durée et sans compte : une photo, les dix types de relief, l'enregistrement et le partage, en 720p avec une petite signature StereoptiX sur l'image. Deux licences s'achètent une seule fois, sans abonnement. Studio, à 4,99 €, ouvre la prise en deux photos, la vidéo, la pleine définition, et retire la signature. Premium, à 19,99 € à vie, y ajoute Mes clichés, une bibliothèque en ligne privée de 100 Go."
          }
        },
        {
          "@type": "Question",
          "name": "Faut-il créer un compte pour utiliser StereoptiX ?",
          "acceptedAnswer": {
            "@type": "Answer",
            "text": "Non. L'application s'utilise sans inscription ni adresse électronique. Une licence achetée est vérifiée auprès de Stripe, signée par le serveur et rangée dans le navigateur de l'appareil, qui la reconnaît même hors connexion. Un code de licence permet de la passer sur un autre appareil ; elle vit sur un appareil à la fois."
          }
        },
        {
          "@type": "Question",
          "name": "Mes photos sont-elles envoyées sur un serveur ?",
          "acceptedAnswer": {
            "@type": "Answer",
            "text": "Non. Le calcul de la profondeur et du relief se fait entièrement sur l'appareil, avec ou sans licence. La seule exception est volontaire : avec la licence Premium, un cliché que l'utilisateur range dans Mes clichés est conservé sur l'hébergement de l'application, chez IONOS en Europe, jusqu'à ce qu'il le supprime."
          }
        },
        {
          "@type": "Question",
          "name": "Comment voir une photo en relief sans lunettes 3D ?",
          "acceptedAnswer": {
            "@type": "Answer",
            "text": "De deux façons. Le wiggle alterne rapidement les vues de l'œil gauche et de l'œil droit : le relief se voit sans rien sur le nez, et l'animation s'enregistre en GIF qui tourne en boucle. Le côté à côte croisé se regarde en louchant, jusqu'à voir une troisième image au milieu, qui est en relief."
          }
        },
        {
          "@type": "Question",
          "name": "Quelles lunettes faut-il pour regarder un anaglyphe ?",
          "acceptedAnswer": {
            "@type": "Answer",
            "text": "Des lunettes rouge-cyan, filtre rouge sur l'œil gauche. StereoptiX propose quatre anaglyphes rouge-cyan, dont la méthode d'Eric Dubois, conseillée pour ses couleurs justes et ses images fantômes réduites, ainsi que des versions rouge-vert et rouge-bleu pour les lunettes plus anciennes."
          }
        },
        {
          "@type": "Question",
          "name": "Une seule photo suffit-elle pour obtenir une image en relief ?",
          "acceptedAnswer": {
            "@type": "Answer",
            "text": "Oui. Le modèle Depth Anything V2 estime, pour chaque pixel, ce qui est proche et ce qui est loin, et l'application en déduit les deux points de vue. Ce relief est une reconstruction plausible, pas une mesure. Pour le vrai relief d'une scène, on prend deux photos décalées d'un pas de côté : environ un trentième de la distance du premier plan, soit 6 à 7 cm pour un sujet à deux mètres."
          }
        },
        {
          "@type": "Question",
          "name": "Peut-on partager un wiggle en GIF animé dans une messagerie ?",
          "acceptedAnswer": {
            "@type": "Answer",
            "text": "Oui, sur toutes les formules, y compris la formule gratuite. Le wiggle partagé est un GIF animé qui tourne en boucle, allégé pour les messageries à 720 pixels et 2 Mo au plus. Le fichier enregistré sur l'appareil garde la définition de la formule."
          }
        },
        {
          "@type": "Question",
          "name": "Sur quels appareils StereoptiX fonctionne-t-elle, et comment l'installer ?",
          "acceptedAnswer": {
            "@type": "Answer",
            "text": "StereoptiX fonctionne dans un navigateur récent, Chrome, Edge, Firefox ou Safari, sur Android, iPhone, iPad, Windows, macOS et Linux. C'est une application web progressive : elle s'installe depuis le navigateur sur l'écran d'accueil ou le bureau, sans magasin d'applications. À la première photo, le navigateur télécharge le modèle de profondeur, de 40 à 73 Mo selon l'appareil, puis le garde : les photos suivantes sont immédiates."
          }
        },
        {
          "@type": "Question",
          "name": "Qui a développé StereoptiX, et comment soutenir le projet ?",
          "acceptedAnswer": {
            "@type": "Answer",
            "text": "StereoptiX a été imaginée, nommée, dessinée, développée et mise en ligne par une seule personne : Alban Desbarax, designer et creative technologist à Toulouse, sous le nom Present Composé Design. Le projet est autofinancé. Il vit des licences Studio et Premium, et d'un soutien libre sur Buy Me a Coffee, qui ne débloque rien dans l'application."
          }
        }
      ]
    },

    {
      "@type": "ImageObject",
      "@id": "https://presentcomposedesign.fr/stereoptix-infos/#image",
      "url": "A-REMPLACER-adresse-de-stereoptix-partage-1200x630.jpg",
      "width": 1200,
      "height": 630,
      "caption": "StereoptiX, application web qui met vos photos en relief"
    },

    {
      "@type": "BreadcrumbList",
      "@id": "https://presentcomposedesign.fr/stereoptix-infos/#fil",
      "itemListElement": [
        {
          "@type": "ListItem",
          "position": 1,
          "name": "Accueil",
          "item": "https://presentcomposedesign.fr/"
        },
        {
          "@type": "ListItem",
          "position": 2,
          "name": "StereoptiX"
        }
      ]
    },

    {
      "@type": "TechArticle",
      "@id": "https://presentcomposedesign.fr/stereoptix-infos/#article",
      "headline": "StereoptiX : une application web qui met vos photos en relief",
      "description": "Étude de cas : de l'idée au naming, du logo à l'atelier, de l'intelligence artificielle de profondeur aux dix types de relief, du modèle économique à la mise en ligne.",
      "inLanguage": "fr-FR",
      "datePublished": "2026-10-06",
      "dateModified": "2026-10-07",
      "author": { "@id": "https://presentcomposedesign.fr/#alban" },
      "publisher": { "@id": "https://presentcomposedesign.fr/#organisation" },
      "mainEntityOfPage": { "@id": "https://presentcomposedesign.fr/stereoptix-infos/#page" },
      "image": { "@id": "https://presentcomposedesign.fr/stereoptix-infos/#image" },
      "about": { "@id": "https://pcdlabs.presentcomposedesign.fr/tools/StereoptiX/#application" },
      "proficiencyLevel": "Beginner",
      "keywords": "photo en relief, anaglyphe, anaglyphe rouge-cyan, photo 3D, image stéréoscopique, wiggle GIF, carte de profondeur, lunettes 3D, intelligence artificielle embarquée, application web progressive, design produit, Toulouse",
      "articleSection": [
        "Le relief calculé dans le navigateur",
        "Prise de vue",
        "Dix types de relief",
        "Modèle économique",
        "Identité graphique",
        "Méthode, de l'idée à la mise en ligne"
      ]
    },

    {
      "@type": "WebApplication",
      "@id": "https://pcdlabs.presentcomposedesign.fr/tools/StereoptiX/#application",
      "name": "StereoptiX",
      "url": "https://pcdlabs.presentcomposedesign.fr/tools/StereoptiX/",
      "description": "Application web qui transforme une photo en image en relief : anaglyphe rouge-cyan, côte à côte, wiggle GIF ou carte de profondeur. La profondeur est calculée dans le navigateur, sans compte et sans envoyer la photo sur un serveur.",
      "applicationCategory": "MultimediaApplication",
      "applicationSubCategory": "Photographie en relief et stéréoscopie",
      "operatingSystem": "Android, iOS, iPadOS, Windows, macOS, Linux",
      "browserRequirements": "Navigateur récent avec JavaScript, WebGL2 et WebAssembly",
      "storageRequirements": "De 40 à 73 Mo téléchargés à la première photo, puis conservés en cache",
      "permissions": "Caméra, facultative : une photo peut aussi être importée.",
      "inLanguage": "fr-FR",
      "softwareVersion": "2.0.2",
      "isAccessibleForFree": true,
      "creator": { "@id": "https://presentcomposedesign.fr/#alban" },
      "publisher": { "@id": "https://presentcomposedesign.fr/#organisation" },
      "countryOfOrigin": { "@type": "Country", "name": "France" },
      "offers": [
        {
          "@type": "Offer",
          "name": "Découverte",
          "description": "Une photo, les dix types de relief, enregistrement et partage en 720p avec une petite signature. Sans compte.",
          "price": "0",
          "priceCurrency": "EUR",
          "availability": "https://schema.org/InStock",
          "category": "free"
        },
        {
          "@type": "Offer",
          "name": "Licence Studio",
          "description": "Deux photos, vidéo en relief, pleine définition, signature retirée. Payée une seule fois.",
          "price": "4.99",
          "priceCurrency": "EUR",
          "availability": "https://schema.org/InStock",
          "url": "https://pcdlabs.presentcomposedesign.fr/tools/StereoptiX/tarifs.html"
        },
        {
          "@type": "Offer",
          "name": "Licence Premium",
          "description": "Tout Studio, plus Mes clichés, une bibliothèque en ligne privée de 100 Go. À vie.",
          "price": "19.99",
          "priceCurrency": "EUR",
          "availability": "https://schema.org/InStock",
          "url": "https://pcdlabs.presentcomposedesign.fr/tools/StereoptiX/tarifs.html"
        }
      ],
      "featureList": [
        "Photo en relief à partir d'une seule photo, par intelligence artificielle",
        "Vrai relief à partir de deux photos décalées d'un pas",
        "Vidéo en relief de cinq secondes, en MP4 jusqu'en 1080p",
        "Dix types de relief : six anaglyphes, deux côte à côte, wiggle, carte de profondeur",
        "Anaglyphe rouge-cyan selon la méthode d'Eric Dubois, en lumière linéaire",
        "Wiggle en GIF animé qui tourne en boucle, allégé pour les messageries",
        "Calcul de la profondeur sur l'appareil, aucune photo transmise",
        "Prise de vue guidée à la caméra",
        "Installation sur l'écran d'accueil sans magasin d'applications",
        "Licences sans compte, vérifiées hors connexion",
        "Bibliothèque en ligne Mes clichés de 100 Go, clichés retouchables",
        "Thème clair et thème sombre"
      ],
      "isBasedOn": {
        "@type": "SoftwareApplication",
        "name": "Depth Anything V2 Small",
        "url": "https://huggingface.co/depth-anything/Depth-Anything-V2-Small",
        "license": "https://www.apache.org/licenses/LICENSE-2.0",
        "applicationCategory": "MultimediaApplication"
      },
      "citation": {
        "@type": "CreativeWork",
        "name": "Anaglyphes par la méthode des moindres carrés, Eric Dubois, Université d'Ottawa",
        "url": "http://www.site.uottawa.ca/~edubois/anaglyph/"
      },
      "mainEntityOfPage": { "@id": "https://presentcomposedesign.fr/stereoptix-infos/#page" }
    }
  ]
}
</script>
				</div>
				</div>
				</div>
				</div>
		<p>Cet article <a href="https://presentcomposedesign.fr/stereoptix-infos/">StereoptiX</a> est apparu en premier sur <a href="https://presentcomposedesign.fr">Présent Composé design</a>.</p>
]]></content:encoded>
					
		
		
			</item>
		<item>
		<title>BirdSignal-infos</title>
		<link>https://presentcomposedesign.fr/birdsignal-infos/</link>
		
		<dc:creator><![CDATA[admin]]></dc:creator>
		<pubDate>Tue, 15 Sep 2026 11:23:50 +0000</pubDate>
				<category><![CDATA[Applications]]></category>
		<category><![CDATA[Design graphique]]></category>
		<category><![CDATA[Design produit]]></category>
		<category><![CDATA[PCdlabs]]></category>
		<guid isPermaLink="false">https://presentcomposedesign.fr/?p=36789</guid>

					<description><![CDATA[<p>Activer le son Étude de cas &#183; Application web sur mesure BirdSignal Une application web qui analyse le son pour identifier l&#8217;oiseau qui chante, et transforme chaque écoute en carte à collectionner géolocalisée. Imaginée, nommée, dessinée, développée, mise en ligne et hébergée en France. Idéation Naming Identité graphique UX / UI Développement 3D temps réel IA embarquée Hébergement Voir l&#8217;application Demander un rendez-vous Sans magasin d&#8217;applications Elle s&#8217;installe sur tous les téléphones, gratuitement BirdSignal est une application web. Elle s&#8217;ouvre dans un navigateur, puis s&#8217;installe d&#8217;un geste sur l&#8217;écran d&#8217;accueil : son icône, son écran de lancement, son fonctionnement hors ligne. Aucun magasin d&#8217;applications, aucun compte, aucun téléchargement payant. Une seule adresse, et le même produit sur Android, sur iPhone, sur ordinateur. Gratuit Android iPhone et iPad Windows et macOS Installée depuis le navigateur, elle se range sur le bureau comme un logiciel. Ouvrir et installer 6&#8239;522espèces 2langues 137tests auto 0octet audio envoyé Points clés Ce que j&#8217;ai réalisé Idéation, positionnement et naming de l&#8217;application Création du logo, du système d&#8217;icônes et de l&#8217;identité graphique complète Conception de l&#8217;expérience, des parcours et de l&#8217;interface, en deux langues Développement intégral, front et back, et intégration d&#8217;un modèle d&#8217;intelligence artificielle Rendu 3D temps réel des cartes, avec gyroscope sur mobile Mise en ligne, sécurisation, hébergement en France et documentation Le cœur de l&#8217;application Tout part d&#8217;un son L&#8217;application enregistre quelques secondes de chant, en construit le spectrogramme, et soumet cette image de fréquences à un modèle d&#8217;intelligence artificielle de 6522 espèces. Le tout dans le navigateur, en moins de temps qu&#8217;il n&#8217;en faut pour ranger son téléphone. Ce qui défile ci-dessous n&#8217;est pas une illustration : c&#8217;est l&#8217;analyse d&#8217;un vrai enregistrement, une rue de Toulouse à six heures du matin. Enregistrement réel 8,5 kHz4 kHz0,4 Le temps en abscisse, la fréquence en ordonnée, l&#8217;intensité en couleur. Chaque trait vertical est un oiseau ; la bande claire du bas est la ville qui se réveille. Activez le son pour entendre ce que vous voyez. 1. CapterMicro ou fichier importé, rééchantillonné à 48 kHz. 2. Voir le sonTransformée de Fourier, spectrogramme, découpage en segments de 3 secondes. 3. ReconnaîtreModèle BirdNET exécuté en WebAssembly, filtré par le lieu et la saison. Design produit Le son devient un objet Chaque analyse conservée devient une carte numérotée, avec sa photo, son spectrogramme, sa date et son lieu. Elle se retourne en 3D et s&#8217;incline au gyroscope, de sorte que le reflet suit le poignet comme sur une vraie carte. BirdSignal Corvidés Pie bavarde Pica pica chant &#183; Défense de territoire Rareté &#183; LC8 % Confiance91 % 13 sept. 2026, 07:4312,8 s &#183; localisé BirdSignal Détails EspècePie bavarde MoteurBirdNET Filtre local157 espèces Durée12,8 s Position43.6080, 1.4812 Spectrogramme ÉMISE PAR BirdSignalR_001presentcomposedesign.fr Or Les quatre rangs Le rang change la matière de la carte, et il se mérite. Passez la souris sur les poinçons : ce sont exactement ceux frappés au verso des cartes. Uc Non classéeAucune espèce reconnue Sd StandardArgent Or AuthentiqueCaptée sur place, localisée Dd DiamantIrisé, le plus rare Le point fort Votre collection raconte vos sorties Chaque carte retient l&#8217;endroit où le chant a été capté. La collection devient une carte de vos promenades, et surtout une carte des espèces : on voit où elles sont, et où elles ne sont plus. Merle noir08:14 · LC Mésange charbonnière09:02 · LC Pie bavarde09:47 · LC Tourterelle turque10:21 · LC Représentation de principe. La position n&#8217;est enregistrée qu&#8217;avec l&#8217;accord de l&#8217;utilisateur, et elle est arrondie avant tout partage. Identité graphique Un signe qui se lit à 16 pixels Un oiseau et une lettre dans la même forme. Une seule couleur pour le signe : une identité qui a besoin d&#8217;un dégradé pour exister ne survit pas à une impression en noir. Le favicon, lui, existe en deux fichiers, parce qu&#8217;un gris clair disparaît sur une barre d&#8217;onglets blanche. Signe principal#1001ef sur blanc En réserveBlanc sur aplat de marque Icône d&#8217;applicationZone sûre du masque Android Thème clair Thème sombreFaviconDeux fichiers, un par thème d&#8217;onglet Logo de pied de pagePlaque blanche, signe bleu 48 32 16LisibilitéValidé à sa plus petite taille Méthode De l&#8217;idée à la mise en ligne 01 Idéation et positionnement Définir ce que l&#8217;application fait, ce qu&#8217;elle refuse de faire, et à qui elle s&#8217;adresse. 02 Naming Un nom qui tient dans une icône, se prononce en français comme en anglais, et dit quelque chose de vrai sur le produit. 03 Logo et identité graphique Du croquis au vectoriel, décliné en favicon, icônes d&#8217;application, thème clair et thème sombre. 04 Architecture et UX Parcours, écrans, arborescence, et une architecture choisie pour tenir sur un hébergement mutualisé français. 05 Développement Interface, API, traitement du signal audio, IA embarquée, rendu 3D temps réel et tests automatisés. 06 Mise en ligne et suivi Sécurisation, hébergement en France, application installable et hors ligne, documentation et mises à jour. Ce que cela veut dire pour vous Un seul interlocuteur, du premier croquis à la mise en ligne Application web sur mesure Outil métier, configurateur, application mobile installable. Conçue, développée et hébergée. Identité et design produit Naming, logo, système d&#8217;icônes, interface et déclinaisons, pensés pour tenir à toutes les tailles. 3D, AR et expériences immersives Configurateurs 3D temps réel, visualiseurs, réalité augmentée, directement dans le navigateur. Vous souhaitez faire appel à mes services ? Parlons de votre projet. J&#8217;interviens sur l&#8217;ensemble de la chaîne, ou sur la partie qui vous manque. Demander un rendez-vous Voir les autres réalisations BirdSignal est une application gratuite et non commerciale, conçue et hébergée en France par Present Composé Design, nom commercial de l&#8217;entreprise individuelle Alban DESBARAX, à Toulouse. Les hypothèses d&#8217;espèce produites sont probabilistes et ne constituent pas une détermination scientifique.</p>
<p>Cet article <a href="https://presentcomposedesign.fr/birdsignal-infos/">BirdSignal-infos</a> est apparu en premier sur <a href="https://presentcomposedesign.fr">Présent Composé design</a>.</p>
]]></description>
										<content:encoded><![CDATA[		<div data-elementor-type="wp-post" data-elementor-id="36789" class="elementor elementor-36789">
				<div class="elementor-element elementor-element-ba2361d e-con-full e-flex wpr-particle-no wpr-jarallax-no wpr-parallax-no wpr-sticky-section-no wpr-column-slider-no wpr-equal-height-no e-con e-parent" data-id="ba2361d" data-element_type="container" data-e-type="container">
				<div class="elementor-element elementor-element-3260263 elementor-widget__width-inherit elementor-widget elementor-widget-html" data-id="3260263" data-element_type="widget" data-e-type="widget" data-widget_type="html.default">
				<div class="elementor-widget-container">
					<!--
// ║  Birdsignal, © All rights reserved                                       ║
// ║  2026 · PCdlabs ·  Present Composé Design                                ║
// ║  Alban DESBARAX                                                          ║
// ║  360° Design & Creative Technologist - Toulouse, FRANCE                  ║
// ║                                                                          ║
// ║  · Expertise & Support 2D, 3D, AR, VR, XR, AI                            ║
// ║  · Product Design & Industrial Design                                    ║
// ║  · Digital communication                                                 ║
// ║  · Immersive experiences  -ᯅ- ✔️                                        ║
//                                                                            
//  · 🡺 https://presentcomposedesign.fr/      
//  · 🡺 https://pcdlabs.presentcomposedesign.fr/tools/birdsignal 

// @@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@..........::::::::::::::::::::::::::::::@@@@@@@@
// @@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@.....::::::::::::::::::::::::::::::---@@@@@
// @@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@:.:::@@@@@@@@@@@@@@:..::::::::::::::::::::::::::::::-----@@@
// @@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@.:::::::::::::::::.: @@@@@@@@@@::::::::::::::::::::::::::::::-------@
// @@@@@@@@@@@@@@@@@@@@@@@@@@@@@@:::::::::::::::::::::::::::::::@@@@@@@@::::::::::::::::::::::::::::--------
// @@@@@@@@@@@@@@@@@@@@@@@@@@@:.:::::::::::::::::::::::::::::::::..@@@@@@@::::::::::::::::::::::::::--------
// @@@@@@@@@@@@@@@@@@@@@@@:..::::::::::::::::::::::::::::::::::::::..@@@@@@@::::::::::::::::::::::::--------
// @@@@@@@@@@@@@@@@@@@@@@.::::::::::::::::::::::::::::::::::::::::::::@@@@@@::::::::::::::::::::::::--------
// @@@@@@@@@@@@@@@@@@@ .:::::::::::::::::::::::::::::@@@@@:::::::::::::@@@@@@:::::::::::::::::::::::--------
// @@@@@@@@@@@@@@@@@@:::::::::::::::::::::::::::::::.@@@@@.::::::::::::::@@@@@::::::::::::::::::::::--------
// @@@@@@@@@@@@@@@@::::::::::::::::::::::::::::::::::@@@@@.:::::::::::::::.:@@@@@:::::::::::::::::::--------
// @@@@@@@@@@@@@@::::::::::::::::::::::::::::::::::::::::::::::::::::::::@@@@@@@@@@@@@@:::::::::::::--------
// @@@@@@@@@@@@@@.:::::::::::::::::::::::::::::::::::::::::::::::::::@@@@@@@@@@@@@@@@@@@@@@:::::::::--------
// @@@@@@@@@@@@-:::::::::::::::::::::::::::::::::::::::::::::::::@@@@@@@@@@@@@@@@@@@@@-:::::::::::::--------
// @@@@@@@@@@@ .:::::::::::::::::::::::::::::::::::::::::::::::@@@@@@@@@@@@@@@@@@:::::::::::::::::::--------
// @@@@@@@@@@@:::::::: ::::::::::::::::::::::::::::::::::::::-@@@@@@@@@@@@@@::::::::::::::::::::::::--------
// @@@@@@@@@@:::::::::.@@.::::::::::::::::::::::::::::::::: @@@@@@@@@@@:::::::::::::::::::::::::::::--------
// @@@@@@@@@..:::::::::@@@.:::::::::::::::::::::::::::::::@@@@@@@@@@:.::::::::::::::::::::::::::::::--------
// @@@@@@@@@.:::::::::::@@@@@@::::::::::::::::::::::::::::@@@@@@@@....::::::::::::::::::::::::::::::--------
// @@@@@@@@@:::::::::::.:@@@@@@@.::::::::::::::::::::::..@@@@@@@......::::::::::::::::::::::::::::::--------
// @@@@@@@@ :::::::::::::.@@@@@@@@@@@::::::::::::::::::.@@@@@@@.......::::::::::::::::::::::::::::::--------
// @@@@@@@@::::::::::::::::@@@@@@@@@@@@@..::::::::::::::@@@@@@........::::::::::::::::::::::::::::::--------
// @@@@@@@@::::::::::::::::.@@@@@@@@@@@@@@@@-::::::::::@@@@@@@........::::::::::::::::::::::::::::::--------
// @@@@@@@@:::::::::::::::::::@@@@@@@@@@@@@@@@@@@@:.:::@@@@@@@........::::::::::::::::::::::::::::::--------
// @@@@@@@@::::::::::::::::::::: @@@@@@@@@@@@@@@@@@@@@@@@@@@@@........::::::::::::::::::::::::::::::--------
// @@@@@@@@::::::::::::::::::::::::.@@@@@@@@@@@@@@@@@@@@@@@@@@........::::::::::::::::::::::::::::::--------
// @@@@@@@@::::::::::::::::::::::::::..@@@@@@@@@@@@@@@@@@@@@@@........::::::::::::::::::::::::::::::--------
// @@@@@@@@::::::::::::::::::::::::::::::.:@@@@@@@@@@@@@@@@@@@@:......::::::::::::::::::::::::::::::--------
// @@@@@@@@:::::::::::::::::::::::::::::::::::::@@@@@@@@@@@@@@@@@@@:..::::::::::::::::::::::::::::::--------
// @@@@@@@@::::::::::::::::::::::::::::::::::::::::.@@@@@@@@@@@@@@@@@@::::::::::::::::::::::::::::::--------
// @@@@@@@@:::::::::::::::::::::::::::::::::::::::::::::.@@@@@@@@@@@@@@@::::::::::::::::::::::::::::--------
// @@@@@@@@:::::::::::::::::::::::::::::::::::::::::::::::.:@@@@@@@@@@@@@@::::::::::::::::::::::::::--------
// @@@@@@@@:::::::::::::::::::::::::::::::::::::::::::::::::::@@@@@@@@@@@@@@::::::::::::::::::::::::--------
// @@@@@@@@::::::::::::::::::::::::::::::::::::::::::::::::::::.@@@@@@@@@@@@@:::::::::::::::::::::::--------
// @@@@@@@@:::::::::::::::::::::::::::::::::::::::::::::::::::::.:@@@@@@@@@@@@::::::::::::::::::::::--------
// @@@@@@@@:::::::::::::::::::::::::::::::::::::::::::::::::::::::.@@@@@@@@@@@@:::::::::::::::::::::--------
// @@@@@@@@::::::::::::::::::::::::::::::::::::::::::::::::::::::::@@@@@@@@@@@@@::::::::::::::::::::--------
// @@@@@@@@:::::::::::::::::::::::::::::::::::::::::::::::::::::::::@@@@@@@@@@@@::::::::::::::::::::--------
// @@@@@@@@:::::::::::::::::::::::::::::::::::::::::::::::::::::::::@@@@@@@@@@@@@:::::::::::::::::::--------
// @@@@@@@@::::::::::::::::::::::::::::::::::::::::::::::::::::::::::@@@@@@@@@@@@:::::::::::::::::::--------
// @@@@@@@@:::::::::::::::::::::::::::::::::::::::::::::::::::::::::@@@@@@@@@@@@@:::::::::::::::::::--------
// @@@@@@@@:::::::::::::::::::::::::::::::::::::::::::::::::::::::::@@@@@@@@@@@@@:::::::::::::::::::--------
// @@@@@@@@::::::::::::::::::::::::::::::::::::::::::::::::::::::::@@@@@@@@@@@@@::::::::::::::::::::--------
// @@@@@@@@:::::::::::::::::::::::::::::::::::::::::::::::::::::::.@@@@@@@@@@@@:::::::::::::::::::::--------
// @@@@@@@@:::::::::::::::::::::::::::::::::::::::::::::::::::::::@@@@@@@@@@@@@:::::::::::::::::::::--------
// @@@@@@@@:::::::::::::::::::::::::::::::::::::::::::::::::::::@@@@@@@@@@@@@:::::::::::::::::::::::--------
// @@@@@@@@:::::::::::::::::::::::::::::::::::::::::::::::::.:@@@@@@@@@@@@@@::::::::::::::::::::::::--------
// @@@@@@@@::::::::::::::::::::::::::::::::::::::::::::::.:@@@@@@@@@@@@@@@@:::::::::::::::::::::::::--------
// @@@@@@@@:::::::::::::::::::::::::::::::::::::::::.@@@@@@@@@@@@@@@@@@@@:::::::::::::::::::::::::::--------
// @@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@:::::::::::::::::::::::::::::-------@
// @@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@:::::::::::::::::::::::::::::::-----@@@
// @@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@....::::::::::::::::::::::::::::::---@@@@@
// @@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@ .........::::::::::::::::::::::::::::::@@@@@@@@


// @@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@
// @@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@%#*++==------===**%%@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@
// @@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@#++-::::::::::::::::::::::-=*%@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@
// @@@@@@@@@@@@@@@@@@@@@@@@@@@@@#+-::::::::::::::::::::::::::::::::=*%@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@
// @@@@@@@@@@@@@@@@@@@@@@@@@@#+::::::::::::::::::::::::::::::::::::::::=%@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@
// @@@@@@@@@@@@@@@@@@@@@@@@%+:::::::::::::::::=++***+=-::::::::::::::::::::=%@@@@@@@@@@@@@@@@@@@@@@@@@@@
// @@@@@@@@@@@@@@@@@@@@@@#=::::::::::::::::+%@@@@@@@@@@%+-:::::::::::::::::::=#@@@@@@@@@@@@@@@@@@@@@@@@@
// @@@@@@@@@@@@@@@@@@@@#-::::::::::::::::#@@@@@@@@@@@@@@@@%-:::::::::::::::::::=#@@@@@@@@@@@@@@@@@@@@@@@
// @@@@@@@@@@@@@@@@@@%=::::::::::::::::*@@@@@@**==-=+##@@@@@*-:::::::::::::::::::=%@@@@@@@@@@@@@@@@@@@@@
// @@@@@@@@@@@@@@@@@=:::::::::::::::::%@@@@@+::::::::::-*@@@@#-::::::::::::::::::::=@@@@@@@@@@@@@@@@@@@@
// @@@@@@@@@@@@@@@#::::::::::::::::::%@@@@=::::::::::::::-%@@@#-:::::::::::::::::::::#@@@@@@@@@@@@@@@@@@
// @@@@@@@@@@@@@@=::::::::::::::::::*@@@@=::::::::::::::::-%@@@*::::::::::::::::::::::=@@@@@@@@@@@@@@@@@
// @@@@@@@@@@@@@%-::::::::::::::::::-@@@@=::::::::::::::::::-%@@@-::::::::::::::::::::::-%@@@@@@@@@@@@@@
// @@@@@@@@@@@@#::::::::::::::::::::*@@@#::::::::::::::::::::=@@@*::::::::::::::::::::::::*@@@@@@@@@@@@@
// @@@@@@@@@@@#:::::::::::::::::::::%@@@+::::::::::::::::::::-@@@%:::::::::::::::::::::::::*@@@@@@@@@@@@
// @@@@@@@@@@+::::::::::::::::::::::@@@@-:::::::::::::::::::::%@@@::::::::::::::::::::::::::*@@@@@@@@@@@
// @@@@@@@@@*:::::::::::::::::::::::@@@@=:::::::::::::::::::::@@@@:::::::::::::::::::::::::::*@@@@@@@@@@
// @@@@@@@@@%::::::::::::::::::::::::@@@@*:::::::::::::::::::::@@@%::::::::::::::::::::::::::::*@@@@@@@@
// @@@@@@@%:::::::::::::::::::::::::@@@@%::::::::::::::::::::+@@@*:::::::::::::::::::::::::::::%@@@@@@@@
// @@@@@@@::::::::::::::::::::::::::@@@@@*::::::::::::::::::-@@@@::::::::::::::::::::::::::::::-@@@@@@@@
// @@@@@@=::::::::::::::::::::::::::@@@@@@*::::::::::::::::-@@@@+:::::::::::::::::::::::::::::::*@@@@@@@
// @@@@@%:::::::::::::::::::::::::::@@@@@@@*::::::::::::::-%@@@#:::::::::::::::::::::::::::::::::*@@@@@@
// @@@@@::::::::::::::::::::::::::::@@@@@@@@@*::::::::::+@@@@@*::::::::::::::::::::::::::::::::::-@@@@@@
// @@@@*::::::::::::::::::::::::::::@@@#=@@@@@@%#*+=**%@@@@@@=::::::::::::::::::::::::::::::::::::*@@@@@
// @@@@:::::::::::::::::::::::::::::@@@#::*@@@@@@@@@@@@@@@@*:::::::::::::::::::::::::::::::::::::::@@@@@
// @@@*:::::::::::::::::::::::::::::@@@#::::=*@@@@@@@@@%#=:::::::::::::::::::::::::::::::::::::::::#@@@@
// @@@=:::::::::::::::::::::::::::::@@@#::::::::-==+=-:::::::::::::::::::::::::::::::::::::::::::::=@@@@
// @@@::::::::::::::::::::::::::::::@@@#:::::::::::::::::::::::::::::::::::::::::::::::::--:::::::::@@@@
// @@*::::::::::::::::::::::::::::::@@@#:::::::::+######*:::::::::::::::::::::::::::::::+@=:::::::::#@@@
// @@*::::::::::::::::::::::::::::::@@@#:::--::::===+*+==:::::=-:::::::=-::::::-::::::::+@=:::::::::+@@@
// @@:::::::::::::::::::::::::::::::@@@#::+@#@@::-#@@%@%=::=@@@@+:::+@@@@@+-::@@@@%*-::#@@%#:::::::::@@@
// @@:::::::::::::::::+*##%%#*=-::::@@@#::+@@=::-%@:::-*@=:%@-:=:::*@*:::-@*::@@-:=@%::=*@*=:::::::::@@@
// @@::::::::::::::+%@@@@@@@@@@@%*-:@@@#::+@*:::*@@@@@@@@#:+@%*-:::@@@@@@@@@-:@%:::#@:::+@=::::::::::@@@
// @%::::::::::::*@@@@@@@@@@@@@@@@@#+@@#::+@+:::+@=-------:::=%@*::@%-------::@%:::#@:::+@=::::::::::%@@
// @%::::::::::-@@@@@@++-::::-=#@@@@@+*#::+@+:::-@%=-:+%%-:-=::#@::*@*-::+%=::@%:::#@:::+@=::::::::::#@@
// @%:::::::::=@@@@%+::::::::::::#@@@@**::+@+::::-#@@@@%=::#@%%@+:::+@@@@@*:::@%:::#@:::+@=::::::::::%@@
// @%::::::::-@@@@+:::::::::::::::-@@@@+:::-::::::::--:::::::=-:::::::-=-:::::--:::-=----=-::::::::::%@@
// @@:::::::-@@@@*:::::::::::::::::-%%%*:::::::::::::::::::::::::::::::::::::::::::+%%%%%%#::::::::::@@@
// @@:::::::*@@@#:::::::+#@%*-::::::=+*#*=+#*=-:::::+#%%#-::::::=#%%#=::::-#@@#-::::=##%#+-::::::::::@@@
// @@-::::::@@@@-:::::-%@#+*%@*:::::%@#+#@@+*@*::::%@+==#@*::::%@#+=%@*-::%@-=*=:::*@*+=+@%-::::::::-@@@
// @@+:::::-@@@@::::::#@=::::#@=::::%@::=@*::#@-::*@=::::-@+::*@*::::*@*::*@*-::::-@@####%@#::::::::*@@@
// @@#:::::-@@@*::::::@@:::::=@*::::%@::=@*::#@-::%@::::::@*::%@-::::-@%:::=%@%-::*@#******+::::::::*@@@
// @@@-::::-@@@%::::::#@+::::%@-::::%@::=@*::#@-::@@-::::=@-::*@*::::*@*:::-::@%::=@*::::-=-::::::::@@@@
// @@@+:::::@@@@-::::::%@%*#@@+:::::%@::=@*::#@-::@@@#=+#@+::::*@%*+@@*:::#@*+@*:::*@%*+%@%::::::::-@@@@
// @@@#:::::#@@@+:::::::=*##+-::::::+*::-*=::+*:::@%=*%#*-::::::=*%#*-:::::=*#+:::::-*##*=--=::::::*@@@@
// @@@@-::::=@@@@-::::::::::::::::::=**+::::::::::@%:::::::::::::::::::::::-==++**##%%@@@@@@@-::::-@@@@@
// @@@@*:::::*@@@@-::::::::::::::::+@@@#::::::::::::::::::::-==++**##=-#@@@@@@@@@@@@@@@@@@@@@=::::*@@@@@
// @@@@@-:::::#@@@@+-:::::::::::::*@@@@::::::-==++--##%@@@@@@@@@#*#@@%%@@@@@@@@@@@#@@@@@*#@@@+:::-@@@@@@
// @@@@@%::::::*@@@@@+-:::::::::+@@@@%:=@@@@@@@@@@==@@@**%@@@@*-#@*-@@*@@@*-+**@@@:%@@==@++@@*:::%@@@@@@
// @@@@@@*::::::=@@@@@@@%%**##@@@@@@=::=@@@@#-:--=-=@@=+@+=@@@:%@@@=+@-*@*-@@@+:@@=#@:*@@%-@@#::+@@@@@@@
// @@@@@@@-:::::::+%@@@@@@@@@@@@@@#-::::@@@+-%@@@*--@@:@@=*@@@%=*%@@@@*=@-*@@@*:+@=+=#@@@%:@@%:-@@@@@@@@
// @@@@@@@@-::::::::=*%@@@@@@@##-:::::::@@@:#@@@@@*:@@:%==@@@@@@%+-%@@#-@*+@@@:+:@*:*@@@@@:%@@-@@@@@@@@@
// @@@@@@@@#-:::::::::::::-:::::::::::::@@%:%@@@@@*-@@-#@@@#-@*%@@@-#@@:@@#=+:%@-#@:@@@@@@*=@@%@@@@@@@@@
// @@@@@@@@@*:::::::::::::::::::::::::::#@@--@@@@%:*@@%*+*=*@@=+@@@=+@@-#@@@@@@@=#@#@@@@@@@@@@@@@@@@@@@@
// @@@@@@@@@@*-:::::::::::::::::::::::::#@@@+-==-:#@@@@@@@@@@@@#++*#@@@@@@@#@@@%:@@@@@@@@@@@@@@@@@@@@@@@
// @@@@@@@@@@@*-::::::::::::::::::::::::+@@@@@%%@@@@@@@@@@@@@@@@@@@@@@@@@@@@-=-:+**++==--::%@@@@@@@@@@@@
// @@@@@@@@@@@@#-:::::::::::::::::::::::=@@@@@@@@@@@@@@@@@@@@@%%##**++=---::::::::::::::::%@@@@@@@@@@@@@
// @@@@@@@@@@@@@@-::::::::::::::::::::::-@@@@@@%###**++=--::::::::::::::::::::::::::::::-%@@@@@@@@@@@@@@
// @@@@@@@@@@@@@@@+::::::::::::::::::::::--::::::::::::::::::::::::::::::::::::::::::::+@@@@@@@@@@@@@@@@
// @@@@@@@@@@@@@@@@%-::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::-%@@@@@@@@@@@@@@@@@
// @@@@@@@@@@@@@@@@@@+-:::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::+@@@@@@@@@@@@@@@@@@@
// @@@@@@@@@@@@@@@@@@@%=::::::::::::::::::::::::::::::::::::::::::::::::::::::::::+%@@@@@@@@@@@@@@@@@@@@
// @@@@@@@@@@@@@@@@@@@@@%=::::::::::::::::::::::::::::::::::::::::::::::::::::::=%@@@@@@@@@@@@@@@@@@@@@@
// @@@@@@@@@@@@@@@@@@@@@@@%=-:::::::::::::::::::::::::::::::::::::::::::::::::+%@@@@@@@@@@@@@@@@@@@@@@@@
// @@@@@@@@@@@@@@@@@@@@@@@@@@*-:::::::::::::::::::::::::::::::::::::::::::::#@@@@@@@@@@@@@@@@@@@@@@@@@@@
// @@@@@@@@@@@@@@@@@@@@@@@@@@@@%+-:::::::::::::::::::::::::::::::::::::::+%@@@@@@@@@@@@@@@@@@@@@@@@@@@@@
// @@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@%*=-:::::::::::::::::::::::::::::::+#@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@
// @@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@%**=-:::::::::::::::::::::=+#@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@
// @@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@%%**++=====+++*##@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@
// @@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@
-->

<!--
  ============================================================================
  BIRDSIGNAL · ETUDE DE CAS
  Bloc HTML personnalise Elementor, pour https://presentcomposedesign.fr/birdsignal-infos

  A COLLER TEL QUEL dans un widget "HTML" d'Elementor. Le bloc est autonome :
  styles et scripts vivent dedans et sont tous prefixes "bsm-", de sorte qu'ils
  ne peuvent ni deborder sur le theme ni en recevoir.

  RIEN N'EST A REMPLIR : le bloc est complet. Tout est dessine ici meme, en
  SVG et en canvas (logo et declinaisons, carte qui tourne, poincons de rang,
  carte des releves), sauf deux choses qui vivent sur le serveur et qui
  DOIVENT y rester :

    1. le visualiseur 3D enginR, appele en fond du bloc « Elle s'installe
       partout » ;
    2. l'enregistrement sonore
       /tools/birdsignal/Birds-in-town_6am_Toulouse_12b-r-l.plana.mp4
       que le bouton de son joue, et dont le spectrogramme de cette page a ete
       calcule.

  Si l'enregistrement disparaissait du serveur, le bouton resterait sans
  effet, mais la page, elle, continuerait de fonctionner : le spectrogramme
  est une image embarquee, il ne depend de rien.
  ============================================================================
-->

<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+Tight:wght@300;400;500;600;700;800&display=swap" rel="stylesheet">

<style>
/* ===========================================================================
   Tout est enferme sous #bsm. Aucune regle ne vise un selecteur global : un
   bloc insere dans un theme ne doit jamais pouvoir repeindre ce qui l'entoure.
   =========================================================================== */
#bsm {
  --bsm-blue: #1001ef;
  --bsm-soft: #eeecff;
  --bsm-ink: #0d1020;
  --bsm-mid: #5d6479;
  --bsm-line: #e4e6f0;
  --bsm-wash: #f7f8fc;
  --bsm-night: #10131f;

  box-sizing: border-box;
  margin: 0; padding: 0;
  font-family: "Inter Tight", "Helvetica Neue", Arial, system-ui, sans-serif;
  color: var(--bsm-ink); background: #fff;
  line-height: 1.5;
  -webkit-font-smoothing: antialiased;
}
#bsm *, #bsm *::before, #bsm *::after { box-sizing: border-box; }
#bsm p, #bsm h1, #bsm h2, #bsm h3, #bsm ul, #bsm li, #bsm figure { margin: 0; }
#bsm ul { padding: 0; list-style: none; }
#bsm img, #bsm svg { max-width: 100%; display: block; }
/* [hidden] vient de la feuille du navigateur : la regle ci-dessus, qui est
   une regle d'auteur, la battait, et l'image source du spectrogramme
   s'affichait en clair au-dessus de la section. */
#bsm [hidden] { display: none; }
#bsm a { color: inherit; text-decoration: none; }

#bsm .bsm-wrap { width: 100%; max-width: 1060px; margin: 0 auto; padding: 0 20px; }
#bsm .bsm-sec { padding: 76px 0; position: relative; overflow: hidden; }
#bsm .bsm-sec--wash { background: var(--bsm-wash); }
#bsm .bsm-sec--night { background: var(--bsm-night); color: #eef0f8; }

/* --------------------------------------------------------------- typographie */
#bsm .bsm-kicker {
  display: inline-flex; align-items: center; gap: 8px;
  font-size: 11.5px; font-weight: 700; letter-spacing: .16em; text-transform: uppercase;
  color: var(--bsm-blue); margin-bottom: 14px;
}
#bsm .bsm-kicker::before { content: ""; width: 24px; height: 2px; background: currentColor; }
/* Sur fond sombre, le bleu de marque tombe a un contraste illisible : il passe
   a sa version claire. Le trait suit, il est en currentColor. */
#bsm .bsm-sec--night .bsm-kicker { color: #8f97ff; }
#bsm h1.bsm-h1 { font-size: clamp(2.6rem, 7vw, 4.6rem); font-weight: 800; line-height: .98; letter-spacing: -.04em; }
#bsm h2.bsm-h2 { font-size: clamp(1.55rem, 3.4vw, 2.3rem); font-weight: 800; line-height: 1.1; letter-spacing: -.03em; margin-bottom: 14px; }
#bsm .bsm-sec--night h2.bsm-h2 { color: #fff; }
#bsm h3.bsm-h3 { font-size: 1.05rem; font-weight: 700; letter-spacing: -.015em; margin-bottom: 6px; }
#bsm .bsm-lede { font-size: clamp(1.05rem, 2vw, 1.25rem); color: var(--bsm-mid); max-width: 58ch; }
#bsm .bsm-p { color: var(--bsm-mid); font-size: 15px; max-width: 62ch; }
#bsm .bsm-sec--night .bsm-p, #bsm .bsm-sec--night .bsm-lede { color: #aeb5cb; }
#bsm .bsm-p strong, #bsm .bsm-lede strong { color: var(--bsm-ink); font-weight: 700; }
#bsm .bsm-sec--night .bsm-p strong { color: #fff; }

/* ---------------------------------------------------------------------- hero */
#bsm .bsm-hero {
  position: relative; overflow: hidden; padding: 92px 0 68px;
  background:
    radial-gradient(1000px 480px at 78% -10%, rgba(16,1,239,.14), transparent 60%),
    radial-gradient(700px 380px at 4% 108%, rgba(122,92,255,.12), transparent 58%),
    #fff;
}
#bsm .bsm-hero-grid { display: grid; gap: 40px; align-items: center; grid-template-columns: minmax(0,1.2fr) minmax(0,.8fr); }
#bsm .bsm-mark { width: min(280px, 72%); margin-inline: auto; }
/* Le signe est pose par <use> : c'est le <svg> qui porte la couleur, car
   `fill` s'herite jusque dans l'arbre d'ombre, contrairement aux selecteurs
   CSS et a `opacity`. L'entree se joue donc sur le conteneur (.bsm-zoom). */
#bsm .bsm-mark svg { width: 100%; fill: var(--bsm-blue); filter: drop-shadow(0 24px 44px rgba(16,1,239,.22)); }

#bsm .bsm-tags { display: flex; flex-wrap: wrap; gap: 7px; margin-top: 22px; }
#bsm .bsm-tag {
  font-size: 12px; font-weight: 600; padding: 6px 12px; border-radius: 999px;
  border: 1px solid var(--bsm-line); background: #fff; color: var(--bsm-mid);
}
#bsm .bsm-tag--on { background: var(--bsm-blue); border-color: var(--bsm-blue); color: #fff; }

#bsm .bsm-eq { display: flex; align-items: flex-end; gap: 3px; height: 46px; margin-top: 28px; opacity: .45; }
#bsm .bsm-eq i {
  flex: 1 1 0; min-width: 2px; border-radius: 3px 3px 0 0;
  background: linear-gradient(180deg, var(--bsm-blue), rgba(16,1,239,.22));
  transform-origin: bottom; animation: bsm-bar 1.6s ease-in-out infinite alternate;
}
@keyframes bsm-bar { from { transform: scaleY(.16); } to { transform: scaleY(1); } }

/* ------------------------------------------------------------------- boutons */
#bsm .bsm-cta { display: flex; flex-wrap: wrap; gap: 10px; margin-top: 26px; }
#bsm .bsm-btn {
  display: inline-flex; align-items: center; gap: 8px;
  padding: 13px 22px; border-radius: 13px; font-weight: 700; font-size: 14.5px;
  border: 1px solid var(--bsm-blue); background: var(--bsm-blue); color: #fff;
  transition: transform .16s ease, box-shadow .16s ease, background .16s ease;
}
#bsm .bsm-btn:hover { transform: translateY(-2px); box-shadow: 0 14px 28px rgba(16,1,239,.3); }
#bsm .bsm-btn--ghost { background: transparent; color: var(--bsm-blue); }
#bsm .bsm-btn--ghost:hover { background: var(--bsm-soft); box-shadow: none; }
#bsm .bsm-sec--night .bsm-btn--ghost { color: #bfc5ff; border-color: rgba(191,197,255,.45); }
#bsm .bsm-sec--night .bsm-btn--ghost:hover { background: rgba(143,151,255,.14); }

/* --------------------------------------------------------------- points cles */
#bsm .bsm-keys { display: grid; gap: 10px; margin-top: 8px; }
#bsm .bsm-keys li {
  display: flex; gap: 12px; align-items: flex-start;
  font-size: 15.5px; font-weight: 600; color: var(--bsm-ink);
  padding: 13px 16px; border: 1px solid var(--bsm-line); border-radius: 13px; background: #fff;
  transition: transform .2s ease, border-color .2s ease, box-shadow .2s ease;
}
#bsm .bsm-keys li:hover { transform: translateX(4px); border-color: rgba(16,1,239,.3); box-shadow: 0 10px 26px rgba(13,16,32,.07); }
#bsm .bsm-keys li::before {
  content: ""; flex: 0 0 auto; width: 8px; height: 8px; border-radius: 50%;
  background: var(--bsm-blue); margin-top: 8px;
}

/* ------------------------------------------------------------------- chiffres */
#bsm .bsm-stats { display: grid; grid-template-columns: repeat(4, minmax(0,1fr)); gap: 14px; margin-top: 30px; }
#bsm .bsm-stat { text-align: center; padding: 20px 10px; border-radius: 16px; background: rgba(255,255,255,.05); border: 1px solid rgba(255,255,255,.12); }
#bsm .bsm-stat b { display: block; font-size: clamp(1.6rem, 3.6vw, 2.3rem); font-weight: 800; letter-spacing: -.04em; color: #fff; }
#bsm .bsm-stat span { font-size: 11px; text-transform: uppercase; letter-spacing: .1em; color: #8f97ff; font-weight: 700; }

/* --------------------------------------------------------------------- etapes */
#bsm .bsm-steps { display: grid; gap: 14px; margin-top: 30px; grid-template-columns: repeat(2, minmax(0,1fr)); }
#bsm .bsm-step {
  border: 1px solid var(--bsm-line); border-radius: 16px; padding: 22px; background: #fff;
  transition: transform .2s ease, box-shadow .2s ease, border-color .2s ease;
}
#bsm .bsm-step:hover { transform: translateY(-3px); border-color: rgba(16,1,239,.35); box-shadow: 0 16px 36px rgba(13,16,32,.08); }
#bsm .bsm-num {
  display: inline-grid; place-items: center; width: 30px; height: 30px; border-radius: 9px;
  background: var(--bsm-soft); color: var(--bsm-blue); font-weight: 800; font-size: 13px; margin-bottom: 12px;
}

/* -------------------------------------------------------------- emplacements */
#bsm .bsm-slot { margin-top: 26px; }
#bsm .bsm-ph {
  border: 2px dashed rgba(16,1,239,.28); border-radius: 16px; background: var(--bsm-soft);
  min-height: 200px; display: grid; place-items: center; text-align: center; padding: 24px;
  color: var(--bsm-blue); font-size: 13px; font-weight: 600;
}
#bsm .bsm-slot img { border-radius: 16px; border: 1px solid var(--bsm-line); width: 100%; }
#bsm .bsm-cap { font-size: 12.5px; color: var(--bsm-mid); margin-top: 9px; font-style: italic; }
#bsm .bsm-sec--night .bsm-cap { color: #8b92a8; }

/* --------------------------------------------------------------- visualiseur */

/* ---------------------------------------------------------------- services */
#bsm .bsm-serv { display: grid; grid-template-columns: repeat(3, minmax(0,1fr)); gap: 14px; margin-top: 30px; }
#bsm .bsm-serv .bsm-step { background: var(--bsm-wash); }

/* ---------------------------------------------------------------------- final */
#bsm .bsm-final { text-align: center; }
#bsm .bsm-final .bsm-lede { margin-inline: auto; }
#bsm .bsm-final .bsm-cta { justify-content: center; }
#bsm .bsm-legal { font-size: 12px; color: var(--bsm-mid); margin-top: 34px; max-width: 74ch; margin-inline: auto; }

/* ===========================================================================
   SPECTROGRAMME ANIME
   Le dessin est en canvas et non en CSS : un spectrogramme est une image de
   donnees, pas une decoration. Des barres CSS auraient l'air d'un egaliseur
   de chaine hi-fi, ce qui raconterait exactement le contraire de ce que fait
   l'application.
   =========================================================================== */
#bsm .bsm-spectro {
  position: relative; border-radius: 18px; overflow: hidden; margin-top: 26px;
  border: 1px solid rgba(255,255,255,.12); background: #070a16;
  aspect-ratio: 1000 / 260;
}
#bsm .bsm-spectro canvas { position: absolute; inset: 0; display: block; width: 100%; height: 100%; }
/* Image de repli, posee SOUS le canvas : elle montre tout l'extrait d'un coup.
   Sans script, c'est elle qu'on voit, et le propos reste entier. */
#bsm .bsm-spectro-fond { position: absolute; inset: 0; width: 100%; height: 100%; }
#bsm .bsm-spectro-legend {
  position: absolute; left: 14px; top: 12px; display: flex; gap: 8px; align-items: center;
  font-size: 11px; font-weight: 700; letter-spacing: .12em; text-transform: uppercase; color: #8f97ff;
  pointer-events: none;
}
#bsm .bsm-spectro-legend i {
  width: 7px; height: 7px; border-radius: 50%; background: #7ef0ff;
  animation: bsm-pulse 1.8s ease-out infinite;
}
@keyframes bsm-pulse {
  0% { box-shadow: 0 0 0 0 rgba(126,240,255,.55); }
  70% { box-shadow: 0 0 0 10px rgba(126,240,255,0); }
  100% { box-shadow: 0 0 0 0 rgba(126,240,255,0); }
}
#bsm .bsm-spectro-axis {
  position: absolute; right: 12px; top: 12px; bottom: 12px;
  display: flex; flex-direction: column; justify-content: space-between;
  font-size: 10px; font-weight: 600; color: rgba(174,181,203,.6); text-align: right; pointer-events: none;
  /* La graduation du bas tombe sur la bande claire de la ville : sans cette
     ombre portee, elle s'y dissout. */
  text-shadow: 0 1px 4px rgba(7,10,22,.95), 0 0 2px rgba(7,10,22,.95);
}
#bsm .bsm-chain { display: grid; grid-template-columns: repeat(3, minmax(0,1fr)); gap: 12px; margin-top: 18px; }
#bsm .bsm-chain div {
  border: 1px solid rgba(255,255,255,.12); border-radius: 14px; padding: 16px;
  background: rgba(255,255,255,.04);
}
#bsm .bsm-chain b { display: block; font-size: 13px; color: #fff; font-weight: 700; margin-bottom: 4px; }
#bsm .bsm-chain span { font-size: 12.5px; color: #aeb5cb; }

/* ===========================================================================
   POINCONS DE RANG
   Reproduits a l'identique de ceux imprimes au verso des cartes : meme encre,
   meme substrat metallise sombre, meme anneau de 3,5 px et meme filet
   interieur. Les valeurs sont copiees depuis le code de l'application
   (GRADE_INK et drawGradeLabel), pas approchees a l'oeil.
   =========================================================================== */
#bsm .bsm-badges {
  display: grid; grid-template-columns: repeat(4, minmax(0,1fr)); gap: 16px; margin-top: 30px;
  perspective: 900px;
}
#bsm .bsm-badge-cell { text-align: center; }
#bsm .bsm-badge {
  --ink: linear-gradient(#c4cde4, #c4cde4);
  --ring-a: 1;
  --hair-a: .55;
  --disc: linear-gradient(135deg, rgba(26,31,58,.95), rgba(8,10,22,.95));
  position: relative; width: 104px; height: 104px; margin: 0 auto 12px;
  border-radius: 50%; background-image: var(--disc);
  transform-style: preserve-3d;
  transform: rotateX(var(--rx, 0deg)) rotateY(var(--ry, 0deg));
  transition: transform .2s ease-out;
  box-shadow: 0 14px 30px rgba(8,10,22,.3);
}
#bsm .bsm-badge i { position: absolute; border-radius: 50%; background-image: var(--ink); pointer-events: none; }
/* L'anneau et le filet sont des disques ajoures par un masque : c'est le seul
   moyen de leur donner une encre en degrade conique, qu'aucune couleur de
   bordure ne sait porter. */
#bsm .bsm-badge .bsm-ring {
  inset: 2px; opacity: var(--ring-a);
  -webkit-mask: radial-gradient(farthest-side, transparent calc(100% - 3.5px), #000 calc(100% - 3.5px));
          mask: radial-gradient(farthest-side, transparent calc(100% - 3.5px), #000 calc(100% - 3.5px));
}
#bsm .bsm-badge .bsm-hair {
  inset: 13px; opacity: var(--hair-a);
  -webkit-mask: radial-gradient(farthest-side, transparent calc(100% - 1px), #000 calc(100% - 1px));
          mask: radial-gradient(farthest-side, transparent calc(100% - 1px), #000 calc(100% - 1px));
}
/* Reflet qui suit le pointeur : c'est lui qui donne la sensation du metal,
   bien plus que la couleur. */
#bsm .bsm-badge .bsm-gloss {
  inset: 0; background-image: none;
  background: radial-gradient(58px 58px at var(--gx, 50%) var(--gy, 28%), rgba(255,255,255,.32), transparent 62%);
  mix-blend-mode: screen;
}
/* La lettre est peinte avec l'encre du rang, donc avec un degrade decoupe sur
   le texte. Si le navigateur ne sait pas faire, `-webkit-text-fill-color:
   transparent` s'appliquerait quand meme et la lettre disparaitrait : d'ou la
   couleur pleine par defaut, et le degrade seulement sous condition. */
#bsm .bsm-badge b {
  position: absolute; inset: 0; display: grid; place-items: center;
  font-size: 31px; font-weight: 800; letter-spacing: -.02em; line-height: 1;
  color: var(--plat, #c4cde4);
}
@supports ((-webkit-background-clip: text) or (background-clip: text)) {
  #bsm .bsm-badge b {
    background-image: var(--ink); -webkit-background-clip: text; background-clip: text;
    color: transparent; -webkit-text-fill-color: transparent;
  }
}
#bsm .bsm-badge--uc {
  --ink: linear-gradient(rgba(150,155,170,.75), rgba(150,155,170,.75));
  --plat: #8a8fa0;
  --ring-a: .7; --hair-a: .4;
  /* Rang Uc : aucun substrat metallise, exactement comme sur la carte, ou la
     mention doit se voir sans briller. */
  --disc: linear-gradient(#f1f2f7, #e6e8f1);
  box-shadow: 0 10px 22px rgba(13,16,32,.12);
}
#bsm .bsm-badge--uc .bsm-gloss { background: none; }
#bsm .bsm-badge--sd { --ink: linear-gradient(rgba(196,205,228,.9), rgba(196,205,228,.9)); --plat: #c4cde4; }
#bsm .bsm-badge--or { --ink: linear-gradient(#ffc95e, #ffc95e); --plat: #ffc95e; }
#bsm .bsm-badge--dd {
  --plat: #9be8ff;
  --ink: conic-gradient(from calc(-34deg + var(--sweep, 0deg)), #7ef0ff, #8f9dff, #e6a8ff, #ffd79a, #9dffdd, #7ef0ff);
}
#bsm .bsm-badge-name { display: block; font-size: 14.5px; font-weight: 700; }
#bsm .bsm-badge-cell span { display: block; font-size: 12.5px; color: var(--bsm-mid); margin-top: 2px; }

/* ===========================================================================
   CARTE QUI TOURNE
   Deux faces opaques dos a dos, en rotation continue. Chaque face porte
   `backface-visibility: hidden`, sans quoi on lirait le texte du verso par
   transparence a chaque demi-tour.
   =========================================================================== */
#bsm .bsm-stage { perspective: 1500px; display: grid; place-items: center; padding: 14px 0 4px; }
#bsm .bsm-card3d {
  position: relative; width: min(290px, 74vw); aspect-ratio: 63 / 88;
  transform-style: preserve-3d; animation: bsm-spin 18s linear infinite;
}
#bsm .bsm-stage:hover .bsm-card3d { animation-play-state: paused; }
@keyframes bsm-spin { from { transform: rotateY(0deg); } to { transform: rotateY(360deg); } }
#bsm .bsm-face {
  position: absolute; inset: 0; border-radius: 18px; overflow: hidden;
  -webkit-backface-visibility: hidden; backface-visibility: hidden;
  box-shadow: 0 26px 60px rgba(8,10,22,.45), inset 0 0 0 1px rgba(255,255,255,.1);
  padding: 12px; display: flex; flex-direction: column; gap: 8px;
  background: linear-gradient(158deg, #232b4f, #161c33 64%, #1d2440);
  color: #f5f6ff;
}
#bsm .bsm-face--back { transform: rotateY(180deg); }
#bsm .bsm-cardtop { display: flex; align-items: center; justify-content: space-between; gap: 8px; }
#bsm .bsm-cardbrand { display: flex; align-items: center; gap: 6px; font-size: 12px; font-weight: 800; letter-spacing: -.01em; }
#bsm .bsm-cardbrand svg { width: 15px; height: 15px; }
#bsm .bsm-cardbrand em { font-style: normal; color: #8b96ff; }
#bsm .bsm-pill {
  font-size: 9px; font-weight: 700; padding: 3px 8px; border-radius: 999px;
  border: 1px solid rgba(245,246,255,.28); color: rgba(245,246,255,.86);
}
#bsm .bsm-cardphoto {
  border-radius: 12px; aspect-ratio: 4 / 3; position: relative; overflow: hidden;
  background: linear-gradient(150deg, #3c4f8a, #22305c 58%, #4a3b74);
  display: grid; place-items: center;
}
#bsm .bsm-cardphoto svg { width: 54%; opacity: .3; fill: #fff; }
#bsm .bsm-cardname { font-size: 17px; font-weight: 800; letter-spacing: -.02em; line-height: 1.1; }
#bsm .bsm-cardsci { font-size: 11.5px; font-style: italic; color: rgba(245,246,255,.62); }
#bsm .bsm-cardmeta { font-size: 9.5px; color: rgba(245,246,255,.62); line-height: 1.35; }
#bsm .bsm-gauge { margin-top: auto; }
#bsm .bsm-gauge-row { display: flex; justify-content: space-between; align-items: baseline; font-size: 8.5px; font-weight: 700; letter-spacing: .07em; text-transform: uppercase; color: rgba(245,246,255,.62); }
#bsm .bsm-gauge-row b { font-size: 12px; letter-spacing: 0; color: #f5f6ff; }
#bsm .bsm-gauge-track { height: 5px; border-radius: 999px; background: rgba(255,255,255,.14); margin: 3px 0 7px; overflow: hidden; }
#bsm .bsm-gauge-fill { height: 100%; border-radius: 999px; }
#bsm .bsm-gauge-fill--rar { background: linear-gradient(90deg, #4ade80, #86efac); width: 8%; }
#bsm .bsm-gauge-fill--conf { background: linear-gradient(90deg, #8b96ff, #c4b5fd); width: 91%; }
#bsm .bsm-cardfoot { display: flex; align-items: flex-end; justify-content: space-between; gap: 8px; }
/* Le scelle holographique du recto : meme film irise que le poincon Dd. */
#bsm .bsm-seal {
  width: 44px; height: 44px; border-radius: 50%; flex: 0 0 auto; position: relative;
  background-image: conic-gradient(from -34deg, #7ef0ff, #8f9dff, #e6a8ff, #ffd79a, #9dffdd, #7ef0ff);
  -webkit-mask: radial-gradient(farthest-side, transparent calc(100% - 3px), #000 calc(100% - 3px));
          mask: radial-gradient(farthest-side, transparent calc(100% - 3px), #000 calc(100% - 3px));
  animation: bsm-sealspin 9s linear infinite;
}
@keyframes bsm-sealspin { to { filter: hue-rotate(360deg); } }
#bsm .bsm-cardspectro { border-radius: 10px; overflow: hidden; height: 62px; background: #0a0f24; }
#bsm .bsm-cardspectro canvas { width: 100%; height: 100%; display: block; }
#bsm .bsm-cardrows { display: grid; gap: 5px; font-size: 9px; }
#bsm .bsm-cardrows div { display: flex; justify-content: space-between; gap: 8px; }
#bsm .bsm-cardrows span { color: rgba(245,246,255,.55); letter-spacing: .06em; text-transform: uppercase; font-weight: 700; }
#bsm .bsm-cardrows b { font-weight: 700; text-align: right; }
#bsm .bsm-cardback-mark { display: grid; place-items: center; padding: 6px 0; }
#bsm .bsm-cardback-mark svg { width: 44%; fill: url(#bsm-gold); }

/* ===========================================================================
   CARTE DES RELEVES
   Fond abstrait volontaire : ce n'est pas une carte geographique reelle, et
   en dessiner une fausse laisserait croire a des donnees qui n'existent pas.
   Ce qui est vrai, et qui est le propos, c'est le lien entre une prise de son
   et l'endroit ou elle a ete faite.
   =========================================================================== */
#bsm .bsm-map {
  position: relative; border-radius: 20px; overflow: hidden; margin-top: 26px;
  background: linear-gradient(150deg, #101a3a, #0a0f24);
  border: 1px solid rgba(255,255,255,.12); aspect-ratio: 16 / 9;
}
#bsm .bsm-map svg { position: absolute; inset: 0; width: 100%; height: 100%; }
#bsm .bsm-trail { fill: none; stroke: #8f97ff; stroke-width: 1.6; stroke-dasharray: 5 7; stroke-linecap: round; opacity: .75; }
#bsm.bsm-js .bsm-trail { stroke-dashoffset: 900; }
#bsm.bsm-js .bsm-in .bsm-trail { animation: bsm-draw 3.4s cubic-bezier(.35,.1,.25,1) forwards; }
@keyframes bsm-draw { to { stroke-dashoffset: 0; } }
/* Transition et non animation, comme partout ailleurs dans ce bloc : un seul
   mecanisme d'apparition, donc un seul endroit ou se tromper. Une animation
   `forwards` qui ne demarrerait pas laisserait l'epingle invisible pour
   toujours, alors qu'une transition non jouee laisse simplement l'etat final. */
#bsm .bsm-pin {
  transform-origin: center;
  transition: opacity .5s ease, transform .5s cubic-bezier(.2,1.5,.45,1);
  transition-delay: calc(var(--i, 0) * 520ms);
}
#bsm.bsm-js .bsm-pin { opacity: 0; transform: translateY(9px) scale(.55); }
#bsm.bsm-js .bsm-in .bsm-pin { opacity: 1; transform: none; }
#bsm .bsm-pin text { font-family: inherit; font-size: 11px; font-weight: 700; fill: #eef0f8; }
#bsm .bsm-pin tspan { font-size: 9px; font-weight: 600; fill: rgba(174,181,203,.85); }

/* ===========================================================================
   DECLINAISONS DU LOGO
   =========================================================================== */
#bsm .bsm-logos { display: grid; grid-template-columns: repeat(3, minmax(0,1fr)); gap: 14px; margin-top: 28px; }
#bsm .bsm-logo {
  border: 1px solid var(--bsm-line); border-radius: 16px; background: #fff; overflow: hidden;
  transition: transform .2s ease, box-shadow .2s ease, border-color .2s ease;
}
#bsm .bsm-logo:hover { transform: translateY(-4px); border-color: rgba(16,1,239,.3); box-shadow: 0 16px 36px rgba(13,16,32,.09); }
#bsm .bsm-logo-art { aspect-ratio: 1; display: grid; place-items: center; padding: 22px; }
#bsm .bsm-logo-art svg { width: 100%; fill: var(--bsm-blue); }
#bsm .bsm-logo-art--blue { background: var(--bsm-blue); }
#bsm .bsm-logo-art--blue svg { fill: #fff; }
#bsm .bsm-logo-art--tile { padding: 0; }
#bsm .bsm-tile {
  width: 100%; height: 100%; display: grid; place-items: center;
  background: var(--bsm-blue); border-radius: 22%;
}
#bsm .bsm-tile svg { width: 72%; fill: #fff; }
#bsm .bsm-logo-lab { font-size: 11.5px; font-weight: 700; padding: 11px 14px; border-top: 1px solid var(--bsm-line); }
#bsm .bsm-logo-lab span { display: block; font-weight: 500; color: var(--bsm-mid); font-size: 11px; }
#bsm .bsm-favrow { display: flex; align-items: flex-end; gap: 16px; justify-content: center; }
#bsm .bsm-favrow figure { text-align: center; }
#bsm .bsm-favrow svg { fill: var(--bsm-blue); }
#bsm .bsm-favrow figcaption { font-size: 9px; color: var(--bsm-mid); margin-top: 6px; font-weight: 600; }

/* ===========================================================================
   APPARITIONS
   L'etat cache n'existe QUE si le script a pu poser .bsm-js. Sans cette
   condition, un script bloque laisserait la page entierement vide, sans
   message et sans erreur. L'animation est un supplement, jamais la condition
   d'affichage.
   Le decalage vient d'une variable --i posee dans le HTML, et non d'une serie
   de :nth-child : une liste de six elements reclamerait six regles, et la
   septieme serait oubliee.
   =========================================================================== */
#bsm .bsm-rise, #bsm .bsm-left, #bsm .bsm-zoom {
  transition: opacity .65s ease, transform .65s cubic-bezier(.2,.75,.25,1);
  transition-delay: calc(var(--i, 0) * 70ms);
}
#bsm.bsm-js .bsm-rise { opacity: 0; transform: translateY(24px); }
#bsm.bsm-js .bsm-left { opacity: 0; transform: translateX(-26px); }
#bsm.bsm-js .bsm-zoom { opacity: 0; transform: scale(.93); }
#bsm.bsm-js .bsm-in.bsm-rise, #bsm.bsm-js .bsm-in .bsm-rise,
#bsm.bsm-js .bsm-in.bsm-left, #bsm.bsm-js .bsm-in .bsm-left,
#bsm.bsm-js .bsm-in.bsm-zoom, #bsm.bsm-js .bsm-in .bsm-zoom { opacity: 1; transform: none; }

/* Sans pointeur, rien ne peut suivre la souris : le poincon respire de
   lui-meme, sinon les quatre rangs seraient quatre pastilles inertes. */
@media (hover: none) {
  #bsm .bsm-badge { animation: bsm-idle 6s ease-in-out infinite alternate; }
  #bsm .bsm-badge-cell:nth-child(2) .bsm-badge { animation-delay: -1.5s; }
  #bsm .bsm-badge-cell:nth-child(3) .bsm-badge { animation-delay: -3s; }
  #bsm .bsm-badge-cell:nth-child(4) .bsm-badge { animation-delay: -4.5s; }
  @keyframes bsm-idle {
    from { transform: rotateY(-11deg) rotateX(5deg); }
    to   { transform: rotateY(11deg) rotateX(-5deg); }
  }
}

/* ===========================================================================
   LE BLOC QUI PORTE LE VISUALISEUR EN FOND
   ---------------------------------------------------------------------------
   Le visualiseur n'est pas pose DANS une boite : il EST le fond de la section,
   et le texte se lit par-dessus. Trois consequences, toutes voulues :

   1. Le cadre du visualiseur est blanc, pas transparent. La section est donc
      blanche elle aussi : un bloc sombre aurait laisse une plaque blanche au
      milieu de la page. On epouse ce qu'on ne controle pas.
   2. Le texte est dans un calque « pointer-events: none ». Le lecteur fait
      donc tourner le telephone a travers le texte, ce qui est exactement ce
      qu'on lui demande de faire. Seuls les liens reprennent la souris.
   3. Un voile blanc, degrade, protege la colonne de texte. Sans lui, la
      lisibilite dependrait de l'angle du modele 3D, c'est-a-dire du hasard.
   =========================================================================== */
#bsm .bsm-hold {
  position: relative; overflow: hidden; background: #fff; padding: 0;
  display: flex; align-items: flex-start;
  min-height: clamp(640px, 92vh, 940px);
}
#bsm .bsm-hold-bg {
  position: absolute; inset: 0; width: 100%; height: 100%;
  border: 0; background: transparent; display: block;
}
#bsm .bsm-hold-fg {
  position: relative; z-index: 2; width: 100%; padding: 64px 0 40px;
  pointer-events: none;
  background: linear-gradient(180deg, #fff 0%, rgba(255,255,255,.95) 40%, rgba(255,255,255,0) 72%);
}
#bsm .bsm-hold-fg a, #bsm .bsm-hold-fg button { pointer-events: auto; }
#bsm .bsm-hold-col { max-width: 33rem; }
#bsm .bsm-hold .bsm-stats { margin-top: 26px; }
#bsm .bsm-hold .bsm-stat {
  background: rgba(255,255,255,.86); border-color: var(--bsm-line);
  backdrop-filter: blur(6px);
}
#bsm .bsm-hold .bsm-stat b { color: var(--bsm-ink); }
#bsm .bsm-hold .bsm-stat span { color: var(--bsm-blue); }
@media (min-width: 901px) {
  /* Le modele est centre dans son cadre : on decale le cadre pour qu'il se
     pose a droite du texte plutot que dessus. */
  #bsm .bsm-hold-bg { left: 26%; width: 74%; }
  #bsm .bsm-hold { align-items: center; }
  #bsm .bsm-hold-fg {
    padding: 48px 0;
    background: linear-gradient(100deg, #fff 0%, rgba(255,255,255,.96) 38%, rgba(255,255,255,0) 66%);
  }
}

/* -------------------------------------------------- systemes et gratuite */
#bsm .bsm-os { display: flex; flex-wrap: wrap; gap: 8px; margin-top: 22px; }
#bsm .bsm-os li {
  display: inline-flex; align-items: center; gap: 7px;
  font-size: 12.5px; font-weight: 600; color: var(--bsm-ink);
  border: 1px solid var(--bsm-line); background: rgba(255,255,255,.92);
  border-radius: 999px; padding: 7px 13px;
}
#bsm .bsm-os svg { width: 15px; height: 15px; flex: 0 0 auto; fill: none; stroke: var(--bsm-blue); stroke-width: 1.8; stroke-linecap: round; stroke-linejoin: round; }
#bsm .bsm-os .bsm-os--free { background: var(--bsm-blue); border-color: var(--bsm-blue); color: #fff; letter-spacing: .06em; text-transform: uppercase; font-weight: 800; font-size: 11.5px; }
#bsm .bsm-os .bsm-os--free svg { stroke: #fff; }

/* ------------------------------------------- capture du bureau Windows */
#bsm .bsm-shot { margin-top: 24px; max-width: 300px; }
#bsm .bsm-shot img {
  display: block; width: 100%; height: auto; border-radius: 16px;
  border: 1px solid var(--bsm-line); box-shadow: 0 22px 46px rgba(13,16,32,.2);
}
#bsm .bsm-shot figcaption { font-size: 12px; color: var(--bsm-mid); margin-top: 9px; font-style: italic; max-width: 34ch; }

/* ===========================================================================
   COMMANDE DE SON
   ---------------------------------------------------------------------------
   Aucun navigateur ne laisse une page demarrer un son sans geste du lecteur :
   la bande tourne donc muette, et ce bouton l'allume. Son intitule dit l'etat
   SUIVANT, jamais l'etat courant, parce que c'est ce qu'on clique.

   Il est cache tant que le script n'a pas pris la main : un bouton de son qui
   ne coupe rien vaut moins que pas de bouton du tout.
   =========================================================================== */
#bsm .bsm-sound { display: none; }
#bsm.bsm-js .bsm-sound {
  position: fixed; right: 18px; bottom: 18px; z-index: 40;
  display: inline-flex; align-items: center; gap: 9px;
  padding: 10px 16px 10px 12px; border-radius: 999px;
  border: 1px solid rgba(13,16,32,.12); background: rgba(255,255,255,.93);
  -webkit-backdrop-filter: blur(10px); backdrop-filter: blur(10px);
  box-shadow: 0 14px 34px rgba(13,16,32,.18);
  font-family: inherit; font-size: 12.5px; font-weight: 700; color: var(--bsm-ink);
  cursor: pointer; opacity: 0; transform: translateY(14px); pointer-events: none;
  transition: opacity .35s ease, transform .35s ease, box-shadow .2s ease;
}
#bsm.bsm-js.bsm-audible .bsm-sound { opacity: 1; transform: none; pointer-events: auto; }
#bsm.bsm-js .bsm-sound:hover { box-shadow: 0 18px 40px rgba(16,1,239,.24); }
#bsm .bsm-sound svg { width: 17px; height: 17px; fill: none; stroke: var(--bsm-blue); stroke-width: 1.9; stroke-linecap: round; stroke-linejoin: round; }
#bsm .bsm-sound .bsm-sound-on { display: none; }
#bsm.bsm-son .bsm-sound .bsm-sound-on { display: block; }
#bsm.bsm-son .bsm-sound .bsm-sound-off { display: none; }
/* Un fil d'onde qui ne bat que lorsque le son sort vraiment. */
#bsm .bsm-sound i {
  width: 6px; height: 6px; border-radius: 50%; background: var(--bsm-line); flex: 0 0 auto;
}
#bsm.bsm-son .bsm-sound i { background: #22c55e; animation: bsm-pulse 1.8s ease-out infinite; }
#bsm .bsm-audio-src { position: absolute; width: 1px; height: 1px; opacity: 0; pointer-events: none; }

/* ------------------------------------------------ vignettes du logo */
#bsm .bsm-logo-art--pair { display: flex; align-items: center; gap: 12px; padding: 16px; }
#bsm .bsm-fav { flex: 1; display: flex; flex-direction: column; align-items: center; gap: 8px; }
#bsm .bsm-fav-plate { display: grid; place-items: center; width: 100%; aspect-ratio: 1; border-radius: 15px; padding: 11px; }
#bsm .bsm-fav-plate--light { background: #fff; border: 1px solid var(--bsm-line); }
#bsm .bsm-fav-plate--dark { background: var(--bsm-night); }
#bsm .bsm-fav-plate svg { width: 100%; }
#bsm .bsm-fav figcaption { font-size: 9.5px; font-weight: 700; color: var(--bsm-mid); }
#bsm .bsm-logo-art--footer { background: #eceff7; padding: 24px; }
#bsm .bsm-logo-art--footer svg { width: 100%; filter: drop-shadow(0 10px 22px rgba(13,16,32,.14)); }

/* ------------------------------------------------------------------ responsive */
@media (max-width: 900px) {
  /*
   * Sur telephone, le visualiseur ne peut plus etre le fond de TOUTE la
   * section : le modele est centre dans son cadre, et le cadre fait alors la
   * hauteur du texte, si bien que le telephone se serait retrouve derriere
   * les vignettes, invisible. Il prend donc une bande qui lui est propre, en
   * pied de bloc, et le texte cesse d'avoir besoin d'un voile.
   */
  /* `#bsm .bsm-sec { padding: 58px 0 }` vit plus bas dans CE MEME bloc et a
     la meme specificite : elle gagnait, et le pied de 600 pixels reserve au
     visualiseur disparaissait. D'ou le selecteur compose, qui tranche. */
  #bsm .bsm-sec.bsm-hold { min-height: 0; padding: 0 0 600px; align-items: flex-start; }
  #bsm .bsm-hold-bg { top: auto; bottom: 0; height: 600px; }
  #bsm .bsm-hold-fg { padding: 52px 0 26px; background: none; }
  #bsm .bsm-hold-col { max-width: none; }
  #bsm .bsm-hero-grid { grid-template-columns: 1fr; }
  #bsm .bsm-mark { width: min(200px, 56%); margin-inline: 0; }
  #bsm .bsm-serv, #bsm .bsm-stats, #bsm .bsm-logos, #bsm .bsm-chain { grid-template-columns: repeat(2, minmax(0,1fr)); }
  #bsm .bsm-sec { padding: 58px 0; }
  #bsm .bsm-hero { padding: 64px 0 50px; }
}
@media (max-width: 620px) {
  #bsm .bsm-steps, #bsm .bsm-serv, #bsm .bsm-chain { grid-template-columns: 1fr; }
  #bsm .bsm-logos { grid-template-columns: repeat(2, minmax(0,1fr)); }
  #bsm .bsm-hold { min-height: clamp(560px, 86vh, 760px); }
  #bsm .bsm-hold-fg { padding-top: 44px; }
  #bsm .bsm-shot { max-width: 230px; }
  #bsm.bsm-js .bsm-sound { right: 12px; bottom: 12px; padding: 9px 13px 9px 10px; font-size: 12px; }
  #bsm .bsm-badges { grid-template-columns: repeat(2, minmax(0,1fr)); }
  #bsm .bsm-badge { width: 88px; height: 88px; }
  #bsm .bsm-badge b { font-size: 26px; }
  #bsm .bsm-badge .bsm-hair { inset: 11px; }
  #bsm .bsm-map { aspect-ratio: 4 / 3; }
  #bsm .bsm-spectro { aspect-ratio: 5 / 3; }
}

@media (prefers-reduced-motion: reduce) {
  #bsm .bsm-rise, #bsm .bsm-left, #bsm .bsm-zoom,
  #bsm.bsm-js .bsm-rise, #bsm.bsm-js .bsm-left, #bsm.bsm-js .bsm-zoom {
    opacity: 1; transform: none; transition: none;
  }
  #bsm .bsm-eq i { animation: none; transform: scaleY(.5); }
  #bsm .bsm-card3d { animation: none; }
  #bsm .bsm-seal { animation: none; }
  #bsm .bsm-spectro-legend i { animation: none; }
  #bsm.bsm-js .bsm-trail, #bsm.bsm-js .bsm-in .bsm-trail { stroke-dashoffset: 0; animation: none; }
  #bsm.bsm-js .bsm-pin, #bsm.bsm-js .bsm-in .bsm-pin { opacity: 1; transform: none; transition: none; }
  #bsm .bsm-btn:hover, #bsm .bsm-step:hover, #bsm .bsm-logo:hover, #bsm .bsm-keys li:hover { transform: none; }
  #bsm .bsm-badge { transition: none; animation: none; }
  #bsm.bsm-son .bsm-sound i { animation: none; }
}
</style>

<div id="bsm">

  <!--
    La bande sonore de la page : l'enregistrement dont le spectrogramme
    ci-dessous a ete calcule. preload="none" est delibere : rien n'est
    telecharge tant que personne n'a demande a entendre.
  -->
  <audio class="bsm-audio-src" data-bsm-audio preload="none" aria-hidden="true"
         src="https://pcdlabs.presentcomposedesign.fr/tools/birdsignal/Birds-in-town_6am_Toulouse_12b-r-l.plana.mp4"></audio>

  <button class="bsm-sound" type="button" data-bsm-sound aria-pressed="false">
    <i aria-hidden="true"></i>
    <svg class="bsm-sound-off" viewBox="0 0 24 24" aria-hidden="true"><path d="M4 9.5v5h3.6L12 18.5v-13L7.6 9.5H4z"/><path d="M16.5 9.5l4.5 5M21 9.5l-4.5 5"/></svg>
    <svg class="bsm-sound-on" viewBox="0 0 24 24" aria-hidden="true"><path d="M4 9.5v5h3.6L12 18.5v-13L7.6 9.5H4z"/><path d="M16 9a4.4 4.4 0 010 6M18.9 6.6a8.2 8.2 0 010 10.8"/></svg>
    <span data-bsm-sound-lab>Activer le son</span>
  </button>

  <!-- Le signe est defini UNE fois et reutilise par <use> : il apparait douze
       fois dans la page, et douze copies de deux longs traces seraient douze
       occasions de les voir diverger. La couleur vient du CSS par heritage de
       `fill`, puisque les traces n'en portent aucune. -->
  <svg width="0" height="0" style="position:absolute" aria-hidden="true" focusable="false">
    <defs>
      <symbol id="bsm-mark" viewBox="0 0 1024 1024">
        <path d="M880.58,0h-332.01c93.06,27.65,165.69,99.56,193.31,188.87l92.64,33.12c23,8.23,43.99,18.77,62.66,34.42-59.95,1.18-110.83,22.83-166.15,38.43-80.13,22.63-183.32,95.69-149.54,225.33,21.75,10.15,42.13,21.43,62.34,34.82,79.85,52.92,122.25,137.15,115.8,228.44-6.06,85.83-52.86,162.2-131.59,208.4-22.87,13.41-47.25,24.32-72.81,32.17h325.36c79.2,0,143.39-62.09,143.41-138.68V138.68c-.02-76.59-64.22-138.68-143.41-138.68h-.01Z"/>
        <path d="M534.78,604.76l-124.11-59.62-86.94-42.16c-20.47-9.92-37.86-23.29-55.29-38.04-55.23-46.72-86.17-115.15-82.82-188.48,39.48,62.43,103.62,97.78,171.01,128.58l141.51,61.85c2.18-38.77,21.32-106.04,38.48-135.46,39.58-67.83,101.74-105.27,180.27-123.72-27.9-9.85-49.77-27.77-65.27-53.06-20.07-32.75-47.58-56.6-81.1-75.48-32.12-14.98-65.33-27.04-102.54-27.06h-.3c-213.16-.01-385.98,178.89-385.96,399.58l.04,482.54,371.43-.34c48.61-.04,93.59-15.44,128.19-46.41,58.92-52.73,69.44-139.02,31.46-207.36-18.21-32.81-45.44-56.94-78.06-75.37h-.01ZM511.94,144.09c20.23,0,36.63,16.32,36.63,36.45s-16.4,36.47-36.63,36.47-36.63-16.32-36.63-36.47,16.42-36.45,36.63-36.45Z"/>
      </symbol>
      <linearGradient id="bsm-gold" x1="0" y1="0" x2="1" y2="1">
        <stop offset="0" stop-color="#ffe7a8"/><stop offset=".5" stop-color="#ffc95e"/><stop offset="1" stop-color="#b3801f"/>
      </linearGradient>
    </defs>
  </svg>

  <!-- ============================== HERO ================================ -->
  <header class="bsm-hero" data-bsm-reveal>
    <div class="bsm-wrap">
      <div class="bsm-hero-grid">
        <div>
          <p class="bsm-kicker bsm-rise">Étude de cas &middot; Application web sur mesure</p>
          <h1 class="bsm-h1 bsm-rise" style="--i:1">BirdSignal</h1>
          <p class="bsm-lede bsm-rise" style="--i:2;margin-top:18px">
            Une application web qui <strong>analyse le son</strong> pour identifier
            l'oiseau qui chante, et transforme chaque écoute en carte à
            collectionner géolocalisée. Imaginée, nommée, dessinée, développée,
            mise en ligne et <strong>hébergée en France</strong>.
          </p>
          <div class="bsm-tags bsm-rise" style="--i:3">
            <span class="bsm-tag bsm-tag--on">Idéation</span>
            <span class="bsm-tag">Naming</span>
            <span class="bsm-tag">Identité graphique</span>
            <span class="bsm-tag">UX / UI</span>
            <span class="bsm-tag">Développement</span>
            <span class="bsm-tag">3D temps réel</span>
            <span class="bsm-tag">IA embarquée</span>
            <span class="bsm-tag">Hébergement</span>
          </div>
          <div class="bsm-cta bsm-rise" style="--i:4">
            <a class="bsm-btn" href="https://pcdlabs.presentcomposedesign.fr/tools/birdsignal/" target="_blank" rel="noopener">Voir l'application</a>
            <a class="bsm-btn bsm-btn--ghost" href="https://presentcomposedesign.fr/contact/">Demander un rendez-vous</a>
          </div>
        </div>

        <div class="bsm-mark bsm-zoom" aria-hidden="true">
          <svg viewBox="0 0 1024 1024" role="img" aria-label="Signe BirdSignal"><use href="#bsm-mark"/></svg>
        </div>
      </div>
      <div class="bsm-eq" data-bsm-eq aria-hidden="true"></div>
    </div>
  </header>

  <!-- ============== INSTALLABLE PARTOUT, VISUALISEUR EN FOND ============ -->
  <section class="bsm-sec bsm-hold" data-bsm-reveal>
    <!--
      Le visualiseur enginR, en fond de section. Il occupe toute la surface :
      le telephone que vous voyez derriere le texte est un vrai modele 3D,
      qu'on peut faire tourner. enginR est un autre de mes outils, developpe
      et heberge au meme endroit que BirdSignal.
    -->
    <iframe
      class="bsm-hold-bg"
      src="https://pcdlabs.presentcomposedesign.fr/tools/enginR/viewer.html?s=p6hfafvq8iai&amp;embed=1"
      title="BirdSignal en volume : maquette 3D manipulable"
      allow="xr-spatial-tracking; fullscreen; camera; gyroscope; accelerometer; magnetometer; autoplay"
      allowfullscreen
      loading="lazy"
      referrerpolicy="strict-origin-when-cross-origin"></iframe>

    <div class="bsm-hold-fg">
      <div class="bsm-wrap">
        <div class="bsm-hold-col">
          <p class="bsm-kicker bsm-rise">Sans magasin d'applications</p>
          <h2 class="bsm-h2 bsm-rise" style="--i:1">Elle s'installe sur tous les téléphones, gratuitement</h2>
          <p class="bsm-p bsm-rise" style="--i:2">
            BirdSignal est une application web. Elle s'ouvre dans un navigateur,
            puis s'installe d'un geste sur l'écran d'accueil : son icône, son
            écran de lancement, son fonctionnement hors ligne. <strong>Aucun
            magasin d'applications, aucun compte, aucun téléchargement payant.</strong>
            Une seule adresse, et le même produit sur Android, sur iPhone, sur
            ordinateur.
          </p>
          <ul class="bsm-os bsm-rise" style="--i:3">
            <li class="bsm-os--free">
              <svg viewBox="0 0 24 24" aria-hidden="true"><path d="M12 4v16M4 12h16"/></svg>
              Gratuit
            </li>
            <li>
              <svg viewBox="0 0 24 24" aria-hidden="true"><rect x="6" y="2" width="12" height="20" rx="2.5"/><path d="M10.5 18.5h3"/></svg>
              Android
            </li>
            <li>
              <svg viewBox="0 0 24 24" aria-hidden="true"><rect x="6" y="2" width="12" height="20" rx="3"/><path d="M10 5h4"/></svg>
              iPhone et iPad
            </li>
            <li>
              <svg viewBox="0 0 24 24" aria-hidden="true"><rect x="3" y="5" width="18" height="12" rx="1.5"/><path d="M2 20h20"/></svg>
              Windows et macOS
            </li>
          </ul>

          <figure class="bsm-shot bsm-zoom" style="--i:4">
            <img loading="lazy"
              src="data:image/jpeg;base64,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"
              alt="Raccourci BirdSignal sur le bureau de Windows, avec son icône"
              width="327" height="317" loading="lazy" decoding="async">
            <figcaption>Installée depuis le navigateur, elle se range sur le bureau comme un logiciel.</figcaption>
          </figure>

          <div class="bsm-cta bsm-rise" style="--i:5">
            <a class="bsm-btn" href="https://pcdlabs.presentcomposedesign.fr/tools/birdsignal/" target="_blank" rel="noopener">Ouvrir et installer</a>
          </div>

          <div class="bsm-stats">
            <div class="bsm-stat bsm-rise" style="--i:0"><b data-bsm-count="6522">6&#8239;522</b><span>espèces</span></div>
            <div class="bsm-stat bsm-rise" style="--i:1"><b data-bsm-count="2">2</b><span>langues</span></div>
            <div class="bsm-stat bsm-rise" style="--i:2"><b data-bsm-count="137">137</b><span>tests auto</span></div>
            <div class="bsm-stat bsm-rise" style="--i:3"><b data-bsm-count="0">0</b><span>octet audio envoyé</span></div>
          </div>
        </div>
      </div>
    </div>
  </section>


  <!-- ============================== POINTS CLES ========================= -->
  <section class="bsm-sec" data-bsm-reveal>
    <div class="bsm-wrap">
      <p class="bsm-kicker bsm-rise">Points clés</p>
      <h2 class="bsm-h2 bsm-rise" style="--i:1">Ce que j'ai réalisé</h2>
      <ul class="bsm-keys">
        <li class="bsm-left" style="--i:1">Idéation, positionnement et naming de l'application</li>
        <li class="bsm-left" style="--i:2">Création du logo, du système d'icônes et de l'identité graphique complète</li>
        <li class="bsm-left" style="--i:3">Conception de l'expérience, des parcours et de l'interface, en deux langues</li>
        <li class="bsm-left" style="--i:4">Développement intégral, front et back, et intégration d'un modèle d'intelligence artificielle</li>
        <li class="bsm-left" style="--i:5">Rendu 3D temps réel des cartes, avec gyroscope sur mobile</li>
        <li class="bsm-left" style="--i:6">Mise en ligne, sécurisation, hébergement en France et documentation</li>
      </ul>
    </div>
  </section>

  <!-- ============================== LE SON ============================== -->
  <section class="bsm-sec bsm-sec--night" data-bsm-reveal>
    <div class="bsm-wrap">
      <p class="bsm-kicker bsm-rise">Le cœur de l'application</p>
      <h2 class="bsm-h2 bsm-rise" style="--i:1">Tout part d'un son</h2>
      <p class="bsm-p bsm-rise" style="--i:2">
        L'application enregistre quelques secondes de chant, en construit le
        <strong>spectrogramme</strong>, et soumet cette image de fréquences à un
        modèle d'intelligence artificielle de 6522 espèces. Le tout dans le
        navigateur, en moins de temps qu'il n'en faut pour ranger son téléphone.
        Ce qui défile ci-dessous n'est pas une illustration : c'est
        <strong>l'analyse d'un vrai enregistrement</strong>, une rue de Toulouse
        à six heures du matin.
      </p>

      <!--
        L'image ci-dessous n'illustre pas un spectrogramme : elle EST le
        spectrogramme de la bande qui joue sur cette page, calcule par
        transformee de Fourier sur quarante secondes enregistrees a Toulouse a
        six heures du matin. Meme rampe de couleurs que dans l'application.
        Elle est cuite a l'avance plutot qu'a l'ouverture de la page : quatre
        megaoctets a telecharger et une analyse frequentielle pour une page de
        presentation, ce serait faire payer au lecteur le prix d'une
        demonstration.
      -->

      <div class="bsm-spectro bsm-zoom" style="--i:3" data-bsm-spectro>
        <img class="bsm-spectro-fond" data-bsm-spectro-img decoding="async"
           alt="Spectrogramme de quarante secondes enregistrées à Toulouse à six heures du matin : chaque trait vertical clair est une vocalisation d'oiseau."
           width="1118" height="96" src="data:image/png;base64,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">
        <canvas aria-hidden="true"></canvas>
        <p class="bsm-spectro-legend"><i></i> Enregistrement réel</p>
        <div class="bsm-spectro-axis" aria-hidden="true"><span>8,5 kHz</span><span>4 kHz</span><span>0,4</span></div>
      </div>
      <p class="bsm-cap">
        Le temps en abscisse, la fréquence en ordonnée, l'intensité en couleur.
        Chaque trait vertical est un oiseau ; la bande claire du bas est la
        ville qui se réveille. Activez le son pour entendre ce que vous voyez.
      </p>

      <div class="bsm-chain">
        <div class="bsm-rise" style="--i:1"><b>1. Capter</b><span>Micro ou fichier importé, rééchantillonné à 48 kHz.</span></div>
        <div class="bsm-rise" style="--i:2"><b>2. Voir le son</b><span>Transformée de Fourier, spectrogramme, découpage en segments de 3 secondes.</span></div>
        <div class="bsm-rise" style="--i:3"><b>3. Reconnaître</b><span>Modèle BirdNET exécuté en WebAssembly, filtré par le lieu et la saison.</span></div>
      </div>
    </div>
  </section>

  <!-- ============================== LA CARTE ============================ -->
  <section class="bsm-sec bsm-sec--wash" data-bsm-reveal>
    <div class="bsm-wrap">
      <p class="bsm-kicker bsm-rise">Design produit</p>
      <h2 class="bsm-h2 bsm-rise" style="--i:1">Le son devient un objet</h2>
      <p class="bsm-p bsm-rise" style="--i:2">
        Chaque analyse conservée devient une carte numérotée, avec sa photo, son
        spectrogramme, sa date et son lieu. Elle se retourne en 3D et s'incline au
        gyroscope, de sorte que le reflet suit le poignet comme sur une vraie carte.
      </p>

      <div class="bsm-stage bsm-zoom" style="--i:3" aria-hidden="true">
        <div class="bsm-card3d">
          <!-- RECTO -->
          <div class="bsm-face bsm-face--front">
            <div class="bsm-cardtop">
              <span class="bsm-cardbrand"><svg viewBox="0 0 1024 1024" style="fill:#8b96ff"><use href="#bsm-mark"/></svg>Bird<em>Signal</em></span>
              <span class="bsm-pill">Corvidés</span>
            </div>
            <div class="bsm-cardphoto"><svg viewBox="0 0 1024 1024" style="fill:#fff"><use href="#bsm-mark"/></svg></div>
            <div>
              <p class="bsm-cardname">Pie bavarde</p>
              <p class="bsm-cardsci">Pica pica</p>
              <p class="bsm-cardmeta" style="margin-top:4px">chant &middot; Défense de territoire</p>
            </div>
            <div class="bsm-gauge">
              <div class="bsm-gauge-row"><span>Rareté &middot; LC</span><b>8 %</b></div>
              <div class="bsm-gauge-track"><div class="bsm-gauge-fill bsm-gauge-fill--rar"></div></div>
              <div class="bsm-gauge-row"><span>Confiance</span><b>91 %</b></div>
              <div class="bsm-gauge-track"><div class="bsm-gauge-fill bsm-gauge-fill--conf"></div></div>
              <div class="bsm-cardfoot">
                <p class="bsm-cardmeta">13 sept. 2026, 07:43<br>12,8 s &middot; localisé</p>
                <span class="bsm-seal"></span>
              </div>
            </div>
          </div>
          <!-- VERSO -->
          <div class="bsm-face bsm-face--back">
            <div class="bsm-cardtop">
              <span class="bsm-cardbrand"><svg viewBox="0 0 1024 1024" style="fill:#8b96ff"><use href="#bsm-mark"/></svg>Bird<em>Signal</em></span>
              <span class="bsm-pill">Détails</span>
            </div>
            <div class="bsm-cardrows">
              <div><span>Espèce</span><b>Pie bavarde</b></div>
              <div><span>Moteur</span><b>BirdNET</b></div>
              <div><span>Filtre local</span><b>157 espèces</b></div>
              <div><span>Durée</span><b>12,8 s</b></div>
              <div><span>Position</span><b>43.6080, 1.4812</b></div>
            </div>
            <div class="bsm-cardback-mark"><svg viewBox="0 0 1024 1024"><use href="#bsm-mark"/></svg></div>
            <p class="bsm-cardmeta" style="letter-spacing:.08em;text-transform:uppercase;font-weight:700">Spectrogramme</p>
            <div class="bsm-cardspectro"><canvas data-bsm-mini aria-hidden="true"></canvas></div>
            <div class="bsm-cardfoot" style="margin-top:auto">
              <p class="bsm-cardmeta">ÉMISE PAR BirdSignalR_001<br>presentcomposedesign.fr</p>
              <span class="bsm-badge bsm-badge--or" style="width:38px;height:38px">
                <i class="bsm-ring"></i><i class="bsm-hair" style="inset:6px"></i><i class="bsm-gloss"></i>
                <b style="font-size:13px">Or</b>
              </span>
            </div>
          </div>
        </div>
      </div>

      <p class="bsm-kicker bsm-rise" style="margin-top:34px">Les quatre rangs</p>
      <p class="bsm-p bsm-rise" style="--i:1">
        Le rang change la matière de la carte, et il se mérite. Passez la souris
        sur les poinçons : ce sont exactement ceux frappés au verso des cartes.
      </p>
      <div class="bsm-badges" data-bsm-badges>
        <div class="bsm-badge-cell bsm-zoom" style="--i:1">
          <span class="bsm-badge bsm-badge--uc" data-bsm-badge><i class="bsm-ring"></i><i class="bsm-hair"></i><i class="bsm-gloss"></i><b>Uc</b></span>
          <b class="bsm-badge-name">Non classée</b><span>Aucune espèce reconnue</span>
        </div>
        <div class="bsm-badge-cell bsm-zoom" style="--i:2">
          <span class="bsm-badge bsm-badge--sd" data-bsm-badge><i class="bsm-ring"></i><i class="bsm-hair"></i><i class="bsm-gloss"></i><b>Sd</b></span>
          <b class="bsm-badge-name">Standard</b><span>Argent</span>
        </div>
        <div class="bsm-badge-cell bsm-zoom" style="--i:3">
          <span class="bsm-badge bsm-badge--or" data-bsm-badge><i class="bsm-ring"></i><i class="bsm-hair"></i><i class="bsm-gloss"></i><b>Or</b></span>
          <b class="bsm-badge-name">Authentique</b><span>Captée sur place, localisée</span>
        </div>
        <div class="bsm-badge-cell bsm-zoom" style="--i:4">
          <span class="bsm-badge bsm-badge--dd" data-bsm-badge><i class="bsm-ring"></i><i class="bsm-hair"></i><i class="bsm-gloss"></i><b>Dd</b></span>
          <b class="bsm-badge-name">Diamant</b><span>Irisé, le plus rare</span>
        </div>
      </div>
    </div>
  </section>

  <!-- ============================== GEOLOCALISATION ===================== -->
  <section class="bsm-sec bsm-sec--night" data-bsm-reveal>
    <div class="bsm-wrap">
      <p class="bsm-kicker bsm-rise">Le point fort</p>
      <h2 class="bsm-h2 bsm-rise" style="--i:1">Votre collection raconte vos sorties</h2>
      <p class="bsm-p bsm-rise" style="--i:2">
        Chaque carte retient l'endroit où le chant a été capté. La collection
        devient une carte de vos promenades, et surtout une <strong>carte des
        espèces</strong> : on voit où elles sont, et où elles ne sont plus.
      </p>

      <div class="bsm-map bsm-zoom" style="--i:3" aria-hidden="true">
        <svg viewBox="0 0 800 450" preserveAspectRatio="xMidYMid slice">
          <g opacity=".16" stroke="#8f97ff" stroke-width=".7">
            <path d="M0 90H800M0 180H800M0 270H800M0 360H800"/>
            <path d="M120 0V450M240 0V450M360 0V450M480 0V450M600 0V450M720 0V450"/>
          </g>
          <path d="M60 330c60-80 150-40 210-120 50-66 150-52 210 6 52 50 140 24 180-40 22-36 60-40 90-30"
                fill="none" stroke="#8f97ff" stroke-width="46" stroke-linecap="round" opacity=".08"/>
          <path class="bsm-trail" pathLength="900"
                d="M80 356C170 300 200 214 300 220 400 226 396 316 470 300 560 281 570 170 660 156"/>
          <g class="bsm-pin" style="--i:1">
            <circle cx="80" cy="356" r="7" fill="#7ef0ff"/><circle cx="80" cy="356" r="14" fill="none" stroke="#7ef0ff" stroke-width="1.4" opacity=".45"/>
            <text x="80" y="392" text-anchor="middle">Merle noir<tspan x="80" dy="13">08:14 · LC</tspan></text>
          </g>
          <g class="bsm-pin" style="--i:2">
            <circle cx="300" cy="220" r="7" fill="#9dffdd"/><circle cx="300" cy="220" r="14" fill="none" stroke="#9dffdd" stroke-width="1.4" opacity=".45"/>
            <text x="300" y="184" text-anchor="middle">Mésange charbonnière<tspan x="300" dy="13">09:02 · LC</tspan></text>
          </g>
          <g class="bsm-pin" style="--i:3">
            <circle cx="470" cy="300" r="7" fill="#ffd79a"/><circle cx="470" cy="300" r="14" fill="none" stroke="#ffd79a" stroke-width="1.4" opacity=".45"/>
            <text x="470" y="336" text-anchor="middle">Pie bavarde<tspan x="470" dy="13">09:47 · LC</tspan></text>
          </g>
          <g class="bsm-pin" style="--i:4">
            <circle cx="660" cy="156" r="7" fill="#e6a8ff"/><circle cx="660" cy="156" r="14" fill="none" stroke="#e6a8ff" stroke-width="1.4" opacity=".45"/>
            <text x="660" y="120" text-anchor="middle">Tourterelle turque<tspan x="660" dy="13">10:21 · LC</tspan></text>
          </g>
        </svg>
      </div>
      <p class="bsm-cap">Représentation de principe. La position n'est enregistrée qu'avec l'accord de l'utilisateur, et elle est arrondie avant tout partage.</p>
    </div>
  </section>

  <!-- ============================== IDENTITE ============================ -->
  <section class="bsm-sec" data-bsm-reveal>
    <div class="bsm-wrap">
      <p class="bsm-kicker bsm-rise">Identité graphique</p>
      <h2 class="bsm-h2 bsm-rise" style="--i:1">Un signe qui se lit à 16 pixels</h2>
      <p class="bsm-p bsm-rise" style="--i:2">
        Un oiseau et une lettre dans la même forme. Une seule couleur pour le
        signe : une identité qui a besoin d'un dégradé pour exister ne survit
        pas à une impression en noir. Le favicon, lui, existe en deux fichiers,
        parce qu'un gris clair disparaît sur une barre d'onglets blanche.
      </p>

      <div class="bsm-logos">
        <figure class="bsm-logo bsm-zoom" style="--i:1">
          <div class="bsm-logo-art"><svg viewBox="0 0 1024 1024"><use href="#bsm-mark"/></svg></div>
          <figcaption class="bsm-logo-lab">Signe principal<span>#1001ef sur blanc</span></figcaption>
        </figure>
        <figure class="bsm-logo bsm-zoom" style="--i:2">
          <div class="bsm-logo-art bsm-logo-art--blue"><svg viewBox="0 0 1024 1024"><use href="#bsm-mark"/></svg></div>
          <figcaption class="bsm-logo-lab">En réserve<span>Blanc sur aplat de marque</span></figcaption>
        </figure>
        <figure class="bsm-logo bsm-zoom" style="--i:3">
          <div class="bsm-logo-art bsm-logo-art--tile"><span class="bsm-tile"><svg viewBox="0 0 1024 1024"><use href="#bsm-mark"/></svg></span></div>
          <figcaption class="bsm-logo-lab">Icône d'application<span>Zone sûre du masque Android</span></figcaption>
        </figure>

        <!--
          Les deux vignettes suivantes ne sont pas des redessins : ce sont les
          fichiers reellement servis par l'application, recopies ici trait pour
          trait. Le favicon existe en deux versions parce qu'un onglet n'a pas
          la meme couleur de fond selon le theme du navigateur, et qu'un signe
          gris clair disparait sur une barre blanche.
        -->
        <figure class="bsm-logo bsm-zoom" style="--i:4">
          <div class="bsm-logo-art bsm-logo-art--pair">
            <figure class="bsm-fav">
              <span class="bsm-fav-plate bsm-fav-plate--light"><svg viewBox="0 0 1024 1024" role="img" aria-label="Favicon BirdSignal"><defs><linearGradient id="bsm-favgrad-l" x1="548.56" y1="512.11" x2="1024" y2="512.11" gradientTransform="translate(0 1024.1102) scale(1 -1)" gradientUnits="userSpaceOnUse"><stop offset="0" stop-color="#def0f5"/><stop offset=".45" stop-color="#c0e3eb"/><stop offset="1" stop-color="#8fd0dd"/></linearGradient></defs><path fill="url(#bsm-favgrad-l)" d="M880.58,0h-332.01c93.06,27.65,165.69,99.56,193.31,188.87l92.64,33.12c23,8.23,43.99,18.77,62.66,34.42-59.95,1.18-110.83,22.83-166.15,38.43-80.13,22.63-183.32,95.69-149.54,225.33,21.75,10.15,42.13,21.43,62.34,34.82,79.85,52.92,122.25,137.15,115.8,228.44-6.06,85.83-52.86,162.2-131.59,208.4-22.87,13.41-47.25,24.32-72.81,32.17h325.36c79.2,0,143.39-62.09,143.41-138.68V138.68c-.02-76.59-64.22-138.68-143.41-138.68h-.01Z"/><path fill="#a8a9a9" d="M534.78,604.76l-124.11-59.62-86.94-42.16c-20.47-9.92-37.86-23.29-55.29-38.04-55.23-46.72-86.17-115.15-82.82-188.48,39.48,62.43,103.62,97.78,171.01,128.58l141.51,61.85c2.18-38.77,21.32-106.04,38.48-135.46,39.58-67.83,101.74-105.27,180.27-123.72-27.9-9.85-49.77-27.77-65.27-53.06-20.07-32.75-47.58-56.6-81.1-75.48-32.12-14.98-65.33-27.04-102.54-27.06h-.3c-213.16-.01-385.98,178.89-385.96,399.58l.04,482.54,371.43-.34c48.61-.04,93.59-15.44,128.19-46.41,58.92-52.73,69.44-139.02,31.46-207.36-18.21-32.81-45.44-56.94-78.06-75.37h-.01ZM511.94,144.09c20.23,0,36.63,16.32,36.63,36.45s-16.4,36.47-36.63,36.47-36.63-16.32-36.63-36.47,16.42-36.45,36.63-36.45Z"/></svg></span>
              <figcaption>Thème clair</figcaption>
            </figure>
            <figure class="bsm-fav">
              <span class="bsm-fav-plate bsm-fav-plate--dark"><svg viewBox="0 0 1024 1024" role="img" aria-label="Favicon BirdSignal"><defs><linearGradient id="bsm-favgrad-d" x1="548.56" y1="512.11" x2="1024" y2="512.11" gradientTransform="translate(0 1024.1102) scale(1 -1)" gradientUnits="userSpaceOnUse"><stop offset="0" stop-color="#def0f5"/><stop offset=".45" stop-color="#c0e3eb"/><stop offset="1" stop-color="#8fd0dd"/></linearGradient></defs><path fill="url(#bsm-favgrad-d)" d="M880.58,0h-332.01c93.06,27.65,165.69,99.56,193.31,188.87l92.64,33.12c23,8.23,43.99,18.77,62.66,34.42-59.95,1.18-110.83,22.83-166.15,38.43-80.13,22.63-183.32,95.69-149.54,225.33,21.75,10.15,42.13,21.43,62.34,34.82,79.85,52.92,122.25,137.15,115.8,228.44-6.06,85.83-52.86,162.2-131.59,208.4-22.87,13.41-47.25,24.32-72.81,32.17h325.36c79.2,0,143.39-62.09,143.41-138.68V138.68c-.02-76.59-64.22-138.68-143.41-138.68h-.01Z"/><path fill="#e2e1e1" d="M534.78,604.76l-124.11-59.62-86.94-42.16c-20.47-9.92-37.86-23.29-55.29-38.04-55.23-46.72-86.17-115.15-82.82-188.48,39.48,62.43,103.62,97.78,171.01,128.58l141.51,61.85c2.18-38.77,21.32-106.04,38.48-135.46,39.58-67.83,101.74-105.27,180.27-123.72-27.9-9.85-49.77-27.77-65.27-53.06-20.07-32.75-47.58-56.6-81.1-75.48-32.12-14.98-65.33-27.04-102.54-27.06h-.3c-213.16-.01-385.98,178.89-385.96,399.58l.04,482.54,371.43-.34c48.61-.04,93.59-15.44,128.19-46.41,58.92-52.73,69.44-139.02,31.46-207.36-18.21-32.81-45.44-56.94-78.06-75.37h-.01ZM511.94,144.09c20.23,0,36.63,16.32,36.63,36.45s-16.4,36.47-36.63,36.47-36.63-16.32-36.63-36.47,16.42-36.45,36.63-36.45Z"/></svg></span>
              <figcaption>Thème sombre</figcaption>
            </figure>
          </div>
          <figcaption class="bsm-logo-lab">Favicon<span>Deux fichiers, un par thème d'onglet</span></figcaption>
        </figure>

        <figure class="bsm-logo bsm-zoom" style="--i:5">
          <div class="bsm-logo-art bsm-logo-art--footer"><svg viewBox="0 0 1024 1024" role="img" aria-label="Logo BirdSignal de pied de page"><path fill="#ffffff" d="M759.62,783.43c6.45-91.29-35.95-175.52-115.8-228.44-20.21-13.39-40.59-24.67-62.34-34.82-33.78-129.64,69.41-202.7,149.54-225.33,55.32-15.6,106.2-37.26,166.15-38.43-18.68-15.65-39.66-26.19-62.66-34.42l-92.64-33.12C714.25,99.56,641.62,27.65,548.56,0H0v1024h555.22c25.55-7.86,49.94-18.76,72.81-32.17,78.72-46.19,125.53-122.56,131.59-208.4ZM581.4,887.48c-34.61,30.97-79.58,46.37-128.19,46.41l-371.43.34-.04-482.54c-.02-220.69,172.8-399.59,385.96-399.58h.3c37.21.02,70.43,12.08,102.54,27.06,33.52,18.87,61.02,42.73,81.1,75.48,15.5,25.29,37.37,43.21,65.27,53.06-78.53,18.45-140.69,55.89-180.27,123.72-17.16,29.42-36.3,96.69-38.48,135.46l-141.51-61.85c-67.39-30.81-131.52-66.15-171.01-128.58-3.35,73.33,27.59,141.76,82.82,188.48,17.43,14.76,34.82,28.13,55.29,38.04l86.94,42.16,124.11,59.62h.01c32.62,18.42,59.85,42.55,78.06,75.36,37.98,68.34,27.47,154.63-31.46,207.36Z"/><path fill="#1001ef" d="M534.79,604.75h-.01s-124.11-59.61-124.11-59.61l-86.94-42.16c-20.47-9.92-37.86-23.29-55.29-38.04-55.23-46.72-86.17-115.15-82.82-188.48,39.48,62.43,103.62,97.78,171.01,128.58l141.51,61.85c2.18-38.77,21.32-106.04,38.48-135.46,39.58-67.83,101.74-105.27,180.27-123.72-27.9-9.85-49.77-27.77-65.27-53.06-20.07-32.75-47.58-56.6-81.1-75.48-32.12-14.98-65.33-27.04-102.54-27.06h-.3c-213.16-.01-385.98,178.89-385.96,399.58l.04,482.54,371.43-.34c48.61-.04,93.59-15.44,128.19-46.41,58.92-52.73,69.44-139.02,31.46-207.36-18.21-32.81-45.44-56.94-78.06-75.37ZM511.94,144.09c20.23,0,36.63,16.32,36.63,36.45s-16.4,36.47-36.63,36.47-36.63-16.32-36.63-36.47,16.42-36.45,36.63-36.45Z"/><path fill="#ffffff" d="M511.94,217c20.23,0,36.63-16.34,36.63-36.47s-16.4-36.45-36.63-36.45-36.63,16.3-36.63,36.45,16.4,36.47,36.63,36.47Z"/></svg></div>
          <figcaption class="bsm-logo-lab">Logo de pied de page<span>Plaque blanche, signe bleu</span></figcaption>
        </figure>

        <figure class="bsm-logo bsm-zoom" style="--i:6">
          <div class="bsm-logo-art">
            <div class="bsm-favrow">
              <figure><svg viewBox="0 0 1024 1024" style="width:48px"><use href="#bsm-mark"/></svg><figcaption>48</figcaption></figure>
              <figure><svg viewBox="0 0 1024 1024" style="width:32px"><use href="#bsm-mark"/></svg><figcaption>32</figcaption></figure>
              <figure><svg viewBox="0 0 1024 1024" style="width:16px"><use href="#bsm-mark"/></svg><figcaption>16</figcaption></figure>
            </div>
          </div>
          <figcaption class="bsm-logo-lab">Lisibilité<span>Validé à sa plus petite taille</span></figcaption>
        </figure>
      </div>
    </div>
  </section>

  <!-- ============================== METHODE ============================= -->
  <section class="bsm-sec bsm-sec--wash" data-bsm-reveal>
    <div class="bsm-wrap">
      <p class="bsm-kicker bsm-rise">Méthode</p>
      <h2 class="bsm-h2 bsm-rise" style="--i:1">De l'idée à la mise en ligne</h2>
      <div class="bsm-steps">
        <article class="bsm-step bsm-rise" style="--i:1"><span class="bsm-num">01</span>
          <h3 class="bsm-h3">Idéation et positionnement</h3>
          <p class="bsm-p">Définir ce que l'application fait, ce qu'elle refuse de faire, et à qui elle s'adresse.</p></article>
        <article class="bsm-step bsm-rise" style="--i:2"><span class="bsm-num">02</span>
          <h3 class="bsm-h3">Naming</h3>
          <p class="bsm-p">Un nom qui tient dans une icône, se prononce en français comme en anglais, et dit quelque chose de vrai sur le produit.</p></article>
        <article class="bsm-step bsm-rise" style="--i:3"><span class="bsm-num">03</span>
          <h3 class="bsm-h3">Logo et identité graphique</h3>
          <p class="bsm-p">Du croquis au vectoriel, décliné en favicon, icônes d'application, thème clair et thème sombre.</p></article>
        <article class="bsm-step bsm-rise" style="--i:4"><span class="bsm-num">04</span>
          <h3 class="bsm-h3">Architecture et UX</h3>
          <p class="bsm-p">Parcours, écrans, arborescence, et une architecture choisie pour tenir sur un hébergement mutualisé français.</p></article>
        <article class="bsm-step bsm-rise" style="--i:5"><span class="bsm-num">05</span>
          <h3 class="bsm-h3">Développement</h3>
          <p class="bsm-p">Interface, API, traitement du signal audio, IA embarquée, rendu 3D temps réel et tests automatisés.</p></article>
        <article class="bsm-step bsm-rise" style="--i:6"><span class="bsm-num">06</span>
          <h3 class="bsm-h3">Mise en ligne et suivi</h3>
          <p class="bsm-p">Sécurisation, hébergement en France, application installable et hors ligne, documentation et mises à jour.</p></article>
      </div>

      <!--
        Gabarit pret a l'emploi, si des captures d'ecran sont ajoutees un jour.
        Il reste en commentaire : un cadre pointille « emplacement image » sur
        une page publiee ne dit qu'une chose, c'est que la page n'est pas finie.

        <div class="bsm-slot bsm-zoom">
          <img decoding="async" src="ADRESSE-DE-L-IMAGE" alt="Interface de BirdSignal">
          <p class="bsm-cap">L'analyse, la collection, la carte en volume.</p>
        </div>
      -->
    </div>
  </section>

  <!-- ============================== SERVICES ============================ -->
  <section class="bsm-sec" data-bsm-reveal>
    <div class="bsm-wrap">
      <p class="bsm-kicker bsm-rise">Ce que cela veut dire pour vous</p>
      <h2 class="bsm-h2 bsm-rise" style="--i:1">Un seul interlocuteur, du premier croquis à la mise en ligne</h2>
      <div class="bsm-serv">
        <article class="bsm-step bsm-rise" style="--i:1">
          <h3 class="bsm-h3">Application web sur mesure</h3>
          <p class="bsm-p">Outil métier, configurateur, application mobile installable. Conçue, développée et hébergée.</p></article>
        <article class="bsm-step bsm-rise" style="--i:2">
          <h3 class="bsm-h3">Identité et design produit</h3>
          <p class="bsm-p">Naming, logo, système d'icônes, interface et déclinaisons, pensés pour tenir à toutes les tailles.</p></article>
        <article class="bsm-step bsm-rise" style="--i:3">
          <h3 class="bsm-h3">3D, AR et expériences immersives</h3>
          <p class="bsm-p">Configurateurs 3D temps réel, visualiseurs, réalité augmentée, directement dans le navigateur.</p></article>
      </div>
    </div>
  </section>

  <!-- ============================== APPEL =============================== -->
  <section class="bsm-sec bsm-sec--wash bsm-final" data-bsm-reveal>
    <div class="bsm-wrap">
      <h2 class="bsm-h2 bsm-rise">Vous souhaitez faire appel à mes services ?</h2>
      <p class="bsm-lede bsm-rise" style="--i:1">
        Parlons de votre projet. J'interviens sur l'ensemble de la chaîne, ou sur la
        partie qui vous manque.
      </p>
      <div class="bsm-cta bsm-rise" style="--i:2">
        <a class="bsm-btn" href="https://presentcomposedesign.fr/contact/">Demander un rendez-vous</a>
        <a class="bsm-btn bsm-btn--ghost" href="https://presentcomposedesign.fr/realisations/">Voir les autres réalisations</a>
      </div>
      <p class="bsm-legal bsm-rise" style="--i:3">
        BirdSignal est une application gratuite et non commerciale, conçue et hébergée
        en France par Present Composé Design, nom commercial de l'entreprise
        individuelle Alban DESBARAX, à Toulouse. Les hypothèses d'espèce produites sont
        probabilistes et ne constituent pas une détermination scientifique.
      </p>
    </div>
  </section>
</div>

<script>
(function () {
  var root = document.getElementById('bsm');
  if (!root) return;

  /* Marque la presence du script AVANT tout le reste : c'est cette classe, et
     elle seule, qui autorise la feuille de style a cacher ce qui va apparaitre.
     Si cette ligne n'est jamais atteinte, l'article reste lisible, sans
     animation. */
  root.classList.add('bsm-js');

  var calme = window.matchMedia && window.matchMedia('(prefers-reduced-motion: reduce)').matches;
  var survol = !window.matchMedia || window.matchMedia('(hover: hover)').matches;

  /* ------------------------------------------------------------ egaliseur
     Genere plutot qu'ecrit : 44 barres a la main seraient 44 lignes a relire
     pour rien. */
  var eq = root.querySelector('[data-bsm-eq]');
  if (eq) {
    var html = '';
    for (var i = 0; i < 44; i++) {
      var hb = 18 + Math.round(Math.abs(Math.sin(i * 0.7)) * 70 + (i % 5) * 4);
      html += '<i style="height:' + hb + '%;animation-delay:' + ((i % 11) * 0.09).toFixed(2) +
              's;animation-duration:' + (1 + (i % 6) * 0.14).toFixed(2) + 's"></i>';
    }
    eq.innerHTML = html;
  }

  /* ----------------------------------------------------------- apparitions
     Seuil a zero, et non a un pourcentage : sur un ecran court, 12 % d'une
     section haute peut depasser la hauteur de la fenetre, et la section ne
     s'afficherait jamais. */
  var sections = root.querySelectorAll('[data-bsm-reveal]');
  if (calme || !('IntersectionObserver' in window)) {
    for (var k = 0; k < sections.length; k++) sections[k].classList.add('bsm-in');
  } else {
    var io = new IntersectionObserver(function (es) {
      es.forEach(function (e) {
        if (e.isIntersecting) { e.target.classList.add('bsm-in'); io.unobserve(e.target); }
      });
    }, { threshold: 0, rootMargin: '0px 0px -10% 0px' });
    for (var j = 0; j < sections.length; j++) io.observe(sections[j]);
  }

  /* -------------------------------------------------------------- compteurs
     Le HTML porte deja la valeur finale : sans script, les chiffres restent
     justes. C'est ici, et seulement ici, qu'on repart de zero. */
  function separe(v) {
    var s = String(v), out = '', c = 0;
    for (var p = s.length - 1; p >= 0; p--) {
      out = s.charAt(p) + out;
      if (++c % 3 === 0 && p > 0) out = ' ' + out;
    }
    return out;
  }
  function compte(el) {
    var cible = parseInt(el.getAttribute('data-bsm-count'), 10) || 0;
    if (calme || cible === 0) { el.textContent = separe(cible); return; }
    el.textContent = separe(0);
    var t0 = null, duree = 1000;
    function pas(t) {
      if (t0 === null) t0 = t;
      var p = Math.min(1, (t - t0) / duree);
      el.textContent = separe(Math.round(cible * (1 - Math.pow(1 - p, 3))));
      if (p < 1) requestAnimationFrame(pas);
    }
    requestAnimationFrame(pas);
  }
  var compteurs = root.querySelectorAll('[data-bsm-count]');
  if (!('IntersectionObserver' in window)) {
    for (var m = 0; m < compteurs.length; m++) compte(compteurs[m]);
  } else {
    var io2 = new IntersectionObserver(function (es) {
      es.forEach(function (e) { if (e.isIntersecting) { compte(e.target); io2.unobserve(e.target); } });
    }, { threshold: 0.5 });
    for (var q = 0; q < compteurs.length; q++) io2.observe(compteurs[q]);
  }

  /* ====================================================== SPECTROGRAMME
   *
   * Un spectrogramme, c'est le temps en abscisse, la frequence en ordonnee et
   * l'intensite en couleur. Celui-ci n'est pas synthetique : c'est la
   * transformee de Fourier de quarante secondes reellement enregistrees a
   * Toulouse a six heures du matin, la meme bande que le bouton de son
   * allume. Elle a ete calculee une fois pour toutes et rangee dans une image
   * indexee de quarante kilo-octets, plutot que recalculee dans le navigateur
   * de chaque lecteur : l'enregistrement pese quatre megaoctets, et personne
   * n'a a payer le prix d'une demonstration qu'il n'a pas demandee.
   *
   * Le defilement, lui, est vivant : la colonne de droite est l'instant
   * present. Quand la bande joue, cet instant est la tete de lecture, et ce
   * qui s'affiche est exactement ce qui s'entend.
   */
  var SPECTRO = { cols: 1118, bandes: 96, debut: 4, duree: 40, parSeconde: 28 };

  var image = root.querySelector('[data-bsm-spectro-img]');
  var piste = root.querySelector('[data-bsm-audio]');
  var origine = Date.now();

  /** Seconde courante DANS l'extrait, que la bande joue ou non. */
  function instant() {
    if (piste && !piste.paused && !piste.ended) {
      var t = piste.currentTime - SPECTRO.debut;
      if (t >= 0 && t <= SPECTRO.duree) return t;
    }
    return ((Date.now() - origine) / 1000) % SPECTRO.duree;
  }

  /**
   * Dessine la fenetre de `visibles` colonnes qui se termine a `fin`.
   * L'extrait boucle : une fenetre a cheval sur la fin et le debut se dessine
   * en deux morceaux plutot que de sauter.
   */
  function fenetre(ctx, w, h, fin, visibles) {
    if (!image || !image.complete || !image.naturalWidth) return;
    var cols = SPECTRO.cols;
    var depart = Math.round(fin - visibles) % cols;
    if (depart < 0) depart += cols;
    var premier = Math.min(visibles, cols - depart);
    var echelle = w / visibles;
    ctx.drawImage(image, depart, 0, premier, SPECTRO.bandes, 0, 0, premier * echelle, h);
    if (premier < visibles) {
      ctx.drawImage(
        image, 0, 0, visibles - premier, SPECTRO.bandes,
        premier * echelle, 0, (visibles - premier) * echelle, h
      );
    }
  }

  function defile(host, opts) {
    var cv = host.querySelector('canvas');
    if (!cv || !cv.getContext) return;
    var ctx = cv.getContext('2d');
    var w = 0, h = 0, raf = 0, vu = false;

    function taille() {
      /*
       * offsetWidth et non getBoundingClientRect : le spectrogramme du verso
       * vit DANS la carte qui tourne, et un rectangle mesure a l'ecran y
       * change a chaque image. Le canvas se serait redimensionne, donc vide,
       * soixante fois par seconde. Les dimensions de mise en page, elles,
       * ignorent les transformations.
       */
      var nw = Math.max(60, host.offsetWidth), nh = Math.max(30, host.offsetHeight);
      if (nw === w && nh === h) return;
      w = nw; h = nh; cv.width = w; cv.height = h;
    }

    function peins() {
      taille();
      if (!w || !h) return;
      var visibles = Math.max(8, Math.round(opts.secondes * SPECTRO.parSeconde));
      var fin = (instant() + opts.decalage) * SPECTRO.parSeconde;
      fenetre(ctx, w, h, fin, visibles);
    }

    function boucle() {
      raf = 0;
      if (!vu || document.hidden) return;
      peins();
      raf = requestAnimationFrame(boucle);
    }
    function relance() { if (!raf && vu && !document.hidden) raf = requestAnimationFrame(boucle); }

    peins();
    if (image && !image.complete) image.addEventListener('load', peins);
    if (calme) return; // image fixe : le propos reste lisible, rien ne bouge
    window.addEventListener('resize', peins);
    document.addEventListener('visibilitychange', relance);

    if ('IntersectionObserver' in window) {
      new IntersectionObserver(function (es) {
        vu = es[0].isIntersecting;
        if (vu) relance(); else if (raf) { cancelAnimationFrame(raf); raf = 0; }
      }, { threshold: 0 }).observe(host);
    } else { vu = true; relance(); }
  }

  var grand = root.querySelector('[data-bsm-spectro]');
  if (grand) defile(grand, { secondes: 13, decalage: 0 });
  var mini = root.querySelector('[data-bsm-mini]');
  // Le verso de la carte montre un AUTRE moment du meme enregistrement :
  // deux fois la meme seconde a l'ecran aurait eu l'air d'un decor duplique.
  if (mini) defile(mini.parentNode, { secondes: 4.5, decalage: 19 });

  /* ============================================================== LE SON
   *
   * Aucun navigateur ne laisse une page emettre du son sans geste du lecteur,
   * et c'est heureux. La bande n'est donc meme pas telechargee avant le clic :
   * quatre megaoctets imposes a qui passait lire deux paragraphes seraient
   * un abus, sur un forfait mobile comme sur une connexion lente.
   *
   * Au demarrage, la tete de lecture est posee la ou le spectrogramme en est
   * rendu, et non au debut : l'image ne saute pas, elle se met simplement a
   * dire la verite.
   */
  var bouton = root.querySelector('[data-bsm-sound]');
  if (piste && bouton) {
    var fin = SPECTRO.debut + SPECTRO.duree;
    var intitule = bouton.querySelector('[data-bsm-sound-lab]');

    function boucleExtrait() {
      if (!piste.duration) return;
      if (piste.currentTime >= fin || piste.currentTime < SPECTRO.debut) {
        try { piste.currentTime = SPECTRO.debut; } catch (e) { /* metadonnees pas encore la */ }
      }
    }
    piste.addEventListener('timeupdate', boucleExtrait);

    bouton.addEventListener('click', function () {
      if (piste.paused) {
        piste.muted = false;
        var reprise = SPECTRO.debut + instant();
        var lecture = piste.play();
        if (lecture && lecture.then) {
          lecture.then(function () {
            try { piste.currentTime = reprise; } catch (e) { /* on repart du debut */ }
          }, function () {
            // Refus du navigateur : on ne ment pas sur l'etat du bouton.
            piste.muted = true;
            root.classList.remove('bsm-son');
            bouton.setAttribute('aria-pressed', 'false');
            if (intitule) intitule.textContent = 'Activer le son';
          });
        }
      } else {
        piste.muted = !piste.muted;
      }
      var audible = !piste.muted;
      root.classList.toggle('bsm-son', audible);
      bouton.setAttribute('aria-pressed', audible ? 'true' : 'false');
      if (intitule) intitule.textContent = audible ? 'Couper le son' : 'Activer le son';
    });

    // Le bouton ne s'affiche que tant que l'article est a l'ecran : il n'a
    // rien a faire par-dessus le reste du site.
    if ('IntersectionObserver' in window) {
      new IntersectionObserver(function (es) {
        if (es[0].isIntersecting) root.classList.add('bsm-audible');
        else root.classList.remove('bsm-audible');
      }, { threshold: 0 }).observe(root);
    } else {
      root.classList.add('bsm-audible');
    }
  }

  /* ================================================ POINCONS QUI SUIVENT
   *
   * Les poincons s'inclinent vers le pointeur, leur reflet se deplace, et le
   * film irise du rang Diamant tourne avec l'angle. C'est ce reflet mobile
   * qui donne la sensation du metal, bien plus que la couleur.
   *
   * Tout est calcule dans UNE seule frame d'animation, quel que soit le
   * nombre d'evenements recus : `pointermove` se declenche des dizaines de
   * fois par seconde, et lire une position d'element a chaque fois obligerait
   * le navigateur a recalculer la mise en page autant de fois.
   */
  var badges = root.querySelectorAll('[data-bsm-badge]');
  if (badges.length && survol && !calme) {
    var px = 0, py = 0, attend = false;

    function applique() {
      attend = false;
      var vh = window.innerHeight || 800;
      for (var b = 0; b < badges.length; b++) {
        var el = badges[b], r = el.getBoundingClientRect();
        if (r.bottom < -40 || r.top > vh + 40) continue;
        var cx = r.left + r.width / 2, cy = r.top + r.height / 2;
        var dx = (px - cx) / (r.width * 2.4), dy = (py - cy) / (r.height * 2.4);
        dx = dx < -1 ? -1 : dx > 1 ? 1 : dx;
        dy = dy < -1 ? -1 : dy > 1 ? 1 : dy;
        el.style.setProperty('--ry', (dx * 17).toFixed(2) + 'deg');
        el.style.setProperty('--rx', (-dy * 17).toFixed(2) + 'deg');
        el.style.setProperty('--gx', (50 + dx * 44).toFixed(1) + '%');
        el.style.setProperty('--gy', (30 + dy * 44).toFixed(1) + '%');
        el.style.setProperty('--sweep', (Math.atan2(py - cy, px - cx) * 57.2958).toFixed(1) + 'deg');
      }
    }
    window.addEventListener('pointermove', function (e) {
      px = e.clientX; py = e.clientY;
      if (!attend) { attend = true; requestAnimationFrame(applique); }
    }, { passive: true });
  }
})();
</script>
				</div>
				</div>
				</div>
				</div>
		<p>Cet article <a href="https://presentcomposedesign.fr/birdsignal-infos/">BirdSignal-infos</a> est apparu en premier sur <a href="https://presentcomposedesign.fr">Présent Composé design</a>.</p>
]]></content:encoded>
					
		
		<enclosure url="https://pcdlabs.presentcomposedesign.fr/tools/birdsignal/Birds-in-town_6am_Toulouse_12b-r-l.plana.mp4" length="4117624" type="video/mp4" />

			</item>
	</channel>
</rss>
