gdx-ui 1.5.0 → 1.6.0

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
@@ -0,0 +1,296 @@
1
+ "use strict";
2
+
3
+ function _typeof(o) { "@babel/helpers - typeof"; return _typeof = "function" == typeof Symbol && "symbol" == typeof Symbol.iterator ? function (o) { return typeof o; } : function (o) { return o && "function" == typeof Symbol && o.constructor === Symbol && o !== Symbol.prototype ? "symbol" : typeof o; }, _typeof(o); }
4
+ Object.defineProperty(exports, "__esModule", {
5
+ value: true
6
+ });
7
+ exports.PictureZoom = void 0;
8
+ var _react = _interopRequireWildcard(require("react"));
9
+ var _propTypes = _interopRequireDefault(require("prop-types"));
10
+ var _util = require("../util");
11
+ var _button = require("../button");
12
+ var _freeSolidSvgIcons = require("@fortawesome/free-solid-svg-icons");
13
+ function _interopRequireDefault(obj) { return obj && obj.__esModule ? obj : { "default": obj }; }
14
+ function _getRequireWildcardCache(e) { if ("function" != typeof WeakMap) return null; var r = new WeakMap(), t = new WeakMap(); return (_getRequireWildcardCache = function _getRequireWildcardCache(e) { return e ? t : r; })(e); }
15
+ function _interopRequireWildcard(e, r) { if (!r && e && e.__esModule) return e; if (null === e || "object" != _typeof(e) && "function" != typeof e) return { "default": e }; var t = _getRequireWildcardCache(r); if (t && t.has(e)) return t.get(e); var n = { __proto__: null }, a = Object.defineProperty && Object.getOwnPropertyDescriptor; for (var u in e) if ("default" !== u && Object.prototype.hasOwnProperty.call(e, u)) { var i = a ? Object.getOwnPropertyDescriptor(e, u) : null; i && (i.get || i.set) ? Object.defineProperty(n, u, i) : n[u] = e[u]; } return n["default"] = e, t && t.set(e, n), n; }
16
+ function _slicedToArray(arr, i) { return _arrayWithHoles(arr) || _iterableToArrayLimit(arr, i) || _unsupportedIterableToArray(arr, i) || _nonIterableRest(); }
17
+ function _nonIterableRest() { throw new TypeError("Invalid attempt to destructure non-iterable instance.\nIn order to be iterable, non-array objects must have a [Symbol.iterator]() method."); }
18
+ function _unsupportedIterableToArray(o, minLen) { if (!o) return; if (typeof o === "string") return _arrayLikeToArray(o, minLen); var n = Object.prototype.toString.call(o).slice(8, -1); if (n === "Object" && o.constructor) n = o.constructor.name; if (n === "Map" || n === "Set") return Array.from(o); if (n === "Arguments" || /^(?:Ui|I)nt(?:8|16|32)(?:Clamped)?Array$/.test(n)) return _arrayLikeToArray(o, minLen); }
19
+ function _arrayLikeToArray(arr, len) { if (len == null || len > arr.length) len = arr.length; for (var i = 0, arr2 = new Array(len); i < len; i++) arr2[i] = arr[i]; return arr2; }
20
+ function _iterableToArrayLimit(r, l) { var t = null == r ? null : "undefined" != typeof Symbol && r[Symbol.iterator] || r["@@iterator"]; if (null != t) { var e, n, i, u, a = [], f = !0, o = !1; try { if (i = (t = t.call(r)).next, 0 === l) { if (Object(t) !== t) return; f = !1; } else for (; !(f = (e = i.call(t)).done) && (a.push(e.value), a.length !== l); f = !0); } catch (r) { o = !0, n = r; } finally { try { if (!f && null != t["return"] && (u = t["return"](), Object(u) !== u)) return; } finally { if (o) throw n; } } return a; } }
21
+ function _arrayWithHoles(arr) { if (Array.isArray(arr)) return arr; }
22
+ var PictureZoom = exports.PictureZoom = function PictureZoom(_ref) {
23
+ var src = _ref.src,
24
+ alt = _ref.alt,
25
+ _ref$width = _ref.width,
26
+ width = _ref$width === void 0 ? '100%' : _ref$width,
27
+ _ref$height = _ref.height,
28
+ height = _ref$height === void 0 ? 600 : _ref$height,
29
+ _ref$bordered = _ref.bordered,
30
+ bordered = _ref$bordered === void 0 ? false : _ref$bordered,
31
+ _ref$maxZoom = _ref.maxZoom,
32
+ maxZoom = _ref$maxZoom === void 0 ? 1.5 : _ref$maxZoom;
33
+ var _useState = (0, _react.useState)(),
34
+ _useState2 = _slicedToArray(_useState, 2),
35
+ imageData = _useState2[0],
36
+ setImageData = _useState2[1];
37
+ var _useState3 = (0, _react.useState)(1),
38
+ _useState4 = _slicedToArray(_useState3, 2),
39
+ zoom = _useState4[0],
40
+ setZoom = _useState4[1];
41
+ var _useState5 = (0, _react.useState)(1),
42
+ _useState6 = _slicedToArray(_useState5, 2),
43
+ minZoom = _useState6[0],
44
+ setMinZoom = _useState6[1];
45
+ var _useState7 = (0, _react.useState)(maxZoom),
46
+ _useState8 = _slicedToArray(_useState7, 2),
47
+ maxZoomState = _useState8[0],
48
+ setMaxZoomState = _useState8[1];
49
+ var _useState9 = (0, _react.useState)({
50
+ x: 0,
51
+ y: 0
52
+ }),
53
+ _useState10 = _slicedToArray(_useState9, 2),
54
+ offset = _useState10[0],
55
+ setOffset = _useState10[1];
56
+ var _useState11 = (0, _react.useState)(false),
57
+ _useState12 = _slicedToArray(_useState11, 2),
58
+ dragging = _useState12[0],
59
+ setDragging = _useState12[1];
60
+ var _useState13 = (0, _react.useState)({
61
+ x: 0,
62
+ y: 0
63
+ }),
64
+ _useState14 = _slicedToArray(_useState13, 2),
65
+ dragStart = _useState14[0],
66
+ setDragStart = _useState14[1];
67
+ var _useState15 = (0, _react.useState)({
68
+ x: 0,
69
+ y: 0
70
+ }),
71
+ _useState16 = _slicedToArray(_useState15, 2),
72
+ imgStart = _useState16[0],
73
+ setImgStart = _useState16[1];
74
+ var containerRef = (0, _react.useRef)(null);
75
+
76
+ // Cuando la imagen y el wrapper están listos, calcula el zoom mínimo y máximo
77
+ (0, _react.useEffect)(function () {
78
+ if (!src) return;
79
+ var image = new Image();
80
+ image.src = src;
81
+ image.onload = function () {
82
+ setImageData({
83
+ width: image.width,
84
+ height: image.height
85
+ });
86
+ };
87
+ }, [src]);
88
+ (0, _react.useEffect)(function () {
89
+ if (!imageData || !containerRef.current) return;
90
+ var wrapper = containerRef.current;
91
+ var dispW = wrapper.clientWidth;
92
+ var dispH = wrapper.clientHeight;
93
+ var zoomW = dispW / imageData.width;
94
+ var zoomH = dispH / imageData.height;
95
+ var fitZoom = Math.min(zoomW, zoomH);
96
+ setMinZoom(fitZoom);
97
+ setZoom(fitZoom);
98
+ setMaxZoomState(Math.max(fitZoom, maxZoom));
99
+ setOffset({
100
+ x: 0,
101
+ y: 0
102
+ });
103
+ // eslint-disable-next-line
104
+ }, [imageData, maxZoom, width, height]);
105
+
106
+ // Limita el offset para que la imagen no se salga del área visible
107
+ var clampOffset = function clampOffset(ox, oy, zoomVal) {
108
+ if (!imageData || !containerRef.current) return {
109
+ x: 0,
110
+ y: 0
111
+ };
112
+ var dispW = containerRef.current.clientWidth;
113
+ var dispH = containerRef.current.clientHeight;
114
+ var imgW = imageData.width * zoomVal;
115
+ var imgH = imageData.height * zoomVal;
116
+ var minX = Math.min(0, dispW - imgW);
117
+ var minY = Math.min(0, dispH - imgH);
118
+ return {
119
+ x: Math.max(minX, Math.min(ox, 0)),
120
+ y: Math.max(minY, Math.min(oy, 0))
121
+ };
122
+ };
123
+
124
+ // Drag handlers (mouse & touch)
125
+ var startDrag = function startDrag(clientX, clientY) {
126
+ setDragging(true);
127
+ setDragStart({
128
+ x: clientX,
129
+ y: clientY
130
+ });
131
+ setImgStart(offset);
132
+ };
133
+ var onMouseDown = function onMouseDown(e) {
134
+ if (zoom === minZoom) return;
135
+ e.preventDefault();
136
+ startDrag(e.clientX, e.clientY);
137
+ };
138
+ var onMouseMove = function onMouseMove(e) {
139
+ if (!dragging) return;
140
+ var dx = e.clientX - dragStart.x;
141
+ var dy = e.clientY - dragStart.y;
142
+ setOffset(clampOffset(imgStart.x + dx, imgStart.y + dy, zoom));
143
+ };
144
+ var onMouseUp = function onMouseUp() {
145
+ return setDragging(false);
146
+ };
147
+
148
+ // Touch events
149
+ var onTouchStart = function onTouchStart(e) {
150
+ if (zoom === minZoom) return;
151
+ if (e.touches.length === 1) {
152
+ var t = e.touches[0];
153
+ startDrag(t.clientX, t.clientY);
154
+ }
155
+ };
156
+ var onTouchMove = function onTouchMove(e) {
157
+ if (!dragging || e.touches.length !== 1) return;
158
+ var t = e.touches[0];
159
+ var dx = t.clientX - dragStart.x;
160
+ var dy = t.clientY - dragStart.y;
161
+ setOffset(clampOffset(imgStart.x + dx, imgStart.y + dy, zoom));
162
+ };
163
+ var onTouchEnd = function onTouchEnd() {
164
+ return setDragging(false);
165
+ };
166
+ var handleDoubleClick = function handleDoubleClick(e) {
167
+ if (!imageData || !containerRef.current) return;
168
+ var wrapper = containerRef.current;
169
+ var rect = wrapper.getBoundingClientRect();
170
+ var clickX = e.clientX - rect.left;
171
+ var clickY = e.clientY - rect.top;
172
+ if (zoom < maxZoomState) {
173
+ // Zoom al máximo desde el punto del click
174
+ var newZoom = maxZoomState;
175
+ var dispW = wrapper.clientWidth;
176
+ var dispH = wrapper.clientHeight;
177
+
178
+ // Calcula el punto relativo en la imagen original
179
+ var relX = (clickX - offset.x) / zoom;
180
+ var relY = (clickY - offset.y) / zoom;
181
+
182
+ // Calcula el nuevo offset para centrar ese punto
183
+ var offsetX = dispW / 2 - relX * newZoom;
184
+ var offsetY = dispH / 2 - relY * newZoom;
185
+
186
+ // Limita el offset para no salirte del área visible
187
+ var imgW = imageData.width * newZoom;
188
+ var imgH = imageData.height * newZoom;
189
+ var minX = Math.min(0, dispW - imgW);
190
+ var minY = Math.min(0, dispH - imgH);
191
+ offsetX = Math.max(minX, Math.min(offsetX, 0));
192
+ offsetY = Math.max(minY, Math.min(offsetY, 0));
193
+ setZoom(newZoom);
194
+ setOffset({
195
+ x: offsetX,
196
+ y: offsetY
197
+ });
198
+ } else {
199
+ // Regresa al zoom inicial y centra la imagen
200
+ var _dispW = wrapper.clientWidth;
201
+ var _dispH = wrapper.clientHeight;
202
+ var _imgW = imageData.width * minZoom;
203
+ var _imgH = imageData.height * minZoom;
204
+ var _offsetX = (_dispW - _imgW) / 2;
205
+ var _offsetY = (_dispH - _imgH) / 2;
206
+ setZoom(minZoom);
207
+ setOffset({
208
+ x: _offsetX,
209
+ y: _offsetY
210
+ });
211
+ }
212
+ };
213
+ (0, _react.useEffect)(function () {
214
+ if (!imageData || !containerRef.current) return;
215
+ var wrapper = containerRef.current;
216
+ var dispW = wrapper.clientWidth;
217
+ var dispH = wrapper.clientHeight;
218
+ var zoomW = dispW / imageData.width;
219
+ var zoomH = dispH / imageData.height;
220
+ var fitZoom = Math.min(zoomW, zoomH);
221
+ setMinZoom(fitZoom);
222
+ setZoom(fitZoom);
223
+ setMaxZoomState(Math.max(fitZoom, maxZoom));
224
+
225
+ // Centra la imagen al inicio
226
+ var imgW = imageData.width * fitZoom;
227
+ var imgH = imageData.height * fitZoom;
228
+ var offsetX = (dispW - imgW) / 2;
229
+ var offsetY = (dispH - imgH) / 2;
230
+ setOffset({
231
+ x: offsetX,
232
+ y: offsetY
233
+ });
234
+ // eslint-disable-next-line
235
+ }, [imageData, maxZoom, width, height]);
236
+ (0, _react.useEffect)(function () {
237
+ if (zoom === minZoom && imageData && containerRef.current) {
238
+ var dispW = containerRef.current.clientWidth;
239
+ var dispH = containerRef.current.clientHeight;
240
+ var imgW = imageData.width * minZoom;
241
+ var imgH = imageData.height * minZoom;
242
+ var offsetX = (dispW - imgW) / 2;
243
+ var offsetY = (dispH - imgH) / 2;
244
+ setOffset({
245
+ x: offsetX,
246
+ y: offsetY
247
+ });
248
+ }
249
+ }, [zoom, minZoom, imageData]);
250
+ return /*#__PURE__*/_react["default"].createElement("div", {
251
+ ref: containerRef,
252
+ style: {
253
+ width: width,
254
+ height: height,
255
+ overflow: 'hidden',
256
+ position: 'relative',
257
+ touchAction: 'none',
258
+ userSelect: dragging ? 'none' : undefined,
259
+ background: '#FFF'
260
+ },
261
+ onDoubleClick: handleDoubleClick,
262
+ onMouseMove: onMouseMove,
263
+ onMouseUp: onMouseUp,
264
+ onMouseLeave: onMouseUp,
265
+ onTouchMove: onTouchMove,
266
+ onTouchEnd: onTouchEnd,
267
+ className: "".concat(bordered ? 'bordered' : '', " margin-bottom")
268
+ }, imageData ? /*#__PURE__*/_react["default"].createElement("img", {
269
+ src: src,
270
+ alt: alt,
271
+ draggable: false,
272
+ style: {
273
+ width: imageData.width * zoom,
274
+ height: imageData.height * zoom,
275
+ position: 'absolute',
276
+ left: offset.x,
277
+ top: offset.y,
278
+ cursor: zoom > minZoom ? dragging ? 'grabbing' : 'grab' : 'default',
279
+ transition: dragging ? 'none' : 'left 0.1s, top 0.1s',
280
+ userSelect: 'none'
281
+ },
282
+ onMouseDown: zoom > minZoom ? onMouseDown : undefined,
283
+ onTouchStart: zoom > minZoom ? onTouchStart : undefined
284
+ }) : /*#__PURE__*/_react["default"].createElement(_util.Skeleton, {
285
+ width: "100%",
286
+ height: height
287
+ }));
288
+ };
289
+ PictureZoom.propTypes = {
290
+ src: _propTypes["default"].string.isRequired,
291
+ alt: _propTypes["default"].string,
292
+ width: _propTypes["default"].oneOfType([_propTypes["default"].string, _propTypes["default"].number]),
293
+ height: _propTypes["default"].oneOfType([_propTypes["default"].string, _propTypes["default"].number]),
294
+ bordered: _propTypes["default"].bool,
295
+ maxZoom: _propTypes["default"].number
296
+ };
@@ -0,0 +1,308 @@
1
+ "use strict";
2
+
3
+ function _typeof(o) { "@babel/helpers - typeof"; return _typeof = "function" == typeof Symbol && "symbol" == typeof Symbol.iterator ? function (o) { return typeof o; } : function (o) { return o && "function" == typeof Symbol && o.constructor === Symbol && o !== Symbol.prototype ? "symbol" : typeof o; }, _typeof(o); }
4
+ Object.defineProperty(exports, "__esModule", {
5
+ value: true
6
+ });
7
+ exports.PictureZoom = void 0;
8
+ var _react = _interopRequireWildcard(require("react"));
9
+ var _propTypes = _interopRequireDefault(require("prop-types"));
10
+ var _util = require("../util");
11
+ var _button = require("../button");
12
+ var _freeSolidSvgIcons = require("@fortawesome/free-solid-svg-icons");
13
+ function _interopRequireDefault(obj) { return obj && obj.__esModule ? obj : { "default": obj }; }
14
+ function _getRequireWildcardCache(e) { if ("function" != typeof WeakMap) return null; var r = new WeakMap(), t = new WeakMap(); return (_getRequireWildcardCache = function _getRequireWildcardCache(e) { return e ? t : r; })(e); }
15
+ function _interopRequireWildcard(e, r) { if (!r && e && e.__esModule) return e; if (null === e || "object" != _typeof(e) && "function" != typeof e) return { "default": e }; var t = _getRequireWildcardCache(r); if (t && t.has(e)) return t.get(e); var n = { __proto__: null }, a = Object.defineProperty && Object.getOwnPropertyDescriptor; for (var u in e) if ("default" !== u && Object.prototype.hasOwnProperty.call(e, u)) { var i = a ? Object.getOwnPropertyDescriptor(e, u) : null; i && (i.get || i.set) ? Object.defineProperty(n, u, i) : n[u] = e[u]; } return n["default"] = e, t && t.set(e, n), n; }
16
+ function _slicedToArray(arr, i) { return _arrayWithHoles(arr) || _iterableToArrayLimit(arr, i) || _unsupportedIterableToArray(arr, i) || _nonIterableRest(); }
17
+ function _nonIterableRest() { throw new TypeError("Invalid attempt to destructure non-iterable instance.\nIn order to be iterable, non-array objects must have a [Symbol.iterator]() method."); }
18
+ function _unsupportedIterableToArray(o, minLen) { if (!o) return; if (typeof o === "string") return _arrayLikeToArray(o, minLen); var n = Object.prototype.toString.call(o).slice(8, -1); if (n === "Object" && o.constructor) n = o.constructor.name; if (n === "Map" || n === "Set") return Array.from(o); if (n === "Arguments" || /^(?:Ui|I)nt(?:8|16|32)(?:Clamped)?Array$/.test(n)) return _arrayLikeToArray(o, minLen); }
19
+ function _arrayLikeToArray(arr, len) { if (len == null || len > arr.length) len = arr.length; for (var i = 0, arr2 = new Array(len); i < len; i++) arr2[i] = arr[i]; return arr2; }
20
+ function _iterableToArrayLimit(r, l) { var t = null == r ? null : "undefined" != typeof Symbol && r[Symbol.iterator] || r["@@iterator"]; if (null != t) { var e, n, i, u, a = [], f = !0, o = !1; try { if (i = (t = t.call(r)).next, 0 === l) { if (Object(t) !== t) return; f = !1; } else for (; !(f = (e = i.call(t)).done) && (a.push(e.value), a.length !== l); f = !0); } catch (r) { o = !0, n = r; } finally { try { if (!f && null != t["return"] && (u = t["return"](), Object(u) !== u)) return; } finally { if (o) throw n; } } return a; } }
21
+ function _arrayWithHoles(arr) { if (Array.isArray(arr)) return arr; }
22
+ var PictureZoom = exports.PictureZoom = function PictureZoom(_ref) {
23
+ var src = _ref.src,
24
+ alt = _ref.alt,
25
+ _ref$width = _ref.width,
26
+ width = _ref$width === void 0 ? '100%' : _ref$width,
27
+ _ref$height = _ref.height,
28
+ height = _ref$height === void 0 ? 600 : _ref$height,
29
+ _ref$bordered = _ref.bordered,
30
+ bordered = _ref$bordered === void 0 ? false : _ref$bordered,
31
+ _ref$maxZoom = _ref.maxZoom,
32
+ maxZoom = _ref$maxZoom === void 0 ? 1.5 : _ref$maxZoom;
33
+ var _useState = (0, _react.useState)(),
34
+ _useState2 = _slicedToArray(_useState, 2),
35
+ imageData = _useState2[0],
36
+ setImageData = _useState2[1];
37
+ var _useState3 = (0, _react.useState)(1),
38
+ _useState4 = _slicedToArray(_useState3, 2),
39
+ zoom = _useState4[0],
40
+ setZoom = _useState4[1];
41
+ var _useState5 = (0, _react.useState)(1),
42
+ _useState6 = _slicedToArray(_useState5, 2),
43
+ minZoom = _useState6[0],
44
+ setMinZoom = _useState6[1];
45
+ var _useState7 = (0, _react.useState)(maxZoom),
46
+ _useState8 = _slicedToArray(_useState7, 2),
47
+ maxZoomState = _useState8[0],
48
+ setMaxZoomState = _useState8[1];
49
+ var _useState9 = (0, _react.useState)({
50
+ x: 0,
51
+ y: 0
52
+ }),
53
+ _useState10 = _slicedToArray(_useState9, 2),
54
+ offset = _useState10[0],
55
+ setOffset = _useState10[1];
56
+ var _useState11 = (0, _react.useState)(false),
57
+ _useState12 = _slicedToArray(_useState11, 2),
58
+ dragging = _useState12[0],
59
+ setDragging = _useState12[1];
60
+ var _useState13 = (0, _react.useState)({
61
+ x: 0,
62
+ y: 0
63
+ }),
64
+ _useState14 = _slicedToArray(_useState13, 2),
65
+ dragStart = _useState14[0],
66
+ setDragStart = _useState14[1];
67
+ var _useState15 = (0, _react.useState)({
68
+ x: 0,
69
+ y: 0
70
+ }),
71
+ _useState16 = _slicedToArray(_useState15, 2),
72
+ imgStart = _useState16[0],
73
+ setImgStart = _useState16[1];
74
+ var containerRef = (0, _react.useRef)(null);
75
+
76
+ // Cuando la imagen y el wrapper están listos, calcula el zoom mínimo y máximo
77
+ (0, _react.useEffect)(function () {
78
+ if (!src) return;
79
+ var image = new Image();
80
+ image.src = src;
81
+ image.onload = function () {
82
+ setImageData({
83
+ width: image.width,
84
+ height: image.height
85
+ });
86
+ };
87
+ }, [src]);
88
+ (0, _react.useEffect)(function () {
89
+ if (!imageData || !containerRef.current) return;
90
+ var wrapper = containerRef.current;
91
+ var dispW = wrapper.clientWidth;
92
+ var dispH = wrapper.clientHeight;
93
+ var zoomW = dispW / imageData.width;
94
+ var zoomH = dispH / imageData.height;
95
+ var fitZoom = Math.min(zoomW, zoomH);
96
+ setMinZoom(fitZoom);
97
+ setZoom(fitZoom);
98
+ setMaxZoomState(Math.max(fitZoom, maxZoom));
99
+ setOffset({
100
+ x: 0,
101
+ y: 0
102
+ });
103
+ // eslint-disable-next-line
104
+ }, [imageData, maxZoom, width, height]);
105
+
106
+ // Limita el offset para que la imagen no se salga del área visible
107
+ var clampOffset = function clampOffset(ox, oy, zoomVal) {
108
+ if (!imageData || !containerRef.current) return {
109
+ x: 0,
110
+ y: 0
111
+ };
112
+ var dispW = containerRef.current.clientWidth;
113
+ var dispH = containerRef.current.clientHeight;
114
+ var imgW = imageData.width * zoomVal;
115
+ var imgH = imageData.height * zoomVal;
116
+ var minX = Math.min(0, dispW - imgW);
117
+ var minY = Math.min(0, dispH - imgH);
118
+ return {
119
+ x: Math.max(minX, Math.min(ox, 0)),
120
+ y: Math.max(minY, Math.min(oy, 0))
121
+ };
122
+ };
123
+
124
+ // Zoom handlers
125
+ var handleZoom = function handleZoom(delta) {
126
+ setZoom(function (prev) {
127
+ var next = Math.max(minZoom, Math.min(prev + delta, maxZoomState));
128
+ setOffset(function (current) {
129
+ return clampOffset(current.x, current.y, next);
130
+ });
131
+ return next;
132
+ });
133
+ };
134
+
135
+ // Wheel zoom (más suave)
136
+ // const handleWheel = (e) => {
137
+ // e.preventDefault();
138
+ // const delta = e.deltaY < 0 ? -0.05 : 0.05;
139
+ // handleZoom(delta);
140
+ // };
141
+
142
+ // Drag handlers (mouse & touch)
143
+ var startDrag = function startDrag(clientX, clientY) {
144
+ setDragging(true);
145
+ setDragStart({
146
+ x: clientX,
147
+ y: clientY
148
+ });
149
+ setImgStart(offset);
150
+ };
151
+ var onMouseDown = function onMouseDown(e) {
152
+ if (zoom === minZoom) return;
153
+ e.preventDefault();
154
+ startDrag(e.clientX, e.clientY);
155
+ };
156
+ var onMouseMove = function onMouseMove(e) {
157
+ if (!dragging) return;
158
+ var dx = e.clientX - dragStart.x;
159
+ var dy = e.clientY - dragStart.y;
160
+ setOffset(clampOffset(imgStart.x + dx, imgStart.y + dy, zoom));
161
+ };
162
+ var onMouseUp = function onMouseUp() {
163
+ return setDragging(false);
164
+ };
165
+
166
+ // Touch events
167
+ var onTouchStart = function onTouchStart(e) {
168
+ if (zoom === minZoom) return;
169
+ if (e.touches.length === 1) {
170
+ var t = e.touches[0];
171
+ startDrag(t.clientX, t.clientY);
172
+ }
173
+ };
174
+ var onTouchMove = function onTouchMove(e) {
175
+ if (!dragging || e.touches.length !== 1) return;
176
+ var t = e.touches[0];
177
+ var dx = t.clientX - dragStart.x;
178
+ var dy = t.clientY - dragStart.y;
179
+ setOffset(clampOffset(imgStart.x + dx, imgStart.y + dy, zoom));
180
+ };
181
+ var onTouchEnd = function onTouchEnd() {
182
+ return setDragging(false);
183
+ };
184
+
185
+ // Reset offset if zoom regresa al mínimo
186
+ // useEffect(() => {
187
+ // if (zoom === minZoom) setOffset({ x: 0, y: 0 });
188
+ // }, [zoom, minZoom]);
189
+
190
+ (0, _react.useEffect)(function () {
191
+ if (!imageData || !containerRef.current) return;
192
+ var wrapper = containerRef.current;
193
+ var dispW = wrapper.clientWidth;
194
+ var dispH = wrapper.clientHeight;
195
+ var zoomW = dispW / imageData.width;
196
+ var zoomH = dispH / imageData.height;
197
+ var fitZoom = Math.min(zoomW, zoomH);
198
+ setMinZoom(fitZoom);
199
+ setZoom(fitZoom);
200
+ setMaxZoomState(Math.max(fitZoom, maxZoom));
201
+
202
+ // Centra la imagen al inicio
203
+ var imgW = imageData.width * fitZoom;
204
+ var imgH = imageData.height * fitZoom;
205
+ var offsetX = (dispW - imgW) / 2;
206
+ var offsetY = (dispH - imgH) / 2;
207
+ setOffset({
208
+ x: offsetX,
209
+ y: offsetY
210
+ });
211
+ // eslint-disable-next-line
212
+ }, [imageData, maxZoom, width, height]);
213
+ (0, _react.useEffect)(function () {
214
+ if (zoom === minZoom && imageData && containerRef.current) {
215
+ var dispW = containerRef.current.clientWidth;
216
+ var dispH = containerRef.current.clientHeight;
217
+ var imgW = imageData.width * minZoom;
218
+ var imgH = imageData.height * minZoom;
219
+ var offsetX = (dispW - imgW) / 2;
220
+ var offsetY = (dispH - imgH) / 2;
221
+ setOffset({
222
+ x: offsetX,
223
+ y: offsetY
224
+ });
225
+ }
226
+ }, [zoom, minZoom, imageData]);
227
+ return /*#__PURE__*/_react["default"].createElement("div", {
228
+ ref: containerRef,
229
+ style: {
230
+ width: width,
231
+ height: height,
232
+ overflow: 'hidden',
233
+ position: 'relative',
234
+ touchAction: 'none',
235
+ userSelect: dragging ? 'none' : undefined,
236
+ background: '#FFF'
237
+ }
238
+ // onWheel={handleWheel}
239
+ ,
240
+ onMouseMove: onMouseMove,
241
+ onMouseUp: onMouseUp,
242
+ onMouseLeave: onMouseUp,
243
+ onTouchMove: onTouchMove,
244
+ onTouchEnd: onTouchEnd,
245
+ className: "".concat(bordered ? 'bordered' : '', " margin-bottom")
246
+ }, imageData ? /*#__PURE__*/_react["default"].createElement("img", {
247
+ src: src,
248
+ alt: alt,
249
+ draggable: false,
250
+ style: {
251
+ width: imageData.width * zoom,
252
+ height: imageData.height * zoom,
253
+ position: 'absolute',
254
+ left: offset.x,
255
+ top: offset.y,
256
+ cursor: zoom > minZoom ? dragging ? 'grabbing' : 'grab' : 'default',
257
+ transition: dragging ? 'none' : 'left 0.1s, top 0.1s',
258
+ userSelect: 'none'
259
+ },
260
+ onMouseDown: zoom > minZoom ? onMouseDown : undefined,
261
+ onTouchStart: zoom > minZoom ? onTouchStart : undefined
262
+ }) : /*#__PURE__*/_react["default"].createElement(_util.Skeleton, {
263
+ width: "100%",
264
+ height: height
265
+ }), /*#__PURE__*/_react["default"].createElement("div", {
266
+ style: {
267
+ position: 'absolute',
268
+ right: 8,
269
+ bottom: 8,
270
+ display: 'flex',
271
+ flexDirection: 'column',
272
+ gap: 15,
273
+ zIndex: 10
274
+ }
275
+ }, /*#__PURE__*/_react["default"].createElement(_button.IconButton, {
276
+ icon: _freeSolidSvgIcons.faPlus,
277
+ type: "button",
278
+ bg: "solid",
279
+ style: {
280
+ cursor: zoom < maxZoomState ? 'pointer' : 'not-allowed'
281
+ },
282
+ onClick: function onClick() {
283
+ return handleZoom(0.5);
284
+ },
285
+ disabled: zoom >= maxZoomState,
286
+ "aria-label": "Zoom in"
287
+ }), /*#__PURE__*/_react["default"].createElement(_button.IconButton, {
288
+ bg: "solid",
289
+ icon: _freeSolidSvgIcons.faMinus,
290
+ type: "button",
291
+ onClick: function onClick() {
292
+ return handleZoom(-0.5);
293
+ },
294
+ disabled: zoom <= minZoom,
295
+ "aria-label": "Zoom out",
296
+ style: {
297
+ cursor: zoom > minZoom ? 'pointer' : 'not-allowed'
298
+ }
299
+ })));
300
+ };
301
+ PictureZoom.propTypes = {
302
+ src: _propTypes["default"].string.isRequired,
303
+ alt: _propTypes["default"].string,
304
+ width: _propTypes["default"].oneOfType([_propTypes["default"].string, _propTypes["default"].number]),
305
+ height: _propTypes["default"].oneOfType([_propTypes["default"].string, _propTypes["default"].number]),
306
+ bordered: _propTypes["default"].bool,
307
+ maxZoom: _propTypes["default"].number
308
+ };
@@ -4,7 +4,7 @@ function _typeof(o) { "@babel/helpers - typeof"; return _typeof = "function" ==
4
4
  Object.defineProperty(exports, "__esModule", {
5
5
  value: true
6
6
  });
7
- exports.Image = void 0;
7
+ exports.Picture = void 0;
8
8
  var _react = _interopRequireWildcard(require("react"));
9
9
  var _propTypes = _interopRequireDefault(require("prop-types"));
10
10
  var _util = require("../util");
@@ -17,7 +17,7 @@ function _unsupportedIterableToArray(o, minLen) { if (!o) return; if (typeof o =
17
17
  function _arrayLikeToArray(arr, len) { if (len == null || len > arr.length) len = arr.length; for (var i = 0, arr2 = new Array(len); i < len; i++) arr2[i] = arr[i]; return arr2; }
18
18
  function _iterableToArrayLimit(r, l) { var t = null == r ? null : "undefined" != typeof Symbol && r[Symbol.iterator] || r["@@iterator"]; if (null != t) { var e, n, i, u, a = [], f = !0, o = !1; try { if (i = (t = t.call(r)).next, 0 === l) { if (Object(t) !== t) return; f = !1; } else for (; !(f = (e = i.call(t)).done) && (a.push(e.value), a.length !== l); f = !0); } catch (r) { o = !0, n = r; } finally { try { if (!f && null != t["return"] && (u = t["return"](), Object(u) !== u)) return; } finally { if (o) throw n; } } return a; } }
19
19
  function _arrayWithHoles(arr) { if (Array.isArray(arr)) return arr; }
20
- var Image = exports.Image = function Image(_ref) {
20
+ var Picture = exports.Picture = function Picture(_ref) {
21
21
  var src = _ref.src,
22
22
  alt = _ref.alt,
23
23
  width = _ref.width,
@@ -51,7 +51,7 @@ var Image = exports.Image = function Image(_ref) {
51
51
  height: height
52
52
  });
53
53
  };
54
- Image.propTypes = {
54
+ Picture.propTypes = {
55
55
  src: _propTypes["default"].string.isRequired,
56
56
  alt: _propTypes["default"].string,
57
57
  width: _propTypes["default"].oneOfType([_propTypes["default"].string, _propTypes["default"].number]),
@@ -11,6 +11,7 @@ var _util = require("../util");
11
11
  function _interopRequireDefault(obj) { return obj && obj.__esModule ? obj : { "default": obj }; }
12
12
  function _getRequireWildcardCache(e) { if ("function" != typeof WeakMap) return null; var r = new WeakMap(), t = new WeakMap(); return (_getRequireWildcardCache = function _getRequireWildcardCache(e) { return e ? t : r; })(e); }
13
13
  function _interopRequireWildcard(e, r) { if (!r && e && e.__esModule) return e; if (null === e || "object" != _typeof(e) && "function" != typeof e) return { "default": e }; var t = _getRequireWildcardCache(r); if (t && t.has(e)) return t.get(e); var n = { __proto__: null }, a = Object.defineProperty && Object.getOwnPropertyDescriptor; for (var u in e) if ("default" !== u && Object.prototype.hasOwnProperty.call(e, u)) { var i = a ? Object.getOwnPropertyDescriptor(e, u) : null; i && (i.get || i.set) ? Object.defineProperty(n, u, i) : n[u] = e[u]; } return n["default"] = e, t && t.set(e, n), n; }
14
+ function _extends() { _extends = Object.assign ? Object.assign.bind() : function (target) { for (var i = 1; i < arguments.length; i++) { var source = arguments[i]; for (var key in source) { if (Object.prototype.hasOwnProperty.call(source, key)) { target[key] = source[key]; } } } return target; }; return _extends.apply(this, arguments); }
14
15
  function _slicedToArray(arr, i) { return _arrayWithHoles(arr) || _iterableToArrayLimit(arr, i) || _unsupportedIterableToArray(arr, i) || _nonIterableRest(); }
15
16
  function _nonIterableRest() { throw new TypeError("Invalid attempt to destructure non-iterable instance.\nIn order to be iterable, non-array objects must have a [Symbol.iterator]() method."); }
16
17
  function _unsupportedIterableToArray(o, minLen) { if (!o) return; if (typeof o === "string") return _arrayLikeToArray(o, minLen); var n = Object.prototype.toString.call(o).slice(8, -1); if (n === "Object" && o.constructor) n = o.constructor.name; if (n === "Map" || n === "Set") return Array.from(o); if (n === "Arguments" || /^(?:Ui|I)nt(?:8|16|32)(?:Clamped)?Array$/.test(n)) return _arrayLikeToArray(o, minLen); }
@@ -23,7 +24,8 @@ var Thumb = exports.Thumb = function Thumb(_ref) {
23
24
  _ref$bordered = _ref.bordered,
24
25
  bordered = _ref$bordered === void 0 ? false : _ref$bordered,
25
26
  _ref$size = _ref.size,
26
- size = _ref$size === void 0 ? 'medium' : _ref$size;
27
+ size = _ref$size === void 0 ? 'medium' : _ref$size,
28
+ onClick = _ref.onClick;
27
29
  var _useState = (0, _react.useState)(),
28
30
  _useState2 = _slicedToArray(_useState, 2),
29
31
  imageData = _useState2[0],
@@ -40,9 +42,18 @@ var Thumb = exports.Thumb = function Thumb(_ref) {
40
42
  });
41
43
  };
42
44
  }, [src]);
43
- return /*#__PURE__*/_react["default"].createElement("div", {
44
- className: "thumb thumb-".concat(size, " ").concat(bordered ? 'thumb-bordered' : '')
45
- }, imageData ? /*#__PURE__*/_react["default"].createElement("img", {
45
+ var isClickable = typeof onClick === 'function';
46
+ return /*#__PURE__*/_react["default"].createElement("div", _extends({
47
+ className: "thumb thumb-".concat(size, " ").concat(bordered ? 'thumb-bordered' : '', " ").concat(isClickable ? 'clickable bordered-hover' : ''),
48
+ onClick: true
49
+ }, isClickable && {
50
+ onClick: onClick,
51
+ role: 'button',
52
+ tabIndex: 0,
53
+ onKeyDown: function onKeyDown(e) {
54
+ if (e.key === 'Enter' || e.key === ' ') onClick(e);
55
+ }
56
+ }), imageData ? /*#__PURE__*/_react["default"].createElement("img", {
46
57
  src: src,
47
58
  alt: alt,
48
59
  className: "center-by-".concat(imageData.width > imageData.height ? 'width' : 'height')
@@ -54,5 +65,6 @@ Thumb.propTypes = {
54
65
  src: _propTypes["default"].string.isRequired,
55
66
  alt: _propTypes["default"].string,
56
67
  bordered: _propTypes["default"].bool,
57
- size: _propTypes["default"].oneOf(['smallest', 'small', 'medium', 'large', 'largest'])
68
+ size: _propTypes["default"].oneOf(['smallest', 'small', 'medium', 'large', 'largest']),
69
+ onClick: _propTypes["default"].func
58
70
  };