hr-design-system-handlebars 0.123.7 → 0.124.0

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (139) hide show
  1. package/CHANGELOG.md +14 -0
  2. package/build/handlebars/helpers/handlebar-helpers.js +12 -0
  3. package/dist/assets/brand/_default/conf/locatags.json +11 -1
  4. package/dist/assets/brand/hessenschau/conf/locatags.json +1 -0
  5. package/dist/assets/brand/hr/conf/locatags.json +1 -0
  6. package/dist/assets/brand/hr-bigband/conf/locatags.json +1 -0
  7. package/dist/assets/brand/hr-fernsehen/conf/locatags.json +1 -0
  8. package/dist/assets/brand/hr-inforadio/conf/locatags.json +1 -0
  9. package/dist/assets/brand/hr-rundfunkrat/conf/locatags.json +1 -0
  10. package/dist/assets/brand/hr-sinfonieorchester/conf/locatags.json +1 -0
  11. package/dist/assets/brand/hr-werbung/conf/locatags.json +1 -0
  12. package/dist/assets/brand/hr1/conf/locatags.json +1 -0
  13. package/dist/assets/brand/hr2/conf/locatags.json +1 -0
  14. package/dist/assets/brand/hr3/conf/locatags.json +1 -0
  15. package/dist/assets/brand/hr4/conf/locatags.json +1 -0
  16. package/dist/assets/brand/you-fm/conf/locatags.json +1 -0
  17. package/dist/assets/index.css +415 -62
  18. package/dist/assets/js/components/event/filtererDs.feature.js +298 -0
  19. package/dist/assets/js/components/event/nativeScrollDs.feature.js +110 -0
  20. package/dist/assets/js/components/modal/modal.feature.js +38 -0
  21. package/dist/views/components/base/image/responsive_image.hbs +1 -0
  22. package/dist/views/components/base/link.hbs +3 -15
  23. package/dist/views/components/base/link_open.hbs +13 -0
  24. package/dist/views/components/button/button_pseudo_v2.hbs +12 -0
  25. package/dist/views/components/button/button_v2.hbs +7 -0
  26. package/dist/views/components/button/components/button_icon.hbs +1 -0
  27. package/dist/views/components/button/components/button_label.hbs +1 -0
  28. package/dist/views/components/button/components/button_pseudo_link.hbs +3 -0
  29. package/dist/views/components/event/artist.hbs +1 -0
  30. package/dist/views/components/event/calendar/event_calendar.hbs +3 -0
  31. package/dist/views/components/event/calendar/event_calendar_content.hbs +18 -0
  32. package/dist/views/components/event/calendar/event_calendar_event_teaser.hbs +60 -0
  33. package/dist/views/components/event/calendar/event_calendar_footer.hbs +8 -0
  34. package/dist/views/components/event/calendar/event_calendar_heading.hbs +3 -0
  35. package/dist/views/components/event/calendar/event_calendar_inline.hbs +3 -0
  36. package/dist/views/components/event/calendar/event_calendar_nav.hbs +27 -0
  37. package/dist/views/components/event/calendar/event_calendar_nav_item.hbs +7 -0
  38. package/dist/views/components/event/concert_info.hbs +66 -0
  39. package/dist/views/components/event/event_details.hbs +20 -0
  40. package/dist/views/components/event/event_status.hbs +1 -0
  41. package/dist/views/components/event/event_tag.hbs +3 -0
  42. package/dist/views/components/event/event_tags.hbs +11 -0
  43. package/dist/views/components/event/event_ticket_button.hbs +30 -0
  44. package/dist/views/components/label/label_byline.hbs +7 -0
  45. package/dist/views/components/label/label_group.hbs +3 -0
  46. package/dist/views/components/label/label_test.hbs +11 -0
  47. package/dist/views/components/modal/modal.hbs +7 -0
  48. package/dist/views/components/teaser/components/teaser_header.hbs +3 -0
  49. package/dist/views/components/teaser/components/teaser_heading.hbs +3 -1
  50. package/dist/views/components/teaser/components/teaser_headline.hbs +3 -0
  51. package/dist/views/components/teaser/components/teaser_title_classes.hbs +3 -0
  52. package/dist/views/components/teaser/components/teaser_title_test.hbs +3 -0
  53. package/dist/views/components/teaser/components/teaser_topline.hbs +1 -5
  54. package/dist/views/components/teaser/teaser_event_calendar.hbs +8 -0
  55. package/gulpfile.js +5 -1
  56. package/package.json +4 -2
  57. package/src/assets/brand/_default/conf/locatags.json +11 -1
  58. package/src/assets/brand/hessenschau/conf/locatags.json +1 -0
  59. package/src/assets/brand/hessenschau/conf/locatags.merged.json +10 -0
  60. package/src/assets/brand/hr/conf/locatags.json +1 -0
  61. package/src/assets/brand/hr/conf/locatags.merged.json +10 -0
  62. package/src/assets/brand/hr-bigband/conf/locatags.json +1 -0
  63. package/src/assets/brand/hr-bigband/conf/locatags.merged.json +10 -0
  64. package/src/assets/brand/hr-fernsehen/conf/locatags.json +1 -0
  65. package/src/assets/brand/hr-fernsehen/conf/locatags.merged.json +10 -0
  66. package/src/assets/brand/hr-inforadio/conf/locatags.json +1 -0
  67. package/src/assets/brand/hr-inforadio/conf/locatags.merged.json +10 -0
  68. package/src/assets/brand/hr-rundfunkrat/conf/locatags.json +1 -0
  69. package/src/assets/brand/hr-rundfunkrat/conf/locatags.merged.json +10 -0
  70. package/src/assets/brand/hr-sinfonieorchester/conf/locatags.json +1 -0
  71. package/src/assets/brand/hr-sinfonieorchester/conf/locatags.merged.json +10 -0
  72. package/src/assets/brand/hr-werbung/conf/locatags.json +1 -0
  73. package/src/assets/brand/hr-werbung/conf/locatags.merged.json +10 -0
  74. package/src/assets/brand/hr1/conf/locatags.json +1 -0
  75. package/src/assets/brand/hr1/conf/locatags.merged.json +10 -0
  76. package/src/assets/brand/hr2/conf/locatags.json +1 -0
  77. package/src/assets/brand/hr2/conf/locatags.merged.json +10 -0
  78. package/src/assets/brand/hr3/conf/locatags.json +1 -0
  79. package/src/assets/brand/hr3/conf/locatags.merged.json +10 -0
  80. package/src/assets/brand/hr4/conf/locatags.json +1 -0
  81. package/src/assets/brand/hr4/conf/locatags.merged.json +10 -0
  82. package/src/assets/brand/you-fm/conf/locatags.json +1 -0
  83. package/src/assets/brand/you-fm/conf/locatags.merged.json +10 -0
  84. package/src/assets/css/custom-utilities.css +36 -0
  85. package/src/assets/fixtures/event/calendar/event_calendar.inc.json +10 -0
  86. package/src/assets/fixtures/event/calendar/event_calendar_event_teaser.inc.json +89 -0
  87. package/src/assets/fixtures/event/calendar/event_calendar_event_teaser.json +4 -0
  88. package/src/assets/fixtures/event/calendar/event_calendar_footer.json +14 -0
  89. package/src/assets/fixtures/event/calendar/event_calendar_months.inc.json +1295 -0
  90. package/src/assets/fixtures/teaser/teaser_event_calendar_100_no_future_events.json +24 -0
  91. package/src/assets/fixtures/teaser/teaser_event_calendar_100_serif.json +21 -0
  92. package/src/assets/fixtures/teaser/teaser_images.inc.json +21 -0
  93. package/src/assets/fixtures/teaser/teaser_labels.inc.json +12 -0
  94. package/src/assets/fixtures/teaser/teasers.inc.json +31 -0
  95. package/src/assets/tailwind.css +43 -5
  96. package/src/stories/views/components/base/image/responsive_image.hbs +1 -0
  97. package/src/stories/views/components/base/link.hbs +3 -15
  98. package/src/stories/views/components/base/link_open.hbs +13 -0
  99. package/src/stories/views/components/button/button_pseudo_v2.hbs +12 -0
  100. package/src/stories/views/components/button/button_v2.hbs +7 -0
  101. package/src/stories/views/components/button/components/button_icon.hbs +1 -0
  102. package/src/stories/views/components/button/components/button_label.hbs +1 -0
  103. package/src/stories/views/components/button/components/button_pseudo_link.hbs +3 -0
  104. package/src/stories/views/components/event/artist.hbs +1 -0
  105. package/src/stories/views/components/event/calendar/event_calendar.hbs +3 -0
  106. package/src/stories/views/components/event/calendar/event_calendar_components.stories.mdx +161 -0
  107. package/src/stories/views/components/event/calendar/event_calendar_content.hbs +18 -0
  108. package/src/stories/views/components/event/calendar/event_calendar_event_teaser.hbs +60 -0
  109. package/src/stories/views/components/event/calendar/event_calendar_footer.hbs +8 -0
  110. package/src/stories/views/components/event/calendar/event_calendar_heading.hbs +3 -0
  111. package/src/stories/views/components/event/calendar/event_calendar_inline.hbs +3 -0
  112. package/src/stories/views/components/event/calendar/event_calendar_nav.hbs +27 -0
  113. package/src/stories/views/components/event/calendar/event_calendar_nav_item.hbs +7 -0
  114. package/src/stories/views/components/event/calendar/fixtures/event_calendar_event_teaser.json +1 -0
  115. package/src/stories/views/components/event/calendar/fixtures/event_calendar_footer.json +1 -0
  116. package/src/stories/views/components/event/concert_info.hbs +66 -0
  117. package/src/stories/views/components/event/event_details.hbs +20 -0
  118. package/src/stories/views/components/event/event_status.hbs +1 -0
  119. package/src/stories/views/components/event/event_tag.hbs +3 -0
  120. package/src/stories/views/components/event/event_tags.hbs +11 -0
  121. package/src/stories/views/components/event/event_ticket_button.hbs +30 -0
  122. package/src/stories/views/components/event/filtererDs.feature.js +298 -0
  123. package/src/stories/views/components/event/nativeScrollDs.feature.js +110 -0
  124. package/src/stories/views/components/label/label_byline.hbs +7 -0
  125. package/src/stories/views/components/label/label_group.hbs +3 -0
  126. package/src/stories/views/components/label/label_test.hbs +11 -0
  127. package/src/stories/views/components/modal/modal.feature.js +38 -0
  128. package/src/stories/views/components/modal/modal.hbs +7 -0
  129. package/src/stories/views/components/teaser/components/teaser_header.hbs +3 -0
  130. package/src/stories/views/components/teaser/components/teaser_heading.hbs +3 -1
  131. package/src/stories/views/components/teaser/components/teaser_headline.hbs +3 -0
  132. package/src/stories/views/components/teaser/components/teaser_title_classes.hbs +3 -0
  133. package/src/stories/views/components/teaser/components/teaser_title_test.hbs +3 -0
  134. package/src/stories/views/components/teaser/components/teaser_topline.hbs +1 -5
  135. package/src/stories/views/components/teaser/fixtures/teaser_event_calendar_100_no_future_events.json +1 -0
  136. package/src/stories/views/components/teaser/fixtures/teaser_event_calendar_100_serif.json +1 -0
  137. package/src/stories/views/components/teaser/teaser_event_calendar.hbs +8 -0
  138. package/src/stories/views/components/teaser/teaser_event_calendar.stories.mdx +131 -0
  139. package/tailwind.config.js +11 -4
@@ -0,0 +1,298 @@
1
+ import { pi, uxAction } from 'base/tracking/atiHelper.subfeature'
2
+ import { hr$, isString, listen, reinitializeFeature, simulateClickOn } from 'hrQuery'
3
+ import $ from 'zepto-modules'
4
+
5
+ require('zepto-modules/callbacks')
6
+ require('zepto-modules/deferred')
7
+
8
+ const Filterer = (context) => {
9
+ const { options } = context
10
+ const { element: rootElement } = context
11
+ const contentTargetClass = '.js-fr-content'
12
+ const errorTargetClass = 'js-fr-error-target'
13
+ const errorClass = 'js-fr-error'
14
+ const reloadTriggerClass = 'js-fr-reload-trigger'
15
+ const targetClass = 'js-fr-target'
16
+ const triggerClass = 'js-fr-trigger'
17
+ const triggerDomNodes = hr$(`.${triggerClass}`, rootElement)
18
+ let targetDomNodes = hr$(`.${targetClass}`, rootElement)
19
+ const errorTargetDomNodes = hr$(`.${errorTargetClass}`, rootElement)
20
+ const errorDomNodes = hr$(`.${errorClass}`)
21
+ const contentTargetDomNode = hr$(contentTargetClass, rootElement)[0]
22
+
23
+ const init = function () {
24
+ for (let i = 0; i < triggerDomNodes.length; i++) {
25
+ triggerDomNodes[i].addEventListener('click', doSetSelectedFilter.bind(this))
26
+ triggerDomNodes[i].addEventListener('touch', doSetSelectedFilter.bind(this))
27
+ }
28
+
29
+ //die konfigration auf root ebene triggerd das verhalten beim starten
30
+ if (options && options.crit && options.strat) {
31
+ //finden des passenden triggers
32
+ for (i = 0; i < triggerDomNodes.length; i++) {
33
+ if (
34
+ JSON.parse(triggerDomNodes[i].getAttribute('data-prop-filterer')).crit ===
35
+ options.crit
36
+ ) {
37
+ doSetSelectedFilter({ currentTarget: triggerDomNodes[i] }, false)
38
+ return
39
+ }
40
+ }
41
+ }
42
+
43
+ if (
44
+ !rootElement.classList.contains('-excerpt') &&
45
+ !!(window.history && window.history.pushState)
46
+ ) {
47
+ listen('popstate', handlePopstate, window)
48
+ //initial state ersetzen so dass es ein rückkehrpunkt gibt
49
+ const selectedTrigger = hr$('.' + triggerClass + '.-selected', rootElement)
50
+ history.replaceState(
51
+ {
52
+ sel: triggerClass,
53
+ cache: false,
54
+ crit:
55
+ selectedTrigger.length > 0
56
+ ? selectedTrigger[0].getAttribute('data-prop-crit')
57
+ : triggerDomNodes[0].getAttribute('data-prop-crit'),
58
+ },
59
+ null,
60
+ window.location.href
61
+ )
62
+ }
63
+ }
64
+
65
+ const doSetSelectedFilter = function (e, forceReset) {
66
+ clearSelected()
67
+
68
+ if (!forceReset) {
69
+ e.currentTarget.classList.add('-selected')
70
+ }
71
+
72
+ //hacky weil e beim start auch kein Event sein kann
73
+ 'preventDefault' in e && e.preventDefault()
74
+
75
+ doFilter(e.currentTarget, forceReset, true, true)
76
+ }
77
+
78
+ const clearSelected = function () {
79
+ let triggerDomNodes = hr$(`.${triggerClass}.-selected`, rootElement)
80
+
81
+ triggerDomNodes.forEach(function (triggerDomNode) {
82
+ triggerDomNode.classList.remove('-selected')
83
+ })
84
+ }
85
+
86
+ const doFilter = function (currentTarget, forceReset, push, countXTClick) {
87
+ let data = JSON.parse(currentTarget.getAttribute('data-prop-filterer')),
88
+ crit = currentTarget.getAttribute('data-prop-crit'),
89
+ time = new Date().getTime(),
90
+ reset = forceReset,
91
+ href = currentTarget.getAttribute('href'),
92
+ strat,
93
+ found = false
94
+
95
+ console.log('targets-length:' + targetDomNodes.length)
96
+
97
+ //falls kein array, string in array umheben
98
+ if (isString(data.strat)) {
99
+ strat = []
100
+ strat.push(data.strat)
101
+ } else {
102
+ strat = data.strat
103
+ }
104
+
105
+ for (let i = 0; i < strat.length; i++) {
106
+ if ('hobid' === strat[i]) {
107
+ if ($(currentTarget, rootElement).closest('.' + reloadTriggerClass).length > 0) {
108
+ loadContent(currentTarget)
109
+ } else {
110
+ stratHideOthersById(targetDomNodes, data.crit, reset)
111
+ if (push && !rootElement.classList.contains('-excerpt')) {
112
+ history.pushState(
113
+ {
114
+ sel: '.' + currentTarget + '.-selected',
115
+ crit: data.crit,
116
+ },
117
+ null,
118
+ href
119
+ )
120
+ uxAction('Eventkalender-Monat:: Tag geklickt', 1)
121
+ } else {
122
+ uxAction('Eventkalender:: Tag geklickt', 1)
123
+ }
124
+ }
125
+ } else if ('hoswid' === strat[i]) {
126
+ if ($(currentTarget, rootElement).closest('.' + reloadTriggerClass).length > 0) {
127
+ loadContent(currentTarget)
128
+ } else {
129
+ stratHideOthersStartsWithId(targetDomNodes, data.crit, reset)
130
+ if (push && !rootElement.classList.contains('-excerpt')) {
131
+ history.pushState(
132
+ {
133
+ sel: '.' + currentTarget + '.-selected',
134
+ crit: data.crit,
135
+ },
136
+ null,
137
+ href
138
+ )
139
+ uxAction('Eventkalender-Monat:: Monat geklickt', 1)
140
+ }
141
+ }
142
+ } else if ('cs' === strat[i]) {
143
+ clearSelected()
144
+ } else if ('initial' === strat[i]) {
145
+ initial()
146
+ }
147
+ }
148
+
149
+ /* if (countXTClick) {
150
+ pi(
151
+ xtpage +
152
+ '&pchap=' +
153
+ xt_chap +
154
+ '&pid=' +
155
+ xt_pageID +
156
+ '&pidt=' +
157
+ xt_pageDate +
158
+ xt_multc
159
+ )
160
+ }*/
161
+
162
+ removeErrors()
163
+ }
164
+ const removeErrors = function () {
165
+ if (errorTargetDomNodes.length > 0) {
166
+ errorTargetDomNodes[0].classList.add('hidden')
167
+ }
168
+
169
+ if (errorDomNodes.length > 0) {
170
+ errorDomNodes[0].classList.add('hidden')
171
+ }
172
+ }
173
+ const loadContent = function (currentTarget) {
174
+ var url = createInlineUrl(currentTarget),
175
+ ts = new Date().getTime()
176
+
177
+ console.log('load content ' + url)
178
+
179
+ $.ajax({
180
+ type: 'GET',
181
+ dataType: 'html',
182
+ url: url,
183
+ timeout: 90 * 1000,
184
+ cache: true,
185
+ beforeSend: function () {
186
+ console.log('before load')
187
+ $(contentTargetClass, rootElement).addClass('-isLoading')
188
+ },
189
+ })
190
+ .done(function (data, status, xhr) {
191
+ var tsDelta = 500 - (new Date().getTime() - ts)
192
+
193
+ //mindesten 500ms anzeigen
194
+ setTimeout(
195
+ function () {
196
+ console.log('loaded')
197
+
198
+ $(contentTargetClass, rootElement).append(data)
199
+
200
+ targetDomNodes = hr$('.' + targetClass, rootElement)
201
+ $(contentTargetClass, rootElement).removeClass('-isLoading')
202
+ $(currentTarget, rootElement)
203
+ .closest('.' + reloadTriggerClass)
204
+ .removeClass(reloadTriggerClass)
205
+ doFilter(currentTarget, false, true, false)
206
+ reinitializeFeature(contentTargetDomNode)
207
+ },
208
+ tsDelta < 0 ? 0 : tsDelta
209
+ )
210
+ })
211
+ .fail(function (data, status, xhr) {
212
+ console.log('load error')
213
+ $(contentTargetClass, rootElement).addClass('-isLoading')
214
+ })
215
+ }
216
+ const createInlineUrl = function (element) {
217
+ var href = element.getAttribute('href'),
218
+ pos = href.indexOf('~') + 1
219
+
220
+ return href.substr(0, pos) + 'inline' + href.substr(pos)
221
+ }
222
+ const handlePopstate = function (event) {
223
+ var target
224
+ //nur handlen wenn es ein state gibt
225
+ if (event.state.sel) {
226
+ target = $(
227
+ '.' + triggerClass + "[data-prop-crit='" + event.state.crit + "']",
228
+ rootElement
229
+ )[0]
230
+ doFilter(target, false, false)
231
+ clearSelected()
232
+ target.classList.add('-selected')
233
+ }
234
+ }
235
+ const initial = function () {
236
+ simulateClickOn(hr$('.js-fr-initial', rootElement)[0])
237
+ }
238
+
239
+ const stratHideOthersById = function (targetDomNodes, crit, reset) {
240
+ var i = 0,
241
+ found = false
242
+
243
+ if (reset) {
244
+ for (i = 0; i < targetDomNodes.length; i++) {
245
+ targetDomNodes[i].classList.remove('hidden')
246
+ }
247
+ return
248
+ }
249
+
250
+ for (i = 0; i < targetDomNodes.length; i++) {
251
+ if (targetDomNodes[i].getAttribute('id') !== crit) {
252
+ targetDomNodes[i].classList.add('hidden')
253
+ } else {
254
+ targetDomNodes[i].classList.remove('hidden')
255
+
256
+ found = true
257
+ }
258
+ }
259
+
260
+ displayErrorTarget()
261
+
262
+ return found
263
+ }
264
+ const stratHideOthersStartsWithId = function (targetDomNodes, crit, reset) {
265
+ var i = 0,
266
+ found = false
267
+
268
+ if (reset) {
269
+ for (i = 0; i < targetDomNodes.length; i++) {
270
+ targetDomNodes[i].classList.remove('hidden')
271
+ }
272
+ return
273
+ }
274
+
275
+ for (i = 0; i < targetDomNodes.length; i++) {
276
+ if (targetDomNodes[i].getAttribute('id').indexOf(crit) !== 0) {
277
+ targetDomNodes[i].classList.add('hidden')
278
+ } else {
279
+ targetDomNodes[i].classList.remove('hidden')
280
+
281
+ found = true
282
+ }
283
+ }
284
+
285
+ displayErrorTarget()
286
+
287
+ return found
288
+ }
289
+ const displayErrorTarget = function () {
290
+ if (targetDomNodes.length >= 1) {
291
+ if (errorTargetDomNodes.length > 0) {
292
+ errorTargetDomNodes[0].classList.remove('hidden')
293
+ }
294
+ }
295
+ }
296
+ init()
297
+ }
298
+ export default Filterer
@@ -0,0 +1,110 @@
1
+ import { clearRequestInterval, hr$, requestInterval } from 'hrQuery'
2
+ import { uxAction } from 'base/tracking/atiHelper.subfeature'
3
+
4
+ const NativeScroll = function (context) {
5
+ console.log('loaded feature ...')
6
+ const { options } = context,
7
+ { element: rootElement } = context,
8
+ isTeaser = options.isTeaser
9
+ let buttons,
10
+ scrollbar,
11
+ oneScrollbarItem,
12
+ hideScrollbar = true,
13
+ hasNativeSmoothScroll = false,
14
+ smoothScrollInterval
15
+ // Detect if the browser already supports native smooth scrolling (e.g., Firefox 36+ and Chrome 49+) and it is enabled:
16
+ const isNativeSmoothScrollEnabledOn = function () {
17
+ return 'scroll-behavior' in document.documentElement.style
18
+ }
19
+ const doScroll = function (e) {
20
+ let step = scrollbar.clientWidth - oneScrollbarItem.clientWidth * 1.5,
21
+ direction = e.currentTarget.classList.contains('-left') ? -1 : 1,
22
+ distance = direction * step
23
+ console.log("🚀 ~ file: nativeScroll.feature.js ~ line 22 ~ doScroll ~ direction", direction)
24
+ console.log("🚀 ~ file: nativeScroll.feature.js ~ line 24 ~ doScroll ~ distance", distance)
25
+
26
+ console.log('scrollbar ', scrollbar)
27
+ console.log('scrollbar width ', scrollbar.clientWidth)
28
+ console.log('oneScrollbarItem ', oneScrollbarItem)
29
+ console.log('oneScrollbarItem width ', oneScrollbarItem.clientWidth)
30
+
31
+ if (direction === 1) {
32
+ console.log('right clicked')
33
+ if (isTeaser) uxAction('Eventkalender:: Pfeil rechts geklickt', 1)
34
+ else uxAction('Eventkalender-Monat:: Pfeil rechts geklickt', 1)
35
+ } else {
36
+ console.log('left clicked')
37
+ if (isTeaser) uxAction('Eventkalender:: Pfeil links geklickt', 1)
38
+ else uxAction('Eventkalender-Monat:: Pfeil links geklickt', 1)
39
+ }
40
+ console.log("🚀 ~ file: nativeScroll.feature.js ~ line 42 ~ doScroll ~ hasNativeSmoothScroll", hasNativeSmoothScroll)
41
+
42
+ if (hasNativeSmoothScroll) {
43
+ scrollbar.scrollLeft += distance
44
+ console.log("🚀 ~ file: nativeScroll.feature.js ~ line 43 ~ doScroll ~ scrollbar.scrollLeft", scrollbar.scrollLeft)
45
+ } else {
46
+ console.log('start smooth scroll')
47
+ startSmoothScroll(scrollbar.scrollLeft, Date.now(), distance)
48
+ }
49
+ }
50
+ const startSmoothScroll = function (start_pos, start_time, distance) {
51
+ clearRequestInterval(smoothScrollInterval)
52
+
53
+ smoothScrollInterval = requestInterval(function () {
54
+ loopSmoothScroll(start_pos, start_time, distance)
55
+ }, 16)
56
+ }
57
+ const loopSmoothScroll = function (start_pos, start_time, distance) {
58
+ let timeLapsed = Date.now() - start_time,
59
+ duration = 900,
60
+ percentage = timeLapsed / duration
61
+
62
+ percentage = percentage > 1 ? 1 : percentage
63
+ console.log("🚀 ~ file: nativeScroll.feature.js ~ line 61 ~ loopSmoothScroll ~ percentage", percentage)
64
+
65
+ scrollbar.scrollLeft = start_pos + distance * easeInOutCubic(percentage)
66
+
67
+ if (percentage === 1) {
68
+ console.log('stop smooth scroll')
69
+ clearRequestInterval(smoothScrollInterval)
70
+ }
71
+ }
72
+
73
+ const easeInOutCubic = function (time) {
74
+ // 'easeInOutCubic' - acceleration until halfway, then deceleration
75
+ // time = values from 0 to 1
76
+ return time < 0.5
77
+ ? 4 * time * time * time
78
+ : (time - 1) * (2 * time - 2) * (2 * time - 2) + 1
79
+ }
80
+
81
+ if (hr$('.js-ns-scroll.-horizontal', rootElement).length > 0) {
82
+ scrollbar = hr$('.js-ns-scroll.-horizontal', rootElement)[0]
83
+ buttons = hr$('.js-ns-button', rootElement)
84
+ oneScrollbarItem = hr$('.js-ns-item', rootElement)[0]
85
+ hasNativeSmoothScroll = isNativeSmoothScrollEnabledOn(scrollbar)
86
+ let initiallySelectedMonth = hr$('.js-ns-month.-selected', rootElement)[0]
87
+ if (!initiallySelectedMonth) {
88
+ initiallySelectedMonth = hr$('.js-ns-month.-currentMonth', rootElement)[0]
89
+ }
90
+
91
+ if (initiallySelectedMonth) {
92
+ scrollbar.scrollLeft = initiallySelectedMonth.offsetLeft
93
+ }
94
+
95
+ if (hideScrollbar) {
96
+ scrollbar.style.marginBottom = scrollbar.clientHeight - scrollbar.offsetHeight + 'px'
97
+ }
98
+
99
+ for (let i = 0; i < buttons.length; i++) {
100
+ buttons[i].addEventListener('click', doScroll.bind(this))
101
+ buttons[i].addEventListener('touch', doScroll.bind(this))
102
+ }
103
+ } else {
104
+ console.log(
105
+ 'Kein NativeScroll Element gefunden:' + rootElement + ' .js-ns-scroll.-horizontal'
106
+ )
107
+ }
108
+ }
109
+
110
+ export default NativeScroll
@@ -0,0 +1,38 @@
1
+ import { hr$, listen, unlisten } from 'hrQuery'
2
+
3
+ const Modal = (context) => {
4
+ const { options } = context,
5
+ { element: rootElement } = context,
6
+ modalTriggerId = options.modalTriggerId ? '#' + options.modalTriggerId : '',
7
+ modalTrigger = hr$(modalTriggerId)[0],
8
+ modalCloseTriggers = hr$('.js-modal-close', rootElement),
9
+ modal = hr$('.js-modal', rootElement)[0]
10
+
11
+ const configureEventListeners = () => {
12
+ listen('click', show, modalTrigger)
13
+
14
+ modalCloseTriggers.forEach((modalCloseTrigger) => {
15
+ listen('click', close, modalCloseTrigger)
16
+ })
17
+ }
18
+
19
+ const show = () => {
20
+ modal.showModal()
21
+ listen('click', closeFromOutside, modal)
22
+ }
23
+
24
+ const closeFromOutside = (event) => {
25
+ if (event.target === modal) {
26
+ unlisten('click', closeFromOutside, modal)
27
+ close()
28
+ }
29
+ }
30
+
31
+ const close = () => {
32
+ modal.close()
33
+ }
34
+
35
+ configureEventListeners()
36
+ }
37
+
38
+ export default Modal
@@ -10,6 +10,7 @@
10
10
  '_disableNoScript' don't add no script fallback
11
11
 
12
12
  --}}
13
+
13
14
  {{#withParam this.responsiveImage _type _variant }}
14
15
  {{#if this.asPicture}}
15
16
  <picture class="{{~#if ../_addClass}} {{../_addClass}}{{/if}}">
@@ -1,15 +1,3 @@
1
- {{#with this.link}}
2
- <a {{#with this.webviewUrl}}data-webviewurl="{{this}}"{{/with}} href="{{this.url}}" {{#with this.webviewUrl}}{{/with}}
3
- class="sb-link{{#if ../_css}} {{../_css}}{{/if}} {{#if ../this.content.isFileDownload}} js-load{{/if}}{{#if ../_isSelected}} {{defaultIfEmpty ../_selectedCssClass "-current"}}{{/if}}"
4
- {{#if ../_doNavigationTracking}}
5
- data-hr-click-tracking='{"settings": [{"type":"uxAction","secondLevelId": "1","clickLabel":"{{../_clickLabelType}}{{#if ../_clickLabelPrefix1}}::{{../_clickLabelPrefix1}}{{/if}}::{{../_clickLabelPrefix2}}-Link geklickt"}]}'
6
- {{/if}}
7
- {{#if ../this.content.isFileDownload}}
8
- {{#with this.content.trackingData}}data-hr-click-tracking='{"settings": [{"type":"download","secondLevelId": "{{this.secondLevelId}}","clickLabel": "{{this.pageName}}"}]}'{{/with}}
9
- {{/if}}
10
- {{#if this.isTargetBlank}} target="_blank" rel="noopener{{#if this.hasNoReferrerFlag}} noreferrer{{/if}}"{{/if}}
11
- {{#if ../_isAriaHidden}} aria-hidden="true" tabindex="-1"{{/if}}
12
- >
13
- {{/with}}
14
- {{~ decorator_body ~}}
15
- </a>
1
+ {{> components/base/link_open _clickLabelPrefix1=_clickLabelPrefix1 _clickLabelPrefix2=_clickLabelPrefix2 _clickLabelType=_clickLabelType _css=_css _doNavigationTracking=_doNavigationTracking _isAriaHidden=_isAriaHidden _isSelected=_isSelected _selectedCssClass=_selectedCssClass}}
2
+ {{~ decorator_body ~}}
3
+ </a>
@@ -0,0 +1,13 @@
1
+ {{#with this.link}}
2
+ <a {{#with this.webviewUrl}}data-webviewurl="{{this}}"{{/with}} href="{{this.url}}" {{#with this.webviewUrl}}{{/with}}
3
+ class="sb-link js-load{{#if ../_css}} {{../_css}}{{/if}} {{#if ../_isSelected}} {{defaultIfEmpty ../_selectedCssClass "-current"}}{{/if}}"
4
+ {{#if ../_doNavigationTracking}}
5
+ data-hr-click-tracking='{"settings": [{"type":"uxAction","secondLevelId": "1","clickLabel":"{{../_clickLabelType}}{{#if ../_clickLabelPrefix1}}::{{../_clickLabelPrefix1}}{{/if}}::{{../_clickLabelPrefix2}}-Link geklickt"}]}'
6
+ {{/if}}
7
+ {{#if ../this.isFileDownload}}
8
+ {{#with ../this.trackingData}}data-hr-click-tracking='{"settings": [{"type":"download","secondLevelId": "{{this.secondLevelId}}","clickLabel": "{{this.pageName}}"}]}'{{/with}}
9
+ {{/if}}
10
+ {{#if this.isTargetBlank}} target="_blank" rel="noopener{{#if this.hasNoReferrerFlag}} noreferrer{{/if}}"{{/if}}
11
+ {{#if ../_isAriaHidden}} aria-hidden="true" tabindex="-1"{{/if}}
12
+ >
13
+ {{/with}}
@@ -0,0 +1,12 @@
1
+
2
+ <span
3
+ class='px-4 py-2.5 border flex items-center font-heading
4
+ {{inline-switch
5
+ _type
6
+ '["hollow","hollow-white","inverted"]'
7
+ '["text-button-hollow border-button-hollow hover:bg-button-inverted","text-button-inverted border-button-inverted hover:bg-button-inverted hover:text-button-hollow hover:border-button-hollow","text-button fill-button border-button bg-button-inverted hover:bg-button hover:text-button-inverted hover:fill-button-inverted hover:border-button-hollow","text-button-inverted bg-button hover:bg-button-inverted hover:text-button-hollow hover:border-button-hollow"]'
8
+ }}
9
+ {{#if _css}} {{_css}}{{/if}}'
10
+ >
11
+ {{> @partial-block }}
12
+ </span>
@@ -0,0 +1,7 @@
1
+ <button{{#if _id}} id="{{_id}}"{{/if}} class="border flex items-center px-4 py-2.5 ds-button {{inline-switch
2
+ _type
3
+ '["hollow","hollow-white","inverted"]'
4
+ '["text-button-hollow border-button-hollow fill-button-hollow hover:bg-button-inverted","text-button-inverted border-button-inverted fill-button-inverted hover:bg-button-inverted hover:text-button-hollow hover:fill-button-hollow hover:border-button-hollow","text-button fill-button border-button bg-button-inverted hover:bg-button hover:text-button-inverted hover:fill-button-inverted hover:border-button-hollow","text-button-inverted fill-button-inverted bg-button hover:bg-button-inverted hover:text-button-hollow hover:border-button-hollow"]'
5
+ }}{{#if _css}} {{_css}}{{/if}}{{#if _openModal}} js-modalButton{{/if}}"{{#if _openModal}} aria-haspopup="true"{{/if}}>
6
+ {{> @partial-block }}
7
+ </button>
@@ -0,0 +1 @@
1
+ {{> components/base/image/icon _addClass=(appendToDefault _css "w-4 h-4 fill-inherit ") _icon=_icon _iconmap=_iconmap}}
@@ -0,0 +1 @@
1
+ <span class="{{#if _css}} {{_css}}{{/if}}">{{_label}}</span>
@@ -0,0 +1,3 @@
1
+ {{> components/base/link_open _css=(appendToDefault _css "ds-link") _isAriaHidden=_isAriaHidden}}
2
+ {{> @partial-block }}
3
+ </a>
@@ -0,0 +1 @@
1
+ <span class="font-bold uppercase">{{this.name}}</span>{{#with this.role}} | <span>{{this}}</span>{{/with}}
@@ -0,0 +1,3 @@
1
+ <div class="flex flex-col border-event-calendar-secondary border gap-x-4">
2
+ {{> @partial-block }}
3
+ </div>
@@ -0,0 +1,18 @@
1
+ <div class="js-fr-content">
2
+ {{#each this.months}}
3
+ {{#each this.days}}
4
+ {{#each this.instants}}
5
+ {{#unless this.isDateInstant}}
6
+ {{> components/event/calendar/event_calendar_event_teaser _showTeaser=../this.isFirstAvailable _withConcertInfo=../../../_withConcertInfo}}
7
+ {{/unless}}
8
+ {{/each}}
9
+ {{/each}}
10
+ {{/each}}
11
+ {{#unless this.hasFutureEventsFromNow}}
12
+ <article class="p-4 js-fr-error-target">
13
+ <p class="">
14
+ {{loca "event_calendar_no_events_available"}}
15
+ </p>
16
+ </article>
17
+ {{/unless}}
18
+ </div>
@@ -0,0 +1,60 @@
1
+ <article id="{{this.startDate.htmlDate}}" class="flex col-span-12 md:flex-row gap-y-3 gap-x-4 md:px-0 js-fr-target{{#unless @first}} border-t border-event-calendar-secondary{{/unless}}{{#unless _showTeaser}} hidden{{/unless}}" x-data="{ avStart: false }">
2
+ <div class="border-none h-full">
3
+ <div class="relative">
4
+ <div class="flex flex-col items-stretch sm:flex-row">
5
+ <div class="flex basis-full w-full order-2 py-1 sm:basis-7/12 sm:w-7/12 sm:order-1">
6
+ <div class="flex flex-col basis-2/12 w-2/12 align-top items-center justify-center px-4 py-3 border-dotted border-r border-event-calendar-secondary">
7
+ {{#with this.startDate}}
8
+ <span class='text-base font-serif'>{{this.weekdayNameShort}}</span>
9
+ <span class='text-3xl font-serif font-bold'>{{this.day}}</span>
10
+ <span class='text-base font-serif'>{{this.monthNameShort}}</span>
11
+ {{/with}}
12
+ </div>
13
+ <div class="flex flex-col items-start basis-10/12 w-10/12">
14
+ <div class="absolute top-0 left-0 w-full sm:static">
15
+ <div class="ar-4-3 sm:ar-auto">
16
+ <header class="absolute bottom-0 left-0 p-4 sm:pt-3 sm:pb-2 bg-white opacity-80 sm:static sm:bg-transparent">
17
+ {{#decorator 'components/base/link' _css="ds-teaser-focus hover:text-toplineColor" }}
18
+ {{#> components/teaser/components/teaser_header}}
19
+ {{#with this.label}}
20
+ {{#> components/label/label_group}}
21
+ {{> components/label/label_test _type=this.type _text=(loca this.loca) _css="mr-2"}}
22
+ {{#if ../this.hasStatus}}
23
+ {{> components/event/event_status _status=(loca ../this.statusDescriptionForLabelShort)}}
24
+ {{/if}}
25
+ {{/components/label/label_group}}
26
+ {{/with~}}
27
+ {{#> components/teaser/components/teaser_headline _headlineTag="h3"}}
28
+ {{#if this.topline}}
29
+ {{> components/teaser/components/teaser_topline _text=this.topline}}
30
+ {{/if}}
31
+ {{> components/teaser/components/teaser_title_test _text=this.title _css="text-2xl"}}
32
+ {{> components/event/event_tags this.eventtags}}
33
+ {{/components/teaser/components/teaser_headline}}
34
+ {{/components/teaser/components/teaser_header}}
35
+ {{/decorator}}
36
+ </header>
37
+ </div>
38
+ </div>
39
+ {{> components/event/event_details this}}
40
+ {{#with this.ticketLink}}
41
+ {{> components/event/event_ticket_button}}
42
+ {{/with}}
43
+ </div>
44
+ </div>
45
+ <figure class="basis-full w-full order-1 sm:basis-5/12 sm:w-5/12 sm:order-2 ar-4-3 sm:ar-16-9">
46
+ {{> components/base/image/responsive_image this.image _type="event-teaser" _variant="100" _addClass="w-full"}}
47
+ </figure>
48
+ </div>
49
+ </div>
50
+ {{#if _withConcertInfo}}
51
+ {{#with this.concertInfo}}
52
+ {{#unless this.isEmpty}}
53
+ <div class="flex flex-col grow-0 shrink basis-full py-7 w-full border-event-calendar-secondary border-t border-dotted">
54
+ {{> components/event/concert_info}}
55
+ </div>
56
+ {{/unless}}
57
+ {{/with}}
58
+ {{/if}}
59
+ </div>
60
+ </article>
@@ -0,0 +1,8 @@
1
+ <footer class='bg-event-calendar-primary text-center'>
2
+ {{#decorator
3
+ 'components/base/link'
4
+ _css='block p-2 text-white text-sm font-serif hover:underline underline-offset-3 ds-link'
5
+ }}
6
+ {{loca 'event_calendar_monthly_overview_link'}}
7
+ {{/decorator}}
8
+ </footer>
@@ -0,0 +1,3 @@
1
+ <{{if _headlineTag _headlineTag "h2"}} class="flex font-bold py-2 gap-x-4 items-center justify-center bg-event-calendar-primary">
2
+ <span class="text-white text-2xl leading-6 w-full text-center">{{#if this.title}}{{this.title}}{{else}}{{loca "event_calendar_title"}}{{/if}}</span>
3
+ </{{if _headlineTag _headlineTag "h2"}}>
@@ -0,0 +1,3 @@
1
+ {{#each this.inlineItems~}}
2
+ {{> components/event/calendar/event_calendar_event_teaser}}
3
+ {{/each ~}}
@@ -0,0 +1,27 @@
1
+ <nav class="relative border-b border-event-calendar-secondary js-load" data-hr-native-scroll-ds='{"isTeaser":"true"}' data-hr-filterer-ds="{}">
2
+ <button class="block border-0 ml-4 absolute left-0 min-w-3 min-h-3 top-1/2 js-ns-button -left" aria-hidden="true">
3
+ {{> components/base/image/icon _icon="arrow-left" _iconmap="icons" _addClass="w-5 h-5 fill-current" }}
4
+ </button>
5
+ <button class="block border-0 mr-4 absolute right-0 min-w-3 min-h-3 top-1/2 js-ns-button -right" aria-hidden="true">
6
+ {{> components/base/image/icon _icon="arrow-right" _iconmap="icons" _addClass="w-5 h-5 fill-current" }}
7
+ </button>
8
+ <div class="flex relative max-w-100vw ml-14 mr-14 overflow-hidden box-border border-teal-600">
9
+ <div class="flex mb-0 overflow-x-auto overflow-y-hidden whitespace-nowrap scroll-smooth js-ns-scroll -horizontal">
10
+ {{#each this}}
11
+ <div class="inline-block items-center justify-center border-event-calendar-secondary border-l js-ns-month {{#if
12
+ this.isCurrentMonth}} -currentMonth{{/if}}{{#if
13
+ this.hasFutureEventsFromNow}} -selected{{else}} js-fr-reload-trigger{{/if}}">
14
+ <span class="block font-heading font-bold w-24 sticky left-0 px-2 py-3 ">{{this.date.monthNameShort}} {{this.date.yearShort}}</span>
15
+ <ul class="flex">
16
+ {{#each this.days}}
17
+ <li class="inline-block h-full group cursor-pointer js-ns-item{{#if
18
+ this.isStartOfWeek}} border-l border-event-calendar-secondary{{/if}}">
19
+ {{> components/event/calendar/event_calendar_nav_item _contentUrl=../this.contentUrl}}
20
+ </li>
21
+ {{/each}}
22
+ </ul>
23
+ </div>
24
+ {{/each}}
25
+ </div>
26
+ </div>
27
+ </nav>