hr-design-system-handlebars 1.63.14 → 1.64.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 (144) hide show
  1. package/.github/workflows/chromatic.yml +1 -1
  2. package/CHANGELOG.md +24 -0
  3. package/build/handlebars/helpers/handlebar-helpers.js +72 -14
  4. package/dist/assets/brand/hessenschau/conf/locatags.merged.json +6 -0
  5. package/dist/assets/brand/hr/conf/locatags.merged.json +6 -0
  6. package/dist/assets/brand/hr-bigband/conf/locatags.merged.json +6 -0
  7. package/dist/assets/brand/hr-fernsehen/conf/locatags.merged.json +6 -0
  8. package/dist/assets/brand/hr-inforadio/conf/locatags.merged.json +6 -0
  9. package/dist/assets/brand/hr-rundfunkrat/conf/locatags.merged.json +6 -0
  10. package/dist/assets/brand/hr-sinfonieorchester/conf/locatags.merged.json +6 -0
  11. package/dist/assets/brand/hr-werbung/conf/locatags.merged.json +6 -0
  12. package/dist/assets/brand/hr1/conf/locatags.merged.json +6 -0
  13. package/dist/assets/brand/hr2/conf/locatags.merged.json +6 -0
  14. package/dist/assets/brand/hr3/conf/locatags.merged.json +6 -0
  15. package/dist/assets/brand/hr4/conf/locatags.merged.json +6 -0
  16. package/dist/assets/brand/you-fm/conf/locatags.merged.json +6 -0
  17. package/dist/assets/index.css +13 -3
  18. package/dist/assets/js/components/modal/defaultModal.subfeature.js +58 -0
  19. package/dist/assets/js/components/modal/modal.feature.js +11 -52
  20. package/dist/assets/js/components/modal/userConsentModal.subfeature.js +120 -0
  21. package/dist/views/components/banner/header/banner_image.hbs +1 -1
  22. package/dist/views/components/base/backlink.hbs +1 -1
  23. package/dist/views/components/base/link.hbs +1 -1
  24. package/dist/views/components/dataPolicySettings/data_policy_settings.hbs +4 -4
  25. package/dist/views/components/event/calendar/event_calendar.hbs +3 -0
  26. package/dist/views/components/event/event_ticket_button.hbs +10 -18
  27. package/dist/views/components/geoTag/geoTag_list.hbs +1 -1
  28. package/dist/views/components/mediaplayer/media_player.hbs +1 -1
  29. package/dist/views/components/modal/modal.hbs +1 -1
  30. package/dist/views/components/modal/user_consent.hbs +13 -0
  31. package/dist/views/components/navigation/breadcrumb/breadcrumb.hbs +1 -1
  32. package/dist/views/components/navigation/breadcrumb/breadcrumb_items.ssi.hbs +1 -1
  33. package/dist/views/components/page/components/author.hbs +1 -1
  34. package/dist/views/components/page/components/socialsharing.hbs +4 -4
  35. package/dist/views/components/podcast/components/podcast_subscribe_button.hbs +1 -1
  36. package/dist/views/components/podcast/podcast_player.hbs +1 -1
  37. package/dist/views/components/site_header/brand_navigation/brand_navigation_item.hbs +1 -1
  38. package/dist/views/components/site_header/navigation_flyout/navigation_flyout.hbs +1 -1
  39. package/dist/views/components/site_header/section_navigation/section_navigation_item.hbs +3 -3
  40. package/dist/views/components/site_header/service_logo.hbs +1 -1
  41. package/dist/views/components/site_header/service_navigation/service_navigation_item.hbs +3 -3
  42. package/dist/views/components/social_sharing/social_sharing_compact_icons.hbs +4 -4
  43. package/dist/views/components/socialmedia/socialmedia.hbs +4 -4
  44. package/dist/views/components/teaser/components/teaser_body.hbs +10 -1
  45. package/dist/views/components/teaser/components/teaser_lead.hbs +1 -1
  46. package/dist/views/components/teaser/group_teaser/group_teaser.hbs +1 -1
  47. package/dist/views/components/teaser/group_teaser/group_teaser_accented.hbs +1 -1
  48. package/dist/views/components/teaser/ticker/teaser_ticker_timeline.hbs +1 -1
  49. package/dist/views/components/topictag/topictag_list.hbs +1 -1
  50. package/dist/views_static/components/banner/header/banner_image.hbs +1 -1
  51. package/dist/views_static/components/base/backlink.hbs +1 -1
  52. package/dist/views_static/components/base/link.hbs +1 -1
  53. package/dist/views_static/components/dataPolicySettings/data_policy_settings.hbs +4 -4
  54. package/dist/views_static/components/event/calendar/event_calendar.hbs +3 -0
  55. package/dist/views_static/components/event/event_ticket_button.hbs +10 -18
  56. package/dist/views_static/components/geoTag/geoTag_list.hbs +1 -1
  57. package/dist/views_static/components/mediaplayer/media_player.hbs +1 -1
  58. package/dist/views_static/components/modal/modal.hbs +1 -1
  59. package/dist/views_static/components/modal/user_consent.hbs +13 -0
  60. package/dist/views_static/components/navigation/breadcrumb/breadcrumb.hbs +1 -1
  61. package/dist/views_static/components/navigation/breadcrumb/breadcrumb_items.ssi.hbs +1 -1
  62. package/dist/views_static/components/page/components/author.hbs +1 -1
  63. package/dist/views_static/components/page/components/socialsharing.hbs +4 -4
  64. package/dist/views_static/components/podcast/components/podcast_subscribe_button.hbs +1 -1
  65. package/dist/views_static/components/podcast/podcast_player.hbs +1 -1
  66. package/dist/views_static/components/site_header/brand_navigation/brand_navigation_item.hbs +1 -1
  67. package/dist/views_static/components/site_header/navigation_flyout/navigation_flyout.hbs +1 -1
  68. package/dist/views_static/components/site_header/section_navigation/section_navigation_item.hbs +3 -3
  69. package/dist/views_static/components/site_header/service_logo.hbs +1 -1
  70. package/dist/views_static/components/site_header/service_navigation/service_navigation_item.hbs +3 -3
  71. package/dist/views_static/components/social_sharing/social_sharing_compact_icons.hbs +4 -4
  72. package/dist/views_static/components/socialmedia/socialmedia.hbs +4 -4
  73. package/dist/views_static/components/teaser/components/teaser_body.hbs +10 -1
  74. package/dist/views_static/components/teaser/components/teaser_lead.hbs +1 -1
  75. package/dist/views_static/components/teaser/group_teaser/group_teaser.hbs +1 -1
  76. package/dist/views_static/components/teaser/group_teaser/group_teaser_accented.hbs +1 -1
  77. package/dist/views_static/components/teaser/ticker/teaser_ticker_timeline.hbs +1 -1
  78. package/dist/views_static/components/topictag/topictag_list.hbs +1 -1
  79. package/package.json +1 -1
  80. package/src/assets/brand/_default/conf/locatags.json +6 -0
  81. package/src/assets/brand/hessenschau/conf/locatags.merged.json +6 -0
  82. package/src/assets/brand/hr/conf/locatags.merged.json +6 -0
  83. package/src/assets/brand/hr-bigband/conf/locatags.merged.json +6 -0
  84. package/src/assets/brand/hr-fernsehen/conf/locatags.merged.json +6 -0
  85. package/src/assets/brand/hr-inforadio/conf/locatags.merged.json +6 -0
  86. package/src/assets/brand/hr-rundfunkrat/conf/locatags.merged.json +6 -0
  87. package/src/assets/brand/hr-sinfonieorchester/conf/locatags.merged.json +6 -0
  88. package/src/assets/brand/hr-werbung/conf/locatags.merged.json +6 -0
  89. package/src/assets/brand/hr1/conf/locatags.merged.json +6 -0
  90. package/src/assets/brand/hr2/conf/locatags.merged.json +6 -0
  91. package/src/assets/brand/hr3/conf/locatags.merged.json +6 -0
  92. package/src/assets/brand/hr4/conf/locatags.merged.json +6 -0
  93. package/src/assets/brand/you-fm/conf/locatags.merged.json +6 -0
  94. package/src/assets/css/custom-components.css +2 -1
  95. package/src/assets/fixtures/teaser/teaser_standard_50_serif_link_two_click.json +22 -0
  96. package/src/assets/fixtures/teaser/teasers.inc.json +2 -1
  97. package/src/assets/tailwind.css +3 -0
  98. package/src/stories/views/components/banner/header/banner_image.hbs +1 -1
  99. package/src/stories/views/components/base/backlink.hbs +1 -1
  100. package/src/stories/views/components/base/link.hbs +1 -1
  101. package/src/stories/views/components/dataPolicySettings/data_policy_settings.hbs +4 -4
  102. package/src/stories/views/components/event/calendar/event_calendar.hbs +3 -0
  103. package/src/stories/views/components/event/event_ticket_button.hbs +10 -18
  104. package/src/stories/views/components/geoTag/geoTag_list.hbs +1 -1
  105. package/src/stories/views/components/mediaplayer/media_player.hbs +1 -1
  106. package/src/stories/views/components/modal/defaultModal.subfeature.js +58 -0
  107. package/src/stories/views/components/modal/modal.feature.js +11 -52
  108. package/src/stories/views/components/modal/modal.hbs +1 -1
  109. package/src/stories/views/components/modal/modal.mdx +104 -0
  110. package/src/stories/views/components/modal/modal.stories.js +79 -0
  111. package/src/stories/views/components/modal/userConsentModal.subfeature.js +120 -0
  112. package/src/stories/views/components/modal/user_consent.hbs +13 -0
  113. package/src/stories/views/components/navigation/breadcrumb/breadcrumb.hbs +1 -1
  114. package/src/stories/views/components/navigation/breadcrumb/breadcrumb_items.ssi.hbs +1 -1
  115. package/src/stories/views/components/page/components/author.hbs +1 -1
  116. package/src/stories/views/components/page/components/socialsharing.hbs +4 -4
  117. package/src/stories/views/components/pagination/fixtures/page_pagination.json +1 -1
  118. package/src/stories/views/components/podcast/components/podcast_subscribe_button.hbs +1 -1
  119. package/src/stories/views/components/podcast/podcast_player.hbs +1 -1
  120. package/src/stories/views/components/site_header/brand_navigation/brand_navigation_item.hbs +1 -1
  121. package/src/stories/views/components/site_header/navigation_flyout/navigation_flyout.hbs +1 -1
  122. package/src/stories/views/components/site_header/section_navigation/section_navigation_item.hbs +3 -3
  123. package/src/stories/views/components/site_header/service_logo.hbs +1 -1
  124. package/src/stories/views/components/site_header/service_navigation/service_navigation_item.hbs +3 -3
  125. package/src/stories/views/components/social_sharing/social_sharing_compact_icons.hbs +4 -4
  126. package/src/stories/views/components/socialmedia/socialmedia.hbs +4 -4
  127. package/src/stories/views/components/teaser/components/teaser_body.hbs +10 -1
  128. package/src/stories/views/components/teaser/components/teaser_lead.hbs +1 -1
  129. package/src/stories/views/components/teaser/fixtures/teaser_alternative_100_serif_link.json +1 -1
  130. package/src/stories/views/components/teaser/fixtures/teaser_alternative_50_serif_link.json +1 -1
  131. package/src/stories/views/components/teaser/fixtures/teaser_alternative_hero_serif_link.json +1 -1
  132. package/src/stories/views/components/teaser/fixtures/teaser_standard_100_serif_link.json +1 -1
  133. package/src/stories/views/components/teaser/fixtures/teaser_standard_25_serif_link.json +1 -1
  134. package/src/stories/views/components/teaser/fixtures/teaser_standard_33_serif_link.json +1 -1
  135. package/src/stories/views/components/teaser/fixtures/teaser_standard_50_serif_link.json +1 -1
  136. package/src/stories/views/components/teaser/fixtures/teaser_standard_50_serif_link_two_click.json +1 -0
  137. package/src/stories/views/components/teaser/fixtures/teaser_standard_hero_serif_link.json +1 -1
  138. package/src/stories/views/components/teaser/group_teaser/group_teaser.hbs +1 -1
  139. package/src/stories/views/components/teaser/group_teaser/group_teaser_accented.hbs +1 -1
  140. package/src/stories/views/components/teaser/teaser_standard.mdx +4 -0
  141. package/src/stories/views/components/teaser/teaser_standard.stories.js +7 -0
  142. package/src/stories/views/components/teaser/ticker/teaser_ticker_timeline.hbs +1 -1
  143. package/src/stories/views/components/topictag/topictag_list.hbs +1 -1
  144. package/tailwind.config.js +2 -0
@@ -112,6 +112,10 @@
112
112
  "livestream_plays": "Jetzt live",
113
113
  "livestream_will_play": "Startet am {0}",
114
114
  "livestream_will_play_with_time": "Startet am {0} um {1} Uhr",
115
+ "modal_user_consent_headline": "Sie verlassen unser Angebot",
116
+ "modal_user_consent_text": "Der Link öffnet eine Internetseite außerhalb unseres Angebots. Wir sind für den Inhalt externer Internetseiten nicht verantwortlich.",
117
+ "modal_user_consent_label_cancel": "Abbrechen",
118
+ "modal_user_consent_label_ok": "Zur externen Internetseite",
115
119
  "poster_copyright": "Bild © {0}",
116
120
  "search_input_aria_submit": "Suche starten",
117
121
  "search_input_placeholder": "Ort oder Thema suchen",
@@ -132,6 +136,8 @@
132
136
  "story_program_supplier": "Thema in",
133
137
  "ticket_modal_headline": "Weiterleitung zu einem Ticketservice",
134
138
  "ticket_modal_text": "Der Link öffnet eine Internetseite außerhalb unseres Angebots. Wir sind für den Inhalt externer Internetseiten nicht verantwortlich.",
139
+ "ticket_modal_label_ok": "Zum Ticketshop",
140
+ "ticket_modal_label_cancel": "Abbrechen",
135
141
  "ticker_more": "Zum Ticker",
136
142
  "topictag_headline": "Alle Beiträge zum Thema {0}",
137
143
  "topictag_metadescription_prefix": "Alle Beiträge zum Thema ",
@@ -112,6 +112,10 @@
112
112
  "livestream_plays": "Jetzt live",
113
113
  "livestream_will_play": "Startet am {0}",
114
114
  "livestream_will_play_with_time": "Startet am {0} um {1} Uhr",
115
+ "modal_user_consent_headline": "Sie verlassen unser Angebot",
116
+ "modal_user_consent_text": "Der Link öffnet eine Internetseite außerhalb unseres Angebots. Wir sind für den Inhalt externer Internetseiten nicht verantwortlich.",
117
+ "modal_user_consent_label_cancel": "Abbrechen",
118
+ "modal_user_consent_label_ok": "Zur externen Internetseite",
115
119
  "poster_copyright": "Bild © {0}",
116
120
  "search_input_aria_submit": "Suche starten",
117
121
  "search_input_placeholder": "Ort oder Thema suchen",
@@ -132,6 +136,8 @@
132
136
  "story_program_supplier": "Thema in",
133
137
  "ticket_modal_headline": "Weiterleitung zu einem Ticketservice",
134
138
  "ticket_modal_text": "Der Link öffnet eine Internetseite außerhalb unseres Angebots. Wir sind für den Inhalt externer Internetseiten nicht verantwortlich.",
139
+ "ticket_modal_label_ok": "Zum Ticketshop",
140
+ "ticket_modal_label_cancel": "Abbrechen",
135
141
  "ticker_more": "Zum Ticker",
136
142
  "topictag_headline": "Alle Beiträge zum Thema {0}",
137
143
  "topictag_metadescription_prefix": "Alle Beiträge zum Thema ",
@@ -112,6 +112,10 @@
112
112
  "livestream_plays": "Jetzt live",
113
113
  "livestream_will_play": "Startet am {0}",
114
114
  "livestream_will_play_with_time": "Startet am {0} um {1} Uhr",
115
+ "modal_user_consent_headline": "Sie verlassen unser Angebot",
116
+ "modal_user_consent_text": "Der Link öffnet eine Internetseite außerhalb unseres Angebots. Wir sind für den Inhalt externer Internetseiten nicht verantwortlich.",
117
+ "modal_user_consent_label_cancel": "Abbrechen",
118
+ "modal_user_consent_label_ok": "Zur externen Internetseite",
115
119
  "poster_copyright": "Bild © {0}",
116
120
  "search_input_aria_submit": "Suche starten",
117
121
  "search_input_placeholder": "Ort oder Thema suchen",
@@ -132,6 +136,8 @@
132
136
  "story_program_supplier": "Thema in",
133
137
  "ticket_modal_headline": "Weiterleitung zu einem Ticketservice",
134
138
  "ticket_modal_text": "Der Link öffnet eine Internetseite außerhalb unseres Angebots. Wir sind für den Inhalt externer Internetseiten nicht verantwortlich.",
139
+ "ticket_modal_label_ok": "Zum Ticketshop",
140
+ "ticket_modal_label_cancel": "Abbrechen",
135
141
  "ticker_more": "Zum Ticker",
136
142
  "topictag_headline": "Alle Beiträge zum Thema {0}",
137
143
  "topictag_metadescription_prefix": "Alle Beiträge zum Thema ",
@@ -112,6 +112,10 @@
112
112
  "livestream_plays": "Jetzt live",
113
113
  "livestream_will_play": "Startet am {0}",
114
114
  "livestream_will_play_with_time": "Startet am {0} um {1} Uhr",
115
+ "modal_user_consent_headline": "Sie verlassen unser Angebot",
116
+ "modal_user_consent_text": "Der Link öffnet eine Internetseite außerhalb unseres Angebots. Wir sind für den Inhalt externer Internetseiten nicht verantwortlich.",
117
+ "modal_user_consent_label_cancel": "Abbrechen",
118
+ "modal_user_consent_label_ok": "Zur externen Internetseite",
115
119
  "poster_copyright": "Bild © {0}",
116
120
  "search_input_aria_submit": "Suche starten",
117
121
  "search_input_placeholder": "Ort oder Thema suchen",
@@ -132,6 +136,8 @@
132
136
  "story_program_supplier": "Thema in",
133
137
  "ticket_modal_headline": "Weiterleitung zu einem Ticketservice",
134
138
  "ticket_modal_text": "Der Link öffnet eine Internetseite außerhalb unseres Angebots. Wir sind für den Inhalt externer Internetseiten nicht verantwortlich.",
139
+ "ticket_modal_label_ok": "Zum Ticketshop",
140
+ "ticket_modal_label_cancel": "Abbrechen",
135
141
  "ticker_more": "Zum Ticker",
136
142
  "topictag_headline": "Alle Beiträge zum Thema {0}",
137
143
  "topictag_metadescription_prefix": "Alle Beiträge zum Thema ",
@@ -112,6 +112,10 @@
112
112
  "livestream_plays": "Jetzt live",
113
113
  "livestream_will_play": "Startet am {0}",
114
114
  "livestream_will_play_with_time": "Startet am {0} um {1} Uhr",
115
+ "modal_user_consent_headline": "Sie verlassen unser Angebot",
116
+ "modal_user_consent_text": "Der Link öffnet eine Internetseite außerhalb unseres Angebots. Wir sind für den Inhalt externer Internetseiten nicht verantwortlich.",
117
+ "modal_user_consent_label_cancel": "Abbrechen",
118
+ "modal_user_consent_label_ok": "Zur externen Internetseite",
115
119
  "poster_copyright": "Bild © {0}",
116
120
  "search_input_aria_submit": "Suche starten",
117
121
  "search_input_placeholder": "Ort oder Thema suchen",
@@ -132,6 +136,8 @@
132
136
  "story_program_supplier": "Thema in",
133
137
  "ticket_modal_headline": "Weiterleitung zu einem Ticketservice",
134
138
  "ticket_modal_text": "Der Link öffnet eine Internetseite außerhalb unseres Angebots. Wir sind für den Inhalt externer Internetseiten nicht verantwortlich.",
139
+ "ticket_modal_label_ok": "Zum Ticketshop",
140
+ "ticket_modal_label_cancel": "Abbrechen",
135
141
  "ticker_more": "Zum Ticker",
136
142
  "topictag_headline": "Alle Beiträge zum Thema {0}",
137
143
  "topictag_metadescription_prefix": "Alle Beiträge zum Thema ",
@@ -112,6 +112,10 @@
112
112
  "livestream_plays": "Jetzt live",
113
113
  "livestream_will_play": "Startet am {0}",
114
114
  "livestream_will_play_with_time": "Startet am {0} um {1} Uhr",
115
+ "modal_user_consent_headline": "Sie verlassen unser Angebot",
116
+ "modal_user_consent_text": "Der Link öffnet eine Internetseite außerhalb unseres Angebots. Wir sind für den Inhalt externer Internetseiten nicht verantwortlich.",
117
+ "modal_user_consent_label_cancel": "Abbrechen",
118
+ "modal_user_consent_label_ok": "Zur externen Internetseite",
115
119
  "poster_copyright": "Bild © {0}",
116
120
  "search_input_aria_submit": "Suche starten",
117
121
  "search_input_placeholder": "Ort oder Thema suchen",
@@ -132,6 +136,8 @@
132
136
  "story_program_supplier": "Thema in",
133
137
  "ticket_modal_headline": "Weiterleitung zu einem Ticketservice",
134
138
  "ticket_modal_text": "Der Link öffnet eine Internetseite außerhalb unseres Angebots. Wir sind für den Inhalt externer Internetseiten nicht verantwortlich.",
139
+ "ticket_modal_label_ok": "Zum Ticketshop",
140
+ "ticket_modal_label_cancel": "Abbrechen",
135
141
  "ticker_more": "Zum Ticker",
136
142
  "topictag_headline": "Alle Beiträge zum Thema {0}",
137
143
  "topictag_metadescription_prefix": "Alle Beiträge zum Thema ",
@@ -112,6 +112,10 @@
112
112
  "livestream_plays": "Jetzt live",
113
113
  "livestream_will_play": "Startet am {0}",
114
114
  "livestream_will_play_with_time": "Startet am {0} um {1} Uhr",
115
+ "modal_user_consent_headline": "Sie verlassen unser Angebot",
116
+ "modal_user_consent_text": "Der Link öffnet eine Internetseite außerhalb unseres Angebots. Wir sind für den Inhalt externer Internetseiten nicht verantwortlich.",
117
+ "modal_user_consent_label_cancel": "Abbrechen",
118
+ "modal_user_consent_label_ok": "Zur externen Internetseite",
115
119
  "poster_copyright": "Bild © {0}",
116
120
  "search_input_aria_submit": "Suche starten",
117
121
  "search_input_placeholder": "Ort oder Thema suchen",
@@ -132,6 +136,8 @@
132
136
  "story_program_supplier": "Thema in",
133
137
  "ticket_modal_headline": "Weiterleitung zu einem Ticketservice",
134
138
  "ticket_modal_text": "Der Link öffnet eine Internetseite außerhalb unseres Angebots. Wir sind für den Inhalt externer Internetseiten nicht verantwortlich.",
139
+ "ticket_modal_label_ok": "Zum Ticketshop",
140
+ "ticket_modal_label_cancel": "Abbrechen",
135
141
  "ticker_more": "Zum Ticker",
136
142
  "topictag_headline": "Alle Beiträge zum Thema {0}",
137
143
  "topictag_metadescription_prefix": "Alle Beiträge zum Thema ",
@@ -112,6 +112,10 @@
112
112
  "livestream_plays": "Jetzt live",
113
113
  "livestream_will_play": "Startet am {0}",
114
114
  "livestream_will_play_with_time": "Startet am {0} um {1} Uhr",
115
+ "modal_user_consent_headline": "Sie verlassen unser Angebot",
116
+ "modal_user_consent_text": "Der Link öffnet eine Internetseite außerhalb unseres Angebots. Wir sind für den Inhalt externer Internetseiten nicht verantwortlich.",
117
+ "modal_user_consent_label_cancel": "Abbrechen",
118
+ "modal_user_consent_label_ok": "Zur externen Internetseite",
115
119
  "poster_copyright": "Bild © {0}",
116
120
  "search_input_aria_submit": "Suche starten",
117
121
  "search_input_placeholder": "Ort oder Thema suchen",
@@ -132,6 +136,8 @@
132
136
  "story_program_supplier": "Thema in",
133
137
  "ticket_modal_headline": "Weiterleitung zu einem Ticketservice",
134
138
  "ticket_modal_text": "Der Link öffnet eine Internetseite außerhalb unseres Angebots. Wir sind für den Inhalt externer Internetseiten nicht verantwortlich.",
139
+ "ticket_modal_label_ok": "Zum Ticketshop",
140
+ "ticket_modal_label_cancel": "Abbrechen",
135
141
  "ticker_more": "Zum Ticker",
136
142
  "topictag_headline": "Alle Beiträge zum Thema {0}",
137
143
  "topictag_metadescription_prefix": "Alle Beiträge zum Thema ",
@@ -170,7 +170,8 @@
170
170
  @apply text-base;
171
171
  @apply font-copy;
172
172
  @apply list-none;
173
- @apply border-button--dark;
173
+ @apply border-button--dark dark:border-navigation-border-color-dark;
174
+ @apply dark:border-opacity-75;
174
175
  @apply fill-content-nav;
175
176
  @apply text-content-nav;
176
177
  @apply bg-white;
@@ -0,0 +1,22 @@
1
+ {
2
+ "@->jsoninclude": "teaser/teasers.inc.json",
3
+ "@->contentpath": "teaser_link",
4
+ "@->overrides": [
5
+ {
6
+ "@->contentpath": "logicItem.includeModel.teaserSize",
7
+ "@->value": "50"
8
+ },
9
+ {
10
+ "@->contentpath": "logicItem.includeModel.realTeaserSize",
11
+ "@->value": "50"
12
+ },
13
+ {
14
+ "@->contentpath": "logicItem.includeModel.link.url",
15
+ "@->value": "https://tagesschau.de"
16
+ },
17
+ {
18
+ "@->contentpath": "logicItem.includeModel.link.isUserConsentNeeded",
19
+ "@->value": true
20
+ }
21
+ ]
22
+ }
@@ -1659,7 +1659,8 @@
1659
1659
  "readMoreScreenreader": "Zur Tagesschau Website",
1660
1660
  "readMore": "Zur Tagesschau Website",
1661
1661
  "readMoreLong": "Zur Tagesschau Website"
1662
- }
1662
+ },
1663
+ "isUserConsentNeeded": false
1663
1664
  }
1664
1665
  }
1665
1666
  }
@@ -45,6 +45,9 @@
45
45
  --color-search-footer-text: theme('colors.black.DEFAULT');
46
46
  --search-icon-color: theme('colors.black.DEFAULT');
47
47
 
48
+ /* Content navi button border color for dark mode */
49
+ --color-navigation-border-color-dark: theme('colors.blue.danube');
50
+
48
51
  /* Logo-Container Padding */
49
52
  --logo-padding-top: 6px;
50
53
  --logo-padding-bottom: 6px;
@@ -1,6 +1,6 @@
1
1
  {{#with this.bannerImage}}
2
2
  {{#if ../bannerLink}}
3
- <a href="{{../bannerLink}}">
3
+ <a href="{{../bannerLink}}"{{#if (isUserConsentNeeded ../bannerLink)}} class="js-user-consent-needed"{{/if}}>
4
4
  {{/if}}
5
5
  {{#unless ../_hideOnMobile }}
6
6
  {{~> components/base/image/responsive_image _type="banner" _variant="default" _addClass="print:hidden" _noDelay="true" _title=(loca "banner_image_copyright" (strip this.copyrightWithLinks html)) ~}}
@@ -1,4 +1,4 @@
1
- <a href="{{this}}" class="flex flex-nowrap items-center text-sm gap-x-2 text-primary hover:underline {{~#with _addClass }} {{this}}{{/with}}">
1
+ <a href="{{this}}" class="{{if (isUserConsentNeeded this) 'js-user-consent-needed ' ''}}flex flex-nowrap items-center text-sm gap-x-2 text-primary hover:underline {{~#with _addClass }} {{this}}{{/with}}">
2
2
  {{~> components/base/image/icon _icon="arrow-left" _addClass="w-5 h-5 fill-current" ~}}
3
3
  {{~loca "backlink_title" ~}}
4
4
  </a>
@@ -1,5 +1,5 @@
1
1
  <a {{#with _link.webviewUrl}}data-webviewurl="{{this}}"{{/with}} {{#if _link.isStaticUrl}}href="{{#if _link.site}}{{resourceUrl _link.url _site=_link.site}}{{else}}{{resourceUrl _link.url}}{{/if}}{{else}}href="{{_link.url}}{{/if}}{{#if this.hasComments}}#commentList{{/if}}"
2
- class="sb-link ds-link js-load {{#if _isSelected}} {{defaultIfEmpty _selectedCssClass "-current"}}{{/if}}{{#if _css}} {{_css}}{{/if}} {{#> css}}{{/css}}"
2
+ class="sb-link ds-link js-load{{#if _link.isUserConsentNeeded}} js-user-consent-needed{{/if}} {{#if _isSelected}} {{defaultIfEmpty _selectedCssClass "-current"}}{{/if}}{{#if _css}} {{_css}}{{/if}} {{#> css}}{{/css}}"
3
3
  {{#if _link.isTargetBlank}} target="_blank" rel="noopener{{#if _link.hasNoReferrerFlag}} noreferrer{{/if}}"{{/if}}
4
4
  {{#if _isAriaHidden}} aria-hidden="true" tabindex="-1"{{/if}}
5
5
  {{#> htmlProperties}}{{/htmlProperties}}
@@ -31,7 +31,7 @@
31
31
  {{#with this.footerMetadata}}
32
32
  {{#with this.dataProtectionLink}}
33
33
  {{loca "cookies_setting_tracking_service_description_text"}}
34
- <a class="block mt-2 ds-link text-link hover:underline" target="_blank"
34
+ <a class="{{if (isUserConsentNeeded this.url) 'js-user-consent-needed ' ''}}block mt-2 ds-link text-link hover:underline" target="_blank"
35
35
  rel="noopener noreferrer" href="{{this.url}}"
36
36
  title="Mehr Informationen zum Thema Datenschutz">Mehr Informationen zum Thema Datenschutz
37
37
  {{#if this.isTargetBlank}}{{~> components/base/image/icon _icon="extern" _addClass="h-5 w-5 -mt-0.5 fill-current ml-1 inline-flex" _iconmap="icons"~}}{{/if}}
@@ -48,7 +48,7 @@
48
48
  <ul class="{{#if _webview}} hidden{{/if}}">
49
49
  <li class="px-6 py-3 flex justify-between items-center bg-white border-t border-[#e3e3e3] tracking_1">
50
50
  <span class="text-base text-black">AGF <a
51
- class="mt-3 -mb-1 ds-link text-link hover:underline" target="_blank" rel="noopener noreferrer"
51
+ class="{{if (isUserConsentNeeded 'https://www.agf.de/') 'js-user-consent-needed ' ''}}mt-3 -mb-1 ds-link text-link hover:underline" target="_blank" rel="noopener noreferrer"
52
52
  href="https://www.agf.de/" title="AGF">(https://www.agf.de/){{~> components/base/image/icon _icon="extern" _addClass="h-5 w-5 -mt-0.5 fill-current ml-1 inline-flex" _iconmap="icons"~}}</a></span>
53
53
  <div class="flex w-fit toggleSwitch">
54
54
  {{> components/forms/toggle_button _id="agf" _addClass="js-toggleSwitch-checkbox js-toggleSwitch-tracking" _isInitiallyHidden=false _screenReaderText="agf aktivieren/deaktivieren" }}
@@ -56,7 +56,7 @@
56
56
  </li>
57
57
  <li class="px-6 py-3 flex justify-between items-center bg-white border-t border-[#e3e3e3] tracking_2">
58
58
  <span class="text-base text-black">AT Internet <a
59
- class="mt-3 -mb-1 ds-link text-link hover:underline" target="_blank" rel="noopener noreferrer"
59
+ class="{{if (isUserConsentNeeded 'https://www.atinternet.com/de/') 'js-user-consent-needed ' ''}}mt-3 -mb-1 ds-link text-link hover:underline" target="_blank" rel="noopener noreferrer"
60
60
  href="https://www.atinternet.com/de/"
61
61
  title="AT Internet">(https://www.atinternet.com/de/){{~> components/base/image/icon _icon="extern" _addClass="h-5 w-5 -mt-0.5 fill-current ml-1 inline-flex" _iconmap="icons"~}}</a></span>
62
62
  <div class="flex w-fit toggleSwitch">
@@ -71,7 +71,7 @@
71
71
  {{#with this.footerMetadata}}
72
72
  {{#with this.dataProtectionLink}}
73
73
  {{loca "cookies_setting_description_text"}}
74
- <a class="block mt-2 ds-link text-link hover:underline" target="_blank"
74
+ <a class="{{if (isUserConsentNeeded this.url) 'js-user-consent-needed ' ''}}block mt-2 ds-link text-link hover:underline" target="_blank"
75
75
  rel="noopener noreferrer" href="{{this.url}}"
76
76
  title="Mehr Informationen zum Thema Datenschutz">Mehr Informationen zum Thema Datenschutz
77
77
  {{#if this.isTargetBlank}}{{~> components/base/image/icon _icon="extern" _addClass="h-5 w-5 -mt-0.5 fill-current ml-1 inline-flex" _iconmap="icons"~}}{{/if}}
@@ -1,3 +1,6 @@
1
1
  <div class="flex flex-col border-event-calendar-secondary border gap-x-4 js-load" data-hr-filterer-ds="{}">
2
2
  {{> @partial-block }}
3
+ {{#> components/modal/modal _type="userConsent" _trigger=".js-ticket-button-user-consent-needed"}}
4
+ {{> components/modal/user_consent _link=this.link _headline=(loca "ticket_modal_headline") _text=(loca "ticket_modal_text") _labelOk=(loca "ticket_modal_label_ok") _labelCancel=(loca "ticket_modal_label_cancel")}}
5
+ {{/components/modal/modal}}
3
6
  </div>
@@ -1,23 +1,15 @@
1
1
  <div class="static pt-1 pb-3 pl-4 sm:absolute sm:pl-0 sm:pt-0 sm:pb-0 sm:right-4 sm:bottom-4">
2
- {{#> components/button/button _id=(nextRandom) _size="lg"}}
3
- {{> components/button/components/button_icon _icon="ticket" _iconmap="icons" _css="mr-2"}}
4
- {{>components/button/components/button_label _label="Tickets"}}
5
- {{/components/button/button}}
6
- {{#> components/modal/modal _trigger=(getRandom)}}
7
- {{#> components/teaser/components/teaser_headline}}
8
- {{> components/teaser/components/teaser_title _text=(loca 'ticket_modal_headline') _css="text-2xl"}}
9
- {{/components/teaser/components/teaser_headline}}
10
- <p class="mt-2 text-base font-copy">{{loca "ticket_modal_text"}}</p>
2
+ {{#with this}}
3
+ {{#> components/button/button _css="js-ticket-button-user-consent-needed"_id=(nextRandom) _size="lg"}}
4
+ {{> components/button/components/button_icon _icon="ticket" _iconmap="icons" _css="mr-2"}}
5
+ {{>components/button/components/button_label _css='' _label="Tickets"}}
6
+ {{/components/button/button}}
7
+ {{#*inline "htmlProperties"~}}
8
+ data-user-consent-link='{"url":"{{this.link.url}}","isTargetBlank":{{this.link.isTargetBlank}} }'
9
+ data-user-consent-tracking-data="{{this.link.cmsDocument.trackingInformations.ticketLink}}"
10
+ {{~/inline}}
11
+ {{/with}}
11
12
 
12
- <div class="flex flex-wrap mt-4">
13
- {{#> components/button/button _size="lg" _variant="tertiary" _value="cancel" _css="mr-4 mt-4"}}
14
- {{>components/button/components/button_label _label="Abbrechen" _css=""}}
15
- {{/components/button/button}}
16
- {{#> components/button/link_button _link=this.link _size="lg" _css="js-ticket-ok-button js-modal-close mt-4"}}
17
- {{>components/button/components/button_label _label="Zum Ticketshop" _css=""}}
18
- {{/components/button/link_button}}
19
- </div>
20
- {{/components/modal/modal}}
21
13
  <noscript>
22
14
  <style>
23
15
  #{{getRandom}} {
@@ -5,7 +5,7 @@
5
5
  <ul class="flex flex-wrap gap-x-4 w-fit sm:w-full sm:pt-2 ">
6
6
  {{~#each this~}}
7
7
  <li class="w-fit sm:w-full text-primary dark:text-standard-text-dark">
8
- <a class="block hover:underline gap-x-1" href="{{this.url}}">
8
+ <a class="{{if (isUserConsentNeeded this.url) 'js-user-consent-needed ' ''}}block hover:underline gap-x-1" href="{{this.url}}">
9
9
  {{~> components/base/image/icon _icon="ortsmarke" _addClass="inline w-5 h-5 mr-2 fill-current"~}}
10
10
 
11
11
  {{~this.title~}}
@@ -8,7 +8,7 @@
8
8
  {{/with~}}
9
9
  {{/unless}}
10
10
  {{#with _teaser}}
11
- {{#if this.isTickerTeaser}}<a href="{{this.link.url}}" aria-label="Zum Ticker" tabindex="-1">{{/if}}
11
+ {{#if this.isTickerTeaser}}<a href="{{this.link.url}}" aria-label="Zum Ticker" tabindex="-1"{{#if (isUserConsentNeeded this.link.url)}} class="js-user-consent-needed"{{/if}}>{{/if}}
12
12
  {{~> components/base/image/responsive_image this.teaserImage _type=(if this.teaserType this.teaserType 'story') _variant=(if this.content.imageVariant this.content.imageVariant '100-copytext') _addClassImg=(appendToDefault _addClassImg-adjust_context "ar__content") _noDelay=this.dontLazyload ~}}
13
13
  {{#if this.isTickerTeaser}}</a>{{/if}}
14
14
  {{/with}}
@@ -0,0 +1,58 @@
1
+ import { hr$, listen, unlisten, addLink } from 'hrQuery'
2
+ import dialogPolyfill from 'dialog-polyfill'
3
+
4
+ const DefaultModal = function (options, rootElement) {
5
+ const dialogPolyfillBaseUrl = options.dialogPolyfillBaseUrl || 'vendor/dialog-polyfill',
6
+ modalTrigger = options.trigger || null,
7
+ triggerRoot = document.body,
8
+ modal = hr$('.js-modal', rootElement)[0],
9
+ closeButtonTrigger = ".js-modal-close"
10
+
11
+ const configureEventListeners = () => {
12
+ listen('click', handleClick, triggerRoot)
13
+ }
14
+
15
+ const handleClick = (event) => {
16
+ if (null !== modalTrigger) {
17
+ let triggerNode = event.target.closest(modalTrigger)
18
+ let nodeToCloseModal = event.target.closest(closeButtonTrigger)
19
+ if (null !== triggerNode) {
20
+ event.preventDefault()
21
+ show()
22
+ } else if (null !== nodeToCloseModal) {
23
+ close()
24
+ }
25
+ }
26
+ }
27
+
28
+ const configurePolyfillIfNeeded = () => {
29
+ if (undefined == modal.showModal) {
30
+ addLink('dialog-polyfill-css', `${dialogPolyfillBaseUrl}/dialog-polyfill.css`, {
31
+ type: 'text/css',
32
+ rel: 'stylesheet',
33
+ })
34
+ }
35
+ dialogPolyfill.registerDialog(modal)
36
+ }
37
+
38
+ const show = () => {
39
+ modal.showModal()
40
+ listen('click', closeFromOutside, modal)
41
+ }
42
+
43
+ const closeFromOutside = (event) => {
44
+ if (event.target === modal) {
45
+ unlisten('click', closeFromOutside, modal)
46
+ close()
47
+ }
48
+ }
49
+
50
+ const close = () => {
51
+ modal.close()
52
+ }
53
+
54
+ configurePolyfillIfNeeded()
55
+ configureEventListeners()
56
+ }
57
+
58
+ export default DefaultModal
@@ -1,60 +1,19 @@
1
- import { hr$, listen, unlisten, addLink } from 'hrQuery'
2
- import { uxAction } from 'base/tracking/pianoHelper.subfeature'
3
- import dialogPolyfill from 'dialog-polyfill'
1
+ import DefaultModal from 'components/modal/defaultModal.subfeature'
2
+ import UserConsentModal from 'components/modal/userConsentModal.subfeature'
4
3
 
5
4
  const Modal = (context) => {
6
5
  const { options } = context,
7
6
  { element: rootElement } = context,
8
- dialogPolyfillBaseUrl = options.dialogPolyfillBaseUrl || 'vendor/dialog-polyfill',
9
- modalTriggerId = options.modalTriggerId ? '#' + options.modalTriggerId : '',
10
- modalTrigger = hr$(modalTriggerId)[0],
11
- modalCloseTriggers = hr$('.js-modal-close', rootElement),
12
- modal = hr$('.js-modal', rootElement)[0],
13
- ticketShopButton = hr$('.js-ticket-ok-button', rootElement)[0],
14
- trackingInformations = options.trackingInformations
15
-
16
- const configureEventListeners = () => {
17
- listen('click', clickTracking, ticketShopButton)
18
- listen('click', show, modalTrigger)
19
-
20
- modalCloseTriggers.forEach((modalCloseTrigger) => {
21
- listen('click', close, modalCloseTrigger)
22
- })
23
- }
24
-
25
- const configurePolyfillIfNeeded = () => {
26
- if (undefined == modal.showModal) {
27
- addLink('dialog-polyfill-css', `${dialogPolyfillBaseUrl}/dialog-polyfill.css`, {
28
- type: 'text/css',
29
- rel: 'stylesheet',
30
- })
31
- }
32
- dialogPolyfill.registerDialog(modal)
7
+ type = options.type || "default"
8
+
9
+ switch (type) {
10
+ case "userConsent":
11
+ new UserConsentModal(options, rootElement)
12
+ break;
13
+ default:
14
+ new DefaultModal(options, rootElement)
15
+ break;
33
16
  }
34
-
35
- const clickTracking = () => {
36
- console.log('tracking')
37
- uxAction(trackingInformations)
38
- }
39
-
40
- const show = () => {
41
- modal.showModal()
42
- listen('click', closeFromOutside, modal)
43
- }
44
-
45
- const closeFromOutside = (event) => {
46
- if (event.target === modal) {
47
- unlisten('click', closeFromOutside, modal)
48
- close()
49
- }
50
- }
51
-
52
- const close = () => {
53
- modal.close()
54
- }
55
-
56
- configurePolyfillIfNeeded()
57
- configureEventListeners()
58
17
  }
59
18
 
60
19
  export default Modal
@@ -1,4 +1,4 @@
1
- <div class="js-load" data-hr-modal='{"modalTriggerId":"{{defaultIfEmpty _trigger ""}}", "trackingInformations": {{this.link.cmsDocument.trackingInformations.ticketLink}},"dialogPolyfillBaseUrl":"{{resourceUrl (configProperty 'dialogPolyfill.baseUrl')}}"}'>
1
+ <div class="js-load" data-hr-modal='{"trigger":"{{if _trigger _trigger ""}}", "type":"{{defaultIfEmpty _type 'default'}}", "dialogPolyfillBaseUrl":"{{resourceUrl (configProperty 'dialogPolyfill.baseUrl')}}"}'>
2
2
  <dialog class='js-modal p-0 backdrop:bg-gray-scorpion/90 shadow-md {{defaultIfEmpty _css "sm:max-w-xl"}}'>
3
3
  <form method="dialog" class="js-dialog-content p-4">
4
4
  {{> @partial-block }}
@@ -0,0 +1,104 @@
1
+ import { ArgsTable, Meta, Story, Canvas, Preview } from '@storybook/blocks'
2
+ import * as ModalStories from './modal.stories'
3
+
4
+ <Meta of={ModalStories} />
5
+
6
+
7
+ # Modal
8
+
9
+ - [Übersicht](#übersicht)
10
+ - [Eigenschaften](#eigenschaften)
11
+ - [Varianten](#varianten)
12
+ - [Verwendung](#verwendung)
13
+
14
+ ## Übersicht
15
+
16
+ Die Modal Komponente erlaubt es frei wählbare Inhalte in einem Modal anzuzeigen. Geöffnet werden kann ein Modal durch klicken auf einen
17
+ mit einer bestimmten CSS Klasse ausgezeichneten Link oder Button. Zur Anzeige des Modal wird das native [HTML Dialog Element](https://developer.mozilla.org/en-US/docs/Web/HTML/Element/dialog?retiredLocale=de) verwendet.
18
+ Standardmäßig kann dieses durch Drücken der `ESC` Taste geschlossen werden.
19
+ Damit auch ältere Browser, die das Dialog Element noch nicht unterstützen, das Modal anzeigen können, wird ein Polyfill eingebunden.
20
+
21
+ <Canvas>
22
+ <Story of={ModalStories.defaultModal} />
23
+ </Canvas>
24
+
25
+ ## Eigenschaften
26
+
27
+ <ArgsTable story="Default Modal" />
28
+
29
+ ## Varianten
30
+
31
+ Das Modal existiert derzeit in zwei Varianten. Die zu nutzende Variante wird beim Einbinden der Modal Komponente
32
+ über den Parameter `_variant` konfiguriert.
33
+
34
+ <Canvas>
35
+ <Story of={ModalStories.defaultModal} />
36
+ </Canvas>
37
+
38
+ und `userConsent`
39
+ <Canvas>
40
+ <Story of={ModalStories.userConsentModal} />
41
+ </Canvas>
42
+
43
+ ## Verwendung
44
+
45
+ Die Modal Komponente wird mit der Handlebar Komponente `components/modal/modal` eingebunden.
46
+ Die Komponente ist so konzipiert, dass sie im optimalen Fall nur einmal auf einer Seite eingebunden werden muss (am besten in der Nähe des Footers).
47
+ Jeder Link oder jeder Button auf einer Seite kann so konfiguriert werden, dass er das Modal öffnet. Mit welcher CSS Hook Klasse das Modal
48
+ geöffnet werden soll, wird bei der Einbindung der Komponente mit dem Parameter `_trigger` konfiguriert. Jeder Button oder jeder Link auf der Seite
49
+ in der die Komponente eingebunden ist und die im Modal konfigurierte CSS Hook Klasse besitzt, öffnet bei Klick das Modal.
50
+
51
+ Die Modal Komponente ist eine Block Komponente. Auf diese Weise ist es möglich ein Modal mit beliebigem Inhalt anzulegen.
52
+
53
+ ### Default
54
+
55
+ Die Einbindung eines Default Modals erfolgt wie anhand folgenden Beispiels zu sehen.
56
+
57
+ ```handlebars
58
+ {{#> components/modal/modal _variant="default" _trigger="js-modal"}}
59
+ {{#> components/teaser/components/teaser_headline}}
60
+ {{> components/teaser/components/teaser_title _text="Überschrift Default Modal" _css="text-2xl"}}
61
+ {{/components/teaser/components/teaser_headline}}
62
+ <p class="mt-2 text-base font-copy">Hier steht der Text des Modals. Dies ist nur ein Beispiel. Das modal Template stellt nur den Rahmen
63
+ des Modals zur Verfügung. In dem Modal kann dargestellt werden was man möchte.</p>
64
+ {{/components/modal/modal}}
65
+ ```
66
+
67
+ Innerhalb des Modals kann beliebiges Markup und/oder beliebige andere Komponenten angezeigt werden. Die hier konfigurierte Trigger Klasse
68
+ `js-modal` ist lediglich ein Beispiel. Sie sollte jedoch, um sich klar von normalen CSS-Klassen zu unterscheiden das Prefix `js-` tragen.
69
+ Ein mit der Variante `default` erzeugtes Modal besitzt nur die Grundfunktionalität eines Modals. Sie erlaubt das Modal durch Klick auf ein mit der
70
+ Trigger Klasse ausgezeichneten Link oder Button zu öffnen. Weiterhin kann das geöffnete Modal durch Drücken der `ESC` Taste, durch Klicken in den
71
+ ausgegrauten Bereich außerhalb des Modals oder durch Klicken auf einen Button, dessen `value` Parameter den Wert `cancel` trägt, geschlossen werden.
72
+ Da als Basis der Modal Komponente das native HTML Dialog Element genutzt wird, ist sie auch bereits standarmäßig weitgehend barrierfrei. Ein Focus Trap,
73
+ das heißt sofern ich das Modal nicht explizit schließe bleibe ich bei Drücken der `Tab` Taste ausschließlich innerhalb des Modals, steht standardmäßig zur
74
+ Verfügung.
75
+
76
+ ### User Consent
77
+ Dieses Variante wurde speziell für den Anwendungsfall einer Zweiklicklösung erstellt. Sie ermöglicht es, dass bei Klick auf einen Link
78
+ der Nutzer in einem Modal darauf hingewiesen wird, dass er nun das HR Internetangebot verlässt und er erst bei einer aktiven Bestätigung
79
+ mit Hilfe eines weiteren Klicks den eigentlichen Link aufrufen kann. Die Variante kann, wie im Folgenen gezeigt, eingebunden werden.
80
+
81
+
82
+ ```handlebars
83
+ {{#> components/modal/modal _variant="userConsent" _trigger="js-user-consent-needed"}}
84
+ {{> components/modal/user_consent _headline=(loca "modal_user_consent_headline") _text=(loca "modal_user_consent_text") _labelOk=(loca "modal_user_consent_label_ok") _labelCancel=(loca "modal_user_consent_label_cancel")}}
85
+ {{/components/modal/modal}}
86
+ ```
87
+
88
+ Für den Inhalt des Modals wurde eine eigene Komponente `components/modal/user_consent` erstellt. Sie erzeugt eine Überschrift, einen erläuternden Text sowie
89
+ einen Abbrechen- und einen Ok-Button. Die konkreten Texte können der Komponente entweder über die Parameter `_headline`, `_text`, `_labelOk` und `_labelCancel`
90
+ direkt beim Aufruf übergeben werden oder werden, wenn beim Aufruf keine Parameter übergeben werden, aus den Locatags `modal_user_consent_headline`, `modal_user_consent_text`,
91
+ `modal_user_consent_label_ok` und `modal_user_consent_label_cancel` gezogen.
92
+ Für die speziellen Funktionen dieser Variante wurde ein separates Javascript Subfeature erzeugt. Dies sorgt dafür, dass der Variante neben allen
93
+ Eigenschaften der `default` Variante, auch noch speziell für die Zweiklick Lösung benötigte Funktionalitäten zur Verfügung stehen.
94
+ Ist das das Modal aufrufende Element ein Link, werden aus diesem die Werte des `href`, des `target` und des `rel` Attributes ausgelesen und damit
95
+ der Link des `OK`-Buttons erzeugt. Ist das aufrufende Element ein Button (z.B. beim [Event-Ticket-Button](?path=/story/komponenten-teaser-eventkalender--teaser-100)),
96
+ müssen diese Information in dem `data-user-consent-link`-Attribut des Buttons als JSON in der Form
97
+ `{"url":"https://www.beispiel.de","isTargetBlank":true/false}` hinterlegt werden. Wird hier bei `isTargetBlank` der Wert `true` übergeben, erhält der
98
+ im Modal erzeugte Link des OK-Buttons automatisch das attribut `rel="noopener"` gesetzt.
99
+
100
+ ### Neue Varianten
101
+ Wird ein Modal mit einer komplett neuen Funktionalität benötigt, muss eine neue Variante erstellt und der Komponente hinzugefügt werden. Hierzu muss
102
+ ein Name für die neue Variante gewählt und die `switch`-Anweisung in `components/modal/modal.feature.js` um einen neuen Fall mit diesem
103
+ Namen erweitert werden. Die eigentliche Funktionalität muss in einem Javascript Subfeature umgesetzt werden.
104
+