Widget générique pour un Switch

Bonjour à tous,

ça vous dit le code pour un widget de switch pas mal paramétrable?
Basé sur nooNeonButton de @noodom

Quelques exemples avec différents paramétrages :slight_smile:

Code à venir :slight_smile:

Silkarion

Réservé pour le code…

Je vous laisse jouer avec cette v1.0
Il restera une sécurisation des paramètres pour éviter les résultats étranges…

Toute idée d’amélioration/correction est la bienvenue :slight_smile:

<div class="silkButton#id#">
    <!-- ################ _GenericSwitchButton ################ 
 
		Versionnage :
		V1.0 - 24/02/2025 : Création

       ########### by @Silkarion 
       ########### inspiré par nooNeonButton de @noodom #############
    -->
    <template>	
    
        <div></div>
        <div></div>
        <div></div>
        <div>/*************************************/</div>
        <div>/* ******* Button parameters ******* */</div>
        <div>/*************************************/</div>
        <div>ButtonWidth   : largeur du bouton (defaut: 120px)</div>
        <div>ButtonHeight  : hauteur du bouton (defaut: 40px)</div>
        <div>BouttonOrient : angle du bouton (defaut: 0deg)</div>
        <div></div>  
        <div>NeonLevelOn   : niveau néon du bouton à On en multiple de 10px (defaut: 0.0)</div>
        <div>NeonLevelOff  : niveau néon du bouton à Off en multiple de 10px (defaut: 0.0)</div>
        <div>BouttonRadius : Radius du bouton en % ou px (defaut: 20px)</div>
	    <div></div>  
        <div>backgroundColorFromOn  : couleur de début du dégradé du bouton On ('#70a1ff' si non renseigné)</div>
        <div>backgroundColorToOn    :  couleur de fin du dégradé du bouton On ('#1e90ff' si non renseigné)</div>
        <div>backgroundColorFromOff : couleur de début du dégradé du bouton Off ('#333' si non renseigné)</div>
        <div>backgroundColorToOff   :  couleur de fin du dégradé du bouton Off ('#252525' si non renseigné)</div>
        <div></div>
        <div></div>
        <div></div>
        <div>/*************************************/</div>
        <div>/* ******* Mover parameters ******* */</div>
        <div>/*************************************/</div>
        <div>MoverWidth : Largeur du bouton mobile (defaut: 40px) </div>
        <div></div>
        <div></div>
        <div></div>
        <div>/*************************************/</div>
        <div>/* ******* LED parameters ******* */</div>
        <div>/*************************************/</div>
        <div>MoverLedWidthRatio  : Ratio de largeur par rapport au bouton (defaut: 0.2)</div>
        <div>MoverLedHeightRatio : Ratio de hauteur par rapport au bouton (defaut: 0.2)</div>
        <div></div>
        <div>LedRadius : Radius de la led (defaut: 10px)</div>
        <div></div>
        <div></div>
        <div></div>
        <div>/*************************************/</div>
        <div>/* ******* Texte parameters ******** */</div>
        <div>/*************************************/</div>
        <div>nameTextOn   : contenu du texte du bouton On (vide si non renseigné)</div>
        <div>nameTextOff  : contenu du texte du bouton Off (nameTextOn si non renseigné, vide si nameTextOn non renseigné)</div>
        <div></div>
        <div>colorTextOn  : couleur du texte du bouton On (backgroundColorFromOn si non renseigné)</div>
        <div>colorTextOff : couleur du texte du bouton Off (colorTextOn si non renseigné, '#000' si colorTextOn non renseigné)</div>
        <div></div>
        <div></div>
        <div></div>
  
  </template>	
    <div class="title #hide_name#">
       <div class="cmdName">#name_display#</div>
    </div>
  
    <input type="checkbox" id="neonInput#id#" class="neonInput#id#" class="toggle cursor cmd tooltips cmd-widget"
        data-type="action" data-subtype="other" data-cmd_id="#id#" data-cmd_uid="#uid#">
    <span id="neonText#id#" data-on="On" data-off="Off"></span>
</div>

<script type="text/javascript">

  
/*************************************/
/* ******* Button parameters ******* */
/*************************************/
  
  var buttonWidth#uid# = (('#ButtonWidth#' !='#'+'ButtonWidth#')) ? parseInt("#ButtonWidth#") : 120;
  if(buttonWidth#uid#=='') {buttonWidth#uid#=120;}
  document.documentElement.style.setProperty('--button-size-width#uid#', parseInt(buttonWidth#uid#) + 'px');

  var buttonHeight#uid# = (('#ButtonHeight#' !='#'+'ButtonHeight#')) ? parseInt("#ButtonHeight#") : 40;
  if(buttonHeight#uid#=='') {buttonHeight#uid#=40;}
  document.documentElement.style.setProperty('--button-size-height#uid#', parseInt(buttonHeight#uid#) + 'px');

  var buttonDeg#id# = ('#BouttonOrient#' != '#' + 'BouttonOrient#') ? "#BouttonOrient#" : "0deg";
    if (buttonDeg#id# != '')
    	{ document.documentElement.style.setProperty('--buttonDeg#id#', buttonDeg#id#);}
    else 
    	{ document.documentElement.style.setProperty('--buttonDeg#id#', "0deg");}
  
  var neonLevelOn#uid# = (('#NeonLevelOn#' !='#'+'NeonLevelOn#')) ? parseFloat("#NeonLevelOn#") : 0;
  if(neonLevelOn#uid#=='') {neonLevelOn#uid#=0;}
  document.documentElement.style.setProperty('--neon-levelOn#uid#', parseInt(neonLevelOn#uid# * 10) + 'px');
 
  var neonLevelOff#uid# = (('#NeonLevelOff#' !='#'+'NeonLevelOff#')) ? parseFloat("#NeonLevelOff#") : 0;
  if(neonLevelOff#uid#=='') {neonLevelOff#uid#=0;}
  document.documentElement.style.setProperty('--neon-levelOff#uid#', parseInt(neonLevelOff#uid# * 10) + 'px');


 
  var buttonRadius#uid# = ('#BouttonRadius#' != '#' + 'BouttonRadius#') ? "#BouttonRadius#" : '20px';
    if (buttonRadius#uid# != '')
    	{ document.documentElement.style.setProperty('--button-radius#uid#', buttonRadius#uid#);}
    else 
    	{ document.documentElement.style.setProperty('--button-radius#uid#', '20px');}

  // Dégradé pour bouton On
    var backgroundColorFromOn#id# = ('#backgroundColorFromOn#' != '#' + 'backgroundColorFromOn#') ? "#backgroundColorFromOn#" : '#70a1ff';
    if (backgroundColorFromOn#id# != '') {
        document.documentElement.style.setProperty('--background-color-from-on#id#', backgroundColorFromOn#id#);
    }
  var backgroundColorToOn#id# = ('#backgroundColorToOn#' != '#' + 'backgroundColorToOn#') ? "#backgroundColorToOn#" : '#1e90ff';
    if (backgroundColorToOn#id# != '') {
        document.documentElement.style.setProperty('--background-color-to-on#id#', backgroundColorToOn#id#);
    }
  
  // Dégradé pour bouton Off
   var backgroundColorFromOff#id# = ('#backgroundColorFromOff#' != '#' + 'backgroundColorFromOff#') ? "#backgroundColorFromOff#" : '#333';
   if (backgroundColorFromOff#id# != '') {
        document.documentElement.style.setProperty('--background-color-from-off#id#', backgroundColorFromOff#id#);
    }
  
  var backgroundColorToOff#id# = ('#backgroundColorToOff#' != '#' + 'backgroundColorToOff#') ? "#backgroundColorToOff#" : '#252525';
   if (backgroundColorToOff#id# != '') {
        document.documentElement.style.setProperty('--background-color-to-off#id#', backgroundColorToOff#id#);
    }

/*************************************/  
/* ******** Mover parameters ******* */
/*************************************/
  
  var moverWidth#uid# = ('#MoverWidth#' != '#' + 'MoverWidth#') ? "#MoverWidth#" : '40px';
    if (moverWidth#uid# != '')
    { document.documentElement.style.setProperty('--mover-width#uid#', parseInt(moverWidth#uid#) +'px');}
    else 
    { document.documentElement.style.setProperty('--mover-width#uid#', '40px');}  
  
  
/*************************************/  
/* ******* LED parameters ********** */
/*************************************/
  var moverLedWidthRatio#uid# = ('#MoverLedWidthRatio#' !='#'+'MoverLedWidthRatio#') ? parseFloat("#MoverLedWidthRatio#") : 0.2;
     if (moverLedWidthRatio#uid# != '') 
     	{ document.documentElement.style.setProperty('--mover-led-width-ratio#uid#', moverLedWidthRatio#uid#);}
    else 
    	{ document.documentElement.style.setProperty('--mover-led-width-ratio#uid#', 0.2);} 
    
   var moverLedHeightRatio#uid# = ('#MoverLedHeightRatio#' !='#'+'MoverLedHeightRatio#') ? parseFloat("#MoverLedHeightRatio#") : 0.2;
     if (moverLedHeightRatio#uid# != '')
     	{ document.documentElement.style.setProperty('--mover-led-height-ratio#uid#', moverLedHeightRatio#uid#);}
    else 
    	{ document.documentElement.style.setProperty('--mover-led-height-ratio#uid#', 0.2);}    
    
  var ledRadius#uid# = ('#LedRadius#' != '#' + 'LedRadius#') ? "#LedRadius#" : '10px';
    if (ledRadius#uid# != '')
    	{ document.documentElement.style.setProperty('--mover-led-radius#uid#', ledRadius#uid#);}
    else 
    	{ document.documentElement.style.setProperty('--mover-led-radius#uid#', '10px');}
   
  
/*************************************/
/* ******** Texte parameters ******* */ 
/*************************************/
     // Couleur texte pour bouton On
    var colorTextOn#id# = ('#colorTextOn#' != '#' + 'colorTextOn#') ? "#colorTextOn#" : backgroundColorFromOn#id#;
  
  // Couleur texte pour bouton Off
    var colorTextOff#id# = ('#colorTextOff#' != '#' + 'colorTextOff#') ? "#colorTextOff#" : ((colorTextOn#id# != '')?colorTextOn#id#: '#000');
  
  // Texte pour bouton On
    var nameTextOn#id# = ('#nameTextOn#' != '#' + 'nameTextOn#') ? "#nameTextOn#" : '';
  
  // Texte pour bouton Off
    var nameTextOff#id# = ('#nameTextOff#' != '#' + 'nameTextOff#') ? "#nameTextOff#" : ((nameTextOn#id# != '')?nameTextOn#id#: '');
 
    jeedom.cmd.update['#id#'] = function (_options) {
        document.getElementById('neonText#id#').style.display = (nameTextOn#id# == '' && nameTextOn#id# == '')?"none":"block";
        if (_options.display_value == '1' || _options.display_value == 1 || _options.display_value == '99' || _options.display_value == 99 || _options.display_value == 'on') {
            document.getElementById('neonInput#id#').checked = true;
            document.documentElement.style.setProperty('--text-color#id#', colorTextOn#id#);
            document.getElementById('neonText#id#').innerHTML = nameTextOn#id#;
        } else {
            document.getElementById('neonInput#id#').checked = false;
            document.documentElement.style.setProperty('--text-color#id#', colorTextOff#id#);
            document.getElementById('neonText#id#').innerHTML = nameTextOff#id#;
        }
    }
    jeedom.cmd.update['#id#']({ display_value: '#state#' });
  
    $('#neonInput#id#').off().on('click', function () {
        jeedom.cmd.execute({ id: '#id#' });
    });
</script>

<style>
    :root {
        --text-color-on#id#: green;
        --text-color-off#id#: red;
        --background-color-from-on#id#: #70a1ff;
        --background-color-to-on#id#: #1e90ff;
        --background-color-from-off#id#: #333;
        --background-color-to-off#id#: #000;
      
      --buttonDeg#id#: 0deg;
      --button-size-width#uid#: 120px;
      --button-size-height#uid#: 40px;
      --button-radius#uid#: 10px;
      
      --mover-width#uid#: 60px;
      --mover-Xpos#uid#: 20px;
      
      --mover-led-width-ratio#uid#: 0.2;
      --mover-led-height-ratio#uid#: 0.2;
      --mover-led-width#uid#: calc(var(--mover-led-width-ratio#uid#)*min(var(--mover-width#uid#), var(--button-size-width#uid#), var(--button-size-height#uid#)));      
      --mover-led-height#uid#: calc(var(--mover-led-height-ratio#uid#)*min(var(--mover-width#uid#), var(--button-size-width#uid#), var(--button-size-height#uid#)));      
      --mover-led-radius#uid#: 50%;
      
      --border-color-in#uid#:#3e3e3e;
      --border-color-center#uid#:#353535;
      --border-color-out#uid#:#3e3e3e;
      --neon-levelOn#uid#: 10px;
      --neon-levelOff#uid#: 10px;
    }
  
  

/******* Contenaire principal ****/
.silkButton#id# {
    
    -webkit-transform-origin-x: center;
    -webkit-transform-origin-y: center;
    transform: rotate(calc(-1 * var(--buttonDeg#id#)));

    min-height: max(var(--button-size-width#uid#),calc(var(--button-size-width#uid#)*Math.sin(var(--buttonDeg#id#)))) !important;
    min-width: var(--button-size-width#uid#) !important;

    margin: 5px 10px 5px 10px !important ;

  }
  
 /******* Element ****/
 .neonInput#id#[type="checkbox"] {
      /* Marge autour de l'élément > ce qui adaptera la taille du container principal */
        margin: 5px 5px 5px 5px !important; 
        position: relative !important;
        width: var(--button-size-width#uid#) !important;
        height: var(--button-size-height#uid#)  !important;
        -webkit-appearance: none !important;
        outline: none !important;
        border-radius: var(--button-radius#uid#) !important;
   
}  

/* affichage spécifique à l'état ON */
.neonInput#id#:checked[type="checkbox"] {
        background: linear-gradient(calc(-1 * var(--buttonDeg#id#)), var(--background-color-from-on#id#), var(--background-color-to-on#id#)) !important;
      /* box bordure*/
        box-shadow: 0 0 0 2px var(--border-color-in#uid#), 0 0 var(--neon-levelOn#uid#) 4px var(--background-color-to-on#id#), 0 0 0 6px var(--border-color-out#uid#), inset 0 0 10px rgba(0, 0, 0, 1) !important;  
      
  }

/* affichage spécifique à l'état OFF */
.neonInput#id#:not(:checked)[type="checkbox"] {
        background: linear-gradient(calc(-1 * var(--buttonDeg#id#)), var(--background-color-from-off#id#), var(--background-color-to-off#id#)) !important;
      /* box bordure*/
        box-shadow: 0 0 0 2px var(--border-color-in#uid#), 0 0 var(--neon-levelOff#uid#) 4px var(--background-color-to-off#id#), 0 0 0 6px var(--border-color-out#uid#), inset 0 0 10px rgba(0, 0, 0, 1) !important;  
      
  }  

  
/* Le bouton mobile*/  
.neonInput#id#[type="checkbox"]:before {
        content: '' !important;
  
        position: absolute;
        top: 0;
        left: 0;
  
        width: var(--mover-width#uid#);
        height: var(--button-size-height#uid#);
        border-radius: var(--button-radius#uid#);
        
        box-shadow: 0 0 0 1px #232323;
        transform: scale(.98, .96);
        transition: .5s;
    
        background: linear-gradient(calc(-1 * var(--buttonDeg#id#)), #000 0%, #3e3e3e 75%, #6b6b6b 100%);

    }

/* Effet sur le bouton quand il est activé */  
.neonInput#id#:checked[type="checkbox"]:before {
      background: linear-gradient(calc(-1 * var(--buttonDeg#id#)), #000 0%, #3e3e3e 75%, #6b6b6b 100%);
     
     left: var(--mover-Xpos#uid#) !important;
     left: calc(var(--button-size-width#uid#) - var(--mover-width#uid#) ) !important;

   
    } 

  
  /* La led */  
  .neonInput#id#[type="checkbox"]:after {
        content: '' !important;
        position: absolute;
        top: calc(50% - var(--mover-led-height#uid#)/2);
        left: calc(var(--mover-width#uid#)/2 - var(--mover-led-width#uid#)/2);

        width: var(--mover-led-width#uid#);
        height: var(--mover-led-height#uid#);
    
        border-radius: var(--mover-led-radius#uid#);
        transition: .5s;    
    
    
    }
  
  /* La led quand activé */ 
    .neonInput#id#:checked[type="checkbox"]:after {

        content: '' !important;
      
        left: calc((var(--button-size-width#uid#) - (var(--mover-width#uid#)/2) - var(--mover-led-width#uid#)/2)) !important;

        background: linear-gradient(calc(-1 * var(--buttonDeg#id#)), var(--background-color-to-on#id#) 0%, var(--background-color-from-on#id#) 25%, #000) !important;
        box-shadow: 0px 0px 10px 2px var(--background-color-to-on#id#) !important;

  }
  /* La led quand non activé */ 

    .neonInput#id#:not(:checked)[type="checkbox"]:after {
      
        content: '' !important;
        
        background: linear-gradient(calc(-1 * var(--buttonDeg#id#)), var(--background-color-to-off#id#) 0%, var(--background-color-from-off#id#) 25%, #000) !important;
        
  }
     
    #neonText#id# {
      position: relative;
      margin: 0;

      font-family: sans-serif;
      text-align: center;
      
      color: var(--text-color#id#);
      
      font-size: 16px;
      padding: 15px 0;
      
      text-transform: uppercase;
      
      letter-spacing: 4px;
    }
</style>

Bonjour,

Une V1.1 avec des paramétrages supplémentaires et une animation de la LED paramétrable…

image

Je prends toutes remarques, propositions et corrections.

<div class="silkButton#id#">
    <!-- ################ _GenericSwitchButton ################ 
 
		Versionnage :
		V1.0 - 24/02/2025 : Création
        V1.1 - 02/03/2025 : Ajout de paramétrages et animation Led

       ########### by @Silkarion 
       ########### inspiré par nooNeonButton de @noodom #############
    -->
    <template>	
    
        <div></div>
        <div></div>
        <div></div>
        <div>/*************************************/</div>
        <div>/* ******* Button parameters ******* */</div>
        <div>/*************************************/</div>
        <div>ButtonWidth   : largeur du bouton (defaut: 120px)</div>
        <div>ButtonHeight  : hauteur du bouton (defaut: 40px)</div>
        <div>BouttonOrient : angle du bouton (defaut: 0deg)</div>
        <div></div>  
        <div>NeonLevelOn   : niveau néon du bouton à On en multiple de 10px (defaut: 0.0)</div>
        <div>NeonLevelOff  : niveau néon du bouton à Off en multiple de 10px (defaut: 0.0)</div>
        <div>BouttonRadius : Radius du bouton en % ou px (defaut: 20px)</div>
	    <div></div>  
        <div>backgroundColorFromOn  : couleur de début du dégradé du bouton On ('#70a1ff' si non renseigné)</div>
        <div>backgroundColorToOn    :  couleur de fin du dégradé du bouton On ('#1e90ff' si non renseigné)</div>
        <div>backgroundColorFromOff : couleur de début du dégradé du bouton Off ('#333' si non renseigné)</div>
        <div>backgroundColorToOff   :  couleur de fin du dégradé du bouton Off ('#252525' si non renseigné)</div>
        <div></div>
        <div></div>
        <div></div>
        <div>/*************************************/</div>
        <div>/* ******* Mover parameters ******* */</div>
        <div>/*************************************/</div>
         <div>MoverWidth : Largeur du bouton mobile (defaut: 40px) </div>
        <div>MoverHeight : Hauteur du bouton mobile (defaut: ButtonHeight) </div>
        <div>MoverRadius : Radius du bouton mobile en % ou px (defaut: BouttonRadius)</div>
        <div></div>
        <div></div>
        <div>/*************************************/</div>
        <div>/* ******* LED parameters ******* */</div>
        <div>/*************************************/</div>
        <div>LedWidthRatio  : Ratio de largeur par rapport au bouton (defaut: 0.2)</div>
        <div>LedHeightRatio : Ratio de hauteur par rapport au bouton (defaut: 0.2)</div>
        <div>LedRadius : Radius du de la led en % ou px (defaut: MoverRadius)</div>
        <div></div>
        <div>LedRadius : Radius de la led (defaut: 10px)</div>
        <div>LedOffsetX : Offset X en px de positionnement de la LED par rapport au centre (défaut: 0px) </div>
        <div>LedOffsetY : Offset Y en px de positionnement de la LED par rapport au centre (défaut: 0px) </div>
        <div>LedColorFromOn : Couleur degradé From de la Led (défaut: backgroundColorFromOn)</div>
        <div>LedColorToOn : Couleur degradé To de la Led (défaut: backgroundColorToOn)</div>
        <div>LedEffectOn : Effet appliqué à la LED (défaut : 0)</div>
        <div>     0 : aucun</div>
        <div>     1 : balayage vertical</div>
        <div>     2 : balayage circulaire</div>
        <div>LedEffectSpeed : Vitesse de l'effet (défaut : 1s)</div>
        <div></div>
        <div></div>
        <div></div>
        <div></div>
        <div>/*************************************/</div>
        <div>/* ******* Texte parameters ******** */</div>
        <div>/*************************************/</div>
        <div>nameTextOn   : contenu du texte du bouton On (vide si non renseigné)</div>
        <div>nameTextOff  : contenu du texte du bouton Off (nameTextOn si non renseigné, vide si nameTextOn non renseigné)</div>
        <div></div>
        <div>colorTextOn  : couleur du texte du bouton On (backgroundColorFromOn si non renseigné)</div>
        <div>colorTextOff : couleur du texte du bouton Off (colorTextOn si non renseigné, '#000' si colorTextOn non renseigné)</div>
        <div></div>
        <div></div>
        <div></div>
  
  </template>	
    <div class="title #hide_name#">
       <div class="cmdName">#name_display#</div>
    </div>
  
    <input type="checkbox" id="neonInput#id#" class="neonInput#id#" class="toggle cursor cmd tooltips cmd-widget"
        data-type="action" data-subtype="other" data-cmd_id="#id#" data-cmd_uid="#uid#">
    <span id="neonText#id#" data-on="On" data-off="Off"></span>
</div>

<script type="text/javascript">

  
/*************************************/
/* ******* Button parameters ******* */
/*************************************/
  
  var buttonWidth#uid# = (('#ButtonWidth#' !='#'+'ButtonWidth#')) ? parseInt("#ButtonWidth#") : 120;
  if(buttonWidth#uid#=='') {buttonWidth#uid#=120;}
  document.documentElement.style.setProperty('--button-size-width#uid#', parseInt(buttonWidth#uid#) + 'px');

  var buttonHeight#uid# = (('#ButtonHeight#' !='#'+'ButtonHeight#')) ? parseInt("#ButtonHeight#") : 40;
  if(buttonHeight#uid#=='') {buttonHeight#uid#=40;}
  document.documentElement.style.setProperty('--button-size-height#uid#', parseInt(buttonHeight#uid#) + 'px');

  var buttonDeg#id# = ('#BouttonOrient#' != '#' + 'BouttonOrient#') ? "#BouttonOrient#" : "0deg";
    if (buttonDeg#id# != '')
    	{ document.documentElement.style.setProperty('--buttonDeg#id#', buttonDeg#id#);}
    else 
    	{ document.documentElement.style.setProperty('--buttonDeg#id#', "0deg");}
  
  var neonLevelOn#uid# = (('#NeonLevelOn#' !='#'+'NeonLevelOn#')) ? parseFloat("#NeonLevelOn#") : 0;
  if(neonLevelOn#uid#=='') {neonLevelOn#uid#=0;}
  document.documentElement.style.setProperty('--neon-levelOn#uid#', parseInt(neonLevelOn#uid# * 10) + 'px');
 
  var neonLevelOff#uid# = (('#NeonLevelOff#' !='#'+'NeonLevelOff#')) ? parseFloat("#NeonLevelOff#") : 0;
  if(neonLevelOff#uid#=='') {neonLevelOff#uid#=0;}
  document.documentElement.style.setProperty('--neon-levelOff#uid#', parseInt(neonLevelOff#uid# * 10) + 'px');
 
  var buttonRadius#uid# = ('#BouttonRadius#' != '#' + 'BouttonRadius#') ? "#BouttonRadius#" : '20px';
    if (buttonRadius#uid# == '') { buttonRadius#uid# = '20px';}
    document.documentElement.style.setProperty('--button-radius#uid#', buttonRadius#uid#);    	

  // Dégradé pour bouton On
    var backgroundColorFromOn#id# = ('#backgroundColorFromOn#' != '#' + 'backgroundColorFromOn#') ? "#backgroundColorFromOn#" : '#70a1ff';
    if (backgroundColorFromOn#id# == '') {backgroundColorFromOn#id# = '#70a1ff';}
    document.documentElement.style.setProperty('--background-color-from-on#id#', backgroundColorFromOn#id#);
  
   
   var backgroundColorToOn#id# = ('#backgroundColorToOn#' != '#' + 'backgroundColorToOn#') ? "#backgroundColorToOn#" : '#1e90ff';
   if (backgroundColorToOn#id# == '')  {backgroundColorToOn#id# = '#1e90ff';}
   document.documentElement.style.setProperty('--background-color-to-on#id#', backgroundColorToOn#id#);
    
  
  // Dégradé pour bouton Off
   var backgroundColorFromOff#id# = ('#backgroundColorFromOff#' != '#' + 'backgroundColorFromOff#') ? "#backgroundColorFromOff#" : '#333';
   if (backgroundColorFromOff#id# != '') {
        document.documentElement.style.setProperty('--background-color-from-off#id#', backgroundColorFromOff#id#);
    }
  
  var backgroundColorToOff#id# = ('#backgroundColorToOff#' != '#' + 'backgroundColorToOff#') ? "#backgroundColorToOff#" : '#252525';
   if (backgroundColorToOff#id# != '') {
        document.documentElement.style.setProperty('--background-color-to-off#id#', backgroundColorToOff#id#);
    }

/*************************************/  
/* ******** Mover parameters ******* */
/*************************************/
  
  var moverWidth#uid# = ('#MoverWidth#' != '#' + 'MoverWidth#') ? "#MoverWidth#" : '40px';
    if (moverWidth#uid# != '')
    { document.documentElement.style.setProperty('--mover-width#uid#', parseInt(moverWidth#uid#) +'px');}
    else 
    { document.documentElement.style.setProperty('--mover-width#uid#', '40px');}  
  
 var moverHeight#uid# = ('#MoverHeight#' != '#' + 'MoverHeight#') ? "#MoverHeight#" : buttonHeight#uid#;
    if (moverHeight#uid# == '') {moverHeight#uid# = buttonHeight#uid#}
    document.documentElement.style.setProperty('--mover-height#uid#', parseInt(moverHeight#uid#) +'px');
   
  var moverRadius#uid# = ('#MoverRadius#' != '#' + 'MoverRadius#') ? "#MoverRadius#" : buttonRadius#uid#;
    if (moverRadius#uid# == '') { moverRadius#uid# = buttonRadius#uid#;}
    document.documentElement.style.setProperty('--mover-radius#uid#', moverRadius#uid#);
    
  document.documentElement.style.setProperty('--mover-Ypos#uid#', (parseInt(buttonHeight#uid#)-parseInt(moverHeight#uid#))/2 +'px');
  document.documentElement.style.setProperty('--full-size-height#uid#', Math.max(parseInt(buttonHeight#uid#), parseInt(moverHeight#uid#)) +'px');
  
/*************************************/  
/* ******* LED parameters ********** */
/*************************************/
  var moverLedWidthRatio#uid# = ('#LedWidthRatio#' !='#'+'LedWidthRatio#') ? parseFloat("#LedWidthRatio#") : 0.2;
     if (moverLedWidthRatio#uid# != '') 
     	{ document.documentElement.style.setProperty('--mover-led-width-ratio#uid#', moverLedWidthRatio#uid#);}
    else 
    	{ document.documentElement.style.setProperty('--mover-led-width-ratio#uid#', 0.2);} 
    
   var moverLedHeightRatio#uid# = ('#LedHeightRatio#' !='#'+'LedHeightRatio#') ? parseFloat("#LedHeightRatio#") : 0.2;
     if (moverLedHeightRatio#uid# != '')
     	{ document.documentElement.style.setProperty('--mover-led-height-ratio#uid#', moverLedHeightRatio#uid#);}
    else 
    	{ document.documentElement.style.setProperty('--mover-led-height-ratio#uid#', 0.2);}    
    
  var ledRadius#uid# = ('#LedRadius#' != '#' + 'LedRadius#') ? "#LedRadius#" : moverRadius#uid#;
    if (ledRadius#uid# != '')
    	{ document.documentElement.style.setProperty('--mover-led-radius#uid#', ledRadius#uid#);}
    else 
    	{ document.documentElement.style.setProperty('--mover-led-radius#uid#', moverRadius#uid#);}
  
  var ledOffsetX#uid# = ('#LedOffsetX#' != '#' + 'LedOffsetX#') ? "#LedOffsetX#" : '0px';
    if (ledOffsetX#uid# != '')
    	{ document.documentElement.style.setProperty('--mover-led-offset-x#uid#', ledOffsetX#uid#);}
    else 
    	{ document.documentElement.style.setProperty('--mover-led-offset-x#uid#', '0px');}

  var ledOffsetY#uid# = ('#LedOffsetY#' != '#' + 'LedOffsetY#') ? "#LedOffsetY#" : '0px';
    if (ledOffsetY#uid# != '')
    	{ document.documentElement.style.setProperty('--mover-led-offset-y#uid#', ledOffsetY#uid#);}
    else 
    	{ document.documentElement.style.setProperty('--mover-led-offset-y#uid#', '0px');}
 
  // Dégradé pour led On
    var ledColorFromOn#uid# = ('#LedColorFromOn#' != '#' + 'LedColorFromOn#') ? "#LedColorFromOn#" : backgroundColorFromOn#id#;
    if (ledColorFromOn#uid# == '') {ledColorFromOn#uid# = backgroundColorFromOn#id#;}
    document.documentElement.style.setProperty('--mover-led-color0#uid#', ledColorFromOn#uid#);
  
   
    var ledColorToOn#uid# = ('#LedColorToOn#' != '#' + 'LedColorToOn#') ? "#LedColorToOn#" : backgroundColorToOn#id#;
    if (ledColorToOn#uid# == '') {ledColorToOn#uid# = backgroundColorToOn#id#;}
    document.documentElement.style.setProperty('--mover-led-color1#uid#', ledColorToOn#uid#);
    
  
 var ledEffectOn#uid# = (('#LedEffectOn#' !='#'+'LedEffectOn#')) ? parseInt("#LedEffectOn#") : 0;
  if(ledEffectOn#uid#=='') {ledEffectOn#uid#=0;}


  var ledEffectSpeed#uid# = ('#LedEffectSpeed#' != '#' + 'LedEffectSpeed#') ? "#LedEffectSpeed#" : '1s';
    if (ledEffectSpeed#uid# == '')
    	{ ledEffectSpeed#uid# = '1s';}
    
   
if (ledEffectOn#uid# == 1){
  document.documentElement.style.setProperty('--led-animation#uid#', 'linearwave#uid# ' + ledEffectSpeed#uid# + ' infinite');
  }
else if (ledEffectOn#uid# == 2){
document.documentElement.style.setProperty('--led-animation#uid#', 'circlewave#uid# ' + ledEffectSpeed#uid# + ' alternate infinite');
  }
  
  
/*************************************/
/* ******** Texte parameters ******* */ 
/*************************************/
     // Couleur texte pour bouton On
    var colorTextOn#id# = ('#colorTextOn#' != '#' + 'colorTextOn#') ? "#colorTextOn#" : backgroundColorFromOn#id#;
  
  // Couleur texte pour bouton Off
    var colorTextOff#id# = ('#colorTextOff#' != '#' + 'colorTextOff#') ? "#colorTextOff#" : ((colorTextOn#id# != '')?colorTextOn#id#: '#000');
  
  // Texte pour bouton On
    var nameTextOn#id# = ('#nameTextOn#' != '#' + 'nameTextOn#') ? "#nameTextOn#" : '';
  
  // Texte pour bouton Off
    var nameTextOff#id# = ('#nameTextOff#' != '#' + 'nameTextOff#') ? "#nameTextOff#" : ((nameTextOn#id# != '')?nameTextOn#id#: '');
 
    jeedom.cmd.update['#id#'] = function (_options) {
        document.getElementById('neonText#id#').style.display = (nameTextOn#id# == '' && nameTextOn#id# == '')?"none":"block";
        if (_options.display_value == '1' || _options.display_value == 1 || _options.display_value == '99' || _options.display_value == 99 || _options.display_value == 'on') {
            document.getElementById('neonInput#id#').checked = true;
            document.documentElement.style.setProperty('--text-color#id#', colorTextOn#id#);
            document.getElementById('neonText#id#').innerHTML = nameTextOn#id#;
        } else {
            document.getElementById('neonInput#id#').checked = false;
            document.documentElement.style.setProperty('--text-color#id#', colorTextOff#id#);
            document.getElementById('neonText#id#').innerHTML = nameTextOff#id#;
        }
    }
    jeedom.cmd.update['#id#']({ display_value: '#state#' });
  
    $('#neonInput#id#').off().on('click', function () {
        jeedom.cmd.execute({ id: '#id#' });
    });
</script>

<style>
    :root {
      --text-color-on#id#: green;
      --text-color-off#id#: red;
      --background-color-from-on#id#: #70a1ff;
      --background-color-to-on#id#: #1e90ff;
      --background-color-from-off#id#: #333;
      --background-color-to-off#id#: #000;
      
      --full-size-height#uid#: 40px;
      
      --buttonDeg#id#: 0deg;
      --button-size-width#uid#: 120px;
      --button-size-height#uid#: 40px;
      --button-radius#uid#: 10px;
      
      --mover-width#uid#: 60px;
      --mover-height#uid#: 60px;
      --mover-Xpos#uid#: 20px;
      --mover-Ypos#uid#: 0px;
      --mover-radius#uid#: 0px;
      
      --mover-led-width-ratio#uid#: 0.2;
      --mover-led-height-ratio#uid#: 0.2;
      --mover-led-width#uid#:  calc(var(--mover-led-width-ratio#uid#)*var(--mover-width#uid#));      
      --mover-led-height#uid#: calc(var(--mover-led-height-ratio#uid#)*var(--mover-height#uid#));      
      --mover-led-radius#uid#: 50%;
      --mover-led-offset-x#uid#: 0px;
      --mover-led-offset-y#uid#: 0px;
      --mover-led-color0#uid#: var(--background-color-to-on#id#);
      --mover-led-color1#uid#: var(--background-color-from-on#id#);
      
	  --led-animation#uid#: none;
	  --led-animation-speed#uid#: '1s';      
      
      --border-color-in#uid#:#3e3e3e;
      --border-color-center#uid#:#353535;
      --border-color-out#uid#:#3e3e3e;
      --neon-levelOn#uid#: 10px;
      --neon-levelOff#uid#: 10px;

  }
  
    @-webkit-keyframes linearwave#uid# {

   0% { background: linear-gradient(90deg, var(--mover-led-color0#uid#) 0%, var(--mover-led-color1#uid#) 0%, var(--mover-led-color0#uid#) 10% , var(--mover-led-color0#uid#) 100% ) !important; }
  10% { background: linear-gradient(90deg, var(--mover-led-color0#uid#) 0%, var(--mover-led-color1#uid#) 10%, var(--mover-led-color0#uid#) 20% , var(--mover-led-color0#uid#) 100% ) !important; }
  20% { background: linear-gradient(90deg, var(--mover-led-color0#uid#) 0%, var(--mover-led-color1#uid#) 20%, var(--mover-led-color0#uid#) 30% , var(--mover-led-color0#uid#) 100% ) !important; }
  30% { background: linear-gradient(90deg, var(--mover-led-color0#uid#) 0%, var(--mover-led-color1#uid#) 30%, var(--mover-led-color0#uid#) 40% , var(--mover-led-color0#uid#) 100% ) !important; }
  40% { background: linear-gradient(90deg, var(--mover-led-color0#uid#) 0%, var(--mover-led-color1#uid#) 40%, var(--mover-led-color0#uid#) 50% , var(--mover-led-color0#uid#) 100% ) !important; }
  50% { background: linear-gradient(90deg, var(--mover-led-color0#uid#) 0%, var(--mover-led-color1#uid#) 50%, var(--mover-led-color0#uid#) 60% , var(--mover-led-color0#uid#) 100% ) !important; }
  60% { background: linear-gradient(90deg, var(--mover-led-color0#uid#) 0%, var(--mover-led-color1#uid#) 60%, var(--mover-led-color0#uid#) 70% , var(--mover-led-color0#uid#) 100% ) !important; }
  70% { background: linear-gradient(90deg, var(--mover-led-color0#uid#) 0%, var(--mover-led-color1#uid#) 70%, var(--mover-led-color0#uid#) 80% , var(--mover-led-color0#uid#) 100% ) !important; }
  80% { background: linear-gradient(90deg, var(--mover-led-color0#uid#) 0%, var(--mover-led-color1#uid#) 80%, var(--mover-led-color0#uid#) 90% , var(--mover-led-color0#uid#) 100% ) !important; }
  90% { background: linear-gradient(90deg, var(--mover-led-color0#uid#) 0%, var(--mover-led-color1#uid#) 90%, var(--mover-led-color0#uid#) 100% , var(--mover-led-color0#uid#) 100% ) !important; }
  100% { background: linear-gradient(90deg, var(--mover-led-color0#uid#) 0%, var(--mover-led-color1#uid#) 100%, var(--mover-led-color0#uid#) 100% , var(--mover-led-color0#uid#) 100% ) !important; }
  }    
  
  @-webkit-keyframes circlewave#uid# {
    0% { background: radial-gradient(circle, var(--mover-led-color0#uid#) 0%, var(--mover-led-color1#uid#)  0%, var(--mover-led-color0#uid#) 100% , var(--mover-led-color0#uid#) 100% ) !important; }
   10% { background: radial-gradient(circle, var(--mover-led-color0#uid#) 0%, var(--mover-led-color1#uid#) 10%, var(--mover-led-color0#uid#) 100% , var(--mover-led-color0#uid#) 100% ) !important; }
   20% { background: radial-gradient(circle, var(--mover-led-color0#uid#) 0%, var(--mover-led-color1#uid#) 20%, var(--mover-led-color0#uid#) 100% , var(--mover-led-color0#uid#) 100% ) !important; }
   30% { background: radial-gradient(circle, var(--mover-led-color0#uid#) 0%, var(--mover-led-color1#uid#) 30%, var(--mover-led-color0#uid#) 100% , var(--mover-led-color0#uid#) 100% ) !important; }
   40% { background: radial-gradient(circle, var(--mover-led-color0#uid#) 0%, var(--mover-led-color1#uid#) 40%, var(--mover-led-color0#uid#) 100% , var(--mover-led-color0#uid#) 100% ) !important; }
   50% { background: radial-gradient(circle, var(--mover-led-color0#uid#) 0%, var(--mover-led-color1#uid#) 50%, var(--mover-led-color0#uid#) 100% , var(--mover-led-color0#uid#) 100% ) !important; }
   60% { background: radial-gradient(circle, var(--mover-led-color0#uid#) 0%, var(--mover-led-color1#uid#) 60%, var(--mover-led-color0#uid#) 100% , var(--mover-led-color0#uid#) 100% ) !important; }
   70% { background: radial-gradient(circle, var(--mover-led-color0#uid#) 0%, var(--mover-led-color1#uid#) 70%, var(--mover-led-color0#uid#) 100% , var(--mover-led-color0#uid#) 100% ) !important; }
   80% { background: radial-gradient(circle, var(--mover-led-color0#uid#) 0%, var(--mover-led-color1#uid#) 80%, var(--mover-led-color0#uid#) 100% , var(--mover-led-color0#uid#) 100% ) !important; }
   90% { background: radial-gradient(circle, var(--mover-led-color0#uid#) 0%, var(--mover-led-color1#uid#) 90%, var(--mover-led-color0#uid#) 100% , var(--mover-led-color0#uid#) 100% ) !important; }
  100% { background: radial-gradient(circle, var(--mover-led-color0#uid#) 0%, var(--mover-led-color1#uid#) 100%, var(--mover-led-color0#uid#) 100% , var(--mover-led-color0#uid#) 100% ) !important; }
  }    
/******* Contenaire principal ****/
.silkButton#id# {
    
    -webkit-transform-origin-x: center;
    -webkit-transform-origin-y: center;
  
    transform: rotate(calc(-1 * var(--buttonDeg#id#)));

    min-width: calc(-1 * min(0px, var(--mover-Ypos#uid#)) * 2 + var(--button-size-width#uid#)) !important;
  
    min-height: calc( 20px + var(--full-size-height#uid#))  !important;
    
    margin: 5px 5px 5px 5px !important ;

  }
  
 /******* Element ****/
 .neonInput#id#[type="checkbox"] {
      /* Marge autour de l'élément > ce qui adaptera la taille du container principal */
        margin: 5px 5px 5px 5px !important; 
   
        position: relative !important;
   		vertical-align: middle !important;
   		top:10px;
   
        width: var(--button-size-width#uid#) !important;
        height: var(--button-size-height#uid#)  !important;
   
        -webkit-appearance: none !important;
        outline: none !important;
        border-radius: var(--button-radius#uid#) !important;
   
}  

/* affichage spécifique à l'état ON */
.neonInput#id#:checked[type="checkbox"] {
        background: linear-gradient(calc(-1 * var(--buttonDeg#id#)), var(--background-color-from-on#id#), var(--background-color-to-on#id#)) !important;
 
        box-shadow: 0 0 0 2px var(--border-color-in#uid#), 0 0 var(--neon-levelOn#uid#) 4px var(--background-color-to-on#id#), 0 0 0 6px var(--border-color-out#uid#), inset 0 0 10px rgba(0, 0, 0, 1) !important;        
  }

/* affichage spécifique à l'état OFF */
.neonInput#id#:not(:checked)[type="checkbox"] {
        background: linear-gradient(calc(-1 * var(--buttonDeg#id#)), var(--background-color-from-off#id#), var(--background-color-to-off#id#)) !important;

        box-shadow: 0 0 0 2px var(--border-color-in#uid#), 0 0 var(--neon-levelOff#uid#) 4px var(--background-color-to-off#id#), 0 0 0 6px var(--border-color-out#uid#), inset 0 0 10px rgba(0, 0, 0, 1) !important;  
  }  

  
/* Le bouton mobile*/  
.neonInput#id#[type="checkbox"]:before {
        content: '' !important;
  
        position: absolute;
        top: var(--mover-Ypos#uid#);
        left: 0px;
 		left: var(--mover-Ypos#uid#);
  
  
        vertical-align: middle !important ;
  
        width: var(--mover-width#uid#);
        height: var(--mover-height#uid#);
        border-radius: var(--mover-radius#uid#);
        
        box-shadow: 0 0 0 1px #232323;
        transform: scale(.98, .96);
        transition: .5s;
    
        background: linear-gradient(calc(-1 * var(--buttonDeg#id#)), #000 0%, #3e3e3e 75%, #6b6b6b 100%);

    }

/* Effet sur le bouton quand il est activé */  
.neonInput#id#:checked[type="checkbox"]:before {
      background: linear-gradient(calc(-1 * var(--buttonDeg#id#)), #000 0%, #3e3e3e 75%, #6b6b6b 100%);
     
      left: calc(var(--button-size-width#uid#) - var(--mover-width#uid#) - var(--mover-Ypos#uid#)) !important;
   
    } 

  
  /* La led */  
  .neonInput#id#[type="checkbox"]:after {
        content: '' !important;
        
    	position: absolute;
	    top: calc(50% - var(--mover-led-height#uid#)/2 - var(--mover-led-offset-y#uid#));
	   	left: calc(var(--mover-width#uid#)/2 - var(--mover-led-width#uid#)/2 + var(--mover-led-offset-x#uid#) + var(--mover-Ypos#uid#));

        width: var(--mover-led-width#uid#);
        height: var(--mover-led-height#uid#);
    
        border-radius: var(--mover-led-radius#uid#);
    
        transition: .5s;    
        
    }
  
  /* La led quand activé */ 
    .neonInput#id#:checked[type="checkbox"]:after {

        content: '' !important;
      
        left: calc((var(--button-size-width#uid#) - (var(--mover-width#uid#)/2) - var(--mover-led-width#uid#)/2) + var(--mover-led-offset-x#uid#) - var(--mover-Ypos#uid#)) !important;

        background: linear-gradient(calc(-1 * var(--buttonDeg#id#)), var(--mover-led-color0#uid#) 0%, var(--mover-led-color1#uid#) 25%, #000);
        
      	box-shadow: 0px 0px 10px 2px var(--mover-led-color1#uid#) !important;
      
     	animation : var(--led-animation#uid#) !important;

  }
  /* La led quand non activé */ 

    .neonInput#id#:not(:checked)[type="checkbox"]:after {
      
        content: '' !important;
        
        background: linear-gradient(calc(-1 * var(--buttonDeg#id#)), var(--background-color-to-off#id#) 0%, var(--background-color-from-off#id#) 25%, #000);
        
  }
     
    #neonText#id# {
      position: relative;
      margin: 0;

      font-family: sans-serif;
      text-align: center;
      
      color: var(--text-color#id#);
      
      font-size: 16px;
      padding: 15px 0;
      
      text-transform: uppercase;
      
      letter-spacing: 4px;
    }
</style>