@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/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
- if (hasSelection) {
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: "duplicate",
404
- label: "\u751F\u6210\u526F\u672C",
405
- disabled: readonly,
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.duplicateElements();
524
+ merge(i, startRow, startColumn, rowSpan, colSpan);
408
525
  }
409
526
  },
410
527
  {
411
- key: "front",
412
- label: "\u7F6E\u9876",
413
- separator: true,
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.moveSelectionLayer("front");
532
+ merge(i, targetCell.rowIndex, targetCell.columnIndex, 1, 2);
417
533
  }
418
534
  },
419
535
  {
420
- key: "forward",
421
- label: "\u4E0A\u79FB\u4E00\u5C42",
422
- disabled: noEdit,
536
+ key: "mergeDown",
537
+ label: "\u4E0E\u4E0B\u65B9\u5355\u5143\u683C\u5408\u5E76",
538
+ disabled: readonly || locked,
423
539
  run: (i) => {
424
- i.moveSelectionLayer("forward");
540
+ merge(i, targetCell.rowIndex, targetCell.columnIndex, 2, 1);
425
541
  }
426
542
  },
427
543
  {
428
- key: "backward",
429
- label: "\u4E0B\u79FB\u4E00\u5C42",
430
- disabled: noEdit,
544
+ key: "unmergeCell",
545
+ label: "\u53D6\u6D88\u5355\u5143\u683C\u5408\u5E76",
546
+ disabled: readonly || locked,
431
547
  run: (i) => {
432
- i.moveSelectionLayer("backward");
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: "back",
437
- label: "\u7F6E\u5E95",
438
- disabled: noEdit,
556
+ key: "duplicate",
557
+ label: "\u751F\u6210\u526F\u672C",
558
+ disabled: readonly,
439
559
  run: (i) => {
440
- i.moveSelectionLayer("back");
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.cellType == null || tableCellTypes.includes(column.cellType)) && (column.children == null || isTableColumns(column.children))
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: "\u7701\u7565\u53F7" }
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) return;
2867
- let cancelled = false;
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
- for (let position = 0; position < records.length; position++) {
2875
- if (cancelled) return;
2876
- const data = records[position];
2877
- const result = printDesign.paginatePrintDesignDocument(document2, data);
2878
- if (cancelled) return;
2879
- pending.push(...result.pages.map((page) => ({ page, data })));
2880
- if (position === 0 || position % 8 === 7 || position === records.length - 1) {
2881
- setPages([...pending]);
2882
- setProcessed(position + 1);
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 (!cancelled)
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
- cancelled = true;
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("label", { className: "cc-print-design-field cc-print-design-field-full", children: [
3161
- /* @__PURE__ */ jsxRuntime.jsx("span", { children: props.label }),
3162
- /* @__PURE__ */ jsxRuntime.jsx(
3163
- reactComponents.ReactInput,
3164
- {
3165
- "aria-label": props.label,
3166
- value: draft,
3167
- disabled: props.disabled,
3168
- onChange: (event) => setDraft(event.target.value),
3169
- onBlur: commit,
3170
- onKeyDown: (event) => {
3171
- if (event.nativeEvent.isComposing) return;
3172
- if (event.key === "Enter") {
3173
- event.preventDefault();
3174
- event.currentTarget.blur();
3175
- } else if (event.key === "Escape") {
3176
- event.preventDefault();
3177
- event.stopPropagation();
3178
- cancelled.current = true;
3179
- setDraft(props.value);
3180
- event.currentTarget.blur();
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(reactComponents.ReactCollapsePanel, { className: "cc-print-design-table-json", title: label, children: [
3829
- /* @__PURE__ */ jsxRuntime.jsx(
3830
- reactComponents.ReactTextArea,
3831
- {
3832
- className: "canvas-react-scrollbar",
3833
- "aria-label": label,
3834
- value: draft,
3835
- onChange: (e) => setDraft(e.target.value)
3836
- }
3837
- ),
3838
- error ? /* @__PURE__ */ jsxRuntime.jsx("p", { role: "alert", children: error }) : null,
3839
- /* @__PURE__ */ jsxRuntime.jsxs(
3840
- reactComponents.ReactButton,
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
- "\u5E94\u7528",
3855
- label
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
- checked: element.showSummary !== false,
4174
- onChange: (event) => onChange({ showSummary: event.target.checked }),
4175
- children: "\u663E\u793A\u6C47\u603B\u884C"
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
- /* @__PURE__ */ jsxRuntime.jsxs("label", { children: [
4179
- "\u6C47\u603B\u884C\u9AD8",
4180
- /* @__PURE__ */ jsxRuntime.jsx(
4181
- reactComponents.ReactInputNumber,
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
- checked: element.showGrandTotal ?? true,
4202
- onChange: (event) => onChange({ showGrandTotal: event.target.checked }),
4203
- children: "\u663E\u793A\u603B\u8BA1\u5217"
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
- ) : null
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
- ellipsis: value === "ellipsis"
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(TableLayoutPanel, { element, onChange }),
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("div", { className: "cc-print-design-field", children: [
6173
- /* @__PURE__ */ jsxRuntime.jsxs("span", { children: [
6174
- field.label,
6175
- " \xB7 \u5B57\u6BB5\u8DEF\u5F84"
6176
- ] }),
6177
- /* @__PURE__ */ jsxRuntime.jsx(
6178
- DataPathPicker,
6179
- {
6180
- label: `${field.label}\u7ED1\u5B9A\u8DEF\u5F84`,
6181
- disabled: props.readonly,
6182
- value: path,
6183
- samples: props.samples ?? [data],
6184
- onChange: (path2) => onChange({
6185
- dataConfig: {
6186
- ...config,
6187
- bindings: { ...config.bindings, [field.key]: path2 }
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("label", { className: "cc-print-design-field cc-print-design-field-full", children: [
7456
- /* @__PURE__ */ jsxRuntime.jsx("span", { children: "\u8D85\u51FA\u7EB8\u5F20" }),
7457
- /* @__PURE__ */ jsxRuntime.jsx(
7458
- reactComponents.ReactSelect,
7459
- {
7460
- "aria-label": "\u8D85\u51FA\u7EB8\u5F20\u5904\u7406\u65B9\u5F0F",
7461
- value: element.overflowPolicy ?? (element.type === "text" || element.type === "table" || element.type === "pivotTable" ? "split" : "nextPage"),
7462
- options: getOverflowPolicyOptions(element.type),
7463
- disabled: props.readonly,
7464
- onChange: (value) => props.onElementChange({
7465
- overflowPolicy: value
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("label", { className: "cc-print-design-field", children: [
8449
- /* @__PURE__ */ jsxRuntime.jsx("span", { children: props.label }),
8450
- /* @__PURE__ */ jsxRuntime.jsx(
8451
- reactComponents.ReactInputNumber,
8452
- {
8453
- "aria-label": props.label,
8454
- value: toInput(props.value),
8455
- min: props.min == null ? void 0 : toInput(props.min),
8456
- max: props.max == null ? void 0 : toInput(props.max),
8457
- step: props.step ?? (fontSize ? 0.1 : 1),
8458
- precision: props.precision ?? 2,
8459
- disabled: props.disabled,
8460
- onChange: (value) => value != null && props.onChange(
8461
- fontSize ? printDesign.toDisplayUnit(printDesign.fromDisplayUnit(value, unit), "pt") : printDesign.fromDisplayUnit(value, unit)
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("label", { className: "cc-print-design-field", children: [
8469
- /* @__PURE__ */ jsxRuntime.jsx("span", { children: props.label }),
8470
- /* @__PURE__ */ jsxRuntime.jsx(reactComponents.ReactColorPicker, { value: props.value, onChange: props.onChange })
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 preview = usePrintPreviewPages(document2, mockRecords, previewOpen);
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 hasUnsavedChanges = () => JSON.stringify(instanceRef.current?.getDocument() ?? document2) !== savedSnapshotRef.current;
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(document2, currentData, fileName);
9967
+ downloadHtml(source.document, source.data, fileName);
8933
9968
  if (exportFormat === "png")
8934
- await downloadPngPages(document2, mockRecords, fileName);
9969
+ await downloadPngPages(
9970
+ source.document,
9971
+ previewLoader ? [source.data] : mockRecords,
9972
+ fileName
9973
+ );
8935
9974
  if (exportFormat === "pdf")
8936
- await downloadPdf(document2, currentData, fileName);
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 (pdfDragRef.current?.document === document2 && pdfDragRef.current.data === currentData)
9990
+ if (!dragReady) return;
9991
+ if (pdfDragRef.current?.document === dragDocument && pdfDragRef.current.data === dragData)
8945
9992
  return;
8946
9993
  const entry = {
8947
- document: document2,
8948
- data: currentData,
9994
+ document: dragDocument,
9995
+ data: dragData,
8949
9996
  blob: void 0
8950
9997
  };
8951
9998
  pdfDragRef.current = entry;
8952
- void createPdfBlob(document2, currentData).then((blob) => {
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 (pngDragRef.current?.document === document2 && pngDragRef.current.records === mockRecords)
10006
+ if (!dragReady) return;
10007
+ if (pngDragRef.current?.document === dragDocument && pngDragRef.current.records === dragRecords)
8960
10008
  return;
8961
10009
  const entry = {
8962
- document: document2,
8963
- records: mockRecords,
10010
+ document: dragDocument,
10011
+ records: dragRecords,
8964
10012
  blob: void 0
8965
10013
  };
8966
10014
  pngDragRef.current = entry;
8967
- void createPngArchiveBlob(document2, mockRecords).then((blob) => {
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.selectAtClientPoint(
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({ x: event.clientX, y: event.clientY });
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.selectAtClientPoint(event.clientX, event.clientY)
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({ x: event.clientX, y: event.clientY });
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.processed < mockRecords.length ? " \xB7 \u751F\u6210\u4E2D" : ""}` }),
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: true,
11290
+ draggable: dragReady,
10159
11291
  onDragStart: (event) => setExportDragData(
10160
11292
  event.dataTransfer,
10161
- createHtmlBlob(document2, currentData),
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: true,
11301
+ draggable: dragReady,
10170
11302
  onPointerEnter: preparePngDrag,
10171
11303
  onDragStart: (event) => {
10172
11304
  const ready = pngDragRef.current;
10173
- if (ready?.document === document2 && ready.records === mockRecords && ready.blob) {
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: true,
11322
+ draggable: dragReady,
10191
11323
  onPointerEnter: preparePdfDrag,
10192
11324
  onDragStart: (event) => {
10193
11325
  const ready = pdfDragRef.current;
10194
- if (ready?.document === document2 && ready.data === currentData && ready.blob) {
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: () => mutate((instance) => {
10221
- instance.printDocument();
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,