<!DOCTYPE html>
<html>
    
    <head>
<script  id="debugbar_loader" data-time="1781310885.844998" src="https://zealot.fr/?debugbar"></script><script  id="debugbar_dynamic_script"></script><style  id="debugbar_dynamic_style"></style><script class="kint-rich-script">"use strict";(()=>{function m(n){if(!(n instanceof Element))throw new Error("Invalid argument to dedupeElement()");let t=n.ownerDocument,e=E(n);for(let s of t.querySelectorAll(e))n!==s&&s.parentNode.removeChild(s)}function d(n){return n instanceof Element?n.ownerDocument.contains(n):!1}function E(n){if(!(n instanceof Element))throw new Error("Invalid argument to buildClassSelector()");return[n.nodeName,...n.classList].join(".")}function f(n){if(!(n instanceof Element))throw new Error("Invalid argument to selectText()");let t=n.ownerDocument,e=t.getSelection(),s=t.createRange();s.selectNodeContents(n),e.removeAllRanges(),e.addRange(s)}function I(n,t){let e;return function(...s){clearTimeout(e),e=setTimeout(function(){n(...s)},t)}}function x(n){if(!(n instanceof Element))throw new Error("Invalid argument to offsetTop()");return n.offsetTop+(n.offsetParent?x(n.offsetParent):0)}var u=class n{static#e=new Set;static toggleSearchBox(t,e){let s=t.querySelector(".kint-search"),i=t.parentNode;if(s)if(s.classList.toggle("kint-show",e)){if(s.focus(),s.select(),!n.#e.has(s)){let r=i.querySelectorAll("dl").length,o=200;r>1e4&&(o=700),s.addEventListener("keyup",I(n.#t.bind(null,s),o)),n.#e.add(s)}n.#t(s)}else i.classList.remove("kint-search-root")}static#t(t){let e=t.closest(".kint-parent")?.parentNode;if(e)if(t.classList.contains("kint-show")&&t.value.length){let s=e.dataset.lastSearch;if(e.classList.add("kint-search-root"),s!==t.value){e.dataset.lastSearch=t.value,e.classList.remove("kint-search-match");for(let i of e.querySelectorAll(".kint-search-match"))i.classList.remove("kint-search-match");n.#s(e,t.value.toUpperCase())}}else e.classList.remove("kint-search-root")}static#s(t,e){let s=t.cloneNode(!0);for(let c of s.querySelectorAll(".access-path"))c.remove();if(!s.textContent.toUpperCase().includes(e))return;t.classList.add("kint-search-match");let i=t.firstElementChild;for(;i&&i.tagName!=="DT";)i=i.nextElementSibling;if(!i)return;let r=a.getChildContainer(i);if(!r)return;let o,l;for(let c of r.children)c.tagName==="DL"?n.#s(c,e):c.tagName==="UL"&&(c.classList.contains("kint-tabs")?o=c.children:c.classList.contains("kint-tab-contents")&&(l=c.children));if(!(!o||o.length!==l?.length))for(let c=o.length;c--;){let k=!1,F=!1;o[c].textContent.toUpperCase().includes(e)&&(k=!0);let O=l[c].cloneNode(!0);for(let v of O.querySelectorAll(".access-path"))v.remove();if(O.textContent.toUpperCase().includes(e)&&(k=!0,F=!0),k&&o[c].classList.add("kint-search-match"),F)for(let v of l[c].children)v.tagName==="DL"&&n.#s(v,e)}}};var g=class{static sort(t,e){let s=t.dataset.kintTableSort,i=parseInt(s)===e?-1:1,r=t.tBodies[0];[...r.rows].sort(function(o,l){o=o.cells[e].textContent.trim().toLocaleLowerCase(),l=l.cells[e].textContent.trim().toLocaleLowerCase();let c=0;return!isNaN(o)&&!isNaN(l)?(o=parseFloat(o),l=parseFloat(l),c=o-l):isNaN(o)&&!isNaN(l)?c=1:isNaN(l)&&!isNaN(o)?c=-1:c=(""+o).localeCompare(""+l),c*i}).forEach(o=>r.appendChild(o)),i<0?t.dataset.kintTableSort=null:t.dataset.kintTableSort=e}};var a=class n{#e;#t;#s;constructor(t){if(!(t instanceof h))throw new Error("Invalid argument to Rich.constructor()");this.#e=t,this.#e.runOnInit(this.#i.bind(this));let e=new q(this,t);new b(this,t.window,e)}#i(){let t=this.#e.window.document;if(d(this.#t)||(this.#t=t.querySelector("style.kint-rich-style")),this.#t&&m(this.#t),t.querySelector(".kint-rich.kint-file")){this.setupFolder(t);let e=this.#s.querySelector("dd.kint-foldout"),s=Array.from(t.querySelectorAll(".kint-rich.kint-file"));for(let i of s)i.parentNode!==e&&e.appendChild(i);this.#s.classList.add("kint-show")}}addToFolder(t){let e=t.closest(".kint-rich");if(!e)throw new Error("Bad addToFolder");let s=this.#e.window.document;if(this.setupFolder(s),this.folder.contains(t))throw new Error("Bad addToFolder");let i=this.#s.querySelector("dd.kint-foldout"),r=t.closest(".kint-parent, .kint-rich"),o=Array.from(e.querySelectorAll(".kint-folder-trigger"));if(e===r||e.querySelectorAll(".kint-rich > dl").length===1){for(let l of o)l.remove();e.classList.add("kint-file"),i.insertBefore(e,i.firstChild)}else{let l=s.createElement("div");l.classList.add("kint-rich"),l.classList.add("kint-file"),l.appendChild(r.closest(".kint-rich > dl"));let c=e.lastElementChild;c.matches(".kint-rich > footer")&&l.appendChild(c.cloneNode(!0));for(let k of o)k.remove();i.insertBefore(l,i.firstChild)}n.toggle(this.#s.querySelector(".kint-parent"),!0)}setupFolder(t){if(this.#s)d(this.#s)||(this.#s=t.querySelector(".kint-rich.kint-folder"));else{let e=t.createElement("template");e.innerHTML='<div class="kint-rich kint-folder"><dl><dt class="kint-parent"><nav></nav>Kint</dt><dd class="kint-foldout"></dd></dl></div>',this.#s=e.content.firstChild,t.body.appendChild(this.#s)}}get folder(){return d(this.#s)||(this.#s=this.#e.window.document.querySelector(".kint-rich.kint-folder")),this.#s&&m(this.#s),this.#s}isFolderOpen(){let t=this.#s?.querySelector("dd.kint-foldout");if(t)return t.previousSibling.classList.contains("kint-show")}static getChildContainer(t){let e=t.nextElementSibling;for(;e&&!e.matches("dd");)e=e.nextElementSibling;return e}static toggle(t,e){let s=n.getChildContainer(t);s&&(e=t.classList.toggle("kint-show",e),n.#n(s,e))}static switchTab(t){t.parentNode.getElementsByClassName("kint-active-tab")[0].classList.remove("kint-active-tab"),t.classList.add("kint-active-tab");let e=t,s=0;for(;e=e.previousElementSibling;)s++;let i=t.parentNode.nextSibling.children;for(let r=i.length;r--;)r===s?(i[r].classList.add("kint-show"),n.#n(i[r],!0)):i[r].classList.remove("kint-show")}static toggleChildren(t,e){let s=n.getChildContainer(t);if(!s)return;e===void 0&&(e=t.classList.contains("kint-show"));let i=Array.from(s.getElementsByClassName("kint-parent"));for(let r of i)r.classList.toggle("kint-show",e)}static toggleAccessPath(t,e){let s=t.querySelector(".access-path");s?.classList.toggle("kint-show",e)&&f(s)}static#n(t,e){if(t.children.length===2&&t.lastElementChild.matches("ul.kint-tab-contents"))for(let s of t.lastElementChild.children)s.matches("li.kint-show")&&(t=s);if(t.children.length===1&&t.firstElementChild.matches("dl")){let s=t.firstElementChild.firstElementChild;s?.classList?.contains("kint-parent")&&n.toggle(s,e)}}},b=class{#e;#t;#s;#i=null;#n=null;#o=0;constructor(t,e,s){this.#e=t,this.#t=s,this.#s=e,this.#s.addEventListener("click",this.#a.bind(this),!0)}#r(){clearTimeout(this.#i),this.#i=setTimeout(this.#l.bind(this),250)}#l(){clearTimeout(this.#i),this.#i=null,this.#n=null,this.#o=0}#c(){let t=this.#n;if(!t.matches(".kint-parent > nav"))return;let e=t.parentNode;if(this.#o===1)a.toggleChildren(e),this.#t.onTreeChanged(),this.#r(),this.#o=2;else if(this.#o===2){this.#l();let s=e.classList.contains("kint-show"),i=this.#e.folder?.querySelector(".kint-parent"),r=Array.from(this.#s.document.getElementsByClassName("kint-parent"));for(let o of r)o!==i&&o.classList.toggle("kint-show",s);this.#t.onTreeChanged(),this.#t.scrollToFocus()}}#a(t){if(this.#o){this.#c();return}let e=t.target;if(!e.closest(".kint-rich"))return;if(e.tagName==="DFN"&&f(e),e.tagName==="TH"){t.ctrlKey||g.sort(e.closest("table"),e.cellIndex);return}if(e.tagName==="LI"&&e.parentNode.className==="kint-tabs"){if(e.className!=="kint-active-tab"){let i=e.closest("dl")?.querySelector(".kint-parent > nav")??e;a.switchTab(e),this.#t.onTreeChanged(),this.#t.setCursor(i)}return}let s=e.closest("dt");if(e.tagName==="NAV")e.parentNode.tagName==="FOOTER"?(this.#t.setCursor(e),e.parentNode.classList.toggle("kint-show")):s?.classList.contains("kint-parent")&&(a.toggle(s),this.#t.onTreeChanged(),this.#t.setCursor(e),this.#r(),this.#o=1,this.#n=e);else if(e.classList.contains("kint-access-path-trigger"))s&&a.toggleAccessPath(s);else if(e.classList.contains("kint-search-trigger"))s?.matches(".kint-rich > dl > dt.kint-parent")&&u.toggleSearchBox(s);else if(e.classList.contains("kint-folder-trigger")){if(s?.matches(".kint-rich > dl > dt.kint-parent"))this.#e.addToFolder(e),this.#t.onTreeChanged(),this.#t.setCursor(s.querySelector("nav")),this.#t.scrollToFocus();else if(e.parentNode.tagName==="FOOTER"){let i=e.closest(".kint-rich").querySelector(".kint-parent > nav, .kint-rich > footer > nav");this.#e.addToFolder(e),this.#t.onTreeChanged(),this.#t.setCursor(i),this.#t.scrollToFocus()}}else e.classList.contains("kint-search")||(e.tagName==="PRE"&&t.detail===3?f(e):e.closest(".kint-source")&&t.detail===3?f(e.closest(".kint-source")):e.classList.contains("access-path")?f(e):e.tagName!=="A"&&s?.classList.contains("kint-parent")&&(a.toggle(s),this.#t.onTreeChanged(),this.#t.setCursor(s.querySelector("nav"))))}},j=65,G=68,A=70,S=72,K=74,D=75,p=76,V=83,P=9,T=13,B=27,L=32,N=37,R=38,C=39,H=40,M=".kint-rich .kint-parent > nav, .kint-rich > footer > nav, .kint-rich .kint-tabs > li:not(.kint-active-tab)",q=class{#e=[];#t=0;#s=!1;#i;#n;constructor(t,e){this.#i=t,this.#n=e.window,this.#n.addEventListener("keydown",this.#c.bind(this),!0),e.runOnInit(this.onTreeChanged.bind(this))}scrollToFocus(){let t=this.#e[this.#t];if(!t)return;let e=this.#i.folder;if(t===e?.querySelector(".kint-parent > nav"))return;let s=x(t);if(this.#i.isFolderOpen()){let i=e.querySelector("dd.kint-foldout");i.scrollTo(0,s-i.clientHeight/2)}else this.#n.scrollTo(0,s-this.#n.innerHeight/2)}onTreeChanged(){let t=this.#e[this.#t];this.#e=[];let e=this.#i.folder,s=e?.querySelector(".kint-parent > nav"),i=this.#n.document;this.#i.isFolderOpen()&&(i=e,this.#e.push(s));let r=Array.from(i.querySelectorAll(M));for(let o of r)o.offsetParent!==null&&o!==s&&this.#e.push(o);if(s&&!this.#i.isFolderOpen()&&this.#e.push(s),this.#e.length===0){this.#s=!1,this.#r();return}t&&this.#e.indexOf(t)!==-1?this.#t=this.#e.indexOf(t):this.#r()}setCursor(t){if(this.#i.isFolderOpen()&&!this.#i.folder.contains(t)||!t.matches(M))return!1;let e=this.#e.indexOf(t);if(e===-1&&(this.onTreeChanged(),e=this.#e.indexOf(t)),e!==-1){if(e!==this.#t)return this.#t=e,this.#r(),!0;this.#e[e]?.classList.remove("kint-weak-focus")}else console.error("setCursor failed to find target in list",t),console.info("Please report this as a bug in Kint at https://github.com/kint-php/kint");return!1}#o(t){if(this.#e.length===0)return this.#t=0,null;for(this.#t+=t;this.#t<0;)this.#t+=this.#e.length;for(;this.#t>=this.#e.length;)this.#t-=this.#e.length;return this.#r(),this.#t}#r(){let t=this.#n.document.querySelector(".kint-focused");t&&(t.classList.remove("kint-focused"),t.classList.remove("kint-weak-focus")),this.#s&&this.#e[this.#t]?.classList.add("kint-focused")}#l(t){let e=t.closest(".kint-rich .kint-parent ~ dd")?.parentNode.querySelector(".kint-parent > nav");e&&(this.setCursor(e),this.scrollToFocus())}#c(t){if(t.keyCode===B&&t.target.matches(".kint-search")){t.target.blur(),this.#s&&this.#r();return}if(t.target!==this.#n.document.body||t.altKey||t.ctrlKey)return;if(t.keyCode===G){if(this.#s)this.#s=!1;else{if(this.#s=!0,this.onTreeChanged(),this.#e.length===0){this.#s=!1;return}this.scrollToFocus()}this.#r(),t.preventDefault();return}else if(t.keyCode===B){this.#s&&(this.#s=!1,this.#r(),t.preventDefault());return}else if(!this.#s)return;t.preventDefault(),d(this.#e[this.#t])||this.onTreeChanged();let e=this.#e[this.#t];if([P,R,D,H,K].includes(t.keyCode)){t.keyCode===P?this.#o(t.shiftKey?-1:1):t.keyCode===R||t.keyCode===D?this.#o(-1):(t.keyCode===H||t.keyCode===K)&&this.#o(1),this.scrollToFocus();return}if(e.tagName==="LI"&&[L,T,C,p,N,S].includes(t.keyCode)){t.keyCode===L||t.keyCode===T?(a.switchTab(e),this.onTreeChanged()):t.keyCode===C||t.keyCode===p?this.#o(1):(t.keyCode===N||t.keyCode===S)&&this.#o(-1),this.scrollToFocus();return}if(e.parentNode.tagName==="FOOTER"&&e.closest(".kint-rich")){if(t.keyCode===L||t.keyCode===T)e.parentNode.classList.toggle("kint-show");else if(t.keyCode===N||t.keyCode===S)if(e.parentNode.classList.contains("kint-show"))e.parentNode.classList.remove("kint-show");else{this.#l(e.closest(".kint-rich"));return}else if(t.keyCode===C||t.keyCode===p)e.parentNode.classList.add("kint-show");else if(t.keyCode===A&&!this.#i.isFolderOpen()&&e.matches(".kint-rich > footer > nav")){let i=e.closest(".kint-rich").querySelector(".kint-parent > nav, .kint-rich > footer > nav");this.#i.addToFolder(e),this.onTreeChanged(),this.setCursor(i),this.scrollToFocus()}return}let s=e.closest(".kint-parent");if(s){if(t.keyCode===j){a.toggleAccessPath(s);return}if(t.keyCode===A){!this.#i.isFolderOpen()&&s.matches(".kint-rich:not(.kint-folder) > dl > .kint-parent")&&(this.#i.addToFolder(e),this.onTreeChanged(),this.setCursor(e),this.scrollToFocus());return}if(t.keyCode===V){let i=s.closest(".kint-rich > dl")?.querySelector(".kint-search")?.closest(".kint-parent");if(i){e.classList.add("kint-weak-focus"),u.toggleSearchBox(i,!0);return}}if(t.keyCode===L||t.keyCode===T){a.toggle(s),this.onTreeChanged();return}if([C,p,N,S].includes(t.keyCode)){let i=s.classList.contains("kint-show");if(t.keyCode===C||t.keyCode===p){i&&a.toggleChildren(s,!0),a.toggle(s,!0),this.onTreeChanged();return}else if(i){a.toggleChildren(s,!1),a.toggle(s,!1),this.onTreeChanged();return}else{this.#l(s);return}}}}};var y=class{#e;#t;constructor(t){if(!(t instanceof h))throw new Error("Invalid argument to Plain.constructor()");this.#e=t.window,t.runOnInit(this.#s.bind(this))}#s(){d(this.#t)||(this.#t=this.#e.document.querySelector("style.kint-plain-style")),this.#t&&m(this.#t)}};var w=class{#e;constructor(t){if(!(t instanceof h))throw new Error("Invalid argument to Microtime.constructor()");this.#e=t.window,t.runOnInit(this.#t.bind(this))}#t(){let t={},e=this.#e.document.querySelectorAll("[data-kint-microtime-group]");for(let s of e){let i=s.querySelector(".kint-microtime-lap");if(!i)continue;let r=s.dataset.kintMicrotimeGroup,o=parseFloat(i.textContent),l=parseFloat(s.querySelector(".kint-microtime-avg").textContent);t[r]??={min:o,max:o,avg:l},t[r].min>o&&(t[r].min=o),t[r].max<o&&(t[r].max=o),t[r].avg=l}for(let s of e){let i=s.querySelector(".kint-microtime-lap");if(!i)continue;let r=parseFloat(i.textContent),o=t[s.dataset.kintMicrotimeGroup];if(s.querySelector(".kint-microtime-avg").textContent=o.avg,!(r===o.min&&r===o.max))if(s.classList.add("kint-microtime-js"),r>o.avg){let l=(r-o.avg)/(o.max-o.avg);i.style.background="hsl("+(40-40*l)+", 100%, 65%)"}else{let l=0;o.avg!==o.min&&(l=(o.avg-r)/(o.avg-o.min)),i.style.background="hsl("+(40+80*l)+", 100%, 65%)"}}}};var U=Symbol(),h=class n{static#e=null;#t;#s=[];#i=new Set;static init(t){return n.#e??=new n(t,U),n.#e.#n(),n.#e.runOnLoad(n.#r),n.#e}get window(){return this.#t}constructor(t,e){if(U!==e)throw new Error("Kint constructor is private. Use Kint.init()");if(!(t instanceof Window))throw new Error("Invalid argument to Kint.init()");this.#t=t,this.runOnInit(this.#o.bind(this)),new y(this),new a(this),new w(this)}runOnLoad(t){if(this.#t.document.readyState==="complete")try{t()}catch{}else this.#t.addEventListener("load",t)}runOnInit(t){this.#s.push(t)}#n(){this.#t.document.currentScript&&(this.#i.add(E(window.document.currentScript)),window.document.currentScript.remove())}#o(){for(let t of this.#i.keys())for(let e of this.#t.document.querySelectorAll(t))e.remove()}static#r(){for(let t of n.#e.#s)t()}};window.Kint||(window.Kint=h);window.Kint.init(window);})();
</script><style class="kint-rich-style">.kint-rich{--spacing: 4px;--nav-size: 15px;--backdrop-color: rgba(255, 255, 255, 0.9);--main-background: #e0eaef;--secondary-background: #c1d4df;--text-color: #1d1e1e;--variable-name-color: #1d1e1e;--variable-type-color: #0092db;--variable-type-color-hover: #5cb730;--border-color: #b6cedb;--border-color-hover: #0092db;--border: 1px solid var(--border-color);--foldout-max-size: calc(100vh - 100px);--foldout-zindex: 999999;--caret-image: url("data:image/svg+xml;utf8,<svg xmlns='http://www.w3.org/2000/svg' viewBox='0 0 30 150'><g stroke-width='2' fill='%23FFF'><path d='M1 1h28v28H1zm5 14h18m-9 9V6M1 61h28v28H1zm5 14h18' stroke='%23379'/><path d='M1 31h28v28H1zm5 14h18m-9 9V36M1 91h28v28H1zm5 14h18' stroke='%235A3'/><path d='M1 121h28v28H1zm5 5l18 18m-18 0l18-18' stroke='%23CCC'/></g></svg>");--ap-image: url("data:image/svg+xml;utf8,<svg xmlns='http://www.w3.org/2000/svg' viewBox='0 0 16 16'><g stroke='%23000' fill='transparent'><path d='M2 8h3m3 3v3M8 2v3m3 3h3M3 8' stroke-width='2' stroke-linecap='round'/><circle stroke-width='1.5' r='4.5' cx='8' cy='8'/></g></svg>");--folder-image: url("data:image/svg+xml;utf8,<svg xmlns='http://www.w3.org/2000/svg' viewBox='0 0 16 16'><path d='M2 2h4l2 2h6v9H2V2h2' stroke-width='2' stroke='%23000' fill='transparent' stroke-linejoin='round'/></svg>");--search-image: url("data:image/svg+xml;utf8,<svg xmlns='http://www.w3.org/2000/svg' viewBox='0 0 16 16'><g stroke='%23000' fill='transparent'><path d='M2 14l3-3' stroke-linecap='round' stroke-width='3'/><circle stroke-width='2' r='5' cx='9' cy='7'/></g></svg>");font-size:13px;overflow-x:auto;white-space:nowrap;background:var(--backdrop-color);direction:ltr;contain:content}.kint-rich.kint-folder{position:fixed;bottom:0;left:0;right:0;z-index:var(--foldout-zindex);width:100%;margin:0;display:block}.kint-rich.kint-folder dd.kint-foldout{max-height:var(--foldout-max-size);padding-right:calc(var(--spacing)*2);overflow-y:scroll;display:none}.kint-rich.kint-folder dd.kint-foldout.kint-show{display:block}.kint-rich::selection{background:var(--border-color-hover);color:var(--text-color)}.kint-rich .kint-focused{box-shadow:0 0 3px 3px var(--variable-type-color-hover)}.kint-rich .kint-focused.kint-weak-focus{box-shadow:0 0 3px 1px color-mix(in srgb, var(--variable-type-color-hover) 50%, transparent)}.kint-rich,.kint-rich::before,.kint-rich::after,.kint-rich *,.kint-rich *::before,.kint-rich *::after{box-sizing:border-box;border-radius:0;color:var(--text-color);float:none !important;font-family:Consolas,Menlo,Monaco,Lucida Console,Liberation Mono,DejaVu Sans Mono,Bitstream Vera Sans Mono,Courier New,monospace,serif;line-height:15px;margin:0;padding:0;text-align:left}.kint-rich{margin:calc(var(--spacing)*2) 0}.kint-rich dt,.kint-rich dl{width:auto}.kint-rich dt,.kint-rich div.access-path{background:var(--main-background);border:var(--border);color:var(--text-color);display:block;font-weight:bold;list-style:none outside none;overflow:auto;padding:var(--spacing)}.kint-rich dt:hover,.kint-rich div.access-path:hover{border-color:var(--border-color-hover)}.kint-rich>dl dl{padding:0 0 0 calc(var(--spacing)*3)}.kint-rich dt.kint-parent>nav,.kint-rich>footer>nav{background:var(--caret-image) no-repeat scroll 0 0/var(--nav-size) 75px rgba(0,0,0,0);cursor:pointer;display:inline-block;height:var(--nav-size);width:var(--nav-size);margin-right:3px;vertical-align:middle}.kint-rich dt.kint-parent:hover>nav,.kint-rich>footer>nav:hover{background-position:0 25%}.kint-rich dt.kint-parent.kint-show>nav,.kint-rich>footer.kint-show>nav{background-position:0 50%}.kint-rich dt.kint-parent.kint-show:hover>nav,.kint-rich>footer.kint-show>nav:hover{background-position:0 75%}.kint-rich dt.kint-parent.kint-locked>nav{background-position:0 100%}.kint-rich dt.kint-parent+dd{display:none;border-left:1px dashed var(--border-color);contain:strict}.kint-rich dt.kint-parent.kint-show+dd{display:block;contain:content}.kint-rich var,.kint-rich var a{color:var(--variable-type-color);font-style:normal}.kint-rich dt:hover var,.kint-rich dt:hover var a{color:var(--variable-type-color-hover)}.kint-rich dfn{font-style:normal;font-family:monospace;color:var(--variable-name-color)}.kint-rich pre{color:var(--text-color);margin:0 0 0 calc(var(--spacing)*3);padding:5px;overflow-y:hidden;border-top:0;border:var(--border);background:var(--main-background);display:block;word-break:normal}.kint-rich .kint-access-path-trigger,.kint-rich .kint-folder-trigger,.kint-rich .kint-search-trigger{background:color-mix(in srgb, var(--text-color) 80%, transparent);border-radius:3px;padding:2px;height:var(--nav-size);width:var(--nav-size);font-size:var(--nav-size);margin-left:5px;font-weight:bold;text-align:center;line-height:1;float:right !important;cursor:pointer;position:relative;overflow:hidden}.kint-rich .kint-access-path-trigger::before,.kint-rich .kint-folder-trigger::before,.kint-rich .kint-search-trigger::before{display:block;content:"";width:100%;height:100%;background:var(--main-background);mask:center/contain no-repeat alpha}.kint-rich .kint-access-path-trigger:hover,.kint-rich .kint-folder-trigger:hover,.kint-rich .kint-search-trigger:hover{background:var(--main-background)}.kint-rich .kint-access-path-trigger:hover::before,.kint-rich .kint-folder-trigger:hover::before,.kint-rich .kint-search-trigger:hover::before{background:var(--text-color)}.kint-rich .kint-access-path-trigger::before{mask-image:var(--ap-image)}.kint-rich .kint-folder-trigger::before{mask-image:var(--folder-image)}.kint-rich .kint-search-trigger::before{mask-image:var(--search-image)}.kint-rich input.kint-search{display:none;border:var(--border);border-top-width:0;border-bottom-width:0;padding:var(--spacing);float:right !important;margin:calc(var(--spacing)*-1) 0;color:var(--variable-name-color);background:var(--secondary-background);height:calc(var(--nav-size) + var(--spacing)*2);width:calc(var(--nav-size)*10);position:relative;z-index:100}.kint-rich input.kint-search.kint-show{display:block}.kint-rich .kint-search-root ul.kint-tabs>li:not(.kint-search-match){background:var(--secondary-background);filter:saturate(0);opacity:.5}.kint-rich .kint-search-root dl:not(.kint-search-match){opacity:.5}.kint-rich .kint-search-root dl:not(.kint-search-match)>dt{background:var(--main-background);filter:saturate(0)}.kint-rich .kint-search-root dl:not(.kint-search-match) dl,.kint-rich .kint-search-root dl:not(.kint-search-match) ul.kint-tabs>li:not(.kint-search-match){opacity:1}.kint-rich div.access-path{background:var(--secondary-background);display:none;margin-top:5px;padding:4px;white-space:pre}.kint-rich div.access-path.kint-show{display:block}.kint-rich footer{padding:0 3px 3px;font-size:9px;background:rgba(0,0,0,0)}.kint-rich footer>.kint-folder-trigger{background:rgba(0,0,0,0)}.kint-rich footer>.kint-folder-trigger::before{background:var(--text-color)}.kint-rich footer nav{height:10px;width:10px;background-size:10px 50px}.kint-rich footer>ol{display:none;margin-left:32px}.kint-rich footer.kint-show>ol{display:block}.kint-rich a{color:var(--text-color);text-shadow:none;text-decoration:underline}.kint-rich a:hover{color:var(--variable-name-color);border-bottom:1px dotted var(--variable-name-color)}.kint-rich ul{list-style:none;padding-left:calc(var(--spacing)*3)}.kint-rich ul:not(.kint-tabs) li{border-left:1px dashed var(--border-color)}.kint-rich ul:not(.kint-tabs) li>dl{border-left:none}.kint-rich ul.kint-tabs{margin:0 0 0 calc(var(--spacing)*3);padding-left:0;background:var(--main-background);border:var(--border);border-top:0}.kint-rich ul.kint-tabs>li{background:var(--secondary-background);border:var(--border);cursor:pointer;display:inline-block;height:calc(var(--spacing)*6);margin:calc(var(--spacing)/2);padding:0 calc(2px + var(--spacing)*2.5);vertical-align:top}.kint-rich ul.kint-tabs>li:hover,.kint-rich ul.kint-tabs>li.kint-active-tab:hover{border-color:var(--border-color-hover);color:var(--variable-type-color-hover)}.kint-rich ul.kint-tabs>li.kint-active-tab{background:var(--main-background);border-top:0;margin-top:-1px;height:27px;line-height:24px}.kint-rich ul.kint-tabs>li:not(.kint-active-tab){line-height:calc(var(--spacing)*5)}.kint-rich ul.kint-tabs li+li{margin-left:0}.kint-rich ul.kint-tab-contents>li{display:none;contain:strict}.kint-rich ul.kint-tab-contents>li.kint-show{display:block;contain:content}.kint-rich dt:hover+dd>ul>li.kint-active-tab{border-color:var(--border-color-hover);color:var(--variable-type-color-hover)}.kint-rich dt>.kint-color-preview{width:var(--nav-size);height:var(--nav-size);display:inline-block;vertical-align:middle;margin-left:10px;border:var(--border);background-color:#ccc;background-image:url('data:image/svg+xml;utf8,<svg xmlns="http://www.w3.org/2000/svg" viewBox="0 0 2 2"><path fill="%23FFF" d="M0 0h1v2h1V1H0z"/></svg>');background-size:min(20px,100%)}.kint-rich dt>.kint-color-preview:hover{border-color:var(--border-color-hover)}.kint-rich dt>.kint-color-preview>div{width:100%;height:100%}.kint-rich table{border-collapse:collapse;empty-cells:show;border-spacing:0}.kint-rich table *{font-size:12px}.kint-rich table dt{background:none;padding:calc(var(--spacing)/2)}.kint-rich table dt .kint-parent{min-width:100%;overflow:hidden;text-overflow:ellipsis;white-space:nowrap}.kint-rich table td,.kint-rich table th{border:var(--border);padding:calc(var(--spacing)/2);vertical-align:center}.kint-rich table th{cursor:alias}.kint-rich table td:first-child,.kint-rich table th{font-weight:bold;background:var(--secondary-background);color:var(--variable-name-color)}.kint-rich table td{background:var(--main-background);white-space:pre}.kint-rich table td>dl{padding:0}.kint-rich table pre{border-top:0;border-right:0}.kint-rich table thead th:first-child{background:none;border:0}.kint-rich table tr:hover>td{box-shadow:0 0 1px 0 var(--border-color-hover) inset}.kint-rich table tr:hover var{color:var(--variable-type-color-hover)}.kint-rich table ul.kint-tabs li.kint-active-tab{height:20px;line-height:17px}.kint-rich pre.kint-source{margin-left:-1px}.kint-rich pre.kint-source[data-kint-filename]:before{display:block;content:attr(data-kint-filename);margin-bottom:var(--spacing);padding-bottom:var(--spacing);border-bottom:1px solid var(--secondary-background)}.kint-rich pre.kint-source>div:before{display:inline-block;content:counter(kint-l);counter-increment:kint-l;border-right:1px solid var(--border-color-hover);padding-right:calc(var(--spacing)*2);margin-right:calc(var(--spacing)*2)}.kint-rich pre.kint-source>div.kint-highlight{background:var(--secondary-background)}.kint-rich .kint-microtime-js .kint-microtime-lap{text-shadow:-1px 0 var(--border-color-hover),0 1px var(--border-color-hover),1px 0 var(--border-color-hover),0 -1px var(--border-color-hover);color:var(--main-background);font-weight:bold}.kint-rich{--main-background: #f8f8f8;--secondary-background: #f8f8f8;--variable-type-color: #06f;--variable-type-color-hover: #f00;--border-color: #d7d7d7;--border-color-hover: #aaa;--alternative-background: #fff;--highlight-color: #cfc;--caret-image: url("data:image/svg+xml;utf8,<svg xmlns='http://www.w3.org/2000/svg' viewBox='0 0 30 150'><path d='M6 7h18l-9 15zm0 30h18l-9 15zm0 45h18l-9-15zm0 30h18l-9-15zm0 12l18 18m-18 0l18-18' fill='%23555'/><path d='M6 126l18 18m-18 0l18-18' stroke-width='2' stroke='%23555'/></svg>")}.kint-rich .kint-focused{box-shadow:0 0 3px 2px var(--variable-type-color-hover)}.kint-rich dt{font-weight:normal}.kint-rich dt.kint-parent{margin-top:4px}.kint-rich dl dl{margin-top:4px;padding-left:25px;border-left:none}.kint-rich>dl>dt{background:var(--secondary-background)}.kint-rich ul{margin:0;padding-left:0}.kint-rich ul:not(.kint-tabs)>li{border-left:0}.kint-rich ul.kint-tabs{background:var(--secondary-background);border:var(--border);border-width:0 1px 1px 1px;padding:4px 0 0 12px;margin-left:-1px;margin-top:-1px}.kint-rich ul.kint-tabs li,.kint-rich ul.kint-tabs li+li{margin:0 0 0 4px}.kint-rich ul.kint-tabs li{border-bottom-width:0;height:calc(var(--spacing)*6 + 1px)}.kint-rich ul.kint-tabs li:first-child{margin-left:0}.kint-rich ul.kint-tabs li.kint-active-tab{border-top:var(--border);background:var(--alternative-background);font-weight:bold;padding-top:0;border-bottom:1px solid var(--alternative-background) !important;margin-bottom:-1px}.kint-rich ul.kint-tabs li.kint-active-tab:hover{border-bottom:1px solid var(--alternative-background)}.kint-rich ul>li>pre{border:var(--border)}.kint-rich dt:hover+dd>ul{border-color:var(--border-color-hover)}.kint-rich pre{background:var(--alternative-background);margin-top:4px;margin-left:25px}.kint-rich .kint-source{margin-left:-1px}.kint-rich .kint-source .kint-highlight{background:var(--highlight-color)}.kint-rich .kint-parent.kint-show>.kint-search{border-bottom-width:1px}.kint-rich table td{background:var(--alternative-background)}.kint-rich table td>dl{padding:0;margin:0}.kint-rich table td>dl>dt.kint-parent{margin:0}.kint-rich table td:first-child,.kint-rich table td,.kint-rich table th{padding:2px 4px}.kint-rich table dd,.kint-rich table dt{background:var(--alternative-background)}.kint-rich table tr:hover>td{box-shadow:none;background:var(--highlight-color)}
</style>

        <meta charset="UTF-8">
        <meta name="viewport" content="width=device-width, initial-scale=1">

        <title>
                Index du portail        </title>    

        <link 
            rel="stylesheet"
            href="https://cdnjs.cloudflare.com/ajax/libs/font-awesome/4.7.0/css/font-awesome.min.css"
        >        
        
        <style type="text/css">
            /* ------------------------------------------------------------ 
            260502-001 : intégration cp_callout
            */
            
            /* Define variablesfor STRUCTURAL and  THEMING*/
            :root{
                --struct-header-h   : 8vh;
                --struct-main-h     : 84vh;
                --struct-footer-h   : 8vh;
                --struct-tab-h      : 80vh;

                --fontsize          : 18px;

                --bgcolor: lightblue;
                --textcolor: darkblue;
                --col-A : #eee236ff;
                --col-B : #ade456ff;
                --col-C : #efefef;
                --col-D : #000000;
                --col-E:  #ffffff;
                /* voir callout */
                --col-danger    :   #f01313ff; ;
                --col-info      :   #0000ff;; 
                --col-note      :   #0b9d14;
                --col-warning   :   #f79503ff;            
            }
            /* RESET CSS  ========================================== */
            * {
                box-sizing      :   border-box;
                margin          :   0;
            }
            body, html {
                min-height      :   100%; 
                margin          :   0;
                padding         :   0;
            }
            /* STRUCTURAL CSS  ========================================== */
            /* RWD MOBILE FIRST 
            chaque composant a sa regle rwd
            ========================================== */
            body{
                display         :   flex;
                flex-direction  :   column;
                min-height      :   100%;
                font-size       :   var(--fontsize);
            }
            /* ------------------------------------------------------------ */
            nav {
                position: fixed;
                inset: 0;
                transform: translateX(-100%);
                transition: transform .3s ease;
                display: flex;
                flex-direction: column;
                z-index: 2;
                overflow-y: auto;          /* FIX : scroll quand le TOC est long */
                overflow-x: hidden;
                background-color: var(--col-A);
            }

            nav.open {
                transform: translateX(0);
            }

            /* Lien de fermeture */
            nav a.closebtn {
                float: none;
                align-self: flex-end;
                font-size: 2rem;
                padding: 8px 16px;
                line-height: 1;
            }

            /* ── Entrée article ─────────────────────────────────────────────── */

            .nav-article {
                display: flex;
                flex-direction: column;
                width: 100%;
            }

            /* Ligne [titre] [chevron] */
            .nav-header-row {
                display: flex;
                align-items: stretch;
                width: 100%;
            }

            /* Lien titre : prend tout l'espace dispo */
            .nav-article .nav-title {
                flex: 1 1 auto;
                padding: 12px 16px;
                text-decoration: none;
                font-size: 17px;
                display: flex;
                align-items: center;
                gap: 8px;
            }

            /* Bouton chevron accordion (mobile) */
            .nav-article .nav-toggle {
                flex: 0 0 auto;
                background: transparent;
                border: none;
                color: inherit;
                font-size: 0.75rem;
                padding: 0 14px;
                cursor: pointer;
                transition: transform 0.25s ease;
                line-height: 1;
            }
            .nav-article.open .nav-toggle {
                transform: rotate(90deg);
            }

            /* TOC : masqué par défaut, déroulé avec .open */
            .nav-article .nav-toc {
                display: none;
                padding: 0;
                margin: 0;
                list-style: none;
            }
            .nav-article.open .nav-toc {
                display: block;
            }

            /* Liens dans le TOC mobile */
            .nav-article .nav-toc a {
                display: block;
                padding: 6px 16px 6px 24px;
                font-size: 0.9em;
                text-decoration: none;
                white-space: nowrap;
                overflow: hidden;
                text-overflow: ellipsis;
            }
            .nav-article .nav-toc ul {
                list-style: none;
                margin: 0;
                padding: 0;
            }
            /* h3 */
            .nav-article .nav-toc ul a       { padding-left: 36px; font-size: 0.85em; }
            /* h4 */
            .nav-article .nav-toc ul ul a    { padding-left: 50px; font-size: 0.8em;  opacity: 0.85; }




            /* 2026-04-30
            PATCH CSS 
            * 1. header

            */
            
            /* ─── 1.  header  */
            header {
                position: relative;
                overflow: visible;          /* était hidden — doit laisser le dropdown auth dépasser */
                padding: 0;
                margin: 0;
                min-height: var(--struct-header-h);
                display: flex;
                flex-direction: column;
                justify-content: center;
            }
            /* Ligne principale du header : [hamburger] [titres] [auth] */
            .header-top {
                display: flex;
                align-items: center;
                gap: 10px;
                padding: 0 12px;
                min-height: var(--struct-header-h);
                width: 100%;
            }
            /* Titres au centre, flex grow */
            .header-titles {
                flex: 1 1 auto;
                min-width: 0;               /* permet le text-overflow sur les petits écrans */
            }
            
            .header-titles h1 {
                font-size: clamp(1rem, 3vw, 1.6rem);
                margin: 0;
                white-space: nowrap;
                overflow: hidden;
                text-overflow: ellipsis;
            }
            
            .header-titles p {
                margin: 0;
                font-size: 0.8em;
                opacity: 0.8;
                white-space: nowrap;
                overflow: hidden;
                text-overflow: ellipsis;
            }
            
            /* ─── 2. Bouton hamburger */
            .rwdnav {
                flex: 0 0 auto;
                background: transparent;
                border: none;
                cursor: pointer;
                font-size: 1.6rem;
                padding: 6px 10px;
                line-height: 1;
                /* couleurs héritées du header */
                color: inherit;
            }
            
            .rwdnav:focus-visible {
                outline: 2px solid currentColor;
                border-radius: 4px;
            }
            
            /* Masqué sur PC (breakpoint identique à celui de sidebar.js) */
            @media (min-width: 768px) {
                .rwdnav { display: none; }
            }

            /*
            * ─── 3. Zone authentification dans le header ─────────────────────────────────
            */

            .header-auth {
                flex: 0 0 auto;
                display: flex;
                align-items: center;
                gap: 6px;
                font-size: 0.85rem;
                /* color : var(--col-A) */
            }
            
            /* Pseudo-classe d'accessibilité : masquer les labels visuellement */
            .sr-only {
                position: absolute;
                width: 1px; height: 1px;
                padding: 0; margin: -1px;
                overflow: hidden;
                clip: rect(0,0,0,0);
                white-space: nowrap;
                border: 0;
            }
            
            /* ── Connecté ── */
            .auth-username {
                display: flex;
                align-items: center;
                gap: 4px;
                font-weight: 600;
                white-space: nowrap;
            }
            
            .auth-link {
                display: flex;
                align-items: center;
                gap: 4px;
                padding: 4px 8px;
                text-decoration: none;
                border-radius: 4px;
                white-space: nowrap;
                transition: opacity 0.2s;
            }
            .auth-link:hover { opacity: 0.75; }
            
            /* Sur mobile : masquer le texte, ne garder que l'icône */
            @media (max-width: 767px) {
                .auth-link span, .auth-username { display: none; }
                .auth-link { padding: 4px 6px; }
            }
            
            /* ── Formulaire de connexion ── */
            .auth-form {
                display: flex;
                align-items: center;
                gap: 6px;
                flex-wrap: wrap;
            }
            
            .auth-form input {
                padding: 4px 8px;
                border: 1px solid rgba(255,255,255,0.4);
                border-radius: 4px;
                font-size: 0.85rem;
                background: rgba(255,255,255,0.15);
                color: inherit;
                min-width: 0;
                width: 130px;
            }
            
            .auth-form input::placeholder { opacity: 0.6; }
            
            .auth-form button {
                display: flex;
                align-items: center;
                gap: 4px;
                padding: 5px 10px;
                border: none;
                border-radius: 4px;
                cursor: pointer;
                font-size: 0.85rem;
                white-space: nowrap;
            }
            
            /* Sur mobile : champs et label cachés, seul le bouton icône reste */
            @media (max-width: 767px) {
                .auth-form input { display: none; }
                .auth-form button span { display: none; }
                .auth-form button { padding: 6px 8px; }
            }

            /* ------------------------------------------------------------ */
            main{
                flex            :   1   ;
                min-height      : var( --struct-main-h );
                width: 100%;            
            }
            /*  ARTICLES / SECTION   ---------  */
            article{  
                /*padding: 10px 20px;*/
                min-height: var( --struct-tab-h );
                display: none;                            
            }

            article > section > div{ 
                display         : flex;
                flex-direction  : column;  
            }
            article > section > div > aside {
                flex            : 1 1 auto;
                width           : 100%;
            }            
            /* ------------------------------------------------------------ */
            footer{
                min-height      : var( --struct-footer-h );
                width           : 100%;
            }
            







            /* COMPOSANTS ==========================================        */
            /*  decorateur ARTICLE Onglet tabs     ------------------------ */
            .cp_soft-card {
                box-shadow: 0 8px 24px rgba(0, 0, 0, 0.15);
                transition: transform 0.3s ease;
            }



            /* ══════════════════════════════════════════════════════════════════
                Composants CSS pour le module mot (et réutilisables ailleurs)
                Structure séparée du theming — RWD inclus dans chaque bloc cp_
            
                Sections :
                1. cp_module_container + cp_panel_*
                2. cp_btn
                3. cp_form  (motForm / motEditForm)
                4. cp_detail
                5. cp_form_actions
                6. cp_table          (déjà défini dans cms.php — référence)
                7. cp_pagination     (déjà défini dans cms.php — référence)
            ══════════════════════════════════════════════════════════════════ */
            
            /*            1. CONTENEUR PRINCIPAL + PANELS

                Structure :
                #motContainer (.cp_module_container)
                    #motButtonPanel     (.cp_panel_buttons)
                    #motFormPanel       (.cp_panel_form)
                    #motDetailPanel     (.cp_panel_detail)
                    #motTablePanel      (.cp_panel_table)
                    #motPaginationPanel (.cp_panel_pagination)
            */
            
            .cp_module_container {
                display: flex;
                flex-direction: column;
                gap: 8px;
                width: 100%;
            }
            
            /* --- Barre de boutons --- */
            .cp_panel_buttons {
                display: flex;
                flex-wrap: wrap;
                gap: 6px;
                padding: 6px 0;
            }
            
            /* --- Zone formulaire (recherche ou édition) --- */
            .cp_panel_form {
                padding: 10px 0;
            }
            
            /* --- Zone détail --- */
            .cp_panel_detail {
                padding: 10px 0;
            }
            
            /* --- Zone tableau --- */
            .cp_panel_table {
                overflow-x: auto;      /* scroll horizontal sur mobile */
                width: 100%;
            }
            
            /* --- Zone pagination --- */
            .cp_panel_pagination {
                padding: 4px 0;
            }
            
            
            /* ══════════════════════════════════════════════════════════════════
            2. BOUTONS  cp_btn
            ══════════════════════════════════════════════════════════════════ */
            
            /* ── STRUCTURE ── */
            .cp_btn {
                display: inline-flex;
                align-items: center;
                gap: 5px;
                padding: 6px 12px;
                border: 1px solid transparent;
                border-radius: 4px;
                cursor: pointer;
                font-size: 0.875rem;
                line-height: 1.4;
                white-space: nowrap;
                transition: opacity 0.15s ease, background-color 0.15s ease;
            }
            
            .cp_btn:disabled {
                opacity: 0.45;
                cursor: not-allowed;
                pointer-events: none;
            }
            
            /* Icône tabler (ti) dans un bouton */
            .cp_btn .ti {
                font-size: 1em;
                flex-shrink: 0;
            }
            
            /* ── RWD : boutons pleine largeur sur très petit écran ── */
            @media (max-width: 480px) {
                .cp_panel_buttons {
                    flex-direction: column;
                }
                .cp_btn {
                    width: 100%;
                    justify-content: center;
                }
            }
            
            /* ── THEMING ── */
            .cp_btn {
                background-color: #e9e9e9;
                border-color: #bbb;
                color: #333;
            }
            .cp_btn:hover:not(:disabled) {
                background-color: #d5d5d5;
            }
            
            .cp_btn--primary {
                background-color: #0057b8;
                border-color: #004499;
                color: #fff;
            }
            .cp_btn--primary:hover:not(:disabled) {
                background-color: #004499;
            }
            
            .cp_btn--danger {
                background-color: #c0392b;
                border-color: #922b21;
                color: #fff;
            }
            .cp_btn--danger:hover:not(:disabled) {
                background-color: #922b21;
            }
            
            
            /* ══════════════════════════════════════════════════════════════════
            3. FORMULAIRES  cp_form  (motForm & motEditForm)
            ══════════════════════════════════════════════════════════════════
            On étend le style existant form.form_style1 avec une variante
            légère pour les formulaires générés dynamiquement.
            Les id #motForm / #motEditForm peuvent hériter de .cp_form ou
            de form.form_style1 selon le rendu HTML.
            */
            
            /* Conteneur générique pour les formulaires de composants */
            .cp_form,
            #motForm,
            #motEditForm {
                display: flex;
                flex-direction: column;
                gap: 8px;
                padding: 12px;
                border-radius: 5px;
                width: 100%;
                box-sizing: border-box;
            }
            
            /* Labels */
            .cp_form label,
            #motForm label,
            #motEditForm label {
                font-size: 0.85rem;
                font-weight: 600;
                margin-bottom: 2px;
            }
            
            /* Champs texte / number */
            .cp_form input[type="text"],
            .cp_form input[type="number"],
            .cp_form input[type="email"],
            #motForm input[type="text"],
            #motForm input[type="number"],
            #motEditForm input[type="text"],
            #motEditForm input[type="number"],
            #motEditForm input[type="hidden"] + input {
                width: 100%;
                padding: 7px 10px;
                border: 1px solid #aaa;
                border-radius: 4px;
                font-size: 0.9rem;
                box-sizing: border-box;
                transition: border-color 0.2s ease;
            }
            
            .cp_form input:focus,
            #motForm input:focus,
            #motEditForm input:focus {
                outline: none;
                border-color: #0057b8;
                box-shadow: 0 0 0 2px rgba(0, 87, 184, 0.2);
            }
            
            .cp_form input:invalid,
            #motForm input:invalid,
            #motEditForm input:invalid {
                border-color: #c0392b;
            }
            
            /* ── RWD formulaire ── */
            @media (min-width: 480px) {
                /* Sur tablette/PC on peut passer en grille label + champ côte à côte */
                .cp_form {
                    display: grid;
                    grid-template-columns: auto 1fr;
                    align-items: center;
                    column-gap: 12px;
                }
                /* Les actions (boutons) et les hidden fields occupent toute la largeur */
                .cp_form_actions,
                .cp_form input[type="hidden"],
                .cp_form button[type="submit"] {
                    grid-column: 1 / -1;
                }
            }
            
            /* ── THEMING formulaire ── */
            .cp_form,
            #motForm,
            #motEditForm {
                background-color: #f7f7f7;
                border: 1px solid #ddd;
            }
            
            .cp_form input[type="text"],
            .cp_form input[type="number"],
            #motForm input,
            #motEditForm input {
                background-color: #fff;
                color: #222;
            }
            
            
            /* ══════════════════════════════════════════════════════════════════
            4. DETAIL  cp_detail  (renderDetail)
            ══════════════════════════════════════════════════════════════════ */
            
            /* ── STRUCTURE ── */
            .cp_detail {
                display: grid;
                grid-template-columns: auto 1fr;
                gap: 4px 16px;
                padding: 10px 12px;
                border-radius: 5px;
                width: 100%;
                box-sizing: border-box;
            }
            
            .cp_detail dt {
                font-weight: 600;
                font-size: 0.85rem;
                padding: 4px 0;
                white-space: nowrap;
            }
            
            .cp_detail dd {
                margin: 0;
                padding: 4px 0;
                font-size: 0.9rem;
                word-break: break-word;
            }
            
            /* ── THEMING ── */
            .cp_detail {
                background-color: #f0f4ff;
                border: 1px solid #c0d0ee;
                color: #1a2a4a;
            }
            
            .cp_detail dt {
                color: #0057b8;
            }
            
            
            /* ══════════════════════════════════════════════════════════════════
            5. ACTIONS DE FORMULAIRE  cp_form_actions
            ══════════════════════════════════════════════════════════════════ */
            
            .cp_form_actions {
                display: flex;
                flex-wrap: wrap;
                gap: 8px;
                padding-top: 8px;
                border-top: 1px solid #ddd;
                margin-top: 6px;
            }
            
            /* ── RWD : alignement à droite sur PC ── */
            @media (min-width: 480px) {
                .cp_form_actions {
                    justify-content: flex-end;
                }
            }
            
            
            /* ══════════════════════════════════════════════════════════════════
            6. TABLEAU  cp_table 
            ══════════════════════════════════════════════════════════════════
                cp_table
                260503-001 : intégration
            */
            .cp_table {  
                width: 100%;  
                border-collapse: collapse;  
                margin-top: 10px;  
            }  
            
            .cp_table th, .cp_table td {  
                border: 1px solid #ccc;  
                padding: 6px 10px;  
                text-align: left;  
            }  
            
            .cp_table th {  
                background: #f5f5f5;  
            }  
            
            .cp_table tr:hover {  
                background: #fafafa;  
            }  

            .cp_panel_table .cp_table tr.selected td {
                background-color: #dce8ff;
            }
            
            .cp_panel_table .cp_table tbody tr {
                cursor: pointer;
            }


            /* pagination pour tableau            */
            /*
            2026-05-03-002

            .cp_pagination {  
                margin-top: 10px;  
            }  
            */
            .cp_page_btn {  
                margin: 2px;  
                padding: 5px 10px;  
                cursor: pointer;  
            }  
            
            .cp_page_btn.active {  
                font-weight: bold;  
                background: #ddd;  
            }


            .cp_pagination        { margin-top: 8px; display: flex; flex-wrap: wrap; gap: 4px; align-items: center; }
            .cp_pagination_info   { padding: 4px 10px; font-size: 0.9rem; }
            .cp_pagination_ellipsis { padding: 4px 6px; color: #888; }
            .cp_notice            { padding: 12px; border-radius: 4px; font-size: 0.9rem; margin: 6px 0; }
            .cp_notice--loading   { background: #f0f4ff; color: #0057b8; }
            .cp_notice--error     { background: #fdd8d0; color: #c0392b; }
            .cp_notice--empty     { background: #f5f5f5; color: #666;    }


            /*-------------------------------------
            cp_ac autocmplete
            */
            .cp_ac_wrapper    { position: relative; width: 100%; }
            
            .cp_ac_list       {
                position: absolute;
                z-index: 500;
                top: 100%; left: 0;
                width: 100%;
                margin: 0; padding: 0;
                list-style: none;
                background: #fff;
                border: 1px solid #bbb;
                border-radius: 0 0 4px 4px;
                max-height: 220px;
                overflow-y: auto;
                box-shadow: 0 4px 12px rgba(0,0,0,0.15);
            }
            .cp_ac_item       { padding: 7px 12px; cursor: pointer; font-size: 0.9rem; }
            .cp_ac_item:hover,
            .cp_ac_item--focus { background: #eef3ff; color: #0057b8; }



            /* ------------------------------------------------------------ 
                cp_callout
                260502-001 : intégration
            */

            .cp_callout {
                border: 1px solid #5f5e5eff;
                margin: 1rem 0;
                padding: 0;
                border-radius: 5px;
                overflow: hidden;
                display:block;
            }
            .cp_callout .titre {
                padding: 10px;
                cursor: pointer;
                /* display: flex;*/
                justify-content: space-between;
                font-weight: bold;

            }
                /* Callout : titre coloré selon la variante du parent */
            .cp_callout.danger .titre {
                border-bottom    : 5px solid var(--col-danger);
                background-color : var(--col-danger);
                color            : #fdd8d0;
            }
            .cp_callout.danger .titre::before {
                content: '\1F537';
                padding-right: 5%;
            }
            .cp_callout.info .titre {
                border-bottom    : 5px solid var(--col-info);
                background-color : var(--col-info);
                color            : #d0d8fd;
            }
            .cp_callout.note .titre {
                border-bottom    : 5px solid var(--col-note);
                background-color : var(--col-note);
                color            : #d0f0da;
            }
            .cp_callout.warning .titre {
                border-bottom    : 5px solid var(--col-warning);
                background-color : var(--col-warning);
                color            : #fdf3d0;                
            }
            .cp_callout .content {
                display: none;
                padding: 10px;
                background-color    : #fff;
                max-height: 150px; /* Hauteur maximale du conteneur pour éviter que le contenu ne déborde */
                overflow-y: auto; /* Ajoute une barre de défilement si le texte dépasse la hauteur définie */
            } 
            .cp_callout.danger .content {
                background-color : #fdd8d0;
                color            : var(--col-danger);                
            }
            .cp_callout.info .content {
                background-color : #d0d8fd;
                color            : var(--col-info);                

            }
            .cp_callout.note .content {
                background-color : #d0f0da;
                color            : var(--col-note);                

            }
            .cp_callout.warning .content {
                background-color : #fdf3d0;
                color            : var(--col-warning);                

            }

            /*-------------------------------*/
            /* .cp_wysedit_article {
            styles généraux de l'article
            } 
            */

            .cp_wysedit_section {
                margin-bottom: 1em;
            }

            .cp_wysedit_h2 {
            font-size: 1.5em;
            margin-bottom: 0.5em;
            }

            .cp_wysedit_div {
            display: flex;
            gap: 1em;
            }

            .cp_wysedit_content {
            flex: 1;
            border: 1px solid #ccc;
            padding: 0.5em;
            min-height: 100px;
            background-color: #fff;
            }

            .cp_wysedit_aside {
            width: 150px;
            background-color: #f0f0f0;
            padding: 0.5em;
            }

            .cp_wysedit_textarea {
            width: 100%;
            min-height: 150px;
            font-family: monospace;
            font-size: 1em;
            margin-top: 1em;
            }

            .cp_wysedit_view {
            border: 1px solid #ccc;
            padding: 0.5em;
            min-height: 150px;
            background-color: #fafafa;
            }

            /*-------------------------------------------------*/
            .cp_voxzone_textarea {
            width: 100%;
            min-height: 150px;
            font-family: monospace;
            font-size: 1em;
            margin-top: 1em;
            }

            .cp_voxzone_textarea2 {
                background: rgba(255, 255, 255, 0.92);
                font-size: 1.1rem;
                line-height: 1.8;
                border-radius: 6px;
                padding: .8rem;
            }

            /* ---  */
            .cp_rvoxzone_listening{
                background: rgba(0, 0, 0, 0.65);
            }
            /*---*/


            .cp_scene {
                position: relative;
                display: flex;
                justify-content: space-between;
                align-items: flex-end;
                min-height: 420px;
                background-size: cover;
                background-position: center;
                border-radius: 8px;
                overflow: hidden;
                padding: 1rem;
            }
            .cp_scene::before {
                content: '';
                position: absolute;
                inset: 0;
                background: rgba(0, 0, 0, 0.45);
                z-index: 0;
            }

            .cp_actor {
                position: relative;
                z-index: 1;
            }
            .cp_actor {
                display: flex;
                flex-direction: column;
                align-items: center;
                max-width: 220px;
            }

            .cp_actor img {
                max-height: 320px;
                object-fit: contain;
                filter: drop-shadow(2px 4px 8px rgba(0,0,0,.7));
            }

            .cp_actor__name {
                color: #fff;
                font-style: italic;
                text-shadow: 1px 1px 4px #000;
                margin-top: .4rem;
            }

            /* flip Juliette pour qu'elle "regarde" Roméo */
            .cp_actor--right img {
                transform: scaleX(-1);
            }
            /* Transition douce sur toutes les propriétés visuelles des acteurs */
            .cp_actor img { transition: filter 0.35s ease; }
            .cp_actor__name { transition: color 0.35s ease, text-shadow 0.35s ease, font-weight 0s; }
            /* ── Acteur en train de parler : géré par vox.renderer.js ─────────────────── */
            /*    bus event vox:start → setActorSpeaking(alias) → toggle .cp_actor--speaking */
            .cp_actor--speaking img {
                filter:
                    drop-shadow(0 0 18px rgba(255, 204, 0, 0.90))
                    drop-shadow(0 0  8px rgba(255, 160, 0, 0.60))
                    drop-shadow(2px 4px 8px rgba(0, 0, 0, 0.70));
            }

            .cp_actor--speaking .cp_actor__name {
                color       : #ffcc00;
                font-weight : bold;
                text-shadow :
                    0 0 10px rgba(255, 204, 0, 0.70),
                    1px 1px 4px #000;
            }            
            .cp_scene__subtitles {
                position: absolute;
                bottom: 1rem;
                left: 50%;
                transform: translateX(-50%);
                width: 80%;
                text-align: center;
                background: rgba(0, 0, 0, 0.65);
                color: #fff;
                font-size: 1.2rem;
                line-height: 1.8;
                padding: .5rem 1rem;
                border-radius: 6px;
                min-height: 2.5rem;
                z-index: 2;
            }

            /* le mot en cours mis en rouge par vox.js */
            .cp_scene__subtitles span {
                color: #ffcc00;
                font-weight: bold;
            }

            /* carousel ---------------------------------------------------------------- */
            .cp_carousel {
                position: relative;
                width: 100%;
                overflow: hidden;
                border-radius: 6px;
            }

            /* Ratio desktop 16/9 */
            .cp_carousel-ready {
                aspect-ratio: 16 / 9;
            }

            .cp_carousel img {
                width: 100%;
                height: 100%;
                object-fit: cover;
            }

            .cp_slide {
                position: absolute;
                inset: 0;
                display: none;
            }

            .cp_slide.active {
                display: block;
            }
            /* leaflet ---------------------------------------------------------------- */
            .leafletContainer{  display: flex;  flex-direction: column; }

            #leafletMap{
                flex: 1 0 auto;
                padding: 5px;
                height: 40vh;
                box-shadow: 0 0 10px #999;
            }

            #leafletInfo{
                flex: 0 1 auto;
                padding: 1vw;
                height: 10vh;
            }


            


            /*---------------------- dialog et forms ---------------------------------------*/
            /* -------------------------------  */
            /* Formulaire */
            form.form_style1 {
            border-radius: 5px;
            background-color: #f2f2f2;
            padding: 20px;
            display:flex;
                flex-wrap: wrap;
            }


            form.form_style1 > label {
            /* display: block; */
            width: 40%;
            padding: 12px;
            margin: 8px 0;
            display: inline-block;
            border: 1px solid #9be7b4;
            border-radius: 4px;
            box-sizing: border-box;
            }


            form.form_style1 select {
            width: 60%;
            padding: 12px;
            margin: 8px 0;
            display: inline-block;
            border: 1px solid #9be7b4;
            border-radius: 4px;
            box-sizing: border-box;
            }

            form.form_style1 input[type="text"] , 
            form.form_style1 input[type="email"], 
            form.form_style1 input[type="number"], 
            form.form_style1 input[type="date"],
            form.form_style1 input[type="password"]
            {
            width: 60%;
            padding: 12px;
            margin: 8px 0;
            display: inline-block;
            border: 1px solid #9be7b4;
            border-radius: 4px;
            box-sizing: border-box;
            }

            form.form_style1 input[type=text]:invalid {
                border: 4px solid #972e3c;
            }

            /* a conserver pour rwd ??
            form.form_style1 input[type="radio"] {
            width: 60%;
            padding: 12px;
            margin: 8px 0;
            display: inline-block;
            border: 1px solid #9be7b4;
            border-radius: 4px;
            box-sizing: border-box;
            }
            form.form_style1 input[type="radio"]:checked {
            border: 6px solid black;
            box-shadow: 0 0 0 3px orange;

            }
            #form3 > label.radio > input[type=radio]

            #form3 > div.radio > label:nth-child(1)
            */

            div.radio {
            display: inline-flex;
            flex-direction: row;
            width: 100%;
            border: 1px solid #9be7b4;
            }

            div.radio > label{
            flex:1 0 auto;
            padding: 12px;
            /*margin: 8px 0;*/
            border-radius: 4px;
            }

            div.radio  > label > input[type="radio"]:checked {
            border: 6px solid black;
            box-shadow: 0 0 0 3px orange;

            }


            div.checkbox {
            display: inline-flex;
            flex-direction: row;
            width: 100%;
            border: 1px solid #9be7b4;
            }

            div.checkbox > label{
            flex:1 0 auto;
            padding: 12px;
            /*margin: 8px 0;*/
            border-radius: 4px;
            }

            div.checkbox  > label > input[type="checkbox"]:checked {
            border: 6px solid black;
            box-shadow: 0 0 0 3px orange;

            }



            form.form_style1 textarea {
            width: 100%;
            padding: 12px;
            margin: 8px 0;
            display: inline-block;
            border: 1px solid #9be7b4;
            border-radius: 4px;
            box-sizing: border-box;
            }
            

            form.form_style1 input[type=submit] {
            width: 60%;
            padding: 12px;
            margin: 8px auto;
            display: inline-block;
            border: 1px solid #45a049;;
            background-color: #9be7b4;;
            border-radius: 4px;
            box-sizing: border-box;
            }

            form.form_style1 input[type=submit]:hover {
            background-color: #45a049;
            }


            /*


            input[type=submit] {
            width: 100%;
            background-color: #4CAF50;
            color: white;
            padding: 14px;
            margin: 8px 0;
            border: none;
            border-radius: 4px;
            cursor: pointer;
            }


            */



            /* COMPOSANT dialog  */
            /* État ouvert du dialogue */
            dialog:open {
            opacity: 1;
            transform: scaleY(1);
            margin: auto;
            width: 80vw;
            min-height: 40vh;
            }

            /* État fermé du dialogue */
            dialog {
            opacity: 0;
            transform: scaleY(0);
            transition:
                opacity 0.7s ease-out,
                transform 0.7s ease-out,
                overlay 0.7s ease-out allow-discrete,
                display 0.7s ease-out allow-discrete;
            /* Equivalent to
            transition: all 0.7s allow-discrete; */
            }

            /* État avant ouverture */
            /* Doit se trouver après la règle dialog:open précédente pour prendre effet,
                car la spécificité est la même */
            @starting-style {
            dialog:open {
                opacity: 0;
                transform: scaleY(0);
            }
            }

            /* Transition du ::backdrop lorsque la boîte de dialogue modale est promue en couche supérieure */
            dialog::backdrop {
            background-color: transparent;
            transition:
                display 0.7s allow-discrete,
                overlay 0.7s allow-discrete,
                background-color 0.7s;
            /* Equivalent to
            transition: all 0.7s allow-discrete; */
            }

            dialog:open::backdrop {
            background-color: rgb(0 0 0 / 25%);
            }

            /* Cette règle @starting-style ne peut pas être imbriquée dans le sélecteur ci‑dessus
            car le sélecteur imbriqué ne peut pas représenter des pseudo-éléments. */

            @starting-style {
            dialog:open::backdrop {
                background-color: transparent;
            }
            }

            /*----------------------------------------------------------------------------------------*/




            /* RWD ONLY ========================================== */



            @media (min-width: 768px) {
                /* -------------------- nav pc ------------------------------------- */
                /* La nav redevient une barre horizontale */
                nav {
                    position: relative;
                    flex-direction: row;
                    align-items: stretch;
                    width: 100%;
                    transform: translateX(0);
                    overflow: visible;         /* FIX : laisser les dropdowns déborder */
                    z-index: 100;              /* FIX : passer au-dessus de main */
                }

                nav a.closebtn { display: none; }

                /* ── nav-article : cellule de menu ─────────────────────────── */

                .nav-article {
                    position: relative;   /* ancre le dropdown en absolu */
                    flex-direction: row;
                    align-items: stretch;
                }

                /* Pont invisible sous le titre pour éviter le gap de hover     */
                /* Sans lui, la souris quitte .nav-article avant d'atteindre    */
                /* le dropdown (qui est hors flux car position:absolute)         */
                .nav-article::after {
                    content: '';
                    display: block;
                    position: absolute;
                    top: 100%;
                    left: 0;
                    width: 100%;
                    height: 12px;         /* pont de 12 px entre titre et dropdown */
                    z-index: 101;
                }

                .nav-article .nav-header-row {
                    height: 100%;
                }

                .nav-article .nav-title {
                    white-space: nowrap;
                    height: 100%;
                }

                /* Masquer le chevron sur PC */
                .nav-article .nav-toggle {
                    display: none;
                }

                /* ── Dropdown ──────────────────────────────────────────────── */

                .nav-article .nav-toc {
                    display: none;
                    position: absolute;
                    top: calc(100% + 2px);  /* juste sous la barre, chevauchement avec le pont */
                    left: 0;
                    min-width: 260px;
                    max-height: 75vh;
                    overflow-y: auto;
                    z-index: 200;            /* FIX : au-dessus du header d'article */
                    box-shadow: 0 4px 16px rgba(0,0,0,0.35);
                    /*background-color: var(--col-A);*/
                }

                /* Affichage au survol de n'importe quelle partie de .nav-article */
                .nav-article:hover .nav-toc {
                    display: block;
                }

                /* Annuler la classe .open (gestion mobile) sur PC */
                .nav-article.open .nav-toc {
                    display: none;
                }
                .nav-article.open:hover .nav-toc,
                .nav-article:hover .nav-toc {
                    display: block;
                }

                /* Liens dropdown PC */
                .nav-article .nav-toc a     { padding: 7px 16px; font-size: 0.88em; }
                .nav-article .nav-toc ul a  { padding-left: 30px; }
                .nav-article .nav-toc ul ul a { padding-left: 46px; }

                /* ── article section reste en row sur PC (inchangé) ────────── */
                article > section > div            { flex-direction: row; }
                article > section > div > aside    { flex: 0 0 360px; height: auto; padding: 1vw; }
                article > section > div > div      { flex: 1 1 auto; width: auto; height: auto; padding: 1vw; }


                /* 
                .rwdnav{ display: none; } 
                deplacer dans section en tete sous header
                */

                /* -------------------- article pc ------------------------------------- */
                article > section > div{ 
                    display         : flex;
                    flex-direction  : row;
                }
                article > section > div > aside{
                    flex: 0 0 360px;
                    height: auto;
                    padding: 1vw;    
                }
                article > section > div > div{
                    flex: 1 1 auto;
                    width: auto;
                    height: auto;
                    padding:1vw;  
                }

            }  












            /* THEMING ZONE COLOR ONLY ========================================== */
            /* Use the variables */
            body {
                background-color: var(--bgcolor);
                color: var(--textcolor);
            }
            /* ------------------------------------------------------------
                --bgcolor: lightblue;
                --textcolor: darkblue;
                --col-A : #eee236ff; jaune
                --col-B : #ade456ff; vert
                --col-C : #efefef; gris
                --col-D : #000000; noir
                --col-E:  #ffffff; blanc           
             */

            nav { 
                background-color    :   var( --col-D );/* darkblue */
                color               :   var( --col-A ); 
            }
            nav a { 
                color               :   var(--col-E ); 
            }
            nav a:hover { /* Navbar links on mouse-over */
                background-color    :   var(--col-B);
                color               :   var(--col-D );
            }
            /* Current/active navbar link */
            nav a.active { 
                background-color    :   var(--col-A);
                color               :   var(--textcolor ); 
            }
            
            /* Current/active navbar  */
            /*
            .nav-article .active 
            {
                background-color    :   var(--col-A);
                color               :   var(--textcolor ); 
            }*/

            .nav-article{
                color               :   teal; 
            } 

            /* ------------------------------------------------------------ */
            header{
                background-color: var( --textcolor );
                color: var(--bgcolor); 
            }

            header > h1{  
                color: var( --col-A );
            }

            .header-auth {
                color : var(--col-A)
            }
            
            .auth-link {
                color : var(--col-B)
            }
            /*--------------------------------------------------------------- */
            .nav-article .nav-toc {
                background-color: var(--textcolor);
            }
            /* ------------------------------------------------------------ */        
            article > header > h1 {  
                color: var( --col-C );
            }
            
            article > section > h2::before {
                content: '\1F537';
            }
            article > section > div > div > h3::before {
                content: '\1F4D1';
            }
            article > section > div > div > h4::before {
                content: '\25C8';
            }
            


        </style>
        
            <!-- on importe ou on emploie ici la vue plutot que le template -->
    <script src="https://cdn.jsdelivr.net/npm/apexcharts"></script>

    <!-- -------------------------------  leaflet ------------------------------------  -->
    <link rel="stylesheet" href="https://unpkg.com/leaflet@1.9.4/dist/leaflet.css"/>
    <link rel="stylesheet" href="/assets/css/GpPluginLeaflet.css"/>

    <script src="https://unpkg.com/leaflet@1.9.4/dist/leaflet.js"></script>
    <script src="https://unpkg.com/leaflet-tilelayer-wmts@1.0.0/dist/leaflet-tilelayer-wmts.js"></script>
    <!-- Extension Géoplateforme pour Leaflet -->
    <script src="/assets/js/plugins/GpPluginLeaflet.js"></script>

    <!-- -------------------------------  threejs ------------------------------------  -->
    <script type="importmap">
    {
        "imports": {
            "three": "https://unpkg.com/three@0.160.0/build/three.module.js",
            "three/addons/": "https://unpkg.com/three@0.160.0/examples/jsm/"
        }
    }
    </script>



    <script type="module">
        import { bus } from '/assets/js/core/eventBus.js'
        import { initSidebar } from '/assets/js/ihm/sidebar.js'
        import { initTabs } from '/assets/js/ihm/tabspage.js'
        import * as domhelper from '/assets/js/core/domhelper.js'

        import { probeClientCapabilities } from '/assets/js/core/clientinfo.js'
        /**
         * Sonde les capacités du navigateur et les publie sur le bus ('client:info').
         * Utile pour les décisions d'interface que le CSS ne peut pas prendre
         * (présence du tactile, permissions, speech synthesis, connexion réseau, etc.)
         *
         * Usage dans index.php :
         *   import { probeClientCapabilities } from '/assets/js/core/clientinfo.js'
         *   const info = await probeClientCapabilities()
         */        
        
        import { initCallout } from '/assets/js/ihm/callout.js'
        import { initWysedit } from '/assets/js/ihm/wysedit.js'
        //260503-001
        //import { initMotForm } from '/assets/js/features/mot/mot.form.js'  
        //import { initMotController } from '/assets/js/features/mot/mot.controller.js'  
        //import { initMotRenderer } from '/assets/js/features/mot/mot.renderer.js'  
        
        // ── Features — un import par feature ────────────────────────────────
        //2026-05-09-004
        import { 
                initMotController,
                initMotRenderer,
                initMotForm } from '/assets/js/features/mot/index.js'
        
        // image
        import { initImageController, initImageRenderer, initImageForm } from '/assets/js/features/image/index.js'

        // formejuridique
        import { initFjController, initFjRenderer, initFjForm } from '/assets/js/features/formejuridique/index.js'
        // code NAF
        import { initNafController, initNafRenderer, initNafForm } from '/assets/js/features/codenaf/index.js'
        
        // adresse / typevoie
        import { initTvController, initTvRenderer, initTvForm } from '/assets/js/features/typevoie/index.js'
        // adresse /codepostal
        import { initCpController, initCpRenderer, initCpForm } from '/assets/js/features/codepostal/index.js'
        // adresse
        import { initAdresseController, initAdresseRenderer, initAdresseForm } from '/assets/js/features/adresse/index.js'

        //20260510-001 PCG
        import { initPcgController, initPcgRenderer } from '/assets/js/features/pcg/index.js'
        // organisation
        import { initOrgController, initOrgRenderer, initOrgForm } from '/assets/js/features/organisation/index.js'
        // entreprise
        import { initEntController, initEntRenderer, initEntForm } from '/assets/js/features/entreprise/index.js'
        
        import { initAuthController, initAuthRenderer }  from '/assets/js/features/auth/index.js'        

        import { initVoxBus } from '/assets/js/core/vox.js'
        // 2026-05-16
        import { initVoxRenderer } from '/assets/js/core/vox.renderer.js'
        import { initVoxListen } from '/assets/js/core/vox.listen.js'
        import { initSceneBg }     from '/assets/js/ihm/cp_scene_bg.js'

        
        /* --------------  COMPONENTS -----------------------------------------*/
        //import { initCodeVal } from '/assets/js/ihm/codeval.js'
        // modif controller necessaire = faite
        import { initCodeVal } from '/assets/js/components/codeval.js'
        //import { initApex } from '/assets/js/plugins/apex.js'
        // modif controller necessaire = en cours
        import { initApex } from '/assets/js/components/apex.js'
        
        //import mermaid from '/assets/js/plugins/mermaid.js'
        import { initMermaid } from '/assets/js/components/mermaid.js'

        /* --------------  COMPONENTS -----------------------------------------*/

        import { initCarousel } from '/assets/js/ihm/carousel.js'        
        // ── Leafleet ──────────────────────────────────────────────────────
        import { initLeaflet } from '/assets/js/plugins/mapleaflet.js'
        // ── Leafleet ──────────────────────────────────────────────────────
        import { initThreejs } from '/assets/js/ihm/3js.js'
        //----     Dialog
        import { initDialog } from '/assets/js/ihm/dialog.js'
        import { initForms } from '/assets/js/ihm/formsManager.js'


        // ── Globals bus ──────────────────────────────────────────────────────
        //260503-001
        window.validateForm = (evt) => {
            //evt.preventDefault()
            bus.publish('forms:submit', evt)
            return false
        }

        window.eventBusPublish= (evt , EvtName  , Page )=> {
            bus.publish( EvtName, Page )
        }
        //window.testLeafelt = initLeaflet

        //--------------------------------------------
        // Threejs a utiliser **eventBusPublish**
        window.threeList = () => { bus.publish('threejs:list') }
        window.threeStart = (id ) => { bus.publish('threejs:start', id ) }
        window.threeStop = (id ) => { bus.publish('threejs:stop', id )  }

        //--------------------------------------------
        // dialog
        window.showModal = (id) => bus.publish('dialog:show', id)
        window.closeModal = (id) => bus.publish('dialog:close', id)


        // ── DOM ready ────────────────────────────────────────────────────────

        document.addEventListener("DOMContentLoaded", function () {
            initSidebar()
            initTabs()
            domhelper.init()
            initCallout()
            initWysedit()
            initCodeVal()
            initApex()
            initMermaid()
            initCarousel()
            initDialog()
            initForms()
        })

        window.addEventListener('load', () => {
            probeClientCapabilities()
            
            // Auth — en premier, les autres features en dépendent
            initAuthController()
            initAuthRenderer()
            
            //déclenche la vérification au démarrage            
            bus.publish('auth:check')

            // Features métier
            initMotForm() ; initMotController(); initMotRenderer() //mot

            initNafForm() ; initNafController() ; initNafRenderer() // code NAF

            initPcgController(); initPcgRenderer() // plan comptable général
            
            initImageForm() ; initImageController() ; initImageRenderer()
            
            initFjForm() ; initFjController(); initFjRenderer() // forme juridique des entreprises et organisation

            initOrgForm(); initOrgController();  initOrgRenderer() //organisation
            initEntForm();  initEntController();  initEntRenderer() // entreprise            
            
            initTvForm() ; initTvController() ; initTvRenderer() // adresse / typevoie
            initCpForm() ; initCpController() ; initCpRenderer() // adresse / codepostal
            initAdresseForm() ; initAdresseController() ; initAdresseRenderer()// adresse


            bus.publish('carousel:glen', '1') // Longueur d'un carousel (debug) voir js/ihm/carousel/CarouselManager.js
            bus.publish('carousel:run', '1')
            //bus.publish('carousel:run', '2')
            //bus.publish('carousel:run:all')
            //bus.publish('carousel:stop' , '2') // a tester avec bouton
            //bus.publish('carousel:colmin','1') // ??
            initVoxBus()
            initVoxRenderer()   // ← rendu UI vox (highlights, acteurs, voix)
            initVoxListen()
            initSceneBg()       // ← fond SVG animé pour .cp_scene
            
            initLeaflet()

            initThreejs()

            // ── Test autocomplete ────────────────────────────────────────────────
            const acField = document.getElementById('acTestField')
            if (acField) {
                const ac = domhelper.autocomplete({
                    id          : 'acMot',
                    name        : 'mot_id',
                    placeholder : 'Rechercher un mot…',
                    busRequest  : 'mot:ui:like',
                    busResponse : 'mot:ui:response',
                    labelKey    : 'mot_lbl',
                    valueKey    : 'mot_id',
                    onSelect    : (item) => {
                        document.getElementById('acTestValue').textContent = item.mot_lbl
                        document.getElementById('acTestId').textContent    = item.mot_id
                    }
                })
                acField.appendChild(ac.wrapper)
            }


        })

    </script>            
        
    </head>

    <body>
            <header>
        <div class="header-top">
 
            <!-- Bouton hamburger — ouvre la nav mobile -->
            <button class="rwdnav" onclick="openNav()" aria-label="Ouvrir le menu">
                <i class="fa fa-bars" aria-hidden="true"></i>
            </button>
 
            <div class="header-titles">
                <h1>Index du portail</h1>
                <p>Présentation du portail.</p>
            </div>
 
            <!-- Zone authentification -->
            <div class="header-auth">
                                    <form class="auth-form" action="/login" method="post">
                        <input type="hidden" name="csrf_test_name" value="af334fc3f6799f6dcf25a68a635776b5">                        <label class="sr-only" for="auth-email">Email</label>
                        <input id="auth-email" type="email" name="email"
                               placeholder="Email" autocomplete="username">
                        <label class="sr-only" for="auth-password">Mot de passe</label>
                        <input id="auth-password" type="password" name="password"
                               placeholder="Mot de passe" autocomplete="current-password">
                        <button type="submit">
                            <i class="fa fa-fw fa-sign-in" aria-hidden="true"></i>
                            <span>Login</span>
                        </button>
                    </form>
                            </div>
 
        </div>
    </header>    
        
    <nav id="sidebar">

        <a href="javascript:void(0)" class="closebtn" onclick="closeNav()">
            &times;
        </a>

                
    </nav>

            
    <main>

                <!-- ── Article : Accueil du portail ── -->
        <article
            id="tab1"
            class="cp_soft-card"
            style="display: block;"        >
            <header>
                <h1>Accueil du portail</h1>
                <p>Présentation du portail. Quand, qui, quoi, où, comment, pourquoi.</p>
                <div id="tab1_menu"></div>
            </header>

                        <section>
                <h2>Bienvenue</h2>
                                    <div>
                        <div>
                            <h3>But</h3>
                            Ce portail me permet de partager des informations sur des sujets variés, ces sujets sont relatifs à :<ul><li>mes passions</li><li>mon expérience</li><li>mes projets</li></ul>			
                        </div>
                                                    <aside>
                                <a href="/technologies">Rubrique</a>                            </aside>	            
                                            </div>
                                    <div>
                        <div>
                            <h3>Présentation</h3>
                            Plutôt pragmatique, j'ai une formation d'électrotechnicien. Mon expérience se résumerait en 20 ans d'exploitation et maintenance, près de 10 ans dans le service et les énergies, et 4 ans d'enseignement.<br>

                                    
                                    			
                        </div>
                                                    <aside>
                                <a href="/cv">Parcours pro</a>                            </aside>	            
                                            </div>
                                    <div>
                        <div>
                            <h3>Motivations</h3>
                            L'évolution de l'intelligence artificielle m'a permis de progresser dans la gestion de la stack web. Depuis 14 mois je me familiarise avec CodeIgniter et Laravel, deux frameworks PHP.			
                        </div>
                                            </div>
                            </section>
                        <section>
                <h2>Actualités</h2>
                                    <div>
                        <div>
                            <h3>Architecture CMS</h3>
                            Le portail évolue, la rubrique technologies permet une intégration rapide de documents en production.			
                        </div>
                                                    <aside>
                                <a href="/technologies">Rubrique</a>                            </aside>	            
                                            </div>
                                    <div>
                        <div>
                            <h3>Authentification</h3>
                            L'authentification est configurée pour la partie front et les tokens pour API.			
                        </div>
                                                    <aside>
                                <a href="/cv">Parcours pro</a>                            </aside>	            
                                            </div>
                                    <div>
                        <div>
                            <h3>Structure</h3>
                            Les pages devront employer la même structure mise en forme par CSS.			
                        </div>
                                            </div>
                            </section>
                        <section>
                <h2>Environnement</h2>
                                    <div>
                        <div>
                            <h3>Hébergement</h3>
                            Le portail est hébergé sur un serveur mutualisé chez OVH.			
                        </div>
                                                    <aside>
                                <a href="/technologies">Rubrique</a>                            </aside>	            
                                            </div>
                                    <div>
                        <div>
                            <h3>Stack</h3>
                            OVH fournit les services SSH, FTP, HTTPS ,PHP, messagerie et Base de données. J'ai choisi Code Ingiter pour le backend, la partie front est réalisé en HTML,SVG et Javascript et CSS			
                        </div>
                                                    <aside>
                                <a href="https://codeigniter.com" target="_blank">codeigniter.com</a>                            </aside>	            
                                            </div>
                            </section>
            
        </article>
                <!-- ── Article : Technologies ── -->
        <article
            id="tab2"
            class="cp_soft-card"
                    >
            <header>
                <h1>Technologies</h1>
                <p>Nous sommes enchantés de vous accueillir dans cet espace dédié aux technologies qui nous passionnent, que nous maitrsions de part nos activités dans différents secteurs.</p>
                <div id="tab2_menu"></div>
            </header>

                        <section>
                <h2>Introduction</h2>
                                    <div>
                        <div>
                            <h3>Contexte</h3>
                            A travers les différents articles et contenus que vous découvrirez ici, nous aspirons à vous fournir des informations quant à des solutions technologiques et procédés.<br>Après une formation de 7 années dans les sciences et technologies industrielles, nous avons acquis une expertise dans les domaines de l'électrotechnique et des compétences complémentaires.<br>
                                    Nos 20 années d'expérience, riches et variées, dans les secteurs industriels, résidentiels, tertiaires et hospitaliers, nous ont sensibilisés aux enjeux cruciaux de l'exploitation, telle que la disponibilité, l'organisation, la réactivité et la sécurité.<br>Cette diversité de parcours nous a permis d'acquérir une vision globale du métier d'électricien, mais également de nous spécialiser dans la maîtrise des énergies et de la maintenance.<br>
                                    Sur un site Seveso 2, dans le secteur médical, en industrie, dans le tertiaire, les salles informatiques et le bâtiment j'ai exploité et mis en oeuvre des equipements nécessaires pour les activités et la sécurité.<br>Nous vous invitons à explorer notre portail pour découvrir des informations pertinentes, nos projets, et à nous apporter votre soutien et votre confiance.<br>N'hésitez pas à nous contacter pour toute demande d'information supplémentaire ou pour discuter de la manière dont nous pouvons vous aider à atteindre vos objectifs.<br>			
                        </div>
                                                    <aside>
                                <a href="https://zealot.fr/technologies">https://zealot.fr/technologies</a><br>
                                    <ul>
                                        <li><a href="https://zealot.fr/technologies/acp/">📁 /acp</a>
                                        <ul>
                                            <li>
                                                <a href="https://zealot.fr/technologies/acp/presentation">📄 /acp/presentation</a>
                                            </li>
                                        </ul>    
                                        <li>
                                            <a href="https://zealot.fr/technologies/gaz">📁 /gaz</a>
                                        </li>
                                        <li>
                                            <a href="https://zealot.fr/technologies/aut">📁 /aut</a>
                                        </li>
                                        <li>
                                            <a href="https://zealot.fr/technologies/chf">📁 /chf</a>
                                            
                                            <ul>
                                                <li><a href="https://zealot.fr/technologies/chf/bois">📄 /bois</a>
                                                <li><a href="https://zealot.fr/technologies/chf/remeha">📄 /remeha</a>
                                                <li><a href="https://zealot.fr/technologies/chf/varblok">📄 /varblok</a>
                                                <li><a href="https://zealot.fr/technologies/chf/varmax">📄 /varmax</a>
                                            </ul>
                                        </li>
                                        <li>
                                            <a href="https://zealot.fr/technologies/eau">📁 /eau</a>
                                        </li>                                            
                                        <li>
                                            <a href="https://zealot.fr/technologies/ecs">📁 /ecs</a>
                                        </li>                                    
                                        <li>                                        
                                            <a href="https://zealot.fr/technologies/vap">📁 /vap</a>
                                            <ul>
                                                <li>
                                                    <a href="https://zealot.fr/technologies/vap/requalification">📄 /vap/requalification</a>
                                                </li>                                                    
                                            </ul>
                                        </li>
                                        <li>
                                            <a href="https://zealot.fr/technologies/hyd">📁 /hyd</a>
                                        </li> 
                                        <li>
                                            <a href="https://zealot.fr/technologies/eln">📁 /eln</a>
                                        <ul>
                                            <li><a href="https://zealot.fr/technologies/eln/arduino">📄 /eln/arduino</a></li>                                     
                                            <li><a href="https://zealot.fr/technologies/eln/interruptions">📄 /eln/interruptions</a></li> 

                                        </ul>
                                        <li>
                                            <a href="https://zealot.fr/technologies/wrk">📁 /wrk</a>
                                        </li> 
                                        <li>
                                            <a href="https://zealot.fr/technologies/com">📁 /com</a>
                                            <ul>
                                                <li><a href="https://zealot.fr/technologies/com">📄 /com/rs485</a></li> 
                                                <li><a href="https://zealot.fr/technologies/com">📄 /com/ethernet</a></li> 
                                                <li><a href="https://zealot.fr/technologies/com">📄 /com/lora</a></li> 
                                            </ul>
                                        </li>
                                        <li>
                                            <a href="https://zealot.fr/technologies/sec">📁 /sec</a>
                                        </li> 
                                                                </aside>	            
                                            </div>
                            </section>
            
        </article>
                <!-- ── Article : Histoire ── -->
        <article
            id="tab3"
            class="cp_soft-card"
                    >
            <header>
                <h1>Histoire</h1>
                <p>Sans être spécialiste dans le domaine, je me passionne pour la chose à l&#039;occasion de découverte et de recherches.</p>
                <div id="tab3_menu"></div>
            </header>

                        <section>
                <h2>Introduction</h2>
                                    <div>
                        <div>
                            <h3>Une passion</h3>
                            Natif de Picardie, j'ai pu parcourir l'histoire de France pendant quelques kilomètres. Dans mon enfance j'ai eu la chance de pouvoir écouter le témoignage des anciens. Les randonnées en VTT comme la spéléologie me permirent de concilier sport et histoire.
                                    L'histoire est un héritage parfois difficile à supporter mais il doit être assumer et pour assumer cet héritage faut il encore le connaitre.
                                    On dit que l'on n'est pas responsable des actes des ses anciens mais pourtant on est bien fier d'avoir d'illustres prédécesseurs; je pense sincèrement qu'on ne peut être sage en ignorant comment nous sommes devenus contemporains de ce monde.
                                    Comprendre l'histoire familiale vous démontre qu'aucune vérité n'est jamais unique. On peut rejeter les valeurs d'une civilisation mais on ne peut aborder son passé sans essayer de comprendre son contexte culturel, social et politique
                                    
                                    Dans cette rubrique nous aborderons principalement des événements que j'ai souvent découvert par le cinéma, au hasard de discussions passionnées ou à l'occasion d'un trajet.
                                    Certaines découvertes m'ont particulièrement intéressé et je les ai complétées parfois par des recherches et des lectures.
                                    
                                    Enfin le projet de gérer ces évènements me permet de progresser notamment dans la gestion des relations entre les données			
                        </div>
                                                    <aside>
                                Rubrique a construire                            </aside>	            
                                            </div>
                            </section>
                        <section>
                <h2>Saint Leau d&#039;Esserent</h2>
                                    <div>
                        <div>
                            <h3>Transcriptions du rapport 1944-06-30-NAID-5555460</h3>
                            <h4>Identité</h4>GOLKE, CLIFFORD G<br>Sergent-chef , matricule 16132121, 9e Groupe de Bombardement USAF
                                    <h4>Rapport</h4>
                                    Date, heure et lieu approximatif du crash ou de l'atterrissage de l'avion.<br> 
                                    10 AVRIL 1944 VERS 10H00 ENVIRON 4 KILOMÈTRES AU SUD-OUEST DE SAINT-VAAST-LES-MELLO. AU NORD DE PARIS.<br><br>
                                    Nature et étendue des dommages subis par l'avion au moment de l'éjection. L'avion était-il en feu ?<br>
                                    Toute l'aile droite était en feu, le moteur n° 1 était en train de s'éteindre et l'aile commençait à se détacher entre les moteurs n° 3 et 4.<br><br>
                                    À quelle altitude approximative l'éjection a-t-elle eu lieu ?<br> Environ 6 100 m (20 000 pieds).<br><br>
                                    Des membres d'équipage ont-ils été blessés ou tués avant le crash ?<br> Non.<br><br>
                                    Combien de membres d'équipage ont sauté en parachute ? Leurs parachutes se sont-ils ouverts ?<br>
                                    Manahan, Justice, Hedlund, Dearing, Harnahan, Moedebeck, Hard, ont sauté en parachute. Thompson, Enstrom, je ne sais pas. J'ai vu deux hommes tomber sans que leurs parachutes ne s'ouvrent.<br><br>
                                    La source a-t-elle vu d'autres membres de l'équipage, morts ou vivants, après l'atterrissage ?<br>
                                    J'ai vu deux hommes tomber, seulement de loin, dont les parachutes ne se sont pas ouverts. J'ai pris contact avec Cletus Hard le lendemain.<br><br>
                                    A-t-il reçu des informations d'autres personnes quant au sort des autres membres de l'équipage ? Si oui, veuillez fournir les détails fournis par son informateur et indiquer si les autres membres d'équipage ont été identifiés par leur nom ou autrement.<br>Les Français ont apporté les noms de Thompson, Moedebeck et Harnahan comme étant morts. Ils ont donné une bonne description de Justice, qui a été capturé. Ils amenaient Hedlund et Dearing pour nous rejoindre, mais les Allemands les ont capturés en chemin. Un Français s'est échappé.<br><br>
                                    La source a-t-elle examiné l'épave de l'avion ? Si oui, dans quel état était-elle ?<br> Non, je ne me suis pas approché suffisamment. Faible taux d'oxygène dans le champ, train d'atterrissage dans les bois et partie du fuselage dans le champ.<br><br>
                                    Si l'avion s'est abîmé en mer, à quelle distance se trouvait-il de la côte ?<br><br>
                                    Comment la source a-t-elle été secourue ? Quels radeaux de sauvetage, débris, etc., sont restés à la surface et auraient pu aider les autres membres d'équipage à se maintenir à flot ?<br><br>
                                     Quel est l'avis de la source quant au sort des autres membres d'équipage et pourquoi ? <br>Ouvrir les parachutes trop tôt a peut-être permis aux Allemands de capturer deux membres d'équipage dès le premier jour.
                                    			
                        </div>
                                                    <aside>
                                
                                    ref interne : 1944-06-30-NAID-5555460<br>
                                    Date du rapport : 30 JUIN 1944<br>
                                    Date évenement : 10 AVRIL 1944, vers 10:00<br>
                                    <br>
                                    Localisation : 4 KILOMÈTRES AU SUD-OUEST DE SAINT-VAAST-LES-MELLO. AU NORD DE PARIS.
                                    <br>

                                    Personnes<br>
                                    nom : GOLKE, CLIFFORD G.<br>
                                    qualité : Militaire (grade=S/Sgt) (ASN=16132121) (Unite: USAF 9FTH BOMB GP.)<br>
                                    Manahan<br>
                                    Justice<br>
                                    Hedlund<br>
                                    Dearing<br>
                                    Harnahan<br>
                                    Moedebeck<br>
                                    Hard<br>
                                    Thompson<br>
                                    Enstrom<br>

                                    <br>
                                    sources<br>
                                    <a href="https://catalog.archives.gov/id/5555460?objectPanel=transcription" target="_blank">reference NAID :5555460</a><br>
                                    Identifiant local :E & E 820<br>
                                    <div id="CALLOUT_1" class="cp_callout note">
                                        <div id="CALLOUT1_TITRE" class="titre">Titre callout</div>
                                        <div id="CALLOUT1_CONTENT" class="content">Content callout</div>
                                    </div>

                                    <p>contenu section </p>
                                   
                                    <div id="CALLOUT_2" class="cp_callout info">
                                        <div id="CALLOUT2_TITRE" class="titre">Titre callout</div>
                                        <div id="CALLOUT2_CONTENT" class="content">Content callout</div>
                                    </div>
                                    
                                    <p>contenu section </p>
                                    
                                    <div id="CALLOUT_3" class="cp_callout danger">
                                        <div id="CALLOUT3_TITRE" class="titre">Titre callout</div>
                                        <div id="CALLOUT3_CONTENT" class="content">Content callout</div>
                                    </div>
                                    
                                    <p>contenu section </p>
                                    
                                    <div id="CALLOUT_4" class="cp_callout warning">
                                        <div id="CALLOUT4_TITRE" class="titre">Titre callout</div>
                                        <div id="CALLOUT4_CONTENT" class="content">Content callout</div>
                                    </div>                            </aside>	            
                                            </div>
                            </section>
            
        </article>
                <!-- ── Article : Informatique ── -->
        <article
            id="tab4"
            class="cp_soft-card"
                    >
            <header>
                <h1>Informatique</h1>
                <p>Ce portail me permet de maitriser les technologies front HTML,CSS et Javascript et backend PHP/MySql.</p>
                <div id="tab4_menu"></div>
            </header>

                        <section>
                <h2>Architecture modulaire</h2>
                                    <div>
                        <div>
                            <h3>Une nécessité</h3>
                            Pour ajouter des fonctionnalités sur la partie front comme les composants une organisation du code est à trouver.<br>
                                    Ceci de par le fait que l'application SPA est servi par un framework MVC et que l'on réparti les vues entre le template et la vue<br>
                                    <br>
                                    La structure est réalisé avec HTML et CSS, cette structure doit s'adapter aux terminaux mobiles et ordinateurs.<br>
                                    <br>
                                    Le theming incombe à CSS, il faut séparer mise en forme de la structure du theming.<br>
                                    <br>
                                    Javascript gère les interactions.<br>Selon le niveau on gère directment l'action dans le module ou dans les cas plus complexes on publie les evenements aux module et composants souscripteurs.<br>
                                    Les modules et composants doivent au maximum être indépendant de l'interface. Il faut limiter les références DOM aux classes.<br>
                                    <br>
                                    La documentation est importante, il faut savoir prendre le temps de lire et d'écrire. Obsidian peut être très utile pour gérer des projets			
                        </div>
                                                    <aside>
                                
                                    <strong>CALLOUT</strong>
                                    <p>callout - note</p>
                                    <div id="CALLOUT_1" class="cp_callout note">
                                        <div id="CALLOUT1_TITRE" class="titre">Titre callout</div>
                                        <div id="CALLOUT1_CONTENT" class="content">Content callout</div>
                                    </div>
                                    <p>callout - note</p>
                                    
                                   
                                    <div id="CALLOUT_2" class="cp_callout info">
                                        <div id="CALLOUT2_TITRE" class="titre">Titre callout</div>
                                        <div id="CALLOUT2_CONTENT" class="content">Content callout</div>
                                    </div>
                                    
                                    <p>contenu section </p>
                                    
                                    <div id="CALLOUT_3" class="cp_callout danger">
                                        <div id="CALLOUT3_TITRE" class="titre">Titre callout</div>
                                        <div id="CALLOUT3_CONTENT" class="content">Content callout</div>
                                    </div>
                                    
                                    <p>contenu section </p>
                                    
                                    <div id="CALLOUT_4" class="cp_callout warning">
                                        <div id="CALLOUT4_TITRE" class="titre">Titre callout</div>
                                        <div id="CALLOUT4_CONTENT" class="content">Content callout</div>
                                    </div>                                    
                                                                </aside>	            
                                            </div>
                                    <div>
                        <div>
                            <h3>Composants</h3>
                            <h4>Callout</h4>Ces blocs évoluent pour intégrer un contenu à mettre en évidence.<br/>
                                    <br/>
                                    <h5>Evolutions</h5>
                                    Theming, ajouter des icone splus adaptés sur les barres de titre<br/>
                                    <br/>
                                    Utilisation du bus d'événements<br/>
                                    On peut imaginer un support de cours avec suivi d'assiduité. Il faudrait emettre un evenement qui signale l'ouverture, ceci permettant de vérifier que l'utilisateur prenenle temps de bien ire les notions importantes<br/>
                                    <br/>
                                    <strong>callout - note</strong>
                                    <div id="CALLOUT_1" class="cp_callout note">
                                        <div id="CALLOUT1_TITRE" class="titre">Intégration</div>
                                        <div id="CALLOUT1_CONTENT" class="content">Le composant se réparti entre
                                            <ul>
                                                <li>La structure (php/html)</li>
                                                <li>La mise en forme (css)</li>
                                                <li>Le theming (css)</li>
                                                <li>L'intéraction (javascript)</li>
                                            </ul>                                            
                                        </div>
                                    </div>
                                    <h4>A intégrer</h4>

                                    <div id="CALLOUT_4" class="cp_callout warning">
                                        <div id="CALLOUT4_TITRE" class="titre">Titre callout</div>
                                        <div id="CALLOUT4_CONTENT" class="content">
                                        <a href="/informatique/apex">apex</a><br/>
                                        <a href="/informatique/callout">callout</a><br/>
                                        <a href="/informatique/codeval">codeval</a><br/>
                                        <a href="/informatique/devlogs">devlogs</a><br/>                          
                                        <a href="/informatique/formdialog">formdialog</a><br/>
                                        <a href="/informatique/formfeatures">formfeatures</a><br/>
                                        <a href="/informatique/forms">forms</a><br/>                        
                                        <a href="/informatique/leaflet">leaflet</a><br/>                        
                                        <a href="/informatique/mermaid">mermaid</a><br/>
                                        <a href="/informatique/threejs">threejs</a><br/>
                                        <a href="/informatique/xhr">xhr</a><br/>                                        
                                        </div>
                                    </div>			
                        </div>
                                                    <aside>
                                Prochain travaux features et speech                            </aside>	            
                                            </div>
                            </section>
            
        </article>
                <!-- ── Article : Dictionnaire ── -->
        <article
            id="tab5"
            class="cp_soft-card"
                    >
            <header>
                <h1>Dictionnaire</h1>
                <p>Composant de données.</p>
                <div id="tab5_menu"></div>
            </header>

                        <section>
                <h2>Introduction</h2>
                                    <div>
                        <div>
                            <h3>Recherche de mots</h3>
                            <div id="motContainer" class="cp_module_container">
                                                    <div id="motButtonPanel" class="cp_panel_buttons"></div>
                                                    <div id="motFormPanel"   class="cp_panel_form"   style="display:none"></div>
                                                    <div id="motDetailPanel" class="cp_panel_detail" style="display:none"></div>
                                                    <div id="motTablePanel"  class="cp_panel_table"></div>
                                                    <div id="motPaginationPanel" class="cp_panel_pagination"></div>
                                                </div>			
                        </div>
                                                    <aside>
                                Essai en cours                            </aside>	            
                                            </div>
                            </section>
            
        </article>
                <!-- ── Article : Code Naf ── -->
        <article
            id="tab6"
            class="cp_soft-card"
                    >
            <header>
                <h1>Code Naf</h1>
                <p>Composant de données.</p>
                <div id="tab6_menu"></div>
            </header>

                        <section>
                <h2>Introduction</h2>
                                    <div>
                        <div>
                            <h3>Recherche de code APE</h3>
                            
                                        <form id="nafForm" onsubmit="return validateForm(this)">  
                                        <label for="nafCodeInput">Code NAF (optionnel) :</label><br />  
                                        <input type="text" id="nafCodeInput" name="nafcode" /><br />
                                        <input type="hidden" name="csrf_test_name" value="af334fc3f6799f6dcf25a68a635776b5">  
                                        <label for="nafQInput">Recherche (libellé) :</label><br />  
                                        <input type="text" id="nafQInput" name="nafq" /><br />  
                                        <input type="submit" value="Rechercher">  
                                        <hr>  
                                        <div id="nafSelected"></div>  
                                        <hr>  
                                        <div id="nafResult"></div>
                                        <hr>
                                        <div id="nafPagination"></div>  
                                        <hr>
                                        <div id="nafTree"></div>
                                        </form>			
                        </div>
                                                    <aside>
                                Essai en cours                            </aside>	            
                                            </div>
                            </section>
            
        </article>
                <!-- ── Article : Compte PCG ── -->
        <article
            id="tab7"
            class="cp_soft-card"
                    >
            <header>
                <h1>Compte PCG</h1>
                <p>Composant de données.</p>
                <div id="tab7_menu"></div>
            </header>

                        <section>
                <h2>Introduction</h2>
                                    <div>
                        <div>
                            <h3>Recherche de compte PCG</h3>
                            <form id="pcgSearchForm">
												    <input id="pcgSearchInput" type="search" placeholder="Numéro ou libellé…"><input type="hidden" name="csrf_test_name" value="af334fc3f6799f6dcf25a68a635776b5"><select id="pcgClasseSelect">
												        <option value="">Toutes classes</option>
												        <option value="1">Classe 1 — Capitaux</option>
												        <option value="2">Classe 2 — Immobilisations</option>
												        <option value="3">Classe 3 — Stocks</option>
												        <option value="4">Classe 4 — Tiers</option>
												        <option value="5">Classe 5 — Financiers</option>
												        <option value="6">Classe 6 — Charges</option>
												        <option value="7">Classe 7 — Produits</option>
												        <option value="8">Classe 8 — Spéciaux</option>
												    </select>
												    <button type="submit">Rechercher</button>
												    <button type="button" id="pcgResetBtn">Reset</button>
												</form>

												<table id="pcgResults">
												    <thead>
												        <tr><th>Numéro</th><th>Libellé</th><th>Classe</th></tr>
												    </thead>
												    <tbody id="pcgResultsBody"></tbody>
												</table>

												<div id="pcgPager"></div>

												<div id="pcgDetail"></div>			
                        </div>
                                                    <aside>
                                Essai en cours                            </aside>	            
                                            </div>
                            </section>
            
        </article>
                <!-- ── Article : WysEdit ── -->
        <article
            id="tab8"
            class="cp_soft-card"
                    >
            <header>
                <h1>WysEdit</h1>
                <p>Composant éditeur HTML simple.</p>
                <div id="tab8_menu"></div>
            </header>

                        <section>
                <h2>Éditeur</h2>
                                    <div>
                        <div>
                            <h3>Zone d&#039;édition</h3>
                            
                                        <p>
                                            Le composant <strong>WysEdit</strong> permet de saisir du HTML
                                            et de basculer entre le mode édition et la prévisualisation.<br>
                                            Réservé aux utilisateurs avertis — le contenu est rendu via <code>innerHTML</code>.
                                        </p>
                                        <p>Événements disponibles via le bus :</p>
                                        <ul>
                                            <li><code>wysedit:show:wysedit1</code> — passer en vue</li>
                                            <li><code>wysedit:edit:wysedit1</code> — passer en édition</li>
                                            <li><code>wysedit:set:wysedit1</code> — injecter du contenu</li>
                                            <li><code>wysedit:clear:wysedit1</code> — vider</li>
                                            <li><code>wysedit:get:wysedit1</code> — récupérer le contenu</li>
                                        </ul>
                                        <hr>
                                        <div class="cp_wysedit_zone" id="wysedit1">
                                            <textarea
                                                class="cp_wysedit_textarea"
                                                rows="10"
                                                placeholder="Saisir du HTML ici…"
                                            >&lt;h3&gt;Titre exemple&lt;/h3&gt;
    &lt;p&gt;Contenu &lt;strong&gt;formaté&lt;/strong&gt; en HTML.&lt;/p&gt;</textarea>
                                            <div class="cp_wysedit_view"></div>
                                            <button class="cp_wysedit_toggle">Aperçu</button>
                                        </div>                                        
                                        <div style="margin-top:10px; display:flex; gap:8px; flex-wrap:wrap;">
                                        <button onclick="window.eventBusPublish(null, 'wysedit:clear:wysedit1', null)">
                                            Vider
                                        </button>
                                        <button onclick="window.eventBusPublish(null, 'wysedit:set:wysedit1',
                                            '&lt;h3&gt;Contenu injecté&lt;/h3&gt;&lt;p&gt;Via le bus d\'événements.&lt;/p&gt;')">
                                            Injecter contenu
                                        </button>
                                    </div>			
                        </div>
                                                    <aside>
                                
                            </aside>	            
                                            </div>
                            </section>
            
        </article>
                <!-- ── Article : Vox ── -->
        <article
            id="tab9"
            class="cp_soft-card"
                    >
            <header>
                <h1>Vox</h1>
                <p>Synthèse vocale</p>
                <div id="tab9_menu"></div>
            </header>

                        <section>
                <h2>Composant vox</h2>
                                    <div>
                        <div>
                            <h3>Synthèse vocale (event bus)</h3>
                            <textarea class="cp_voxzone_textarea" id="TXT_VOX_1" rows="8">
Juliette: Bonjour, je suis Juliette.
Romeo: Bonjour, je suis Roméo.
											    </textarea>
											    <br/><br/>	
											    <div id="VOX_STATUS"></div>			
                        </div>
                                                    <aside>
                                <button onclick="window.eventBusPublish(event, 'vox:speak', { targetId:'TXT_VOX_1', statusId:'VOX_STATUS' })">Lire</button>
                                                <button onclick="window.eventBusPublish(event,'vox:pause')">Pause</button>
                                                <button onclick="window.eventBusPublish( event, 'vox:resume' )">Resume</button>
                                                <button onclick="window.eventBusPublish( event, 'vox:stop' )">Stop</button>
                                                <br/><br/>
                                                <label>Rate</label>
                                                <input type="range" min="0.5" max="2" step="0.1" value="0.9" onchange="window.eventBusPublish( event, 'vox:rate',{value:this.value})">	
                                                <br/><br/>
                                                <label>Volume</label>
                                                <input type="range" min="0" max="1" step="0.1" value="1" onchange="window.eventBusPublish( event,'vox:volume',{ value:this.value })">	
                                                <br/><br/>
                                                <button onclick="window.eventBusPublish( event,'vox:getVoices')">Configurer les voix</button>
                                                <h3>Voix disponibles</h3>  
                                                <div id="VOX_VOICES_LIST"></div>
                                                                            </aside>	            
                                            </div>
                            </section>
                        <section>
                <h2>Composant vox</h2>
                                    <div>
                        <div>
                            <h3>Reco vocale (event bus)</h3>
                            <textarea class="cp_voxzone_textarea" id="TXT_RVOX_1" rows="8"></textarea>
											    <br/><br/>	
											    <div id="RVOX_STATUS_1"></div>			
                        </div>
                                                    <aside>
                                <button onclick="window.eventBusPublish( event, 'listen:cmd:start', { targetId:'TXT_RVOX_1' } )">▶ Lire</button>
                                                <button onclick="window.eventBusPublish(event, 'listen:cmd:stop')">⏹ Stop</button>                            </aside>	            
                                            </div>
                            </section>
            
        </article>
                <!-- ── Article : Composants ── -->
        <article
            id="tab10"
            class="cp_soft-card"
                    >
            <header>
                <h1>Composants</h1>
                <p>Composants en cours d&#039;intégration cms</p>
                <div id="tab10_menu"></div>
            </header>

                        <section>
                <h2>mermaid</h2>
                                    <div>
                        <div>
                            <h3>gantt</h3>
                            <pre class="mermaid" id="mmG1">
	                    gantt
	                    dateFormat  YYYY-MM-DD
	
	                    section Clickable
	                    Visit mermaidjs, read documentation         :active, cl1, 2025-08-22, 2d
	                    Print arguments         :cl2, after cl1, 3d
	                    Print task              :cl3, after cl2, 3d
	
	                    click cl1 href "https://mermaidjs.github.io/"
	                    click cl2 call mermaid_printArguments("test1", "test2", 3)
	                    click cl3 call window.mermaid_printTask(cl3)
	                </pre>
	
	                    <button 
	                    id="executeButton"
	                    name="executeButton" 
	                    onclick="mermaid_Run('mmG1')"
                    >	Exécuter
	                    </button>    			
                        </div>
                                                    <aside>
                                mermaid en zone centrale                            </aside>	            
                                            </div>
                                    <div>
                        <div>
                            <h3>Diagramme de sequence</h3>
                            <pre class="mermaid" id="mmG2">
    sequenceDiagram
    autonumber
    
    participant window.load
    participant eventBus.forms
    box Purple features mot
    participant mot.form.js
    participant mot.controller.js
    participant mot.service.js
    participant mot.renderer.js
    end
    participant window.validateForm
    participant ui
    
    rect rgb(191, 223, 255)
        window.load--)mot.form.js: initMotForm()
        mot.form.js->>eventBus.forms : souscrit a forms:submit
        note right of window.load: Initialisation.
        
        window.load--)mot.controller.js: initMotController()  
        mot.controller.js->>eventBus.forms : souscrit a forms:search
    
        window.load--)mot.renderer.js : initMotRenderer()
        mot.renderer.js->>eventBus.forms : souscrit a mot:loading
        mot.renderer.js->>eventBus.forms : souscrit a mot:loaded
        mot.renderer.js->>eventBus.forms : souscrit a mot:error
    end
    
    rect rgb(255, 223, 191)
        note left of ui: Validation formulaire
        ui--)window.validateForm: evt submit src motForm  
        window.validateForm->>eventBus.forms : publie forms:submit
        eventBus.forms->>+mot.form.js : forms:submit
        mot.form.js-->mot.form.js : validation
    end
    
    rect rgb(191, 223, 255)
        mot.form.js->>-eventBus.forms : publie forms:search
        eventBus.forms->>mot.controller.js: forms:search
    end
    
    rect rgb(255, 223, 191)
        mot.controller.js->>eventBus.forms : publie mot:loading 1
        eventBus.forms->>+mot.renderer.js : mot:loading
        mot.renderer.js--)-ui : affichage chargement
    end
    
    rect rgb(191, 223, 255)	
        note left of mot.service.js : requete
        mot.controller.js->>+mot.service.js : fetch()
        mot.service.js-->mot.service.js : response
        mot.service.js->>-mot.controller.js :result
        mot.controller.js->>eventBus.forms : publie mot:loaded
        eventBus.forms->>+mot.renderer.js: mot:loaded
        mot.controller.js->>eventBus.forms : publie mot:loading 0
    end
    
    rect rgb(255, 223, 191)
        mot.renderer.js--)-ui : affichage des données en tableau
    end
</pre>

                                <button id="executeButton" name="executeButton" onclick="mermaid_Run('mmG2')">Exécuter</button>			
                        </div>
                                                    <aside>
                                mermaid en zone centrale                            </aside>	            
                                            </div>
                            </section>
                        <section>
                <h2>codeval</h2>
                                    <div>
                        <div>
                            <h3>Volume normal selon ISO 2533</h3>
                            <div id="CODEVAL_CVG5" class="cp_codeval">
                                    <div id="CODEVAL_CVG5_TITRE" class="titre">Volume normal ISO 2533</div>
                                        <div id="CODEVAL_CVG5_SCRIPTCODE" class="scriptcode">
                                            <textarea rows="12" class="cp_wysedit_textarea">
const P2_rel_bar = 0.3
const P2_abs_bar = P2_rel_bar + 1
const P2_abs_pa = P2_abs_bar * 101325
const P1_abs_pa = 101325
const T2_degc = 20
const T1_K = 288.15
const T2_K = T2_degc + 273.15
const IDX1 = 2500420
const IDX2 = 2500620
const V2 = IDX2 - IDX1
const F = ( P2_abs_pa / P1_abs_pa ) * ( T1_K / T2_K)
const V1 = V2 * F
const result = " Volume corrige  = " + V1 + " Nm3 ; F = " + F
                                            </textarea>
                                        </div>
                                        <div id="CODEVAL_CVG5_RESULT" class="result"></div>
                                        <button onclick="window.eventBusPublish(event, 'codeval:toggle', 'CVG5')">hide/show</button>
                                        <button onclick="window.eventBusPublish(event, 'codeval:eval', 'CVG5')">Eval</button>                                        
                                    </div>			
                        </div>
                                                    <aside>
                                Déterminons le volume V1 normal du gaz dans des conditions normales (P1,T1) que represente le volume V2 dans les conditions d'exploitation (P2,T2)<br/>
                                    - pression absolue P1 = 101 325 Pa<br/>
                                    - température T1 =  288,15 K<br/>                            </aside>	            
                                            </div>
                            </section>
                        <section>
                <h2>Apex</h2>
                                    <div>
                        <div>
                            <h3>Histogramme</h3>
                            <div id="APEX_1" class="cp_apex" data-chart="moteurCouple"></div>			
                        </div>
                                                    <aside>
                                Apex zone centrale                            </aside>	            
                                            </div>
                            </section>
                        <section>
                <h2>Carousel</h2>
                                    <div>
                        <div>
                            <h3>Carousel d&#039;images</h3>
                            
                                        <div id="CAROUSEL_1" class="cp_carousel">
                                            <img src="/assets/img/technologies/chf/chbois/hargassner-classic-lambda-coupe-profil-653x761.jpg">
                                            <img src="/assets/img/technologies/chf/chbois/hargassner-classic-lambda-coupe-654x763.jpg">
                                            <img src="/assets/img/technologies/chf/chbois/Agro%20ECO%20HK%20150-200%201000x800.jpg">
                                        </div>
                                        <button onclick="ihmCarouselPrev('1')">‹</button>
                                        <button onclick="ihmCarouselNext('1')">›</button>
                                    			
                        </div>
                                                    <aside>
                                
                                    <div id="CAROUSEL_2" class="cp_carousel">
                                        <img src="/assets/img/technologies/chf/chbois/20240216_141203_h.jpg">
                                        <img src="/assets/img/technologies/chf/chbois/20240216_141222_h.jpg">
                                        <img src="/assets/img/technologies/chf/chbois/20240216_151927_h.jpg">
                                        <img src="/assets/img/technologies/chf/chbois/20240216_151945_h.jpg">                                                            
                                    </div>
                                    <button onclick="ihmCarouselPrev('2')">‹</button>
                                    <button onclick="ihmCarouselNext('2')">›</button>
                                                                </aside>	            
                                            </div>
                            </section>
                        <section>
                <h2>Leaflet</h2>
                                    <div>
                        <div>
                            <h3>Leaflet</h3>
                            <div class="leafletContainer">
                                                <div id="leafletMap"></div>
                                                <div id="leafletInfo">Some text</div>
                                            </div>			
                        </div>
                                                    <aside>
                                <button id="testLeafelt" name="testLeafelt" onclick="testLeafelt()">testLeafelt</button>                            </aside>	            
                                            </div>
                            </section>
                        <section>
                <h2>ThreeJs</h2>
                                    <div>
                        <div>
                            <h3>cube</h3>
                            <div id="THREE_1" class="cp_threejs" data-scene="cube" data-width="800" data-height="600"></div>
                                            <button onclick="threeList()">List</button>
                                            <button onclick="threeStart('THREE_1')">Start</button>
                                            <button onclick="threeStop('THREE_1')">Stop</button>			
                        </div>
                                            </div>
                                    <div>
                        <div>
                            <h3>galaxy</h3>
                            <div id="THREE_2" class="cp_threejs" data-scene="galaxy"  data-width="800" data-height="600"></div>
                                            <button onclick="threeStart('THREE_2')">Start</button>
                                            <button onclick="threeStop('THREE_2')">Stop</button>			
                        </div>
                                            </div>
                                    <div>
                        <div>
                            <h3>terrain</h3>
                            <div id="THREE_3" class="cp_threejs" data-scene="terrain" data-width="800" data-height="600"></div>
                                            <button onclick="threeStart('THREE_3')">Start</button>
                                            <button onclick="threeStop('THREE_3')">Stop</button>
                                			
                        </div>
                                            </div>
                                    <div>
                        <div>
                            <h3>cube</h3>
                            <div id="THREE_4" class="cp_threejs" data-scene="model"   data-model="/assets/img/3js/model3d/avions/FW190.obj"></div>
                                            <button onclick="threeStart('THREE_4')">Start</button>
                                            <button onclick="threeStop('THREE_4')">Stop</button>
                                			
                        </div>
                                            </div>
                            </section>
                        <section>
                <h2>Dialog</h2>
                                    <div>
                        <div>
                            <h3>Dialog</h3>
                            <button onclick="showModal('DIALOG_1')">showModal DIALOG_1</button><button onclick="showModal('DIALOG_2')">showModal DIALOG_2</button>			
                        </div>
                                            </div>
                            </section>
            
        </article>
                <!-- ── Article : Roméo &amp; Juliette ── -->
        <article
            id="tab11"
            class="cp_soft-card"
                    >
            <header>
                <h1>Roméo &amp; Juliette</h1>
                <p>Mise en scène vocale avec le composant Vox.</p>
                <div id="tab11_menu"></div>
            </header>

                        <section>
                <h2>La scène</h2>
                                    <div>
                        <div>
                            <h3>Balcon de Vérone</h3>
                            
                                        <div class="cp_scene"
                                             style="background-image: url('https://picsum.photos/seed/verona/1200/500');">
                
                                            <div class="cp_actor cp_actor--left" data-alias="Romeo">
                                                <img
                                                    src="https://picsum.photos/seed/romeo/300/450"
                                                    alt="Roméo — Frank Dicksee 1884"
                                                />
                                                <span class="cp_actor__name">Roméo</span>
                                            </div>
                
                                            <div class="cp_actor cp_actor--right" data-alias="Juliette">
                                                <img
                                                    src="https://picsum.photos/seed/juliette/300/450"
                                                    alt="Juliette — Waterhouse 1898"
                                                />
                                                <span class="cp_actor__name">Juliette</span>
                                            </div>
                                            <div id="VOX_RJ_STATUS" class="cp_scene__subtitles"></div>
                                        </div>			
                        </div>
                                                    <aside>
                                
                                        <textarea class="cp_voxzone_textarea2" id="TXT_VOX_RJ" rows="10">
                Juliette: Roméo, Roméo, pourquoi es-tu Roméo ?
                Romeo: Mon nom, chère sainte, est une haine pour moi.
                Juliette: Ni murs ni profondeur ne sauraient m'arrêter.
                Romeo: Je suis plus en danger de ton regard que de vingt épées.
                                        </textarea>
                                        <br/>
                                        <button onclick="window.eventBusPublish(event, 'vox:speak', { targetId:'TXT_VOX_RJ', statusId:'VOX_RJ_STATUS' })">▶ Lire</button>
                                        <button onclick="window.eventBusPublish(event, 'vox:pause')">⏸ Pause</button>
                                        <button onclick="window.eventBusPublish(event, 'vox:resume')">▶▶ Resume</button>
                                        <button onclick="window.eventBusPublish(event, 'vox:stop')">⏹ Stop</button>
                                        <br/><br/>
                                                                </aside>	            
                                            </div>
                            </section>
            
        </article>
                <!-- ── Article : Test Autocomplete ── -->
        <article
            id="tab12"
            class="cp_soft-card"
                    >
            <header>
                <h1>Test Autocomplete</h1>
                <p>Démonstration du composant autocomplete via bus.</p>
                <div id="tab12_menu"></div>
            </header>

                        <section>
                <h2>Recherche de mot</h2>
                                    <div>
                        <div>
                            <h3>Autocomplete mot</h3>
                            
                                        <div id="acTestContainer">
                                            <div id="acTestField"></div>
                                            <hr>
                                            <div id="acTestResult" style="margin-top:10px;padding:8px;background:#f0f4ff;border-radius:4px;min-height:2rem;">
                                                Sélection : <strong id="acTestValue">—</strong>
                                                (id : <span id="acTestId">—</span>)
                                            </div>
                                        </div>
                                    			
                        </div>
                                                    <aside>
                                
                                        <p>Tapez au moins 2 caractères.</p>
                                        <p>Naviguez avec ↑ ↓ et validez avec Entrée.</p>
                                        <p>L'id sélectionné est stocké dans le champ caché.</p>
                                                                </aside>	            
                                            </div>
                            </section>
            
        </article>
                <!-- ── Article : Images ── -->
        <article
            id="tab13"
            class="cp_soft-card"
                    >
            <header>
                <h1>Images</h1>
                <p>Gestion de la médiathèque.</p>
                <div id="tab13_menu"></div>
            </header>

                        <section>
                <h2>Médiathèque</h2>
                                    <div>
                        <div>
                            <h3>Gestion des images</h3>
                            
                                        <div id="imageContainer" class="cp_module_container">
                                            <div class="cp_panel_buttons"></div>
                                            <div class="cp_panel_form"   style="display:none"></div>
                                            <div class="cp_panel_detail" style="display:none"></div>
                                            <div class="cp_panel_table"></div>
                                            <div class="cp_panel_pagination"></div>
                                        </div>
                                    			
                        </div>
                                                    <aside>
                                <p>Upload, recherche et validation des images.</p>                            </aside>	            
                                            </div>
                            </section>
            
        </article>
                <!-- ── Article : Formes juridiques ── -->
        <article
            id="tab14"
            class="cp_soft-card"
                    >
            <header>
                <h1>Formes juridiques</h1>
                <p>Référentiel INSEE des formes juridiques (260 codes).</p>
                <div id="tab14_menu"></div>
            </header>

                        <section>
                <h2>Référentiel</h2>
                                    <div>
                        <div>
                            <h3>Formes juridiques</h3>
                            
                                        <div id="fjContainer" class="cp_module_container">
                                            <div class="cp_panel_buttons"></div>
                                            <div class="cp_panel_form"   style="display:none"></div>
                                            <div class="cp_panel_detail" style="display:none"></div>
                                            <div class="cp_panel_table"></div>
                                            <div class="cp_panel_pagination"></div>
                                        </div>
                                    			
                        </div>
                                                    <aside>
                                
                                        <p>Source : INSEE catjurique2022</p>
                                        <p>260 codes de <code>0000</code> à <code>9970</code>.</p>
                                        <p>Utilisé par le module <strong>Entreprise</strong>.</p>
                                                                </aside>	            
                                            </div>
                            </section>
            
        </article>
                <!-- ── Article : Types de voie ── -->
        <article
            id="tab15"
            class="cp_soft-card"
                    >
            <header>
                <h1>Types de voie</h1>
                <p>Référentiel des 63 types de voie.</p>
                <div id="tab15_menu"></div>
            </header>

                        <section>
                <h2>Référentiel</h2>
                                    <div>
                        <div>
                            <h3>Types de voie</h3>
                            
                                <div id="tvContainer" class="cp_module_container">
                                    <div class="cp_panel_buttons"></div>
                                    <div class="cp_panel_form"   style="display:none"></div>
                                    <div class="cp_panel_detail" style="display:none"></div>
                                    <div class="cp_panel_table"></div>
                                    <div class="cp_panel_pagination"></div>
                                </div>			
                        </div>
                                                    <aside>
                                <p>63 types — Rue, Avenue, Boulevard…</p>
                                        <p>Utilisé par le module <strong>Adresse</strong>.</p>                            </aside>	            
                                            </div>
                            </section>
            
        </article>
                <!-- ── Article : Codes postaux ── -->
        <article
            id="tab16"
            class="cp_soft-card"
                    >
            <header>
                <h1>Codes postaux</h1>
                <p>39 192 codes postaux France — source La Poste.</p>
                <div id="tab16_menu"></div>
            </header>

                        <section>
                <h2>Recherche</h2>
                                    <div>
                        <div>
                            <h3>Codes postaux</h3>
                            
                                <div id="cpContainer" class="cp_module_container">
                                    <div class="cp_panel_form"   style="display:none"></div>
                                    <div class="cp_panel_detail" style="display:none"></div>
                                    <div class="cp_panel_table"></div>
                                    <div class="cp_panel_pagination"></div>
                                </div>			
                        </div>
                                                    <aside>
                                
                                <p>Recherche par code postal, code INSEE ou nom de commune.</p>
                                <p>Cliquez sur une ligne pour voir le détail et le lien carte.</p>
                                <p>Utilisé par le module <strong>Adresse</strong>.</p>                            </aside>	            
                                            </div>
                            </section>
            
        </article>
                <!-- ── Article : Adresses ── -->
        <article
            id="tab17"
            class="cp_soft-card"
                    >
            <header>
                <h1>Adresses</h1>
                <p>Gestion des adresses postales.</p>
                <div id="tab17_menu"></div>
            </header>

                        <section>
                <h2>Adresses</h2>
                                    <div>
                        <div>
                            <h3>Gestion des adresses</h3>
                            
                                <div id="adresseContainer" class="cp_module_container">
                                    <div class="cp_panel_buttons"></div>
                                    <div class="cp_panel_form"   style="display:none"></div>
                                    <div class="cp_panel_detail" style="display:none"></div>
                                    <div class="cp_panel_table"></div>
                                    <div class="cp_panel_pagination"></div>
                                </div>			
                        </div>
                                                    <aside>
                                
                                <p>FK vers <strong>type_voies</strong> et <strong>codes_postaux</strong>.</p>
                                <p>L'acheminement, les coordonnées et la ligne 5 sont
                                   auto-remplis depuis le code postal sélectionné.</p>                            </aside>	            
                                            </div>
                            </section>
            
        </article>
                <!-- ── Article : Organisations ── -->
        <article
            id="tab18"
            class="cp_soft-card"
                    >
            <header>
                <h1>Organisations</h1>
                <p>Gestion des organisations.</p>
                <div id="tab18_menu"></div>
            </header>

                        <section>
                <h2>Organisation</h2>
                                    <div>
                        <div>
                            <h3>Gestion des organisations</h3>
                            
                                <div id="orgContainer" class="cp_module_container">
                                    <div class="cp_panel_buttons"></div>
                                    <div class="cp_panel_form" style="display:none"></div>
                                    <div class="cp_panel_detail" style="display:none"></div>
                                    <div class="cp_panel_table"></div>
                                    <div class="cp_panel_pagination"></div>
                                </div>			
                        </div>
                                                    <aside>
                                <p>Organisation.</p>                            </aside>	            
                                            </div>
                            </section>
            
        </article>
                <!-- ── Article : Entreprise ── -->
        <article
            id="tab19"
            class="cp_soft-card"
                    >
            <header>
                <h1>Entreprise</h1>
                <p>Gestion des entreprise.</p>
                <div id="tab19_menu"></div>
            </header>

                        <section>
                <h2>Entreprise</h2>
                                    <div>
                        <div>
                            <h3>Gestion des entreprise</h3>
                            
                                <div id="entContainer" class="cp_module_container">
                                    <div class="cp_panel_buttons"></div>
                                    <div class="cp_panel_form" style="display:none"></div>
                                    <div class="cp_panel_detail" style="display:none"></div>
                                    <div class="cp_panel_table"></div>
                                    <div class="cp_panel_pagination"></div>
                                </div>			
                        </div>
                                                    <aside>
                                <p>Entreprise.</p>                            </aside>	            
                                            </div>
                            </section>
            
        </article>
        
        <!-- 20260520-001  
        $article['title']), $article['id']) , $article['intro']


-->                    
        <article id="tabRESERVED" class="cp_soft-card">

        <script>
        const cp_edit_articles = [{"id":1,"title":"Accueil du portail","intro":"Pr\u00e9sentation du portail. Quand, qui, quoi, o\u00f9, comment, pourquoi.","sections":[{"id":1,"title":"Bienvenue","parts":[{"id":1,"title":"But","content":"Ce portail me permet de partager des informations sur des sujets vari\u00e9s, ces sujets sont relatifs \u00e0 :\u003Cul\u003E\u003Cli\u003Emes passions\u003C\/li\u003E\u003Cli\u003Emon exp\u00e9rience\u003C\/li\u003E\u003Cli\u003Emes projets\u003C\/li\u003E\u003C\/ul\u003E","aside":"\u003Ca href=\u0022\/technologies\u0022\u003ERubrique\u003C\/a\u003E"},{"id":2,"title":"Pr\u00e9sentation","content":"Plut\u00f4t pragmatique, j\u0027ai une formation d\u0027\u00e9lectrotechnicien. Mon exp\u00e9rience se r\u00e9sumerait en 20 ans d\u0027exploitation et maintenance, pr\u00e8s de 10 ans dans le service et les \u00e9nergies, et 4 ans d\u0027enseignement.\u003Cbr\u003E\r\n\r\n                                    \r\n                                    ","aside":"\u003Ca href=\u0022\/cv\u0022\u003EParcours pro\u003C\/a\u003E"},{"id":3,"title":"Motivations","content":"L\u0027\u00e9volution de l\u0027intelligence artificielle m\u0027a permis de progresser dans la gestion de la stack web. Depuis 14 mois je me familiarise avec CodeIgniter et Laravel, deux frameworks PHP.","aside":""}]},{"id":2,"title":"Actualit\u00e9s","parts":[{"id":4,"title":"Architecture CMS","content":"Le portail \u00e9volue, la rubrique technologies permet une int\u00e9gration rapide de documents en production.","aside":"\u003Ca href=\u0022\/technologies\u0022\u003ERubrique\u003C\/a\u003E"},{"id":5,"title":"Authentification","content":"L\u0027authentification est configur\u00e9e pour la partie front et les tokens pour API.","aside":"\u003Ca href=\u0022\/cv\u0022\u003EParcours pro\u003C\/a\u003E"},{"id":6,"title":"Structure","content":"Les pages devront employer la m\u00eame structure mise en forme par CSS.","aside":""}]},{"id":3,"title":"Environnement","parts":[{"id":7,"title":"H\u00e9bergement","content":"Le portail est h\u00e9berg\u00e9 sur un serveur mutualis\u00e9 chez OVH.","aside":"\u003Ca href=\u0022\/technologies\u0022\u003ERubrique\u003C\/a\u003E"},{"id":8,"title":"Stack","content":"OVH fournit les services SSH, FTP, HTTPS ,PHP, messagerie et Base de donn\u00e9es. J\u0027ai choisi Code Ingiter pour le backend, la partie front est r\u00e9alis\u00e9 en HTML,SVG et Javascript et CSS","aside":"\u003Ca href=\u0022https:\/\/codeigniter.com\u0022 target=\u0022_blank\u0022\u003Ecodeigniter.com\u003C\/a\u003E"}]}]},{"id":2,"title":"Technologies","intro":"Nous sommes enchant\u00e9s de vous accueillir dans cet espace d\u00e9di\u00e9 aux technologies qui nous passionnent, que nous maitrsions de part nos activit\u00e9s dans diff\u00e9rents secteurs.","sections":[{"id":4,"title":"Introduction","parts":[{"id":9,"title":"Contexte","content":"A travers les diff\u00e9rents articles et contenus que vous d\u00e9couvrirez ici, nous aspirons \u00e0 vous fournir des informations quant \u00e0 des solutions technologiques et proc\u00e9d\u00e9s.\u003Cbr\u003EApr\u00e8s une formation de 7 ann\u00e9es dans les sciences et technologies industrielles, nous avons acquis une expertise dans les domaines de l\u0027\u00e9lectrotechnique et des comp\u00e9tences compl\u00e9mentaires.\u003Cbr\u003E\r\n                                    Nos 20 ann\u00e9es d\u0027exp\u00e9rience, riches et vari\u00e9es, dans les secteurs industriels, r\u00e9sidentiels, tertiaires et hospitaliers, nous ont sensibilis\u00e9s aux enjeux cruciaux de l\u0027exploitation, telle que la disponibilit\u00e9, l\u0027organisation, la r\u00e9activit\u00e9 et la s\u00e9curit\u00e9.\u003Cbr\u003ECette diversit\u00e9 de parcours nous a permis d\u0027acqu\u00e9rir une vision globale du m\u00e9tier d\u0027\u00e9lectricien, mais \u00e9galement de nous sp\u00e9cialiser dans la ma\u00eetrise des \u00e9nergies et de la maintenance.\u003Cbr\u003E\r\n                                    Sur un site Seveso 2, dans le secteur m\u00e9dical, en industrie, dans le tertiaire, les salles informatiques et le b\u00e2timent j\u0027ai exploit\u00e9 et mis en oeuvre des equipements n\u00e9cessaires pour les activit\u00e9s et la s\u00e9curit\u00e9.\u003Cbr\u003ENous vous invitons \u00e0 explorer notre portail pour d\u00e9couvrir des informations pertinentes, nos projets, et \u00e0 nous apporter votre soutien et votre confiance.\u003Cbr\u003EN\u0027h\u00e9sitez pas \u00e0 nous contacter pour toute demande d\u0027information suppl\u00e9mentaire ou pour discuter de la mani\u00e8re dont nous pouvons vous aider \u00e0 atteindre vos objectifs.\u003Cbr\u003E","aside":"\u003Ca href=\u0022https:\/\/zealot.fr\/technologies\u0022\u003Ehttps:\/\/zealot.fr\/technologies\u003C\/a\u003E\u003Cbr\u003E\r\n                                    \u003Cul\u003E\r\n                                        \u003Cli\u003E\u003Ca href=\u0022https:\/\/zealot.fr\/technologies\/acp\/\u0022\u003E\ud83d\udcc1 \/acp\u003C\/a\u003E\r\n                                        \u003Cul\u003E\r\n                                            \u003Cli\u003E\r\n                                                \u003Ca href=\u0022https:\/\/zealot.fr\/technologies\/acp\/presentation\u0022\u003E\ud83d\udcc4 \/acp\/presentation\u003C\/a\u003E\r\n                                            \u003C\/li\u003E\r\n                                        \u003C\/ul\u003E    \r\n                                        \u003Cli\u003E\r\n                                            \u003Ca href=\u0022https:\/\/zealot.fr\/technologies\/gaz\u0022\u003E\ud83d\udcc1 \/gaz\u003C\/a\u003E\r\n                                        \u003C\/li\u003E\r\n                                        \u003Cli\u003E\r\n                                            \u003Ca href=\u0022https:\/\/zealot.fr\/technologies\/aut\u0022\u003E\ud83d\udcc1 \/aut\u003C\/a\u003E\r\n                                        \u003C\/li\u003E\r\n                                        \u003Cli\u003E\r\n                                            \u003Ca href=\u0022https:\/\/zealot.fr\/technologies\/chf\u0022\u003E\ud83d\udcc1 \/chf\u003C\/a\u003E\r\n                                            \r\n                                            \u003Cul\u003E\r\n                                                \u003Cli\u003E\u003Ca href=\u0022https:\/\/zealot.fr\/technologies\/chf\/bois\u0022\u003E\ud83d\udcc4 \/bois\u003C\/a\u003E\r\n                                                \u003Cli\u003E\u003Ca href=\u0022https:\/\/zealot.fr\/technologies\/chf\/remeha\u0022\u003E\ud83d\udcc4 \/remeha\u003C\/a\u003E\r\n                                                \u003Cli\u003E\u003Ca href=\u0022https:\/\/zealot.fr\/technologies\/chf\/varblok\u0022\u003E\ud83d\udcc4 \/varblok\u003C\/a\u003E\r\n                                                \u003Cli\u003E\u003Ca href=\u0022https:\/\/zealot.fr\/technologies\/chf\/varmax\u0022\u003E\ud83d\udcc4 \/varmax\u003C\/a\u003E\r\n                                            \u003C\/ul\u003E\r\n                                        \u003C\/li\u003E\r\n                                        \u003Cli\u003E\r\n                                            \u003Ca href=\u0022https:\/\/zealot.fr\/technologies\/eau\u0022\u003E\ud83d\udcc1 \/eau\u003C\/a\u003E\r\n                                        \u003C\/li\u003E                                            \r\n                                        \u003Cli\u003E\r\n                                            \u003Ca href=\u0022https:\/\/zealot.fr\/technologies\/ecs\u0022\u003E\ud83d\udcc1 \/ecs\u003C\/a\u003E\r\n                                        \u003C\/li\u003E                                    \r\n                                        \u003Cli\u003E                                        \r\n                                            \u003Ca href=\u0022https:\/\/zealot.fr\/technologies\/vap\u0022\u003E\ud83d\udcc1 \/vap\u003C\/a\u003E\r\n                                            \u003Cul\u003E\r\n                                                \u003Cli\u003E\r\n                                                    \u003Ca href=\u0022https:\/\/zealot.fr\/technologies\/vap\/requalification\u0022\u003E\ud83d\udcc4 \/vap\/requalification\u003C\/a\u003E\r\n                                                \u003C\/li\u003E                                                    \r\n                                            \u003C\/ul\u003E\r\n                                        \u003C\/li\u003E\r\n                                        \u003Cli\u003E\r\n                                            \u003Ca href=\u0022https:\/\/zealot.fr\/technologies\/hyd\u0022\u003E\ud83d\udcc1 \/hyd\u003C\/a\u003E\r\n                                        \u003C\/li\u003E \r\n                                        \u003Cli\u003E\r\n                                            \u003Ca href=\u0022https:\/\/zealot.fr\/technologies\/eln\u0022\u003E\ud83d\udcc1 \/eln\u003C\/a\u003E\r\n                                        \u003Cul\u003E\r\n                                            \u003Cli\u003E\u003Ca href=\u0022https:\/\/zealot.fr\/technologies\/eln\/arduino\u0022\u003E\ud83d\udcc4 \/eln\/arduino\u003C\/a\u003E\u003C\/li\u003E                                     \r\n                                            \u003Cli\u003E\u003Ca href=\u0022https:\/\/zealot.fr\/technologies\/eln\/interruptions\u0022\u003E\ud83d\udcc4 \/eln\/interruptions\u003C\/a\u003E\u003C\/li\u003E \r\n\r\n                                        \u003C\/ul\u003E\r\n                                        \u003Cli\u003E\r\n                                            \u003Ca href=\u0022https:\/\/zealot.fr\/technologies\/wrk\u0022\u003E\ud83d\udcc1 \/wrk\u003C\/a\u003E\r\n                                        \u003C\/li\u003E \r\n                                        \u003Cli\u003E\r\n                                            \u003Ca href=\u0022https:\/\/zealot.fr\/technologies\/com\u0022\u003E\ud83d\udcc1 \/com\u003C\/a\u003E\r\n                                            \u003Cul\u003E\r\n                                                \u003Cli\u003E\u003Ca href=\u0022https:\/\/zealot.fr\/technologies\/com\u0022\u003E\ud83d\udcc4 \/com\/rs485\u003C\/a\u003E\u003C\/li\u003E \r\n                                                \u003Cli\u003E\u003Ca href=\u0022https:\/\/zealot.fr\/technologies\/com\u0022\u003E\ud83d\udcc4 \/com\/ethernet\u003C\/a\u003E\u003C\/li\u003E \r\n                                                \u003Cli\u003E\u003Ca href=\u0022https:\/\/zealot.fr\/technologies\/com\u0022\u003E\ud83d\udcc4 \/com\/lora\u003C\/a\u003E\u003C\/li\u003E \r\n                                            \u003C\/ul\u003E\r\n                                        \u003C\/li\u003E\r\n                                        \u003Cli\u003E\r\n                                            \u003Ca href=\u0022https:\/\/zealot.fr\/technologies\/sec\u0022\u003E\ud83d\udcc1 \/sec\u003C\/a\u003E\r\n                                        \u003C\/li\u003E \r\n                                    "}]}]},{"id":3,"title":"Histoire","intro":"Sans \u00eatre sp\u00e9cialiste dans le domaine, je me passionne pour la chose \u00e0 l\u0027occasion de d\u00e9couverte et de recherches.","sections":[{"id":5,"title":"Introduction","parts":[{"id":10,"title":"Une passion","content":"Natif de Picardie, j\u0027ai pu parcourir l\u0027histoire de France pendant quelques kilom\u00e8tres. Dans mon enfance j\u0027ai eu la chance de pouvoir \u00e9couter le t\u00e9moignage des anciens. Les randonn\u00e9es en VTT comme la sp\u00e9l\u00e9ologie me permirent de concilier sport et histoire.\r\n                                    L\u0027histoire est un h\u00e9ritage parfois difficile \u00e0 supporter mais il doit \u00eatre assumer et pour assumer cet h\u00e9ritage faut il encore le connaitre.\r\n                                    On dit que l\u0027on n\u0027est pas responsable des actes des ses anciens mais pourtant on est bien fier d\u0027avoir d\u0027illustres pr\u00e9d\u00e9cesseurs; je pense sinc\u00e8rement qu\u0027on ne peut \u00eatre sage en ignorant comment nous sommes devenus contemporains de ce monde.\r\n                                    Comprendre l\u0027histoire familiale vous d\u00e9montre qu\u0027aucune v\u00e9rit\u00e9 n\u0027est jamais unique. On peut rejeter les valeurs d\u0027une civilisation mais on ne peut aborder son pass\u00e9 sans essayer de comprendre son contexte culturel, social et politique\r\n                                    \r\n                                    Dans cette rubrique nous aborderons principalement des \u00e9v\u00e9nements que j\u0027ai souvent d\u00e9couvert par le cin\u00e9ma, au hasard de discussions passionn\u00e9es ou \u00e0 l\u0027occasion d\u0027un trajet.\r\n                                    Certaines d\u00e9couvertes m\u0027ont particuli\u00e8rement int\u00e9ress\u00e9 et je les ai compl\u00e9t\u00e9es parfois par des recherches et des lectures.\r\n                                    \r\n                                    Enfin le projet de g\u00e9rer ces \u00e9v\u00e8nements me permet de progresser notamment dans la gestion des relations entre les donn\u00e9es","aside":"Rubrique a construire"}]},{"id":6,"title":"Saint Leau d\u0027Esserent","parts":[{"id":11,"title":"Transcriptions du rapport 1944-06-30-NAID-5555460","content":"\u003Ch4\u003EIdentit\u00e9\u003C\/h4\u003EGOLKE, CLIFFORD G\u003Cbr\u003ESergent-chef , matricule 16132121, 9e Groupe de Bombardement USAF\r\n                                    \u003Ch4\u003ERapport\u003C\/h4\u003E\r\n                                    Date, heure et lieu approximatif du crash ou de l\u0027atterrissage de l\u0027avion.\u003Cbr\u003E \r\n                                    10 AVRIL 1944 VERS 10H00 ENVIRON 4 KILOM\u00c8TRES AU SUD-OUEST DE SAINT-VAAST-LES-MELLO. AU NORD DE PARIS.\u003Cbr\u003E\u003Cbr\u003E\r\n                                    Nature et \u00e9tendue des dommages subis par l\u0027avion au moment de l\u0027\u00e9jection. L\u0027avion \u00e9tait-il en feu ?\u003Cbr\u003E\r\n                                    Toute l\u0027aile droite \u00e9tait en feu, le moteur n\u00b0 1 \u00e9tait en train de s\u0027\u00e9teindre et l\u0027aile commen\u00e7ait \u00e0 se d\u00e9tacher entre les moteurs n\u00b0 3 et 4.\u003Cbr\u003E\u003Cbr\u003E\r\n                                    \u00c0 quelle altitude approximative l\u0027\u00e9jection a-t-elle eu lieu ?\u003Cbr\u003E Environ 6 100 m (20 000 pieds).\u003Cbr\u003E\u003Cbr\u003E\r\n                                    Des membres d\u0027\u00e9quipage ont-ils \u00e9t\u00e9 bless\u00e9s ou tu\u00e9s avant le crash ?\u003Cbr\u003E Non.\u003Cbr\u003E\u003Cbr\u003E\r\n                                    Combien de membres d\u0027\u00e9quipage ont saut\u00e9 en parachute ? Leurs parachutes se sont-ils ouverts ?\u003Cbr\u003E\r\n                                    Manahan, Justice, Hedlund, Dearing, Harnahan, Moedebeck, Hard, ont saut\u00e9 en parachute. Thompson, Enstrom, je ne sais pas. J\u0027ai vu deux hommes tomber sans que leurs parachutes ne s\u0027ouvrent.\u003Cbr\u003E\u003Cbr\u003E\r\n                                    La source a-t-elle vu d\u0027autres membres de l\u0027\u00e9quipage, morts ou vivants, apr\u00e8s l\u0027atterrissage ?\u003Cbr\u003E\r\n                                    J\u0027ai vu deux hommes tomber, seulement de loin, dont les parachutes ne se sont pas ouverts. J\u0027ai pris contact avec Cletus Hard le lendemain.\u003Cbr\u003E\u003Cbr\u003E\r\n                                    A-t-il re\u00e7u des informations d\u0027autres personnes quant au sort des autres membres de l\u0027\u00e9quipage ? Si oui, veuillez fournir les d\u00e9tails fournis par son informateur et indiquer si les autres membres d\u0027\u00e9quipage ont \u00e9t\u00e9 identifi\u00e9s par leur nom ou autrement.\u003Cbr\u003ELes Fran\u00e7ais ont apport\u00e9 les noms de Thompson, Moedebeck et Harnahan comme \u00e9tant morts. Ils ont donn\u00e9 une bonne description de Justice, qui a \u00e9t\u00e9 captur\u00e9. Ils amenaient Hedlund et Dearing pour nous rejoindre, mais les Allemands les ont captur\u00e9s en chemin. Un Fran\u00e7ais s\u0027est \u00e9chapp\u00e9.\u003Cbr\u003E\u003Cbr\u003E\r\n                                    La source a-t-elle examin\u00e9 l\u0027\u00e9pave de l\u0027avion ? Si oui, dans quel \u00e9tat \u00e9tait-elle ?\u003Cbr\u003E Non, je ne me suis pas approch\u00e9 suffisamment. Faible taux d\u0027oxyg\u00e8ne dans le champ, train d\u0027atterrissage dans les bois et partie du fuselage dans le champ.\u003Cbr\u003E\u003Cbr\u003E\r\n                                    Si l\u0027avion s\u0027est ab\u00eem\u00e9 en mer, \u00e0 quelle distance se trouvait-il de la c\u00f4te ?\u003Cbr\u003E\u003Cbr\u003E\r\n                                    Comment la source a-t-elle \u00e9t\u00e9 secourue ? Quels radeaux de sauvetage, d\u00e9bris, etc., sont rest\u00e9s \u00e0 la surface et auraient pu aider les autres membres d\u0027\u00e9quipage \u00e0 se maintenir \u00e0 flot ?\u003Cbr\u003E\u003Cbr\u003E\r\n                                     Quel est l\u0027avis de la source quant au sort des autres membres d\u0027\u00e9quipage et pourquoi ? \u003Cbr\u003EOuvrir les parachutes trop t\u00f4t a peut-\u00eatre permis aux Allemands de capturer deux membres d\u0027\u00e9quipage d\u00e8s le premier jour.\r\n                                    ","aside":"\r\n                                    ref interne : 1944-06-30-NAID-5555460\u003Cbr\u003E\r\n                                    Date du rapport : 30 JUIN 1944\u003Cbr\u003E\r\n                                    Date \u00e9venement : 10 AVRIL 1944, vers 10:00\u003Cbr\u003E\r\n                                    \u003Cbr\u003E\r\n                                    Localisation : 4 KILOM\u00c8TRES AU SUD-OUEST DE SAINT-VAAST-LES-MELLO. AU NORD DE PARIS.\r\n                                    \u003Cbr\u003E\r\n\r\n                                    Personnes\u003Cbr\u003E\r\n                                    nom : GOLKE, CLIFFORD G.\u003Cbr\u003E\r\n                                    qualit\u00e9 : Militaire (grade=S\/Sgt) (ASN=16132121) (Unite: USAF 9FTH BOMB GP.)\u003Cbr\u003E\r\n                                    Manahan\u003Cbr\u003E\r\n                                    Justice\u003Cbr\u003E\r\n                                    Hedlund\u003Cbr\u003E\r\n                                    Dearing\u003Cbr\u003E\r\n                                    Harnahan\u003Cbr\u003E\r\n                                    Moedebeck\u003Cbr\u003E\r\n                                    Hard\u003Cbr\u003E\r\n                                    Thompson\u003Cbr\u003E\r\n                                    Enstrom\u003Cbr\u003E\r\n\r\n                                    \u003Cbr\u003E\r\n                                    sources\u003Cbr\u003E\r\n                                    \u003Ca href=\u0022https:\/\/catalog.archives.gov\/id\/5555460?objectPanel=transcription\u0022 target=\u0022_blank\u0022\u003Ereference NAID :5555460\u003C\/a\u003E\u003Cbr\u003E\r\n                                    Identifiant local :E \u0026 E 820\u003Cbr\u003E\r\n                                    \u003Cdiv id=\u0022CALLOUT_1\u0022 class=\u0022cp_callout note\u0022\u003E\r\n                                        \u003Cdiv id=\u0022CALLOUT1_TITRE\u0022 class=\u0022titre\u0022\u003ETitre callout\u003C\/div\u003E\r\n                                        \u003Cdiv id=\u0022CALLOUT1_CONTENT\u0022 class=\u0022content\u0022\u003EContent callout\u003C\/div\u003E\r\n                                    \u003C\/div\u003E\r\n\r\n                                    \u003Cp\u003Econtenu section \u003C\/p\u003E\r\n                                   \r\n                                    \u003Cdiv id=\u0022CALLOUT_2\u0022 class=\u0022cp_callout info\u0022\u003E\r\n                                        \u003Cdiv id=\u0022CALLOUT2_TITRE\u0022 class=\u0022titre\u0022\u003ETitre callout\u003C\/div\u003E\r\n                                        \u003Cdiv id=\u0022CALLOUT2_CONTENT\u0022 class=\u0022content\u0022\u003EContent callout\u003C\/div\u003E\r\n                                    \u003C\/div\u003E\r\n                                    \r\n                                    \u003Cp\u003Econtenu section \u003C\/p\u003E\r\n                                    \r\n                                    \u003Cdiv id=\u0022CALLOUT_3\u0022 class=\u0022cp_callout danger\u0022\u003E\r\n                                        \u003Cdiv id=\u0022CALLOUT3_TITRE\u0022 class=\u0022titre\u0022\u003ETitre callout\u003C\/div\u003E\r\n                                        \u003Cdiv id=\u0022CALLOUT3_CONTENT\u0022 class=\u0022content\u0022\u003EContent callout\u003C\/div\u003E\r\n                                    \u003C\/div\u003E\r\n                                    \r\n                                    \u003Cp\u003Econtenu section \u003C\/p\u003E\r\n                                    \r\n                                    \u003Cdiv id=\u0022CALLOUT_4\u0022 class=\u0022cp_callout warning\u0022\u003E\r\n                                        \u003Cdiv id=\u0022CALLOUT4_TITRE\u0022 class=\u0022titre\u0022\u003ETitre callout\u003C\/div\u003E\r\n                                        \u003Cdiv id=\u0022CALLOUT4_CONTENT\u0022 class=\u0022content\u0022\u003EContent callout\u003C\/div\u003E\r\n                                    \u003C\/div\u003E"}]}]},{"id":4,"title":"Informatique","intro":"Ce portail me permet de maitriser les technologies front HTML,CSS et Javascript et backend PHP\/MySql.","sections":[{"id":5,"title":"Architecture modulaire","parts":[{"id":12,"title":"Une n\u00e9cessit\u00e9","content":"Pour ajouter des fonctionnalit\u00e9s sur la partie front comme les composants une organisation du code est \u00e0 trouver.\u003Cbr\u003E\r\n                                    Ceci de par le fait que l\u0027application SPA est servi par un framework MVC et que l\u0027on r\u00e9parti les vues entre le template et la vue\u003Cbr\u003E\r\n                                    \u003Cbr\u003E\r\n                                    La structure est r\u00e9alis\u00e9 avec HTML et CSS, cette structure doit s\u0027adapter aux terminaux mobiles et ordinateurs.\u003Cbr\u003E\r\n                                    \u003Cbr\u003E\r\n                                    Le theming incombe \u00e0 CSS, il faut s\u00e9parer mise en forme de la structure du theming.\u003Cbr\u003E\r\n                                    \u003Cbr\u003E\r\n                                    Javascript g\u00e8re les interactions.\u003Cbr\u003ESelon le niveau on g\u00e8re directment l\u0027action dans le module ou dans les cas plus complexes on publie les evenements aux module et composants souscripteurs.\u003Cbr\u003E\r\n                                    Les modules et composants doivent au maximum \u00eatre ind\u00e9pendant de l\u0027interface. Il faut limiter les r\u00e9f\u00e9rences DOM aux classes.\u003Cbr\u003E\r\n                                    \u003Cbr\u003E\r\n                                    La documentation est importante, il faut savoir prendre le temps de lire et d\u0027\u00e9crire. Obsidian peut \u00eatre tr\u00e8s utile pour g\u00e9rer des projets","aside":"\r\n                                    \u003Cstrong\u003ECALLOUT\u003C\/strong\u003E\r\n                                    \u003Cp\u003Ecallout - note\u003C\/p\u003E\r\n                                    \u003Cdiv id=\u0022CALLOUT_1\u0022 class=\u0022cp_callout note\u0022\u003E\r\n                                        \u003Cdiv id=\u0022CALLOUT1_TITRE\u0022 class=\u0022titre\u0022\u003ETitre callout\u003C\/div\u003E\r\n                                        \u003Cdiv id=\u0022CALLOUT1_CONTENT\u0022 class=\u0022content\u0022\u003EContent callout\u003C\/div\u003E\r\n                                    \u003C\/div\u003E\r\n                                    \u003Cp\u003Ecallout - note\u003C\/p\u003E\r\n                                    \r\n                                   \r\n                                    \u003Cdiv id=\u0022CALLOUT_2\u0022 class=\u0022cp_callout info\u0022\u003E\r\n                                        \u003Cdiv id=\u0022CALLOUT2_TITRE\u0022 class=\u0022titre\u0022\u003ETitre callout\u003C\/div\u003E\r\n                                        \u003Cdiv id=\u0022CALLOUT2_CONTENT\u0022 class=\u0022content\u0022\u003EContent callout\u003C\/div\u003E\r\n                                    \u003C\/div\u003E\r\n                                    \r\n                                    \u003Cp\u003Econtenu section \u003C\/p\u003E\r\n                                    \r\n                                    \u003Cdiv id=\u0022CALLOUT_3\u0022 class=\u0022cp_callout danger\u0022\u003E\r\n                                        \u003Cdiv id=\u0022CALLOUT3_TITRE\u0022 class=\u0022titre\u0022\u003ETitre callout\u003C\/div\u003E\r\n                                        \u003Cdiv id=\u0022CALLOUT3_CONTENT\u0022 class=\u0022content\u0022\u003EContent callout\u003C\/div\u003E\r\n                                    \u003C\/div\u003E\r\n                                    \r\n                                    \u003Cp\u003Econtenu section \u003C\/p\u003E\r\n                                    \r\n                                    \u003Cdiv id=\u0022CALLOUT_4\u0022 class=\u0022cp_callout warning\u0022\u003E\r\n                                        \u003Cdiv id=\u0022CALLOUT4_TITRE\u0022 class=\u0022titre\u0022\u003ETitre callout\u003C\/div\u003E\r\n                                        \u003Cdiv id=\u0022CALLOUT4_CONTENT\u0022 class=\u0022content\u0022\u003EContent callout\u003C\/div\u003E\r\n                                    \u003C\/div\u003E                                    \r\n                                    "},{"id":13,"title":"Composants","content":"\u003Ch4\u003ECallout\u003C\/h4\u003ECes blocs \u00e9voluent pour int\u00e9grer un contenu \u00e0 mettre en \u00e9vidence.\u003Cbr\/\u003E\r\n                                    \u003Cbr\/\u003E\r\n                                    \u003Ch5\u003EEvolutions\u003C\/h5\u003E\r\n                                    Theming, ajouter des icone splus adapt\u00e9s sur les barres de titre\u003Cbr\/\u003E\r\n                                    \u003Cbr\/\u003E\r\n                                    Utilisation du bus d\u0027\u00e9v\u00e9nements\u003Cbr\/\u003E\r\n                                    On peut imaginer un support de cours avec suivi d\u0027assiduit\u00e9. Il faudrait emettre un evenement qui signale l\u0027ouverture, ceci permettant de v\u00e9rifier que l\u0027utilisateur prenenle temps de bien ire les notions importantes\u003Cbr\/\u003E\r\n                                    \u003Cbr\/\u003E\r\n                                    \u003Cstrong\u003Ecallout - note\u003C\/strong\u003E\r\n                                    \u003Cdiv id=\u0022CALLOUT_1\u0022 class=\u0022cp_callout note\u0022\u003E\r\n                                        \u003Cdiv id=\u0022CALLOUT1_TITRE\u0022 class=\u0022titre\u0022\u003EInt\u00e9gration\u003C\/div\u003E\r\n                                        \u003Cdiv id=\u0022CALLOUT1_CONTENT\u0022 class=\u0022content\u0022\u003ELe composant se r\u00e9parti entre\r\n                                            \u003Cul\u003E\r\n                                                \u003Cli\u003ELa structure (php\/html)\u003C\/li\u003E\r\n                                                \u003Cli\u003ELa mise en forme (css)\u003C\/li\u003E\r\n                                                \u003Cli\u003ELe theming (css)\u003C\/li\u003E\r\n                                                \u003Cli\u003EL\u0027int\u00e9raction (javascript)\u003C\/li\u003E\r\n                                            \u003C\/ul\u003E                                            \r\n                                        \u003C\/div\u003E\r\n                                    \u003C\/div\u003E\r\n                                    \u003Ch4\u003EA int\u00e9grer\u003C\/h4\u003E\r\n\r\n                                    \u003Cdiv id=\u0022CALLOUT_4\u0022 class=\u0022cp_callout warning\u0022\u003E\r\n                                        \u003Cdiv id=\u0022CALLOUT4_TITRE\u0022 class=\u0022titre\u0022\u003ETitre callout\u003C\/div\u003E\r\n                                        \u003Cdiv id=\u0022CALLOUT4_CONTENT\u0022 class=\u0022content\u0022\u003E\r\n                                        \u003Ca href=\u0022\/informatique\/apex\u0022\u003Eapex\u003C\/a\u003E\u003Cbr\/\u003E\r\n                                        \u003Ca href=\u0022\/informatique\/callout\u0022\u003Ecallout\u003C\/a\u003E\u003Cbr\/\u003E\r\n                                        \u003Ca href=\u0022\/informatique\/codeval\u0022\u003Ecodeval\u003C\/a\u003E\u003Cbr\/\u003E\r\n                                        \u003Ca href=\u0022\/informatique\/devlogs\u0022\u003Edevlogs\u003C\/a\u003E\u003Cbr\/\u003E                          \r\n                                        \u003Ca href=\u0022\/informatique\/formdialog\u0022\u003Eformdialog\u003C\/a\u003E\u003Cbr\/\u003E\r\n                                        \u003Ca href=\u0022\/informatique\/formfeatures\u0022\u003Eformfeatures\u003C\/a\u003E\u003Cbr\/\u003E\r\n                                        \u003Ca href=\u0022\/informatique\/forms\u0022\u003Eforms\u003C\/a\u003E\u003Cbr\/\u003E                        \r\n                                        \u003Ca href=\u0022\/informatique\/leaflet\u0022\u003Eleaflet\u003C\/a\u003E\u003Cbr\/\u003E                        \r\n                                        \u003Ca href=\u0022\/informatique\/mermaid\u0022\u003Emermaid\u003C\/a\u003E\u003Cbr\/\u003E\r\n                                        \u003Ca href=\u0022\/informatique\/threejs\u0022\u003Ethreejs\u003C\/a\u003E\u003Cbr\/\u003E\r\n                                        \u003Ca href=\u0022\/informatique\/xhr\u0022\u003Exhr\u003C\/a\u003E\u003Cbr\/\u003E                                        \r\n                                        \u003C\/div\u003E\r\n                                    \u003C\/div\u003E","aside":"Prochain travaux features et speech"}]}]},{"id":5,"title":"Dictionnaire","intro":"Composant de donn\u00e9es.","sections":[{"id":6,"title":"Introduction","parts":[{"id":14,"title":"Recherche de mots","content":"\u003Cdiv id=\u0022motContainer\u0022 class=\u0022cp_module_container\u0022\u003E\r\n                                                    \u003Cdiv id=\u0022motButtonPanel\u0022 class=\u0022cp_panel_buttons\u0022\u003E\u003C\/div\u003E\r\n                                                    \u003Cdiv id=\u0022motFormPanel\u0022   class=\u0022cp_panel_form\u0022   style=\u0022display:none\u0022\u003E\u003C\/div\u003E\r\n                                                    \u003Cdiv id=\u0022motDetailPanel\u0022 class=\u0022cp_panel_detail\u0022 style=\u0022display:none\u0022\u003E\u003C\/div\u003E\r\n                                                    \u003Cdiv id=\u0022motTablePanel\u0022  class=\u0022cp_panel_table\u0022\u003E\u003C\/div\u003E\r\n                                                    \u003Cdiv id=\u0022motPaginationPanel\u0022 class=\u0022cp_panel_pagination\u0022\u003E\u003C\/div\u003E\r\n                                                \u003C\/div\u003E","aside":"Essai en cours"}]}]},{"id":6,"title":"Code Naf","intro":"Composant de donn\u00e9es.","sections":[{"id":7,"title":"Introduction","parts":[{"id":15,"title":"Recherche de code APE","content":"\r\n                                        \u003Cform id=\u0022nafForm\u0022 onsubmit=\u0022return validateForm(this)\u0022\u003E  \r\n                                        \u003Clabel for=\u0022nafCodeInput\u0022\u003ECode NAF (optionnel) :\u003C\/label\u003E\u003Cbr \/\u003E  \r\n                                        \u003Cinput type=\u0022text\u0022 id=\u0022nafCodeInput\u0022 name=\u0022nafcode\u0022 \/\u003E\u003Cbr \/\u003E\r\n                                        \u003Cinput type=\u0022hidden\u0022 name=\u0022csrf_test_name\u0022 value=\u0022af334fc3f6799f6dcf25a68a635776b5\u0022\u003E  \r\n                                        \u003Clabel for=\u0022nafQInput\u0022\u003ERecherche (libell\u00e9) :\u003C\/label\u003E\u003Cbr \/\u003E  \r\n                                        \u003Cinput type=\u0022text\u0022 id=\u0022nafQInput\u0022 name=\u0022nafq\u0022 \/\u003E\u003Cbr \/\u003E  \r\n                                        \u003Cinput type=\u0022submit\u0022 value=\u0022Rechercher\u0022\u003E  \r\n                                        \u003Chr\u003E  \r\n                                        \u003Cdiv id=\u0022nafSelected\u0022\u003E\u003C\/div\u003E  \r\n                                        \u003Chr\u003E  \r\n                                        \u003Cdiv id=\u0022nafResult\u0022\u003E\u003C\/div\u003E\r\n                                        \u003Chr\u003E\r\n                                        \u003Cdiv id=\u0022nafPagination\u0022\u003E\u003C\/div\u003E  \r\n                                        \u003Chr\u003E\r\n                                        \u003Cdiv id=\u0022nafTree\u0022\u003E\u003C\/div\u003E\r\n                                        \u003C\/form\u003E","aside":"Essai en cours"}]}]},{"id":7,"title":"Compte PCG","intro":"Composant de donn\u00e9es.","sections":[{"id":8,"title":"Introduction","parts":[{"id":16,"title":"Recherche de compte PCG","content":"\u003Cform id=\u0022pcgSearchForm\u0022\u003E\r\n\t\t\t\t\t\t\t\t\t\t\t\t    \u003Cinput id=\u0022pcgSearchInput\u0022 type=\u0022search\u0022 placeholder=\u0022Num\u00e9ro ou libell\u00e9\u2026\u0022\u003E\u003Cinput type=\u0022hidden\u0022 name=\u0022csrf_test_name\u0022 value=\u0022af334fc3f6799f6dcf25a68a635776b5\u0022\u003E\u003Cselect id=\u0022pcgClasseSelect\u0022\u003E\r\n\t\t\t\t\t\t\t\t\t\t\t\t        \u003Coption value=\u0022\u0022\u003EToutes classes\u003C\/option\u003E\r\n\t\t\t\t\t\t\t\t\t\t\t\t        \u003Coption value=\u00221\u0022\u003EClasse 1 \u2014 Capitaux\u003C\/option\u003E\r\n\t\t\t\t\t\t\t\t\t\t\t\t        \u003Coption value=\u00222\u0022\u003EClasse 2 \u2014 Immobilisations\u003C\/option\u003E\r\n\t\t\t\t\t\t\t\t\t\t\t\t        \u003Coption value=\u00223\u0022\u003EClasse 3 \u2014 Stocks\u003C\/option\u003E\r\n\t\t\t\t\t\t\t\t\t\t\t\t        \u003Coption value=\u00224\u0022\u003EClasse 4 \u2014 Tiers\u003C\/option\u003E\r\n\t\t\t\t\t\t\t\t\t\t\t\t        \u003Coption value=\u00225\u0022\u003EClasse 5 \u2014 Financiers\u003C\/option\u003E\r\n\t\t\t\t\t\t\t\t\t\t\t\t        \u003Coption value=\u00226\u0022\u003EClasse 6 \u2014 Charges\u003C\/option\u003E\r\n\t\t\t\t\t\t\t\t\t\t\t\t        \u003Coption value=\u00227\u0022\u003EClasse 7 \u2014 Produits\u003C\/option\u003E\r\n\t\t\t\t\t\t\t\t\t\t\t\t        \u003Coption value=\u00228\u0022\u003EClasse 8 \u2014 Sp\u00e9ciaux\u003C\/option\u003E\r\n\t\t\t\t\t\t\t\t\t\t\t\t    \u003C\/select\u003E\r\n\t\t\t\t\t\t\t\t\t\t\t\t    \u003Cbutton type=\u0022submit\u0022\u003ERechercher\u003C\/button\u003E\r\n\t\t\t\t\t\t\t\t\t\t\t\t    \u003Cbutton type=\u0022button\u0022 id=\u0022pcgResetBtn\u0022\u003EReset\u003C\/button\u003E\r\n\t\t\t\t\t\t\t\t\t\t\t\t\u003C\/form\u003E\r\n\r\n\t\t\t\t\t\t\t\t\t\t\t\t\u003Ctable id=\u0022pcgResults\u0022\u003E\r\n\t\t\t\t\t\t\t\t\t\t\t\t    \u003Cthead\u003E\r\n\t\t\t\t\t\t\t\t\t\t\t\t        \u003Ctr\u003E\u003Cth\u003ENum\u00e9ro\u003C\/th\u003E\u003Cth\u003ELibell\u00e9\u003C\/th\u003E\u003Cth\u003EClasse\u003C\/th\u003E\u003C\/tr\u003E\r\n\t\t\t\t\t\t\t\t\t\t\t\t    \u003C\/thead\u003E\r\n\t\t\t\t\t\t\t\t\t\t\t\t    \u003Ctbody id=\u0022pcgResultsBody\u0022\u003E\u003C\/tbody\u003E\r\n\t\t\t\t\t\t\t\t\t\t\t\t\u003C\/table\u003E\r\n\r\n\t\t\t\t\t\t\t\t\t\t\t\t\u003Cdiv id=\u0022pcgPager\u0022\u003E\u003C\/div\u003E\r\n\r\n\t\t\t\t\t\t\t\t\t\t\t\t\u003Cdiv id=\u0022pcgDetail\u0022\u003E\u003C\/div\u003E","aside":"Essai en cours"}]}]},{"id":8,"title":"WysEdit","intro":"Composant \u00e9diteur HTML simple.","sections":[{"id":9,"title":"\u00c9diteur","parts":[{"id":17,"title":"Zone d\u0027\u00e9dition","content":"\r\n                                        \u003Cp\u003E\r\n                                            Le composant \u003Cstrong\u003EWysEdit\u003C\/strong\u003E permet de saisir du HTML\r\n                                            et de basculer entre le mode \u00e9dition et la pr\u00e9visualisation.\u003Cbr\u003E\r\n                                            R\u00e9serv\u00e9 aux utilisateurs avertis \u2014 le contenu est rendu via \u003Ccode\u003EinnerHTML\u003C\/code\u003E.\r\n                                        \u003C\/p\u003E\r\n                                        \u003Cp\u003E\u00c9v\u00e9nements disponibles via le bus :\u003C\/p\u003E\r\n                                        \u003Cul\u003E\r\n                                            \u003Cli\u003E\u003Ccode\u003Ewysedit:show:wysedit1\u003C\/code\u003E \u2014 passer en vue\u003C\/li\u003E\r\n                                            \u003Cli\u003E\u003Ccode\u003Ewysedit:edit:wysedit1\u003C\/code\u003E \u2014 passer en \u00e9dition\u003C\/li\u003E\r\n                                            \u003Cli\u003E\u003Ccode\u003Ewysedit:set:wysedit1\u003C\/code\u003E \u2014 injecter du contenu\u003C\/li\u003E\r\n                                            \u003Cli\u003E\u003Ccode\u003Ewysedit:clear:wysedit1\u003C\/code\u003E \u2014 vider\u003C\/li\u003E\r\n                                            \u003Cli\u003E\u003Ccode\u003Ewysedit:get:wysedit1\u003C\/code\u003E \u2014 r\u00e9cup\u00e9rer le contenu\u003C\/li\u003E\r\n                                        \u003C\/ul\u003E\r\n                                        \u003Chr\u003E\r\n                                        \u003Cdiv class=\u0022cp_wysedit_zone\u0022 id=\u0022wysedit1\u0022\u003E\r\n                                            \u003Ctextarea\r\n                                                class=\u0022cp_wysedit_textarea\u0022\r\n                                                rows=\u002210\u0022\r\n                                                placeholder=\u0022Saisir du HTML ici\u2026\u0022\r\n                                            \u003E\u0026lt;h3\u0026gt;Titre exemple\u0026lt;\/h3\u0026gt;\r\n    \u0026lt;p\u0026gt;Contenu \u0026lt;strong\u0026gt;format\u00e9\u0026lt;\/strong\u0026gt; en HTML.\u0026lt;\/p\u0026gt;\u003C\/textarea\u003E\r\n                                            \u003Cdiv class=\u0022cp_wysedit_view\u0022\u003E\u003C\/div\u003E\r\n                                            \u003Cbutton class=\u0022cp_wysedit_toggle\u0022\u003EAper\u00e7u\u003C\/button\u003E\r\n                                        \u003C\/div\u003E                                        \r\n                                        \u003Cdiv style=\u0022margin-top:10px; display:flex; gap:8px; flex-wrap:wrap;\u0022\u003E\r\n                                        \u003Cbutton onclick=\u0022window.eventBusPublish(null, \u0027wysedit:clear:wysedit1\u0027, null)\u0022\u003E\r\n                                            Vider\r\n                                        \u003C\/button\u003E\r\n                                        \u003Cbutton onclick=\u0022window.eventBusPublish(null, \u0027wysedit:set:wysedit1\u0027,\r\n                                            \u0027\u0026lt;h3\u0026gt;Contenu inject\u00e9\u0026lt;\/h3\u0026gt;\u0026lt;p\u0026gt;Via le bus d\\\u0027\u00e9v\u00e9nements.\u0026lt;\/p\u0026gt;\u0027)\u0022\u003E\r\n                                            Injecter contenu\r\n                                        \u003C\/button\u003E\r\n                                    \u003C\/div\u003E","aside":"\r\n"}]}]},{"id":9,"title":"Vox","intro":"Synth\u00e8se vocale","sections":[{"id":10,"title":"Composant vox","parts":[{"id":18,"title":"Synth\u00e8se vocale (event bus)","content":"\u003Ctextarea class=\u0022cp_voxzone_textarea\u0022 id=\u0022TXT_VOX_1\u0022 rows=\u00228\u0022\u003E\r\nJuliette: Bonjour, je suis Juliette.\r\nRomeo: Bonjour, je suis Rom\u00e9o.\r\n\t\t\t\t\t\t\t\t\t\t\t    \u003C\/textarea\u003E\r\n\t\t\t\t\t\t\t\t\t\t\t    \u003Cbr\/\u003E\u003Cbr\/\u003E\t\r\n\t\t\t\t\t\t\t\t\t\t\t    \u003Cdiv id=\u0022VOX_STATUS\u0022\u003E\u003C\/div\u003E","aside":"\u003Cbutton onclick=\u0022window.eventBusPublish(event, \u0027vox:speak\u0027, { targetId:\u0027TXT_VOX_1\u0027, statusId:\u0027VOX_STATUS\u0027 })\u0022\u003ELire\u003C\/button\u003E\r\n                                                \u003Cbutton onclick=\u0022window.eventBusPublish(event,\u0027vox:pause\u0027)\u0022\u003EPause\u003C\/button\u003E\r\n                                                \u003Cbutton onclick=\u0022window.eventBusPublish( event, \u0027vox:resume\u0027 )\u0022\u003EResume\u003C\/button\u003E\r\n                                                \u003Cbutton onclick=\u0022window.eventBusPublish( event, \u0027vox:stop\u0027 )\u0022\u003EStop\u003C\/button\u003E\r\n                                                \u003Cbr\/\u003E\u003Cbr\/\u003E\r\n                                                \u003Clabel\u003ERate\u003C\/label\u003E\r\n                                                \u003Cinput type=\u0022range\u0022 min=\u00220.5\u0022 max=\u00222\u0022 step=\u00220.1\u0022 value=\u00220.9\u0022 onchange=\u0022window.eventBusPublish( event, \u0027vox:rate\u0027,{value:this.value})\u0022\u003E\t\r\n                                                \u003Cbr\/\u003E\u003Cbr\/\u003E\r\n                                                \u003Clabel\u003EVolume\u003C\/label\u003E\r\n                                                \u003Cinput type=\u0022range\u0022 min=\u00220\u0022 max=\u00221\u0022 step=\u00220.1\u0022 value=\u00221\u0022 onchange=\u0022window.eventBusPublish( event,\u0027vox:volume\u0027,{ value:this.value })\u0022\u003E\t\r\n                                                \u003Cbr\/\u003E\u003Cbr\/\u003E\r\n                                                \u003Cbutton onclick=\u0022window.eventBusPublish( event,\u0027vox:getVoices\u0027)\u0022\u003EConfigurer les voix\u003C\/button\u003E\r\n                                                \u003Ch3\u003EVoix disponibles\u003C\/h3\u003E  \r\n                                                \u003Cdiv id=\u0022VOX_VOICES_LIST\u0022\u003E\u003C\/div\u003E\r\n                                                "}]},{"id":25,"title":"Composant vox","parts":[{"id":35,"title":"Reco vocale (event bus)","content":"\u003Ctextarea class=\u0022cp_voxzone_textarea\u0022 id=\u0022TXT_RVOX_1\u0022 rows=\u00228\u0022\u003E\u003C\/textarea\u003E\r\n\t\t\t\t\t\t\t\t\t\t\t    \u003Cbr\/\u003E\u003Cbr\/\u003E\t\r\n\t\t\t\t\t\t\t\t\t\t\t    \u003Cdiv id=\u0022RVOX_STATUS_1\u0022\u003E\u003C\/div\u003E","aside":"\u003Cbutton onclick=\u0022window.eventBusPublish( event, \u0027listen:cmd:start\u0027, { targetId:\u0027TXT_RVOX_1\u0027 } )\u0022\u003E\u25b6 Lire\u003C\/button\u003E\r\n                                                \u003Cbutton onclick=\u0022window.eventBusPublish(event, \u0027listen:cmd:stop\u0027)\u0022\u003E\u23f9 Stop\u003C\/button\u003E"}]}]},{"id":10,"title":"Composants","intro":"Composants en cours d\u0027int\u00e9gration cms","sections":[{"id":11,"title":"mermaid","parts":[{"id":19,"title":"gantt","content":"\u003Cpre class=\u0022mermaid\u0022 id=\u0022mmG1\u0022\u003E\r\n\t                    gantt\r\n\t                    dateFormat  YYYY-MM-DD\r\n\t\r\n\t                    section Clickable\r\n\t                    Visit mermaidjs, read documentation         :active, cl1, 2025-08-22, 2d\r\n\t                    Print arguments         :cl2, after cl1, 3d\r\n\t                    Print task              :cl3, after cl2, 3d\r\n\t\r\n\t                    click cl1 href \u0022https:\/\/mermaidjs.github.io\/\u0022\r\n\t                    click cl2 call mermaid_printArguments(\u0022test1\u0022, \u0022test2\u0022, 3)\r\n\t                    click cl3 call window.mermaid_printTask(cl3)\r\n\t                \u003C\/pre\u003E\r\n\t\r\n\t                    \u003Cbutton \r\n\t                    id=\u0022executeButton\u0022\r\n\t                    name=\u0022executeButton\u0022 \r\n\t                    onclick=\u0022mermaid_Run(\u0027mmG1\u0027)\u0022\r\n                    \u003E\tEx\u00e9cuter\r\n\t                    \u003C\/button\u003E    ","aside":"mermaid en zone centrale"},{"id":32,"title":"Diagramme de sequence","content":"\u003Cpre class=\u0022mermaid\u0022 id=\u0022mmG2\u0022\u003E\r\n    sequenceDiagram\r\n    autonumber\r\n    \r\n    participant window.load\r\n    participant eventBus.forms\r\n    box Purple features mot\r\n    participant mot.form.js\r\n    participant mot.controller.js\r\n    participant mot.service.js\r\n    participant mot.renderer.js\r\n    end\r\n    participant window.validateForm\r\n    participant ui\r\n    \r\n    rect rgb(191, 223, 255)\r\n        window.load--)mot.form.js: initMotForm()\r\n        mot.form.js-\u003E\u003EeventBus.forms : souscrit a forms:submit\r\n        note right of window.load: Initialisation.\r\n        \r\n        window.load--)mot.controller.js: initMotController()  \r\n        mot.controller.js-\u003E\u003EeventBus.forms : souscrit a forms:search\r\n    \r\n        window.load--)mot.renderer.js : initMotRenderer()\r\n        mot.renderer.js-\u003E\u003EeventBus.forms : souscrit a mot:loading\r\n        mot.renderer.js-\u003E\u003EeventBus.forms : souscrit a mot:loaded\r\n        mot.renderer.js-\u003E\u003EeventBus.forms : souscrit a mot:error\r\n    end\r\n    \r\n    rect rgb(255, 223, 191)\r\n        note left of ui: Validation formulaire\r\n        ui--)window.validateForm: evt submit src motForm  \r\n        window.validateForm-\u003E\u003EeventBus.forms : publie forms:submit\r\n        eventBus.forms-\u003E\u003E+mot.form.js : forms:submit\r\n        mot.form.js--\u003Emot.form.js : validation\r\n    end\r\n    \r\n    rect rgb(191, 223, 255)\r\n        mot.form.js-\u003E\u003E-eventBus.forms : publie forms:search\r\n        eventBus.forms-\u003E\u003Emot.controller.js: forms:search\r\n    end\r\n    \r\n    rect rgb(255, 223, 191)\r\n        mot.controller.js-\u003E\u003EeventBus.forms : publie mot:loading 1\r\n        eventBus.forms-\u003E\u003E+mot.renderer.js : mot:loading\r\n        mot.renderer.js--)-ui : affichage chargement\r\n    end\r\n    \r\n    rect rgb(191, 223, 255)\t\r\n        note left of mot.service.js : requete\r\n        mot.controller.js-\u003E\u003E+mot.service.js : fetch()\r\n        mot.service.js--\u003Emot.service.js : response\r\n        mot.service.js-\u003E\u003E-mot.controller.js :result\r\n        mot.controller.js-\u003E\u003EeventBus.forms : publie mot:loaded\r\n        eventBus.forms-\u003E\u003E+mot.renderer.js: mot:loaded\r\n        mot.controller.js-\u003E\u003EeventBus.forms : publie mot:loading 0\r\n    end\r\n    \r\n    rect rgb(255, 223, 191)\r\n        mot.renderer.js--)-ui : affichage des donn\u00e9es en tableau\r\n    end\r\n\u003C\/pre\u003E\r\n\r\n                                \u003Cbutton id=\u0022executeButton\u0022 name=\u0022executeButton\u0022 onclick=\u0022mermaid_Run(\u0027mmG2\u0027)\u0022\u003EEx\u00e9cuter\u003C\/button\u003E","aside":"mermaid en zone centrale"}]},{"id":21,"title":"codeval","parts":[{"id":31,"title":"Volume normal selon ISO 2533","content":"\u003Cdiv id=\u0022CODEVAL_CVG5\u0022 class=\u0022cp_codeval\u0022\u003E\r\n                                    \u003Cdiv id=\u0022CODEVAL_CVG5_TITRE\u0022 class=\u0022titre\u0022\u003EVolume normal ISO 2533\u003C\/div\u003E\r\n                                        \u003Cdiv id=\u0022CODEVAL_CVG5_SCRIPTCODE\u0022 class=\u0022scriptcode\u0022\u003E\r\n                                            \u003Ctextarea rows=\u002212\u0022 class=\u0022cp_wysedit_textarea\u0022\u003E\r\nconst P2_rel_bar = 0.3\r\nconst P2_abs_bar = P2_rel_bar + 1\r\nconst P2_abs_pa = P2_abs_bar * 101325\r\nconst P1_abs_pa = 101325\r\nconst T2_degc = 20\r\nconst T1_K = 288.15\r\nconst T2_K = T2_degc + 273.15\r\nconst IDX1 = 2500420\r\nconst IDX2 = 2500620\r\nconst V2 = IDX2 - IDX1\r\nconst F = ( P2_abs_pa \/ P1_abs_pa ) * ( T1_K \/ T2_K)\r\nconst V1 = V2 * F\r\nconst result = \u0022 Volume corrige  = \u0022 + V1 + \u0022 Nm3 ; F = \u0022 + F\r\n                                            \u003C\/textarea\u003E\r\n                                        \u003C\/div\u003E\r\n                                        \u003Cdiv id=\u0022CODEVAL_CVG5_RESULT\u0022 class=\u0022result\u0022\u003E\u003C\/div\u003E\r\n                                        \u003Cbutton onclick=\u0022window.eventBusPublish(event, \u0027codeval:toggle\u0027, \u0027CVG5\u0027)\u0022\u003Ehide\/show\u003C\/button\u003E\r\n                                        \u003Cbutton onclick=\u0022window.eventBusPublish(event, \u0027codeval:eval\u0027, \u0027CVG5\u0027)\u0022\u003EEval\u003C\/button\u003E                                        \r\n                                    \u003C\/div\u003E","aside":"D\u00e9terminons le volume V1 normal du gaz dans des conditions normales (P1,T1) que represente le volume V2 dans les conditions d\u0027exploitation (P2,T2)\u003Cbr\/\u003E\r\n                                    - pression absolue P1 = 101 325 Pa\u003Cbr\/\u003E\r\n                                    - temp\u00e9rature T1 =  288,15 K\u003Cbr\/\u003E"}]},{"id":22,"title":"Apex","parts":[{"id":33,"title":"Histogramme","content":"\u003Cdiv id=\u0022APEX_1\u0022 class=\u0022cp_apex\u0022 data-chart=\u0022moteurCouple\u0022\u003E\u003C\/div\u003E","aside":"Apex zone centrale"}]},{"id":23,"title":"Carousel","parts":[{"id":33,"title":"Carousel d\u0027images","content":"\r\n                                        \u003Cdiv id=\u0022CAROUSEL_1\u0022 class=\u0022cp_carousel\u0022\u003E\r\n                                            \u003Cimg src=\u0022\/assets\/img\/technologies\/chf\/chbois\/hargassner-classic-lambda-coupe-profil-653x761.jpg\u0022\u003E\r\n                                            \u003Cimg src=\u0022\/assets\/img\/technologies\/chf\/chbois\/hargassner-classic-lambda-coupe-654x763.jpg\u0022\u003E\r\n                                            \u003Cimg src=\u0022\/assets\/img\/technologies\/chf\/chbois\/Agro%20ECO%20HK%20150-200%201000x800.jpg\u0022\u003E\r\n                                        \u003C\/div\u003E\r\n                                        \u003Cbutton onclick=\u0022ihmCarouselPrev(\u00271\u0027)\u0022\u003E\u2039\u003C\/button\u003E\r\n                                        \u003Cbutton onclick=\u0022ihmCarouselNext(\u00271\u0027)\u0022\u003E\u203a\u003C\/button\u003E\r\n                                    ","aside":"\r\n                                    \u003Cdiv id=\u0022CAROUSEL_2\u0022 class=\u0022cp_carousel\u0022\u003E\r\n                                        \u003Cimg src=\u0022\/assets\/img\/technologies\/chf\/chbois\/20240216_141203_h.jpg\u0022\u003E\r\n                                        \u003Cimg src=\u0022\/assets\/img\/technologies\/chf\/chbois\/20240216_141222_h.jpg\u0022\u003E\r\n                                        \u003Cimg src=\u0022\/assets\/img\/technologies\/chf\/chbois\/20240216_151927_h.jpg\u0022\u003E\r\n                                        \u003Cimg src=\u0022\/assets\/img\/technologies\/chf\/chbois\/20240216_151945_h.jpg\u0022\u003E                                                            \r\n                                    \u003C\/div\u003E\r\n                                    \u003Cbutton onclick=\u0022ihmCarouselPrev(\u00272\u0027)\u0022\u003E\u2039\u003C\/button\u003E\r\n                                    \u003Cbutton onclick=\u0022ihmCarouselNext(\u00272\u0027)\u0022\u003E\u203a\u003C\/button\u003E\r\n                                    "}]},{"id":24,"title":"Leaflet","parts":[{"id":34,"title":"Leaflet","content":"\u003Cdiv class=\u0022leafletContainer\u0022\u003E\r\n                                                \u003Cdiv id=\u0022leafletMap\u0022\u003E\u003C\/div\u003E\r\n                                                \u003Cdiv id=\u0022leafletInfo\u0022\u003ESome text\u003C\/div\u003E\r\n                                            \u003C\/div\u003E","aside":"\u003Cbutton id=\u0022testLeafelt\u0022 name=\u0022testLeafelt\u0022 onclick=\u0022testLeafelt()\u0022\u003EtestLeafelt\u003C\/button\u003E"}]},{"id":26,"title":"ThreeJs","parts":[{"id":36,"title":"cube","content":"\u003Cdiv id=\u0022THREE_1\u0022 class=\u0022cp_threejs\u0022 data-scene=\u0022cube\u0022 data-width=\u0022800\u0022 data-height=\u0022600\u0022\u003E\u003C\/div\u003E\r\n                                            \u003Cbutton onclick=\u0022threeList()\u0022\u003EList\u003C\/button\u003E\r\n                                            \u003Cbutton onclick=\u0022threeStart(\u0027THREE_1\u0027)\u0022\u003EStart\u003C\/button\u003E\r\n                                            \u003Cbutton onclick=\u0022threeStop(\u0027THREE_1\u0027)\u0022\u003EStop\u003C\/button\u003E","aside":""},{"id":37,"title":"galaxy","content":"\u003Cdiv id=\u0022THREE_2\u0022 class=\u0022cp_threejs\u0022 data-scene=\u0022galaxy\u0022  data-width=\u0022800\u0022 data-height=\u0022600\u0022\u003E\u003C\/div\u003E\r\n                                            \u003Cbutton onclick=\u0022threeStart(\u0027THREE_2\u0027)\u0022\u003EStart\u003C\/button\u003E\r\n                                            \u003Cbutton onclick=\u0022threeStop(\u0027THREE_2\u0027)\u0022\u003EStop\u003C\/button\u003E","aside":""},{"id":38,"title":"terrain","content":"\u003Cdiv id=\u0022THREE_3\u0022 class=\u0022cp_threejs\u0022 data-scene=\u0022terrain\u0022 data-width=\u0022800\u0022 data-height=\u0022600\u0022\u003E\u003C\/div\u003E\r\n                                            \u003Cbutton onclick=\u0022threeStart(\u0027THREE_3\u0027)\u0022\u003EStart\u003C\/button\u003E\r\n                                            \u003Cbutton onclick=\u0022threeStop(\u0027THREE_3\u0027)\u0022\u003EStop\u003C\/button\u003E\r\n                                ","aside":""},{"id":39,"title":"cube","content":"\u003Cdiv id=\u0022THREE_4\u0022 class=\u0022cp_threejs\u0022 data-scene=\u0022model\u0022   data-model=\u0022\/assets\/img\/3js\/model3d\/avions\/FW190.obj\u0022\u003E\u003C\/div\u003E\r\n                                            \u003Cbutton onclick=\u0022threeStart(\u0027THREE_4\u0027)\u0022\u003EStart\u003C\/button\u003E\r\n                                            \u003Cbutton onclick=\u0022threeStop(\u0027THREE_4\u0027)\u0022\u003EStop\u003C\/button\u003E\r\n                                ","aside":""}]},{"id":27,"title":"Dialog","parts":[{"id":40,"title":"Dialog","content":"\u003Cbutton onclick=\u0022showModal(\u0027DIALOG_1\u0027)\u0022\u003EshowModal DIALOG_1\u003C\/button\u003E\u003Cbutton onclick=\u0022showModal(\u0027DIALOG_2\u0027)\u0022\u003EshowModal DIALOG_2\u003C\/button\u003E","aside":""}]}]},{"id":11,"title":"Rom\u00e9o \u0026 Juliette","intro":"Mise en sc\u00e8ne vocale avec le composant Vox.","sections":[{"id":20,"title":"La sc\u00e8ne","parts":[{"id":30,"title":"Balcon de V\u00e9rone","content":"\r\n                                        \u003Cdiv class=\u0022cp_scene\u0022\r\n                                             style=\u0022background-image: url(\u0027https:\/\/picsum.photos\/seed\/verona\/1200\/500\u0027);\u0022\u003E\r\n                \r\n                                            \u003Cdiv class=\u0022cp_actor cp_actor--left\u0022 data-alias=\u0022Romeo\u0022\u003E\r\n                                                \u003Cimg\r\n                                                    src=\u0022https:\/\/picsum.photos\/seed\/romeo\/300\/450\u0022\r\n                                                    alt=\u0022Rom\u00e9o \u2014 Frank Dicksee 1884\u0022\r\n                                                \/\u003E\r\n                                                \u003Cspan class=\u0022cp_actor__name\u0022\u003ERom\u00e9o\u003C\/span\u003E\r\n                                            \u003C\/div\u003E\r\n                \r\n                                            \u003Cdiv class=\u0022cp_actor cp_actor--right\u0022 data-alias=\u0022Juliette\u0022\u003E\r\n                                                \u003Cimg\r\n                                                    src=\u0022https:\/\/picsum.photos\/seed\/juliette\/300\/450\u0022\r\n                                                    alt=\u0022Juliette \u2014 Waterhouse 1898\u0022\r\n                                                \/\u003E\r\n                                                \u003Cspan class=\u0022cp_actor__name\u0022\u003EJuliette\u003C\/span\u003E\r\n                                            \u003C\/div\u003E\r\n                                            \u003Cdiv id=\u0022VOX_RJ_STATUS\u0022 class=\u0022cp_scene__subtitles\u0022\u003E\u003C\/div\u003E\r\n                                        \u003C\/div\u003E","aside":"\r\n                                        \u003Ctextarea class=\u0022cp_voxzone_textarea2\u0022 id=\u0022TXT_VOX_RJ\u0022 rows=\u002210\u0022\u003E\r\n                Juliette: Rom\u00e9o, Rom\u00e9o, pourquoi es-tu Rom\u00e9o ?\r\n                Romeo: Mon nom, ch\u00e8re sainte, est une haine pour moi.\r\n                Juliette: Ni murs ni profondeur ne sauraient m\u0027arr\u00eater.\r\n                Romeo: Je suis plus en danger de ton regard que de vingt \u00e9p\u00e9es.\r\n                                        \u003C\/textarea\u003E\r\n                                        \u003Cbr\/\u003E\r\n                                        \u003Cbutton onclick=\u0022window.eventBusPublish(event, \u0027vox:speak\u0027, { targetId:\u0027TXT_VOX_RJ\u0027, statusId:\u0027VOX_RJ_STATUS\u0027 })\u0022\u003E\u25b6 Lire\u003C\/button\u003E\r\n                                        \u003Cbutton onclick=\u0022window.eventBusPublish(event, \u0027vox:pause\u0027)\u0022\u003E\u23f8 Pause\u003C\/button\u003E\r\n                                        \u003Cbutton onclick=\u0022window.eventBusPublish(event, \u0027vox:resume\u0027)\u0022\u003E\u25b6\u25b6 Resume\u003C\/button\u003E\r\n                                        \u003Cbutton onclick=\u0022window.eventBusPublish(event, \u0027vox:stop\u0027)\u0022\u003E\u23f9 Stop\u003C\/button\u003E\r\n                                        \u003Cbr\/\u003E\u003Cbr\/\u003E\r\n                                    "}]}]},{"id":12,"title":"Test Autocomplete","intro":"D\u00e9monstration du composant autocomplete via bus.","sections":[{"id":30,"title":"Recherche de mot","parts":[{"id":50,"title":"Autocomplete mot","content":"\r\n                                        \u003Cdiv id=\u0022acTestContainer\u0022\u003E\r\n                                            \u003Cdiv id=\u0022acTestField\u0022\u003E\u003C\/div\u003E\r\n                                            \u003Chr\u003E\r\n                                            \u003Cdiv id=\u0022acTestResult\u0022 style=\u0022margin-top:10px;padding:8px;background:#f0f4ff;border-radius:4px;min-height:2rem;\u0022\u003E\r\n                                                S\u00e9lection : \u003Cstrong id=\u0022acTestValue\u0022\u003E\u2014\u003C\/strong\u003E\r\n                                                (id : \u003Cspan id=\u0022acTestId\u0022\u003E\u2014\u003C\/span\u003E)\r\n                                            \u003C\/div\u003E\r\n                                        \u003C\/div\u003E\r\n                                    ","aside":"\r\n                                        \u003Cp\u003ETapez au moins 2 caract\u00e8res.\u003C\/p\u003E\r\n                                        \u003Cp\u003ENaviguez avec \u2191 \u2193 et validez avec Entr\u00e9e.\u003C\/p\u003E\r\n                                        \u003Cp\u003EL\u0027id s\u00e9lectionn\u00e9 est stock\u00e9 dans le champ cach\u00e9.\u003C\/p\u003E\r\n                                    "}]}]},{"id":13,"title":"Images","intro":"Gestion de la m\u00e9diath\u00e8que.","sections":[{"id":31,"title":"M\u00e9diath\u00e8que","parts":[{"id":51,"title":"Gestion des images","content":"\r\n                                        \u003Cdiv id=\u0022imageContainer\u0022 class=\u0022cp_module_container\u0022\u003E\r\n                                            \u003Cdiv class=\u0022cp_panel_buttons\u0022\u003E\u003C\/div\u003E\r\n                                            \u003Cdiv class=\u0022cp_panel_form\u0022   style=\u0022display:none\u0022\u003E\u003C\/div\u003E\r\n                                            \u003Cdiv class=\u0022cp_panel_detail\u0022 style=\u0022display:none\u0022\u003E\u003C\/div\u003E\r\n                                            \u003Cdiv class=\u0022cp_panel_table\u0022\u003E\u003C\/div\u003E\r\n                                            \u003Cdiv class=\u0022cp_panel_pagination\u0022\u003E\u003C\/div\u003E\r\n                                        \u003C\/div\u003E\r\n                                    ","aside":"\u003Cp\u003EUpload, recherche et validation des images.\u003C\/p\u003E"}]}]},{"id":14,"title":"Formes juridiques","intro":"R\u00e9f\u00e9rentiel INSEE des formes juridiques (260 codes).","sections":[{"id":32,"title":"R\u00e9f\u00e9rentiel","parts":[{"id":52,"title":"Formes juridiques","content":"\r\n                                        \u003Cdiv id=\u0022fjContainer\u0022 class=\u0022cp_module_container\u0022\u003E\r\n                                            \u003Cdiv class=\u0022cp_panel_buttons\u0022\u003E\u003C\/div\u003E\r\n                                            \u003Cdiv class=\u0022cp_panel_form\u0022   style=\u0022display:none\u0022\u003E\u003C\/div\u003E\r\n                                            \u003Cdiv class=\u0022cp_panel_detail\u0022 style=\u0022display:none\u0022\u003E\u003C\/div\u003E\r\n                                            \u003Cdiv class=\u0022cp_panel_table\u0022\u003E\u003C\/div\u003E\r\n                                            \u003Cdiv class=\u0022cp_panel_pagination\u0022\u003E\u003C\/div\u003E\r\n                                        \u003C\/div\u003E\r\n                                    ","aside":"\r\n                                        \u003Cp\u003ESource : INSEE catjurique2022\u003C\/p\u003E\r\n                                        \u003Cp\u003E260 codes de \u003Ccode\u003E0000\u003C\/code\u003E \u00e0 \u003Ccode\u003E9970\u003C\/code\u003E.\u003C\/p\u003E\r\n                                        \u003Cp\u003EUtilis\u00e9 par le module \u003Cstrong\u003EEntreprise\u003C\/strong\u003E.\u003C\/p\u003E\r\n                                    "}]}]},{"id":15,"title":"Types de voie","intro":"R\u00e9f\u00e9rentiel des 63 types de voie.","sections":[{"id":33,"title":"R\u00e9f\u00e9rentiel","parts":[{"id":53,"title":"Types de voie","content":"\r\n                                \u003Cdiv id=\u0022tvContainer\u0022 class=\u0022cp_module_container\u0022\u003E\r\n                                    \u003Cdiv class=\u0022cp_panel_buttons\u0022\u003E\u003C\/div\u003E\r\n                                    \u003Cdiv class=\u0022cp_panel_form\u0022   style=\u0022display:none\u0022\u003E\u003C\/div\u003E\r\n                                    \u003Cdiv class=\u0022cp_panel_detail\u0022 style=\u0022display:none\u0022\u003E\u003C\/div\u003E\r\n                                    \u003Cdiv class=\u0022cp_panel_table\u0022\u003E\u003C\/div\u003E\r\n                                    \u003Cdiv class=\u0022cp_panel_pagination\u0022\u003E\u003C\/div\u003E\r\n                                \u003C\/div\u003E","aside":"\u003Cp\u003E63 types \u2014 Rue, Avenue, Boulevard\u2026\u003C\/p\u003E\r\n                                        \u003Cp\u003EUtilis\u00e9 par le module \u003Cstrong\u003EAdresse\u003C\/strong\u003E.\u003C\/p\u003E"}]}]},{"id":16,"title":"Codes postaux","intro":"39 192 codes postaux France \u2014 source La Poste.","sections":[{"id":34,"title":"Recherche","parts":[{"id":54,"title":"Codes postaux","content":"\r\n                                \u003Cdiv id=\u0022cpContainer\u0022 class=\u0022cp_module_container\u0022\u003E\r\n                                    \u003Cdiv class=\u0022cp_panel_form\u0022   style=\u0022display:none\u0022\u003E\u003C\/div\u003E\r\n                                    \u003Cdiv class=\u0022cp_panel_detail\u0022 style=\u0022display:none\u0022\u003E\u003C\/div\u003E\r\n                                    \u003Cdiv class=\u0022cp_panel_table\u0022\u003E\u003C\/div\u003E\r\n                                    \u003Cdiv class=\u0022cp_panel_pagination\u0022\u003E\u003C\/div\u003E\r\n                                \u003C\/div\u003E","aside":"\r\n                                \u003Cp\u003ERecherche par code postal, code INSEE ou nom de commune.\u003C\/p\u003E\r\n                                \u003Cp\u003ECliquez sur une ligne pour voir le d\u00e9tail et le lien carte.\u003C\/p\u003E\r\n                                \u003Cp\u003EUtilis\u00e9 par le module \u003Cstrong\u003EAdresse\u003C\/strong\u003E.\u003C\/p\u003E"}]}]},{"id":17,"title":"Adresses","intro":"Gestion des adresses postales.","sections":[{"id":35,"title":"Adresses","parts":[{"id":55,"title":"Gestion des adresses","content":"\r\n                                \u003Cdiv id=\u0022adresseContainer\u0022 class=\u0022cp_module_container\u0022\u003E\r\n                                    \u003Cdiv class=\u0022cp_panel_buttons\u0022\u003E\u003C\/div\u003E\r\n                                    \u003Cdiv class=\u0022cp_panel_form\u0022   style=\u0022display:none\u0022\u003E\u003C\/div\u003E\r\n                                    \u003Cdiv class=\u0022cp_panel_detail\u0022 style=\u0022display:none\u0022\u003E\u003C\/div\u003E\r\n                                    \u003Cdiv class=\u0022cp_panel_table\u0022\u003E\u003C\/div\u003E\r\n                                    \u003Cdiv class=\u0022cp_panel_pagination\u0022\u003E\u003C\/div\u003E\r\n                                \u003C\/div\u003E","aside":"\r\n                                \u003Cp\u003EFK vers \u003Cstrong\u003Etype_voies\u003C\/strong\u003E et \u003Cstrong\u003Ecodes_postaux\u003C\/strong\u003E.\u003C\/p\u003E\r\n                                \u003Cp\u003EL\u0027acheminement, les coordonn\u00e9es et la ligne 5 sont\r\n                                   auto-remplis depuis le code postal s\u00e9lectionn\u00e9.\u003C\/p\u003E"}]}]},{"id":18,"title":"Organisations","intro":"Gestion des organisations.","sections":[{"id":36,"title":"Organisation","parts":[{"id":56,"title":"Gestion des organisations","content":"\r\n                                \u003Cdiv id=\u0022orgContainer\u0022 class=\u0022cp_module_container\u0022\u003E\r\n                                    \u003Cdiv class=\u0022cp_panel_buttons\u0022\u003E\u003C\/div\u003E\r\n                                    \u003Cdiv class=\u0022cp_panel_form\u0022 style=\u0022display:none\u0022\u003E\u003C\/div\u003E\r\n                                    \u003Cdiv class=\u0022cp_panel_detail\u0022 style=\u0022display:none\u0022\u003E\u003C\/div\u003E\r\n                                    \u003Cdiv class=\u0022cp_panel_table\u0022\u003E\u003C\/div\u003E\r\n                                    \u003Cdiv class=\u0022cp_panel_pagination\u0022\u003E\u003C\/div\u003E\r\n                                \u003C\/div\u003E","aside":"\u003Cp\u003EOrganisation.\u003C\/p\u003E"}]}]},{"id":19,"title":"Entreprise","intro":"Gestion des entreprise.","sections":[{"id":37,"title":"Entreprise","parts":[{"id":57,"title":"Gestion des entreprise","content":"\r\n                                \u003Cdiv id=\u0022entContainer\u0022 class=\u0022cp_module_container\u0022\u003E\r\n                                    \u003Cdiv class=\u0022cp_panel_buttons\u0022\u003E\u003C\/div\u003E\r\n                                    \u003Cdiv class=\u0022cp_panel_form\u0022 style=\u0022display:none\u0022\u003E\u003C\/div\u003E\r\n                                    \u003Cdiv class=\u0022cp_panel_detail\u0022 style=\u0022display:none\u0022\u003E\u003C\/div\u003E\r\n                                    \u003Cdiv class=\u0022cp_panel_table\u0022\u003E\u003C\/div\u003E\r\n                                    \u003Cdiv class=\u0022cp_panel_pagination\u0022\u003E\u003C\/div\u003E\r\n                                \u003C\/div\u003E","aside":"\u003Cp\u003EEntreprise.\u003C\/p\u003E"}]}]}];

        /*
        d : data ; f: filtre , c : champ
        */
        function filter(d , f  , c) {
            if (!d || !f || !c ) return d
            return d.filter( o => { return (o[c]  == f ) } )
        }



        function cp_edit_clog( event , msg ){
            event.stopPropagation()
            
            //const strTmp = cp_edit_articles.length 
            //console.log('app/Views/cms/components/cp_edit.php :: articles trouvés = ' + strTmp)
            
            console.log('app/Views/cms/components/cp_edit.php :: cp_edit_clog ' + msg)

            const test = filter( cp_edit_articles , msg.aid , 'id')
        }

        </script>



            <header>
                <h1>RESERVED</h1>
                <p>Zone de test composants composites</p>
            </header>

            <section>
                <h2>Composant articleZone</h2>
                    <div>
                        <div>
                            <h3>edit</h3>
                            Ce composant doit servir de base aux intégrations des components js dans le scomposant composites php
                            
                            <h3>articles</h3>

                            <ul>
                                                        
                                <li onclick="cp_edit_clog(event , { aid : 1 } )" >
                                    1 - Accueil du portail                                    <ul>
                                    
                                        <li onclick="cp_edit_clog( event ,'aid 1, sid 1')" >
                                            1 - Bienvenue                                        </li>

                                    
                                        <li onclick="cp_edit_clog( event ,'aid 1, sid 2')" >
                                            2 - Actualités                                        </li>

                                    
                                        <li onclick="cp_edit_clog( event ,'aid 1, sid 3')" >
                                            3 - Environnement                                        </li>

                                     
                                    </ul>
    
                                </li>

                                                        
                                <li onclick="cp_edit_clog(event , { aid : 2 } )" >
                                    2 - Technologies                                    <ul>
                                    
                                        <li onclick="cp_edit_clog( event ,'aid 2, sid 4')" >
                                            4 - Introduction                                        </li>

                                     
                                    </ul>
    
                                </li>

                                                        
                                <li onclick="cp_edit_clog(event , { aid : 3 } )" >
                                    3 - Histoire                                    <ul>
                                    
                                        <li onclick="cp_edit_clog( event ,'aid 3, sid 5')" >
                                            5 - Introduction                                        </li>

                                    
                                        <li onclick="cp_edit_clog( event ,'aid 3, sid 6')" >
                                            6 - Saint Leau d&#039;Esserent                                        </li>

                                     
                                    </ul>
    
                                </li>

                                                        
                                <li onclick="cp_edit_clog(event , { aid : 4 } )" >
                                    4 - Informatique                                    <ul>
                                    
                                        <li onclick="cp_edit_clog( event ,'aid 4, sid 5')" >
                                            5 - Architecture modulaire                                        </li>

                                     
                                    </ul>
    
                                </li>

                                                        
                                <li onclick="cp_edit_clog(event , { aid : 5 } )" >
                                    5 - Dictionnaire                                    <ul>
                                    
                                        <li onclick="cp_edit_clog( event ,'aid 5, sid 6')" >
                                            6 - Introduction                                        </li>

                                     
                                    </ul>
    
                                </li>

                                                        
                                <li onclick="cp_edit_clog(event , { aid : 6 } )" >
                                    6 - Code Naf                                    <ul>
                                    
                                        <li onclick="cp_edit_clog( event ,'aid 6, sid 7')" >
                                            7 - Introduction                                        </li>

                                     
                                    </ul>
    
                                </li>

                                                        
                                <li onclick="cp_edit_clog(event , { aid : 7 } )" >
                                    7 - Compte PCG                                    <ul>
                                    
                                        <li onclick="cp_edit_clog( event ,'aid 7, sid 8')" >
                                            8 - Introduction                                        </li>

                                     
                                    </ul>
    
                                </li>

                                                        
                                <li onclick="cp_edit_clog(event , { aid : 8 } )" >
                                    8 - WysEdit                                    <ul>
                                    
                                        <li onclick="cp_edit_clog( event ,'aid 8, sid 9')" >
                                            9 - Éditeur                                        </li>

                                     
                                    </ul>
    
                                </li>

                                                        
                                <li onclick="cp_edit_clog(event , { aid : 9 } )" >
                                    9 - Vox                                    <ul>
                                    
                                        <li onclick="cp_edit_clog( event ,'aid 9, sid 10')" >
                                            10 - Composant vox                                        </li>

                                    
                                        <li onclick="cp_edit_clog( event ,'aid 9, sid 25')" >
                                            25 - Composant vox                                        </li>

                                     
                                    </ul>
    
                                </li>

                                                        
                                <li onclick="cp_edit_clog(event , { aid : 10 } )" >
                                    10 - Composants                                    <ul>
                                    
                                        <li onclick="cp_edit_clog( event ,'aid 10, sid 11')" >
                                            11 - mermaid                                        </li>

                                    
                                        <li onclick="cp_edit_clog( event ,'aid 10, sid 21')" >
                                            21 - codeval                                        </li>

                                    
                                        <li onclick="cp_edit_clog( event ,'aid 10, sid 22')" >
                                            22 - Apex                                        </li>

                                    
                                        <li onclick="cp_edit_clog( event ,'aid 10, sid 23')" >
                                            23 - Carousel                                        </li>

                                    
                                        <li onclick="cp_edit_clog( event ,'aid 10, sid 24')" >
                                            24 - Leaflet                                        </li>

                                    
                                        <li onclick="cp_edit_clog( event ,'aid 10, sid 26')" >
                                            26 - ThreeJs                                        </li>

                                    
                                        <li onclick="cp_edit_clog( event ,'aid 10, sid 27')" >
                                            27 - Dialog                                        </li>

                                     
                                    </ul>
    
                                </li>

                                                        
                                <li onclick="cp_edit_clog(event , { aid : 11 } )" >
                                    11 - Roméo &amp; Juliette                                    <ul>
                                    
                                        <li onclick="cp_edit_clog( event ,'aid 11, sid 20')" >
                                            20 - La scène                                        </li>

                                     
                                    </ul>
    
                                </li>

                                                        
                                <li onclick="cp_edit_clog(event , { aid : 12 } )" >
                                    12 - Test Autocomplete                                    <ul>
                                    
                                        <li onclick="cp_edit_clog( event ,'aid 12, sid 30')" >
                                            30 - Recherche de mot                                        </li>

                                     
                                    </ul>
    
                                </li>

                                                        
                                <li onclick="cp_edit_clog(event , { aid : 13 } )" >
                                    13 - Images                                    <ul>
                                    
                                        <li onclick="cp_edit_clog( event ,'aid 13, sid 31')" >
                                            31 - Médiathèque                                        </li>

                                     
                                    </ul>
    
                                </li>

                                                        
                                <li onclick="cp_edit_clog(event , { aid : 14 } )" >
                                    14 - Formes juridiques                                    <ul>
                                    
                                        <li onclick="cp_edit_clog( event ,'aid 14, sid 32')" >
                                            32 - Référentiel                                        </li>

                                     
                                    </ul>
    
                                </li>

                                                        
                                <li onclick="cp_edit_clog(event , { aid : 15 } )" >
                                    15 - Types de voie                                    <ul>
                                    
                                        <li onclick="cp_edit_clog( event ,'aid 15, sid 33')" >
                                            33 - Référentiel                                        </li>

                                     
                                    </ul>
    
                                </li>

                                                        
                                <li onclick="cp_edit_clog(event , { aid : 16 } )" >
                                    16 - Codes postaux                                    <ul>
                                    
                                        <li onclick="cp_edit_clog( event ,'aid 16, sid 34')" >
                                            34 - Recherche                                        </li>

                                     
                                    </ul>
    
                                </li>

                                                        
                                <li onclick="cp_edit_clog(event , { aid : 17 } )" >
                                    17 - Adresses                                    <ul>
                                    
                                        <li onclick="cp_edit_clog( event ,'aid 17, sid 35')" >
                                            35 - Adresses                                        </li>

                                     
                                    </ul>
    
                                </li>

                                                        
                                <li onclick="cp_edit_clog(event , { aid : 18 } )" >
                                    18 - Organisations                                    <ul>
                                    
                                        <li onclick="cp_edit_clog( event ,'aid 18, sid 36')" >
                                            36 - Organisation                                        </li>

                                     
                                    </ul>
    
                                </li>

                                                        
                                <li onclick="cp_edit_clog(event , { aid : 19 } )" >
                                    19 - Entreprise                                    <ul>
                                    
                                        <li onclick="cp_edit_clog( event ,'aid 19, sid 37')" >
                                            37 - Entreprise                                        </li>

                                     
                                    </ul>
    
                                </li>

                             
                            </ul>

                        </div>
                        <aside>
                            Composant de base
                        </aside>	            
                    </div>
            </section>
        </article>    </main>


 
            <footer>
        En cours de modification version 0.4 - CodeIgniter 4.7
    </footer>


    <dialog id="DIALOG_1" class="cp_dialog">
        <button autofocus onclick="closeModal('DIALOG_1')">Fermer</button>
        <p>Cette boîte de dialogue modale a un arrière-plan festif&nbsp;!</p>
    </dialog>

    <dialog id="DIALOG_2" class="cp_dialog">
        <button autofocus onclick="closeModal('DIALOG_2')">Fermer</button>
        <p>Cette seconde boîte de dialogue modale n'est pas indépendante&nbsp;</p>
        <form id="form10" class="form_style1"  onsubmit="return validateForm(this)">

            <label>First Name</label>
            <input type="text" name="firstname" value="" pattern="[a-zA-Z]{2,50}" placeholder="Saisir le prénom" required minlength="2" maxlength="50"/>

            <label>Last Name</label>
            <input type="text" name="lastname" placeholder="Your last name..">

            <label>Country</label>
            <select name="country">
            <option value="australia">Australia</option>
            <option value="canada">Canada</option>
            <option value="usa">USA</option>
            </select>
            
            <textarea name="message">Some text...</textarea>
            
            <input type="submit" value="Submit">

        </form>        
    </dialog>

            </body>
    
</html>