Browse code

Progress

Benjamin Roth authored on16/12/2022 19:54:08
Showing8 changed files
... ...
@@ -138,18 +138,123 @@ html {
138 138
   }
139 139
 }
140 140
 
141
+#player-audio-controls {
142
+  position: absolute;
143
+  right: 40px;
144
+  bottom: 120px;
145
+  height: 32px;
146
+  width: 39px;
147
+
148
+  a {
149
+    opacity: 0;
150
+    visibility: hidden;
151
+    @include transition(opacity 0.25s ease-in-out);
152
+
153
+    &:before {
154
+      display: block;
155
+      visibility: hidden;
156
+      opacity: 0;
157
+      font-family: $font-family-alternate;
158
+      font-size: font-size(10px);
159
+      white-space: nowrap;
160
+      position: absolute;
161
+      right: 100%;
162
+      margin-right: 20px;
163
+      top: 50%;
164
+      @include transform(translate3d(0,-50%,0));
165
+      content: attr(data-label);
166
+      background-color: rgba($color-bg-tertiary, 0.8);
167
+      color: $color-bg-primary;
168
+      padding: 2px 5px 0;
169
+      line-height: 2;
170
+      text-transform: uppercase;
171
+      @include transition(all 0.25s ease-in-out);
172
+
173
+    }
174
+
175
+    &.-show {
176
+      opacity: .8;
177
+      visibility: visible;
178
+    }
179
+
180
+    &:hover {
181
+      opacity: 1;
182
+
183
+      &:before {
184
+        opacity: 1;
185
+        visibility: visible;
186
+      }
187
+    }
188
+  }
189
+
190
+  svg {
191
+    height: 32px;
192
+    width: auto;
193
+    position: absolute;
194
+    fill: $color-bg-tertiary;
195
+  }
196
+}
197
+
141 198
 #scroll-down-indicator {
142 199
   z-index: 10;
143 200
   position: fixed;
144 201
   right: 40px;
145 202
   bottom: 40px;
146
-  -webkit-mask-image: url("data:image/svg+xml,%3Csvg width='100%25' height='100%25' viewBox='0 0 123 62' version='1.1' xmlns='http://www.w3.org/2000/svg' xmlns:xlink='http://www.w3.org/1999/xlink' xml:space='preserve' xmlns:serif='http://www.serif.com/' style='fill-rule:evenodd;clip-rule:evenodd;stroke-linejoin:round;stroke-miterlimit:2;'%3E%3Cpath d='M57.548,60.943c2.509,1.409 5.581,1.409 8.09,0l54.92,-36.13c2.31,-1.41 3.18,-5.08 1.74,-7.05l-7,-15c-1.39,-2.22 -5.14,-2.78 -7.46,-1.37l-46.24,30.23l-45.67,-29.95c-2.6,-1.69 -6.36,-0.84 -7.52,0.85l-7.22,15.24c-1.45,2.25 -0.29,5.64 1.73,7.05l54.63,36.13Z' style='fill:%23000000;fill-rule:nonzero;'/%3E%3C/svg%3E");
147
-  mask-image: url("data:image/svg+xml,%3Csvg width='100%25' height='100%25' viewBox='0 0 123 62' version='1.1' xmlns='http://www.w3.org/2000/svg' xmlns:xlink='http://www.w3.org/1999/xlink' xml:space='preserve' xmlns:serif='http://www.serif.com/' style='fill-rule:evenodd;clip-rule:evenodd;stroke-linejoin:round;stroke-miterlimit:2;'%3E%3Cpath d='M57.548,60.943c2.509,1.409 5.581,1.409 8.09,0l54.92,-36.13c2.31,-1.41 3.18,-5.08 1.74,-7.05l-7,-15c-1.39,-2.22 -5.14,-2.78 -7.46,-1.37l-46.24,30.23l-45.67,-29.95c-2.6,-1.69 -6.36,-0.84 -7.52,0.85l-7.22,15.24c-1.45,2.25 -0.29,5.64 1.73,7.05l54.63,36.13Z' style='fill:%23000000;fill-rule:nonzero;'/%3E%3C/svg%3E");
148
-  -webkit-mask-repeat: no-repeat;
149
-  mask-repeat: no-repeat;
150 203
   width: 40px;
151 204
   height: 20px;
152
-  background-color: rgba($color-bg-tertiary,0.8);
205
+
206
+  span {
207
+    display: block;
208
+    -webkit-mask-image: url("data:image/svg+xml,%3Csvg width='100%25' height='100%25' viewBox='0 0 123 62' version='1.1' xmlns='http://www.w3.org/2000/svg' xmlns:xlink='http://www.w3.org/1999/xlink' xml:space='preserve' xmlns:serif='http://www.serif.com/' style='fill-rule:evenodd;clip-rule:evenodd;stroke-linejoin:round;stroke-miterlimit:2;'%3E%3Cpath d='M57.548,60.943c2.509,1.409 5.581,1.409 8.09,0l54.92,-36.13c2.31,-1.41 3.18,-5.08 1.74,-7.05l-7,-15c-1.39,-2.22 -5.14,-2.78 -7.46,-1.37l-46.24,30.23l-45.67,-29.95c-2.6,-1.69 -6.36,-0.84 -7.52,0.85l-7.22,15.24c-1.45,2.25 -0.29,5.64 1.73,7.05l54.63,36.13Z' style='fill:%23000000;fill-rule:nonzero;'/%3E%3C/svg%3E");
209
+    mask-image: url("data:image/svg+xml,%3Csvg width='100%25' height='100%25' viewBox='0 0 123 62' version='1.1' xmlns='http://www.w3.org/2000/svg' xmlns:xlink='http://www.w3.org/1999/xlink' xml:space='preserve' xmlns:serif='http://www.serif.com/' style='fill-rule:evenodd;clip-rule:evenodd;stroke-linejoin:round;stroke-miterlimit:2;'%3E%3Cpath d='M57.548,60.943c2.509,1.409 5.581,1.409 8.09,0l54.92,-36.13c2.31,-1.41 3.18,-5.08 1.74,-7.05l-7,-15c-1.39,-2.22 -5.14,-2.78 -7.46,-1.37l-46.24,30.23l-45.67,-29.95c-2.6,-1.69 -6.36,-0.84 -7.52,0.85l-7.22,15.24c-1.45,2.25 -0.29,5.64 1.73,7.05l54.63,36.13Z' style='fill:%23000000;fill-rule:nonzero;'/%3E%3C/svg%3E");
210
+    -webkit-mask-repeat: no-repeat;
211
+    mask-repeat: no-repeat;
212
+    width: 40px;
213
+    height: 20px;
214
+    background-color: rgba($color-bg-tertiary, 0.8);
215
+    @include transition(all 0.25s ease-in-out);
216
+  }
217
+
218
+  &:before {
219
+    display: block;
220
+    visibility: hidden;
221
+    opacity: 0;
222
+    font-family: $font-family-alternate;
223
+    font-size: font-size(10px);
224
+    white-space: nowrap;
225
+    position: absolute;
226
+    right: 100%;
227
+    margin-right: 20px;
228
+    top: 50%;
229
+    @include transform(translate3d(0,-50%,0));
230
+    content: attr(data-label-down);
231
+    background-color: rgba($color-bg-tertiary, 0.8);
232
+    color: $color-bg-primary;
233
+    padding: 2px 5px 0;
234
+    line-height: 2;
235
+    text-transform: uppercase;
236
+    @include transition(all 0.25s ease-in-out);
237
+
238
+  }
239
+
240
+  &.-at-bottom {
241
+    span {
242
+      @include transform(rotate(180deg));
243
+    }
244
+    &:before {
245
+      content: attr(data-label-top);
246
+    }
247
+  }
248
+
249
+  &:hover {
250
+    span {
251
+      background-color: rgba($color-bg-tertiary, 1);
252
+    }
253
+    &:before {
254
+      opacity: 1;
255
+      visibility: visible;
256
+    }
257
+  }
153 258
 }
154 259
 
155 260
 .widget p.error {
156 261
new file mode 100644
... ...
@@ -0,0 +1 @@
1
+<?xml version="1.0" encoding="UTF-8" standalone="no"?><!DOCTYPE svg PUBLIC "-//W3C//DTD SVG 1.1//EN" "http://www.w3.org/Graphics/SVG/1.1/DTD/svg11.dtd"><svg width="100%" height="100%" viewBox="0 0 39 32" version="1.1" xmlns="http://www.w3.org/2000/svg" xmlns:xlink="http://www.w3.org/1999/xlink" xml:space="preserve" xmlns:serif="http://www.serif.com/" style="fill-rule:evenodd;clip-rule:evenodd;stroke-linejoin:round;stroke-miterlimit:2;"><g><path d="M0,11.056c0.096,-0.555 0.511,-1.003 1.058,-1.14c0.299,-0.05 0.603,-0.07 0.907,-0.06l4.237,0c0.073,-0.003 0.141,-0.035 0.188,-0.09c1.14,-1.11 2.25,-2.25 3.397,-3.337l6,-5.843c0.318,-0.33 0.744,-0.535 1.2,-0.577c0.05,-0.006 0.101,-0.009 0.151,-0.009c0.705,-0 1.289,0.571 1.304,1.276c0.056,0.621 0.073,1.245 0.053,1.868l0,26.04c-0.009,0.364 -0.08,0.724 -0.21,1.065c-0.161,0.515 -0.641,0.868 -1.181,0.868c-0.244,-0 -0.483,-0.073 -0.686,-0.208c-0.359,-0.21 -0.691,-0.462 -0.99,-0.75c-2.245,-2.19 -4.483,-4.385 -6.713,-6.585l-2.25,-2.25c-0.069,-0.061 -0.156,-0.097 -0.248,-0.105l-4.717,-0c-0.675,0.013 -1.273,-0.452 -1.425,-1.11c0.003,-0.03 0.003,-0.06 0,-0.09l-0.075,-8.963Z" style="fill-rule:nonzero;"/><path d="M22.5,7.899c-0.321,0.318 -0.502,0.752 -0.502,1.203c0,0.452 0.181,0.886 0.502,1.204l12.923,12.923c0.322,0.361 0.784,0.567 1.268,0.567c0.934,0 1.703,-0.768 1.703,-1.702c-0,-0.486 -0.208,-0.95 -0.572,-1.273l-12.914,-12.922c-0.663,-0.657 -1.746,-0.657 -2.408,-0" style="fill-rule:nonzero;"/><path d="M37.785,7.899c0.321,0.318 0.502,0.752 0.502,1.203c-0,0.452 -0.181,0.886 -0.502,1.204l-12.915,12.923c-0.318,0.309 -0.744,0.483 -1.188,0.483c-0.934,-0 -1.703,-0.769 -1.703,-1.703c0,-0.443 0.174,-0.87 0.483,-1.188l12.923,-12.922c0.66,-0.656 1.74,-0.656 2.4,-0" style="fill-rule:nonzero;"/></g></svg>
0 2
\ No newline at end of file
1 3
new file mode 100644
... ...
@@ -0,0 +1 @@
1
+<?xml version="1.0" encoding="UTF-8" standalone="no"?><!DOCTYPE svg PUBLIC "-//W3C//DTD SVG 1.1//EN" "http://www.w3.org/Graphics/SVG/1.1/DTD/svg11.dtd"><svg width="100%" height="100%" viewBox="0 0 37 32" version="1.1" xmlns="http://www.w3.org/2000/svg" xmlns:xlink="http://www.w3.org/1999/xlink" xml:space="preserve" xmlns:serif="http://www.serif.com/" style="fill-rule:evenodd;clip-rule:evenodd;stroke-linejoin:round;stroke-miterlimit:2;"><g><path d="M0,11.055c0.096,-0.554 0.511,-1.003 1.058,-1.14c0.299,-0.05 0.603,-0.07 0.907,-0.06l4.237,0c0.072,-0.004 0.14,-0.037 0.188,-0.09l3.398,-3.337l6,-5.843c0.321,-0.329 0.749,-0.533 1.207,-0.577c0.047,-0.005 0.095,-0.008 0.143,-0.008c0.706,0 1.292,0.57 1.312,1.275c0.04,0.637 0.045,1.276 0.015,1.913l0,26.04c-0.002,0.364 -0.071,0.725 -0.202,1.065c-0.164,0.515 -0.646,0.868 -1.187,0.868c-0.245,-0 -0.484,-0.073 -0.688,-0.208c-0.357,-0.21 -0.687,-0.462 -0.983,-0.75l-6.75,-6.585l-2.25,-2.25c-0.069,-0.06 -0.156,-0.097 -0.247,-0.105l-4.695,-0c-0.677,0.017 -1.276,-0.45 -1.425,-1.11c0.002,-0.03 0.002,-0.06 -0,-0.09l-0.038,-9.008Z" style="fill-rule:nonzero;"/><path d="M36.93,15.81c-0.107,5.614 -3.233,10.754 -8.167,13.433c-0.32,0.228 -0.686,0.382 -1.073,0.45c-0.548,0.081 -1.092,-0.185 -1.365,-0.668c-0.302,-0.458 -0.284,-1.06 0.045,-1.5c0.146,-0.204 0.339,-0.371 0.563,-0.487c0.95,-0.464 1.839,-1.043 2.647,-1.725c2.468,-2.087 4.048,-5.039 4.417,-8.25c0.571,-4.782 -1.614,-9.496 -5.632,-12.15c-0.435,-0.285 -0.908,-0.533 -1.373,-0.75c-0.51,-0.252 -0.811,-0.799 -0.75,-1.365c0.017,-0.567 0.391,-1.064 0.931,-1.238c0.369,-0.131 0.778,-0.101 1.125,0.083c2.037,1.023 3.829,2.477 5.25,4.26c1.261,1.566 2.201,3.365 2.767,5.295c0.451,1.518 0.666,3.096 0.637,4.68" style="fill-rule:nonzero;"/><path d="M31.253,15.72c-0.036,3.174 -1.412,6.19 -3.788,8.295c-0.685,0.617 -1.44,1.151 -2.25,1.59c-0.668,0.374 -1.524,0.142 -1.912,-0.517c-0.132,-0.219 -0.202,-0.469 -0.202,-0.724c0,-0.526 0.296,-1.009 0.764,-1.249c2.816,-1.468 4.588,-4.392 4.588,-7.567c-0,-3.176 -1.772,-6.099 -4.588,-7.568c-0.435,-0.252 -0.704,-0.719 -0.704,-1.222c-0,-0.775 0.638,-1.413 1.413,-1.413c0.249,-0 0.493,0.065 0.709,0.19c2.702,1.44 4.715,3.91 5.58,6.848c0.304,1.086 0.455,2.209 0.45,3.337" style="fill-rule:nonzero;"/><path d="M25.575,15.533c-0.014,2.444 -1.59,4.622 -3.907,5.4c-0.407,0.177 -0.867,0.19 -1.283,0.037c-0.534,-0.236 -0.876,-0.773 -0.863,-1.357c0.029,-0.606 0.439,-1.131 1.021,-1.305c1.096,-0.249 1.937,-1.141 2.122,-2.25c0.29,-1.452 -0.61,-2.897 -2.04,-3.278c-0.679,-0.116 -1.18,-0.713 -1.178,-1.402c-0.008,-0.757 0.601,-1.39 1.358,-1.41c0.619,0.029 1.22,0.215 1.747,0.54c1.575,0.83 2.667,2.358 2.94,4.117c0.043,0.294 0.07,0.589 0.083,0.885" style="fill-rule:nonzero;"/></g></svg>
0 2
\ No newline at end of file
... ...
@@ -105,27 +105,72 @@ function Onepage(list, options) {
105 105
 
106 106
     window.scrollToNextSection = function () {
107 107
       let sections = document.querySelectorAll('#main .inside > .mod_article, #footer');
108
+      var scroller = document.querySelector('#scroll-down-indicator');
108 109
       var section;
109 110
 
110
-      for (let i = 0; i < sections.length; i++)
111
+      if ((scroller !== undefined && !scroller.classList.contains('-at-bottom')) || scroller === undefined)
111 112
       {
112
-        section = sections[i];
113
-        let boundingArea = section.getBoundingClientRect();
114
-        let viewportTrigger = window.innerHeight;
115 113
 
116
-        if (boundingArea.top < viewportTrigger-15)
114
+        for (var i = 0; i < sections.length; i++)
117 115
         {
118
-          continue;
119
-        }
116
+          section = sections[i];
117
+          let boundingArea = section.getBoundingClientRect();
118
+          let viewportTrigger = window.innerHeight;
119
+
120
+          if (boundingArea.top < viewportTrigger - 15)
121
+          {
122
+            continue;
123
+          }
120 124
 
125
+          scrollTo({
126
+            top: getOffsetTop(section),
127
+            behavior: "smooth"
128
+          });
129
+          break;
130
+        }
131
+      } else if (i == sections.length || (scroller !== undefined && scroller.classList.contains('-at-bottom'))) {
121 132
         scrollTo({
122
-          top: getOffsetTop(section),
133
+          top: 0,
123 134
           behavior: "smooth"
124 135
         });
125
-        break;
126 136
       }
137
+
127 138
       return section;
128 139
     }
129 140
 
141
+    var scroller = document.querySelector('#scroll-down-indicator');
142
+
143
+    if (scroller)
144
+    {
145
+      // let bottomElements = document.querySelectorAll('#main .inside > .mod_article:last-child, #footer');
146
+      let bottomElements = document.querySelectorAll('#footer');
147
+      const scrollIndicatorObserver = new IntersectionObserver (function (elements) {
148
+        let isIntersecting = false;
149
+        elements.forEach(function(element) {
150
+          if (element.isIntersecting) {
151
+            isIntersecting = true;
152
+          }
153
+        });
154
+        if (isIntersecting)
155
+        {
156
+          scroller.classList.add('-at-bottom');
157
+        } else {
158
+          scroller.classList.remove('-at-bottom');
159
+        }
160
+      },{rootMargin: "0px 0px 33.333% 0px"});
161
+
162
+      bottomElements.forEach(function(el) {
163
+        scrollIndicatorObserver.observe(el);
164
+      });
165
+
166
+      scroller.addEventListener("click", function(event) {
167
+        if (window.scrollToNextSection)
168
+        {
169
+          event.preventDefault();
170
+          window.scrollToNextSection();
171
+        }
172
+      })
173
+    }
174
+
130 175
   });
131 176
 };
132 177
new file mode 100644
... ...
@@ -0,0 +1,93 @@
1
+<?php
2
+
3
+declare(strict_types=1);
4
+
5
+namespace App\EventListener;
6
+
7
+use Contao\CoreBundle\DependencyInjection\Attribute\AsHook;
8
+use Contao\FilesModel;
9
+use Contao\Validator;
10
+
11
+#[AsHook("replaceInsertTags")]
12
+class ReplaceInsertTagListener
13
+{
14
+    public function __invoke(string $insertTag, bool $useCache, string $cachedValue, array $flags, array $tags, array $cache, int $_rit, int $_cnt)
15
+    {
16
+        $elements = explode('::', $insertTag,2);
17
+        $insertTag = array_shift($elements);
18
+
19
+        if (strtolower($insertTag) === 'svg_inline') {
20
+            if (isset($elements[0]) && $elements[0])
21
+            {
22
+                $fragments = explode(':', $elements[0]);
23
+                $strFile = $fragments[0];
24
+                $strId = null;
25
+                $strClass = null;
26
+                if (isset($fragments[1]))
27
+                {
28
+                    $strClass = $fragments[1];
29
+                }
30
+                if (isset($fragments[2]))
31
+                {
32
+                    $strId = $fragments[2];
33
+                }
34
+
35
+                if (Validator::isUuid($strFile))
36
+                {
37
+                    // Handle UUIDs
38
+                    $objFile = FilesModel::findByUuid($strFile);
39
+
40
+                    if ($objFile === null)
41
+                    {
42
+                        return '';
43
+                    }
44
+
45
+                    $strFile = $objFile->path;
46
+                }
47
+                elseif (is_numeric($strFile))
48
+                {
49
+                    // Handle numeric IDs (see #4805)
50
+                    $objFile = FilesModel::findByPk($strFile);
51
+
52
+                    if ($objFile === null)
53
+                    {
54
+                        return '';
55
+                    }
56
+
57
+                    $strFile = $objFile->path;
58
+                }
59
+                elseif (Validator::isInsecurePath($strFile))
60
+                {
61
+                    throw new \RuntimeException('Invalid path ' . $strFile);
62
+                }
63
+                elseif (($objFile = FilesModel::findByPath($strFile)) !== null)
64
+                {
65
+                    $strFile = $objFile->path;
66
+                } else {
67
+                    return '';
68
+                }
69
+
70
+                return $this->print_svg($strFile,$strClass,$strId);
71
+            }
72
+        }
73
+    }
74
+
75
+    protected function print_svg($svgPath, ?string $strClass=null, ?string$strId=null){
76
+        $iconfile = new \DOMDocument();
77
+        $iconfile->load($svgPath);
78
+        if (($svg = $iconfile->getElementsByTagName('svg')->item(0)))
79
+        {
80
+            if ($strClass) {
81
+                if (($embClass = $svg->getAttribute('class')))
82
+                {
83
+                    $strClass = $embClass. ' ' . $strClass;
84
+                }
85
+                $svg->setAttribute('class', $strClass);
86
+            }
87
+            if ($strId){
88
+                $svg->setAttribute('id', $strId);
89
+            }
90
+            return $iconfile->saveHTML($svg);
91
+        }
92
+    }
93
+}
0 94
new file mode 100644
... ...
@@ -0,0 +1,47 @@
1
+<div id="player-audio-controls" data-source-selector="#image-clip video">
2
+    <a href="{{env::request|urlattr}}" class="audio-mute" aria-label="Ton stummschalten" data-label="Ton stummschalten">{{svg_inline::f6824c1a-7d6c-11ed-9054-d8cb8a1a4c4f}}</a>
3
+    <a href="{{env::request|urlattr}}" class="audio-unmute" aria-label="Ton einschalten" data-label="Ton einschalten">{{svg_inline::9b19cf0a-7d6d-11ed-9054-d8cb8a1a4c4f}}</a>
4
+</div>
5
+<script>
6
+  document.addEventListener("DOMContentLoaded", function() {
7
+
8
+    var controls = document.getElementById('player-audio-controls');
9
+    var video = controls !== undefined && controls.dataset.sourceSelector !== undefined ? document.querySelector(controls.dataset.sourceSelector) : undefined;
10
+
11
+    if (video !== undefined)
12
+    {
13
+      let mute = controls.querySelector('.audio-mute'),
14
+        unmute = controls.querySelector('.audio-unmute');
15
+
16
+      if (mute !== undefined && unmute !== undefined)
17
+      {
18
+        if (video.muted)
19
+        {
20
+          unmute.classList.add('-show');
21
+          mute.classList.remove('-show');
22
+        } else {
23
+          mute.classList.add('-show');
24
+          unmute.classList.remove('-show');
25
+        }
26
+
27
+        unmute.addEventListener('click', (event) => {
28
+          event.preventDefault();
29
+          if (video.muted) {
30
+            video.muted = false;
31
+            mute.classList.add('-show');
32
+            unmute.classList.remove('-show');
33
+          }
34
+        });
35
+        mute.addEventListener('click', (event) => {
36
+          event.preventDefault();
37
+          if (!video.muted) {
38
+            video.muted = true;
39
+            unmute.classList.add('-show');
40
+            mute.classList.remove('-show');
41
+          }
42
+        });
43
+      }
44
+    }
45
+
46
+  });
47
+</script>
0 48
deleted file mode 100644
1 49
Binary files a/var/backups/backup__20221216103209.sql.gz and /dev/null differ
2 50
new file mode 100644
3 51
Binary files /dev/null and b/var/backups/backup__20221216185236.sql.gz differ