├── .gitignore ├── .vscode └── extensions.json ├── README.md ├── index.html ├── package.json ├── packages ├── Lang.ts ├── assets │ ├── more.svg │ ├── pdf │ │ └── loading-icon.gif │ └── search.svg ├── component.ts ├── components │ ├── download.vue │ ├── image.vue │ ├── pageNum.vue │ ├── pdf.vue │ ├── pdfNavContainer.vue │ ├── pdfNavigation.vue │ ├── pdfScale.vue │ ├── pdfTarget.vue │ ├── pdfTool.vue │ ├── print.vue │ ├── search.vue │ └── selectPopup.vue ├── config.ts ├── index.ts ├── utils │ └── index.ts └── vite-e.d.ts ├── pnpm-lock.yaml ├── public └── vite.svg ├── src ├── App.vue ├── assets │ ├── 1748352797096.pdf │ ├── Owners_Manual.pdf │ ├── demo.gif │ ├── pdf.worker.min.js │ ├── test2.pdf │ └── vue.svg ├── main.ts ├── style.css └── vite-env.d.ts ├── tsconfig.json ├── tsconfig.node.json ├── tsconfig.types.json └── vite.config.ts /.gitignore: -------------------------------------------------------------------------------- 1 | # Logs 2 | logs 3 | *.log 4 | npm-debug.log* 5 | yarn-debug.log* 6 | yarn-error.log* 7 | pnpm-debug.log* 8 | lerna-debug.log* 9 | 10 | node_modules 11 | dist 12 | dist-ssr 13 | *.local 14 | 15 | # Editor directories and files 16 | .vscode/* 17 | !.vscode/extensions.json 18 | .idea 19 | .DS_Store 20 | *.suo 21 | *.ntvs* 22 | *.njsproj 23 | *.sln 24 | *.sw? 25 | -------------------------------------------------------------------------------- /.vscode/extensions.json: -------------------------------------------------------------------------------- 1 | { 2 | "recommendations": ["Vue.volar"] 3 | } 4 | -------------------------------------------------------------------------------- /README.md: -------------------------------------------------------------------------------- 1 | # @sunsetglow/vue-pdf-viewer 2 | 3 | 用来预览 pdf 文件,开箱即用,无需多余的开发,操作简单,支持 vue3 vite, 4 | 5 | ## installation 6 | 7 | ``` 8 | pnpm i @sunsetglow/vue-pdf-viewer 9 | 10 | yarn add @sunsetglow/vue-pdf-viewer 11 | 12 | npm i @sunsetglow/vue-pdf-viewer 13 | ``` 14 | 15 | ## 🎊 功能介绍 16 | 17 | - 支持搜索,文本复制,自定义水印,打印,下载,缩放,左侧导航,分页等功能 18 | - pdf 渲染采用虚拟列表,可以使你轻松展示大文件 pdf 19 | 20 | ## ⭐ demo 21 | 22 | ![demo](/src/assets/demo.gif) 23 | 24 | ## 🌰 example 25 | 26 | ```vue 27 | 30 | 172 | 173 | 180 | ``` 181 | 182 | ## 参数说明 183 | 184 | | 参数名称 | 内容 说明 | 185 | | ----------: | -------------------------------------------------- | 186 | | loadFileUrl | pdf 文件路径 or ArrayBuffer or Uint8Array(必选) | 187 | | pdfPath | pdf.js 里所需的 pdf.worker.min.js 指向地址(必选) | 188 | | pdfOption | pdf 的配置选项 (可选) | 189 | | loading | pdf 加载完成执行函数 (可选) | 190 | 191 | ## api 事件说明 192 | 193 | - 对外开放 api 通一在 configPdfApiOptions 对象上 194 | 195 | ```ts 196 | import { configPdfApiOptions } from "@sunsetglow/vue-pdf-viewer"; 197 | /** 198 | * 控制pdf 跳到指定页码 199 | * @param index 200 | * 类型 number 201 | */ 202 | configPdfApiOptions.handleChange(1); 203 | /** 204 | * 搜索内置函数(在loading 函数里调用) 205 | * @param keyword 搜索内容 206 | * @param visible 是否展示搜索框 true 207 | */ 208 | configPdfApiOptions.onSearch("产品力成为推动其发展", false); 209 | ``` 210 | 211 | ## 🎆 欢迎大家的使用 212 | 213 | - 如果帮助到你,帮忙点个 star ,有任何改进可直接提 issue 或者私信邮箱 wyaoting999@163.com 214 | 215 | - github 仓库地址 [sunsetglow-vue-pdf-viewer](https://github.com/wyaoting/sunsetglow-vue-pdf-viewer) 216 | 217 | ## 🌹🌹 致谢 218 | 219 | - 此库基于 [pdf.js](https://github.com/mozilla/pdf.js) 进行二次封装感谢大佬的开源贡献精神 220 | -------------------------------------------------------------------------------- /index.html: -------------------------------------------------------------------------------- 1 | 2 | 3 | 4 | 5 | 6 | 7 | Vite + Vue + TS 8 | 9 | 10 |
11 | 12 | 13 | 14 | -------------------------------------------------------------------------------- /package.json: -------------------------------------------------------------------------------- 1 | { 2 | "name": "@sunsetglow/vue-pdf-viewer", 3 | "version": "0.3.33", 4 | "author": "wyt", 5 | "description": "vue pdf viewer", 6 | "keywords": [ 7 | "开箱即用的 pdf 工具", 8 | "web pdf viewer", 9 | "vue3", 10 | "pdf", 11 | "viewer", 12 | "pdf file search" 13 | ], 14 | "private": false, 15 | "license": "ISC", 16 | "types": "./dist/types/index.d.ts", 17 | "main": "./dist/pdf-view.umd.cjs", 18 | "type": "module", 19 | "files": [ 20 | "/dist" 21 | ], 22 | "publishConfig": { 23 | "access": "public", 24 | "registry": "https://registry.npmjs.org/" 25 | }, 26 | "scripts": { 27 | "dev": "vite", 28 | "build:types": "tsc -p ./tsconfig.types.json -emitDeclarationOnly -esModuleInterop", 29 | "build": "vue-tsc && vite build && pnpm build:types", 30 | "preview": "vite preview" 31 | }, 32 | "dependencies": { 33 | "@ant-design/icons-vue": "^7.0.1", 34 | "@types/node": "^20.14.9", 35 | "ant-design-vue": "^4.2.6", 36 | "pdfjs-dist": "3.4.120", 37 | "vite-plugin-static-copy": "^1.0.6", 38 | "vue": "^3.4.21" 39 | }, 40 | "devDependencies": { 41 | "@vitejs/plugin-vue": "^5.0.4", 42 | "typescript": "^5.2.2", 43 | "vite": "^5.2.0", 44 | "vue-tsc": "^2.0.6" 45 | } 46 | } 47 | -------------------------------------------------------------------------------- /packages/Lang.ts: -------------------------------------------------------------------------------- 1 | import { configOption } from "./config"; 2 | export const lang = { 3 | zh: { 4 | Preparing: "准备文档以供打印", 5 | copySuccess: "复制成功 !", 6 | }, 7 | en: { 8 | Preparing: "Preparing document for printing", 9 | copySuccess: "Copy Success !", 10 | }, 11 | }; 12 | 13 | export const t = (key: string) => { 14 | return ( 15 | //@ts-ignore 16 | (configOption.value.lang && 17 | //@ts-ignore 18 | lang[configOption.value.lang] && 19 | //@ts-ignore 20 | lang[configOption.value.lang][key]) || 21 | key 22 | ); 23 | }; 24 | -------------------------------------------------------------------------------- /packages/assets/more.svg: -------------------------------------------------------------------------------- 1 | -------------------------------------------------------------------------------- /packages/assets/pdf/loading-icon.gif: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/wyaoting/sunsetglow-vue-pdf-viewer/b0d800ce668187b7a27b0966b13c572c413696e9/packages/assets/pdf/loading-icon.gif -------------------------------------------------------------------------------- /packages/assets/search.svg: -------------------------------------------------------------------------------- 1 | -------------------------------------------------------------------------------- /packages/component.ts: -------------------------------------------------------------------------------- 1 | import Pdf from './components/pdf.vue' 2 | 3 | export default [Pdf] 4 | export { Pdf } -------------------------------------------------------------------------------- /packages/components/download.vue: -------------------------------------------------------------------------------- 1 | 6 | 33 | 34 | 50 | -------------------------------------------------------------------------------- /packages/components/image.vue: -------------------------------------------------------------------------------- 1 | 96 | 182 | 251 | -------------------------------------------------------------------------------- /packages/components/pageNum.vue: -------------------------------------------------------------------------------- 1 | 12 | 24 | 25 | 29 | -------------------------------------------------------------------------------- /packages/components/pdf.vue: -------------------------------------------------------------------------------- 1 | 58 | 260 | 261 | 290 | 304 | -------------------------------------------------------------------------------- /packages/components/pdfNavContainer.vue: -------------------------------------------------------------------------------- 1 | 32 | 92 | 93 | 153 | -------------------------------------------------------------------------------- /packages/components/pdfNavigation.vue: -------------------------------------------------------------------------------- 1 | 10 | 17 | 18 | 39 | -------------------------------------------------------------------------------- /packages/components/pdfScale.vue: -------------------------------------------------------------------------------- 1 | 23 | 32 | 33 | 58 | -------------------------------------------------------------------------------- /packages/components/pdfTarget.vue: -------------------------------------------------------------------------------- 1 | 96 | 326 | 327 | 384 | -------------------------------------------------------------------------------- /packages/components/pdfTool.vue: -------------------------------------------------------------------------------- 1 | 22 | 44 | 45 | 94 | -------------------------------------------------------------------------------- /packages/components/print.vue: -------------------------------------------------------------------------------- 1 | 16 | 126 | 127 | 143 | -------------------------------------------------------------------------------- /packages/components/search.vue: -------------------------------------------------------------------------------- 1 | 33 | 204 | 205 | 282 | -------------------------------------------------------------------------------- /packages/components/selectPopup.vue: -------------------------------------------------------------------------------- 1 | 27 | 28 | 115 | 157 | -------------------------------------------------------------------------------- /packages/config.ts: -------------------------------------------------------------------------------- 1 | import { ref, Ref, nextTick } from "vue"; 2 | import type { Component, CSSProperties } from "vue"; 3 | import { handlePdfLocateView } from "./utils/index"; 4 | export const globalStore = ref<{ 5 | searchRef: undefined | Ref; 6 | }>({ 7 | searchRef: undefined, 8 | }); 9 | export let file: Ref<{ 10 | data: ArrayBuffer | Uint8Array | undefined; 11 | url: string | undefined; 12 | }> = ref({ 13 | url: undefined, 14 | data: new ArrayBuffer(0), 15 | }); 16 | // 定义选择配置接口 17 | interface SelectConfig { 18 | text: string; 19 | icon?: Component; 20 | style?: CSSProperties; 21 | onClick: (text: string, onCopy: (text: string) => void) => void; 22 | } 23 | export type pdfOption = { 24 | search?: boolean; // 搜索 25 | scale?: boolean; //缩放 26 | pdfImageView?: boolean; //pdf 是否可以单片点击预览 27 | page?: boolean; //分页查看 28 | navShow?: boolean; //左侧导航 29 | toolShow?: boolean; // 是否开启顶部导航 30 | navigationShow?: boolean; // 左侧导航是否自动开启 31 | pdfViewResize?: boolean; // 是否开启resize 函数 32 | download?: boolean; //下载 33 | clearScale?: number; // 清晰度 默认1.5 感觉不清晰调大 ,当然清晰度越高pdf生成性能有影响 34 | fileName?: string; //pdf 下载文件名称 35 | print?: boolean; //pdf 打印 36 | lang?: enumGlobalLang | "zh" | "en"; //语言 默认zh 37 | customPdfOption?: { 38 | //自定义pdf.js 的一些参数 39 | cMapPacked?: boolean; // 指定 CMap 是否是二进制打包的。 Specifies if the Adobe CMaps are binary packed or not. The default value is `true`. 40 | cMapUrl?: string; // 预定义 Adob​​e CMaps 所在的 URL。包括尾随 The URL where the predefined Adobe CMaps are located. Include the trailing slash. 41 | [key: string]: any; 42 | }; 43 | textLayer?: boolean; //是否开启文字可复制 默认关闭 44 | renderTotalPage?: number; //是否渲染指定页面总数,-1 则默认默认渲染文件总数, 45 | pageOption?: { 46 | current?: number; //当前页码 47 | }; 48 | containerWidthScale?: number; //pdf 文件占父元素容器width的比例 默认是0.8 49 | visibleWindowPageRatio?: number; //当前pdf页面在可视窗口多少比例触发分页 50 | pdfItemBackgroundColor: string; //pdf 加载时背景颜色 默认#ebebeb 51 | selectConfig?: SelectConfig[]; 52 | watermarkOptions?: 53 | | { 54 | columns: number; 55 | rows: number; 56 | color: string; 57 | watermarkLink?: string; 58 | watermarkTextList?: string[]; 59 | rotation: number; 60 | fontSize: number; 61 | opacity: number; 62 | } 63 | | undefined; //是否pdf 添加水印 64 | handleCustomPrint?: (container: HTMLElement, onClose: Function) => void; //自定义打印函数 65 | }; 66 | export enum enumGlobalLang { 67 | zh = "zh", 68 | en = "en", 69 | } 70 | export interface option { 71 | loadFileUrl: string | ArrayBuffer | Uint8Array; // pdf 文件路径 | ArrayBuffer | Uint8Array 72 | pdfPath: string; // GlobalWorkerOptions.workerSrc 的文件路径 73 | loading?: (load: boolean, fileInfo: { totalPage: number }) => void; //加载完成函数 74 | pdfOption?: pdfOption; 75 | } 76 | export const configOption: Ref = ref({ 77 | search: true, //搜索 开启搜索必须开启textLayer 为true 78 | scale: true, //缩放 79 | pdfImageView: true, //pdf 是否可以单片点击预览 80 | page: true, //分页查看 81 | navShow: true, //左侧导航 82 | navigationShow: false, // 左侧导航是否开启 83 | pdfViewResize: true, // 是否开启resize 函数 确保pdf 根据可视窗口缩放大小 84 | toolShow: true, // 是否开启顶部导航 85 | download: true, //下载 86 | clearScale: 1.5, // 清晰度 默认1.5 感觉不清晰调大 ,当然清晰度越高pdf生成性能有影响 87 | fileName: "preview.pdf", // pdf 下载文件名称 88 | print: true, //打印功能 89 | lang: enumGlobalLang.zh, 90 | customPdfOption: {}, 91 | textLayer: false, //文字可复制 92 | pageOption: { 93 | current: 1, 94 | }, 95 | renderTotalPage: -1, //是否渲染指定页面总数,-1 则默认默认渲染文件总数, 96 | visibleWindowPageRatio: 0.5, //当前pdf页面在可视窗口多少比例触发分页 传入0.5 就是 (pdf下一页滚动到容器高度一半的时候 更新当前页码) 97 | containerWidthScale: 0.8, // 98 | pdfItemBackgroundColor: "#ebebeb", 99 | watermarkOptions: { 100 | columns: 3, //列数量 101 | rows: 4, // 行数量 102 | color: "#69b82a4f", //字体颜色 103 | rotation: 25, //旋转角度 104 | fontSize: 40, //字体大小 105 | opacity: 0.4, //调整透明度 106 | watermarkTextList: ["水印水印水印水印"], //(最大展示3个)水印文字和 watermarkLink 冲突,只能展示一个水印内容 107 | // watermarkLink: "https://www.autodatas.net/png/header-logo-54f61223.png", //水印可以支持公司logo 108 | }, // 不展示水印传 undefined即可 109 | selectConfig: undefined, 110 | }); 111 | 112 | export const configPdfApiOptions = { 113 | /** 114 | * 控制pdf 跳到指定页码 115 | * @param index 116 | */ 117 | handleChange: (index: number) => { 118 | handlePdfLocateView(index); 119 | }, 120 | /** 121 | * 搜索内置函数 122 | * @param keyword 搜索内容 123 | * @param visible 是否展示搜索框 true 124 | */ 125 | onSearch: (keyword: string, visible: boolean = true) => { 126 | nextTick(() => { 127 | globalStore.value.searchRef.open = visible; 128 | globalStore.value.searchRef.searchText = keyword; 129 | globalStore.value.searchRef.onSearch(); 130 | }); 131 | }, 132 | }; 133 | -------------------------------------------------------------------------------- /packages/index.ts: -------------------------------------------------------------------------------- 1 | import { createApp, h } from "vue"; 2 | import { Pdf } from "./component"; 3 | export { lang } from "./Lang"; 4 | import { configOption, option, configPdfApiOptions } from "./config"; 5 | const initPdfView = (container: HTMLElement, option: option) => { 6 | if (option.pdfOption) 7 | configOption.value = { ...configOption.value, ...option.pdfOption }; 8 | const { pdfOption, ...other } = option; 9 | const app = createApp(h(Pdf, { ...other })); 10 | app.mount(container); 11 | }; 12 | export { initPdfView, configPdfApiOptions, configOption }; 13 | -------------------------------------------------------------------------------- /packages/utils/index.ts: -------------------------------------------------------------------------------- 1 | export const handlePdfLocateView = ( 2 | i: number, 3 | domClassName: string = `#scrollIntIndex` 4 | ) => { 5 | const pdfContainer = document.querySelector(`${domClassName}-${i}`); 6 | pdfContainer && pdfContainer?.scrollIntoView(); 7 | }; 8 | 9 | export function isInViewPortOfOne(el: HTMLElement, parentEl: HTMLElement) { 10 | // viewPortHeight 兼容所有浏览器写法 11 | const viewPortHeight = parentEl.clientHeight - el.clientHeight; 12 | const offsetTop = el.offsetTop; 13 | const scrollTop = parentEl.scrollTop; 14 | const top = offsetTop - scrollTop; 15 | return top >= 0 && top <= viewPortHeight; 16 | } 17 | export const handelRestrictDebounce = (time: number, execute: Function) => { 18 | let timeoute: any; 19 | return (...args: any[]) => { 20 | timeoute && clearTimeout(timeoute); 21 | timeoute = setTimeout(() => { 22 | execute(...args); 23 | }, time); 24 | }; 25 | }; 26 | export const download = (url: string, filename?: string) => { 27 | const downloadElement = document.createElement("a"); 28 | downloadElement.style.display = "none"; 29 | downloadElement.href = url; 30 | if (filename) { 31 | downloadElement.download = filename; 32 | } 33 | document.body.appendChild(downloadElement); 34 | downloadElement.click(); 35 | document.body.removeChild(downloadElement); 36 | }; 37 | export const fetchFileResultDownload = async ( 38 | url: string, 39 | fileName = "preview.pdf" 40 | ) => { 41 | const blobRes = await fetch(url).then((res) => res.arrayBuffer()); 42 | const e = new Blob([blobRes], { 43 | type: "application/octet-stream", 44 | }); 45 | const link = window.URL.createObjectURL(e); 46 | download(link, fileName); 47 | }; 48 | export const removeNodesButKeepText = (className: string, dom: HTMLElement) => { 49 | // 获取所有具有指定类名的节点 50 | const nodes = dom.querySelectorAll(`.${className}`); 51 | for (let i = 0; i < nodes.length; i++) { 52 | const node = nodes[i] as any; 53 | const textNode = document.createTextNode(node.textContent); 54 | // 用文本节点替换原来的节点 55 | node.parentNode.replaceChild(textNode, node); 56 | } 57 | }; 58 | 59 | export let pdfContainerExample = null; 60 | interface DataItem { 61 | text: string; 62 | id: number; 63 | element: HTMLSpanElement; 64 | } 65 | 66 | interface HighlightedItem extends DataItem { 67 | highlightedText: string; 68 | matchType: "single" | "multiple"; 69 | } 70 | 71 | interface SearchResult { 72 | matches: HighlightedItem[]; 73 | totalGroups: number; 74 | totalItems: number; 75 | } 76 | 77 | function formatSpaces(targetStr: string, sourceStr: string, isMatch: boolean) { 78 | // 1. 提取span标签及其内容 79 | const spanMatch = 80 | targetStr.match( 81 | /([^<]*)<\/span>/ 82 | ) || targetStr.match(/([^<]*)<\/span>/); 83 | if (!spanMatch) return sourceStr; // 如果没有span标签直接返回 84 | const spanStart = spanMatch.index as number; 85 | 86 | let targetIndex = 0; 87 | const sourceWords = sourceStr.split(""); 88 | let spanText = ""; 89 | let spanEnd = spanMatch[1].length; 90 | for (let i = 0; i < sourceWords.length; i++) { 91 | let text = sourceWords[i]; 92 | if (targetIndex < spanStart || !spanEnd) { 93 | if (text !== " ") targetIndex++; 94 | } else { 95 | spanText += text; 96 | if (text !== " " && !!spanEnd) spanEnd--; 97 | // span 匹配到的文字 98 | } 99 | } 100 | if (!isMatch) 101 | return sourceStr.replace( 102 | spanText, 103 | `${spanText}` 104 | ); 105 | return spanText === sourceStr 106 | ? `${spanText}` 107 | : sourceStr 108 | .split(spanText) 109 | .map((v) => { 110 | return v 111 | ? v 112 | : `${spanText}`; 113 | }) 114 | .join(""); 115 | } 116 | 117 | function advancedTextSearch( 118 | data: DataItem[], 119 | query: string, 120 | caseSensitive: boolean = true 121 | ): SearchResult { 122 | const result: SearchResult = { 123 | matches: [], 124 | totalGroups: 0, 125 | totalItems: 0, 126 | }; 127 | 128 | if (!data || !query) return result; 129 | 130 | // 预处理查询词(支持中文连续匹配) 131 | const queryText = caseSensitive ? query.trim() : query.trim().toLowerCase(); 132 | const queryWords = queryText.split(/[\s\/]+/).filter(Boolean); 133 | 134 | if (queryWords.length === 0) return result; 135 | 136 | // 预处理数据 137 | const processedData = data 138 | .map((item, index) => ({ 139 | ...item, 140 | originalIndex: index, 141 | processedText: caseSensitive ? item.text : item.text.toLowerCase(), 142 | isEmpty: !item.text || !item.text.trim(), 143 | })) 144 | .filter((item) => !item.isEmpty); 145 | 146 | // 主搜索逻辑 147 | const matchedGroups: number[][] = []; 148 | const itemMatchInfo = new Map< 149 | number, 150 | { 151 | count: number; 152 | isPartOfMultiMatch: boolean; 153 | } 154 | >(); 155 | 156 | // 构建完整的文本串以便连续匹配 157 | let fullText = ""; 158 | const textSegments: { 159 | start: number; 160 | end: number; 161 | originalIndex: number; 162 | }[] = []; 163 | 164 | processedData.forEach((item) => { 165 | const start = fullText.length; 166 | fullText += item.processedText; 167 | textSegments.push({ 168 | start, 169 | end: fullText.length - 1, 170 | originalIndex: item.originalIndex, 171 | }); 172 | }); 173 | 174 | // 在完整文本中搜索 175 | const searchText = caseSensitive ? queryText : queryText.toLowerCase(); 176 | let searchPos = 0; 177 | while ((searchPos = fullText.indexOf(searchText, searchPos)) !== -1) { 178 | const matchEnd = searchPos + searchText.length - 1; 179 | // 找出所有被匹配到的文本段 180 | const matchedSegments = textSegments.filter( 181 | (seg) => 182 | (seg.start <= searchPos && seg.end >= searchPos) || 183 | (seg.start <= matchEnd && seg.end >= matchEnd) || 184 | (searchPos <= seg.start && matchEnd >= seg.end) 185 | ); 186 | if (matchedSegments.length > 0) { 187 | const originalIndices = matchedSegments.map((seg) => seg.originalIndex); 188 | matchedGroups.push(originalIndices); 189 | 190 | originalIndices.forEach((index) => { 191 | const info = itemMatchInfo.get(index) || { 192 | count: 0, 193 | isPartOfMultiMatch: false, 194 | }; 195 | info.count++; 196 | info.isPartOfMultiMatch = 197 | info.isPartOfMultiMatch || originalIndices.length > 1; 198 | itemMatchInfo.set(index, info); 199 | }); 200 | } 201 | 202 | searchPos = matchEnd; 203 | } 204 | function getMatchedTextForItem( 205 | itemId: number, 206 | matchedGroups: number[][], 207 | processedData: { originalIndex: number; processedText: string }[] 208 | ): string { 209 | for (const group of matchedGroups) { 210 | if (group.includes(itemId)) { 211 | // 找到该item所属的匹配组,拼接所有匹配的文本 212 | const matchedTexts = group.map( 213 | (index) => 214 | processedData.find((item) => item.originalIndex === index) 215 | ?.processedText || "" 216 | ); 217 | return matchedTexts.join(""); 218 | } 219 | } 220 | return ""; // 如果不是多匹配,返回空(交给单匹配逻辑处理) 221 | } 222 | // 高亮生成函数 223 | const highlightMatch = ( 224 | text: string, 225 | isMultiMatch: boolean, 226 | matchedText: string // 新增:传入实际匹配的文本(跨item匹配的部分) 227 | ): string => { 228 | if (!isMultiMatch) { 229 | // 单匹配:直接高亮整个查询词 230 | const escapedQuery = queryText.replace(/[.*+?^${}()|[\]\\]/g, "\\$&"); 231 | const regex = new RegExp(escapedQuery, caseSensitive ? "g" : "gi"); 232 | return text.replace(regex, `$&`); 233 | } 234 | // 多匹配:仅高亮匹配的部分(matchedText) 235 | const match = matchedText.toLowerCase().split(searchText.toLowerCase()); 236 | const resText = 237 | match.find( 238 | (v) => v.length && text.toLowerCase().includes(v.toLowerCase()) 239 | ) || ""; 240 | const textSplits = !resText 241 | ? [text] 242 | : text.toLowerCase().split(resText.toLowerCase()); 243 | 244 | return textSplits 245 | .map((v) => 246 | !!v 247 | ? `${v}` 248 | : resText 249 | ) 250 | .join(""); 251 | }; 252 | // 构建结果 253 | result.totalGroups = matchedGroups.length; 254 | result.totalItems = itemMatchInfo.size; 255 | // 如果是跨行从外面打标识 256 | result.matches = data 257 | .filter((_, index) => itemMatchInfo.has(index)) 258 | .map((item) => { 259 | const matchInfo = itemMatchInfo.get(item.id)!; 260 | // 新增:计算该item实际匹配的文本部分 261 | const matchedText = getMatchedTextForItem( 262 | item.id, 263 | matchedGroups, 264 | processedData 265 | ); 266 | return { 267 | ...item, 268 | highlightedText: highlightMatch( 269 | item.text, 270 | matchInfo.isPartOfMultiMatch, 271 | matchedText // 传入实际匹配的文本 272 | ), 273 | matchType: matchInfo.isPartOfMultiMatch ? "multiple" : "single", 274 | } as HighlightedItem; 275 | }); 276 | 277 | return result; 278 | } 279 | export class pdfRenderClass { 280 | canvas: HTMLCanvasElement; 281 | page: any; 282 | scale: number; 283 | viewport: any; 284 | constructor(canvas: HTMLCanvasElement, page: any, scale: number) { 285 | this.canvas = canvas; 286 | this.page = page; 287 | this.scale = scale; 288 | } 289 | async handleRender() { 290 | if (!this.page || !this.canvas) return; 291 | let realCanvas = document.createElement("canvas") as HTMLCanvasElement; 292 | let realContext = realCanvas.getContext("2d", { 293 | willReadFrequently: false, 294 | alpha: false, 295 | }) as CanvasRenderingContext2D; 296 | const ctx = this.canvas.getContext("2d", { 297 | willReadFrequently: false, 298 | alpha: false, 299 | }) as any; 300 | const dpr = window.devicePixelRatio || 1; 301 | const bsr = 302 | ctx.webkitBackingStorePixelRatio || 303 | ctx.mozBackingStorePixelRatio || 304 | ctx.msBackingStorePixelRatio || 305 | ctx.oBackingStorePixelRatio || 306 | ctx.backingStorePixelRatio || 307 | 1; 308 | const ratio = dpr / bsr; 309 | const viewport = this.page.getViewport({ scale: this.scale }); 310 | let w = viewport.width * ratio; 311 | let h = viewport.height * ratio; 312 | this.canvas.width = w; 313 | this.canvas.height = h; 314 | realCanvas.width = w; 315 | realCanvas.height = h; 316 | realCanvas.style.width = this.canvas.clientWidth + "px"; 317 | realCanvas.style.height = this.canvas.clientHeight + "px"; 318 | realContext.fillStyle = "#FFFFFF"; 319 | realContext.fillRect(0, 0, realCanvas.width, realCanvas.height); 320 | realContext.setTransform(ratio, 0, 0, ratio, 0, 0); 321 | // 将 PDF 页面渲染到 canvas 上下文中 322 | const renderContext = { 323 | canvasContext: realContext, 324 | viewport, 325 | intent: "display", 326 | }; 327 | await this.page.render(renderContext).promise; 328 | ctx.drawImage(realCanvas, 0, 0); 329 | this.viewport = viewport; 330 | return Promise.resolve({ 331 | page: this.page, 332 | viewport: viewport, 333 | }); 334 | } 335 | 336 | // 文字可复制 337 | async handleRenderTextContent( 338 | TextLayerBuilder: any, 339 | scale: number, 340 | container: HTMLElement, 341 | searchOption?: { visible: boolean; text: string } 342 | ) { 343 | const textLayerDiv = document.createElement("div"); 344 | textLayerDiv.setAttribute("class", "textLayer"); 345 | var textLayer = new TextLayerBuilder({ 346 | textLayerDiv: textLayerDiv, 347 | pageIndex: this.page._pageIndex, 348 | pdfPage: this.page, 349 | }); 350 | //换算缩放值 351 | container.style.setProperty("--scale-factor", `${scale}`); 352 | const textContent = await this.page.getTextContent(); 353 | textLayer.setTextContentSource(textContent); 354 | await textLayer.render(this.viewport); 355 | container.appendChild(textLayer.div); 356 | if (searchOption?.visible) this.handleSearch(container, searchOption.text); 357 | return Promise.resolve({ 358 | textLayer, 359 | container, 360 | }); 361 | } 362 | onToolText(textContent: string) { 363 | return textContent 364 | .split("") 365 | .filter((v: string) => !!v.trim()) 366 | .join(""); 367 | } 368 | handleSearch( 369 | container: HTMLElement, 370 | search: string, 371 | highlightVisible = true 372 | ) { 373 | let textTotal = 0; 374 | const textSearchList: { text: string; id: number; element: HTMLElement }[] = 375 | []; 376 | const childElement = container.querySelector(".textLayer"); 377 | if (childElement) { 378 | if (!search) return { textTotal }; 379 | childElement.childNodes.forEach((element: any, i: number) => { 380 | textSearchList.push({ 381 | text: this.onToolText(element.textContent), 382 | id: i, 383 | element, 384 | }); 385 | }); 386 | if (textSearchList.length) { 387 | const { totalGroups, matches } = advancedTextSearch( 388 | textSearchList, 389 | this.onToolText(search) 390 | ); 391 | textTotal = totalGroups; 392 | if (!highlightVisible) return { textTotal }; 393 | childElement.innerHTML = ""; 394 | let index = 0; 395 | let multipleVisible = false; 396 | for (let j = 0; j < textSearchList.length; j++) { 397 | const _item = textSearchList[j]; 398 | const target = matches?.find( 399 | (v: { id: number }) => v.id === _item.id 400 | ); 401 | if (target && _item?.element?.textContent) { 402 | const ismMultiple = target.matchType === "multiple"; 403 | _item?.element.removeAttribute("custom-search-id"); 404 | _item.element.innerHTML = formatSpaces( 405 | target.highlightedText, 406 | JSON.parse(JSON.stringify(_item?.element?.textContent)), 407 | ismMultiple 408 | ); 409 | // _item.element.innerHTML = target.highlightedText; 410 | if (ismMultiple) { 411 | if (!multipleVisible) { 412 | multipleVisible = true; 413 | index++; 414 | } 415 | } else { 416 | index++; 417 | multipleVisible = false; 418 | } 419 | _item.element.setAttribute("custom-search-id", `${index}`); 420 | childElement.appendChild(_item.element); 421 | } else { 422 | childElement.appendChild(_item.element); 423 | } 424 | } 425 | } 426 | } 427 | 428 | return { 429 | textTotal, 430 | }; 431 | } 432 | 433 | findTextMap(text: string, findText: string) { 434 | if (text === findText) return `${text}`; 435 | const target = text.toLowerCase().indexOf(findText.toLowerCase()); 436 | const searchTargetValue = target !== -1; 437 | const index = searchTargetValue ? target : 0; 438 | let value = text; 439 | let before = text.substr(0, index); // split into a part before the match 440 | let targetValue = text.substr(index, findText.length); 441 | let middle = text.substr( 442 | searchTargetValue ? index + findText.length : 0, 443 | text.length 444 | ); 445 | if (searchTargetValue && findText) { 446 | value = `${before}${targetValue}${ 447 | middle.toLowerCase().indexOf(findText.toLowerCase()) == -1 448 | ? middle 449 | : this.findTextMap(middle, findText) 450 | }`; 451 | } else if (target) { 452 | value = `${before}${middle}`; 453 | } 454 | return value as string; 455 | } 456 | 457 | getImageSrc() { 458 | return this.canvas?.toDataURL("image/png") as string; 459 | } 460 | } 461 | 462 | export const isArrayBuffer = (loadFileUrl: any) => { 463 | return Object.prototype.toString.call(loadFileUrl) === "[object ArrayBuffer]"; 464 | }; 465 | 466 | export const isUint8Array = (loadFileUrl: any) => { 467 | return Object.prototype.toString.call(loadFileUrl) === "[object Uint8Array]"; 468 | }; 469 | 470 | export const isFile = (loadFileUrl: any) => { 471 | return isUint8Array(loadFileUrl) || isArrayBuffer(loadFileUrl); 472 | }; 473 | -------------------------------------------------------------------------------- /packages/vite-e.d.ts: -------------------------------------------------------------------------------- 1 | declare module '*.vue' { 2 | import { defineComponent } from 'vue' 3 | const Component: ReturnType 4 | export default Component 5 | } -------------------------------------------------------------------------------- /pnpm-lock.yaml: -------------------------------------------------------------------------------- 1 | lockfileVersion: '9.0' 2 | 3 | settings: 4 | autoInstallPeers: true 5 | excludeLinksFromLockfile: false 6 | 7 | importers: 8 | 9 | .: 10 | dependencies: 11 | '@ant-design/icons-vue': 12 | specifier: ^7.0.1 13 | version: 7.0.1(vue@3.4.27(typescript@5.4.5)) 14 | '@types/node': 15 | specifier: ^20.14.9 16 | version: 20.14.9 17 | ant-design-vue: 18 | specifier: ^4.2.6 19 | version: 4.2.6(vue@3.4.27(typescript@5.4.5)) 20 | pdfjs-dist: 21 | specifier: 3.4.120 22 | version: 3.4.120 23 | vite-plugin-static-copy: 24 | specifier: ^1.0.6 25 | version: 1.0.6(vite@5.2.11(@types/node@20.14.9)) 26 | vue: 27 | specifier: ^3.4.21 28 | version: 3.4.27(typescript@5.4.5) 29 | devDependencies: 30 | '@vitejs/plugin-vue': 31 | specifier: ^5.0.4 32 | version: 5.0.4(vite@5.2.11(@types/node@20.14.9))(vue@3.4.27(typescript@5.4.5)) 33 | typescript: 34 | specifier: ^5.2.2 35 | version: 5.4.5 36 | vite: 37 | specifier: ^5.2.0 38 | version: 5.2.11(@types/node@20.14.9) 39 | vue-tsc: 40 | specifier: ^2.0.6 41 | version: 2.0.19(typescript@5.4.5) 42 | 43 | packages: 44 | 45 | '@ant-design/colors@6.0.0': 46 | resolution: {integrity: sha512-qAZRvPzfdWHtfameEGP2Qvuf838NhergR35o+EuVyB5XvSA98xod5r4utvi4TJ3ywmevm290g9nsCG5MryrdWQ==} 47 | 48 | '@ant-design/icons-svg@4.4.2': 49 | resolution: {integrity: sha512-vHbT+zJEVzllwP+CM+ul7reTEfBR0vgxFe7+lREAsAA7YGsYpboiq2sQNeQeRvh09GfQgs/GyFEvZpJ9cLXpXA==} 50 | 51 | '@ant-design/icons-vue@7.0.1': 52 | resolution: {integrity: sha512-eCqY2unfZK6Fe02AwFlDHLfoyEFreP6rBwAZMIJ1LugmfMiVgwWDYlp1YsRugaPtICYOabV1iWxXdP12u9U43Q==} 53 | peerDependencies: 54 | vue: '>=3.0.3' 55 | 56 | '@babel/helper-string-parser@7.24.6': 57 | resolution: {integrity: sha512-WdJjwMEkmBicq5T9fm/cHND3+UlFa2Yj8ALLgmoSQAJZysYbBjw+azChSGPN4DSPLXOcooGRvDwZWMcF/mLO2Q==} 58 | engines: {node: '>=6.9.0'} 59 | 60 | '@babel/helper-validator-identifier@7.24.6': 61 | resolution: {integrity: sha512-4yA7s865JHaqUdRbnaxarZREuPTHrjpDT+pXoAZ1yhyo6uFnIEpS8VMu16siFOHDpZNKYv5BObhsB//ycbICyw==} 62 | engines: {node: '>=6.9.0'} 63 | 64 | '@babel/parser@7.24.6': 65 | resolution: {integrity: sha512-eNZXdfU35nJC2h24RznROuOpO94h6x8sg9ju0tT9biNtLZ2vuP8SduLqqV+/8+cebSLV9SJEAN5Z3zQbJG/M+Q==} 66 | engines: {node: '>=6.0.0'} 67 | hasBin: true 68 | 69 | '@babel/runtime@7.26.7': 70 | resolution: {integrity: sha512-AOPI3D+a8dXnja+iwsUqGRjr1BbZIe771sXdapOtYI531gSqpi92vXivKcq2asu/DFpdl1ceFAKZyRzK2PCVcQ==} 71 | engines: {node: '>=6.9.0'} 72 | 73 | '@babel/types@7.24.6': 74 | resolution: {integrity: sha512-WaMsgi6Q8zMgMth93GvWPXkhAIEobfsIkLTacoVZoK1J0CevIPGYY2Vo5YvJGqyHqXM6P4ppOYGsIRU8MM9pFQ==} 75 | engines: {node: '>=6.9.0'} 76 | 77 | '@ctrl/tinycolor@3.6.1': 78 | resolution: {integrity: sha512-SITSV6aIXsuVNV3f3O0f2n/cgyEDWoSqtZMYiAmcsYHydcKrOz3gUxB/iXd/Qf08+IZX4KpgNbvUdMBmWz+kcA==} 79 | engines: {node: '>=10'} 80 | 81 | '@emotion/hash@0.9.2': 82 | resolution: {integrity: sha512-MyqliTZGuOm3+5ZRSaaBGP3USLw6+EGykkwZns2EPC5g8jJ4z9OrdZY9apkl3+UP9+sdz76YYkwCKP5gh8iY3g==} 83 | 84 | '@emotion/unitless@0.8.1': 85 | resolution: {integrity: sha512-KOEGMu6dmJZtpadb476IsZBclKvILjopjUii3V+7MnXIQCYh8W3NgNcgwo21n9LXZX6EDIKvqfjYxXebDwxKmQ==} 86 | 87 | '@esbuild/aix-ppc64@0.20.2': 88 | resolution: {integrity: sha512-D+EBOJHXdNZcLJRBkhENNG8Wji2kgc9AZ9KiPr1JuZjsNtyHzrsfLRrY0tk2H2aoFu6RANO1y1iPPUCDYWkb5g==} 89 | engines: {node: '>=12'} 90 | cpu: [ppc64] 91 | os: [aix] 92 | 93 | '@esbuild/android-arm64@0.20.2': 94 | resolution: {integrity: sha512-mRzjLacRtl/tWU0SvD8lUEwb61yP9cqQo6noDZP/O8VkwafSYwZ4yWy24kan8jE/IMERpYncRt2dw438LP3Xmg==} 95 | engines: {node: '>=12'} 96 | cpu: [arm64] 97 | os: [android] 98 | 99 | '@esbuild/android-arm@0.20.2': 100 | resolution: {integrity: sha512-t98Ra6pw2VaDhqNWO2Oph2LXbz/EJcnLmKLGBJwEwXX/JAN83Fym1rU8l0JUWK6HkIbWONCSSatf4sf2NBRx/w==} 101 | engines: {node: '>=12'} 102 | cpu: [arm] 103 | os: [android] 104 | 105 | '@esbuild/android-x64@0.20.2': 106 | resolution: {integrity: sha512-btzExgV+/lMGDDa194CcUQm53ncxzeBrWJcncOBxuC6ndBkKxnHdFJn86mCIgTELsooUmwUm9FkhSp5HYu00Rg==} 107 | engines: {node: '>=12'} 108 | cpu: [x64] 109 | os: [android] 110 | 111 | '@esbuild/darwin-arm64@0.20.2': 112 | resolution: {integrity: sha512-4J6IRT+10J3aJH3l1yzEg9y3wkTDgDk7TSDFX+wKFiWjqWp/iCfLIYzGyasx9l0SAFPT1HwSCR+0w/h1ES/MjA==} 113 | engines: {node: '>=12'} 114 | cpu: [arm64] 115 | os: [darwin] 116 | 117 | '@esbuild/darwin-x64@0.20.2': 118 | resolution: {integrity: sha512-tBcXp9KNphnNH0dfhv8KYkZhjc+H3XBkF5DKtswJblV7KlT9EI2+jeA8DgBjp908WEuYll6pF+UStUCfEpdysA==} 119 | engines: {node: '>=12'} 120 | cpu: [x64] 121 | os: [darwin] 122 | 123 | '@esbuild/freebsd-arm64@0.20.2': 124 | resolution: {integrity: sha512-d3qI41G4SuLiCGCFGUrKsSeTXyWG6yem1KcGZVS+3FYlYhtNoNgYrWcvkOoaqMhwXSMrZRl69ArHsGJ9mYdbbw==} 125 | engines: {node: '>=12'} 126 | cpu: [arm64] 127 | os: [freebsd] 128 | 129 | '@esbuild/freebsd-x64@0.20.2': 130 | resolution: {integrity: sha512-d+DipyvHRuqEeM5zDivKV1KuXn9WeRX6vqSqIDgwIfPQtwMP4jaDsQsDncjTDDsExT4lR/91OLjRo8bmC1e+Cw==} 131 | engines: {node: '>=12'} 132 | cpu: [x64] 133 | os: [freebsd] 134 | 135 | '@esbuild/linux-arm64@0.20.2': 136 | resolution: {integrity: sha512-9pb6rBjGvTFNira2FLIWqDk/uaf42sSyLE8j1rnUpuzsODBq7FvpwHYZxQ/It/8b+QOS1RYfqgGFNLRI+qlq2A==} 137 | engines: {node: '>=12'} 138 | cpu: [arm64] 139 | os: [linux] 140 | 141 | '@esbuild/linux-arm@0.20.2': 142 | resolution: {integrity: sha512-VhLPeR8HTMPccbuWWcEUD1Az68TqaTYyj6nfE4QByZIQEQVWBB8vup8PpR7y1QHL3CpcF6xd5WVBU/+SBEvGTg==} 143 | engines: {node: '>=12'} 144 | cpu: [arm] 145 | os: [linux] 146 | 147 | '@esbuild/linux-ia32@0.20.2': 148 | resolution: {integrity: sha512-o10utieEkNPFDZFQm9CoP7Tvb33UutoJqg3qKf1PWVeeJhJw0Q347PxMvBgVVFgouYLGIhFYG0UGdBumROyiig==} 149 | engines: {node: '>=12'} 150 | cpu: [ia32] 151 | os: [linux] 152 | 153 | '@esbuild/linux-loong64@0.20.2': 154 | resolution: {integrity: sha512-PR7sp6R/UC4CFVomVINKJ80pMFlfDfMQMYynX7t1tNTeivQ6XdX5r2XovMmha/VjR1YN/HgHWsVcTRIMkymrgQ==} 155 | engines: {node: '>=12'} 156 | cpu: [loong64] 157 | os: [linux] 158 | 159 | '@esbuild/linux-mips64el@0.20.2': 160 | resolution: {integrity: sha512-4BlTqeutE/KnOiTG5Y6Sb/Hw6hsBOZapOVF6njAESHInhlQAghVVZL1ZpIctBOoTFbQyGW+LsVYZ8lSSB3wkjA==} 161 | engines: {node: '>=12'} 162 | cpu: [mips64el] 163 | os: [linux] 164 | 165 | '@esbuild/linux-ppc64@0.20.2': 166 | resolution: {integrity: sha512-rD3KsaDprDcfajSKdn25ooz5J5/fWBylaaXkuotBDGnMnDP1Uv5DLAN/45qfnf3JDYyJv/ytGHQaziHUdyzaAg==} 167 | engines: {node: '>=12'} 168 | cpu: [ppc64] 169 | os: [linux] 170 | 171 | '@esbuild/linux-riscv64@0.20.2': 172 | resolution: {integrity: sha512-snwmBKacKmwTMmhLlz/3aH1Q9T8v45bKYGE3j26TsaOVtjIag4wLfWSiZykXzXuE1kbCE+zJRmwp+ZbIHinnVg==} 173 | engines: {node: '>=12'} 174 | cpu: [riscv64] 175 | os: [linux] 176 | 177 | '@esbuild/linux-s390x@0.20.2': 178 | resolution: {integrity: sha512-wcWISOobRWNm3cezm5HOZcYz1sKoHLd8VL1dl309DiixxVFoFe/o8HnwuIwn6sXre88Nwj+VwZUvJf4AFxkyrQ==} 179 | engines: {node: '>=12'} 180 | cpu: [s390x] 181 | os: [linux] 182 | 183 | '@esbuild/linux-x64@0.20.2': 184 | resolution: {integrity: sha512-1MdwI6OOTsfQfek8sLwgyjOXAu+wKhLEoaOLTjbijk6E2WONYpH9ZU2mNtR+lZ2B4uwr+usqGuVfFT9tMtGvGw==} 185 | engines: {node: '>=12'} 186 | cpu: [x64] 187 | os: [linux] 188 | 189 | '@esbuild/netbsd-x64@0.20.2': 190 | resolution: {integrity: sha512-K8/DhBxcVQkzYc43yJXDSyjlFeHQJBiowJ0uVL6Tor3jGQfSGHNNJcWxNbOI8v5k82prYqzPuwkzHt3J1T1iZQ==} 191 | engines: {node: '>=12'} 192 | cpu: [x64] 193 | os: [netbsd] 194 | 195 | '@esbuild/openbsd-x64@0.20.2': 196 | resolution: {integrity: sha512-eMpKlV0SThJmmJgiVyN9jTPJ2VBPquf6Kt/nAoo6DgHAoN57K15ZghiHaMvqjCye/uU4X5u3YSMgVBI1h3vKrQ==} 197 | engines: {node: '>=12'} 198 | cpu: [x64] 199 | os: [openbsd] 200 | 201 | '@esbuild/sunos-x64@0.20.2': 202 | resolution: {integrity: sha512-2UyFtRC6cXLyejf/YEld4Hajo7UHILetzE1vsRcGL3earZEW77JxrFjH4Ez2qaTiEfMgAXxfAZCm1fvM/G/o8w==} 203 | engines: {node: '>=12'} 204 | cpu: [x64] 205 | os: [sunos] 206 | 207 | '@esbuild/win32-arm64@0.20.2': 208 | resolution: {integrity: sha512-GRibxoawM9ZCnDxnP3usoUDO9vUkpAxIIZ6GQI+IlVmr5kP3zUq+l17xELTHMWTWzjxa2guPNyrpq1GWmPvcGQ==} 209 | engines: {node: '>=12'} 210 | cpu: [arm64] 211 | os: [win32] 212 | 213 | '@esbuild/win32-ia32@0.20.2': 214 | resolution: {integrity: sha512-HfLOfn9YWmkSKRQqovpnITazdtquEW8/SoHW7pWpuEeguaZI4QnCRW6b+oZTztdBnZOS2hqJ6im/D5cPzBTTlQ==} 215 | engines: {node: '>=12'} 216 | cpu: [ia32] 217 | os: [win32] 218 | 219 | '@esbuild/win32-x64@0.20.2': 220 | resolution: {integrity: sha512-N49X4lJX27+l9jbLKSqZ6bKNjzQvHaT8IIFUy+YIqmXQdjYCToGWwOItDrfby14c78aDd5NHQl29xingXfCdLQ==} 221 | engines: {node: '>=12'} 222 | cpu: [x64] 223 | os: [win32] 224 | 225 | '@jridgewell/sourcemap-codec@1.4.15': 226 | resolution: {integrity: sha512-eF2rxCRulEKXHTRiDrDy6erMYWqNw4LPdQ8UQA4huuxaQsVeRPFl2oM8oDGxMFhJUWZf9McpLtJasDDZb/Bpeg==} 227 | 228 | '@mapbox/node-pre-gyp@1.0.11': 229 | resolution: {integrity: sha512-Yhlar6v9WQgUp/He7BdgzOz8lqMQ8sU+jkCq7Wx8Myc5YFJLbEe7lgui/V7G1qB1DJykHSGwreceSaD60Y0PUQ==} 230 | hasBin: true 231 | 232 | '@nodelib/fs.scandir@2.1.5': 233 | resolution: {integrity: sha512-vq24Bq3ym5HEQm2NKCr3yXDwjc7vTsEThRDnkp2DK9p1uqLR+DHurm/NOTo0KG7HYHU7eppKZj3MyqYuMBf62g==} 234 | engines: {node: '>= 8'} 235 | 236 | '@nodelib/fs.stat@2.0.5': 237 | resolution: {integrity: sha512-RkhPPp2zrqDAQA/2jNhnztcPAlv64XdhIp7a7454A5ovI7Bukxgt7MX7udwAu3zg1DcpPU0rz3VV1SeaqvY4+A==} 238 | engines: {node: '>= 8'} 239 | 240 | '@nodelib/fs.walk@1.2.8': 241 | resolution: {integrity: sha512-oGB+UxlgWcgQkgwo8GcEGwemoTFt3FIO9ababBmaGwXIoBKZ+GTy0pP185beGg7Llih/NSHSV2XAs1lnznocSg==} 242 | engines: {node: '>= 8'} 243 | 244 | '@rollup/rollup-android-arm-eabi@4.18.0': 245 | resolution: {integrity: sha512-Tya6xypR10giZV1XzxmH5wr25VcZSncG0pZIjfePT0OVBvqNEurzValetGNarVrGiq66EBVAFn15iYX4w6FKgQ==} 246 | cpu: [arm] 247 | os: [android] 248 | 249 | '@rollup/rollup-android-arm64@4.18.0': 250 | resolution: {integrity: sha512-avCea0RAP03lTsDhEyfy+hpfr85KfyTctMADqHVhLAF3MlIkq83CP8UfAHUssgXTYd+6er6PaAhx/QGv4L1EiA==} 251 | cpu: [arm64] 252 | os: [android] 253 | 254 | '@rollup/rollup-darwin-arm64@4.18.0': 255 | resolution: {integrity: sha512-IWfdwU7KDSm07Ty0PuA/W2JYoZ4iTj3TUQjkVsO/6U+4I1jN5lcR71ZEvRh52sDOERdnNhhHU57UITXz5jC1/w==} 256 | cpu: [arm64] 257 | os: [darwin] 258 | 259 | '@rollup/rollup-darwin-x64@4.18.0': 260 | resolution: {integrity: sha512-n2LMsUz7Ynu7DoQrSQkBf8iNrjOGyPLrdSg802vk6XT3FtsgX6JbE8IHRvposskFm9SNxzkLYGSq9QdpLYpRNA==} 261 | cpu: [x64] 262 | os: [darwin] 263 | 264 | '@rollup/rollup-linux-arm-gnueabihf@4.18.0': 265 | resolution: {integrity: sha512-C/zbRYRXFjWvz9Z4haRxcTdnkPt1BtCkz+7RtBSuNmKzMzp3ZxdM28Mpccn6pt28/UWUCTXa+b0Mx1k3g6NOMA==} 266 | cpu: [arm] 267 | os: [linux] 268 | 269 | '@rollup/rollup-linux-arm-musleabihf@4.18.0': 270 | resolution: {integrity: sha512-l3m9ewPgjQSXrUMHg93vt0hYCGnrMOcUpTz6FLtbwljo2HluS4zTXFy2571YQbisTnfTKPZ01u/ukJdQTLGh9A==} 271 | cpu: [arm] 272 | os: [linux] 273 | 274 | '@rollup/rollup-linux-arm64-gnu@4.18.0': 275 | resolution: {integrity: sha512-rJ5D47d8WD7J+7STKdCUAgmQk49xuFrRi9pZkWoRD1UeSMakbcepWXPF8ycChBoAqs1pb2wzvbY6Q33WmN2ftw==} 276 | cpu: [arm64] 277 | os: [linux] 278 | 279 | '@rollup/rollup-linux-arm64-musl@4.18.0': 280 | resolution: {integrity: sha512-be6Yx37b24ZwxQ+wOQXXLZqpq4jTckJhtGlWGZs68TgdKXJgw54lUUoFYrg6Zs/kjzAQwEwYbp8JxZVzZLRepQ==} 281 | cpu: [arm64] 282 | os: [linux] 283 | 284 | '@rollup/rollup-linux-powerpc64le-gnu@4.18.0': 285 | resolution: {integrity: sha512-hNVMQK+qrA9Todu9+wqrXOHxFiD5YmdEi3paj6vP02Kx1hjd2LLYR2eaN7DsEshg09+9uzWi2W18MJDlG0cxJA==} 286 | cpu: [ppc64] 287 | os: [linux] 288 | 289 | '@rollup/rollup-linux-riscv64-gnu@4.18.0': 290 | resolution: {integrity: sha512-ROCM7i+m1NfdrsmvwSzoxp9HFtmKGHEqu5NNDiZWQtXLA8S5HBCkVvKAxJ8U+CVctHwV2Gb5VUaK7UAkzhDjlg==} 291 | cpu: [riscv64] 292 | os: [linux] 293 | 294 | '@rollup/rollup-linux-s390x-gnu@4.18.0': 295 | resolution: {integrity: sha512-0UyyRHyDN42QL+NbqevXIIUnKA47A+45WyasO+y2bGJ1mhQrfrtXUpTxCOrfxCR4esV3/RLYyucGVPiUsO8xjg==} 296 | cpu: [s390x] 297 | os: [linux] 298 | 299 | '@rollup/rollup-linux-x64-gnu@4.18.0': 300 | resolution: {integrity: sha512-xuglR2rBVHA5UsI8h8UbX4VJ470PtGCf5Vpswh7p2ukaqBGFTnsfzxUBetoWBWymHMxbIG0Cmx7Y9qDZzr648w==} 301 | cpu: [x64] 302 | os: [linux] 303 | 304 | '@rollup/rollup-linux-x64-musl@4.18.0': 305 | resolution: {integrity: sha512-LKaqQL9osY/ir2geuLVvRRs+utWUNilzdE90TpyoX0eNqPzWjRm14oMEE+YLve4k/NAqCdPkGYDaDF5Sw+xBfg==} 306 | cpu: [x64] 307 | os: [linux] 308 | 309 | '@rollup/rollup-win32-arm64-msvc@4.18.0': 310 | resolution: {integrity: sha512-7J6TkZQFGo9qBKH0pk2cEVSRhJbL6MtfWxth7Y5YmZs57Pi+4x6c2dStAUvaQkHQLnEQv1jzBUW43GvZW8OFqA==} 311 | cpu: [arm64] 312 | os: [win32] 313 | 314 | '@rollup/rollup-win32-ia32-msvc@4.18.0': 315 | resolution: {integrity: sha512-Txjh+IxBPbkUB9+SXZMpv+b/vnTEtFyfWZgJ6iyCmt2tdx0OF5WhFowLmnh8ENGNpfUlUZkdI//4IEmhwPieNg==} 316 | cpu: [ia32] 317 | os: [win32] 318 | 319 | '@rollup/rollup-win32-x64-msvc@4.18.0': 320 | resolution: {integrity: sha512-UOo5FdvOL0+eIVTgS4tIdbW+TtnBLWg1YBCcU2KWM7nuNwRz9bksDX1bekJJCpu25N1DVWaCwnT39dVQxzqS8g==} 321 | cpu: [x64] 322 | os: [win32] 323 | 324 | '@simonwep/pickr@1.8.2': 325 | resolution: {integrity: sha512-/l5w8BIkrpP6n1xsetx9MWPWlU6OblN5YgZZphxan0Tq4BByTCETL6lyIeY8lagalS2Nbt4F2W034KHLIiunKA==} 326 | 327 | '@types/estree@1.0.5': 328 | resolution: {integrity: sha512-/kYRxGDLWzHOB7q+wtSUQlFrtcdUccpfy+X+9iMBpHK8QLLhx2wIPYuS5DYtR9Wa/YlZAbIovy7qVdB1Aq6Lyw==} 329 | 330 | '@types/node@20.14.9': 331 | resolution: {integrity: sha512-06OCtnTXtWOZBJlRApleWndH4JsRVs1pDCc8dLSQp+7PpUpX3ePdHyeNSFTeSe7FtKyQkrlPvHwJOW3SLd8Oyg==} 332 | 333 | '@vitejs/plugin-vue@5.0.4': 334 | resolution: {integrity: sha512-WS3hevEszI6CEVEx28F8RjTX97k3KsrcY6kvTg7+Whm5y3oYvcqzVeGCU3hxSAn4uY2CLCkeokkGKpoctccilQ==} 335 | engines: {node: ^18.0.0 || >=20.0.0} 336 | peerDependencies: 337 | vite: ^5.0.0 338 | vue: ^3.2.25 339 | 340 | '@volar/language-core@2.2.5': 341 | resolution: {integrity: sha512-2htyAuxRrAgETmFeUhT4XLELk3LiEcqoW/B8YUXMF6BrGWLMwIR09MFaZYvrA2UhbdAeSyeQ726HaWSWkexUcQ==} 342 | 343 | '@volar/source-map@2.2.5': 344 | resolution: {integrity: sha512-wrOEIiZNf4E+PWB0AxyM4tfhkfldPsb3bxg8N6FHrxJH2ohar7aGu48e98bp3pR9HUA7P/pR9VrLmkTrgCCnWQ==} 345 | 346 | '@volar/typescript@2.2.5': 347 | resolution: {integrity: sha512-eSV/n75+ppfEVugMC/salZsI44nXDPAyL6+iTYCNLtiLHGJsnMv9GwiDMujrvAUj/aLQyqRJgYtXRoxop2clCw==} 348 | 349 | '@vue/compiler-core@3.4.27': 350 | resolution: {integrity: sha512-E+RyqY24KnyDXsCuQrI+mlcdW3ALND6U7Gqa/+bVwbcpcR3BRRIckFoz7Qyd4TTlnugtwuI7YgjbvsLmxb+yvg==} 351 | 352 | '@vue/compiler-dom@3.4.27': 353 | resolution: {integrity: sha512-kUTvochG/oVgE1w5ViSr3KUBh9X7CWirebA3bezTbB5ZKBQZwR2Mwj9uoSKRMFcz4gSMzzLXBPD6KpCLb9nvWw==} 354 | 355 | '@vue/compiler-sfc@3.4.27': 356 | resolution: {integrity: sha512-nDwntUEADssW8e0rrmE0+OrONwmRlegDA1pD6QhVeXxjIytV03yDqTey9SBDiALsvAd5U4ZrEKbMyVXhX6mCGA==} 357 | 358 | '@vue/compiler-ssr@3.4.27': 359 | resolution: {integrity: sha512-CVRzSJIltzMG5FcidsW0jKNQnNRYC8bT21VegyMMtHmhW3UOI7knmUehzswXLrExDLE6lQCZdrhD4ogI7c+vuw==} 360 | 361 | '@vue/language-core@2.0.19': 362 | resolution: {integrity: sha512-A9EGOnvb51jOvnCYoRLnMP+CcoPlbZVxI9gZXE/y2GksRWM6j/PrLEIC++pnosWTN08tFpJgxhSS//E9v/Sg+Q==} 363 | peerDependencies: 364 | typescript: '*' 365 | peerDependenciesMeta: 366 | typescript: 367 | optional: true 368 | 369 | '@vue/reactivity@3.4.27': 370 | resolution: {integrity: sha512-kK0g4NknW6JX2yySLpsm2jlunZJl2/RJGZ0H9ddHdfBVHcNzxmQ0sS0b09ipmBoQpY8JM2KmUw+a6sO8Zo+zIA==} 371 | 372 | '@vue/runtime-core@3.4.27': 373 | resolution: {integrity: sha512-7aYA9GEbOOdviqVvcuweTLe5Za4qBZkUY7SvET6vE8kyypxVgaT1ixHLg4urtOlrApdgcdgHoTZCUuTGap/5WA==} 374 | 375 | '@vue/runtime-dom@3.4.27': 376 | resolution: {integrity: sha512-ScOmP70/3NPM+TW9hvVAz6VWWtZJqkbdf7w6ySsws+EsqtHvkhxaWLecrTorFxsawelM5Ys9FnDEMt6BPBDS0Q==} 377 | 378 | '@vue/server-renderer@3.4.27': 379 | resolution: {integrity: sha512-dlAMEuvmeA3rJsOMJ2J1kXU7o7pOxgsNHVr9K8hB3ImIkSuBrIdy0vF66h8gf8Tuinf1TK3mPAz2+2sqyf3KzA==} 380 | peerDependencies: 381 | vue: 3.4.27 382 | 383 | '@vue/shared@3.4.27': 384 | resolution: {integrity: sha512-DL3NmY2OFlqmYYrzp39yi3LDkKxa5vZVwxWdQ3rG0ekuWscHraeIbnI8t+aZK7qhYqEqWKTUdijadunb9pnrgA==} 385 | 386 | abbrev@1.1.1: 387 | resolution: {integrity: sha512-nne9/IiQ/hzIhY6pdDnbBtz7DjPTKrY00P/zvPSm5pOFkl6xuGrGnXn/VtTNNfNtAfZ9/1RtehkszU9qcTii0Q==} 388 | 389 | agent-base@6.0.2: 390 | resolution: {integrity: sha512-RZNwNclF7+MS/8bDg70amg32dyeZGZxiDuQmZxKLAlQjr3jGyLx+4Kkk58UO7D2QdgFIQCovuSuZESne6RG6XQ==} 391 | engines: {node: '>= 6.0.0'} 392 | 393 | ansi-regex@5.0.1: 394 | resolution: {integrity: sha512-quJQXlTSUGL2LH9SUXo8VwsY4soanhgo6LNSm84E1LBcE8s3O0wpdiRzyR9z/ZZJMlMWv37qOOb9pdJlMUEKFQ==} 395 | engines: {node: '>=8'} 396 | 397 | ant-design-vue@4.2.6: 398 | resolution: {integrity: sha512-t7eX13Yj3i9+i5g9lqFyYneoIb3OzTvQjq9Tts1i+eiOd3Eva/6GagxBSXM1fOCjqemIu0FYVE1ByZ/38epR3Q==} 399 | engines: {node: '>=12.22.0'} 400 | peerDependencies: 401 | vue: '>=3.2.0' 402 | 403 | anymatch@3.1.3: 404 | resolution: {integrity: sha512-KMReFUr0B4t+D+OBkjR3KYqvocp2XaSzO55UcB6mgQMd3KbcE+mWTyvVV7D/zsdEbNnV6acZUutkiHQXvTr1Rw==} 405 | engines: {node: '>= 8'} 406 | 407 | aproba@2.0.0: 408 | resolution: {integrity: sha512-lYe4Gx7QT+MKGbDsA+Z+he/Wtef0BiwDOlK/XkBrdfsh9J/jPPXbX0tE9x9cl27Tmu5gg3QUbUrQYa/y+KOHPQ==} 409 | 410 | are-we-there-yet@2.0.0: 411 | resolution: {integrity: sha512-Ci/qENmwHnsYo9xKIcUJN5LeDKdJ6R1Z1j9V/J5wyq8nh/mYPEpIKJbBZXtZjG04HiK7zV/p6Vs9952MrMeUIw==} 412 | engines: {node: '>=10'} 413 | deprecated: This package is no longer supported. 414 | 415 | array-tree-filter@2.1.0: 416 | resolution: {integrity: sha512-4ROwICNlNw/Hqa9v+rk5h22KjmzB1JGTMVKP2AKJBOCgb0yL0ASf0+YvCcLNNwquOHNX48jkeZIJ3a+oOQqKcw==} 417 | 418 | async-validator@4.2.5: 419 | resolution: {integrity: sha512-7HhHjtERjqlNbZtqNqy2rckN/SpOOlmDliet+lP7k+eKZEjPk3DgyeU9lIXLdeLz0uBbbVp+9Qdow9wJWgwwfg==} 420 | 421 | balanced-match@1.0.2: 422 | resolution: {integrity: sha512-3oSeUO0TMV67hN1AmbXsK4yaqU7tjiHlbxRDZOpH0KW9+CeX4bRAaX0Anxt0tx2MrpRpWwQaPwIlISEJhYU5Pw==} 423 | 424 | binary-extensions@2.3.0: 425 | resolution: {integrity: sha512-Ceh+7ox5qe7LJuLHoY0feh3pHuUDHAcRUeyL2VYghZwfpkNIy/+8Ocg0a3UuSoYzavmylwuLWQOf3hl0jjMMIw==} 426 | engines: {node: '>=8'} 427 | 428 | brace-expansion@1.1.11: 429 | resolution: {integrity: sha512-iCuPHDFgrHX7H2vEI/5xpz07zSHB00TpugqhmYtVmMO6518mCuRMoOYFldEBl0g187ufozdaHgWKcYFb61qGiA==} 430 | 431 | brace-expansion@2.0.1: 432 | resolution: {integrity: sha512-XnAIvQ8eM+kC6aULx6wuQiwVsnzsi9d3WxzV3FpWTGA19F621kwdbsAcFKXgKUHZWsy+mY6iL1sHTxWEFCytDA==} 433 | 434 | braces@3.0.3: 435 | resolution: {integrity: sha512-yQbXgO/OSZVD2IsiLlro+7Hf6Q18EJrKSEsdoMzKePKXct3gvD8oLcOQdIzGupr5Fj+EDe8gO/lxc1BzfMpxvA==} 436 | engines: {node: '>=8'} 437 | 438 | canvas@2.11.2: 439 | resolution: {integrity: sha512-ItanGBMrmRV7Py2Z+Xhs7cT+FNt5K0vPL4p9EZ/UX/Mu7hFbkxSjKF2KVtPwX7UYWp7dRKnrTvReflgrItJbdw==} 440 | engines: {node: '>=6'} 441 | 442 | chokidar@3.6.0: 443 | resolution: {integrity: sha512-7VT13fmjotKpGipCW9JEQAusEPE+Ei8nl6/g4FBAmIm0GOOLMua9NDDo/DWp0ZAxCr3cPq5ZpBqmPAQgDda2Pw==} 444 | engines: {node: '>= 8.10.0'} 445 | 446 | chownr@2.0.0: 447 | resolution: {integrity: sha512-bIomtDF5KGpdogkLd9VspvFzk9KfpyyGlS8YFVZl7TGPBHL5snIOnxeshwVgPteQ9b4Eydl+pVbIyE1DcvCWgQ==} 448 | engines: {node: '>=10'} 449 | 450 | color-support@1.1.3: 451 | resolution: {integrity: sha512-qiBjkpbMLO/HL68y+lh4q0/O1MZFj2RX6X/KmMa3+gJD3z+WwI1ZzDHysvqHGS3mP6mznPckpXmw1nI9cJjyRg==} 452 | hasBin: true 453 | 454 | compute-scroll-into-view@1.0.20: 455 | resolution: {integrity: sha512-UCB0ioiyj8CRjtrvaceBLqqhZCVP+1B8+NWQhmdsm0VXOJtobBCf1dBQmebCCo34qZmUwZfIH2MZLqNHazrfjg==} 456 | 457 | computeds@0.0.1: 458 | resolution: {integrity: sha512-7CEBgcMjVmitjYo5q8JTJVra6X5mQ20uTThdK+0kR7UEaDrAWEQcRiBtWJzga4eRpP6afNwwLsX2SET2JhVB1Q==} 459 | 460 | concat-map@0.0.1: 461 | resolution: {integrity: sha512-/Srv4dswyQNBfohGpz9o6Yb3Gz3SrUDqBH5rTuhGR7ahtlbYKnVxw2bCFMRljaA7EXHaXZ8wsHdodFvbkhKmqg==} 462 | 463 | console-control-strings@1.1.0: 464 | resolution: {integrity: sha512-ty/fTekppD2fIwRvnZAVdeOiGd1c7YXEixbgJTNzqcxJWKQnjJ/V1bNEEE6hygpM3WjwHFUVK6HTjWSzV4a8sQ==} 465 | 466 | core-js@3.40.0: 467 | resolution: {integrity: sha512-7vsMc/Lty6AGnn7uFpYT56QesI5D2Y/UkgKounk87OP9Z2H9Z8kj6jzcSGAxFmUtDOS0ntK6lbQz+Nsa0Jj6mQ==} 468 | 469 | csstype@3.1.3: 470 | resolution: {integrity: sha512-M1uQkMl8rQK/szD0LNhtqxIPLpimGm8sOBwU7lLnCpSbTyY3yeU1Vc7l4KT5zT4s/yOxHH5O7tIuuLOCnLADRw==} 471 | 472 | dayjs@1.11.13: 473 | resolution: {integrity: sha512-oaMBel6gjolK862uaPQOVTA7q3TZhuSvuMQAAglQDOWYO9A91IrAOUJEyKVlqJlHE0vq5p5UXxzdPfMH/x6xNg==} 474 | 475 | de-indent@1.0.2: 476 | resolution: {integrity: sha512-e/1zu3xH5MQryN2zdVaF0OrdNLUbvWxzMbi+iNA6Bky7l1RoP8a2fIbRocyHclXt/arDrrR6lL3TqFD9pMQTsg==} 477 | 478 | debug@4.4.0: 479 | resolution: {integrity: sha512-6WTZ/IxCY/T6BALoZHaE4ctp9xm+Z5kY/pzYaCHRFeyVhojxlrm+46y68HA6hr0TcwEssoxNiDEUJQjfPZ/RYA==} 480 | engines: {node: '>=6.0'} 481 | peerDependencies: 482 | supports-color: '*' 483 | peerDependenciesMeta: 484 | supports-color: 485 | optional: true 486 | 487 | decompress-response@4.2.1: 488 | resolution: {integrity: sha512-jOSne2qbyE+/r8G1VU+G/82LBs2Fs4LAsTiLSHOCOMZQl2OKZ6i8i4IyHemTe+/yIXOtTcRQMzPcgyhoFlqPkw==} 489 | engines: {node: '>=8'} 490 | 491 | delegates@1.0.0: 492 | resolution: {integrity: sha512-bd2L678uiWATM6m5Z1VzNCErI3jiGzt6HGY8OVICs40JQq/HALfbyNJmp0UDakEY4pMMaN0Ly5om/B1VI/+xfQ==} 493 | 494 | detect-libc@2.0.3: 495 | resolution: {integrity: sha512-bwy0MGW55bG41VqxxypOsdSdGqLwXPI/focwgTYCFMbdUiBAxLg9CFzG08sz2aqzknwiX7Hkl0bQENjg8iLByw==} 496 | engines: {node: '>=8'} 497 | 498 | dom-align@1.12.4: 499 | resolution: {integrity: sha512-R8LUSEay/68zE5c8/3BDxiTEvgb4xZTF0RKmAHfiEVN3klfIpXfi2/QCoiWPccVQ0J/ZGdz9OjzL4uJEP/MRAw==} 500 | 501 | dom-scroll-into-view@2.0.1: 502 | resolution: {integrity: sha512-bvVTQe1lfaUr1oFzZX80ce9KLDlZ3iU+XGNE/bz9HnGdklTieqsbmsLHe+rT2XWqopvL0PckkYqN7ksmm5pe3w==} 503 | 504 | emoji-regex@8.0.0: 505 | resolution: {integrity: sha512-MSjYzcWNOA0ewAHpz0MxpYFvwg6yjy1NG3xteoqz644VCo/RPgnr1/GGt+ic3iJTzQ8Eu3TdM14SawnVUmGE6A==} 506 | 507 | entities@4.5.0: 508 | resolution: {integrity: sha512-V0hjH4dGPh9Ao5p0MoRY6BVqtwCjhz6vI5LT8AJ55H+4g9/4vbHx1I54fS0XuclLhDHArPQCiMjDxjaL8fPxhw==} 509 | engines: {node: '>=0.12'} 510 | 511 | esbuild@0.20.2: 512 | resolution: {integrity: sha512-WdOOppmUNU+IbZ0PaDiTst80zjnrOkyJNHoKupIcVyU8Lvla3Ugx94VzkQ32Ijqd7UhHJy75gNWDMUekcrSJ6g==} 513 | engines: {node: '>=12'} 514 | hasBin: true 515 | 516 | estree-walker@2.0.2: 517 | resolution: {integrity: sha512-Rfkk/Mp/DL7JVje3u18FxFujQlTNR2q6QfMSMB7AvCBx91NGj/ba3kCfza0f6dVDbw7YlRf/nDrn7pQrCCyQ/w==} 518 | 519 | fast-glob@3.3.2: 520 | resolution: {integrity: sha512-oX2ruAFQwf/Orj8m737Y5adxDQO0LAB7/S5MnxCdTNDd4p6BsyIVsv9JQsATbTSq8KHRpLwIHbVlUNatxd+1Ow==} 521 | engines: {node: '>=8.6.0'} 522 | 523 | fastq@1.17.1: 524 | resolution: {integrity: sha512-sRVD3lWVIXWg6By68ZN7vho9a1pQcN/WBFaAAsDDFzlJjvoGx0P8z7V1t72grFJfJhu3YPZBuu25f7Kaw2jN1w==} 525 | 526 | fill-range@7.1.1: 527 | resolution: {integrity: sha512-YsGpe3WHLK8ZYi4tWDg2Jy3ebRz2rXowDxnld4bkQB00cc/1Zw9AWnC0i9ztDJitivtQvaI9KaLyKrc+hBW0yg==} 528 | engines: {node: '>=8'} 529 | 530 | fs-extra@11.2.0: 531 | resolution: {integrity: sha512-PmDi3uwK5nFuXh7XDTlVnS17xJS7vW36is2+w3xcv8SVxiB4NyATf4ctkVY5bkSjX0Y4nbvZCq1/EjtEyr9ktw==} 532 | engines: {node: '>=14.14'} 533 | 534 | fs-minipass@2.1.0: 535 | resolution: {integrity: sha512-V/JgOLFCS+R6Vcq0slCuaeWEdNC3ouDlJMNIsacH2VtALiu9mV4LPrHc5cDl8k5aw6J8jwgWWpiTo5RYhmIzvg==} 536 | engines: {node: '>= 8'} 537 | 538 | fs.realpath@1.0.0: 539 | resolution: {integrity: sha512-OO0pH2lK6a0hZnAdau5ItzHPI6pUlvI7jMVnxUQRtw4owF2wk8lOSabtGDCTP4Ggrg2MbGnWO9X8K1t4+fGMDw==} 540 | 541 | fsevents@2.3.3: 542 | resolution: {integrity: sha512-5xoDfX+fL7faATnagmWPpbFtwh/R77WmMMqqHGS65C3vvB0YHrgF+B1YmZ3441tMj5n63k0212XNoJwzlhffQw==} 543 | engines: {node: ^8.16.0 || ^10.6.0 || >=11.0.0} 544 | os: [darwin] 545 | 546 | gauge@3.0.2: 547 | resolution: {integrity: sha512-+5J6MS/5XksCuXq++uFRsnUd7Ovu1XenbeuIuNRJxYWjgQbPuFhT14lAvsWfqfAmnwluf1OwMjz39HjfLPci0Q==} 548 | engines: {node: '>=10'} 549 | deprecated: This package is no longer supported. 550 | 551 | glob-parent@5.1.2: 552 | resolution: {integrity: sha512-AOIgSQCepiJYwP3ARnGx+5VnTu2HBYdzbGP45eLw1vr3zB3vZLeyed1sC9hnbcOc9/SrMyM5RPQrkGz4aS9Zow==} 553 | engines: {node: '>= 6'} 554 | 555 | glob@7.2.3: 556 | resolution: {integrity: sha512-nFR0zLpU2YCaRxwoCJvL6UvCH2JFyFVIvwTLsIf21AuHlMskA1hhTdk+LlYJtOlYt9v6dvszD2BGRqBL+iQK9Q==} 557 | deprecated: Glob versions prior to v9 are no longer supported 558 | 559 | graceful-fs@4.2.11: 560 | resolution: {integrity: sha512-RbJ5/jmFcNNCcDV5o9eTnBLJ/HszWV0P73bc+Ff4nS/rJj+YaS6IGyiOL0VoBYX+l1Wrl3k63h/KrH+nhJ0XvQ==} 561 | 562 | has-unicode@2.0.1: 563 | resolution: {integrity: sha512-8Rf9Y83NBReMnx0gFzA8JImQACstCYWUplepDa9xprwwtmgEZUF0h/i5xSA625zB/I37EtrswSST6OXxwaaIJQ==} 564 | 565 | he@1.2.0: 566 | resolution: {integrity: sha512-F/1DnUGPopORZi0ni+CvrCgHQ5FyEAHRLSApuYWMmrbSwoN2Mn/7k+Gl38gJnR7yyDZk6WLXwiGod1JOWNDKGw==} 567 | hasBin: true 568 | 569 | https-proxy-agent@5.0.1: 570 | resolution: {integrity: sha512-dFcAjpTQFgoLMzC2VwU+C/CbS7uRL0lWmxDITmqm7C+7F0Odmj6s9l6alZc6AELXhrnggM2CeWSXHGOdX2YtwA==} 571 | engines: {node: '>= 6'} 572 | 573 | inflight@1.0.6: 574 | resolution: {integrity: sha512-k92I/b08q4wvFscXCLvqfsHCrjrF7yiXsQuIVvVE7N82W3+aqpzuUdBbfhWcy/FZR3/4IgflMgKLOsvPDrGCJA==} 575 | deprecated: This module is not supported, and leaks memory. Do not use it. Check out lru-cache if you want a good and tested way to coalesce async requests by a key value, which is much more comprehensive and powerful. 576 | 577 | inherits@2.0.4: 578 | resolution: {integrity: sha512-k/vGaX4/Yla3WzyMCvTQOXYeIHvqOKtnqBduzTHpzpQZzAskKMhZ2K+EnBiSM9zGSoIFeMpXKxa4dYeZIQqewQ==} 579 | 580 | is-binary-path@2.1.0: 581 | resolution: {integrity: sha512-ZMERYes6pDydyuGidse7OsHxtbI7WVeUEozgR/g7rd0xUimYNlvZRE/K2MgZTjWy725IfelLeVcEM97mmtRGXw==} 582 | engines: {node: '>=8'} 583 | 584 | is-extglob@2.1.1: 585 | resolution: {integrity: sha512-SbKbANkN603Vi4jEZv49LeVJMn4yGwsbzZworEoyEiutsN3nJYdbO36zfhGJ6QEDpOZIFkDtnq5JRxmvl3jsoQ==} 586 | engines: {node: '>=0.10.0'} 587 | 588 | is-fullwidth-code-point@3.0.0: 589 | resolution: {integrity: sha512-zymm5+u+sCsSWyD9qNaejV3DFvhCKclKdizYaJUuHA83RLjb7nSuGnddCHGv0hk+KY7BMAlsWeK4Ueg6EV6XQg==} 590 | engines: {node: '>=8'} 591 | 592 | is-glob@4.0.3: 593 | resolution: {integrity: sha512-xelSayHH36ZgE7ZWhli7pW34hNbNl8Ojv5KVmkJD4hBdD3th8Tfk9vYasLM+mXWOZhFkgZfxhLSnrwRr4elSSg==} 594 | engines: {node: '>=0.10.0'} 595 | 596 | is-number@7.0.0: 597 | resolution: {integrity: sha512-41Cifkg6e8TylSpdtTpeLVMqvSBEVzTttHvERD741+pnZ8ANv0004MRL43QKPDlK9cGvNp6NZWZUBlbGXYxxng==} 598 | engines: {node: '>=0.12.0'} 599 | 600 | is-plain-object@3.0.1: 601 | resolution: {integrity: sha512-Xnpx182SBMrr/aBik8y+GuR4U1L9FqMSojwDQwPMmxyC6bvEqly9UBCxhauBF5vNh2gwWJNX6oDV7O+OM4z34g==} 602 | engines: {node: '>=0.10.0'} 603 | 604 | js-tokens@4.0.0: 605 | resolution: {integrity: sha512-RdJUflcE3cUzKiMqQgsCu06FPu9UdIJO0beYbPhHN4k6apgJtifcoCtT9bcxOpYBtpD2kCM6Sbzg4CausW/PKQ==} 606 | 607 | jsonfile@6.1.0: 608 | resolution: {integrity: sha512-5dgndWOriYSm5cnYaJNhalLNDKOqFwyDB/rr1E9ZsGciGvKPs8R2xYGCacuf3z6K1YKDz182fd+fY3cn3pMqXQ==} 609 | 610 | lodash-es@4.17.21: 611 | resolution: {integrity: sha512-mKnC+QJ9pWVzv+C4/U3rRsHapFfHvQFoFB92e52xeyGMcX6/OlIl78je1u8vePzYZSkkogMPJ2yjxxsb89cxyw==} 612 | 613 | lodash@4.17.21: 614 | resolution: {integrity: sha512-v2kDEe57lecTulaDIuNTPy3Ry4gLGJ6Z1O3vE1krgXZNrsQ+LFTGHVxVjcXPs17LhbZVGedAJv8XZ1tvj5FvSg==} 615 | 616 | loose-envify@1.4.0: 617 | resolution: {integrity: sha512-lyuxPGr/Wfhrlem2CL/UcnUc1zcqKAImBDzukY7Y5F/yQiNdko6+fRLevlw1HgMySw7f611UIY408EtxRSoK3Q==} 618 | hasBin: true 619 | 620 | magic-string@0.30.10: 621 | resolution: {integrity: sha512-iIRwTIf0QKV3UAnYK4PU8uiEc4SRh5jX0mwpIwETPpHdhVM4f53RSwS/vXvN1JhGX+Cs7B8qIq3d6AH49O5fAQ==} 622 | 623 | make-dir@3.1.0: 624 | resolution: {integrity: sha512-g3FeP20LNwhALb/6Cz6Dd4F2ngze0jz7tbzrD2wAV+o9FeNHe4rL+yK2md0J/fiSf1sa1ADhXqi5+oVwOM/eGw==} 625 | engines: {node: '>=8'} 626 | 627 | merge2@1.4.1: 628 | resolution: {integrity: sha512-8q7VEgMJW4J8tcfVPy8g09NcQwZdbwFEqhe/WZkoIzjn/3TGDwtOCYtXGxA3O8tPzpczCCDgv+P2P5y00ZJOOg==} 629 | engines: {node: '>= 8'} 630 | 631 | micromatch@4.0.7: 632 | resolution: {integrity: sha512-LPP/3KorzCwBxfeUuZmaR6bG2kdeHSbe0P2tY3FLRU4vYrjYz5hI4QZwV0njUx3jeuKe67YukQ1LSPZBKDqO/Q==} 633 | engines: {node: '>=8.6'} 634 | 635 | mimic-response@2.1.0: 636 | resolution: {integrity: sha512-wXqjST+SLt7R009ySCglWBCFpjUygmCIfD790/kVbiGmUgfYGuB14PiTd5DwVxSV4NcYHjzMkoj5LjQZwTQLEA==} 637 | engines: {node: '>=8'} 638 | 639 | minimatch@3.1.2: 640 | resolution: {integrity: sha512-J7p63hRiAjw1NDEww1W7i37+ByIrOWO5XQQAzZ3VOcL0PNybwpfmV/N05zFAzwQ9USyEcX6t3UO+K5aqBQOIHw==} 641 | 642 | minimatch@9.0.4: 643 | resolution: {integrity: sha512-KqWh+VchfxcMNRAJjj2tnsSJdNbHsVgnkBhTNrW7AjVo6OvLtxw8zfT9oLw1JSohlFzJ8jCoTgaoXvJ+kHt6fw==} 644 | engines: {node: '>=16 || 14 >=14.17'} 645 | 646 | minipass@3.3.6: 647 | resolution: {integrity: sha512-DxiNidxSEK+tHG6zOIklvNOwm3hvCrbUrdtzY74U6HKTJxvIDfOUL5W5P2Ghd3DTkhhKPYGqeNUIh5qcM4YBfw==} 648 | engines: {node: '>=8'} 649 | 650 | minipass@5.0.0: 651 | resolution: {integrity: sha512-3FnjYuehv9k6ovOEbyOswadCDPX1piCfhV8ncmYtHOjuPwylVWsghTLo7rabjC3Rx5xD4HDx8Wm1xnMF7S5qFQ==} 652 | engines: {node: '>=8'} 653 | 654 | minizlib@2.1.2: 655 | resolution: {integrity: sha512-bAxsR8BVfj60DWXHE3u30oHzfl4G7khkSuPW+qvpd7jFRHm7dLxOjUk1EHACJ/hxLY8phGJ0YhYHZo7jil7Qdg==} 656 | engines: {node: '>= 8'} 657 | 658 | mkdirp@1.0.4: 659 | resolution: {integrity: sha512-vVqVZQyf3WLx2Shd0qJ9xuvqgAyKPLAiqITEtqW0oIUjzo3PePDd6fW9iFz30ef7Ysp/oiWqbhszeGWW2T6Gzw==} 660 | engines: {node: '>=10'} 661 | hasBin: true 662 | 663 | ms@2.1.3: 664 | resolution: {integrity: sha512-6FlzubTLZG3J2a/NVCAleEhjzq5oxgHyaCU9yYXvcLsvoVaHJq/s5xXI6/XXP6tz7R9xAOtHnSO/tXtF3WRTlA==} 665 | 666 | muggle-string@0.4.1: 667 | resolution: {integrity: sha512-VNTrAak/KhO2i8dqqnqnAHOa3cYBwXEZe9h+D5h/1ZqFSTEFHdM65lR7RoIqq3tBBYavsOXV84NoHXZ0AkPyqQ==} 668 | 669 | nan@2.22.2: 670 | resolution: {integrity: sha512-DANghxFkS1plDdRsX0X9pm0Z6SJNN6gBdtXfanwoZ8hooC5gosGFSBGRYHUVPz1asKA/kMRqDRdHrluZ61SpBQ==} 671 | 672 | nanoid@3.3.7: 673 | resolution: {integrity: sha512-eSRppjcPIatRIMC1U6UngP8XFcz8MQWGQdt1MTBQ7NaAmvXDfvNxbvWV3x2y6CdEUciCSsDHDQZbhYaB8QEo2g==} 674 | engines: {node: ^10 || ^12 || ^13.7 || ^14 || >=15.0.1} 675 | hasBin: true 676 | 677 | nanopop@2.4.2: 678 | resolution: {integrity: sha512-NzOgmMQ+elxxHeIha+OG/Pv3Oc3p4RU2aBhwWwAqDpXrdTbtRylbRLQztLy8dMMwfl6pclznBdfUhccEn9ZIzw==} 679 | 680 | node-fetch@2.7.0: 681 | resolution: {integrity: sha512-c4FRfUm/dbcWZ7U+1Wq0AwCyFL+3nt2bEw05wfxSz+DWpWsitgmSgYmy2dQdWyKC1694ELPqMs/YzUSNozLt8A==} 682 | engines: {node: 4.x || >=6.0.0} 683 | peerDependencies: 684 | encoding: ^0.1.0 685 | peerDependenciesMeta: 686 | encoding: 687 | optional: true 688 | 689 | nopt@5.0.0: 690 | resolution: {integrity: sha512-Tbj67rffqceeLpcRXrT7vKAN8CwfPeIBgM7E6iBkmKLV7bEMwpGgYLGv0jACUsECaa/vuxP0IjEont6umdMgtQ==} 691 | engines: {node: '>=6'} 692 | hasBin: true 693 | 694 | normalize-path@3.0.0: 695 | resolution: {integrity: sha512-6eZs5Ls3WtCisHWp9S2GUy8dqkpGi4BVSz3GaqiE6ezub0512ESztXUwUB6C6IKbQkY2Pnb/mD4WYojCRwcwLA==} 696 | engines: {node: '>=0.10.0'} 697 | 698 | npmlog@5.0.1: 699 | resolution: {integrity: sha512-AqZtDUWOMKs1G/8lwylVjrdYgqA4d9nu8hc+0gzRxlDb1I10+FHBGMXs6aiQHFdCUUlqH99MUMuLfzWDNDtfxw==} 700 | deprecated: This package is no longer supported. 701 | 702 | object-assign@4.1.1: 703 | resolution: {integrity: sha512-rJgTQnkUnH1sFw8yT6VSU3zD3sWmu6sZhIseY8VX+GRu3P6F7Fu+JNDoXfklElbLJSnc3FUQHVe4cU5hj+BcUg==} 704 | engines: {node: '>=0.10.0'} 705 | 706 | once@1.4.0: 707 | resolution: {integrity: sha512-lNaJgI+2Q5URQBkccEKHTQOPaXdUxnZZElQTZY0MFUAuaEqe1E+Nyvgdz/aIyNi6Z9MzO5dv1H8n58/GELp3+w==} 708 | 709 | path-browserify@1.0.1: 710 | resolution: {integrity: sha512-b7uo2UCUOYZcnF/3ID0lulOJi/bafxa1xPe7ZPsammBSpjSWQkjNxlt635YGS2MiR9GjvuXCtz2emr3jbsz98g==} 711 | 712 | path-is-absolute@1.0.1: 713 | resolution: {integrity: sha512-AVbw3UJ2e9bq64vSaS9Am0fje1Pa8pbGqTTsmXfaIiMpnr5DlDhfJOuLj9Sf95ZPVDAUerDfEk88MPmPe7UCQg==} 714 | engines: {node: '>=0.10.0'} 715 | 716 | path2d-polyfill@2.0.1: 717 | resolution: {integrity: sha512-ad/3bsalbbWhmBo0D6FZ4RNMwsLsPpL6gnvhuSaU5Vm7b06Kr5ubSltQQ0T7YKsiJQO+g22zJ4dJKNTXIyOXtA==} 718 | engines: {node: '>=8'} 719 | 720 | pdfjs-dist@3.4.120: 721 | resolution: {integrity: sha512-B1hw9ilLG4m/jNeFA0C2A0PZydjxslP8ylU+I4XM7Bzh/xWETo9EiBV848lh0O0hLut7T6lK1V7cpAXv5BhxWw==} 722 | 723 | picocolors@1.0.1: 724 | resolution: {integrity: sha512-anP1Z8qwhkbmu7MFP5iTt+wQKXgwzf7zTyGlcdzabySa9vd0Xt392U0rVmz9poOaBj0uHJKyyo9/upk0HrEQew==} 725 | 726 | picomatch@2.3.1: 727 | resolution: {integrity: sha512-JU3teHTNjmE2VCGFzuY8EXzCDVwEqB2a8fsIvwaStHhAWJEeVd1o1QD80CU6+ZdEXXSLbSsuLwJjkCBWqRQUVA==} 728 | engines: {node: '>=8.6'} 729 | 730 | postcss@8.4.38: 731 | resolution: {integrity: sha512-Wglpdk03BSfXkHoQa3b/oulrotAkwrlLDRSOb9D0bN86FdRyE9lppSp33aHNPgBa0JKCoB+drFLZkQoRRYae5A==} 732 | engines: {node: ^10 || ^12 || >=14} 733 | 734 | queue-microtask@1.2.3: 735 | resolution: {integrity: sha512-NuaNSa6flKT5JaSYQzJok04JzTL1CA6aGhv5rfLW3PgqA+M2ChpZQnAC8h8i4ZFkBS8X5RqkDBHA7r4hej3K9A==} 736 | 737 | readable-stream@3.6.2: 738 | resolution: {integrity: sha512-9u/sniCrY3D5WdsERHzHE4G2YCXqoG5FTHUiCC4SIbr6XcLZBY05ya9EKjYek9O5xOAwjGq+1JdGBAS7Q9ScoA==} 739 | engines: {node: '>= 6'} 740 | 741 | readdirp@3.6.0: 742 | resolution: {integrity: sha512-hOS089on8RduqdbhvQ5Z37A0ESjsqz6qnRcffsMU3495FuTdqSm+7bhJ29JvIOsBDEEnan5DPu9t3To9VRlMzA==} 743 | engines: {node: '>=8.10.0'} 744 | 745 | regenerator-runtime@0.14.1: 746 | resolution: {integrity: sha512-dYnhHh0nJoMfnkZs6GmmhFknAGRrLznOu5nc9ML+EJxGvrx6H7teuevqVqCuPcPK//3eDrrjQhehXVx9cnkGdw==} 747 | 748 | resize-observer-polyfill@1.5.1: 749 | resolution: {integrity: sha512-LwZrotdHOo12nQuZlHEmtuXdqGoOD0OhaxopaNFxWzInpEgaLWoVuAMbTzixuosCx2nEG58ngzW3vxdWoxIgdg==} 750 | 751 | reusify@1.0.4: 752 | resolution: {integrity: sha512-U9nH88a3fc/ekCF1l0/UP1IosiuIjyTh7hBvXVMHYgVcfGvt897Xguj2UOLDeI5BG2m7/uwyaLVT6fbtCwTyzw==} 753 | engines: {iojs: '>=1.0.0', node: '>=0.10.0'} 754 | 755 | rimraf@3.0.2: 756 | resolution: {integrity: sha512-JZkJMZkAGFFPP2YqXZXPbMlMBgsxzE8ILs4lMIX/2o0L9UBw9O/Y3o6wFw/i9YLapcUJWwqbi3kdxIPdC62TIA==} 757 | deprecated: Rimraf versions prior to v4 are no longer supported 758 | hasBin: true 759 | 760 | rollup@4.18.0: 761 | resolution: {integrity: sha512-QmJz14PX3rzbJCN1SG4Xe/bAAX2a6NpCP8ab2vfu2GiUr8AQcr2nCV/oEO3yneFarB67zk8ShlIyWb2LGTb3Sg==} 762 | engines: {node: '>=18.0.0', npm: '>=8.0.0'} 763 | hasBin: true 764 | 765 | run-parallel@1.2.0: 766 | resolution: {integrity: sha512-5l4VyZR86LZ/lDxZTR6jqL8AFE2S0IFLMP26AbjsLVADxHdhB/c0GUsH+y39UfCi3dzz8OlQuPmnaJOMoDHQBA==} 767 | 768 | safe-buffer@5.2.1: 769 | resolution: {integrity: sha512-rp3So07KcdmmKbGvgaNxQSJr7bGVSVk5S9Eq1F+ppbRo70+YeaDxkw5Dd8NPN+GD6bjnYm2VuPuCXmpuYvmCXQ==} 770 | 771 | scroll-into-view-if-needed@2.2.31: 772 | resolution: {integrity: sha512-dGCXy99wZQivjmjIqihaBQNjryrz5rueJY7eHfTdyWEiR4ttYpsajb14rn9s5d4DY4EcY6+4+U/maARBXJedkA==} 773 | 774 | semver@6.3.1: 775 | resolution: {integrity: sha512-BR7VvDCVHO+q2xBEWskxS6DJE1qRnb7DxzUrogb71CWoSficBxYsiAGd+Kl0mmq/MprG9yArRkyrQxTO6XjMzA==} 776 | hasBin: true 777 | 778 | semver@7.6.2: 779 | resolution: {integrity: sha512-FNAIBWCx9qcRhoHcgcJ0gvU7SN1lYU2ZXuSfl04bSC5OpvDHFyJCjdNHomPXxjQlCBU67YW64PzY7/VIEH7F2w==} 780 | engines: {node: '>=10'} 781 | hasBin: true 782 | 783 | set-blocking@2.0.0: 784 | resolution: {integrity: sha512-KiKBS8AnWGEyLzofFfmvKwpdPzqiy16LvQfK3yv/fVH7Bj13/wl3JSR1J+rfgRE9q7xUJK4qvgS8raSOeLUehw==} 785 | 786 | shallow-equal@1.2.1: 787 | resolution: {integrity: sha512-S4vJDjHHMBaiZuT9NPb616CSmLf618jawtv3sufLl6ivK8WocjAo58cXwbRV1cgqxH0Qbv+iUt6m05eqEa2IRA==} 788 | 789 | signal-exit@3.0.7: 790 | resolution: {integrity: sha512-wnD2ZE+l+SPC/uoS0vXeE9L1+0wuaMqKlfz9AMUo38JsyLSBWSFcHR1Rri62LZc12vLr1gb3jl7iwQhgwpAbGQ==} 791 | 792 | simple-concat@1.0.1: 793 | resolution: {integrity: sha512-cSFtAPtRhljv69IK0hTVZQ+OfE9nePi/rtJmw5UjHeVyVroEqJXP1sFztKUy1qU+xvz3u/sfYJLa947b7nAN2Q==} 794 | 795 | simple-get@3.1.1: 796 | resolution: {integrity: sha512-CQ5LTKGfCpvE1K0n2us+kuMPbk/q0EKl82s4aheV9oXjFEz6W/Y7oQFVJuU6QG77hRT4Ghb5RURteF5vnWjupA==} 797 | 798 | source-map-js@1.2.0: 799 | resolution: {integrity: sha512-itJW8lvSA0TXEphiRoawsCksnlf8SyvmFzIhltqAHluXd88pkCd+cXJVHTDwdCr0IzwptSm035IHQktUu1QUMg==} 800 | engines: {node: '>=0.10.0'} 801 | 802 | string-width@4.2.3: 803 | resolution: {integrity: sha512-wKyQRQpjJ0sIp62ErSZdGsjMJWsap5oRNihHhu6G7JVO/9jIB6UyevL+tXuOqrng8j/cxKTWyWUwvSTriiZz/g==} 804 | engines: {node: '>=8'} 805 | 806 | string_decoder@1.3.0: 807 | resolution: {integrity: sha512-hkRX8U1WjJFd8LsDJ2yQ/wWWxaopEsABU1XfkM8A+j0+85JAGppt16cr1Whg6KIbb4okU6Mql6BOj+uup/wKeA==} 808 | 809 | strip-ansi@6.0.1: 810 | resolution: {integrity: sha512-Y38VPSHcqkFrCpFnQ9vuSXmquuv5oXOKpGeT6aGrr3o3Gc9AlVa6JBfUSOCnbxGGZF+/0ooI7KrPuUSztUdU5A==} 811 | engines: {node: '>=8'} 812 | 813 | stylis@4.3.6: 814 | resolution: {integrity: sha512-yQ3rwFWRfwNUY7H5vpU0wfdkNSnvnJinhF9830Swlaxl03zsOjCfmX0ugac+3LtK0lYSgwL/KXc8oYL3mG4YFQ==} 815 | 816 | tar@6.2.1: 817 | resolution: {integrity: sha512-DZ4yORTwrbTj/7MZYq2w+/ZFdI6OZ/f9SFHR+71gIVUZhOQPHzVCLpvRnPgyaMpfWxxk/4ONva3GQSyNIKRv6A==} 818 | engines: {node: '>=10'} 819 | 820 | throttle-debounce@5.0.2: 821 | resolution: {integrity: sha512-B71/4oyj61iNH0KeCamLuE2rmKuTO5byTOSVwECM5FA7TiAiAW+UqTKZ9ERueC4qvgSttUhdmq1mXC3kJqGX7A==} 822 | engines: {node: '>=12.22'} 823 | 824 | to-fast-properties@2.0.0: 825 | resolution: {integrity: sha512-/OaKK0xYrs3DmxRYqL/yDc+FxFUVYhDlXMhRmv3z915w2HF1tnN1omB354j8VUGO/hbRzyD6Y3sA7v7GS/ceog==} 826 | engines: {node: '>=4'} 827 | 828 | to-regex-range@5.0.1: 829 | resolution: {integrity: sha512-65P7iz6X5yEr1cwcgvQxbbIw7Uk3gOy5dIdtZ4rDveLqhrdJP+Li/Hx6tyK0NEb+2GCyneCMJiGqrADCSNk8sQ==} 830 | engines: {node: '>=8.0'} 831 | 832 | tr46@0.0.3: 833 | resolution: {integrity: sha512-N3WMsuqV66lT30CrXNbEjx4GEwlow3v6rr4mCcv6prnfwhS01rkgyFdjPNBYd9br7LpXV1+Emh01fHnq2Gdgrw==} 834 | 835 | typescript@5.4.5: 836 | resolution: {integrity: sha512-vcI4UpRgg81oIRUFwR0WSIHKt11nJ7SAVlYNIu+QpqeyXP+gpQJy/Z4+F0aGxSE4MqwjyXvW/TzgkLAx2AGHwQ==} 837 | engines: {node: '>=14.17'} 838 | hasBin: true 839 | 840 | undici-types@5.26.5: 841 | resolution: {integrity: sha512-JlCMO+ehdEIKqlFxk6IfVoAUVmgz7cU7zD/h9XZ0qzeosSHmUJVOzSQvvYSYWXkFXC+IfLKSIffhv0sVZup6pA==} 842 | 843 | universalify@2.0.1: 844 | resolution: {integrity: sha512-gptHNQghINnc/vTGIk0SOFGFNXw7JVrlRUtConJRlvaw6DuX0wO5Jeko9sWrMBhh+PsYAZ7oXAiOnf/UKogyiw==} 845 | engines: {node: '>= 10.0.0'} 846 | 847 | util-deprecate@1.0.2: 848 | resolution: {integrity: sha512-EPD5q1uXyFxJpCrLnCc1nHnq3gOa6DZBocAIiI2TaSCA7VCJ1UJDMagCzIkXNsUYfD1daK//LTEQ8xiIbrHtcw==} 849 | 850 | vite-plugin-static-copy@1.0.6: 851 | resolution: {integrity: sha512-3uSvsMwDVFZRitqoWHj0t4137Kz7UynnJeq1EZlRW7e25h2068fyIZX4ORCCOAkfp1FklGxJNVJBkBOD+PZIew==} 852 | engines: {node: ^18.0.0 || >=20.0.0} 853 | peerDependencies: 854 | vite: ^5.0.0 855 | 856 | vite@5.2.11: 857 | resolution: {integrity: sha512-HndV31LWW05i1BLPMUCE1B9E9GFbOu1MbenhS58FuK6owSO5qHm7GiCotrNY1YE5rMeQSFBGmT5ZaLEjFizgiQ==} 858 | engines: {node: ^18.0.0 || >=20.0.0} 859 | hasBin: true 860 | peerDependencies: 861 | '@types/node': ^18.0.0 || >=20.0.0 862 | less: '*' 863 | lightningcss: ^1.21.0 864 | sass: '*' 865 | stylus: '*' 866 | sugarss: '*' 867 | terser: ^5.4.0 868 | peerDependenciesMeta: 869 | '@types/node': 870 | optional: true 871 | less: 872 | optional: true 873 | lightningcss: 874 | optional: true 875 | sass: 876 | optional: true 877 | stylus: 878 | optional: true 879 | sugarss: 880 | optional: true 881 | terser: 882 | optional: true 883 | 884 | vue-template-compiler@2.7.16: 885 | resolution: {integrity: sha512-AYbUWAJHLGGQM7+cNTELw+KsOG9nl2CnSv467WobS5Cv9uk3wFcnr1Etsz2sEIHEZvw1U+o9mRlEO6QbZvUPGQ==} 886 | 887 | vue-tsc@2.0.19: 888 | resolution: {integrity: sha512-JWay5Zt2/871iodGF72cELIbcAoPyhJxq56mPPh+M2K7IwI688FMrFKc/+DvB05wDWEuCPexQJ6L10zSwzzapg==} 889 | hasBin: true 890 | peerDependencies: 891 | typescript: '*' 892 | 893 | vue-types@3.0.2: 894 | resolution: {integrity: sha512-IwUC0Aq2zwaXqy74h4WCvFCUtoV0iSWr0snWnE9TnU18S66GAQyqQbRf2qfJtUuiFsBf6qp0MEwdonlwznlcrw==} 895 | engines: {node: '>=10.15.0'} 896 | peerDependencies: 897 | vue: ^3.0.0 898 | 899 | vue@3.4.27: 900 | resolution: {integrity: sha512-8s/56uK6r01r1icG/aEOHqyMVxd1bkYcSe9j8HcKtr/xTOFWvnzIVTehNW+5Yt89f+DLBe4A569pnZLS5HzAMA==} 901 | peerDependencies: 902 | typescript: '*' 903 | peerDependenciesMeta: 904 | typescript: 905 | optional: true 906 | 907 | warning@4.0.3: 908 | resolution: {integrity: sha512-rpJyN222KWIvHJ/F53XSZv0Zl/accqHR8et1kpaMTD/fLCRxtV8iX8czMzY7sVZupTI3zcUTg8eycS2kNF9l6w==} 909 | 910 | web-streams-polyfill@3.3.3: 911 | resolution: {integrity: sha512-d2JWLCivmZYTSIoge9MsgFCZrt571BikcWGYkjC1khllbTeDlGqZ2D8vD8E/lJa8WGWbb7Plm8/XJYV7IJHZZw==} 912 | engines: {node: '>= 8'} 913 | 914 | webidl-conversions@3.0.1: 915 | resolution: {integrity: sha512-2JAn3z8AR6rjK8Sm8orRC0h/bcl/DqL7tRPdGZ4I1CjdF+EaMLmYxBHyXuKL849eucPFhvBoxMsflfOb8kxaeQ==} 916 | 917 | whatwg-url@5.0.0: 918 | resolution: {integrity: sha512-saE57nupxk6v3HY35+jzBwYa0rKSy0XR8JSxZPwgLr7ys0IBzhGviA1/TUGJLmSVqs8pb9AnvICXEuOHLprYTw==} 919 | 920 | wide-align@1.1.5: 921 | resolution: {integrity: sha512-eDMORYaPNZ4sQIuuYPDHdQvf4gyCF9rEEV/yPxGfwPkRodwEgiMUUXTx/dex+Me0wxx53S+NgUHaP7y3MGlDmg==} 922 | 923 | wrappy@1.0.2: 924 | resolution: {integrity: sha512-l4Sp/DRseor9wL6EvV2+TuQn63dMkPjZ/sp9XkghTEbV9KlPS1xUsZ3u7/IQO4wxtcFB4bgpQPRcR3QCvezPcQ==} 925 | 926 | yallist@4.0.0: 927 | resolution: {integrity: sha512-3wdGidZyq5PB084XLES5TpOSRA3wjXAlIWMhum2kRcv/41Sn2emQ0dycQW4uZXLejwKvg6EsvbdlVL+FYEct7A==} 928 | 929 | snapshots: 930 | 931 | '@ant-design/colors@6.0.0': 932 | dependencies: 933 | '@ctrl/tinycolor': 3.6.1 934 | 935 | '@ant-design/icons-svg@4.4.2': {} 936 | 937 | '@ant-design/icons-vue@7.0.1(vue@3.4.27(typescript@5.4.5))': 938 | dependencies: 939 | '@ant-design/colors': 6.0.0 940 | '@ant-design/icons-svg': 4.4.2 941 | vue: 3.4.27(typescript@5.4.5) 942 | 943 | '@babel/helper-string-parser@7.24.6': {} 944 | 945 | '@babel/helper-validator-identifier@7.24.6': {} 946 | 947 | '@babel/parser@7.24.6': 948 | dependencies: 949 | '@babel/types': 7.24.6 950 | 951 | '@babel/runtime@7.26.7': 952 | dependencies: 953 | regenerator-runtime: 0.14.1 954 | 955 | '@babel/types@7.24.6': 956 | dependencies: 957 | '@babel/helper-string-parser': 7.24.6 958 | '@babel/helper-validator-identifier': 7.24.6 959 | to-fast-properties: 2.0.0 960 | 961 | '@ctrl/tinycolor@3.6.1': {} 962 | 963 | '@emotion/hash@0.9.2': {} 964 | 965 | '@emotion/unitless@0.8.1': {} 966 | 967 | '@esbuild/aix-ppc64@0.20.2': 968 | optional: true 969 | 970 | '@esbuild/android-arm64@0.20.2': 971 | optional: true 972 | 973 | '@esbuild/android-arm@0.20.2': 974 | optional: true 975 | 976 | '@esbuild/android-x64@0.20.2': 977 | optional: true 978 | 979 | '@esbuild/darwin-arm64@0.20.2': 980 | optional: true 981 | 982 | '@esbuild/darwin-x64@0.20.2': 983 | optional: true 984 | 985 | '@esbuild/freebsd-arm64@0.20.2': 986 | optional: true 987 | 988 | '@esbuild/freebsd-x64@0.20.2': 989 | optional: true 990 | 991 | '@esbuild/linux-arm64@0.20.2': 992 | optional: true 993 | 994 | '@esbuild/linux-arm@0.20.2': 995 | optional: true 996 | 997 | '@esbuild/linux-ia32@0.20.2': 998 | optional: true 999 | 1000 | '@esbuild/linux-loong64@0.20.2': 1001 | optional: true 1002 | 1003 | '@esbuild/linux-mips64el@0.20.2': 1004 | optional: true 1005 | 1006 | '@esbuild/linux-ppc64@0.20.2': 1007 | optional: true 1008 | 1009 | '@esbuild/linux-riscv64@0.20.2': 1010 | optional: true 1011 | 1012 | '@esbuild/linux-s390x@0.20.2': 1013 | optional: true 1014 | 1015 | '@esbuild/linux-x64@0.20.2': 1016 | optional: true 1017 | 1018 | '@esbuild/netbsd-x64@0.20.2': 1019 | optional: true 1020 | 1021 | '@esbuild/openbsd-x64@0.20.2': 1022 | optional: true 1023 | 1024 | '@esbuild/sunos-x64@0.20.2': 1025 | optional: true 1026 | 1027 | '@esbuild/win32-arm64@0.20.2': 1028 | optional: true 1029 | 1030 | '@esbuild/win32-ia32@0.20.2': 1031 | optional: true 1032 | 1033 | '@esbuild/win32-x64@0.20.2': 1034 | optional: true 1035 | 1036 | '@jridgewell/sourcemap-codec@1.4.15': {} 1037 | 1038 | '@mapbox/node-pre-gyp@1.0.11': 1039 | dependencies: 1040 | detect-libc: 2.0.3 1041 | https-proxy-agent: 5.0.1 1042 | make-dir: 3.1.0 1043 | node-fetch: 2.7.0 1044 | nopt: 5.0.0 1045 | npmlog: 5.0.1 1046 | rimraf: 3.0.2 1047 | semver: 7.6.2 1048 | tar: 6.2.1 1049 | transitivePeerDependencies: 1050 | - encoding 1051 | - supports-color 1052 | optional: true 1053 | 1054 | '@nodelib/fs.scandir@2.1.5': 1055 | dependencies: 1056 | '@nodelib/fs.stat': 2.0.5 1057 | run-parallel: 1.2.0 1058 | 1059 | '@nodelib/fs.stat@2.0.5': {} 1060 | 1061 | '@nodelib/fs.walk@1.2.8': 1062 | dependencies: 1063 | '@nodelib/fs.scandir': 2.1.5 1064 | fastq: 1.17.1 1065 | 1066 | '@rollup/rollup-android-arm-eabi@4.18.0': 1067 | optional: true 1068 | 1069 | '@rollup/rollup-android-arm64@4.18.0': 1070 | optional: true 1071 | 1072 | '@rollup/rollup-darwin-arm64@4.18.0': 1073 | optional: true 1074 | 1075 | '@rollup/rollup-darwin-x64@4.18.0': 1076 | optional: true 1077 | 1078 | '@rollup/rollup-linux-arm-gnueabihf@4.18.0': 1079 | optional: true 1080 | 1081 | '@rollup/rollup-linux-arm-musleabihf@4.18.0': 1082 | optional: true 1083 | 1084 | '@rollup/rollup-linux-arm64-gnu@4.18.0': 1085 | optional: true 1086 | 1087 | '@rollup/rollup-linux-arm64-musl@4.18.0': 1088 | optional: true 1089 | 1090 | '@rollup/rollup-linux-powerpc64le-gnu@4.18.0': 1091 | optional: true 1092 | 1093 | '@rollup/rollup-linux-riscv64-gnu@4.18.0': 1094 | optional: true 1095 | 1096 | '@rollup/rollup-linux-s390x-gnu@4.18.0': 1097 | optional: true 1098 | 1099 | '@rollup/rollup-linux-x64-gnu@4.18.0': 1100 | optional: true 1101 | 1102 | '@rollup/rollup-linux-x64-musl@4.18.0': 1103 | optional: true 1104 | 1105 | '@rollup/rollup-win32-arm64-msvc@4.18.0': 1106 | optional: true 1107 | 1108 | '@rollup/rollup-win32-ia32-msvc@4.18.0': 1109 | optional: true 1110 | 1111 | '@rollup/rollup-win32-x64-msvc@4.18.0': 1112 | optional: true 1113 | 1114 | '@simonwep/pickr@1.8.2': 1115 | dependencies: 1116 | core-js: 3.40.0 1117 | nanopop: 2.4.2 1118 | 1119 | '@types/estree@1.0.5': {} 1120 | 1121 | '@types/node@20.14.9': 1122 | dependencies: 1123 | undici-types: 5.26.5 1124 | 1125 | '@vitejs/plugin-vue@5.0.4(vite@5.2.11(@types/node@20.14.9))(vue@3.4.27(typescript@5.4.5))': 1126 | dependencies: 1127 | vite: 5.2.11(@types/node@20.14.9) 1128 | vue: 3.4.27(typescript@5.4.5) 1129 | 1130 | '@volar/language-core@2.2.5': 1131 | dependencies: 1132 | '@volar/source-map': 2.2.5 1133 | 1134 | '@volar/source-map@2.2.5': 1135 | dependencies: 1136 | muggle-string: 0.4.1 1137 | 1138 | '@volar/typescript@2.2.5': 1139 | dependencies: 1140 | '@volar/language-core': 2.2.5 1141 | path-browserify: 1.0.1 1142 | 1143 | '@vue/compiler-core@3.4.27': 1144 | dependencies: 1145 | '@babel/parser': 7.24.6 1146 | '@vue/shared': 3.4.27 1147 | entities: 4.5.0 1148 | estree-walker: 2.0.2 1149 | source-map-js: 1.2.0 1150 | 1151 | '@vue/compiler-dom@3.4.27': 1152 | dependencies: 1153 | '@vue/compiler-core': 3.4.27 1154 | '@vue/shared': 3.4.27 1155 | 1156 | '@vue/compiler-sfc@3.4.27': 1157 | dependencies: 1158 | '@babel/parser': 7.24.6 1159 | '@vue/compiler-core': 3.4.27 1160 | '@vue/compiler-dom': 3.4.27 1161 | '@vue/compiler-ssr': 3.4.27 1162 | '@vue/shared': 3.4.27 1163 | estree-walker: 2.0.2 1164 | magic-string: 0.30.10 1165 | postcss: 8.4.38 1166 | source-map-js: 1.2.0 1167 | 1168 | '@vue/compiler-ssr@3.4.27': 1169 | dependencies: 1170 | '@vue/compiler-dom': 3.4.27 1171 | '@vue/shared': 3.4.27 1172 | 1173 | '@vue/language-core@2.0.19(typescript@5.4.5)': 1174 | dependencies: 1175 | '@volar/language-core': 2.2.5 1176 | '@vue/compiler-dom': 3.4.27 1177 | '@vue/shared': 3.4.27 1178 | computeds: 0.0.1 1179 | minimatch: 9.0.4 1180 | path-browserify: 1.0.1 1181 | vue-template-compiler: 2.7.16 1182 | optionalDependencies: 1183 | typescript: 5.4.5 1184 | 1185 | '@vue/reactivity@3.4.27': 1186 | dependencies: 1187 | '@vue/shared': 3.4.27 1188 | 1189 | '@vue/runtime-core@3.4.27': 1190 | dependencies: 1191 | '@vue/reactivity': 3.4.27 1192 | '@vue/shared': 3.4.27 1193 | 1194 | '@vue/runtime-dom@3.4.27': 1195 | dependencies: 1196 | '@vue/runtime-core': 3.4.27 1197 | '@vue/shared': 3.4.27 1198 | csstype: 3.1.3 1199 | 1200 | '@vue/server-renderer@3.4.27(vue@3.4.27(typescript@5.4.5))': 1201 | dependencies: 1202 | '@vue/compiler-ssr': 3.4.27 1203 | '@vue/shared': 3.4.27 1204 | vue: 3.4.27(typescript@5.4.5) 1205 | 1206 | '@vue/shared@3.4.27': {} 1207 | 1208 | abbrev@1.1.1: 1209 | optional: true 1210 | 1211 | agent-base@6.0.2: 1212 | dependencies: 1213 | debug: 4.4.0 1214 | transitivePeerDependencies: 1215 | - supports-color 1216 | optional: true 1217 | 1218 | ansi-regex@5.0.1: 1219 | optional: true 1220 | 1221 | ant-design-vue@4.2.6(vue@3.4.27(typescript@5.4.5)): 1222 | dependencies: 1223 | '@ant-design/colors': 6.0.0 1224 | '@ant-design/icons-vue': 7.0.1(vue@3.4.27(typescript@5.4.5)) 1225 | '@babel/runtime': 7.26.7 1226 | '@ctrl/tinycolor': 3.6.1 1227 | '@emotion/hash': 0.9.2 1228 | '@emotion/unitless': 0.8.1 1229 | '@simonwep/pickr': 1.8.2 1230 | array-tree-filter: 2.1.0 1231 | async-validator: 4.2.5 1232 | csstype: 3.1.3 1233 | dayjs: 1.11.13 1234 | dom-align: 1.12.4 1235 | dom-scroll-into-view: 2.0.1 1236 | lodash: 4.17.21 1237 | lodash-es: 4.17.21 1238 | resize-observer-polyfill: 1.5.1 1239 | scroll-into-view-if-needed: 2.2.31 1240 | shallow-equal: 1.2.1 1241 | stylis: 4.3.6 1242 | throttle-debounce: 5.0.2 1243 | vue: 3.4.27(typescript@5.4.5) 1244 | vue-types: 3.0.2(vue@3.4.27(typescript@5.4.5)) 1245 | warning: 4.0.3 1246 | 1247 | anymatch@3.1.3: 1248 | dependencies: 1249 | normalize-path: 3.0.0 1250 | picomatch: 2.3.1 1251 | 1252 | aproba@2.0.0: 1253 | optional: true 1254 | 1255 | are-we-there-yet@2.0.0: 1256 | dependencies: 1257 | delegates: 1.0.0 1258 | readable-stream: 3.6.2 1259 | optional: true 1260 | 1261 | array-tree-filter@2.1.0: {} 1262 | 1263 | async-validator@4.2.5: {} 1264 | 1265 | balanced-match@1.0.2: {} 1266 | 1267 | binary-extensions@2.3.0: {} 1268 | 1269 | brace-expansion@1.1.11: 1270 | dependencies: 1271 | balanced-match: 1.0.2 1272 | concat-map: 0.0.1 1273 | optional: true 1274 | 1275 | brace-expansion@2.0.1: 1276 | dependencies: 1277 | balanced-match: 1.0.2 1278 | 1279 | braces@3.0.3: 1280 | dependencies: 1281 | fill-range: 7.1.1 1282 | 1283 | canvas@2.11.2: 1284 | dependencies: 1285 | '@mapbox/node-pre-gyp': 1.0.11 1286 | nan: 2.22.2 1287 | simple-get: 3.1.1 1288 | transitivePeerDependencies: 1289 | - encoding 1290 | - supports-color 1291 | optional: true 1292 | 1293 | chokidar@3.6.0: 1294 | dependencies: 1295 | anymatch: 3.1.3 1296 | braces: 3.0.3 1297 | glob-parent: 5.1.2 1298 | is-binary-path: 2.1.0 1299 | is-glob: 4.0.3 1300 | normalize-path: 3.0.0 1301 | readdirp: 3.6.0 1302 | optionalDependencies: 1303 | fsevents: 2.3.3 1304 | 1305 | chownr@2.0.0: 1306 | optional: true 1307 | 1308 | color-support@1.1.3: 1309 | optional: true 1310 | 1311 | compute-scroll-into-view@1.0.20: {} 1312 | 1313 | computeds@0.0.1: {} 1314 | 1315 | concat-map@0.0.1: 1316 | optional: true 1317 | 1318 | console-control-strings@1.1.0: 1319 | optional: true 1320 | 1321 | core-js@3.40.0: {} 1322 | 1323 | csstype@3.1.3: {} 1324 | 1325 | dayjs@1.11.13: {} 1326 | 1327 | de-indent@1.0.2: {} 1328 | 1329 | debug@4.4.0: 1330 | dependencies: 1331 | ms: 2.1.3 1332 | optional: true 1333 | 1334 | decompress-response@4.2.1: 1335 | dependencies: 1336 | mimic-response: 2.1.0 1337 | optional: true 1338 | 1339 | delegates@1.0.0: 1340 | optional: true 1341 | 1342 | detect-libc@2.0.3: 1343 | optional: true 1344 | 1345 | dom-align@1.12.4: {} 1346 | 1347 | dom-scroll-into-view@2.0.1: {} 1348 | 1349 | emoji-regex@8.0.0: 1350 | optional: true 1351 | 1352 | entities@4.5.0: {} 1353 | 1354 | esbuild@0.20.2: 1355 | optionalDependencies: 1356 | '@esbuild/aix-ppc64': 0.20.2 1357 | '@esbuild/android-arm': 0.20.2 1358 | '@esbuild/android-arm64': 0.20.2 1359 | '@esbuild/android-x64': 0.20.2 1360 | '@esbuild/darwin-arm64': 0.20.2 1361 | '@esbuild/darwin-x64': 0.20.2 1362 | '@esbuild/freebsd-arm64': 0.20.2 1363 | '@esbuild/freebsd-x64': 0.20.2 1364 | '@esbuild/linux-arm': 0.20.2 1365 | '@esbuild/linux-arm64': 0.20.2 1366 | '@esbuild/linux-ia32': 0.20.2 1367 | '@esbuild/linux-loong64': 0.20.2 1368 | '@esbuild/linux-mips64el': 0.20.2 1369 | '@esbuild/linux-ppc64': 0.20.2 1370 | '@esbuild/linux-riscv64': 0.20.2 1371 | '@esbuild/linux-s390x': 0.20.2 1372 | '@esbuild/linux-x64': 0.20.2 1373 | '@esbuild/netbsd-x64': 0.20.2 1374 | '@esbuild/openbsd-x64': 0.20.2 1375 | '@esbuild/sunos-x64': 0.20.2 1376 | '@esbuild/win32-arm64': 0.20.2 1377 | '@esbuild/win32-ia32': 0.20.2 1378 | '@esbuild/win32-x64': 0.20.2 1379 | 1380 | estree-walker@2.0.2: {} 1381 | 1382 | fast-glob@3.3.2: 1383 | dependencies: 1384 | '@nodelib/fs.stat': 2.0.5 1385 | '@nodelib/fs.walk': 1.2.8 1386 | glob-parent: 5.1.2 1387 | merge2: 1.4.1 1388 | micromatch: 4.0.7 1389 | 1390 | fastq@1.17.1: 1391 | dependencies: 1392 | reusify: 1.0.4 1393 | 1394 | fill-range@7.1.1: 1395 | dependencies: 1396 | to-regex-range: 5.0.1 1397 | 1398 | fs-extra@11.2.0: 1399 | dependencies: 1400 | graceful-fs: 4.2.11 1401 | jsonfile: 6.1.0 1402 | universalify: 2.0.1 1403 | 1404 | fs-minipass@2.1.0: 1405 | dependencies: 1406 | minipass: 3.3.6 1407 | optional: true 1408 | 1409 | fs.realpath@1.0.0: 1410 | optional: true 1411 | 1412 | fsevents@2.3.3: 1413 | optional: true 1414 | 1415 | gauge@3.0.2: 1416 | dependencies: 1417 | aproba: 2.0.0 1418 | color-support: 1.1.3 1419 | console-control-strings: 1.1.0 1420 | has-unicode: 2.0.1 1421 | object-assign: 4.1.1 1422 | signal-exit: 3.0.7 1423 | string-width: 4.2.3 1424 | strip-ansi: 6.0.1 1425 | wide-align: 1.1.5 1426 | optional: true 1427 | 1428 | glob-parent@5.1.2: 1429 | dependencies: 1430 | is-glob: 4.0.3 1431 | 1432 | glob@7.2.3: 1433 | dependencies: 1434 | fs.realpath: 1.0.0 1435 | inflight: 1.0.6 1436 | inherits: 2.0.4 1437 | minimatch: 3.1.2 1438 | once: 1.4.0 1439 | path-is-absolute: 1.0.1 1440 | optional: true 1441 | 1442 | graceful-fs@4.2.11: {} 1443 | 1444 | has-unicode@2.0.1: 1445 | optional: true 1446 | 1447 | he@1.2.0: {} 1448 | 1449 | https-proxy-agent@5.0.1: 1450 | dependencies: 1451 | agent-base: 6.0.2 1452 | debug: 4.4.0 1453 | transitivePeerDependencies: 1454 | - supports-color 1455 | optional: true 1456 | 1457 | inflight@1.0.6: 1458 | dependencies: 1459 | once: 1.4.0 1460 | wrappy: 1.0.2 1461 | optional: true 1462 | 1463 | inherits@2.0.4: 1464 | optional: true 1465 | 1466 | is-binary-path@2.1.0: 1467 | dependencies: 1468 | binary-extensions: 2.3.0 1469 | 1470 | is-extglob@2.1.1: {} 1471 | 1472 | is-fullwidth-code-point@3.0.0: 1473 | optional: true 1474 | 1475 | is-glob@4.0.3: 1476 | dependencies: 1477 | is-extglob: 2.1.1 1478 | 1479 | is-number@7.0.0: {} 1480 | 1481 | is-plain-object@3.0.1: {} 1482 | 1483 | js-tokens@4.0.0: {} 1484 | 1485 | jsonfile@6.1.0: 1486 | dependencies: 1487 | universalify: 2.0.1 1488 | optionalDependencies: 1489 | graceful-fs: 4.2.11 1490 | 1491 | lodash-es@4.17.21: {} 1492 | 1493 | lodash@4.17.21: {} 1494 | 1495 | loose-envify@1.4.0: 1496 | dependencies: 1497 | js-tokens: 4.0.0 1498 | 1499 | magic-string@0.30.10: 1500 | dependencies: 1501 | '@jridgewell/sourcemap-codec': 1.4.15 1502 | 1503 | make-dir@3.1.0: 1504 | dependencies: 1505 | semver: 6.3.1 1506 | optional: true 1507 | 1508 | merge2@1.4.1: {} 1509 | 1510 | micromatch@4.0.7: 1511 | dependencies: 1512 | braces: 3.0.3 1513 | picomatch: 2.3.1 1514 | 1515 | mimic-response@2.1.0: 1516 | optional: true 1517 | 1518 | minimatch@3.1.2: 1519 | dependencies: 1520 | brace-expansion: 1.1.11 1521 | optional: true 1522 | 1523 | minimatch@9.0.4: 1524 | dependencies: 1525 | brace-expansion: 2.0.1 1526 | 1527 | minipass@3.3.6: 1528 | dependencies: 1529 | yallist: 4.0.0 1530 | optional: true 1531 | 1532 | minipass@5.0.0: 1533 | optional: true 1534 | 1535 | minizlib@2.1.2: 1536 | dependencies: 1537 | minipass: 3.3.6 1538 | yallist: 4.0.0 1539 | optional: true 1540 | 1541 | mkdirp@1.0.4: 1542 | optional: true 1543 | 1544 | ms@2.1.3: 1545 | optional: true 1546 | 1547 | muggle-string@0.4.1: {} 1548 | 1549 | nan@2.22.2: 1550 | optional: true 1551 | 1552 | nanoid@3.3.7: {} 1553 | 1554 | nanopop@2.4.2: {} 1555 | 1556 | node-fetch@2.7.0: 1557 | dependencies: 1558 | whatwg-url: 5.0.0 1559 | optional: true 1560 | 1561 | nopt@5.0.0: 1562 | dependencies: 1563 | abbrev: 1.1.1 1564 | optional: true 1565 | 1566 | normalize-path@3.0.0: {} 1567 | 1568 | npmlog@5.0.1: 1569 | dependencies: 1570 | are-we-there-yet: 2.0.0 1571 | console-control-strings: 1.1.0 1572 | gauge: 3.0.2 1573 | set-blocking: 2.0.0 1574 | optional: true 1575 | 1576 | object-assign@4.1.1: 1577 | optional: true 1578 | 1579 | once@1.4.0: 1580 | dependencies: 1581 | wrappy: 1.0.2 1582 | optional: true 1583 | 1584 | path-browserify@1.0.1: {} 1585 | 1586 | path-is-absolute@1.0.1: 1587 | optional: true 1588 | 1589 | path2d-polyfill@2.0.1: {} 1590 | 1591 | pdfjs-dist@3.4.120: 1592 | dependencies: 1593 | path2d-polyfill: 2.0.1 1594 | web-streams-polyfill: 3.3.3 1595 | optionalDependencies: 1596 | canvas: 2.11.2 1597 | transitivePeerDependencies: 1598 | - encoding 1599 | - supports-color 1600 | 1601 | picocolors@1.0.1: {} 1602 | 1603 | picomatch@2.3.1: {} 1604 | 1605 | postcss@8.4.38: 1606 | dependencies: 1607 | nanoid: 3.3.7 1608 | picocolors: 1.0.1 1609 | source-map-js: 1.2.0 1610 | 1611 | queue-microtask@1.2.3: {} 1612 | 1613 | readable-stream@3.6.2: 1614 | dependencies: 1615 | inherits: 2.0.4 1616 | string_decoder: 1.3.0 1617 | util-deprecate: 1.0.2 1618 | optional: true 1619 | 1620 | readdirp@3.6.0: 1621 | dependencies: 1622 | picomatch: 2.3.1 1623 | 1624 | regenerator-runtime@0.14.1: {} 1625 | 1626 | resize-observer-polyfill@1.5.1: {} 1627 | 1628 | reusify@1.0.4: {} 1629 | 1630 | rimraf@3.0.2: 1631 | dependencies: 1632 | glob: 7.2.3 1633 | optional: true 1634 | 1635 | rollup@4.18.0: 1636 | dependencies: 1637 | '@types/estree': 1.0.5 1638 | optionalDependencies: 1639 | '@rollup/rollup-android-arm-eabi': 4.18.0 1640 | '@rollup/rollup-android-arm64': 4.18.0 1641 | '@rollup/rollup-darwin-arm64': 4.18.0 1642 | '@rollup/rollup-darwin-x64': 4.18.0 1643 | '@rollup/rollup-linux-arm-gnueabihf': 4.18.0 1644 | '@rollup/rollup-linux-arm-musleabihf': 4.18.0 1645 | '@rollup/rollup-linux-arm64-gnu': 4.18.0 1646 | '@rollup/rollup-linux-arm64-musl': 4.18.0 1647 | '@rollup/rollup-linux-powerpc64le-gnu': 4.18.0 1648 | '@rollup/rollup-linux-riscv64-gnu': 4.18.0 1649 | '@rollup/rollup-linux-s390x-gnu': 4.18.0 1650 | '@rollup/rollup-linux-x64-gnu': 4.18.0 1651 | '@rollup/rollup-linux-x64-musl': 4.18.0 1652 | '@rollup/rollup-win32-arm64-msvc': 4.18.0 1653 | '@rollup/rollup-win32-ia32-msvc': 4.18.0 1654 | '@rollup/rollup-win32-x64-msvc': 4.18.0 1655 | fsevents: 2.3.3 1656 | 1657 | run-parallel@1.2.0: 1658 | dependencies: 1659 | queue-microtask: 1.2.3 1660 | 1661 | safe-buffer@5.2.1: 1662 | optional: true 1663 | 1664 | scroll-into-view-if-needed@2.2.31: 1665 | dependencies: 1666 | compute-scroll-into-view: 1.0.20 1667 | 1668 | semver@6.3.1: 1669 | optional: true 1670 | 1671 | semver@7.6.2: {} 1672 | 1673 | set-blocking@2.0.0: 1674 | optional: true 1675 | 1676 | shallow-equal@1.2.1: {} 1677 | 1678 | signal-exit@3.0.7: 1679 | optional: true 1680 | 1681 | simple-concat@1.0.1: 1682 | optional: true 1683 | 1684 | simple-get@3.1.1: 1685 | dependencies: 1686 | decompress-response: 4.2.1 1687 | once: 1.4.0 1688 | simple-concat: 1.0.1 1689 | optional: true 1690 | 1691 | source-map-js@1.2.0: {} 1692 | 1693 | string-width@4.2.3: 1694 | dependencies: 1695 | emoji-regex: 8.0.0 1696 | is-fullwidth-code-point: 3.0.0 1697 | strip-ansi: 6.0.1 1698 | optional: true 1699 | 1700 | string_decoder@1.3.0: 1701 | dependencies: 1702 | safe-buffer: 5.2.1 1703 | optional: true 1704 | 1705 | strip-ansi@6.0.1: 1706 | dependencies: 1707 | ansi-regex: 5.0.1 1708 | optional: true 1709 | 1710 | stylis@4.3.6: {} 1711 | 1712 | tar@6.2.1: 1713 | dependencies: 1714 | chownr: 2.0.0 1715 | fs-minipass: 2.1.0 1716 | minipass: 5.0.0 1717 | minizlib: 2.1.2 1718 | mkdirp: 1.0.4 1719 | yallist: 4.0.0 1720 | optional: true 1721 | 1722 | throttle-debounce@5.0.2: {} 1723 | 1724 | to-fast-properties@2.0.0: {} 1725 | 1726 | to-regex-range@5.0.1: 1727 | dependencies: 1728 | is-number: 7.0.0 1729 | 1730 | tr46@0.0.3: 1731 | optional: true 1732 | 1733 | typescript@5.4.5: {} 1734 | 1735 | undici-types@5.26.5: {} 1736 | 1737 | universalify@2.0.1: {} 1738 | 1739 | util-deprecate@1.0.2: 1740 | optional: true 1741 | 1742 | vite-plugin-static-copy@1.0.6(vite@5.2.11(@types/node@20.14.9)): 1743 | dependencies: 1744 | chokidar: 3.6.0 1745 | fast-glob: 3.3.2 1746 | fs-extra: 11.2.0 1747 | picocolors: 1.0.1 1748 | vite: 5.2.11(@types/node@20.14.9) 1749 | 1750 | vite@5.2.11(@types/node@20.14.9): 1751 | dependencies: 1752 | esbuild: 0.20.2 1753 | postcss: 8.4.38 1754 | rollup: 4.18.0 1755 | optionalDependencies: 1756 | '@types/node': 20.14.9 1757 | fsevents: 2.3.3 1758 | 1759 | vue-template-compiler@2.7.16: 1760 | dependencies: 1761 | de-indent: 1.0.2 1762 | he: 1.2.0 1763 | 1764 | vue-tsc@2.0.19(typescript@5.4.5): 1765 | dependencies: 1766 | '@volar/typescript': 2.2.5 1767 | '@vue/language-core': 2.0.19(typescript@5.4.5) 1768 | semver: 7.6.2 1769 | typescript: 5.4.5 1770 | 1771 | vue-types@3.0.2(vue@3.4.27(typescript@5.4.5)): 1772 | dependencies: 1773 | is-plain-object: 3.0.1 1774 | vue: 3.4.27(typescript@5.4.5) 1775 | 1776 | vue@3.4.27(typescript@5.4.5): 1777 | dependencies: 1778 | '@vue/compiler-dom': 3.4.27 1779 | '@vue/compiler-sfc': 3.4.27 1780 | '@vue/runtime-dom': 3.4.27 1781 | '@vue/server-renderer': 3.4.27(vue@3.4.27(typescript@5.4.5)) 1782 | '@vue/shared': 3.4.27 1783 | optionalDependencies: 1784 | typescript: 5.4.5 1785 | 1786 | warning@4.0.3: 1787 | dependencies: 1788 | loose-envify: 1.4.0 1789 | 1790 | web-streams-polyfill@3.3.3: {} 1791 | 1792 | webidl-conversions@3.0.1: 1793 | optional: true 1794 | 1795 | whatwg-url@5.0.0: 1796 | dependencies: 1797 | tr46: 0.0.3 1798 | webidl-conversions: 3.0.1 1799 | optional: true 1800 | 1801 | wide-align@1.1.5: 1802 | dependencies: 1803 | string-width: 4.2.3 1804 | optional: true 1805 | 1806 | wrappy@1.0.2: 1807 | optional: true 1808 | 1809 | yallist@4.0.0: 1810 | optional: true 1811 | -------------------------------------------------------------------------------- /public/vite.svg: -------------------------------------------------------------------------------- 1 | -------------------------------------------------------------------------------- /src/App.vue: -------------------------------------------------------------------------------- 1 | 6 | 146 | 147 | 154 | -------------------------------------------------------------------------------- /src/assets/1748352797096.pdf: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/wyaoting/sunsetglow-vue-pdf-viewer/b0d800ce668187b7a27b0966b13c572c413696e9/src/assets/1748352797096.pdf -------------------------------------------------------------------------------- /src/assets/Owners_Manual.pdf: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/wyaoting/sunsetglow-vue-pdf-viewer/b0d800ce668187b7a27b0966b13c572c413696e9/src/assets/Owners_Manual.pdf -------------------------------------------------------------------------------- /src/assets/demo.gif: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/wyaoting/sunsetglow-vue-pdf-viewer/b0d800ce668187b7a27b0966b13c572c413696e9/src/assets/demo.gif -------------------------------------------------------------------------------- /src/assets/test2.pdf: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/wyaoting/sunsetglow-vue-pdf-viewer/b0d800ce668187b7a27b0966b13c572c413696e9/src/assets/test2.pdf -------------------------------------------------------------------------------- /src/assets/vue.svg: -------------------------------------------------------------------------------- 1 | -------------------------------------------------------------------------------- /src/main.ts: -------------------------------------------------------------------------------- 1 | import { createApp } from "vue"; 2 | import "./style.css"; 3 | import App from "./App.vue"; 4 | 5 | const app = createApp(App); 6 | 7 | app.mount("#app"); 8 | -------------------------------------------------------------------------------- /src/style.css: -------------------------------------------------------------------------------- 1 | *{ 2 | margin: 0px; 3 | padding: 0px; 4 | } -------------------------------------------------------------------------------- /src/vite-env.d.ts: -------------------------------------------------------------------------------- 1 | /// -------------------------------------------------------------------------------- /tsconfig.json: -------------------------------------------------------------------------------- 1 | { 2 | "compilerOptions": { 3 | "target": "ES2020", 4 | "useDefineForClassFields": true, 5 | "module": "ESNext", 6 | "lib": ["ES2020", "DOM", "DOM.Iterable"], 7 | "skipLibCheck": true, 8 | 9 | /* Bundler mode */ 10 | "moduleResolution": "bundler", 11 | "allowImportingTsExtensions": true, 12 | "resolveJsonModule": true, 13 | "isolatedModules": true, 14 | "noEmit": true, 15 | "jsx": "preserve", 16 | 17 | /* Linting */ 18 | "strict": true, 19 | "noUnusedLocals": true, 20 | "noUnusedParameters": true, 21 | "noFallthroughCasesInSwitch": true 22 | }, 23 | "include": ["src/**/*.ts", "src/**/*.tsx", "src/**/*.vue"], 24 | "references": [{ "path": "./tsconfig.node.json" }] 25 | } 26 | -------------------------------------------------------------------------------- /tsconfig.node.json: -------------------------------------------------------------------------------- 1 | { 2 | "compilerOptions": { 3 | "composite": true, 4 | "skipLibCheck": true, 5 | "module": "ESNext", 6 | "moduleResolution": "bundler", 7 | "allowSyntheticDefaultImports": true, 8 | "strict": true 9 | }, 10 | "include": ["vite.config.ts"] 11 | } 12 | -------------------------------------------------------------------------------- /tsconfig.types.json: -------------------------------------------------------------------------------- 1 | { 2 | "compilerOptions": { 3 | "declaration": true /* 生成相关的 '.d.ts' 文件。 */, 4 | "declarationDir": "./dist/types" /* '.d.ts' 文件输出目录 */, 5 | "emitDeclarationOnly": true /* 只生成声明文件,不生成 js 文件*/, 6 | "rootDir": "./packages" /* 指定输出文件目录(用于输出),用于控制输出目录结构 */, 7 | "outDir": "./dist", 8 | "experimentalDecorators": true, 9 | "target": "es5", 10 | "lib": ["esnext", "dom", "dom.iterable"], 11 | "moduleResolution": "node", 12 | "skipLibCheck": true, 13 | "allowJs": true, 14 | "strict": false, 15 | "paths": { 16 | "@/*": [ 17 | "./*" 18 | ] 19 | } 20 | }, 21 | "include": [ 22 | "packages", 23 | "packages/env.d.ts", 24 | "packages/**/*.ts", 25 | "packages/**/*.vue" 26 | ], 27 | "exclude": ["node_modules"] 28 | } 29 | -------------------------------------------------------------------------------- /vite.config.ts: -------------------------------------------------------------------------------- 1 | import { defineConfig } from "vite"; 2 | import vue from "@vitejs/plugin-vue"; 3 | import { viteStaticCopy } from "vite-plugin-static-copy"; 4 | import { resolve } from "path"; 5 | // https://vitejs.dev/config/ 6 | export default defineConfig({ 7 | plugins: [ 8 | vue(), 9 | viteStaticCopy({ 10 | targets: [ 11 | { 12 | src: "./src/assets/pdf.worker.min.js", 13 | dest: "./libs", 14 | }, 15 | ], 16 | }), 17 | ], 18 | server: { 19 | host: "0.0.0.0", 20 | port: 3000, 21 | }, 22 | build: { 23 | // target: "esnext", 24 | outDir: "dist", 25 | lib: { 26 | entry: resolve(__dirname, "packages/index.ts"), 27 | name: "pdf-view", 28 | fileName: "pdf-view", 29 | formats: ["es", "umd"], 30 | }, 31 | rollupOptions: { 32 | // 确保外部化处理那些你不想打包进库的依赖 33 | external: ["vue", "vite-plugin-static-copy"], 34 | output: { 35 | // 在 UMD 构建模式下为这些外部化的依赖提供一个全局变量 36 | globals: { 37 | vue: "Vue", 38 | }, 39 | }, 40 | }, 41 | }, 42 | // esbuild: { 43 | // target: "es2022" 44 | // }, 45 | // optimizeDeps: { 46 | // esbuildOptions: { 47 | // target: 'es2022', 48 | // }, 49 | // }, 50 | }); 51 | --------------------------------------------------------------------------------