Output:
Exit code: 0
Wall time: 1 seconds
Output:
<?php
/**
 * annonces_theme_admin.php - Administration des th��mes
 * Gestion des variantes de couleurs pour les annonces
 */

require_once __DIR__.'/config_annonces.php';
require_once __DIR__.'/auth.php';
require_once __DIR__.'/helpers.php';

// VǸrification de l'authentification
requireAuth('Admin �?" Th��me');

// Paths
$jsonPath = __DIR__.'/data/annonces_theme.json';
@is_dir(dirname($jsonPath)) || @mkdir(dirname($jsonPath), 0775, true);

// Load overrides
$overrides = read_json($jsonPath);

// POST processing
$flash = '';
if (($_SERVER['REQUEST_METHOD'] ?? 'GET') === 'POST' && verifyCsrf($_POST['csrf'] ?? '')) {
  $action = $_POST['action'] ?? 'save';

  if ($action === 'add') {
    $key = validate_key($_POST['key'] ?? '');
    if ($key !== false) {
      if (!isset($overrides[$key])) {
        $overrides[$key] = ['bg'=>'#F7F9FC','border'=>'#D9E1EC','text'=>'#0B1020'];
        write_json($jsonPath, $overrides);
        $flash = "Variante '{$key}' ajoutǸe.";
        redirect($_SERVER['PHP_SELF'].'?ok=1');
      } else {
        $flash = "Cette clǸ existe dǸj��.";
      }
    } else {
      $flash = "ClǸ invalide (3-24 caract��res alphanumǸriques).";
    }
  }
  elseif ($action === 'delete') {
    $key = $_POST['del_key'] ?? ($_POST['key'] ?? '');
    if ($key !== '' && isset($overrides[$key])) {
      unset($overrides[$key]);
      write_json($jsonPath, $overrides);
      $flash = "Variante '{$key}' supprimǸe.";
      redirect($_SERVER['PHP_SELF'].'?ok=1');
    }
  }
  else { // save
    $next = is_array($overrides) ? $overrides : [];
    $rows = $_POST['theme'] ?? [];

    if (is_array($rows)) {
      foreach ($rows as $kExact => $v) {
        $key = trim((string)$kExact);
        if ($key === '' || !preg_match('~^[a-z0-9_-]{3,24}$~i', $key)) continue;

// Lire d'abord le color picker (si prǸsent), sinon le champ texte
$bgHex = normalize_hex_color($_POST['theme_color_bg'][$kExact]     ?? ($v['bg']     ?? ''));
$bdHex = normalize_hex_color($_POST['theme_color_border'][$kExact] ?? ($v['border'] ?? ''));
$txHex = normalize_hex_color($_POST['theme_color_text'][$kExact]   ?? ($v['text']   ?? ''));

        // Fallback aux color pickers si champs texte vides
        if ($bgHex === '' && isset($_POST['theme_color_bg'][$kExact])) {
          $bgHex = normalize_hex_color($_POST['theme_color_bg'][$kExact]);
        }
        if ($bdHex === '' && isset($_POST['theme_color_border'][$kExact])) {
          $bdHex = normalize_hex_color($_POST['theme_color_border'][$kExact]);
        }
        if ($txHex === '' && isset($_POST['theme_color_text'][$kExact])) {
          $txHex = normalize_hex_color($_POST['theme_color_text'][$kExact]);
        }

        $old = $next[$key] ?? ['bg'=>'','border'=>'','text'=>''];
        if ($bgHex !== '') $old['bg'] = $bgHex;
        if ($bdHex !== '') $old['border'] = $bdHex;
        if ($txHex !== '') $old['text'] = $txHex;

        $next[$key] = $old;
      }
    }

    $overrides = $next;
    $ok = write_json($jsonPath, $overrides);
    $flash = $ok !== false ? 'Modifications enregistrǸes.' : "�%chec d'Ǹcriture.";
    redirect($_SERVER['PHP_SELF'].'?ok=1');
  }
}

?><!doctype html>

  <meta charset="utf-8">
  <title>Admin �?" Th��me</title>
  <meta name="viewport" content="width=device-width, initial-scale=1">
  <?php require __DIR__ . '/partials/admin_styles.php'; ?>

Admin �?" Th��me

      �Y?� Front
      �Y"< Annonces
      �Y�� UI

  <?php if (!empty($_GET['ok'])): ?>
    <?= display_flash('Sauvegarde effectuǸe.', 'success') ?>
  <?php endif; ?>

  <?php if ($flash): ?>
    <?= display_flash($flash, strpos($flash, '�%chec') !== false ? 'error' : 'success') ?>
  <?php endif; ?>

Variantes de th��me

    <form method="post" class="annadmin-row">
      <input type="hidden" name="csrf" value="<?= h($CSRF) ?>">
      <input type="hidden" name="action" value="add">
      Nouvelle clǸ
      <input class="annadmin-input annadmin-input-inline u-style-080"
             name="key"
             placeholder="ma_couleur"
             pattern="^[a-zA-Z0-9_-]{3,24}$"
             required
>
      <button class="annadmin-btn annadmin-btn-primary" type="submit">Ajouter</button>
    </form>

�%dition

    <form method="post">
      <input type="hidden" name="csrf" value="<?= h($CSRF) ?>">
      <input type="hidden" name="action" value="save">

              ClǸ
              Fond
              Hex
              Bordure
              Hex
              Texte
              Hex
              Actions

          <?php foreach ($overrides as $k => $vals):
            $bg = $vals['bg'] ?? '#F7F9FC';
            $bd = $vals['border'] ?? '#D9E1EC';
            $tx = $vals['text'] ?? '#0B1020';
          ?>

                <?= h($k) ?>

                <input type="color"
                       name="theme_color_bg[<?= h($k) ?>]"
                       value="<?= h($bg) ?>"
                       class="annadmin-input annadmin-input-inline u-style-083"
>

                <input class="annadmin-input annadmin-input-inline"
                       type="text"
                       name="theme[<?= h($k) ?>][bg]"
                       value="<?= class="u-style-078" h($bg) ?>"
                       placeholder="#RRGGBB"
                       pattern="^(#([0-9A-Fa-f]{3}|[0-9A-Fa-f]{6}))?$"
                       autocomplete="off"
                       spellcheck="false"
>

                <input type="color"
                       name="theme_color_border[<?= h($k) ?>]"
                       value="<?= h($bd) ?>"
                       class="annadmin-input annadmin-input-inline u-style-083"
>

                <input class="annadmin-input annadmin-input-inline"
                       type="text"
                       name="theme[<?= h($k) ?>][border]"
                       value="<?= class="u-style-078" h($bd) ?>"
                       placeholder="#RRGGBB"
                       pattern="^(#([0-9A-Fa-f]{3}|[0-9A-Fa-f]{6}))?$"
                       autocomplete="off"
                       spellcheck="false"
>

                <input type="color"
                       name="theme_color_text[<?= h($k) ?>]"
                       value="<?= h($tx) ?>"
                       class="annadmin-input annadmin-input-inline u-style-083"
>

                <input class="annadmin-input annadmin-input-inline"


Summary: auto


@'
import json
from pathlib import Path
mapping = json.loads(Path('style_map.json').read_text(encoding='utf-8'))
files = sorted({f for meta in mapping.values() for f in meta['files']})
print('\n'.join(files))
'@ | python -


Output:
Exit code: 0
Wall time: 0.9 seconds
Output:
admin\annonces_theme_admin.php
admin\debug_patch.php
admin\hyperadmin.php
admin\hyperadmin_forms.php
admin\index.php
admin\reset_password.php
admin\themes_admin.php
admin\themes_unified_admin.php
admin\ui_admin.php
admin\wiki\index.html


Output:
Exit code: 0
Wall time: 0.7 seconds
Output:


Output:
Exit code: 0
Wall time: 0.8 seconds
Output:

    R�pertoire�: C:\wamp64\www\cssp2AI

Mode                 LastWriteTime         Length Name
----                 -------------         ------ ----
d-----        21/11/2025     15:31                admin
d-----        21/11/2025     14:18                assets
d-----        21/11/2025     15:36                cache
d-----        24/11/2025     10:53                out
d-----        21/11/2025     14:18                outils
-a----        21/11/2025     15:02           9983 AGENTS.md
-a----        24/11/2025     10:52           5122 hyperadmin_integration.php
-a----        24/11/2025     10:50          18088 index.php
-a----        21/11/2025     15:36         529270 ratp_debug.log
-a----        21/11/2025     09:13        2097238 ratp_debug.log.1
-a----        21/11/2025     09:03          10482 ratp_proxy.php
-a----        24/11/2025     11:24          12258 style_map.json


Get-ChildItem -Force | Select-String -Pattern ".git"


Output:
Exit code: 0
Wall time: 1.4 seconds
Output:

AGENTS.md:132:  - Utilise latitude, longitude, et un nom de ville configur�s.


Get-ChildItem -Path C:\wamp64\www -Filter *.zip -Recurse


Output:
Exit code: 0
Wall time: 3.7 seconds
Output:

    R�pertoire�: C:\wamp64\www\astragab\ocr\uploads

Mode                 LastWriteTime         Length Name
----                 -------------         ------ ----
-a----        09/07/2024     13:49         581179 10.zip

    R�pertoire�: C:\wamp64\www\astragab\web\ocr\uploads

Mode                 LastWriteTime         Length Name
----                 -------------         ------ ----
-a----        09/07/2024     11:54         581179 10.zip

    R�pertoire�: C:\wamp64\www\cssp_sauv\-old

Mode                 LastWriteTime         Length Name
----                 -------------         ------ ----
-a----        21/11/2025     08:47         288856 211125.zip

    R�pertoire�: C:\wamp64\www\cssp_sauv\-old\201125

Mode                 LastWriteTime         Length Name
----                 -------------         ------ ----
-a----        20/11/2025     11:45         144328 admin.zip

    R�pertoire�: C:\wamp64\www\cssp_sauv\-old\old1811

Mode                 LastWriteTime         Length Name
----                 -------------         ------ ----
-a----        18/11/2025     12:31         179044 accueil.zip
-a----        18/11/2025     17:45         214489 accueil_fonctionnel.zip

    R�pertoire�: C:\wamp64\www\cssp_sauv\-old\old1811\141125\_old\____Oldv3

Mode                 LastWriteTime         Length Name
----                 -------------         ------ ----
-a----        18/11/2025     12:24        9159004 newOK.zip

    R�pertoire�: C:\wamp64\www\cssp_sauv\-old\old1811\141125\_old\____Oldv3\rest

Mode                 LastWriteTime         Length Name
----                 -------------         ------ ----
-a----        18/11/2025     12:24          23173 annonces_admin_restructured.zip
-a----        18/11/2025     12:24          23574 front-restructure.zip

    R�pertoire�: C:\wamp64\www\cssp_sauv\-old\old1811\141125\_old\____Oldv3\rest\filesadapt

Mode                 LastWriteTime         Length Name
----                 -------------         ------ ----
-a----        18/11/2025     12:24          43298 PACK_THEMES_ADMIN_COMPLET.zip

    R�pertoire�: C:\wamp64\www\cssp_sauv\-old\old1811\141125\_old\____Oldv3\_oldV3

Mode                 LastWriteTime         Length Name
----                 -------------         ------ ----
-a----        18/11/2025     12:24        8997584 zip.zip

    R�pertoire�: C:\wamp64\www\cssp_sauv\-old\old1811\_old\____Oldv3

Mode                 LastWriteTime         Length Name
----                 -------------         ------ ----
-a----        10/11/2025     10:00        9159004 newOK.zip

    R�pertoire�: C:\wamp64\www\cssp_sauv\-old\old1811\_old\____Oldv3\rest

Mode                 LastWriteTime         Length Name
----                 -------------         ------ ----
-a----        06/11/2025     08:49          23173 annonces_admin_restructured.zip
-a----        06/11/2025     13:20          23574 front-restructure.zip

    R�pertoire�: C:\wamp64\www\cssp_sauv\-old\old1811\_old\____Oldv3\rest\filesadapt

Mode                 LastWriteTime         Length Name
----                 -------------         ------ ----
-a----        06/11/2025     14:03          43298 PACK_THEMES_ADMIN_COMPLET.zip

    R�pertoire�: C:\wamp64\www\cssp_sauv\-old\old1811\_old\____Oldv3\_oldV3

Mode                 LastWriteTime         Length Name
----                 -------------         ------ ----
-a----        05/11/2025     09:34        8997584 zip.zip

    R�pertoire�: C:\wamp64\www\cssp_sauv\-old\old1811\__

Mode                 LastWriteTime         Length Name
----                 -------------         ------ ----
-a----        18/11/2025     12:25        9159004 newOK.zip

    R�pertoire�: C:\wamp64\www\cssp_sauv\-old\old1811\____Oldv3

Mode                 LastWriteTime         Length Name
----                 -------------         ------ ----
-a----        18/11/2025     12:25        9159004 newOK.zip

    R�pertoire�: C:\wamp64\www\cssp_sauv\-old\old1811\____Oldv3\rest

Mode                 LastWriteTime         Length Name
----                 -------------         ------ ----
-a----        18/11/2025     12:25          23173 annonces_admin_restructured.zip
-a----        18/11/2025     12:25          23574 front-restructure.zip

    R�pertoire�: C:\wamp64\www\cssp_sauv\-old\old1811\____Oldv3\rest\filesadapt

Mode                 LastWriteTime         Length Name
----                 -------------         ------ ----
-a----        18/11/2025     12:25          43298 PACK_THEMES_ADMIN_COMPLET.zip

    R�pertoire�: C:\wamp64\www\cssp_sauv\-old\old1811\____Oldv3\_oldV3

Mode                 LastWriteTime         Length Name
----                 -------------         ------ ----
-a----        18/11/2025     12:25        8997584 zip.zip

    R�pertoire�: C:\wamp64\www\download_AF\sources

Mode                 LastWriteTime         Length Name
----                 -------------         ------ ----
-a----        10/12/2024     09:03         325497 images_prod.zip

    R�pertoire�: C:\wamp64\www\download_AF_2_fichiers_sans_pays

Mode                 LastWriteTime         Length Name
----                 -------------         ------ ----
-a----        06/12/2024     14:53        1180899 visuels_AF_destinations.zip

    R�pertoire�: C:\wamp64\www\ndd

Mode                 LastWriteTime         Length Name
----                 -------------         ------ ----
-a----        17/06/2025     10:57         599183 WhoIs.zip

    R�pertoire�: C:\wamp64\www\python\unzip\DOE

Mode                 LastWriteTime         Length Name
----                 -------------         ------ ----
-a----        01/04/2025     08:38          85453 _three-dxf-master.zip

    R�pertoire: C:\wamp64\www\python\unzip\doe_unzip\DOE  MTR NOISY LE GRAND COGEDIM 1817_extracted\2. MATERIAUX\2.2
    FICHES MATERIAUX\6-Cuvelage\SPI PENETRAD

Mode                 LastWriteTime         Length Name
----                 -------------         ------ ----
-a----        27/03/2025     14:48        1601133 CCT 10 - SPI PENETRAD.zip
-a----        27/03/2025     14:48         598477 CCT 11 - SPI PENETRAD RESERVOIR.zip

    R�pertoire�: C:\wamp64\www\python\unzip\doe_zip

Mode                 LastWriteTime         Length Name
----                 -------------         ------ ----
-a----        26/03/2025     23:35       25850027 AMP_DOE_NOISY LE GRAND - COGEDIM.zip
-a----        26/03/2025     23:35       73367890 DOE ALMA NCD.zip
-a----        26/03/2025     23:35        5321316 DOE CHAPES NOISY.zip
-a----        26/03/2025     23:35       10979730 DOE ESTPM.zip
-a----        26/03/2025     23:35       20417940 DOE LOGTS SPCR.zip
-a----        26/03/2025     23:35      131205994 DOE MIG NCD.zip
-a----        26/03/2025     23:35      130502899 DOE STTE NCD T.zip
-a----        26/03/2025     23:35       78285426 DOE STTE NCD_LGTS.zip
-a----        26/03/2025     23:35       12324303 DOE Temple SPCR.zip
-a----        26/03/2025     23:35      411261555 DOE_ISF.zip

    R�pertoire�: C:\wamp64\www\wampthemes\modern\fonts

Mode                 LastWriteTime         Length Name
----                 -------------         ------ ----
-a----        26/04/2015     11:30         117272 webfontkit-20150426-043002.zip


Output:
Exit code: 0
Wall time: 0.8 seconds
Output:

    R�pertoire�: C:\wamp64\www\cssp_sauv\-old\201125

Mode                 LastWriteTime         Length Name
----                 -------------         ------ ----
d-----        20/11/2025     09:34                admin
d-----        20/11/2025     09:28                assets
d-----        20/11/2025     09:28                cache
-a----        20/11/2025     11:45         144328 admin.zip
-a----        18/11/2025     09:50           5050 hyperadmin_integration.php
-a----        18/11/2025     09:46          21518 index.php
-a----        20/11/2025     09:24        1437577 ratp_debug.log
-a----        19/11/2025     09:21          10406 ratp_proxy.php


Output:
Exit code: 0
Wall time: 0.8 seconds
Output:
<?php
/**
 * annonces_theme_admin.php - Administration des th��mes
 * Gestion des variantes de couleurs pour les annonces
 */

require_once __DIR__.'/config_annonces.php';
require_once __DIR__.'/auth.php';
require_once __DIR__.'/helpers.php';

// VǸrification de l'authentification
requireAuth('Admin �?" Th��me');

// Paths
$jsonPath = __DIR__.'/data/annonces_theme.json';
@is_dir(dirname($jsonPath)) || @mkdir(dirname($jsonPath), 0775, true);

// Load overrides
$overrides = read_json($jsonPath);

// POST processing
$flash = '';
if (($_SERVER['REQUEST_METHOD'] ?? 'GET') === 'POST' && verifyCsrf($_POST['csrf'] ?? '')) {
  $action = $_POST['action'] ?? 'save';

  if ($action === 'add') {
    $key = validate_key($_POST['key'] ?? '');
    if ($key !== false) {
      if (!isset($overrides[$key])) {
        $overrides[$key] = ['bg'=>'#F7F9FC','border'=>'#D9E1EC','text'=>'#0B1020'];
        write_json($jsonPath, $overrides);
        $flash = "Variante '{$key}' ajoutǸe.";
        redirect($_SERVER['PHP_SELF'].'?ok=1');
      } else {
        $flash = "Cette clǸ existe dǸj��.";
      }
    } else {
      $flash = "ClǸ invalide (3-24 caract��res alphanumǸriques).";
    }
  }
  elseif ($action === 'delete') {
    $key = $_POST['del_key'] ?? ($_POST['key'] ?? '');
    if ($key !== '' && isset($overrides[$key])) {
      unset($overrides[$key]);
      write_json($jsonPath, $overrides);
      $flash = "Variante '{$key}' supprimǸe.";
      redirect($_SERVER['PHP_SELF'].'?ok=1');
    }
  }
  else { // save
    $next = is_array($overrides) ? $overrides : [];
    $rows = $_POST['theme'] ?? [];

    if (is_array($rows)) {
      foreach ($rows as $kExact => $v) {
        $key = trim((string)$kExact);
        if ($key === '' || !preg_match('~^[a-z0-9_-]{3,24}$~i', $key)) continue;

// Lire d'abord le color picker (si prǸsent), sinon le champ texte
$bgHex = normalize_hex_color($_POST['theme_color_bg'][$kExact]     ?? ($v['bg']     ?? ''));
$bdHex = normalize_hex_color($_POST['theme_color_border'][$kExact] ?? ($v['border'] ?? ''));
$txHex = normalize_hex_color($_POST['theme_color_text'][$kExact]   ?? ($v['text']   ?? ''));

        // Fallback aux color pickers si champs texte vides
        if ($bgHex === '' && isset($_POST['theme_color_bg'][$kExact])) {
          $bgHex = normalize_hex_color($_POST['theme_color_bg'][$kExact]);
        }
        if ($bdHex === '' && isset($_POST['theme_color_border'][$kExact])) {
          $bdHex = normalize_hex_color($_POST['theme_color_border'][$kExact]);
        }
        if ($txHex === '' && isset($_POST['theme_color_text'][$kExact])) {
          $txHex = normalize_hex_color($_POST['theme_color_text'][$kExact]);
        }

        $old = $next[$key] ?? ['bg'=>'','border'=>'','text'=>''];
        if ($bgHex !== '') $old['bg'] = $bgHex;
        if ($bdHex !== '') $old['border'] = $bdHex;
        if ($txHex !== '') $old['text'] = $txHex;

        $next[$key] = $old;
      }
    }

    $overrides = $next;
    $ok = write_json($jsonPath, $overrides);
    $flash = $ok !== false ? 'Modifications enregistrǸes.' : "�%chec d'Ǹcriture.";
    redirect($_SERVER['PHP_SELF'].'?ok=1');
  }
}

?><!doctype html>

  <meta charset="utf-8">
  <title>Admin �?" Th��me</title>
  <meta name="viewport" content="width=device-width, initial-scale=1">
  <link rel="stylesheet" href="assets/css/admin.css">

Admin �?" Th��me

      �Y?� Front
      �Y"< Annonces
      �Y�� UI

  <?php if (!empty($_GET['ok'])): ?>
    <?= display_flash('Sauvegarde effectuǸe.', 'success') ?>
  <?php endif; ?>

  <?php if ($flash): ?>
    <?= display_flash($flash, strpos($flash, '�%chec') !== false ? 'error' : 'success') ?>
  <?php endif; ?>

Variantes de th��me

    <form method="post" class="annadmin-row">
      <input type="hidden" name="csrf" value="<?= h($CSRF) ?>">
      <input type="hidden" name="action" value="add">
      Nouvelle clǸ
      <input class="annadmin-input annadmin-input-inline"
             name="key"
             placeholder="ma_couleur"
             pattern="^[a-zA-Z0-9_-]{3,24}$"
             required
             style="width: 200px">
      <button class="annadmin-btn annadmin-btn-primary" type="submit">Ajouter</button>
    </form>

�%dition

    <form method="post">
      <input type="hidden" name="csrf" value="<?= h($CSRF) ?>">
      <input type="hidden" name="action" value="save">

              ClǸ
              Fond
              Hex
              Bordure
              Hex
              Texte
              Hex
              Actions

          <?php foreach ($overrides as $k => $vals):
            $bg = $vals['bg'] ?? '#F7F9FC';
            $bd = $vals['border'] ?? '#D9E1EC';
            $tx = $vals['text'] ?? '#0B1020';
          ?>

                <?= h($k) ?>

                <input type="color"
                       name="theme_color_bg[<?= h($k) ?>]"
                       value="<?= h($bg) ?>"
                       class="annadmin-input annadmin-input-inline"
                       style="width: 50px; height: 36px; padding: 2px;">

                <input class="annadmin-input annadmin-input-inline"
                       type="text"
                       name="theme[<?= h($k) ?>][bg]"
                       value="<?= h($bg) ?>"
                       placeholder="#RRGGBB"
                       pattern="^(#([0-9A-Fa-f]{3}|[0-9A-Fa-f]{6}))?$"
                       autocomplete="off"
                       spellcheck="false"
                       style="width: 100px">

                <input type="color"
                       name="theme_color_border[<?= h($k) ?>]"
                       value="<?= h($bd) ?>"
                       class="annadmin-input annadmin-input-inline"
                       style="width: 50px; height: 36px; padding: 2px;">

                <input class="annadmin-input annadmin-input-inline"
                       type="text"
                       name="theme[<?= h($k) ?>][border]"
                       value="<?= h($bd) ?>"
                       placeholder="#RRGGBB"
                       pattern="^(#([0-9A-Fa-f]{3}|[0-9A-Fa-f]{6}))?$"
                       autocomplete="off"
                       spellcheck="false"
                       style="width: 100px">

                <input type="color"
                       name="theme_color_text[<?= h($k) ?>]"
                       value="<?= h($tx) ?>"
                       class="annadmin-input annadmin-input-inline"
                       style="width: 50px; height: 36px; padding: 2px;">

                <input class="annadmin-input annadmin-input-inline"
                       type="text"
                       name="theme[<?= h($k) ?>][text]"
                       value="<?= h($tx) ?>"
                       placeholder="#RRGGBB"
                       pattern="^(#([0-9A-Fa-f]{3}|[0-9A-Fa-f]{6}))?$"
                       autocomplete="off"
                       spellcheck="false"
                       style="width: 100px">

                <input type="hidden" name="del_key" value="<?= h($k) ?>">
                <button class="annadmin-btn annadmin-btn-small annadmin-btn-danger"
                        type="submit"
                        name="action"
                        value="delete"
                        formaction="annonces_theme_admin.php"
                        formmethod="post"
                        formnovalidate
                        onclick="return confirm('Supprimer la variante <?= h($k) ?> ?')">
                  Supprimer
                </button>

          <?php endforeach; ?>

        <button class="annadmin-btn annadmin-btn-primary" type="submit" name="action" value="save">
          �Y'� Enregistrer
        </button>
        ��? Retour annonces

    </form>


Copy-Item C:\wamp64\www\cssp_sauv\-old\201125\admin\annonces_theme_admin.php admin\annonces_theme_admin.php -Force


Output:
Exit code: 0
Wall time: 0.8 seconds
Output:


Copy-Item C:\wamp64\www\cssp_sauv\-old\201125\admin\debug_patch.php admin\debug_patch.php -Force


Output:
Exit code: 0
Wall time: 0.8 seconds
Output:


Copy-Item C:\wamp64\www\cssp_sauv\-old\201125\admin\hyperadmin.php admin\hyperadmin.php -Force


Output:
Exit code: 0
Wall time: 0.8 seconds
Output:


Copy-Item C:\wamp64\www\cssp_sauv\-old\201125\admin\hyperadmin_forms.php admin\hyperadmin_forms.php -Force


Output:
Exit code: 0
Wall time: 0.8 seconds
Output:


Copy-Item C:\wamp64\www\cssp_sauv\-old\201125\admin\index.php admin\index.php -Force


Output:
Exit code: 0
Wall time: 0.8 seconds
Output:


Copy-Item C:\wamp64\www\cssp_sauv\-old\201125\admin\reset_password.php admin\reset_password.php -Force


Output:
Exit code: 0
Wall time: 0.7 seconds
Output:


Copy-Item C:\wamp64\www\cssp_sauv\-old\201125\admin\themes_admin.php admin\themes_admin.php -Force


Output:
Exit code: 0
Wall time: 0.8 seconds
Output:


Copy-Item C:\wamp64\www\cssp_sauv\-old\201125\admin\themes_unified_admin.php admin\themes_unified_admin.php -Force


Output:
Exit code: 0
Wall time: 0.8 seconds
Output:


Copy-Item C:\wamp64\www\cssp_sauv\-old\201125\admin\ui_admin.php admin\ui_admin.php -Force


Output:
Exit code: 0
Wall time: 0.8 seconds
Output:


Copy-Item C:\wamp64\www\cssp_sauv\-old\201125\admin\wiki\index.html admin\wiki\index.html -Force


Output:
Exit code: 1
Wall time: 0.9 seconds
Output:
Copy-Item : Impossible de trouver le chemin d'acc�s �C:\wamp64\www\cssp_sauv\-old\201125\admin\wiki\index.html�, car
il n'existe pas.
Au caract�re Ligne:1 : 1
+ Copy-Item C:\wamp64\www\cssp_sauv\-old\201125\admin\wiki\index.html a ...
+ ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
    + CategoryInfo          : ObjectNotFound: (C:\wamp64\www\c...wiki\index.html:String) [Copy-Item], ItemNotFoundExce
   ption
    + FullyQualifiedErrorId : PathNotFound,Microsoft.PowerShell.Commands.CopyItemCommand


Output:
Exit code: 0
Wall time: 0.8 seconds
Output:

    R�pertoire�: C:\wamp64\www\cssp_sauv\-old\201125\admin

Mode                 LastWriteTime         Length Name
----                 -------------         ------ ----
d-----        20/11/2025     09:28                assets
d-----        20/11/2025     09:28                data
d-----        20/11/2025     09:28                logs
-a----        18/11/2025     09:46           1609 annonces_theme.php
-a----        18/11/2025     09:46           9603 annonces_theme_admin.php
-a----        18/11/2025     09:46          17065 annonces_widget.php
-a----        19/11/2025     16:02          11600 auth.php
-a----        18/11/2025     16:24           1787 cleanupjson.php
-a----        18/11/2025     09:46            968 config_annonces.php
-a----        18/11/2025     09:54           1105 data_status.php
-a----        18/11/2025     14:34           1990 debug_patch.php
-a----        18/11/2025     16:24           1760 debug_traffic_alerts.php
-a----        19/11/2025     17:19           2978 header.php
-a----        18/11/2025     09:46           7896 helpers.php
-a----        19/11/2025     17:48          49350 hyperadmin.php
-a----        19/11/2025     14:08          18588 hyperadmin_config.php
-a----        19/11/2025     14:15          63240 hyperadmin_forms.php
-a----        18/11/2025     09:46          47682 index.php
-a----        19/11/2025     16:38            199 logout.php
-a----        19/11/2025     16:27          10737 reset_password.php
-a----        19/11/2025     14:33             19 reset_tokens.json
-a----        19/11/2025     16:08           5728 reset_tokens_manager.php
-a----        18/11/2025     14:34           2926 test_logique.php
-a----        18/11/2025     09:46          15844 themes_admin.php
-a----        18/11/2025     09:46           8318 themes_config.php
-a----        18/11/2025     09:46         121441 themes_config_unified.php
-a----        18/11/2025     09:46          24170 themes_unified_admin.php
-a----        18/11/2025     09:46          27480 ui_admin.php
-a----        19/11/2025     10:34          10416 users_manager.php


@'
from pathlib import Path
import re, json
root = Path.cwd()
styles = {}
for path in Path('admin').rglob('*'):
    if path.is_file() and path.suffix.lower() in {'.php','.html','.htm'}:
        text = path.read_text(encoding='utf-8', errors='replace')
        for match in re.finditer(r'style="([^"]*)"', text):
            style = match.group(1)
            if any(token in style for token in ('<?', '<?=', '$')):
                continue
            styles.setdefault(style, set()).add(str(path).replace(str(root)+'\\',''))
style_items = sorted(styles.items())
map_data = {}
for idx, (style, files) in enumerate(style_items, 1):
    token = f'style-{idx:03d}'
    map_data[style] = {'token': token, 'files': sorted(files)}
Path('inline_style_map.json').write_text(json.dumps(map_data, indent=2, ensure_ascii=False), encoding='utf-8')
print('found', len(map_data), 'static style strings')
'@ | python -


Output:
Exit code: 0
Wall time: 1 seconds
Output:
found 79 static style strings


@'
from pathlib import Path
import json
mapping = json.loads(Path('inline_style_map.json').read_text(encoding='utf-8'))
files_map = {}
for style, meta in mapping.items():
    token = meta['token']
    for rel in meta['files']:
        files_map.setdefault(rel, []).append((style, token))
for rel, entries in files_map.items():
    path = Path(rel)
    text = path.read_text(encoding='utf-8')
    for style, token in entries:
        style_seq = f'style="{style}"'
        replacement = f'data-style="{token}"'
        text = text.replace(style_seq, replacement)
    path.write_text(text, encoding='utf-8')
print('Replaced style attributes with data-style in', len(files_map), 'files')
'@


Output:
Exit code: 0
Wall time: 0.7 seconds
Output:
from pathlib import Path
import json
mapping = json.loads(Path('inline_style_map.json').read_text(encoding='utf-8'))
files_map = {}
for style, meta in mapping.items():
    token = meta['token']
    for rel in meta['files']:
        files_map.setdefault(rel, []).append((style, token))
for rel, entries in files_map.items():
    path = Path(rel)
    text = path.read_text(encoding='utf-8')
    for style, token in entries:
        style_seq = f'style="{style}"'
        replacement = f'data-style="{token}"'
        text = text.replace(style_seq, replacement)
    path.write_text(text, encoding='utf-8')
print('Replaced style attributes with data-style in', len(files_map), 'files')


@'
from pathlib import Path
import json
mapping = json.loads(Path('inline_style_map.json').read_text(encoding='utf-8'))
files_map = {}
for style, meta in mapping.items():
    token = meta['token']
    for rel in meta['files']:
        files_map.setdefault(rel, []).append((style, token))
for rel, entries in files_map.items():
    path = Path(rel)
    text = path.read_text(encoding='utf-8')
    for style, token in entries:
        style_seq = f'style="{style}"'
        replacement = f'data-style="{token}"'
        text = text.replace(style_seq, replacement)
    path.write_text(text, encoding='utf-8')
print('Replaced style attributes with data-style in', len(files_map), 'files')
'@ | python -


Output:
Exit code: 0
Wall time: 1.1 seconds
Output:
Replaced style attributes with data-style in 9 files


Summary: auto


@'
import json
from pathlib import Path
mapping = json.loads(Path('inline_style_map.json').read_text(encoding='utf-8'))
files = sorted({f for meta in mapping.values() for f in meta['files']})
print('\n'.join(files))
'@ | python -


Output:
Exit code: 0
Wall time: 0.9 seconds
Output:
admin\annonces_theme_admin.php
admin\debug_patch.php
admin\hyperadmin.php
admin\hyperadmin_forms.php
admin\index.php
admin\reset_password.php
admin\themes_admin.php
admin\themes_unified_admin.php
admin\ui_admin.php


Output:
Exit code: 1
Wall time: 0.9 seconds
Output:


rg -n 'color:\$1' admin\annonces_widget.php


Output:
Exit code: 0
Wall time: 0.8 seconds
Output:
114:    '$2',


Output:
Exit code: 1
Wall time: 0.8 seconds
Output:
Le terminateur " est manquant dans la cha�ne.
    + CategoryInfo          : ParserError: (:) [], ParentContainsErrorRecordException
    + FullyQualifiedErrorId : TerminatorExpectedAtEndOfString


Output:
Exit code: 1
Wall time: 0.9 seconds
Output:


Output:
Exit code: 1
Wall time: 1.1 seconds
Output:


Output:
Exit code: 1
Wall time: 0.9 seconds
Output:


Output:
Exit code: 1
Wall time: 0.9 seconds
Output:


Output:
Exit code: 1
Wall time: 0.9 seconds
Output:


Output:
Exit code: 0
Wall time: 0.9 seconds
Output:
style="


Output:
Exit code: 1
Wall time: 0.9 seconds
Output:


Output:
Exit code: 1
Wall time: 0.9 seconds
Output:


Output:
Exit code: 0
Wall time: 0.9 seconds
Output:
admin\annonces_theme_admin.php:135:             data-style="style-076">
admin\annonces_theme_admin.php:177:                       data-style="style-079">
admin\annonces_theme_admin.php:188:                       data-style="style-074">
admin\annonces_theme_admin.php:197:                       data-style="style-079">
admin\annonces_theme_admin.php:208:                       data-style="style-074">
admin\annonces_theme_admin.php:217:                       data-style="style-079">
admin\annonces_theme_admin.php:228:                       data-style="style-074">
admin\annonces_widget.php:114:    '$2',
admin\annonces_widget.php:115:    '$2',
admin\annonces_widget.php:352:  echo '<div class="ann-grid '.h($layoutClass).'" style="--ann-gap: '.$gapPx.'px;" '.
admin\debug_patch.php:10:    echo '
';
admin\debug_traffic_alerts.php:45:    echo "
✅ Trouvé dans : $color
";
admin\debug_traffic_alerts.php:47:    echo "
❌ 'interrompu' n'existe PAS dans severity_levels
";
admin\hyperadmin.php:1221:                <form method="post" data-style="style-038">
admin\hyperadmin.php:1229:                <form method="post" data-style="style-038">
admin\hyperadmin_forms.php:149:

admin\hyperadmin_forms.php:206:                    <div class="form-group" id="reactivate_alerts_group" style="margin-left: 30px; <?= $showReactivateOption ? '' : 'display: none;' ?>">
admin\hyperadmin_forms.php:253:

admin\hyperadmin_forms.php:370:

admin\hyperadmin_forms.php:375:

admin\hyperadmin_forms.php:378:
admin\hyperadmin_forms.php:382:                                  data-style="style-047">
admin\hyperadmin_forms.php:397:
admin\hyperadmin_forms.php:401:                                  data-style="style-048">
admin\hyperadmin_forms.php:415:
admin\hyperadmin_forms.php:419:                                  data-style="style-046">
admin\hyperadmin_forms.php:433:
admin\hyperadmin_forms.php:437:                                  data-style="style-045">
admin\hyperadmin_forms.php:776:

admin\hyperadmin_forms.php:991:

admin\hyperadmin_forms.php:1037:                                                Jamais
admin\hyperadmin_forms.php:1188:

admin\hyperadmin_forms.php:1192:

admin\hyperadmin_forms.php:1211:

admin\index.php:580:        <form method="post" action="<?= $_SERVER['PHP_SELF'] ?>" id="template-form" data-style="style-057">
admin\index.php:607:                    📌
admin\index.php:608:                    👁
admin\index.php:609:                    📅
admin\index.php:612:                    Couleur
admin\index.php:613:                    Actions
admin\index.php:623:                            <form class="inline-toggle" data-style="style-040">
admin\index.php:638:                            <form class="inline-toggle" data-style="style-040">
admin\index.php:653:                            <form class="inline-toggle" data-style="style-040">
admin\index.php:678:                                  data-style="style-036">
admin\index.php:684:

admin\index.php:687:                                    <form method="post" data-style="style-040">
admin\index.php:695:                                <form method="post" data-style="style-040">
admin\index.php:709:
admin\index.php:721:

admin\index.php:801:                  data-style="style-037">
admin\index.php:809:                <form method="post" data-style="style-040">
admin\index.php:817:            <form method="post" data-style="style-040">
admin\index.php:858:

admin\index.php:866:
admin\index.php:876:                     style="background: <?= h($colors['bg']) ?>;
admin\index.php:886:
admin\index.php:888:    <label class="toggle <?= !empty($edit['show_date']) ? 'on' : '' ?>" data-style="style-056">
admin\index.php:895:
admin\index.php:897:            <label class="toggle <?= !empty($edit['pinned']) ? 'on' : '' ?>" data-style="style-056">
admin\index.php:904:
admin\index.php:906:            <label class="toggle <?= !empty($edit['active']) || !$edit ? 'on' : '' ?>" data-style="style-056">
admin\index.php:918:

admin\index.php:923:                <button data-color="#000000" data-style="style-001"></button>
admin\index.php:924:                <button data-color="#e60000" data-style="style-006"></button>
admin\index.php:925:                <button data-color="#008a00" data-style="style-003"></button>
admin\index.php:926:                <button data-color="#0066cc" data-style="style-002"></button>
admin\index.php:927:                <button data-color="#9933cc" data-style="style-005"></button>
admin\index.php:928:                <button data-color="#f39c12" data-style="style-008"></button>
admin\index.php:929:                <button data-color="#e74c3c" data-style="style-007"></button>
admin\index.php:930:                <button data-color="#3498db" data-style="style-004"></button>
admin\reset_password.php:174:

admin\reset_password.php:211:

admin\reset_password.php:251:

admin\reset_password.php:267:

admin\reset_password.php:272:                    <a href="<?= htmlspecialchars($loginUrl) ?>" class="annadmin-btn annadmin-btn-primary annadmin-btn-full" data-style="style-028">
admin\test_logique.php:50:    echo "
";
admin\test_logique.php:87:        echo "
✅ TEST RÉUSSI
";
admin\test_logique.php:89:        echo "
❌ TEST ÉCHOUÉ
";
admin\themes_admin.php:286:                        <div class="theme-preview" style="background: <?= $theme['colors']['--bg'] ?>">
admin\themes_admin.php:288:                                <div class="preview-panel" style="
admin\themes_admin.php:292:                                    <div class="preview-text long" style="background: <?= $theme['colors']['--text'] ?>">

admin\themes_admin.php:293:                                    <div class="preview-text medium" style="background: <?= $theme['colors']['--muted'] ?>; opacity: 0.5">

admin\themes_admin.php:294:                                    <div class="preview-text short" style="background: <?= $theme['colors']['--muted'] ?>; opacity: 0.3">

admin\themes_admin.php:295:                                    <div class="preview-button" style="background: <?= $theme['colors']['--accent'] ?>">

admin\themes_admin.php:297:                                <div class="preview-panel" style="
admin\themes_admin.php:301:                                    <div class="preview-text medium" style="background: <?= $theme['colors']['--text'] ?>">

admin\themes_admin.php:302:                                    <div class="preview-text long" style="background: <?= $theme['colors']['--muted'] ?>; opacity: 0.5">

admin\themes_admin.php:303:

admin\themes_admin.php:304:                                        <div style="flex: 1; height: 16px; background: <?= $theme['colors']['--warning'] ?>; border-radius: 3px;">

admin\themes_admin.php:305:                                        <div style="flex: 1; height: 16px; background: <?= $theme['colors']['--danger'] ?>; border-radius: 3px;">

admin\themes_admin.php:316:                                <div class="color-dot" style="background: <?= $theme['colors']['--bg'] ?>" data-color="Fond">

admin\themes_admin.php:317:                                <div class="color-dot" style="background: <?= $theme['colors']['--panel'] ?>" data-color="Panneau">

admin\themes_admin.php:318:                                <div class="color-dot" style="background: <?= $theme['colors']['--text'] ?>" data-color="Texte">

admin\themes_admin.php:319:                                <div class="color-dot" style="background: <?= $theme['colors']['--accent'] ?>" data-color="Accent">

admin\themes_admin.php:320:                                <div class="color-dot" style="background: <?= $theme['colors']['--warning'] ?>" data-color="Alerte">

admin\themes_admin.php:321:                                <div class="color-dot" style="background: <?= $theme['colors']['--danger'] ?>" data-color="Danger">

admin\themes_admin.php:326:                                    <button type="button" class="annadmin-btn annadmin-btn-primary" disabled data-style="style-042">
admin\themes_admin.php:332:                                            data-style="style-042">
admin\themes_unified_admin.php:153:                            <div class="theme-preview" style="
admin\themes_unified_admin.php:160:

admin\themes_unified_admin.php:161:                                    <div style="
admin\themes_unified_admin.php:166:
admin\themes_unified_admin.php:221:                        <div class="color-preview" style="
admin\themes_unified_admin.php:242:                            <form method="POST" data-style="style-063">
admin\themes_unified_admin.php:258:
Ajouter une couleur personnalisée

admin\themes_unified_admin.php:338:

admin\ui_admin.php:213:

admin\ui_admin.php:215:

admin\ui_admin.php:228:

admin\ui_admin.php:252:

admin\ui_admin.php:266:                 class="annadmin-input" data-style="style-068">
admin\ui_admin.php:267:

admin\ui_admin.php:276:

admin\ui_admin.php:283:                 class="annadmin-input" data-style="style-068">
admin\ui_admin.php:284:

admin\ui_admin.php:293:                 class="annadmin-input" data-style="style-068">
admin\ui_admin.php:294:

admin\ui_admin.php:303:                 class="annadmin-input" data-style="style-068">
admin\ui_admin.php:304:

admin\ui_admin.php:314:

admin\ui_admin.php:332:

admin\ui_admin.php:353:

admin\ui_admin.php:363:

admin\ui_admin.php:372:

admin\ui_admin.php:374:

admin\ui_admin.php:379:

admin\ui_admin.php:385:

admin\ui_admin.php:386:

admin\ui_admin.php:387:            📋 Annonces actives disponibles (cliquez pour ajouter)
admin\ui_admin.php:389:

admin\ui_admin.php:396:                 data-style="style-029">
admin\ui_admin.php:397:
admin\ui_admin.php:400:
admin\ui_admin.php:403:
admin\ui_admin.php:406:              ➕
admin\ui_admin.php:413:

admin\ui_admin.php:418:

admin\ui_admin.php:430:

admin\ui_admin.php:442:

admin\ui_admin.php:443:
📁 Informations techniques

admin\ui_admin.php:444:

admin\ui_admin.php:446:
admin\ui_admin.php:504:
admin\ui_admin.php:507:
admin\ui_admin.php:510:          ×


@'
from pathlib import Path
import json
mapping = json.loads(Path('inline_style_map.json').read_text(encoding='utf-8'))
lines = ["/* Fichier généré automatiquement : styles extraits de l'admin */",":root { /* placeholder to ensure file not empty */ }",""]
css_blocks = []
for style, meta in mapping.items():
    token = meta['token']
    decl = style.strip()
    if not decl.endswith(';'):
        decl = decl + ';'
    css_blocks.append(f'[data-style="{token}"] {{ {decl} }}')
content = "\n".join(["/* Fichier généré automatiquement : ne pas éditer manuellement */", ""] + css_blocks) + "\n"
out_path = Path('admin/assets/css/generated')
out_path.mkdir(parents=True, exist_ok=True)
css_file = out_path / 'admin_inline_styles.css'
css_file.write_text(content, encoding='utf-8')
print('Wrote', css_file)
'@ | python -


Output:
Exit code: 0
Wall time: 1 seconds
Output:
Wrote admin\assets\css\generated\admin_inline_styles.css


Input:
*** Begin Patch
*** Update File: admin/partials/admin_styles.php
@@
-$adminCssFiles = [
-    'assets/css/parts/foundation.css',
-    'assets/css/parts/responsive-base.css',
-    'assets/css/parts/preview.css',
-    'assets/css/parts/header.css',
-];
+$adminCssFiles = [
+    'assets/css/parts/foundation.css',
+    'assets/css/parts/responsive-base.css',
+    'assets/css/parts/preview.css',
+    'assets/css/parts/header.css',
+    'assets/css/generated/admin_inline_styles.css',
+];
*** End Patch


Output: {"output":"Success. Updated the following files:\nM admin/partials/admin_styles.php\n","metadata":{"exit_code":0,"duration_seconds":0.3}}