@lumx/react 3.10.1-alpha.1 → 3.10.1-alpha.2
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/_internal/17c3ea1d.js +137 -0
- package/_internal/17c3ea1d.js.map +1 -0
- package/_internal/1da25128.js +411 -0
- package/_internal/1da25128.js.map +1 -0
- package/_internal/230173a8.js +13 -0
- package/_internal/230173a8.js.map +1 -0
- package/_internal/23bdba2d.js +71 -0
- package/_internal/23bdba2d.js.map +1 -0
- package/_internal/26926e5c.d.ts +36 -0
- package/_internal/2a3d237c.js +12 -0
- package/_internal/2a3d237c.js.map +1 -0
- package/_internal/2c5dbb03.js +26 -0
- package/_internal/2c5dbb03.js.map +1 -0
- package/_internal/2e2abe51.js +2154 -0
- package/_internal/2e2abe51.js.map +1 -0
- package/_internal/31490c59.d.ts +167 -0
- package/_internal/3181f000.js +14 -0
- package/_internal/3181f000.js.map +1 -0
- package/_internal/35f100be.d.ts +104 -0
- package/_internal/36bd7352.js +219 -0
- package/_internal/36bd7352.js.map +1 -0
- package/_internal/3a1facc0.js +18 -0
- package/_internal/3a1facc0.js.map +1 -0
- package/_internal/4c20d932.js +89 -0
- package/_internal/4c20d932.js.map +1 -0
- package/_internal/4c28d012.js +305 -0
- package/_internal/4c28d012.js.map +1 -0
- package/_internal/4cd0bf32.js +160 -0
- package/_internal/4cd0bf32.js.map +1 -0
- package/_internal/4daccdd5.js +25 -0
- package/_internal/4daccdd5.js.map +1 -0
- package/_internal/524b1d04.js +64 -0
- package/_internal/524b1d04.js.map +1 -0
- package/_internal/53c94227.js +123 -0
- package/_internal/53c94227.js.map +1 -0
- package/_internal/54d9ded5.js +418 -0
- package/_internal/54d9ded5.js.map +1 -0
- package/_internal/56aec41b.js +652 -0
- package/_internal/56aec41b.js.map +1 -0
- package/_internal/5720caf5.js +124 -0
- package/_internal/5720caf5.js.map +1 -0
- package/_internal/646f0db6.js +113 -0
- package/_internal/646f0db6.js.map +1 -0
- package/_internal/6cc8dca8.d.ts +22 -0
- package/_internal/7f022f8c.d.ts +34 -0
- package/_internal/{index.d.ts → 8d67e1e3.d.ts} +1 -1
- package/_internal/b8f2948d.js +691 -0
- package/_internal/b8f2948d.js.map +1 -0
- package/_internal/bc28d510.js +784 -0
- package/_internal/bc28d510.js.map +1 -0
- package/_internal/c68d24e4.js +145 -0
- package/_internal/c68d24e4.js.map +1 -0
- package/_internal/c6c99f76.js +105 -0
- package/_internal/c6c99f76.js.map +1 -0
- package/_internal/cae46566.js +65 -0
- package/_internal/cae46566.js.map +1 -0
- package/_internal/components/alert-dialog/index.ts-623b1ed3.d.ts +37 -0
- package/_internal/components/alert-dialog/index.ts-f83bd6ef.js +148 -0
- package/_internal/components/alert-dialog/index.ts-f83bd6ef.js.map +1 -0
- package/_internal/components/autocomplete/index.ts-3f8f125c.js +264 -0
- package/_internal/components/autocomplete/index.ts-3f8f125c.js.map +1 -0
- package/_internal/components/autocomplete/index.ts-8d6b123f.d.ts +201 -0
- package/_internal/components/avatar/index.ts-93ee0ea9.js +89 -0
- package/_internal/components/avatar/index.ts-93ee0ea9.js.map +1 -0
- package/_internal/components/avatar/index.ts-f92852b4.d.ts +43 -0
- package/_internal/components/badge/index.ts-2d7700ef.d.ts +30 -0
- package/_internal/components/badge/index.ts-6753d67f.js +88 -0
- package/_internal/components/badge/index.ts-6753d67f.js.map +1 -0
- package/_internal/components/button/index.ts-031307ce.js +51 -0
- package/_internal/components/button/index.ts-031307ce.js.map +1 -0
- package/_internal/components/button/index.ts-b29e26a4.d.ts +22 -0
- package/_internal/components/checkbox/index.ts-a33166d7.js +127 -0
- package/_internal/components/checkbox/index.ts-a33166d7.js.map +1 -0
- package/_internal/components/checkbox/index.ts-f82358ff.d.ts +38 -0
- package/_internal/components/chip/index.ts-4a91f1a7.d.ts +68 -0
- package/_internal/components/chip/index.ts-a2b5b771.js +110 -0
- package/_internal/components/chip/index.ts-a2b5b771.js.map +1 -0
- package/_internal/components/comment-block/index.ts-58fa051a.js +121 -0
- package/_internal/components/comment-block/index.ts-58fa051a.js.map +1 -0
- package/_internal/components/comment-block/index.ts-8cfa5af0.d.ts +67 -0
- package/_internal/components/date-picker/index.ts-145262d5.js +2 -0
- package/_internal/components/date-picker/index.ts-145262d5.js.map +1 -0
- package/_internal/components/date-picker/index.ts-70a34fa7.d.ts +95 -0
- package/_internal/components/dialog/index.ts-ea044db2.js +224 -0
- package/_internal/components/dialog/index.ts-ea044db2.js.map +1 -0
- package/_internal/components/dialog/index.ts-eca28654.d.ts +55 -0
- package/_internal/components/divider/index.ts-4a56db75.js +55 -0
- package/_internal/components/divider/index.ts-4a56db75.js.map +1 -0
- package/_internal/components/divider/index.ts-b011d8ca.d.ts +18 -0
- package/_internal/components/drag-handle/index.ts-0aebf92f.js +54 -0
- package/_internal/components/drag-handle/index.ts-0aebf92f.js.map +1 -0
- package/_internal/components/drag-handle/index.ts-3ab31dd1.d.ts +18 -0
- package/_internal/components/dropdown/index.ts-2a17db51.js +154 -0
- package/_internal/components/dropdown/index.ts-2a17db51.js.map +1 -0
- package/_internal/components/dropdown/index.ts-b648a15c.d.ts +87 -0
- package/_internal/components/expansion-panel/index.ts-69f09f5b.d.ts +38 -0
- package/_internal/components/expansion-panel/index.ts-fae3762e.js +143 -0
- package/_internal/components/expansion-panel/index.ts-fae3762e.js.map +1 -0
- package/_internal/components/flag/index.ts-8dcd685b.js +56 -0
- package/_internal/components/flag/index.ts-8dcd685b.js.map +1 -0
- package/_internal/components/flag/index.ts-fda89adb.d.ts +23 -0
- package/_internal/components/flex-box/index.ts-87f2b58d.d.ts +43 -0
- package/_internal/components/flex-box/index.ts-c216e957.js +60 -0
- package/_internal/components/flex-box/index.ts-c216e957.js.map +1 -0
- package/_internal/components/generic-block/index.ts-999a62a4.js +115 -0
- package/_internal/components/generic-block/index.ts-999a62a4.js.map +1 -0
- package/_internal/components/generic-block/index.ts-cd3b0e21.d.ts +106 -0
- package/_internal/components/grid/index.ts-67e0694f.d.ts +50 -0
- package/_internal/components/grid/index.ts-fdf1b306.js +113 -0
- package/_internal/components/grid/index.ts-fdf1b306.js.map +1 -0
- package/_internal/components/grid-column/index.ts-97c61cbe.js +64 -0
- package/_internal/components/grid-column/index.ts-97c61cbe.js.map +1 -0
- package/_internal/components/grid-column/index.ts-c89e1c18.d.ts +31 -0
- package/_internal/components/heading/index.ts-0179e9a9.js +112 -0
- package/_internal/components/heading/index.ts-0179e9a9.js.map +1 -0
- package/_internal/components/heading/index.ts-587579e8.d.ts +37 -0
- package/_internal/components/icon/index.ts-740ca1de.js +2 -0
- package/_internal/components/icon/index.ts-740ca1de.js.map +1 -0
- package/_internal/components/icon/index.ts-b3fa5e15.d.ts +34 -0
- package/_internal/components/image-block/index.ts-36b3828f.d.ts +49 -0
- package/_internal/components/image-block/index.ts-ef5e2e7d.js +111 -0
- package/_internal/components/image-block/index.ts-ef5e2e7d.js.map +1 -0
- package/_internal/components/image-lightbox/index.ts-137f85a8.js +765 -0
- package/_internal/components/image-lightbox/index.ts-137f85a8.js.map +1 -0
- package/_internal/components/image-lightbox/index.ts-2cb92d18.d.ts +75 -0
- package/_internal/components/inline-list/index.ts-033dd358.js +76 -0
- package/_internal/components/inline-list/index.ts-033dd358.js.map +1 -0
- package/_internal/components/inline-list/index.ts-e1c8a3ff.d.ts +34 -0
- package/_internal/components/input-helper/index.ts-32a9ca90.d.ts +22 -0
- package/_internal/components/input-helper/index.ts-ab3a1ef5.js +75 -0
- package/_internal/components/input-helper/index.ts-ab3a1ef5.js.map +1 -0
- package/_internal/components/input-label/index.ts-86f2ea41.d.ts +24 -0
- package/_internal/components/input-label/index.ts-d6ca5569.js +60 -0
- package/_internal/components/input-label/index.ts-d6ca5569.js.map +1 -0
- package/_internal/components/lightbox/index.ts-5370e8e6.d.ts +36 -0
- package/_internal/components/lightbox/index.ts-7a16cdc7.js +149 -0
- package/_internal/components/lightbox/index.ts-7a16cdc7.js.map +1 -0
- package/_internal/components/link/index.ts-26435006.d.ts +37 -0
- package/_internal/components/link/index.ts-d04f4e53.js +120 -0
- package/_internal/components/link/index.ts-d04f4e53.js.map +1 -0
- package/_internal/components/link-preview/index.ts-e560a274.d.ts +36 -0
- package/_internal/components/link-preview/index.ts-fee89f66.js +109 -0
- package/_internal/components/link-preview/index.ts-fee89f66.js.map +1 -0
- package/_internal/components/list/index.ts-ab57902e.d.ts +118 -0
- package/_internal/components/list/index.ts-f3101625.js +86 -0
- package/_internal/components/list/index.ts-f3101625.js.map +1 -0
- package/_internal/components/message/index.ts-041cf0cb.js +97 -0
- package/_internal/components/message/index.ts-041cf0cb.js.map +1 -0
- package/_internal/components/message/index.ts-2d38e0ea.d.ts +37 -0
- package/_internal/components/mosaic/index.ts-232d5aed.d.ts +23 -0
- package/_internal/components/mosaic/index.ts-d2128cd3.js +94 -0
- package/_internal/components/mosaic/index.ts-d2128cd3.js.map +1 -0
- package/_internal/components/navigation/index.ts-6d8bea53.d.ts +58 -0
- package/_internal/components/navigation/index.ts-e8dc0a7f.js +222 -0
- package/_internal/components/navigation/index.ts-e8dc0a7f.js.map +1 -0
- package/_internal/components/notification/index.ts-235fd340.js +140 -0
- package/_internal/components/notification/index.ts-235fd340.js.map +1 -0
- package/_internal/components/notification/index.ts-bb3f03f6.d.ts +34 -0
- package/_internal/components/popover/index.ts-2f17a9b6.js +3 -0
- package/_internal/components/popover/index.ts-2f17a9b6.js.map +1 -0
- package/_internal/components/popover/index.ts-e3b4ff19.d.ts +66 -0
- package/_internal/components/post-block/index.ts-0acb9bb4.js +101 -0
- package/_internal/components/post-block/index.ts-0acb9bb4.js.map +1 -0
- package/_internal/components/post-block/index.ts-9b8ff90b.d.ts +41 -0
- package/_internal/components/progress/index.ts-2a713859.js +189 -0
- package/_internal/components/progress/index.ts-2a713859.js.map +1 -0
- package/_internal/components/progress/index.ts-dfdfa5fb.d.ts +60 -0
- package/_internal/components/progress-tracker/index.ts-2649f756.js +312 -0
- package/_internal/components/progress-tracker/index.ts-2649f756.js.map +1 -0
- package/_internal/components/progress-tracker/index.ts-95320f32.d.ts +101 -0
- package/_internal/components/radio-button/index.ts-5eaab4cf.d.ts +54 -0
- package/_internal/components/radio-button/index.ts-b4dfb2a0.js +150 -0
- package/_internal/components/radio-button/index.ts-b4dfb2a0.js.map +1 -0
- package/_internal/components/select/index.ts-a65e3507.d.ts +91 -0
- package/_internal/components/select/index.ts-e8fad28b.js +257 -0
- package/_internal/components/select/index.ts-e8fad28b.js.map +1 -0
- package/_internal/components/side-navigation/index.ts-3f5f3785.d.ts +60 -0
- package/_internal/components/side-navigation/index.ts-c9a5fc3e.js +184 -0
- package/_internal/components/side-navigation/index.ts-c9a5fc3e.js.map +1 -0
- package/_internal/components/skeleton/index.ts-a7daefac.d.ts +75 -0
- package/_internal/components/skeleton/index.ts-ffc995af.js +179 -0
- package/_internal/components/skeleton/index.ts-ffc995af.js.map +1 -0
- package/_internal/components/slider/index.ts-24a0d598.d.ts +52 -0
- package/_internal/components/slider/index.ts-72aadf4c.js +308 -0
- package/_internal/components/slider/index.ts-72aadf4c.js.map +1 -0
- package/_internal/components/slideshow/index.ts-c99f2892.js +151 -0
- package/_internal/components/slideshow/index.ts-c99f2892.js.map +1 -0
- package/_internal/components/slideshow/index.ts-e49462c6.d.ts +25 -0
- package/_internal/components/switch/index.ts-207ba52b.d.ts +34 -0
- package/_internal/components/switch/index.ts-542e6eaf.js +115 -0
- package/_internal/components/switch/index.ts-542e6eaf.js.map +1 -0
- package/_internal/components/table/index.ts-905ce390.js +310 -0
- package/_internal/components/table/index.ts-905ce390.js.map +1 -0
- package/_internal/components/table/index.ts-c4f39b2d.d.ts +108 -0
- package/_internal/components/tabs/index.ts-713119f4.js +289 -0
- package/_internal/components/tabs/index.ts-713119f4.js.map +1 -0
- package/_internal/components/tabs/index.ts-dbfc48d9.d.ts +106 -0
- package/_internal/components/text/index.ts-6afbe8cd.js +2 -0
- package/_internal/components/text/index.ts-6afbe8cd.js.map +1 -0
- package/_internal/components/text/index.ts-8a812048.d.ts +53 -0
- package/_internal/components/text-field/index.ts-92e6b3b3.d.ts +77 -0
- package/_internal/components/text-field/index.ts-c3be8563.js +341 -0
- package/_internal/components/text-field/index.ts-c3be8563.js.map +1 -0
- package/_internal/components/thumbnail/index.ts-16d7b403.js +40 -0
- package/_internal/components/thumbnail/index.ts-16d7b403.js.map +1 -0
- package/_internal/components/thumbnail/index.ts-1b6c0b48.d.ts +8 -0
- package/_internal/components/toolbar/index.ts-813b902e.js +63 -0
- package/_internal/components/toolbar/index.ts-813b902e.js.map +1 -0
- package/_internal/components/toolbar/index.ts-9f5129d1.d.ts +24 -0
- package/_internal/components/tooltip/index.ts-905c847c.js +322 -0
- package/_internal/components/tooltip/index.ts-905c847c.js.map +1 -0
- package/_internal/components/tooltip/index.ts-c6931e9e.d.ts +35 -0
- package/_internal/components/uploader/index.ts-31f21c2a.js +132 -0
- package/_internal/components/uploader/index.ts-31f21c2a.js.map +1 -0
- package/_internal/components/uploader/index.ts-c3ccba98.d.ts +51 -0
- package/_internal/components/user-block/index.ts-18c58e19.d.ts +50 -0
- package/_internal/components/user-block/index.ts-d43e5f3c.js +136 -0
- package/_internal/components/user-block/index.ts-d43e5f3c.js.map +1 -0
- package/_internal/dc3e28c8.d.ts +38 -0
- package/_internal/f39a1ba4.js +73 -0
- package/_internal/f39a1ba4.js.map +1 -0
- package/_internal/f3e77e3e.js +22 -0
- package/_internal/f3e77e3e.js.map +1 -0
- package/_internal/f502ab30.js +78 -0
- package/_internal/f502ab30.js.map +1 -0
- package/_internal/f52adbae.js +36 -0
- package/_internal/f52adbae.js.map +1 -0
- package/_internal/f57e1239.js +205 -0
- package/_internal/f57e1239.js.map +1 -0
- package/_internal/f5ff1aa4.d.ts +47 -0
- package/_internal/fb975afe.js +52 -0
- package/_internal/fb975afe.js.map +1 -0
- package/index.d.ts +66 -3023
- package/index.js +64 -14536
- package/index.js.map +1 -1
- package/package.json +3 -3
- package/utils/index.d.ts +1 -1
|
@@ -0,0 +1,305 @@
|
|
|
1
|
+
import { f as AspectRatio, h as getRootClassName, i as forwardRef, T as Theme, j as _objectWithoutProperties, k as _objectSpread2, _ as _extends, g as classNames, S as Size } from './1da25128.js';
|
|
2
|
+
import React__default, { useState, useEffect, useMemo } from 'react';
|
|
3
|
+
import { u as useMergeRefs } from './f52adbae.js';
|
|
4
|
+
import { u as useTheme } from './3181f000.js';
|
|
5
|
+
import { h as handleBasicClasses } from './f57e1239.js';
|
|
6
|
+
import { I as Icon, m as mdiImageBroken } from './c6c99f76.js';
|
|
7
|
+
|
|
8
|
+
function getState(img, event) {
|
|
9
|
+
// Error event occurred or image has no source.
|
|
10
|
+
if ((event === null || event === void 0 ? void 0 : event.type) === 'error' || img !== null && img !== void 0 && img.complete && !img.getAttribute('src')) {
|
|
11
|
+
return 'hasError';
|
|
12
|
+
}
|
|
13
|
+
// Image is undefined or incomplete.
|
|
14
|
+
if (!img || !img.complete) {
|
|
15
|
+
return 'isLoading';
|
|
16
|
+
}
|
|
17
|
+
// Else loaded.
|
|
18
|
+
return 'isLoaded';
|
|
19
|
+
}
|
|
20
|
+
function useImageLoad(imageURL, imgRef) {
|
|
21
|
+
const [state, setState] = useState(getState(imgRef));
|
|
22
|
+
|
|
23
|
+
// Update state when changing image URL or DOM reference.
|
|
24
|
+
useEffect(() => {
|
|
25
|
+
setState(getState(imgRef));
|
|
26
|
+
}, [imageURL, imgRef]);
|
|
27
|
+
|
|
28
|
+
// Listen to `load` and `error` event on image
|
|
29
|
+
useEffect(() => {
|
|
30
|
+
const img = imgRef;
|
|
31
|
+
if (!img) return undefined;
|
|
32
|
+
const update = event => setState(getState(img, event));
|
|
33
|
+
img.addEventListener('load', update);
|
|
34
|
+
img.addEventListener('error', update);
|
|
35
|
+
return () => {
|
|
36
|
+
img.removeEventListener('load', update);
|
|
37
|
+
img.removeEventListener('error', update);
|
|
38
|
+
};
|
|
39
|
+
}, [imgRef, imgRef === null || imgRef === void 0 ? void 0 : imgRef.src]);
|
|
40
|
+
return state;
|
|
41
|
+
}
|
|
42
|
+
|
|
43
|
+
// Calculate shift to center the focus point in the container.
|
|
44
|
+
function shiftPosition(_ref) {
|
|
45
|
+
let {
|
|
46
|
+
scale,
|
|
47
|
+
focusPoint,
|
|
48
|
+
imageSize,
|
|
49
|
+
containerSize
|
|
50
|
+
} = _ref;
|
|
51
|
+
const scaledSize = imageSize / scale;
|
|
52
|
+
if (scaledSize === containerSize) return 0;
|
|
53
|
+
const scaledFocusHeight = focusPoint * scaledSize;
|
|
54
|
+
const startFocus = scaledFocusHeight - containerSize / 2;
|
|
55
|
+
const shift = startFocus / (scaledSize - containerSize);
|
|
56
|
+
return Math.floor(Math.max(Math.min(shift, 1), 0) * 100);
|
|
57
|
+
}
|
|
58
|
+
|
|
59
|
+
// Compute CSS properties to apply the focus point.
|
|
60
|
+
const useFocusPointStyle = (_ref2, element, isLoaded) => {
|
|
61
|
+
let {
|
|
62
|
+
image,
|
|
63
|
+
aspectRatio,
|
|
64
|
+
focusPoint,
|
|
65
|
+
imgProps: {
|
|
66
|
+
width,
|
|
67
|
+
height
|
|
68
|
+
} = {}
|
|
69
|
+
} = _ref2;
|
|
70
|
+
// Get natural image size from imgProps or img element.
|
|
71
|
+
const imageSize = useMemo(() => {
|
|
72
|
+
// Focus point is not applicable => exit early
|
|
73
|
+
if (!image || aspectRatio === AspectRatio.original || !(focusPoint !== null && focusPoint !== void 0 && focusPoint.x) && !(focusPoint !== null && focusPoint !== void 0 && focusPoint.y)) return undefined;
|
|
74
|
+
if (typeof width === 'number' && typeof height === 'number') return {
|
|
75
|
+
width,
|
|
76
|
+
height
|
|
77
|
+
};
|
|
78
|
+
if (element && isLoaded) return {
|
|
79
|
+
width: element.naturalWidth,
|
|
80
|
+
height: element.naturalHeight
|
|
81
|
+
};
|
|
82
|
+
return undefined;
|
|
83
|
+
}, [aspectRatio, element, focusPoint === null || focusPoint === void 0 ? void 0 : focusPoint.x, focusPoint === null || focusPoint === void 0 ? void 0 : focusPoint.y, height, image, isLoaded, width]);
|
|
84
|
+
|
|
85
|
+
// Get container size (dependant on imageSize).
|
|
86
|
+
const [containerSize, setContainerSize] = useState(undefined);
|
|
87
|
+
useEffect(function updateContainerSize() {
|
|
88
|
+
const cWidth = element === null || element === void 0 ? void 0 : element.offsetWidth;
|
|
89
|
+
const cHeight = element === null || element === void 0 ? void 0 : element.offsetHeight;
|
|
90
|
+
if (cWidth && cHeight) {
|
|
91
|
+
// Update only if needed.
|
|
92
|
+
setContainerSize(oldContainerSize => (oldContainerSize === null || oldContainerSize === void 0 ? void 0 : oldContainerSize.width) === cWidth && oldContainerSize.height === cHeight ? oldContainerSize : {
|
|
93
|
+
width: cWidth,
|
|
94
|
+
height: cHeight
|
|
95
|
+
});
|
|
96
|
+
} else if (imageSize) {
|
|
97
|
+
// Wait for a render (in case the container size is dependent on the image size).
|
|
98
|
+
requestAnimationFrame(updateContainerSize);
|
|
99
|
+
}
|
|
100
|
+
}, [element === null || element === void 0 ? void 0 : element.offsetHeight, element === null || element === void 0 ? void 0 : element.offsetWidth, imageSize]);
|
|
101
|
+
|
|
102
|
+
// Compute style.
|
|
103
|
+
const [style, setStyle] = useState({});
|
|
104
|
+
useEffect(() => {
|
|
105
|
+
// Focus point is not applicable => exit early
|
|
106
|
+
if (!image || aspectRatio === AspectRatio.original || !(focusPoint !== null && focusPoint !== void 0 && focusPoint.x) && !(focusPoint !== null && focusPoint !== void 0 && focusPoint.y)) {
|
|
107
|
+
return;
|
|
108
|
+
}
|
|
109
|
+
if (!element || !imageSize) {
|
|
110
|
+
// Focus point can be computed but now right now (image size unknown).
|
|
111
|
+
setStyle({
|
|
112
|
+
visibility: 'hidden'
|
|
113
|
+
});
|
|
114
|
+
return;
|
|
115
|
+
}
|
|
116
|
+
if (!containerSize || !imageSize.height || !imageSize.width) {
|
|
117
|
+
// Missing container or image size abort focus point compute.
|
|
118
|
+
setStyle({});
|
|
119
|
+
return;
|
|
120
|
+
}
|
|
121
|
+
const heightScale = imageSize.height / containerSize.height;
|
|
122
|
+
const widthScale = imageSize.width / containerSize.width;
|
|
123
|
+
const scale = Math.min(widthScale, heightScale);
|
|
124
|
+
|
|
125
|
+
// Focus Y relative to the top (instead of the center)
|
|
126
|
+
const focusPointFromTop = Math.abs(((focusPoint === null || focusPoint === void 0 ? void 0 : focusPoint.y) || 0) - 1) / 2;
|
|
127
|
+
const y = shiftPosition({
|
|
128
|
+
scale,
|
|
129
|
+
focusPoint: focusPointFromTop,
|
|
130
|
+
imageSize: imageSize.height,
|
|
131
|
+
containerSize: containerSize.height
|
|
132
|
+
});
|
|
133
|
+
|
|
134
|
+
// Focus X relative to the left (instead of the center)
|
|
135
|
+
const focusPointFromLeft = Math.abs(((focusPoint === null || focusPoint === void 0 ? void 0 : focusPoint.x) || 0) + 1) / 2;
|
|
136
|
+
const x = shiftPosition({
|
|
137
|
+
scale,
|
|
138
|
+
focusPoint: focusPointFromLeft,
|
|
139
|
+
imageSize: imageSize.width,
|
|
140
|
+
containerSize: containerSize.width
|
|
141
|
+
});
|
|
142
|
+
const objectPosition = `${x}% ${y}%`;
|
|
143
|
+
// Update only if needed.
|
|
144
|
+
setStyle(oldStyle => oldStyle.objectPosition === objectPosition ? oldStyle : {
|
|
145
|
+
objectPosition
|
|
146
|
+
});
|
|
147
|
+
}, [aspectRatio, containerSize, element, focusPoint === null || focusPoint === void 0 ? void 0 : focusPoint.x, focusPoint === null || focusPoint === void 0 ? void 0 : focusPoint.y, image, imageSize]);
|
|
148
|
+
return style;
|
|
149
|
+
};
|
|
150
|
+
|
|
151
|
+
const _excluded = ["align", "alt", "aspectRatio", "badge", "className", "crossOrigin", "fallback", "fillHeight", "focusPoint", "image", "imgProps", "imgRef", "isLoading", "objectFit", "loading", "loadingPlaceholderImageRef", "size", "theme", "variant", "linkProps", "linkAs"];
|
|
152
|
+
|
|
153
|
+
/**
|
|
154
|
+
* Defines the props of the component.
|
|
155
|
+
*/
|
|
156
|
+
|
|
157
|
+
/**
|
|
158
|
+
* Component display name.
|
|
159
|
+
*/
|
|
160
|
+
const COMPONENT_NAME = 'Thumbnail';
|
|
161
|
+
|
|
162
|
+
/**
|
|
163
|
+
* Component default class name and class prefix.
|
|
164
|
+
*/
|
|
165
|
+
const CLASSNAME = getRootClassName(COMPONENT_NAME);
|
|
166
|
+
|
|
167
|
+
/**
|
|
168
|
+
* Component default props.
|
|
169
|
+
*/
|
|
170
|
+
const DEFAULT_PROPS = {
|
|
171
|
+
fallback: mdiImageBroken,
|
|
172
|
+
loading: 'lazy'
|
|
173
|
+
};
|
|
174
|
+
|
|
175
|
+
/**
|
|
176
|
+
* Thumbnail component.
|
|
177
|
+
*
|
|
178
|
+
* @param props Component props.
|
|
179
|
+
* @param ref Component ref.
|
|
180
|
+
* @return React element.
|
|
181
|
+
*/
|
|
182
|
+
const Thumbnail = forwardRef((props, ref) => {
|
|
183
|
+
var _loadingPlaceholderIm;
|
|
184
|
+
const defaultTheme = useTheme() || Theme.light;
|
|
185
|
+
const {
|
|
186
|
+
align,
|
|
187
|
+
alt,
|
|
188
|
+
aspectRatio = AspectRatio.original,
|
|
189
|
+
badge,
|
|
190
|
+
className,
|
|
191
|
+
crossOrigin,
|
|
192
|
+
fallback,
|
|
193
|
+
fillHeight,
|
|
194
|
+
// `focusPoint` needs to be here to remove it from `forwardedProps`.
|
|
195
|
+
// eslint-disable-next-line @typescript-eslint/no-unused-vars
|
|
196
|
+
focusPoint,
|
|
197
|
+
image,
|
|
198
|
+
imgProps,
|
|
199
|
+
imgRef: propImgRef,
|
|
200
|
+
isLoading: isLoadingProp,
|
|
201
|
+
objectFit,
|
|
202
|
+
loading,
|
|
203
|
+
loadingPlaceholderImageRef,
|
|
204
|
+
size,
|
|
205
|
+
theme = defaultTheme,
|
|
206
|
+
variant,
|
|
207
|
+
linkProps,
|
|
208
|
+
linkAs
|
|
209
|
+
} = props,
|
|
210
|
+
forwardedProps = _objectWithoutProperties(props, _excluded);
|
|
211
|
+
const [imgElement, setImgElement] = useState();
|
|
212
|
+
|
|
213
|
+
// Image loading state.
|
|
214
|
+
const loadingState = useImageLoad(image, imgElement);
|
|
215
|
+
const isLoaded = loadingState === 'isLoaded';
|
|
216
|
+
const isLoading = isLoadingProp || loadingState === 'isLoading';
|
|
217
|
+
const hasError = loadingState === 'hasError';
|
|
218
|
+
|
|
219
|
+
// Focus point.
|
|
220
|
+
const focusPointStyle = useFocusPointStyle(props, imgElement, isLoaded);
|
|
221
|
+
const hasIconErrorFallback = hasError && typeof fallback === 'string';
|
|
222
|
+
const hasCustomErrorFallback = hasError && !hasIconErrorFallback;
|
|
223
|
+
const imageErrorStyle = {};
|
|
224
|
+
if (hasIconErrorFallback) {
|
|
225
|
+
// Keep the image layout on icon fallback.
|
|
226
|
+
imageErrorStyle.visibility = 'hidden';
|
|
227
|
+
} else if (hasCustomErrorFallback) {
|
|
228
|
+
// Remove the image on custom fallback.
|
|
229
|
+
imageErrorStyle.display = 'none';
|
|
230
|
+
}
|
|
231
|
+
const isLink = Boolean((linkProps === null || linkProps === void 0 ? void 0 : linkProps.href) || linkAs);
|
|
232
|
+
const isButton = !!forwardedProps.onClick;
|
|
233
|
+
const isClickable = isButton || isLink;
|
|
234
|
+
let Wrapper = 'div';
|
|
235
|
+
const wrapperProps = _objectSpread2({}, forwardedProps);
|
|
236
|
+
if (isLink) {
|
|
237
|
+
Wrapper = linkAs || 'a';
|
|
238
|
+
Object.assign(wrapperProps, linkProps);
|
|
239
|
+
} else if (isButton) {
|
|
240
|
+
Wrapper = 'button';
|
|
241
|
+
wrapperProps.type = forwardedProps.type || 'button';
|
|
242
|
+
wrapperProps['aria-label'] = forwardedProps['aria-label'] || alt;
|
|
243
|
+
}
|
|
244
|
+
|
|
245
|
+
// If we have a loading placeholder image that is really loaded (complete)
|
|
246
|
+
const loadingPlaceholderImage = isLoading && (loadingPlaceholderImageRef === null || loadingPlaceholderImageRef === void 0 ? void 0 : (_loadingPlaceholderIm = loadingPlaceholderImageRef.current) === null || _loadingPlaceholderIm === void 0 ? void 0 : _loadingPlaceholderIm.complete) && (loadingPlaceholderImageRef === null || loadingPlaceholderImageRef === void 0 ? void 0 : loadingPlaceholderImageRef.current) || undefined;
|
|
247
|
+
|
|
248
|
+
// Set loading placeholder image as background
|
|
249
|
+
const loadingStyle = loadingPlaceholderImage ? {
|
|
250
|
+
backgroundImage: `url(${loadingPlaceholderImage.src})`
|
|
251
|
+
} : undefined;
|
|
252
|
+
return /*#__PURE__*/React__default.createElement(Wrapper, _extends({}, wrapperProps, {
|
|
253
|
+
ref: ref,
|
|
254
|
+
className: classNames(linkProps === null || linkProps === void 0 ? void 0 : linkProps.className, className, handleBasicClasses({
|
|
255
|
+
align,
|
|
256
|
+
aspectRatio,
|
|
257
|
+
prefix: CLASSNAME,
|
|
258
|
+
size,
|
|
259
|
+
theme,
|
|
260
|
+
variant,
|
|
261
|
+
isClickable,
|
|
262
|
+
hasError,
|
|
263
|
+
hasIconErrorFallback,
|
|
264
|
+
hasCustomErrorFallback,
|
|
265
|
+
isLoading,
|
|
266
|
+
objectFit,
|
|
267
|
+
hasBadge: !!badge
|
|
268
|
+
}), fillHeight && `${CLASSNAME}--fill-height`)
|
|
269
|
+
}), /*#__PURE__*/React__default.createElement("span", {
|
|
270
|
+
className: `${CLASSNAME}__background`
|
|
271
|
+
}, /*#__PURE__*/React__default.createElement("img", _extends({
|
|
272
|
+
// Use placeholder image size
|
|
273
|
+
width: loadingPlaceholderImage === null || loadingPlaceholderImage === void 0 ? void 0 : loadingPlaceholderImage.naturalWidth,
|
|
274
|
+
height: loadingPlaceholderImage === null || loadingPlaceholderImage === void 0 ? void 0 : loadingPlaceholderImage.naturalHeight
|
|
275
|
+
}, imgProps, {
|
|
276
|
+
style: _objectSpread2(_objectSpread2(_objectSpread2(_objectSpread2({
|
|
277
|
+
// Reserve space while loading (when possible)
|
|
278
|
+
width: isLoading ? (imgProps === null || imgProps === void 0 ? void 0 : imgProps.width) || (loadingPlaceholderImage === null || loadingPlaceholderImage === void 0 ? void 0 : loadingPlaceholderImage.naturalWidth) : undefined
|
|
279
|
+
}, imgProps === null || imgProps === void 0 ? void 0 : imgProps.style), imageErrorStyle), focusPointStyle), loadingStyle),
|
|
280
|
+
ref: useMergeRefs(setImgElement, propImgRef),
|
|
281
|
+
className: classNames(handleBasicClasses({
|
|
282
|
+
prefix: `${CLASSNAME}__image`,
|
|
283
|
+
isLoading,
|
|
284
|
+
hasDefinedSize: Boolean((imgProps === null || imgProps === void 0 ? void 0 : imgProps.height) && imgProps.width)
|
|
285
|
+
}), imgProps === null || imgProps === void 0 ? void 0 : imgProps.className),
|
|
286
|
+
crossOrigin: crossOrigin,
|
|
287
|
+
src: image,
|
|
288
|
+
alt: alt,
|
|
289
|
+
loading: loading
|
|
290
|
+
})), !isLoading && hasError && /*#__PURE__*/React__default.createElement("span", {
|
|
291
|
+
className: `${CLASSNAME}__fallback`
|
|
292
|
+
}, hasIconErrorFallback ? /*#__PURE__*/React__default.createElement(Icon, {
|
|
293
|
+
icon: fallback,
|
|
294
|
+
size: Size.xxs,
|
|
295
|
+
theme: theme
|
|
296
|
+
}) : fallback)), badge && /*#__PURE__*/React__default.cloneElement(badge, {
|
|
297
|
+
className: classNames(`${CLASSNAME}__badge`, badge.props.className)
|
|
298
|
+
}));
|
|
299
|
+
});
|
|
300
|
+
Thumbnail.displayName = COMPONENT_NAME;
|
|
301
|
+
Thumbnail.className = CLASSNAME;
|
|
302
|
+
Thumbnail.defaultProps = DEFAULT_PROPS;
|
|
303
|
+
|
|
304
|
+
export { Thumbnail as T, useFocusPointStyle as u };
|
|
305
|
+
//# sourceMappingURL=4c28d012.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"4c28d012.js","sources":["../../src/components/thumbnail/useImageLoad.ts","../../src/components/thumbnail/useFocusPointStyle.tsx","../../src/components/thumbnail/Thumbnail.tsx"],"sourcesContent":["import { useEffect, useState } from 'react';\n\nexport type LoadingState = 'isLoading' | 'isLoaded' | 'hasError';\n\nfunction getState(img: HTMLImageElement | null | undefined, event?: Event) {\n // Error event occurred or image has no source.\n if (event?.type === 'error' || (img?.complete && !img.getAttribute('src'))) {\n return 'hasError';\n }\n // Image is undefined or incomplete.\n if (!img || !img.complete) {\n return 'isLoading';\n }\n // Else loaded.\n return 'isLoaded';\n}\n\nexport function useImageLoad(imageURL: string, imgRef?: HTMLImageElement): LoadingState {\n const [state, setState] = useState<LoadingState>(getState(imgRef));\n\n // Update state when changing image URL or DOM reference.\n useEffect(() => {\n setState(getState(imgRef));\n }, [imageURL, imgRef]);\n\n // Listen to `load` and `error` event on image\n useEffect(() => {\n const img = imgRef;\n if (!img) return undefined;\n const update = (event?: Event) => setState(getState(img, event));\n img.addEventListener('load', update);\n img.addEventListener('error', update);\n return () => {\n img.removeEventListener('load', update);\n img.removeEventListener('error', update);\n };\n }, [imgRef, imgRef?.src]);\n\n return state;\n}\n","import { CSSProperties, useEffect, useMemo, useState } from 'react';\nimport { AspectRatio } from '@lumx/react/components';\nimport { ThumbnailProps } from '@lumx/react/components/thumbnail/Thumbnail';\nimport { RectSize } from '@lumx/react/utils/type';\n\n// Calculate shift to center the focus point in the container.\nexport function shiftPosition({\n scale,\n focusPoint,\n imageSize,\n containerSize,\n}: {\n scale: number;\n focusPoint: number;\n imageSize: number;\n containerSize: number;\n}) {\n const scaledSize = imageSize / scale;\n if (scaledSize === containerSize) return 0;\n\n const scaledFocusHeight = focusPoint * scaledSize;\n const startFocus = scaledFocusHeight - containerSize / 2;\n const shift = startFocus / (scaledSize - containerSize);\n\n return Math.floor(Math.max(Math.min(shift, 1), 0) * 100);\n}\n\n// Compute CSS properties to apply the focus point.\nexport const useFocusPointStyle = (\n { image, aspectRatio, focusPoint, imgProps: { width, height } = {} }: ThumbnailProps,\n element: HTMLImageElement | undefined,\n isLoaded: boolean,\n): CSSProperties => {\n // Get natural image size from imgProps or img element.\n const imageSize: RectSize | undefined = useMemo(() => {\n // Focus point is not applicable => exit early\n if (!image || aspectRatio === AspectRatio.original || (!focusPoint?.x && !focusPoint?.y)) return undefined;\n if (typeof width === 'number' && typeof height === 'number') return { width, height };\n if (element && isLoaded) return { width: element.naturalWidth, height: element.naturalHeight };\n return undefined;\n }, [aspectRatio, element, focusPoint?.x, focusPoint?.y, height, image, isLoaded, width]);\n\n // Get container size (dependant on imageSize).\n const [containerSize, setContainerSize] = useState<RectSize | undefined>(undefined);\n useEffect(\n function updateContainerSize() {\n const cWidth = element?.offsetWidth;\n const cHeight = element?.offsetHeight;\n if (cWidth && cHeight) {\n // Update only if needed.\n setContainerSize((oldContainerSize) =>\n oldContainerSize?.width === cWidth && oldContainerSize.height === cHeight\n ? oldContainerSize\n : { width: cWidth, height: cHeight },\n );\n } else if (imageSize) {\n // Wait for a render (in case the container size is dependent on the image size).\n requestAnimationFrame(updateContainerSize);\n }\n },\n [element?.offsetHeight, element?.offsetWidth, imageSize],\n );\n\n // Compute style.\n const [style, setStyle] = useState<CSSProperties>({});\n useEffect(() => {\n // Focus point is not applicable => exit early\n if (!image || aspectRatio === AspectRatio.original || (!focusPoint?.x && !focusPoint?.y)) {\n return;\n }\n if (!element || !imageSize) {\n // Focus point can be computed but now right now (image size unknown).\n setStyle({ visibility: 'hidden' });\n return;\n }\n if (!containerSize || !imageSize.height || !imageSize.width) {\n // Missing container or image size abort focus point compute.\n setStyle({});\n return;\n }\n\n const heightScale = imageSize.height / containerSize.height;\n const widthScale = imageSize.width / containerSize.width;\n const scale = Math.min(widthScale, heightScale);\n\n // Focus Y relative to the top (instead of the center)\n const focusPointFromTop = Math.abs((focusPoint?.y || 0) - 1) / 2;\n const y = shiftPosition({\n scale,\n focusPoint: focusPointFromTop,\n imageSize: imageSize.height,\n containerSize: containerSize.height,\n });\n\n // Focus X relative to the left (instead of the center)\n const focusPointFromLeft = Math.abs((focusPoint?.x || 0) + 1) / 2;\n const x = shiftPosition({\n scale,\n focusPoint: focusPointFromLeft,\n imageSize: imageSize.width,\n containerSize: containerSize.width,\n });\n\n const objectPosition = `${x}% ${y}%`;\n // Update only if needed.\n setStyle((oldStyle) => (oldStyle.objectPosition === objectPosition ? oldStyle : { objectPosition }));\n }, [aspectRatio, containerSize, element, focusPoint?.x, focusPoint?.y, image, imageSize]);\n\n return style;\n};\n","import React, {\n CSSProperties,\n ImgHTMLAttributes,\n KeyboardEventHandler,\n MouseEventHandler,\n ReactElement,\n ReactNode,\n Ref,\n useState,\n} from 'react';\n\nimport classNames from 'classnames';\n\nimport { AspectRatio, HorizontalAlignment, Icon, Size, Theme, ThumbnailObjectFit } from '@lumx/react';\nimport { Falsy, GenericProps, HasTheme } from '@lumx/react/utils/type';\nimport { getRootClassName, handleBasicClasses } from '@lumx/react/utils/className';\nimport { mdiImageBroken } from '@lumx/icons';\nimport { useMergeRefs } from '@lumx/react/utils/mergeRefs';\nimport { useImageLoad } from '@lumx/react/components/thumbnail/useImageLoad';\nimport { useFocusPointStyle } from '@lumx/react/components/thumbnail/useFocusPointStyle';\nimport { useTheme } from '@lumx/react/utils/theme/ThemeContext';\nimport { forwardRef } from '@lumx/react/utils/react/forwardRef';\n\nimport { FocusPoint, ThumbnailSize, ThumbnailVariant } from './types';\n\ntype ImgHTMLProps = ImgHTMLAttributes<HTMLImageElement>;\n\n/**\n * Defines the props of the component.\n */\nexport interface ThumbnailProps extends GenericProps, HasTheme {\n /** Alignment of the thumbnail in it's parent (requires flex parent). */\n align?: HorizontalAlignment;\n /** Image alternative text. */\n alt: string;\n /** Image aspect ratio. */\n aspectRatio?: AspectRatio;\n /** Badge. */\n badge?: ReactElement | Falsy;\n /** Image cross origin resource policy. */\n crossOrigin?: ImgHTMLProps['crossOrigin'];\n /** Fallback icon (SVG path) or react node when image fails to load. */\n fallback?: string | ReactNode;\n /** Whether the thumbnail should fill it's parent size (requires flex parent) or not. */\n fillHeight?: boolean;\n /** Apply relative vertical and horizontal shift (from -1 to 1) on the image position inside the thumbnail. */\n focusPoint?: FocusPoint;\n /** Image URL. */\n image: string;\n /** Props to inject into the native <img> element. */\n imgProps?: ImgHTMLProps;\n /** Reference to the native <img> element. */\n imgRef?: Ref<HTMLImageElement>;\n /** Set to true to force the display of the loading skeleton. */\n isLoading?: boolean;\n /** Set how the image should fit when its aspect ratio is constrained */\n objectFit?: ThumbnailObjectFit;\n /** Size variant of the component. */\n size?: ThumbnailSize;\n /** Image loading mode. */\n loading?: ImgHTMLProps['loading'];\n /** Ref of an existing placeholder image to display while loading. */\n loadingPlaceholderImageRef?: React.RefObject<HTMLImageElement>;\n /** On click callback. */\n onClick?: MouseEventHandler<HTMLDivElement>;\n /** On key press callback. */\n onKeyPress?: KeyboardEventHandler<HTMLDivElement>;\n /** Variant of the component. */\n variant?: ThumbnailVariant;\n /** Props to pass to the link wrapping the thumbnail. */\n linkProps?: React.DetailedHTMLProps<React.AnchorHTMLAttributes<HTMLAnchorElement>, HTMLAnchorElement>;\n /** Custom react component for the link (can be used to inject react router Link). */\n linkAs?: 'a' | any;\n}\n\n/**\n * Component display name.\n */\nconst COMPONENT_NAME = 'Thumbnail';\n\n/**\n * Component default class name and class prefix.\n */\nconst CLASSNAME = getRootClassName(COMPONENT_NAME);\n\n/**\n * Component default props.\n */\nconst DEFAULT_PROPS: Partial<ThumbnailProps> = {\n fallback: mdiImageBroken,\n loading: 'lazy',\n};\n\n/**\n * Thumbnail component.\n *\n * @param props Component props.\n * @param ref Component ref.\n * @return React element.\n */\nexport const Thumbnail = forwardRef<ThumbnailProps>((props, ref) => {\n const defaultTheme = useTheme() || Theme.light;\n const {\n align,\n alt,\n aspectRatio = AspectRatio.original,\n badge,\n className,\n crossOrigin,\n fallback,\n fillHeight,\n // `focusPoint` needs to be here to remove it from `forwardedProps`.\n // eslint-disable-next-line @typescript-eslint/no-unused-vars\n focusPoint,\n image,\n imgProps,\n imgRef: propImgRef,\n isLoading: isLoadingProp,\n objectFit,\n loading,\n loadingPlaceholderImageRef,\n size,\n theme = defaultTheme,\n variant,\n linkProps,\n linkAs,\n ...forwardedProps\n } = props;\n const [imgElement, setImgElement] = useState<HTMLImageElement>();\n\n // Image loading state.\n const loadingState = useImageLoad(image, imgElement);\n const isLoaded = loadingState === 'isLoaded';\n const isLoading = isLoadingProp || loadingState === 'isLoading';\n const hasError = loadingState === 'hasError';\n\n // Focus point.\n const focusPointStyle = useFocusPointStyle(props, imgElement, isLoaded);\n\n const hasIconErrorFallback = hasError && typeof fallback === 'string';\n const hasCustomErrorFallback = hasError && !hasIconErrorFallback;\n const imageErrorStyle: CSSProperties = {};\n if (hasIconErrorFallback) {\n // Keep the image layout on icon fallback.\n imageErrorStyle.visibility = 'hidden';\n } else if (hasCustomErrorFallback) {\n // Remove the image on custom fallback.\n imageErrorStyle.display = 'none';\n }\n\n const isLink = Boolean(linkProps?.href || linkAs);\n const isButton = !!forwardedProps.onClick;\n const isClickable = isButton || isLink;\n\n let Wrapper: any = 'div';\n const wrapperProps = { ...forwardedProps };\n if (isLink) {\n Wrapper = linkAs || 'a';\n Object.assign(wrapperProps, linkProps);\n } else if (isButton) {\n Wrapper = 'button';\n wrapperProps.type = forwardedProps.type || 'button';\n wrapperProps['aria-label'] = forwardedProps['aria-label'] || alt;\n }\n\n // If we have a loading placeholder image that is really loaded (complete)\n const loadingPlaceholderImage =\n (isLoading && loadingPlaceholderImageRef?.current?.complete && loadingPlaceholderImageRef?.current) ||\n undefined;\n\n // Set loading placeholder image as background\n const loadingStyle = loadingPlaceholderImage\n ? { backgroundImage: `url(${loadingPlaceholderImage.src})` }\n : undefined;\n\n return (\n <Wrapper\n {...wrapperProps}\n ref={ref}\n className={classNames(\n linkProps?.className,\n className,\n handleBasicClasses({\n align,\n aspectRatio,\n prefix: CLASSNAME,\n size,\n theme,\n variant,\n isClickable,\n hasError,\n hasIconErrorFallback,\n hasCustomErrorFallback,\n isLoading,\n objectFit,\n hasBadge: !!badge,\n }),\n fillHeight && `${CLASSNAME}--fill-height`,\n )}\n >\n <span className={`${CLASSNAME}__background`}>\n <img\n // Use placeholder image size\n width={loadingPlaceholderImage?.naturalWidth}\n height={loadingPlaceholderImage?.naturalHeight}\n {...imgProps}\n style={{\n // Reserve space while loading (when possible)\n width: isLoading ? imgProps?.width || loadingPlaceholderImage?.naturalWidth : undefined,\n ...imgProps?.style,\n ...imageErrorStyle,\n ...focusPointStyle,\n ...loadingStyle,\n }}\n ref={useMergeRefs(setImgElement, propImgRef)}\n className={classNames(\n handleBasicClasses({\n prefix: `${CLASSNAME}__image`,\n isLoading,\n hasDefinedSize: Boolean(imgProps?.height && imgProps.width),\n }),\n imgProps?.className,\n )}\n crossOrigin={crossOrigin}\n src={image}\n alt={alt}\n loading={loading}\n />\n {!isLoading && hasError && (\n <span className={`${CLASSNAME}__fallback`}>\n {hasIconErrorFallback ? (\n <Icon icon={fallback as string} size={Size.xxs} theme={theme} />\n ) : (\n fallback\n )}\n </span>\n )}\n </span>\n {badge &&\n React.cloneElement(badge, { className: classNames(`${CLASSNAME}__badge`, badge.props.className) })}\n </Wrapper>\n );\n});\nThumbnail.displayName = COMPONENT_NAME;\nThumbnail.className = CLASSNAME;\nThumbnail.defaultProps = DEFAULT_PROPS;\n"],"names":["getState","img","event","type","complete","getAttribute","useImageLoad","imageURL","imgRef","state","setState","useState","useEffect","undefined","update","addEventListener","removeEventListener","src","shiftPosition","_ref","scale","focusPoint","imageSize","containerSize","scaledSize","scaledFocusHeight","startFocus","shift","Math","floor","max","min","useFocusPointStyle","_ref2","element","isLoaded","image","aspectRatio","imgProps","width","height","useMemo","AspectRatio","original","x","y","naturalWidth","naturalHeight","setContainerSize","updateContainerSize","cWidth","offsetWidth","cHeight","offsetHeight","oldContainerSize","requestAnimationFrame","style","setStyle","visibility","heightScale","widthScale","focusPointFromTop","abs","focusPointFromLeft","objectPosition","oldStyle","COMPONENT_NAME","CLASSNAME","getRootClassName","DEFAULT_PROPS","fallback","mdiImageBroken","loading","Thumbnail","forwardRef","props","ref","_loadingPlaceholderIm","defaultTheme","useTheme","Theme","light","align","alt","badge","className","crossOrigin","fillHeight","propImgRef","isLoading","isLoadingProp","objectFit","loadingPlaceholderImageRef","size","theme","variant","linkProps","linkAs","forwardedProps","_objectWithoutProperties","_excluded","imgElement","setImgElement","loadingState","hasError","focusPointStyle","hasIconErrorFallback","hasCustomErrorFallback","imageErrorStyle","display","isLink","Boolean","href","isButton","onClick","isClickable","Wrapper","wrapperProps","_objectSpread","Object","assign","loadingPlaceholderImage","current","loadingStyle","backgroundImage","React","createElement","_extends","classNames","handleBasicClasses","prefix","hasBadge","useMergeRefs","hasDefinedSize","Icon","icon","Size","xxs","cloneElement","displayName","defaultProps"],"mappings":"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"}
|
|
@@ -0,0 +1,160 @@
|
|
|
1
|
+
import { h as getRootClassName, T as Theme, j as _objectWithoutProperties, g as classNames, _ as _extends, K as Kind } from './1da25128.js';
|
|
2
|
+
import React__default, { useState, useEffect, useRef, useCallback } from 'react';
|
|
3
|
+
import { Dropdown } from './components/dropdown/index.ts-2a17db51.js';
|
|
4
|
+
import { InputHelper } from './components/input-helper/index.ts-ab3a1ef5.js';
|
|
5
|
+
import { u as useFocusTrap } from './646f0db6.js';
|
|
6
|
+
import { m as mergeRefs } from './f52adbae.js';
|
|
7
|
+
import { u as useId } from './3a1facc0.js';
|
|
8
|
+
import { u as useTheme } from './3181f000.js';
|
|
9
|
+
import { h as handleBasicClasses } from './f57e1239.js';
|
|
10
|
+
import { P as Placement } from './2e2abe51.js';
|
|
11
|
+
|
|
12
|
+
/**
|
|
13
|
+
* Listen on element focus to store the focus status.
|
|
14
|
+
*/
|
|
15
|
+
function useListenFocus(ref) {
|
|
16
|
+
const [isFocus, setFocus] = useState(false);
|
|
17
|
+
useEffect(() => {
|
|
18
|
+
const {
|
|
19
|
+
current: element
|
|
20
|
+
} = ref;
|
|
21
|
+
if (!element) {
|
|
22
|
+
return undefined;
|
|
23
|
+
}
|
|
24
|
+
const onFocus = () => setFocus(true);
|
|
25
|
+
const onBlur = () => setFocus(false);
|
|
26
|
+
element.addEventListener('focus', onFocus);
|
|
27
|
+
element.addEventListener('blur', onBlur);
|
|
28
|
+
return () => {
|
|
29
|
+
element.removeEventListener('focus', onFocus);
|
|
30
|
+
element.removeEventListener('blur', onBlur);
|
|
31
|
+
};
|
|
32
|
+
}, [ref, setFocus]);
|
|
33
|
+
return isFocus;
|
|
34
|
+
}
|
|
35
|
+
|
|
36
|
+
/**
|
|
37
|
+
* Select variants.
|
|
38
|
+
*/
|
|
39
|
+
const SelectVariant = {
|
|
40
|
+
input: 'input',
|
|
41
|
+
chip: 'chip'
|
|
42
|
+
};
|
|
43
|
+
|
|
44
|
+
const _excluded = ["children", "className", "focusElement", "isMultiple", "closeOnClick", "disabled", "error", "hasError", "helper", "id", "isDisabled", "isEmpty", "isOpen", "isRequired", "isValid", "label", "onClear", "onDropdownClose", "onInfiniteScroll", "onInputClick", "placeholder", "theme", "value", "variant"];
|
|
45
|
+
|
|
46
|
+
/** The display name of the component. */
|
|
47
|
+
const COMPONENT_NAME = 'Select';
|
|
48
|
+
|
|
49
|
+
/** The default class name and classes prefix for this component. */
|
|
50
|
+
const CLASSNAME = getRootClassName(COMPONENT_NAME);
|
|
51
|
+
|
|
52
|
+
/** The default value of props. */
|
|
53
|
+
const DEFAULT_PROPS = {
|
|
54
|
+
variant: SelectVariant.input
|
|
55
|
+
};
|
|
56
|
+
const WithSelectContext = (SelectElement, props, ref) => {
|
|
57
|
+
const defaultTheme = useTheme() || Theme.light;
|
|
58
|
+
const {
|
|
59
|
+
children,
|
|
60
|
+
className,
|
|
61
|
+
focusElement,
|
|
62
|
+
isMultiple,
|
|
63
|
+
closeOnClick = !isMultiple,
|
|
64
|
+
disabled,
|
|
65
|
+
error,
|
|
66
|
+
hasError,
|
|
67
|
+
helper,
|
|
68
|
+
id,
|
|
69
|
+
isDisabled = disabled,
|
|
70
|
+
isEmpty,
|
|
71
|
+
isOpen,
|
|
72
|
+
isRequired,
|
|
73
|
+
isValid,
|
|
74
|
+
label,
|
|
75
|
+
onClear,
|
|
76
|
+
onDropdownClose,
|
|
77
|
+
onInfiniteScroll,
|
|
78
|
+
onInputClick,
|
|
79
|
+
placeholder,
|
|
80
|
+
theme = defaultTheme,
|
|
81
|
+
value,
|
|
82
|
+
variant = DEFAULT_PROPS.variant
|
|
83
|
+
} = props,
|
|
84
|
+
forwardedProps = _objectWithoutProperties(props, _excluded);
|
|
85
|
+
const generatedSelectId = useId();
|
|
86
|
+
const selectId = id || generatedSelectId;
|
|
87
|
+
const anchorRef = useRef(null);
|
|
88
|
+
const selectRef = useRef(null);
|
|
89
|
+
const dropdownRef = useRef(null);
|
|
90
|
+
const isFocus = useListenFocus(anchorRef);
|
|
91
|
+
const handleKeyboardNav = useCallback(evt => {
|
|
92
|
+
if ((evt.key === 'Enter' || evt.key === ' ' || evt.key === 'ArrowDown') && onInputClick) {
|
|
93
|
+
evt.preventDefault();
|
|
94
|
+
onInputClick();
|
|
95
|
+
}
|
|
96
|
+
}, [onInputClick]);
|
|
97
|
+
const onClose = () => {
|
|
98
|
+
var _anchorRef$current;
|
|
99
|
+
if (onDropdownClose) {
|
|
100
|
+
onDropdownClose();
|
|
101
|
+
}
|
|
102
|
+
anchorRef === null || anchorRef === void 0 ? void 0 : (_anchorRef$current = anchorRef.current) === null || _anchorRef$current === void 0 ? void 0 : _anchorRef$current.blur();
|
|
103
|
+
};
|
|
104
|
+
|
|
105
|
+
// Handle focus trap.
|
|
106
|
+
useFocusTrap(isOpen && dropdownRef.current, focusElement === null || focusElement === void 0 ? void 0 : focusElement.current);
|
|
107
|
+
return /*#__PURE__*/React__default.createElement("div", {
|
|
108
|
+
ref: mergeRefs(ref, selectRef),
|
|
109
|
+
className: classNames(className, handleBasicClasses({
|
|
110
|
+
hasError,
|
|
111
|
+
hasLabel: Boolean(label),
|
|
112
|
+
hasPlaceholder: Boolean(placeholder),
|
|
113
|
+
hasValue: !isEmpty,
|
|
114
|
+
isDisabled,
|
|
115
|
+
isEmpty,
|
|
116
|
+
isFocus,
|
|
117
|
+
isOpen,
|
|
118
|
+
isValid,
|
|
119
|
+
prefix: CLASSNAME,
|
|
120
|
+
theme: theme === Theme.light ? Theme.light : Theme.dark
|
|
121
|
+
}))
|
|
122
|
+
}, /*#__PURE__*/React__default.createElement(SelectElement, _extends({}, forwardedProps, {
|
|
123
|
+
anchorRef: anchorRef,
|
|
124
|
+
"aria-disabled": isDisabled,
|
|
125
|
+
handleKeyboardNav: handleKeyboardNav,
|
|
126
|
+
hasError: hasError,
|
|
127
|
+
isDisabled: isDisabled,
|
|
128
|
+
isEmpty: isEmpty,
|
|
129
|
+
isRequired: isRequired,
|
|
130
|
+
isValid: isValid,
|
|
131
|
+
label: label,
|
|
132
|
+
placeholder: placeholder,
|
|
133
|
+
id: selectId,
|
|
134
|
+
theme: theme,
|
|
135
|
+
value: value,
|
|
136
|
+
variant: variant,
|
|
137
|
+
onClear: onClear,
|
|
138
|
+
onInputClick: onInputClick
|
|
139
|
+
})), /*#__PURE__*/React__default.createElement(Dropdown, {
|
|
140
|
+
anchorRef: anchorRef,
|
|
141
|
+
closeOnClick: closeOnClick,
|
|
142
|
+
closeOnClickAway: true,
|
|
143
|
+
closeOnEscape: true,
|
|
144
|
+
isOpen: !!isOpen,
|
|
145
|
+
placement: Placement.BOTTOM_START,
|
|
146
|
+
onClose: onClose,
|
|
147
|
+
onInfiniteScroll: onInfiniteScroll,
|
|
148
|
+
ref: dropdownRef
|
|
149
|
+
}, children), hasError && error && /*#__PURE__*/React__default.createElement(InputHelper, {
|
|
150
|
+
className: `${CLASSNAME}__helper`,
|
|
151
|
+
kind: Kind.error,
|
|
152
|
+
theme: theme
|
|
153
|
+
}, error), helper && /*#__PURE__*/React__default.createElement(InputHelper, {
|
|
154
|
+
className: `${CLASSNAME}__helper`,
|
|
155
|
+
theme: theme
|
|
156
|
+
}, helper));
|
|
157
|
+
};
|
|
158
|
+
|
|
159
|
+
export { DEFAULT_PROPS as D, SelectVariant as S, WithSelectContext as W };
|
|
160
|
+
//# sourceMappingURL=4cd0bf32.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"4cd0bf32.js","sources":["../../src/hooks/useListenFocus.tsx","../../src/components/select/constants.ts","../../src/components/select/WithSelectContext.tsx"],"sourcesContent":["import { RefObject, useEffect, useState } from 'react';\n\n/**\n * Listen on element focus to store the focus status.\n */\nexport function useListenFocus(ref: RefObject<HTMLElement>) {\n const [isFocus, setFocus] = useState(false);\n\n useEffect(() => {\n const { current: element } = ref;\n if (!element) {\n return undefined;\n }\n\n const onFocus = () => setFocus(true);\n const onBlur = () => setFocus(false);\n element.addEventListener('focus', onFocus);\n element.addEventListener('blur', onBlur);\n return () => {\n element.removeEventListener('focus', onFocus);\n element.removeEventListener('blur', onBlur);\n };\n }, [ref, setFocus]);\n\n return isFocus;\n}\n","import { IconButtonProps } from '@lumx/react';\nimport { GenericProps, HasTheme, ValueOf } from '@lumx/react/utils/type';\nimport { ReactNode, SyntheticEvent } from 'react';\n\n/**\n * Select variants.\n */\nexport const SelectVariant = { input: 'input', chip: 'chip' } as const;\nexport type SelectVariant = ValueOf<typeof SelectVariant>;\n\nexport interface CoreSelectProps extends GenericProps, HasTheme {\n /** Props to pass to the clear button (minus those already set by the Select props). If not specified, the button won't be displayed. */\n clearButtonProps?: Pick<IconButtonProps, 'label'> &\n Omit<IconButtonProps, 'label' | 'onClick' | 'icon' | 'emphasis'>;\n /** Whether the select (input variant) is displayed with error style or not. */\n hasError?: boolean;\n /** Error message. */\n error?: string | ReactNode;\n /** Helper text. */\n helper?: string;\n /** Whether the select should close on click. */\n closeOnClick?: boolean;\n /** Icon (SVG path). */\n icon?: string;\n /** Whether the component is disabled or not. */\n isDisabled?: boolean;\n /** Whether the component is required or not. */\n isRequired?: boolean;\n /** Whether the component is open or not. */\n isOpen?: boolean;\n /** Whether the select (input variant) is displayed with valid style or not. */\n isValid?: boolean;\n /** Label text. */\n label?: string;\n /** Placeholder input text. */\n placeholder?: string;\n /** Select variant. */\n variant?: SelectVariant;\n /** On clear callback. */\n onClear?(event: SyntheticEvent, value?: string): void;\n /** On blur callback. */\n onBlur?(): void;\n /** On filter text change callback (with 500ms debounce). */\n onFilter?(): void;\n /** On input click callback (can be used for dropdown toggle). */\n onInputClick?(): void;\n /** On dropdown close callback. */\n onDropdownClose?(): void;\n /** On scroll end callback. */\n onInfiniteScroll?(): void;\n /** Render value function. Default: Renders the value as a string. */\n selectedValueRender?(choice: string): ReactNode | string;\n}\n","import classNames from 'classnames';\nimport React, { Ref, useCallback, useRef } from 'react';\n\nimport { Placement } from '@lumx/react';\nimport { Kind, Theme } from '@lumx/react/components';\nimport { Dropdown } from '@lumx/react/components/dropdown/Dropdown';\nimport { InputHelper } from '@lumx/react/components/input-helper/InputHelper';\nimport { useFocusTrap } from '@lumx/react/hooks/useFocusTrap';\nimport { useListenFocus } from '@lumx/react/hooks/useListenFocus';\nimport { getRootClassName, handleBasicClasses } from '@lumx/react/utils/className';\nimport { mergeRefs } from '@lumx/react/utils/mergeRefs';\n\nimport { useId } from '@lumx/react/hooks/useId';\nimport { useTheme } from '@lumx/react/utils/theme/ThemeContext';\nimport { CoreSelectProps, SelectVariant } from './constants';\n\n/** The display name of the component. */\nconst COMPONENT_NAME = 'Select';\n\n/** The default class name and classes prefix for this component. */\nconst CLASSNAME = getRootClassName(COMPONENT_NAME);\n\n/** The default value of props. */\nexport const DEFAULT_PROPS: Partial<CoreSelectProps> = {\n variant: SelectVariant.input,\n};\n\nexport const WithSelectContext = (\n SelectElement: React.FC<any>,\n props: CoreSelectProps,\n ref: Ref<HTMLDivElement>,\n): React.ReactElement => {\n const defaultTheme = useTheme() || Theme.light;\n const {\n children,\n className,\n focusElement,\n isMultiple,\n closeOnClick = !isMultiple,\n disabled,\n error,\n hasError,\n helper,\n id,\n isDisabled = disabled,\n isEmpty,\n isOpen,\n isRequired,\n isValid,\n label,\n onClear,\n onDropdownClose,\n onInfiniteScroll,\n onInputClick,\n placeholder,\n theme = defaultTheme,\n value,\n variant = DEFAULT_PROPS.variant,\n ...forwardedProps\n } = props;\n const generatedSelectId = useId();\n const selectId = id || generatedSelectId;\n const anchorRef = useRef<HTMLElement>(null);\n const selectRef = useRef<HTMLDivElement>(null);\n const dropdownRef = useRef<HTMLDivElement>(null);\n const isFocus = useListenFocus(anchorRef);\n\n const handleKeyboardNav = useCallback(\n (evt: React.KeyboardEvent<HTMLElement>) => {\n if ((evt.key === 'Enter' || evt.key === ' ' || evt.key === 'ArrowDown') && onInputClick) {\n evt.preventDefault();\n onInputClick();\n }\n },\n [onInputClick],\n );\n\n const onClose = () => {\n if (onDropdownClose) {\n onDropdownClose();\n }\n anchorRef?.current?.blur();\n };\n\n // Handle focus trap.\n useFocusTrap(isOpen && dropdownRef.current, focusElement?.current);\n\n return (\n <div\n ref={mergeRefs(ref, selectRef)}\n className={classNames(\n className,\n handleBasicClasses({\n hasError,\n hasLabel: Boolean(label),\n hasPlaceholder: Boolean(placeholder),\n hasValue: !isEmpty,\n isDisabled,\n isEmpty,\n isFocus,\n isOpen,\n isValid,\n prefix: CLASSNAME,\n theme: theme === Theme.light ? Theme.light : Theme.dark,\n }),\n )}\n >\n <SelectElement\n {...forwardedProps}\n anchorRef={anchorRef}\n aria-disabled={isDisabled}\n handleKeyboardNav={handleKeyboardNav}\n hasError={hasError}\n isDisabled={isDisabled}\n isEmpty={isEmpty}\n isRequired={isRequired}\n isValid={isValid}\n label={label}\n placeholder={placeholder}\n id={selectId}\n theme={theme}\n value={value}\n variant={variant}\n onClear={onClear}\n onInputClick={onInputClick}\n />\n <Dropdown\n anchorRef={anchorRef}\n closeOnClick={closeOnClick}\n closeOnClickAway\n closeOnEscape\n isOpen={!!isOpen}\n placement={Placement.BOTTOM_START}\n onClose={onClose}\n onInfiniteScroll={onInfiniteScroll}\n ref={dropdownRef}\n >\n {children}\n </Dropdown>\n {hasError && error && (\n <InputHelper className={`${CLASSNAME}__helper`} kind={Kind.error} theme={theme}>\n {error}\n </InputHelper>\n )}\n {helper && (\n <InputHelper className={`${CLASSNAME}__helper`} theme={theme}>\n {helper}\n </InputHelper>\n )}\n </div>\n );\n};\n"],"names":["useListenFocus","ref","isFocus","setFocus","useState","useEffect","current","element","undefined","onFocus","onBlur","addEventListener","removeEventListener","SelectVariant","input","chip","COMPONENT_NAME","CLASSNAME","getRootClassName","DEFAULT_PROPS","variant","WithSelectContext","SelectElement","props","defaultTheme","useTheme","Theme","light","children","className","focusElement","isMultiple","closeOnClick","disabled","error","hasError","helper","id","isDisabled","isEmpty","isOpen","isRequired","isValid","label","onClear","onDropdownClose","onInfiniteScroll","onInputClick","placeholder","theme","value","forwardedProps","_objectWithoutProperties","_excluded","generatedSelectId","useId","selectId","anchorRef","useRef","selectRef","dropdownRef","handleKeyboardNav","useCallback","evt","key","preventDefault","onClose","_anchorRef$current","blur","useFocusTrap","React","createElement","mergeRefs","classNames","handleBasicClasses","hasLabel","Boolean","hasPlaceholder","hasValue","prefix","dark","_extends","Dropdown","closeOnClickAway","closeOnEscape","placement","Placement","BOTTOM_START","InputHelper","kind","Kind"],"mappings":"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"}
|
|
@@ -0,0 +1,25 @@
|
|
|
1
|
+
import concat from 'lodash/concat';
|
|
2
|
+
import dropRight from 'lodash/dropRight';
|
|
3
|
+
import last from 'lodash/last';
|
|
4
|
+
import partition from 'lodash/partition';
|
|
5
|
+
import reduce from 'lodash/reduce';
|
|
6
|
+
|
|
7
|
+
/**
|
|
8
|
+
* Similar to lodash `partition` function but working with multiple predicates.
|
|
9
|
+
*
|
|
10
|
+
* @example
|
|
11
|
+
* const isString = (s) => typeof s === 'string'
|
|
12
|
+
* const isNumber = (s) => typeof s === 'number'
|
|
13
|
+
* const [strings, numbers, others] = partitionMulti(['a', 1, 'b', false], [isString, isNumber])
|
|
14
|
+
* //=> [['a', 'b'], [1], [false]]
|
|
15
|
+
*
|
|
16
|
+
* @param elements array of elements
|
|
17
|
+
* @param predicates array of predicates to apply on elements
|
|
18
|
+
* @return partitioned elements by the given predicates
|
|
19
|
+
*/
|
|
20
|
+
function partitionMulti(elements, predicates) {
|
|
21
|
+
return reduce(predicates, (partitioned, predicate) => concat(dropRight(partitioned), partition(last(partitioned), predicate)), [elements]);
|
|
22
|
+
}
|
|
23
|
+
|
|
24
|
+
export { partitionMulti as p };
|
|
25
|
+
//# sourceMappingURL=4daccdd5.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"4daccdd5.js","sources":["../../src/utils/partitionMulti.ts"],"sourcesContent":["import concat from 'lodash/concat';\nimport dropRight from 'lodash/dropRight';\nimport last from 'lodash/last';\nimport partition from 'lodash/partition';\nimport reduce from 'lodash/reduce';\nimport { Predicate } from './type';\n\n/**\n * Similar to lodash `partition` function but working with multiple predicates.\n *\n * @example\n * const isString = (s) => typeof s === 'string'\n * const isNumber = (s) => typeof s === 'number'\n * const [strings, numbers, others] = partitionMulti(['a', 1, 'b', false], [isString, isNumber])\n * //=> [['a', 'b'], [1], [false]]\n *\n * @param elements array of elements\n * @param predicates array of predicates to apply on elements\n * @return partitioned elements by the given predicates\n */\nexport function partitionMulti<T>(elements: T[], predicates: Array<Predicate<T>>): T[][] {\n return reduce(\n predicates,\n (partitioned: T[][], predicate: Predicate<T>) =>\n concat(dropRight(partitioned), partition(last(partitioned), predicate)),\n [elements],\n );\n}\n"],"names":["partitionMulti","elements","predicates","reduce","partitioned","predicate","concat","dropRight","partition","last"],"mappings":";;;;;;AAOA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACO,SAASA,cAAcA,CAAIC,QAAa,EAAEC,UAA+B,EAAS;AACrF,EAAA,OAAOC,MAAM,CACTD,UAAU,EACV,CAACE,WAAkB,EAAEC,SAAuB,KACxCC,MAAM,CAACC,SAAS,CAACH,WAAW,CAAC,EAAEI,SAAS,CAACC,IAAI,CAACL,WAAW,CAAC,EAAEC,SAAS,CAAC,CAAC,EAC3E,CAACJ,QAAQ,CACb,CAAC,CAAA;AACL;;;;"}
|