@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
@@ -7,19 +7,15 @@
7
7
  */
8
8
 
9
9
  import React, { useEffect, useState, useMemo, useRef } from 'react';
10
- import { ButtonV2 as Button, IconButtonDualStates } from '@ndla/button';
11
- import { Plus } from '@ndla/icons/action';
12
- import { ChevronDown, ChevronUp } from '@ndla/icons/common';
13
- import Tooltip from '@ndla/tooltip';
14
- import { useTranslation } from 'react-i18next';
15
10
  import styled from '@emotion/styled';
16
11
  import { colors, fonts, misc, spacing } from '@ndla/core';
17
12
  import { css } from '@emotion/core';
18
13
  import { uniq } from 'lodash';
19
14
  import { IFolder } from '@ndla/types-learningpath-api';
20
15
  import FolderItems from './FolderItems';
21
- import { flattenFolders } from './helperFunctions';
16
+ import { flattenFolders, treestructureId } from './helperFunctions';
22
17
  import { CommonTreeStructureProps, FolderType, TreeStructureType } from './types';
18
+ import ComboboxButton from './ComboboxButton';
23
19
 
24
20
  export const MAX_LEVEL_FOR_FOLDERS = 4;
25
21
 
@@ -27,17 +23,6 @@ const StyledLabel = styled.label`
27
23
  font-weight: ${fonts.weight.semibold};
28
24
  `;
29
25
 
30
- interface StyledRowProps {
31
- isOpen: boolean;
32
- }
33
-
34
- const StyledRow = styled.div<StyledRowProps>`
35
- display: flex;
36
- justify-content: space-between;
37
- padding: ${spacing.xxsmall};
38
- border-bottom: ${({ isOpen }) => isOpen && `1px solid ${colors.brand.tertiary}`};
39
- `;
40
-
41
26
  const StyledTreeStructure = styled.div`
42
27
  flex: 1;
43
28
  display: flex;
@@ -48,7 +33,7 @@ const TreeStructureWrapper = styled.div<{ type: TreeStructureType }>`
48
33
  display: flex;
49
34
  flex-direction: column;
50
35
  ${({ type }) =>
51
- (type === 'normal' || type === 'picker') &&
36
+ type === 'picker' &&
52
37
  css`
53
38
  overflow: hidden;
54
39
  border: 1px solid ${colors.brand.neutral7};
@@ -60,12 +45,14 @@ const TreeStructureWrapper = styled.div<{ type: TreeStructureType }>`
60
45
  border-color: ${colors.brand.tertiary};
61
46
  }
62
47
  `;
48
+
63
49
  interface ScrollableDivProps {
64
50
  type: TreeStructureType;
65
51
  }
52
+
66
53
  const ScrollableDiv = styled.div<ScrollableDivProps>`
67
54
  ${({ type }) =>
68
- (type === 'picker' || type === 'normal') &&
55
+ type === 'picker' &&
69
56
  css`
70
57
  overflow: overlay;
71
58
  ::-webkit-scrollbar {
@@ -81,34 +68,11 @@ const ScrollableDiv = styled.div<ScrollableDivProps>`
81
68
  `}
82
69
  `;
83
70
 
84
- const StyledSelectedFolder = styled(Button)`
85
- flex: 1;
86
- justify-content: flex-start;
87
- :hover,
88
- :focus {
89
- background: none;
90
- box-shadow: none;
91
- border-color: transparent;
92
- }
93
- `;
94
-
95
- const StyledAddFolderButton = styled(Button)`
96
- &,
97
- &:disabled {
98
- border-color: transparent;
99
- }
100
- `;
101
-
102
- const StyledPlus = styled(Plus)`
103
- height: 24px;
104
- width: 24px;
105
- `;
106
-
107
71
  export interface TreeStructureProps extends CommonTreeStructureProps {
108
72
  defaultOpenFolders?: string[];
109
73
  folders: FolderType[];
110
74
  label?: string;
111
- maximumLevelsOfFoldersAllowed?: number;
75
+ maxLevel?: number;
112
76
  onNewFolder?: (name: string, parentId: string) => Promise<IFolder>;
113
77
  }
114
78
 
@@ -117,42 +81,24 @@ const TreeStructure = ({
117
81
  folders,
118
82
  label,
119
83
  loading,
120
- maximumLevelsOfFoldersAllowed = MAX_LEVEL_FOR_FOLDERS,
84
+ maxLevel = MAX_LEVEL_FOR_FOLDERS,
121
85
  onNewFolder,
122
86
  onSelectFolder,
123
- openOnFolderClick,
124
87
  targetResource,
125
- type = 'normal',
88
+ type,
126
89
  }: TreeStructureProps) => {
127
- const { t } = useTranslation();
128
-
129
- const ref = useRef<HTMLDivElement>(null);
90
+ const ref = useRef<HTMLButtonElement>(null);
130
91
 
131
92
  const defaultSelectedFolderId = defaultOpenFolders && defaultOpenFolders[defaultOpenFolders.length - 1];
132
93
 
133
94
  const [openFolders, setOpenFolders] = useState<string[]>(defaultOpenFolders || []);
134
95
 
135
96
  const [newFolderParentId, setNewFolderParentId] = useState<string | undefined>();
136
- const [focusedId, setFocusedId] = useState<string | undefined>();
97
+ const [focusedFolder, setFocusedFolder] = useState<FolderType | undefined>();
137
98
  const [selectedFolder, setSelectedFolder] = useState<FolderType | undefined>();
138
- const [showTree, setShowTree] = useState(type !== 'picker');
99
+ const [showTree, setShowTree] = useState(type === 'navigation');
139
100
 
140
101
  const flattenedFolders = useMemo(() => flattenFolders(folders, openFolders), [folders, openFolders]);
141
- const visibleFolderIds = flattenedFolders.map((folder) => folder.id);
142
-
143
- useEffect(() => {
144
- const handleClickOutside = (e: MouseEvent) => {
145
- if (e.target instanceof Element && ref.current && !ref.current.contains(e.target)) {
146
- setShowTree(false);
147
- }
148
- };
149
- if (type === 'picker') {
150
- document.addEventListener('mousedown', handleClickOutside);
151
- return () => {
152
- document.removeEventListener('mousedown', handleClickOutside);
153
- };
154
- }
155
- }, [ref, type]);
156
102
 
157
103
  useEffect(() => {
158
104
  if (defaultOpenFolders) {
@@ -165,25 +111,25 @@ const TreeStructure = ({
165
111
  // eslint-disable-next-line react-hooks/exhaustive-deps
166
112
  }, [defaultOpenFolders]);
167
113
 
168
- useEffect(() => {
169
- setNewFolderParentId(undefined);
170
- }, [selectedFolder]);
171
-
172
114
  useEffect(() => {
173
115
  if (defaultSelectedFolderId !== undefined) {
174
116
  const selected = flattenFolders(folders).find((folder) => folder.id === defaultSelectedFolderId);
175
117
  if (selected) {
176
118
  setSelectedFolder(selected);
119
+ if (type === 'picker') {
120
+ setFocusedFolder(selected);
121
+ }
177
122
  }
178
123
  }
179
124
  // eslint-disable-next-line react-hooks/exhaustive-deps
180
125
  }, [defaultSelectedFolderId]);
181
126
 
182
- useEffect(() => {
183
- if (!loading) {
127
+ const onToggleTree = (open: boolean) => {
128
+ setShowTree(open);
129
+ if (!open) {
184
130
  setNewFolderParentId(undefined);
185
131
  }
186
- }, [loading]);
132
+ };
187
133
 
188
134
  const onCloseFolder = (id: string) => {
189
135
  const closedFolder = flattenedFolders.find((folder) => folder.id === id);
@@ -191,11 +137,7 @@ const TreeStructure = ({
191
137
  if (closedFolder) {
192
138
  const subFolders = closedFolder.subfolders && flattenFolders(closedFolder.subfolders);
193
139
  if (subFolders.some((folder) => folder.id === selectedFolder?.id)) {
194
- if (onSelectFolder) {
195
- setSelectedFolder(closedFolder);
196
- onSelectFolder(closedFolder.id);
197
- }
198
- setFocusedId(closedFolder.id);
140
+ setFocusedFolder(closedFolder);
199
141
  }
200
142
  }
201
143
  setOpenFolders(openFolders.filter((folderId) => folderId !== id));
@@ -208,86 +150,68 @@ const TreeStructure = ({
208
150
  const onSaveNewFolder = (name: string, parentId: string) => {
209
151
  onNewFolder?.(name, parentId).then((newFolder) => {
210
152
  if (newFolder) {
211
- setNewFolderParentId?.(undefined);
212
153
  setSelectedFolder(newFolder);
213
154
  onSelectFolder?.(newFolder.id);
214
- setFocusedId(newFolder.id);
155
+ setFocusedFolder(newFolder);
215
156
  setOpenFolders(uniq(openFolders.concat(parentId)));
157
+ setNewFolderParentId?.(undefined);
158
+ ref.current?.focus();
216
159
  }
217
160
  });
218
161
  };
219
162
 
220
163
  const onCancelNewFolder = () => {
221
164
  setNewFolderParentId?.(undefined);
165
+ ref.current?.focus();
222
166
  };
223
167
 
224
- const canAddFolder = selectedFolder && selectedFolder?.breadcrumbs.length < (maximumLevelsOfFoldersAllowed || 1);
168
+ const setFolderFocus = (folder: FolderType, focus?: boolean) => {
169
+ setFocusedFolder(folder);
170
+
171
+ if (focus) {
172
+ ref.current?.focus();
173
+ }
174
+ };
225
175
 
226
176
  return (
227
- <StyledTreeStructure ref={ref}>
228
- {label && <StyledLabel>{label}</StyledLabel>}
229
- <TreeStructureWrapper aria-label={label} type={type}>
177
+ <StyledTreeStructure>
178
+ {label && <StyledLabel id={treestructureId(type, 'label')}>{label}</StyledLabel>}
179
+ <TreeStructureWrapper
180
+ aria-label={label}
181
+ type={type}
182
+ onBlur={(e) => {
183
+ if (type === 'picker' && !e.currentTarget.contains(e.relatedTarget)) {
184
+ onToggleTree(false);
185
+ }
186
+ }}>
230
187
  {type === 'picker' && (
231
- <StyledRow isOpen={showTree}>
232
- <StyledSelectedFolder
233
- variant="ghost"
234
- colorTheme="light"
235
- fontWeight="normal"
236
- shape="sharp"
237
- onClick={() => {
238
- setShowTree(!showTree);
239
- }}>
240
- {selectedFolder?.name}
241
- </StyledSelectedFolder>
242
- {onNewFolder && showTree && (
243
- <Tooltip
244
- tooltip={
245
- canAddFolder
246
- ? t('myNdla.newFolderUnder', {
247
- folderName: selectedFolder?.name,
248
- })
249
- : t('treeStructure.maxFoldersAlreadyAdded')
250
- }>
251
- <StyledAddFolderButton
252
- variant="outline"
253
- shape="pill"
254
- disabled={!canAddFolder}
255
- aria-label={
256
- canAddFolder
257
- ? t('myNdla.newFolderUnder', {
258
- folderName: selectedFolder?.name,
259
- })
260
- : t('treeStructure.maxFoldersAlreadyAdded')
261
- }
262
- onClick={() => setNewFolderParentId(selectedFolder?.id)}>
263
- <StyledPlus /> {t('myNdla.newFolder')}
264
- </StyledAddFolderButton>
265
- </Tooltip>
266
- )}
267
- <IconButtonDualStates
268
- ariaLabelActive={t('treeStructure.hideFolders')}
269
- ariaLabelInActive={t('treeStructure.showFolders')}
270
- active={showTree}
271
- variant="ghost"
272
- colorTheme="greyLighter"
273
- inactiveIcon={<ChevronDown />}
274
- activeIcon={<ChevronUp />}
275
- size="small"
276
- onClick={() => {
277
- setShowTree(!showTree);
278
- }}
279
- />
280
- </StyledRow>
188
+ <ComboboxButton
189
+ ref={ref}
190
+ showTree={showTree}
191
+ type={type}
192
+ label={label}
193
+ focusedFolder={focusedFolder}
194
+ selectedFolder={selectedFolder}
195
+ setSelectedFolder={setSelectedFolder}
196
+ setFocusedFolder={setFocusedFolder}
197
+ onToggleTree={onToggleTree}
198
+ flattenedFolders={flattenedFolders}
199
+ onCloseFolder={onCloseFolder}
200
+ onOpenFolder={onOpenFolder}
201
+ onNewFolder={onNewFolder}
202
+ maxLevel={maxLevel}
203
+ setNewFolderParentId={setNewFolderParentId}
204
+ />
281
205
  )}
282
206
  {showTree && (
283
207
  <ScrollableDiv type={type}>
284
208
  <FolderItems
285
- focusedFolderId={focusedId}
209
+ focusedFolder={focusedFolder}
286
210
  folders={folders}
287
211
  level={0}
288
212
  loading={loading}
289
213
  selectedFolder={selectedFolder}
290
- maxLevel={maximumLevelsOfFoldersAllowed}
214
+ maxLevel={maxLevel}
291
215
  newFolderParentId={newFolderParentId}
292
216
  onCancelNewFolder={onCancelNewFolder}
293
217
  onCloseFolder={onCloseFolder}
@@ -295,12 +219,12 @@ const TreeStructure = ({
295
219
  onSaveNewFolder={onSaveNewFolder}
296
220
  onSelectFolder={onSelectFolder}
297
221
  openFolders={openFolders}
298
- openOnFolderClick={openOnFolderClick}
299
- setFocusedId={setFocusedId}
222
+ setFocusedFolder={setFolderFocus}
300
223
  setSelectedFolder={setSelectedFolder}
301
224
  targetResource={targetResource}
302
- visibleFolders={visibleFolderIds}
225
+ visibleFolders={flattenedFolders}
303
226
  type={type}
227
+ closeTree={() => onToggleTree(false)}
304
228
  />
305
229
  </ScrollableDiv>
306
230
  )}
@@ -7,27 +7,28 @@
7
7
  */
8
8
 
9
9
  import { KeyboardEvent } from 'react';
10
+ import { FolderType } from './types';
10
11
 
11
12
  const navigateVertical = (
12
- visibleFolders: string[],
13
+ visibleFolders: FolderType[],
13
14
  folderId: string,
14
- setFocusedFolderId: (id: string) => void,
15
+ setFocusedFolderId: (id: FolderType) => void,
15
16
  direction: 1 | -1,
16
17
  ) => {
17
- const currentIndex = visibleFolders.findIndex((id) => id === folderId);
18
+ const currentIndex = visibleFolders.findIndex((folder) => folder.id === folderId);
18
19
  const target = visibleFolders[currentIndex + direction];
19
20
  if (target !== undefined) {
20
21
  setFocusedFolderId(target);
21
22
  }
22
23
  };
23
24
 
24
- const arrowKeys = ['ArrowUp', 'ArrowDown', 'ArrowLeft', 'ArrowRight'];
25
+ const arrowKeys = ['ArrowUp', 'ArrowDown', 'ArrowLeft', 'ArrowRight', 'Enter'];
25
26
 
26
27
  export const arrowNavigation = (
27
28
  e: KeyboardEvent<HTMLElement>,
28
29
  id: string,
29
- visibleFolders: string[],
30
- setFocusedFolderId: (id: string) => void,
30
+ visibleFolders: FolderType[],
31
+ setFocusedFolderId: (id: FolderType) => void,
31
32
  onOpen: (id: string) => void,
32
33
  onClose: (id: string) => void,
33
34
  ) => {
@@ -1,4 +1,4 @@
1
- import { FolderType } from './types';
1
+ import { FolderType, TreeStructureType } from './types';
2
2
 
3
3
  export const flattenFolders = (folders: FolderType[], openFolders?: string[]): FolderType[] => {
4
4
  return folders.reduce((acc, { subfolders, id, ...rest }) => {
@@ -8,3 +8,7 @@ export const flattenFolders = (folders: FolderType[], openFolders?: string[]): F
8
8
  return acc.concat({ subfolders, id, ...rest }, flattenFolders(subfolders, openFolders));
9
9
  }, [] as FolderType[]);
10
10
  };
11
+
12
+ export const treestructureId = (type: TreeStructureType, modifier: string) => {
13
+ return `${type}-treestructure-${modifier}`;
14
+ };
@@ -15,7 +15,7 @@ export interface FolderType extends IFolder {
15
15
  isNavigation?: boolean;
16
16
  }
17
17
 
18
- export type TreeStructureType = 'normal' | 'navigation' | 'picker';
18
+ export type TreeStructureType = 'navigation' | 'picker';
19
19
 
20
20
  export interface TreeStructureMenuProps extends Omit<MenuItemProps, 'onClick'> {
21
21
  onClick: (e: MouseEvent<HTMLDivElement> | undefined, folder: FolderType) => void;
@@ -24,20 +24,19 @@ export interface TreeStructureMenuProps extends Omit<MenuItemProps, 'onClick'> {
24
24
  export interface CommonTreeStructureProps {
25
25
  loading?: boolean;
26
26
  onSelectFolder?: (id: string) => void;
27
- openOnFolderClick?: boolean;
28
27
  targetResource?: IResource;
29
- framed?: boolean;
30
28
  type: TreeStructureType;
31
29
  }
32
30
 
33
31
  export interface CommonFolderItemsProps extends CommonTreeStructureProps {
34
- focusedFolderId?: string;
32
+ focusedFolder?: FolderType;
35
33
  level: number;
36
34
  maxLevel: number;
37
35
  selectedFolder?: FolderType;
38
36
  onCloseFolder: (id: string) => void;
39
37
  onOpenFolder: (id: string) => void;
40
- setFocusedId: (id: string) => void;
41
- setSelectedFolder: (id: FolderType) => void;
42
- visibleFolders: string[];
38
+ setFocusedFolder: (folder: FolderType, focus?: boolean) => void;
39
+ setSelectedFolder: (folder: FolderType) => void;
40
+ visibleFolders: FolderType[];
41
+ closeTree: () => void;
43
42
  }
@@ -26,6 +26,7 @@ const messages = {
26
26
  newFolder: {
27
27
  placeholder: 'Add foldername',
28
28
  defaultName: 'New folder',
29
+ folderName: 'Folder name',
29
30
  },
30
31
  },
31
32
  tagSelector: {
@@ -857,6 +858,7 @@ const messages = {
857
858
  },
858
859
  cancel: 'Cancel',
859
860
  close: 'Close',
861
+ loading: 'Loading',
860
862
  title: 'Title',
861
863
  save: 'Save',
862
864
  image: {
@@ -996,10 +998,14 @@ const messages = {
996
998
  folderDeleted: '"{{folderName}}" deleted',
997
999
  folderCreated: '"{{folderName}} created',
998
1000
  },
1001
+ tagList: 'Tags',
999
1002
  tags: '{{count}} tag',
1000
1003
  tags_plural: '{{count}} tags',
1004
+ moreTags: 'Show one more tag',
1005
+ moreTags_plural: 'Show {{count}} more tags',
1001
1006
  confirmDeleteFolder:
1002
1007
  'Are you sure you want to delete this folder? Subfolders of this folder will also be deleted. This action cannot be undone.',
1008
+
1003
1009
  confirmDeleteTag: 'Are you sure you want to delete this tag? This process cannot be undone.',
1004
1010
  myFolders: 'My folders',
1005
1011
  myTags: 'My tags',
@@ -26,6 +26,7 @@ const messages = {
26
26
  newFolder: {
27
27
  placeholder: 'Skriv navn på mappe',
28
28
  defaultName: 'Ny mappe',
29
+ folderName: 'Mappenavn',
29
30
  },
30
31
  },
31
32
  tagSelector: {
@@ -854,6 +855,7 @@ const messages = {
854
855
  close: 'Lukk meny',
855
856
  },
856
857
  close: 'Lukk',
858
+ loading: 'Laster',
857
859
  title: 'Tittel',
858
860
  cancel: 'Avbryt',
859
861
  save: 'Lagre',
@@ -994,8 +996,11 @@ const messages = {
994
996
  folderDeleted: '"{{folderName}}" er slettet',
995
997
  folderCreated: '"{{folderName}}" er opprettet',
996
998
  },
999
+ tagList: 'Emneknagger',
997
1000
  tags: '{{count}} emneknagg',
998
1001
  tags_plural: '{{count}} emneknagger',
1002
+ moreTags: 'Vis en emneknagg til',
1003
+ moreTags_plural: 'Vis {{count}} emneknagger til',
999
1004
  confirmDeleteFolder:
1000
1005
  'Er du sikker på at du vil slette mappen? Dersom mappen har undermapper vil disse også slettes. Handlingen kan ikke endres.',
1001
1006
  confirmDeleteTag: 'Er du sikker på at du vil slette emneknagg? Denne handlingen kan ikke endres.',
@@ -26,6 +26,7 @@ const messages = {
26
26
  newFolder: {
27
27
  placeholder: 'Skriv namn på mappe',
28
28
  defaultName: 'Ny mappe',
29
+ folderName: 'Mappenavn',
29
30
  },
30
31
  },
31
32
  tagSelector: {
@@ -856,6 +857,7 @@ const messages = {
856
857
  },
857
858
  cancel: 'Avbryt',
858
859
  close: 'Lukk',
860
+ loading: 'Laster',
859
861
  title: 'Tittel',
860
862
  save: 'Lagre',
861
863
  image: {
@@ -995,8 +997,11 @@ const messages = {
995
997
  folderDeleted: '"{{folderName}}" er sletta',
996
998
  folderCreated: '"{{folderName}}" er oppretta',
997
999
  },
1000
+ tagList: 'Emneknaggar',
998
1001
  tags: '{{count}} emneknagg',
999
1002
  tags_plural: '{{count}} emneknaggar',
1003
+ moreTags: 'Vis ein emneknagg til',
1004
+ moreTags_plural: 'Vis {{count}} emneknaggar til',
1000
1005
  confirmDeleteFolder:
1001
1006
  'Er du sikker på at du vil slette mappa? Dersom mappa har undermapper vil desse også slettast. Denne handlinga kan ikkje endrast.',
1002
1007
  confirmDeleteTag: 'Er du sikker på at du vil slette tag? Denne handlinga kan ikkje endrast.',
@@ -26,6 +26,7 @@ const messages = {
26
26
  newFolder: {
27
27
  placeholder: 'Čále nama máhppii',
28
28
  defaultName: 'Ođđa máhppa',
29
+ folderName: 'Mappenavn',
29
30
  },
30
31
  },
31
32
  tagSelector: {
@@ -855,6 +856,7 @@ const messages = {
855
856
  close: 'Govčča fálu',
856
857
  },
857
858
  close: 'Govčča',
859
+ loading: 'Laster',
858
860
  title: 'Tihttel',
859
861
  cancel: 'Botkke',
860
862
  save: 'Vurke',
@@ -995,8 +997,11 @@ const messages = {
995
997
  folderDeleted: '"{{folderName}}" lea sihkkojuvvon',
996
998
  folderCreated: '"{{folderName}}" er oppretta',
997
999
  },
1000
+ tagList: 'Emneknagger',
998
1001
  tags: '{{count}} fáddágilkor',
999
1002
  tags_plural: '{{count}} fáddágilkorat',
1003
+ moreTags: 'Vis ein emneknagg til',
1004
+ moreTags_plural: 'Vis {{count}} emneknaggar til',
1000
1005
  confirmDeleteFolder: 'Leat go áibbas sihkar ahte dáhtut sihkkut máhpa? Dan ii sáhte gáhtat.',
1001
1006
  confirmDeleteTag: 'Leat go áibbas sihkar ahte dáhtut sihkkut fáddágilkora? Dan ii sáhte gáhtat.',
1002
1007
  myFolders: 'Mu máhpat',
@@ -1013,6 +1018,7 @@ const messages = {
1013
1018
  listView: 'Oppalašlistu',
1014
1019
  detailView: 'Bienalaš oppalašlistu',
1015
1020
  shortView: 'Oanehis listu',
1021
+
1016
1022
  myPage: {
1017
1023
  confirmDeleteAccount: 'Leat go áibbas sihkar ahte dáhtut sihkkut kontu?',
1018
1024
  confirmDeleteAccountButton: 'Sihko kontu',
@@ -26,6 +26,7 @@ const messages = {
26
26
  newFolder: {
27
27
  placeholder: 'Skriv navn på mappe',
28
28
  defaultName: 'Ny mappe',
29
+ folderName: 'Mappenavn',
29
30
  },
30
31
  },
31
32
  tagSelector: {
@@ -855,6 +856,7 @@ const messages = {
855
856
  close: 'Lukk meny',
856
857
  },
857
858
  close: 'Lukk',
859
+ loading: 'Laster',
858
860
  title: 'Tittel',
859
861
  cancel: 'Avbryt',
860
862
  save: 'Lagre',
@@ -995,10 +997,14 @@ const messages = {
995
997
  folderDeleted: '"{{folderName}}" er slettet',
996
998
  folderCreated: '"{{folderName}}" er oppretta',
997
999
  },
1000
+ tagList: 'Emneknagg',
998
1001
  tags: '{{count}} emneknagg',
999
1002
  tags_plural: '{{count}} emneknagger',
1003
+ moreTags: 'Vis ein emneknagg til',
1004
+ moreTags_plural: 'Vis {{count}} emneknaggar til',
1000
1005
  confirmDeleteFolder:
1001
1006
  'Er du sikker på at du vil slette mappa? Dersom mappa har undermappar vil disse også slettes. Denne handlinga kan ikkje endrast.',
1007
+
1002
1008
  confirmDeleteTag: 'Er du sikker på at du vil slette emneknagg? Denne handlingen kan ikke endres.',
1003
1009
  myFolders: 'Mine mapper',
1004
1010
  myTags: 'Mine emneknagger',
package/src/.DS_Store DELETED
Binary file