@tenancy.nz/gallery 1.10.1 → 1.10.3

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.
@@ -16,6 +16,15 @@ function _defineProperty(e, r, t) {
16
16
  writable: true
17
17
  }) : e[r] = t, e;
18
18
  }
19
+ function _extends() {
20
+ return _extends = Object.assign ? Object.assign.bind() : function (n) {
21
+ for (var e = 1; e < arguments.length; e++) {
22
+ var t = arguments[e];
23
+ for (var r in t) ({}).hasOwnProperty.call(t, r) && (n[r] = t[r]);
24
+ }
25
+ return n;
26
+ }, _extends.apply(null, arguments);
27
+ }
19
28
  function _iterableToArrayLimit(r, l) {
20
29
  var t = null == r ? null : "undefined" != typeof Symbol && r[Symbol.iterator] || r["@@iterator"];
21
30
  if (null != t) {
@@ -43,6 +52,9 @@ function _iterableToArrayLimit(r, l) {
43
52
  function _nonIterableRest() {
44
53
  throw new TypeError("Invalid attempt to destructure non-iterable instance.\nIn order to be iterable, non-array objects must have a [Symbol.iterator]() method.");
45
54
  }
55
+ function _objectDestructuringEmpty(t) {
56
+ if (null == t) throw new TypeError("Cannot destructure " + t);
57
+ }
46
58
  function ownKeys(e, r) {
47
59
  var t = Object.keys(e);
48
60
  if (Object.getOwnPropertySymbols) {
@@ -119,8 +131,10 @@ function _unsupportedIterableToArray(r, a) {
119
131
  exports.arrayLikeToArray = _arrayLikeToArray;
120
132
  exports.arrayWithHoles = _arrayWithHoles;
121
133
  exports.defineProperty = _defineProperty;
134
+ exports.extends = _extends;
122
135
  exports.iterableToArrayLimit = _iterableToArrayLimit;
123
136
  exports.nonIterableRest = _nonIterableRest;
137
+ exports.objectDestructuringEmpty = _objectDestructuringEmpty;
124
138
  exports.objectSpread2 = _objectSpread2;
125
139
  exports.objectWithoutProperties = _objectWithoutProperties;
126
140
  exports.objectWithoutPropertiesLoose = _objectWithoutPropertiesLoose;
@@ -0,0 +1,24 @@
1
+ 'use strict';
2
+
3
+ Object.defineProperty(exports, '__esModule', { value: true });
4
+
5
+ var _rollupPluginBabelHelpers = require('../_virtual/_rollupPluginBabelHelpers.cjs');
6
+ var React = require('react');
7
+ var DragIndicatorIcon = require('@tenancy.nz/icons/DragIndicator');
8
+ var GalleryDragHandle_styled = require('./GalleryDragHandle.styled.cjs');
9
+
10
+ var GalleryDragHandle = /*#__PURE__*/React.forwardRef(function GalleryDragHandle2(_ref, ref) {
11
+ var rest = _rollupPluginBabelHelpers.extends({}, (_rollupPluginBabelHelpers.objectDestructuringEmpty(_ref), _ref));
12
+ return /* @__PURE__ */React.createElement(GalleryDragHandle_styled.default, _rollupPluginBabelHelpers.objectSpread2(_rollupPluginBabelHelpers.objectSpread2({
13
+ size: "small",
14
+ sx: {
15
+ color: "#fff"
16
+ }
17
+ }, rest), {}, {
18
+ ref: ref
19
+ }), /* @__PURE__ */React.createElement(DragIndicatorIcon, {
20
+ size: 24
21
+ }));
22
+ });
23
+
24
+ exports.default = GalleryDragHandle;
@@ -0,0 +1,12 @@
1
+ 'use strict';
2
+
3
+ Object.defineProperty(exports, '__esModule', { value: true });
4
+
5
+ var _rollupPluginBabelHelpers = require('../_virtual/_rollupPluginBabelHelpers.cjs');
6
+ var IconButton = require('@mui/material/IconButton');
7
+ var styles = require('@mui/material/styles');
8
+
9
+ var _templateObject;
10
+ var StyledGalleryDragHandle = styles.styled(IconButton)(_templateObject || (_templateObject = _rollupPluginBabelHelpers.taggedTemplateLiteral(["\n cursor: grab;\n touch-action: manipulation;\n"])));
11
+
12
+ exports.default = StyledGalleryDragHandle;
@@ -0,0 +1,16 @@
1
+ 'use strict';
2
+
3
+ Object.defineProperty(exports, '__esModule', { value: true });
4
+
5
+ var React = require('react');
6
+ var ui = require('@tenancy.nz/ui');
7
+ var GalleryDragOverlay_styled = require('./GalleryDragOverlay.styled.cjs');
8
+
9
+ function GalleryDragOverlay(_ref) {
10
+ var src = _ref.src;
11
+ return /* @__PURE__ */React.createElement(GalleryDragOverlay_styled.default, null, /* @__PURE__ */React.createElement(ui.Media, {
12
+ src: src
13
+ }));
14
+ }
15
+
16
+ exports.default = GalleryDragOverlay;
@@ -0,0 +1,13 @@
1
+ 'use strict';
2
+
3
+ Object.defineProperty(exports, '__esModule', { value: true });
4
+
5
+ var _rollupPluginBabelHelpers = require('../_virtual/_rollupPluginBabelHelpers.cjs');
6
+ var react = require('@emotion/react');
7
+ var styles = require('@mui/material/styles');
8
+
9
+ var _templateObject, _templateObject2;
10
+ var pop = react.keyframes(_templateObject || (_templateObject = _rollupPluginBabelHelpers.taggedTemplateLiteral(["\n 0% {\n transform: scale(1);\n }\n 100% {\n transform: scale(1.05);\n box-shadow:\n 0 0 0 calc(1px / 1.05) rgba(63, 63, 68, 0.05),\n -1px 0 15px 0 rgba(34, 33, 81, 0.01),\n 0px 15px 15px 0 rgba(34, 33, 81, 0.25);\n }\n"])));
11
+ var StyledGalleryDragOverlay = styles.styled("div")(_templateObject2 || (_templateObject2 = _rollupPluginBabelHelpers.taggedTemplateLiteral(["\n height: 162px;\n width: 162px;\n cursor: move;\n animation: ", " 200ms cubic-bezier(0.18, 0.67, 0.6, 1.22);\n box-shadow:\n 0 0 0 calc(1px / 1.05) rgba(63, 63, 68, 0.05),\n -1px 0 15px 0 rgba(34, 33, 81, 0.01),\n 0px 15px 15px 0 rgba(34, 33, 81, 0.25);\n opacity: 1;\n z-index: 999;\n transform: scale(1.05);\n transform-origin: 50% 50%;\n border-radius: 8px;\n overflow: hidden;\n"])), pop);
12
+
13
+ exports.default = StyledGalleryDragOverlay;
@@ -8,12 +8,12 @@ var ZoomInIcon = require('@tenancy.nz/icons/ZoomInOutlined');
8
8
  var ui = require('@tenancy.nz/ui');
9
9
  var GalleryImage_styled = require('./GalleryImage.styled.cjs');
10
10
 
11
- var _excluded = ["actions", "caption", "dragging", "onClick", "src", "uploading"];
11
+ var _excluded = ["actions", "tag", "dragging", "onClick", "src", "uploading"];
12
12
  var GalleryImage = /*#__PURE__*/React.forwardRef(function GalleryImage2(_ref, ref) {
13
13
  var _ref$actions = _ref.actions,
14
14
  actions = _ref$actions === void 0 ? void 0 : _ref$actions,
15
- _ref$caption = _ref.caption,
16
- caption = _ref$caption === void 0 ? void 0 : _ref$caption,
15
+ _ref$tag = _ref.tag,
16
+ tag = _ref$tag === void 0 ? void 0 : _ref$tag,
17
17
  _ref$dragging = _ref.dragging,
18
18
  dragging = _ref$dragging === void 0 ? void 0 : _ref$dragging,
19
19
  _ref$onClick = _ref.onClick,
@@ -37,7 +37,11 @@ var GalleryImage = /*#__PURE__*/React.forwardRef(function GalleryImage2(_ref, re
37
37
  onClick: onClick
38
38
  }, actions, onClick && /* @__PURE__ */React.createElement(ZoomInIcon, {
39
39
  size: "inherit"
40
- })), !uploading && caption && /* @__PURE__ */React.createElement(GalleryImage_styled.StyledGalleryImageText, null, caption));
40
+ })), !uploading && tag && /* @__PURE__ */React.createElement(ui.AbsBox, {
41
+ right: 12,
42
+ bottom: 8,
43
+ zIndex: 2
44
+ }, tag));
41
45
  });
42
46
 
43
47
  exports.default = GalleryImage;
@@ -27,9 +27,9 @@ var StyledGalleryImageOverlay = styles.styled("div", {
27
27
  var visible = _ref2.visible;
28
28
  return react.css(_templateObject5 || (_templateObject5 = _rollupPluginBabelHelpers.taggedTemplateLiteral(["\n position: absolute;\n left: 0;\n top: 0;\n width: 100%;\n height: 100%;\n display: flex;\n align-items: center;\n justify-content: center;\n z-index: 3;\n background: rgba(0, 0, 0, 0.5);\n color: #fff;\n font-size: 50px;\n transition: all 275ms ease-in-out;\n ", "\n "])), !visible && react.css(_templateObject6 || (_templateObject6 = _rollupPluginBabelHelpers.taggedTemplateLiteral(["\n opacity: 0;\n visibility: hidden;\n backface-visibility: hidden;\n cursor: pointer;\n background: rgba(0, 0, 0, 0.38);\n "]))));
29
29
  });
30
- var StyledGalleryImageText = styles.styled("span")(_templateObject7 || (_templateObject7 = _rollupPluginBabelHelpers.taggedTemplateLiteral(["\n display: inline-flex;\n position: absolute;\n right: 8px;\n bottom: 8px;\n padding: 2px 8px;\n border-radius: 4px;\n background: rgba(0, 0, 0, 0.6);\n color: #fff;\n font-weight: 500;\n z-index: 2;\n font-size: 12px;\n"])));
30
+ var StyledGalleryImageAction = styles.styled("div")(_templateObject7 || (_templateObject7 = _rollupPluginBabelHelpers.taggedTemplateLiteral(["\n position: absolute;\n left: 0;\n top: 0;\n right: 0;\n display: flex;\n align-items: center;\n z-index: 4;\n\n > * {\n margin: 4px 2px;\n }\n\n > *:last-child {\n margin-left: auto;\n }\n"])));
31
31
 
32
+ exports.StyledGalleryImageAction = StyledGalleryImageAction;
32
33
  exports.StyledGalleryImageOverlay = StyledGalleryImageOverlay;
33
- exports.StyledGalleryImageText = StyledGalleryImageText;
34
34
  exports.default = StyledGalleryImage;
35
35
  exports.galleryImageOverlayClassName = galleryImageOverlayClassName;
@@ -10,7 +10,7 @@ var StyledGalleryViewer = styles.styled("div")(_templateObject || (_templateObje
10
10
  var StyledGalleryViewerFigure = styles.styled("figure")(_templateObject2 || (_templateObject2 = _rollupPluginBabelHelpers.taggedTemplateLiteral(["\n display: flex;\n flex-direction: column;\n align-items: center;\n max-width: 100%;\n max-height: 100%;\n margin: 0;\n"])));
11
11
  var StyledGalleryViewerImage = styles.styled("img")(_templateObject3 || (_templateObject3 = _rollupPluginBabelHelpers.taggedTemplateLiteral(["\n max-width: 100%;\n max-height: calc(100vh - 160px);\n object-fit: contain;\n box-shadow: 0 4px 24px rgba(0, 0, 0, 0.5);\n"])));
12
12
  var StyledGalleryViewerCaption = styles.styled("figcaption")(_templateObject4 || (_templateObject4 = _rollupPluginBabelHelpers.taggedTemplateLiteral(["\n display: flex;\n width: 100%;\n justify-content: center;\n align-items: center;\n gap: 10px;\n margin-top: 16px;\n color: #fff;\n font-size: 16px;\n font-weight: 660;\n\n > div {\n width: 36px;\n height: 36px;\n display: flex;\n justify-content: center;\n align-items: center;\n }\n"])));
13
- var viewerButtonStyles = react.css(_templateObject5 || (_templateObject5 = _rollupPluginBabelHelpers.taggedTemplateLiteral(["\n && {\n position: absolute;\n display: flex;\n align-items: center;\n justify-content: center;\n width: 48px;\n height: 48px;\n padding: 0;\n border: 1px solid ", ";\n border-radius: 4px;\n background: ", ";\n color: ", ";\n font-size: 24px;\n cursor: pointer;\n transition: background 175ms ease-in-out;\n\n &:hover {\n background: ", ";\n }\n }\n"])), ui.token("palette.component.button.secondary.borderColor"), ui.token("palette.component.button.secondary.backgroundDefault"), ui.token("palette.semantic.icons.primaryColor"), ui.token("palette.component.button.secondary.backgroundDefault"));
13
+ var viewerButtonStyles = react.css(_templateObject5 || (_templateObject5 = _rollupPluginBabelHelpers.taggedTemplateLiteral(["\n && {\n position: absolute;\n display: flex;\n align-items: center;\n justify-content: center;\n width: 48px;\n height: 48px;\n padding: 0;\n border: 1px solid ", ";\n border-radius: 4px;\n background: ", ";\n color: ", ";\n font-size: 24px;\n cursor: pointer;\n transition: background 175ms ease-in-out;\n }\n\n &&:hover {\n background: ", " !important;\n color: ", " !important;\n }\n"])), ui.token("palette.component.button.secondary.borderColor"), ui.token("palette.component.button.secondary.backgroundDefault"), ui.token("palette.semantic.icons.primaryColor"), ui.token("palette.component.button.secondary.backgroundDefault"), ui.token("palette.semantic.icons.primaryColor"));
14
14
  var StyledGalleryViewerClose = styles.styled("button")(_templateObject6 || (_templateObject6 = _rollupPluginBabelHelpers.taggedTemplateLiteral(["\n ", ";\n top: 16px;\n right: 16px;\n"])), viewerButtonStyles);
15
15
  var StyledGalleryViewerPrev = styles.styled("button")(_templateObject7 || (_templateObject7 = _rollupPluginBabelHelpers.taggedTemplateLiteral(["\n ", ";\n left: 16px;\n top: 50%;\n transform: translateY(-50%);\n"])), viewerButtonStyles);
16
16
  var StyledGalleryViewerNext = styles.styled("button")(_templateObject8 || (_templateObject8 = _rollupPluginBabelHelpers.taggedTemplateLiteral(["\n ", ";\n right: 16px;\n top: 50%;\n transform: translateY(-50%);\n"])), viewerButtonStyles);
@@ -0,0 +1,163 @@
1
+ 'use strict';
2
+
3
+ Object.defineProperty(exports, '__esModule', { value: true });
4
+
5
+ var _rollupPluginBabelHelpers = require('../_virtual/_rollupPluginBabelHelpers.cjs');
6
+ var React = require('react');
7
+ var Dropzone = require('react-dropzone');
8
+ var core = require('@dnd-kit/core');
9
+ var sortable = require('@dnd-kit/sortable');
10
+ var Stack = require('@mui/material/Stack');
11
+ var UploadIcon = require('@tenancy.nz/icons/Upload');
12
+ var ui = require('@tenancy.nz/ui');
13
+ var GalleryDragOverlay = require('./GalleryDragOverlay.cjs');
14
+ var SortableGalleryImage = require('./SortableGalleryImage.cjs');
15
+ var Gallery = require('./Gallery.cjs');
16
+ var SortableGallery_styled = require('./SortableGallery.styled.cjs');
17
+
18
+ var _excluded = ["dropzoneText", "dropzoneProps", "onDelete", "onUpload", "onSortComplete"];
19
+ function SortableGallery(_ref) {
20
+ var _ref$dropzoneText = _ref.dropzoneText,
21
+ dropzoneText = _ref$dropzoneText === void 0 ? "" : _ref$dropzoneText,
22
+ _ref$dropzoneProps = _ref.dropzoneProps,
23
+ dropzoneProps = _ref$dropzoneProps === void 0 ? {} : _ref$dropzoneProps,
24
+ _ref$onDelete = _ref.onDelete,
25
+ onDelete = _ref$onDelete === void 0 ? void 0 : _ref$onDelete,
26
+ _ref$onUpload = _ref.onUpload,
27
+ onUpload = _ref$onUpload === void 0 ? void 0 : _ref$onUpload,
28
+ _ref$onSortComplete = _ref.onSortComplete,
29
+ onSortComplete = _ref$onSortComplete === void 0 ? void 0 : _ref$onSortComplete,
30
+ listProps = _rollupPluginBabelHelpers.objectWithoutProperties(_ref, _excluded);
31
+ var _listProps$images = listProps.images,
32
+ images = _listProps$images === void 0 ? [] : _listProps$images,
33
+ loading = listProps.loading,
34
+ infoText = listProps.infoText;
35
+ var _useState = React.useState(null),
36
+ _useState2 = _rollupPluginBabelHelpers.slicedToArray(_useState, 2),
37
+ activeId = _useState2[0],
38
+ setActiveId = _useState2[1];
39
+ var _useState3 = React.useState(null),
40
+ _useState4 = _rollupPluginBabelHelpers.slicedToArray(_useState3, 2),
41
+ confirmDelete = _useState4[0],
42
+ setConfirmDelete = _useState4[1];
43
+ var sensors = core.useSensors(core.useSensor(core.MouseSensor), core.useSensor(core.TouchSensor));
44
+ var handleUpload = React.useCallback(function (acceptedFiles) {
45
+ var readFile = function readFile(file) {
46
+ return new Promise(function (resolve) {
47
+ var reader = new FileReader();
48
+ reader.onload = function () {
49
+ resolve({
50
+ path: reader.result,
51
+ thumb: reader.result,
52
+ name: file.name,
53
+ type: file.type
54
+ });
55
+ };
56
+ reader.readAsDataURL(file);
57
+ });
58
+ };
59
+ Promise.all(acceptedFiles.map(readFile)).then(function (files) {
60
+ onUpload === null || onUpload === void 0 || onUpload(files);
61
+ });
62
+ }, [onUpload]);
63
+ var handleDragStart = function handleDragStart(event) {
64
+ setActiveId(event.active.id);
65
+ };
66
+ var handleDragCancel = function handleDragCancel() {
67
+ setActiveId(null);
68
+ };
69
+ var handleDragEnd = function handleDragEnd(event) {
70
+ var active = event.active,
71
+ over = event.over;
72
+ if (over && active.id !== over.id) {
73
+ var oldIndex = images.findIndex(function (img) {
74
+ return img.thumb === active.id;
75
+ });
76
+ var newIndex = images.findIndex(function (img) {
77
+ return img.thumb === over.id;
78
+ });
79
+ var sortedImages = sortable.arrayMove(images, oldIndex, newIndex);
80
+ onSortComplete === null || onSortComplete === void 0 || onSortComplete(sortedImages, newIndex, oldIndex);
81
+ }
82
+ setActiveId(null);
83
+ };
84
+ var handleDelete = function handleDelete(event, index) {
85
+ event.stopPropagation();
86
+ event.preventDefault();
87
+ setConfirmDelete(index);
88
+ };
89
+ var handleDeleteConfirm = function handleDeleteConfirm() {
90
+ if (confirmDelete !== null) {
91
+ onDelete === null || onDelete === void 0 || onDelete(confirmDelete);
92
+ }
93
+ setConfirmDelete(null);
94
+ };
95
+ return /* @__PURE__ */React.createElement(ui.Box, null, /* @__PURE__ */React.createElement(core.DndContext, {
96
+ sensors: sensors,
97
+ collisionDetection: core.closestCenter,
98
+ onDragCancel: handleDragCancel,
99
+ onDragStart: handleDragStart,
100
+ onDragEnd: handleDragEnd
101
+ }, /* @__PURE__ */React.createElement(sortable.SortableContext, {
102
+ items: images.map(function (image) {
103
+ return image.thumb;
104
+ }),
105
+ strategy: sortable.rectSortingStrategy
106
+ }, /* @__PURE__ */React.createElement(Gallery.default, {
107
+ loading: loading,
108
+ images: images,
109
+ infoText: infoText,
110
+ renderItem: function renderItem(image, i) {
111
+ return /* @__PURE__ */React.createElement(SortableGalleryImage.default, {
112
+ key: image.thumb,
113
+ src: image.thumb,
114
+ tag: i === 0 ? /* @__PURE__ */React.createElement(ui.Tag, {
115
+ color: "white",
116
+ disableIcon: true,
117
+ label: "Cover image",
118
+ variant: "filled"
119
+ }) : void 0,
120
+ onDelete: function onDelete(e) {
121
+ return handleDelete(e, i);
122
+ },
123
+ uploading: !!image.uploading,
124
+ onClick: image.onClick
125
+ });
126
+ }
127
+ })), /* @__PURE__ */React.createElement(core.DragOverlay, {
128
+ adjustScale: false
129
+ }, activeId ? /* @__PURE__ */React.createElement(GalleryDragOverlay.default, {
130
+ src: String(activeId)
131
+ }) : null)), /* @__PURE__ */React.createElement(Dropzone, _rollupPluginBabelHelpers.objectSpread2(_rollupPluginBabelHelpers.objectSpread2({}, _rollupPluginBabelHelpers.objectSpread2({
132
+ disabled: loading
133
+ }, dropzoneProps)), {}, {
134
+ accept: {
135
+ "image/*": []
136
+ },
137
+ onDrop: handleUpload
138
+ }), function (_ref2) {
139
+ var getRootProps = _ref2.getRootProps,
140
+ getInputProps = _ref2.getInputProps;
141
+ return /* @__PURE__ */React.createElement(SortableGallery_styled.default, _rollupPluginBabelHelpers.objectSpread2({}, getRootProps()), /* @__PURE__ */React.createElement("input", _rollupPluginBabelHelpers.objectSpread2({}, getInputProps())), /* @__PURE__ */React.createElement(Stack, {
142
+ gap: 2,
143
+ alignItems: "center"
144
+ }, /* @__PURE__ */React.createElement(UploadIcon, {
145
+ size: 68
146
+ }), /* @__PURE__ */React.createElement(ui.Text, {
147
+ variant: "body2",
148
+ weight: "400"
149
+ }, dropzoneText || /* @__PURE__ */React.createElement(React.Fragment, null, "Drag and drop image(s) here, or ", /* @__PURE__ */React.createElement("u", null, "choose image")))));
150
+ }), /* @__PURE__ */React.createElement(ui.Confirmation, {
151
+ open: confirmDelete !== null,
152
+ severity: "destructive",
153
+ title: "Delete image?",
154
+ message: "Deleting this image will permanently remove it from the system. This action cannot be undone.",
155
+ onCancel: function onCancel() {
156
+ return setConfirmDelete(null);
157
+ },
158
+ onConfirm: handleDeleteConfirm,
159
+ confirmBtnText: "Delete"
160
+ }));
161
+ }
162
+
163
+ exports.default = SortableGallery;
@@ -0,0 +1,16 @@
1
+ 'use strict';
2
+
3
+ Object.defineProperty(exports, '__esModule', { value: true });
4
+
5
+ var _rollupPluginBabelHelpers = require('../_virtual/_rollupPluginBabelHelpers.cjs');
6
+ var react = require('@emotion/react');
7
+ var styles = require('@mui/material/styles');
8
+ var ui = require('@tenancy.nz/ui');
9
+
10
+ var _templateObject, _templateObject2;
11
+ var StyledDropzone = styles.styled("div")(_templateObject || (_templateObject = _rollupPluginBabelHelpers.taggedTemplateLiteral(["\n ", "\n"])), function (_ref) {
12
+ var theme = _ref.theme;
13
+ return react.css(_templateObject2 || (_templateObject2 = _rollupPluginBabelHelpers.taggedTemplateLiteral(["\n border: 2px dashed ", ";\n background: #fff;\n margin: 24px 0 0 0;\n padding: 32px 16px;\n border-radius: ", "px;\n color: ", ";\n max-height: 176px;\n "])), ui.token("palette.semantic.border.accentColor"), theme.shape.borderRadius, ui.token("palette.semantic.text.primaryColor"));
14
+ });
15
+
16
+ exports.default = StyledDropzone;
@@ -0,0 +1,75 @@
1
+ 'use strict';
2
+
3
+ Object.defineProperty(exports, '__esModule', { value: true });
4
+
5
+ var _rollupPluginBabelHelpers = require('../_virtual/_rollupPluginBabelHelpers.cjs');
6
+ var React = require('react');
7
+ var sortable = require('@dnd-kit/sortable');
8
+ var utilities = require('@dnd-kit/utilities');
9
+ var DeleteOutlinedIcon = require('@tenancy.nz/icons/DeleteOutlined');
10
+ var ui = require('@tenancy.nz/ui');
11
+ var GalleryDragHandle = require('./GalleryDragHandle.cjs');
12
+ var GalleryImage = require('./GalleryImage.cjs');
13
+
14
+ var _excluded = ["tag", "onDelete", "src", "uploading"];
15
+ function SortableGalleryImage(_ref) {
16
+ var _ref$tag = _ref.tag,
17
+ tag = _ref$tag === void 0 ? void 0 : _ref$tag,
18
+ _ref$onDelete = _ref.onDelete,
19
+ onDelete = _ref$onDelete === void 0 ? void 0 : _ref$onDelete,
20
+ src = _ref.src,
21
+ _ref$uploading = _ref.uploading,
22
+ uploading = _ref$uploading === void 0 ? false : _ref$uploading,
23
+ rest = _rollupPluginBabelHelpers.objectWithoutProperties(_ref, _excluded);
24
+ var _useSortable = sortable.useSortable({
25
+ id: src
26
+ }),
27
+ attributes = _useSortable.attributes,
28
+ isDragging = _useSortable.isDragging,
29
+ listeners = _useSortable.listeners,
30
+ setNodeRef = _useSortable.setNodeRef,
31
+ setDraggableNodeRef = _useSortable.setDraggableNodeRef,
32
+ transform = _useSortable.transform,
33
+ transition = _useSortable.transition;
34
+ var styles = {
35
+ transform: utilities.CSS.Transform.toString(transform),
36
+ transition: transition
37
+ };
38
+ var actions = function actions() {
39
+ if (!uploading && !isDragging) {
40
+ return /* @__PURE__ */React.createElement(React.Fragment, null, /* @__PURE__ */React.createElement(ui.AbsBox, {
41
+ display: "flex",
42
+ left: 8,
43
+ top: "50%",
44
+ sx: {
45
+ transform: "translateY(-50%)"
46
+ }
47
+ }, /* @__PURE__ */React.createElement(GalleryDragHandle.default, _rollupPluginBabelHelpers.objectSpread2(_rollupPluginBabelHelpers.objectSpread2(_rollupPluginBabelHelpers.objectSpread2({}, attributes), listeners), {}, {
48
+ ref: setDraggableNodeRef
49
+ }))), onDelete && /* @__PURE__ */React.createElement(ui.AbsBox, {
50
+ display: "flex",
51
+ top: 8,
52
+ right: 8,
53
+ zIndex: 2
54
+ }, /* @__PURE__ */React.createElement(ui.IconButton, {
55
+ onClick: onDelete,
56
+ color: "error",
57
+ variant: "contained"
58
+ }, /* @__PURE__ */React.createElement(DeleteOutlinedIcon, {
59
+ size: 20
60
+ }))));
61
+ }
62
+ return void 0;
63
+ };
64
+ return /* @__PURE__ */React.createElement(GalleryImage.default, _rollupPluginBabelHelpers.objectSpread2({
65
+ ref: setNodeRef,
66
+ style: styles,
67
+ dragging: isDragging,
68
+ actions: actions(),
69
+ tag: tag,
70
+ src: src,
71
+ uploading: uploading
72
+ }, rest));
73
+ }
74
+
75
+ exports.default = SortableGalleryImage;
@@ -1,13 +1,21 @@
1
1
  'use strict';
2
2
 
3
3
  var Gallery = require('./components/Gallery.cjs');
4
+ var GalleryDragHandle = require('./components/GalleryDragHandle.cjs');
5
+ var GalleryDragOverlay = require('./components/GalleryDragOverlay.cjs');
4
6
  var GalleryImage = require('./components/GalleryImage.cjs');
5
7
  var GalleryImageSkeleton = require('./components/GalleryImageSkeleton.cjs');
6
8
  var GalleryViewer = require('./components/GalleryViewer.cjs');
9
+ var SortableGallery = require('./components/SortableGallery.cjs');
10
+ var SortableGalleryImage = require('./components/SortableGalleryImage.cjs');
7
11
 
8
12
 
9
13
 
10
14
  exports.Gallery = Gallery.default;
15
+ exports.GalleryDragHandle = GalleryDragHandle.default;
16
+ exports.GalleryDragOverlay = GalleryDragOverlay.default;
11
17
  exports.GalleryImage = GalleryImage.default;
12
18
  exports.GalleryImageSkeleton = GalleryImageSkeleton.default;
13
19
  exports.GalleryViewer = GalleryViewer.default;
20
+ exports.SortableGallery = SortableGallery.default;
21
+ exports.SortableGalleryImage = SortableGalleryImage.default;
@@ -14,6 +14,15 @@ function _defineProperty(e, r, t) {
14
14
  writable: true
15
15
  }) : e[r] = t, e;
16
16
  }
17
+ function _extends() {
18
+ return _extends = Object.assign ? Object.assign.bind() : function (n) {
19
+ for (var e = 1; e < arguments.length; e++) {
20
+ var t = arguments[e];
21
+ for (var r in t) ({}).hasOwnProperty.call(t, r) && (n[r] = t[r]);
22
+ }
23
+ return n;
24
+ }, _extends.apply(null, arguments);
25
+ }
17
26
  function _iterableToArrayLimit(r, l) {
18
27
  var t = null == r ? null : "undefined" != typeof Symbol && r[Symbol.iterator] || r["@@iterator"];
19
28
  if (null != t) {
@@ -41,6 +50,9 @@ function _iterableToArrayLimit(r, l) {
41
50
  function _nonIterableRest() {
42
51
  throw new TypeError("Invalid attempt to destructure non-iterable instance.\nIn order to be iterable, non-array objects must have a [Symbol.iterator]() method.");
43
52
  }
53
+ function _objectDestructuringEmpty(t) {
54
+ if (null == t) throw new TypeError("Cannot destructure " + t);
55
+ }
44
56
  function ownKeys(e, r) {
45
57
  var t = Object.keys(e);
46
58
  if (Object.getOwnPropertySymbols) {
@@ -114,4 +126,4 @@ function _unsupportedIterableToArray(r, a) {
114
126
  }
115
127
  }
116
128
 
117
- export { _arrayLikeToArray as arrayLikeToArray, _arrayWithHoles as arrayWithHoles, _defineProperty as defineProperty, _iterableToArrayLimit as iterableToArrayLimit, _nonIterableRest as nonIterableRest, _objectSpread2 as objectSpread2, _objectWithoutProperties as objectWithoutProperties, _objectWithoutPropertiesLoose as objectWithoutPropertiesLoose, _slicedToArray as slicedToArray, _taggedTemplateLiteral as taggedTemplateLiteral, _toPrimitive as toPrimitive, _toPropertyKey as toPropertyKey, _unsupportedIterableToArray as unsupportedIterableToArray };
129
+ export { _arrayLikeToArray as arrayLikeToArray, _arrayWithHoles as arrayWithHoles, _defineProperty as defineProperty, _extends as extends, _iterableToArrayLimit as iterableToArrayLimit, _nonIterableRest as nonIterableRest, _objectDestructuringEmpty as objectDestructuringEmpty, _objectSpread2 as objectSpread2, _objectWithoutProperties as objectWithoutProperties, _objectWithoutPropertiesLoose as objectWithoutPropertiesLoose, _slicedToArray as slicedToArray, _taggedTemplateLiteral as taggedTemplateLiteral, _toPrimitive as toPrimitive, _toPropertyKey as toPropertyKey, _unsupportedIterableToArray as unsupportedIterableToArray };
@@ -0,0 +1,20 @@
1
+ import { extends as _extends, objectDestructuringEmpty as _objectDestructuringEmpty, objectSpread2 as _objectSpread2 } from '../_virtual/_rollupPluginBabelHelpers.js';
2
+ import React, { forwardRef } from 'react';
3
+ import DragIndicatorIcon from '@tenancy.nz/icons/DragIndicator';
4
+ import StyledGalleryDragHandle from './GalleryDragHandle.styled.js';
5
+
6
+ var GalleryDragHandle = /*#__PURE__*/forwardRef(function GalleryDragHandle2(_ref, ref) {
7
+ var rest = _extends({}, (_objectDestructuringEmpty(_ref), _ref));
8
+ return /* @__PURE__ */React.createElement(StyledGalleryDragHandle, _objectSpread2(_objectSpread2({
9
+ size: "small",
10
+ sx: {
11
+ color: "#fff"
12
+ }
13
+ }, rest), {}, {
14
+ ref: ref
15
+ }), /* @__PURE__ */React.createElement(DragIndicatorIcon, {
16
+ size: 24
17
+ }));
18
+ });
19
+
20
+ export { GalleryDragHandle as default };
@@ -0,0 +1,8 @@
1
+ import { taggedTemplateLiteral as _taggedTemplateLiteral } from '../_virtual/_rollupPluginBabelHelpers.js';
2
+ import IconButton from '@mui/material/IconButton';
3
+ import { styled } from '@mui/material/styles';
4
+
5
+ var _templateObject;
6
+ var StyledGalleryDragHandle = styled(IconButton)(_templateObject || (_templateObject = _taggedTemplateLiteral(["\n cursor: grab;\n touch-action: manipulation;\n"])));
7
+
8
+ export { StyledGalleryDragHandle as default };
@@ -0,0 +1,12 @@
1
+ import React from 'react';
2
+ import { Media } from '@tenancy.nz/ui';
3
+ import StyledGalleryDragOverlay from './GalleryDragOverlay.styled.js';
4
+
5
+ function GalleryDragOverlay(_ref) {
6
+ var src = _ref.src;
7
+ return /* @__PURE__ */React.createElement(StyledGalleryDragOverlay, null, /* @__PURE__ */React.createElement(Media, {
8
+ src: src
9
+ }));
10
+ }
11
+
12
+ export { GalleryDragOverlay as default };
@@ -0,0 +1,9 @@
1
+ import { taggedTemplateLiteral as _taggedTemplateLiteral } from '../_virtual/_rollupPluginBabelHelpers.js';
2
+ import { keyframes } from '@emotion/react';
3
+ import { styled } from '@mui/material/styles';
4
+
5
+ var _templateObject, _templateObject2;
6
+ var pop = keyframes(_templateObject || (_templateObject = _taggedTemplateLiteral(["\n 0% {\n transform: scale(1);\n }\n 100% {\n transform: scale(1.05);\n box-shadow:\n 0 0 0 calc(1px / 1.05) rgba(63, 63, 68, 0.05),\n -1px 0 15px 0 rgba(34, 33, 81, 0.01),\n 0px 15px 15px 0 rgba(34, 33, 81, 0.25);\n }\n"])));
7
+ var StyledGalleryDragOverlay = styled("div")(_templateObject2 || (_templateObject2 = _taggedTemplateLiteral(["\n height: 162px;\n width: 162px;\n cursor: move;\n animation: ", " 200ms cubic-bezier(0.18, 0.67, 0.6, 1.22);\n box-shadow:\n 0 0 0 calc(1px / 1.05) rgba(63, 63, 68, 0.05),\n -1px 0 15px 0 rgba(34, 33, 81, 0.01),\n 0px 15px 15px 0 rgba(34, 33, 81, 0.25);\n opacity: 1;\n z-index: 999;\n transform: scale(1.05);\n transform-origin: 50% 50%;\n border-radius: 8px;\n overflow: hidden;\n"])), pop);
8
+
9
+ export { StyledGalleryDragOverlay as default };
@@ -1,15 +1,15 @@
1
1
  import { objectWithoutProperties as _objectWithoutProperties, objectSpread2 as _objectSpread2 } from '../_virtual/_rollupPluginBabelHelpers.js';
2
2
  import React, { forwardRef } from 'react';
3
3
  import ZoomInIcon from '@tenancy.nz/icons/ZoomInOutlined';
4
- import { Media, CircularProgress } from '@tenancy.nz/ui';
5
- import StyledGalleryImage, { StyledGalleryImageOverlay, galleryImageOverlayClassName, StyledGalleryImageText } from './GalleryImage.styled.js';
4
+ import { Media, CircularProgress, AbsBox } from '@tenancy.nz/ui';
5
+ import StyledGalleryImage, { StyledGalleryImageOverlay, galleryImageOverlayClassName } from './GalleryImage.styled.js';
6
6
 
7
- var _excluded = ["actions", "caption", "dragging", "onClick", "src", "uploading"];
7
+ var _excluded = ["actions", "tag", "dragging", "onClick", "src", "uploading"];
8
8
  var GalleryImage = /*#__PURE__*/forwardRef(function GalleryImage2(_ref, ref) {
9
9
  var _ref$actions = _ref.actions,
10
10
  actions = _ref$actions === void 0 ? void 0 : _ref$actions,
11
- _ref$caption = _ref.caption,
12
- caption = _ref$caption === void 0 ? void 0 : _ref$caption,
11
+ _ref$tag = _ref.tag,
12
+ tag = _ref$tag === void 0 ? void 0 : _ref$tag,
13
13
  _ref$dragging = _ref.dragging,
14
14
  dragging = _ref$dragging === void 0 ? void 0 : _ref$dragging,
15
15
  _ref$onClick = _ref.onClick,
@@ -33,7 +33,11 @@ var GalleryImage = /*#__PURE__*/forwardRef(function GalleryImage2(_ref, ref) {
33
33
  onClick: onClick
34
34
  }, actions, onClick && /* @__PURE__ */React.createElement(ZoomInIcon, {
35
35
  size: "inherit"
36
- })), !uploading && caption && /* @__PURE__ */React.createElement(StyledGalleryImageText, null, caption));
36
+ })), !uploading && tag && /* @__PURE__ */React.createElement(AbsBox, {
37
+ right: 12,
38
+ bottom: 8,
39
+ zIndex: 2
40
+ }, tag));
37
41
  });
38
42
 
39
43
  export { GalleryImage as default };
@@ -23,6 +23,6 @@ var StyledGalleryImageOverlay = styled("div", {
23
23
  var visible = _ref2.visible;
24
24
  return css(_templateObject5 || (_templateObject5 = _taggedTemplateLiteral(["\n position: absolute;\n left: 0;\n top: 0;\n width: 100%;\n height: 100%;\n display: flex;\n align-items: center;\n justify-content: center;\n z-index: 3;\n background: rgba(0, 0, 0, 0.5);\n color: #fff;\n font-size: 50px;\n transition: all 275ms ease-in-out;\n ", "\n "])), !visible && css(_templateObject6 || (_templateObject6 = _taggedTemplateLiteral(["\n opacity: 0;\n visibility: hidden;\n backface-visibility: hidden;\n cursor: pointer;\n background: rgba(0, 0, 0, 0.38);\n "]))));
25
25
  });
26
- var StyledGalleryImageText = styled("span")(_templateObject7 || (_templateObject7 = _taggedTemplateLiteral(["\n display: inline-flex;\n position: absolute;\n right: 8px;\n bottom: 8px;\n padding: 2px 8px;\n border-radius: 4px;\n background: rgba(0, 0, 0, 0.6);\n color: #fff;\n font-weight: 500;\n z-index: 2;\n font-size: 12px;\n"])));
26
+ var StyledGalleryImageAction = styled("div")(_templateObject7 || (_templateObject7 = _taggedTemplateLiteral(["\n position: absolute;\n left: 0;\n top: 0;\n right: 0;\n display: flex;\n align-items: center;\n z-index: 4;\n\n > * {\n margin: 4px 2px;\n }\n\n > *:last-child {\n margin-left: auto;\n }\n"])));
27
27
 
28
- export { StyledGalleryImageOverlay, StyledGalleryImageText, StyledGalleryImage as default, galleryImageOverlayClassName };
28
+ export { StyledGalleryImageAction, StyledGalleryImageOverlay, StyledGalleryImage as default, galleryImageOverlayClassName };
@@ -8,7 +8,7 @@ var StyledGalleryViewer = styled("div")(_templateObject || (_templateObject = _t
8
8
  var StyledGalleryViewerFigure = styled("figure")(_templateObject2 || (_templateObject2 = _taggedTemplateLiteral(["\n display: flex;\n flex-direction: column;\n align-items: center;\n max-width: 100%;\n max-height: 100%;\n margin: 0;\n"])));
9
9
  var StyledGalleryViewerImage = styled("img")(_templateObject3 || (_templateObject3 = _taggedTemplateLiteral(["\n max-width: 100%;\n max-height: calc(100vh - 160px);\n object-fit: contain;\n box-shadow: 0 4px 24px rgba(0, 0, 0, 0.5);\n"])));
10
10
  var StyledGalleryViewerCaption = styled("figcaption")(_templateObject4 || (_templateObject4 = _taggedTemplateLiteral(["\n display: flex;\n width: 100%;\n justify-content: center;\n align-items: center;\n gap: 10px;\n margin-top: 16px;\n color: #fff;\n font-size: 16px;\n font-weight: 660;\n\n > div {\n width: 36px;\n height: 36px;\n display: flex;\n justify-content: center;\n align-items: center;\n }\n"])));
11
- var viewerButtonStyles = css(_templateObject5 || (_templateObject5 = _taggedTemplateLiteral(["\n && {\n position: absolute;\n display: flex;\n align-items: center;\n justify-content: center;\n width: 48px;\n height: 48px;\n padding: 0;\n border: 1px solid ", ";\n border-radius: 4px;\n background: ", ";\n color: ", ";\n font-size: 24px;\n cursor: pointer;\n transition: background 175ms ease-in-out;\n\n &:hover {\n background: ", ";\n }\n }\n"])), token("palette.component.button.secondary.borderColor"), token("palette.component.button.secondary.backgroundDefault"), token("palette.semantic.icons.primaryColor"), token("palette.component.button.secondary.backgroundDefault"));
11
+ var viewerButtonStyles = css(_templateObject5 || (_templateObject5 = _taggedTemplateLiteral(["\n && {\n position: absolute;\n display: flex;\n align-items: center;\n justify-content: center;\n width: 48px;\n height: 48px;\n padding: 0;\n border: 1px solid ", ";\n border-radius: 4px;\n background: ", ";\n color: ", ";\n font-size: 24px;\n cursor: pointer;\n transition: background 175ms ease-in-out;\n }\n\n &&:hover {\n background: ", " !important;\n color: ", " !important;\n }\n"])), token("palette.component.button.secondary.borderColor"), token("palette.component.button.secondary.backgroundDefault"), token("palette.semantic.icons.primaryColor"), token("palette.component.button.secondary.backgroundDefault"), token("palette.semantic.icons.primaryColor"));
12
12
  var StyledGalleryViewerClose = styled("button")(_templateObject6 || (_templateObject6 = _taggedTemplateLiteral(["\n ", ";\n top: 16px;\n right: 16px;\n"])), viewerButtonStyles);
13
13
  var StyledGalleryViewerPrev = styled("button")(_templateObject7 || (_templateObject7 = _taggedTemplateLiteral(["\n ", ";\n left: 16px;\n top: 50%;\n transform: translateY(-50%);\n"])), viewerButtonStyles);
14
14
  var StyledGalleryViewerNext = styled("button")(_templateObject8 || (_templateObject8 = _taggedTemplateLiteral(["\n ", ";\n right: 16px;\n top: 50%;\n transform: translateY(-50%);\n"])), viewerButtonStyles);
@@ -0,0 +1,159 @@
1
+ import { objectWithoutProperties as _objectWithoutProperties, slicedToArray as _slicedToArray, objectSpread2 as _objectSpread2 } from '../_virtual/_rollupPluginBabelHelpers.js';
2
+ import React, { useState, useCallback } from 'react';
3
+ import Dropzone from 'react-dropzone';
4
+ import { useSensors, useSensor, MouseSensor, TouchSensor, DndContext, closestCenter, DragOverlay } from '@dnd-kit/core';
5
+ import { SortableContext, rectSortingStrategy, arrayMove } from '@dnd-kit/sortable';
6
+ import Stack from '@mui/material/Stack';
7
+ import UploadIcon from '@tenancy.nz/icons/Upload';
8
+ import { Box, Tag, Text, Confirmation } from '@tenancy.nz/ui';
9
+ import GalleryDragOverlay from './GalleryDragOverlay.js';
10
+ import SortableGalleryImage from './SortableGalleryImage.js';
11
+ import Gallery from './Gallery.js';
12
+ import StyledDropzone from './SortableGallery.styled.js';
13
+
14
+ var _excluded = ["dropzoneText", "dropzoneProps", "onDelete", "onUpload", "onSortComplete"];
15
+ function SortableGallery(_ref) {
16
+ var _ref$dropzoneText = _ref.dropzoneText,
17
+ dropzoneText = _ref$dropzoneText === void 0 ? "" : _ref$dropzoneText,
18
+ _ref$dropzoneProps = _ref.dropzoneProps,
19
+ dropzoneProps = _ref$dropzoneProps === void 0 ? {} : _ref$dropzoneProps,
20
+ _ref$onDelete = _ref.onDelete,
21
+ onDelete = _ref$onDelete === void 0 ? void 0 : _ref$onDelete,
22
+ _ref$onUpload = _ref.onUpload,
23
+ onUpload = _ref$onUpload === void 0 ? void 0 : _ref$onUpload,
24
+ _ref$onSortComplete = _ref.onSortComplete,
25
+ onSortComplete = _ref$onSortComplete === void 0 ? void 0 : _ref$onSortComplete,
26
+ listProps = _objectWithoutProperties(_ref, _excluded);
27
+ var _listProps$images = listProps.images,
28
+ images = _listProps$images === void 0 ? [] : _listProps$images,
29
+ loading = listProps.loading,
30
+ infoText = listProps.infoText;
31
+ var _useState = useState(null),
32
+ _useState2 = _slicedToArray(_useState, 2),
33
+ activeId = _useState2[0],
34
+ setActiveId = _useState2[1];
35
+ var _useState3 = useState(null),
36
+ _useState4 = _slicedToArray(_useState3, 2),
37
+ confirmDelete = _useState4[0],
38
+ setConfirmDelete = _useState4[1];
39
+ var sensors = useSensors(useSensor(MouseSensor), useSensor(TouchSensor));
40
+ var handleUpload = useCallback(function (acceptedFiles) {
41
+ var readFile = function readFile(file) {
42
+ return new Promise(function (resolve) {
43
+ var reader = new FileReader();
44
+ reader.onload = function () {
45
+ resolve({
46
+ path: reader.result,
47
+ thumb: reader.result,
48
+ name: file.name,
49
+ type: file.type
50
+ });
51
+ };
52
+ reader.readAsDataURL(file);
53
+ });
54
+ };
55
+ Promise.all(acceptedFiles.map(readFile)).then(function (files) {
56
+ onUpload === null || onUpload === void 0 || onUpload(files);
57
+ });
58
+ }, [onUpload]);
59
+ var handleDragStart = function handleDragStart(event) {
60
+ setActiveId(event.active.id);
61
+ };
62
+ var handleDragCancel = function handleDragCancel() {
63
+ setActiveId(null);
64
+ };
65
+ var handleDragEnd = function handleDragEnd(event) {
66
+ var active = event.active,
67
+ over = event.over;
68
+ if (over && active.id !== over.id) {
69
+ var oldIndex = images.findIndex(function (img) {
70
+ return img.thumb === active.id;
71
+ });
72
+ var newIndex = images.findIndex(function (img) {
73
+ return img.thumb === over.id;
74
+ });
75
+ var sortedImages = arrayMove(images, oldIndex, newIndex);
76
+ onSortComplete === null || onSortComplete === void 0 || onSortComplete(sortedImages, newIndex, oldIndex);
77
+ }
78
+ setActiveId(null);
79
+ };
80
+ var handleDelete = function handleDelete(event, index) {
81
+ event.stopPropagation();
82
+ event.preventDefault();
83
+ setConfirmDelete(index);
84
+ };
85
+ var handleDeleteConfirm = function handleDeleteConfirm() {
86
+ if (confirmDelete !== null) {
87
+ onDelete === null || onDelete === void 0 || onDelete(confirmDelete);
88
+ }
89
+ setConfirmDelete(null);
90
+ };
91
+ return /* @__PURE__ */React.createElement(Box, null, /* @__PURE__ */React.createElement(DndContext, {
92
+ sensors: sensors,
93
+ collisionDetection: closestCenter,
94
+ onDragCancel: handleDragCancel,
95
+ onDragStart: handleDragStart,
96
+ onDragEnd: handleDragEnd
97
+ }, /* @__PURE__ */React.createElement(SortableContext, {
98
+ items: images.map(function (image) {
99
+ return image.thumb;
100
+ }),
101
+ strategy: rectSortingStrategy
102
+ }, /* @__PURE__ */React.createElement(Gallery, {
103
+ loading: loading,
104
+ images: images,
105
+ infoText: infoText,
106
+ renderItem: function renderItem(image, i) {
107
+ return /* @__PURE__ */React.createElement(SortableGalleryImage, {
108
+ key: image.thumb,
109
+ src: image.thumb,
110
+ tag: i === 0 ? /* @__PURE__ */React.createElement(Tag, {
111
+ color: "white",
112
+ disableIcon: true,
113
+ label: "Cover image",
114
+ variant: "filled"
115
+ }) : void 0,
116
+ onDelete: function onDelete(e) {
117
+ return handleDelete(e, i);
118
+ },
119
+ uploading: !!image.uploading,
120
+ onClick: image.onClick
121
+ });
122
+ }
123
+ })), /* @__PURE__ */React.createElement(DragOverlay, {
124
+ adjustScale: false
125
+ }, activeId ? /* @__PURE__ */React.createElement(GalleryDragOverlay, {
126
+ src: String(activeId)
127
+ }) : null)), /* @__PURE__ */React.createElement(Dropzone, _objectSpread2(_objectSpread2({}, _objectSpread2({
128
+ disabled: loading
129
+ }, dropzoneProps)), {}, {
130
+ accept: {
131
+ "image/*": []
132
+ },
133
+ onDrop: handleUpload
134
+ }), function (_ref2) {
135
+ var getRootProps = _ref2.getRootProps,
136
+ getInputProps = _ref2.getInputProps;
137
+ return /* @__PURE__ */React.createElement(StyledDropzone, _objectSpread2({}, getRootProps()), /* @__PURE__ */React.createElement("input", _objectSpread2({}, getInputProps())), /* @__PURE__ */React.createElement(Stack, {
138
+ gap: 2,
139
+ alignItems: "center"
140
+ }, /* @__PURE__ */React.createElement(UploadIcon, {
141
+ size: 68
142
+ }), /* @__PURE__ */React.createElement(Text, {
143
+ variant: "body2",
144
+ weight: "400"
145
+ }, dropzoneText || /* @__PURE__ */React.createElement(React.Fragment, null, "Drag and drop image(s) here, or ", /* @__PURE__ */React.createElement("u", null, "choose image")))));
146
+ }), /* @__PURE__ */React.createElement(Confirmation, {
147
+ open: confirmDelete !== null,
148
+ severity: "destructive",
149
+ title: "Delete image?",
150
+ message: "Deleting this image will permanently remove it from the system. This action cannot be undone.",
151
+ onCancel: function onCancel() {
152
+ return setConfirmDelete(null);
153
+ },
154
+ onConfirm: handleDeleteConfirm,
155
+ confirmBtnText: "Delete"
156
+ }));
157
+ }
158
+
159
+ export { SortableGallery as default };
@@ -0,0 +1,12 @@
1
+ import { taggedTemplateLiteral as _taggedTemplateLiteral } from '../_virtual/_rollupPluginBabelHelpers.js';
2
+ import { css } from '@emotion/react';
3
+ import { styled } from '@mui/material/styles';
4
+ import { token } from '@tenancy.nz/ui';
5
+
6
+ var _templateObject, _templateObject2;
7
+ var StyledDropzone = styled("div")(_templateObject || (_templateObject = _taggedTemplateLiteral(["\n ", "\n"])), function (_ref) {
8
+ var theme = _ref.theme;
9
+ return css(_templateObject2 || (_templateObject2 = _taggedTemplateLiteral(["\n border: 2px dashed ", ";\n background: #fff;\n margin: 24px 0 0 0;\n padding: 32px 16px;\n border-radius: ", "px;\n color: ", ";\n max-height: 176px;\n "])), token("palette.semantic.border.accentColor"), theme.shape.borderRadius, token("palette.semantic.text.primaryColor"));
10
+ });
11
+
12
+ export { StyledDropzone as default };
@@ -0,0 +1,71 @@
1
+ import { objectWithoutProperties as _objectWithoutProperties, objectSpread2 as _objectSpread2 } from '../_virtual/_rollupPluginBabelHelpers.js';
2
+ import React from 'react';
3
+ import { useSortable } from '@dnd-kit/sortable';
4
+ import { CSS } from '@dnd-kit/utilities';
5
+ import DeleteOutlinedIcon from '@tenancy.nz/icons/DeleteOutlined';
6
+ import { AbsBox, IconButton } from '@tenancy.nz/ui';
7
+ import GalleryDragHandle from './GalleryDragHandle.js';
8
+ import GalleryImage from './GalleryImage.js';
9
+
10
+ var _excluded = ["tag", "onDelete", "src", "uploading"];
11
+ function SortableGalleryImage(_ref) {
12
+ var _ref$tag = _ref.tag,
13
+ tag = _ref$tag === void 0 ? void 0 : _ref$tag,
14
+ _ref$onDelete = _ref.onDelete,
15
+ onDelete = _ref$onDelete === void 0 ? void 0 : _ref$onDelete,
16
+ src = _ref.src,
17
+ _ref$uploading = _ref.uploading,
18
+ uploading = _ref$uploading === void 0 ? false : _ref$uploading,
19
+ rest = _objectWithoutProperties(_ref, _excluded);
20
+ var _useSortable = useSortable({
21
+ id: src
22
+ }),
23
+ attributes = _useSortable.attributes,
24
+ isDragging = _useSortable.isDragging,
25
+ listeners = _useSortable.listeners,
26
+ setNodeRef = _useSortable.setNodeRef,
27
+ setDraggableNodeRef = _useSortable.setDraggableNodeRef,
28
+ transform = _useSortable.transform,
29
+ transition = _useSortable.transition;
30
+ var styles = {
31
+ transform: CSS.Transform.toString(transform),
32
+ transition: transition
33
+ };
34
+ var actions = function actions() {
35
+ if (!uploading && !isDragging) {
36
+ return /* @__PURE__ */React.createElement(React.Fragment, null, /* @__PURE__ */React.createElement(AbsBox, {
37
+ display: "flex",
38
+ left: 8,
39
+ top: "50%",
40
+ sx: {
41
+ transform: "translateY(-50%)"
42
+ }
43
+ }, /* @__PURE__ */React.createElement(GalleryDragHandle, _objectSpread2(_objectSpread2(_objectSpread2({}, attributes), listeners), {}, {
44
+ ref: setDraggableNodeRef
45
+ }))), onDelete && /* @__PURE__ */React.createElement(AbsBox, {
46
+ display: "flex",
47
+ top: 8,
48
+ right: 8,
49
+ zIndex: 2
50
+ }, /* @__PURE__ */React.createElement(IconButton, {
51
+ onClick: onDelete,
52
+ color: "error",
53
+ variant: "contained"
54
+ }, /* @__PURE__ */React.createElement(DeleteOutlinedIcon, {
55
+ size: 20
56
+ }))));
57
+ }
58
+ return void 0;
59
+ };
60
+ return /* @__PURE__ */React.createElement(GalleryImage, _objectSpread2({
61
+ ref: setNodeRef,
62
+ style: styles,
63
+ dragging: isDragging,
64
+ actions: actions(),
65
+ tag: tag,
66
+ src: src,
67
+ uploading: uploading
68
+ }, rest));
69
+ }
70
+
71
+ export { SortableGalleryImage as default };
package/dist/esm/index.js CHANGED
@@ -1,4 +1,8 @@
1
1
  export { default as Gallery } from './components/Gallery.js';
2
+ export { default as GalleryDragHandle } from './components/GalleryDragHandle.js';
3
+ export { default as GalleryDragOverlay } from './components/GalleryDragOverlay.js';
2
4
  export { default as GalleryImage } from './components/GalleryImage.js';
3
5
  export { default as GalleryImageSkeleton } from './components/GalleryImageSkeleton.js';
4
6
  export { default as GalleryViewer } from './components/GalleryViewer.js';
7
+ export { default as SortableGallery } from './components/SortableGallery.js';
8
+ export { default as SortableGalleryImage } from './components/SortableGalleryImage.js';
package/package.json CHANGED
@@ -1,7 +1,7 @@
1
1
  {
2
2
  "name": "@tenancy.nz/gallery",
3
3
  "description": "React UI gallery components.",
4
- "version": "1.10.1",
4
+ "version": "1.10.3",
5
5
  "author": "TPS <https://www.tenancy.co.nz>",
6
6
  "type": "module",
7
7
  "main": "dist/cjs/index.cjs",
@@ -19,15 +19,21 @@
19
19
  "@mui/material": "^7.3.1",
20
20
  "react": "^16.0.0 || ^17.0.0 || ^18.0.0 || ^19.0.0",
21
21
  "react-dom": "^16.0.0 || ^17.0.0 || ^18.0.0 || ^19.0.0",
22
- "@tenancy.nz/icons": "1.10.1",
23
- "@tenancy.nz/ui": "1.10.1"
22
+ "@tenancy.nz/icons": "1.10.3",
23
+ "@tenancy.nz/ui": "1.10.3"
24
24
  },
25
25
  "devDependencies": {
26
26
  "@emotion/react": "^11.14.0",
27
27
  "@emotion/styled": "^11.14.1",
28
28
  "@mui/material": "^7.3.1",
29
- "@tenancy.nz/icons": "1.10.1",
30
- "@tenancy.nz/ui": "1.10.1"
29
+ "@tenancy.nz/ui": "1.10.3",
30
+ "@tenancy.nz/icons": "1.10.3"
31
+ },
32
+ "dependencies": {
33
+ "@dnd-kit/core": "^6.3.1",
34
+ "@dnd-kit/sortable": "^10.0.0",
35
+ "@dnd-kit/utilities": "^3.2.2",
36
+ "react-dropzone": "^14.3.8"
31
37
  },
32
38
  "scripts": {
33
39
  "build": "tsx ../../scripts/build.js"