@ndla/ui 26.1.0 → 27.0.1

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 (75) hide show
  1. package/es/Breadcrumb/ActionBreadcrumb.js +10 -5
  2. package/es/Breadcrumb/Breadcrumb.js +3 -4
  3. package/es/MyNdla/Resource/Folder.js +29 -13
  4. package/es/Resource/BlockResource.js +42 -62
  5. package/es/Resource/ListResource.js +41 -22
  6. package/es/Resource/resourceComponents.js +64 -38
  7. package/es/TreeStructure/ComboboxButton.js +162 -0
  8. package/es/TreeStructure/FolderItem.js +98 -78
  9. package/es/TreeStructure/FolderItems.js +25 -14
  10. package/es/TreeStructure/FolderNameInput.js +40 -33
  11. package/es/TreeStructure/NavigationLink.js +18 -10
  12. package/es/TreeStructure/TreeStructure.js +92 -165
  13. package/es/TreeStructure/arrowNavigation.js +3 -3
  14. package/es/TreeStructure/helperFunctions.js +3 -0
  15. package/es/locale/messages-en.js +6 -1
  16. package/es/locale/messages-nb.js +6 -1
  17. package/es/locale/messages-nn.js +6 -1
  18. package/es/locale/messages-se.js +6 -1
  19. package/es/locale/messages-sma.js +6 -1
  20. package/lib/Breadcrumb/ActionBreadcrumb.js +8 -4
  21. package/lib/Breadcrumb/Breadcrumb.js +3 -5
  22. package/lib/MyNdla/Resource/Folder.js +34 -13
  23. package/lib/Resource/BlockResource.js +47 -62
  24. package/lib/Resource/ListResource.js +46 -22
  25. package/lib/Resource/resourceComponents.d.ts +6 -1
  26. package/lib/Resource/resourceComponents.js +64 -37
  27. package/lib/TreeStructure/ComboboxButton.d.ts +28 -0
  28. package/lib/TreeStructure/ComboboxButton.js +176 -0
  29. package/lib/TreeStructure/FolderItem.d.ts +1 -1
  30. package/lib/TreeStructure/FolderItem.js +99 -77
  31. package/lib/TreeStructure/FolderItems.d.ts +4 -2
  32. package/lib/TreeStructure/FolderItems.js +26 -14
  33. package/lib/TreeStructure/FolderNameInput.d.ts +3 -1
  34. package/lib/TreeStructure/FolderNameInput.js +41 -32
  35. package/lib/TreeStructure/NavigationLink.d.ts +1 -1
  36. package/lib/TreeStructure/NavigationLink.js +18 -10
  37. package/lib/TreeStructure/TreeStructure.d.ts +2 -2
  38. package/lib/TreeStructure/TreeStructure.js +92 -165
  39. package/lib/TreeStructure/arrowNavigation.d.ts +2 -1
  40. package/lib/TreeStructure/arrowNavigation.js +3 -3
  41. package/lib/TreeStructure/helperFunctions.d.ts +2 -1
  42. package/lib/TreeStructure/helperFunctions.js +8 -2
  43. package/lib/TreeStructure/types.d.ts +6 -7
  44. package/lib/locale/messages-en.d.ts +5 -0
  45. package/lib/locale/messages-en.js +6 -1
  46. package/lib/locale/messages-nb.d.ts +5 -0
  47. package/lib/locale/messages-nb.js +6 -1
  48. package/lib/locale/messages-nn.d.ts +5 -0
  49. package/lib/locale/messages-nn.js +6 -1
  50. package/lib/locale/messages-se.d.ts +5 -0
  51. package/lib/locale/messages-se.js +6 -1
  52. package/lib/locale/messages-sma.d.ts +5 -0
  53. package/lib/locale/messages-sma.js +6 -1
  54. package/package.json +11 -11
  55. package/src/Breadcrumb/ActionBreadcrumb.tsx +9 -3
  56. package/src/Breadcrumb/Breadcrumb.tsx +1 -2
  57. package/src/MyNdla/Resource/Folder.tsx +19 -4
  58. package/src/Resource/BlockResource.tsx +41 -33
  59. package/src/Resource/ListResource.tsx +35 -29
  60. package/src/Resource/resourceComponents.tsx +60 -26
  61. package/src/TreeStructure/ComboboxButton.tsx +189 -0
  62. package/src/TreeStructure/FolderItem.tsx +89 -70
  63. package/src/TreeStructure/FolderItems.tsx +36 -16
  64. package/src/TreeStructure/FolderNameInput.tsx +43 -18
  65. package/src/TreeStructure/NavigationLink.tsx +17 -10
  66. package/src/TreeStructure/TreeStructure.tsx +63 -139
  67. package/src/TreeStructure/arrowNavigation.ts +7 -6
  68. package/src/TreeStructure/helperFunctions.ts +5 -1
  69. package/src/TreeStructure/types.ts +6 -7
  70. package/src/locale/messages-en.ts +6 -0
  71. package/src/locale/messages-nb.ts +5 -0
  72. package/src/locale/messages-nn.ts +5 -0
  73. package/src/locale/messages-se.ts +6 -0
  74. package/src/locale/messages-sma.ts +6 -0
  75. package/src/.DS_Store +0 -0
@@ -6,4 +6,5 @@
6
6
  *
7
7
  */
8
8
  import { KeyboardEvent } from 'react';
9
- export declare const arrowNavigation: (e: KeyboardEvent<HTMLElement>, id: string, visibleFolders: string[], setFocusedFolderId: (id: string) => void, onOpen: (id: string) => void, onClose: (id: string) => void) => void;
9
+ import { FolderType } from './types';
10
+ export declare const arrowNavigation: (e: KeyboardEvent<HTMLElement>, id: string, visibleFolders: FolderType[], setFocusedFolderId: (id: FolderType) => void, onOpen: (id: string) => void, onClose: (id: string) => void) => void;
@@ -13,8 +13,8 @@ exports.arrowNavigation = void 0;
13
13
  *
14
14
  */
15
15
  var navigateVertical = function navigateVertical(visibleFolders, folderId, setFocusedFolderId, direction) {
16
- var currentIndex = visibleFolders.findIndex(function (id) {
17
- return id === folderId;
16
+ var currentIndex = visibleFolders.findIndex(function (folder) {
17
+ return folder.id === folderId;
18
18
  });
19
19
  var target = visibleFolders[currentIndex + direction];
20
20
 
@@ -23,7 +23,7 @@ var navigateVertical = function navigateVertical(visibleFolders, folderId, setFo
23
23
  }
24
24
  };
25
25
 
26
- var arrowKeys = ['ArrowUp', 'ArrowDown', 'ArrowLeft', 'ArrowRight'];
26
+ var arrowKeys = ['ArrowUp', 'ArrowDown', 'ArrowLeft', 'ArrowRight', 'Enter'];
27
27
 
28
28
  var arrowNavigation = function arrowNavigation(e, id, visibleFolders, setFocusedFolderId, onOpen, onClose) {
29
29
  if (!arrowKeys.includes(e.key)) {
@@ -1,2 +1,3 @@
1
- import { FolderType } from './types';
1
+ import { FolderType, TreeStructureType } from './types';
2
2
  export declare const flattenFolders: (folders: FolderType[], openFolders?: string[] | undefined) => FolderType[];
3
+ export declare const treestructureId: (type: TreeStructureType, modifier: string) => string;
@@ -3,7 +3,7 @@
3
3
  Object.defineProperty(exports, "__esModule", {
4
4
  value: true
5
5
  });
6
- exports.flattenFolders = void 0;
6
+ exports.treestructureId = exports.flattenFolders = void 0;
7
7
 
8
8
  function ownKeys(object, enumerableOnly) { var keys = Object.keys(object); if (Object.getOwnPropertySymbols) { var symbols = Object.getOwnPropertySymbols(object); if (enumerableOnly) symbols = symbols.filter(function (sym) { return Object.getOwnPropertyDescriptor(object, sym).enumerable; }); keys.push.apply(keys, symbols); } return keys; }
9
9
 
@@ -35,4 +35,10 @@ var flattenFolders = function flattenFolders(folders, openFolders) {
35
35
  }, []);
36
36
  };
37
37
 
38
- exports.flattenFolders = flattenFolders;
38
+ exports.flattenFolders = flattenFolders;
39
+
40
+ var treestructureId = function treestructureId(type, modifier) {
41
+ return "".concat(type, "-treestructure-").concat(modifier);
42
+ };
43
+
44
+ exports.treestructureId = treestructureId;
@@ -12,26 +12,25 @@ export interface FolderType extends IFolder {
12
12
  icon?: ReactNode;
13
13
  isNavigation?: boolean;
14
14
  }
15
- export declare type TreeStructureType = 'normal' | 'navigation' | 'picker';
15
+ export declare type TreeStructureType = 'navigation' | 'picker';
16
16
  export interface TreeStructureMenuProps extends Omit<MenuItemProps, 'onClick'> {
17
17
  onClick: (e: MouseEvent<HTMLDivElement> | undefined, folder: FolderType) => void;
18
18
  }
19
19
  export interface CommonTreeStructureProps {
20
20
  loading?: boolean;
21
21
  onSelectFolder?: (id: string) => void;
22
- openOnFolderClick?: boolean;
23
22
  targetResource?: IResource;
24
- framed?: boolean;
25
23
  type: TreeStructureType;
26
24
  }
27
25
  export interface CommonFolderItemsProps extends CommonTreeStructureProps {
28
- focusedFolderId?: string;
26
+ focusedFolder?: FolderType;
29
27
  level: number;
30
28
  maxLevel: number;
31
29
  selectedFolder?: FolderType;
32
30
  onCloseFolder: (id: string) => void;
33
31
  onOpenFolder: (id: string) => void;
34
- setFocusedId: (id: string) => void;
35
- setSelectedFolder: (id: FolderType) => void;
36
- visibleFolders: string[];
32
+ setFocusedFolder: (folder: FolderType, focus?: boolean) => void;
33
+ setSelectedFolder: (folder: FolderType) => void;
34
+ visibleFolders: FolderType[];
35
+ closeTree: () => void;
37
36
  }
@@ -69,8 +69,11 @@ declare const messages: {
69
69
  folderDeleted: string;
70
70
  folderCreated: string;
71
71
  };
72
+ tagList: string;
72
73
  tags: string;
73
74
  tags_plural: string;
75
+ moreTags: string;
76
+ moreTags_plural: string;
74
77
  confirmDeleteFolder: string;
75
78
  confirmDeleteTag: string;
76
79
  myFolders: string;
@@ -177,6 +180,7 @@ declare const messages: {
177
180
  newFolder: {
178
181
  placeholder: string;
179
182
  defaultName: string;
183
+ folderName: string;
180
184
  };
181
185
  };
182
186
  tagSelector: {
@@ -991,6 +995,7 @@ declare const messages: {
991
995
  };
992
996
  cancel: string;
993
997
  close: string;
998
+ loading: string;
994
999
  title: string;
995
1000
  save: string;
996
1001
  image: {
@@ -39,7 +39,8 @@ var messages = _objectSpread(_objectSpread({
39
39
  maxFoldersAlreadyAdded: 'Maximum subfolders reached',
40
40
  newFolder: {
41
41
  placeholder: 'Add foldername',
42
- defaultName: 'New folder'
42
+ defaultName: 'New folder',
43
+ folderName: 'Folder name'
43
44
  }
44
45
  },
45
46
  tagSelector: {
@@ -820,6 +821,7 @@ var messages = _objectSpread(_objectSpread({
820
821
  },
821
822
  cancel: 'Cancel',
822
823
  close: 'Close',
824
+ loading: 'Loading',
823
825
  title: 'Title',
824
826
  save: 'Save',
825
827
  image: {
@@ -959,8 +961,11 @@ var messages = _objectSpread(_objectSpread({
959
961
  folderDeleted: '"{{folderName}}" deleted',
960
962
  folderCreated: '"{{folderName}} created'
961
963
  },
964
+ tagList: 'Tags',
962
965
  tags: '{{count}} tag',
963
966
  tags_plural: '{{count}} tags',
967
+ moreTags: 'Show one more tag',
968
+ moreTags_plural: 'Show {{count}} more tags',
964
969
  confirmDeleteFolder: 'Are you sure you want to delete this folder? Subfolders of this folder will also be deleted. This action cannot be undone.',
965
970
  confirmDeleteTag: 'Are you sure you want to delete this tag? This process cannot be undone.',
966
971
  myFolders: 'My folders',
@@ -69,8 +69,11 @@ declare const messages: {
69
69
  folderDeleted: string;
70
70
  folderCreated: string;
71
71
  };
72
+ tagList: string;
72
73
  tags: string;
73
74
  tags_plural: string;
75
+ moreTags: string;
76
+ moreTags_plural: string;
74
77
  confirmDeleteFolder: string;
75
78
  confirmDeleteTag: string;
76
79
  myFolders: string;
@@ -177,6 +180,7 @@ declare const messages: {
177
180
  newFolder: {
178
181
  placeholder: string;
179
182
  defaultName: string;
183
+ folderName: string;
180
184
  };
181
185
  };
182
186
  tagSelector: {
@@ -990,6 +994,7 @@ declare const messages: {
990
994
  close: string;
991
995
  };
992
996
  close: string;
997
+ loading: string;
993
998
  title: string;
994
999
  cancel: string;
995
1000
  save: string;
@@ -39,7 +39,8 @@ var messages = _objectSpread(_objectSpread({
39
39
  maxFoldersAlreadyAdded: 'Maks nivå av undermapper nådd',
40
40
  newFolder: {
41
41
  placeholder: 'Skriv navn på mappe',
42
- defaultName: 'Ny mappe'
42
+ defaultName: 'Ny mappe',
43
+ folderName: 'Mappenavn'
43
44
  }
44
45
  },
45
46
  tagSelector: {
@@ -819,6 +820,7 @@ var messages = _objectSpread(_objectSpread({
819
820
  close: 'Lukk meny'
820
821
  },
821
822
  close: 'Lukk',
823
+ loading: 'Laster',
822
824
  title: 'Tittel',
823
825
  cancel: 'Avbryt',
824
826
  save: 'Lagre',
@@ -959,8 +961,11 @@ var messages = _objectSpread(_objectSpread({
959
961
  folderDeleted: '"{{folderName}}" er slettet',
960
962
  folderCreated: '"{{folderName}}" er opprettet'
961
963
  },
964
+ tagList: 'Emneknagger',
962
965
  tags: '{{count}} emneknagg',
963
966
  tags_plural: '{{count}} emneknagger',
967
+ moreTags: 'Vis en emneknagg til',
968
+ moreTags_plural: 'Vis {{count}} emneknagger til',
964
969
  confirmDeleteFolder: 'Er du sikker på at du vil slette mappen? Dersom mappen har undermapper vil disse også slettes. Handlingen kan ikke endres.',
965
970
  confirmDeleteTag: 'Er du sikker på at du vil slette emneknagg? Denne handlingen kan ikke endres.',
966
971
  myFolders: 'Mine mapper',
@@ -69,8 +69,11 @@ declare const messages: {
69
69
  folderDeleted: string;
70
70
  folderCreated: string;
71
71
  };
72
+ tagList: string;
72
73
  tags: string;
73
74
  tags_plural: string;
75
+ moreTags: string;
76
+ moreTags_plural: string;
74
77
  confirmDeleteFolder: string;
75
78
  confirmDeleteTag: string;
76
79
  myFolders: string;
@@ -177,6 +180,7 @@ declare const messages: {
177
180
  newFolder: {
178
181
  placeholder: string;
179
182
  defaultName: string;
183
+ folderName: string;
180
184
  };
181
185
  };
182
186
  tagSelector: {
@@ -991,6 +995,7 @@ declare const messages: {
991
995
  };
992
996
  cancel: string;
993
997
  close: string;
998
+ loading: string;
994
999
  title: string;
995
1000
  save: string;
996
1001
  image: {
@@ -39,7 +39,8 @@ var messages = _objectSpread(_objectSpread({
39
39
  maxFoldersAlreadyAdded: 'Maks nivå av undermapper nådd',
40
40
  newFolder: {
41
41
  placeholder: 'Skriv namn på mappe',
42
- defaultName: 'Ny mappe'
42
+ defaultName: 'Ny mappe',
43
+ folderName: 'Mappenavn'
43
44
  }
44
45
  },
45
46
  tagSelector: {
@@ -820,6 +821,7 @@ var messages = _objectSpread(_objectSpread({
820
821
  },
821
822
  cancel: 'Avbryt',
822
823
  close: 'Lukk',
824
+ loading: 'Laster',
823
825
  title: 'Tittel',
824
826
  save: 'Lagre',
825
827
  image: {
@@ -959,8 +961,11 @@ var messages = _objectSpread(_objectSpread({
959
961
  folderDeleted: '"{{folderName}}" er sletta',
960
962
  folderCreated: '"{{folderName}}" er oppretta'
961
963
  },
964
+ tagList: 'Emneknaggar',
962
965
  tags: '{{count}} emneknagg',
963
966
  tags_plural: '{{count}} emneknaggar',
967
+ moreTags: 'Vis ein emneknagg til',
968
+ moreTags_plural: 'Vis {{count}} emneknaggar til',
964
969
  confirmDeleteFolder: 'Er du sikker på at du vil slette mappa? Dersom mappa har undermapper vil desse også slettast. Denne handlinga kan ikkje endrast.',
965
970
  confirmDeleteTag: 'Er du sikker på at du vil slette tag? Denne handlinga kan ikkje endrast.',
966
971
  myFolders: 'Mine mapper',
@@ -69,8 +69,11 @@ declare const messages: {
69
69
  folderDeleted: string;
70
70
  folderCreated: string;
71
71
  };
72
+ tagList: string;
72
73
  tags: string;
73
74
  tags_plural: string;
75
+ moreTags: string;
76
+ moreTags_plural: string;
74
77
  confirmDeleteFolder: string;
75
78
  confirmDeleteTag: string;
76
79
  myFolders: string;
@@ -177,6 +180,7 @@ declare const messages: {
177
180
  newFolder: {
178
181
  placeholder: string;
179
182
  defaultName: string;
183
+ folderName: string;
180
184
  };
181
185
  };
182
186
  tagSelector: {
@@ -990,6 +994,7 @@ declare const messages: {
990
994
  close: string;
991
995
  };
992
996
  close: string;
997
+ loading: string;
993
998
  title: string;
994
999
  cancel: string;
995
1000
  save: string;
@@ -39,7 +39,8 @@ var messages = _objectSpread(_objectSpread({
39
39
  maxFoldersAlreadyAdded: 'Vuollemáhpaid badjerádji lea olahuvvon',
40
40
  newFolder: {
41
41
  placeholder: 'Čále nama máhppii',
42
- defaultName: 'Ođđa máhppa'
42
+ defaultName: 'Ođđa máhppa',
43
+ folderName: 'Mappenavn'
43
44
  }
44
45
  },
45
46
  tagSelector: {
@@ -819,6 +820,7 @@ var messages = _objectSpread(_objectSpread({
819
820
  close: 'Govčča fálu'
820
821
  },
821
822
  close: 'Govčča',
823
+ loading: 'Laster',
822
824
  title: 'Tihttel',
823
825
  cancel: 'Botkke',
824
826
  save: 'Vurke',
@@ -959,8 +961,11 @@ var messages = _objectSpread(_objectSpread({
959
961
  folderDeleted: '"{{folderName}}" lea sihkkojuvvon',
960
962
  folderCreated: '"{{folderName}}" er oppretta'
961
963
  },
964
+ tagList: 'Emneknagger',
962
965
  tags: '{{count}} fáddágilkor',
963
966
  tags_plural: '{{count}} fáddágilkorat',
967
+ moreTags: 'Vis ein emneknagg til',
968
+ moreTags_plural: 'Vis {{count}} emneknaggar til',
964
969
  confirmDeleteFolder: 'Leat go áibbas sihkar ahte dáhtut sihkkut máhpa? Dan ii sáhte gáhtat.',
965
970
  confirmDeleteTag: 'Leat go áibbas sihkar ahte dáhtut sihkkut fáddágilkora? Dan ii sáhte gáhtat.',
966
971
  myFolders: 'Mu máhpat',
@@ -69,8 +69,11 @@ declare const messages: {
69
69
  folderDeleted: string;
70
70
  folderCreated: string;
71
71
  };
72
+ tagList: string;
72
73
  tags: string;
73
74
  tags_plural: string;
75
+ moreTags: string;
76
+ moreTags_plural: string;
74
77
  confirmDeleteFolder: string;
75
78
  confirmDeleteTag: string;
76
79
  myFolders: string;
@@ -177,6 +180,7 @@ declare const messages: {
177
180
  newFolder: {
178
181
  placeholder: string;
179
182
  defaultName: string;
183
+ folderName: string;
180
184
  };
181
185
  };
182
186
  tagSelector: {
@@ -990,6 +994,7 @@ declare const messages: {
990
994
  close: string;
991
995
  };
992
996
  close: string;
997
+ loading: string;
993
998
  title: string;
994
999
  cancel: string;
995
1000
  save: string;
@@ -39,7 +39,8 @@ var messages = _objectSpread(_objectSpread({
39
39
  maxFoldersAlreadyAdded: 'Maks nivå av undermapper nådd',
40
40
  newFolder: {
41
41
  placeholder: 'Skriv navn på mappe',
42
- defaultName: 'Ny mappe'
42
+ defaultName: 'Ny mappe',
43
+ folderName: 'Mappenavn'
43
44
  }
44
45
  },
45
46
  tagSelector: {
@@ -819,6 +820,7 @@ var messages = _objectSpread(_objectSpread({
819
820
  close: 'Lukk meny'
820
821
  },
821
822
  close: 'Lukk',
823
+ loading: 'Laster',
822
824
  title: 'Tittel',
823
825
  cancel: 'Avbryt',
824
826
  save: 'Lagre',
@@ -959,8 +961,11 @@ var messages = _objectSpread(_objectSpread({
959
961
  folderDeleted: '"{{folderName}}" er slettet',
960
962
  folderCreated: '"{{folderName}}" er oppretta'
961
963
  },
964
+ tagList: 'Emneknagg',
962
965
  tags: '{{count}} emneknagg',
963
966
  tags_plural: '{{count}} emneknagger',
967
+ moreTags: 'Vis ein emneknagg til',
968
+ moreTags_plural: 'Vis {{count}} emneknaggar til',
964
969
  confirmDeleteFolder: 'Er du sikker på at du vil slette mappa? Dersom mappa har undermappar vil disse også slettes. Denne handlinga kan ikkje endrast.',
965
970
  confirmDeleteTag: 'Er du sikker på at du vil slette emneknagg? Denne handlingen kan ikke endres.',
966
971
  myFolders: 'Mine mapper',
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "@ndla/ui",
3
- "version": "26.1.0",
3
+ "version": "27.0.1",
4
4
  "description": "UI component library for NDLA.",
5
5
  "license": "GPL-3.0",
6
6
  "main": "lib/index.js",
@@ -32,18 +32,18 @@
32
32
  ],
33
33
  "dependencies": {
34
34
  "@ndla/article-scripts": "^3.0.2",
35
- "@ndla/button": "^3.5.0",
36
- "@ndla/carousel": "^1.2.22",
35
+ "@ndla/button": "^3.5.2",
36
+ "@ndla/carousel": "^1.2.23",
37
37
  "@ndla/core": "^2.3.5",
38
- "@ndla/forms": "^3.3.0",
38
+ "@ndla/forms": "^3.3.2",
39
39
  "@ndla/hooks": "^1.1.6",
40
- "@ndla/icons": "^1.12.1",
41
- "@ndla/licenses": "^5.0.16",
42
- "@ndla/modal": "^1.3.6",
43
- "@ndla/notion": "^3.1.40",
44
- "@ndla/safelink": "^2.2.14",
40
+ "@ndla/icons": "^1.13.0",
41
+ "@ndla/licenses": "^5.0.17",
42
+ "@ndla/modal": "^1.3.7",
43
+ "@ndla/notion": "^3.1.42",
44
+ "@ndla/safelink": "^2.2.16",
45
45
  "@ndla/switch": "^0.1.13",
46
- "@ndla/tabs": "^1.1.21",
46
+ "@ndla/tabs": "^1.1.22",
47
47
  "@ndla/tooltip": "^2.2.1",
48
48
  "@ndla/types-learningpath-api": "^0.0.13",
49
49
  "@ndla/util": "^3.1.0",
@@ -85,5 +85,5 @@
85
85
  "publishConfig": {
86
86
  "access": "public"
87
87
  },
88
- "gitHead": "578a4353f768a0eb2b3e2334272c10d920de9632"
88
+ "gitHead": "7a987443015049a36da7aa5af3288378488696ff"
89
89
  }
@@ -7,7 +7,7 @@
7
7
  */
8
8
 
9
9
  import styled from '@emotion/styled';
10
- import { colors, fonts, spacing } from '@ndla/core';
10
+ import { colors, fonts, misc, spacing } from '@ndla/core';
11
11
  import { ChevronRight } from '@ndla/icons/common';
12
12
  import SafeLink from '@ndla/safelink';
13
13
  import React from 'react';
@@ -30,12 +30,18 @@ const StyledSpan = styled.span`
30
30
  const StyledSafeLink = styled(SafeLink)`
31
31
  color: ${colors.text.primary};
32
32
  box-shadow: none;
33
+ margin: 0 2px;
33
34
  font-weight: ${fonts.weight.bold};
34
35
  :hover {
35
36
  color: ${colors.brand.primary};
36
37
  }
37
38
  `;
38
39
 
40
+ const StyledMenuButton = styled(MenuButton)`
41
+ border-radius: ${misc.borderRadius};
42
+ margin: 0 2px;
43
+ `;
44
+
39
45
  interface Props {
40
46
  items: SimpleBreadcrumbItem[];
41
47
  actionItems: MenuItemProps[];
@@ -48,9 +54,9 @@ const ActionBreadcrumb = ({ items, actionItems }: Props) => {
48
54
  }
49
55
  if (item.index === totalCount - 1 && actionItems.length > 0) {
50
56
  return (
51
- <MenuButton menuItems={actionItems} size="small">
57
+ <StyledMenuButton menuItems={actionItems} size="small">
52
58
  <StyledSpan title={item.name}>{item.name}</StyledSpan>
53
- </MenuButton>
59
+ </StyledMenuButton>
54
60
  );
55
61
  }
56
62
  return (
@@ -8,7 +8,6 @@
8
8
 
9
9
  import React, { ReactNode, useRef } from 'react';
10
10
  import { useComponentSize, useIsomorphicLayoutEffect } from '@ndla/hooks';
11
- import { uuid } from '@ndla/util';
12
11
  import styled from '@emotion/styled';
13
12
  import { useTranslation } from 'react-i18next';
14
13
  import BreadcrumbItem, { IndexedBreadcrumbItem, SimpleBreadcrumbItem } from './BreadcrumbItem';
@@ -83,7 +82,7 @@ const Breadcrumb = ({
83
82
  ? breadcrumbItemRefs.delete(item.to)
84
83
  : breadcrumbItemRefs.set(item.to, element)
85
84
  }
86
- key={uuid()}
85
+ key={typeof item.to === 'string' ? item.to : item.to.pathname}
87
86
  totalCount={items.length}
88
87
  item={{ ...item, index }}
89
88
  />
@@ -7,7 +7,7 @@
7
7
  */
8
8
 
9
9
  import styled from '@emotion/styled';
10
- import React from 'react';
10
+ import React, { useRef } from 'react';
11
11
  import { FolderOutlined } from '@ndla/icons/contentType';
12
12
  import { FileDocumentOutline } from '@ndla/icons/common';
13
13
  import { fonts, spacing, colors, mq, breakpoints } from '@ndla/core';
@@ -40,6 +40,12 @@ const FolderIconWrapper = styled.div<FolderIconWrapperProps>`
40
40
  `};
41
41
  `;
42
42
 
43
+ const FolderTitleLink = styled(SafeLink)`
44
+ box-shadow: none;
45
+ color: ${colors.text.primary};
46
+ flex: 1;
47
+ `;
48
+
43
49
  const FolderTitle = styled.h2`
44
50
  ${fonts.sizes(18)};
45
51
  font-weight: ${fonts.weight.normal};
@@ -55,11 +61,12 @@ const FolderTitle = styled.h2`
55
61
  -webkit-box-orient: vertical;
56
62
  `;
57
63
 
58
- const FolderWrapper = styled(SafeLink)`
64
+ const FolderWrapper = styled.div`
59
65
  display: flex;
60
66
  align-items: center;
61
67
  padding: ${spacing.small};
62
68
  border: 1px solid ${colors.brand.neutral7};
69
+ cursor: pointer;
63
70
  border-radius: 2px;
64
71
  box-shadow: none;
65
72
  text-decoration: none;
@@ -134,12 +141,20 @@ type LayoutType = 'list' | 'block';
134
141
 
135
142
  const Folder = ({ id, link, title, subFolders, subResources, type = 'list', menuItems }: Props) => {
136
143
  const { t } = useTranslation();
144
+ const linkRef = useRef<HTMLAnchorElement | null>(null);
145
+
146
+ const onClick = () => {
147
+ linkRef?.current?.click();
148
+ };
149
+
137
150
  return (
138
- <FolderWrapper to={link} id={id}>
151
+ <FolderWrapper onClick={onClick} id={id}>
139
152
  <FolderIconWrapper type={type}>
140
153
  <FolderOutlined aria-label={t('myNdla.folder.folder')} />
141
154
  </FolderIconWrapper>
142
- <FolderTitle>{title}</FolderTitle>
155
+ <FolderTitleLink to={link} ref={linkRef}>
156
+ <FolderTitle>{title}</FolderTitle>
157
+ </FolderTitleLink>
143
158
  <IconCount layoutType={type} type={'folder'} count={subFolders} />
144
159
  <IconCount layoutType={type} type={'resource'} count={subResources} />
145
160
  {menuItems && menuItems.length > 0 && <MenuButton alignRight size="small" menuItems={menuItems} />}
@@ -7,12 +7,19 @@
7
7
  */
8
8
 
9
9
  import styled from '@emotion/styled';
10
- import React from 'react';
11
- import SafeLink from '@ndla/safelink';
10
+ import React, { useRef } from 'react';
12
11
  import { colors, fonts, spacing } from '@ndla/core';
13
12
  import { MenuButton, MenuItemProps } from '@ndla/button';
14
13
  import Image from '../Image';
15
- import { CompressedTagList, ResourceImageProps, ResourceTitle, Row, TopicList } from './resourceComponents';
14
+ import {
15
+ CompressedTagList,
16
+ ResourceImageProps,
17
+ ResourceTitle,
18
+ Row,
19
+ TopicList,
20
+ ResourceTitleLink,
21
+ LoaderProps,
22
+ } from './resourceComponents';
16
23
  import ContentLoader from '../ContentLoader';
17
24
 
18
25
  interface BlockResourceProps {
@@ -28,7 +35,7 @@ interface BlockResourceProps {
28
35
  isLoading?: boolean;
29
36
  }
30
37
 
31
- const BlockElementWrapper = styled(SafeLink)`
38
+ const BlockElementWrapper = styled.div`
32
39
  display: flex;
33
40
  text-decoration: none;
34
41
  box-shadow: none;
@@ -38,6 +45,16 @@ const BlockElementWrapper = styled(SafeLink)`
38
45
  border: 1px solid ${colors.brand.light};
39
46
  border-radius: 2px;
40
47
  color: ${colors.brand.greyDark};
48
+ cursor: pointer;
49
+
50
+ &:hover {
51
+ box-shadow: 1px 1px 6px 2px rgba(9, 55, 101, 0.08);
52
+ transition-duration: 0.2s;
53
+ ${() => ResourceTitleLink} {
54
+ color: ${colors.brand.primary};
55
+ text-decoration: underline;
56
+ }
57
+ }
41
58
  `;
42
59
 
43
60
  const BlockDescription = styled.p`
@@ -49,7 +66,8 @@ const BlockDescription = styled.p`
49
66
  overflow: hidden;
50
67
  text-overflow: ellipsis;
51
68
  transition: height 0.2s ease-out;
52
- ${() => BlockElementWrapper}:hover &, ${() => BlockElementWrapper}:focus & {
69
+ ${() => BlockElementWrapper}:hover &, ${() => BlockElementWrapper}:focus & , ${() =>
70
+ BlockElementWrapper}:focus-within & {
53
71
  // Unfortunate css needed for multi-line text overflow ellipsis.
54
72
  height: 3.1em;
55
73
  -webkit-line-clamp: 2;
@@ -60,6 +78,7 @@ const BlockDescription = styled.p`
60
78
 
61
79
  const RightRow = styled(Row)`
62
80
  justify-content: flex-end;
81
+ margin-bottom: -${spacing.xxsmall};
63
82
  `;
64
83
 
65
84
  const BlockInfoWrapper = styled.div`
@@ -98,28 +117,7 @@ const BlockImage = ({ image, loading }: BlockImageProps) => {
98
117
  return <Image alt={image.alt} src={image.src} fallbackWidth={300} />;
99
118
  };
100
119
 
101
- interface BlockTitleProps {
102
- title: string;
103
- loading?: boolean;
104
- }
105
-
106
- const BlockTitle = ({ title, loading }: BlockTitleProps) => {
107
- if (loading) {
108
- return (
109
- <ContentLoader height={'18px'} width={'100%'} viewBox={null} preserveAspectRatio="none">
110
- <rect x="0" y="0" rx="3" ry="3" width="100%" height="18px" />
111
- </ContentLoader>
112
- );
113
- }
114
- return <ResourceTitle>{title}</ResourceTitle>;
115
- };
116
-
117
- interface BlockTopicListProps {
118
- topics: string[];
119
- loading?: boolean;
120
- }
121
-
122
- const BlockTopicList = ({ topics, loading }: BlockTopicListProps) => {
120
+ const TopicAndTitleLoader = ({ children, loading }: LoaderProps) => {
123
121
  if (loading) {
124
122
  return (
125
123
  <ContentLoader height={'18px'} width={'100%'} viewBox={null} preserveAspectRatio="none">
@@ -129,7 +127,7 @@ const BlockTopicList = ({ topics, loading }: BlockTopicListProps) => {
129
127
  );
130
128
  }
131
129
 
132
- return <TopicList topics={topics} />;
130
+ return <>{children}</>;
133
131
  };
134
132
 
135
133
  const BlockResource = ({
@@ -144,16 +142,26 @@ const BlockResource = ({
144
142
  menuItems,
145
143
  isLoading,
146
144
  }: BlockResourceProps) => {
145
+ const linkRef = useRef<HTMLAnchorElement>(null);
146
+
147
+ const handleClick = () => {
148
+ if (linkRef.current) {
149
+ linkRef.current.click();
150
+ }
151
+ };
152
+
147
153
  return (
148
- <BlockElementWrapper to={link} id={id}>
154
+ <BlockElementWrapper onClick={handleClick} id={id}>
149
155
  <ImageWrapper>
150
156
  <BlockImage image={resourceImage} loading={isLoading} />
151
157
  </ImageWrapper>
152
158
  <BlockInfoWrapper>
153
- <div>
154
- <BlockTitle title={title} loading={isLoading} />
155
- </div>
156
- <BlockTopicList topics={topics} loading={isLoading} />
159
+ <TopicAndTitleLoader loading={isLoading}>
160
+ <ResourceTitleLink title={title} to={link} ref={linkRef}>
161
+ <ResourceTitle>{title}</ResourceTitle>
162
+ </ResourceTitleLink>
163
+ </TopicAndTitleLoader>
164
+ <TopicList topics={topics} />
157
165
  <BlockDescription>{description}</BlockDescription>
158
166
  <RightRow>
159
167
  {tags && <CompressedTagList tagLinkPrefix={tagLinkPrefix} tags={tags} />}