fhrons-mobile-next 2.0.0 → 2.0.2

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (90) hide show
  1. package/.env.poc +8 -0
  2. package/assets/css/colors.js +6 -0
  3. package/assets/css/customVant.less +60 -0
  4. package/assets/css/extra.css +32 -0
  5. package/assets/css/global.css +1 -0
  6. package/assets/css/global.less +1637 -0
  7. package/assets/css/index.js +63 -0
  8. package/assets/css/static.less +607 -0
  9. package/assets/js/func.js +361 -0
  10. package/assets/js/globalData.js +18 -0
  11. package/assets/js/qywxapi.js +484 -0
  12. package/{packages → assets/js}/storage.js +1 -20
  13. package/assets/js/upload.js +269 -0
  14. package/assets/js/validate.js +48 -0
  15. package/assets/js/vant.js +39 -0
  16. package/assets/js/wxapi.js +297 -0
  17. package/assets/vantLang/index.js +172 -0
  18. package/assets/vantLang/lib/en-US.js +95 -0
  19. package/assets/vantLang/lib/es-ES.js +95 -0
  20. package/assets/vantLang/lib/pt-PT.js +96 -0
  21. package/assets/vantLang/lib/zh-CN.js +96 -0
  22. package/assets/vantLang/lib/zh-HK.js +96 -0
  23. package/assets/vantLang/locales/en_US.js +102 -0
  24. package/assets/vantLang/locales/es_ES.js +102 -0
  25. package/assets/vantLang/locales/index.js +12 -0
  26. package/assets/vantLang/locales/pt_PT.js +102 -0
  27. package/assets/vantLang/locales/zh_CN.js +102 -0
  28. package/assets/vantLang/locales/zh_T.js +102 -0
  29. package/babel.config.js +15 -0
  30. package/index.js +68 -33
  31. package/inject-env-plugin.js +29 -0
  32. package/package.json +46 -32
  33. package/packages/areaMobile/index.js +5 -0
  34. package/packages/areaMobile/index.vue +260 -0
  35. package/packages/autoGraph/VueEsign.vue +309 -0
  36. package/packages/autoGraph/index.js +5 -0
  37. package/packages/autoGraph/index.vue +472 -0
  38. package/packages/commonForm/CommonAsyncAreaPicker.vue +223 -0
  39. package/packages/commonForm/CommonDatePicker.vue +152 -0
  40. package/packages/commonForm/CommonForm.vue +786 -0
  41. package/packages/commonForm/CommonFullTimePicker.vue +137 -0
  42. package/packages/commonForm/CommonSinglePicker.vue +121 -0
  43. package/packages/commonForm/CommonYearMonthPicker.vue +127 -0
  44. package/packages/commonForm/index.js +33 -0
  45. package/packages/dialog/index.js +32 -0
  46. package/packages/dialog/index.vue +379 -0
  47. package/packages/index.js +7 -3
  48. package/packages/introduce/index.js +5 -0
  49. package/packages/introduce/index.vue +31 -0
  50. package/packages/loading/Loading.vue +70 -0
  51. package/packages/loading/index.js +43 -0
  52. package/packages/mindMap/index.js +5 -0
  53. package/packages/mindMap/index.vue +437 -0
  54. package/packages/pdfViewer/index.js +12 -0
  55. package/packages/pdfViewer/index.vue +131 -0
  56. package/packages/sharePanel/SheetPanel.vue +316 -0
  57. package/packages/sharePanel/index.js +5 -0
  58. package/packages/sharePanel/index.vue +476 -0
  59. package/packages/sharePanel/props.js +58 -0
  60. package/packages/sharePanel/utils/QyWxShareMixin.js +93 -0
  61. package/packages/sharePanel/utils/shareWay.js +81 -0
  62. package/packages/theme/index copy.js +89 -0
  63. package/packages/theme/index.js +38 -0
  64. package/packages/theme/theme.css +910 -0
  65. package/packages/theme/theme.less +26 -0
  66. package/packages/uploadFile/VanUploadFile.vue +80 -0
  67. package/packages/uploadFile/index.js +5 -0
  68. package/packages/uploadFile/index.vue +725 -0
  69. package/packages/uploadFile/vanUpload.js +5 -0
  70. package/packages/verify/Verify/VerifyPoints.vue +247 -0
  71. package/packages/verify/Verify/VerifySlide.vue +364 -0
  72. package/packages/verify/index.js +5 -0
  73. package/packages/verify/index.vue +416 -0
  74. package/packages/verify/utils/verify.js +53 -0
  75. package/packages/videoPage/index.js +5 -0
  76. package/packages/videoPage/index.vue +440 -0
  77. package/plugins/sensors/fhsensors.js +84 -0
  78. package/plugins/sensors/sensors.js +175 -0
  79. package/plugins/sensors/sensorsFun.js +1387 -0
  80. package/fhrons-mobile-next-2.0.0.tgz +0 -0
  81. package/packages/fhImage/index.js +0 -5
  82. package/packages/fhImage/index.vue +0 -57
  83. package/packages/fhPresetImage/index.js +0 -5
  84. package/packages/fhPresetImage/index.vue +0 -39
  85. package/packages/html2canvas/index.js +0 -29
  86. package/upload copy.js +0 -468
  87. package/utils/tools.js +0 -22
  88. /package/{dist → fhcommon/dist}/fhcommon.min.js +0 -0
  89. /package/{dist → fhcommon/dist}/fhcommon.min.js.LICENSE.txt +0 -0
  90. /package/{upload.js → fhcommon/upload.js} +0 -0
@@ -0,0 +1,437 @@
1
+ <template>
2
+ <div id="MindMap" class="">
3
+ <div id="mountNode" ref="mountNode" />
4
+ </div>
5
+ </template>
6
+
7
+ <script>
8
+ import F6 from "@antv/f6";
9
+ import TreeGraph from "@antv/f6/dist/extends/graph/treeGraph";
10
+ import { wrapTextAndCountNewlines } from "../../assets/js/func";
11
+
12
+ function getSimpleData(data, textKey, childrenKey) {
13
+ const result = {};
14
+ result.text = data[textKey];
15
+ if (data[childrenKey] && data[childrenKey].length) {
16
+ result.children = data[childrenKey].map((item) => {
17
+ return getSimpleData(item, textKey, childrenKey);
18
+ });
19
+ }
20
+ return result;
21
+ }
22
+
23
+ export default {
24
+ name: "MindMap",
25
+ props: {
26
+ mindData: {
27
+ type: Object,
28
+ },
29
+ keyOptions: {
30
+ type: Object,
31
+ },
32
+ },
33
+ data() {
34
+ return {
35
+ canvas: null,
36
+ ctx: null, // 延迟获取的2d context
37
+ renderer: "", // mini、mini-native等,F6需要,标记环境
38
+ isCanvasInit: false, // canvas是否准备好了
39
+ graph: null,
40
+ width: "",
41
+ height: "",
42
+ pixelRatio: 2,
43
+ colorList: [
44
+ // 预设的颜色列表
45
+ {
46
+ mainColor: "#ED92D5",
47
+ subColor: "#FDD5EC",
48
+ },
49
+ {
50
+ mainColor: "#7D6597",
51
+ subColor: "#E2D5FD",
52
+ },
53
+ {
54
+ mainColor: "#479EEB",
55
+ subColor: "#D5EAFD",
56
+ },
57
+ {
58
+ mainColor: "#7EB5A0",
59
+ subColor: "#DFF5E6",
60
+ },
61
+ {
62
+ mainColor: "#FD777C",
63
+ subColor: "#FEEAEC",
64
+ },
65
+ {
66
+ mainColor: "#FEAA66",
67
+ subColor: "#FEEEE5",
68
+ },
69
+ {
70
+ mainColor: "#44C2D9",
71
+ subColor: "#D2F7F7",
72
+ },
73
+ {
74
+ mainColor: "#FFC266",
75
+ subColor: "#FEF6D8",
76
+ },
77
+ {
78
+ mainColor: "#8A86F6",
79
+ subColor: "#E4E3FF",
80
+ },
81
+ {
82
+ mainColor: "#F988A4",
83
+ subColor: "#FFD9E2",
84
+ },
85
+ ],
86
+ startX: null,
87
+ startY: null,
88
+ };
89
+ },
90
+ created() {
91
+ const { innerWidth, innerHeight } = window;
92
+ this.width = innerWidth;
93
+ this.height = innerHeight;
94
+ },
95
+ mounted() {
96
+ const _this = this;
97
+ F6.registerGraph("TreeGraph", TreeGraph);
98
+ const { textKey = "text", childrenKey = "children" } = this.keyOptions;
99
+ const data = getSimpleData(this.mindData, textKey, childrenKey);
100
+ console.log(data);
101
+ function setColorList(data) {
102
+ data.children.forEach((item) => {
103
+ Object.assign(item, { mainColor: data.mainColor, subColor: data.subColor });
104
+ if (item.children && item.children.length) {
105
+ setColorList(item);
106
+ }
107
+ });
108
+ }
109
+ function initData(data) {
110
+ const { wrappedText = "", newlineCount = 0 } = wrapTextAndCountNewlines(data.text, 20);
111
+ Object.assign(data, { wrappedText, newlineCount });
112
+ if (data.children && data.children.length) {
113
+ data.children.forEach((item) => {
114
+ initData(item);
115
+ });
116
+ }
117
+ }
118
+ const fontSize = 16;
119
+ const lineHeight = 24;
120
+ // 创建自定义节点
121
+ F6.registerNode("indentTree-node", {
122
+ draw: function draw(cfg, group) {
123
+ let keyShape;
124
+ // 根节点
125
+ if (cfg.depth === 0) {
126
+ cfg.mainColor = "#555661";
127
+ keyShape = group.addShape("rect", {
128
+ attrs: {
129
+ x: 10,
130
+ y: -12,
131
+ fill: cfg.mainColor,
132
+ radius: 8,
133
+ },
134
+ labelCfg: {
135
+ style: {
136
+ fontSize,
137
+ },
138
+ },
139
+ });
140
+ cfg.children.forEach((item, index) => {
141
+ Object.assign(cfg.children[index], _this.colorList[index > 10 ? index % 10 : index]);
142
+ });
143
+ initData(cfg);
144
+ }
145
+ // 二级子节点
146
+ else if (cfg.depth === 1) {
147
+ // console.log(cfg, group);
148
+ keyShape = group.addShape("rect", {
149
+ attrs: {
150
+ x: 10,
151
+ y: -11,
152
+ fill: cfg.mainColor,
153
+ radius: 8,
154
+ padding: [8, 8, 8, 8],
155
+ },
156
+ labelCfg: {
157
+ style: {
158
+ fill: "#ffffff",
159
+ fontSize,
160
+ },
161
+ },
162
+ });
163
+ setColorList(cfg);
164
+ // 三级子节点
165
+ } else if (cfg.depth === 2) {
166
+ keyShape = group.addShape("rect", {
167
+ attrs: {
168
+ x: 10,
169
+ y: -12,
170
+ fill: "#ffffff",
171
+ stroke: cfg.mainColor,
172
+ radius: 8,
173
+ },
174
+ labelCfg: {
175
+ style: {
176
+ fill: "#000000",
177
+ fontSize,
178
+ },
179
+ background: {
180
+ fill: "#ffffff",
181
+ radius: 8,
182
+ },
183
+ },
184
+ });
185
+ } else {
186
+ keyShape = group.addShape("rect", {
187
+ attrs: {
188
+ x: 10,
189
+ y: -12,
190
+ fill: cfg.subColor,
191
+ radius: 8,
192
+ },
193
+ });
194
+ }
195
+ let isLeaf = false;
196
+ if (cfg.collapsed) {
197
+ group.addShape("marker", {
198
+ attrs: {
199
+ symbol: "triangle",
200
+ x: 4,
201
+ y: -2,
202
+ r: 4,
203
+ fill: "#666",
204
+ },
205
+ name: "marker-shape",
206
+ });
207
+ } else if (cfg.children && cfg.children.length > 0) {
208
+ group.addShape("marker", {
209
+ attrs: {
210
+ symbol: "triangle-down",
211
+ x: 4,
212
+ y: -2,
213
+ r: 4,
214
+ fill: "#666",
215
+ },
216
+ name: "marker-shape",
217
+ });
218
+ } else {
219
+ isLeaf = true;
220
+ }
221
+ const shape = group.addShape("text", {
222
+ attrs: {
223
+ x: 32,
224
+ y: 16 + 24 * cfg.newlineCount,
225
+ text: cfg.wrappedText,
226
+ fill: cfg.depth === 0 || cfg.depth === 1 ? "#fff" : cfg.depth === 2 ? "000" : "rgba(0, 0, 0, 0.70)",
227
+ fontSize,
228
+ lineHeight,
229
+ textAlign: "left",
230
+ fontFamily: typeof window !== "undefined" ? window.getComputedStyle(document.body, null).getPropertyValue("font-family") || "Arial, sans-serif" : "Arial, sans-serif",
231
+ },
232
+ name: "text-shape",
233
+ });
234
+ const bbox = shape.getBBox();
235
+ let backRectW = bbox.width + 45;
236
+ let backRectX = keyShape.attr("x");
237
+ cfg.rectHeight = bbox.height + lineHeight * (cfg.newlineCount + 1);
238
+ keyShape.attr({
239
+ width: backRectW,
240
+ height: bbox.height + lineHeight,
241
+ x: backRectX,
242
+ });
243
+ return keyShape;
244
+ },
245
+ });
246
+
247
+ // registerEdge 创建自定义连接线
248
+ F6.registerEdge(
249
+ "step-line",
250
+ {
251
+ /**
252
+ * 绘制边,包含文本
253
+ * @param {Object} cfg 边的配置项
254
+ * @param {G.Group} group 图形分组,边中的图形对象的容器
255
+ * @return {G.Shape} 绘制的图形,通过 node.get('keyShape') 可以获取到
256
+ */
257
+ draw(cfg, group) {
258
+ const { startPoint, endPoint } = cfg;
259
+ const model = cfg.source._cfg.model; // 获取源节点的模型
260
+ // console.log(model, cfg);
261
+ const radius = 10; // 圆角半径
262
+ const path = [
263
+ ["M", startPoint.x, startPoint.y],
264
+ ["L", startPoint.x, endPoint.y - radius],
265
+ ["A", radius, radius, 0, 0, 0, startPoint.x + radius, endPoint.y],
266
+ ["L", endPoint.x, endPoint.y],
267
+ ];
268
+ const keyShape = group.addShape("path", {
269
+ attrs: {
270
+ stroke: model.mainColor,
271
+ path,
272
+ lineWidth: 1,
273
+ },
274
+ });
275
+ return keyShape;
276
+ },
277
+ getControlPoints(cfg) {
278
+ const { startPoint } = cfg;
279
+ const { endPoint } = cfg;
280
+ return [
281
+ startPoint,
282
+ {
283
+ x: startPoint.x,
284
+ y: endPoint.y,
285
+ },
286
+ endPoint,
287
+ ];
288
+ },
289
+ },
290
+ "polyline"
291
+ );
292
+ const chartContainer = this.$refs.mountNode;
293
+ this.graph = new F6.TreeGraph({
294
+ container: chartContainer, // String | HTMLElement,必须,在 Step 1 中创建的容器 id 或容器本身,如果为小程序,则传null或者不传
295
+ width: chartContainer.clientWidth, // Number,必须,图的宽度
296
+ height: 600, // Number,必须,图的高度
297
+ fitView: true,
298
+ fitViewPadding: [20, 40, 50, 20], // 视口边缘留白
299
+ defaultZoom: 0.8, // 设置初始缩放比例,调整为合适的值
300
+ animate: true,
301
+ modes: {
302
+ default: [
303
+ {
304
+ type: "collapse-expand",
305
+ onChange: function onChange(item, collapsed) {
306
+ const model = item.getModel();
307
+ model.collapsed = collapsed;
308
+ return true;
309
+ },
310
+ },
311
+ {
312
+ type: "drag-canvas",
313
+ direction: "both",
314
+ },
315
+ {
316
+ type: "zoom-canvas",
317
+ direction: "both",
318
+ zoomKey: "shift",
319
+ },
320
+ "customeBehavior",
321
+ ],
322
+ },
323
+ defaultNode: {
324
+ type: "indentTree-node",
325
+ size: 26,
326
+ anchorPoints: [
327
+ [0, 0.5],
328
+ [1, 0.5],
329
+ ],
330
+ },
331
+ defaultEdge: {
332
+ type: "cubic-horizontal",
333
+ },
334
+ layout: {
335
+ type: "indented",
336
+ isHorizontal: true,
337
+ direction: "LR",
338
+ indent: 30,
339
+ // getId: function getId(d) {
340
+ // return d.id;
341
+ // },
342
+ getHeight: function getHeight(cfg) {
343
+ const { newlineCount = 0 } = wrapTextAndCountNewlines(cfg.text, 20);
344
+
345
+ // console.log(cfg.id, newlineCount, "getHeight参数");
346
+ return 16 + lineHeight * (newlineCount + 1);
347
+ },
348
+ getWidth: function getWidth() {
349
+ // console.log(arguments, "getWidth参数");
350
+ return 20;
351
+ },
352
+ getVGap: function getVGap() {
353
+ return 20;
354
+ },
355
+ getHGap: function getHGap() {
356
+ return 100;
357
+ },
358
+ },
359
+ nodeStateStyles: {
360
+ expand: {
361
+ icon: {
362
+ show: true,
363
+ },
364
+ },
365
+ },
366
+ });
367
+ this.graph.on("canvas:tap", (ev) => {
368
+ const shape = ev.target;
369
+ const item = ev.item;
370
+ let type;
371
+ if (item) {
372
+ type = item.getType();
373
+ }
374
+ console.log("shape,item,type", shape, item, type);
375
+ });
376
+ this.graph.edge(() => {
377
+ return {
378
+ type: "step-line",
379
+ };
380
+ });
381
+ this.graph.data(data); // 读取 Step 2 中的数据源到图上
382
+ this.graph.render(); // 渲染图
383
+
384
+ // 计算合适的缩放比例
385
+ const canvasWidth = this.graph.get("width");
386
+ const canvasHeight = this.graph.get("height");
387
+
388
+ // 设置缩放比例和中心位置
389
+ this.graph.zoom(0.3, { x: canvasWidth / 2, y: canvasHeight / 1 });
390
+ this.graph.moveTo(200, 300);
391
+ this.registPCEvent(chartContainer);
392
+ },
393
+ methods: {
394
+ registPCEvent(container) {
395
+ // pc端拖动事件
396
+ container.onmousedown = (event) => {
397
+ this.startX = event.clientX;
398
+ this.startY = event.clientY;
399
+ container.addEventListener("mousemove", this.draggingEvent);
400
+ };
401
+ container.onmouseup = (event) => {
402
+ container.removeEventListener("mousemove", this.draggingEvent);
403
+ };
404
+ container.onmouseleave = (event) => {
405
+ container.removeEventListener("mousemove", this.draggingEvent);
406
+ };
407
+
408
+ container.addEventListener("touchstart", this.preventDefault);
409
+ container.addEventListener("touchmove", this.preventDefault);
410
+ },
411
+ destoryPCEvent(container) {
412
+ container.removeEventListener("touchstart", this.preventDefault);
413
+ container.removeEventListener("touchmove", this.preventDefault);
414
+ },
415
+ draggingEvent(event) {
416
+ const dx = event.clientX - this.startX;
417
+ const dy = event.clientY - this.startY;
418
+ let matrix = this.graph.getGroup().getMatrix().slice().slice();
419
+ if (!matrix) {
420
+ matrix = [1, 0, 0, 1, 0, 0, 0, 0, 1]; // 默认矩阵
421
+ }
422
+ matrix[6] += dx;
423
+ matrix[7] += dy;
424
+
425
+ this.graph.getGroup().setMatrix(matrix);
426
+
427
+ this.startX = event.clientX;
428
+ this.startY = event.clientY;
429
+ },
430
+ preventDefault(event) {
431
+ event.preventDefault();
432
+ },
433
+ },
434
+ beforeDestroy() {},
435
+ };
436
+ </script>
437
+ <style lang="less" scoped></style>
@@ -0,0 +1,12 @@
1
+ import { loadJavaScript } from "../../assets/js/func";
2
+ if (!window.pdfjsLib) {
3
+ loadJavaScript("https://dop-pro-1251973116.file.myqcloud.com/upload/jsfile/funzg/pdf.min.js").then((res) => {
4
+ console.log(window.pdfjsLib);
5
+ });
6
+ }
7
+ import PDFViewer from "./index.vue";
8
+
9
+ PDFViewer.install = (Vue) => {
10
+ Vue.component(PDFViewer.name, PDFViewer);
11
+ };
12
+ export default PDFViewer;
@@ -0,0 +1,131 @@
1
+
2
+ <template>
3
+ <div
4
+ id="PDFViewer"
5
+ ref="pdfContainer"
6
+ class="pdf-container"
7
+ :style="customStyle"
8
+ >
9
+ <div ref="pdf-pages" class="pdf-pages" />
10
+ </div>
11
+ </template>
12
+
13
+ <script>
14
+ export default {
15
+ name: 'PDFViewer',
16
+ props: {
17
+ src: {
18
+ type: String,
19
+ required: true,
20
+ default: ''
21
+ },
22
+ height: {
23
+ type: String || Number,
24
+ default: '100vh'
25
+ },
26
+ scale: {
27
+ type: Number,
28
+ default: 2
29
+ },
30
+ marginBottom: {
31
+ type: Number,
32
+ default: 24
33
+ },
34
+ customStyle: {
35
+ type: Object,
36
+ default: () => {
37
+ return {
38
+ height: '100vh',
39
+ background: '#c8c9cc',
40
+ padding: '24px 0'
41
+ };
42
+ }
43
+ }
44
+ },
45
+ data() {
46
+ return {
47
+ pdf: null,
48
+ visiblePages: [], // 可视区域内的页面索引
49
+ renderedPages: [], // 已渲染的页面索引
50
+ totalPages: 0
51
+ };
52
+ },
53
+ mounted() {
54
+ this.renderPdf();
55
+ },
56
+ methods: {
57
+ async renderPdf() {
58
+ const container = this.$refs.pdfContainer;
59
+ const loadingTask = pdfjsLib.getDocument({
60
+ url: this.src, cMapUrl: 'https://dop-pro-1251973116.file.myqcloud.com/upload/jsfile/funzg/pdfjs-dist@2.10.377/cmaps/',
61
+ cMapPacked: true
62
+ });
63
+
64
+ try {
65
+ this.pdf = await loadingTask.promise;
66
+ this.totalPages = this.pdf.numPages;
67
+ await this.getVisiblePages(container);
68
+ await this.renderVisiblePages();
69
+ } catch (error) {
70
+ console.error('Error rendering PDF:', error);
71
+ }
72
+ },
73
+ async renderVisiblePages() {
74
+ this.visiblePages.forEach((pageNum, index) => {
75
+ if (pageNum > this.totalPages) return;
76
+ // 如果已渲染的列表里找不到新传进来的可见列表则不执行
77
+ this.renderPage(pageNum, 'append');
78
+ });
79
+ },
80
+ async getVisiblePages(container) {
81
+ this.visiblePages = Array.from({ length: this.totalPages }, (_, index) => index + 1);
82
+ },
83
+ async renderPage(pageNum, type) {
84
+ const page = await this.pdf.getPage(pageNum);
85
+ const viewport = page.getViewport({ scale: this.scale });
86
+
87
+ // 调整canvas尺寸以适应页面宽度
88
+ const canvasContainer = document.createElement('div');
89
+ canvasContainer.setAttribute('id', 'pdf-canvas-' + pageNum);
90
+ canvasContainer.setAttribute('class', 'pdf-page');
91
+ canvasContainer.style.marginBottom = this.marginBottom + 'px';
92
+ const canvas = document.createElement('canvas');
93
+ canvas.setAttribute('id', `canvas-${pageNum}`);
94
+ const context = canvas.getContext('2d');
95
+ canvas.width = viewport.width;
96
+ canvas.height = viewport.height;
97
+
98
+ canvas.style.width = '100%';
99
+ canvas.style.height = 'auto';
100
+ const renderContext = {
101
+ canvasContext: context,
102
+ viewport: viewport,
103
+ renderingIntent: 'high-quality'
104
+ };
105
+
106
+ await page.render(renderContext);
107
+ canvasContainer.appendChild(canvas);
108
+ const homeContainer = this.$refs['pdf-pages'];
109
+ if (type === 'append') {
110
+ homeContainer.appendChild(canvasContainer);
111
+ } else {
112
+ homeContainer.insertBefore(canvasContainer, homeContainer.firstChild);
113
+ }
114
+ }
115
+ }
116
+ };
117
+ </script>
118
+
119
+ <style scoped lang="less">
120
+ #PDFViewer {
121
+ overflow: scroll;
122
+ box-sizing: border-box;
123
+ .pdf-container {
124
+ width: 100%;
125
+ overflow-y: scroll;
126
+ }
127
+ .pdf-page {
128
+ margin-bottom: 20px;
129
+ }
130
+ }
131
+ </style>