UNPKG

naive-ui

Version:

A Vue 3 Component Library. Fairly Complete, Theme Customizable, Uses TypeScript, Fast

257 lines (256 loc) 12 kB
"use strict"; var __importDefault = (this && this.__importDefault) || function (mod) { return (mod && mod.__esModule) ? mod : { "default": mod }; }; Object.defineProperty(exports, "__esModule", { value: true }); exports.layoutSiderProps = void 0; const vooks_1 = require("vooks"); const vue_1 = require("vue"); const _internal_1 = require("../../_internal"); const _mixins_1 = require("../../_mixins"); const _utils_1 = require("../../_utils"); const styles_1 = require("../styles"); const interface_1 = require("./interface"); const Layout_1 = require("./Layout"); const layout_sider_cssr_1 = __importDefault(require("./styles/layout-sider.cssr")); const ToggleBar_1 = __importDefault(require("./ToggleBar")); const ToggleButton_1 = __importDefault(require("./ToggleButton")); exports.layoutSiderProps = { position: interface_1.positionProp, bordered: Boolean, collapsedWidth: { type: Number, default: 48 }, width: { type: [Number, String], default: 272 }, contentClass: String, contentStyle: { type: [String, Object], default: '' }, collapseMode: { type: String, default: 'transform' }, collapsed: { type: Boolean, default: undefined }, defaultCollapsed: Boolean, showCollapsedContent: { type: Boolean, default: true }, showTrigger: { type: [Boolean, String], default: false }, nativeScrollbar: { type: Boolean, default: true }, inverted: Boolean, scrollbarProps: Object, triggerClass: String, triggerStyle: [String, Object], collapsedTriggerClass: String, collapsedTriggerStyle: [String, Object], 'onUpdate:collapsed': [Function, Array], onUpdateCollapsed: [Function, Array], onAfterEnter: Function, onAfterLeave: Function, // deprecated onExpand: [Function, Array], onCollapse: [Function, Array], onScroll: Function }; exports.default = (0, vue_1.defineComponent)({ name: 'LayoutSider', props: Object.assign(Object.assign({}, _mixins_1.useTheme.props), exports.layoutSiderProps), setup(props) { const layoutProps = (0, vue_1.inject)(Layout_1.layoutInjectionKey); if (process.env.NODE_ENV !== 'production') { if (!layoutProps) { (0, _utils_1.warn)('layout-sider', 'Layout sider is not allowed to be put outside layout.'); } else { if (!layoutProps.hasSider) { (0, _utils_1.warn)('layout-sider', 'You are putting `n-layout-sider` in a `n-layout` but haven\'t set `has-sider` on the `n-layout`.'); } } } const scrollableElRef = (0, vue_1.ref)(null); const scrollbarInstRef = (0, vue_1.ref)(null); const uncontrolledCollapsedRef = (0, vue_1.ref)(props.defaultCollapsed); const mergedCollapsedRef = (0, vooks_1.useMergedState)((0, vue_1.toRef)(props, 'collapsed'), uncontrolledCollapsedRef); const styleMaxWidthRef = (0, vue_1.computed)(() => { return (0, _utils_1.formatLength)(mergedCollapsedRef.value ? props.collapsedWidth : props.width); }); const scrollContainerStyleRef = (0, vue_1.computed)(() => { if (props.collapseMode !== 'transform') return {}; return { minWidth: (0, _utils_1.formatLength)(props.width) }; }); const siderPlacementRef = (0, vue_1.computed)(() => { return layoutProps ? layoutProps.siderPlacement : 'left'; }); function scrollTo(options, y) { if (props.nativeScrollbar) { const { value: scrollableEl } = scrollableElRef; if (scrollableEl) { if (y === undefined) { scrollableEl.scrollTo(options); } else { scrollableEl.scrollTo(options, y); } } } else { const { value: scrollbarInst } = scrollbarInstRef; if (scrollbarInst) { scrollbarInst.scrollTo(options, y); } } } function handleTriggerClick() { const { 'onUpdate:collapsed': _onUpdateCollapsed, onUpdateCollapsed, // deprecated onExpand, onCollapse } = props; const { value: collapsed } = mergedCollapsedRef; if (onUpdateCollapsed) { (0, _utils_1.call)(onUpdateCollapsed, !collapsed); } if (_onUpdateCollapsed) { (0, _utils_1.call)(_onUpdateCollapsed, !collapsed); } uncontrolledCollapsedRef.value = !collapsed; if (collapsed) { if (onExpand) (0, _utils_1.call)(onExpand); } else { if (onCollapse) (0, _utils_1.call)(onCollapse); } } let scrollX = 0; let scrollY = 0; const handleNativeElScroll = (e) => { var _a; const target = e.target; scrollX = target.scrollLeft; scrollY = target.scrollTop; (_a = props.onScroll) === null || _a === void 0 ? void 0 : _a.call(props, e); }; (0, _utils_1.useReactivated)(() => { if (props.nativeScrollbar) { const el = scrollableElRef.value; if (el) { el.scrollTop = scrollY; el.scrollLeft = scrollX; } } }); (0, vue_1.provide)(interface_1.layoutSiderInjectionKey, { collapsedRef: mergedCollapsedRef, collapseModeRef: (0, vue_1.toRef)(props, 'collapseMode') }); const { mergedClsPrefixRef, inlineThemeDisabled } = (0, _mixins_1.useConfig)(props); const themeRef = (0, _mixins_1.useTheme)('Layout', '-layout-sider', layout_sider_cssr_1.default, styles_1.layoutLight, props, mergedClsPrefixRef); function handleTransitionend(e) { var _a, _b; if (e.propertyName === 'max-width') { if (mergedCollapsedRef.value) { (_a = props.onAfterLeave) === null || _a === void 0 ? void 0 : _a.call(props); } else { (_b = props.onAfterEnter) === null || _b === void 0 ? void 0 : _b.call(props); } } } const exposedMethods = { scrollTo }; const cssVarsRef = (0, vue_1.computed)(() => { const { common: { cubicBezierEaseInOut }, self } = themeRef.value; const { siderToggleButtonColor, siderToggleButtonBorder, siderToggleBarColor, siderToggleBarColorHover } = self; const vars = { '--n-bezier': cubicBezierEaseInOut, '--n-toggle-button-color': siderToggleButtonColor, '--n-toggle-button-border': siderToggleButtonBorder, '--n-toggle-bar-color': siderToggleBarColor, '--n-toggle-bar-color-hover': siderToggleBarColorHover }; if (props.inverted) { vars['--n-color'] = self.siderColorInverted; vars['--n-text-color'] = self.textColorInverted; vars['--n-border-color'] = self.siderBorderColorInverted; vars['--n-toggle-button-icon-color'] = self.siderToggleButtonIconColorInverted; vars.__invertScrollbar = self.__invertScrollbar; } else { vars['--n-color'] = self.siderColor; vars['--n-text-color'] = self.textColor; vars['--n-border-color'] = self.siderBorderColor; vars['--n-toggle-button-icon-color'] = self.siderToggleButtonIconColor; } return vars; }); const themeClassHandle = inlineThemeDisabled ? (0, _mixins_1.useThemeClass)('layout-sider', (0, vue_1.computed)(() => (props.inverted ? 'a' : 'b')), cssVarsRef, props) : undefined; return Object.assign({ scrollableElRef, scrollbarInstRef, mergedClsPrefix: mergedClsPrefixRef, mergedTheme: themeRef, styleMaxWidth: styleMaxWidthRef, mergedCollapsed: mergedCollapsedRef, scrollContainerStyle: scrollContainerStyleRef, siderPlacement: siderPlacementRef, handleNativeElScroll, handleTransitionend, handleTriggerClick, inlineThemeDisabled, cssVars: cssVarsRef, themeClass: themeClassHandle === null || themeClassHandle === void 0 ? void 0 : themeClassHandle.themeClass, onRender: themeClassHandle === null || themeClassHandle === void 0 ? void 0 : themeClassHandle.onRender }, exposedMethods); }, render() { var _a; const { mergedClsPrefix, mergedCollapsed, showTrigger } = this; (_a = this.onRender) === null || _a === void 0 ? void 0 : _a.call(this); return ((0, vue_1.h)("aside", { class: [ `${mergedClsPrefix}-layout-sider`, this.themeClass, `${mergedClsPrefix}-layout-sider--${this.position}-positioned`, `${mergedClsPrefix}-layout-sider--${this.siderPlacement}-placement`, this.bordered && `${mergedClsPrefix}-layout-sider--bordered`, mergedCollapsed && `${mergedClsPrefix}-layout-sider--collapsed`, (!mergedCollapsed || this.showCollapsedContent) && `${mergedClsPrefix}-layout-sider--show-content` ], onTransitionend: this.handleTransitionend, style: [ this.inlineThemeDisabled ? undefined : this.cssVars, { maxWidth: this.styleMaxWidth, width: (0, _utils_1.formatLength)(this.width) } ] }, !this.nativeScrollbar ? ((0, vue_1.h)(_internal_1.NScrollbar, Object.assign({}, this.scrollbarProps, { onScroll: this.onScroll, ref: "scrollbarInstRef", style: this.scrollContainerStyle, contentStyle: this.contentStyle, contentClass: this.contentClass, theme: this.mergedTheme.peers.Scrollbar, themeOverrides: this.mergedTheme.peerOverrides.Scrollbar, // here is a hack, since in light theme the scrollbar color is dark, // we need to invert it in light color... builtinThemeOverrides: this.inverted && this.cssVars.__invertScrollbar === 'true' ? { colorHover: 'rgba(255, 255, 255, .4)', color: 'rgba(255, 255, 255, .3)' } : undefined }), this.$slots)) : ((0, vue_1.h)("div", { class: [ `${mergedClsPrefix}-layout-sider-scroll-container`, this.contentClass ], onScroll: this.handleNativeElScroll, style: [ this.scrollContainerStyle, { overflow: 'auto' }, this.contentStyle ], ref: "scrollableElRef" }, this.$slots)), showTrigger ? (showTrigger === 'bar' ? ((0, vue_1.h)(ToggleBar_1.default, { clsPrefix: mergedClsPrefix, class: mergedCollapsed ? this.collapsedTriggerClass : this.triggerClass, style: mergedCollapsed ? this.collapsedTriggerStyle : this.triggerStyle, onClick: this.handleTriggerClick })) : ((0, vue_1.h)(ToggleButton_1.default, { clsPrefix: mergedClsPrefix, class: mergedCollapsed ? this.collapsedTriggerClass : this.triggerClass, style: mergedCollapsed ? this.collapsedTriggerStyle : this.triggerStyle, onClick: this.handleTriggerClick }))) : null, this.bordered ? ((0, vue_1.h)("div", { class: `${mergedClsPrefix}-layout-sider__border` })) : null)); } });