`.
90 |
91 | ## [1.4.11] - 2020-06-10
92 |
93 | ### Fixed
94 |
95 | - Use aliased version of react-spring dependencies, fixes "Cannot read property 'ref' of null" error
96 |
97 | ## [1.4.10] - 2020-05-03
98 |
99 | ### Added
100 |
101 | - Optimize output bundles with Terser
102 | - Apply `babel-plugin-styled-components` babel plugin to optimize styled-components styles
103 |
104 | ## [1.4.9] - 2020-05-02
105 |
106 | ### Fixed
107 |
108 | - Fix partially off-screen image stage in ie11
109 |
110 | ### Added
111 |
112 | - Upgrade to `rollup@2.7.6`, `react-use-gesture@7.0.15` and `@babel/****@7.9.6`
113 |
114 | ## [1.4.8] - 2020-04-08
115 |
116 | ### Fixed
117 |
118 | - Dropped `lodash.clamp` dependency
119 | - Call onPrev/onNext callbacks on all paging events, even at the beginning or end of image array to allow for infinite paging
120 |
121 | ## [1.4.7] - 2020-04-05
122 |
123 | ### Added
124 |
125 | - Lower distance and velocity gesture threshold for a paging between images
126 | - Allow click to zoom while a paging animation completes
127 | - Upgrade to `rollup@2.3.3` and `react-use-gesture@7.0.10`
128 | - Add `sideEffects: false` to `package.json`
129 |
130 | ## [1.4.6] - 2020-04-04
131 |
132 | ### Fixed
133 |
134 | - Handle edge case bugs with `singleClickToZoom` option
135 | - Fix undefined errors in panning drag handler on initial drags
136 |
137 | ## [1.4.5] - 2020-03-27
138 |
139 | ### Added
140 |
141 | - Add optional `singleClickToZoom` prop which allows single click/tap zooming on images
142 |
143 | ## [1.4.4] - 2020-03-24
144 |
145 | ### Fixed
146 |
147 | - Add orientationchange event listener for ios devices
148 |
149 | ## [1.4.3] - 2020-03-23
150 |
151 | ### Fixed
152 |
153 | - Drop lodash.merge
154 | - Fix image heights not adjusting on window resize
155 |
156 | ## [1.4.2] - 2020-03-15
157 |
158 | ### Fixed
159 |
160 | - Remove need for react-use-measure and @juggle/resize-observer
161 |
162 | ## [1.4.1] - 2020-03-13
163 |
164 | ### Fixed
165 |
166 | - Fix image stage height on Safari
167 | - Upgrade to react-use-gesture@7.0.5
168 | - Upgrade to rollup@2.0.6
169 |
170 | ## [1.4.0] - 2020-03-7
171 |
172 | ### BREAKING CHANGE
173 |
174 | - Replaced inline styles with styled-components. This library now has a peer dependency on `styled-components@5`
175 |
176 | ### Fixed
177 |
178 | - Gigantic initial image size in Firefox and MS Edge
179 | - Click background to close functionality
180 |
181 | ### Added
182 |
183 | - Vendor prefixed styles
184 | - A resize observer polyfill is now included to support MS Edge
185 |
186 | ## [1.2.1] - 2020-03-5
187 |
188 | ### Added
189 |
190 | - Added `renderImageOverlay` prop, renders a React component within the image stage, useful for creating UI overlays on top of the current image
191 |
192 | ## [1.2.0] - 2020-02-14
193 |
194 | - Upgrade react-use-gesture v6 -> v7
195 | - Upgrade all deps
196 |
197 | ## [1.1.7] - 2019-09-23
198 |
199 | ### Fixed
200 |
201 | - Improved panning performance
202 | - Tweaked mousewheel swiping threshold
203 | - Upgrade to react-use-gesture v6
204 |
205 | ## [1.1.4] - 2019-08-27
206 |
207 | ### Added
208 |
209 | - Implement mousewheel paging of images
210 |
211 | ## [1.1.3] - 2019-08-19
212 |
213 | ### Fixed
214 |
215 | - Prevent vertical dragging from paging images
216 | - Switch to @react-spring/web package
217 |
218 | ## [1.1.2] - 2019-08-17
219 |
220 | ### Fixed
221 |
222 | - Properly dispose wheel event listener
223 |
224 | ## [1.1.1] - 2019-08-14
225 |
226 | ### Fixed
227 |
228 | - Adjusted "pan out of bounds" threshold
229 |
230 | ## [1.1.0] - 2019-08-14
231 |
232 | ### Added
233 |
234 | - Implement proper Ctrl + `Mousewheel` and `Trackpad Pinch` zooming
235 |
236 | ## [1.0.1] - 2019-08-7
237 |
238 | Add testing suite and travis-ci config
239 |
240 | ## [1.0.0] - 2019-08-5
241 |
242 | Upgrade deps and release as stable
243 |
244 | ## [0.0.3] - 2019-08-1
245 |
246 | ### Changed
247 |
248 | - Renamed onClickNext => onNext
249 | - Renamed onClickPrev => onPrev
250 |
251 | ## [0.0.2] - 2019-07-31
252 |
253 | Initial Release
254 |
--------------------------------------------------------------------------------
/example/components/GalleryLightbox/index.jsx:
--------------------------------------------------------------------------------
1 | import { FiHeart, FiPrinter, FiShare } from 'react-icons/fi';
2 | import React from 'react';
3 | import PropTypes from 'prop-types';
4 | import styled from 'styled-components';
5 | import Color from 'color';
6 | import Gallery from 'react-photo-gallery';
7 | import Lightbox from 'react-spring-lightbox';
8 | import GridImage from './components/GridImage';
9 | import LightboxHeader from './components/LightboxHeader';
10 | import LightboxArrowButton from './components/LightboxArrowButton';
11 |
12 | class BlogImageGallery extends React.Component {
13 | static propTypes = {
14 | galleryTitle: PropTypes.string.isRequired,
15 | imageMasonryDirection: PropTypes.oneOf(['column', 'row']),
16 | images: PropTypes.arrayOf(
17 | PropTypes.shape({
18 | alt: PropTypes.string.isRequired,
19 | caption: PropTypes.string.isRequired,
20 | height: PropTypes.number,
21 | src: PropTypes.string.isRequired,
22 | width: PropTypes.number,
23 | }),
24 | ).isRequired,
25 | };
26 |
27 | static defaultProps = {
28 | imageMasonryDirection: 'column',
29 | };
30 |
31 | constructor() {
32 | super();
33 |
34 | this.state = {
35 | clientSide: false,
36 | currentImageIndex: 0,
37 | lightboxIsOpen: false,
38 | };
39 | }
40 |
41 | componentDidMount() {
42 | this.setState({ clientSide: true });
43 | }
44 |
45 | openLightbox = (e, { index }) => {
46 | this.setState({
47 | currentImageIndex: index,
48 | lightboxIsOpen: true,
49 | });
50 | };
51 |
52 | closeLightbox = () => {
53 | this.setState({
54 | lightboxIsOpen: false,
55 | });
56 | };
57 |
58 | gotoPrevious = () => {
59 | const { currentImageIndex } = this.state;
60 |
61 | // If the current image isn't the first in the list, go to the previous
62 | if (currentImageIndex > 0) {
63 | this.setState({
64 | currentImageIndex: currentImageIndex - 1,
65 | });
66 | }
67 | };
68 |
69 | gotoNext = () => {
70 | const { images } = this.props;
71 | const { currentImageIndex } = this.state;
72 |
73 | // If the current image isn't the list in the list, go to the next
74 | if (currentImageIndex + 1 < images.length) {
75 | this.setState({
76 | currentImageIndex: currentImageIndex + 1,
77 | });
78 | }
79 | };
80 |
81 | /**
82 | * Sets breakpoints for column width based on containerWidth
83 | *
84 | * @int containerWidth The current width of the image grid
85 | */
86 | columnConfig = (containerWidth) => {
87 | let columns = 1;
88 | if (containerWidth >= 500) columns = 2;
89 | if (containerWidth >= 900) columns = 3;
90 | if (containerWidth >= 1500) columns = 4;
91 |
92 | return columns;
93 | };
94 |
95 | render() {
96 | const { clientSide, currentImageIndex, lightboxIsOpen } = this.state;
97 | const { galleryTitle, imageMasonryDirection, images } = this.props;
98 |
99 | // remove the height and width props for the lightbox images array
100 | const listboxImages = [...images].map((image) => {
101 | const newImage = { ...image };
102 | delete newImage.height;
103 | delete newImage.width;
104 |
105 | return newImage;
106 | });
107 |
108 | return (
109 |
110 | {clientSide && (
111 |
119 | )}
120 | (
129 |
135 | )}
136 | renderImageOverlay={() => (
137 |
138 | Create your own UI
139 |
140 |
141 |
142 |
143 | )}
144 | renderNextButton={({ canNext }) => (
145 |
150 | )}
151 | renderPrevButton={({ canPrev }) => (
152 |
157 | )}
158 | singleClickToZoom
159 | />
160 |
161 | );
162 | }
163 | }
164 |
165 | export default BlogImageGallery;
166 |
167 | const GalleryContainer = styled.div`
168 | overflow-y: auto;
169 | max-height: calc(100% - 4em);
170 | padding: 2em;
171 | `;
172 |
173 | const StyledLightbox = styled(Lightbox)`
174 | background: ${({ theme }) =>
175 | Color(theme.accentColor).alpha(0.95).hsl().string()};
176 | * ::selection {
177 | background: ${({ theme }) => theme.pageContentSelectionColor};
178 | }
179 | * ::-moz-selection {
180 | background: ${({ theme }) =>
181 | new Color(theme.pageContentSelectionColor).darken(0.57).hex()};
182 | }
183 | `;
184 |
185 | const ImageOverlay = styled.div`
186 | position: absolute;
187 | top: 0%;
188 | right: 0%;
189 | border: ${({ theme }) => theme.pageContentSelectionColor} 1px solid;
190 | background: rgba(39, 39, 39, 0.5);
191 | p {
192 | color: ${({ theme }) => theme.pageContentSelectionColor};
193 | text-align: center;
194 | font-weight: bold;
195 | font-size: 1.2em;
196 | margin: 0.5em 0;
197 | }
198 | svg {
199 | border: white 1px solid;
200 | fill: ${({ theme }) => theme.pageContentSelectionColor};
201 | margin: 10px;
202 | padding: 5px;
203 | :hover {
204 | border: ${({ theme }) => theme.pageContentSelectionColor} 1px solid;
205 | fill: ${({ theme }) =>
206 | new Color(theme.pageContentSelectionColor).darken(0.57).hex()};
207 | cursor: pointer;
208 | }
209 | }
210 | `;
211 |
--------------------------------------------------------------------------------
/README.md:
--------------------------------------------------------------------------------
1 | # react-spring-lightbox
2 |
3 | [](https://www.npmjs.com/package/react-spring-lightbox)
4 | [](https://github.com/tim-soft/react-spring-lightbox/blob/master/LICENSE)
5 | 
6 | 
7 | [](https://travis-ci.org/tim-soft/react-spring-lightbox)
8 |
9 | React-spring-lightbox is a flexible image gallery lightbox with native-feeling touch gestures and buttery smooth animations.
10 |
11 |
12 |
13 |
14 |
15 |
16 | Docs
17 |
18 | Codesandbox
19 |
20 |
21 | ## ✨ Features
22 |
23 | - :point_up: `Mousewheel`, swipe or click+drag to page photos
24 | - :keyboard: Keyboard controls ← → Esc
25 | - :mouse2: Ctrl + `Mousewheel` or `Trackpad Pinch` to zoom
26 | - :mag_right: Double/Single-tap or double/single-click to zoom in/out
27 | - :ok_hand: Pinch to zoom
28 | - :point_left: Panning on zoomed-in images
29 | - :checkered_flag: Highly performant spring based animations via [react-spring](https://github.com/react-spring/react-spring)
30 | - No external CSS
31 | - Implement your own UI
32 | - Supports IE 11, Edge, Safari, Chrome, Firefox and Opera
33 | - Full typescript support
34 | - Supports any `
` attribute including `loading` (lazy loading), `srcset` and `aria-*`
35 |
36 | ## Install
37 |
38 | ```bash
39 | yarn add react-spring-lightbox
40 | ```
41 |
42 | ## Usage
43 |
44 | The `images` prop now accepts a list of objects whose properties can be _almost_ any valid React `
` prop including `srcset`, `loading` (lazy loading) and `aria-*` attributes.
45 |
46 | If you use typescript, the exact type can be imported from `import { ImagesListType } from 'react-spring-lightbox';`
47 |
48 | ```typescript
49 | import React, { useState } from 'react';
50 | import Lightbox, { ImagesListType } from 'react-spring-lightbox';
51 |
52 | const images: ImagesListType = [
53 | {
54 | src: 'https://timellenberger.com/static/blog-content/dark-mode/win10-dark-mode.jpg',
55 | loading: 'lazy',
56 | alt: 'Windows 10 Dark Mode Setting',
57 | },
58 | {
59 | src: 'https://timellenberger.com/static/blog-content/dark-mode/macos-dark-mode.png',
60 | loading: 'lazy',
61 | alt: 'macOS Mojave Dark Mode Setting',
62 | },
63 | {
64 | src: 'https://timellenberger.com/static/blog-content/dark-mode/android-9-dark-mode.jpg',
65 | loading: 'lazy',
66 | alt: 'Android 9.0 Dark Mode Setting',
67 | },
68 | ];
69 |
70 | const CoolLightbox = () => {
71 | const [currentImageIndex, setCurrentIndex] = useState(0);
72 |
73 | const gotoPrevious = () =>
74 | currentImageIndex > 0 && setCurrentIndex(currentImageIndex - 1);
75 |
76 | const gotoNext = () =>
77 | currentImageIndex + 1 < images.length &&
78 | setCurrentIndex(currentImageIndex + 1);
79 |
80 | return (
81 | ()}
89 | // renderFooter={() => ()}
90 | // renderPrevButton={() => ()}
91 | // renderNextButton={() => ()}
92 | // renderImageOverlay={() => ()}
93 |
94 | /* Add styling */
95 | // className="cool-class"
96 | // style={{ background: "grey" }}
97 |
98 | /* Handle closing */
99 | // onClose={handleClose}
100 |
101 | /* Use single or double click to zoom */
102 | // singleClickToZoom
103 |
104 | /* react-spring config for open/close animation */
105 | // pageTransitionConfig={{
106 | // from: { transform: "scale(0.75)", opacity: 0 },
107 | // enter: { transform: "scale(1)", opacity: 1 },
108 | // leave: { transform: "scale(0.75)", opacity: 0 },
109 | // config: { mass: 1, tension: 320, friction: 32 }
110 | // }}
111 | />
112 | );
113 | };
114 |
115 | export default CoolLightbox;
116 | ```
117 |
118 | ## Props
119 |
120 | | Prop | Description |
121 | | -------------------- | ------------------------------------------------------------------------------------------------------------------ |
122 | | isOpen | Flag that dictates if the lightbox is open or closed |
123 | | onClose | Function that closes the Lightbox |
124 | | onPrev | Function that changes currentIndex to previous image in images |
125 | | onNext | Function that changes currentIndex to next image in images |
126 | | currentIndex | Index of image in images array that is currently shown |
127 | | renderHeader | A React component that renders above the image pager |
128 | | renderFooter | A React component that renders below the image pager |
129 | | renderPrevButton | A React component that is used for previous button in image pager |
130 | | renderNextButton | A React component that is used for next button in image pager |
131 | | renderImageOverlay | A React component that renders within the image stage, useful for creating UI overlays on top of the current image |
132 | | singleClickToZoom | Overrides the default behavior of double clicking causing an image zoom to a single click |
133 | | images | Array of image objects to be shown in Lightbox |
134 | | className | Classes are applied to the root lightbox component |
135 | | style | Inline styles are applied to the root lightbox component |
136 | | pageTransitionConfig | React-Spring useTransition config for page open/close animation |
137 |
138 | ## Local Development
139 |
140 | Clone the repo
141 |
142 | ```bash
143 | git clone https://github.com/tim-soft/react-spring-lightbox.git react-spring-lightbox
144 | cd react-spring-lightbox
145 | ```
146 |
147 | Setup symlinks
148 |
149 | ```bash
150 | yarn link
151 | cd example
152 | yarn link react-spring-lightbox
153 | ```
154 |
155 | Run the library in development mode
156 |
157 | ```bash
158 | yarn start
159 | ```
160 |
161 | Run the example app in development mode
162 |
163 | ```bash
164 | cd example
165 | yarn dev
166 | ```
167 |
168 | Changes to the library code should hot reload in the demo app
169 |
170 | ## License
171 |
172 | MIT © [Tim Ellenberger](https://github.com/tim-soft)
173 |
--------------------------------------------------------------------------------
/example/pages/index.tsx:
--------------------------------------------------------------------------------
1 | import * as React from 'react';
2 | import styled from 'styled-components';
3 | import GalleryLightbox from '../components/GalleryLightbox';
4 | import InlineLightbox from '../components/InlineLightbox';
5 |
6 | const images = [
7 | {
8 | alt: 'Windows 10 Dark Mode Setting',
9 | caption: 'Windows 10 Dark Mode Setting',
10 | height: 2035,
11 | src: 'https://timellenberger.com/static/blog-content/dark-mode/win10-dark-mode.jpg',
12 | width: 2848,
13 | },
14 | {
15 | alt: 'macOS Mojave Dark Mode Setting',
16 | caption: 'macOS Mojave Dark Mode Setting',
17 | height: 1218,
18 | src: 'https://timellenberger.com/static/blog-content/dark-mode/macos-dark-mode.png',
19 | width: 1200,
20 | },
21 | {
22 | alt: 'Android 9.0 Dark Mode Setting',
23 | caption: 'Android 9.0 Dark Mode Setting',
24 | height: 600,
25 | src: 'https://timellenberger.com/static/blog-content/dark-mode/android-9-dark-mode.jpg',
26 | width: 1280,
27 | },
28 | {
29 | alt: 'Windows 10 Dark Mode Setting#',
30 | caption: 'Windows 10 Dark Mode Setting#',
31 | height: 2035,
32 | src: 'https://timellenberger.com/static/blog-content/dark-mode/win10-dark-mode.jpg',
33 | width: 2848,
34 | },
35 | {
36 | alt: 'Windows 10 Dark Mode Setting',
37 | caption: 'Windows 10 Dark Mode Setting',
38 | height: 2035,
39 | src: 'https://timellenberger.com/static/blog-content/dark-mode/win10-dark-mode.jpg',
40 | width: 2848,
41 | },
42 | {
43 | alt: 'macOS Mojave Dark Mode Setting',
44 | caption: 'macOS Mojave Dark Mode Setting',
45 | height: 1218,
46 | src: 'https://timellenberger.com/static/blog-content/dark-mode/macos-dark-mode.png',
47 | width: 1200,
48 | },
49 | {
50 | alt: 'Android 9.0 Dark Mode Setting',
51 | caption: 'Android 9.0 Dark Mode Setting',
52 | height: 600,
53 | src: 'https://timellenberger.com/static/blog-content/dark-mode/android-9-dark-mode.jpg',
54 | width: 1280,
55 | },
56 | {
57 | alt: 'Windows 10 Dark Mode Setting#',
58 | caption: 'Windows 10 Dark Mode Setting#',
59 | height: 2035,
60 | src: 'https://timellenberger.com/static/blog-content/dark-mode/win10-dark-mode.jpg',
61 | width: 2848,
62 | },
63 | {
64 | alt: 'Android 9.0 Dark Mode Setting',
65 | caption: 'Android 9.0 Dark Mode Setting',
66 | height: 600,
67 | src: 'https://timellenberger.com/static/blog-content/dark-mode/android-9-dark-mode.jpg',
68 | width: 1280,
69 | },
70 | {
71 | alt: 'Windows 10 Dark Mode Setting#',
72 | caption: 'Windows 10 Dark Mode Setting#',
73 | height: 2035,
74 | src: 'https://timellenberger.com/static/blog-content/dark-mode/win10-dark-mode.jpg',
75 | width: 2848,
76 | },
77 | {
78 | alt: 'macOS Mojave Dark Mode Setting',
79 | caption: 'macOS Mojave Dark Mode Setting',
80 | height: 1218,
81 | src: 'https://timellenberger.com/static/blog-content/dark-mode/macos-dark-mode.png',
82 | width: 1200,
83 | },
84 | {
85 | alt: 'Android 9.0 Dark Mode Setting',
86 | caption: 'Android 9.0 Dark Mode Setting',
87 | height: 600,
88 | src: 'https://timellenberger.com/static/blog-content/dark-mode/android-9-dark-mode.jpg',
89 | width: 1280,
90 | },
91 | {
92 | alt: 'Windows 10 Dark Mode Setting#',
93 | caption: 'Windows 10 Dark Mode Setting#',
94 | height: 2035,
95 | src: 'https://timellenberger.com/static/blog-content/dark-mode/win10-dark-mode.jpg',
96 | width: 2848,
97 | },
98 | {
99 | alt: 'Android 9.0 Dark Mode Setting',
100 | caption: 'Android 9.0 Dark Mode Setting',
101 | height: 600,
102 | src: 'https://timellenberger.com/static/blog-content/dark-mode/android-9-dark-mode.jpg',
103 | width: 1280,
104 | },
105 | {
106 | alt: 'Windows 10 Dark Mode Setting#',
107 | caption: 'Windows 10 Dark Mode Setting#',
108 | height: 2035,
109 | src: 'https://timellenberger.com/static/blog-content/dark-mode/win10-dark-mode.jpg',
110 | width: 2848,
111 | },
112 | ];
113 |
114 | const getRandomImages = (numImages: number) => {
115 | const imageArray = [...new Array(numImages)];
116 |
117 | const getRandomInt = (min, max) => {
118 | min = Math.ceil(min);
119 | max = Math.floor(max);
120 | return Math.floor(Math.random() * (max - min) + min); //The maximum is exclusive and the minimum is inclusive
121 | };
122 |
123 | const altCaption = 'picsum photo';
124 | const randomizedArray = imageArray.map((imageObj) => {
125 | const imageURL = `https://picsum.photos/id/${getRandomInt(
126 | 1,
127 | 200,
128 | )}/1920/1280`;
129 | return {
130 | ...imageObj,
131 | alt: altCaption,
132 | caption: altCaption,
133 | src: imageURL,
134 | };
135 | });
136 |
137 | return randomizedArray;
138 | };
139 |
140 | const HomePage = () => {
141 | const [inlineImages, setInlineImages] = React.useState(getRandomImages(15));
142 |
143 | return (
144 |
145 |
146 | Gallery Lightbox
147 |
152 |
153 |
154 |
155 | Inline Lightbox
156 |
157 |
158 | 🎉🎉Inline content🎉🎉
159 |
160 |
161 |
162 | 🎉🎉Inline content🎉🎉
163 |
164 |
165 |
172 |
183 |
184 |
185 | );
186 | };
187 |
188 | export default HomePage;
189 |
190 | const Container = styled.div`
191 | height: 100%;
192 | width: 100%;
193 | user-select: none;
194 | background: #272727;
195 | color: #fff;
196 | padding: 50px 0;
197 | `;
198 |
199 | const Button = styled.button`
200 | border-radius: 10px;
201 | background: teal;
202 | color: #fff;
203 | padding: 16px 10px;
204 | margin: 20px auto;
205 | cursor: pointer;
206 | :hover {
207 | background: darkblue;
208 | }
209 | :active {
210 | background: darkseagreen;
211 | }
212 | `;
213 |
214 | const GalleryLightboxExample = styled.div`
215 | height: 100%;
216 | width: 100%;
217 | `;
218 |
219 | const InlineLightboxExampleContainer = styled.div`
220 | height: 100%;
221 | width: 100%;
222 | display: flex;
223 | flex-direction: column;
224 | `;
225 | const InlineLightboxExample = styled.div`
226 | width: 100%;
227 | display: flex;
228 | justify-content: center;
229 | `;
230 |
231 | const OtherInlineContent = styled.div`
232 | width: 400px;
233 | display: flex;
234 | justify-content: center;
235 | align-items: center;
236 | padding: 10px;
237 | background: blueviolet;
238 | `;
239 |
240 | const StyledH2 = styled.h2`
241 | text-align: center;
242 | `;
243 |
--------------------------------------------------------------------------------
/src/components/ImageStage/components/ImagePager/index.tsx:
--------------------------------------------------------------------------------
1 | import { animated, useSprings } from '@react-spring/web';
2 | import { useGesture } from 'react-use-gesture';
3 | import Image from '../Image';
4 | import React, { useEffect, useRef, useState } from 'react';
5 | import styled, { AnyStyledComponent } from 'styled-components';
6 | import type { ImagesList } from '../../../../types/ImagesList';
7 |
8 | type IImagePager = {
9 | /** Index of image in images array that is currently shown */
10 | currentIndex: number;
11 | /** image stage height */
12 | imageStageHeight: number;
13 | /** image stage width */
14 | imageStageWidth: number;
15 | /** Array of image objects to be shown in Lightbox */
16 | images: ImagesList;
17 | /** Affects Width calculation method, depending on whether the Lightbox is Inline or not */
18 | inline: boolean;
19 | /** Function that closes the Lightbox */
20 | onClose?: () => void;
21 | /** Function that can be called to disable dragging in the pager */
22 | onNext: () => void;
23 | /** True if this image is currently shown in pager, otherwise false */
24 | onPrev: () => void;
25 | /** A React component that renders inside the image stage, useful for making overlays over the image */
26 | renderImageOverlay: () => React.ReactNode;
27 | /** Overrides the default behavior of double clicking causing an image zoom to a single click */
28 | singleClickToZoom: boolean;
29 | };
30 |
31 | /**
32 | * Gesture controlled surface that animates prev/next page changes via spring physics.
33 | */
34 | const ImagePager = ({
35 | currentIndex,
36 | images,
37 | imageStageHeight,
38 | imageStageWidth,
39 | inline,
40 | onClose,
41 | onNext,
42 | onPrev,
43 | renderImageOverlay,
44 | singleClickToZoom,
45 | }: IImagePager) => {
46 | const firstRender = useRef(true);
47 |
48 | const [disableDrag, setDisableDrag] = useState(false);
49 | const [pagerHeight, setPagerHeight] = useState<'100%' | number>('100%');
50 | const [isDragging, setIsDragging] = useState(false);
51 |
52 | //Determine the absolute height of the image pager
53 | useEffect(() => {
54 | const currPagerHeight = inline
55 | ? imageStageHeight
56 | : imageStageHeight - 50;
57 |
58 | if (currPagerHeight !== pagerHeight) {
59 | setPagerHeight(currPagerHeight);
60 | }
61 | }, [inline, pagerHeight, imageStageHeight]);
62 |
63 | // Generate page positions based on current index
64 | const getPagePositions = React.useCallback(
65 | (i: number, down = false, xDelta = 0) => {
66 | const x =
67 | (i - currentIndex) * imageStageWidth + (down ? xDelta : 0);
68 |
69 | if (i < currentIndex - 1 || i > currentIndex + 1) {
70 | return { display: 'none', x };
71 | }
72 | return { display: 'flex', x };
73 | },
74 | [currentIndex, imageStageWidth],
75 | );
76 |
77 | /**
78 | * Animates translateX of all images at the same time
79 | *
80 | * @see https://www.react-spring.io/docs/hooks/use-springs
81 | */
82 | const [pagerSprings, springsApi] = useSprings(images.length, (i) =>
83 | getPagePositions(i),
84 | );
85 |
86 | // Animate page change if currentIndex changes
87 | useEffect(() => {
88 | // No need to set page position for initial render
89 | if (firstRender.current) {
90 | firstRender.current = false;
91 | return;
92 | }
93 | // Update page positions after prev/next page state change
94 | springsApi.start((i) => getPagePositions(i));
95 | }, [currentIndex, getPagePositions, springsApi]);
96 |
97 | /**
98 | * Update each Image's visibility and translateX offset during dragging
99 | *
100 | * @see https://github.com/react-spring/react-use-gesture
101 | */
102 | const bind = useGesture(
103 | {
104 | onDrag: ({
105 | active,
106 | cancel,
107 | direction: [xDir],
108 | distance,
109 | down,
110 | movement: [xMovement],
111 | tap,
112 | touches,
113 | velocity,
114 | }) => {
115 | // Disable drag if Image has been zoomed in to allow for panning
116 | if (disableDrag || xMovement === 0 || tap) {
117 | return;
118 | }
119 | if (!isDragging) {
120 | setIsDragging(true);
121 | }
122 |
123 | const isHorizontalDrag = Math.abs(xDir) > 0.7;
124 | const draggedFarEnough =
125 | down &&
126 | isHorizontalDrag &&
127 | distance > imageStageWidth / 3.5;
128 | const draggedFastEnough =
129 | down && isHorizontalDrag && velocity > 2;
130 |
131 | // Handle next/prev image from valid drag
132 | if ((draggedFarEnough || draggedFastEnough) && active) {
133 | const goToIndex = xDir > 0 ? -1 : 1;
134 |
135 | // Cancel gesture event
136 | cancel();
137 |
138 | if (goToIndex > 0) {
139 | onNext();
140 | } else if (goToIndex < 0) {
141 | onPrev();
142 | }
143 |
144 | return;
145 | }
146 |
147 | // Don't move pager during two+ finger touch events, i.e. pinch-zoom
148 | if (touches > 1) {
149 | cancel();
150 | return;
151 | }
152 |
153 | // Update page x-coordinates for single finger/mouse gestures
154 | springsApi.start((i) => getPagePositions(i, down, xMovement));
155 | return;
156 | },
157 | onDragEnd: () => {
158 | if (isDragging) {
159 | springsApi.start((i) => getPagePositions(i));
160 | // Add small timeout buffer to prevent event handlers from firing in child Images
161 | setTimeout(() => setIsDragging(false), 100);
162 | }
163 | },
164 | onWheel: ({ ctrlKey, direction: [xDir, yDir], velocity }) => {
165 | // Disable drag if Image has been zoomed in to allow for panning
166 | if (ctrlKey || disableDrag || velocity === 0) {
167 | return;
168 | }
169 |
170 | if (!isDragging) {
171 | setIsDragging(true);
172 | }
173 |
174 | const draggedFastEnough = velocity > 1.1;
175 |
176 | // Handle next/prev image from valid drag
177 | if (draggedFastEnough) {
178 | const goToIndex = xDir + yDir > 0 ? -1 : 1;
179 |
180 | if (goToIndex > 0) {
181 | onNext();
182 | } else if (goToIndex < 0) {
183 | onPrev();
184 | }
185 | }
186 | },
187 | onWheelEnd: () => {
188 | springsApi.start((i) => getPagePositions(i));
189 | // Add small timeout buffer to prevent event handlers from firing in child Images
190 | setTimeout(() => setIsDragging(false), 100);
191 | },
192 | },
193 | {
194 | drag: {
195 | filterTaps: true,
196 | },
197 | wheel: {
198 | enabled: !inline,
199 | },
200 | },
201 | );
202 |
203 | return (
204 |
205 | {pagerSprings.map(({ display, x }, i) => (
206 | {
212 | if (onClose) {
213 | return (
214 | Math.abs(x.get()) < 1 &&
215 | !disableDrag &&
216 | onClose()
217 | );
218 | }
219 | }}
220 | role="presentation"
221 | style={{
222 | display,
223 | transform: x.to(
224 | (xInterp: number) => `translateX(${xInterp}px)`,
225 | ),
226 | }}
227 | >
228 |
229 |
230 | {
233 | e.stopPropagation();
234 | e.nativeEvent.stopImmediatePropagation();
235 | }}
236 | >
237 |
246 | {renderImageOverlay()}
247 |
248 |
249 |
250 |
251 | ))}
252 |
253 | );
254 | };
255 |
256 | ImagePager.displayName = 'ImagePager';
257 |
258 | export default ImagePager;
259 |
260 | const ImagePagerContainer = styled.div`
261 | height: 100%;
262 | width: 100%;
263 | `;
264 |
265 | const PagerInnerContentWrapper = styled.div`
266 | display: flex;
267 | justify-content: center;
268 | align-items: center;
269 | `;
270 |
271 | const PagerContentWrapper = styled.div`
272 | width: 100%;
273 | display: flex;
274 | justify-content: center;
275 | `;
276 |
277 | const AnimatedImagePager = styled(animated.span as AnyStyledComponent)<{
278 | $inline: boolean;
279 | }>`
280 | position: absolute;
281 | top: 0px;
282 | left: 0px;
283 | right: 0px;
284 | bottom: 0px;
285 | height: 100%;
286 | width: 100%;
287 | will-change: transform;
288 | touch-action: ${({ $inline }) => (!$inline ? 'none' : 'pan-y')};
289 | display: flex;
290 | flex-direction: column;
291 | justify-content: center;
292 | align-items: center;
293 | `;
294 |
295 | const ImageContainer = styled.div<{ $inline: boolean }>`
296 | position: relative;
297 | touch-action: ${({ $inline }) => (!$inline ? 'none' : 'pan-y')};
298 | user-select: none;
299 | display: flex;
300 | justify-content: center;
301 | width: 100%;
302 | `;
303 |
--------------------------------------------------------------------------------
/src/components/ImageStage/components/Image/index.tsx:
--------------------------------------------------------------------------------
1 | import { animated, to, useSpring } from '@react-spring/web';
2 | import {
3 | getTranslateOffsetsFromScale,
4 | imageIsOutOfBounds,
5 | useDoubleClick,
6 | } from '../../utils';
7 | import { useGesture } from 'react-use-gesture';
8 | import React, { useEffect, useRef, useState } from 'react';
9 | import styled, { AnyStyledComponent } from 'styled-components';
10 | import type { ImagesListItem } from '../../../../types/ImagesList';
11 |
12 | const defaultImageTransform = {
13 | pinching: false,
14 | scale: 1,
15 | translateX: 0,
16 | translateY: 0,
17 | };
18 |
19 | type IImageProps = {
20 | /** Any valid
props to pass to the lightbox img element ie src, alt, caption etc*/
21 | imgProps: ImagesListItem;
22 | /** Affects Width calculation method, depending on whether the Lightbox is Inline or not */
23 | inline: boolean;
24 | /** True if this image is currently shown in pager, otherwise false */
25 | isCurrentImage: boolean;
26 | /** Fixed height of the image stage, used to restrict maximum height of images */
27 | pagerHeight: '100%' | number;
28 | /** Indicates parent ImagePager is in a state of dragging, if true click to zoom is disabled */
29 | pagerIsDragging: boolean;
30 | /** Function that can be called to disable dragging in the pager */
31 | setDisableDrag: (disable: boolean) => void;
32 | /** Overrides the default behavior of double clicking causing an image zoom to a single click */
33 | singleClickToZoom: boolean;
34 | };
35 |
36 | /**
37 | * Animates pinch-zoom + panning on image using spring physics
38 | */
39 | const Image = ({
40 | imgProps: { style: imgStyleProp, ...restImgProps },
41 | inline,
42 | isCurrentImage,
43 | pagerHeight,
44 | pagerIsDragging,
45 | setDisableDrag,
46 | singleClickToZoom,
47 | }: IImageProps) => {
48 | const [isPanningImage, setIsPanningImage] = useState(false);
49 | const imageRef = useRef(null);
50 |
51 | /**
52 | * Animates scale and translate offsets of Image as they change in gestures
53 | *
54 | * @see https://www.react-spring.io/docs/hooks/use-spring
55 | */
56 | const [{ scale, translateX, translateY }, springApi] = useSpring(() => ({
57 | ...defaultImageTransform,
58 | onChange: (result, instance) => {
59 | if (result.value.scale < 1 || !result.value.pinching) {
60 | instance.start(defaultImageTransform);
61 | }
62 |
63 | if (result.value.scale > 1 && imageIsOutOfBounds(imageRef)) {
64 | instance.start(defaultImageTransform);
65 | }
66 | },
67 | // Enable dragging in ImagePager if image is at the default size
68 | onRest: (result, instance) => {
69 | if (result.value.scale === 1) {
70 | instance.start(defaultImageTransform);
71 | setDisableDrag(false);
72 | }
73 | },
74 | }));
75 |
76 | // Reset scale of this image when dragging to new image in ImagePager
77 | useEffect(() => {
78 | if (!isCurrentImage && scale.get() !== 1) {
79 | springApi.start(defaultImageTransform);
80 | }
81 | }, [isCurrentImage, scale, springApi]);
82 |
83 | /**
84 | * Update Image scale and translate offsets during pinch/pan gestures
85 | *
86 | * @see https://github.com/react-spring/react-use-gesture#usegesture-hook-supporting-multiple-gestures-at-once
87 | */
88 | useGesture(
89 | {
90 | onDrag: ({
91 | cancel,
92 | first,
93 | memo = { initialTranslateX: 0, initialTranslateY: 0 },
94 | movement: [xMovement, yMovement],
95 | pinching,
96 | tap,
97 | touches,
98 | }) => {
99 | if (pagerIsDragging || scale.get() === 1 || tap) {
100 | return;
101 | }
102 |
103 | // Disable click to zoom during drag
104 | if (xMovement && yMovement && !isPanningImage) {
105 | setIsPanningImage(true);
106 | }
107 |
108 | if (touches > 1) {
109 | return;
110 | }
111 | if (pinching || scale.get() <= 1) {
112 | return;
113 | }
114 |
115 | // Prevent dragging image out of viewport
116 | if (scale.get() > 1 && imageIsOutOfBounds(imageRef)) {
117 | cancel();
118 | return;
119 | } else {
120 | if (first) {
121 | return {
122 | initialTranslateX: translateX.get(),
123 | initialTranslateY: translateY.get(),
124 | };
125 | }
126 |
127 | // Translate image from dragging
128 | springApi.start({
129 | translateX: memo.initialTranslateX + xMovement,
130 | translateY: memo.initialTranslateY + yMovement,
131 | });
132 |
133 | return memo;
134 | }
135 | },
136 | onDragEnd: ({ memo }) => {
137 | if (memo !== undefined) {
138 | // Add small timeout to prevent onClick handler from firing after drag
139 | setTimeout(() => setIsPanningImage(false), 100);
140 | }
141 | },
142 | onPinch: ({
143 | cancel,
144 | ctrlKey,
145 | event,
146 | last,
147 | movement: [xMovement],
148 | origin: [touchOriginX, touchOriginY],
149 | }) => {
150 | if (pagerIsDragging) {
151 | return;
152 | }
153 |
154 | // Prevent ImagePager from registering isDragging
155 | setDisableDrag(true);
156 |
157 | // Disable click to zoom during pinch
158 | if (xMovement && !isPanningImage) {
159 | setIsPanningImage(true);
160 | }
161 |
162 | // Don't calculate new translate offsets on final frame
163 | if (last) {
164 | cancel();
165 | return;
166 | }
167 |
168 | // Speed up pinch zoom when using mouse versus touch
169 | const SCALE_FACTOR = ctrlKey ? 1000 : 250;
170 | const pinchScale = scale.get() + xMovement / SCALE_FACTOR;
171 | const pinchDelta = pinchScale - scale.get();
172 |
173 | /**
174 | * Calculate touch origin for pinch/zoom
175 | *
176 | * if event is a touch event (React.TouchEvent, TouchEvent or WebKitGestureEvent) use touchOriginX/Y
177 | * if event is a wheel event (React.WheelEvent or WheelEvent) use the mouse cursor's clientX/Y
178 | */
179 | let touchOrigin: [touchOriginX: number, touchOriginY: number] =
180 | [touchOriginX, touchOriginY];
181 | if ('clientX' in event && 'clientY' in event && ctrlKey) {
182 | touchOrigin = [event.clientX, event.clientY];
183 | }
184 |
185 | // Calculate the amount of x, y translate offset needed to
186 | // zoom-in to point as image scale grows
187 | const [newTranslateX, newTranslateY] =
188 | getTranslateOffsetsFromScale({
189 | currentTranslate: [translateX.get(), translateY.get()],
190 | imageRef,
191 | pinchDelta,
192 | scale: scale.get(),
193 | // Use the [x, y] coords of mouse if a trackpad or ctrl + wheel event
194 | // Otherwise use touch origin
195 | touchOrigin,
196 | });
197 |
198 | // Restrict the amount of zoom between half and 3x image size
199 | if (pinchScale < 0.5) {
200 | springApi.start({ pinching: true, scale: 0.5 });
201 | } else if (pinchScale > 3.0) {
202 | springApi.start({ pinching: true, scale: 3.0 });
203 | } else {
204 | springApi.start({
205 | pinching: true,
206 | scale: pinchScale,
207 | translateX: newTranslateX,
208 | translateY: newTranslateY,
209 | });
210 | }
211 | },
212 | onPinchEnd: () => {
213 | if (!pagerIsDragging) {
214 | if (scale.get() > 1) {
215 | setDisableDrag(true);
216 | } else {
217 | springApi.start(defaultImageTransform);
218 | }
219 | // Add small timeout to prevent onClick handler from firing after panning
220 | setTimeout(() => setIsPanningImage(false), 100);
221 | }
222 | },
223 | },
224 | /**
225 | * useGesture config
226 | * @see https://github.com/react-spring/react-use-gesture#usegesture-config
227 | */
228 | {
229 | domTarget: imageRef as React.RefObject,
230 | drag: {
231 | filterTaps: true,
232 | },
233 | enabled: !inline,
234 | eventOptions: {
235 | passive: false,
236 | },
237 | },
238 | );
239 |
240 | // Handle click/tap on image
241 | useDoubleClick({
242 | [singleClickToZoom ? 'onSingleClick' : 'onDoubleClick']: (
243 | e: MouseEvent,
244 | ) => {
245 | if (pagerIsDragging || isPanningImage) {
246 | e.stopPropagation();
247 | return;
248 | }
249 |
250 | // If tapped while already zoomed-in, zoom out to default scale
251 | if (scale.get() !== 1) {
252 | springApi.start(defaultImageTransform);
253 | return;
254 | }
255 |
256 | // Zoom-in to origin of click on image
257 | const { clientX: touchOriginX, clientY: touchOriginY } = e;
258 | const pinchScale = scale.get() + 1;
259 | const pinchDelta = pinchScale - scale.get();
260 |
261 | // Calculate the amount of x, y translate offset needed to
262 | // zoom-in to point as image scale grows
263 | const [newTranslateX, newTranslateY] = getTranslateOffsetsFromScale(
264 | {
265 | currentTranslate: [translateX.get(), translateY.get()],
266 | imageRef,
267 | pinchDelta,
268 | scale: scale.get(),
269 | touchOrigin: [touchOriginX, touchOriginY],
270 | },
271 | );
272 |
273 | // Disable dragging in pager
274 | setDisableDrag(true);
275 | springApi.start({
276 | pinching: true,
277 | scale: pinchScale,
278 | translateX: newTranslateX,
279 | translateY: newTranslateY,
280 | });
281 | },
282 | enabled: !inline,
283 | latency: singleClickToZoom ? 0 : 200,
284 | ref: imageRef,
285 | });
286 |
287 | return (
288 | ) => {
293 | // Don't close lighbox when clicking image
294 | e.stopPropagation();
295 | e.nativeEvent.stopImmediatePropagation();
296 | }}
297 | onDragStart={(e: React.DragEvent) => {
298 | // Disable image ghost dragging in firefox
299 | e.preventDefault();
300 | }}
301 | ref={imageRef}
302 | style={{
303 | ...imgStyleProp,
304 | maxHeight: pagerHeight,
305 | transform: to(
306 | [scale, translateX, translateY],
307 | (s, x, y) => `translate(${x}px, ${y}px) scale(${s})`,
308 | ),
309 | ...(isCurrentImage && { willChange: 'transform' }),
310 | }}
311 | // Include any valid img html attributes provided in the images prop
312 | {...(restImgProps as React.ComponentProps)}
313 | />
314 | );
315 | };
316 |
317 | Image.displayName = 'Image';
318 |
319 | export default Image;
320 |
321 | const AnimatedImage = styled(animated.img as AnyStyledComponent)`
322 | width: auto;
323 | height: auto;
324 | max-width: 100%;
325 | user-select: none;
326 | touch-action: ${({ $inline }) => (!$inline ? 'none' : 'pan-y')};
327 | ::selection {
328 | background: none;
329 | }
330 | `;
331 |
--------------------------------------------------------------------------------
/example/yarn.lock:
--------------------------------------------------------------------------------
1 | # THIS IS AN AUTOGENERATED FILE. DO NOT EDIT THIS FILE DIRECTLY.
2 | # yarn lockfile v1
3 |
4 |
5 | "@babel/code-frame@^7.22.13":
6 | version "7.22.13"
7 | resolved "https://registry.yarnpkg.com/@babel/code-frame/-/code-frame-7.22.13.tgz#e3c1c099402598483b7a8c46a721d1038803755e"
8 | integrity sha512-XktuhWlJ5g+3TJXc5upd9Ks1HutSArik6jf2eAjYFyIOf4ej3RN+184cZbzDvbPnuTJIUhPKKJE3cIsYTiAT3w==
9 | dependencies:
10 | "@babel/highlight" "^7.22.13"
11 | chalk "^2.4.2"
12 |
13 | "@babel/generator@^7.23.0":
14 | version "7.23.0"
15 | resolved "https://registry.yarnpkg.com/@babel/generator/-/generator-7.23.0.tgz#df5c386e2218be505b34837acbcb874d7a983420"
16 | integrity sha512-lN85QRR+5IbYrMWM6Y4pE/noaQtg4pNiqeNGX60eqOfo6gtEj6uw/JagelB8vVztSd7R6M5n1+PQkDbHbBRU4g==
17 | dependencies:
18 | "@babel/types" "^7.23.0"
19 | "@jridgewell/gen-mapping" "^0.3.2"
20 | "@jridgewell/trace-mapping" "^0.3.17"
21 | jsesc "^2.5.1"
22 |
23 | "@babel/helper-annotate-as-pure@^7.22.5":
24 | version "7.22.5"
25 | resolved "https://registry.yarnpkg.com/@babel/helper-annotate-as-pure/-/helper-annotate-as-pure-7.22.5.tgz#e7f06737b197d580a01edf75d97e2c8be99d3882"
26 | integrity sha512-LvBTxu8bQSQkcyKOU+a1btnNFQ1dMAd0R6PyW3arXes06F6QLWLIrd681bxRPIXlrMGR3XYnW9JyML7dP3qgxg==
27 | dependencies:
28 | "@babel/types" "^7.22.5"
29 |
30 | "@babel/helper-environment-visitor@^7.22.20":
31 | version "7.22.20"
32 | resolved "https://registry.yarnpkg.com/@babel/helper-environment-visitor/-/helper-environment-visitor-7.22.20.tgz#96159db61d34a29dba454c959f5ae4a649ba9167"
33 | integrity sha512-zfedSIzFhat/gFhWfHtgWvlec0nqB9YEIVrpuwjruLlXfUSnA8cJB0miHKwqDnQ7d32aKo2xt88/xZptwxbfhA==
34 |
35 | "@babel/helper-function-name@^7.23.0":
36 | version "7.23.0"
37 | resolved "https://registry.yarnpkg.com/@babel/helper-function-name/-/helper-function-name-7.23.0.tgz#1f9a3cdbd5b2698a670c30d2735f9af95ed52759"
38 | integrity sha512-OErEqsrxjZTJciZ4Oo+eoZqeW9UIiOcuYKRJA4ZAgV9myA+pOXhhmpfNCKjEH/auVfEYVFJ6y1Tc4r0eIApqiw==
39 | dependencies:
40 | "@babel/template" "^7.22.15"
41 | "@babel/types" "^7.23.0"
42 |
43 | "@babel/helper-hoist-variables@^7.22.5":
44 | version "7.22.5"
45 | resolved "https://registry.yarnpkg.com/@babel/helper-hoist-variables/-/helper-hoist-variables-7.22.5.tgz#c01a007dac05c085914e8fb652b339db50d823bb"
46 | integrity sha512-wGjk9QZVzvknA6yKIUURb8zY3grXCcOZt+/7Wcy8O2uctxhplmUPkOdlgoNhmdVee2c92JXbf1xpMtVNbfoxRw==
47 | dependencies:
48 | "@babel/types" "^7.22.5"
49 |
50 | "@babel/helper-module-imports@^7.0.0", "@babel/helper-module-imports@^7.22.5":
51 | version "7.22.15"
52 | resolved "https://registry.yarnpkg.com/@babel/helper-module-imports/-/helper-module-imports-7.22.15.tgz#16146307acdc40cc00c3b2c647713076464bdbf0"
53 | integrity sha512-0pYVBnDKZO2fnSPCrgM/6WMc7eS20Fbok+0r88fp+YtWVLZrp4CkafFGIp+W0VKw4a22sgebPT99y+FDNMdP4w==
54 | dependencies:
55 | "@babel/types" "^7.22.15"
56 |
57 | "@babel/helper-plugin-utils@^7.22.5":
58 | version "7.22.5"
59 | resolved "https://registry.yarnpkg.com/@babel/helper-plugin-utils/-/helper-plugin-utils-7.22.5.tgz#dd7ee3735e8a313b9f7b05a773d892e88e6d7295"
60 | integrity sha512-uLls06UVKgFG9QD4OeFYLEGteMIAa5kpTPcFL28yuCIIzsf6ZyKZMllKVOCZFhiZ5ptnwX4mtKdWCBE/uT4amg==
61 |
62 | "@babel/helper-split-export-declaration@^7.22.6":
63 | version "7.22.6"
64 | resolved "https://registry.yarnpkg.com/@babel/helper-split-export-declaration/-/helper-split-export-declaration-7.22.6.tgz#322c61b7310c0997fe4c323955667f18fcefb91c"
65 | integrity sha512-AsUnxuLhRYsisFiaJwvp1QF+I3KjD5FOxut14q/GzovUe6orHLesW2C7d754kRm53h5gqrz6sFl6sxc4BVtE/g==
66 | dependencies:
67 | "@babel/types" "^7.22.5"
68 |
69 | "@babel/helper-string-parser@^7.22.5":
70 | version "7.22.5"
71 | resolved "https://registry.yarnpkg.com/@babel/helper-string-parser/-/helper-string-parser-7.22.5.tgz#533f36457a25814cf1df6488523ad547d784a99f"
72 | integrity sha512-mM4COjgZox8U+JcXQwPijIZLElkgEpO5rsERVDJTc2qfCDfERyob6k5WegS14SX18IIjv+XD+GrqNumY5JRCDw==
73 |
74 | "@babel/helper-validator-identifier@^7.22.20":
75 | version "7.22.20"
76 | resolved "https://registry.yarnpkg.com/@babel/helper-validator-identifier/-/helper-validator-identifier-7.22.20.tgz#c4ae002c61d2879e724581d96665583dbc1dc0e0"
77 | integrity sha512-Y4OZ+ytlatR8AI+8KZfKuL5urKp7qey08ha31L8b3BwewJAoJamTzyvxPR/5D+KkdJCGPq/+8TukHBlY10FX9A==
78 |
79 | "@babel/highlight@^7.22.13":
80 | version "7.22.20"
81 | resolved "https://registry.yarnpkg.com/@babel/highlight/-/highlight-7.22.20.tgz#4ca92b71d80554b01427815e06f2df965b9c1f54"
82 | integrity sha512-dkdMCN3py0+ksCgYmGG8jKeGA/8Tk+gJwSYYlFGxG5lmhfKNoAy004YpLxpS1W2J8m/EK2Ew+yOs9pVRwO89mg==
83 | dependencies:
84 | "@babel/helper-validator-identifier" "^7.22.20"
85 | chalk "^2.4.2"
86 | js-tokens "^4.0.0"
87 |
88 | "@babel/parser@^7.22.15", "@babel/parser@^7.23.0":
89 | version "7.23.0"
90 | resolved "https://registry.yarnpkg.com/@babel/parser/-/parser-7.23.0.tgz#da950e622420bf96ca0d0f2909cdddac3acd8719"
91 | integrity sha512-vvPKKdMemU85V9WE/l5wZEmImpCtLqbnTvqDS2U1fJ96KrxoW7KrXhNsNCblQlg8Ck4b85yxdTyelsMUgFUXiw==
92 |
93 | "@babel/plugin-syntax-jsx@^7.22.5":
94 | version "7.22.5"
95 | resolved "https://registry.yarnpkg.com/@babel/plugin-syntax-jsx/-/plugin-syntax-jsx-7.22.5.tgz#a6b68e84fb76e759fc3b93e901876ffabbe1d918"
96 | integrity sha512-gvyP4hZrgrs/wWMaocvxZ44Hw0b3W8Pe+cMxc8V1ULQ07oh8VNbIRaoD1LRZVTvD+0nieDKjfgKg89sD7rrKrg==
97 | dependencies:
98 | "@babel/helper-plugin-utils" "^7.22.5"
99 |
100 | "@babel/runtime@^7.23.1":
101 | version "7.23.1"
102 | resolved "https://registry.yarnpkg.com/@babel/runtime/-/runtime-7.23.1.tgz#72741dc4d413338a91dcb044a86f3c0bc402646d"
103 | integrity sha512-hC2v6p8ZSI/W0HUzh3V8C5g+NwSKzKPtJwSpTjwl0o297GP9+ZLQSkdvHz46CM3LqyoXxq+5G9komY+eSqSO0g==
104 | dependencies:
105 | regenerator-runtime "^0.14.0"
106 |
107 | "@babel/template@^7.22.15":
108 | version "7.22.15"
109 | resolved "https://registry.yarnpkg.com/@babel/template/-/template-7.22.15.tgz#09576efc3830f0430f4548ef971dde1350ef2f38"
110 | integrity sha512-QPErUVm4uyJa60rkI73qneDacvdvzxshT3kksGqlGWYdOTIUOwJ7RDUL8sGqslY1uXWSL6xMFKEXDS3ox2uF0w==
111 | dependencies:
112 | "@babel/code-frame" "^7.22.13"
113 | "@babel/parser" "^7.22.15"
114 | "@babel/types" "^7.22.15"
115 |
116 | "@babel/traverse@^7.4.5":
117 | version "7.23.0"
118 | resolved "https://registry.yarnpkg.com/@babel/traverse/-/traverse-7.23.0.tgz#18196ddfbcf4ccea324b7f6d3ada00d8c5a99c53"
119 | integrity sha512-t/QaEvyIoIkwzpiZ7aoSKK8kObQYeF7T2v+dazAYCb8SXtp58zEVkWW7zAnju8FNKNdr4ScAOEDmMItbyOmEYw==
120 | dependencies:
121 | "@babel/code-frame" "^7.22.13"
122 | "@babel/generator" "^7.23.0"
123 | "@babel/helper-environment-visitor" "^7.22.20"
124 | "@babel/helper-function-name" "^7.23.0"
125 | "@babel/helper-hoist-variables" "^7.22.5"
126 | "@babel/helper-split-export-declaration" "^7.22.6"
127 | "@babel/parser" "^7.23.0"
128 | "@babel/types" "^7.23.0"
129 | debug "^4.1.0"
130 | globals "^11.1.0"
131 |
132 | "@babel/types@^7.22.15", "@babel/types@^7.22.5", "@babel/types@^7.23.0":
133 | version "7.23.0"
134 | resolved "https://registry.yarnpkg.com/@babel/types/-/types-7.23.0.tgz#8c1f020c9df0e737e4e247c0619f58c68458aaeb"
135 | integrity sha512-0oIyUfKoI3mSqMvsxBdclDwxXKXAUA8v/apZbc+iSyARYou1o8ZGDxbUYyLFoW2arqS2jDGqJuZvv1d/io1axg==
136 | dependencies:
137 | "@babel/helper-string-parser" "^7.22.5"
138 | "@babel/helper-validator-identifier" "^7.22.20"
139 | to-fast-properties "^2.0.0"
140 |
141 | "@emotion/is-prop-valid@^1.1.0":
142 | version "1.2.1"
143 | resolved "https://registry.yarnpkg.com/@emotion/is-prop-valid/-/is-prop-valid-1.2.1.tgz#23116cf1ed18bfeac910ec6436561ecb1a3885cc"
144 | integrity sha512-61Mf7Ufx4aDxx1xlDeOm8aFFigGHE4z+0sKCa+IHCeZKiyP9RLD0Mmx7m8b9/Cf37f7NAvQOOJAbQQGVr5uERw==
145 | dependencies:
146 | "@emotion/memoize" "^0.8.1"
147 |
148 | "@emotion/memoize@^0.8.1":
149 | version "0.8.1"
150 | resolved "https://registry.yarnpkg.com/@emotion/memoize/-/memoize-0.8.1.tgz#c1ddb040429c6d21d38cc945fe75c818cfb68e17"
151 | integrity sha512-W2P2c/VRW1/1tLox0mVUalvnWXxavmv/Oum2aPsRcoDJuob75FC3Y8FbpfLwUegRcxINtGUMPq0tFCvYNTBXNA==
152 |
153 | "@emotion/stylis@^0.8.4":
154 | version "0.8.5"
155 | resolved "https://registry.yarnpkg.com/@emotion/stylis/-/stylis-0.8.5.tgz#deacb389bd6ee77d1e7fcaccce9e16c5c7e78e04"
156 | integrity sha512-h6KtPihKFn3T9fuIrwvXXUOwlx3rfUvfZIcP5a6rh8Y7zjE3O06hT5Ss4S/YI1AYhuZ1kjaE/5EaOOI2NqSylQ==
157 |
158 | "@emotion/unitless@^0.7.4":
159 | version "0.7.5"
160 | resolved "https://registry.yarnpkg.com/@emotion/unitless/-/unitless-0.7.5.tgz#77211291c1900a700b8a78cfafda3160d76949ed"
161 | integrity sha512-OWORNpfjMsSSUBVrRBVGECkhWcULOAJz9ZW8uK9qgxD+87M7jHRcvh/A96XXNhXTLmKcoYSQtBEX7lHMO7YRwg==
162 |
163 | "@jridgewell/gen-mapping@^0.3.2":
164 | version "0.3.3"
165 | resolved "https://registry.yarnpkg.com/@jridgewell/gen-mapping/-/gen-mapping-0.3.3.tgz#7e02e6eb5df901aaedb08514203b096614024098"
166 | integrity sha512-HLhSWOLRi875zjjMG/r+Nv0oCW8umGb0BgEhyX3dDX3egwZtB8PqLnjz3yedt8R5StBrzcg4aBpnh8UA9D1BoQ==
167 | dependencies:
168 | "@jridgewell/set-array" "^1.0.1"
169 | "@jridgewell/sourcemap-codec" "^1.4.10"
170 | "@jridgewell/trace-mapping" "^0.3.9"
171 |
172 | "@jridgewell/resolve-uri@^3.1.0":
173 | version "3.1.1"
174 | resolved "https://registry.yarnpkg.com/@jridgewell/resolve-uri/-/resolve-uri-3.1.1.tgz#c08679063f279615a3326583ba3a90d1d82cc721"
175 | integrity sha512-dSYZh7HhCDtCKm4QakX0xFpsRDqjjtZf/kjI/v3T3Nwt5r8/qz/M19F9ySyOqU94SXBmeG9ttTul+YnR4LOxFA==
176 |
177 | "@jridgewell/set-array@^1.0.1":
178 | version "1.1.2"
179 | resolved "https://registry.yarnpkg.com/@jridgewell/set-array/-/set-array-1.1.2.tgz#7c6cf998d6d20b914c0a55a91ae928ff25965e72"
180 | integrity sha512-xnkseuNADM0gt2bs+BvhO0p78Mk762YnZdsuzFV018NoG1Sj1SCQvpSqa7XUaTam5vAGasABV9qXASMKnFMwMw==
181 |
182 | "@jridgewell/sourcemap-codec@^1.4.10", "@jridgewell/sourcemap-codec@^1.4.14":
183 | version "1.4.15"
184 | resolved "https://registry.yarnpkg.com/@jridgewell/sourcemap-codec/-/sourcemap-codec-1.4.15.tgz#d7c6e6755c78567a951e04ab52ef0fd26de59f32"
185 | integrity sha512-eF2rxCRulEKXHTRiDrDy6erMYWqNw4LPdQ8UQA4huuxaQsVeRPFl2oM8oDGxMFhJUWZf9McpLtJasDDZb/Bpeg==
186 |
187 | "@jridgewell/trace-mapping@^0.3.17", "@jridgewell/trace-mapping@^0.3.9":
188 | version "0.3.19"
189 | resolved "https://registry.yarnpkg.com/@jridgewell/trace-mapping/-/trace-mapping-0.3.19.tgz#f8a3249862f91be48d3127c3cfe992f79b4b8811"
190 | integrity sha512-kf37QtfW+Hwx/buWGMPcR60iF9ziHa6r/CZJIHbmcm4+0qrXiVdxegAH0F6yddEVQ7zdkjcGCgCzUu+BcbhQxw==
191 | dependencies:
192 | "@jridgewell/resolve-uri" "^3.1.0"
193 | "@jridgewell/sourcemap-codec" "^1.4.14"
194 |
195 | "@next/env@13.5.4":
196 | version "13.5.4"
197 | resolved "https://registry.yarnpkg.com/@next/env/-/env-13.5.4.tgz#777c3af16de2cf2f611b6c8126910062d13d222c"
198 | integrity sha512-LGegJkMvRNw90WWphGJ3RMHMVplYcOfRWf2Be3td3sUa+1AaxmsYyANsA+znrGCBjXJNi4XAQlSoEfUxs/4kIQ==
199 |
200 | "@next/swc-darwin-arm64@13.5.4":
201 | version "13.5.4"
202 | resolved "https://registry.yarnpkg.com/@next/swc-darwin-arm64/-/swc-darwin-arm64-13.5.4.tgz#241957774fef3f876dc714cfc0ca6f00f561737e"
203 | integrity sha512-Df8SHuXgF1p+aonBMcDPEsaahNo2TCwuie7VXED4FVyECvdXfRT9unapm54NssV9tF3OQFKBFOdlje4T43VO0w==
204 |
205 | "@next/swc-darwin-x64@13.5.4":
206 | version "13.5.4"
207 | resolved "https://registry.yarnpkg.com/@next/swc-darwin-x64/-/swc-darwin-x64-13.5.4.tgz#fa11bb97bf06cd45cbd554354b46bf93e22c025b"
208 | integrity sha512-siPuUwO45PnNRMeZnSa8n/Lye5ZX93IJom9wQRB5DEOdFrw0JjOMu1GINB8jAEdwa7Vdyn1oJ2xGNaQpdQQ9Pw==
209 |
210 | "@next/swc-linux-arm64-gnu@13.5.4":
211 | version "13.5.4"
212 | resolved "https://registry.yarnpkg.com/@next/swc-linux-arm64-gnu/-/swc-linux-arm64-gnu-13.5.4.tgz#dd3a482cd6871ed23b049066a0f3c4c2f955dc88"
213 | integrity sha512-l/k/fvRP/zmB2jkFMfefmFkyZbDkYW0mRM/LB+tH5u9pB98WsHXC0WvDHlGCYp3CH/jlkJPL7gN8nkTQVrQ/2w==
214 |
215 | "@next/swc-linux-arm64-musl@13.5.4":
216 | version "13.5.4"
217 | resolved "https://registry.yarnpkg.com/@next/swc-linux-arm64-musl/-/swc-linux-arm64-musl-13.5.4.tgz#ed6d7abaf5712cff2752ce5300d6bacc6aff1b18"
218 | integrity sha512-YYGb7SlLkI+XqfQa8VPErljb7k9nUnhhRrVaOdfJNCaQnHBcvbT7cx/UjDQLdleJcfyg1Hkn5YSSIeVfjgmkTg==
219 |
220 | "@next/swc-linux-x64-gnu@13.5.4":
221 | version "13.5.4"
222 | resolved "https://registry.yarnpkg.com/@next/swc-linux-x64-gnu/-/swc-linux-x64-gnu-13.5.4.tgz#977a040388e8a685a3a85e0dbdff90a4ee2a7189"
223 | integrity sha512-uE61vyUSClnCH18YHjA8tE1prr/PBFlBFhxBZis4XBRJoR+txAky5d7gGNUIbQ8sZZ7LVkSVgm/5Fc7mwXmRAg==
224 |
225 | "@next/swc-linux-x64-musl@13.5.4":
226 | version "13.5.4"
227 | resolved "https://registry.yarnpkg.com/@next/swc-linux-x64-musl/-/swc-linux-x64-musl-13.5.4.tgz#3e29a0ad8efc016196c3a120da04397eea328b2a"
228 | integrity sha512-qVEKFYML/GvJSy9CfYqAdUexA6M5AklYcQCW+8JECmkQHGoPxCf04iMh7CPR7wkHyWWK+XLt4Ja7hhsPJtSnhg==
229 |
230 | "@next/swc-win32-arm64-msvc@13.5.4":
231 | version "13.5.4"
232 | resolved "https://registry.yarnpkg.com/@next/swc-win32-arm64-msvc/-/swc-win32-arm64-msvc-13.5.4.tgz#18a236c3fe5a48d24b56d939e6a05488bb682b7e"
233 | integrity sha512-mDSQfqxAlfpeZOLPxLymZkX0hYF3juN57W6vFHTvwKlnHfmh12Pt7hPIRLYIShk8uYRsKPtMTth/EzpwRI+u8w==
234 |
235 | "@next/swc-win32-ia32-msvc@13.5.4":
236 | version "13.5.4"
237 | resolved "https://registry.yarnpkg.com/@next/swc-win32-ia32-msvc/-/swc-win32-ia32-msvc-13.5.4.tgz#255132243ab6fb20d3c7c92a585e2c4fa50368fe"
238 | integrity sha512-aoqAT2XIekIWoriwzOmGFAvTtVY5O7JjV21giozBTP5c6uZhpvTWRbmHXbmsjZqY4HnEZQRXWkSAppsIBweKqw==
239 |
240 | "@next/swc-win32-x64-msvc@13.5.4":
241 | version "13.5.4"
242 | resolved "https://registry.yarnpkg.com/@next/swc-win32-x64-msvc/-/swc-win32-x64-msvc-13.5.4.tgz#cc542907b55247c5634d9a8298e1c143a1847e25"
243 | integrity sha512-cyRvlAxwlddlqeB9xtPSfNSCRy8BOa4wtMo0IuI9P7Y0XT2qpDrpFKRyZ7kUngZis59mPVla5k8X1oOJ8RxDYg==
244 |
245 | "@react-spring/animated@~9.7.3":
246 | version "9.7.3"
247 | resolved "https://registry.yarnpkg.com/@react-spring/animated/-/animated-9.7.3.tgz#4211b1a6d48da0ff474a125e93c0f460ff816e0f"
248 | integrity sha512-5CWeNJt9pNgyvuSzQH+uy2pvTg8Y4/OisoscZIR8/ZNLIOI+CatFBhGZpDGTF/OzdNFsAoGk3wiUYTwoJ0YIvw==
249 | dependencies:
250 | "@react-spring/shared" "~9.7.3"
251 | "@react-spring/types" "~9.7.3"
252 |
253 | "@react-spring/core@~9.7.3":
254 | version "9.7.3"
255 | resolved "https://registry.yarnpkg.com/@react-spring/core/-/core-9.7.3.tgz#60056bcb397f2c4f371c6c9a5f882db77ae90095"
256 | integrity sha512-IqFdPVf3ZOC1Cx7+M0cXf4odNLxDC+n7IN3MDcVCTIOSBfqEcBebSv+vlY5AhM0zw05PDbjKrNmBpzv/AqpjnQ==
257 | dependencies:
258 | "@react-spring/animated" "~9.7.3"
259 | "@react-spring/shared" "~9.7.3"
260 | "@react-spring/types" "~9.7.3"
261 |
262 | "@react-spring/shared@~9.7.3":
263 | version "9.7.3"
264 | resolved "https://registry.yarnpkg.com/@react-spring/shared/-/shared-9.7.3.tgz#4cf29797847c689912aec4e62e34c99a4d5d9e53"
265 | integrity sha512-NEopD+9S5xYyQ0pGtioacLhL2luflh6HACSSDUZOwLHoxA5eku1UPuqcJqjwSD6luKjjLfiLOspxo43FUHKKSA==
266 | dependencies:
267 | "@react-spring/types" "~9.7.3"
268 |
269 | "@react-spring/types@~9.7.3":
270 | version "9.7.3"
271 | resolved "https://registry.yarnpkg.com/@react-spring/types/-/types-9.7.3.tgz#ea78fd447cbc2612c1f5d55852e3c331e8172a0b"
272 | integrity sha512-Kpx/fQ/ZFX31OtlqVEFfgaD1ACzul4NksrvIgYfIFq9JpDHFwQkMVZ10tbo0FU/grje4rcL4EIrjekl3kYwgWw==
273 |
274 | "@react-spring/web@^9.7.3":
275 | version "0.0.0"
276 | uid ""
277 |
278 | "@react-spring/web@link:../node_modules/@react-spring/web":
279 | version "0.0.0"
280 | uid ""
281 |
282 | "@swc/helpers@0.5.2":
283 | version "0.5.2"
284 | resolved "https://registry.yarnpkg.com/@swc/helpers/-/helpers-0.5.2.tgz#85ea0c76450b61ad7d10a37050289eded783c27d"
285 | integrity sha512-E4KcWTpoLHqwPHLxidpOqQbcrZVgi0rsmmZXUle1jXmJfuIf/UWpczUJ7MZZ5tlxytgJXyp0w4PGkkeLiuIdZw==
286 | dependencies:
287 | tslib "^2.4.0"
288 |
289 | ansi-styles@^3.2.1:
290 | version "3.2.1"
291 | resolved "https://registry.yarnpkg.com/ansi-styles/-/ansi-styles-3.2.1.tgz#41fbb20243e50b12be0f04b8dedbf07520ce841d"
292 | integrity sha512-VT0ZI6kZRdTh8YyJw3SMbYm/u+NqfsAxEpWO0Pf9sq8/e94WxxOpPKx9FR1FlyCtOVDNOQ+8ntlqFxiRc+r5qA==
293 | dependencies:
294 | color-convert "^1.9.0"
295 |
296 | "babel-plugin-styled-components@>= 1.12.0":
297 | version "2.1.4"
298 | resolved "https://registry.yarnpkg.com/babel-plugin-styled-components/-/babel-plugin-styled-components-2.1.4.tgz#9a1f37c7f32ef927b4b008b529feb4a2c82b1092"
299 | integrity sha512-Xgp9g+A/cG47sUyRwwYxGM4bR/jDRg5N6it/8+HxCnbT5XNKSKDT9xm4oag/osgqjC2It/vH0yXsomOG6k558g==
300 | dependencies:
301 | "@babel/helper-annotate-as-pure" "^7.22.5"
302 | "@babel/helper-module-imports" "^7.22.5"
303 | "@babel/plugin-syntax-jsx" "^7.22.5"
304 | lodash "^4.17.21"
305 | picomatch "^2.3.1"
306 |
307 | busboy@1.6.0:
308 | version "1.6.0"
309 | resolved "https://registry.yarnpkg.com/busboy/-/busboy-1.6.0.tgz#966ea36a9502e43cdb9146962523b92f531f6893"
310 | integrity sha512-8SFQbg/0hQ9xy3UNTB0YEnsNBbWfhf7RtnzpL7TkBiTBRfrQ9Fxcnz7VJsleJpyp6rVLvXiuORqjlHi5q+PYuA==
311 | dependencies:
312 | streamsearch "^1.1.0"
313 |
314 | camelize@^1.0.0:
315 | version "1.0.1"
316 | resolved "https://registry.yarnpkg.com/camelize/-/camelize-1.0.1.tgz#89b7e16884056331a35d6b5ad064332c91daa6c3"
317 | integrity sha512-dU+Tx2fsypxTgtLoE36npi3UqcjSSMNYfkqgmoEhtZrraP5VWq0K7FkWVTYa8eMPtnU/G2txVsfdCJTn9uzpuQ==
318 |
319 | caniuse-lite@^1.0.30001406:
320 | version "1.0.30001540"
321 | resolved "https://registry.yarnpkg.com/caniuse-lite/-/caniuse-lite-1.0.30001540.tgz#a316ca4f2ae673ab02ff0ec533334016d56ff658"
322 | integrity sha512-9JL38jscuTJBTcuETxm8QLsFr/F6v0CYYTEU6r5+qSM98P2Q0Hmu0eG1dTG5GBUmywU3UlcVOUSIJYY47rdFSw==
323 |
324 | chalk@^2.4.2:
325 | version "2.4.2"
326 | resolved "https://registry.yarnpkg.com/chalk/-/chalk-2.4.2.tgz#cd42541677a54333cf541a49108c1432b44c9424"
327 | integrity sha512-Mti+f9lpJNcwF4tWV8/OrTTtF1gZi+f8FqlyAdouralcFWFQWF2+NgCHShjkCb+IFBLq9buZwE1xckQU4peSuQ==
328 | dependencies:
329 | ansi-styles "^3.2.1"
330 | escape-string-regexp "^1.0.5"
331 | supports-color "^5.3.0"
332 |
333 | client-only@0.0.1:
334 | version "0.0.1"
335 | resolved "https://registry.yarnpkg.com/client-only/-/client-only-0.0.1.tgz#38bba5d403c41ab150bff64a95c85013cf73bca1"
336 | integrity sha512-IV3Ou0jSMzZrd3pZ48nLkT9DA7Ag1pnPzaiQhpW7c3RbcqqzvzzVu+L8gfqMp/8IM2MQtSiqaCxrrcfu8I8rMA==
337 |
338 | color-convert@^1.9.0:
339 | version "1.9.3"
340 | resolved "https://registry.yarnpkg.com/color-convert/-/color-convert-1.9.3.tgz#bb71850690e1f136567de629d2d5471deda4c1e8"
341 | integrity sha512-QfAUtd+vFdAtFQcC8CCyYt1fYWxSqAiK2cSD6zDB8N3cpsEBAvRxp9zOGg6G/SHHJYAT88/az/IuDGALsNVbGg==
342 | dependencies:
343 | color-name "1.1.3"
344 |
345 | color-convert@^2.0.1:
346 | version "2.0.1"
347 | resolved "https://registry.yarnpkg.com/color-convert/-/color-convert-2.0.1.tgz#72d3a68d598c9bdb3af2ad1e84f21d896abd4de3"
348 | integrity sha512-RRECPsj7iu/xb5oKYcsFHSppFNnsj/52OVTRKb4zP5onXwVF3zVmmToNcOfGC+CRDpfK/U584fMg38ZHCaElKQ==
349 | dependencies:
350 | color-name "~1.1.4"
351 |
352 | color-name@1.1.3:
353 | version "1.1.3"
354 | resolved "https://registry.yarnpkg.com/color-name/-/color-name-1.1.3.tgz#a7d0558bd89c42f795dd42328f740831ca53bc25"
355 | integrity sha512-72fSenhMw2HZMTVHeCA9KCmpEIbzWiQsjN+BHcBbS9vr1mtt+vJjPdksIBNUmKAW8TFUDPJK5SUU3QhE9NEXDw==
356 |
357 | color-name@^1.0.0, color-name@~1.1.4:
358 | version "1.1.4"
359 | resolved "https://registry.yarnpkg.com/color-name/-/color-name-1.1.4.tgz#c2a09a87acbde69543de6f63fa3995c826c536a2"
360 | integrity sha512-dOy+3AuW3a2wNbZHIuMZpTcgjGuLU/uBL/ubcZF9OXbDo8ff4O8yVp5Bf0efS8uEoYo5q4Fx7dY9OgQGXgAsQA==
361 |
362 | color-string@^1.9.0:
363 | version "1.9.1"
364 | resolved "https://registry.yarnpkg.com/color-string/-/color-string-1.9.1.tgz#4467f9146f036f855b764dfb5bf8582bf342c7a4"
365 | integrity sha512-shrVawQFojnZv6xM40anx4CkoDP+fZsw/ZerEMsW/pyzsRbElpsL/DBVW7q3ExxwusdNXI3lXpuhEZkzs8p5Eg==
366 | dependencies:
367 | color-name "^1.0.0"
368 | simple-swizzle "^0.2.2"
369 |
370 | color@^4.2.3:
371 | version "4.2.3"
372 | resolved "https://registry.yarnpkg.com/color/-/color-4.2.3.tgz#d781ecb5e57224ee43ea9627560107c0e0c6463a"
373 | integrity sha512-1rXeuUUiGGrykh+CeBdu5Ie7OJwinCgQY0bc7GCRxy5xVHy+moaqkpL/jqQq0MtQOeYcrqEz4abc5f0KtU7W4A==
374 | dependencies:
375 | color-convert "^2.0.1"
376 | color-string "^1.9.0"
377 |
378 | css-color-keywords@^1.0.0:
379 | version "1.0.0"
380 | resolved "https://registry.yarnpkg.com/css-color-keywords/-/css-color-keywords-1.0.0.tgz#fea2616dc676b2962686b3af8dbdbe180b244e05"
381 | integrity sha512-FyyrDHZKEjXDpNJYvVsV960FiqQyXc/LlYmsxl2BcdMb2WPx0OGRVgTg55rPSyLSNMqP52R9r8geSp7apN3Ofg==
382 |
383 | css-to-react-native@^3.0.0:
384 | version "3.2.0"
385 | resolved "https://registry.yarnpkg.com/css-to-react-native/-/css-to-react-native-3.2.0.tgz#cdd8099f71024e149e4f6fe17a7d46ecd55f1e32"
386 | integrity sha512-e8RKaLXMOFii+02mOlqwjbD00KSEKqblnpO9e++1aXS1fPQOpS1YoqdVHBqPjHNoxeF2mimzVqawm2KCbEdtHQ==
387 | dependencies:
388 | camelize "^1.0.0"
389 | css-color-keywords "^1.0.0"
390 | postcss-value-parser "^4.0.2"
391 |
392 | debug@^4.1.0:
393 | version "4.3.4"
394 | resolved "https://registry.yarnpkg.com/debug/-/debug-4.3.4.tgz#1319f6579357f2338d3337d2cdd4914bb5dcc865"
395 | integrity sha512-PRWFHuSU3eDtQJPvnNY7Jcket1j0t5OuOsFzPPzsekD52Zl8qUfFIPEiswXqIvHWGVHOgX+7G/vCNNhehwxfkQ==
396 | dependencies:
397 | ms "2.1.2"
398 |
399 | escape-string-regexp@^1.0.5:
400 | version "1.0.5"
401 | resolved "https://registry.yarnpkg.com/escape-string-regexp/-/escape-string-regexp-1.0.5.tgz#1b61c0562190a8dff6ae3bb2cf0200ca130b86d4"
402 | integrity sha512-vbRorB5FUQWvla16U8R/qgaFIya2qGzwDrNmCZuYKrbdSUMG6I1ZCGQRefkRVhuOkIGVne7BQ35DSfo1qvJqFg==
403 |
404 | glob-to-regexp@^0.4.1:
405 | version "0.4.1"
406 | resolved "https://registry.yarnpkg.com/glob-to-regexp/-/glob-to-regexp-0.4.1.tgz#c75297087c851b9a578bd217dd59a92f59fe546e"
407 | integrity sha512-lkX1HJXwyMcprw/5YUZc2s7DrpAiHB21/V+E1rHUrVNokkvB6bqMzT0VfV6/86ZNabt1k14YOIaT7nDvOX3Iiw==
408 |
409 | globals@^11.1.0:
410 | version "11.12.0"
411 | resolved "https://registry.yarnpkg.com/globals/-/globals-11.12.0.tgz#ab8795338868a0babd8525758018c2a7eb95c42e"
412 | integrity sha512-WOBp/EEGUiIsJSp7wcv/y6MO+lV9UoncWqxuFfm8eBwzWNgyfBd6Gz+IeKQ9jCmyhoH99g15M3T+QaVHFjizVA==
413 |
414 | graceful-fs@^4.1.2:
415 | version "4.2.11"
416 | resolved "https://registry.yarnpkg.com/graceful-fs/-/graceful-fs-4.2.11.tgz#4183e4e8bf08bb6e05bbb2f7d2e0c8f712ca40e3"
417 | integrity sha512-RbJ5/jmFcNNCcDV5o9eTnBLJ/HszWV0P73bc+Ff4nS/rJj+YaS6IGyiOL0VoBYX+l1Wrl3k63h/KrH+nhJ0XvQ==
418 |
419 | has-flag@^3.0.0:
420 | version "3.0.0"
421 | resolved "https://registry.yarnpkg.com/has-flag/-/has-flag-3.0.0.tgz#b5d454dc2199ae225699f3467e5a07f3b955bafd"
422 | integrity sha512-sKJf1+ceQBr4SMkvQnBDNDtf4TXpVhVGateu0t918bl30FnbE2m4vNLX+VWe/dpjlb+HugGYzW7uQXH98HPEYw==
423 |
424 | hoist-non-react-statics@^3.0.0:
425 | version "3.3.2"
426 | resolved "https://registry.yarnpkg.com/hoist-non-react-statics/-/hoist-non-react-statics-3.3.2.tgz#ece0acaf71d62c2969c2ec59feff42a4b1a85b45"
427 | integrity sha512-/gGivxi8JPKWNm/W0jSmzcMPpfpPLc3dY/6GxhX2hQ9iGj3aDfklV4ET7NjKpSinLpJ5vafa9iiGIEZg10SfBw==
428 | dependencies:
429 | react-is "^16.7.0"
430 |
431 | is-arrayish@^0.3.1:
432 | version "0.3.2"
433 | resolved "https://registry.yarnpkg.com/is-arrayish/-/is-arrayish-0.3.2.tgz#4574a2ae56f7ab206896fb431eaeed066fdf8f03"
434 | integrity sha512-eVRqCvVlZbuw3GrM63ovNSNAeA1K16kaR/LRY/92w0zxQ5/1YzwblUX652i4Xs9RwAGjW9d9y6X88t8OaAJfWQ==
435 |
436 | "js-tokens@^3.0.0 || ^4.0.0", js-tokens@^4.0.0:
437 | version "4.0.0"
438 | resolved "https://registry.yarnpkg.com/js-tokens/-/js-tokens-4.0.0.tgz#19203fb59991df98e3a287050d4647cdeaf32499"
439 | integrity sha512-RdJUflcE3cUzKiMqQgsCu06FPu9UdIJO0beYbPhHN4k6apgJtifcoCtT9bcxOpYBtpD2kCM6Sbzg4CausW/PKQ==
440 |
441 | jsesc@^2.5.1:
442 | version "2.5.2"
443 | resolved "https://registry.yarnpkg.com/jsesc/-/jsesc-2.5.2.tgz#80564d2e483dacf6e8ef209650a67df3f0c283a4"
444 | integrity sha512-OYu7XEzjkCQ3C5Ps3QIZsQfNpqoJyZZA99wd9aWd05NCtC5pWOkShK2mkL6HXQR6/Cy2lbNdPlZBpuQHXE63gA==
445 |
446 | lodash.clamp@^4.0.3:
447 | version "4.0.3"
448 | resolved "https://registry.yarnpkg.com/lodash.clamp/-/lodash.clamp-4.0.3.tgz#5c24bedeeeef0753560dc2b4cb4671f90a6ddfaa"
449 | integrity sha512-HvzRFWjtcguTW7yd8NJBshuNaCa8aqNFtnswdT7f/cMd/1YKy5Zzoq4W/Oxvnx9l7aeY258uSdDfM793+eLsVg==
450 |
451 | lodash.merge@^4.6.2:
452 | version "4.6.2"
453 | resolved "https://registry.yarnpkg.com/lodash.merge/-/lodash.merge-4.6.2.tgz#558aa53b43b661e1925a0afdfa36a9a1085fe57a"
454 | integrity sha512-0KpjqXRVvrYyCsX1swR/XTK0va6VQkQM6MNo7PqW77ByjAhoARA8EfrP1N4+KlKj8YS0ZUCtRT/YUuhyYDujIQ==
455 |
456 | lodash@^4.17.21:
457 | version "4.17.21"
458 | resolved "https://registry.yarnpkg.com/lodash/-/lodash-4.17.21.tgz#679591c564c3bffaae8454cf0b3df370c3d6911c"
459 | integrity sha512-v2kDEe57lecTulaDIuNTPy3Ry4gLGJ6Z1O3vE1krgXZNrsQ+LFTGHVxVjcXPs17LhbZVGedAJv8XZ1tvj5FvSg==
460 |
461 | loose-envify@^1.1.0, loose-envify@^1.4.0:
462 | version "1.4.0"
463 | resolved "https://registry.yarnpkg.com/loose-envify/-/loose-envify-1.4.0.tgz#71ee51fa7be4caec1a63839f7e682d8132d30caf"
464 | integrity sha512-lyuxPGr/Wfhrlem2CL/UcnUc1zcqKAImBDzukY7Y5F/yQiNdko6+fRLevlw1HgMySw7f611UIY408EtxRSoK3Q==
465 | dependencies:
466 | js-tokens "^3.0.0 || ^4.0.0"
467 |
468 | ms@2.1.2:
469 | version "2.1.2"
470 | resolved "https://registry.yarnpkg.com/ms/-/ms-2.1.2.tgz#d09d1f357b443f493382a8eb3ccd183872ae6009"
471 | integrity sha512-sGkPx+VjMtmA6MX27oA4FBFELFCZZ4S4XqeGOXCv68tT+jb3vk/RyaKWP0PTKyWtmLSM0b+adUTEvbs1PEaH2w==
472 |
473 | nanoid@^3.3.6:
474 | version "3.3.6"
475 | resolved "https://registry.yarnpkg.com/nanoid/-/nanoid-3.3.6.tgz#443380c856d6e9f9824267d960b4236ad583ea4c"
476 | integrity sha512-BGcqMMJuToF7i1rt+2PWSNVnWIkGCU78jBG3RxO/bZlnZPK2Cmi2QaffxGO/2RvWi9sL+FAiRiXMgsyxQ1DIDA==
477 |
478 | next@13.5.4:
479 | version "13.5.4"
480 | resolved "https://registry.yarnpkg.com/next/-/next-13.5.4.tgz#7e6a93c9c2b9a2c78bf6906a6c5cc73ae02d5b4d"
481 | integrity sha512-+93un5S779gho8y9ASQhb/bTkQF17FNQOtXLKAj3lsNgltEcF0C5PMLLncDmH+8X1EnJH1kbqAERa29nRXqhjA==
482 | dependencies:
483 | "@next/env" "13.5.4"
484 | "@swc/helpers" "0.5.2"
485 | busboy "1.6.0"
486 | caniuse-lite "^1.0.30001406"
487 | postcss "8.4.31"
488 | styled-jsx "5.1.1"
489 | watchpack "2.4.0"
490 | optionalDependencies:
491 | "@next/swc-darwin-arm64" "13.5.4"
492 | "@next/swc-darwin-x64" "13.5.4"
493 | "@next/swc-linux-arm64-gnu" "13.5.4"
494 | "@next/swc-linux-arm64-musl" "13.5.4"
495 | "@next/swc-linux-x64-gnu" "13.5.4"
496 | "@next/swc-linux-x64-musl" "13.5.4"
497 | "@next/swc-win32-arm64-msvc" "13.5.4"
498 | "@next/swc-win32-ia32-msvc" "13.5.4"
499 | "@next/swc-win32-x64-msvc" "13.5.4"
500 |
501 | object-assign@^4.1.1:
502 | version "4.1.1"
503 | resolved "https://registry.yarnpkg.com/object-assign/-/object-assign-4.1.1.tgz#2109adc7965887cfc05cbbd442cac8bfbb360863"
504 | integrity sha512-rJgTQnkUnH1sFw8yT6VSU3zD3sWmu6sZhIseY8VX+GRu3P6F7Fu+JNDoXfklElbLJSnc3FUQHVe4cU5hj+BcUg==
505 |
506 | picocolors@^1.0.0:
507 | version "1.0.0"
508 | resolved "https://registry.yarnpkg.com/picocolors/-/picocolors-1.0.0.tgz#cb5bdc74ff3f51892236eaf79d68bc44564ab81c"
509 | integrity sha512-1fygroTLlHu66zi26VoTDv8yRgm0Fccecssto+MhsZ0D/DGW2sm8E8AjW7NU5VVTRt5GxbeZ5qBuJr+HyLYkjQ==
510 |
511 | picomatch@^2.3.1:
512 | version "2.3.1"
513 | resolved "https://registry.yarnpkg.com/picomatch/-/picomatch-2.3.1.tgz#3ba3833733646d9d3e4995946c1365a67fb07a42"
514 | integrity sha512-JU3teHTNjmE2VCGFzuY8EXzCDVwEqB2a8fsIvwaStHhAWJEeVd1o1QD80CU6+ZdEXXSLbSsuLwJjkCBWqRQUVA==
515 |
516 | postcss-value-parser@^4.0.2:
517 | version "4.2.0"
518 | resolved "https://registry.yarnpkg.com/postcss-value-parser/-/postcss-value-parser-4.2.0.tgz#723c09920836ba6d3e5af019f92bc0971c02e514"
519 | integrity sha512-1NNCs6uurfkVbeXG4S8JFT9t19m45ICnif8zWLd5oPSZ50QnwMfK+H3jv408d4jw/7Bttv5axS5IiHoLaVNHeQ==
520 |
521 | postcss@8.4.31:
522 | version "8.4.31"
523 | resolved "https://registry.yarnpkg.com/postcss/-/postcss-8.4.31.tgz#92b451050a9f914da6755af352bdc0192508656d"
524 | integrity sha512-PS08Iboia9mts/2ygV3eLpY5ghnUcfLV/EXTOW1E2qYxJKGGBUtNjN76FYHnMs36RmARn41bC0AZmn+rR0OVpQ==
525 | dependencies:
526 | nanoid "^3.3.6"
527 | picocolors "^1.0.0"
528 | source-map-js "^1.0.2"
529 |
530 | prop-types@^15.6.2:
531 | version "15.8.1"
532 | resolved "https://registry.yarnpkg.com/prop-types/-/prop-types-15.8.1.tgz#67d87bf1a694f48435cf332c24af10214a3140b5"
533 | integrity sha512-oj87CgZICdulUohogVAR7AjlC0327U4el4L6eAvOqCeudMDVU0NThNaV+b9Df4dXgSP1gXMTnPdhfe/2qDH5cg==
534 | dependencies:
535 | loose-envify "^1.4.0"
536 | object-assign "^4.1.1"
537 | react-is "^16.13.1"
538 |
539 | prop-types@~15.7.2:
540 | version "15.7.2"
541 | resolved "https://registry.yarnpkg.com/prop-types/-/prop-types-15.7.2.tgz#52c41e75b8c87e72b9d9360e0206b99dcbffa6c5"
542 | integrity sha512-8QQikdH7//R2vurIJSutZ1smHYTcLpRWEOlHnzcWHmBYrOGUysKwSsrC89BCiFj3CbrfJ/nXFdJepOVrY1GCHQ==
543 | dependencies:
544 | loose-envify "^1.4.0"
545 | object-assign "^4.1.1"
546 | react-is "^16.8.1"
547 |
548 | "react-dom@link:../node_modules/react-dom":
549 | version "0.0.0"
550 | uid ""
551 |
552 | react-icons@^4.2.0:
553 | version "4.11.0"
554 | resolved "https://registry.yarnpkg.com/react-icons/-/react-icons-4.11.0.tgz#4b0e31c9bfc919608095cc429c4f1846f4d66c65"
555 | integrity sha512-V+4khzYcE5EBk/BvcuYRq6V/osf11ODUM2J8hg2FDSswRrGvqiYUYPRy4OdrWaQOBj4NcpJfmHZLNaD+VH0TyA==
556 |
557 | react-is@^16.13.1, react-is@^16.7.0, react-is@^16.8.1:
558 | version "16.13.1"
559 | resolved "https://registry.yarnpkg.com/react-is/-/react-is-16.13.1.tgz#789729a4dc36de2999dc156dd6c1d9c18cea56a4"
560 | integrity sha512-24e6ynE2H+OKt4kqsOvNd8kBpV65zoxbA4BVsEOB3ARVWQki/DHzaUoC5KuON/BiccDaCCTZBuOcfZs70kR8bQ==
561 |
562 | "react-is@link:../node_modules/react-is":
563 | version "0.0.0"
564 | uid ""
565 |
566 | react-photo-gallery@^8.0.0:
567 | version "8.0.0"
568 | resolved "https://registry.yarnpkg.com/react-photo-gallery/-/react-photo-gallery-8.0.0.tgz#04ff9f902a2342660e63e6817b4f010488db02b8"
569 | integrity sha512-Y9458yygEB9cIZAWlBWuenlR+ghin1RopmmU3Vice8BeJl0Se7hzfxGDq8W1armB/ic/kphGg+G1jq5fOEd0sw==
570 | dependencies:
571 | prop-types "~15.7.2"
572 | resize-observer-polyfill "^1.5.0"
573 |
574 | "react-spring-lightbox@link:..":
575 | version "0.0.0"
576 | uid ""
577 |
578 | react-use-gesture@9.1.3:
579 | version "9.1.3"
580 | resolved "https://registry.yarnpkg.com/react-use-gesture/-/react-use-gesture-9.1.3.tgz#92bd143e4f58e69bd424514a5bfccba2a1d62ec0"
581 | integrity sha512-CdqA2SmS/fj3kkS2W8ZU8wjTbVBAIwDWaRprX7OKaj7HlGwBasGEFggmk5qNklknqk9zK/h8D355bEJFTpqEMg==
582 |
583 | "react@link:../node_modules/react":
584 | version "0.0.0"
585 | uid ""
586 |
587 | regenerator-runtime@^0.14.0:
588 | version "0.14.0"
589 | resolved "https://registry.yarnpkg.com/regenerator-runtime/-/regenerator-runtime-0.14.0.tgz#5e19d68eb12d486f797e15a3c6a918f7cec5eb45"
590 | integrity sha512-srw17NI0TUWHuGa5CFGGmhfNIeja30WMBfbslPNhf6JrqQlLN5gcrvig1oqPxiVaXb0oW0XRKtH6Nngs5lKCIA==
591 |
592 | resize-observer-polyfill@^1.5.0:
593 | version "1.5.1"
594 | resolved "https://registry.yarnpkg.com/resize-observer-polyfill/-/resize-observer-polyfill-1.5.1.tgz#0e9020dd3d21024458d4ebd27e23e40269810464"
595 | integrity sha512-LwZrotdHOo12nQuZlHEmtuXdqGoOD0OhaxopaNFxWzInpEgaLWoVuAMbTzixuosCx2nEG58ngzW3vxdWoxIgdg==
596 |
597 | scheduler@^0.23.0:
598 | version "0.23.0"
599 | resolved "https://registry.yarnpkg.com/scheduler/-/scheduler-0.23.0.tgz#ba8041afc3d30eb206a487b6b384002e4e61fdfe"
600 | integrity sha512-CtuThmgHNg7zIZWAXi3AsyIzA3n4xx7aNyjwC2VJldO2LMVDhFK+63xGqq6CsJH4rTAt6/M+N4GhZiDYPx9eUw==
601 | dependencies:
602 | loose-envify "^1.1.0"
603 |
604 | shallowequal@^1.1.0:
605 | version "1.1.0"
606 | resolved "https://registry.yarnpkg.com/shallowequal/-/shallowequal-1.1.0.tgz#188d521de95b9087404fd4dcb68b13df0ae4e7f8"
607 | integrity sha512-y0m1JoUZSlPAjXVtPPW70aZWfIL/dSP7AFkRnniLCrK/8MDKog3TySTBmckD+RObVxH0v4Tox67+F14PdED2oQ==
608 |
609 | simple-swizzle@^0.2.2:
610 | version "0.2.2"
611 | resolved "https://registry.yarnpkg.com/simple-swizzle/-/simple-swizzle-0.2.2.tgz#a4da6b635ffcccca33f70d17cb92592de95e557a"
612 | integrity sha512-JA//kQgZtbuY83m+xT+tXJkmJncGMTFT+C+g2h2R9uxkYIrE2yy9sgmcLhCnw57/WSD+Eh3J97FPEDFnbXnDUg==
613 | dependencies:
614 | is-arrayish "^0.3.1"
615 |
616 | source-map-js@^1.0.2:
617 | version "1.0.2"
618 | resolved "https://registry.yarnpkg.com/source-map-js/-/source-map-js-1.0.2.tgz#adbc361d9c62df380125e7f161f71c826f1e490c"
619 | integrity sha512-R0XvVJ9WusLiqTCEiGCmICCMplcCkIwwR11mOSD9CR5u+IXYdiseeEuXCVAjS54zqwkLcPNnmU4OeJ6tUrWhDw==
620 |
621 | streamsearch@^1.1.0:
622 | version "1.1.0"
623 | resolved "https://registry.yarnpkg.com/streamsearch/-/streamsearch-1.1.0.tgz#404dd1e2247ca94af554e841a8ef0eaa238da764"
624 | integrity sha512-Mcc5wHehp9aXz1ax6bZUyY5afg9u2rv5cqQI3mRrYkGC8rW2hM02jWuwjtL++LS5qinSyhj2QfLyNsuc+VsExg==
625 |
626 | "styled-components@link:../node_modules/styled-components":
627 | version "0.0.0"
628 | uid ""
629 |
630 | styled-jsx@5.1.1:
631 | version "5.1.1"
632 | resolved "https://registry.yarnpkg.com/styled-jsx/-/styled-jsx-5.1.1.tgz#839a1c3aaacc4e735fed0781b8619ea5d0009d1f"
633 | integrity sha512-pW7uC1l4mBZ8ugbiZrcIsiIvVx1UmTfw7UkC3Um2tmfUq9Bhk8IiyEIPl6F8agHgjzku6j0xQEZbfA5uSgSaCw==
634 | dependencies:
635 | client-only "0.0.1"
636 |
637 | styled-normalize@^8.0.7:
638 | version "8.0.7"
639 | resolved "https://registry.yarnpkg.com/styled-normalize/-/styled-normalize-8.0.7.tgz#e883bff6a0c59a65a39365a4eb9c6cf48372c61f"
640 | integrity sha512-qQV4O7B9g7ZUnStCwGde7Dc/mcFF/pz0Ha/LL7+j/r6uopf6kJCmmR7jCPQMCBrDkYiQ4xvw1hUoceVJkdaMuQ==
641 |
642 | supports-color@^5.3.0, supports-color@^5.5.0:
643 | version "5.5.0"
644 | resolved "https://registry.yarnpkg.com/supports-color/-/supports-color-5.5.0.tgz#e2e69a44ac8772f78a1ec0b35b689df6530efc8f"
645 | integrity sha512-QjVjwdXIt408MIiAqCX4oUKsgU2EqAGzs2Ppkm4aQYbjm+ZEWEcW4SfFNTr4uMNZma0ey4f5lgLrkB0aX0QMow==
646 | dependencies:
647 | has-flag "^3.0.0"
648 |
649 | to-fast-properties@^2.0.0:
650 | version "2.0.0"
651 | resolved "https://registry.yarnpkg.com/to-fast-properties/-/to-fast-properties-2.0.0.tgz#dc5e698cbd079265bc73e0377681a4e4e83f616e"
652 | integrity sha512-/OaKK0xYrs3DmxRYqL/yDc+FxFUVYhDlXMhRmv3z915w2HF1tnN1omB354j8VUGO/hbRzyD6Y3sA7v7GS/ceog==
653 |
654 | tslib@^2.4.0:
655 | version "2.6.2"
656 | resolved "https://registry.yarnpkg.com/tslib/-/tslib-2.6.2.tgz#703ac29425e7b37cd6fd456e92404d46d1f3e4ae"
657 | integrity sha512-AEYxH93jGFPn/a2iVAwW87VuUIkR1FVUKB77NwMF7nBTDkDrrT/Hpt/IrCJ0QXhW27jTBDcf5ZY7w6RiqTMw2Q==
658 |
659 | watchpack@2.4.0:
660 | version "2.4.0"
661 | resolved "https://registry.yarnpkg.com/watchpack/-/watchpack-2.4.0.tgz#fa33032374962c78113f93c7f2fb4c54c9862a5d"
662 | integrity sha512-Lcvm7MGST/4fup+ifyKi2hjyIAwcdI4HRgtvTpIUxBRhB+RFtUh8XtDOxUfctVCnhVi+QQj49i91OyvzkJl6cg==
663 | dependencies:
664 | glob-to-regexp "^0.4.1"
665 | graceful-fs "^4.1.2"
666 |
--------------------------------------------------------------------------------