Update from Vibe Studio

This commit is contained in:
Vibe Studio
2026-01-16 02:20:32 +00:00
parent a4605e311a
commit 71de1506ca
28603 changed files with 2179459 additions and 0 deletions

View File

@@ -0,0 +1,2 @@
declare function ArrowSvgIcon(): import("react/jsx-runtime").JSX.Element;
export { ArrowSvgIcon };

View File

@@ -0,0 +1,19 @@
"use strict";
Object.defineProperty(exports, "__esModule", {
value: true
});
exports.ArrowSvgIcon = ArrowSvgIcon;
var _jsxRuntime = require("react/jsx-runtime");
function ArrowSvgIcon() {
return /*#__PURE__*/(0, _jsxRuntime.jsx)("svg", {
width: "1em",
height: "1em",
viewBox: "0 0 12 12",
fill: "currentColor",
"aria-hidden": "true",
children: /*#__PURE__*/(0, _jsxRuntime.jsx)("path", {
d: "M6.432 7.967a.448.448 0 01-.318.133h-.228a.46.46 0 01-.318-.133L2.488 4.85a.305.305 0 010-.43l.427-.43a.293.293 0 01.42 0L6 6.687l2.665-2.699a.299.299 0 01.426 0l.42.431a.305.305 0 010 .43L6.432 7.967z"
})
});
}

View File

@@ -0,0 +1,57 @@
import type { MenuProps } from 'antd';
import React from 'react';
import type { PureSettings } from '../../defaultSettings';
import type { MenuDataItem, MessageDescriptor, RouterTypes, WithFalse } from '../../typing';
import type { PrivateSiderMenuProps } from './SiderMenu';
export type MenuMode = 'vertical' | 'vertical-left' | 'vertical-right' | 'horizontal' | 'inline';
export type BaseMenuProps = {
className?: string;
/** 默认的是否展开,会受到 breakpoint 的影响 */
defaultCollapsed?: boolean;
collapsed?: boolean;
splitMenus?: boolean;
isMobile?: boolean;
menuData?: MenuDataItem[];
mode?: MenuMode;
onCollapse?: (collapsed: boolean) => void;
openKeys?: WithFalse<string[]> | undefined;
handleOpenChange?: (openKeys: string[]) => void;
iconPrefixes?: string;
/** 要给菜单的props, 参考antd-menu的属性。https://ant.design/components/menu-cn/ */
menuProps?: MenuProps;
style?: React.CSSProperties;
formatMessage?: (message: MessageDescriptor) => string;
/**
* @name 处理父级菜单的 props可以覆写菜单的点击功能一般用于埋点
* @see 子级的菜单要使用 menuItemRender 来处理
*
* @example 使用 a 标签跳转到特殊的地址 subMenuItemRender={(item, defaultDom) => { return <a onClick={()=> history.push(item.path) }>{defaultDom}</a> }}
* @example 增加埋点 subMenuItemRender={(item, defaultDom) => { return <a onClick={()=> log.click(item.name) }>{defaultDom}</a> }}
*/
subMenuItemRender?: WithFalse<(item: MenuDataItem & {
isUrl: boolean;
}, defaultDom: React.ReactNode, menuProps: BaseMenuProps) => React.ReactNode>;
/**
* @name 处理菜单的 props可以覆写菜单的点击功能一般结合 Router 框架使用
* @see 非子级的菜单要使用 subMenuItemRender 来处理
*
* @example 使用 a 标签 menuItemRender={(item, defaultDom) => { return <a onClick={()=> history.push(item.path) }>{defaultDom}</a> }}
* @example 使用 Link 标签 menuItemRender={(item, defaultDom) => { return <Link to={item.path}>{defaultDom}</Link> }}
*/
menuItemRender?: WithFalse<(item: MenuDataItem & {
isUrl: boolean;
onClick: () => void;
}, defaultDom: React.ReactNode, menuProps: BaseMenuProps & Partial<PrivateSiderMenuProps>) => React.ReactNode>;
/**
* 修改 name如果想做个简单的国际化可以使用这个方法
*/
menuTextRender?: WithFalse<(item: MenuDataItem, defaultText: React.ReactNode, menuProps: BaseMenuProps) => React.ReactNode>;
/**
* @name 处理 menuData 的方法,与 menuDataRender 不同postMenuData处理完成后会直接渲染不再进行国际化和拼接处理
*
* @example 增加菜单图标 postMenuData={(menuData) => { return menuData.map(item => { return { ...item, icon: <Icon type={item.icon} /> } }) }}
*/
postMenuData?: (menusData?: MenuDataItem[]) => MenuDataItem[];
} & Partial<RouterTypes> & Omit<MenuProps, 'openKeys' | 'onOpenChange' | 'title'> & Partial<PureSettings>;
declare const BaseMenu: React.FC<BaseMenuProps & PrivateSiderMenuProps>;
export { BaseMenu };

View File

@@ -0,0 +1,473 @@
"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.BaseMenu = void 0;
var _toConsumableArray2 = _interopRequireDefault(require("@babel/runtime/helpers/toConsumableArray"));
var _objectSpread2 = _interopRequireDefault(require("@babel/runtime/helpers/objectSpread2"));
var _createClass2 = _interopRequireDefault(require("@babel/runtime/helpers/createClass"));
var _classCallCheck2 = _interopRequireDefault(require("@babel/runtime/helpers/classCallCheck"));
var _defineProperty2 = _interopRequireDefault(require("@babel/runtime/helpers/defineProperty"));
var _slicedToArray2 = _interopRequireDefault(require("@babel/runtime/helpers/slicedToArray"));
var _icons = require("@ant-design/icons");
var _proProvider = require("@ant-design/pro-provider");
var _proUtils = require("@ant-design/pro-utils");
var _antd = require("antd");
var _classnames = _interopRequireDefault(require("classnames"));
var _react = _interopRequireWildcard(require("react"));
var _defaultSettings = require("../../defaultSettings");
var _utils = require("../../utils/utils");
var _menu = require("./style/menu");
var _jsxRuntime = require("react/jsx-runtime");
// todo
var MenuItemTooltip = function MenuItemTooltip(props) {
var _useState = (0, _react.useState)(props.collapsed),
_useState2 = (0, _slicedToArray2.default)(_useState, 2),
collapsed = _useState2[0],
setCollapsed = _useState2[1];
var _useState3 = (0, _react.useState)(false),
_useState4 = (0, _slicedToArray2.default)(_useState3, 2),
open = _useState4[0],
setOpen = _useState4[1];
(0, _react.useEffect)(function () {
setOpen(false);
setTimeout(function () {
setCollapsed(props.collapsed);
}, 400);
}, [props.collapsed]);
if (props.disable) {
return props.children;
}
return /*#__PURE__*/(0, _jsxRuntime.jsx)(_antd.Tooltip, {
title: props.title,
open: collapsed && props.collapsed ? open : false,
placement: "right",
onOpenChange: setOpen,
children: props.children
});
};
var IconFont = (0, _icons.createFromIconfontCN)({
scriptUrl: _defaultSettings.defaultSettings.iconfontUrl
});
// Allow menu.js config icon as string or ReactNode
// icon: 'setting',
// icon: 'icon-geren' #For Iconfont ,
// icon: 'http://demo.com/icon.png',
// icon: '/favicon.png',
// icon: <Icon type="setting" />,
var getIcon = function getIcon(icon) {
var iconPrefixes = arguments.length > 1 && arguments[1] !== undefined ? arguments[1] : 'icon-';
var className = arguments.length > 2 ? arguments[2] : undefined;
if (typeof icon === 'string' && icon !== '') {
if ((0, _proUtils.isUrl)(icon) || (0, _proUtils.isImg)(icon)) {
return /*#__PURE__*/(0, _jsxRuntime.jsx)("img", {
width: 16,
src: icon,
alt: "icon",
className: className
}, icon);
}
if (icon.startsWith(iconPrefixes)) {
return /*#__PURE__*/(0, _jsxRuntime.jsx)(IconFont, {
type: icon
});
}
}
return icon;
};
var getMenuTitleSymbol = function getMenuTitleSymbol(title) {
if (title && typeof title === 'string') {
var symbol = title.substring(0, 1).toUpperCase();
return symbol;
}
return null;
};
var MenuUtil = /*#__PURE__*/(0, _createClass2.default)(function MenuUtil(props) {
var _this = this;
(0, _classCallCheck2.default)(this, MenuUtil);
(0, _defineProperty2.default)(this, "props", void 0);
(0, _defineProperty2.default)(this, "getNavMenuItems", function () {
var menusData = arguments.length > 0 && arguments[0] !== undefined ? arguments[0] : [];
var level = arguments.length > 1 ? arguments[1] : undefined;
var noGroupLevel = arguments.length > 2 ? arguments[2] : undefined;
return menusData.map(function (item) {
return _this.getSubMenuOrItem(item, level, noGroupLevel);
}).filter(function (item) {
return item;
}).flat(1);
});
/** Get SubMenu or Item */
(0, _defineProperty2.default)(this, "getSubMenuOrItem", function (item, level, noGroupLevel) {
var _this$props = _this.props,
subMenuItemRender = _this$props.subMenuItemRender,
baseClassName = _this$props.baseClassName,
prefixCls = _this$props.prefixCls,
collapsed = _this$props.collapsed,
menu = _this$props.menu,
iconPrefixes = _this$props.iconPrefixes,
layout = _this$props.layout;
var isGroup = (menu === null || menu === void 0 ? void 0 : menu.type) === 'group' && layout !== 'top';
var designToken = _this.props.token;
var name = _this.getIntlName(item);
var children = (item === null || item === void 0 ? void 0 : item.children) || (item === null || item === void 0 ? void 0 : item.routes);
var menuType = isGroup && level === 0 ? 'group' : undefined;
if (Array.isArray(children) && children.length > 0) {
var _this$props2, _this$props3, _this$props4, _this$props5, _designToken$layout;
/** Menu 第一级可以有icon或者 isGroup 时第二级别也要有 */
var shouldHasIcon = level === 0 || isGroup && level === 1;
// get defaultTitle by menuItemRender
var iconDom = getIcon(item.icon, iconPrefixes, "".concat(baseClassName, "-icon ").concat((_this$props2 = _this.props) === null || _this$props2 === void 0 ? void 0 : _this$props2.hashId));
/**
* 如果没有icon在收起的时候用首字母代替
*/
var defaultIcon = collapsed && shouldHasIcon ? getMenuTitleSymbol(name) : null;
var defaultTitle = /*#__PURE__*/(0, _jsxRuntime.jsxs)("div", {
className: (0, _classnames.default)("".concat(baseClassName, "-item-title"), (_this$props3 = _this.props) === null || _this$props3 === void 0 ? void 0 : _this$props3.hashId, (0, _defineProperty2.default)((0, _defineProperty2.default)((0, _defineProperty2.default)((0, _defineProperty2.default)({}, "".concat(baseClassName, "-item-title-collapsed"), collapsed), "".concat(baseClassName, "-item-title-collapsed-level-").concat(noGroupLevel), collapsed), "".concat(baseClassName, "-group-item-title"), menuType === 'group'), "".concat(baseClassName, "-item-collapsed-show-title"), (menu === null || menu === void 0 ? void 0 : menu.collapsedShowTitle) && collapsed)),
children: [menuType === 'group' && collapsed ? null : shouldHasIcon && iconDom ? /*#__PURE__*/(0, _jsxRuntime.jsx)("span", {
className: "".concat(baseClassName, "-item-icon ").concat((_this$props4 = _this.props) === null || _this$props4 === void 0 ? void 0 : _this$props4.hashId).trim(),
children: iconDom
}) : defaultIcon, /*#__PURE__*/(0, _jsxRuntime.jsx)("span", {
className: (0, _classnames.default)("".concat(baseClassName, "-item-text"), (_this$props5 = _this.props) === null || _this$props5 === void 0 ? void 0 : _this$props5.hashId, (0, _defineProperty2.default)({}, "".concat(baseClassName, "-item-text-has-icon"), menuType !== 'group' && shouldHasIcon && (iconDom || defaultIcon))),
children: name
})]
});
// subMenu only title render
var title = subMenuItemRender ? subMenuItemRender((0, _objectSpread2.default)((0, _objectSpread2.default)({}, item), {}, {
isUrl: false
}), defaultTitle, _this.props) : defaultTitle;
// 如果收起来,没有子菜单了,就不需要展示 group所以 level 不增加
if (isGroup && level === 0 && _this.props.collapsed && !menu.collapsedShowGroupTitle) {
return _this.getNavMenuItems(children, level + 1, level);
}
var childrenList = _this.getNavMenuItems(children, level + 1, isGroup && level === 0 && _this.props.collapsed ? level : level + 1);
return [{
type: menuType,
key: item.key || item.path,
label: title,
onClick: isGroup ? undefined : item.onTitleClick,
children: childrenList,
className: (0, _classnames.default)((0, _defineProperty2.default)((0, _defineProperty2.default)((0, _defineProperty2.default)({}, "".concat(baseClassName, "-group"), menuType === 'group'), "".concat(baseClassName, "-submenu"), menuType !== 'group'), "".concat(baseClassName, "-submenu-has-icon"), menuType !== 'group' && shouldHasIcon && iconDom))
}, isGroup && level === 0 ? {
type: 'divider',
prefixCls: prefixCls,
className: "".concat(baseClassName, "-divider"),
key: (item.key || item.path) + '-group-divider',
style: {
padding: 0,
borderBlockEnd: 0,
margin: _this.props.collapsed ? '4px' : '6px 16px',
marginBlockStart: _this.props.collapsed ? 4 : 8,
borderColor: designToken === null || designToken === void 0 || (_designToken$layout = designToken.layout) === null || _designToken$layout === void 0 || (_designToken$layout = _designToken$layout.sider) === null || _designToken$layout === void 0 ? void 0 : _designToken$layout.colorMenuItemDivider
}
} : undefined].filter(Boolean);
}
return {
className: "".concat(baseClassName, "-menu-item"),
disabled: item.disabled,
key: item.key || item.path,
onClick: item.onTitleClick,
// eslint-disable-next-line react/no-is-mounted
label: _this.getMenuItemPath(item, level, noGroupLevel)
};
});
(0, _defineProperty2.default)(this, "getIntlName", function (item) {
var name = item.name,
locale = item.locale;
var _this$props6 = _this.props,
menu = _this$props6.menu,
formatMessage = _this$props6.formatMessage;
var finalName = name;
if (locale && (menu === null || menu === void 0 ? void 0 : menu.locale) !== false) {
finalName = formatMessage === null || formatMessage === void 0 ? void 0 : formatMessage({
id: locale,
defaultMessage: name
});
}
if (_this.props.menuTextRender) {
return _this.props.menuTextRender(item, finalName, _this.props);
}
return finalName;
});
/**
* 判断是否是http链接.返回 Link 或 a Judge whether it is http link.return a or Link
*
* @memberof SiderMenu
*/
(0, _defineProperty2.default)(this, "getMenuItemPath", function (item, level, noGroupLevel) {
var _this$props9, _this$props10, _this$props11, _this$props12;
var itemPath = _this.conversionPath(item.path || '/');
var _this$props7 = _this.props,
_this$props7$location = _this$props7.location,
location = _this$props7$location === void 0 ? {
pathname: '/'
} : _this$props7$location,
isMobile = _this$props7.isMobile,
onCollapse = _this$props7.onCollapse,
menuItemRender = _this$props7.menuItemRender,
iconPrefixes = _this$props7.iconPrefixes;
// if local is true formatMessage all name。
var menuItemTitle = _this.getIntlName(item);
var _this$props8 = _this.props,
baseClassName = _this$props8.baseClassName,
menu = _this$props8.menu,
collapsed = _this$props8.collapsed;
var isGroup = (menu === null || menu === void 0 ? void 0 : menu.type) === 'group';
/** Menu 第一级可以有icon或者 isGroup 时第二级别也要有 */
var hasIcon = level === 0 || isGroup && level === 1;
var icon = !hasIcon ? null : getIcon(item.icon, iconPrefixes, "".concat(baseClassName, "-icon ").concat((_this$props9 = _this.props) === null || _this$props9 === void 0 ? void 0 : _this$props9.hashId));
// 如果没有 icon 在收起的时候用首字母代替
var defaultIcon = collapsed && hasIcon ? getMenuTitleSymbol(menuItemTitle) : null;
var defaultItem = /*#__PURE__*/(0, _jsxRuntime.jsxs)("div", {
className: (0, _classnames.default)("".concat(baseClassName, "-item-title"), (_this$props10 = _this.props) === null || _this$props10 === void 0 ? void 0 : _this$props10.hashId, (0, _defineProperty2.default)((0, _defineProperty2.default)((0, _defineProperty2.default)({}, "".concat(baseClassName, "-item-title-collapsed"), collapsed), "".concat(baseClassName, "-item-title-collapsed-level-").concat(noGroupLevel), collapsed), "".concat(baseClassName, "-item-collapsed-show-title"), (menu === null || menu === void 0 ? void 0 : menu.collapsedShowTitle) && collapsed)),
children: [/*#__PURE__*/(0, _jsxRuntime.jsx)("span", {
className: "".concat(baseClassName, "-item-icon ").concat((_this$props11 = _this.props) === null || _this$props11 === void 0 ? void 0 : _this$props11.hashId).trim(),
style: {
display: defaultIcon === null && !icon ? 'none' : ''
},
children: icon || /*#__PURE__*/(0, _jsxRuntime.jsx)("span", {
className: "anticon",
children: defaultIcon
})
}), /*#__PURE__*/(0, _jsxRuntime.jsx)("span", {
className: (0, _classnames.default)("".concat(baseClassName, "-item-text"), (_this$props12 = _this.props) === null || _this$props12 === void 0 ? void 0 : _this$props12.hashId, (0, _defineProperty2.default)({}, "".concat(baseClassName, "-item-text-has-icon"), hasIcon && (icon || defaultIcon))),
children: menuItemTitle
})]
}, itemPath);
var isHttpUrl = (0, _proUtils.isUrl)(itemPath);
// Is it a http link
if (isHttpUrl) {
var _this$props13, _this$props14, _this$props15;
defaultItem = /*#__PURE__*/(0, _jsxRuntime.jsxs)("span", {
onClick: function onClick() {
var _window, _window$open;
(_window = window) === null || _window === void 0 || (_window$open = _window.open) === null || _window$open === void 0 || _window$open.call(_window, itemPath, '_blank');
},
className: (0, _classnames.default)("".concat(baseClassName, "-item-title"), (_this$props13 = _this.props) === null || _this$props13 === void 0 ? void 0 : _this$props13.hashId, (0, _defineProperty2.default)((0, _defineProperty2.default)((0, _defineProperty2.default)((0, _defineProperty2.default)({}, "".concat(baseClassName, "-item-title-collapsed"), collapsed), "".concat(baseClassName, "-item-title-collapsed-level-").concat(noGroupLevel), collapsed), "".concat(baseClassName, "-item-link"), true), "".concat(baseClassName, "-item-collapsed-show-title"), (menu === null || menu === void 0 ? void 0 : menu.collapsedShowTitle) && collapsed)),
children: [/*#__PURE__*/(0, _jsxRuntime.jsx)("span", {
className: "".concat(baseClassName, "-item-icon ").concat((_this$props14 = _this.props) === null || _this$props14 === void 0 ? void 0 : _this$props14.hashId).trim(),
style: {
display: defaultIcon === null && !icon ? 'none' : ''
},
children: icon || /*#__PURE__*/(0, _jsxRuntime.jsx)("span", {
className: "anticon",
children: defaultIcon
})
}), /*#__PURE__*/(0, _jsxRuntime.jsx)("span", {
className: (0, _classnames.default)("".concat(baseClassName, "-item-text"), (_this$props15 = _this.props) === null || _this$props15 === void 0 ? void 0 : _this$props15.hashId, (0, _defineProperty2.default)({}, "".concat(baseClassName, "-item-text-has-icon"), hasIcon && (icon || defaultIcon))),
children: menuItemTitle
})]
}, itemPath);
}
if (menuItemRender) {
var renderItemProps = (0, _objectSpread2.default)((0, _objectSpread2.default)({}, item), {}, {
isUrl: isHttpUrl,
itemPath: itemPath,
isMobile: isMobile,
replace: itemPath === location.pathname,
onClick: function onClick() {
return onCollapse && onCollapse(true);
},
children: undefined
});
return level === 0 ? /*#__PURE__*/(0, _jsxRuntime.jsx)(MenuItemTooltip, {
collapsed: collapsed,
title: menuItemTitle,
disable: item.disabledTooltip,
children: menuItemRender(renderItemProps, defaultItem, _this.props)
}) : menuItemRender(renderItemProps, defaultItem, _this.props);
}
return level === 0 ? /*#__PURE__*/(0, _jsxRuntime.jsx)(MenuItemTooltip, {
collapsed: collapsed,
title: menuItemTitle,
disable: item.disabledTooltip,
children: defaultItem
}) : defaultItem;
});
(0, _defineProperty2.default)(this, "conversionPath", function (path) {
if (path && path.indexOf('http') === 0) {
return path;
}
return "/".concat(path || '').replace(/\/+/g, '/');
});
this.props = props;
});
/**
* 生成openKeys 的对象因为设置了openKeys 就会变成受控,所以需要一个空对象
*
* @param BaseMenuProps
*/
var getOpenKeysProps = function getOpenKeysProps(openKeys, _ref) {
var layout = _ref.layout,
collapsed = _ref.collapsed;
var openKeysProps = {};
if (openKeys && !collapsed && ['side', 'mix'].includes(layout || 'mix')) {
openKeysProps = {
openKeys: openKeys
};
}
return openKeysProps;
};
var BaseMenu = exports.BaseMenu = function BaseMenu(props) {
var mode = props.mode,
className = props.className,
handleOpenChange = props.handleOpenChange,
style = props.style,
menuData = props.menuData,
prefixCls = props.prefixCls,
menu = props.menu,
matchMenuKeys = props.matchMenuKeys,
iconfontUrl = props.iconfontUrl,
propsSelectedKeys = props.selectedKeys,
onSelect = props.onSelect,
menuRenderType = props.menuRenderType,
propsOpenKeys = props.openKeys;
var _useContext = (0, _react.useContext)(_proProvider.ProProvider),
dark = _useContext.dark,
designToken = _useContext.token;
var baseClassName = "".concat(prefixCls, "-base-menu-").concat(mode);
// 用于减少 defaultOpenKeys 计算的组件
var defaultOpenKeysRef = (0, _react.useRef)([]);
var _useMountMergeState = (0, _proUtils.useMountMergeState)(menu === null || menu === void 0 ? void 0 : menu.defaultOpenAll),
_useMountMergeState2 = (0, _slicedToArray2.default)(_useMountMergeState, 2),
defaultOpenAll = _useMountMergeState2[0],
setDefaultOpenAll = _useMountMergeState2[1];
var _useMountMergeState3 = (0, _proUtils.useMountMergeState)(function () {
if (menu !== null && menu !== void 0 && menu.defaultOpenAll) {
return (0, _utils.getOpenKeysFromMenuData)(menuData) || [];
}
if (propsOpenKeys === false) {
return false;
}
return [];
}, {
value: propsOpenKeys === false ? undefined : propsOpenKeys,
onChange: handleOpenChange
}),
_useMountMergeState4 = (0, _slicedToArray2.default)(_useMountMergeState3, 2),
openKeys = _useMountMergeState4[0],
setOpenKeys = _useMountMergeState4[1];
var _useMountMergeState5 = (0, _proUtils.useMountMergeState)([], {
value: propsSelectedKeys,
onChange: onSelect ? function (keys) {
if (onSelect && keys) {
onSelect(keys);
}
} : undefined
}),
_useMountMergeState6 = (0, _slicedToArray2.default)(_useMountMergeState5, 2),
selectedKeys = _useMountMergeState6[0],
setSelectedKeys = _useMountMergeState6[1];
(0, _react.useEffect)(function () {
if (menu !== null && menu !== void 0 && menu.defaultOpenAll || propsOpenKeys === false) {
return;
}
if (matchMenuKeys) {
setOpenKeys(matchMenuKeys);
setSelectedKeys(matchMenuKeys);
}
// eslint-disable-next-line react-hooks/exhaustive-deps
}, [matchMenuKeys.join('-')]);
(0, _react.useEffect)(function () {
// reset IconFont
if (iconfontUrl) {
IconFont = (0, _icons.createFromIconfontCN)({
scriptUrl: iconfontUrl
});
}
}, [iconfontUrl]);
(0, _react.useEffect)(function () {
// if pathname can't match, use the nearest parent's key
if (matchMenuKeys.join('-') !== (selectedKeys || []).join('-')) {
setSelectedKeys(matchMenuKeys);
}
if (!defaultOpenAll && propsOpenKeys !== false && matchMenuKeys.join('-') !== (openKeys || []).join('-')) {
var newKeys = matchMenuKeys;
// 如果不自动关闭,我需要把 openKeys 放进去
if ((menu === null || menu === void 0 ? void 0 : menu.autoClose) === false) {
newKeys = Array.from(new Set([].concat((0, _toConsumableArray2.default)(matchMenuKeys), (0, _toConsumableArray2.default)(openKeys || []))));
}
setOpenKeys(newKeys);
} else if (menu !== null && menu !== void 0 && menu.ignoreFlatMenu && defaultOpenAll) {
// 忽略用户手动折叠过的菜单状态,折叠按钮切换之后也可实现默认展开所有菜单
setOpenKeys((0, _utils.getOpenKeysFromMenuData)(menuData));
} else {
setDefaultOpenAll(false);
}
},
// eslint-disable-next-line react-hooks/exhaustive-deps
[matchMenuKeys.join('-')]);
var openKeysProps = (0, _react.useMemo)(function () {
return getOpenKeysProps(openKeys, props);
},
// eslint-disable-next-line react-hooks/exhaustive-deps
[openKeys && openKeys.join(','), props.layout, props.collapsed]);
var _useStyle = (0, _menu.useStyle)(baseClassName, mode),
wrapSSR = _useStyle.wrapSSR,
hashId = _useStyle.hashId;
var menuUtils = (0, _react.useMemo)(function () {
return new MenuUtil((0, _objectSpread2.default)((0, _objectSpread2.default)({}, props), {}, {
token: designToken,
menuRenderType: menuRenderType,
baseClassName: baseClassName,
hashId: hashId
}));
}, [props, designToken, menuRenderType, baseClassName, hashId]);
if (menu !== null && menu !== void 0 && menu.loading) {
return /*#__PURE__*/(0, _jsxRuntime.jsx)("div", {
style: mode !== null && mode !== void 0 && mode.includes('inline') ? {
padding: 24
} : {
marginBlockStart: 16
},
children: /*#__PURE__*/(0, _jsxRuntime.jsx)(_antd.Skeleton, {
active: true,
title: false,
paragraph: {
rows: mode !== null && mode !== void 0 && mode.includes('inline') ? 6 : 1
}
})
});
}
// 这次 openKeys === false 的时候的情况,这种情况下帮用户选中一次
// 第二此不会使用,所以用了 defaultOpenKeys
// 这里返回 null是为了让 defaultOpenKeys 生效
if (props.openKeys === false && !props.handleOpenChange) {
defaultOpenKeysRef.current = matchMenuKeys;
}
var finallyData = props.postMenuData ? props.postMenuData(menuData) : menuData;
if (finallyData && (finallyData === null || finallyData === void 0 ? void 0 : finallyData.length) < 1) {
return null;
}
return wrapSSR( /*#__PURE__*/(0, _react.createElement)(_antd.Menu, (0, _objectSpread2.default)((0, _objectSpread2.default)({}, openKeysProps), {}, {
_internalDisableMenuItemTitleTooltip: true,
key: "Menu",
mode: mode,
inlineIndent: 16,
defaultOpenKeys: defaultOpenKeysRef.current,
theme: dark ? 'dark' : 'light',
selectedKeys: selectedKeys,
style: (0, _objectSpread2.default)({
backgroundColor: 'transparent',
border: 'none'
}, style),
className: (0, _classnames.default)(className, hashId, baseClassName, (0, _defineProperty2.default)((0, _defineProperty2.default)({}, "".concat(baseClassName, "-horizontal"), mode === 'horizontal'), "".concat(baseClassName, "-collapsed"), props.collapsed)),
items: menuUtils.getNavMenuItems(finallyData, 0, 0),
onOpenChange: function onOpenChange(_openKeys) {
if (!props.collapsed) {
setOpenKeys(_openKeys);
}
}
}, props.menuProps)));
};

View File

@@ -0,0 +1,112 @@
import type { GenerateStyle } from '@ant-design/pro-provider';
import type { AvatarProps, SiderProps } from 'antd';
import type { CSSProperties, ReactNode } from 'react';
import React from 'react';
import type { WithFalse } from '../../typing';
import type { AppItemProps, AppListProps } from '../AppsLogoComponents/types';
import type { HeaderViewProps } from '../Header';
import type { BaseMenuProps } from './BaseMenu';
import type { SiderMenuToken } from './style/stylish';
export type HeaderRenderKey = 'menuHeaderRender' | 'headerTitleRender';
/**
* 渲染 title 和 logo
*
* @param props
* @param renderKey
* @returns
*/
export declare const renderLogoAndTitle: (props: SiderMenuProps, renderKey?: HeaderRenderKey) => React.ReactNode;
export type SiderMenuProps = {
/** 品牌logo的标识 */
logo?: React.ReactNode;
/** 相关品牌的列表 */
appList?: AppListProps;
appListRender?: (props: AppListProps, defaultDom: React.ReactNode) => React.ReactNode;
/** 相关品牌的列表项 点击事件当事件存在时appList 内配置的 url 不在自动跳转 */
itemClick?: (item: AppItemProps, popoverRef?: React.RefObject<HTMLSpanElement>) => void;
/** 菜单的宽度 */
siderWidth?: number;
/** 头像的设置 */
avatarProps?: WithFalse<AvatarProps & {
title?: React.ReactNode;
render?: (avatarProps: AvatarProps, defaultDom: React.ReactNode, props: SiderMenuProps) => React.ReactNode;
}>;
/** Layout的操作功能列表不同的 layout 会放到不同的位置 */
actionsRender?: WithFalse<(props: HeaderViewProps) => React.ReactNode[] | React.ReactNode>;
/**
* @name 菜单 logo 和 title 区域的渲染
*
* @example 不要logo : menuHeaderRender={(logo,title)=> title}
* @example 不要title : menuHeaderRender={(logo,title)=> logo}
* @example 展开的时候显示title,收起显示 logo menuHeaderRender={(logo,title,props)=> props.collapsed ? logo : title}
* @example 不要这个区域了 : menuHeaderRender={false}
*/
menuHeaderRender?: WithFalse<(logo: React.ReactNode, title: React.ReactNode, props?: SiderMenuProps) => React.ReactNode>;
/**
* @name 侧边菜单底部的配置,可以增加一些底部操作
*
* @example 底部增加超链接 menuFooterRender={()=><a href="https://pro.ant.design">pro.ant.design</a>}
* @example 根据收起展开配置不同的 dom menuFooterRender={()=>collapsed? null :<a href="https://pro.ant.design">pro.ant.design</a>}
*/
menuFooterRender?: WithFalse<(props?: SiderMenuProps) => React.ReactNode>;
/**
* @name 侧边菜单,菜单区域的处理,可以单独处理菜单的dom
*
* @example 增加菜单区域的背景颜色 menuContentRender={(props,defaultDom)=><div style={{backgroundColor:"red"}}>{defaultDom}</div>}
* @example 某些情况下不显示菜单 menuContentRender={(props)=> return <div>不显示菜单</div>}
*/
menuContentRender?: WithFalse<(props: SiderMenuProps, defaultDom: React.ReactNode) => React.ReactNode>;
/**
* @name 侧边菜单 title 和 logo 下面区域的渲染,一般会增加个搜索框
*
* @example 增加一个搜索框 menuExtraRender={()=>(<Search placeholder="请输入" />)}
* @example 根据收起展开配置不同的 dom menuExtraRender={()=>collapsed? null : <Search placeholder="请输入" />}
*/
menuExtraRender?: WithFalse<(props: SiderMenuProps) => React.ReactNode>;
/**
* @name 自定义展开收起按钮的渲染
*
* @example 使用文字渲染 collapsedButtonRender={(collapsed)=>collapsed?"展开":"收起"})}
* @example 使用icon渲染 collapsedButtonRender={(collapsed)=>collapsed?<MenuUnfoldOutlined />:<MenuFoldOutlined />}
* @example 不渲染按钮 collapsedButtonRender={false}
*/
collapsedButtonRender?: WithFalse<(collapsed?: boolean, defaultDom?: React.ReactNode) => React.ReactNode>;
/**
* @name 菜单是否收起的断点设置成false 可以禁用
*
* @example 禁用断点 breakpoint={false}
* @example 最小的屏幕再收起 breakpoint={"xs"}
*/
breakpoint?: SiderProps['breakpoint'] | false;
/**
* @name 菜单顶部logo 和 title 区域的点击事件
*
* @example 点击跳转到首页 onMenuHeaderClick={()=>{ history.push('/') }}
*/
onMenuHeaderClick?: (e: React.MouseEvent<HTMLDivElement>) => void;
/**
* @name 侧边菜单底部的一些快捷链接
*
* @example links={[<a href="ant.design"> 访问官网 </a>,<a href="help.ant.design"> 帮助 </a>]}
*/
links?: React.ReactNode[];
onOpenChange?: (openKeys: WithFalse<string[]>) => void;
getContainer?: false;
/**
* @name 侧边菜单的logo的样式可以调整下大小
*
* @example 设置logo的大小为 42px logoStyle={{width: '42px', height: '42px'}}
*/
logoStyle?: CSSProperties;
hide?: boolean;
className?: string;
style?: CSSProperties;
} & Pick<BaseMenuProps, Exclude<keyof BaseMenuProps, ['onCollapse']>>;
export type PrivateSiderMenuProps = {
matchMenuKeys: string[];
originCollapsed?: boolean;
menuRenderType?: 'header' | 'sider';
stylish?: GenerateStyle<SiderMenuToken>;
};
declare const SiderMenu: React.FC<SiderMenuProps & PrivateSiderMenuProps>;
export { SiderMenu };

View File

@@ -0,0 +1,296 @@
"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.renderLogoAndTitle = exports.SiderMenu = void 0;
var _objectWithoutProperties2 = _interopRequireDefault(require("@babel/runtime/helpers/objectWithoutProperties"));
var _objectSpread2 = _interopRequireDefault(require("@babel/runtime/helpers/objectSpread2"));
var _defineProperty2 = _interopRequireDefault(require("@babel/runtime/helpers/defineProperty"));
var _proProvider = require("@ant-design/pro-provider");
var _antd = require("antd");
var _classnames = _interopRequireDefault(require("classnames"));
var _react = _interopRequireWildcard(require("react"));
var _AppsLogoComponents = require("../AppsLogoComponents");
var _CollapsedIcon = require("../CollapsedIcon");
var _BaseMenu = require("./BaseMenu");
var _stylish = require("./style/stylish");
var _jsxRuntime = require("react/jsx-runtime");
var _excluded = ["title", "render"];
var _SafetyWarningProvider = /*#__PURE__*/_react.default.memo(function (props) {
if (process.env.NODE_ENV !== 'production') {
console.warn("[pro-layout] SiderMenu required antd@^4.24.15 || antd@^5.11.2 for access the menu context, please upgrade your antd version (current ".concat(_antd.version, ")."));
}
return /*#__PURE__*/(0, _jsxRuntime.jsx)(_jsxRuntime.Fragment, {
children: props.children
});
});
var Sider = _antd.Layout.Sider,
_Layout$_InternalSide = _antd.Layout._InternalSiderContext,
SiderContext = _Layout$_InternalSide === void 0 ? {
Provider: _SafetyWarningProvider
} : _Layout$_InternalSide;
/**
* 渲染 title 和 logo
*
* @param props
* @param renderKey
* @returns
*/
var renderLogoAndTitle = exports.renderLogoAndTitle = function renderLogoAndTitle(props) {
var renderKey = arguments.length > 1 && arguments[1] !== undefined ? arguments[1] : 'menuHeaderRender';
var logo = props.logo,
title = props.title,
layout = props.layout;
var renderFunction = props[renderKey];
if (renderFunction === false) {
return null;
}
var logoDom = (0, _AppsLogoComponents.defaultRenderLogo)(logo);
var titleDom = /*#__PURE__*/(0, _jsxRuntime.jsx)("h1", {
children: title !== null && title !== void 0 ? title : 'Ant Design Pro'
});
if (renderFunction) {
// when collapsed, no render title
return renderFunction(logoDom, props.collapsed ? null : titleDom, props);
}
/**
* 收起来时候直接不显示
*/
if (props.isMobile) {
return null;
}
if (layout === 'mix' && renderKey === 'menuHeaderRender') return false;
if (props.collapsed) {
return /*#__PURE__*/(0, _jsxRuntime.jsx)("a", {
children: logoDom
}, "title");
}
return /*#__PURE__*/(0, _jsxRuntime.jsxs)("a", {
children: [logoDom, titleDom]
}, "title");
};
var SiderMenu = exports.SiderMenu = function SiderMenu(props) {
var _props$menu2;
var collapsed = props.collapsed,
originCollapsed = props.originCollapsed,
fixSiderbar = props.fixSiderbar,
menuFooterRender = props.menuFooterRender,
_onCollapse = props.onCollapse,
theme = props.theme,
siderWidth = props.siderWidth,
isMobile = props.isMobile,
onMenuHeaderClick = props.onMenuHeaderClick,
_props$breakpoint = props.breakpoint,
breakpoint = _props$breakpoint === void 0 ? 'lg' : _props$breakpoint,
style = props.style,
layout = props.layout,
_props$menuExtraRende = props.menuExtraRender,
menuExtraRender = _props$menuExtraRende === void 0 ? false : _props$menuExtraRende,
links = props.links,
menuContentRender = props.menuContentRender,
collapsedButtonRender = props.collapsedButtonRender,
prefixCls = props.prefixCls,
avatarProps = props.avatarProps,
rightContentRender = props.rightContentRender,
actionsRender = props.actionsRender,
onOpenChange = props.onOpenChange,
stylish = props.stylish,
logoStyle = props.logoStyle;
var _useContext = (0, _react.useContext)(_proProvider.ProProvider),
hashId = _useContext.hashId;
var showSiderExtraDom = (0, _react.useMemo)(function () {
if (isMobile) return false;
if (layout === 'mix') return false;
return true;
}, [isMobile, layout]);
var baseClassName = "".concat(prefixCls, "-sider");
// 收起的宽度
var collapsedWidth = 64;
// 之所以这样写是为了提升样式优先级不然会被sider 自带的覆盖掉
var stylishClassName = (0, _stylish.useStylish)("".concat(baseClassName, ".").concat(baseClassName, "-stylish"), {
stylish: stylish,
proLayoutCollapsedWidth: collapsedWidth
});
var siderClassName = (0, _classnames.default)("".concat(baseClassName), hashId, (0, _defineProperty2.default)((0, _defineProperty2.default)((0, _defineProperty2.default)((0, _defineProperty2.default)((0, _defineProperty2.default)((0, _defineProperty2.default)((0, _defineProperty2.default)({}, "".concat(baseClassName, "-fixed"), fixSiderbar), "".concat(baseClassName, "-fixed-mix"), layout === 'mix' && !isMobile && fixSiderbar), "".concat(baseClassName, "-collapsed"), props.collapsed), "".concat(baseClassName, "-layout-").concat(layout), layout && !isMobile), "".concat(baseClassName, "-light"), theme !== 'dark'), "".concat(baseClassName, "-mix"), layout === 'mix' && !isMobile), "".concat(baseClassName, "-stylish"), !!stylish));
var headerDom = renderLogoAndTitle(props);
var extraDom = menuExtraRender && menuExtraRender(props);
var menuDom = (0, _react.useMemo)(function () {
return menuContentRender !== false && /*#__PURE__*/(0, _react.createElement)(_BaseMenu.BaseMenu, (0, _objectSpread2.default)((0, _objectSpread2.default)({}, props), {}, {
key: "base-menu",
mode: collapsed && !isMobile ? 'vertical' : 'inline',
handleOpenChange: onOpenChange,
style: {
width: '100%'
},
className: "".concat(baseClassName, "-menu ").concat(hashId).trim()
}));
}, [baseClassName, hashId, menuContentRender, onOpenChange, props]);
var linksMenuItems = (links || []).map(function (node, index) {
return {
className: "".concat(baseClassName, "-link"),
label: node,
key: index
};
});
var menuRenderDom = (0, _react.useMemo)(function () {
return menuContentRender ? menuContentRender(props, menuDom) : menuDom;
}, [menuContentRender, menuDom, props]);
var avatarDom = (0, _react.useMemo)(function () {
if (!avatarProps) return null;
var title = avatarProps.title,
render = avatarProps.render,
rest = (0, _objectWithoutProperties2.default)(avatarProps, _excluded);
var dom = /*#__PURE__*/(0, _jsxRuntime.jsxs)("div", {
className: "".concat(baseClassName, "-actions-avatar"),
children: [rest !== null && rest !== void 0 && rest.src || rest !== null && rest !== void 0 && rest.srcSet || rest.icon || rest.children ? /*#__PURE__*/(0, _jsxRuntime.jsx)(_antd.Avatar, (0, _objectSpread2.default)({
size: 28
}, rest)) : null, avatarProps.title && !collapsed && /*#__PURE__*/(0, _jsxRuntime.jsx)("span", {
children: title
})]
});
if (render) {
return render(avatarProps, dom, props);
}
return dom;
}, [avatarProps, baseClassName, collapsed]);
var actionsDom = (0, _react.useMemo)(function () {
if (!actionsRender) return null;
return /*#__PURE__*/(0, _jsxRuntime.jsx)(_antd.Space, {
align: "center",
size: 4,
direction: collapsed ? 'vertical' : 'horizontal',
className: (0, _classnames.default)(["".concat(baseClassName, "-actions-list"), collapsed && "".concat(baseClassName, "-actions-list-collapsed"), hashId]),
children: [actionsRender === null || actionsRender === void 0 ? void 0 : actionsRender(props)].flat(1).map(function (item, index) {
return /*#__PURE__*/(0, _jsxRuntime.jsx)("div", {
className: "".concat(baseClassName, "-actions-list-item ").concat(hashId).trim(),
children: item
}, index);
})
});
},
// eslint-disable-next-line react-hooks/exhaustive-deps
[actionsRender, baseClassName, collapsed]);
var appsDom = (0, _react.useMemo)(function () {
return /*#__PURE__*/(0, _jsxRuntime.jsx)(_AppsLogoComponents.AppsLogoComponents, {
onItemClick: props.itemClick,
appListRender: props.appListRender,
appList: props.appList,
prefixCls: props.prefixCls
});
}, [props.appList, props.appListRender, props.prefixCls]);
var collapsedDom = (0, _react.useMemo)(function () {
if (collapsedButtonRender === false) return null;
var dom = /*#__PURE__*/(0, _jsxRuntime.jsx)(_CollapsedIcon.CollapsedIcon, {
isMobile: isMobile,
collapsed: originCollapsed,
className: "".concat(baseClassName, "-collapsed-button"),
onClick: function onClick() {
_onCollapse === null || _onCollapse === void 0 || _onCollapse(!originCollapsed);
}
});
if (collapsedButtonRender) return collapsedButtonRender(collapsed, dom);
return dom;
}, [collapsedButtonRender, isMobile, originCollapsed, baseClassName, collapsed, _onCollapse]);
/** 操作区域的dom */
var actionAreaDom = (0, _react.useMemo)(function () {
if (!avatarDom && !actionsDom) return null;
return /*#__PURE__*/(0, _jsxRuntime.jsxs)("div", {
className: (0, _classnames.default)("".concat(baseClassName, "-actions"), hashId, collapsed && "".concat(baseClassName, "-actions-collapsed")),
children: [avatarDom, actionsDom]
});
}, [actionsDom, avatarDom, baseClassName, collapsed, hashId]);
/* Using the useMemo hook to create a CSS class that will hide the menu when the menu is collapsed. */
var hideMenuWhenCollapsedClassName = (0, _react.useMemo)(function () {
var _props$menu;
// 收起时完全隐藏菜单
if (props !== null && props !== void 0 && (_props$menu = props.menu) !== null && _props$menu !== void 0 && _props$menu.hideMenuWhenCollapsed && collapsed) {
return "".concat(baseClassName, "-hide-menu-collapsed");
}
return null;
}, [baseClassName, collapsed, props === null || props === void 0 || (_props$menu2 = props.menu) === null || _props$menu2 === void 0 ? void 0 : _props$menu2.hideMenuWhenCollapsed]);
var menuFooterDom = menuFooterRender && (menuFooterRender === null || menuFooterRender === void 0 ? void 0 : menuFooterRender(props));
var menuDomItems = /*#__PURE__*/(0, _jsxRuntime.jsxs)(_jsxRuntime.Fragment, {
children: [headerDom && /*#__PURE__*/(0, _jsxRuntime.jsxs)("div", {
className: (0, _classnames.default)([(0, _classnames.default)("".concat(baseClassName, "-logo"), hashId, (0, _defineProperty2.default)({}, "".concat(baseClassName, "-logo-collapsed"), collapsed))]),
onClick: showSiderExtraDom ? onMenuHeaderClick : undefined,
id: "logo",
style: logoStyle,
children: [headerDom, appsDom]
}), extraDom && /*#__PURE__*/(0, _jsxRuntime.jsx)("div", {
className: (0, _classnames.default)(["".concat(baseClassName, "-extra"), !headerDom && "".concat(baseClassName, "-extra-no-logo"), hashId]),
children: extraDom
}), /*#__PURE__*/(0, _jsxRuntime.jsx)("div", {
style: {
flex: 1,
overflowY: 'auto',
overflowX: 'hidden'
},
children: menuRenderDom
}), /*#__PURE__*/(0, _jsxRuntime.jsxs)(SiderContext.Provider, {
value: {},
children: [links ? /*#__PURE__*/(0, _jsxRuntime.jsx)("div", {
className: "".concat(baseClassName, "-links ").concat(hashId).trim(),
children: /*#__PURE__*/(0, _jsxRuntime.jsx)(_antd.Menu, {
inlineIndent: 16,
className: "".concat(baseClassName, "-link-menu ").concat(hashId).trim(),
selectedKeys: [],
openKeys: [],
theme: theme,
mode: "inline",
items: linksMenuItems
})
}) : null, showSiderExtraDom && /*#__PURE__*/(0, _jsxRuntime.jsxs)(_jsxRuntime.Fragment, {
children: [actionAreaDom, !actionsDom && rightContentRender ? /*#__PURE__*/(0, _jsxRuntime.jsx)("div", {
className: (0, _classnames.default)("".concat(baseClassName, "-actions"), hashId, (0, _defineProperty2.default)({}, "".concat(baseClassName, "-actions-collapsed"), collapsed)),
children: rightContentRender === null || rightContentRender === void 0 ? void 0 : rightContentRender(props)
}) : null]
}), menuFooterDom && /*#__PURE__*/(0, _jsxRuntime.jsx)("div", {
className: (0, _classnames.default)(["".concat(baseClassName, "-footer"), hashId, (0, _defineProperty2.default)({}, "".concat(baseClassName, "-footer-collapsed"), collapsed)]),
children: menuFooterDom
})]
})]
});
return stylishClassName.wrapSSR( /*#__PURE__*/(0, _jsxRuntime.jsxs)(_jsxRuntime.Fragment, {
children: [fixSiderbar && !isMobile && !hideMenuWhenCollapsedClassName && /*#__PURE__*/(0, _jsxRuntime.jsx)("div", {
style: (0, _objectSpread2.default)({
width: collapsed ? collapsedWidth : siderWidth,
overflow: 'hidden',
flex: "0 0 ".concat(collapsed ? collapsedWidth : siderWidth, "px"),
maxWidth: collapsed ? collapsedWidth : siderWidth,
minWidth: collapsed ? collapsedWidth : siderWidth,
transition: 'all 0.2s ease 0s'
}, style)
}), /*#__PURE__*/(0, _jsxRuntime.jsxs)(Sider, {
collapsible: true,
trigger: null,
collapsed: collapsed,
breakpoint: breakpoint === false ? undefined : breakpoint,
onCollapse: function onCollapse(collapse) {
if (isMobile) return;
_onCollapse === null || _onCollapse === void 0 || _onCollapse(collapse);
},
collapsedWidth: collapsedWidth,
style: style,
theme: theme,
width: siderWidth,
className: (0, _classnames.default)(siderClassName, hashId, hideMenuWhenCollapsedClassName),
children: [hideMenuWhenCollapsedClassName ? /*#__PURE__*/(0, _jsxRuntime.jsx)("div", {
className: "".concat(baseClassName, "-hide-when-collapsed ").concat(hashId).trim(),
style: {
height: '100%',
width: '100%',
opacity: hideMenuWhenCollapsedClassName ? 0 : 1
},
children: menuDomItems
}) : menuDomItems, collapsedDom]
})]
}));
};

View File

@@ -0,0 +1,4 @@
import React from 'react';
import type { PrivateSiderMenuProps, SiderMenuProps } from './SiderMenu';
declare const SiderMenuWrapper: React.FC<SiderMenuProps & PrivateSiderMenuProps>;
export { SiderMenuWrapper as SiderMenu };

View File

@@ -0,0 +1,90 @@
"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.SiderMenu = void 0;
var _objectSpread2 = _interopRequireDefault(require("@babel/runtime/helpers/objectSpread2"));
var _proProvider = require("@ant-design/pro-provider");
var _proUtils = require("@ant-design/pro-utils");
var _antd = require("antd");
var _classnames = _interopRequireDefault(require("classnames"));
var _omit = _interopRequireDefault(require("rc-util/lib/omit"));
var _react = _interopRequireWildcard(require("react"));
var _SiderMenu = require("./SiderMenu");
var _index = require("./style/index");
var _jsxRuntime = require("react/jsx-runtime");
var SiderMenuWrapper = exports.SiderMenu = function SiderMenuWrapper(props) {
var _token$layout;
var isMobile = props.isMobile,
siderWidth = props.siderWidth,
collapsed = props.collapsed,
onCollapse = props.onCollapse,
style = props.style,
className = props.className,
hide = props.hide,
prefixCls = props.prefixCls,
getContainer = props.getContainer;
var _useContext = (0, _react.useContext)(_proProvider.ProProvider),
token = _useContext.token;
(0, _react.useEffect)(function () {
if (isMobile === true) {
onCollapse === null || onCollapse === void 0 || onCollapse(true);
}
// eslint-disable-next-line react-hooks/exhaustive-deps
}, [isMobile]);
var omitProps = (0, _omit.default)(props, ['className', 'style']);
var _React$useContext = _react.default.useContext(_antd.ConfigProvider.ConfigContext),
direction = _React$useContext.direction;
var _useStyle = (0, _index.useStyle)("".concat(prefixCls, "-sider"), {
proLayoutCollapsedWidth: 64
}),
wrapSSR = _useStyle.wrapSSR,
hashId = _useStyle.hashId;
var siderClassName = (0, _classnames.default)("".concat(prefixCls, "-sider"), className, hashId);
if (hide) {
return null;
}
var drawerOpenProps = (0, _proUtils.openVisibleCompatible)(!collapsed, function () {
return onCollapse === null || onCollapse === void 0 ? void 0 : onCollapse(true);
});
return wrapSSR(isMobile ? /*#__PURE__*/(0, _jsxRuntime.jsx)(_antd.Drawer, (0, _objectSpread2.default)((0, _objectSpread2.default)({
placement: direction === 'rtl' ? 'right' : 'left',
className: (0, _classnames.default)("".concat(prefixCls, "-drawer-sider"), className)
}, drawerOpenProps), {}, {
style: (0, _objectSpread2.default)({
padding: 0,
height: '100vh'
}, style),
onClose: function onClose() {
onCollapse === null || onCollapse === void 0 || onCollapse(true);
},
maskClosable: true,
closable: false,
getContainer: getContainer || false,
width: siderWidth,
styles: {
body: {
height: '100vh',
padding: 0,
display: 'flex',
flexDirection: 'row',
backgroundColor: (_token$layout = token.layout) === null || _token$layout === void 0 || (_token$layout = _token$layout.sider) === null || _token$layout === void 0 ? void 0 : _token$layout.colorMenuBackground
}
},
children: /*#__PURE__*/(0, _jsxRuntime.jsx)(_SiderMenu.SiderMenu, (0, _objectSpread2.default)((0, _objectSpread2.default)({}, omitProps), {}, {
isMobile: true,
className: siderClassName,
collapsed: isMobile ? false : collapsed,
splitMenus: false,
originCollapsed: collapsed
}))
})) : /*#__PURE__*/(0, _jsxRuntime.jsx)(_SiderMenu.SiderMenu, (0, _objectSpread2.default)((0, _objectSpread2.default)({
className: siderClassName,
originCollapsed: collapsed
}, omitProps), {}, {
style: style
})));
};

View File

@@ -0,0 +1,13 @@
/// <reference types="react" />
import type { ProAliasToken } from '@ant-design/pro-provider';
export interface SiderMenuToken extends ProAliasToken {
componentCls: string;
proLayoutCollapsedWidth: number;
}
export declare const proLayoutTitleHide: any;
export declare function useStyle(prefixCls: string, { proLayoutCollapsedWidth, }: {
proLayoutCollapsedWidth: number;
}): {
wrapSSR: (node: import("react").ReactElement<any, string | import("react").JSXElementConstructor<any>>) => import("react").JSX.Element;
hashId: string;
};

View File

@@ -0,0 +1,193 @@
"use strict";
var _interopRequireDefault = require("@babel/runtime/helpers/interopRequireDefault").default;
Object.defineProperty(exports, "__esModule", {
value: true
});
exports.proLayoutTitleHide = void 0;
exports.useStyle = useStyle;
var _objectSpread2 = _interopRequireDefault(require("@babel/runtime/helpers/objectSpread2"));
var _defineProperty2 = _interopRequireDefault(require("@babel/runtime/helpers/defineProperty"));
var _cssinjs = require("@ant-design/cssinjs");
var _proProvider = require("@ant-design/pro-provider");
var proLayoutTitleHide = exports.proLayoutTitleHide = new _cssinjs.Keyframes('antBadgeLoadingCircle', {
'0%': {
display: 'none',
opacity: 0,
overflow: 'hidden'
},
'80%': {
overflow: 'hidden'
},
'100%': {
display: 'unset',
opacity: 1
}
});
var genSiderMenuStyle = function genSiderMenuStyle(token) {
var _token$layout, _token$layout2, _token$layout3, _token$layout4, _token$layout5, _token$layout6, _token$layout7, _token$layout8, _token$layout9, _token$layout10, _token$layout11, _token$layout12;
return (0, _defineProperty2.default)({}, "".concat(token.proComponentsCls, "-layout"), (0, _defineProperty2.default)((0, _defineProperty2.default)((0, _defineProperty2.default)({}, "".concat(token.antCls, "-layout-sider").concat(token.componentCls), {
background: ((_token$layout = token.layout) === null || _token$layout === void 0 || (_token$layout = _token$layout.sider) === null || _token$layout === void 0 ? void 0 : _token$layout.colorMenuBackground) || 'transparent'
}), token.componentCls, (0, _defineProperty2.default)((0, _defineProperty2.default)((0, _defineProperty2.default)((0, _defineProperty2.default)((0, _defineProperty2.default)((0, _defineProperty2.default)((0, _defineProperty2.default)((0, _defineProperty2.default)((0, _defineProperty2.default)({
position: 'relative',
boxSizing: 'border-box',
'&-menu': {
position: 'relative',
zIndex: 10,
minHeight: '100%'
}
}, "& ".concat(token.antCls, "-layout-sider-children"), {
position: 'relative',
display: 'flex',
flexDirection: 'column',
height: '100%',
paddingInline: (_token$layout2 = token.layout) === null || _token$layout2 === void 0 || (_token$layout2 = _token$layout2.sider) === null || _token$layout2 === void 0 ? void 0 : _token$layout2.paddingInlineLayoutMenu,
paddingBlock: (_token$layout3 = token.layout) === null || _token$layout3 === void 0 || (_token$layout3 = _token$layout3.sider) === null || _token$layout3 === void 0 ? void 0 : _token$layout3.paddingBlockLayoutMenu,
borderInlineEnd: "1px solid ".concat(token.colorSplit),
marginInlineEnd: -1
}), "".concat(token.antCls, "-menu"), (0, _defineProperty2.default)((0, _defineProperty2.default)({}, "".concat(token.antCls, "-menu-item-group-title"), {
fontSize: token.fontSizeSM,
paddingBottom: 4
}), "".concat(token.antCls, "-menu-item:not(").concat(token.antCls, "-menu-item-selected):hover"), {
color: (_token$layout4 = token.layout) === null || _token$layout4 === void 0 || (_token$layout4 = _token$layout4.sider) === null || _token$layout4 === void 0 ? void 0 : _token$layout4.colorTextMenuItemHover
})), '&-logo', {
position: 'relative',
display: 'flex',
alignItems: 'center',
justifyContent: 'space-between',
paddingInline: 12,
paddingBlock: 16,
color: (_token$layout5 = token.layout) === null || _token$layout5 === void 0 || (_token$layout5 = _token$layout5.sider) === null || _token$layout5 === void 0 ? void 0 : _token$layout5.colorTextMenu,
cursor: 'pointer',
borderBlockEnd: "1px solid ".concat((_token$layout6 = token.layout) === null || _token$layout6 === void 0 || (_token$layout6 = _token$layout6.sider) === null || _token$layout6 === void 0 ? void 0 : _token$layout6.colorMenuItemDivider),
'> a': {
display: 'flex',
alignItems: 'center',
justifyContent: 'center',
minHeight: 22,
fontSize: 22,
'> img': {
display: 'inline-block',
height: 22,
verticalAlign: 'middle'
},
'> h1': {
display: 'inline-block',
height: 22,
marginBlock: 0,
marginInlineEnd: 0,
marginInlineStart: 6,
color: (_token$layout7 = token.layout) === null || _token$layout7 === void 0 || (_token$layout7 = _token$layout7.sider) === null || _token$layout7 === void 0 ? void 0 : _token$layout7.colorTextMenuTitle,
animationName: proLayoutTitleHide,
animationDuration: '.4s',
animationTimingFunction: 'ease',
fontWeight: 600,
fontSize: 16,
lineHeight: '22px',
verticalAlign: 'middle'
}
},
'&-collapsed': (0, _defineProperty2.default)({
flexDirection: 'column-reverse',
margin: 0,
padding: 12
}, "".concat(token.proComponentsCls, "-layout-apps-icon"), {
marginBlockEnd: 8,
fontSize: 16,
transition: 'font-size 0.2s ease-in-out,color 0.2s ease-in-out'
})
}), '&-actions', {
display: 'flex',
alignItems: 'center',
justifyContent: 'space-between',
marginBlock: 4,
marginInline: 0,
color: (_token$layout8 = token.layout) === null || _token$layout8 === void 0 || (_token$layout8 = _token$layout8.sider) === null || _token$layout8 === void 0 ? void 0 : _token$layout8.colorTextMenu,
'&-collapsed': {
flexDirection: 'column-reverse',
paddingBlock: 0,
paddingInline: 8,
fontSize: 16,
transition: 'font-size 0.3s ease-in-out'
},
'&-list': {
color: (_token$layout9 = token.layout) === null || _token$layout9 === void 0 || (_token$layout9 = _token$layout9.sider) === null || _token$layout9 === void 0 ? void 0 : _token$layout9.colorTextMenuSecondary,
'&-collapsed': {
marginBlockEnd: 8,
animationName: 'none'
},
'&-item': {
paddingInline: 6,
paddingBlock: 6,
lineHeight: '16px',
fontSize: 16,
cursor: 'pointer',
borderRadius: token.borderRadius,
'&:hover': {
background: token.colorBgTextHover
}
}
},
'&-avatar': {
fontSize: 14,
paddingInline: 8,
paddingBlock: 8,
display: 'flex',
alignItems: 'center',
gap: token.marginXS,
borderRadius: token.borderRadius,
'& *': {
cursor: 'pointer'
},
'&:hover': {
background: token.colorBgTextHover
}
}
}), '&-hide-menu-collapsed', {
insetInlineStart: "-".concat(token.proLayoutCollapsedWidth - 12, "px"),
position: 'absolute'
}), '&-extra', {
marginBlockEnd: 16,
marginBlock: 0,
marginInline: 16,
'&-no-logo': {
marginBlockStart: 16
}
}), '&-links', {
width: '100%',
ul: {
height: 'auto'
}
}), '&-link-menu', {
border: 'none',
boxShadow: 'none',
background: 'transparent'
}), '&-footer', {
color: (_token$layout10 = token.layout) === null || _token$layout10 === void 0 || (_token$layout10 = _token$layout10.sider) === null || _token$layout10 === void 0 ? void 0 : _token$layout10.colorTextMenuSecondary,
paddingBlockEnd: 16,
fontSize: token.fontSize,
animationName: proLayoutTitleHide,
animationDuration: '.4s',
animationTimingFunction: 'ease'
})), "".concat(token.componentCls).concat(token.componentCls, "-fixed"), {
position: 'fixed',
insetBlockStart: 0,
insetInlineStart: 0,
zIndex: '100',
height: '100%',
'&-mix': {
height: "calc(100% - ".concat(((_token$layout11 = token.layout) === null || _token$layout11 === void 0 || (_token$layout11 = _token$layout11.header) === null || _token$layout11 === void 0 ? void 0 : _token$layout11.heightLayoutHeader) || 56, "px)"),
insetBlockStart: "".concat(((_token$layout12 = token.layout) === null || _token$layout12 === void 0 || (_token$layout12 = _token$layout12.header) === null || _token$layout12 === void 0 ? void 0 : _token$layout12.heightLayoutHeader) || 56, "px")
}
}));
};
function useStyle(prefixCls, _ref2) {
var proLayoutCollapsedWidth = _ref2.proLayoutCollapsedWidth;
return (0, _proProvider.useStyle)('ProLayoutSiderMenu', function (token) {
var siderMenuToken = (0, _objectSpread2.default)((0, _objectSpread2.default)({}, token), {}, {
componentCls: ".".concat(prefixCls),
proLayoutCollapsedWidth: proLayoutCollapsedWidth
});
return [genSiderMenuStyle(siderMenuToken)];
});
}

View File

@@ -0,0 +1,10 @@
/// <reference types="react" />
import type { ProAliasToken } from '@ant-design/pro-provider';
import type { MenuMode } from '../BaseMenu';
export interface ProLayoutBaseMenuToken extends ProAliasToken {
componentCls: string;
}
export declare function useStyle(prefixCls: string, mode: MenuMode | undefined): {
wrapSSR: (node: import("react").ReactElement<any, string | import("react").JSXElementConstructor<any>>) => import("react").JSX.Element;
hashId: string;
};

View File

@@ -0,0 +1,124 @@
"use strict";
var _interopRequireDefault = require("@babel/runtime/helpers/interopRequireDefault").default;
Object.defineProperty(exports, "__esModule", {
value: true
});
exports.useStyle = useStyle;
var _defineProperty2 = _interopRequireDefault(require("@babel/runtime/helpers/defineProperty"));
var _objectSpread4 = _interopRequireDefault(require("@babel/runtime/helpers/objectSpread2"));
var _proProvider = require("@ant-design/pro-provider");
var genProLayoutBaseMenuStyle = function genProLayoutBaseMenuStyle(token, mode) {
var _token$layout, _token$layout2;
var menuToken = mode.includes('horizontal') ? (_token$layout = token.layout) === null || _token$layout === void 0 ? void 0 : _token$layout.header : (_token$layout2 = token.layout) === null || _token$layout2 === void 0 ? void 0 : _token$layout2.sider;
return (0, _objectSpread4.default)((0, _objectSpread4.default)((0, _defineProperty2.default)({}, "".concat(token.componentCls), (0, _defineProperty2.default)((0, _defineProperty2.default)((0, _defineProperty2.default)((0, _defineProperty2.default)((0, _defineProperty2.default)((0, _defineProperty2.default)((0, _defineProperty2.default)((0, _defineProperty2.default)((0, _defineProperty2.default)({
background: 'transparent',
color: menuToken === null || menuToken === void 0 ? void 0 : menuToken.colorTextMenu,
border: 'none'
}, "".concat(token.componentCls, "-menu-item"), {
transition: 'none !important'
}), "".concat(token.componentCls, "-submenu-has-icon"), (0, _defineProperty2.default)({}, "> ".concat(token.antCls, "-menu-sub"), {
paddingInlineStart: 10
})), "".concat(token.antCls, "-menu-title-content"), {
width: '100%',
height: '100%',
display: 'inline-flex'
}), "".concat(token.antCls, "-menu-title-content"), {
'&:first-child': {
width: '100%'
}
}), "".concat(token.componentCls, "-item-icon"), {
display: 'flex',
alignItems: 'center'
}), "&&-collapsed", (0, _defineProperty2.default)((0, _defineProperty2.default)((0, _defineProperty2.default)({}, "".concat(token.antCls, "-menu-item, \n ").concat(token.antCls, "-menu-item-group > ").concat(token.antCls, "-menu-item-group-list > ").concat(token.antCls, "-menu-item, \n ").concat(token.antCls, "-menu-item-group > ").concat(token.antCls, "-menu-item-group-list > ").concat(token.antCls, "-menu-submenu > ").concat(token.antCls, "-menu-submenu-title, \n ").concat(token.antCls, "-menu-submenu > ").concat(token.antCls, "-menu-submenu-title"), {
paddingInline: '0 !important',
marginBlock: '4px !important'
}), "".concat(token.antCls, "-menu-item-group > ").concat(token.antCls, "-menu-item-group-list > ").concat(token.antCls, "-menu-submenu-selected > ").concat(token.antCls, "-menu-submenu-title, \n ").concat(token.antCls, "-menu-submenu-selected > ").concat(token.antCls, "-menu-submenu-title"), {
backgroundColor: menuToken === null || menuToken === void 0 ? void 0 : menuToken.colorBgMenuItemSelected,
borderRadius: token.borderRadiusLG
}), "".concat(token.componentCls, "-group"), (0, _defineProperty2.default)({}, "".concat(token.antCls, "-menu-item-group-title"), {
paddingInline: 0
}))), '&-item-title', (0, _defineProperty2.default)((0, _defineProperty2.default)((0, _defineProperty2.default)((0, _defineProperty2.default)((0, _defineProperty2.default)({
display: 'flex',
flexDirection: 'row',
alignItems: 'center',
gap: token.marginXS
}, "".concat(token.componentCls, "-item-text"), {
maxWidth: '100%',
textOverflow: 'ellipsis',
overflow: 'hidden',
wordBreak: 'break-all',
whiteSpace: 'nowrap'
}), '&-collapsed', (0, _defineProperty2.default)((0, _defineProperty2.default)({
minWidth: 40,
height: 40
}, "".concat(token.componentCls, "-item-icon"), {
height: '16px',
width: '16px',
lineHeight: '16px !important',
'.anticon': {
lineHeight: '16px !important',
height: '16px'
}
}), "".concat(token.componentCls, "-item-text-has-icon"), {
display: 'none !important'
})), '&-collapsed-level-0', {
flexDirection: 'column',
justifyContent: 'center'
}), "&".concat(token.componentCls, "-group-item-title"), {
gap: token.marginXS,
height: 18,
overflow: 'hidden'
}), "&".concat(token.componentCls, "-item-collapsed-show-title"), (0, _defineProperty2.default)({
lineHeight: '16px',
gap: 0
}, "&".concat(token.componentCls, "-item-title-collapsed"), (0, _defineProperty2.default)((0, _defineProperty2.default)({
display: 'flex'
}, "".concat(token.componentCls, "-item-icon"), {
height: '16px',
width: '16px',
lineHeight: '16px !important',
'.anticon': {
lineHeight: '16px!important',
height: '16px'
}
}), "".concat(token.componentCls, "-item-text"), {
opacity: '1 !important',
display: 'inline !important',
textAlign: 'center',
fontSize: 12,
height: 12,
lineHeight: '12px',
overflow: 'hidden',
textOverflow: 'ellipsis',
whiteSpace: 'nowrap',
width: '100%',
margin: 0,
padding: 0,
marginBlockStart: 4
})))), '&-group', (0, _defineProperty2.default)({}, "".concat(token.antCls, "-menu-item-group-title"), {
fontSize: 12,
color: token.colorTextLabel,
'.anticon': {
marginInlineEnd: 8
}
})), '&-group-divider', {
color: token.colorTextSecondary,
fontSize: 12,
lineHeight: 20
})), mode.includes('horizontal') ? {} : (0, _defineProperty2.default)({}, "".concat(token.antCls, "-menu-submenu").concat(token.antCls, "-menu-submenu-popup"), (0, _defineProperty2.default)({}, "".concat(token.componentCls, "-item-title"), {
alignItems: 'flex-start'
}))), {}, (0, _defineProperty2.default)({}, "".concat(token.antCls, "-menu-submenu-popup"), {
backgroundColor: 'rgba(255, 255, 255, 0.42)',
'-webkit-backdrop-filter': 'blur(8px)',
backdropFilter: 'blur(8px)'
}));
};
function useStyle(prefixCls, mode) {
return (0, _proProvider.useStyle)('ProLayoutBaseMenu' + mode, function (token) {
var proLayoutMenuToken = (0, _objectSpread4.default)((0, _objectSpread4.default)({}, token), {}, {
componentCls: ".".concat(prefixCls)
});
return [genProLayoutBaseMenuStyle(proLayoutMenuToken, mode || 'inline')];
});
}

View File

@@ -0,0 +1,13 @@
/// <reference types="react" />
import type { GenerateStyle, ProAliasToken } from '@ant-design/pro-provider';
export interface SiderMenuToken extends ProAliasToken {
componentCls: string;
proLayoutCollapsedWidth: number;
}
export declare function useStylish(prefixCls: string, { stylish, proLayoutCollapsedWidth, }: {
stylish?: GenerateStyle<SiderMenuToken>;
proLayoutCollapsedWidth: number;
}): {
wrapSSR: (node: import("react").ReactElement<any, string | import("react").JSXElementConstructor<any>>) => import("react").JSX.Element;
hashId: string;
};

View File

@@ -0,0 +1,22 @@
"use strict";
var _interopRequireDefault = require("@babel/runtime/helpers/interopRequireDefault").default;
Object.defineProperty(exports, "__esModule", {
value: true
});
exports.useStylish = useStylish;
var _defineProperty2 = _interopRequireDefault(require("@babel/runtime/helpers/defineProperty"));
var _objectSpread2 = _interopRequireDefault(require("@babel/runtime/helpers/objectSpread2"));
var _proProvider = require("@ant-design/pro-provider");
function useStylish(prefixCls, _ref) {
var stylish = _ref.stylish,
proLayoutCollapsedWidth = _ref.proLayoutCollapsedWidth;
return (0, _proProvider.useStyle)('ProLayoutSiderMenuStylish', function (token) {
var siderMenuToken = (0, _objectSpread2.default)((0, _objectSpread2.default)({}, token), {}, {
componentCls: ".".concat(prefixCls),
proLayoutCollapsedWidth: proLayoutCollapsedWidth
});
if (!stylish) return [];
return [(0, _defineProperty2.default)({}, "div".concat(token.proComponentsCls, "-layout"), (0, _defineProperty2.default)({}, "".concat(siderMenuToken.componentCls), stylish === null || stylish === void 0 ? void 0 : stylish(siderMenuToken)))];
});
}