@byeolnaerim/flex-layout 0.0.9 → 0.0.12

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 (132) hide show
  1. package/dist/flex-layout/components/FlexLayout.cjs +1 -110
  2. package/dist/flex-layout/components/FlexLayout.d.ts +2 -1
  3. package/dist/flex-layout/components/FlexLayout.js +1 -85
  4. package/dist/flex-layout/components/FlexLayoutContainer.cjs +1 -262
  5. package/dist/flex-layout/components/FlexLayoutContainer.d.ts +1 -1
  6. package/dist/flex-layout/components/FlexLayoutContainer.js +1 -232
  7. package/dist/flex-layout/components/FlexLayoutDynamicHeight.cjs +1 -0
  8. package/dist/flex-layout/components/FlexLayoutDynamicHeight.d.ts +6 -0
  9. package/dist/flex-layout/components/FlexLayoutDynamicHeight.js +1 -0
  10. package/dist/flex-layout/components/FlexLayoutIFramePane.cjs +1 -68
  11. package/dist/flex-layout/components/FlexLayoutIFramePane.js +1 -44
  12. package/dist/flex-layout/components/FlexLayoutResizePanel.cjs +1 -246
  13. package/dist/flex-layout/components/FlexLayoutResizePanel.js +1 -216
  14. package/dist/flex-layout/components/FlexLayoutSplitScreen.cjs +1 -1252
  15. package/dist/flex-layout/components/FlexLayoutSplitScreen.d.ts +14 -1
  16. package/dist/flex-layout/components/FlexLayoutSplitScreen.js +1 -1236
  17. package/dist/flex-layout/components/FlexLayoutSplitScreenDragBox.cjs +1 -532
  18. package/dist/flex-layout/components/FlexLayoutSplitScreenDragBox.js +1 -509
  19. package/dist/flex-layout/components/FlexLayoutSplitScreenDragBoxContainer.cjs +1 -55
  20. package/dist/flex-layout/components/FlexLayoutSplitScreenDragBoxContainer.js +1 -25
  21. package/dist/flex-layout/components/FlexLayoutSplitScreenDragBoxItem.cjs +1 -63
  22. package/dist/flex-layout/components/FlexLayoutSplitScreenDragBoxItem.js +1 -33
  23. package/dist/flex-layout/components/FlexLayoutSplitScreenDragBoxTitleMore.cjs +1 -53
  24. package/dist/flex-layout/components/FlexLayoutSplitScreenDragBoxTitleMore.js +1 -23
  25. package/dist/flex-layout/components/FlexLayoutSplitScreenScrollBox.cjs +1 -133
  26. package/dist/flex-layout/components/FlexLayoutSplitScreenScrollBox.js +1 -107
  27. package/dist/flex-layout/components/FlexLayoutStickyBox.cjs +1 -245
  28. package/dist/flex-layout/components/FlexLayoutStickyBox.js +1 -229
  29. package/dist/flex-layout/components/index.cjs +1 -57
  30. package/dist/flex-layout/components/index.d.ts +1 -0
  31. package/dist/flex-layout/components/index.js +1 -17
  32. package/dist/flex-layout/hooks/index.cjs +1 -25
  33. package/dist/flex-layout/hooks/index.js +1 -3
  34. package/dist/flex-layout/hooks/useDrag.cjs +1 -289
  35. package/dist/flex-layout/hooks/useDrag.d.ts +15 -0
  36. package/dist/flex-layout/hooks/useDrag.js +1 -258
  37. package/dist/flex-layout/hooks/useFlexLayoutSplitScreen.cjs +1 -139
  38. package/dist/flex-layout/hooks/useFlexLayoutSplitScreen.js +1 -118
  39. package/dist/flex-layout/hooks/useListPaging.cjs +1 -212
  40. package/dist/flex-layout/hooks/useListPaging.js +1 -191
  41. package/dist/flex-layout/hooks/useSizes.cjs +1 -126
  42. package/dist/flex-layout/hooks/useSizes.d.ts +6 -3
  43. package/dist/flex-layout/hooks/useSizes.js +1 -101
  44. package/dist/flex-layout/index.cjs +1 -31
  45. package/dist/flex-layout/index.js +1 -6
  46. package/dist/flex-layout/providers/FlexLayoutContext.cjs +1 -49
  47. package/dist/flex-layout/providers/FlexLayoutContext.js +1 -24
  48. package/dist/flex-layout/providers/FlexLayoutHooks.cjs +1 -276
  49. package/dist/flex-layout/providers/FlexLayoutHooks.d.ts +5 -1
  50. package/dist/flex-layout/providers/FlexLayoutHooks.js +1 -263
  51. package/dist/flex-layout/providers/index.cjs +1 -23
  52. package/dist/flex-layout/providers/index.js +1 -2
  53. package/dist/flex-layout/store/FlexLayoutContainerStore.cjs +1 -257
  54. package/dist/flex-layout/store/FlexLayoutContainerStore.js +1 -206
  55. package/dist/flex-layout/store/index.cjs +1 -23
  56. package/dist/flex-layout/store/index.js +1 -2
  57. package/dist/flex-layout/styles/FlexLayout.module.css +499 -416
  58. package/dist/flex-layout/styles/sentinelStyle.module.css +11 -0
  59. package/dist/flex-layout/types/FlexDirectionTypes.cjs +1 -17
  60. package/dist/flex-layout/types/FlexDirectionTypes.js +0 -1
  61. package/dist/flex-layout/types/FlexLayoutTypes.cjs +1 -17
  62. package/dist/flex-layout/types/FlexLayoutTypes.d.ts +38 -2
  63. package/dist/flex-layout/types/FlexLayoutTypes.js +0 -1
  64. package/dist/flex-layout/utils/FlexLayoutUtils.cjs +1 -245
  65. package/dist/flex-layout/utils/FlexLayoutUtils.js +1 -211
  66. package/dist/flex-layout/utils/index.cjs +1 -23
  67. package/dist/flex-layout/utils/index.js +1 -2
  68. package/dist/index.cjs +1 -23
  69. package/dist/index.js +1 -2
  70. package/dist/types/css.d.cjs +0 -1
  71. package/dist/types/css.d.js +0 -1
  72. package/package.json +116 -113
  73. package/dist/flex-layout/components/FlexLayout.cjs.map +0 -1
  74. package/dist/flex-layout/components/FlexLayout.js.map +0 -1
  75. package/dist/flex-layout/components/FlexLayoutContainer.cjs.map +0 -1
  76. package/dist/flex-layout/components/FlexLayoutContainer.js.map +0 -1
  77. package/dist/flex-layout/components/FlexLayoutIFramePane.cjs.map +0 -1
  78. package/dist/flex-layout/components/FlexLayoutIFramePane.js.map +0 -1
  79. package/dist/flex-layout/components/FlexLayoutResizePanel.cjs.map +0 -1
  80. package/dist/flex-layout/components/FlexLayoutResizePanel.js.map +0 -1
  81. package/dist/flex-layout/components/FlexLayoutSplitScreen.cjs.map +0 -1
  82. package/dist/flex-layout/components/FlexLayoutSplitScreen.js.map +0 -1
  83. package/dist/flex-layout/components/FlexLayoutSplitScreenDragBox.cjs.map +0 -1
  84. package/dist/flex-layout/components/FlexLayoutSplitScreenDragBox.js.map +0 -1
  85. package/dist/flex-layout/components/FlexLayoutSplitScreenDragBoxContainer.cjs.map +0 -1
  86. package/dist/flex-layout/components/FlexLayoutSplitScreenDragBoxContainer.js.map +0 -1
  87. package/dist/flex-layout/components/FlexLayoutSplitScreenDragBoxItem.cjs.map +0 -1
  88. package/dist/flex-layout/components/FlexLayoutSplitScreenDragBoxItem.js.map +0 -1
  89. package/dist/flex-layout/components/FlexLayoutSplitScreenDragBoxTitleMore.cjs.map +0 -1
  90. package/dist/flex-layout/components/FlexLayoutSplitScreenDragBoxTitleMore.js.map +0 -1
  91. package/dist/flex-layout/components/FlexLayoutSplitScreenScrollBox.cjs.map +0 -1
  92. package/dist/flex-layout/components/FlexLayoutSplitScreenScrollBox.js.map +0 -1
  93. package/dist/flex-layout/components/FlexLayoutStickyBox.cjs.map +0 -1
  94. package/dist/flex-layout/components/FlexLayoutStickyBox.js.map +0 -1
  95. package/dist/flex-layout/components/index.cjs.map +0 -1
  96. package/dist/flex-layout/components/index.js.map +0 -1
  97. package/dist/flex-layout/hooks/index.cjs.map +0 -1
  98. package/dist/flex-layout/hooks/index.js.map +0 -1
  99. package/dist/flex-layout/hooks/useDrag.cjs.map +0 -1
  100. package/dist/flex-layout/hooks/useDrag.js.map +0 -1
  101. package/dist/flex-layout/hooks/useFlexLayoutSplitScreen.cjs.map +0 -1
  102. package/dist/flex-layout/hooks/useFlexLayoutSplitScreen.js.map +0 -1
  103. package/dist/flex-layout/hooks/useListPaging.cjs.map +0 -1
  104. package/dist/flex-layout/hooks/useListPaging.js.map +0 -1
  105. package/dist/flex-layout/hooks/useSizes.cjs.map +0 -1
  106. package/dist/flex-layout/hooks/useSizes.js.map +0 -1
  107. package/dist/flex-layout/index.cjs.map +0 -1
  108. package/dist/flex-layout/index.js.map +0 -1
  109. package/dist/flex-layout/providers/FlexLayoutContext.cjs.map +0 -1
  110. package/dist/flex-layout/providers/FlexLayoutContext.js.map +0 -1
  111. package/dist/flex-layout/providers/FlexLayoutHooks.cjs.map +0 -1
  112. package/dist/flex-layout/providers/FlexLayoutHooks.js.map +0 -1
  113. package/dist/flex-layout/providers/index.cjs.map +0 -1
  114. package/dist/flex-layout/providers/index.js.map +0 -1
  115. package/dist/flex-layout/store/FlexLayoutContainerStore.cjs.map +0 -1
  116. package/dist/flex-layout/store/FlexLayoutContainerStore.js.map +0 -1
  117. package/dist/flex-layout/store/index.cjs.map +0 -1
  118. package/dist/flex-layout/store/index.js.map +0 -1
  119. package/dist/flex-layout/types/FlexDirectionTypes.cjs.map +0 -1
  120. package/dist/flex-layout/types/FlexDirectionTypes.js.map +0 -1
  121. package/dist/flex-layout/types/FlexLayoutTypes.cjs.map +0 -1
  122. package/dist/flex-layout/types/FlexLayoutTypes.js.map +0 -1
  123. package/dist/flex-layout/utils/FlexLayoutUtils.cjs.map +0 -1
  124. package/dist/flex-layout/utils/FlexLayoutUtils.js.map +0 -1
  125. package/dist/flex-layout/utils/index.cjs.map +0 -1
  126. package/dist/flex-layout/utils/index.js.map +0 -1
  127. package/dist/index.cjs.map +0 -1
  128. package/dist/index.js.map +0 -1
  129. package/dist/metafile-cjs.json +0 -1
  130. package/dist/metafile-esm.json +0 -1
  131. package/dist/types/css.d.cjs.map +0 -1
  132. package/dist/types/css.d.js.map +0 -1
@@ -1 +0,0 @@
1
- {"version":3,"sources":["../../../src/flex-layout/components/FlexLayoutSplitScreenDragBox.tsx"],"sourcesContent":["\"use client\";\r\nimport {\r\n\tCSSProperties,\r\n\tHTMLAttributes,\r\n\tMouseEvent,\r\n\tReactElement,\r\n\tReactNode,\r\n\tRefObject,\r\n\tTouchEvent,\r\n\tuseEffect,\r\n\tuseRef,\r\n\tuseState,\r\n} from \"react\";\r\nimport {\r\n\tdragStateSubject,\r\n\tDragStateType,\r\n\tuseDragEvents,\r\n} from \"../hooks/useDrag\";\r\n\r\nimport styles from \"../styles/FlexLayout.module.css\";\r\nimport { isDocumentOut } from \"../utils/FlexLayoutUtils\";\r\nimport { FlexLayoutIFramePane } from \"./FlexLayoutIFramePane\";\r\n\r\nconst MAX_STEP = 18;\r\n\r\nfunction shouldAllowViewportScroll(x: number, y: number) {\r\n\tconst w = window.innerWidth;\r\n\tconst h = window.innerHeight;\r\n\tconst marginX = w * 0.15;\r\n\tconst marginY = h * 0.15;\r\n\treturn (\r\n\t\tx < marginX || // 왼쪽 15 %\r\n\t\tx > w - marginX || // 오른쪽 15 %\r\n\t\ty < marginY || // 상단 15 %\r\n\t\ty > h - marginY // 하단 15 %\r\n\t);\r\n}\r\n\r\nfunction edgeVelocity(x: number, y: number) {\r\n\tconst w = window.innerWidth,\r\n\t\th = window.innerHeight;\r\n\tconst mx = w * 0.15,\r\n\t\tmy = h * 0.15;\r\n\r\n\t/* X 축 */\r\n\tlet vx = 0;\r\n\tif (x < mx)\r\n\t\t// ← 왼쪽\r\n\t\tvx = -((mx - x) / mx) * MAX_STEP;\r\n\telse if (x > w - mx)\r\n\t\t// → 오른쪽\r\n\t\tvx = ((x - (w - mx)) / mx) * MAX_STEP;\r\n\r\n\t/* Y 축 */\r\n\tlet vy = 0;\r\n\tif (y < my)\r\n\t\t// ↑ 상단\r\n\t\tvy = -((my - y) / my) * MAX_STEP;\r\n\telse if (y > h - my)\r\n\t\t// ↓ 하단\r\n\t\tvy = ((y - (h - my)) / my) * MAX_STEP;\r\n\r\n\treturn { vx, vy };\r\n}\r\n\r\nfunction calcVelocity(dx: number, dy: number, x: number, y: number) {\r\n\tconst w = window.innerWidth,\r\n\t\th = window.innerHeight;\r\n\tconst marginX = w * 0.15,\r\n\t\tmarginY = h * 0.15;\r\n\r\n\t/* 거리가 0(가장자리)~margin 사이면 1~4 배 가중치 */\r\n\tconst multX =\r\n\t\tx < marginX\r\n\t\t\t? 1 + ((marginX - x) / marginX) * 3\r\n\t\t\t: x > w - marginX\r\n\t\t\t\t? 1 + ((x - (w - marginX)) / marginX) * 3\r\n\t\t\t\t: 1;\r\n\r\n\tconst multY =\r\n\t\ty < marginY\r\n\t\t\t? 1 + ((marginY - y) / marginY) * 3\r\n\t\t\t: y > h - marginY\r\n\t\t\t\t? 1 + ((y - (h - marginY)) / marginY) * 3\r\n\t\t\t\t: 1;\r\n\r\n\t/* ←→·↑↓ **반대 방향**으로 스크롤 */\r\n\treturn { vx: -dx * multX, vy: -dy * multY };\r\n}\r\n\r\nfunction createScreenKey() {\r\n\tconst c = globalThis.crypto as Crypto | undefined;\r\n\r\n\tif (c?.randomUUID) return c.randomUUID();\r\n\r\n\tif (c?.getRandomValues) {\r\n\t\treturn Array.from(c.getRandomValues(new Uint32Array(16)), (e) =>\r\n\t\t\te.toString(32).padStart(2, \"0\"),\r\n\t\t).join(\"\");\r\n\t}\r\n\r\n\t// 폴백\r\n\treturn `${Date.now().toString(32)}-${Math.random().toString(32).slice(2)}`;\r\n}\r\n\r\nfunction getFallbackElement(targetComponent?: ReactElement, url?: string) {\r\n\tif (targetComponent) return targetComponent;\r\n\tif (url) return <FlexLayoutIFramePane url={url} />;\r\n\treturn undefined;\r\n}\r\n\r\nfunction titleFromUrl(url?: string) {\r\n\tif (!url) return undefined;\r\n\ttry {\r\n\t\tconst u = new URL(url);\r\n\t\treturn u.hostname;\r\n\t} catch {\r\n\t\treturn url;\r\n\t}\r\n}\r\n\r\nexport interface FlexLayoutSplitScreenDragBoxProps<\r\n\tE extends HTMLElement = HTMLElement,\r\n> extends Omit<HTMLAttributes<HTMLDivElement>, \"children\"> {\r\n\tonMouseDown?: (event: MouseEvent<HTMLDivElement>) => void;\r\n\tonTouchStart?: (event: TouchEvent<HTMLDivElement>) => void;\r\n\tdropEndCallback?: ({\r\n\t\tx,\r\n\t\ty,\r\n\t\tcontainerName,\r\n\t}: {\r\n\t\tx: number;\r\n\t\ty: number;\r\n\t\tcontainerName: string;\r\n\t}) => void;\r\n\tstyle?: CSSProperties;\r\n\tnavigationTitle?: string;\r\n\ttargetComponent?: ReactElement;\r\n\tdropDocumentOutsideOption?: DropDocumentOutsideOption;\r\n\tchildren: ReactNode;\r\n\tcontainerName: string;\r\n\tscreenKey?: string;\r\n\tisBlockingActiveInput?: boolean;\r\n\tcustomData?: Record<string, string | number | boolean | undefined>;\r\n\tscrollTargetRef?: RefObject<E>;\r\n}\r\n\r\nexport interface DropDocumentOutsideOption {\r\n\topenUrl: string;\r\n\twidthRatio?: number;\r\n\theightRatio?: number;\r\n\tisNewTap?: boolean;\r\n}\r\n\r\nexport default function FlexLayoutSplitScreenDragBox<E extends HTMLElement>({\r\n\tonMouseDown,\r\n\tonTouchStart,\r\n\tdropEndCallback,\r\n\tstyle,\r\n\tnavigationTitle,\r\n\ttargetComponent,\r\n\tcontainerName,\r\n\tchildren,\r\n\tclassName,\r\n\tdropDocumentOutsideOption,\r\n\tscreenKey: _screenKey,\r\n\tisBlockingActiveInput = false,\r\n\tcustomData = {},\r\n\tscrollTargetRef,\r\n\t...props\r\n}: FlexLayoutSplitScreenDragBoxProps) {\r\n\tconst [screenKey, setScreenKey] = useState<string>();\r\n\tuseEffect(() => {\r\n\t\tif (!_screenKey) setScreenKey(createScreenKey());\r\n\t\telse setScreenKey(_screenKey);\r\n\t}, [_screenKey]);\r\n\tconst scrollRAF = useRef<number | null>(null); // 애니메이션 루프 id\r\n\tconst velocity = useRef<{ vx: number; vy: number }>({ vx: 0, vy: 0 });\r\n\tconst ref = useRef<HTMLDivElement>(null);\r\n\tconst clonedNodeRef = useRef<HTMLDivElement | null>(null);\r\n\tconst clonedWidth = useRef<number | null>(null);\r\n\tconst clonedHeight = useRef<number | null>(null);\r\n\tconst hrefUrlRef = useRef<string>(\"\");\r\n\r\n\tconst rafId = useRef<number | null>(null);\r\n\tconst pending = useRef<DragStateType | null>(null);\r\n\r\n\tconst lastPointRef = useRef<{ x: number; y: number }>({ x: 0, y: 0 });\r\n\tconst escCanceledRef = useRef(false);\r\n\r\n\tconst emitDragState = (v: DragStateType) => {\r\n\t\tpending.current = v;\r\n\t\tif (rafId.current != null) return;\r\n\r\n\t\trafId.current = requestAnimationFrame(() => {\r\n\t\t\tif (pending.current) dragStateSubject.next(pending.current);\r\n\t\t\tpending.current = null;\r\n\t\t\trafId.current = null;\r\n\t\t});\r\n\t};\r\n\r\n\tuseEffect(() => {\r\n\t\treturn () => {\r\n\t\t\tif (rafId.current != null) cancelAnimationFrame(rafId.current);\r\n\t\t};\r\n\t}, []);\r\n\r\n\tconst { handleStart, handleMove, handleEnd } = useDragEvents({\r\n\t\tisBlockingActiveInput,\r\n\t});\r\n\r\n\tconst handleMoveWrapper = (event: Event) => {\r\n\t\tlet allowScrollEdge = false;\r\n\t\tlet x = 0;\r\n\t\tlet y = 0;\r\n\r\n\t\tif (event.type === \"touchmove\") {\r\n\t\t\tconst t = (event as globalThis.TouchEvent).touches[0];\r\n\t\t\tx = t.clientX;\r\n\t\t\ty = t.clientY;\r\n\t\t} else {\r\n\t\t\tconst m = event as globalThis.MouseEvent;\r\n\t\t\tx = m.clientX;\r\n\t\t\ty = m.clientY;\r\n\t\t}\r\n\t\tconst { vx, vy } = edgeVelocity(x, y);\r\n\t\tconst inEdge = vx !== 0 || vy !== 0;\r\n\r\n\t\tallowScrollEdge = shouldAllowViewportScroll(x, y);\r\n\t\t/* 중앙 영역이면 스크롤 막음, 가장자리면 허용 */\r\n\t\tif (clonedNodeRef.current?.isConnected && !inEdge) {\r\n\t\t\tevent.preventDefault(); // 화면 고정\r\n\t\t\tif (scrollRAF.current) {\r\n\t\t\t\tcancelAnimationFrame(scrollRAF.current);\r\n\t\t\t\tscrollRAF.current = null;\r\n\t\t\t}\r\n\t\t}\r\n\r\n\t\tif (clonedNodeRef.current?.isConnected && inEdge) {\r\n\t\t\tevent.preventDefault();\r\n\t\t\tvelocity.current = { vx, vy }; // ← X·Y 둘 다 들어갈 수 있음\r\n\r\n\t\t\tif (!scrollRAF.current) {\r\n\t\t\t\tconst step = () => {\r\n\t\t\t\t\tconst target =\r\n\t\t\t\t\t\tscrollTargetRef?.current ??\r\n\t\t\t\t\t\t(document.scrollingElement as HTMLElement | null);\r\n\r\n\t\t\t\t\tif (target?.scrollBy) {\r\n\t\t\t\t\t\ttarget.scrollBy(\r\n\t\t\t\t\t\t\tvelocity.current.vx,\r\n\t\t\t\t\t\t\tvelocity.current.vy,\r\n\t\t\t\t\t\t);\r\n\t\t\t\t\t} else {\r\n\t\t\t\t\t\twindow.scrollBy(\r\n\t\t\t\t\t\t\tvelocity.current.vx,\r\n\t\t\t\t\t\t\tvelocity.current.vy,\r\n\t\t\t\t\t\t);\r\n\t\t\t\t\t}\r\n\t\t\t\t\tif (\r\n\t\t\t\t\t\tvelocity.current.vx === 0 &&\r\n\t\t\t\t\t\tvelocity.current.vy === 0\r\n\t\t\t\t\t) {\r\n\t\t\t\t\t\tscrollRAF.current = null;\r\n\t\t\t\t\t\treturn;\r\n\t\t\t\t\t}\r\n\t\t\t\t\tscrollRAF.current = requestAnimationFrame(step);\r\n\t\t\t\t};\r\n\t\t\t\tscrollRAF.current = requestAnimationFrame(step);\r\n\t\t\t}\r\n\t\t}\r\n\t\tif (event.type !== \"touchmove\") {\r\n\t\t\t/* 마우스 · 펜 → 항상 고정 */\r\n\t\t\tevent.preventDefault();\r\n\t\t}\r\n\t\thandleMove({\r\n\t\t\tevent,\r\n\t\t\tnotDragCallback: ({ x, y }) => {\r\n\t\t\t\tif (clonedNodeRef.current) clonedNodeRef.current.remove();\r\n\t\t\t},\r\n\t\t\tdragStartCallback: ({ x, y }) => {\r\n\t\t\t\tif (!clonedNodeRef.current) return;\r\n\r\n\t\t\t\tnavigator.vibrate(100);\r\n\t\t\t\tclonedNodeRef.current.style.transform = `translate3d(${x - (clonedWidth.current || 0) / 2}px, ${y - (clonedHeight.current || 0) / 2}px, 0)`;\r\n\t\t\t},\r\n\t\t\tmoveingCallback: ({ x, y }) => {\r\n\t\t\t\tlastPointRef.current = { x, y };\r\n\t\t\t\tif (clonedNodeRef.current?.isConnected) {\r\n\t\t\t\t\tclonedNodeRef.current.style.transform = `translate3d(${x - (clonedWidth.current || 0) / 2}px, ${y - (clonedHeight.current || 0) / 2}px, 0)`;\r\n\t\t\t\t\t// clonedNodeRef.current.style.left = `${x - (clonedWidth.current || 0) / 2}px`;\r\n\t\t\t\t\t// clonedNodeRef.current.style.top = `${y - (clonedHeight.current || 0) / 2}px`;\r\n\t\t\t\t}\r\n\r\n\t\t\t\temitDragState({\r\n\t\t\t\t\tisDragging: true,\r\n\t\t\t\t\tisDrop: false,\r\n\t\t\t\t\tnavigationTitle:\r\n\t\t\t\t\t\tnavigationTitle ??\r\n\t\t\t\t\t\ttitleFromUrl(dropDocumentOutsideOption?.openUrl),\r\n\t\t\t\t\tchildren: getFallbackElement(\r\n\t\t\t\t\t\ttargetComponent,\r\n\t\t\t\t\t\tdropDocumentOutsideOption?.openUrl,\r\n\t\t\t\t\t),\r\n\t\t\t\t\tx,\r\n\t\t\t\t\ty,\r\n\t\t\t\t\tcontainerName,\r\n\t\t\t\t\tdropDocumentOutsideOption,\r\n\t\t\t\t\tcustomData,\r\n\t\t\t\t});\r\n\t\t\t},\r\n\t\t});\r\n\t};\r\n\r\n\tconst handleEndWrapper = (event: Event) => {\r\n\t\t// 안전장치로 RAF 취소\r\n\t\tif (scrollRAF.current !== null) {\r\n\t\t\tcancelAnimationFrame(scrollRAF.current);\r\n\t\t\tscrollRAF.current = null;\r\n\t\t}\r\n\t\tvelocity.current = { vx: 0, vy: 0 };\r\n\r\n\t\t// 추가 안전장치 blur나 cancel 이벤트 발생 시 Clone 노드를 강제 정리\r\n\t\tif (\r\n\t\t\tevent.type === \"blur\" ||\r\n\t\t\tevent.type === \"touchcancel\" ||\r\n\t\t\tevent.type === \"pointercancel\"\r\n\t\t) {\r\n\t\t\tif (clonedNodeRef.current) clonedNodeRef.current.remove();\r\n\t\t}\r\n\r\n\t\thandleEnd({\r\n\t\t\tevent,\r\n\t\t\tdragEndCallback: ({ x, y }) => {\r\n\t\t\t\tif (escCanceledRef.current) {\r\n\t\t\t\t\tescCanceledRef.current = false;\r\n\t\t\t\t\tif (clonedNodeRef.current) clonedNodeRef.current.remove();\r\n\r\n\t\t\t\t\temitDragState({\r\n\t\t\t\t\t\tisDragging: false,\r\n\t\t\t\t\t\tisDrop: false,\r\n\t\t\t\t\t\tnavigationTitle:\r\n\t\t\t\t\t\t\tnavigationTitle ??\r\n\t\t\t\t\t\t\ttitleFromUrl(dropDocumentOutsideOption?.openUrl),\r\n\t\t\t\t\t\tchildren: getFallbackElement(\r\n\t\t\t\t\t\t\ttargetComponent,\r\n\t\t\t\t\t\t\tdropDocumentOutsideOption?.openUrl,\r\n\t\t\t\t\t\t),\r\n\t\t\t\t\t\tx,\r\n\t\t\t\t\t\ty,\r\n\t\t\t\t\t\tcontainerName,\r\n\t\t\t\t\t\tdropDocumentOutsideOption,\r\n\t\t\t\t\t\tcustomData,\r\n\t\t\t\t\t});\r\n\t\t\t\t\treturn;\r\n\t\t\t\t}\r\n\r\n\t\t\t\tconst href = hrefUrlRef.current;\r\n\t\t\t\tif (clonedNodeRef.current) clonedNodeRef.current.remove();\r\n\t\t\t\tif (dropDocumentOutsideOption && isDocumentOut({ x, y })) {\r\n\t\t\t\t\tif (\r\n\t\t\t\t\t\tdropDocumentOutsideOption.isNewTap ||\r\n\t\t\t\t\t\t(!dropDocumentOutsideOption.widthRatio &&\r\n\t\t\t\t\t\t\t!dropDocumentOutsideOption.heightRatio)\r\n\t\t\t\t\t) {\r\n\t\t\t\t\t\twindow.open(href, \"_blank\");\r\n\t\t\t\t\t} else {\r\n\t\t\t\t\t\tconst width =\r\n\t\t\t\t\t\t\twindow.innerWidth *\r\n\t\t\t\t\t\t\t(dropDocumentOutsideOption.widthRatio || 1);\r\n\t\t\t\t\t\tconst height =\r\n\t\t\t\t\t\t\twindow.innerHeight *\r\n\t\t\t\t\t\t\t(dropDocumentOutsideOption.heightRatio || 1);\r\n\t\t\t\t\t\twindow.open(\r\n\t\t\t\t\t\t\thref,\r\n\t\t\t\t\t\t\t\"_blank\",\r\n\t\t\t\t\t\t\t`width=${width},height=${height},left=${window.screenLeft - x * -1 - width},top=${window.screenTop + y}`,\r\n\t\t\t\t\t\t);\r\n\t\t\t\t\t}\r\n\t\t\t\t}\r\n\t\t\t\temitDragState({\r\n\t\t\t\t\tisDragging: false,\r\n\t\t\t\t\tisDrop: true,\r\n\t\t\t\t\tnavigationTitle:\r\n\t\t\t\t\t\tnavigationTitle ??\r\n\t\t\t\t\t\ttitleFromUrl(dropDocumentOutsideOption?.openUrl),\r\n\t\t\t\t\tchildren: getFallbackElement(\r\n\t\t\t\t\t\ttargetComponent,\r\n\t\t\t\t\t\tdropDocumentOutsideOption?.openUrl,\r\n\t\t\t\t\t),\r\n\t\t\t\t\tx,\r\n\t\t\t\t\ty,\r\n\t\t\t\t\tcontainerName,\r\n\t\t\t\t\tdropDocumentOutsideOption,\r\n\t\t\t\t\tdropEndCallback,\r\n\t\t\t\t\tscreenKey,\r\n\t\t\t\t\tcustomData,\r\n\t\t\t\t});\r\n\t\t\t},\r\n\t\t});\r\n\t};\r\n\r\n\tuseEffect(() => {\r\n\t\tif (ref.current) {\r\n\t\t\tconst clone = ref.current.cloneNode(true) as HTMLDivElement;\r\n\t\t\tconst originRect = ref.current.getBoundingClientRect();\r\n\t\t\tclone.style.width = originRect.width + \"px\";\r\n\t\t\tclone.style.height = originRect.height + \"px\";\r\n\t\t\tclone.style.opacity = \"0.3\";\r\n\t\t\tclone.style.backdropFilter = \"blur(6px)\";\r\n\t\t\tclonedWidth.current = originRect.width;\r\n\t\t\tclonedHeight.current = originRect.height;\r\n\t\t\tif (dropDocumentOutsideOption?.openUrl) {\r\n\t\t\t\threfUrlRef.current = dropDocumentOutsideOption!.openUrl;\r\n\t\t\t\tconst href = document.createElement(\"span\");\r\n\t\t\t\thref.textContent = hrefUrlRef.current;\r\n\t\t\t\tclone.prepend(href);\r\n\t\t\t}\r\n\r\n\t\t\tconst title = document.createElement(\"span\");\r\n\t\t\ttitle.textContent =\r\n\t\t\t\tnavigationTitle ??\r\n\t\t\t\ttitleFromUrl(dropDocumentOutsideOption?.openUrl) ??\r\n\t\t\t\t\"\";\r\n\t\t\tclone.prepend(title);\r\n\r\n\t\t\tclone.style.position = \"fixed\";\r\n\t\t\tclone.style.left = \"0px\";\r\n\t\t\tclone.style.top = \"0px\";\r\n\t\t\tclone.style.margin = \"0px\";\r\n\t\t\tclone.style.willChange = \"transform\";\r\n\t\t\tclone.style.transform = \"translate3d(-9999px, -9999px, 0)\";\r\n\t\t\tclone.style.pointerEvents = \"none\";\r\n\r\n\t\t\tclonedNodeRef.current = clone;\r\n\t\t\tclonedNodeRef.current.classList.add(\r\n\t\t\t\tstyles[\"flex-split-screen-drag-box-clone\"],\r\n\t\t\t);\r\n\t\t}\r\n\t}, []);\r\n\r\n\tuseEffect(() => {\r\n\t\tconst moveEvents: Array<keyof WindowEventMap> = [\r\n\t\t\t\"mousemove\",\r\n\t\t\t\"touchmove\",\r\n\t\t];\r\n\r\n\t\t// 드래그 상태가 붕괴되거나 좀비 상태가 될 수 있는 예외 케이스들을 모두 포함\r\n\t\tconst endEvents: Array<keyof WindowEventMap> = [\r\n\t\t\t\"mouseup\",\r\n\t\t\t\"touchend\",\r\n\t\t\t\"touchcancel\", // 터치 제스처 시스템 인터럽트\r\n\t\t\t\"pointerup\", // 범용 포인터 이벤트\r\n\t\t\t\"pointercancel\",\r\n\t\t\t\"blur\", // 윈도우 포커스 아웃 (Alt+Tab 등)\r\n\t\t];\r\n\r\n\t\tmoveEvents.forEach((eventName) => {\r\n\t\t\twindow.addEventListener(eventName, handleMoveWrapper, {\r\n\t\t\t\tpassive: false,\r\n\t\t\t});\r\n\t\t});\r\n\t\tendEvents.forEach((eventName) => {\r\n\t\t\twindow.addEventListener(eventName, handleEndWrapper);\r\n\t\t});\r\n\t\treturn () => {\r\n\t\t\tmoveEvents.forEach((eventName) => {\r\n\t\t\t\twindow.removeEventListener(eventName, handleMoveWrapper);\r\n\t\t\t});\r\n\t\t\tendEvents.forEach((eventName) => {\r\n\t\t\t\twindow.removeEventListener(eventName, handleEndWrapper);\r\n\t\t\t});\r\n\t\t};\r\n\t}, [\r\n\t\tcustomData,\r\n\t\ttargetComponent,\r\n\t\tdropDocumentOutsideOption,\r\n\t\tscreenKey,\r\n\t\tisBlockingActiveInput,\r\n\t\tcontainerName,\r\n\t\tnavigationTitle,\r\n\t\tdropEndCallback,\r\n\t]);\r\n\r\n\tuseEffect(() => {\r\n\t\tconst el = ref.current;\r\n\t\tif (!el) return;\r\n\r\n\t\tconst onCtx = (e: Event) => e.preventDefault();\r\n\r\n\t\tel.addEventListener(\"contextmenu\", onCtx);\r\n\r\n\t\treturn () => {\r\n\t\t\tel.removeEventListener(\"contextmenu\", onCtx);\r\n\t\t};\r\n\t}, []);\r\n\r\n\tuseEffect(() => {\r\n\t\treturn () => {\r\n\t\t\tif (scrollRAF.current !== null) {\r\n\t\t\t\tcancelAnimationFrame(scrollRAF.current);\r\n\t\t\t\tscrollRAF.current = null;\r\n\t\t\t}\r\n\t\t\tvelocity.current = { vx: 0, vy: 0 };\r\n\t\t\tclonedNodeRef.current?.remove();\r\n\t\t};\r\n\t}, []);\r\n\r\n\t//취소 이벤트\r\n\tuseEffect(() => {\r\n\t\tconst onKeyDown = (e: KeyboardEvent) => {\r\n\t\t\tif (e.key !== \"Escape\") return;\r\n\r\n\t\t\t// 드래그가 실제로 시작된 상태에서만 (clone이 body에 붙어있는 상태)\r\n\t\t\tif (!clonedNodeRef.current?.isConnected) return;\r\n\r\n\t\t\te.preventDefault();\r\n\t\t\te.stopPropagation();\r\n\r\n\t\t\t// 다음 mouseup이 와도 drop 로직 안 타게\r\n\t\t\tescCanceledRef.current = true;\r\n\r\n\t\t\t// 스크롤/RAF 정리\r\n\t\t\tif (scrollRAF.current !== null) {\r\n\t\t\t\tcancelAnimationFrame(scrollRAF.current);\r\n\t\t\t\tscrollRAF.current = null;\r\n\t\t\t}\r\n\t\t\tvelocity.current = { vx: 0, vy: 0 };\r\n\r\n\t\t\t// clone 제거\r\n\t\t\tclonedNodeRef.current?.remove();\r\n\r\n\t\t\t// useDragEvents 내부 상태도 \"끝\"으로 만들어 좀비 드래그 방지\r\n\t\t\t// (좌표는 hook이 마지막 좌표를 들고 있거나, 아래 emit에선 lastPointRef를 사용)\r\n\t\t\thandleEnd({\r\n\t\t\t\tevent: new Event(\"pointercancel\"),\r\n\t\t\t\tdragEndCallback: () => {},\r\n\t\t\t});\r\n\r\n\t\t\t// overlay 등 외부 UI도 즉시 종료시키기\r\n\t\t\tconst { x, y } = lastPointRef.current;\r\n\t\t\temitDragState({\r\n\t\t\t\tisDragging: false,\r\n\t\t\t\tisDrop: false,\r\n\t\t\t\tnavigationTitle:\r\n\t\t\t\t\tnavigationTitle ??\r\n\t\t\t\t\ttitleFromUrl(dropDocumentOutsideOption?.openUrl),\r\n\t\t\t\tchildren: getFallbackElement(\r\n\t\t\t\t\ttargetComponent,\r\n\t\t\t\t\tdropDocumentOutsideOption?.openUrl,\r\n\t\t\t\t),\r\n\t\t\t\tx,\r\n\t\t\t\ty,\r\n\t\t\t\tcontainerName,\r\n\t\t\t\tdropDocumentOutsideOption,\r\n\t\t\t\tcustomData,\r\n\t\t\t});\r\n\t\t};\r\n\r\n\t\twindow.addEventListener(\"keydown\", onKeyDown, true);\r\n\t\treturn () => window.removeEventListener(\"keydown\", onKeyDown, true);\r\n\t}, [\r\n\t\thandleEnd,\r\n\t\tcontainerName,\r\n\t\tnavigationTitle,\r\n\t\tdropDocumentOutsideOption,\r\n\t\ttargetComponent,\r\n\t\tcustomData,\r\n\t]);\r\n\r\n\treturn (\r\n\t\t<>\r\n\t\t\t<div\r\n\t\t\t\tclassName={`${className || \"\"} ${styles[\"flex-split-screen-drag-box\"]}`}\r\n\t\t\t\tref={ref}\r\n\t\t\t\tonContextMenu={(e) => e.preventDefault()}\r\n\t\t\t\tonMouseDown={(ev) => {\r\n\t\t\t\t\tif (onMouseDown) {\r\n\t\t\t\t\t\tPromise.resolve().then(() => onMouseDown(ev));\r\n\t\t\t\t\t}\r\n\t\t\t\t\thandleStart({\r\n\t\t\t\t\t\tevent: ev,\r\n\t\t\t\t\t\tdragStartCallback: ({ x, y }) => {\r\n\t\t\t\t\t\t\tlastPointRef.current = { x, y };\r\n\t\t\t\t\t\t\tif (clonedNodeRef.current) {\r\n\t\t\t\t\t\t\t\tdocument.body.appendChild(\r\n\t\t\t\t\t\t\t\t\tclonedNodeRef.current,\r\n\t\t\t\t\t\t\t\t);\r\n\t\t\t\t\t\t\t\tif (ref.current) {\r\n\t\t\t\t\t\t\t\t\tconst originRect =\r\n\t\t\t\t\t\t\t\t\t\tref.current.getBoundingClientRect();\r\n\t\t\t\t\t\t\t\t\tclonedNodeRef.current.style.width =\r\n\t\t\t\t\t\t\t\t\t\toriginRect.width + \"px\";\r\n\t\t\t\t\t\t\t\t\tclonedNodeRef.current.style.height =\r\n\t\t\t\t\t\t\t\t\t\toriginRect.height + \"px\";\r\n\r\n\t\t\t\t\t\t\t\t\tclonedWidth.current = originRect.width;\r\n\t\t\t\t\t\t\t\t\tclonedHeight.current = originRect.height;\r\n\t\t\t\t\t\t\t\t}\r\n\t\t\t\t\t\t\t}\r\n\r\n\t\t\t\t\t\t\tif (clonedNodeRef.current?.isConnected) {\r\n\t\t\t\t\t\t\t\tnavigator.vibrate(100);\r\n\r\n\t\t\t\t\t\t\t\tclonedNodeRef.current.style.transform = `translate3d(${x - (clonedWidth.current || 0) / 2}px, ${y - (clonedHeight.current || 0) / 2}px, 0)`;\r\n\t\t\t\t\t\t\t}\r\n\t\t\t\t\t\t\temitDragState({\r\n\t\t\t\t\t\t\t\tisDragging: true,\r\n\t\t\t\t\t\t\t\tisDrop: false,\r\n\t\t\t\t\t\t\t\tnavigationTitle:\r\n\t\t\t\t\t\t\t\t\tnavigationTitle ??\r\n\t\t\t\t\t\t\t\t\ttitleFromUrl(\r\n\t\t\t\t\t\t\t\t\t\tdropDocumentOutsideOption?.openUrl,\r\n\t\t\t\t\t\t\t\t\t),\r\n\t\t\t\t\t\t\t\tchildren: getFallbackElement(\r\n\t\t\t\t\t\t\t\t\ttargetComponent,\r\n\t\t\t\t\t\t\t\t\tdropDocumentOutsideOption?.openUrl,\r\n\t\t\t\t\t\t\t\t),\r\n\t\t\t\t\t\t\t\tx,\r\n\t\t\t\t\t\t\t\ty,\r\n\t\t\t\t\t\t\t\tcontainerName,\r\n\t\t\t\t\t\t\t\tdropDocumentOutsideOption,\r\n\t\t\t\t\t\t\t\tcustomData,\r\n\t\t\t\t\t\t\t});\r\n\t\t\t\t\t\t},\r\n\t\t\t\t\t});\r\n\t\t\t\t}}\r\n\t\t\t\tonTouchStart={(ev) => {\r\n\t\t\t\t\tif (onTouchStart) {\r\n\t\t\t\t\t\tPromise.resolve().then(() => onTouchStart(ev));\r\n\t\t\t\t\t}\r\n\t\t\t\t\thandleStart({\r\n\t\t\t\t\t\tevent: ev,\r\n\t\t\t\t\t\tdragStartCallback: ({ x, y }) => {\r\n\t\t\t\t\t\t\tif (clonedNodeRef.current) {\r\n\t\t\t\t\t\t\t\tdocument.body.appendChild(\r\n\t\t\t\t\t\t\t\t\tclonedNodeRef.current,\r\n\t\t\t\t\t\t\t\t);\r\n\t\t\t\t\t\t\t\tif (ref.current) {\r\n\t\t\t\t\t\t\t\t\tconst originRect =\r\n\t\t\t\t\t\t\t\t\t\tref.current.getBoundingClientRect();\r\n\t\t\t\t\t\t\t\t\tclonedNodeRef.current.style.width =\r\n\t\t\t\t\t\t\t\t\t\toriginRect.width + \"px\";\r\n\t\t\t\t\t\t\t\t\tclonedNodeRef.current.style.height =\r\n\t\t\t\t\t\t\t\t\t\toriginRect.height + \"px\";\r\n\r\n\t\t\t\t\t\t\t\t\tclonedWidth.current = originRect.width;\r\n\t\t\t\t\t\t\t\t\tclonedHeight.current = originRect.height;\r\n\t\t\t\t\t\t\t\t}\r\n\t\t\t\t\t\t\t}\r\n\t\t\t\t\t\t\tif (clonedNodeRef.current?.isConnected) {\r\n\t\t\t\t\t\t\t\tnavigator.vibrate(100);\r\n\t\t\t\t\t\t\t\tclonedNodeRef.current.style.transform = `translate3d(${x - (clonedWidth.current || 0) / 2}px, ${y - (clonedHeight.current || 0) / 2}px, 0)`;\r\n\t\t\t\t\t\t\t}\r\n\t\t\t\t\t\t\temitDragState({\r\n\t\t\t\t\t\t\t\tisDragging: true,\r\n\t\t\t\t\t\t\t\tisDrop: false,\r\n\t\t\t\t\t\t\t\tnavigationTitle:\r\n\t\t\t\t\t\t\t\t\tnavigationTitle ??\r\n\t\t\t\t\t\t\t\t\ttitleFromUrl(\r\n\t\t\t\t\t\t\t\t\t\tdropDocumentOutsideOption?.openUrl,\r\n\t\t\t\t\t\t\t\t\t),\r\n\t\t\t\t\t\t\t\tchildren: getFallbackElement(\r\n\t\t\t\t\t\t\t\t\ttargetComponent,\r\n\t\t\t\t\t\t\t\t\tdropDocumentOutsideOption?.openUrl,\r\n\t\t\t\t\t\t\t\t),\r\n\t\t\t\t\t\t\t\tx,\r\n\t\t\t\t\t\t\t\ty,\r\n\t\t\t\t\t\t\t\tcontainerName,\r\n\t\t\t\t\t\t\t\tdropDocumentOutsideOption,\r\n\t\t\t\t\t\t\t\tcustomData,\r\n\t\t\t\t\t\t\t});\r\n\t\t\t\t\t\t},\r\n\t\t\t\t\t});\r\n\t\t\t\t}}\r\n\t\t\t\tstyle={{ ...style }}\r\n\t\t\t\t{...props}\r\n\t\t\t>\r\n\t\t\t\t{children}\r\n\t\t\t</div>\r\n\t\t\t{}\r\n\t\t</>\r\n\t);\r\n}\r\n"],"mappings":"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","names":["x","y"]}
@@ -1 +0,0 @@
1
- {"version":3,"sources":["../../../src/flex-layout/components/FlexLayoutSplitScreenDragBoxContainer.tsx"],"sourcesContent":["\"use client\";\r\nimport { HTMLAttributes } from \"react\";\r\nimport styles from \"../styles/FlexLayout.module.css\";\r\nimport FlexLayoutSplitScreenScrollBox from \"./FlexLayoutSplitScreenScrollBox\";\r\nexport interface FlexLayoutSplitScreenDragBoxContainerProps extends HTMLAttributes<HTMLDivElement> {\r\n\tlayoutName: string;\r\n}\r\n\r\nexport default function FlexLayoutSplitScreenDragBoxContainer({\r\n\tclassName,\r\n\tchildren,\r\n\tlayoutName,\r\n\t...props\r\n}: FlexLayoutSplitScreenDragBoxContainerProps) {\r\n\treturn (\r\n\t\t<FlexLayoutSplitScreenScrollBox\r\n\t\t\tkeyName={layoutName}\r\n\t\t\tclassName={`${styles[\"flex-split-screen-drag-box-title-container\"]} ${(className && className !== \"\" && className) || \"\"}`}\r\n\t\t\tdirection=\"x\"\r\n\t\t\t{...props}\r\n\t\t>\r\n\t\t\t{children}\r\n\t\t</FlexLayoutSplitScreenScrollBox>\r\n\t);\r\n}\r\n"],"mappings":";;;;;;;;;;;;;;;;;;;;;;;;;;;;;AAAA;AAAA;AAAA;AAAA;AAAA;AAeE;AAbF,wBAAmB;AACnB,4CAA2C;AAK5B,SAAR,sCAAuD;AAAA,EAC7D;AAAA,EACA;AAAA,EACA;AAAA,EACA,GAAG;AACJ,GAA+C;AAC9C,SACC;AAAA,IAAC,sCAAAA;AAAA,IAAA;AAAA,MACA,SAAS;AAAA,MACT,WAAW,GAAG,kBAAAC,QAAO,4CAA4C,CAAC,IAAK,aAAa,cAAc,MAAM,aAAc,EAAE;AAAA,MACxH,WAAU;AAAA,MACT,GAAG;AAAA,MAEH;AAAA;AAAA,EACF;AAEF;","names":["FlexLayoutSplitScreenScrollBox","styles"]}
@@ -1 +0,0 @@
1
- {"version":3,"sources":["../../../src/flex-layout/components/FlexLayoutSplitScreenDragBoxContainer.tsx"],"sourcesContent":["\"use client\";\r\nimport { HTMLAttributes } from \"react\";\r\nimport styles from \"../styles/FlexLayout.module.css\";\r\nimport FlexLayoutSplitScreenScrollBox from \"./FlexLayoutSplitScreenScrollBox\";\r\nexport interface FlexLayoutSplitScreenDragBoxContainerProps extends HTMLAttributes<HTMLDivElement> {\r\n\tlayoutName: string;\r\n}\r\n\r\nexport default function FlexLayoutSplitScreenDragBoxContainer({\r\n\tclassName,\r\n\tchildren,\r\n\tlayoutName,\r\n\t...props\r\n}: FlexLayoutSplitScreenDragBoxContainerProps) {\r\n\treturn (\r\n\t\t<FlexLayoutSplitScreenScrollBox\r\n\t\t\tkeyName={layoutName}\r\n\t\t\tclassName={`${styles[\"flex-split-screen-drag-box-title-container\"]} ${(className && className !== \"\" && className) || \"\"}`}\r\n\t\t\tdirection=\"x\"\r\n\t\t\t{...props}\r\n\t\t>\r\n\t\t\t{children}\r\n\t\t</FlexLayoutSplitScreenScrollBox>\r\n\t);\r\n}\r\n"],"mappings":";AAeE;AAbF,OAAO,YAAY;AACnB,OAAO,oCAAoC;AAK5B,SAAR,sCAAuD;AAAA,EAC7D;AAAA,EACA;AAAA,EACA;AAAA,EACA,GAAG;AACJ,GAA+C;AAC9C,SACC;AAAA,IAAC;AAAA;AAAA,MACA,SAAS;AAAA,MACT,WAAW,GAAG,OAAO,4CAA4C,CAAC,IAAK,aAAa,cAAc,MAAM,aAAc,EAAE;AAAA,MACxH,WAAU;AAAA,MACT,GAAG;AAAA,MAEH;AAAA;AAAA,EACF;AAEF;","names":[]}
@@ -1 +0,0 @@
1
- {"version":3,"sources":["../../../src/flex-layout/components/FlexLayoutSplitScreenDragBoxItem.tsx"],"sourcesContent":["import { MouseEvent, ReactElement, useEffect } from \"react\";\r\nimport { allSplitScreenCount } from \"../hooks/useDrag\";\r\nimport styles from \"../styles/FlexLayout.module.css\";\r\nimport { FlexLayoutSplitScreenDragBoxProps } from \"./FlexLayoutSplitScreenDragBox\";\r\nexport interface FlexLayoutSplitScreenDragBoxItemProps {\r\n\tchildren: ReactElement<FlexLayoutSplitScreenDragBoxProps>;\r\n\tonClose: (event: MouseEvent<HTMLButtonElement>) => void;\r\n\tisActive: boolean;\r\n}\r\nexport default function FlexLayoutSplitScreenDragBoxItem({\r\n\tchildren,\r\n\tonClose,\r\n\tisActive,\r\n\t...props\r\n}: FlexLayoutSplitScreenDragBoxItemProps) {\r\n\tuseEffect(() => {\r\n\t\tallSplitScreenCount.next(allSplitScreenCount.value + 1);\r\n\t\treturn () => {\r\n\t\t\tif (allSplitScreenCount.value <= 1) return;\r\n\t\t\tallSplitScreenCount.next(allSplitScreenCount.value - 1);\r\n\t\t};\r\n\t}, []);\r\n\treturn (\r\n\t\t<div\r\n\t\t\tclassName={`${styles[\"flex-split-screen-drag-box-title-item\"]} ${isActive ? styles[\"active\"] : \"\"}`}\r\n\t\t\t{...props}\r\n\t\t>\r\n\t\t\t{children}\r\n\t\t\t<button type=\"button\" onClick={(ev) => onClose(ev)}>\r\n\t\t\t\tX\r\n\t\t\t</button>\r\n\t\t</div>\r\n\t);\r\n}\r\n"],"mappings":";;;;;;;;;;;;;;;;;;;;;;;;;;;;AAAA;AAAA;AAAA;AAAA;AAAA;AAuBE;AAvBF,mBAAoD;AACpD,qBAAoC;AACpC,wBAAmB;AAOJ,SAAR,iCAAkD;AAAA,EACxD;AAAA,EACA;AAAA,EACA;AAAA,EACA,GAAG;AACJ,GAA0C;AACzC,8BAAU,MAAM;AACf,uCAAoB,KAAK,mCAAoB,QAAQ,CAAC;AACtD,WAAO,MAAM;AACZ,UAAI,mCAAoB,SAAS,EAAG;AACpC,yCAAoB,KAAK,mCAAoB,QAAQ,CAAC;AAAA,IACvD;AAAA,EACD,GAAG,CAAC,CAAC;AACL,SACC;AAAA,IAAC;AAAA;AAAA,MACA,WAAW,GAAG,kBAAAA,QAAO,uCAAuC,CAAC,IAAI,WAAW,kBAAAA,QAAO,QAAQ,IAAI,EAAE;AAAA,MAChG,GAAG;AAAA,MAEH;AAAA;AAAA,QACD,4CAAC,YAAO,MAAK,UAAS,SAAS,CAAC,OAAO,QAAQ,EAAE,GAAG,eAEpD;AAAA;AAAA;AAAA,EACD;AAEF;","names":["styles"]}
@@ -1 +0,0 @@
1
- {"version":3,"sources":["../../../src/flex-layout/components/FlexLayoutSplitScreenDragBoxItem.tsx"],"sourcesContent":["import { MouseEvent, ReactElement, useEffect } from \"react\";\r\nimport { allSplitScreenCount } from \"../hooks/useDrag\";\r\nimport styles from \"../styles/FlexLayout.module.css\";\r\nimport { FlexLayoutSplitScreenDragBoxProps } from \"./FlexLayoutSplitScreenDragBox\";\r\nexport interface FlexLayoutSplitScreenDragBoxItemProps {\r\n\tchildren: ReactElement<FlexLayoutSplitScreenDragBoxProps>;\r\n\tonClose: (event: MouseEvent<HTMLButtonElement>) => void;\r\n\tisActive: boolean;\r\n}\r\nexport default function FlexLayoutSplitScreenDragBoxItem({\r\n\tchildren,\r\n\tonClose,\r\n\tisActive,\r\n\t...props\r\n}: FlexLayoutSplitScreenDragBoxItemProps) {\r\n\tuseEffect(() => {\r\n\t\tallSplitScreenCount.next(allSplitScreenCount.value + 1);\r\n\t\treturn () => {\r\n\t\t\tif (allSplitScreenCount.value <= 1) return;\r\n\t\t\tallSplitScreenCount.next(allSplitScreenCount.value - 1);\r\n\t\t};\r\n\t}, []);\r\n\treturn (\r\n\t\t<div\r\n\t\t\tclassName={`${styles[\"flex-split-screen-drag-box-title-item\"]} ${isActive ? styles[\"active\"] : \"\"}`}\r\n\t\t\t{...props}\r\n\t\t>\r\n\t\t\t{children}\r\n\t\t\t<button type=\"button\" onClick={(ev) => onClose(ev)}>\r\n\t\t\t\tX\r\n\t\t\t</button>\r\n\t\t</div>\r\n\t);\r\n}\r\n"],"mappings":"AAuBE,SAKC,KALD;AAvBF,SAAmC,iBAAiB;AACpD,SAAS,2BAA2B;AACpC,OAAO,YAAY;AAOJ,SAAR,iCAAkD;AAAA,EACxD;AAAA,EACA;AAAA,EACA;AAAA,EACA,GAAG;AACJ,GAA0C;AACzC,YAAU,MAAM;AACf,wBAAoB,KAAK,oBAAoB,QAAQ,CAAC;AACtD,WAAO,MAAM;AACZ,UAAI,oBAAoB,SAAS,EAAG;AACpC,0BAAoB,KAAK,oBAAoB,QAAQ,CAAC;AAAA,IACvD;AAAA,EACD,GAAG,CAAC,CAAC;AACL,SACC;AAAA,IAAC;AAAA;AAAA,MACA,WAAW,GAAG,OAAO,uCAAuC,CAAC,IAAI,WAAW,OAAO,QAAQ,IAAI,EAAE;AAAA,MAChG,GAAG;AAAA,MAEH;AAAA;AAAA,QACD,oBAAC,YAAO,MAAK,UAAS,SAAS,CAAC,OAAO,QAAQ,EAAE,GAAG,eAEpD;AAAA;AAAA;AAAA,EACD;AAEF;","names":[]}
@@ -1 +0,0 @@
1
- {"version":3,"sources":["../../../src/flex-layout/components/FlexLayoutSplitScreenDragBoxTitleMore.tsx"],"sourcesContent":["import { HTMLAttributes } from \"react\";\r\nimport styles from \"../styles/FlexLayout.module.css\";\r\n\r\nexport interface FlexLayoutSplitScreenDragBoxTitleMoreProps extends Omit<\r\n\tHTMLAttributes<HTMLButtonElement>,\r\n\t\"children\"\r\n> {}\r\nexport default function FlexLayoutSplitScreenDragBoxTitleMore({\r\n\tclassName,\r\n\t...props\r\n}: FlexLayoutSplitScreenDragBoxTitleMoreProps) {\r\n\treturn (\r\n\t\t<button\r\n\t\t\t{...props}\r\n\t\t\tclassName={`${styles[\"flex-split-screen-drag-box-title-more\"]} ${className || \"\"}`}\r\n\t\t>\r\n\t\t\t<span>.</span>\r\n\t\t\t<span>.</span>\r\n\t\t\t<span>.</span>\r\n\t\t</button>\r\n\t);\r\n}\r\n"],"mappings":";;;;;;;;;;;;;;;;;;;;;;;;;;;;AAAA;AAAA;AAAA;AAAA;AAAA;AAYE;AAXF,wBAAmB;AAMJ,SAAR,sCAAuD;AAAA,EAC7D;AAAA,EACA,GAAG;AACJ,GAA+C;AAC9C,SACC;AAAA,IAAC;AAAA;AAAA,MACC,GAAG;AAAA,MACJ,WAAW,GAAG,kBAAAA,QAAO,uCAAuC,CAAC,IAAI,aAAa,EAAE;AAAA,MAEhF;AAAA,oDAAC,UAAK,eAAC;AAAA,QACP,4CAAC,UAAK,eAAC;AAAA,QACP,4CAAC,UAAK,eAAC;AAAA;AAAA;AAAA,EACR;AAEF;","names":["styles"]}
@@ -1 +0,0 @@
1
- {"version":3,"sources":["../../../src/flex-layout/components/FlexLayoutSplitScreenDragBoxTitleMore.tsx"],"sourcesContent":["import { HTMLAttributes } from \"react\";\r\nimport styles from \"../styles/FlexLayout.module.css\";\r\n\r\nexport interface FlexLayoutSplitScreenDragBoxTitleMoreProps extends Omit<\r\n\tHTMLAttributes<HTMLButtonElement>,\r\n\t\"children\"\r\n> {}\r\nexport default function FlexLayoutSplitScreenDragBoxTitleMore({\r\n\tclassName,\r\n\t...props\r\n}: FlexLayoutSplitScreenDragBoxTitleMoreProps) {\r\n\treturn (\r\n\t\t<button\r\n\t\t\t{...props}\r\n\t\t\tclassName={`${styles[\"flex-split-screen-drag-box-title-more\"]} ${className || \"\"}`}\r\n\t\t>\r\n\t\t\t<span>.</span>\r\n\t\t\t<span>.</span>\r\n\t\t\t<span>.</span>\r\n\t\t</button>\r\n\t);\r\n}\r\n"],"mappings":"AAYE,SAIC,KAJD;AAXF,OAAO,YAAY;AAMJ,SAAR,sCAAuD;AAAA,EAC7D;AAAA,EACA,GAAG;AACJ,GAA+C;AAC9C,SACC;AAAA,IAAC;AAAA;AAAA,MACC,GAAG;AAAA,MACJ,WAAW,GAAG,OAAO,uCAAuC,CAAC,IAAI,aAAa,EAAE;AAAA,MAEhF;AAAA,4BAAC,UAAK,eAAC;AAAA,QACP,oBAAC,UAAK,eAAC;AAAA,QACP,oBAAC,UAAK,eAAC;AAAA;AAAA;AAAA,EACR;AAEF;","names":[]}
@@ -1 +0,0 @@
1
- {"version":3,"sources":["../../../src/flex-layout/components/FlexLayoutSplitScreenScrollBox.tsx"],"sourcesContent":["\"use client\";\r\n\r\nimport { FC, HTMLAttributes, memo, useEffect, useRef, useState } from \"react\";\r\nimport { fromEvent, Subject } from \"rxjs\";\r\nimport { take, throttleTime } from \"rxjs/operators\";\r\nimport {\r\n\tgetScrollPosition,\r\n\tremoveScrollPosition,\r\n\tScrollPosition,\r\n\tsetScrollPosition,\r\n} from \"../store/FlexLayoutContainerStore\";\r\nimport listScroll from \"../styles/listScroll.module.css\";\r\n\r\nexport interface FlexLayoutSplitScreenScrollBoxProps extends HTMLAttributes<HTMLDivElement> {\r\n\tkeyName: string;\r\n\tclassName?: string;\r\n\tdirection?: \"x\" | \"y\";\r\n\tisDefaultScrollStyle?: boolean;\r\n}\r\n\r\nconst FlexLayoutSplitScreenScrollBox: FC<\r\n\tFlexLayoutSplitScreenScrollBoxProps\r\n> = ({\r\n\tclassName,\r\n\tchildren,\r\n\tkeyName,\r\n\tdirection,\r\n\tisDefaultScrollStyle = false,\r\n\t...props\r\n}: FlexLayoutSplitScreenScrollBoxProps) => {\r\n\tconst scrollRef = useRef<HTMLDivElement | null>(null);\r\n\tconst [isMouseDown, setIsMouseDown] = useState<boolean>(false);\r\n\tconst scrollEventSubject = useRef(new Subject<ScrollPosition>());\r\n\r\n\t// const handleScroll = throttle(\r\n\t// (newScrollLeft: number, newScrollTop: number) => {\r\n\t// setScrollPosition(layoutName, {\r\n\t// x: newScrollLeft,\r\n\t// y: newScrollTop,\r\n\t// });\r\n\t// },\r\n\t// 100\r\n\t// ); // 100ms 간격으로 호출\r\n\r\n\tuseEffect(() => {\r\n\t\tconst mouseUpSubscribe = fromEvent<MouseEvent>(\r\n\t\t\twindow,\r\n\t\t\t\"mouseup\",\r\n\t\t).subscribe(() => {\r\n\t\t\tsetIsMouseDown(false);\r\n\t\t});\r\n\r\n\t\t// 스크롤 이벤트 throttling 및 상태 업데이트\r\n\t\tconst scrollEventSubscribe = scrollEventSubject.current\r\n\t\t\t.pipe(throttleTime(70)) // 70ms 간격으로 throttling\r\n\t\t\t.subscribe((position) => {\r\n\t\t\t\tsetScrollPosition(keyName, position);\r\n\t\t\t});\r\n\r\n\t\tconst scrollSubscribe = getScrollPosition(keyName)\r\n\t\t\t.pipe(take(1)) // 한 번만 실행\r\n\t\t\t.subscribe((position) => {\r\n\t\t\t\tif (scrollRef.current && position) {\r\n\t\t\t\t\tscrollRef.current.scrollLeft = position.x;\r\n\t\t\t\t\tscrollRef.current.scrollTop = position.y;\r\n\t\t\t\t}\r\n\t\t\t});\r\n\r\n\t\treturn () => {\r\n\t\t\tremoveScrollPosition(keyName);\r\n\t\t\tmouseUpSubscribe.unsubscribe();\r\n\t\t\tscrollSubscribe.unsubscribe();\r\n\t\t\tscrollEventSubscribe.unsubscribe();\r\n\t\t};\r\n\t}, [keyName]);\r\n\tuseEffect(() => {\r\n\t\tif (!scrollRef.current) return;\r\n\r\n\t\tlet animationFrameId: number | null = null;\r\n\t\tconst handleWheel = (event: WheelEvent) => {\r\n\t\t\tif (!scrollRef.current || direction !== \"x\") return;\r\n\t\t\tif (scrollRef.current.matches(\":hover\")) {\r\n\t\t\t\tevent.preventDefault();\r\n\t\t\t\tconst { deltaY } = event;\r\n\t\t\t\tconst newScrollLeft = scrollRef.current.scrollLeft + deltaY;\r\n\r\n\t\t\t\t// 이미 애니메이션이 예약되어 있으면 취소\r\n\t\t\t\tif (animationFrameId) {\r\n\t\t\t\t\tcancelAnimationFrame(animationFrameId);\r\n\t\t\t\t}\r\n\r\n\t\t\t\tanimationFrameId = requestAnimationFrame(() => {\r\n\t\t\t\t\t// 바로 scrollLeft 값을 업데이트 (smooth 대신,\r\n\t\t\t\t\t// 혹은 native 스크롤로 처리)\r\n\t\t\t\t\tscrollRef.current!.scrollLeft = newScrollLeft;\r\n\t\t\t\t\tscrollEventSubject.current.next({\r\n\t\t\t\t\t\tx: newScrollLeft,\r\n\t\t\t\t\t\ty: scrollRef.current!.scrollTop,\r\n\t\t\t\t\t});\r\n\t\t\t\t\tanimationFrameId = null;\r\n\t\t\t\t});\r\n\t\t\t}\r\n\t\t};\r\n\r\n\t\t// 수동으로 이벤트 리스너 추가\r\n\t\tscrollRef.current.addEventListener(\"wheel\", handleWheel, {\r\n\t\t\tpassive: false,\r\n\t\t});\r\n\r\n\t\treturn () => {\r\n\t\t\t// 이벤트 리스너 제거\r\n\t\t\tscrollRef.current?.removeEventListener(\"wheel\", handleWheel);\r\n\t\t};\r\n\t}, []);\r\n\treturn (\r\n\t\t<div\r\n\t\t\tref={scrollRef}\r\n\t\t\tonMouseUp={() => setIsMouseDown(false)}\r\n\t\t\tonMouseDown={() => setIsMouseDown(true)}\r\n\t\t\tonMouseMove={(event) => {\r\n\t\t\t\tif (!scrollRef.current || !isMouseDown || direction !== \"x\")\r\n\t\t\t\t\treturn;\r\n\t\t\t\tscrollRef.current.scrollLeft += event.movementX * -1;\r\n\t\t\t\tscrollEventSubject.current.next({\r\n\t\t\t\t\tx: scrollRef.current.scrollLeft,\r\n\t\t\t\t\ty: scrollRef.current.scrollTop,\r\n\t\t\t\t});\r\n\t\t\t}}\r\n\t\t\tonScroll={() => {\r\n\t\t\t\tif (!scrollRef.current) return;\r\n\t\t\t\tscrollEventSubject.current.next({\r\n\t\t\t\t\tx: scrollRef.current.scrollLeft,\r\n\t\t\t\t\ty: scrollRef.current.scrollTop,\r\n\t\t\t\t});\r\n\t\t\t}}\r\n\t\t\tclassName={`${className || \"\"} ${isDefaultScrollStyle ? listScroll[\"default-scroll\"] : listScroll[\"list-scroll\"]} ${direction ? listScroll[direction] : \"\"}`}\r\n\t\t\t{...props}\r\n\t\t>\r\n\t\t\t{children}\r\n\t\t</div>\r\n\t);\r\n};\r\n\r\nexport default memo(FlexLayoutSplitScreenScrollBox);\r\n"],"mappings":";;;;;;;;;;;;;;;;;;;;;;;;;;;;;AAAA;AAAA;AAAA;AAAA;AAAA;AAmHE;AAjHF,mBAAsE;AACtE,kBAAmC;AACnC,uBAAmC;AACnC,sCAKO;AACP,wBAAuB;AASvB,MAAM,iCAEF,CAAC;AAAA,EACJ;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA,uBAAuB;AAAA,EACvB,GAAG;AACJ,MAA2C;AAC1C,QAAM,gBAAY,qBAA8B,IAAI;AACpD,QAAM,CAAC,aAAa,cAAc,QAAI,uBAAkB,KAAK;AAC7D,QAAM,yBAAqB,qBAAO,IAAI,oBAAwB,CAAC;AAY/D,8BAAU,MAAM;AACf,UAAM,uBAAmB;AAAA,MACxB;AAAA,MACA;AAAA,IACD,EAAE,UAAU,MAAM;AACjB,qBAAe,KAAK;AAAA,IACrB,CAAC;AAGD,UAAM,uBAAuB,mBAAmB,QAC9C,SAAK,+BAAa,EAAE,CAAC,EACrB,UAAU,CAAC,aAAa;AACxB,6DAAkB,SAAS,QAAQ;AAAA,IACpC,CAAC;AAEF,UAAM,sBAAkB,mDAAkB,OAAO,EAC/C,SAAK,uBAAK,CAAC,CAAC,EACZ,UAAU,CAAC,aAAa;AACxB,UAAI,UAAU,WAAW,UAAU;AAClC,kBAAU,QAAQ,aAAa,SAAS;AACxC,kBAAU,QAAQ,YAAY,SAAS;AAAA,MACxC;AAAA,IACD,CAAC;AAEF,WAAO,MAAM;AACZ,gEAAqB,OAAO;AAC5B,uBAAiB,YAAY;AAC7B,sBAAgB,YAAY;AAC5B,2BAAqB,YAAY;AAAA,IAClC;AAAA,EACD,GAAG,CAAC,OAAO,CAAC;AACZ,8BAAU,MAAM;AACf,QAAI,CAAC,UAAU,QAAS;AAExB,QAAI,mBAAkC;AACtC,UAAM,cAAc,CAAC,UAAsB;AAC1C,UAAI,CAAC,UAAU,WAAW,cAAc,IAAK;AAC7C,UAAI,UAAU,QAAQ,QAAQ,QAAQ,GAAG;AACxC,cAAM,eAAe;AACrB,cAAM,EAAE,OAAO,IAAI;AACnB,cAAM,gBAAgB,UAAU,QAAQ,aAAa;AAGrD,YAAI,kBAAkB;AACrB,+BAAqB,gBAAgB;AAAA,QACtC;AAEA,2BAAmB,sBAAsB,MAAM;AAG9C,oBAAU,QAAS,aAAa;AAChC,6BAAmB,QAAQ,KAAK;AAAA,YAC/B,GAAG;AAAA,YACH,GAAG,UAAU,QAAS;AAAA,UACvB,CAAC;AACD,6BAAmB;AAAA,QACpB,CAAC;AAAA,MACF;AAAA,IACD;AAGA,cAAU,QAAQ,iBAAiB,SAAS,aAAa;AAAA,MACxD,SAAS;AAAA,IACV,CAAC;AAED,WAAO,MAAM;AAEZ,gBAAU,SAAS,oBAAoB,SAAS,WAAW;AAAA,IAC5D;AAAA,EACD,GAAG,CAAC,CAAC;AACL,SACC;AAAA,IAAC;AAAA;AAAA,MACA,KAAK;AAAA,MACL,WAAW,MAAM,eAAe,KAAK;AAAA,MACrC,aAAa,MAAM,eAAe,IAAI;AAAA,MACtC,aAAa,CAAC,UAAU;AACvB,YAAI,CAAC,UAAU,WAAW,CAAC,eAAe,cAAc;AACvD;AACD,kBAAU,QAAQ,cAAc,MAAM,YAAY;AAClD,2BAAmB,QAAQ,KAAK;AAAA,UAC/B,GAAG,UAAU,QAAQ;AAAA,UACrB,GAAG,UAAU,QAAQ;AAAA,QACtB,CAAC;AAAA,MACF;AAAA,MACA,UAAU,MAAM;AACf,YAAI,CAAC,UAAU,QAAS;AACxB,2BAAmB,QAAQ,KAAK;AAAA,UAC/B,GAAG,UAAU,QAAQ;AAAA,UACrB,GAAG,UAAU,QAAQ;AAAA,QACtB,CAAC;AAAA,MACF;AAAA,MACA,WAAW,GAAG,aAAa,EAAE,IAAI,uBAAuB,kBAAAA,QAAW,gBAAgB,IAAI,kBAAAA,QAAW,aAAa,CAAC,IAAI,YAAY,kBAAAA,QAAW,SAAS,IAAI,EAAE;AAAA,MACzJ,GAAG;AAAA,MAEH;AAAA;AAAA,EACF;AAEF;AAEA,IAAO,6CAAQ,mBAAK,8BAA8B;","names":["listScroll"]}
@@ -1 +0,0 @@
1
- {"version":3,"sources":["../../../src/flex-layout/components/FlexLayoutSplitScreenScrollBox.tsx"],"sourcesContent":["\"use client\";\r\n\r\nimport { FC, HTMLAttributes, memo, useEffect, useRef, useState } from \"react\";\r\nimport { fromEvent, Subject } from \"rxjs\";\r\nimport { take, throttleTime } from \"rxjs/operators\";\r\nimport {\r\n\tgetScrollPosition,\r\n\tremoveScrollPosition,\r\n\tScrollPosition,\r\n\tsetScrollPosition,\r\n} from \"../store/FlexLayoutContainerStore\";\r\nimport listScroll from \"../styles/listScroll.module.css\";\r\n\r\nexport interface FlexLayoutSplitScreenScrollBoxProps extends HTMLAttributes<HTMLDivElement> {\r\n\tkeyName: string;\r\n\tclassName?: string;\r\n\tdirection?: \"x\" | \"y\";\r\n\tisDefaultScrollStyle?: boolean;\r\n}\r\n\r\nconst FlexLayoutSplitScreenScrollBox: FC<\r\n\tFlexLayoutSplitScreenScrollBoxProps\r\n> = ({\r\n\tclassName,\r\n\tchildren,\r\n\tkeyName,\r\n\tdirection,\r\n\tisDefaultScrollStyle = false,\r\n\t...props\r\n}: FlexLayoutSplitScreenScrollBoxProps) => {\r\n\tconst scrollRef = useRef<HTMLDivElement | null>(null);\r\n\tconst [isMouseDown, setIsMouseDown] = useState<boolean>(false);\r\n\tconst scrollEventSubject = useRef(new Subject<ScrollPosition>());\r\n\r\n\t// const handleScroll = throttle(\r\n\t// (newScrollLeft: number, newScrollTop: number) => {\r\n\t// setScrollPosition(layoutName, {\r\n\t// x: newScrollLeft,\r\n\t// y: newScrollTop,\r\n\t// });\r\n\t// },\r\n\t// 100\r\n\t// ); // 100ms 간격으로 호출\r\n\r\n\tuseEffect(() => {\r\n\t\tconst mouseUpSubscribe = fromEvent<MouseEvent>(\r\n\t\t\twindow,\r\n\t\t\t\"mouseup\",\r\n\t\t).subscribe(() => {\r\n\t\t\tsetIsMouseDown(false);\r\n\t\t});\r\n\r\n\t\t// 스크롤 이벤트 throttling 및 상태 업데이트\r\n\t\tconst scrollEventSubscribe = scrollEventSubject.current\r\n\t\t\t.pipe(throttleTime(70)) // 70ms 간격으로 throttling\r\n\t\t\t.subscribe((position) => {\r\n\t\t\t\tsetScrollPosition(keyName, position);\r\n\t\t\t});\r\n\r\n\t\tconst scrollSubscribe = getScrollPosition(keyName)\r\n\t\t\t.pipe(take(1)) // 한 번만 실행\r\n\t\t\t.subscribe((position) => {\r\n\t\t\t\tif (scrollRef.current && position) {\r\n\t\t\t\t\tscrollRef.current.scrollLeft = position.x;\r\n\t\t\t\t\tscrollRef.current.scrollTop = position.y;\r\n\t\t\t\t}\r\n\t\t\t});\r\n\r\n\t\treturn () => {\r\n\t\t\tremoveScrollPosition(keyName);\r\n\t\t\tmouseUpSubscribe.unsubscribe();\r\n\t\t\tscrollSubscribe.unsubscribe();\r\n\t\t\tscrollEventSubscribe.unsubscribe();\r\n\t\t};\r\n\t}, [keyName]);\r\n\tuseEffect(() => {\r\n\t\tif (!scrollRef.current) return;\r\n\r\n\t\tlet animationFrameId: number | null = null;\r\n\t\tconst handleWheel = (event: WheelEvent) => {\r\n\t\t\tif (!scrollRef.current || direction !== \"x\") return;\r\n\t\t\tif (scrollRef.current.matches(\":hover\")) {\r\n\t\t\t\tevent.preventDefault();\r\n\t\t\t\tconst { deltaY } = event;\r\n\t\t\t\tconst newScrollLeft = scrollRef.current.scrollLeft + deltaY;\r\n\r\n\t\t\t\t// 이미 애니메이션이 예약되어 있으면 취소\r\n\t\t\t\tif (animationFrameId) {\r\n\t\t\t\t\tcancelAnimationFrame(animationFrameId);\r\n\t\t\t\t}\r\n\r\n\t\t\t\tanimationFrameId = requestAnimationFrame(() => {\r\n\t\t\t\t\t// 바로 scrollLeft 값을 업데이트 (smooth 대신,\r\n\t\t\t\t\t// 혹은 native 스크롤로 처리)\r\n\t\t\t\t\tscrollRef.current!.scrollLeft = newScrollLeft;\r\n\t\t\t\t\tscrollEventSubject.current.next({\r\n\t\t\t\t\t\tx: newScrollLeft,\r\n\t\t\t\t\t\ty: scrollRef.current!.scrollTop,\r\n\t\t\t\t\t});\r\n\t\t\t\t\tanimationFrameId = null;\r\n\t\t\t\t});\r\n\t\t\t}\r\n\t\t};\r\n\r\n\t\t// 수동으로 이벤트 리스너 추가\r\n\t\tscrollRef.current.addEventListener(\"wheel\", handleWheel, {\r\n\t\t\tpassive: false,\r\n\t\t});\r\n\r\n\t\treturn () => {\r\n\t\t\t// 이벤트 리스너 제거\r\n\t\t\tscrollRef.current?.removeEventListener(\"wheel\", handleWheel);\r\n\t\t};\r\n\t}, []);\r\n\treturn (\r\n\t\t<div\r\n\t\t\tref={scrollRef}\r\n\t\t\tonMouseUp={() => setIsMouseDown(false)}\r\n\t\t\tonMouseDown={() => setIsMouseDown(true)}\r\n\t\t\tonMouseMove={(event) => {\r\n\t\t\t\tif (!scrollRef.current || !isMouseDown || direction !== \"x\")\r\n\t\t\t\t\treturn;\r\n\t\t\t\tscrollRef.current.scrollLeft += event.movementX * -1;\r\n\t\t\t\tscrollEventSubject.current.next({\r\n\t\t\t\t\tx: scrollRef.current.scrollLeft,\r\n\t\t\t\t\ty: scrollRef.current.scrollTop,\r\n\t\t\t\t});\r\n\t\t\t}}\r\n\t\t\tonScroll={() => {\r\n\t\t\t\tif (!scrollRef.current) return;\r\n\t\t\t\tscrollEventSubject.current.next({\r\n\t\t\t\t\tx: scrollRef.current.scrollLeft,\r\n\t\t\t\t\ty: scrollRef.current.scrollTop,\r\n\t\t\t\t});\r\n\t\t\t}}\r\n\t\t\tclassName={`${className || \"\"} ${isDefaultScrollStyle ? listScroll[\"default-scroll\"] : listScroll[\"list-scroll\"]} ${direction ? listScroll[direction] : \"\"}`}\r\n\t\t\t{...props}\r\n\t\t>\r\n\t\t\t{children}\r\n\t\t</div>\r\n\t);\r\n};\r\n\r\nexport default memo(FlexLayoutSplitScreenScrollBox);\r\n"],"mappings":"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","names":[]}
@@ -1 +0,0 @@
1
- {"version":3,"sources":["../../../src/flex-layout/components/FlexLayoutStickyBox.tsx"],"sourcesContent":["\"use client\";\r\nimport {\r\n\tCSSProperties,\r\n\tFC,\r\n\tHTMLAttributes,\r\n\tReactNode,\r\n\tRefObject,\r\n\tuseEffect,\r\n\tuseRef,\r\n\tuseState,\r\n} from \"react\";\r\n\r\ntype Edge = \"auto\" | \"top\" | \"bottom\" | \"left\" | \"right\";\r\n\r\ninterface FlexLayoutStickyBoxProps extends HTMLAttributes<HTMLDivElement> {\r\n\t/** 어느 방향으로 붙일지. 기본은 'auto' (세로 스크롤이면 top, 가로 스크롤이면 left) */\r\n\tedge?: Edge;\r\n\t/** 화면 모서리와의 여백(px). 기본 16 */\r\n\toffset?: number;\r\n\t/** 스크롤 루트. 명시 안 하면 가장 흔한 케이스인 <main> → 없으면 window(=viewport) */\r\n\tscrollRoot?: Element | null;\r\n\t/** 디버그 보조선 표시 */\r\n\tdebug?: boolean;\r\n\t/** 자식 */\r\n\tchildren: ReactNode;\r\n\r\n\ttransitionDurationMs?: number;\r\n\r\n\tonTranslateChange?: (\r\n\t\tvalue: number,\r\n\t\trootRef: RefObject<HTMLDivElement | null>,\r\n\t\tcontentRef: RefObject<HTMLDivElement | null>,\r\n\t) => void;\r\n}\r\n\r\nfunction clamp(n: number, min: number, max: number) {\r\n\treturn Math.max(min, Math.min(max, n));\r\n}\r\n\r\nfunction pickDefaultScrollRoot(): Element | null {\r\n\tif (typeof document === \"undefined\") return null;\r\n\r\n\tlet el: Element | null = document.body;\r\n\twhile (el && el !== document.documentElement && el !== document.body) {\r\n\t\tconst style = getComputedStyle(el);\r\n\t\tconst oy = style.overflowY;\r\n\t\tconst ox = style.overflowX;\r\n\t\tconst scrollable =\r\n\t\t\toy === \"auto\" ||\r\n\t\t\toy === \"scroll\" ||\r\n\t\t\tox === \"auto\" ||\r\n\t\t\tox === \"scroll\";\r\n\t\tif (scrollable) return el;\r\n\t\tel = el.parentElement;\r\n\t}\r\n\treturn null;\r\n}\r\n\r\nfunction isVerticalScroll(root: Element | null): boolean {\r\n\tif (typeof window == \"undefined\") return true;\r\n\tif (!root) {\r\n\t\treturn document.documentElement.scrollHeight > window.innerHeight + 1;\r\n\t}\r\n\tconst el = root as HTMLElement;\r\n\treturn el.scrollHeight > el.clientHeight + 1;\r\n}\r\n\r\nconst dpr = typeof window != \"undefined\" ? window.devicePixelRatio || 1 : 1;\r\nfunction quantizeToDevicePixel(n: number) {\r\n\treturn Math.round(n * dpr) / dpr;\r\n}\r\n\r\n/**\r\n * FlexLayoutStickyBox\r\n * 부모(실제 경계) 안에서만 움직이며, `transform`을 동적으로 부여해\r\n * “sticky처럼 보이도록” 만든다.\r\n *\r\n * 구조:\r\n * <div data-root> // 이 박스가 부모 경계 안에서 공간을 차지\r\n * <div data-content> // 이 박스가 transform으로 부드럽게 움직임\r\n * {children}\r\n * </div>\r\n * </div>\r\n */\r\nconst FlexLayoutStickyBox: FC<FlexLayoutStickyBoxProps> = ({\r\n\tedge = \"auto\",\r\n\toffset = 16,\r\n\tscrollRoot = null,\r\n\tdebug = false,\r\n\tchildren,\r\n\tstyle,\r\n\tclassName,\r\n\ttransitionDurationMs = 200,\r\n\tonTranslateChange = () => {},\r\n\t...rest\r\n}) => {\r\n\tconst offsetRef = useRef(offset);\r\n\tconst rootRef = useRef<HTMLDivElement>(null); // 내가 들어있는 박스(부모의 자식)\r\n\tconst contentRef = useRef<HTMLDivElement>(null); // 실제 내용\r\n\tconst mutatingRef = useRef(false);\r\n\tconst lastOffsetRef = useRef(0);\r\n\tconst [resolvedEdge, setResolvedEdge] = useState<Edge>(\"top\");\r\n\tconst rafId = useRef<number | null>(null);\r\n\r\n\t// 마운트 이후에만(클라이언트에서만) 터치 스타일을 적용\r\n\tconst [contentDynamicStyle, setContentDynamicStyle] =\r\n\t\tuseState<CSSProperties>({});\r\n\tuseEffect(() => {\r\n\t\t// if (\r\n\t\t// typeof navigator !== 'undefined' &&\r\n\t\t// (navigator.maxTouchPoints ?? 0) > 0\r\n\t\t// ) {\r\n\t\tsetContentDynamicStyle({\r\n\t\t\twillChange: \"transform\",\r\n\t\t\ttransition: `transform ${transitionDurationMs}ms linear`,\r\n\t\t});\r\n\t\t// }\r\n\t}, [transitionDurationMs]);\r\n\r\n\tuseEffect(() => {\r\n\t\toffsetRef.current = offset;\r\n\t\tscheduleUpdate();\r\n\t}, [offset]);\r\n\tconst [ioRoot, setIoRoot] = useState<Element | null>(null);\r\n\tuseEffect(() => {\r\n\t\t// CSR로 전환된 후에 반드시 최신 scroll root를 계산\r\n\t\tconst root = scrollRoot ?? pickDefaultScrollRoot();\r\n\t\tsetResolvedEdge(\r\n\t\t\tedge === \"auto\" ? (isVerticalScroll(root) ? \"top\" : \"left\") : edge,\r\n\t\t);\r\n\r\n\t\tsetIoRoot(root);\r\n\t}, [edge, scrollRoot]);\r\n\tuseEffect(() => {\r\n\t\tif (edge !== \"auto\") {\r\n\t\t\tsetResolvedEdge(edge);\r\n\t\t\treturn;\r\n\t\t}\r\n\t\tconst vertical = isVerticalScroll(ioRoot);\r\n\t\tsetResolvedEdge(vertical ? \"top\" : \"left\");\r\n\t}, [edge, ioRoot]);\r\n\r\n\tuseEffect(() => {}, []);\r\n\r\n\tconst scheduleUpdate = () => {\r\n\t\tif (rafId.current != null) return;\r\n\t\trafId.current = requestAnimationFrame(() => {\r\n\t\t\trafId.current = null;\r\n\t\t\tdoUpdate();\r\n\t\t});\r\n\t};\r\n\r\n\tconst doUpdate = () => {\r\n\t\tif (mutatingRef.current) return;\r\n\t\tmutatingRef.current = true;\r\n\r\n\t\tconst rootEl = rootRef.current;\r\n\t\tconst contentEl = contentRef.current;\r\n\t\tif (!rootEl || !contentEl) {\r\n\t\t\tmutatingRef.current = false;\r\n\t\t\treturn;\r\n\t\t}\r\n\r\n\t\tconst parentEl = rootEl.parentElement;\r\n\t\tif (!parentEl) {\r\n\t\t\tmutatingRef.current = false;\r\n\t\t\treturn;\r\n\t\t}\r\n\r\n\t\tconst rootBounds =\r\n\t\t\tioRoot && \"getBoundingClientRect\" in ioRoot\r\n\t\t\t\t? (ioRoot as Element).getBoundingClientRect()\r\n\t\t\t\t: new DOMRect(0, 0, window.innerWidth, window.innerHeight);\r\n\r\n\t\tconst parentRect = parentEl.getBoundingClientRect();\r\n\t\tconst contentRect = contentEl.getBoundingClientRect();\r\n\r\n\t\tlet newOffset = 0;\r\n\r\n\t\tif (resolvedEdge === \"top\" || resolvedEdge === \"bottom\") {\r\n\t\t\tconst maxTranslate = Math.max(\r\n\t\t\t\t0,\r\n\t\t\t\tparentRect.height - contentRect.height,\r\n\t\t\t);\r\n\t\t\tlet desiredTop = 0;\r\n\r\n\t\t\tif (resolvedEdge === \"top\") {\r\n\t\t\t\tdesiredTop =\r\n\t\t\t\t\trootBounds.top + offsetRef.current - parentRect.top;\r\n\t\t\t} else {\r\n\t\t\t\t// bottom\r\n\t\t\t\tconst targetBottomFromParentTop =\r\n\t\t\t\t\tMath.min(\r\n\t\t\t\t\t\tparentRect.bottom,\r\n\t\t\t\t\t\trootBounds.bottom - offsetRef.current,\r\n\t\t\t\t\t) - parentRect.top;\r\n\t\t\t\tdesiredTop = targetBottomFromParentTop - contentRect.height;\r\n\t\t\t}\r\n\t\t\tnewOffset = clamp(desiredTop, 0, maxTranslate);\r\n\t\t} else {\r\n\t\t\t// left or right\r\n\t\t\tconst maxTranslate = Math.max(\r\n\t\t\t\t0,\r\n\t\t\t\tparentRect.width - contentRect.width,\r\n\t\t\t);\r\n\t\t\tlet desiredLeft = 0;\r\n\r\n\t\t\tif (resolvedEdge === \"left\") {\r\n\t\t\t\tdesiredLeft =\r\n\t\t\t\t\trootBounds.left + offsetRef.current - parentRect.left;\r\n\t\t\t} else {\r\n\t\t\t\t// right\r\n\t\t\t\tconst targetRightFromParentLeft =\r\n\t\t\t\t\tMath.min(\r\n\t\t\t\t\t\tparentRect.right,\r\n\t\t\t\t\t\trootBounds.right - offsetRef.current,\r\n\t\t\t\t\t) - parentRect.left;\r\n\t\t\t\tdesiredLeft = targetRightFromParentLeft - contentRect.width;\r\n\t\t\t}\r\n\t\t\tnewOffset = clamp(desiredLeft, 0, maxTranslate);\r\n\t\t}\r\n\r\n\t\tconst nextOffset = quantizeToDevicePixel(newOffset);\r\n\r\n\t\t// 변화가 거의 없으면 업데이트 건너뛰기 (미세한 떨림 방지)\r\n\t\tif (Math.abs(lastOffsetRef.current - nextOffset) > 0.5) {\r\n\t\t\tif (resolvedEdge === \"top\" || resolvedEdge === \"bottom\") {\r\n\t\t\t\tcontentEl.style.transform = `translateY(${nextOffset}px)`;\r\n\t\t\t} else {\r\n\t\t\t\tcontentEl.style.transform = `translateX(${nextOffset}px)`;\r\n\t\t\t}\r\n\t\t\tlastOffsetRef.current = nextOffset;\r\n\t\t\tonTranslateChange(nextOffset, rootRef, contentRef);\r\n\t\t}\r\n\r\n\t\tif (debug) {\r\n\t\t\trootEl.style.outline = \"1px dashed rgba(0,0,0,.2)\";\r\n\t\t\tcontentEl.style.outline = \"1px solid rgba(0,128,255,.35)\";\r\n\t\t}\r\n\r\n\t\tqueueMicrotask(() => {\r\n\t\t\tmutatingRef.current = false;\r\n\t\t});\r\n\t};\r\n\r\n\t// IntersectionObserver, ResizeObserver, Event Listeners 설정\r\n\tuseEffect(() => {\r\n\t\tif (typeof window == \"undefined\") return;\r\n\t\tconst rootEl = rootRef.current;\r\n\t\tif (!rootEl) return;\r\n\r\n\t\tconst parentEl = rootEl.parentElement;\r\n\r\n\t\tconsole.log(parentEl);\r\n\t\tif (!parentEl) return;\r\n\r\n\t\tconst targets: Element[] = [parentEl];\r\n\r\n\t\tconst observerCallback = () => {\r\n\t\t\tif (!mutatingRef.current) scheduleUpdate();\r\n\t\t};\r\n\r\n\t\tconst io = new IntersectionObserver(observerCallback, {\r\n\t\t\troot: ioRoot instanceof Element ? ioRoot : null,\r\n\t\t\tthreshold: 0,\r\n\t\t\trootMargin: \"1px\",\r\n\t\t});\r\n\r\n\t\tconst ro = new ResizeObserver(observerCallback);\r\n\r\n\t\ttargets.forEach((t) => io.observe(t));\r\n\t\tro.observe(parentEl);\r\n\t\tif (contentRef.current) {\r\n\t\t\tro.observe(contentRef.current);\r\n\t\t}\r\n\r\n\t\tconst scrollTarget = ioRoot || window;\r\n\t\tscrollTarget.addEventListener(\"scroll\", scheduleUpdate, {\r\n\t\t\tpassive: true,\r\n\t\t});\r\n\t\twindow.addEventListener(\"resize\", scheduleUpdate);\r\n\r\n\t\t// 최초 1회 계산\r\n\t\tscheduleUpdate();\r\n\r\n\t\treturn () => {\r\n\t\t\tio.disconnect();\r\n\t\t\tro.disconnect();\r\n\t\t\tscrollTarget.removeEventListener(\"scroll\", scheduleUpdate);\r\n\t\t\twindow.removeEventListener(\"resize\", scheduleUpdate);\r\n\t\t\tif (rafId.current != null) {\r\n\t\t\t\tcancelAnimationFrame(rafId.current);\r\n\t\t\t\trafId.current = null;\r\n\t\t\t}\r\n\t\t};\r\n\t\t// eslint-disable-next-line react-hooks/exhaustive-deps\r\n\t}, [ioRoot, resolvedEdge, offset, debug]);\r\n\r\n\treturn (\r\n\t\t<div\r\n\t\t\tref={rootRef}\r\n\t\t\tclassName={className}\r\n\t\t\tstyle={{\r\n\t\t\t\tdisplay: \"block\",\r\n\t\t\t\tminWidth: 0,\r\n\t\t\t\tminHeight: 0,\r\n\t\t\t\theight: \"100%\", // 부모 높이를 채우도록 설정\r\n\t\t\t\t...style,\r\n\t\t\t}}\r\n\t\t\t{...rest}\r\n\t\t>\r\n\t\t\t<div\r\n\t\t\t\tref={contentRef}\r\n\t\t\t\t// SSR/클라이언트 첫 렌더 동일 → 마운트 후에만 스타일 부여\r\n\t\t\t\tstyle={contentDynamicStyle}\r\n\t\t\t>\r\n\t\t\t\t{children}\r\n\t\t\t</div>\r\n\t\t</div>\r\n\t);\r\n};\r\n\r\nexport default FlexLayoutStickyBox;\r\n"],"mappings":"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","names":[]}
@@ -1 +0,0 @@
1
- {"version":3,"sources":["../../../src/flex-layout/components/FlexLayoutStickyBox.tsx"],"sourcesContent":["\"use client\";\r\nimport {\r\n\tCSSProperties,\r\n\tFC,\r\n\tHTMLAttributes,\r\n\tReactNode,\r\n\tRefObject,\r\n\tuseEffect,\r\n\tuseRef,\r\n\tuseState,\r\n} from \"react\";\r\n\r\ntype Edge = \"auto\" | \"top\" | \"bottom\" | \"left\" | \"right\";\r\n\r\ninterface FlexLayoutStickyBoxProps extends HTMLAttributes<HTMLDivElement> {\r\n\t/** 어느 방향으로 붙일지. 기본은 'auto' (세로 스크롤이면 top, 가로 스크롤이면 left) */\r\n\tedge?: Edge;\r\n\t/** 화면 모서리와의 여백(px). 기본 16 */\r\n\toffset?: number;\r\n\t/** 스크롤 루트. 명시 안 하면 가장 흔한 케이스인 <main> → 없으면 window(=viewport) */\r\n\tscrollRoot?: Element | null;\r\n\t/** 디버그 보조선 표시 */\r\n\tdebug?: boolean;\r\n\t/** 자식 */\r\n\tchildren: ReactNode;\r\n\r\n\ttransitionDurationMs?: number;\r\n\r\n\tonTranslateChange?: (\r\n\t\tvalue: number,\r\n\t\trootRef: RefObject<HTMLDivElement | null>,\r\n\t\tcontentRef: RefObject<HTMLDivElement | null>,\r\n\t) => void;\r\n}\r\n\r\nfunction clamp(n: number, min: number, max: number) {\r\n\treturn Math.max(min, Math.min(max, n));\r\n}\r\n\r\nfunction pickDefaultScrollRoot(): Element | null {\r\n\tif (typeof document === \"undefined\") return null;\r\n\r\n\tlet el: Element | null = document.body;\r\n\twhile (el && el !== document.documentElement && el !== document.body) {\r\n\t\tconst style = getComputedStyle(el);\r\n\t\tconst oy = style.overflowY;\r\n\t\tconst ox = style.overflowX;\r\n\t\tconst scrollable =\r\n\t\t\toy === \"auto\" ||\r\n\t\t\toy === \"scroll\" ||\r\n\t\t\tox === \"auto\" ||\r\n\t\t\tox === \"scroll\";\r\n\t\tif (scrollable) return el;\r\n\t\tel = el.parentElement;\r\n\t}\r\n\treturn null;\r\n}\r\n\r\nfunction isVerticalScroll(root: Element | null): boolean {\r\n\tif (typeof window == \"undefined\") return true;\r\n\tif (!root) {\r\n\t\treturn document.documentElement.scrollHeight > window.innerHeight + 1;\r\n\t}\r\n\tconst el = root as HTMLElement;\r\n\treturn el.scrollHeight > el.clientHeight + 1;\r\n}\r\n\r\nconst dpr = typeof window != \"undefined\" ? window.devicePixelRatio || 1 : 1;\r\nfunction quantizeToDevicePixel(n: number) {\r\n\treturn Math.round(n * dpr) / dpr;\r\n}\r\n\r\n/**\r\n * FlexLayoutStickyBox\r\n * 부모(실제 경계) 안에서만 움직이며, `transform`을 동적으로 부여해\r\n * “sticky처럼 보이도록” 만든다.\r\n *\r\n * 구조:\r\n * <div data-root> // 이 박스가 부모 경계 안에서 공간을 차지\r\n * <div data-content> // 이 박스가 transform으로 부드럽게 움직임\r\n * {children}\r\n * </div>\r\n * </div>\r\n */\r\nconst FlexLayoutStickyBox: FC<FlexLayoutStickyBoxProps> = ({\r\n\tedge = \"auto\",\r\n\toffset = 16,\r\n\tscrollRoot = null,\r\n\tdebug = false,\r\n\tchildren,\r\n\tstyle,\r\n\tclassName,\r\n\ttransitionDurationMs = 200,\r\n\tonTranslateChange = () => {},\r\n\t...rest\r\n}) => {\r\n\tconst offsetRef = useRef(offset);\r\n\tconst rootRef = useRef<HTMLDivElement>(null); // 내가 들어있는 박스(부모의 자식)\r\n\tconst contentRef = useRef<HTMLDivElement>(null); // 실제 내용\r\n\tconst mutatingRef = useRef(false);\r\n\tconst lastOffsetRef = useRef(0);\r\n\tconst [resolvedEdge, setResolvedEdge] = useState<Edge>(\"top\");\r\n\tconst rafId = useRef<number | null>(null);\r\n\r\n\t// 마운트 이후에만(클라이언트에서만) 터치 스타일을 적용\r\n\tconst [contentDynamicStyle, setContentDynamicStyle] =\r\n\t\tuseState<CSSProperties>({});\r\n\tuseEffect(() => {\r\n\t\t// if (\r\n\t\t// typeof navigator !== 'undefined' &&\r\n\t\t// (navigator.maxTouchPoints ?? 0) > 0\r\n\t\t// ) {\r\n\t\tsetContentDynamicStyle({\r\n\t\t\twillChange: \"transform\",\r\n\t\t\ttransition: `transform ${transitionDurationMs}ms linear`,\r\n\t\t});\r\n\t\t// }\r\n\t}, [transitionDurationMs]);\r\n\r\n\tuseEffect(() => {\r\n\t\toffsetRef.current = offset;\r\n\t\tscheduleUpdate();\r\n\t}, [offset]);\r\n\tconst [ioRoot, setIoRoot] = useState<Element | null>(null);\r\n\tuseEffect(() => {\r\n\t\t// CSR로 전환된 후에 반드시 최신 scroll root를 계산\r\n\t\tconst root = scrollRoot ?? pickDefaultScrollRoot();\r\n\t\tsetResolvedEdge(\r\n\t\t\tedge === \"auto\" ? (isVerticalScroll(root) ? \"top\" : \"left\") : edge,\r\n\t\t);\r\n\r\n\t\tsetIoRoot(root);\r\n\t}, [edge, scrollRoot]);\r\n\tuseEffect(() => {\r\n\t\tif (edge !== \"auto\") {\r\n\t\t\tsetResolvedEdge(edge);\r\n\t\t\treturn;\r\n\t\t}\r\n\t\tconst vertical = isVerticalScroll(ioRoot);\r\n\t\tsetResolvedEdge(vertical ? \"top\" : \"left\");\r\n\t}, [edge, ioRoot]);\r\n\r\n\tuseEffect(() => {}, []);\r\n\r\n\tconst scheduleUpdate = () => {\r\n\t\tif (rafId.current != null) return;\r\n\t\trafId.current = requestAnimationFrame(() => {\r\n\t\t\trafId.current = null;\r\n\t\t\tdoUpdate();\r\n\t\t});\r\n\t};\r\n\r\n\tconst doUpdate = () => {\r\n\t\tif (mutatingRef.current) return;\r\n\t\tmutatingRef.current = true;\r\n\r\n\t\tconst rootEl = rootRef.current;\r\n\t\tconst contentEl = contentRef.current;\r\n\t\tif (!rootEl || !contentEl) {\r\n\t\t\tmutatingRef.current = false;\r\n\t\t\treturn;\r\n\t\t}\r\n\r\n\t\tconst parentEl = rootEl.parentElement;\r\n\t\tif (!parentEl) {\r\n\t\t\tmutatingRef.current = false;\r\n\t\t\treturn;\r\n\t\t}\r\n\r\n\t\tconst rootBounds =\r\n\t\t\tioRoot && \"getBoundingClientRect\" in ioRoot\r\n\t\t\t\t? (ioRoot as Element).getBoundingClientRect()\r\n\t\t\t\t: new DOMRect(0, 0, window.innerWidth, window.innerHeight);\r\n\r\n\t\tconst parentRect = parentEl.getBoundingClientRect();\r\n\t\tconst contentRect = contentEl.getBoundingClientRect();\r\n\r\n\t\tlet newOffset = 0;\r\n\r\n\t\tif (resolvedEdge === \"top\" || resolvedEdge === \"bottom\") {\r\n\t\t\tconst maxTranslate = Math.max(\r\n\t\t\t\t0,\r\n\t\t\t\tparentRect.height - contentRect.height,\r\n\t\t\t);\r\n\t\t\tlet desiredTop = 0;\r\n\r\n\t\t\tif (resolvedEdge === \"top\") {\r\n\t\t\t\tdesiredTop =\r\n\t\t\t\t\trootBounds.top + offsetRef.current - parentRect.top;\r\n\t\t\t} else {\r\n\t\t\t\t// bottom\r\n\t\t\t\tconst targetBottomFromParentTop =\r\n\t\t\t\t\tMath.min(\r\n\t\t\t\t\t\tparentRect.bottom,\r\n\t\t\t\t\t\trootBounds.bottom - offsetRef.current,\r\n\t\t\t\t\t) - parentRect.top;\r\n\t\t\t\tdesiredTop = targetBottomFromParentTop - contentRect.height;\r\n\t\t\t}\r\n\t\t\tnewOffset = clamp(desiredTop, 0, maxTranslate);\r\n\t\t} else {\r\n\t\t\t// left or right\r\n\t\t\tconst maxTranslate = Math.max(\r\n\t\t\t\t0,\r\n\t\t\t\tparentRect.width - contentRect.width,\r\n\t\t\t);\r\n\t\t\tlet desiredLeft = 0;\r\n\r\n\t\t\tif (resolvedEdge === \"left\") {\r\n\t\t\t\tdesiredLeft =\r\n\t\t\t\t\trootBounds.left + offsetRef.current - parentRect.left;\r\n\t\t\t} else {\r\n\t\t\t\t// right\r\n\t\t\t\tconst targetRightFromParentLeft =\r\n\t\t\t\t\tMath.min(\r\n\t\t\t\t\t\tparentRect.right,\r\n\t\t\t\t\t\trootBounds.right - offsetRef.current,\r\n\t\t\t\t\t) - parentRect.left;\r\n\t\t\t\tdesiredLeft = targetRightFromParentLeft - contentRect.width;\r\n\t\t\t}\r\n\t\t\tnewOffset = clamp(desiredLeft, 0, maxTranslate);\r\n\t\t}\r\n\r\n\t\tconst nextOffset = quantizeToDevicePixel(newOffset);\r\n\r\n\t\t// 변화가 거의 없으면 업데이트 건너뛰기 (미세한 떨림 방지)\r\n\t\tif (Math.abs(lastOffsetRef.current - nextOffset) > 0.5) {\r\n\t\t\tif (resolvedEdge === \"top\" || resolvedEdge === \"bottom\") {\r\n\t\t\t\tcontentEl.style.transform = `translateY(${nextOffset}px)`;\r\n\t\t\t} else {\r\n\t\t\t\tcontentEl.style.transform = `translateX(${nextOffset}px)`;\r\n\t\t\t}\r\n\t\t\tlastOffsetRef.current = nextOffset;\r\n\t\t\tonTranslateChange(nextOffset, rootRef, contentRef);\r\n\t\t}\r\n\r\n\t\tif (debug) {\r\n\t\t\trootEl.style.outline = \"1px dashed rgba(0,0,0,.2)\";\r\n\t\t\tcontentEl.style.outline = \"1px solid rgba(0,128,255,.35)\";\r\n\t\t}\r\n\r\n\t\tqueueMicrotask(() => {\r\n\t\t\tmutatingRef.current = false;\r\n\t\t});\r\n\t};\r\n\r\n\t// IntersectionObserver, ResizeObserver, Event Listeners 설정\r\n\tuseEffect(() => {\r\n\t\tif (typeof window == \"undefined\") return;\r\n\t\tconst rootEl = rootRef.current;\r\n\t\tif (!rootEl) return;\r\n\r\n\t\tconst parentEl = rootEl.parentElement;\r\n\r\n\t\tconsole.log(parentEl);\r\n\t\tif (!parentEl) return;\r\n\r\n\t\tconst targets: Element[] = [parentEl];\r\n\r\n\t\tconst observerCallback = () => {\r\n\t\t\tif (!mutatingRef.current) scheduleUpdate();\r\n\t\t};\r\n\r\n\t\tconst io = new IntersectionObserver(observerCallback, {\r\n\t\t\troot: ioRoot instanceof Element ? ioRoot : null,\r\n\t\t\tthreshold: 0,\r\n\t\t\trootMargin: \"1px\",\r\n\t\t});\r\n\r\n\t\tconst ro = new ResizeObserver(observerCallback);\r\n\r\n\t\ttargets.forEach((t) => io.observe(t));\r\n\t\tro.observe(parentEl);\r\n\t\tif (contentRef.current) {\r\n\t\t\tro.observe(contentRef.current);\r\n\t\t}\r\n\r\n\t\tconst scrollTarget = ioRoot || window;\r\n\t\tscrollTarget.addEventListener(\"scroll\", scheduleUpdate, {\r\n\t\t\tpassive: true,\r\n\t\t});\r\n\t\twindow.addEventListener(\"resize\", scheduleUpdate);\r\n\r\n\t\t// 최초 1회 계산\r\n\t\tscheduleUpdate();\r\n\r\n\t\treturn () => {\r\n\t\t\tio.disconnect();\r\n\t\t\tro.disconnect();\r\n\t\t\tscrollTarget.removeEventListener(\"scroll\", scheduleUpdate);\r\n\t\t\twindow.removeEventListener(\"resize\", scheduleUpdate);\r\n\t\t\tif (rafId.current != null) {\r\n\t\t\t\tcancelAnimationFrame(rafId.current);\r\n\t\t\t\trafId.current = null;\r\n\t\t\t}\r\n\t\t};\r\n\t\t// eslint-disable-next-line react-hooks/exhaustive-deps\r\n\t}, [ioRoot, resolvedEdge, offset, debug]);\r\n\r\n\treturn (\r\n\t\t<div\r\n\t\t\tref={rootRef}\r\n\t\t\tclassName={className}\r\n\t\t\tstyle={{\r\n\t\t\t\tdisplay: \"block\",\r\n\t\t\t\tminWidth: 0,\r\n\t\t\t\tminHeight: 0,\r\n\t\t\t\theight: \"100%\", // 부모 높이를 채우도록 설정\r\n\t\t\t\t...style,\r\n\t\t\t}}\r\n\t\t\t{...rest}\r\n\t\t>\r\n\t\t\t<div\r\n\t\t\t\tref={contentRef}\r\n\t\t\t\t// SSR/클라이언트 첫 렌더 동일 → 마운트 후에만 스타일 부여\r\n\t\t\t\tstyle={contentDynamicStyle}\r\n\t\t\t>\r\n\t\t\t\t{children}\r\n\t\t\t</div>\r\n\t\t</div>\r\n\t);\r\n};\r\n\r\nexport default FlexLayoutStickyBox;\r\n"],"mappings":"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","names":[]}
@@ -1 +0,0 @@
1
- {"version":3,"sources":["../../../src/flex-layout/components/index.ts"],"sourcesContent":["// src/flex-layout/components/index.ts\r\n\r\nexport { default as FlexLayout } from \"./FlexLayout\";\r\nexport { default as FlexLayoutContainer } from \"./FlexLayoutContainer\";\r\nexport { default as FlexLayoutResizePanel } from \"./FlexLayoutResizePanel\";\r\nexport { default as FlexLayoutSplitScreen } from \"./FlexLayoutSplitScreen\";\r\nexport { default as FlexLayoutSplitScreenDragBox } from \"./FlexLayoutSplitScreenDragBox\";\r\nexport { default as FlexLayoutSplitScreenScrollBox } from \"./FlexLayoutSplitScreenScrollBox\";\r\nexport { default as FlexLayoutStickyBox } from \"./FlexLayoutStickyBox\";\r\n"],"mappings":";;;;;;;;;;;;;;;;;;;;;;;;;;;;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAEA,wBAAsC;AACtC,iCAA+C;AAC/C,mCAAiD;AACjD,mCAAiD;AACjD,0CAAwD;AACxD,4CAA0D;AAC1D,iCAA+C;","names":[]}
@@ -1 +0,0 @@
1
- {"version":3,"sources":["../../../src/flex-layout/components/index.ts"],"sourcesContent":["// src/flex-layout/components/index.ts\r\n\r\nexport { default as FlexLayout } from \"./FlexLayout\";\r\nexport { default as FlexLayoutContainer } from \"./FlexLayoutContainer\";\r\nexport { default as FlexLayoutResizePanel } from \"./FlexLayoutResizePanel\";\r\nexport { default as FlexLayoutSplitScreen } from \"./FlexLayoutSplitScreen\";\r\nexport { default as FlexLayoutSplitScreenDragBox } from \"./FlexLayoutSplitScreenDragBox\";\r\nexport { default as FlexLayoutSplitScreenScrollBox } from \"./FlexLayoutSplitScreenScrollBox\";\r\nexport { default as FlexLayoutStickyBox } from \"./FlexLayoutStickyBox\";\r\n"],"mappings":"AAEA,SAAoB,WAAXA,gBAA6B;AACtC,SAAoB,WAAXA,gBAAsC;AAC/C,SAAoB,WAAXA,gBAAwC;AACjD,SAAoB,WAAXA,gBAAwC;AACjD,SAAoB,WAAXA,gBAA+C;AACxD,SAAoB,WAAXA,gBAAiD;AAC1D,SAAoB,WAAXA,gBAAsC;","names":["default"]}
@@ -1 +0,0 @@
1
- {"version":3,"sources":["../../../src/flex-layout/hooks/index.ts"],"sourcesContent":["export * from \"./useDrag\";\r\nexport * from \"./useListPaging\";\r\n"],"mappings":";;;;;;;;;;;;;;;AAAA;AAAA;AAAA,0BAAc,sBAAd;AACA,0BAAc,4BADd;","names":[]}
@@ -1 +0,0 @@
1
- {"version":3,"sources":["../../../src/flex-layout/hooks/index.ts"],"sourcesContent":["export * from \"./useDrag\";\r\nexport * from \"./useListPaging\";\r\n"],"mappings":"AAAA,cAAc;AACd,cAAc;","names":[]}
@@ -1 +0,0 @@
1
- {"version":3,"sources":["../../../src/flex-layout/hooks/useDrag.ts"],"sourcesContent":["import equal from \"fast-deep-equal\";\r\nimport {\r\n\tMouseEvent,\r\n\tReactElement,\r\n\tRefObject,\r\n\tTouchEvent,\r\n\tuseCallback,\r\n\tuseEffect,\r\n\tuseRef,\r\n\tuseState,\r\n} from \"react\";\r\nimport {\r\n\tanimationFrameScheduler,\r\n\tauditTime,\r\n\tBehaviorSubject,\r\n\tdistinctUntilChanged,\r\n\tmap,\r\n\tSubject,\r\n} from \"rxjs\";\r\nimport { DropDocumentOutsideOption } from \"../components/FlexLayoutSplitScreenDragBox\";\r\nimport { getClientXy } from \"../utils/FlexLayoutUtils\";\r\nexport interface DragStateType {\r\n\tisDragging: boolean;\r\n\tisDrop: boolean;\r\n\tnavigationTitle?: string;\r\n\tchildren?: ReactElement;\r\n\tcontainerName: string;\r\n\tx: number;\r\n\ty: number;\r\n\tdropDocumentOutsideOption?: DropDocumentOutsideOption;\r\n\tdropEndCallback?: ({\r\n\t\tx,\r\n\t\ty,\r\n\t\tcontainerName,\r\n\t}: {\r\n\t\tx: number;\r\n\t\ty: number;\r\n\t\tcontainerName: string;\r\n\t}) => void;\r\n\tscreenKey?: string;\r\n\tcustomData?: Record<string, string | number | boolean | undefined>;\r\n}\r\nexport type PositionName =\r\n\t| \"centerBoundary\"\r\n\t| \"leftBoundary\"\r\n\t| \"rightBoundary\"\r\n\t| \"topBoundary\"\r\n\t| \"bottomBoundary\";\r\n\r\nexport interface DragStateResultType extends DragStateType {\r\n\tpositionName: PositionName;\r\n\tisOver: boolean;\r\n}\r\nexport const dragStateSubject = new Subject<DragStateType>();\r\n/**\r\n * @deprecated Use `dragStateSubject` instead. This alias will be removed in a future release.\r\n */\r\nexport const dragState = dragStateSubject;\r\n\r\nexport const isResizingSubject = new BehaviorSubject<boolean>(false);\r\n\r\nconst filterChildren = (obj: any) => {\r\n\t// 객체 복사 후 children 속성 제거\r\n\tconst { children, ...rest } = obj || {};\r\n\treturn rest;\r\n};\r\n\r\nexport const useDragCapture = (targetRef: RefObject<HTMLElement | null>) => {\r\n\tconst [state, setState] = useState<DragStateResultType | null>(null);\r\n\r\n\tuseEffect(() => {\r\n\t\tconst subscription = dragStateSubject\r\n\t\t\t.pipe(\r\n\t\t\t\tauditTime(0, animationFrameScheduler),\r\n\t\t\t\tmap((value) => {\r\n\t\t\t\t\tif (!targetRef || !targetRef.current) return null;\r\n\r\n\t\t\t\t\tconst { x, y } = value;\r\n\t\t\t\t\tconst rect = targetRef.current.getBoundingClientRect();\r\n\t\t\t\t\tconst {\r\n\t\t\t\t\t\twidth,\r\n\t\t\t\t\t\theight,\r\n\t\t\t\t\t\tx: rectX,\r\n\t\t\t\t\t\ty: rectY,\r\n\t\t\t\t\t\tright,\r\n\t\t\t\t\t\tbottom,\r\n\t\t\t\t\t} = rect;\r\n\r\n\t\t\t\t\tlet isOver = false;\r\n\t\t\t\t\tif (x < rectX || x > right || y < rectY || y > bottom) {\r\n\t\t\t\t\t\tisOver = true;\r\n\t\t\t\t\t}\r\n\r\n\t\t\t\t\tconst leftBoundary = rectX + width * 0.2;\r\n\t\t\t\t\tconst rightBoundary = right - width * 0.2;\r\n\t\t\t\t\tconst topBoundary = rectY + height * 0.2;\r\n\t\t\t\t\tconst bottomBoundary = bottom - height * 0.2;\r\n\r\n\t\t\t\t\tlet position = \"centerBoundary\";\r\n\t\t\t\t\tif (x < leftBoundary) {\r\n\t\t\t\t\t\tposition = \"leftBoundary\";\r\n\t\t\t\t\t} else if (x > rightBoundary) {\r\n\t\t\t\t\t\tposition = \"rightBoundary\";\r\n\t\t\t\t\t} else if (y < topBoundary) {\r\n\t\t\t\t\t\tposition = \"topBoundary\";\r\n\t\t\t\t\t} else if (y > bottomBoundary) {\r\n\t\t\t\t\t\tposition = \"bottomBoundary\";\r\n\t\t\t\t\t}\r\n\r\n\t\t\t\t\treturn {\r\n\t\t\t\t\t\tpositionName: position as PositionName,\r\n\t\t\t\t\t\tisOver,\r\n\t\t\t\t\t\t...value,\r\n\t\t\t\t\t};\r\n\t\t\t\t}),\r\n\t\t\t\tdistinctUntilChanged((prev, curr) => {\r\n\t\t\t\t\tconst { children: prevChildren, ..._prev } = prev || {};\r\n\t\t\t\t\tconst { children: currChildren, ..._curr } = curr || {};\r\n\r\n\t\t\t\t\treturn equal(filterChildren(_prev), filterChildren(_curr));\r\n\t\t\t\t}),\r\n\t\t\t)\r\n\t\t\t.subscribe({\r\n\t\t\t\tnext: setState,\r\n\t\t\t\terror: (err) => console.error(err),\r\n\t\t\t});\r\n\r\n\t\treturn () => subscription.unsubscribe();\r\n\t}, [targetRef]);\r\n\r\n\treturn state;\r\n};\r\nexport interface DropTargetComponent {\r\n\tcontainerName: string;\r\n\tcomponent: ReactElement;\r\n\tnavigationTitle?: string;\r\n\tdropDocumentOutsideOption?: DropDocumentOutsideOption;\r\n\tscreenKey: string;\r\n}\r\nexport type DropPositionOrderName = \"before\" | \"center\" | \"after\";\r\n\r\nexport interface DropMovementEventType {\r\n\tstate: \"remove\" | \"append\" | \"change\";\r\n\ttargetParentLayoutName: string;\r\n\ttargetLayoutName: string;\r\n\ttargetContainerName: string;\r\n\ttargetComponent?: ReactElement;\r\n\tnextContainerName?: string;\r\n\tparentOrderName?: DropPositionOrderName;\r\n\torderName?: DropPositionOrderName;\r\n\tx?: number;\r\n\ty?: number;\r\n\tdropEndCallback?: ({\r\n\t\tx,\r\n\t\ty,\r\n\t\tcontainerName,\r\n\t}: {\r\n\t\tx: number;\r\n\t\ty: number;\r\n\t\tcontainerName: string;\r\n\t}) => void;\r\n\tdropTargetComponentEvent?: DropTargetComponentEvent;\r\n}\r\nexport interface DropTargetComponentEvent extends Omit<\r\n\tDropTargetComponent,\r\n\t\"containerName\" | \"component\"\r\n> {\r\n\tdirection: \"row\" | \"column\";\r\n}\r\nexport const dropMovementEventSubject = new Subject<DropMovementEventType>();\r\n\r\nexport const allSplitScreenCount = new BehaviorSubject<number>(0);\r\n\r\nexport const useDragEvents = ({\r\n\tisBlockingActiveInput = false,\r\n}: {\r\n\tisBlockingActiveInput?: boolean;\r\n}) => {\r\n\tconst dragResumeTimer = useRef<ReturnType<typeof setTimeout> | null>(null);\r\n\tconst dragStartDelayTimer = useRef<ReturnType<typeof setTimeout> | null>(\r\n\t\tnull,\r\n\t);\r\n\r\n\tconst scrollThreshold = 10; // 이동 거리 임계값\r\n\r\n\tconst isScrolling = useRef<boolean>(false);\r\n\tconst isPending = useRef(false);\r\n\tconst isMouseDown = useRef(false);\r\n\tconst isDragging = useRef(false); // 드래그 상태 플래그\r\n\tconst touchStartX = useRef<number>(0);\r\n\tconst touchStartY = useRef<number>(0);\r\n\r\n\tuseEffect(() => {\r\n\t\treturn () => {\r\n\t\t\tif (dragResumeTimer.current) {\r\n\t\t\t\tclearTimeout(dragResumeTimer.current);\r\n\t\t\t\tdragResumeTimer.current = null;\r\n\t\t\t}\r\n\t\t\tif (dragStartDelayTimer.current) {\r\n\t\t\t\tclearTimeout(dragStartDelayTimer.current);\r\n\t\t\t\tdragStartDelayTimer.current = null;\r\n\t\t\t}\r\n\t\t};\r\n\t}, []);\r\n\r\n\tconst handleStart = useCallback(\r\n\t\t({\r\n\t\t\tevent: _event,\r\n\t\t\tdragStartCallback,\r\n\t\t}: {\r\n\t\t\tevent: MouseEvent | TouchEvent | Event;\r\n\t\t\tdragStartCallback: ({ x, y }: { x: number; y: number }) => void;\r\n\t\t}) => {\r\n\t\t\tconst event = _event instanceof Event ? _event : _event.nativeEvent;\r\n\r\n\t\t\t// 기존 타이머가 있다면 정리\r\n\t\t\tif (dragResumeTimer.current) {\r\n\t\t\t\tclearTimeout(dragResumeTimer.current);\r\n\t\t\t\tdragResumeTimer.current = null;\r\n\t\t\t}\r\n\t\t\tif (dragStartDelayTimer.current) {\r\n\t\t\t\tclearTimeout(dragStartDelayTimer.current);\r\n\t\t\t\tdragStartDelayTimer.current = null;\r\n\t\t\t}\r\n\r\n\t\t\tif (\r\n\t\t\t\t(event.target as HTMLElement).contentEditable === \"true\" ||\r\n\t\t\t\t(isBlockingActiveInput &&\r\n\t\t\t\t\tdocument.activeElement === event.target)\r\n\t\t\t) {\r\n\t\t\t\treturn;\r\n\t\t\t}\r\n\t\t\tif (event.cancelable && !(event instanceof globalThis.TouchEvent)) {\r\n\t\t\t\tevent.preventDefault(); // cancelable=false 면 자동 skip\r\n\t\t\t}\r\n\r\n\t\t\tisPending.current = true;\r\n\t\t\tisMouseDown.current = true;\r\n\t\t\tisScrolling.current = false;\r\n\r\n\t\t\t// if (event instanceof globalThis.TouchEvent) {\r\n\t\t\t// \tconst touch = event.touches[0];\r\n\t\t\t// \ttouchStartX.current = touch.clientX;\r\n\t\t\t// \ttouchStartY.current = touch.clientY;\r\n\t\t\t// } else if (event instanceof globalThis.MouseEvent) {\r\n\t\t\t// \ttouchStartX.current = event.clientX;\r\n\t\t\t// \ttouchStartY.current = event.clientY;\r\n\t\t\t// }\r\n\r\n\t\t\tconst xy = getClientXy(event);\r\n\t\t\tif (!xy) return;\r\n\t\t\ttouchStartX.current = xy.clientX;\r\n\t\t\ttouchStartY.current = xy.clientY;\r\n\r\n\t\t\tif (\r\n\t\t\t\tevent.type.toLowerCase().startsWith(\"touch\") ||\r\n\t\t\t\tevent instanceof globalThis.TouchEvent\r\n\t\t\t) {\r\n\t\t\t\tisPending.current = false;\r\n\t\t\t\tisDragging.current = true;\r\n\r\n\t\t\t\tdragStartCallback({ x: xy.clientX, y: xy.clientY });\r\n\t\t\t\treturn;\r\n\t\t\t}\r\n\r\n\t\t\t//event.preventDefault();\r\n\t\t\tdragStartDelayTimer.current = setTimeout(() => {\r\n\t\t\t\tif (!isPending.current || isScrolling.current) return; // 스크롤 중이면 드래그 취소\r\n\t\t\t\tisPending.current = false;\r\n\t\t\t\tisDragging.current = true;\r\n\r\n\t\t\t\tconst xy = getClientXy(event);\r\n\t\t\t\tif (!xy) return;\r\n\r\n\t\t\t\tconst { clientX, clientY } = xy;\r\n\r\n\t\t\t\tdragStartCallback({ x: clientX, y: clientY });\r\n\t\t\t}, 300);\r\n\t\t},\r\n\t\t[isBlockingActiveInput],\r\n\t);\r\n\r\n\tconst handleMove = useCallback(\r\n\t\t({\r\n\t\t\tevent: _event,\r\n\t\t\tnotDragCallback,\r\n\t\t\tdragStartCallback,\r\n\t\t\tmoveingCallback,\r\n\t\t}: {\r\n\t\t\tevent: MouseEvent | TouchEvent | Event;\r\n\t\t\tnotDragCallback?: ({ x, y }: { x: number; y: number }) => void;\r\n\t\t\tdragStartCallback: ({ x, y }: { x: number; y: number }) => void;\r\n\t\t\tmoveingCallback: ({ x, y }: { x: number; y: number }) => void;\r\n\t\t}) => {\r\n\t\t\tif (!isMouseDown.current) return;\r\n\t\t\tconst event = _event instanceof Event ? _event : _event.nativeEvent;\r\n\r\n\t\t\tconst xy = getClientXy(event);\r\n\t\t\tif (!xy) return;\r\n\t\t\tconst { clientX, clientY } = xy;\r\n\t\t\tconst deltaX = Math.abs(clientX - touchStartX.current);\r\n\t\t\tconst deltaY = Math.abs(clientY - touchStartY.current);\r\n\r\n\t\t\tif (\r\n\t\t\t\tisPending.current &&\r\n\t\t\t\t(event.type.toLowerCase().startsWith(\"touch\") ||\r\n\t\t\t\t\tevent instanceof globalThis.TouchEvent) &&\r\n\t\t\t\t(deltaX > scrollThreshold || deltaY > scrollThreshold)\r\n\t\t\t) {\r\n\t\t\t\tif (dragStartDelayTimer.current) {\r\n\t\t\t\t\tclearTimeout(dragStartDelayTimer.current);\r\n\t\t\t\t\tdragStartDelayTimer.current = null;\r\n\t\t\t\t}\r\n\r\n\t\t\t\tisScrolling.current = true; // 스크롤 중으로 설정\r\n\t\t\t\tisPending.current = false; // 드래그 취소\r\n\t\t\t\tisDragging.current = false;\r\n\r\n\t\t\t\tif (notDragCallback)\r\n\t\t\t\t\tnotDragCallback({ x: clientX, y: clientY });\r\n\t\t\t\t//if (clonedNodeRef.current) clonedNodeRef.current.remove();\r\n\r\n\t\t\t\tif (dragResumeTimer.current) {\r\n\t\t\t\t\tclearTimeout(dragResumeTimer.current);\r\n\t\t\t\t\tdragResumeTimer.current = null;\r\n\t\t\t\t}\r\n\t\t\t\tdragResumeTimer.current = setTimeout(() => {\r\n\t\t\t\t\tif (!isMouseDown.current) return;\r\n\t\t\t\t\t// if (dragStartCallback)\r\n\t\t\t\t\t// \tdragStartCallback({ x: clientX, y: clientY });\r\n\t\t\t\t\t// isPending.current = true;\r\n\t\t\t\t\t// isScrolling.current = false;\r\n\t\t\t\t\t// handleStart({ event: _event, dragStartCallback });\r\n\r\n\t\t\t\t\ttouchStartX.current = clientX;\r\n\t\t\t\t\ttouchStartY.current = clientY;\r\n\t\t\t\t\tisPending.current = true;\r\n\t\t\t\t\tisScrolling.current = false;\r\n\t\t\t\t\thandleStart({ event: _event, dragStartCallback });\r\n\t\t\t\t}, 400);\r\n\t\t\t\treturn;\r\n\t\t\t}\r\n\r\n\t\t\tif (!isDragging.current || isPending.current) return; // 드래그 중이 아닐 경우 무시\r\n\r\n\t\t\tmoveingCallback({ x: clientX, y: clientY });\r\n\t\t},\r\n\t\t[isBlockingActiveInput],\r\n\t);\r\n\tconst handleEnd = useCallback(\r\n\t\t({\r\n\t\t\tevent: _event,\r\n\t\t\tdragEndCallback,\r\n\t\t}: {\r\n\t\t\tevent: MouseEvent | TouchEvent | Event;\r\n\t\t\tdragEndCallback: ({ x, y }: { x: number; y: number }) => void;\r\n\t\t}) => {\r\n\t\t\tisScrolling.current = false;\r\n\t\t\tisMouseDown.current = false;\r\n\r\n\t\t\tif (isPending.current) {\r\n\t\t\t\tisPending.current = false;\r\n\t\t\t\tif (dragStartDelayTimer.current) {\r\n\t\t\t\t\tclearTimeout(dragStartDelayTimer.current);\r\n\t\t\t\t\tdragStartDelayTimer.current = null;\r\n\t\t\t\t}\r\n\t\t\t\treturn;\r\n\t\t\t}\r\n\t\t\tconst event = _event instanceof Event ? _event : _event.nativeEvent;\r\n\r\n\t\t\tif (!isDragging.current) return; // 드래그 중이 아닐 경우 무시\r\n\r\n\t\t\tisDragging.current = false; // 드래그 종료\r\n\r\n\t\t\tconst xy = getClientXy(event);\r\n\t\t\tif (!xy) return;\r\n\r\n\t\t\tconst { clientX, clientY } = xy;\r\n\r\n\t\t\tdragEndCallback({ x: clientX, y: clientY });\r\n\t\t\t// const href = hrefUrlRef.current;\r\n\r\n\t\t\t// if (clonedNodeRef.current) clonedNodeRef.current.remove();\r\n\t\t\t// //console.log(clientX, clientY);\r\n\t\t\t// if (\r\n\t\t\t// dropDocumentOutsideOption &&\r\n\t\t\t// isDocumentOut({ x: clientX, y: clientY })\r\n\t\t\t// ) {\r\n\t\t\t// if (\r\n\t\t\t// dropDocumentOutsideOption.isNewTap ||\r\n\t\t\t// (!dropDocumentOutsideOption.widthRatio &&\r\n\t\t\t// !dropDocumentOutsideOption.heightRatio)\r\n\t\t\t// ) {\r\n\t\t\t// window.open(href, '_blank');\r\n\t\t\t// } else {\r\n\t\t\t// const width =\r\n\t\t\t// window.innerWidth *\r\n\t\t\t// (dropDocumentOutsideOption.widthRatio || 1);\r\n\t\t\t// const height =\r\n\t\t\t// window.innerHeight *\r\n\t\t\t// (dropDocumentOutsideOption.heightRatio || 1);\r\n\t\t\t// window.open(\r\n\t\t\t// href,\r\n\t\t\t// '_blank',\r\n\t\t\t// `width=${width},height=${height},left=${window.screenLeft - clientX * -1 - width},top=${window.screenTop + clientY}`\r\n\t\t\t// );\r\n\t\t\t// }\r\n\t\t\t// }\r\n\r\n\t\t\t// dragState.next({\r\n\t\t\t// isDragging: false,\r\n\t\t\t// isDrop: true,\r\n\t\t\t// navigationTitle,\r\n\t\t\t// children: targetComponent,\r\n\t\t\t// x: clientX,\r\n\t\t\t// y: clientY,\r\n\t\t\t// containerName,\r\n\t\t\t// dropDocumentOutsideOption,\r\n\t\t\t// dropEndCallback,\r\n\t\t\t// screenKey,\r\n\t\t\t// customData,\r\n\t\t\t// });\r\n\t\t\t//if (dropEndCallback) dropEndCallback({ x: clientX, y: clientY });\r\n\t\t},\r\n\t\t[isBlockingActiveInput],\r\n\t);\r\n\r\n\treturn {\r\n\t\thandleStart,\r\n\t\thandleMove,\r\n\t\thandleEnd,\r\n\t};\r\n};\r\n\r\nexport type FolderEventType = {\r\n\ttype: \"new\" | \"sort\" | \"title\" | \"delete\" | \"insert\" | \"update\" | \"next\";\r\n\tisFolder: boolean;\r\n\ttitle: string;\r\n\tsort?: number;\r\n\tparentId?: string;\r\n\tid?: string;\r\n\tnewData?: any;\r\n};\r\n\r\nexport const folderEventSubject = new Subject<FolderEventType>();\r\n\r\nexport const setFolderEvent = (newValue: FolderEventType) => {\r\n\tfolderEventSubject.next(newValue);\r\n};\r\n\r\nexport const useFolderEvent = () => {\r\n\tconst [folderEvent, setFolderEvent] = useState<FolderEventType | null>(\r\n\t\tnull,\r\n\t);\r\n\tuseEffect(() => {\r\n\t\tconst subscription = folderEventSubject.subscribe((e) => {\r\n\t\t\tif (!e) return;\r\n\t\t\tsetFolderEvent(e);\r\n\t\t});\r\n\r\n\t\treturn () => {\r\n\t\t\tif (subscription) {\r\n\t\t\t\tsubscription.unsubscribe();\r\n\t\t\t}\r\n\t\t};\r\n\t}, []);\r\n\r\n\treturn { folderEvent };\r\n};\r\n"],"mappings":"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","names":["equal","xy","setFolderEvent"]}
@@ -1 +0,0 @@
1
- {"version":3,"sources":["../../../src/flex-layout/hooks/useDrag.ts"],"sourcesContent":["import equal from \"fast-deep-equal\";\r\nimport {\r\n\tMouseEvent,\r\n\tReactElement,\r\n\tRefObject,\r\n\tTouchEvent,\r\n\tuseCallback,\r\n\tuseEffect,\r\n\tuseRef,\r\n\tuseState,\r\n} from \"react\";\r\nimport {\r\n\tanimationFrameScheduler,\r\n\tauditTime,\r\n\tBehaviorSubject,\r\n\tdistinctUntilChanged,\r\n\tmap,\r\n\tSubject,\r\n} from \"rxjs\";\r\nimport { DropDocumentOutsideOption } from \"../components/FlexLayoutSplitScreenDragBox\";\r\nimport { getClientXy } from \"../utils/FlexLayoutUtils\";\r\nexport interface DragStateType {\r\n\tisDragging: boolean;\r\n\tisDrop: boolean;\r\n\tnavigationTitle?: string;\r\n\tchildren?: ReactElement;\r\n\tcontainerName: string;\r\n\tx: number;\r\n\ty: number;\r\n\tdropDocumentOutsideOption?: DropDocumentOutsideOption;\r\n\tdropEndCallback?: ({\r\n\t\tx,\r\n\t\ty,\r\n\t\tcontainerName,\r\n\t}: {\r\n\t\tx: number;\r\n\t\ty: number;\r\n\t\tcontainerName: string;\r\n\t}) => void;\r\n\tscreenKey?: string;\r\n\tcustomData?: Record<string, string | number | boolean | undefined>;\r\n}\r\nexport type PositionName =\r\n\t| \"centerBoundary\"\r\n\t| \"leftBoundary\"\r\n\t| \"rightBoundary\"\r\n\t| \"topBoundary\"\r\n\t| \"bottomBoundary\";\r\n\r\nexport interface DragStateResultType extends DragStateType {\r\n\tpositionName: PositionName;\r\n\tisOver: boolean;\r\n}\r\nexport const dragStateSubject = new Subject<DragStateType>();\r\n/**\r\n * @deprecated Use `dragStateSubject` instead. This alias will be removed in a future release.\r\n */\r\nexport const dragState = dragStateSubject;\r\n\r\nexport const isResizingSubject = new BehaviorSubject<boolean>(false);\r\n\r\nconst filterChildren = (obj: any) => {\r\n\t// 객체 복사 후 children 속성 제거\r\n\tconst { children, ...rest } = obj || {};\r\n\treturn rest;\r\n};\r\n\r\nexport const useDragCapture = (targetRef: RefObject<HTMLElement | null>) => {\r\n\tconst [state, setState] = useState<DragStateResultType | null>(null);\r\n\r\n\tuseEffect(() => {\r\n\t\tconst subscription = dragStateSubject\r\n\t\t\t.pipe(\r\n\t\t\t\tauditTime(0, animationFrameScheduler),\r\n\t\t\t\tmap((value) => {\r\n\t\t\t\t\tif (!targetRef || !targetRef.current) return null;\r\n\r\n\t\t\t\t\tconst { x, y } = value;\r\n\t\t\t\t\tconst rect = targetRef.current.getBoundingClientRect();\r\n\t\t\t\t\tconst {\r\n\t\t\t\t\t\twidth,\r\n\t\t\t\t\t\theight,\r\n\t\t\t\t\t\tx: rectX,\r\n\t\t\t\t\t\ty: rectY,\r\n\t\t\t\t\t\tright,\r\n\t\t\t\t\t\tbottom,\r\n\t\t\t\t\t} = rect;\r\n\r\n\t\t\t\t\tlet isOver = false;\r\n\t\t\t\t\tif (x < rectX || x > right || y < rectY || y > bottom) {\r\n\t\t\t\t\t\tisOver = true;\r\n\t\t\t\t\t}\r\n\r\n\t\t\t\t\tconst leftBoundary = rectX + width * 0.2;\r\n\t\t\t\t\tconst rightBoundary = right - width * 0.2;\r\n\t\t\t\t\tconst topBoundary = rectY + height * 0.2;\r\n\t\t\t\t\tconst bottomBoundary = bottom - height * 0.2;\r\n\r\n\t\t\t\t\tlet position = \"centerBoundary\";\r\n\t\t\t\t\tif (x < leftBoundary) {\r\n\t\t\t\t\t\tposition = \"leftBoundary\";\r\n\t\t\t\t\t} else if (x > rightBoundary) {\r\n\t\t\t\t\t\tposition = \"rightBoundary\";\r\n\t\t\t\t\t} else if (y < topBoundary) {\r\n\t\t\t\t\t\tposition = \"topBoundary\";\r\n\t\t\t\t\t} else if (y > bottomBoundary) {\r\n\t\t\t\t\t\tposition = \"bottomBoundary\";\r\n\t\t\t\t\t}\r\n\r\n\t\t\t\t\treturn {\r\n\t\t\t\t\t\tpositionName: position as PositionName,\r\n\t\t\t\t\t\tisOver,\r\n\t\t\t\t\t\t...value,\r\n\t\t\t\t\t};\r\n\t\t\t\t}),\r\n\t\t\t\tdistinctUntilChanged((prev, curr) => {\r\n\t\t\t\t\tconst { children: prevChildren, ..._prev } = prev || {};\r\n\t\t\t\t\tconst { children: currChildren, ..._curr } = curr || {};\r\n\r\n\t\t\t\t\treturn equal(filterChildren(_prev), filterChildren(_curr));\r\n\t\t\t\t}),\r\n\t\t\t)\r\n\t\t\t.subscribe({\r\n\t\t\t\tnext: setState,\r\n\t\t\t\terror: (err) => console.error(err),\r\n\t\t\t});\r\n\r\n\t\treturn () => subscription.unsubscribe();\r\n\t}, [targetRef]);\r\n\r\n\treturn state;\r\n};\r\nexport interface DropTargetComponent {\r\n\tcontainerName: string;\r\n\tcomponent: ReactElement;\r\n\tnavigationTitle?: string;\r\n\tdropDocumentOutsideOption?: DropDocumentOutsideOption;\r\n\tscreenKey: string;\r\n}\r\nexport type DropPositionOrderName = \"before\" | \"center\" | \"after\";\r\n\r\nexport interface DropMovementEventType {\r\n\tstate: \"remove\" | \"append\" | \"change\";\r\n\ttargetParentLayoutName: string;\r\n\ttargetLayoutName: string;\r\n\ttargetContainerName: string;\r\n\ttargetComponent?: ReactElement;\r\n\tnextContainerName?: string;\r\n\tparentOrderName?: DropPositionOrderName;\r\n\torderName?: DropPositionOrderName;\r\n\tx?: number;\r\n\ty?: number;\r\n\tdropEndCallback?: ({\r\n\t\tx,\r\n\t\ty,\r\n\t\tcontainerName,\r\n\t}: {\r\n\t\tx: number;\r\n\t\ty: number;\r\n\t\tcontainerName: string;\r\n\t}) => void;\r\n\tdropTargetComponentEvent?: DropTargetComponentEvent;\r\n}\r\nexport interface DropTargetComponentEvent extends Omit<\r\n\tDropTargetComponent,\r\n\t\"containerName\" | \"component\"\r\n> {\r\n\tdirection: \"row\" | \"column\";\r\n}\r\nexport const dropMovementEventSubject = new Subject<DropMovementEventType>();\r\n\r\nexport const allSplitScreenCount = new BehaviorSubject<number>(0);\r\n\r\nexport const useDragEvents = ({\r\n\tisBlockingActiveInput = false,\r\n}: {\r\n\tisBlockingActiveInput?: boolean;\r\n}) => {\r\n\tconst dragResumeTimer = useRef<ReturnType<typeof setTimeout> | null>(null);\r\n\tconst dragStartDelayTimer = useRef<ReturnType<typeof setTimeout> | null>(\r\n\t\tnull,\r\n\t);\r\n\r\n\tconst scrollThreshold = 10; // 이동 거리 임계값\r\n\r\n\tconst isScrolling = useRef<boolean>(false);\r\n\tconst isPending = useRef(false);\r\n\tconst isMouseDown = useRef(false);\r\n\tconst isDragging = useRef(false); // 드래그 상태 플래그\r\n\tconst touchStartX = useRef<number>(0);\r\n\tconst touchStartY = useRef<number>(0);\r\n\r\n\tuseEffect(() => {\r\n\t\treturn () => {\r\n\t\t\tif (dragResumeTimer.current) {\r\n\t\t\t\tclearTimeout(dragResumeTimer.current);\r\n\t\t\t\tdragResumeTimer.current = null;\r\n\t\t\t}\r\n\t\t\tif (dragStartDelayTimer.current) {\r\n\t\t\t\tclearTimeout(dragStartDelayTimer.current);\r\n\t\t\t\tdragStartDelayTimer.current = null;\r\n\t\t\t}\r\n\t\t};\r\n\t}, []);\r\n\r\n\tconst handleStart = useCallback(\r\n\t\t({\r\n\t\t\tevent: _event,\r\n\t\t\tdragStartCallback,\r\n\t\t}: {\r\n\t\t\tevent: MouseEvent | TouchEvent | Event;\r\n\t\t\tdragStartCallback: ({ x, y }: { x: number; y: number }) => void;\r\n\t\t}) => {\r\n\t\t\tconst event = _event instanceof Event ? _event : _event.nativeEvent;\r\n\r\n\t\t\t// 기존 타이머가 있다면 정리\r\n\t\t\tif (dragResumeTimer.current) {\r\n\t\t\t\tclearTimeout(dragResumeTimer.current);\r\n\t\t\t\tdragResumeTimer.current = null;\r\n\t\t\t}\r\n\t\t\tif (dragStartDelayTimer.current) {\r\n\t\t\t\tclearTimeout(dragStartDelayTimer.current);\r\n\t\t\t\tdragStartDelayTimer.current = null;\r\n\t\t\t}\r\n\r\n\t\t\tif (\r\n\t\t\t\t(event.target as HTMLElement).contentEditable === \"true\" ||\r\n\t\t\t\t(isBlockingActiveInput &&\r\n\t\t\t\t\tdocument.activeElement === event.target)\r\n\t\t\t) {\r\n\t\t\t\treturn;\r\n\t\t\t}\r\n\t\t\tif (event.cancelable && !(event instanceof globalThis.TouchEvent)) {\r\n\t\t\t\tevent.preventDefault(); // cancelable=false 면 자동 skip\r\n\t\t\t}\r\n\r\n\t\t\tisPending.current = true;\r\n\t\t\tisMouseDown.current = true;\r\n\t\t\tisScrolling.current = false;\r\n\r\n\t\t\t// if (event instanceof globalThis.TouchEvent) {\r\n\t\t\t// \tconst touch = event.touches[0];\r\n\t\t\t// \ttouchStartX.current = touch.clientX;\r\n\t\t\t// \ttouchStartY.current = touch.clientY;\r\n\t\t\t// } else if (event instanceof globalThis.MouseEvent) {\r\n\t\t\t// \ttouchStartX.current = event.clientX;\r\n\t\t\t// \ttouchStartY.current = event.clientY;\r\n\t\t\t// }\r\n\r\n\t\t\tconst xy = getClientXy(event);\r\n\t\t\tif (!xy) return;\r\n\t\t\ttouchStartX.current = xy.clientX;\r\n\t\t\ttouchStartY.current = xy.clientY;\r\n\r\n\t\t\tif (\r\n\t\t\t\tevent.type.toLowerCase().startsWith(\"touch\") ||\r\n\t\t\t\tevent instanceof globalThis.TouchEvent\r\n\t\t\t) {\r\n\t\t\t\tisPending.current = false;\r\n\t\t\t\tisDragging.current = true;\r\n\r\n\t\t\t\tdragStartCallback({ x: xy.clientX, y: xy.clientY });\r\n\t\t\t\treturn;\r\n\t\t\t}\r\n\r\n\t\t\t//event.preventDefault();\r\n\t\t\tdragStartDelayTimer.current = setTimeout(() => {\r\n\t\t\t\tif (!isPending.current || isScrolling.current) return; // 스크롤 중이면 드래그 취소\r\n\t\t\t\tisPending.current = false;\r\n\t\t\t\tisDragging.current = true;\r\n\r\n\t\t\t\tconst xy = getClientXy(event);\r\n\t\t\t\tif (!xy) return;\r\n\r\n\t\t\t\tconst { clientX, clientY } = xy;\r\n\r\n\t\t\t\tdragStartCallback({ x: clientX, y: clientY });\r\n\t\t\t}, 300);\r\n\t\t},\r\n\t\t[isBlockingActiveInput],\r\n\t);\r\n\r\n\tconst handleMove = useCallback(\r\n\t\t({\r\n\t\t\tevent: _event,\r\n\t\t\tnotDragCallback,\r\n\t\t\tdragStartCallback,\r\n\t\t\tmoveingCallback,\r\n\t\t}: {\r\n\t\t\tevent: MouseEvent | TouchEvent | Event;\r\n\t\t\tnotDragCallback?: ({ x, y }: { x: number; y: number }) => void;\r\n\t\t\tdragStartCallback: ({ x, y }: { x: number; y: number }) => void;\r\n\t\t\tmoveingCallback: ({ x, y }: { x: number; y: number }) => void;\r\n\t\t}) => {\r\n\t\t\tif (!isMouseDown.current) return;\r\n\t\t\tconst event = _event instanceof Event ? _event : _event.nativeEvent;\r\n\r\n\t\t\tconst xy = getClientXy(event);\r\n\t\t\tif (!xy) return;\r\n\t\t\tconst { clientX, clientY } = xy;\r\n\t\t\tconst deltaX = Math.abs(clientX - touchStartX.current);\r\n\t\t\tconst deltaY = Math.abs(clientY - touchStartY.current);\r\n\r\n\t\t\tif (\r\n\t\t\t\tisPending.current &&\r\n\t\t\t\t(event.type.toLowerCase().startsWith(\"touch\") ||\r\n\t\t\t\t\tevent instanceof globalThis.TouchEvent) &&\r\n\t\t\t\t(deltaX > scrollThreshold || deltaY > scrollThreshold)\r\n\t\t\t) {\r\n\t\t\t\tif (dragStartDelayTimer.current) {\r\n\t\t\t\t\tclearTimeout(dragStartDelayTimer.current);\r\n\t\t\t\t\tdragStartDelayTimer.current = null;\r\n\t\t\t\t}\r\n\r\n\t\t\t\tisScrolling.current = true; // 스크롤 중으로 설정\r\n\t\t\t\tisPending.current = false; // 드래그 취소\r\n\t\t\t\tisDragging.current = false;\r\n\r\n\t\t\t\tif (notDragCallback)\r\n\t\t\t\t\tnotDragCallback({ x: clientX, y: clientY });\r\n\t\t\t\t//if (clonedNodeRef.current) clonedNodeRef.current.remove();\r\n\r\n\t\t\t\tif (dragResumeTimer.current) {\r\n\t\t\t\t\tclearTimeout(dragResumeTimer.current);\r\n\t\t\t\t\tdragResumeTimer.current = null;\r\n\t\t\t\t}\r\n\t\t\t\tdragResumeTimer.current = setTimeout(() => {\r\n\t\t\t\t\tif (!isMouseDown.current) return;\r\n\t\t\t\t\t// if (dragStartCallback)\r\n\t\t\t\t\t// \tdragStartCallback({ x: clientX, y: clientY });\r\n\t\t\t\t\t// isPending.current = true;\r\n\t\t\t\t\t// isScrolling.current = false;\r\n\t\t\t\t\t// handleStart({ event: _event, dragStartCallback });\r\n\r\n\t\t\t\t\ttouchStartX.current = clientX;\r\n\t\t\t\t\ttouchStartY.current = clientY;\r\n\t\t\t\t\tisPending.current = true;\r\n\t\t\t\t\tisScrolling.current = false;\r\n\t\t\t\t\thandleStart({ event: _event, dragStartCallback });\r\n\t\t\t\t}, 400);\r\n\t\t\t\treturn;\r\n\t\t\t}\r\n\r\n\t\t\tif (!isDragging.current || isPending.current) return; // 드래그 중이 아닐 경우 무시\r\n\r\n\t\t\tmoveingCallback({ x: clientX, y: clientY });\r\n\t\t},\r\n\t\t[isBlockingActiveInput],\r\n\t);\r\n\tconst handleEnd = useCallback(\r\n\t\t({\r\n\t\t\tevent: _event,\r\n\t\t\tdragEndCallback,\r\n\t\t}: {\r\n\t\t\tevent: MouseEvent | TouchEvent | Event;\r\n\t\t\tdragEndCallback: ({ x, y }: { x: number; y: number }) => void;\r\n\t\t}) => {\r\n\t\t\tisScrolling.current = false;\r\n\t\t\tisMouseDown.current = false;\r\n\r\n\t\t\tif (isPending.current) {\r\n\t\t\t\tisPending.current = false;\r\n\t\t\t\tif (dragStartDelayTimer.current) {\r\n\t\t\t\t\tclearTimeout(dragStartDelayTimer.current);\r\n\t\t\t\t\tdragStartDelayTimer.current = null;\r\n\t\t\t\t}\r\n\t\t\t\treturn;\r\n\t\t\t}\r\n\t\t\tconst event = _event instanceof Event ? _event : _event.nativeEvent;\r\n\r\n\t\t\tif (!isDragging.current) return; // 드래그 중이 아닐 경우 무시\r\n\r\n\t\t\tisDragging.current = false; // 드래그 종료\r\n\r\n\t\t\tconst xy = getClientXy(event);\r\n\t\t\tif (!xy) return;\r\n\r\n\t\t\tconst { clientX, clientY } = xy;\r\n\r\n\t\t\tdragEndCallback({ x: clientX, y: clientY });\r\n\t\t\t// const href = hrefUrlRef.current;\r\n\r\n\t\t\t// if (clonedNodeRef.current) clonedNodeRef.current.remove();\r\n\t\t\t// //console.log(clientX, clientY);\r\n\t\t\t// if (\r\n\t\t\t// dropDocumentOutsideOption &&\r\n\t\t\t// isDocumentOut({ x: clientX, y: clientY })\r\n\t\t\t// ) {\r\n\t\t\t// if (\r\n\t\t\t// dropDocumentOutsideOption.isNewTap ||\r\n\t\t\t// (!dropDocumentOutsideOption.widthRatio &&\r\n\t\t\t// !dropDocumentOutsideOption.heightRatio)\r\n\t\t\t// ) {\r\n\t\t\t// window.open(href, '_blank');\r\n\t\t\t// } else {\r\n\t\t\t// const width =\r\n\t\t\t// window.innerWidth *\r\n\t\t\t// (dropDocumentOutsideOption.widthRatio || 1);\r\n\t\t\t// const height =\r\n\t\t\t// window.innerHeight *\r\n\t\t\t// (dropDocumentOutsideOption.heightRatio || 1);\r\n\t\t\t// window.open(\r\n\t\t\t// href,\r\n\t\t\t// '_blank',\r\n\t\t\t// `width=${width},height=${height},left=${window.screenLeft - clientX * -1 - width},top=${window.screenTop + clientY}`\r\n\t\t\t// );\r\n\t\t\t// }\r\n\t\t\t// }\r\n\r\n\t\t\t// dragState.next({\r\n\t\t\t// isDragging: false,\r\n\t\t\t// isDrop: true,\r\n\t\t\t// navigationTitle,\r\n\t\t\t// children: targetComponent,\r\n\t\t\t// x: clientX,\r\n\t\t\t// y: clientY,\r\n\t\t\t// containerName,\r\n\t\t\t// dropDocumentOutsideOption,\r\n\t\t\t// dropEndCallback,\r\n\t\t\t// screenKey,\r\n\t\t\t// customData,\r\n\t\t\t// });\r\n\t\t\t//if (dropEndCallback) dropEndCallback({ x: clientX, y: clientY });\r\n\t\t},\r\n\t\t[isBlockingActiveInput],\r\n\t);\r\n\r\n\treturn {\r\n\t\thandleStart,\r\n\t\thandleMove,\r\n\t\thandleEnd,\r\n\t};\r\n};\r\n\r\nexport type FolderEventType = {\r\n\ttype: \"new\" | \"sort\" | \"title\" | \"delete\" | \"insert\" | \"update\" | \"next\";\r\n\tisFolder: boolean;\r\n\ttitle: string;\r\n\tsort?: number;\r\n\tparentId?: string;\r\n\tid?: string;\r\n\tnewData?: any;\r\n};\r\n\r\nexport const folderEventSubject = new Subject<FolderEventType>();\r\n\r\nexport const setFolderEvent = (newValue: FolderEventType) => {\r\n\tfolderEventSubject.next(newValue);\r\n};\r\n\r\nexport const useFolderEvent = () => {\r\n\tconst [folderEvent, setFolderEvent] = useState<FolderEventType | null>(\r\n\t\tnull,\r\n\t);\r\n\tuseEffect(() => {\r\n\t\tconst subscription = folderEventSubject.subscribe((e) => {\r\n\t\t\tif (!e) return;\r\n\t\t\tsetFolderEvent(e);\r\n\t\t});\r\n\r\n\t\treturn () => {\r\n\t\t\tif (subscription) {\r\n\t\t\t\tsubscription.unsubscribe();\r\n\t\t\t}\r\n\t\t};\r\n\t}, []);\r\n\r\n\treturn { folderEvent };\r\n};\r\n"],"mappings":"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","names":["xy","setFolderEvent"]}
@@ -1 +0,0 @@
1
- {"version":3,"sources":["../../../src/flex-layout/hooks/useFlexLayoutSplitScreen.ts"],"sourcesContent":["// useFlexLayoutSplitScreen.js\r\nimport { useEffect, useRef, useState } from \"react\";\r\nimport {\r\n\tdropMovementEventSubject,\r\n\tDropTargetComponent,\r\n\tuseDragCapture,\r\n} from \"./useDrag\";\r\n\r\nexport function useFlexLayoutSplitScreen({\r\n\tisSplitInitial = false,\r\n\tparentDirection,\r\n\tdirectionInitial = \"row\",\r\n\tselfContainerName,\r\n\tparentLayoutName,\r\n\tlayoutName,\r\n}: {\r\n\tisSplitInitial: boolean;\r\n\tparentDirection?: \"row\" | \"column\" | null;\r\n\tdirectionInitial: \"row\" | \"column\";\r\n\tselfContainerName: string;\r\n\tparentLayoutName: string;\r\n\tlayoutName: string;\r\n}) {\r\n\tconst [direction, setDirection] = useState<\"row\" | \"column\">(\r\n\t\tdirectionInitial,\r\n\t);\r\n\r\n\tconst [isSplit, setIsSplit] = useState<boolean>(isSplitInitial);\r\n\tconst [boundaryContainerSize, setBoundaryContainerSize] = useState<{\r\n\t\tleft: string;\r\n\t\ttop: string;\r\n\t\twidth: string;\r\n\t\theight: string;\r\n\t} | null>(null);\r\n\tconst [centerDropTargetComponent, setCenterDropTargetComponent] = useState<\r\n\t\tDropTargetComponent[]\r\n\t>([]);\r\n\tconst [afterDropTargetComponent, setAfterDropTargetComponent] = useState<\r\n\t\tDropTargetComponent[]\r\n\t>([]);\r\n\tconst [beforeDropTargetComponent, setBeforeDropTargetComponent] = useState<\r\n\t\tDropTargetComponent[]\r\n\t>([]);\r\n\tconst layoutRef = useRef<HTMLDivElement>(null);\r\n\r\n\tconst dragState = useDragCapture(layoutRef);\r\n\r\n\tuseEffect(() => {\r\n\t\tif (!dragState) {\r\n\t\t\tsetBoundaryContainerSize(null);\r\n\t\t\treturn;\r\n\t\t}\r\n\t\tconst {\r\n\t\t\tisDrop,\r\n\t\t\tisDragging,\r\n\t\t\tpositionName,\r\n\t\t\tcontainerName,\r\n\t\t\tchildren: dropComponent,\r\n\t\t\tisOver,\r\n\t\t\tnavigationTitle,\r\n\t\t\tdropEndCallback,\r\n\t\t\tx,\r\n\t\t\ty,\r\n\t\t\tscreenKey,\r\n\t\t} = dragState;\r\n\r\n\t\tconst orderName =\r\n\t\t\tpositionName === \"leftBoundary\" || positionName === \"topBoundary\"\r\n\t\t\t\t? \"before\"\r\n\t\t\t\t: positionName === \"rightBoundary\" ||\r\n\t\t\t\t\t positionName === \"bottomBoundary\"\r\n\t\t\t\t\t? \"after\"\r\n\t\t\t\t\t: \"center\";\r\n\t\t// if (selfContainerName === containerName) {\r\n\t\t// setBoundaryContainerSize(null);\r\n\t\t// return;\r\n\t\t// }\r\n\r\n\t\tif ((isOver || isDrop) && boundaryContainerSize) {\r\n\t\t\tsetBoundaryContainerSize(null);\r\n\t\t}\r\n\r\n\t\tif (\r\n\t\t\tselfContainerName === containerName ||\r\n\t\t\tselfContainerName.startsWith(containerName + \"_\")\r\n\t\t) {\r\n\t\t\treturn;\r\n\t\t}\r\n\r\n\t\tif (isDrop && screenKey) {\r\n\t\t\t// if (isDuplication) {\r\n\t\t\t// setDuplicationInfo({ isDuplication, containerName });\r\n\t\t\t// }\r\n\t\t\t// console.log('isDuplication:::', isDuplication);\r\n\t\t\tconst dropDirection =\r\n\t\t\t\tpositionName === \"leftBoundary\" ||\r\n\t\t\t\tpositionName === \"rightBoundary\"\r\n\t\t\t\t\t? \"row\"\r\n\t\t\t\t\t: \"column\";\r\n\t\t\t// if (!parentDirection) {\r\n\t\t\t// console.log(isSplit, positionName !== 'centerBoundary', isOver);\r\n\t\t\t// }\r\n\t\t\tif (\r\n\t\t\t\t!isSplit &&\r\n\t\t\t\t!isOver\r\n\t\t\t\t//!isDuplication\r\n\t\t\t) {\r\n\t\t\t\t//setDirection(dropDirection);\r\n\t\t\t\t//if (positionName !== 'centerBoundary') {\r\n\t\t\t\tif (\r\n\t\t\t\t\tpositionName !== \"centerBoundary\" &&\r\n\t\t\t\t\tdropDirection !== parentDirection\r\n\t\t\t\t) {\r\n\t\t\t\t\tsetIsSplit(true);\r\n\t\t\t\t\tsetDirection(dropDirection);\r\n\t\t\t\t}\r\n\t\t\t\tdropMovementEventSubject.next({\r\n\t\t\t\t\tstate: \"append\",\r\n\t\t\t\t\ttargetContainerName: containerName,\r\n\t\t\t\t\ttargetParentLayoutName: parentLayoutName,\r\n\t\t\t\t\ttargetLayoutName: layoutName,\r\n\t\t\t\t\ttargetComponent: dropComponent,\r\n\t\t\t\t\torderName,\r\n\t\t\t\t\tx,\r\n\t\t\t\t\ty,\r\n\t\t\t\t\tdropEndCallback,\r\n\t\t\t\t\tdropTargetComponentEvent: {\r\n\t\t\t\t\t\tnavigationTitle,\r\n\t\t\t\t\t\tdropDocumentOutsideOption:\r\n\t\t\t\t\t\t\tdragState?.dropDocumentOutsideOption,\r\n\t\t\t\t\t\tdirection: dropDirection,\r\n\t\t\t\t\t\tscreenKey,\r\n\t\t\t\t\t},\r\n\t\t\t\t});\r\n\t\t\t\t// } else {\r\n\t\t\t\t// dropMovementEventSubject.next({\r\n\t\t\t\t// state: 'append',\r\n\t\t\t\t// targetContainerName: containerName,\r\n\t\t\t\t// targetParentLayoutName: parentLayoutName,\r\n\t\t\t\t// targetLayoutName: layoutName,\r\n\t\t\t\t// targetComponent: dropComponent,\r\n\t\t\t\t// orderName: orderName,\r\n\t\t\t\t// x,\r\n\t\t\t\t// y,\r\n\t\t\t\t// dropEndCallback,\r\n\t\t\t\t// dropTargetComponentEvent: {\r\n\t\t\t\t// navigationTitle,\r\n\t\t\t\t// dropDocumentOutsideOption:\r\n\t\t\t\t// dragState?.dropDocumentOutsideOption,\r\n\t\t\t\t// direction: direction,\r\n\t\t\t\t// },\r\n\t\t\t\t// });\r\n\t\t\t\t// }\r\n\t\t\t}\r\n\t\t\t// else if (\r\n\t\t\t// isSplit &&\r\n\t\t\t// positionName !== 'centerBoundary' &&\r\n\t\t\t// !isOver\r\n\t\t\t// ) {\r\n\t\t\t// if (!isFirstSplitUpdatedRef.current) {\r\n\t\t\t// isFirstSplitUpdatedRef.current = true;\r\n\t\t\t// return;\r\n\t\t\t// }\r\n\t\t\t// updateDropTargetComponents(\r\n\t\t\t// positionName,\r\n\t\t\t// containerName,\r\n\t\t\t// dropComponent\r\n\t\t\t// );\r\n\t\t\t// }\r\n\t\t}\r\n\t\tif (isDragging && !isSplit && !isOver) {\r\n\t\t\tconst newSize = {\r\n\t\t\t\tleft: positionName === \"rightBoundary\" ? \"50%\" : \"0\",\r\n\t\t\t\ttop: positionName === \"bottomBoundary\" ? \"50%\" : \"0\",\r\n\t\t\t\twidth:\r\n\t\t\t\t\tpositionName === \"leftBoundary\" ||\r\n\t\t\t\t\tpositionName === \"rightBoundary\"\r\n\t\t\t\t\t\t? \"50%\"\r\n\t\t\t\t\t\t: \"100%\",\r\n\t\t\t\theight:\r\n\t\t\t\t\tpositionName === \"topBoundary\" ||\r\n\t\t\t\t\tpositionName === \"bottomBoundary\"\r\n\t\t\t\t\t\t? \"50%\"\r\n\t\t\t\t\t\t: \"100%\",\r\n\t\t\t};\r\n\t\t\t// 이전 상태와 비교\r\n\t\t\tif (\r\n\t\t\t\tJSON.stringify(boundaryContainerSize) !==\r\n\t\t\t\tJSON.stringify(newSize)\r\n\t\t\t) {\r\n\t\t\t\tsetBoundaryContainerSize(newSize);\r\n\t\t\t}\r\n\t\t}\r\n\t}, [\r\n\t\tdragState,\r\n\t\tisSplit,\r\n\t\tboundaryContainerSize,\r\n\t\tparentLayoutName,\r\n\t\tlayoutName,\r\n\t\tselfContainerName,\r\n\t\tdirection,\r\n\t]);\r\n\treturn {\r\n\t\tdirection,\r\n\t\tsetDirection,\r\n\t\tisSplit,\r\n\t\tsetIsSplit,\r\n\t\tboundaryContainerSize,\r\n\t\t//setBoundaryContainerSize,\r\n\t\tcenterDropTargetComponent,\r\n\t\tafterDropTargetComponent,\r\n\t\tbeforeDropTargetComponent,\r\n\t\tsetAfterDropTargetComponent,\r\n\t\tsetBeforeDropTargetComponent,\r\n\t\tsetCenterDropTargetComponent,\r\n\t\t//dropTargetComponent,\r\n\t\t//setDropTargetComponent,\r\n\t\t//setDropPosition,\r\n\t\tisOver: dragState?.isOver,\r\n\t\tlayoutRef,\r\n\t};\r\n}\r\n"],"mappings":";;;;;;;;;;;;;;;;;;AAAA;AAAA;AAAA;AAAA;AAAA;AACA,mBAA4C;AAC5C,qBAIO;AAEA,SAAS,yBAAyB;AAAA,EACxC,iBAAiB;AAAA,EACjB;AAAA,EACA,mBAAmB;AAAA,EACnB;AAAA,EACA;AAAA,EACA;AACD,GAOG;AACF,QAAM,CAAC,WAAW,YAAY,QAAI;AAAA,IACjC;AAAA,EACD;AAEA,QAAM,CAAC,SAAS,UAAU,QAAI,uBAAkB,cAAc;AAC9D,QAAM,CAAC,uBAAuB,wBAAwB,QAAI,uBAKhD,IAAI;AACd,QAAM,CAAC,2BAA2B,4BAA4B,QAAI,uBAEhE,CAAC,CAAC;AACJ,QAAM,CAAC,0BAA0B,2BAA2B,QAAI,uBAE9D,CAAC,CAAC;AACJ,QAAM,CAAC,2BAA2B,4BAA4B,QAAI,uBAEhE,CAAC,CAAC;AACJ,QAAM,gBAAY,qBAAuB,IAAI;AAE7C,QAAM,gBAAY,+BAAe,SAAS;AAE1C,8BAAU,MAAM;AACf,QAAI,CAAC,WAAW;AACf,+BAAyB,IAAI;AAC7B;AAAA,IACD;AACA,UAAM;AAAA,MACL;AAAA,MACA;AAAA,MACA;AAAA,MACA;AAAA,MACA,UAAU;AAAA,MACV;AAAA,MACA;AAAA,MACA;AAAA,MACA;AAAA,MACA;AAAA,MACA;AAAA,IACD,IAAI;AAEJ,UAAM,YACL,iBAAiB,kBAAkB,iBAAiB,gBACjD,WACA,iBAAiB,mBAChB,iBAAiB,mBACjB,UACA;AAML,SAAK,UAAU,WAAW,uBAAuB;AAChD,+BAAyB,IAAI;AAAA,IAC9B;AAEA,QACC,sBAAsB,iBACtB,kBAAkB,WAAW,gBAAgB,GAAG,GAC/C;AACD;AAAA,IACD;AAEA,QAAI,UAAU,WAAW;AAKxB,YAAM,gBACL,iBAAiB,kBACjB,iBAAiB,kBACd,QACA;AAIJ,UACC,CAAC,WACD,CAAC,QAEA;AAGD,YACC,iBAAiB,oBACjB,kBAAkB,iBACjB;AACD,qBAAW,IAAI;AACf,uBAAa,aAAa;AAAA,QAC3B;AACA,gDAAyB,KAAK;AAAA,UAC7B,OAAO;AAAA,UACP,qBAAqB;AAAA,UACrB,wBAAwB;AAAA,UACxB,kBAAkB;AAAA,UAClB,iBAAiB;AAAA,UACjB;AAAA,UACA;AAAA,UACA;AAAA,UACA;AAAA,UACA,0BAA0B;AAAA,YACzB;AAAA,YACA,2BACC,WAAW;AAAA,YACZ,WAAW;AAAA,YACX;AAAA,UACD;AAAA,QACD,CAAC;AAAA,MAoBF;AAAA,IAgBD;AACA,QAAI,cAAc,CAAC,WAAW,CAAC,QAAQ;AACtC,YAAM,UAAU;AAAA,QACf,MAAM,iBAAiB,kBAAkB,QAAQ;AAAA,QACjD,KAAK,iBAAiB,mBAAmB,QAAQ;AAAA,QACjD,OACC,iBAAiB,kBACjB,iBAAiB,kBACd,QACA;AAAA,QACJ,QACC,iBAAiB,iBACjB,iBAAiB,mBACd,QACA;AAAA,MACL;AAEA,UACC,KAAK,UAAU,qBAAqB,MACpC,KAAK,UAAU,OAAO,GACrB;AACD,iCAAyB,OAAO;AAAA,MACjC;AAAA,IACD;AAAA,EACD,GAAG;AAAA,IACF;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,EACD,CAAC;AACD,SAAO;AAAA,IACN;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA;AAAA,IAEA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA;AAAA;AAAA;AAAA,IAIA,QAAQ,WAAW;AAAA,IACnB;AAAA,EACD;AACD;","names":[]}
@@ -1 +0,0 @@
1
- {"version":3,"sources":["../../../src/flex-layout/hooks/useFlexLayoutSplitScreen.ts"],"sourcesContent":["// useFlexLayoutSplitScreen.js\r\nimport { useEffect, useRef, useState } from \"react\";\r\nimport {\r\n\tdropMovementEventSubject,\r\n\tDropTargetComponent,\r\n\tuseDragCapture,\r\n} from \"./useDrag\";\r\n\r\nexport function useFlexLayoutSplitScreen({\r\n\tisSplitInitial = false,\r\n\tparentDirection,\r\n\tdirectionInitial = \"row\",\r\n\tselfContainerName,\r\n\tparentLayoutName,\r\n\tlayoutName,\r\n}: {\r\n\tisSplitInitial: boolean;\r\n\tparentDirection?: \"row\" | \"column\" | null;\r\n\tdirectionInitial: \"row\" | \"column\";\r\n\tselfContainerName: string;\r\n\tparentLayoutName: string;\r\n\tlayoutName: string;\r\n}) {\r\n\tconst [direction, setDirection] = useState<\"row\" | \"column\">(\r\n\t\tdirectionInitial,\r\n\t);\r\n\r\n\tconst [isSplit, setIsSplit] = useState<boolean>(isSplitInitial);\r\n\tconst [boundaryContainerSize, setBoundaryContainerSize] = useState<{\r\n\t\tleft: string;\r\n\t\ttop: string;\r\n\t\twidth: string;\r\n\t\theight: string;\r\n\t} | null>(null);\r\n\tconst [centerDropTargetComponent, setCenterDropTargetComponent] = useState<\r\n\t\tDropTargetComponent[]\r\n\t>([]);\r\n\tconst [afterDropTargetComponent, setAfterDropTargetComponent] = useState<\r\n\t\tDropTargetComponent[]\r\n\t>([]);\r\n\tconst [beforeDropTargetComponent, setBeforeDropTargetComponent] = useState<\r\n\t\tDropTargetComponent[]\r\n\t>([]);\r\n\tconst layoutRef = useRef<HTMLDivElement>(null);\r\n\r\n\tconst dragState = useDragCapture(layoutRef);\r\n\r\n\tuseEffect(() => {\r\n\t\tif (!dragState) {\r\n\t\t\tsetBoundaryContainerSize(null);\r\n\t\t\treturn;\r\n\t\t}\r\n\t\tconst {\r\n\t\t\tisDrop,\r\n\t\t\tisDragging,\r\n\t\t\tpositionName,\r\n\t\t\tcontainerName,\r\n\t\t\tchildren: dropComponent,\r\n\t\t\tisOver,\r\n\t\t\tnavigationTitle,\r\n\t\t\tdropEndCallback,\r\n\t\t\tx,\r\n\t\t\ty,\r\n\t\t\tscreenKey,\r\n\t\t} = dragState;\r\n\r\n\t\tconst orderName =\r\n\t\t\tpositionName === \"leftBoundary\" || positionName === \"topBoundary\"\r\n\t\t\t\t? \"before\"\r\n\t\t\t\t: positionName === \"rightBoundary\" ||\r\n\t\t\t\t\t positionName === \"bottomBoundary\"\r\n\t\t\t\t\t? \"after\"\r\n\t\t\t\t\t: \"center\";\r\n\t\t// if (selfContainerName === containerName) {\r\n\t\t// setBoundaryContainerSize(null);\r\n\t\t// return;\r\n\t\t// }\r\n\r\n\t\tif ((isOver || isDrop) && boundaryContainerSize) {\r\n\t\t\tsetBoundaryContainerSize(null);\r\n\t\t}\r\n\r\n\t\tif (\r\n\t\t\tselfContainerName === containerName ||\r\n\t\t\tselfContainerName.startsWith(containerName + \"_\")\r\n\t\t) {\r\n\t\t\treturn;\r\n\t\t}\r\n\r\n\t\tif (isDrop && screenKey) {\r\n\t\t\t// if (isDuplication) {\r\n\t\t\t// setDuplicationInfo({ isDuplication, containerName });\r\n\t\t\t// }\r\n\t\t\t// console.log('isDuplication:::', isDuplication);\r\n\t\t\tconst dropDirection =\r\n\t\t\t\tpositionName === \"leftBoundary\" ||\r\n\t\t\t\tpositionName === \"rightBoundary\"\r\n\t\t\t\t\t? \"row\"\r\n\t\t\t\t\t: \"column\";\r\n\t\t\t// if (!parentDirection) {\r\n\t\t\t// console.log(isSplit, positionName !== 'centerBoundary', isOver);\r\n\t\t\t// }\r\n\t\t\tif (\r\n\t\t\t\t!isSplit &&\r\n\t\t\t\t!isOver\r\n\t\t\t\t//!isDuplication\r\n\t\t\t) {\r\n\t\t\t\t//setDirection(dropDirection);\r\n\t\t\t\t//if (positionName !== 'centerBoundary') {\r\n\t\t\t\tif (\r\n\t\t\t\t\tpositionName !== \"centerBoundary\" &&\r\n\t\t\t\t\tdropDirection !== parentDirection\r\n\t\t\t\t) {\r\n\t\t\t\t\tsetIsSplit(true);\r\n\t\t\t\t\tsetDirection(dropDirection);\r\n\t\t\t\t}\r\n\t\t\t\tdropMovementEventSubject.next({\r\n\t\t\t\t\tstate: \"append\",\r\n\t\t\t\t\ttargetContainerName: containerName,\r\n\t\t\t\t\ttargetParentLayoutName: parentLayoutName,\r\n\t\t\t\t\ttargetLayoutName: layoutName,\r\n\t\t\t\t\ttargetComponent: dropComponent,\r\n\t\t\t\t\torderName,\r\n\t\t\t\t\tx,\r\n\t\t\t\t\ty,\r\n\t\t\t\t\tdropEndCallback,\r\n\t\t\t\t\tdropTargetComponentEvent: {\r\n\t\t\t\t\t\tnavigationTitle,\r\n\t\t\t\t\t\tdropDocumentOutsideOption:\r\n\t\t\t\t\t\t\tdragState?.dropDocumentOutsideOption,\r\n\t\t\t\t\t\tdirection: dropDirection,\r\n\t\t\t\t\t\tscreenKey,\r\n\t\t\t\t\t},\r\n\t\t\t\t});\r\n\t\t\t\t// } else {\r\n\t\t\t\t// dropMovementEventSubject.next({\r\n\t\t\t\t// state: 'append',\r\n\t\t\t\t// targetContainerName: containerName,\r\n\t\t\t\t// targetParentLayoutName: parentLayoutName,\r\n\t\t\t\t// targetLayoutName: layoutName,\r\n\t\t\t\t// targetComponent: dropComponent,\r\n\t\t\t\t// orderName: orderName,\r\n\t\t\t\t// x,\r\n\t\t\t\t// y,\r\n\t\t\t\t// dropEndCallback,\r\n\t\t\t\t// dropTargetComponentEvent: {\r\n\t\t\t\t// navigationTitle,\r\n\t\t\t\t// dropDocumentOutsideOption:\r\n\t\t\t\t// dragState?.dropDocumentOutsideOption,\r\n\t\t\t\t// direction: direction,\r\n\t\t\t\t// },\r\n\t\t\t\t// });\r\n\t\t\t\t// }\r\n\t\t\t}\r\n\t\t\t// else if (\r\n\t\t\t// isSplit &&\r\n\t\t\t// positionName !== 'centerBoundary' &&\r\n\t\t\t// !isOver\r\n\t\t\t// ) {\r\n\t\t\t// if (!isFirstSplitUpdatedRef.current) {\r\n\t\t\t// isFirstSplitUpdatedRef.current = true;\r\n\t\t\t// return;\r\n\t\t\t// }\r\n\t\t\t// updateDropTargetComponents(\r\n\t\t\t// positionName,\r\n\t\t\t// containerName,\r\n\t\t\t// dropComponent\r\n\t\t\t// );\r\n\t\t\t// }\r\n\t\t}\r\n\t\tif (isDragging && !isSplit && !isOver) {\r\n\t\t\tconst newSize = {\r\n\t\t\t\tleft: positionName === \"rightBoundary\" ? \"50%\" : \"0\",\r\n\t\t\t\ttop: positionName === \"bottomBoundary\" ? \"50%\" : \"0\",\r\n\t\t\t\twidth:\r\n\t\t\t\t\tpositionName === \"leftBoundary\" ||\r\n\t\t\t\t\tpositionName === \"rightBoundary\"\r\n\t\t\t\t\t\t? \"50%\"\r\n\t\t\t\t\t\t: \"100%\",\r\n\t\t\t\theight:\r\n\t\t\t\t\tpositionName === \"topBoundary\" ||\r\n\t\t\t\t\tpositionName === \"bottomBoundary\"\r\n\t\t\t\t\t\t? \"50%\"\r\n\t\t\t\t\t\t: \"100%\",\r\n\t\t\t};\r\n\t\t\t// 이전 상태와 비교\r\n\t\t\tif (\r\n\t\t\t\tJSON.stringify(boundaryContainerSize) !==\r\n\t\t\t\tJSON.stringify(newSize)\r\n\t\t\t) {\r\n\t\t\t\tsetBoundaryContainerSize(newSize);\r\n\t\t\t}\r\n\t\t}\r\n\t}, [\r\n\t\tdragState,\r\n\t\tisSplit,\r\n\t\tboundaryContainerSize,\r\n\t\tparentLayoutName,\r\n\t\tlayoutName,\r\n\t\tselfContainerName,\r\n\t\tdirection,\r\n\t]);\r\n\treturn {\r\n\t\tdirection,\r\n\t\tsetDirection,\r\n\t\tisSplit,\r\n\t\tsetIsSplit,\r\n\t\tboundaryContainerSize,\r\n\t\t//setBoundaryContainerSize,\r\n\t\tcenterDropTargetComponent,\r\n\t\tafterDropTargetComponent,\r\n\t\tbeforeDropTargetComponent,\r\n\t\tsetAfterDropTargetComponent,\r\n\t\tsetBeforeDropTargetComponent,\r\n\t\tsetCenterDropTargetComponent,\r\n\t\t//dropTargetComponent,\r\n\t\t//setDropTargetComponent,\r\n\t\t//setDropPosition,\r\n\t\tisOver: dragState?.isOver,\r\n\t\tlayoutRef,\r\n\t};\r\n}\r\n"],"mappings":"AACA,SAAS,WAAW,QAAQ,gBAAgB;AAC5C;AAAA,EACC;AAAA,EAEA;AAAA,OACM;AAEA,SAAS,yBAAyB;AAAA,EACxC,iBAAiB;AAAA,EACjB;AAAA,EACA,mBAAmB;AAAA,EACnB;AAAA,EACA;AAAA,EACA;AACD,GAOG;AACF,QAAM,CAAC,WAAW,YAAY,IAAI;AAAA,IACjC;AAAA,EACD;AAEA,QAAM,CAAC,SAAS,UAAU,IAAI,SAAkB,cAAc;AAC9D,QAAM,CAAC,uBAAuB,wBAAwB,IAAI,SAKhD,IAAI;AACd,QAAM,CAAC,2BAA2B,4BAA4B,IAAI,SAEhE,CAAC,CAAC;AACJ,QAAM,CAAC,0BAA0B,2BAA2B,IAAI,SAE9D,CAAC,CAAC;AACJ,QAAM,CAAC,2BAA2B,4BAA4B,IAAI,SAEhE,CAAC,CAAC;AACJ,QAAM,YAAY,OAAuB,IAAI;AAE7C,QAAM,YAAY,eAAe,SAAS;AAE1C,YAAU,MAAM;AACf,QAAI,CAAC,WAAW;AACf,+BAAyB,IAAI;AAC7B;AAAA,IACD;AACA,UAAM;AAAA,MACL;AAAA,MACA;AAAA,MACA;AAAA,MACA;AAAA,MACA,UAAU;AAAA,MACV;AAAA,MACA;AAAA,MACA;AAAA,MACA;AAAA,MACA;AAAA,MACA;AAAA,IACD,IAAI;AAEJ,UAAM,YACL,iBAAiB,kBAAkB,iBAAiB,gBACjD,WACA,iBAAiB,mBAChB,iBAAiB,mBACjB,UACA;AAML,SAAK,UAAU,WAAW,uBAAuB;AAChD,+BAAyB,IAAI;AAAA,IAC9B;AAEA,QACC,sBAAsB,iBACtB,kBAAkB,WAAW,gBAAgB,GAAG,GAC/C;AACD;AAAA,IACD;AAEA,QAAI,UAAU,WAAW;AAKxB,YAAM,gBACL,iBAAiB,kBACjB,iBAAiB,kBACd,QACA;AAIJ,UACC,CAAC,WACD,CAAC,QAEA;AAGD,YACC,iBAAiB,oBACjB,kBAAkB,iBACjB;AACD,qBAAW,IAAI;AACf,uBAAa,aAAa;AAAA,QAC3B;AACA,iCAAyB,KAAK;AAAA,UAC7B,OAAO;AAAA,UACP,qBAAqB;AAAA,UACrB,wBAAwB;AAAA,UACxB,kBAAkB;AAAA,UAClB,iBAAiB;AAAA,UACjB;AAAA,UACA;AAAA,UACA;AAAA,UACA;AAAA,UACA,0BAA0B;AAAA,YACzB;AAAA,YACA,2BACC,WAAW;AAAA,YACZ,WAAW;AAAA,YACX;AAAA,UACD;AAAA,QACD,CAAC;AAAA,MAoBF;AAAA,IAgBD;AACA,QAAI,cAAc,CAAC,WAAW,CAAC,QAAQ;AACtC,YAAM,UAAU;AAAA,QACf,MAAM,iBAAiB,kBAAkB,QAAQ;AAAA,QACjD,KAAK,iBAAiB,mBAAmB,QAAQ;AAAA,QACjD,OACC,iBAAiB,kBACjB,iBAAiB,kBACd,QACA;AAAA,QACJ,QACC,iBAAiB,iBACjB,iBAAiB,mBACd,QACA;AAAA,MACL;AAEA,UACC,KAAK,UAAU,qBAAqB,MACpC,KAAK,UAAU,OAAO,GACrB;AACD,iCAAyB,OAAO;AAAA,MACjC;AAAA,IACD;AAAA,EACD,GAAG;AAAA,IACF;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,EACD,CAAC;AACD,SAAO;AAAA,IACN;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA;AAAA,IAEA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA;AAAA;AAAA;AAAA,IAIA,QAAQ,WAAW;AAAA,IACnB;AAAA,EACD;AACD;","names":[]}
@@ -1 +0,0 @@
1
- {"version":3,"sources":["../../../src/flex-layout/hooks/useListPaging.ts"],"sourcesContent":["import {\r\n\tMutableRefObject,\r\n\tuseCallback,\r\n\tuseEffect,\r\n\tuseRef,\r\n\tuseState,\r\n} from \"react\";\r\n\r\nexport type OnReachTerminalType = {\r\n\tisFirst: boolean;\r\n\tisLast: boolean;\r\n\tobserver: IntersectionObserver;\r\n};\r\ninterface UseListPagingForInfinityProps {\r\n\tonReachTerminal?: (onReachTerminalData: OnReachTerminalType) => void;\r\n}\r\nexport const useListPagingForSentinel = <E extends HTMLElement>({\r\n\t//initPageNumber,\r\n\t//initPageSize,\r\n\tonReachTerminal,\r\n}: UseListPagingForInfinityProps): {\r\n\tfirstChildRef: (node: E | null) => void;\r\n\tlastChildRef: (node: E | null) => void;\r\n\t//pageNumber: number;\r\n\t//pageSize: number;\r\n\t//setPageNumber: Dispatch<SetStateAction<number>>;\r\n\t//setPageSize: Dispatch<SetStateAction<number>>;\r\n} => {\r\n\tconst [firstChildNode, setFirstChildNode] = useState<E | null>(null);\r\n\tconst [lastChildNode, setLastChildNode] = useState<E | null>(null);\r\n\tconst observerRef = useRef<IntersectionObserver | null>(null);\r\n\r\n\tconst firstChildRef = useCallback((node: E | null) => {\r\n\t\tsetFirstChildNode(node);\r\n\t}, []);\r\n\r\n\tconst lastChildRef = useCallback((node: E | null) => {\r\n\t\tsetLastChildNode(node);\r\n\t}, []);\r\n\t// 페이지 번호가 변경될 때마다 데이터 로드를 위한 콜백 호출\r\n\r\n\tuseEffect(() => {\r\n\t\tif (firstChildNode && observerRef.current)\r\n\t\t\tobserverRef.current.unobserve(firstChildNode);\r\n\t\tif (lastChildNode && observerRef.current)\r\n\t\t\tobserverRef.current.unobserve(lastChildNode);\r\n\t\tconst handleIntersect: IntersectionObserverCallback = (\r\n\t\t\tentries,\r\n\t\t\tobserver,\r\n\t\t) => {\r\n\t\t\tentries.forEach((entry) => {\r\n\t\t\t\tif (entry.isIntersecting) {\r\n\t\t\t\t\tif (entry.target === firstChildNode) {\r\n\t\t\t\t\t\tif (onReachTerminal)\r\n\t\t\t\t\t\t\tonReachTerminal({\r\n\t\t\t\t\t\t\t\tisFirst: true,\r\n\t\t\t\t\t\t\t\tisLast: false,\r\n\t\t\t\t\t\t\t\tobserver,\r\n\t\t\t\t\t\t\t});\r\n\t\t\t\t\t}\r\n\r\n\t\t\t\t\tif (entry.target === lastChildNode) {\r\n\t\t\t\t\t\tif (onReachTerminal)\r\n\t\t\t\t\t\t\tonReachTerminal({\r\n\t\t\t\t\t\t\t\tisFirst: false,\r\n\t\t\t\t\t\t\t\tisLast: true,\r\n\t\t\t\t\t\t\t\tobserver,\r\n\t\t\t\t\t\t\t});\r\n\t\t\t\t\t}\r\n\t\t\t\t}\r\n\t\t\t});\r\n\t\t};\r\n\r\n\t\tconst observer = new IntersectionObserver(handleIntersect, {\r\n\t\t\tthreshold: 0.1,\r\n\t\t});\r\n\r\n\t\tobserverRef.current = observer;\r\n\r\n\t\tif (firstChildNode) observer.observe(firstChildNode);\r\n\t\tif (lastChildNode) observer.observe(lastChildNode);\r\n\r\n\t\treturn () => {\r\n\t\t\tif (observerRef.current) {\r\n\t\t\t\t// if (firstChildNode)\r\n\t\t\t\t// observerRef.current.unobserve(firstChildNode);\r\n\t\t\t\t// if (lastChildNode) observerRef.current.unobserve(lastChildNode);\r\n\t\t\t\tobserverRef.current.disconnect();\r\n\t\t\t}\r\n\t\t};\r\n\t}, [firstChildNode, lastChildNode]);\r\n\r\n\treturn {\r\n\t\tfirstChildRef,\r\n\t\tlastChildRef,\r\n\t};\r\n};\r\n\r\nexport const usePaginationViewNumber = ({\r\n\tinitPageNumber,\r\n}: {\r\n\tinitPageNumber: number;\r\n}) => {\r\n\tconst [showCurrentPageNumber, setShowCurrentPageNumber] =\r\n\t\tuseState<number>(initPageNumber);\r\n\r\n\tconst observerRef = useRef<IntersectionObserver | null>(null);\r\n\tconst showCurrentPageObserveTarget = useCallback(\r\n\t\t(node: HTMLElement | null) => {\r\n\t\t\tif (!node) return;\r\n\r\n\t\t\t// 아직 observer가 없으면 새로 생성\r\n\t\t\tif (!observerRef.current) {\r\n\t\t\t\tobserverRef.current = new IntersectionObserver(\r\n\t\t\t\t\t(entries) => {\r\n\t\t\t\t\t\tentries.forEach((entry) => {\r\n\t\t\t\t\t\t\tif (entry.isIntersecting) {\r\n\t\t\t\t\t\t\t\tconst pageIndexAttr =\r\n\t\t\t\t\t\t\t\t\tentry.target.getAttribute(\r\n\t\t\t\t\t\t\t\t\t\t\"data-page-index\",\r\n\t\t\t\t\t\t\t\t\t);\r\n\t\t\t\t\t\t\t\tif (!pageIndexAttr) return;\r\n\t\t\t\t\t\t\t\t// if (!entry.target.hasAttribute('data-is-first'))\r\n\t\t\t\t\t\t\t\t// return;\r\n\t\t\t\t\t\t\t\tconst pageIndex = parseInt(pageIndexAttr, 10);\r\n\t\t\t\t\t\t\t\tsetShowCurrentPageNumber(pageIndex);\r\n\t\t\t\t\t\t\t}\r\n\t\t\t\t\t\t});\r\n\t\t\t\t\t},\r\n\t\t\t\t\t{\r\n\t\t\t\t\t\tthreshold: 0.1, // 예: 10% 이상 보여야 intersect로 판단\r\n\t\t\t\t\t},\r\n\t\t\t\t);\r\n\t\t\t}\r\n\r\n\t\t\t// 해당 노드를 관찰\r\n\t\t\tobserverRef.current.observe(node);\r\n\t\t},\r\n\t\t[],\r\n\t);\r\n\tuseEffect(() => {\r\n\t\tconst currentObserver = observerRef.current;\r\n\t\treturn () => {\r\n\t\t\tif (currentObserver) {\r\n\t\t\t\tcurrentObserver.disconnect();\r\n\t\t\t}\r\n\t\t};\r\n\t}, []);\r\n\treturn {\r\n\t\tshowCurrentPageNumber,\r\n\t\tshowCurrentPageObserveTarget,\r\n\t};\r\n};\r\n\r\nexport const usePagingHandler = <T>({\r\n\tlastCallPageNumber,\r\n\tdataListRef,\r\n}: {\r\n\tlastCallPageNumber: number;\r\n\tdataListRef: MutableRefObject<Array<T[] | null>>;\r\n}) => {\r\n\tconst jumpingPageNumberRef = useRef<number | null>(lastCallPageNumber);\r\n\r\n\tconst paginationScrollIntoViewTarget = useRef<\r\n\t\tRecord<number, HTMLDivElement | null>\r\n\t>({});\r\n\tconst pageNumberRef = useRef<number>(lastCallPageNumber);\r\n\r\n\tconst resetJumpTimerIdRef = useRef<ReturnType<typeof setTimeout> | null>(\r\n\t\tnull,\r\n\t);\r\n\r\n\tconst clearResetTimer = useCallback(() => {\r\n\t\tif (resetJumpTimerIdRef.current !== null) {\r\n\t\t\twindow.clearTimeout(resetJumpTimerIdRef.current);\r\n\t\t\tresetJumpTimerIdRef.current = null;\r\n\t\t}\r\n\t}, []);\r\n\r\n\tconst armResetTimer = useCallback(() => {\r\n\t\tclearResetTimer();\r\n\t\tresetJumpTimerIdRef.current = window.setTimeout(() => {\r\n\t\t\tjumpingPageNumberRef.current = null;\r\n\t\t\tresetJumpTimerIdRef.current = null;\r\n\t\t}, 1000);\r\n\t}, [clearResetTimer]);\r\n\r\n\tuseEffect(() => {\r\n\t\treturn () => {\r\n\t\t\tclearResetTimer();\r\n\t\t};\r\n\t}, [clearResetTimer]);\r\n\r\n\tconst setPaginationRef = useCallback(\r\n\t\t(i: number) => (node: HTMLDivElement | null) => {\r\n\t\t\tif (!node) return;\r\n\r\n\t\t\tpaginationScrollIntoViewTarget.current[i] = node;\r\n\r\n\t\t\t// jumpingPageNumberRef에 값이 있고, 그 값이 현재 i와 같으면 스크롤\r\n\t\t\tif (\r\n\t\t\t\tjumpingPageNumberRef.current !== null &&\r\n\t\t\t\ti === jumpingPageNumberRef.current\r\n\t\t\t) {\r\n\t\t\t\tnode.scrollIntoView({\r\n\t\t\t\t\tbehavior: \"instant\", // 필요한 경우 'smooth' 등으로 수정 가능\r\n\t\t\t\t\tblock: \"start\",\r\n\t\t\t\t});\r\n\t\t\t\tjumpingPageNumberRef.current = null;\r\n\t\t\t}\r\n\t\t},\r\n\t\t[],\r\n\t);\r\n\r\n\t//스크롤이 “첫 아이템” 혹은 “마지막 아이템”에 닿을 때 호출\r\n\tconst handleReachTerminal = (\r\n\t\t{ isFirst, isLast, observer }: OnReachTerminalType,\r\n\t\tdataCallFetch: (callPageNumber: number) => void,\r\n\t) => {\r\n\t\t// 이미 다른 페이지로 점프 중이면, 중복 호출 방지\r\n\t\tif (dataListRef.current.length === 0) return;\r\n\t\tif (jumpingPageNumberRef.current != null) return;\r\n\t\tif (!isFirst && !isLast) return;\r\n\r\n\t\tconst callPageNumber = isFirst\r\n\t\t\t? Math.max(pageNumberRef.current - 1, 0)\r\n\t\t\t: pageNumberRef.current + 1;\r\n\r\n\t\tif (\r\n\t\t\tdataListRef.current[callPageNumber] != null &&\r\n\t\t\t(dataListRef.current[callPageNumber]?.length || 0) > 0\r\n\t\t)\r\n\t\t\treturn;\r\n\t\tjumpingPageNumberRef.current = callPageNumber;\r\n\t\tarmResetTimer();\r\n\t\tdataCallFetch(callPageNumber);\r\n\t};\r\n\r\n\t//페이지네이션에서 페이지 번호를 직접 클릭했을 시\r\n\tconst handleClickPageChange = (\r\n\t\tpage: number,\r\n\t\tdataCallFetch: (callPageNumber: number) => void,\r\n\t) => {\r\n\t\t// PaginationLayer는 1-based, 내부 로직은 0-based\r\n\t\t// 이미 캐싱된 페이지가 있다면, 스크롤만 이동\r\n\t\tconst pageData = dataListRef.current[page];\r\n\r\n\t\t// 이미 캐싱된 페이지가 있다면, 스크롤만 이동\r\n\t\tif (\r\n\t\t\tpageData != null &&\r\n\t\t\tArray.isArray(pageData) &&\r\n\t\t\tpageData.length > 0\r\n\t\t) {\r\n\t\t\tpaginationScrollIntoViewTarget.current[page]?.scrollIntoView({\r\n\t\t\t\tbehavior: \"smooth\",\r\n\t\t\t\tblock: \"start\",\r\n\t\t\t});\r\n\t\t\treturn;\r\n\t\t}\r\n\t\tjumpingPageNumberRef.current = page;\r\n\t\tarmResetTimer();\r\n\t\tdataCallFetch(page);\r\n\t};\r\n\treturn {\r\n\t\tjumpingPageNumberRef,\r\n\t\tpaginationScrollIntoViewTarget,\r\n\t\tpageNumberRef,\r\n\t\tsetPaginationRef,\r\n\t\thandleReachTerminal,\r\n\t\thandleClickPageChange,\r\n\t};\r\n};\r\n"],"mappings":"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","names":["observer"]}
@@ -1 +0,0 @@
1
- {"version":3,"sources":["../../../src/flex-layout/hooks/useListPaging.ts"],"sourcesContent":["import {\r\n\tMutableRefObject,\r\n\tuseCallback,\r\n\tuseEffect,\r\n\tuseRef,\r\n\tuseState,\r\n} from \"react\";\r\n\r\nexport type OnReachTerminalType = {\r\n\tisFirst: boolean;\r\n\tisLast: boolean;\r\n\tobserver: IntersectionObserver;\r\n};\r\ninterface UseListPagingForInfinityProps {\r\n\tonReachTerminal?: (onReachTerminalData: OnReachTerminalType) => void;\r\n}\r\nexport const useListPagingForSentinel = <E extends HTMLElement>({\r\n\t//initPageNumber,\r\n\t//initPageSize,\r\n\tonReachTerminal,\r\n}: UseListPagingForInfinityProps): {\r\n\tfirstChildRef: (node: E | null) => void;\r\n\tlastChildRef: (node: E | null) => void;\r\n\t//pageNumber: number;\r\n\t//pageSize: number;\r\n\t//setPageNumber: Dispatch<SetStateAction<number>>;\r\n\t//setPageSize: Dispatch<SetStateAction<number>>;\r\n} => {\r\n\tconst [firstChildNode, setFirstChildNode] = useState<E | null>(null);\r\n\tconst [lastChildNode, setLastChildNode] = useState<E | null>(null);\r\n\tconst observerRef = useRef<IntersectionObserver | null>(null);\r\n\r\n\tconst firstChildRef = useCallback((node: E | null) => {\r\n\t\tsetFirstChildNode(node);\r\n\t}, []);\r\n\r\n\tconst lastChildRef = useCallback((node: E | null) => {\r\n\t\tsetLastChildNode(node);\r\n\t}, []);\r\n\t// 페이지 번호가 변경될 때마다 데이터 로드를 위한 콜백 호출\r\n\r\n\tuseEffect(() => {\r\n\t\tif (firstChildNode && observerRef.current)\r\n\t\t\tobserverRef.current.unobserve(firstChildNode);\r\n\t\tif (lastChildNode && observerRef.current)\r\n\t\t\tobserverRef.current.unobserve(lastChildNode);\r\n\t\tconst handleIntersect: IntersectionObserverCallback = (\r\n\t\t\tentries,\r\n\t\t\tobserver,\r\n\t\t) => {\r\n\t\t\tentries.forEach((entry) => {\r\n\t\t\t\tif (entry.isIntersecting) {\r\n\t\t\t\t\tif (entry.target === firstChildNode) {\r\n\t\t\t\t\t\tif (onReachTerminal)\r\n\t\t\t\t\t\t\tonReachTerminal({\r\n\t\t\t\t\t\t\t\tisFirst: true,\r\n\t\t\t\t\t\t\t\tisLast: false,\r\n\t\t\t\t\t\t\t\tobserver,\r\n\t\t\t\t\t\t\t});\r\n\t\t\t\t\t}\r\n\r\n\t\t\t\t\tif (entry.target === lastChildNode) {\r\n\t\t\t\t\t\tif (onReachTerminal)\r\n\t\t\t\t\t\t\tonReachTerminal({\r\n\t\t\t\t\t\t\t\tisFirst: false,\r\n\t\t\t\t\t\t\t\tisLast: true,\r\n\t\t\t\t\t\t\t\tobserver,\r\n\t\t\t\t\t\t\t});\r\n\t\t\t\t\t}\r\n\t\t\t\t}\r\n\t\t\t});\r\n\t\t};\r\n\r\n\t\tconst observer = new IntersectionObserver(handleIntersect, {\r\n\t\t\tthreshold: 0.1,\r\n\t\t});\r\n\r\n\t\tobserverRef.current = observer;\r\n\r\n\t\tif (firstChildNode) observer.observe(firstChildNode);\r\n\t\tif (lastChildNode) observer.observe(lastChildNode);\r\n\r\n\t\treturn () => {\r\n\t\t\tif (observerRef.current) {\r\n\t\t\t\t// if (firstChildNode)\r\n\t\t\t\t// observerRef.current.unobserve(firstChildNode);\r\n\t\t\t\t// if (lastChildNode) observerRef.current.unobserve(lastChildNode);\r\n\t\t\t\tobserverRef.current.disconnect();\r\n\t\t\t}\r\n\t\t};\r\n\t}, [firstChildNode, lastChildNode]);\r\n\r\n\treturn {\r\n\t\tfirstChildRef,\r\n\t\tlastChildRef,\r\n\t};\r\n};\r\n\r\nexport const usePaginationViewNumber = ({\r\n\tinitPageNumber,\r\n}: {\r\n\tinitPageNumber: number;\r\n}) => {\r\n\tconst [showCurrentPageNumber, setShowCurrentPageNumber] =\r\n\t\tuseState<number>(initPageNumber);\r\n\r\n\tconst observerRef = useRef<IntersectionObserver | null>(null);\r\n\tconst showCurrentPageObserveTarget = useCallback(\r\n\t\t(node: HTMLElement | null) => {\r\n\t\t\tif (!node) return;\r\n\r\n\t\t\t// 아직 observer가 없으면 새로 생성\r\n\t\t\tif (!observerRef.current) {\r\n\t\t\t\tobserverRef.current = new IntersectionObserver(\r\n\t\t\t\t\t(entries) => {\r\n\t\t\t\t\t\tentries.forEach((entry) => {\r\n\t\t\t\t\t\t\tif (entry.isIntersecting) {\r\n\t\t\t\t\t\t\t\tconst pageIndexAttr =\r\n\t\t\t\t\t\t\t\t\tentry.target.getAttribute(\r\n\t\t\t\t\t\t\t\t\t\t\"data-page-index\",\r\n\t\t\t\t\t\t\t\t\t);\r\n\t\t\t\t\t\t\t\tif (!pageIndexAttr) return;\r\n\t\t\t\t\t\t\t\t// if (!entry.target.hasAttribute('data-is-first'))\r\n\t\t\t\t\t\t\t\t// return;\r\n\t\t\t\t\t\t\t\tconst pageIndex = parseInt(pageIndexAttr, 10);\r\n\t\t\t\t\t\t\t\tsetShowCurrentPageNumber(pageIndex);\r\n\t\t\t\t\t\t\t}\r\n\t\t\t\t\t\t});\r\n\t\t\t\t\t},\r\n\t\t\t\t\t{\r\n\t\t\t\t\t\tthreshold: 0.1, // 예: 10% 이상 보여야 intersect로 판단\r\n\t\t\t\t\t},\r\n\t\t\t\t);\r\n\t\t\t}\r\n\r\n\t\t\t// 해당 노드를 관찰\r\n\t\t\tobserverRef.current.observe(node);\r\n\t\t},\r\n\t\t[],\r\n\t);\r\n\tuseEffect(() => {\r\n\t\tconst currentObserver = observerRef.current;\r\n\t\treturn () => {\r\n\t\t\tif (currentObserver) {\r\n\t\t\t\tcurrentObserver.disconnect();\r\n\t\t\t}\r\n\t\t};\r\n\t}, []);\r\n\treturn {\r\n\t\tshowCurrentPageNumber,\r\n\t\tshowCurrentPageObserveTarget,\r\n\t};\r\n};\r\n\r\nexport const usePagingHandler = <T>({\r\n\tlastCallPageNumber,\r\n\tdataListRef,\r\n}: {\r\n\tlastCallPageNumber: number;\r\n\tdataListRef: MutableRefObject<Array<T[] | null>>;\r\n}) => {\r\n\tconst jumpingPageNumberRef = useRef<number | null>(lastCallPageNumber);\r\n\r\n\tconst paginationScrollIntoViewTarget = useRef<\r\n\t\tRecord<number, HTMLDivElement | null>\r\n\t>({});\r\n\tconst pageNumberRef = useRef<number>(lastCallPageNumber);\r\n\r\n\tconst resetJumpTimerIdRef = useRef<ReturnType<typeof setTimeout> | null>(\r\n\t\tnull,\r\n\t);\r\n\r\n\tconst clearResetTimer = useCallback(() => {\r\n\t\tif (resetJumpTimerIdRef.current !== null) {\r\n\t\t\twindow.clearTimeout(resetJumpTimerIdRef.current);\r\n\t\t\tresetJumpTimerIdRef.current = null;\r\n\t\t}\r\n\t}, []);\r\n\r\n\tconst armResetTimer = useCallback(() => {\r\n\t\tclearResetTimer();\r\n\t\tresetJumpTimerIdRef.current = window.setTimeout(() => {\r\n\t\t\tjumpingPageNumberRef.current = null;\r\n\t\t\tresetJumpTimerIdRef.current = null;\r\n\t\t}, 1000);\r\n\t}, [clearResetTimer]);\r\n\r\n\tuseEffect(() => {\r\n\t\treturn () => {\r\n\t\t\tclearResetTimer();\r\n\t\t};\r\n\t}, [clearResetTimer]);\r\n\r\n\tconst setPaginationRef = useCallback(\r\n\t\t(i: number) => (node: HTMLDivElement | null) => {\r\n\t\t\tif (!node) return;\r\n\r\n\t\t\tpaginationScrollIntoViewTarget.current[i] = node;\r\n\r\n\t\t\t// jumpingPageNumberRef에 값이 있고, 그 값이 현재 i와 같으면 스크롤\r\n\t\t\tif (\r\n\t\t\t\tjumpingPageNumberRef.current !== null &&\r\n\t\t\t\ti === jumpingPageNumberRef.current\r\n\t\t\t) {\r\n\t\t\t\tnode.scrollIntoView({\r\n\t\t\t\t\tbehavior: \"instant\", // 필요한 경우 'smooth' 등으로 수정 가능\r\n\t\t\t\t\tblock: \"start\",\r\n\t\t\t\t});\r\n\t\t\t\tjumpingPageNumberRef.current = null;\r\n\t\t\t}\r\n\t\t},\r\n\t\t[],\r\n\t);\r\n\r\n\t//스크롤이 “첫 아이템” 혹은 “마지막 아이템”에 닿을 때 호출\r\n\tconst handleReachTerminal = (\r\n\t\t{ isFirst, isLast, observer }: OnReachTerminalType,\r\n\t\tdataCallFetch: (callPageNumber: number) => void,\r\n\t) => {\r\n\t\t// 이미 다른 페이지로 점프 중이면, 중복 호출 방지\r\n\t\tif (dataListRef.current.length === 0) return;\r\n\t\tif (jumpingPageNumberRef.current != null) return;\r\n\t\tif (!isFirst && !isLast) return;\r\n\r\n\t\tconst callPageNumber = isFirst\r\n\t\t\t? Math.max(pageNumberRef.current - 1, 0)\r\n\t\t\t: pageNumberRef.current + 1;\r\n\r\n\t\tif (\r\n\t\t\tdataListRef.current[callPageNumber] != null &&\r\n\t\t\t(dataListRef.current[callPageNumber]?.length || 0) > 0\r\n\t\t)\r\n\t\t\treturn;\r\n\t\tjumpingPageNumberRef.current = callPageNumber;\r\n\t\tarmResetTimer();\r\n\t\tdataCallFetch(callPageNumber);\r\n\t};\r\n\r\n\t//페이지네이션에서 페이지 번호를 직접 클릭했을 시\r\n\tconst handleClickPageChange = (\r\n\t\tpage: number,\r\n\t\tdataCallFetch: (callPageNumber: number) => void,\r\n\t) => {\r\n\t\t// PaginationLayer는 1-based, 내부 로직은 0-based\r\n\t\t// 이미 캐싱된 페이지가 있다면, 스크롤만 이동\r\n\t\tconst pageData = dataListRef.current[page];\r\n\r\n\t\t// 이미 캐싱된 페이지가 있다면, 스크롤만 이동\r\n\t\tif (\r\n\t\t\tpageData != null &&\r\n\t\t\tArray.isArray(pageData) &&\r\n\t\t\tpageData.length > 0\r\n\t\t) {\r\n\t\t\tpaginationScrollIntoViewTarget.current[page]?.scrollIntoView({\r\n\t\t\t\tbehavior: \"smooth\",\r\n\t\t\t\tblock: \"start\",\r\n\t\t\t});\r\n\t\t\treturn;\r\n\t\t}\r\n\t\tjumpingPageNumberRef.current = page;\r\n\t\tarmResetTimer();\r\n\t\tdataCallFetch(page);\r\n\t};\r\n\treturn {\r\n\t\tjumpingPageNumberRef,\r\n\t\tpaginationScrollIntoViewTarget,\r\n\t\tpageNumberRef,\r\n\t\tsetPaginationRef,\r\n\t\thandleReachTerminal,\r\n\t\thandleClickPageChange,\r\n\t};\r\n};\r\n"],"mappings":"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","names":["observer"]}
@@ -1 +0,0 @@
1
- {"version":3,"sources":["../../../src/flex-layout/hooks/useSizes.ts"],"sourcesContent":["import { useEffect, useLayoutEffect, useRef, useState } from \"react\";\r\nimport { auditTime, distinctUntilChanged, filter, fromEvent } from \"rxjs\";\r\n\r\nexport const useSize = (sizeName: \"height\" | \"width\") => {\r\n\tconst ref = useRef<HTMLDivElement>(null);\r\n\tconst [size, setSize] = useState<number | undefined>(undefined);\r\n\r\n\tuseLayoutEffect(() => {\r\n\t\tif (!ref.current) return;\r\n\r\n\t\tconst handleResize = () => {\r\n\t\t\tif (ref.current) {\r\n\t\t\t\tconst newSize = ref.current.getBoundingClientRect()[\r\n\t\t\t\t\tsizeName as keyof DOMRect\r\n\t\t\t\t] as number;\r\n\t\t\t\tsetSize(newSize);\r\n\t\t\t}\r\n\t\t};\r\n\r\n\t\t// 초기 측정\r\n\t\thandleResize();\r\n\r\n\t\t// ResizeObserver 설정\r\n\t\tconst resizeObserver = new ResizeObserver(() => {\r\n\t\t\thandleResize();\r\n\t\t});\r\n\t\tresizeObserver.observe(ref.current);\r\n\r\n\t\t// 윈도우 리사이즈 이벤트도 청취\r\n\t\twindow.addEventListener(\"resize\", handleResize);\r\n\r\n\t\t// 클린업\r\n\t\treturn () => {\r\n\t\t\tresizeObserver.disconnect();\r\n\t\t\twindow.removeEventListener(\"resize\", handleResize);\r\n\t\t};\r\n\t}, [sizeName]);\r\n\r\n\treturn { ref, size };\r\n};\r\nexport const useFirstChildSize = (sizeName: string) => {\r\n\tconst ref = useRef<HTMLDivElement>(null);\r\n\tconst [sizes, setSizes] = useState<Array<number>>();\r\n\tuseEffect(() => {\r\n\t\tif (!ref.current || !ref.current.children[0]) return;\r\n\t\tif (!sizes || sizes.length === 0) {\r\n\t\t\tsetSizes([\r\n\t\t\t\tref.current.getBoundingClientRect()[\r\n\t\t\t\t\tsizeName as keyof DOMRect\r\n\t\t\t\t] as number,\r\n\t\t\t\tref.current.children[0].getBoundingClientRect()[\r\n\t\t\t\t\tsizeName as keyof DOMRect\r\n\t\t\t\t] as number,\r\n\t\t\t]);\r\n\t\t}\r\n\t}, []);\r\n\tuseEffect(() => {\r\n\t\tif (!ref.current || !ref.current.children[0]) return;\r\n\t\tconst childrenChangeObserver = new MutationObserver(\r\n\t\t\t(mutationList, observer) => {\r\n\t\t\t\tmutationList.forEach((mutation) => {\r\n\t\t\t\t\tif (!ref.current || !sizes || !ref.current.children[0])\r\n\t\t\t\t\t\treturn;\r\n\t\t\t\t\tconst newSize = ref.current.getBoundingClientRect()[\r\n\t\t\t\t\t\tsizeName as keyof DOMRect\r\n\t\t\t\t\t] as number;\r\n\t\t\t\t\t//if (newSize === sizes[0]) return;\r\n\t\t\t\t\tsetSizes([\r\n\t\t\t\t\t\tnewSize,\r\n\t\t\t\t\t\tref.current.children[0].getBoundingClientRect()[\r\n\t\t\t\t\t\t\tsizeName as keyof DOMRect\r\n\t\t\t\t\t\t] as number,\r\n\t\t\t\t\t]);\r\n\t\t\t\t});\r\n\t\t\t},\r\n\t\t);\r\n\t\tchildrenChangeObserver.observe(ref.current, {\r\n\t\t\tchildList: true,\r\n\t\t\tsubtree: true,\r\n\t\t});\r\n\t\tlet isFocus = false;\r\n\r\n\t\tconst windowResizeSubscribe = fromEvent<UIEvent>(window, \"resize\")\r\n\t\t\t.pipe(\r\n\t\t\t\tdistinctUntilChanged(),\r\n\t\t\t\tfilter(\r\n\t\t\t\t\t() =>\r\n\t\t\t\t\t\tdocument.activeElement?.tagName !== \"INPUT\" && !isFocus,\r\n\t\t\t\t),\r\n\t\t\t)\r\n\t\t\t.subscribe((ev) => {\r\n\t\t\t\tif (!ref.current || !ref.current.children[0]) return;\r\n\t\t\t\tsetSizes([\r\n\t\t\t\t\tref.current.getBoundingClientRect()[\r\n\t\t\t\t\t\tsizeName as keyof DOMRect\r\n\t\t\t\t\t] as number,\r\n\t\t\t\t\tref.current.children[0].getBoundingClientRect()[\r\n\t\t\t\t\t\tsizeName as keyof DOMRect\r\n\t\t\t\t\t] as number,\r\n\t\t\t\t]);\r\n\t\t\t});\r\n\r\n\t\tconst documentFocusoutSubscribe = fromEvent<FocusEvent>(\r\n\t\t\tdocument,\r\n\t\t\t\"focusout\",\r\n\t\t)\r\n\t\t\t.pipe(\r\n\t\t\t\tauditTime(1000),\r\n\t\t\t\tfilter((ev) => document.activeElement?.tagName !== \"INPUT\"),\r\n\t\t\t)\r\n\t\t\t.subscribe({\r\n\t\t\t\tnext: () => {\r\n\t\t\t\t\tif (isFocus) isFocus = false;\r\n\t\t\t\t},\r\n\t\t\t});\r\n\r\n\t\tconst documentFocusinSubscribe = fromEvent<FocusEvent>(\r\n\t\t\tdocument,\r\n\t\t\t\"focusin\",\r\n\t\t).subscribe({\r\n\t\t\tnext: (ev) =>\r\n\t\t\t\t(isFocus = (ev.target as Element).tagName === \"INPUT\"),\r\n\t\t});\r\n\r\n\t\treturn () => {\r\n\t\t\twindowResizeSubscribe.unsubscribe();\r\n\t\t\tdocumentFocusoutSubscribe.unsubscribe();\r\n\t\t\tdocumentFocusinSubscribe.unsubscribe();\r\n\t\t\tchildrenChangeObserver.disconnect();\r\n\t\t};\r\n\t}, [sizeName, sizes]);\r\n\treturn { ref, sizes };\r\n};\r\n"],"mappings":"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","names":[]}
@@ -1 +0,0 @@
1
- {"version":3,"sources":["../../../src/flex-layout/hooks/useSizes.ts"],"sourcesContent":["import { useEffect, useLayoutEffect, useRef, useState } from \"react\";\r\nimport { auditTime, distinctUntilChanged, filter, fromEvent } from \"rxjs\";\r\n\r\nexport const useSize = (sizeName: \"height\" | \"width\") => {\r\n\tconst ref = useRef<HTMLDivElement>(null);\r\n\tconst [size, setSize] = useState<number | undefined>(undefined);\r\n\r\n\tuseLayoutEffect(() => {\r\n\t\tif (!ref.current) return;\r\n\r\n\t\tconst handleResize = () => {\r\n\t\t\tif (ref.current) {\r\n\t\t\t\tconst newSize = ref.current.getBoundingClientRect()[\r\n\t\t\t\t\tsizeName as keyof DOMRect\r\n\t\t\t\t] as number;\r\n\t\t\t\tsetSize(newSize);\r\n\t\t\t}\r\n\t\t};\r\n\r\n\t\t// 초기 측정\r\n\t\thandleResize();\r\n\r\n\t\t// ResizeObserver 설정\r\n\t\tconst resizeObserver = new ResizeObserver(() => {\r\n\t\t\thandleResize();\r\n\t\t});\r\n\t\tresizeObserver.observe(ref.current);\r\n\r\n\t\t// 윈도우 리사이즈 이벤트도 청취\r\n\t\twindow.addEventListener(\"resize\", handleResize);\r\n\r\n\t\t// 클린업\r\n\t\treturn () => {\r\n\t\t\tresizeObserver.disconnect();\r\n\t\t\twindow.removeEventListener(\"resize\", handleResize);\r\n\t\t};\r\n\t}, [sizeName]);\r\n\r\n\treturn { ref, size };\r\n};\r\nexport const useFirstChildSize = (sizeName: string) => {\r\n\tconst ref = useRef<HTMLDivElement>(null);\r\n\tconst [sizes, setSizes] = useState<Array<number>>();\r\n\tuseEffect(() => {\r\n\t\tif (!ref.current || !ref.current.children[0]) return;\r\n\t\tif (!sizes || sizes.length === 0) {\r\n\t\t\tsetSizes([\r\n\t\t\t\tref.current.getBoundingClientRect()[\r\n\t\t\t\t\tsizeName as keyof DOMRect\r\n\t\t\t\t] as number,\r\n\t\t\t\tref.current.children[0].getBoundingClientRect()[\r\n\t\t\t\t\tsizeName as keyof DOMRect\r\n\t\t\t\t] as number,\r\n\t\t\t]);\r\n\t\t}\r\n\t}, []);\r\n\tuseEffect(() => {\r\n\t\tif (!ref.current || !ref.current.children[0]) return;\r\n\t\tconst childrenChangeObserver = new MutationObserver(\r\n\t\t\t(mutationList, observer) => {\r\n\t\t\t\tmutationList.forEach((mutation) => {\r\n\t\t\t\t\tif (!ref.current || !sizes || !ref.current.children[0])\r\n\t\t\t\t\t\treturn;\r\n\t\t\t\t\tconst newSize = ref.current.getBoundingClientRect()[\r\n\t\t\t\t\t\tsizeName as keyof DOMRect\r\n\t\t\t\t\t] as number;\r\n\t\t\t\t\t//if (newSize === sizes[0]) return;\r\n\t\t\t\t\tsetSizes([\r\n\t\t\t\t\t\tnewSize,\r\n\t\t\t\t\t\tref.current.children[0].getBoundingClientRect()[\r\n\t\t\t\t\t\t\tsizeName as keyof DOMRect\r\n\t\t\t\t\t\t] as number,\r\n\t\t\t\t\t]);\r\n\t\t\t\t});\r\n\t\t\t},\r\n\t\t);\r\n\t\tchildrenChangeObserver.observe(ref.current, {\r\n\t\t\tchildList: true,\r\n\t\t\tsubtree: true,\r\n\t\t});\r\n\t\tlet isFocus = false;\r\n\r\n\t\tconst windowResizeSubscribe = fromEvent<UIEvent>(window, \"resize\")\r\n\t\t\t.pipe(\r\n\t\t\t\tdistinctUntilChanged(),\r\n\t\t\t\tfilter(\r\n\t\t\t\t\t() =>\r\n\t\t\t\t\t\tdocument.activeElement?.tagName !== \"INPUT\" && !isFocus,\r\n\t\t\t\t),\r\n\t\t\t)\r\n\t\t\t.subscribe((ev) => {\r\n\t\t\t\tif (!ref.current || !ref.current.children[0]) return;\r\n\t\t\t\tsetSizes([\r\n\t\t\t\t\tref.current.getBoundingClientRect()[\r\n\t\t\t\t\t\tsizeName as keyof DOMRect\r\n\t\t\t\t\t] as number,\r\n\t\t\t\t\tref.current.children[0].getBoundingClientRect()[\r\n\t\t\t\t\t\tsizeName as keyof DOMRect\r\n\t\t\t\t\t] as number,\r\n\t\t\t\t]);\r\n\t\t\t});\r\n\r\n\t\tconst documentFocusoutSubscribe = fromEvent<FocusEvent>(\r\n\t\t\tdocument,\r\n\t\t\t\"focusout\",\r\n\t\t)\r\n\t\t\t.pipe(\r\n\t\t\t\tauditTime(1000),\r\n\t\t\t\tfilter((ev) => document.activeElement?.tagName !== \"INPUT\"),\r\n\t\t\t)\r\n\t\t\t.subscribe({\r\n\t\t\t\tnext: () => {\r\n\t\t\t\t\tif (isFocus) isFocus = false;\r\n\t\t\t\t},\r\n\t\t\t});\r\n\r\n\t\tconst documentFocusinSubscribe = fromEvent<FocusEvent>(\r\n\t\t\tdocument,\r\n\t\t\t\"focusin\",\r\n\t\t).subscribe({\r\n\t\t\tnext: (ev) =>\r\n\t\t\t\t(isFocus = (ev.target as Element).tagName === \"INPUT\"),\r\n\t\t});\r\n\r\n\t\treturn () => {\r\n\t\t\twindowResizeSubscribe.unsubscribe();\r\n\t\t\tdocumentFocusoutSubscribe.unsubscribe();\r\n\t\t\tdocumentFocusinSubscribe.unsubscribe();\r\n\t\t\tchildrenChangeObserver.disconnect();\r\n\t\t};\r\n\t}, [sizeName, sizes]);\r\n\treturn { ref, sizes };\r\n};\r\n"],"mappings":"AAAA,SAAS,WAAW,iBAAiB,QAAQ,gBAAgB;AAC7D,SAAS,WAAW,sBAAsB,QAAQ,iBAAiB;AAE5D,MAAM,UAAU,CAAC,aAAiC;AACxD,QAAM,MAAM,OAAuB,IAAI;AACvC,QAAM,CAAC,MAAM,OAAO,IAAI,SAA6B,MAAS;AAE9D,kBAAgB,MAAM;AACrB,QAAI,CAAC,IAAI,QAAS;AAElB,UAAM,eAAe,MAAM;AAC1B,UAAI,IAAI,SAAS;AAChB,cAAM,UAAU,IAAI,QAAQ,sBAAsB,EACjD,QACD;AACA,gBAAQ,OAAO;AAAA,MAChB;AAAA,IACD;AAGA,iBAAa;AAGb,UAAM,iBAAiB,IAAI,eAAe,MAAM;AAC/C,mBAAa;AAAA,IACd,CAAC;AACD,mBAAe,QAAQ,IAAI,OAAO;AAGlC,WAAO,iBAAiB,UAAU,YAAY;AAG9C,WAAO,MAAM;AACZ,qBAAe,WAAW;AAC1B,aAAO,oBAAoB,UAAU,YAAY;AAAA,IAClD;AAAA,EACD,GAAG,CAAC,QAAQ,CAAC;AAEb,SAAO,EAAE,KAAK,KAAK;AACpB;AACO,MAAM,oBAAoB,CAAC,aAAqB;AACtD,QAAM,MAAM,OAAuB,IAAI;AACvC,QAAM,CAAC,OAAO,QAAQ,IAAI,SAAwB;AAClD,YAAU,MAAM;AACf,QAAI,CAAC,IAAI,WAAW,CAAC,IAAI,QAAQ,SAAS,CAAC,EAAG;AAC9C,QAAI,CAAC,SAAS,MAAM,WAAW,GAAG;AACjC,eAAS;AAAA,QACR,IAAI,QAAQ,sBAAsB,EACjC,QACD;AAAA,QACA,IAAI,QAAQ,SAAS,CAAC,EAAE,sBAAsB,EAC7C,QACD;AAAA,MACD,CAAC;AAAA,IACF;AAAA,EACD,GAAG,CAAC,CAAC;AACL,YAAU,MAAM;AACf,QAAI,CAAC,IAAI,WAAW,CAAC,IAAI,QAAQ,SAAS,CAAC,EAAG;AAC9C,UAAM,yBAAyB,IAAI;AAAA,MAClC,CAAC,cAAc,aAAa;AAC3B,qBAAa,QAAQ,CAAC,aAAa;AAClC,cAAI,CAAC,IAAI,WAAW,CAAC,SAAS,CAAC,IAAI,QAAQ,SAAS,CAAC;AACpD;AACD,gBAAM,UAAU,IAAI,QAAQ,sBAAsB,EACjD,QACD;AAEA,mBAAS;AAAA,YACR;AAAA,YACA,IAAI,QAAQ,SAAS,CAAC,EAAE,sBAAsB,EAC7C,QACD;AAAA,UACD,CAAC;AAAA,QACF,CAAC;AAAA,MACF;AAAA,IACD;AACA,2BAAuB,QAAQ,IAAI,SAAS;AAAA,MAC3C,WAAW;AAAA,MACX,SAAS;AAAA,IACV,CAAC;AACD,QAAI,UAAU;AAEd,UAAM,wBAAwB,UAAmB,QAAQ,QAAQ,EAC/D;AAAA,MACA,qBAAqB;AAAA,MACrB;AAAA,QACC,MACC,SAAS,eAAe,YAAY,WAAW,CAAC;AAAA,MAClD;AAAA,IACD,EACC,UAAU,CAAC,OAAO;AAClB,UAAI,CAAC,IAAI,WAAW,CAAC,IAAI,QAAQ,SAAS,CAAC,EAAG;AAC9C,eAAS;AAAA,QACR,IAAI,QAAQ,sBAAsB,EACjC,QACD;AAAA,QACA,IAAI,QAAQ,SAAS,CAAC,EAAE,sBAAsB,EAC7C,QACD;AAAA,MACD,CAAC;AAAA,IACF,CAAC;AAEF,UAAM,4BAA4B;AAAA,MACjC;AAAA,MACA;AAAA,IACD,EACE;AAAA,MACA,UAAU,GAAI;AAAA,MACd,OAAO,CAAC,OAAO,SAAS,eAAe,YAAY,OAAO;AAAA,IAC3D,EACC,UAAU;AAAA,MACV,MAAM,MAAM;AACX,YAAI,QAAS,WAAU;AAAA,MACxB;AAAA,IACD,CAAC;AAEF,UAAM,2BAA2B;AAAA,MAChC;AAAA,MACA;AAAA,IACD,EAAE,UAAU;AAAA,MACX,MAAM,CAAC,OACL,UAAW,GAAG,OAAmB,YAAY;AAAA,IAChD,CAAC;AAED,WAAO,MAAM;AACZ,4BAAsB,YAAY;AAClC,gCAA0B,YAAY;AACtC,+BAAyB,YAAY;AACrC,6BAAuB,WAAW;AAAA,IACnC;AAAA,EACD,GAAG,CAAC,UAAU,KAAK,CAAC;AACpB,SAAO,EAAE,KAAK,MAAM;AACrB;","names":[]}
@@ -1 +0,0 @@
1
- {"version":3,"sources":["../../src/flex-layout/index.ts"],"sourcesContent":["//src/index.ts\r\n\r\nexport * from \"./components\";\r\n\r\nexport * from \"./hooks\";\r\n\r\nexport * from \"./providers\";\r\n\r\nexport * from \"./utils\";\r\n\r\nexport * from \"./store\";\r\n"],"mappings":";;;;;;;;;;;;;;;AAAA;AAAA;AAEA,gCAAc,yBAFd;AAIA,gCAAc,oBAJd;AAMA,gCAAc,wBANd;AAQA,gCAAc,oBARd;AAUA,gCAAc,oBAVd;","names":[]}
@@ -1 +0,0 @@
1
- {"version":3,"sources":["../../src/flex-layout/index.ts"],"sourcesContent":["//src/index.ts\r\n\r\nexport * from \"./components\";\r\n\r\nexport * from \"./hooks\";\r\n\r\nexport * from \"./providers\";\r\n\r\nexport * from \"./utils\";\r\n\r\nexport * from \"./store\";\r\n"],"mappings":"AAEA,cAAc;AAEd,cAAc;AAEd,cAAc;AAEd,cAAc;AAEd,cAAc;","names":[]}
@@ -1 +0,0 @@
1
- {"version":3,"sources":["../../../src/flex-layout/providers/FlexLayoutContext.tsx"],"sourcesContent":["\"use client\";\r\nimport { createContext, ReactNode, useContext } from \"react\";\r\nimport { FlexLayoutContextValue } from \"../types/FlexLayoutTypes\";\r\n\r\n// Context 생성\r\nconst FlexLayoutContext = createContext<FlexLayoutContextValue | null>(null);\r\n\r\n// Context를 사용하기 위한 Custom Hook\r\nexport function useFlexLayoutContext() {\r\n\tconst context = useContext(FlexLayoutContext);\r\n\tif (!context) {\r\n\t\tthrow new Error(\r\n\t\t\t\"useFlexLayoutContext must be used within FlexLayoutContext.Provider\",\r\n\t\t);\r\n\t}\r\n\treturn context;\r\n}\r\n\r\n// Provider 컴포넌트\r\ninterface FlexLayoutProviderProps {\r\n\tvalue: FlexLayoutContextValue;\r\n\tchildren: ReactNode;\r\n}\r\n\r\nexport function FlexLayoutProvider({\r\n\tvalue,\r\n\tchildren,\r\n}: FlexLayoutProviderProps) {\r\n\treturn (\r\n\t\t<FlexLayoutContext.Provider value={value}>\r\n\t\t\t{children}\r\n\t\t</FlexLayoutContext.Provider>\r\n\t);\r\n}\r\n"],"mappings":";;;;;;;;;;;;;;;;;;;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AA6BE;AA5BF,mBAAqD;AAIrD,MAAM,wBAAoB,4BAA6C,IAAI;AAGpE,SAAS,uBAAuB;AACtC,QAAM,cAAU,yBAAW,iBAAiB;AAC5C,MAAI,CAAC,SAAS;AACb,UAAM,IAAI;AAAA,MACT;AAAA,IACD;AAAA,EACD;AACA,SAAO;AACR;AAQO,SAAS,mBAAmB;AAAA,EAClC;AAAA,EACA;AACD,GAA4B;AAC3B,SACC,4CAAC,kBAAkB,UAAlB,EAA2B,OAC1B,UACF;AAEF;","names":[]}
@@ -1 +0,0 @@
1
- {"version":3,"sources":["../../../src/flex-layout/providers/FlexLayoutContext.tsx"],"sourcesContent":["\"use client\";\r\nimport { createContext, ReactNode, useContext } from \"react\";\r\nimport { FlexLayoutContextValue } from \"../types/FlexLayoutTypes\";\r\n\r\n// Context 생성\r\nconst FlexLayoutContext = createContext<FlexLayoutContextValue | null>(null);\r\n\r\n// Context를 사용하기 위한 Custom Hook\r\nexport function useFlexLayoutContext() {\r\n\tconst context = useContext(FlexLayoutContext);\r\n\tif (!context) {\r\n\t\tthrow new Error(\r\n\t\t\t\"useFlexLayoutContext must be used within FlexLayoutContext.Provider\",\r\n\t\t);\r\n\t}\r\n\treturn context;\r\n}\r\n\r\n// Provider 컴포넌트\r\ninterface FlexLayoutProviderProps {\r\n\tvalue: FlexLayoutContextValue;\r\n\tchildren: ReactNode;\r\n}\r\n\r\nexport function FlexLayoutProvider({\r\n\tvalue,\r\n\tchildren,\r\n}: FlexLayoutProviderProps) {\r\n\treturn (\r\n\t\t<FlexLayoutContext.Provider value={value}>\r\n\t\t\t{children}\r\n\t\t</FlexLayoutContext.Provider>\r\n\t);\r\n}\r\n"],"mappings":";AA6BE;AA5BF,SAAS,eAA0B,kBAAkB;AAIrD,MAAM,oBAAoB,cAA6C,IAAI;AAGpE,SAAS,uBAAuB;AACtC,QAAM,UAAU,WAAW,iBAAiB;AAC5C,MAAI,CAAC,SAAS;AACb,UAAM,IAAI;AAAA,MACT;AAAA,IACD;AAAA,EACD;AACA,SAAO;AACR;AAQO,SAAS,mBAAmB;AAAA,EAClC;AAAA,EACA;AACD,GAA4B;AAC3B,SACC,oBAAC,kBAAkB,UAAlB,EAA2B,OAC1B,UACF;AAEF;","names":[]}