@ndla/ui 12.0.1 → 13.0.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 (59) hide show
  1. package/es/Breadcrumb/Breadcrumb.js +101 -24
  2. package/es/Breadcrumb/BreadcrumbItem.js +70 -18
  3. package/es/Breadcrumb/HeaderBreadcrumb.js +63 -0
  4. package/es/Breadcrumb/HomeBreadcrumb.js +117 -0
  5. package/es/Breadcrumb/index.js +2 -1
  6. package/es/Breadcrumblist/index.js +1 -2
  7. package/es/all.css +1 -1
  8. package/es/index.js +1 -1
  9. package/es/locale/messages-en.js +59 -18
  10. package/es/locale/messages-nb.js +58 -17
  11. package/es/locale/messages-nn.js +59 -18
  12. package/es/locale/messages-se.js +56 -15
  13. package/es/locale/messages-sma.js +56 -15
  14. package/lib/Breadcrumb/Breadcrumb.d.ts +10 -12
  15. package/lib/Breadcrumb/Breadcrumb.js +104 -32
  16. package/lib/Breadcrumb/BreadcrumbItem.d.ts +15 -7
  17. package/lib/Breadcrumb/BreadcrumbItem.js +68 -20
  18. package/lib/Breadcrumb/HeaderBreadcrumb.d.ts +14 -0
  19. package/lib/Breadcrumb/HeaderBreadcrumb.js +76 -0
  20. package/lib/Breadcrumb/HomeBreadcrumb.d.ts +15 -0
  21. package/lib/Breadcrumb/HomeBreadcrumb.js +127 -0
  22. package/lib/Breadcrumb/index.d.ts +3 -1
  23. package/lib/Breadcrumb/index.js +11 -3
  24. package/lib/Breadcrumblist/index.js +0 -1
  25. package/lib/all.css +1 -1
  26. package/lib/index.d.ts +2 -1
  27. package/lib/index.js +10 -3
  28. package/lib/locale/messages-en.d.ts +43 -2
  29. package/lib/locale/messages-en.js +59 -18
  30. package/lib/locale/messages-nb.d.ts +43 -2
  31. package/lib/locale/messages-nb.js +58 -17
  32. package/lib/locale/messages-nn.d.ts +43 -2
  33. package/lib/locale/messages-nn.js +59 -18
  34. package/lib/locale/messages-se.d.ts +43 -2
  35. package/lib/locale/messages-se.js +56 -15
  36. package/lib/locale/messages-sma.d.ts +44 -3
  37. package/lib/locale/messages-sma.js +56 -15
  38. package/package.json +10 -10
  39. package/src/Breadcrumb/Breadcrumb.tsx +76 -40
  40. package/src/Breadcrumb/BreadcrumbItem.tsx +82 -18
  41. package/src/Breadcrumb/HeaderBreadcrumb.tsx +67 -0
  42. package/src/Breadcrumb/HomeBreadcrumb.tsx +88 -0
  43. package/src/Breadcrumb/index.ts +5 -1
  44. package/src/Breadcrumblist/index.tsx +0 -1
  45. package/src/index.ts +2 -1
  46. package/src/locale/__tests__/translations-test.ts +10 -0
  47. package/src/locale/messages-en.ts +55 -14
  48. package/src/locale/messages-nb.ts +54 -13
  49. package/src/locale/messages-nn.ts +56 -15
  50. package/src/locale/messages-se.ts +52 -11
  51. package/src/locale/messages-sma.ts +53 -12
  52. package/src/main.scss +0 -2
  53. package/es/Breadcrumb/BreadcrumbBlock.js +0 -90
  54. package/lib/Breadcrumb/BreadcrumbBlock.d.ts +0 -15
  55. package/lib/Breadcrumb/BreadcrumbBlock.js +0 -105
  56. package/src/.DS_Store +0 -0
  57. package/src/Breadcrumb/BreadcrumbBlock.tsx +0 -80
  58. package/src/Breadcrumb/component.breadcrumb-block.scss +0 -98
  59. package/src/Breadcrumb/component.breadcrumb.scss +0 -104
@@ -442,7 +442,7 @@ const messages = {
442
442
  rules: 'Regler for bruk av bildet:',
443
443
  },
444
444
  images: {
445
- heading: 'Slik bruker du bilder fra artikkelen',
445
+ heading: 'Slik gjenbruker du bilder',
446
446
  description: 'Husk å kopiere teksten som skal legges ved bildet der du bruker det.',
447
447
  rules: 'Regler for bruk av bildet:',
448
448
  itemImage: {
@@ -456,18 +456,18 @@ const messages = {
456
456
  title: 'Tittel',
457
457
  },
458
458
  text: {
459
- heading: 'Slik bruker du tekst fra artikkelen',
459
+ heading: 'Slik gjenbruker du teksten',
460
460
  description: 'Husk å henvise til kilden når du gjenbruker tekst.',
461
461
  rules: 'Regler for bruk av teksten:',
462
462
  published: 'Publiseringsdato',
463
463
  },
464
464
  audio: {
465
- heading: 'Slik bruker du lydfiler',
465
+ heading: 'Slik gjenbruker du lydfiler',
466
466
  description: 'Husk å kopiere teksten som skal legges ved lydfilen der du bruker den.',
467
467
  rules: 'Regler for bruk av lydfilen:',
468
468
  },
469
469
  video: {
470
- heading: 'Slik bruker du video fra artikkelen',
470
+ heading: 'Slik gjenbruker du videoer',
471
471
  description: 'Husk å kopiere teksten som skal legges ved videoen der du bruker den.',
472
472
  rules: 'Regler for bruk av videoen:',
473
473
  itemImage: {
@@ -475,31 +475,42 @@ const messages = {
475
475
  },
476
476
  },
477
477
  other: {
478
- heading: 'Slik bruker du annet innhold fra artikkelen',
478
+ heading: 'Slik gjenbruker du annet innhold',
479
479
  description: 'Du finner retningslinjene for bruk av innholdet i innholdselementet',
480
480
  itemImage: {
481
481
  ariaLabel: 'Åpne i nytt vindu',
482
482
  },
483
483
  },
484
484
  h5p: {
485
- heading: 'Slik bruker du H5P-innhold fra artikkelen',
485
+ heading: 'Slik gjenbruker du H5P-innhold',
486
486
  description: 'Du finner retningslinjene for bruk av innholdet i H5P-elementet',
487
487
  rules: 'Regler for bruk av H5P:',
488
488
  },
489
489
  concept: {
490
- heading: 'Slik bruker du forklaringer fra artikkelen',
490
+ embedlink: {
491
+ heading: 'Slik viser du forklaringa i anna innhald',
492
+ description: 'Denne lenka viser forklaringa utan kontekst (meny og botntekst)',
493
+ copyTitle: 'Kopier innbyggingslenke',
494
+ hasCopiedTitle: 'Innbyggingslenke kopiert',
495
+ },
496
+ heading: 'Slik gjenbruker du forklaringer',
491
497
  description: 'Du finner retningslinjene for bruk av innholdet i forklaring-elementet',
492
498
  rules: 'Regler for bruk av forklaring:',
493
499
  title: 'Tittel',
494
500
  },
495
501
  files: {
496
- heading: 'Slik bruker du filer fra artikkelen',
502
+ heading: 'Slik gjenbruker du filer',
497
503
  description: 'Husk å kopier teksten som skal legges ved filen der du bruker den.',
498
504
  rules: 'Regler for bruk av filen:',
499
505
  itemImage: {
500
506
  ariaLabel: 'Åpne i nytt vindu',
501
507
  },
502
508
  },
509
+ title: 'Tittel',
510
+ originator: 'Opphavar',
511
+ rightsholder: 'Rettshavar',
512
+ source: 'Kjelde',
513
+ published: 'Publiseringsdato',
503
514
  },
504
515
  errorMessage: {
505
516
  title: 'Ops, noe gikk galt',
@@ -530,8 +541,10 @@ const messages = {
530
541
  newsletterAria: 'Meld deg på vårt nyhetsbrev',
531
542
  youtube: 'NDLA på YouTube',
532
543
  youtubeAria: 'NDLA på YouTube',
533
- twitter: 'NDLA på Twitter',
534
- twitterAria: 'Besøk NDLA på Twitter',
544
+ linkedin: 'NDLA på LinkedIn',
545
+ linkedinAria: 'Besøk NDLA på LinkedIn',
546
+ instagram: 'NDLA på Instagram',
547
+ instagramAria: 'Besøk NDLA på Instagram',
535
548
  sharePage: 'Del denne siden',
536
549
  sharePageAria: 'Del denne siden',
537
550
  },
@@ -594,6 +607,10 @@ const messages = {
594
607
  search: {
595
608
  placeholder: 'Søk',
596
609
  },
610
+ embedlink: {
611
+ copyTitle: 'Kopier innbyggingskode',
612
+ hasCopiedTitle: 'Innbyggingskode kopiert',
613
+ },
597
614
  filters: {
598
615
  subject: {
599
616
  useFilter: 'Bruk filter',
@@ -610,6 +627,7 @@ const messages = {
610
627
  openFilter: 'Filtrer',
611
628
  closeFilter: 'Lukk filter',
612
629
  heading: 'Filter',
630
+ filteredBy: 'Filtrert på',
613
631
  },
614
632
  alphabet: {
615
633
  letterFilter: 'Vis innhald på (bokstaven) {{letter}}.',
@@ -765,6 +783,14 @@ const messages = {
765
783
  createdBy: {
766
784
  content: 'Ressursen',
767
785
  text: 'er hentet fra',
786
+ concept: {
787
+ content: 'Forklaringa',
788
+ text: 'er utarbeida av',
789
+ },
790
+ listing: {
791
+ content: 'Lista',
792
+ text: 'er utarbeida av',
793
+ },
768
794
  },
769
795
  fagfornyelse: {
770
796
  frontpage: {
@@ -797,7 +823,7 @@ const messages = {
797
823
  frontpageMenu: {
798
824
  program: 'Utdanningsprogram',
799
825
  allsubjects: 'Alle fag',
800
- cursorText: 'Se smakebiter fra fag som kommer høsten 2022.',
826
+ cursorText: 'Se smakebiter fra fag under utvikling.',
801
827
  },
802
828
  navigation: {
803
829
  showLongerDescription: 'Vis hele emnebeskrivelsen',
@@ -818,7 +844,7 @@ const messages = {
818
844
  title: 'Tittel',
819
845
  image: {
820
846
  altText: 'Alt-tekst',
821
- imageText: 'Bilettekst',
847
+ caption: 'Bilettekst',
822
848
  type: 'Filtype',
823
849
  width: 'Breidde',
824
850
  height: 'Høgde',
@@ -938,6 +964,21 @@ const messages = {
938
964
  favourites: 'Favoritter',
939
965
  help: 'Hjelp',
940
966
  },
967
+ labels: {
968
+ category: 'Kategori',
969
+ subject: 'Fag',
970
+ other: 'Anna',
971
+ },
972
+ listingPage: {
973
+ or: 'eller',
974
+ noFilters: 'Har ikkje noko å filtrera',
975
+ loadMore: 'Last meir',
976
+ },
977
+ siteNav: {
978
+ search: 'Søk',
979
+ contact: 'Kontakt',
980
+ help: 'Hjelp',
981
+ },
941
982
  };
942
983
 
943
984
  export default messages;
package/src/main.scss CHANGED
@@ -8,8 +8,6 @@
8
8
  @import 'Article/component.article-author-popup';
9
9
 
10
10
  @import 'global/components/component.bodybox';
11
- @import 'Breadcrumb/component.breadcrumb';
12
- @import 'Breadcrumb/component.breadcrumb-block';
13
11
  @import 'global/components/component.story-intro';
14
12
  @import 'Figure/component.figure';
15
13
  @import 'Figure/component.figure-license';
@@ -1,90 +0,0 @@
1
- function _extends() { _extends = Object.assign || function (target) { for (var i = 1; i < arguments.length; i++) { var source = arguments[i]; for (var key in source) { if (Object.prototype.hasOwnProperty.call(source, key)) { target[key] = source[key]; } } } return target; }; return _extends.apply(this, arguments); }
2
-
3
- function _slicedToArray(arr, i) { return _arrayWithHoles(arr) || _iterableToArrayLimit(arr, i) || _unsupportedIterableToArray(arr, i) || _nonIterableRest(); }
4
-
5
- function _nonIterableRest() { throw new TypeError("Invalid attempt to destructure non-iterable instance.\nIn order to be iterable, non-array objects must have a [Symbol.iterator]() method."); }
6
-
7
- function _unsupportedIterableToArray(o, minLen) { if (!o) return; if (typeof o === "string") return _arrayLikeToArray(o, minLen); var n = Object.prototype.toString.call(o).slice(8, -1); if (n === "Object" && o.constructor) n = o.constructor.name; if (n === "Map" || n === "Set") return Array.from(o); if (n === "Arguments" || /^(?:Ui|I)nt(?:8|16|32)(?:Clamped)?Array$/.test(n)) return _arrayLikeToArray(o, minLen); }
8
-
9
- function _arrayLikeToArray(arr, len) { if (len == null || len > arr.length) len = arr.length; for (var i = 0, arr2 = new Array(len); i < len; i++) { arr2[i] = arr[i]; } return arr2; }
10
-
11
- function _iterableToArrayLimit(arr, i) { if (typeof Symbol === "undefined" || !(Symbol.iterator in Object(arr))) return; var _arr = []; var _n = true; var _d = false; var _e = undefined; try { for (var _i = arr[Symbol.iterator](), _s; !(_n = (_s = _i.next()).done); _n = true) { _arr.push(_s.value); if (i && _arr.length === i) break; } } catch (err) { _d = true; _e = err; } finally { try { if (!_n && _i["return"] != null) _i["return"](); } finally { if (_d) throw _e; } } return _arr; }
12
-
13
- function _arrayWithHoles(arr) { if (Array.isArray(arr)) return arr; }
14
-
15
- /**
16
- * Copyright (c) 2019-present, NDLA.
17
- *
18
- * This source code is licensed under the GPLv3 license found in the
19
- * LICENSE file in the root directory of this source tree.
20
- *
21
- */
22
- import React, { useRef } from 'react';
23
- import BEMHelper from 'react-bem-helper';
24
- import { useComponentSize, useIsomorphicLayoutEffect } from '@ndla/hooks';
25
- import { useTranslation } from 'react-i18next';
26
- import BreadcrumbItem from './BreadcrumbItem';
27
- import { jsx as ___EmotionJSX } from "@emotion/core";
28
- var classes = BEMHelper({
29
- name: 'breadcrumb-block',
30
- prefix: 'c-'
31
- });
32
-
33
- var BreadcrumbBlock = function BreadcrumbBlock(_ref) {
34
- var children = _ref.children,
35
- items = _ref.items;
36
-
37
- var _useTranslation = useTranslation(),
38
- t = _useTranslation.t;
39
-
40
- var olRef = useRef();
41
- var containerRef = useRef(null); // No idiomatic way of dealing with sets of refs yet
42
- // See: https://github.com/facebook/react/issues/14072#issuecomment-446777406
43
-
44
- var breadcrumbItemRefs = useRef(new Map()).current;
45
- var size = useComponentSize(containerRef);
46
- useIsomorphicLayoutEffect(function () {
47
- // Create an array of all breadcrumb item refs
48
- var items = Array.from(breadcrumbItemRefs).map(function (_ref2) {
49
- var _ref3 = _slicedToArray(_ref2, 2),
50
- key = _ref3[0],
51
- value = _ref3[1];
52
-
53
- return value;
54
- }); // Clear max width on all items
55
-
56
- items.forEach(function (el) {
57
- el.setMaxWidth('none');
58
- }); // Set maxWidth on breadcrumb text items iteratively until
59
- // the ordered list fits on a single line. It's on a single line
60
- // if the height of the list is less then 70.
61
-
62
- items.forEach(function (el) {
63
- if (olRef.current.offsetHeight > 70) {
64
- el.setMaxWidth('40px');
65
- }
66
- });
67
- }, [size]);
68
- return ___EmotionJSX("nav", _extends({}, classes(''), {
69
- ref: containerRef,
70
- "aria-label": t('breadcrumb.breadcrumb')
71
- }), children, ___EmotionJSX("ol", _extends({}, classes('list'), {
72
- ref: olRef
73
- }), items.map(function (item, i) {
74
- return ___EmotionJSX(BreadcrumbItem, {
75
- ref: function ref(element) {
76
- return element === null || i === 0 // skip first item which is never truncated
77
- ? breadcrumbItemRefs["delete"](item.to) : breadcrumbItemRefs.set(item.to, element);
78
- },
79
- classes: classes,
80
- key: item.to,
81
- isCurrent: i === items.length - 1,
82
- to: item.to,
83
- name: item.name,
84
- home: false,
85
- invertedStyle: false
86
- }, item.name);
87
- })));
88
- };
89
-
90
- export default BreadcrumbBlock;
@@ -1,15 +0,0 @@
1
- /**
2
- * Copyright (c) 2019-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
- import { ReactNode } from 'react';
9
- import { BreadcrumbItemI } from './Breadcrumb';
10
- interface Props {
11
- children?: ReactNode;
12
- items: BreadcrumbItemI[];
13
- }
14
- declare const BreadcrumbBlock: ({ children, items }: Props) => JSX.Element;
15
- export default BreadcrumbBlock;
@@ -1,105 +0,0 @@
1
- "use strict";
2
-
3
- function _typeof(obj) { "@babel/helpers - typeof"; if (typeof Symbol === "function" && typeof Symbol.iterator === "symbol") { _typeof = function _typeof(obj) { return typeof obj; }; } else { _typeof = function _typeof(obj) { return obj && typeof Symbol === "function" && obj.constructor === Symbol && obj !== Symbol.prototype ? "symbol" : typeof obj; }; } return _typeof(obj); }
4
-
5
- Object.defineProperty(exports, "__esModule", {
6
- value: true
7
- });
8
- exports["default"] = void 0;
9
-
10
- var _react = _interopRequireWildcard(require("react"));
11
-
12
- var _reactBemHelper = _interopRequireDefault(require("react-bem-helper"));
13
-
14
- var _hooks = require("@ndla/hooks");
15
-
16
- var _reactI18next = require("react-i18next");
17
-
18
- var _BreadcrumbItem = _interopRequireDefault(require("./BreadcrumbItem"));
19
-
20
- var _core = require("@emotion/core");
21
-
22
- function _interopRequireDefault(obj) { return obj && obj.__esModule ? obj : { "default": obj }; }
23
-
24
- function _getRequireWildcardCache() { if (typeof WeakMap !== "function") return null; var cache = new WeakMap(); _getRequireWildcardCache = function _getRequireWildcardCache() { return cache; }; return cache; }
25
-
26
- function _interopRequireWildcard(obj) { if (obj && obj.__esModule) { return obj; } if (obj === null || _typeof(obj) !== "object" && typeof obj !== "function") { return { "default": obj }; } var cache = _getRequireWildcardCache(); if (cache && cache.has(obj)) { return cache.get(obj); } var newObj = {}; var hasPropertyDescriptor = Object.defineProperty && Object.getOwnPropertyDescriptor; for (var key in obj) { if (Object.prototype.hasOwnProperty.call(obj, key)) { var desc = hasPropertyDescriptor ? Object.getOwnPropertyDescriptor(obj, key) : null; if (desc && (desc.get || desc.set)) { Object.defineProperty(newObj, key, desc); } else { newObj[key] = obj[key]; } } } newObj["default"] = obj; if (cache) { cache.set(obj, newObj); } return newObj; }
27
-
28
- function _extends() { _extends = Object.assign || function (target) { for (var i = 1; i < arguments.length; i++) { var source = arguments[i]; for (var key in source) { if (Object.prototype.hasOwnProperty.call(source, key)) { target[key] = source[key]; } } } return target; }; return _extends.apply(this, arguments); }
29
-
30
- function _slicedToArray(arr, i) { return _arrayWithHoles(arr) || _iterableToArrayLimit(arr, i) || _unsupportedIterableToArray(arr, i) || _nonIterableRest(); }
31
-
32
- function _nonIterableRest() { throw new TypeError("Invalid attempt to destructure non-iterable instance.\nIn order to be iterable, non-array objects must have a [Symbol.iterator]() method."); }
33
-
34
- function _unsupportedIterableToArray(o, minLen) { if (!o) return; if (typeof o === "string") return _arrayLikeToArray(o, minLen); var n = Object.prototype.toString.call(o).slice(8, -1); if (n === "Object" && o.constructor) n = o.constructor.name; if (n === "Map" || n === "Set") return Array.from(o); if (n === "Arguments" || /^(?:Ui|I)nt(?:8|16|32)(?:Clamped)?Array$/.test(n)) return _arrayLikeToArray(o, minLen); }
35
-
36
- function _arrayLikeToArray(arr, len) { if (len == null || len > arr.length) len = arr.length; for (var i = 0, arr2 = new Array(len); i < len; i++) { arr2[i] = arr[i]; } return arr2; }
37
-
38
- function _iterableToArrayLimit(arr, i) { if (typeof Symbol === "undefined" || !(Symbol.iterator in Object(arr))) return; var _arr = []; var _n = true; var _d = false; var _e = undefined; try { for (var _i = arr[Symbol.iterator](), _s; !(_n = (_s = _i.next()).done); _n = true) { _arr.push(_s.value); if (i && _arr.length === i) break; } } catch (err) { _d = true; _e = err; } finally { try { if (!_n && _i["return"] != null) _i["return"](); } finally { if (_d) throw _e; } } return _arr; }
39
-
40
- function _arrayWithHoles(arr) { if (Array.isArray(arr)) return arr; }
41
-
42
- var classes = (0, _reactBemHelper["default"])({
43
- name: 'breadcrumb-block',
44
- prefix: 'c-'
45
- });
46
-
47
- var BreadcrumbBlock = function BreadcrumbBlock(_ref) {
48
- var children = _ref.children,
49
- items = _ref.items;
50
-
51
- var _useTranslation = (0, _reactI18next.useTranslation)(),
52
- t = _useTranslation.t;
53
-
54
- var olRef = (0, _react.useRef)();
55
- var containerRef = (0, _react.useRef)(null); // No idiomatic way of dealing with sets of refs yet
56
- // See: https://github.com/facebook/react/issues/14072#issuecomment-446777406
57
-
58
- var breadcrumbItemRefs = (0, _react.useRef)(new Map()).current;
59
- var size = (0, _hooks.useComponentSize)(containerRef);
60
- (0, _hooks.useIsomorphicLayoutEffect)(function () {
61
- // Create an array of all breadcrumb item refs
62
- var items = Array.from(breadcrumbItemRefs).map(function (_ref2) {
63
- var _ref3 = _slicedToArray(_ref2, 2),
64
- key = _ref3[0],
65
- value = _ref3[1];
66
-
67
- return value;
68
- }); // Clear max width on all items
69
-
70
- items.forEach(function (el) {
71
- el.setMaxWidth('none');
72
- }); // Set maxWidth on breadcrumb text items iteratively until
73
- // the ordered list fits on a single line. It's on a single line
74
- // if the height of the list is less then 70.
75
-
76
- items.forEach(function (el) {
77
- if (olRef.current.offsetHeight > 70) {
78
- el.setMaxWidth('40px');
79
- }
80
- });
81
- }, [size]);
82
- return (0, _core.jsx)("nav", _extends({}, classes(''), {
83
- ref: containerRef,
84
- "aria-label": t('breadcrumb.breadcrumb')
85
- }), children, (0, _core.jsx)("ol", _extends({}, classes('list'), {
86
- ref: olRef
87
- }), items.map(function (item, i) {
88
- return (0, _core.jsx)(_BreadcrumbItem["default"], {
89
- ref: function ref(element) {
90
- return element === null || i === 0 // skip first item which is never truncated
91
- ? breadcrumbItemRefs["delete"](item.to) : breadcrumbItemRefs.set(item.to, element);
92
- },
93
- classes: classes,
94
- key: item.to,
95
- isCurrent: i === items.length - 1,
96
- to: item.to,
97
- name: item.name,
98
- home: false,
99
- invertedStyle: false
100
- }, item.name);
101
- })));
102
- };
103
-
104
- var _default = BreadcrumbBlock;
105
- exports["default"] = _default;
package/src/.DS_Store DELETED
Binary file
@@ -1,80 +0,0 @@
1
- /**
2
- * Copyright (c) 2019-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, { ReactNode, useRef } from 'react';
10
- import BEMHelper, { ReturnObject } from 'react-bem-helper';
11
- import { useComponentSize, useIsomorphicLayoutEffect } from '@ndla/hooks';
12
- import { useTranslation } from 'react-i18next';
13
- import BreadcrumbItem from './BreadcrumbItem';
14
- import { BreadcrumbItemI } from './Breadcrumb';
15
-
16
- const classes: BEMHelper<ReturnObject> = BEMHelper({
17
- name: 'breadcrumb-block',
18
- prefix: 'c-',
19
- });
20
-
21
- interface Props {
22
- children?: ReactNode;
23
- items: BreadcrumbItemI[];
24
- }
25
-
26
- const BreadcrumbBlock = ({ children, items }: Props) => {
27
- const { t } = useTranslation();
28
- const olRef = useRef<any>();
29
- const containerRef = useRef<HTMLDivElement>(null);
30
- // No idiomatic way of dealing with sets of refs yet
31
- // See: https://github.com/facebook/react/issues/14072#issuecomment-446777406
32
- const breadcrumbItemRefs = useRef(new Map()).current;
33
- const size = useComponentSize(containerRef);
34
-
35
- useIsomorphicLayoutEffect(() => {
36
- // Create an array of all breadcrumb item refs
37
- const items = Array.from(breadcrumbItemRefs).map(([key, value]) => value);
38
-
39
- // Clear max width on all items
40
- items.forEach((el) => {
41
- el.setMaxWidth('none');
42
- });
43
-
44
- // Set maxWidth on breadcrumb text items iteratively until
45
- // the ordered list fits on a single line. It's on a single line
46
- // if the height of the list is less then 70.
47
- items.forEach((el) => {
48
- if (olRef.current.offsetHeight > 70) {
49
- el.setMaxWidth('40px');
50
- }
51
- });
52
- }, [size]);
53
-
54
- return (
55
- <nav {...classes('')} ref={containerRef} aria-label={t('breadcrumb.breadcrumb')}>
56
- {children}
57
- <ol {...classes('list')} ref={olRef}>
58
- {items.map((item, i) => (
59
- <BreadcrumbItem
60
- ref={(element) =>
61
- element === null || i === 0 // skip first item which is never truncated
62
- ? breadcrumbItemRefs.delete(item.to)
63
- : breadcrumbItemRefs.set(item.to, element)
64
- }
65
- classes={classes}
66
- key={item.to}
67
- isCurrent={i === items.length - 1}
68
- to={item.to}
69
- name={item.name}
70
- home={false}
71
- invertedStyle={false}>
72
- {item.name}
73
- </BreadcrumbItem>
74
- ))}
75
- </ol>
76
- </nav>
77
- );
78
- };
79
-
80
- export default BreadcrumbBlock;
@@ -1,98 +0,0 @@
1
- /**
2
- ** BREADCRUMB BLOCK
3
- **
4
- ** EXAMPLE:
5
- ** <div class="c-breadcrumb-block">
6
- ** <ol class="c-breadcrumb-block__list">
7
- ** <li class="c-breadcrumb-block__item">
8
- ** <a href="#">Medieuttrykk og mediesamfunnet</a>
9
- ** </li>
10
- ** <li class="c-breadcrumb-block__item>
11
- ** <a href="#">Idéutvikling</a>
12
- ** </li>
13
- ** </ol>
14
- ** </div>
15
- **/
16
-
17
- .c-breadcrumb-block {
18
- display: none;
19
-
20
- @include mq(desktop) {
21
- display: block;
22
- }
23
- }
24
-
25
- .c-breadcrumb-block__list {
26
- padding-top: 1px;
27
- margin-left: $spacing;
28
- margin-bottom: 0;
29
- margin-top: 0;
30
- display: inline-block;
31
- list-style: none;
32
- text-align: left;
33
- }
34
- .c-breadcrumb-block__item {
35
- display: inline-block;
36
- margin-right: $spacing--small/2;
37
- margin-bottom: 0;
38
- text-transform: none;
39
- a:hover {
40
- box-shadow: none;
41
- }
42
- &:before {
43
- display: none;
44
- }
45
-
46
- .c-icon {
47
- width: 14px;
48
- height: 14px;
49
- color: $brand-color;
50
- margin-top: -1px;
51
- margin-left: $spacing--small/2;
52
- }
53
-
54
- &:first-child {
55
- .c-icon {
56
- display: none;
57
- }
58
- }
59
-
60
- &:not(:first-child) {
61
- display: inline-flex;
62
- align-items: center;
63
- a,
64
- span {
65
- text-overflow: ellipsis;
66
- white-space: nowrap;
67
- overflow: hidden;
68
- display: inline-block;
69
- }
70
- }
71
-
72
- &:last-child {
73
- .c-icon {
74
- display: none;
75
- }
76
- }
77
-
78
- span {
79
- color: $brand-color;
80
- }
81
- }
82
- .c-breadcrumb-block__item:last-child {
83
- &:after {
84
- display: none;
85
- }
86
- }
87
- .c-breadcrumb-block__item:nth-child(1) {
88
- display: block;
89
- text-align: left;
90
- @include inuit-font-size(14px);
91
- font-weight: $font-weight-bold;
92
- &:after {
93
- display: none;
94
- }
95
- }
96
- .c-breadcrumb-block__item--home {
97
- display: none;
98
- }
@@ -1,104 +0,0 @@
1
- /**
2
- ** BREADCRUMB
3
- **
4
- ** EXAMPLE:
5
- ** <div class="c-breadcrumb">
6
- ** <ol class="c-breadcrumb__list">
7
- ** <li class="c-breadcrumb__item c-breadcrumb__item--home">
8
- ** <a href="#"><svg home /></a>
9
- ** </li>
10
- ** <li class="c-breadcrumb__item">
11
- ** <a href="#">Medieuttrykk og mediesamfunnet</a>
12
- ** </li>
13
- ** </ol>
14
- ** </div>
15
- **/
16
-
17
- .c-breadcrumb {
18
- max-width: 100%;
19
- @include inuit-font-size(18px);
20
- display: block;
21
- }
22
- .c-breadcrumb__list {
23
- display: inline-block;
24
- padding-left: 0;
25
- margin-bottom: 0;
26
- margin-top: 0;
27
- list-style: none;
28
- }
29
- .c-breadcrumb__item {
30
- font-weight: $font-weight-normal;
31
- padding-right: $spacing--small / 2;
32
- margin-bottom: 0;
33
- margin-left: 0;
34
- display: block;
35
-
36
- &:not(.c-breadcrumb__item--home) {
37
- .c-icon {
38
- width: 14px;
39
- height: 14px;
40
- margin-left: $spacing--small/2;
41
- margin-top: -1px;
42
- }
43
- }
44
-
45
- @include mq(tablet) {
46
- display: inline-block;
47
- }
48
-
49
- a {
50
- text-decoration: none;
51
- color: $primary-color;
52
-
53
- &:hover,
54
- &:active,
55
- &:focus {
56
- color: $primary-color;
57
- }
58
- }
59
-
60
- &--invertedStyle {
61
- color: #fff;
62
- a {
63
- color: #fff;
64
-
65
- &:hover,
66
- &:active,
67
- &:focus {
68
- color: #fff;
69
- }
70
- }
71
- }
72
-
73
- &:before {
74
- display: none;
75
- }
76
-
77
- &:first-child {
78
- a {
79
- box-shadow: none;
80
- border-bottom: none;
81
- }
82
- }
83
- &:last-child {
84
- .c-icon {
85
- display: none;
86
- }
87
- }
88
- }
89
- .c-breadcrumb__item--home {
90
- a {
91
- border-bottom: none;
92
- }
93
-
94
- @include mq(tablet) {
95
- padding-right: $spacing--small;
96
-
97
- &:after {
98
- padding-left: $spacing--small;
99
- content: '|';
100
- @include inuit-font-size(14px);
101
- color: $primary-color;
102
- }
103
- }
104
- }