hr-design-system-handlebars 1.125.0 β†’ 1.126.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 (31) hide show
  1. package/CHANGELOG.md +29 -0
  2. package/dist/assets/index.css +12 -3
  3. package/dist/assets/js/alpine.js +16 -8
  4. package/dist/assets/js/base/tracking/pianoHelper.subfeature.js +30 -16
  5. package/dist/assets/js/components/appBanner/appBanner.alpine.js +24 -3
  6. package/dist/assets/js/components/appBanner/nativeAppBanner.alpine.js +7 -1
  7. package/dist/assets/js/components/scroll_depth_measurement/scrollDepthMeasurement.alpine.js +28 -0
  8. package/dist/views/components/appBanner/appBanner.hbs +1 -1
  9. package/dist/views/components/appBanner/nativeAppBanner.hbs +1 -1
  10. package/dist/views/components/page/index/page.hbs +1 -0
  11. package/dist/views/components/page/story/story_article.hbs +36 -33
  12. package/dist/views/components/scroll_depth_measurement/scroll_depth_measurement.hbs +7 -0
  13. package/dist/views/components/top_button/top_button.hbs +1 -1
  14. package/dist/views_static/components/appBanner/appBanner.hbs +1 -1
  15. package/dist/views_static/components/appBanner/nativeAppBanner.hbs +1 -1
  16. package/dist/views_static/components/page/index/page.hbs +1 -0
  17. package/dist/views_static/components/page/story/story_article.hbs +36 -33
  18. package/dist/views_static/components/scroll_depth_measurement/scroll_depth_measurement.hbs +7 -0
  19. package/dist/views_static/components/top_button/top_button.hbs +1 -1
  20. package/package.json +13 -13
  21. package/src/assets/js/alpine.js +16 -8
  22. package/src/stories/views/base/tracking/pianoHelper.subfeature.js +30 -16
  23. package/src/stories/views/components/appBanner/appBanner.alpine.js +24 -3
  24. package/src/stories/views/components/appBanner/appBanner.hbs +1 -1
  25. package/src/stories/views/components/appBanner/nativeAppBanner.alpine.js +7 -1
  26. package/src/stories/views/components/appBanner/nativeAppBanner.hbs +1 -1
  27. package/src/stories/views/components/page/index/page.hbs +1 -0
  28. package/src/stories/views/components/page/story/story_article.hbs +36 -33
  29. package/src/stories/views/components/scroll_depth_measurement/scrollDepthMeasurement.alpine.js +28 -0
  30. package/src/stories/views/components/scroll_depth_measurement/scroll_depth_measurement.hbs +7 -0
  31. package/src/stories/views/components/top_button/top_button.hbs +1 -1
package/CHANGELOG.md CHANGED
@@ -1,3 +1,32 @@
1
+ # v1.126.0 (Fri Dec 19 2025)
2
+
3
+ #### πŸš€ Enhancement
4
+
5
+ - Feature/dpe 3470 [#1333](https://github.com/mumprod/hr-design-system-handlebars/pull/1333) ([@szuelch](https://github.com/szuelch))
6
+
7
+ #### πŸ”© Dependency Updates
8
+
9
+ - :arrow_up: Upgrade storybook to latest patch version 8.6.15 to secure… [#1332](https://github.com/mumprod/hr-design-system-handlebars/pull/1332) ([@szuelch](https://github.com/szuelch))
10
+
11
+ #### Authors: 1
12
+
13
+ - [@szuelch](https://github.com/szuelch)
14
+
15
+ ---
16
+
17
+ # v1.125.1 (Wed Dec 17 2025)
18
+
19
+ #### πŸ› Bug Fix
20
+
21
+ - Dpe 3046 b - added cookie and some top button fixes [#1331](https://github.com/mumprod/hr-design-system-handlebars/pull/1331) ([@vascoeduardo](https://github.com/vascoeduardo) [@eduardo-hr](https://github.com/eduardo-hr))
22
+
23
+ #### Authors: 2
24
+
25
+ - [@eduardo-hr](https://github.com/eduardo-hr)
26
+ - Vasco ([@vascoeduardo](https://github.com/vascoeduardo))
27
+
28
+ ---
29
+
1
30
  # v1.125.0 (Tue Dec 16 2025)
2
31
 
3
32
  #### πŸš€ Enhancement
@@ -1726,6 +1726,9 @@ article #commentList {
1726
1726
  .h-1 {
1727
1727
  height: 0.25rem;
1728
1728
  }
1729
+ .h-1\/4 {
1730
+ height: 25%;
1731
+ }
1729
1732
  .h-10 {
1730
1733
  height: 2.5rem;
1731
1734
  }
@@ -1741,6 +1744,9 @@ article #commentList {
1741
1744
  .h-2 {
1742
1745
  height: 0.5rem;
1743
1746
  }
1747
+ .h-22 {
1748
+ height: 5.5rem;
1749
+ }
1744
1750
  .h-3 {
1745
1751
  height: 0.75rem;
1746
1752
  }
@@ -1802,6 +1808,9 @@ article #commentList {
1802
1808
  height: -moz-max-content;
1803
1809
  height: max-content;
1804
1810
  }
1811
+ .h-px {
1812
+ height: 1px;
1813
+ }
1805
1814
  .h-screen {
1806
1815
  height: 100vh;
1807
1816
  }
@@ -3906,7 +3915,7 @@ article #commentList {
3906
3915
  border-bottom-color: var(--color-secondary-ds);
3907
3916
  }
3908
3917
  .counter-reset {
3909
- counter-reset: cnt1765891425916;
3918
+ counter-reset: cnt1766132745495;
3910
3919
  }
3911
3920
  .animate-delay-100 {
3912
3921
  --tw-animate-delay: 100ms;
@@ -4367,7 +4376,7 @@ html { scroll-behavior: smooth; }
4367
4376
  --tw-ring-color: rgba(255, 255, 255, 0.5);
4368
4377
  }
4369
4378
  .-ordered {
4370
- counter-increment: cnt1765891425916 1;
4379
+ counter-increment: cnt1766132745495 1;
4371
4380
  }
4372
4381
  .-ordered::before {
4373
4382
  position: absolute;
@@ -4385,7 +4394,7 @@ html { scroll-behavior: smooth; }
4385
4394
  --tw-text-opacity: 1;
4386
4395
  color: rgba(0, 0, 0, 1);
4387
4396
  color: rgba(0, 0, 0, var(--tw-text-opacity));
4388
- content: counter(cnt1765891425916);
4397
+ content: counter(cnt1766132745495);
4389
4398
  }
4390
4399
  /*! ****************************/
4391
4400
  /*! DataPolicy stuff */
@@ -19,11 +19,18 @@ AsyncAlpine.init(Alpine)
19
19
  import('components/horizontal_scroll_container/horizontal_scroll_container.alpine.js')
20
20
  )
21
21
  .data('stickyPlayer', () => import('components/mediaplayer/stickyPlayer.alpine.js'))
22
- .data('socialSharingHandler', ()=> import('components/social_sharing/socialSharingHandler.alpine.js'))
23
- .data('inputHandler', ()=> import('components/forms/js/inputHandler.alpine.js'))
24
- .data('contactForm', ()=> import('components/forms/js/contactForm.alpine.js'))
25
- .data('newsletterForm', ()=> import('components/newsletter/js/newsletterForm.alpine.js'))
26
- .data('gallerySlider', () => import('components/content/copytext/components/gallery/js/gallerySlider.alpine.js'))
22
+ .data('socialSharingHandler', () =>
23
+ import('components/social_sharing/socialSharingHandler.alpine.js')
24
+ )
25
+ .data('inputHandler', () => import('components/forms/js/inputHandler.alpine.js'))
26
+ .data('contactForm', () => import('components/forms/js/contactForm.alpine.js'))
27
+ .data('newsletterForm', () => import('components/newsletter/js/newsletterForm.alpine.js'))
28
+ .data('gallerySlider', () =>
29
+ import('components/content/copytext/components/gallery/js/gallerySlider.alpine.js')
30
+ )
31
+ .data('measureScrollDepth', () =>
32
+ import('components/scroll_depth_measurement/scrollDepthMeasurement.alpine.js')
33
+ )
27
34
  .start()
28
35
 
29
36
  window.Alpine = Alpine
@@ -46,19 +53,20 @@ Alpine.store('serviceID', {
46
53
  Alpine.store('navIsVisible', true)
47
54
  Alpine.store('subNavIsVisible', false)
48
55
  Alpine.store('footerIsVisible', false)
56
+ Alpine.store('appBannerIsVisible', false)
49
57
  Alpine.store('sectionNavIsVisible', false)
50
58
  Alpine.store('sharingIsVisible', false)
51
59
  Alpine.store('sharingIsOpen', {
52
60
  metadatabox: false,
53
- mobilesticky: false
61
+ mobilesticky: false,
54
62
  })
55
63
  Alpine.store('sharingBottomPos', {
56
- current: '0'
64
+ current: '0',
57
65
  })
58
66
  Alpine.store('forms', {
59
67
  submissionAttempted: [],
60
68
  serverErrorFields: [{}],
61
- errorMessages: [{}]
69
+ errorMessages: [{}],
62
70
  })
63
71
  // Initialization of data handlers
64
72
  Alpine.data('mainNavigationHandler', mainNavigationHandler)
@@ -1,38 +1,52 @@
1
- import SettingsCookie from 'components/external-service/globalSettingsCookie.subfeature';
1
+ import SettingsCookie from 'components/external-service/globalSettingsCookie.subfeature'
2
2
 
3
- const pianoErrorSecondLevelId = 99;
3
+ const pianoErrorSecondLevelId = 99
4
4
 
5
5
  const isTrackingAllowed = () => {
6
- const settingsCookie = new SettingsCookie();
7
- return !settingsCookie.isSettingsCookieExistent("ati") || settingsCookie.isSettingsCookieAccepted('ati');
8
- };
6
+ const settingsCookie = new SettingsCookie()
7
+ return (
8
+ !settingsCookie.isSettingsCookieExistent('ati') ||
9
+ settingsCookie.isSettingsCookieAccepted('ati')
10
+ )
11
+ }
9
12
 
10
13
  const sendEvent = (eventType, event) => {
11
14
  if (typeof pa !== 'undefined' && pa !== undefined && isTrackingAllowed()) {
12
- pa.sendEvent(eventType, event);
15
+ pa.sendEvent(eventType, event)
13
16
  }
14
- };
17
+ }
15
18
 
16
19
  const getDefaultEvent = (label, secondLevelId) => {
17
20
  return {
18
21
  click: label,
19
- site_level2_id: determineSecondLevelId(secondLevelId)
22
+ site_level2_id: determineSecondLevelId(secondLevelId),
20
23
  }
21
- };
24
+ }
22
25
 
23
26
  const determineSecondLevelId = (secondLevelId) => {
24
27
  return secondLevelId !== undefined
25
28
  ? secondLevelId
26
- : undefined !== pageDisplayConfig ? pageDisplayConfig.site_level2_id : pianoErrorSecondLevelId;
27
- };
29
+ : undefined !== pageDisplayConfig
30
+ ? pageDisplayConfig.site_level2_id
31
+ : pianoErrorSecondLevelId
32
+ }
28
33
 
29
- const uxAction = (label, secondLevelId) => sendEvent('click.action', getDefaultEvent(label, secondLevelId));
34
+ const uxAction = (label, secondLevelId) =>
35
+ sendEvent('click.action', getDefaultEvent(label, secondLevelId))
30
36
 
31
- const uxNavigation = (label, secondLevelId) => sendEvent('click.navigation', getDefaultEvent(label, secondLevelId));
37
+ const uxNavigation = (label, secondLevelId) =>
38
+ sendEvent('click.navigation', getDefaultEvent(label, secondLevelId))
32
39
 
33
- const pi = () => sendEvent('page.display', pageDisplayConfig);
40
+ const pi = () => sendEvent('page.display', pageDisplayConfig)
34
41
 
35
- const download = (label, secondLevelId) => sendEvent('click.download', getDefaultEvent(label, secondLevelId));
42
+ const download = (label, secondLevelId) =>
43
+ sendEvent('click.download', getDefaultEvent(label, secondLevelId))
36
44
 
45
+ const scrollDepth = (depth) => {
46
+ sendEvent('page.scroll', {
47
+ scroll_depth: depth,
48
+ page: undefined !== pageDisplayConfig ? pageDisplayConfig.page : 'unknown',
49
+ })
50
+ }
37
51
 
38
- export { isTrackingAllowed, uxAction, uxNavigation, pi, download };
52
+ export { isTrackingAllowed, uxAction, uxNavigation, pi, download, scrollDepth }
@@ -1,4 +1,5 @@
1
1
  import { uxAction } from 'base/tracking/pianoHelper.subfeature'
2
+ import { getJSONCookie, setJSONCookie } from 'hrQuery'
2
3
 
3
4
  export default function appBanner() {
4
5
  return {
@@ -6,24 +7,37 @@ export default function appBanner() {
6
7
  deferredPrompt: null,
7
8
  isAndroid: /Android/i.test(navigator.userAgent),
8
9
  packageId: "de.hr.hessenschau",
10
+ cookie: {},
11
+ cookieLifetime: 1000 * 60 * 60 * 24 * 30,
9
12
  init: function () {
10
-
11
- if(this.isAndroid){
13
+ this.readTrackingCookie()
14
+ if(this.cookie["closed"] !== true){
15
+ if(this.isAndroid){
16
+ this.showBanner = true;
17
+ this.$store.appBannerIsVisible = true;
18
+ }
19
+ }
20
+ if(window.IS_STORYBOOK){
12
21
  this.showBanner = true;
22
+ this.$store.appBannerIsVisible = true;
13
23
  }
14
24
 
15
- if(window.IS_STORYBOOK){ this.showBanner = true;}
16
25
  },
17
26
  installClickHandler: function(){
18
27
  this.openPlayStore()
28
+ this.writeCookie()
19
29
  this.showBanner = false
30
+ this.$store.appBannerIsVisible = false
20
31
  },
21
32
  closeClickHandler: function(){
22
33
  uxAction('appBanner::bannerClosed');
23
34
  this.showBanner = false
35
+ this.$store.appBannerIsVisible = false
36
+ this.writeCookie()
24
37
  },
25
38
  openPlayStore: function() {
26
39
  let fallbackTriggered = false;
40
+ uxAction('appBanner::playStoreOpened');
27
41
 
28
42
  const fallback = () => {
29
43
  if (fallbackTriggered) return;
@@ -45,6 +59,13 @@ export default function appBanner() {
45
59
  `#Intent;scheme=market;package=com.android.vending;end`;
46
60
 
47
61
  setTimeout(fallback, 700);
62
+ },
63
+ writeCookie: function() {
64
+ this.cookie["closed"] = true
65
+ setJSONCookie('appBanner', this.cookie, this.cookieLifetime)
66
+ },
67
+ readTrackingCookie: function() {
68
+ this.cookie = getJSONCookie('appBanner') || {}
48
69
  }
49
70
  }
50
71
  }
@@ -14,9 +14,13 @@ export default function nativeAppBanner() {
14
14
  // Update UI notify the user they can add to home screen
15
15
  if(this.isAndroid){
16
16
  this.showBanner = true;
17
+ this.$store.appBannerIsVisible = true;
17
18
  }
18
19
  });
19
- if(window.IS_STORYBOOK){ this.showBanner = true;}
20
+ if(window.IS_STORYBOOK){
21
+ this.showBanner = true;
22
+ this.$store.appBannerIsVisible = true;
23
+ }
20
24
  },
21
25
  installClickHandler: function(){
22
26
  if(this.deferredPrompt){
@@ -35,10 +39,12 @@ export default function nativeAppBanner() {
35
39
  });
36
40
  }
37
41
  this.showBanner = false
42
+ this.$store.appBannerIsVisible = false
38
43
  },
39
44
  closeClickHandler: function(){
40
45
  uxAction('nativeAppBanner::bannerClosed');
41
46
  this.showBanner = false
47
+ this.$store.appBannerIsVisible = false
42
48
  }
43
49
  }
44
50
  }
@@ -0,0 +1,28 @@
1
+ import { scrollDepth } from 'base/tracking/pianoHelper.subfeature'
2
+ export default function measureScrollDepth() {
3
+ let fired = {}
4
+ function handleIntersect(entries) {
5
+ entries.forEach((entry) => {
6
+ if (entry.isIntersecting && !fired[entry.target.dataset.scrollDepth]) {
7
+ fired[entry.target.dataset.scrollDepth] = true
8
+ scrollDepth(entry.target.dataset.scrollDepth)
9
+ }
10
+ })
11
+ }
12
+ return {
13
+ scrollDepthContainer0: this.$refs.scroll_depth_0,
14
+ scrollDepthContainer25: this.$refs.scroll_depth_25,
15
+ scrollDepthContainer50: this.$refs.scroll_depth_50,
16
+ scrollDepthContainer75: this.$refs.scroll_depth_75,
17
+ scrollDepthContainer100: this.$refs.scroll_depth_100,
18
+
19
+ init() {
20
+ const observer = new IntersectionObserver(handleIntersect)
21
+ observer.observe(this.scrollDepthContainer0)
22
+ observer.observe(this.scrollDepthContainer25)
23
+ observer.observe(this.scrollDepthContainer50)
24
+ observer.observe(this.scrollDepthContainer75)
25
+ observer.observe(this.scrollDepthContainer100)
26
+ },
27
+ }
28
+ }
@@ -1,6 +1,6 @@
1
1
  <div
2
2
  x-data="appBanner()" x-cloak x-show="showBanner" ax-load x-ignore
3
- id="marketing-banner" tabindex="-1" class="fixed bottom-0 z-50 flex flex-row justify-end w-full gap-4 p-4 -translate-x-1/2 flex-nowrap bg-blue-aqua lg:max-w-7xl left-1/2">
3
+ id="marketing-banner" tabindex="-1" class="fixed bottom-0 flex flex-row justify-end w-full gap-4 p-4 -translate-x-1/2 z-300 flex-nowrap bg-blue-aqua lg:max-w-7xl left-1/2">
4
4
  <div class="flex flex-row items-center gap-4 grow">
5
5
  <div class="flex items-center justify-center rounded-lg w-11 h-11 bg-blue-congress-hex shrink-0">
6
6
  <img width="24" height="24" src="{{resourceUrl "assets/base/icons/logo/brandlogo--mobile.min.svg" _brand=(defaultIfEmpty this.brand "hessenschau")}}"
@@ -1,6 +1,6 @@
1
1
  <div
2
2
  x-data="nativeAppBanner()" x-cloak x-show="showBanner" ax-load x-ignore
3
- id="marketing-banner" tabindex="-1" class="fixed bottom-0 z-50 flex flex-row justify-end w-full gap-4 p-4 -translate-x-1/2 flex-nowrap bg-blue-aqua lg:max-w-7xl left-1/2">
3
+ id="marketing-banner" tabindex="-1" class="fixed bottom-0 flex flex-row justify-end w-full gap-4 p-4 -translate-x-1/2 z-300 flex-nowrap bg-blue-aqua lg:max-w-7xl left-1/2">
4
4
  <div class="flex flex-row items-center gap-4 grow">
5
5
  <div class="flex items-center justify-center rounded-lg w-11 h-11 bg-blue-congress-hex shrink-0">
6
6
  <img width="24" height="24" src="{{resourceUrl "assets/base/icons/logo/brandlogo--mobile.min.svg" _brand=(defaultIfEmpty this.brand "hessenschau")}}"
@@ -18,6 +18,7 @@
18
18
  </head>
19
19
 
20
20
  <body itemscope itemtype="http://schema.org/WebPage">
21
+ {{~> components/appBanner/appBanner ~}}
21
22
  <div class="js-pageSwap">
22
23
 
23
24
  {{> components/site_header/header }}
@@ -1,38 +1,41 @@
1
1
  {{#>components/page/base/page_wrapper _isArticle=true _webview=_webview}}
2
-
3
- {{> components/page/base/page_header}}
4
-
5
- {{> components/page/components/shorttext _text=this.shorttext }}
6
-
7
- {{> components/page/components/metadatabox _showDate=this.hasDwellTime _webview=../../_webview-adjust_context}}
8
2
 
9
-
10
- {{#unless this.displayPageLead.isFalse}}
11
- {{#with this.teaseritemDS }}
12
- {{#if this.isImage}}
13
- {{> components/content/copytext/components/image/figure
14
- _cssClass="article-full-width md:article-breakout mt-5 sm:mt-7 "
15
- _cssClassCaption="mx-5 md:mx-0"
16
- _type="story"
17
- _variant=(if this.showSquareImage.isTrue "100-top-sb-1x1" "100-top-sb")
18
- _pictureAddClass=(if this.showSquareImage.isTrue "grid ar-1-1 md:ar-16-9 print:ar-16-9" "ar-16-9")
19
- _isWebview=../../../_webview-adjust_context
20
- _noDelay=true}}
21
- {{/if}}
22
- {{#if this.isVideoOnDemand}}
23
- {{> components/content/copytext/components/media/media_figure _hasHeadline=true _isSticky=true _playerLocation="Aufmacher" _isFullsize=true _isLead=true _playerSize="100" _addClass="print:hidden article-full-width md:article-breakout mt-12 mb-6 sm:mt-14 sm:mb-8" _cssClassCaption="mx-5 md:mx-0" _a11yIntro-loca="story_video_intro_sr" _a11yOutro-loca="story_video_outro_sr" }}
24
- {{/if}}
25
- {{#if this.isLivestream}}
26
- {{> components/content/copytext/components/media/media_figure _hasHeadline=true _isSticky=true _playerLocation="Aufmacher" _isFullsize=true _isLead=true _playerSize="100" _addClass="print:hidden article-full-width md:article-breakout mt-12 mb-6 sm:mt-14 sm:mb-8" _cssClassCaption="mx-5 md:mx-0" _a11yIntro-loca="story_video_livestream_intro_sr" _a11yOutro-loca="story_video_livestream_outro_sr" }}
27
- {{/if}}
28
- {{/with}}
29
- {{/unless}}
30
-
31
- {{#unless ../../_webview-adjust_context}}
32
- {{> components/social_sharing/social_sharing_copytext _useSticky=(configProperty "templates.useStickyNav")}}
33
- {{/unless}}
34
- {{~> components/content/copytext/copytext _isWebview=../../_webview-adjust_context ~}}
35
-
3
+ <div class="article-full-width grid grid-article relative">
4
+ {{> components/scroll_depth_measurement/scroll_depth_measurement}}
5
+
6
+ {{> components/page/base/page_header}}
7
+
8
+ {{> components/page/components/shorttext _text=this.shorttext }}
9
+
10
+ {{> components/page/components/metadatabox _showDate=this.hasDwellTime _webview=../../_webview-adjust_context}}
11
+
12
+
13
+ {{#unless this.displayPageLead.isFalse}}
14
+ {{#with this.teaseritemDS }}
15
+ {{#if this.isImage}}
16
+ {{> components/content/copytext/components/image/figure
17
+ _cssClass="article-full-width md:article-breakout mt-5 sm:mt-7 "
18
+ _cssClassCaption="mx-5 md:mx-0"
19
+ _type="story"
20
+ _variant=(if this.showSquareImage.isTrue "100-top-sb-1x1" "100-top-sb")
21
+ _pictureAddClass=(if this.showSquareImage.isTrue "grid ar-1-1 md:ar-16-9 print:ar-16-9" "ar-16-9")
22
+ _isWebview=../../../_webview-adjust_context
23
+ _noDelay=true}}
24
+ {{/if}}
25
+ {{#if this.isVideoOnDemand}}
26
+ {{> components/content/copytext/components/media/media_figure _hasHeadline=true _isSticky=true _playerLocation="Aufmacher" _isFullsize=true _isLead=true _playerSize="100" _addClass="print:hidden article-full-width md:article-breakout mt-12 mb-6 sm:mt-14 sm:mb-8" _cssClassCaption="mx-5 md:mx-0" _a11yIntro-loca="story_video_intro_sr" _a11yOutro-loca="story_video_outro_sr" }}
27
+ {{/if}}
28
+ {{#if this.isLivestream}}
29
+ {{> components/content/copytext/components/media/media_figure _hasHeadline=true _isSticky=true _playerLocation="Aufmacher" _isFullsize=true _isLead=true _playerSize="100" _addClass="print:hidden article-full-width md:article-breakout mt-12 mb-6 sm:mt-14 sm:mb-8" _cssClassCaption="mx-5 md:mx-0" _a11yIntro-loca="story_video_livestream_intro_sr" _a11yOutro-loca="story_video_livestream_outro_sr" }}
30
+ {{/if}}
31
+ {{/with}}
32
+ {{/unless}}
33
+
34
+ {{#unless ../../_webview-adjust_context}}
35
+ {{> components/social_sharing/social_sharing_copytext _useSticky=(configProperty "templates.useStickyNav")}}
36
+ {{/unless}}
37
+ {{~> components/content/copytext/copytext _isWebview=../../_webview-adjust_context ~}}
38
+ </div>
36
39
  {{~> components/content/content_footer/content_footer
37
40
  _showDate=this.hasDwellTime
38
41
  _date=this.documentPublicationDate
@@ -0,0 +1,7 @@
1
+ <div class="absolute w-full h-full" x-ref="scroll_depth_container" ax-load x-data="measureScrollDepth()" x-ignore>
2
+ <div data-scroll-depth="0%" x-ref="scroll_depth_0" class="w-full h-1/4"></div>
3
+ <div data-scroll-depth="25%" x-ref="scroll_depth_25" class="w-full h-1/4"></div>
4
+ <div data-scroll-depth="50%" x-ref="scroll_depth_50" class="w-full h-1/4"></div>
5
+ <div data-scroll-depth="75%" x-ref="scroll_depth_75" class="w-full h-1/4"></div>
6
+ <div data-scroll-depth="100%" x-ref="scroll_depth_100" class="w-full h-px"></div>
7
+ </div>
@@ -1,7 +1,7 @@
1
1
  <div class="h-8" x-data="{ isVisible: false }">
2
2
  <div class="grid grid-page z-100" :class="{ 'fixed bottom-feature-box-height left-0 w-full': !$store.footerIsVisible }">
3
3
  <div class="flex justify-between h-0 col-full sm:col-main"
4
- :class="{ 'bg-white h-8': $store.footerIsVisible }"
4
+ :class="{ 'bg-white h-8': $store.footerIsVisible, 'h-22': $store.appBannerIsVisible && !$store.footerIsVisible}"
5
5
  x-show="!$store.sharingIsVisible && isVisible"
6
6
  x-transition:enter="transition ease-[cubic-bezier(0.68,-0.3,0.32,1)] duration-500 transform order-first"
7
7
  x-transition:enter-start="opacity-0 translate-y-8"
@@ -1,6 +1,6 @@
1
1
  <div
2
2
  x-data="appBanner()" x-cloak x-show="showBanner" ax-load x-ignore
3
- id="marketing-banner" tabindex="-1" class="fixed bottom-0 z-50 flex flex-row justify-end w-full gap-4 p-4 -translate-x-1/2 flex-nowrap bg-blue-aqua lg:max-w-7xl left-1/2">
3
+ id="marketing-banner" tabindex="-1" class="fixed bottom-0 flex flex-row justify-end w-full gap-4 p-4 -translate-x-1/2 z-300 flex-nowrap bg-blue-aqua lg:max-w-7xl left-1/2">
4
4
  <div class="flex flex-row items-center gap-4 grow">
5
5
  <div class="flex items-center justify-center rounded-lg w-11 h-11 bg-blue-congress-hex shrink-0">
6
6
  <img width="24" height="24" src="{{resourceUrl "assets/base/icons/logo/brandlogo--mobile.min.svg" _brand=(defaultIfEmpty this.brand "hessenschau")}}"
@@ -1,6 +1,6 @@
1
1
  <div
2
2
  x-data="nativeAppBanner()" x-cloak x-show="showBanner" ax-load x-ignore
3
- id="marketing-banner" tabindex="-1" class="fixed bottom-0 z-50 flex flex-row justify-end w-full gap-4 p-4 -translate-x-1/2 flex-nowrap bg-blue-aqua lg:max-w-7xl left-1/2">
3
+ id="marketing-banner" tabindex="-1" class="fixed bottom-0 flex flex-row justify-end w-full gap-4 p-4 -translate-x-1/2 z-300 flex-nowrap bg-blue-aqua lg:max-w-7xl left-1/2">
4
4
  <div class="flex flex-row items-center gap-4 grow">
5
5
  <div class="flex items-center justify-center rounded-lg w-11 h-11 bg-blue-congress-hex shrink-0">
6
6
  <img width="24" height="24" src="{{resourceUrl "assets/base/icons/logo/brandlogo--mobile.min.svg" _brand=(defaultIfEmpty this.brand "hessenschau")}}"
@@ -18,6 +18,7 @@
18
18
  </head>
19
19
 
20
20
  <body itemscope itemtype="http://schema.org/WebPage">
21
+ {{~> components/appBanner/appBanner ~}}
21
22
  <div class="js-pageSwap">
22
23
 
23
24
  {{> components/site_header/header }}
@@ -1,38 +1,41 @@
1
1
  {{#>components/page/base/page_wrapper _isArticle=true _webview=_webview}}
2
-
3
- {{> components/page/base/page_header}}
4
-
5
- {{> components/page/components/shorttext _text=this.shorttext }}
6
-
7
- {{> components/page/components/metadatabox _showDate=this.hasDwellTime _webview=_webview}}
8
2
 
9
-
10
- {{#unless this.displayPageLead.isFalse}}
11
- {{#with this.teaseritemDS }}
12
- {{#if this.isImage}}
13
- {{> components/content/copytext/components/image/figure
14
- _cssClass="article-full-width md:article-breakout mt-5 sm:mt-7 "
15
- _cssClassCaption="mx-5 md:mx-0"
16
- _type="story"
17
- _variant=(if this.showSquareImage.isTrue "100-top-sb-1x1" "100-top-sb")
18
- _pictureAddClass=(if this.showSquareImage.isTrue "grid ar-1-1 md:ar-16-9 print:ar-16-9" "ar-16-9")
19
- _isWebview=../_webview
20
- _noDelay=true}}
21
- {{/if}}
22
- {{#if this.isVideoOnDemand}}
23
- {{> components/content/copytext/components/media/media_figure _hasHeadline=true _isSticky=true _playerLocation="Aufmacher" _isFullsize=true _isLead=true _playerSize="100" _addClass="print:hidden article-full-width md:article-breakout mt-12 mb-6 sm:mt-14 sm:mb-8" _cssClassCaption="mx-5 md:mx-0" _a11yIntro-loca="story_video_intro_sr" _a11yOutro-loca="story_video_outro_sr" }}
24
- {{/if}}
25
- {{#if this.isLivestream}}
26
- {{> components/content/copytext/components/media/media_figure _hasHeadline=true _isSticky=true _playerLocation="Aufmacher" _isFullsize=true _isLead=true _playerSize="100" _addClass="print:hidden article-full-width md:article-breakout mt-12 mb-6 sm:mt-14 sm:mb-8" _cssClassCaption="mx-5 md:mx-0" _a11yIntro-loca="story_video_livestream_intro_sr" _a11yOutro-loca="story_video_livestream_outro_sr" }}
27
- {{/if}}
28
- {{/with}}
29
- {{/unless}}
30
-
31
- {{#unless _webview}}
32
- {{> components/social_sharing/social_sharing_copytext _useSticky=(configProperty "templates.useStickyNav")}}
33
- {{/unless}}
34
- {{~> components/content/copytext/copytext _isWebview=_webview ~}}
35
-
3
+ <div class="article-full-width grid grid-article relative">
4
+ {{> components/scroll_depth_measurement/scroll_depth_measurement}}
5
+
6
+ {{> components/page/base/page_header}}
7
+
8
+ {{> components/page/components/shorttext _text=this.shorttext }}
9
+
10
+ {{> components/page/components/metadatabox _showDate=this.hasDwellTime _webview=_webview}}
11
+
12
+
13
+ {{#unless this.displayPageLead.isFalse}}
14
+ {{#with this.teaseritemDS }}
15
+ {{#if this.isImage}}
16
+ {{> components/content/copytext/components/image/figure
17
+ _cssClass="article-full-width md:article-breakout mt-5 sm:mt-7 "
18
+ _cssClassCaption="mx-5 md:mx-0"
19
+ _type="story"
20
+ _variant=(if this.showSquareImage.isTrue "100-top-sb-1x1" "100-top-sb")
21
+ _pictureAddClass=(if this.showSquareImage.isTrue "grid ar-1-1 md:ar-16-9 print:ar-16-9" "ar-16-9")
22
+ _isWebview=../_webview
23
+ _noDelay=true}}
24
+ {{/if}}
25
+ {{#if this.isVideoOnDemand}}
26
+ {{> components/content/copytext/components/media/media_figure _hasHeadline=true _isSticky=true _playerLocation="Aufmacher" _isFullsize=true _isLead=true _playerSize="100" _addClass="print:hidden article-full-width md:article-breakout mt-12 mb-6 sm:mt-14 sm:mb-8" _cssClassCaption="mx-5 md:mx-0" _a11yIntro-loca="story_video_intro_sr" _a11yOutro-loca="story_video_outro_sr" }}
27
+ {{/if}}
28
+ {{#if this.isLivestream}}
29
+ {{> components/content/copytext/components/media/media_figure _hasHeadline=true _isSticky=true _playerLocation="Aufmacher" _isFullsize=true _isLead=true _playerSize="100" _addClass="print:hidden article-full-width md:article-breakout mt-12 mb-6 sm:mt-14 sm:mb-8" _cssClassCaption="mx-5 md:mx-0" _a11yIntro-loca="story_video_livestream_intro_sr" _a11yOutro-loca="story_video_livestream_outro_sr" }}
30
+ {{/if}}
31
+ {{/with}}
32
+ {{/unless}}
33
+
34
+ {{#unless _webview}}
35
+ {{> components/social_sharing/social_sharing_copytext _useSticky=(configProperty "templates.useStickyNav")}}
36
+ {{/unless}}
37
+ {{~> components/content/copytext/copytext _isWebview=_webview ~}}
38
+ </div>
36
39
  {{~> components/content/content_footer/content_footer
37
40
  _showDate=this.hasDwellTime
38
41
  _date=this.documentPublicationDate
@@ -0,0 +1,7 @@
1
+ <div class="absolute w-full h-full" x-ref="scroll_depth_container" ax-load x-data="measureScrollDepth()" x-ignore>
2
+ <div data-scroll-depth="0%" x-ref="scroll_depth_0" class="w-full h-1/4"></div>
3
+ <div data-scroll-depth="25%" x-ref="scroll_depth_25" class="w-full h-1/4"></div>
4
+ <div data-scroll-depth="50%" x-ref="scroll_depth_50" class="w-full h-1/4"></div>
5
+ <div data-scroll-depth="75%" x-ref="scroll_depth_75" class="w-full h-1/4"></div>
6
+ <div data-scroll-depth="100%" x-ref="scroll_depth_100" class="w-full h-px"></div>
7
+ </div>
@@ -1,7 +1,7 @@
1
1
  <div class="h-8" x-data="{ isVisible: false }">
2
2
  <div class="grid grid-page z-100" :class="{ 'fixed bottom-feature-box-height left-0 w-full': !$store.footerIsVisible }">
3
3
  <div class="flex justify-between h-0 col-full sm:col-main"
4
- :class="{ 'bg-white h-8': $store.footerIsVisible }"
4
+ :class="{ 'bg-white h-8': $store.footerIsVisible, 'h-22': $store.appBannerIsVisible && !$store.footerIsVisible}"
5
5
  x-show="!$store.sharingIsVisible && isVisible"
6
6
  x-transition:enter="transition ease-[cubic-bezier(0.68,-0.3,0.32,1)] duration-500 transform order-first"
7
7
  x-transition:enter-start="opacity-0 translate-y-8"
package/package.json CHANGED
@@ -6,7 +6,7 @@
6
6
  "license": "MIT",
7
7
  "main": "dist/index.js",
8
8
  "repository": "https://github.com/szuelch/hr-design-system-handlebars",
9
- "version": "1.125.0",
9
+ "version": "1.126.0",
10
10
  "scripts": {
11
11
  "test": "echo \"Error: no test specified\" && exit 1",
12
12
  "storybook": "storybook dev -p 6006 public",
@@ -44,22 +44,22 @@
44
44
  "@babel/core": "^7.12.10",
45
45
  "@babel/preset-env": "^7.21.4",
46
46
  "@chromatic-com/storybook": "1",
47
- "@storybook/addon-a11y": "^8.2.6",
48
- "@storybook/addon-actions": "^8.2.6",
47
+ "@storybook/addon-a11y": "8.6.15",
48
+ "@storybook/addon-actions": "8.6.15",
49
49
  "@storybook/addon-console": "^3.0.0",
50
- "@storybook/addon-essentials": "^8.2.6",
51
- "@storybook/addon-interactions": "^8.2.6",
52
- "@storybook/addon-links": "^8.2.6",
50
+ "@storybook/addon-essentials": "8.6.15",
51
+ "@storybook/addon-interactions": "8.6.15",
52
+ "@storybook/addon-links": "8.6.15",
53
53
  "@storybook/addon-styling-webpack": "1.0.0",
54
- "@storybook/addon-themes": "^8.2.6",
54
+ "@storybook/addon-themes": "8.6.15",
55
55
  "@storybook/addon-webpack5-compiler-babel": "3.0.3",
56
56
  "@storybook/addon-webpack5-compiler-swc": "1.0.4",
57
- "@storybook/blocks": "^8.2.6",
58
- "@storybook/html": "^8.2.6",
59
- "@storybook/html-webpack5": "^8.2.6",
60
- "@storybook/test": "^8.2.6",
57
+ "@storybook/blocks": "8.6.15",
58
+ "@storybook/html": "8.6.15",
59
+ "@storybook/html-webpack5": "8.6.15",
60
+ "@storybook/test": "8.6.15",
61
61
  "@storybook/test-runner": "^0.19.1",
62
- "@storybook/theming": "^8.2.6",
62
+ "@storybook/theming": "8.6.15",
63
63
  "auto": "^11.0.5",
64
64
  "autoprefixer": "^10.4.2",
65
65
  "babel-loader": "^8.2.2",
@@ -101,7 +101,7 @@
101
101
  "raw-loader": "^4.0.2",
102
102
  "remark-gfm": "^4.0.0",
103
103
  "rimraf": "^3.0.2",
104
- "storybook": "^8.2.6",
104
+ "storybook": "8.6.15",
105
105
  "storybook-addon-fetch-mock": "^2.0.1",
106
106
  "storybook-conditional-toolbar-selector": "^1.0.3",
107
107
  "style-loader": "^4.0.0",
@@ -19,11 +19,18 @@ AsyncAlpine.init(Alpine)
19
19
  import('components/horizontal_scroll_container/horizontal_scroll_container.alpine.js')
20
20
  )
21
21
  .data('stickyPlayer', () => import('components/mediaplayer/stickyPlayer.alpine.js'))
22
- .data('socialSharingHandler', ()=> import('components/social_sharing/socialSharingHandler.alpine.js'))
23
- .data('inputHandler', ()=> import('components/forms/js/inputHandler.alpine.js'))
24
- .data('contactForm', ()=> import('components/forms/js/contactForm.alpine.js'))
25
- .data('newsletterForm', ()=> import('components/newsletter/js/newsletterForm.alpine.js'))
26
- .data('gallerySlider', () => import('components/content/copytext/components/gallery/js/gallerySlider.alpine.js'))
22
+ .data('socialSharingHandler', () =>
23
+ import('components/social_sharing/socialSharingHandler.alpine.js')
24
+ )
25
+ .data('inputHandler', () => import('components/forms/js/inputHandler.alpine.js'))
26
+ .data('contactForm', () => import('components/forms/js/contactForm.alpine.js'))
27
+ .data('newsletterForm', () => import('components/newsletter/js/newsletterForm.alpine.js'))
28
+ .data('gallerySlider', () =>
29
+ import('components/content/copytext/components/gallery/js/gallerySlider.alpine.js')
30
+ )
31
+ .data('measureScrollDepth', () =>
32
+ import('components/scroll_depth_measurement/scrollDepthMeasurement.alpine.js')
33
+ )
27
34
  .start()
28
35
 
29
36
  window.Alpine = Alpine
@@ -46,19 +53,20 @@ Alpine.store('serviceID', {
46
53
  Alpine.store('navIsVisible', true)
47
54
  Alpine.store('subNavIsVisible', false)
48
55
  Alpine.store('footerIsVisible', false)
56
+ Alpine.store('appBannerIsVisible', false)
49
57
  Alpine.store('sectionNavIsVisible', false)
50
58
  Alpine.store('sharingIsVisible', false)
51
59
  Alpine.store('sharingIsOpen', {
52
60
  metadatabox: false,
53
- mobilesticky: false
61
+ mobilesticky: false,
54
62
  })
55
63
  Alpine.store('sharingBottomPos', {
56
- current: '0'
64
+ current: '0',
57
65
  })
58
66
  Alpine.store('forms', {
59
67
  submissionAttempted: [],
60
68
  serverErrorFields: [{}],
61
- errorMessages: [{}]
69
+ errorMessages: [{}],
62
70
  })
63
71
  // Initialization of data handlers
64
72
  Alpine.data('mainNavigationHandler', mainNavigationHandler)
@@ -1,38 +1,52 @@
1
- import SettingsCookie from 'components/external-service/globalSettingsCookie.subfeature';
1
+ import SettingsCookie from 'components/external-service/globalSettingsCookie.subfeature'
2
2
 
3
- const pianoErrorSecondLevelId = 99;
3
+ const pianoErrorSecondLevelId = 99
4
4
 
5
5
  const isTrackingAllowed = () => {
6
- const settingsCookie = new SettingsCookie();
7
- return !settingsCookie.isSettingsCookieExistent("ati") || settingsCookie.isSettingsCookieAccepted('ati');
8
- };
6
+ const settingsCookie = new SettingsCookie()
7
+ return (
8
+ !settingsCookie.isSettingsCookieExistent('ati') ||
9
+ settingsCookie.isSettingsCookieAccepted('ati')
10
+ )
11
+ }
9
12
 
10
13
  const sendEvent = (eventType, event) => {
11
14
  if (typeof pa !== 'undefined' && pa !== undefined && isTrackingAllowed()) {
12
- pa.sendEvent(eventType, event);
15
+ pa.sendEvent(eventType, event)
13
16
  }
14
- };
17
+ }
15
18
 
16
19
  const getDefaultEvent = (label, secondLevelId) => {
17
20
  return {
18
21
  click: label,
19
- site_level2_id: determineSecondLevelId(secondLevelId)
22
+ site_level2_id: determineSecondLevelId(secondLevelId),
20
23
  }
21
- };
24
+ }
22
25
 
23
26
  const determineSecondLevelId = (secondLevelId) => {
24
27
  return secondLevelId !== undefined
25
28
  ? secondLevelId
26
- : undefined !== pageDisplayConfig ? pageDisplayConfig.site_level2_id : pianoErrorSecondLevelId;
27
- };
29
+ : undefined !== pageDisplayConfig
30
+ ? pageDisplayConfig.site_level2_id
31
+ : pianoErrorSecondLevelId
32
+ }
28
33
 
29
- const uxAction = (label, secondLevelId) => sendEvent('click.action', getDefaultEvent(label, secondLevelId));
34
+ const uxAction = (label, secondLevelId) =>
35
+ sendEvent('click.action', getDefaultEvent(label, secondLevelId))
30
36
 
31
- const uxNavigation = (label, secondLevelId) => sendEvent('click.navigation', getDefaultEvent(label, secondLevelId));
37
+ const uxNavigation = (label, secondLevelId) =>
38
+ sendEvent('click.navigation', getDefaultEvent(label, secondLevelId))
32
39
 
33
- const pi = () => sendEvent('page.display', pageDisplayConfig);
40
+ const pi = () => sendEvent('page.display', pageDisplayConfig)
34
41
 
35
- const download = (label, secondLevelId) => sendEvent('click.download', getDefaultEvent(label, secondLevelId));
42
+ const download = (label, secondLevelId) =>
43
+ sendEvent('click.download', getDefaultEvent(label, secondLevelId))
36
44
 
45
+ const scrollDepth = (depth) => {
46
+ sendEvent('page.scroll', {
47
+ scroll_depth: depth,
48
+ page: undefined !== pageDisplayConfig ? pageDisplayConfig.page : 'unknown',
49
+ })
50
+ }
37
51
 
38
- export { isTrackingAllowed, uxAction, uxNavigation, pi, download };
52
+ export { isTrackingAllowed, uxAction, uxNavigation, pi, download, scrollDepth }
@@ -1,4 +1,5 @@
1
1
  import { uxAction } from 'base/tracking/pianoHelper.subfeature'
2
+ import { getJSONCookie, setJSONCookie } from 'hrQuery'
2
3
 
3
4
  export default function appBanner() {
4
5
  return {
@@ -6,24 +7,37 @@ export default function appBanner() {
6
7
  deferredPrompt: null,
7
8
  isAndroid: /Android/i.test(navigator.userAgent),
8
9
  packageId: "de.hr.hessenschau",
10
+ cookie: {},
11
+ cookieLifetime: 1000 * 60 * 60 * 24 * 30,
9
12
  init: function () {
10
-
11
- if(this.isAndroid){
13
+ this.readTrackingCookie()
14
+ if(this.cookie["closed"] !== true){
15
+ if(this.isAndroid){
16
+ this.showBanner = true;
17
+ this.$store.appBannerIsVisible = true;
18
+ }
19
+ }
20
+ if(window.IS_STORYBOOK){
12
21
  this.showBanner = true;
22
+ this.$store.appBannerIsVisible = true;
13
23
  }
14
24
 
15
- if(window.IS_STORYBOOK){ this.showBanner = true;}
16
25
  },
17
26
  installClickHandler: function(){
18
27
  this.openPlayStore()
28
+ this.writeCookie()
19
29
  this.showBanner = false
30
+ this.$store.appBannerIsVisible = false
20
31
  },
21
32
  closeClickHandler: function(){
22
33
  uxAction('appBanner::bannerClosed');
23
34
  this.showBanner = false
35
+ this.$store.appBannerIsVisible = false
36
+ this.writeCookie()
24
37
  },
25
38
  openPlayStore: function() {
26
39
  let fallbackTriggered = false;
40
+ uxAction('appBanner::playStoreOpened');
27
41
 
28
42
  const fallback = () => {
29
43
  if (fallbackTriggered) return;
@@ -45,6 +59,13 @@ export default function appBanner() {
45
59
  `#Intent;scheme=market;package=com.android.vending;end`;
46
60
 
47
61
  setTimeout(fallback, 700);
62
+ },
63
+ writeCookie: function() {
64
+ this.cookie["closed"] = true
65
+ setJSONCookie('appBanner', this.cookie, this.cookieLifetime)
66
+ },
67
+ readTrackingCookie: function() {
68
+ this.cookie = getJSONCookie('appBanner') || {}
48
69
  }
49
70
  }
50
71
  }
@@ -1,6 +1,6 @@
1
1
  <div
2
2
  x-data="appBanner()" x-cloak x-show="showBanner" ax-load x-ignore
3
- id="marketing-banner" tabindex="-1" class="fixed bottom-0 z-50 flex flex-row justify-end w-full gap-4 p-4 -translate-x-1/2 flex-nowrap bg-blue-aqua lg:max-w-7xl left-1/2">
3
+ id="marketing-banner" tabindex="-1" class="fixed bottom-0 flex flex-row justify-end w-full gap-4 p-4 -translate-x-1/2 z-300 flex-nowrap bg-blue-aqua lg:max-w-7xl left-1/2">
4
4
  <div class="flex flex-row items-center gap-4 grow">
5
5
  <div class="flex items-center justify-center rounded-lg w-11 h-11 bg-blue-congress-hex shrink-0">
6
6
  <img width="24" height="24" src="{{resourceUrl "assets/base/icons/logo/brandlogo--mobile.min.svg" _brand=(defaultIfEmpty this.brand "hessenschau")}}"
@@ -14,9 +14,13 @@ export default function nativeAppBanner() {
14
14
  // Update UI notify the user they can add to home screen
15
15
  if(this.isAndroid){
16
16
  this.showBanner = true;
17
+ this.$store.appBannerIsVisible = true;
17
18
  }
18
19
  });
19
- if(window.IS_STORYBOOK){ this.showBanner = true;}
20
+ if(window.IS_STORYBOOK){
21
+ this.showBanner = true;
22
+ this.$store.appBannerIsVisible = true;
23
+ }
20
24
  },
21
25
  installClickHandler: function(){
22
26
  if(this.deferredPrompt){
@@ -35,10 +39,12 @@ export default function nativeAppBanner() {
35
39
  });
36
40
  }
37
41
  this.showBanner = false
42
+ this.$store.appBannerIsVisible = false
38
43
  },
39
44
  closeClickHandler: function(){
40
45
  uxAction('nativeAppBanner::bannerClosed');
41
46
  this.showBanner = false
47
+ this.$store.appBannerIsVisible = false
42
48
  }
43
49
  }
44
50
  }
@@ -1,6 +1,6 @@
1
1
  <div
2
2
  x-data="nativeAppBanner()" x-cloak x-show="showBanner" ax-load x-ignore
3
- id="marketing-banner" tabindex="-1" class="fixed bottom-0 z-50 flex flex-row justify-end w-full gap-4 p-4 -translate-x-1/2 flex-nowrap bg-blue-aqua lg:max-w-7xl left-1/2">
3
+ id="marketing-banner" tabindex="-1" class="fixed bottom-0 flex flex-row justify-end w-full gap-4 p-4 -translate-x-1/2 z-300 flex-nowrap bg-blue-aqua lg:max-w-7xl left-1/2">
4
4
  <div class="flex flex-row items-center gap-4 grow">
5
5
  <div class="flex items-center justify-center rounded-lg w-11 h-11 bg-blue-congress-hex shrink-0">
6
6
  <img width="24" height="24" src="{{resourceUrl "assets/base/icons/logo/brandlogo--mobile.min.svg" _brand=(defaultIfEmpty this.brand "hessenschau")}}"
@@ -18,6 +18,7 @@
18
18
  </head>
19
19
 
20
20
  <body itemscope itemtype="http://schema.org/WebPage">
21
+ {{~> components/appBanner/appBanner ~}}
21
22
  <div class="js-pageSwap">
22
23
 
23
24
  {{> components/site_header/header }}
@@ -1,38 +1,41 @@
1
1
  {{#>components/page/base/page_wrapper _isArticle=true _webview=_webview}}
2
-
3
- {{> components/page/base/page_header}}
4
-
5
- {{> components/page/components/shorttext _text=this.shorttext }}
6
-
7
- {{> components/page/components/metadatabox _showDate=this.hasDwellTime _webview=_webview-adjust_context}}
8
2
 
9
-
10
- {{#unless this.displayPageLead.isFalse}}
11
- {{#with this.teaseritemDS }}
12
- {{#if this.isImage}}
13
- {{> components/content/copytext/components/image/figure
14
- _cssClass="article-full-width md:article-breakout mt-5 sm:mt-7 "
15
- _cssClassCaption="mx-5 md:mx-0"
16
- _type="story"
17
- _variant=(if this.showSquareImage.isTrue "100-top-sb-1x1" "100-top-sb")
18
- _pictureAddClass=(if this.showSquareImage.isTrue "grid ar-1-1 md:ar-16-9 print:ar-16-9" "ar-16-9")
19
- _isWebview=../_webview-adjust_context
20
- _noDelay=true}}
21
- {{/if}}
22
- {{#if this.isVideoOnDemand}}
23
- {{> components/content/copytext/components/media/media_figure _hasHeadline=true _isSticky=true _playerLocation="Aufmacher" _isFullsize=true _isLead=true _playerSize="100" _addClass="print:hidden article-full-width md:article-breakout mt-12 mb-6 sm:mt-14 sm:mb-8" _cssClassCaption="mx-5 md:mx-0" _a11yIntro-loca="story_video_intro_sr" _a11yOutro-loca="story_video_outro_sr" }}
24
- {{/if}}
25
- {{#if this.isLivestream}}
26
- {{> components/content/copytext/components/media/media_figure _hasHeadline=true _isSticky=true _playerLocation="Aufmacher" _isFullsize=true _isLead=true _playerSize="100" _addClass="print:hidden article-full-width md:article-breakout mt-12 mb-6 sm:mt-14 sm:mb-8" _cssClassCaption="mx-5 md:mx-0" _a11yIntro-loca="story_video_livestream_intro_sr" _a11yOutro-loca="story_video_livestream_outro_sr" }}
27
- {{/if}}
28
- {{/with}}
29
- {{/unless}}
30
-
31
- {{#unless _webview-adjust_context}}
32
- {{> components/social_sharing/social_sharing_copytext _useSticky=(configProperty "templates.useStickyNav")}}
33
- {{/unless}}
34
- {{~> components/content/copytext/copytext _isWebview=_webview-adjust_context ~}}
35
-
3
+ <div class="article-full-width grid grid-article relative">
4
+ {{> components/scroll_depth_measurement/scroll_depth_measurement}}
5
+
6
+ {{> components/page/base/page_header}}
7
+
8
+ {{> components/page/components/shorttext _text=this.shorttext }}
9
+
10
+ {{> components/page/components/metadatabox _showDate=this.hasDwellTime _webview=_webview-adjust_context}}
11
+
12
+
13
+ {{#unless this.displayPageLead.isFalse}}
14
+ {{#with this.teaseritemDS }}
15
+ {{#if this.isImage}}
16
+ {{> components/content/copytext/components/image/figure
17
+ _cssClass="article-full-width md:article-breakout mt-5 sm:mt-7 "
18
+ _cssClassCaption="mx-5 md:mx-0"
19
+ _type="story"
20
+ _variant=(if this.showSquareImage.isTrue "100-top-sb-1x1" "100-top-sb")
21
+ _pictureAddClass=(if this.showSquareImage.isTrue "grid ar-1-1 md:ar-16-9 print:ar-16-9" "ar-16-9")
22
+ _isWebview=../_webview-adjust_context
23
+ _noDelay=true}}
24
+ {{/if}}
25
+ {{#if this.isVideoOnDemand}}
26
+ {{> components/content/copytext/components/media/media_figure _hasHeadline=true _isSticky=true _playerLocation="Aufmacher" _isFullsize=true _isLead=true _playerSize="100" _addClass="print:hidden article-full-width md:article-breakout mt-12 mb-6 sm:mt-14 sm:mb-8" _cssClassCaption="mx-5 md:mx-0" _a11yIntro-loca="story_video_intro_sr" _a11yOutro-loca="story_video_outro_sr" }}
27
+ {{/if}}
28
+ {{#if this.isLivestream}}
29
+ {{> components/content/copytext/components/media/media_figure _hasHeadline=true _isSticky=true _playerLocation="Aufmacher" _isFullsize=true _isLead=true _playerSize="100" _addClass="print:hidden article-full-width md:article-breakout mt-12 mb-6 sm:mt-14 sm:mb-8" _cssClassCaption="mx-5 md:mx-0" _a11yIntro-loca="story_video_livestream_intro_sr" _a11yOutro-loca="story_video_livestream_outro_sr" }}
30
+ {{/if}}
31
+ {{/with}}
32
+ {{/unless}}
33
+
34
+ {{#unless _webview-adjust_context}}
35
+ {{> components/social_sharing/social_sharing_copytext _useSticky=(configProperty "templates.useStickyNav")}}
36
+ {{/unless}}
37
+ {{~> components/content/copytext/copytext _isWebview=_webview-adjust_context ~}}
38
+ </div>
36
39
  {{~> components/content/content_footer/content_footer
37
40
  _showDate=this.hasDwellTime
38
41
  _date=this.documentPublicationDate
@@ -0,0 +1,28 @@
1
+ import { scrollDepth } from 'base/tracking/pianoHelper.subfeature'
2
+ export default function measureScrollDepth() {
3
+ let fired = {}
4
+ function handleIntersect(entries) {
5
+ entries.forEach((entry) => {
6
+ if (entry.isIntersecting && !fired[entry.target.dataset.scrollDepth]) {
7
+ fired[entry.target.dataset.scrollDepth] = true
8
+ scrollDepth(entry.target.dataset.scrollDepth)
9
+ }
10
+ })
11
+ }
12
+ return {
13
+ scrollDepthContainer0: this.$refs.scroll_depth_0,
14
+ scrollDepthContainer25: this.$refs.scroll_depth_25,
15
+ scrollDepthContainer50: this.$refs.scroll_depth_50,
16
+ scrollDepthContainer75: this.$refs.scroll_depth_75,
17
+ scrollDepthContainer100: this.$refs.scroll_depth_100,
18
+
19
+ init() {
20
+ const observer = new IntersectionObserver(handleIntersect)
21
+ observer.observe(this.scrollDepthContainer0)
22
+ observer.observe(this.scrollDepthContainer25)
23
+ observer.observe(this.scrollDepthContainer50)
24
+ observer.observe(this.scrollDepthContainer75)
25
+ observer.observe(this.scrollDepthContainer100)
26
+ },
27
+ }
28
+ }
@@ -0,0 +1,7 @@
1
+ <div class="absolute w-full h-full" x-ref="scroll_depth_container" ax-load x-data="measureScrollDepth()" x-ignore>
2
+ <div data-scroll-depth="0%" x-ref="scroll_depth_0" class="w-full h-1/4"></div>
3
+ <div data-scroll-depth="25%" x-ref="scroll_depth_25" class="w-full h-1/4"></div>
4
+ <div data-scroll-depth="50%" x-ref="scroll_depth_50" class="w-full h-1/4"></div>
5
+ <div data-scroll-depth="75%" x-ref="scroll_depth_75" class="w-full h-1/4"></div>
6
+ <div data-scroll-depth="100%" x-ref="scroll_depth_100" class="w-full h-px"></div>
7
+ </div>
@@ -1,7 +1,7 @@
1
1
  <div class="h-8" x-data="{ isVisible: false }">
2
2
  <div class="grid grid-page z-100" :class="{ 'fixed bottom-feature-box-height left-0 w-full': !$store.footerIsVisible }">
3
3
  <div class="flex justify-between h-0 col-full sm:col-main"
4
- :class="{ 'bg-white h-8': $store.footerIsVisible }"
4
+ :class="{ 'bg-white h-8': $store.footerIsVisible, 'h-22': $store.appBannerIsVisible && !$store.footerIsVisible}"
5
5
  x-show="!$store.sharingIsVisible && isVisible"
6
6
  x-transition:enter="transition ease-[cubic-bezier(0.68,-0.3,0.32,1)] duration-500 transform order-first"
7
7
  x-transition:enter-start="opacity-0 translate-y-8"