@wipco/sdui 1.5.0 → 1.6.1

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 (143) hide show
  1. package/dist/{DatePicker-C_TT_SOw.d.ts → DatePicker-DX9juElE.d.ts} +10 -1
  2. package/dist/{chunk-7P7N43JV.js → chunk-34BABTH4.js} +2 -2
  3. package/dist/{chunk-DMLDKW7K.js → chunk-37BNG4DT.js} +1 -1
  4. package/dist/{chunk-5WW4MBRO.js → chunk-3JTBOABA.js} +6 -2
  5. package/dist/{chunk-HBIIEYKW.js → chunk-3PCR73OC.js} +4 -4
  6. package/dist/{chunk-VY7MVBSE.js → chunk-3PT5OBOU.js} +2 -2
  7. package/dist/{chunk-YVTV4ZV6.js → chunk-4YPPL7JK.js} +1 -1
  8. package/dist/{chunk-E6ISNQK3.js → chunk-6YBSBC77.js} +31 -8
  9. package/dist/{chunk-YWUDBLO6.js → chunk-7G6J6QFC.js} +2 -2
  10. package/dist/{chunk-UV6HHFEW.js → chunk-A57GKV5F.js} +129 -68
  11. package/dist/{chunk-I45EUZC6.js → chunk-AJ3KDBEE.js} +4 -2
  12. package/dist/chunk-BITS7UJY.js +333 -0
  13. package/dist/{chunk-DOL57OOP.js → chunk-BV37UCDF.js} +3 -3
  14. package/dist/chunk-CSZCWBOE.js +256 -0
  15. package/dist/{chunk-XGFDY43I.js → chunk-CUFGH3LB.js} +88 -18
  16. package/dist/{chunk-A6LAIGUS.js → chunk-EGFDELSF.js} +7 -4
  17. package/dist/{chunk-JIV4YHCZ.js → chunk-EJIWOD7W.js} +1 -1
  18. package/dist/{chunk-CXW6KT6X.js → chunk-ESAFQXEU.js} +3 -3
  19. package/dist/{chunk-N5RKM6IC.js → chunk-EUSC5NMZ.js} +4 -4
  20. package/dist/{chunk-RWSH2MBU.js → chunk-FP32LNFK.js} +73 -19
  21. package/dist/{chunk-44TDRCKR.js → chunk-GKYUDTMI.js} +5 -5
  22. package/dist/chunk-GSM664TX.js +38 -0
  23. package/dist/{chunk-I5SD7XRA.js → chunk-GSXD52XG.js} +3 -3
  24. package/dist/{chunk-O4IISNE7.js → chunk-IB2ZPUTF.js} +51 -12
  25. package/dist/{chunk-YOZN35HD.js → chunk-IIRVHSNK.js} +3 -3
  26. package/dist/{chunk-FNMS7OB7.js → chunk-J7BZF4T4.js} +5 -5
  27. package/dist/{chunk-KO6OEY3G.js → chunk-JHFA5RDN.js} +3 -13
  28. package/dist/{chunk-DKVSM5HX.js → chunk-KDKRFWIF.js} +6 -6
  29. package/dist/chunk-KO3EUNWB.js +380 -0
  30. package/dist/{chunk-JYAR7D5U.js → chunk-NLSR3JYU.js} +2 -2
  31. package/dist/{chunk-ZORQPB6B.js → chunk-O4EMQWCV.js} +325 -360
  32. package/dist/{chunk-2HLXCKK7.js → chunk-OCYJ2ZOV.js} +2 -2
  33. package/dist/{chunk-OQ52XMGG.js → chunk-OKNF2SBB.js} +4 -4
  34. package/dist/{chunk-GNA6SX2H.js → chunk-OQ7A3SFM.js} +2 -2
  35. package/dist/{chunk-A5XQOEVH.js → chunk-PCFH74RD.js} +4 -4
  36. package/dist/{chunk-BEM2YS7U.js → chunk-SGGIWPP6.js} +3 -3
  37. package/dist/{chunk-NIJUVTEW.js → chunk-TB7G5DXQ.js} +3 -3
  38. package/dist/{chunk-GZBY7I4Y.js → chunk-TWUKNUUQ.js} +66 -10
  39. package/dist/{chunk-WPSK2CB5.js → chunk-UC725BGW.js} +16 -5
  40. package/dist/{chunk-ZFNFPXPR.js → chunk-US3K6Q5T.js} +2 -2
  41. package/dist/{chunk-MPT7WJG2.js → chunk-USNPJEXH.js} +5 -5
  42. package/dist/{chunk-SAPBDJJQ.js → chunk-UZZLMPRW.js} +2 -2
  43. package/dist/{chunk-Q4SWUINA.js → chunk-VAXRTBJH.js} +1 -1
  44. package/dist/{chunk-RYBBPFI7.js → chunk-VQKX5PJ4.js} +4 -4
  45. package/dist/chunk-VR5MFUD2.js +106 -0
  46. package/dist/{chunk-JZXU22PE.js → chunk-VSNHDHGS.js} +208 -117
  47. package/dist/{chunk-2YP5N4VV.js → chunk-VZOQRQAR.js} +1 -1
  48. package/dist/{chunk-AXGF4M57.js → chunk-XAXROQKB.js} +1 -1
  49. package/dist/{chunk-IZ3JA2BR.js → chunk-XFKNU6QN.js} +3 -3
  50. package/dist/{chunk-GTGS2QRL.js → chunk-XUVWIRZJ.js} +3 -3
  51. package/dist/{chunk-RNOUXUBO.js → chunk-YYAGE733.js} +323 -59
  52. package/dist/index.d.ts +449 -91
  53. package/dist/index.js +1060 -138
  54. package/dist/{layout-C3nRXMwb.d.ts → layout-DmRikwZb.d.ts} +5 -4
  55. package/dist/meta.d.ts +1 -1
  56. package/dist/meta.js +351 -25
  57. package/dist/rich/ExcelUploadCard.d.ts +1 -1
  58. package/dist/rich/ExcelUploadCard.js +5 -4
  59. package/dist/rich.d.ts +22 -3
  60. package/dist/rich.js +304 -35
  61. package/dist/styles.css +119 -4
  62. package/dist/{types-COjGKgmd.d.ts → types-CMikpoN5.d.ts} +65 -2
  63. package/dist/widgets/ApprovalLineEditor.d.ts +1 -1
  64. package/dist/widgets/ApprovalLineEditor.js +9 -8
  65. package/dist/widgets/ApprovalOverridesEditor.d.ts +1 -1
  66. package/dist/widgets/ApprovalOverridesEditor.js +11 -10
  67. package/dist/widgets/ApprovalStepper.d.ts +29 -4
  68. package/dist/widgets/ApprovalStepper.js +3 -3
  69. package/dist/widgets/AutocompleteField.d.ts +1 -1
  70. package/dist/widgets/AutocompleteField.js +9 -8
  71. package/dist/widgets/ColumnBoard.d.ts +1 -1
  72. package/dist/widgets/ColumnBoard.js +3 -3
  73. package/dist/widgets/DiffView.d.ts +1 -1
  74. package/dist/widgets/DiffView.js +3 -3
  75. package/dist/widgets/Disclosure.d.ts +1 -1
  76. package/dist/widgets/Disclosure.js +3 -3
  77. package/dist/widgets/EventCalendar.d.ts +5 -1
  78. package/dist/widgets/EventCalendar.js +5 -3
  79. package/dist/widgets/FileDropzone.d.ts +1 -1
  80. package/dist/widgets/FileDropzone.js +9 -7
  81. package/dist/widgets/ImageLightbox.d.ts +1 -1
  82. package/dist/widgets/ImageLightbox.js +7 -5
  83. package/dist/widgets/InlineEdit.d.ts +1 -1
  84. package/dist/widgets/InlineEdit.js +3 -3
  85. package/dist/widgets/JsonField.d.ts +1 -1
  86. package/dist/widgets/JsonField.js +3 -3
  87. package/dist/widgets/LiveClock.d.ts +1 -1
  88. package/dist/widgets/LiveClock.js +2 -2
  89. package/dist/widgets/OptionSchemaEditor.d.ts +1 -1
  90. package/dist/widgets/OptionSchemaEditor.js +4 -4
  91. package/dist/widgets/OptionValueFields.d.ts +1 -1
  92. package/dist/widgets/OptionValueFields.js +4 -4
  93. package/dist/widgets/OrgChart.d.ts +1 -1
  94. package/dist/widgets/OrgChart.js +4 -4
  95. package/dist/widgets/OrgChartBoard.d.ts +15 -33
  96. package/dist/widgets/OrgChartBoard.js +10 -8
  97. package/dist/widgets/PeriodFilter.d.ts +1 -1
  98. package/dist/widgets/PeriodFilter.js +6 -5
  99. package/dist/widgets/PermissionMatrixEditor.d.ts +34 -2
  100. package/dist/widgets/PermissionMatrixEditor.js +6 -4
  101. package/dist/widgets/PositionSelect.d.ts +1 -1
  102. package/dist/widgets/PositionSelect.js +5 -4
  103. package/dist/widgets/PrintSheet.d.ts +15 -2
  104. package/dist/widgets/PrintSheet.js +3 -3
  105. package/dist/widgets/ProfileEditDiffCard.d.ts +1 -1
  106. package/dist/widgets/ProfileEditDiffCard.js +5 -4
  107. package/dist/widgets/QRDisplay.d.ts +1 -1
  108. package/dist/widgets/QRDisplay.js +5 -4
  109. package/dist/widgets/RankBoard.d.ts +1 -1
  110. package/dist/widgets/RankBoard.js +8 -6
  111. package/dist/widgets/RecordSheet.d.ts +1 -1
  112. package/dist/widgets/RecordSheet.js +2 -2
  113. package/dist/widgets/RoleMemberPicker.d.ts +1 -1
  114. package/dist/widgets/RoleMemberPicker.js +6 -5
  115. package/dist/widgets/SearchableMultiPicker.d.ts +1 -1
  116. package/dist/widgets/SearchableMultiPicker.js +7 -6
  117. package/dist/widgets/SecureScreen.d.ts +1 -1
  118. package/dist/widgets/SecureScreen.js +3 -3
  119. package/dist/widgets/StackedMeter.d.ts +1 -1
  120. package/dist/widgets/StackedMeter.js +2 -2
  121. package/dist/widgets/StagePeriodEditor.d.ts +1 -1
  122. package/dist/widgets/StagePeriodEditor.js +6 -5
  123. package/dist/widgets/Strip.d.ts +1 -1
  124. package/dist/widgets/Strip.js +2 -2
  125. package/dist/widgets/SummaryTable.d.ts +1 -1
  126. package/dist/widgets/SummaryTable.js +2 -2
  127. package/dist/widgets/TagInput.d.ts +1 -1
  128. package/dist/widgets/TagInput.js +3 -3
  129. package/dist/widgets/TagMultiSelect.d.ts +1 -1
  130. package/dist/widgets/TagMultiSelect.js +5 -4
  131. package/dist/widgets/Timeline.d.ts +1 -1
  132. package/dist/widgets/Timeline.js +4 -4
  133. package/dist/widgets/TreePicker.d.ts +1 -1
  134. package/dist/widgets/TreePicker.js +8 -7
  135. package/dist/widgets/TreeView.d.ts +17 -3
  136. package/dist/widgets/TreeView.js +7 -6
  137. package/dist/widgets/index.d.ts +3 -3
  138. package/dist/widgets/index.js +84 -83
  139. package/package.json +1 -1
  140. package/dist/chunk-LFEJLOFN.js +0 -352
  141. package/dist/chunk-MMIGOPO5.js +0 -111
  142. package/dist/chunk-TFGNKFL2.js +0 -39
  143. package/dist/chunk-XQPTSEJC.js +0 -135
@@ -1,10 +1,10 @@
1
1
  import { parseJobPositionRow } from './chunk-XRHR452N.js';
2
- import { usePanZoomCanvas } from './chunk-MMIGOPO5.js';
3
- import { ImageLightbox } from './chunk-VY7MVBSE.js';
4
- import { useSduiAdapter, hostFetchOf, defaultAdapter } from './chunk-KO6OEY3G.js';
5
- import { warnOnce, Badge, Button, IconButton, Icon } from './chunk-RNOUXUBO.js';
6
- import { boxed } from './chunk-5WW4MBRO.js';
7
- import { useState, useMemo, useRef, useCallback, useEffect } from 'react';
2
+ import { usePanZoomCanvas, MIN_ZOOM } from './chunk-CSZCWBOE.js';
3
+ import { ImageLightbox } from './chunk-3PT5OBOU.js';
4
+ import { useSduiAdapter, hostFetchOf, defaultAdapter } from './chunk-JHFA5RDN.js';
5
+ import { warnOnce, Badge, Button, IconButton, Icon } from './chunk-YYAGE733.js';
6
+ import { boxed } from './chunk-3JTBOABA.js';
7
+ import { useState, useMemo, useRef, useCallback, useEffect, useLayoutEffect } from 'react';
8
8
  import { jsx, jsxs, Fragment } from 'react/jsx-runtime';
9
9
 
10
10
  var PAGE_SIZE = 500;
@@ -42,6 +42,25 @@ var LEADER_HEIGHT = 62;
42
42
  var TOP_GAP = 58;
43
43
  var ROOT_ROW_GAP = 70;
44
44
  var DEFAULT_VIEW = { scale: 0.82, x: 48, y: 48 };
45
+ var FIT_PAD = 16;
46
+ function fitCanvasView(viewportWidth, viewportHeight, layoutWidth, layoutHeight) {
47
+ if (!(viewportWidth > 0) || !(viewportHeight > 0) || !(layoutWidth > 0) || !(layoutHeight > 0)) {
48
+ return DEFAULT_VIEW;
49
+ }
50
+ const raw = Math.min(
51
+ (viewportWidth - FIT_PAD * 2) / layoutWidth,
52
+ (viewportHeight - FIT_PAD * 2) / layoutHeight,
53
+ 1
54
+ );
55
+ const scale = Math.max(MIN_ZOOM, raw);
56
+ const width = layoutWidth * scale;
57
+ const height = layoutHeight * scale;
58
+ return {
59
+ scale,
60
+ x: (viewportWidth - width) / 2,
61
+ y: height <= viewportHeight - FIT_PAD * 2 ? (viewportHeight - height) / 2 : FIT_PAD
62
+ };
63
+ }
45
64
  var DUTY_ORDER = [
46
65
  "\uD68C\uC7A5",
47
66
  "\uBD80\uD68C\uC7A5",
@@ -108,6 +127,14 @@ var OCB_CSS = `
108
127
  .erp-ocb-member:hover { border-color: var(--wp-border-brand); background: var(--wp-surface-hover); }
109
128
  .erp-ocb-group { transition: opacity .15s ease; }
110
129
  .erp-ocb-group:hover { opacity: .9; }
130
+ .erp-ocb-viewport { position: relative; height: var(--erp-ocb-h, 72vh); min-height: 620px; overflow: hidden; border-top: var(--wp-border-w) solid var(--wp-border-default); background: var(--wp-surface-page); user-select: none; cursor: grab; touch-action: pan-y; }
131
+ .erp-ocb-viewport--dragging { cursor: grabbing; }
132
+ .erp-ocb-viewport.erp-ocb-viewport--pseudo-fs { position: fixed; inset: 0; z-index: var(--wp-z-dialog); height: 100dvh; min-height: 0; border-top: 0; }
133
+ /* \uC804\uCCB4\uD654\uBA74(\uBE0C\uB77C\uC6B0\uC800\xB7\uB300\uCCB4)\uC5D0\uC11C\uB294 \uC591\uBCF4\uD560 \uD398\uC774\uC9C0\uAC00 \uC5C6\uB2E4 \u2014 \uD55C \uC190\uAC00\uB77D\uB3C4 \uC5B4\uB290 \uBC29\uD5A5\uC774\uB4E0 \uCE94\uBC84\uC2A4\uAC00 \uAC16\uB294\uB2E4. */
134
+ .erp-ocb-viewport.erp-ocb-viewport--pseudo-fs, .erp-ocb-viewport:fullscreen { touch-action: none; }
135
+ @media screen and (max-width: 767.98px) {
136
+ .erp-ocb-viewport { min-height: 320px; height: min(var(--erp-ocb-h, 72vh), 68dvh); }
137
+ }
111
138
  `;
112
139
  async function fetchAllPages(api, endpoint, pick) {
113
140
  const all = [];
@@ -915,6 +942,8 @@ function OrganizationCanvas({
915
942
  setView,
916
943
  dragging,
917
944
  isFullscreen,
945
+ pseudoFullscreen,
946
+ interactedRef,
918
947
  viewportCenter,
919
948
  zoomAt,
920
949
  toggleFullscreen,
@@ -924,118 +953,180 @@ function OrganizationCanvas({
924
953
  () => buildCanvasLayout(model, employees, leadership),
925
954
  [model, employees, leadership]
926
955
  );
956
+ const fitView = useCallback(() => {
957
+ const el = viewportRef.current;
958
+ if (!el) return;
959
+ interactedRef.current = false;
960
+ setView(fitCanvasView(el.clientWidth, el.clientHeight, layout.width, layout.height));
961
+ }, [layout.width, layout.height, setView, viewportRef, interactedRef]);
962
+ useLayoutEffect(() => {
963
+ fitView();
964
+ }, [fitView]);
927
965
  useEffect(() => {
928
- setView(DEFAULT_VIEW);
929
- }, [layout.width, layout.height, setView]);
930
- const zoomStep = (delta) => zoomAt(view.scale + delta, viewportCenter());
931
- return /* @__PURE__ */ jsxs(
932
- "div",
933
- {
934
- ref: viewportRef,
935
- style: {
936
- position: "relative",
937
- height,
938
- minHeight: 620,
939
- overflow: "hidden",
940
- borderTop: "var(--wp-border-w) solid var(--wp-border-default)",
941
- background: "var(--wp-surface-page)",
942
- userSelect: "none",
943
- cursor: dragging ? "grabbing" : "grab",
944
- touchAction: "none"
945
- },
946
- ...pointerHandlers,
947
- children: [
948
- /* @__PURE__ */ jsxs(
949
- "div",
950
- {
951
- "data-org-card": true,
952
- style: {
953
- position: "absolute",
954
- right: 12,
955
- top: 12,
956
- zIndex: 30,
957
- display: "flex",
958
- alignItems: "center",
959
- gap: 4,
960
- borderRadius: "var(--wp-radius-md)",
961
- border: "var(--wp-border-w) solid var(--wp-border-default)",
962
- background: "var(--wp-surface-card)",
963
- padding: 4,
964
- boxShadow: "var(--wp-shadow-sm)"
965
- },
966
- children: [
967
- /* @__PURE__ */ jsx(IconButton, { icon: "minus", label: "\uCD95\uC18C", size: "sm", onClick: () => zoomStep(-0.1) }),
968
- /* @__PURE__ */ jsxs("div", { style: { width: 48, textAlign: "center", fontSize: 12, fontWeight: 500 }, children: [
969
- Math.round(view.scale * 100),
970
- "%"
971
- ] }),
972
- /* @__PURE__ */ jsx(IconButton, { icon: "plus", label: "\uD655\uB300", size: "sm", onClick: () => zoomStep(0.1) }),
973
- /* @__PURE__ */ jsx(
974
- IconButton,
975
- {
976
- icon: isFullscreen ? "minimize" : "maximize",
977
- label: isFullscreen ? "\uC804\uCCB4\uD654\uBA74 \uD574\uC81C" : "\uC804\uCCB4\uD654\uBA74",
978
- size: "sm",
979
- onClick: () => void toggleFullscreen()
980
- }
981
- )
982
- ]
983
- }
984
- ),
985
- /* @__PURE__ */ jsxs(
986
- "div",
987
- {
988
- style: {
989
- position: "absolute",
990
- left: 0,
991
- top: 0,
992
- width: layout.width,
993
- height: layout.height,
994
- transform: `translate(${view.x}px, ${view.y}px) scale(${view.scale})`,
995
- transformOrigin: "0 0"
996
- },
997
- children: [
998
- /* @__PURE__ */ jsx(
999
- "svg",
1000
- {
1001
- style: { position: "absolute", left: 0, top: 0, pointerEvents: "none" },
1002
- width: layout.width,
1003
- height: layout.height,
1004
- children: layout.connectors.map((connector, index) => /* @__PURE__ */ jsx(
1005
- "path",
1006
- {
1007
- d: connectorPath(connector),
1008
- fill: "none",
1009
- stroke: "var(--wp-border-default)",
1010
- strokeWidth: 2
1011
- },
1012
- index
1013
- ))
1014
- }
1015
- ),
1016
- layout.groups.map((item) => /* @__PURE__ */ jsx(
1017
- CanvasGroupNode,
1018
- {
1019
- item,
1020
- selected: selectedGroupId === item.group.id,
1021
- onSelect
1022
- },
1023
- item.group.id
1024
- )),
1025
- layout.employees.map((item) => /* @__PURE__ */ jsx(
1026
- CanvasEmployeeNode,
1027
- {
1028
- item,
1029
- onOpenCard
1030
- },
1031
- `${item.featured ? "leader" : "employee"}-${item.employee.id}`
1032
- ))
1033
- ]
1034
- }
1035
- )
1036
- ]
966
+ const el = viewportRef.current;
967
+ if (!el || typeof ResizeObserver === "undefined") return;
968
+ let last = `${el.clientWidth}x${el.clientHeight}`;
969
+ const observer = new ResizeObserver(() => {
970
+ const size = `${el.clientWidth}x${el.clientHeight}`;
971
+ if (size === last) return;
972
+ last = size;
973
+ if (!interactedRef.current) fitView();
974
+ });
975
+ observer.observe(el);
976
+ return () => observer.disconnect();
977
+ }, [fitView, viewportRef, interactedRef]);
978
+ const savedScrollRef = useRef([]);
979
+ const rememberScroll = () => {
980
+ const saved = [];
981
+ let node = viewportRef.current?.parentElement ?? null;
982
+ while (node) {
983
+ if (node.scrollTop > 0) saved.push([node, node.scrollTop]);
984
+ node = node.parentElement;
1037
985
  }
1038
- );
986
+ if (typeof window !== "undefined" && window.scrollY > 0) {
987
+ saved.push([document.scrollingElement ?? document.documentElement, window.scrollY]);
988
+ }
989
+ savedScrollRef.current = saved;
990
+ };
991
+ const fullscreenSeen = useRef(isFullscreen);
992
+ useEffect(() => {
993
+ if (fullscreenSeen.current === isFullscreen) return;
994
+ fullscreenSeen.current = isFullscreen;
995
+ const restore = () => {
996
+ for (const [el, top] of savedScrollRef.current) el.scrollTop = top;
997
+ };
998
+ const frame = window.requestAnimationFrame(() => {
999
+ fitView();
1000
+ if (!isFullscreen) restore();
1001
+ });
1002
+ const timer = isFullscreen ? 0 : window.setTimeout(() => {
1003
+ restore();
1004
+ savedScrollRef.current = [];
1005
+ }, 200);
1006
+ return () => {
1007
+ window.cancelAnimationFrame(frame);
1008
+ if (timer) window.clearTimeout(timer);
1009
+ };
1010
+ }, [isFullscreen, fitView]);
1011
+ const zoomStep = (delta) => zoomAt(view.scale + delta, viewportCenter());
1012
+ const flowHeightRef = useRef(0);
1013
+ const viewportClass = [
1014
+ "erp-ocb-viewport",
1015
+ dragging ? "erp-ocb-viewport--dragging" : "",
1016
+ pseudoFullscreen ? "erp-ocb-viewport--pseudo-fs" : ""
1017
+ ].filter(Boolean).join(" ");
1018
+ const viewportStyle = {
1019
+ "--erp-ocb-h": typeof height === "number" ? `${height}px` : height
1020
+ };
1021
+ return /* @__PURE__ */ jsxs(Fragment, { children: [
1022
+ pseudoFullscreen ? /* @__PURE__ */ jsx("div", { "aria-hidden": true, className: "erp-ocb-placeholder", style: { height: flowHeightRef.current } }) : null,
1023
+ /* @__PURE__ */ jsxs(
1024
+ "div",
1025
+ {
1026
+ ref: viewportRef,
1027
+ className: viewportClass,
1028
+ style: viewportStyle,
1029
+ ...pointerHandlers,
1030
+ children: [
1031
+ /* @__PURE__ */ jsxs(
1032
+ "div",
1033
+ {
1034
+ "data-org-card": true,
1035
+ style: {
1036
+ position: "absolute",
1037
+ right: 12,
1038
+ top: 12,
1039
+ zIndex: 30,
1040
+ display: "flex",
1041
+ alignItems: "center",
1042
+ gap: 4,
1043
+ borderRadius: "var(--wp-radius-md)",
1044
+ border: "var(--wp-border-w) solid var(--wp-border-default)",
1045
+ background: "var(--wp-surface-card)",
1046
+ padding: 4,
1047
+ boxShadow: "var(--wp-shadow-sm)"
1048
+ },
1049
+ children: [
1050
+ /* @__PURE__ */ jsx(IconButton, { icon: "minus", label: "\uCD95\uC18C", size: "sm", onClick: () => zoomStep(-0.1) }),
1051
+ /* @__PURE__ */ jsxs("div", { style: { width: 48, textAlign: "center", fontSize: 12, fontWeight: 500 }, children: [
1052
+ Math.round(view.scale * 100),
1053
+ "%"
1054
+ ] }),
1055
+ /* @__PURE__ */ jsx(IconButton, { icon: "plus", label: "\uD655\uB300", size: "sm", onClick: () => zoomStep(0.1) }),
1056
+ /* @__PURE__ */ jsx(IconButton, { icon: "locate-fixed", label: "\uD654\uBA74\uC5D0 \uB9DE\uCDA4", size: "sm", onClick: fitView }),
1057
+ /* @__PURE__ */ jsx(
1058
+ IconButton,
1059
+ {
1060
+ icon: isFullscreen ? "minimize" : "maximize",
1061
+ label: isFullscreen ? "\uC804\uCCB4\uD654\uBA74 \uD574\uC81C" : "\uC804\uCCB4\uD654\uBA74",
1062
+ size: "sm",
1063
+ onClick: () => {
1064
+ if (!isFullscreen && viewportRef.current) {
1065
+ flowHeightRef.current = viewportRef.current.offsetHeight;
1066
+ rememberScroll();
1067
+ }
1068
+ void toggleFullscreen();
1069
+ }
1070
+ }
1071
+ )
1072
+ ]
1073
+ }
1074
+ ),
1075
+ /* @__PURE__ */ jsxs(
1076
+ "div",
1077
+ {
1078
+ style: {
1079
+ position: "absolute",
1080
+ left: 0,
1081
+ top: 0,
1082
+ width: layout.width,
1083
+ height: layout.height,
1084
+ transform: `translate(${view.x}px, ${view.y}px) scale(${view.scale})`,
1085
+ transformOrigin: "0 0"
1086
+ },
1087
+ children: [
1088
+ /* @__PURE__ */ jsx(
1089
+ "svg",
1090
+ {
1091
+ style: { position: "absolute", left: 0, top: 0, pointerEvents: "none" },
1092
+ width: layout.width,
1093
+ height: layout.height,
1094
+ children: layout.connectors.map((connector, index) => /* @__PURE__ */ jsx(
1095
+ "path",
1096
+ {
1097
+ d: connectorPath(connector),
1098
+ fill: "none",
1099
+ stroke: "var(--wp-border-default)",
1100
+ strokeWidth: 2
1101
+ },
1102
+ index
1103
+ ))
1104
+ }
1105
+ ),
1106
+ layout.groups.map((item) => /* @__PURE__ */ jsx(
1107
+ CanvasGroupNode,
1108
+ {
1109
+ item,
1110
+ selected: selectedGroupId === item.group.id,
1111
+ onSelect
1112
+ },
1113
+ item.group.id
1114
+ )),
1115
+ layout.employees.map((item) => /* @__PURE__ */ jsx(
1116
+ CanvasEmployeeNode,
1117
+ {
1118
+ item,
1119
+ onOpenCard
1120
+ },
1121
+ `${item.featured ? "leader" : "employee"}-${item.employee.id}`
1122
+ ))
1123
+ ]
1124
+ }
1125
+ )
1126
+ ]
1127
+ }
1128
+ )
1129
+ ] });
1039
1130
  }
1040
1131
  function OrgChartBoardImpl({
1041
1132
  onMemberClick,
@@ -1237,4 +1328,4 @@ function OrgChartBoardImpl({
1237
1328
  }
1238
1329
  var OrgChartBoard = boxed(OrgChartBoardImpl, "OrgChartBoard");
1239
1330
 
1240
- export { OrgChartBoard, buildModel, compareMembers, isUnassignedGroup, leadershipEmployees, orgVocabOf, pickEmployees, pickGroups, pickPositions };
1331
+ export { OrgChartBoard, buildModel, compareMembers, fitCanvasView, isUnassignedGroup, leadershipEmployees, orgVocabOf, pickEmployees, pickGroups, pickPositions };
@@ -1,4 +1,4 @@
1
- import { boxed } from './chunk-5WW4MBRO.js';
1
+ import { boxed } from './chunk-3JTBOABA.js';
2
2
  import { jsxs, jsx } from 'react/jsx-runtime';
3
3
 
4
4
  var SUMMARY_TABLE_CSS = `
@@ -1,4 +1,4 @@
1
- import { boxed, containerLayoutStyle } from './chunk-5WW4MBRO.js';
1
+ import { boxed, containerLayoutStyle } from './chunk-3JTBOABA.js';
2
2
  import React from 'react';
3
3
  import { jsxs, jsx } from 'react/jsx-runtime';
4
4
 
@@ -1,6 +1,6 @@
1
- import { useSduiAssetResolver } from './chunk-KO6OEY3G.js';
2
- import { Spinner, Icon } from './chunk-RNOUXUBO.js';
3
- import { boxed } from './chunk-5WW4MBRO.js';
1
+ import { useSduiAssetResolver } from './chunk-JHFA5RDN.js';
2
+ import { Spinner, Icon } from './chunk-YYAGE733.js';
3
+ import { boxed } from './chunk-3JTBOABA.js';
4
4
  import { useState, useEffect } from 'react';
5
5
  import { jsxs, jsx } from 'react/jsx-runtime';
6
6
 
@@ -1,6 +1,6 @@
1
- import { Disclosure } from './chunk-2HLXCKK7.js';
2
- import { Icon } from './chunk-RNOUXUBO.js';
3
- import { boxed } from './chunk-5WW4MBRO.js';
1
+ import { Disclosure } from './chunk-OCYJ2ZOV.js';
2
+ import { Icon } from './chunk-YYAGE733.js';
3
+ import { boxed } from './chunk-3JTBOABA.js';
4
4
  import { jsx, jsxs } from 'react/jsx-runtime';
5
5
 
6
6
  var TYPE_META = {