@madgex/fert 1.3.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 (120) hide show
  1. package/.eslintignore +8 -0
  2. package/.eslintrc.js +15 -0
  3. package/.github/workflows/commits.yml +14 -0
  4. package/.github/workflows/release.yml +29 -0
  5. package/.husky/commit-msg +4 -0
  6. package/.husky/pre-commit +4 -0
  7. package/.prettierignore +2 -0
  8. package/.prettierrc.js +8 -0
  9. package/README.md +232 -0
  10. package/bin/cli.js +68 -0
  11. package/bin/commands/build-tasks/build-external-assets.js +16 -0
  12. package/bin/commands/build-tasks/build-tokens.js +119 -0
  13. package/bin/commands/build-tasks/bundle-ds-css.js +74 -0
  14. package/bin/commands/build-tasks/bundle-entry.js +43 -0
  15. package/bin/commands/build.js +42 -0
  16. package/bin/commands/dev-server.js +50 -0
  17. package/bin/commands/init.js +207 -0
  18. package/bin/commands/publish-tasks/asset-store-uploader.js +94 -0
  19. package/bin/commands/publish-tasks/get-aws-parameter.js +41 -0
  20. package/bin/commands/publish.js +51 -0
  21. package/bin/utils/cpid-lookup.js +47 -0
  22. package/bin/utils/index.js +121 -0
  23. package/bin/utils/resolve-external-assets.js +77 -0
  24. package/commitlint.config.cjs +1 -0
  25. package/constants.js +36 -0
  26. package/delivery/git.cer +22 -0
  27. package/delivery/jenkinsfile +93 -0
  28. package/package.json +84 -0
  29. package/repo-templates/globals/fert.config.js +4 -0
  30. package/repo-templates/globals/jenkinsfile +4 -0
  31. package/repo-templates/template-basic/_gitignore +5 -0
  32. package/repo-templates/template-basic/brand.json +21 -0
  33. package/repo-templates/template-basic/package.json +13 -0
  34. package/repo-templates/template-basic/public/favicon.ico +0 -0
  35. package/repo-templates/template-basic/public/fonts/mdgx-icons.eot +0 -0
  36. package/repo-templates/template-basic/public/fonts/mdgx-icons.svg +71 -0
  37. package/repo-templates/template-basic/public/fonts/mdgx-icons.ttf +0 -0
  38. package/repo-templates/template-basic/public/fonts/mdgx-icons.woff +0 -0
  39. package/repo-templates/template-basic/public/fonts/my-font.woff +1 -0
  40. package/repo-templates/template-basic/public/images/logo.png +0 -0
  41. package/repo-templates/template-basic/src/css/styles.scss +12 -0
  42. package/repo-templates/template-basic/src/index.js +3 -0
  43. package/repo-templates/template-basic/templates/footer.njk +14 -0
  44. package/repo-templates/template-basic/templates/header.njk +14 -0
  45. package/repo-templates/template-bigworkbag/_gitignore +5 -0
  46. package/repo-templates/template-bigworkbag/brand.json +21 -0
  47. package/repo-templates/template-bigworkbag/package.json +13 -0
  48. package/repo-templates/template-bigworkbag/public/favicon.ico +0 -0
  49. package/repo-templates/template-bigworkbag/public/fonts/mdgx-icons.eot +0 -0
  50. package/repo-templates/template-bigworkbag/public/fonts/mdgx-icons.svg +71 -0
  51. package/repo-templates/template-bigworkbag/public/fonts/mdgx-icons.ttf +0 -0
  52. package/repo-templates/template-bigworkbag/public/fonts/mdgx-icons.woff +0 -0
  53. package/repo-templates/template-bigworkbag/public/fonts/my-font.woff +1 -0
  54. package/repo-templates/template-bigworkbag/public/images/logo.png +0 -0
  55. package/repo-templates/template-bigworkbag/public/images/user-menu-pointer.svg +4 -0
  56. package/repo-templates/template-bigworkbag/src/css/breakpoints.scss +17 -0
  57. package/repo-templates/template-bigworkbag/src/css/clicky-menu.scss +52 -0
  58. package/repo-templates/template-bigworkbag/src/css/desktop-main-nav.scss +25 -0
  59. package/repo-templates/template-bigworkbag/src/css/desktop-user-nav.scss +127 -0
  60. package/repo-templates/template-bigworkbag/src/css/footer.scss +77 -0
  61. package/repo-templates/template-bigworkbag/src/css/header-top.scss +29 -0
  62. package/repo-templates/template-bigworkbag/src/css/leaderboard-ad.scss +22 -0
  63. package/repo-templates/template-bigworkbag/src/css/mobile-main-nav.scss +68 -0
  64. package/repo-templates/template-bigworkbag/src/css/mobile-user-nav.scss +49 -0
  65. package/repo-templates/template-bigworkbag/src/css/reset.scss +91 -0
  66. package/repo-templates/template-bigworkbag/src/css/styles.scss +19 -0
  67. package/repo-templates/template-bigworkbag/src/css/top-bar.scss +13 -0
  68. package/repo-templates/template-bigworkbag/src/css/typography.scss +20 -0
  69. package/repo-templates/template-bigworkbag/src/css/util.scss +28 -0
  70. package/repo-templates/template-bigworkbag/src/css/variables.scss +9 -0
  71. package/repo-templates/template-bigworkbag/src/index.js +3 -0
  72. package/repo-templates/template-bigworkbag/src/js/clicky-menus.js +178 -0
  73. package/repo-templates/template-bigworkbag/src/js/no-js.js +10 -0
  74. package/repo-templates/template-bigworkbag/templates/context/footer-nav.njk +27 -0
  75. package/repo-templates/template-bigworkbag/templates/context/main-nav.njk +32 -0
  76. package/repo-templates/template-bigworkbag/templates/context/user-nav.njk +17 -0
  77. package/repo-templates/template-bigworkbag/templates/footer.njk +68 -0
  78. package/repo-templates/template-bigworkbag/templates/header.njk +54 -0
  79. package/repo-templates/template-bigworkbag/templates/includes/desktop-main-nav-items.njk +18 -0
  80. package/repo-templates/template-bigworkbag/templates/includes/desktop-user-nav/loggedin-items.njk +28 -0
  81. package/repo-templates/template-bigworkbag/templates/includes/desktop-user-nav/loggedout-items.njk +9 -0
  82. package/repo-templates/template-bigworkbag/templates/includes/desktop-user-nav/submenu-items.njk +18 -0
  83. package/repo-templates/template-bigworkbag/templates/includes/desktop-user-nav/user-nav.njk +24 -0
  84. package/repo-templates/template-bigworkbag/templates/includes/dev-console-context.njk +7 -0
  85. package/repo-templates/template-bigworkbag/templates/includes/mobile-main-nav-items.njk +25 -0
  86. package/repo-templates/template-bigworkbag/templates/includes/mobile-user-nav/loggedin-items.njk +33 -0
  87. package/repo-templates/template-bigworkbag/templates/includes/mobile-user-nav/loggedout-items.njk +16 -0
  88. package/repo-templates/template-bigworkbag/templates/includes/mobile-user-nav/user-nav.njk +24 -0
  89. package/repo-templates/template-bigworkbag/templates/svgs/arrow-down.svg +3 -0
  90. package/repo-templates/template-bigworkbag/templates/svgs/arrow-left.svg +3 -0
  91. package/repo-templates/template-bigworkbag/templates/svgs/arrow-right.svg +3 -0
  92. package/repo-templates/template-bigworkbag/templates/svgs/arrow-up.svg +3 -0
  93. package/repo-templates/template-bigworkbag/templates/svgs/cart.svg +3 -0
  94. package/repo-templates/template-bigworkbag/templates/svgs/facebook.svg +3 -0
  95. package/repo-templates/template-bigworkbag/templates/svgs/linkedin.svg +3 -0
  96. package/repo-templates/template-bigworkbag/templates/svgs/profile.svg +5 -0
  97. package/repo-templates/template-bigworkbag/templates/svgs/star-filled.svg +3 -0
  98. package/repo-templates/template-bigworkbag/templates/svgs/star-outline.svg +3 -0
  99. package/repo-templates/template-bigworkbag/templates/svgs/twitter.svg +3 -0
  100. package/repo-templates/template-bigworkbag/templates/svgs/youtube.svg +3 -0
  101. package/repo-templates/template-bigworkbag/templates/translations/da.njk +26 -0
  102. package/repo-templates/template-bigworkbag/templates/translations/de.njk +26 -0
  103. package/repo-templates/template-bigworkbag/templates/translations/en.njk +26 -0
  104. package/repo-templates/template-bigworkbag/templates/translations/es.njk +26 -0
  105. package/repo-templates/template-bigworkbag/templates/translations/fr.njk +26 -0
  106. package/repo-templates/template-bigworkbag/templates/translations/nb.njk +26 -0
  107. package/repo-templates/template-bigworkbag/templates/translations/nl.njk +26 -0
  108. package/repo-templates/template-bigworkbag/templates/translations/sv.njk +26 -0
  109. package/repo-templates/template-bigworkbag/templates/translations/zh-cn.njk +26 -0
  110. package/server/extensions/error-logging.js +25 -0
  111. package/server/index.js +98 -0
  112. package/server/plugins/hapi-vite.js +61 -0
  113. package/server/routes/public.js +29 -0
  114. package/server/routes/views.js +46 -0
  115. package/server/templates/furniture.njk +67 -0
  116. package/server/templates/page1.njk +37 -0
  117. package/server/view-manager.js +59 -0
  118. package/shared/Dockerfile.brandingRepoPublish +28 -0
  119. package/shared/README.md +4 -0
  120. package/vite.config.js +14 -0
@@ -0,0 +1,91 @@
1
+ html,
2
+ body,
3
+ div,
4
+ span,
5
+ applet,
6
+ object,
7
+ iframe,
8
+ h1,
9
+ h2,
10
+ h3,
11
+ h4,
12
+ h5,
13
+ h6,
14
+ p,
15
+ blockquote,
16
+ pre,
17
+ a,
18
+ abbr,
19
+ acronym,
20
+ address,
21
+ code,
22
+ del,
23
+ dfn,
24
+ img,
25
+ ins,
26
+ kbd,
27
+ q,
28
+ s,
29
+ samp,
30
+ small,
31
+ strike,
32
+ tt,
33
+ var,
34
+ u,
35
+ center,
36
+ dl,
37
+ dt,
38
+ dd,
39
+ ol,
40
+ ul,
41
+ li,
42
+ fieldset,
43
+ form,
44
+ label,
45
+ legend,
46
+ caption,
47
+ table:not(.mds-edited-text table),
48
+ tbody:not(.mds-edited-text tbody),
49
+ tfoot:not(.mds-edited-text tfoot),
50
+ thead:not(.mds-edited-text thead),
51
+ tr:not(.mds-edited-text tr),
52
+ th:not(.mds-edited-text th),
53
+ td:not(.mds-edited-text td),
54
+ article,
55
+ aside,
56
+ canvas,
57
+ details,
58
+ embed,
59
+ figure,
60
+ figcaption,
61
+ footer,
62
+ header,
63
+ hgroup,
64
+ menu,
65
+ nav,
66
+ output,
67
+ ruby,
68
+ section,
69
+ summary,
70
+ time,
71
+ mark,
72
+ audio,
73
+ video {
74
+ margin: 0;
75
+ padding: 0;
76
+ border: 0;
77
+ font: inherit;
78
+ }
79
+
80
+ *,
81
+ *::before,
82
+ *::after {
83
+ box-sizing: border-box;
84
+ word-wrap: break-word;
85
+ }
86
+
87
+ ol,
88
+ ul {
89
+ list-style-type: none;
90
+ list-style-position: outside;
91
+ }
@@ -0,0 +1,19 @@
1
+ @import "./reset.scss";
2
+ @import "../../public/tokens/scss/index.scss";
3
+ @import "@madgex/design-system/src/scss/import.scss";
4
+ @import "./variables.scss";
5
+ @import "./breakpoints.scss";
6
+ @import "./util.scss";
7
+ @import "./typography.scss";
8
+ @import "./clicky-menu.scss";
9
+
10
+ @import "./leaderboard-ad.scss";
11
+ @import "./top-bar.scss";
12
+ @import "./header-top.scss";
13
+ @import "./mobile-main-nav.scss";
14
+ @import "./mobile-user-nav.scss";
15
+ @import "./desktop-user-nav.scss";
16
+ @import "./desktop-main-nav.scss";
17
+ @import "./footer.scss";
18
+
19
+
@@ -0,0 +1,13 @@
1
+ [scoped-v6=""] .top-bar {
2
+ display: flex;
3
+ justify-content: space-between;
4
+ align-items: center;
5
+ height: $top-bar-height;
6
+ background: $brand-color-2;
7
+ color: #fff;
8
+
9
+ @include for-tablet-landscape-up {
10
+ display: none;
11
+ }
12
+ }
13
+
@@ -0,0 +1,20 @@
1
+ [scoped-v6=""] {
2
+ font-family: sans-serif;
3
+
4
+ /*
5
+ The design system applies these to <body>.
6
+ Repeating here for clarity and independence from the design system.
7
+ */
8
+ font-size: 1.125rem;
9
+ line-height: 1.34;
10
+
11
+ @include for-phone-only {
12
+ font-size: 1rem;
13
+ line-height: 1.38;
14
+ }
15
+
16
+ @include for-tablet-landscape-up {
17
+ font-size: 1rem;
18
+ line-height: 1.38;
19
+ }
20
+ }
@@ -0,0 +1,28 @@
1
+ /* As design system .mds-js-visually-hidden */
2
+ .visually-hidden {
3
+ position: absolute;
4
+
5
+ width: 1px;
6
+ height: 1px;
7
+ // If margin is set to a negative value it can cause text to be announced in the wrong order in VoiceOver for OSX
8
+ margin: 0;
9
+ padding: 0;
10
+
11
+ overflow: hidden;
12
+ clip: rect(0 0 0 0);
13
+ clip-path: inset(50%);
14
+
15
+ border: 0;
16
+
17
+ // For long content, line feeds are not interpreted as spaces and small width
18
+ // causes content to wrap 1 word per line:
19
+ // https://medium.com/@jessebeach/beware-smushed-off-screen-accessible-text-5952a4c2cbfe
20
+ white-space: nowrap;
21
+ }
22
+
23
+ /* As design system .mds-wrapper */
24
+ [scoped-v6=""] .wrapper {
25
+ margin: 0 auto;
26
+ max-width: 1240px;
27
+ width: $wrapper-width;
28
+ }
@@ -0,0 +1,9 @@
1
+ $brand-color-1: #00a99d;
2
+ $brand-color-2: #303030;
3
+ $font-color-1: #343434;
4
+
5
+ $gutter-width: calc(1.5vw + 10px);
6
+ $wrapper-width: calc(97% - 20px);
7
+ $top-bar-height: 48px;
8
+
9
+
@@ -0,0 +1,3 @@
1
+ import './js/no-js';
2
+ import './js/clicky-menus';
3
+ import './css/styles.scss';
@@ -0,0 +1,178 @@
1
+ /**
2
+ * Use to create clickable menus eg mobile mobile hamburger menu or main nav submenu
3
+ *
4
+ * Based on https://css-tricks.com/in-praise-of-the-unambiguous-click-menu/
5
+ * Modified from the above to use <span class=""> instead of <a href="#">
6
+ * for placeholder elements to be transformed into buttons.
7
+ *
8
+ * To use follow this structure:
9
+ * <anyelement id="[required]"> <-- menu container's direct parent
10
+ * <anyelement class="clicky-menu js-clicky-menu"> <-- menu container
11
+ * <span id="[required]" class="js-clicky-menu-control"> <-- menu control (tranformed into button when js enabled)
12
+ * <ul id="[required]"> <-- menu
13
+ */
14
+
15
+ (function () {
16
+ const ClickyMenus = function (menu) {
17
+ // DOM element(s)
18
+ let container = menu.parentElement,
19
+ currentMenuItem,
20
+ i,
21
+ len;
22
+
23
+ this.init = function () {
24
+ menuSetup();
25
+ document.addEventListener('click', closeOpenMenu);
26
+ };
27
+
28
+ /*===================================================
29
+ = Menu Open / Close Functions =
30
+ ===================================================*/
31
+ function toggleOnMenuClick(e) {
32
+ const button = e.currentTarget;
33
+
34
+ // close open menu if there is one
35
+ if (currentMenuItem && button !== currentMenuItem) {
36
+ toggleSubmenu(currentMenuItem);
37
+ }
38
+
39
+ toggleSubmenu(button);
40
+ }
41
+
42
+ function toggleSubmenu(button) {
43
+ const submenu = document.getElementById(
44
+ button.getAttribute('aria-controls')
45
+ );
46
+
47
+ if ('true' === button.getAttribute('aria-expanded')) {
48
+ button.setAttribute('aria-expanded', false);
49
+ submenu.setAttribute('aria-hidden', true);
50
+ currentMenuItem = false;
51
+ } else {
52
+ button.setAttribute('aria-expanded', true);
53
+ submenu.setAttribute('aria-hidden', false);
54
+ preventOffScreenSubmenu(submenu);
55
+ currentMenuItem = button;
56
+ }
57
+ }
58
+
59
+ function preventOffScreenSubmenu(submenu) {
60
+ const screenWidth =
61
+ window.innerWidth ||
62
+ document.documentElement.clientWidth ||
63
+ document.body.clientWidth,
64
+ parent = submenu.offsetParent,
65
+ menuLeftEdge = parent.getBoundingClientRect().left,
66
+ menuRightEdge = menuLeftEdge + submenu.offsetWidth;
67
+
68
+ if (menuRightEdge + 32 > screenWidth) {
69
+ // adding 32 so it's not too close
70
+ submenu.classList.add('sub-menu--right');
71
+ }
72
+ }
73
+
74
+ function closeOnEscKey(e) {
75
+ if (27 === e.keyCode) {
76
+ // we're in a submenu item
77
+ if (null !== e.target.closest('ul[aria-hidden="false"]')) {
78
+ currentMenuItem.focus();
79
+ toggleSubmenu(currentMenuItem);
80
+
81
+ // we're on a parent item
82
+ } else if ('true' === e.target.getAttribute('aria-expanded')) {
83
+ toggleSubmenu(currentMenuItem);
84
+ }
85
+ }
86
+ }
87
+
88
+ function closeOpenMenu(e) {
89
+ if (currentMenuItem && !e.target.closest('#' + container.id)) {
90
+ toggleSubmenu(currentMenuItem);
91
+ }
92
+ }
93
+
94
+ /*===========================================================
95
+ = Modify Menu Markup & Bind Listeners =
96
+ =============================================================*/
97
+ function menuSetup() {
98
+ menu.classList.remove('no-js');
99
+
100
+ menu.querySelectorAll('ul').forEach((submenu) => {
101
+ const menuItem = submenu.parentElement;
102
+
103
+ if ('undefined' !== typeof submenu) {
104
+ let button = convertControlElementToButton(menuItem);
105
+
106
+ setUpAria(submenu, button);
107
+
108
+ // bind event listener to button
109
+ button.addEventListener('click', toggleOnMenuClick);
110
+ menu.addEventListener('keyup', closeOnEscKey);
111
+ }
112
+ });
113
+ }
114
+
115
+ /**
116
+ * Why do this? See https://justmarkup.com/articles/2019-01-21-the-link-to-button-enhancement/
117
+ */
118
+ function convertControlElementToButton(menuItem) {
119
+ const controlElement = menuItem.querySelector(
120
+ 'span.js-clicky-menu-control'
121
+ ),
122
+ controlElementHTML = controlElement.innerHTML,
123
+ controlElementAtts = controlElement.attributes,
124
+ button = document.createElement('button');
125
+
126
+ if (null !== controlElement) {
127
+ // set button content and attributes
128
+ button.innerHTML = controlElementHTML.trim();
129
+ for (i = 0, len = controlElementAtts.length; i < len; i++) {
130
+ let attr = controlElementAtts[i];
131
+ button.setAttribute(attr.name, attr.value);
132
+ }
133
+
134
+ menuItem.replaceChild(button, controlElement);
135
+ }
136
+
137
+ return button;
138
+ }
139
+
140
+ function setUpAria(submenu, button) {
141
+ const submenuId = submenu.getAttribute('id');
142
+
143
+ let id;
144
+ if (null === submenuId) {
145
+ id =
146
+ button.textContent.trim().replace(/\s+/g, '-').toLowerCase() +
147
+ '-submenu';
148
+ console.log(
149
+ 'ClickyMenu - No id on: ' +
150
+ submenu +
151
+ ', using: ' +
152
+ id +
153
+ ' for aria-controls'
154
+ );
155
+ } else {
156
+ id = submenuId;
157
+ }
158
+
159
+ // set button ARIA
160
+ button.setAttribute('aria-controls', id);
161
+ button.setAttribute('aria-expanded', false);
162
+
163
+ // set submenu ARIA
164
+ submenu.setAttribute('id', id);
165
+ submenu.setAttribute('aria-hidden', true);
166
+ }
167
+ };
168
+
169
+ /* Create a ClickMenus object and initiate menu for any menu with .clicky-menu class */
170
+ document.addEventListener('DOMContentLoaded', function () {
171
+ const menus = document.querySelectorAll('.js-clicky-menu');
172
+
173
+ menus.forEach((menu) => {
174
+ let clickyMenu = new ClickyMenus(menu);
175
+ clickyMenu.init();
176
+ });
177
+ });
178
+ })();
@@ -0,0 +1,10 @@
1
+ document.onreadystatechange = () => {
2
+ if (document.readyState === 'interactive') {
3
+ const noJsClass = 'no-js';
4
+ const header = document.querySelector('header');
5
+ const footer = document.querySelector('footer');
6
+
7
+ header.classList.remove(noJsClass);
8
+ footer.classList.remove(noJsClass);
9
+ }
10
+ };
@@ -0,0 +1,27 @@
1
+ {% set footerNavigation = [
2
+ {
3
+ "href": "/about-us",
4
+ "label": "About us",
5
+ "openInNewWindow": false
6
+ },
7
+ {
8
+ "href": "/contact-us",
9
+ "label": "Contact us",
10
+ "openInNewWindow": false
11
+ },
12
+ {
13
+ "href": "/terms-and-conditions/",
14
+ "label": "Terms & conditions",
15
+ "openInNewWindow": false
16
+ },
17
+ {
18
+ "href": "/privacy-policy",
19
+ "label": "Privacy Policy",
20
+ "openInNewWindow": false
21
+ },
22
+ {
23
+ "href": "https://bigworkbag-rs.madgexjb.com/",
24
+ "label": "Advertise with us",
25
+ "openInNewWindow": false
26
+ }
27
+ ] %}
@@ -0,0 +1,32 @@
1
+ {% set mainNavigation = [
2
+ {
3
+ "href": "/",
4
+ "label": "Home",
5
+ "openInNewWindow": false
6
+ },
7
+ {
8
+ "href": "/jobs",
9
+ "label": "Find a job",
10
+ "openInNewWindow": false
11
+ },
12
+ {
13
+ "href": "/newalert",
14
+ "label": "Job alerts",
15
+ "openInNewWindow": false
16
+ },
17
+ {
18
+ "href": "/employers",
19
+ "label": "Search recruiters",
20
+ "openInNewWindow": false
21
+ },
22
+ {
23
+ "href": "/careers",
24
+ "label": "Career advice",
25
+ "openInNewWindow": false
26
+ },
27
+ {
28
+ "href": "/careerfairs",
29
+ "label": "Career fairs",
30
+ "openInNewWindow": false
31
+ }
32
+ ] %}
@@ -0,0 +1,17 @@
1
+ {% set userNavigation = [
2
+ {
3
+ "href": "/your-jobs",
4
+ "label": "Your jobs",
5
+ "openInNewWindow": false
6
+ },
7
+ {
8
+ "href": "/profile",
9
+ "label": "Your profile",
10
+ "openInNewWindow": false
11
+ },
12
+ {
13
+ "href": "/account",
14
+ "label": "Your account",
15
+ "openInNewWindow": false
16
+ }
17
+ ] %}
@@ -0,0 +1,68 @@
1
+ {# Footer #}
2
+
3
+ <!-- START HEADER FRAGMENT -->
4
+ <!-- HEADER-FOOTER-PODLET VERSION: {{ version }} -->
5
+ {%- from templatePath + "translations/en.njk" import translations -%}
6
+ {%- from templatePath + "context/footer-nav.njk" import footerNavigation -%}
7
+
8
+ <footer role="contentinfo" class="contentinfo no-js" scoped-v6="">
9
+ <div class="back-to-top">
10
+ <div class="wrapper">
11
+ <a href="#top-bar">{{ translations.footer["back-to-top"] }}</a>
12
+ </div>
13
+ </div>
14
+
15
+ <div class="wrapper">
16
+
17
+ <nav aria-label="{{ translations.footer["footer"] }}" class="footer-nav">
18
+ <ul class="footer-nav__items">
19
+ {%- if footerNavigation.length -%}
20
+ {%- for item in footerNavigation -%}
21
+ <li class="footer-nav__item">
22
+ <a
23
+ class="footer-nav__link"
24
+ href="{{ item.href }}"
25
+ {%- if item.openInNewWindow -%} target="_blank" rel="noopener" {% endif %}>
26
+ {{ item.label | safe }}
27
+ {%- if item.openInNewWindow %}
28
+ <span class="visually-hidden">{{ translations.header["link-new-window"] }}</span>
29
+ {%- endif -%}
30
+ </a>
31
+ </li>
32
+ {%- endfor -%}
33
+ {%- endif -%}
34
+ </ul>
35
+ </nav>
36
+
37
+ <ul class="social-media__items">
38
+ <li class="social-media__item">
39
+ <a
40
+ class="social-media__link"
41
+ href="https://www.facebook.com">
42
+ {% include templatePath + "svgs/facebook.svg" %}
43
+ <span class="visually-hidden">Facebook</span>
44
+ </a>
45
+ </li>
46
+ <li class="social-media__item">
47
+ <a
48
+ class="social-media__link"
49
+ href="https://www.linkedin.com">
50
+ {% include templatePath + "svgs/linkedin.svg" %}
51
+ <span class="visually-hidden">linkedIn</span>
52
+ </a>
53
+ </li>
54
+ <li class="social-media__item">
55
+ <a
56
+ class="social-media__link"
57
+ href="https://www.youtube.com">
58
+ {% include templatePath + "svgs/youtube.svg" %}
59
+ <span class="visually-hidden">YouTube</span>
60
+ </a>
61
+ </li>
62
+ </ul>
63
+
64
+ <p class="copyright">
65
+ © 2008 - 2021 bigworkbag.com, all rights reserved. Powered by Madgex Job Board Software
66
+ </p>
67
+ </div>
68
+ </footer>
@@ -0,0 +1,54 @@
1
+ {# Header #}
2
+
3
+ {% include templatePath + "includes/dev-console-context.njk" %}
4
+
5
+ <!-- START HEADER FRAGMENT -->
6
+ <!-- HEADER-FOOTER-PODLET VERSION: {{ version }} -->
7
+ {%- from templatePath + "translations/en.njk" import translations -%}
8
+
9
+ <header role="banner" class="banner no-js" scoped-v6="">
10
+ <div id="ad-leaderboard" class="ad ad--leaderboard ad--leaderboard--empty"></div>
11
+
12
+ <div id="top-bar" class="top-bar">
13
+ <nav aria-label="{{ translations.header["main"] }}" id="mobile-main-nav" class="mobile-main-nav">
14
+ <div class="clicky-menu js-clicky-menu">
15
+ <span
16
+ id="mobile-main-nav-clicky-menu-control"
17
+ class="clicky-menu-control js-clicky-menu-control">
18
+ <div class="hamburger">
19
+ <div class="hamburger-line"></div>
20
+ <div class="hamburger-line"></div>
21
+ <div class="hamburger-line"></div>
22
+ <div class="hamburger-line"></div>
23
+ </div>
24
+ </span>
25
+ <ul id="mobile-main-nav__items" class="mobile-main-nav__items">
26
+ {% include templatePath + "includes/mobile-main-nav-items.njk" %}
27
+ </ul>
28
+ </div>
29
+ </nav>
30
+ {% include templatePath + "includes/mobile-user-nav/user-nav.njk" %}
31
+ </div>
32
+
33
+ <div id="ad-mobileleaderboard" class="ad ad--mobileleaderboard ad--mobileleaderboard--empty"></div>
34
+
35
+ <div class="header-top">
36
+ <div class="wrapper">
37
+ <div class="primary-logo">
38
+ <a href="/" aria-label="{{ translations.header["homepage"] }}">
39
+ <img src="/_/jobseekers-frontend/assets/images/logo.png" title="bigworkbag.com" alt="bigworkbag.com logo"/>
40
+ </a>
41
+ </div>
42
+ {% include templatePath + "includes/desktop-user-nav/user-nav.njk" %}
43
+ </div>
44
+ </div>
45
+
46
+ <nav aria-label="{{ translations.header["main"] }}" id="desktop-main-nav" class="desktop-main-nav">
47
+ <div class="wrapper">
48
+ <ul class="desktop-main-nav__items">
49
+ {% include templatePath + "includes/desktop-main-nav-items.njk" %}
50
+ </ul>
51
+ </div>
52
+ </nav>
53
+ </header>
54
+ <!-- END HEADER FRAGMENT -->
@@ -0,0 +1,18 @@
1
+ {# Desktop main nav items #}
2
+
3
+ {%- from templatePath + "context/main-nav.njk" import mainNavigation -%}
4
+
5
+ {% if mainNavigation.length %}
6
+ {% for item in mainNavigation %}
7
+ <li class="desktop-main-nav__item">
8
+ <a
9
+ class="desktop-main-nav__link"
10
+ href="{{ item.href }}"
11
+ {%- if item.openInNewWindow -%}target="_blank" rel="noopener"{% endif %}>
12
+ <span class="desktop-main-nav__label">{{- item.label | safe -}}</span>
13
+ {%- if item.openInNewWindow %}<span class="visually-hidden">{{ translations.header["link-new-window"] }}</span>{% endif %}
14
+ </a>
15
+ </li>
16
+ {% endfor %}
17
+ {% endif %}
18
+
@@ -0,0 +1,28 @@
1
+ {# Desktop user nav logged in items #}
2
+
3
+ <li class="desktop-user-nav__item clicky-menu js-clicky-menu">
4
+ <span
5
+ id="desktop-user-nav-clicky-menu-control"
6
+ class="clicky-menu-control js-clicky-menu-control"
7
+ aria-label="Account menu">
8
+ {% include templatePath + "svgs/profile.svg" %}
9
+ {{ auth.credentials.username | safe }}
10
+ {% include templatePath + "svgs/arrow-down.svg" %}
11
+ </span>
12
+ <ul
13
+ id="desktop-user-nav-submenu-items"
14
+ class="desktop-user-nav__submenu-items">
15
+ {% include templatePath + "includes/desktop-user-nav/submenu-items.njk" %}
16
+ </ul>
17
+ </li>
18
+ <li class="desktop-user-nav__item desktop-user-nav__item--shortlist">
19
+ <a
20
+ href="/your-jobs?ActiveSection=ShortList"
21
+ aria-label="{{ translations.header["your-shortlist"] }}">
22
+ <span class="desktop-user-nav__shortlist-count">{{ auth.artifacts.shortlistedJobs | length | default(0) }}</span>
23
+ {% include templatePath + "svgs/star-filled.svg" %}
24
+ </a>
25
+ </li>
26
+ <li class="desktop-user-nav__item">
27
+ <a href="{{ getServiceRoute('jobseekersite', 'account.logoff') }}">{{ translations.header["sign-out"] }}</a>
28
+ </li>
@@ -0,0 +1,9 @@
1
+ {# Desktop user nav logged in items #}
2
+
3
+ <li class="desktop-user-nav__item">
4
+ <a href="{{ getServiceRoute('jobseekersite', 'account.login') }}">{{ translations.header["sign-in"] }}</a>
5
+ </li>
6
+ <li class="desktop-user-nav__item">{{ translations.header["or"] }}</li>
7
+ <li class="desktop-user-nav__item">
8
+ <a href="{{ getServiceRoute('jobseekersite', 'account.signup') }}">{{ translations.header["create-account"] }}</a>
9
+ </li>
@@ -0,0 +1,18 @@
1
+ {# Desktop user nav submenu items #}
2
+
3
+ {%- from templatePath + "context/user-nav.njk" import userNavigation -%}
4
+
5
+ {% if userNavigation.length %}
6
+ {% for item in userNavigation %}
7
+ <li class="desktop-user-nav__submenu-item">
8
+ <a
9
+ class="desktop-user-nav__submenu-link"
10
+ href="{{ item.href }}"
11
+ {%- if item.openInNewWindow -%}target="_blank" rel="noopener"{% endif %}>
12
+ <span class="desktop-user-nav__label">{{- item.label | safe -}}</span>
13
+ {%- if item.openInNewWindow %}
14
+ <span class="visually-hidden">{{ translations.header["link-new-window"] }}</span>{% endif %}
15
+ </a>
16
+ </li>
17
+ {% endfor %}
18
+ {% endif %}