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.
- package/CHANGELOG.md +14 -0
- package/build/handlebars/helpers/handlebar-helpers.js +12 -0
- package/dist/assets/brand/_default/conf/locatags.json +11 -1
- package/dist/assets/brand/hessenschau/conf/locatags.json +1 -0
- package/dist/assets/brand/hr/conf/locatags.json +1 -0
- package/dist/assets/brand/hr-bigband/conf/locatags.json +1 -0
- package/dist/assets/brand/hr-fernsehen/conf/locatags.json +1 -0
- package/dist/assets/brand/hr-inforadio/conf/locatags.json +1 -0
- package/dist/assets/brand/hr-rundfunkrat/conf/locatags.json +1 -0
- package/dist/assets/brand/hr-sinfonieorchester/conf/locatags.json +1 -0
- package/dist/assets/brand/hr-werbung/conf/locatags.json +1 -0
- package/dist/assets/brand/hr1/conf/locatags.json +1 -0
- package/dist/assets/brand/hr2/conf/locatags.json +1 -0
- package/dist/assets/brand/hr3/conf/locatags.json +1 -0
- package/dist/assets/brand/hr4/conf/locatags.json +1 -0
- package/dist/assets/brand/you-fm/conf/locatags.json +1 -0
- package/dist/assets/index.css +415 -62
- package/dist/assets/js/components/event/filtererDs.feature.js +298 -0
- package/dist/assets/js/components/event/nativeScrollDs.feature.js +110 -0
- package/dist/assets/js/components/modal/modal.feature.js +38 -0
- package/dist/views/components/base/image/responsive_image.hbs +1 -0
- package/dist/views/components/base/link.hbs +3 -15
- package/dist/views/components/base/link_open.hbs +13 -0
- package/dist/views/components/button/button_pseudo_v2.hbs +12 -0
- package/dist/views/components/button/button_v2.hbs +7 -0
- package/dist/views/components/button/components/button_icon.hbs +1 -0
- package/dist/views/components/button/components/button_label.hbs +1 -0
- package/dist/views/components/button/components/button_pseudo_link.hbs +3 -0
- package/dist/views/components/event/artist.hbs +1 -0
- package/dist/views/components/event/calendar/event_calendar.hbs +3 -0
- package/dist/views/components/event/calendar/event_calendar_content.hbs +18 -0
- package/dist/views/components/event/calendar/event_calendar_event_teaser.hbs +60 -0
- package/dist/views/components/event/calendar/event_calendar_footer.hbs +8 -0
- package/dist/views/components/event/calendar/event_calendar_heading.hbs +3 -0
- package/dist/views/components/event/calendar/event_calendar_inline.hbs +3 -0
- package/dist/views/components/event/calendar/event_calendar_nav.hbs +27 -0
- package/dist/views/components/event/calendar/event_calendar_nav_item.hbs +7 -0
- package/dist/views/components/event/concert_info.hbs +66 -0
- package/dist/views/components/event/event_details.hbs +20 -0
- package/dist/views/components/event/event_status.hbs +1 -0
- package/dist/views/components/event/event_tag.hbs +3 -0
- package/dist/views/components/event/event_tags.hbs +11 -0
- package/dist/views/components/event/event_ticket_button.hbs +30 -0
- package/dist/views/components/label/label_byline.hbs +7 -0
- package/dist/views/components/label/label_group.hbs +3 -0
- package/dist/views/components/label/label_test.hbs +11 -0
- package/dist/views/components/modal/modal.hbs +7 -0
- package/dist/views/components/teaser/components/teaser_header.hbs +3 -0
- package/dist/views/components/teaser/components/teaser_heading.hbs +3 -1
- package/dist/views/components/teaser/components/teaser_headline.hbs +3 -0
- package/dist/views/components/teaser/components/teaser_title_classes.hbs +3 -0
- package/dist/views/components/teaser/components/teaser_title_test.hbs +3 -0
- package/dist/views/components/teaser/components/teaser_topline.hbs +1 -5
- package/dist/views/components/teaser/teaser_event_calendar.hbs +8 -0
- package/gulpfile.js +5 -1
- package/package.json +4 -2
- package/src/assets/brand/_default/conf/locatags.json +11 -1
- package/src/assets/brand/hessenschau/conf/locatags.json +1 -0
- package/src/assets/brand/hessenschau/conf/locatags.merged.json +10 -0
- package/src/assets/brand/hr/conf/locatags.json +1 -0
- package/src/assets/brand/hr/conf/locatags.merged.json +10 -0
- package/src/assets/brand/hr-bigband/conf/locatags.json +1 -0
- package/src/assets/brand/hr-bigband/conf/locatags.merged.json +10 -0
- package/src/assets/brand/hr-fernsehen/conf/locatags.json +1 -0
- package/src/assets/brand/hr-fernsehen/conf/locatags.merged.json +10 -0
- package/src/assets/brand/hr-inforadio/conf/locatags.json +1 -0
- package/src/assets/brand/hr-inforadio/conf/locatags.merged.json +10 -0
- package/src/assets/brand/hr-rundfunkrat/conf/locatags.json +1 -0
- package/src/assets/brand/hr-rundfunkrat/conf/locatags.merged.json +10 -0
- package/src/assets/brand/hr-sinfonieorchester/conf/locatags.json +1 -0
- package/src/assets/brand/hr-sinfonieorchester/conf/locatags.merged.json +10 -0
- package/src/assets/brand/hr-werbung/conf/locatags.json +1 -0
- package/src/assets/brand/hr-werbung/conf/locatags.merged.json +10 -0
- package/src/assets/brand/hr1/conf/locatags.json +1 -0
- package/src/assets/brand/hr1/conf/locatags.merged.json +10 -0
- package/src/assets/brand/hr2/conf/locatags.json +1 -0
- package/src/assets/brand/hr2/conf/locatags.merged.json +10 -0
- package/src/assets/brand/hr3/conf/locatags.json +1 -0
- package/src/assets/brand/hr3/conf/locatags.merged.json +10 -0
- package/src/assets/brand/hr4/conf/locatags.json +1 -0
- package/src/assets/brand/hr4/conf/locatags.merged.json +10 -0
- package/src/assets/brand/you-fm/conf/locatags.json +1 -0
- package/src/assets/brand/you-fm/conf/locatags.merged.json +10 -0
- package/src/assets/css/custom-utilities.css +36 -0
- package/src/assets/fixtures/event/calendar/event_calendar.inc.json +10 -0
- package/src/assets/fixtures/event/calendar/event_calendar_event_teaser.inc.json +89 -0
- package/src/assets/fixtures/event/calendar/event_calendar_event_teaser.json +4 -0
- package/src/assets/fixtures/event/calendar/event_calendar_footer.json +14 -0
- package/src/assets/fixtures/event/calendar/event_calendar_months.inc.json +1295 -0
- package/src/assets/fixtures/teaser/teaser_event_calendar_100_no_future_events.json +24 -0
- package/src/assets/fixtures/teaser/teaser_event_calendar_100_serif.json +21 -0
- package/src/assets/fixtures/teaser/teaser_images.inc.json +21 -0
- package/src/assets/fixtures/teaser/teaser_labels.inc.json +12 -0
- package/src/assets/fixtures/teaser/teasers.inc.json +31 -0
- package/src/assets/tailwind.css +43 -5
- package/src/stories/views/components/base/image/responsive_image.hbs +1 -0
- package/src/stories/views/components/base/link.hbs +3 -15
- package/src/stories/views/components/base/link_open.hbs +13 -0
- package/src/stories/views/components/button/button_pseudo_v2.hbs +12 -0
- package/src/stories/views/components/button/button_v2.hbs +7 -0
- package/src/stories/views/components/button/components/button_icon.hbs +1 -0
- package/src/stories/views/components/button/components/button_label.hbs +1 -0
- package/src/stories/views/components/button/components/button_pseudo_link.hbs +3 -0
- package/src/stories/views/components/event/artist.hbs +1 -0
- package/src/stories/views/components/event/calendar/event_calendar.hbs +3 -0
- package/src/stories/views/components/event/calendar/event_calendar_components.stories.mdx +161 -0
- package/src/stories/views/components/event/calendar/event_calendar_content.hbs +18 -0
- package/src/stories/views/components/event/calendar/event_calendar_event_teaser.hbs +60 -0
- package/src/stories/views/components/event/calendar/event_calendar_footer.hbs +8 -0
- package/src/stories/views/components/event/calendar/event_calendar_heading.hbs +3 -0
- package/src/stories/views/components/event/calendar/event_calendar_inline.hbs +3 -0
- package/src/stories/views/components/event/calendar/event_calendar_nav.hbs +27 -0
- package/src/stories/views/components/event/calendar/event_calendar_nav_item.hbs +7 -0
- package/src/stories/views/components/event/calendar/fixtures/event_calendar_event_teaser.json +1 -0
- package/src/stories/views/components/event/calendar/fixtures/event_calendar_footer.json +1 -0
- package/src/stories/views/components/event/concert_info.hbs +66 -0
- package/src/stories/views/components/event/event_details.hbs +20 -0
- package/src/stories/views/components/event/event_status.hbs +1 -0
- package/src/stories/views/components/event/event_tag.hbs +3 -0
- package/src/stories/views/components/event/event_tags.hbs +11 -0
- package/src/stories/views/components/event/event_ticket_button.hbs +30 -0
- package/src/stories/views/components/event/filtererDs.feature.js +298 -0
- package/src/stories/views/components/event/nativeScrollDs.feature.js +110 -0
- package/src/stories/views/components/label/label_byline.hbs +7 -0
- package/src/stories/views/components/label/label_group.hbs +3 -0
- package/src/stories/views/components/label/label_test.hbs +11 -0
- package/src/stories/views/components/modal/modal.feature.js +38 -0
- package/src/stories/views/components/modal/modal.hbs +7 -0
- package/src/stories/views/components/teaser/components/teaser_header.hbs +3 -0
- package/src/stories/views/components/teaser/components/teaser_heading.hbs +3 -1
- package/src/stories/views/components/teaser/components/teaser_headline.hbs +3 -0
- package/src/stories/views/components/teaser/components/teaser_title_classes.hbs +3 -0
- package/src/stories/views/components/teaser/components/teaser_title_test.hbs +3 -0
- package/src/stories/views/components/teaser/components/teaser_topline.hbs +1 -5
- package/src/stories/views/components/teaser/fixtures/teaser_event_calendar_100_no_future_events.json +1 -0
- package/src/stories/views/components/teaser/fixtures/teaser_event_calendar_100_serif.json +1 -0
- package/src/stories/views/components/teaser/teaser_event_calendar.hbs +8 -0
- package/src/stories/views/components/teaser/teaser_event_calendar.stories.mdx +131 -0
- 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
|
|
@@ -1,15 +1,3 @@
|
|
|
1
|
-
{{
|
|
2
|
-
|
|
3
|
-
|
|
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 @@
|
|
|
1
|
+
<span class="font-bold uppercase">{{this.name}}</span>{{#with this.role}} | <span>{{this}}</span>{{/with}}
|
|
@@ -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,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>
|