@simple-reporting/base 1.0.37 → 1.0.38

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 (274) hide show
  1. package/dev/.ddev/config.yaml +1 -1
  2. package/dev/.idea/codeStyles/Project.xml +61 -0
  3. package/dev/.idea/codeStyles/codeStyleConfig.xml +5 -0
  4. package/dev/.idea/copilot.data.migration.ask2agent.xml +6 -0
  5. package/dev/.idea/deployment.xml +14 -0
  6. package/dev/.idea/inspectionProfiles/Project_Default.xml +6 -0
  7. package/dev/.idea/modules.xml +8 -0
  8. package/dev/.idea/nsfd_report-demo-mms.iml +8 -0
  9. package/dev/.idea/php.xml +19 -0
  10. package/dev/.idea/prettier.xml +6 -0
  11. package/dev/.idea/vcs.xml +6 -0
  12. package/dev/.idea/watcherTasks.xml +4 -0
  13. package/dev/livingdocs.config.json +1192 -27
  14. package/dev/package.json +3 -1
  15. package/dev/src/App.vue +1 -2
  16. package/dev/src/Autoload.ts +1 -1
  17. package/dev/src/Dialog.vue +12 -61
  18. package/dev/src/assets/fonts/FontAwesome/font.scss +2 -0
  19. package/dev/src/assets/fonts/Inter/inter.scss +2 -4
  20. package/dev/src/assets/images/accordion-minus.svg +4 -0
  21. package/dev/src/assets/images/accordion-plus.svg +4 -0
  22. package/dev/src/assets/images/arrow-left.svg +5 -0
  23. package/dev/src/assets/images/arrow-right.svg +5 -0
  24. package/dev/src/assets/images/arrow-up.svg +5 -0
  25. package/dev/src/assets/images/chevron-down.svg +1 -0
  26. package/dev/src/assets/images/chevron-left.svg +1 -0
  27. package/dev/src/assets/images/chevron-right.svg +1 -0
  28. package/dev/src/assets/images/chevron-up.svg +1 -0
  29. package/dev/src/assets/images/close.svg +5 -0
  30. package/dev/src/assets/images/download.svg +6 -0
  31. package/dev/src/assets/images/facebook.svg +1 -0
  32. package/dev/src/assets/images/instagram.svg +1 -0
  33. package/dev/src/assets/images/language.svg +1 -0
  34. package/dev/src/assets/images/linkedIn.svg +1 -0
  35. package/dev/src/assets/images/logo.svg +1 -0
  36. package/dev/src/assets/images/menu-light.svg +3 -0
  37. package/dev/src/assets/images/menu.svg +3 -0
  38. package/dev/src/assets/images/nav-arrow-left.svg +3 -0
  39. package/dev/src/assets/images/nav-arrow-right.svg +3 -0
  40. package/dev/src/assets/images/search.svg +5 -0
  41. package/dev/src/assets/images/twitter.svg +1 -0
  42. package/dev/src/assets/images/xing.svg +1 -0
  43. package/dev/src/assets/scss/app.scss +9 -0
  44. package/dev/src/assets/scss/components/button.scss +37 -0
  45. package/dev/src/assets/scss/components/dialog.scss +84 -0
  46. package/dev/src/assets/scss/components/fontawesome.scss +56 -0
  47. package/dev/src/assets/scss/components/note/accordion.scss +55 -41
  48. package/dev/src/assets/scss/editor.scss +5 -5
  49. package/dev/src/assets/scss/general.scss +29 -2
  50. package/dev/src/assets/scss/margins.scss +57 -0
  51. package/dev/src/assets/scss/pdf.scss +0 -32
  52. package/dev/src/assets/scss/placeholders/breakout-grid.scss +34 -0
  53. package/dev/src/assets/scss/placeholders/button.scss +230 -0
  54. package/dev/src/assets/scss/placeholders/fontawesome.scss +7 -0
  55. package/dev/src/assets/scss/placeholders/grid.scss +354 -0
  56. package/dev/src/assets/scss/web.scss +17 -21
  57. package/dev/src/assets/scss/xbrl.scss +1 -0
  58. package/dev/src/components/Button/Default/Action.vue +65 -0
  59. package/dev/src/components/Button/Default/Content.vue +225 -0
  60. package/dev/src/components/Button/Default/ExternalLink.vue +63 -0
  61. package/dev/src/components/Button/Default/InternalLink.vue +64 -0
  62. package/dev/src/components/Button/Default.vue +101 -0
  63. package/dev/src/components/Page/MainNavigation.vue +96 -6
  64. package/dev/src/components/Page/MetaNavigation.vue +116 -0
  65. package/dev/src/components/Page/PrevNext.vue +140 -70
  66. package/dev/src/components/PageFooter.vue +405 -0
  67. package/dev/src/components/PageHeader.vue +828 -0
  68. package/dev/src/components/{Page/Main.vue → PageMain.vue} +11 -0
  69. package/dev/src/composables/globalLinks.ts +46 -0
  70. package/dev/src/composables/isDesktopView.ts +18 -0
  71. package/dev/src/composables/mainNavigation.ts +11 -0
  72. package/dev/src/entries/pdf.ts +5 -5
  73. package/dev/src/i18n/index.ts +1 -1
  74. package/dev/src/locales/de.json +40 -0
  75. package/dev/src/locales/en.json +40 -0
  76. package/dev/src/router/index.ts +1 -2
  77. package/dev/src/views/DevView.vue +1 -835
  78. package/dev/src/views/PageNotFound.vue +3 -69
  79. package/dev/srl.config.json +34 -49
  80. package/livingdocs/010.Titles/010.title-h1/scss/_spacing-variations.scss +17 -0
  81. package/livingdocs/010.Titles/010.title-h1/scss/general.scss +4 -0
  82. package/livingdocs/010.Titles/020.title-h2/scss/_spacing-variations.scss +12 -0
  83. package/livingdocs/010.Titles/020.title-h2/scss/general.scss +4 -0
  84. package/livingdocs/010.Titles/020.title-h2/title-h2.html +2 -1
  85. package/livingdocs/010.Titles/030.title-h3/scss/_spacing-variations.scss +13 -0
  86. package/livingdocs/010.Titles/030.title-h3/scss/general.scss +5 -1
  87. package/livingdocs/010.Titles/030.title-h3/title-h3.html +2 -1
  88. package/livingdocs/010.Titles/040.title-h4/scss/_spacing-variations.scss +12 -0
  89. package/livingdocs/010.Titles/040.title-h4/scss/general.scss +5 -1
  90. package/livingdocs/010.Titles/040.title-h4/title-h4.html +2 -1
  91. package/livingdocs/010.Titles/050.title-h5/scss/_spacing-variations.scss +11 -0
  92. package/livingdocs/010.Titles/050.title-h5/scss/general.scss +4 -0
  93. package/livingdocs/010.Titles/060.title-h6/scss/_spacing-variations.scss +10 -0
  94. package/livingdocs/010.Titles/060.title-h6/scss/general.scss +4 -0
  95. package/livingdocs/020.Text/010.lead/scss/_spacing-variations.scss +5 -0
  96. package/livingdocs/020.Text/010.lead/scss/general.scss +4 -0
  97. package/livingdocs/020.Text/020.paragraph/scss/_spacing-variations.scss +22 -0
  98. package/livingdocs/020.Text/020.paragraph/scss/general.scss +4 -0
  99. package/livingdocs/020.Text/060.quote-with-portrait/scss/_spacing-variations.scss +7 -0
  100. package/livingdocs/020.Text/060.quote-with-portrait/scss/general.scss +4 -1
  101. package/livingdocs/020.Text/060.quote-with-portrait/scss/pdf.scss +4 -10
  102. package/livingdocs/020.Text/060.quote-with-portrait/scss/web.scss +0 -1
  103. package/livingdocs/020.Text/070.footnote-container/scss/_spacing-variations.scss +22 -0
  104. package/livingdocs/020.Text/070.footnote-container/scss/general.scss +8 -0
  105. package/livingdocs/020.Text/070.footnote-container/scss/pdf.scss +0 -8
  106. package/livingdocs/020.Text/070.footnote-container/scss/web.scss +0 -5
  107. package/livingdocs/020.Text/070.footnote-container/scss/xbrl.scss +9 -1
  108. package/livingdocs/020.Text/080.footnote-item/scss/_spacing-variations.scss +4 -0
  109. package/livingdocs/020.Text/080.footnote-item/scss/general.scss +28 -1
  110. package/livingdocs/020.Text/080.footnote-item/scss/web.scss +0 -20
  111. package/livingdocs/020.Text/080.footnote-item/scss/xbrl.scss +26 -1
  112. package/livingdocs/030.Lists/010.unordered-list/ld-conf.json +3 -3
  113. package/livingdocs/030.Lists/010.unordered-list/scss/_spacing-variations.scss +22 -0
  114. package/livingdocs/030.Lists/010.unordered-list/scss/general.scss +3 -5
  115. package/livingdocs/030.Lists/010.unordered-list/scss/pdf.scss +3 -1
  116. package/livingdocs/030.Lists/010.unordered-list/scss/web.scss +15 -1
  117. package/livingdocs/030.Lists/010.unordered-list/scss/word.scss +1 -6
  118. package/livingdocs/030.Lists/010.unordered-list/scss/xbrl.scss +2 -1
  119. package/livingdocs/030.Lists/020.ordered-list/ld-conf.json +3 -3
  120. package/livingdocs/030.Lists/030.alphanumeric-list/ld-conf.json +3 -3
  121. package/livingdocs/030.Lists/040.list-item-unordered-list/ld-conf.json +23 -0
  122. package/livingdocs/030.Lists/040.list-item-unordered-list/list-item-unordered-list.html +8 -0
  123. package/livingdocs/030.Lists/040.list-item-unordered-list/scss/_spacing-variations.scss +4 -0
  124. package/livingdocs/030.Lists/040.list-item-unordered-list/scss/general.scss +14 -0
  125. package/livingdocs/030.Lists/{040.list-item → 040.list-item-unordered-list}/scss/pdf.scss +7 -1
  126. package/livingdocs/030.Lists/{040.list-item/scss/general.scss → 040.list-item-unordered-list/scss/web.scss} +17 -6
  127. package/livingdocs/030.Lists/040.list-item-unordered-list/scss/word.scss +5 -0
  128. package/livingdocs/030.Lists/040.list-item-unordered-list/scss/xbrl.scss +2 -0
  129. package/livingdocs/030.Lists/050.list-item-ordered-list/ld-conf.json +23 -0
  130. package/livingdocs/030.Lists/050.list-item-ordered-list/list-item-ordered-list.html +8 -0
  131. package/livingdocs/030.Lists/060.list-item-alphanumeric-list/ld-conf.json +23 -0
  132. package/livingdocs/030.Lists/060.list-item-alphanumeric-list/list-item-alphanumeric-list.html +8 -0
  133. package/livingdocs/040.Media/010.table/scss/_spacing-variations.scss +19 -0
  134. package/livingdocs/040.Media/010.table/scss/general.scss +270 -251
  135. package/livingdocs/040.Media/010.table/scss/pdf.scss +2 -18
  136. package/livingdocs/040.Media/010.table/scss/web.scss +0 -19
  137. package/livingdocs/040.Media/010.table/scss/xbrl.scss +4 -3
  138. package/livingdocs/040.Media/020.image/scss/_spacing-variations.scss +7 -0
  139. package/livingdocs/040.Media/020.image/scss/editor.scss +0 -1
  140. package/livingdocs/040.Media/020.image/scss/general.scss +6 -2
  141. package/livingdocs/040.Media/020.image/scss/pdf.scss +0 -4
  142. package/livingdocs/040.Media/020.image/scss/web.scss +0 -5
  143. package/livingdocs/040.Media/020.image/scss/xbrl.scss +1 -3
  144. package/livingdocs/040.Media/030.video/scss/_spacing-variations.scss +7 -0
  145. package/livingdocs/040.Media/030.video/scss/general.scss +19 -0
  146. package/livingdocs/040.Media/030.video/scss/pdf.scss +0 -10
  147. package/livingdocs/040.Media/030.video/scss/web.scss +0 -11
  148. package/livingdocs/040.Media/030.video/scss/xbrl.scss +1 -4
  149. package/livingdocs/060.Buttons/020.button/scss/general.scss +14 -75
  150. package/livingdocs/070.Container/020.columns-container/columns-container.html +1 -1
  151. package/livingdocs/070.Container/030.background-container/background-container.html +3 -0
  152. package/livingdocs/070.Container/030.background-container/ld-conf.json +4 -0
  153. package/livingdocs/070.Container/030.background-container/properties.json +1 -0
  154. package/livingdocs/070.Container/030.background-container/scss/_spacing-variations.scss +3 -0
  155. package/livingdocs/070.Container/030.background-container/scss/general.scss +9 -0
  156. package/livingdocs/070.Container/030.background-container/scss/pdf.scss +13 -0
  157. package/livingdocs/070.Container/030.background-container/scss/web.scss +1 -0
  158. package/livingdocs/070.Container/030.background-container/scss/word.scss +1 -0
  159. package/livingdocs/070.Container/030.background-container/scss/xbrl.scss +3 -0
  160. package/livingdocs/080.CV/010.cv/cv.html +2 -1
  161. package/livingdocs/080.CV/010.cv/scss/_spacing-variations.scss +5 -0
  162. package/livingdocs/080.CV/010.cv/scss/app.scss +16 -1
  163. package/livingdocs/080.CV/010.cv/scss/general.scss +4 -0
  164. package/livingdocs/080.CV/010.cv/scss/pdf.scss +2 -3
  165. package/livingdocs/080.CV/010.cv/scss/web.scss +17 -1
  166. package/livingdocs/080.CV/020.cv-time-span/scss/_spacing-variations.scss +14 -0
  167. package/livingdocs/080.CV/020.cv-time-span/scss/general.scss +4 -0
  168. package/livingdocs/080.CV/020.cv-time-span/scss/web.scss +0 -1
  169. package/livingdocs/100.Misc/010.anchor/scss/editor.scss +0 -1
  170. package/livingdocs/100.Misc/020.accordion/accordion.html +54 -7
  171. package/livingdocs/100.Misc/020.accordion/accordion.vue +83 -0
  172. package/livingdocs/100.Misc/020.accordion/scss/editor.scss +12 -0
  173. package/livingdocs/110.PDF/010.pdf-pagebreak/scss/editor.scss +0 -1
  174. package/livingdocs/110.PDF/021.pdf-columnbreak/scss/editor.scss +0 -1
  175. package/livingdocs/110.PDF/030.pdf-publication-title/scss/editor.scss +0 -1
  176. package/livingdocs/110.PDF/040.pdf-chapter-title/scss/editor.scss +0 -1
  177. package/livingdocs/110.PDF/050.pdf-chapter-navigation-container/scss/editor.scss +1 -1
  178. package/livingdocs/110.PDF/075.pdf-landscape-container/ld-conf.json +7 -0
  179. package/livingdocs/110.PDF/075.pdf-landscape-container/pdf-landscape-container.html +9 -0
  180. package/livingdocs/110.PDF/075.pdf-landscape-container/properties.json +15 -0
  181. package/livingdocs/110.PDF/075.pdf-landscape-container/scss/pdf.scss +19 -0
  182. package/livingdocs/110.PDF/100.pdf-toc-item/pdf-toc-item.html +3 -2
  183. package/livingdocs/110.PDF/100.pdf-toc-item/scss/general.scss +6 -5
  184. package/livingdocs/110.PDF/100.pdf-toc-item/scss/pdf.scss +9 -1
  185. package/livingdocs/130.Hosting_Components/010.download-center/download-center.html +7 -0
  186. package/livingdocs/130.Hosting_Components/010.download-center/download-center.vue +68 -0
  187. package/livingdocs/130.Hosting_Components/010.download-center/ld-conf.json +4 -0
  188. package/livingdocs/130.Hosting_Components/010.download-center/properties.json +1 -0
  189. package/livingdocs/130.Hosting_Components/010.download-center/scss/_spacing-variations.scss +3 -0
  190. package/livingdocs/130.Hosting_Components/010.download-center/scss/editor.scss +15 -0
  191. package/livingdocs/130.Hosting_Components/010.download-center/scss/general.scss +1 -0
  192. package/livingdocs/130.Hosting_Components/010.download-center/scss/pdf.scss +1 -0
  193. package/livingdocs/130.Hosting_Components/010.download-center/scss/web.scss +42 -0
  194. package/livingdocs/130.Hosting_Components/020.search/ld-conf.json +4 -0
  195. package/livingdocs/130.Hosting_Components/020.search/properties.json +1 -0
  196. package/livingdocs/130.Hosting_Components/020.search/scss/_spacing-variations.scss +4 -0
  197. package/livingdocs/130.Hosting_Components/020.search/scss/editor.scss +14 -0
  198. package/livingdocs/130.Hosting_Components/020.search/scss/general.scss +1 -0
  199. package/livingdocs/130.Hosting_Components/020.search/scss/pdf.scss +1 -0
  200. package/livingdocs/130.Hosting_Components/020.search/scss/web.scss +200 -0
  201. package/livingdocs/130.Hosting_Components/020.search/search.html +7 -0
  202. package/livingdocs/130.Hosting_Components/020.search/search.vue +484 -0
  203. package/livingdocs/999.Properties/breakout-grid/web.scss +5 -0
  204. package/livingdocs/999.Properties/grid/scss/app.scss +1 -0
  205. package/livingdocs/999.Properties/grid/scss/general.scss +31 -0
  206. package/livingdocs/999.Properties/grid/scss/pdf.scss +9 -0
  207. package/livingdocs/999.Properties/grid/scss/web.scss +1 -0
  208. package/livingdocs/999.Properties/grid/scss/xbrl.scss +2 -0
  209. package/livingdocs/999.Properties/icon/properties.json +2 -2
  210. package/package.json +1 -1
  211. package/plugins/viteSrlPlugin.js +16 -1
  212. package/scripts/build.js +1 -0
  213. package/scripts/config.js +6 -2
  214. package/scss/button.scss +25 -0
  215. package/scss/fa/font-free.scss +17 -0
  216. package/scss/fa/font-pro.scss +41 -0
  217. package/scss/fa/index.scss +118 -0
  218. package/scss/fa/source-free.scss +14 -0
  219. package/scss/fa/source-pro.scss +15 -0
  220. package/scss/index.scss +1 -0
  221. package/srl/.srl/components/Srl/Aria/TabChain.vue +6 -5
  222. package/srl/.srl/components/Srl/Article/Accordion.vue +37 -24
  223. package/srl/.srl/components/Srl/Article/Dialog/Button.vue +6 -5
  224. package/srl/.srl/components/Srl/Article/Root.vue +4 -1
  225. package/srl/.srl/components/Srl/Category/Accordion/Content.vue +2 -2
  226. package/srl/.srl/components/Srl/Category/Accordion.vue +8 -5
  227. package/srl/.srl/components/Srl/Menu/Item.vue +20 -5
  228. package/srl/.srl/components/Srl/Page/Dialog.vue +31 -14
  229. package/srl/.srl/types/nswow.d.ts +6 -1
  230. package/srl/.srl/utils/index.ts +2 -0
  231. package/srl/.srl/utils/pageState.ts +24 -23
  232. package/srl/srl/button.scss +2 -0
  233. package/srl/srl/fa/font-free.scss +17 -0
  234. package/srl/srl/fa/font-pro.scss +41 -0
  235. package/srl/srl/fa/index.scss +118 -0
  236. package/srl/srl/fa/source-free.scss +14 -0
  237. package/srl/srl/fa/source-pro.scss +15 -0
  238. package/dev/src/assets/fonts/Inter/Inter-Regular.ttf +0 -0
  239. package/dev/src/assets/fonts/Inter/Inter-SemiBold.ttf +0 -0
  240. package/dev/src/assets/fonts/Roboto/roboto-v30-latin-300.woff2 +0 -0
  241. package/dev/src/assets/fonts/Roboto/roboto-v30-latin-700.woff2 +0 -0
  242. package/dev/src/assets/fonts/Roboto/roboto-v30-latin-italic.woff2 +0 -0
  243. package/dev/src/assets/fonts/Roboto/roboto-v30-latin-regular.woff2 +0 -0
  244. package/dev/src/assets/images/mms-logo-white.svg +0 -105
  245. package/dev/src/assets/scss/components/icons.scss +0 -287
  246. package/dev/src/assets/scss/components/round-button.scss +0 -75
  247. package/dev/src/assets/scss/placeholders.scss +0 -588
  248. package/dev/src/components/Page/Footer.vue +0 -45
  249. package/dev/src/components/Page/Header.vue +0 -40
  250. package/dev/src/views/HomeView.vue +0 -5
  251. package/livingdocs/030.Lists/020.ordered-list/scss/general.scss +0 -6
  252. package/livingdocs/030.Lists/020.ordered-list/scss/pdf.scss +0 -5
  253. package/livingdocs/030.Lists/020.ordered-list/scss/word.scss +0 -9
  254. package/livingdocs/030.Lists/020.ordered-list/scss/xbrl.scss +0 -1
  255. package/livingdocs/030.Lists/030.alphanumeric-list/scss/general.scss +0 -6
  256. package/livingdocs/030.Lists/030.alphanumeric-list/scss/pdf.scss +0 -5
  257. package/livingdocs/030.Lists/030.alphanumeric-list/scss/word.scss +0 -9
  258. package/livingdocs/030.Lists/030.alphanumeric-list/scss/xbrl.scss +0 -1
  259. package/livingdocs/030.Lists/040.list-item/ld-conf.json +0 -5
  260. package/livingdocs/030.Lists/040.list-item/list-item.html +0 -5
  261. package/livingdocs/030.Lists/040.list-item/scss/web.scss +0 -27
  262. package/livingdocs/030.Lists/040.list-item/scss/word.scss +0 -19
  263. package/livingdocs/030.Lists/040.list-item/scss/xbrl.scss +0 -1
  264. /package/livingdocs/030.Lists/{020.ordered-list → 040.list-item-unordered-list}/scss/app.scss +0 -0
  265. /package/livingdocs/030.Lists/{020.ordered-list → 040.list-item-unordered-list}/scss/editor.scss +0 -0
  266. /package/livingdocs/{030.Lists/030.alphanumeric-list → 070.Container/030.background-container}/scss/app.scss +0 -0
  267. /package/livingdocs/{030.Lists/030.alphanumeric-list → 070.Container/030.background-container}/scss/editor.scss +0 -0
  268. /package/livingdocs/{030.Lists/040.list-item → 130.Hosting_Components/010.download-center}/scss/app.scss +0 -0
  269. /package/{dev/livingdocs/.gitkeep → livingdocs/130.Hosting_Components/010.download-center/scss/word.scss} +0 -0
  270. /package/livingdocs/{030.Lists/020.ordered-list/scss/web.scss → 130.Hosting_Components/010.download-center/scss/xbrl.scss} +0 -0
  271. /package/livingdocs/{030.Lists/040.list-item/scss/editor.scss → 130.Hosting_Components/020.search/scss/app.scss} +0 -0
  272. /package/livingdocs/{030.Lists/030.alphanumeric-list/scss/web.scss → 130.Hosting_Components/020.search/scss/word.scss} +0 -0
  273. /package/livingdocs/{060.Buttons/.gitkeep → 130.Hosting_Components/020.search/scss/xbrl.scss} +0 -0
  274. /package/livingdocs/999.Properties/{width → grid}/properties.json +0 -0
@@ -1,5 +1,5 @@
1
1
  <script lang="ts" setup>
2
- import { ref, computed } from 'vue'
2
+ import { ref, computed, onMounted, onUnmounted } from 'vue'
3
3
  import { useRoute } from 'vue-router'
4
4
  import { isRouterPath } from '#utils'
5
5
 
@@ -21,10 +21,46 @@ const scrollY = ref(window.scrollY)
21
21
  window.addEventListener('scroll', () => {
22
22
  scrollY.value = window.scrollY
23
23
  })
24
+
25
+ const headerThreshold = ref<number>(500)
26
+
27
+ function readHeaderHeight() {
28
+ const raw = getComputedStyle(document.documentElement).getPropertyValue('--srl-header-height')?.trim()
29
+ if (!raw) {
30
+ headerThreshold.value = 500
31
+ return
32
+ }
33
+
34
+ // parse numeric part
35
+ let value = parseFloat(raw)
36
+ if (isNaN(value)) {
37
+ headerThreshold.value = 500
38
+ return
39
+ }
40
+
41
+ // handle rem unit (e.g. "2rem")
42
+ if (raw.endsWith('rem')) {
43
+ const rootFs = parseFloat(getComputedStyle(document.documentElement).fontSize) || 16
44
+ value = value * rootFs
45
+ }
46
+
47
+ headerThreshold.value = Math.round(value)
48
+ }
49
+
50
+ onMounted(() => {
51
+ readHeaderHeight()
52
+ window.addEventListener('resize', readHeaderHeight)
53
+ })
54
+
55
+ onUnmounted(() => {
56
+ window.removeEventListener('resize', readHeaderHeight)
57
+ })
58
+ // --- END NEW ---
59
+
24
60
  function prevNextHelper(item: NsWowNavigationItem, label: string = '', depth: number = 0) {
25
61
  if (item.href && isRouterPath(item.href)) {
26
62
  const url = item.href
27
- const title = label.length > 0 ? `${label}\n${item.label}` : item.label
63
+ const title = label.length > 0 ? `${item.label}` : item.label
28
64
  prevNextNavigation.value.push({ title, url })
29
65
  }
30
66
 
@@ -66,34 +102,60 @@ const nextItem = computed(() => {
66
102
  })
67
103
 
68
104
  function toTop() {
69
- window.scrollTo(0, 0)
70
- document.querySelector('#srl-page-main')?.focus()
105
+ window.scrollTo({ top: 0, behavior: 'smooth' })
106
+
107
+ const checkScroll = () => {
108
+ if (window.scrollY === 0) {
109
+ const main = document.querySelector('#srl-page-main') as HTMLElement;
110
+ main?.focus()
111
+ } else {
112
+ requestAnimationFrame(checkScroll)
113
+ }
114
+ }
115
+
116
+ requestAnimationFrame(checkScroll)
71
117
  }
72
118
  </script>
73
119
  <template>
74
120
  <div>
75
121
  <slot />
76
- <div class="srl-prev-next">
77
- <div class="srl-prev-next__wrap">
78
- <button class="srl-to-top" :hidden="scrollY < 500" type="button" @click="toTop">
79
- <img src="@/assets/images/toTop.svg" :alt="$t('toTop')" :title="$t('toTop')" />
80
- </button>
81
- <router-link
82
- v-if="prevItem"
83
- class="srl-page-prev"
84
- :to="prevItem.url"
85
- :title="prevItem.title"
86
- >
87
- <img src="@/assets/images/prev.svg" :alt="$t('pagePrev')" />
88
- </router-link>
89
- <router-link
90
- v-if="nextItem"
91
- class="srl-page-next"
92
- :to="nextItem.url"
93
- :title="nextItem.title"
94
- >
95
- <img src="@/assets/images/next.svg" :alt="$t('pageNext')" />
96
- </router-link>
122
+ <div class="srl-grid srl-wide-width srl-to-top">
123
+ <div class="srl-grid__inner srl-to-top__inner">
124
+ <ButtonDefault class="srl-to-top__button" :hidden="scrollY < 500" :label="$t('toTop')" icon="arrow-up" :callback="toTop" />
125
+ </div>
126
+ </div>
127
+ <div class="srl-grid srl-wide-width srl-prev-next">
128
+ <div class="srl-grid__inner srl-prev-next__inner">
129
+ <div class="srl-prev-next__prev">
130
+ <router-link
131
+ v-if="prevItem"
132
+ class="srl-page-prev__link"
133
+ :to="prevItem.url"
134
+ :title="prevItem.title"
135
+ >
136
+ <div class="srl-page-prev__icon srl-page-prev__icon--prev srl-button srl-button--icon">
137
+ <i class="srl-icon-arrow-left" />
138
+ </div>
139
+ <div class="srl-page-prev__text">
140
+ <span class="srl-page-prev__title" v-text="prevItem.title" />
141
+ </div>
142
+ </router-link>
143
+ </div>
144
+ <div class="srl-prev-next__next">
145
+ <router-link
146
+ v-if="nextItem"
147
+ class="srl-page-prev__link"
148
+ :to="nextItem.url"
149
+ :title="nextItem.title"
150
+ >
151
+ <div class="srl-page-prev__text">
152
+ <span class="srl-page-prev__title" v-text="nextItem.title" />
153
+ </div>
154
+ <div class="srl-page-prev__icon srl-page-prev__icon--prev srl-button srl-button--icon">
155
+ <i class="srl-icon-arrow-right" />
156
+ </div>
157
+ </router-link>
158
+ </div>
97
159
  </div>
98
160
  </div>
99
161
  </div>
@@ -102,67 +164,75 @@ function toTop() {
102
164
  <style lang="scss">
103
165
  @use 'srl';
104
166
 
105
- body:has(.srl-to-top) {
106
- .srl-article-root {
107
- padding-block-end: srl.system-size-unit(60) !important;
108
- }
167
+ .srl-prev-next {
168
+ @include srl.spacer-margin-top(400);
109
169
  }
110
170
 
111
- .srl-prev-next {
112
- pointer-events: none;
113
- position: sticky;
114
- bottom: 0;
115
- z-index: 800;
116
- max-width: calc(var(--srl-container-max-width) + var(--srl-container-padding) * 2);
117
- padding-inline: var(--srl-container-padding);
118
- margin-inline: auto;
119
- padding-block-end: var(--srl-spacer-medium);
120
- height: calc(var(--srl-spacer-L) + srl.system-size-unit(44));
121
-
122
- &__wrap {
123
- display: flex;
124
- position: relative;
125
- justify-content: space-between;
126
- width: 100%;
127
- }
171
+ .srl-prev-next__inner {
172
+ display: grid;
173
+ grid-template-columns: subgrid;
128
174
  }
129
175
 
130
176
  .srl-to-top {
131
- pointer-events: auto;
132
- width: srl.system-size-unit(44);
133
- height: srl.system-size-unit(44);
134
- position: absolute;
135
- top: srl.system-size-unit(-52);
136
- right: 0;
137
- margin: 0;
138
- padding: 0;
139
- border: 0;
140
- cursor: pointer;
141
- transition: all ease-out 0.3s;
142
- opacity: 1;
177
+ position: sticky;
178
+ bottom: var(--srl-spacer-400);
179
+ margin-top: var(--srl-spacer-1600);
180
+ margin-bottom: var(--srl-spacer-400);
181
+ display: flex;
182
+ justify-content: flex-end;
183
+ z-index: 3;
184
+ pointer-events: none;
185
+ @include srl.grid-col(4);
186
+ @include srl.grid-col(4, phone-ls);
187
+ @include srl.grid-col(8, tablet-pt);
188
+ @include srl.grid-col(8, tablet-ls);
189
+ @include srl.grid-col(12, desktop);
190
+ @include srl.grid-col(12, desktop-large);
191
+ }
143
192
 
193
+ .srl-to-top__button {
194
+ pointer-events: all;
144
195
  &:not([hidden]) {
145
- display: block;
196
+ display: flex;
146
197
  }
147
198
 
148
199
  &[hidden] {
149
200
  pointer-events: none;
150
201
  opacity: 0;
151
202
  }
203
+ }
152
204
 
153
- img {
154
- display: block;
155
- }
205
+ .srl-prev-next__prev,
206
+ .srl-prev-next__next {
207
+ @include srl.grid-col(4);
156
208
  }
157
209
 
158
- .srl-page-prev,
159
- .srl-page-next {
160
- pointer-events: auto;
161
- width: srl.system-size-unit(44);
162
- height: srl.system-size-unit(44);
163
- display: block;
164
- img {
165
- display: block;
210
+ .srl-prev-next__next {
211
+ @include srl.grid-offset(8, tablet-ls);
212
+ @include srl.grid-offset(8, desktop);
213
+ @include srl.grid-offset(8, desktop-large);
214
+ }
215
+
216
+ .srl-page-prev__link {
217
+ @extend %srl-button__switch;
218
+ display: flex;
219
+ align-items: center;
220
+ justify-content: space-between;
221
+ @include srl.spacer-gap(200);
222
+ @include srl.typography-paragraph();
223
+ text-decoration: none;
224
+ color: srl.colors-black-1000();
225
+ transition: color 0.3s ease;
226
+ @include srl.spacer-padding-top(400);
227
+ @include srl.spacer-padding-bottom(400);
228
+ border-top: 1px solid srl.colors-grey-200();
229
+
230
+ @media (prefers-reduced-motion: reduce) {
231
+ transition-duration: 0s;
166
232
  }
167
233
  }
234
+
235
+ .srl-page-prev__text {
236
+ width: calc(100% - srl.system-size-unit(48) - srl.spacer-get(200));
237
+ }
168
238
  </style>
@@ -0,0 +1,405 @@
1
+ <script lang="ts" setup>
2
+ import { computed, ref } from 'vue'
3
+ import { useI18n } from 'vue-i18n'
4
+ import { useMenu } from '#composables'
5
+ import SvgLogo from '@/assets/images/logo.svg?component'
6
+
7
+ const { t, te, tm } = useI18n()
8
+
9
+ type Contact = {
10
+ label: string
11
+ key: string
12
+ title?: string
13
+ href?: string
14
+ linkText?: string
15
+ attributes?: {
16
+ [key: string]: string
17
+ }
18
+ }
19
+
20
+ type SocialLink = {
21
+ label: string
22
+ href: string
23
+ svg: any
24
+ }
25
+
26
+ const contact = computed<Contact[]>(() => {
27
+ const c: Contact[] = []
28
+
29
+ te('address.company')
30
+ ? c.push({
31
+ label: t('address.company'),
32
+ key: 'company',
33
+ attributes: {
34
+ class: 'srl-bold'
35
+ }
36
+ })
37
+ : null
38
+
39
+ te('address.location') ? c.push({ label: t('address.location'), key: 'location' }) : null
40
+
41
+ te('address.location2') ? c.push({ label: t('address.location2'), key: 'location2' }) : null
42
+
43
+ te('address.city') ? c.push({ label: t('address.city'), key: 'city' }) : null
44
+
45
+ te('address.country') ? c.push({ label: t('address.country'), key: 'country' }) : null
46
+
47
+ if (te('address.phone')) {
48
+ c.push({
49
+ label: te('footer.phone') ? t('footer.phone') : '',
50
+ key: 'phone',
51
+ title: te('accessibility.callNumber') ? t('accessibility.callNumber') : t('address.phone'),
52
+ linkText: t('address.phone'),
53
+ href: `tel:${t('address.phone')}`
54
+ })
55
+ }
56
+
57
+ if (te('address.fax')) {
58
+ c.push({
59
+ label: te('footer.fax') ? t('footer.fax') : '',
60
+ key: 'fax',
61
+ title: te('accessibility.callFax') ? t('accessibility.callFax') : t('address.fax'),
62
+ linkText: t('address.fax'),
63
+ href: `fax:${t('address.fax')}`
64
+ })
65
+ }
66
+
67
+ if (te('address.email')) {
68
+ c.push({
69
+ label: te('footer.email') ? t('footer.email') : '',
70
+ key: 'email',
71
+ title: te('accessibility.sendEmail') ? t('accessibility.sendEmail') : t('address.email'),
72
+ linkText: t('address.email', { interpolation: { escapeValue: false } }),
73
+ href: `mailto:${t('address.email', { interpolation: { escapeValue: false } })}`
74
+ })
75
+ }
76
+ return c
77
+ })
78
+
79
+ const socialLinks = computed<NsWowNavigationItem[]>(() => {
80
+ const links = []
81
+
82
+ if (
83
+ te('socialMedia.linkedIn') ||
84
+ te('socialMedia.xing') ||
85
+ te('socialMedia.twitter') ||
86
+ te('socialMedia.facebook') ||
87
+ te('socialMedia.instagram')
88
+ ) {
89
+ const socialMedia = tm('socialMedia') as Record<string, string>
90
+
91
+ Object.entries(socialMedia).forEach(([key, value]) => {
92
+ if (key === 'linkedIn') {
93
+ links.push({
94
+ label: 'LinkedIn',
95
+ href: value,
96
+ icon: 'linkedin-in',
97
+ attributes: {
98
+ 'aria-label': 'LinkedIn',
99
+ title: 'LinkedIn',
100
+ class: 'srl-button srl-button--icon srl-button--transparent-white'
101
+ }
102
+ })
103
+ }
104
+
105
+ if (key === 'xing') {
106
+ links.push({
107
+ label: 'Xing',
108
+ href: value,
109
+ icon: 'xing',
110
+ attributes: {
111
+ 'aria-label': 'Xing',
112
+ title: 'Xing',
113
+ class: 'srl-button srl-button--icon srl-button--transparent-white'
114
+ }
115
+ })
116
+ }
117
+ if (key === 'twitter') {
118
+ links.push({
119
+ label: 'Twitter',
120
+ href: value,
121
+ icon: "x-twitter",
122
+ attributes: {
123
+ 'aria-label': 'Twitter',
124
+ title: 'Twitter',
125
+ class: 'srl-button srl-button--icon srl-button--transparent-white'
126
+ }
127
+ })
128
+ }
129
+ if (key === 'facebook') {
130
+ links.push({
131
+ label: 'Facebook',
132
+ href: value,
133
+ icon: "facebook-f",
134
+ attributes: {
135
+ 'aria-label': 'Facebook',
136
+ title: 'Facebook',
137
+ class: 'srl-button srl-button--icon srl-button--transparent-white'
138
+ }
139
+ })
140
+ }
141
+ if (key === 'instagram') {
142
+ links.push({
143
+ label: 'Instagram',
144
+ href: value,
145
+ icon: "instagram",
146
+ attributes: {
147
+ 'aria-label': 'Instagram',
148
+ title: 'Instagram',
149
+ class: 'srl-button srl-button--icon srl-button--transparent-white'
150
+ }
151
+ })
152
+ }
153
+ })
154
+ }
155
+ return links
156
+ })
157
+
158
+ const furtherLinks = useMenu('footerFurtherLinks')
159
+
160
+ const downloads = useMenu('footerDownloads')
161
+
162
+ const downloadMenu = computed(() => {
163
+ return downloads.value.map((item) => {
164
+ if (item.href?.endsWith('.pdf')) {
165
+ item.attributes = {
166
+ download: ''
167
+ }
168
+ }
169
+ return item
170
+ })
171
+ })
172
+
173
+ const meta = ref([]) //useMenu('footerMeta')
174
+
175
+ const navigationMeta = computed(() => {
176
+ return [
177
+ ...meta.value,
178
+ {
179
+ label: t('footer.privacySettings'),
180
+ callback: () => alert('Privacy settings callback')
181
+ }
182
+ ]
183
+ })
184
+
185
+ const date = new Date()
186
+ const year = ref(date.getFullYear())
187
+ </script>
188
+
189
+ <template>
190
+ <footer id="srl-page-footer" class="srl-footer" tabindex="-1">
191
+ <div class="srl-footer__inner">
192
+ <div class="srl-footer__head">
193
+ <p class="srl-footer__logo">
194
+ <SvgLogo />
195
+ </p>
196
+ <div v-if="socialLinks.length && $te('footer.followUs')" class="srl-footer__social">
197
+ <h2 v-text="$t('footer.followUs')" class="srl-footer__social-header" />
198
+ <nav class="srl-footer__social-nav" :aria-label="$t('footer.followUs')">
199
+ <SrlMenu name="socialLinks" :menu="socialLinks" />
200
+ </nav>
201
+ </div>
202
+ </div>
203
+ <div class="srl-footer__content">
204
+ <section v-if="contact.length">
205
+ <h2 v-text="$t('footer.contact')" id="footer-contact" />
206
+ <address class="srl-footer__address">
207
+ <template v-for="(cont, index) in contact" :key="cont.label">
208
+ <span :class="`srl-footer__${cont.key}`" v-bind="cont.attributes ?? {}">
209
+ <template v-if="cont.href">
210
+ {{ cont.label }}<a :href="cont.href" :title="cont.title">{{ cont.linkText }}</a>
211
+ </template>
212
+ <template v-else>
213
+ {{ cont.label }}
214
+ </template>
215
+ </span>
216
+ <template v-if="index < contact.length - 1">
217
+ <br />
218
+ </template>
219
+ </template>
220
+ </address>
221
+ </section>
222
+ <section v-if="downloads.length">
223
+ <h2 v-text="$t('footer.downloads')" id="footer-downloads" />
224
+ <nav aria-labelledby="footer-downloads">
225
+ <SrlMenu name="downloads" :menu="downloadMenu" class="srl-footer__link-list" />
226
+ </nav>
227
+ </section>
228
+ <section v-if="furtherLinks.length">
229
+ <h2 v-text="$t('footer.furtherLinks')" id="footer-further-links" />
230
+ <nav aria-labelledby="footer-further-links">
231
+ <SrlMenu name="furtherLinks" :menu="furtherLinks" class="srl-footer__link-list" />
232
+ </nav>
233
+ </section>
234
+ </div>
235
+ <div class="srl-footer__meta">
236
+ <nav v-if="navigationMeta.length" aria-label="Meta">
237
+ <SrlMenu name="meta" :menu="navigationMeta" />
238
+ </nav>
239
+ <p v-if="$te('footer.copyright')" v-text="$t('footer.copyright', { year: year })" />
240
+ </div>
241
+ </div>
242
+ </footer>
243
+ </template>
244
+
245
+ <style scoped lang="scss">
246
+ @use 'srl';
247
+
248
+ footer {
249
+ background-color: srl.colors-grey-800();
250
+
251
+ color: srl.colors-white-1000();
252
+
253
+ :deep(a:not(.srl-button)),
254
+ :deep(button:not(.srl-button)) {
255
+ @include srl.typography-paragraph();
256
+ margin: unset;
257
+ padding: unset;
258
+ background-color: transparent;
259
+ border: none;
260
+ text-decoration: none;
261
+ cursor: pointer;
262
+ color: srl.colors-white-1000();
263
+ }
264
+
265
+ section {
266
+ display: flex;
267
+ flex-direction: column;
268
+ @include srl.spacer-row-gap(400);
269
+ width: 100%;
270
+ }
271
+
272
+ :deep(.srl-footer__link-list) {
273
+ display: flex;
274
+ flex-direction: column;
275
+ row-gap: srl.system-size-unit(10);
276
+ }
277
+
278
+ h2 {
279
+ @include srl.typography-title-h3();
280
+ }
281
+ }
282
+
283
+ .srl-footer {
284
+ &__inner {
285
+ @include srl.typography-paragraph();
286
+ margin: 0 auto;
287
+ max-width: var(--srl-container-max-width);
288
+ padding-inline: var(--srl-container-padding);
289
+ @include srl.spacer-padding-top(800);
290
+ @include srl.spacer-padding-bottom(800);
291
+ display: flex;
292
+ flex-direction: column;
293
+ @include srl.spacer-row-gap(800);
294
+ }
295
+
296
+ &__head {
297
+ display: flex;
298
+ width: 100%;
299
+ justify-content: space-between;
300
+ align-items: center;
301
+ }
302
+
303
+ &__logo {
304
+ width: srl.system-size-unit(175);
305
+ }
306
+
307
+ &__social {
308
+ display: flex;
309
+ @include srl.spacer-gap(100);
310
+ justify-content: center;
311
+ align-items: center;
312
+
313
+ &-header {
314
+ @include srl.typography-paragraph();
315
+ }
316
+
317
+ &-nav {
318
+ .srl-menu {
319
+ display: flex;
320
+ align-items: center;
321
+ @include srl.spacer-gap(100);
322
+ }
323
+ }
324
+ }
325
+
326
+ &__content {
327
+ display: flex;
328
+ flex-wrap: wrap;
329
+ @include srl.spacer-column-gap(400);
330
+ @include srl.spacer-row-gap(400);
331
+ width: 100%;
332
+ }
333
+
334
+ &__address {
335
+ font-style: normal;
336
+ }
337
+
338
+ &__meta {
339
+ display: flex;
340
+ @include srl.spacer-row-gap(400);
341
+ flex-direction: column;
342
+
343
+ :deep(a:not(.srl-button)),
344
+ :deep(button:not(.srl-button)) {
345
+ text-decoration: underline;
346
+ }
347
+
348
+ :deep(ul) {
349
+ display: flex;
350
+ align-items: baseline;
351
+ gap: srl.spacer-get(400);
352
+
353
+ @include srl.grid-media-up(tablet-pt) {
354
+ @include srl.spacer-column-gap(400);
355
+ flex-direction: row;
356
+ }
357
+ }
358
+
359
+ :deep(a:not(.srl-button)),
360
+ :deep(button:not(.srl-button)),
361
+ :deep(p) {
362
+ @include srl.typography-link();
363
+ }
364
+ }
365
+ }
366
+
367
+ ul {
368
+ list-style: none;
369
+ margin: 0;
370
+ padding: 0;
371
+ }
372
+
373
+ @include srl.grid-media(print) {
374
+ footer {
375
+ display: none;
376
+ }
377
+ }
378
+
379
+ @include srl.grid-media-up(tablet-pt) {
380
+ footer {
381
+ section {
382
+ width: srl.system-size-unit(300);
383
+ }
384
+ }
385
+
386
+ .srl-footer {
387
+ &__head {
388
+ flex-direction: row;
389
+ justify-content: space-between;
390
+ width: 100%;
391
+ }
392
+ }
393
+ }
394
+
395
+ @include srl.grid-media-up(tablet-ls) {
396
+ .srl-footer {
397
+ &__meta {
398
+ width: 100%;
399
+ flex-direction: row;
400
+ justify-content: space-between;
401
+ align-items: baseline;
402
+ }
403
+ }
404
+ }
405
+ </style>