@canvas-components/react-print-design 0.1.1 → 0.1.3
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/README.md +11 -1
- package/dist/index.cjs +1483 -304
- package/dist/index.d.cts +13 -2
- package/dist/index.d.ts +13 -2
- package/dist/index.js +1485 -306
- package/package.json +4 -4
package/dist/index.cjs
CHANGED
|
@@ -345,7 +345,7 @@ function createCustomComponent(id, name, elements) {
|
|
|
345
345
|
}
|
|
346
346
|
|
|
347
347
|
// src/features/context-menu/menu-items.ts
|
|
348
|
-
function buildPrintDesignMenuItems(page, ids, readonly, instance, onSaveGroup) {
|
|
348
|
+
function buildPrintDesignMenuItems(page, ids, readonly, instance, onSaveGroup, tableCell, tableSelector) {
|
|
349
349
|
const selected = page.elements.filter((item) => ids.includes(item.id));
|
|
350
350
|
const hasSelection = selected.length > 0;
|
|
351
351
|
const locked = selected.some((item) => item.locked);
|
|
@@ -397,47 +397,167 @@ function buildPrintDesignMenuItems(page, ids, readonly, instance, onSaveGroup) {
|
|
|
397
397
|
}
|
|
398
398
|
}
|
|
399
399
|
];
|
|
400
|
-
|
|
400
|
+
const range = instance?.getTableCellSelection();
|
|
401
|
+
const selectedRange = range && selected.some(
|
|
402
|
+
(item) => item.type === "table" && item.id === range.elementId
|
|
403
|
+
) ? range : null;
|
|
404
|
+
const targetCell = tableSelector ? null : tableCell ?? (selectedRange && !selectedRange.selectorKind ? {
|
|
405
|
+
elementId: selectedRange.elementId,
|
|
406
|
+
area: selectedRange.area,
|
|
407
|
+
rowIndex: selectedRange.endRow,
|
|
408
|
+
columnIndex: selectedRange.endColumn
|
|
409
|
+
} : null);
|
|
410
|
+
if (tableSelector) {
|
|
411
|
+
const table = page.elements.find(
|
|
412
|
+
(item) => item.id === tableSelector.elementId
|
|
413
|
+
);
|
|
414
|
+
const noRowEdit = noEdit || table?.type !== "table" || table.dataMode === "binding";
|
|
415
|
+
if (tableSelector.kind === "row" && tableSelector.area === "body")
|
|
416
|
+
items.push(
|
|
417
|
+
{
|
|
418
|
+
key: "insertRowAbove",
|
|
419
|
+
label: "\u5728\u4E0A\u65B9\u65B0\u589E\u884C",
|
|
420
|
+
separator: true,
|
|
421
|
+
disabled: noRowEdit,
|
|
422
|
+
run: (i) => {
|
|
423
|
+
i.insertTableRow(
|
|
424
|
+
tableSelector.elementId,
|
|
425
|
+
tableSelector.index,
|
|
426
|
+
false
|
|
427
|
+
);
|
|
428
|
+
}
|
|
429
|
+
},
|
|
430
|
+
{
|
|
431
|
+
key: "insertRowBelow",
|
|
432
|
+
label: "\u5728\u4E0B\u65B9\u65B0\u589E\u884C",
|
|
433
|
+
disabled: noRowEdit,
|
|
434
|
+
run: (i) => {
|
|
435
|
+
i.insertTableRow(
|
|
436
|
+
tableSelector.elementId,
|
|
437
|
+
tableSelector.index,
|
|
438
|
+
true
|
|
439
|
+
);
|
|
440
|
+
}
|
|
441
|
+
}
|
|
442
|
+
);
|
|
443
|
+
if (tableSelector.kind === "column")
|
|
444
|
+
items.push(
|
|
445
|
+
{
|
|
446
|
+
key: "insertColumnLeft",
|
|
447
|
+
label: "\u5728\u5DE6\u4FA7\u65B0\u589E\u5217",
|
|
448
|
+
separator: true,
|
|
449
|
+
disabled: noEdit,
|
|
450
|
+
run: (i) => {
|
|
451
|
+
i.insertTableColumn(
|
|
452
|
+
tableSelector.elementId,
|
|
453
|
+
tableSelector.index,
|
|
454
|
+
false
|
|
455
|
+
);
|
|
456
|
+
}
|
|
457
|
+
},
|
|
458
|
+
{
|
|
459
|
+
key: "insertColumnRight",
|
|
460
|
+
label: "\u5728\u53F3\u4FA7\u65B0\u589E\u5217",
|
|
461
|
+
disabled: noEdit,
|
|
462
|
+
run: (i) => {
|
|
463
|
+
i.insertTableColumn(
|
|
464
|
+
tableSelector.elementId,
|
|
465
|
+
tableSelector.index,
|
|
466
|
+
true
|
|
467
|
+
);
|
|
468
|
+
}
|
|
469
|
+
}
|
|
470
|
+
);
|
|
471
|
+
if (tableSelector.kind === "all" && table?.type === "table")
|
|
472
|
+
items.push(
|
|
473
|
+
{
|
|
474
|
+
key: "appendRow",
|
|
475
|
+
label: "\u65B0\u589E\u884C",
|
|
476
|
+
separator: true,
|
|
477
|
+
disabled: noRowEdit,
|
|
478
|
+
run: (i) => {
|
|
479
|
+
i.insertTableRow(
|
|
480
|
+
tableSelector.elementId,
|
|
481
|
+
table.dataSource.length - 1,
|
|
482
|
+
true
|
|
483
|
+
);
|
|
484
|
+
}
|
|
485
|
+
},
|
|
486
|
+
{
|
|
487
|
+
key: "appendColumn",
|
|
488
|
+
label: "\u65B0\u589E\u5217",
|
|
489
|
+
disabled: noEdit,
|
|
490
|
+
run: (i) => {
|
|
491
|
+
i.insertTableColumn(
|
|
492
|
+
tableSelector.elementId,
|
|
493
|
+
printDesign.tableLeafColumns(table.columns).filter((column) => !column.hidden).length - 1,
|
|
494
|
+
true
|
|
495
|
+
);
|
|
496
|
+
}
|
|
497
|
+
}
|
|
498
|
+
);
|
|
499
|
+
}
|
|
500
|
+
if (targetCell) {
|
|
501
|
+
const sameTable = selectedRange?.elementId === targetCell.elementId && (selectedRange.area ?? "body") === (targetCell.area ?? "body");
|
|
502
|
+
const merge = (i, row, column, rows, columns) => {
|
|
503
|
+
if (targetCell.area === "header")
|
|
504
|
+
i.mergeTableHeaderCell(
|
|
505
|
+
targetCell.elementId,
|
|
506
|
+
row,
|
|
507
|
+
column,
|
|
508
|
+
rows,
|
|
509
|
+
columns
|
|
510
|
+
);
|
|
511
|
+
else i.mergeTableCell(targetCell.elementId, row, column, rows, columns);
|
|
512
|
+
};
|
|
513
|
+
const startRow = sameTable ? Math.min(selectedRange.startRow, selectedRange.endRow) : targetCell.rowIndex;
|
|
514
|
+
const startColumn = sameTable ? Math.min(selectedRange.startColumn, selectedRange.endColumn) : targetCell.columnIndex;
|
|
515
|
+
const rowSpan = sameTable ? Math.abs(selectedRange.endRow - selectedRange.startRow) + 1 : 1;
|
|
516
|
+
const colSpan = sameTable ? Math.abs(selectedRange.endColumn - selectedRange.startColumn) + 1 : 1;
|
|
401
517
|
items.push(
|
|
402
518
|
{
|
|
403
|
-
key: "
|
|
404
|
-
label: "\
|
|
405
|
-
|
|
519
|
+
key: "mergeCells",
|
|
520
|
+
label: "\u5408\u5E76\u9009\u4E2D\u5355\u5143\u683C",
|
|
521
|
+
separator: true,
|
|
522
|
+
disabled: readonly || locked || !!selectedRange?.selectorKind || rowSpan * colSpan < 2,
|
|
406
523
|
run: (i) => {
|
|
407
|
-
i
|
|
524
|
+
merge(i, startRow, startColumn, rowSpan, colSpan);
|
|
408
525
|
}
|
|
409
526
|
},
|
|
410
527
|
{
|
|
411
|
-
key: "
|
|
412
|
-
label: "\
|
|
413
|
-
|
|
414
|
-
disabled: noEdit,
|
|
528
|
+
key: "mergeRight",
|
|
529
|
+
label: "\u4E0E\u53F3\u4FA7\u5355\u5143\u683C\u5408\u5E76",
|
|
530
|
+
disabled: readonly || locked,
|
|
415
531
|
run: (i) => {
|
|
416
|
-
i.
|
|
532
|
+
merge(i, targetCell.rowIndex, targetCell.columnIndex, 1, 2);
|
|
417
533
|
}
|
|
418
534
|
},
|
|
419
535
|
{
|
|
420
|
-
key: "
|
|
421
|
-
label: "\
|
|
422
|
-
disabled:
|
|
536
|
+
key: "mergeDown",
|
|
537
|
+
label: "\u4E0E\u4E0B\u65B9\u5355\u5143\u683C\u5408\u5E76",
|
|
538
|
+
disabled: readonly || locked,
|
|
423
539
|
run: (i) => {
|
|
424
|
-
i.
|
|
540
|
+
merge(i, targetCell.rowIndex, targetCell.columnIndex, 2, 1);
|
|
425
541
|
}
|
|
426
542
|
},
|
|
427
543
|
{
|
|
428
|
-
key: "
|
|
429
|
-
label: "\
|
|
430
|
-
disabled:
|
|
544
|
+
key: "unmergeCell",
|
|
545
|
+
label: "\u53D6\u6D88\u5355\u5143\u683C\u5408\u5E76",
|
|
546
|
+
disabled: readonly || locked,
|
|
431
547
|
run: (i) => {
|
|
432
|
-
i.
|
|
548
|
+
merge(i, targetCell.rowIndex, targetCell.columnIndex, 1, 1);
|
|
433
549
|
}
|
|
434
|
-
}
|
|
550
|
+
}
|
|
551
|
+
);
|
|
552
|
+
}
|
|
553
|
+
if (hasSelection) {
|
|
554
|
+
items.push(
|
|
435
555
|
{
|
|
436
|
-
key: "
|
|
437
|
-
label: "\
|
|
438
|
-
disabled:
|
|
556
|
+
key: "duplicate",
|
|
557
|
+
label: "\u751F\u6210\u526F\u672C",
|
|
558
|
+
disabled: readonly,
|
|
439
559
|
run: (i) => {
|
|
440
|
-
i.
|
|
560
|
+
i.duplicateElements();
|
|
441
561
|
}
|
|
442
562
|
},
|
|
443
563
|
{
|
|
@@ -465,28 +585,6 @@ function buildPrintDesignMenuItems(page, ids, readonly, instance, onSaveGroup) {
|
|
|
465
585
|
disabled: readonly,
|
|
466
586
|
run: () => onSaveGroup(selectedGroup.name, selectedGroup.elements)
|
|
467
587
|
});
|
|
468
|
-
const alignmentUnits = printDesign.getPrintDesignAlignmentUnits(page.elements, ids);
|
|
469
|
-
for (const [key, label] of [
|
|
470
|
-
["left", "\u5DE6\u5BF9\u9F50"],
|
|
471
|
-
["center", "\u6C34\u5E73\u5C45\u4E2D"],
|
|
472
|
-
["right", "\u53F3\u5BF9\u9F50"],
|
|
473
|
-
["top", "\u9876\u5BF9\u9F50"],
|
|
474
|
-
["middle", "\u5782\u76F4\u5C45\u4E2D"],
|
|
475
|
-
["bottom", "\u5E95\u5BF9\u9F50"],
|
|
476
|
-
["justify-horizontal", "\u6C34\u5E73\u4E24\u7AEF\u5BF9\u9F50\uFF08\u7B49\u95F4\u8DDD\uFF09"],
|
|
477
|
-
["distribute-horizontal", "\u6C34\u5E73\u5206\u6563\u5BF9\u9F50\uFF08\u7B49\u4E2D\u5FC3\u8DDD\uFF09"],
|
|
478
|
-
["justify-vertical", "\u5782\u76F4\u4E24\u7AEF\u5BF9\u9F50\uFF08\u7B49\u95F4\u8DDD\uFF09"],
|
|
479
|
-
["distribute-vertical", "\u5782\u76F4\u5206\u6563\u5BF9\u9F50\uFF08\u7B49\u4E2D\u5FC3\u8DDD\uFF09"]
|
|
480
|
-
])
|
|
481
|
-
items.push({
|
|
482
|
-
key,
|
|
483
|
-
label,
|
|
484
|
-
separator: key === "left",
|
|
485
|
-
disabled: noEdit || key.includes("-") && alignmentUnits.length < 3,
|
|
486
|
-
run: (i) => {
|
|
487
|
-
i.alignSelection(key);
|
|
488
|
-
}
|
|
489
|
-
});
|
|
490
588
|
const allLocked = selected.every((item) => item.locked), allHidden = selected.every((item) => item.visible === false);
|
|
491
589
|
items.push(
|
|
492
590
|
{
|
|
@@ -1251,6 +1349,7 @@ function ElementLayerList(props) {
|
|
|
1251
1349
|
});
|
|
1252
1350
|
},
|
|
1253
1351
|
className: `cc-print-design-layer-item${node.memberIds.every((id) => props.selectedIds.includes(id)) ? " selected" : ""}`,
|
|
1352
|
+
"data-tour-element-id": node.element.id,
|
|
1254
1353
|
children: [
|
|
1255
1354
|
/* @__PURE__ */ jsxRuntime.jsx(
|
|
1256
1355
|
"button",
|
|
@@ -1454,7 +1553,11 @@ function isTableColumns(value) {
|
|
|
1454
1553
|
return Array.isArray(value) && value.every(
|
|
1455
1554
|
(column) => column && typeof column === "object" && (typeof column.dataIndex === "string" || Array.isArray(column.dataIndex) && column.dataIndex.every(
|
|
1456
1555
|
(v) => typeof v === "string" || typeof v === "number"
|
|
1457
|
-
)) && (column.width == null || Number.isFinite(column.width) && column.width > 0) && (column.
|
|
1556
|
+
)) && (column.width == null || Number.isFinite(column.width) && column.width > 0) && (column.cellOverflow == null || ["nowrap", "wrap", "ellipsis", "shrink"].includes(
|
|
1557
|
+
column.cellOverflow
|
|
1558
|
+
)) && (column.cellPadding == null || typeof column.cellPadding === "object" && ["top", "right", "bottom", "left"].every(
|
|
1559
|
+
(side) => column.cellPadding[side] == null || Number.isFinite(column.cellPadding[side]) && column.cellPadding[side] >= 0
|
|
1560
|
+
)) && (column.cellType == null || tableCellTypes.includes(column.cellType)) && (column.children == null || isTableColumns(column.children))
|
|
1458
1561
|
);
|
|
1459
1562
|
}
|
|
1460
1563
|
var tableCellTypeLabels = {
|
|
@@ -1891,8 +1994,10 @@ var TABLE_VERTICAL_ALIGN_OPTIONS = [
|
|
|
1891
1994
|
{ value: "bottom", label: "\u5E95\u90E8" }
|
|
1892
1995
|
];
|
|
1893
1996
|
var TABLE_OVERFLOW_OPTIONS = [
|
|
1997
|
+
{ value: "nowrap", label: "\u8D85\u51FA\u88C1\u5207" },
|
|
1894
1998
|
{ value: "wrap", label: "\u81EA\u52A8\u6362\u884C" },
|
|
1895
|
-
{ value: "ellipsis", label: "\
|
|
1999
|
+
{ value: "ellipsis", label: "\u8D85\u51FA\u663E\u793A..." },
|
|
2000
|
+
{ value: "shrink", label: "\u538B\u7F29\u5B57\u5F62" }
|
|
1896
2001
|
];
|
|
1897
2002
|
var TABLE_SUMMARY_OPTIONS = [
|
|
1898
2003
|
{ value: "none", label: "\u65E0" },
|
|
@@ -2446,6 +2551,7 @@ function LeftPanel(props) {
|
|
|
2446
2551
|
{
|
|
2447
2552
|
type: "button",
|
|
2448
2553
|
className: "cc-print-design-component-item",
|
|
2554
|
+
"data-component-type": type,
|
|
2449
2555
|
disabled: props.contentReadonly,
|
|
2450
2556
|
draggable: !props.contentReadonly,
|
|
2451
2557
|
onDragStart: (event) => startComponentDrag(event, type),
|
|
@@ -2471,6 +2577,7 @@ function LeftPanel(props) {
|
|
|
2471
2577
|
{
|
|
2472
2578
|
type: "button",
|
|
2473
2579
|
className: "cc-print-design-component-item",
|
|
2580
|
+
"data-component-type": type,
|
|
2474
2581
|
disabled: props.contentReadonly,
|
|
2475
2582
|
draggable: !props.contentReadonly,
|
|
2476
2583
|
onDragStart: (event) => startComponentDrag(event, type),
|
|
@@ -2496,6 +2603,7 @@ function LeftPanel(props) {
|
|
|
2496
2603
|
{
|
|
2497
2604
|
type: "button",
|
|
2498
2605
|
className: "cc-print-design-component-item",
|
|
2606
|
+
"data-component-type": type,
|
|
2499
2607
|
disabled: props.contentReadonly,
|
|
2500
2608
|
draggable: !props.contentReadonly,
|
|
2501
2609
|
onDragStart: (event) => startComponentDrag(event, type),
|
|
@@ -2521,6 +2629,7 @@ function LeftPanel(props) {
|
|
|
2521
2629
|
{
|
|
2522
2630
|
type: "button",
|
|
2523
2631
|
className: "cc-print-design-component-item",
|
|
2632
|
+
"data-component-type": "shape",
|
|
2524
2633
|
disabled: props.contentReadonly,
|
|
2525
2634
|
draggable: !props.contentReadonly,
|
|
2526
2635
|
onDragStart: (event) => startComponentDrag(event, "shape", shape),
|
|
@@ -2546,6 +2655,7 @@ function LeftPanel(props) {
|
|
|
2546
2655
|
{
|
|
2547
2656
|
type: "button",
|
|
2548
2657
|
className: "cc-print-design-component-item",
|
|
2658
|
+
"data-component-type": "ruler",
|
|
2549
2659
|
disabled: props.contentReadonly,
|
|
2550
2660
|
draggable: !props.contentReadonly,
|
|
2551
2661
|
onDragStart: (event) => startComponentDrag(event, "ruler", orientation),
|
|
@@ -2571,6 +2681,7 @@ function LeftPanel(props) {
|
|
|
2571
2681
|
{
|
|
2572
2682
|
type: "button",
|
|
2573
2683
|
className: "cc-print-design-component-item",
|
|
2684
|
+
"data-component-type": "grid",
|
|
2574
2685
|
disabled: props.contentReadonly,
|
|
2575
2686
|
draggable: !props.contentReadonly,
|
|
2576
2687
|
onDragStart: (event) => startComponentDrag(event, "grid"),
|
|
@@ -2595,6 +2706,7 @@ function LeftPanel(props) {
|
|
|
2595
2706
|
{
|
|
2596
2707
|
type: "button",
|
|
2597
2708
|
className: "cc-print-design-component-item",
|
|
2709
|
+
"data-component-type": "progress",
|
|
2598
2710
|
disabled: props.contentReadonly,
|
|
2599
2711
|
draggable: !props.contentReadonly,
|
|
2600
2712
|
onDragStart: (event) => startComponentDrag(event, "progress", variant),
|
|
@@ -2620,6 +2732,7 @@ function LeftPanel(props) {
|
|
|
2620
2732
|
{
|
|
2621
2733
|
type: "button",
|
|
2622
2734
|
className: "cc-print-design-component-item",
|
|
2735
|
+
"data-component-type": "list",
|
|
2623
2736
|
disabled: props.contentReadonly,
|
|
2624
2737
|
draggable: !props.contentReadonly,
|
|
2625
2738
|
onDragStart: (event) => startComponentDrag(event, "list", style),
|
|
@@ -2645,6 +2758,7 @@ function LeftPanel(props) {
|
|
|
2645
2758
|
{
|
|
2646
2759
|
type: "button",
|
|
2647
2760
|
className: "cc-print-design-component-item",
|
|
2761
|
+
"data-component-type": "chart",
|
|
2648
2762
|
disabled: props.contentReadonly,
|
|
2649
2763
|
draggable: !props.contentReadonly,
|
|
2650
2764
|
onDragStart: (event) => startComponentDrag(event, "chart", preset.id),
|
|
@@ -2858,42 +2972,86 @@ function elementIcon(type) {
|
|
|
2858
2972
|
const Icon = iconByType[type] ?? reactComponents.ReactBorderOutlined;
|
|
2859
2973
|
return /* @__PURE__ */ jsxRuntime.jsx(Icon, { "aria-hidden": "true" });
|
|
2860
2974
|
}
|
|
2861
|
-
function usePrintPreviewPages(document2, records, enabled) {
|
|
2975
|
+
function usePrintPreviewPages(document2, records, enabled, loadData) {
|
|
2862
2976
|
const [pages, setPages] = react.useState([]);
|
|
2863
2977
|
const [processed, setProcessed] = react.useState(0);
|
|
2864
2978
|
const [error, setError] = react.useState("");
|
|
2979
|
+
const [loading, setLoading] = react.useState(false);
|
|
2980
|
+
const [progress, setProgress] = react.useState("");
|
|
2981
|
+
const [source, setSource] = react.useState(null);
|
|
2865
2982
|
react.useEffect(() => {
|
|
2866
|
-
if (!enabled)
|
|
2867
|
-
|
|
2983
|
+
if (!enabled) {
|
|
2984
|
+
setPages([]);
|
|
2985
|
+
setSource(null);
|
|
2986
|
+
setLoading(false);
|
|
2987
|
+
return;
|
|
2988
|
+
}
|
|
2989
|
+
const controller = new AbortController();
|
|
2868
2990
|
setPages([]);
|
|
2869
2991
|
setProcessed(0);
|
|
2870
2992
|
setError("");
|
|
2993
|
+
setLoading(true);
|
|
2994
|
+
setProgress("\u6B63\u5728\u51C6\u5907\u9884\u89C8\u2026");
|
|
2995
|
+
setSource(null);
|
|
2871
2996
|
const build = async () => {
|
|
2872
2997
|
const pending = [];
|
|
2873
2998
|
try {
|
|
2874
|
-
|
|
2875
|
-
|
|
2876
|
-
|
|
2877
|
-
|
|
2878
|
-
|
|
2879
|
-
|
|
2880
|
-
|
|
2881
|
-
|
|
2882
|
-
|
|
2883
|
-
await new Promise((resolve) => setTimeout(resolve, 0));
|
|
2999
|
+
let progressTime = 0;
|
|
3000
|
+
const loaded = loadData ? await loadData(document2, {
|
|
3001
|
+
signal: controller.signal,
|
|
3002
|
+
onProgress: (completed, total) => {
|
|
3003
|
+
const now = performance.now();
|
|
3004
|
+
if (!controller.signal.aborted && (now - progressTime > 100 || completed === total)) {
|
|
3005
|
+
progressTime = now;
|
|
3006
|
+
setProgress(`\u6B63\u5728\u51C6\u5907\u9884\u89C8 ${completed} / ${total}`);
|
|
3007
|
+
}
|
|
2884
3008
|
}
|
|
3009
|
+
}) : null;
|
|
3010
|
+
controller.signal.throwIfAborted();
|
|
3011
|
+
if (loaded) setSource(loaded);
|
|
3012
|
+
const previewDocument = loaded?.document ?? document2;
|
|
3013
|
+
const previewRecords = loaded ? [loaded.data] : records;
|
|
3014
|
+
let deadline = performance.now() + 8;
|
|
3015
|
+
let publishedAt = 0;
|
|
3016
|
+
for (let position = 0; position < previewRecords.length; position++) {
|
|
3017
|
+
const data = previewRecords[position];
|
|
3018
|
+
for (const page of previewDocument.pages) {
|
|
3019
|
+
controller.signal.throwIfAborted();
|
|
3020
|
+
const result = printDesign.paginatePrintDesignDocument(
|
|
3021
|
+
{ ...previewDocument, pages: [page] },
|
|
3022
|
+
data
|
|
3023
|
+
);
|
|
3024
|
+
for (const page2 of result.pages) pending.push({ page: page2, data });
|
|
3025
|
+
if (performance.now() >= deadline) {
|
|
3026
|
+
if (performance.now() - publishedAt > 100) {
|
|
3027
|
+
setPages([...pending]);
|
|
3028
|
+
setProgress(`\u6B63\u5728\u751F\u6210\u9884\u89C8\uFF0C\u5DF2\u751F\u6210 ${pending.length} \u9875`);
|
|
3029
|
+
publishedAt = performance.now();
|
|
3030
|
+
}
|
|
3031
|
+
await new Promise((resolve) => setTimeout(resolve, 0));
|
|
3032
|
+
deadline = performance.now() + 8;
|
|
3033
|
+
}
|
|
3034
|
+
}
|
|
3035
|
+
setProcessed(position + 1);
|
|
2885
3036
|
}
|
|
3037
|
+
controller.signal.throwIfAborted();
|
|
3038
|
+
setPages(pending);
|
|
3039
|
+
setLoading(false);
|
|
3040
|
+
setProgress("");
|
|
2886
3041
|
} catch (cause) {
|
|
2887
|
-
if (!
|
|
3042
|
+
if (!controller.signal.aborted) {
|
|
2888
3043
|
setError(cause instanceof Error ? cause.message : "\u751F\u6210\u9884\u89C8\u5931\u8D25");
|
|
3044
|
+
setLoading(false);
|
|
3045
|
+
}
|
|
2889
3046
|
}
|
|
2890
3047
|
};
|
|
2891
|
-
void build();
|
|
3048
|
+
const timer = setTimeout(() => void build(), 0);
|
|
2892
3049
|
return () => {
|
|
2893
|
-
|
|
3050
|
+
clearTimeout(timer);
|
|
3051
|
+
controller.abort();
|
|
2894
3052
|
};
|
|
2895
|
-
}, [document2, records, enabled]);
|
|
2896
|
-
return { pages, processed, error };
|
|
3053
|
+
}, [document2, records, enabled, loadData]);
|
|
3054
|
+
return { pages, processed, error, loading, progress, source };
|
|
2897
3055
|
}
|
|
2898
3056
|
function SaveCustomComponentDialog({
|
|
2899
3057
|
defaultName,
|
|
@@ -2944,6 +3102,211 @@ function SaveCustomComponentDialog({
|
|
|
2944
3102
|
}
|
|
2945
3103
|
);
|
|
2946
3104
|
}
|
|
3105
|
+
|
|
3106
|
+
// src/features/templates/template-tour.ts
|
|
3107
|
+
var typeNames = {
|
|
3108
|
+
text: "\u6587\u672C",
|
|
3109
|
+
list: "\u5217\u8868",
|
|
3110
|
+
dateTime: "\u65E5\u671F\u65F6\u95F4",
|
|
3111
|
+
moneyUpper: "\u91D1\u989D\u5927\u5199",
|
|
3112
|
+
pageNumber: "\u9875\u7801",
|
|
3113
|
+
watermark: "\u6C34\u5370",
|
|
3114
|
+
shape: "\u5F62\u72B6",
|
|
3115
|
+
divider: "\u5206\u5272\u7EBF",
|
|
3116
|
+
ruler: "\u6807\u5C3A",
|
|
3117
|
+
grid: "\u7F51\u683C",
|
|
3118
|
+
progress: "\u8FDB\u5EA6\u6761",
|
|
3119
|
+
clock: "\u65F6\u949F",
|
|
3120
|
+
image: "\u56FE\u7247",
|
|
3121
|
+
barcode: "\u6761\u7801",
|
|
3122
|
+
qrcode: "\u4E8C\u7EF4\u7801",
|
|
3123
|
+
chart: "\u56FE\u8868",
|
|
3124
|
+
table: "\u8868\u683C",
|
|
3125
|
+
pivotTable: "\u900F\u89C6\u8868",
|
|
3126
|
+
gantt: "\u7518\u7279\u56FE"
|
|
3127
|
+
};
|
|
3128
|
+
function getTourFields(element) {
|
|
3129
|
+
const fields = [];
|
|
3130
|
+
const values = element;
|
|
3131
|
+
const add = (key, label) => {
|
|
3132
|
+
if (values[key] !== void 0)
|
|
3133
|
+
fields.push({ key, label, value: values[key] });
|
|
3134
|
+
};
|
|
3135
|
+
add("name", "\u56FE\u5C42\u540D\u79F0");
|
|
3136
|
+
add("x", "X \u5750\u6807");
|
|
3137
|
+
add("y", "Y \u5750\u6807");
|
|
3138
|
+
add("width", "\u5BBD\u5EA6");
|
|
3139
|
+
add("height", "\u9AD8\u5EA6");
|
|
3140
|
+
add("rotation", "\u65CB\u8F6C");
|
|
3141
|
+
add("overflowPolicy", "\u8D85\u51FA\u7EB8\u5F20\u5904\u7406");
|
|
3142
|
+
if (element.type === "text") {
|
|
3143
|
+
add("text", "\u6587\u672C\u5185\u5BB9");
|
|
3144
|
+
add("fontSize", "\u5B57\u53F7");
|
|
3145
|
+
add("color", "\u6587\u5B57\u989C\u8272");
|
|
3146
|
+
}
|
|
3147
|
+
if (element.type === "table") {
|
|
3148
|
+
add("columns", "\u5217\u914D\u7F6E JSON");
|
|
3149
|
+
add("dataMode", "\u6570\u636E\u65B9\u5F0F");
|
|
3150
|
+
if (element.dataMode === "binding") add("dataPath", "\u8868\u683C\u6570\u636E\u6E90\u8DEF\u5F84");
|
|
3151
|
+
if (element.dataMode === "binding")
|
|
3152
|
+
add("fallbackToStatic", "\u6570\u636E\u6E90\u7F3A\u5931\u65F6\u4F7F\u7528\u9ED8\u8BA4\u5185\u5BB9");
|
|
3153
|
+
if (element.dataMode !== "binding" || element.fallbackToStatic)
|
|
3154
|
+
add("dataSource", "\u6570\u636E\u5185\u5BB9 JSON");
|
|
3155
|
+
add("showHeader", "\u663E\u793A\u8868\u5934");
|
|
3156
|
+
add("headerRowHeight", "\u8868\u5934\u884C\u9AD8");
|
|
3157
|
+
add("rowHeight", "\u6570\u636E\u884C\u9AD8");
|
|
3158
|
+
add("printRowCount", "\u6BCF\u9875\u884C\u6570");
|
|
3159
|
+
add("borderMode", "\u6253\u5370\u8FB9\u6846");
|
|
3160
|
+
if (element.borderMode === "binding") add("borderPath", "\u8FB9\u6846\u6570\u636E\u5B57\u6BB5");
|
|
3161
|
+
add("cellBorder", "\u5355\u5143\u683C\u8FB9\u6846\u5BBD\u5EA6");
|
|
3162
|
+
add("mergeCell", "\u8FDE\u7EED\u884C\u5206\u7EC4\u5B57\u6BB5");
|
|
3163
|
+
}
|
|
3164
|
+
if (element.type === "pivotTable" || element.type === "gantt") {
|
|
3165
|
+
add("dataMode", "\u6570\u636E\u65B9\u5F0F");
|
|
3166
|
+
if (element.dataMode === "binding") add("dataPath", "\u6570\u636E\u6E90\u8DEF\u5F84");
|
|
3167
|
+
}
|
|
3168
|
+
if (element.type !== "text" && element.type !== "table") {
|
|
3169
|
+
if (element.type !== "shape" && element.type !== "list" && element.type !== "ruler" && element.type !== "grid" && element.type !== "progress") {
|
|
3170
|
+
add("text", "\u6587\u672C\u5185\u5BB9");
|
|
3171
|
+
add("value", "\u5185\u5BB9\u503C");
|
|
3172
|
+
}
|
|
3173
|
+
if (element.type === "pageNumber") add("prefix", "\u9875\u7801\u524D\u7F00");
|
|
3174
|
+
if (element.type === "image") add("src", "\u56FE\u7247\u5730\u5740");
|
|
3175
|
+
}
|
|
3176
|
+
if (element.dataConfig?.mode === "binding") {
|
|
3177
|
+
fields.push({
|
|
3178
|
+
key: "dataConfig.mode",
|
|
3179
|
+
label: "\u6570\u636E\u65B9\u5F0F",
|
|
3180
|
+
value: "binding"
|
|
3181
|
+
});
|
|
3182
|
+
Object.entries(element.dataConfig.bindings ?? {}).forEach(
|
|
3183
|
+
([key, value]) => fields.push({
|
|
3184
|
+
key: `dataConfig.bindings.${key}`,
|
|
3185
|
+
label: `${key}\u7ED1\u5B9A\u8DEF\u5F84`,
|
|
3186
|
+
value
|
|
3187
|
+
})
|
|
3188
|
+
);
|
|
3189
|
+
}
|
|
3190
|
+
return fields;
|
|
3191
|
+
}
|
|
3192
|
+
function formatTourValue(field) {
|
|
3193
|
+
if (field.key === "columns" && Array.isArray(field.value))
|
|
3194
|
+
return `${field.value.length} \u5217`;
|
|
3195
|
+
if (field.key === "dataSource" && Array.isArray(field.value))
|
|
3196
|
+
return `${field.value.length} \u6761\u8BB0\u5F55`;
|
|
3197
|
+
if (field.key === "mergeCell") return "\u6309\u5B57\u6BB5\u5408\u5E76\u8FDE\u7EED\u5355\u5143\u683C";
|
|
3198
|
+
if (field.key === "cellBorder" && field.value && typeof field.value === "object")
|
|
3199
|
+
return `${field.value.width ?? 1} px`;
|
|
3200
|
+
if (typeof field.value === "boolean") return field.value ? "\u5F00\u542F" : "\u5173\u95ED";
|
|
3201
|
+
return String(field.value ?? "").slice(0, 100);
|
|
3202
|
+
}
|
|
3203
|
+
function createPrintDesignTourSteps(document2) {
|
|
3204
|
+
const steps = [
|
|
3205
|
+
{
|
|
3206
|
+
title: `${document2.name} \xB7 \u5B9E\u73B0\u5206\u6790`,
|
|
3207
|
+
description: `\u4ECE\u7A7A\u767D\u753B\u5E03\u5F00\u59CB\uFF0C\u4F9D\u6B21\u64CD\u4F5C\u5DE6\u4FA7\u7EC4\u4EF6\u9762\u677F\u3001\u753B\u5E03\u3001\u53F3\u4FA7\u5C5E\u6027\u9762\u677F\u548C\u56FE\u5C42\u5217\u8868\uFF0C\u5B8C\u6210 ${document2.pages.length} \u9875\u6A21\u677F\u3002\u6F14\u793A\u7ED3\u675F\u540E\u6062\u590D\u5F53\u524D\u6A21\u677F\u3002`,
|
|
3208
|
+
target: ".cc-print-design-brand",
|
|
3209
|
+
operation: "intro"
|
|
3210
|
+
}
|
|
3211
|
+
];
|
|
3212
|
+
document2.pages.forEach((page, pageIndex) => {
|
|
3213
|
+
steps.push({
|
|
3214
|
+
title: `\u7B2C ${pageIndex + 1} \u9875 \xB7 \u65B0\u589E\u5E76\u914D\u7F6E\u9875\u9762`,
|
|
3215
|
+
description: `\u5728\u5DE6\u4FA7\u300C\u9875\u9762\u300D\u9762\u677F\u65B0\u589E\u9875\u9762\uFF0C\u8BBE\u7F6E\u7EB8\u5F20 ${page.width} \xD7 ${page.height} mm\uFF0C\u65B9\u5411\u4E3A${page.orientation === "landscape" ? "\u6A2A\u5411" : "\u7EB5\u5411"}\u3002${page.margins ? `\u9875\u8FB9\u8DDD\uFF08\u4E0A/\u53F3/\u4E0B/\u5DE6\uFF09\uFF1A${page.margins.top}/${page.margins.right}/${page.margins.bottom}/${page.margins.left} mm\u3002` : ""}`,
|
|
3216
|
+
target: ".cc-print-design-left-panel",
|
|
3217
|
+
operation: "page",
|
|
3218
|
+
pageIndex,
|
|
3219
|
+
pageId: page.id
|
|
3220
|
+
});
|
|
3221
|
+
page.elements.forEach((element, elementIndex) => {
|
|
3222
|
+
const title = `${pageIndex + 1}.${elementIndex + 1} ${element.name || typeNames[element.type] || element.type}`;
|
|
3223
|
+
const location = {
|
|
3224
|
+
pageIndex,
|
|
3225
|
+
elementIndex,
|
|
3226
|
+
pageId: page.id,
|
|
3227
|
+
elementId: element.id
|
|
3228
|
+
};
|
|
3229
|
+
steps.push(
|
|
3230
|
+
{
|
|
3231
|
+
...location,
|
|
3232
|
+
operation: "select",
|
|
3233
|
+
title: `${title} \xB7 \u9009\u62E9\u7EC4\u4EF6`,
|
|
3234
|
+
description: `\u6253\u5F00\u5DE6\u4FA7\u300C\u7EC4\u4EF6\u300D\u9762\u677F\uFF0C\u627E\u5230\u300C${typeNames[element.type] || element.type}\u300D\u5E76\u51C6\u5907\u6DFB\u52A0\u3002`,
|
|
3235
|
+
target: `.cc-print-design-component-item[data-component-type="${element.type}"]`
|
|
3236
|
+
},
|
|
3237
|
+
{
|
|
3238
|
+
...location,
|
|
3239
|
+
operation: "add",
|
|
3240
|
+
title: `${title} \xB7 \u65B0\u589E\u56FE\u5C42`,
|
|
3241
|
+
description: "\u70B9\u51FB\u5DE6\u4FA7\u7EC4\u4EF6\u6216\u62D6\u5230\u753B\u5E03\uFF0C\u5148\u521B\u5EFA\u4F7F\u7528\u9ED8\u8BA4\u914D\u7F6E\u7684\u56FE\u5C42\u3002\u63A5\u4E0B\u6765\u9010\u9879\u586B\u5199\u53F3\u4FA7\u5C5E\u6027\u3002",
|
|
3242
|
+
target: ".cc-print-design-canvas-frame"
|
|
3243
|
+
},
|
|
3244
|
+
...getTourFields(element).map(
|
|
3245
|
+
(field, fieldIndex) => ({
|
|
3246
|
+
...location,
|
|
3247
|
+
operation: "field",
|
|
3248
|
+
fieldIndex,
|
|
3249
|
+
fieldKey: field.key,
|
|
3250
|
+
title: `${title} \xB7 \u914D\u7F6E\u300C${field.label}\u300D`,
|
|
3251
|
+
description: `\u5728\u53F3\u4FA7\u5C5E\u6027\u9762\u677F\u7684\u300C${field.label}\u300D\u8868\u5355\u9879\u4E2D\u8BBE\u7F6E\uFF1A${formatTourValue(field)}\u3002`,
|
|
3252
|
+
target: `.cc-print-design-properties-host [data-tour-field="${field.key}"]`
|
|
3253
|
+
})
|
|
3254
|
+
),
|
|
3255
|
+
{
|
|
3256
|
+
...location,
|
|
3257
|
+
operation: "layer",
|
|
3258
|
+
title: `${title} \xB7 \u68C0\u67E5\u56FE\u5C42`,
|
|
3259
|
+
description: `\u5207\u6362\u5DE6\u4FA7\u300C\u56FE\u5C42\u300D\u9762\u677F\uFF0C\u786E\u8BA4\u300C${element.name || typeNames[element.type] || element.type}\u300D\u5DF2\u52A0\u5165\u7B2C ${pageIndex + 1} \u9875\uFF0C\u5E76\u4FDD\u6301\u5F53\u524D\u5C42\u53E0\u987A\u5E8F\u3002`,
|
|
3260
|
+
target: ".cc-print-design-left-panel"
|
|
3261
|
+
}
|
|
3262
|
+
);
|
|
3263
|
+
});
|
|
3264
|
+
});
|
|
3265
|
+
return steps;
|
|
3266
|
+
}
|
|
3267
|
+
function createPrintDesignTourDocument(source, step) {
|
|
3268
|
+
if (step.operation === "intro")
|
|
3269
|
+
return { ...source, pages: [{ ...source.pages[0], elements: [] }] };
|
|
3270
|
+
const pageIndex = step.pageIndex ?? 0;
|
|
3271
|
+
const pages = source.pages.slice(0, pageIndex + 1).map((page, index) => {
|
|
3272
|
+
if (index < pageIndex) return page;
|
|
3273
|
+
if (step.operation === "page") return { ...page, elements: [] };
|
|
3274
|
+
const elementIndex = step.elementIndex ?? 0;
|
|
3275
|
+
const elements = page.elements.slice(0, elementIndex);
|
|
3276
|
+
if (step.operation !== "select") {
|
|
3277
|
+
const element = page.elements[elementIndex];
|
|
3278
|
+
elements.push(
|
|
3279
|
+
step.operation === "add" || step.operation === "field" ? createTourElement(element, step) : element
|
|
3280
|
+
);
|
|
3281
|
+
}
|
|
3282
|
+
return { ...page, elements };
|
|
3283
|
+
});
|
|
3284
|
+
return { ...source, pages };
|
|
3285
|
+
}
|
|
3286
|
+
function createTourElement(element, step) {
|
|
3287
|
+
const draft = {
|
|
3288
|
+
...createDefaultPrintDesignElement(element.type),
|
|
3289
|
+
id: element.id
|
|
3290
|
+
};
|
|
3291
|
+
if (step.operation === "field") {
|
|
3292
|
+
for (const field of getTourFields(element).slice(
|
|
3293
|
+
0,
|
|
3294
|
+
(step.fieldIndex ?? -1) + 1
|
|
3295
|
+
)) {
|
|
3296
|
+
if (field.key === "dataConfig.mode") {
|
|
3297
|
+
draft.dataConfig = { mode: field.value, bindings: {} };
|
|
3298
|
+
} else if (field.key.startsWith("dataConfig.bindings.")) {
|
|
3299
|
+
const config = draft.dataConfig ?? {
|
|
3300
|
+
mode: "binding",
|
|
3301
|
+
bindings: {}
|
|
3302
|
+
};
|
|
3303
|
+
config.bindings[field.key.slice("dataConfig.bindings.".length)] = String(field.value);
|
|
3304
|
+
draft.dataConfig = config;
|
|
3305
|
+
} else draft[field.key] = field.value;
|
|
3306
|
+
}
|
|
3307
|
+
}
|
|
3308
|
+
return draft;
|
|
3309
|
+
}
|
|
2947
3310
|
function PrintExportNameDialog({
|
|
2948
3311
|
format,
|
|
2949
3312
|
defaultFileName,
|
|
@@ -3157,32 +3520,39 @@ function NameField(props) {
|
|
|
3157
3520
|
if (!props.disabled && (name || props.allowEmpty) && name !== props.value)
|
|
3158
3521
|
props.onCommit(name);
|
|
3159
3522
|
};
|
|
3160
|
-
return /* @__PURE__ */ jsxRuntime.jsxs(
|
|
3161
|
-
|
|
3162
|
-
|
|
3163
|
-
|
|
3164
|
-
|
|
3165
|
-
|
|
3166
|
-
|
|
3167
|
-
|
|
3168
|
-
|
|
3169
|
-
|
|
3170
|
-
|
|
3171
|
-
|
|
3172
|
-
|
|
3173
|
-
event.
|
|
3174
|
-
|
|
3175
|
-
|
|
3176
|
-
|
|
3177
|
-
|
|
3178
|
-
|
|
3179
|
-
|
|
3180
|
-
|
|
3523
|
+
return /* @__PURE__ */ jsxRuntime.jsxs(
|
|
3524
|
+
"label",
|
|
3525
|
+
{
|
|
3526
|
+
className: "cc-print-design-field cc-print-design-field-full",
|
|
3527
|
+
"data-tour-field": "name",
|
|
3528
|
+
children: [
|
|
3529
|
+
/* @__PURE__ */ jsxRuntime.jsx("span", { children: props.label }),
|
|
3530
|
+
/* @__PURE__ */ jsxRuntime.jsx(
|
|
3531
|
+
reactComponents.ReactInput,
|
|
3532
|
+
{
|
|
3533
|
+
"aria-label": props.label,
|
|
3534
|
+
value: draft,
|
|
3535
|
+
disabled: props.disabled,
|
|
3536
|
+
onChange: (event) => setDraft(event.target.value),
|
|
3537
|
+
onBlur: commit,
|
|
3538
|
+
onKeyDown: (event) => {
|
|
3539
|
+
if (event.nativeEvent.isComposing) return;
|
|
3540
|
+
if (event.key === "Enter") {
|
|
3541
|
+
event.preventDefault();
|
|
3542
|
+
event.currentTarget.blur();
|
|
3543
|
+
} else if (event.key === "Escape") {
|
|
3544
|
+
event.preventDefault();
|
|
3545
|
+
event.stopPropagation();
|
|
3546
|
+
cancelled.current = true;
|
|
3547
|
+
setDraft(props.value);
|
|
3548
|
+
event.currentTarget.blur();
|
|
3549
|
+
}
|
|
3550
|
+
}
|
|
3181
3551
|
}
|
|
3182
|
-
|
|
3183
|
-
|
|
3184
|
-
|
|
3185
|
-
|
|
3552
|
+
)
|
|
3553
|
+
]
|
|
3554
|
+
}
|
|
3555
|
+
);
|
|
3186
3556
|
}
|
|
3187
3557
|
function ElementLayerControls({
|
|
3188
3558
|
index,
|
|
@@ -3720,53 +4090,68 @@ function TableRowSettingsPanel({
|
|
|
3720
4090
|
className: "cc-print-design-property-section",
|
|
3721
4091
|
contentClassName: "cc-print-design-table-data cc-print-design-row-settings",
|
|
3722
4092
|
children: [
|
|
3723
|
-
/* @__PURE__ */ jsxRuntime.jsx(
|
|
4093
|
+
/* @__PURE__ */ jsxRuntime.jsx("div", { "data-tour-field": "showHeader", children: /* @__PURE__ */ jsxRuntime.jsx(
|
|
3724
4094
|
reactComponents.ReactCheckbox,
|
|
3725
4095
|
{
|
|
3726
4096
|
checked: element.showHeader !== false,
|
|
3727
4097
|
onChange: (e) => onChange({ showHeader: e.target.checked }),
|
|
3728
4098
|
children: "\u663E\u793A\u8868\u5934"
|
|
3729
4099
|
}
|
|
4100
|
+
) }),
|
|
4101
|
+
TABLE_ROW_FIELDS.map(([key, label, fallback]) => /* @__PURE__ */ jsxRuntime.jsxs(
|
|
4102
|
+
"label",
|
|
4103
|
+
{
|
|
4104
|
+
className: "cc-print-design-column-half",
|
|
4105
|
+
"data-tour-field": key,
|
|
4106
|
+
children: [
|
|
4107
|
+
label,
|
|
4108
|
+
/* @__PURE__ */ jsxRuntime.jsx(
|
|
4109
|
+
reactComponents.ReactInputNumber,
|
|
4110
|
+
{
|
|
4111
|
+
min: printDesign.toDisplayUnit(
|
|
4112
|
+
key === "fontSize" ? printDesign.fromDisplayUnit(1, "pt") : 1,
|
|
4113
|
+
displayUnit
|
|
4114
|
+
),
|
|
4115
|
+
step: 0.1,
|
|
4116
|
+
value: printDesign.toDisplayUnit(
|
|
4117
|
+
key === "fontSize" ? printDesign.fromDisplayUnit(element[key] ?? fallback, "pt") : element[key] ?? fallback,
|
|
4118
|
+
displayUnit
|
|
4119
|
+
),
|
|
4120
|
+
onChange: (value) => {
|
|
4121
|
+
if (value != null && Number.isFinite(value) && value > 0)
|
|
4122
|
+
onChange({
|
|
4123
|
+
[key]: key === "fontSize" ? printDesign.toDisplayUnit(printDesign.fromDisplayUnit(value, displayUnit), "pt") : printDesign.fromDisplayUnit(value, displayUnit)
|
|
4124
|
+
});
|
|
4125
|
+
}
|
|
4126
|
+
}
|
|
4127
|
+
)
|
|
4128
|
+
]
|
|
4129
|
+
},
|
|
4130
|
+
key
|
|
4131
|
+
)),
|
|
4132
|
+
/* @__PURE__ */ jsxRuntime.jsxs(
|
|
4133
|
+
"label",
|
|
4134
|
+
{
|
|
4135
|
+
className: "cc-print-design-column-half",
|
|
4136
|
+
"data-tour-field": "printRowCount",
|
|
4137
|
+
children: [
|
|
4138
|
+
"\u6BCF\u9875\u884C\u6570\uFF080 \u4E0D\u9650\uFF09",
|
|
4139
|
+
/* @__PURE__ */ jsxRuntime.jsx(
|
|
4140
|
+
reactComponents.ReactInputNumber,
|
|
4141
|
+
{
|
|
4142
|
+
"aria-label": "\u6BCF\u9875\u884C\u6570",
|
|
4143
|
+
min: 0,
|
|
4144
|
+
precision: 0,
|
|
4145
|
+
value: element.printRowCount ?? 0,
|
|
4146
|
+
onChange: (value) => {
|
|
4147
|
+
if (value != null && Number.isFinite(value))
|
|
4148
|
+
onChange(resizeTableRowCount(element, value));
|
|
4149
|
+
}
|
|
4150
|
+
}
|
|
4151
|
+
)
|
|
4152
|
+
]
|
|
4153
|
+
}
|
|
3730
4154
|
),
|
|
3731
|
-
TABLE_ROW_FIELDS.map(([key, label, fallback]) => /* @__PURE__ */ jsxRuntime.jsxs("label", { className: "cc-print-design-column-half", children: [
|
|
3732
|
-
label,
|
|
3733
|
-
/* @__PURE__ */ jsxRuntime.jsx(
|
|
3734
|
-
reactComponents.ReactInputNumber,
|
|
3735
|
-
{
|
|
3736
|
-
min: printDesign.toDisplayUnit(
|
|
3737
|
-
key === "fontSize" ? printDesign.fromDisplayUnit(1, "pt") : 1,
|
|
3738
|
-
displayUnit
|
|
3739
|
-
),
|
|
3740
|
-
step: 0.1,
|
|
3741
|
-
value: printDesign.toDisplayUnit(
|
|
3742
|
-
key === "fontSize" ? printDesign.fromDisplayUnit(element[key] ?? fallback, "pt") : element[key] ?? fallback,
|
|
3743
|
-
displayUnit
|
|
3744
|
-
),
|
|
3745
|
-
onChange: (value) => {
|
|
3746
|
-
if (value != null && Number.isFinite(value) && value > 0)
|
|
3747
|
-
onChange({
|
|
3748
|
-
[key]: key === "fontSize" ? printDesign.toDisplayUnit(printDesign.fromDisplayUnit(value, displayUnit), "pt") : printDesign.fromDisplayUnit(value, displayUnit)
|
|
3749
|
-
});
|
|
3750
|
-
}
|
|
3751
|
-
}
|
|
3752
|
-
)
|
|
3753
|
-
] }, key)),
|
|
3754
|
-
/* @__PURE__ */ jsxRuntime.jsxs("label", { className: "cc-print-design-column-half", children: [
|
|
3755
|
-
"\u6BCF\u9875\u884C\u6570\uFF080 \u4E0D\u9650\uFF09",
|
|
3756
|
-
/* @__PURE__ */ jsxRuntime.jsx(
|
|
3757
|
-
reactComponents.ReactInputNumber,
|
|
3758
|
-
{
|
|
3759
|
-
"aria-label": "\u6BCF\u9875\u884C\u6570",
|
|
3760
|
-
min: 0,
|
|
3761
|
-
precision: 0,
|
|
3762
|
-
value: element.printRowCount ?? 0,
|
|
3763
|
-
onChange: (value) => {
|
|
3764
|
-
if (value != null && Number.isFinite(value))
|
|
3765
|
-
onChange(resizeTableRowCount(element, value));
|
|
3766
|
-
}
|
|
3767
|
-
}
|
|
3768
|
-
)
|
|
3769
|
-
] }),
|
|
3770
4155
|
/* @__PURE__ */ jsxRuntime.jsx(
|
|
3771
4156
|
reactComponents.ReactButton,
|
|
3772
4157
|
{
|
|
@@ -3825,38 +4210,46 @@ function TableJsonField({
|
|
|
3825
4210
|
setDraft(JSON.stringify(value, null, 2));
|
|
3826
4211
|
setError("");
|
|
3827
4212
|
}, [value]);
|
|
3828
|
-
return /* @__PURE__ */ jsxRuntime.jsxs(
|
|
3829
|
-
|
|
3830
|
-
|
|
3831
|
-
|
|
3832
|
-
|
|
3833
|
-
|
|
3834
|
-
|
|
3835
|
-
|
|
3836
|
-
|
|
3837
|
-
|
|
3838
|
-
|
|
3839
|
-
|
|
3840
|
-
|
|
3841
|
-
|
|
3842
|
-
onClick: () => {
|
|
3843
|
-
try {
|
|
3844
|
-
const next = JSON.parse(draft);
|
|
3845
|
-
if (!validate(next))
|
|
3846
|
-
throw new Error("\u683C\u5F0F\u65E0\u6548\uFF0C\u8BF7\u68C0\u67E5\u6570\u7EC4\u53CA\u5B57\u6BB5\u7C7B\u578B\u3002");
|
|
3847
|
-
onChange(next);
|
|
3848
|
-
setError("");
|
|
3849
|
-
} catch (error2) {
|
|
3850
|
-
setError(error2 instanceof Error ? error2.message : "JSON \u683C\u5F0F\u65E0\u6548");
|
|
4213
|
+
return /* @__PURE__ */ jsxRuntime.jsxs(
|
|
4214
|
+
reactComponents.ReactCollapsePanel,
|
|
4215
|
+
{
|
|
4216
|
+
className: "cc-print-design-table-json",
|
|
4217
|
+
title: label,
|
|
4218
|
+
"data-tour-field": label === "\u5217\u914D\u7F6E JSON" ? "columns" : label === "\u9759\u6001\u6570\u636E JSON" || label === "\u9ED8\u8BA4\u6570\u636E JSON" ? "dataSource" : void 0,
|
|
4219
|
+
children: [
|
|
4220
|
+
/* @__PURE__ */ jsxRuntime.jsx(
|
|
4221
|
+
reactComponents.ReactTextArea,
|
|
4222
|
+
{
|
|
4223
|
+
className: "canvas-react-scrollbar",
|
|
4224
|
+
"aria-label": label,
|
|
4225
|
+
value: draft,
|
|
4226
|
+
onChange: (e) => setDraft(e.target.value)
|
|
3851
4227
|
}
|
|
3852
|
-
|
|
3853
|
-
children:
|
|
3854
|
-
|
|
3855
|
-
|
|
3856
|
-
|
|
3857
|
-
|
|
3858
|
-
|
|
3859
|
-
|
|
4228
|
+
),
|
|
4229
|
+
error ? /* @__PURE__ */ jsxRuntime.jsx("p", { role: "alert", children: error }) : null,
|
|
4230
|
+
/* @__PURE__ */ jsxRuntime.jsxs(
|
|
4231
|
+
reactComponents.ReactButton,
|
|
4232
|
+
{
|
|
4233
|
+
onClick: () => {
|
|
4234
|
+
try {
|
|
4235
|
+
const next = JSON.parse(draft);
|
|
4236
|
+
if (!validate(next))
|
|
4237
|
+
throw new Error("\u683C\u5F0F\u65E0\u6548\uFF0C\u8BF7\u68C0\u67E5\u6570\u7EC4\u53CA\u5B57\u6BB5\u7C7B\u578B\u3002");
|
|
4238
|
+
onChange(next);
|
|
4239
|
+
setError("");
|
|
4240
|
+
} catch (error2) {
|
|
4241
|
+
setError(error2 instanceof Error ? error2.message : "JSON \u683C\u5F0F\u65E0\u6548");
|
|
4242
|
+
}
|
|
4243
|
+
},
|
|
4244
|
+
children: [
|
|
4245
|
+
"\u5E94\u7528",
|
|
4246
|
+
label
|
|
4247
|
+
]
|
|
4248
|
+
}
|
|
4249
|
+
)
|
|
4250
|
+
]
|
|
4251
|
+
}
|
|
4252
|
+
);
|
|
3860
4253
|
}
|
|
3861
4254
|
function TableRowsPanel({
|
|
3862
4255
|
rows,
|
|
@@ -3991,7 +4384,7 @@ function TableBindingPanel({
|
|
|
3991
4384
|
const source = printDesign.resolveTableDataSource(data, element.dataPath);
|
|
3992
4385
|
const rows = printDesign.resolveTableRows(element, data);
|
|
3993
4386
|
return /* @__PURE__ */ jsxRuntime.jsxs("div", { children: [
|
|
3994
|
-
/* @__PURE__ */ jsxRuntime.jsxs("div", { className: "cc-print-design-field", children: [
|
|
4387
|
+
/* @__PURE__ */ jsxRuntime.jsxs("div", { className: "cc-print-design-field", "data-tour-field": "dataPath", children: [
|
|
3995
4388
|
/* @__PURE__ */ jsxRuntime.jsx("span", { children: "\u8868\u683C\u6570\u636E\u6E90\u8DEF\u5F84" }),
|
|
3996
4389
|
/* @__PURE__ */ jsxRuntime.jsx(
|
|
3997
4390
|
DataPathPicker,
|
|
@@ -4031,13 +4424,13 @@ function TableDataPanel({
|
|
|
4031
4424
|
title: "\u6570\u636E",
|
|
4032
4425
|
defaultOpen: true,
|
|
4033
4426
|
children: [
|
|
4034
|
-
/* @__PURE__ */ jsxRuntime.jsx(
|
|
4427
|
+
/* @__PURE__ */ jsxRuntime.jsx("div", { "data-tour-field": "dataMode", children: /* @__PURE__ */ jsxRuntime.jsx(
|
|
4035
4428
|
DataModeButtons,
|
|
4036
4429
|
{
|
|
4037
4430
|
value: element.dataMode ?? "static",
|
|
4038
4431
|
onChange: (mode) => onChange({ dataMode: mode })
|
|
4039
4432
|
}
|
|
4040
|
-
),
|
|
4433
|
+
) }),
|
|
4041
4434
|
element.dataMode === "binding" ? /* @__PURE__ */ jsxRuntime.jsxs(jsxRuntime.Fragment, { children: [
|
|
4042
4435
|
/* @__PURE__ */ jsxRuntime.jsx(
|
|
4043
4436
|
TableBindingPanel,
|
|
@@ -4048,14 +4441,14 @@ function TableDataPanel({
|
|
|
4048
4441
|
onChange
|
|
4049
4442
|
}
|
|
4050
4443
|
),
|
|
4051
|
-
/* @__PURE__ */ jsxRuntime.jsx(
|
|
4444
|
+
/* @__PURE__ */ jsxRuntime.jsx("div", { "data-tour-field": "fallbackToStatic", children: /* @__PURE__ */ jsxRuntime.jsx(
|
|
4052
4445
|
reactComponents.ReactCheckbox,
|
|
4053
4446
|
{
|
|
4054
4447
|
checked: element.fallbackToStatic ?? false,
|
|
4055
4448
|
onChange: (event) => onChange({ fallbackToStatic: event.target.checked }),
|
|
4056
4449
|
children: "\u6570\u636E\u6E90\u7F3A\u5931\u65F6\u4F7F\u7528\u9ED8\u8BA4\u5185\u5BB9"
|
|
4057
4450
|
}
|
|
4058
|
-
),
|
|
4451
|
+
) }),
|
|
4059
4452
|
element.fallbackToStatic && /* @__PURE__ */ jsxRuntime.jsxs(reactComponents.ReactCollapsePanel, { title: "\u9ED8\u8BA4\u5185\u5BB9", defaultOpen: true, children: [
|
|
4060
4453
|
/* @__PURE__ */ jsxRuntime.jsx(
|
|
4061
4454
|
TableRowsPanel,
|
|
@@ -4101,6 +4494,7 @@ function TableDataPanel({
|
|
|
4101
4494
|
function TableLayoutPanel({
|
|
4102
4495
|
element,
|
|
4103
4496
|
onChange,
|
|
4497
|
+
samples = [],
|
|
4104
4498
|
showGrandTotalOption = false
|
|
4105
4499
|
}) {
|
|
4106
4500
|
const { displayUnit } = useEditorPreferences();
|
|
@@ -4112,7 +4506,36 @@ function TableLayoutPanel({
|
|
|
4112
4506
|
className: "cc-print-design-property-section",
|
|
4113
4507
|
contentClassName: "cc-print-design-table-data cc-print-design-compact-grid",
|
|
4114
4508
|
children: [
|
|
4115
|
-
/* @__PURE__ */ jsxRuntime.jsxs("label", { children: [
|
|
4509
|
+
/* @__PURE__ */ jsxRuntime.jsxs("label", { "data-tour-field": "borderMode", children: [
|
|
4510
|
+
"\u6253\u5370\u8FB9\u6846",
|
|
4511
|
+
/* @__PURE__ */ jsxRuntime.jsx(
|
|
4512
|
+
reactComponents.ReactSelect,
|
|
4513
|
+
{
|
|
4514
|
+
value: element.borderMode ?? "show",
|
|
4515
|
+
options: [
|
|
4516
|
+
{ label: "\u663E\u793A", value: "show" },
|
|
4517
|
+
{ label: "\u9690\u85CF", value: "hide" },
|
|
4518
|
+
{ label: "\u52A8\u6001\u6570\u636E", value: "binding" }
|
|
4519
|
+
],
|
|
4520
|
+
onChange: (value) => onChange({
|
|
4521
|
+
borderMode: value
|
|
4522
|
+
})
|
|
4523
|
+
}
|
|
4524
|
+
)
|
|
4525
|
+
] }),
|
|
4526
|
+
element.borderMode === "binding" && /* @__PURE__ */ jsxRuntime.jsxs("div", { className: "cc-print-design-field", "data-tour-field": "borderPath", children: [
|
|
4527
|
+
/* @__PURE__ */ jsxRuntime.jsx("span", { children: "\u8FB9\u6846\u6570\u636E\u5B57\u6BB5" }),
|
|
4528
|
+
/* @__PURE__ */ jsxRuntime.jsx(
|
|
4529
|
+
DataPathPicker,
|
|
4530
|
+
{
|
|
4531
|
+
label: "\u8FB9\u6846\u6570\u636E\u5B57\u6BB5",
|
|
4532
|
+
value: element.borderPath ?? "",
|
|
4533
|
+
samples,
|
|
4534
|
+
onChange: (borderPath) => onChange({ borderPath })
|
|
4535
|
+
}
|
|
4536
|
+
)
|
|
4537
|
+
] }),
|
|
4538
|
+
/* @__PURE__ */ jsxRuntime.jsxs("label", { "data-tour-field": "cellBorder", children: [
|
|
4116
4539
|
"\u8FB9\u6846\u5BBD\u5EA6",
|
|
4117
4540
|
/* @__PURE__ */ jsxRuntime.jsx(
|
|
4118
4541
|
reactComponents.ReactInputNumber,
|
|
@@ -4168,45 +4591,434 @@ function TableLayoutPanel({
|
|
|
4168
4591
|
contentClassName: "cc-print-design-table-data",
|
|
4169
4592
|
children: [
|
|
4170
4593
|
/* @__PURE__ */ jsxRuntime.jsx(
|
|
4171
|
-
reactComponents.ReactCheckbox,
|
|
4594
|
+
reactComponents.ReactCheckbox,
|
|
4595
|
+
{
|
|
4596
|
+
checked: element.showSummary !== false,
|
|
4597
|
+
onChange: (event) => onChange({ showSummary: event.target.checked }),
|
|
4598
|
+
children: "\u663E\u793A\u6C47\u603B\u884C"
|
|
4599
|
+
}
|
|
4600
|
+
),
|
|
4601
|
+
/* @__PURE__ */ jsxRuntime.jsxs("label", { children: [
|
|
4602
|
+
"\u6C47\u603B\u884C\u9AD8",
|
|
4603
|
+
/* @__PURE__ */ jsxRuntime.jsx(
|
|
4604
|
+
reactComponents.ReactInputNumber,
|
|
4605
|
+
{
|
|
4606
|
+
"aria-label": "\u6C47\u603B\u884C\u9AD8",
|
|
4607
|
+
min: printDesign.toDisplayUnit(1, displayUnit),
|
|
4608
|
+
value: printDesign.toDisplayUnit(
|
|
4609
|
+
element.summaryRowHeight ?? element.rowHeight ?? 8,
|
|
4610
|
+
displayUnit
|
|
4611
|
+
),
|
|
4612
|
+
onChange: (value) => {
|
|
4613
|
+
if (value != null && Number.isFinite(value) && value > 0)
|
|
4614
|
+
onChange({
|
|
4615
|
+
summaryRowHeight: printDesign.fromDisplayUnit(value, displayUnit)
|
|
4616
|
+
});
|
|
4617
|
+
}
|
|
4618
|
+
}
|
|
4619
|
+
)
|
|
4620
|
+
] }),
|
|
4621
|
+
showGrandTotalOption ? /* @__PURE__ */ jsxRuntime.jsx(
|
|
4622
|
+
reactComponents.ReactCheckbox,
|
|
4623
|
+
{
|
|
4624
|
+
checked: element.showGrandTotal ?? true,
|
|
4625
|
+
onChange: (event) => onChange({ showGrandTotal: event.target.checked }),
|
|
4626
|
+
children: "\u663E\u793A\u603B\u8BA1\u5217"
|
|
4627
|
+
}
|
|
4628
|
+
) : null
|
|
4629
|
+
]
|
|
4630
|
+
}
|
|
4631
|
+
)
|
|
4632
|
+
] });
|
|
4633
|
+
}
|
|
4634
|
+
function TableCellLayoutPanel({
|
|
4635
|
+
element,
|
|
4636
|
+
onChange
|
|
4637
|
+
}) {
|
|
4638
|
+
const { displayUnit } = useEditorPreferences();
|
|
4639
|
+
return /* @__PURE__ */ jsxRuntime.jsxs(
|
|
4640
|
+
reactComponents.ReactCollapsePanel,
|
|
4641
|
+
{
|
|
4642
|
+
title: "\u7EDF\u4E00\u5355\u5143\u683C\u5E03\u5C40",
|
|
4643
|
+
className: "cc-print-design-property-section",
|
|
4644
|
+
contentClassName: "cc-print-design-column-grid",
|
|
4645
|
+
children: [
|
|
4646
|
+
/* @__PURE__ */ jsxRuntime.jsxs("label", { className: "cc-print-design-column-half", children: [
|
|
4647
|
+
"\u6C34\u5E73\u5BF9\u9F50",
|
|
4648
|
+
/* @__PURE__ */ jsxRuntime.jsx(
|
|
4649
|
+
reactComponents.ReactSelect,
|
|
4650
|
+
{
|
|
4651
|
+
value: element.cellAlign ?? "left",
|
|
4652
|
+
options: TABLE_ALIGN_OPTIONS,
|
|
4653
|
+
onChange: (value) => onChange({
|
|
4654
|
+
cellAlign: value
|
|
4655
|
+
})
|
|
4656
|
+
}
|
|
4657
|
+
)
|
|
4658
|
+
] }),
|
|
4659
|
+
/* @__PURE__ */ jsxRuntime.jsxs("label", { className: "cc-print-design-column-half", children: [
|
|
4660
|
+
"\u5782\u76F4\u5BF9\u9F50",
|
|
4661
|
+
/* @__PURE__ */ jsxRuntime.jsx(
|
|
4662
|
+
reactComponents.ReactSelect,
|
|
4663
|
+
{
|
|
4664
|
+
value: element.cellVerticalAlign ?? "middle",
|
|
4665
|
+
options: TABLE_VERTICAL_ALIGN_OPTIONS,
|
|
4666
|
+
onChange: (value) => onChange({
|
|
4667
|
+
cellVerticalAlign: value
|
|
4668
|
+
})
|
|
4669
|
+
}
|
|
4670
|
+
)
|
|
4671
|
+
] }),
|
|
4672
|
+
/* @__PURE__ */ jsxRuntime.jsxs("label", { children: [
|
|
4673
|
+
"\u5185\u5BB9\u8D85\u51FA",
|
|
4674
|
+
/* @__PURE__ */ jsxRuntime.jsx(
|
|
4675
|
+
reactComponents.ReactSelect,
|
|
4676
|
+
{
|
|
4677
|
+
value: element.cellOverflow ?? "wrap",
|
|
4678
|
+
options: TABLE_OVERFLOW_OPTIONS,
|
|
4679
|
+
onChange: (value) => onChange({
|
|
4680
|
+
cellOverflow: value
|
|
4681
|
+
})
|
|
4682
|
+
}
|
|
4683
|
+
)
|
|
4684
|
+
] }),
|
|
4685
|
+
["top", "right", "bottom", "left"].map((side) => /* @__PURE__ */ jsxRuntime.jsxs("label", { className: "cc-print-design-column-half", children: [
|
|
4686
|
+
{ top: "\u4E0A", right: "\u53F3", bottom: "\u4E0B", left: "\u5DE6" }[side],
|
|
4687
|
+
"\u5185\u8FB9\u8DDD",
|
|
4688
|
+
/* @__PURE__ */ jsxRuntime.jsx(
|
|
4689
|
+
reactComponents.ReactInputNumber,
|
|
4690
|
+
{
|
|
4691
|
+
min: 0,
|
|
4692
|
+
step: 0.1,
|
|
4693
|
+
value: printDesign.toDisplayUnit(
|
|
4694
|
+
printDesign.fromDisplayUnit(
|
|
4695
|
+
element.cellPadding?.[side] ?? (side === "left" || side === "right" ? 4 : 0),
|
|
4696
|
+
"px"
|
|
4697
|
+
),
|
|
4698
|
+
displayUnit
|
|
4699
|
+
),
|
|
4700
|
+
onChange: (value) => {
|
|
4701
|
+
if (value != null && Number.isFinite(value) && value >= 0)
|
|
4702
|
+
onChange({
|
|
4703
|
+
cellPadding: {
|
|
4704
|
+
...element.cellPadding,
|
|
4705
|
+
[side]: printDesign.toDisplayUnit(
|
|
4706
|
+
printDesign.fromDisplayUnit(value, displayUnit),
|
|
4707
|
+
"px"
|
|
4708
|
+
)
|
|
4709
|
+
}
|
|
4710
|
+
});
|
|
4711
|
+
}
|
|
4712
|
+
}
|
|
4713
|
+
)
|
|
4714
|
+
] }, side))
|
|
4715
|
+
]
|
|
4716
|
+
}
|
|
4717
|
+
);
|
|
4718
|
+
}
|
|
4719
|
+
function TableCellsPanel({
|
|
4720
|
+
element,
|
|
4721
|
+
data,
|
|
4722
|
+
samples = [],
|
|
4723
|
+
tableCellSelection,
|
|
4724
|
+
onMergeSelectedTableCells,
|
|
4725
|
+
onChange
|
|
4726
|
+
}) {
|
|
4727
|
+
const [row, setRow] = react.useState(1);
|
|
4728
|
+
const [column, setColumn] = react.useState(1);
|
|
4729
|
+
const rows = printDesign.resolveTableRows(element, data);
|
|
4730
|
+
const rowCount = Math.max(rows.length, element.printRowCount ?? 0, 1);
|
|
4731
|
+
const columnCount = Math.max(
|
|
4732
|
+
printDesign.tableLeafColumns(element.columns.filter((item) => !item.hidden)).filter(
|
|
4733
|
+
(item) => !item.hidden
|
|
4734
|
+
).length,
|
|
4735
|
+
1
|
|
4736
|
+
);
|
|
4737
|
+
const rowIndex = Math.min(Math.max(row - 1, 0), rowCount - 1);
|
|
4738
|
+
const columnIndex = Math.min(Math.max(column - 1, 0), columnCount - 1);
|
|
4739
|
+
const cell = element.cells?.find(
|
|
4740
|
+
(item) => item.rowIndex === rowIndex && item.columnIndex === columnIndex
|
|
4741
|
+
);
|
|
4742
|
+
const update = (patch) => {
|
|
4743
|
+
const next = { rowIndex, columnIndex, ...cell, ...patch };
|
|
4744
|
+
const rowSpan = Math.max(1, next.rowSpan ?? 1);
|
|
4745
|
+
const colSpan = Math.max(1, next.colSpan ?? 1);
|
|
4746
|
+
if ((rowSpan > 1 || colSpan > 1) && element.cells?.some(
|
|
4747
|
+
(item) => (item.rowIndex !== rowIndex || item.columnIndex !== columnIndex) && ((item.rowSpan ?? 1) > 1 || (item.colSpan ?? 1) > 1) && rowIndex < item.rowIndex + Math.max(1, item.rowSpan ?? 1) && rowIndex + rowSpan > item.rowIndex && columnIndex < item.columnIndex + Math.max(1, item.colSpan ?? 1) && columnIndex + colSpan > item.columnIndex
|
|
4748
|
+
))
|
|
4749
|
+
return;
|
|
4750
|
+
onChange({
|
|
4751
|
+
cells: [
|
|
4752
|
+
...(element.cells ?? []).filter(
|
|
4753
|
+
(item) => item.rowIndex !== rowIndex || item.columnIndex !== columnIndex
|
|
4754
|
+
),
|
|
4755
|
+
next
|
|
4756
|
+
]
|
|
4757
|
+
});
|
|
4758
|
+
};
|
|
4759
|
+
const merged = (cell?.rowSpan ?? 1) > 1 || (cell?.colSpan ?? 1) > 1;
|
|
4760
|
+
const selected = tableCellSelection?.elementId === element.id ? tableCellSelection : null;
|
|
4761
|
+
const canMergeSelection = !!selected && !selected.selectorKind && (selected.startRow !== selected.endRow || selected.startColumn !== selected.endColumn);
|
|
4762
|
+
return /* @__PURE__ */ jsxRuntime.jsxs(
|
|
4763
|
+
reactComponents.ReactCollapsePanel,
|
|
4764
|
+
{
|
|
4765
|
+
title: "\u5355\u5143\u683C",
|
|
4766
|
+
className: "cc-print-design-property-section",
|
|
4767
|
+
contentClassName: "cc-print-design-table-data cc-print-design-compact-grid",
|
|
4768
|
+
children: [
|
|
4769
|
+
/* @__PURE__ */ jsxRuntime.jsx(
|
|
4770
|
+
reactComponents.ReactButton,
|
|
4771
|
+
{
|
|
4772
|
+
disabled: !canMergeSelection || !onMergeSelectedTableCells,
|
|
4773
|
+
onClick: onMergeSelectedTableCells,
|
|
4774
|
+
children: "\u5408\u5E76\u9009\u4E2D\u5355\u5143\u683C"
|
|
4775
|
+
}
|
|
4776
|
+
),
|
|
4777
|
+
/* @__PURE__ */ jsxRuntime.jsxs("label", { children: [
|
|
4778
|
+
"\u884C",
|
|
4779
|
+
/* @__PURE__ */ jsxRuntime.jsx(
|
|
4780
|
+
reactComponents.ReactInputNumber,
|
|
4781
|
+
{
|
|
4782
|
+
min: 1,
|
|
4783
|
+
max: rowCount,
|
|
4784
|
+
precision: 0,
|
|
4785
|
+
value: row,
|
|
4786
|
+
onChange: (value) => {
|
|
4787
|
+
if (value != null)
|
|
4788
|
+
setRow(Math.min(rowCount, Math.max(1, Math.round(value))));
|
|
4789
|
+
}
|
|
4790
|
+
}
|
|
4791
|
+
)
|
|
4792
|
+
] }),
|
|
4793
|
+
/* @__PURE__ */ jsxRuntime.jsxs("label", { children: [
|
|
4794
|
+
"\u5217",
|
|
4795
|
+
/* @__PURE__ */ jsxRuntime.jsx(
|
|
4796
|
+
reactComponents.ReactInputNumber,
|
|
4797
|
+
{
|
|
4798
|
+
min: 1,
|
|
4799
|
+
max: columnCount,
|
|
4800
|
+
precision: 0,
|
|
4801
|
+
value: column,
|
|
4802
|
+
onChange: (value) => {
|
|
4803
|
+
if (value != null)
|
|
4804
|
+
setColumn(Math.min(columnCount, Math.max(1, Math.round(value))));
|
|
4805
|
+
}
|
|
4806
|
+
}
|
|
4807
|
+
)
|
|
4808
|
+
] }),
|
|
4809
|
+
/* @__PURE__ */ jsxRuntime.jsxs("label", { children: [
|
|
4810
|
+
"\u5408\u5E76\u884C\u6570",
|
|
4811
|
+
/* @__PURE__ */ jsxRuntime.jsx(
|
|
4812
|
+
reactComponents.ReactInputNumber,
|
|
4813
|
+
{
|
|
4814
|
+
min: 1,
|
|
4815
|
+
max: rowCount - rowIndex,
|
|
4816
|
+
precision: 0,
|
|
4817
|
+
value: cell?.rowSpan ?? 1,
|
|
4818
|
+
onChange: (value) => {
|
|
4819
|
+
if (value != null)
|
|
4820
|
+
update({
|
|
4821
|
+
rowSpan: Math.min(
|
|
4822
|
+
rowCount - rowIndex,
|
|
4823
|
+
Math.max(1, Math.round(value))
|
|
4824
|
+
)
|
|
4825
|
+
});
|
|
4826
|
+
}
|
|
4827
|
+
}
|
|
4828
|
+
)
|
|
4829
|
+
] }),
|
|
4830
|
+
/* @__PURE__ */ jsxRuntime.jsxs("label", { children: [
|
|
4831
|
+
"\u5408\u5E76\u5217\u6570",
|
|
4832
|
+
/* @__PURE__ */ jsxRuntime.jsx(
|
|
4833
|
+
reactComponents.ReactInputNumber,
|
|
4834
|
+
{
|
|
4835
|
+
min: 1,
|
|
4836
|
+
max: columnCount - columnIndex,
|
|
4837
|
+
precision: 0,
|
|
4838
|
+
value: cell?.colSpan ?? 1,
|
|
4839
|
+
onChange: (value) => {
|
|
4840
|
+
if (value != null)
|
|
4841
|
+
update({
|
|
4842
|
+
colSpan: Math.min(
|
|
4843
|
+
columnCount - columnIndex,
|
|
4844
|
+
Math.max(1, Math.round(value))
|
|
4845
|
+
)
|
|
4846
|
+
});
|
|
4847
|
+
}
|
|
4848
|
+
}
|
|
4849
|
+
)
|
|
4850
|
+
] }),
|
|
4851
|
+
/* @__PURE__ */ jsxRuntime.jsx(
|
|
4852
|
+
reactComponents.ReactButton,
|
|
4853
|
+
{
|
|
4854
|
+
disabled: !merged,
|
|
4855
|
+
onClick: () => update({ rowSpan: 1, colSpan: 1 }),
|
|
4856
|
+
children: "\u53D6\u6D88\u5408\u5E76"
|
|
4857
|
+
}
|
|
4858
|
+
),
|
|
4859
|
+
/* @__PURE__ */ jsxRuntime.jsxs("label", { children: [
|
|
4860
|
+
"\u5BF9\u89D2\u7EBF",
|
|
4861
|
+
/* @__PURE__ */ jsxRuntime.jsx(
|
|
4862
|
+
reactComponents.ReactSelect,
|
|
4863
|
+
{
|
|
4864
|
+
value: cell?.diagonal ?? "none",
|
|
4865
|
+
options: [
|
|
4866
|
+
{ label: "\u65E0", value: "none" },
|
|
4867
|
+
{ label: "\u5DE6\u4E0A\u81F3\u53F3\u4E0B", value: "down" },
|
|
4868
|
+
{ label: "\u5DE6\u4E0B\u81F3\u53F3\u4E0A", value: "up" }
|
|
4869
|
+
],
|
|
4870
|
+
onChange: (value) => update({
|
|
4871
|
+
diagonal: value === "none" ? void 0 : value
|
|
4872
|
+
})
|
|
4873
|
+
}
|
|
4874
|
+
)
|
|
4875
|
+
] }),
|
|
4876
|
+
cell?.diagonal && /* @__PURE__ */ jsxRuntime.jsxs(jsxRuntime.Fragment, { children: [
|
|
4877
|
+
/* @__PURE__ */ jsxRuntime.jsxs("label", { children: [
|
|
4878
|
+
"\u8D77\u59CB\u5185\u5BB9",
|
|
4879
|
+
/* @__PURE__ */ jsxRuntime.jsx(
|
|
4880
|
+
reactComponents.ReactInput,
|
|
4881
|
+
{
|
|
4882
|
+
value: cell.diagonalStart ?? "",
|
|
4883
|
+
onChange: (event) => update({ diagonalStart: event.target.value })
|
|
4884
|
+
}
|
|
4885
|
+
)
|
|
4886
|
+
] }),
|
|
4887
|
+
/* @__PURE__ */ jsxRuntime.jsxs("label", { children: [
|
|
4888
|
+
"\u7ED3\u675F\u5185\u5BB9",
|
|
4889
|
+
/* @__PURE__ */ jsxRuntime.jsx(
|
|
4890
|
+
reactComponents.ReactInput,
|
|
4891
|
+
{
|
|
4892
|
+
value: cell.diagonalEnd ?? "",
|
|
4893
|
+
onChange: (event) => update({ diagonalEnd: event.target.value })
|
|
4894
|
+
}
|
|
4895
|
+
)
|
|
4896
|
+
] })
|
|
4897
|
+
] }),
|
|
4898
|
+
/* @__PURE__ */ jsxRuntime.jsxs("label", { children: [
|
|
4899
|
+
"\u80CC\u666F\u989C\u8272",
|
|
4900
|
+
/* @__PURE__ */ jsxRuntime.jsx(
|
|
4901
|
+
reactComponents.ReactColorPicker,
|
|
4902
|
+
{
|
|
4903
|
+
value: cell?.backgroundColor ?? "#ffffff",
|
|
4904
|
+
onChange: (backgroundColor) => update({ backgroundColor })
|
|
4905
|
+
}
|
|
4906
|
+
)
|
|
4907
|
+
] }),
|
|
4908
|
+
/* @__PURE__ */ jsxRuntime.jsxs("label", { children: [
|
|
4909
|
+
"\u6587\u5B57\u989C\u8272",
|
|
4910
|
+
/* @__PURE__ */ jsxRuntime.jsx(
|
|
4911
|
+
reactComponents.ReactColorPicker,
|
|
4912
|
+
{
|
|
4913
|
+
value: cell?.color ?? "#000000",
|
|
4914
|
+
onChange: (color) => update({ color })
|
|
4915
|
+
}
|
|
4916
|
+
)
|
|
4917
|
+
] }),
|
|
4918
|
+
/* @__PURE__ */ jsxRuntime.jsxs("label", { children: [
|
|
4919
|
+
"\u8FB9\u6846\u989C\u8272",
|
|
4920
|
+
/* @__PURE__ */ jsxRuntime.jsx(
|
|
4921
|
+
reactComponents.ReactColorPicker,
|
|
4922
|
+
{
|
|
4923
|
+
value: cell?.borderColor ?? element.cellBorder?.color ?? "#000000",
|
|
4924
|
+
onChange: (borderColor) => update({ borderColor })
|
|
4925
|
+
}
|
|
4926
|
+
)
|
|
4927
|
+
] }),
|
|
4928
|
+
/* @__PURE__ */ jsxRuntime.jsxs("div", { className: "cc-print-design-field", children: [
|
|
4929
|
+
/* @__PURE__ */ jsxRuntime.jsx("span", { children: "\u52A8\u6001\u8FB9\u6846\u5B57\u6BB5" }),
|
|
4930
|
+
/* @__PURE__ */ jsxRuntime.jsx(
|
|
4931
|
+
DataPathPicker,
|
|
4932
|
+
{
|
|
4933
|
+
label: "\u52A8\u6001\u8FB9\u6846\u5B57\u6BB5",
|
|
4934
|
+
value: cell?.borderPath ?? "",
|
|
4935
|
+
samples: [rows[rowIndex] ?? {}, ...samples],
|
|
4936
|
+
onChange: (borderPath) => update({ borderPath })
|
|
4937
|
+
}
|
|
4938
|
+
)
|
|
4939
|
+
] }),
|
|
4940
|
+
/* @__PURE__ */ jsxRuntime.jsx(
|
|
4941
|
+
reactComponents.ReactButton,
|
|
4942
|
+
{
|
|
4943
|
+
onClick: () => update({ borderColor: "transparent", borderPath: void 0 }),
|
|
4944
|
+
children: "\u9690\u85CF\u6B64\u5355\u5143\u683C\u8FB9\u6846"
|
|
4945
|
+
}
|
|
4946
|
+
)
|
|
4947
|
+
]
|
|
4948
|
+
}
|
|
4949
|
+
);
|
|
4950
|
+
}
|
|
4951
|
+
function TableAutoMergePanel({
|
|
4952
|
+
element,
|
|
4953
|
+
onChange
|
|
4954
|
+
}) {
|
|
4955
|
+
const [rowKeys, setRowKeys] = react.useState("");
|
|
4956
|
+
const [rowColumns, setRowColumns] = react.useState("");
|
|
4957
|
+
const [columnKeys, setColumnKeys] = react.useState("");
|
|
4958
|
+
react.useEffect(() => {
|
|
4959
|
+
setRowKeys(element.mergeCell?.row?.keys.join(", ") ?? "");
|
|
4960
|
+
setRowColumns(element.mergeCell?.row?.columns?.join(", ") ?? "");
|
|
4961
|
+
setColumnKeys(element.mergeCell?.column?.keys.join(", ") ?? "");
|
|
4962
|
+
}, [element.mergeCell]);
|
|
4963
|
+
const fields = (value) => value.split(",").map((item) => item.trim()).filter(Boolean);
|
|
4964
|
+
const apply = (nextRows, nextColumns, nextColumnKeys) => {
|
|
4965
|
+
const keys = fields(nextRows);
|
|
4966
|
+
const columns = fields(nextColumns);
|
|
4967
|
+
const horizontal = fields(nextColumnKeys);
|
|
4968
|
+
const mergeCell = {
|
|
4969
|
+
row: keys.length ? { keys, columns: columns.length ? columns : void 0 } : void 0,
|
|
4970
|
+
column: horizontal.length ? { keys: horizontal } : void 0
|
|
4971
|
+
};
|
|
4972
|
+
onChange({
|
|
4973
|
+
mergeCell: mergeCell.row || mergeCell.column ? mergeCell : void 0
|
|
4974
|
+
});
|
|
4975
|
+
};
|
|
4976
|
+
return /* @__PURE__ */ jsxRuntime.jsxs(
|
|
4977
|
+
reactComponents.ReactCollapsePanel,
|
|
4978
|
+
{
|
|
4979
|
+
title: "\u6570\u636E\u81EA\u52A8\u5408\u5E76",
|
|
4980
|
+
className: "cc-print-design-property-section",
|
|
4981
|
+
contentClassName: "cc-print-design-table-data cc-print-design-compact-grid",
|
|
4982
|
+
children: [
|
|
4983
|
+
/* @__PURE__ */ jsxRuntime.jsxs("label", { "data-tour-field": "mergeCell", children: [
|
|
4984
|
+
"\u8FDE\u7EED\u884C\u5206\u7EC4\u5B57\u6BB5",
|
|
4985
|
+
/* @__PURE__ */ jsxRuntime.jsx(
|
|
4986
|
+
reactComponents.ReactInput,
|
|
4172
4987
|
{
|
|
4173
|
-
|
|
4174
|
-
|
|
4175
|
-
|
|
4988
|
+
value: rowKeys,
|
|
4989
|
+
placeholder: "\u4F8B\u5982\uFF1A\u8BA2\u5355\u7C7B\u578B, \u9879\u76EE",
|
|
4990
|
+
onChange: (event) => setRowKeys(event.target.value),
|
|
4991
|
+
onBlur: () => apply(rowKeys, rowColumns, columnKeys)
|
|
4176
4992
|
}
|
|
4177
|
-
)
|
|
4178
|
-
|
|
4179
|
-
|
|
4180
|
-
|
|
4181
|
-
|
|
4182
|
-
|
|
4183
|
-
"aria-label": "\u6C47\u603B\u884C\u9AD8",
|
|
4184
|
-
min: printDesign.toDisplayUnit(1, displayUnit),
|
|
4185
|
-
value: printDesign.toDisplayUnit(
|
|
4186
|
-
element.summaryRowHeight ?? element.rowHeight ?? 8,
|
|
4187
|
-
displayUnit
|
|
4188
|
-
),
|
|
4189
|
-
onChange: (value) => {
|
|
4190
|
-
if (value != null && Number.isFinite(value) && value > 0)
|
|
4191
|
-
onChange({
|
|
4192
|
-
summaryRowHeight: printDesign.fromDisplayUnit(value, displayUnit)
|
|
4193
|
-
});
|
|
4194
|
-
}
|
|
4195
|
-
}
|
|
4196
|
-
)
|
|
4197
|
-
] }),
|
|
4198
|
-
showGrandTotalOption ? /* @__PURE__ */ jsxRuntime.jsx(
|
|
4199
|
-
reactComponents.ReactCheckbox,
|
|
4993
|
+
)
|
|
4994
|
+
] }),
|
|
4995
|
+
/* @__PURE__ */ jsxRuntime.jsxs("label", { children: [
|
|
4996
|
+
"\u6267\u884C\u884C\u5408\u5E76\u7684\u5217",
|
|
4997
|
+
/* @__PURE__ */ jsxRuntime.jsx(
|
|
4998
|
+
reactComponents.ReactInput,
|
|
4200
4999
|
{
|
|
4201
|
-
|
|
4202
|
-
|
|
4203
|
-
|
|
5000
|
+
value: rowColumns,
|
|
5001
|
+
placeholder: "\u7559\u7A7A\u65F6\u4F7F\u7528\u5206\u7EC4\u5B57\u6BB5",
|
|
5002
|
+
onChange: (event) => setRowColumns(event.target.value),
|
|
5003
|
+
onBlur: () => apply(rowKeys, rowColumns, columnKeys)
|
|
4204
5004
|
}
|
|
4205
|
-
)
|
|
4206
|
-
]
|
|
4207
|
-
|
|
4208
|
-
|
|
4209
|
-
|
|
5005
|
+
)
|
|
5006
|
+
] }),
|
|
5007
|
+
/* @__PURE__ */ jsxRuntime.jsxs("label", { children: [
|
|
5008
|
+
"\u540C\u884C\u76F8\u90BB\u5217\u5408\u5E76\u5B57\u6BB5",
|
|
5009
|
+
/* @__PURE__ */ jsxRuntime.jsx(
|
|
5010
|
+
reactComponents.ReactInput,
|
|
5011
|
+
{
|
|
5012
|
+
value: columnKeys,
|
|
5013
|
+
placeholder: "\u4F8B\u5982\uFF1A\u5206\u7C7B, \u5907\u6CE8",
|
|
5014
|
+
onChange: (event) => setColumnKeys(event.target.value),
|
|
5015
|
+
onBlur: () => apply(rowKeys, rowColumns, columnKeys)
|
|
5016
|
+
}
|
|
5017
|
+
)
|
|
5018
|
+
] })
|
|
5019
|
+
]
|
|
5020
|
+
}
|
|
5021
|
+
);
|
|
4210
5022
|
}
|
|
4211
5023
|
function TableColorsPanel({
|
|
4212
5024
|
colors,
|
|
@@ -4350,6 +5162,24 @@ function TableColumnsPanel({
|
|
|
4350
5162
|
title: "\u5355\u5143\u683C\u5E03\u5C40",
|
|
4351
5163
|
contentClassName: "cc-print-design-column-grid",
|
|
4352
5164
|
children: [
|
|
5165
|
+
/* @__PURE__ */ jsxRuntime.jsx(
|
|
5166
|
+
reactComponents.ReactButton,
|
|
5167
|
+
{
|
|
5168
|
+
type: "text",
|
|
5169
|
+
onClick: () => update(index, {
|
|
5170
|
+
align: void 0,
|
|
5171
|
+
cellOverflow: void 0,
|
|
5172
|
+
ellipsis: void 0,
|
|
5173
|
+
cellPadding: void 0,
|
|
5174
|
+
cellStyle: column.cellStyle ? {
|
|
5175
|
+
...column.cellStyle,
|
|
5176
|
+
textAlign: void 0,
|
|
5177
|
+
verticalAlign: void 0
|
|
5178
|
+
} : void 0
|
|
5179
|
+
}),
|
|
5180
|
+
children: "\u6062\u590D\u8868\u683C\u7EDF\u4E00\u5E03\u5C40"
|
|
5181
|
+
}
|
|
5182
|
+
),
|
|
4353
5183
|
/* @__PURE__ */ jsxRuntime.jsxs("label", { className: "cc-print-design-column-half", children: [
|
|
4354
5184
|
"\u6C34\u5E73\u5BF9\u9F50",
|
|
4355
5185
|
/* @__PURE__ */ jsxRuntime.jsx(
|
|
@@ -4384,14 +5214,44 @@ function TableColumnsPanel({
|
|
|
4384
5214
|
/* @__PURE__ */ jsxRuntime.jsx(
|
|
4385
5215
|
reactComponents.ReactSelect,
|
|
4386
5216
|
{
|
|
4387
|
-
value: column.ellipsis == null ? layoutDefaults?.cellOverflow ?? "wrap" : column.ellipsis ? "ellipsis" : "wrap",
|
|
5217
|
+
value: column.cellOverflow ?? (column.ellipsis == null ? layoutDefaults?.cellOverflow ?? "wrap" : column.ellipsis ? "ellipsis" : "wrap"),
|
|
4388
5218
|
options: TABLE_OVERFLOW_OPTIONS,
|
|
4389
5219
|
onChange: (value) => update(index, {
|
|
4390
|
-
|
|
5220
|
+
cellOverflow: value
|
|
4391
5221
|
})
|
|
4392
5222
|
}
|
|
4393
5223
|
)
|
|
4394
|
-
] })
|
|
5224
|
+
] }),
|
|
5225
|
+
["top", "right", "bottom", "left"].map((side) => /* @__PURE__ */ jsxRuntime.jsxs("label", { className: "cc-print-design-column-half", children: [
|
|
5226
|
+
{ top: "\u4E0A", right: "\u53F3", bottom: "\u4E0B", left: "\u5DE6" }[side],
|
|
5227
|
+
"\u5185\u8FB9\u8DDD",
|
|
5228
|
+
/* @__PURE__ */ jsxRuntime.jsx(
|
|
5229
|
+
reactComponents.ReactInputNumber,
|
|
5230
|
+
{
|
|
5231
|
+
min: 0,
|
|
5232
|
+
step: 0.1,
|
|
5233
|
+
value: printDesign.toDisplayUnit(
|
|
5234
|
+
printDesign.fromDisplayUnit(
|
|
5235
|
+
column.cellPadding?.[side] ?? layoutDefaults?.cellPadding?.[side] ?? (side === "left" || side === "right" ? 4 : 0),
|
|
5236
|
+
"px"
|
|
5237
|
+
),
|
|
5238
|
+
displayUnit
|
|
5239
|
+
),
|
|
5240
|
+
onChange: (value) => {
|
|
5241
|
+
if (value != null && Number.isFinite(value) && value >= 0)
|
|
5242
|
+
update(index, {
|
|
5243
|
+
cellPadding: {
|
|
5244
|
+
...column.cellPadding,
|
|
5245
|
+
[side]: printDesign.toDisplayUnit(
|
|
5246
|
+
printDesign.fromDisplayUnit(value, displayUnit),
|
|
5247
|
+
"px"
|
|
5248
|
+
)
|
|
5249
|
+
}
|
|
5250
|
+
});
|
|
5251
|
+
}
|
|
5252
|
+
}
|
|
5253
|
+
)
|
|
5254
|
+
] }, side))
|
|
4395
5255
|
]
|
|
4396
5256
|
}
|
|
4397
5257
|
),
|
|
@@ -4502,8 +5362,14 @@ function TablePropertiesPanel({
|
|
|
4502
5362
|
page,
|
|
4503
5363
|
data,
|
|
4504
5364
|
samples,
|
|
5365
|
+
tableCellSelection,
|
|
5366
|
+
onMergeSelectedTableCells,
|
|
4505
5367
|
onChange
|
|
4506
5368
|
}) {
|
|
5369
|
+
const borderSamples = [
|
|
5370
|
+
...samples ?? [data ?? {}],
|
|
5371
|
+
...printDesign.resolveTableRows(element, data).slice(0, 100)
|
|
5372
|
+
];
|
|
4507
5373
|
return /* @__PURE__ */ jsxRuntime.jsxs(jsxRuntime.Fragment, { children: [
|
|
4508
5374
|
/* @__PURE__ */ jsxRuntime.jsx(
|
|
4509
5375
|
TableRowSettingsPanel,
|
|
@@ -4513,7 +5379,27 @@ function TablePropertiesPanel({
|
|
|
4513
5379
|
onChange
|
|
4514
5380
|
}
|
|
4515
5381
|
),
|
|
4516
|
-
/* @__PURE__ */ jsxRuntime.jsx(
|
|
5382
|
+
/* @__PURE__ */ jsxRuntime.jsx(
|
|
5383
|
+
TableLayoutPanel,
|
|
5384
|
+
{
|
|
5385
|
+
element,
|
|
5386
|
+
samples: borderSamples,
|
|
5387
|
+
onChange
|
|
5388
|
+
}
|
|
5389
|
+
),
|
|
5390
|
+
/* @__PURE__ */ jsxRuntime.jsx(TableCellLayoutPanel, { element, onChange }),
|
|
5391
|
+
/* @__PURE__ */ jsxRuntime.jsx(
|
|
5392
|
+
TableCellsPanel,
|
|
5393
|
+
{
|
|
5394
|
+
element,
|
|
5395
|
+
data,
|
|
5396
|
+
samples: borderSamples,
|
|
5397
|
+
tableCellSelection,
|
|
5398
|
+
onMergeSelectedTableCells,
|
|
5399
|
+
onChange
|
|
5400
|
+
}
|
|
5401
|
+
),
|
|
5402
|
+
/* @__PURE__ */ jsxRuntime.jsx(TableAutoMergePanel, { element, onChange }),
|
|
4517
5403
|
/* @__PURE__ */ jsxRuntime.jsx(
|
|
4518
5404
|
reactComponents.ReactCollapsePanel,
|
|
4519
5405
|
{
|
|
@@ -5075,15 +5961,15 @@ function PivotTablePropertiesPanel({
|
|
|
5075
5961
|
defaultOpen: true,
|
|
5076
5962
|
className: "cc-print-design-property-section",
|
|
5077
5963
|
children: /* @__PURE__ */ jsxRuntime.jsxs("div", { className: "cc-print-design-table-data cc-print-design-data-compact", children: [
|
|
5078
|
-
/* @__PURE__ */ jsxRuntime.jsx(
|
|
5964
|
+
/* @__PURE__ */ jsxRuntime.jsx("div", { "data-tour-field": "dataMode", children: /* @__PURE__ */ jsxRuntime.jsx(
|
|
5079
5965
|
DataModeButtons,
|
|
5080
5966
|
{
|
|
5081
5967
|
value: element.dataMode ?? "static",
|
|
5082
5968
|
onChange: (dataMode) => onChange({ dataMode })
|
|
5083
5969
|
}
|
|
5084
|
-
),
|
|
5970
|
+
) }),
|
|
5085
5971
|
element.dataMode === "binding" ? /* @__PURE__ */ jsxRuntime.jsxs(jsxRuntime.Fragment, { children: [
|
|
5086
|
-
/* @__PURE__ */ jsxRuntime.jsxs("div", { className: "cc-print-design-field", children: [
|
|
5972
|
+
/* @__PURE__ */ jsxRuntime.jsxs("div", { className: "cc-print-design-field", "data-tour-field": "dataPath", children: [
|
|
5087
5973
|
/* @__PURE__ */ jsxRuntime.jsx("span", { children: "ListTable \u6570\u636E\u6E90\u8DEF\u5F84" }),
|
|
5088
5974
|
/* @__PURE__ */ jsxRuntime.jsx(
|
|
5089
5975
|
DataPathPicker,
|
|
@@ -5271,6 +6157,7 @@ function PivotTablePropertiesPanel({
|
|
|
5271
6157
|
showSummary: element.showSummary ?? element.showGrandTotal ?? true
|
|
5272
6158
|
},
|
|
5273
6159
|
onChange,
|
|
6160
|
+
samples: samples ?? [data],
|
|
5274
6161
|
showGrandTotalOption: true
|
|
5275
6162
|
}
|
|
5276
6163
|
),
|
|
@@ -5616,6 +6503,7 @@ function BorderFields({
|
|
|
5616
6503
|
min: 0,
|
|
5617
6504
|
max: printDesign.toDisplayUnit(printDesign.fromDisplayUnit(10, "px"), displayUnit),
|
|
5618
6505
|
step: displayUnit === "in" ? 1e-3 : 0.01,
|
|
6506
|
+
precision: displayUnit === "in" ? 3 : 2,
|
|
5619
6507
|
value: printDesign.toDisplayUnit(
|
|
5620
6508
|
printDesign.fromDisplayUnit(value?.width ?? 1, "px"),
|
|
5621
6509
|
displayUnit
|
|
@@ -5672,16 +6560,16 @@ function GanttPropertiesPanel({
|
|
|
5672
6560
|
className: "cc-print-design-property-section",
|
|
5673
6561
|
children: [
|
|
5674
6562
|
/* @__PURE__ */ jsxRuntime.jsxs("div", { className: "cc-print-design-table-data cc-print-design-data-compact", children: [
|
|
5675
|
-
/* @__PURE__ */ jsxRuntime.jsx(
|
|
6563
|
+
/* @__PURE__ */ jsxRuntime.jsx("div", { "data-tour-field": "dataMode", children: /* @__PURE__ */ jsxRuntime.jsx(
|
|
5676
6564
|
DataModeButtons,
|
|
5677
6565
|
{
|
|
5678
6566
|
label: "\u4EFB\u52A1\u6570\u636E\u65B9\u5F0F",
|
|
5679
6567
|
value: element.dataMode ?? "static",
|
|
5680
6568
|
onChange: (dataMode) => onChange({ dataMode })
|
|
5681
6569
|
}
|
|
5682
|
-
),
|
|
6570
|
+
) }),
|
|
5683
6571
|
element.dataMode === "binding" ? /* @__PURE__ */ jsxRuntime.jsxs(jsxRuntime.Fragment, { children: [
|
|
5684
|
-
/* @__PURE__ */ jsxRuntime.jsxs("div", { className: "cc-print-design-field", children: [
|
|
6572
|
+
/* @__PURE__ */ jsxRuntime.jsxs("div", { className: "cc-print-design-field", "data-tour-field": "dataPath", children: [
|
|
5685
6573
|
/* @__PURE__ */ jsxRuntime.jsx("span", { children: "\u4EFB\u52A1\u6570\u7EC4\u8DEF\u5F84" }),
|
|
5686
6574
|
/* @__PURE__ */ jsxRuntime.jsx(
|
|
5687
6575
|
DataPathPicker,
|
|
@@ -5755,6 +6643,7 @@ function GanttPropertiesPanel({
|
|
|
5755
6643
|
min: 0,
|
|
5756
6644
|
max: printDesign.toDisplayUnit(printDesign.fromDisplayUnit(10, "px"), displayUnit),
|
|
5757
6645
|
step: displayUnit === "in" ? 1e-3 : 0.01,
|
|
6646
|
+
precision: displayUnit === "in" ? 3 : 2,
|
|
5758
6647
|
value: printDesign.toDisplayUnit(
|
|
5759
6648
|
printDesign.fromDisplayUnit(element.dependencyLineWidth ?? 1, "px"),
|
|
5760
6649
|
displayUnit
|
|
@@ -6125,6 +7014,8 @@ function ElementDataPanel(props) {
|
|
|
6125
7014
|
element,
|
|
6126
7015
|
data,
|
|
6127
7016
|
samples: props.samples,
|
|
7017
|
+
tableCellSelection: props.tableCellSelection,
|
|
7018
|
+
onMergeSelectedTableCells: props.onMergeSelectedTableCells,
|
|
6128
7019
|
onChange
|
|
6129
7020
|
}
|
|
6130
7021
|
)
|
|
@@ -6138,14 +7029,14 @@ function ElementDataPanel(props) {
|
|
|
6138
7029
|
defaultOpen: true,
|
|
6139
7030
|
className: "cc-print-design-property-section",
|
|
6140
7031
|
children: /* @__PURE__ */ jsxRuntime.jsxs("div", { className: "cc-print-design-property-grid", children: [
|
|
6141
|
-
/* @__PURE__ */ jsxRuntime.jsx(
|
|
7032
|
+
/* @__PURE__ */ jsxRuntime.jsx("div", { "data-tour-field": "dataConfig.mode", children: /* @__PURE__ */ jsxRuntime.jsx(
|
|
6142
7033
|
DataModeButtons,
|
|
6143
7034
|
{
|
|
6144
7035
|
value: config.mode,
|
|
6145
7036
|
disabled: props.readonly,
|
|
6146
7037
|
onChange: (mode) => onChange({ dataConfig: { ...config, mode } })
|
|
6147
7038
|
}
|
|
6148
|
-
),
|
|
7039
|
+
) }),
|
|
6149
7040
|
printDesign.getPrintDesignDataFields(element.type).map((field) => {
|
|
6150
7041
|
if (element.type === "shape" && config.mode === "static") return null;
|
|
6151
7042
|
const value = element[field.key] ?? field.fallback;
|
|
@@ -6168,28 +7059,36 @@ function ElementDataPanel(props) {
|
|
|
6168
7059
|
"div",
|
|
6169
7060
|
{
|
|
6170
7061
|
className: "cc-print-design-field cc-print-design-field-full",
|
|
7062
|
+
"data-tour-field": field.key,
|
|
6171
7063
|
children: [
|
|
6172
|
-
config.mode === "binding" && /* @__PURE__ */ jsxRuntime.jsxs(
|
|
6173
|
-
|
|
6174
|
-
|
|
6175
|
-
|
|
6176
|
-
|
|
6177
|
-
|
|
6178
|
-
|
|
6179
|
-
|
|
6180
|
-
|
|
6181
|
-
|
|
6182
|
-
|
|
6183
|
-
|
|
6184
|
-
|
|
6185
|
-
|
|
6186
|
-
|
|
6187
|
-
|
|
7064
|
+
config.mode === "binding" && /* @__PURE__ */ jsxRuntime.jsxs(
|
|
7065
|
+
"div",
|
|
7066
|
+
{
|
|
7067
|
+
className: "cc-print-design-field",
|
|
7068
|
+
"data-tour-field": `dataConfig.bindings.${field.key}`,
|
|
7069
|
+
children: [
|
|
7070
|
+
/* @__PURE__ */ jsxRuntime.jsxs("span", { children: [
|
|
7071
|
+
field.label,
|
|
7072
|
+
" \xB7 \u5B57\u6BB5\u8DEF\u5F84"
|
|
7073
|
+
] }),
|
|
7074
|
+
/* @__PURE__ */ jsxRuntime.jsx(
|
|
7075
|
+
DataPathPicker,
|
|
7076
|
+
{
|
|
7077
|
+
label: `${field.label}\u7ED1\u5B9A\u8DEF\u5F84`,
|
|
7078
|
+
disabled: props.readonly,
|
|
7079
|
+
value: path,
|
|
7080
|
+
samples: props.samples ?? [data],
|
|
7081
|
+
onChange: (path2) => onChange({
|
|
7082
|
+
dataConfig: {
|
|
7083
|
+
...config,
|
|
7084
|
+
bindings: { ...config.bindings, [field.key]: path2 }
|
|
7085
|
+
}
|
|
7086
|
+
})
|
|
6188
7087
|
}
|
|
6189
|
-
|
|
6190
|
-
|
|
6191
|
-
|
|
6192
|
-
|
|
7088
|
+
)
|
|
7089
|
+
]
|
|
7090
|
+
}
|
|
7091
|
+
),
|
|
6193
7092
|
/* @__PURE__ */ jsxRuntime.jsx(
|
|
6194
7093
|
DataValueField,
|
|
6195
7094
|
{
|
|
@@ -7452,21 +8351,28 @@ function PropertiesPanel(props) {
|
|
|
7452
8351
|
onChange: (rotation) => props.onElementChange({ rotation })
|
|
7453
8352
|
}
|
|
7454
8353
|
),
|
|
7455
|
-
/* @__PURE__ */ jsxRuntime.jsxs(
|
|
7456
|
-
|
|
7457
|
-
|
|
7458
|
-
|
|
7459
|
-
|
|
7460
|
-
|
|
7461
|
-
|
|
7462
|
-
|
|
7463
|
-
|
|
7464
|
-
|
|
7465
|
-
|
|
7466
|
-
|
|
7467
|
-
|
|
7468
|
-
|
|
7469
|
-
|
|
8354
|
+
/* @__PURE__ */ jsxRuntime.jsxs(
|
|
8355
|
+
"label",
|
|
8356
|
+
{
|
|
8357
|
+
className: "cc-print-design-field cc-print-design-field-full",
|
|
8358
|
+
"data-tour-field": "overflowPolicy",
|
|
8359
|
+
children: [
|
|
8360
|
+
/* @__PURE__ */ jsxRuntime.jsx("span", { children: "\u8D85\u51FA\u7EB8\u5F20" }),
|
|
8361
|
+
/* @__PURE__ */ jsxRuntime.jsx(
|
|
8362
|
+
reactComponents.ReactSelect,
|
|
8363
|
+
{
|
|
8364
|
+
"aria-label": "\u8D85\u51FA\u7EB8\u5F20\u5904\u7406\u65B9\u5F0F",
|
|
8365
|
+
value: element.overflowPolicy ?? (element.type === "text" || element.type === "table" || element.type === "pivotTable" ? "split" : "nextPage"),
|
|
8366
|
+
options: getOverflowPolicyOptions(element.type),
|
|
8367
|
+
disabled: props.readonly,
|
|
8368
|
+
onChange: (value) => props.onElementChange({
|
|
8369
|
+
overflowPolicy: value
|
|
8370
|
+
})
|
|
8371
|
+
}
|
|
8372
|
+
)
|
|
8373
|
+
]
|
|
8374
|
+
}
|
|
8375
|
+
)
|
|
7470
8376
|
] }),
|
|
7471
8377
|
element.type === "text" ? /* @__PURE__ */ jsxRuntime.jsxs(PropertySection, { title: "\u6587\u672C\u6837\u5F0F", children: [
|
|
7472
8378
|
/* @__PURE__ */ jsxRuntime.jsx(
|
|
@@ -8264,6 +9170,8 @@ function PropertiesPanel(props) {
|
|
|
8264
9170
|
data: props.data,
|
|
8265
9171
|
samples: props.samples,
|
|
8266
9172
|
readonly: props.readonly,
|
|
9173
|
+
tableCellSelection: props.tableCellSelection,
|
|
9174
|
+
onMergeSelectedTableCells: props.onMergeSelectedTableCells,
|
|
8267
9175
|
onChange: props.onElementChange
|
|
8268
9176
|
},
|
|
8269
9177
|
element.id
|
|
@@ -8445,31 +9353,59 @@ function NumberField(props) {
|
|
|
8445
9353
|
const dimensional = NUMBER_FIELD_DIMENSIONS.has(props.label);
|
|
8446
9354
|
const unit = dimensional || fontSize ? displayUnit : "mm";
|
|
8447
9355
|
const toInput = (value) => printDesign.toDisplayUnit(fontSize ? printDesign.fromDisplayUnit(value, "pt") : value, unit);
|
|
8448
|
-
return /* @__PURE__ */ jsxRuntime.jsxs(
|
|
8449
|
-
|
|
8450
|
-
|
|
8451
|
-
|
|
8452
|
-
|
|
8453
|
-
|
|
8454
|
-
|
|
8455
|
-
|
|
8456
|
-
|
|
8457
|
-
|
|
8458
|
-
|
|
8459
|
-
|
|
8460
|
-
|
|
8461
|
-
|
|
9356
|
+
return /* @__PURE__ */ jsxRuntime.jsxs(
|
|
9357
|
+
"label",
|
|
9358
|
+
{
|
|
9359
|
+
className: "cc-print-design-field",
|
|
9360
|
+
"data-tour-field": numberTourFields[props.label],
|
|
9361
|
+
children: [
|
|
9362
|
+
/* @__PURE__ */ jsxRuntime.jsx("span", { children: props.label }),
|
|
9363
|
+
/* @__PURE__ */ jsxRuntime.jsx(
|
|
9364
|
+
reactComponents.ReactInputNumber,
|
|
9365
|
+
{
|
|
9366
|
+
"aria-label": props.label,
|
|
9367
|
+
value: toInput(props.value),
|
|
9368
|
+
min: props.min == null ? void 0 : toInput(props.min),
|
|
9369
|
+
max: props.max == null ? void 0 : toInput(props.max),
|
|
9370
|
+
step: props.step ?? (fontSize ? 0.1 : 1),
|
|
9371
|
+
precision: props.precision ?? 2,
|
|
9372
|
+
disabled: props.disabled,
|
|
9373
|
+
onChange: (value) => value != null && props.onChange(
|
|
9374
|
+
fontSize ? printDesign.toDisplayUnit(printDesign.fromDisplayUnit(value, unit), "pt") : printDesign.fromDisplayUnit(value, unit)
|
|
9375
|
+
)
|
|
9376
|
+
}
|
|
8462
9377
|
)
|
|
8463
|
-
|
|
8464
|
-
|
|
8465
|
-
|
|
9378
|
+
]
|
|
9379
|
+
}
|
|
9380
|
+
);
|
|
8466
9381
|
}
|
|
8467
9382
|
function ColorField(props) {
|
|
8468
|
-
return /* @__PURE__ */ jsxRuntime.jsxs(
|
|
8469
|
-
|
|
8470
|
-
|
|
8471
|
-
|
|
9383
|
+
return /* @__PURE__ */ jsxRuntime.jsxs(
|
|
9384
|
+
"label",
|
|
9385
|
+
{
|
|
9386
|
+
className: "cc-print-design-field",
|
|
9387
|
+
"data-tour-field": colorTourFields[props.label],
|
|
9388
|
+
children: [
|
|
9389
|
+
/* @__PURE__ */ jsxRuntime.jsx("span", { children: props.label }),
|
|
9390
|
+
/* @__PURE__ */ jsxRuntime.jsx(reactComponents.ReactColorPicker, { value: props.value, onChange: props.onChange })
|
|
9391
|
+
]
|
|
9392
|
+
}
|
|
9393
|
+
);
|
|
8472
9394
|
}
|
|
9395
|
+
var numberTourFields = {
|
|
9396
|
+
X: "x",
|
|
9397
|
+
Y: "y",
|
|
9398
|
+
\u5BBD\u5EA6: "width",
|
|
9399
|
+
\u9AD8\u5EA6: "height",
|
|
9400
|
+
\u65CB\u8F6C: "rotation",
|
|
9401
|
+
\u5B57\u53F7: "fontSize",
|
|
9402
|
+
\u884C\u9AD8: "rowHeight"
|
|
9403
|
+
};
|
|
9404
|
+
var colorTourFields = {
|
|
9405
|
+
\u6587\u5B57\u989C\u8272: "color",
|
|
9406
|
+
\u586B\u5145\u989C\u8272: "fill",
|
|
9407
|
+
\u8FB9\u6846\u989C\u8272: "borderColor"
|
|
9408
|
+
};
|
|
8473
9409
|
function formatTime(value) {
|
|
8474
9410
|
return value ? new Date(value).toLocaleString("zh-CN") : "-";
|
|
8475
9411
|
}
|
|
@@ -8697,7 +9633,7 @@ async function writePrintDesignTemplates(storeKey, versions) {
|
|
|
8697
9633
|
}
|
|
8698
9634
|
|
|
8699
9635
|
// src/style.css
|
|
8700
|
-
styleInject('.cc-print-design-editor {\n position: relative;\n --pd-border: #e4e8ef;\n --pd-text: var(--canvas-react-color-text, #263244);\n --pd-muted: var(--canvas-react-color-text-muted, #8993a2);\n --pd-primary: #1677ff;\n --pd-background: #f7f8fa;\n --pd-surface: #fff;\n --pd-workspace: #e9edf3;\n --pd-hover: #f5f7fa;\n --pd-selected: #edf4ff;\n --pd-subtle: #fafbfd;\n --pd-icon: #4279cb;\n --pd-divider: #edf0f4;\n --pd-selected-border: #86b4ff;\n --pd-danger: #dc2626;\n --pd-brand-start: #428cff;\n --pd-brand-end: #1261d8;\n --canvas-react-shadow-focus: 0 0 0 2px color-mix(in srgb, var(--pd-primary) 18%, transparent);\n --pd-label-font-size: var(--canvas-react-font-size-label, 12px);\n --pd-primary-font-size: var(--canvas-react-font-size, 13px);\n --pd-secondary-font-size: var(--canvas-react-font-size-secondary, 11px);\n --pd-panel-header-height: 36px;\n display: flex;\n flex-direction: column;\n box-sizing: border-box;\n width: 100%;\n height: 100%;\n min-width: 0;\n min-height: 0;\n overflow: hidden;\n color: var(--pd-text);\n background: var(--pd-background);\n font-family:\n Inter,\n -apple-system,\n BlinkMacSystemFont,\n "Segoe UI",\n "PingFang SC",\n "Microsoft YaHei",\n sans-serif;\n font-size: var(--pd-primary-font-size, 13px);\n}\n.cc-print-design-editor:fullscreen {\n width: 100vw !important;\n height: 100vh !important;\n}\n.cc-print-design-toolbar {\n z-index: 2;\n display: flex;\n flex: 0 0 58px;\n align-items: center;\n justify-content: space-between;\n gap: 16px;\n padding: 0 18px;\n border-bottom: 1px solid var(--pd-border);\n background: var(--pd-surface);\n}\n.cc-print-design-brand,\n.cc-print-design-brand > div,\n.cc-print-design-toolbar-group {\n display: flex;\n align-items: center;\n}\n.cc-print-design-brand {\n gap: 10px;\n min-width: 180px;\n}\n.cc-print-design-brand > div {\n flex-direction: column;\n align-items: flex-start;\n gap: 2px;\n}\n.cc-print-design-brand strong {\n max-width: 170px;\n overflow: hidden;\n text-overflow: ellipsis;\n white-space: nowrap;\n font-size: var(--pd-primary-font-size, 13px);\n}\n.cc-print-design-brand small {\n color: var(--pd-muted);\n font-size: var(--pd-secondary-font-size, 11px);\n}\n.cc-print-design-brand-mark {\n display: grid;\n width: 32px;\n height: 32px;\n place-items: center;\n border-radius: 9px;\n color: #fff;\n background:\n linear-gradient(\n 145deg,\n var(--pd-brand-start),\n var(--pd-brand-end));\n font-size: 16px;\n font-weight: 700;\n}\n.cc-print-design-toolbar-group {\n gap: 7px;\n}\n.cc-print-design-toolbar-unit {\n margin-left: 8px;\n padding: 4px 9px;\n border: 1px solid var(--pd-border);\n border-radius: 5px;\n color: var(--pd-muted);\n background: var(--pd-surface);\n font-size: var(--pd-secondary-font-size);\n white-space: nowrap;\n}\n.cc-print-design-clock-options {\n grid-column: 1 / -1;\n display: flex;\n flex-wrap: wrap;\n gap: 8px 16px;\n}\n.cc-print-design-save-status {\n max-width: 120px;\n overflow: hidden;\n color: var(--pd-muted);\n font-size: var(--pd-secondary-font-size);\n text-overflow: ellipsis;\n white-space: nowrap;\n}\n.cc-print-design-template-list {\n gap: 9px;\n}\n.cc-print-design-template-card {\n display: flex;\n flex-direction: column;\n min-height: 58px;\n padding: 8px;\n border: 1px solid var(--pd-border);\n border-radius: 7px;\n background: var(--pd-surface);\n}\n.cc-print-design-template-card.selected {\n border-color: var(--pd-selected-border);\n box-shadow: 0 0 0 2px var(--pd-selected);\n}\n.cc-print-design-template-select,\n.cc-print-design-template-heading {\n display: flex;\n min-width: 0;\n align-items: center;\n gap: 10px;\n}\n.cc-print-design-template-heading {\n flex-wrap: wrap;\n}\n.cc-print-design-template-heading > .cc-print-design-page-thumbnail {\n flex: 0 0 31px;\n}\n.cc-print-design-template-heading > .cc-print-design-template-label {\n flex: 1 1 calc(100% - 41px);\n}\n.cc-print-design-template-heading > .canvas-react-button {\n width: 26px;\n height: 26px;\n flex: 0 0 26px;\n}\n.cc-print-design-template-heading > .canvas-react-button:first-of-type {\n margin-left: auto;\n}\n.cc-print-design-template-select {\n width: 100%;\n padding: 0;\n border: 0;\n background: transparent;\n color: var(--pd-text);\n cursor: pointer;\n text-align: left;\n}\n.cc-print-design-template-select.selected,\n.cc-print-design-template-versions button.selected {\n color: var(--pd-primary);\n font-weight: 600;\n}\n.cc-print-design-template-label {\n display: flex;\n min-width: 0;\n flex: 1;\n flex-direction: column;\n gap: 4px;\n}\n.cc-print-design-template-label strong {\n overflow: hidden;\n text-overflow: ellipsis;\n white-space: nowrap;\n font-size: var(--pd-primary-font-size);\n}\n.cc-print-design-template-label small {\n color: var(--pd-muted);\n font-size: var(--pd-secondary-font-size);\n}\n.cc-print-design-template-invalid {\n color: var(--pd-danger);\n font-size: var(--pd-secondary-font-size);\n font-weight: 600;\n}\n.cc-print-design-template-versions {\n display: flex;\n flex-direction: column;\n margin: 7px 0 0 41px;\n border-top: 1px solid var(--pd-border);\n}\n.cc-print-design-template-version {\n display: flex;\n align-items: center;\n gap: 4px;\n}\n.cc-print-design-template-version > button:first-child {\n flex: 1;\n min-width: 0;\n padding: 7px 0;\n border: 0;\n background: transparent;\n color: var(--pd-muted);\n cursor: pointer;\n text-align: left;\n font-size: var(--pd-secondary-font-size);\n}\n.cc-print-design-template-version > .canvas-react-button {\n width: 24px;\n height: 24px;\n flex: 0 0 24px;\n padding: 0;\n border: 0;\n color: var(--pd-muted);\n background: transparent;\n}\n.cc-print-design-template-version > .canvas-react-button:hover:not(:disabled) {\n color: var(--pd-danger);\n}\n.cc-print-design-toolbar .canvas-react-button {\n box-sizing: border-box;\n width: 32px;\n height: 32px;\n flex: 0 0 32px;\n padding: 4px;\n}\n.cc-print-design-toolbar-separator {\n width: 1px;\n height: 22px;\n margin: 0 5px;\n background: var(--pd-border);\n}\n.cc-print-design-zoom-value {\n min-width: 40px;\n color: var(--pd-muted);\n font-size: var(--pd-primary-font-size, 13px);\n text-align: center;\n}\n.cc-print-design-zoom-value input {\n box-sizing: border-box;\n width: 42px;\n padding: 3px 2px;\n border: 1px solid transparent;\n border-radius: 4px;\n background: transparent;\n color: var(--pd-text);\n font: inherit;\n text-align: right;\n}\n.cc-print-design-zoom-value input:focus {\n border-color: var(--pd-primary);\n outline: none;\n}\n.cc-print-design-panel-width-group {\n display: grid;\n gap: 6px;\n margin-bottom: 12px;\n}\n.cc-print-design-panel-width-group strong {\n font-size: var(--pd-primary-font-size);\n}\n.cc-print-design-custom-component-row {\n display: flex;\n align-items: center;\n gap: 4px;\n}\n.cc-print-design-custom-component-row > .cc-print-design-component-item {\n flex: 1;\n min-width: 0;\n}\n.cc-print-design-toolbar button[aria-label] {\n position: relative;\n}\n.cc-print-design-toolbar button[aria-label]::after {\n position: absolute;\n z-index: 10;\n top: calc(100% + 8px);\n left: 50%;\n width: max-content;\n max-width: 220px;\n padding: 5px 8px;\n border-radius: 5px;\n background: rgba(0, 0, 0, 0.85);\n color: #fff;\n content: attr(aria-label);\n font-size: 12px;\n font-weight: 400;\n line-height: 1.35;\n opacity: 0;\n pointer-events: none;\n transform: translateX(-50%) translateY(-3px);\n transition: opacity 0.15s ease, transform 0.15s ease;\n white-space: normal;\n}\n.cc-print-design-toolbar button[aria-label]:is(:hover, :focus-visible)::after {\n opacity: 1;\n transform: translateX(-50%) translateY(0);\n}\n.cc-print-design-workspace {\n flex: 1 1 auto;\n min-height: 0;\n}\n.cc-print-design-canvas-host {\n position: relative;\n width: 100%;\n height: 100%;\n min-width: 0;\n min-height: 0;\n}\n.cc-print-design-side-host {\n width: 100%;\n height: 100%;\n min-height: 0;\n}\n.cc-print-design-side-host[inert],\n.cc-print-design-properties-host[inert] {\n opacity: 0.72;\n}\n.cc-print-design-preview-navigation {\n display: flex;\n align-items: center;\n gap: 6px;\n white-space: nowrap;\n}\n.cc-print-design-preview-navigation > span {\n min-width: 44px;\n text-align: center;\n font-variant-numeric: tabular-nums;\n}\n.cc-print-design-mobile-nav {\n display: none;\n}\n.cc-print-design-panels {\n width: 100%;\n height: 100%;\n}\n.cc-print-design-panels > .canvas-react-resizable-panels-item {\n min-width: 0;\n min-height: 0;\n}\n.cc-print-design-panels > .canvas-react-resizable-panels-item:nth-child(1),\n.cc-print-design-panels > .canvas-react-resizable-panels-item:nth-child(3) {\n background: var(--pd-surface);\n}\n.cc-print-design-panels > .canvas-react-resizable-panels-item:nth-child(2) {\n overflow: hidden;\n background: var(--pd-workspace);\n}\n.cc-print-design-canvas-frame {\n width: 100%;\n height: 100%;\n min-width: 0;\n min-height: 0;\n}\n.cc-print-design-left-panel,\n.cc-print-design-properties {\n display: flex;\n width: 100%;\n height: 100%;\n min-width: 0;\n flex-direction: column;\n overflow: auto;\n scrollbar-width: none;\n background: var(--pd-surface);\n}\n.cc-print-design-left-panel::-webkit-scrollbar,\n.cc-print-design-properties::-webkit-scrollbar {\n display: none;\n}\n.cc-print-design-properties-host {\n width: 100%;\n height: 100%;\n min-height: 0;\n}\n.cc-print-design-tabs {\n position: sticky;\n top: 0;\n z-index: 1;\n display: flex;\n box-sizing: border-box;\n height: var(--pd-panel-header-height);\n flex: 0 0 var(--pd-panel-header-height);\n border-bottom: 1px solid var(--pd-border);\n background: var(--pd-surface);\n}\n.cc-print-design-tabs button {\n position: relative;\n flex: 1;\n border: 0;\n color: var(--pd-muted);\n background: transparent;\n cursor: pointer;\n font-size: var(--pd-primary-font-size, 13px);\n}\n.cc-print-design-tabs button.active {\n color: var(--pd-primary);\n}\n.cc-print-design-tabs button.active::after {\n position: absolute;\n right: 18px;\n bottom: -1px;\n left: 18px;\n height: 2px;\n background: var(--pd-primary);\n content: "";\n}\n.cc-print-design-component-list,\n.cc-print-design-layer-list,\n.cc-print-design-page-list {\n padding: 14px 12px;\n}\n.cc-print-design-section-title {\n margin: 0;\n color: var(--pd-muted);\n font-size: var(--pd-secondary-font-size, 11px);\n font-weight: 600;\n letter-spacing: 0.04em;\n}\n.cc-print-design-component-list .cc-print-design-section-title,\n.cc-print-design-layer-list .cc-print-design-section-title {\n margin: 3px 3px 10px;\n}\n.cc-print-design-component-item {\n display: flex;\n width: 100%;\n height: 38px;\n align-items: center;\n gap: 10px;\n padding: 0 9px;\n border: 1px solid transparent;\n border-radius: 6px;\n color: var(--pd-text);\n background: var(--pd-surface);\n cursor: pointer;\n text-align: left;\n}\n.cc-print-design-component-item:hover {\n border-color: var(--pd-selected-border);\n color: var(--pd-primary);\n background: var(--pd-selected);\n}\n.cc-print-design-component-item > span {\n display: grid;\n width: 22px;\n height: 22px;\n place-items: center;\n border-radius: 5px;\n color: var(--pd-icon);\n background: var(--pd-selected);\n font-size: 15px;\n}\n.cc-print-design-component-item b {\n margin-left: auto;\n color: var(--pd-muted);\n font-weight: 400;\n}\n.cc-print-design-hint {\n margin: 12px 4px;\n color: var(--pd-muted);\n font-size: var(--pd-secondary-font-size, 11px);\n line-height: 1.6;\n}\n.cc-print-design-layer-item {\n display: flex;\n width: 100%;\n height: 34px;\n align-items: center;\n gap: 8px;\n padding: 0 7px;\n border: 0;\n border-radius: 5px;\n color: var(--pd-text);\n background: transparent;\n text-align: left;\n}\n.cc-print-design-layer-item:hover {\n background: var(--pd-hover);\n}\n.cc-print-design-layer-item.selected {\n color: var(--pd-primary);\n background: var(--pd-selected);\n}\n.cc-print-design-layer-select {\n display: flex;\n min-width: 0;\n height: 100%;\n flex: 1;\n align-items: center;\n gap: 8px;\n padding: 0;\n border: 0;\n color: inherit;\n background: transparent;\n cursor: pointer;\n text-align: left;\n}\n.cc-print-design-layer-name {\n flex: 1;\n overflow: hidden;\n text-overflow: ellipsis;\n white-space: nowrap;\n}\n.cc-print-design-layer-delete,\n.cc-print-design-layer-lock {\n width: 23px;\n height: 23px;\n flex: 0 0 23px;\n border: 0;\n border-radius: 4px;\n color: var(--pd-muted);\n background: transparent;\n cursor: pointer;\n font-size: 17px;\n}\n.cc-print-design-layer-delete:hover {\n color: var(--pd-danger);\n background: var(--pd-surface);\n}\n.cc-print-design-layer-lock:hover,\n.cc-print-design-layer-lock[aria-pressed=true] {\n color: var(--pd-primary);\n background: var(--pd-surface);\n}\n.cc-print-design-empty {\n padding: 20px 0;\n color: var(--pd-muted);\n font-size: var(--pd-primary-font-size, 13px);\n text-align: center;\n}\n.cc-print-design-page-list {\n display: flex;\n flex-direction: column;\n gap: 9px;\n}\n.cc-print-design-page-list-head {\n display: flex;\n align-items: center;\n justify-content: space-between;\n margin: 1px 3px 4px;\n}\n.cc-print-design-page-list-head .cc-print-design-add-link {\n border: 0;\n padding: 2px 0;\n color: var(--pd-primary);\n background: transparent;\n cursor: pointer;\n font-size: var(--pd-primary-font-size, 13px);\n}\n.cc-print-design-add-link:hover:not(:disabled) {\n text-decoration: underline;\n}\n.cc-print-design-add-link:disabled {\n color: var(--pd-muted);\n cursor: not-allowed;\n}\n.cc-print-design-page-card {\n display: flex;\n min-height: 58px;\n align-items: center;\n gap: 10px;\n padding: 8px;\n border: 1px solid var(--pd-border);\n border-radius: 7px;\n background: var(--pd-surface);\n cursor: pointer;\n text-align: left;\n}\n.cc-print-design-page-card.selected {\n border-color: var(--pd-selected-border);\n box-shadow: 0 0 0 2px var(--pd-selected);\n}\n.cc-print-design-page-thumbnail {\n display: grid;\n width: 31px;\n height: 40px;\n place-items: center;\n border: 1px solid var(--pd-border);\n border-radius: 3px;\n color: var(--pd-muted);\n background: var(--pd-subtle);\n font-size: var(--pd-secondary-font-size, 11px);\n}\n.cc-print-design-page-card > span:last-child {\n display: flex;\n min-width: 0;\n flex-direction: column;\n gap: 4px;\n}\n.cc-print-design-page-card strong {\n overflow: hidden;\n color: var(--pd-text);\n text-overflow: ellipsis;\n white-space: nowrap;\n font-size: var(--pd-primary-font-size, 13px);\n}\n.cc-print-design-page-card small {\n color: var(--pd-muted);\n font-size: var(--pd-secondary-font-size, 11px);\n}\n.cc-print-design-page-shortcut {\n display: flex;\n align-items: center;\n justify-content: space-between;\n margin: auto 12px 12px;\n padding: 10px 9px;\n border-top: 1px solid var(--pd-border);\n color: var(--pd-muted);\n font-size: var(--pd-secondary-font-size, 11px);\n}\n.cc-print-design-page-shortcut div {\n display: flex;\n flex-direction: column;\n gap: 4px;\n}\n.cc-print-design-page-shortcut strong {\n color: var(--pd-text);\n font-size: var(--pd-primary-font-size, 13px);\n}\n.cc-print-design-page-shortcut button {\n padding: 5px 7px;\n border: 1px solid var(--pd-border);\n border-radius: 4px;\n color: var(--pd-muted);\n background: var(--pd-surface);\n cursor: pointer;\n font-size: var(--pd-secondary-font-size, 11px);\n}\n.cc-print-design-properties-title {\n display: flex;\n box-sizing: border-box;\n height: var(--pd-panel-header-height);\n flex: 0 0 var(--pd-panel-header-height);\n align-items: center;\n gap: 8px;\n padding: 0 15px;\n border-bottom: 1px solid var(--pd-border);\n}\n.cc-print-design-properties .canvas-react-button {\n font-size: var(--canvas-react-font-size, 14px);\n}\n.cc-print-design-properties-title strong {\n flex-shrink: 0;\n color: var(--pd-text);\n font-size: var(--pd-primary-font-size, 13px);\n}\n.cc-print-design-properties-title span {\n min-width: 0;\n overflow: hidden;\n color: var(--pd-muted);\n text-overflow: ellipsis;\n white-space: nowrap;\n font-size: var(--pd-secondary-font-size, 11px);\n}\n.cc-print-design-property-section {\n flex-shrink: 0;\n border-bottom: 1px solid var(--pd-divider);\n}\n.cc-print-design-property-section > .canvas-react-collapse-panel-trigger {\n box-sizing: border-box;\n height: calc(var(--pd-panel-header-height) - 1px);\n padding: 0 14px;\n color: var(--pd-text);\n font-size: var(--pd-primary-font-size, 13px);\n}\n.cc-print-design-editor .canvas-react-collapse-panel-title {\n color: var(--pd-text);\n}\n.cc-print-design-property-section > .canvas-react-collapse-panel-content {\n padding: 0 14px 15px;\n}\n.cc-print-design-property-grid {\n display: grid;\n grid-template-columns: repeat(2, minmax(0, 1fr));\n gap: 11px 9px;\n}\n.cc-print-design-field {\n display: flex;\n min-width: 0;\n flex-direction: column;\n gap: 5px;\n color: var(--pd-muted);\n font-size: var(--pd-secondary-font-size, 11px);\n}\n.cc-print-design-field > :last-child {\n width: 100%;\n min-width: 0;\n}\n.cc-print-design-field-full {\n grid-column: 1 / -1;\n}\n.cc-print-design-text-size-rule {\n display: grid;\n grid-template-columns: minmax(0, 1fr) auto minmax(0, 1fr) auto auto;\n align-items: center;\n gap: 5px;\n}\n.cc-print-design-text-editor::-webkit-scrollbar {\n display: none;\n}\n.cc-print-design-template-property-fields {\n display: flex;\n flex-direction: column;\n gap: 12px;\n}\n.cc-print-design-template-property-fields time {\n color: var(--pd-text);\n font-size: var(--pd-primary-font-size, 13px);\n}\n.cc-print-design-field .canvas-react-input,\n.cc-print-design-field .canvas-react-input-affix-wrapper,\n.cc-print-design-field .canvas-react-select,\n.cc-print-design-field .canvas-react-color {\n width: 100%;\n}\n.cc-print-design-paper-row {\n display: flex;\n min-width: 0;\n align-items: center;\n gap: 4px;\n}\n.cc-print-design-paper-row > .canvas-react-select {\n flex: 1;\n width: 0;\n min-width: 0;\n}\n.cc-print-design-paper-actions {\n display: flex;\n flex: none;\n align-items: center;\n gap: 4px;\n}\n.cc-print-design-paper-actions .canvas-react-button {\n width: 32px;\n padding: 6px;\n}\n.cc-print-design-paper-dialog {\n display: flex;\n flex-direction: column;\n gap: 14px;\n min-width: 0;\n}\n.cc-print-design-paper-list {\n max-height: min(32vh, 240px);\n overflow: auto;\n border: 1px solid var(--canvas-react-color-border, #d9d9d9);\n border-radius: 4px;\n}\n.cc-print-design-paper-item {\n display: grid;\n grid-template-columns: minmax(0, 1fr) 36px 36px;\n align-items: center;\n gap: 3px;\n min-height: 48px;\n padding: 4px 8px 4px 12px;\n}\n.cc-print-design-paper-item .canvas-react-button {\n width: 36px;\n padding: 8px;\n}\n.cc-print-design-paper-item + .cc-print-design-paper-item {\n border-top: 1px solid var(--canvas-react-color-border, #d9d9d9);\n}\n.cc-print-design-paper-item > div {\n display: flex;\n flex-wrap: wrap;\n gap: 2px 8px;\n min-width: 0;\n}\n.cc-print-design-paper-item strong {\n overflow-wrap: anywhere;\n}\n.cc-print-design-paper-item span,\n.cc-print-design-paper-empty {\n color: var(--pd-muted, #667085);\n}\n.cc-print-design-paper-empty {\n margin: 4px 0;\n}\n.cc-print-design-paper-form,\n.cc-print-design-paper-form label {\n display: flex;\n flex-direction: column;\n gap: 7px;\n min-width: 0;\n}\n.cc-print-design-paper-form label > span:first-child {\n font-size: 12px;\n}\n.cc-print-design-paper-dimensions {\n display: grid;\n grid-template-columns: repeat(2, minmax(0, 1fr));\n gap: 12px;\n}\n.cc-print-design-paper-error {\n margin: 0;\n color: #c2410c;\n font-size: 12px;\n}\n.cc-print-design-paper-footer {\n display: flex;\n justify-content: flex-end;\n gap: 8px;\n}\n@media (max-width: 440px) {\n .cc-print-design-paper-dimensions {\n grid-template-columns: 1fr;\n }\n}\n.cc-print-design-margin-grid {\n display: grid;\n grid-column: 1 / -1;\n grid-template-columns: repeat(2, minmax(0, 1fr));\n gap: 10px;\n}\n@media (max-width: 900px) {\n .cc-print-design-toolbar {\n gap: 8px;\n padding: 0 9px;\n }\n .cc-print-design-brand {\n min-width: 120px;\n }\n .cc-print-design-brand small,\n .cc-print-design-toolbar-group:nth-child(2) .cc-print-design-toolbar-separator {\n display: none;\n }\n .cc-print-design-toolbar-group {\n gap: 4px;\n }\n}\n@media (max-width: 700px) {\n .cc-print-design-toolbar {\n flex-basis: 50px;\n justify-content: flex-start;\n overflow-x: auto;\n white-space: nowrap;\n }\n .cc-print-design-brand {\n flex: 0 0 auto;\n }\n .cc-print-design-toolbar-group {\n flex: 0 0 auto;\n }\n .cc-print-design-mobile-nav {\n display: flex;\n height: 36px;\n flex: 0 0 36px;\n border-bottom: 1px solid var(--pd-border);\n background: var(--pd-surface);\n }\n .cc-print-design-mobile-nav button {\n flex: 1;\n border: 0;\n background: transparent;\n color: var(--pd-muted);\n font: inherit;\n }\n .cc-print-design-mobile-nav button.active {\n border-bottom: 2px solid var(--pd-primary);\n color: var(--pd-primary);\n font-weight: 600;\n }\n .cc-print-design-panels .canvas-react-resizable-panels-divider {\n display: none;\n }\n .cc-print-design-panels > .canvas-react-resizable-panels-item {\n display: none;\n width: 100% !important;\n flex: 1 1 100% !important;\n }\n .cc-print-design-panels .canvas-react-resizable-panel {\n width: 100% !important;\n max-width: none !important;\n height: 100% !important;\n flex: 1 1 100% !important;\n }\n .cc-print-design-editor[data-mobile-view=panel] .cc-print-design-panels > .canvas-react-resizable-panels-item:nth-child(1),\n .cc-print-design-editor[data-mobile-view=canvas] .cc-print-design-panels > .canvas-react-resizable-panels-item:nth-child(2),\n .cc-print-design-editor[data-mobile-view=properties] .cc-print-design-panels > .canvas-react-resizable-panels-item:nth-child(3) {\n display: flex;\n }\n}\n.cc-print-design-settings {\n --canvas-react-control-height: 28px;\n box-sizing: border-box;\n width: 100%;\n min-width: 0;\n padding: 0;\n}\n.cc-print-design-settings-toggle {\n display: flex;\n min-height: 28px;\n align-items: center;\n margin: 6px 0;\n}\n.cc-print-design-settings-global-actions {\n box-sizing: border-box;\n display: flex;\n align-items: center;\n justify-content: space-between;\n flex-wrap: wrap;\n gap: 8px 12px;\n padding: 12px;\n border-bottom: 1px solid var(--pd-border);\n}\n.cc-print-design-settings-global-actions .canvas-react-button {\n flex-shrink: 0;\n margin-left: auto;\n padding-inline: 4px;\n border-color: transparent;\n background: transparent;\n color: var(--pd-primary, #1677ff);\n}\n.cc-print-design-settings-global-actions .canvas-react-checkbox {\n min-width: 0;\n font-size: var(--pd-primary-font-size, 13px);\n}\n.cc-print-design-theme-options {\n display: grid;\n grid-template-columns: repeat(2, minmax(0, 1fr));\n gap: 8px;\n padding-top: 12px;\n}\n.cc-print-design-theme-option {\n display: flex;\n min-width: 0;\n min-height: 60px;\n flex-direction: column;\n align-items: center;\n justify-content: center;\n gap: 5px;\n padding: 6px 8px;\n border: 1px solid var(--pd-border);\n border-radius: 4px;\n background: var(--pd-surface);\n color: var(--pd-text);\n cursor: pointer;\n font: inherit;\n white-space: nowrap;\n}\n.cc-print-design-theme-option:hover,\n.cc-print-design-theme-option[aria-pressed=true] {\n border-color: var(--pd-primary);\n}\n.cc-print-design-theme-option[aria-pressed=true] {\n background: var(--pd-selected);\n}\n.cc-print-design-theme-option:focus-visible {\n outline: 2px solid var(--pd-primary);\n outline-offset: 2px;\n}\n.cc-print-design-theme-swatches {\n display: flex;\n width: 37px;\n height: 19px;\n flex: 0 0 37px;\n overflow: hidden;\n border: 1px solid var(--pd-border);\n border-radius: 3px;\n}\n.cc-print-design-theme-swatches > span {\n flex: 1;\n}\n.cc-print-design-settings-toggle .canvas-react-checkbox {\n min-width: 0;\n font-size: var(--pd-primary-font-size, 13px);\n}\n.cc-print-design-settings-field {\n display: flex;\n min-width: 0;\n flex-direction: column;\n gap: 6px;\n margin-top: 14px;\n}\n.cc-print-design-settings-field > span:first-child {\n color: var(--pd-muted);\n font-size: var(--pd-primary-font-size, 13px);\n line-height: 18px;\n}\n.cc-print-design-settings-field .canvas-react-color-wrap {\n height: 28px;\n}\n.cc-print-design-settings .canvas-react-color-preview {\n width: 20px;\n height: 20px;\n}\n.cc-print-design-settings .canvas-react-input-number-handler {\n flex-basis: 24px;\n}\n.cc-print-design-settings .cc-print-design-hint {\n margin: 14px 0 0;\n}\n.cc-print-design-chart-data {\n padding: 12px;\n min-width: 0;\n --canvas-react-control-height: 28px;\n border-bottom: 1px solid var(--pd-border);\n}\n.cc-print-design-chart-data h4 {\n margin: 12px 0;\n font-size: var(--pd-primary-font-size, 13px);\n}\n.cc-print-design-chart-data > label,\n.cc-print-design-chart-series > label {\n display: flex;\n flex-direction: column;\n gap: 6px;\n margin: 10px 0;\n font-size: var(--pd-primary-font-size, 13px);\n}\n.cc-print-design-chart-row {\n display: flex;\n gap: 6px;\n margin: 6px 0;\n min-width: 0;\n}\n.cc-print-design-chart-row > :first-child {\n flex: 1;\n min-width: 0;\n}\n.cc-print-design-chart-row button {\n flex-shrink: 0;\n padding-inline: 8px;\n}\n.cc-print-design-chart-series {\n border: 1px solid var(--pd-border);\n border-radius: 6px;\n padding: 8px;\n margin: 8px 0;\n}\n.cc-print-design-chart-data pre {\n max-height: 200px;\n overflow: auto;\n font-size: var(--pd-secondary-font-size, 11px);\n}\n.cc-print-design-chart-simple {\n margin: 10px 0;\n}\n.cc-print-design-table-data {\n padding: 12px;\n border-bottom: 1px solid var(--pd-border);\n --canvas-react-control-height: 28px;\n}\n.cc-print-design-table-data h4 {\n font-size: var(--pd-primary-font-size, 13px);\n margin: 12px 0;\n}\n.cc-print-design-table-data label:not(.canvas-react-checkbox) {\n display: flex;\n flex-direction: column;\n gap: 6px;\n margin: 10px 0;\n}\n.cc-print-design-compact-grid:not([hidden]) {\n display: grid;\n grid-template-columns: repeat(2, minmax(0, 1fr));\n gap: 8px;\n}\n.cc-print-design-compact-grid > .canvas-react-checkbox {\n grid-column: 1 / -1;\n}\n.cc-print-design-table-data.cc-print-design-compact-grid label:not(.canvas-react-checkbox) {\n min-width: 0;\n gap: 4px;\n margin: 0;\n}\n.cc-print-design-compact-grid .canvas-react-input-number,\n.cc-print-design-compact-grid .canvas-react-color-picker {\n width: 100%;\n min-width: 0;\n}\n.cc-print-design-table-column {\n border: 1px solid var(--pd-border);\n border-radius: 6px;\n margin-bottom: 8px;\n overflow: hidden;\n}\n.cc-print-design-column-heading {\n display: flex;\n align-items: center;\n justify-content: space-between;\n gap: 8px;\n min-width: 0;\n}\n.cc-print-design-column-heading > span {\n overflow: hidden;\n text-overflow: ellipsis;\n white-space: nowrap;\n}\n.cc-print-design-column-heading small {\n flex-shrink: 0;\n color: var(--pd-muted);\n font-size: var(--pd-secondary-font-size, 11px);\n font-weight: normal;\n}\n.cc-print-design-column-grid:not([hidden]) {\n display: grid;\n grid-template-columns: repeat(2, minmax(0, 1fr));\n gap: 8px;\n padding: 8px;\n}\n.cc-print-design-column-grid > * {\n grid-column: 1 / -1;\n min-width: 0;\n}\n.cc-print-design-column-grid > .cc-print-design-column-half {\n grid-column: span 1;\n}\n.cc-print-design-table-data .cc-print-design-column-grid label:not(.canvas-react-checkbox),\n.cc-print-design-column-grid > .cc-print-design-field {\n gap: 4px;\n margin: 0;\n}\n.cc-print-design-column-grid .canvas-react-input-number {\n min-width: 0;\n width: 100%;\n}\n.cc-print-design-column-actions {\n display: flex;\n justify-content: space-between;\n align-items: center;\n gap: 8px;\n}\n.cc-print-design-column-actions > .canvas-react-button {\n padding: 4px;\n}\n.cc-print-design-table-json {\n margin: 12px 0;\n}\n.cc-print-design-table-json textarea {\n box-sizing: border-box;\n width: 100%;\n min-height: 160px;\n resize: vertical;\n font-size: var(--pd-primary-font-size, 13px);\n margin: 8px 0;\n}\n.cc-print-design-table-row {\n border: 1px solid var(--pd-border);\n border-radius: 6px;\n padding: 8px;\n margin: 8px 0;\n}\n.cc-print-design-table-data pre {\n max-height: 200px;\n overflow: auto;\n font-size: var(--pd-primary-font-size, 13px);\n overscroll-behavior: contain;\n}\n.cc-print-design-table-colors > div {\n border-bottom: 1px solid var(--pd-border);\n padding-bottom: 8px;\n}\n.cc-print-design-layer-controls {\n display: flex;\n flex-wrap: wrap;\n gap: 6px;\n margin: 8px 0;\n}\n.cc-print-design-layer-controls .canvas-react-button {\n padding: 6px;\n}\n.cc-print-design-layer-item {\n position: relative;\n}\n.cc-print-design-layer-drag {\n display: inline-flex;\n align-items: center;\n justify-content: center;\n flex-shrink: 0;\n padding: 4px;\n border: 0;\n background: transparent;\n color: var(--pd-muted);\n cursor: grab;\n}\n.cc-print-design-layer-drag:active {\n cursor: grabbing;\n}\n.cc-print-design-layer-drag:disabled {\n cursor: default;\n opacity: 0.4;\n}\n.cc-print-design-layer-children {\n margin-left: 12px;\n border-left: 1px solid var(--pd-divider);\n padding-left: 3px;\n}\n.cc-print-design-layer-drag {\n touch-action: none;\n}\n.cc-print-design-layer-menu {\n padding: 4px;\n font-size: var(--pd-primary-font-size, 13px);\n}\n.cc-print-design-layer-menu button {\n display: flex;\n gap: 8px;\n align-items: center;\n width: 100%;\n border: 0;\n border-radius: 4px;\n background: transparent;\n color: var(--pd-text);\n padding: 8px;\n cursor: pointer;\n}\n.cc-print-design-layer-menu button:hover:not(:disabled),\n.cc-print-design-layer-menu button:focus-visible {\n background: var(--pd-selected);\n}\n.cc-print-design-layer-menu button:disabled {\n opacity: 0.4;\n cursor: default;\n}\n.cc-print-design-layer-menu button > span:last-child {\n margin-left: auto;\n color: var(--pd-muted);\n font-size: var(--pd-secondary-font-size, 11px);\n}\n.cc-print-design-layer-list {\n user-select: none;\n}\n.cc-print-design-menu-separator {\n height: 1px;\n background: var(--pd-divider);\n margin: 4px 0;\n}\n.cc-print-design-layer-menu button.danger {\n color: var(--pd-danger);\n}\n.cc-print-design-layer-menu button > .cc-print-design-menu-label:last-child {\n margin-left: 0;\n color: inherit;\n font-size: var(--pd-primary-font-size, 13px);\n}\n.cc-print-design-layer-order-row {\n display: flex;\n align-items: center;\n gap: 6px;\n min-width: 0;\n}\n.cc-print-design-layer-order-row > :first-child {\n flex: 1;\n min-width: 0;\n width: 0;\n}\n.cc-print-design-layer-order-row .cc-print-design-layer-controls {\n flex: none;\n flex-wrap: nowrap;\n gap: 2px;\n margin: 0;\n}\n.cc-print-design-alignment-controls {\n display: flex;\n gap: 6px;\n}\n.cc-print-design-alignment-controls .canvas-react-button {\n flex: 1;\n padding: 6px;\n}\n.cc-print-design-alignment-controls .canvas-react-button[aria-pressed=true] {\n color: var(--pd-primary, #2563eb);\n border-color: var(--pd-primary, #2563eb);\n background: var(--pd-selected);\n}\n.cc-print-design-data-fieldset {\n margin: 0;\n padding: 0;\n border: 0;\n min-width: 0;\n}\n.cc-print-design-data-preview {\n overflow-wrap: anywhere;\n white-space: pre-wrap;\n margin: 0;\n}\n.cc-print-design-layer-heading {\n display: flex;\n align-items: center;\n justify-content: space-between;\n gap: 8px;\n}\n.cc-print-design-layer-heading .cc-print-design-section-title {\n margin: 0;\n}\n.cc-print-design-link {\n border: 0;\n padding: 0;\n color: var(--pd-primary);\n background: transparent;\n cursor: pointer;\n font-size: var(--pd-secondary-font-size, 11px);\n}\n.cc-print-design-link:disabled {\n color: #b8c0cc;\n cursor: not-allowed;\n}\n.cc-print-design-editor .canvas-react-button:hover:not(:disabled) {\n border-color: var(--pd-primary);\n color: var(--pd-primary);\n}\n.cc-print-design-editor .canvas-react-button-primary {\n border-color: var(--pd-primary);\n background: var(--pd-primary);\n color: #fff;\n}\n.cc-print-design-editor .canvas-react-button-primary:hover:not(:disabled) {\n border-color: var(--canvas-react-color-primary-hover);\n background: var(--canvas-react-color-primary-hover);\n color: #fff;\n}\n.cc-print-design-editor .canvas-react-radio input:checked + .canvas-react-radio-mark {\n border-color: var(--pd-primary);\n}\n.cc-print-design-editor[data-theme=dark] .canvas-react-select-disabled,\n.cc-print-design-editor[data-theme=dark] .canvas-react-number-input-affix-wrapper-disabled,\n.cc-print-design-editor[data-theme=dark] .canvas-react-input-number-disabled {\n background: var(--pd-subtle);\n color: var(--pd-muted);\n}\n.cc-print-design-editor[data-theme=dark] .canvas-react-input-number-disabled:hover {\n border-color: var(--pd-border);\n}\n.cc-print-design-editor[data-theme=dark] .canvas-react-input-number-disabled .canvas-react-input-number-input,\n.cc-print-design-editor[data-theme=dark] .canvas-react-input-number-disabled .canvas-react-input-number-handler:disabled {\n color: var(--pd-muted);\n}\n.cc-print-design-editor .cc-print-design-field > span:first-child,\n.cc-print-design-editor .cc-print-design-settings-field > span:first-child,\n.cc-print-design-editor .cc-print-design-table-data label,\n.cc-print-design-editor .cc-print-design-chart-data label {\n font-size: var(--pd-label-font-size, 12px);\n color: var(--pd-muted);\n}\n.cc-print-design-editor .canvas-react-input,\n.cc-print-design-editor .canvas-react-textarea,\n.cc-print-design-editor .canvas-react-input-number-input {\n font-size: var(--pd-primary-font-size, 13px);\n color: var(--pd-text);\n}\n.cc-print-design-row-settings:not([hidden]) {\n display: grid;\n grid-template-columns: repeat(2, minmax(0, 1fr));\n gap: 8px;\n}\n.cc-print-design-row-settings > * {\n grid-column: 1 / -1;\n min-width: 0;\n}\n.cc-print-design-row-settings > .cc-print-design-column-half {\n grid-column: span 1;\n margin: 0;\n gap: 4px;\n}\n.cc-print-design-row-settings .canvas-react-input-number {\n min-width: 0;\n width: 100%;\n}\n.cc-print-design-row-settings .cc-print-design-hint {\n margin: 0;\n}\n.cc-print-design-data-compact {\n padding: 8px;\n}\n.cc-print-design-data-compact .cc-print-design-hint {\n margin: 6px 0;\n}\n.cc-print-design-data-compact .cc-print-design-table-json {\n margin: 6px 0;\n}\n.cc-print-design-data-compact .cc-print-design-table-row {\n padding: 0;\n margin: 6px 0;\n overflow: hidden;\n}\n.cc-print-design-static-row-grid:not([hidden]) {\n display: grid;\n grid-template-columns: repeat(2, minmax(0, 1fr));\n gap: 8px;\n padding: 8px;\n}\n.cc-print-design-static-row-grid > * {\n min-width: 0;\n}\n.cc-print-design-static-tasks > strong,\n.cc-print-design-task-dependencies > strong {\n display: block;\n margin: 8px 0 4px;\n}\n.cc-print-design-gantt-connection-title {\n display: block;\n margin: 12px 0 6px;\n}\n.cc-print-design-task-title {\n padding: 8px;\n font-weight: 600;\n}\n.cc-print-design-task-dependencies {\n grid-column: 1 / -1;\n min-width: 0;\n}\n.cc-print-design-task-dependency-row {\n display: grid;\n grid-template-columns: repeat(2, minmax(0, 1fr));\n gap: 8px;\n padding: 8px 0;\n border-top: 1px solid #e7edf5;\n}\n.cc-print-design-task-dependency-row > * {\n min-width: 0;\n}\n.cc-print-design-table-data .cc-print-design-static-row-grid label:not(.canvas-react-checkbox) {\n margin: 0;\n gap: 4px;\n overflow-wrap: anywhere;\n}\n.cc-print-design-static-row-grid .canvas-react-input-number {\n width: 100%;\n min-width: 0;\n}\n.cc-print-design-static-row-grid > .cc-print-design-table-json,\n.cc-print-design-static-row-actions {\n grid-column: 1 / -1;\n}\n.cc-print-design-static-row-actions {\n display: flex;\n justify-content: flex-end;\n}\n.cc-print-design-static-row-actions > .canvas-react-button {\n padding: 4px;\n}\n');
|
|
9636
|
+
styleInject('.cc-print-design-editor {\n position: relative;\n --pd-border: #e4e8ef;\n --pd-text: var(--canvas-react-color-text, #263244);\n --pd-muted: var(--canvas-react-color-text-muted, #8993a2);\n --pd-primary: #1677ff;\n --pd-background: #f7f8fa;\n --pd-surface: #fff;\n --pd-workspace: #e9edf3;\n --pd-hover: #f5f7fa;\n --pd-selected: #edf4ff;\n --pd-subtle: #fafbfd;\n --pd-icon: #4279cb;\n --pd-divider: #edf0f4;\n --pd-selected-border: #86b4ff;\n --pd-danger: #dc2626;\n --pd-brand-start: #428cff;\n --pd-brand-end: #1261d8;\n --canvas-react-shadow-focus: 0 0 0 2px color-mix(in srgb, var(--pd-primary) 18%, transparent);\n --pd-label-font-size: var(--canvas-react-font-size-label, 12px);\n --pd-primary-font-size: var(--canvas-react-font-size, 13px);\n --pd-secondary-font-size: var(--canvas-react-font-size-secondary, 11px);\n --pd-panel-header-height: 36px;\n display: flex;\n flex-direction: column;\n box-sizing: border-box;\n width: 100%;\n height: 100%;\n min-width: 0;\n min-height: 0;\n overflow: hidden;\n color: var(--pd-text);\n background: var(--pd-background);\n font-family:\n Inter,\n -apple-system,\n BlinkMacSystemFont,\n "Segoe UI",\n "PingFang SC",\n "Microsoft YaHei",\n sans-serif;\n font-size: var(--pd-primary-font-size, 13px);\n}\n.cc-print-design-editor:fullscreen {\n width: 100vw !important;\n height: 100vh !important;\n}\n.cc-print-design-toolbar {\n z-index: 2;\n display: flex;\n flex: 0 0 58px;\n align-items: center;\n justify-content: space-between;\n gap: 16px;\n padding: 0 18px;\n border-bottom: 1px solid var(--pd-border);\n background: var(--pd-surface);\n}\n.cc-print-design-brand,\n.cc-print-design-brand > div,\n.cc-print-design-toolbar-group {\n display: flex;\n align-items: center;\n}\n.cc-print-design-brand {\n gap: 10px;\n min-width: 180px;\n}\n.cc-print-design-brand > div {\n flex-direction: column;\n align-items: flex-start;\n gap: 2px;\n}\n.cc-print-design-brand strong {\n max-width: 170px;\n overflow: hidden;\n text-overflow: ellipsis;\n white-space: nowrap;\n font-size: var(--pd-primary-font-size, 13px);\n}\n.cc-print-design-brand small {\n color: var(--pd-muted);\n font-size: var(--pd-secondary-font-size, 11px);\n}\n.cc-print-design-brand-mark {\n display: grid;\n width: 32px;\n height: 32px;\n place-items: center;\n border-radius: 9px;\n color: #fff;\n background:\n linear-gradient(\n 145deg,\n var(--pd-brand-start),\n var(--pd-brand-end));\n font-size: 16px;\n font-weight: 700;\n}\n.cc-print-design-toolbar-group {\n gap: 7px;\n}\n.cc-print-design-toolbar-unit {\n margin-left: 8px;\n padding: 4px 9px;\n border: 1px solid var(--pd-border);\n border-radius: 5px;\n color: var(--pd-muted);\n background: var(--pd-surface);\n font-size: var(--pd-secondary-font-size);\n white-space: nowrap;\n}\n.cc-print-design-clock-options {\n grid-column: 1 / -1;\n display: flex;\n flex-wrap: wrap;\n gap: 8px 16px;\n}\n.cc-print-design-save-status {\n max-width: 120px;\n overflow: hidden;\n color: var(--pd-muted);\n font-size: var(--pd-secondary-font-size);\n text-overflow: ellipsis;\n white-space: nowrap;\n}\n.cc-print-design-template-list {\n gap: 9px;\n}\n.cc-print-design-template-card {\n display: flex;\n flex-direction: column;\n min-height: 58px;\n padding: 8px;\n border: 1px solid var(--pd-border);\n border-radius: 7px;\n background: var(--pd-surface);\n}\n.cc-print-design-template-card.selected {\n border-color: var(--pd-selected-border);\n box-shadow: 0 0 0 2px var(--pd-selected);\n}\n.cc-print-design-template-select,\n.cc-print-design-template-heading {\n display: flex;\n min-width: 0;\n align-items: center;\n gap: 10px;\n}\n.cc-print-design-template-heading {\n flex-wrap: wrap;\n}\n.cc-print-design-template-heading > .cc-print-design-page-thumbnail {\n flex: 0 0 31px;\n}\n.cc-print-design-template-heading > .cc-print-design-template-label {\n flex: 1 1 calc(100% - 41px);\n}\n.cc-print-design-template-heading > .canvas-react-button {\n width: 26px;\n height: 26px;\n flex: 0 0 26px;\n}\n.cc-print-design-template-heading > .canvas-react-button:first-of-type {\n margin-left: auto;\n}\n.cc-print-design-template-select {\n width: 100%;\n padding: 0;\n border: 0;\n background: transparent;\n color: var(--pd-text);\n cursor: pointer;\n text-align: left;\n}\n.cc-print-design-template-select.selected,\n.cc-print-design-template-versions button.selected {\n color: var(--pd-primary);\n font-weight: 600;\n}\n.cc-print-design-template-label {\n display: flex;\n min-width: 0;\n flex: 1;\n flex-direction: column;\n gap: 4px;\n}\n.cc-print-design-template-label strong {\n overflow: hidden;\n text-overflow: ellipsis;\n white-space: nowrap;\n font-size: var(--pd-primary-font-size);\n}\n.cc-print-design-template-label small {\n color: var(--pd-muted);\n font-size: var(--pd-secondary-font-size);\n}\n.cc-print-design-template-invalid {\n color: var(--pd-danger);\n font-size: var(--pd-secondary-font-size);\n font-weight: 600;\n}\n.cc-print-design-template-versions {\n display: flex;\n flex-direction: column;\n margin: 7px 0 0 41px;\n border-top: 1px solid var(--pd-border);\n}\n.cc-print-design-template-version {\n display: flex;\n align-items: center;\n gap: 4px;\n}\n.cc-print-design-template-version > button:first-child {\n flex: 1;\n min-width: 0;\n padding: 7px 0;\n border: 0;\n background: transparent;\n color: var(--pd-muted);\n cursor: pointer;\n text-align: left;\n font-size: var(--pd-secondary-font-size);\n}\n.cc-print-design-template-version > .canvas-react-button {\n width: 24px;\n height: 24px;\n flex: 0 0 24px;\n padding: 0;\n border: 0;\n color: var(--pd-muted);\n background: transparent;\n}\n.cc-print-design-template-version > .canvas-react-button:hover:not(:disabled) {\n color: var(--pd-danger);\n}\n.cc-print-design-toolbar .canvas-react-button {\n box-sizing: border-box;\n width: 32px;\n height: 32px;\n flex: 0 0 32px;\n padding: 4px;\n}\n.cc-print-design-toolbar-separator {\n width: 1px;\n height: 22px;\n margin: 0 5px;\n background: var(--pd-border);\n}\n.cc-print-design-zoom-value {\n min-width: 40px;\n color: var(--pd-muted);\n font-size: var(--pd-primary-font-size, 13px);\n text-align: center;\n}\n.cc-print-design-zoom-value input {\n box-sizing: border-box;\n width: 42px;\n padding: 3px 2px;\n border: 1px solid transparent;\n border-radius: 4px;\n background: transparent;\n color: var(--pd-text);\n font: inherit;\n text-align: right;\n}\n.cc-print-design-zoom-value input:focus {\n border-color: var(--pd-primary);\n outline: none;\n}\n.cc-print-design-panel-width-group {\n display: grid;\n gap: 6px;\n margin-bottom: 12px;\n}\n.cc-print-design-panel-width-group strong {\n font-size: var(--pd-primary-font-size);\n}\n.cc-print-design-custom-component-row {\n display: flex;\n align-items: center;\n gap: 4px;\n}\n.cc-print-design-custom-component-row > .cc-print-design-component-item {\n flex: 1;\n min-width: 0;\n}\n.cc-print-design-toolbar button[aria-label] {\n position: relative;\n}\n.cc-print-design-toolbar button[aria-label]::after {\n position: absolute;\n z-index: 10;\n top: calc(100% + 8px);\n left: 50%;\n width: max-content;\n max-width: 220px;\n padding: 5px 8px;\n border-radius: 5px;\n background: rgba(0, 0, 0, 0.85);\n color: #fff;\n content: attr(aria-label);\n font-size: 12px;\n font-weight: 400;\n line-height: 1.35;\n opacity: 0;\n pointer-events: none;\n transform: translateX(-50%) translateY(-3px);\n transition: opacity 0.15s ease, transform 0.15s ease;\n white-space: normal;\n}\n.cc-print-design-toolbar button[aria-label]:is(:hover, :focus-visible)::after {\n opacity: 1;\n transform: translateX(-50%) translateY(0);\n}\n.cc-print-design-workspace {\n flex: 1 1 auto;\n min-height: 0;\n}\n.cc-print-design-canvas-host {\n position: relative;\n width: 100%;\n height: 100%;\n min-width: 0;\n min-height: 0;\n}\n.cc-print-design-side-host {\n width: 100%;\n height: 100%;\n min-height: 0;\n}\n.cc-print-design-side-host[inert],\n.cc-print-design-properties-host[inert] {\n opacity: 0.72;\n}\n.cc-print-design-preview-navigation {\n display: flex;\n align-items: center;\n gap: 6px;\n white-space: nowrap;\n}\n.cc-print-design-preview-navigation > span {\n min-width: 44px;\n text-align: center;\n font-variant-numeric: tabular-nums;\n}\n.cc-print-design-mobile-nav {\n display: none;\n}\n.cc-print-design-panels {\n width: 100%;\n height: 100%;\n}\n.cc-print-design-panels > .canvas-react-resizable-panels-item {\n min-width: 0;\n min-height: 0;\n}\n.cc-print-design-panels > .canvas-react-resizable-panels-item:nth-child(1),\n.cc-print-design-panels > .canvas-react-resizable-panels-item:nth-child(3) {\n background: var(--pd-surface);\n}\n.cc-print-design-panels > .canvas-react-resizable-panels-item:nth-child(2) {\n overflow: hidden;\n background: var(--pd-workspace);\n}\n.cc-print-design-canvas-frame {\n width: 100%;\n height: 100%;\n min-width: 0;\n min-height: 0;\n}\n.cc-print-design-left-panel,\n.cc-print-design-properties {\n display: flex;\n width: 100%;\n height: 100%;\n min-width: 0;\n flex-direction: column;\n overflow: auto;\n scrollbar-width: none;\n background: var(--pd-surface);\n}\n.cc-print-design-left-panel::-webkit-scrollbar,\n.cc-print-design-properties::-webkit-scrollbar {\n display: none;\n}\n.cc-print-design-properties-host {\n width: 100%;\n height: 100%;\n min-height: 0;\n}\n.cc-print-design-tabs {\n position: sticky;\n top: 0;\n z-index: 1;\n display: flex;\n box-sizing: border-box;\n height: var(--pd-panel-header-height);\n flex: 0 0 var(--pd-panel-header-height);\n border-bottom: 1px solid var(--pd-border);\n background: var(--pd-surface);\n}\n.cc-print-design-tabs button {\n position: relative;\n flex: 1;\n border: 0;\n color: var(--pd-muted);\n background: transparent;\n cursor: pointer;\n font-size: var(--pd-primary-font-size, 13px);\n}\n.cc-print-design-tabs button.active {\n color: var(--pd-primary);\n}\n.cc-print-design-tabs button.active::after {\n position: absolute;\n right: 18px;\n bottom: -1px;\n left: 18px;\n height: 2px;\n background: var(--pd-primary);\n content: "";\n}\n.cc-print-design-component-list,\n.cc-print-design-layer-list,\n.cc-print-design-page-list {\n padding: 14px 12px;\n}\n.cc-print-design-section-title {\n margin: 0;\n color: var(--pd-muted);\n font-size: var(--pd-secondary-font-size, 11px);\n font-weight: 600;\n letter-spacing: 0.04em;\n}\n.cc-print-design-component-list .cc-print-design-section-title,\n.cc-print-design-layer-list .cc-print-design-section-title {\n margin: 3px 3px 10px;\n}\n.cc-print-design-component-item {\n display: flex;\n width: 100%;\n height: 38px;\n align-items: center;\n gap: 10px;\n padding: 0 9px;\n border: 1px solid transparent;\n border-radius: 6px;\n color: var(--pd-text);\n background: var(--pd-surface);\n cursor: pointer;\n text-align: left;\n}\n.cc-print-design-component-item:hover {\n border-color: var(--pd-selected-border);\n color: var(--pd-primary);\n background: var(--pd-selected);\n}\n.cc-print-design-component-item > span {\n display: grid;\n width: 22px;\n height: 22px;\n place-items: center;\n border-radius: 5px;\n color: var(--pd-icon);\n background: var(--pd-selected);\n font-size: 15px;\n}\n.cc-print-design-component-item b {\n margin-left: auto;\n color: var(--pd-muted);\n font-weight: 400;\n}\n.cc-print-design-hint {\n margin: 12px 4px;\n color: var(--pd-muted);\n font-size: var(--pd-secondary-font-size, 11px);\n line-height: 1.6;\n}\n.cc-print-design-layer-item {\n display: flex;\n width: 100%;\n height: 34px;\n align-items: center;\n gap: 8px;\n padding: 0 7px;\n border: 0;\n border-radius: 5px;\n color: var(--pd-text);\n background: transparent;\n text-align: left;\n}\n.cc-print-design-layer-item:hover {\n background: var(--pd-hover);\n}\n.cc-print-design-layer-item.selected {\n color: var(--pd-primary);\n background: var(--pd-selected);\n}\n.cc-print-design-layer-select {\n display: flex;\n min-width: 0;\n height: 100%;\n flex: 1;\n align-items: center;\n gap: 8px;\n padding: 0;\n border: 0;\n color: inherit;\n background: transparent;\n cursor: pointer;\n text-align: left;\n}\n.cc-print-design-layer-name {\n flex: 1;\n overflow: hidden;\n text-overflow: ellipsis;\n white-space: nowrap;\n}\n.cc-print-design-layer-delete,\n.cc-print-design-layer-lock {\n width: 23px;\n height: 23px;\n flex: 0 0 23px;\n border: 0;\n border-radius: 4px;\n color: var(--pd-muted);\n background: transparent;\n cursor: pointer;\n font-size: 17px;\n}\n.cc-print-design-layer-delete:hover {\n color: var(--pd-danger);\n background: var(--pd-surface);\n}\n.cc-print-design-layer-lock:hover,\n.cc-print-design-layer-lock[aria-pressed=true] {\n color: var(--pd-primary);\n background: var(--pd-surface);\n}\n.cc-print-design-empty {\n padding: 20px 0;\n color: var(--pd-muted);\n font-size: var(--pd-primary-font-size, 13px);\n text-align: center;\n}\n.cc-print-design-page-list {\n display: flex;\n flex-direction: column;\n gap: 9px;\n}\n.cc-print-design-page-list-head {\n display: flex;\n align-items: center;\n justify-content: space-between;\n margin: 1px 3px 4px;\n}\n.cc-print-design-page-list-head .cc-print-design-add-link {\n border: 0;\n padding: 2px 0;\n color: var(--pd-primary);\n background: transparent;\n cursor: pointer;\n font-size: var(--pd-primary-font-size, 13px);\n}\n.cc-print-design-add-link:hover:not(:disabled) {\n text-decoration: underline;\n}\n.cc-print-design-add-link:disabled {\n color: var(--pd-muted);\n cursor: not-allowed;\n}\n.cc-print-design-page-card {\n display: flex;\n min-height: 58px;\n align-items: center;\n gap: 10px;\n padding: 8px;\n border: 1px solid var(--pd-border);\n border-radius: 7px;\n background: var(--pd-surface);\n cursor: pointer;\n text-align: left;\n}\n.cc-print-design-page-card.selected {\n border-color: var(--pd-selected-border);\n box-shadow: 0 0 0 2px var(--pd-selected);\n}\n.cc-print-design-page-thumbnail {\n display: grid;\n width: 31px;\n height: 40px;\n place-items: center;\n border: 1px solid var(--pd-border);\n border-radius: 3px;\n color: var(--pd-muted);\n background: var(--pd-subtle);\n font-size: var(--pd-secondary-font-size, 11px);\n}\n.cc-print-design-page-card > span:last-child {\n display: flex;\n min-width: 0;\n flex-direction: column;\n gap: 4px;\n}\n.cc-print-design-page-card strong {\n overflow: hidden;\n color: var(--pd-text);\n text-overflow: ellipsis;\n white-space: nowrap;\n font-size: var(--pd-primary-font-size, 13px);\n}\n.cc-print-design-page-card small {\n color: var(--pd-muted);\n font-size: var(--pd-secondary-font-size, 11px);\n}\n.cc-print-design-page-shortcut {\n display: flex;\n align-items: center;\n justify-content: space-between;\n margin: auto 12px 12px;\n padding: 10px 9px;\n border-top: 1px solid var(--pd-border);\n color: var(--pd-muted);\n font-size: var(--pd-secondary-font-size, 11px);\n}\n.cc-print-design-page-shortcut div {\n display: flex;\n flex-direction: column;\n gap: 4px;\n}\n.cc-print-design-page-shortcut strong {\n color: var(--pd-text);\n font-size: var(--pd-primary-font-size, 13px);\n}\n.cc-print-design-page-shortcut button {\n padding: 5px 7px;\n border: 1px solid var(--pd-border);\n border-radius: 4px;\n color: var(--pd-muted);\n background: var(--pd-surface);\n cursor: pointer;\n font-size: var(--pd-secondary-font-size, 11px);\n}\n.cc-print-design-properties-title {\n display: flex;\n box-sizing: border-box;\n height: var(--pd-panel-header-height);\n flex: 0 0 var(--pd-panel-header-height);\n align-items: center;\n gap: 8px;\n padding: 0 15px;\n border-bottom: 1px solid var(--pd-border);\n}\n.cc-print-design-properties .canvas-react-button {\n font-size: var(--canvas-react-font-size, 14px);\n}\n.cc-print-design-properties-title strong {\n flex-shrink: 0;\n color: var(--pd-text);\n font-size: var(--pd-primary-font-size, 13px);\n}\n.cc-print-design-properties-title span {\n min-width: 0;\n overflow: hidden;\n color: var(--pd-muted);\n text-overflow: ellipsis;\n white-space: nowrap;\n font-size: var(--pd-secondary-font-size, 11px);\n}\n.cc-print-design-property-section {\n flex-shrink: 0;\n border-bottom: 1px solid var(--pd-divider);\n}\n.cc-print-design-property-section > .canvas-react-collapse-panel-trigger {\n box-sizing: border-box;\n height: calc(var(--pd-panel-header-height) - 1px);\n padding: 0 14px;\n color: var(--pd-text);\n font-size: var(--pd-primary-font-size, 13px);\n}\n.cc-print-design-editor .canvas-react-collapse-panel-title {\n color: var(--pd-text);\n}\n.cc-print-design-property-section > .canvas-react-collapse-panel-content {\n padding: 0 14px 15px;\n}\n.cc-print-design-property-grid {\n display: grid;\n grid-template-columns: repeat(2, minmax(0, 1fr));\n gap: 11px 9px;\n}\n.cc-print-design-field {\n display: flex;\n min-width: 0;\n flex-direction: column;\n gap: 5px;\n color: var(--pd-muted);\n font-size: var(--pd-secondary-font-size, 11px);\n}\n.cc-print-design-field > :last-child {\n width: 100%;\n min-width: 0;\n}\n.cc-print-design-field-full {\n grid-column: 1 / -1;\n}\n.cc-print-design-text-size-rule {\n display: grid;\n grid-template-columns: minmax(0, 1fr) auto minmax(0, 1fr) auto auto;\n align-items: center;\n gap: 5px;\n}\n.cc-print-design-text-editor::-webkit-scrollbar {\n display: none;\n}\n.cc-print-design-template-property-fields {\n display: flex;\n flex-direction: column;\n gap: 12px;\n}\n.cc-print-design-template-property-fields time {\n color: var(--pd-text);\n font-size: var(--pd-primary-font-size, 13px);\n}\n.cc-print-design-field .canvas-react-input,\n.cc-print-design-field .canvas-react-input-affix-wrapper,\n.cc-print-design-field .canvas-react-select,\n.cc-print-design-field .canvas-react-color {\n width: 100%;\n}\n.cc-print-design-paper-row {\n display: flex;\n min-width: 0;\n align-items: center;\n gap: 4px;\n}\n.cc-print-design-paper-row > .canvas-react-select {\n flex: 1;\n width: 0;\n min-width: 0;\n}\n.cc-print-design-paper-actions {\n display: flex;\n flex: none;\n align-items: center;\n gap: 4px;\n}\n.cc-print-design-paper-actions .canvas-react-button {\n width: 32px;\n padding: 6px;\n}\n.cc-print-design-paper-dialog {\n display: flex;\n flex-direction: column;\n gap: 14px;\n min-width: 0;\n}\n.cc-print-design-paper-list {\n max-height: min(32vh, 240px);\n overflow: auto;\n border: 1px solid var(--canvas-react-color-border, #d9d9d9);\n border-radius: 4px;\n}\n.cc-print-design-paper-item {\n display: grid;\n grid-template-columns: minmax(0, 1fr) 36px 36px;\n align-items: center;\n gap: 3px;\n min-height: 48px;\n padding: 4px 8px 4px 12px;\n}\n.cc-print-design-paper-item .canvas-react-button {\n width: 36px;\n padding: 8px;\n}\n.cc-print-design-paper-item + .cc-print-design-paper-item {\n border-top: 1px solid var(--canvas-react-color-border, #d9d9d9);\n}\n.cc-print-design-paper-item > div {\n display: flex;\n flex-wrap: wrap;\n gap: 2px 8px;\n min-width: 0;\n}\n.cc-print-design-paper-item strong {\n overflow-wrap: anywhere;\n}\n.cc-print-design-paper-item span,\n.cc-print-design-paper-empty {\n color: var(--pd-muted, #667085);\n}\n.cc-print-design-paper-empty {\n margin: 4px 0;\n}\n.cc-print-design-paper-form,\n.cc-print-design-paper-form label {\n display: flex;\n flex-direction: column;\n gap: 7px;\n min-width: 0;\n}\n.cc-print-design-paper-form label > span:first-child {\n font-size: 12px;\n}\n.cc-print-design-paper-dimensions {\n display: grid;\n grid-template-columns: repeat(2, minmax(0, 1fr));\n gap: 12px;\n}\n.cc-print-design-paper-error {\n margin: 0;\n color: #c2410c;\n font-size: 12px;\n}\n.cc-print-design-paper-footer {\n display: flex;\n justify-content: flex-end;\n gap: 8px;\n}\n@media (max-width: 440px) {\n .cc-print-design-paper-dimensions {\n grid-template-columns: 1fr;\n }\n}\n.cc-print-design-margin-grid {\n display: grid;\n grid-column: 1 / -1;\n grid-template-columns: repeat(2, minmax(0, 1fr));\n gap: 10px;\n}\n@media (max-width: 900px) {\n .cc-print-design-toolbar {\n gap: 8px;\n padding: 0 9px;\n }\n .cc-print-design-brand {\n min-width: 120px;\n }\n .cc-print-design-brand small,\n .cc-print-design-toolbar-group:nth-child(2) .cc-print-design-toolbar-separator {\n display: none;\n }\n .cc-print-design-toolbar-group {\n gap: 4px;\n }\n}\n@media (max-width: 700px) {\n .cc-print-design-toolbar {\n flex-basis: 50px;\n justify-content: flex-start;\n overflow-x: auto;\n white-space: nowrap;\n }\n .cc-print-design-brand {\n flex: 0 0 auto;\n }\n .cc-print-design-toolbar-group {\n flex: 0 0 auto;\n }\n .cc-print-design-mobile-nav {\n display: flex;\n height: 36px;\n flex: 0 0 36px;\n border-bottom: 1px solid var(--pd-border);\n background: var(--pd-surface);\n }\n .cc-print-design-mobile-nav button {\n flex: 1;\n border: 0;\n background: transparent;\n color: var(--pd-muted);\n font: inherit;\n }\n .cc-print-design-mobile-nav button.active {\n border-bottom: 2px solid var(--pd-primary);\n color: var(--pd-primary);\n font-weight: 600;\n }\n .cc-print-design-panels .canvas-react-resizable-panels-divider {\n display: none;\n }\n .cc-print-design-panels > .canvas-react-resizable-panels-item {\n display: none;\n width: 100% !important;\n flex: 1 1 100% !important;\n }\n .cc-print-design-panels .canvas-react-resizable-panel {\n width: 100% !important;\n max-width: none !important;\n height: 100% !important;\n flex: 1 1 100% !important;\n }\n .cc-print-design-editor[data-mobile-view=panel] .cc-print-design-panels > .canvas-react-resizable-panels-item:nth-child(1),\n .cc-print-design-editor[data-mobile-view=canvas] .cc-print-design-panels > .canvas-react-resizable-panels-item:nth-child(2),\n .cc-print-design-editor[data-mobile-view=properties] .cc-print-design-panels > .canvas-react-resizable-panels-item:nth-child(3) {\n display: flex;\n }\n}\n.cc-print-design-settings {\n --canvas-react-control-height: 28px;\n box-sizing: border-box;\n width: 100%;\n min-width: 0;\n padding: 0;\n}\n.cc-print-design-settings-toggle {\n display: flex;\n min-height: 28px;\n align-items: center;\n margin: 6px 0;\n}\n.cc-print-design-settings-global-actions {\n box-sizing: border-box;\n display: flex;\n align-items: center;\n justify-content: space-between;\n flex-wrap: wrap;\n gap: 8px 12px;\n padding: 12px;\n border-bottom: 1px solid var(--pd-border);\n}\n.cc-print-design-settings-global-actions .canvas-react-button {\n flex-shrink: 0;\n margin-left: auto;\n padding-inline: 4px;\n border-color: transparent;\n background: transparent;\n color: var(--pd-primary, #1677ff);\n}\n.cc-print-design-settings-global-actions .canvas-react-checkbox {\n min-width: 0;\n font-size: var(--pd-primary-font-size, 13px);\n}\n.cc-print-design-theme-options {\n display: grid;\n grid-template-columns: repeat(2, minmax(0, 1fr));\n gap: 8px;\n padding-top: 12px;\n}\n.cc-print-design-theme-option {\n display: flex;\n min-width: 0;\n min-height: 60px;\n flex-direction: column;\n align-items: center;\n justify-content: center;\n gap: 5px;\n padding: 6px 8px;\n border: 1px solid var(--pd-border);\n border-radius: 4px;\n background: var(--pd-surface);\n color: var(--pd-text);\n cursor: pointer;\n font: inherit;\n white-space: nowrap;\n}\n.cc-print-design-theme-option:hover,\n.cc-print-design-theme-option[aria-pressed=true] {\n border-color: var(--pd-primary);\n}\n.cc-print-design-theme-option[aria-pressed=true] {\n background: var(--pd-selected);\n}\n.cc-print-design-theme-option:focus-visible {\n outline: 2px solid var(--pd-primary);\n outline-offset: 2px;\n}\n.cc-print-design-theme-swatches {\n display: flex;\n width: 37px;\n height: 19px;\n flex: 0 0 37px;\n overflow: hidden;\n border: 1px solid var(--pd-border);\n border-radius: 3px;\n}\n.cc-print-design-theme-swatches > span {\n flex: 1;\n}\n.cc-print-design-settings-toggle .canvas-react-checkbox {\n min-width: 0;\n font-size: var(--pd-primary-font-size, 13px);\n}\n.cc-print-design-settings-field {\n display: flex;\n min-width: 0;\n flex-direction: column;\n gap: 6px;\n margin-top: 14px;\n}\n.cc-print-design-settings-field > span:first-child {\n color: var(--pd-muted);\n font-size: var(--pd-primary-font-size, 13px);\n line-height: 18px;\n}\n.cc-print-design-settings-field .canvas-react-color-wrap {\n height: 28px;\n}\n.cc-print-design-settings .canvas-react-color-preview {\n width: 20px;\n height: 20px;\n}\n.cc-print-design-settings .canvas-react-input-number-handler {\n flex-basis: 24px;\n}\n.cc-print-design-settings .cc-print-design-hint {\n margin: 14px 0 0;\n}\n.cc-print-design-chart-data {\n padding: 12px;\n min-width: 0;\n --canvas-react-control-height: 28px;\n border-bottom: 1px solid var(--pd-border);\n}\n.cc-print-design-chart-data h4 {\n margin: 12px 0;\n font-size: var(--pd-primary-font-size, 13px);\n}\n.cc-print-design-chart-data > label,\n.cc-print-design-chart-series > label {\n display: flex;\n flex-direction: column;\n gap: 6px;\n margin: 10px 0;\n font-size: var(--pd-primary-font-size, 13px);\n}\n.cc-print-design-chart-row {\n display: flex;\n gap: 6px;\n margin: 6px 0;\n min-width: 0;\n}\n.cc-print-design-chart-row > :first-child {\n flex: 1;\n min-width: 0;\n}\n.cc-print-design-chart-row button {\n flex-shrink: 0;\n padding-inline: 8px;\n}\n.cc-print-design-chart-series {\n border: 1px solid var(--pd-border);\n border-radius: 6px;\n padding: 8px;\n margin: 8px 0;\n}\n.cc-print-design-chart-data pre {\n max-height: 200px;\n overflow: auto;\n font-size: var(--pd-secondary-font-size, 11px);\n}\n.cc-print-design-chart-simple {\n margin: 10px 0;\n}\n.cc-print-design-table-data {\n padding: 12px;\n border-bottom: 1px solid var(--pd-border);\n --canvas-react-control-height: 28px;\n}\n.cc-print-design-table-data h4 {\n font-size: var(--pd-primary-font-size, 13px);\n margin: 12px 0;\n}\n.cc-print-design-table-data label:not(.canvas-react-checkbox) {\n display: flex;\n flex-direction: column;\n gap: 6px;\n margin: 10px 0;\n}\n.cc-print-design-compact-grid:not([hidden]) {\n display: grid;\n grid-template-columns: repeat(2, minmax(0, 1fr));\n gap: 8px;\n}\n.cc-print-design-compact-grid > .canvas-react-checkbox {\n grid-column: 1 / -1;\n}\n.cc-print-design-table-data.cc-print-design-compact-grid label:not(.canvas-react-checkbox) {\n min-width: 0;\n gap: 4px;\n margin: 0;\n}\n.cc-print-design-compact-grid .canvas-react-input-number,\n.cc-print-design-compact-grid .canvas-react-color-picker {\n width: 100%;\n min-width: 0;\n}\n.cc-print-design-table-column {\n border: 1px solid var(--pd-border);\n border-radius: 6px;\n margin-bottom: 8px;\n overflow: hidden;\n}\n.cc-print-design-column-heading {\n display: flex;\n align-items: center;\n justify-content: space-between;\n gap: 8px;\n min-width: 0;\n}\n.cc-print-design-column-heading > span {\n overflow: hidden;\n text-overflow: ellipsis;\n white-space: nowrap;\n}\n.cc-print-design-column-heading small {\n flex-shrink: 0;\n color: var(--pd-muted);\n font-size: var(--pd-secondary-font-size, 11px);\n font-weight: normal;\n}\n.cc-print-design-column-grid:not([hidden]) {\n display: grid;\n grid-template-columns: repeat(2, minmax(0, 1fr));\n gap: 8px;\n padding: 8px;\n}\n.cc-print-design-column-grid > * {\n grid-column: 1 / -1;\n min-width: 0;\n}\n.cc-print-design-column-grid > .cc-print-design-column-half {\n grid-column: span 1;\n}\n.cc-print-design-table-data .cc-print-design-column-grid label:not(.canvas-react-checkbox),\n.cc-print-design-column-grid > .cc-print-design-field {\n gap: 4px;\n margin: 0;\n}\n.cc-print-design-column-grid .canvas-react-input-number {\n min-width: 0;\n width: 100%;\n}\n.cc-print-design-column-actions {\n display: flex;\n justify-content: space-between;\n align-items: center;\n gap: 8px;\n}\n.cc-print-design-column-actions > .canvas-react-button {\n padding: 4px;\n}\n.cc-print-design-table-json {\n margin: 12px 0;\n}\n.cc-print-design-table-json textarea {\n box-sizing: border-box;\n width: 100%;\n min-height: 160px;\n resize: vertical;\n font-size: var(--pd-primary-font-size, 13px);\n margin: 8px 0;\n}\n.cc-print-design-table-row {\n border: 1px solid var(--pd-border);\n border-radius: 6px;\n padding: 8px;\n margin: 8px 0;\n}\n.cc-print-design-table-data pre {\n max-height: 200px;\n overflow: auto;\n font-size: var(--pd-primary-font-size, 13px);\n overscroll-behavior: contain;\n}\n.cc-print-design-table-colors > div {\n border-bottom: 1px solid var(--pd-border);\n padding-bottom: 8px;\n}\n.cc-print-design-layer-controls {\n display: flex;\n flex-wrap: wrap;\n gap: 6px;\n margin: 8px 0;\n}\n.cc-print-design-layer-controls .canvas-react-button {\n padding: 6px;\n}\n.cc-print-design-layer-item {\n position: relative;\n}\n.cc-print-design-layer-drag {\n display: inline-flex;\n align-items: center;\n justify-content: center;\n flex-shrink: 0;\n padding: 4px;\n border: 0;\n background: transparent;\n color: var(--pd-muted);\n cursor: grab;\n}\n.cc-print-design-layer-drag:active {\n cursor: grabbing;\n}\n.cc-print-design-layer-drag:disabled {\n cursor: default;\n opacity: 0.4;\n}\n.cc-print-design-layer-children {\n margin-left: 12px;\n border-left: 1px solid var(--pd-divider);\n padding-left: 3px;\n}\n.cc-print-design-layer-drag {\n touch-action: none;\n}\n.cc-print-design-layer-menu {\n padding: 4px;\n font-size: var(--pd-primary-font-size, 13px);\n}\n.cc-print-design-layer-menu button {\n display: flex;\n gap: 8px;\n align-items: center;\n width: 100%;\n border: 0;\n border-radius: 4px;\n background: transparent;\n color: var(--pd-text);\n padding: 8px;\n cursor: pointer;\n}\n.cc-print-design-layer-menu button:hover:not(:disabled),\n.cc-print-design-layer-menu button:focus-visible {\n background: var(--pd-selected);\n}\n.cc-print-design-layer-menu button:disabled {\n opacity: 0.4;\n cursor: default;\n}\n.cc-print-design-layer-menu button > span:last-child {\n margin-left: auto;\n color: var(--pd-muted);\n font-size: var(--pd-secondary-font-size, 11px);\n}\n.cc-print-design-layer-list {\n user-select: none;\n}\n.cc-print-design-menu-separator {\n height: 1px;\n background: var(--pd-divider);\n margin: 4px 0;\n}\n.cc-print-design-layer-menu button.danger {\n color: var(--pd-danger);\n}\n.cc-print-design-layer-menu button > .cc-print-design-menu-label:last-child {\n margin-left: 0;\n color: inherit;\n font-size: var(--pd-primary-font-size, 13px);\n}\n.cc-print-design-layer-order-row {\n display: flex;\n align-items: center;\n gap: 6px;\n min-width: 0;\n}\n.cc-print-design-layer-order-row > :first-child {\n flex: 1;\n min-width: 0;\n width: 0;\n}\n.cc-print-design-layer-order-row .cc-print-design-layer-controls {\n flex: none;\n flex-wrap: nowrap;\n gap: 2px;\n margin: 0;\n}\n.cc-print-design-alignment-controls {\n display: flex;\n gap: 6px;\n}\n.cc-print-design-alignment-controls .canvas-react-button {\n flex: 1;\n padding: 6px;\n}\n.cc-print-design-alignment-controls .canvas-react-button[aria-pressed=true] {\n color: var(--pd-primary, #2563eb);\n border-color: var(--pd-primary, #2563eb);\n background: var(--pd-selected);\n}\n.cc-print-design-data-fieldset {\n margin: 0;\n padding: 0;\n border: 0;\n min-width: 0;\n}\n.cc-print-design-data-preview {\n overflow-wrap: anywhere;\n white-space: pre-wrap;\n margin: 0;\n}\n.cc-print-design-layer-heading {\n display: flex;\n align-items: center;\n justify-content: space-between;\n gap: 8px;\n}\n.cc-print-design-layer-heading .cc-print-design-section-title {\n margin: 0;\n}\n.cc-print-design-link {\n border: 0;\n padding: 0;\n color: var(--pd-primary);\n background: transparent;\n cursor: pointer;\n font-size: var(--pd-secondary-font-size, 11px);\n}\n.cc-print-design-link:disabled {\n color: #b8c0cc;\n cursor: not-allowed;\n}\n.cc-print-design-editor .canvas-react-button:hover:not(:disabled) {\n border-color: var(--pd-primary);\n color: var(--pd-primary);\n}\n.cc-print-design-editor .canvas-react-button-primary {\n border-color: var(--pd-primary);\n background: var(--pd-primary);\n color: #fff;\n}\n.cc-print-design-editor .canvas-react-button-primary:hover:not(:disabled) {\n border-color: var(--canvas-react-color-primary-hover);\n background: var(--canvas-react-color-primary-hover);\n color: #fff;\n}\n.cc-print-design-editor .canvas-react-radio input:checked + .canvas-react-radio-mark {\n border-color: var(--pd-primary);\n}\n.cc-print-design-editor[data-theme=dark] .canvas-react-select-disabled,\n.cc-print-design-editor[data-theme=dark] .canvas-react-input-number-disabled {\n background: var(--pd-subtle);\n color: var(--pd-muted);\n}\n.cc-print-design-editor[data-theme=dark] .canvas-react-input-number-disabled:hover {\n border-color: var(--pd-border);\n}\n.cc-print-design-editor[data-theme=dark] .canvas-react-input-number-disabled .canvas-react-input-number-input,\n.cc-print-design-editor[data-theme=dark] .canvas-react-input-number-disabled .canvas-react-input-number-handler:disabled {\n color: var(--pd-muted);\n}\n.cc-print-design-editor .cc-print-design-field > span:first-child,\n.cc-print-design-editor .cc-print-design-settings-field > span:first-child,\n.cc-print-design-editor .cc-print-design-table-data label,\n.cc-print-design-editor .cc-print-design-chart-data label {\n font-size: var(--pd-label-font-size, 12px);\n color: var(--pd-muted);\n}\n.cc-print-design-editor .canvas-react-input,\n.cc-print-design-editor .canvas-react-textarea,\n.cc-print-design-editor .canvas-react-input-number-input {\n font-size: var(--pd-primary-font-size, 13px);\n color: var(--pd-text);\n}\n.cc-print-design-row-settings:not([hidden]) {\n display: grid;\n grid-template-columns: repeat(2, minmax(0, 1fr));\n gap: 8px;\n}\n.cc-print-design-row-settings > * {\n grid-column: 1 / -1;\n min-width: 0;\n}\n.cc-print-design-row-settings > .cc-print-design-column-half {\n grid-column: span 1;\n margin: 0;\n gap: 4px;\n}\n.cc-print-design-row-settings .canvas-react-input-number {\n min-width: 0;\n width: 100%;\n}\n.cc-print-design-row-settings .cc-print-design-hint {\n margin: 0;\n}\n.cc-print-design-data-compact {\n padding: 8px;\n}\n.cc-print-design-data-compact .cc-print-design-hint {\n margin: 6px 0;\n}\n.cc-print-design-data-compact .cc-print-design-table-json {\n margin: 6px 0;\n}\n.cc-print-design-data-compact .cc-print-design-table-row {\n padding: 0;\n margin: 6px 0;\n overflow: hidden;\n}\n.cc-print-design-static-row-grid:not([hidden]) {\n display: grid;\n grid-template-columns: repeat(2, minmax(0, 1fr));\n gap: 8px;\n padding: 8px;\n}\n.cc-print-design-static-row-grid > * {\n min-width: 0;\n}\n.cc-print-design-static-tasks > strong,\n.cc-print-design-task-dependencies > strong {\n display: block;\n margin: 8px 0 4px;\n}\n.cc-print-design-gantt-connection-title {\n display: block;\n margin: 12px 0 6px;\n}\n.cc-print-design-task-title {\n padding: 8px;\n font-weight: 600;\n}\n.cc-print-design-task-dependencies {\n grid-column: 1 / -1;\n min-width: 0;\n}\n.cc-print-design-task-dependency-row {\n display: grid;\n grid-template-columns: repeat(2, minmax(0, 1fr));\n gap: 8px;\n padding: 8px 0;\n border-top: 1px solid #e7edf5;\n}\n.cc-print-design-task-dependency-row > * {\n min-width: 0;\n}\n.cc-print-design-table-data .cc-print-design-static-row-grid label:not(.canvas-react-checkbox) {\n margin: 0;\n gap: 4px;\n overflow-wrap: anywhere;\n}\n.cc-print-design-static-row-grid .canvas-react-input-number {\n width: 100%;\n min-width: 0;\n}\n.cc-print-design-static-row-grid > .cc-print-design-table-json,\n.cc-print-design-static-row-actions {\n grid-column: 1 / -1;\n}\n.cc-print-design-static-row-actions {\n display: flex;\n justify-content: flex-end;\n}\n.cc-print-design-static-row-actions > .canvas-react-button {\n padding: 4px;\n}\n');
|
|
8701
9637
|
|
|
8702
9638
|
// src/styles/scrollbar.css
|
|
8703
9639
|
styleInject(".cc-print-design-panels .canvas-react-resizable-panel {\n overflow: hidden;\n}\n.cc-print-design-left-panel,\n.cc-print-design-properties,\n.cc-print-design-chart-data pre {\n overscroll-behavior: contain;\n}\n.cc-print-design-editor .cc-print-design-text-editor {\n scrollbar-width: thin;\n overscroll-behavior: contain;\n}\n.cc-print-design-editor .cc-print-design-text-editor::-webkit-scrollbar {\n width: 8px;\n height: 8px;\n}\n.cc-print-design-editor .cc-print-design-text-editor::-webkit-scrollbar-track,\n.cc-print-design-editor .cc-print-design-text-editor::-webkit-scrollbar-corner {\n background: transparent;\n}\n.cc-print-design-editor .cc-print-design-text-editor::-webkit-scrollbar-thumb {\n min-height: 32px;\n border: 2px solid transparent;\n border-radius: 999px;\n background: #aeb4bd;\n background-clip: content-box;\n}\n.cc-print-design-editor .cc-print-design-text-editor::-webkit-scrollbar-thumb:hover {\n background: #8f98a5;\n background-clip: content-box;\n}\n");
|
|
@@ -8779,7 +9715,13 @@ var ReactPrintDesign = react.forwardRef(
|
|
|
8779
9715
|
const [document2, setDocument] = react.useState(
|
|
8780
9716
|
() => documentProp ?? printDesign.createPrintDesignDocument()
|
|
8781
9717
|
);
|
|
8782
|
-
const
|
|
9718
|
+
const previewLoader = importedMockRecords ? void 0 : props.loadPreviewData;
|
|
9719
|
+
const preview = usePrintPreviewPages(
|
|
9720
|
+
document2,
|
|
9721
|
+
mockRecords,
|
|
9722
|
+
previewOpen,
|
|
9723
|
+
previewLoader
|
|
9724
|
+
);
|
|
8783
9725
|
const previewPage = previewOpen ? preview.pages[previewIndex] : void 0;
|
|
8784
9726
|
react.useEffect(() => {
|
|
8785
9727
|
setPreviewIndex(
|
|
@@ -8798,7 +9740,10 @@ var ReactPrintDesign = react.forwardRef(
|
|
|
8798
9740
|
const pdfDragRef = react.useRef(null);
|
|
8799
9741
|
const pngDragRef = react.useRef(null);
|
|
8800
9742
|
const savedSnapshotRef = react.useRef(JSON.stringify(documentProp ?? document2));
|
|
8801
|
-
const
|
|
9743
|
+
const tourSourceRef = react.useRef(null);
|
|
9744
|
+
const hasUnsavedChanges = () => JSON.stringify(
|
|
9745
|
+
tourSourceRef.current ?? instanceRef.current?.getDocument() ?? document2
|
|
9746
|
+
) !== savedSnapshotRef.current;
|
|
8802
9747
|
const [discardConfirmOpen, setDiscardConfirmOpen] = react.useState(false);
|
|
8803
9748
|
const discardResolverRef = react.useRef(
|
|
8804
9749
|
null
|
|
@@ -8841,6 +9786,80 @@ var ReactPrintDesign = react.forwardRef(
|
|
|
8841
9786
|
elementIds: []
|
|
8842
9787
|
});
|
|
8843
9788
|
const [activePageId, setActivePageId] = react.useState(document2.pages[0].id);
|
|
9789
|
+
const [tourOpen, setTourOpen] = react.useState(false);
|
|
9790
|
+
const [tourIndex, setTourIndex] = react.useState(0);
|
|
9791
|
+
const [tourPlaying, setTourPlaying] = react.useState(false);
|
|
9792
|
+
const [tourSource, setTourSource] = react.useState(
|
|
9793
|
+
null
|
|
9794
|
+
);
|
|
9795
|
+
const tourDocument = tourSource ?? document2;
|
|
9796
|
+
const tourSteps = react.useMemo(
|
|
9797
|
+
() => createPrintDesignTourSteps(tourDocument),
|
|
9798
|
+
[tourDocument]
|
|
9799
|
+
);
|
|
9800
|
+
const tourDisplaySteps = react.useMemo(
|
|
9801
|
+
() => tourSteps.map((step) => {
|
|
9802
|
+
if (!step.elementId) return step;
|
|
9803
|
+
if (step.operation === "add")
|
|
9804
|
+
return {
|
|
9805
|
+
...step,
|
|
9806
|
+
target: () => instanceRef.current?.getElementClientRect(step.elementId) ?? null
|
|
9807
|
+
};
|
|
9808
|
+
if (step.operation === "layer")
|
|
9809
|
+
return {
|
|
9810
|
+
...step,
|
|
9811
|
+
target: () => [
|
|
9812
|
+
...globalThis.document.querySelectorAll(
|
|
9813
|
+
"[data-tour-element-id]"
|
|
9814
|
+
)
|
|
9815
|
+
].find(
|
|
9816
|
+
(node) => node.dataset.tourElementId === step.elementId
|
|
9817
|
+
) ?? globalThis.document.querySelector(
|
|
9818
|
+
".cc-print-design-left-panel"
|
|
9819
|
+
)
|
|
9820
|
+
};
|
|
9821
|
+
return step;
|
|
9822
|
+
}),
|
|
9823
|
+
[tourSteps]
|
|
9824
|
+
);
|
|
9825
|
+
const tourHighlightTarget = react.useMemo(() => {
|
|
9826
|
+
const step = tourSteps[tourIndex];
|
|
9827
|
+
if (!step?.elementId || step.operation !== "field" && step.operation !== "layer")
|
|
9828
|
+
return void 0;
|
|
9829
|
+
return () => instanceRef.current?.getElementClientRect(step.elementId) ?? null;
|
|
9830
|
+
}, [tourIndex, tourSteps]);
|
|
9831
|
+
const focusTourStep = (index) => {
|
|
9832
|
+
const step = tourSteps[index];
|
|
9833
|
+
const instance = instanceRef.current;
|
|
9834
|
+
const source = tourSourceRef.current;
|
|
9835
|
+
if (!step || !instance || !source) return;
|
|
9836
|
+
instance.showTemporaryDocument(
|
|
9837
|
+
createPrintDesignTourDocument(source, step),
|
|
9838
|
+
step.pageId,
|
|
9839
|
+
step.operation === "add" || step.operation === "field" || step.operation === "layer" ? step.elementId : void 0
|
|
9840
|
+
);
|
|
9841
|
+
setActiveTab(
|
|
9842
|
+
step.operation === "page" ? "pages" : step.operation === "layer" ? "layers" : "elements"
|
|
9843
|
+
);
|
|
9844
|
+
setMobileView(
|
|
9845
|
+
step.operation === "field" ? "properties" : step.operation === "add" ? "canvas" : "panel"
|
|
9846
|
+
);
|
|
9847
|
+
setActivePageId(instance.getActivePageId());
|
|
9848
|
+
setSelection(instance.getSelection());
|
|
9849
|
+
setTourIndex(index);
|
|
9850
|
+
};
|
|
9851
|
+
const closeTour = () => {
|
|
9852
|
+
setTourOpen(false);
|
|
9853
|
+
setTourPlaying(false);
|
|
9854
|
+
const instance = instanceRef.current;
|
|
9855
|
+
instance?.restoreTemporaryDocument();
|
|
9856
|
+
tourSourceRef.current = null;
|
|
9857
|
+
setTourSource(null);
|
|
9858
|
+
if (instance) {
|
|
9859
|
+
setActivePageId(instance.getActivePageId());
|
|
9860
|
+
setSelection(instance.getSelection());
|
|
9861
|
+
}
|
|
9862
|
+
};
|
|
8844
9863
|
const [preferences, setPreferences] = react.useState({
|
|
8845
9864
|
...defaultEditorPreferences,
|
|
8846
9865
|
displayUnit: props.displayUnit ?? "mm"
|
|
@@ -8925,46 +9944,75 @@ var ReactPrintDesign = react.forwardRef(
|
|
|
8925
9944
|
setPendingGroup(null);
|
|
8926
9945
|
};
|
|
8927
9946
|
const exportFileName = (format) => exportFileNames[format] ?? `${document2.name || "print-design"}.${format === "png" ? "zip" : format}`;
|
|
9947
|
+
const outputTaskRef = react.useRef(null);
|
|
9948
|
+
react.useEffect(() => () => outputTaskRef.current?.abort(), []);
|
|
9949
|
+
const resolveOutputSource = async () => {
|
|
9950
|
+
if (!previewLoader) return { document: document2, data: currentData };
|
|
9951
|
+
if (previewOpen && !preview.loading && !preview.error && preview.source)
|
|
9952
|
+
return preview.source;
|
|
9953
|
+
outputTaskRef.current?.abort();
|
|
9954
|
+
const controller = new AbortController();
|
|
9955
|
+
outputTaskRef.current = controller;
|
|
9956
|
+
const source = await previewLoader(document2, {
|
|
9957
|
+
signal: controller.signal
|
|
9958
|
+
});
|
|
9959
|
+
controller.signal.throwIfAborted();
|
|
9960
|
+
return source;
|
|
9961
|
+
};
|
|
8928
9962
|
const confirmExport = async (fileName) => {
|
|
8929
9963
|
if (!exportFormat) return;
|
|
9964
|
+
const source = exportFormat === "json" ? { document: document2, data: currentData } : await resolveOutputSource();
|
|
8930
9965
|
if (exportFormat === "json") downloadJson(document2, fileName);
|
|
8931
9966
|
if (exportFormat === "html")
|
|
8932
|
-
downloadHtml(
|
|
9967
|
+
downloadHtml(source.document, source.data, fileName);
|
|
8933
9968
|
if (exportFormat === "png")
|
|
8934
|
-
await downloadPngPages(
|
|
9969
|
+
await downloadPngPages(
|
|
9970
|
+
source.document,
|
|
9971
|
+
previewLoader ? [source.data] : mockRecords,
|
|
9972
|
+
fileName
|
|
9973
|
+
);
|
|
8935
9974
|
if (exportFormat === "pdf")
|
|
8936
|
-
await downloadPdf(
|
|
9975
|
+
await downloadPdf(source.document, source.data, fileName);
|
|
8937
9976
|
setExportFileNames((current) => ({
|
|
8938
9977
|
...current,
|
|
8939
9978
|
[exportFormat]: fileName
|
|
8940
9979
|
}));
|
|
8941
9980
|
setExportFormat(null);
|
|
8942
9981
|
};
|
|
9982
|
+
const dragReady = !previewLoader || previewOpen && !preview.loading && !preview.error && preview.source != null;
|
|
9983
|
+
const dragDocument = previewLoader && preview.source ? preview.source.document : document2;
|
|
9984
|
+
const dragData = previewLoader && preview.source ? preview.source.data : currentData;
|
|
9985
|
+
const dragRecords = react.useMemo(
|
|
9986
|
+
() => previewLoader ? [dragData] : mockRecords,
|
|
9987
|
+
[previewLoader, dragData, mockRecords]
|
|
9988
|
+
);
|
|
8943
9989
|
const preparePdfDrag = () => {
|
|
8944
|
-
if (
|
|
9990
|
+
if (!dragReady) return;
|
|
9991
|
+
if (pdfDragRef.current?.document === dragDocument && pdfDragRef.current.data === dragData)
|
|
8945
9992
|
return;
|
|
8946
9993
|
const entry = {
|
|
8947
|
-
document:
|
|
8948
|
-
data:
|
|
9994
|
+
document: dragDocument,
|
|
9995
|
+
data: dragData,
|
|
8949
9996
|
blob: void 0
|
|
8950
9997
|
};
|
|
8951
9998
|
pdfDragRef.current = entry;
|
|
8952
|
-
void createPdfBlob(
|
|
9999
|
+
void createPdfBlob(dragDocument, dragData).then((blob) => {
|
|
8953
10000
|
entry.blob = blob;
|
|
8954
10001
|
}).catch(() => {
|
|
8955
10002
|
if (pdfDragRef.current === entry) pdfDragRef.current = null;
|
|
8956
10003
|
});
|
|
8957
10004
|
};
|
|
8958
10005
|
const preparePngDrag = () => {
|
|
8959
|
-
if (
|
|
10006
|
+
if (!dragReady) return;
|
|
10007
|
+
if (pngDragRef.current?.document === dragDocument && pngDragRef.current.records === dragRecords)
|
|
8960
10008
|
return;
|
|
8961
10009
|
const entry = {
|
|
8962
|
-
document:
|
|
8963
|
-
records:
|
|
10010
|
+
document: dragDocument,
|
|
10011
|
+
records: dragRecords,
|
|
8964
10012
|
blob: void 0
|
|
8965
10013
|
};
|
|
8966
10014
|
pngDragRef.current = entry;
|
|
8967
|
-
void createPngArchiveBlob(
|
|
10015
|
+
void createPngArchiveBlob(dragDocument, dragRecords).then((blob) => {
|
|
8968
10016
|
entry.blob = blob;
|
|
8969
10017
|
}).catch(() => {
|
|
8970
10018
|
if (pngDragRef.current === entry) pngDragRef.current = null;
|
|
@@ -9193,7 +10241,7 @@ var ReactPrintDesign = react.forwardRef(
|
|
|
9193
10241
|
onChange: (next) => {
|
|
9194
10242
|
setDocument(next);
|
|
9195
10243
|
setRevision((revision) => revision + 1);
|
|
9196
|
-
callbacksRef.current.onChange?.(next);
|
|
10244
|
+
if (!tourSourceRef.current) callbacksRef.current.onChange?.(next);
|
|
9197
10245
|
},
|
|
9198
10246
|
onSelectionChange: (next) => {
|
|
9199
10247
|
setSelection(next);
|
|
@@ -9330,6 +10378,7 @@ var ReactPrintDesign = react.forwardRef(
|
|
|
9330
10378
|
};
|
|
9331
10379
|
const selectTemplate = async (item, skipConfirm = false) => {
|
|
9332
10380
|
if (!skipConfirm && !await confirmDiscard()) return;
|
|
10381
|
+
closeTour();
|
|
9333
10382
|
instanceRef.current?.setDocument(item.document);
|
|
9334
10383
|
savedSnapshotRef.current = JSON.stringify(item.document);
|
|
9335
10384
|
setSelectedTemplateId(item.templateId);
|
|
@@ -9338,6 +10387,7 @@ var ReactPrintDesign = react.forwardRef(
|
|
|
9338
10387
|
};
|
|
9339
10388
|
const selectDefaultTemplate = async (item, skipConfirm = false) => {
|
|
9340
10389
|
if (!skipConfirm && !await confirmDiscard()) return;
|
|
10390
|
+
closeTour();
|
|
9341
10391
|
instanceRef.current?.setDocument(item);
|
|
9342
10392
|
savedSnapshotRef.current = JSON.stringify(item);
|
|
9343
10393
|
setSelectedTemplateId(null);
|
|
@@ -9539,6 +10589,7 @@ var ReactPrintDesign = react.forwardRef(
|
|
|
9539
10589
|
);
|
|
9540
10590
|
};
|
|
9541
10591
|
const handleEditorKeyDown = (event) => {
|
|
10592
|
+
if (tourOpen) return;
|
|
9542
10593
|
if ((event.ctrlKey || event.metaKey) && event.key.toLowerCase() === "s") {
|
|
9543
10594
|
event.preventDefault();
|
|
9544
10595
|
void saveTemplate();
|
|
@@ -9654,7 +10705,7 @@ var ReactPrintDesign = react.forwardRef(
|
|
|
9654
10705
|
onApplyPreferences: applyPreferences,
|
|
9655
10706
|
onResetPreferences: resetEditorSettings,
|
|
9656
10707
|
readonly,
|
|
9657
|
-
contentReadonly: editingReadonly,
|
|
10708
|
+
contentReadonly: editingReadonly && !tourOpen,
|
|
9658
10709
|
settings: {
|
|
9659
10710
|
...interactionSettings,
|
|
9660
10711
|
showRulers,
|
|
@@ -9743,13 +10794,30 @@ var ReactPrintDesign = react.forwardRef(
|
|
|
9743
10794
|
if (event.target.closest("textarea,input"))
|
|
9744
10795
|
return;
|
|
9745
10796
|
event.preventDefault();
|
|
10797
|
+
const selector = instanceRef.current?.tableSelectorAtClientPoint(
|
|
10798
|
+
event.clientX,
|
|
10799
|
+
event.clientY
|
|
10800
|
+
);
|
|
9746
10801
|
mutate(
|
|
9747
|
-
(instance) => instance.
|
|
10802
|
+
(instance) => selector ? instance.selectTableSelector(
|
|
10803
|
+
selector.elementId,
|
|
10804
|
+
selector.kind,
|
|
10805
|
+
selector.index,
|
|
10806
|
+
selector.area
|
|
10807
|
+
) : instance.selectAtClientPoint(
|
|
9748
10808
|
event.clientX,
|
|
9749
10809
|
event.clientY
|
|
9750
10810
|
)
|
|
9751
10811
|
);
|
|
9752
|
-
setContextMenu({
|
|
10812
|
+
setContextMenu({
|
|
10813
|
+
x: event.clientX,
|
|
10814
|
+
y: event.clientY,
|
|
10815
|
+
tableSelector: selector,
|
|
10816
|
+
tableCell: instanceRef.current?.tableCellAtClientPoint(
|
|
10817
|
+
event.clientX,
|
|
10818
|
+
event.clientY
|
|
10819
|
+
)
|
|
10820
|
+
});
|
|
9753
10821
|
},
|
|
9754
10822
|
onDragOver: handleCanvasDragOver,
|
|
9755
10823
|
onDrop: handleCanvasDrop
|
|
@@ -9768,7 +10836,7 @@ var ReactPrintDesign = react.forwardRef(
|
|
|
9768
10836
|
document: document2,
|
|
9769
10837
|
version: selectedVersion,
|
|
9770
10838
|
invalid: selectedInvalid,
|
|
9771
|
-
readonly: editingReadonly || previewOpen,
|
|
10839
|
+
readonly: editingReadonly && !tourOpen || previewOpen,
|
|
9772
10840
|
onChange: (patch) => void updateTemplateMetadata(patch)
|
|
9773
10841
|
}
|
|
9774
10842
|
) : /* @__PURE__ */ jsxRuntime.jsx(
|
|
@@ -9779,6 +10847,34 @@ var ReactPrintDesign = react.forwardRef(
|
|
|
9779
10847
|
page: activePage,
|
|
9780
10848
|
element: activeTab === "pages" ? void 0 : selectedElement,
|
|
9781
10849
|
selectedIds: activeTab === "pages" ? [] : selection.elementIds,
|
|
10850
|
+
tableCellSelection: instanceRef.current?.getTableCellSelection(),
|
|
10851
|
+
onMergeSelectedTableCells: () => mutate((instance) => {
|
|
10852
|
+
const range = instance.getTableCellSelection();
|
|
10853
|
+
if (!range) return;
|
|
10854
|
+
const row = Math.min(range.startRow, range.endRow);
|
|
10855
|
+
const column = Math.min(
|
|
10856
|
+
range.startColumn,
|
|
10857
|
+
range.endColumn
|
|
10858
|
+
);
|
|
10859
|
+
const rows = Math.abs(range.endRow - range.startRow) + 1;
|
|
10860
|
+
const columns = Math.abs(range.endColumn - range.startColumn) + 1;
|
|
10861
|
+
if (range.area === "header")
|
|
10862
|
+
instance.mergeTableHeaderCell(
|
|
10863
|
+
range.elementId,
|
|
10864
|
+
row,
|
|
10865
|
+
column,
|
|
10866
|
+
rows,
|
|
10867
|
+
columns
|
|
10868
|
+
);
|
|
10869
|
+
else
|
|
10870
|
+
instance.mergeTableCell(
|
|
10871
|
+
range.elementId,
|
|
10872
|
+
row,
|
|
10873
|
+
column,
|
|
10874
|
+
rows,
|
|
10875
|
+
columns
|
|
10876
|
+
);
|
|
10877
|
+
}),
|
|
9782
10878
|
onAlign: (align) => mutate((instance) => instance.alignSelection(align)),
|
|
9783
10879
|
onGroupRename: (id, name) => mutate((instance) => instance.renameGroup(id, name)),
|
|
9784
10880
|
onSaveGroup: requestSaveGroup,
|
|
@@ -9788,7 +10884,7 @@ var ReactPrintDesign = react.forwardRef(
|
|
|
9788
10884
|
(instance) => instance.setElementLayer(selectedElement.id, index)
|
|
9789
10885
|
),
|
|
9790
10886
|
guide: activeTab === "pages" ? void 0 : selection.guide,
|
|
9791
|
-
readonly: editingReadonly || previewOpen,
|
|
10887
|
+
readonly: editingReadonly && !tourOpen || previewOpen,
|
|
9792
10888
|
settings: { ...interactionSettings, showGuides },
|
|
9793
10889
|
onSettingsChange: changeSettings,
|
|
9794
10890
|
onGuidePositionChange: (position) => selection.guide && mutate(
|
|
@@ -9825,10 +10921,30 @@ var ReactPrintDesign = react.forwardRef(
|
|
|
9825
10921
|
if (event.target.closest("textarea,input"))
|
|
9826
10922
|
return;
|
|
9827
10923
|
event.preventDefault();
|
|
10924
|
+
const selector = instanceRef.current?.tableSelectorAtClientPoint(
|
|
10925
|
+
event.clientX,
|
|
10926
|
+
event.clientY
|
|
10927
|
+
);
|
|
9828
10928
|
mutate(
|
|
9829
|
-
(instance) => instance.
|
|
10929
|
+
(instance) => selector ? instance.selectTableSelector(
|
|
10930
|
+
selector.elementId,
|
|
10931
|
+
selector.kind,
|
|
10932
|
+
selector.index,
|
|
10933
|
+
selector.area
|
|
10934
|
+
) : instance.selectAtClientPoint(
|
|
10935
|
+
event.clientX,
|
|
10936
|
+
event.clientY
|
|
10937
|
+
)
|
|
9830
10938
|
);
|
|
9831
|
-
setContextMenu({
|
|
10939
|
+
setContextMenu({
|
|
10940
|
+
x: event.clientX,
|
|
10941
|
+
y: event.clientY,
|
|
10942
|
+
tableSelector: selector,
|
|
10943
|
+
tableCell: instanceRef.current?.tableCellAtClientPoint(
|
|
10944
|
+
event.clientX,
|
|
10945
|
+
event.clientY
|
|
10946
|
+
)
|
|
10947
|
+
});
|
|
9832
10948
|
},
|
|
9833
10949
|
onDragOver: handleCanvasDragOver,
|
|
9834
10950
|
onDrop: handleCanvasDrop
|
|
@@ -9862,7 +10978,9 @@ var ReactPrintDesign = react.forwardRef(
|
|
|
9862
10978
|
selection.elementIds,
|
|
9863
10979
|
editingReadonly,
|
|
9864
10980
|
instanceRef.current,
|
|
9865
|
-
requestSaveGroup
|
|
10981
|
+
requestSaveGroup,
|
|
10982
|
+
contextMenu?.tableCell,
|
|
10983
|
+
contextMenu?.tableSelector
|
|
9866
10984
|
),
|
|
9867
10985
|
onAction: (item) => {
|
|
9868
10986
|
if (item.key === "saveCustomComponent") {
|
|
@@ -9873,6 +10991,20 @@ var ReactPrintDesign = react.forwardRef(
|
|
|
9873
10991
|
onClose: () => setContextMenu(null)
|
|
9874
10992
|
}
|
|
9875
10993
|
),
|
|
10994
|
+
/* @__PURE__ */ jsxRuntime.jsx(
|
|
10995
|
+
reactComponents.ReactTour,
|
|
10996
|
+
{
|
|
10997
|
+
open: tourOpen,
|
|
10998
|
+
steps: tourDisplaySteps,
|
|
10999
|
+
current: tourIndex,
|
|
11000
|
+
highlightTarget: tourHighlightTarget,
|
|
11001
|
+
onChange: focusTourStep,
|
|
11002
|
+
onClose: closeTour,
|
|
11003
|
+
playing: tourPlaying,
|
|
11004
|
+
onPlayingChange: setTourPlaying,
|
|
11005
|
+
interval: 4500
|
|
11006
|
+
}
|
|
11007
|
+
),
|
|
9876
11008
|
/* @__PURE__ */ jsxRuntime.jsx(
|
|
9877
11009
|
reactComponents.ReactPopconfirm,
|
|
9878
11010
|
{
|
|
@@ -10082,7 +11214,7 @@ var ReactPrintDesign = react.forwardRef(
|
|
|
10082
11214
|
onClick: () => setPreviewIndex((index) => Math.max(0, index - 1))
|
|
10083
11215
|
}
|
|
10084
11216
|
),
|
|
10085
|
-
/* @__PURE__ */ jsxRuntime.jsx("span", { role: "status", children: preview.error ? preview.error : `${preview.pages.length ? previewIndex + 1 : 0} / ${preview.pages.length}${preview.
|
|
11217
|
+
/* @__PURE__ */ jsxRuntime.jsx("span", { role: "status", children: preview.error ? preview.error : `${preview.pages.length ? previewIndex + 1 : 0} / ${preview.pages.length}${preview.loading ? ` \xB7 ${preview.progress || "\u751F\u6210\u4E2D"}` : ""}` }),
|
|
10086
11218
|
/* @__PURE__ */ jsxRuntime.jsx(
|
|
10087
11219
|
reactComponents.ReactButton,
|
|
10088
11220
|
{
|
|
@@ -10155,10 +11287,10 @@ var ReactPrintDesign = react.forwardRef(
|
|
|
10155
11287
|
{
|
|
10156
11288
|
key: "html",
|
|
10157
11289
|
label: "HTML",
|
|
10158
|
-
draggable:
|
|
11290
|
+
draggable: dragReady,
|
|
10159
11291
|
onDragStart: (event) => setExportDragData(
|
|
10160
11292
|
event.dataTransfer,
|
|
10161
|
-
createHtmlBlob(
|
|
11293
|
+
createHtmlBlob(dragDocument, dragData),
|
|
10162
11294
|
exportFileName("html")
|
|
10163
11295
|
)
|
|
10164
11296
|
},
|
|
@@ -10166,11 +11298,11 @@ var ReactPrintDesign = react.forwardRef(
|
|
|
10166
11298
|
key: "png",
|
|
10167
11299
|
label: "PNG \xB7 \u5168\u90E8\u9875 ZIP",
|
|
10168
11300
|
description: "\u6309 Mock \u6570\u636E\u9010\u9875\u5BFC\u51FA",
|
|
10169
|
-
draggable:
|
|
11301
|
+
draggable: dragReady,
|
|
10170
11302
|
onPointerEnter: preparePngDrag,
|
|
10171
11303
|
onDragStart: (event) => {
|
|
10172
11304
|
const ready = pngDragRef.current;
|
|
10173
|
-
if (ready?.document ===
|
|
11305
|
+
if (ready?.document === dragDocument && ready.records === dragRecords && ready.blob) {
|
|
10174
11306
|
setExportDragData(
|
|
10175
11307
|
event.dataTransfer,
|
|
10176
11308
|
ready.blob,
|
|
@@ -10187,11 +11319,11 @@ var ReactPrintDesign = react.forwardRef(
|
|
|
10187
11319
|
key: "pdf",
|
|
10188
11320
|
label: "PDF \xB7 \u5B9E\u9A8C\u6027",
|
|
10189
11321
|
description: "\u56FE\u7247\u5F0F\u9875\u9762\uFF0C\u6587\u5B57\u6682\u4E0D\u53EF\u9009\u4E2D",
|
|
10190
|
-
draggable:
|
|
11322
|
+
draggable: dragReady,
|
|
10191
11323
|
onPointerEnter: preparePdfDrag,
|
|
10192
11324
|
onDragStart: (event) => {
|
|
10193
11325
|
const ready = pdfDragRef.current;
|
|
10194
|
-
if (ready?.document ===
|
|
11326
|
+
if (ready?.document === dragDocument && ready.data === dragData && ready.blob) {
|
|
10195
11327
|
setExportDragData(
|
|
10196
11328
|
event.dataTransfer,
|
|
10197
11329
|
ready.blob,
|
|
@@ -10217,9 +11349,32 @@ var ReactPrintDesign = react.forwardRef(
|
|
|
10217
11349
|
title: "\u6253\u5370",
|
|
10218
11350
|
"aria-label": "\u6253\u5370",
|
|
10219
11351
|
icon: /* @__PURE__ */ jsxRuntime.jsx(reactComponents.ReactPrinterOutlined, { "aria-hidden": "true" }),
|
|
10220
|
-
onClick: () =>
|
|
10221
|
-
|
|
10222
|
-
|
|
11352
|
+
onClick: () => {
|
|
11353
|
+
if (!previewLoader) {
|
|
11354
|
+
mutate((instance) => {
|
|
11355
|
+
instance.printDocument();
|
|
11356
|
+
});
|
|
11357
|
+
return;
|
|
11358
|
+
}
|
|
11359
|
+
const popup = window.open("", "_blank");
|
|
11360
|
+
if (!popup) return;
|
|
11361
|
+
popup.document.body.textContent = "\u6B63\u5728\u51C6\u5907\u6253\u5370\u6570\u636E\u2026";
|
|
11362
|
+
void resolveOutputSource().then((source) => {
|
|
11363
|
+
if (!popup.closed)
|
|
11364
|
+
printDesign.printPrintDesignHtml(
|
|
11365
|
+
popup,
|
|
11366
|
+
printDesign.transformPrintDesignToHtml(source.document, {
|
|
11367
|
+
data: source.data
|
|
11368
|
+
})
|
|
11369
|
+
);
|
|
11370
|
+
}).catch((cause) => {
|
|
11371
|
+
popup.close();
|
|
11372
|
+
if (!(cause instanceof Error && cause.name === "AbortError"))
|
|
11373
|
+
window.alert(
|
|
11374
|
+
cause instanceof Error ? cause.message : "\u51C6\u5907\u6253\u5370\u6570\u636E\u5931\u8D25"
|
|
11375
|
+
);
|
|
11376
|
+
});
|
|
11377
|
+
}
|
|
10223
11378
|
}
|
|
10224
11379
|
),
|
|
10225
11380
|
/* @__PURE__ */ jsxRuntime.jsx(
|
|
@@ -10236,6 +11391,30 @@ var ReactPrintDesign = react.forwardRef(
|
|
|
10236
11391
|
}))
|
|
10237
11392
|
}
|
|
10238
11393
|
),
|
|
11394
|
+
/* @__PURE__ */ jsxRuntime.jsx(
|
|
11395
|
+
reactComponents.ReactButton,
|
|
11396
|
+
{
|
|
11397
|
+
title: "\u6F14\u793A\u6A21\u677F\u642D\u5EFA\u64CD\u4F5C",
|
|
11398
|
+
"aria-label": "\u6F14\u793A\u6A21\u677F\u642D\u5EFA\u64CD\u4F5C",
|
|
11399
|
+
icon: /* @__PURE__ */ jsxRuntime.jsx(reactComponents.ReactPlayCircleOutlined, { "aria-hidden": "true" }),
|
|
11400
|
+
onClick: () => {
|
|
11401
|
+
const instance = instanceRef.current;
|
|
11402
|
+
if (!instance) return;
|
|
11403
|
+
const source = instance.getDocument();
|
|
11404
|
+
const first = createPrintDesignTourSteps(source)[0];
|
|
11405
|
+
setPreviewOpen(false);
|
|
11406
|
+
setContextMenu(null);
|
|
11407
|
+
tourSourceRef.current = source;
|
|
11408
|
+
setTourSource(source);
|
|
11409
|
+
instance.showTemporaryDocument(
|
|
11410
|
+
createPrintDesignTourDocument(source, first)
|
|
11411
|
+
);
|
|
11412
|
+
setTourIndex(0);
|
|
11413
|
+
setTourPlaying(true);
|
|
11414
|
+
setTourOpen(true);
|
|
11415
|
+
}
|
|
11416
|
+
}
|
|
11417
|
+
),
|
|
10239
11418
|
props.showFullscreenButton !== false || props.onClose ? /* @__PURE__ */ jsxRuntime.jsx("span", { className: "cc-print-design-toolbar-separator" }) : null,
|
|
10240
11419
|
props.showFullscreenButton !== false ? /* @__PURE__ */ jsxRuntime.jsx(
|
|
10241
11420
|
reactComponents.ReactButton,
|