@airhang/vue-book-reader 1.0.1 → 1.0.2
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/dist/vue-book-reader.common.js +7 -7
- package/dist/vue-book-reader.common.js.map +1 -1
- package/dist/vue-book-reader.css +1 -1
- package/dist/vue-book-reader.umd.js +7 -7
- package/dist/vue-book-reader.umd.js.map +1 -1
- package/dist/vue-book-reader.umd.min.js +2 -2
- package/dist/vue-book-reader.umd.min.js.map +1 -1
- package/package.json +2 -1
- package/src/components/BookReader.vue +6 -2
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"vue-book-reader.umd.min.js","mappings":"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","sources":["webpack://vue-book-reader/webpack/universalModuleDefinition","webpack://vue-book-reader/webpack/bootstrap","webpack://vue-book-reader/webpack/runtime/define property getters","webpack://vue-book-reader/webpack/runtime/hasOwnProperty shorthand","webpack://vue-book-reader/webpack/runtime/make namespace object","webpack://vue-book-reader/webpack/runtime/publicPath","webpack://vue-book-reader/./node_modules/@vue/cli-service/lib/commands/build/setPublicPath.js","webpack://vue-book-reader/./src/components/BookReader.vue?ed9e","webpack://vue-book-reader/./node_modules/rematrix/dist/rematrix.es.js","webpack://vue-book-reader/./node_modules/flipbook-vue/dist/vue2/flipbook.mjs","webpack://vue-book-reader/./src/components/BookCatalogueDrawer.vue?ef5d","webpack://vue-book-reader/src/components/BookCatalogueDrawer.vue","webpack://vue-book-reader/./src/components/BookCatalogueDrawer.vue?e206","webpack://vue-book-reader/./node_modules/@vue/vue-loader-v15/lib/runtime/componentNormalizer.js","webpack://vue-book-reader/./src/components/BookCatalogueDrawer.vue","webpack://vue-book-reader/src/components/BookReader.vue","webpack://vue-book-reader/./src/components/BookReader.vue?0add","webpack://vue-book-reader/./src/components/BookReader.vue","webpack://vue-book-reader/./src/index.js","webpack://vue-book-reader/./node_modules/@vue/cli-service/lib/commands/build/entry-lib.js"],"sourcesContent":["(function webpackUniversalModuleDefinition(root, factory) {\n\tif(typeof exports === 'object' && typeof module === 'object')\n\t\tmodule.exports = factory();\n\telse if(typeof define === 'function' && define.amd)\n\t\tdefine([], factory);\n\telse if(typeof exports === 'object')\n\t\texports[\"vue-book-reader\"] = factory();\n\telse\n\t\troot[\"vue-book-reader\"] = factory();\n})((typeof self !== 'undefined' ? self : this), function() {\nreturn ","// The require scope\nvar __webpack_require__ = {};\n\n","// define getter functions for harmony exports\n__webpack_require__.d = function(exports, definition) {\n\tfor(var key in definition) {\n\t\tif(__webpack_require__.o(definition, key) && !__webpack_require__.o(exports, key)) {\n\t\t\tObject.defineProperty(exports, key, { enumerable: true, get: definition[key] });\n\t\t}\n\t}\n};","__webpack_require__.o = function(obj, prop) { return Object.prototype.hasOwnProperty.call(obj, prop); }","// define __esModule on exports\n__webpack_require__.r = function(exports) {\n\tif(typeof Symbol !== 'undefined' && Symbol.toStringTag) {\n\t\tObject.defineProperty(exports, Symbol.toStringTag, { value: 'Module' });\n\t}\n\tObject.defineProperty(exports, '__esModule', { value: true });\n};","__webpack_require__.p = \"\";","/* eslint-disable no-var */\n// This file is imported into lib/wc client bundles.\n\nif (typeof window !== 'undefined') {\n var currentScript = window.document.currentScript\n if (process.env.NEED_CURRENTSCRIPT_POLYFILL) {\n var getCurrentScript = require('@soda/get-current-script')\n currentScript = getCurrentScript()\n\n // for backward compatibility, because previously we directly included the polyfill\n if (!('currentScript' in document)) {\n Object.defineProperty(document, 'currentScript', { get: getCurrentScript })\n }\n }\n\n var src = currentScript && currentScript.src.match(/(.+\\/)[^/]+\\.js(\\?.*)?$/)\n if (src) {\n __webpack_public_path__ = src[1] // eslint-disable-line\n }\n}\n\n// Indicate to webpack that this file can be concatenated\nexport default null\n","var render = function render(){var _vm=this,_c=_vm._self._c;return _c('div',{staticClass:\"photo-album-container\",style:({ transform: `scale(${_vm.zoomScale}) translate(${_vm.translateX}px, ${_vm.translateY}px)` }),on:{\"touchstart\":_vm.onContainerTouchStart,\"touchmove\":_vm.onContainerTouchMove,\"touchend\":_vm.onContainerTouchEnd,\"dblclick\":_vm.onContainerDoubleClick,\"click\":_vm.onContentClick}},[(false)?_c('div',{staticClass:\"album-header\"},[_c('h1',[_vm._v(\"氪氪\")])]):_vm._e(),(_vm.contentReady)?_c('div',{staticClass:\"flipbook-wrapper\",on:{\"dblclick\":_vm.onFlipbookDoubleClick,\"!touchstart\":function($event){return _vm.onFlipbookTouchStart.apply(null, arguments)},\"!touchend\":function($event){return _vm.onFlipbookTouchEnd.apply(null, arguments)}}},[(_vm.flipMode === 'flip' && _vm.flag)?_c('flipbook',{ref:\"flipbook\",class:['flipbook', _vm.isMobile ? 'mobile-mode mobile-optimized' : 'desktop-mode desktop-optimized'],attrs:{\"pages\":_vm.pages,\"pagesHiRes\":_vm.pagesHiRes,\"startPage\":_vm.startPage,\"zooms\":null,\"ambient-light\":0.6,\"gloss\":0.4,\"single-page\":_vm.isMobile,\"click-to-flip\":false,\"wheel-to-flip\":!_vm.isMobile,\"swipe-to-flip\":true,\"center-pages\":true},on:{\"flip-left-end\":_vm.onFlipLeftEnd,\"flip-right-end\":_vm.onFlipRightEnd},scopedSlots:_vm._u([{key:\"default\",fn:function({ page, canFlipLeft, canFlipRight }){return undefined}}],null,false,2449366912)}):(_vm.flipMode === 'slide')?_c('div',{ref:\"slideViewer\",class:['slide-viewer', _vm.isMobile ? 'mobile-mode mobile-optimized' : 'desktop-mode desktop-optimized'],on:{\"touchstart\":_vm.onSlideViewerTouchStart,\"touchmove\":_vm.onSlideViewerTouchMove,\"touchend\":_vm.onSlideViewerTouchEnd}},[_c('div',{staticClass:\"slide-container\",style:(_vm.slideContainerStyle)},_vm._l((_vm.pages),function(page,index){return _c('div',{key:index,staticClass:\"slide-page\",class:{ 'slide-page-active': index + 1 === _vm.currentPage }},[(page)?_c('img',{staticClass:\"slide-page-image\",attrs:{\"src\":page,\"alt\":\"\"}}):_c('div',{staticClass:\"slide-page-placeholder\"},[_vm._v(\"封面/封底\")])])}),0)]):(_vm.flipMode === 'fade')?_c('div',{ref:\"fadeViewer\",class:['fade-viewer', _vm.isMobile ? 'mobile-mode mobile-optimized' : 'desktop-mode desktop-optimized']},[_c('transition',{attrs:{\"name\":\"fade-page\",\"mode\":\"out-in\"}},[_c('div',{key:_vm.currentPage,staticClass:\"fade-page-container\"},[(_vm.pages[_vm.currentPage - 1])?_c('img',{staticClass:\"fade-page-image\",attrs:{\"src\":_vm.pages[_vm.currentPage - 1],\"alt\":\"\"}}):_c('div',{staticClass:\"fade-page-placeholder\"},[_vm._v(\"封面/封底\")])])])],1):(_vm.flipMode === 'scroll')?_c('div',{ref:\"scrollViewer\",class:['scroll-viewer', _vm.isMobile ? 'mobile-mode mobile-optimized' : 'desktop-mode desktop-optimized'],on:{\"scroll\":_vm.onScrollViewerScroll}},[_c('div',{staticClass:\"scroll-container\"},_vm._l((_vm.pages),function(page,index){return _c('div',{key:index,ref:'scrollPage' + index,refInFor:true,staticClass:\"scroll-page\"},[(page)?_c('img',{staticClass:\"scroll-page-image\",attrs:{\"src\":page,\"alt\":\"\"}}):_c('div',{staticClass:\"scroll-page-placeholder\"},[_vm._v(\"封面/封底\")])])}),0)]):(_vm.flipMode === 'clip')?_c('div',{ref:\"clipViewer\",class:['clip-viewer', _vm.isMobile ? 'mobile-mode mobile-optimized' : 'desktop-mode desktop-optimized']},[_c('div',{staticClass:\"clip-pages-wrapper\"},[_c('transition',{attrs:{\"name\":\"clip-current\"}},[_c('div',{key:'current-' + _vm.currentPage,staticClass:\"clip-page clip-page-current\"},[(_vm.pages[_vm.currentPage - 1])?_c('img',{staticClass:\"clip-page-image\",attrs:{\"src\":_vm.pages[_vm.currentPage - 1],\"alt\":\"\"}}):_c('div',{staticClass:\"clip-page-placeholder\"},[_vm._v(\"封面/封底\")])])]),(_vm.currentPage < _vm.totalPages)?_c('div',{staticClass:\"clip-page clip-page-next\"},[(_vm.pages[_vm.currentPage])?_c('img',{staticClass:\"clip-page-image\",attrs:{\"src\":_vm.pages[_vm.currentPage],\"alt\":\"\"}}):_c('div',{staticClass:\"clip-page-placeholder\"},[_vm._v(\"封面/封底\")])]):_vm._e()],1)]):(_vm.flipMode === 'card')?_c('div',{ref:\"cardViewer\",class:['card-viewer', _vm.isMobile ? 'mobile-mode mobile-optimized' : 'desktop-mode desktop-optimized']},[_c('div',{staticClass:\"card-stack\"},[_c('transition-group',{staticClass:\"card-transition-group\",attrs:{\"name\":\"card-flip\",\"tag\":\"div\"}},_vm._l((_vm.visibleCards),function(page,index){return _c('div',{key:'card-' + page.originalIndex,staticClass:\"card-item\",class:{\n 'card-item-prev': page.position === 'prev',\n 'card-item-current': page.position === 'current',\n 'card-item-next': page.position === 'next'\n },style:(_vm.getCardStyle(page.position))},[_c('div',{staticClass:\"card-content\"},[(page.src)?_c('img',{staticClass:\"card-image\",attrs:{\"src\":page.src,\"alt\":\"\"}}):_c('div',{staticClass:\"card-placeholder\"},[_vm._v(\"封面/封底\")])]),_c('div',{staticClass:\"card-page-number\"},[_vm._v(_vm._s(page.originalIndex + 1)+\" / \"+_vm._s(_vm.totalPages))])])}),0)],1)]):_vm._e()],1):_vm._e(),_c('div',{staticClass:\"controls\",class:{ 'mobile-controls': _vm.isMobile, 'desktop-controls': !_vm.isMobile, 'controls-visible': _vm.showControls },on:{\"click\":function($event){$event.stopPropagation();}}},[_c('button',{staticClass:\"btn btn-prev\",on:{\"click\":_vm.flipLeft}},[_vm._v(\" ← 上一页 \")]),_c('span',{staticClass:\"page-indicator\"},[(_vm.totalPages === 0)?_c('span',[_vm._v(\"加载中...\")]):(_vm.currentPage === 1 && _vm.totalPages > 1)?_c('span',[_vm._v(\"封面\")]):(_vm.currentPage === _vm.totalPages && _vm.totalPages > 1)?_c('span',[_vm._v(\"封底\")]):(!_vm.isMobile && _vm.totalPages > 2)?_c('span',[_vm._v(\"第 \"+_vm._s(Math.ceil((_vm.currentPage - 1) / 2))+\" 组 / 共 \"+_vm._s(Math.ceil((_vm.totalPages - 2) / 2))+\" 组\")]):(_vm.isMobile && _vm.totalPages > 2)?_c('span',[_vm._v(\"第 \"+_vm._s(Math.max(1, _vm.currentPage ))+\" 页 / 共 \"+_vm._s(Math.max(0, _vm.totalPages - 2))+\" 页\")]):(_vm.totalPages === 1)?_c('span',[_vm._v(\"第 1 页 / 共 1 页\")]):_c('span',[_vm._v(\"第 \"+_vm._s(_vm.currentPage)+\" 页 / 共 \"+_vm._s(_vm.totalPages)+\" 页\")])]),_c('button',{staticClass:\"btn btn-next\",on:{\"click\":_vm.flipRight}},[_vm._v(\" 下一页 → \")])]),(_vm.showFlipModeSelector)?_c('div',{staticClass:\"flip-mode-selector\",class:{ 'mobile-flip-mode-selector': _vm.isMobile }},[_c('button',{staticClass:\"btn btn-flip-mode\",on:{\"click\":_vm.toggleFlipModeMenu}},[_c('span',{staticClass:\"flip-mode-icon\"},[_vm._v(_vm._s(_vm.flipModeIcon))]),_c('span',{staticClass:\"flip-mode-text\"},[_vm._v(_vm._s(_vm.flipModeLabel))])]),(_vm.showFlipModeMenu)?_c('div',{staticClass:\"flip-mode-menu\"},_vm._l((_vm.flipModes),function(mode){return _c('div',{key:mode.value,staticClass:\"flip-mode-item\",class:{ 'flip-mode-item-active': _vm.flipMode === mode.value },on:{\"click\":function($event){return _vm.selectFlipMode(mode.value)}}},[_c('span',{staticClass:\"flip-mode-item-icon\"},[_vm._v(_vm._s(mode.icon))]),_c('span',{staticClass:\"flip-mode-item-label\"},[_vm._v(_vm._s(mode.label))])])}),0):_vm._e()]):_vm._e(),_c('div',{staticClass:\"catalogue-button\",class:{\n 'mobile-catalogue-button': _vm.isMobile,\n 'dragging': _vm.catalogueButtonDragging,\n 'catalogue-visible': _vm.showControls\n },style:({\n left: _vm.catalogueButtonPosition.x + 'px',\n top: _vm.catalogueButtonPosition.y + 'px'\n }),on:{\"mousedown\":_vm.onCatalogueMouseDown,\"touchstart\":_vm.onCatalogueTouchStart,\"touchmove\":_vm.onCatalogueTouchMove,\"touchend\":_vm.onCatalogueTouchEnd,\"click\":function($event){$event.stopPropagation();}}},[_c('button',{staticClass:\"btn btn-catalogue\",on:{\"click\":_vm.openCatalogue}},[_c('span',{staticClass:\"catalogue-text\"},[_vm._v(\"目录\")])])]),_c('div',{staticClass:\"zoom-hint\",class:{ 'show': _vm.zoomScale !== 1 }},[_c('div',{staticClass:\"zoom-info\"},[_c('span',[_vm._v(\"缩放: \"+_vm._s(Math.round(_vm.zoomScale * 100))+\"%\")]),_c('button',{staticClass:\"btn-reset-zoom\",on:{\"click\":_vm.resetZoom}},[_vm._v(\"重置\")])])]),(!_vm.isMobile)?_c('div',{staticClass:\"zoom-toolbar\"},[_c('button',{staticClass:\"btn-zoom\",attrs:{\"disabled\":_vm.zoomScale <= 0.5},on:{\"click\":_vm.zoomOut}},[_vm._v(\"-\")]),_c('button',{staticClass:\"btn-zoom\",attrs:{\"disabled\":_vm.zoomScale >= 3},on:{\"click\":_vm.zoomIn}},[_vm._v(\"+\")])]):_vm._e(),(_vm.loading)?_c('div',{staticClass:\"loading-overlay\"},[_vm._m(0)]):_vm._e(),(_vm.error && !_vm.loading)?_c('div',{staticClass:\"error-container\"},[_c('div',{staticClass:\"error-content\"},[_c('div',{staticClass:\"error-icon\"},[_vm._v(\"⚠️\")]),_c('h3',[_vm._v(\"加载失败\")]),_c('p',[_vm._v(_vm._s(_vm.error.message || '网络连接异常,请检查网络后重试'))]),_c('button',{staticClass:\"retry-btn\",on:{\"click\":_vm.fetchBooksData}},[_c('span',{staticClass:\"retry-icon\"},[_vm._v(\"🔄\")]),_vm._v(\" 重新加载 \")])])]):_vm._e(),(_vm.booksData && !_vm.loading && !_vm.error)?_c('div',{staticClass:\"success-toast\",class:{ 'show': _vm.showSuccessToast }},[_vm._v(\" 书籍加载完成 \")]):_vm._e(),_c('book-catalogue-drawer',{attrs:{\"book-id\":_vm.bookId,\"catalogue\":_vm.catalogue,\"loading\":_vm.catalogueLoading},on:{\"catalogue-click\":_vm.onCatalogueClick,\"page-jump\":_vm.onPageJump,\"Focus\":_vm.onFocus,\"fetch-catalogue\":_vm.onFetchCatalogue},model:{value:(_vm.showCatalogueDrawer),callback:function ($$v) {_vm.showCatalogueDrawer=$$v},expression:\"showCatalogueDrawer\"}})],1)\n}\nvar staticRenderFns = [function (){var _vm=this,_c=_vm._self._c;return _c('div',{staticClass:\"loading-container\"},[_c('div',{staticClass:\"loading-spinner\"},[_c('div',{staticClass:\"spinner-ring\"}),_c('div',{staticClass:\"spinner-ring\"}),_c('div',{staticClass:\"spinner-ring\"})]),_c('div',{staticClass:\"loading-text\"},[_c('h3',[_vm._v(\"正在加载书籍\")]),_c('p',[_vm._v(\"请稍候,正在获取精彩内容...\")]),_c('div',{staticClass:\"loading-progress\"},[_c('div',{staticClass:\"progress-bar\"})])])])\n}]\n\nexport { render, staticRenderFns }","/*! @license Rematrix v0.7.2\n\n\tCopyright 2021 Julian Lloyd.\n\n\tPermission is hereby granted, free of charge, to any person obtaining a copy\n\tof this software and associated documentation files (the \"Software\"), to deal\n\tin the Software without restriction, including without limitation the rights\n\tto use, copy, modify, merge, publish, distribute, sublicense, and/or sell\n\tcopies of the Software, and to permit persons to whom the Software is\n\tfurnished to do so, subject to the following conditions:\n\n\tThe above copyright notice and this permission notice shall be included in\n\tall copies or substantial portions of the Software.\n\n\tTHE SOFTWARE IS PROVIDED \"AS IS\", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR\n\tIMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,\n\tFITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE\n\tAUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER\n\tLIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,\n\tOUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN\n\tTHE SOFTWARE.\n*/\nfunction format(source) {\n if (source && source.constructor === Array) {\n var values = source\n .filter(function (value) { return typeof value === 'number'; })\n .filter(function (value) { return !isNaN(value); });\n\n if (source.length === 6 && values.length === 6) {\n var matrix = identity();\n matrix[0] = values[0];\n matrix[1] = values[1];\n matrix[4] = values[2];\n matrix[5] = values[3];\n matrix[12] = values[4];\n matrix[13] = values[5];\n return matrix\n } else if (source.length === 16 && values.length === 16) {\n return source\n }\n }\n throw new TypeError('Expected a `number[]` with length 6 or 16.')\n}\n\nfunction fromString(source) {\n if (typeof source === 'string') {\n var match = source.match(/matrix(3d)?\\(([^)]+)\\)/);\n if (match) {\n var raw = match[2].split(',').map(parseFloat);\n return format(raw)\n }\n if (source === 'none' || source === '') {\n return identity()\n }\n }\n throw new TypeError('Expected a string containing `matrix()` or `matrix3d()')\n}\n\nfunction identity() {\n var matrix = [];\n for (var i = 0; i < 16; i++) {\n i % 5 == 0 ? matrix.push(1) : matrix.push(0);\n }\n return matrix\n}\n\nfunction inverse(source) {\n var m = format(source);\n\n var s0 = m[0] * m[5] - m[4] * m[1];\n var s1 = m[0] * m[6] - m[4] * m[2];\n var s2 = m[0] * m[7] - m[4] * m[3];\n var s3 = m[1] * m[6] - m[5] * m[2];\n var s4 = m[1] * m[7] - m[5] * m[3];\n var s5 = m[2] * m[7] - m[6] * m[3];\n\n var c5 = m[10] * m[15] - m[14] * m[11];\n var c4 = m[9] * m[15] - m[13] * m[11];\n var c3 = m[9] * m[14] - m[13] * m[10];\n var c2 = m[8] * m[15] - m[12] * m[11];\n var c1 = m[8] * m[14] - m[12] * m[10];\n var c0 = m[8] * m[13] - m[12] * m[9];\n\n var determinant = 1 / (s0 * c5 - s1 * c4 + s2 * c3 + s3 * c2 - s4 * c1 + s5 * c0);\n\n if (isNaN(determinant) || determinant === Infinity) {\n throw new Error('Inverse determinant attempted to divide by zero.')\n }\n\n return [\n (m[5] * c5 - m[6] * c4 + m[7] * c3) * determinant,\n (-m[1] * c5 + m[2] * c4 - m[3] * c3) * determinant,\n (m[13] * s5 - m[14] * s4 + m[15] * s3) * determinant,\n (-m[9] * s5 + m[10] * s4 - m[11] * s3) * determinant,\n\n (-m[4] * c5 + m[6] * c2 - m[7] * c1) * determinant,\n (m[0] * c5 - m[2] * c2 + m[3] * c1) * determinant,\n (-m[12] * s5 + m[14] * s2 - m[15] * s1) * determinant,\n (m[8] * s5 - m[10] * s2 + m[11] * s1) * determinant,\n\n (m[4] * c4 - m[5] * c2 + m[7] * c0) * determinant,\n (-m[0] * c4 + m[1] * c2 - m[3] * c0) * determinant,\n (m[12] * s4 - m[13] * s2 + m[15] * s0) * determinant,\n (-m[8] * s4 + m[9] * s2 - m[11] * s0) * determinant,\n\n (-m[4] * c3 + m[5] * c1 - m[6] * c0) * determinant,\n (m[0] * c3 - m[1] * c1 + m[2] * c0) * determinant,\n (-m[12] * s3 + m[13] * s1 - m[14] * s0) * determinant,\n (m[8] * s3 - m[9] * s1 + m[10] * s0) * determinant ]\n}\n\nfunction multiply(matrixA, matrixB) {\n var fma = format(matrixA);\n var fmb = format(matrixB);\n var product = [];\n\n for (var i = 0; i < 4; i++) {\n var row = [fma[i], fma[i + 4], fma[i + 8], fma[i + 12]];\n for (var j = 0; j < 4; j++) {\n var k = j * 4;\n var col = [fmb[k], fmb[k + 1], fmb[k + 2], fmb[k + 3]];\n var result = row[0] * col[0] + row[1] * col[1] + row[2] * col[2] + row[3] * col[3];\n\n product[i + k] = result;\n }\n }\n\n return product\n}\n\nfunction perspective(distance) {\n var matrix = identity();\n matrix[11] = -1 / distance;\n return matrix\n}\n\nfunction rotate(angle) {\n return rotateZ(angle)\n}\n\nfunction rotateX(angle) {\n var theta = (Math.PI / 180) * angle;\n var matrix = identity();\n\n matrix[5] = matrix[10] = Math.cos(theta);\n matrix[6] = matrix[9] = Math.sin(theta);\n matrix[9] *= -1;\n\n return matrix\n}\n\nfunction rotateY(angle) {\n var theta = (Math.PI / 180) * angle;\n var matrix = identity();\n\n matrix[0] = matrix[10] = Math.cos(theta);\n matrix[2] = matrix[8] = Math.sin(theta);\n matrix[2] *= -1;\n\n return matrix\n}\n\nfunction rotateZ(angle) {\n var theta = (Math.PI / 180) * angle;\n var matrix = identity();\n\n matrix[0] = matrix[5] = Math.cos(theta);\n matrix[1] = matrix[4] = Math.sin(theta);\n matrix[4] *= -1;\n\n return matrix\n}\n\nfunction scale(scalar, scalarY) {\n var matrix = identity();\n\n matrix[0] = scalar;\n matrix[5] = typeof scalarY === 'number' ? scalarY : scalar;\n\n return matrix\n}\n\nfunction scaleX(scalar) {\n var matrix = identity();\n matrix[0] = scalar;\n return matrix\n}\n\nfunction scaleY(scalar) {\n var matrix = identity();\n matrix[5] = scalar;\n return matrix\n}\n\nfunction scaleZ(scalar) {\n var matrix = identity();\n matrix[10] = scalar;\n return matrix\n}\n\nfunction skew(angleX, angleY) {\n var thetaX = (Math.PI / 180) * angleX;\n var matrix = identity();\n\n matrix[4] = Math.tan(thetaX);\n\n if (angleY) {\n var thetaY = (Math.PI / 180) * angleY;\n matrix[1] = Math.tan(thetaY);\n }\n\n return matrix\n}\n\nfunction skewX(angle) {\n var theta = (Math.PI / 180) * angle;\n var matrix = identity();\n\n matrix[4] = Math.tan(theta);\n\n return matrix\n}\n\nfunction skewY(angle) {\n var theta = (Math.PI / 180) * angle;\n var matrix = identity();\n\n matrix[1] = Math.tan(theta);\n\n return matrix\n}\n\nfunction toString(source) {\n return (\"matrix3d(\" + (format(source).join(', ')) + \")\")\n}\n\nfunction translate(distanceX, distanceY) {\n var matrix = identity();\n matrix[12] = distanceX;\n\n if (distanceY) {\n matrix[13] = distanceY;\n }\n\n return matrix\n}\n\nfunction translate3d(distanceX, distanceY, distanceZ) {\n var matrix = identity();\n if (distanceX !== undefined && distanceY !== undefined && distanceZ !== undefined) {\n matrix[12] = distanceX;\n matrix[13] = distanceY;\n matrix[14] = distanceZ;\n }\n return matrix\n}\n\nfunction translateX(distance) {\n var matrix = identity();\n matrix[12] = distance;\n return matrix\n}\n\nfunction translateY(distance) {\n var matrix = identity();\n matrix[13] = distance;\n return matrix\n}\n\nfunction translateZ(distance) {\n var matrix = identity();\n matrix[14] = distance;\n return matrix\n}\n\nexport { format, fromString, identity, inverse, multiply, perspective, rotate, rotateX, rotateY, rotateZ, scale, scaleX, scaleY, scaleZ, skew, skewX, skewY, toString, translate, translate3d, translateX, translateY, translateZ };\n","/*!\n * @license\n * flipbook-vue v1.0.0-beta.4\n * Copyright © 2023 Takeshi Sone.\n * Released under the MIT License.\n */\n\nimport { multiply, perspective, translate, translate3d, rotateY, toString, identity } from 'rematrix';\n\nvar Matrix = /*@__PURE__*/(function () {\n function Matrix(arg) {\n if (arg) {\n if (arg.m) {\n this.m = [].concat( arg.m );\n } else {\n this.m = [].concat( arg );\n }\n } else {\n this.m = identity();\n }\n }\n\n Matrix.prototype.clone = function clone () {\n return new Matrix(this);\n };\n\n Matrix.prototype.multiply = function multiply$1 (m) {\n return this.m = multiply(this.m, m);\n };\n\n Matrix.prototype.perspective = function perspective$1 (d) {\n return this.multiply(perspective(d));\n };\n\n Matrix.prototype.transformX = function transformX (x) {\n return (x * this.m[0] + this.m[12]) / (x * this.m[3] + this.m[15]);\n };\n\n Matrix.prototype.translate = function translate$1 (x, y) {\n return this.multiply(translate(x, y));\n };\n\n Matrix.prototype.translate3d = function translate3d$1 (x, y, z) {\n return this.multiply(translate3d(x, y, z));\n };\n\n Matrix.prototype.rotateY = function rotateY$1 (deg) {\n return this.multiply(rotateY(deg));\n };\n\n Matrix.prototype.toString = function toString$1 () {\n return toString(this.m);\n };\n\n return Matrix;\n}());\n\nvar spinner = \"data:image/svg+xml,%3C%3Fxml%20version%3D%221.0%22%3F%3E%3Csvg%20xmlns%3D%22http%3A%2F%2Fwww.w3.org%2F2000%2Fsvg%22%20width%3D%22500%22%20height%3D%22500%22%20viewBox%3D%220%200%20500%20500%22%20fill%3D%22transparent%22%20style%3D%22background-color%3A%20%23fff%22%3E%20%20%3Ccircle%20%20%20%20cx%3D%22250%22%20%20%20%20cy%3D%22250%22%20%20%20%20r%3D%2248%22%20%20%20%20stroke%3D%22%23333%22%20%20%20%20stroke-width%3D%222%22%20%20%20%20stroke-dasharray%3D%22271%2030%22%20%20%3E%20%20%20%20%3CanimateTransform%20%20%20%20%20%20attributeName%3D%22transform%22%20%20%20%20%20%20attributeType%3D%22XML%22%20%20%20%20%20%20type%3D%22rotate%22%20%20%20%20%20%20from%3D%220%20250%20250%22%20%20%20%20%20%20to%3D%22360%20250%20250%22%20%20%20%20%20%20dur%3D%221s%22%20%20%20%20%20%20repeatCount%3D%22indefinite%22%20%20%20%20%2F%3E%20%20%3C%2Fcircle%3E%3C%2Fsvg%3E\";\n\nvar easeIn, easeInOut, easeOut;\n\neaseIn = function(x) {\n return Math.pow(x, 2);\n};\n\neaseOut = function(x) {\n return 1 - easeIn(1 - x);\n};\n\neaseInOut = function(x) {\n if (x < 0.5) {\n return easeIn(x * 2) / 2;\n } else {\n return 0.5 + easeOut((x - 0.5) * 2) / 2;\n }\n};\n\nvar script = {\n props: {\n pages: {\n type: Array,\n required: true\n },\n pagesHiRes: {\n type: Array,\n default: function() {\n return [];\n }\n },\n flipDuration: {\n type: Number,\n default: 1000\n },\n zoomDuration: {\n type: Number,\n default: 500\n },\n zooms: {\n type: Array,\n default: function() {\n return [1, 2, 4];\n }\n },\n perspective: {\n type: Number,\n default: 2400\n },\n nPolygons: {\n type: Number,\n default: 10\n },\n ambient: {\n type: Number,\n default: 0.4\n },\n gloss: {\n type: Number,\n default: 0.6\n },\n swipeMin: {\n type: Number,\n default: 3\n },\n singlePage: {\n type: Boolean,\n default: false\n },\n forwardDirection: {\n validator: function(val) {\n return val === 'right' || val === 'left';\n },\n default: 'right'\n },\n centering: {\n type: Boolean,\n default: true\n },\n startPage: {\n type: Number,\n default: null\n },\n loadingImage: {\n type: String,\n default: spinner\n },\n clickToZoom: {\n type: Boolean,\n default: true\n },\n dragToFlip: {\n type: Boolean,\n default: true\n },\n wheel: {\n type: String,\n default: 'scroll'\n }\n },\n data: function() {\n return {\n viewWidth: 0,\n viewHeight: 0,\n imageWidth: null,\n imageHeight: null,\n displayedPages: 1,\n nImageLoad: 0,\n nImageLoadTrigger: 0,\n imageLoadCallback: null,\n currentPage: 0,\n firstPage: 0,\n secondPage: 1,\n zoomIndex: 0,\n zoom: 1,\n zooming: false,\n touchStartX: null,\n touchStartY: null,\n maxMove: 0,\n activeCursor: null,\n hasTouchEvents: false,\n hasPointerEvents: false,\n minX: 2e308,\n maxX: -2e308,\n preloadedImages: {},\n flip: {\n progress: 0,\n direction: null,\n frontImage: null,\n backImage: null,\n auto: false,\n opacity: 1\n },\n currentCenterOffset: null,\n animatingCenter: false,\n startScrollLeft: 0,\n startScrollTop: 0,\n scrollLeft: 0,\n scrollTop: 0,\n loadedImages: {}\n };\n },\n computed: {\n IE: function() {\n return typeof navigator !== 'undefined' && /Trident/.test(navigator.userAgent);\n },\n canFlipLeft: function() {\n if (this.forwardDirection === 'left') {\n return this.canGoForward;\n } else {\n return this.canGoBack;\n }\n },\n canFlipRight: function() {\n if (this.forwardDirection === 'right') {\n return this.canGoForward;\n } else {\n return this.canGoBack;\n }\n },\n canZoomIn: function() {\n return !this.zooming && this.zoomIndex < this.zooms_.length - 1;\n },\n canZoomOut: function() {\n return !this.zooming && this.zoomIndex > 0;\n },\n numPages: function() {\n if (this.pages[0] === null) {\n return this.pages.length - 1;\n } else {\n return this.pages.length;\n }\n },\n page: function() {\n if (this.pages[0] !== null) {\n return this.currentPage + 1;\n } else {\n return Math.max(1, this.currentPage);\n }\n },\n zooms_: function() {\n return this.zooms || [1];\n },\n canGoForward: function() {\n return !this.flip.direction && this.currentPage < this.pages.length - this.displayedPages;\n },\n canGoBack: function() {\n return !this.flip.direction && this.currentPage >= this.displayedPages && !(this.displayedPages === 1 && !this.pageUrl(this.firstPage - 1));\n },\n leftPage: function() {\n if (this.forwardDirection === 'right' || this.displayedPages === 1) {\n return this.firstPage;\n } else {\n return this.secondPage;\n }\n },\n rightPage: function() {\n if (this.forwardDirection === 'left') {\n return this.firstPage;\n } else {\n return this.secondPage;\n }\n },\n showLeftPage: function() {\n return this.pageUrl(this.leftPage);\n },\n showRightPage: function() {\n return this.pageUrl(this.rightPage) && this.displayedPages === 2;\n },\n cursor: function() {\n if (this.activeCursor) {\n return this.activeCursor;\n } else if (this.IE) {\n return 'auto';\n } else if (this.clickToZoom && this.canZoomIn) {\n return 'zoom-in';\n } else if (this.clickToZoom && this.canZoomOut) {\n return 'zoom-out';\n } else if (this.dragToFlip) {\n return 'grab';\n } else {\n return 'auto';\n }\n },\n pageScale: function() {\n var scale, vw, xScale, yScale;\n vw = this.viewWidth / this.displayedPages;\n xScale = vw / this.imageWidth;\n yScale = this.viewHeight / this.imageHeight;\n scale = xScale < yScale ? xScale : yScale;\n if (scale < 1) {\n return scale;\n } else {\n return 1;\n }\n },\n pageWidth: function() {\n return Math.round(this.imageWidth * this.pageScale);\n },\n pageHeight: function() {\n return Math.round(this.imageHeight * this.pageScale);\n },\n xMargin: function() {\n return (this.viewWidth - this.pageWidth * this.displayedPages) / 2;\n },\n yMargin: function() {\n return (this.viewHeight - this.pageHeight) / 2;\n },\n polygonWidth: function() {\n var w;\n w = this.pageWidth / this.nPolygons;\n w = Math.ceil(w + 1 / this.zoom);\n return w + 'px';\n },\n polygonHeight: function() {\n return this.pageHeight + 'px';\n },\n polygonBgSize: function() {\n return ((this.pageWidth) + \"px \" + (this.pageHeight) + \"px\");\n },\n polygonArray: function() {\n return this.makePolygonArray('front').concat(this.makePolygonArray('back'));\n },\n boundingLeft: function() {\n var x;\n if (this.displayedPages === 1) {\n return this.xMargin;\n } else {\n x = this.pageUrl(this.leftPage) ? this.xMargin : this.viewWidth / 2;\n if (x < this.minX) {\n return x;\n } else {\n return this.minX;\n }\n }\n },\n boundingRight: function() {\n var x;\n if (this.displayedPages === 1) {\n return this.viewWidth - this.xMargin;\n } else {\n x = this.pageUrl(this.rightPage) ? this.viewWidth - this.xMargin : this.viewWidth / 2;\n if (x > this.maxX) {\n return x;\n } else {\n return this.maxX;\n }\n }\n },\n centerOffset: function() {\n var retval;\n retval = this.centering ? Math.round(this.viewWidth / 2 - (this.boundingLeft + this.boundingRight) / 2) : 0;\n if (this.currentCenterOffset === null && this.imageWidth !== null) {\n this.currentCenterOffset = retval;\n }\n return retval;\n },\n centerOffsetSmoothed: function() {\n return Math.round(this.currentCenterOffset);\n },\n dragToScroll: function() {\n return !this.hasTouchEvents;\n },\n scrollLeftMin: function() {\n var w;\n w = (this.boundingRight - this.boundingLeft) * this.zoom;\n if (w < this.viewWidth) {\n return (this.boundingLeft + this.centerOffsetSmoothed) * this.zoom - (this.viewWidth - w) / 2;\n } else {\n return (this.boundingLeft + this.centerOffsetSmoothed) * this.zoom;\n }\n },\n scrollLeftMax: function() {\n var w;\n w = (this.boundingRight - this.boundingLeft) * this.zoom;\n if (w < this.viewWidth) {\n return (this.boundingLeft + this.centerOffsetSmoothed) * this.zoom - (this.viewWidth - w) / 2;\n } else {\n return (this.boundingRight + this.centerOffsetSmoothed) * this.zoom - this.viewWidth;\n }\n },\n scrollTopMin: function() {\n var h;\n h = this.pageHeight * this.zoom;\n if (h < this.viewHeight) {\n return this.yMargin * this.zoom - (this.viewHeight - h) / 2;\n } else {\n return this.yMargin * this.zoom;\n }\n },\n scrollTopMax: function() {\n var h;\n h = this.pageHeight * this.zoom;\n if (h < this.viewHeight) {\n return this.yMargin * this.zoom - (this.viewHeight - h) / 2;\n } else {\n return (this.yMargin + this.pageHeight) * this.zoom - this.viewHeight;\n }\n },\n scrollLeftLimited: function() {\n return Math.min(this.scrollLeftMax, Math.max(this.scrollLeftMin, this.scrollLeft));\n },\n scrollTopLimited: function() {\n return Math.min(this.scrollTopMax, Math.max(this.scrollTopMin, this.scrollTop));\n }\n },\n mounted: function() {\n window.addEventListener('resize', this.onResize, {\n passive: true\n });\n this.onResize();\n this.zoom = this.zooms_[0];\n return this.goToPage(this.startPage);\n },\n beforeDestroy: function() {\n return window.removeEventListener('resize', this.onResize, {\n passive: true\n });\n },\n methods: {\n onResize: function() {\n var viewport;\n viewport = this.$refs.viewport;\n if (!viewport) {\n return;\n }\n this.viewWidth = viewport.clientWidth;\n this.viewHeight = viewport.clientHeight;\n this.displayedPages = this.viewWidth > this.viewHeight && !this.singlePage ? 2 : 1;\n if (this.displayedPages === 2) {\n this.currentPage &= ~1;\n }\n this.fixFirstPage();\n this.minX = 2e308;\n return this.maxX = -2e308;\n },\n fixFirstPage: function() {\n if (this.displayedPages === 1 && this.currentPage === 0 && this.pages.length && !this.pageUrl(0)) {\n return this.currentPage++;\n }\n },\n pageUrl: function(page, hiRes) {\n if ( hiRes === void 0 ) hiRes = false;\n\n var url;\n if (hiRes && this.zoom > 1 && !this.zooming) {\n url = this.pagesHiRes[page];\n if (url) {\n return url;\n }\n }\n return this.pages[page] || null;\n },\n pageUrlLoading: function(page, hiRes) {\n if ( hiRes === void 0 ) hiRes = false;\n\n var url;\n url = this.pageUrl(page, hiRes);\n if (hiRes && this.zoom > 1 && !this.zooming) {\n // High-res image doesn't use 'loading'\n return url;\n }\n return url && this.loadImage(url);\n },\n flipLeft: function() {\n if (!this.canFlipLeft) {\n return;\n }\n return this.flipStart('left', true);\n },\n flipRight: function() {\n if (!this.canFlipRight) {\n return;\n }\n return this.flipStart('right', true);\n },\n makePolygonArray: function(face) {\n var bgPos, dRadian, dRotate, direction, i, image, j, lighting, m, originRight, pageMatrix, pageRotation, pageX, polygonWidth, progress, rad, radian, radius, ref, results, rotate, theta, x, x0, x1, z;\n if (!this.flip.direction) {\n return [];\n }\n progress = this.flip.progress;\n direction = this.flip.direction;\n if (this.displayedPages === 1 && direction !== this.forwardDirection) {\n progress = 1 - progress;\n direction = this.forwardDirection;\n }\n this.flip.opacity = this.displayedPages === 1 && progress > .7 ? 1 - (progress - .7) / .3 : 1;\n image = face === 'front' ? this.flip.frontImage : this.flip.backImage;\n polygonWidth = this.pageWidth / this.nPolygons;\n pageX = this.xMargin;\n originRight = false;\n if (this.displayedPages === 1) {\n if (this.forwardDirection === 'right') {\n if (face === 'back') {\n originRight = true;\n pageX = this.xMargin - this.pageWidth;\n }\n } else {\n if (direction === 'left') {\n if (face === 'back') {\n pageX = this.pageWidth - this.xMargin;\n } else {\n originRight = true;\n }\n } else {\n if (face === 'front') {\n pageX = this.pageWidth - this.xMargin;\n } else {\n originRight = true;\n }\n }\n }\n } else {\n if (direction === 'left') {\n if (face === 'back') {\n pageX = this.viewWidth / 2;\n } else {\n originRight = true;\n }\n } else {\n if (face === 'front') {\n pageX = this.viewWidth / 2;\n } else {\n originRight = true;\n }\n }\n }\n pageMatrix = new Matrix();\n pageMatrix.translate(this.viewWidth / 2);\n pageMatrix.perspective(this.perspective);\n pageMatrix.translate(-this.viewWidth / 2);\n pageMatrix.translate(pageX, this.yMargin);\n pageRotation = 0;\n if (progress > 0.5) {\n pageRotation = -(progress - 0.5) * 2 * 180;\n }\n if (direction === 'left') {\n pageRotation = -pageRotation;\n }\n if (face === 'back') {\n pageRotation += 180;\n }\n if (pageRotation) {\n if (originRight) {\n pageMatrix.translate(this.pageWidth);\n }\n pageMatrix.rotateY(pageRotation);\n if (originRight) {\n pageMatrix.translate(-this.pageWidth);\n }\n }\n if (progress < 0.5) {\n theta = progress * 2 * Math.PI;\n } else {\n theta = (1 - (progress - 0.5) * 2) * Math.PI;\n }\n if (theta === 0) {\n theta = 1e-9;\n }\n radius = this.pageWidth / theta;\n radian = 0;\n dRadian = theta / this.nPolygons;\n rotate = dRadian / 2 / Math.PI * 180;\n dRotate = dRadian / Math.PI * 180;\n if (originRight) {\n rotate = -theta / Math.PI * 180 + dRotate / 2;\n }\n if (face === 'back') {\n rotate = -rotate;\n dRotate = -dRotate;\n }\n this.minX = 2e308;\n this.maxX = -2e308;\n results = [];\n for (i = j = 0, ref = this.nPolygons; (0 <= ref ? j < ref : j > ref); i = 0 <= ref ? ++j : --j) {\n bgPos = (i / (this.nPolygons - 1) * 100) + \"% 0px\";\n m = pageMatrix.clone();\n rad = originRight ? theta - radian : radian;\n x = Math.sin(rad) * radius;\n if (originRight) {\n x = this.pageWidth - x;\n }\n z = (1 - Math.cos(rad)) * radius;\n if (face === 'back') {\n z = -z;\n }\n m.translate3d(x, 0, z);\n m.rotateY(-rotate);\n x0 = m.transformX(0);\n x1 = m.transformX(polygonWidth);\n this.maxX = Math.max(Math.max(x0, x1), this.maxX);\n this.minX = Math.min(Math.min(x0, x1), this.minX);\n lighting = this.computeLighting(pageRotation - rotate, dRotate);\n radian += dRadian;\n rotate += dRotate;\n results.push([face + i, image, lighting, bgPos, m.toString(), Math.abs(Math.round(z))]);\n }\n return results;\n },\n computeLighting: function(rot, dRotate) {\n var DEG, POW, blackness, diffuse, gradients, lightingPoints, specular;\n gradients = [];\n lightingPoints = [-0.5, -0.25, 0, 0.25, 0.5];\n if (this.ambient < 1) {\n blackness = 1 - this.ambient;\n diffuse = lightingPoints.map(function (d) {\n return (1 - Math.cos((rot - dRotate * d) / 180 * Math.PI)) * blackness;\n });\n gradients.push((\"linear-gradient(to right,\\n rgba(0, 0, 0, \" + (diffuse[0]) + \"),\\n rgba(0, 0, 0, \" + (diffuse[1]) + \") 25%,\\n rgba(0, 0, 0, \" + (diffuse[2]) + \") 50%,\\n rgba(0, 0, 0, \" + (diffuse[3]) + \") 75%,\\n rgba(0, 0, 0, \" + (diffuse[4]) + \"))\"));\n }\n if (this.gloss > 0 && !this.IE) {\n DEG = 30;\n POW = 200;\n specular = lightingPoints.map(function (d) {\n return Math.max(Math.pow( Math.cos((rot + DEG - dRotate * d) / 180 * Math.PI), POW ), Math.pow( Math.cos((rot - DEG - dRotate * d) / 180 * Math.PI), POW ));\n });\n gradients.push((\"linear-gradient(to right,\\n rgba(255, 255, 255, \" + (specular[0] * this.gloss) + \"),\\n rgba(255, 255, 255, \" + (specular[1] * this.gloss) + \") 25%,\\n rgba(255, 255, 255, \" + (specular[2] * this.gloss) + \") 50%,\\n rgba(255, 255, 255, \" + (specular[3] * this.gloss) + \") 75%,\\n rgba(255, 255, 255, \" + (specular[4] * this.gloss) + \"))\"));\n }\n return gradients.join(',');\n },\n flipStart: function(direction, auto) {\n var this$1$1 = this;\n\n if (direction !== this.forwardDirection) {\n if (this.displayedPages === 1) {\n this.flip.frontImage = this.pageUrl(this.currentPage - 1);\n this.flip.backImage = null;\n } else {\n this.flip.frontImage = this.pageUrl(this.firstPage);\n this.flip.backImage = this.pageUrl(this.currentPage - this.displayedPages + 1);\n }\n } else {\n if (this.displayedPages === 1) {\n this.flip.frontImage = this.pageUrl(this.currentPage);\n this.flip.backImage = null;\n } else {\n this.flip.frontImage = this.pageUrl(this.secondPage);\n this.flip.backImage = this.pageUrl(this.currentPage + this.displayedPages);\n }\n }\n this.flip.direction = direction;\n this.flip.progress = 0;\n return requestAnimationFrame(function () {\n return requestAnimationFrame(function () {\n if (this$1$1.flip.direction !== this$1$1.forwardDirection) {\n if (this$1$1.displayedPages === 2) {\n this$1$1.firstPage = this$1$1.currentPage - this$1$1.displayedPages;\n }\n } else {\n if (this$1$1.displayedPages === 1) {\n this$1$1.firstPage = this$1$1.currentPage + this$1$1.displayedPages;\n } else {\n this$1$1.secondPage = this$1$1.currentPage + 1 + this$1$1.displayedPages;\n }\n }\n if (auto) {\n return this$1$1.flipAuto(true);\n }\n });\n });\n },\n flipAuto: function(ease) {\n var this$1$1 = this;\n\n var animate, duration, startRatio, t0;\n t0 = Date.now();\n duration = this.flipDuration * (1 - this.flip.progress);\n startRatio = this.flip.progress;\n this.flip.auto = true;\n this.$emit((\"flip-\" + (this.flip.direction) + \"-start\"), this.page);\n animate = function () {\n return requestAnimationFrame(function () {\n var ratio, t;\n t = Date.now() - t0;\n ratio = startRatio + t / duration;\n if (ratio > 1) {\n ratio = 1;\n }\n this$1$1.flip.progress = ease ? easeInOut(ratio) : ratio;\n if (ratio < 1) {\n return animate();\n } else {\n if (this$1$1.flip.direction !== this$1$1.forwardDirection) {\n this$1$1.currentPage -= this$1$1.displayedPages;\n } else {\n this$1$1.currentPage += this$1$1.displayedPages;\n }\n this$1$1.$emit((\"flip-\" + (this$1$1.flip.direction) + \"-end\"), this$1$1.page);\n if (this$1$1.displayedPages === 1 && this$1$1.flip.direction === this$1$1.forwardDirection) {\n this$1$1.flip.direction = null;\n } else {\n this$1$1.onImageLoad(1, function () {\n return this$1$1.flip.direction = null;\n });\n }\n return this$1$1.flip.auto = false;\n }\n });\n };\n return animate();\n },\n flipRevert: function() {\n var this$1$1 = this;\n\n var animate, duration, startRatio, t0;\n t0 = Date.now();\n duration = this.flipDuration * this.flip.progress;\n startRatio = this.flip.progress;\n this.flip.auto = true;\n animate = function () {\n return requestAnimationFrame(function () {\n var ratio, t;\n t = Date.now() - t0;\n ratio = startRatio - startRatio * t / duration;\n if (ratio < 0) {\n ratio = 0;\n }\n this$1$1.flip.progress = ratio;\n if (ratio > 0) {\n return animate();\n } else {\n this$1$1.firstPage = this$1$1.currentPage;\n this$1$1.secondPage = this$1$1.currentPage + 1;\n if (this$1$1.displayedPages === 1 && this$1$1.flip.direction !== this$1$1.forwardDirection) {\n this$1$1.flip.direction = null;\n } else {\n this$1$1.onImageLoad(1, function () {\n return this$1$1.flip.direction = null;\n });\n }\n return this$1$1.flip.auto = false;\n }\n });\n };\n return animate();\n },\n onImageLoad: function(trigger, cb) {\n this.nImageLoad = 0;\n this.nImageLoadTrigger = trigger;\n return this.imageLoadCallback = cb;\n },\n didLoadImage: function(ev) {\n if (this.imageWidth === null) {\n this.imageWidth = (ev.target || ev.path[0]).naturalWidth;\n this.imageHeight = (ev.target || ev.path[0]).naturalHeight;\n this.preloadImages();\n }\n if (!this.imageLoadCallback) {\n return;\n }\n if (++this.nImageLoad >= this.nImageLoadTrigger) {\n this.imageLoadCallback();\n return this.imageLoadCallback = null;\n }\n },\n zoomIn: function(zoomAt) {\n if ( zoomAt === void 0 ) zoomAt = null;\n\n if (!this.canZoomIn) {\n return;\n }\n this.zoomIndex += 1;\n return this.zoomTo(this.zooms_[this.zoomIndex], zoomAt);\n },\n zoomOut: function(zoomAt) {\n if ( zoomAt === void 0 ) zoomAt = null;\n\n if (!this.canZoomOut) {\n return;\n }\n this.zoomIndex -= 1;\n return this.zoomTo(this.zooms_[this.zoomIndex], zoomAt);\n },\n zoomTo: function(zoom, zoomAt) {\n var this$1$1 = this;\n if ( zoomAt === void 0 ) zoomAt = null;\n\n var animate, containerFixedX, containerFixedY, end, endX, endY, fixedX, fixedY, rect, start, startX, startY, t0, viewport;\n viewport = this.$refs.viewport;\n if (zoomAt) {\n rect = viewport.getBoundingClientRect();\n fixedX = zoomAt.pageX - rect.left;\n fixedY = zoomAt.pageY - rect.top;\n } else {\n fixedX = viewport.clientWidth / 2;\n fixedY = viewport.clientHeight / 2;\n }\n start = this.zoom;\n end = zoom;\n startX = viewport.scrollLeft;\n startY = viewport.scrollTop;\n containerFixedX = fixedX + startX;\n containerFixedY = fixedY + startY;\n endX = containerFixedX / start * end - fixedX;\n endY = containerFixedY / start * end - fixedY;\n t0 = Date.now();\n this.zooming = true;\n this.$emit('zoom-start', zoom);\n animate = function () {\n return requestAnimationFrame(function () {\n var ratio, t;\n t = Date.now() - t0;\n ratio = t / this$1$1.zoomDuration;\n if (ratio > 1 || this$1$1.IE) {\n ratio = 1;\n }\n ratio = easeInOut(ratio);\n this$1$1.zoom = start + (end - start) * ratio;\n this$1$1.scrollLeft = startX + (endX - startX) * ratio;\n this$1$1.scrollTop = startY + (endY - startY) * ratio;\n if (t < this$1$1.zoomDuration) {\n return animate();\n } else {\n this$1$1.$emit('zoom-end', zoom);\n this$1$1.zooming = false;\n this$1$1.zoom = zoom;\n this$1$1.scrollLeft = endX;\n return this$1$1.scrollTop = endY;\n }\n });\n };\n animate();\n if (end > 1) {\n return this.preloadImages(true);\n }\n },\n zoomAt: function(zoomAt) {\n this.zoomIndex = (this.zoomIndex + 1) % this.zooms_.length;\n return this.zoomTo(this.zooms_[this.zoomIndex], zoomAt);\n },\n swipeStart: function(touch) {\n this.touchStartX = touch.pageX;\n this.touchStartY = touch.pageY;\n this.maxMove = 0;\n if (this.zoom <= 1) {\n if (this.dragToFlip) {\n return this.activeCursor = 'grab';\n }\n } else {\n this.startScrollLeft = this.$refs.viewport.scrollLeft;\n this.startScrollTop = this.$refs.viewport.scrollTop;\n return this.activeCursor = 'all-scroll';\n }\n },\n swipeMove: function(touch) {\n var x, y;\n if (this.touchStartX == null) {\n return;\n }\n x = touch.pageX - this.touchStartX;\n y = touch.pageY - this.touchStartY;\n this.maxMove = Math.max(this.maxMove, Math.abs(x));\n this.maxMove = Math.max(this.maxMove, Math.abs(y));\n if (this.zoom > 1) {\n if (this.dragToScroll) {\n this.dragScroll(x, y);\n }\n return;\n }\n if (!this.dragToFlip) {\n return;\n }\n if (Math.abs(y) > Math.abs(x)) {\n return;\n }\n this.activeCursor = 'grabbing';\n if (x > 0) {\n if (this.flip.direction === null && this.canFlipLeft && x >= this.swipeMin) {\n this.flipStart('left', false);\n }\n if (this.flip.direction === 'left') {\n this.flip.progress = x / this.pageWidth;\n if (this.flip.progress > 1) {\n this.flip.progress = 1;\n }\n }\n } else {\n if (this.flip.direction === null && this.canFlipRight && x <= -this.swipeMin) {\n this.flipStart('right', false);\n }\n if (this.flip.direction === 'right') {\n this.flip.progress = -x / this.pageWidth;\n if (this.flip.progress > 1) {\n this.flip.progress = 1;\n }\n }\n }\n return true;\n },\n swipeEnd: function(touch) {\n if (this.touchStartX == null) {\n return;\n }\n if (this.clickToZoom && this.maxMove < this.swipeMin) {\n this.zoomAt(touch);\n }\n if (this.flip.direction !== null && !this.flip.auto) {\n if (this.flip.progress > 1 / 4) {\n this.flipAuto(false);\n } else {\n this.flipRevert();\n }\n }\n this.touchStartX = null;\n return this.activeCursor = null;\n },\n onTouchStart: function(ev) {\n this.hasTouchEvents = true;\n return this.swipeStart(ev.changedTouches[0]);\n },\n onTouchMove: function(ev) {\n if (this.swipeMove(ev.changedTouches[0])) {\n if (ev.cancelable) {\n return ev.preventDefault();\n }\n }\n },\n onTouchEnd: function(ev) {\n return this.swipeEnd(ev.changedTouches[0]);\n },\n onPointerDown: function(ev) {\n this.hasPointerEvents = true;\n if (this.hasTouchEvents) {\n return;\n }\n if (ev.which && ev.which !== 1) { // Ignore right-click\n return;\n }\n this.swipeStart(ev);\n try {\n return ev.target.setPointerCapture(ev.pointerId);\n } catch (error) {\n\n }\n },\n onPointerMove: function(ev) {\n if (!this.hasTouchEvents) {\n return this.swipeMove(ev);\n }\n },\n onPointerUp: function(ev) {\n if (this.hasTouchEvents) {\n return;\n }\n this.swipeEnd(ev);\n try {\n return ev.target.releasePointerCapture(ev.pointerId);\n } catch (error) {\n\n }\n },\n onMouseDown: function(ev) {\n if (this.hasTouchEvents || this.hasPointerEvents) {\n return;\n }\n if (ev.which && ev.which !== 1) { // Ignore right-click\n return;\n }\n return this.swipeStart(ev);\n },\n onMouseMove: function(ev) {\n if (!(this.hasTouchEvents || this.hasPointerEvents)) {\n return this.swipeMove(ev);\n }\n },\n onMouseUp: function(ev) {\n if (!(this.hasTouchEvents || this.hasPointerEvents)) {\n return this.swipeEnd(ev);\n }\n },\n dragScroll: function(x, y) {\n this.scrollLeft = this.startScrollLeft - x;\n return this.scrollTop = this.startScrollTop - y;\n },\n onWheel: function(ev) {\n if (this.wheel === 'scroll' && this.zoom > 1 && this.dragToScroll) {\n this.scrollLeft = this.$refs.viewport.scrollLeft + ev.deltaX;\n this.scrollTop = this.$refs.viewport.scrollTop + ev.deltaY;\n if (ev.cancelable) {\n ev.preventDefault();\n }\n }\n if (this.wheel === 'zoom') {\n if (ev.deltaY >= 100) {\n this.zoomOut(ev);\n return ev.preventDefault();\n } else if (ev.deltaY <= -100) {\n this.zoomIn(ev);\n return ev.preventDefault();\n }\n }\n },\n preloadImages: function(hiRes) {\n if ( hiRes === void 0 ) hiRes = false;\n\n var i, j, k, ref, ref1, ref2, ref3, src;\n for (i = j = ref = this.currentPage - 3, ref1 = this.currentPage + 3; (ref <= ref1 ? j <= ref1 : j >= ref1); i = ref <= ref1 ? ++j : --j) {\n this.pageUrlLoading(i); // this preloads image\n }\n if (hiRes) {\n for (i = k = ref2 = this.currentPage, ref3 = this.currentPage + this.displayedPages; (ref2 <= ref3 ? k < ref3 : k > ref3); i = ref2 <= ref3 ? ++k : --k) {\n src = this.pagesHiRes[i];\n if (src) {\n (new Image()).src = src;\n }\n }\n }\n },\n goToPage: function(p) {\n if (p === null || p === this.page) {\n return;\n }\n if (this.pages[0] === null) {\n if (this.displayedPages === 2 && p === 1) {\n this.currentPage = 0;\n } else {\n this.currentPage = p;\n }\n } else {\n this.currentPage = p - 1;\n }\n this.minX = 2e308;\n this.maxX = -2e308;\n return this.currentCenterOffset = this.centerOffset;\n },\n loadImage: function(url) {\n var this$1$1 = this;\n\n var img;\n if (this.imageWidth === null) {\n // First loaded image defines the image width and height.\n // So it must be true image, not 'loading' image.\n return url;\n } else {\n if (this.loadedImages[url]) {\n return url;\n } else {\n img = new Image();\n img.onload = function () {\n if (this$1$1.$set) {\n return this$1$1.$set(this$1$1.loadedImages, url, true);\n } else {\n return this$1$1.loadedImages[url] = true;\n }\n };\n img.src = url;\n return this.loadingImage;\n }\n }\n }\n },\n watch: {\n currentPage: function() {\n this.firstPage = this.currentPage;\n this.secondPage = this.currentPage + 1;\n return this.preloadImages();\n },\n centerOffset: function() {\n var this$1$1 = this;\n\n var animate;\n if (this.animatingCenter) {\n return;\n }\n animate = function () {\n return requestAnimationFrame(function () {\n var diff, rate;\n rate = 0.1;\n diff = this$1$1.centerOffset - this$1$1.currentCenterOffset;\n if (Math.abs(diff) < 0.5) {\n this$1$1.currentCenterOffset = this$1$1.centerOffset;\n return this$1$1.animatingCenter = false;\n } else {\n this$1$1.currentCenterOffset += diff * rate;\n return animate();\n }\n });\n };\n this.animatingCenter = true;\n return animate();\n },\n scrollLeftLimited: function(val) {\n var this$1$1 = this;\n\n if (this.IE) {\n return requestAnimationFrame(function () {\n return this$1$1.$refs.viewport.scrollLeft = val;\n });\n } else {\n return this.$refs.viewport.scrollLeft = val;\n }\n },\n scrollTopLimited: function(val) {\n var this$1$1 = this;\n\n if (this.IE) {\n return requestAnimationFrame(function () {\n return this$1$1.$refs.viewport.scrollTop = val;\n });\n } else {\n return this.$refs.viewport.scrollTop = val;\n }\n },\n pages: function(after, before) {\n this.fixFirstPage();\n if (!(before != null ? before.length : void 0) && (after != null ? after.length : void 0)) {\n if (this.startPage > 1 && after[0] === null) {\n return this.currentPage++;\n }\n }\n },\n startPage: function(p) {\n return this.goToPage(p);\n }\n }\n};\n\nfunction normalizeComponent(template, style, script, scopeId, isFunctionalTemplate, moduleIdentifier /* server only */, shadowMode, createInjector, createInjectorSSR, createInjectorShadow) {\r\n if (typeof shadowMode !== 'boolean') {\r\n createInjectorSSR = createInjector;\r\n createInjector = shadowMode;\r\n shadowMode = false;\r\n }\r\n // Vue.extend constructor export interop.\r\n var options = typeof script === 'function' ? script.options : script;\r\n // render functions\r\n if (template && template.render) {\r\n options.render = template.render;\r\n options.staticRenderFns = template.staticRenderFns;\r\n options._compiled = true;\r\n // functional template\r\n if (isFunctionalTemplate) {\r\n options.functional = true;\r\n }\r\n }\r\n // scopedId\r\n if (scopeId) {\r\n options._scopeId = scopeId;\r\n }\r\n var hook;\r\n if (moduleIdentifier) {\r\n // server build\r\n hook = function (context) {\r\n // 2.3 injection\r\n context =\r\n context || // cached call\r\n (this.$vnode && this.$vnode.ssrContext) || // stateful\r\n (this.parent && this.parent.$vnode && this.parent.$vnode.ssrContext); // functional\r\n // 2.2 with runInNewContext: true\r\n if (!context && typeof __VUE_SSR_CONTEXT__ !== 'undefined') {\r\n context = __VUE_SSR_CONTEXT__;\r\n }\r\n // inject component styles\r\n if (style) {\r\n style.call(this, createInjectorSSR(context));\r\n }\r\n // register component module identifier for async chunk inference\r\n if (context && context._registeredComponents) {\r\n context._registeredComponents.add(moduleIdentifier);\r\n }\r\n };\r\n // used by ssr in case component is cached and beforeCreate\r\n // never gets called\r\n options._ssrRegister = hook;\r\n }\r\n else if (style) {\r\n hook = shadowMode\r\n ? function (context) {\r\n style.call(this, createInjectorShadow(context, this.$root.$options.shadowRoot));\r\n }\r\n : function (context) {\r\n style.call(this, createInjector(context));\r\n };\r\n }\r\n if (hook) {\r\n if (options.functional) {\r\n // register for functional component in vue file\r\n var originalRender = options.render;\r\n options.render = function renderWithStyleInjection(h, context) {\r\n hook.call(context);\r\n return originalRender(h, context);\r\n };\r\n }\r\n else {\r\n // inject component registration as beforeCreate hook\r\n var existing = options.beforeCreate;\r\n options.beforeCreate = existing ? [].concat(existing, hook) : [hook];\r\n }\r\n }\r\n return script;\r\n}\n\nvar isOldIE = typeof navigator !== 'undefined' &&\r\n /msie [6-9]\\\\b/.test(navigator.userAgent.toLowerCase());\r\nfunction createInjector(context) {\r\n return function (id, style) { return addStyle(id, style); };\r\n}\r\nvar HEAD;\r\nvar styles = {};\r\nfunction addStyle(id, css) {\r\n var group = isOldIE ? css.media || 'default' : id;\r\n var style = styles[group] || (styles[group] = { ids: new Set(), styles: [] });\r\n if (!style.ids.has(id)) {\r\n style.ids.add(id);\r\n var code = css.source;\r\n if (css.map) {\r\n // https://developer.chrome.com/devtools/docs/javascript-debugging\r\n // this makes source maps inside style tags work properly in Chrome\r\n code += '\\n/*# sourceURL=' + css.map.sources[0] + ' */';\r\n // http://stackoverflow.com/a/26603875\r\n code +=\r\n '\\n/*# sourceMappingURL=data:application/json;base64,' +\r\n btoa(unescape(encodeURIComponent(JSON.stringify(css.map)))) +\r\n ' */';\r\n }\r\n if (!style.element) {\r\n style.element = document.createElement('style');\r\n style.element.type = 'text/css';\r\n if (css.media)\r\n { style.element.setAttribute('media', css.media); }\r\n if (HEAD === undefined) {\r\n HEAD = document.head || document.getElementsByTagName('head')[0];\r\n }\r\n HEAD.appendChild(style.element);\r\n }\r\n if ('styleSheet' in style.element) {\r\n style.styles.push(code);\r\n style.element.styleSheet.cssText = style.styles\r\n .filter(Boolean)\r\n .join('\\n');\r\n }\r\n else {\r\n var index = style.ids.size - 1;\r\n var textNode = document.createTextNode(code);\r\n var nodes = style.element.childNodes;\r\n if (nodes[index])\r\n { style.element.removeChild(nodes[index]); }\r\n if (nodes.length)\r\n { style.element.insertBefore(textNode, nodes[index]); }\r\n else\r\n { style.element.appendChild(textNode); }\r\n }\r\n }\r\n}\n\n/* script */\nvar __vue_script__ = script;\n\n/* template */\nvar __vue_render__ = function () {var _vm=this;var _h=_vm.$createElement;var _c=_vm._self._c||_h;return _c('div',[_vm._t(\"default\",null,null,{\n canFlipLeft: _vm.canFlipLeft,\n canFlipRight: _vm.canFlipRight,\n canZoomIn: _vm.canZoomIn,\n canZoomOut: _vm.canZoomOut,\n page: _vm.page,\n numPages: _vm.numPages,\n flipLeft: _vm.flipLeft,\n flipRight: _vm.flipRight,\n zoomIn: _vm.zoomIn,\n zoomOut: _vm.zoomOut,\n }),_vm._v(\" \"),_c('div',{ref:\"viewport\",staticClass:\"viewport\",class:{\n zoom: _vm.zooming || _vm.zoom > 1,\n 'drag-to-scroll': _vm.dragToScroll,\n },style:({ cursor: _vm.cursor == 'grabbing' ? 'grabbing' : 'auto' }),on:{\"touchmove\":_vm.onTouchMove,\"pointermove\":_vm.onPointerMove,\"mousemove\":_vm.onMouseMove,\"touchend\":_vm.onTouchEnd,\"touchcancel\":_vm.onTouchEnd,\"pointerup\":_vm.onPointerUp,\"pointercancel\":_vm.onPointerUp,\"mouseup\":_vm.onMouseUp,\"wheel\":_vm.onWheel}},[_c('div',{staticClass:\"flipbook-container\",style:({ transform: (\"scale(\" + _vm.zoom + \")\") })},[_c('div',{staticClass:\"click-to-flip left\",style:({ cursor: _vm.canFlipLeft ? 'pointer' : 'auto' }),on:{\"click\":_vm.flipLeft}}),_vm._v(\" \"),_c('div',{staticClass:\"click-to-flip right\",style:({ cursor: _vm.canFlipRight ? 'pointer' : 'auto' }),on:{\"click\":_vm.flipRight}}),_vm._v(\" \"),_c('div',{style:({ transform: (\"translateX(\" + _vm.centerOffsetSmoothed + \"px)\") })},[(_vm.showLeftPage)?_c('img',{staticClass:\"page fixed\",style:({\n width: _vm.pageWidth + 'px',\n height: _vm.pageHeight + 'px',\n left: _vm.xMargin + 'px',\n top: _vm.yMargin + 'px',\n }),attrs:{\"src\":_vm.pageUrlLoading(_vm.leftPage, true)},on:{\"load\":function($event){return _vm.didLoadImage($event)}}}):_vm._e(),_vm._v(\" \"),(_vm.showRightPage)?_c('img',{staticClass:\"page fixed\",style:({\n width: _vm.pageWidth + 'px',\n height: _vm.pageHeight + 'px',\n left: _vm.viewWidth / 2 + 'px',\n top: _vm.yMargin + 'px',\n }),attrs:{\"src\":_vm.pageUrlLoading(_vm.rightPage, true)},on:{\"load\":function($event){return _vm.didLoadImage($event)}}}):_vm._e(),_vm._v(\" \"),_c('div',{style:({ opacity: _vm.flip.opacity })},_vm._l((_vm.polygonArray),function(ref){\n var key = ref[0];\n var bgImage = ref[1];\n var lighting = ref[2];\n var bgPos = ref[3];\n var transform = ref[4];\n var z = ref[5];\nreturn _c('div',{key:key,staticClass:\"polygon\",class:{ blank: !bgImage },style:({\n backgroundImage: bgImage && (\"url(\" + (_vm.loadImage(bgImage)) + \")\"),\n backgroundSize: _vm.polygonBgSize,\n backgroundPosition: bgPos,\n width: _vm.polygonWidth,\n height: _vm.polygonHeight,\n transform: transform,\n zIndex: z,\n })},[_c('div',{directives:[{name:\"show\",rawName:\"v-show\",value:(lighting.length),expression:\"lighting.length\"}],staticClass:\"lighting\",style:({ backgroundImage: lighting })})])}),0),_vm._v(\" \"),_c('div',{staticClass:\"bounding-box\",style:({\n left: _vm.boundingLeft + 'px',\n top: _vm.yMargin + 'px',\n width: _vm.boundingRight - _vm.boundingLeft + 'px',\n height: _vm.pageHeight + 'px',\n cursor: _vm.cursor,\n }),on:{\"touchstart\":_vm.onTouchStart,\"pointerdown\":_vm.onPointerDown,\"mousedown\":_vm.onMouseDown}})])])])],2)};\nvar __vue_staticRenderFns__ = [];\n\n /* style */\n var __vue_inject_styles__ = function (inject) {\n if (!inject) { return }\n inject(\"data-v-e3f0fbe2_0\", { source: \".viewport[data-v-e3f0fbe2]{-webkit-overflow-scrolling:touch;width:100%;height:100%}.viewport.zoom[data-v-e3f0fbe2]{overflow:scroll}.viewport.zoom.drag-to-scroll[data-v-e3f0fbe2]{overflow:hidden}.flipbook-container[data-v-e3f0fbe2]{position:relative;width:100%;height:100%;transform-origin:top left;user-select:none}.click-to-flip[data-v-e3f0fbe2]{position:absolute;width:50%;height:100%;top:0;user-select:none}.click-to-flip.left[data-v-e3f0fbe2]{left:0}.click-to-flip.right[data-v-e3f0fbe2]{right:0}.bounding-box[data-v-e3f0fbe2]{position:absolute;user-select:none}.page[data-v-e3f0fbe2]{position:absolute;backface-visibility:hidden}.polygon[data-v-e3f0fbe2]{position:absolute;top:0;left:0;background-repeat:no-repeat;backface-visibility:hidden;transform-origin:center left}.polygon.blank[data-v-e3f0fbe2]{background-color:#ddd}.polygon .lighting[data-v-e3f0fbe2]{width:100%;height:100%}\", map: undefined, media: undefined });\n\n };\n /* scoped */\n var __vue_scope_id__ = \"data-v-e3f0fbe2\";\n /* module identifier */\n var __vue_module_identifier__ = undefined;\n /* functional template */\n var __vue_is_functional_template__ = false;\n /* style inject SSR */\n \n /* style inject shadow dom */\n \n\n \n var __vue_component__ = /*#__PURE__*/normalizeComponent(\n { render: __vue_render__, staticRenderFns: __vue_staticRenderFns__ },\n __vue_inject_styles__,\n __vue_script__,\n __vue_scope_id__,\n __vue_is_functional_template__,\n __vue_module_identifier__,\n false,\n createInjector,\n undefined,\n undefined\n );\n\nexport { __vue_component__ as default };\n","var render = function render(){var _vm=this,_c=_vm._self._c;return _c('div',{staticClass:\"catalogue-drawer-container\"},[(_vm.visible)?_c('div',{staticClass:\"drawer-overlay\",on:{\"click\":_vm.closeDrawer}}):_vm._e(),_c('div',{staticClass:\"catalogue-drawer\",class:{ 'drawer-open': _vm.visible },style:({ width: _vm.drawerWidth })},[_c('div',{staticClass:\"drawer-header\"},[_c('h3',{staticClass:\"drawer-title\"},[_vm._v(\"目录\")]),_c('button',{staticClass:\"close-button\",on:{\"click\":_vm.closeDrawer}},[_c('span',{staticClass:\"close-icon\"},[_vm._v(\"×\")])])]),_c('div',{staticClass:\"page-jump-section\"},[_c('input',{directives:[{name:\"model\",rawName:\"v-model\",value:(_vm.jumpPageInput),expression:\"jumpPageInput\"}],staticClass:\"page-jump-input\",attrs:{\"type\":\"text\",\"placeholder\":\"请输入页码\"},domProps:{\"value\":(_vm.jumpPageInput)},on:{\"input\":[function($event){if($event.target.composing)return;_vm.jumpPageInput=$event.target.value},_vm.handlePageInput],\"focus\":_vm.onInputFocus,\"blur\":_vm.onInputBlur}}),_c('button',{staticClass:\"btn-jump\",on:{\"click\":_vm.handleJumpToPage}},[_vm._v(\" 跳转 \")])]),_c('div',{staticClass:\"drawer-content\"},[(_vm.loading)?_c('div',{staticClass:\"loading-container\"},[_c('div',{staticClass:\"loading-spinner\"}),_c('p',[_vm._v(\"加载目录中...\")])]):(_vm.error)?_c('div',{staticClass:\"error-container\"},[_c('div',{staticClass:\"error-icon\"},[_vm._v(\"⚠️\")]),_c('p',[_vm._v(\"目录加载失败\")]),_c('button',{staticClass:\"retry-button\",on:{\"click\":_vm.fetchCatalogue}},[_vm._v(\" 重新加载 \")])]):(_vm.catalogueData && _vm.catalogueData.length > 0)?_c('div',{staticClass:\"catalogue-list\"},_vm._l((_vm.catalogueData),function(item,index){return _c('catalogue-item',{key:`catalogue-${index}`,attrs:{\"item\":item || {},\"level\":0},on:{\"item-click\":_vm.onItemClick}})}),1):_c('div',{staticClass:\"empty-container\"},[_c('p',[_vm._v(\"暂无目录\")])])])])])\n}\nvar staticRenderFns = []\n\nexport { render, staticRenderFns }","<template>\r\n <div class=\"catalogue-drawer-container\">\r\n <!-- 遮罩层 -->\r\n <div v-if=\"visible\" class=\"drawer-overlay\" @click=\"closeDrawer\"></div>\r\n \r\n <!-- 抽屉主体 -->\r\n <div \r\n class=\"catalogue-drawer\" \r\n :class=\"{ 'drawer-open': visible }\"\r\n :style=\"{ width: drawerWidth }\"\r\n >\r\n <div class=\"drawer-header\">\r\n <h3 class=\"drawer-title\">目录</h3>\r\n <button class=\"close-button\" @click=\"closeDrawer\">\r\n <span class=\"close-icon\">×</span>\r\n </button>\r\n </div>\r\n\r\n <!-- 页码跳转 -->\r\n <div class=\"page-jump-section\">\r\n <input\r\n type=\"text\"\r\n v-model=\"jumpPageInput\"\r\n @input=\"handlePageInput\"\r\n placeholder=\"请输入页码\"\r\n class=\"page-jump-input\"\r\n @focus=\"onInputFocus\"\r\n @blur=\"onInputBlur\"\r\n />\r\n <button @click=\"handleJumpToPage\" class=\"btn-jump\">\r\n 跳转\r\n </button>\r\n </div>\r\n\r\n <div class=\"drawer-content\">\r\n <!-- 加载状态 -->\r\n <div v-if=\"loading\" class=\"loading-container\">\r\n <div class=\"loading-spinner\"></div>\r\n <p>加载目录中...</p>\r\n </div>\r\n \r\n <!-- 错误状态 -->\r\n <div v-else-if=\"error\" class=\"error-container\">\r\n <div class=\"error-icon\">⚠️</div>\r\n <p>目录加载失败</p>\r\n <button class=\"retry-button\" @click=\"fetchCatalogue\">\r\n 重新加载\r\n </button>\r\n </div>\r\n \r\n <!-- 目录内容 -->\r\n <div v-else-if=\"catalogueData && catalogueData.length > 0\" class=\"catalogue-list\">\r\n <catalogue-item\r\n v-for=\"(item, index) in catalogueData\"\r\n :key=\"`catalogue-${index}`\"\r\n :item=\"item || {}\"\r\n :level=\"0\"\r\n @item-click=\"onItemClick\"\r\n />\r\n </div>\r\n \r\n <!-- 空状态 -->\r\n <div v-else class=\"empty-container\">\r\n <p>暂无目录</p>\r\n </div>\r\n </div>\r\n </div>\r\n </div>\r\n</template>\r\n\r\n<script>\r\n// 目录项组件\r\nconst CatalogueItem = {\r\n name: 'CatalogueItem',\r\n props: {\r\n item: {\r\n type: Object,\r\n required: true\r\n },\r\n level: {\r\n type: Number,\r\n default: 0\r\n }\r\n },\r\n data() {\r\n return {\r\n expanded: false\r\n }\r\n },\r\n computed: {\r\n hasChildren() {\r\n const children = this.item.childrenList || this.item.children || this.item.subItems || this.item.items\r\n return children && children.length > 0\r\n },\r\n childrenData() {\r\n return this.item.childrenList || this.item.children || this.item.subItems || this.item.items || []\r\n },\r\n itemStyle() {\r\n // 移除缩进,所有层级都左对齐\r\n return {\r\n paddingLeft: '12px',\r\n paddingRight: '12px'\r\n }\r\n },\r\n levelClass() {\r\n return `level-${this.level}`\r\n }\r\n },\r\n methods: {\r\n toggleExpand() {\r\n if (this.hasChildren) {\r\n this.expanded = !this.expanded\r\n } else {\r\n this.handleClick()\r\n }\r\n },\r\n handleClick() {\r\n this.$emit('item-click', this.item)\r\n }\r\n },\r\n render(h) {\r\n const item = this.item\r\n const titleText = item.titleName || item.title || item.name || item.text || item.label || '未命名章节'\r\n const pageNum = item.startPageNum || item.pageNumber || item.page || item.pageNum\r\n \r\n // 创建拖拽手柄\r\n const dragHandle = h('span', {\r\n class: 'drag-handle'\r\n }, '')\r\n \r\n // 创建展开图标\r\n const expandIcon = this.hasChildren ? h('span', {\r\n class: 'expand-icon'\r\n }, this.expanded ? '▼' : '▶') : null\r\n \r\n // 创建层级指示器\r\n const levelIndicator = this.level > 0 ? h('span', {\r\n class: `level-indicator level-${this.level}`\r\n }, '•'.repeat(this.level)) : null\r\n \r\n // 创建标题\r\n const titleSpan = h('span', {\r\n class: 'item-title'\r\n }, titleText)\r\n \r\n // 创建页码(放在标题后面)\r\n // const pageSpan = pageNum ? h('span', {\r\n // class: 'page-number'\r\n // }, `第${pageNum}页`) : null\r\n const pageSpan = null\r\n // 创建子级目录\r\n const childrenDiv = (this.hasChildren && this.expanded) ? h('div', {\r\n class: 'children-container'\r\n }, this.childrenData.map((child, index) => {\r\n return h('catalogue-item', {\r\n key: index,\r\n props: {\r\n item: child,\r\n level: this.level + 1\r\n },\r\n on: {\r\n 'item-click': (item) => this.$emit('item-click', item)\r\n }\r\n })\r\n })) : null\r\n \r\n return h('div', {\r\n class: 'catalogue-item-wrapper'\r\n }, [\r\n h('div', {\r\n class: [\r\n 'catalogue-item',\r\n this.levelClass,\r\n {\r\n 'has-children': this.hasChildren,\r\n 'expanded': this.expanded\r\n }\r\n ],\r\n style: this.itemStyle,\r\n on: {\r\n click: this.toggleExpand\r\n }\r\n }, [\r\n h('div', {\r\n class: 'item-content'\r\n }, [dragHandle, expandIcon, levelIndicator, titleSpan, pageSpan].filter(Boolean))\r\n ]),\r\n childrenDiv\r\n ].filter(Boolean))\r\n }\r\n}\r\n\r\nexport default {\r\n name: 'BookCatalogueDrawer',\r\n components: {\r\n CatalogueItem\r\n },\r\n props: {\r\n value: {\r\n type: Boolean,\r\n default: false\r\n },\r\n bookId: {\r\n type: String,\r\n default: ''\r\n },\r\n catalogue: {\r\n type: Array,\r\n default: () => []\r\n },\r\n loading: {\r\n type: Boolean,\r\n default: false\r\n }\r\n },\r\n data() {\r\n return {\r\n catalogueData: [],\r\n error: null,\r\n jumpPageInput: ''\r\n }\r\n },\r\n computed: {\r\n visible: {\r\n get() {\r\n return this.value\r\n },\r\n set(val) {\r\n this.$emit('input', val)\r\n }\r\n },\r\n drawerWidth() {\r\n // 响应式宽度\r\n return window.innerWidth <= 768 ? '80%' : '400px'\r\n }\r\n },\r\n watch: {\r\n visible(newVal) {\r\n if (newVal && this.bookId && !this.catalogueData.length) {\r\n this.$emit('fetch-catalogue', this.bookId)\r\n }\r\n },\r\n bookId(newVal) {\r\n if (newVal && this.visible) {\r\n this.$emit('fetch-catalogue', newVal)\r\n }\r\n },\r\n catalogue: {\r\n handler(newVal) {\r\n if (newVal && newVal.length > 0) {\r\n this.catalogueData = this.processCatalogueData(newVal)\r\n }\r\n },\r\n immediate: true\r\n }\r\n },\r\n methods: {\r\n /**\r\n * 获取目录数据 - 触发事件让父组件处理\r\n */\r\n fetchCatalogue() {\r\n if (!this.bookId) {\r\n console.warn('缺少 bookId,无法获取目录')\r\n return\r\n }\r\n this.$emit('fetch-catalogue', this.bookId)\r\n },\r\n\r\n /**\r\n * 处理目录数据,确保数据结构正确\r\n * @param {Array} data - 原始目录数据\r\n * @returns {Array} 处理后的目录数据\r\n */\r\n processCatalogueData(data) {\r\n if (!Array.isArray(data)) {\r\n return []\r\n }\r\n \r\n return data.map(item => {\r\n if (!item || typeof item !== 'object') {\r\n return {\r\n titleName: '未知章节',\r\n startPageNum: null,\r\n childrenList: []\r\n }\r\n }\r\n \r\n // 确保必要的字段存在\r\n const processedItem = {\r\n ...item,\r\n titleName: item.titleName || item.title || item.name || '未命名章节',\r\n startPageNum: item.startPageNum || item.pageNumber || item.page || item.pageNum || null,\r\n childrenList: item.childrenList || item.children || item.subItems || item.items || []\r\n }\r\n \r\n // 递归处理子级\r\n if (processedItem.childrenList && processedItem.childrenList.length > 0) {\r\n processedItem.childrenList = this.processCatalogueData(processedItem.childrenList)\r\n }\r\n \r\n return processedItem\r\n })\r\n },\r\n\r\n /**\r\n * 目录项点击事件\r\n * @param {Object} item - 点击的目录项\r\n */\r\n onItemClick(item) {\r\n console.log('目录项被点击:', item)\r\n \r\n // 发送事件给父组件\r\n this.$emit('catalogue-click', item)\r\n \r\n // 如果有页码信息,可以进行跳转\r\n const pageNumber = item.startPageNum || item.pageNumber || item.page || item.pageNum\r\n if (pageNumber) {\r\n this.$emit('page-jump', pageNumber)\r\n }\r\n },\r\n\r\n /**\r\n * 关闭抽屉\r\n */\r\n closeDrawer() {\r\n this.$emit('input', false)\r\n },\r\n\r\n /**\r\n * 处理页码输入\r\n */\r\n handlePageInput(e) {\r\n const value = e.target.value\r\n const numValue = value.replace(/[^\\d]/g, '')\r\n this.jumpPageInput = numValue\r\n },\r\n\r\n /**\r\n * 执行页码跳转\r\n */\r\n handleJumpToPage() {\r\n const pageNum = parseInt(this.jumpPageInput)\r\n if (pageNum && pageNum >= 1) {\r\n this.$emit('page-jump', pageNum)\r\n this.jumpPageInput = ''\r\n this.closeDrawer()\r\n }\r\n },\r\n\r\n /**\r\n * 输入框获得焦点\r\n */\r\n onInputFocus() {\r\n // 可以在这里添加焦点处理逻辑\r\n },\r\n\r\n /**\r\n * 输入框失去焦点\r\n */\r\n onInputBlur() {\r\n this.$emit('Focus')\r\n },\r\n\r\n /**\r\n * 重置数据\r\n */\r\n resetData() {\r\n this.catalogueData = []\r\n this.error = null\r\n this.loading = false\r\n },\r\n\r\n /**\r\n * 处理窗口大小变化\r\n */\r\n handleResize() {\r\n // 可以在这里添加响应式逻辑\r\n }\r\n },\r\n\r\n mounted() {\r\n // 监听窗口大小变化\r\n window.addEventListener('resize', this.handleResize)\r\n },\r\n\r\n beforeDestroy() {\r\n window.removeEventListener('resize', this.handleResize)\r\n }\r\n}\r\n</script>\r\n\r\n<style scoped>\r\n/* 容器 */\r\n.catalogue-drawer-container {\r\n position: relative;\r\n}\r\n\r\n/* 遮罩层 */\r\n.drawer-overlay {\r\n position: fixed;\r\n top: 0;\r\n left: 0;\r\n width: 100%;\r\n height: 100%;\r\n background: rgba(0, 0, 0, 0.5);\r\n z-index: 19998;\r\n transition: opacity 0.3s ease;\r\n}\r\n\r\n/* 抽屉主体 */\r\n.catalogue-drawer {\r\n position: fixed;\r\n top: 0;\r\n left: 0;\r\n height: 100%;\r\n background: #ffffff;\r\n box-shadow: 2px 0 10px rgba(0, 0, 0, 0.1);\r\n transform: translateX(-100%);\r\n transition: transform 0.3s ease;\r\n z-index: 19999;\r\n overflow: hidden;\r\n /* 处理安全区域 */\r\n padding-top: env(safe-area-inset-top);\r\n padding-bottom: env(safe-area-inset-bottom);\r\n}\r\n\r\n.catalogue-drawer.drawer-open {\r\n transform: translateX(0);\r\n}\r\n\r\n.drawer-header {\r\n display: flex;\r\n justify-content: space-between;\r\n align-items: center;\r\n padding: 16px 20px;\r\n border-bottom: 1px solid #e5e5e5;\r\n background: #ffffff;\r\n position: sticky;\r\n top: 0;\r\n z-index: 100;\r\n}\r\n\r\n.drawer-title {\r\n font-size: 18px;\r\n font-weight: 600;\r\n color: #333333;\r\n margin: 0;\r\n}\r\n\r\n.close-button {\r\n background: none;\r\n border: none;\r\n cursor: pointer;\r\n padding: 6px;\r\n border-radius: 4px;\r\n transition: background-color 0.2s ease;\r\n width: 32px;\r\n height: 32px;\r\n display: flex;\r\n align-items: center;\r\n justify-content: center;\r\n}\r\n\r\n.close-button:hover {\r\n background: #f5f5f5;\r\n}\r\n\r\n.close-icon {\r\n font-size: 18px;\r\n color: #666;\r\n line-height: 1;\r\n display: block;\r\n}\r\n\r\n.close-button:hover .close-icon {\r\n color: #333;\r\n}\r\n\r\n/* 页码跳转区域 */\r\n.page-jump-section {\r\n display: flex;\r\n align-items: center;\r\n gap: 10px;\r\n padding: 12px 16px;\r\n border-bottom: 1px solid #e5e5e5;\r\n background: #f8f9fa;\r\n}\r\n\r\n.page-jump-input {\r\n flex: 1;\r\n min-width: 0;\r\n padding: 10px 12px;\r\n border: 1px solid #ddd;\r\n border-radius: 6px;\r\n background: #fff;\r\n color: #333;\r\n font-size: 16px;\r\n text-align: center;\r\n outline: none;\r\n transition: border-color 0.2s ease, box-shadow 0.2s ease;\r\n}\r\n\r\n.page-jump-input:focus {\r\n border-color: #1989fa;\r\n box-shadow: 0 0 0 2px rgba(25, 137, 250, 0.1);\r\n}\r\n\r\n.page-jump-input::placeholder {\r\n color: #999;\r\n font-size: 14px;\r\n}\r\n\r\n.btn-jump {\r\n flex-shrink: 0;\r\n padding: 10px 20px;\r\n background: #1989fa;\r\n color: white;\r\n border: none;\r\n border-radius: 6px;\r\n font-size: 14px;\r\n font-weight: 500;\r\n cursor: pointer;\r\n transition: background 0.2s ease;\r\n white-space: nowrap;\r\n}\r\n\r\n.btn-jump:hover {\r\n background: #0066cc;\r\n}\r\n\r\n.btn-jump:active {\r\n background: #004499;\r\n}\r\n\r\n.drawer-content {\r\n height: calc(100% - 65px);\r\n overflow-y: auto;\r\n -webkit-overflow-scrolling: touch;\r\n}\r\n\r\n.loading-container {\r\n display: flex;\r\n justify-content: center;\r\n align-items: center;\r\n height: 200px;\r\n flex-direction: column;\r\n gap: 12px;\r\n}\r\n\r\n.loading-spinner {\r\n width: 40px;\r\n height: 40px;\r\n border: 3px solid #f3f3f3;\r\n border-top: 3px solid #1989fa;\r\n border-radius: 50%;\r\n animation: spin 1s linear infinite;\r\n}\r\n\r\n@keyframes spin {\r\n 0% { transform: rotate(0deg); }\r\n 100% { transform: rotate(360deg); }\r\n}\r\n\r\n.error-container,\r\n.empty-container {\r\n display: flex;\r\n flex-direction: column;\r\n align-items: center;\r\n justify-content: center;\r\n padding: 40px 20px;\r\n text-align: left;\r\n}\r\n\r\n.error-icon {\r\n font-size: 48px;\r\n margin-bottom: 16px;\r\n}\r\n\r\n.retry-button {\r\n margin-top: 16px;\r\n background: #1989fa;\r\n color: white;\r\n border: none;\r\n padding: 8px 16px;\r\n border-radius: 4px;\r\n cursor: pointer;\r\n transition: background-color 0.2s ease;\r\n}\r\n\r\n.retry-button:hover {\r\n background: #0066cc;\r\n}\r\n\r\n.catalogue-list {\r\n padding: 0;\r\n}\r\n\r\n.catalogue-item-wrapper {\r\n border-bottom: 1px solid #f0f0f0;\r\n}\r\n\r\n.catalogue-item-wrapper:last-child {\r\n border-bottom: none;\r\n}\r\n\r\n.catalogue-item {\r\n padding: 12px;\r\n cursor: pointer;\r\n transition: all 0.2s ease;\r\n position: relative;\r\n min-height: 44px;\r\n border-left: 3px solid transparent;\r\n}\r\n\r\n.catalogue-item:hover {\r\n background-color: #f8f9fa;\r\n}\r\n\r\n.catalogue-item:active {\r\n background-color: #e9ecef;\r\n}\r\n\r\n.item-content {\r\n display: flex;\r\n align-items: center;\r\n flex: 1;\r\n width: 100%;\r\n justify-content: flex-start;\r\n gap: 8px;\r\n}\r\n\r\n/* 拖拽手柄样式 */\r\n.drag-handle {\r\n color: #ccc;\r\n font-size: 14px;\r\n cursor: grab;\r\n transition: color 0.2s ease;\r\n flex-shrink: 0;\r\n width: 20px;\r\n text-align: center;\r\n line-height: 1;\r\n user-select: none;\r\n}\r\n\r\n.drag-handle:hover {\r\n color: #999;\r\n}\r\n\r\n.drag-handle:active {\r\n cursor: grabbing;\r\n color: #666;\r\n}\r\n\r\n/* 层级指示器样式 */\r\n.level-indicator {\r\n font-size: 10px;\r\n color: #999;\r\n flex-shrink: 0;\r\n line-height: 1;\r\n margin-right: 4px;\r\n}\r\n\r\n.level-indicator.level-1 {\r\n color: #007bff;\r\n}\r\n\r\n.level-indicator.level-2 {\r\n color: #28a745;\r\n}\r\n\r\n.level-indicator.level-3 {\r\n color: #ffc107;\r\n}\r\n\r\n.expand-icon {\r\n font-size: 12px;\r\n color: #999;\r\n transition: color 0.2s ease;\r\n flex-shrink: 0;\r\n width: 16px;\r\n text-align: center;\r\n}\r\n\r\n.catalogue-item:hover .expand-icon {\r\n color: #666;\r\n}\r\n\r\n.item-title {\r\n font-size: 14px;\r\n color: #333;\r\n line-height: 1.4;\r\n font-weight: 400;\r\n}\r\n\r\n.page-number {\r\n font-size: 12px;\r\n color: #999;\r\n margin-left: 6px;\r\n}\r\n\r\n/* 不同层级的样式 - 用颜色和字体大小区分层级 */\r\n.catalogue-item.level-0 {\r\n background: linear-gradient(90deg, transparent, rgba(0, 123, 255, 0.05), transparent);\r\n}\r\n\r\n.catalogue-item.level-0 .item-title {\r\n font-size: 15px;\r\n color: #333;\r\n font-weight: 600;\r\n}\r\n\r\n.catalogue-item.level-1 {\r\n background: linear-gradient(90deg, transparent, rgba(40, 167, 69, 0.03), transparent);\r\n}\r\n\r\n.catalogue-item.level-1 .item-title {\r\n font-size: 14px;\r\n color: #555;\r\n font-weight: 500;\r\n}\r\n\r\n.catalogue-item.level-2 {\r\n background: linear-gradient(90deg, transparent, rgba(255, 193, 7, 0.03), transparent);\r\n}\r\n\r\n.catalogue-item.level-2 .item-title {\r\n font-size: 13px;\r\n color: #666;\r\n font-weight: 400;\r\n}\r\n\r\n.catalogue-item.level-3 .item-title {\r\n font-size: 12px;\r\n color: #777;\r\n font-weight: 400;\r\n}\r\n\r\n.children-container {\r\n /* 移除背景色,保持一致性 */\r\n background: transparent;\r\n}\r\n\r\n/* 移动端适配 */\r\n@media (max-width: 768px) {\r\n .catalogue-drawer {\r\n /* 移动端安全区域适配 */\r\n padding-top: max(env(safe-area-inset-top), 20px);\r\n padding-bottom: max(env(safe-area-inset-bottom), 20px);\r\n }\r\n \r\n .drawer-header {\r\n padding: 14px 16px;\r\n }\r\n \r\n .drawer-title {\r\n font-size: 16px;\r\n }\r\n \r\n .catalogue-item {\r\n padding: 10px 8px;\r\n min-height: 44px; /* 增加触摸区域 */\r\n }\r\n \r\n .drag-handle {\r\n font-size: 16px; /* 移动端增大手柄 */\r\n width: 24px;\r\n }\r\n \r\n .item-title {\r\n font-size: 13px;\r\n }\r\n \r\n .catalogue-item.level-0 .item-title {\r\n font-size: 14px;\r\n }\r\n \r\n .page-number {\r\n font-size: 11px;\r\n }\r\n \r\n .level-indicator {\r\n font-size: 12px; /* 移动端增大指示器 */\r\n }\r\n}\r\n\r\n/* 滚动条样式 */\r\n.drawer-content::-webkit-scrollbar {\r\n width: 4px;\r\n}\r\n\r\n.drawer-content::-webkit-scrollbar-track {\r\n background: #f5f5f5;\r\n}\r\n\r\n.drawer-content::-webkit-scrollbar-thumb {\r\n background: #ccc;\r\n border-radius: 2px;\r\n}\r\n\r\n.drawer-content::-webkit-scrollbar-thumb:hover {\r\n background: #999;\r\n}\r\n\r\n/* 拖拽状态样式 */\r\n.catalogue-item.dragging {\r\n opacity: 0.5;\r\n transform: scale(0.95);\r\n background: #f0f8ff;\r\n box-shadow: 0 4px 12px rgba(0, 0, 0, 0.15);\r\n}\r\n\r\n/* 拖拽悬停目标样式 */\r\n.catalogue-item.drag-over {\r\n border-top: 2px solid #007bff;\r\n background: rgba(0, 123, 255, 0.1);\r\n}\r\n\r\n/* 增强视觉层次 */\r\n.catalogue-item {\r\n border-left: 3px solid transparent;\r\n transition: all 0.2s ease;\r\n}\r\n\r\n.catalogue-item.level-0 {\r\n border-left-color: #007bff;\r\n}\r\n\r\n.catalogue-item.level-1 {\r\n border-left-color: #28a745;\r\n}\r\n\r\n.catalogue-item.level-2 {\r\n border-left-color: #ffc107;\r\n}\r\n\r\n.catalogue-item.level-3 {\r\n border-left-color: #dc3545;\r\n}\r\n</style>\r\n","import mod from \"-!../../node_modules/@vue/vue-loader-v15/lib/index.js??vue-loader-options!./BookCatalogueDrawer.vue?vue&type=script&lang=js\"; export default mod; export * from \"-!../../node_modules/@vue/vue-loader-v15/lib/index.js??vue-loader-options!./BookCatalogueDrawer.vue?vue&type=script&lang=js\"","/* globals __VUE_SSR_CONTEXT__ */\n\n// IMPORTANT: Do NOT use ES2015 features in this file (except for modules).\n// This module is a runtime utility for cleaner component module output and will\n// be included in the final webpack user bundle.\n\nexport default function normalizeComponent(\n scriptExports,\n render,\n staticRenderFns,\n functionalTemplate,\n injectStyles,\n scopeId,\n moduleIdentifier /* server only */,\n shadowMode /* vue-cli only */\n) {\n // Vue.extend constructor export interop\n var options =\n typeof scriptExports === 'function' ? scriptExports.options : scriptExports\n\n // render functions\n if (render) {\n options.render = render\n options.staticRenderFns = staticRenderFns\n options._compiled = true\n }\n\n // functional template\n if (functionalTemplate) {\n options.functional = true\n }\n\n // scopedId\n if (scopeId) {\n options._scopeId = 'data-v-' + scopeId\n }\n\n var hook\n if (moduleIdentifier) {\n // server build\n hook = function (context) {\n // 2.3 injection\n context =\n context || // cached call\n (this.$vnode && this.$vnode.ssrContext) || // stateful\n (this.parent && this.parent.$vnode && this.parent.$vnode.ssrContext) // functional\n // 2.2 with runInNewContext: true\n if (!context && typeof __VUE_SSR_CONTEXT__ !== 'undefined') {\n context = __VUE_SSR_CONTEXT__\n }\n // inject component styles\n if (injectStyles) {\n injectStyles.call(this, context)\n }\n // register component module identifier for async chunk inferrence\n if (context && context._registeredComponents) {\n context._registeredComponents.add(moduleIdentifier)\n }\n }\n // used by ssr in case component is cached and beforeCreate\n // never gets called\n options._ssrRegister = hook\n } else if (injectStyles) {\n hook = shadowMode\n ? function () {\n injectStyles.call(\n this,\n (options.functional ? this.parent : this).$root.$options.shadowRoot\n )\n }\n : injectStyles\n }\n\n if (hook) {\n if (options.functional) {\n // for template-only hot-reload because in that case the render fn doesn't\n // go through the normalizer\n options._injectStyles = hook\n // register for functional component in vue file\n var originalRender = options.render\n options.render = function renderWithStyleInjection(h, context) {\n hook.call(context)\n return originalRender(h, context)\n }\n } else {\n // inject component registration as beforeCreate hook\n var existing = options.beforeCreate\n options.beforeCreate = existing ? [].concat(existing, hook) : [hook]\n }\n }\n\n return {\n exports: scriptExports,\n options: options\n }\n}\n","import { render, staticRenderFns } from \"./BookCatalogueDrawer.vue?vue&type=template&id=3930be62&scoped=true\"\nimport script from \"./BookCatalogueDrawer.vue?vue&type=script&lang=js\"\nexport * from \"./BookCatalogueDrawer.vue?vue&type=script&lang=js\"\nimport style0 from \"./BookCatalogueDrawer.vue?vue&type=style&index=0&id=3930be62&prod&scoped=true&lang=css\"\n\n\n/* normalize component */\nimport normalizer from \"!../../node_modules/@vue/vue-loader-v15/lib/runtime/componentNormalizer.js\"\nvar component = normalizer(\n script,\n render,\n staticRenderFns,\n false,\n null,\n \"3930be62\",\n null\n \n)\n\nexport default component.exports","<template>\r\n <div\r\n class=\"photo-album-container\"\r\n @touchstart=\"onContainerTouchStart\"\r\n @touchmove=\"onContainerTouchMove\"\r\n @touchend=\"onContainerTouchEnd\"\r\n @dblclick=\"onContainerDoubleClick\"\r\n @click=\"onContentClick\"\r\n :style=\"{ transform: `scale(${zoomScale}) translate(${translateX}px, ${translateY}px)` }\"\r\n >\r\n <div class=\"album-header\" v-if=\"false\">\r\n <h1>氪氪</h1>\r\n <!-- <p>双页模式 - 双击图片放大,滚轮缩放,拖拽翻页</p> -->\r\n </div>\r\n \r\n <div\r\n v-if=\"contentReady\"\r\n class=\"flipbook-wrapper\"\r\n @dblclick=\"onFlipbookDoubleClick\"\r\n @touchstart.capture=\"onFlipbookTouchStart\"\r\n @touchend.capture=\"onFlipbookTouchEnd\"\r\n >\r\n <!-- 仿真翻页模式 -->\r\n <flipbook\r\n v-if=\"flipMode === 'flip' && flag\"\r\n :class=\"['flipbook', isMobile ? 'mobile-mode mobile-optimized' : 'desktop-mode desktop-optimized']\"\r\n :pages=\"pages\"\r\n :pagesHiRes=\"pagesHiRes\"\r\n :startPage=\"startPage\"\r\n v-slot=\"{ page, canFlipLeft, canFlipRight }\"\r\n ref=\"flipbook\"\r\n @flip-left-end=\"onFlipLeftEnd\"\r\n @flip-right-end=\"onFlipRightEnd\"\r\n :zooms=\"null\"\r\n :ambient-light=\"0.6\"\r\n :gloss=\"0.4\"\r\n :single-page=\"isMobile\"\r\n :click-to-flip=\"false\"\r\n :wheel-to-flip=\"!isMobile\"\r\n :swipe-to-flip=\"true\"\r\n :center-pages=\"true\"\r\n >\r\n </flipbook>\r\n \r\n <!-- 滑动翻页模式 -->\r\n <div\r\n v-else-if=\"flipMode === 'slide'\"\r\n :class=\"['slide-viewer', isMobile ? 'mobile-mode mobile-optimized' : 'desktop-mode desktop-optimized']\"\r\n ref=\"slideViewer\"\r\n @touchstart=\"onSlideViewerTouchStart\"\r\n @touchmove=\"onSlideViewerTouchMove\"\r\n @touchend=\"onSlideViewerTouchEnd\"\r\n >\r\n <div class=\"slide-container\" :style=\"slideContainerStyle\">\r\n <div\r\n v-for=\"(page, index) in pages\"\r\n :key=\"index\"\r\n class=\"slide-page\"\r\n :class=\"{ 'slide-page-active': index + 1 === currentPage }\"\r\n >\r\n <img v-if=\"page\" :src=\"page\" alt=\"\" class=\"slide-page-image\" />\r\n <div v-else class=\"slide-page-placeholder\">封面/封底</div>\r\n </div>\r\n </div>\r\n </div>\r\n \r\n <!-- 淡入淡出翻页模式 -->\r\n <div\r\n v-else-if=\"flipMode === 'fade'\"\r\n :class=\"['fade-viewer', isMobile ? 'mobile-mode mobile-optimized' : 'desktop-mode desktop-optimized']\"\r\n ref=\"fadeViewer\"\r\n >\r\n <transition name=\"fade-page\" mode=\"out-in\">\r\n <div :key=\"currentPage\" class=\"fade-page-container\">\r\n <img v-if=\"pages[currentPage - 1]\" :src=\"pages[currentPage - 1]\" alt=\"\" class=\"fade-page-image\" />\r\n <div v-else class=\"fade-page-placeholder\">封面/封底</div>\r\n </div>\r\n </transition>\r\n </div>\r\n \r\n <!-- 垂直滚动模式 -->\r\n <div\r\n v-else-if=\"flipMode === 'scroll'\"\r\n :class=\"['scroll-viewer', isMobile ? 'mobile-mode mobile-optimized' : 'desktop-mode desktop-optimized']\"\r\n ref=\"scrollViewer\"\r\n @scroll=\"onScrollViewerScroll\"\r\n >\r\n <div class=\"scroll-container\">\r\n <div\r\n v-for=\"(page, index) in pages\"\r\n :key=\"index\"\r\n class=\"scroll-page\"\r\n :ref=\"'scrollPage' + index\"\r\n >\r\n <img v-if=\"page\" :src=\"page\" alt=\"\" class=\"scroll-page-image\" />\r\n <div v-else class=\"scroll-page-placeholder\">封面/封底</div>\r\n </div>\r\n </div>\r\n </div>\r\n \r\n <!-- 截断特效模式 -->\r\n <div\r\n v-else-if=\"flipMode === 'clip'\"\r\n :class=\"['clip-viewer', isMobile ? 'mobile-mode mobile-optimized' : 'desktop-mode desktop-optimized']\"\r\n ref=\"clipViewer\"\r\n >\r\n <div class=\"clip-pages-wrapper\">\r\n <!-- 当前页 -->\r\n <transition name=\"clip-current\">\r\n <div :key=\"'current-' + currentPage\" class=\"clip-page clip-page-current\">\r\n <img v-if=\"pages[currentPage - 1]\" :src=\"pages[currentPage - 1]\" alt=\"\" class=\"clip-page-image\" />\r\n <div v-else class=\"clip-page-placeholder\">封面/封底</div>\r\n </div>\r\n </transition>\r\n <!-- 下一页预览(部分可见) -->\r\n <div v-if=\"currentPage < totalPages\" class=\"clip-page clip-page-next\">\r\n <img v-if=\"pages[currentPage]\" :src=\"pages[currentPage]\" alt=\"\" class=\"clip-page-image\" />\r\n <div v-else class=\"clip-page-placeholder\">封面/封底</div>\r\n </div>\r\n </div>\r\n </div>\r\n \r\n <!-- 卡片风格模式 -->\r\n <div\r\n v-else-if=\"flipMode === 'card'\"\r\n :class=\"['card-viewer', isMobile ? 'mobile-mode mobile-optimized' : 'desktop-mode desktop-optimized']\"\r\n ref=\"cardViewer\"\r\n >\r\n <div class=\"card-stack\">\r\n <!-- 显示前后各一页的卡片堆叠效果 -->\r\n <transition-group name=\"card-flip\" tag=\"div\" class=\"card-transition-group\">\r\n <div\r\n v-for=\"(page, index) in visibleCards\"\r\n :key=\"'card-' + page.originalIndex\"\r\n class=\"card-item\"\r\n :class=\"{\r\n 'card-item-prev': page.position === 'prev',\r\n 'card-item-current': page.position === 'current',\r\n 'card-item-next': page.position === 'next'\r\n }\"\r\n :style=\"getCardStyle(page.position)\"\r\n >\r\n <div class=\"card-content\">\r\n <img v-if=\"page.src\" :src=\"page.src\" alt=\"\" class=\"card-image\" />\r\n <div v-else class=\"card-placeholder\">封面/封底</div>\r\n </div>\r\n <div class=\"card-page-number\">{{ page.originalIndex + 1 }} / {{ totalPages }}</div>\r\n </div>\r\n </transition-group>\r\n </div>\r\n </div>\r\n </div>\r\n\r\n <div class=\"controls\" :class=\"{ 'mobile-controls': isMobile, 'desktop-controls': !isMobile, 'controls-visible': showControls }\" @click.stop>\r\n <button @click=\"flipLeft\" class=\"btn btn-prev\">\r\n ← 上一页\r\n </button>\r\n <span class=\"page-indicator\">\r\n <span v-if=\"totalPages === 0\">加载中...</span>\r\n <span v-else-if=\"currentPage === 1 && totalPages > 1\">封面</span>\r\n <span v-else-if=\"currentPage === totalPages && totalPages > 1\">封底</span>\r\n <span v-else-if=\"!isMobile && totalPages > 2\">第 {{ Math.ceil((currentPage - 1) / 2) }} 组 / 共 {{ Math.ceil((totalPages - 2) / 2) }} 组</span>\r\n <span v-else-if=\"isMobile && totalPages > 2\">第 {{ Math.max(1, currentPage ) }} 页 / 共 {{ Math.max(0, totalPages - 2) }} 页</span>\r\n <span v-else-if=\"totalPages === 1\">第 1 页 / 共 1 页</span>\r\n <span v-else>第 {{ currentPage }} 页 / 共 {{ totalPages }} 页</span>\r\n </span>\r\n <button @click=\"flipRight\" class=\"btn btn-next\">\r\n 下一页 →\r\n </button>\r\n </div>\r\n\r\n <!-- 页码跳转 - 放在翻页控件下方 -->\r\n <!-- <div class=\"page-jump-container\" :class=\"{ 'mobile-page-jump': isMobile }\" @click.stop @touchstart.stop @touchmove.stop @touchend.stop @mousedown.stop @mouseup.stop>\r\n <input\r\n type=\"text\"\r\n :value=\"jumpPageInput\"\r\n @input=\"handlePageInput\"\r\n :placeholder=\"`搜索跳转`\"\r\n class=\"page-jump-input\"\r\n @click.stop\r\n @mousedown.stop\r\n @mouseup.stop\r\n />\r\n <button @click.stop=\"handleJumpToPage\" @mousedown.stop @mouseup.stop class=\"btn btn-jump\">\r\n 跳转\r\n </button>\r\n </div> -->\r\n\r\n <!-- 翻页模式切换按钮(当URL没有指定模式时显示) -->\r\n <div v-if=\"showFlipModeSelector\" class=\"flip-mode-selector\" :class=\"{ 'mobile-flip-mode-selector': isMobile }\">\r\n <button @click=\"toggleFlipModeMenu\" class=\"btn btn-flip-mode\">\r\n <span class=\"flip-mode-icon\">{{ flipModeIcon }}</span>\r\n <span class=\"flip-mode-text\">{{ flipModeLabel }}</span>\r\n </button>\r\n <div v-if=\"showFlipModeMenu\" class=\"flip-mode-menu\">\r\n <div\r\n v-for=\"mode in flipModes\"\r\n :key=\"mode.value\"\r\n class=\"flip-mode-item\"\r\n :class=\"{ 'flip-mode-item-active': flipMode === mode.value }\"\r\n @click=\"selectFlipMode(mode.value)\"\r\n >\r\n <span class=\"flip-mode-item-icon\">{{ mode.icon }}</span>\r\n <span class=\"flip-mode-item-label\">{{ mode.label }}</span>\r\n </div>\r\n </div>\r\n </div>\r\n \r\n <!-- 目录按钮 -->\r\n <div\r\n class=\"catalogue-button\"\r\n :class=\"{\r\n 'mobile-catalogue-button': isMobile,\r\n 'dragging': catalogueButtonDragging,\r\n 'catalogue-visible': showControls\r\n }\"\r\n :style=\"{\r\n left: catalogueButtonPosition.x + 'px',\r\n top: catalogueButtonPosition.y + 'px'\r\n }\"\r\n @mousedown=\"onCatalogueMouseDown\"\r\n @touchstart=\"onCatalogueTouchStart\"\r\n @touchmove=\"onCatalogueTouchMove\"\r\n @touchend=\"onCatalogueTouchEnd\"\r\n @click.stop\r\n >\r\n <button @click=\"openCatalogue\" class=\"btn btn-catalogue\">\r\n <!-- <span class=\"drag-handle\">⋮⋮</span> -->\r\n <!-- <span class=\"catalogue-icon\">☰</span> -->\r\n <span class=\"catalogue-text\">目录</span>\r\n </button>\r\n </div>\r\n \r\n <!-- 缩放提示 -->\r\n <div class=\"zoom-hint\" :class=\"{ 'show': zoomScale !== 1 }\">\r\n <div class=\"zoom-info\">\r\n <span>缩放: {{ Math.round(zoomScale * 100) }}%</span>\r\n <button @click=\"resetZoom\" class=\"btn-reset-zoom\">重置</button>\r\n </div>\r\n </div>\r\n\r\n <!-- PC端缩放工具栏 -->\r\n <div v-if=\"!isMobile\" class=\"zoom-toolbar\">\r\n <button @click=\"zoomOut\" class=\"btn-zoom\" :disabled=\"zoomScale <= 0.5\">-</button>\r\n <button @click=\"zoomIn\" class=\"btn-zoom\" :disabled=\"zoomScale >= 3\">+</button>\r\n </div>\r\n \r\n <!-- 加载状态覆盖层 -->\r\n <div v-if=\"loading\" class=\"loading-overlay\">\r\n <div class=\"loading-container\">\r\n <div class=\"loading-spinner\">\r\n <div class=\"spinner-ring\"></div>\r\n <div class=\"spinner-ring\"></div>\r\n <div class=\"spinner-ring\"></div>\r\n </div>\r\n <div class=\"loading-text\">\r\n <h3>正在加载书籍</h3>\r\n <p>请稍候,正在获取精彩内容...</p>\r\n <div class=\"loading-progress\">\r\n <div class=\"progress-bar\"></div>\r\n </div>\r\n </div>\r\n </div>\r\n </div>\r\n\r\n <!-- 错误状态 -->\r\n <div v-if=\"error && !loading\" class=\"error-container\">\r\n <div class=\"error-content\">\r\n <div class=\"error-icon\">⚠️</div>\r\n <h3>加载失败</h3>\r\n <p>{{ error.message || '网络连接异常,请检查网络后重试' }}</p>\r\n <button @click=\"fetchBooksData\" class=\"retry-btn\">\r\n <span class=\"retry-icon\">🔄</span>\r\n 重新加载\r\n </button>\r\n </div>\r\n </div>\r\n\r\n <!-- 成功状态提示(短暂显示) -->\r\n <div v-if=\"booksData && !loading && !error\" class=\"success-toast\" :class=\"{ 'show': showSuccessToast }\">\r\n 书籍加载完成\r\n </div>\r\n\r\n <!-- 书籍目录抽屉 -->\r\n <book-catalogue-drawer\r\n v-model=\"showCatalogueDrawer\"\r\n :book-id=\"bookId\"\r\n :catalogue=\"catalogue\"\r\n :loading=\"catalogueLoading\"\r\n @catalogue-click=\"onCatalogueClick\"\r\n @page-jump=\"onPageJump\"\r\n @Focus=\"onFocus\"\r\n @fetch-catalogue=\"onFetchCatalogue\"\r\n />\r\n\r\n <!-- 调试信息 -->\r\n <!-- <div class=\"debug-info\" style=\"margin-top: 20px; color: #6c757d; text-align: center; font-size: 0.9rem;\">\r\n 当前页: {{ currentPage }} / 总页数: {{ totalPages }} | 设备: {{ isMobile ? '移动端' : 'PC端' }}\r\n <br>\r\n <div v-if=\"booksData\" style=\"margin-top: 10px; padding: 10px; background: #f8f9fa; border-radius: 5px; font-family: monospace; font-size: 0.8rem; text-align: left; max-height: 200px; overflow-y: auto;\">\r\n <strong>接口返回数据:</strong><br>\r\n {{ JSON.stringify(booksData, null, 2) }}\r\n </div>\r\n </div> -->\r\n <!-- <div class=\"debug-info\" style=\"margin-top: 20px; color: #6c757d; text-align: center; font-size: 0.9rem;\">\r\n 当前页: {{ currentPage }} / 总页数: {{ totalPages }} | 设备: {{ isMobile ? '移动端' : 'PC端' }} | 模式: {{ isMobile ? '单页' : '双页' }}\r\n <br>\r\n </div> -->\r\n\r\n </div>\r\n</template>\r\n\r\n<script>\r\nimport Flipbook from 'flipbook-vue/vue2'\r\nimport BookCatalogueDrawer from './BookCatalogueDrawer.vue'\r\n\r\nexport default {\r\n name: 'PhotoAlbumView',\r\n components: {\r\n Flipbook,\r\n BookCatalogueDrawer\r\n },\r\n props: {\r\n pages: {\r\n type: Array,\r\n default: () => []\r\n },\r\n bookId: {\r\n type: String,\r\n default: ''\r\n },\r\n startPage: {\r\n type: Number,\r\n default: 1\r\n },\r\n catalogue: {\r\n type: Array,\r\n default: () => []\r\n },\r\n catalogueLoading: {\r\n type: Boolean,\r\n default: false\r\n }\r\n },\r\n data() {\r\n return {\r\n currentPage: 1,\r\n flag: true,\r\n // 设备检测\r\n isMobile: false,\r\n // 接口相关数据\r\n booksData: null,\r\n loading: false,\r\n error: null,\r\n showSuccessToast: false,\r\n // 内容就绪状态\r\n contentReady: false,\r\n // 手势缩放相关\r\n zoomScale: 1,\r\n translateX: 0,\r\n translateY: 0,\r\n lastTouchDistance: 0,\r\n lastTouchCenter: { x: 0, y: 0 },\r\n isZooming: false,\r\n isPanning: false,\r\n touchStartTime: 0,\r\n initialTouches: [],\r\n // Flipbook区域双击检测\r\n flipbookTouchStartTime: 0,\r\n flipbookLastTapTime: 0,\r\n // 目录相关\r\n showCatalogueDrawer: false,\r\n // 目录按钮拖拽相关\r\n catalogueButtonDragging: false,\r\n catalogueButtonPosition: { x: 20, y: 20 },\r\n dragStartPosition: { x: 0, y: 0 },\r\n dragOffset: { x: 0, y: 0 },\r\n // 翻页模式相关\r\n flipMode: 'flip', // flip: 仿真翻页, slide: 滑动翻页, fade: 淡入淡出, scroll: 垂直滚动\r\n showFlipModeMenu: false,\r\n flipModes: [\r\n { value: 'flip', label: '仿真翻页', icon: '📖' },\r\n { value: 'slide', label: '滑动翻页', icon: '↔️' },\r\n { value: 'fade', label: '淡入淡出', icon: '✨' },\r\n { value: 'scroll', label: '垂直滚动', icon: '📜' },\r\n { value: 'clip', label: '截断特效', icon: '✂️' },\r\n { value: 'card', label: '卡片风格', icon: '🃏' }\r\n ],\r\n // 滑动模式相关\r\n slideStartX: 0,\r\n slideCurrentX: 0,\r\n slideIsDragging: false,\r\n // URL参数控制\r\n flipModeFromUrl: false, // 翻页模式是否由URL参数指定\r\n // 控件自动隐藏相关\r\n showControls: false,\r\n hideControlsTimer: null,\r\n // 页码跳转相关\r\n jumpPageInput: ''\r\n }\r\n },\r\n computed: {\r\n totalPages() {\r\n return this.pages.length\r\n },\r\n pagesHiRes() {\r\n return this.pages\r\n },\r\n /**\r\n * 翻页模式图标\r\n */\r\n flipModeIcon() {\r\n const mode = this.flipModes.find(m => m.value === this.flipMode)\r\n return mode ? mode.icon : '📖'\r\n },\r\n /**\r\n * 翻页模式标签\r\n */\r\n flipModeLabel() {\r\n const mode = this.flipModes.find(m => m.value === this.flipMode)\r\n return mode ? mode.label : '仿真翻页'\r\n },\r\n /**\r\n * 滑动容器样式\r\n */\r\n slideContainerStyle() {\r\n const offset = -(this.currentPage - 1) * 100\r\n const dragOffset = this.slideIsDragging ? (this.slideCurrentX - this.slideStartX) / 5 : 0\r\n return {\r\n transform: `translateX(calc(${offset}% + ${dragOffset}px))`,\r\n transition: this.slideIsDragging ? 'none' : 'transform 0.3s ease-out'\r\n }\r\n },\r\n /**\r\n * 是否显示翻页模式选择器\r\n */\r\n showFlipModeSelector() {\r\n // 如果翻页模式是由URL参数指定的,则隐藏选择器\r\n return !this.flipModeFromUrl\r\n },\r\n /**\r\n * 卡片模式可见卡片\r\n */\r\n visibleCards() {\r\n const cards = []\r\n // 上一页\r\n if (this.currentPage > 1) {\r\n cards.push({\r\n src: this.pages[this.currentPage - 2],\r\n originalIndex: this.currentPage - 2,\r\n position: 'prev'\r\n })\r\n }\r\n // 当前页\r\n cards.push({\r\n src: this.pages[this.currentPage - 1],\r\n originalIndex: this.currentPage - 1,\r\n position: 'current'\r\n })\r\n // 下一页\r\n if (this.currentPage < this.totalPages) {\r\n cards.push({\r\n src: this.pages[this.currentPage],\r\n originalIndex: this.currentPage,\r\n position: 'next'\r\n })\r\n }\r\n return cards\r\n },\r\n /**\r\n * 计算当前页面显示文本\r\n */\r\n pageDisplayText() {\r\n if (this.totalPages === 0) return '加载中...'\r\n if (this.currentPage === 1 && this.totalPages > 1) return '封面'\r\n if (this.currentPage === this.totalPages && this.totalPages > 1) return '封底'\r\n \r\n if (this.isMobile) {\r\n if (this.totalPages <= 2) return `第 ${this.currentPage} 页 / 共 ${this.totalPages} 页`\r\n return `第 ${Math.max(1, this.currentPage - 1)} 页 / 共 ${Math.max(0, this.totalPages - 2)} 页`\r\n } else {\r\n if (this.totalPages <= 2) return `第 ${this.currentPage} 页 / 共 ${this.totalPages} 页`\r\n return `第 ${Math.ceil((this.currentPage - 1) / 2)} 组 / 共 ${Math.ceil((this.totalPages - 2) / 2)} 组`\r\n }\r\n }\r\n },\r\n methods: {\r\n /**\r\n * 获取书籍数据\r\n */\r\n async fetchBooksData() {\r\n try {\r\n this.loading = true\r\n this.error = null\r\n\r\n // 注释:原来从URL参数获取fileManagementId,现在改为通过props传入\r\n // const fileManagementId = this.$route.params.id || this.$route.query.id || ''\r\n // this.bookId = fileManagementId\r\n\r\n // 注释:原来调用API获取数据,现在改为通过props传入\r\n // const response = await booksApi.getBooksSlice(fileManagementId, textContent, 1, 9999)\r\n\r\n // 触发事件让父组件处理数据获取\r\n this.$emit('fetch-books-data', this.bookId)\r\n\r\n // 如果通过props传入了pages数据,直接使用\r\n if (this.pages && this.pages.length > 0) {\r\n this.booksData = { data: { records: this.pages.map(url => ({ imageUrl: url })) } }\r\n\r\n // 显示成功提示\r\n this.showSuccessToast = true\r\n setTimeout(() => {\r\n this.showSuccessToast = false\r\n }, 3000)\r\n\r\n // 检查URL参数并跳转到指定页码\r\n this.checkUrlPageParameter()\r\n }\r\n \r\n } catch (error) {\r\n console.error('获取书籍数据失败:', error)\r\n this.error = error\r\n \r\n // 显示错误信息\r\n if (error.response) {\r\n console.error('API错误响应:', error.response.data)\r\n } else if (error.request) {\r\n console.error('网络请求失败:', error.request)\r\n } else {\r\n console.error('请求配置错误:', error.message)\r\n }\r\n } finally {\r\n this.loading = false\r\n }\r\n },\r\n\r\n /**\r\n * 根据API数据更新页面\r\n * @param {Array} apiData - API返回的数据\r\n */\r\n updatePagesFromApiData(apiData) {\r\n if (!Array.isArray(apiData)) {\r\n console.warn('API数据格式不正确,期望数组格式')\r\n return\r\n }\r\n \r\n console.log('开始更新页面数据,数据长度:', apiData.length)\r\n \r\n // 这里可以根据实际的API数据结构来处理\r\n // 假设API返回的数据包含图片URL\r\n const newPages = [null] // 保留封面页\r\n \r\n apiData.forEach((item, index) => {\r\n if (item.imageUrl) {\r\n newPages.push(item.imageUrl)\r\n console.log(`添加页面 ${index + 1}:`, item.imageUrl)\r\n }\r\n })\r\n \r\n if (newPages.length > 1) {\r\n this.pages = newPages\r\n console.log('页面数据更新完成,总页数:', this.pages.length)\r\n }\r\n },\r\n\r\n /**\r\n * 检测是否为移动设备\r\n */\r\n detectMobile() {\r\n const userAgent = navigator.userAgent.toLowerCase()\r\n const mobileKeywords = ['mobile', 'android', 'iphone', 'ipad', 'ipod', 'blackberry', 'windows phone']\r\n\r\n // 检测 User Agent\r\n const isMobileUA = mobileKeywords.some(keyword => userAgent.includes(keyword))\r\n\r\n // 检测屏幕尺寸\r\n const isMobileScreen = window.innerWidth <= 768\r\n\r\n // 检测触摸支持\r\n const isTouchDevice = 'ontouchstart' in window || navigator.maxTouchPoints > 0\r\n\r\n // 综合判断\r\n this.isMobile = isMobileUA || (isMobileScreen && isTouchDevice)\r\n\r\n console.log('设备检测结果:', {\r\n userAgent: isMobileUA,\r\n screenSize: isMobileScreen,\r\n touchSupport: isTouchDevice,\r\n finalResult: this.isMobile\r\n })\r\n },\r\n\r\n /**\r\n * 预加载首页图片\r\n */\r\n async preloadFirstPage() {\r\n if (!this.pages || this.pages.length === 0) {\r\n this.contentReady = true\r\n return\r\n }\r\n\r\n const firstPageIndex = this.startPage - 1\r\n const firstPageUrl = this.pages[firstPageIndex]\r\n\r\n if (!firstPageUrl) {\r\n this.contentReady = true\r\n return\r\n }\r\n\r\n try {\r\n await new Promise((resolve, reject) => {\r\n const img = new Image()\r\n img.onload = () => resolve()\r\n img.onerror = () => resolve() // 即使失败也继续\r\n img.src = firstPageUrl\r\n\r\n // 超时保护\r\n setTimeout(() => resolve(), 3000)\r\n })\r\n } catch (error) {\r\n console.warn('首页图片预加载失败:', error)\r\n } finally {\r\n this.contentReady = true\r\n }\r\n },\r\n \r\n /**\r\n * 监听窗口尺寸变化\r\n */\r\n handleResize() {\r\n const wasMobile = this.isMobile\r\n this.detectMobile()\r\n \r\n // 如果设备类型发生变化,重新初始化flipbook\r\n if (wasMobile !== this.isMobile) {\r\n console.log('设备类型变化,重新初始化')\r\n this.$nextTick(() => {\r\n if (this.$refs.flipbook) {\r\n // 重置到第一页\r\n this.currentPage = 1\r\n this.startPage = 1\r\n }\r\n })\r\n }\r\n },\r\n flipLeft() {\r\n console.log('尝试向左翻页,当前页:', this.currentPage)\r\n if (this.flipMode === 'flip') {\r\n // 仿真翻页模式\r\n if (this.$refs.flipbook && this.currentPage > 1) {\r\n try {\r\n this.$refs.flipbook.flipLeft()\r\n console.log('向左翻页命令已发送')\r\n } catch (error) {\r\n console.error('向左翻页失败:', error)\r\n }\r\n } else {\r\n console.log('无法向左翻页 - 已在第一页或组件未就绪')\r\n }\r\n } else {\r\n // 其他模式直接切换页码\r\n if (this.currentPage > 1) {\r\n this.currentPage--\r\n this.onFlipLeftEnd(this.currentPage)\r\n }\r\n }\r\n },\r\n flipRight() {\r\n console.log('尝试向右翻页,当前页:', this.currentPage)\r\n if (this.flipMode === 'flip') {\r\n // 仿真翻页模式\r\n if (this.$refs.flipbook && this.currentPage < this.totalPages) {\r\n try {\r\n this.$refs.flipbook.flipRight()\r\n console.log('向右翻页命令已发送')\r\n } catch (error) {\r\n console.error('向右翻页失败:', error)\r\n }\r\n } else {\r\n console.log('无法向右翻页 - 已在最后一页或组件未就绪')\r\n }\r\n } else {\r\n // 其他模式直接切换页码\r\n if (this.currentPage < this.totalPages) {\r\n this.currentPage++\r\n this.onFlipRightEnd(this.currentPage)\r\n }\r\n }\r\n },\r\n onFlipLeftEnd(page) {\r\n console.log('向左翻页完成,新页面:', page)\r\n this.currentPage = page\r\n // 触发页码变化事件\r\n this.$emit('page-change', page)\r\n // 记录阅读进度\r\n this.recordReadingProgress(page)\r\n },\r\n onFlipRightEnd(page) {\r\n console.log('向右翻页完成,新页面:', page)\r\n this.currentPage = page\r\n // 触发页码变化事件\r\n this.$emit('page-change', page)\r\n // 记录阅读进度\r\n this.recordReadingProgress(page)\r\n },\r\n \r\n /**\r\n * 容器触摸开始事件\r\n */\r\n onContainerTouchStart(e) {\r\n this.touchStartTime = Date.now()\r\n this.initialTouches = Array.from(e.touches)\r\n \r\n if (e.touches.length === 2) {\r\n // 双指缩放\r\n this.isZooming = true\r\n this.lastTouchDistance = this.getTouchDistance(e.touches[0], e.touches[1])\r\n this.lastTouchCenter = this.getTouchCenter(e.touches[0], e.touches[1])\r\n e.preventDefault()\r\n } else if (e.touches.length === 1 && this.zoomScale > 1) {\r\n // 单指拖拽(仅在放大状态下)\r\n this.isPanning = true\r\n this.lastTouchCenter = { x: e.touches[0].clientX, y: e.touches[0].clientY }\r\n }\r\n },\r\n \r\n /**\r\n * 容器触摸移动事件\r\n */\r\n onContainerTouchMove(e) {\r\n if (this.isZooming && e.touches.length === 2) {\r\n // 双指缩放\r\n const currentDistance = this.getTouchDistance(e.touches[0], e.touches[1])\r\n const currentCenter = this.getTouchCenter(e.touches[0], e.touches[1])\r\n \r\n // 计算缩放比例\r\n const scaleChange = currentDistance / this.lastTouchDistance\r\n let newScale = this.zoomScale * scaleChange\r\n \r\n // 限制缩放范围\r\n newScale = Math.max(0.5, Math.min(3, newScale))\r\n \r\n // 计算缩放中心点的偏移\r\n const deltaX = currentCenter.x - this.lastTouchCenter.x\r\n const deltaY = currentCenter.y - this.lastTouchCenter.y\r\n \r\n this.zoomScale = newScale\r\n this.translateX += deltaX\r\n this.translateY += deltaY\r\n \r\n this.lastTouchDistance = currentDistance\r\n this.lastTouchCenter = currentCenter\r\n \r\n e.preventDefault()\r\n } else if (this.isPanning && e.touches.length === 1 && this.zoomScale > 1) {\r\n // 单指拖拽\r\n const deltaX = e.touches[0].clientX - this.lastTouchCenter.x\r\n const deltaY = e.touches[0].clientY - this.lastTouchCenter.y\r\n \r\n this.translateX += deltaX\r\n this.translateY += deltaY\r\n \r\n this.lastTouchCenter = { x: e.touches[0].clientX, y: e.touches[0].clientY }\r\n \r\n e.preventDefault()\r\n }\r\n },\r\n \r\n /**\r\n * 容器触摸结束事件\r\n */\r\n onContainerTouchEnd(e) {\r\n const touchDuration = Date.now() - this.touchStartTime\r\n const wasZooming = this.isZooming\r\n const wasPanning = this.isPanning\r\n\r\n // 先重置状态\r\n this.isZooming = false\r\n this.isPanning = false\r\n\r\n // 双击重置缩放 - 只在单指快速点击时检测\r\n if (e.changedTouches.length === 1 && touchDuration < 300 && !wasZooming && !wasPanning) {\r\n const now = Date.now()\r\n if (this.lastTapTime && now - this.lastTapTime < 400) {\r\n // 检测到双击\r\n this.resetZoom()\r\n console.log('移动端双击重置显示比例')\r\n this.lastTapTime = 0 // 重置,避免三击触发\r\n } else {\r\n this.lastTapTime = now\r\n }\r\n }\r\n\r\n // 边界检查和回弹\r\n this.constrainPosition()\r\n },\r\n \r\n /**\r\n * 获取两点间距离\r\n */\r\n getTouchDistance(touch1, touch2) {\r\n const dx = touch1.clientX - touch2.clientX\r\n const dy = touch1.clientY - touch2.clientY\r\n return Math.sqrt(dx * dx + dy * dy)\r\n },\r\n \r\n /**\r\n * 获取两点中心\r\n */\r\n getTouchCenter(touch1, touch2) {\r\n return {\r\n x: (touch1.clientX + touch2.clientX) / 2,\r\n y: (touch1.clientY + touch2.clientY) / 2\r\n }\r\n },\r\n \r\n /**\r\n * 重置缩放\r\n */\r\n resetZoom() {\r\n this.zoomScale = 1\r\n this.translateX = 0\r\n this.translateY = 0\r\n },\r\n\r\n /**\r\n * 放大\r\n */\r\n zoomIn() {\r\n this.zoomScale = Math.min(3, this.zoomScale + 0.2)\r\n },\r\n\r\n /**\r\n * 缩小\r\n */\r\n zoomOut() {\r\n this.zoomScale = Math.max(0.5, this.zoomScale - 0.2)\r\n },\r\n \r\n /**\r\n * PC端双击事件处理\r\n */\r\n onContainerDoubleClick(e) {\r\n // 阻止事件冒泡和默认行为,避免触发翻页\r\n e.preventDefault()\r\n e.stopPropagation()\r\n\r\n // 重置缩放比例\r\n this.resetZoom()\r\n console.log('容器双击重置显示比例,当前缩放:', this.zoomScale)\r\n },\r\n\r\n /**\r\n * Flipbook区域双击事件处理\r\n */\r\n onFlipbookDoubleClick(e) {\r\n // 阻止事件冒泡和默认行为,避免触发翻页\r\n e.preventDefault()\r\n e.stopPropagation()\r\n\r\n // 重置缩放比例\r\n this.resetZoom()\r\n console.log('Flipbook双击重置显示比例,当前缩放:', this.zoomScale)\r\n },\r\n\r\n /**\r\n * Flipbook区域触摸开始事件\r\n */\r\n onFlipbookTouchStart(e) {\r\n this.flipbookTouchStartTime = Date.now()\r\n },\r\n\r\n /**\r\n * Flipbook区域触摸结束事件(移动端双击检测)\r\n */\r\n onFlipbookTouchEnd(e) {\r\n const touchDuration = Date.now() - this.flipbookTouchStartTime\r\n\r\n // 双击重置缩放 - 只在单指快速点击时检测\r\n if (e.changedTouches.length === 1 && touchDuration < 300) {\r\n const now = Date.now()\r\n if (this.flipbookLastTapTime && now - this.flipbookLastTapTime < 400) {\r\n // 检测到双击\r\n e.preventDefault()\r\n e.stopPropagation()\r\n this.resetZoom()\r\n console.log('Flipbook区域移动端双击重置显示比例')\r\n this.flipbookLastTapTime = 0 // 重置,避免三击触发\r\n } else {\r\n this.flipbookLastTapTime = now\r\n }\r\n }\r\n },\r\n \r\n /**\r\n * 约束位置在边界内\r\n */\r\n constrainPosition() {\r\n if (this.zoomScale <= 1) {\r\n this.translateX = 0\r\n this.translateY = 0\r\n return\r\n }\r\n \r\n const maxTranslate = (this.zoomScale - 1) * 200\r\n this.translateX = Math.max(-maxTranslate, Math.min(maxTranslate, this.translateX))\r\n this.translateY = Math.max(-maxTranslate, Math.min(maxTranslate, this.translateY))\r\n },\r\n\r\n\r\n /**\r\n * 打开目录抽屉\r\n */\r\n openCatalogue() {\r\n console.log('点击目录按钮', {\r\n dragging: this.catalogueButtonDragging,\r\n showDrawer: this.showCatalogueDrawer\r\n })\r\n \r\n // 只有在不是拖拽状态下才打开目录\r\n if (!this.catalogueButtonDragging) {\r\n this.showCatalogueDrawer = true\r\n console.log('目录抽屉已打开')\r\n } else {\r\n console.log('拖拽状态中,不打开目录')\r\n }\r\n },\r\n\r\n /**\r\n * 目录按钮拖拽开始\r\n */\r\n onCatalogueMouseDown(e) {\r\n // 不立即设置为拖拽状态,等待移动再判断\r\n this.catalogueButtonDragging = false\r\n \r\n const rect = e.target.closest('.catalogue-button').getBoundingClientRect()\r\n this.dragStartPosition = {\r\n x: e.clientX,\r\n y: e.clientY\r\n }\r\n this.dragOffset = {\r\n x: e.clientX - rect.left,\r\n y: e.clientY - rect.top\r\n }\r\n \r\n document.addEventListener('mousemove', this.onCatalogueMouseMove)\r\n document.addEventListener('mouseup', this.onCatalogueMouseUp)\r\n },\r\n\r\n /**\r\n * 目录按钮拖拽移动\r\n */\r\n onCatalogueMouseMove(e) {\r\n // 检查是否开始拖拽\r\n const dragDistance = Math.sqrt(\r\n Math.pow(e.clientX - this.dragStartPosition.x, 2) + \r\n Math.pow(e.clientY - this.dragStartPosition.y, 2)\r\n )\r\n \r\n // 只有移动距离超过5px才认为是拖拽\r\n if (dragDistance > 5) {\r\n this.catalogueButtonDragging = true\r\n }\r\n \r\n if (!this.catalogueButtonDragging) return\r\n \r\n e.preventDefault()\r\n \r\n const newX = e.clientX - this.dragOffset.x\r\n const newY = e.clientY - this.dragOffset.y\r\n \r\n // 限制在视窗范围内\r\n const maxX = window.innerWidth - 120 // 按钮宽度约120px\r\n const maxY = window.innerHeight - 50 // 按钮高度约50px\r\n \r\n this.catalogueButtonPosition = {\r\n x: Math.max(0, Math.min(maxX, newX)),\r\n y: Math.max(0, Math.min(maxY, newY))\r\n }\r\n },\r\n\r\n /**\r\n * 目录按钮拖拽结束\r\n */\r\n onCatalogueMouseUp(e) {\r\n // 立即重置拖拽状态\r\n this.catalogueButtonDragging = false\r\n \r\n document.removeEventListener('mousemove', this.onCatalogueMouseMove)\r\n document.removeEventListener('mouseup', this.onCatalogueMouseUp)\r\n },\r\n\r\n /**\r\n * 目录按钮触摸开始(移动端)\r\n */\r\n onCatalogueTouchStart(e) {\r\n // 不立即设置为拖拽状态\r\n this.catalogueButtonDragging = false\r\n \r\n const touch = e.touches[0]\r\n const rect = e.target.closest('.catalogue-button').getBoundingClientRect()\r\n \r\n this.dragStartPosition = {\r\n x: touch.clientX,\r\n y: touch.clientY\r\n }\r\n this.dragOffset = {\r\n x: touch.clientX - rect.left,\r\n y: touch.clientY - rect.top\r\n }\r\n },\r\n\r\n /**\r\n * 目录按钮触摸移动(移动端)\r\n */\r\n onCatalogueTouchMove(e) {\r\n const touch = e.touches[0]\r\n \r\n // 检查是否开始拖拽\r\n const dragDistance = Math.sqrt(\r\n Math.pow(touch.clientX - this.dragStartPosition.x, 2) + \r\n Math.pow(touch.clientY - this.dragStartPosition.y, 2)\r\n )\r\n \r\n // 只有移动距离超过5px才认为是拖拽\r\n if (dragDistance > 5) {\r\n this.catalogueButtonDragging = true\r\n }\r\n \r\n if (!this.catalogueButtonDragging) return\r\n \r\n e.preventDefault()\r\n \r\n const newX = touch.clientX - this.dragOffset.x\r\n const newY = touch.clientY - this.dragOffset.y\r\n \r\n // 限制在视窗范围内,考虑安全区域\r\n const maxX = window.innerWidth - 120\r\n const maxY = window.innerHeight - 80\r\n \r\n this.catalogueButtonPosition = {\r\n x: Math.max(15, Math.min(maxX, newX)),\r\n y: Math.max(15, Math.min(maxY, newY))\r\n }\r\n },\r\n\r\n /**\r\n * 目录按钮触摸结束(移动端)\r\n */\r\n onCatalogueTouchEnd(e) {\r\n // 立即重置拖拽状态\r\n this.catalogueButtonDragging = false\r\n },\r\n \r\n /**\r\n * 切换翻页模式菜单显示\r\n */\r\n toggleFlipModeMenu() {\r\n this.showFlipModeMenu = !this.showFlipModeMenu\r\n },\r\n \r\n /**\r\n * 选择翻页模式\r\n * @param {string} mode - 翻页模式\r\n */\r\n selectFlipMode(mode) {\r\n const oldMode = this.flipMode\r\n this.flipMode = mode\r\n this.showFlipModeMenu = false\r\n \r\n // 保存翻页模式到本地存储\r\n localStorage.setItem('book-viewer-flip-mode', mode)\r\n \r\n console.log('切换翻页模式:', { from: oldMode, to: mode })\r\n \r\n // 如果切换到滚动模式,需要滚动到当前页\r\n if (mode === 'scroll') {\r\n this.$nextTick(() => {\r\n this.scrollToCurrentPage()\r\n })\r\n }\r\n },\r\n \r\n /**\r\n * 滑动模式触摸开始\r\n */\r\n onSlideViewerTouchStart(e) {\r\n if (e.touches.length === 1) {\r\n this.slideStartX = e.touches[0].clientX\r\n this.slideCurrentX = e.touches[0].clientX\r\n this.slideIsDragging = true\r\n }\r\n },\r\n \r\n /**\r\n * 滑动模式触摸移动\r\n */\r\n onSlideViewerTouchMove(e) {\r\n if (this.slideIsDragging && e.touches.length === 1) {\r\n this.slideCurrentX = e.touches[0].clientX\r\n e.preventDefault()\r\n }\r\n },\r\n \r\n /**\r\n * 滑动模式触摸结束\r\n */\r\n onSlideViewerTouchEnd(e) {\r\n if (this.slideIsDragging) {\r\n const deltaX = this.slideCurrentX - this.slideStartX\r\n const threshold = 50 // 滑动阈值\r\n \r\n if (deltaX > threshold && this.currentPage > 1) {\r\n // 向右滑动,上一页\r\n this.currentPage--\r\n this.recordReadingProgress(this.currentPage)\r\n } else if (deltaX < -threshold && this.currentPage < this.totalPages) {\r\n // 向左滑动,下一页\r\n this.currentPage++\r\n this.recordReadingProgress(this.currentPage)\r\n }\r\n \r\n this.slideIsDragging = false\r\n }\r\n },\r\n \r\n /**\r\n * 滚动模式滚动事件\r\n */\r\n onScrollViewerScroll(e) {\r\n const container = this.$refs.scrollViewer\r\n if (!container) return\r\n \r\n const scrollTop = container.scrollTop\r\n const containerHeight = container.clientHeight\r\n \r\n // 计算当前页码\r\n for (let i = 0; i < this.pages.length; i++) {\r\n const pageRef = this.$refs['scrollPage' + i]\r\n if (pageRef && pageRef[0]) {\r\n const pageTop = pageRef[0].offsetTop\r\n const pageBottom = pageTop + pageRef[0].offsetHeight\r\n \r\n if (scrollTop >= pageTop - containerHeight / 2 && scrollTop < pageBottom - containerHeight / 2) {\r\n if (this.currentPage !== i + 1) {\r\n this.currentPage = i + 1\r\n this.recordReadingProgress(this.currentPage)\r\n }\r\n break\r\n }\r\n }\r\n }\r\n },\r\n \r\n /**\r\n * 滚动到当前页\r\n */\r\n scrollToCurrentPage() {\r\n if (this.flipMode !== 'scroll') return\r\n \r\n const pageRef = this.$refs['scrollPage' + (this.currentPage - 1)]\r\n if (pageRef && pageRef[0]) {\r\n pageRef[0].scrollIntoView({ behavior: 'smooth', block: 'start' })\r\n }\r\n },\r\n \r\n /**\r\n * 关闭翻页模式菜单(点击外部)\r\n */\r\n closeFlipModeMenu(e) {\r\n if (!e.target.closest('.flip-mode-selector')) {\r\n this.showFlipModeMenu = false\r\n }\r\n },\r\n \r\n /**\r\n * 获取卡片样式\r\n * @param {string} position - 卡片位置:prev, current, next\r\n */\r\n getCardStyle(position) {\r\n switch (position) {\r\n case 'prev':\r\n return {\r\n transform: 'translateX(-70%) scale(0.85) rotateY(15deg)',\r\n zIndex: 1,\r\n opacity: 0.6,\r\n filter: 'brightness(0.8)'\r\n }\r\n case 'current':\r\n return {\r\n transform: 'translateX(0) scale(1) rotateY(0deg)',\r\n zIndex: 3,\r\n opacity: 1,\r\n filter: 'brightness(1)'\r\n }\r\n case 'next':\r\n return {\r\n transform: 'translateX(70%) scale(0.85) rotateY(-15deg)',\r\n zIndex: 1,\r\n opacity: 0.6,\r\n filter: 'brightness(0.8)'\r\n }\r\n default:\r\n return {}\r\n }\r\n },\r\n\r\n /**\r\n * 目录项点击事件\r\n * @param {Object} item - 点击的目录项\r\n */\r\n onCatalogueClick(item) {\r\n console.log('目录项被点击:', item)\r\n this.$emit('catalogue-click', item)\r\n },\r\n\r\n /**\r\n * 获取目录数据事件\r\n * @param {String} bookId - 书籍ID\r\n */\r\n onFetchCatalogue(bookId) {\r\n this.$emit('fetch-catalogue', bookId)\r\n },\r\n\r\n /**\r\n * 页面跳转事件\r\n * @param {number} pageNumber - 目标页码\r\n */\r\n onFocus() {\r\n // 使用flipbook的方法跳转到指定页面\r\n if (this.flipMode === 'flip') {\r\n this.flag = false\r\n setTimeout(() => {\r\n this.flag = true\r\n }, 500)\r\n } else if (this.flipMode === 'scroll') {\r\n this.scrollToCurrentPage()\r\n }\r\n },\r\n onPageJump(pageNumber) {\r\n console.log('跳转到页面:', pageNumber)\r\n\r\n // 关闭目录抽屉\r\n this.showCatalogueDrawer = false\r\n\r\n // 跳转到指定页面\r\n if (pageNumber && pageNumber >= 1 && pageNumber <= this.totalPages) {\r\n this.currentPage = pageNumber\r\n this.startPage = pageNumber\r\n\r\n // 记录阅读进度\r\n this.recordReadingProgress(pageNumber)\r\n\r\n // 使用flipbook的方法跳转到指定页面\r\n if (this.flipMode === 'flip') {\r\n this.flag = false\r\n setTimeout(() => {\r\n this.flag = true\r\n this.$nextTick(() => {\r\n this.$refs.flipbook.goToPage(pageNumber)\r\n })\r\n }, 500)\r\n } else if (this.flipMode === 'scroll') {\r\n this.scrollToCurrentPage()\r\n }\r\n } else {\r\n console.warn('无效的页码:', pageNumber)\r\n }\r\n },\r\n\r\n /**\r\n * 检查URL参数并跳转到指定页码\r\n */\r\n checkUrlPageParameter() {\r\n // 从URL查询参数中获取页码\r\n const pageParam = this.$route.query.page\r\n \r\n if (pageParam) {\r\n const targetPage = parseInt(pageParam, 10)\r\n \r\n console.log('检测到URL页码参数:', {\r\n pageParam,\r\n targetPage,\r\n totalPages: this.totalPages\r\n })\r\n \r\n // 验证页码是否有效\r\n if (!isNaN(targetPage) && targetPage >= 1 && targetPage <= this.totalPages) {\r\n console.log('准备跳转到页码:', targetPage)\r\n \r\n // 使用nextTick确保DOM已更新\r\n this.$nextTick(() => {\r\n this.jumpToPage(targetPage)\r\n })\r\n } else {\r\n console.warn('无效的页码参数:', {\r\n pageParam,\r\n targetPage,\r\n totalPages: this.totalPages,\r\n isValid: !isNaN(targetPage) && targetPage >= 1 && targetPage <= this.totalPages\r\n })\r\n }\r\n } else {\r\n console.log('URL中未检测到页码参数')\r\n }\r\n },\r\n\r\n /**\r\n * 跳转到指定页码\r\n * @param {number} pageNumber - 目标页码\r\n */\r\n jumpToPage(pageNumber) {\r\n if (!pageNumber || pageNumber < 1 || pageNumber > this.totalPages) {\r\n console.warn('无效的页码:', pageNumber)\r\n return\r\n }\r\n\r\n console.log('跳转到页面:', pageNumber)\r\n \r\n // 更新当前页码和起始页码\r\n this.currentPage = pageNumber\r\n this.startPage = pageNumber\r\n \r\n // 记录阅读进度\r\n this.recordReadingProgress(pageNumber)\r\n \r\n // 使用flipbook的方法跳转到指定页面\r\n if (this.flipMode === 'flip') {\r\n if (this.$refs.flipbook && this.$refs.flipbook.goToPage) {\r\n try {\r\n this.$refs.flipbook.goToPage(pageNumber)\r\n console.log('页面跳转成功:', pageNumber)\r\n } catch (error) {\r\n console.error('页面跳转失败:', error)\r\n }\r\n } else {\r\n console.warn('Flipbook组件未就绪,无法跳转页面')\r\n }\r\n } else if (this.flipMode === 'scroll') {\r\n this.scrollToCurrentPage()\r\n }\r\n // slide 和 fade 模式直接通过 currentPage 变化来切换\r\n },\r\n\r\n /**\r\n * 记录阅读进度\r\n * @param {number} pageNumber - 当前页码\r\n */\r\n async recordReadingProgress(pageNumber) {\r\n if (!this.bookId || !pageNumber) {\r\n console.warn('缺少书籍ID或页码,无法记录阅读进度')\r\n return\r\n }\r\n\r\n try {\r\n console.log('记录阅读进度:', {\r\n bookId: this.bookId,\r\n pageNumber: pageNumber\r\n })\r\n\r\n // 注释:原来调用API记录进度,现在改为触发事件让父组件处理\r\n // await booksApi.recordReadProgress(this.bookId, pageNumber)\r\n this.$emit('record-progress', { bookId: this.bookId, pageNumber })\r\n\r\n console.log('阅读进度记录成功')\r\n\r\n } catch (error) {\r\n console.error('记录阅读进度失败:', error)\r\n // 阅读记录失败不影响用户体验,只记录日志\r\n }\r\n },\r\n\r\n /**\r\n * 显示控件\r\n */\r\n showControlsTemporarily() {\r\n this.showControls = true\r\n\r\n // 清除之前的定时器\r\n if (this.hideControlsTimer) {\r\n clearTimeout(this.hideControlsTimer)\r\n }\r\n\r\n // 3秒后自动隐藏\r\n this.hideControlsTimer = setTimeout(() => {\r\n this.showControls = false\r\n }, 3000)\r\n },\r\n\r\n /**\r\n * 内容区域点击事件\r\n */\r\n onContentClick() {\r\n this.showControlsTemporarily()\r\n },\r\n\r\n /**\r\n * 处理页码输入\r\n */\r\n handlePageInput(e) {\r\n const value = e.target.value\r\n // 只允许输入数字\r\n const numValue = value.replace(/[^\\d]/g, '')\r\n // 限制不超过总页数\r\n if (numValue && parseInt(numValue) > this.totalPages) {\r\n this.jumpPageInput = this.totalPages.toString()\r\n } else {\r\n this.jumpPageInput = numValue\r\n }\r\n },\r\n\r\n /**\r\n * 执行页码跳转\r\n */\r\n handleJumpToPage() {\r\n const pageNum = parseInt(this.jumpPageInput)\r\n if (pageNum && pageNum >= 1 && pageNum <= this.totalPages) {\r\n // 重置缩放和位移,避免内容区域缩小\r\n this.resetZoom()\r\n this.jumpToPage(pageNum)\r\n this.jumpPageInput = ''\r\n }\r\n }\r\n },\r\n watch: {\r\n async pages(newPages) {\r\n if (newPages && newPages.length > 0 && this.isMobile) {\r\n this.contentReady = false\r\n await this.$nextTick()\r\n await this.preloadFirstPage()\r\n } else if (newPages && newPages.length > 0) {\r\n this.contentReady = true\r\n }\r\n }\r\n },\r\n async mounted() {\r\n console.log('组件已挂载,总页数:', this.totalPages)\r\n\r\n // 检测设备类型\r\n this.detectMobile()\r\n\r\n // 检查URL参数中的翻页模式\r\n const urlFlipMode = this.$route.query.mode || this.$route.query.flipMode\r\n if (urlFlipMode && this.flipModes.some(m => m.value === urlFlipMode)) {\r\n // URL参数指定的翻页模式优先级最高,并隐藏切换按钮\r\n this.flipMode = urlFlipMode\r\n this.flipModeFromUrl = true\r\n console.log('从URL参数读取翻页模式:', urlFlipMode)\r\n } else {\r\n // 否则从本地存储恢复\r\n const savedFlipMode = localStorage.getItem('book-viewer-flip-mode')\r\n if (savedFlipMode && this.flipModes.some(m => m.value === savedFlipMode)) {\r\n this.flipMode = savedFlipMode\r\n }\r\n }\r\n\r\n // 预加载首页图片(移动端优化)\r\n if (this.isMobile && this.pages && this.pages.length > 0) {\r\n await this.$nextTick()\r\n await this.preloadFirstPage()\r\n } else if (this.pages && this.pages.length > 0) {\r\n this.contentReady = true\r\n }\r\n\r\n // 监听窗口尺寸变化\r\n window.addEventListener('resize', this.handleResize)\r\n\r\n // 监听点击事件,用于关闭翻页模式菜单\r\n document.addEventListener('click', this.closeFlipModeMenu)\r\n },\r\n \r\n beforeDestroy() {\r\n // 清理事件监听\r\n window.removeEventListener('resize', this.handleResize)\r\n // 清理拖拽事件监听\r\n document.removeEventListener('mousemove', this.onCatalogueMouseMove)\r\n document.removeEventListener('mouseup', this.onCatalogueMouseUp)\r\n // 清理翻页模式菜单事件监听\r\n document.removeEventListener('click', this.closeFlipModeMenu)\r\n // 清理控件自动隐藏定时器\r\n if (this.hideControlsTimer) {\r\n clearTimeout(this.hideControlsTimer)\r\n }\r\n }\r\n}\r\n</script>\r\n\r\n<style scoped>\r\n.photo-album-container {\r\n /* min-height: 100vh; */\r\n background: transparent;\r\n padding: 5px 5px 80px 5px;\r\n display: flex;\r\n flex-direction: column;\r\n align-items: center;\r\n justify-content: center;\r\n transform-origin: center center;\r\n transition: transform 0.2s ease-out;\r\n overflow: hidden;\r\n position: relative;\r\n}\r\n\r\n.album-header {\r\n text-align: center;\r\n color: #495057;\r\n margin-bottom: 30px;\r\n}\r\n\r\n.album-header h1 {\r\n font-size: 2.5rem;\r\n margin-bottom: 10px;\r\n text-shadow: 1px 1px 2px rgba(0,0,0,0.1);\r\n font-weight: 600;\r\n}\r\n\r\n.album-header p {\r\n font-size: 1.1rem;\r\n opacity: 0.9;\r\n}\r\n\r\n.flipbook-wrapper {\r\n perspective: 2000px;\r\n margin-bottom: 20px;\r\n display: flex;\r\n justify-content: center;\r\n align-items: center;\r\n width: 100%;\r\n}\r\n\r\n.flipbook {\r\n width: 1600px;\r\n height: 1200px;\r\n box-shadow: none;\r\n border-radius: 0;\r\n overflow: hidden;\r\n transition: all 0.3s ease;\r\n}\r\n\r\n/* 隐藏标题时的调整 */\r\n.album-header[style*=\"display: none\"],\r\n.album-header[v-if=\"false\"] {\r\n display: none !important;\r\n}\r\n\r\n.photo-album-container:has(.album-header[v-if=\"false\"]) .flipbook,\r\n.photo-album-container .flipbook {\r\n max-height: calc(100vh - 100px);\r\n}\r\n\r\n/* 移动端单页模式样式 */\r\n.flipbook.mobile-mode {\r\n width: 100%;\r\n max-width: none;\r\n height: 92vh;\r\n max-height: 92vh;\r\n margin: 0 auto;\r\n}\r\n\r\n/* PC端双页模式样式 */\r\n.flipbook.desktop-mode {\r\n width: 1600px;\r\n height: 1200px;\r\n margin: 0 auto;\r\n}\r\n\r\n.page {\r\n background: white;\r\n display: flex;\r\n flex-direction: column;\r\n justify-content: center;\r\n align-items: center;\r\n position: relative;\r\n border-radius: 5px;\r\n}\r\n\r\n.page--cover {\r\n background: linear-gradient(45deg, #e9ecef 0%, #dee2e6 50%, #ced4da 100%);\r\n color: #495057;\r\n}\r\n\r\n.cover-page, .back-cover {\r\n text-align: center;\r\n height: 100%;\r\n display: flex;\r\n flex-direction: column;\r\n justify-content: center;\r\n align-items: center;\r\n padding: 40px;\r\n}\r\n\r\n.cover-page h2 {\r\n font-size: 3rem;\r\n margin-bottom: 20px;\r\n text-shadow: 2px 2px 4px rgba(0,0,0,0.3);\r\n font-weight: bold;\r\n}\r\n\r\n.cover-page p {\r\n font-size: 1.5rem;\r\n opacity: 0.9;\r\n margin-bottom: 30px;\r\n}\r\n\r\n.cover-decoration {\r\n display: flex;\r\n align-items: center;\r\n gap: 15px;\r\n margin-top: 20px;\r\n}\r\n\r\n.decoration-line {\r\n width: 60px;\r\n height: 2px;\r\n background: rgba(73,80,87,0.6);\r\n border-radius: 1px;\r\n}\r\n\r\n.cover-decoration span {\r\n font-size: 1.1rem;\r\n opacity: 0.9;\r\n white-space: nowrap;\r\n}\r\n\r\n.back-cover h3 {\r\n font-size: 2.5rem;\r\n margin-bottom: 15px;\r\n text-shadow: 2px 2px 4px rgba(0,0,0,0.3);\r\n}\r\n\r\n.back-cover p {\r\n font-size: 1.2rem;\r\n opacity: 0.8;\r\n margin-bottom: 30px;\r\n}\r\n\r\n.back-decoration p {\r\n font-size: 1.5rem;\r\n margin-bottom: 10px;\r\n}\r\n\r\n.back-decoration small {\r\n opacity: 0.7;\r\n font-size: 1rem;\r\n}\r\n\r\n.content-page {\r\n padding: 20px;\r\n height: 100%;\r\n width: 100%;\r\n box-sizing: border-box;\r\n display: flex;\r\n flex-direction: column;\r\n justify-content: space-between;\r\n}\r\n\r\n.image-container {\r\n flex: 1;\r\n display: flex;\r\n justify-content: center;\r\n align-items: center;\r\n margin-bottom: 0;\r\n width: 100%;\r\n height: 100%;\r\n overflow: hidden;\r\n}\r\n\r\n.image-container img {\r\n max-width: 100%;\r\n max-height: 100%;\r\n width: auto;\r\n height: auto;\r\n object-fit: contain;\r\n border-radius: 8px;\r\n box-shadow: 0 4px 12px rgba(0,0,0,0.1);\r\n transition: transform 0.3s ease;\r\n}\r\n\r\n.image-container img:hover {\r\n transform: scale(1.02);\r\n}\r\n\r\n.page-content-info {\r\n background: rgba(255,255,255,0.95);\r\n padding: 8px;\r\n border-radius: 12px;\r\n box-shadow: 0 2px 8px rgba(0,0,0,0.1);\r\n backdrop-filter: blur(10px);\r\n margin-top: 4px;\r\n flex-shrink: 0;\r\n}\r\n\r\n.image-title {\r\n font-size: 1.2rem;\r\n font-weight: bold;\r\n color: #2c3e50;\r\n margin-bottom: 8px;\r\n text-align: center;\r\n display: block;\r\n}\r\n\r\n.image-description {\r\n font-size: 0.9rem;\r\n color: #5a6c7d;\r\n line-height: 1.4;\r\n text-align: center;\r\n margin-bottom: 10px;\r\n display: block;\r\n}\r\n\r\n.page-number {\r\n text-align: center;\r\n padding-top: 10px;\r\n border-top: 1px solid rgba(0,0,0,0.1);\r\n}\r\n\r\n.page-number span {\r\n background: linear-gradient(45deg, #667eea, #764ba2);\r\n color: white;\r\n padding: 4px 12px;\r\n border-radius: 12px;\r\n font-size: 0.8rem;\r\n font-weight: bold;\r\n}\r\n\r\n.controls {\r\n display: flex;\r\n align-items: center;\r\n justify-content: center;\r\n gap: 12px;\r\n background: transparent;\r\n padding: 12px 20px;\r\n border-radius: 0;\r\n backdrop-filter: none;\r\n box-shadow: none;\r\n border: none;\r\n width: fit-content;\r\n margin: 20px auto;\r\n z-index: 1000;\r\n}\r\n\r\n.desktop-controls {\r\n position: relative;\r\n margin: 20px auto;\r\n}\r\n\r\n.mobile-controls {\r\n position: fixed;\r\n bottom: 20px;\r\n left: 50%;\r\n transform: translateX(-50%);\r\n margin: 0;\r\n max-width: 90vw;\r\n}\r\n\r\n.btn {\r\n background: #333;\r\n color: white;\r\n border: 1px solid #666;\r\n padding: 8px 16px;\r\n border-radius: 4px;\r\n cursor: pointer;\r\n font-size: 0.9rem;\r\n transition: all 0.3s ease;\r\n box-shadow: none;\r\n}\r\n\r\n.btn:hover:not(:disabled) {\r\n background: #555;\r\n transform: none;\r\n box-shadow: none;\r\n}\r\n\r\n.btn:disabled {\r\n opacity: 0.5;\r\n cursor: not-allowed;\r\n transform: none;\r\n}\r\n\r\n.page-indicator {\r\n color: #495057;\r\n font-size: 0.95rem;\r\n font-weight: bold;\r\n text-shadow: none;\r\n min-width: 70px;\r\n text-align: center;\r\n}\r\n\r\n/* 页码跳转容器样式 */\r\n.page-jump-container {\r\n display: flex;\r\n align-items: center;\r\n justify-content: center;\r\n gap: 8px;\r\n background: rgba(255, 255, 255, 0.95);\r\n padding: 10px 16px;\r\n border-radius: 8px;\r\n box-shadow: 0 2px 12px rgba(0, 0, 0, 0.15);\r\n z-index: 1000;\r\n width: fit-content;\r\n margin: 10px auto 0;\r\n}\r\n\r\n.mobile-page-jump {\r\n padding: 8px 12px;\r\n margin: 10px auto 0;\r\n}\r\n\r\n.page-jump-input {\r\n width: 120px;\r\n padding: 8px 12px;\r\n border: 1px solid #ddd;\r\n border-radius: 6px;\r\n background: #fff;\r\n color: #333;\r\n font-size: 16px;\r\n text-align: center;\r\n outline: none;\r\n transition: border-color 0.2s ease, box-shadow 0.2s ease;\r\n}\r\n\r\n.page-jump-input:focus {\r\n border-color: #333;\r\n box-shadow: 0 0 0 2px rgba(51, 51, 51, 0.1);\r\n}\r\n\r\n.page-jump-input::placeholder {\r\n color: #999;\r\n font-size: 0.85rem;\r\n}\r\n\r\n.btn-jump {\r\n padding: 8px 16px;\r\n white-space: nowrap;\r\n background: #333;\r\n color: white;\r\n border: none;\r\n border-radius: 6px;\r\n font-size: 0.9rem;\r\n cursor: pointer;\r\n transition: background 0.2s ease;\r\n}\r\n\r\n.btn-jump:hover {\r\n background: #555;\r\n}\r\n\r\n/* PC端响应式设计 */\r\n@media (max-width: 1800px) and (min-width: 769px) {\r\n .flipbook.desktop-mode {\r\n width: 95vw;\r\n height: calc(95vw * 0.625);\r\n max-width: 1600px;\r\n max-height: 1000px;\r\n }\r\n}\r\n\r\n/* 移动端样式 */\r\n@media (max-width: 768px) {\r\n .photo-album-container {\r\n padding: 5px 5px 120px 5px;\r\n align-items: center;\r\n touch-action: none;\r\n overflow: hidden;\r\n }\r\n\r\n .flipbook-wrapper {\r\n width: 100%;\r\n display: flex;\r\n justify-content: center;\r\n }\r\n\r\n .flipbook.mobile-mode {\r\n width: 98vw;\r\n height: 85vh;\r\n max-width: none;\r\n max-height: 85vh;\r\n margin: 0 auto;\r\n }\r\n\r\n .album-header {\r\n width: 100%;\r\n text-align: center;\r\n }\r\n\r\n .album-header h1 {\r\n font-size: 2rem;\r\n }\r\n\r\n\r\n .btn {\r\n padding: 8px 16px;\r\n font-size: 0.9rem;\r\n }\r\n\r\n .page-indicator {\r\n font-size: 0.85rem;\r\n min-width: 120px;\r\n text-align: center;\r\n }\r\n\r\n /* 移动端页码跳转 */\r\n .page-jump-container {\r\n top: 10px;\r\n right: 10px;\r\n padding: 8px 10px;\r\n gap: 6px;\r\n }\r\n\r\n .page-jump-input {\r\n width: 100px;\r\n padding: 6px 10px;\r\n font-size: 0.85rem;\r\n }\r\n\r\n .btn-jump {\r\n padding: 6px 12px;\r\n font-size: 0.85rem;\r\n }\r\n\r\n /* 移动端图片优化 */\r\n .image-container {\r\n margin-bottom: 0;\r\n }\r\n\r\n .image-container img {\r\n max-width: 100%;\r\n max-height: 100%;\r\n border-radius: 6px;\r\n }\r\n\r\n .page-content-info {\r\n padding: 6px;\r\n margin-top: 2px;\r\n }\r\n}\r\n\r\n@media (max-width: 480px) {\r\n .flipbook.mobile-mode {\r\n width: 98vw;\r\n height: 80vh;\r\n max-height: 80vh;\r\n margin: 0 auto;\r\n }\r\n \r\n .album-header h1 {\r\n font-size: 1.8rem;\r\n }\r\n \r\n .mobile-controls {\r\n gap: 6px;\r\n padding: 8px 12px;\r\n justify-content: center;\r\n align-items: center;\r\n bottom: 15px;\r\n width: 95%;\r\n /* max-width: 95vw; */\r\n }\r\n \r\n .btn {\r\n padding: 6px 12px;\r\n font-size: 0.8rem;\r\n }\r\n \r\n .page-indicator {\r\n text-align: center;\r\n min-width: 100px;\r\n }\r\n \r\n /* 小屏幕图片优化 */\r\n .image-container {\r\n margin-bottom: 0;\r\n }\r\n \r\n .image-container img {\r\n max-width: 100%;\r\n max-height: 100%;\r\n border-radius: 4px;\r\n }\r\n \r\n .page-content-info {\r\n padding: 4px;\r\n margin-top: 1px;\r\n }\r\n}\r\n\r\n/* 设备特定的优化 */\r\n.mobile-optimized {\r\n /* 移动端优化 */\r\n -webkit-tap-highlight-color: transparent;\r\n -webkit-touch-callout: none;\r\n -webkit-user-select: none;\r\n user-select: none;\r\n}\r\n\r\n.desktop-optimized {\r\n /* PC端优化 */\r\n cursor: pointer;\r\n}\r\n\r\n/* 翻页按钮在不同设备上的样式 */\r\n.btn {\r\n transition: all 0.2s ease;\r\n}\r\n\r\n.btn:hover:not(:disabled) {\r\n background: #555;\r\n transform: none;\r\n box-shadow: none;\r\n}\r\n\r\n/* 缩放提示样式 */\r\n.zoom-hint {\r\n position: fixed;\r\n top: 20px;\r\n right: 20px;\r\n background: rgba(0, 0, 0, 0.85);\r\n color: white;\r\n padding: 10px 16px;\r\n border-radius: 25px;\r\n font-size: 0.85rem;\r\n opacity: 0;\r\n transform: translateY(-10px);\r\n transition: all 0.3s ease;\r\n z-index: 10001;\r\n pointer-events: none;\r\n box-shadow: 0 4px 12px rgba(0, 0, 0, 0.3);\r\n}\r\n\r\n.zoom-hint.show {\r\n opacity: 1;\r\n transform: translateY(0);\r\n pointer-events: auto;\r\n}\r\n\r\n.zoom-info {\r\n display: flex;\r\n flex-direction: row;\r\n align-items: center;\r\n gap: 12px;\r\n}\r\n\r\n.zoom-info span {\r\n font-weight: 500;\r\n}\r\n\r\n.btn-reset-zoom {\r\n background: rgba(255, 255, 255, 0.2);\r\n color: white;\r\n border: 1px solid rgba(255, 255, 255, 0.3);\r\n padding: 4px 12px;\r\n border-radius: 15px;\r\n font-size: 0.75rem;\r\n cursor: pointer;\r\n transition: all 0.2s ease;\r\n font-weight: 600;\r\n white-space: nowrap;\r\n}\r\n\r\n.btn-reset-zoom:hover {\r\n background: rgba(255, 255, 255, 0.3);\r\n border-color: rgba(255, 255, 255, 0.5);\r\n transform: scale(1.05);\r\n}\r\n\r\n.btn-reset-zoom:active {\r\n transform: scale(0.95);\r\n}\r\n\r\n/* 控件显示/隐藏动画 */\r\n.controls {\r\n opacity: 0;\r\n visibility: hidden;\r\n transform: translateY(20px);\r\n transition: opacity 0.3s ease, visibility 0.3s ease, transform 0.3s ease;\r\n display: flex;\r\n background: rgba(255, 255, 255, 0.9);\r\n border-radius: 8px;\r\n box-shadow: 0 2px 8px rgba(0, 0, 0, 0.1);\r\n}\r\n\r\n.controls.controls-visible {\r\n opacity: 1;\r\n visibility: visible;\r\n transform: translateY(0);\r\n}\r\n\r\n.mobile-controls {\r\n position: fixed !important;\r\n bottom: 76px !important;\r\n left: 50% !important;\r\n transform: translateX(-50%) !important;\r\n z-index: 10000 !important;\r\n}\r\n\r\n.desktop-controls {\r\n position: relative !important;\r\n margin: 20px auto !important;\r\n}\r\n\r\n/* 目录按钮样式 */\r\n.catalogue-button {\r\n position: fixed;\r\n z-index: 9999999999;\r\n opacity: 0;\r\n visibility: hidden;\r\n transform: translateX(-20px);\r\n transition: opacity 0.3s ease, visibility 0.3s ease, transform 0.3s ease;\r\n user-select: none;\r\n}\r\n\r\n.catalogue-button.catalogue-visible {\r\n opacity: 1;\r\n visibility: visible;\r\n transform: translateX(0);\r\n}\r\n\r\n.catalogue-button.dragging {\r\n transform: scale(1.05);\r\n /* box-shadow: 0 8px 25px rgba(0, 0, 0, 0.2); */\r\n z-index: 999999;\r\n}\r\n\r\n\r\n.btn-catalogue {\r\n background: linear-gradient(45deg, #1989fa, #0066cc);\r\n color: white;\r\n border: 2px solid rgba(255, 255, 255, 0.3);\r\n padding: 10px 16px;\r\n border-radius: 20px;\r\n font-size: 0.9rem;\r\n font-weight: 600;\r\n box-shadow: 0 4px 12px rgba(25, 137, 250, 0.4), 0 0 0 1px rgba(255, 255, 255, 0.1);\r\n transition: all 0.2s ease;\r\n display: flex;\r\n align-items: center;\r\n gap: 6px;\r\n cursor: grab;\r\n white-space: nowrap;\r\n pointer-events: all;\r\n}\r\n\r\n.catalogue-button.dragging .btn-catalogue {\r\n cursor: grabbing;\r\n /* background: linear-gradient(45deg, #0066cc, #004499); */\r\n}\r\n\r\n.btn-catalogue:active {\r\n transform: scale(0.98);\r\n}\r\n\r\n/* 拖拽手柄样式 */\r\n.btn-catalogue .drag-handle {\r\n color: rgba(255, 255, 255, 0.7);\r\n font-size: 14px;\r\n margin-right: 2px;\r\n user-select: none;\r\n}\r\n\r\n.catalogue-icon {\r\n font-size: 1rem;\r\n flex-shrink: 0;\r\n}\r\n\r\n.catalogue-text {\r\n font-size: 0.9rem;\r\n flex-shrink: 0;\r\n}\r\n\r\n.btn-catalogue:hover {\r\n background: linear-gradient(45deg, #0066cc, #004499);\r\n transform: translateY(-2px);\r\n box-shadow: 0 6px 16px rgba(25, 137, 250, 0.4);\r\n}\r\n\r\n.btn-catalogue:hover .drag-handle {\r\n color: rgba(255, 255, 255, 0.9);\r\n}\r\n\r\n/* PC端缩放工具栏 */\r\n.zoom-toolbar {\r\n position: fixed;\r\n bottom: 20px;\r\n right: 20px;\r\n display: flex;\r\n gap: 8px;\r\n z-index: 10000;\r\n}\r\n\r\n.btn-zoom {\r\n width: 40px;\r\n height: 40px;\r\n background: #333;\r\n color: white;\r\n border: 1px solid #666;\r\n border-radius: 4px;\r\n font-size: 1.2rem;\r\n cursor: pointer;\r\n transition: all 0.2s ease;\r\n display: flex;\r\n align-items: center;\r\n justify-content: center;\r\n}\r\n\r\n.btn-zoom:hover:not(:disabled) {\r\n background: #555;\r\n}\r\n\r\n.btn-zoom:disabled {\r\n opacity: 0.3;\r\n cursor: not-allowed;\r\n}\r\n\r\n/* 移动端按钮优化 */\r\n@media (max-width: 768px) {\r\n .btn:active {\r\n background: #555;\r\n transform: none;\r\n }\r\n\r\n .btn:hover:not(:disabled) {\r\n background: #555;\r\n transform: none;\r\n }\r\n\r\n .btn-catalogue {\r\n padding: 8px 12px;\r\n font-size: 0.8rem;\r\n border-radius: 16px;\r\n }\r\n\r\n .btn-catalogue .drag-handle {\r\n font-size: 16px;\r\n }\r\n\r\n .catalogue-icon {\r\n font-size: 0.9rem;\r\n }\r\n\r\n .catalogue-text {\r\n font-size: 0.8rem;\r\n }\r\n\r\n .zoom-hint {\r\n top: 10px;\r\n right: 10px;\r\n font-size: 0.75rem;\r\n }\r\n}\r\n\r\n/* 加载状态样式 */\r\n.loading-overlay {\r\n position: fixed;\r\n top: 0;\r\n left: 0;\r\n width: 100%;\r\n height: 100%;\r\n background: rgba(255, 255, 255, 0.95);\r\n backdrop-filter: blur(10px);\r\n display: flex;\r\n justify-content: center;\r\n align-items: center;\r\n z-index: 9999;\r\n animation: fadeIn 0.3s ease-out;\r\n}\r\n\r\n.loading-container {\r\n text-align: center;\r\n padding: 40px;\r\n background: white;\r\n border-radius: 20px;\r\n box-shadow: 0 20px 60px rgba(0, 0, 0, 0.1);\r\n max-width: 400px;\r\n width: 90%;\r\n}\r\n\r\n.loading-spinner {\r\n position: relative;\r\n width: 80px;\r\n height: 80px;\r\n margin: 0 auto 30px;\r\n}\r\n\r\n.spinner-ring {\r\n position: absolute;\r\n width: 100%;\r\n height: 100%;\r\n border: 3px solid transparent;\r\n border-top: 3px solid #007bff;\r\n border-radius: 50%;\r\n animation: spin 1.2s linear infinite;\r\n}\r\n\r\n.spinner-ring:nth-child(2) {\r\n width: 60px;\r\n height: 60px;\r\n top: 10px;\r\n left: 10px;\r\n border-top-color: #28a745;\r\n animation-delay: -0.4s;\r\n}\r\n\r\n.spinner-ring:nth-child(3) {\r\n width: 40px;\r\n height: 40px;\r\n top: 20px;\r\n left: 20px;\r\n border-top-color: #ffc107;\r\n animation-delay: -0.8s;\r\n}\r\n\r\n@keyframes spin {\r\n 0% { transform: rotate(0deg); }\r\n 100% { transform: rotate(360deg); }\r\n}\r\n\r\n.loading-text h3 {\r\n color: #333;\r\n font-size: 1.5rem;\r\n margin-bottom: 10px;\r\n font-weight: 600;\r\n}\r\n\r\n.loading-text p {\r\n color: #666;\r\n font-size: 1rem;\r\n margin-bottom: 20px;\r\n line-height: 1.5;\r\n}\r\n\r\n.loading-progress {\r\n width: 100%;\r\n height: 4px;\r\n background: #f0f0f0;\r\n border-radius: 2px;\r\n overflow: hidden;\r\n margin-top: 20px;\r\n}\r\n\r\n.progress-bar {\r\n height: 100%;\r\n background: linear-gradient(90deg, #007bff, #28a745, #ffc107);\r\n background-size: 200% 100%;\r\n animation: progressMove 2s ease-in-out infinite;\r\n border-radius: 2px;\r\n}\r\n\r\n@keyframes progressMove {\r\n 0% {\r\n transform: translateX(-100%);\r\n background-position: 200% 0;\r\n }\r\n 100% {\r\n transform: translateX(100%);\r\n background-position: -200% 0;\r\n }\r\n}\r\n\r\n/* 错误状态样式 */\r\n.error-container {\r\n position: fixed;\r\n top: 0;\r\n left: 0;\r\n width: 100%;\r\n height: 100%;\r\n background: rgba(255, 255, 255, 0.95);\r\n backdrop-filter: blur(10px);\r\n display: flex;\r\n justify-content: center;\r\n align-items: center;\r\n z-index: 9999;\r\n animation: fadeIn 0.3s ease-out;\r\n}\r\n\r\n.error-content {\r\n text-align: center;\r\n padding: 40px;\r\n background: white;\r\n border-radius: 20px;\r\n box-shadow: 0 20px 60px rgba(0, 0, 0, 0.1);\r\n max-width: 400px;\r\n width: 90%;\r\n}\r\n\r\n.error-icon {\r\n font-size: 4rem;\r\n margin-bottom: 20px;\r\n display: block;\r\n}\r\n\r\n.error-content h3 {\r\n color: #dc3545;\r\n font-size: 1.5rem;\r\n margin-bottom: 15px;\r\n font-weight: 600;\r\n}\r\n\r\n.error-content p {\r\n color: #666;\r\n font-size: 1rem;\r\n margin-bottom: 30px;\r\n line-height: 1.5;\r\n}\r\n\r\n.retry-btn {\r\n background: linear-gradient(45deg, #007bff, #0056b3);\r\n color: white;\r\n border: none;\r\n padding: 12px 30px;\r\n border-radius: 25px;\r\n font-size: 1rem;\r\n font-weight: 600;\r\n cursor: pointer;\r\n transition: all 0.3s ease;\r\n display: inline-flex;\r\n align-items: center;\r\n gap: 8px;\r\n box-shadow: 0 4px 15px rgba(0, 123, 255, 0.3);\r\n}\r\n\r\n.retry-btn:hover {\r\n transform: translateY(-2px);\r\n box-shadow: 0 6px 20px rgba(0, 123, 255, 0.4);\r\n}\r\n\r\n.retry-btn:active {\r\n transform: translateY(0);\r\n}\r\n\r\n.retry-icon {\r\n display: inline-block;\r\n animation: rotateIcon 0.5s ease-in-out;\r\n}\r\n\r\n.retry-btn:hover .retry-icon {\r\n animation: rotateIcon 0.5s ease-in-out infinite;\r\n}\r\n\r\n@keyframes rotateIcon {\r\n from { transform: rotate(0deg); }\r\n to { transform: rotate(360deg); }\r\n}\r\n\r\n/* 成功提示样式 */\r\n.success-toast {\r\n position: fixed;\r\n top: 30px;\r\n right: 30px;\r\n background: linear-gradient(45deg, #28a745, #20c997);\r\n color: white;\r\n padding: 15px 25px;\r\n border-radius: 25px;\r\n font-size: 1rem;\r\n font-weight: 600;\r\n box-shadow: 0 8px 25px rgba(40, 167, 69, 0.3);\r\n z-index: 10000;\r\n opacity: 0;\r\n transform: translateX(100px);\r\n transition: all 0.4s cubic-bezier(0.68, -0.55, 0.265, 1.55);\r\n display: flex;\r\n align-items: center;\r\n gap: 10px;\r\n}\r\n\r\n.success-toast.show {\r\n opacity: 1;\r\n transform: translateX(0);\r\n}\r\n\r\n.success-icon {\r\n font-size: 1.2rem;\r\n}\r\n\r\n@keyframes fadeIn {\r\n from {\r\n opacity: 0;\r\n transform: scale(0.9);\r\n }\r\n to {\r\n opacity: 1;\r\n transform: scale(1);\r\n }\r\n}\r\n\r\n/* 移动端适配 */\r\n/* 翻页模式选择器样式 */\r\n.flip-mode-selector {\r\n position: fixed;\r\n top: 20px;\r\n left: 20px;\r\n z-index: 10000;\r\n}\r\n\r\n.mobile-flip-mode-selector {\r\n top: 15px;\r\n left: 15px;\r\n}\r\n\r\n.btn-flip-mode {\r\n background: linear-gradient(45deg, #6c5ce7, #a29bfe);\r\n color: white;\r\n border: 2px solid rgba(255, 255, 255, 0.3);\r\n padding: 10px 16px;\r\n border-radius: 20px;\r\n font-size: 0.9rem;\r\n font-weight: 600;\r\n box-shadow: 0 4px 12px rgba(108, 92, 231, 0.4);\r\n transition: all 0.2s ease;\r\n display: flex;\r\n align-items: center;\r\n gap: 6px;\r\n cursor: pointer;\r\n}\r\n\r\n.btn-flip-mode:hover {\r\n background: linear-gradient(45deg, #5f4ed5, #8c7ae6);\r\n transform: translateY(-2px);\r\n box-shadow: 0 6px 16px rgba(108, 92, 231, 0.5);\r\n}\r\n\r\n.flip-mode-icon {\r\n font-size: 1rem;\r\n}\r\n\r\n.flip-mode-text {\r\n font-size: 0.85rem;\r\n}\r\n\r\n.flip-mode-menu {\r\n position: absolute;\r\n top: 100%;\r\n left: 0;\r\n margin-top: 8px;\r\n background: white;\r\n border-radius: 12px;\r\n box-shadow: 0 8px 25px rgba(0, 0, 0, 0.15);\r\n overflow: hidden;\r\n min-width: 150px;\r\n animation: slideDown 0.2s ease-out;\r\n}\r\n\r\n@keyframes slideDown {\r\n from {\r\n opacity: 0;\r\n transform: translateY(-10px);\r\n }\r\n to {\r\n opacity: 1;\r\n transform: translateY(0);\r\n }\r\n}\r\n\r\n.flip-mode-item {\r\n display: flex;\r\n align-items: center;\r\n gap: 10px;\r\n padding: 12px 16px;\r\n cursor: pointer;\r\n transition: background 0.2s ease;\r\n}\r\n\r\n.flip-mode-item:hover {\r\n background: #f5f5f5;\r\n}\r\n\r\n.flip-mode-item-active {\r\n background: linear-gradient(45deg, #6c5ce7, #a29bfe);\r\n color: white;\r\n}\r\n\r\n.flip-mode-item-active:hover {\r\n background: linear-gradient(45deg, #5f4ed5, #8c7ae6);\r\n}\r\n\r\n.flip-mode-item-icon {\r\n font-size: 1.1rem;\r\n}\r\n\r\n.flip-mode-item-label {\r\n font-size: 0.9rem;\r\n font-weight: 500;\r\n}\r\n\r\n/* 滑动模式样式 */\r\n.slide-viewer {\r\n width: 1600px;\r\n height: 1000px;\r\n overflow: hidden;\r\n position: relative;\r\n}\r\n\r\n.slide-viewer.mobile-mode {\r\n width: 100%;\r\n max-width: none;\r\n height: 85vh;\r\n max-height: 85vh;\r\n}\r\n\r\n.slide-container {\r\n display: flex;\r\n height: 100%;\r\n will-change: transform;\r\n}\r\n\r\n.slide-page {\r\n flex: 0 0 100%;\r\n width: 100%;\r\n height: 100%;\r\n display: flex;\r\n justify-content: center;\r\n align-items: center;\r\n background: #f8f9fa;\r\n}\r\n\r\n.slide-page-image {\r\n max-width: 100%;\r\n max-height: 100%;\r\n object-fit: contain;\r\n}\r\n\r\n.slide-page-placeholder {\r\n font-size: 2rem;\r\n color: #666;\r\n text-align: center;\r\n}\r\n\r\n/* 淡入淡出模式样式 */\r\n.fade-viewer {\r\n width: 1600px;\r\n height: 1000px;\r\n overflow: hidden;\r\n position: relative;\r\n}\r\n\r\n.fade-viewer.mobile-mode {\r\n width: 100%;\r\n max-width: none;\r\n height: 85vh;\r\n max-height: 85vh;\r\n}\r\n\r\n.fade-page-container {\r\n width: 100%;\r\n height: 100%;\r\n display: flex;\r\n justify-content: center;\r\n align-items: center;\r\n background: #f8f9fa;\r\n}\r\n\r\n.fade-page-image {\r\n max-width: 100%;\r\n max-height: 100%;\r\n object-fit: contain;\r\n}\r\n\r\n.fade-page-placeholder {\r\n font-size: 2rem;\r\n color: #666;\r\n text-align: center;\r\n}\r\n\r\n.fade-page-enter-active,\r\n.fade-page-leave-active {\r\n transition: opacity 0.3s ease;\r\n}\r\n\r\n.fade-page-enter,\r\n.fade-page-leave-to {\r\n opacity: 0;\r\n}\r\n\r\n/* 垂直滚动模式样式 */\r\n.scroll-viewer {\r\n width: 1600px;\r\n height: 1000px;\r\n overflow-y: auto;\r\n overflow-x: hidden;\r\n position: relative;\r\n scroll-behavior: smooth;\r\n}\r\n\r\n.scroll-viewer.mobile-mode {\r\n width: 100%;\r\n max-width: none;\r\n height: 85vh;\r\n max-height: 85vh;\r\n}\r\n\r\n.scroll-container {\r\n width: 100%;\r\n}\r\n\r\n.scroll-page {\r\n width: 100%;\r\n min-height: 100%;\r\n display: flex;\r\n justify-content: center;\r\n align-items: center;\r\n background: #f8f9fa;\r\n padding: 20px 0;\r\n box-sizing: border-box;\r\n}\r\n\r\n.scroll-page-image {\r\n max-width: 100%;\r\n max-height: none;\r\n width: auto;\r\n}\r\n\r\n.scroll-page-placeholder {\r\n font-size: 2rem;\r\n color: #666;\r\n text-align: center;\r\n min-height: 300px;\r\n display: flex;\r\n align-items: center;\r\n justify-content: center;\r\n}\r\n\r\n/* 滚动条样式 */\r\n.scroll-viewer::-webkit-scrollbar {\r\n width: 8px;\r\n}\r\n\r\n.scroll-viewer::-webkit-scrollbar-track {\r\n background: #f1f1f1;\r\n border-radius: 4px;\r\n}\r\n\r\n.scroll-viewer::-webkit-scrollbar-thumb {\r\n background: #c1c1c1;\r\n border-radius: 4px;\r\n}\r\n\r\n.scroll-viewer::-webkit-scrollbar-thumb:hover {\r\n background: #a1a1a1;\r\n}\r\n\r\n/* 截断特效模式样式 */\r\n.clip-viewer {\r\n width: 1600px;\r\n height: 1000px;\r\n overflow: hidden;\r\n position: relative;\r\n perspective: 1200px;\r\n}\r\n\r\n.clip-viewer.mobile-mode {\r\n width: 100%;\r\n max-width: none;\r\n height: 85vh;\r\n max-height: 85vh;\r\n}\r\n\r\n.clip-pages-wrapper {\r\n width: 100%;\r\n height: 100%;\r\n position: relative;\r\n display: flex;\r\n justify-content: center;\r\n align-items: center;\r\n}\r\n\r\n.clip-page {\r\n position: absolute;\r\n width: 100%;\r\n height: 100%;\r\n display: flex;\r\n justify-content: center;\r\n align-items: center;\r\n background: #f8f9fa;\r\n}\r\n\r\n.clip-page-current {\r\n z-index: 2;\r\n clip-path: inset(0 0 0 0);\r\n}\r\n\r\n.clip-page-next {\r\n z-index: 1;\r\n opacity: 0.5;\r\n transform: scale(0.95);\r\n filter: blur(2px);\r\n}\r\n\r\n.clip-page-image {\r\n max-width: 100%;\r\n max-height: 100%;\r\n object-fit: contain;\r\n border-radius: 8px;\r\n box-shadow: 0 10px 40px rgba(0, 0, 0, 0.2);\r\n}\r\n\r\n.clip-page-placeholder {\r\n font-size: 2rem;\r\n color: #666;\r\n text-align: center;\r\n}\r\n\r\n/* 截断动画 */\r\n.clip-current-enter-active {\r\n animation: clipIn 0.5s cubic-bezier(0.4, 0, 0.2, 1);\r\n}\r\n\r\n.clip-current-leave-active {\r\n animation: clipOut 0.5s cubic-bezier(0.4, 0, 0.2, 1);\r\n}\r\n\r\n@keyframes clipIn {\r\n 0% {\r\n clip-path: inset(0 100% 0 0);\r\n transform: translateX(50px);\r\n opacity: 0;\r\n }\r\n 100% {\r\n clip-path: inset(0 0 0 0);\r\n transform: translateX(0);\r\n opacity: 1;\r\n }\r\n}\r\n\r\n@keyframes clipOut {\r\n 0% {\r\n clip-path: inset(0 0 0 0);\r\n transform: translateX(0);\r\n opacity: 1;\r\n }\r\n 100% {\r\n clip-path: inset(0 0 0 100%);\r\n transform: translateX(-50px);\r\n opacity: 0;\r\n }\r\n}\r\n\r\n/* 卡片风格模式样式 */\r\n.card-viewer {\r\n width: 1600px;\r\n height: 1000px;\r\n overflow: visible;\r\n position: relative;\r\n perspective: 1500px;\r\n}\r\n\r\n.card-viewer.mobile-mode {\r\n width: 100%;\r\n max-width: none;\r\n height: 85vh;\r\n max-height: 85vh;\r\n}\r\n\r\n.card-stack {\r\n width: 100%;\r\n height: 100%;\r\n position: relative;\r\n display: flex;\r\n justify-content: center;\r\n align-items: center;\r\n transform-style: preserve-3d;\r\n}\r\n\r\n.card-transition-group {\r\n width: 100%;\r\n height: 100%;\r\n position: relative;\r\n display: flex;\r\n justify-content: center;\r\n align-items: center;\r\n}\r\n\r\n.card-item {\r\n position: absolute;\r\n width: 70%;\r\n height: 90%;\r\n transition: all 0.5s cubic-bezier(0.4, 0, 0.2, 1);\r\n transform-style: preserve-3d;\r\n cursor: pointer;\r\n}\r\n\r\n.card-content {\r\n width: 100%;\r\n height: 100%;\r\n background: white;\r\n border-radius: 16px;\r\n box-shadow: 0 20px 60px rgba(0, 0, 0, 0.3), 0 8px 25px rgba(0, 0, 0, 0.2);\r\n overflow: hidden;\r\n display: flex;\r\n justify-content: center;\r\n align-items: center;\r\n position: relative;\r\n}\r\n\r\n.card-item-current .card-content {\r\n box-shadow: 0 30px 80px rgba(0, 0, 0, 0.35), 0 15px 40px rgba(0, 0, 0, 0.25);\r\n}\r\n\r\n.card-image {\r\n max-width: 100%;\r\n max-height: 100%;\r\n object-fit: contain;\r\n}\r\n\r\n.card-placeholder {\r\n font-size: 2rem;\r\n color: #666;\r\n text-align: center;\r\n}\r\n\r\n.card-page-number {\r\n position: absolute;\r\n bottom: 15px;\r\n left: 50%;\r\n transform: translateX(-50%);\r\n background: rgba(0, 0, 0, 0.7);\r\n color: white;\r\n padding: 6px 16px;\r\n border-radius: 20px;\r\n font-size: 0.85rem;\r\n font-weight: 500;\r\n}\r\n\r\n.card-item-prev .card-page-number,\r\n.card-item-next .card-page-number {\r\n opacity: 0;\r\n}\r\n\r\n/* 卡片切换动画 */\r\n.card-flip-enter-active,\r\n.card-flip-leave-active {\r\n transition: all 0.5s cubic-bezier(0.4, 0, 0.2, 1);\r\n}\r\n\r\n.card-flip-enter {\r\n opacity: 0;\r\n transform: translateX(100%) scale(0.8) rotateY(-30deg);\r\n}\r\n\r\n.card-flip-leave-to {\r\n opacity: 0;\r\n transform: translateX(-100%) scale(0.8) rotateY(30deg);\r\n}\r\n\r\n/* 卡片悬停效果 */\r\n.card-item-current:hover .card-content {\r\n box-shadow: 0 35px 90px rgba(0, 0, 0, 0.4), 0 18px 50px rgba(0, 0, 0, 0.3);\r\n}\r\n\r\n/* 移动端卡片样式 */\r\n@media (max-width: 768px) {\r\n .card-item {\r\n width: 85%;\r\n height: 85%;\r\n }\r\n \r\n .card-item-prev,\r\n .card-item-next {\r\n display: none;\r\n }\r\n \r\n .card-content {\r\n border-radius: 12px;\r\n }\r\n \r\n .card-page-number {\r\n font-size: 0.75rem;\r\n padding: 4px 12px;\r\n }\r\n \r\n .clip-page-next {\r\n display: none;\r\n }\r\n}\r\n\r\n/* 移动端翻页模式选择器样式 */\r\n@media (max-width: 768px) {\r\n .btn-flip-mode {\r\n padding: 8px 12px;\r\n font-size: 0.8rem;\r\n border-radius: 16px;\r\n }\r\n \r\n .flip-mode-icon {\r\n font-size: 0.9rem;\r\n }\r\n \r\n .flip-mode-text {\r\n font-size: 0.75rem;\r\n }\r\n \r\n .flip-mode-menu {\r\n min-width: 130px;\r\n }\r\n \r\n .flip-mode-item {\r\n padding: 10px 14px;\r\n }\r\n \r\n .flip-mode-item-icon {\r\n font-size: 1rem;\r\n }\r\n \r\n .flip-mode-item-label {\r\n font-size: 0.8rem;\r\n }\r\n}\r\n\r\n@media (max-width: 768px) {\r\n .loading-container,\r\n .error-content {\r\n padding: 30px 20px;\r\n margin: 20px;\r\n }\r\n \r\n .loading-spinner {\r\n width: 60px;\r\n height: 60px;\r\n }\r\n \r\n .spinner-ring:nth-child(2) {\r\n width: 45px;\r\n height: 45px;\r\n top: 7.5px;\r\n left: 7.5px;\r\n }\r\n \r\n .spinner-ring:nth-child(3) {\r\n width: 30px;\r\n height: 30px;\r\n top: 15px;\r\n left: 15px;\r\n }\r\n \r\n .loading-text h3,\r\n .error-content h3 {\r\n font-size: 1.3rem;\r\n }\r\n \r\n .loading-text p,\r\n .error-content p {\r\n font-size: 0.9rem;\r\n }\r\n \r\n .success-toast {\r\n top: 20px;\r\n right: 20px;\r\n left: 20px;\r\n right: 20px;\r\n font-size: 0.9rem;\r\n padding: 12px 20px;\r\n }\r\n \r\n .retry-btn {\r\n padding: 10px 25px;\r\n font-size: 0.9rem;\r\n }\r\n}\r\n\r\n</style>\r\n","import mod from \"-!../../node_modules/@vue/vue-loader-v15/lib/index.js??vue-loader-options!./BookReader.vue?vue&type=script&lang=js\"; export default mod; export * from \"-!../../node_modules/@vue/vue-loader-v15/lib/index.js??vue-loader-options!./BookReader.vue?vue&type=script&lang=js\"","import { render, staticRenderFns } from \"./BookReader.vue?vue&type=template&id=23d695ae&scoped=true\"\nimport script from \"./BookReader.vue?vue&type=script&lang=js\"\nexport * from \"./BookReader.vue?vue&type=script&lang=js\"\nimport style0 from \"./BookReader.vue?vue&type=style&index=0&id=23d695ae&prod&scoped=true&lang=css\"\n\n\n/* normalize component */\nimport normalizer from \"!../../node_modules/@vue/vue-loader-v15/lib/runtime/componentNormalizer.js\"\nvar component = normalizer(\n script,\n render,\n staticRenderFns,\n false,\n null,\n \"23d695ae\",\n null\n \n)\n\nexport default component.exports","import BookReader from './components/BookReader.vue'\r\nimport BookCatalogueDrawer from './components/BookCatalogueDrawer.vue'\r\n\r\nconst components = {\r\n BookReader,\r\n BookCatalogueDrawer\r\n}\r\n\r\nconst install = function(Vue) {\r\n if (install.installed) return\r\n install.installed = true\r\n Object.keys(components).forEach(key => {\r\n Vue.component(key, components[key])\r\n })\r\n}\r\n\r\nif (typeof window !== 'undefined' && window.Vue) {\r\n install(window.Vue)\r\n}\r\n\r\nexport default {\r\n install,\r\n BookReader,\r\n BookCatalogueDrawer\r\n}\r\n\r\nexport {\r\n BookReader,\r\n BookCatalogueDrawer\r\n}\r\n","import './setPublicPath'\nimport mod from '~entry'\nexport default mod\nexport * from '~entry'\n"],"names":["root","factory","exports","module","define","amd","self","this","__webpack_require__","d","definition","key","o","Object","defineProperty","enumerable","get","obj","prop","prototype","hasOwnProperty","call","r","Symbol","toStringTag","value","p","window","currentScript","document","src","match","render","_vm","_c","_self","staticClass","style","transform","zoomScale","translateX","translateY","on","onContainerTouchStart","onContainerTouchMove","onContainerTouchEnd","onContainerDoubleClick","onContentClick","_e","onFlipbookDoubleClick","$event","onFlipbookTouchStart","apply","arguments","onFlipbookTouchEnd","flipMode","flag","ref","class","isMobile","attrs","pages","pagesHiRes","startPage","onFlipLeftEnd","onFlipRightEnd","scopedSlots","_u","fn","page","canFlipLeft","canFlipRight","onSlideViewerTouchStart","onSlideViewerTouchMove","onSlideViewerTouchEnd","_l","index","currentPage","_v","onScrollViewerScroll","refInFor","totalPages","originalIndex","position","getCardStyle","_s","showControls","stopPropagation","flipLeft","Math","ceil","max","flipRight","toggleFlipModeMenu","flipModeIcon","flipModeLabel","mode","selectFlipMode","icon","label","catalogueButtonDragging","left","catalogueButtonPosition","x","top","y","onCatalogueMouseDown","onCatalogueTouchStart","onCatalogueTouchMove","onCatalogueTouchEnd","openCatalogue","round","resetZoom","zoomOut","zoomIn","_m","error","loading","message","fetchBooksData","booksData","showSuccessToast","bookId","catalogue","catalogueLoading","onCatalogueClick","onPageJump","onFocus","onFetchCatalogue","model","callback","$$v","showCatalogueDrawer","expression","staticRenderFns","format","source","constructor","Array","values","filter","isNaN","length","matrix","identity","TypeError","i","push","multiply","matrixA","matrixB","fma","fmb","product","row","j","k","col","result","perspective","distance","rotateY","angle","theta","PI","cos","sin","join","translate","distanceX","distanceY","translate3d","distanceZ","undefined","easeIn","easeInOut","easeOut","Matrix","arg","m","concat","clone","transformX","z","deg","toString","spinner","pow","script","props","type","required","default","flipDuration","Number","zoomDuration","zooms","nPolygons","ambient","gloss","swipeMin","singlePage","Boolean","forwardDirection","validator","val","centering","loadingImage","String","clickToZoom","dragToFlip","wheel","data","viewWidth","viewHeight","imageWidth","imageHeight","displayedPages","nImageLoad","nImageLoadTrigger","imageLoadCallback","firstPage","secondPage","zoomIndex","zoom","zooming","touchStartX","touchStartY","maxMove","activeCursor","hasTouchEvents","hasPointerEvents","minX","maxX","preloadedImages","flip","progress","direction","frontImage","backImage","auto","opacity","currentCenterOffset","animatingCenter","startScrollLeft","startScrollTop","scrollLeft","scrollTop","loadedImages","computed","IE","navigator","test","userAgent","canGoForward","canGoBack","canZoomIn","zooms_","canZoomOut","numPages","pageUrl","leftPage","rightPage","showLeftPage","showRightPage","cursor","pageScale","scale","vw","xScale","yScale","pageWidth","pageHeight","xMargin","yMargin","polygonWidth","w","polygonHeight","polygonBgSize","polygonArray","makePolygonArray","boundingLeft","boundingRight","centerOffset","retval","centerOffsetSmoothed","dragToScroll","scrollLeftMin","scrollLeftMax","scrollTopMin","h","scrollTopMax","scrollLeftLimited","min","scrollTopLimited","mounted","addEventListener","onResize","passive","goToPage","beforeDestroy","removeEventListener","methods","viewport","$refs","clientWidth","clientHeight","fixFirstPage","hiRes","url","pageUrlLoading","loadImage","flipStart","face","bgPos","dRadian","dRotate","image","lighting","originRight","pageMatrix","pageRotation","pageX","rad","radian","radius","results","rotate","x0","x1","computeLighting","abs","rot","DEG","POW","blackness","diffuse","gradients","lightingPoints","specular","map","this$1$1","requestAnimationFrame","flipAuto","ease","animate","duration","startRatio","t0","Date","now","$emit","ratio","t","onImageLoad","flipRevert","trigger","cb","didLoadImage","ev","target","path","naturalWidth","naturalHeight","preloadImages","zoomAt","zoomTo","containerFixedX","containerFixedY","end","endX","endY","fixedX","fixedY","rect","start","startX","startY","getBoundingClientRect","pageY","swipeStart","touch","swipeMove","dragScroll","swipeEnd","onTouchStart","changedTouches","onTouchMove","cancelable","preventDefault","onTouchEnd","onPointerDown","which","setPointerCapture","pointerId","onPointerMove","onPointerUp","releasePointerCapture","onMouseDown","onMouseMove","onMouseUp","onWheel","deltaX","deltaY","ref1","ref2","ref3","Image","img","onload","$set","watch","diff","rate","after","before","normalizeComponent","template","scopeId","isFunctionalTemplate","moduleIdentifier","shadowMode","createInjector","createInjectorSSR","createInjectorShadow","hook","options","_compiled","functional","_scopeId","context","$vnode","ssrContext","parent","__VUE_SSR_CONTEXT__","_registeredComponents","add","_ssrRegister","$root","$options","shadowRoot","originalRender","existing","beforeCreate","HEAD","isOldIE","toLowerCase","id","addStyle","styles","css","group","media","ids","Set","has","code","sources","btoa","unescape","encodeURIComponent","JSON","stringify","element","createElement","setAttribute","head","getElementsByTagName","appendChild","styleSheet","cssText","size","textNode","createTextNode","nodes","childNodes","removeChild","insertBefore","__vue_script__","__vue_render__","_h","$createElement","_t","width","height","bgImage","blank","backgroundImage","backgroundSize","backgroundPosition","zIndex","directives","name","rawName","__vue_staticRenderFns__","__vue_inject_styles__","inject","__vue_scope_id__","__vue_module_identifier__","__vue_is_functional_template__","__vue_component__","closeDrawer","visible","drawerWidth","domProps","composing","jumpPageInput","handlePageInput","onInputFocus","onInputBlur","handleJumpToPage","fetchCatalogue","catalogueData","item","onItemClick","CatalogueItem","level","expanded","hasChildren","children","childrenList","subItems","items","childrenData","itemStyle","paddingLeft","paddingRight","levelClass","toggleExpand","handleClick","titleText","titleName","title","text","dragHandle","startPageNum","pageNumber","pageNum","expandIcon","levelIndicator","repeat","titleSpan","pageSpan","childrenDiv","child","click","components","set","innerWidth","newVal","handler","processCatalogueData","immediate","console","warn","isArray","processedItem","log","e","numValue","replace","parseInt","resetData","handleResize","scriptExports","functionalTemplate","injectStyles","_injectStyles","component","Flipbook","BookCatalogueDrawer","contentReady","lastTouchDistance","lastTouchCenter","isZooming","isPanning","touchStartTime","initialTouches","flipbookTouchStartTime","flipbookLastTapTime","dragStartPosition","dragOffset","showFlipModeMenu","flipModes","slideStartX","slideCurrentX","slideIsDragging","flipModeFromUrl","hideControlsTimer","find","slideContainerStyle","offset","transition","showFlipModeSelector","visibleCards","cards","pageDisplayText","records","imageUrl","setTimeout","checkUrlPageParameter","response","request","updatePagesFromApiData","apiData","newPages","forEach","detectMobile","mobileKeywords","isMobileUA","some","keyword","includes","isMobileScreen","isTouchDevice","maxTouchPoints","screenSize","touchSupport","finalResult","preloadFirstPage","firstPageIndex","firstPageUrl","Promise","resolve","reject","onerror","wasMobile","$nextTick","flipbook","recordReadingProgress","from","touches","getTouchDistance","getTouchCenter","clientX","clientY","currentDistance","currentCenter","scaleChange","newScale","touchDuration","wasZooming","wasPanning","lastTapTime","constrainPosition","touch1","touch2","dx","dy","sqrt","maxTranslate","dragging","showDrawer","closest","onCatalogueMouseMove","onCatalogueMouseUp","dragDistance","newX","newY","maxY","innerHeight","oldMode","localStorage","setItem","to","scrollToCurrentPage","threshold","container","scrollViewer","containerHeight","pageRef","pageTop","offsetTop","pageBottom","offsetHeight","scrollIntoView","behavior","block","closeFlipModeMenu","pageParam","$route","query","targetPage","jumpToPage","isValid","showControlsTemporarily","clearTimeout","urlFlipMode","savedFlipMode","getItem","BookReader","install","Vue","installed","keys"],"ignoreList":[],"sourceRoot":""}
|
|
1
|
+
{"version":3,"file":"vue-book-reader.umd.min.js","mappings":"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","sources":["webpack://vue-book-reader/webpack/universalModuleDefinition","webpack://vue-book-reader/webpack/bootstrap","webpack://vue-book-reader/webpack/runtime/define property getters","webpack://vue-book-reader/webpack/runtime/hasOwnProperty shorthand","webpack://vue-book-reader/webpack/runtime/make namespace object","webpack://vue-book-reader/webpack/runtime/publicPath","webpack://vue-book-reader/./node_modules/@vue/cli-service/lib/commands/build/setPublicPath.js","webpack://vue-book-reader/./src/components/BookReader.vue?c4a3","webpack://vue-book-reader/./node_modules/rematrix/dist/rematrix.es.js","webpack://vue-book-reader/./node_modules/flipbook-vue/dist/vue2/flipbook.mjs","webpack://vue-book-reader/./src/components/BookCatalogueDrawer.vue?ef5d","webpack://vue-book-reader/src/components/BookCatalogueDrawer.vue","webpack://vue-book-reader/./src/components/BookCatalogueDrawer.vue?e206","webpack://vue-book-reader/./node_modules/@vue/vue-loader-v15/lib/runtime/componentNormalizer.js","webpack://vue-book-reader/./src/components/BookCatalogueDrawer.vue","webpack://vue-book-reader/src/components/BookReader.vue","webpack://vue-book-reader/./src/components/BookReader.vue?0add","webpack://vue-book-reader/./src/components/BookReader.vue","webpack://vue-book-reader/./src/index.js","webpack://vue-book-reader/./node_modules/@vue/cli-service/lib/commands/build/entry-lib.js"],"sourcesContent":["(function webpackUniversalModuleDefinition(root, factory) {\n\tif(typeof exports === 'object' && typeof module === 'object')\n\t\tmodule.exports = factory();\n\telse if(typeof define === 'function' && define.amd)\n\t\tdefine([], factory);\n\telse if(typeof exports === 'object')\n\t\texports[\"vue-book-reader\"] = factory();\n\telse\n\t\troot[\"vue-book-reader\"] = factory();\n})((typeof self !== 'undefined' ? self : this), function() {\nreturn ","// The require scope\nvar __webpack_require__ = {};\n\n","// define getter functions for harmony exports\n__webpack_require__.d = function(exports, definition) {\n\tfor(var key in definition) {\n\t\tif(__webpack_require__.o(definition, key) && !__webpack_require__.o(exports, key)) {\n\t\t\tObject.defineProperty(exports, key, { enumerable: true, get: definition[key] });\n\t\t}\n\t}\n};","__webpack_require__.o = function(obj, prop) { return Object.prototype.hasOwnProperty.call(obj, prop); }","// define __esModule on exports\n__webpack_require__.r = function(exports) {\n\tif(typeof Symbol !== 'undefined' && Symbol.toStringTag) {\n\t\tObject.defineProperty(exports, Symbol.toStringTag, { value: 'Module' });\n\t}\n\tObject.defineProperty(exports, '__esModule', { value: true });\n};","__webpack_require__.p = \"\";","/* eslint-disable no-var */\n// This file is imported into lib/wc client bundles.\n\nif (typeof window !== 'undefined') {\n var currentScript = window.document.currentScript\n if (process.env.NEED_CURRENTSCRIPT_POLYFILL) {\n var getCurrentScript = require('@soda/get-current-script')\n currentScript = getCurrentScript()\n\n // for backward compatibility, because previously we directly included the polyfill\n if (!('currentScript' in document)) {\n Object.defineProperty(document, 'currentScript', { get: getCurrentScript })\n }\n }\n\n var src = currentScript && currentScript.src.match(/(.+\\/)[^/]+\\.js(\\?.*)?$/)\n if (src) {\n __webpack_public_path__ = src[1] // eslint-disable-line\n }\n}\n\n// Indicate to webpack that this file can be concatenated\nexport default null\n","var render = function render(){var _vm=this,_c=_vm._self._c;return _c('div',{staticClass:\"photo-album-container\",on:{\"touchstart\":_vm.onContainerTouchStart,\"touchmove\":_vm.onContainerTouchMove,\"touchend\":_vm.onContainerTouchEnd,\"dblclick\":_vm.onContainerDoubleClick,\"click\":_vm.onContentClick}},[(false)?_c('div',{staticClass:\"album-header\"},[_c('h1',[_vm._v(\"氪氪\")])]):_vm._e(),(_vm.contentReady)?_c('div',{staticClass:\"flipbook-wrapper\",style:({ transform: `scale(${_vm.zoomScale}) translate(${_vm.translateX}px, ${_vm.translateY}px)` }),on:{\"dblclick\":_vm.onFlipbookDoubleClick,\"!touchstart\":function($event){return _vm.onFlipbookTouchStart.apply(null, arguments)},\"!touchend\":function($event){return _vm.onFlipbookTouchEnd.apply(null, arguments)}}},[(_vm.flipMode === 'flip' && _vm.flag)?_c('flipbook',{ref:\"flipbook\",class:['flipbook', _vm.isMobile ? 'mobile-mode mobile-optimized' : 'desktop-mode desktop-optimized'],attrs:{\"pages\":_vm.pages,\"pagesHiRes\":_vm.pagesHiRes,\"startPage\":_vm.startPage,\"zooms\":null,\"ambient-light\":0.6,\"gloss\":0.4,\"single-page\":_vm.isMobile,\"click-to-flip\":false,\"wheel-to-flip\":!_vm.isMobile,\"swipe-to-flip\":true,\"center-pages\":true},on:{\"flip-left-end\":_vm.onFlipLeftEnd,\"flip-right-end\":_vm.onFlipRightEnd},scopedSlots:_vm._u([{key:\"default\",fn:function({ page, canFlipLeft, canFlipRight }){return undefined}}],null,false,2449366912)}):(_vm.flipMode === 'slide')?_c('div',{ref:\"slideViewer\",class:['slide-viewer', _vm.isMobile ? 'mobile-mode mobile-optimized' : 'desktop-mode desktop-optimized'],on:{\"touchstart\":_vm.onSlideViewerTouchStart,\"touchmove\":_vm.onSlideViewerTouchMove,\"touchend\":_vm.onSlideViewerTouchEnd}},[_c('div',{staticClass:\"slide-container\",style:(_vm.slideContainerStyle)},_vm._l((_vm.pages),function(page,index){return _c('div',{key:index,staticClass:\"slide-page\",class:{ 'slide-page-active': index + 1 === _vm.currentPage }},[(page)?_c('img',{staticClass:\"slide-page-image\",attrs:{\"src\":page,\"alt\":\"\"}}):_c('div',{staticClass:\"slide-page-placeholder\"},[_vm._v(\"封面/封底\")])])}),0)]):(_vm.flipMode === 'fade')?_c('div',{ref:\"fadeViewer\",class:['fade-viewer', _vm.isMobile ? 'mobile-mode mobile-optimized' : 'desktop-mode desktop-optimized']},[_c('transition',{attrs:{\"name\":\"fade-page\",\"mode\":\"out-in\"}},[_c('div',{key:_vm.currentPage,staticClass:\"fade-page-container\"},[(_vm.pages[_vm.currentPage - 1])?_c('img',{staticClass:\"fade-page-image\",attrs:{\"src\":_vm.pages[_vm.currentPage - 1],\"alt\":\"\"}}):_c('div',{staticClass:\"fade-page-placeholder\"},[_vm._v(\"封面/封底\")])])])],1):(_vm.flipMode === 'scroll')?_c('div',{ref:\"scrollViewer\",class:['scroll-viewer', _vm.isMobile ? 'mobile-mode mobile-optimized' : 'desktop-mode desktop-optimized'],on:{\"scroll\":_vm.onScrollViewerScroll}},[_c('div',{staticClass:\"scroll-container\"},_vm._l((_vm.pages),function(page,index){return _c('div',{key:index,ref:'scrollPage' + index,refInFor:true,staticClass:\"scroll-page\"},[(page)?_c('img',{staticClass:\"scroll-page-image\",attrs:{\"src\":page,\"alt\":\"\"}}):_c('div',{staticClass:\"scroll-page-placeholder\"},[_vm._v(\"封面/封底\")])])}),0)]):(_vm.flipMode === 'clip')?_c('div',{ref:\"clipViewer\",class:['clip-viewer', _vm.isMobile ? 'mobile-mode mobile-optimized' : 'desktop-mode desktop-optimized']},[_c('div',{staticClass:\"clip-pages-wrapper\"},[_c('transition',{attrs:{\"name\":\"clip-current\"}},[_c('div',{key:'current-' + _vm.currentPage,staticClass:\"clip-page clip-page-current\"},[(_vm.pages[_vm.currentPage - 1])?_c('img',{staticClass:\"clip-page-image\",attrs:{\"src\":_vm.pages[_vm.currentPage - 1],\"alt\":\"\"}}):_c('div',{staticClass:\"clip-page-placeholder\"},[_vm._v(\"封面/封底\")])])]),(_vm.currentPage < _vm.totalPages)?_c('div',{staticClass:\"clip-page clip-page-next\"},[(_vm.pages[_vm.currentPage])?_c('img',{staticClass:\"clip-page-image\",attrs:{\"src\":_vm.pages[_vm.currentPage],\"alt\":\"\"}}):_c('div',{staticClass:\"clip-page-placeholder\"},[_vm._v(\"封面/封底\")])]):_vm._e()],1)]):(_vm.flipMode === 'card')?_c('div',{ref:\"cardViewer\",class:['card-viewer', _vm.isMobile ? 'mobile-mode mobile-optimized' : 'desktop-mode desktop-optimized']},[_c('div',{staticClass:\"card-stack\"},[_c('transition-group',{staticClass:\"card-transition-group\",attrs:{\"name\":\"card-flip\",\"tag\":\"div\"}},_vm._l((_vm.visibleCards),function(page,index){return _c('div',{key:'card-' + page.originalIndex,staticClass:\"card-item\",class:{\n 'card-item-prev': page.position === 'prev',\n 'card-item-current': page.position === 'current',\n 'card-item-next': page.position === 'next'\n },style:(_vm.getCardStyle(page.position))},[_c('div',{staticClass:\"card-content\"},[(page.src)?_c('img',{staticClass:\"card-image\",attrs:{\"src\":page.src,\"alt\":\"\"}}):_c('div',{staticClass:\"card-placeholder\"},[_vm._v(\"封面/封底\")])]),_c('div',{staticClass:\"card-page-number\"},[_vm._v(_vm._s(page.originalIndex + 1)+\" / \"+_vm._s(_vm.totalPages))])])}),0)],1)]):_vm._e()],1):_vm._e(),_c('div',{staticClass:\"controls\",class:{ 'mobile-controls': _vm.isMobile, 'desktop-controls': !_vm.isMobile, 'controls-visible': _vm.showControls },on:{\"click\":function($event){$event.stopPropagation();}}},[_c('button',{staticClass:\"btn btn-prev\",on:{\"click\":_vm.flipLeft}},[_vm._v(\" ← 上一页 \")]),_c('span',{staticClass:\"page-indicator\"},[(_vm.totalPages === 0)?_c('span',[_vm._v(\"加载中...\")]):(_vm.currentPage === 1 && _vm.totalPages > 1)?_c('span',[_vm._v(\"封面\")]):(_vm.currentPage === _vm.totalPages && _vm.totalPages > 1)?_c('span',[_vm._v(\"封底\")]):(!_vm.isMobile && _vm.totalPages > 2)?_c('span',[_vm._v(\"第 \"+_vm._s(Math.ceil((_vm.currentPage - 1) / 2))+\" 组 / 共 \"+_vm._s(Math.ceil((_vm.totalPages - 2) / 2))+\" 组\")]):(_vm.isMobile && _vm.totalPages > 2)?_c('span',[_vm._v(\"第 \"+_vm._s(Math.max(1, _vm.currentPage ))+\" 页 / 共 \"+_vm._s(Math.max(0, _vm.totalPages - 2))+\" 页\")]):(_vm.totalPages === 1)?_c('span',[_vm._v(\"第 1 页 / 共 1 页\")]):_c('span',[_vm._v(\"第 \"+_vm._s(_vm.currentPage)+\" 页 / 共 \"+_vm._s(_vm.totalPages)+\" 页\")])]),_c('button',{staticClass:\"btn btn-next\",on:{\"click\":_vm.flipRight}},[_vm._v(\" 下一页 → \")])]),(_vm.showFlipModeSelector)?_c('div',{staticClass:\"flip-mode-selector\",class:{ 'mobile-flip-mode-selector': _vm.isMobile }},[_c('button',{staticClass:\"btn btn-flip-mode\",on:{\"click\":_vm.toggleFlipModeMenu}},[_c('span',{staticClass:\"flip-mode-icon\"},[_vm._v(_vm._s(_vm.flipModeIcon))]),_c('span',{staticClass:\"flip-mode-text\"},[_vm._v(_vm._s(_vm.flipModeLabel))])]),(_vm.showFlipModeMenu)?_c('div',{staticClass:\"flip-mode-menu\"},_vm._l((_vm.flipModes),function(mode){return _c('div',{key:mode.value,staticClass:\"flip-mode-item\",class:{ 'flip-mode-item-active': _vm.flipMode === mode.value },on:{\"click\":function($event){return _vm.selectFlipMode(mode.value)}}},[_c('span',{staticClass:\"flip-mode-item-icon\"},[_vm._v(_vm._s(mode.icon))]),_c('span',{staticClass:\"flip-mode-item-label\"},[_vm._v(_vm._s(mode.label))])])}),0):_vm._e()]):_vm._e(),_c('div',{staticClass:\"catalogue-button\",class:{\n 'mobile-catalogue-button': _vm.isMobile,\n 'dragging': _vm.catalogueButtonDragging,\n 'catalogue-visible': _vm.showControls\n },style:({\n left: _vm.catalogueButtonPosition.x + 'px',\n top: _vm.catalogueButtonPosition.y + 'px'\n }),on:{\"mousedown\":_vm.onCatalogueMouseDown,\"touchstart\":_vm.onCatalogueTouchStart,\"touchmove\":_vm.onCatalogueTouchMove,\"touchend\":_vm.onCatalogueTouchEnd,\"click\":function($event){$event.stopPropagation();}}},[_c('button',{staticClass:\"btn btn-catalogue\",on:{\"click\":_vm.openCatalogue}},[_c('span',{staticClass:\"catalogue-text\"},[_vm._v(\"目录\")])])]),_c('div',{staticClass:\"zoom-hint\",class:{ 'show': _vm.zoomScale !== 1 }},[_c('div',{staticClass:\"zoom-info\"},[_c('span',[_vm._v(\"缩放: \"+_vm._s(Math.round(_vm.zoomScale * 100))+\"%\")]),_c('button',{staticClass:\"btn-reset-zoom\",on:{\"click\":_vm.resetZoom}},[_vm._v(\"重置\")])])]),_c('div',{staticClass:\"zoom-toolbar\"},[_c('button',{staticClass:\"btn-zoom\",attrs:{\"disabled\":_vm.zoomScale <= 0.5},on:{\"click\":_vm.zoomOut}},[_vm._v(\"-\")]),_c('button',{staticClass:\"btn-zoom\",attrs:{\"disabled\":_vm.zoomScale >= 3},on:{\"click\":_vm.zoomIn}},[_vm._v(\"+\")])]),(_vm.loading)?_c('div',{staticClass:\"loading-overlay\"},[_vm._m(0)]):_vm._e(),(_vm.error && !_vm.loading)?_c('div',{staticClass:\"error-container\"},[_c('div',{staticClass:\"error-content\"},[_c('div',{staticClass:\"error-icon\"},[_vm._v(\"⚠️\")]),_c('h3',[_vm._v(\"加载失败\")]),_c('p',[_vm._v(_vm._s(_vm.error.message || '网络连接异常,请检查网络后重试'))]),_c('button',{staticClass:\"retry-btn\",on:{\"click\":_vm.fetchBooksData}},[_c('span',{staticClass:\"retry-icon\"},[_vm._v(\"🔄\")]),_vm._v(\" 重新加载 \")])])]):_vm._e(),(_vm.booksData && !_vm.loading && !_vm.error)?_c('div',{staticClass:\"success-toast\",class:{ 'show': _vm.showSuccessToast }},[_vm._v(\" 书籍加载完成 \")]):_vm._e(),_c('book-catalogue-drawer',{attrs:{\"book-id\":_vm.bookId,\"catalogue\":_vm.catalogue,\"loading\":_vm.catalogueLoading},on:{\"catalogue-click\":_vm.onCatalogueClick,\"page-jump\":_vm.onPageJump,\"Focus\":_vm.onFocus,\"fetch-catalogue\":_vm.onFetchCatalogue},model:{value:(_vm.showCatalogueDrawer),callback:function ($$v) {_vm.showCatalogueDrawer=$$v},expression:\"showCatalogueDrawer\"}})],1)\n}\nvar staticRenderFns = [function (){var _vm=this,_c=_vm._self._c;return _c('div',{staticClass:\"loading-container\"},[_c('div',{staticClass:\"loading-spinner\"},[_c('div',{staticClass:\"spinner-ring\"}),_c('div',{staticClass:\"spinner-ring\"}),_c('div',{staticClass:\"spinner-ring\"})]),_c('div',{staticClass:\"loading-text\"},[_c('h3',[_vm._v(\"正在加载书籍\")]),_c('p',[_vm._v(\"请稍候,正在获取精彩内容...\")]),_c('div',{staticClass:\"loading-progress\"},[_c('div',{staticClass:\"progress-bar\"})])])])\n}]\n\nexport { render, staticRenderFns }","/*! @license Rematrix v0.7.2\n\n\tCopyright 2021 Julian Lloyd.\n\n\tPermission is hereby granted, free of charge, to any person obtaining a copy\n\tof this software and associated documentation files (the \"Software\"), to deal\n\tin the Software without restriction, including without limitation the rights\n\tto use, copy, modify, merge, publish, distribute, sublicense, and/or sell\n\tcopies of the Software, and to permit persons to whom the Software is\n\tfurnished to do so, subject to the following conditions:\n\n\tThe above copyright notice and this permission notice shall be included in\n\tall copies or substantial portions of the Software.\n\n\tTHE SOFTWARE IS PROVIDED \"AS IS\", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR\n\tIMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,\n\tFITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE\n\tAUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER\n\tLIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,\n\tOUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN\n\tTHE SOFTWARE.\n*/\nfunction format(source) {\n if (source && source.constructor === Array) {\n var values = source\n .filter(function (value) { return typeof value === 'number'; })\n .filter(function (value) { return !isNaN(value); });\n\n if (source.length === 6 && values.length === 6) {\n var matrix = identity();\n matrix[0] = values[0];\n matrix[1] = values[1];\n matrix[4] = values[2];\n matrix[5] = values[3];\n matrix[12] = values[4];\n matrix[13] = values[5];\n return matrix\n } else if (source.length === 16 && values.length === 16) {\n return source\n }\n }\n throw new TypeError('Expected a `number[]` with length 6 or 16.')\n}\n\nfunction fromString(source) {\n if (typeof source === 'string') {\n var match = source.match(/matrix(3d)?\\(([^)]+)\\)/);\n if (match) {\n var raw = match[2].split(',').map(parseFloat);\n return format(raw)\n }\n if (source === 'none' || source === '') {\n return identity()\n }\n }\n throw new TypeError('Expected a string containing `matrix()` or `matrix3d()')\n}\n\nfunction identity() {\n var matrix = [];\n for (var i = 0; i < 16; i++) {\n i % 5 == 0 ? matrix.push(1) : matrix.push(0);\n }\n return matrix\n}\n\nfunction inverse(source) {\n var m = format(source);\n\n var s0 = m[0] * m[5] - m[4] * m[1];\n var s1 = m[0] * m[6] - m[4] * m[2];\n var s2 = m[0] * m[7] - m[4] * m[3];\n var s3 = m[1] * m[6] - m[5] * m[2];\n var s4 = m[1] * m[7] - m[5] * m[3];\n var s5 = m[2] * m[7] - m[6] * m[3];\n\n var c5 = m[10] * m[15] - m[14] * m[11];\n var c4 = m[9] * m[15] - m[13] * m[11];\n var c3 = m[9] * m[14] - m[13] * m[10];\n var c2 = m[8] * m[15] - m[12] * m[11];\n var c1 = m[8] * m[14] - m[12] * m[10];\n var c0 = m[8] * m[13] - m[12] * m[9];\n\n var determinant = 1 / (s0 * c5 - s1 * c4 + s2 * c3 + s3 * c2 - s4 * c1 + s5 * c0);\n\n if (isNaN(determinant) || determinant === Infinity) {\n throw new Error('Inverse determinant attempted to divide by zero.')\n }\n\n return [\n (m[5] * c5 - m[6] * c4 + m[7] * c3) * determinant,\n (-m[1] * c5 + m[2] * c4 - m[3] * c3) * determinant,\n (m[13] * s5 - m[14] * s4 + m[15] * s3) * determinant,\n (-m[9] * s5 + m[10] * s4 - m[11] * s3) * determinant,\n\n (-m[4] * c5 + m[6] * c2 - m[7] * c1) * determinant,\n (m[0] * c5 - m[2] * c2 + m[3] * c1) * determinant,\n (-m[12] * s5 + m[14] * s2 - m[15] * s1) * determinant,\n (m[8] * s5 - m[10] * s2 + m[11] * s1) * determinant,\n\n (m[4] * c4 - m[5] * c2 + m[7] * c0) * determinant,\n (-m[0] * c4 + m[1] * c2 - m[3] * c0) * determinant,\n (m[12] * s4 - m[13] * s2 + m[15] * s0) * determinant,\n (-m[8] * s4 + m[9] * s2 - m[11] * s0) * determinant,\n\n (-m[4] * c3 + m[5] * c1 - m[6] * c0) * determinant,\n (m[0] * c3 - m[1] * c1 + m[2] * c0) * determinant,\n (-m[12] * s3 + m[13] * s1 - m[14] * s0) * determinant,\n (m[8] * s3 - m[9] * s1 + m[10] * s0) * determinant ]\n}\n\nfunction multiply(matrixA, matrixB) {\n var fma = format(matrixA);\n var fmb = format(matrixB);\n var product = [];\n\n for (var i = 0; i < 4; i++) {\n var row = [fma[i], fma[i + 4], fma[i + 8], fma[i + 12]];\n for (var j = 0; j < 4; j++) {\n var k = j * 4;\n var col = [fmb[k], fmb[k + 1], fmb[k + 2], fmb[k + 3]];\n var result = row[0] * col[0] + row[1] * col[1] + row[2] * col[2] + row[3] * col[3];\n\n product[i + k] = result;\n }\n }\n\n return product\n}\n\nfunction perspective(distance) {\n var matrix = identity();\n matrix[11] = -1 / distance;\n return matrix\n}\n\nfunction rotate(angle) {\n return rotateZ(angle)\n}\n\nfunction rotateX(angle) {\n var theta = (Math.PI / 180) * angle;\n var matrix = identity();\n\n matrix[5] = matrix[10] = Math.cos(theta);\n matrix[6] = matrix[9] = Math.sin(theta);\n matrix[9] *= -1;\n\n return matrix\n}\n\nfunction rotateY(angle) {\n var theta = (Math.PI / 180) * angle;\n var matrix = identity();\n\n matrix[0] = matrix[10] = Math.cos(theta);\n matrix[2] = matrix[8] = Math.sin(theta);\n matrix[2] *= -1;\n\n return matrix\n}\n\nfunction rotateZ(angle) {\n var theta = (Math.PI / 180) * angle;\n var matrix = identity();\n\n matrix[0] = matrix[5] = Math.cos(theta);\n matrix[1] = matrix[4] = Math.sin(theta);\n matrix[4] *= -1;\n\n return matrix\n}\n\nfunction scale(scalar, scalarY) {\n var matrix = identity();\n\n matrix[0] = scalar;\n matrix[5] = typeof scalarY === 'number' ? scalarY : scalar;\n\n return matrix\n}\n\nfunction scaleX(scalar) {\n var matrix = identity();\n matrix[0] = scalar;\n return matrix\n}\n\nfunction scaleY(scalar) {\n var matrix = identity();\n matrix[5] = scalar;\n return matrix\n}\n\nfunction scaleZ(scalar) {\n var matrix = identity();\n matrix[10] = scalar;\n return matrix\n}\n\nfunction skew(angleX, angleY) {\n var thetaX = (Math.PI / 180) * angleX;\n var matrix = identity();\n\n matrix[4] = Math.tan(thetaX);\n\n if (angleY) {\n var thetaY = (Math.PI / 180) * angleY;\n matrix[1] = Math.tan(thetaY);\n }\n\n return matrix\n}\n\nfunction skewX(angle) {\n var theta = (Math.PI / 180) * angle;\n var matrix = identity();\n\n matrix[4] = Math.tan(theta);\n\n return matrix\n}\n\nfunction skewY(angle) {\n var theta = (Math.PI / 180) * angle;\n var matrix = identity();\n\n matrix[1] = Math.tan(theta);\n\n return matrix\n}\n\nfunction toString(source) {\n return (\"matrix3d(\" + (format(source).join(', ')) + \")\")\n}\n\nfunction translate(distanceX, distanceY) {\n var matrix = identity();\n matrix[12] = distanceX;\n\n if (distanceY) {\n matrix[13] = distanceY;\n }\n\n return matrix\n}\n\nfunction translate3d(distanceX, distanceY, distanceZ) {\n var matrix = identity();\n if (distanceX !== undefined && distanceY !== undefined && distanceZ !== undefined) {\n matrix[12] = distanceX;\n matrix[13] = distanceY;\n matrix[14] = distanceZ;\n }\n return matrix\n}\n\nfunction translateX(distance) {\n var matrix = identity();\n matrix[12] = distance;\n return matrix\n}\n\nfunction translateY(distance) {\n var matrix = identity();\n matrix[13] = distance;\n return matrix\n}\n\nfunction translateZ(distance) {\n var matrix = identity();\n matrix[14] = distance;\n return matrix\n}\n\nexport { format, fromString, identity, inverse, multiply, perspective, rotate, rotateX, rotateY, rotateZ, scale, scaleX, scaleY, scaleZ, skew, skewX, skewY, toString, translate, translate3d, translateX, translateY, translateZ };\n","/*!\n * @license\n * flipbook-vue v1.0.0-beta.4\n * Copyright © 2023 Takeshi Sone.\n * Released under the MIT License.\n */\n\nimport { multiply, perspective, translate, translate3d, rotateY, toString, identity } from 'rematrix';\n\nvar Matrix = /*@__PURE__*/(function () {\n function Matrix(arg) {\n if (arg) {\n if (arg.m) {\n this.m = [].concat( arg.m );\n } else {\n this.m = [].concat( arg );\n }\n } else {\n this.m = identity();\n }\n }\n\n Matrix.prototype.clone = function clone () {\n return new Matrix(this);\n };\n\n Matrix.prototype.multiply = function multiply$1 (m) {\n return this.m = multiply(this.m, m);\n };\n\n Matrix.prototype.perspective = function perspective$1 (d) {\n return this.multiply(perspective(d));\n };\n\n Matrix.prototype.transformX = function transformX (x) {\n return (x * this.m[0] + this.m[12]) / (x * this.m[3] + this.m[15]);\n };\n\n Matrix.prototype.translate = function translate$1 (x, y) {\n return this.multiply(translate(x, y));\n };\n\n Matrix.prototype.translate3d = function translate3d$1 (x, y, z) {\n return this.multiply(translate3d(x, y, z));\n };\n\n Matrix.prototype.rotateY = function rotateY$1 (deg) {\n return this.multiply(rotateY(deg));\n };\n\n Matrix.prototype.toString = function toString$1 () {\n return toString(this.m);\n };\n\n return Matrix;\n}());\n\nvar spinner = \"data:image/svg+xml,%3C%3Fxml%20version%3D%221.0%22%3F%3E%3Csvg%20xmlns%3D%22http%3A%2F%2Fwww.w3.org%2F2000%2Fsvg%22%20width%3D%22500%22%20height%3D%22500%22%20viewBox%3D%220%200%20500%20500%22%20fill%3D%22transparent%22%20style%3D%22background-color%3A%20%23fff%22%3E%20%20%3Ccircle%20%20%20%20cx%3D%22250%22%20%20%20%20cy%3D%22250%22%20%20%20%20r%3D%2248%22%20%20%20%20stroke%3D%22%23333%22%20%20%20%20stroke-width%3D%222%22%20%20%20%20stroke-dasharray%3D%22271%2030%22%20%20%3E%20%20%20%20%3CanimateTransform%20%20%20%20%20%20attributeName%3D%22transform%22%20%20%20%20%20%20attributeType%3D%22XML%22%20%20%20%20%20%20type%3D%22rotate%22%20%20%20%20%20%20from%3D%220%20250%20250%22%20%20%20%20%20%20to%3D%22360%20250%20250%22%20%20%20%20%20%20dur%3D%221s%22%20%20%20%20%20%20repeatCount%3D%22indefinite%22%20%20%20%20%2F%3E%20%20%3C%2Fcircle%3E%3C%2Fsvg%3E\";\n\nvar easeIn, easeInOut, easeOut;\n\neaseIn = function(x) {\n return Math.pow(x, 2);\n};\n\neaseOut = function(x) {\n return 1 - easeIn(1 - x);\n};\n\neaseInOut = function(x) {\n if (x < 0.5) {\n return easeIn(x * 2) / 2;\n } else {\n return 0.5 + easeOut((x - 0.5) * 2) / 2;\n }\n};\n\nvar script = {\n props: {\n pages: {\n type: Array,\n required: true\n },\n pagesHiRes: {\n type: Array,\n default: function() {\n return [];\n }\n },\n flipDuration: {\n type: Number,\n default: 1000\n },\n zoomDuration: {\n type: Number,\n default: 500\n },\n zooms: {\n type: Array,\n default: function() {\n return [1, 2, 4];\n }\n },\n perspective: {\n type: Number,\n default: 2400\n },\n nPolygons: {\n type: Number,\n default: 10\n },\n ambient: {\n type: Number,\n default: 0.4\n },\n gloss: {\n type: Number,\n default: 0.6\n },\n swipeMin: {\n type: Number,\n default: 3\n },\n singlePage: {\n type: Boolean,\n default: false\n },\n forwardDirection: {\n validator: function(val) {\n return val === 'right' || val === 'left';\n },\n default: 'right'\n },\n centering: {\n type: Boolean,\n default: true\n },\n startPage: {\n type: Number,\n default: null\n },\n loadingImage: {\n type: String,\n default: spinner\n },\n clickToZoom: {\n type: Boolean,\n default: true\n },\n dragToFlip: {\n type: Boolean,\n default: true\n },\n wheel: {\n type: String,\n default: 'scroll'\n }\n },\n data: function() {\n return {\n viewWidth: 0,\n viewHeight: 0,\n imageWidth: null,\n imageHeight: null,\n displayedPages: 1,\n nImageLoad: 0,\n nImageLoadTrigger: 0,\n imageLoadCallback: null,\n currentPage: 0,\n firstPage: 0,\n secondPage: 1,\n zoomIndex: 0,\n zoom: 1,\n zooming: false,\n touchStartX: null,\n touchStartY: null,\n maxMove: 0,\n activeCursor: null,\n hasTouchEvents: false,\n hasPointerEvents: false,\n minX: 2e308,\n maxX: -2e308,\n preloadedImages: {},\n flip: {\n progress: 0,\n direction: null,\n frontImage: null,\n backImage: null,\n auto: false,\n opacity: 1\n },\n currentCenterOffset: null,\n animatingCenter: false,\n startScrollLeft: 0,\n startScrollTop: 0,\n scrollLeft: 0,\n scrollTop: 0,\n loadedImages: {}\n };\n },\n computed: {\n IE: function() {\n return typeof navigator !== 'undefined' && /Trident/.test(navigator.userAgent);\n },\n canFlipLeft: function() {\n if (this.forwardDirection === 'left') {\n return this.canGoForward;\n } else {\n return this.canGoBack;\n }\n },\n canFlipRight: function() {\n if (this.forwardDirection === 'right') {\n return this.canGoForward;\n } else {\n return this.canGoBack;\n }\n },\n canZoomIn: function() {\n return !this.zooming && this.zoomIndex < this.zooms_.length - 1;\n },\n canZoomOut: function() {\n return !this.zooming && this.zoomIndex > 0;\n },\n numPages: function() {\n if (this.pages[0] === null) {\n return this.pages.length - 1;\n } else {\n return this.pages.length;\n }\n },\n page: function() {\n if (this.pages[0] !== null) {\n return this.currentPage + 1;\n } else {\n return Math.max(1, this.currentPage);\n }\n },\n zooms_: function() {\n return this.zooms || [1];\n },\n canGoForward: function() {\n return !this.flip.direction && this.currentPage < this.pages.length - this.displayedPages;\n },\n canGoBack: function() {\n return !this.flip.direction && this.currentPage >= this.displayedPages && !(this.displayedPages === 1 && !this.pageUrl(this.firstPage - 1));\n },\n leftPage: function() {\n if (this.forwardDirection === 'right' || this.displayedPages === 1) {\n return this.firstPage;\n } else {\n return this.secondPage;\n }\n },\n rightPage: function() {\n if (this.forwardDirection === 'left') {\n return this.firstPage;\n } else {\n return this.secondPage;\n }\n },\n showLeftPage: function() {\n return this.pageUrl(this.leftPage);\n },\n showRightPage: function() {\n return this.pageUrl(this.rightPage) && this.displayedPages === 2;\n },\n cursor: function() {\n if (this.activeCursor) {\n return this.activeCursor;\n } else if (this.IE) {\n return 'auto';\n } else if (this.clickToZoom && this.canZoomIn) {\n return 'zoom-in';\n } else if (this.clickToZoom && this.canZoomOut) {\n return 'zoom-out';\n } else if (this.dragToFlip) {\n return 'grab';\n } else {\n return 'auto';\n }\n },\n pageScale: function() {\n var scale, vw, xScale, yScale;\n vw = this.viewWidth / this.displayedPages;\n xScale = vw / this.imageWidth;\n yScale = this.viewHeight / this.imageHeight;\n scale = xScale < yScale ? xScale : yScale;\n if (scale < 1) {\n return scale;\n } else {\n return 1;\n }\n },\n pageWidth: function() {\n return Math.round(this.imageWidth * this.pageScale);\n },\n pageHeight: function() {\n return Math.round(this.imageHeight * this.pageScale);\n },\n xMargin: function() {\n return (this.viewWidth - this.pageWidth * this.displayedPages) / 2;\n },\n yMargin: function() {\n return (this.viewHeight - this.pageHeight) / 2;\n },\n polygonWidth: function() {\n var w;\n w = this.pageWidth / this.nPolygons;\n w = Math.ceil(w + 1 / this.zoom);\n return w + 'px';\n },\n polygonHeight: function() {\n return this.pageHeight + 'px';\n },\n polygonBgSize: function() {\n return ((this.pageWidth) + \"px \" + (this.pageHeight) + \"px\");\n },\n polygonArray: function() {\n return this.makePolygonArray('front').concat(this.makePolygonArray('back'));\n },\n boundingLeft: function() {\n var x;\n if (this.displayedPages === 1) {\n return this.xMargin;\n } else {\n x = this.pageUrl(this.leftPage) ? this.xMargin : this.viewWidth / 2;\n if (x < this.minX) {\n return x;\n } else {\n return this.minX;\n }\n }\n },\n boundingRight: function() {\n var x;\n if (this.displayedPages === 1) {\n return this.viewWidth - this.xMargin;\n } else {\n x = this.pageUrl(this.rightPage) ? this.viewWidth - this.xMargin : this.viewWidth / 2;\n if (x > this.maxX) {\n return x;\n } else {\n return this.maxX;\n }\n }\n },\n centerOffset: function() {\n var retval;\n retval = this.centering ? Math.round(this.viewWidth / 2 - (this.boundingLeft + this.boundingRight) / 2) : 0;\n if (this.currentCenterOffset === null && this.imageWidth !== null) {\n this.currentCenterOffset = retval;\n }\n return retval;\n },\n centerOffsetSmoothed: function() {\n return Math.round(this.currentCenterOffset);\n },\n dragToScroll: function() {\n return !this.hasTouchEvents;\n },\n scrollLeftMin: function() {\n var w;\n w = (this.boundingRight - this.boundingLeft) * this.zoom;\n if (w < this.viewWidth) {\n return (this.boundingLeft + this.centerOffsetSmoothed) * this.zoom - (this.viewWidth - w) / 2;\n } else {\n return (this.boundingLeft + this.centerOffsetSmoothed) * this.zoom;\n }\n },\n scrollLeftMax: function() {\n var w;\n w = (this.boundingRight - this.boundingLeft) * this.zoom;\n if (w < this.viewWidth) {\n return (this.boundingLeft + this.centerOffsetSmoothed) * this.zoom - (this.viewWidth - w) / 2;\n } else {\n return (this.boundingRight + this.centerOffsetSmoothed) * this.zoom - this.viewWidth;\n }\n },\n scrollTopMin: function() {\n var h;\n h = this.pageHeight * this.zoom;\n if (h < this.viewHeight) {\n return this.yMargin * this.zoom - (this.viewHeight - h) / 2;\n } else {\n return this.yMargin * this.zoom;\n }\n },\n scrollTopMax: function() {\n var h;\n h = this.pageHeight * this.zoom;\n if (h < this.viewHeight) {\n return this.yMargin * this.zoom - (this.viewHeight - h) / 2;\n } else {\n return (this.yMargin + this.pageHeight) * this.zoom - this.viewHeight;\n }\n },\n scrollLeftLimited: function() {\n return Math.min(this.scrollLeftMax, Math.max(this.scrollLeftMin, this.scrollLeft));\n },\n scrollTopLimited: function() {\n return Math.min(this.scrollTopMax, Math.max(this.scrollTopMin, this.scrollTop));\n }\n },\n mounted: function() {\n window.addEventListener('resize', this.onResize, {\n passive: true\n });\n this.onResize();\n this.zoom = this.zooms_[0];\n return this.goToPage(this.startPage);\n },\n beforeDestroy: function() {\n return window.removeEventListener('resize', this.onResize, {\n passive: true\n });\n },\n methods: {\n onResize: function() {\n var viewport;\n viewport = this.$refs.viewport;\n if (!viewport) {\n return;\n }\n this.viewWidth = viewport.clientWidth;\n this.viewHeight = viewport.clientHeight;\n this.displayedPages = this.viewWidth > this.viewHeight && !this.singlePage ? 2 : 1;\n if (this.displayedPages === 2) {\n this.currentPage &= ~1;\n }\n this.fixFirstPage();\n this.minX = 2e308;\n return this.maxX = -2e308;\n },\n fixFirstPage: function() {\n if (this.displayedPages === 1 && this.currentPage === 0 && this.pages.length && !this.pageUrl(0)) {\n return this.currentPage++;\n }\n },\n pageUrl: function(page, hiRes) {\n if ( hiRes === void 0 ) hiRes = false;\n\n var url;\n if (hiRes && this.zoom > 1 && !this.zooming) {\n url = this.pagesHiRes[page];\n if (url) {\n return url;\n }\n }\n return this.pages[page] || null;\n },\n pageUrlLoading: function(page, hiRes) {\n if ( hiRes === void 0 ) hiRes = false;\n\n var url;\n url = this.pageUrl(page, hiRes);\n if (hiRes && this.zoom > 1 && !this.zooming) {\n // High-res image doesn't use 'loading'\n return url;\n }\n return url && this.loadImage(url);\n },\n flipLeft: function() {\n if (!this.canFlipLeft) {\n return;\n }\n return this.flipStart('left', true);\n },\n flipRight: function() {\n if (!this.canFlipRight) {\n return;\n }\n return this.flipStart('right', true);\n },\n makePolygonArray: function(face) {\n var bgPos, dRadian, dRotate, direction, i, image, j, lighting, m, originRight, pageMatrix, pageRotation, pageX, polygonWidth, progress, rad, radian, radius, ref, results, rotate, theta, x, x0, x1, z;\n if (!this.flip.direction) {\n return [];\n }\n progress = this.flip.progress;\n direction = this.flip.direction;\n if (this.displayedPages === 1 && direction !== this.forwardDirection) {\n progress = 1 - progress;\n direction = this.forwardDirection;\n }\n this.flip.opacity = this.displayedPages === 1 && progress > .7 ? 1 - (progress - .7) / .3 : 1;\n image = face === 'front' ? this.flip.frontImage : this.flip.backImage;\n polygonWidth = this.pageWidth / this.nPolygons;\n pageX = this.xMargin;\n originRight = false;\n if (this.displayedPages === 1) {\n if (this.forwardDirection === 'right') {\n if (face === 'back') {\n originRight = true;\n pageX = this.xMargin - this.pageWidth;\n }\n } else {\n if (direction === 'left') {\n if (face === 'back') {\n pageX = this.pageWidth - this.xMargin;\n } else {\n originRight = true;\n }\n } else {\n if (face === 'front') {\n pageX = this.pageWidth - this.xMargin;\n } else {\n originRight = true;\n }\n }\n }\n } else {\n if (direction === 'left') {\n if (face === 'back') {\n pageX = this.viewWidth / 2;\n } else {\n originRight = true;\n }\n } else {\n if (face === 'front') {\n pageX = this.viewWidth / 2;\n } else {\n originRight = true;\n }\n }\n }\n pageMatrix = new Matrix();\n pageMatrix.translate(this.viewWidth / 2);\n pageMatrix.perspective(this.perspective);\n pageMatrix.translate(-this.viewWidth / 2);\n pageMatrix.translate(pageX, this.yMargin);\n pageRotation = 0;\n if (progress > 0.5) {\n pageRotation = -(progress - 0.5) * 2 * 180;\n }\n if (direction === 'left') {\n pageRotation = -pageRotation;\n }\n if (face === 'back') {\n pageRotation += 180;\n }\n if (pageRotation) {\n if (originRight) {\n pageMatrix.translate(this.pageWidth);\n }\n pageMatrix.rotateY(pageRotation);\n if (originRight) {\n pageMatrix.translate(-this.pageWidth);\n }\n }\n if (progress < 0.5) {\n theta = progress * 2 * Math.PI;\n } else {\n theta = (1 - (progress - 0.5) * 2) * Math.PI;\n }\n if (theta === 0) {\n theta = 1e-9;\n }\n radius = this.pageWidth / theta;\n radian = 0;\n dRadian = theta / this.nPolygons;\n rotate = dRadian / 2 / Math.PI * 180;\n dRotate = dRadian / Math.PI * 180;\n if (originRight) {\n rotate = -theta / Math.PI * 180 + dRotate / 2;\n }\n if (face === 'back') {\n rotate = -rotate;\n dRotate = -dRotate;\n }\n this.minX = 2e308;\n this.maxX = -2e308;\n results = [];\n for (i = j = 0, ref = this.nPolygons; (0 <= ref ? j < ref : j > ref); i = 0 <= ref ? ++j : --j) {\n bgPos = (i / (this.nPolygons - 1) * 100) + \"% 0px\";\n m = pageMatrix.clone();\n rad = originRight ? theta - radian : radian;\n x = Math.sin(rad) * radius;\n if (originRight) {\n x = this.pageWidth - x;\n }\n z = (1 - Math.cos(rad)) * radius;\n if (face === 'back') {\n z = -z;\n }\n m.translate3d(x, 0, z);\n m.rotateY(-rotate);\n x0 = m.transformX(0);\n x1 = m.transformX(polygonWidth);\n this.maxX = Math.max(Math.max(x0, x1), this.maxX);\n this.minX = Math.min(Math.min(x0, x1), this.minX);\n lighting = this.computeLighting(pageRotation - rotate, dRotate);\n radian += dRadian;\n rotate += dRotate;\n results.push([face + i, image, lighting, bgPos, m.toString(), Math.abs(Math.round(z))]);\n }\n return results;\n },\n computeLighting: function(rot, dRotate) {\n var DEG, POW, blackness, diffuse, gradients, lightingPoints, specular;\n gradients = [];\n lightingPoints = [-0.5, -0.25, 0, 0.25, 0.5];\n if (this.ambient < 1) {\n blackness = 1 - this.ambient;\n diffuse = lightingPoints.map(function (d) {\n return (1 - Math.cos((rot - dRotate * d) / 180 * Math.PI)) * blackness;\n });\n gradients.push((\"linear-gradient(to right,\\n rgba(0, 0, 0, \" + (diffuse[0]) + \"),\\n rgba(0, 0, 0, \" + (diffuse[1]) + \") 25%,\\n rgba(0, 0, 0, \" + (diffuse[2]) + \") 50%,\\n rgba(0, 0, 0, \" + (diffuse[3]) + \") 75%,\\n rgba(0, 0, 0, \" + (diffuse[4]) + \"))\"));\n }\n if (this.gloss > 0 && !this.IE) {\n DEG = 30;\n POW = 200;\n specular = lightingPoints.map(function (d) {\n return Math.max(Math.pow( Math.cos((rot + DEG - dRotate * d) / 180 * Math.PI), POW ), Math.pow( Math.cos((rot - DEG - dRotate * d) / 180 * Math.PI), POW ));\n });\n gradients.push((\"linear-gradient(to right,\\n rgba(255, 255, 255, \" + (specular[0] * this.gloss) + \"),\\n rgba(255, 255, 255, \" + (specular[1] * this.gloss) + \") 25%,\\n rgba(255, 255, 255, \" + (specular[2] * this.gloss) + \") 50%,\\n rgba(255, 255, 255, \" + (specular[3] * this.gloss) + \") 75%,\\n rgba(255, 255, 255, \" + (specular[4] * this.gloss) + \"))\"));\n }\n return gradients.join(',');\n },\n flipStart: function(direction, auto) {\n var this$1$1 = this;\n\n if (direction !== this.forwardDirection) {\n if (this.displayedPages === 1) {\n this.flip.frontImage = this.pageUrl(this.currentPage - 1);\n this.flip.backImage = null;\n } else {\n this.flip.frontImage = this.pageUrl(this.firstPage);\n this.flip.backImage = this.pageUrl(this.currentPage - this.displayedPages + 1);\n }\n } else {\n if (this.displayedPages === 1) {\n this.flip.frontImage = this.pageUrl(this.currentPage);\n this.flip.backImage = null;\n } else {\n this.flip.frontImage = this.pageUrl(this.secondPage);\n this.flip.backImage = this.pageUrl(this.currentPage + this.displayedPages);\n }\n }\n this.flip.direction = direction;\n this.flip.progress = 0;\n return requestAnimationFrame(function () {\n return requestAnimationFrame(function () {\n if (this$1$1.flip.direction !== this$1$1.forwardDirection) {\n if (this$1$1.displayedPages === 2) {\n this$1$1.firstPage = this$1$1.currentPage - this$1$1.displayedPages;\n }\n } else {\n if (this$1$1.displayedPages === 1) {\n this$1$1.firstPage = this$1$1.currentPage + this$1$1.displayedPages;\n } else {\n this$1$1.secondPage = this$1$1.currentPage + 1 + this$1$1.displayedPages;\n }\n }\n if (auto) {\n return this$1$1.flipAuto(true);\n }\n });\n });\n },\n flipAuto: function(ease) {\n var this$1$1 = this;\n\n var animate, duration, startRatio, t0;\n t0 = Date.now();\n duration = this.flipDuration * (1 - this.flip.progress);\n startRatio = this.flip.progress;\n this.flip.auto = true;\n this.$emit((\"flip-\" + (this.flip.direction) + \"-start\"), this.page);\n animate = function () {\n return requestAnimationFrame(function () {\n var ratio, t;\n t = Date.now() - t0;\n ratio = startRatio + t / duration;\n if (ratio > 1) {\n ratio = 1;\n }\n this$1$1.flip.progress = ease ? easeInOut(ratio) : ratio;\n if (ratio < 1) {\n return animate();\n } else {\n if (this$1$1.flip.direction !== this$1$1.forwardDirection) {\n this$1$1.currentPage -= this$1$1.displayedPages;\n } else {\n this$1$1.currentPage += this$1$1.displayedPages;\n }\n this$1$1.$emit((\"flip-\" + (this$1$1.flip.direction) + \"-end\"), this$1$1.page);\n if (this$1$1.displayedPages === 1 && this$1$1.flip.direction === this$1$1.forwardDirection) {\n this$1$1.flip.direction = null;\n } else {\n this$1$1.onImageLoad(1, function () {\n return this$1$1.flip.direction = null;\n });\n }\n return this$1$1.flip.auto = false;\n }\n });\n };\n return animate();\n },\n flipRevert: function() {\n var this$1$1 = this;\n\n var animate, duration, startRatio, t0;\n t0 = Date.now();\n duration = this.flipDuration * this.flip.progress;\n startRatio = this.flip.progress;\n this.flip.auto = true;\n animate = function () {\n return requestAnimationFrame(function () {\n var ratio, t;\n t = Date.now() - t0;\n ratio = startRatio - startRatio * t / duration;\n if (ratio < 0) {\n ratio = 0;\n }\n this$1$1.flip.progress = ratio;\n if (ratio > 0) {\n return animate();\n } else {\n this$1$1.firstPage = this$1$1.currentPage;\n this$1$1.secondPage = this$1$1.currentPage + 1;\n if (this$1$1.displayedPages === 1 && this$1$1.flip.direction !== this$1$1.forwardDirection) {\n this$1$1.flip.direction = null;\n } else {\n this$1$1.onImageLoad(1, function () {\n return this$1$1.flip.direction = null;\n });\n }\n return this$1$1.flip.auto = false;\n }\n });\n };\n return animate();\n },\n onImageLoad: function(trigger, cb) {\n this.nImageLoad = 0;\n this.nImageLoadTrigger = trigger;\n return this.imageLoadCallback = cb;\n },\n didLoadImage: function(ev) {\n if (this.imageWidth === null) {\n this.imageWidth = (ev.target || ev.path[0]).naturalWidth;\n this.imageHeight = (ev.target || ev.path[0]).naturalHeight;\n this.preloadImages();\n }\n if (!this.imageLoadCallback) {\n return;\n }\n if (++this.nImageLoad >= this.nImageLoadTrigger) {\n this.imageLoadCallback();\n return this.imageLoadCallback = null;\n }\n },\n zoomIn: function(zoomAt) {\n if ( zoomAt === void 0 ) zoomAt = null;\n\n if (!this.canZoomIn) {\n return;\n }\n this.zoomIndex += 1;\n return this.zoomTo(this.zooms_[this.zoomIndex], zoomAt);\n },\n zoomOut: function(zoomAt) {\n if ( zoomAt === void 0 ) zoomAt = null;\n\n if (!this.canZoomOut) {\n return;\n }\n this.zoomIndex -= 1;\n return this.zoomTo(this.zooms_[this.zoomIndex], zoomAt);\n },\n zoomTo: function(zoom, zoomAt) {\n var this$1$1 = this;\n if ( zoomAt === void 0 ) zoomAt = null;\n\n var animate, containerFixedX, containerFixedY, end, endX, endY, fixedX, fixedY, rect, start, startX, startY, t0, viewport;\n viewport = this.$refs.viewport;\n if (zoomAt) {\n rect = viewport.getBoundingClientRect();\n fixedX = zoomAt.pageX - rect.left;\n fixedY = zoomAt.pageY - rect.top;\n } else {\n fixedX = viewport.clientWidth / 2;\n fixedY = viewport.clientHeight / 2;\n }\n start = this.zoom;\n end = zoom;\n startX = viewport.scrollLeft;\n startY = viewport.scrollTop;\n containerFixedX = fixedX + startX;\n containerFixedY = fixedY + startY;\n endX = containerFixedX / start * end - fixedX;\n endY = containerFixedY / start * end - fixedY;\n t0 = Date.now();\n this.zooming = true;\n this.$emit('zoom-start', zoom);\n animate = function () {\n return requestAnimationFrame(function () {\n var ratio, t;\n t = Date.now() - t0;\n ratio = t / this$1$1.zoomDuration;\n if (ratio > 1 || this$1$1.IE) {\n ratio = 1;\n }\n ratio = easeInOut(ratio);\n this$1$1.zoom = start + (end - start) * ratio;\n this$1$1.scrollLeft = startX + (endX - startX) * ratio;\n this$1$1.scrollTop = startY + (endY - startY) * ratio;\n if (t < this$1$1.zoomDuration) {\n return animate();\n } else {\n this$1$1.$emit('zoom-end', zoom);\n this$1$1.zooming = false;\n this$1$1.zoom = zoom;\n this$1$1.scrollLeft = endX;\n return this$1$1.scrollTop = endY;\n }\n });\n };\n animate();\n if (end > 1) {\n return this.preloadImages(true);\n }\n },\n zoomAt: function(zoomAt) {\n this.zoomIndex = (this.zoomIndex + 1) % this.zooms_.length;\n return this.zoomTo(this.zooms_[this.zoomIndex], zoomAt);\n },\n swipeStart: function(touch) {\n this.touchStartX = touch.pageX;\n this.touchStartY = touch.pageY;\n this.maxMove = 0;\n if (this.zoom <= 1) {\n if (this.dragToFlip) {\n return this.activeCursor = 'grab';\n }\n } else {\n this.startScrollLeft = this.$refs.viewport.scrollLeft;\n this.startScrollTop = this.$refs.viewport.scrollTop;\n return this.activeCursor = 'all-scroll';\n }\n },\n swipeMove: function(touch) {\n var x, y;\n if (this.touchStartX == null) {\n return;\n }\n x = touch.pageX - this.touchStartX;\n y = touch.pageY - this.touchStartY;\n this.maxMove = Math.max(this.maxMove, Math.abs(x));\n this.maxMove = Math.max(this.maxMove, Math.abs(y));\n if (this.zoom > 1) {\n if (this.dragToScroll) {\n this.dragScroll(x, y);\n }\n return;\n }\n if (!this.dragToFlip) {\n return;\n }\n if (Math.abs(y) > Math.abs(x)) {\n return;\n }\n this.activeCursor = 'grabbing';\n if (x > 0) {\n if (this.flip.direction === null && this.canFlipLeft && x >= this.swipeMin) {\n this.flipStart('left', false);\n }\n if (this.flip.direction === 'left') {\n this.flip.progress = x / this.pageWidth;\n if (this.flip.progress > 1) {\n this.flip.progress = 1;\n }\n }\n } else {\n if (this.flip.direction === null && this.canFlipRight && x <= -this.swipeMin) {\n this.flipStart('right', false);\n }\n if (this.flip.direction === 'right') {\n this.flip.progress = -x / this.pageWidth;\n if (this.flip.progress > 1) {\n this.flip.progress = 1;\n }\n }\n }\n return true;\n },\n swipeEnd: function(touch) {\n if (this.touchStartX == null) {\n return;\n }\n if (this.clickToZoom && this.maxMove < this.swipeMin) {\n this.zoomAt(touch);\n }\n if (this.flip.direction !== null && !this.flip.auto) {\n if (this.flip.progress > 1 / 4) {\n this.flipAuto(false);\n } else {\n this.flipRevert();\n }\n }\n this.touchStartX = null;\n return this.activeCursor = null;\n },\n onTouchStart: function(ev) {\n this.hasTouchEvents = true;\n return this.swipeStart(ev.changedTouches[0]);\n },\n onTouchMove: function(ev) {\n if (this.swipeMove(ev.changedTouches[0])) {\n if (ev.cancelable) {\n return ev.preventDefault();\n }\n }\n },\n onTouchEnd: function(ev) {\n return this.swipeEnd(ev.changedTouches[0]);\n },\n onPointerDown: function(ev) {\n this.hasPointerEvents = true;\n if (this.hasTouchEvents) {\n return;\n }\n if (ev.which && ev.which !== 1) { // Ignore right-click\n return;\n }\n this.swipeStart(ev);\n try {\n return ev.target.setPointerCapture(ev.pointerId);\n } catch (error) {\n\n }\n },\n onPointerMove: function(ev) {\n if (!this.hasTouchEvents) {\n return this.swipeMove(ev);\n }\n },\n onPointerUp: function(ev) {\n if (this.hasTouchEvents) {\n return;\n }\n this.swipeEnd(ev);\n try {\n return ev.target.releasePointerCapture(ev.pointerId);\n } catch (error) {\n\n }\n },\n onMouseDown: function(ev) {\n if (this.hasTouchEvents || this.hasPointerEvents) {\n return;\n }\n if (ev.which && ev.which !== 1) { // Ignore right-click\n return;\n }\n return this.swipeStart(ev);\n },\n onMouseMove: function(ev) {\n if (!(this.hasTouchEvents || this.hasPointerEvents)) {\n return this.swipeMove(ev);\n }\n },\n onMouseUp: function(ev) {\n if (!(this.hasTouchEvents || this.hasPointerEvents)) {\n return this.swipeEnd(ev);\n }\n },\n dragScroll: function(x, y) {\n this.scrollLeft = this.startScrollLeft - x;\n return this.scrollTop = this.startScrollTop - y;\n },\n onWheel: function(ev) {\n if (this.wheel === 'scroll' && this.zoom > 1 && this.dragToScroll) {\n this.scrollLeft = this.$refs.viewport.scrollLeft + ev.deltaX;\n this.scrollTop = this.$refs.viewport.scrollTop + ev.deltaY;\n if (ev.cancelable) {\n ev.preventDefault();\n }\n }\n if (this.wheel === 'zoom') {\n if (ev.deltaY >= 100) {\n this.zoomOut(ev);\n return ev.preventDefault();\n } else if (ev.deltaY <= -100) {\n this.zoomIn(ev);\n return ev.preventDefault();\n }\n }\n },\n preloadImages: function(hiRes) {\n if ( hiRes === void 0 ) hiRes = false;\n\n var i, j, k, ref, ref1, ref2, ref3, src;\n for (i = j = ref = this.currentPage - 3, ref1 = this.currentPage + 3; (ref <= ref1 ? j <= ref1 : j >= ref1); i = ref <= ref1 ? ++j : --j) {\n this.pageUrlLoading(i); // this preloads image\n }\n if (hiRes) {\n for (i = k = ref2 = this.currentPage, ref3 = this.currentPage + this.displayedPages; (ref2 <= ref3 ? k < ref3 : k > ref3); i = ref2 <= ref3 ? ++k : --k) {\n src = this.pagesHiRes[i];\n if (src) {\n (new Image()).src = src;\n }\n }\n }\n },\n goToPage: function(p) {\n if (p === null || p === this.page) {\n return;\n }\n if (this.pages[0] === null) {\n if (this.displayedPages === 2 && p === 1) {\n this.currentPage = 0;\n } else {\n this.currentPage = p;\n }\n } else {\n this.currentPage = p - 1;\n }\n this.minX = 2e308;\n this.maxX = -2e308;\n return this.currentCenterOffset = this.centerOffset;\n },\n loadImage: function(url) {\n var this$1$1 = this;\n\n var img;\n if (this.imageWidth === null) {\n // First loaded image defines the image width and height.\n // So it must be true image, not 'loading' image.\n return url;\n } else {\n if (this.loadedImages[url]) {\n return url;\n } else {\n img = new Image();\n img.onload = function () {\n if (this$1$1.$set) {\n return this$1$1.$set(this$1$1.loadedImages, url, true);\n } else {\n return this$1$1.loadedImages[url] = true;\n }\n };\n img.src = url;\n return this.loadingImage;\n }\n }\n }\n },\n watch: {\n currentPage: function() {\n this.firstPage = this.currentPage;\n this.secondPage = this.currentPage + 1;\n return this.preloadImages();\n },\n centerOffset: function() {\n var this$1$1 = this;\n\n var animate;\n if (this.animatingCenter) {\n return;\n }\n animate = function () {\n return requestAnimationFrame(function () {\n var diff, rate;\n rate = 0.1;\n diff = this$1$1.centerOffset - this$1$1.currentCenterOffset;\n if (Math.abs(diff) < 0.5) {\n this$1$1.currentCenterOffset = this$1$1.centerOffset;\n return this$1$1.animatingCenter = false;\n } else {\n this$1$1.currentCenterOffset += diff * rate;\n return animate();\n }\n });\n };\n this.animatingCenter = true;\n return animate();\n },\n scrollLeftLimited: function(val) {\n var this$1$1 = this;\n\n if (this.IE) {\n return requestAnimationFrame(function () {\n return this$1$1.$refs.viewport.scrollLeft = val;\n });\n } else {\n return this.$refs.viewport.scrollLeft = val;\n }\n },\n scrollTopLimited: function(val) {\n var this$1$1 = this;\n\n if (this.IE) {\n return requestAnimationFrame(function () {\n return this$1$1.$refs.viewport.scrollTop = val;\n });\n } else {\n return this.$refs.viewport.scrollTop = val;\n }\n },\n pages: function(after, before) {\n this.fixFirstPage();\n if (!(before != null ? before.length : void 0) && (after != null ? after.length : void 0)) {\n if (this.startPage > 1 && after[0] === null) {\n return this.currentPage++;\n }\n }\n },\n startPage: function(p) {\n return this.goToPage(p);\n }\n }\n};\n\nfunction normalizeComponent(template, style, script, scopeId, isFunctionalTemplate, moduleIdentifier /* server only */, shadowMode, createInjector, createInjectorSSR, createInjectorShadow) {\r\n if (typeof shadowMode !== 'boolean') {\r\n createInjectorSSR = createInjector;\r\n createInjector = shadowMode;\r\n shadowMode = false;\r\n }\r\n // Vue.extend constructor export interop.\r\n var options = typeof script === 'function' ? script.options : script;\r\n // render functions\r\n if (template && template.render) {\r\n options.render = template.render;\r\n options.staticRenderFns = template.staticRenderFns;\r\n options._compiled = true;\r\n // functional template\r\n if (isFunctionalTemplate) {\r\n options.functional = true;\r\n }\r\n }\r\n // scopedId\r\n if (scopeId) {\r\n options._scopeId = scopeId;\r\n }\r\n var hook;\r\n if (moduleIdentifier) {\r\n // server build\r\n hook = function (context) {\r\n // 2.3 injection\r\n context =\r\n context || // cached call\r\n (this.$vnode && this.$vnode.ssrContext) || // stateful\r\n (this.parent && this.parent.$vnode && this.parent.$vnode.ssrContext); // functional\r\n // 2.2 with runInNewContext: true\r\n if (!context && typeof __VUE_SSR_CONTEXT__ !== 'undefined') {\r\n context = __VUE_SSR_CONTEXT__;\r\n }\r\n // inject component styles\r\n if (style) {\r\n style.call(this, createInjectorSSR(context));\r\n }\r\n // register component module identifier for async chunk inference\r\n if (context && context._registeredComponents) {\r\n context._registeredComponents.add(moduleIdentifier);\r\n }\r\n };\r\n // used by ssr in case component is cached and beforeCreate\r\n // never gets called\r\n options._ssrRegister = hook;\r\n }\r\n else if (style) {\r\n hook = shadowMode\r\n ? function (context) {\r\n style.call(this, createInjectorShadow(context, this.$root.$options.shadowRoot));\r\n }\r\n : function (context) {\r\n style.call(this, createInjector(context));\r\n };\r\n }\r\n if (hook) {\r\n if (options.functional) {\r\n // register for functional component in vue file\r\n var originalRender = options.render;\r\n options.render = function renderWithStyleInjection(h, context) {\r\n hook.call(context);\r\n return originalRender(h, context);\r\n };\r\n }\r\n else {\r\n // inject component registration as beforeCreate hook\r\n var existing = options.beforeCreate;\r\n options.beforeCreate = existing ? [].concat(existing, hook) : [hook];\r\n }\r\n }\r\n return script;\r\n}\n\nvar isOldIE = typeof navigator !== 'undefined' &&\r\n /msie [6-9]\\\\b/.test(navigator.userAgent.toLowerCase());\r\nfunction createInjector(context) {\r\n return function (id, style) { return addStyle(id, style); };\r\n}\r\nvar HEAD;\r\nvar styles = {};\r\nfunction addStyle(id, css) {\r\n var group = isOldIE ? css.media || 'default' : id;\r\n var style = styles[group] || (styles[group] = { ids: new Set(), styles: [] });\r\n if (!style.ids.has(id)) {\r\n style.ids.add(id);\r\n var code = css.source;\r\n if (css.map) {\r\n // https://developer.chrome.com/devtools/docs/javascript-debugging\r\n // this makes source maps inside style tags work properly in Chrome\r\n code += '\\n/*# sourceURL=' + css.map.sources[0] + ' */';\r\n // http://stackoverflow.com/a/26603875\r\n code +=\r\n '\\n/*# sourceMappingURL=data:application/json;base64,' +\r\n btoa(unescape(encodeURIComponent(JSON.stringify(css.map)))) +\r\n ' */';\r\n }\r\n if (!style.element) {\r\n style.element = document.createElement('style');\r\n style.element.type = 'text/css';\r\n if (css.media)\r\n { style.element.setAttribute('media', css.media); }\r\n if (HEAD === undefined) {\r\n HEAD = document.head || document.getElementsByTagName('head')[0];\r\n }\r\n HEAD.appendChild(style.element);\r\n }\r\n if ('styleSheet' in style.element) {\r\n style.styles.push(code);\r\n style.element.styleSheet.cssText = style.styles\r\n .filter(Boolean)\r\n .join('\\n');\r\n }\r\n else {\r\n var index = style.ids.size - 1;\r\n var textNode = document.createTextNode(code);\r\n var nodes = style.element.childNodes;\r\n if (nodes[index])\r\n { style.element.removeChild(nodes[index]); }\r\n if (nodes.length)\r\n { style.element.insertBefore(textNode, nodes[index]); }\r\n else\r\n { style.element.appendChild(textNode); }\r\n }\r\n }\r\n}\n\n/* script */\nvar __vue_script__ = script;\n\n/* template */\nvar __vue_render__ = function () {var _vm=this;var _h=_vm.$createElement;var _c=_vm._self._c||_h;return _c('div',[_vm._t(\"default\",null,null,{\n canFlipLeft: _vm.canFlipLeft,\n canFlipRight: _vm.canFlipRight,\n canZoomIn: _vm.canZoomIn,\n canZoomOut: _vm.canZoomOut,\n page: _vm.page,\n numPages: _vm.numPages,\n flipLeft: _vm.flipLeft,\n flipRight: _vm.flipRight,\n zoomIn: _vm.zoomIn,\n zoomOut: _vm.zoomOut,\n }),_vm._v(\" \"),_c('div',{ref:\"viewport\",staticClass:\"viewport\",class:{\n zoom: _vm.zooming || _vm.zoom > 1,\n 'drag-to-scroll': _vm.dragToScroll,\n },style:({ cursor: _vm.cursor == 'grabbing' ? 'grabbing' : 'auto' }),on:{\"touchmove\":_vm.onTouchMove,\"pointermove\":_vm.onPointerMove,\"mousemove\":_vm.onMouseMove,\"touchend\":_vm.onTouchEnd,\"touchcancel\":_vm.onTouchEnd,\"pointerup\":_vm.onPointerUp,\"pointercancel\":_vm.onPointerUp,\"mouseup\":_vm.onMouseUp,\"wheel\":_vm.onWheel}},[_c('div',{staticClass:\"flipbook-container\",style:({ transform: (\"scale(\" + _vm.zoom + \")\") })},[_c('div',{staticClass:\"click-to-flip left\",style:({ cursor: _vm.canFlipLeft ? 'pointer' : 'auto' }),on:{\"click\":_vm.flipLeft}}),_vm._v(\" \"),_c('div',{staticClass:\"click-to-flip right\",style:({ cursor: _vm.canFlipRight ? 'pointer' : 'auto' }),on:{\"click\":_vm.flipRight}}),_vm._v(\" \"),_c('div',{style:({ transform: (\"translateX(\" + _vm.centerOffsetSmoothed + \"px)\") })},[(_vm.showLeftPage)?_c('img',{staticClass:\"page fixed\",style:({\n width: _vm.pageWidth + 'px',\n height: _vm.pageHeight + 'px',\n left: _vm.xMargin + 'px',\n top: _vm.yMargin + 'px',\n }),attrs:{\"src\":_vm.pageUrlLoading(_vm.leftPage, true)},on:{\"load\":function($event){return _vm.didLoadImage($event)}}}):_vm._e(),_vm._v(\" \"),(_vm.showRightPage)?_c('img',{staticClass:\"page fixed\",style:({\n width: _vm.pageWidth + 'px',\n height: _vm.pageHeight + 'px',\n left: _vm.viewWidth / 2 + 'px',\n top: _vm.yMargin + 'px',\n }),attrs:{\"src\":_vm.pageUrlLoading(_vm.rightPage, true)},on:{\"load\":function($event){return _vm.didLoadImage($event)}}}):_vm._e(),_vm._v(\" \"),_c('div',{style:({ opacity: _vm.flip.opacity })},_vm._l((_vm.polygonArray),function(ref){\n var key = ref[0];\n var bgImage = ref[1];\n var lighting = ref[2];\n var bgPos = ref[3];\n var transform = ref[4];\n var z = ref[5];\nreturn _c('div',{key:key,staticClass:\"polygon\",class:{ blank: !bgImage },style:({\n backgroundImage: bgImage && (\"url(\" + (_vm.loadImage(bgImage)) + \")\"),\n backgroundSize: _vm.polygonBgSize,\n backgroundPosition: bgPos,\n width: _vm.polygonWidth,\n height: _vm.polygonHeight,\n transform: transform,\n zIndex: z,\n })},[_c('div',{directives:[{name:\"show\",rawName:\"v-show\",value:(lighting.length),expression:\"lighting.length\"}],staticClass:\"lighting\",style:({ backgroundImage: lighting })})])}),0),_vm._v(\" \"),_c('div',{staticClass:\"bounding-box\",style:({\n left: _vm.boundingLeft + 'px',\n top: _vm.yMargin + 'px',\n width: _vm.boundingRight - _vm.boundingLeft + 'px',\n height: _vm.pageHeight + 'px',\n cursor: _vm.cursor,\n }),on:{\"touchstart\":_vm.onTouchStart,\"pointerdown\":_vm.onPointerDown,\"mousedown\":_vm.onMouseDown}})])])])],2)};\nvar __vue_staticRenderFns__ = [];\n\n /* style */\n var __vue_inject_styles__ = function (inject) {\n if (!inject) { return }\n inject(\"data-v-e3f0fbe2_0\", { source: \".viewport[data-v-e3f0fbe2]{-webkit-overflow-scrolling:touch;width:100%;height:100%}.viewport.zoom[data-v-e3f0fbe2]{overflow:scroll}.viewport.zoom.drag-to-scroll[data-v-e3f0fbe2]{overflow:hidden}.flipbook-container[data-v-e3f0fbe2]{position:relative;width:100%;height:100%;transform-origin:top left;user-select:none}.click-to-flip[data-v-e3f0fbe2]{position:absolute;width:50%;height:100%;top:0;user-select:none}.click-to-flip.left[data-v-e3f0fbe2]{left:0}.click-to-flip.right[data-v-e3f0fbe2]{right:0}.bounding-box[data-v-e3f0fbe2]{position:absolute;user-select:none}.page[data-v-e3f0fbe2]{position:absolute;backface-visibility:hidden}.polygon[data-v-e3f0fbe2]{position:absolute;top:0;left:0;background-repeat:no-repeat;backface-visibility:hidden;transform-origin:center left}.polygon.blank[data-v-e3f0fbe2]{background-color:#ddd}.polygon .lighting[data-v-e3f0fbe2]{width:100%;height:100%}\", map: undefined, media: undefined });\n\n };\n /* scoped */\n var __vue_scope_id__ = \"data-v-e3f0fbe2\";\n /* module identifier */\n var __vue_module_identifier__ = undefined;\n /* functional template */\n var __vue_is_functional_template__ = false;\n /* style inject SSR */\n \n /* style inject shadow dom */\n \n\n \n var __vue_component__ = /*#__PURE__*/normalizeComponent(\n { render: __vue_render__, staticRenderFns: __vue_staticRenderFns__ },\n __vue_inject_styles__,\n __vue_script__,\n __vue_scope_id__,\n __vue_is_functional_template__,\n __vue_module_identifier__,\n false,\n createInjector,\n undefined,\n undefined\n );\n\nexport { __vue_component__ as default };\n","var render = function render(){var _vm=this,_c=_vm._self._c;return _c('div',{staticClass:\"catalogue-drawer-container\"},[(_vm.visible)?_c('div',{staticClass:\"drawer-overlay\",on:{\"click\":_vm.closeDrawer}}):_vm._e(),_c('div',{staticClass:\"catalogue-drawer\",class:{ 'drawer-open': _vm.visible },style:({ width: _vm.drawerWidth })},[_c('div',{staticClass:\"drawer-header\"},[_c('h3',{staticClass:\"drawer-title\"},[_vm._v(\"目录\")]),_c('button',{staticClass:\"close-button\",on:{\"click\":_vm.closeDrawer}},[_c('span',{staticClass:\"close-icon\"},[_vm._v(\"×\")])])]),_c('div',{staticClass:\"page-jump-section\"},[_c('input',{directives:[{name:\"model\",rawName:\"v-model\",value:(_vm.jumpPageInput),expression:\"jumpPageInput\"}],staticClass:\"page-jump-input\",attrs:{\"type\":\"text\",\"placeholder\":\"请输入页码\"},domProps:{\"value\":(_vm.jumpPageInput)},on:{\"input\":[function($event){if($event.target.composing)return;_vm.jumpPageInput=$event.target.value},_vm.handlePageInput],\"focus\":_vm.onInputFocus,\"blur\":_vm.onInputBlur}}),_c('button',{staticClass:\"btn-jump\",on:{\"click\":_vm.handleJumpToPage}},[_vm._v(\" 跳转 \")])]),_c('div',{staticClass:\"drawer-content\"},[(_vm.loading)?_c('div',{staticClass:\"loading-container\"},[_c('div',{staticClass:\"loading-spinner\"}),_c('p',[_vm._v(\"加载目录中...\")])]):(_vm.error)?_c('div',{staticClass:\"error-container\"},[_c('div',{staticClass:\"error-icon\"},[_vm._v(\"⚠️\")]),_c('p',[_vm._v(\"目录加载失败\")]),_c('button',{staticClass:\"retry-button\",on:{\"click\":_vm.fetchCatalogue}},[_vm._v(\" 重新加载 \")])]):(_vm.catalogueData && _vm.catalogueData.length > 0)?_c('div',{staticClass:\"catalogue-list\"},_vm._l((_vm.catalogueData),function(item,index){return _c('catalogue-item',{key:`catalogue-${index}`,attrs:{\"item\":item || {},\"level\":0},on:{\"item-click\":_vm.onItemClick}})}),1):_c('div',{staticClass:\"empty-container\"},[_c('p',[_vm._v(\"暂无目录\")])])])])])\n}\nvar staticRenderFns = []\n\nexport { render, staticRenderFns }","<template>\r\n <div class=\"catalogue-drawer-container\">\r\n <!-- 遮罩层 -->\r\n <div v-if=\"visible\" class=\"drawer-overlay\" @click=\"closeDrawer\"></div>\r\n \r\n <!-- 抽屉主体 -->\r\n <div \r\n class=\"catalogue-drawer\" \r\n :class=\"{ 'drawer-open': visible }\"\r\n :style=\"{ width: drawerWidth }\"\r\n >\r\n <div class=\"drawer-header\">\r\n <h3 class=\"drawer-title\">目录</h3>\r\n <button class=\"close-button\" @click=\"closeDrawer\">\r\n <span class=\"close-icon\">×</span>\r\n </button>\r\n </div>\r\n\r\n <!-- 页码跳转 -->\r\n <div class=\"page-jump-section\">\r\n <input\r\n type=\"text\"\r\n v-model=\"jumpPageInput\"\r\n @input=\"handlePageInput\"\r\n placeholder=\"请输入页码\"\r\n class=\"page-jump-input\"\r\n @focus=\"onInputFocus\"\r\n @blur=\"onInputBlur\"\r\n />\r\n <button @click=\"handleJumpToPage\" class=\"btn-jump\">\r\n 跳转\r\n </button>\r\n </div>\r\n\r\n <div class=\"drawer-content\">\r\n <!-- 加载状态 -->\r\n <div v-if=\"loading\" class=\"loading-container\">\r\n <div class=\"loading-spinner\"></div>\r\n <p>加载目录中...</p>\r\n </div>\r\n \r\n <!-- 错误状态 -->\r\n <div v-else-if=\"error\" class=\"error-container\">\r\n <div class=\"error-icon\">⚠️</div>\r\n <p>目录加载失败</p>\r\n <button class=\"retry-button\" @click=\"fetchCatalogue\">\r\n 重新加载\r\n </button>\r\n </div>\r\n \r\n <!-- 目录内容 -->\r\n <div v-else-if=\"catalogueData && catalogueData.length > 0\" class=\"catalogue-list\">\r\n <catalogue-item\r\n v-for=\"(item, index) in catalogueData\"\r\n :key=\"`catalogue-${index}`\"\r\n :item=\"item || {}\"\r\n :level=\"0\"\r\n @item-click=\"onItemClick\"\r\n />\r\n </div>\r\n \r\n <!-- 空状态 -->\r\n <div v-else class=\"empty-container\">\r\n <p>暂无目录</p>\r\n </div>\r\n </div>\r\n </div>\r\n </div>\r\n</template>\r\n\r\n<script>\r\n// 目录项组件\r\nconst CatalogueItem = {\r\n name: 'CatalogueItem',\r\n props: {\r\n item: {\r\n type: Object,\r\n required: true\r\n },\r\n level: {\r\n type: Number,\r\n default: 0\r\n }\r\n },\r\n data() {\r\n return {\r\n expanded: false\r\n }\r\n },\r\n computed: {\r\n hasChildren() {\r\n const children = this.item.childrenList || this.item.children || this.item.subItems || this.item.items\r\n return children && children.length > 0\r\n },\r\n childrenData() {\r\n return this.item.childrenList || this.item.children || this.item.subItems || this.item.items || []\r\n },\r\n itemStyle() {\r\n // 移除缩进,所有层级都左对齐\r\n return {\r\n paddingLeft: '12px',\r\n paddingRight: '12px'\r\n }\r\n },\r\n levelClass() {\r\n return `level-${this.level}`\r\n }\r\n },\r\n methods: {\r\n toggleExpand() {\r\n if (this.hasChildren) {\r\n this.expanded = !this.expanded\r\n } else {\r\n this.handleClick()\r\n }\r\n },\r\n handleClick() {\r\n this.$emit('item-click', this.item)\r\n }\r\n },\r\n render(h) {\r\n const item = this.item\r\n const titleText = item.titleName || item.title || item.name || item.text || item.label || '未命名章节'\r\n const pageNum = item.startPageNum || item.pageNumber || item.page || item.pageNum\r\n \r\n // 创建拖拽手柄\r\n const dragHandle = h('span', {\r\n class: 'drag-handle'\r\n }, '')\r\n \r\n // 创建展开图标\r\n const expandIcon = this.hasChildren ? h('span', {\r\n class: 'expand-icon'\r\n }, this.expanded ? '▼' : '▶') : null\r\n \r\n // 创建层级指示器\r\n const levelIndicator = this.level > 0 ? h('span', {\r\n class: `level-indicator level-${this.level}`\r\n }, '•'.repeat(this.level)) : null\r\n \r\n // 创建标题\r\n const titleSpan = h('span', {\r\n class: 'item-title'\r\n }, titleText)\r\n \r\n // 创建页码(放在标题后面)\r\n // const pageSpan = pageNum ? h('span', {\r\n // class: 'page-number'\r\n // }, `第${pageNum}页`) : null\r\n const pageSpan = null\r\n // 创建子级目录\r\n const childrenDiv = (this.hasChildren && this.expanded) ? h('div', {\r\n class: 'children-container'\r\n }, this.childrenData.map((child, index) => {\r\n return h('catalogue-item', {\r\n key: index,\r\n props: {\r\n item: child,\r\n level: this.level + 1\r\n },\r\n on: {\r\n 'item-click': (item) => this.$emit('item-click', item)\r\n }\r\n })\r\n })) : null\r\n \r\n return h('div', {\r\n class: 'catalogue-item-wrapper'\r\n }, [\r\n h('div', {\r\n class: [\r\n 'catalogue-item',\r\n this.levelClass,\r\n {\r\n 'has-children': this.hasChildren,\r\n 'expanded': this.expanded\r\n }\r\n ],\r\n style: this.itemStyle,\r\n on: {\r\n click: this.toggleExpand\r\n }\r\n }, [\r\n h('div', {\r\n class: 'item-content'\r\n }, [dragHandle, expandIcon, levelIndicator, titleSpan, pageSpan].filter(Boolean))\r\n ]),\r\n childrenDiv\r\n ].filter(Boolean))\r\n }\r\n}\r\n\r\nexport default {\r\n name: 'BookCatalogueDrawer',\r\n components: {\r\n CatalogueItem\r\n },\r\n props: {\r\n value: {\r\n type: Boolean,\r\n default: false\r\n },\r\n bookId: {\r\n type: String,\r\n default: ''\r\n },\r\n catalogue: {\r\n type: Array,\r\n default: () => []\r\n },\r\n loading: {\r\n type: Boolean,\r\n default: false\r\n }\r\n },\r\n data() {\r\n return {\r\n catalogueData: [],\r\n error: null,\r\n jumpPageInput: ''\r\n }\r\n },\r\n computed: {\r\n visible: {\r\n get() {\r\n return this.value\r\n },\r\n set(val) {\r\n this.$emit('input', val)\r\n }\r\n },\r\n drawerWidth() {\r\n // 响应式宽度\r\n return window.innerWidth <= 768 ? '80%' : '400px'\r\n }\r\n },\r\n watch: {\r\n visible(newVal) {\r\n if (newVal && this.bookId && !this.catalogueData.length) {\r\n this.$emit('fetch-catalogue', this.bookId)\r\n }\r\n },\r\n bookId(newVal) {\r\n if (newVal && this.visible) {\r\n this.$emit('fetch-catalogue', newVal)\r\n }\r\n },\r\n catalogue: {\r\n handler(newVal) {\r\n if (newVal && newVal.length > 0) {\r\n this.catalogueData = this.processCatalogueData(newVal)\r\n }\r\n },\r\n immediate: true\r\n }\r\n },\r\n methods: {\r\n /**\r\n * 获取目录数据 - 触发事件让父组件处理\r\n */\r\n fetchCatalogue() {\r\n if (!this.bookId) {\r\n console.warn('缺少 bookId,无法获取目录')\r\n return\r\n }\r\n this.$emit('fetch-catalogue', this.bookId)\r\n },\r\n\r\n /**\r\n * 处理目录数据,确保数据结构正确\r\n * @param {Array} data - 原始目录数据\r\n * @returns {Array} 处理后的目录数据\r\n */\r\n processCatalogueData(data) {\r\n if (!Array.isArray(data)) {\r\n return []\r\n }\r\n \r\n return data.map(item => {\r\n if (!item || typeof item !== 'object') {\r\n return {\r\n titleName: '未知章节',\r\n startPageNum: null,\r\n childrenList: []\r\n }\r\n }\r\n \r\n // 确保必要的字段存在\r\n const processedItem = {\r\n ...item,\r\n titleName: item.titleName || item.title || item.name || '未命名章节',\r\n startPageNum: item.startPageNum || item.pageNumber || item.page || item.pageNum || null,\r\n childrenList: item.childrenList || item.children || item.subItems || item.items || []\r\n }\r\n \r\n // 递归处理子级\r\n if (processedItem.childrenList && processedItem.childrenList.length > 0) {\r\n processedItem.childrenList = this.processCatalogueData(processedItem.childrenList)\r\n }\r\n \r\n return processedItem\r\n })\r\n },\r\n\r\n /**\r\n * 目录项点击事件\r\n * @param {Object} item - 点击的目录项\r\n */\r\n onItemClick(item) {\r\n console.log('目录项被点击:', item)\r\n \r\n // 发送事件给父组件\r\n this.$emit('catalogue-click', item)\r\n \r\n // 如果有页码信息,可以进行跳转\r\n const pageNumber = item.startPageNum || item.pageNumber || item.page || item.pageNum\r\n if (pageNumber) {\r\n this.$emit('page-jump', pageNumber)\r\n }\r\n },\r\n\r\n /**\r\n * 关闭抽屉\r\n */\r\n closeDrawer() {\r\n this.$emit('input', false)\r\n },\r\n\r\n /**\r\n * 处理页码输入\r\n */\r\n handlePageInput(e) {\r\n const value = e.target.value\r\n const numValue = value.replace(/[^\\d]/g, '')\r\n this.jumpPageInput = numValue\r\n },\r\n\r\n /**\r\n * 执行页码跳转\r\n */\r\n handleJumpToPage() {\r\n const pageNum = parseInt(this.jumpPageInput)\r\n if (pageNum && pageNum >= 1) {\r\n this.$emit('page-jump', pageNum)\r\n this.jumpPageInput = ''\r\n this.closeDrawer()\r\n }\r\n },\r\n\r\n /**\r\n * 输入框获得焦点\r\n */\r\n onInputFocus() {\r\n // 可以在这里添加焦点处理逻辑\r\n },\r\n\r\n /**\r\n * 输入框失去焦点\r\n */\r\n onInputBlur() {\r\n this.$emit('Focus')\r\n },\r\n\r\n /**\r\n * 重置数据\r\n */\r\n resetData() {\r\n this.catalogueData = []\r\n this.error = null\r\n this.loading = false\r\n },\r\n\r\n /**\r\n * 处理窗口大小变化\r\n */\r\n handleResize() {\r\n // 可以在这里添加响应式逻辑\r\n }\r\n },\r\n\r\n mounted() {\r\n // 监听窗口大小变化\r\n window.addEventListener('resize', this.handleResize)\r\n },\r\n\r\n beforeDestroy() {\r\n window.removeEventListener('resize', this.handleResize)\r\n }\r\n}\r\n</script>\r\n\r\n<style scoped>\r\n/* 容器 */\r\n.catalogue-drawer-container {\r\n position: relative;\r\n}\r\n\r\n/* 遮罩层 */\r\n.drawer-overlay {\r\n position: fixed;\r\n top: 0;\r\n left: 0;\r\n width: 100%;\r\n height: 100%;\r\n background: rgba(0, 0, 0, 0.5);\r\n z-index: 19998;\r\n transition: opacity 0.3s ease;\r\n}\r\n\r\n/* 抽屉主体 */\r\n.catalogue-drawer {\r\n position: fixed;\r\n top: 0;\r\n left: 0;\r\n height: 100%;\r\n background: #ffffff;\r\n box-shadow: 2px 0 10px rgba(0, 0, 0, 0.1);\r\n transform: translateX(-100%);\r\n transition: transform 0.3s ease;\r\n z-index: 19999;\r\n overflow: hidden;\r\n /* 处理安全区域 */\r\n padding-top: env(safe-area-inset-top);\r\n padding-bottom: env(safe-area-inset-bottom);\r\n}\r\n\r\n.catalogue-drawer.drawer-open {\r\n transform: translateX(0);\r\n}\r\n\r\n.drawer-header {\r\n display: flex;\r\n justify-content: space-between;\r\n align-items: center;\r\n padding: 16px 20px;\r\n border-bottom: 1px solid #e5e5e5;\r\n background: #ffffff;\r\n position: sticky;\r\n top: 0;\r\n z-index: 100;\r\n}\r\n\r\n.drawer-title {\r\n font-size: 18px;\r\n font-weight: 600;\r\n color: #333333;\r\n margin: 0;\r\n}\r\n\r\n.close-button {\r\n background: none;\r\n border: none;\r\n cursor: pointer;\r\n padding: 6px;\r\n border-radius: 4px;\r\n transition: background-color 0.2s ease;\r\n width: 32px;\r\n height: 32px;\r\n display: flex;\r\n align-items: center;\r\n justify-content: center;\r\n}\r\n\r\n.close-button:hover {\r\n background: #f5f5f5;\r\n}\r\n\r\n.close-icon {\r\n font-size: 18px;\r\n color: #666;\r\n line-height: 1;\r\n display: block;\r\n}\r\n\r\n.close-button:hover .close-icon {\r\n color: #333;\r\n}\r\n\r\n/* 页码跳转区域 */\r\n.page-jump-section {\r\n display: flex;\r\n align-items: center;\r\n gap: 10px;\r\n padding: 12px 16px;\r\n border-bottom: 1px solid #e5e5e5;\r\n background: #f8f9fa;\r\n}\r\n\r\n.page-jump-input {\r\n flex: 1;\r\n min-width: 0;\r\n padding: 10px 12px;\r\n border: 1px solid #ddd;\r\n border-radius: 6px;\r\n background: #fff;\r\n color: #333;\r\n font-size: 16px;\r\n text-align: center;\r\n outline: none;\r\n transition: border-color 0.2s ease, box-shadow 0.2s ease;\r\n}\r\n\r\n.page-jump-input:focus {\r\n border-color: #1989fa;\r\n box-shadow: 0 0 0 2px rgba(25, 137, 250, 0.1);\r\n}\r\n\r\n.page-jump-input::placeholder {\r\n color: #999;\r\n font-size: 14px;\r\n}\r\n\r\n.btn-jump {\r\n flex-shrink: 0;\r\n padding: 10px 20px;\r\n background: #1989fa;\r\n color: white;\r\n border: none;\r\n border-radius: 6px;\r\n font-size: 14px;\r\n font-weight: 500;\r\n cursor: pointer;\r\n transition: background 0.2s ease;\r\n white-space: nowrap;\r\n}\r\n\r\n.btn-jump:hover {\r\n background: #0066cc;\r\n}\r\n\r\n.btn-jump:active {\r\n background: #004499;\r\n}\r\n\r\n.drawer-content {\r\n height: calc(100% - 65px);\r\n overflow-y: auto;\r\n -webkit-overflow-scrolling: touch;\r\n}\r\n\r\n.loading-container {\r\n display: flex;\r\n justify-content: center;\r\n align-items: center;\r\n height: 200px;\r\n flex-direction: column;\r\n gap: 12px;\r\n}\r\n\r\n.loading-spinner {\r\n width: 40px;\r\n height: 40px;\r\n border: 3px solid #f3f3f3;\r\n border-top: 3px solid #1989fa;\r\n border-radius: 50%;\r\n animation: spin 1s linear infinite;\r\n}\r\n\r\n@keyframes spin {\r\n 0% { transform: rotate(0deg); }\r\n 100% { transform: rotate(360deg); }\r\n}\r\n\r\n.error-container,\r\n.empty-container {\r\n display: flex;\r\n flex-direction: column;\r\n align-items: center;\r\n justify-content: center;\r\n padding: 40px 20px;\r\n text-align: left;\r\n}\r\n\r\n.error-icon {\r\n font-size: 48px;\r\n margin-bottom: 16px;\r\n}\r\n\r\n.retry-button {\r\n margin-top: 16px;\r\n background: #1989fa;\r\n color: white;\r\n border: none;\r\n padding: 8px 16px;\r\n border-radius: 4px;\r\n cursor: pointer;\r\n transition: background-color 0.2s ease;\r\n}\r\n\r\n.retry-button:hover {\r\n background: #0066cc;\r\n}\r\n\r\n.catalogue-list {\r\n padding: 0;\r\n}\r\n\r\n.catalogue-item-wrapper {\r\n border-bottom: 1px solid #f0f0f0;\r\n}\r\n\r\n.catalogue-item-wrapper:last-child {\r\n border-bottom: none;\r\n}\r\n\r\n.catalogue-item {\r\n padding: 12px;\r\n cursor: pointer;\r\n transition: all 0.2s ease;\r\n position: relative;\r\n min-height: 44px;\r\n border-left: 3px solid transparent;\r\n}\r\n\r\n.catalogue-item:hover {\r\n background-color: #f8f9fa;\r\n}\r\n\r\n.catalogue-item:active {\r\n background-color: #e9ecef;\r\n}\r\n\r\n.item-content {\r\n display: flex;\r\n align-items: center;\r\n flex: 1;\r\n width: 100%;\r\n justify-content: flex-start;\r\n gap: 8px;\r\n}\r\n\r\n/* 拖拽手柄样式 */\r\n.drag-handle {\r\n color: #ccc;\r\n font-size: 14px;\r\n cursor: grab;\r\n transition: color 0.2s ease;\r\n flex-shrink: 0;\r\n width: 20px;\r\n text-align: center;\r\n line-height: 1;\r\n user-select: none;\r\n}\r\n\r\n.drag-handle:hover {\r\n color: #999;\r\n}\r\n\r\n.drag-handle:active {\r\n cursor: grabbing;\r\n color: #666;\r\n}\r\n\r\n/* 层级指示器样式 */\r\n.level-indicator {\r\n font-size: 10px;\r\n color: #999;\r\n flex-shrink: 0;\r\n line-height: 1;\r\n margin-right: 4px;\r\n}\r\n\r\n.level-indicator.level-1 {\r\n color: #007bff;\r\n}\r\n\r\n.level-indicator.level-2 {\r\n color: #28a745;\r\n}\r\n\r\n.level-indicator.level-3 {\r\n color: #ffc107;\r\n}\r\n\r\n.expand-icon {\r\n font-size: 12px;\r\n color: #999;\r\n transition: color 0.2s ease;\r\n flex-shrink: 0;\r\n width: 16px;\r\n text-align: center;\r\n}\r\n\r\n.catalogue-item:hover .expand-icon {\r\n color: #666;\r\n}\r\n\r\n.item-title {\r\n font-size: 14px;\r\n color: #333;\r\n line-height: 1.4;\r\n font-weight: 400;\r\n}\r\n\r\n.page-number {\r\n font-size: 12px;\r\n color: #999;\r\n margin-left: 6px;\r\n}\r\n\r\n/* 不同层级的样式 - 用颜色和字体大小区分层级 */\r\n.catalogue-item.level-0 {\r\n background: linear-gradient(90deg, transparent, rgba(0, 123, 255, 0.05), transparent);\r\n}\r\n\r\n.catalogue-item.level-0 .item-title {\r\n font-size: 15px;\r\n color: #333;\r\n font-weight: 600;\r\n}\r\n\r\n.catalogue-item.level-1 {\r\n background: linear-gradient(90deg, transparent, rgba(40, 167, 69, 0.03), transparent);\r\n}\r\n\r\n.catalogue-item.level-1 .item-title {\r\n font-size: 14px;\r\n color: #555;\r\n font-weight: 500;\r\n}\r\n\r\n.catalogue-item.level-2 {\r\n background: linear-gradient(90deg, transparent, rgba(255, 193, 7, 0.03), transparent);\r\n}\r\n\r\n.catalogue-item.level-2 .item-title {\r\n font-size: 13px;\r\n color: #666;\r\n font-weight: 400;\r\n}\r\n\r\n.catalogue-item.level-3 .item-title {\r\n font-size: 12px;\r\n color: #777;\r\n font-weight: 400;\r\n}\r\n\r\n.children-container {\r\n /* 移除背景色,保持一致性 */\r\n background: transparent;\r\n}\r\n\r\n/* 移动端适配 */\r\n@media (max-width: 768px) {\r\n .catalogue-drawer {\r\n /* 移动端安全区域适配 */\r\n padding-top: max(env(safe-area-inset-top), 20px);\r\n padding-bottom: max(env(safe-area-inset-bottom), 20px);\r\n }\r\n \r\n .drawer-header {\r\n padding: 14px 16px;\r\n }\r\n \r\n .drawer-title {\r\n font-size: 16px;\r\n }\r\n \r\n .catalogue-item {\r\n padding: 10px 8px;\r\n min-height: 44px; /* 增加触摸区域 */\r\n }\r\n \r\n .drag-handle {\r\n font-size: 16px; /* 移动端增大手柄 */\r\n width: 24px;\r\n }\r\n \r\n .item-title {\r\n font-size: 13px;\r\n }\r\n \r\n .catalogue-item.level-0 .item-title {\r\n font-size: 14px;\r\n }\r\n \r\n .page-number {\r\n font-size: 11px;\r\n }\r\n \r\n .level-indicator {\r\n font-size: 12px; /* 移动端增大指示器 */\r\n }\r\n}\r\n\r\n/* 滚动条样式 */\r\n.drawer-content::-webkit-scrollbar {\r\n width: 4px;\r\n}\r\n\r\n.drawer-content::-webkit-scrollbar-track {\r\n background: #f5f5f5;\r\n}\r\n\r\n.drawer-content::-webkit-scrollbar-thumb {\r\n background: #ccc;\r\n border-radius: 2px;\r\n}\r\n\r\n.drawer-content::-webkit-scrollbar-thumb:hover {\r\n background: #999;\r\n}\r\n\r\n/* 拖拽状态样式 */\r\n.catalogue-item.dragging {\r\n opacity: 0.5;\r\n transform: scale(0.95);\r\n background: #f0f8ff;\r\n box-shadow: 0 4px 12px rgba(0, 0, 0, 0.15);\r\n}\r\n\r\n/* 拖拽悬停目标样式 */\r\n.catalogue-item.drag-over {\r\n border-top: 2px solid #007bff;\r\n background: rgba(0, 123, 255, 0.1);\r\n}\r\n\r\n/* 增强视觉层次 */\r\n.catalogue-item {\r\n border-left: 3px solid transparent;\r\n transition: all 0.2s ease;\r\n}\r\n\r\n.catalogue-item.level-0 {\r\n border-left-color: #007bff;\r\n}\r\n\r\n.catalogue-item.level-1 {\r\n border-left-color: #28a745;\r\n}\r\n\r\n.catalogue-item.level-2 {\r\n border-left-color: #ffc107;\r\n}\r\n\r\n.catalogue-item.level-3 {\r\n border-left-color: #dc3545;\r\n}\r\n</style>\r\n","import mod from \"-!../../node_modules/@vue/vue-loader-v15/lib/index.js??vue-loader-options!./BookCatalogueDrawer.vue?vue&type=script&lang=js\"; export default mod; export * from \"-!../../node_modules/@vue/vue-loader-v15/lib/index.js??vue-loader-options!./BookCatalogueDrawer.vue?vue&type=script&lang=js\"","/* globals __VUE_SSR_CONTEXT__ */\n\n// IMPORTANT: Do NOT use ES2015 features in this file (except for modules).\n// This module is a runtime utility for cleaner component module output and will\n// be included in the final webpack user bundle.\n\nexport default function normalizeComponent(\n scriptExports,\n render,\n staticRenderFns,\n functionalTemplate,\n injectStyles,\n scopeId,\n moduleIdentifier /* server only */,\n shadowMode /* vue-cli only */\n) {\n // Vue.extend constructor export interop\n var options =\n typeof scriptExports === 'function' ? scriptExports.options : scriptExports\n\n // render functions\n if (render) {\n options.render = render\n options.staticRenderFns = staticRenderFns\n options._compiled = true\n }\n\n // functional template\n if (functionalTemplate) {\n options.functional = true\n }\n\n // scopedId\n if (scopeId) {\n options._scopeId = 'data-v-' + scopeId\n }\n\n var hook\n if (moduleIdentifier) {\n // server build\n hook = function (context) {\n // 2.3 injection\n context =\n context || // cached call\n (this.$vnode && this.$vnode.ssrContext) || // stateful\n (this.parent && this.parent.$vnode && this.parent.$vnode.ssrContext) // functional\n // 2.2 with runInNewContext: true\n if (!context && typeof __VUE_SSR_CONTEXT__ !== 'undefined') {\n context = __VUE_SSR_CONTEXT__\n }\n // inject component styles\n if (injectStyles) {\n injectStyles.call(this, context)\n }\n // register component module identifier for async chunk inferrence\n if (context && context._registeredComponents) {\n context._registeredComponents.add(moduleIdentifier)\n }\n }\n // used by ssr in case component is cached and beforeCreate\n // never gets called\n options._ssrRegister = hook\n } else if (injectStyles) {\n hook = shadowMode\n ? function () {\n injectStyles.call(\n this,\n (options.functional ? this.parent : this).$root.$options.shadowRoot\n )\n }\n : injectStyles\n }\n\n if (hook) {\n if (options.functional) {\n // for template-only hot-reload because in that case the render fn doesn't\n // go through the normalizer\n options._injectStyles = hook\n // register for functional component in vue file\n var originalRender = options.render\n options.render = function renderWithStyleInjection(h, context) {\n hook.call(context)\n return originalRender(h, context)\n }\n } else {\n // inject component registration as beforeCreate hook\n var existing = options.beforeCreate\n options.beforeCreate = existing ? [].concat(existing, hook) : [hook]\n }\n }\n\n return {\n exports: scriptExports,\n options: options\n }\n}\n","import { render, staticRenderFns } from \"./BookCatalogueDrawer.vue?vue&type=template&id=3930be62&scoped=true\"\nimport script from \"./BookCatalogueDrawer.vue?vue&type=script&lang=js\"\nexport * from \"./BookCatalogueDrawer.vue?vue&type=script&lang=js\"\nimport style0 from \"./BookCatalogueDrawer.vue?vue&type=style&index=0&id=3930be62&prod&scoped=true&lang=css\"\n\n\n/* normalize component */\nimport normalizer from \"!../../node_modules/@vue/vue-loader-v15/lib/runtime/componentNormalizer.js\"\nvar component = normalizer(\n script,\n render,\n staticRenderFns,\n false,\n null,\n \"3930be62\",\n null\n \n)\n\nexport default component.exports","<template>\r\n <div\r\n class=\"photo-album-container\"\r\n @touchstart=\"onContainerTouchStart\"\r\n @touchmove=\"onContainerTouchMove\"\r\n @touchend=\"onContainerTouchEnd\"\r\n @dblclick=\"onContainerDoubleClick\"\r\n @click=\"onContentClick\"\r\n >\r\n <div class=\"album-header\" v-if=\"false\">\r\n <h1>氪氪</h1>\r\n <!-- <p>双页模式 - 双击图片放大,滚轮缩放,拖拽翻页</p> -->\r\n </div>\r\n \r\n <div\r\n v-if=\"contentReady\"\r\n class=\"flipbook-wrapper\"\r\n :style=\"{ transform: `scale(${zoomScale}) translate(${translateX}px, ${translateY}px)` }\"\r\n @dblclick=\"onFlipbookDoubleClick\"\r\n @touchstart.capture=\"onFlipbookTouchStart\"\r\n @touchend.capture=\"onFlipbookTouchEnd\"\r\n >\r\n <!-- 仿真翻页模式 -->\r\n <flipbook\r\n v-if=\"flipMode === 'flip' && flag\"\r\n :class=\"['flipbook', isMobile ? 'mobile-mode mobile-optimized' : 'desktop-mode desktop-optimized']\"\r\n :pages=\"pages\"\r\n :pagesHiRes=\"pagesHiRes\"\r\n :startPage=\"startPage\"\r\n v-slot=\"{ page, canFlipLeft, canFlipRight }\"\r\n ref=\"flipbook\"\r\n @flip-left-end=\"onFlipLeftEnd\"\r\n @flip-right-end=\"onFlipRightEnd\"\r\n :zooms=\"null\"\r\n :ambient-light=\"0.6\"\r\n :gloss=\"0.4\"\r\n :single-page=\"isMobile\"\r\n :click-to-flip=\"false\"\r\n :wheel-to-flip=\"!isMobile\"\r\n :swipe-to-flip=\"true\"\r\n :center-pages=\"true\"\r\n >\r\n </flipbook>\r\n \r\n <!-- 滑动翻页模式 -->\r\n <div\r\n v-else-if=\"flipMode === 'slide'\"\r\n :class=\"['slide-viewer', isMobile ? 'mobile-mode mobile-optimized' : 'desktop-mode desktop-optimized']\"\r\n ref=\"slideViewer\"\r\n @touchstart=\"onSlideViewerTouchStart\"\r\n @touchmove=\"onSlideViewerTouchMove\"\r\n @touchend=\"onSlideViewerTouchEnd\"\r\n >\r\n <div class=\"slide-container\" :style=\"slideContainerStyle\">\r\n <div\r\n v-for=\"(page, index) in pages\"\r\n :key=\"index\"\r\n class=\"slide-page\"\r\n :class=\"{ 'slide-page-active': index + 1 === currentPage }\"\r\n >\r\n <img v-if=\"page\" :src=\"page\" alt=\"\" class=\"slide-page-image\" />\r\n <div v-else class=\"slide-page-placeholder\">封面/封底</div>\r\n </div>\r\n </div>\r\n </div>\r\n \r\n <!-- 淡入淡出翻页模式 -->\r\n <div\r\n v-else-if=\"flipMode === 'fade'\"\r\n :class=\"['fade-viewer', isMobile ? 'mobile-mode mobile-optimized' : 'desktop-mode desktop-optimized']\"\r\n ref=\"fadeViewer\"\r\n >\r\n <transition name=\"fade-page\" mode=\"out-in\">\r\n <div :key=\"currentPage\" class=\"fade-page-container\">\r\n <img v-if=\"pages[currentPage - 1]\" :src=\"pages[currentPage - 1]\" alt=\"\" class=\"fade-page-image\" />\r\n <div v-else class=\"fade-page-placeholder\">封面/封底</div>\r\n </div>\r\n </transition>\r\n </div>\r\n \r\n <!-- 垂直滚动模式 -->\r\n <div\r\n v-else-if=\"flipMode === 'scroll'\"\r\n :class=\"['scroll-viewer', isMobile ? 'mobile-mode mobile-optimized' : 'desktop-mode desktop-optimized']\"\r\n ref=\"scrollViewer\"\r\n @scroll=\"onScrollViewerScroll\"\r\n >\r\n <div class=\"scroll-container\">\r\n <div\r\n v-for=\"(page, index) in pages\"\r\n :key=\"index\"\r\n class=\"scroll-page\"\r\n :ref=\"'scrollPage' + index\"\r\n >\r\n <img v-if=\"page\" :src=\"page\" alt=\"\" class=\"scroll-page-image\" />\r\n <div v-else class=\"scroll-page-placeholder\">封面/封底</div>\r\n </div>\r\n </div>\r\n </div>\r\n \r\n <!-- 截断特效模式 -->\r\n <div\r\n v-else-if=\"flipMode === 'clip'\"\r\n :class=\"['clip-viewer', isMobile ? 'mobile-mode mobile-optimized' : 'desktop-mode desktop-optimized']\"\r\n ref=\"clipViewer\"\r\n >\r\n <div class=\"clip-pages-wrapper\">\r\n <!-- 当前页 -->\r\n <transition name=\"clip-current\">\r\n <div :key=\"'current-' + currentPage\" class=\"clip-page clip-page-current\">\r\n <img v-if=\"pages[currentPage - 1]\" :src=\"pages[currentPage - 1]\" alt=\"\" class=\"clip-page-image\" />\r\n <div v-else class=\"clip-page-placeholder\">封面/封底</div>\r\n </div>\r\n </transition>\r\n <!-- 下一页预览(部分可见) -->\r\n <div v-if=\"currentPage < totalPages\" class=\"clip-page clip-page-next\">\r\n <img v-if=\"pages[currentPage]\" :src=\"pages[currentPage]\" alt=\"\" class=\"clip-page-image\" />\r\n <div v-else class=\"clip-page-placeholder\">封面/封底</div>\r\n </div>\r\n </div>\r\n </div>\r\n \r\n <!-- 卡片风格模式 -->\r\n <div\r\n v-else-if=\"flipMode === 'card'\"\r\n :class=\"['card-viewer', isMobile ? 'mobile-mode mobile-optimized' : 'desktop-mode desktop-optimized']\"\r\n ref=\"cardViewer\"\r\n >\r\n <div class=\"card-stack\">\r\n <!-- 显示前后各一页的卡片堆叠效果 -->\r\n <transition-group name=\"card-flip\" tag=\"div\" class=\"card-transition-group\">\r\n <div\r\n v-for=\"(page, index) in visibleCards\"\r\n :key=\"'card-' + page.originalIndex\"\r\n class=\"card-item\"\r\n :class=\"{\r\n 'card-item-prev': page.position === 'prev',\r\n 'card-item-current': page.position === 'current',\r\n 'card-item-next': page.position === 'next'\r\n }\"\r\n :style=\"getCardStyle(page.position)\"\r\n >\r\n <div class=\"card-content\">\r\n <img v-if=\"page.src\" :src=\"page.src\" alt=\"\" class=\"card-image\" />\r\n <div v-else class=\"card-placeholder\">封面/封底</div>\r\n </div>\r\n <div class=\"card-page-number\">{{ page.originalIndex + 1 }} / {{ totalPages }}</div>\r\n </div>\r\n </transition-group>\r\n </div>\r\n </div>\r\n </div>\r\n\r\n <div class=\"controls\" :class=\"{ 'mobile-controls': isMobile, 'desktop-controls': !isMobile, 'controls-visible': showControls }\" @click.stop>\r\n <button @click=\"flipLeft\" class=\"btn btn-prev\">\r\n ← 上一页\r\n </button>\r\n <span class=\"page-indicator\">\r\n <span v-if=\"totalPages === 0\">加载中...</span>\r\n <span v-else-if=\"currentPage === 1 && totalPages > 1\">封面</span>\r\n <span v-else-if=\"currentPage === totalPages && totalPages > 1\">封底</span>\r\n <span v-else-if=\"!isMobile && totalPages > 2\">第 {{ Math.ceil((currentPage - 1) / 2) }} 组 / 共 {{ Math.ceil((totalPages - 2) / 2) }} 组</span>\r\n <span v-else-if=\"isMobile && totalPages > 2\">第 {{ Math.max(1, currentPage ) }} 页 / 共 {{ Math.max(0, totalPages - 2) }} 页</span>\r\n <span v-else-if=\"totalPages === 1\">第 1 页 / 共 1 页</span>\r\n <span v-else>第 {{ currentPage }} 页 / 共 {{ totalPages }} 页</span>\r\n </span>\r\n <button @click=\"flipRight\" class=\"btn btn-next\">\r\n 下一页 →\r\n </button>\r\n </div>\r\n\r\n <!-- 页码跳转 - 放在翻页控件下方 -->\r\n <!-- <div class=\"page-jump-container\" :class=\"{ 'mobile-page-jump': isMobile }\" @click.stop @touchstart.stop @touchmove.stop @touchend.stop @mousedown.stop @mouseup.stop>\r\n <input\r\n type=\"text\"\r\n :value=\"jumpPageInput\"\r\n @input=\"handlePageInput\"\r\n :placeholder=\"`搜索跳转`\"\r\n class=\"page-jump-input\"\r\n @click.stop\r\n @mousedown.stop\r\n @mouseup.stop\r\n />\r\n <button @click.stop=\"handleJumpToPage\" @mousedown.stop @mouseup.stop class=\"btn btn-jump\">\r\n 跳转\r\n </button>\r\n </div> -->\r\n\r\n <!-- 翻页模式切换按钮(当URL没有指定模式时显示) -->\r\n <div v-if=\"showFlipModeSelector\" class=\"flip-mode-selector\" :class=\"{ 'mobile-flip-mode-selector': isMobile }\">\r\n <button @click=\"toggleFlipModeMenu\" class=\"btn btn-flip-mode\">\r\n <span class=\"flip-mode-icon\">{{ flipModeIcon }}</span>\r\n <span class=\"flip-mode-text\">{{ flipModeLabel }}</span>\r\n </button>\r\n <div v-if=\"showFlipModeMenu\" class=\"flip-mode-menu\">\r\n <div\r\n v-for=\"mode in flipModes\"\r\n :key=\"mode.value\"\r\n class=\"flip-mode-item\"\r\n :class=\"{ 'flip-mode-item-active': flipMode === mode.value }\"\r\n @click=\"selectFlipMode(mode.value)\"\r\n >\r\n <span class=\"flip-mode-item-icon\">{{ mode.icon }}</span>\r\n <span class=\"flip-mode-item-label\">{{ mode.label }}</span>\r\n </div>\r\n </div>\r\n </div>\r\n \r\n <!-- 目录按钮 -->\r\n <div\r\n class=\"catalogue-button\"\r\n :class=\"{\r\n 'mobile-catalogue-button': isMobile,\r\n 'dragging': catalogueButtonDragging,\r\n 'catalogue-visible': showControls\r\n }\"\r\n :style=\"{\r\n left: catalogueButtonPosition.x + 'px',\r\n top: catalogueButtonPosition.y + 'px'\r\n }\"\r\n @mousedown=\"onCatalogueMouseDown\"\r\n @touchstart=\"onCatalogueTouchStart\"\r\n @touchmove=\"onCatalogueTouchMove\"\r\n @touchend=\"onCatalogueTouchEnd\"\r\n @click.stop\r\n >\r\n <button @click=\"openCatalogue\" class=\"btn btn-catalogue\">\r\n <!-- <span class=\"drag-handle\">⋮⋮</span> -->\r\n <!-- <span class=\"catalogue-icon\">☰</span> -->\r\n <span class=\"catalogue-text\">目录</span>\r\n </button>\r\n </div>\r\n \r\n <!-- 缩放提示 -->\r\n <div class=\"zoom-hint\" :class=\"{ 'show': zoomScale !== 1 }\">\r\n <div class=\"zoom-info\">\r\n <span>缩放: {{ Math.round(zoomScale * 100) }}%</span>\r\n <button @click=\"resetZoom\" class=\"btn-reset-zoom\">重置</button>\r\n </div>\r\n </div>\r\n\r\n <!-- PC端缩放工具栏 -->\r\n <div class=\"zoom-toolbar\">\r\n <button @click=\"zoomOut\" class=\"btn-zoom\" :disabled=\"zoomScale <= 0.5\">-</button>\r\n <button @click=\"zoomIn\" class=\"btn-zoom\" :disabled=\"zoomScale >= 3\">+</button>\r\n </div>\r\n \r\n <!-- 加载状态覆盖层 -->\r\n <div v-if=\"loading\" class=\"loading-overlay\">\r\n <div class=\"loading-container\">\r\n <div class=\"loading-spinner\">\r\n <div class=\"spinner-ring\"></div>\r\n <div class=\"spinner-ring\"></div>\r\n <div class=\"spinner-ring\"></div>\r\n </div>\r\n <div class=\"loading-text\">\r\n <h3>正在加载书籍</h3>\r\n <p>请稍候,正在获取精彩内容...</p>\r\n <div class=\"loading-progress\">\r\n <div class=\"progress-bar\"></div>\r\n </div>\r\n </div>\r\n </div>\r\n </div>\r\n\r\n <!-- 错误状态 -->\r\n <div v-if=\"error && !loading\" class=\"error-container\">\r\n <div class=\"error-content\">\r\n <div class=\"error-icon\">⚠️</div>\r\n <h3>加载失败</h3>\r\n <p>{{ error.message || '网络连接异常,请检查网络后重试' }}</p>\r\n <button @click=\"fetchBooksData\" class=\"retry-btn\">\r\n <span class=\"retry-icon\">🔄</span>\r\n 重新加载\r\n </button>\r\n </div>\r\n </div>\r\n\r\n <!-- 成功状态提示(短暂显示) -->\r\n <div v-if=\"booksData && !loading && !error\" class=\"success-toast\" :class=\"{ 'show': showSuccessToast }\">\r\n 书籍加载完成\r\n </div>\r\n\r\n <!-- 书籍目录抽屉 -->\r\n <book-catalogue-drawer\r\n v-model=\"showCatalogueDrawer\"\r\n :book-id=\"bookId\"\r\n :catalogue=\"catalogue\"\r\n :loading=\"catalogueLoading\"\r\n @catalogue-click=\"onCatalogueClick\"\r\n @page-jump=\"onPageJump\"\r\n @Focus=\"onFocus\"\r\n @fetch-catalogue=\"onFetchCatalogue\"\r\n />\r\n\r\n <!-- 调试信息 -->\r\n <!-- <div class=\"debug-info\" style=\"margin-top: 20px; color: #6c757d; text-align: center; font-size: 0.9rem;\">\r\n 当前页: {{ currentPage }} / 总页数: {{ totalPages }} | 设备: {{ isMobile ? '移动端' : 'PC端' }}\r\n <br>\r\n <div v-if=\"booksData\" style=\"margin-top: 10px; padding: 10px; background: #f8f9fa; border-radius: 5px; font-family: monospace; font-size: 0.8rem; text-align: left; max-height: 200px; overflow-y: auto;\">\r\n <strong>接口返回数据:</strong><br>\r\n {{ JSON.stringify(booksData, null, 2) }}\r\n </div>\r\n </div> -->\r\n <!-- <div class=\"debug-info\" style=\"margin-top: 20px; color: #6c757d; text-align: center; font-size: 0.9rem;\">\r\n 当前页: {{ currentPage }} / 总页数: {{ totalPages }} | 设备: {{ isMobile ? '移动端' : 'PC端' }} | 模式: {{ isMobile ? '单页' : '双页' }}\r\n <br>\r\n </div> -->\r\n\r\n </div>\r\n</template>\r\n\r\n<script>\r\nimport Flipbook from 'flipbook-vue/vue2'\r\nimport BookCatalogueDrawer from './BookCatalogueDrawer.vue'\r\n\r\nexport default {\r\n name: 'PhotoAlbumView',\r\n components: {\r\n Flipbook,\r\n BookCatalogueDrawer\r\n },\r\n props: {\r\n pages: {\r\n type: Array,\r\n default: () => []\r\n },\r\n bookId: {\r\n type: String,\r\n default: ''\r\n },\r\n startPage: {\r\n type: Number,\r\n default: 1\r\n },\r\n catalogue: {\r\n type: Array,\r\n default: () => []\r\n },\r\n catalogueLoading: {\r\n type: Boolean,\r\n default: false\r\n }\r\n },\r\n data() {\r\n return {\r\n currentPage: 1,\r\n flag: true,\r\n // 设备检测\r\n isMobile: false,\r\n // 接口相关数据\r\n booksData: null,\r\n loading: false,\r\n error: null,\r\n showSuccessToast: false,\r\n // 内容就绪状态\r\n contentReady: false,\r\n // 手势缩放相关\r\n zoomScale: 1,\r\n translateX: 0,\r\n translateY: 0,\r\n lastTouchDistance: 0,\r\n lastTouchCenter: { x: 0, y: 0 },\r\n isZooming: false,\r\n isPanning: false,\r\n touchStartTime: 0,\r\n initialTouches: [],\r\n // Flipbook区域双击检测\r\n flipbookTouchStartTime: 0,\r\n flipbookLastTapTime: 0,\r\n // 目录相关\r\n showCatalogueDrawer: false,\r\n // 目录按钮拖拽相关\r\n catalogueButtonDragging: false,\r\n catalogueButtonPosition: { x: 20, y: 20 },\r\n dragStartPosition: { x: 0, y: 0 },\r\n dragOffset: { x: 0, y: 0 },\r\n // 翻页模式相关\r\n flipMode: 'flip', // flip: 仿真翻页, slide: 滑动翻页, fade: 淡入淡出, scroll: 垂直滚动\r\n showFlipModeMenu: false,\r\n flipModes: [\r\n { value: 'flip', label: '仿真翻页', icon: '📖' },\r\n { value: 'slide', label: '滑动翻页', icon: '↔️' },\r\n { value: 'fade', label: '淡入淡出', icon: '✨' },\r\n { value: 'scroll', label: '垂直滚动', icon: '📜' },\r\n { value: 'clip', label: '截断特效', icon: '✂️' },\r\n { value: 'card', label: '卡片风格', icon: '🃏' }\r\n ],\r\n // 滑动模式相关\r\n slideStartX: 0,\r\n slideCurrentX: 0,\r\n slideIsDragging: false,\r\n // URL参数控制\r\n flipModeFromUrl: false, // 翻页模式是否由URL参数指定\r\n // 控件自动隐藏相关\r\n showControls: false,\r\n hideControlsTimer: null,\r\n // 页码跳转相关\r\n jumpPageInput: ''\r\n }\r\n },\r\n computed: {\r\n totalPages() {\r\n return this.pages.length\r\n },\r\n pagesHiRes() {\r\n return this.pages\r\n },\r\n /**\r\n * 翻页模式图标\r\n */\r\n flipModeIcon() {\r\n const mode = this.flipModes.find(m => m.value === this.flipMode)\r\n return mode ? mode.icon : '📖'\r\n },\r\n /**\r\n * 翻页模式标签\r\n */\r\n flipModeLabel() {\r\n const mode = this.flipModes.find(m => m.value === this.flipMode)\r\n return mode ? mode.label : '仿真翻页'\r\n },\r\n /**\r\n * 滑动容器样式\r\n */\r\n slideContainerStyle() {\r\n const offset = -(this.currentPage - 1) * 100\r\n const dragOffset = this.slideIsDragging ? (this.slideCurrentX - this.slideStartX) / 5 : 0\r\n return {\r\n transform: `translateX(calc(${offset}% + ${dragOffset}px))`,\r\n transition: this.slideIsDragging ? 'none' : 'transform 0.3s ease-out'\r\n }\r\n },\r\n /**\r\n * 是否显示翻页模式选择器\r\n */\r\n showFlipModeSelector() {\r\n // 如果翻页模式是由URL参数指定的,则隐藏选择器\r\n return !this.flipModeFromUrl\r\n },\r\n /**\r\n * 卡片模式可见卡片\r\n */\r\n visibleCards() {\r\n const cards = []\r\n // 上一页\r\n if (this.currentPage > 1) {\r\n cards.push({\r\n src: this.pages[this.currentPage - 2],\r\n originalIndex: this.currentPage - 2,\r\n position: 'prev'\r\n })\r\n }\r\n // 当前页\r\n cards.push({\r\n src: this.pages[this.currentPage - 1],\r\n originalIndex: this.currentPage - 1,\r\n position: 'current'\r\n })\r\n // 下一页\r\n if (this.currentPage < this.totalPages) {\r\n cards.push({\r\n src: this.pages[this.currentPage],\r\n originalIndex: this.currentPage,\r\n position: 'next'\r\n })\r\n }\r\n return cards\r\n },\r\n /**\r\n * 计算当前页面显示文本\r\n */\r\n pageDisplayText() {\r\n if (this.totalPages === 0) return '加载中...'\r\n if (this.currentPage === 1 && this.totalPages > 1) return '封面'\r\n if (this.currentPage === this.totalPages && this.totalPages > 1) return '封底'\r\n \r\n if (this.isMobile) {\r\n if (this.totalPages <= 2) return `第 ${this.currentPage} 页 / 共 ${this.totalPages} 页`\r\n return `第 ${Math.max(1, this.currentPage - 1)} 页 / 共 ${Math.max(0, this.totalPages - 2)} 页`\r\n } else {\r\n if (this.totalPages <= 2) return `第 ${this.currentPage} 页 / 共 ${this.totalPages} 页`\r\n return `第 ${Math.ceil((this.currentPage - 1) / 2)} 组 / 共 ${Math.ceil((this.totalPages - 2) / 2)} 组`\r\n }\r\n }\r\n },\r\n methods: {\r\n /**\r\n * 获取书籍数据\r\n */\r\n async fetchBooksData() {\r\n try {\r\n this.loading = true\r\n this.error = null\r\n\r\n // 注释:原来从URL参数获取fileManagementId,现在改为通过props传入\r\n // const fileManagementId = this.$route.params.id || this.$route.query.id || ''\r\n // this.bookId = fileManagementId\r\n\r\n // 注释:原来调用API获取数据,现在改为通过props传入\r\n // const response = await booksApi.getBooksSlice(fileManagementId, textContent, 1, 9999)\r\n\r\n // 触发事件让父组件处理数据获取\r\n this.$emit('fetch-books-data', this.bookId)\r\n\r\n // 如果通过props传入了pages数据,直接使用\r\n if (this.pages && this.pages.length > 0) {\r\n this.booksData = { data: { records: this.pages.map(url => ({ imageUrl: url })) } }\r\n\r\n // 显示成功提示\r\n this.showSuccessToast = true\r\n setTimeout(() => {\r\n this.showSuccessToast = false\r\n }, 3000)\r\n\r\n // 检查URL参数并跳转到指定页码\r\n this.checkUrlPageParameter()\r\n }\r\n \r\n } catch (error) {\r\n console.error('获取书籍数据失败:', error)\r\n this.error = error\r\n \r\n // 显示错误信息\r\n if (error.response) {\r\n console.error('API错误响应:', error.response.data)\r\n } else if (error.request) {\r\n console.error('网络请求失败:', error.request)\r\n } else {\r\n console.error('请求配置错误:', error.message)\r\n }\r\n } finally {\r\n this.loading = false\r\n }\r\n },\r\n\r\n /**\r\n * 根据API数据更新页面\r\n * @param {Array} apiData - API返回的数据\r\n */\r\n updatePagesFromApiData(apiData) {\r\n if (!Array.isArray(apiData)) {\r\n console.warn('API数据格式不正确,期望数组格式')\r\n return\r\n }\r\n \r\n console.log('开始更新页面数据,数据长度:', apiData.length)\r\n \r\n // 这里可以根据实际的API数据结构来处理\r\n // 假设API返回的数据包含图片URL\r\n const newPages = [null] // 保留封面页\r\n \r\n apiData.forEach((item, index) => {\r\n if (item.imageUrl) {\r\n newPages.push(item.imageUrl)\r\n console.log(`添加页面 ${index + 1}:`, item.imageUrl)\r\n }\r\n })\r\n \r\n if (newPages.length > 1) {\r\n this.pages = newPages\r\n console.log('页面数据更新完成,总页数:', this.pages.length)\r\n }\r\n },\r\n\r\n /**\r\n * 检测是否为移动设备\r\n */\r\n detectMobile() {\r\n const userAgent = navigator.userAgent.toLowerCase()\r\n const mobileKeywords = ['mobile', 'android', 'iphone', 'ipad', 'ipod', 'blackberry', 'windows phone']\r\n\r\n // 检测 User Agent\r\n const isMobileUA = mobileKeywords.some(keyword => userAgent.includes(keyword))\r\n\r\n // 检测屏幕尺寸\r\n const isMobileScreen = window.innerWidth <= 768\r\n\r\n // 检测触摸支持\r\n const isTouchDevice = 'ontouchstart' in window || navigator.maxTouchPoints > 0\r\n\r\n // 综合判断\r\n this.isMobile = isMobileUA || (isMobileScreen && isTouchDevice)\r\n\r\n console.log('设备检测结果:', {\r\n userAgent: isMobileUA,\r\n screenSize: isMobileScreen,\r\n touchSupport: isTouchDevice,\r\n finalResult: this.isMobile\r\n })\r\n },\r\n\r\n /**\r\n * 预加载首页图片\r\n */\r\n async preloadFirstPage() {\r\n if (!this.pages || this.pages.length === 0) {\r\n this.contentReady = true\r\n return\r\n }\r\n\r\n const firstPageIndex = this.startPage - 1\r\n const firstPageUrl = this.pages[firstPageIndex]\r\n\r\n if (!firstPageUrl) {\r\n this.contentReady = true\r\n return\r\n }\r\n\r\n try {\r\n await new Promise((resolve, reject) => {\r\n const img = new Image()\r\n img.onload = () => resolve()\r\n img.onerror = () => resolve() // 即使失败也继续\r\n img.src = firstPageUrl\r\n\r\n // 超时保护\r\n setTimeout(() => resolve(), 3000)\r\n })\r\n } catch (error) {\r\n console.warn('首页图片预加载失败:', error)\r\n } finally {\r\n this.contentReady = true\r\n }\r\n },\r\n \r\n /**\r\n * 监听窗口尺寸变化\r\n */\r\n handleResize() {\r\n const wasMobile = this.isMobile\r\n this.detectMobile()\r\n \r\n // 如果设备类型发生变化,重新初始化flipbook\r\n if (wasMobile !== this.isMobile) {\r\n console.log('设备类型变化,重新初始化')\r\n this.$nextTick(() => {\r\n if (this.$refs.flipbook) {\r\n // 重置到第一页\r\n this.currentPage = 1\r\n this.startPage = 1\r\n }\r\n })\r\n }\r\n },\r\n flipLeft() {\r\n console.log('尝试向左翻页,当前页:', this.currentPage)\r\n if (this.flipMode === 'flip') {\r\n // 仿真翻页模式\r\n if (this.$refs.flipbook && this.currentPage > 1) {\r\n try {\r\n this.$refs.flipbook.flipLeft()\r\n console.log('向左翻页命令已发送')\r\n } catch (error) {\r\n console.error('向左翻页失败:', error)\r\n }\r\n } else {\r\n console.log('无法向左翻页 - 已在第一页或组件未就绪')\r\n }\r\n } else {\r\n // 其他模式直接切换页码\r\n if (this.currentPage > 1) {\r\n this.currentPage--\r\n this.onFlipLeftEnd(this.currentPage)\r\n }\r\n }\r\n },\r\n flipRight() {\r\n console.log('尝试向右翻页,当前页:', this.currentPage)\r\n if (this.flipMode === 'flip') {\r\n // 仿真翻页模式\r\n if (this.$refs.flipbook && this.currentPage < this.totalPages) {\r\n try {\r\n this.$refs.flipbook.flipRight()\r\n console.log('向右翻页命令已发送')\r\n } catch (error) {\r\n console.error('向右翻页失败:', error)\r\n }\r\n } else {\r\n console.log('无法向右翻页 - 已在最后一页或组件未就绪')\r\n }\r\n } else {\r\n // 其他模式直接切换页码\r\n if (this.currentPage < this.totalPages) {\r\n this.currentPage++\r\n this.onFlipRightEnd(this.currentPage)\r\n }\r\n }\r\n },\r\n onFlipLeftEnd(page) {\r\n console.log('向左翻页完成,新页面:', page)\r\n this.currentPage = page\r\n // 触发页码变化事件\r\n this.$emit('page-change', page)\r\n // 记录阅读进度\r\n this.recordReadingProgress(page)\r\n },\r\n onFlipRightEnd(page) {\r\n console.log('向右翻页完成,新页面:', page)\r\n this.currentPage = page\r\n // 触发页码变化事件\r\n this.$emit('page-change', page)\r\n // 记录阅读进度\r\n this.recordReadingProgress(page)\r\n },\r\n \r\n /**\r\n * 容器触摸开始事件\r\n */\r\n onContainerTouchStart(e) {\r\n this.touchStartTime = Date.now()\r\n this.initialTouches = Array.from(e.touches)\r\n \r\n if (e.touches.length === 2) {\r\n // 双指缩放\r\n this.isZooming = true\r\n this.lastTouchDistance = this.getTouchDistance(e.touches[0], e.touches[1])\r\n this.lastTouchCenter = this.getTouchCenter(e.touches[0], e.touches[1])\r\n e.preventDefault()\r\n } else if (e.touches.length === 1 && this.zoomScale > 1) {\r\n // 单指拖拽(仅在放大状态下)\r\n this.isPanning = true\r\n this.lastTouchCenter = { x: e.touches[0].clientX, y: e.touches[0].clientY }\r\n }\r\n },\r\n \r\n /**\r\n * 容器触摸移动事件\r\n */\r\n onContainerTouchMove(e) {\r\n if (this.isZooming && e.touches.length === 2) {\r\n // 双指缩放\r\n const currentDistance = this.getTouchDistance(e.touches[0], e.touches[1])\r\n const currentCenter = this.getTouchCenter(e.touches[0], e.touches[1])\r\n \r\n // 计算缩放比例\r\n const scaleChange = currentDistance / this.lastTouchDistance\r\n let newScale = this.zoomScale * scaleChange\r\n \r\n // 限制缩放范围\r\n newScale = Math.max(0.5, Math.min(3, newScale))\r\n \r\n // 计算缩放中心点的偏移\r\n const deltaX = currentCenter.x - this.lastTouchCenter.x\r\n const deltaY = currentCenter.y - this.lastTouchCenter.y\r\n \r\n this.zoomScale = newScale\r\n this.translateX += deltaX\r\n this.translateY += deltaY\r\n \r\n this.lastTouchDistance = currentDistance\r\n this.lastTouchCenter = currentCenter\r\n \r\n e.preventDefault()\r\n } else if (this.isPanning && e.touches.length === 1 && this.zoomScale > 1) {\r\n // 单指拖拽\r\n const deltaX = e.touches[0].clientX - this.lastTouchCenter.x\r\n const deltaY = e.touches[0].clientY - this.lastTouchCenter.y\r\n \r\n this.translateX += deltaX\r\n this.translateY += deltaY\r\n \r\n this.lastTouchCenter = { x: e.touches[0].clientX, y: e.touches[0].clientY }\r\n \r\n e.preventDefault()\r\n }\r\n },\r\n \r\n /**\r\n * 容器触摸结束事件\r\n */\r\n onContainerTouchEnd(e) {\r\n const touchDuration = Date.now() - this.touchStartTime\r\n const wasZooming = this.isZooming\r\n const wasPanning = this.isPanning\r\n\r\n // 先重置状态\r\n this.isZooming = false\r\n this.isPanning = false\r\n\r\n // 双击重置缩放 - 只在单指快速点击时检测\r\n if (e.changedTouches.length === 1 && touchDuration < 300 && !wasZooming && !wasPanning) {\r\n const now = Date.now()\r\n if (this.lastTapTime && now - this.lastTapTime < 400) {\r\n // 检测到双击\r\n this.resetZoom()\r\n console.log('移动端双击重置显示比例')\r\n this.lastTapTime = 0 // 重置,避免三击触发\r\n } else {\r\n this.lastTapTime = now\r\n }\r\n }\r\n\r\n // 边界检查和回弹\r\n this.constrainPosition()\r\n },\r\n \r\n /**\r\n * 获取两点间距离\r\n */\r\n getTouchDistance(touch1, touch2) {\r\n const dx = touch1.clientX - touch2.clientX\r\n const dy = touch1.clientY - touch2.clientY\r\n return Math.sqrt(dx * dx + dy * dy)\r\n },\r\n \r\n /**\r\n * 获取两点中心\r\n */\r\n getTouchCenter(touch1, touch2) {\r\n return {\r\n x: (touch1.clientX + touch2.clientX) / 2,\r\n y: (touch1.clientY + touch2.clientY) / 2\r\n }\r\n },\r\n \r\n /**\r\n * 重置缩放\r\n */\r\n resetZoom() {\r\n this.zoomScale = 1\r\n this.translateX = 0\r\n this.translateY = 0\r\n },\r\n\r\n /**\r\n * 放大\r\n */\r\n zoomIn() {\r\n this.zoomScale = Math.min(3, this.zoomScale + 0.2)\r\n },\r\n\r\n /**\r\n * 缩小\r\n */\r\n zoomOut() {\r\n this.zoomScale = Math.max(0.5, this.zoomScale - 0.2)\r\n },\r\n \r\n /**\r\n * PC端双击事件处理\r\n */\r\n onContainerDoubleClick(e) {\r\n // 阻止事件冒泡和默认行为,避免触发翻页\r\n e.preventDefault()\r\n e.stopPropagation()\r\n\r\n // 重置缩放比例\r\n this.resetZoom()\r\n console.log('容器双击重置显示比例,当前缩放:', this.zoomScale)\r\n },\r\n\r\n /**\r\n * Flipbook区域双击事件处理\r\n */\r\n onFlipbookDoubleClick(e) {\r\n // 阻止事件冒泡和默认行为,避免触发翻页\r\n e.preventDefault()\r\n e.stopPropagation()\r\n\r\n // 重置缩放比例\r\n this.resetZoom()\r\n console.log('Flipbook双击重置显示比例,当前缩放:', this.zoomScale)\r\n },\r\n\r\n /**\r\n * Flipbook区域触摸开始事件\r\n */\r\n onFlipbookTouchStart(e) {\r\n this.flipbookTouchStartTime = Date.now()\r\n },\r\n\r\n /**\r\n * Flipbook区域触摸结束事件(移动端双击检测)\r\n */\r\n onFlipbookTouchEnd(e) {\r\n const touchDuration = Date.now() - this.flipbookTouchStartTime\r\n\r\n // 双击重置缩放 - 只在单指快速点击时检测\r\n if (e.changedTouches.length === 1 && touchDuration < 300) {\r\n const now = Date.now()\r\n if (this.flipbookLastTapTime && now - this.flipbookLastTapTime < 400) {\r\n // 检测到双击\r\n e.preventDefault()\r\n e.stopPropagation()\r\n this.resetZoom()\r\n console.log('Flipbook区域移动端双击重置显示比例')\r\n this.flipbookLastTapTime = 0 // 重置,避免三击触发\r\n } else {\r\n this.flipbookLastTapTime = now\r\n }\r\n }\r\n },\r\n \r\n /**\r\n * 约束位置在边界内\r\n */\r\n constrainPosition() {\r\n if (this.zoomScale <= 1) {\r\n this.translateX = 0\r\n this.translateY = 0\r\n return\r\n }\r\n \r\n const maxTranslate = (this.zoomScale - 1) * 200\r\n this.translateX = Math.max(-maxTranslate, Math.min(maxTranslate, this.translateX))\r\n this.translateY = Math.max(-maxTranslate, Math.min(maxTranslate, this.translateY))\r\n },\r\n\r\n\r\n /**\r\n * 打开目录抽屉\r\n */\r\n openCatalogue() {\r\n console.log('点击目录按钮', {\r\n dragging: this.catalogueButtonDragging,\r\n showDrawer: this.showCatalogueDrawer\r\n })\r\n \r\n // 只有在不是拖拽状态下才打开目录\r\n if (!this.catalogueButtonDragging) {\r\n this.showCatalogueDrawer = true\r\n console.log('目录抽屉已打开')\r\n } else {\r\n console.log('拖拽状态中,不打开目录')\r\n }\r\n },\r\n\r\n /**\r\n * 目录按钮拖拽开始\r\n */\r\n onCatalogueMouseDown(e) {\r\n // 不立即设置为拖拽状态,等待移动再判断\r\n this.catalogueButtonDragging = false\r\n \r\n const rect = e.target.closest('.catalogue-button').getBoundingClientRect()\r\n this.dragStartPosition = {\r\n x: e.clientX,\r\n y: e.clientY\r\n }\r\n this.dragOffset = {\r\n x: e.clientX - rect.left,\r\n y: e.clientY - rect.top\r\n }\r\n \r\n document.addEventListener('mousemove', this.onCatalogueMouseMove)\r\n document.addEventListener('mouseup', this.onCatalogueMouseUp)\r\n },\r\n\r\n /**\r\n * 目录按钮拖拽移动\r\n */\r\n onCatalogueMouseMove(e) {\r\n // 检查是否开始拖拽\r\n const dragDistance = Math.sqrt(\r\n Math.pow(e.clientX - this.dragStartPosition.x, 2) + \r\n Math.pow(e.clientY - this.dragStartPosition.y, 2)\r\n )\r\n \r\n // 只有移动距离超过5px才认为是拖拽\r\n if (dragDistance > 5) {\r\n this.catalogueButtonDragging = true\r\n }\r\n \r\n if (!this.catalogueButtonDragging) return\r\n \r\n e.preventDefault()\r\n \r\n const newX = e.clientX - this.dragOffset.x\r\n const newY = e.clientY - this.dragOffset.y\r\n \r\n // 限制在视窗范围内\r\n const maxX = window.innerWidth - 120 // 按钮宽度约120px\r\n const maxY = window.innerHeight - 50 // 按钮高度约50px\r\n \r\n this.catalogueButtonPosition = {\r\n x: Math.max(0, Math.min(maxX, newX)),\r\n y: Math.max(0, Math.min(maxY, newY))\r\n }\r\n },\r\n\r\n /**\r\n * 目录按钮拖拽结束\r\n */\r\n onCatalogueMouseUp(e) {\r\n // 立即重置拖拽状态\r\n this.catalogueButtonDragging = false\r\n \r\n document.removeEventListener('mousemove', this.onCatalogueMouseMove)\r\n document.removeEventListener('mouseup', this.onCatalogueMouseUp)\r\n },\r\n\r\n /**\r\n * 目录按钮触摸开始(移动端)\r\n */\r\n onCatalogueTouchStart(e) {\r\n // 不立即设置为拖拽状态\r\n this.catalogueButtonDragging = false\r\n \r\n const touch = e.touches[0]\r\n const rect = e.target.closest('.catalogue-button').getBoundingClientRect()\r\n \r\n this.dragStartPosition = {\r\n x: touch.clientX,\r\n y: touch.clientY\r\n }\r\n this.dragOffset = {\r\n x: touch.clientX - rect.left,\r\n y: touch.clientY - rect.top\r\n }\r\n },\r\n\r\n /**\r\n * 目录按钮触摸移动(移动端)\r\n */\r\n onCatalogueTouchMove(e) {\r\n const touch = e.touches[0]\r\n \r\n // 检查是否开始拖拽\r\n const dragDistance = Math.sqrt(\r\n Math.pow(touch.clientX - this.dragStartPosition.x, 2) + \r\n Math.pow(touch.clientY - this.dragStartPosition.y, 2)\r\n )\r\n \r\n // 只有移动距离超过5px才认为是拖拽\r\n if (dragDistance > 5) {\r\n this.catalogueButtonDragging = true\r\n }\r\n \r\n if (!this.catalogueButtonDragging) return\r\n \r\n e.preventDefault()\r\n \r\n const newX = touch.clientX - this.dragOffset.x\r\n const newY = touch.clientY - this.dragOffset.y\r\n \r\n // 限制在视窗范围内,考虑安全区域\r\n const maxX = window.innerWidth - 120\r\n const maxY = window.innerHeight - 80\r\n \r\n this.catalogueButtonPosition = {\r\n x: Math.max(15, Math.min(maxX, newX)),\r\n y: Math.max(15, Math.min(maxY, newY))\r\n }\r\n },\r\n\r\n /**\r\n * 目录按钮触摸结束(移动端)\r\n */\r\n onCatalogueTouchEnd(e) {\r\n // 立即重置拖拽状态\r\n this.catalogueButtonDragging = false\r\n },\r\n \r\n /**\r\n * 切换翻页模式菜单显示\r\n */\r\n toggleFlipModeMenu() {\r\n this.showFlipModeMenu = !this.showFlipModeMenu\r\n },\r\n \r\n /**\r\n * 选择翻页模式\r\n * @param {string} mode - 翻页模式\r\n */\r\n selectFlipMode(mode) {\r\n const oldMode = this.flipMode\r\n this.flipMode = mode\r\n this.showFlipModeMenu = false\r\n \r\n // 保存翻页模式到本地存储\r\n localStorage.setItem('book-viewer-flip-mode', mode)\r\n \r\n console.log('切换翻页模式:', { from: oldMode, to: mode })\r\n \r\n // 如果切换到滚动模式,需要滚动到当前页\r\n if (mode === 'scroll') {\r\n this.$nextTick(() => {\r\n this.scrollToCurrentPage()\r\n })\r\n }\r\n },\r\n \r\n /**\r\n * 滑动模式触摸开始\r\n */\r\n onSlideViewerTouchStart(e) {\r\n if (e.touches.length === 1) {\r\n this.slideStartX = e.touches[0].clientX\r\n this.slideCurrentX = e.touches[0].clientX\r\n this.slideIsDragging = true\r\n }\r\n },\r\n \r\n /**\r\n * 滑动模式触摸移动\r\n */\r\n onSlideViewerTouchMove(e) {\r\n if (this.slideIsDragging && e.touches.length === 1) {\r\n this.slideCurrentX = e.touches[0].clientX\r\n e.preventDefault()\r\n }\r\n },\r\n \r\n /**\r\n * 滑动模式触摸结束\r\n */\r\n onSlideViewerTouchEnd(e) {\r\n if (this.slideIsDragging) {\r\n const deltaX = this.slideCurrentX - this.slideStartX\r\n const threshold = 50 // 滑动阈值\r\n \r\n if (deltaX > threshold && this.currentPage > 1) {\r\n // 向右滑动,上一页\r\n this.currentPage--\r\n this.recordReadingProgress(this.currentPage)\r\n } else if (deltaX < -threshold && this.currentPage < this.totalPages) {\r\n // 向左滑动,下一页\r\n this.currentPage++\r\n this.recordReadingProgress(this.currentPage)\r\n }\r\n \r\n this.slideIsDragging = false\r\n }\r\n },\r\n \r\n /**\r\n * 滚动模式滚动事件\r\n */\r\n onScrollViewerScroll(e) {\r\n const container = this.$refs.scrollViewer\r\n if (!container) return\r\n \r\n const scrollTop = container.scrollTop\r\n const containerHeight = container.clientHeight\r\n \r\n // 计算当前页码\r\n for (let i = 0; i < this.pages.length; i++) {\r\n const pageRef = this.$refs['scrollPage' + i]\r\n if (pageRef && pageRef[0]) {\r\n const pageTop = pageRef[0].offsetTop\r\n const pageBottom = pageTop + pageRef[0].offsetHeight\r\n \r\n if (scrollTop >= pageTop - containerHeight / 2 && scrollTop < pageBottom - containerHeight / 2) {\r\n if (this.currentPage !== i + 1) {\r\n this.currentPage = i + 1\r\n this.recordReadingProgress(this.currentPage)\r\n }\r\n break\r\n }\r\n }\r\n }\r\n },\r\n \r\n /**\r\n * 滚动到当前页\r\n */\r\n scrollToCurrentPage() {\r\n if (this.flipMode !== 'scroll') return\r\n \r\n const pageRef = this.$refs['scrollPage' + (this.currentPage - 1)]\r\n if (pageRef && pageRef[0]) {\r\n pageRef[0].scrollIntoView({ behavior: 'smooth', block: 'start' })\r\n }\r\n },\r\n \r\n /**\r\n * 关闭翻页模式菜单(点击外部)\r\n */\r\n closeFlipModeMenu(e) {\r\n if (!e.target.closest('.flip-mode-selector')) {\r\n this.showFlipModeMenu = false\r\n }\r\n },\r\n \r\n /**\r\n * 获取卡片样式\r\n * @param {string} position - 卡片位置:prev, current, next\r\n */\r\n getCardStyle(position) {\r\n switch (position) {\r\n case 'prev':\r\n return {\r\n transform: 'translateX(-70%) scale(0.85) rotateY(15deg)',\r\n zIndex: 1,\r\n opacity: 0.6,\r\n filter: 'brightness(0.8)'\r\n }\r\n case 'current':\r\n return {\r\n transform: 'translateX(0) scale(1) rotateY(0deg)',\r\n zIndex: 3,\r\n opacity: 1,\r\n filter: 'brightness(1)'\r\n }\r\n case 'next':\r\n return {\r\n transform: 'translateX(70%) scale(0.85) rotateY(-15deg)',\r\n zIndex: 1,\r\n opacity: 0.6,\r\n filter: 'brightness(0.8)'\r\n }\r\n default:\r\n return {}\r\n }\r\n },\r\n\r\n /**\r\n * 目录项点击事件\r\n * @param {Object} item - 点击的目录项\r\n */\r\n onCatalogueClick(item) {\r\n console.log('目录项被点击:', item)\r\n this.$emit('catalogue-click', item)\r\n },\r\n\r\n /**\r\n * 获取目录数据事件\r\n * @param {String} bookId - 书籍ID\r\n */\r\n onFetchCatalogue(bookId) {\r\n this.$emit('fetch-catalogue', bookId)\r\n },\r\n\r\n /**\r\n * 页面跳转事件\r\n * @param {number} pageNumber - 目标页码\r\n */\r\n onFocus() {\r\n // 使用flipbook的方法跳转到指定页面\r\n if (this.flipMode === 'flip') {\r\n this.flag = false\r\n setTimeout(() => {\r\n this.flag = true\r\n }, 500)\r\n } else if (this.flipMode === 'scroll') {\r\n this.scrollToCurrentPage()\r\n }\r\n },\r\n onPageJump(pageNumber) {\r\n console.log('跳转到页面:', pageNumber)\r\n\r\n // 关闭目录抽屉\r\n this.showCatalogueDrawer = false\r\n\r\n // 跳转到指定页面\r\n if (pageNumber && pageNumber >= 1 && pageNumber <= this.totalPages) {\r\n this.currentPage = pageNumber\r\n this.startPage = pageNumber\r\n\r\n // 记录阅读进度\r\n this.recordReadingProgress(pageNumber)\r\n\r\n // 使用flipbook的方法跳转到指定页面\r\n if (this.flipMode === 'flip') {\r\n this.flag = false\r\n setTimeout(() => {\r\n this.flag = true\r\n this.$nextTick(() => {\r\n this.$refs.flipbook.goToPage(pageNumber)\r\n })\r\n }, 500)\r\n } else if (this.flipMode === 'scroll') {\r\n this.scrollToCurrentPage()\r\n }\r\n } else {\r\n console.warn('无效的页码:', pageNumber)\r\n }\r\n },\r\n\r\n /**\r\n * 检查URL参数并跳转到指定页码\r\n */\r\n checkUrlPageParameter() {\r\n // 从URL查询参数中获取页码\r\n const pageParam = this.$route.query.page\r\n \r\n if (pageParam) {\r\n const targetPage = parseInt(pageParam, 10)\r\n \r\n console.log('检测到URL页码参数:', {\r\n pageParam,\r\n targetPage,\r\n totalPages: this.totalPages\r\n })\r\n \r\n // 验证页码是否有效\r\n if (!isNaN(targetPage) && targetPage >= 1 && targetPage <= this.totalPages) {\r\n console.log('准备跳转到页码:', targetPage)\r\n \r\n // 使用nextTick确保DOM已更新\r\n this.$nextTick(() => {\r\n this.jumpToPage(targetPage)\r\n })\r\n } else {\r\n console.warn('无效的页码参数:', {\r\n pageParam,\r\n targetPage,\r\n totalPages: this.totalPages,\r\n isValid: !isNaN(targetPage) && targetPage >= 1 && targetPage <= this.totalPages\r\n })\r\n }\r\n } else {\r\n console.log('URL中未检测到页码参数')\r\n }\r\n },\r\n\r\n /**\r\n * 跳转到指定页码\r\n * @param {number} pageNumber - 目标页码\r\n */\r\n jumpToPage(pageNumber) {\r\n if (!pageNumber || pageNumber < 1 || pageNumber > this.totalPages) {\r\n console.warn('无效的页码:', pageNumber)\r\n return\r\n }\r\n\r\n console.log('跳转到页面:', pageNumber)\r\n \r\n // 更新当前页码和起始页码\r\n this.currentPage = pageNumber\r\n this.startPage = pageNumber\r\n \r\n // 记录阅读进度\r\n this.recordReadingProgress(pageNumber)\r\n \r\n // 使用flipbook的方法跳转到指定页面\r\n if (this.flipMode === 'flip') {\r\n if (this.$refs.flipbook && this.$refs.flipbook.goToPage) {\r\n try {\r\n this.$refs.flipbook.goToPage(pageNumber)\r\n console.log('页面跳转成功:', pageNumber)\r\n } catch (error) {\r\n console.error('页面跳转失败:', error)\r\n }\r\n } else {\r\n console.warn('Flipbook组件未就绪,无法跳转页面')\r\n }\r\n } else if (this.flipMode === 'scroll') {\r\n this.scrollToCurrentPage()\r\n }\r\n // slide 和 fade 模式直接通过 currentPage 变化来切换\r\n },\r\n\r\n /**\r\n * 记录阅读进度\r\n * @param {number} pageNumber - 当前页码\r\n */\r\n async recordReadingProgress(pageNumber) {\r\n if (!this.bookId || !pageNumber) {\r\n console.warn('缺少书籍ID或页码,无法记录阅读进度')\r\n return\r\n }\r\n\r\n try {\r\n console.log('记录阅读进度:', {\r\n bookId: this.bookId,\r\n pageNumber: pageNumber\r\n })\r\n\r\n // 注释:原来调用API记录进度,现在改为触发事件让父组件处理\r\n // await booksApi.recordReadProgress(this.bookId, pageNumber)\r\n this.$emit('record-progress', { bookId: this.bookId, pageNumber })\r\n\r\n console.log('阅读进度记录成功')\r\n\r\n } catch (error) {\r\n console.error('记录阅读进度失败:', error)\r\n // 阅读记录失败不影响用户体验,只记录日志\r\n }\r\n },\r\n\r\n /**\r\n * 显示控件\r\n */\r\n showControlsTemporarily() {\r\n this.showControls = true\r\n\r\n // 清除之前的定时器\r\n if (this.hideControlsTimer) {\r\n clearTimeout(this.hideControlsTimer)\r\n }\r\n\r\n // 3秒后自动隐藏\r\n this.hideControlsTimer = setTimeout(() => {\r\n this.showControls = false\r\n }, 3000)\r\n },\r\n\r\n /**\r\n * 内容区域点击事件\r\n */\r\n onContentClick() {\r\n this.showControlsTemporarily()\r\n },\r\n\r\n /**\r\n * 处理页码输入\r\n */\r\n handlePageInput(e) {\r\n const value = e.target.value\r\n // 只允许输入数字\r\n const numValue = value.replace(/[^\\d]/g, '')\r\n // 限制不超过总页数\r\n if (numValue && parseInt(numValue) > this.totalPages) {\r\n this.jumpPageInput = this.totalPages.toString()\r\n } else {\r\n this.jumpPageInput = numValue\r\n }\r\n },\r\n\r\n /**\r\n * 执行页码跳转\r\n */\r\n handleJumpToPage() {\r\n const pageNum = parseInt(this.jumpPageInput)\r\n if (pageNum && pageNum >= 1 && pageNum <= this.totalPages) {\r\n // 重置缩放和位移,避免内容区域缩小\r\n this.resetZoom()\r\n this.jumpToPage(pageNum)\r\n this.jumpPageInput = ''\r\n }\r\n }\r\n },\r\n watch: {\r\n async pages(newPages) {\r\n if (newPages && newPages.length > 0 && this.isMobile) {\r\n this.contentReady = false\r\n await this.$nextTick()\r\n await this.preloadFirstPage()\r\n } else if (newPages && newPages.length > 0) {\r\n this.contentReady = true\r\n }\r\n }\r\n },\r\n async mounted() {\r\n console.log('组件已挂载,总页数:', this.totalPages)\r\n\r\n // 检测设备类型\r\n this.detectMobile()\r\n\r\n // 检查URL参数中的翻页模式\r\n const urlFlipMode = this.$route.query.mode || this.$route.query.flipMode\r\n if (urlFlipMode && this.flipModes.some(m => m.value === urlFlipMode)) {\r\n // URL参数指定的翻页模式优先级最高,并隐藏切换按钮\r\n this.flipMode = urlFlipMode\r\n this.flipModeFromUrl = true\r\n console.log('从URL参数读取翻页模式:', urlFlipMode)\r\n } else {\r\n // 否则从本地存储恢复\r\n const savedFlipMode = localStorage.getItem('book-viewer-flip-mode')\r\n if (savedFlipMode && this.flipModes.some(m => m.value === savedFlipMode)) {\r\n this.flipMode = savedFlipMode\r\n }\r\n }\r\n\r\n // 预加载首页图片(移动端优化)\r\n if (this.isMobile && this.pages && this.pages.length > 0) {\r\n await this.$nextTick()\r\n await this.preloadFirstPage()\r\n } else if (this.pages && this.pages.length > 0) {\r\n this.contentReady = true\r\n }\r\n\r\n // 监听窗口尺寸变化\r\n window.addEventListener('resize', this.handleResize)\r\n\r\n // 监听点击事件,用于关闭翻页模式菜单\r\n document.addEventListener('click', this.closeFlipModeMenu)\r\n },\r\n \r\n beforeDestroy() {\r\n // 清理事件监听\r\n window.removeEventListener('resize', this.handleResize)\r\n // 清理拖拽事件监听\r\n document.removeEventListener('mousemove', this.onCatalogueMouseMove)\r\n document.removeEventListener('mouseup', this.onCatalogueMouseUp)\r\n // 清理翻页模式菜单事件监听\r\n document.removeEventListener('click', this.closeFlipModeMenu)\r\n // 清理控件自动隐藏定时器\r\n if (this.hideControlsTimer) {\r\n clearTimeout(this.hideControlsTimer)\r\n }\r\n }\r\n}\r\n</script>\r\n\r\n<style scoped>\r\n.photo-album-container {\r\n /* min-height: 100vh; */\r\n background: transparent;\r\n padding: 5px 5px 80px 5px;\r\n display: flex;\r\n flex-direction: column;\r\n align-items: center;\r\n justify-content: center;\r\n transform-origin: center center;\r\n transition: transform 0.2s ease-out;\r\n overflow: hidden;\r\n position: relative;\r\n}\r\n\r\n.album-header {\r\n text-align: center;\r\n color: #495057;\r\n margin-bottom: 30px;\r\n}\r\n\r\n.album-header h1 {\r\n font-size: 2.5rem;\r\n margin-bottom: 10px;\r\n text-shadow: 1px 1px 2px rgba(0,0,0,0.1);\r\n font-weight: 600;\r\n}\r\n\r\n.album-header p {\r\n font-size: 1.1rem;\r\n opacity: 0.9;\r\n}\r\n\r\n.flipbook-wrapper {\r\n perspective: 2000px;\r\n margin-bottom: 20px;\r\n display: flex;\r\n justify-content: center;\r\n align-items: center;\r\n width: 100%;\r\n}\r\n\r\n.flipbook {\r\n width: 1600px;\r\n height: 1200px;\r\n box-shadow: none;\r\n border-radius: 0;\r\n overflow: hidden;\r\n transition: all 0.3s ease;\r\n}\r\n\r\n/* 隐藏标题时的调整 */\r\n.album-header[style*=\"display: none\"],\r\n.album-header[v-if=\"false\"] {\r\n display: none !important;\r\n}\r\n\r\n.photo-album-container:has(.album-header[v-if=\"false\"]) .flipbook,\r\n.photo-album-container .flipbook {\r\n max-height: calc(100vh - 100px);\r\n}\r\n\r\n/* 移动端单页模式样式 */\r\n.flipbook.mobile-mode {\r\n width: 100%;\r\n max-width: none;\r\n height: 92vh;\r\n max-height: 92vh;\r\n margin: 0 auto;\r\n}\r\n\r\n/* PC端双页模式样式 */\r\n.flipbook.desktop-mode {\r\n width: 1600px;\r\n height: 1200px;\r\n margin: 0 auto;\r\n}\r\n\r\n.page {\r\n background: white;\r\n display: flex;\r\n flex-direction: column;\r\n justify-content: center;\r\n align-items: center;\r\n position: relative;\r\n border-radius: 5px;\r\n}\r\n\r\n.page--cover {\r\n background: linear-gradient(45deg, #e9ecef 0%, #dee2e6 50%, #ced4da 100%);\r\n color: #495057;\r\n}\r\n\r\n.cover-page, .back-cover {\r\n text-align: center;\r\n height: 100%;\r\n display: flex;\r\n flex-direction: column;\r\n justify-content: center;\r\n align-items: center;\r\n padding: 40px;\r\n}\r\n\r\n.cover-page h2 {\r\n font-size: 3rem;\r\n margin-bottom: 20px;\r\n text-shadow: 2px 2px 4px rgba(0,0,0,0.3);\r\n font-weight: bold;\r\n}\r\n\r\n.cover-page p {\r\n font-size: 1.5rem;\r\n opacity: 0.9;\r\n margin-bottom: 30px;\r\n}\r\n\r\n.cover-decoration {\r\n display: flex;\r\n align-items: center;\r\n gap: 15px;\r\n margin-top: 20px;\r\n}\r\n\r\n.decoration-line {\r\n width: 60px;\r\n height: 2px;\r\n background: rgba(73,80,87,0.6);\r\n border-radius: 1px;\r\n}\r\n\r\n.cover-decoration span {\r\n font-size: 1.1rem;\r\n opacity: 0.9;\r\n white-space: nowrap;\r\n}\r\n\r\n.back-cover h3 {\r\n font-size: 2.5rem;\r\n margin-bottom: 15px;\r\n text-shadow: 2px 2px 4px rgba(0,0,0,0.3);\r\n}\r\n\r\n.back-cover p {\r\n font-size: 1.2rem;\r\n opacity: 0.8;\r\n margin-bottom: 30px;\r\n}\r\n\r\n.back-decoration p {\r\n font-size: 1.5rem;\r\n margin-bottom: 10px;\r\n}\r\n\r\n.back-decoration small {\r\n opacity: 0.7;\r\n font-size: 1rem;\r\n}\r\n\r\n.content-page {\r\n padding: 20px;\r\n height: 100%;\r\n width: 100%;\r\n box-sizing: border-box;\r\n display: flex;\r\n flex-direction: column;\r\n justify-content: space-between;\r\n}\r\n\r\n.image-container {\r\n flex: 1;\r\n display: flex;\r\n justify-content: center;\r\n align-items: center;\r\n margin-bottom: 0;\r\n width: 100%;\r\n height: 100%;\r\n overflow: hidden;\r\n}\r\n\r\n.image-container img {\r\n max-width: 100%;\r\n max-height: 100%;\r\n width: auto;\r\n height: auto;\r\n object-fit: contain;\r\n border-radius: 8px;\r\n box-shadow: 0 4px 12px rgba(0,0,0,0.1);\r\n transition: transform 0.3s ease;\r\n}\r\n\r\n.image-container img:hover {\r\n transform: scale(1.02);\r\n}\r\n\r\n.page-content-info {\r\n background: rgba(255,255,255,0.95);\r\n padding: 8px;\r\n border-radius: 12px;\r\n box-shadow: 0 2px 8px rgba(0,0,0,0.1);\r\n backdrop-filter: blur(10px);\r\n margin-top: 4px;\r\n flex-shrink: 0;\r\n}\r\n\r\n.image-title {\r\n font-size: 1.2rem;\r\n font-weight: bold;\r\n color: #2c3e50;\r\n margin-bottom: 8px;\r\n text-align: center;\r\n display: block;\r\n}\r\n\r\n.image-description {\r\n font-size: 0.9rem;\r\n color: #5a6c7d;\r\n line-height: 1.4;\r\n text-align: center;\r\n margin-bottom: 10px;\r\n display: block;\r\n}\r\n\r\n.page-number {\r\n text-align: center;\r\n padding-top: 10px;\r\n border-top: 1px solid rgba(0,0,0,0.1);\r\n}\r\n\r\n.page-number span {\r\n background: linear-gradient(45deg, #667eea, #764ba2);\r\n color: white;\r\n padding: 4px 12px;\r\n border-radius: 12px;\r\n font-size: 0.8rem;\r\n font-weight: bold;\r\n}\r\n\r\n.controls {\r\n display: flex;\r\n align-items: center;\r\n justify-content: center;\r\n gap: 12px;\r\n background: transparent;\r\n padding: 12px 20px;\r\n border-radius: 0;\r\n backdrop-filter: none;\r\n box-shadow: none;\r\n border: none;\r\n width: fit-content;\r\n margin: 20px auto;\r\n z-index: 1000;\r\n}\r\n\r\n.desktop-controls {\r\n position: relative;\r\n margin: 20px auto;\r\n}\r\n\r\n.mobile-controls {\r\n position: fixed;\r\n bottom: 20px;\r\n left: 50%;\r\n transform: translateX(-50%);\r\n margin: 0;\r\n max-width: 90vw;\r\n}\r\n\r\n.btn {\r\n background: #333;\r\n color: white;\r\n border: 1px solid #666;\r\n padding: 8px 16px;\r\n border-radius: 4px;\r\n cursor: pointer;\r\n font-size: 0.9rem;\r\n transition: all 0.3s ease;\r\n box-shadow: none;\r\n}\r\n\r\n.btn:hover:not(:disabled) {\r\n background: #555;\r\n transform: none;\r\n box-shadow: none;\r\n}\r\n\r\n.btn:disabled {\r\n opacity: 0.5;\r\n cursor: not-allowed;\r\n transform: none;\r\n}\r\n\r\n.page-indicator {\r\n color: #495057;\r\n font-size: 0.95rem;\r\n font-weight: bold;\r\n text-shadow: none;\r\n min-width: 70px;\r\n text-align: center;\r\n}\r\n\r\n/* 页码跳转容器样式 */\r\n.page-jump-container {\r\n display: flex;\r\n align-items: center;\r\n justify-content: center;\r\n gap: 8px;\r\n background: rgba(255, 255, 255, 0.95);\r\n padding: 10px 16px;\r\n border-radius: 8px;\r\n box-shadow: 0 2px 12px rgba(0, 0, 0, 0.15);\r\n z-index: 1000;\r\n width: fit-content;\r\n margin: 10px auto 0;\r\n}\r\n\r\n.mobile-page-jump {\r\n padding: 8px 12px;\r\n margin: 10px auto 0;\r\n}\r\n\r\n.page-jump-input {\r\n width: 120px;\r\n padding: 8px 12px;\r\n border: 1px solid #ddd;\r\n border-radius: 6px;\r\n background: #fff;\r\n color: #333;\r\n font-size: 16px;\r\n text-align: center;\r\n outline: none;\r\n transition: border-color 0.2s ease, box-shadow 0.2s ease;\r\n}\r\n\r\n.page-jump-input:focus {\r\n border-color: #333;\r\n box-shadow: 0 0 0 2px rgba(51, 51, 51, 0.1);\r\n}\r\n\r\n.page-jump-input::placeholder {\r\n color: #999;\r\n font-size: 0.85rem;\r\n}\r\n\r\n.btn-jump {\r\n padding: 8px 16px;\r\n white-space: nowrap;\r\n background: #333;\r\n color: white;\r\n border: none;\r\n border-radius: 6px;\r\n font-size: 0.9rem;\r\n cursor: pointer;\r\n transition: background 0.2s ease;\r\n}\r\n\r\n.btn-jump:hover {\r\n background: #555;\r\n}\r\n\r\n/* PC端响应式设计 */\r\n@media (max-width: 1800px) and (min-width: 769px) {\r\n .flipbook.desktop-mode {\r\n width: 95vw;\r\n height: calc(95vw * 0.625);\r\n max-width: 1600px;\r\n max-height: 1000px;\r\n }\r\n}\r\n\r\n/* 移动端样式 */\r\n@media (max-width: 768px) {\r\n .photo-album-container {\r\n padding: 5px 5px 120px 5px;\r\n align-items: center;\r\n touch-action: none;\r\n overflow: hidden;\r\n }\r\n\r\n .flipbook-wrapper {\r\n width: 100%;\r\n display: flex;\r\n justify-content: center;\r\n }\r\n\r\n .flipbook.mobile-mode {\r\n width: 98vw;\r\n height: 85vh;\r\n max-width: none;\r\n max-height: 85vh;\r\n margin: 0 auto;\r\n }\r\n\r\n .album-header {\r\n width: 100%;\r\n text-align: center;\r\n }\r\n\r\n .album-header h1 {\r\n font-size: 2rem;\r\n }\r\n\r\n\r\n .btn {\r\n padding: 8px 16px;\r\n font-size: 0.9rem;\r\n }\r\n\r\n .page-indicator {\r\n font-size: 0.85rem;\r\n min-width: 120px;\r\n text-align: center;\r\n }\r\n\r\n /* 移动端页码跳转 */\r\n .page-jump-container {\r\n top: 10px;\r\n right: 10px;\r\n padding: 8px 10px;\r\n gap: 6px;\r\n }\r\n\r\n .page-jump-input {\r\n width: 100px;\r\n padding: 6px 10px;\r\n font-size: 0.85rem;\r\n }\r\n\r\n .btn-jump {\r\n padding: 6px 12px;\r\n font-size: 0.85rem;\r\n }\r\n\r\n /* 移动端图片优化 */\r\n .image-container {\r\n margin-bottom: 0;\r\n }\r\n\r\n .image-container img {\r\n max-width: 100%;\r\n max-height: 100%;\r\n border-radius: 6px;\r\n }\r\n\r\n .page-content-info {\r\n padding: 6px;\r\n margin-top: 2px;\r\n }\r\n}\r\n\r\n@media (max-width: 480px) {\r\n .flipbook.mobile-mode {\r\n width: 98vw;\r\n height: 80vh;\r\n max-height: 80vh;\r\n margin: 0 auto;\r\n }\r\n \r\n .album-header h1 {\r\n font-size: 1.8rem;\r\n }\r\n \r\n .mobile-controls {\r\n gap: 6px;\r\n padding: 8px 12px;\r\n justify-content: center;\r\n align-items: center;\r\n bottom: 15px;\r\n width: 95%;\r\n /* max-width: 95vw; */\r\n }\r\n \r\n .btn {\r\n padding: 6px 12px;\r\n font-size: 0.8rem;\r\n }\r\n \r\n .page-indicator {\r\n text-align: center;\r\n min-width: 100px;\r\n }\r\n \r\n /* 小屏幕图片优化 */\r\n .image-container {\r\n margin-bottom: 0;\r\n }\r\n \r\n .image-container img {\r\n max-width: 100%;\r\n max-height: 100%;\r\n border-radius: 4px;\r\n }\r\n \r\n .page-content-info {\r\n padding: 4px;\r\n margin-top: 1px;\r\n }\r\n}\r\n\r\n/* 设备特定的优化 */\r\n.mobile-optimized {\r\n /* 移动端优化 */\r\n -webkit-tap-highlight-color: transparent;\r\n -webkit-touch-callout: none;\r\n -webkit-user-select: none;\r\n user-select: none;\r\n}\r\n\r\n.desktop-optimized {\r\n /* PC端优化 */\r\n cursor: pointer;\r\n}\r\n\r\n/* 翻页按钮在不同设备上的样式 */\r\n.btn {\r\n transition: all 0.2s ease;\r\n}\r\n\r\n.btn:hover:not(:disabled) {\r\n background: #555;\r\n transform: none;\r\n box-shadow: none;\r\n}\r\n\r\n/* 缩放提示样式 */\r\n.zoom-hint {\r\n position: fixed;\r\n top: 20px;\r\n right: 20px;\r\n background: rgba(0, 0, 0, 0.85);\r\n color: white;\r\n padding: 10px 16px;\r\n border-radius: 25px;\r\n font-size: 0.85rem;\r\n opacity: 0;\r\n transform: translateY(-10px);\r\n transition: all 0.3s ease;\r\n z-index: 10001;\r\n pointer-events: none;\r\n box-shadow: 0 4px 12px rgba(0, 0, 0, 0.3);\r\n}\r\n\r\n.zoom-hint.show {\r\n opacity: 1;\r\n transform: translateY(0);\r\n pointer-events: auto;\r\n}\r\n\r\n.zoom-info {\r\n display: flex;\r\n flex-direction: row;\r\n align-items: center;\r\n gap: 12px;\r\n}\r\n\r\n.zoom-info span {\r\n font-weight: 500;\r\n}\r\n\r\n.btn-reset-zoom {\r\n background: rgba(255, 255, 255, 0.2);\r\n color: white;\r\n border: 1px solid rgba(255, 255, 255, 0.3);\r\n padding: 4px 12px;\r\n border-radius: 15px;\r\n font-size: 0.75rem;\r\n cursor: pointer;\r\n transition: all 0.2s ease;\r\n font-weight: 600;\r\n white-space: nowrap;\r\n}\r\n\r\n.btn-reset-zoom:hover {\r\n background: rgba(255, 255, 255, 0.3);\r\n border-color: rgba(255, 255, 255, 0.5);\r\n transform: scale(1.05);\r\n}\r\n\r\n.btn-reset-zoom:active {\r\n transform: scale(0.95);\r\n}\r\n\r\n/* 控件显示/隐藏动画 */\r\n.controls {\r\n opacity: 0;\r\n visibility: hidden;\r\n transform: translateY(20px);\r\n transition: opacity 0.3s ease, visibility 0.3s ease, transform 0.3s ease;\r\n display: flex;\r\n background: rgba(255, 255, 255, 0.9);\r\n border-radius: 8px;\r\n box-shadow: 0 2px 8px rgba(0, 0, 0, 0.1);\r\n}\r\n\r\n.controls.controls-visible {\r\n opacity: 1;\r\n visibility: visible;\r\n transform: translateY(0);\r\n}\r\n\r\n.mobile-controls {\r\n position: fixed !important;\r\n bottom: 76px !important;\r\n left: 50% !important;\r\n transform: translateX(-50%) !important;\r\n z-index: 10000 !important;\r\n}\r\n\r\n.desktop-controls {\r\n position: relative !important;\r\n margin: 20px auto !important;\r\n}\r\n\r\n/* 目录按钮样式 */\r\n.catalogue-button {\r\n position: fixed;\r\n z-index: 9999999999;\r\n opacity: 0;\r\n visibility: hidden;\r\n transform: translateX(-20px);\r\n transition: opacity 0.3s ease, visibility 0.3s ease, transform 0.3s ease;\r\n user-select: none;\r\n}\r\n\r\n.catalogue-button.catalogue-visible {\r\n opacity: 1;\r\n visibility: visible;\r\n transform: translateX(0);\r\n}\r\n\r\n.catalogue-button.dragging {\r\n transform: scale(1.05);\r\n /* box-shadow: 0 8px 25px rgba(0, 0, 0, 0.2); */\r\n z-index: 999999;\r\n}\r\n\r\n\r\n.btn-catalogue {\r\n background: linear-gradient(45deg, #1989fa, #0066cc);\r\n color: white;\r\n border: 2px solid rgba(255, 255, 255, 0.3);\r\n padding: 10px 16px;\r\n border-radius: 20px;\r\n font-size: 0.9rem;\r\n font-weight: 600;\r\n box-shadow: 0 4px 12px rgba(25, 137, 250, 0.4), 0 0 0 1px rgba(255, 255, 255, 0.1);\r\n transition: all 0.2s ease;\r\n display: flex;\r\n align-items: center;\r\n gap: 6px;\r\n cursor: grab;\r\n white-space: nowrap;\r\n pointer-events: all;\r\n}\r\n\r\n.catalogue-button.dragging .btn-catalogue {\r\n cursor: grabbing;\r\n /* background: linear-gradient(45deg, #0066cc, #004499); */\r\n}\r\n\r\n.btn-catalogue:active {\r\n transform: scale(0.98);\r\n}\r\n\r\n/* 拖拽手柄样式 */\r\n.btn-catalogue .drag-handle {\r\n color: rgba(255, 255, 255, 0.7);\r\n font-size: 14px;\r\n margin-right: 2px;\r\n user-select: none;\r\n}\r\n\r\n.catalogue-icon {\r\n font-size: 1rem;\r\n flex-shrink: 0;\r\n}\r\n\r\n.catalogue-text {\r\n font-size: 0.9rem;\r\n flex-shrink: 0;\r\n}\r\n\r\n.btn-catalogue:hover {\r\n background: linear-gradient(45deg, #0066cc, #004499);\r\n transform: translateY(-2px);\r\n box-shadow: 0 6px 16px rgba(25, 137, 250, 0.4);\r\n}\r\n\r\n.btn-catalogue:hover .drag-handle {\r\n color: rgba(255, 255, 255, 0.9);\r\n}\r\n\r\n/* PC端缩放工具栏 */\r\n.zoom-toolbar {\r\n position: fixed;\r\n bottom: 20px;\r\n right: 20px;\r\n display: flex;\r\n gap: 8px;\r\n z-index: 10000;\r\n}\r\n\r\n.btn-zoom {\r\n width: 40px;\r\n height: 40px;\r\n background: #333;\r\n color: white;\r\n border: 1px solid #666;\r\n border-radius: 4px;\r\n font-size: 1.2rem;\r\n cursor: pointer;\r\n transition: all 0.2s ease;\r\n display: flex;\r\n align-items: center;\r\n justify-content: center;\r\n}\r\n\r\n.btn-zoom:hover:not(:disabled) {\r\n background: #555;\r\n}\r\n\r\n.btn-zoom:disabled {\r\n opacity: 0.3;\r\n cursor: not-allowed;\r\n}\r\n\r\n/* 移动端按钮优化 */\r\n@media (max-width: 768px) {\r\n .zoom-toolbar {\r\n display: none;\r\n }\r\n\r\n .btn:active {\r\n background: #555;\r\n transform: none;\r\n }\r\n\r\n .btn:hover:not(:disabled) {\r\n background: #555;\r\n transform: none;\r\n }\r\n\r\n .btn-catalogue {\r\n padding: 8px 12px;\r\n font-size: 0.8rem;\r\n border-radius: 16px;\r\n }\r\n\r\n .btn-catalogue .drag-handle {\r\n font-size: 16px;\r\n }\r\n\r\n .catalogue-icon {\r\n font-size: 0.9rem;\r\n }\r\n\r\n .catalogue-text {\r\n font-size: 0.8rem;\r\n }\r\n\r\n .zoom-hint {\r\n top: 10px;\r\n right: 10px;\r\n font-size: 0.75rem;\r\n }\r\n}\r\n\r\n/* 加载状态样式 */\r\n.loading-overlay {\r\n position: fixed;\r\n top: 0;\r\n left: 0;\r\n width: 100%;\r\n height: 100%;\r\n background: rgba(255, 255, 255, 0.95);\r\n backdrop-filter: blur(10px);\r\n display: flex;\r\n justify-content: center;\r\n align-items: center;\r\n z-index: 9999;\r\n animation: fadeIn 0.3s ease-out;\r\n}\r\n\r\n.loading-container {\r\n text-align: center;\r\n padding: 40px;\r\n background: white;\r\n border-radius: 20px;\r\n box-shadow: 0 20px 60px rgba(0, 0, 0, 0.1);\r\n max-width: 400px;\r\n width: 90%;\r\n}\r\n\r\n.loading-spinner {\r\n position: relative;\r\n width: 80px;\r\n height: 80px;\r\n margin: 0 auto 30px;\r\n}\r\n\r\n.spinner-ring {\r\n position: absolute;\r\n width: 100%;\r\n height: 100%;\r\n border: 3px solid transparent;\r\n border-top: 3px solid #007bff;\r\n border-radius: 50%;\r\n animation: spin 1.2s linear infinite;\r\n}\r\n\r\n.spinner-ring:nth-child(2) {\r\n width: 60px;\r\n height: 60px;\r\n top: 10px;\r\n left: 10px;\r\n border-top-color: #28a745;\r\n animation-delay: -0.4s;\r\n}\r\n\r\n.spinner-ring:nth-child(3) {\r\n width: 40px;\r\n height: 40px;\r\n top: 20px;\r\n left: 20px;\r\n border-top-color: #ffc107;\r\n animation-delay: -0.8s;\r\n}\r\n\r\n@keyframes spin {\r\n 0% { transform: rotate(0deg); }\r\n 100% { transform: rotate(360deg); }\r\n}\r\n\r\n.loading-text h3 {\r\n color: #333;\r\n font-size: 1.5rem;\r\n margin-bottom: 10px;\r\n font-weight: 600;\r\n}\r\n\r\n.loading-text p {\r\n color: #666;\r\n font-size: 1rem;\r\n margin-bottom: 20px;\r\n line-height: 1.5;\r\n}\r\n\r\n.loading-progress {\r\n width: 100%;\r\n height: 4px;\r\n background: #f0f0f0;\r\n border-radius: 2px;\r\n overflow: hidden;\r\n margin-top: 20px;\r\n}\r\n\r\n.progress-bar {\r\n height: 100%;\r\n background: linear-gradient(90deg, #007bff, #28a745, #ffc107);\r\n background-size: 200% 100%;\r\n animation: progressMove 2s ease-in-out infinite;\r\n border-radius: 2px;\r\n}\r\n\r\n@keyframes progressMove {\r\n 0% {\r\n transform: translateX(-100%);\r\n background-position: 200% 0;\r\n }\r\n 100% {\r\n transform: translateX(100%);\r\n background-position: -200% 0;\r\n }\r\n}\r\n\r\n/* 错误状态样式 */\r\n.error-container {\r\n position: fixed;\r\n top: 0;\r\n left: 0;\r\n width: 100%;\r\n height: 100%;\r\n background: rgba(255, 255, 255, 0.95);\r\n backdrop-filter: blur(10px);\r\n display: flex;\r\n justify-content: center;\r\n align-items: center;\r\n z-index: 9999;\r\n animation: fadeIn 0.3s ease-out;\r\n}\r\n\r\n.error-content {\r\n text-align: center;\r\n padding: 40px;\r\n background: white;\r\n border-radius: 20px;\r\n box-shadow: 0 20px 60px rgba(0, 0, 0, 0.1);\r\n max-width: 400px;\r\n width: 90%;\r\n}\r\n\r\n.error-icon {\r\n font-size: 4rem;\r\n margin-bottom: 20px;\r\n display: block;\r\n}\r\n\r\n.error-content h3 {\r\n color: #dc3545;\r\n font-size: 1.5rem;\r\n margin-bottom: 15px;\r\n font-weight: 600;\r\n}\r\n\r\n.error-content p {\r\n color: #666;\r\n font-size: 1rem;\r\n margin-bottom: 30px;\r\n line-height: 1.5;\r\n}\r\n\r\n.retry-btn {\r\n background: linear-gradient(45deg, #007bff, #0056b3);\r\n color: white;\r\n border: none;\r\n padding: 12px 30px;\r\n border-radius: 25px;\r\n font-size: 1rem;\r\n font-weight: 600;\r\n cursor: pointer;\r\n transition: all 0.3s ease;\r\n display: inline-flex;\r\n align-items: center;\r\n gap: 8px;\r\n box-shadow: 0 4px 15px rgba(0, 123, 255, 0.3);\r\n}\r\n\r\n.retry-btn:hover {\r\n transform: translateY(-2px);\r\n box-shadow: 0 6px 20px rgba(0, 123, 255, 0.4);\r\n}\r\n\r\n.retry-btn:active {\r\n transform: translateY(0);\r\n}\r\n\r\n.retry-icon {\r\n display: inline-block;\r\n animation: rotateIcon 0.5s ease-in-out;\r\n}\r\n\r\n.retry-btn:hover .retry-icon {\r\n animation: rotateIcon 0.5s ease-in-out infinite;\r\n}\r\n\r\n@keyframes rotateIcon {\r\n from { transform: rotate(0deg); }\r\n to { transform: rotate(360deg); }\r\n}\r\n\r\n/* 成功提示样式 */\r\n.success-toast {\r\n position: fixed;\r\n top: 30px;\r\n right: 30px;\r\n background: linear-gradient(45deg, #28a745, #20c997);\r\n color: white;\r\n padding: 15px 25px;\r\n border-radius: 25px;\r\n font-size: 1rem;\r\n font-weight: 600;\r\n box-shadow: 0 8px 25px rgba(40, 167, 69, 0.3);\r\n z-index: 10000;\r\n opacity: 0;\r\n transform: translateX(100px);\r\n transition: all 0.4s cubic-bezier(0.68, -0.55, 0.265, 1.55);\r\n display: flex;\r\n align-items: center;\r\n gap: 10px;\r\n}\r\n\r\n.success-toast.show {\r\n opacity: 1;\r\n transform: translateX(0);\r\n}\r\n\r\n.success-icon {\r\n font-size: 1.2rem;\r\n}\r\n\r\n@keyframes fadeIn {\r\n from {\r\n opacity: 0;\r\n transform: scale(0.9);\r\n }\r\n to {\r\n opacity: 1;\r\n transform: scale(1);\r\n }\r\n}\r\n\r\n/* 移动端适配 */\r\n/* 翻页模式选择器样式 */\r\n.flip-mode-selector {\r\n position: fixed;\r\n top: 20px;\r\n left: 20px;\r\n z-index: 10000;\r\n}\r\n\r\n.mobile-flip-mode-selector {\r\n top: 15px;\r\n left: 15px;\r\n}\r\n\r\n.btn-flip-mode {\r\n background: linear-gradient(45deg, #6c5ce7, #a29bfe);\r\n color: white;\r\n border: 2px solid rgba(255, 255, 255, 0.3);\r\n padding: 10px 16px;\r\n border-radius: 20px;\r\n font-size: 0.9rem;\r\n font-weight: 600;\r\n box-shadow: 0 4px 12px rgba(108, 92, 231, 0.4);\r\n transition: all 0.2s ease;\r\n display: flex;\r\n align-items: center;\r\n gap: 6px;\r\n cursor: pointer;\r\n}\r\n\r\n.btn-flip-mode:hover {\r\n background: linear-gradient(45deg, #5f4ed5, #8c7ae6);\r\n transform: translateY(-2px);\r\n box-shadow: 0 6px 16px rgba(108, 92, 231, 0.5);\r\n}\r\n\r\n.flip-mode-icon {\r\n font-size: 1rem;\r\n}\r\n\r\n.flip-mode-text {\r\n font-size: 0.85rem;\r\n}\r\n\r\n.flip-mode-menu {\r\n position: absolute;\r\n top: 100%;\r\n left: 0;\r\n margin-top: 8px;\r\n background: white;\r\n border-radius: 12px;\r\n box-shadow: 0 8px 25px rgba(0, 0, 0, 0.15);\r\n overflow: hidden;\r\n min-width: 150px;\r\n animation: slideDown 0.2s ease-out;\r\n}\r\n\r\n@keyframes slideDown {\r\n from {\r\n opacity: 0;\r\n transform: translateY(-10px);\r\n }\r\n to {\r\n opacity: 1;\r\n transform: translateY(0);\r\n }\r\n}\r\n\r\n.flip-mode-item {\r\n display: flex;\r\n align-items: center;\r\n gap: 10px;\r\n padding: 12px 16px;\r\n cursor: pointer;\r\n transition: background 0.2s ease;\r\n}\r\n\r\n.flip-mode-item:hover {\r\n background: #f5f5f5;\r\n}\r\n\r\n.flip-mode-item-active {\r\n background: linear-gradient(45deg, #6c5ce7, #a29bfe);\r\n color: white;\r\n}\r\n\r\n.flip-mode-item-active:hover {\r\n background: linear-gradient(45deg, #5f4ed5, #8c7ae6);\r\n}\r\n\r\n.flip-mode-item-icon {\r\n font-size: 1.1rem;\r\n}\r\n\r\n.flip-mode-item-label {\r\n font-size: 0.9rem;\r\n font-weight: 500;\r\n}\r\n\r\n/* 滑动模式样式 */\r\n.slide-viewer {\r\n width: 1600px;\r\n height: 1000px;\r\n overflow: hidden;\r\n position: relative;\r\n}\r\n\r\n.slide-viewer.mobile-mode {\r\n width: 100%;\r\n max-width: none;\r\n height: 85vh;\r\n max-height: 85vh;\r\n}\r\n\r\n.slide-container {\r\n display: flex;\r\n height: 100%;\r\n will-change: transform;\r\n}\r\n\r\n.slide-page {\r\n flex: 0 0 100%;\r\n width: 100%;\r\n height: 100%;\r\n display: flex;\r\n justify-content: center;\r\n align-items: center;\r\n background: #f8f9fa;\r\n}\r\n\r\n.slide-page-image {\r\n max-width: 100%;\r\n max-height: 100%;\r\n object-fit: contain;\r\n}\r\n\r\n.slide-page-placeholder {\r\n font-size: 2rem;\r\n color: #666;\r\n text-align: center;\r\n}\r\n\r\n/* 淡入淡出模式样式 */\r\n.fade-viewer {\r\n width: 1600px;\r\n height: 1000px;\r\n overflow: hidden;\r\n position: relative;\r\n}\r\n\r\n.fade-viewer.mobile-mode {\r\n width: 100%;\r\n max-width: none;\r\n height: 85vh;\r\n max-height: 85vh;\r\n}\r\n\r\n.fade-page-container {\r\n width: 100%;\r\n height: 100%;\r\n display: flex;\r\n justify-content: center;\r\n align-items: center;\r\n background: #f8f9fa;\r\n}\r\n\r\n.fade-page-image {\r\n max-width: 100%;\r\n max-height: 100%;\r\n object-fit: contain;\r\n}\r\n\r\n.fade-page-placeholder {\r\n font-size: 2rem;\r\n color: #666;\r\n text-align: center;\r\n}\r\n\r\n.fade-page-enter-active,\r\n.fade-page-leave-active {\r\n transition: opacity 0.3s ease;\r\n}\r\n\r\n.fade-page-enter,\r\n.fade-page-leave-to {\r\n opacity: 0;\r\n}\r\n\r\n/* 垂直滚动模式样式 */\r\n.scroll-viewer {\r\n width: 1600px;\r\n height: 1000px;\r\n overflow-y: auto;\r\n overflow-x: hidden;\r\n position: relative;\r\n scroll-behavior: smooth;\r\n}\r\n\r\n.scroll-viewer.mobile-mode {\r\n width: 100%;\r\n max-width: none;\r\n height: 85vh;\r\n max-height: 85vh;\r\n}\r\n\r\n.scroll-container {\r\n width: 100%;\r\n}\r\n\r\n.scroll-page {\r\n width: 100%;\r\n min-height: 100%;\r\n display: flex;\r\n justify-content: center;\r\n align-items: center;\r\n background: #f8f9fa;\r\n padding: 20px 0;\r\n box-sizing: border-box;\r\n}\r\n\r\n.scroll-page-image {\r\n max-width: 100%;\r\n max-height: none;\r\n width: auto;\r\n}\r\n\r\n.scroll-page-placeholder {\r\n font-size: 2rem;\r\n color: #666;\r\n text-align: center;\r\n min-height: 300px;\r\n display: flex;\r\n align-items: center;\r\n justify-content: center;\r\n}\r\n\r\n/* 滚动条样式 */\r\n.scroll-viewer::-webkit-scrollbar {\r\n width: 8px;\r\n}\r\n\r\n.scroll-viewer::-webkit-scrollbar-track {\r\n background: #f1f1f1;\r\n border-radius: 4px;\r\n}\r\n\r\n.scroll-viewer::-webkit-scrollbar-thumb {\r\n background: #c1c1c1;\r\n border-radius: 4px;\r\n}\r\n\r\n.scroll-viewer::-webkit-scrollbar-thumb:hover {\r\n background: #a1a1a1;\r\n}\r\n\r\n/* 截断特效模式样式 */\r\n.clip-viewer {\r\n width: 1600px;\r\n height: 1000px;\r\n overflow: hidden;\r\n position: relative;\r\n perspective: 1200px;\r\n}\r\n\r\n.clip-viewer.mobile-mode {\r\n width: 100%;\r\n max-width: none;\r\n height: 85vh;\r\n max-height: 85vh;\r\n}\r\n\r\n.clip-pages-wrapper {\r\n width: 100%;\r\n height: 100%;\r\n position: relative;\r\n display: flex;\r\n justify-content: center;\r\n align-items: center;\r\n}\r\n\r\n.clip-page {\r\n position: absolute;\r\n width: 100%;\r\n height: 100%;\r\n display: flex;\r\n justify-content: center;\r\n align-items: center;\r\n background: #f8f9fa;\r\n}\r\n\r\n.clip-page-current {\r\n z-index: 2;\r\n clip-path: inset(0 0 0 0);\r\n}\r\n\r\n.clip-page-next {\r\n z-index: 1;\r\n opacity: 0.5;\r\n transform: scale(0.95);\r\n filter: blur(2px);\r\n}\r\n\r\n.clip-page-image {\r\n max-width: 100%;\r\n max-height: 100%;\r\n object-fit: contain;\r\n border-radius: 8px;\r\n box-shadow: 0 10px 40px rgba(0, 0, 0, 0.2);\r\n}\r\n\r\n.clip-page-placeholder {\r\n font-size: 2rem;\r\n color: #666;\r\n text-align: center;\r\n}\r\n\r\n/* 截断动画 */\r\n.clip-current-enter-active {\r\n animation: clipIn 0.5s cubic-bezier(0.4, 0, 0.2, 1);\r\n}\r\n\r\n.clip-current-leave-active {\r\n animation: clipOut 0.5s cubic-bezier(0.4, 0, 0.2, 1);\r\n}\r\n\r\n@keyframes clipIn {\r\n 0% {\r\n clip-path: inset(0 100% 0 0);\r\n transform: translateX(50px);\r\n opacity: 0;\r\n }\r\n 100% {\r\n clip-path: inset(0 0 0 0);\r\n transform: translateX(0);\r\n opacity: 1;\r\n }\r\n}\r\n\r\n@keyframes clipOut {\r\n 0% {\r\n clip-path: inset(0 0 0 0);\r\n transform: translateX(0);\r\n opacity: 1;\r\n }\r\n 100% {\r\n clip-path: inset(0 0 0 100%);\r\n transform: translateX(-50px);\r\n opacity: 0;\r\n }\r\n}\r\n\r\n/* 卡片风格模式样式 */\r\n.card-viewer {\r\n width: 1600px;\r\n height: 1000px;\r\n overflow: visible;\r\n position: relative;\r\n perspective: 1500px;\r\n}\r\n\r\n.card-viewer.mobile-mode {\r\n width: 100%;\r\n max-width: none;\r\n height: 85vh;\r\n max-height: 85vh;\r\n}\r\n\r\n.card-stack {\r\n width: 100%;\r\n height: 100%;\r\n position: relative;\r\n display: flex;\r\n justify-content: center;\r\n align-items: center;\r\n transform-style: preserve-3d;\r\n}\r\n\r\n.card-transition-group {\r\n width: 100%;\r\n height: 100%;\r\n position: relative;\r\n display: flex;\r\n justify-content: center;\r\n align-items: center;\r\n}\r\n\r\n.card-item {\r\n position: absolute;\r\n width: 70%;\r\n height: 90%;\r\n transition: all 0.5s cubic-bezier(0.4, 0, 0.2, 1);\r\n transform-style: preserve-3d;\r\n cursor: pointer;\r\n}\r\n\r\n.card-content {\r\n width: 100%;\r\n height: 100%;\r\n background: white;\r\n border-radius: 16px;\r\n box-shadow: 0 20px 60px rgba(0, 0, 0, 0.3), 0 8px 25px rgba(0, 0, 0, 0.2);\r\n overflow: hidden;\r\n display: flex;\r\n justify-content: center;\r\n align-items: center;\r\n position: relative;\r\n}\r\n\r\n.card-item-current .card-content {\r\n box-shadow: 0 30px 80px rgba(0, 0, 0, 0.35), 0 15px 40px rgba(0, 0, 0, 0.25);\r\n}\r\n\r\n.card-image {\r\n max-width: 100%;\r\n max-height: 100%;\r\n object-fit: contain;\r\n}\r\n\r\n.card-placeholder {\r\n font-size: 2rem;\r\n color: #666;\r\n text-align: center;\r\n}\r\n\r\n.card-page-number {\r\n position: absolute;\r\n bottom: 15px;\r\n left: 50%;\r\n transform: translateX(-50%);\r\n background: rgba(0, 0, 0, 0.7);\r\n color: white;\r\n padding: 6px 16px;\r\n border-radius: 20px;\r\n font-size: 0.85rem;\r\n font-weight: 500;\r\n}\r\n\r\n.card-item-prev .card-page-number,\r\n.card-item-next .card-page-number {\r\n opacity: 0;\r\n}\r\n\r\n/* 卡片切换动画 */\r\n.card-flip-enter-active,\r\n.card-flip-leave-active {\r\n transition: all 0.5s cubic-bezier(0.4, 0, 0.2, 1);\r\n}\r\n\r\n.card-flip-enter {\r\n opacity: 0;\r\n transform: translateX(100%) scale(0.8) rotateY(-30deg);\r\n}\r\n\r\n.card-flip-leave-to {\r\n opacity: 0;\r\n transform: translateX(-100%) scale(0.8) rotateY(30deg);\r\n}\r\n\r\n/* 卡片悬停效果 */\r\n.card-item-current:hover .card-content {\r\n box-shadow: 0 35px 90px rgba(0, 0, 0, 0.4), 0 18px 50px rgba(0, 0, 0, 0.3);\r\n}\r\n\r\n/* 移动端卡片样式 */\r\n@media (max-width: 768px) {\r\n .card-item {\r\n width: 85%;\r\n height: 85%;\r\n }\r\n \r\n .card-item-prev,\r\n .card-item-next {\r\n display: none;\r\n }\r\n \r\n .card-content {\r\n border-radius: 12px;\r\n }\r\n \r\n .card-page-number {\r\n font-size: 0.75rem;\r\n padding: 4px 12px;\r\n }\r\n \r\n .clip-page-next {\r\n display: none;\r\n }\r\n}\r\n\r\n/* 移动端翻页模式选择器样式 */\r\n@media (max-width: 768px) {\r\n .btn-flip-mode {\r\n padding: 8px 12px;\r\n font-size: 0.8rem;\r\n border-radius: 16px;\r\n }\r\n \r\n .flip-mode-icon {\r\n font-size: 0.9rem;\r\n }\r\n \r\n .flip-mode-text {\r\n font-size: 0.75rem;\r\n }\r\n \r\n .flip-mode-menu {\r\n min-width: 130px;\r\n }\r\n \r\n .flip-mode-item {\r\n padding: 10px 14px;\r\n }\r\n \r\n .flip-mode-item-icon {\r\n font-size: 1rem;\r\n }\r\n \r\n .flip-mode-item-label {\r\n font-size: 0.8rem;\r\n }\r\n}\r\n\r\n@media (max-width: 768px) {\r\n .loading-container,\r\n .error-content {\r\n padding: 30px 20px;\r\n margin: 20px;\r\n }\r\n \r\n .loading-spinner {\r\n width: 60px;\r\n height: 60px;\r\n }\r\n \r\n .spinner-ring:nth-child(2) {\r\n width: 45px;\r\n height: 45px;\r\n top: 7.5px;\r\n left: 7.5px;\r\n }\r\n \r\n .spinner-ring:nth-child(3) {\r\n width: 30px;\r\n height: 30px;\r\n top: 15px;\r\n left: 15px;\r\n }\r\n \r\n .loading-text h3,\r\n .error-content h3 {\r\n font-size: 1.3rem;\r\n }\r\n \r\n .loading-text p,\r\n .error-content p {\r\n font-size: 0.9rem;\r\n }\r\n \r\n .success-toast {\r\n top: 20px;\r\n right: 20px;\r\n left: 20px;\r\n right: 20px;\r\n font-size: 0.9rem;\r\n padding: 12px 20px;\r\n }\r\n \r\n .retry-btn {\r\n padding: 10px 25px;\r\n font-size: 0.9rem;\r\n }\r\n}\r\n\r\n</style>\r\n","import mod from \"-!../../node_modules/@vue/vue-loader-v15/lib/index.js??vue-loader-options!./BookReader.vue?vue&type=script&lang=js\"; export default mod; export * from \"-!../../node_modules/@vue/vue-loader-v15/lib/index.js??vue-loader-options!./BookReader.vue?vue&type=script&lang=js\"","import { render, staticRenderFns } from \"./BookReader.vue?vue&type=template&id=4702ca70&scoped=true\"\nimport script from \"./BookReader.vue?vue&type=script&lang=js\"\nexport * from \"./BookReader.vue?vue&type=script&lang=js\"\nimport style0 from \"./BookReader.vue?vue&type=style&index=0&id=4702ca70&prod&scoped=true&lang=css\"\n\n\n/* normalize component */\nimport normalizer from \"!../../node_modules/@vue/vue-loader-v15/lib/runtime/componentNormalizer.js\"\nvar component = normalizer(\n script,\n render,\n staticRenderFns,\n false,\n null,\n \"4702ca70\",\n null\n \n)\n\nexport default component.exports","import BookReader from './components/BookReader.vue'\r\nimport BookCatalogueDrawer from './components/BookCatalogueDrawer.vue'\r\n\r\nconst components = {\r\n BookReader,\r\n BookCatalogueDrawer\r\n}\r\n\r\nconst install = function(Vue) {\r\n if (install.installed) return\r\n install.installed = true\r\n Object.keys(components).forEach(key => {\r\n Vue.component(key, components[key])\r\n })\r\n}\r\n\r\nif (typeof window !== 'undefined' && window.Vue) {\r\n install(window.Vue)\r\n}\r\n\r\nexport default {\r\n install,\r\n BookReader,\r\n BookCatalogueDrawer\r\n}\r\n\r\nexport {\r\n BookReader,\r\n BookCatalogueDrawer\r\n}\r\n","import './setPublicPath'\nimport mod from '~entry'\nexport default mod\nexport * from '~entry'\n"],"names":["root","factory","exports","module","define","amd","self","this","__webpack_require__","d","definition","key","o","Object","defineProperty","enumerable","get","obj","prop","prototype","hasOwnProperty","call","r","Symbol","toStringTag","value","p","window","currentScript","document","src","match","render","_vm","_c","_self","staticClass","on","onContainerTouchStart","onContainerTouchMove","onContainerTouchEnd","onContainerDoubleClick","onContentClick","_e","style","transform","zoomScale","translateX","translateY","onFlipbookDoubleClick","$event","onFlipbookTouchStart","apply","arguments","onFlipbookTouchEnd","flipMode","flag","ref","class","isMobile","attrs","pages","pagesHiRes","startPage","onFlipLeftEnd","onFlipRightEnd","scopedSlots","_u","fn","page","canFlipLeft","canFlipRight","onSlideViewerTouchStart","onSlideViewerTouchMove","onSlideViewerTouchEnd","_l","index","currentPage","_v","onScrollViewerScroll","refInFor","totalPages","originalIndex","position","getCardStyle","_s","showControls","stopPropagation","flipLeft","Math","ceil","max","flipRight","toggleFlipModeMenu","flipModeIcon","flipModeLabel","mode","selectFlipMode","icon","label","catalogueButtonDragging","left","catalogueButtonPosition","x","top","y","onCatalogueMouseDown","onCatalogueTouchStart","onCatalogueTouchMove","onCatalogueTouchEnd","openCatalogue","round","resetZoom","zoomOut","zoomIn","_m","error","loading","message","fetchBooksData","booksData","showSuccessToast","bookId","catalogue","catalogueLoading","onCatalogueClick","onPageJump","onFocus","onFetchCatalogue","model","callback","$$v","showCatalogueDrawer","expression","staticRenderFns","format","source","constructor","Array","values","filter","isNaN","length","matrix","identity","TypeError","i","push","multiply","matrixA","matrixB","fma","fmb","product","row","j","k","col","result","perspective","distance","rotateY","angle","theta","PI","cos","sin","join","translate","distanceX","distanceY","translate3d","distanceZ","undefined","easeIn","easeInOut","easeOut","Matrix","arg","m","concat","clone","transformX","z","deg","toString","spinner","pow","script","props","type","required","default","flipDuration","Number","zoomDuration","zooms","nPolygons","ambient","gloss","swipeMin","singlePage","Boolean","forwardDirection","validator","val","centering","loadingImage","String","clickToZoom","dragToFlip","wheel","data","viewWidth","viewHeight","imageWidth","imageHeight","displayedPages","nImageLoad","nImageLoadTrigger","imageLoadCallback","firstPage","secondPage","zoomIndex","zoom","zooming","touchStartX","touchStartY","maxMove","activeCursor","hasTouchEvents","hasPointerEvents","minX","maxX","preloadedImages","flip","progress","direction","frontImage","backImage","auto","opacity","currentCenterOffset","animatingCenter","startScrollLeft","startScrollTop","scrollLeft","scrollTop","loadedImages","computed","IE","navigator","test","userAgent","canGoForward","canGoBack","canZoomIn","zooms_","canZoomOut","numPages","pageUrl","leftPage","rightPage","showLeftPage","showRightPage","cursor","pageScale","scale","vw","xScale","yScale","pageWidth","pageHeight","xMargin","yMargin","polygonWidth","w","polygonHeight","polygonBgSize","polygonArray","makePolygonArray","boundingLeft","boundingRight","centerOffset","retval","centerOffsetSmoothed","dragToScroll","scrollLeftMin","scrollLeftMax","scrollTopMin","h","scrollTopMax","scrollLeftLimited","min","scrollTopLimited","mounted","addEventListener","onResize","passive","goToPage","beforeDestroy","removeEventListener","methods","viewport","$refs","clientWidth","clientHeight","fixFirstPage","hiRes","url","pageUrlLoading","loadImage","flipStart","face","bgPos","dRadian","dRotate","image","lighting","originRight","pageMatrix","pageRotation","pageX","rad","radian","radius","results","rotate","x0","x1","computeLighting","abs","rot","DEG","POW","blackness","diffuse","gradients","lightingPoints","specular","map","this$1$1","requestAnimationFrame","flipAuto","ease","animate","duration","startRatio","t0","Date","now","$emit","ratio","t","onImageLoad","flipRevert","trigger","cb","didLoadImage","ev","target","path","naturalWidth","naturalHeight","preloadImages","zoomAt","zoomTo","containerFixedX","containerFixedY","end","endX","endY","fixedX","fixedY","rect","start","startX","startY","getBoundingClientRect","pageY","swipeStart","touch","swipeMove","dragScroll","swipeEnd","onTouchStart","changedTouches","onTouchMove","cancelable","preventDefault","onTouchEnd","onPointerDown","which","setPointerCapture","pointerId","onPointerMove","onPointerUp","releasePointerCapture","onMouseDown","onMouseMove","onMouseUp","onWheel","deltaX","deltaY","ref1","ref2","ref3","Image","img","onload","$set","watch","diff","rate","after","before","normalizeComponent","template","scopeId","isFunctionalTemplate","moduleIdentifier","shadowMode","createInjector","createInjectorSSR","createInjectorShadow","hook","options","_compiled","functional","_scopeId","context","$vnode","ssrContext","parent","__VUE_SSR_CONTEXT__","_registeredComponents","add","_ssrRegister","$root","$options","shadowRoot","originalRender","existing","beforeCreate","HEAD","isOldIE","toLowerCase","id","addStyle","styles","css","group","media","ids","Set","has","code","sources","btoa","unescape","encodeURIComponent","JSON","stringify","element","createElement","setAttribute","head","getElementsByTagName","appendChild","styleSheet","cssText","size","textNode","createTextNode","nodes","childNodes","removeChild","insertBefore","__vue_script__","__vue_render__","_h","$createElement","_t","width","height","bgImage","blank","backgroundImage","backgroundSize","backgroundPosition","zIndex","directives","name","rawName","__vue_staticRenderFns__","__vue_inject_styles__","inject","__vue_scope_id__","__vue_module_identifier__","__vue_is_functional_template__","__vue_component__","closeDrawer","visible","drawerWidth","domProps","composing","jumpPageInput","handlePageInput","onInputFocus","onInputBlur","handleJumpToPage","fetchCatalogue","catalogueData","item","onItemClick","CatalogueItem","level","expanded","hasChildren","children","childrenList","subItems","items","childrenData","itemStyle","paddingLeft","paddingRight","levelClass","toggleExpand","handleClick","titleText","titleName","title","text","dragHandle","startPageNum","pageNumber","pageNum","expandIcon","levelIndicator","repeat","titleSpan","pageSpan","childrenDiv","child","click","components","set","innerWidth","newVal","handler","processCatalogueData","immediate","console","warn","isArray","processedItem","log","e","numValue","replace","parseInt","resetData","handleResize","scriptExports","functionalTemplate","injectStyles","_injectStyles","component","Flipbook","BookCatalogueDrawer","contentReady","lastTouchDistance","lastTouchCenter","isZooming","isPanning","touchStartTime","initialTouches","flipbookTouchStartTime","flipbookLastTapTime","dragStartPosition","dragOffset","showFlipModeMenu","flipModes","slideStartX","slideCurrentX","slideIsDragging","flipModeFromUrl","hideControlsTimer","find","slideContainerStyle","offset","transition","showFlipModeSelector","visibleCards","cards","pageDisplayText","records","imageUrl","setTimeout","checkUrlPageParameter","response","request","updatePagesFromApiData","apiData","newPages","forEach","detectMobile","mobileKeywords","isMobileUA","some","keyword","includes","isMobileScreen","isTouchDevice","maxTouchPoints","screenSize","touchSupport","finalResult","preloadFirstPage","firstPageIndex","firstPageUrl","Promise","resolve","reject","onerror","wasMobile","$nextTick","flipbook","recordReadingProgress","from","touches","getTouchDistance","getTouchCenter","clientX","clientY","currentDistance","currentCenter","scaleChange","newScale","touchDuration","wasZooming","wasPanning","lastTapTime","constrainPosition","touch1","touch2","dx","dy","sqrt","maxTranslate","dragging","showDrawer","closest","onCatalogueMouseMove","onCatalogueMouseUp","dragDistance","newX","newY","maxY","innerHeight","oldMode","localStorage","setItem","to","scrollToCurrentPage","threshold","container","scrollViewer","containerHeight","pageRef","pageTop","offsetTop","pageBottom","offsetHeight","scrollIntoView","behavior","block","closeFlipModeMenu","pageParam","$route","query","targetPage","jumpToPage","isValid","showControlsTemporarily","clearTimeout","urlFlipMode","savedFlipMode","getItem","BookReader","install","Vue","installed","keys"],"ignoreList":[],"sourceRoot":""}
|