@mgonza02/goal-image-gallery 1.2.3 → 1.2.5

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
@@ -5,6 +5,16 @@ All notable changes to the GoalImageGallery project will be documented in this f
5
5
  The format is based on [Keep a Changelog](https://keepachangelog.com/en/1.0.0/),
6
6
  and this project adheres to [Semantic Versioning](https://semver.org/spec/v2.0.0.html).
7
7
 
8
+ ## [1.2.5] - 2026-10-13
9
+
10
+ ### 🐛 Bug Fixes
11
+ - **ReferenceError fix**: Properly imported `validateImageFile`, `validateImageFileSync`, and `countGalleryImages` in `index.js` before re-exporting in the `utils` object.
12
+
13
+ ## [1.2.4] - 2026-10-12
14
+
15
+ ### Added
16
+ - **Floating Add Button**: Replaced the static '+' grid item with a floating action button (Fab) over the image gallery when `canAdd` is active.
17
+
8
18
  ## [1.2.3] - 2026-10-12
9
19
 
10
20
  ### Added
@@ -283,6 +283,7 @@ const GoalImageGallery = _ref => {
283
283
  loading,
284
284
  removable,
285
285
  canSetDefault,
286
+ canAdd,
286
287
  setZoomLevel,
287
288
  handleOpenImage,
288
289
  handleCloseImage,
@@ -415,6 +416,7 @@ const GoalImageGallery = _ref => {
415
416
  onSetAsDefault: handleSetAsDefault,
416
417
  onDownloadImage: handleDownloadImage,
417
418
  canSetDefault: canSetDefault,
419
+ canAdd: canAdd,
418
420
  defaultImageCode: defaultImageCode
419
421
  }), /*#__PURE__*/_jsx(ImageGalleryModal, {
420
422
  open: openImage !== null,
@@ -1,5 +1,6 @@
1
1
  import PropTypes from 'prop-types';
2
- import { Grid, Card, CardContent } from '@mui/material';
2
+ import { Grid, Card, CardContent, Fab, Tooltip } from '@mui/material';
3
+ import { Add as AddIcon } from '@mui/icons-material';
3
4
  import { useTheme } from '@mui/material/styles';
4
5
  import ImageGalleryItem from './ImageGalleryItem';
5
6
  import ImageGalleryEmptyState from './ImageGalleryEmptyState';
@@ -8,7 +9,7 @@ import { StyledImageGridContainer } from '../styles/styled-components';
8
9
  /**
9
10
  * Image grid component for displaying gallery images
10
11
  */
11
- import { jsx as _jsx } from "react/jsx-runtime";
12
+ import { jsx as _jsx, jsxs as _jsxs } from "react/jsx-runtime";
12
13
  const ImageGalleryGrid = _ref => {
13
14
  let {
14
15
  imageList,
@@ -28,6 +29,7 @@ const ImageGalleryGrid = _ref => {
28
29
  onSetAsDefault,
29
30
  onDownloadImage,
30
31
  canSetDefault = false,
32
+ canAdd = false,
31
33
  defaultImageCode
32
34
  } = _ref;
33
35
  const theme = useTheme();
@@ -44,9 +46,12 @@ const ImageGalleryGrid = _ref => {
44
46
  })
45
47
  });
46
48
  }
47
- return /*#__PURE__*/_jsx(Card, {
49
+ return /*#__PURE__*/_jsxs(Card, {
48
50
  elevation: 2,
49
- children: /*#__PURE__*/_jsx(CardContent, {
51
+ sx: {
52
+ position: 'relative'
53
+ },
54
+ children: [/*#__PURE__*/_jsx(CardContent, {
50
55
  children: /*#__PURE__*/_jsx(StyledImageGridContainer, {
51
56
  children: /*#__PURE__*/_jsx(Grid, {
52
57
  container: true,
@@ -81,7 +86,22 @@ const ImageGalleryGrid = _ref => {
81
86
  }, image.id))
82
87
  })
83
88
  })
84
- })
89
+ }), canAdd && /*#__PURE__*/_jsx(Tooltip, {
90
+ title: "Agregar imagen",
91
+ children: /*#__PURE__*/_jsx(Fab, {
92
+ color: "primary",
93
+ size: "small",
94
+ "aria-label": "Agregar imagen",
95
+ onClick: () => onImageSelect(null),
96
+ sx: {
97
+ position: 'absolute',
98
+ bottom: 16,
99
+ right: 16,
100
+ zIndex: 3
101
+ },
102
+ children: /*#__PURE__*/_jsx(AddIcon, {})
103
+ })
104
+ })]
85
105
  });
86
106
  };
87
107
  ImageGalleryGrid.propTypes = {
@@ -102,6 +122,7 @@ ImageGalleryGrid.propTypes = {
102
122
  onSetAsDefault: PropTypes.func,
103
123
  onDownloadImage: PropTypes.func.isRequired,
104
124
  canSetDefault: PropTypes.bool,
125
+ canAdd: PropTypes.bool,
105
126
  defaultImageCode: PropTypes.string
106
127
  };
107
128
  export default ImageGalleryGrid;
@@ -32,6 +32,7 @@ export const useImageGallery = _ref => {
32
32
  const [loading, setLoading] = useState(false);
33
33
  const [removable, setRemovable] = useState(false);
34
34
  const [canSetDefault, setCanSetDefault] = useState(false);
35
+ const [canAdd, setCanAdd] = useState(false);
35
36
 
36
37
  // Process image codes into image list
37
38
  useEffect(() => {
@@ -53,12 +54,7 @@ export const useImageGallery = _ref => {
53
54
  const canRemoveMore = imageCount > minItems;
54
55
  setRemovable(!!(updatable && allowDelete && imageCount > 0 && canRemoveMore));
55
56
  const atMaxItems = maxItems != null && imageCount >= maxItems;
56
- if (updatable && multiple && !atMaxItems) {
57
- newList.push({
58
- image_code: '+',
59
- id: newList.length
60
- });
61
- }
57
+ setCanAdd(!!(updatable && multiple && !atMaxItems));
62
58
  setCanSetDefault(!!(multiple && imageCount >= 2 && onSetAsDefault));
63
59
  setImageList(newList);
64
60
  }, [imageCodes, canEdit, multiple, updatable, maxItems, allowDelete, minItems, onSetAsDefault]);
@@ -228,6 +224,7 @@ export const useImageGallery = _ref => {
228
224
  loading,
229
225
  removable,
230
226
  canSetDefault,
227
+ canAdd,
231
228
  setZoomLevel,
232
229
  handleOpenImage,
233
230
  handleCloseImage,
package/lib/index.d.ts CHANGED
@@ -93,6 +93,7 @@ export interface UseImageGalleryReturn {
93
93
  loading: boolean;
94
94
  removable: boolean;
95
95
  canSetDefault: boolean;
96
+ canAdd: boolean;
96
97
  setZoomLevel: (level: number) => void;
97
98
  handleOpenImage: (imageUrl: string, index?: number) => void;
98
99
  handleCloseImage: () => void;
@@ -137,6 +138,7 @@ export interface ImageGalleryGridProps {
137
138
  onSetAsDefault?: (image: ImageItem) => void;
138
139
  onDownloadImage: (imageCode: string) => void;
139
140
  canSetDefault?: boolean;
141
+ canAdd?: boolean;
140
142
  defaultImageCode?: string;
141
143
  }
142
144
 
package/lib/index.js CHANGED
@@ -18,6 +18,7 @@ export { useImageGallery, useImageZoom, useClipboard, useKeyboardNavigation } fr
18
18
 
19
19
  // Style exports
20
20
  export { StyledImageContainer, ImageOverlay, StyledModalContainer, StyledModalHeader, StyledModalBody, StyledModalFooter, StyledEmptyStateContainer, StyledImageGridContainer } from './styles/styled-components';
21
+ import { countGalleryImages, validateImageFile, validateImageFileSync } from './utils/image-utils';
21
22
 
22
23
  // Utility exports
23
24
  export { handleImageError, downloadImage, processImageCodes, getGridColumns, isValidImageFile, formatFileSize, generateId, debounce, isTouchDevice, getImageDimensions, createImagePreview, countGalleryImages, validateImageFile, validateImageFileSync } from './utils/image-utils';
@@ -120,8 +121,16 @@ export const CONFIG = {
120
121
  };
121
122
 
122
123
  // Export version info
123
- export const VERSION = '1.2.3';
124
+ export const VERSION = '1.2.5';
124
125
  export const CHANGELOG = [{
126
+ version: '1.2.5',
127
+ date: '2026-10-13',
128
+ changes: ['Fixed ReferenceError by properly importing validateImageFile, validateImageFileSync, and countGalleryImages in index entry point']
129
+ }, {
130
+ version: '1.2.4',
131
+ date: '2026-10-12',
132
+ changes: ['Replaced grid add placeholder tile with a floating action button over the image gallery when canAdd is true']
133
+ }, {
125
134
  version: '1.2.3',
126
135
  date: '2026-10-12',
127
136
  changes: ['Added defaultImageCode, onSetAsDefault, onDelete, onUpdate, and onAdd lifecycle callbacks', 'Set-as-default control shown only when multiple is true and there are at least two images']
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "@mgonza02/goal-image-gallery",
3
- "version": "1.2.3",
3
+ "version": "1.2.5",
4
4
  "description": "Advanced, accessible, and highly customizable React image gallery component with multi-method upload, responsive design, and extensive TypeScript support",
5
5
  "main": "lib/index.js",
6
6
  "module": "lib/index.js",