@ndla/ui 5.0.0 → 6.1.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 (57) hide show
  1. package/es/Breadcrumblist/Breadcrumblist.js +16 -9
  2. package/es/ContentPlaceholder/ContentPlaceholder.js +51 -0
  3. package/es/ContentPlaceholder/index.js +9 -0
  4. package/es/FactBox/FactBox.js +14 -31
  5. package/es/Frontpage/FrontpageSearch.js +10 -3
  6. package/es/Masthead/Masthead.js +9 -8
  7. package/es/Masthead/index.js +2 -1
  8. package/es/Masthead/utils.js +46 -0
  9. package/es/MessageBox/MessageBox.js +13 -7
  10. package/es/Notion/FigureNotion.js +3 -1
  11. package/es/Search/ContentTypeResult.js +4 -2
  12. package/es/Search/SearchField.js +5 -4
  13. package/es/Search/SearchResultSleeve.js +12 -10
  14. package/es/SearchTypeResult/SearchItem.js +8 -8
  15. package/es/all.css +1 -1
  16. package/es/index.js +2 -1
  17. package/lib/Breadcrumblist/Breadcrumblist.js +17 -9
  18. package/lib/ContentPlaceholder/ContentPlaceholder.d.ts +9 -0
  19. package/lib/ContentPlaceholder/ContentPlaceholder.js +54 -0
  20. package/lib/ContentPlaceholder/index.d.ts +9 -0
  21. package/lib/ContentPlaceholder/index.js +20 -0
  22. package/lib/FactBox/FactBox.js +14 -37
  23. package/lib/Frontpage/FrontpageSearch.js +10 -3
  24. package/lib/Masthead/Masthead.d.ts +3 -3
  25. package/lib/Masthead/Masthead.js +10 -8
  26. package/lib/Masthead/index.d.ts +2 -1
  27. package/lib/Masthead/index.js +14 -0
  28. package/lib/Masthead/utils.d.ts +11 -0
  29. package/lib/Masthead/utils.js +53 -0
  30. package/lib/MessageBox/MessageBox.d.ts +2 -1
  31. package/lib/MessageBox/MessageBox.js +13 -7
  32. package/lib/Notion/FigureNotion.js +3 -1
  33. package/lib/Search/ContentTypeResult.js +4 -2
  34. package/lib/Search/SearchField.js +5 -4
  35. package/lib/Search/SearchResultSleeve.js +12 -10
  36. package/lib/SearchTypeResult/SearchItem.js +8 -8
  37. package/lib/all.css +1 -1
  38. package/lib/index.d.ts +2 -1
  39. package/lib/index.js +23 -0
  40. package/package.json +13 -13
  41. package/src/Breadcrumblist/Breadcrumblist.tsx +12 -3
  42. package/src/ContentPlaceholder/ContentPlaceholder.tsx +68 -0
  43. package/src/ContentPlaceholder/index.ts +11 -0
  44. package/src/FactBox/FactBox.tsx +8 -10
  45. package/src/FactBox/component.factbox.scss +12 -0
  46. package/src/Frontpage/FrontpageSearch.tsx +7 -0
  47. package/src/Masthead/Masthead.tsx +7 -6
  48. package/src/Masthead/component.masthead.scss +3 -62
  49. package/src/Masthead/index.ts +3 -1
  50. package/src/Masthead/utils.ts +33 -0
  51. package/src/MessageBox/MessageBox.tsx +5 -1
  52. package/src/Notion/FigureNotion.tsx +25 -23
  53. package/src/Search/ContentTypeResult.tsx +3 -1
  54. package/src/Search/SearchField.jsx +2 -1
  55. package/src/Search/SearchResultSleeve.tsx +8 -2
  56. package/src/SearchTypeResult/SearchItem.tsx +0 -1
  57. package/src/index.ts +2 -1
package/lib/index.d.ts CHANGED
@@ -12,7 +12,7 @@ export { default as Table } from './Table';
12
12
  export { default as ResourcesWrapper, ResourcesTitle, ResourcesTopicTitle } from './ResourcesWrapper';
13
13
  export { createUniversalPortal } from './utils/createUniversalPortal';
14
14
  export { default as NoContentBox } from './NoContentBox';
15
- export { default as Masthead, MastheadItem } from './Masthead';
15
+ export { default as Masthead, MastheadItem, getMastheadHeight, useMastheadHeight } from './Masthead';
16
16
  export { default as Portrait } from './Portrait';
17
17
  export { default as ContentLoader } from './ContentLoader';
18
18
  export { default as RelatedArticleList, RelatedArticle } from './RelatedArticleList';
@@ -71,4 +71,5 @@ export { default as ContentTypeBadge, SubjectMaterialBadge, TasksAndActivitiesBa
71
71
  export { SubjectAbout, SubjectArchive, SubjectCarousel, SubjectChildContent, SubjectContent, SubjectFilter, SubjectFlexChild, SubjectFlexWrapper, SubjectHeader, SubjectLinks, SubjectNewContent, SubjectSecondaryContent, SubjectSectionTitle, SubjectShortcuts, SubjectSidebarWrapper, SubjectSocialContent, SubjectSocialSection, SubjectTopics, SubjectBanner, } from './Subject';
72
72
  export { default as ContentCard } from './ContentCard';
73
73
  export { default as CopyParagraphButton } from './CopyParagraphButton';
74
+ export { default as ContentPlaceholder } from './ContentPlaceholder';
74
75
  export { Notion, ConceptNotion } from './Notion';
package/lib/index.js CHANGED
@@ -23,6 +23,8 @@ var _exportNames = {
23
23
  NoContentBox: true,
24
24
  Masthead: true,
25
25
  MastheadItem: true,
26
+ getMastheadHeight: true,
27
+ useMastheadHeight: true,
26
28
  Portrait: true,
27
29
  ContentLoader: true,
28
30
  RelatedArticleList: true,
@@ -167,6 +169,7 @@ var _exportNames = {
167
169
  SubjectBanner: true,
168
170
  ContentCard: true,
169
171
  CopyParagraphButton: true,
172
+ ContentPlaceholder: true,
170
173
  Notion: true,
171
174
  ConceptNotion: true
172
175
  };
@@ -272,6 +275,18 @@ Object.defineProperty(exports, "MastheadItem", {
272
275
  return _Masthead.MastheadItem;
273
276
  }
274
277
  });
278
+ Object.defineProperty(exports, "getMastheadHeight", {
279
+ enumerable: true,
280
+ get: function get() {
281
+ return _Masthead.getMastheadHeight;
282
+ }
283
+ });
284
+ Object.defineProperty(exports, "useMastheadHeight", {
285
+ enumerable: true,
286
+ get: function get() {
287
+ return _Masthead.useMastheadHeight;
288
+ }
289
+ });
275
290
  Object.defineProperty(exports, "Portrait", {
276
291
  enumerable: true,
277
292
  get: function get() {
@@ -1136,6 +1151,12 @@ Object.defineProperty(exports, "CopyParagraphButton", {
1136
1151
  return _CopyParagraphButton["default"];
1137
1152
  }
1138
1153
  });
1154
+ Object.defineProperty(exports, "ContentPlaceholder", {
1155
+ enumerable: true,
1156
+ get: function get() {
1157
+ return _ContentPlaceholder["default"];
1158
+ }
1159
+ });
1139
1160
  Object.defineProperty(exports, "Notion", {
1140
1161
  enumerable: true,
1141
1162
  get: function get() {
@@ -1284,6 +1305,8 @@ var _ContentCard = _interopRequireDefault(require("./ContentCard"));
1284
1305
 
1285
1306
  var _CopyParagraphButton = _interopRequireDefault(require("./CopyParagraphButton"));
1286
1307
 
1308
+ var _ContentPlaceholder = _interopRequireDefault(require("./ContentPlaceholder"));
1309
+
1287
1310
  var _Notion = require("./Notion");
1288
1311
 
1289
1312
  function _interopRequireDefault(obj) { return obj && obj.__esModule ? obj : { "default": obj }; }
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "@ndla/ui",
3
- "version": "5.0.0",
3
+ "version": "6.1.0",
4
4
  "description": "UI component library for NDLA.",
5
5
  "license": "GPL-3.0",
6
6
  "main": "lib/index.js",
@@ -31,18 +31,18 @@
31
31
  "types"
32
32
  ],
33
33
  "dependencies": {
34
- "@ndla/button": "^2.1.1",
35
- "@ndla/carousel": "^1.2.1",
36
- "@ndla/core": "^1.0.1",
37
- "@ndla/hooks": "^1.1.1",
34
+ "@ndla/button": "^2.1.2",
35
+ "@ndla/carousel": "^1.2.2",
36
+ "@ndla/core": "^2.0.0",
37
+ "@ndla/hooks": "^1.1.2",
38
38
  "@ndla/icons": "^1.6.1",
39
- "@ndla/licenses": "^4.0.0",
40
- "@ndla/modal": "^1.2.1",
41
- "@ndla/safelink": "^1.1.1",
42
- "@ndla/switch": "^0.1.1",
43
- "@ndla/tabs": "^1.1.1",
44
- "@ndla/tooltip": "^0.3.1",
45
- "@ndla/util": "^2.0.3",
39
+ "@ndla/licenses": "^4.0.1",
40
+ "@ndla/modal": "^1.2.2",
41
+ "@ndla/safelink": "^1.1.3",
42
+ "@ndla/switch": "^0.1.2",
43
+ "@ndla/tabs": "^1.1.2",
44
+ "@ndla/tooltip": "^0.3.2",
45
+ "@ndla/util": "^2.0.4",
46
46
  "@reach/menu-button": "^0.16.2",
47
47
  "@reach/slider": "^0.16.0",
48
48
  "focus-trap-react": "^8.9.2",
@@ -81,5 +81,5 @@
81
81
  "publishConfig": {
82
82
  "access": "public"
83
83
  },
84
- "gitHead": "bf0e9abb4b4533a54b6c9efda0465b5a27072921"
84
+ "gitHead": "75732577f9b9d681d2153323a4316ecf08a0fe9f"
85
85
  }
@@ -19,12 +19,14 @@ import {
19
19
  import SafeLink from '@ndla/safelink';
20
20
  import { useTranslation } from 'react-i18next';
21
21
  import MessageBoxTag from '../MessageBox/MessageBoxTag';
22
+ import { useMastheadHeight } from '../Masthead';
22
23
 
23
24
  type WrapperProps = {
24
25
  startOffset?: number;
25
26
  isVisible?: boolean;
26
27
  leftAlign?: boolean;
27
28
  hideOnNarrow?: boolean;
29
+ mastheadHeight?: number;
28
30
  };
29
31
 
30
32
  type InvertItProps = {
@@ -46,11 +48,11 @@ const Wrapper = styled.div<WrapperProps>`
46
48
  width: 240px;
47
49
  position: fixed;
48
50
  left: 22px;
49
- top: 85px;
51
+ top: ${(props) => props.mastheadHeight || 85}px;
50
52
  ${(props) =>
51
53
  props.startOffset &&
52
54
  `
53
- top: calc(${props.startOffset}px + 85px);
55
+ top: calc(${props.startOffset}px + ${props.mastheadHeight || 85}px);
54
56
  `}
55
57
  }
56
58
  ${mq.range({ from: breakpoints.wide })} {
@@ -230,6 +232,8 @@ const Breadcrumblist = ({
230
232
  const [wrapperOffset, setWrapperOffset] = useState(startOffset);
231
233
  const [useScrollEvent, setUseScrollEvent] = useState(false);
232
234
 
235
+ const { height: mastheadHeight } = useMastheadHeight();
236
+
233
237
  useEffect(() => {
234
238
  const handleScroll = () => {
235
239
  let position = 0;
@@ -270,7 +274,12 @@ const Breadcrumblist = ({
270
274
 
271
275
  return (
272
276
  <>
273
- <Wrapper leftAlign={leftAlign} startOffset={wrapperOffset} hideOnNarrow={hideOnNarrow} isVisible={isVisible}>
277
+ <Wrapper
278
+ leftAlign={leftAlign}
279
+ startOffset={wrapperOffset}
280
+ hideOnNarrow={hideOnNarrow}
281
+ isVisible={isVisible}
282
+ mastheadHeight={mastheadHeight}>
274
283
  {items.length > 0 && (
275
284
  <>
276
285
  <Heading invertedStyle={invertedStyle}>{t('breadcrumb.youAreHere')}</Heading>
@@ -0,0 +1,68 @@
1
+ /**
2
+ * Copyright (c) 2022-present, NDLA.
3
+ *
4
+ * This source code is licensed under the GPLv3 license found in the
5
+ * LICENSE file in the root directory of this source tree.
6
+ *
7
+ */
8
+
9
+ import React from 'react';
10
+ import styled from '@emotion/styled';
11
+ import { colors } from '@ndla/core';
12
+
13
+ const Wrapper = styled.div`
14
+ position: fixed;
15
+ z-index: 98;
16
+ top: 0;
17
+ left: 0;
18
+ right: 0;
19
+ `;
20
+
21
+ const Background = styled.div`
22
+ height: 100vh;
23
+ width: 100vw;
24
+ background-color: ${colors.brand.greyLightest};
25
+ `;
26
+
27
+ const Placeholder = styled.div`
28
+ position: absolute;
29
+ display: block;
30
+ height: 100vh;
31
+ width: 100vw;
32
+ margin-top: 86px;
33
+ background-position-x: center;
34
+ background-position-y: 65px;
35
+ background-repeat: no-repeat;
36
+ animation-name: pulseAnimation;
37
+ animation-duration: 1.6s;
38
+ animation-timing-function: ease-in-out;
39
+ animation-iteration-count: infinite;
40
+ @media (max-width: 476px) {
41
+ background-size: 280px 609px;
42
+ background-image: url(data:image/svg+xml;base64,PD94bWwgdmVyc2lvbj0iMS4wIiBlbmNvZGluZz0iVVRGLTgiPz48c3ZnIHdpZHRoPSIyODBweCIgaGVpZ2h0PSI2MDlweCIgdmlld0JveD0iMCAwIDI4MCA2MDkiIHZlcnNpb249IjEuMSIgeG1sbnM9Imh0dHA6Ly93d3cudzMub3JnLzIwMDAvc3ZnIiB4bWxuczp4bGluaz0iaHR0cDovL3d3dy53My5vcmcvMTk5OS94bGluayI+ICAgICAgICA8dGl0bGU+R3JvdXA8L3RpdGxlPiAgICA8ZGVzYz5DcmVhdGVkIHdpdGggU2tldGNoLjwvZGVzYz4gICAgPGRlZnM+PC9kZWZzPiAgICA8ZyBpZD0iUGFnZS0xIiBzdHJva2U9Im5vbmUiIHN0cm9rZS13aWR0aD0iMSIgZmlsbD0ibm9uZSIgZmlsbC1ydWxlPSJldmVub2RkIj4gICAgICAgIDxnIGlkPSJ0aW55IiBmaWxsPSIjRTZFNkU2IiBmaWxsLXJ1bGU9Im5vbnplcm8iPiAgICAgICAgICAgIDxnIGlkPSJHcm91cCI+ICAgICAgICAgICAgICAgIDxyZWN0IGlkPSJSZWN0YW5nbGUtMiIgeD0iMCIgeT0iMjEiIHdpZHRoPSIxNjQuMzA1NTU2IiBoZWlnaHQ9IjMyIj48L3JlY3Q+ICAgICAgICAgICAgICAgIDxyZWN0IGlkPSJSZWN0YW5nbGUtMiIgeD0iMCIgeT0iMCIgd2lkdGg9IjQwLjgzMzMzMzMiIGhlaWdodD0iMTYiPjwvcmVjdD4gICAgICAgICAgICAgICAgPHJlY3QgaWQ9IlJlY3RhbmdsZS0yIiB4PSIwIiB5PSIxODAiIHdpZHRoPSIyODAiIGhlaWdodD0iMjcwIj48L3JlY3Q+ICAgICAgICAgICAgICAgIDxyZWN0IGlkPSJSZWN0YW5nbGUtMiIgeD0iMCIgeT0iNzAiIHdpZHRoPSIyODAiIGhlaWdodD0iMjUiPjwvcmVjdD4gICAgICAgICAgICAgICAgPHJlY3QgaWQ9IlJlY3RhbmdsZS0yIiB4PSIwIiB5PSI5OCIgd2lkdGg9IjI4MCIgaGVpZ2h0PSIyNSI+PC9yZWN0PiAgICAgICAgICAgICAgICA8cmVjdCBpZD0iUmVjdGFuZ2xlLTIiIHg9IjAiIHk9IjEyNSIgd2lkdGg9IjI4MCIgaGVpZ2h0PSIyNSI+PC9yZWN0PiAgICAgICAgICAgICAgICA8cmVjdCBpZD0iUmVjdGFuZ2xlLTIiIHg9IjAiIHk9IjQ4MCIgd2lkdGg9IjI4MCIgaGVpZ2h0PSIxOCI+PC9yZWN0PiAgICAgICAgICAgICAgICA8cmVjdCBpZD0iUmVjdGFuZ2xlLTIiIHg9IjAiIHk9IjUwOCIgd2lkdGg9IjI4MCIgaGVpZ2h0PSIxOCI+PC9yZWN0PiAgICAgICAgICAgICAgICA8cmVjdCBpZD0iUmVjdGFuZ2xlLTIiIHg9IjAiIHk9IjUzNSIgd2lkdGg9IjI4MCIgaGVpZ2h0PSIxOCI+PC9yZWN0PiAgICAgICAgICAgICAgICA8cmVjdCBpZD0iUmVjdGFuZ2xlLTIiIHg9IjAiIHk9IjU2MyIgd2lkdGg9IjI4MCIgaGVpZ2h0PSIxOCI+PC9yZWN0PiAgICAgICAgICAgICAgICA8cmVjdCBpZD0iUmVjdGFuZ2xlLTIiIHg9IjAiIHk9IjU5MSIgd2lkdGg9IjE5Mi41IiBoZWlnaHQ9IjE4Ij48L3JlY3Q+ICAgICAgICAgICAgPC9nPiAgICAgICAgPC9nPiAgICA8L2c+PC9zdmc+);
43
+ }
44
+ @media (min-width: 476px) {
45
+ background-size: 375px 848px;
46
+ background-image: url(data:image/svg+xml;base64,PD94bWwgdmVyc2lvbj0iMS4wIiBlbmNvZGluZz0iVVRGLTgiPz48c3ZnIHdpZHRoPSIzNzVweCIgaGVpZ2h0PSI4NDhweCIgdmlld0JveD0iMCAwIDM3NSA4NDgiIHZlcnNpb249IjEuMSIgeG1sbnM9Imh0dHA6Ly93d3cudzMub3JnLzIwMDAvc3ZnIiB4bWxuczp4bGluaz0iaHR0cDovL3d3dy53My5vcmcvMTk5OS94bGluayI+ICAgICAgICA8dGl0bGU+R3JvdXA8L3RpdGxlPiAgICA8ZGVzYz5DcmVhdGVkIHdpdGggU2tldGNoLjwvZGVzYz4gICAgPGRlZnM+PC9kZWZzPiAgICA8ZyBpZD0iUGFnZS0xIiBzdHJva2U9Im5vbmUiIHN0cm9rZS13aWR0aD0iMSIgZmlsbD0ibm9uZSIgZmlsbC1ydWxlPSJldmVub2RkIj4gICAgICAgIDxnIGlkPSJzbWFsbCIgZmlsbD0iI0U2RTZFNiIgZmlsbC1ydWxlPSJub256ZXJvIj4gICAgICAgICAgICA8ZyBpZD0iR3JvdXAiPiAgICAgICAgICAgICAgICA8cmVjdCBpZD0iUmVjdGFuZ2xlLTIiIHg9IjAiIHk9IjI3IiB3aWR0aD0iMjIwLjU4ODIzNSIgaGVpZ2h0PSI0MiI+PC9yZWN0PiAgICAgICAgICAgICAgICA8cmVjdCBpZD0iUmVjdGFuZ2xlLTIiIHg9IjAiIHk9IjAiIHdpZHRoPSI1NC4xNDQzODUiIGhlaWdodD0iMjEiPjwvcmVjdD4gICAgICAgICAgICAgICAgPHJlY3QgaWQ9IlJlY3RhbmdsZS0yIiB4PSIwIiB5PSIyMTUiIHdpZHRoPSIxMTAuMjk0MTE4IiBoZWlnaHQ9IjIxIj48L3JlY3Q+ICAgICAgICAgICAgICAgIDxyZWN0IGlkPSJSZWN0YW5nbGUtMiIgeD0iMjY0LjcwNTg4MiIgeT0iMjE1IiB3aWR0aD0iMTEwLjI5NDExOCIgaGVpZ2h0PSIyMSI+PC9yZWN0PiAgICAgICAgICAgICAgICA8cmVjdCBpZD0iUmVjdGFuZ2xlLTIiIHg9IjAiIHk9IjI5MCIgd2lkdGg9IjM3NSIgaGVpZ2h0PSIzNTEiPjwvcmVjdD4gICAgICAgICAgICAgICAgPHJlY3QgaWQ9IlJlY3RhbmdsZS0yIiB4PSIwIiB5PSI5MSIgd2lkdGg9IjM3NSIgaGVpZ2h0PSIzMiI+PC9yZWN0PiAgICAgICAgICAgICAgICA8cmVjdCBpZD0iUmVjdGFuZ2xlLTIiIHg9IjAiIHk9IjEyNyIgd2lkdGg9IjM3NSIgaGVpZ2h0PSIzMiI+PC9yZWN0PiAgICAgICAgICAgICAgICA8cmVjdCBpZD0iUmVjdGFuZ2xlLTIiIHg9IjAiIHk9IjE2MyIgd2lkdGg9IjM3NSIgaGVpZ2h0PSIzMiI+PC9yZWN0PiAgICAgICAgICAgICAgICA8cmVjdCBpZD0iUmVjdGFuZ2xlLTIiIHg9IjAiIHk9IjY4MCIgd2lkdGg9IjM3NSIgaGVpZ2h0PSIyNCI+PC9yZWN0PiAgICAgICAgICAgICAgICA8cmVjdCBpZD0iUmVjdGFuZ2xlLTIiIHg9IjAiIHk9IjcxNiIgd2lkdGg9IjM3NSIgaGVpZ2h0PSIyNCI+PC9yZWN0PiAgICAgICAgICAgICAgICA8cmVjdCBpZD0iUmVjdGFuZ2xlLTIiIHg9IjAiIHk9Ijc1MiIgd2lkdGg9IjM3NSIgaGVpZ2h0PSIyNCI+PC9yZWN0PiAgICAgICAgICAgICAgICA8cmVjdCBpZD0iUmVjdGFuZ2xlLTIiIHg9IjAiIHk9Ijc4OCIgd2lkdGg9IjM3NSIgaGVpZ2h0PSIyNCI+PC9yZWN0PiAgICAgICAgICAgICAgICA8cmVjdCBpZD0iUmVjdGFuZ2xlLTIiIHg9IjAiIHk9IjgyNCIgd2lkdGg9IjI1Ny42ODcxNjYiIGhlaWdodD0iMjQiPjwvcmVjdD4gICAgICAgICAgICA8L2c+ICAgICAgICA8L2c+ICAgIDwvZz48L3N2Zz4=);
47
+ }
48
+ @media (min-width: 601px) {
49
+ background-position-y: 95px;
50
+ background-size: 530px 848px;
51
+ background-image: url(data:image/svg+xml;base64,PD94bWwgdmVyc2lvbj0iMS4wIiBlbmNvZGluZz0iVVRGLTgiPz48c3ZnIHdpZHRoPSI1MzBweCIgaGVpZ2h0PSI4NDhweCIgdmlld0JveD0iMCAwIDUzMCA4NDgiIHZlcnNpb249IjEuMSIgeG1sbnM9Imh0dHA6Ly93d3cudzMub3JnLzIwMDAvc3ZnIiB4bWxuczp4bGluaz0iaHR0cDovL3d3dy53My5vcmcvMTk5OS94bGluayI+ICAgICAgICA8dGl0bGU+R3JvdXA8L3RpdGxlPiAgICA8ZGVzYz5DcmVhdGVkIHdpdGggU2tldGNoLjwvZGVzYz4gICAgPGRlZnM+PC9kZWZzPiAgICA8ZyBpZD0iUGFnZS0xIiBzdHJva2U9Im5vbmUiIHN0cm9rZS13aWR0aD0iMSIgZmlsbD0ibm9uZSIgZmlsbC1ydWxlPSJldmVub2RkIj4gICAgICAgIDxnIGlkPSJhcnRpY2xlLW1lZGl1bSIgZmlsbD0iI0U2RTZFNiIgZmlsbC1ydWxlPSJub256ZXJvIj4gICAgICAgICAgICA8ZyBpZD0iR3JvdXAiPiAgICAgICAgICAgICAgICA8cmVjdCBpZD0iUmVjdGFuZ2xlLTIiIHg9IjAiIHk9IjI3IiB3aWR0aD0iMzExIiBoZWlnaHQ9IjQyIj48L3JlY3Q+ICAgICAgICAgICAgICAgIDxyZWN0IGlkPSJSZWN0YW5nbGUtMiIgeD0iMCIgeT0iMCIgd2lkdGg9Ijc3IiBoZWlnaHQ9IjIxIj48L3JlY3Q+ICAgICAgICAgICAgICAgIDxyZWN0IGlkPSJSZWN0YW5nbGUtMiIgeD0iMCIgeT0iMjE1IiB3aWR0aD0iMTU2IiBoZWlnaHQ9IjIxIj48L3JlY3Q+ICAgICAgICAgICAgICAgIDxyZWN0IGlkPSJSZWN0YW5nbGUtMiIgeD0iMzc0IiB5PSIyMTUiIHdpZHRoPSIxNTYiIGhlaWdodD0iMjEiPjwvcmVjdD4gICAgICAgICAgICAgICAgPHJlY3QgaWQ9IlJlY3RhbmdsZS0yIiB4PSIwIiB5PSIyOTAiIHdpZHRoPSI1MzAiIGhlaWdodD0iMzUxIj48L3JlY3Q+ICAgICAgICAgICAgICAgIDxyZWN0IGlkPSJSZWN0YW5nbGUtMiIgeD0iMCIgeT0iOTEiIHdpZHRoPSI1MzAiIGhlaWdodD0iMzIiPjwvcmVjdD4gICAgICAgICAgICAgICAgPHJlY3QgaWQ9IlJlY3RhbmdsZS0yIiB4PSIwIiB5PSIxMjciIHdpZHRoPSI1MzAiIGhlaWdodD0iMzIiPjwvcmVjdD4gICAgICAgICAgICAgICAgPHJlY3QgaWQ9IlJlY3RhbmdsZS0yIiB4PSIwIiB5PSIxNjMiIHdpZHRoPSI1MzAiIGhlaWdodD0iMzIiPjwvcmVjdD4gICAgICAgICAgICAgICAgPHJlY3QgaWQ9IlJlY3RhbmdsZS0yIiB4PSIwIiB5PSI2ODAiIHdpZHRoPSI1MzAiIGhlaWdodD0iMjQiPjwvcmVjdD4gICAgICAgICAgICAgICAgPHJlY3QgaWQ9IlJlY3RhbmdsZS0yIiB4PSIwIiB5PSI3MTYiIHdpZHRoPSI1MzAiIGhlaWdodD0iMjQiPjwvcmVjdD4gICAgICAgICAgICAgICAgPHJlY3QgaWQ9IlJlY3RhbmdsZS0yIiB4PSIwIiB5PSI3NTIiIHdpZHRoPSI1MzAiIGhlaWdodD0iMjQiPjwvcmVjdD4gICAgICAgICAgICAgICAgPHJlY3QgaWQ9IlJlY3RhbmdsZS0yIiB4PSIwIiB5PSI3ODgiIHdpZHRoPSI1MzAiIGhlaWdodD0iMjQiPjwvcmVjdD4gICAgICAgICAgICAgICAgPHJlY3QgaWQ9IlJlY3RhbmdsZS0yIiB4PSIwIiB5PSI4MjQiIHdpZHRoPSIzNjMiIGhlaWdodD0iMjQiPjwvcmVjdD4gICAgICAgICAgICA8L2c+ICAgICAgICA8L2c+ICAgIDwvZz48L3N2Zz4=);
52
+ }
53
+ @media (min-width: 768px) {
54
+ background-size: 624px 848px;
55
+ background-image: url(data:image/svg+xml;base64,PD94bWwgdmVyc2lvbj0iMS4wIiBlbmNvZGluZz0iVVRGLTgiPz48c3ZnIHdpZHRoPSI2MjRweCIgaGVpZ2h0PSI4NDhweCIgdmlld0JveD0iMCAwIDYyNCA4NDgiIHZlcnNpb249IjEuMSIgeG1sbnM9Imh0dHA6Ly93d3cudzMub3JnLzIwMDAvc3ZnIiB4bWxuczp4bGluaz0iaHR0cDovL3d3dy53My5vcmcvMTk5OS94bGluayI+ICAgICAgICA8dGl0bGU+R3JvdXA8L3RpdGxlPiAgICA8ZGVzYz5DcmVhdGVkIHdpdGggU2tldGNoLjwvZGVzYz4gICAgPGRlZnM+PC9kZWZzPiAgICA8ZyBpZD0iUGFnZS0xIiBzdHJva2U9Im5vbmUiIHN0cm9rZS13aWR0aD0iMSIgZmlsbD0ibm9uZSIgZmlsbC1ydWxlPSJldmVub2RkIj4gICAgICAgIDxnIGlkPSJhcnRpY2xlLWxhcmdlIiBmaWxsPSIjRTZFNkU2IiBmaWxsLXJ1bGU9Im5vbnplcm8iPiAgICAgICAgICAgIDxnIGlkPSJHcm91cCI+ICAgICAgICAgICAgICAgIDxyZWN0IGlkPSJSZWN0YW5nbGUtMiIgeD0iMCIgeT0iMjciIHdpZHRoPSIzMjYiIGhlaWdodD0iNDIiPjwvcmVjdD4gICAgICAgICAgICAgICAgPHJlY3QgaWQ9IlJlY3RhbmdsZS0yIiB4PSIwIiB5PSIwIiB3aWR0aD0iODEiIGhlaWdodD0iMjEiPjwvcmVjdD4gICAgICAgICAgICAgICAgPHJlY3QgaWQ9IlJlY3RhbmdsZS0yIiB4PSIwIiB5PSIyMTUiIHdpZHRoPSIxNjMiIGhlaWdodD0iMjEiPjwvcmVjdD4gICAgICAgICAgICAgICAgPHJlY3QgaWQ9IlJlY3RhbmdsZS0yIiB4PSI0NjEiIHk9IjIxNSIgd2lkdGg9IjE2MyIgaGVpZ2h0PSIyMSI+PC9yZWN0PiAgICAgICAgICAgICAgICA8cmVjdCBpZD0iUmVjdGFuZ2xlLTIiIHg9IjAiIHk9IjI5MCIgd2lkdGg9IjYyNCIgaGVpZ2h0PSIzNTEiPjwvcmVjdD4gICAgICAgICAgICAgICAgPHJlY3QgaWQ9IlJlY3RhbmdsZS0yIiB4PSIwIiB5PSI5MSIgd2lkdGg9IjYyNCIgaGVpZ2h0PSIzMiI+PC9yZWN0PiAgICAgICAgICAgICAgICA8cmVjdCBpZD0iUmVjdGFuZ2xlLTIiIHg9IjAiIHk9IjEyNyIgd2lkdGg9IjYyNCIgaGVpZ2h0PSIzMiI+PC9yZWN0PiAgICAgICAgICAgICAgICA8cmVjdCBpZD0iUmVjdGFuZ2xlLTIiIHg9IjAiIHk9IjE2MyIgd2lkdGg9IjYyNCIgaGVpZ2h0PSIzMiI+PC9yZWN0PiAgICAgICAgICAgICAgICA8cmVjdCBpZD0iUmVjdGFuZ2xlLTIiIHg9IjAiIHk9IjY4MCIgd2lkdGg9IjYyNCIgaGVpZ2h0PSIyNCI+PC9yZWN0PiAgICAgICAgICAgICAgICA8cmVjdCBpZD0iUmVjdGFuZ2xlLTIiIHg9IjAiIHk9IjcxNiIgd2lkdGg9IjYyNCIgaGVpZ2h0PSIyNCI+PC9yZWN0PiAgICAgICAgICAgICAgICA8cmVjdCBpZD0iUmVjdGFuZ2xlLTIiIHg9IjAiIHk9Ijc1MiIgd2lkdGg9IjYyNCIgaGVpZ2h0PSIyNCI+PC9yZWN0PiAgICAgICAgICAgICAgICA8cmVjdCBpZD0iUmVjdGFuZ2xlLTIiIHg9IjAiIHk9Ijc4OCIgd2lkdGg9IjYyNCIgaGVpZ2h0PSIyNCI+PC9yZWN0PiAgICAgICAgICAgICAgICA8cmVjdCBpZD0iUmVjdGFuZ2xlLTIiIHg9IjAiIHk9IjgyNCIgd2lkdGg9IjM4MC42NCIgaGVpZ2h0PSIyNCI+PC9yZWN0PiAgICAgICAgICAgIDwvZz4gICAgICAgIDwvZz4gICAgPC9nPjwvc3ZnPg==);
56
+ }
57
+ `;
58
+
59
+ const ContentPlaceholder = () => {
60
+ return (
61
+ <Wrapper>
62
+ <Placeholder />
63
+ <Background />
64
+ </Wrapper>
65
+ );
66
+ };
67
+
68
+ export default ContentPlaceholder;
@@ -0,0 +1,11 @@
1
+ /**
2
+ * Copyright (c) 2022-present, NDLA.
3
+ *
4
+ * This source code is licensed under the GPLv3 license found in the
5
+ * LICENSE file in the root directory of this source tree.
6
+ *
7
+ */
8
+
9
+ import ContentPlaceholder from './ContentPlaceholder';
10
+
11
+ export default ContentPlaceholder;
@@ -6,7 +6,7 @@
6
6
  *
7
7
  */
8
8
 
9
- import React, { ReactNode, MouseEvent, useState } from 'react';
9
+ import React, { ReactNode, MouseEvent } from 'react';
10
10
  import BEMHelper from 'react-bem-helper';
11
11
  import Button from '@ndla/button';
12
12
  import { useTranslation } from 'react-i18next';
@@ -21,23 +21,21 @@ interface Props {
21
21
  children?: ReactNode;
22
22
  }
23
23
 
24
+ const toggleFactBox = (event: MouseEvent<HTMLButtonElement>) => {
25
+ const button = event.currentTarget;
26
+ const aside = button?.previousSibling?.parentElement;
27
+ aside?.classList?.toggle('expanded');
28
+ };
24
29
  const FactBox = ({ children, dangerouslySetInnerHTML }: Props) => {
25
- const [open, setOpen] = useState(false);
26
30
  const { t } = useTranslation();
27
31
 
28
- const toggleFactBox = (event: MouseEvent<HTMLButtonElement>) => {
29
- const button = event.currentTarget;
30
- const aside = button?.previousSibling?.parentElement;
31
- aside?.classList?.toggle('expanded');
32
- setOpen((prev) => !prev);
33
- };
34
-
35
32
  return (
36
33
  <aside {...classes()}>
37
34
  <div {...classes('content')} dangerouslySetInnerHTML={dangerouslySetInnerHTML}>
38
35
  {children}
39
36
  </div>
40
- <Button {...classes('button')} onClick={toggleFactBox} title={t(open ? 'factbox.close' : 'factbox.open')} />
37
+ <Button {...classes('button', 'collapsed')} onClick={toggleFactBox} title={t('factbox.open')} />
38
+ <Button {...classes('button', 'open')} onClick={toggleFactBox} title={t('factbox.close')} />
41
39
  </aside>
42
40
  );
43
41
  };
@@ -82,8 +82,20 @@ $padding-bottom: 17px;
82
82
  transform: rotate(180deg);
83
83
  top: 38%;
84
84
  }
85
+ &__button--open {
86
+ visibility: visible;
87
+ }
88
+ &__button--collapsed {
89
+ visibility: hidden;
90
+ }
85
91
  }
86
92
  }
93
+ &__button--open {
94
+ visibility: hidden;
95
+ }
96
+ &__button--collapsed {
97
+ visibility: visible;
98
+ }
87
99
 
88
100
  &__button {
89
101
  position: absolute;
@@ -144,6 +144,13 @@ const FrontpageSearch = ({
144
144
  }, [inputHasFocus]);
145
145
 
146
146
  const onBlur = () => {
147
+ setTimeout(() => {
148
+ if (searchFieldRef.current) {
149
+ if (!searchFieldRef.current.contains(document.activeElement)) {
150
+ onInputBlur();
151
+ }
152
+ }
153
+ }, 0);
147
154
  // This is needed when user tabs out of field
148
155
  if (!searchFieldValue) {
149
156
  onInputBlur();
@@ -10,6 +10,7 @@ import React, { ReactNode, useEffect, useRef } from 'react';
10
10
  import BEMHelper from 'react-bem-helper';
11
11
  import { WithTranslation, withTranslation } from 'react-i18next';
12
12
  import { DisplayOnPageYOffset } from '../Animation';
13
+ import { MessageBox, MessageBoxType } from '../MessageBox';
13
14
 
14
15
  const classes = new BEMHelper({
15
16
  name: 'masthead',
@@ -42,19 +43,19 @@ const MastheadInfo = ({ children }: MastheadInfoProps) => (
42
43
  interface Props {
43
44
  children?: ReactNode;
44
45
  fixed?: boolean;
45
- showLoaderWhenNeeded?: boolean;
46
46
  infoContent?: ReactNode;
47
47
  ndlaFilm?: boolean;
48
48
  skipToMainContentId?: string;
49
+ messages?: string[];
49
50
  }
50
51
 
51
52
  export const Masthead = ({
52
53
  children,
53
54
  fixed,
54
55
  infoContent,
55
- showLoaderWhenNeeded = true,
56
56
  ndlaFilm,
57
57
  skipToMainContentId,
58
+ messages,
58
59
  t,
59
60
  }: Props & WithTranslation) => {
60
61
  const mastheadRef = useRef<HTMLDivElement>(null);
@@ -84,10 +85,10 @@ export const Masthead = ({
84
85
  {t('masthead.skipToContent')}
85
86
  </a>
86
87
  )}
87
- <div {...classes('placeholder', { infoContent: !!infoContent })} />
88
- <div
89
- {...classes('', { fixed: !!fixed, infoContent: !!infoContent, showLoaderWhenNeeded, ndlaFilm: !!ndlaFilm })}
90
- ref={mastheadRef}>
88
+ <div id="masthead" {...classes('', { fixed: !!fixed, infoContent: !!infoContent, ndlaFilm: !!ndlaFilm })}>
89
+ {messages?.map((message) => (
90
+ <MessageBox type={MessageBoxType.masthead}>{message}</MessageBox>
91
+ ))}
91
92
  {infoContent && (
92
93
  <DisplayOnPageYOffset yOffsetMin={0} yOffsetMax={90}>
93
94
  <MastheadInfo>{infoContent}</MastheadInfo>
@@ -16,7 +16,8 @@
16
16
  height: 1px;
17
17
  overflow: hidden;
18
18
  z-index: -999;
19
- &:focus, &:active {
19
+ &:focus,
20
+ &:active {
20
21
  color: #fff;
21
22
  background: $brand-color;
22
23
  left: auto;
@@ -38,64 +39,12 @@
38
39
 
39
40
  &--fixed {
40
41
  top: 0;
41
- left: 0;
42
- right: 0;
43
- position: fixed;
42
+ position: sticky;
44
43
  @media print {
45
44
  position: relative;
46
45
  }
47
46
  }
48
47
 
49
- &--showLoaderWhenNeeded {
50
- &:last-child {
51
- &:after {
52
- content: '';
53
- display: block;
54
- height: 100vh;
55
- width: 100vw;
56
- background-color: #f9f9f9;
57
- }
58
- &:before {
59
- content: '';
60
- position: absolute;
61
- display: block;
62
- height: 100vh;
63
- width: 100vw;
64
- background-position-x: center;
65
- background-position-y: 65px;
66
- background-repeat: no-repeat;
67
- animation-name: pulseAnimation;
68
- animation-duration: 1.6s;
69
- animation-timing-function: ease-in-out;
70
- animation-iteration-count: infinite;
71
- @include mq($until: mobileWide) {
72
- background-size: 280px 609px;
73
- background-image: url(data:image/svg+xml;base64,PD94bWwgdmVyc2lvbj0iMS4wIiBlbmNvZGluZz0iVVRGLTgiPz48c3ZnIHdpZHRoPSIyODBweCIgaGVpZ2h0PSI2MDlweCIgdmlld0JveD0iMCAwIDI4MCA2MDkiIHZlcnNpb249IjEuMSIgeG1sbnM9Imh0dHA6Ly93d3cudzMub3JnLzIwMDAvc3ZnIiB4bWxuczp4bGluaz0iaHR0cDovL3d3dy53My5vcmcvMTk5OS94bGluayI+ICAgICAgICA8dGl0bGU+R3JvdXA8L3RpdGxlPiAgICA8ZGVzYz5DcmVhdGVkIHdpdGggU2tldGNoLjwvZGVzYz4gICAgPGRlZnM+PC9kZWZzPiAgICA8ZyBpZD0iUGFnZS0xIiBzdHJva2U9Im5vbmUiIHN0cm9rZS13aWR0aD0iMSIgZmlsbD0ibm9uZSIgZmlsbC1ydWxlPSJldmVub2RkIj4gICAgICAgIDxnIGlkPSJ0aW55IiBmaWxsPSIjRTZFNkU2IiBmaWxsLXJ1bGU9Im5vbnplcm8iPiAgICAgICAgICAgIDxnIGlkPSJHcm91cCI+ICAgICAgICAgICAgICAgIDxyZWN0IGlkPSJSZWN0YW5nbGUtMiIgeD0iMCIgeT0iMjEiIHdpZHRoPSIxNjQuMzA1NTU2IiBoZWlnaHQ9IjMyIj48L3JlY3Q+ICAgICAgICAgICAgICAgIDxyZWN0IGlkPSJSZWN0YW5nbGUtMiIgeD0iMCIgeT0iMCIgd2lkdGg9IjQwLjgzMzMzMzMiIGhlaWdodD0iMTYiPjwvcmVjdD4gICAgICAgICAgICAgICAgPHJlY3QgaWQ9IlJlY3RhbmdsZS0yIiB4PSIwIiB5PSIxODAiIHdpZHRoPSIyODAiIGhlaWdodD0iMjcwIj48L3JlY3Q+ICAgICAgICAgICAgICAgIDxyZWN0IGlkPSJSZWN0YW5nbGUtMiIgeD0iMCIgeT0iNzAiIHdpZHRoPSIyODAiIGhlaWdodD0iMjUiPjwvcmVjdD4gICAgICAgICAgICAgICAgPHJlY3QgaWQ9IlJlY3RhbmdsZS0yIiB4PSIwIiB5PSI5OCIgd2lkdGg9IjI4MCIgaGVpZ2h0PSIyNSI+PC9yZWN0PiAgICAgICAgICAgICAgICA8cmVjdCBpZD0iUmVjdGFuZ2xlLTIiIHg9IjAiIHk9IjEyNSIgd2lkdGg9IjI4MCIgaGVpZ2h0PSIyNSI+PC9yZWN0PiAgICAgICAgICAgICAgICA8cmVjdCBpZD0iUmVjdGFuZ2xlLTIiIHg9IjAiIHk9IjQ4MCIgd2lkdGg9IjI4MCIgaGVpZ2h0PSIxOCI+PC9yZWN0PiAgICAgICAgICAgICAgICA8cmVjdCBpZD0iUmVjdGFuZ2xlLTIiIHg9IjAiIHk9IjUwOCIgd2lkdGg9IjI4MCIgaGVpZ2h0PSIxOCI+PC9yZWN0PiAgICAgICAgICAgICAgICA8cmVjdCBpZD0iUmVjdGFuZ2xlLTIiIHg9IjAiIHk9IjUzNSIgd2lkdGg9IjI4MCIgaGVpZ2h0PSIxOCI+PC9yZWN0PiAgICAgICAgICAgICAgICA8cmVjdCBpZD0iUmVjdGFuZ2xlLTIiIHg9IjAiIHk9IjU2MyIgd2lkdGg9IjI4MCIgaGVpZ2h0PSIxOCI+PC9yZWN0PiAgICAgICAgICAgICAgICA8cmVjdCBpZD0iUmVjdGFuZ2xlLTIiIHg9IjAiIHk9IjU5MSIgd2lkdGg9IjE5Mi41IiBoZWlnaHQ9IjE4Ij48L3JlY3Q+ICAgICAgICAgICAgPC9nPiAgICAgICAgPC9nPiAgICA8L2c+PC9zdmc+);
74
- }
75
- @include mq(mobileWide) {
76
- // 475
77
- background-size: 375px 848px;
78
- background-image: url(data:image/svg+xml;base64,PD94bWwgdmVyc2lvbj0iMS4wIiBlbmNvZGluZz0iVVRGLTgiPz48c3ZnIHdpZHRoPSIzNzVweCIgaGVpZ2h0PSI4NDhweCIgdmlld0JveD0iMCAwIDM3NSA4NDgiIHZlcnNpb249IjEuMSIgeG1sbnM9Imh0dHA6Ly93d3cudzMub3JnLzIwMDAvc3ZnIiB4bWxuczp4bGluaz0iaHR0cDovL3d3dy53My5vcmcvMTk5OS94bGluayI+ICAgICAgICA8dGl0bGU+R3JvdXA8L3RpdGxlPiAgICA8ZGVzYz5DcmVhdGVkIHdpdGggU2tldGNoLjwvZGVzYz4gICAgPGRlZnM+PC9kZWZzPiAgICA8ZyBpZD0iUGFnZS0xIiBzdHJva2U9Im5vbmUiIHN0cm9rZS13aWR0aD0iMSIgZmlsbD0ibm9uZSIgZmlsbC1ydWxlPSJldmVub2RkIj4gICAgICAgIDxnIGlkPSJzbWFsbCIgZmlsbD0iI0U2RTZFNiIgZmlsbC1ydWxlPSJub256ZXJvIj4gICAgICAgICAgICA8ZyBpZD0iR3JvdXAiPiAgICAgICAgICAgICAgICA8cmVjdCBpZD0iUmVjdGFuZ2xlLTIiIHg9IjAiIHk9IjI3IiB3aWR0aD0iMjIwLjU4ODIzNSIgaGVpZ2h0PSI0MiI+PC9yZWN0PiAgICAgICAgICAgICAgICA8cmVjdCBpZD0iUmVjdGFuZ2xlLTIiIHg9IjAiIHk9IjAiIHdpZHRoPSI1NC4xNDQzODUiIGhlaWdodD0iMjEiPjwvcmVjdD4gICAgICAgICAgICAgICAgPHJlY3QgaWQ9IlJlY3RhbmdsZS0yIiB4PSIwIiB5PSIyMTUiIHdpZHRoPSIxMTAuMjk0MTE4IiBoZWlnaHQ9IjIxIj48L3JlY3Q+ICAgICAgICAgICAgICAgIDxyZWN0IGlkPSJSZWN0YW5nbGUtMiIgeD0iMjY0LjcwNTg4MiIgeT0iMjE1IiB3aWR0aD0iMTEwLjI5NDExOCIgaGVpZ2h0PSIyMSI+PC9yZWN0PiAgICAgICAgICAgICAgICA8cmVjdCBpZD0iUmVjdGFuZ2xlLTIiIHg9IjAiIHk9IjI5MCIgd2lkdGg9IjM3NSIgaGVpZ2h0PSIzNTEiPjwvcmVjdD4gICAgICAgICAgICAgICAgPHJlY3QgaWQ9IlJlY3RhbmdsZS0yIiB4PSIwIiB5PSI5MSIgd2lkdGg9IjM3NSIgaGVpZ2h0PSIzMiI+PC9yZWN0PiAgICAgICAgICAgICAgICA8cmVjdCBpZD0iUmVjdGFuZ2xlLTIiIHg9IjAiIHk9IjEyNyIgd2lkdGg9IjM3NSIgaGVpZ2h0PSIzMiI+PC9yZWN0PiAgICAgICAgICAgICAgICA8cmVjdCBpZD0iUmVjdGFuZ2xlLTIiIHg9IjAiIHk9IjE2MyIgd2lkdGg9IjM3NSIgaGVpZ2h0PSIzMiI+PC9yZWN0PiAgICAgICAgICAgICAgICA8cmVjdCBpZD0iUmVjdGFuZ2xlLTIiIHg9IjAiIHk9IjY4MCIgd2lkdGg9IjM3NSIgaGVpZ2h0PSIyNCI+PC9yZWN0PiAgICAgICAgICAgICAgICA8cmVjdCBpZD0iUmVjdGFuZ2xlLTIiIHg9IjAiIHk9IjcxNiIgd2lkdGg9IjM3NSIgaGVpZ2h0PSIyNCI+PC9yZWN0PiAgICAgICAgICAgICAgICA8cmVjdCBpZD0iUmVjdGFuZ2xlLTIiIHg9IjAiIHk9Ijc1MiIgd2lkdGg9IjM3NSIgaGVpZ2h0PSIyNCI+PC9yZWN0PiAgICAgICAgICAgICAgICA8cmVjdCBpZD0iUmVjdGFuZ2xlLTIiIHg9IjAiIHk9Ijc4OCIgd2lkdGg9IjM3NSIgaGVpZ2h0PSIyNCI+PC9yZWN0PiAgICAgICAgICAgICAgICA8cmVjdCBpZD0iUmVjdGFuZ2xlLTIiIHg9IjAiIHk9IjgyNCIgd2lkdGg9IjI1Ny42ODcxNjYiIGhlaWdodD0iMjQiPjwvcmVjdD4gICAgICAgICAgICA8L2c+ICAgICAgICA8L2c+ICAgIDwvZz48L3N2Zz4=);
79
- }
80
- @include mq(tablet) {
81
- // 600
82
- background-position-y: 95px;
83
- background-size: 530px 848px;
84
- background-image: url(data:image/svg+xml;base64,PD94bWwgdmVyc2lvbj0iMS4wIiBlbmNvZGluZz0iVVRGLTgiPz48c3ZnIHdpZHRoPSI1MzBweCIgaGVpZ2h0PSI4NDhweCIgdmlld0JveD0iMCAwIDUzMCA4NDgiIHZlcnNpb249IjEuMSIgeG1sbnM9Imh0dHA6Ly93d3cudzMub3JnLzIwMDAvc3ZnIiB4bWxuczp4bGluaz0iaHR0cDovL3d3dy53My5vcmcvMTk5OS94bGluayI+ICAgICAgICA8dGl0bGU+R3JvdXA8L3RpdGxlPiAgICA8ZGVzYz5DcmVhdGVkIHdpdGggU2tldGNoLjwvZGVzYz4gICAgPGRlZnM+PC9kZWZzPiAgICA8ZyBpZD0iUGFnZS0xIiBzdHJva2U9Im5vbmUiIHN0cm9rZS13aWR0aD0iMSIgZmlsbD0ibm9uZSIgZmlsbC1ydWxlPSJldmVub2RkIj4gICAgICAgIDxnIGlkPSJhcnRpY2xlLW1lZGl1bSIgZmlsbD0iI0U2RTZFNiIgZmlsbC1ydWxlPSJub256ZXJvIj4gICAgICAgICAgICA8ZyBpZD0iR3JvdXAiPiAgICAgICAgICAgICAgICA8cmVjdCBpZD0iUmVjdGFuZ2xlLTIiIHg9IjAiIHk9IjI3IiB3aWR0aD0iMzExIiBoZWlnaHQ9IjQyIj48L3JlY3Q+ICAgICAgICAgICAgICAgIDxyZWN0IGlkPSJSZWN0YW5nbGUtMiIgeD0iMCIgeT0iMCIgd2lkdGg9Ijc3IiBoZWlnaHQ9IjIxIj48L3JlY3Q+ICAgICAgICAgICAgICAgIDxyZWN0IGlkPSJSZWN0YW5nbGUtMiIgeD0iMCIgeT0iMjE1IiB3aWR0aD0iMTU2IiBoZWlnaHQ9IjIxIj48L3JlY3Q+ICAgICAgICAgICAgICAgIDxyZWN0IGlkPSJSZWN0YW5nbGUtMiIgeD0iMzc0IiB5PSIyMTUiIHdpZHRoPSIxNTYiIGhlaWdodD0iMjEiPjwvcmVjdD4gICAgICAgICAgICAgICAgPHJlY3QgaWQ9IlJlY3RhbmdsZS0yIiB4PSIwIiB5PSIyOTAiIHdpZHRoPSI1MzAiIGhlaWdodD0iMzUxIj48L3JlY3Q+ICAgICAgICAgICAgICAgIDxyZWN0IGlkPSJSZWN0YW5nbGUtMiIgeD0iMCIgeT0iOTEiIHdpZHRoPSI1MzAiIGhlaWdodD0iMzIiPjwvcmVjdD4gICAgICAgICAgICAgICAgPHJlY3QgaWQ9IlJlY3RhbmdsZS0yIiB4PSIwIiB5PSIxMjciIHdpZHRoPSI1MzAiIGhlaWdodD0iMzIiPjwvcmVjdD4gICAgICAgICAgICAgICAgPHJlY3QgaWQ9IlJlY3RhbmdsZS0yIiB4PSIwIiB5PSIxNjMiIHdpZHRoPSI1MzAiIGhlaWdodD0iMzIiPjwvcmVjdD4gICAgICAgICAgICAgICAgPHJlY3QgaWQ9IlJlY3RhbmdsZS0yIiB4PSIwIiB5PSI2ODAiIHdpZHRoPSI1MzAiIGhlaWdodD0iMjQiPjwvcmVjdD4gICAgICAgICAgICAgICAgPHJlY3QgaWQ9IlJlY3RhbmdsZS0yIiB4PSIwIiB5PSI3MTYiIHdpZHRoPSI1MzAiIGhlaWdodD0iMjQiPjwvcmVjdD4gICAgICAgICAgICAgICAgPHJlY3QgaWQ9IlJlY3RhbmdsZS0yIiB4PSIwIiB5PSI3NTIiIHdpZHRoPSI1MzAiIGhlaWdodD0iMjQiPjwvcmVjdD4gICAgICAgICAgICAgICAgPHJlY3QgaWQ9IlJlY3RhbmdsZS0yIiB4PSIwIiB5PSI3ODgiIHdpZHRoPSI1MzAiIGhlaWdodD0iMjQiPjwvcmVjdD4gICAgICAgICAgICAgICAgPHJlY3QgaWQ9IlJlY3RhbmdsZS0yIiB4PSIwIiB5PSI4MjQiIHdpZHRoPSIzNjMiIGhlaWdodD0iMjQiPjwvcmVjdD4gICAgICAgICAgICA8L2c+ICAgICAgICA8L2c+ICAgIDwvZz48L3N2Zz4=);
85
- }
86
- @include mq(tabletWide) {
87
- // 767
88
- background-size: 624px 848px;
89
- background-image: url(data:image/svg+xml;base64,PD94bWwgdmVyc2lvbj0iMS4wIiBlbmNvZGluZz0iVVRGLTgiPz48c3ZnIHdpZHRoPSI2MjRweCIgaGVpZ2h0PSI4NDhweCIgdmlld0JveD0iMCAwIDYyNCA4NDgiIHZlcnNpb249IjEuMSIgeG1sbnM9Imh0dHA6Ly93d3cudzMub3JnLzIwMDAvc3ZnIiB4bWxuczp4bGluaz0iaHR0cDovL3d3dy53My5vcmcvMTk5OS94bGluayI+ICAgICAgICA8dGl0bGU+R3JvdXA8L3RpdGxlPiAgICA8ZGVzYz5DcmVhdGVkIHdpdGggU2tldGNoLjwvZGVzYz4gICAgPGRlZnM+PC9kZWZzPiAgICA8ZyBpZD0iUGFnZS0xIiBzdHJva2U9Im5vbmUiIHN0cm9rZS13aWR0aD0iMSIgZmlsbD0ibm9uZSIgZmlsbC1ydWxlPSJldmVub2RkIj4gICAgICAgIDxnIGlkPSJhcnRpY2xlLWxhcmdlIiBmaWxsPSIjRTZFNkU2IiBmaWxsLXJ1bGU9Im5vbnplcm8iPiAgICAgICAgICAgIDxnIGlkPSJHcm91cCI+ICAgICAgICAgICAgICAgIDxyZWN0IGlkPSJSZWN0YW5nbGUtMiIgeD0iMCIgeT0iMjciIHdpZHRoPSIzMjYiIGhlaWdodD0iNDIiPjwvcmVjdD4gICAgICAgICAgICAgICAgPHJlY3QgaWQ9IlJlY3RhbmdsZS0yIiB4PSIwIiB5PSIwIiB3aWR0aD0iODEiIGhlaWdodD0iMjEiPjwvcmVjdD4gICAgICAgICAgICAgICAgPHJlY3QgaWQ9IlJlY3RhbmdsZS0yIiB4PSIwIiB5PSIyMTUiIHdpZHRoPSIxNjMiIGhlaWdodD0iMjEiPjwvcmVjdD4gICAgICAgICAgICAgICAgPHJlY3QgaWQ9IlJlY3RhbmdsZS0yIiB4PSI0NjEiIHk9IjIxNSIgd2lkdGg9IjE2MyIgaGVpZ2h0PSIyMSI+PC9yZWN0PiAgICAgICAgICAgICAgICA8cmVjdCBpZD0iUmVjdGFuZ2xlLTIiIHg9IjAiIHk9IjI5MCIgd2lkdGg9IjYyNCIgaGVpZ2h0PSIzNTEiPjwvcmVjdD4gICAgICAgICAgICAgICAgPHJlY3QgaWQ9IlJlY3RhbmdsZS0yIiB4PSIwIiB5PSI5MSIgd2lkdGg9IjYyNCIgaGVpZ2h0PSIzMiI+PC9yZWN0PiAgICAgICAgICAgICAgICA8cmVjdCBpZD0iUmVjdGFuZ2xlLTIiIHg9IjAiIHk9IjEyNyIgd2lkdGg9IjYyNCIgaGVpZ2h0PSIzMiI+PC9yZWN0PiAgICAgICAgICAgICAgICA8cmVjdCBpZD0iUmVjdGFuZ2xlLTIiIHg9IjAiIHk9IjE2MyIgd2lkdGg9IjYyNCIgaGVpZ2h0PSIzMiI+PC9yZWN0PiAgICAgICAgICAgICAgICA8cmVjdCBpZD0iUmVjdGFuZ2xlLTIiIHg9IjAiIHk9IjY4MCIgd2lkdGg9IjYyNCIgaGVpZ2h0PSIyNCI+PC9yZWN0PiAgICAgICAgICAgICAgICA8cmVjdCBpZD0iUmVjdGFuZ2xlLTIiIHg9IjAiIHk9IjcxNiIgd2lkdGg9IjYyNCIgaGVpZ2h0PSIyNCI+PC9yZWN0PiAgICAgICAgICAgICAgICA8cmVjdCBpZD0iUmVjdGFuZ2xlLTIiIHg9IjAiIHk9Ijc1MiIgd2lkdGg9IjYyNCIgaGVpZ2h0PSIyNCI+PC9yZWN0PiAgICAgICAgICAgICAgICA8cmVjdCBpZD0iUmVjdGFuZ2xlLTIiIHg9IjAiIHk9Ijc4OCIgd2lkdGg9IjYyNCIgaGVpZ2h0PSIyNCI+PC9yZWN0PiAgICAgICAgICAgICAgICA8cmVjdCBpZD0iUmVjdGFuZ2xlLTIiIHg9IjAiIHk9IjgyNCIgd2lkdGg9IjM4MC42NCIgaGVpZ2h0PSIyNCI+PC9yZWN0PiAgICAgICAgICAgIDwvZz4gICAgICAgIDwvZz4gICAgPC9nPjwvc3ZnPg==);
90
- }
91
- }
92
- }
93
- &:not(:last-child) ~ div {
94
- animation-name: fadeIn;
95
- animation-duration: 150ms;
96
- }
97
- }
98
-
99
48
  &--ndlaFilm {
100
49
  background: $film-color-light;
101
50
  background-image: linear-gradient(0deg, $film-color-light, $film-color);
@@ -110,14 +59,6 @@
110
59
  }
111
60
  }
112
61
 
113
- &__placeholder {
114
- min-height: $masthead-height;
115
- width: 100%;
116
- @media print {
117
- min-height: revert;
118
- }
119
- }
120
-
121
62
  &__content {
122
63
  justify-content: center;
123
64
  align-items: center;
@@ -8,6 +8,8 @@
8
8
 
9
9
  import Masthead, { MastheadItem } from './Masthead';
10
10
 
11
- export { MastheadItem };
11
+ import { getMastheadHeight, useMastheadHeight } from './utils';
12
+
13
+ export { MastheadItem, getMastheadHeight, useMastheadHeight };
12
14
 
13
15
  export default Masthead;
@@ -0,0 +1,33 @@
1
+ /**
2
+ * Copyright (c) 2022-present, NDLA.
3
+ *
4
+ * This source code is licensed under the GPLv3 license found in the
5
+ * LICENSE file in the root directory of this source tree.
6
+ *
7
+ */
8
+
9
+ import { useState } from 'react';
10
+ import { resizeObserver } from '@ndla/util';
11
+
12
+ export const getMastheadHeight = (): number | undefined => {
13
+ const masthead = document.getElementById('masthead');
14
+ return masthead?.getBoundingClientRect().height;
15
+ };
16
+
17
+ export const useMastheadHeight = () => {
18
+ const [height, setHeight] = useState<number>();
19
+ const masthead = document.getElementById('masthead');
20
+
21
+ const handleHeightChange = (el: HTMLElement) => {
22
+ const newHeight = el.getBoundingClientRect().height;
23
+ setHeight(newHeight);
24
+ };
25
+
26
+ if (masthead) {
27
+ resizeObserver(masthead, handleHeightChange);
28
+ }
29
+
30
+ return {
31
+ height,
32
+ };
33
+ };
@@ -18,6 +18,7 @@ export enum MessageBoxType {
18
18
  ghost = 'ghost',
19
19
  fullpage = 'fullpage',
20
20
  medium = 'medium',
21
+ masthead = 'masthead',
21
22
  }
22
23
  type WrapperProps = {
23
24
  boxType?: MessageBoxType;
@@ -51,7 +52,10 @@ const StyleByType = (type: WrapperProps['boxType']) => {
51
52
  styles.backgroundColor = 'transparent';
52
53
  styles.border = '1px solid #D1D6DB';
53
54
  styles.color = '#444444';
54
-
55
+ break;
56
+ case 'masthead':
57
+ styles.margin = '0 auto';
58
+ styles.display = 'none';
55
59
  break;
56
60
  }
57
61
  return styles;
@@ -52,31 +52,33 @@ const FigureNotion = ({
52
52
  {({ typeClass }) => (
53
53
  <>
54
54
  {typeof children === 'function' ? children({ typeClass }) : children}
55
- <FigureCaption
56
- hideFigcaption={hideFigCaption}
57
- figureId={figureId}
58
- id={id}
59
- caption={title}
60
- reuseLabel={t(`${type}.reuse`)}
61
- authors={contributors}
62
- licenseRights={license.rights}>
63
- <FigureLicenseDialog
55
+ {copyright?.license?.license && (
56
+ <FigureCaption
57
+ hideFigcaption={hideFigCaption}
58
+ figureId={figureId}
64
59
  id={id}
60
+ caption={title}
61
+ reuseLabel={t(`${type}.reuse`)}
65
62
  authors={contributors}
66
- locale={i18n.language}
67
- title={title}
68
- origin={copyright?.origin}
69
- license={license}
70
- messages={{
71
- close: t('close'),
72
- rulesForUse: t('license.concept.rules'),
73
- source: t('source'),
74
- learnAboutLicenses: t('license.learnMore'),
75
- title: t('title'),
76
- }}>
77
- {type === 'image' && <Button outline>{t('license.copyTitle')}</Button>}
78
- </FigureLicenseDialog>
79
- </FigureCaption>
63
+ licenseRights={license.rights}>
64
+ <FigureLicenseDialog
65
+ id={id}
66
+ authors={contributors}
67
+ locale={i18n.language}
68
+ title={title}
69
+ origin={copyright?.origin}
70
+ license={license}
71
+ messages={{
72
+ close: t('close'),
73
+ rulesForUse: t('license.concept.rules'),
74
+ source: t('source'),
75
+ learnAboutLicenses: t('license.learnMore'),
76
+ title: t('title'),
77
+ }}>
78
+ {type === 'image' && <Button outline>{t('license.copyTitle')}</Button>}
79
+ </FigureLicenseDialog>
80
+ </FigureCaption>
81
+ )}
80
82
  </>
81
83
  )}
82
84
  </Figure>
@@ -130,6 +130,7 @@ const ContentTypeResult = ({
130
130
  return (
131
131
  <StyledListItem key={path} delayAnimation={delayAnimation}>
132
132
  <SafeLink
133
+ tabIndex={-1}
133
134
  css={shouldHighlight && highlightStyle}
134
135
  data-highlighted={shouldHighlight || false}
135
136
  {...linkProps}
@@ -153,7 +154,8 @@ const ContentTypeResult = ({
153
154
  ghostPill
154
155
  css={[showAllButtonStyle, shouldHighlightShowAllButton && noWidthhighlightStyle]}
155
156
  data-highlighted={shouldHighlightShowAllButton}
156
- onClick={() => toggleShowAll(!showAll)}>
157
+ onClick={() => toggleShowAll(!showAll)}
158
+ tabIndex={-1}>
157
159
  {showAll ? messages.showLessResultLabel : messages.allResultLabel}
158
160
  {showAll ? <ChevronUp /> : <ChevronDown />}
159
161
  </Button>
@@ -123,7 +123,8 @@ const SearchField = ({
123
123
  if (inputRef) {
124
124
  inputRef.current.focus();
125
125
  }
126
- }}>
126
+ }}
127
+ onBlur={onBlur}>
127
128
  {t('welcomePage.resetSearch')}
128
129
  </button>
129
130
  )}