@byeolnaerim/flex-layout 0.0.2

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.
@@ -0,0 +1 @@
1
+ {"version":3,"sources":["../src/flex-layout/store/FlexLayoutContainerStore.ts","../src/flex-layout/utils/FlexLayoutUtils.ts","../src/flex-layout/providers/FlexLayoutHooks.tsx","../src/flex-layout/hooks/useDrag.ts"],"names":["equal","BehaviorSubject","filter","map","distinctUntilChanged","filterChildren","combineLatest","e","Subject","useState","useEffect","switchMap","EMPTY","fromEvent","buffer","debounceTime","useRef","useCallback","setFolderEvent"],"mappings":"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","file":"index.cjs","sourcesContent":["\"use client\";\r\nimport equal from \"fast-deep-equal\";\r\nimport { RefObject } from \"react\";\r\nimport { BehaviorSubject, combineLatest } from \"rxjs\";\r\nimport { distinctUntilChanged, filter, map } from \"rxjs/operators\";\r\nimport { DropTargetComponent } from \"../hooks/useDrag\";\r\n\r\n/**\r\n * 이전 값과 새 값이 동일하지 않을 때만 store를 업데이트하는 유틸 함수\r\n */\r\nfunction updateScrollStore<T>(subject: BehaviorSubject<T>, newValue: T) {\r\n\tconst currentValue = subject.getValue();\r\n\t// deep 비교를 통해 실제 변경이 있는 경우만 next\r\n\tif (!equal(currentValue, newValue)) {\r\n\t\tsubject.next(newValue);\r\n\t}\r\n}\r\n// 동일한지 확인 후 업데이트하는 유틸\r\nfunction updateRefStore(store: BehaviorSubject<RefStore>, newState: RefStore) {\r\n\tconst prevState = store.getValue();\r\n\tif (!equal(prevState, newState)) {\r\n\t\tstore.next(newState);\r\n\t}\r\n}\r\n\r\nfunction updateSplitScreenStore(newValue: LayoutSplitScreenState) {\r\n\tconst prevValue = layoutSplitScreenStore.getValue();\r\n\t// deep-equal 로 비교\r\n\tif (!equal(prevValue, newValue)) {\r\n\t\tlayoutSplitScreenStore.next(newValue);\r\n\t}\r\n}\r\n\r\n// 구독 시 이전 상태들을 축적하여 관리\r\n// const stateWithHistory$ = flexContainerStore.pipe(\r\n// scan((acc, newState) => [...acc, newState], [] as RefStore[])\r\n// );\r\n\r\nexport interface ScrollPosition {\r\n\tx: number;\r\n\ty: number;\r\n}\r\n\r\nexport const scrollPositions: Record<string, ScrollPosition> = {};\r\n\r\nconst scrollPositionsSubject = new BehaviorSubject<\r\n\tRecord<string, ScrollPosition>\r\n>(scrollPositions);\r\n\r\n/**\r\n * 스크롤 위치 업데이트 함수\r\n *\r\n * 기존: 항상 store.next()가 호출됨 → 바뀌지 않았다면 건너뛰도록 변경\r\n */\r\nexport const setScrollPosition = (\r\n\tlayoutName: string,\r\n\tposition: ScrollPosition,\r\n) => {\r\n\tconst current = scrollPositionsSubject.getValue();\r\n\tconst prevPos = current[layoutName];\r\n\r\n\t// x, y 모두 동일하면 업데이트할 필요가 없으므로 조기 반환\r\n\tif (prevPos && prevPos.x === position.x && prevPos.y === position.y) {\r\n\t\treturn;\r\n\t}\r\n\r\n\t// 변경사항이 있으면 새 객체를 만들어 넘김\r\n\tconst newPositions = {\r\n\t\t...current,\r\n\t\t[layoutName]: position,\r\n\t};\r\n\r\n\tupdateScrollStore(scrollPositionsSubject, newPositions);\r\n};\r\n\r\n/**\r\n * 스크롤 위치 구독\r\n */\r\nexport const getScrollPosition = (layoutName: string) => {\r\n\treturn scrollPositionsSubject.pipe(\r\n\t\t// 해당 layoutName이 정의되지 않았을 때는 제외\r\n\t\tfilter((e) => e[layoutName] !== undefined),\r\n\t\tmap((positions) => positions[layoutName]),\r\n\t\tdistinctUntilChanged(\r\n\t\t\t(prev, curr) => prev?.x === curr?.x && prev?.y === curr?.y,\r\n\t\t),\r\n\t);\r\n};\r\n\r\nexport const removeScrollPosition = (layoutName: string) => {\r\n\tconst current = scrollPositionsSubject.getValue();\r\n\tdelete current[layoutName];\r\n\r\n\t// 꼭 삭제 후에도 이전 상태와 달라졌는지 확인\r\n\tconst newPositions = { ...current };\r\n\tupdateScrollStore(scrollPositionsSubject, newPositions);\r\n};\r\n\r\nexport type SplitScreenComponents = {\r\n\tafterDropTargetComponent: DropTargetComponent[];\r\n\tbeforeDropTargetComponent: DropTargetComponent[];\r\n\tcenterDropTargetComponent: DropTargetComponent[];\r\n\tdirection: \"row\" | \"column\";\r\n};\r\n\r\nexport type LayoutSplitScreenState = Record<\r\n\tstring,\r\n\tRecord<string, SplitScreenComponents>\r\n>;\r\n\r\nexport const layoutSplitScreenStore =\r\n\tnew BehaviorSubject<LayoutSplitScreenState>({});\r\n\r\nexport const setSplitScreen = (\r\n\trootName: string,\r\n\tlayoutName: string,\r\n\tnewComponents: SplitScreenComponents,\r\n) => {\r\n\tconst current = layoutSplitScreenStore.getValue();\r\n\tconst updatedLayout = { ...(current[rootName] || {}) };\r\n\tupdatedLayout[layoutName] = newComponents;\r\n\r\n\tconst newStoreValue = {\r\n\t\t...current,\r\n\t\t[rootName]: updatedLayout,\r\n\t};\r\n\tupdateSplitScreenStore(newStoreValue);\r\n};\r\n\r\nexport const resetRootSplitScreen = (rootName: string) => {\r\n\tconst current = layoutSplitScreenStore.getValue();\r\n\t// rootName 아래만 초기화\r\n\tconst newStoreValue = {\r\n\t\t...current,\r\n\t\t[rootName]: {},\r\n\t};\r\n\tupdateSplitScreenStore(newStoreValue);\r\n};\r\n\r\nexport const removeSplitScreenChild = (\r\n\trootName: string,\r\n\tlayoutName: string,\r\n) => {\r\n\tconst current = layoutSplitScreenStore.getValue();\r\n\tif (!current[rootName]) return;\r\n\r\n\tconst updatedLayout = { ...current[rootName] };\r\n\tdelete updatedLayout[layoutName];\r\n\r\n\tconst newStoreValue = {\r\n\t\t...current,\r\n\t\t[rootName]: updatedLayout,\r\n\t};\r\n\tupdateSplitScreenStore(newStoreValue);\r\n};\r\n\r\nexport const getCurrentSplitScreenComponents = (\r\n\trootName: string,\r\n\tlayoutName: string,\r\n) => {\r\n\tconst current = layoutSplitScreenStore.getValue();\r\n\tif (!current[rootName]) return;\r\n\treturn current[rootName][layoutName];\r\n};\r\n\r\nexport const getSplitScreen = (rootName: string, layoutName: string) => {\r\n\treturn layoutSplitScreenStore.pipe(\r\n\t\tmap((splitScreen) => splitScreen[rootName][layoutName]),\r\n\t\tdistinctUntilChanged((prev, curr) => {\r\n\t\t\t// 이전 상태와 현재 상태를 비교하여 동일하면 필터링\r\n\t\t\tconst filterChildren = (obj: any) => {\r\n\t\t\t\t// 객체 복사 후 children 속성 제거\r\n\t\t\t\tconst { children, component, targetComponent, x, y, ...rest } =\r\n\t\t\t\t\tobj || {};\r\n\t\t\t\treturn rest;\r\n\t\t\t};\r\n\t\t\treturn equal(filterChildren(prev), filterChildren(curr));\r\n\t\t}),\r\n\t);\r\n};\r\n\r\n// 중첩된 객체 구조로 ref를 관리하는 타입\r\ntype RefStore = {\r\n\t[layoutName: string]: {\r\n\t\t[containerName: string]: RefObject<HTMLElement | null>;\r\n\t};\r\n};\r\n\r\n// 초기값으로 빈 객체를 설정한 BehaviorSubject 생성\r\nexport const flexContainerStore = new BehaviorSubject<RefStore>({});\r\n\r\nexport const flexResizePanelStore = new BehaviorSubject<RefStore>({});\r\n/**\r\n * ref를 업데이트하는 함수\r\n * - 기존: 무조건 next() → 새/이전 상태 비교 후 다를 경우에만 next()\r\n */\r\nexport const setContainerRef = <T extends HTMLElement>(\r\n\tlayoutName: string,\r\n\tcontainerName: string,\r\n\tref: React.RefObject<T | null> | null,\r\n) => {\r\n\tconst currentRefs = flexContainerStore.getValue();\r\n\tconst updatedLayoutRefs = { ...(currentRefs[layoutName] || {}) };\r\n\r\n\tif (ref === null) {\r\n\t\tdelete updatedLayoutRefs[containerName];\r\n\t} else {\r\n\t\tupdatedLayoutRefs[containerName] = ref;\r\n\t}\r\n\r\n\tconst newRefs: RefStore = {\r\n\t\t...currentRefs,\r\n\t\t[layoutName]: updatedLayoutRefs,\r\n\t};\r\n\r\n\tupdateRefStore(flexContainerStore, newRefs);\r\n};\r\n\r\nexport const setResizePanelRef = <T extends HTMLElement>(\r\n\tlayoutName: string,\r\n\tcontainerName: string,\r\n\tref: React.RefObject<T | null> | null,\r\n) => {\r\n\tconst currentRefs = flexResizePanelStore.getValue();\r\n\tconst updatedLayoutRefs = { ...(currentRefs[layoutName] || {}) };\r\n\r\n\tif (ref === null) {\r\n\t\tdelete updatedLayoutRefs[containerName];\r\n\t} else {\r\n\t\tupdatedLayoutRefs[containerName] = ref;\r\n\t}\r\n\r\n\tconst newRefs: RefStore = {\r\n\t\t...currentRefs,\r\n\t\t[layoutName]: updatedLayoutRefs,\r\n\t};\r\n\r\n\tupdateRefStore(flexResizePanelStore, newRefs);\r\n};\r\n\r\nexport const getLayoutInfos = (layoutName: string) => {\r\n\treturn combineLatest([flexContainerStore, flexResizePanelStore]).pipe(\r\n\t\tmap(([containerRefs, resizePanelRefs]) => {\r\n\t\t\t// 두 Store에서 layoutName에 해당하는 값을 병합\r\n\t\t\tconst containerData = containerRefs[layoutName] || {};\r\n\t\t\tconst resizePanelData = resizePanelRefs[layoutName] || {};\r\n\r\n\t\t\t// container와 resizePanel 데이터 합치기\r\n\t\t\treturn {\r\n\t\t\t\tcontainer: containerData,\r\n\t\t\t\tresizePanel: resizePanelData,\r\n\t\t\t};\r\n\t\t}),\r\n\t\tfilter((result) => result.container !== null), // 빈 객체 제외\r\n\t);\r\n};\r\n\r\n// 특정 containerName의 ref를 구독하는 함수\r\n// layoutName이 지정되지 않으면 전체 layout에서 해당하는 containerName의 ref를 찾음\r\nexport const getContainerRef = ({\r\n\tcontainerName,\r\n\tlayoutName,\r\n}: {\r\n\tcontainerName: string;\r\n\tlayoutName?: string;\r\n}) => {\r\n\treturn flexContainerStore.pipe(\r\n\t\tmap((refs: RefStore) => {\r\n\t\t\tif (layoutName) {\r\n\t\t\t\t// 지정된 layoutName에서 해당 containerName의 ref 반환\r\n\t\t\t\treturn refs[layoutName]?.[containerName] || null;\r\n\t\t\t} else {\r\n\t\t\t\t// 모든 layout에서 해당 containerName의 ref 찾기\r\n\t\t\t\treturn Object.entries(refs).find(\r\n\t\t\t\t\t([key, value]) => refs[key][containerName],\r\n\t\t\t\t)?.[1][containerName];\r\n\t\t\t}\r\n\t\t\t// else {\r\n\t\t\t// // 모든 layout에서 해당 containerName의 ref 찾기\r\n\t\t\t// for (const layout in refs) {\r\n\t\t\t// if (refs[layout][containerName]) {\r\n\t\t\t// return refs[layout][containerName];\r\n\t\t\t// }\r\n\t\t\t// }\r\n\t\t\t// return null;\r\n\t\t\t// }\r\n\t\t}),\r\n\t\tfilter((ref) => ref !== null),\r\n\t);\r\n};\r\n\r\nexport const getResizePanelRef = ({\r\n\tcontainerName,\r\n\tlayoutName,\r\n}: {\r\n\tcontainerName: string;\r\n\tlayoutName?: string;\r\n}) => {\r\n\treturn flexResizePanelStore.pipe(\r\n\t\tmap((refs: RefStore) => {\r\n\t\t\tif (layoutName) {\r\n\t\t\t\t// 지정된 layoutName에서 해당 containerName의 ref 반환\r\n\t\t\t\treturn refs[layoutName]?.[containerName] || null;\r\n\t\t\t} else {\r\n\t\t\t\t// 모든 layout에서 해당 containerName의 ref 찾기\r\n\t\t\t\treturn Object.entries(refs).find(\r\n\t\t\t\t\t([key, value]) => refs[key][containerName],\r\n\t\t\t\t)?.[1][containerName];\r\n\t\t\t}\r\n\t\t\t// else {\r\n\t\t\t// // 모든 layout에서 해당 containerName의 ref 찾기\r\n\t\t\t// for (const layout in refs) {\r\n\t\t\t// if (refs[layout][containerName]) {\r\n\t\t\t// return refs[layout][containerName];\r\n\t\t\t// }\r\n\t\t\t// }\r\n\t\t\t// return null;\r\n\t\t\t// }\r\n\t\t}),\r\n\t\tfilter((ref) => ref !== null),\r\n\t);\r\n};\r\n","export function isDocumentOut({ x, y }: { x: number; y: number }) {\r\n if (typeof window == 'undefined') return;\r\n const { innerWidth, innerHeight, scrollX, scrollY } = window;\r\n\r\n return (\r\n x < 0 || y < 0 || x > innerWidth + scrollX || y > innerHeight + scrollY\r\n );\r\n}\r\n\r\nlet lastTouchEvent: globalThis.TouchEvent;\r\nexport function getClientXy(event: Event) {\r\n let clientX: number;\r\n let clientY: number;\r\n if (window.MouseEvent && event instanceof window.MouseEvent) {\r\n clientX = event.clientX;\r\n clientY = event.clientY;\r\n } else if (window.TouchEvent && event instanceof window.TouchEvent) {\r\n const _event = event.touches.length == 0 ? lastTouchEvent : event;\r\n clientX = _event!.touches[0].clientX;\r\n clientY = _event!.touches[0].clientY;\r\n lastTouchEvent = event;\r\n } else {\r\n return; // 해당 이벤트 타입이 MouseEvent나 TouchEvent가 아니라면 무시\r\n }\r\n return { clientX, clientY };\r\n}\r\n\r\nexport function isOverMove(elementSize: number, elementMinSize: number) {\r\n return (\r\n Math.floor(elementSize) <= 0 ||\r\n (isNaN(elementMinSize)\r\n ? false\r\n : elementMinSize >= Math.floor(elementSize))\r\n );\r\n}\r\n\r\nexport function findNotCloseFlexContent(\r\n target: HTMLElement | Element | null,\r\n direction: 'previousElementSibling' | 'nextElementSibling'\r\n) {\r\n if (!target) return target;\r\n let _target = target as HTMLElement;\r\n const isCloseCheck = () => {\r\n let grow =\r\n parseFloat(window.getComputedStyle(_target).flex.split(' ')[0]) ||\r\n 0;\r\n if (grow == 0) {\r\n return true;\r\n } else {\r\n return false;\r\n }\r\n };\r\n while (isCloseCheck()) {\r\n let nextTarget = _target[direction]?.[direction];\r\n _target = nextTarget as HTMLElement;\r\n if (!_target) {\r\n break;\r\n }\r\n }\r\n return _target as HTMLElement | HTMLDivElement | null;\r\n}\r\n\r\nexport function remain(flexContainerList: Array<HTMLElement>) {\r\n return new Promise(resolve => {\r\n let notGrowList: Array<HTMLElement> = [];\r\n let totalGrow = flexContainerList.reduce((t, e, i) => {\r\n if (e.hasAttribute('data-grow') == false) {\r\n notGrowList.push(e);\r\n return t;\r\n }\r\n let grow = parseFloat(e.dataset.grow || '');\r\n e.style.flex = `${grow} 1 0%`;\r\n t -= grow;\r\n return t;\r\n }, flexContainerList.length);\r\n\r\n if (notGrowList.length != 0) {\r\n resize(notGrowList, totalGrow);\r\n }\r\n\r\n resolve(flexContainerList);\r\n });\r\n}\r\n\r\nexport function resize(list: Array<HTMLElement>, totalGrow: number) {\r\n return new Promise(resolve => {\r\n // totalGrow 값을 리스트의 개수로 나누어 균등 할당\r\n let resizeWeight = totalGrow / list.length;\r\n list.forEach(e => {\r\n e.dataset.grow = resizeWeight.toString();\r\n e.style.flex = `${resizeWeight} 1 0%`;\r\n });\r\n resolve(resizeWeight);\r\n });\r\n}\r\n\r\nexport function mathWeight(totalCount: number, totalGrow: number) {\r\n return 1 + (totalGrow - totalCount) / totalCount;\r\n}\r\nexport function mathGrow(\r\n childSize: number,\r\n parentSize: number,\r\n containerCount: number\r\n) {\r\n return containerCount * (childSize / parentSize);\r\n}\r\n\r\nexport function getGrow(growTarget: HTMLElement | Element) {\r\n const target =\r\n growTarget instanceof Element\r\n ? (growTarget as HTMLElement)\r\n : growTarget;\r\n return (\r\n parseFloat(target.style.flex.split(' ')[0]) ||\r\n parseFloat(target.dataset.grow || '')\r\n );\r\n}\r\n\r\nexport function closeFlex(\r\n resizeTarget: HTMLElement,\r\n containers: HTMLElement[],\r\n {\r\n isResize = false,\r\n isDsiabledResizePanel = false,\r\n sizeName,\r\n }: {\r\n isResize?: boolean;\r\n isDsiabledResizePanel?: boolean;\r\n sizeName: 'width' | 'height';\r\n }\r\n) {\r\n return new Promise(resolve => {\r\n if (!resizeTarget.hasAttribute('data-is_resize_panel')) {\r\n // resolve(resizeTarget);\r\n // return;\r\n } else if (isDsiabledResizePanel) {\r\n resizeTarget.dataset.is_resize_panel = 'false';\r\n }\r\n\r\n resizeTarget.dataset.prev_grow = getGrow(resizeTarget).toString();\r\n\r\n let notCloseList = containers.filter(\r\n e => e.style.flex != '0 1 0%' && e != resizeTarget\r\n );\r\n let notCloseAndOpenTargetList = [...notCloseList, resizeTarget];\r\n //let resizeWeight = this.mathWeight(notCloseList, this.#forResizeList.length);\r\n notCloseAndOpenTargetList.forEach(e => {\r\n e.style.transition = 'flex 0.5s';\r\n e.ontransitionend = event => {\r\n if (event.propertyName != 'flex-grow') {\r\n return;\r\n }\r\n notCloseAndOpenTargetList.forEach(\r\n e => (e.style.transition = '')\r\n );\r\n //e.style.transition = '';\r\n e.ontransitionend = () => {};\r\n };\r\n\r\n if (e == resizeTarget) {\r\n e.dataset.grow = '0';\r\n e.style.flex = `0 1 0%`;\r\n return;\r\n }\r\n\r\n if (isResize) {\r\n return;\r\n }\r\n\r\n let percent = getGrow(e) / containers.length;\r\n //let percentWeight = this.#forResizeList.length * percent;\r\n //let remainWeight = resizeWeight * percent;\r\n if (notCloseList.length == 1) {\r\n e.dataset.grow = containers.length.toString();\r\n e.style.flex = `${containers.length} 1 0%`;\r\n return;\r\n }\r\n e.dataset.grow = (containers.length * percent).toString();\r\n e.style.flex = `${containers.length * percent} 1 0%`;\r\n });\r\n\r\n if (isResize) {\r\n resize(notCloseList, containers.length);\r\n }\r\n\r\n resolve(resizeTarget);\r\n });\r\n}\r\n\r\nexport function openFlex(\r\n resizeTarget: HTMLElement,\r\n containers: HTMLElement[],\r\n {\r\n isPrevSizeOpen = false,\r\n isResize = false,\r\n openGrowImportant = 0,\r\n sizeName,\r\n }: {\r\n isPrevSizeOpen?: boolean;\r\n isResize?: boolean;\r\n openGrowImportant?: number;\r\n sizeName?: 'width' | 'height'; // 유니언 타입으로 수정\r\n }\r\n) {\r\n return new Promise(resolve => {\r\n if (!resizeTarget.hasAttribute('data-is_resize_panel')) {\r\n // resolve(resizeTarget);\r\n // return;\r\n } else if (\r\n resizeTarget.hasAttribute('data-is_resize_panel') &&\r\n resizeTarget.dataset.is_resize_panel == 'false'\r\n ) {\r\n resizeTarget.dataset.is_resize_panel = 'true';\r\n }\r\n\r\n let notCloseList = containers.filter(\r\n e => e.style.flex != '0 1 0%' && e != resizeTarget\r\n );\r\n let notCloseAndOpenTargetList = [...notCloseList, resizeTarget];\r\n //let resizeWeight = this.mathWeight(notCloseAndOpenTargetList, this.#forResizeList.length);\r\n let openTargetGrow = 1;\r\n const sizeStyleName = ('client' +\r\n sizeName!.charAt(0).toUpperCase() +\r\n sizeName!.substring(1)) as 'clientHeight' | 'clientWidth';\r\n const parentSize =\r\n (sizeName &&\r\n resizeTarget.parentElement &&\r\n resizeTarget.parentElement[sizeStyleName]) ||\r\n 0;\r\n if (isPrevSizeOpen && resizeTarget.hasAttribute('data-prev_grow')) {\r\n openTargetGrow =\r\n parseFloat(resizeTarget.dataset.prev_grow || '1') || 1;\r\n //resizeTarget.removeAttribute('data-prev_grow');\r\n } else if (parentSize && parentSize !== 0) {\r\n openTargetGrow =\r\n (parentSize / notCloseList.length / (parentSize - 1)) *\r\n containers.length;\r\n } else {\r\n openTargetGrow = 1;\r\n }\r\n if (openGrowImportant) {\r\n openTargetGrow = openGrowImportant;\r\n }\r\n openTargetGrow = openTargetGrow === Infinity ? 1 : openTargetGrow;\r\n //notCloseList.forEach(e=>{\r\n notCloseAndOpenTargetList.forEach(e => {\r\n e.style.transition = 'flex 0.5s';\r\n e.ontransitionend = event => {\r\n if (event.propertyName != 'flex-grow') {\r\n return;\r\n }\r\n notCloseAndOpenTargetList.forEach(\r\n e => (e.style.transition = '')\r\n );\r\n //e.style.transition = '';\r\n e.ontransitionend = () => {};\r\n };\r\n\r\n if (e == resizeTarget) {\r\n resizeTarget.dataset.grow = openTargetGrow.toString();\r\n resizeTarget.style.flex = `${openTargetGrow} 1 0%`;\r\n return;\r\n }\r\n\r\n if (isResize) {\r\n return;\r\n }\r\n\r\n let grow =\r\n (parentSize / notCloseList.length / (parentSize - 1)) *\r\n (containers.length - openTargetGrow);\r\n grow = grow === Infinity ? 1 : grow;\r\n //let percent = getGrow(e) / totalGrow - openTargetGrow / totalGrow;\r\n e.dataset.grow = grow.toString();\r\n\r\n e.style.flex = `${grow} 1 0%`;\r\n });\r\n\r\n if (isResize) {\r\n resize(notCloseAndOpenTargetList, containers.length);\r\n }\r\n\r\n resolve(openTargetGrow);\r\n });\r\n}\r\n","\"use client\";\r\n\r\nimport { useEffect, useState } from \"react\";\r\nimport {\r\n\tflexContainerStore,\r\n\tgetLayoutInfos,\r\n\tgetResizePanelRef,\r\n} from \"../store/FlexLayoutContainerStore\";\r\nimport {\r\n\tcloseFlex,\r\n\tgetGrow,\r\n\tmathGrow,\r\n\topenFlex,\r\n} from \"../utils/FlexLayoutUtils\";\r\n\r\nimport {\r\n\tbuffer,\r\n\tdebounceTime,\r\n\tEMPTY,\r\n\tfilter,\r\n\tfromEvent,\r\n\tmap,\r\n\tSubject,\r\n\tswitchMap,\r\n} from \"rxjs\";\r\nconst g = globalThis as any;\r\ng.__FLEX_SUBJECTS__ ??= { openClose: {}, spread: {} };\r\n\r\nexport type SubjectMap<T> = Record<string, Subject<T>>;\r\n\r\n// 컨테이너 상태 타입 정의\r\ninterface ContainerStateRequest {\r\n\tmode: \"toggle\" | \"open\" | \"close\";\r\n\tinitOpenState?: boolean;\r\n\tonOpen?: () => void;\r\n\tonClose?: () => void;\r\n\topenOption?: {\r\n\t\tisPrevSizeOpen?: boolean;\r\n\t\tisResize?: boolean;\r\n\t\topenGrowImportant?: number;\r\n\t};\r\n\tcloseOption?: { isResize?: boolean; isDsiabledResizePanel?: boolean };\r\n}\r\n\r\ninterface ContainerState {\r\n\tisOpen: boolean;\r\n\ttargetContainer: HTMLElement;\r\n\tgrow: number;\r\n}\r\nexport const containerOpenCloseSubjectMap: SubjectMap<ContainerStateRequest> =\r\n\tg.__FLEX_SUBJECTS__.openClose;\r\nexport const containerSpreadSubjectMap: SubjectMap<ContainerState> =\r\n\tg.__FLEX_SUBJECTS__.spread;\r\n\r\n// export const containerOpenCloseSubjectMap: SubjectMap<ContainerStateRequest> = (\r\n// Object.keys({}) as Array<string>\r\n// ).reduce((total, key) => {\r\n// total[key] = new Subject<ContainerStateRequest>();\r\n// return total;\r\n// }, {} as SubjectMap<ContainerStateRequest>);\r\n\r\n// export const containerSpreadSubjectMap: SubjectMap<ContainerState> = (\r\n// Object.keys({}) as Array<string>\r\n// ).reduce((total, key) => {\r\n// total[key] = new Subject<ContainerState>();\r\n// return total;\r\n// }, {} as SubjectMap<ContainerState>);\r\n\r\nexport const ContainerOpenCloseProvider = ({\r\n\tlayoutName,\r\n\tcontainerName,\r\n\tsizeName,\r\n}: {\r\n\tlayoutName: string;\r\n\tcontainerName: string;\r\n\tsizeName: \"width\" | \"height\";\r\n}) => {\r\n\t// SubjectMap에 중복 체크 후 Subject 추가\r\n\tif (!containerOpenCloseSubjectMap[containerName]) {\r\n\t\tcontainerOpenCloseSubjectMap[containerName] =\r\n\t\t\tnew Subject<ContainerStateRequest>();\r\n\t}\r\n\tif (!containerSpreadSubjectMap[containerName]) {\r\n\t\tcontainerSpreadSubjectMap[containerName] =\r\n\t\t\tnew Subject<ContainerState>();\r\n\t}\r\n\r\n\tconst [containers, setContainers] = useState<HTMLElement[]>([]);\r\n\tconst [container, setContainer] = useState<HTMLElement>();\r\n\r\n\tuseEffect(() => {\r\n\t\t// 특정 layoutName과 containerName을 통해 ref를 구독\r\n\t\tconst subscription = getLayoutInfos(layoutName as string).subscribe(\r\n\t\t\t(layout) => {\r\n\t\t\t\tif (\r\n\t\t\t\t\t!layout ||\r\n\t\t\t\t\t!layout.container[containerName] ||\r\n\t\t\t\t\t!layout.container[containerName].current\r\n\t\t\t\t)\r\n\t\t\t\t\treturn;\r\n\t\t\t\tsetContainers(\r\n\t\t\t\t\tObject.values(layout.container)\r\n\t\t\t\t\t\t.filter(\r\n\t\t\t\t\t\t\t(e): e is { current: HTMLElement } =>\r\n\t\t\t\t\t\t\t\te.current !== null,\r\n\t\t\t\t\t\t)\r\n\t\t\t\t\t\t.map((e) => e.current),\r\n\t\t\t\t);\r\n\t\t\t\tsetContainer(layout.container[containerName].current);\r\n\t\t\t},\r\n\t\t);\r\n\r\n\t\t// 구독 해제\r\n\t\treturn () => subscription.unsubscribe();\r\n\t}, [containerName, layoutName]);\r\n\tuseEffect(() => {\r\n\t\tconst styleName = `${sizeName.charAt(0).toUpperCase() + sizeName.substring(1)}`;\r\n\t\tconst clientSize = (\"client\" + styleName) as\r\n\t\t\t| \"clientWidth\"\r\n\t\t\t| \"clientHeight\";\r\n\t\tconst outerSize = (\"outer\" + styleName) as \"outerWidth\" | \"outerHeight\";\r\n\t\tconst maxSize = (\"max\" + styleName) as \"maxWidth\" | \"maxHeight\";\r\n\t\tconst subscribe = containerOpenCloseSubjectMap[containerName].subscribe(\r\n\t\t\t({\r\n\t\t\t\tmode,\r\n\t\t\t\tinitOpenState: isOpenState,\r\n\t\t\t\tonClose,\r\n\t\t\t\tonOpen,\r\n\t\t\t\topenOption = {},\r\n\t\t\t\tcloseOption = {},\r\n\t\t\t}) => {\r\n\t\t\t\tif (!container || containers.length === 0) return;\r\n\t\t\t\tconst currentGrow = getGrow(container);\r\n\t\t\t\tconst styleMap = window.getComputedStyle(container);\r\n\t\t\t\tconst maxSizeGrow = mathGrow(\r\n\t\t\t\t\tparseInt(styleMap[maxSize]),\r\n\t\t\t\t\t(container.parentElement &&\r\n\t\t\t\t\t\tcontainer.parentElement[clientSize]) ||\r\n\t\t\t\t\t\twindow[outerSize],\r\n\t\t\t\t\tcontainers.length,\r\n\t\t\t\t);\r\n\t\t\t\tconst open = () =>\r\n\t\t\t\t\topenFlex(container, containers, {\r\n\t\t\t\t\t\tsizeName,\r\n\t\t\t\t\t\t...(isNaN(maxSizeGrow)\r\n\t\t\t\t\t\t\t? {}\r\n\t\t\t\t\t\t\t: {\r\n\t\t\t\t\t\t\t\t\topenGrowImportant: maxSizeGrow,\r\n\t\t\t\t\t\t\t\t}),\r\n\t\t\t\t\t\t...openOption,\r\n\t\t\t\t\t}).then((openTargetGrow) => {\r\n\t\t\t\t\t\tif (onOpen) onOpen();\r\n\t\t\t\t\t\tcontainerSpreadSubjectMap[containerName].next({\r\n\t\t\t\t\t\t\tisOpen: true,\r\n\t\t\t\t\t\t\tgrow: openTargetGrow as any,\r\n\t\t\t\t\t\t\ttargetContainer: container,\r\n\t\t\t\t\t\t});\r\n\t\t\t\t\t});\r\n\t\t\t\tconst close = () =>\r\n\t\t\t\t\tcloseFlex(container, containers, {\r\n\t\t\t\t\t\tsizeName,\r\n\t\t\t\t\t\t...closeOption,\r\n\t\t\t\t\t}).then(() => {\r\n\t\t\t\t\t\tif (onClose) onClose();\r\n\t\t\t\t\t\tcontainerSpreadSubjectMap[containerName].next({\r\n\t\t\t\t\t\t\tisOpen: false,\r\n\t\t\t\t\t\t\tgrow: 0,\r\n\t\t\t\t\t\t\ttargetContainer: container,\r\n\t\t\t\t\t\t});\r\n\t\t\t\t\t});\r\n\t\t\t\tif (mode === \"toggle\") {\r\n\t\t\t\t\tif (currentGrow === 0) {\r\n\t\t\t\t\t\topen();\r\n\t\t\t\t\t} else {\r\n\t\t\t\t\t\tclose();\r\n\t\t\t\t\t}\r\n\t\t\t\t} else if (mode === \"open\") {\r\n\t\t\t\t\tif (currentGrow === 0) {\r\n\t\t\t\t\t\topen();\r\n\t\t\t\t\t}\r\n\t\t\t\t} else if (mode === \"close\") {\r\n\t\t\t\t\tif (currentGrow !== 0) {\r\n\t\t\t\t\t\tclose();\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\treturn () => {\r\n\t\t\tsubscribe.unsubscribe();\r\n\t\t};\r\n\t}, [containerName, container, containers, sizeName]);\r\n\r\n\treturn null;\r\n};\r\n\r\nexport const useContainers = (layoutName: string) => {\r\n\tconst [containers, setContainers] = useState<HTMLElement[]>([]);\r\n\r\n\tuseEffect(() => {\r\n\t\t// 특정 layoutName과 containerName을 통해 ref를 구독\r\n\t\tconst subscription = getLayoutInfos(layoutName as string).subscribe(\r\n\t\t\t(layout) => {\r\n\t\t\t\tsetContainers(\r\n\t\t\t\t\tObject.values(layout.container)\r\n\t\t\t\t\t\t.filter(\r\n\t\t\t\t\t\t\t(e): e is { current: HTMLElement } =>\r\n\t\t\t\t\t\t\t\te.current !== null,\r\n\t\t\t\t\t\t)\r\n\t\t\t\t\t\t.map((e) => e.current),\r\n\t\t\t\t);\r\n\t\t\t},\r\n\t\t);\r\n\r\n\t\t// 구독 해제\r\n\t\treturn () => subscription.unsubscribe();\r\n\t}, [layoutName]);\r\n\treturn containers;\r\n};\r\n\r\nexport const useLayoutName = (containerName: string) => {\r\n\tconst [layoutName, setLayoutName] = useState<string>();\r\n\tuseEffect(() => {\r\n\t\tconst subscribe = flexContainerStore\r\n\t\t\t.pipe(\r\n\t\t\t\tmap(\r\n\t\t\t\t\t(layouts) =>\r\n\t\t\t\t\t\tObject.entries(layouts)\r\n\t\t\t\t\t\t\t.filter(([_, v]) => v[containerName])\r\n\t\t\t\t\t\t\t.map(([k]) => k)[0] as string, // 첫 번째 결과 가져오기\r\n\t\t\t\t),\r\n\t\t\t)\r\n\t\t\t.subscribe(setLayoutName);\r\n\r\n\t\t// 컴포넌트 언마운트 시 구독 해제\r\n\t\treturn () => subscribe.unsubscribe();\r\n\t}, [containerName]);\r\n\r\n\treturn layoutName;\r\n};\r\n\r\nexport const useDecompositionLayout = ({\r\n\tlayoutName: initialLayoutName,\r\n\tcontainerName,\r\n}: {\r\n\tlayoutName?: string;\r\n\tcontainerName: string;\r\n}) => {\r\n\tconst derivedLayoutName = useLayoutName(containerName);\r\n\tconst finalLayoutName = initialLayoutName || derivedLayoutName;\r\n\r\n\tconst [containers, setContainers] = useState<HTMLElement[]>([]);\r\n\tconst [container, setContainer] = useState<HTMLElement>();\r\n\tconst [resizePanel, setResizePanel] = useState<HTMLElement>();\r\n\r\n\tuseEffect(() => {\r\n\t\tif (!finalLayoutName) return; // layoutName이 준비될 때까지 대기\r\n\t\t// 특정 layoutName과 containerName을 통해 ref를 구독\r\n\t\tconst subscription = getLayoutInfos(finalLayoutName).subscribe(\r\n\t\t\t(layout) => {\r\n\t\t\t\tif (!layout) return;\r\n\t\t\t\tsetContainers(\r\n\t\t\t\t\tObject.values(layout.container)\r\n\t\t\t\t\t\t.filter(\r\n\t\t\t\t\t\t\t(e): e is { current: HTMLElement } =>\r\n\t\t\t\t\t\t\t\te.current !== null,\r\n\t\t\t\t\t\t)\r\n\t\t\t\t\t\t.map((e) => e.current),\r\n\t\t\t\t);\r\n\t\t\t\tif (\r\n\t\t\t\t\tcontainerName &&\r\n\t\t\t\t\tlayout.container[containerName] &&\r\n\t\t\t\t\tlayout.container[containerName].current\r\n\t\t\t\t) {\r\n\t\t\t\t\tsetContainer(layout.container[containerName].current);\r\n\t\t\t\t\tif (\r\n\t\t\t\t\t\tlayout.resizePanel[containerName] &&\r\n\t\t\t\t\t\tlayout.resizePanel[containerName].current\r\n\t\t\t\t\t) {\r\n\t\t\t\t\t\tsetResizePanel(\r\n\t\t\t\t\t\t\tlayout.resizePanel[containerName].current,\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},\r\n\t\t);\r\n\r\n\t\t// 구독 해제\r\n\t\treturn () => subscription.unsubscribe();\r\n\t}, [containerName, finalLayoutName]);\r\n\r\n\treturn { layout: containers, container, resizePanel };\r\n};\r\n\r\nexport const useContainerSize = (containerName: string) => {\r\n\tconst { layout, container, resizePanel } = useDecompositionLayout({\r\n\t\tcontainerName,\r\n\t});\r\n\tconst [size, setSize] = useState<{ width: number; height: number }>();\r\n\tuseEffect(() => {\r\n\t\tif (!container) return;\r\n\t\tconst observer = new ResizeObserver((entries) => {\r\n\t\t\tfor (const entry of entries) {\r\n\t\t\t\tsetSize({\r\n\t\t\t\t\twidth: entry.contentRect.width,\r\n\t\t\t\t\theight: entry.contentRect.height,\r\n\t\t\t\t});\r\n\t\t\t}\r\n\t\t});\r\n\t\tobserver.observe(container);\r\n\t\treturn () => observer.disconnect();\r\n\t}, [container]);\r\n\treturn { size };\r\n};\r\n\r\nexport const useDoubleClick = (\r\n\tcontainerName: string,\r\n\topt: ContainerStateRequest,\r\n) => {\r\n\tconst [isOpen, setIsOpen] = useState<boolean>();\r\n\tconst [isDoubleClick, setIsDoubleClick] = useState<boolean>();\r\n\tuseEffect(() => {\r\n\t\tconst resizePanelClickEvent = getResizePanelRef({\r\n\t\t\tcontainerName,\r\n\t\t}).pipe(\r\n\t\t\tfilter(\r\n\t\t\t\t(resizePanelref) =>\r\n\t\t\t\t\tresizePanelref != undefined &&\r\n\t\t\t\t\tresizePanelref.current != undefined,\r\n\t\t\t),\r\n\t\t\t//take(1),\r\n\t\t\tswitchMap((resizePanelref) => {\r\n\t\t\t\tif (!resizePanelref || !resizePanelref.current) return EMPTY;\r\n\t\t\t\treturn fromEvent(resizePanelref.current, \"click\");\r\n\t\t\t}),\r\n\t\t);\r\n\t\tconst subscribe = resizePanelClickEvent\r\n\t\t\t.pipe(\r\n\t\t\t\tbuffer(resizePanelClickEvent.pipe(debounceTime(500))),\r\n\t\t\t\tfilter((clickEventArray) => clickEventArray.length >= 2),\r\n\t\t\t\tmap((events) => {\r\n\t\t\t\t\tcontainerOpenCloseSubjectMap[containerName].next({\r\n\t\t\t\t\t\t...opt,\r\n\t\t\t\t\t\topenOption: {\r\n\t\t\t\t\t\t\t...opt.openOption,\r\n\t\t\t\t\t\t\tisPrevSizeOpen: false,\r\n\t\t\t\t\t\t},\r\n\t\t\t\t\t\tonClose: () => {\r\n\t\t\t\t\t\t\tif (opt.onClose) opt.onClose();\r\n\t\t\t\t\t\t\tsetIsOpen(false);\r\n\t\t\t\t\t\t\tsetIsDoubleClick(true);\r\n\t\t\t\t\t\t},\r\n\t\t\t\t\t\tonOpen: () => {\r\n\t\t\t\t\t\t\tif (opt.onOpen) opt.onOpen();\r\n\t\t\t\t\t\t\tsetIsOpen(true);\r\n\t\t\t\t\t\t\tsetIsDoubleClick(true);\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)\r\n\t\t\t.subscribe();\r\n\t\treturn () => {\r\n\t\t\tsubscribe.unsubscribe();\r\n\t\t};\r\n\t}, [containerName]);\r\n\treturn { isOpen, isDoubleClick, setIsDoubleClick };\r\n};\r\n","import equal from \"fast-deep-equal\";\r\nimport {\r\n\tReactElement,\r\n\tRefObject,\r\n\tuseCallback,\r\n\tuseEffect,\r\n\tuseRef,\r\n\tuseState,\r\n} from \"react\";\r\nimport { BehaviorSubject, distinctUntilChanged, map, Subject } 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 dragState = new Subject<DragStateType>();\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 stateRef = useRef<DragStateResultType | null>(null); // 상태를 저장하는 useRef\r\n\tconst forceUpdate = useRef(0); // 강제로 업데이트를 트리거하기 위한 변수\r\n\r\n\tuseEffect(() => {\r\n\t\tconst subscription = dragState\r\n\t\t\t.pipe(\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\tequal(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: (value) => {\r\n\t\t\t\t\tif (\r\n\t\t\t\t\t\tvalue &&\r\n\t\t\t\t\t\t!equal(\r\n\t\t\t\t\t\t\tfilterChildren(stateRef.current),\r\n\t\t\t\t\t\t\tfilterChildren(value),\r\n\t\t\t\t\t\t)\r\n\t\t\t\t\t) {\r\n\t\t\t\t\t\tstateRef.current = value; // 상태를 업데이트\r\n\t\t\t\t\t\tforceUpdate.current++; // 업데이트 트리거\r\n\t\t\t\t\t}\r\n\t\t\t\t},\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\t// 강제 렌더링을 트리거하기 위한 업데이트\r\n\tconst [, rerender] = useState({});\r\n\tuseEffect(() => {\r\n\t\tconst interval = setInterval(() => {\r\n\t\t\trerender({}); // 변경된 ref 상태를 반영\r\n\t\t}, 50); // 50ms 간격으로 렌더링 반영\r\n\t\treturn () => clearInterval(interval);\r\n\t}, []);\r\n\r\n\treturn stateRef.current;\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 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\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: React.MouseEvent | React.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\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) {\r\n\t\t\t\tevent.preventDefault(); // cancelable=false 면 자동 skip\r\n\t\t\t}\r\n\t\t\tisPending.current = true;\r\n\t\t\tisMouseDown.current = true;\r\n\t\t\tif (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\t\t\t//event.preventDefault();\r\n\t\t\tsetTimeout(() => {\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: React.MouseEvent | React.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(deltaX > scrollThreshold || deltaY > scrollThreshold)\r\n\t\t\t) {\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\tif (dragStartCallback)\r\n\t\t\t\t\t\tdragStartCallback({ x: clientX, y: 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: React.MouseEvent | React.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\t\t\tif (isPending.current) {\r\n\t\t\t\tisPending.current = false;\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"]}
package/dist/index.css ADDED
@@ -0,0 +1,471 @@
1
+ /* src/flex-layout/styles/FlexLayout.module.css */
2
+ .flex-layout {
3
+ display: flex;
4
+ height: 100%;
5
+ width: 100%;
6
+ overflow: auto;
7
+ overflow-wrap: revert;
8
+ position: relative;
9
+ &[data-direction=column] {
10
+ flex-direction: column;
11
+ & > .flex-resize-panel {
12
+ height: 4px;
13
+ width: auto;
14
+ cursor: ns-resize;
15
+ &:hover > .hover,
16
+ &:hover > .hover[data-is_hover],
17
+ &:active > .hover {
18
+ height: 3px;
19
+ width: 100%;
20
+ }
21
+ }
22
+ & > .flex-container > .flex-content-fit-wrapper {
23
+ width: 100%;
24
+ height: fit-content;
25
+ & > * {
26
+ width: 100%;
27
+ height: fit-content;
28
+ }
29
+ }
30
+ }
31
+ &[data-direction=row] {
32
+ flex-direction: row;
33
+ & > .flex-resize-panel {
34
+ width: 4px;
35
+ height: auto;
36
+ cursor: ew-resize;
37
+ &:hover > .hover,
38
+ &:hover > .hover[data-is_hover],
39
+ &:active > .hover {
40
+ width: 3px;
41
+ height: 100%;
42
+ }
43
+ }
44
+ & > .flex-container > .flex-content-fit-wrapper {
45
+ width: fit-content;
46
+ height: 100%;
47
+ & > * {
48
+ width: fit-content;
49
+ height: 100%;
50
+ }
51
+ }
52
+ }
53
+ & > .flex-container {
54
+ overflow: hidden;
55
+ box-sizing: border-box;
56
+ &[data-is_resize_panel=true] {
57
+ flex: 1 1 0%;
58
+ }
59
+ &[data-is_resize_panel=false] {
60
+ flex: 0 0 0%;
61
+ }
62
+ & > *:not(.flex-content-fit-wrapper) {
63
+ width: 100%;
64
+ height: 100%;
65
+ }
66
+ }
67
+ & .flex-resize-panel {
68
+ background-color: rgb(115 115 115);
69
+ z-index: 1001;
70
+ display: flex;
71
+ justify-content: center;
72
+ align-items: center;
73
+ flex: 0 0 0.1%;
74
+ position: relative;
75
+ -moz-user-select: -moz-none;
76
+ -khtml-user-select: none;
77
+ -webkit-user-select: none;
78
+ -ms-user-select: none;
79
+ user-select: none;
80
+ right: 0;
81
+ bottom: 0;
82
+ &:hover,
83
+ &:active {
84
+ animation-name: drag-panel-hover;
85
+ animation-fill-mode: forwards;
86
+ animation-direction: normal;
87
+ animation-duration: 0.3s;
88
+ animation-iteration-count: 1;
89
+ animation-timing-function: cubic-bezier(1, -0.37, 0.73, 0.8);
90
+ }
91
+ &:hover > .hover,
92
+ &:hover > .hover[data-is_hover],
93
+ &:active > .hover {
94
+ background-color: #0066ffb5;
95
+ z-index: 3002;
96
+ position: absolute;
97
+ display: block;
98
+ opacity: 1;
99
+ visibility: inherit;
100
+ transition: all 1s;
101
+ animation-name: drag-panel-hover-highlight;
102
+ animation-fill-mode: forwards;
103
+ animation-direction: normal;
104
+ animation-duration: 0.3s;
105
+ animation-iteration-count: 1;
106
+ animation-timing-function: cubic-bezier(1, -0.37, 0.73, 0.8);
107
+ }
108
+ & > .hover {
109
+ opacity: 0;
110
+ visibility: hidden;
111
+ transition: all 1s;
112
+ }
113
+ &.bottom-cylinder {
114
+ &::after {
115
+ border-bottom-left-radius: 15px;
116
+ border-bottom-right-radius: 15px;
117
+ bottom: 100%;
118
+ }
119
+ }
120
+ &.bottom-cylinder-reverse {
121
+ &::after {
122
+ border-top-left-radius: 15px;
123
+ border-top-right-radius: 15px;
124
+ bottom: 100%;
125
+ }
126
+ }
127
+ &.top-cylinder {
128
+ border-bottom-left-radius: 15px;
129
+ border-bottom-right-radius: 15px;
130
+ }
131
+ &.right-cylinder {
132
+ &::after {
133
+ border-top-right-radius: 15px;
134
+ border-bottom-right-radius: 15px;
135
+ left: 100%;
136
+ }
137
+ }
138
+ &.left-cylinder {
139
+ &::after {
140
+ right: 100%;
141
+ }
142
+ }
143
+ &.bottom-cylinder,
144
+ &.bottom-cylinder-reverse,
145
+ &.top-cylinder,
146
+ &.left-cylinder,
147
+ &.right-cylinder {
148
+ &::after {
149
+ background-color: hsla(0, 0%, 54%, 0.32);
150
+ content: " ";
151
+ position: absolute;
152
+ z-index: 3002;
153
+ }
154
+ &:hover,
155
+ &:hover::after,
156
+ &:active,
157
+ &:active::after {
158
+ background-color: rgb(0 102 255 / 45%);
159
+ transition: background-color 1s;
160
+ }
161
+ }
162
+ &.bottom-cylinder,
163
+ &.top-cylinder,
164
+ &.bottom-cylinder-reverse {
165
+ &::after {
166
+ height: 1.1rem;
167
+ width: 60%;
168
+ }
169
+ &:not(.bottom-cylinder-reverse)::after {
170
+ top: 0;
171
+ }
172
+ }
173
+ &.left-cylinder,
174
+ &.right-cylinder {
175
+ &::after {
176
+ width: 1.1rem;
177
+ height: 60%;
178
+ }
179
+ }
180
+ }
181
+ }
182
+ @keyframes drag-panel-hover {
183
+ 0% {
184
+ background-color: #b1b1b1d6;
185
+ }
186
+ 10% {
187
+ background-color: #b1b1b1ba;
188
+ }
189
+ 20% {
190
+ background-color: #b1b1b194;
191
+ }
192
+ 40% {
193
+ background-color: #b1b1b17d;
194
+ }
195
+ 60% {
196
+ background-color: #b1b1b152;
197
+ }
198
+ 80% {
199
+ background-color: #b1b1b130;
200
+ }
201
+ 100% {
202
+ background-color: #b1b1b100;
203
+ animation-play-state: paused;
204
+ }
205
+ }
206
+ @keyframes drag-panel-hover-highlight {
207
+ 0% {
208
+ opacity: 0;
209
+ }
210
+ 10% {
211
+ opacity: 0.1;
212
+ }
213
+ 20% {
214
+ opacity: 0.2;
215
+ }
216
+ 40% {
217
+ opacity: 0.4;
218
+ }
219
+ 60% {
220
+ opacity: 0.6;
221
+ }
222
+ 80% {
223
+ opacity: 0.8;
224
+ }
225
+ 100% {
226
+ opacity: 1;
227
+ animation-play-state: paused;
228
+ }
229
+ }
230
+ .flex-split-screen {
231
+ width: 100%;
232
+ height: 100%;
233
+ position: relative;
234
+ & .flex-split-screen-boundary-container {
235
+ position: absolute;
236
+ font-family: Arial, sans-serif;
237
+ transition: background-color 0.3s, border-color 0.3s;
238
+ color: #00acc1;
239
+ border: 2px dashed #00acc1;
240
+ border-radius: 10px;
241
+ background-color: #0014ff17;
242
+ font-size: 1.5rem;
243
+ display: flex;
244
+ align-items: center;
245
+ justify-content: center;
246
+ font-weight: bold;
247
+ z-index: 9001;
248
+ }
249
+ & .flex-split-screen-drag-box-title-wrapper-sticky {
250
+ position: sticky;
251
+ top: 0;
252
+ z-index: 2001;
253
+ background: #f0f0f0;
254
+ }
255
+ & .flex-split-screen-drag-box-title-wrapper {
256
+ html[data-color-scheme=dark] & {
257
+ background: #3c3c3c;
258
+ box-shadow: 0px 1px 20px 0px #1e1e1e;
259
+ }
260
+ html[data-color-scheme=light] & {
261
+ background: #edf1f5;
262
+ box-shadow: 0px 1px 20px 0px #e5e5e5;
263
+ }
264
+ scrollbar-width: initial;
265
+ scrollbar-color: initial;
266
+ display: flex;
267
+ justify-content: space-between;
268
+ transition:
269
+ background 0.3s,
270
+ color 0.3s,
271
+ box-shadow 0.3s;
272
+ position: relative;
273
+ border-bottom: 1px solid #e5e5e5;
274
+ & .flex-split-screen-drag-box-title-container {
275
+ display: flex;
276
+ width: 100%;
277
+ background: inherit;
278
+ }
279
+ }
280
+ }
281
+ .flex-split-screen-drag-box-title-item {
282
+ display: flex;
283
+ align-items: baseline;
284
+ padding-right: 0.5rem;
285
+ padding-left: 0.1rem;
286
+ &:last-child:not(:first-child) {
287
+ border-right: 2px solid #00000012;
288
+ }
289
+ &:not(.active) {
290
+ box-shadow: inset 0 0 20px 20px #00000000;
291
+ border-bottom: 1px solid #007fff40;
292
+ }
293
+ &:hover {
294
+ html[data-color-scheme=dark] & {
295
+ background: #494949;
296
+ }
297
+ html[data-color-scheme=light] & {
298
+ background: #e0e0e0;
299
+ }
300
+ box-shadow: 0 4px 8px rgba(0, 0, 0, 0.1);
301
+ }
302
+ &:active {
303
+ box-shadow: inset 0px 0px 17px 0px #00000029;
304
+ transform: scale(0.97);
305
+ }
306
+ & button {
307
+ background: none;
308
+ border: none;
309
+ color: #bbbbbb;
310
+ font-weight: bold;
311
+ font-family: none;
312
+ font-size: 0.9rem;
313
+ cursor: pointer;
314
+ padding: 0 0.25rem;
315
+ }
316
+ &.active {
317
+ html[data-color-scheme=dark] & {
318
+ color: #b9af3a;
319
+ }
320
+ html[data-color-scheme=light] & {
321
+ color: #494300;
322
+ }
323
+ font-weight: bold;
324
+ box-shadow: 0 -2px 4px rgba(0, 0, 0, 0.1);
325
+ & button {
326
+ color: #5f5f5f;
327
+ }
328
+ }
329
+ }
330
+ .flex-split-screen-drag-box-title-more {
331
+ display: flex;
332
+ flex-direction: column;
333
+ line-height: 0.3;
334
+ padding: 0rem 0.65rem 0.5rem;
335
+ font-size: 1.2rem;
336
+ font-weight: bold;
337
+ border: none;
338
+ background: none;
339
+ color: black;
340
+ justify-content: space-evenly;
341
+ cursor: pointer;
342
+ background: inherit;
343
+ &:hover {
344
+ background: #797979;
345
+ box-shadow: 0 4px 8px rgba(0, 0, 0, 0.1);
346
+ }
347
+ &:active {
348
+ box-shadow: inset 0px 0px 17px 0px #00000029;
349
+ transform: scale(0.97);
350
+ }
351
+ }
352
+ .flex-split-screen-drag-box {
353
+ align-self: center;
354
+ -webkit-touch-callout: none;
355
+ -webkit-user-select: none;
356
+ -khtml-user-select: none;
357
+ -moz-user-select: none;
358
+ -ms-user-select: none;
359
+ user-select: none;
360
+ -webkit-tap-highlight-color: transparent;
361
+ -webkit-touch-callout: none;
362
+ }
363
+ .flex-split-screen-drag-box-clone {
364
+ -webkit-touch-callout: none;
365
+ -webkit-user-select: none;
366
+ -khtml-user-select: none;
367
+ -moz-user-select: none;
368
+ -ms-user-select: none;
369
+ user-select: none;
370
+ -webkit-tap-highlight-color: transparent;
371
+ -webkit-touch-callout: none;
372
+ display: flex;
373
+ background-color: #adadad;
374
+ flex-direction: column;
375
+ padding: 0.2rem 0.4rem;
376
+ border-radius: 7px;
377
+ line-height: 99%;
378
+ z-index: 9001;
379
+ & span:first-child {
380
+ font-weight: bold;
381
+ font-size: 0.85rem;
382
+ }
383
+ & span:last-child {
384
+ font-size: 0.75rem;
385
+ }
386
+ }
387
+
388
+ /* src/flex-layout/styles/listScroll.module.css */
389
+ .default-scroll {
390
+ overflow: auto;
391
+ }
392
+ .list-scroll {
393
+ position: relative;
394
+ flex-wrap: nowrap;
395
+ text-wrap: nowrap;
396
+ white-space: nowrap;
397
+ scroll-snap-type: x mandatory;
398
+ scroll-behavior: smooth;
399
+ scrollbar-gutter: stable both-edges;
400
+ &.y {
401
+ overflow-y: scroll;
402
+ overflow-x: clip;
403
+ padding-left: 0.15rem;
404
+ padding-right: 0.4rem;
405
+ &:not(:hover) {
406
+ padding-right: 0.4rem;
407
+ padding-top: 0.4rem;
408
+ }
409
+ &:hover {
410
+ padding-right: 0;
411
+ padding-left: top;
412
+ }
413
+ }
414
+ &.x {
415
+ overflow-y: clip;
416
+ overflow-x: scroll;
417
+ padding-top: 0.15rem;
418
+ padding-bottom: 0.4rem;
419
+ &:not(:hover) {
420
+ padding-bottom: 0.4rem;
421
+ padding-left: 0.4rem;
422
+ }
423
+ &:hover {
424
+ padding-bottom: 0;
425
+ padding-left: 0;
426
+ }
427
+ }
428
+ &.none {
429
+ scrollbar-width: none !important;
430
+ &::-webkit-scrollbar {
431
+ display: none !important;
432
+ }
433
+ }
434
+ &::-webkit-scrollbar {
435
+ display: none;
436
+ }
437
+ &.show-scroll::-webkit-scrollbar,
438
+ &:hover::-webkit-scrollbar {
439
+ scrollbar-width: thin;
440
+ display: initial;
441
+ width: 0.45rem;
442
+ height: 0.45rem;
443
+ }
444
+ &.show-scroll::-webkit-scrollbar-thumb,
445
+ &:hover::-webkit-scrollbar-thumb {
446
+ background: #222;
447
+ border-radius: 6px;
448
+ box-shadow: inset 0 0 5px rgba(0, 0, 0, 0.5);
449
+ transition: background 0.3s ease, box-shadow 0.3s ease;
450
+ }
451
+ &.show-scroll::-webkit-scrollbar-thumb:hover,
452
+ &.show-scroll::-webkit-scrollbar-thumb:active,
453
+ &:hover::-webkit-scrollbar-thumb:hover {
454
+ background:
455
+ linear-gradient(
456
+ 145deg,
457
+ #ffecec,
458
+ #f1f1f1);
459
+ }
460
+ &.show-scroll::-webkit-scrollbar-track,
461
+ &:hover::-webkit-scrollbar-track {
462
+ background:
463
+ linear-gradient(
464
+ 145deg,
465
+ #989898,
466
+ #7c7c7c);
467
+ border-radius: 6px;
468
+ box-shadow: inset 0 0 5px rgba(0, 0, 0, 0.3);
469
+ }
470
+ }
471
+ /*# sourceMappingURL=index.css.map */