add all frontend files

This commit is contained in:
2026-01-17 15:16:36 -05:00
parent ff16ae7858
commit e40287e4aa
25704 changed files with 1935289 additions and 0 deletions

21
node_modules/@rc-component/tour/LICENSE generated vendored Normal file
View File

@@ -0,0 +1,21 @@
MIT License
Copyright (c) 2019-present react-component
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.

142
node_modules/@rc-component/tour/README.md generated vendored Normal file
View File

@@ -0,0 +1,142 @@
# @rc-component/tour
React 18 supported Tour Component.
[![NPM version][npm-image]][npm-url] [![dumi](https://img.shields.io/badge/docs%20by-dumi-blue?style=flat-square)](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-component/tour.svg?style=flat-square
[npm-url]: http://npmjs.org/package/@rc-component/tour
[github-actions-image]: https://github.com/react-component/tour/workflows/CI/badge.svg
[github-actions-url]: https://github.com/react-component/tour/actions
[codecov-image]: https://img.shields.io/codecov/c/github/react-component/tour/master.svg?style=flat-square
[codecov-url]: https://app.codecov.io/gh/react-component/tour
[download-image]: https://img.shields.io/npm/dm/@rc-component/tour.svg?style=flat-square
[download-url]: https://npmjs.org/package/@rc-component/tour
## Development
```bash
npm install
npm start
open http://localhost:8000
```
## Feature
- React life cycle support tour component
## Install
[![@rc-component/tour](https://nodei.co/npm/@rc-component/tour.png)](https://www.npmjs.com/package/@rc-component/tour)
## Usage
<!-- prettier-ignore -->
```js | pure
import Tour from '@rc-component/tour';
const Demo = () => {
const createBtnRef = useRef<HTMLButtonElement>(null);
const updateBtnRef = useRef<HTMLButtonElement>(null);
const deleteBtnRef = useRef<HTMLButtonElement>(null);
return (
<div style={{ margin: 20 }}>
<div>
<button
className="ant-target"
ref={createBtnRef}
style={{ marginLeft: 100 }}
>
Create
</button>
<div style={{ height: 200 }} />
<button className="ant-target" ref={updateBtnRef}>
Update
</button>
<button className="ant-target" ref={deleteBtnRef}>
Delete
</button>
</div>
<div style={{ height: 200 }} />
<Tour
defaultCurrent={0}
steps={[
{
title: '创建',
description: '创建一条数据',
target: () => createBtnRef.current,
mask: true,
},
{
title: '更新',
description: (
<div>
<span>更新一条数据</span>
<button>帮助文档</button>
</div>
),
target: () => updateBtnRef.current,
},
{
title: '删除',
description: (
<div>
<span>危险操作:删除一条数据</span>
<button>帮助文档</button>
</div>
),
target: () => deleteBtnRef.current,
mask: true,
style: { color: 'red' },
},
]}
/>
</div>
);
};
export default Demo;
```
## 🔥 API
We use typescript to create the Type definition. You can view directly in IDE. But you can still check the type definition [here](https://github.com/react-component/tour/blob/master/src/interface.ts).
### Tour
<!-- prettier-ignore -->
| 属性 | 类型 | 默认值 | 说明 |
| --- | --- | --- | --- |
| closeIcon | `React.ReactNode` | - | 自定义关闭按钮 |
| steps | `TourStepProps[]` | - | 引导步骤 |
| open | `boolean` | `true` | 受控打开引导(与 `current` 受控分开) |
| current | `number` | 0 | 受控当前处于哪一步 |
| defaultCurrent | `number` | 0 | 默认处于哪一步 |
| gap | `{ offset?: number \| [number, number]; radius?: number }` | - | 控制引导显示间距 |
| onChange | `(current: number) => void` | - | 步骤改变时的回调,`current`为改变前的步骤,`next`为改变后的步骤 |
| onClose | `(current: number) => void` | - | 关闭引导时的回调 |
| onFinish | `() => void` | - | 完成引导时的回调 |
| mask | `boolean \| { style?: React.CSSProperties; color?: string; }` | `true` | 整体是否启用蒙层,也可以传入自定义样式修改蒙层样式 |
| animated | `boolean \| { placeholder: boolean }` | `false` | 是否启用目标遮罩动画 |
| arrow | `boolean \| { pointAtCenter: boolean}` | `true` | 整体是否显示箭头,包含是否指向元素中心的配置 |
| scrollIntoViewOptions | `boolean \| ScrollIntoViewOptions` | `true` | 是否支持当前元素滚动到视窗内,也可传入配置指定滚动视窗的相关参数 |
| onPopupAlign | `function(popupDomNode, align)` | - | 当弹出框对齐后回调 |
| zIndex | `number` | 1001 | 弹层的层级 |
### TourStep
<!-- prettier-ignore -->
| 属性 | 类型 | 默认值 | 说明 |
| --- | --- | --- | --- |
| closeIcon | `React.ReactNode` | - | 自定义关闭按钮 |
| target | `() => HTMLElement` \| `HTMLElement` | - | 获取引导卡片指向的元素 |
| arrow | `boolean` \| `{ pointAtCenter: boolean}` | `true` | 是否显示箭头,包含是否指向元素中心的配置 |
| placement | `left` \| `leftTop` \| `leftBottom` \| `right` \| `rightTop` \| `rightBottom` \| `top` \| `topLeft` \| `topRight` \| `bottom` \| `bottomLeft` \| `bottomRight` | `bottom` | 引导卡片相对于目标元素的位置 |
| onClose | `() => void` | - | 关闭引导时的回调函数 |
| mask | `boolean \| { style?: React.CSSProperties; color?: string; }` | `true` | 是否启用蒙层,也可以传入自定义样式修改蒙层样式,默认跟随 Tour 的 `mask` 属性 |
| renderPanel | `(props: TourStepProps, current: number) => ReactNode;` | | 渲染 popoup 弹窗方法 |
| className | `string` | - | - |
| style | `React.CSSProperties` | - | - |
| scrollIntoViewOptions | `boolean \| ScrollIntoViewOptions` | `true` | 是否支持当前元素滚动到视窗内,也可传入配置指定滚动视窗的相关参数,默认跟随 Tour 的 `scrollIntoViewOptions` 属性 |

18
node_modules/@rc-component/tour/es/Mask.d.ts generated vendored Normal file
View File

@@ -0,0 +1,18 @@
import React from 'react';
import type { PosInfo } from './hooks/useTarget';
export interface MaskProps {
prefixCls?: string;
pos: PosInfo;
rootClassName?: string;
showMask?: boolean;
style?: React.CSSProperties;
fill?: string;
open?: boolean;
animated?: boolean | {
placeholder: boolean;
};
zIndex?: number;
disabledInteraction?: boolean;
}
declare const Mask: (props: MaskProps) => React.JSX.Element;
export default Mask;

99
node_modules/@rc-component/tour/es/Mask.js generated vendored Normal file
View File

@@ -0,0 +1,99 @@
import _extends from "@babel/runtime/helpers/esm/extends";
import _objectSpread from "@babel/runtime/helpers/esm/objectSpread2";
import _typeof from "@babel/runtime/helpers/esm/typeof";
import React from 'react';
import classNames from 'classnames';
import Portal from '@rc-component/portal';
import useId from "rc-util/es/hooks/useId";
var COVER_PROPS = {
fill: 'transparent',
pointerEvents: 'auto'
};
var Mask = function Mask(props) {
var prefixCls = props.prefixCls,
rootClassName = props.rootClassName,
pos = props.pos,
showMask = props.showMask,
_props$style = props.style,
style = _props$style === void 0 ? {} : _props$style,
_props$fill = props.fill,
fill = _props$fill === void 0 ? "rgba(0,0,0,0.5)" : _props$fill,
open = props.open,
animated = props.animated,
zIndex = props.zIndex,
disabledInteraction = props.disabledInteraction;
var id = useId();
var maskId = "".concat(prefixCls, "-mask-").concat(id);
var mergedAnimated = _typeof(animated) === 'object' ? animated === null || animated === void 0 ? void 0 : animated.placeholder : animated;
var isSafari = typeof navigator !== 'undefined' && /^((?!chrome|android).)*safari/i.test(navigator.userAgent);
var maskRectSize = isSafari ? {
width: '100%',
height: '100%'
} : {
width: '100vw',
height: '100vh'
};
return /*#__PURE__*/React.createElement(Portal, {
open: open,
autoLock: true
}, /*#__PURE__*/React.createElement("div", {
className: classNames("".concat(prefixCls, "-mask"), rootClassName),
style: _objectSpread({
position: 'fixed',
left: 0,
right: 0,
top: 0,
bottom: 0,
zIndex: zIndex,
pointerEvents: pos && !disabledInteraction ? 'none' : 'auto'
}, style)
}, showMask ? /*#__PURE__*/React.createElement("svg", {
style: {
width: '100%',
height: '100%'
}
}, /*#__PURE__*/React.createElement("defs", null, /*#__PURE__*/React.createElement("mask", {
id: maskId
}, /*#__PURE__*/React.createElement("rect", _extends({
x: "0",
y: "0"
}, maskRectSize, {
fill: "white"
})), pos && /*#__PURE__*/React.createElement("rect", {
x: pos.left,
y: pos.top,
rx: pos.radius,
width: pos.width,
height: pos.height,
fill: "black",
className: mergedAnimated ? "".concat(prefixCls, "-placeholder-animated") : ''
}))), /*#__PURE__*/React.createElement("rect", {
x: "0",
y: "0",
width: "100%",
height: "100%",
fill: fill,
mask: "url(#".concat(maskId, ")")
}), pos && /*#__PURE__*/React.createElement(React.Fragment, null, /*#__PURE__*/React.createElement("rect", _extends({}, COVER_PROPS, {
x: "0",
y: "0",
width: "100%",
height: pos.top
})), /*#__PURE__*/React.createElement("rect", _extends({}, COVER_PROPS, {
x: "0",
y: "0",
width: pos.left,
height: "100%"
})), /*#__PURE__*/React.createElement("rect", _extends({}, COVER_PROPS, {
x: "0",
y: pos.top + pos.height,
width: "100%",
height: "calc(100vh - ".concat(pos.top + pos.height, "px)")
})), /*#__PURE__*/React.createElement("rect", _extends({}, COVER_PROPS, {
x: pos.left + pos.width,
y: "0",
width: "calc(100vw - ".concat(pos.left + pos.width, "px)"),
height: "100%"
})))) : null));
};
export default Mask;

5
node_modules/@rc-component/tour/es/Tour.d.ts generated vendored Normal file
View File

@@ -0,0 +1,5 @@
import * as React from 'react';
import type { TourProps } from './interface';
export type { TourProps };
declare const Tour: React.FC<TourProps>;
export default Tour;

209
node_modules/@rc-component/tour/es/Tour.js generated vendored Normal file
View File

@@ -0,0 +1,209 @@
import _objectSpread from "@babel/runtime/helpers/esm/objectSpread2";
import _extends from "@babel/runtime/helpers/esm/extends";
import _typeof from "@babel/runtime/helpers/esm/typeof";
import _slicedToArray from "@babel/runtime/helpers/esm/slicedToArray";
import _objectWithoutProperties from "@babel/runtime/helpers/esm/objectWithoutProperties";
var _excluded = ["prefixCls", "steps", "defaultCurrent", "current", "onChange", "onClose", "onFinish", "open", "mask", "arrow", "rootClassName", "placement", "renderPanel", "gap", "animated", "scrollIntoViewOptions", "zIndex", "closeIcon", "closable", "builtinPlacements", "disabledInteraction"];
import * as React from 'react';
import Portal from '@rc-component/portal';
import Trigger from '@rc-component/trigger';
import classNames from 'classnames';
import useLayoutEffect from "rc-util/es/hooks/useLayoutEffect";
import useMergedState from "rc-util/es/hooks/useMergedState";
import { useMemo } from 'react';
import { useClosable } from "./hooks/useClosable";
import useTarget from "./hooks/useTarget";
import Mask from "./Mask";
import { getPlacements } from "./placements";
import TourStep from "./TourStep";
import { getPlacement } from "./util";
var CENTER_PLACEHOLDER = {
left: '50%',
top: '50%',
width: 1,
height: 1
};
var defaultScrollIntoViewOptions = {
block: 'center',
inline: 'center'
};
var Tour = function Tour(props) {
var _props$prefixCls = props.prefixCls,
prefixCls = _props$prefixCls === void 0 ? 'rc-tour' : _props$prefixCls,
_props$steps = props.steps,
steps = _props$steps === void 0 ? [] : _props$steps,
defaultCurrent = props.defaultCurrent,
current = props.current,
onChange = props.onChange,
onClose = props.onClose,
_onFinish = props.onFinish,
open = props.open,
_props$mask = props.mask,
mask = _props$mask === void 0 ? true : _props$mask,
_props$arrow = props.arrow,
arrow = _props$arrow === void 0 ? true : _props$arrow,
rootClassName = props.rootClassName,
placement = props.placement,
renderPanel = props.renderPanel,
gap = props.gap,
animated = props.animated,
_props$scrollIntoView = props.scrollIntoViewOptions,
scrollIntoViewOptions = _props$scrollIntoView === void 0 ? defaultScrollIntoViewOptions : _props$scrollIntoView,
_props$zIndex = props.zIndex,
zIndex = _props$zIndex === void 0 ? 1001 : _props$zIndex,
closeIcon = props.closeIcon,
closable = props.closable,
builtinPlacements = props.builtinPlacements,
disabledInteraction = props.disabledInteraction,
restProps = _objectWithoutProperties(props, _excluded);
var triggerRef = React.useRef();
var _useMergedState = useMergedState(0, {
value: current,
defaultValue: defaultCurrent
}),
_useMergedState2 = _slicedToArray(_useMergedState, 2),
mergedCurrent = _useMergedState2[0],
setMergedCurrent = _useMergedState2[1];
var _useMergedState3 = useMergedState(undefined, {
value: open,
postState: function postState(origin) {
return mergedCurrent < 0 || mergedCurrent >= steps.length ? false : origin !== null && origin !== void 0 ? origin : true;
}
}),
_useMergedState4 = _slicedToArray(_useMergedState3, 2),
mergedOpen = _useMergedState4[0],
setMergedOpen = _useMergedState4[1];
// Record if already rended in the DOM to avoid `findDOMNode` issue
var _React$useState = React.useState(mergedOpen),
_React$useState2 = _slicedToArray(_React$useState, 2),
hasOpened = _React$useState2[0],
setHasOpened = _React$useState2[1];
var openRef = React.useRef(mergedOpen);
useLayoutEffect(function () {
if (mergedOpen) {
if (!openRef.current) {
setMergedCurrent(0);
}
setHasOpened(true);
}
openRef.current = mergedOpen;
}, [mergedOpen]);
var _ref = steps[mergedCurrent] || {},
target = _ref.target,
stepPlacement = _ref.placement,
stepStyle = _ref.style,
stepArrow = _ref.arrow,
stepClassName = _ref.className,
stepMask = _ref.mask,
_ref$scrollIntoViewOp = _ref.scrollIntoViewOptions,
stepScrollIntoViewOptions = _ref$scrollIntoViewOp === void 0 ? defaultScrollIntoViewOptions : _ref$scrollIntoViewOp,
stepCloseIcon = _ref.closeIcon,
stepClosable = _ref.closable;
var mergedClosable = useClosable(stepClosable, stepCloseIcon, closable, closeIcon);
var mergedMask = mergedOpen && (stepMask !== null && stepMask !== void 0 ? stepMask : mask);
var mergedScrollIntoViewOptions = stepScrollIntoViewOptions !== null && stepScrollIntoViewOptions !== void 0 ? stepScrollIntoViewOptions : scrollIntoViewOptions;
var _useTarget = useTarget(target, open, gap, mergedScrollIntoViewOptions),
_useTarget2 = _slicedToArray(_useTarget, 2),
posInfo = _useTarget2[0],
targetElement = _useTarget2[1];
var mergedPlacement = getPlacement(targetElement, placement, stepPlacement);
// ========================= arrow =========================
var mergedArrow = targetElement ? typeof stepArrow === 'undefined' ? arrow : stepArrow : false;
var arrowPointAtCenter = _typeof(mergedArrow) === 'object' ? mergedArrow.pointAtCenter : false;
useLayoutEffect(function () {
var _triggerRef$current;
(_triggerRef$current = triggerRef.current) === null || _triggerRef$current === void 0 ? void 0 : _triggerRef$current.forceAlign();
}, [arrowPointAtCenter, mergedCurrent]);
// ========================= Change =========================
var onInternalChange = function onInternalChange(nextCurrent) {
setMergedCurrent(nextCurrent);
onChange === null || onChange === void 0 ? void 0 : onChange(nextCurrent);
};
var mergedBuiltinPlacements = useMemo(function () {
if (builtinPlacements) {
return typeof builtinPlacements === 'function' ? builtinPlacements({
arrowPointAtCenter: arrowPointAtCenter
}) : builtinPlacements;
}
return getPlacements(arrowPointAtCenter);
}, [builtinPlacements, arrowPointAtCenter]);
// ========================= Render =========================
// Skip if not init yet
if (targetElement === undefined || !hasOpened) {
return null;
}
var handleClose = function handleClose() {
setMergedOpen(false);
onClose === null || onClose === void 0 ? void 0 : onClose(mergedCurrent);
};
var getPopupElement = function getPopupElement() {
return /*#__PURE__*/React.createElement(TourStep, _extends({
arrow: mergedArrow,
key: "content",
prefixCls: prefixCls,
total: steps.length,
renderPanel: renderPanel,
onPrev: function onPrev() {
onInternalChange(mergedCurrent - 1);
},
onNext: function onNext() {
onInternalChange(mergedCurrent + 1);
},
onClose: handleClose,
current: mergedCurrent,
onFinish: function onFinish() {
handleClose();
_onFinish === null || _onFinish === void 0 ? void 0 : _onFinish();
}
}, steps[mergedCurrent], {
closable: mergedClosable
}));
};
var mergedShowMask = typeof mergedMask === 'boolean' ? mergedMask : !!mergedMask;
var mergedMaskStyle = typeof mergedMask === 'boolean' ? undefined : mergedMask;
// when targetElement is not exist, use body as triggerDOMNode
var getTriggerDOMNode = function getTriggerDOMNode(node) {
return node || targetElement || document.body;
};
return /*#__PURE__*/React.createElement(React.Fragment, null, /*#__PURE__*/React.createElement(Mask, {
zIndex: zIndex,
prefixCls: prefixCls,
pos: posInfo,
showMask: mergedShowMask,
style: mergedMaskStyle === null || mergedMaskStyle === void 0 ? void 0 : mergedMaskStyle.style,
fill: mergedMaskStyle === null || mergedMaskStyle === void 0 ? void 0 : mergedMaskStyle.color,
open: mergedOpen,
animated: animated,
rootClassName: rootClassName,
disabledInteraction: disabledInteraction
}), /*#__PURE__*/React.createElement(Trigger, _extends({}, restProps, {
builtinPlacements: mergedBuiltinPlacements,
ref: triggerRef,
popupStyle: stepStyle,
popupPlacement: mergedPlacement,
popupVisible: mergedOpen,
popupClassName: classNames(rootClassName, stepClassName),
prefixCls: prefixCls,
popup: getPopupElement,
forceRender: false,
destroyPopupOnHide: true,
zIndex: zIndex,
getTriggerDOMNode: getTriggerDOMNode,
arrow: !!mergedArrow
}), /*#__PURE__*/React.createElement(Portal, {
open: mergedOpen,
autoLock: true
}, /*#__PURE__*/React.createElement("div", {
className: classNames(rootClassName, "".concat(prefixCls, "-target-placeholder")),
style: _objectSpread(_objectSpread({}, posInfo || CENTER_PLACEHOLDER), {}, {
position: 'fixed',
pointerEvents: 'none'
})
}))));
};
export default Tour;

View File

@@ -0,0 +1,6 @@
import * as React from 'react';
import type { TourStepProps } from '../interface';
export type DefaultPanelProps = Exclude<TourStepProps, "closable"> & {
closable: Exclude<TourStepProps["closable"], boolean>;
};
export default function DefaultPanel(props: DefaultPanelProps): React.JSX.Element;

View File

@@ -0,0 +1,63 @@
import _toConsumableArray from "@babel/runtime/helpers/esm/toConsumableArray";
import _extends from "@babel/runtime/helpers/esm/extends";
import * as React from 'react';
import classNames from 'classnames';
import pickAttrs from "rc-util/es/pickAttrs";
export default function DefaultPanel(props) {
var _closable$closeIcon;
var prefixCls = props.prefixCls,
current = props.current,
total = props.total,
title = props.title,
description = props.description,
onClose = props.onClose,
onPrev = props.onPrev,
onNext = props.onNext,
onFinish = props.onFinish,
className = props.className,
closable = props.closable;
var ariaProps = pickAttrs(closable || {}, true);
var closeIcon = (_closable$closeIcon = closable === null || closable === void 0 ? void 0 : closable.closeIcon) !== null && _closable$closeIcon !== void 0 ? _closable$closeIcon : /*#__PURE__*/React.createElement("span", {
className: "".concat(prefixCls, "-close-x")
}, "\xD7");
var mergedClosable = !!closable;
return /*#__PURE__*/React.createElement("div", {
className: classNames("".concat(prefixCls, "-content"), className)
}, /*#__PURE__*/React.createElement("div", {
className: "".concat(prefixCls, "-inner")
}, mergedClosable && /*#__PURE__*/React.createElement("button", _extends({
type: "button",
onClick: onClose,
"aria-label": "Close"
}, ariaProps, {
className: "".concat(prefixCls, "-close")
}), closeIcon), /*#__PURE__*/React.createElement("div", {
className: "".concat(prefixCls, "-header")
}, /*#__PURE__*/React.createElement("div", {
className: "".concat(prefixCls, "-title")
}, title)), /*#__PURE__*/React.createElement("div", {
className: "".concat(prefixCls, "-description")
}, description), /*#__PURE__*/React.createElement("div", {
className: "".concat(prefixCls, "-footer")
}, /*#__PURE__*/React.createElement("div", {
className: "".concat(prefixCls, "-sliders")
}, total > 1 ? _toConsumableArray(Array.from({
length: total
}).keys()).map(function (item, index) {
return /*#__PURE__*/React.createElement("span", {
key: item,
className: index === current ? 'active' : ''
});
}) : null), /*#__PURE__*/React.createElement("div", {
className: "".concat(prefixCls, "-buttons")
}, current !== 0 ? /*#__PURE__*/React.createElement("button", {
className: "".concat(prefixCls, "-prev-btn"),
onClick: onPrev
}, "Prev") : null, current === total - 1 ? /*#__PURE__*/React.createElement("button", {
className: "".concat(prefixCls, "-finish-btn"),
onClick: onFinish
}, "Finish") : /*#__PURE__*/React.createElement("button", {
className: "".concat(prefixCls, "-next-btn"),
onClick: onNext
}, "Next")))));
}

View File

@@ -0,0 +1,6 @@
import * as React from 'react';
import { type DefaultPanelProps } from './DefaultPanel';
import type { TourStepProps, TourStepInfo } from '../interface';
export type { TourStepProps, TourStepInfo, };
declare const TourStep: (props: DefaultPanelProps) => React.JSX.Element;
export default TourStep;

8
node_modules/@rc-component/tour/es/TourStep/index.js generated vendored Normal file
View File

@@ -0,0 +1,8 @@
import * as React from 'react';
import DefaultPanel from "./DefaultPanel";
var TourStep = function TourStep(props) {
var current = props.current,
renderPanel = props.renderPanel;
return /*#__PURE__*/React.createElement(React.Fragment, null, typeof renderPanel === 'function' ? renderPanel(props, current) : /*#__PURE__*/React.createElement(DefaultPanel, props));
};
export default TourStep;

View File

@@ -0,0 +1,6 @@
import * as React from 'react';
import type { TourProps } from '../interface';
import type { TourStepInfo } from '../TourStep';
export declare function useClosable(stepClosable: TourStepInfo['closable'], stepCloseIcon: TourStepInfo['closeIcon'], closable: TourProps['closable'], closeIcon: TourProps['closeIcon']): {
closeIcon?: React.ReactNode;
} & React.AriaAttributes;

View File

@@ -0,0 +1,37 @@
import _objectSpread from "@babel/runtime/helpers/esm/objectSpread2";
import _typeof from "@babel/runtime/helpers/esm/typeof";
import * as React from 'react';
function isConfigObj(closable) {
return closable !== null && _typeof(closable) === 'object';
}
/**
* Convert `closable` to ClosableConfig.
* When `preset` is true, will auto fill ClosableConfig with default value.
*/
function getClosableConfig(closable, closeIcon, preset) {
if (closable === false || closeIcon === false && (!isConfigObj(closable) || !closable.closeIcon)) {
return null;
}
var mergedCloseIcon = typeof closeIcon !== 'boolean' ? closeIcon : undefined;
if (isConfigObj(closable)) {
var _closable$closeIcon;
return _objectSpread(_objectSpread({}, closable), {}, {
closeIcon: (_closable$closeIcon = closable.closeIcon) !== null && _closable$closeIcon !== void 0 ? _closable$closeIcon : mergedCloseIcon
});
}
// When StepClosable no need auto fill, but RootClosable need this.
return preset || closable || closeIcon ? {
closeIcon: mergedCloseIcon
} : 'empty';
}
export function useClosable(stepClosable, stepCloseIcon, closable, closeIcon) {
return React.useMemo(function () {
var stepClosableConfig = getClosableConfig(stepClosable, stepCloseIcon, false);
var rootClosableConfig = getClosableConfig(closable, closeIcon, true);
if (stepClosableConfig !== 'empty') {
return stepClosableConfig;
}
return rootClosableConfig;
}, [closable, closeIcon, stepClosable, stepCloseIcon]);
}

View File

@@ -0,0 +1,13 @@
import type { TourStepInfo } from '..';
export interface Gap {
offset?: number | [number, number];
radius?: number;
}
export interface PosInfo {
left: number;
top: number;
height: number;
width: number;
radius: number;
}
export default function useTarget(target: TourStepInfo['target'], open: boolean, gap?: Gap, scrollIntoViewOptions?: boolean | ScrollIntoViewOptions): [PosInfo, HTMLElement];

86
node_modules/@rc-component/tour/es/hooks/useTarget.js generated vendored Normal file
View File

@@ -0,0 +1,86 @@
import _slicedToArray from "@babel/runtime/helpers/esm/slicedToArray";
import useEvent from "rc-util/es/hooks/useEvent";
import useLayoutEffect from "rc-util/es/hooks/useLayoutEffect";
import { useMemo, useState } from 'react';
import { isInViewPort } from "../util";
function isValidNumber(val) {
return typeof val === 'number' && !Number.isNaN(val);
}
export default function useTarget(target, open, gap, scrollIntoViewOptions) {
// ========================= Target =========================
// We trade `undefined` as not get target by function yet.
// `null` as empty target.
var _useState = useState(undefined),
_useState2 = _slicedToArray(_useState, 2),
targetElement = _useState2[0],
setTargetElement = _useState2[1];
useLayoutEffect(function () {
var nextElement = typeof target === 'function' ? target() : target;
setTargetElement(nextElement || null);
});
// ========================= Align ==========================
var _useState3 = useState(null),
_useState4 = _slicedToArray(_useState3, 2),
posInfo = _useState4[0],
setPosInfo = _useState4[1];
var updatePos = useEvent(function () {
if (targetElement) {
// Exist target element. We should scroll and get target position
if (!isInViewPort(targetElement) && open) {
targetElement.scrollIntoView(scrollIntoViewOptions);
}
var _targetElement$getBou = targetElement.getBoundingClientRect(),
left = _targetElement$getBou.left,
top = _targetElement$getBou.top,
width = _targetElement$getBou.width,
height = _targetElement$getBou.height;
var nextPosInfo = {
left: left,
top: top,
width: width,
height: height,
radius: 0
};
setPosInfo(function (origin) {
if (JSON.stringify(origin) !== JSON.stringify(nextPosInfo)) {
return nextPosInfo;
}
return origin;
});
} else {
// Not exist target which means we just show in center
setPosInfo(null);
}
});
var getGapOffset = function getGapOffset(index) {
var _ref;
return (_ref = Array.isArray(gap === null || gap === void 0 ? void 0 : gap.offset) ? gap === null || gap === void 0 ? void 0 : gap.offset[index] : gap === null || gap === void 0 ? void 0 : gap.offset) !== null && _ref !== void 0 ? _ref : 6;
};
useLayoutEffect(function () {
updatePos();
// update when window resize
window.addEventListener('resize', updatePos);
return function () {
window.removeEventListener('resize', updatePos);
};
}, [targetElement, open, updatePos]);
// ======================== PosInfo =========================
var mergedPosInfo = useMemo(function () {
if (!posInfo) {
return posInfo;
}
var gapOffsetX = getGapOffset(0);
var gapOffsetY = getGapOffset(1);
var gapRadius = isValidNumber(gap === null || gap === void 0 ? void 0 : gap.radius) ? gap === null || gap === void 0 ? void 0 : gap.radius : 2;
return {
left: posInfo.left - gapOffsetX,
top: posInfo.top - gapOffsetY,
width: posInfo.width + gapOffsetX * 2,
height: posInfo.height + gapOffsetY * 2,
radius: gapRadius
};
}, [posInfo, gap]);
return [mergedPosInfo, targetElement];
}

3
node_modules/@rc-component/tour/es/index.d.ts generated vendored Normal file
View File

@@ -0,0 +1,3 @@
import Tour from './Tour';
export type { TourProps, TourStepInfo, TourStepProps } from './interface';
export default Tour;

2
node_modules/@rc-component/tour/es/index.js generated vendored Normal file
View File

@@ -0,0 +1,2 @@
import Tour from "./Tour";
export default Tour;

68
node_modules/@rc-component/tour/es/interface.d.ts generated vendored Normal file
View File

@@ -0,0 +1,68 @@
import type { TriggerProps } from '@rc-component/trigger';
import type { PlacementType } from './placements';
import type { CSSProperties, ReactNode } from 'react';
import type { Gap } from './hooks/useTarget';
import { type DefaultPanelProps } from './TourStep/DefaultPanel';
export interface TourStepInfo {
arrow?: boolean | {
pointAtCenter: boolean;
};
target?: HTMLElement | (() => HTMLElement) | null | (() => null);
title: ReactNode;
description?: ReactNode;
placement?: PlacementType;
mask?: boolean | {
style?: React.CSSProperties;
color?: string;
};
className?: string;
style?: CSSProperties;
scrollIntoViewOptions?: boolean | ScrollIntoViewOptions;
closeIcon?: ReactNode;
closable?: boolean | ({
closeIcon?: ReactNode;
} & React.AriaAttributes);
}
export interface TourStepProps extends TourStepInfo {
prefixCls?: string;
total?: number;
current?: number;
onClose?: () => void;
onFinish?: () => void;
renderPanel?: (step: TourStepProps, current: number) => ReactNode;
onPrev?: () => void;
onNext?: () => void;
}
export interface TourProps extends Pick<TriggerProps, 'onPopupAlign'> {
steps?: TourStepInfo[];
open?: boolean;
defaultCurrent?: number;
current?: number;
onChange?: (current: number) => void;
onClose?: (current: number) => void;
onFinish?: () => void;
closeIcon?: TourStepProps['closeIcon'];
closable?: TourStepProps['closable'];
mask?: boolean | {
style?: React.CSSProperties;
color?: string;
};
arrow?: boolean | {
pointAtCenter: boolean;
};
rootClassName?: string;
placement?: PlacementType;
prefixCls?: string;
renderPanel?: (props: DefaultPanelProps, current: number) => ReactNode;
gap?: Gap;
animated?: boolean | {
placeholder: boolean;
};
scrollIntoViewOptions?: boolean | ScrollIntoViewOptions;
zIndex?: number;
getPopupContainer?: TriggerProps['getPopupContainer'];
builtinPlacements?: TriggerProps['builtinPlacements'] | ((config?: {
arrowPointAtCenter?: boolean;
}) => TriggerProps['builtinPlacements']);
disabledInteraction?: boolean;
}

1
node_modules/@rc-component/tour/es/interface.js generated vendored Normal file
View File

@@ -0,0 +1 @@
export {};

4
node_modules/@rc-component/tour/es/placements.d.ts generated vendored Normal file
View File

@@ -0,0 +1,4 @@
import type { BuildInPlacements } from '@rc-component/trigger';
export type PlacementType = 'left' | 'leftTop' | 'leftBottom' | 'right' | 'rightTop' | 'rightBottom' | 'top' | 'topLeft' | 'topRight' | 'bottom' | 'bottomLeft' | 'bottomRight' | 'center';
export declare function getPlacements(arrowPointAtCenter?: boolean): BuildInPlacements;
export declare const placements: BuildInPlacements;

68
node_modules/@rc-component/tour/es/placements.js generated vendored Normal file
View File

@@ -0,0 +1,68 @@
import _objectSpread from "@babel/runtime/helpers/esm/objectSpread2";
var autoAdjustOverflow = {
adjustX: 1,
adjustY: 1
};
var targetOffset = [0, 0];
var basePlacements = {
left: {
points: ['cr', 'cl'],
offset: [-8, 0]
},
right: {
points: ['cl', 'cr'],
offset: [8, 0]
},
top: {
points: ['bc', 'tc'],
offset: [0, -8]
},
bottom: {
points: ['tc', 'bc'],
offset: [0, 8]
},
topLeft: {
points: ['bl', 'tl'],
offset: [0, -8]
},
leftTop: {
points: ['tr', 'tl'],
offset: [-8, 0]
},
topRight: {
points: ['br', 'tr'],
offset: [0, -8]
},
rightTop: {
points: ['tl', 'tr'],
offset: [8, 0]
},
bottomRight: {
points: ['tr', 'br'],
offset: [0, 8]
},
rightBottom: {
points: ['bl', 'br'],
offset: [8, 0]
},
bottomLeft: {
points: ['tl', 'bl'],
offset: [0, 8]
},
leftBottom: {
points: ['br', 'bl'],
offset: [-8, 0]
}
};
export function getPlacements() {
var arrowPointAtCenter = arguments.length > 0 && arguments[0] !== undefined ? arguments[0] : false;
var placements = {};
Object.keys(basePlacements).forEach(function (key) {
placements[key] = _objectSpread(_objectSpread({}, basePlacements[key]), {}, {
autoArrow: arrowPointAtCenter,
targetOffset: targetOffset
});
});
return placements;
}
export var placements = getPlacements();

3
node_modules/@rc-component/tour/es/util.d.ts generated vendored Normal file
View File

@@ -0,0 +1,3 @@
import type { PlacementType } from './placements';
export declare function isInViewPort(element: HTMLElement): boolean;
export declare function getPlacement(targetElement?: HTMLElement | null, placement?: PlacementType, stepPlacement?: PlacementType): PlacementType;

14
node_modules/@rc-component/tour/es/util.js generated vendored Normal file
View File

@@ -0,0 +1,14 @@
export function isInViewPort(element) {
var viewWidth = window.innerWidth || document.documentElement.clientWidth;
var viewHeight = window.innerHeight || document.documentElement.clientHeight;
var _element$getBoundingC = element.getBoundingClientRect(),
top = _element$getBoundingC.top,
right = _element$getBoundingC.right,
bottom = _element$getBoundingC.bottom,
left = _element$getBoundingC.left;
return top >= 0 && left >= 0 && right <= viewWidth && bottom <= viewHeight;
}
export function getPlacement(targetElement, placement, stepPlacement) {
var _ref;
return (_ref = stepPlacement !== null && stepPlacement !== void 0 ? stepPlacement : placement) !== null && _ref !== void 0 ? _ref : targetElement === null ? 'center' : 'bottom';
}

18
node_modules/@rc-component/tour/lib/Mask.d.ts generated vendored Normal file
View File

@@ -0,0 +1,18 @@
import React from 'react';
import type { PosInfo } from './hooks/useTarget';
export interface MaskProps {
prefixCls?: string;
pos: PosInfo;
rootClassName?: string;
showMask?: boolean;
style?: React.CSSProperties;
fill?: string;
open?: boolean;
animated?: boolean | {
placeholder: boolean;
};
zIndex?: number;
disabledInteraction?: boolean;
}
declare const Mask: (props: MaskProps) => React.JSX.Element;
export default Mask;

107
node_modules/@rc-component/tour/lib/Mask.js generated vendored Normal file
View File

@@ -0,0 +1,107 @@
"use strict";
var _interopRequireDefault = require("@babel/runtime/helpers/interopRequireDefault").default;
Object.defineProperty(exports, "__esModule", {
value: true
});
exports.default = void 0;
var _extends2 = _interopRequireDefault(require("@babel/runtime/helpers/extends"));
var _objectSpread2 = _interopRequireDefault(require("@babel/runtime/helpers/objectSpread2"));
var _typeof2 = _interopRequireDefault(require("@babel/runtime/helpers/typeof"));
var _react = _interopRequireDefault(require("react"));
var _classnames = _interopRequireDefault(require("classnames"));
var _portal = _interopRequireDefault(require("@rc-component/portal"));
var _useId = _interopRequireDefault(require("rc-util/lib/hooks/useId"));
var COVER_PROPS = {
fill: 'transparent',
pointerEvents: 'auto'
};
var Mask = function Mask(props) {
var prefixCls = props.prefixCls,
rootClassName = props.rootClassName,
pos = props.pos,
showMask = props.showMask,
_props$style = props.style,
style = _props$style === void 0 ? {} : _props$style,
_props$fill = props.fill,
fill = _props$fill === void 0 ? "rgba(0,0,0,0.5)" : _props$fill,
open = props.open,
animated = props.animated,
zIndex = props.zIndex,
disabledInteraction = props.disabledInteraction;
var id = (0, _useId.default)();
var maskId = "".concat(prefixCls, "-mask-").concat(id);
var mergedAnimated = (0, _typeof2.default)(animated) === 'object' ? animated === null || animated === void 0 ? void 0 : animated.placeholder : animated;
var isSafari = typeof navigator !== 'undefined' && /^((?!chrome|android).)*safari/i.test(navigator.userAgent);
var maskRectSize = isSafari ? {
width: '100%',
height: '100%'
} : {
width: '100vw',
height: '100vh'
};
return /*#__PURE__*/_react.default.createElement(_portal.default, {
open: open,
autoLock: true
}, /*#__PURE__*/_react.default.createElement("div", {
className: (0, _classnames.default)("".concat(prefixCls, "-mask"), rootClassName),
style: (0, _objectSpread2.default)({
position: 'fixed',
left: 0,
right: 0,
top: 0,
bottom: 0,
zIndex: zIndex,
pointerEvents: pos && !disabledInteraction ? 'none' : 'auto'
}, style)
}, showMask ? /*#__PURE__*/_react.default.createElement("svg", {
style: {
width: '100%',
height: '100%'
}
}, /*#__PURE__*/_react.default.createElement("defs", null, /*#__PURE__*/_react.default.createElement("mask", {
id: maskId
}, /*#__PURE__*/_react.default.createElement("rect", (0, _extends2.default)({
x: "0",
y: "0"
}, maskRectSize, {
fill: "white"
})), pos && /*#__PURE__*/_react.default.createElement("rect", {
x: pos.left,
y: pos.top,
rx: pos.radius,
width: pos.width,
height: pos.height,
fill: "black",
className: mergedAnimated ? "".concat(prefixCls, "-placeholder-animated") : ''
}))), /*#__PURE__*/_react.default.createElement("rect", {
x: "0",
y: "0",
width: "100%",
height: "100%",
fill: fill,
mask: "url(#".concat(maskId, ")")
}), pos && /*#__PURE__*/_react.default.createElement(_react.default.Fragment, null, /*#__PURE__*/_react.default.createElement("rect", (0, _extends2.default)({}, COVER_PROPS, {
x: "0",
y: "0",
width: "100%",
height: pos.top
})), /*#__PURE__*/_react.default.createElement("rect", (0, _extends2.default)({}, COVER_PROPS, {
x: "0",
y: "0",
width: pos.left,
height: "100%"
})), /*#__PURE__*/_react.default.createElement("rect", (0, _extends2.default)({}, COVER_PROPS, {
x: "0",
y: pos.top + pos.height,
width: "100%",
height: "calc(100vh - ".concat(pos.top + pos.height, "px)")
})), /*#__PURE__*/_react.default.createElement("rect", (0, _extends2.default)({}, COVER_PROPS, {
x: pos.left + pos.width,
y: "0",
width: "calc(100vw - ".concat(pos.left + pos.width, "px)"),
height: "100%"
})))) : null));
};
var _default = Mask;
exports.default = _default;

5
node_modules/@rc-component/tour/lib/Tour.d.ts generated vendored Normal file
View File

@@ -0,0 +1,5 @@
import * as React from 'react';
import type { TourProps } from './interface';
export type { TourProps };
declare const Tour: React.FC<TourProps>;
export default Tour;

217
node_modules/@rc-component/tour/lib/Tour.js generated vendored Normal file
View File

@@ -0,0 +1,217 @@
"use strict";
var _interopRequireDefault = require("@babel/runtime/helpers/interopRequireDefault").default;
var _interopRequireWildcard = require("@babel/runtime/helpers/interopRequireWildcard").default;
Object.defineProperty(exports, "__esModule", {
value: true
});
exports.default = void 0;
var _objectSpread2 = _interopRequireDefault(require("@babel/runtime/helpers/objectSpread2"));
var _extends2 = _interopRequireDefault(require("@babel/runtime/helpers/extends"));
var _typeof2 = _interopRequireDefault(require("@babel/runtime/helpers/typeof"));
var _slicedToArray2 = _interopRequireDefault(require("@babel/runtime/helpers/slicedToArray"));
var _objectWithoutProperties2 = _interopRequireDefault(require("@babel/runtime/helpers/objectWithoutProperties"));
var React = _interopRequireWildcard(require("react"));
var _portal = _interopRequireDefault(require("@rc-component/portal"));
var _trigger = _interopRequireDefault(require("@rc-component/trigger"));
var _classnames = _interopRequireDefault(require("classnames"));
var _useLayoutEffect = _interopRequireDefault(require("rc-util/lib/hooks/useLayoutEffect"));
var _useMergedState5 = _interopRequireDefault(require("rc-util/lib/hooks/useMergedState"));
var _useClosable = require("./hooks/useClosable");
var _useTarget3 = _interopRequireDefault(require("./hooks/useTarget"));
var _Mask = _interopRequireDefault(require("./Mask"));
var _placements = require("./placements");
var _TourStep = _interopRequireDefault(require("./TourStep"));
var _util = require("./util");
var _excluded = ["prefixCls", "steps", "defaultCurrent", "current", "onChange", "onClose", "onFinish", "open", "mask", "arrow", "rootClassName", "placement", "renderPanel", "gap", "animated", "scrollIntoViewOptions", "zIndex", "closeIcon", "closable", "builtinPlacements", "disabledInteraction"];
var CENTER_PLACEHOLDER = {
left: '50%',
top: '50%',
width: 1,
height: 1
};
var defaultScrollIntoViewOptions = {
block: 'center',
inline: 'center'
};
var Tour = function Tour(props) {
var _props$prefixCls = props.prefixCls,
prefixCls = _props$prefixCls === void 0 ? 'rc-tour' : _props$prefixCls,
_props$steps = props.steps,
steps = _props$steps === void 0 ? [] : _props$steps,
defaultCurrent = props.defaultCurrent,
current = props.current,
onChange = props.onChange,
onClose = props.onClose,
_onFinish = props.onFinish,
open = props.open,
_props$mask = props.mask,
mask = _props$mask === void 0 ? true : _props$mask,
_props$arrow = props.arrow,
arrow = _props$arrow === void 0 ? true : _props$arrow,
rootClassName = props.rootClassName,
placement = props.placement,
renderPanel = props.renderPanel,
gap = props.gap,
animated = props.animated,
_props$scrollIntoView = props.scrollIntoViewOptions,
scrollIntoViewOptions = _props$scrollIntoView === void 0 ? defaultScrollIntoViewOptions : _props$scrollIntoView,
_props$zIndex = props.zIndex,
zIndex = _props$zIndex === void 0 ? 1001 : _props$zIndex,
closeIcon = props.closeIcon,
closable = props.closable,
builtinPlacements = props.builtinPlacements,
disabledInteraction = props.disabledInteraction,
restProps = (0, _objectWithoutProperties2.default)(props, _excluded);
var triggerRef = React.useRef();
var _useMergedState = (0, _useMergedState5.default)(0, {
value: current,
defaultValue: defaultCurrent
}),
_useMergedState2 = (0, _slicedToArray2.default)(_useMergedState, 2),
mergedCurrent = _useMergedState2[0],
setMergedCurrent = _useMergedState2[1];
var _useMergedState3 = (0, _useMergedState5.default)(undefined, {
value: open,
postState: function postState(origin) {
return mergedCurrent < 0 || mergedCurrent >= steps.length ? false : origin !== null && origin !== void 0 ? origin : true;
}
}),
_useMergedState4 = (0, _slicedToArray2.default)(_useMergedState3, 2),
mergedOpen = _useMergedState4[0],
setMergedOpen = _useMergedState4[1];
// Record if already rended in the DOM to avoid `findDOMNode` issue
var _React$useState = React.useState(mergedOpen),
_React$useState2 = (0, _slicedToArray2.default)(_React$useState, 2),
hasOpened = _React$useState2[0],
setHasOpened = _React$useState2[1];
var openRef = React.useRef(mergedOpen);
(0, _useLayoutEffect.default)(function () {
if (mergedOpen) {
if (!openRef.current) {
setMergedCurrent(0);
}
setHasOpened(true);
}
openRef.current = mergedOpen;
}, [mergedOpen]);
var _ref = steps[mergedCurrent] || {},
target = _ref.target,
stepPlacement = _ref.placement,
stepStyle = _ref.style,
stepArrow = _ref.arrow,
stepClassName = _ref.className,
stepMask = _ref.mask,
_ref$scrollIntoViewOp = _ref.scrollIntoViewOptions,
stepScrollIntoViewOptions = _ref$scrollIntoViewOp === void 0 ? defaultScrollIntoViewOptions : _ref$scrollIntoViewOp,
stepCloseIcon = _ref.closeIcon,
stepClosable = _ref.closable;
var mergedClosable = (0, _useClosable.useClosable)(stepClosable, stepCloseIcon, closable, closeIcon);
var mergedMask = mergedOpen && (stepMask !== null && stepMask !== void 0 ? stepMask : mask);
var mergedScrollIntoViewOptions = stepScrollIntoViewOptions !== null && stepScrollIntoViewOptions !== void 0 ? stepScrollIntoViewOptions : scrollIntoViewOptions;
var _useTarget = (0, _useTarget3.default)(target, open, gap, mergedScrollIntoViewOptions),
_useTarget2 = (0, _slicedToArray2.default)(_useTarget, 2),
posInfo = _useTarget2[0],
targetElement = _useTarget2[1];
var mergedPlacement = (0, _util.getPlacement)(targetElement, placement, stepPlacement);
// ========================= arrow =========================
var mergedArrow = targetElement ? typeof stepArrow === 'undefined' ? arrow : stepArrow : false;
var arrowPointAtCenter = (0, _typeof2.default)(mergedArrow) === 'object' ? mergedArrow.pointAtCenter : false;
(0, _useLayoutEffect.default)(function () {
var _triggerRef$current;
(_triggerRef$current = triggerRef.current) === null || _triggerRef$current === void 0 ? void 0 : _triggerRef$current.forceAlign();
}, [arrowPointAtCenter, mergedCurrent]);
// ========================= Change =========================
var onInternalChange = function onInternalChange(nextCurrent) {
setMergedCurrent(nextCurrent);
onChange === null || onChange === void 0 ? void 0 : onChange(nextCurrent);
};
var mergedBuiltinPlacements = (0, React.useMemo)(function () {
if (builtinPlacements) {
return typeof builtinPlacements === 'function' ? builtinPlacements({
arrowPointAtCenter: arrowPointAtCenter
}) : builtinPlacements;
}
return (0, _placements.getPlacements)(arrowPointAtCenter);
}, [builtinPlacements, arrowPointAtCenter]);
// ========================= Render =========================
// Skip if not init yet
if (targetElement === undefined || !hasOpened) {
return null;
}
var handleClose = function handleClose() {
setMergedOpen(false);
onClose === null || onClose === void 0 ? void 0 : onClose(mergedCurrent);
};
var getPopupElement = function getPopupElement() {
return /*#__PURE__*/React.createElement(_TourStep.default, (0, _extends2.default)({
arrow: mergedArrow,
key: "content",
prefixCls: prefixCls,
total: steps.length,
renderPanel: renderPanel,
onPrev: function onPrev() {
onInternalChange(mergedCurrent - 1);
},
onNext: function onNext() {
onInternalChange(mergedCurrent + 1);
},
onClose: handleClose,
current: mergedCurrent,
onFinish: function onFinish() {
handleClose();
_onFinish === null || _onFinish === void 0 ? void 0 : _onFinish();
}
}, steps[mergedCurrent], {
closable: mergedClosable
}));
};
var mergedShowMask = typeof mergedMask === 'boolean' ? mergedMask : !!mergedMask;
var mergedMaskStyle = typeof mergedMask === 'boolean' ? undefined : mergedMask;
// when targetElement is not exist, use body as triggerDOMNode
var getTriggerDOMNode = function getTriggerDOMNode(node) {
return node || targetElement || document.body;
};
return /*#__PURE__*/React.createElement(React.Fragment, null, /*#__PURE__*/React.createElement(_Mask.default, {
zIndex: zIndex,
prefixCls: prefixCls,
pos: posInfo,
showMask: mergedShowMask,
style: mergedMaskStyle === null || mergedMaskStyle === void 0 ? void 0 : mergedMaskStyle.style,
fill: mergedMaskStyle === null || mergedMaskStyle === void 0 ? void 0 : mergedMaskStyle.color,
open: mergedOpen,
animated: animated,
rootClassName: rootClassName,
disabledInteraction: disabledInteraction
}), /*#__PURE__*/React.createElement(_trigger.default, (0, _extends2.default)({}, restProps, {
builtinPlacements: mergedBuiltinPlacements,
ref: triggerRef,
popupStyle: stepStyle,
popupPlacement: mergedPlacement,
popupVisible: mergedOpen,
popupClassName: (0, _classnames.default)(rootClassName, stepClassName),
prefixCls: prefixCls,
popup: getPopupElement,
forceRender: false,
destroyPopupOnHide: true,
zIndex: zIndex,
getTriggerDOMNode: getTriggerDOMNode,
arrow: !!mergedArrow
}), /*#__PURE__*/React.createElement(_portal.default, {
open: mergedOpen,
autoLock: true
}, /*#__PURE__*/React.createElement("div", {
className: (0, _classnames.default)(rootClassName, "".concat(prefixCls, "-target-placeholder")),
style: (0, _objectSpread2.default)((0, _objectSpread2.default)({}, posInfo || CENTER_PLACEHOLDER), {}, {
position: 'fixed',
pointerEvents: 'none'
})
}))));
};
var _default = Tour;
exports.default = _default;

View File

@@ -0,0 +1,6 @@
import * as React from 'react';
import type { TourStepProps } from '../interface';
export type DefaultPanelProps = Exclude<TourStepProps, "closable"> & {
closable: Exclude<TourStepProps["closable"], boolean>;
};
export default function DefaultPanel(props: DefaultPanelProps): React.JSX.Element;

View File

@@ -0,0 +1,71 @@
"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 = DefaultPanel;
var _toConsumableArray2 = _interopRequireDefault(require("@babel/runtime/helpers/toConsumableArray"));
var _extends2 = _interopRequireDefault(require("@babel/runtime/helpers/extends"));
var React = _interopRequireWildcard(require("react"));
var _classnames = _interopRequireDefault(require("classnames"));
var _pickAttrs = _interopRequireDefault(require("rc-util/lib/pickAttrs"));
function DefaultPanel(props) {
var _closable$closeIcon;
var prefixCls = props.prefixCls,
current = props.current,
total = props.total,
title = props.title,
description = props.description,
onClose = props.onClose,
onPrev = props.onPrev,
onNext = props.onNext,
onFinish = props.onFinish,
className = props.className,
closable = props.closable;
var ariaProps = (0, _pickAttrs.default)(closable || {}, true);
var closeIcon = (_closable$closeIcon = closable === null || closable === void 0 ? void 0 : closable.closeIcon) !== null && _closable$closeIcon !== void 0 ? _closable$closeIcon : /*#__PURE__*/React.createElement("span", {
className: "".concat(prefixCls, "-close-x")
}, "\xD7");
var mergedClosable = !!closable;
return /*#__PURE__*/React.createElement("div", {
className: (0, _classnames.default)("".concat(prefixCls, "-content"), className)
}, /*#__PURE__*/React.createElement("div", {
className: "".concat(prefixCls, "-inner")
}, mergedClosable && /*#__PURE__*/React.createElement("button", (0, _extends2.default)({
type: "button",
onClick: onClose,
"aria-label": "Close"
}, ariaProps, {
className: "".concat(prefixCls, "-close")
}), closeIcon), /*#__PURE__*/React.createElement("div", {
className: "".concat(prefixCls, "-header")
}, /*#__PURE__*/React.createElement("div", {
className: "".concat(prefixCls, "-title")
}, title)), /*#__PURE__*/React.createElement("div", {
className: "".concat(prefixCls, "-description")
}, description), /*#__PURE__*/React.createElement("div", {
className: "".concat(prefixCls, "-footer")
}, /*#__PURE__*/React.createElement("div", {
className: "".concat(prefixCls, "-sliders")
}, total > 1 ? (0, _toConsumableArray2.default)(Array.from({
length: total
}).keys()).map(function (item, index) {
return /*#__PURE__*/React.createElement("span", {
key: item,
className: index === current ? 'active' : ''
});
}) : null), /*#__PURE__*/React.createElement("div", {
className: "".concat(prefixCls, "-buttons")
}, current !== 0 ? /*#__PURE__*/React.createElement("button", {
className: "".concat(prefixCls, "-prev-btn"),
onClick: onPrev
}, "Prev") : null, current === total - 1 ? /*#__PURE__*/React.createElement("button", {
className: "".concat(prefixCls, "-finish-btn"),
onClick: onFinish
}, "Finish") : /*#__PURE__*/React.createElement("button", {
className: "".concat(prefixCls, "-next-btn"),
onClick: onNext
}, "Next")))));
}

View File

@@ -0,0 +1,6 @@
import * as React from 'react';
import { type DefaultPanelProps } from './DefaultPanel';
import type { TourStepProps, TourStepInfo } from '../interface';
export type { TourStepProps, TourStepInfo, };
declare const TourStep: (props: DefaultPanelProps) => React.JSX.Element;
export default TourStep;

17
node_modules/@rc-component/tour/lib/TourStep/index.js generated vendored Normal file
View File

@@ -0,0 +1,17 @@
"use strict";
var _interopRequireDefault = require("@babel/runtime/helpers/interopRequireDefault").default;
var _interopRequireWildcard = require("@babel/runtime/helpers/interopRequireWildcard").default;
Object.defineProperty(exports, "__esModule", {
value: true
});
exports.default = void 0;
var React = _interopRequireWildcard(require("react"));
var _DefaultPanel = _interopRequireDefault(require("./DefaultPanel"));
var TourStep = function TourStep(props) {
var current = props.current,
renderPanel = props.renderPanel;
return /*#__PURE__*/React.createElement(React.Fragment, null, typeof renderPanel === 'function' ? renderPanel(props, current) : /*#__PURE__*/React.createElement(_DefaultPanel.default, props));
};
var _default = TourStep;
exports.default = _default;

View File

@@ -0,0 +1,6 @@
import * as React from 'react';
import type { TourProps } from '../interface';
import type { TourStepInfo } from '../TourStep';
export declare function useClosable(stepClosable: TourStepInfo['closable'], stepCloseIcon: TourStepInfo['closeIcon'], closable: TourProps['closable'], closeIcon: TourProps['closeIcon']): {
closeIcon?: React.ReactNode;
} & React.AriaAttributes;

View File

@@ -0,0 +1,45 @@
"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.useClosable = useClosable;
var _objectSpread2 = _interopRequireDefault(require("@babel/runtime/helpers/objectSpread2"));
var _typeof2 = _interopRequireDefault(require("@babel/runtime/helpers/typeof"));
var React = _interopRequireWildcard(require("react"));
function isConfigObj(closable) {
return closable !== null && (0, _typeof2.default)(closable) === 'object';
}
/**
* Convert `closable` to ClosableConfig.
* When `preset` is true, will auto fill ClosableConfig with default value.
*/
function getClosableConfig(closable, closeIcon, preset) {
if (closable === false || closeIcon === false && (!isConfigObj(closable) || !closable.closeIcon)) {
return null;
}
var mergedCloseIcon = typeof closeIcon !== 'boolean' ? closeIcon : undefined;
if (isConfigObj(closable)) {
var _closable$closeIcon;
return (0, _objectSpread2.default)((0, _objectSpread2.default)({}, closable), {}, {
closeIcon: (_closable$closeIcon = closable.closeIcon) !== null && _closable$closeIcon !== void 0 ? _closable$closeIcon : mergedCloseIcon
});
}
// When StepClosable no need auto fill, but RootClosable need this.
return preset || closable || closeIcon ? {
closeIcon: mergedCloseIcon
} : 'empty';
}
function useClosable(stepClosable, stepCloseIcon, closable, closeIcon) {
return React.useMemo(function () {
var stepClosableConfig = getClosableConfig(stepClosable, stepCloseIcon, false);
var rootClosableConfig = getClosableConfig(closable, closeIcon, true);
if (stepClosableConfig !== 'empty') {
return stepClosableConfig;
}
return rootClosableConfig;
}, [closable, closeIcon, stepClosable, stepCloseIcon]);
}

View File

@@ -0,0 +1,13 @@
import type { TourStepInfo } from '..';
export interface Gap {
offset?: number | [number, number];
radius?: number;
}
export interface PosInfo {
left: number;
top: number;
height: number;
width: number;
radius: number;
}
export default function useTarget(target: TourStepInfo['target'], open: boolean, gap?: Gap, scrollIntoViewOptions?: boolean | ScrollIntoViewOptions): [PosInfo, HTMLElement];

93
node_modules/@rc-component/tour/lib/hooks/useTarget.js generated vendored Normal file
View File

@@ -0,0 +1,93 @@
"use strict";
var _interopRequireDefault = require("@babel/runtime/helpers/interopRequireDefault").default;
Object.defineProperty(exports, "__esModule", {
value: true
});
exports.default = useTarget;
var _slicedToArray2 = _interopRequireDefault(require("@babel/runtime/helpers/slicedToArray"));
var _useEvent = _interopRequireDefault(require("rc-util/lib/hooks/useEvent"));
var _useLayoutEffect = _interopRequireDefault(require("rc-util/lib/hooks/useLayoutEffect"));
var _react = require("react");
var _util = require("../util");
function isValidNumber(val) {
return typeof val === 'number' && !Number.isNaN(val);
}
function useTarget(target, open, gap, scrollIntoViewOptions) {
// ========================= Target =========================
// We trade `undefined` as not get target by function yet.
// `null` as empty target.
var _useState = (0, _react.useState)(undefined),
_useState2 = (0, _slicedToArray2.default)(_useState, 2),
targetElement = _useState2[0],
setTargetElement = _useState2[1];
(0, _useLayoutEffect.default)(function () {
var nextElement = typeof target === 'function' ? target() : target;
setTargetElement(nextElement || null);
});
// ========================= Align ==========================
var _useState3 = (0, _react.useState)(null),
_useState4 = (0, _slicedToArray2.default)(_useState3, 2),
posInfo = _useState4[0],
setPosInfo = _useState4[1];
var updatePos = (0, _useEvent.default)(function () {
if (targetElement) {
// Exist target element. We should scroll and get target position
if (!(0, _util.isInViewPort)(targetElement) && open) {
targetElement.scrollIntoView(scrollIntoViewOptions);
}
var _targetElement$getBou = targetElement.getBoundingClientRect(),
left = _targetElement$getBou.left,
top = _targetElement$getBou.top,
width = _targetElement$getBou.width,
height = _targetElement$getBou.height;
var nextPosInfo = {
left: left,
top: top,
width: width,
height: height,
radius: 0
};
setPosInfo(function (origin) {
if (JSON.stringify(origin) !== JSON.stringify(nextPosInfo)) {
return nextPosInfo;
}
return origin;
});
} else {
// Not exist target which means we just show in center
setPosInfo(null);
}
});
var getGapOffset = function getGapOffset(index) {
var _ref;
return (_ref = Array.isArray(gap === null || gap === void 0 ? void 0 : gap.offset) ? gap === null || gap === void 0 ? void 0 : gap.offset[index] : gap === null || gap === void 0 ? void 0 : gap.offset) !== null && _ref !== void 0 ? _ref : 6;
};
(0, _useLayoutEffect.default)(function () {
updatePos();
// update when window resize
window.addEventListener('resize', updatePos);
return function () {
window.removeEventListener('resize', updatePos);
};
}, [targetElement, open, updatePos]);
// ======================== PosInfo =========================
var mergedPosInfo = (0, _react.useMemo)(function () {
if (!posInfo) {
return posInfo;
}
var gapOffsetX = getGapOffset(0);
var gapOffsetY = getGapOffset(1);
var gapRadius = isValidNumber(gap === null || gap === void 0 ? void 0 : gap.radius) ? gap === null || gap === void 0 ? void 0 : gap.radius : 2;
return {
left: posInfo.left - gapOffsetX,
top: posInfo.top - gapOffsetY,
width: posInfo.width + gapOffsetX * 2,
height: posInfo.height + gapOffsetY * 2,
radius: gapRadius
};
}, [posInfo, gap]);
return [mergedPosInfo, targetElement];
}

3
node_modules/@rc-component/tour/lib/index.d.ts generated vendored Normal file
View File

@@ -0,0 +1,3 @@
import Tour from './Tour';
export type { TourProps, TourStepInfo, TourStepProps } from './interface';
export default Tour;

10
node_modules/@rc-component/tour/lib/index.js generated vendored Normal file
View File

@@ -0,0 +1,10 @@
"use strict";
var _interopRequireDefault = require("@babel/runtime/helpers/interopRequireDefault").default;
Object.defineProperty(exports, "__esModule", {
value: true
});
exports.default = void 0;
var _Tour = _interopRequireDefault(require("./Tour"));
var _default = _Tour.default;
exports.default = _default;

68
node_modules/@rc-component/tour/lib/interface.d.ts generated vendored Normal file
View File

@@ -0,0 +1,68 @@
import type { TriggerProps } from '@rc-component/trigger';
import type { PlacementType } from './placements';
import type { CSSProperties, ReactNode } from 'react';
import type { Gap } from './hooks/useTarget';
import { type DefaultPanelProps } from './TourStep/DefaultPanel';
export interface TourStepInfo {
arrow?: boolean | {
pointAtCenter: boolean;
};
target?: HTMLElement | (() => HTMLElement) | null | (() => null);
title: ReactNode;
description?: ReactNode;
placement?: PlacementType;
mask?: boolean | {
style?: React.CSSProperties;
color?: string;
};
className?: string;
style?: CSSProperties;
scrollIntoViewOptions?: boolean | ScrollIntoViewOptions;
closeIcon?: ReactNode;
closable?: boolean | ({
closeIcon?: ReactNode;
} & React.AriaAttributes);
}
export interface TourStepProps extends TourStepInfo {
prefixCls?: string;
total?: number;
current?: number;
onClose?: () => void;
onFinish?: () => void;
renderPanel?: (step: TourStepProps, current: number) => ReactNode;
onPrev?: () => void;
onNext?: () => void;
}
export interface TourProps extends Pick<TriggerProps, 'onPopupAlign'> {
steps?: TourStepInfo[];
open?: boolean;
defaultCurrent?: number;
current?: number;
onChange?: (current: number) => void;
onClose?: (current: number) => void;
onFinish?: () => void;
closeIcon?: TourStepProps['closeIcon'];
closable?: TourStepProps['closable'];
mask?: boolean | {
style?: React.CSSProperties;
color?: string;
};
arrow?: boolean | {
pointAtCenter: boolean;
};
rootClassName?: string;
placement?: PlacementType;
prefixCls?: string;
renderPanel?: (props: DefaultPanelProps, current: number) => ReactNode;
gap?: Gap;
animated?: boolean | {
placeholder: boolean;
};
scrollIntoViewOptions?: boolean | ScrollIntoViewOptions;
zIndex?: number;
getPopupContainer?: TriggerProps['getPopupContainer'];
builtinPlacements?: TriggerProps['builtinPlacements'] | ((config?: {
arrowPointAtCenter?: boolean;
}) => TriggerProps['builtinPlacements']);
disabledInteraction?: boolean;
}

5
node_modules/@rc-component/tour/lib/interface.js generated vendored Normal file
View File

@@ -0,0 +1,5 @@
"use strict";
Object.defineProperty(exports, "__esModule", {
value: true
});

4
node_modules/@rc-component/tour/lib/placements.d.ts generated vendored Normal file
View File

@@ -0,0 +1,4 @@
import type { BuildInPlacements } from '@rc-component/trigger';
export type PlacementType = 'left' | 'leftTop' | 'leftBottom' | 'right' | 'rightTop' | 'rightBottom' | 'top' | 'topLeft' | 'topRight' | 'bottom' | 'bottomLeft' | 'bottomRight' | 'center';
export declare function getPlacements(arrowPointAtCenter?: boolean): BuildInPlacements;
export declare const placements: BuildInPlacements;

77
node_modules/@rc-component/tour/lib/placements.js generated vendored Normal file
View File

@@ -0,0 +1,77 @@
"use strict";
var _interopRequireDefault = require("@babel/runtime/helpers/interopRequireDefault").default;
Object.defineProperty(exports, "__esModule", {
value: true
});
exports.getPlacements = getPlacements;
exports.placements = void 0;
var _objectSpread2 = _interopRequireDefault(require("@babel/runtime/helpers/objectSpread2"));
var autoAdjustOverflow = {
adjustX: 1,
adjustY: 1
};
var targetOffset = [0, 0];
var basePlacements = {
left: {
points: ['cr', 'cl'],
offset: [-8, 0]
},
right: {
points: ['cl', 'cr'],
offset: [8, 0]
},
top: {
points: ['bc', 'tc'],
offset: [0, -8]
},
bottom: {
points: ['tc', 'bc'],
offset: [0, 8]
},
topLeft: {
points: ['bl', 'tl'],
offset: [0, -8]
},
leftTop: {
points: ['tr', 'tl'],
offset: [-8, 0]
},
topRight: {
points: ['br', 'tr'],
offset: [0, -8]
},
rightTop: {
points: ['tl', 'tr'],
offset: [8, 0]
},
bottomRight: {
points: ['tr', 'br'],
offset: [0, 8]
},
rightBottom: {
points: ['bl', 'br'],
offset: [8, 0]
},
bottomLeft: {
points: ['tl', 'bl'],
offset: [0, 8]
},
leftBottom: {
points: ['br', 'bl'],
offset: [-8, 0]
}
};
function getPlacements() {
var arrowPointAtCenter = arguments.length > 0 && arguments[0] !== undefined ? arguments[0] : false;
var placements = {};
Object.keys(basePlacements).forEach(function (key) {
placements[key] = (0, _objectSpread2.default)((0, _objectSpread2.default)({}, basePlacements[key]), {}, {
autoArrow: arrowPointAtCenter,
targetOffset: targetOffset
});
});
return placements;
}
var placements = getPlacements();
exports.placements = placements;

3
node_modules/@rc-component/tour/lib/util.d.ts generated vendored Normal file
View File

@@ -0,0 +1,3 @@
import type { PlacementType } from './placements';
export declare function isInViewPort(element: HTMLElement): boolean;
export declare function getPlacement(targetElement?: HTMLElement | null, placement?: PlacementType, stepPlacement?: PlacementType): PlacementType;

21
node_modules/@rc-component/tour/lib/util.js generated vendored Normal file
View File

@@ -0,0 +1,21 @@
"use strict";
Object.defineProperty(exports, "__esModule", {
value: true
});
exports.getPlacement = getPlacement;
exports.isInViewPort = isInViewPort;
function isInViewPort(element) {
var viewWidth = window.innerWidth || document.documentElement.clientWidth;
var viewHeight = window.innerHeight || document.documentElement.clientHeight;
var _element$getBoundingC = element.getBoundingClientRect(),
top = _element$getBoundingC.top,
right = _element$getBoundingC.right,
bottom = _element$getBoundingC.bottom,
left = _element$getBoundingC.left;
return top >= 0 && left >= 0 && right <= viewWidth && bottom <= viewHeight;
}
function getPlacement(targetElement, placement, stepPlacement) {
var _ref;
return (_ref = stepPlacement !== null && stepPlacement !== void 0 ? stepPlacement : placement) !== null && _ref !== void 0 ? _ref : targetElement === null ? 'center' : 'bottom';
}

75
node_modules/@rc-component/tour/package.json generated vendored Normal file
View File

@@ -0,0 +1,75 @@
{
"name": "@rc-component/tour",
"version": "1.15.1",
"description": "React tour Component",
"keywords": [
"react",
"react-component",
"react-tour"
],
"homepage": "https://github.com/react-component/tour",
"bugs": {
"url": "https://github.com/react-component/tour/issues"
},
"repository": {
"type": "git",
"url": "https://github.com/react-component/tour.git"
},
"license": "MIT",
"author": "wangning4567@163.com",
"main": "./lib/index",
"module": "./es/index",
"typings": "es/index.d.ts",
"files": [
"lib",
"es"
],
"scripts": {
"compile": "father build",
"deploy": "npm run docs:build && npm run docs:deploy",
"docs:build": "dumi build",
"docs:deploy": "gh-pages -d docs-dist",
"lint": "eslint src/ --ext .tsx,.ts",
"lint:tsc": "tsc -p tsconfig.json --noEmit",
"now-build": "npm run docs:build",
"prepare": "dumi setup",
"prepublishOnly": "npm run compile && np --no-cleanup --yolo --no-publish",
"prettier": "prettier --write \"**/*.{js,jsx,tsx,ts,less,md,json}\"",
"start": "dumi dev",
"test": "umi-test",
"watch": "father dev"
},
"dependencies": {
"@babel/runtime": "^7.18.0",
"@rc-component/portal": "^1.0.0-9",
"@rc-component/trigger": "^2.0.0",
"classnames": "^2.3.2",
"rc-util": "^5.24.4"
},
"devDependencies": {
"@testing-library/jest-dom": "^5.16.4",
"@testing-library/react": "^15.0.0",
"@types/jest": "^29.0.0",
"@types/react": "^18.0.0",
"@types/react-dom": "^18.0.0",
"@umijs/fabric": "^2.5.2",
"dumi": "^2.1.2",
"eslint": "^7.18.0",
"father": "^4.0.0-rc.8",
"gh-pages": "^3.1.0",
"np": "^5.0.3",
"prettier": "^3.0.0",
"react": "^18.3.1",
"react-dom": "^18.3.1",
"typescript": "^5.0.0",
"cheerio": "1.0.0-rc.12",
"umi-test": "^1.9.7"
},
"peerDependencies": {
"react": ">=16.9.0",
"react-dom": ">=16.9.0"
},
"engines": {
"node": ">=8.x"
}
}