Widget:Test: Unterschied zwischen den Versionen

Aus Aturien – Wiki
Zur Navigation springen Zur Suche springen
Die Seite wurde neu angelegt: „<div class="lm-wrapper" id="lm-{{{id}}}" style="width:{{{width|800}}}px; max-width:100%"> <div class="lm-controls" role="toolbar" aria-label="Kartenebenen"> <span class="lm-controls-title">Ebenen</span> </div> <div class="lm-viewport" style="width:{{{width|800}}}px; height:{{{height|600}}}px; max-width:100%"> <!--layerdata:{{{layers}}}--> </div> <div class="lm-opacity-bar" style="display:none"> <span class="lm-opacity-label">Deckk…“
 
Keine Bearbeitungszusammenfassung
Zeile 1: Zeile 1:
<div class="lm-wrapper" id="lm-{{{id}}}" style="width:{{{width|800}}}px; max-width:100%">
<!-- CSS -->
<style>
.lm-wrapper {
    display: inline-block;
    max-width: 100%;
    border: 1px solid #a2a9b1;
    border-radius: 6px;
    overflow: hidden;
    background: #f8f9fa;
    vertical-align: top;
}
.lm-controls {
    display: flex;
    flex-wrap: wrap;
    align-items: center;
    gap: 6px;
    padding: 8px 12px;
    background: #f8f9fa;
    border-bottom: 1px solid #a2a9b1;
    min-height: 42px;
}
.lm-controls-title {
    font-size: 0.82em;
    font-weight: bold;
    color: #54595d;
    margin-right: 4px;
}
.lm-btn {
    display: inline-flex;
    align-items: center;
    padding: 4px 12px;
    font-size: 0.82em;
    font-family: inherit;
    color: #202122;
    background: #ffffff;
    border: 1px solid #a2a9b1;
    border-radius: 3px;
    cursor: pointer;
    transition: background 0.15s, color 0.15s, border-color 0.15s;
    white-space: nowrap;
}
.lm-btn:hover {
    background: #eaf3fb;
    border-color: #3680b0;
    color: #0645ad;
}
.lm-btn-active {
    background: #3680b0;
    color: #ffffff;
    border-color: #3680b0;
}
.lm-viewport {
    position: relative;
    display: block;
    overflow: hidden;
    background: #eaecf0;
}
.lm-layer {
    position: absolute;
    top: 0; left: 0;
    width: 100%; height: 100%;
    display: block;
    object-fit: fill;
    max-width: none;
    transition: opacity 0.2s ease;
    pointer-events: none;
}
.lm-layer:first-child {
    position: relative;
}
.lm-opacity-bar {
    display: flex;
    align-items: center;
    gap: 8px;
    padding: 6px 12px;
    background: #f8f9fa;
    border-top: 1px solid #a2a9b1;
}
.lm-opacity-label {
    font-size: 0.80em;
    color: #54595d;
    white-space: nowrap;
}
.lm-opacity-slider {
    flex: 1;
    accent-color: #3680b0;
    cursor: pointer;
}
.lm-opacity-value {
    font-size: 0.80em;
    color: #202122;
    min-width: 36px;
    text-align: right;
}
</style>
 
<!-- HTML -->
<div class="lm-wrapper" id="lm-{{{id|karte}}}" style="width:{{{width|800}}}px; max-width:100%">


   <div class="lm-controls" role="toolbar" aria-label="Kartenebenen">
   <div class="lm-controls" role="toolbar" aria-label="Kartenebenen">
Zeile 16: Zeile 113:


</div>
</div>
<!-- JavaScript -->
<script>
(function() {
  function init() {
    var wrapperId = 'lm-{{{id|karte}}}';
    var wrapper = document.getElementById(wrapperId);
    if (!wrapper) return;
    var viewport = wrapper.querySelector('.lm-viewport');
    var controls = wrapper.querySelector('.lm-controls');
    var opacityBar = wrapper.querySelector('.lm-opacity-bar');
    var opacitySlider = opacityBar.querySelector('.lm-opacity-slider');
    var opacityValue = opacityBar.querySelector('.lm-opacity-value');
    var comment = viewport.innerHTML.match(/<!--layerdata:([\s\S]*?)-->/);
    if (!comment) return;
    var layers;
    try { layers = JSON.parse(comment[1]); }
    catch(e) { return; }
    viewport.innerHTML = '';
    layers.forEach(function(layer, i) {
      var img = document.createElement('img');
      img.className = 'lm-layer';
      img.id = wrapperId + '-layer' + i;
      img.src = layer.image;
      img.alt = layer.label;
      img.style.opacity = layer.visible ? '1' : '0';
      viewport.appendChild(img);
    });
    controls.innerHTML = '<span class="lm-controls-title">Ebenen</span>';
    layers.forEach(function(layer, i) {
      var btn = document.createElement('button');
      btn.type = 'button';
      btn.textContent = layer.label;
      btn.className = 'lm-btn' + (layer.visible ? ' lm-btn-active' : '');
      if (layer.visible) {
        btn.style.background = layer.color;
        btn.style.borderColor = layer.color;
        btn.style.color = '#fff';
      }
      btn.addEventListener('click', function() {
        layer.visible = !layer.visible;
        var img = document.getElementById(wrapperId + '-layer' + i);
        if (img) img.style.opacity = layer.visible ? '1' : '0';
        btn.className = 'lm-btn' + (layer.visible ? ' lm-btn-active' : '');
        btn.style.background = layer.visible ? layer.color : '';
        btn.style.borderColor = layer.visible ? layer.color : '';
        btn.style.color = layer.visible ? '#fff' : '';
      });
      btn.addEventListener('mouseenter', function() {
        if (!layer.visible) return;
        var img = document.getElementById(wrapperId + '-layer' + i);
        opacitySlider.dataset.target = wrapperId + '-layer' + i;
        opacitySlider.value = Math.round(parseFloat(img.style.opacity) * 100);
        opacityValue.textContent = opacitySlider.value + '%';
        opacityBar.style.display = 'flex';
      });
      controls.appendChild(btn);
    });
    opacitySlider.addEventListener('input', function() {
      var img = document.getElementById(opacitySlider.dataset.target);
      if (img) img.style.opacity = opacitySlider.value / 100;
      opacityValue.textContent = opacitySlider.value + '%';
    });
    wrapper.addEventListener('mouseleave', function() {
      opacityBar.style.display = 'none';
    });
  }
  if (document.readyState === 'loading') {
    document.addEventListener('DOMContentLoaded', init);
  } else {
    init();
  }
})();
</script>

Version vom 6. Juni 2026, 13:19 Uhr

<style> .lm-wrapper {

   display: inline-block;
   max-width: 100%;
   border: 1px solid #a2a9b1;
   border-radius: 6px;
   overflow: hidden;
   background: #f8f9fa;
   vertical-align: top;

} .lm-controls {

   display: flex;
   flex-wrap: wrap;
   align-items: center;
   gap: 6px;
   padding: 8px 12px;
   background: #f8f9fa;
   border-bottom: 1px solid #a2a9b1;
   min-height: 42px;

} .lm-controls-title {

   font-size: 0.82em;
   font-weight: bold;
   color: #54595d;
   margin-right: 4px;

} .lm-btn {

   display: inline-flex;
   align-items: center;
   padding: 4px 12px;
   font-size: 0.82em;
   font-family: inherit;
   color: #202122;
   background: #ffffff;
   border: 1px solid #a2a9b1;
   border-radius: 3px;
   cursor: pointer;
   transition: background 0.15s, color 0.15s, border-color 0.15s;
   white-space: nowrap;

} .lm-btn:hover {

   background: #eaf3fb;
   border-color: #3680b0;
   color: #0645ad;

} .lm-btn-active {

   background: #3680b0;
   color: #ffffff;
   border-color: #3680b0;

} .lm-viewport {

   position: relative;
   display: block;
   overflow: hidden;
   background: #eaecf0;

} .lm-layer {

   position: absolute;
   top: 0; left: 0;
   width: 100%; height: 100%;
   display: block;
   object-fit: fill;
   max-width: none;
   transition: opacity 0.2s ease;
   pointer-events: none;

} .lm-layer:first-child {

   position: relative;

} .lm-opacity-bar {

   display: flex;
   align-items: center;
   gap: 8px;
   padding: 6px 12px;
   background: #f8f9fa;
   border-top: 1px solid #a2a9b1;

} .lm-opacity-label {

   font-size: 0.80em;
   color: #54595d;
   white-space: nowrap;

} .lm-opacity-slider {

   flex: 1;
   accent-color: #3680b0;
   cursor: pointer;

} .lm-opacity-value {

   font-size: 0.80em;
   color: #202122;
   min-width: 36px;
   text-align: right;

} </style>

<script> (function() {

 function init() {
   var wrapperId = 'lm-karte';
   var wrapper = document.getElementById(wrapperId);
   if (!wrapper) return;
   var viewport = wrapper.querySelector('.lm-viewport');
   var controls = wrapper.querySelector('.lm-controls');
   var opacityBar = wrapper.querySelector('.lm-opacity-bar');
   var opacitySlider = opacityBar.querySelector('.lm-opacity-slider');
   var opacityValue = opacityBar.querySelector('.lm-opacity-value');
   var comment = viewport.innerHTML.match(//);
   if (!comment) return;
   var layers;
   try { layers = JSON.parse(comment[1]); }
   catch(e) { return; }
   viewport.innerHTML = ;
   layers.forEach(function(layer, i) {
     var img = document.createElement('img');
     img.className = 'lm-layer';
     img.id = wrapperId + '-layer' + i;
     img.src = layer.image;
     img.alt = layer.label;
     img.style.opacity = layer.visible ? '1' : '0';
     viewport.appendChild(img);
   });
   controls.innerHTML = 'Ebenen';
   layers.forEach(function(layer, i) {
     var btn = document.createElement('button');
     btn.type = 'button';
     btn.textContent = layer.label;
     btn.className = 'lm-btn' + (layer.visible ? ' lm-btn-active' : );
     if (layer.visible) {
       btn.style.background = layer.color;
       btn.style.borderColor = layer.color;
       btn.style.color = '#fff';
     }
     btn.addEventListener('click', function() {
       layer.visible = !layer.visible;
       var img = document.getElementById(wrapperId + '-layer' + i);
       if (img) img.style.opacity = layer.visible ? '1' : '0';
       btn.className = 'lm-btn' + (layer.visible ? ' lm-btn-active' : );
       btn.style.background = layer.visible ? layer.color : ;
       btn.style.borderColor = layer.visible ? layer.color : ;
       btn.style.color = layer.visible ? '#fff' : ;
     });
     btn.addEventListener('mouseenter', function() {
       if (!layer.visible) return;
       var img = document.getElementById(wrapperId + '-layer' + i);
       opacitySlider.dataset.target = wrapperId + '-layer' + i;
       opacitySlider.value = Math.round(parseFloat(img.style.opacity) * 100);
       opacityValue.textContent = opacitySlider.value + '%';
       opacityBar.style.display = 'flex';
     });
     controls.appendChild(btn);
   });
   opacitySlider.addEventListener('input', function() {
     var img = document.getElementById(opacitySlider.dataset.target);
     if (img) img.style.opacity = opacitySlider.value / 100;
     opacityValue.textContent = opacitySlider.value + '%';
   });
   wrapper.addEventListener('mouseleave', function() {
     opacityBar.style.display = 'none';
   });
 }
 if (document.readyState === 'loading') {
   document.addEventListener('DOMContentLoaded', init);
 } else {
   init();
 }

})(); </script>