qidian-vue-ui 1.2.84 → 1.2.86

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (109) hide show
  1. package/dist/components/config-provider/index.d.ts +2 -2
  2. package/dist/components/index.d.ts +0 -2
  3. package/dist/components/office/pdf/hooks/useZoom.mjs +1 -2
  4. package/dist/components/office/pdf/hooks/useZoom.mjs.map +1 -1
  5. package/dist/components/office/pdf/index.vue.d.ts +3 -3
  6. package/dist/components/office/pdf/index.vue.mjs +1 -1
  7. package/dist/components/office/pdf/index.vue2.mjs +3 -3
  8. package/dist/components/office/pdf/index.vue2.mjs.map +1 -1
  9. package/dist/components/office/pdf/index2.css +21 -21
  10. package/dist/components/office/pdf/utils/image2pdf.mjs +1 -1
  11. package/dist/components/office/pdf/utils/image2pdf.mjs.map +1 -1
  12. package/dist/components/tinymce/config.mjs +0 -40
  13. package/dist/components/tinymce/config.mjs.map +1 -1
  14. package/dist/config-provider.d.ts +1 -0
  15. package/dist/config-provider.mjs +7 -0
  16. package/dist/config-provider.mjs.map +1 -0
  17. package/dist/icon.d.ts +1 -0
  18. package/dist/icon.mjs +5 -0
  19. package/dist/icon.mjs.map +1 -0
  20. package/dist/index.mjs +54 -58
  21. package/dist/index.mjs.map +1 -1
  22. package/dist/office.d.ts +1 -0
  23. package/dist/office.mjs +5 -0
  24. package/dist/office.mjs.map +1 -0
  25. package/dist/vue/qidian-vite-auto-import-resolver.cjs.js +3 -0
  26. package/dist/vue/qidian-vite-auto-import-resolver.cjs.js.map +1 -1
  27. package/dist/vue/qidian-vite-auto-import-resolver.es.js +3 -0
  28. package/dist/vue/qidian-vite-auto-import-resolver.es.js.map +1 -1
  29. package/package.json +15 -3
  30. package/dist/components/tinymce/lib/icons/default/icons.mjs +0 -183
  31. package/dist/components/tinymce/lib/icons/default/icons.mjs.map +0 -1
  32. package/dist/components/tinymce/lib/plugins/advlist/plugin.mjs +0 -241
  33. package/dist/components/tinymce/lib/plugins/advlist/plugin.mjs.map +0 -1
  34. package/dist/components/tinymce/lib/plugins/anchor/plugin.mjs +0 -194
  35. package/dist/components/tinymce/lib/plugins/anchor/plugin.mjs.map +0 -1
  36. package/dist/components/tinymce/lib/plugins/autolink/plugin.mjs +0 -196
  37. package/dist/components/tinymce/lib/plugins/autolink/plugin.mjs.map +0 -1
  38. package/dist/components/tinymce/lib/plugins/autoresize/plugin.mjs +0 -164
  39. package/dist/components/tinymce/lib/plugins/autoresize/plugin.mjs.map +0 -1
  40. package/dist/components/tinymce/lib/plugins/autosave/plugin.mjs +0 -188
  41. package/dist/components/tinymce/lib/plugins/autosave/plugin.mjs.map +0 -1
  42. package/dist/components/tinymce/lib/plugins/charmap/plugin.mjs +0 -1665
  43. package/dist/components/tinymce/lib/plugins/charmap/plugin.mjs.map +0 -1
  44. package/dist/components/tinymce/lib/plugins/code/plugin.mjs +0 -75
  45. package/dist/components/tinymce/lib/plugins/code/plugin.mjs.map +0 -1
  46. package/dist/components/tinymce/lib/plugins/codesample/plugin.mjs +0 -2434
  47. package/dist/components/tinymce/lib/plugins/codesample/plugin.mjs.map +0 -1
  48. package/dist/components/tinymce/lib/plugins/directionality/plugin.mjs +0 -418
  49. package/dist/components/tinymce/lib/plugins/directionality/plugin.mjs.map +0 -1
  50. package/dist/components/tinymce/lib/plugins/emoticons/plugin.mjs +0 -601
  51. package/dist/components/tinymce/lib/plugins/emoticons/plugin.mjs.map +0 -1
  52. package/dist/components/tinymce/lib/plugins/fullpage/plugin.mjs +0 -519
  53. package/dist/components/tinymce/lib/plugins/fullpage/plugin.mjs.map +0 -1
  54. package/dist/components/tinymce/lib/plugins/fullscreen/plugin.mjs +0 -1272
  55. package/dist/components/tinymce/lib/plugins/fullscreen/plugin.mjs.map +0 -1
  56. package/dist/components/tinymce/lib/plugins/hr/plugin.mjs +0 -31
  57. package/dist/components/tinymce/lib/plugins/hr/plugin.mjs.map +0 -1
  58. package/dist/components/tinymce/lib/plugins/image/plugin.mjs +0 -1598
  59. package/dist/components/tinymce/lib/plugins/image/plugin.mjs.map +0 -1
  60. package/dist/components/tinymce/lib/plugins/imagetools/plugin.mjs +0 -1480
  61. package/dist/components/tinymce/lib/plugins/imagetools/plugin.mjs.map +0 -1
  62. package/dist/components/tinymce/lib/plugins/importcss/plugin.mjs +0 -320
  63. package/dist/components/tinymce/lib/plugins/importcss/plugin.mjs.map +0 -1
  64. package/dist/components/tinymce/lib/plugins/insertdatetime/plugin.mjs +0 -164
  65. package/dist/components/tinymce/lib/plugins/insertdatetime/plugin.mjs.map +0 -1
  66. package/dist/components/tinymce/lib/plugins/link/plugin.mjs +0 -1250
  67. package/dist/components/tinymce/lib/plugins/link/plugin.mjs.map +0 -1
  68. package/dist/components/tinymce/lib/plugins/lists/plugin.mjs +0 -2214
  69. package/dist/components/tinymce/lib/plugins/lists/plugin.mjs.map +0 -1
  70. package/dist/components/tinymce/lib/plugins/media/plugin.mjs +0 -1324
  71. package/dist/components/tinymce/lib/plugins/media/plugin.mjs.map +0 -1
  72. package/dist/components/tinymce/lib/plugins/nonbreaking/plugin.mjs +0 -82
  73. package/dist/components/tinymce/lib/plugins/nonbreaking/plugin.mjs.map +0 -1
  74. package/dist/components/tinymce/lib/plugins/noneditable/plugin.mjs +0 -102
  75. package/dist/components/tinymce/lib/plugins/noneditable/plugin.mjs.map +0 -1
  76. package/dist/components/tinymce/lib/plugins/pagebreak/plugin.mjs +0 -86
  77. package/dist/components/tinymce/lib/plugins/pagebreak/plugin.mjs.map +0 -1
  78. package/dist/components/tinymce/lib/plugins/preview/plugin.mjs +0 -107
  79. package/dist/components/tinymce/lib/plugins/preview/plugin.mjs.map +0 -1
  80. package/dist/components/tinymce/lib/plugins/print/plugin.mjs +0 -37
  81. package/dist/components/tinymce/lib/plugins/print/plugin.mjs.map +0 -1
  82. package/dist/components/tinymce/lib/plugins/quickbars/plugin.mjs +0 -439
  83. package/dist/components/tinymce/lib/plugins/quickbars/plugin.mjs.map +0 -1
  84. package/dist/components/tinymce/lib/plugins/save/plugin.mjs +0 -102
  85. package/dist/components/tinymce/lib/plugins/save/plugin.mjs.map +0 -1
  86. package/dist/components/tinymce/lib/plugins/searchreplace/plugin.mjs +0 -1120
  87. package/dist/components/tinymce/lib/plugins/searchreplace/plugin.mjs.map +0 -1
  88. package/dist/components/tinymce/lib/plugins/spellchecker/plugin.mjs +0 -703
  89. package/dist/components/tinymce/lib/plugins/spellchecker/plugin.mjs.map +0 -1
  90. package/dist/components/tinymce/lib/plugins/tabfocus/plugin.mjs +0 -110
  91. package/dist/components/tinymce/lib/plugins/tabfocus/plugin.mjs.map +0 -1
  92. package/dist/components/tinymce/lib/plugins/table/plugin.mjs +0 -11243
  93. package/dist/components/tinymce/lib/plugins/table/plugin.mjs.map +0 -1
  94. package/dist/components/tinymce/lib/plugins/template/plugin.mjs +0 -562
  95. package/dist/components/tinymce/lib/plugins/template/plugin.mjs.map +0 -1
  96. package/dist/components/tinymce/lib/plugins/textcolor/plugin.mjs +0 -9
  97. package/dist/components/tinymce/lib/plugins/textcolor/plugin.mjs.map +0 -1
  98. package/dist/components/tinymce/lib/plugins/textpattern/plugin.mjs +0 -1330
  99. package/dist/components/tinymce/lib/plugins/textpattern/plugin.mjs.map +0 -1
  100. package/dist/components/tinymce/lib/plugins/toc/plugin.mjs +0 -217
  101. package/dist/components/tinymce/lib/plugins/toc/plugin.mjs.map +0 -1
  102. package/dist/components/tinymce/lib/plugins/visualblocks/plugin.mjs +0 -84
  103. package/dist/components/tinymce/lib/plugins/visualblocks/plugin.mjs.map +0 -1
  104. package/dist/components/tinymce/lib/plugins/visualchars/plugin.mjs +0 -487
  105. package/dist/components/tinymce/lib/plugins/visualchars/plugin.mjs.map +0 -1
  106. package/dist/components/tinymce/lib/plugins/wordcount/plugin.mjs +0 -394
  107. package/dist/components/tinymce/lib/plugins/wordcount/plugin.mjs.map +0 -1
  108. package/dist/components/tinymce/lib/themes/silver/theme.mjs +0 -33290
  109. package/dist/components/tinymce/lib/themes/silver/theme.mjs.map +0 -1
@@ -10,7 +10,7 @@ export declare const QdConfigProvider: import("vue").DefineComponent<{
10
10
  select?: Partial<Pick<import("..").QdOrgSelectProps, "type" | "showDeptName" | "showFullDeptPath" | "keys">>;
11
11
  listOrgByIds?: import("..").QdOrgListByIdsOptions;
12
12
  } | undefined;
13
- office?: { [K in keyof Pick<import("..").QdOfficePdfProps, "sandboxUrl" | "workerUrl" | "cMapUrl" | "iccUrl" | "wasmUrl" | "standardFontDataUrl"> as `pdf${Capitalize<K>}`]?: string; } | undefined;
13
+ office?: { [K in keyof Pick<import("../office").QdOfficePdfProps, "sandboxUrl" | "workerUrl" | "cMapUrl" | "iccUrl" | "wasmUrl" | "standardFontDataUrl"> as `pdf${Capitalize<K>}`]?: string; } | undefined;
14
14
  tinymce?: Pick<import("../tinymce").QdTinymceProps, "skinUrl" | "skinDarkUrl" | "localeUrl" | "contentCss" | "emoticonsUrl" | "externalPlugins" | "action" | "bucketConfigKey" | "headers" | "method" | "name" | "formatResponse"> | undefined;
15
15
  globalConfig?: (Omit<NonNullable<import("tdesign-vue-next").TdConfigProviderProps["globalConfig"]>, "upload" | "chat" | "form" | "table"> & {
16
16
  loading?: {
@@ -128,7 +128,7 @@ export declare const QdConfigProvider: import("vue").DefineComponent<{
128
128
  select?: Partial<Pick<import("..").QdOrgSelectProps, "type" | "showDeptName" | "showFullDeptPath" | "keys">>;
129
129
  listOrgByIds?: import("..").QdOrgListByIdsOptions;
130
130
  } | undefined;
131
- office?: { [K in keyof Pick<import("..").QdOfficePdfProps, "sandboxUrl" | "workerUrl" | "cMapUrl" | "iccUrl" | "wasmUrl" | "standardFontDataUrl"> as `pdf${Capitalize<K>}`]?: string; } | undefined;
131
+ office?: { [K in keyof Pick<import("../office").QdOfficePdfProps, "sandboxUrl" | "workerUrl" | "cMapUrl" | "iccUrl" | "wasmUrl" | "standardFontDataUrl"> as `pdf${Capitalize<K>}`]?: string; } | undefined;
132
132
  tinymce?: Pick<import("../tinymce").QdTinymceProps, "skinUrl" | "skinDarkUrl" | "localeUrl" | "contentCss" | "emoticonsUrl" | "externalPlugins" | "action" | "bucketConfigKey" | "headers" | "method" | "name" | "formatResponse"> | undefined;
133
133
  globalConfig?: (Omit<NonNullable<import("tdesign-vue-next").TdConfigProviderProps["globalConfig"]>, "upload" | "chat" | "form" | "table"> & {
134
134
  loading?: {
@@ -10,11 +10,9 @@ export * from './dict';
10
10
  export * from './drawer';
11
11
  export * from './form';
12
12
  export * from './grid';
13
- export * from './icon';
14
13
  export * from './image';
15
14
  export * from './import-dialog';
16
15
  export * from './left-ribbon-tag';
17
- export * from './office';
18
16
  export * from './org';
19
17
  export * from './read-write';
20
18
  export * from './service';
@@ -1,4 +1,3 @@
1
- import { FeatureTest } from "pdfjs-dist";
2
1
  import { isEmpty } from "qidian-shared";
3
2
  import { onActivated, onDeactivated } from "vue";
4
3
  import { ADAPTIVE_VIEW, ZOOM_SCALE_LIMIT, ZOOM_SCALE_FACTOR } from "../config.mjs";
@@ -144,7 +143,7 @@ function useZoom({ viewer, updateViewer, debounceUpdateViewer }) {
144
143
  function onWheel(evt) {
145
144
  const viewerVm = viewer.value;
146
145
  if (!viewerVm) return;
147
- const { isMac } = FeatureTest.platform;
146
+ const isMac = /Mac/.test(navigator.platform || navigator.userAgent);
148
147
  const { ctrlKey, metaKey, deltaMode, deltaX, deltaY, deltaZ, clientX, clientY } = evt;
149
148
  let scaleFactor = Math.exp(-deltaY / 100);
150
149
  const isPinchToZoom = ctrlKey && !isCtrlKeyDown && deltaMode === WheelEvent.DOM_DELTA_PIXEL && deltaX === 0 && (Math.abs(scaleFactor - 1) < 0.05 || isMac) && deltaZ === 0;
@@ -1 +1 @@
1
- {"version":3,"file":"useZoom.mjs","sources":["../../../../../src/components/office/pdf/hooks/useZoom.ts"],"sourcesContent":["import { FeatureTest } from 'pdfjs-dist'\nimport type { PDFViewer } from 'pdfjs-dist/web/pdf_viewer.d.mts'\nimport { isEmpty } from 'qidian-shared'\nimport type { Ref } from 'vue'\nimport { onActivated, onDeactivated } from 'vue'\n\nimport { ADAPTIVE_VIEW, ZOOM_SCALE_FACTOR, ZOOM_SCALE_LIMIT } from '../config'\n\ninterface UseZoomOptions {\n viewer: Ref<PDFViewer | undefined>\n updateViewer: () => void\n debounceUpdateViewer: () => void\n}\n\nlet windowAbortController: AbortController | undefined\nlet isCtrlKeyDown = false\nlet wheelUnusedFactor = 1\nlet wheelUnusedTicks = 0\n\nexport function useZoom({ viewer, updateViewer, debounceUpdateViewer }: UseZoomOptions) {\n function bindWindowEvents() {\n windowAbortController = new AbortController()\n\n window.addEventListener(\n 'keydown',\n (evt) => {\n const { key, keyCode, ctrlKey, altKey, shiftKey, metaKey } = evt\n isCtrlKeyDown = key === 'Control'\n\n const cmd = (ctrlKey ? 1 : 0) | (altKey ? 2 : 0) | (shiftKey ? 4 : 0) | (metaKey ? 8 : 0)\n\n if (![1, 5, 8, 12].includes(cmd)) return\n\n let handled = false\n const viewerVm = viewer.value\n const isViewerInPresentationMode = viewerVm?.isInPresentationMode\n\n switch (keyCode) {\n case 61: // FF/Mac '='\n case 107: // FF '+' and '='\n case 187: // Chrome '+'\n case 171: // FF with German keyboard\n zoomIn()\n handled = true\n break\n\n case 173: // FF/Mac '-'\n case 109: // FF '-'\n case 189: // Chrome '-'\n zoomOut()\n handled = true\n break\n\n case 48: // '0'\n case 96: // '0' on Numpad of Swedish keyboard\n if (!isViewerInPresentationMode) {\n setTimeout(() => {\n adaptiveView(viewerVm?.currentScaleValue !== ADAPTIVE_VIEW)\n })\n handled = false\n }\n break\n\n default:\n break\n }\n\n if (handled) evt.preventDefault()\n },\n windowAbortController\n )\n\n window.addEventListener(\n 'keyup',\n ({ key }) => {\n if (key === 'Control') isCtrlKeyDown = false\n },\n windowAbortController\n )\n }\n\n function unbindWindowEvents() {\n windowAbortController?.abort()\n windowAbortController = undefined\n }\n\n function updateZoom({\n steps,\n scaleFactor,\n origin,\n debounceUpdate\n }: {\n steps?: number\n scaleFactor?: number\n origin?: number[]\n debounceUpdate?: boolean\n }) {\n const viewerVm = viewer.value\n if (!viewerVm || viewerVm.isInPresentationMode) return\n\n // 限制缩放倍率\n if (scaleFactor) {\n const newScale = viewerVm.currentScale * scaleFactor\n if (newScale < ZOOM_SCALE_LIMIT.MIN) {\n scaleFactor = ZOOM_SCALE_LIMIT.MIN / viewerVm.currentScale\n } else if (newScale > ZOOM_SCALE_LIMIT.MAX) {\n scaleFactor = ZOOM_SCALE_LIMIT.MAX / viewerVm.currentScale\n }\n }\n\n if (steps) {\n const newScale = viewerVm.currentScale * ZOOM_SCALE_FACTOR ** steps\n if (newScale < ZOOM_SCALE_LIMIT.MIN) {\n steps = Math.log(ZOOM_SCALE_LIMIT.MIN / viewerVm.currentScale) / Math.log(ZOOM_SCALE_FACTOR)\n } else if (newScale > ZOOM_SCALE_LIMIT.MAX) {\n steps = Math.log(ZOOM_SCALE_LIMIT.MAX / viewerVm.currentScale) / Math.log(ZOOM_SCALE_FACTOR)\n }\n }\n\n if (!origin && viewerVm.container) {\n const container = viewerVm.container\n const rect = container.getBoundingClientRect()\n origin = [rect.width / 2, rect.height / 2]\n }\n\n viewerVm.updateScale({\n drawingDelay: 400,\n steps,\n scaleFactor,\n origin\n })\n\n if (debounceUpdate) debounceUpdateViewer()\n else updateViewer()\n }\n\n function zoomOut() {\n updateZoom({ steps: -1 })\n }\n\n function zoomIn() {\n updateZoom({ steps: 1 })\n }\n\n function adaptiveView(enable = true) {\n const viewerVm = viewer.value\n if (!viewerVm) return\n\n viewerVm.currentScaleValue = enable ? ADAPTIVE_VIEW : `${viewerVm.currentScale}`\n updateViewer()\n }\n\n function accumulateFactor(previousScale: number, factor: number) {\n if (factor === 1) return 1\n\n if ((wheelUnusedFactor > 1 && factor < 1) || (wheelUnusedFactor < 1 && factor > 1)) {\n wheelUnusedFactor = 1\n }\n\n const newFactor =\n Math.floor(previousScale * factor * wheelUnusedFactor * 100) / (100 * previousScale)\n wheelUnusedFactor = factor / newFactor\n\n return newFactor\n }\n\n function accumulateTicks(ticks: number) {\n if ((wheelUnusedTicks > 0 && ticks < 0) || (wheelUnusedTicks < 0 && ticks > 0)) {\n wheelUnusedTicks = 0\n }\n\n wheelUnusedTicks += ticks\n const wholeTicks = Math.trunc(wheelUnusedTicks)\n wheelUnusedTicks -= wholeTicks\n\n return wholeTicks\n }\n\n function normalizeWheelEventDirection(evt: WheelEvent) {\n let delta = Math.hypot(evt.deltaX, evt.deltaY)\n const angle = Math.atan2(evt.deltaY, evt.deltaX)\n if (-0.25 * Math.PI < angle && angle < 0.75 * Math.PI) {\n delta = -delta\n }\n\n return delta\n }\n\n function onWheel(evt: WheelEvent) {\n const viewerVm = viewer.value\n if (!viewerVm) return\n\n const { isMac } = FeatureTest.platform\n const { ctrlKey, metaKey, deltaMode, deltaX, deltaY, deltaZ, clientX, clientY } = evt\n\n let scaleFactor = Math.exp(-deltaY / 100)\n\n const isPinchToZoom =\n ctrlKey &&\n !isCtrlKeyDown &&\n deltaMode === WheelEvent.DOM_DELTA_PIXEL &&\n deltaX === 0 &&\n (Math.abs(scaleFactor - 1) < 0.05 || isMac) &&\n deltaZ === 0\n\n if (!isPinchToZoom && !ctrlKey && !metaKey) return\n\n evt.preventDefault()\n if (document.visibilityState === 'hidden') {\n return\n }\n\n const container = viewerVm.container\n const rect = container.getBoundingClientRect()\n const origin = [clientX - rect.left, clientY - rect.top]\n\n if (isPinchToZoom) {\n scaleFactor = accumulateFactor(viewerVm.currentScale, scaleFactor)\n updateZoom({ scaleFactor, origin, debounceUpdate: true })\n return\n }\n\n const delta = normalizeWheelEventDirection(evt)\n let ticks = 0\n if (deltaMode === WheelEvent.DOM_DELTA_LINE || deltaMode === WheelEvent.DOM_DELTA_PAGE) {\n ticks = Math.abs(delta) >= 1 ? Math.sign(delta) : accumulateTicks(delta)\n } else {\n const PIXELS_PER_LINE_SCALE = 30\n ticks = accumulateTicks(delta / PIXELS_PER_LINE_SCALE)\n }\n\n updateZoom({ steps: ticks, origin, debounceUpdate: true })\n }\n\n function onResize() {\n const viewerVm = viewer.value\n if (!viewerVm) return\n\n const { currentScaleValue } = viewerVm\n if (!isEmpty(currentScaleValue) && currentScaleValue !== ADAPTIVE_VIEW) return\n\n adaptiveView()\n }\n\n bindWindowEvents()\n\n onActivated(() => {\n bindWindowEvents()\n })\n\n onDeactivated(() => {\n unbindWindowEvents()\n })\n\n return {\n updateZoom,\n zoomOut,\n zoomIn,\n adaptiveView,\n onWheel,\n onResize\n }\n}\n"],"names":[],"mappings":"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"}
1
+ {"version":3,"file":"useZoom.mjs","sources":["../../../../../src/components/office/pdf/hooks/useZoom.ts"],"sourcesContent":["import type { PDFViewer } from 'pdfjs-dist/web/pdf_viewer.d.mts'\nimport { isEmpty } from 'qidian-shared'\nimport type { Ref } from 'vue'\nimport { onActivated, onDeactivated } from 'vue'\n\nimport { ADAPTIVE_VIEW, ZOOM_SCALE_FACTOR, ZOOM_SCALE_LIMIT } from '../config'\n\ninterface UseZoomOptions {\n viewer: Ref<PDFViewer | undefined>\n updateViewer: () => void\n debounceUpdateViewer: () => void\n}\n\nlet windowAbortController: AbortController | undefined\nlet isCtrlKeyDown = false\nlet wheelUnusedFactor = 1\nlet wheelUnusedTicks = 0\n\nexport function useZoom({ viewer, updateViewer, debounceUpdateViewer }: UseZoomOptions) {\n function bindWindowEvents() {\n windowAbortController = new AbortController()\n\n window.addEventListener(\n 'keydown',\n (evt) => {\n const { key, keyCode, ctrlKey, altKey, shiftKey, metaKey } = evt\n isCtrlKeyDown = key === 'Control'\n\n const cmd = (ctrlKey ? 1 : 0) | (altKey ? 2 : 0) | (shiftKey ? 4 : 0) | (metaKey ? 8 : 0)\n\n if (![1, 5, 8, 12].includes(cmd)) return\n\n let handled = false\n const viewerVm = viewer.value\n const isViewerInPresentationMode = viewerVm?.isInPresentationMode\n\n switch (keyCode) {\n case 61: // FF/Mac '='\n case 107: // FF '+' and '='\n case 187: // Chrome '+'\n case 171: // FF with German keyboard\n zoomIn()\n handled = true\n break\n\n case 173: // FF/Mac '-'\n case 109: // FF '-'\n case 189: // Chrome '-'\n zoomOut()\n handled = true\n break\n\n case 48: // '0'\n case 96: // '0' on Numpad of Swedish keyboard\n if (!isViewerInPresentationMode) {\n setTimeout(() => {\n adaptiveView(viewerVm?.currentScaleValue !== ADAPTIVE_VIEW)\n })\n handled = false\n }\n break\n\n default:\n break\n }\n\n if (handled) evt.preventDefault()\n },\n windowAbortController\n )\n\n window.addEventListener(\n 'keyup',\n ({ key }) => {\n if (key === 'Control') isCtrlKeyDown = false\n },\n windowAbortController\n )\n }\n\n function unbindWindowEvents() {\n windowAbortController?.abort()\n windowAbortController = undefined\n }\n\n function updateZoom({\n steps,\n scaleFactor,\n origin,\n debounceUpdate\n }: {\n steps?: number\n scaleFactor?: number\n origin?: number[]\n debounceUpdate?: boolean\n }) {\n const viewerVm = viewer.value\n if (!viewerVm || viewerVm.isInPresentationMode) return\n\n // 限制缩放倍率\n if (scaleFactor) {\n const newScale = viewerVm.currentScale * scaleFactor\n if (newScale < ZOOM_SCALE_LIMIT.MIN) {\n scaleFactor = ZOOM_SCALE_LIMIT.MIN / viewerVm.currentScale\n } else if (newScale > ZOOM_SCALE_LIMIT.MAX) {\n scaleFactor = ZOOM_SCALE_LIMIT.MAX / viewerVm.currentScale\n }\n }\n\n if (steps) {\n const newScale = viewerVm.currentScale * ZOOM_SCALE_FACTOR ** steps\n if (newScale < ZOOM_SCALE_LIMIT.MIN) {\n steps = Math.log(ZOOM_SCALE_LIMIT.MIN / viewerVm.currentScale) / Math.log(ZOOM_SCALE_FACTOR)\n } else if (newScale > ZOOM_SCALE_LIMIT.MAX) {\n steps = Math.log(ZOOM_SCALE_LIMIT.MAX / viewerVm.currentScale) / Math.log(ZOOM_SCALE_FACTOR)\n }\n }\n\n if (!origin && viewerVm.container) {\n const container = viewerVm.container\n const rect = container.getBoundingClientRect()\n origin = [rect.width / 2, rect.height / 2]\n }\n\n viewerVm.updateScale({\n drawingDelay: 400,\n steps,\n scaleFactor,\n origin\n })\n\n if (debounceUpdate) debounceUpdateViewer()\n else updateViewer()\n }\n\n function zoomOut() {\n updateZoom({ steps: -1 })\n }\n\n function zoomIn() {\n updateZoom({ steps: 1 })\n }\n\n function adaptiveView(enable = true) {\n const viewerVm = viewer.value\n if (!viewerVm) return\n\n viewerVm.currentScaleValue = enable ? ADAPTIVE_VIEW : `${viewerVm.currentScale}`\n updateViewer()\n }\n\n function accumulateFactor(previousScale: number, factor: number) {\n if (factor === 1) return 1\n\n if ((wheelUnusedFactor > 1 && factor < 1) || (wheelUnusedFactor < 1 && factor > 1)) {\n wheelUnusedFactor = 1\n }\n\n const newFactor =\n Math.floor(previousScale * factor * wheelUnusedFactor * 100) / (100 * previousScale)\n wheelUnusedFactor = factor / newFactor\n\n return newFactor\n }\n\n function accumulateTicks(ticks: number) {\n if ((wheelUnusedTicks > 0 && ticks < 0) || (wheelUnusedTicks < 0 && ticks > 0)) {\n wheelUnusedTicks = 0\n }\n\n wheelUnusedTicks += ticks\n const wholeTicks = Math.trunc(wheelUnusedTicks)\n wheelUnusedTicks -= wholeTicks\n\n return wholeTicks\n }\n\n function normalizeWheelEventDirection(evt: WheelEvent) {\n let delta = Math.hypot(evt.deltaX, evt.deltaY)\n const angle = Math.atan2(evt.deltaY, evt.deltaX)\n if (-0.25 * Math.PI < angle && angle < 0.75 * Math.PI) {\n delta = -delta\n }\n\n return delta\n }\n\n function onWheel(evt: WheelEvent) {\n const viewerVm = viewer.value\n if (!viewerVm) return\n\n const isMac = /Mac/.test(navigator.platform || navigator.userAgent)\n const { ctrlKey, metaKey, deltaMode, deltaX, deltaY, deltaZ, clientX, clientY } = evt\n\n let scaleFactor = Math.exp(-deltaY / 100)\n\n const isPinchToZoom =\n ctrlKey &&\n !isCtrlKeyDown &&\n deltaMode === WheelEvent.DOM_DELTA_PIXEL &&\n deltaX === 0 &&\n (Math.abs(scaleFactor - 1) < 0.05 || isMac) &&\n deltaZ === 0\n\n if (!isPinchToZoom && !ctrlKey && !metaKey) return\n\n evt.preventDefault()\n if (document.visibilityState === 'hidden') {\n return\n }\n\n const container = viewerVm.container\n const rect = container.getBoundingClientRect()\n const origin = [clientX - rect.left, clientY - rect.top]\n\n if (isPinchToZoom) {\n scaleFactor = accumulateFactor(viewerVm.currentScale, scaleFactor)\n updateZoom({ scaleFactor, origin, debounceUpdate: true })\n return\n }\n\n const delta = normalizeWheelEventDirection(evt)\n let ticks = 0\n if (deltaMode === WheelEvent.DOM_DELTA_LINE || deltaMode === WheelEvent.DOM_DELTA_PAGE) {\n ticks = Math.abs(delta) >= 1 ? Math.sign(delta) : accumulateTicks(delta)\n } else {\n const PIXELS_PER_LINE_SCALE = 30\n ticks = accumulateTicks(delta / PIXELS_PER_LINE_SCALE)\n }\n\n updateZoom({ steps: ticks, origin, debounceUpdate: true })\n }\n\n function onResize() {\n const viewerVm = viewer.value\n if (!viewerVm) return\n\n const { currentScaleValue } = viewerVm\n if (!isEmpty(currentScaleValue) && currentScaleValue !== ADAPTIVE_VIEW) return\n\n adaptiveView()\n }\n\n bindWindowEvents()\n\n onActivated(() => {\n bindWindowEvents()\n })\n\n onDeactivated(() => {\n unbindWindowEvents()\n })\n\n return {\n updateZoom,\n zoomOut,\n zoomIn,\n adaptiveView,\n onWheel,\n onResize\n }\n}\n"],"names":[],"mappings":";;;AAaA,IAAI;AACJ,IAAI,gBAAgB;AACpB,IAAI,oBAAoB;AACxB,IAAI,mBAAmB;AAEhB,SAAS,QAAQ,EAAE,QAAQ,cAAc,wBAAwC;AACtF,WAAS,mBAAmB;AAC1B,4BAAwB,IAAI,gBAAA;AAE5B,WAAO;AAAA,MACL;AAAA,MACA,CAAC,QAAQ;AACP,cAAM,EAAE,KAAK,SAAS,SAAS,QAAQ,UAAU,YAAY;AAC7D,wBAAgB,QAAQ;AAExB,cAAM,OAAO,UAAU,IAAI,MAAM,SAAS,IAAI,MAAM,WAAW,IAAI,MAAM,UAAU,IAAI;AAEvF,YAAI,CAAC,CAAC,GAAG,GAAG,GAAG,EAAE,EAAE,SAAS,GAAG,EAAG;AAElC,YAAI,UAAU;AACd,cAAM,WAAW,OAAO;AACxB,cAAM,6BAA6B,UAAU;AAE7C,gBAAQ,SAAA;AAAA,UACN,KAAK;AAAA;AAAA,UACL,KAAK;AAAA;AAAA,UACL,KAAK;AAAA;AAAA,UACL,KAAK;AACH,mBAAA;AACA,sBAAU;AACV;AAAA,UAEF,KAAK;AAAA;AAAA,UACL,KAAK;AAAA;AAAA,UACL,KAAK;AACH,oBAAA;AACA,sBAAU;AACV;AAAA,UAEF,KAAK;AAAA;AAAA,UACL,KAAK;AACH,gBAAI,CAAC,4BAA4B;AAC/B,yBAAW,MAAM;AACf,6BAAa,UAAU,sBAAsB,aAAa;AAAA,cAC5D,CAAC;AACD,wBAAU;AAAA,YACZ;AACA;AAAA,QAGA;AAGJ,YAAI,aAAa,eAAA;AAAA,MACnB;AAAA,MACA;AAAA,IAAA;AAGF,WAAO;AAAA,MACL;AAAA,MACA,CAAC,EAAE,IAAA,MAAU;AACX,YAAI,QAAQ,UAAW,iBAAgB;AAAA,MACzC;AAAA,MACA;AAAA,IAAA;AAAA,EAEJ;AAEA,WAAS,qBAAqB;AAC5B,2BAAuB,MAAA;AACvB,4BAAwB;AAAA,EAC1B;AAEA,WAAS,WAAW;AAAA,IAClB;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,EAAA,GAMC;AACD,UAAM,WAAW,OAAO;AACxB,QAAI,CAAC,YAAY,SAAS,qBAAsB;AAGhD,QAAI,aAAa;AACf,YAAM,WAAW,SAAS,eAAe;AACzC,UAAI,WAAW,iBAAiB,KAAK;AACnC,sBAAc,iBAAiB,MAAM,SAAS;AAAA,MAChD,WAAW,WAAW,iBAAiB,KAAK;AAC1C,sBAAc,iBAAiB,MAAM,SAAS;AAAA,MAChD;AAAA,IACF;AAEA,QAAI,OAAO;AACT,YAAM,WAAW,SAAS,eAAe,qBAAqB;AAC9D,UAAI,WAAW,iBAAiB,KAAK;AACnC,gBAAQ,KAAK,IAAI,iBAAiB,MAAM,SAAS,YAAY,IAAI,KAAK,IAAI,iBAAiB;AAAA,MAC7F,WAAW,WAAW,iBAAiB,KAAK;AAC1C,gBAAQ,KAAK,IAAI,iBAAiB,MAAM,SAAS,YAAY,IAAI,KAAK,IAAI,iBAAiB;AAAA,MAC7F;AAAA,IACF;AAEA,QAAI,CAAC,UAAU,SAAS,WAAW;AACjC,YAAM,YAAY,SAAS;AAC3B,YAAM,OAAO,UAAU,sBAAA;AACvB,eAAS,CAAC,KAAK,QAAQ,GAAG,KAAK,SAAS,CAAC;AAAA,IAC3C;AAEA,aAAS,YAAY;AAAA,MACnB,cAAc;AAAA,MACd;AAAA,MACA;AAAA,MACA;AAAA,IAAA,CACD;AAED,QAAI,eAAgB,sBAAA;AAAA,QACf,cAAA;AAAA,EACP;AAEA,WAAS,UAAU;AACjB,eAAW,EAAE,OAAO,IAAI;AAAA,EAC1B;AAEA,WAAS,SAAS;AAChB,eAAW,EAAE,OAAO,GAAG;AAAA,EACzB;AAEA,WAAS,aAAa,SAAS,MAAM;AACnC,UAAM,WAAW,OAAO;AACxB,QAAI,CAAC,SAAU;AAEf,aAAS,oBAAoB,SAAS,gBAAgB,GAAG,SAAS,YAAY;AAC9E,iBAAA;AAAA,EACF;AAEA,WAAS,iBAAiB,eAAuB,QAAgB;AAC/D,QAAI,WAAW,EAAG,QAAO;AAEzB,QAAK,oBAAoB,KAAK,SAAS,KAAO,oBAAoB,KAAK,SAAS,GAAI;AAClF,0BAAoB;AAAA,IACtB;AAEA,UAAM,YACJ,KAAK,MAAM,gBAAgB,SAAS,oBAAoB,GAAG,KAAK,MAAM;AACxE,wBAAoB,SAAS;AAE7B,WAAO;AAAA,EACT;AAEA,WAAS,gBAAgB,OAAe;AACtC,QAAK,mBAAmB,KAAK,QAAQ,KAAO,mBAAmB,KAAK,QAAQ,GAAI;AAC9E,yBAAmB;AAAA,IACrB;AAEA,wBAAoB;AACpB,UAAM,aAAa,KAAK,MAAM,gBAAgB;AAC9C,wBAAoB;AAEpB,WAAO;AAAA,EACT;AAEA,WAAS,6BAA6B,KAAiB;AACrD,QAAI,QAAQ,KAAK,MAAM,IAAI,QAAQ,IAAI,MAAM;AAC7C,UAAM,QAAQ,KAAK,MAAM,IAAI,QAAQ,IAAI,MAAM;AAC/C,QAAI,QAAQ,KAAK,KAAK,SAAS,QAAQ,OAAO,KAAK,IAAI;AACrD,cAAQ,CAAC;AAAA,IACX;AAEA,WAAO;AAAA,EACT;AAEA,WAAS,QAAQ,KAAiB;AAChC,UAAM,WAAW,OAAO;AACxB,QAAI,CAAC,SAAU;AAEf,UAAM,QAAQ,MAAM,KAAK,UAAU,YAAY,UAAU,SAAS;AAClE,UAAM,EAAE,SAAS,SAAS,WAAW,QAAQ,QAAQ,QAAQ,SAAS,QAAA,IAAY;AAElF,QAAI,cAAc,KAAK,IAAI,CAAC,SAAS,GAAG;AAExC,UAAM,gBACJ,WACA,CAAC,iBACD,cAAc,WAAW,mBACzB,WAAW,MACV,KAAK,IAAI,cAAc,CAAC,IAAI,QAAQ,UACrC,WAAW;AAEb,QAAI,CAAC,iBAAiB,CAAC,WAAW,CAAC,QAAS;AAE5C,QAAI,eAAA;AACJ,QAAI,SAAS,oBAAoB,UAAU;AACzC;AAAA,IACF;AAEA,UAAM,YAAY,SAAS;AAC3B,UAAM,OAAO,UAAU,sBAAA;AACvB,UAAM,SAAS,CAAC,UAAU,KAAK,MAAM,UAAU,KAAK,GAAG;AAEvD,QAAI,eAAe;AACjB,oBAAc,iBAAiB,SAAS,cAAc,WAAW;AACjE,iBAAW,EAAE,aAAa,QAAQ,gBAAgB,MAAM;AACxD;AAAA,IACF;AAEA,UAAM,QAAQ,6BAA6B,GAAG;AAC9C,QAAI,QAAQ;AACZ,QAAI,cAAc,WAAW,kBAAkB,cAAc,WAAW,gBAAgB;AACtF,cAAQ,KAAK,IAAI,KAAK,KAAK,IAAI,KAAK,KAAK,KAAK,IAAI,gBAAgB,KAAK;AAAA,IACzE,OAAO;AACL,YAAM,wBAAwB;AAC9B,cAAQ,gBAAgB,QAAQ,qBAAqB;AAAA,IACvD;AAEA,eAAW,EAAE,OAAO,OAAO,QAAQ,gBAAgB,MAAM;AAAA,EAC3D;AAEA,WAAS,WAAW;AAClB,UAAM,WAAW,OAAO;AACxB,QAAI,CAAC,SAAU;AAEf,UAAM,EAAE,sBAAsB;AAC9B,QAAI,CAAC,QAAQ,iBAAiB,KAAK,sBAAsB,cAAe;AAExE,iBAAA;AAAA,EACF;AAEA,mBAAA;AAEA,cAAY,MAAM;AAChB,qBAAA;AAAA,EACF,CAAC;AAED,gBAAc,MAAM;AAClB,uBAAA;AAAA,EACF,CAAC;AAED,SAAO;AAAA,IACL;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,EAAA;AAEJ;"}
@@ -1,10 +1,10 @@
1
- import { PDFViewer } from 'pdfjs-dist/legacy/web/pdf_viewer.mjs';
1
+ import type { PDFViewer as PDFViewerType } from 'pdfjs-dist/web/pdf_viewer.d.mts';
2
2
  import type { QdOfficePdfProps, TextLayerRenderedEvent } from './types';
3
3
  declare const _default: import("vue").DefineComponent<QdOfficePdfProps, {}, {}, {}, {}, import("vue").ComponentOptionsMixin, import("vue").ComponentOptionsMixin, {
4
- pagesInit: (args_0: PDFViewer) => any;
4
+ pagesInit: (args_0: PDFViewerType) => any;
5
5
  textLayerRendered: (args_0: TextLayerRenderedEvent) => any;
6
6
  }, string, import("vue").PublicProps, Readonly<QdOfficePdfProps> & Readonly<{
7
- onPagesInit?: ((args_0: PDFViewer) => any) | undefined;
7
+ onPagesInit?: ((args_0: PDFViewerType) => any) | undefined;
8
8
  onTextLayerRendered?: ((args_0: TextLayerRenderedEvent) => any) | undefined;
9
9
  }>, {}, {}, {}, {}, string, import("vue").ComponentProvideOptions, false, {}, any>;
10
10
  export default _default;
@@ -4,7 +4,7 @@ import _sfc_main from "./index.vue2.mjs";
4
4
  /* empty css */
5
5
  /* empty css */
6
6
  import _export_sfc from "../../../_virtual/_plugin-vue_export-helper.mjs";
7
- const index = /* @__PURE__ */ _export_sfc(_sfc_main, [["__scopeId", "data-v-4b46da8b"]]);
7
+ const index = /* @__PURE__ */ _export_sfc(_sfc_main, [["__scopeId", "data-v-914761f4"]]);
8
8
  export {
9
9
  index as default
10
10
  };
@@ -1,8 +1,6 @@
1
1
  import './index2.css'
2
2
  import './index.css'
3
3
  import { defineComponent, inject, computed, ref, shallowRef, onMounted, watch, createBlock, openBlock, unref, withCtx, withDirectives, createVNode, createElementBlock, createElementVNode, Transition, createCommentVNode, createTextVNode, toDisplayString, triggerRef } from "vue";
4
- import { GlobalWorkerOptions, getDocument } from "pdfjs-dist/legacy/build/pdf.mjs";
5
- import { EventBus, PDFLinkService, PDFFindController, PDFScriptingManager, PDFViewer } from "pdfjs-dist/legacy/web/pdf_viewer.mjs";
6
4
  import { resizeDirective, toPrecision, to, isDev } from "qidian-shared";
7
5
  import { ChevronLeftIcon, ChevronRightIcon, ZoomOutIcon, ZoomInIcon, CenterFocusStrongFilledIcon, CenterFocusStrongIcon } from "tdesign-icons-vue-next";
8
6
  import { Loading, Tooltip, Button, InputNumber, Divider } from "tdesign-vue-next";
@@ -96,10 +94,12 @@ const _sfc_main = /* @__PURE__ */ defineComponent({
96
94
  });
97
95
  async function render() {
98
96
  const { src, mode } = props;
99
- GlobalWorkerOptions.workerSrc = workerSrc.value;
100
97
  const containerEl = containerRef.value;
101
98
  const viewerEl = viewerRef.value;
102
99
  if (!src || !containerEl || !viewerEl) return;
100
+ const { getDocument, GlobalWorkerOptions } = await import("pdfjs-dist/legacy/build/pdf.mjs");
101
+ const { EventBus, PDFFindController, PDFLinkService, PDFScriptingManager, PDFViewer } = await import("pdfjs-dist/legacy/web/pdf_viewer.mjs");
102
+ GlobalWorkerOptions.workerSrc = workerSrc.value;
103
103
  if (pdfBlobUrl.value) {
104
104
  URL.revokeObjectURL(pdfBlobUrl.value);
105
105
  pdfBlobUrl.value = void 0;
@@ -1 +1 @@
1
- {"version":3,"file":"index.vue2.mjs","sources":["../../../../src/components/office/pdf/index.vue"],"sourcesContent":["<template>\n <t-loading\n class=\"qd-office-pdf\"\n :loading=\"loading\"\n size=\"small\"\n @mouseover=\"showControls = true\"\n @mouseleave=\"showControls = false\"\n >\n <div\n ref=\"containerRef\"\n v-resize.300=\"onResize\"\n class=\"qd-office-pdf__container\"\n @wheel=\"onWheel\"\n @scroll=\"onScroll\"\n >\n <div ref=\"viewerRef\" class=\"qd-office-pdf__viewer pdfViewer\"></div>\n </div>\n\n <transition name=\"controls-fade\">\n <div v-if=\"viewer && showControls\" class=\"qd-office-pdf__controls\">\n <div class=\"qd-office-pdf__controls-body\">\n <div class=\"qd-office-pdf__controls-page\">\n <t-tooltip :content=\"t('prevPage')\" :disabled=\"prevPageDisabled\">\n <t-button\n variant=\"text\"\n theme=\"default\"\n :disabled=\"prevPageDisabled\"\n @click=\"updatePage(viewer.currentPageNumber - 1)\"\n >\n <template #icon><chevron-left-icon /></template>\n </t-button>\n </t-tooltip>\n\n <div class=\"qd-office-pdf__controls-page-input\">\n <t-input-number\n v-model=\"viewer.currentPageNumber\"\n auto-width\n theme=\"normal\"\n align=\"center\"\n size=\"small\"\n :min=\"1\"\n :max=\"viewer.pagesCount\"\n />\n / {{ viewer.pagesCount }}\n </div>\n\n <t-tooltip :content=\"t('nextPage')\" :disabled=\"nextPageDisabled\">\n <t-button\n variant=\"text\"\n theme=\"default\"\n :disabled=\"nextPageDisabled\"\n @click=\"updatePage(viewer.currentPageNumber + 1)\"\n >\n <template #icon><chevron-right-icon /></template>\n </t-button>\n </t-tooltip>\n </div>\n\n <t-divider layout=\"vertical\" />\n\n <t-tooltip :content=\"t('zoomOut')\" :disabled=\"zoomOutDisabled\">\n <t-button variant=\"text\" theme=\"default\" :disabled=\"zoomOutDisabled\" @click=\"zoomOut\">\n <template #icon><zoom-out-icon /></template>\n </t-button>\n </t-tooltip>\n\n <div class=\"qd-office-pdf__controls-scale\">\n {{ toPrecision(viewer.currentScale * 100) }}%\n </div>\n\n <t-tooltip :content=\"t('zoomIn')\" :disabled=\"zoomInDisabled\">\n <t-button variant=\"text\" theme=\"default\" :disabled=\"zoomInDisabled\" @click=\"zoomIn\">\n <template #icon><zoom-in-icon /></template>\n </t-button>\n </t-tooltip>\n\n <t-tooltip :content=\"isAdaptiveView ? t('cancelAdaptiveView') : t('adaptiveView')\">\n <t-button\n variant=\"text\"\n :theme=\"isAdaptiveView ? 'primary' : 'default'\"\n @click=\"adaptiveView(!isAdaptiveView)\"\n >\n <template #icon>\n <center-focus-strong-filled-icon v-if=\"isAdaptiveView\" />\n <center-focus-strong-icon v-else />\n </template>\n </t-button>\n </t-tooltip>\n </div>\n </div>\n </transition>\n </t-loading>\n</template>\n\n<script setup lang=\"ts\">\n import { useDebounceFn } from '@vueuse/core'\n import { getDocument, GlobalWorkerOptions } from 'pdfjs-dist/legacy/build/pdf.mjs'\n import {\n EventBus,\n PDFFindController,\n PDFLinkService,\n PDFScriptingManager,\n PDFViewer\n } from 'pdfjs-dist/legacy/web/pdf_viewer.mjs'\n import { isDev, resizeDirective, to, toPrecision } from 'qidian-shared'\n import {\n CenterFocusStrongFilledIcon,\n CenterFocusStrongIcon,\n ChevronLeftIcon,\n ChevronRightIcon,\n ZoomInIcon,\n ZoomOutIcon\n } from 'tdesign-icons-vue-next'\n import {\n Button as TButton,\n Divider as TDivider,\n InputNumber as TInputNumber,\n Loading as TLoading,\n Tooltip as TTooltip\n } from 'tdesign-vue-next'\n import { computed, inject, onMounted, ref, shallowRef, triggerRef, watch } from 'vue'\n\n import { getPublicUrl, useUICsl } from '../../../utils/tools'\n import { PROVIDE_OFFICE } from '../../config-provider/config'\n import { useConfig } from '../../config-provider/useConfig'\n import { ADAPTIVE_VIEW, ZOOM_SCALE_LIMIT } from './config'\n import { useZoom } from './hooks/useZoom'\n import type { PageRenderedEvent, QdOfficePdfProps, TextLayerRenderedEvent } from './types'\n import { image2pdf, isImageUrl } from './utils/image2pdf'\n\n defineOptions({\n name: 'QdOfficePdf'\n })\n\n const props = defineProps<QdOfficePdfProps>()\n const emit = defineEmits<{\n pagesInit: [PDFViewer]\n textLayerRendered: [TextLayerRenderedEvent]\n }>()\n\n const vResize = resizeDirective\n\n const csl = useUICsl('office-pdf')\n const { t } = useConfig('office')\n const globalOffice = inject(\n PROVIDE_OFFICE,\n computed(() => undefined)\n )\n\n const workerSrc = computed(\n () =>\n props.workerUrl ||\n globalOffice.value?.pdfWorkerUrl ||\n getPublicUrl('pdfjs/build/pdf.worker.min.mjs')\n )\n const sandboxSrc = computed(\n () =>\n props.sandboxUrl ||\n globalOffice.value?.pdfSandboxUrl ||\n getPublicUrl('pdfjs/build/pdf.sandbox.min.mjs')\n )\n const cMapSrc = computed(\n () => props.cMapUrl || globalOffice.value?.pdfCMapUrl || getPublicUrl('pdfjs/cmaps/')\n )\n const iccSrc = computed(\n () => props.iccUrl || globalOffice.value?.pdfIccUrl || getPublicUrl('pdfjs/iccs/')\n )\n const wasmSrc = computed(\n () => props.wasmUrl || globalOffice.value?.pdfWasmUrl || getPublicUrl('pdfjs/wasm/')\n )\n const standardFontDataSrc = computed(\n () =>\n props.standardFontDataUrl ||\n globalOffice.value?.pdfStandardFontDataUrl ||\n getPublicUrl('pdfjs/standard_fonts/')\n )\n\n const loading = ref(false)\n const pdfBlobUrl = shallowRef<string>()\n const containerRef = ref<HTMLDivElement>()\n const viewerRef = ref<HTMLDivElement>()\n const viewer = shallowRef<PDFViewer | undefined>()\n const isAdaptiveView = computed(() => viewer.value?.currentScaleValue === ADAPTIVE_VIEW)\n const debounceUpdateViewer = useDebounceFn(updateViewer, 300, { maxWait: 900 })\n const showControls = ref(false)\n\n const { zoomOut, zoomIn, adaptiveView, onWheel, onResize } = useZoom({\n viewer,\n updateViewer,\n debounceUpdateViewer\n })\n\n const prevPageDisabled = computed(() => {\n const viewerVm = viewer.value\n return viewerVm && viewerVm.currentPageNumber <= 1\n })\n const nextPageDisabled = computed(() => {\n const viewerVm = viewer.value\n return viewerVm && viewerVm.currentPageNumber >= viewerVm.pagesCount\n })\n const zoomOutDisabled = computed(() => {\n const viewerVm = viewer.value\n return viewerVm && viewerVm.currentScale <= ZOOM_SCALE_LIMIT.MIN\n })\n const zoomInDisabled = computed(() => {\n const viewerVm = viewer.value\n return viewerVm && viewerVm.currentScale >= ZOOM_SCALE_LIMIT.MAX\n })\n\n async function render() {\n const { src, mode } = props\n GlobalWorkerOptions.workerSrc = workerSrc.value\n const containerEl = containerRef.value\n const viewerEl = viewerRef.value\n if (!src || !containerEl || !viewerEl) return\n\n // 清理之前的 Blob URL\n if (pdfBlobUrl.value) {\n URL.revokeObjectURL(pdfBlobUrl.value)\n pdfBlobUrl.value = undefined\n }\n\n loading.value = true\n\n // 获取实际 PDF 源\n let pdfSrc = src\n const shouldConvert = mode === 'img' || (mode === 'pdf' && isImageUrl(src))\n if (shouldConvert) {\n const [err, blobUrl] = await to(image2pdf(src))\n if (err) {\n loading.value = false\n return\n }\n pdfSrc = blobUrl\n pdfBlobUrl.value = blobUrl\n }\n const eventBus = new EventBus()\n const linkService = new PDFLinkService({\n eventBus,\n externalLinkTarget: 2,\n externalLinkRel: ''\n })\n linkService.externalLinkEnabled = false // 禁用外链跳转\n\n const findController = new PDFFindController({\n eventBus,\n linkService,\n updateMatchesCountOnProgress: true\n })\n const scriptingManager = new PDFScriptingManager({\n eventBus,\n sandboxBundleSrc: sandboxSrc.value\n })\n\n viewer.value = new PDFViewer({\n container: containerEl,\n viewer: viewerEl,\n eventBus,\n linkService,\n findController,\n scriptingManager,\n annotationEditorMode: 0,\n textLayerMode: 1,\n annotationMode: 1,\n enablePrintAutoRotate: true,\n maxCanvasPixels: 33554432,\n maxCanvasDim: 32767,\n capCanvasAreaFactor: 200,\n enableHWA: true,\n enableDetailCanvas: true,\n enablePermissions: true,\n supportsPinchToZoom: true,\n enableAutoLinking: true,\n minDurationToUpdateCanvas: 500,\n l10n: undefined\n })\n const viewerVm = viewer.value\n\n linkService.setViewer(viewerVm)\n scriptingManager.setViewer(viewerVm)\n\n const loadingTask = getDocument({\n url: pdfSrc,\n cMapUrl: cMapSrc.value,\n iccUrl: iccSrc.value,\n wasmUrl: wasmSrc.value,\n standardFontDataUrl: standardFontDataSrc.value,\n pdfBug: isDev,\n cMapPacked: true,\n enableXfa: true,\n enableHWA: true,\n isEvalSupported: true,\n isOffscreenCanvasSupported: true,\n useWasm: true,\n useWorkerFetch: true,\n\n verbosity: 1,\n maxImageSize: -1,\n canvasMaxAreaInBytes: -1,\n\n fontExtraProperties: false,\n disableAutoFetch: false,\n disableFontFace: false,\n disableRange: false,\n disableStream: false\n })\n const [pdfErr, pdf] = await to(loadingTask.promise)\n if (pdfErr) {\n loading.value = false\n return\n }\n\n viewerVm.setDocument(pdf)\n linkService.setDocument(pdf)\n\n eventBus.on('pagesinit', () => {\n csl.log.dev('pagesInit')\n loading.value = false\n emit('pagesInit', viewerVm)\n })\n\n eventBus.on('pagerendered', (evt: PageRenderedEvent) => {\n csl.log.dev('pageRendered', evt.pageNumber)\n })\n\n eventBus.on('textlayerrendered', (evt: TextLayerRenderedEvent) => {\n emit('textLayerRendered', evt)\n })\n }\n\n function updateViewer() {\n if (!viewer.value) return\n\n triggerRef(viewer)\n }\n\n function updatePage(page: number) {\n const viewerVm = viewer.value\n if (!viewerVm) return\n\n viewerVm.currentPageNumber = page\n updateViewer()\n }\n\n function onScroll() {\n debounceUpdateViewer()\n }\n\n onMounted(() => {\n render()\n watch(() => props.src, render)\n })\n</script>\n\n<style lang=\"less\">\n @import 'pdfjs-dist/legacy/web/pdf_viewer.css';\n</style>\n\n<style lang=\"less\" scoped>\n .qd-office-pdf {\n width: 100%;\n height: 100%;\n position: relative;\n background-color: var(--td-bg-color-component);\n\n &__container {\n position: absolute;\n width: 100%;\n max-height: 100%;\n overflow: auto;\n }\n\n &__viewer {\n width: 100%;\n height: 100%;\n\n :deep(.page) {\n // NOTE 解决 textLayer 整体偏移问题\n box-sizing: content-box;\n }\n\n :deep(.annotationLayer) {\n :is(.linkAnnotation, .buttonWidgetAnnotation.pushButton):not(.hasBorder) > a {\n background-color: transparent;\n }\n }\n }\n\n &__controls {\n position: absolute;\n left: 50%;\n bottom: var(--td-comp-paddingTB-xl) !important;\n transform: translateX(-50%);\n border-radius: 3px;\n background-color: rgba(var(--td-bg-color-container), 0.5);\n backdrop-filter: blur(2px);\n box-shadow: 0 0 2px 1px rgba(0, 0, 0, 0.08);\n user-select: none;\n transition: all 0.2s linear;\n\n .t-button {\n width: 38px;\n height: 38px;\n padding: 0;\n margin-left: 0;\n }\n\n &-body {\n display: flex;\n align-items: center;\n opacity: 0.5;\n transition: opacity 0.2s linear;\n }\n\n &-scale {\n width: 39px;\n margin: 0 var(--td-comp-margin-s);\n }\n\n &-page {\n display: flex;\n align-items: stretch;\n\n :deep(.t-input-number) {\n width: auto;\n\n .t-input {\n padding: 0;\n\n &__wrap {\n min-width: 32px;\n }\n\n &__inner {\n min-width: 32px;\n }\n }\n }\n\n &-input {\n display: inline-flex;\n align-items: center;\n flex-shrink: 0;\n padding: 0 var(--td-comp-paddingTB-s);\n font-size: var(--td-font-body-medium);\n gap: var(--td-comp-margin-s);\n background-color: var(--td-bg-color-secondarycontainer);\n border-radius: var(--td-radius-default);\n }\n }\n\n &:hover {\n background-color: var(--td-bg-color-container);\n\n .qd-office-pdf__controls-body {\n opacity: 1;\n }\n }\n }\n }\n\n .controls-fade-leave-active,\n .controls-fade-enter-active {\n transition: opacity 0.28s cubic-bezier(0.38, 0, 0.24, 1);\n }\n\n .controls-fade-enter-from,\n .controls-fade-leave-to {\n opacity: 0;\n }\n</style>\n"],"names":["_createBlock","_unref","TLoading","_createElementBlock","_createElementVNode","_createVNode","_Transition","_openBlock","TTooltip","TButton","TInputNumber","_toDisplayString","TDivider"],"mappings":"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"}
1
+ {"version":3,"file":"index.vue2.mjs","sources":["../../../../src/components/office/pdf/index.vue"],"sourcesContent":["<template>\n <t-loading\n class=\"qd-office-pdf\"\n :loading=\"loading\"\n size=\"small\"\n @mouseover=\"showControls = true\"\n @mouseleave=\"showControls = false\"\n >\n <div\n ref=\"containerRef\"\n v-resize.300=\"onResize\"\n class=\"qd-office-pdf__container\"\n @wheel=\"onWheel\"\n @scroll=\"onScroll\"\n >\n <div ref=\"viewerRef\" class=\"qd-office-pdf__viewer pdfViewer\"></div>\n </div>\n\n <transition name=\"controls-fade\">\n <div v-if=\"viewer && showControls\" class=\"qd-office-pdf__controls\">\n <div class=\"qd-office-pdf__controls-body\">\n <div class=\"qd-office-pdf__controls-page\">\n <t-tooltip :content=\"t('prevPage')\" :disabled=\"prevPageDisabled\">\n <t-button\n variant=\"text\"\n theme=\"default\"\n :disabled=\"prevPageDisabled\"\n @click=\"updatePage(viewer.currentPageNumber - 1)\"\n >\n <template #icon><chevron-left-icon /></template>\n </t-button>\n </t-tooltip>\n\n <div class=\"qd-office-pdf__controls-page-input\">\n <t-input-number\n v-model=\"viewer.currentPageNumber\"\n auto-width\n theme=\"normal\"\n align=\"center\"\n size=\"small\"\n :min=\"1\"\n :max=\"viewer.pagesCount\"\n />\n / {{ viewer.pagesCount }}\n </div>\n\n <t-tooltip :content=\"t('nextPage')\" :disabled=\"nextPageDisabled\">\n <t-button\n variant=\"text\"\n theme=\"default\"\n :disabled=\"nextPageDisabled\"\n @click=\"updatePage(viewer.currentPageNumber + 1)\"\n >\n <template #icon><chevron-right-icon /></template>\n </t-button>\n </t-tooltip>\n </div>\n\n <t-divider layout=\"vertical\" />\n\n <t-tooltip :content=\"t('zoomOut')\" :disabled=\"zoomOutDisabled\">\n <t-button variant=\"text\" theme=\"default\" :disabled=\"zoomOutDisabled\" @click=\"zoomOut\">\n <template #icon><zoom-out-icon /></template>\n </t-button>\n </t-tooltip>\n\n <div class=\"qd-office-pdf__controls-scale\">\n {{ toPrecision(viewer.currentScale * 100) }}%\n </div>\n\n <t-tooltip :content=\"t('zoomIn')\" :disabled=\"zoomInDisabled\">\n <t-button variant=\"text\" theme=\"default\" :disabled=\"zoomInDisabled\" @click=\"zoomIn\">\n <template #icon><zoom-in-icon /></template>\n </t-button>\n </t-tooltip>\n\n <t-tooltip :content=\"isAdaptiveView ? t('cancelAdaptiveView') : t('adaptiveView')\">\n <t-button\n variant=\"text\"\n :theme=\"isAdaptiveView ? 'primary' : 'default'\"\n @click=\"adaptiveView(!isAdaptiveView)\"\n >\n <template #icon>\n <center-focus-strong-filled-icon v-if=\"isAdaptiveView\" />\n <center-focus-strong-icon v-else />\n </template>\n </t-button>\n </t-tooltip>\n </div>\n </div>\n </transition>\n </t-loading>\n</template>\n\n<script setup lang=\"ts\">\n import { useDebounceFn } from '@vueuse/core'\n import type { PDFViewer as PDFViewerType } from 'pdfjs-dist/web/pdf_viewer.d.mts'\n import { isDev, resizeDirective, to, toPrecision } from 'qidian-shared'\n import {\n CenterFocusStrongFilledIcon,\n CenterFocusStrongIcon,\n ChevronLeftIcon,\n ChevronRightIcon,\n ZoomInIcon,\n ZoomOutIcon\n } from 'tdesign-icons-vue-next'\n import {\n Button as TButton,\n Divider as TDivider,\n InputNumber as TInputNumber,\n Loading as TLoading,\n Tooltip as TTooltip\n } from 'tdesign-vue-next'\n import { computed, inject, onMounted, ref, shallowRef, triggerRef, watch } from 'vue'\n\n import { getPublicUrl, useUICsl } from '../../../utils/tools'\n import { PROVIDE_OFFICE } from '../../config-provider/config'\n import { useConfig } from '../../config-provider/useConfig'\n import { ADAPTIVE_VIEW, ZOOM_SCALE_LIMIT } from './config'\n import { useZoom } from './hooks/useZoom'\n import type { PageRenderedEvent, QdOfficePdfProps, TextLayerRenderedEvent } from './types'\n import { image2pdf, isImageUrl } from './utils/image2pdf'\n\n defineOptions({\n name: 'QdOfficePdf'\n })\n\n const props = defineProps<QdOfficePdfProps>()\n const emit = defineEmits<{\n pagesInit: [PDFViewerType]\n textLayerRendered: [TextLayerRenderedEvent]\n }>()\n\n const vResize = resizeDirective\n\n const csl = useUICsl('office-pdf')\n const { t } = useConfig('office')\n const globalOffice = inject(\n PROVIDE_OFFICE,\n computed(() => undefined)\n )\n\n const workerSrc = computed(\n () =>\n props.workerUrl ||\n globalOffice.value?.pdfWorkerUrl ||\n getPublicUrl('pdfjs/build/pdf.worker.min.mjs')\n )\n const sandboxSrc = computed(\n () =>\n props.sandboxUrl ||\n globalOffice.value?.pdfSandboxUrl ||\n getPublicUrl('pdfjs/build/pdf.sandbox.min.mjs')\n )\n const cMapSrc = computed(\n () => props.cMapUrl || globalOffice.value?.pdfCMapUrl || getPublicUrl('pdfjs/cmaps/')\n )\n const iccSrc = computed(\n () => props.iccUrl || globalOffice.value?.pdfIccUrl || getPublicUrl('pdfjs/iccs/')\n )\n const wasmSrc = computed(\n () => props.wasmUrl || globalOffice.value?.pdfWasmUrl || getPublicUrl('pdfjs/wasm/')\n )\n const standardFontDataSrc = computed(\n () =>\n props.standardFontDataUrl ||\n globalOffice.value?.pdfStandardFontDataUrl ||\n getPublicUrl('pdfjs/standard_fonts/')\n )\n\n const loading = ref(false)\n const pdfBlobUrl = shallowRef<string>()\n const containerRef = ref<HTMLDivElement>()\n const viewerRef = ref<HTMLDivElement>()\n const viewer = shallowRef<PDFViewerType | undefined>()\n const isAdaptiveView = computed(() => viewer.value?.currentScaleValue === ADAPTIVE_VIEW)\n const debounceUpdateViewer = useDebounceFn(updateViewer, 300, { maxWait: 900 })\n const showControls = ref(false)\n\n const { zoomOut, zoomIn, adaptiveView, onWheel, onResize } = useZoom({\n viewer,\n updateViewer,\n debounceUpdateViewer\n })\n\n const prevPageDisabled = computed(() => {\n const viewerVm = viewer.value\n return viewerVm && viewerVm.currentPageNumber <= 1\n })\n const nextPageDisabled = computed(() => {\n const viewerVm = viewer.value\n return viewerVm && viewerVm.currentPageNumber >= viewerVm.pagesCount\n })\n const zoomOutDisabled = computed(() => {\n const viewerVm = viewer.value\n return viewerVm && viewerVm.currentScale <= ZOOM_SCALE_LIMIT.MIN\n })\n const zoomInDisabled = computed(() => {\n const viewerVm = viewer.value\n return viewerVm && viewerVm.currentScale >= ZOOM_SCALE_LIMIT.MAX\n })\n\n async function render() {\n const { src, mode } = props\n const containerEl = containerRef.value\n const viewerEl = viewerRef.value\n if (!src || !containerEl || !viewerEl) return\n const { getDocument, GlobalWorkerOptions } = await import('pdfjs-dist/legacy/build/pdf.mjs')\n const { EventBus, PDFFindController, PDFLinkService, PDFScriptingManager, PDFViewer } =\n await import('pdfjs-dist/legacy/web/pdf_viewer.mjs')\n\n GlobalWorkerOptions.workerSrc = workerSrc.value\n\n // 清理之前的 Blob URL\n if (pdfBlobUrl.value) {\n URL.revokeObjectURL(pdfBlobUrl.value)\n pdfBlobUrl.value = undefined\n }\n\n loading.value = true\n\n // 获取实际 PDF 源\n let pdfSrc = src\n const shouldConvert = mode === 'img' || (mode === 'pdf' && isImageUrl(src))\n if (shouldConvert) {\n const [err, blobUrl] = await to(image2pdf(src))\n if (err) {\n loading.value = false\n return\n }\n pdfSrc = blobUrl\n pdfBlobUrl.value = blobUrl\n }\n const eventBus = new EventBus()\n const linkService = new PDFLinkService({\n eventBus,\n externalLinkTarget: 2,\n externalLinkRel: ''\n })\n linkService.externalLinkEnabled = false // 禁用外链跳转\n\n const findController = new PDFFindController({\n eventBus,\n linkService,\n updateMatchesCountOnProgress: true\n })\n const scriptingManager = new PDFScriptingManager({\n eventBus,\n sandboxBundleSrc: sandboxSrc.value\n })\n\n viewer.value = new PDFViewer({\n container: containerEl,\n viewer: viewerEl,\n eventBus,\n linkService,\n findController,\n scriptingManager,\n annotationEditorMode: 0,\n textLayerMode: 1,\n annotationMode: 1,\n enablePrintAutoRotate: true,\n maxCanvasPixels: 33554432,\n maxCanvasDim: 32767,\n capCanvasAreaFactor: 200,\n enableHWA: true,\n enableDetailCanvas: true,\n enablePermissions: true,\n supportsPinchToZoom: true,\n enableAutoLinking: true,\n minDurationToUpdateCanvas: 500,\n l10n: undefined\n })\n const viewerVm = viewer.value\n\n linkService.setViewer(viewerVm)\n scriptingManager.setViewer(viewerVm)\n\n const loadingTask = getDocument({\n url: pdfSrc,\n cMapUrl: cMapSrc.value,\n iccUrl: iccSrc.value,\n wasmUrl: wasmSrc.value,\n standardFontDataUrl: standardFontDataSrc.value,\n pdfBug: isDev,\n cMapPacked: true,\n enableXfa: true,\n enableHWA: true,\n isEvalSupported: true,\n isOffscreenCanvasSupported: true,\n useWasm: true,\n useWorkerFetch: true,\n\n verbosity: 1,\n maxImageSize: -1,\n canvasMaxAreaInBytes: -1,\n\n fontExtraProperties: false,\n disableAutoFetch: false,\n disableFontFace: false,\n disableRange: false,\n disableStream: false\n })\n const [pdfErr, pdf] = await to(loadingTask.promise)\n if (pdfErr) {\n loading.value = false\n return\n }\n\n viewerVm.setDocument(pdf)\n linkService.setDocument(pdf)\n\n eventBus.on('pagesinit', () => {\n csl.log.dev('pagesInit')\n loading.value = false\n emit('pagesInit', viewerVm)\n })\n\n eventBus.on('pagerendered', (evt: PageRenderedEvent) => {\n csl.log.dev('pageRendered', evt.pageNumber)\n })\n\n eventBus.on('textlayerrendered', (evt: TextLayerRenderedEvent) => {\n emit('textLayerRendered', evt)\n })\n }\n\n function updateViewer() {\n if (!viewer.value) return\n\n triggerRef(viewer)\n }\n\n function updatePage(page: number) {\n const viewerVm = viewer.value\n if (!viewerVm) return\n\n viewerVm.currentPageNumber = page\n updateViewer()\n }\n\n function onScroll() {\n debounceUpdateViewer()\n }\n\n onMounted(() => {\n render()\n watch(() => props.src, render)\n })\n</script>\n\n<style lang=\"less\">\n @import 'pdfjs-dist/legacy/web/pdf_viewer.css';\n</style>\n\n<style lang=\"less\" scoped>\n .qd-office-pdf {\n width: 100%;\n height: 100%;\n position: relative;\n background-color: var(--td-bg-color-component);\n\n &__container {\n position: absolute;\n width: 100%;\n max-height: 100%;\n overflow: auto;\n }\n\n &__viewer {\n width: 100%;\n height: 100%;\n\n :deep(.page) {\n // NOTE 解决 textLayer 整体偏移问题\n box-sizing: content-box;\n }\n\n :deep(.annotationLayer) {\n :is(.linkAnnotation, .buttonWidgetAnnotation.pushButton):not(.hasBorder) > a {\n background-color: transparent;\n }\n }\n }\n\n &__controls {\n position: absolute;\n left: 50%;\n bottom: var(--td-comp-paddingTB-xl) !important;\n transform: translateX(-50%);\n border-radius: 3px;\n background-color: rgba(var(--td-bg-color-container), 0.5);\n backdrop-filter: blur(2px);\n box-shadow: 0 0 2px 1px rgba(0, 0, 0, 0.08);\n user-select: none;\n transition: all 0.2s linear;\n\n .t-button {\n width: 38px;\n height: 38px;\n padding: 0;\n margin-left: 0;\n }\n\n &-body {\n display: flex;\n align-items: center;\n opacity: 0.5;\n transition: opacity 0.2s linear;\n }\n\n &-scale {\n width: 39px;\n margin: 0 var(--td-comp-margin-s);\n }\n\n &-page {\n display: flex;\n align-items: stretch;\n\n :deep(.t-input-number) {\n width: auto;\n\n .t-input {\n padding: 0;\n\n &__wrap {\n min-width: 32px;\n }\n\n &__inner {\n min-width: 32px;\n }\n }\n }\n\n &-input {\n display: inline-flex;\n align-items: center;\n flex-shrink: 0;\n padding: 0 var(--td-comp-paddingTB-s);\n font-size: var(--td-font-body-medium);\n gap: var(--td-comp-margin-s);\n background-color: var(--td-bg-color-secondarycontainer);\n border-radius: var(--td-radius-default);\n }\n }\n\n &:hover {\n background-color: var(--td-bg-color-container);\n\n .qd-office-pdf__controls-body {\n opacity: 1;\n }\n }\n }\n }\n\n .controls-fade-leave-active,\n .controls-fade-enter-active {\n transition: opacity 0.28s cubic-bezier(0.38, 0, 0.24, 1);\n }\n\n .controls-fade-enter-from,\n .controls-fade-leave-to {\n opacity: 0;\n }\n</style>\n"],"names":["_createBlock","_unref","TLoading","_createElementBlock","_createElementVNode","_createVNode","_Transition","_openBlock","TTooltip","TButton","TInputNumber","_toDisplayString","TDivider"],"mappings":"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"}
@@ -1,26 +1,26 @@
1
- .qd-office-pdf[data-v-4b46da8b] {
1
+ .qd-office-pdf[data-v-914761f4] {
2
2
  width: 100%;
3
3
  height: 100%;
4
4
  position: relative;
5
5
  background-color: var(--td-bg-color-component);
6
6
  }
7
- .qd-office-pdf__container[data-v-4b46da8b] {
7
+ .qd-office-pdf__container[data-v-914761f4] {
8
8
  position: absolute;
9
9
  width: 100%;
10
10
  max-height: 100%;
11
11
  overflow: auto;
12
12
  }
13
- .qd-office-pdf__viewer[data-v-4b46da8b] {
13
+ .qd-office-pdf__viewer[data-v-914761f4] {
14
14
  width: 100%;
15
15
  height: 100%;
16
16
  }
17
- .qd-office-pdf__viewer[data-v-4b46da8b] .page {
17
+ .qd-office-pdf__viewer[data-v-914761f4] .page {
18
18
  box-sizing: content-box;
19
19
  }
20
- .qd-office-pdf__viewer[data-v-4b46da8b] .annotationLayer :is(.linkAnnotation, .buttonWidgetAnnotation.pushButton):not(.hasBorder) > a {
20
+ .qd-office-pdf__viewer[data-v-914761f4] .annotationLayer :is(.linkAnnotation, .buttonWidgetAnnotation.pushButton):not(.hasBorder) > a {
21
21
  background-color: transparent;
22
22
  }
23
- .qd-office-pdf__controls[data-v-4b46da8b] {
23
+ .qd-office-pdf__controls[data-v-914761f4] {
24
24
  position: absolute;
25
25
  left: 50%;
26
26
  bottom: var(--td-comp-paddingTB-xl) !important;
@@ -32,39 +32,39 @@
32
32
  user-select: none;
33
33
  transition: all 0.2s linear;
34
34
  }
35
- .qd-office-pdf__controls .t-button[data-v-4b46da8b] {
35
+ .qd-office-pdf__controls .t-button[data-v-914761f4] {
36
36
  width: 38px;
37
37
  height: 38px;
38
38
  padding: 0;
39
39
  margin-left: 0;
40
40
  }
41
- .qd-office-pdf__controls-body[data-v-4b46da8b] {
41
+ .qd-office-pdf__controls-body[data-v-914761f4] {
42
42
  display: flex;
43
43
  align-items: center;
44
44
  opacity: 0.5;
45
45
  transition: opacity 0.2s linear;
46
46
  }
47
- .qd-office-pdf__controls-scale[data-v-4b46da8b] {
47
+ .qd-office-pdf__controls-scale[data-v-914761f4] {
48
48
  width: 39px;
49
49
  margin: 0 var(--td-comp-margin-s);
50
50
  }
51
- .qd-office-pdf__controls-page[data-v-4b46da8b] {
51
+ .qd-office-pdf__controls-page[data-v-914761f4] {
52
52
  display: flex;
53
53
  align-items: stretch;
54
54
  }
55
- .qd-office-pdf__controls-page[data-v-4b46da8b] .t-input-number {
55
+ .qd-office-pdf__controls-page[data-v-914761f4] .t-input-number {
56
56
  width: auto;
57
57
  }
58
- .qd-office-pdf__controls-page[data-v-4b46da8b] .t-input-number .t-input {
58
+ .qd-office-pdf__controls-page[data-v-914761f4] .t-input-number .t-input {
59
59
  padding: 0;
60
60
  }
61
- .qd-office-pdf__controls-page[data-v-4b46da8b] .t-input-number .t-input__wrap {
61
+ .qd-office-pdf__controls-page[data-v-914761f4] .t-input-number .t-input__wrap {
62
62
  min-width: 32px;
63
63
  }
64
- .qd-office-pdf__controls-page[data-v-4b46da8b] .t-input-number .t-input__inner {
64
+ .qd-office-pdf__controls-page[data-v-914761f4] .t-input-number .t-input__inner {
65
65
  min-width: 32px;
66
66
  }
67
- .qd-office-pdf__controls-page-input[data-v-4b46da8b] {
67
+ .qd-office-pdf__controls-page-input[data-v-914761f4] {
68
68
  display: inline-flex;
69
69
  align-items: center;
70
70
  flex-shrink: 0;
@@ -74,17 +74,17 @@
74
74
  background-color: var(--td-bg-color-secondarycontainer);
75
75
  border-radius: var(--td-radius-default);
76
76
  }
77
- .qd-office-pdf__controls[data-v-4b46da8b]:hover {
77
+ .qd-office-pdf__controls[data-v-914761f4]:hover {
78
78
  background-color: var(--td-bg-color-container);
79
79
  }
80
- .qd-office-pdf__controls:hover .qd-office-pdf__controls-body[data-v-4b46da8b] {
80
+ .qd-office-pdf__controls:hover .qd-office-pdf__controls-body[data-v-914761f4] {
81
81
  opacity: 1;
82
82
  }
83
- .controls-fade-leave-active[data-v-4b46da8b],
84
- .controls-fade-enter-active[data-v-4b46da8b] {
83
+ .controls-fade-leave-active[data-v-914761f4],
84
+ .controls-fade-enter-active[data-v-914761f4] {
85
85
  transition: opacity 0.28s cubic-bezier(0.38, 0, 0.24, 1);
86
86
  }
87
- .controls-fade-enter-from[data-v-4b46da8b],
88
- .controls-fade-leave-to[data-v-4b46da8b] {
87
+ .controls-fade-enter-from[data-v-914761f4],
88
+ .controls-fade-leave-to[data-v-914761f4] {
89
89
  opacity: 0;
90
90
  }
@@ -1,4 +1,3 @@
1
- import { jsPDF } from "jspdf";
2
1
  function isImageUrl(url) {
3
2
  return /\.(jpg|jpeg|png|gif|webp|bmp)(\?.*)?$/i.test(url);
4
3
  }
@@ -12,6 +11,7 @@ function loadImage(src) {
12
11
  });
13
12
  }
14
13
  async function image2pdf(imageUrl) {
14
+ const { jsPDF } = await import("jspdf");
15
15
  const img = await loadImage(imageUrl);
16
16
  const imgRatio = img.width / img.height;
17
17
  let pdfWidth = 210;
@@ -1 +1 @@
1
- {"version":3,"file":"image2pdf.mjs","sources":["../../../../../src/components/office/pdf/utils/image2pdf.ts"],"sourcesContent":["import { jsPDF } from 'jspdf'\n\n/**\n * 判断 URL 是否为图片\n */\nexport function isImageUrl(url: string): boolean {\n return /\\.(jpg|jpeg|png|gif|webp|bmp)(\\?.*)?$/i.test(url)\n}\n\n/**\n * 加载图片\n */\nfunction loadImage(src: string): Promise<HTMLImageElement> {\n return new Promise((resolve, reject) => {\n const img = new Image()\n img.crossOrigin = 'anonymous'\n img.onload = () => resolve(img)\n img.onerror = reject\n img.src = src\n })\n}\n\n/**\n * 将图片转换为 PDF Blob URL\n */\nexport async function image2pdf(imageUrl: string): Promise<string> {\n const img = await loadImage(imageUrl)\n\n // 计算 PDF 尺寸(A4 为基准,按图片比例调整)\n const imgRatio = img.width / img.height\n let pdfWidth = 210 // A4 宽度 mm\n let pdfHeight = 297 // A4 高度 mm\n\n if (imgRatio > 210 / 297) {\n // 宽图:以宽度为准\n pdfHeight = pdfWidth / imgRatio\n } else {\n // 高图:以高度为准\n pdfWidth = pdfHeight * imgRatio\n }\n\n const pdf = new jsPDF({\n orientation: imgRatio > 1 ? 'landscape' : 'portrait',\n unit: 'mm',\n format: [pdfWidth, pdfHeight]\n })\n\n // 将图片绘制到 canvas\n const canvas = document.createElement('canvas')\n canvas.width = img.width\n canvas.height = img.height\n const ctx = canvas.getContext('2d')\n if (!ctx) throw new Error('Canvas context not available')\n ctx.drawImage(img, 0, 0)\n\n const imgData = canvas.toDataURL('image/png')\n pdf.addImage(imgData, 'PNG', 0, 0, pdfWidth, pdfHeight)\n\n // 生成 Blob URL\n const blob = pdf.output('blob')\n return URL.createObjectURL(blob)\n}\n"],"names":[],"mappings":";AAKO,SAAS,WAAW,KAAsB;AAC/C,SAAO,yCAAyC,KAAK,GAAG;AAC1D;AAKA,SAAS,UAAU,KAAwC;AACzD,SAAO,IAAI,QAAQ,CAAC,SAAS,WAAW;AACtC,UAAM,MAAM,IAAI,MAAA;AAChB,QAAI,cAAc;AAClB,QAAI,SAAS,MAAM,QAAQ,GAAG;AAC9B,QAAI,UAAU;AACd,QAAI,MAAM;AAAA,EACZ,CAAC;AACH;AAKA,eAAsB,UAAU,UAAmC;AACjE,QAAM,MAAM,MAAM,UAAU,QAAQ;AAGpC,QAAM,WAAW,IAAI,QAAQ,IAAI;AACjC,MAAI,WAAW;AACf,MAAI,YAAY;AAEhB,MAAI,WAAW,MAAM,KAAK;AAExB,gBAAY,WAAW;AAAA,EACzB,OAAO;AAEL,eAAW,YAAY;AAAA,EACzB;AAEA,QAAM,MAAM,IAAI,MAAM;AAAA,IACpB,aAAa,WAAW,IAAI,cAAc;AAAA,IAC1C,MAAM;AAAA,IACN,QAAQ,CAAC,UAAU,SAAS;AAAA,EAAA,CAC7B;AAGD,QAAM,SAAS,SAAS,cAAc,QAAQ;AAC9C,SAAO,QAAQ,IAAI;AACnB,SAAO,SAAS,IAAI;AACpB,QAAM,MAAM,OAAO,WAAW,IAAI;AAClC,MAAI,CAAC,IAAK,OAAM,IAAI,MAAM,8BAA8B;AACxD,MAAI,UAAU,KAAK,GAAG,CAAC;AAEvB,QAAM,UAAU,OAAO,UAAU,WAAW;AAC5C,MAAI,SAAS,SAAS,OAAO,GAAG,GAAG,UAAU,SAAS;AAGtD,QAAM,OAAO,IAAI,OAAO,MAAM;AAC9B,SAAO,IAAI,gBAAgB,IAAI;AACjC;"}
1
+ {"version":3,"file":"image2pdf.mjs","sources":["../../../../../src/components/office/pdf/utils/image2pdf.ts"],"sourcesContent":["/**\n * 判断 URL 是否为图片\n */\nexport function isImageUrl(url: string): boolean {\n return /\\.(jpg|jpeg|png|gif|webp|bmp)(\\?.*)?$/i.test(url)\n}\n\n/**\n * 加载图片\n */\nfunction loadImage(src: string): Promise<HTMLImageElement> {\n return new Promise((resolve, reject) => {\n const img = new Image()\n img.crossOrigin = 'anonymous'\n img.onload = () => resolve(img)\n img.onerror = reject\n img.src = src\n })\n}\n\n/**\n * 将图片转换为 PDF Blob URL\n */\nexport async function image2pdf(imageUrl: string): Promise<string> {\n const { jsPDF } = await import('jspdf')\n const img = await loadImage(imageUrl)\n\n // 计算 PDF 尺寸(A4 为基准,按图片比例调整)\n const imgRatio = img.width / img.height\n let pdfWidth = 210 // A4 宽度 mm\n let pdfHeight = 297 // A4 高度 mm\n\n if (imgRatio > 210 / 297) {\n // 宽图:以宽度为准\n pdfHeight = pdfWidth / imgRatio\n } else {\n // 高图:以高度为准\n pdfWidth = pdfHeight * imgRatio\n }\n\n const pdf = new jsPDF({\n orientation: imgRatio > 1 ? 'landscape' : 'portrait',\n unit: 'mm',\n format: [pdfWidth, pdfHeight]\n })\n\n // 将图片绘制到 canvas\n const canvas = document.createElement('canvas')\n canvas.width = img.width\n canvas.height = img.height\n const ctx = canvas.getContext('2d')\n if (!ctx) throw new Error('Canvas context not available')\n ctx.drawImage(img, 0, 0)\n\n const imgData = canvas.toDataURL('image/png')\n pdf.addImage(imgData, 'PNG', 0, 0, pdfWidth, pdfHeight)\n\n // 生成 Blob URL\n const blob = pdf.output('blob')\n return URL.createObjectURL(blob)\n}\n"],"names":[],"mappings":"AAGO,SAAS,WAAW,KAAsB;AAC/C,SAAO,yCAAyC,KAAK,GAAG;AAC1D;AAKA,SAAS,UAAU,KAAwC;AACzD,SAAO,IAAI,QAAQ,CAAC,SAAS,WAAW;AACtC,UAAM,MAAM,IAAI,MAAA;AAChB,QAAI,cAAc;AAClB,QAAI,SAAS,MAAM,QAAQ,GAAG;AAC9B,QAAI,UAAU;AACd,QAAI,MAAM;AAAA,EACZ,CAAC;AACH;AAKA,eAAsB,UAAU,UAAmC;AACjE,QAAM,EAAE,MAAA,IAAU,MAAM,OAAO,OAAO;AACtC,QAAM,MAAM,MAAM,UAAU,QAAQ;AAGpC,QAAM,WAAW,IAAI,QAAQ,IAAI;AACjC,MAAI,WAAW;AACf,MAAI,YAAY;AAEhB,MAAI,WAAW,MAAM,KAAK;AAExB,gBAAY,WAAW;AAAA,EACzB,OAAO;AAEL,eAAW,YAAY;AAAA,EACzB;AAEA,QAAM,MAAM,IAAI,MAAM;AAAA,IACpB,aAAa,WAAW,IAAI,cAAc;AAAA,IAC1C,MAAM;AAAA,IACN,QAAQ,CAAC,UAAU,SAAS;AAAA,EAAA,CAC7B;AAGD,QAAM,SAAS,SAAS,cAAc,QAAQ;AAC9C,SAAO,QAAQ,IAAI;AACnB,SAAO,SAAS,IAAI;AACpB,QAAM,MAAM,OAAO,WAAW,IAAI;AAClC,MAAI,CAAC,IAAK,OAAM,IAAI,MAAM,8BAA8B;AACxD,MAAI,UAAU,KAAK,GAAG,CAAC;AAEvB,QAAM,UAAU,OAAO,UAAU,WAAW;AAC5C,MAAI,SAAS,SAAS,OAAO,GAAG,GAAG,UAAU,SAAS;AAGtD,QAAM,OAAO,IAAI,OAAO,MAAM;AAC9B,SAAO,IAAI,gBAAgB,IAAI;AACjC;"}
@@ -1,44 +1,4 @@
1
1
  import * as tinymce from "./lib/tinymce.mjs";
2
- import "./lib/themes/silver/theme.mjs";
3
- import "./lib/icons/default/icons.mjs";
4
- import "./lib/plugins/link/plugin.mjs";
5
- import "./lib/plugins/code/plugin.mjs";
6
- import "./lib/plugins/table/plugin.mjs";
7
- import "./lib/plugins/lists/plugin.mjs";
8
- import "./lib/plugins/advlist/plugin.mjs";
9
- import "./lib/plugins/anchor/plugin.mjs";
10
- import "./lib/plugins/autolink/plugin.mjs";
11
- import "./lib/plugins/autoresize/plugin.mjs";
12
- import "./lib/plugins/autosave/plugin.mjs";
13
- import "./lib/plugins/charmap/plugin.mjs";
14
- import "./lib/plugins/codesample/plugin.mjs";
15
- import "./lib/plugins/directionality/plugin.mjs";
16
- import "./lib/plugins/emoticons/plugin.mjs";
17
- import "./lib/plugins/fullpage/plugin.mjs";
18
- import "./lib/plugins/fullscreen/plugin.mjs";
19
- import "./lib/plugins/hr/plugin.mjs";
20
- import "./lib/plugins/image/plugin.mjs";
21
- import "./lib/plugins/imagetools/plugin.mjs";
22
- import "./lib/plugins/importcss/plugin.mjs";
23
- import "./lib/plugins/insertdatetime/plugin.mjs";
24
- import "./lib/plugins/media/plugin.mjs";
25
- import "./lib/plugins/nonbreaking/plugin.mjs";
26
- import "./lib/plugins/noneditable/plugin.mjs";
27
- import "./lib/plugins/pagebreak/plugin.mjs";
28
- import "./lib/plugins/preview/plugin.mjs";
29
- import "./lib/plugins/print/plugin.mjs";
30
- import "./lib/plugins/quickbars/plugin.mjs";
31
- import "./lib/plugins/save/plugin.mjs";
32
- import "./lib/plugins/searchreplace/plugin.mjs";
33
- import "./lib/plugins/spellchecker/plugin.mjs";
34
- import "./lib/plugins/tabfocus/plugin.mjs";
35
- import "./lib/plugins/template/plugin.mjs";
36
- import "./lib/plugins/textcolor/plugin.mjs";
37
- import "./lib/plugins/textpattern/plugin.mjs";
38
- import "./lib/plugins/toc/plugin.mjs";
39
- import "./lib/plugins/visualblocks/plugin.mjs";
40
- import "./lib/plugins/visualchars/plugin.mjs";
41
- import "./lib/plugins/wordcount/plugin.mjs";
42
2
  if (typeof window !== "undefined") {
43
3
  window.tinymce = window.tinymce || tinymce;
44
4
  }
@@ -1 +1 @@
1
- {"version":3,"file":"config.mjs","sources":["../../../src/components/tinymce/config.ts"],"sourcesContent":["import type { RawEditorSettings } from './lib/tinymce'\nimport * as tinymce from './lib/tinymce'\n\nif (typeof window !== 'undefined') {\n ;(window as any).tinymce = (window as any).tinymce || tinymce\n}\n\nimport './lib/themes/silver/theme' // 引用主题文件\nimport './lib/icons/default/icons.js' // 引用图标文件\nimport './lib/plugins/link/plugin.js'\nimport './lib/plugins/code/plugin.js'\nimport './lib/plugins/table/plugin.js'\nimport './lib/plugins/lists/plugin.js'\nimport './lib/plugins/advlist/plugin.js'\nimport './lib/plugins/anchor/plugin.js'\nimport './lib/plugins/autolink/plugin.js' //锚点\nimport './lib/plugins/autoresize/plugin.js'\nimport './lib/plugins/autosave/plugin.js'\nimport './lib/plugins/charmap/plugin.js' //特殊字符\nimport './lib/plugins/code/plugin.js' //查看源码\nimport './lib/plugins/codesample/plugin.js' //插入代码\nimport './lib/plugins/directionality/plugin.js' //\nimport './lib/plugins/emoticons/plugin.js' //\nimport './lib/plugins/fullpage/plugin.js' //页面属性编辑\nimport './lib/plugins/fullscreen/plugin.js' //全屏\n// import './lib/plugins/help/plugin.js' //帮助\nimport './lib/plugins/hr/plugin.js' //横线\nimport './lib/plugins/image/plugin.js' //图片\nimport './lib/plugins/imagetools/plugin.js' //图片工具\nimport './lib/plugins/importcss/plugin.js' //图片工具\nimport './lib/plugins/insertdatetime/plugin.js' //时间插入\nimport './lib/plugins/media/plugin.js' //媒体插入\nimport './lib/plugins/nonbreaking/plugin.js' //\nimport './lib/plugins/noneditable/plugin.js' //不间断空格\nimport './lib/plugins/pagebreak/plugin.js' //分页\n// import './lib/plugins/paste/plugin.js' //粘贴\nimport './lib/plugins/preview/plugin.js' //预览\nimport './lib/plugins/print/plugin.js' //打印\nimport './lib/plugins/quickbars/plugin.js' //快捷菜单\nimport './lib/plugins/save/plugin.js' //保存\nimport './lib/plugins/searchreplace/plugin.js' //查询替换\nimport './lib/plugins/spellchecker/plugin.js' //拼写检查\nimport './lib/plugins/tabfocus/plugin.js' //\nimport './lib/plugins/template/plugin.js' //插入模板\nimport './lib/plugins/textcolor/plugin.js' //插入模板\nimport './lib/plugins/textpattern/plugin.js'\nimport './lib/plugins/toc/plugin.js'\nimport './lib/plugins/visualblocks/plugin.js'\nimport './lib/plugins/visualchars/plugin.js'\nimport './lib/plugins/wordcount/plugin.js' //数字统计\n\nexport const DEFAULT_PLUGINS = [\n 'advlist',\n 'anchor',\n 'autolink',\n 'autoresize',\n 'autosave',\n 'charmap',\n 'code',\n 'codesample',\n 'directionality',\n 'emoticons',\n 'fullpage',\n 'fullscreen',\n 'hr',\n 'image',\n 'importcss',\n 'insertdatetime',\n 'link',\n 'lists',\n 'media',\n 'nonbreaking',\n 'pagebreak',\n 'preview',\n 'print',\n 'quickbars',\n 'save',\n 'searchreplace',\n 'spellchecker',\n 'tabfocus',\n 'table',\n 'template',\n 'textcolor',\n 'textpattern',\n 'toc',\n 'visualblocks',\n 'visualchars',\n 'wordcount'\n]\n\nexport const DEFAULT_TOOLBAR =\n 'bold underline italic strikethrough | forecolor backcolor | fontselect fontsizeselect formatselect | lineheight bullist numlist alignleft aligncenter alignright | table image media link | fullscreen'\n\nexport type { RawEditorSettings }\n"],"names":[],"mappings":";;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;AAGA,IAAI,OAAO,WAAW,aAAa;AAC/B,SAAe,UAAW,OAAe,WAAW;AACxD;AA8CO,MAAM,kBAAkB;AAAA,EAC7B;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AACF;AAEO,MAAM,kBACX;"}
1
+ {"version":3,"file":"config.mjs","sources":["../../../src/components/tinymce/config.ts"],"sourcesContent":["import type { RawEditorSettings } from './lib/tinymce'\nimport * as tinymce from './lib/tinymce'\n\nif (typeof window !== 'undefined') {\n ;(window as any).tinymce = (window as any).tinymce || tinymce\n}\n\nimport './lib/themes/silver/theme' // 引用主题文件\nimport './lib/icons/default/icons.js' // 引用图标文件\nimport './lib/plugins/link/plugin.js'\nimport './lib/plugins/code/plugin.js'\nimport './lib/plugins/table/plugin.js'\nimport './lib/plugins/lists/plugin.js'\nimport './lib/plugins/advlist/plugin.js'\nimport './lib/plugins/anchor/plugin.js'\nimport './lib/plugins/autolink/plugin.js' //锚点\nimport './lib/plugins/autoresize/plugin.js'\nimport './lib/plugins/autosave/plugin.js'\nimport './lib/plugins/charmap/plugin.js' //特殊字符\nimport './lib/plugins/code/plugin.js' //查看源码\nimport './lib/plugins/codesample/plugin.js' //插入代码\nimport './lib/plugins/directionality/plugin.js' //\nimport './lib/plugins/emoticons/plugin.js' //\nimport './lib/plugins/fullpage/plugin.js' //页面属性编辑\nimport './lib/plugins/fullscreen/plugin.js' //全屏\n// import './lib/plugins/help/plugin.js' //帮助\nimport './lib/plugins/hr/plugin.js' //横线\nimport './lib/plugins/image/plugin.js' //图片\nimport './lib/plugins/imagetools/plugin.js' //图片工具\nimport './lib/plugins/importcss/plugin.js' //图片工具\nimport './lib/plugins/insertdatetime/plugin.js' //时间插入\nimport './lib/plugins/media/plugin.js' //媒体插入\nimport './lib/plugins/nonbreaking/plugin.js' //\nimport './lib/plugins/noneditable/plugin.js' //不间断空格\nimport './lib/plugins/pagebreak/plugin.js' //分页\n// import './lib/plugins/paste/plugin.js' //粘贴\nimport './lib/plugins/preview/plugin.js' //预览\nimport './lib/plugins/print/plugin.js' //打印\nimport './lib/plugins/quickbars/plugin.js' //快捷菜单\nimport './lib/plugins/save/plugin.js' //保存\nimport './lib/plugins/searchreplace/plugin.js' //查询替换\nimport './lib/plugins/spellchecker/plugin.js' //拼写检查\nimport './lib/plugins/tabfocus/plugin.js' //\nimport './lib/plugins/template/plugin.js' //插入模板\nimport './lib/plugins/textcolor/plugin.js' //插入模板\nimport './lib/plugins/textpattern/plugin.js'\nimport './lib/plugins/toc/plugin.js'\nimport './lib/plugins/visualblocks/plugin.js'\nimport './lib/plugins/visualchars/plugin.js'\nimport './lib/plugins/wordcount/plugin.js' //数字统计\n\nexport const DEFAULT_PLUGINS = [\n 'advlist',\n 'anchor',\n 'autolink',\n 'autoresize',\n 'autosave',\n 'charmap',\n 'code',\n 'codesample',\n 'directionality',\n 'emoticons',\n 'fullpage',\n 'fullscreen',\n 'hr',\n 'image',\n 'importcss',\n 'insertdatetime',\n 'link',\n 'lists',\n 'media',\n 'nonbreaking',\n 'pagebreak',\n 'preview',\n 'print',\n 'quickbars',\n 'save',\n 'searchreplace',\n 'spellchecker',\n 'tabfocus',\n 'table',\n 'template',\n 'textcolor',\n 'textpattern',\n 'toc',\n 'visualblocks',\n 'visualchars',\n 'wordcount'\n]\n\nexport const DEFAULT_TOOLBAR =\n 'bold underline italic strikethrough | forecolor backcolor | fontselect fontsizeselect formatselect | lineheight bullist numlist alignleft aligncenter alignright | table image media link | fullscreen'\n\nexport type { RawEditorSettings }\n"],"names":[],"mappings":";AAGA,IAAI,OAAO,WAAW,aAAa;AAC/B,SAAe,UAAW,OAAe,WAAW;AACxD;AA8CO,MAAM,kBAAkB;AAAA,EAC7B;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AACF;AAEO,MAAM,kBACX;"}
@@ -0,0 +1 @@
1
+ export * from './components/config-provider';
@@ -0,0 +1,7 @@
1
+ import { QdConfigProvider } from "./components/config-provider/index.mjs";
2
+ import { useConfig } from "./components/config-provider/useConfig.mjs";
3
+ export {
4
+ QdConfigProvider,
5
+ useConfig as useQdConfig
6
+ };
7
+ //# sourceMappingURL=config-provider.mjs.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"config-provider.mjs","sources":[],"sourcesContent":[],"names":[],"mappings":";;"}
package/dist/icon.d.ts ADDED
@@ -0,0 +1 @@
1
+ export * from './components/icon';
package/dist/icon.mjs ADDED
@@ -0,0 +1,5 @@
1
+ import { default as default2 } from "./components/icon/index.vue.mjs";
2
+ export {
3
+ default2 as QdIcon
4
+ };
5
+ //# sourceMappingURL=icon.mjs.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"icon.mjs","sources":[],"sourcesContent":[],"names":[],"mappings":";"}