{"id":12,"date":"2025-09-21T19:33:00","date_gmt":"2025-09-21T19:33:00","guid":{"rendered":"https:\/\/streetartist.fr\/?page_id=12"},"modified":"2025-12-06T20:03:20","modified_gmt":"2025-12-06T20:03:20","slug":"home","status":"publish","type":"page","link":"https:\/\/streetartist.fr\/","title":{"rendered":"Home"},"content":{"rendered":"<p>[et_pb_section fb_built=&#8221;1&#8243; admin_label=&#8221;Data Table&#8221; _builder_version=&#8221;4.27.2&#8243; _module_preset=&#8221;default&#8221; background_color=&#8221;#3c4f00&#8243; width=&#8221;100%&#8221; max_width=&#8221;100%&#8221; min_height=&#8221;714px&#8221; height=&#8221;715px&#8221; max_height=&#8221;731px&#8221; collapsed=&#8221;on&#8221; global_colors_info=&#8221;{}&#8221;][et_pb_row _builder_version=&#8221;4.27.2&#8243; _module_preset=&#8221;default&#8221; custom_margin=&#8221;-31px||||false|false&#8221; global_colors_info=&#8221;{}&#8221;][et_pb_column type=&#8221;4_4&#8243; _builder_version=&#8221;4.27.2&#8243; _module_preset=&#8221;default&#8221; global_colors_info=&#8221;{}&#8221;][et_pb_text _builder_version=&#8221;4.27.2&#8243; _module_preset=&#8221;default&#8221; text_font=&#8221;&#8211;et_global_heading_font|&#8211;et_global_body_font_weight|||||||&#8221; text_text_color=&#8221;#000000&#8243; text_font_size=&#8221;93px&#8221; header_text_color=&#8221;#000000&#8243; text_orientation=&#8221;center&#8221; text_font_size_tablet=&#8221;70px&#8221; text_font_size_phone=&#8221;47px&#8221; header_font_size_tablet=&#8221;&#8221; header_font_size_phone=&#8221;&#8221; header_font_size_last_edited=&#8221;on|tablet&#8221; global_colors_info=&#8221;{%22gcid-primary-color%22:%91%22link_text_color%22,%22link_text_color%22,%22link_text_color%22,%22link_text_color%22,%22link_text_color%22%93,%22gcid-heading-color%22:%91%22header_text_color%22,%22header_4_text_color%22,%22header_3_text_color%22,%22header_2_text_color%22,%22header_5_text_color%22,%22header_6_text_color%22,%22quote_text_color%22,%22header_text_color%22,%22header_4_text_color%22,%22header_3_text_color%22,%22header_2_text_color%22,%22header_5_text_color%22,%22header_6_text_color%22,%22quote_text_color%22,%22header_4_text_color%22,%22header_3_text_color%22,%22header_2_text_color%22,%22header_5_text_color%22,%22header_6_text_color%22,%22quote_text_color%22,%22header_4_text_color%22,%22header_3_text_color%22,%22header_2_text_color%22,%22header_5_text_color%22,%22header_6_text_color%22,%22quote_text_color%22,%22header_4_text_color%22,%22header_3_text_color%22,%22header_2_text_color%22,%22header_5_text_color%22,%22header_6_text_color%22,%22quote_text_color%22%93,%22gcid-secondary-color%22:%91%22quote_border_color%22,%22quote_border_color%22,%22quote_border_color%22,%22quote_border_color%22,%22quote_border_color%22%93}&#8221;]<\/p>\n<p>Street Art AI [Recognition]<\/p>\n<p>[\/et_pb_text][\/et_pb_column][\/et_pb_row][et_pb_row column_structure=&#8221;1_3,1_3,1_3&#8243; _builder_version=&#8221;4.27.2&#8243; _module_preset=&#8221;default&#8221; global_colors_info=&#8221;{}&#8221;][et_pb_column type=&#8221;1_3&#8243; _builder_version=&#8221;4.27.2&#8243; _module_preset=&#8221;default&#8221; global_colors_info=&#8221;{}&#8221;][\/et_pb_column][et_pb_column type=&#8221;1_3&#8243; _builder_version=&#8221;4.27.2&#8243; _module_preset=&#8221;default&#8221; global_colors_info=&#8221;{}&#8221;][et_pb_code _builder_version=&#8221;4.27.2&#8243; _module_preset=&#8221;default&#8221; hover_enabled=&#8221;0&#8243; global_colors_info=&#8221;{}&#8221; sticky_enabled=&#8221;0&#8243;]<!-- WRAPPER : tu peux renseigner les data-* si tu veux envoyer des metadata --><!-- [et_pb_line_break_holder] --><!-- Exemple Invader Paris :<!-- [et_pb_line_break_holder] --><\/p>\n<div id=\"ai-art-form\" class=\"ai-hero-section\"<!-- [et_pb_line_break_holder] -->     data-code-raw=&#8221;PA_0404&#8243;<!-- [et_pb_line_break_holder] -->     data-title=&#8221;PA_0404&#8243;<!-- [et_pb_line_break_holder] -->     data-points=&#8221;10 pts&#8221;<!-- [et_pb_line_break_holder] -->     data-date-pose=&#8221;15\/01\/1998&#8243;<!-- [et_pb_line_break_holder] -->     data-ville=&#8221;Paris &#8211; 11\u00e8me arrondissement&#8221;<!-- [et_pb_line_break_holder] -->     data-dernier-etat=&#8221;D\u00e9truit !&#8221;<!-- [et_pb_line_break_holder] -->     data-date-dernier-etat=&#8221;mai 2025&#8243;><!-- [et_pb_line_break_holder] -->&#8211;><!-- [et_pb_line_break_holder] --><\/p>\n<div id=\"ai-art-form\" class=\"ai-hero-section\"<!-- [et_pb_line_break_holder] -->     data-code-raw=&#8221;&#8221;<!-- [et_pb_line_break_holder] -->     data-title=&#8221;&#8221;<!-- [et_pb_line_break_holder] -->     data-points=&#8221;&#8221;<!-- [et_pb_line_break_holder] -->     data-date-pose=&#8221;&#8221;<!-- [et_pb_line_break_holder] -->     data-ville=&#8221;&#8221;<!-- [et_pb_line_break_holder] -->     data-dernier-etat=&#8221;&#8221;<!-- [et_pb_line_break_holder] -->     data-date-dernier-etat=&#8221;&#8221;><!-- [et_pb_line_break_holder] --><!-- [et_pb_line_break_holder] -->  <\/p>\n<div class=\"ai-hero-inner\"><!-- [et_pb_line_break_holder] -->    <button id=\"customUploadBtn\" class=\"custom-upload-btn\" type=\"button\">\ud83d\udcf7 Take a picture<\/button><!-- [et_pb_line_break_holder] -->    <input type=\"file\" id=\"aiArtImage\" accept=\"image\/*\" style=\"display:none;\"><!-- [et_pb_line_break_holder] -->  <\/div>\n<p><!-- [et_pb_line_break_holder] --><\/div>\n<p><!-- [et_pb_line_break_holder] --><!-- [et_pb_line_break_holder] --><!-- [et_pb_line_break_holder] --><!-- POPUP --><!-- [et_pb_line_break_holder] --><\/p>\n<div id=\"aiPopup\" class=\"ai-popup\" aria-hidden=\"true\"><!-- [et_pb_line_break_holder] -->  <\/p>\n<div class=\"ai-popup-content\" role=\"dialog\" aria-modal=\"true\" aria-labelledby=\"artistName\"><!-- [et_pb_line_break_holder] -->    <button class=\"ai-popup-close\" aria-label=\"Fermer\" type=\"button\">\u00d7<\/button><!-- [et_pb_line_break_holder] --><!-- [et_pb_line_break_holder] -->    <\/p>\n<div class=\"ai-card-hero\"><!-- [et_pb_line_break_holder] -->      <\/p>\n<div class=\"ai-card-left\"><!-- [et_pb_line_break_holder] -->        <img decoding=\"async\" id=\"artistPhoto\" src=\"\" alt=\"Photo de l'artiste\" class=\"artist-photo\" style=\"display:none;\"><!-- [et_pb_line_break_holder] -->        <canvas id=\"aiDetectedCanvas\" class=\"detected-canvas\"><\/canvas><!-- [et_pb_line_break_holder] -->      <\/div>\n<p><!-- [et_pb_line_break_holder] --><!-- [et_pb_line_break_holder] -->      <\/p>\n<div class=\"ai-card-right\"><!-- [et_pb_line_break_holder] -->        <\/p>\n<h3 id=\"artistName\" class=\"artist-name\" aria-live=\"polite\">Analyse en cours&#8230;<\/h3>\n<p><!-- [et_pb_line_break_holder] -->        <pee><strong>Style : <\/strong><span id=\"artStyle\">\u2014<\/span><\/pee><!-- [et_pb_line_break_holder] --><!-- [et_pb_line_break_holder] -->        <!-- AI Confidence --><!-- [et_pb_line_break_holder] -->        <\/p>\n<div class=\"ai-confidence-block\" style=\"margin-top:8px;\"><!-- [et_pb_line_break_holder] -->          <pee style=\"margin:0 0 4px;\"><!-- [et_pb_line_break_holder] -->            <strong>AI Confidence :<\/strong> <span id=\"aiConfidenceLabel\">\u2014<\/span><!-- [et_pb_line_break_holder] -->          <\/pee><!-- [et_pb_line_break_holder] -->          <\/p>\n<div class=\"ai-confidence-bar\"><!-- [et_pb_line_break_holder] -->            <\/p>\n<div id=\"aiConfidenceFill\"><\/div>\n<p><!-- [et_pb_line_break_holder] -->          <\/div>\n<p><!-- [et_pb_line_break_holder] -->        <\/div>\n<p><!-- [et_pb_line_break_holder] --><!-- [et_pb_line_break_holder] -->        <\/p>\n<div class=\"ai-about-block\" style=\"margin-top:12px;\"><!-- [et_pb_line_break_holder] -->          <pee><strong>About :<\/strong><\/pee><!-- [et_pb_line_break_holder] -->          <\/p>\n<div id=\"artistAbout\" class=\"artist-about\" style=\"white-space:pre-wrap;color:#222;\"><\/div>\n<p><!-- [et_pb_line_break_holder] -->        <\/div>\n<p><!-- [et_pb_line_break_holder] -->      <\/div>\n<p><!-- [et_pb_line_break_holder] -->    <\/div>\n<p><!-- [et_pb_line_break_holder] --><!-- [et_pb_line_break_holder] -->    <\/p>\n<div class=\"ai-popup-footer\" style=\"margin-top:12px;\"><!-- [et_pb_line_break_holder] -->      <button class=\"ai-close-btn\" type=\"button\">Fermer<\/button><!-- [et_pb_line_break_holder] -->    <\/div>\n<p><!-- [et_pb_line_break_holder] -->  <\/div>\n<p><!-- [et_pb_line_break_holder] --><\/div>\n<p><!-- [et_pb_line_break_holder] --><!-- [et_pb_line_break_holder] --><\/p>\n<style><!-- [et_pb_line_break_holder] -->.ai-hero-section {<!-- [et_pb_line_break_holder] -->  padding: 80px 20px;<!-- [et_pb_line_break_holder] -->  text-align: center;<!-- [et_pb_line_break_holder] -->  background: linear-gradient(180deg, rgba(60,79,0,0.06) 0%, rgba(0,0,0,0));<!-- [et_pb_line_break_holder] -->}<!-- [et_pb_line_break_holder] -->.ai-hero-inner {<!-- [et_pb_line_break_holder] -->  max-width: 1100px;<!-- [et_pb_line_break_holder] -->  margin: 0 auto;<!-- [et_pb_line_break_holder] -->}<!-- [et_pb_line_break_holder] -->.custom-upload-btn {<!-- [et_pb_line_break_holder] -->  background: #000;<!-- [et_pb_line_break_holder] -->  color: #fff;<!-- [et_pb_line_break_holder] -->  border: none;<!-- [et_pb_line_break_holder] -->  padding: 16px 48px;<!-- [et_pb_line_break_holder] -->  border-radius: 999px;<!-- [et_pb_line_break_holder] -->  font-size: 18px;<!-- [et_pb_line_break_holder] -->  font-weight: 700;<!-- [et_pb_line_break_holder] -->  cursor: pointer;<!-- [et_pb_line_break_holder] -->  box-shadow: 0 8px 20px rgba(60,79,0,0.18);<!-- [et_pb_line_break_holder] -->  transition: transform .18s ease, box-shadow .18s ease;<!-- [et_pb_line_break_holder] -->}<!-- [et_pb_line_break_holder] -->.custom-upload-btn:hover {<!-- [et_pb_line_break_holder] -->  transform: translateY(-3px);<!-- [et_pb_line_break_holder] -->  box-shadow: 0 14px 30px rgba(60,79,0,0.22);<!-- [et_pb_line_break_holder] -->}<!-- [et_pb_line_break_holder] --><!-- [et_pb_line_break_holder] -->.ai-popup {<!-- [et_pb_line_break_holder] -->  position: fixed !important;<!-- [et_pb_line_break_holder] -->  inset: 0;<!-- [et_pb_line_break_holder] -->  width: 100vw;<!-- [et_pb_line_break_holder] -->  height: 100vh;<!-- [et_pb_line_break_holder] -->  display: none;<!-- [et_pb_line_break_holder] -->  justify-content: center;<!-- [et_pb_line_break_holder] -->  align-items: flex-start;<!-- [et_pb_line_break_holder] -->  padding-top: 120px;<!-- [et_pb_line_break_holder] -->  z-index: 999999 !important;<!-- [et_pb_line_break_holder] -->  background: rgba(61, 112, 24, 0.55);<!-- [et_pb_line_break_holder] -->  backdrop-filter: blur(6px);<!-- [et_pb_line_break_holder] -->  overscroll-behavior: contain;<!-- [et_pb_line_break_holder] -->}<!-- [et_pb_line_break_holder] -->.ai-popup[aria-hidden=\"false\"] {<!-- [et_pb_line_break_holder] -->  display: flex;<!-- [et_pb_line_break_holder] -->}<!-- [et_pb_line_break_holder] --><!-- [et_pb_line_break_holder] -->.ai-popup-content {<!-- [et_pb_line_break_holder] -->  position: relative;<!-- [et_pb_line_break_holder] -->  max-width: 900px;<!-- [et_pb_line_break_holder] -->  width: 90%;<!-- [et_pb_line_break_holder] -->  background: #fff;<!-- [et_pb_line_break_holder] -->  border-radius: 20px;<!-- [et_pb_line_break_holder] -->  padding: 26px;<!-- [et_pb_line_break_holder] -->  box-shadow: 0 30px 80px rgba(0,0,0,0.45);<!-- [et_pb_line_break_holder] -->  overflow-y: auto;<!-- [et_pb_line_break_holder] -->  max-height: calc(100vh - 160px);<!-- [et_pb_line_break_holder] -->  display: flex;<!-- [et_pb_line_break_holder] -->  flex-direction: column;<!-- [et_pb_line_break_holder] -->  gap: 14px;<!-- [et_pb_line_break_holder] -->  animation: fadeInPopup 0.25s ease;<!-- [et_pb_line_break_holder] -->  z-index: 10001;<!-- [et_pb_line_break_holder] -->}<!-- [et_pb_line_break_holder] -->@keyframes fadeInPopup {<!-- [et_pb_line_break_holder] -->  from { opacity: 0; transform: translateY(20px); }<!-- [et_pb_line_break_holder] -->  to { opacity: 1; transform: translateY(0); }<!-- [et_pb_line_break_holder] -->}<!-- [et_pb_line_break_holder] --><!-- [et_pb_line_break_holder] -->.ai-popup-close {<!-- [et_pb_line_break_holder] -->  position: sticky;<!-- [et_pb_line_break_holder] -->  top: 8px;<!-- [et_pb_line_break_holder] -->  right: 8px;<!-- [et_pb_line_break_holder] -->  align-self: flex-end;<!-- [et_pb_line_break_holder] -->  background: transparent;<!-- [et_pb_line_break_holder] -->  border: none;<!-- [et_pb_line_break_holder] -->  font-size: 28px;<!-- [et_pb_line_break_holder] -->  cursor: pointer;<!-- [et_pb_line_break_holder] -->  color: #222;<!-- [et_pb_line_break_holder] -->  z-index: 10002;<!-- [et_pb_line_break_holder] -->}<!-- [et_pb_line_break_holder] --><!-- [et_pb_line_break_holder] -->.ai-card-hero {<!-- [et_pb_line_break_holder] -->  display: flex;<!-- [et_pb_line_break_holder] -->  gap: 20px;<!-- [et_pb_line_break_holder] -->  align-items: flex-start;<!-- [et_pb_line_break_holder] -->}<!-- [et_pb_line_break_holder] -->.ai-card-left {<!-- [et_pb_line_break_holder] -->  flex: 0 0 312px;<!-- [et_pb_line_break_holder] -->  max-width: 312px;<!-- [et_pb_line_break_holder] -->  text-align: center;<!-- [et_pb_line_break_holder] -->  margin: 0 auto;<!-- [et_pb_line_break_holder] -->  display: flex;<!-- [et_pb_line_break_holder] -->  flex-direction: column;<!-- [et_pb_line_break_holder] -->  align-items: center;<!-- [et_pb_line_break_holder] -->}<!-- [et_pb_line_break_holder] -->.artist-photo,<!-- [et_pb_line_break_holder] -->.detected-canvas {<!-- [et_pb_line_break_holder] -->  width: 100%;<!-- [et_pb_line_break_holder] -->  max-width: 312px;<!-- [et_pb_line_break_holder] -->  border-radius: 12px;<!-- [et_pb_line_break_holder] -->  display: block;<!-- [et_pb_line_break_holder] -->  margin-bottom: 12px;<!-- [et_pb_line_break_holder] -->  box-shadow: 0 6px 20px rgba(0,0,0,0.15);<!-- [et_pb_line_break_holder] -->}<!-- [et_pb_line_break_holder] -->.artist-photo {<!-- [et_pb_line_break_holder] -->  border: 4px solid #3c4f00;<!-- [et_pb_line_break_holder] -->  object-fit: cover;<!-- [et_pb_line_break_holder] -->}<!-- [et_pb_line_break_holder] -->.detected-canvas {<!-- [et_pb_line_break_holder] -->  border: none;<!-- [et_pb_line_break_holder] -->}<!-- [et_pb_line_break_holder] -->.ai-card-right {<!-- [et_pb_line_break_holder] -->  flex: 1;<!-- [et_pb_line_break_holder] -->  text-align: left;<!-- [et_pb_line_break_holder] -->}<!-- [et_pb_line_break_holder] -->.artist-name {<!-- [et_pb_line_break_holder] -->  color: #3c4f00;<!-- [et_pb_line_break_holder] -->  font-size: 22px;<!-- [et_pb_line_break_holder] -->  margin: 0 0 8px;<!-- [et_pb_line_break_holder] -->}<!-- [et_pb_line_break_holder] -->.ai-close-btn {<!-- [et_pb_line_break_holder] -->  background: #3c4f00;<!-- [et_pb_line_break_holder] -->  color: #fff;<!-- [et_pb_line_break_holder] -->  border: none;<!-- [et_pb_line_break_holder] -->  padding: 10px 16px;<!-- [et_pb_line_break_holder] -->  border-radius: 8px;<!-- [et_pb_line_break_holder] -->  cursor: pointer;<!-- [et_pb_line_break_holder] -->  font-weight: 700;<!-- [et_pb_line_break_holder] -->}<!-- [et_pb_line_break_holder] --><!-- [et_pb_line_break_holder] -->\/* AI Confidence bar *\/<!-- [et_pb_line_break_holder] -->.ai-confidence-bar {<!-- [et_pb_line_break_holder] -->  position: relative;<!-- [et_pb_line_break_holder] -->  width: 100%;<!-- [et_pb_line_break_holder] -->  max-width: 260px;<!-- [et_pb_line_break_holder] -->  height: 8px;<!-- [et_pb_line_break_holder] -->  border-radius: 999px;<!-- [et_pb_line_break_holder] -->  background: #e2e8d8;<!-- [et_pb_line_break_holder] -->  overflow: hidden;<!-- [et_pb_line_break_holder] -->}<!-- [et_pb_line_break_holder] -->.ai-confidence-bar #aiConfidenceFill {<!-- [et_pb_line_break_holder] -->  height: 100%;<!-- [et_pb_line_break_holder] -->  width: 0%;<!-- [et_pb_line_break_holder] -->  border-radius: 999px;<!-- [et_pb_line_break_holder] -->  background: linear-gradient(90deg, #d97706, #3c4f00);<!-- [et_pb_line_break_holder] -->  transition: width 0.35s ease;<!-- [et_pb_line_break_holder] -->}<!-- [et_pb_line_break_holder] --><!-- [et_pb_line_break_holder] -->@media (max-width: 760px){<!-- [et_pb_line_break_holder] -->  .ai-popup {<!-- [et_pb_line_break_holder] -->    padding-top: 100px;<!-- [et_pb_line_break_holder] -->  }<!-- [et_pb_line_break_holder] -->  .ai-popup-content {<!-- [et_pb_line_break_holder] -->    width: 94%;<!-- [et_pb_line_break_holder] -->    padding: 18px;<!-- [et_pb_line_break_holder] -->    max-height: calc(100vh - 140px);<!-- [et_pb_line_break_holder] -->    margin: 0 auto;<!-- [et_pb_line_break_holder] -->  }<!-- [et_pb_line_break_holder] -->  .ai-card-hero {<!-- [et_pb_line_break_holder] -->    flex-direction: column;<!-- [et_pb_line_break_holder] -->    align-items: center;<!-- [et_pb_line_break_holder] -->    text-align: center;<!-- [et_pb_line_break_holder] -->  }<!-- [et_pb_line_break_holder] -->  .ai-card-left {<!-- [et_pb_line_break_holder] -->    flex: 0 0 auto;<!-- [et_pb_line_break_holder] -->    max-width: 312px;<!-- [et_pb_line_break_holder] -->    width: 100%;<!-- [et_pb_line_break_holder] -->    flex-direction: column-reverse;<!-- [et_pb_line_break_holder] -->  }<!-- [et_pb_line_break_holder] -->  .ai-card-right {<!-- [et_pb_line_break_holder] -->    text-align: left;<!-- [et_pb_line_break_holder] -->    width: 100%;<!-- [et_pb_line_break_holder] -->  }<!-- [et_pb_line_break_holder] -->}<!-- [et_pb_line_break_holder] -->body.ai-popup-open {<!-- [et_pb_line_break_holder] -->  overflow: hidden !important;<!-- [et_pb_line_break_holder] -->  touch-action: none;<!-- [et_pb_line_break_holder] -->}<!-- [et_pb_line_break_holder] --><\/style>\n<p><!-- [et_pb_line_break_holder] --><!-- [et_pb_line_break_holder] --><script><!-- [et_pb_line_break_holder] -->(function initAiArtPopup(){<!-- [et_pb_line_break_holder] -->  const restUrl = 'https:\/\/api.streetartist.fr\/analyze';<!-- [et_pb_line_break_holder] --><!-- [et_pb_line_break_holder] -->  let lastImageURL    = null;<!-- [et_pb_line_break_holder] -->  let lastImageWidth  = null;<!-- [et_pb_line_break_holder] -->  let lastImageHeight = null;<!-- [et_pb_line_break_holder] --><!-- [et_pb_line_break_holder] -->  function typeText(el, text, speed = 20) {<!-- [et_pb_line_break_holder] -->    return new Promise(resolve => {<!-- [et_pb_line_break_holder] -->      el.textContent = '';<!-- [et_pb_line_break_holder] -->      if (!text) return resolve();<!-- [et_pb_line_break_holder] -->      let i = 0;<!-- [et_pb_line_break_holder] -->      const interval = setInterval(() => {<!-- [et_pb_line_break_holder] -->        el.textContent += text.charAt(i);<!-- [et_pb_line_break_holder] -->        i++;<!-- [et_pb_line_break_holder] -->        if (i >= text.length) {<!-- [et_pb_line_break_holder] -->          clearInterval(interval);<!-- [et_pb_line_break_holder] -->          resolve();<!-- [et_pb_line_break_holder] -->        }<!-- [et_pb_line_break_holder] -->      }, speed);<!-- [et_pb_line_break_holder] -->    });<!-- [et_pb_line_break_holder] -->  }<!-- [et_pb_line_break_holder] --><!-- [et_pb_line_break_holder] -->  async function compressAndResizeImage(file, targetWidth = 600){<!-- [et_pb_line_break_holder] -->    return new Promise((resolve)=>{<!-- [et_pb_line_break_holder] -->      const img = new Image();<!-- [et_pb_line_break_holder] -->      img.onload = ()=>{<!-- [et_pb_line_break_holder] -->        const aspect = img.height \/ img.width;<!-- [et_pb_line_break_holder] -->        const canvas = document.createElement('canvas');<!-- [et_pb_line_break_holder] -->        canvas.width = targetWidth;<!-- [et_pb_line_break_holder] -->        canvas.height = Math.round(targetWidth * aspect);<!-- [et_pb_line_break_holder] -->        const ctx = canvas.getContext('2d');<!-- [et_pb_line_break_holder] -->        ctx.drawImage(img, 0, 0, canvas.width, canvas.height);<!-- [et_pb_line_break_holder] --><!-- [et_pb_line_break_holder] -->        lastImageWidth  = canvas.width;<!-- [et_pb_line_break_holder] -->        lastImageHeight = canvas.height;<!-- [et_pb_line_break_holder] -->        lastImageURL    = canvas.toDataURL('image\/jpeg', 0.8);<!-- [et_pb_line_break_holder] --><!-- [et_pb_line_break_holder] -->        canvas.toBlob((blob)=>{<!-- [et_pb_line_break_holder] -->          resolve(new File([blob], file.name, {<!-- [et_pb_line_break_holder] -->            type:'image\/jpeg',<!-- [et_pb_line_break_holder] -->            lastModified: Date.now()<!-- [et_pb_line_break_holder] -->          }));<!-- [et_pb_line_break_holder] -->        }, 'image\/jpeg', 0.8);<!-- [et_pb_line_break_holder] -->      };<!-- [et_pb_line_break_holder] -->      img.src = URL.createObjectURL(file);<!-- [et_pb_line_break_holder] -->    });<!-- [et_pb_line_break_holder] -->  }<!-- [et_pb_line_break_holder] --><!-- [et_pb_line_break_holder] -->  function fileToBase64(file) {<!-- [et_pb_line_break_holder] -->    return new Promise((resolve, reject)=>{<!-- [et_pb_line_break_holder] -->      const reader = new FileReader();<!-- [et_pb_line_break_holder] -->      reader.onload  = () => resolve(reader.result);<!-- [et_pb_line_break_holder] -->      reader.onerror = reject;<!-- [et_pb_line_break_holder] -->      reader.readAsDataURL(file);<!-- [et_pb_line_break_holder] -->    });<!-- [et_pb_line_break_holder] -->  }<!-- [et_pb_line_break_holder] --><!-- [et_pb_line_break_holder] -->function drawDetectionsOnCanvas(detections, artistLabel){<!-- [et_pb_line_break_holder] -->  const canvas = document.getElementById('aiDetectedCanvas');<!-- [et_pb_line_break_holder] -->  if (!canvas || !lastImageURL) return;<!-- [et_pb_line_break_holder] --><!-- [et_pb_line_break_holder] -->  const ctx = canvas.getContext('2d');<!-- [et_pb_line_break_holder] -->  const img = new Image();<!-- [et_pb_line_break_holder] --><!-- [et_pb_line_break_holder] -->  img.onload = () => {<!-- [et_pb_line_break_holder] -->    canvas.width  = lastImageWidth;<!-- [et_pb_line_break_holder] -->    canvas.height = lastImageHeight;<!-- [et_pb_line_break_holder] -->    ctx.drawImage(img, 0, 0, canvas.width, canvas.height);<!-- [et_pb_line_break_holder] --><!-- [et_pb_line_break_holder] -->    const imgW = canvas.width;<!-- [et_pb_line_break_holder] -->    const imgH = canvas.height;<!-- [et_pb_line_break_holder] --><!-- [et_pb_line_break_holder] -->    let boxToDraw = null;<!-- [et_pb_line_break_holder] --><!-- [et_pb_line_break_holder] -->    \/\/ 1) Si on a des d\u00e9tections \u2192 on ne garde QUE la plus confiante<!-- [et_pb_line_break_holder] -->    if (Array.isArray(detections) && detections.length > 0) {<!-- [et_pb_line_break_holder] -->      let bestDet = detections[0];<!-- [et_pb_line_break_holder] --><!-- [et_pb_line_break_holder] -->      \/\/ chercher celle avec la plus grande confidence si dispo<!-- [et_pb_line_break_holder] -->      detections.forEach(det => {<!-- [et_pb_line_break_holder] -->        if (typeof det.confidence === 'number' && typeof bestDet.confidence === 'number') {<!-- [et_pb_line_break_holder] -->          if (det.confidence > bestDet.confidence) {<!-- [et_pb_line_break_holder] -->            bestDet = det;<!-- [et_pb_line_break_holder] -->          }<!-- [et_pb_line_break_holder] -->        }<!-- [et_pb_line_break_holder] -->      });<!-- [et_pb_line_break_holder] --><!-- [et_pb_line_break_holder] -->      const bbox = bestDet.bbox || [];<!-- [et_pb_line_break_holder] -->      if (Array.isArray(bbox) && bbox.length >= 4) {<!-- [et_pb_line_break_holder] -->        let [x1, y1, x2, y2] = bbox.map(Number);<!-- [et_pb_line_break_holder] -->        if (![x1, y1, x2, y2].some(v => Number.isNaN(v))) {<!-- [et_pb_line_break_holder] --><!-- [et_pb_line_break_holder] -->          let w = x2 - x1;<!-- [et_pb_line_break_holder] -->          let h = y2 - y1;<!-- [et_pb_line_break_holder] --><!-- [et_pb_line_break_holder] -->          const ratioW = w \/ imgW;<!-- [et_pb_line_break_holder] -->          const ratioH = h \/ imgH;<!-- [et_pb_line_break_holder] --><!-- [et_pb_line_break_holder] -->          \/\/ Si YOLO est trop large \u2192 recadrage 80% centr\u00e9<!-- [et_pb_line_break_holder] -->          if (ratioW >= 0.8 || ratioH >= 0.8) {<!-- [et_pb_line_break_holder] -->            const targetW = imgW * 0.8;<!-- [et_pb_line_break_holder] -->            const targetH = imgH * 0.8;<!-- [et_pb_line_break_holder] -->            w  = targetW;<!-- [et_pb_line_break_holder] -->            h  = targetH;<!-- [et_pb_line_break_holder] -->            x1 = (imgW - targetW) \/ 2;<!-- [et_pb_line_break_holder] -->            y1 = (imgH - targetH) \/ 2;<!-- [et_pb_line_break_holder] -->          }<!-- [et_pb_line_break_holder] --><!-- [et_pb_line_break_holder] -->          boxToDraw = {<!-- [et_pb_line_break_holder] -->            x1,<!-- [et_pb_line_break_holder] -->            y1,<!-- [et_pb_line_break_holder] -->            w,<!-- [et_pb_line_break_holder] -->            h,<!-- [et_pb_line_break_holder] -->            label: bestDet.class || artistLabel || 'Artwork'<!-- [et_pb_line_break_holder] -->          };<!-- [et_pb_line_break_holder] -->        }<!-- [et_pb_line_break_holder] -->      }<!-- [et_pb_line_break_holder] -->    }<!-- [et_pb_line_break_holder] --><!-- [et_pb_line_break_holder] -->    \/\/ 2) Si aucune box valide \u2192 box centr\u00e9e 80%<!-- [et_pb_line_break_holder] -->    if (!boxToDraw) {<!-- [et_pb_line_break_holder] -->      const targetW = imgW * 0.8;<!-- [et_pb_line_break_holder] -->      const targetH = imgH * 0.8;<!-- [et_pb_line_break_holder] -->      const x1 = (imgW - targetW) \/ 2;<!-- [et_pb_line_break_holder] -->      const y1 = (imgH - targetH) \/ 2;<!-- [et_pb_line_break_holder] --><!-- [et_pb_line_break_holder] -->      boxToDraw = {<!-- [et_pb_line_break_holder] -->        x1,<!-- [et_pb_line_break_holder] -->        y1,<!-- [et_pb_line_break_holder] -->        w: targetW,<!-- [et_pb_line_break_holder] -->        h: targetH,<!-- [et_pb_line_break_holder] -->        label: artistLabel || 'Artwork'<!-- [et_pb_line_break_holder] -->      };<!-- [et_pb_line_break_holder] -->    }<!-- [et_pb_line_break_holder] --><!-- [et_pb_line_break_holder] -->    \/\/ Dessin de LA box<!-- [et_pb_line_break_holder] -->    const { x1, y1, w, h, label } = boxToDraw;<!-- [et_pb_line_break_holder] --><!-- [et_pb_line_break_holder] -->    ctx.lineWidth = 3;<!-- [et_pb_line_break_holder] -->    ctx.font      = '16px Poppins, system-ui, sans-serif';<!-- [et_pb_line_break_holder] --><!-- [et_pb_line_break_holder] -->    ctx.strokeStyle = '#3c4f00';<!-- [et_pb_line_break_holder] -->    ctx.strokeRect(x1, y1, w, h);<!-- [et_pb_line_break_holder] --><!-- [et_pb_line_break_holder] -->    const text = label || 'Artwork';<!-- [et_pb_line_break_holder] -->    const padding   = 6;<!-- [et_pb_line_break_holder] -->    const boxHeight = 22;<!-- [et_pb_line_break_holder] -->    const textWidth = ctx.measureText(text).width;<!-- [et_pb_line_break_holder] --><!-- [et_pb_line_break_holder] -->    ctx.fillStyle = 'rgba(60,79,0,0.85)';<!-- [et_pb_line_break_holder] -->    ctx.fillRect(<!-- [et_pb_line_break_holder] -->      x1,<!-- [et_pb_line_break_holder] -->      Math.max(0, y1 - boxHeight),<!-- [et_pb_line_break_holder] -->      textWidth + padding * 2,<!-- [et_pb_line_break_holder] -->      boxHeight<!-- [et_pb_line_break_holder] -->    );<!-- [et_pb_line_break_holder] --><!-- [et_pb_line_break_holder] -->    ctx.fillStyle    = '#fff';<!-- [et_pb_line_break_holder] -->    ctx.textBaseline = 'middle';<!-- [et_pb_line_break_holder] -->    ctx.fillText(<!-- [et_pb_line_break_holder] -->      text,<!-- [et_pb_line_break_holder] -->      x1 + padding,<!-- [et_pb_line_break_holder] -->      Math.max(0, y1 - boxHeight \/ 2)<!-- [et_pb_line_break_holder] -->    );<!-- [et_pb_line_break_holder] -->  };<!-- [et_pb_line_break_holder] --><!-- [et_pb_line_break_holder] -->  img.src = lastImageURL;<!-- [et_pb_line_break_holder] -->}<!-- [et_pb_line_break_holder] --><!-- [et_pb_line_break_holder] -->    <!-- [et_pb_line_break_holder] --><!-- [et_pb_line_break_holder] -->  function setup(){<!-- [et_pb_line_break_holder] -->    const uploadBtn      = document.getElementById('customUploadBtn');<!-- [et_pb_line_break_holder] -->    const fileInput      = document.getElementById('aiArtImage');<!-- [et_pb_line_break_holder] -->    const popupEl        = document.getElementById('aiPopup');<!-- [et_pb_line_break_holder] -->    const artistNameEl   = document.getElementById('artistName');<!-- [et_pb_line_break_holder] -->    const artStyleEl     = document.getElementById('artStyle');<!-- [et_pb_line_break_holder] -->    const artistAboutEl  = document.getElementById('artistAbout');<!-- [et_pb_line_break_holder] -->    const artistPhotoEl  = document.getElementById('artistPhoto');<!-- [et_pb_line_break_holder] -->    const aiConfLabelEl  = document.getElementById('aiConfidenceLabel');<!-- [et_pb_line_break_holder] -->    const aiConfFillEl   = document.getElementById('aiConfidenceFill');<!-- [et_pb_line_break_holder] -->    const wrapper        = document.getElementById('ai-art-form');<!-- [et_pb_line_break_holder] --><!-- [et_pb_line_break_holder] -->    if (!uploadBtn || !fileInput || !popupEl) {<!-- [et_pb_line_break_holder] -->      console.warn('AI popup: \u00e9l\u00e9ments non encore dispo, retry\u2026');<!-- [et_pb_line_break_holder] -->      setTimeout(setup, 300);<!-- [et_pb_line_break_holder] -->      return;<!-- [et_pb_line_break_holder] -->    }<!-- [et_pb_line_break_holder] --><!-- [et_pb_line_break_holder] -->    if (popupEl.parentNode !== document.body) {<!-- [et_pb_line_break_holder] -->      document.body.appendChild(popupEl);<!-- [et_pb_line_break_holder] -->    }<!-- [et_pb_line_break_holder] --><!-- [et_pb_line_break_holder] -->    const closeBtns = popupEl.querySelectorAll('.ai-popup-close, .ai-close-btn');<!-- [et_pb_line_break_holder] --><!-- [et_pb_line_break_holder] -->    function openPopup(){<!-- [et_pb_line_break_holder] -->      popupEl.setAttribute('aria-hidden','false');<!-- [et_pb_line_break_holder] -->      popupEl.style.display = 'flex';<!-- [et_pb_line_break_holder] -->      document.body.classList.add('ai-popup-open');<!-- [et_pb_line_break_holder] -->    }<!-- [et_pb_line_break_holder] --><!-- [et_pb_line_break_holder] -->    function closePopup(){<!-- [et_pb_line_break_holder] -->      popupEl.setAttribute('aria-hidden','true');<!-- [et_pb_line_break_holder] -->      popupEl.style.display = 'none';<!-- [et_pb_line_break_holder] -->      document.body.classList.remove('ai-popup-open');<!-- [et_pb_line_break_holder] -->    }<!-- [et_pb_line_break_holder] --><!-- [et_pb_line_break_holder] -->    uploadBtn.addEventListener('click', ()=> {<!-- [et_pb_line_break_holder] -->      fileInput.click();<!-- [et_pb_line_break_holder] -->    });<!-- [et_pb_line_break_holder] --><!-- [et_pb_line_break_holder] -->    closeBtns.forEach(b => b.addEventListener('click', closePopup));<!-- [et_pb_line_break_holder] --><!-- [et_pb_line_break_holder] -->    window.addEventListener('keydown', (e)=> {<!-- [et_pb_line_break_holder] -->      if (e.key === 'Escape') closePopup();<!-- [et_pb_line_break_holder] -->    });<!-- [et_pb_line_break_holder] --><!-- [et_pb_line_break_holder] -->    fileInput.addEventListener('change', async ()=>{<!-- [et_pb_line_break_holder] -->      if (!fileInput.files || !fileInput.files[0]) return;<!-- [et_pb_line_break_holder] --><!-- [et_pb_line_break_holder] -->      const originalFile   = fileInput.files[0];<!-- [et_pb_line_break_holder] -->      const compressedFile = await compressAndResizeImage(originalFile, 600);<!-- [et_pb_line_break_holder] --><!-- [et_pb_line_break_holder] -->      openPopup();<!-- [et_pb_line_break_holder] -->      artistNameEl.textContent  = 'Analyse en cours...';<!-- [et_pb_line_break_holder] -->      artStyleEl.textContent    = '\u2014';<!-- [et_pb_line_break_holder] -->      artistAboutEl.textContent = '';<!-- [et_pb_line_break_holder] -->      artistPhotoEl.style.display = 'none';<!-- [et_pb_line_break_holder] -->      if (aiConfLabelEl) aiConfLabelEl.textContent = '\u2014';<!-- [et_pb_line_break_holder] -->      if (aiConfFillEl)  aiConfFillEl.style.width  = '0%';<!-- [et_pb_line_break_holder] --><!-- [et_pb_line_break_holder] -->      try {<!-- [et_pb_line_break_holder] -->        const base64DataUrl = await fileToBase64(compressedFile);<!-- [et_pb_line_break_holder] --><!-- [et_pb_line_break_holder] -->        \/\/ Construire les metadata depuis les data-* du wrapper<!-- [et_pb_line_break_holder] -->        let meta = {};<!-- [et_pb_line_break_holder] -->        if (wrapper) {<!-- [et_pb_line_break_holder] -->          meta = {<!-- [et_pb_line_break_holder] -->            code_raw: wrapper.dataset.codeRaw || undefined,<!-- [et_pb_line_break_holder] -->            title: wrapper.dataset.title || undefined,<!-- [et_pb_line_break_holder] -->            points: wrapper.dataset.points || undefined,<!-- [et_pb_line_break_holder] -->            date_pose: wrapper.dataset.datePose || undefined,<!-- [et_pb_line_break_holder] -->            ville: wrapper.dataset.ville || undefined,<!-- [et_pb_line_break_holder] -->            dernier_etat: wrapper.dataset.dernierEtat || undefined,<!-- [et_pb_line_break_holder] -->            date_dernier_etat: wrapper.dataset.dateDernierEtat || undefined<!-- [et_pb_line_break_holder] -->          };<!-- [et_pb_line_break_holder] -->        }<!-- [et_pb_line_break_holder] --><!-- [et_pb_line_break_holder] -->        const payload = {<!-- [et_pb_line_break_holder] -->          image_base64: base64DataUrl,<!-- [et_pb_line_break_holder] -->          metadata: meta<!-- [et_pb_line_break_holder] -->        };<!-- [et_pb_line_break_holder] --><!-- [et_pb_line_break_holder] -->        const resp = await fetch(restUrl, {<!-- [et_pb_line_break_holder] -->          method: 'POST',<!-- [et_pb_line_break_holder] -->          headers: { 'Content-Type': 'application\/json' },<!-- [et_pb_line_break_holder] -->          body: JSON.stringify(payload),<!-- [et_pb_line_break_holder] -->          mode: 'cors',<!-- [et_pb_line_break_holder] -->          cache: 'no-cache'<!-- [et_pb_line_break_holder] -->        });<!-- [et_pb_line_break_holder] --><!-- [et_pb_line_break_holder] -->        if (!resp.ok) {<!-- [et_pb_line_break_holder] -->          console.error('API error status:', resp.status, resp.statusText);<!-- [et_pb_line_break_holder] -->          artistNameEl.textContent  = 'Erreur serveur';<!-- [et_pb_line_break_holder] -->          artistAboutEl.textContent = `Le serveur a r\u00e9pondu avec le statut ${resp.status} (${resp.statusText}).`;<!-- [et_pb_line_break_holder] -->          return;<!-- [et_pb_line_break_holder] -->        }<!-- [et_pb_line_break_holder] --><!-- [et_pb_line_break_holder] -->        const data = await resp.json();<!-- [et_pb_line_break_holder] --><!-- [et_pb_line_break_holder] -->        const artistText = data.artist || 'Unknown';<!-- [et_pb_line_break_holder] -->        let finalStyle   = data.style || '\u2014';<!-- [et_pb_line_break_holder] -->        const aboutText  = data.analysis || '';<!-- [et_pb_line_break_holder] --><!-- [et_pb_line_break_holder] -->        \/\/ confidence<!-- [et_pb_line_break_holder] -->        let confPct = null;<!-- [et_pb_line_break_holder] -->        if (typeof data.confidence === 'number') {<!-- [et_pb_line_break_holder] -->          confPct = Math.round(data.confidence * 100);<!-- [et_pb_line_break_holder] -->        } else if (typeof data.confidence === 'string') {<!-- [et_pb_line_break_holder] -->          const parsed = parseFloat(data.confidence);<!-- [et_pb_line_break_holder] -->          if (!Number.isNaN(parsed)) confPct = Math.round(parsed * 100);<!-- [et_pb_line_break_holder] -->        }<!-- [et_pb_line_break_holder] --><!-- [et_pb_line_break_holder] -->        if (aiConfLabelEl && aiConfFillEl) {<!-- [et_pb_line_break_holder] -->          if (confPct !== null) {<!-- [et_pb_line_break_holder] -->            aiConfLabelEl.textContent = confPct + '%';<!-- [et_pb_line_break_holder] -->            aiConfFillEl.style.width  = confPct + '%';<!-- [et_pb_line_break_holder] -->          } else {<!-- [et_pb_line_break_holder] -->            aiConfLabelEl.textContent = '\u2014';<!-- [et_pb_line_break_holder] -->            aiConfFillEl.style.width  = '0%';<!-- [et_pb_line_break_holder] -->          }<!-- [et_pb_line_break_holder] -->        }<!-- [et_pb_line_break_holder] --><!-- [et_pb_line_break_holder] -->        artistNameEl.textContent  = '';<!-- [et_pb_line_break_holder] -->        artStyleEl.textContent    = '\u2014';<!-- [et_pb_line_break_holder] -->        artistAboutEl.textContent = '';<!-- [et_pb_line_break_holder] --><!-- [et_pb_line_break_holder] -->        if (data.portrait_url) {<!-- [et_pb_line_break_holder] -->          artistPhotoEl.src = data.portrait_url;<!-- [et_pb_line_break_holder] -->          artistPhotoEl.style.display = 'block';<!-- [et_pb_line_break_holder] -->        } else {<!-- [et_pb_line_break_holder] -->          artistPhotoEl.style.display = 'none';<!-- [et_pb_line_break_holder] -->        }<!-- [et_pb_line_break_holder] --><!-- [et_pb_line_break_holder] -->        drawDetectionsOnCanvas(<!-- [et_pb_line_break_holder] -->          Array.isArray(data.detections) ? data.detections : [],<!-- [et_pb_line_break_holder] -->          data.artist || null<!-- [et_pb_line_break_holder] -->        );<!-- [et_pb_line_break_holder] --><!-- [et_pb_line_break_holder] -->        await typeText(artistNameEl, artistText, 25);<!-- [et_pb_line_break_holder] -->        await typeText(artStyleEl, finalStyle, 18);<!-- [et_pb_line_break_holder] -->        await typeText(artistAboutEl, aboutText, 10);<!-- [et_pb_line_break_holder] --><!-- [et_pb_line_break_holder] -->      } catch (err) {<!-- [et_pb_line_break_holder] -->        console.error('Fetch error (r\u00e9seau\/CORS) :', err);<!-- [et_pb_line_break_holder] -->        artistNameEl.textContent  = 'Erreur de communication';<!-- [et_pb_line_break_holder] -->        artistAboutEl.textContent = 'Impossible de joindre le serveur.';<!-- [et_pb_line_break_holder] -->      }<!-- [et_pb_line_break_holder] -->    });<!-- [et_pb_line_break_holder] --><!-- [et_pb_line_break_holder] -->    console.log('\u2705 AI popup initialis\u00e9 (version metadata + confidence + box 80%)');<!-- [et_pb_line_break_holder] -->  }<!-- [et_pb_line_break_holder] --><!-- [et_pb_line_break_holder] -->  setup();<!-- [et_pb_line_break_holder] -->})();<!-- [et_pb_line_break_holder] --><\/script><!-- [et_pb_line_break_holder] -->[\/et_pb_code][\/et_pb_column][et_pb_column type=&#8221;1_3&#8243; _builder_version=&#8221;4.27.2&#8243; _module_preset=&#8221;default&#8221; global_colors_info=&#8221;{}&#8221;][\/et_pb_column][\/et_pb_row][\/et_pb_section]<\/p>\n","protected":false},"excerpt":{"rendered":"<p>Street Art AI [Recognition]<\/p>\n","protected":false},"author":1,"featured_media":7,"parent":0,"menu_order":0,"comment_status":"closed","ping_status":"closed","template":"","meta":{"_et_pb_use_builder":"on","_et_pb_old_content":"","_et_gb_content_width":"","footnotes":""},"class_list":["post-12","page","type-page","status-publish","has-post-thumbnail","hentry"],"_links":{"self":[{"href":"https:\/\/streetartist.fr\/index.php\/wp-json\/wp\/v2\/pages\/12","targetHints":{"allow":["GET"]}}],"collection":[{"href":"https:\/\/streetartist.fr\/index.php\/wp-json\/wp\/v2\/pages"}],"about":[{"href":"https:\/\/streetartist.fr\/index.php\/wp-json\/wp\/v2\/types\/page"}],"author":[{"embeddable":true,"href":"https:\/\/streetartist.fr\/index.php\/wp-json\/wp\/v2\/users\/1"}],"replies":[{"embeddable":true,"href":"https:\/\/streetartist.fr\/index.php\/wp-json\/wp\/v2\/comments?post=12"}],"version-history":[{"count":99,"href":"https:\/\/streetartist.fr\/index.php\/wp-json\/wp\/v2\/pages\/12\/revisions"}],"predecessor-version":[{"id":225,"href":"https:\/\/streetartist.fr\/index.php\/wp-json\/wp\/v2\/pages\/12\/revisions\/225"}],"wp:featuredmedia":[{"embeddable":true,"href":"https:\/\/streetartist.fr\/index.php\/wp-json\/wp\/v2\/media\/7"}],"wp:attachment":[{"href":"https:\/\/streetartist.fr\/index.php\/wp-json\/wp\/v2\/media?parent=12"}],"curies":[{"name":"wp","href":"https:\/\/api.w.org\/{rel}","templated":true}]}}