@reykjavik/hanna-react 0.10.62 → 0.10.65

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.
package/CHANGELOG.md CHANGED
@@ -4,6 +4,21 @@
4
4
 
5
5
  - ... <!-- Add new lines here. -->
6
6
 
7
+ ## 0.10.63 – 0.10.65
8
+
9
+ _2022-08-29_
10
+
11
+ - feat: Changes to `FileInput`
12
+ - feat: Add prop `FileList` to suppress (`false`) or customize its rendering
13
+ - feat: Add props `multiple`, `accept`
14
+ - feat: Deprecate prop `dropzoneProps`
15
+ - fix: report deleted when adding files in single-file mode
16
+ - fix: Make `dropZoneProps` optional, as originally indented
17
+ - fix: Re-populate the file input on `value` prop change
18
+ - feat: Explicitly skip rendering input element when `name` is missing
19
+ - fix: Hide `Carousel` mouse-cursor scroll controls at start/end positions
20
+ - fix: Pass `id` and other HTML props to static (span) `TagPill`s
21
+
7
22
  ## 0.10.62
8
23
 
9
24
  _2022-08-23_
@@ -0,0 +1,36 @@
1
+ export declare type CustomFile = {
2
+ preview?: string;
3
+ } & File;
4
+ /**
5
+ * Attaches a `preview` prop to file objects that don't already have a `preview` key defined
6
+ *
7
+ * The preview's value is either a data URI (for image-type files) or `undefined`
8
+ */
9
+ export declare const addPreview: (file: CustomFile) => void;
10
+ /**
11
+ * Revokes `preview` data URIs to avoid memory leaks
12
+ *
13
+ * (See: https://developer.mozilla.org/en-US/docs/Web/API/URL/revokeObjectURL)
14
+ */
15
+ export declare const releasePreview: (file: CustomFile) => void;
16
+ /**
17
+ * Small+stupid file size pretty-printer.
18
+ */
19
+ export declare const formatBytes: (bytes: number, decimals?: number) => string;
20
+ /**
21
+ * Figures out how to handle adding files to a FileInput
22
+ * Which files to retaine, which too delete, and
23
+ * what the updated fileList should look like.
24
+ *
25
+ *
26
+ */
27
+ export declare const getFileListUpdate: (oldFileList: Array<File>, added: Array<File>, replaceMode: boolean) => {
28
+ fileList: File[];
29
+ diff: {
30
+ added: File[];
31
+ deleted: File[];
32
+ } | {
33
+ added: File[];
34
+ deleted?: undefined;
35
+ };
36
+ };
@@ -0,0 +1,69 @@
1
+ "use strict";
2
+ Object.defineProperty(exports, "__esModule", { value: true });
3
+ exports.getFileListUpdate = exports.formatBytes = exports.releasePreview = exports.addPreview = void 0;
4
+ /**
5
+ * Attaches a `preview` prop to file objects that don't already have a `preview` key defined
6
+ *
7
+ * The preview's value is either a data URI (for image-type files) or `undefined`
8
+ */
9
+ const addPreview = (file) => {
10
+ if (!('preview' in file)) {
11
+ file.preview = file.type.includes('image/') ? URL.createObjectURL(file) : undefined;
12
+ }
13
+ };
14
+ exports.addPreview = addPreview;
15
+ /**
16
+ * Revokes `preview` data URIs to avoid memory leaks
17
+ *
18
+ * (See: https://developer.mozilla.org/en-US/docs/Web/API/URL/revokeObjectURL)
19
+ */
20
+ const releasePreview = (file) => {
21
+ file.preview && URL.revokeObjectURL(file.preview);
22
+ delete file.preview;
23
+ };
24
+ exports.releasePreview = releasePreview;
25
+ /**
26
+ * Small+stupid file size pretty-printer.
27
+ */
28
+ const formatBytes = (bytes, decimals = 2) => {
29
+ if (bytes === 0) {
30
+ return '0 Bytes';
31
+ }
32
+ const k = 1024;
33
+ const sizes = ['Bytes', 'KB', 'MB', 'GB', 'TB', 'PB', 'EB', 'ZB', 'YB'];
34
+ const i = Math.floor(Math.log(bytes) / Math.log(k));
35
+ return parseFloat((bytes / Math.pow(k, i)).toFixed(decimals)) + ' ' + sizes[i];
36
+ };
37
+ exports.formatBytes = formatBytes;
38
+ /**
39
+ * Figures out how to handle adding files to a FileInput
40
+ * Which files to retaine, which too delete, and
41
+ * what the updated fileList should look like.
42
+ *
43
+ *
44
+ */
45
+ const getFileListUpdate = (oldFileList, added,
46
+ /**
47
+ * `replaceMode: true` is the default "single-file" input behavior.
48
+ *
49
+ * Pass `false` to this argument when the "multiple" prop is true.
50
+ */
51
+ replaceMode) => {
52
+ const deleted = replaceMode ? oldFileList : [];
53
+ const retained = [];
54
+ if (!replaceMode) {
55
+ oldFileList.forEach((oldFile) => {
56
+ if (added.find(({ name }) => name === oldFile.name)) {
57
+ deleted.push(oldFile);
58
+ }
59
+ else {
60
+ retained.push(oldFile);
61
+ }
62
+ });
63
+ }
64
+ return {
65
+ fileList: retained.concat(added),
66
+ diff: deleted.length ? { added, deleted } : { added },
67
+ };
68
+ };
69
+ exports.getFileListUpdate = getFileListUpdate;
@@ -0,0 +1,11 @@
1
+ import type { formatBytes } from './_FileInput.utils';
2
+ import { CustomFile } from './_FileInput.utils';
3
+ export declare type FileListProps = {
4
+ files: Array<CustomFile>;
5
+ showFileSize?: boolean;
6
+ showImagePreviews?: boolean;
7
+ removeFileText: string;
8
+ removeFile: (file: File | string) => void;
9
+ formatBytes: typeof formatBytes;
10
+ };
11
+ export declare const DefaultFileList: (props: FileListProps) => JSX.Element | null;
@@ -0,0 +1,24 @@
1
+ "use strict";
2
+ Object.defineProperty(exports, "__esModule", { value: true });
3
+ exports.DefaultFileList = void 0;
4
+ const tslib_1 = require("tslib");
5
+ const react_1 = tslib_1.__importDefault(require("react"));
6
+ const DefaultFileList = (props) => {
7
+ const { files, showFileSize, showImagePreviews, removeFileText, removeFile, formatBytes, } = props;
8
+ if (!files.length) {
9
+ return null;
10
+ }
11
+ return (react_1.default.createElement("ul", { className: "FileInput__filelist" }, files.map((file) => (react_1.default.createElement("li", { key: file.name, className: "FileInput__file" },
12
+ react_1.default.createElement("button", { className: "FileInput__file-remove", type: "button", onClick: () => removeFile(file), "aria-label": removeFileText }, removeFileText),
13
+ react_1.default.createElement("span", { className: "FileInput__fileinfo" },
14
+ showImagePreviews && file.preview && (react_1.default.createElement(react_1.default.Fragment, null,
15
+ react_1.default.createElement("span", { className: "FileInput__preview" },
16
+ react_1.default.createElement("img", { src: file.preview })),
17
+ ' ')),
18
+ react_1.default.createElement("span", { className: "FileInput__filename" }, file.name),
19
+ showFileSize && (react_1.default.createElement("small", { className: "FileInput__filesize" },
20
+ " - (",
21
+ formatBytes(file.size),
22
+ ")"))))))));
23
+ };
24
+ exports.DefaultFileList = DefaultFileList;
package/FileInput.d.ts CHANGED
@@ -1,14 +1,23 @@
1
+ import { FileListProps } from './FileInput/_FileInputFileList';
1
2
  import { FormFieldWrappingProps } from './FormField';
2
- declare type dropzonePropsProps = {
3
- accept?: string;
4
- multiple?: boolean;
5
- };
6
3
  export declare type FileInputProps = {
7
- dropzoneProps: dropzonePropsProps;
4
+ /**
5
+ * Flags if the input should accept multiple, or just a single file at a time.
6
+ *
7
+ * Default: `true`
8
+ */
9
+ multiple?: boolean;
10
+ /**
11
+ * Accepted file mime type(s).
12
+ *
13
+ * Default: no restrictions.
14
+ */
15
+ accept?: string | Array<string>;
8
16
  dropzoneText: string | JSX.Element;
17
+ removeFileText: string;
9
18
  showFileSize?: boolean;
10
19
  showImagePreviews?: boolean;
11
- removeFileText: string;
20
+ FileList?: false | ((props: FileListProps) => JSX.Element | null);
12
21
  onFilesUpdated?: (
13
22
  /** Updated, full list of Files. */
14
23
  files: Array<File>,
@@ -27,6 +36,13 @@ export declare type FileInputProps = {
27
36
  }) => void;
28
37
  name?: string;
29
38
  value?: ReadonlyArray<File>;
39
+ /**
40
+ * @deprecated Use props `multiple`, `accept` instead (Will be removed in v0.11)
41
+ */
42
+ dropzoneProps?: {
43
+ accept?: string;
44
+ multiple?: boolean;
45
+ };
30
46
  } & FormFieldWrappingProps;
31
47
  declare const FileInput: (props: FileInputProps) => JSX.Element;
32
48
  export default FileInput;
package/FileInput.js CHANGED
@@ -5,26 +5,9 @@ const react_1 = tslib_1.__importStar(require("react"));
5
5
  const react_dropzone_1 = require("react-dropzone"); // https://react-dropzone.js.org/#!/Dropzone
6
6
  const hooks_1 = require("@hugsmidjan/react/hooks");
7
7
  const getBemClass_1 = tslib_1.__importDefault(require("@hugsmidjan/react/utils/getBemClass"));
8
+ const _FileInput_utils_1 = require("./FileInput/_FileInput.utils");
9
+ const _FileInputFileList_1 = require("./FileInput/_FileInputFileList");
8
10
  const FormField_1 = tslib_1.__importDefault(require("./FormField"));
9
- /**
10
- * Attaches a `preview` prop to file objects that don't already have a `preview` key defined
11
- *
12
- * The preview's value is either a data URI (for image-type files) or `undefined`
13
- */
14
- const addPreview = (file) => {
15
- if (!('preview' in file)) {
16
- file.preview = file.type.includes('image/') ? URL.createObjectURL(file) : undefined;
17
- }
18
- };
19
- /**
20
- * Revokes `preview` data URIs to avoid memory leaks
21
- *
22
- * (See: https://developer.mozilla.org/en-US/docs/Web/API/URL/revokeObjectURL)
23
- */
24
- const releasePreview = (file) => {
25
- file.preview && URL.revokeObjectURL(file.preview);
26
- delete file.preview;
27
- };
28
11
  const arrayToFileList = (arr) => {
29
12
  const fileList = new DataTransfer();
30
13
  arr.forEach((item) => {
@@ -32,114 +15,108 @@ const arrayToFileList = (arr) => {
32
15
  });
33
16
  return fileList.files;
34
17
  };
35
- const formatBytes = (bytes, decimals = 2) => {
36
- if (bytes === 0) {
37
- return '0 Bytes';
38
- }
39
- const k = 1024;
40
- const sizes = ['Bytes', 'KB', 'MB', 'GB', 'TB', 'PB', 'EB', 'ZB', 'YB'];
41
- const i = Math.floor(Math.log(bytes) / Math.log(k));
42
- return parseFloat((bytes / Math.pow(k, i)).toFixed(decimals)) + ' ' + sizes[i];
43
- };
44
18
  const FileInput = (props) => {
45
- const { className, id, label, hideLabel, dropzoneProps = { multiple: true }, dropzoneText, removeFileText, assistText, disabled, invalid, errorMessage, required, reqText, onFilesUpdated = () => undefined, showFileSize, showImagePreviews, value = [] } = props, inputElementProps = tslib_1.__rest(props, ["className", "id", "label", "hideLabel", "dropzoneProps", "dropzoneText", "removeFileText", "assistText", "disabled", "invalid", "errorMessage", "required", "reqText", "onFilesUpdated", "showFileSize", "showImagePreviews", "value"]);
19
+ const { className, id, label, hideLabel, dropzoneProps = { multiple: true }, multiple = dropzoneProps.multiple, accept, dropzoneText, removeFileText, assistText, disabled, invalid, errorMessage, required, reqText, FileList = _FileInputFileList_1.DefaultFileList, onFilesUpdated = () => undefined, showFileSize, showImagePreviews, value = [] } = props, inputElementProps = tslib_1.__rest(props, ["className", "id", "label", "hideLabel", "dropzoneProps", "multiple", "accept", "dropzoneText", "removeFileText", "assistText", "disabled", "invalid", "errorMessage", "required", "reqText", "FileList", "onFilesUpdated", "showFileSize", "showImagePreviews", "value"]);
46
20
  const domid = (0, hooks_1.useDomid)(id);
47
21
  const fileInputWrapper = (0, react_1.useRef)(null);
48
22
  const fileInput = (0, react_1.useRef)(null);
49
23
  const files = value;
50
24
  const [isHover, setIsHover] = (0, react_1.useState)(false);
51
- const { getRootProps, getInputProps, isDragReject, inputRef } = (0, react_dropzone_1.useDropzone)(Object.assign({ onDrop: (acceptedFiles) => {
25
+ const { getRootProps, getInputProps, isDragReject, inputRef } = (0, react_dropzone_1.useDropzone)({
26
+ onDrop: (acceptedFiles) => {
52
27
  acceptedFiles = acceptedFiles.map((file) => {
53
- addPreview(file);
28
+ (0, _FileInput_utils_1.addPreview)(file);
54
29
  return file;
55
30
  });
56
- addFiles(acceptedFiles); // eslint-disable-line
31
+ // eslint-disable-next-line @typescript-eslint/no-use-before-define
32
+ addFiles(acceptedFiles);
57
33
  setIsHover(false);
58
- }, onDropRejected: (rejectedFiles) => {
34
+ },
35
+ onDropRejected: (rejectedFiles) => {
59
36
  window.alert('Error:\n' +
60
37
  rejectedFiles
61
38
  .map((elm) => {
62
39
  return elm.name;
63
40
  })
64
41
  .join(', '));
65
- }, onDragEnter: () => {
42
+ },
43
+ onDragEnter: () => {
66
44
  // 'dragLeave' always fires right after 'dragEnter', use 'dragOver' instead
67
45
  // console.log('enter');
68
46
  // setIsHover(true);
69
- }, onDragLeave: () => {
47
+ },
48
+ onDragLeave: () => {
70
49
  // console.log('leave');
71
50
  setIsHover(false);
72
- }, onDragOver: () => {
51
+ },
52
+ onDragOver: () => {
73
53
  // TODO: add error icon? 'isDragReject' gives unstable results
74
54
  // console.log(isDragReject);
75
55
  setIsHover(true);
76
- } }, dropzoneProps));
77
- // Add previews on incoming files
56
+ },
57
+ multiple,
58
+ accept,
59
+ });
60
+ // Synchronoyusly add previews on incoming files
78
61
  // (NOTE: `addPreview` ignores files that already have preview.)
79
- files.forEach(addPreview);
80
- (0, react_1.useEffect)(() => () => {
81
- // Make sure to revoke the data uris on unmount to avoid memory leaks
82
- files.forEach(releasePreview);
62
+ files.forEach(_FileInput_utils_1.addPreview);
63
+ (0, react_1.useEffect)(() => {
64
+ if (fileInput.current) {
65
+ fileInput.current.files = arrayToFileList(files);
66
+ }
67
+ return () => {
68
+ // Make sure to revoke the data uris on unmount to avoid memory leaks
69
+ files.forEach(_FileInput_utils_1.releasePreview);
70
+ };
83
71
  }, [files]);
84
- const removeFile = (name) => {
72
+ const removeFile = (removeTarget) => {
73
+ const deleted = [];
74
+ const targetName = typeof removeTarget !== 'string' ? removeTarget.name : removeTarget;
75
+ const fileList = files.filter((file) => {
76
+ if (file.name !== targetName) {
77
+ return true;
78
+ }
79
+ deleted.push(file);
80
+ (0, _FileInput_utils_1.releasePreview)(file);
81
+ return false;
82
+ });
85
83
  if (fileInput.current) {
86
- const deleted = [];
87
- const newFileList = files.filter((file) => {
88
- if (file.name !== name) {
89
- return true;
90
- }
91
- deleted.push(file);
92
- releasePreview(file);
93
- return false;
94
- });
95
- fileInput.current.files = arrayToFileList(newFileList);
96
- onFilesUpdated(newFileList, { deleted });
84
+ fileInput.current.files = arrayToFileList(fileList);
97
85
  }
86
+ onFilesUpdated(fileList, { deleted });
98
87
  };
99
88
  const addFiles = (added) => {
89
+ const { fileList, diff } = (0, _FileInput_utils_1.getFileListUpdate)(files, added, !multiple);
100
90
  if (fileInput.current) {
101
- const deleted = [];
102
- const retained = [];
103
- const oldFiles = dropzoneProps.multiple ? files : [];
104
- oldFiles.forEach((oldFile) => {
105
- if (added.find(({ name }) => name === oldFile.name)) {
106
- deleted.push(oldFile);
107
- }
108
- else {
109
- retained.push(oldFile);
110
- }
111
- });
112
- const newFileList = retained.concat(added);
113
- fileInput.current.files = arrayToFileList(newFileList);
114
- const diff = deleted.length ? { added, deleted } : { added };
115
- onFilesUpdated(newFileList, diff);
91
+ fileInput.current.files = arrayToFileList(fileList);
116
92
  }
117
93
  if (inputRef.current) {
118
94
  // Empty on every add
119
95
  inputRef.current.files = arrayToFileList([]);
120
96
  }
97
+ onFilesUpdated(fileList, diff);
121
98
  };
122
- const filesList = files.map((file) => (react_1.default.createElement("li", { key: file.name, className: "FileInput__file" },
123
- react_1.default.createElement("button", { className: "FileInput__file-remove", type: "button", onClick: () => removeFile(file.name), "aria-label": removeFileText }, removeFileText),
124
- react_1.default.createElement("span", { className: "FileInput__fileinfo" },
125
- showImagePreviews && file.preview && (react_1.default.createElement(react_1.default.Fragment, null,
126
- react_1.default.createElement("span", { className: "FileInput__preview" },
127
- react_1.default.createElement("img", { src: file.preview })),
128
- ' ')),
129
- react_1.default.createElement("span", { className: "FileInput__filename" }, file.name),
130
- showFileSize && (react_1.default.createElement("small", { className: "FileInput__filesize" },
131
- " - (",
132
- formatBytes(file.size),
133
- ")"))))));
134
- return (react_1.default.createElement(FormField_1.default, { className: (0, getBemClass_1.default)('FileInput', [dropzoneProps.multiple && 'multi'], className), label: label, id: domid + '-fake', LabelTag: "h4", assistText: assistText, hideLabel: hideLabel, disabled: disabled, invalid: invalid, errorMessage: errorMessage, required: required, reqText: reqText, renderInput: (className, inputProps /* , addFocusProps */) => {
99
+ return (react_1.default.createElement(FormField_1.default, { className: (0, getBemClass_1.default)('FileInput', [multiple && 'multi'], className), label: label, id: domid + '-fake', LabelTag: "h4", assistText: assistText, hideLabel: hideLabel, disabled: disabled, invalid: invalid, errorMessage: errorMessage, required: required, reqText: reqText, renderInput: (className, inputProps /* , addFocusProps */) => {
135
100
  return (react_1.default.createElement("div", { className: className.control, ref: fileInputWrapper },
136
- react_1.default.createElement("input", { className: "FileInput__input", name: inputElementProps.name, id: domid, ref: fileInput, type: "file", style: { display: 'none' }, multiple: dropzoneProps.multiple || undefined, required: inputProps.required }),
137
- ' ',
138
- react_1.default.createElement("input", Object.assign({ className: "FileInput__input--fake" }, getInputProps(), { tabIndex: undefined, style: undefined, multiple: dropzoneProps.multiple || undefined }, inputProps, { required: undefined })),
101
+ // Explicitly skip rendering of input element if no
102
+ // name prop is provided. This is implicitly what the
103
+ // browser does on form submit.
104
+ // https://developer.mozilla.org/en-US/docs/Web/HTML/Element/input#name
105
+ inputElementProps.name ? (react_1.default.createElement("input", { className: "FileInput__input", name: inputElementProps.name, id: domid, ref: fileInput, type: "file", style: { display: 'none' }, multiple: multiple || undefined, required: inputProps.required })) : null,
106
+ react_1.default.createElement("input", Object.assign({
107
+ // fa
108
+ className: "FileInput__input--fake" }, getInputProps(), { tabIndex: undefined, style: undefined, multiple: multiple || undefined }, inputProps, { required: undefined })),
139
109
  ' ',
140
110
  react_1.default.createElement("div", Object.assign({ className: (0, getBemClass_1.default)('FileInput__dropzone', [isHover && 'highlight']) }, getRootProps({ isDragReject }), { tabIndex: undefined }),
141
111
  react_1.default.createElement("p", { className: "FileInput__droptext" }, dropzoneText)),
142
- filesList.length ? react_1.default.createElement("ul", { className: "FileInput__filelist" }, filesList) : ''));
112
+ FileList && (react_1.default.createElement(FileList, Object.assign({}, {
113
+ files,
114
+ showFileSize,
115
+ showImagePreviews,
116
+ removeFileText,
117
+ removeFile,
118
+ formatBytes: _FileInput_utils_1.formatBytes,
119
+ })))));
143
120
  } }));
144
121
  };
145
122
  exports.default = FileInput;
package/TagPill.js CHANGED
@@ -18,10 +18,11 @@ const TagPill = (props) => {
18
18
  removable &&
19
19
  isStatic &&
20
20
  !onRemove &&
21
- console.warn('static (non-button) `TagPill`s must not be removable');
21
+ console.warn('Removable static (non-button) `TagPill`s ' +
22
+ 'must have an `onRemove` handler defined');
22
23
  const modifiers = [modifier, large && 'large', colors[color]];
23
24
  const removeBtn = removable && (react_1.default.createElement("button", { className: "TagPill__remove", onClick: onRemove && (() => onRemove()), "aria-label": removeLabelLong, type: "button" }, removeLabel));
24
- return isStatic ? (react_1.default.createElement("span", { className: (0, getBemClass_1.default)('TagPill', modifiers) },
25
+ return isStatic ? (react_1.default.createElement("span", Object.assign({ className: (0, getBemClass_1.default)('TagPill', modifiers) }, buttonProps),
25
26
  label,
26
27
  " ",
27
28
  removeBtn)) : onRemove ? (react_1.default.createElement("span", { className: (0, getBemClass_1.default)('TagPill', modifiers) },
@@ -95,14 +95,14 @@ const AbstractCarousel = (props) => {
95
95
  title && react_1.default.createElement("h2", { className: bem + '__title' }, title),
96
96
  isBrowser ? (react_1.default.createElement("div", { className: bem + '__itemlist-wrapper' },
97
97
  itemList,
98
- react_1.default.createElement("div", { className: bem + '__itemlist-goLeft', onClick: () => {
98
+ activeItem > 0 && (react_1.default.createElement("div", { className: bem + '__itemlist-goLeft', onClick: () => {
99
99
  delayedScrollLeft.cancel();
100
100
  scrollToItem(activeItem - 1);
101
- }, onMouseOver: () => delayedScrollLeft(activeItem), onMouseOut: () => delayedScrollLeft.cancel() }),
102
- react_1.default.createElement("div", { className: bem + '__itemlist-goRight', onClick: () => {
101
+ }, onMouseOver: () => delayedScrollLeft(activeItem), onMouseOut: () => delayedScrollLeft.cancel() })),
102
+ activeItem < itemCount - 1 && (react_1.default.createElement("div", { className: bem + '__itemlist-goRight', onClick: () => {
103
103
  delayedScrollRight.cancel();
104
104
  scrollToItem(activeItem + 1);
105
- }, onMouseOver: () => delayedScrollRight(activeItem), onMouseOut: () => delayedScrollRight.cancel() }))) : (itemList),
105
+ }, onMouseOver: () => delayedScrollRight(activeItem), onMouseOut: () => delayedScrollRight.cancel() })))) : (itemList),
106
106
  isBrowser && (react_1.default.createElement(CarouselStepper_1.default, { itemCount: itemCount, setCurrent: scrollToItem, current: activeItem }))));
107
107
  };
108
108
  exports.default = AbstractCarousel;
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "@reykjavik/hanna-react",
3
- "version": "0.10.62",
3
+ "version": "0.10.65",
4
4
  "author": "Reykjavík (http://www.reykjavik.is)",
5
5
  "contributors": [
6
6
  "Hugsmiðjan ehf (http://www.hugsmidjan.is)",
@@ -15,8 +15,8 @@
15
15
  "dependencies": {
16
16
  "@hugsmidjan/qj": "^4.10.2",
17
17
  "@hugsmidjan/react": "^0.4.17",
18
- "@reykjavik/hanna-css": "^0.3.3",
19
- "@reykjavik/hanna-utils": "^0.1.7",
18
+ "@reykjavik/hanna-css": "^0.3.7",
19
+ "@reykjavik/hanna-utils": "^0.1.11",
20
20
  "@types/react": "^17.0.24",
21
21
  "@types/react-autosuggest": "^10.1.0",
22
22
  "@types/react-datepicker": "^3.0.2",