UNPKG

tdesign-vue

Version:
308 lines (300 loc) 11.8 kB
/** * tdesign v1.11.2 * (c) 2025 tdesign * @license MIT */ 'use strict'; Object.defineProperty(exports, '__esModule', { value: true }); var _asyncToGenerator = require('@babel/runtime/helpers/asyncToGenerator'); var _defineProperty = require('@babel/runtime/helpers/defineProperty'); var _regeneratorRuntime = require('@babel/runtime/regenerator'); var Vue = require('vue'); var anchor_utils = require('./utils.js'); var utils_dom = require('../utils/dom.js'); var anchor_props = require('./props.js'); var utils_renderTnode = require('../utils/render-tnode.js'); var configProvider_configReceiver = require('../config-provider/config-receiver.js'); var utils_mixins = require('../utils/mixins.js'); var affix_index = require('../affix/index.js'); var isFunction = require('../_chunks/dep-ecccff93.js'); require('raf'); require('../utils/easing.js'); require('../_chunks/dep-738b4f21.js'); require('../_chunks/dep-a4308f57.js'); require('@babel/runtime/helpers/typeof'); require('../_chunks/dep-fcf0662d.js'); require('../_chunks/dep-e4278c54.js'); require('@babel/runtime/helpers/readOnlyError'); require('@vue/composition-api'); require('../_chunks/dep-7c854ec6.js'); require('../_chunks/dep-eceed11d.js'); require('../_chunks/dep-201f7798.js'); require('../_chunks/dep-d3015b4c.js'); require('../_chunks/dep-f8a85d6a.js'); require('../_chunks/dep-5b117689.js'); require('../_chunks/dep-6478392e.js'); require('../_chunks/dep-47bca35e.js'); require('../_chunks/dep-07fb8c0e.js'); require('../_common/js/global-config/default-config.js'); require('../_common/js/global-config/locale/zh_CN.js'); require('../_chunks/dep-a4a18104.js'); require('../_chunks/dep-27dd8cc6.js'); require('dayjs'); require('../_chunks/dep-87c765cc.js'); require('../_chunks/dep-75cd6d52.js'); require('../_chunks/dep-b1a02818.js'); require('../_chunks/dep-3d8ab37d.js'); require('../_chunks/dep-a4cecac4.js'); require('../_chunks/dep-ab142eaf.js'); require('../_chunks/dep-6ad3de7c.js'); require('../_chunks/dep-8b1e056e.js'); require('../_chunks/dep-5db8defc.js'); require('../_chunks/dep-6e4c473c.js'); require('../_chunks/dep-234b7c02.js'); require('../_chunks/dep-a4747856.js'); require('../_chunks/dep-932dd69e.js'); require('../_chunks/dep-9f4caea4.js'); require('../_chunks/dep-dbd838d6.js'); require('../_chunks/dep-b3120c1b.js'); require('../_chunks/dep-68ba2357.js'); require('../_chunks/dep-173eb46c.js'); require('../affix/affix.js'); require('../affix/props.js'); require('../utils/withInstall.js'); function _interopDefaultLegacy (e) { return e && typeof e === 'object' && 'default' in e ? e : { 'default': e }; } var _asyncToGenerator__default = /*#__PURE__*/_interopDefaultLegacy(_asyncToGenerator); var _defineProperty__default = /*#__PURE__*/_interopDefaultLegacy(_defineProperty); var _regeneratorRuntime__default = /*#__PURE__*/_interopDefaultLegacy(_regeneratorRuntime); var Vue__default = /*#__PURE__*/_interopDefaultLegacy(Vue); function ownKeys(e, r) { var t = Object.keys(e); if (Object.getOwnPropertySymbols) { var o = Object.getOwnPropertySymbols(e); r && (o = o.filter(function (r) { return Object.getOwnPropertyDescriptor(e, r).enumerable; })), t.push.apply(t, o); } return t; } function _objectSpread(e) { for (var r = 1; r < arguments.length; r++) { var t = null != arguments[r] ? arguments[r] : {}; r % 2 ? ownKeys(Object(t), !0).forEach(function (r) { _defineProperty__default["default"](e, r, t[r]); }) : Object.getOwnPropertyDescriptors ? Object.defineProperties(e, Object.getOwnPropertyDescriptors(t)) : ownKeys(Object(t)).forEach(function (r) { Object.defineProperty(e, r, Object.getOwnPropertyDescriptor(t, r)); }); } return e; } var classPrefixMixins = configProvider_configReceiver.getClassPrefixMixins("anchor"); var _Anchor = utils_mixins["default"](Vue__default["default"], classPrefixMixins).extend({ name: "TAnchor", props: _objectSpread({}, anchor_props["default"]), provide: function provide() { return { tAnchor: this }; }, data: function data() { return { links: [], active: "", activeLineStyle: false }; }, watch: { attach: function attach() { if (this.scrollContainer) { utils_dom.off(this.scrollContainer, "scroll", this.handleScroll); } this.getScrollContainer(); } }, methods: { getScrollContainer: function getScrollContainer() { var container = this.container; this.scrollContainer = utils_dom.getScrollContainer(container); utils_dom.on(this.scrollContainer, "scroll", this.handleScroll); this.handleScroll(); }, getAnchorTarget: function getAnchorTarget(link) { var matcher = link.match(anchor_utils.ANCHOR_SHARP_REGEXP); if (!matcher) { return; } var anchor = document.getElementById(matcher[1]); if (!anchor) { return; } return anchor; }, registerLink: function registerLink(link) { var links = this.links; if (!anchor_utils.ANCHOR_SHARP_REGEXP.test(link) || links.indexOf(link) !== -1) { return; } links.push(link); }, unregisterLink: function unregisterLink(link) { this.links = this.links.filter(function (each) { return each !== link; }); }, setCurrentActiveLink: function setCurrentActiveLink(link) { var _this = this; return _asyncToGenerator__default["default"](/*#__PURE__*/_regeneratorRuntime__default["default"].mark(function _callee() { var active; return _regeneratorRuntime__default["default"].wrap(function _callee$(_context) { while (1) switch (_context.prev = _context.next) { case 0: active = _this.active; if (!(active === link)) { _context.next = 3; break; } return _context.abrupt("return"); case 3: _this.active = link; _this.emitChange(link, active); _context.next = 7; return Vue__default["default"].nextTick(); case 7: _this.updateActiveLine(); case 8: case "end": return _context.stop(); } }, _callee); }))(); }, updateActiveLine: function updateActiveLine() { var ele = this.$el.querySelector(".".concat(this.commonStatusClassName.active, ">a")); if (!ele) { this.activeLineStyle = false; return; } var top = ele.offsetTop, height = ele.offsetHeight; this.activeLineStyle = { top: "".concat(top, "px"), height: "".concat(height, "px"), opacity: 1 }; }, emitChange: function emitChange(currentLink, prevLink) { this.$emit("change", currentLink, prevLink); if (this.onChange) { this.onChange(currentLink, prevLink); } }, handleLinkClick: function handleLinkClick(link) { var _this$onClick; this.$emit("click", link); (_this$onClick = this.onClick) === null || _this$onClick === void 0 || _this$onClick.call(this, link); var getCurrentAnchor = this.$props.getCurrentAnchor; var newHref = isFunction.isFunction(getCurrentAnchor) ? getCurrentAnchor(link.href) : link.href; this.handleScrollTo(newHref); }, handleScrollTo: function handleScrollTo(link) { var _this2 = this; return _asyncToGenerator__default["default"](/*#__PURE__*/_regeneratorRuntime__default["default"].mark(function _callee2() { var anchor, scrollContainer, targetOffset, scrollTop, offsetTop, top; return _regeneratorRuntime__default["default"].wrap(function _callee2$(_context2) { while (1) switch (_context2.prev = _context2.next) { case 0: anchor = _this2.getAnchorTarget(link); _this2.setCurrentActiveLink(link); if (anchor) { _context2.next = 4; break; } return _context2.abrupt("return"); case 4: _this2.handleScrollLock = true; scrollContainer = _this2.scrollContainer, targetOffset = _this2.targetOffset; scrollTop = utils_dom.getScroll(scrollContainer); offsetTop = anchor_utils.getOffsetTop(anchor, scrollContainer); top = scrollTop + offsetTop - targetOffset; _context2.next = 11; return utils_dom.scrollTo(top, { container: scrollContainer }); case 11: _this2.handleScrollLock = false; case 12: case "end": return _context2.stop(); } }, _callee2); }))(); }, handleScroll: function handleScroll() { var _this3 = this; if (this.handleScrollLock) return; var links = this.links, bounds = this.bounds, targetOffset = this.targetOffset; var filters = []; var active = ""; links.forEach(function (link) { var anchor = _this3.getAnchorTarget(link); if (!anchor) { return; } var top = anchor_utils.getOffsetTop(anchor, _this3.scrollContainer); if (top < bounds + targetOffset) { filters.push({ link: link, top: top }); } }); if (filters.length) { var latest = filters.reduce(function (prev, cur) { return prev.top > cur.top ? prev : cur; }); active = latest.link; } this.setCurrentActiveLink(active); }, renderCursor: function renderCursor() { var h = this.$createElement; var titleContent = utils_renderTnode.renderTNodeJSX(this, "cursor"); return titleContent || h("div", { "class": "".concat(this.componentName, "__line-cursor") }); } }, mounted: function mounted() { var _this4 = this; return _asyncToGenerator__default["default"](/*#__PURE__*/_regeneratorRuntime__default["default"].mark(function _callee3() { var getCurrentAnchor, _window, href; return _regeneratorRuntime__default["default"].wrap(function _callee3$(_context3) { while (1) switch (_context3.prev = _context3.next) { case 0: _this4.getScrollContainer(); getCurrentAnchor = _this4.$props.getCurrentAnchor; if (isFunction.isFunction(getCurrentAnchor)) { _this4.setCurrentActiveLink(getCurrentAnchor(_this4.active)); } else { href = (_window = window) === null || _window === void 0 ? void 0 : _window.location.hash; _this4.setCurrentActiveLink(decodeURIComponent(href)); } case 3: case "end": return _context3.stop(); } }, _callee3); }))(); }, destroyed: function destroyed() { if (!this.scrollContainer) return; utils_dom.off(this.scrollContainer, "scroll", this.handleScroll); }, render: function render() { var h = arguments[0]; var children = this.$scopedSlots["default"], size = this.size, affixProps = this.affixProps, activeLineStyle = this.activeLineStyle; var className = [this.componentName, this.commonSizeClassName[size]]; var content = h("div", { "class": className }, [h("div", { "class": "".concat(this.componentName, "__line") }, [h("div", { "class": "".concat(this.componentName, "__line-cursor-wrapper"), "style": activeLineStyle }, [this.renderCursor()])]), children && children(null)]); if (affixProps) { return h(affix_index.Affix, { "props": _objectSpread({}, affixProps) }, [content]); } return content; } }); exports["default"] = _Anchor; //# sourceMappingURL=anchor.js.map