chore: update ant-design dependencies and add new icon types
This commit is contained in:
+9
@@ -0,0 +1,9 @@
|
||||
The MIT License (MIT)
|
||||
|
||||
Copyright (c) 2019-present afc163
|
||||
|
||||
Permission is hereby granted, free of charge, to any person obtaining a copy of this software and associated documentation files (the "Software"), to deal in the Software without restriction, including without limitation the rights to use, copy, modify, merge, publish, distribute, sublicense, and/or sell copies of the Software, and to permit persons to whom the Software is furnished to do so, subject to the following conditions:
|
||||
|
||||
The above copyright notice and this permission notice shall be included in all copies or substantial portions of the Software.
|
||||
|
||||
THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE.
|
||||
+58
@@ -0,0 +1,58 @@
|
||||
# rc-resize-observer
|
||||
|
||||
[![NPM version][npm-image]][npm-url] [](https://github.com/umijs/dumi) [![build status][github-actions-image]][github-actions-url] [![Codecov][codecov-image]][codecov-url] [![npm download][download-image]][download-url]
|
||||
|
||||
[npm-image]: http://img.shields.io/npm/v/rc-resize-observer.svg?style=flat-square
|
||||
[npm-url]: http://npmjs.org/package/rc-resize-observer
|
||||
[github-actions-image]: https://github.com/react-component/resize-observer/workflows/CI/badge.svg
|
||||
[github-actions-url]: https://github.com/react-component/resize-observer/actions
|
||||
[codecov-image]: https://img.shields.io/codecov/c/github/react-component/resize-observer/master.svg?style=flat-square
|
||||
[codecov-url]: https://codecov.io/gh/react-component/resize-observer/branch/master
|
||||
[download-image]: https://img.shields.io/npm/dm/rc-resize-observer.svg?style=flat-square
|
||||
[download-url]: https://npmjs.org/package/rc-resize-observer
|
||||
|
||||
Resize observer for React.
|
||||
|
||||
## Live Demo
|
||||
|
||||
https://react-component.github.io/resize-observer/
|
||||
|
||||
## Install
|
||||
|
||||
[](https://npmjs.org/package/rc-resize-observer)
|
||||
|
||||
## Usage
|
||||
|
||||
```js
|
||||
import ResizeObserver from 'rc-resize-observer';
|
||||
import { render } from 'react-dom';
|
||||
|
||||
render(
|
||||
<ResizeObserver
|
||||
onResize={() => {
|
||||
console.log('resized!');
|
||||
}}
|
||||
>
|
||||
<textarea />
|
||||
</ResizeObserver>,
|
||||
mountNode,
|
||||
);
|
||||
```
|
||||
|
||||
## API
|
||||
|
||||
| Property | Type | Default | Description |
|
||||
| -------- | --------------------------- | ------- | ------------------------------- |
|
||||
| disabled | boolean | false | |
|
||||
| onResize | ({ width, height }) => void | - | Trigger when child node resized |
|
||||
|
||||
## Development
|
||||
|
||||
```
|
||||
npm install
|
||||
npm start
|
||||
```
|
||||
|
||||
## License
|
||||
|
||||
rc-resize-observer is released under the MIT license.
|
||||
+112
@@ -0,0 +1,112 @@
|
||||
.rc-footer {
|
||||
position: relative;
|
||||
clear: both;
|
||||
color: rgba(255, 255, 255, 0.4);
|
||||
font-size: 14px;
|
||||
line-height: 1.5;
|
||||
background-color: #000;
|
||||
}
|
||||
.rc-footer a {
|
||||
transition: all 0.3s;
|
||||
color: rgba(255, 255, 255, 0.9);
|
||||
text-decoration: none;
|
||||
}
|
||||
.rc-footer a:hover {
|
||||
color: #40a9ff;
|
||||
}
|
||||
.rc-footer-container {
|
||||
width: 100%;
|
||||
max-width: 1200px;
|
||||
padding: 80px 0;
|
||||
margin: auto;
|
||||
}
|
||||
.rc-footer-columns {
|
||||
display: flex;
|
||||
justify-content: space-around;
|
||||
}
|
||||
.rc-footer-column h2 {
|
||||
position: relative;
|
||||
margin: 0 auto 24px;
|
||||
font-weight: 500;
|
||||
font-size: 16px;
|
||||
color: #fff;
|
||||
}
|
||||
.rc-footer-column-icon {
|
||||
margin-right: 0.5em;
|
||||
width: 22px;
|
||||
display: inline-block;
|
||||
vertical-align: middle;
|
||||
top: -1px;
|
||||
position: relative;
|
||||
text-align: center;
|
||||
}
|
||||
.rc-footer-column-icon > span,
|
||||
.rc-footer-column-icon > svg,
|
||||
.rc-footer-column-icon img {
|
||||
width: 100%;
|
||||
display: block;
|
||||
}
|
||||
.rc-footer-item {
|
||||
margin: 12px 0;
|
||||
}
|
||||
.rc-footer-item-icon {
|
||||
margin-right: 0.4em;
|
||||
width: 16px;
|
||||
display: inline-block;
|
||||
vertical-align: middle;
|
||||
top: -1px;
|
||||
position: relative;
|
||||
text-align: center;
|
||||
}
|
||||
.rc-footer-item-icon > span,
|
||||
.rc-footer-item-icon > svg,
|
||||
.rc-footer-item-icon img {
|
||||
width: 100%;
|
||||
display: block;
|
||||
}
|
||||
.rc-footer-item-separator {
|
||||
margin: 0 0.3em;
|
||||
}
|
||||
.rc-footer-bottom-container {
|
||||
border-top: 1px solid rgba(255, 255, 255, 0.25);
|
||||
width: 100%;
|
||||
max-width: 1200px;
|
||||
text-align: center;
|
||||
margin: 0 auto;
|
||||
padding: 16px 0;
|
||||
line-height: 32px;
|
||||
font-size: 16px;
|
||||
}
|
||||
.rc-footer-light {
|
||||
background-color: transparent;
|
||||
color: rgba(0, 0, 0, 0.85);
|
||||
}
|
||||
.rc-footer-light h2,
|
||||
.rc-footer-light a {
|
||||
color: rgba(0, 0, 0, 0.85);
|
||||
}
|
||||
.rc-footer-light .rc-footer-bottom-container {
|
||||
border-top-color: #e8e8e8;
|
||||
}
|
||||
.rc-footer-light .rc-footer-item-separator,
|
||||
.rc-footer-light .rc-footer-item-description {
|
||||
color: rgba(0, 0, 0, 0.45);
|
||||
}
|
||||
@media only screen and (max-width: 767.99px) {
|
||||
.rc-footer {
|
||||
text-align: center;
|
||||
}
|
||||
.rc-footer-container {
|
||||
padding: 40px 0;
|
||||
}
|
||||
.rc-footer-columns {
|
||||
display: block;
|
||||
}
|
||||
.rc-footer-column {
|
||||
display: block;
|
||||
margin-bottom: 40px;
|
||||
}
|
||||
.rc-footer-column:last-child {
|
||||
margin-bottom: 0;
|
||||
}
|
||||
}
|
||||
+139
@@ -0,0 +1,139 @@
|
||||
@footer-prefix-cls: rc-footer;
|
||||
|
||||
.@{footer-prefix-cls} {
|
||||
position: relative;
|
||||
clear: both;
|
||||
color: rgba(255, 255, 255, .4);
|
||||
font-size: 14px;
|
||||
line-height: 1.5;
|
||||
background-color: #000;
|
||||
|
||||
a {
|
||||
transition: all .3s;
|
||||
color: rgba(255, 255, 255, .9);
|
||||
text-decoration: none;
|
||||
|
||||
&:hover {
|
||||
color: #40a9ff;
|
||||
}
|
||||
}
|
||||
|
||||
&-container {
|
||||
width: 100%;
|
||||
max-width: 1200px;
|
||||
padding: 80px 0;
|
||||
margin: auto;
|
||||
}
|
||||
|
||||
&-columns {
|
||||
display: flex;
|
||||
justify-content: space-around;
|
||||
}
|
||||
|
||||
&-column {
|
||||
h2 {
|
||||
position: relative;
|
||||
margin: 0 auto 24px;
|
||||
font-weight: 500;
|
||||
font-size: 16px;
|
||||
color: #fff;
|
||||
}
|
||||
|
||||
&-icon {
|
||||
margin-right: .5em;
|
||||
width: 22px;
|
||||
display: inline-block;
|
||||
vertical-align: middle;
|
||||
top: -1px;
|
||||
position: relative;
|
||||
text-align: center;
|
||||
|
||||
> span,
|
||||
> svg,
|
||||
img {
|
||||
width: 100%;
|
||||
display: block;
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
&-item {
|
||||
margin: 12px 0;
|
||||
|
||||
&-icon {
|
||||
margin-right: .4em;
|
||||
width: 16px;
|
||||
display: inline-block;
|
||||
vertical-align: middle;
|
||||
top: -1px;
|
||||
position: relative;
|
||||
text-align: center;
|
||||
|
||||
> span,
|
||||
> svg,
|
||||
img {
|
||||
width: 100%;
|
||||
display: block;
|
||||
}
|
||||
}
|
||||
|
||||
&-separator {
|
||||
margin: 0 .3em;
|
||||
}
|
||||
}
|
||||
|
||||
&-bottom {
|
||||
&-container {
|
||||
border-top: 1px solid rgba(255, 255, 255, .25);
|
||||
width: 100%;
|
||||
max-width: 1200px;
|
||||
text-align: center;
|
||||
margin: 0 auto;
|
||||
padding: 16px 0;
|
||||
line-height: 32px;
|
||||
font-size: 16px;
|
||||
}
|
||||
}
|
||||
|
||||
&-light {
|
||||
background-color: transparent;
|
||||
color: rgba(0, 0, 0, .85);
|
||||
|
||||
h2,
|
||||
a {
|
||||
color: rgba(0, 0, 0, .85);
|
||||
}
|
||||
}
|
||||
|
||||
&-light &-bottom-container {
|
||||
border-top-color: #e8e8e8;
|
||||
}
|
||||
|
||||
&-light &-item-separator,
|
||||
&-light &-item-description {
|
||||
color: rgba(0, 0, 0, .45);
|
||||
}
|
||||
}
|
||||
|
||||
@media only screen and (max-width: 767.99px) {
|
||||
.@{footer-prefix-cls} {
|
||||
text-align: center;
|
||||
|
||||
&-container {
|
||||
padding: 40px 0;
|
||||
}
|
||||
|
||||
&-columns {
|
||||
display: block;
|
||||
}
|
||||
|
||||
&-column {
|
||||
display: block;
|
||||
margin-bottom: 40px;
|
||||
|
||||
&:last-child {
|
||||
margin-bottom: 0;
|
||||
}
|
||||
}
|
||||
}
|
||||
}
|
||||
+19
@@ -0,0 +1,19 @@
|
||||
import * as React from 'react';
|
||||
import type { SizeInfo } from '.';
|
||||
type onCollectionResize = (size: SizeInfo, element: HTMLElement, data: any) => void;
|
||||
export declare const CollectionContext: React.Context<onCollectionResize>;
|
||||
export interface ResizeInfo {
|
||||
size: SizeInfo;
|
||||
data: any;
|
||||
element: HTMLElement;
|
||||
}
|
||||
export interface CollectionProps {
|
||||
/** Trigger when some children ResizeObserver changed. Collect by frame render level */
|
||||
onBatchResize?: (resizeInfo: ResizeInfo[]) => void;
|
||||
children?: React.ReactNode;
|
||||
}
|
||||
/**
|
||||
* Collect all the resize event from children ResizeObserver
|
||||
*/
|
||||
export declare function Collection({ children, onBatchResize }: CollectionProps): React.JSX.Element;
|
||||
export {};
|
||||
+33
@@ -0,0 +1,33 @@
|
||||
import * as React from 'react';
|
||||
export var CollectionContext = /*#__PURE__*/React.createContext(null);
|
||||
/**
|
||||
* Collect all the resize event from children ResizeObserver
|
||||
*/
|
||||
export function Collection(_ref) {
|
||||
var children = _ref.children,
|
||||
onBatchResize = _ref.onBatchResize;
|
||||
var resizeIdRef = React.useRef(0);
|
||||
var resizeInfosRef = React.useRef([]);
|
||||
var onCollectionResize = React.useContext(CollectionContext);
|
||||
var onResize = React.useCallback(function (size, element, data) {
|
||||
resizeIdRef.current += 1;
|
||||
var currentId = resizeIdRef.current;
|
||||
resizeInfosRef.current.push({
|
||||
size: size,
|
||||
element: element,
|
||||
data: data
|
||||
});
|
||||
Promise.resolve().then(function () {
|
||||
if (currentId === resizeIdRef.current) {
|
||||
onBatchResize === null || onBatchResize === void 0 || onBatchResize(resizeInfosRef.current);
|
||||
resizeInfosRef.current = [];
|
||||
}
|
||||
});
|
||||
|
||||
// Continue bubbling if parent exist
|
||||
onCollectionResize === null || onCollectionResize === void 0 || onCollectionResize(size, element, data);
|
||||
}, [onBatchResize, onCollectionResize]);
|
||||
return /*#__PURE__*/React.createElement(CollectionContext.Provider, {
|
||||
value: onResize
|
||||
}, children);
|
||||
}
|
||||
+10
@@ -0,0 +1,10 @@
|
||||
import * as React from 'react';
|
||||
export interface DomWrapperProps {
|
||||
children: React.ReactElement;
|
||||
}
|
||||
/**
|
||||
* Fallback to findDOMNode if origin ref do not provide any dom element
|
||||
*/
|
||||
export default class DomWrapper extends React.Component<DomWrapperProps> {
|
||||
render(): React.ReactElement<any, string | React.JSXElementConstructor<any>>;
|
||||
}
|
||||
+24
@@ -0,0 +1,24 @@
|
||||
import _classCallCheck from "@babel/runtime/helpers/esm/classCallCheck";
|
||||
import _createClass from "@babel/runtime/helpers/esm/createClass";
|
||||
import _inherits from "@babel/runtime/helpers/esm/inherits";
|
||||
import _createSuper from "@babel/runtime/helpers/esm/createSuper";
|
||||
import * as React from 'react';
|
||||
/**
|
||||
* Fallback to findDOMNode if origin ref do not provide any dom element
|
||||
*/
|
||||
var DomWrapper = /*#__PURE__*/function (_React$Component) {
|
||||
_inherits(DomWrapper, _React$Component);
|
||||
var _super = _createSuper(DomWrapper);
|
||||
function DomWrapper() {
|
||||
_classCallCheck(this, DomWrapper);
|
||||
return _super.apply(this, arguments);
|
||||
}
|
||||
_createClass(DomWrapper, [{
|
||||
key: "render",
|
||||
value: function render() {
|
||||
return this.props.children;
|
||||
}
|
||||
}]);
|
||||
return DomWrapper;
|
||||
}(React.Component);
|
||||
export { DomWrapper as default };
|
||||
+7
@@ -0,0 +1,7 @@
|
||||
import * as React from 'react';
|
||||
import type { ResizeObserverProps } from '..';
|
||||
export interface SingleObserverProps extends ResizeObserverProps {
|
||||
children: React.ReactElement | ((ref: React.RefObject<Element>) => React.ReactElement);
|
||||
}
|
||||
declare const RefSingleObserver: React.ForwardRefExoticComponent<SingleObserverProps & React.RefAttributes<HTMLElement>>;
|
||||
export default RefSingleObserver;
|
||||
+114
@@ -0,0 +1,114 @@
|
||||
import _objectSpread from "@babel/runtime/helpers/esm/objectSpread2";
|
||||
import _typeof from "@babel/runtime/helpers/esm/typeof";
|
||||
import findDOMNode from "rc-util/es/Dom/findDOMNode";
|
||||
import { supportRef, useComposeRef, getNodeRef } from "rc-util/es/ref";
|
||||
import * as React from 'react';
|
||||
import { CollectionContext } from "../Collection";
|
||||
import { observe, unobserve } from "../utils/observerUtil";
|
||||
import DomWrapper from "./DomWrapper";
|
||||
function SingleObserver(props, ref) {
|
||||
var children = props.children,
|
||||
disabled = props.disabled;
|
||||
var elementRef = React.useRef(null);
|
||||
var wrapperRef = React.useRef(null);
|
||||
var onCollectionResize = React.useContext(CollectionContext);
|
||||
|
||||
// =========================== Children ===========================
|
||||
var isRenderProps = typeof children === 'function';
|
||||
var mergedChildren = isRenderProps ? children(elementRef) : children;
|
||||
|
||||
// ============================= Size =============================
|
||||
var sizeRef = React.useRef({
|
||||
width: -1,
|
||||
height: -1,
|
||||
offsetWidth: -1,
|
||||
offsetHeight: -1
|
||||
});
|
||||
|
||||
// ============================= Ref ==============================
|
||||
var canRef = !isRenderProps && /*#__PURE__*/React.isValidElement(mergedChildren) && supportRef(mergedChildren);
|
||||
var originRef = canRef ? getNodeRef(mergedChildren) : null;
|
||||
var mergedRef = useComposeRef(originRef, elementRef);
|
||||
var getDom = function getDom() {
|
||||
var _elementRef$current;
|
||||
return findDOMNode(elementRef.current) || (
|
||||
// Support `nativeElement` format
|
||||
elementRef.current && _typeof(elementRef.current) === 'object' ? findDOMNode((_elementRef$current = elementRef.current) === null || _elementRef$current === void 0 ? void 0 : _elementRef$current.nativeElement) : null) || findDOMNode(wrapperRef.current);
|
||||
};
|
||||
React.useImperativeHandle(ref, function () {
|
||||
return getDom();
|
||||
});
|
||||
|
||||
// =========================== Observe ============================
|
||||
var propsRef = React.useRef(props);
|
||||
propsRef.current = props;
|
||||
|
||||
// Handler
|
||||
var onInternalResize = React.useCallback(function (target) {
|
||||
var _propsRef$current = propsRef.current,
|
||||
onResize = _propsRef$current.onResize,
|
||||
data = _propsRef$current.data;
|
||||
var _target$getBoundingCl = target.getBoundingClientRect(),
|
||||
width = _target$getBoundingCl.width,
|
||||
height = _target$getBoundingCl.height;
|
||||
var offsetWidth = target.offsetWidth,
|
||||
offsetHeight = target.offsetHeight;
|
||||
|
||||
/**
|
||||
* Resize observer trigger when content size changed.
|
||||
* In most case we just care about element size,
|
||||
* let's use `boundary` instead of `contentRect` here to avoid shaking.
|
||||
*/
|
||||
var fixedWidth = Math.floor(width);
|
||||
var fixedHeight = Math.floor(height);
|
||||
if (sizeRef.current.width !== fixedWidth || sizeRef.current.height !== fixedHeight || sizeRef.current.offsetWidth !== offsetWidth || sizeRef.current.offsetHeight !== offsetHeight) {
|
||||
var size = {
|
||||
width: fixedWidth,
|
||||
height: fixedHeight,
|
||||
offsetWidth: offsetWidth,
|
||||
offsetHeight: offsetHeight
|
||||
};
|
||||
sizeRef.current = size;
|
||||
|
||||
// IE is strange, right?
|
||||
var mergedOffsetWidth = offsetWidth === Math.round(width) ? width : offsetWidth;
|
||||
var mergedOffsetHeight = offsetHeight === Math.round(height) ? height : offsetHeight;
|
||||
var sizeInfo = _objectSpread(_objectSpread({}, size), {}, {
|
||||
offsetWidth: mergedOffsetWidth,
|
||||
offsetHeight: mergedOffsetHeight
|
||||
});
|
||||
|
||||
// Let collection know what happened
|
||||
onCollectionResize === null || onCollectionResize === void 0 || onCollectionResize(sizeInfo, target, data);
|
||||
if (onResize) {
|
||||
// defer the callback but not defer to next frame
|
||||
Promise.resolve().then(function () {
|
||||
onResize(sizeInfo, target);
|
||||
});
|
||||
}
|
||||
}
|
||||
}, []);
|
||||
|
||||
// Dynamic observe
|
||||
React.useEffect(function () {
|
||||
var currentElement = getDom();
|
||||
if (currentElement && !disabled) {
|
||||
observe(currentElement, onInternalResize);
|
||||
}
|
||||
return function () {
|
||||
return unobserve(currentElement, onInternalResize);
|
||||
};
|
||||
}, [elementRef.current, disabled]);
|
||||
|
||||
// ============================ Render ============================
|
||||
return /*#__PURE__*/React.createElement(DomWrapper, {
|
||||
ref: wrapperRef
|
||||
}, canRef ? /*#__PURE__*/React.cloneElement(mergedChildren, {
|
||||
ref: mergedRef
|
||||
}) : mergedChildren);
|
||||
}
|
||||
var RefSingleObserver = /*#__PURE__*/React.forwardRef(SingleObserver);
|
||||
if (process.env.NODE_ENV !== 'production') {
|
||||
RefSingleObserver.displayName = 'SingleObserver';
|
||||
}
|
||||
export default RefSingleObserver;
|
||||
+25
@@ -0,0 +1,25 @@
|
||||
import * as React from 'react';
|
||||
import { Collection } from './Collection';
|
||||
import { _rs } from './utils/observerUtil';
|
||||
export {
|
||||
/** @private Test only for mock trigger resize event */
|
||||
_rs, };
|
||||
export interface SizeInfo {
|
||||
width: number;
|
||||
height: number;
|
||||
offsetWidth: number;
|
||||
offsetHeight: number;
|
||||
}
|
||||
export type OnResize = (size: SizeInfo, element: HTMLElement) => void;
|
||||
export interface ResizeObserverProps {
|
||||
/** Pass to ResizeObserver.Collection with additional data */
|
||||
data?: any;
|
||||
children: React.ReactNode | ((ref: React.RefObject<any>) => React.ReactElement);
|
||||
disabled?: boolean;
|
||||
/** Trigger if element resized. Will always trigger when first time render. */
|
||||
onResize?: OnResize;
|
||||
}
|
||||
declare const RefResizeObserver: React.ForwardRefExoticComponent<ResizeObserverProps & React.RefAttributes<any>> & {
|
||||
Collection: typeof Collection;
|
||||
};
|
||||
export default RefResizeObserver;
|
||||
+34
@@ -0,0 +1,34 @@
|
||||
import _extends from "@babel/runtime/helpers/esm/extends";
|
||||
import * as React from 'react';
|
||||
import toArray from "rc-util/es/Children/toArray";
|
||||
import { warning } from "rc-util/es/warning";
|
||||
import SingleObserver from "./SingleObserver";
|
||||
import { Collection } from "./Collection";
|
||||
var INTERNAL_PREFIX_KEY = 'rc-observer-key';
|
||||
import { _rs } from "./utils/observerUtil";
|
||||
export { /** @private Test only for mock trigger resize event */
|
||||
_rs };
|
||||
function ResizeObserver(props, ref) {
|
||||
var children = props.children;
|
||||
var childNodes = typeof children === 'function' ? [children] : toArray(children);
|
||||
if (process.env.NODE_ENV !== 'production') {
|
||||
if (childNodes.length > 1) {
|
||||
warning(false, 'Find more than one child node with `children` in ResizeObserver. Please use ResizeObserver.Collection instead.');
|
||||
} else if (childNodes.length === 0) {
|
||||
warning(false, '`children` of ResizeObserver is empty. Nothing is in observe.');
|
||||
}
|
||||
}
|
||||
return childNodes.map(function (child, index) {
|
||||
var key = (child === null || child === void 0 ? void 0 : child.key) || "".concat(INTERNAL_PREFIX_KEY, "-").concat(index);
|
||||
return /*#__PURE__*/React.createElement(SingleObserver, _extends({}, props, {
|
||||
key: key,
|
||||
ref: index === 0 ? ref : undefined
|
||||
}), child);
|
||||
});
|
||||
}
|
||||
var RefResizeObserver = /*#__PURE__*/React.forwardRef(ResizeObserver);
|
||||
if (process.env.NODE_ENV !== 'production') {
|
||||
RefResizeObserver.displayName = 'ResizeObserver';
|
||||
}
|
||||
RefResizeObserver.Collection = Collection;
|
||||
export default RefResizeObserver;
|
||||
+7
@@ -0,0 +1,7 @@
|
||||
export type ResizeListener = (element: Element) => void;
|
||||
declare function onResize(entities: ResizeObserverEntry[]): void;
|
||||
export declare const _el: Map<Element, Set<ResizeListener>>;
|
||||
export declare const _rs: typeof onResize;
|
||||
export declare function observe(element: Element, callback: ResizeListener): void;
|
||||
export declare function unobserve(element: Element, callback: ResizeListener): void;
|
||||
export {};
|
||||
+37
@@ -0,0 +1,37 @@
|
||||
import ResizeObserver from 'resize-observer-polyfill';
|
||||
// =============================== Const ===============================
|
||||
var elementListeners = new Map();
|
||||
function onResize(entities) {
|
||||
entities.forEach(function (entity) {
|
||||
var _elementListeners$get;
|
||||
var target = entity.target;
|
||||
(_elementListeners$get = elementListeners.get(target)) === null || _elementListeners$get === void 0 || _elementListeners$get.forEach(function (listener) {
|
||||
return listener(target);
|
||||
});
|
||||
});
|
||||
}
|
||||
|
||||
// Note: ResizeObserver polyfill not support option to measure border-box resize
|
||||
var resizeObserver = new ResizeObserver(onResize);
|
||||
|
||||
// Dev env only
|
||||
export var _el = process.env.NODE_ENV !== 'production' ? elementListeners : null; // eslint-disable-line
|
||||
export var _rs = process.env.NODE_ENV !== 'production' ? onResize : null; // eslint-disable-line
|
||||
|
||||
// ============================== Observe ==============================
|
||||
export function observe(element, callback) {
|
||||
if (!elementListeners.has(element)) {
|
||||
elementListeners.set(element, new Set());
|
||||
resizeObserver.observe(element);
|
||||
}
|
||||
elementListeners.get(element).add(callback);
|
||||
}
|
||||
export function unobserve(element, callback) {
|
||||
if (elementListeners.has(element)) {
|
||||
elementListeners.get(element).delete(callback);
|
||||
if (!elementListeners.get(element).size) {
|
||||
resizeObserver.unobserve(element);
|
||||
elementListeners.delete(element);
|
||||
}
|
||||
}
|
||||
}
|
||||
+19
@@ -0,0 +1,19 @@
|
||||
import * as React from 'react';
|
||||
import type { SizeInfo } from '.';
|
||||
type onCollectionResize = (size: SizeInfo, element: HTMLElement, data: any) => void;
|
||||
export declare const CollectionContext: React.Context<onCollectionResize>;
|
||||
export interface ResizeInfo {
|
||||
size: SizeInfo;
|
||||
data: any;
|
||||
element: HTMLElement;
|
||||
}
|
||||
export interface CollectionProps {
|
||||
/** Trigger when some children ResizeObserver changed. Collect by frame render level */
|
||||
onBatchResize?: (resizeInfo: ResizeInfo[]) => void;
|
||||
children?: React.ReactNode;
|
||||
}
|
||||
/**
|
||||
* Collect all the resize event from children ResizeObserver
|
||||
*/
|
||||
export declare function Collection({ children, onBatchResize }: CollectionProps): React.JSX.Element;
|
||||
export {};
|
||||
+41
@@ -0,0 +1,41 @@
|
||||
"use strict";
|
||||
|
||||
var _interopRequireWildcard = require("@babel/runtime/helpers/interopRequireWildcard").default;
|
||||
Object.defineProperty(exports, "__esModule", {
|
||||
value: true
|
||||
});
|
||||
exports.Collection = Collection;
|
||||
exports.CollectionContext = void 0;
|
||||
var React = _interopRequireWildcard(require("react"));
|
||||
var CollectionContext = exports.CollectionContext = /*#__PURE__*/React.createContext(null);
|
||||
/**
|
||||
* Collect all the resize event from children ResizeObserver
|
||||
*/
|
||||
function Collection(_ref) {
|
||||
var children = _ref.children,
|
||||
onBatchResize = _ref.onBatchResize;
|
||||
var resizeIdRef = React.useRef(0);
|
||||
var resizeInfosRef = React.useRef([]);
|
||||
var onCollectionResize = React.useContext(CollectionContext);
|
||||
var onResize = React.useCallback(function (size, element, data) {
|
||||
resizeIdRef.current += 1;
|
||||
var currentId = resizeIdRef.current;
|
||||
resizeInfosRef.current.push({
|
||||
size: size,
|
||||
element: element,
|
||||
data: data
|
||||
});
|
||||
Promise.resolve().then(function () {
|
||||
if (currentId === resizeIdRef.current) {
|
||||
onBatchResize === null || onBatchResize === void 0 || onBatchResize(resizeInfosRef.current);
|
||||
resizeInfosRef.current = [];
|
||||
}
|
||||
});
|
||||
|
||||
// Continue bubbling if parent exist
|
||||
onCollectionResize === null || onCollectionResize === void 0 || onCollectionResize(size, element, data);
|
||||
}, [onBatchResize, onCollectionResize]);
|
||||
return /*#__PURE__*/React.createElement(CollectionContext.Provider, {
|
||||
value: onResize
|
||||
}, children);
|
||||
}
|
||||
+10
@@ -0,0 +1,10 @@
|
||||
import * as React from 'react';
|
||||
export interface DomWrapperProps {
|
||||
children: React.ReactElement;
|
||||
}
|
||||
/**
|
||||
* Fallback to findDOMNode if origin ref do not provide any dom element
|
||||
*/
|
||||
export default class DomWrapper extends React.Component<DomWrapperProps> {
|
||||
render(): React.ReactElement<any, string | React.JSXElementConstructor<any>>;
|
||||
}
|
||||
+31
@@ -0,0 +1,31 @@
|
||||
"use strict";
|
||||
|
||||
var _interopRequireWildcard = require("@babel/runtime/helpers/interopRequireWildcard").default;
|
||||
var _interopRequireDefault = require("@babel/runtime/helpers/interopRequireDefault").default;
|
||||
Object.defineProperty(exports, "__esModule", {
|
||||
value: true
|
||||
});
|
||||
exports.default = void 0;
|
||||
var _classCallCheck2 = _interopRequireDefault(require("@babel/runtime/helpers/classCallCheck"));
|
||||
var _createClass2 = _interopRequireDefault(require("@babel/runtime/helpers/createClass"));
|
||||
var _inherits2 = _interopRequireDefault(require("@babel/runtime/helpers/inherits"));
|
||||
var _createSuper2 = _interopRequireDefault(require("@babel/runtime/helpers/createSuper"));
|
||||
var React = _interopRequireWildcard(require("react"));
|
||||
/**
|
||||
* Fallback to findDOMNode if origin ref do not provide any dom element
|
||||
*/
|
||||
var DomWrapper = exports.default = /*#__PURE__*/function (_React$Component) {
|
||||
(0, _inherits2.default)(DomWrapper, _React$Component);
|
||||
var _super = (0, _createSuper2.default)(DomWrapper);
|
||||
function DomWrapper() {
|
||||
(0, _classCallCheck2.default)(this, DomWrapper);
|
||||
return _super.apply(this, arguments);
|
||||
}
|
||||
(0, _createClass2.default)(DomWrapper, [{
|
||||
key: "render",
|
||||
value: function render() {
|
||||
return this.props.children;
|
||||
}
|
||||
}]);
|
||||
return DomWrapper;
|
||||
}(React.Component);
|
||||
+7
@@ -0,0 +1,7 @@
|
||||
import * as React from 'react';
|
||||
import type { ResizeObserverProps } from '..';
|
||||
export interface SingleObserverProps extends ResizeObserverProps {
|
||||
children: React.ReactElement | ((ref: React.RefObject<Element>) => React.ReactElement);
|
||||
}
|
||||
declare const RefSingleObserver: React.ForwardRefExoticComponent<SingleObserverProps & React.RefAttributes<HTMLElement>>;
|
||||
export default RefSingleObserver;
|
||||
+122
@@ -0,0 +1,122 @@
|
||||
"use strict";
|
||||
|
||||
var _interopRequireWildcard = require("@babel/runtime/helpers/interopRequireWildcard").default;
|
||||
var _interopRequireDefault = require("@babel/runtime/helpers/interopRequireDefault").default;
|
||||
Object.defineProperty(exports, "__esModule", {
|
||||
value: true
|
||||
});
|
||||
exports.default = void 0;
|
||||
var _objectSpread2 = _interopRequireDefault(require("@babel/runtime/helpers/objectSpread2"));
|
||||
var _typeof2 = _interopRequireDefault(require("@babel/runtime/helpers/typeof"));
|
||||
var _findDOMNode = _interopRequireDefault(require("rc-util/lib/Dom/findDOMNode"));
|
||||
var _ref = require("rc-util/lib/ref");
|
||||
var React = _interopRequireWildcard(require("react"));
|
||||
var _Collection = require("../Collection");
|
||||
var _observerUtil = require("../utils/observerUtil");
|
||||
var _DomWrapper = _interopRequireDefault(require("./DomWrapper"));
|
||||
function SingleObserver(props, ref) {
|
||||
var children = props.children,
|
||||
disabled = props.disabled;
|
||||
var elementRef = React.useRef(null);
|
||||
var wrapperRef = React.useRef(null);
|
||||
var onCollectionResize = React.useContext(_Collection.CollectionContext);
|
||||
|
||||
// =========================== Children ===========================
|
||||
var isRenderProps = typeof children === 'function';
|
||||
var mergedChildren = isRenderProps ? children(elementRef) : children;
|
||||
|
||||
// ============================= Size =============================
|
||||
var sizeRef = React.useRef({
|
||||
width: -1,
|
||||
height: -1,
|
||||
offsetWidth: -1,
|
||||
offsetHeight: -1
|
||||
});
|
||||
|
||||
// ============================= Ref ==============================
|
||||
var canRef = !isRenderProps && /*#__PURE__*/React.isValidElement(mergedChildren) && (0, _ref.supportRef)(mergedChildren);
|
||||
var originRef = canRef ? (0, _ref.getNodeRef)(mergedChildren) : null;
|
||||
var mergedRef = (0, _ref.useComposeRef)(originRef, elementRef);
|
||||
var getDom = function getDom() {
|
||||
var _elementRef$current;
|
||||
return (0, _findDOMNode.default)(elementRef.current) || (
|
||||
// Support `nativeElement` format
|
||||
elementRef.current && (0, _typeof2.default)(elementRef.current) === 'object' ? (0, _findDOMNode.default)((_elementRef$current = elementRef.current) === null || _elementRef$current === void 0 ? void 0 : _elementRef$current.nativeElement) : null) || (0, _findDOMNode.default)(wrapperRef.current);
|
||||
};
|
||||
React.useImperativeHandle(ref, function () {
|
||||
return getDom();
|
||||
});
|
||||
|
||||
// =========================== Observe ============================
|
||||
var propsRef = React.useRef(props);
|
||||
propsRef.current = props;
|
||||
|
||||
// Handler
|
||||
var onInternalResize = React.useCallback(function (target) {
|
||||
var _propsRef$current = propsRef.current,
|
||||
onResize = _propsRef$current.onResize,
|
||||
data = _propsRef$current.data;
|
||||
var _target$getBoundingCl = target.getBoundingClientRect(),
|
||||
width = _target$getBoundingCl.width,
|
||||
height = _target$getBoundingCl.height;
|
||||
var offsetWidth = target.offsetWidth,
|
||||
offsetHeight = target.offsetHeight;
|
||||
|
||||
/**
|
||||
* Resize observer trigger when content size changed.
|
||||
* In most case we just care about element size,
|
||||
* let's use `boundary` instead of `contentRect` here to avoid shaking.
|
||||
*/
|
||||
var fixedWidth = Math.floor(width);
|
||||
var fixedHeight = Math.floor(height);
|
||||
if (sizeRef.current.width !== fixedWidth || sizeRef.current.height !== fixedHeight || sizeRef.current.offsetWidth !== offsetWidth || sizeRef.current.offsetHeight !== offsetHeight) {
|
||||
var size = {
|
||||
width: fixedWidth,
|
||||
height: fixedHeight,
|
||||
offsetWidth: offsetWidth,
|
||||
offsetHeight: offsetHeight
|
||||
};
|
||||
sizeRef.current = size;
|
||||
|
||||
// IE is strange, right?
|
||||
var mergedOffsetWidth = offsetWidth === Math.round(width) ? width : offsetWidth;
|
||||
var mergedOffsetHeight = offsetHeight === Math.round(height) ? height : offsetHeight;
|
||||
var sizeInfo = (0, _objectSpread2.default)((0, _objectSpread2.default)({}, size), {}, {
|
||||
offsetWidth: mergedOffsetWidth,
|
||||
offsetHeight: mergedOffsetHeight
|
||||
});
|
||||
|
||||
// Let collection know what happened
|
||||
onCollectionResize === null || onCollectionResize === void 0 || onCollectionResize(sizeInfo, target, data);
|
||||
if (onResize) {
|
||||
// defer the callback but not defer to next frame
|
||||
Promise.resolve().then(function () {
|
||||
onResize(sizeInfo, target);
|
||||
});
|
||||
}
|
||||
}
|
||||
}, []);
|
||||
|
||||
// Dynamic observe
|
||||
React.useEffect(function () {
|
||||
var currentElement = getDom();
|
||||
if (currentElement && !disabled) {
|
||||
(0, _observerUtil.observe)(currentElement, onInternalResize);
|
||||
}
|
||||
return function () {
|
||||
return (0, _observerUtil.unobserve)(currentElement, onInternalResize);
|
||||
};
|
||||
}, [elementRef.current, disabled]);
|
||||
|
||||
// ============================ Render ============================
|
||||
return /*#__PURE__*/React.createElement(_DomWrapper.default, {
|
||||
ref: wrapperRef
|
||||
}, canRef ? /*#__PURE__*/React.cloneElement(mergedChildren, {
|
||||
ref: mergedRef
|
||||
}) : mergedChildren);
|
||||
}
|
||||
var RefSingleObserver = /*#__PURE__*/React.forwardRef(SingleObserver);
|
||||
if (process.env.NODE_ENV !== 'production') {
|
||||
RefSingleObserver.displayName = 'SingleObserver';
|
||||
}
|
||||
var _default = exports.default = RefSingleObserver;
|
||||
+25
@@ -0,0 +1,25 @@
|
||||
import * as React from 'react';
|
||||
import { Collection } from './Collection';
|
||||
import { _rs } from './utils/observerUtil';
|
||||
export {
|
||||
/** @private Test only for mock trigger resize event */
|
||||
_rs, };
|
||||
export interface SizeInfo {
|
||||
width: number;
|
||||
height: number;
|
||||
offsetWidth: number;
|
||||
offsetHeight: number;
|
||||
}
|
||||
export type OnResize = (size: SizeInfo, element: HTMLElement) => void;
|
||||
export interface ResizeObserverProps {
|
||||
/** Pass to ResizeObserver.Collection with additional data */
|
||||
data?: any;
|
||||
children: React.ReactNode | ((ref: React.RefObject<any>) => React.ReactElement);
|
||||
disabled?: boolean;
|
||||
/** Trigger if element resized. Will always trigger when first time render. */
|
||||
onResize?: OnResize;
|
||||
}
|
||||
declare const RefResizeObserver: React.ForwardRefExoticComponent<ResizeObserverProps & React.RefAttributes<any>> & {
|
||||
Collection: typeof Collection;
|
||||
};
|
||||
export default RefResizeObserver;
|
||||
+46
@@ -0,0 +1,46 @@
|
||||
"use strict";
|
||||
|
||||
var _interopRequireWildcard = require("@babel/runtime/helpers/interopRequireWildcard").default;
|
||||
var _interopRequireDefault = require("@babel/runtime/helpers/interopRequireDefault").default;
|
||||
Object.defineProperty(exports, "__esModule", {
|
||||
value: true
|
||||
});
|
||||
Object.defineProperty(exports, "_rs", {
|
||||
enumerable: true,
|
||||
get: function get() {
|
||||
return _observerUtil._rs;
|
||||
}
|
||||
});
|
||||
exports.default = void 0;
|
||||
var _extends2 = _interopRequireDefault(require("@babel/runtime/helpers/extends"));
|
||||
var React = _interopRequireWildcard(require("react"));
|
||||
var _toArray = _interopRequireDefault(require("rc-util/lib/Children/toArray"));
|
||||
var _warning = require("rc-util/lib/warning");
|
||||
var _SingleObserver = _interopRequireDefault(require("./SingleObserver"));
|
||||
var _Collection = require("./Collection");
|
||||
var _observerUtil = require("./utils/observerUtil");
|
||||
var INTERNAL_PREFIX_KEY = 'rc-observer-key';
|
||||
function ResizeObserver(props, ref) {
|
||||
var children = props.children;
|
||||
var childNodes = typeof children === 'function' ? [children] : (0, _toArray.default)(children);
|
||||
if (process.env.NODE_ENV !== 'production') {
|
||||
if (childNodes.length > 1) {
|
||||
(0, _warning.warning)(false, 'Find more than one child node with `children` in ResizeObserver. Please use ResizeObserver.Collection instead.');
|
||||
} else if (childNodes.length === 0) {
|
||||
(0, _warning.warning)(false, '`children` of ResizeObserver is empty. Nothing is in observe.');
|
||||
}
|
||||
}
|
||||
return childNodes.map(function (child, index) {
|
||||
var key = (child === null || child === void 0 ? void 0 : child.key) || "".concat(INTERNAL_PREFIX_KEY, "-").concat(index);
|
||||
return /*#__PURE__*/React.createElement(_SingleObserver.default, (0, _extends2.default)({}, props, {
|
||||
key: key,
|
||||
ref: index === 0 ? ref : undefined
|
||||
}), child);
|
||||
});
|
||||
}
|
||||
var RefResizeObserver = /*#__PURE__*/React.forwardRef(ResizeObserver);
|
||||
if (process.env.NODE_ENV !== 'production') {
|
||||
RefResizeObserver.displayName = 'ResizeObserver';
|
||||
}
|
||||
RefResizeObserver.Collection = _Collection.Collection;
|
||||
var _default = exports.default = RefResizeObserver;
|
||||
+7
@@ -0,0 +1,7 @@
|
||||
export type ResizeListener = (element: Element) => void;
|
||||
declare function onResize(entities: ResizeObserverEntry[]): void;
|
||||
export declare const _el: Map<Element, Set<ResizeListener>>;
|
||||
export declare const _rs: typeof onResize;
|
||||
export declare function observe(element: Element, callback: ResizeListener): void;
|
||||
export declare function unobserve(element: Element, callback: ResizeListener): void;
|
||||
export {};
|
||||
+46
@@ -0,0 +1,46 @@
|
||||
"use strict";
|
||||
|
||||
var _interopRequireDefault = require("@babel/runtime/helpers/interopRequireDefault").default;
|
||||
Object.defineProperty(exports, "__esModule", {
|
||||
value: true
|
||||
});
|
||||
exports._rs = exports._el = void 0;
|
||||
exports.observe = observe;
|
||||
exports.unobserve = unobserve;
|
||||
var _resizeObserverPolyfill = _interopRequireDefault(require("resize-observer-polyfill"));
|
||||
// =============================== Const ===============================
|
||||
var elementListeners = new Map();
|
||||
function onResize(entities) {
|
||||
entities.forEach(function (entity) {
|
||||
var _elementListeners$get;
|
||||
var target = entity.target;
|
||||
(_elementListeners$get = elementListeners.get(target)) === null || _elementListeners$get === void 0 || _elementListeners$get.forEach(function (listener) {
|
||||
return listener(target);
|
||||
});
|
||||
});
|
||||
}
|
||||
|
||||
// Note: ResizeObserver polyfill not support option to measure border-box resize
|
||||
var resizeObserver = new _resizeObserverPolyfill.default(onResize);
|
||||
|
||||
// Dev env only
|
||||
var _el = exports._el = process.env.NODE_ENV !== 'production' ? elementListeners : null; // eslint-disable-line
|
||||
var _rs = exports._rs = process.env.NODE_ENV !== 'production' ? onResize : null; // eslint-disable-line
|
||||
|
||||
// ============================== Observe ==============================
|
||||
function observe(element, callback) {
|
||||
if (!elementListeners.has(element)) {
|
||||
elementListeners.set(element, new Set());
|
||||
resizeObserver.observe(element);
|
||||
}
|
||||
elementListeners.get(element).add(callback);
|
||||
}
|
||||
function unobserve(element, callback) {
|
||||
if (elementListeners.has(element)) {
|
||||
elementListeners.get(element).delete(callback);
|
||||
if (!elementListeners.get(element).size) {
|
||||
resizeObserver.unobserve(element);
|
||||
elementListeners.delete(element);
|
||||
}
|
||||
}
|
||||
}
|
||||
+85
@@ -0,0 +1,85 @@
|
||||
{
|
||||
"name": "rc-resize-observer",
|
||||
"version": "1.4.3",
|
||||
"description": "Resize observer for React",
|
||||
"keywords": [
|
||||
"react",
|
||||
"react-component",
|
||||
"react-resize-observer",
|
||||
"resize-observer"
|
||||
],
|
||||
"main": "./lib/index",
|
||||
"module": "./es/index",
|
||||
"files": [
|
||||
"assets/*.css",
|
||||
"assets/*.less",
|
||||
"es",
|
||||
"lib"
|
||||
],
|
||||
"homepage": "https://react-component.github.io/resize-observer",
|
||||
"repository": {
|
||||
"type": "git",
|
||||
"url": "git@github.com:react-component/resize-observer.git"
|
||||
},
|
||||
"bugs": {
|
||||
"url": "http://github.com/react-component/resize-observer/issues"
|
||||
},
|
||||
"license": "MIT",
|
||||
"scripts": {
|
||||
"start": "dumi dev",
|
||||
"build": "dumi build",
|
||||
"compile": "father build && lessc assets/index.less assets/index.css",
|
||||
"deploy": "UMI_ENV=gh npm run build && gh-pages -d dist",
|
||||
"gh-pages": "npm run deploy",
|
||||
"prepare": "dumi setup",
|
||||
"prepublishOnly": "npm run compile && np --no-cleanup --yolo --no-publish",
|
||||
"postpublish": "npm run gh-pages",
|
||||
"lint": "eslint src/ --ext .ts,.tsx,.jsx,.js,.md",
|
||||
"prettier": "prettier --write \"**/*.{ts,tsx,js,jsx,json,md}\"",
|
||||
"test": "rc-test",
|
||||
"coverage": "rc-test --coverage",
|
||||
"now-build": "npm run build"
|
||||
},
|
||||
"dependencies": {
|
||||
"@babel/runtime": "^7.20.7",
|
||||
"classnames": "^2.2.1",
|
||||
"rc-util": "^5.44.1",
|
||||
"resize-observer-polyfill": "^1.5.1"
|
||||
},
|
||||
"devDependencies": {
|
||||
"@rc-component/father-plugin": "^1.0.0",
|
||||
"@testing-library/react": "^12.1.5",
|
||||
"@types/jest": "^29.5.10",
|
||||
"@types/react-dom": "^18.0.11",
|
||||
"@types/react": "^18.0.28",
|
||||
"@umijs/fabric": "^2.0.9",
|
||||
"coveralls": "^3.0.6",
|
||||
"cross-env": "^7.0.2",
|
||||
"dumi": "^2.0.0",
|
||||
"enzyme": "^3.0.0",
|
||||
"enzyme-adapter-react-16": "^1.15.6",
|
||||
"enzyme-to-json": "^3.4.0",
|
||||
"father": "^4.0.0",
|
||||
"gh-pages": "^6.1.0",
|
||||
"glob": "^7.1.6",
|
||||
"less": "^4.1.3",
|
||||
"np": "^9.0.0",
|
||||
"prettier": "^3.2.5",
|
||||
"pretty-quick": "^4.0.0",
|
||||
"rc-test": "^7.0.15",
|
||||
"react": "^16.0.0",
|
||||
"react-dom": "^16.0.0",
|
||||
"cheerio": "1.0.0-rc.12",
|
||||
"regenerator-runtime": "^0.14.0"
|
||||
},
|
||||
"peerDependencies": {
|
||||
"react": ">=16.9.0",
|
||||
"react-dom": ">=16.9.0"
|
||||
},
|
||||
"cnpm": {
|
||||
"mode": "npm"
|
||||
},
|
||||
"tnpm": {
|
||||
"mode": "npm"
|
||||
}
|
||||
}
|
||||
Reference in New Issue
Block a user