@openedx/paragon 23.16.1 → 23.17.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.
@@ -19,7 +19,8 @@ const CardImageCap = /*#__PURE__*/React.forwardRef(({
19
19
  logoSkeletonHeight,
20
20
  logoSkeletonWidth,
21
21
  className,
22
- imageLoadingType
22
+ imageLoadingType,
23
+ skeletonDuringImageLoad
23
24
  }, ref) => {
24
25
  const {
25
26
  orientation,
@@ -28,19 +29,21 @@ const CardImageCap = /*#__PURE__*/React.forwardRef(({
28
29
  const [showImageCap, setShowImageCap] = useState(false);
29
30
  const [showLogoCap, setShowLogoCap] = useState(false);
30
31
  const wrapperClassName = `pgn__card-wrapper-image-cap ${orientation}`;
32
+ const loadingSkeleton = () => /*#__PURE__*/React.createElement(Skeleton, {
33
+ containerClassName: "pgn__card-image-cap-loader",
34
+ height: orientation === 'horizontal' ? '100%' : skeletonHeight,
35
+ width: skeletonWidth
36
+ });
37
+ const loadingLogoSkeleton = () => /*#__PURE__*/React.createElement(Skeleton, {
38
+ containerClassName: "pgn__card-logo-cap",
39
+ height: logoSkeletonHeight,
40
+ width: logoSkeletonWidth
41
+ });
31
42
  if (isLoading) {
32
43
  return /*#__PURE__*/React.createElement("div", {
33
44
  className: classNames(wrapperClassName, className),
34
45
  "data-testid": "image-loader-wrapper"
35
- }, /*#__PURE__*/React.createElement(Skeleton, {
36
- containerClassName: "pgn__card-image-cap-loader",
37
- height: orientation === 'horizontal' ? '100%' : skeletonHeight,
38
- width: skeletonWidth
39
- }), logoSkeleton && /*#__PURE__*/React.createElement(Skeleton, {
40
- containerClassName: "pgn__card-logo-cap",
41
- height: logoSkeletonHeight,
42
- width: logoSkeletonWidth
43
- }));
46
+ }, loadingSkeleton(), logoSkeleton && loadingLogoSkeleton());
44
47
  }
45
48
  const handleSrcFallback = (event, altSrc, imageKey) => {
46
49
  const {
@@ -59,7 +62,7 @@ const CardImageCap = /*#__PURE__*/React.forwardRef(({
59
62
  return /*#__PURE__*/React.createElement("div", {
60
63
  className: classNames(className, wrapperClassName),
61
64
  ref: ref
62
- }, !!src && /*#__PURE__*/React.createElement("img", {
65
+ }, !!src && /*#__PURE__*/React.createElement(React.Fragment, null, skeletonDuringImageLoad && !showImageCap && loadingSkeleton(), /*#__PURE__*/React.createElement("img", {
63
66
  className: classNames('pgn__card-image-cap', {
64
67
  show: showImageCap
65
68
  }),
@@ -68,7 +71,7 @@ const CardImageCap = /*#__PURE__*/React.forwardRef(({
68
71
  onLoad: () => setShowImageCap(true),
69
72
  alt: srcAlt,
70
73
  loading: imageLoadingType
71
- }), !!logoSrc && /*#__PURE__*/React.createElement("img", {
74
+ })), !!logoSrc && /*#__PURE__*/React.createElement(React.Fragment, null, skeletonDuringImageLoad && !showLogoCap && loadingLogoSkeleton(), /*#__PURE__*/React.createElement("img", {
72
75
  className: classNames('pgn__card-logo-cap', {
73
76
  show: showLogoCap
74
77
  }),
@@ -77,7 +80,7 @@ const CardImageCap = /*#__PURE__*/React.forwardRef(({
77
80
  onLoad: () => setShowLogoCap(true),
78
81
  alt: logoAlt,
79
82
  loading: imageLoadingType
80
- }));
83
+ })));
81
84
  });
82
85
  CardImageCap.propTypes = {
83
86
  /** Specifies class name to append to the base element. */
@@ -105,7 +108,10 @@ CardImageCap.propTypes = {
105
108
  /** Specifies width of Logo skeleton in loading state. */
106
109
  logoSkeletonWidth: PropTypes.number,
107
110
  /** Specifies loading type for images */
108
- imageLoadingType: PropTypes.oneOf(['eager', 'lazy'])
111
+ imageLoadingType: PropTypes.oneOf(['eager', 'lazy']),
112
+ /** Render the loading skeleton when the image is loading in
113
+ * addition to when the whole card is in `isLoading` state */
114
+ skeletonDuringImageLoad: PropTypes.bool
109
115
  };
110
116
  CardImageCap.defaultProps = {
111
117
  src: undefined,
@@ -120,7 +126,8 @@ CardImageCap.defaultProps = {
120
126
  logoSkeletonHeight: LOGO_SKELETON_HEIGHT_VALUE,
121
127
  skeletonWidth: undefined,
122
128
  logoSkeletonWidth: undefined,
123
- imageLoadingType: 'eager'
129
+ imageLoadingType: 'eager',
130
+ skeletonDuringImageLoad: false
124
131
  };
125
132
  export default CardImageCap;
126
133
  //# sourceMappingURL=CardImageCap.js.map
@@ -1 +1 @@
1
- {"version":3,"file":"CardImageCap.js","names":["React","useContext","useState","PropTypes","classNames","Skeleton","CardContext","cardSrcFallbackImg","SKELETON_HEIGHT_VALUE","LOGO_SKELETON_HEIGHT_VALUE","CardImageCap","forwardRef","src","fallbackSrc","srcAlt","logoSrc","fallbackLogoSrc","logoAlt","skeletonHeight","skeletonWidth","logoSkeleton","logoSkeletonHeight","logoSkeletonWidth","className","imageLoadingType","ref","orientation","isLoading","showImageCap","setShowImageCap","showLogoCap","setShowLogoCap","wrapperClassName","createElement","containerClassName","height","width","handleSrcFallback","event","altSrc","imageKey","currentTarget","endsWith","show","onError","onLoad","alt","loading","propTypes","string","number","bool","oneOf","defaultProps","undefined"],"sources":["../../src/Card/CardImageCap.jsx"],"sourcesContent":["import React, { useContext, useState } from 'react';\nimport PropTypes from 'prop-types';\nimport classNames from 'classnames';\nimport Skeleton from 'react-loading-skeleton';\nimport CardContext from './CardContext';\nimport { cardSrcFallbackImg } from './CardFallbackDefaultImage';\n\nconst SKELETON_HEIGHT_VALUE = 140;\nconst LOGO_SKELETON_HEIGHT_VALUE = 41;\n\nconst CardImageCap = React.forwardRef(({\n src,\n fallbackSrc,\n srcAlt,\n logoSrc,\n fallbackLogoSrc,\n logoAlt,\n skeletonHeight,\n skeletonWidth,\n logoSkeleton,\n logoSkeletonHeight,\n logoSkeletonWidth,\n className,\n imageLoadingType,\n}, ref) => {\n const { orientation, isLoading } = useContext(CardContext);\n const [showImageCap, setShowImageCap] = useState(false);\n const [showLogoCap, setShowLogoCap] = useState(false);\n\n const wrapperClassName = `pgn__card-wrapper-image-cap ${orientation}`;\n\n if (isLoading) {\n return (\n <div\n className={classNames(wrapperClassName, className)}\n data-testid=\"image-loader-wrapper\"\n >\n <Skeleton\n containerClassName=\"pgn__card-image-cap-loader\"\n height={orientation === 'horizontal' ? '100%' : skeletonHeight}\n width={skeletonWidth}\n />\n {logoSkeleton && (\n <Skeleton\n containerClassName=\"pgn__card-logo-cap\"\n height={logoSkeletonHeight}\n width={logoSkeletonWidth}\n />\n )}\n </div>\n );\n }\n\n const handleSrcFallback = (event, altSrc, imageKey) => {\n const { currentTarget } = event;\n\n if (!altSrc || currentTarget.src.endsWith(altSrc)) {\n if (imageKey === 'imageCap') {\n currentTarget.src = cardSrcFallbackImg;\n } else {\n setShowLogoCap(false);\n }\n\n return;\n }\n\n currentTarget.src = altSrc;\n };\n\n return (\n <div className={classNames(className, wrapperClassName)} ref={ref}>\n {!!src && (\n <img\n className={classNames('pgn__card-image-cap', { show: showImageCap })}\n src={src}\n onError={(event) => handleSrcFallback(event, fallbackSrc, 'imageCap')}\n onLoad={() => setShowImageCap(true)}\n alt={srcAlt}\n loading={imageLoadingType}\n />\n )}\n {!!logoSrc && (\n <img\n className={classNames('pgn__card-logo-cap', { show: showLogoCap })}\n src={logoSrc}\n onError={(event) => handleSrcFallback(event, fallbackLogoSrc, 'logoCap')}\n onLoad={() => setShowLogoCap(true)}\n alt={logoAlt}\n loading={imageLoadingType}\n />\n )}\n </div>\n );\n});\n\nCardImageCap.propTypes = {\n /** Specifies class name to append to the base element. */\n className: PropTypes.string,\n /** Specifies image src. */\n src: PropTypes.string,\n /** Specifies fallback image src. */\n fallbackSrc: PropTypes.string,\n /** Specifies image alt text. */\n srcAlt: PropTypes.string,\n /** Specifies logo src to put on top of the image. */\n logoSrc: PropTypes.string,\n /** Specifies fallback image logo src. */\n fallbackLogoSrc: PropTypes.string,\n /** Specifies logo image alt text. */\n logoAlt: PropTypes.string,\n /** Specifies height of Image skeleton in loading state. */\n skeletonHeight: PropTypes.number,\n /** Specifies width of Image skeleton in loading state. */\n skeletonWidth: PropTypes.number,\n /** Specifies whether the cap should be displayed during loading. */\n logoSkeleton: PropTypes.bool,\n /** Specifies height of Logo skeleton in loading state. */\n logoSkeletonHeight: PropTypes.number,\n /** Specifies width of Logo skeleton in loading state. */\n logoSkeletonWidth: PropTypes.number,\n /** Specifies loading type for images */\n imageLoadingType: PropTypes.oneOf(['eager', 'lazy']),\n};\n\nCardImageCap.defaultProps = {\n src: undefined,\n fallbackSrc: cardSrcFallbackImg,\n logoSrc: undefined,\n fallbackLogoSrc: undefined,\n className: undefined,\n srcAlt: undefined,\n logoAlt: undefined,\n skeletonHeight: SKELETON_HEIGHT_VALUE,\n logoSkeleton: false,\n logoSkeletonHeight: LOGO_SKELETON_HEIGHT_VALUE,\n skeletonWidth: undefined,\n logoSkeletonWidth: undefined,\n imageLoadingType: 'eager',\n};\n\nexport default CardImageCap;\n"],"mappings":"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","ignoreList":[]}
1
+ {"version":3,"file":"CardImageCap.js","names":["React","useContext","useState","PropTypes","classNames","Skeleton","CardContext","cardSrcFallbackImg","SKELETON_HEIGHT_VALUE","LOGO_SKELETON_HEIGHT_VALUE","CardImageCap","forwardRef","src","fallbackSrc","srcAlt","logoSrc","fallbackLogoSrc","logoAlt","skeletonHeight","skeletonWidth","logoSkeleton","logoSkeletonHeight","logoSkeletonWidth","className","imageLoadingType","skeletonDuringImageLoad","ref","orientation","isLoading","showImageCap","setShowImageCap","showLogoCap","setShowLogoCap","wrapperClassName","loadingSkeleton","createElement","containerClassName","height","width","loadingLogoSkeleton","handleSrcFallback","event","altSrc","imageKey","currentTarget","endsWith","Fragment","show","onError","onLoad","alt","loading","propTypes","string","number","bool","oneOf","defaultProps","undefined"],"sources":["../../src/Card/CardImageCap.jsx"],"sourcesContent":["import React, { useContext, useState } from 'react';\nimport PropTypes from 'prop-types';\nimport classNames from 'classnames';\nimport Skeleton from 'react-loading-skeleton';\nimport CardContext from './CardContext';\nimport { cardSrcFallbackImg } from './CardFallbackDefaultImage';\n\nconst SKELETON_HEIGHT_VALUE = 140;\nconst LOGO_SKELETON_HEIGHT_VALUE = 41;\n\nconst CardImageCap = React.forwardRef(({\n src,\n fallbackSrc,\n srcAlt,\n logoSrc,\n fallbackLogoSrc,\n logoAlt,\n skeletonHeight,\n skeletonWidth,\n logoSkeleton,\n logoSkeletonHeight,\n logoSkeletonWidth,\n className,\n imageLoadingType,\n skeletonDuringImageLoad,\n}, ref) => {\n const { orientation, isLoading } = useContext(CardContext);\n const [showImageCap, setShowImageCap] = useState(false);\n const [showLogoCap, setShowLogoCap] = useState(false);\n\n const wrapperClassName = `pgn__card-wrapper-image-cap ${orientation}`;\n\n const loadingSkeleton = () => (\n <Skeleton\n containerClassName=\"pgn__card-image-cap-loader\"\n height={orientation === 'horizontal' ? '100%' : skeletonHeight}\n width={skeletonWidth}\n />\n );\n\n const loadingLogoSkeleton = () => (\n <Skeleton\n containerClassName=\"pgn__card-logo-cap\"\n height={logoSkeletonHeight}\n width={logoSkeletonWidth}\n />\n );\n\n if (isLoading) {\n return (\n <div\n className={classNames(wrapperClassName, className)}\n data-testid=\"image-loader-wrapper\"\n >\n {loadingSkeleton()}\n {logoSkeleton && loadingLogoSkeleton()}\n </div>\n );\n }\n\n const handleSrcFallback = (event, altSrc, imageKey) => {\n const { currentTarget } = event;\n\n if (!altSrc || currentTarget.src.endsWith(altSrc)) {\n if (imageKey === 'imageCap') {\n currentTarget.src = cardSrcFallbackImg;\n } else {\n setShowLogoCap(false);\n }\n\n return;\n }\n\n currentTarget.src = altSrc;\n };\n\n return (\n <div className={classNames(className, wrapperClassName)} ref={ref}>\n {!!src && (\n <>\n {skeletonDuringImageLoad && !showImageCap && loadingSkeleton()}\n <img\n className={classNames('pgn__card-image-cap', { show: showImageCap })}\n src={src}\n onError={(event) => handleSrcFallback(event, fallbackSrc, 'imageCap')}\n onLoad={() => setShowImageCap(true)}\n alt={srcAlt}\n loading={imageLoadingType}\n />\n </>\n )}\n {!!logoSrc && (\n <>\n {skeletonDuringImageLoad && !showLogoCap && loadingLogoSkeleton()}\n <img\n className={classNames('pgn__card-logo-cap', { show: showLogoCap })}\n src={logoSrc}\n onError={(event) => handleSrcFallback(event, fallbackLogoSrc, 'logoCap')}\n onLoad={() => setShowLogoCap(true)}\n alt={logoAlt}\n loading={imageLoadingType}\n />\n </>\n )}\n </div>\n );\n});\n\nCardImageCap.propTypes = {\n /** Specifies class name to append to the base element. */\n className: PropTypes.string,\n /** Specifies image src. */\n src: PropTypes.string,\n /** Specifies fallback image src. */\n fallbackSrc: PropTypes.string,\n /** Specifies image alt text. */\n srcAlt: PropTypes.string,\n /** Specifies logo src to put on top of the image. */\n logoSrc: PropTypes.string,\n /** Specifies fallback image logo src. */\n fallbackLogoSrc: PropTypes.string,\n /** Specifies logo image alt text. */\n logoAlt: PropTypes.string,\n /** Specifies height of Image skeleton in loading state. */\n skeletonHeight: PropTypes.number,\n /** Specifies width of Image skeleton in loading state. */\n skeletonWidth: PropTypes.number,\n /** Specifies whether the cap should be displayed during loading. */\n logoSkeleton: PropTypes.bool,\n /** Specifies height of Logo skeleton in loading state. */\n logoSkeletonHeight: PropTypes.number,\n /** Specifies width of Logo skeleton in loading state. */\n logoSkeletonWidth: PropTypes.number,\n /** Specifies loading type for images */\n imageLoadingType: PropTypes.oneOf(['eager', 'lazy']),\n /** Render the loading skeleton when the image is loading in\n * addition to when the whole card is in `isLoading` state */\n skeletonDuringImageLoad: PropTypes.bool,\n};\n\nCardImageCap.defaultProps = {\n src: undefined,\n fallbackSrc: cardSrcFallbackImg,\n logoSrc: undefined,\n fallbackLogoSrc: undefined,\n className: undefined,\n srcAlt: undefined,\n logoAlt: undefined,\n skeletonHeight: SKELETON_HEIGHT_VALUE,\n logoSkeleton: false,\n logoSkeletonHeight: LOGO_SKELETON_HEIGHT_VALUE,\n skeletonWidth: undefined,\n logoSkeletonWidth: undefined,\n imageLoadingType: 'eager',\n skeletonDuringImageLoad: false,\n};\n\nexport default CardImageCap;\n"],"mappings":"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","ignoreList":[]}
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "@openedx/paragon",
3
- "version": "23.16.1",
3
+ "version": "23.17.0",
4
4
  "description": "Accessible, responsive UI component library based on Bootstrap.",
5
5
  "main": "dist/index.js",
6
6
  "module": "dist/index.js",
@@ -22,6 +22,7 @@ const CardImageCap = React.forwardRef(({
22
22
  logoSkeletonWidth,
23
23
  className,
24
24
  imageLoadingType,
25
+ skeletonDuringImageLoad,
25
26
  }, ref) => {
26
27
  const { orientation, isLoading } = useContext(CardContext);
27
28
  const [showImageCap, setShowImageCap] = useState(false);
@@ -29,24 +30,30 @@ const CardImageCap = React.forwardRef(({
29
30
 
30
31
  const wrapperClassName = `pgn__card-wrapper-image-cap ${orientation}`;
31
32
 
33
+ const loadingSkeleton = () => (
34
+ <Skeleton
35
+ containerClassName="pgn__card-image-cap-loader"
36
+ height={orientation === 'horizontal' ? '100%' : skeletonHeight}
37
+ width={skeletonWidth}
38
+ />
39
+ );
40
+
41
+ const loadingLogoSkeleton = () => (
42
+ <Skeleton
43
+ containerClassName="pgn__card-logo-cap"
44
+ height={logoSkeletonHeight}
45
+ width={logoSkeletonWidth}
46
+ />
47
+ );
48
+
32
49
  if (isLoading) {
33
50
  return (
34
51
  <div
35
52
  className={classNames(wrapperClassName, className)}
36
53
  data-testid="image-loader-wrapper"
37
54
  >
38
- <Skeleton
39
- containerClassName="pgn__card-image-cap-loader"
40
- height={orientation === 'horizontal' ? '100%' : skeletonHeight}
41
- width={skeletonWidth}
42
- />
43
- {logoSkeleton && (
44
- <Skeleton
45
- containerClassName="pgn__card-logo-cap"
46
- height={logoSkeletonHeight}
47
- width={logoSkeletonWidth}
48
- />
49
- )}
55
+ {loadingSkeleton()}
56
+ {logoSkeleton && loadingLogoSkeleton()}
50
57
  </div>
51
58
  );
52
59
  }
@@ -70,24 +77,30 @@ const CardImageCap = React.forwardRef(({
70
77
  return (
71
78
  <div className={classNames(className, wrapperClassName)} ref={ref}>
72
79
  {!!src && (
73
- <img
74
- className={classNames('pgn__card-image-cap', { show: showImageCap })}
75
- src={src}
76
- onError={(event) => handleSrcFallback(event, fallbackSrc, 'imageCap')}
77
- onLoad={() => setShowImageCap(true)}
78
- alt={srcAlt}
79
- loading={imageLoadingType}
80
- />
80
+ <>
81
+ {skeletonDuringImageLoad && !showImageCap && loadingSkeleton()}
82
+ <img
83
+ className={classNames('pgn__card-image-cap', { show: showImageCap })}
84
+ src={src}
85
+ onError={(event) => handleSrcFallback(event, fallbackSrc, 'imageCap')}
86
+ onLoad={() => setShowImageCap(true)}
87
+ alt={srcAlt}
88
+ loading={imageLoadingType}
89
+ />
90
+ </>
81
91
  )}
82
92
  {!!logoSrc && (
83
- <img
84
- className={classNames('pgn__card-logo-cap', { show: showLogoCap })}
85
- src={logoSrc}
86
- onError={(event) => handleSrcFallback(event, fallbackLogoSrc, 'logoCap')}
87
- onLoad={() => setShowLogoCap(true)}
88
- alt={logoAlt}
89
- loading={imageLoadingType}
90
- />
93
+ <>
94
+ {skeletonDuringImageLoad && !showLogoCap && loadingLogoSkeleton()}
95
+ <img
96
+ className={classNames('pgn__card-logo-cap', { show: showLogoCap })}
97
+ src={logoSrc}
98
+ onError={(event) => handleSrcFallback(event, fallbackLogoSrc, 'logoCap')}
99
+ onLoad={() => setShowLogoCap(true)}
100
+ alt={logoAlt}
101
+ loading={imageLoadingType}
102
+ />
103
+ </>
91
104
  )}
92
105
  </div>
93
106
  );
@@ -120,6 +133,9 @@ CardImageCap.propTypes = {
120
133
  logoSkeletonWidth: PropTypes.number,
121
134
  /** Specifies loading type for images */
122
135
  imageLoadingType: PropTypes.oneOf(['eager', 'lazy']),
136
+ /** Render the loading skeleton when the image is loading in
137
+ * addition to when the whole card is in `isLoading` state */
138
+ skeletonDuringImageLoad: PropTypes.bool,
123
139
  };
124
140
 
125
141
  CardImageCap.defaultProps = {
@@ -136,6 +152,7 @@ CardImageCap.defaultProps = {
136
152
  skeletonWidth: undefined,
137
153
  logoSkeletonWidth: undefined,
138
154
  imageLoadingType: 'eager',
155
+ skeletonDuringImageLoad: false,
139
156
  };
140
157
 
141
158
  export default CardImageCap;