@pisell/materials 1.8.54 → 1.8.56

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (151) hide show
  1. package/build/lowcode/assets-daily.json +11 -11
  2. package/build/lowcode/assets-dev.json +2 -2
  3. package/build/lowcode/assets-prod.json +11 -11
  4. package/build/lowcode/async/view.js +1 -1
  5. package/build/lowcode/index.js +1 -1
  6. package/build/lowcode/meta.js +3 -3
  7. package/build/lowcode/preview.js +1 -1
  8. package/build/lowcode/render/default/async/view.js +1 -1
  9. package/build/lowcode/render/default/view.css +1 -1
  10. package/build/lowcode/render/default/view.js +37 -37
  11. package/build/lowcode/view.css +1 -1
  12. package/build/lowcode/view.js +37 -37
  13. package/es/components/buttonGroupPreview/index.js +8 -4
  14. package/es/components/pisellFloorMapLayout/PisellFloorMapLayout.js +207 -49
  15. package/es/components/pisellFloorMapLayout/PisellFloorMapLayout.less +33 -2
  16. package/es/components/pisellFloorMapLayout/appearance/floorMapAppearance.js +50 -2
  17. package/es/components/pisellFloorMapLayout/components/EdgeLayer.js +252 -0
  18. package/es/components/pisellFloorMapLayout/components/EdgeLayer.less +11 -0
  19. package/es/components/pisellFloorMapLayout/components/EditableItemLayer.js +179 -29
  20. package/es/components/pisellFloorMapLayout/components/EditableItemLayer.less +0 -28
  21. package/es/components/pisellFloorMapLayout/components/FloorMapEdgeEditPanel.js +131 -0
  22. package/es/components/pisellFloorMapLayout/components/FloorMapEdgeEditPanel.less +65 -0
  23. package/es/components/pisellFloorMapLayout/components/FloorMapEditPanel.js +5 -4
  24. package/es/components/pisellFloorMapLayout/components/FloorMapEditPanel.less +12 -1
  25. package/es/components/pisellFloorMapLayout/components/FloorMapEditQuickActions.js +8 -1
  26. package/es/components/pisellFloorMapLayout/components/FloorMapOverview.js +16 -8
  27. package/es/components/pisellFloorMapLayout/components/FloorMapOverview.less +69 -17
  28. package/es/components/pisellFloorMapLayout/components/FloorMapToolbar.js +290 -147
  29. package/es/components/pisellFloorMapLayout/components/FloorMapToolbar.less +210 -11
  30. package/es/components/pisellFloorMapLayout/components/FloorMapToolbarViewAllModal.js +81 -0
  31. package/es/components/pisellFloorMapLayout/components/FloorMapZoneElement.d.ts +8 -0
  32. package/es/components/pisellFloorMapLayout/components/FloorMapZoneElement.js +21 -0
  33. package/es/components/pisellFloorMapLayout/components/FloorMapZoneElement.less +74 -0
  34. package/es/components/pisellFloorMapLayout/components/ItemLayer.less +3 -1
  35. package/es/components/pisellFloorMapLayout/components/NodePortMarkers.js +70 -0
  36. package/es/components/pisellFloorMapLayout/components/NodePortMarkers.less +33 -0
  37. package/es/components/pisellFloorMapLayout/components/ViewControls.js +13 -5
  38. package/es/components/pisellFloorMapLayout/components/ViewControlsWithZoom.js +2 -0
  39. package/es/components/pisellFloorMapLayout/context/mergeFloorMapLayoutContext.js +2 -1
  40. package/es/components/pisellFloorMapLayout/floorMapLayoutConstants.js +1 -1
  41. package/es/components/pisellFloorMapLayout/hooks/useFloorMapEdgeEditing.js +340 -0
  42. package/es/components/pisellFloorMapLayout/hooks/useFloorMapEdgeViewModel.js +102 -0
  43. package/es/components/pisellFloorMapLayout/hooks/useFloorMapEditState.js +244 -84
  44. package/es/components/pisellFloorMapLayout/hooks/useFloorMapTransformMetrics.js +54 -0
  45. package/es/components/pisellFloorMapLayout/hooks/useShopFloorPlanSubscription.js +7 -4
  46. package/es/components/pisellFloorMapLayout/index.d.ts +5 -1
  47. package/es/components/pisellFloorMapLayout/locales-ja.js +14 -2
  48. package/es/components/pisellFloorMapLayout/locales-pt.js +14 -2
  49. package/es/components/pisellFloorMapLayout/locales.js +161 -8
  50. package/es/components/pisellFloorMapLayout/types.d.ts +86 -4
  51. package/es/components/pisellFloorMapLayout/types.js +5 -1
  52. package/es/components/pisellFloorMapLayout/utils/alignSnap.js +170 -0
  53. package/es/components/pisellFloorMapLayout/utils/batchScenePlacementLayout.js +86 -0
  54. package/es/components/pisellFloorMapLayout/utils/edgeRouting.js +942 -0
  55. package/es/components/pisellFloorMapLayout/utils/floorMapCanvasDisplay.d.ts +7 -0
  56. package/es/components/pisellFloorMapLayout/utils/floorMapCanvasStage.js +23 -1
  57. package/es/components/pisellFloorMapLayout/utils/floorMapConfigMerge.js +11 -2
  58. package/es/components/pisellFloorMapLayout/utils/floorMapElementKindUtils.js +20 -3
  59. package/es/components/pisellFloorMapLayout/utils/floorMapFallbackRender.js +11 -5
  60. package/es/components/pisellFloorMapLayout/utils/floorMapOverviewLayout.js +5 -3
  61. package/es/components/pisellFloorMapLayout/utils/floorMapResourcePickerDisplay.d.ts +20 -0
  62. package/es/components/pisellFloorMapLayout/utils/floorMapResourcePickerDisplay.js +62 -0
  63. package/es/components/pisellFloorMapLayout/utils/floorMapResourcePickerTypes.d.ts +83 -0
  64. package/es/components/pisellFloorMapLayout/utils/floorMapResourcePickerTypes.js +29 -0
  65. package/es/components/pisellFloorMapLayout/utils/floorMapToolbarPalette.js +51 -0
  66. package/es/components/productCard/cartSkuCard/components/BookingItem/index.js +14 -0
  67. package/es/components/productCard/cartSkuCard/components/BookingItem/index.less +32 -0
  68. package/es/components/productCard/cartSkuCard/components/resources/index.less +4 -0
  69. package/es/components/productCard/cartSkuCard/components/timeRange/index.js +1 -2
  70. package/es/components/productCard/cartSkuCard/index.js +17 -11
  71. package/es/components/productCard/lineItem/BookingLineItem.js +17 -6
  72. package/es/components/productCard/lineItem/components/Holders/index.js +51 -0
  73. package/es/components/productCard/lineItem/components/Holders/index.less +39 -0
  74. package/es/components/productCard/lineItem/components/Resources/index.js +45 -0
  75. package/es/components/productCard/lineItem/components/TimeRange/index.js +64 -0
  76. package/es/components/productCard/lineItem/index.js +5 -2
  77. package/es/components/productCard/lineItem/index.less +21 -10
  78. package/es/components/productCard/types.d.ts +1 -0
  79. package/es/index.d.ts +6 -2
  80. package/es/index.js +6 -2
  81. package/es/pisell-materials.tw.css +3 -0
  82. package/lib/components/buttonGroupPreview/index.js +8 -4
  83. package/lib/components/pisellFloorMapLayout/PisellFloorMapLayout.js +206 -48
  84. package/lib/components/pisellFloorMapLayout/PisellFloorMapLayout.less +33 -2
  85. package/lib/components/pisellFloorMapLayout/appearance/floorMapAppearance.js +50 -2
  86. package/lib/components/pisellFloorMapLayout/components/EdgeLayer.js +255 -0
  87. package/lib/components/pisellFloorMapLayout/components/EdgeLayer.less +11 -0
  88. package/lib/components/pisellFloorMapLayout/components/EditableItemLayer.js +179 -29
  89. package/lib/components/pisellFloorMapLayout/components/EditableItemLayer.less +0 -28
  90. package/lib/components/pisellFloorMapLayout/components/FloorMapEdgeEditPanel.js +134 -0
  91. package/lib/components/pisellFloorMapLayout/components/FloorMapEdgeEditPanel.less +65 -0
  92. package/lib/components/pisellFloorMapLayout/components/FloorMapEditPanel.js +4 -3
  93. package/lib/components/pisellFloorMapLayout/components/FloorMapEditPanel.less +12 -1
  94. package/lib/components/pisellFloorMapLayout/components/FloorMapEditQuickActions.js +8 -1
  95. package/lib/components/pisellFloorMapLayout/components/FloorMapOverview.js +16 -8
  96. package/lib/components/pisellFloorMapLayout/components/FloorMapOverview.less +69 -17
  97. package/lib/components/pisellFloorMapLayout/components/FloorMapToolbar.js +287 -144
  98. package/lib/components/pisellFloorMapLayout/components/FloorMapToolbar.less +210 -11
  99. package/lib/components/pisellFloorMapLayout/components/FloorMapToolbarViewAllModal.js +84 -0
  100. package/lib/components/pisellFloorMapLayout/components/FloorMapZoneElement.d.ts +8 -0
  101. package/lib/components/pisellFloorMapLayout/components/FloorMapZoneElement.js +23 -0
  102. package/lib/components/pisellFloorMapLayout/components/FloorMapZoneElement.less +74 -0
  103. package/lib/components/pisellFloorMapLayout/components/ItemLayer.less +3 -1
  104. package/lib/components/pisellFloorMapLayout/components/NodePortMarkers.js +73 -0
  105. package/lib/components/pisellFloorMapLayout/components/NodePortMarkers.less +33 -0
  106. package/lib/components/pisellFloorMapLayout/components/ViewControls.js +12 -4
  107. package/lib/components/pisellFloorMapLayout/components/ViewControlsWithZoom.js +2 -0
  108. package/lib/components/pisellFloorMapLayout/context/mergeFloorMapLayoutContext.js +2 -1
  109. package/lib/components/pisellFloorMapLayout/floorMapLayoutConstants.js +1 -1
  110. package/lib/components/pisellFloorMapLayout/hooks/useFloorMapEdgeEditing.js +341 -0
  111. package/lib/components/pisellFloorMapLayout/hooks/useFloorMapEdgeViewModel.js +103 -0
  112. package/lib/components/pisellFloorMapLayout/hooks/useFloorMapEditState.js +242 -82
  113. package/lib/components/pisellFloorMapLayout/hooks/useFloorMapTransformMetrics.js +54 -0
  114. package/lib/components/pisellFloorMapLayout/hooks/useShopFloorPlanSubscription.js +7 -4
  115. package/lib/components/pisellFloorMapLayout/index.d.ts +5 -1
  116. package/lib/components/pisellFloorMapLayout/locales-ja.js +14 -2
  117. package/lib/components/pisellFloorMapLayout/locales-pt.js +14 -2
  118. package/lib/components/pisellFloorMapLayout/locales.js +161 -8
  119. package/lib/components/pisellFloorMapLayout/types.d.ts +86 -4
  120. package/lib/components/pisellFloorMapLayout/types.js +5 -0
  121. package/lib/components/pisellFloorMapLayout/utils/alignSnap.js +170 -0
  122. package/lib/components/pisellFloorMapLayout/utils/batchScenePlacementLayout.js +87 -0
  123. package/lib/components/pisellFloorMapLayout/utils/edgeRouting.js +956 -0
  124. package/lib/components/pisellFloorMapLayout/utils/floorMapCanvasDisplay.d.ts +7 -0
  125. package/lib/components/pisellFloorMapLayout/utils/floorMapCanvasStage.js +23 -0
  126. package/lib/components/pisellFloorMapLayout/utils/floorMapConfigMerge.js +11 -2
  127. package/lib/components/pisellFloorMapLayout/utils/floorMapElementKindUtils.js +21 -2
  128. package/lib/components/pisellFloorMapLayout/utils/floorMapFallbackRender.js +11 -5
  129. package/lib/components/pisellFloorMapLayout/utils/floorMapOverviewLayout.js +5 -3
  130. package/lib/components/pisellFloorMapLayout/utils/floorMapResourcePickerDisplay.d.ts +20 -0
  131. package/lib/components/pisellFloorMapLayout/utils/floorMapResourcePickerDisplay.js +64 -0
  132. package/lib/components/pisellFloorMapLayout/utils/floorMapResourcePickerTypes.d.ts +83 -0
  133. package/lib/components/pisellFloorMapLayout/utils/floorMapResourcePickerTypes.js +29 -0
  134. package/lib/components/pisellFloorMapLayout/utils/floorMapToolbarPalette.js +54 -0
  135. package/lib/components/productCard/cartSkuCard/components/BookingItem/index.js +17 -0
  136. package/lib/components/productCard/cartSkuCard/components/BookingItem/index.less +32 -0
  137. package/lib/components/productCard/cartSkuCard/components/resources/index.less +4 -0
  138. package/lib/components/productCard/cartSkuCard/components/timeRange/index.js +1 -2
  139. package/lib/components/productCard/cartSkuCard/index.js +17 -11
  140. package/lib/components/productCard/lineItem/BookingLineItem.js +17 -6
  141. package/lib/components/productCard/lineItem/components/Holders/index.js +53 -0
  142. package/lib/components/productCard/lineItem/components/Holders/index.less +39 -0
  143. package/lib/components/productCard/lineItem/components/Resources/index.js +47 -0
  144. package/lib/components/productCard/lineItem/components/TimeRange/index.js +67 -0
  145. package/lib/components/productCard/lineItem/index.js +5 -2
  146. package/lib/components/productCard/lineItem/index.less +21 -10
  147. package/lib/components/productCard/types.d.ts +1 -0
  148. package/lib/index.d.ts +6 -2
  149. package/lib/index.js +11 -0
  150. package/lib/pisell-materials.tw.css +3 -0
  151. package/package.json +6 -3
@@ -0,0 +1,134 @@
1
+ const require_runtime = require("../../../_virtual/_rolldown/runtime.js");
2
+ const require_edgeRouting = require("../utils/edgeRouting.js");
3
+ let react = require("react");
4
+ react = require_runtime.__toESM(react);
5
+ let _pisell_utils = require("@pisell/utils");
6
+ let antd = require("antd");
7
+ let _ant_design_icons = require("@ant-design/icons");
8
+ let classnames = require("classnames");
9
+ classnames = require_runtime.__toESM(classnames);
10
+ require("./FloorMapEdgeEditPanel.less");
11
+ //#region src/components/pisellFloorMapLayout/components/FloorMapEdgeEditPanel.tsx
12
+ /**
13
+ * FloorMapEdgeEditPanel - 选中连线后的侧栏编辑
14
+ */
15
+ const PREFIX = "pisell-floor-map-layout";
16
+ const I18N = "pisell-floor-map-layout.edge-panel";
17
+ const STATUS_OPTIONS = [
18
+ {
19
+ value: "online",
20
+ labelKey: `${I18N}.status-online`
21
+ },
22
+ {
23
+ value: "offline",
24
+ labelKey: `${I18N}.status-offline`
25
+ },
26
+ {
27
+ value: "warning",
28
+ labelKey: `${I18N}.status-warning`
29
+ },
30
+ {
31
+ value: "unknown",
32
+ labelKey: `${I18N}.status-unknown`
33
+ }
34
+ ];
35
+ const ANCHOR_OPTIONS = require_edgeRouting.ANCHORS.map((a) => ({
36
+ value: a,
37
+ label: a
38
+ }));
39
+ function nodeLabel(config, instanceId) {
40
+ var _config$sceneElements, _el$name;
41
+ const el = ((_config$sceneElements = config.sceneElements) !== null && _config$sceneElements !== void 0 ? _config$sceneElements : []).find((e) => e.instanceId === instanceId);
42
+ return (el === null || el === void 0 || (_el$name = el.name) === null || _el$name === void 0 ? void 0 : _el$name.trim()) || instanceId;
43
+ }
44
+ function FloorMapEdgeEditPanel(props) {
45
+ var _edge$sourceAnchor, _edge$targetAnchor, _edge$sourceLabel, _edge$targetLabel, _edge$label, _edge$status, _edge$color, _edge$strokeWidth;
46
+ const { edge, config, onUpdate, onClose, onDelete, layoutDraftDirty, className } = props;
47
+ const t = (0, react.useCallback)((key) => _pisell_utils.locales.getText(key), []);
48
+ const panelScrollRef = (0, react.useRef)(null);
49
+ /** 与图元编辑面板一致:下拉挂到表单项父节点,避免侧栏 overflow 裁切 */
50
+ const getSelectPopupContainer = (0, react.useCallback)((node) => {
51
+ var _ref, _node$parentElement;
52
+ return (_ref = (_node$parentElement = node.parentElement) !== null && _node$parentElement !== void 0 ? _node$parentElement : panelScrollRef.current) !== null && _ref !== void 0 ? _ref : document.body;
53
+ }, []);
54
+ return /* @__PURE__ */ react.default.createElement("div", {
55
+ ref: panelScrollRef,
56
+ className: (0, classnames.default)(`${PREFIX}-edge-edit-panel`, className)
57
+ }, /* @__PURE__ */ react.default.createElement("div", { className: `${PREFIX}-edge-edit-panel-header` }, /* @__PURE__ */ react.default.createElement("span", { className: `${PREFIX}-edge-edit-panel-title` }, t(`${I18N}.title`)), /* @__PURE__ */ react.default.createElement(antd.Button, {
58
+ type: "text",
59
+ size: "large",
60
+ className: `${PREFIX}-edge-edit-panel-close`,
61
+ icon: /* @__PURE__ */ react.default.createElement(_ant_design_icons.CloseOutlined, null),
62
+ onClick: onClose,
63
+ "aria-label": "close"
64
+ })), layoutDraftDirty ? /* @__PURE__ */ react.default.createElement("div", { className: `${PREFIX}-edge-edit-panel-dirty-hint` }, t(`${I18N}.dirty-hint`)) : null, /* @__PURE__ */ react.default.createElement(antd.Form, {
65
+ layout: "vertical",
66
+ size: "large",
67
+ className: `${PREFIX}-edge-edit-form`
68
+ }, /* @__PURE__ */ react.default.createElement(antd.Form.Item, { label: t(`${I18N}.source-node`) }, /* @__PURE__ */ react.default.createElement(antd.Input, {
69
+ value: nodeLabel(config, edge.sourceId),
70
+ disabled: true
71
+ })), /* @__PURE__ */ react.default.createElement(antd.Form.Item, { label: t(`${I18N}.target-node`) }, /* @__PURE__ */ react.default.createElement(antd.Input, {
72
+ value: nodeLabel(config, edge.targetId),
73
+ disabled: true
74
+ })), /* @__PURE__ */ react.default.createElement(antd.Form.Item, { label: t(`${I18N}.source-anchor`) }, /* @__PURE__ */ react.default.createElement(antd.Select, {
75
+ value: (_edge$sourceAnchor = edge.sourceAnchor) !== null && _edge$sourceAnchor !== void 0 ? _edge$sourceAnchor : "right",
76
+ options: ANCHOR_OPTIONS,
77
+ getPopupContainer: getSelectPopupContainer,
78
+ onChange: (v) => onUpdate({ sourceAnchor: v })
79
+ })), /* @__PURE__ */ react.default.createElement(antd.Form.Item, { label: t(`${I18N}.target-anchor`) }, /* @__PURE__ */ react.default.createElement(antd.Select, {
80
+ value: (_edge$targetAnchor = edge.targetAnchor) !== null && _edge$targetAnchor !== void 0 ? _edge$targetAnchor : "left",
81
+ options: ANCHOR_OPTIONS,
82
+ getPopupContainer: getSelectPopupContainer,
83
+ onChange: (v) => onUpdate({ targetAnchor: v })
84
+ })), /* @__PURE__ */ react.default.createElement(antd.Form.Item, { label: t(`${I18N}.source-label`) }, /* @__PURE__ */ react.default.createElement(antd.Input, {
85
+ value: (_edge$sourceLabel = edge.sourceLabel) !== null && _edge$sourceLabel !== void 0 ? _edge$sourceLabel : "",
86
+ onChange: (e) => onUpdate({ sourceLabel: e.target.value }),
87
+ placeholder: "G3/WAN"
88
+ })), /* @__PURE__ */ react.default.createElement(antd.Form.Item, { label: t(`${I18N}.target-label`) }, /* @__PURE__ */ react.default.createElement(antd.Input, {
89
+ value: (_edge$targetLabel = edge.targetLabel) !== null && _edge$targetLabel !== void 0 ? _edge$targetLabel : "",
90
+ onChange: (e) => onUpdate({ targetLabel: e.target.value })
91
+ })), /* @__PURE__ */ react.default.createElement(antd.Form.Item, { label: t(`${I18N}.center-label`) }, /* @__PURE__ */ react.default.createElement(antd.Input, {
92
+ value: (_edge$label = edge.label) !== null && _edge$label !== void 0 ? _edge$label : "",
93
+ onChange: (e) => onUpdate({ label: e.target.value })
94
+ })), /* @__PURE__ */ react.default.createElement(antd.Form.Item, { label: t(`${I18N}.status`) }, /* @__PURE__ */ react.default.createElement(antd.Select, {
95
+ value: (_edge$status = edge.status) !== null && _edge$status !== void 0 ? _edge$status : "unknown",
96
+ options: STATUS_OPTIONS.map((o) => ({
97
+ value: o.value,
98
+ label: t(o.labelKey)
99
+ })),
100
+ getPopupContainer: getSelectPopupContainer,
101
+ onChange: (v) => onUpdate({ status: v })
102
+ })), /* @__PURE__ */ react.default.createElement(antd.Form.Item, { label: t(`${I18N}.color`) }, /* @__PURE__ */ react.default.createElement(antd.Input, {
103
+ value: (_edge$color = edge.color) !== null && _edge$color !== void 0 ? _edge$color : "",
104
+ onChange: (e) => onUpdate({ color: e.target.value || void 0 }),
105
+ placeholder: "#12B76A"
106
+ })), /* @__PURE__ */ react.default.createElement(antd.Form.Item, { label: t(`${I18N}.stroke-width`) }, /* @__PURE__ */ react.default.createElement(antd.InputNumber, {
107
+ min: .5,
108
+ max: 8,
109
+ step: .5,
110
+ value: (_edge$strokeWidth = edge.strokeWidth) !== null && _edge$strokeWidth !== void 0 ? _edge$strokeWidth : 1.5,
111
+ onChange: (v) => onUpdate({ strokeWidth: v !== null && v !== void 0 ? v : void 0 }),
112
+ style: { width: "100%" }
113
+ })), /* @__PURE__ */ react.default.createElement(antd.Form.Item, { label: t(`${I18N}.dashed`) }, /* @__PURE__ */ react.default.createElement(antd.Select, {
114
+ value: edge.dashed ? "yes" : "no",
115
+ options: [{
116
+ value: "no",
117
+ label: t(`${I18N}.dashed-no`)
118
+ }, {
119
+ value: "yes",
120
+ label: t(`${I18N}.dashed-yes`)
121
+ }],
122
+ getPopupContainer: getSelectPopupContainer,
123
+ onChange: (v) => onUpdate({ dashed: v === "yes" })
124
+ })), onDelete ? /* @__PURE__ */ react.default.createElement(antd.Popconfirm, {
125
+ title: t(`${I18N}.delete-confirm`),
126
+ onConfirm: onDelete
127
+ }, /* @__PURE__ */ react.default.createElement(antd.Button, {
128
+ danger: true,
129
+ block: true,
130
+ size: "large"
131
+ }, t(`${I18N}.delete`))) : null));
132
+ }
133
+ //#endregion
134
+ exports.FloorMapEdgeEditPanel = FloorMapEdgeEditPanel;
@@ -0,0 +1,65 @@
1
+ /** 连线编辑侧栏:尺寸与图元 {@link FloorMapEditPanel} 对齐 */
2
+ .pisell-floor-map-layout-edge-edit-panel {
3
+ width: 280px;
4
+ /** 未放入 edit-panel-wrap 时的兜底;wrap 内由父级 flex 限制为 100% 高度 */
5
+ max-height: 80vh;
6
+ overflow-y: auto;
7
+ touch-action: pan-y;
8
+ padding: 12px;
9
+ padding-bottom: calc(
10
+ 12px + var(--fmap-viewport-dock-bottom-clearance, 78px)
11
+ );
12
+ background: #fff;
13
+ border: 1px solid #e8e8e8;
14
+ border-radius: 8px;
15
+ box-shadow: 0 2px 8px rgba(0, 0, 0, 0.08);
16
+ }
17
+
18
+ .pisell-floor-map-layout-edge-edit-panel-header {
19
+ display: flex;
20
+ align-items: center;
21
+ justify-content: space-between;
22
+ gap: 8px;
23
+ margin-bottom: 12px;
24
+ }
25
+
26
+ .pisell-floor-map-layout-edge-edit-panel-title {
27
+ font-size: 14px;
28
+ font-weight: 500;
29
+ color: #262626;
30
+ line-height: 1.4;
31
+ }
32
+
33
+ .pisell-floor-map-layout-edge-edit-panel-close {
34
+ flex-shrink: 0;
35
+ color: rgba(0, 0, 0, 0.45);
36
+
37
+ &:hover {
38
+ color: rgba(0, 0, 0, 0.88);
39
+ }
40
+ }
41
+
42
+ .pisell-floor-map-layout-edge-edit-panel-dirty-hint {
43
+ margin: 0 0 10px;
44
+ font-size: 12px;
45
+ line-height: 1.45;
46
+ color: #595959;
47
+ }
48
+
49
+ /** 手机抽屉内与图元面板同款铺满 */
50
+ .pisell-floor-map-layout-edit-panel--phone-drawer.pisell-floor-map-layout-edge-edit-panel {
51
+ flex: 1;
52
+ min-height: 0;
53
+ width: 100%;
54
+ max-height: none;
55
+ border-radius: 0;
56
+ border: none;
57
+ box-shadow: none;
58
+ overflow-x: hidden;
59
+ overflow-y: auto;
60
+ -webkit-overflow-scrolling: touch;
61
+ padding-bottom: calc(
62
+ 12px + env(safe-area-inset-bottom, 0px) +
63
+ var(--fmap-viewport-dock-bottom-clearance, 78px)
64
+ );
65
+ }
@@ -2,12 +2,12 @@ const require_runtime = require("../../../_virtual/_rolldown/runtime.js");
2
2
  const require_types = require("../types.js");
3
3
  const require_floorMapBuiltinShapes = require("../utils/floorMapBuiltinShapes.js");
4
4
  const require_floorMapElementKindUtils = require("../utils/floorMapElementKindUtils.js");
5
- const require_floorMapDataRecordLabel = require("../utils/floorMapDataRecordLabel.js");
6
5
  const require_floorMapLayoutConstants = require("../floorMapLayoutConstants.js");
7
6
  const require_useEngineContext = require("../../../hooks/useEngineContext.js");
8
7
  const require_floorMapCanvasDisplay = require("../utils/floorMapCanvasDisplay.js");
9
8
  const require_floorMapElementNameAsTitle = require("../utils/floorMapElementNameAsTitle.js");
10
9
  const require_FloorMapDataForm = require("./FloorMapDataForm.js");
10
+ const require_floorMapDataRecordLabel = require("../utils/floorMapDataRecordLabel.js");
11
11
  let react = require("react");
12
12
  react = require_runtime.__toESM(react);
13
13
  let _pisell_utils = require("@pisell/utils");
@@ -112,8 +112,9 @@ function FloorMapEditPanel(props) {
112
112
  var _builtinDef$defaultSi, _builtinDef$defaultSi2, _sceneElement$name, _sceneElement$zIndex, _sceneElement$width, _sceneElement$height, _sceneElement$imageUr, _sceneElement$builtin;
113
113
  /** 内置图形宽高优先采用当前选定预设的 defaultSize,未选则给一个保底正方形 */
114
114
  const builtinDef = isBuiltinShapeKind ? require_floorMapBuiltinShapes.getFloorMapBuiltinShapeDef(sceneElement.builtinShapeKey) : void 0;
115
- const dw = isImageKind ? 400 : isBuiltinShapeKind ? (_builtinDef$defaultSi = builtinDef === null || builtinDef === void 0 ? void 0 : builtinDef.defaultSize.width) !== null && _builtinDef$defaultSi !== void 0 ? _builtinDef$defaultSi : 96 : 180;
116
- const dh = isImageKind ? 240 : isBuiltinShapeKind ? (_builtinDef$defaultSi2 = builtinDef === null || builtinDef === void 0 ? void 0 : builtinDef.defaultSize.height) !== null && _builtinDef$defaultSi2 !== void 0 ? _builtinDef$defaultSi2 : 96 : 120;
115
+ const bindingPolicy = require_floorMapElementKindUtils.resolveDataBindingPolicy(kindConfig);
116
+ const dw = isImageKind ? 400 : isBuiltinShapeKind ? (_builtinDef$defaultSi = builtinDef === null || builtinDef === void 0 ? void 0 : builtinDef.defaultSize.width) !== null && _builtinDef$defaultSi !== void 0 ? _builtinDef$defaultSi : 96 : bindingPolicy !== "none" ? require_floorMapElementKindUtils.FLOOR_MAP_RESOURCE_PLACE_DEFAULT.width : 48;
117
+ const dh = isImageKind ? 240 : isBuiltinShapeKind ? (_builtinDef$defaultSi2 = builtinDef === null || builtinDef === void 0 ? void 0 : builtinDef.defaultSize.height) !== null && _builtinDef$defaultSi2 !== void 0 ? _builtinDef$defaultSi2 : 96 : bindingPolicy !== "none" ? require_floorMapElementKindUtils.FLOOR_MAP_RESOURCE_PLACE_DEFAULT.height : 48;
117
118
  return {
118
119
  x: sceneElement.x,
119
120
  y: sceneElement.y,
@@ -1,10 +1,18 @@
1
1
  .pisell-floor-map-layout-edit-panel {
2
2
  width: 280px;
3
3
  padding: 12px;
4
+ /**
5
+ * 桌面编辑面板可纵向滚动:底部多留一截,避免 Apply 等被右下 ViewControls Dock 挡住。
6
+ * 手机抽屉用 `--phone-drawer` 单独处理 safe-area,不叠加此项。
7
+ */
8
+ padding-bottom: calc(
9
+ 12px + var(--fmap-viewport-dock-bottom-clearance, 78px)
10
+ );
4
11
  background: #fff;
5
12
  border: 1px solid #e8e8e8;
6
13
  border-radius: 8px;
7
14
  box-shadow: 0 2px 8px rgba(0, 0, 0, 0.08);
15
+ /** 未放入 edit-panel-wrap 时的兜底;wrap 内由父级 flex 限制为 100% 高度 */
8
16
  max-height: 80vh;
9
17
  overflow-y: auto;
10
18
  touch-action: pan-y;
@@ -155,7 +163,10 @@
155
163
  overflow-x: hidden;
156
164
  overflow-y: auto;
157
165
  -webkit-overflow-scrolling: touch;
158
- padding-bottom: calc(12px + env(safe-area-inset-bottom, 0px));
166
+ padding-bottom: calc(
167
+ 12px + env(safe-area-inset-bottom, 0px) +
168
+ var(--fmap-viewport-dock-bottom-clearance, 78px)
169
+ );
159
170
  }
160
171
 
161
172
  .pisell-floor-map-layout-edit-panel-wrap-constrained .pisell-floor-map-layout-edit-panel {
@@ -11,14 +11,21 @@ classnames = require_runtime.__toESM(classnames);
11
11
  */
12
12
  const PREFIX = "pisell-floor-map-layout";
13
13
  function FloorMapEditQuickActions(props) {
14
- const { className, labels, isLocked, onToggleLock, onDuplicate, onDelete } = props;
14
+ const { className, labels, isLocked, onToggleLock, onDuplicate, onDelete, viewportScale = 1 } = props;
15
15
  const stopBubble = (0, react.useCallback)((e) => {
16
16
  e.stopPropagation();
17
17
  }, []);
18
+ const safeScale = Math.max(viewportScale, .01);
19
+ const inv = 1 / safeScale;
20
+ const gap = 10 / safeScale;
18
21
  return /* @__PURE__ */ react.default.createElement("div", {
19
22
  role: "toolbar",
20
23
  "aria-label": labels.ariaToolbar,
21
24
  className: (0, classnames.default)(`${PREFIX}-edit-quick-actions`, isLocked && `${PREFIX}-edit-quick-actions--locked`, className),
25
+ style: {
26
+ transform: `translate(-50%, ${gap}px) scale(${inv})`,
27
+ transformOrigin: "top center"
28
+ },
22
29
  onPointerDown: (e) => e.stopPropagation()
23
30
  }, /* @__PURE__ */ react.default.createElement(antd.Tooltip, { title: isLocked ? labels.unlock : labels.lock }, /* @__PURE__ */ react.default.createElement(antd.Button, {
24
31
  type: "text",
@@ -21,9 +21,10 @@ require("./FloorMapOverview.less");
21
21
  * 设计要点:
22
22
  * - 不再自带 TransformWrapper / ResizeObserver / fit 算法;
23
23
  * - 每个画布作为独立区域,仅一条细边框作分隔,无背景色/网格;
24
- * - 区域左上角用小 chip 显示画布名;chip 不拦截图元交互;
24
+ * - 画布名显示在边框外的标题带;标题不拦截图元交互;
25
25
  * - 仅渲染 ItemLayer(阅读态),与单画布的 hover/click 行为一致;编辑层不渲染。
26
26
  */
27
+ const I18N_OVERVIEW_AREA_BADGE = "pisell-floor-map-layout.overview.area-title-badge";
27
28
  const I18N_EMPTY = "pisell-floor-map-layout.overview.empty";
28
29
  function FloorMapOverview(props) {
29
30
  var _engineCtx$engine;
@@ -57,23 +58,30 @@ function FloorMapOverview(props) {
57
58
  const inverseScale = 1 / safeScale;
58
59
  return /* @__PURE__ */ react.default.createElement("div", {
59
60
  key: area.canvasId,
60
- className: `${require_floorMapLayoutConstants.FLOOR_MAP_LAYOUT_CLASS_PREFIX}-overview-area`,
61
+ className: `${require_floorMapLayoutConstants.FLOOR_MAP_LAYOUT_CLASS_PREFIX}-overview-area-block`,
61
62
  style: {
62
63
  position: "absolute",
63
64
  left: area.x,
64
65
  top: area.y,
65
- width: area.contentWidth,
66
- height: area.contentHeight
66
+ width: area.contentWidth
67
67
  }
68
- }, /* @__PURE__ */ react.default.createElement("span", {
68
+ }, /* @__PURE__ */ react.default.createElement("div", {
69
69
  className: `${require_floorMapLayoutConstants.FLOOR_MAP_LAYOUT_CLASS_PREFIX}-overview-area-title`,
70
70
  title: displayName,
71
71
  style: {
72
+ height: area.titleBandHeight,
72
73
  transform: `scale(${inverseScale})`,
73
74
  transformOrigin: "top left",
74
- maxWidth: `calc((100% - 16px) * ${safeScale})`
75
+ width: `${100 * safeScale}%`,
76
+ maxWidth: `${area.contentWidth * safeScale}px`
77
+ }
78
+ }, /* @__PURE__ */ react.default.createElement("span", { className: `${require_floorMapLayoutConstants.FLOOR_MAP_LAYOUT_CLASS_PREFIX}-overview-area-title-inner` }, /* @__PURE__ */ react.default.createElement("span", { className: `${require_floorMapLayoutConstants.FLOOR_MAP_LAYOUT_CLASS_PREFIX}-overview-area-title-badge` }, _pisell_utils.locales.getText(I18N_OVERVIEW_AREA_BADGE)), /* @__PURE__ */ react.default.createElement("span", { className: `${require_floorMapLayoutConstants.FLOOR_MAP_LAYOUT_CLASS_PREFIX}-overview-area-title-text` }, displayName))), /* @__PURE__ */ react.default.createElement("div", {
79
+ className: `${require_floorMapLayoutConstants.FLOOR_MAP_LAYOUT_CLASS_PREFIX}-overview-area`,
80
+ style: {
81
+ width: area.contentWidth,
82
+ height: area.contentHeight
75
83
  }
76
- }, displayName), /* @__PURE__ */ react.default.createElement(require_ItemLayer.default, {
84
+ }, /* @__PURE__ */ react.default.createElement(require_ItemLayer.default, {
77
85
  items: area.items,
78
86
  renderItem,
79
87
  viewportScale,
@@ -90,7 +98,7 @@ function FloorMapOverview(props) {
90
98
  onItemLeave,
91
99
  getMergedItemWrapperStyle,
92
100
  readModeSelectedItemId
93
- }));
101
+ })));
94
102
  }));
95
103
  }
96
104
  //#endregion
@@ -5,10 +5,15 @@
5
5
  * 视觉规则:
6
6
  * - 大画布自身没有背景(沿用外层 map-area 背景);
7
7
  * - 每个区域只有一条细边框 + 圆角;
8
- * - 区域左上角小 chip 显示画布名,半透明白底 + 模糊,不拦截图元交互。
8
+ * - 标题条在画布边框外(上方),装箱时为标题带预留高度;
9
+ * - 区内资源图元与标题分层,标题不拦截交互。
9
10
  */
10
11
 
11
12
  .pisell-floor-map-layout-overview {
13
+ &-area-block {
14
+ box-sizing: border-box;
15
+ }
16
+
12
17
  &--empty {
13
18
  display: flex;
14
19
  align-items: center;
@@ -39,27 +44,74 @@
39
44
  }
40
45
 
41
46
  /**
42
- * 区域标题:左上角 chip,半透明白底 + 模糊;不占独立行高。
43
- * pointer-events: none 让标题不拦截图元交互(点击/拖拽)。
47
+ * 外置标题带:占布局预留高度,标签在带内底对齐,与下方画布边框留出间距。
44
48
  */
45
49
  &-area-title {
46
- position: absolute;
47
- top: 8px;
48
- left: 8px;
49
- z-index: 2;
50
- display: inline-block;
51
- max-width: calc(100% - 16px);
52
- padding: 2px 10px;
53
- font-size: 12px;
54
- line-height: 1.5;
55
- color: rgba(0, 0, 0, 0.65);
56
- background: rgba(255, 255, 255, 0.85);
57
- backdrop-filter: blur(8px);
58
- border-radius: 999px;
50
+ display: flex;
51
+ align-items: flex-end;
52
+ box-sizing: border-box;
53
+ padding-bottom: 8px;
59
54
  pointer-events: none;
55
+ overflow: visible;
56
+ }
57
+
58
+ &-area-title-inner {
59
+ display: inline-flex;
60
+ align-items: center;
61
+ gap: 6px;
62
+ max-width: 100%;
63
+ padding: 4px 12px 4px 8px;
64
+ background: #fff;
65
+ border: 1px solid rgba(0, 0, 0, 0.12);
66
+ border-left: 3px solid var(--fmap-primary, #1677ff);
67
+ border-radius: 6px;
68
+ box-shadow: 0 2px 8px rgba(16, 24, 40, 0.12);
69
+ line-height: 1.35;
70
+ box-sizing: border-box;
71
+
72
+ [data-appearance-mode='dark'] & {
73
+ background: rgba(28, 28, 30, 0.94);
74
+ border-color: rgba(255, 255, 255, 0.18);
75
+ border-left-color: var(--fmap-primary, #1677ff);
76
+ box-shadow: 0 2px 10px rgba(0, 0, 0, 0.35);
77
+ }
78
+ }
79
+
80
+ &-area-title-badge {
81
+ flex-shrink: 0;
82
+ padding: 1px 6px;
83
+ font-size: 10px;
84
+ font-weight: 700;
85
+ letter-spacing: 0.04em;
86
+ text-transform: uppercase;
87
+ color: var(--fmap-primary, #1677ff);
88
+ background: color-mix(
89
+ in srgb,
90
+ var(--fmap-primary, #1677ff) 14%,
91
+ #fff
92
+ );
93
+ border-radius: 4px;
94
+
95
+ [data-appearance-mode='dark'] & {
96
+ background: color-mix(
97
+ in srgb,
98
+ var(--fmap-primary, #1677ff) 22%,
99
+ rgba(28, 28, 30, 1)
100
+ );
101
+ }
102
+ }
103
+
104
+ &-area-title-text {
105
+ min-width: 0;
106
+ font-size: 13px;
107
+ font-weight: 600;
108
+ color: #101828;
60
109
  white-space: nowrap;
61
110
  overflow: hidden;
62
111
  text-overflow: ellipsis;
63
- font-weight: 500;
112
+
113
+ [data-appearance-mode='dark'] & {
114
+ color: #f5f5f5;
115
+ }
64
116
  }
65
117
  }