@os-design/core 1.0.153 → 1.0.155

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.
@@ -9,19 +9,23 @@ exports["default"] = void 0;
9
9
 
10
10
  var _styled = _interopRequireDefault(require("@emotion/styled"));
11
11
 
12
+ var _icons = require("@os-design/icons");
13
+
12
14
  var _theming = require("@os-design/theming");
13
15
 
14
16
  var _utils = require("@os-design/utils");
15
17
 
16
18
  var _react = _interopRequireWildcard(require("react"));
17
19
 
20
+ var _Button = _interopRequireDefault(require("../Button"));
21
+
18
22
  var _Image = _interopRequireDefault(require("../Image"));
19
23
 
20
24
  var _Status = _interopRequireDefault(require("./Status"));
21
25
 
22
- var _excluded = ["urls", "aspectRatio", "help", "imageProps", "children"];
26
+ var _excluded = ["urls", "aspectRatio", "imageProps", "hideArrows", "children"];
23
27
 
24
- var _templateObject, _templateObject2, _templateObject3;
28
+ var _templateObject, _templateObject2, _templateObject3, _templateObject4, _templateObject5;
25
29
 
26
30
  function _getRequireWildcardCache(nodeInterop) { if (typeof WeakMap !== "function") return null; var cacheBabelInterop = new WeakMap(); var cacheNodeInterop = new WeakMap(); return (_getRequireWildcardCache = function _getRequireWildcardCache(nodeInterop) { return nodeInterop ? cacheNodeInterop : cacheBabelInterop; })(nodeInterop); }
27
31
 
@@ -57,17 +61,9 @@ var Container = (0, _styled["default"])('div', (0, _utils.omitEmotionProps)('hei
57
61
  return p.theme.borderRadius;
58
62
  });
59
63
  var StyledImage = (0, _styled["default"])(_Image["default"])(_templateObject2 || (_templateObject2 = _taggedTemplateLiteral(["\n position: absolute;\n width: auto;\n height: 100%;\n border-radius: 0;\n"])));
60
-
61
- var GalleryHelp = _styled["default"].div(_templateObject3 || (_templateObject3 = _taggedTemplateLiteral(["\n position: absolute;\n top: 0;\n right: 0;\n\n background-color: ", ";\n color: ", ";\n backdrop-filter: blur(0.2em);\n\n font-size: ", "em;\n font-weight: 500;\n\n border-bottom-left-radius: ", "em;\n padding: 0.1em 0.5em;\n"])), function (p) {
62
- return (0, _theming.clr)(p.theme.galleryHelpColorBg);
63
- }, function (p) {
64
- return (0, _theming.clr)(p.theme.galleryHelpColorText);
65
- }, function (p) {
66
- return p.theme.sizes.small;
67
- }, function (p) {
68
- return p.theme.borderRadius;
69
- });
70
-
64
+ var NavButton = (0, _styled["default"])(_Button["default"])(_templateObject3 || (_templateObject3 = _taggedTemplateLiteral(["\n position: absolute;\n top: 50%;\n transform: translateY(-50%);\n\n background-color: hsla(0, 0%, 0%, 0.5);\n backdrop-filter: blur(0.2em);\n"])));
65
+ var LeftButton = (0, _styled["default"])(NavButton)(_templateObject4 || (_templateObject4 = _taggedTemplateLiteral(["\n left: 0.2em;\n"])));
66
+ var RightButton = (0, _styled["default"])(NavButton)(_templateObject5 || (_templateObject5 = _taggedTemplateLiteral(["\n right: 0.2em;\n"])));
71
67
  var MIN_DIST_PX = 30;
72
68
  var MAX_ANGLE = 30;
73
69
  /**
@@ -79,9 +75,10 @@ var Gallery = /*#__PURE__*/(0, _react.forwardRef)(function (_ref, ref) {
79
75
  var urls = _ref.urls,
80
76
  _ref$aspectRatio = _ref.aspectRatio,
81
77
  aspectRatio = _ref$aspectRatio === void 0 ? [16, 9] : _ref$aspectRatio,
82
- help = _ref.help,
83
78
  _ref$imageProps = _ref.imageProps,
84
79
  imageProps = _ref$imageProps === void 0 ? {} : _ref$imageProps,
80
+ _ref$hideArrows = _ref.hideArrows,
81
+ hideArrows = _ref$hideArrows === void 0 ? false : _ref$hideArrows,
85
82
  children = _ref.children,
86
83
  rest = _objectWithoutProperties(_ref, _excluded);
87
84
 
@@ -135,6 +132,24 @@ var Gallery = /*#__PURE__*/(0, _react.forwardRef)(function (_ref, ref) {
135
132
  setImageIndex(nextIndex);
136
133
  }
137
134
  }, [innerContainerRef, urls.length]);
135
+ var prev = (0, _react.useCallback)(function () {
136
+ var index = imageIndexRef.current;
137
+ if (index === null) return;
138
+ setImageIndex(index > 0 ? index - 1 : urls.length - 1);
139
+ }, [urls.length]);
140
+ var next = (0, _react.useCallback)(function () {
141
+ var index = imageIndexRef.current;
142
+ if (index === null) return;
143
+ setImageIndex(index < urls.length - 1 ? index + 1 : 0);
144
+ }, [urls.length]);
145
+ var left = (0, _react.useCallback)(function (e) {
146
+ prev();
147
+ e.preventDefault();
148
+ }, [prev]);
149
+ var right = (0, _react.useCallback)(function (e) {
150
+ next();
151
+ e.preventDefault();
152
+ }, [next]);
138
153
  var mouseMoveHandler = (0, _react.useCallback)(function (e) {
139
154
  return updateGalleryImage(e.clientX);
140
155
  }, [updateGalleryImage]);
@@ -166,17 +181,9 @@ var Gallery = /*#__PURE__*/(0, _react.forwardRef)(function (_ref, ref) {
166
181
  return;
167
182
  }
168
183
 
169
- var index = imageIndexRef.current;
170
- if (index === null) return;
171
-
172
- if (x < clientX) {
173
- setImageIndex(index > 0 ? index - 1 : urls.length - 1);
174
- } else {
175
- setImageIndex(index < urls.length - 1 ? index + 1 : 0);
176
- }
177
-
184
+ if (x < clientX) prev();else next();
178
185
  startTouchPosRef.current = null;
179
- }, [urls.length]);
186
+ }, [next, prev]);
180
187
  var touchEndHandler = (0, _react.useCallback)(function () {
181
188
  startTouchPosRef.current = null;
182
189
  }, []);
@@ -201,11 +208,25 @@ var Gallery = /*#__PURE__*/(0, _react.forwardRef)(function (_ref, ref) {
201
208
  ref: mergedContainerRef
202
209
  }), /*#__PURE__*/_react["default"].createElement(StyledImage, _extends({
203
210
  url: imageUrl
204
- }, imageProps)), urls.length > 1 && /*#__PURE__*/_react["default"].createElement(_react["default"].Fragment, null, imageIndex !== null && /*#__PURE__*/_react["default"].createElement(_Status["default"], {
211
+ }, imageProps)), urls.length > 1 && imageIndex !== null && /*#__PURE__*/_react["default"].createElement(_react["default"].Fragment, null, /*#__PURE__*/_react["default"].createElement(_Status["default"], {
205
212
  count: urls.length,
206
213
  current: imageIndex,
207
214
  height: statusHeight
208
- }), help && /*#__PURE__*/_react["default"].createElement(GalleryHelp, null, help)), children));
215
+ }), (0, _utils.isTouchDevice)() && !hideArrows && /*#__PURE__*/_react["default"].createElement(_theming.ThemeOverrider, {
216
+ overrides: {
217
+ colorPrimary: [0, 0, 100]
218
+ }
219
+ }, /*#__PURE__*/_react["default"].createElement(LeftButton, {
220
+ type: "ghost",
221
+ wide: "never",
222
+ size: "small",
223
+ onClick: left
224
+ }, /*#__PURE__*/_react["default"].createElement(_icons.Left, null)), /*#__PURE__*/_react["default"].createElement(RightButton, {
225
+ type: "ghost",
226
+ wide: "never",
227
+ size: "small",
228
+ onClick: right
229
+ }, /*#__PURE__*/_react["default"].createElement(_icons.Right, null)))), children));
209
230
  });
210
231
  var _default = Gallery;
211
232
  exports["default"] = _default;
@@ -1 +1 @@
1
- {"version":3,"file":"index.js","names":["Container","styled","omitEmotionProps","p","heightPercent","clr","theme","galleryColorBg","borderRadius","StyledImage","Image","GalleryHelp","div","galleryHelpColorBg","galleryHelpColorText","sizes","small","MIN_DIST_PX","MAX_ANGLE","Gallery","forwardRef","ref","urls","aspectRatio","help","imageProps","children","rest","useForwardedRef","innerContainerRef","mergedContainerRef","useState","undefined","imageUrl","setImageUrl","length","imageIndex","setImageIndex","useMemo","Math","round","imageIndexRef","useRef","useEffect","current","startTouchPosRef","size","useSize","sizeRef","statusHeight","height","updateGalleryImage","useCallback","clientX","getBoundingClientRect","x","widthPerImage","width","xPos","nextIndex","floor","mouseMoveHandler","e","touchStartHandler","touches","clientY","y","touchMoveHandler","diffX","abs","diffY","diff","sqrt","angle","atan","PI","index","touchEndHandler","handlers","isTouchDevice","onTouchStart","onTouchMove","onTouchEnd","onMouseMove"],"sources":["../../../src/Gallery/index.tsx"],"sourcesContent":["import styled from '@emotion/styled';\nimport { clr, ThemeOverrider } from '@os-design/theming';\nimport {\n isTouchDevice,\n omitEmotionProps,\n useForwardedRef,\n useSize,\n} from '@os-design/utils';\nimport React, {\n forwardRef,\n MouseEventHandler,\n TouchEventHandler,\n useCallback,\n useEffect,\n useMemo,\n useRef,\n useState,\n} from 'react';\nimport Image, { ImageProps } from '../Image';\nimport GalleryStatus from './Status';\n\ninterface ContainerProps {\n heightPercent: number;\n}\nconst Container = styled(\n 'div',\n omitEmotionProps('heightPercent')\n)<ContainerProps>`\n position: relative;\n padding-bottom: ${(p) => p.heightPercent}%;\n\n display: flex;\n justify-content: center;\n\n background-color: ${(p) => clr(p.theme.galleryColorBg)};\n border-radius: ${(p) => p.theme.borderRadius}em;\n overflow: hidden;\n`;\n\nconst StyledImage = styled(Image)`\n position: absolute;\n width: auto;\n height: 100%;\n border-radius: 0;\n`;\n\nconst GalleryHelp = styled.div`\n position: absolute;\n top: 0;\n right: 0;\n\n background-color: ${(p) => clr(p.theme.galleryHelpColorBg)};\n color: ${(p) => clr(p.theme.galleryHelpColorText)};\n backdrop-filter: blur(0.2em);\n\n font-size: ${(p) => p.theme.sizes.small}em;\n font-weight: 500;\n\n border-bottom-left-radius: ${(p) => p.theme.borderRadius}em;\n padding: 0.1em 0.5em;\n`;\n\ntype JsxDivProps = Omit<JSX.IntrinsicElements['div'], 'ref'>;\nexport interface GalleryProps extends JsxDivProps {\n /**\n * The image urls.\n */\n urls: string[] | ReadonlyArray<string>;\n /**\n * The aspect ratio of the gallery.\n * E.g. [16,9] – 16:9.\n */\n aspectRatio?: [number, number];\n /**\n * The help message that is displayed in the upper right corner.\n */\n help?: string;\n /**\n * The props of the image component.\n */\n imageProps?: Omit<ImageProps, 'url'>;\n /**\n * The children that can be displayed on top of the image.\n * E.g. tags.\n */\n children?: React.ReactNode;\n}\n\nconst MIN_DIST_PX = 30;\nconst MAX_ANGLE = 30;\n\n/**\n * The image gallery. Change the cursor/touch position to change images.\n * The lib 'lazysizes/plugins/attrchange/ls.attrchange' must be imported.\n */\nconst Gallery = forwardRef<HTMLDivElement, GalleryProps>(\n (\n { urls, aspectRatio = [16, 9], help, imageProps = {}, children, ...rest },\n ref\n ) => {\n const [innerContainerRef, mergedContainerRef] = useForwardedRef(ref);\n\n const [imageUrl, setImageUrl] = useState<string | undefined>(undefined);\n const [imageIndex, setImageIndex] = useState(urls.length > 0 ? 0 : null);\n\n const heightPercent = useMemo(\n () => Math.round((aspectRatio[1] / aspectRatio[0]) * 1000000) / 10000,\n [aspectRatio]\n );\n\n const imageIndexRef = useRef(imageIndex);\n useEffect(() => {\n imageIndexRef.current = imageIndex;\n }, [imageIndex]);\n\n // Update the image if the index was changed\n useEffect(() => {\n setImageUrl(imageIndex !== null ? urls[imageIndex] : undefined);\n }, [imageIndex, urls]);\n\n const startTouchPosRef = useRef<{ x: number; y: number } | null>(null);\n\n const size = useSize(innerContainerRef);\n const sizeRef = useRef(size);\n useEffect(() => {\n sizeRef.current = size;\n }, [size]);\n\n const statusHeight = useMemo(\n () => Math.round(size.height / 70),\n [size.height]\n );\n\n const updateGalleryImage = useCallback(\n (clientX: number) => {\n if (!innerContainerRef.current) return;\n const { x } = innerContainerRef.current.getBoundingClientRect();\n const widthPerImage = sizeRef.current.width / urls.length;\n const xPos = clientX - x;\n if (xPos < 0) return;\n const nextIndex = Math.floor(xPos / widthPerImage);\n if (imageIndexRef.current !== nextIndex) {\n setImageIndex(nextIndex);\n }\n },\n [innerContainerRef, urls.length]\n );\n\n const mouseMoveHandler = useCallback<MouseEventHandler<HTMLDivElement>>(\n (e) => updateGalleryImage(e.clientX),\n [updateGalleryImage]\n );\n\n const touchStartHandler = useCallback<TouchEventHandler<HTMLDivElement>>(\n (e) => {\n const { clientX, clientY } = e.touches[0];\n startTouchPosRef.current = { x: clientX, y: clientY };\n },\n []\n );\n\n const touchMoveHandler = useCallback<TouchEventHandler<HTMLDivElement>>(\n (e) => {\n if (!startTouchPosRef.current) return;\n const { x, y } = startTouchPosRef.current;\n const { clientX, clientY } = e.touches[0];\n const diffX = Math.abs(x - clientX);\n const diffY = Math.abs(y - clientY);\n const diff = Math.sqrt(diffX ** 2 + diffY ** 2);\n if (diff < MIN_DIST_PX) return;\n const angle = (Math.atan(diffY / diffX) * 180) / Math.PI;\n if (angle > MAX_ANGLE) {\n startTouchPosRef.current = null;\n return;\n }\n const index = imageIndexRef.current;\n if (index === null) return;\n if (x < clientX) {\n setImageIndex(index > 0 ? index - 1 : urls.length - 1);\n } else {\n setImageIndex(index < urls.length - 1 ? index + 1 : 0);\n }\n startTouchPosRef.current = null;\n },\n [urls.length]\n );\n\n const touchEndHandler = useCallback<\n TouchEventHandler<HTMLDivElement>\n >(() => {\n startTouchPosRef.current = null;\n }, []);\n\n const handlers = useMemo(() => {\n if (isTouchDevice()) {\n return {\n onTouchStart: touchStartHandler,\n onTouchMove: touchMoveHandler,\n onTouchEnd: touchEndHandler,\n };\n }\n return {\n onMouseMove: mouseMoveHandler,\n };\n }, [\n mouseMoveHandler,\n touchEndHandler,\n touchMoveHandler,\n touchStartHandler,\n ]);\n\n return (\n <ThemeOverrider activeTheme='dark'>\n <Container\n heightPercent={heightPercent}\n {...handlers}\n {...rest}\n ref={mergedContainerRef}\n >\n <StyledImage url={imageUrl} {...imageProps} />\n {urls.length > 1 && (\n <>\n {imageIndex !== null && (\n <GalleryStatus\n count={urls.length}\n current={imageIndex}\n height={statusHeight}\n />\n )}\n {help && <GalleryHelp>{help}</GalleryHelp>}\n </>\n )}\n {children}\n </Container>\n </ThemeOverrider>\n );\n }\n);\n\nexport default Gallery;\n"],"mappings":"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"}
1
+ {"version":3,"file":"index.js","names":["Container","styled","omitEmotionProps","p","heightPercent","clr","theme","galleryColorBg","borderRadius","StyledImage","Image","NavButton","Button","LeftButton","RightButton","MIN_DIST_PX","MAX_ANGLE","Gallery","forwardRef","ref","urls","aspectRatio","imageProps","hideArrows","children","rest","useForwardedRef","innerContainerRef","mergedContainerRef","useState","undefined","imageUrl","setImageUrl","length","imageIndex","setImageIndex","useMemo","Math","round","imageIndexRef","useRef","useEffect","current","startTouchPosRef","size","useSize","sizeRef","statusHeight","height","updateGalleryImage","useCallback","clientX","getBoundingClientRect","x","widthPerImage","width","xPos","nextIndex","floor","prev","index","next","left","e","preventDefault","right","mouseMoveHandler","touchStartHandler","touches","clientY","y","touchMoveHandler","diffX","abs","diffY","diff","sqrt","angle","atan","PI","touchEndHandler","handlers","isTouchDevice","onTouchStart","onTouchMove","onTouchEnd","onMouseMove","colorPrimary"],"sources":["../../../src/Gallery/index.tsx"],"sourcesContent":["import styled from '@emotion/styled';\nimport { Left, Right } from '@os-design/icons';\nimport { clr, ThemeOverrider } from '@os-design/theming';\nimport {\n isTouchDevice,\n omitEmotionProps,\n useForwardedRef,\n useSize,\n} from '@os-design/utils';\nimport React, {\n forwardRef,\n MouseEventHandler,\n TouchEventHandler,\n useCallback,\n useEffect,\n useMemo,\n useRef,\n useState,\n} from 'react';\nimport Button from '../Button';\nimport Image, { ImageProps } from '../Image';\nimport GalleryStatus from './Status';\n\ninterface ContainerProps {\n heightPercent: number;\n}\nconst Container = styled(\n 'div',\n omitEmotionProps('heightPercent')\n)<ContainerProps>`\n position: relative;\n padding-bottom: ${(p) => p.heightPercent}%;\n\n display: flex;\n justify-content: center;\n\n background-color: ${(p) => clr(p.theme.galleryColorBg)};\n border-radius: ${(p) => p.theme.borderRadius}em;\n overflow: hidden;\n`;\n\nconst StyledImage = styled(Image)`\n position: absolute;\n width: auto;\n height: 100%;\n border-radius: 0;\n`;\n\nconst NavButton = styled(Button)`\n position: absolute;\n top: 50%;\n transform: translateY(-50%);\n\n background-color: hsla(0, 0%, 0%, 0.5);\n backdrop-filter: blur(0.2em);\n`;\n\nconst LeftButton = styled(NavButton)`\n left: 0.2em;\n`;\n\nconst RightButton = styled(NavButton)`\n right: 0.2em;\n`;\n\ntype JsxDivProps = Omit<JSX.IntrinsicElements['div'], 'ref'>;\nexport interface GalleryProps extends JsxDivProps {\n /**\n * The image urls.\n */\n urls: string[] | ReadonlyArray<string>;\n /**\n * The aspect ratio of the gallery.\n * E.g. [16,9] – 16:9.\n */\n aspectRatio?: [number, number];\n /**\n * The props of the image component.\n */\n imageProps?: Omit<ImageProps, 'url'>;\n /**\n * Whether the navigation buttons is shown.\n */\n hideArrows?: boolean;\n /**\n * The children that can be displayed on top of the image.\n * E.g. tags.\n */\n children?: React.ReactNode;\n}\n\nconst MIN_DIST_PX = 30;\nconst MAX_ANGLE = 30;\n\n/**\n * The image gallery. Change the cursor/touch position to change images.\n * The lib 'lazysizes/plugins/attrchange/ls.attrchange' must be imported.\n */\nconst Gallery = forwardRef<HTMLDivElement, GalleryProps>(\n (\n {\n urls,\n aspectRatio = [16, 9],\n imageProps = {},\n hideArrows = false,\n children,\n ...rest\n },\n ref\n ) => {\n const [innerContainerRef, mergedContainerRef] = useForwardedRef(ref);\n\n const [imageUrl, setImageUrl] = useState<string | undefined>(undefined);\n const [imageIndex, setImageIndex] = useState(urls.length > 0 ? 0 : null);\n\n const heightPercent = useMemo(\n () => Math.round((aspectRatio[1] / aspectRatio[0]) * 1000000) / 10000,\n [aspectRatio]\n );\n\n const imageIndexRef = useRef(imageIndex);\n useEffect(() => {\n imageIndexRef.current = imageIndex;\n }, [imageIndex]);\n\n // Update the image if the index was changed\n useEffect(() => {\n setImageUrl(imageIndex !== null ? urls[imageIndex] : undefined);\n }, [imageIndex, urls]);\n\n const startTouchPosRef = useRef<{ x: number; y: number } | null>(null);\n\n const size = useSize(innerContainerRef);\n const sizeRef = useRef(size);\n useEffect(() => {\n sizeRef.current = size;\n }, [size]);\n\n const statusHeight = useMemo(\n () => Math.round(size.height / 70),\n [size.height]\n );\n\n const updateGalleryImage = useCallback(\n (clientX: number) => {\n if (!innerContainerRef.current) return;\n const { x } = innerContainerRef.current.getBoundingClientRect();\n const widthPerImage = sizeRef.current.width / urls.length;\n const xPos = clientX - x;\n if (xPos < 0) return;\n const nextIndex = Math.floor(xPos / widthPerImage);\n if (imageIndexRef.current !== nextIndex) {\n setImageIndex(nextIndex);\n }\n },\n [innerContainerRef, urls.length]\n );\n\n const prev = useCallback(() => {\n const index = imageIndexRef.current;\n if (index === null) return;\n setImageIndex(index > 0 ? index - 1 : urls.length - 1);\n }, [urls.length]);\n\n const next = useCallback(() => {\n const index = imageIndexRef.current;\n if (index === null) return;\n setImageIndex(index < urls.length - 1 ? index + 1 : 0);\n }, [urls.length]);\n\n const left = useCallback<MouseEventHandler>(\n (e) => {\n prev();\n e.preventDefault();\n },\n [prev]\n );\n\n const right = useCallback<MouseEventHandler>(\n (e) => {\n next();\n e.preventDefault();\n },\n [next]\n );\n\n const mouseMoveHandler = useCallback<MouseEventHandler<HTMLDivElement>>(\n (e) => updateGalleryImage(e.clientX),\n [updateGalleryImage]\n );\n\n const touchStartHandler = useCallback<TouchEventHandler<HTMLDivElement>>(\n (e) => {\n const { clientX, clientY } = e.touches[0];\n startTouchPosRef.current = { x: clientX, y: clientY };\n },\n []\n );\n\n const touchMoveHandler = useCallback<TouchEventHandler<HTMLDivElement>>(\n (e) => {\n if (!startTouchPosRef.current) return;\n const { x, y } = startTouchPosRef.current;\n const { clientX, clientY } = e.touches[0];\n const diffX = Math.abs(x - clientX);\n const diffY = Math.abs(y - clientY);\n const diff = Math.sqrt(diffX ** 2 + diffY ** 2);\n if (diff < MIN_DIST_PX) return;\n const angle = (Math.atan(diffY / diffX) * 180) / Math.PI;\n if (angle > MAX_ANGLE) {\n startTouchPosRef.current = null;\n return;\n }\n if (x < clientX) prev();\n else next();\n startTouchPosRef.current = null;\n },\n [next, prev]\n );\n\n const touchEndHandler = useCallback<\n TouchEventHandler<HTMLDivElement>\n >(() => {\n startTouchPosRef.current = null;\n }, []);\n\n const handlers = useMemo(() => {\n if (isTouchDevice()) {\n return {\n onTouchStart: touchStartHandler,\n onTouchMove: touchMoveHandler,\n onTouchEnd: touchEndHandler,\n };\n }\n return {\n onMouseMove: mouseMoveHandler,\n };\n }, [\n mouseMoveHandler,\n touchEndHandler,\n touchMoveHandler,\n touchStartHandler,\n ]);\n\n return (\n <ThemeOverrider activeTheme='dark'>\n <Container\n heightPercent={heightPercent}\n {...handlers}\n {...rest}\n ref={mergedContainerRef}\n >\n <StyledImage url={imageUrl} {...imageProps} />\n {urls.length > 1 && imageIndex !== null && (\n <>\n <GalleryStatus\n count={urls.length}\n current={imageIndex}\n height={statusHeight}\n />\n {isTouchDevice() && !hideArrows && (\n <ThemeOverrider overrides={{ colorPrimary: [0, 0, 100] }}>\n <LeftButton\n type='ghost'\n wide='never'\n size='small'\n onClick={left}\n >\n <Left />\n </LeftButton>\n <RightButton\n type='ghost'\n wide='never'\n size='small'\n onClick={right}\n >\n <Right />\n </RightButton>\n </ThemeOverrider>\n )}\n </>\n )}\n {children}\n </Container>\n </ThemeOverrider>\n );\n }\n);\n\nexport default Gallery;\n"],"mappings":"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"}
@@ -1,9 +1,11 @@
1
1
  function _extends() { _extends = Object.assign ? Object.assign.bind() : function (target) { for (var i = 1; i < arguments.length; i++) { var source = arguments[i]; for (var key in source) { if (Object.prototype.hasOwnProperty.call(source, key)) { target[key] = source[key]; } } } return target; }; return _extends.apply(this, arguments); }
2
2
 
3
3
  import styled from '@emotion/styled';
4
+ import { Left, Right } from '@os-design/icons';
4
5
  import { clr, ThemeOverrider } from '@os-design/theming';
5
6
  import { isTouchDevice, omitEmotionProps, useForwardedRef, useSize } from '@os-design/utils';
6
7
  import React, { forwardRef, useCallback, useEffect, useMemo, useRef, useState } from 'react';
8
+ import Button from '../Button';
7
9
  import Image from '../Image';
8
10
  import GalleryStatus from './Status';
9
11
  const Container = styled('div', omitEmotionProps('heightPercent'))`
@@ -23,20 +25,19 @@ const StyledImage = styled(Image)`
23
25
  height: 100%;
24
26
  border-radius: 0;
25
27
  `;
26
- const GalleryHelp = styled.div`
28
+ const NavButton = styled(Button)`
27
29
  position: absolute;
28
- top: 0;
29
- right: 0;
30
+ top: 50%;
31
+ transform: translateY(-50%);
30
32
 
31
- background-color: ${p => clr(p.theme.galleryHelpColorBg)};
32
- color: ${p => clr(p.theme.galleryHelpColorText)};
33
+ background-color: hsla(0, 0%, 0%, 0.5);
33
34
  backdrop-filter: blur(0.2em);
34
-
35
- font-size: ${p => p.theme.sizes.small}em;
36
- font-weight: 500;
37
-
38
- border-bottom-left-radius: ${p => p.theme.borderRadius}em;
39
- padding: 0.1em 0.5em;
35
+ `;
36
+ const LeftButton = styled(NavButton)`
37
+ left: 0.2em;
38
+ `;
39
+ const RightButton = styled(NavButton)`
40
+ right: 0.2em;
40
41
  `;
41
42
  const MIN_DIST_PX = 30;
42
43
  const MAX_ANGLE = 30;
@@ -48,8 +49,8 @@ const MAX_ANGLE = 30;
48
49
  const Gallery = /*#__PURE__*/forwardRef(({
49
50
  urls,
50
51
  aspectRatio = [16, 9],
51
- help,
52
52
  imageProps = {},
53
+ hideArrows = false,
53
54
  children,
54
55
  ...rest
55
56
  }, ref) => {
@@ -86,6 +87,24 @@ const Gallery = /*#__PURE__*/forwardRef(({
86
87
  setImageIndex(nextIndex);
87
88
  }
88
89
  }, [innerContainerRef, urls.length]);
90
+ const prev = useCallback(() => {
91
+ const index = imageIndexRef.current;
92
+ if (index === null) return;
93
+ setImageIndex(index > 0 ? index - 1 : urls.length - 1);
94
+ }, [urls.length]);
95
+ const next = useCallback(() => {
96
+ const index = imageIndexRef.current;
97
+ if (index === null) return;
98
+ setImageIndex(index < urls.length - 1 ? index + 1 : 0);
99
+ }, [urls.length]);
100
+ const left = useCallback(e => {
101
+ prev();
102
+ e.preventDefault();
103
+ }, [prev]);
104
+ const right = useCallback(e => {
105
+ next();
106
+ e.preventDefault();
107
+ }, [next]);
89
108
  const mouseMoveHandler = useCallback(e => updateGalleryImage(e.clientX), [updateGalleryImage]);
90
109
  const touchStartHandler = useCallback(e => {
91
110
  const {
@@ -118,17 +137,9 @@ const Gallery = /*#__PURE__*/forwardRef(({
118
137
  return;
119
138
  }
120
139
 
121
- const index = imageIndexRef.current;
122
- if (index === null) return;
123
-
124
- if (x < clientX) {
125
- setImageIndex(index > 0 ? index - 1 : urls.length - 1);
126
- } else {
127
- setImageIndex(index < urls.length - 1 ? index + 1 : 0);
128
- }
129
-
140
+ if (x < clientX) prev();else next();
130
141
  startTouchPosRef.current = null;
131
- }, [urls.length]);
142
+ }, [next, prev]);
132
143
  const touchEndHandler = useCallback(() => {
133
144
  startTouchPosRef.current = null;
134
145
  }, []);
@@ -153,11 +164,25 @@ const Gallery = /*#__PURE__*/forwardRef(({
153
164
  ref: mergedContainerRef
154
165
  }), /*#__PURE__*/React.createElement(StyledImage, _extends({
155
166
  url: imageUrl
156
- }, imageProps)), urls.length > 1 && /*#__PURE__*/React.createElement(React.Fragment, null, imageIndex !== null && /*#__PURE__*/React.createElement(GalleryStatus, {
167
+ }, imageProps)), urls.length > 1 && imageIndex !== null && /*#__PURE__*/React.createElement(React.Fragment, null, /*#__PURE__*/React.createElement(GalleryStatus, {
157
168
  count: urls.length,
158
169
  current: imageIndex,
159
170
  height: statusHeight
160
- }), help && /*#__PURE__*/React.createElement(GalleryHelp, null, help)), children));
171
+ }), isTouchDevice() && !hideArrows && /*#__PURE__*/React.createElement(ThemeOverrider, {
172
+ overrides: {
173
+ colorPrimary: [0, 0, 100]
174
+ }
175
+ }, /*#__PURE__*/React.createElement(LeftButton, {
176
+ type: "ghost",
177
+ wide: "never",
178
+ size: "small",
179
+ onClick: left
180
+ }, /*#__PURE__*/React.createElement(Left, null)), /*#__PURE__*/React.createElement(RightButton, {
181
+ type: "ghost",
182
+ wide: "never",
183
+ size: "small",
184
+ onClick: right
185
+ }, /*#__PURE__*/React.createElement(Right, null)))), children));
161
186
  });
162
187
  export default Gallery;
163
188
  //# sourceMappingURL=index.js.map
@@ -1 +1 @@
1
- {"version":3,"file":"index.js","names":["styled","clr","ThemeOverrider","isTouchDevice","omitEmotionProps","useForwardedRef","useSize","React","forwardRef","useCallback","useEffect","useMemo","useRef","useState","Image","GalleryStatus","Container","p","heightPercent","theme","galleryColorBg","borderRadius","StyledImage","GalleryHelp","div","galleryHelpColorBg","galleryHelpColorText","sizes","small","MIN_DIST_PX","MAX_ANGLE","Gallery","urls","aspectRatio","help","imageProps","children","rest","ref","innerContainerRef","mergedContainerRef","imageUrl","setImageUrl","undefined","imageIndex","setImageIndex","length","Math","round","imageIndexRef","current","startTouchPosRef","size","sizeRef","statusHeight","height","updateGalleryImage","clientX","x","getBoundingClientRect","widthPerImage","width","xPos","nextIndex","floor","mouseMoveHandler","e","touchStartHandler","clientY","touches","y","touchMoveHandler","diffX","abs","diffY","diff","sqrt","angle","atan","PI","index","touchEndHandler","handlers","onTouchStart","onTouchMove","onTouchEnd","onMouseMove"],"sources":["../../../src/Gallery/index.tsx"],"sourcesContent":["import styled from '@emotion/styled';\nimport { clr, ThemeOverrider } from '@os-design/theming';\nimport {\n isTouchDevice,\n omitEmotionProps,\n useForwardedRef,\n useSize,\n} from '@os-design/utils';\nimport React, {\n forwardRef,\n MouseEventHandler,\n TouchEventHandler,\n useCallback,\n useEffect,\n useMemo,\n useRef,\n useState,\n} from 'react';\nimport Image, { ImageProps } from '../Image';\nimport GalleryStatus from './Status';\n\ninterface ContainerProps {\n heightPercent: number;\n}\nconst Container = styled(\n 'div',\n omitEmotionProps('heightPercent')\n)<ContainerProps>`\n position: relative;\n padding-bottom: ${(p) => p.heightPercent}%;\n\n display: flex;\n justify-content: center;\n\n background-color: ${(p) => clr(p.theme.galleryColorBg)};\n border-radius: ${(p) => p.theme.borderRadius}em;\n overflow: hidden;\n`;\n\nconst StyledImage = styled(Image)`\n position: absolute;\n width: auto;\n height: 100%;\n border-radius: 0;\n`;\n\nconst GalleryHelp = styled.div`\n position: absolute;\n top: 0;\n right: 0;\n\n background-color: ${(p) => clr(p.theme.galleryHelpColorBg)};\n color: ${(p) => clr(p.theme.galleryHelpColorText)};\n backdrop-filter: blur(0.2em);\n\n font-size: ${(p) => p.theme.sizes.small}em;\n font-weight: 500;\n\n border-bottom-left-radius: ${(p) => p.theme.borderRadius}em;\n padding: 0.1em 0.5em;\n`;\n\ntype JsxDivProps = Omit<JSX.IntrinsicElements['div'], 'ref'>;\nexport interface GalleryProps extends JsxDivProps {\n /**\n * The image urls.\n */\n urls: string[] | ReadonlyArray<string>;\n /**\n * The aspect ratio of the gallery.\n * E.g. [16,9] – 16:9.\n */\n aspectRatio?: [number, number];\n /**\n * The help message that is displayed in the upper right corner.\n */\n help?: string;\n /**\n * The props of the image component.\n */\n imageProps?: Omit<ImageProps, 'url'>;\n /**\n * The children that can be displayed on top of the image.\n * E.g. tags.\n */\n children?: React.ReactNode;\n}\n\nconst MIN_DIST_PX = 30;\nconst MAX_ANGLE = 30;\n\n/**\n * The image gallery. Change the cursor/touch position to change images.\n * The lib 'lazysizes/plugins/attrchange/ls.attrchange' must be imported.\n */\nconst Gallery = forwardRef<HTMLDivElement, GalleryProps>(\n (\n { urls, aspectRatio = [16, 9], help, imageProps = {}, children, ...rest },\n ref\n ) => {\n const [innerContainerRef, mergedContainerRef] = useForwardedRef(ref);\n\n const [imageUrl, setImageUrl] = useState<string | undefined>(undefined);\n const [imageIndex, setImageIndex] = useState(urls.length > 0 ? 0 : null);\n\n const heightPercent = useMemo(\n () => Math.round((aspectRatio[1] / aspectRatio[0]) * 1000000) / 10000,\n [aspectRatio]\n );\n\n const imageIndexRef = useRef(imageIndex);\n useEffect(() => {\n imageIndexRef.current = imageIndex;\n }, [imageIndex]);\n\n // Update the image if the index was changed\n useEffect(() => {\n setImageUrl(imageIndex !== null ? urls[imageIndex] : undefined);\n }, [imageIndex, urls]);\n\n const startTouchPosRef = useRef<{ x: number; y: number } | null>(null);\n\n const size = useSize(innerContainerRef);\n const sizeRef = useRef(size);\n useEffect(() => {\n sizeRef.current = size;\n }, [size]);\n\n const statusHeight = useMemo(\n () => Math.round(size.height / 70),\n [size.height]\n );\n\n const updateGalleryImage = useCallback(\n (clientX: number) => {\n if (!innerContainerRef.current) return;\n const { x } = innerContainerRef.current.getBoundingClientRect();\n const widthPerImage = sizeRef.current.width / urls.length;\n const xPos = clientX - x;\n if (xPos < 0) return;\n const nextIndex = Math.floor(xPos / widthPerImage);\n if (imageIndexRef.current !== nextIndex) {\n setImageIndex(nextIndex);\n }\n },\n [innerContainerRef, urls.length]\n );\n\n const mouseMoveHandler = useCallback<MouseEventHandler<HTMLDivElement>>(\n (e) => updateGalleryImage(e.clientX),\n [updateGalleryImage]\n );\n\n const touchStartHandler = useCallback<TouchEventHandler<HTMLDivElement>>(\n (e) => {\n const { clientX, clientY } = e.touches[0];\n startTouchPosRef.current = { x: clientX, y: clientY };\n },\n []\n );\n\n const touchMoveHandler = useCallback<TouchEventHandler<HTMLDivElement>>(\n (e) => {\n if (!startTouchPosRef.current) return;\n const { x, y } = startTouchPosRef.current;\n const { clientX, clientY } = e.touches[0];\n const diffX = Math.abs(x - clientX);\n const diffY = Math.abs(y - clientY);\n const diff = Math.sqrt(diffX ** 2 + diffY ** 2);\n if (diff < MIN_DIST_PX) return;\n const angle = (Math.atan(diffY / diffX) * 180) / Math.PI;\n if (angle > MAX_ANGLE) {\n startTouchPosRef.current = null;\n return;\n }\n const index = imageIndexRef.current;\n if (index === null) return;\n if (x < clientX) {\n setImageIndex(index > 0 ? index - 1 : urls.length - 1);\n } else {\n setImageIndex(index < urls.length - 1 ? index + 1 : 0);\n }\n startTouchPosRef.current = null;\n },\n [urls.length]\n );\n\n const touchEndHandler = useCallback<\n TouchEventHandler<HTMLDivElement>\n >(() => {\n startTouchPosRef.current = null;\n }, []);\n\n const handlers = useMemo(() => {\n if (isTouchDevice()) {\n return {\n onTouchStart: touchStartHandler,\n onTouchMove: touchMoveHandler,\n onTouchEnd: touchEndHandler,\n };\n }\n return {\n onMouseMove: mouseMoveHandler,\n };\n }, [\n mouseMoveHandler,\n touchEndHandler,\n touchMoveHandler,\n touchStartHandler,\n ]);\n\n return (\n <ThemeOverrider activeTheme='dark'>\n <Container\n heightPercent={heightPercent}\n {...handlers}\n {...rest}\n ref={mergedContainerRef}\n >\n <StyledImage url={imageUrl} {...imageProps} />\n {urls.length > 1 && (\n <>\n {imageIndex !== null && (\n <GalleryStatus\n count={urls.length}\n current={imageIndex}\n height={statusHeight}\n />\n )}\n {help && <GalleryHelp>{help}</GalleryHelp>}\n </>\n )}\n {children}\n </Container>\n </ThemeOverrider>\n );\n }\n);\n\nexport default Gallery;\n"],"mappings":"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"}
1
+ {"version":3,"file":"index.js","names":["styled","Left","Right","clr","ThemeOverrider","isTouchDevice","omitEmotionProps","useForwardedRef","useSize","React","forwardRef","useCallback","useEffect","useMemo","useRef","useState","Button","Image","GalleryStatus","Container","p","heightPercent","theme","galleryColorBg","borderRadius","StyledImage","NavButton","LeftButton","RightButton","MIN_DIST_PX","MAX_ANGLE","Gallery","urls","aspectRatio","imageProps","hideArrows","children","rest","ref","innerContainerRef","mergedContainerRef","imageUrl","setImageUrl","undefined","imageIndex","setImageIndex","length","Math","round","imageIndexRef","current","startTouchPosRef","size","sizeRef","statusHeight","height","updateGalleryImage","clientX","x","getBoundingClientRect","widthPerImage","width","xPos","nextIndex","floor","prev","index","next","left","e","preventDefault","right","mouseMoveHandler","touchStartHandler","clientY","touches","y","touchMoveHandler","diffX","abs","diffY","diff","sqrt","angle","atan","PI","touchEndHandler","handlers","onTouchStart","onTouchMove","onTouchEnd","onMouseMove","colorPrimary"],"sources":["../../../src/Gallery/index.tsx"],"sourcesContent":["import styled from '@emotion/styled';\nimport { Left, Right } from '@os-design/icons';\nimport { clr, ThemeOverrider } from '@os-design/theming';\nimport {\n isTouchDevice,\n omitEmotionProps,\n useForwardedRef,\n useSize,\n} from '@os-design/utils';\nimport React, {\n forwardRef,\n MouseEventHandler,\n TouchEventHandler,\n useCallback,\n useEffect,\n useMemo,\n useRef,\n useState,\n} from 'react';\nimport Button from '../Button';\nimport Image, { ImageProps } from '../Image';\nimport GalleryStatus from './Status';\n\ninterface ContainerProps {\n heightPercent: number;\n}\nconst Container = styled(\n 'div',\n omitEmotionProps('heightPercent')\n)<ContainerProps>`\n position: relative;\n padding-bottom: ${(p) => p.heightPercent}%;\n\n display: flex;\n justify-content: center;\n\n background-color: ${(p) => clr(p.theme.galleryColorBg)};\n border-radius: ${(p) => p.theme.borderRadius}em;\n overflow: hidden;\n`;\n\nconst StyledImage = styled(Image)`\n position: absolute;\n width: auto;\n height: 100%;\n border-radius: 0;\n`;\n\nconst NavButton = styled(Button)`\n position: absolute;\n top: 50%;\n transform: translateY(-50%);\n\n background-color: hsla(0, 0%, 0%, 0.5);\n backdrop-filter: blur(0.2em);\n`;\n\nconst LeftButton = styled(NavButton)`\n left: 0.2em;\n`;\n\nconst RightButton = styled(NavButton)`\n right: 0.2em;\n`;\n\ntype JsxDivProps = Omit<JSX.IntrinsicElements['div'], 'ref'>;\nexport interface GalleryProps extends JsxDivProps {\n /**\n * The image urls.\n */\n urls: string[] | ReadonlyArray<string>;\n /**\n * The aspect ratio of the gallery.\n * E.g. [16,9] – 16:9.\n */\n aspectRatio?: [number, number];\n /**\n * The props of the image component.\n */\n imageProps?: Omit<ImageProps, 'url'>;\n /**\n * Whether the navigation buttons is shown.\n */\n hideArrows?: boolean;\n /**\n * The children that can be displayed on top of the image.\n * E.g. tags.\n */\n children?: React.ReactNode;\n}\n\nconst MIN_DIST_PX = 30;\nconst MAX_ANGLE = 30;\n\n/**\n * The image gallery. Change the cursor/touch position to change images.\n * The lib 'lazysizes/plugins/attrchange/ls.attrchange' must be imported.\n */\nconst Gallery = forwardRef<HTMLDivElement, GalleryProps>(\n (\n {\n urls,\n aspectRatio = [16, 9],\n imageProps = {},\n hideArrows = false,\n children,\n ...rest\n },\n ref\n ) => {\n const [innerContainerRef, mergedContainerRef] = useForwardedRef(ref);\n\n const [imageUrl, setImageUrl] = useState<string | undefined>(undefined);\n const [imageIndex, setImageIndex] = useState(urls.length > 0 ? 0 : null);\n\n const heightPercent = useMemo(\n () => Math.round((aspectRatio[1] / aspectRatio[0]) * 1000000) / 10000,\n [aspectRatio]\n );\n\n const imageIndexRef = useRef(imageIndex);\n useEffect(() => {\n imageIndexRef.current = imageIndex;\n }, [imageIndex]);\n\n // Update the image if the index was changed\n useEffect(() => {\n setImageUrl(imageIndex !== null ? urls[imageIndex] : undefined);\n }, [imageIndex, urls]);\n\n const startTouchPosRef = useRef<{ x: number; y: number } | null>(null);\n\n const size = useSize(innerContainerRef);\n const sizeRef = useRef(size);\n useEffect(() => {\n sizeRef.current = size;\n }, [size]);\n\n const statusHeight = useMemo(\n () => Math.round(size.height / 70),\n [size.height]\n );\n\n const updateGalleryImage = useCallback(\n (clientX: number) => {\n if (!innerContainerRef.current) return;\n const { x } = innerContainerRef.current.getBoundingClientRect();\n const widthPerImage = sizeRef.current.width / urls.length;\n const xPos = clientX - x;\n if (xPos < 0) return;\n const nextIndex = Math.floor(xPos / widthPerImage);\n if (imageIndexRef.current !== nextIndex) {\n setImageIndex(nextIndex);\n }\n },\n [innerContainerRef, urls.length]\n );\n\n const prev = useCallback(() => {\n const index = imageIndexRef.current;\n if (index === null) return;\n setImageIndex(index > 0 ? index - 1 : urls.length - 1);\n }, [urls.length]);\n\n const next = useCallback(() => {\n const index = imageIndexRef.current;\n if (index === null) return;\n setImageIndex(index < urls.length - 1 ? index + 1 : 0);\n }, [urls.length]);\n\n const left = useCallback<MouseEventHandler>(\n (e) => {\n prev();\n e.preventDefault();\n },\n [prev]\n );\n\n const right = useCallback<MouseEventHandler>(\n (e) => {\n next();\n e.preventDefault();\n },\n [next]\n );\n\n const mouseMoveHandler = useCallback<MouseEventHandler<HTMLDivElement>>(\n (e) => updateGalleryImage(e.clientX),\n [updateGalleryImage]\n );\n\n const touchStartHandler = useCallback<TouchEventHandler<HTMLDivElement>>(\n (e) => {\n const { clientX, clientY } = e.touches[0];\n startTouchPosRef.current = { x: clientX, y: clientY };\n },\n []\n );\n\n const touchMoveHandler = useCallback<TouchEventHandler<HTMLDivElement>>(\n (e) => {\n if (!startTouchPosRef.current) return;\n const { x, y } = startTouchPosRef.current;\n const { clientX, clientY } = e.touches[0];\n const diffX = Math.abs(x - clientX);\n const diffY = Math.abs(y - clientY);\n const diff = Math.sqrt(diffX ** 2 + diffY ** 2);\n if (diff < MIN_DIST_PX) return;\n const angle = (Math.atan(diffY / diffX) * 180) / Math.PI;\n if (angle > MAX_ANGLE) {\n startTouchPosRef.current = null;\n return;\n }\n if (x < clientX) prev();\n else next();\n startTouchPosRef.current = null;\n },\n [next, prev]\n );\n\n const touchEndHandler = useCallback<\n TouchEventHandler<HTMLDivElement>\n >(() => {\n startTouchPosRef.current = null;\n }, []);\n\n const handlers = useMemo(() => {\n if (isTouchDevice()) {\n return {\n onTouchStart: touchStartHandler,\n onTouchMove: touchMoveHandler,\n onTouchEnd: touchEndHandler,\n };\n }\n return {\n onMouseMove: mouseMoveHandler,\n };\n }, [\n mouseMoveHandler,\n touchEndHandler,\n touchMoveHandler,\n touchStartHandler,\n ]);\n\n return (\n <ThemeOverrider activeTheme='dark'>\n <Container\n heightPercent={heightPercent}\n {...handlers}\n {...rest}\n ref={mergedContainerRef}\n >\n <StyledImage url={imageUrl} {...imageProps} />\n {urls.length > 1 && imageIndex !== null && (\n <>\n <GalleryStatus\n count={urls.length}\n current={imageIndex}\n height={statusHeight}\n />\n {isTouchDevice() && !hideArrows && (\n <ThemeOverrider overrides={{ colorPrimary: [0, 0, 100] }}>\n <LeftButton\n type='ghost'\n wide='never'\n size='small'\n onClick={left}\n >\n <Left />\n </LeftButton>\n <RightButton\n type='ghost'\n wide='never'\n size='small'\n onClick={right}\n >\n <Right />\n </RightButton>\n </ThemeOverrider>\n )}\n </>\n )}\n {children}\n </Container>\n </ThemeOverrider>\n );\n }\n);\n\nexport default Gallery;\n"],"mappings":"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"}
@@ -4,8 +4,8 @@ declare type JsxDivProps = Omit<JSX.IntrinsicElements['div'], 'ref'>;
4
4
  export interface GalleryProps extends JsxDivProps {
5
5
  urls: string[] | ReadonlyArray<string>;
6
6
  aspectRatio?: [number, number];
7
- help?: string;
8
7
  imageProps?: Omit<ImageProps, 'url'>;
8
+ hideArrows?: boolean;
9
9
  children?: React.ReactNode;
10
10
  }
11
11
  declare const Gallery: React.ForwardRefExoticComponent<GalleryProps & React.RefAttributes<HTMLDivElement>>;
@@ -1 +1 @@
1
- {"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../../../src/Gallery/index.tsx"],"names":[],"mappings":"AAQA,OAAO,KASN,MAAM,OAAO,CAAC;AACf,OAAc,EAAE,UAAU,EAAE,MAAM,UAAU,CAAC;AA4C7C,aAAK,WAAW,GAAG,IAAI,CAAC,GAAG,CAAC,iBAAiB,CAAC,KAAK,CAAC,EAAE,KAAK,CAAC,CAAC;AAC7D,MAAM,WAAW,YAAa,SAAQ,WAAW;IAI/C,IAAI,EAAE,MAAM,EAAE,GAAG,aAAa,CAAC,MAAM,CAAC,CAAC;IAKvC,WAAW,CAAC,EAAE,CAAC,MAAM,EAAE,MAAM,CAAC,CAAC;IAI/B,IAAI,CAAC,EAAE,MAAM,CAAC;IAId,UAAU,CAAC,EAAE,IAAI,CAAC,UAAU,EAAE,KAAK,CAAC,CAAC;IAKrC,QAAQ,CAAC,EAAE,KAAK,CAAC,SAAS,CAAC;CAC5B;AASD,QAAA,MAAM,OAAO,qFA8IZ,CAAC;AAEF,eAAe,OAAO,CAAC"}
1
+ {"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../../../src/Gallery/index.tsx"],"names":[],"mappings":"AASA,OAAO,KASN,MAAM,OAAO,CAAC;AAEf,OAAc,EAAE,UAAU,EAAE,MAAM,UAAU,CAAC;AA6C7C,aAAK,WAAW,GAAG,IAAI,CAAC,GAAG,CAAC,iBAAiB,CAAC,KAAK,CAAC,EAAE,KAAK,CAAC,CAAC;AAC7D,MAAM,WAAW,YAAa,SAAQ,WAAW;IAI/C,IAAI,EAAE,MAAM,EAAE,GAAG,aAAa,CAAC,MAAM,CAAC,CAAC;IAKvC,WAAW,CAAC,EAAE,CAAC,MAAM,EAAE,MAAM,CAAC,CAAC;IAI/B,UAAU,CAAC,EAAE,IAAI,CAAC,UAAU,EAAE,KAAK,CAAC,CAAC;IAIrC,UAAU,CAAC,EAAE,OAAO,CAAC;IAKrB,QAAQ,CAAC,EAAE,KAAK,CAAC,SAAS,CAAC;CAC5B;AASD,QAAA,MAAM,OAAO,qFA6LZ,CAAC;AAEF,eAAe,OAAO,CAAC"}
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "@os-design/core",
3
- "version": "1.0.153",
3
+ "version": "1.0.155",
4
4
  "license": "UNLICENSED",
5
5
  "repository": "git@gitlab.com:os-team/libs/os-design.git",
6
6
  "main": "dist/cjs/index.js",
@@ -57,5 +57,5 @@
57
57
  "react": ">=18",
58
58
  "react-dom": ">=18"
59
59
  },
60
- "gitHead": "8d32820f40f43f64be2bf85f60973d358be83c1d"
60
+ "gitHead": "6a20787859c841939fcec9f90aa7826344974f3f"
61
61
  }