@byeolnaerim/flex-layout 0.0.6 → 0.0.8
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/dist/flex-layout/components/FlexLayout.cjs +76 -0
- package/dist/flex-layout/components/FlexLayout.cjs.map +1 -0
- package/dist/flex-layout/components/FlexLayout.js +70 -0
- package/dist/flex-layout/components/FlexLayout.js.map +1 -0
- package/dist/flex-layout/components/FlexLayoutContainer.cjs +196 -0
- package/dist/flex-layout/components/FlexLayoutContainer.cjs.map +1 -0
- package/dist/flex-layout/components/FlexLayoutContainer.js +189 -0
- package/dist/flex-layout/components/FlexLayoutContainer.js.map +1 -0
- package/dist/flex-layout/components/FlexLayoutResizePanel.cjs +192 -0
- package/dist/flex-layout/components/FlexLayoutResizePanel.cjs.map +1 -0
- package/dist/flex-layout/components/FlexLayoutResizePanel.js +186 -0
- package/dist/flex-layout/components/FlexLayoutResizePanel.js.map +1 -0
- package/dist/flex-layout/components/FlexLayoutSplitScreen.cjs +1211 -0
- package/dist/flex-layout/components/FlexLayoutSplitScreen.cjs.map +1 -0
- package/dist/flex-layout/components/FlexLayoutSplitScreen.js +1197 -0
- package/dist/flex-layout/components/FlexLayoutSplitScreen.js.map +1 -0
- package/dist/flex-layout/components/FlexLayoutSplitScreenDragBox.cjs +339 -0
- package/dist/flex-layout/components/FlexLayoutSplitScreenDragBox.cjs.map +1 -0
- package/dist/flex-layout/components/FlexLayoutSplitScreenDragBox.js +333 -0
- package/dist/flex-layout/components/FlexLayoutSplitScreenDragBox.js.map +1 -0
- package/dist/flex-layout/components/FlexLayoutSplitScreenDragBoxContainer.cjs +32 -0
- package/dist/flex-layout/components/FlexLayoutSplitScreenDragBoxContainer.cjs.map +1 -0
- package/dist/flex-layout/components/FlexLayoutSplitScreenDragBoxContainer.js +25 -0
- package/dist/flex-layout/components/FlexLayoutSplitScreenDragBoxContainer.js.map +1 -0
- package/dist/flex-layout/components/FlexLayoutSplitScreenDragBoxItem.cjs +40 -0
- package/dist/flex-layout/components/FlexLayoutSplitScreenDragBoxItem.cjs.map +1 -0
- package/dist/flex-layout/components/FlexLayoutSplitScreenDragBoxItem.d.ts +2 -2
- package/dist/flex-layout/components/FlexLayoutSplitScreenDragBoxItem.js +34 -0
- package/dist/flex-layout/components/FlexLayoutSplitScreenDragBoxItem.js.map +1 -0
- package/dist/flex-layout/components/FlexLayoutSplitScreenDragBoxTitleMore.cjs +30 -0
- package/dist/flex-layout/components/FlexLayoutSplitScreenDragBoxTitleMore.cjs.map +1 -0
- package/dist/flex-layout/components/FlexLayoutSplitScreenDragBoxTitleMore.d.ts +2 -1
- package/dist/flex-layout/components/FlexLayoutSplitScreenDragBoxTitleMore.js +24 -0
- package/dist/flex-layout/components/FlexLayoutSplitScreenDragBoxTitleMore.js.map +1 -0
- package/dist/flex-layout/components/FlexLayoutSplitScreenScrollBox.cjs +109 -0
- package/dist/flex-layout/components/FlexLayoutSplitScreenScrollBox.cjs.map +1 -0
- package/dist/flex-layout/components/FlexLayoutSplitScreenScrollBox.js +103 -0
- package/dist/flex-layout/components/FlexLayoutSplitScreenScrollBox.js.map +1 -0
- package/dist/flex-layout/components/FlexLayoutStickyBox.cjs +226 -0
- package/dist/flex-layout/components/FlexLayoutStickyBox.cjs.map +1 -0
- package/dist/flex-layout/components/FlexLayoutStickyBox.d.ts +6 -6
- package/dist/flex-layout/components/FlexLayoutStickyBox.js +224 -0
- package/dist/flex-layout/components/FlexLayoutStickyBox.js.map +1 -0
- package/dist/flex-layout/components/index.cjs +52 -0
- package/dist/flex-layout/components/index.cjs.map +1 -0
- package/dist/flex-layout/components/index.js +9 -0
- package/dist/flex-layout/components/index.js.map +1 -0
- package/dist/flex-layout/hooks/index.cjs +21 -0
- package/dist/flex-layout/hooks/index.cjs.map +1 -0
- package/dist/flex-layout/hooks/index.js +4 -0
- package/dist/flex-layout/hooks/index.js.map +1 -0
- package/dist/{hooks.cjs → flex-layout/hooks/useDrag.cjs} +15 -208
- package/dist/flex-layout/hooks/useDrag.cjs.map +1 -0
- package/dist/flex-layout/hooks/useDrag.d.ts +4 -4
- package/dist/{hooks.js → flex-layout/hooks/useDrag.js} +13 -203
- package/dist/flex-layout/hooks/useDrag.js.map +1 -0
- package/dist/flex-layout/hooks/useFlexLayoutSplitScreen.cjs +118 -0
- package/dist/flex-layout/hooks/useFlexLayoutSplitScreen.cjs.map +1 -0
- package/dist/flex-layout/hooks/useFlexLayoutSplitScreen.js +116 -0
- package/dist/flex-layout/hooks/useFlexLayoutSplitScreen.js.map +1 -0
- package/dist/flex-layout/hooks/useListPaging.cjs +179 -0
- package/dist/flex-layout/hooks/useListPaging.cjs.map +1 -0
- package/dist/flex-layout/hooks/useListPaging.js +175 -0
- package/dist/flex-layout/hooks/useListPaging.js.map +1 -0
- package/dist/flex-layout/hooks/useSizes.cjs +104 -0
- package/dist/flex-layout/hooks/useSizes.cjs.map +1 -0
- package/dist/flex-layout/hooks/useSizes.js +101 -0
- package/dist/flex-layout/hooks/useSizes.js.map +1 -0
- package/dist/flex-layout/index.cjs +42 -0
- package/dist/flex-layout/index.cjs.map +1 -0
- package/dist/flex-layout/index.js +7 -0
- package/dist/flex-layout/index.js.map +1 -0
- package/dist/flex-layout/providers/FlexLayoutContext.cjs +26 -0
- package/dist/flex-layout/providers/FlexLayoutContext.cjs.map +1 -0
- package/dist/flex-layout/providers/FlexLayoutContext.d.ts +2 -1
- package/dist/flex-layout/providers/FlexLayoutContext.js +23 -0
- package/dist/flex-layout/providers/FlexLayoutContext.js.map +1 -0
- package/dist/{providers.cjs → flex-layout/providers/FlexLayoutHooks.cjs} +22 -186
- package/dist/flex-layout/providers/FlexLayoutHooks.cjs.map +1 -0
- package/dist/{providers.js → flex-layout/providers/FlexLayoutHooks.js} +14 -178
- package/dist/flex-layout/providers/FlexLayoutHooks.js.map +1 -0
- package/dist/flex-layout/providers/index.cjs +14 -0
- package/dist/flex-layout/providers/index.cjs.map +1 -0
- package/dist/flex-layout/providers/index.js +3 -0
- package/dist/flex-layout/providers/index.js.map +1 -0
- package/dist/{store.cjs → flex-layout/store/FlexLayoutContainerStore.cjs} +20 -21
- package/dist/flex-layout/store/FlexLayoutContainerStore.cjs.map +1 -0
- package/dist/flex-layout/store/FlexLayoutContainerStore.d.ts +2 -2
- package/dist/{store.js → flex-layout/store/FlexLayoutContainerStore.js} +20 -21
- package/dist/flex-layout/store/FlexLayoutContainerStore.js.map +1 -0
- package/dist/flex-layout/store/index.cjs +14 -0
- package/dist/flex-layout/store/index.cjs.map +1 -0
- package/dist/flex-layout/store/index.js +3 -0
- package/dist/flex-layout/store/index.js.map +1 -0
- package/dist/flex-layout/types/FlexDirectionTypes.cjs +4 -0
- package/dist/flex-layout/types/FlexDirectionTypes.cjs.map +1 -0
- package/dist/flex-layout/types/FlexDirectionTypes.js +3 -0
- package/dist/flex-layout/types/FlexDirectionTypes.js.map +1 -0
- package/dist/flex-layout/types/FlexLayoutTypes.cjs +4 -0
- package/dist/flex-layout/types/FlexLayoutTypes.cjs.map +1 -0
- package/dist/flex-layout/types/FlexLayoutTypes.d.ts +3 -3
- package/dist/flex-layout/types/FlexLayoutTypes.js +3 -0
- package/dist/flex-layout/types/FlexLayoutTypes.js.map +1 -0
- package/dist/{utils.cjs → flex-layout/utils/FlexLayoutUtils.cjs} +3 -4
- package/dist/flex-layout/utils/FlexLayoutUtils.cjs.map +1 -0
- package/dist/{utils.js → flex-layout/utils/FlexLayoutUtils.js} +3 -4
- package/dist/flex-layout/utils/FlexLayoutUtils.js.map +1 -0
- package/dist/flex-layout/utils/index.cjs +14 -0
- package/dist/flex-layout/utils/index.cjs.map +1 -0
- package/dist/flex-layout/utils/index.js +3 -0
- package/dist/flex-layout/utils/index.js.map +1 -0
- package/dist/index.cjs +7 -3451
- package/dist/index.cjs.map +1 -1
- package/dist/index.js +1 -3396
- package/dist/index.js.map +1 -1
- package/dist/types/css.d.cjs +4 -0
- package/dist/types/css.d.cjs.map +1 -0
- package/dist/types/css.d.js +3 -0
- package/dist/types/css.d.js.map +1 -0
- package/package.json +31 -2
- package/dist/components.cjs +0 -3042
- package/dist/components.cjs.map +0 -1
- package/dist/components.css +0 -471
- package/dist/components.css.map +0 -1
- package/dist/components.js +0 -3029
- package/dist/components.js.map +0 -1
- package/dist/hooks.cjs.map +0 -1
- package/dist/hooks.js.map +0 -1
- package/dist/index.css +0 -471
- package/dist/index.css.map +0 -1
- package/dist/providers.cjs.map +0 -1
- package/dist/providers.js.map +0 -1
- package/dist/store.cjs.map +0 -1
- package/dist/store.js.map +0 -1
- package/dist/utils.cjs.map +0 -1
- package/dist/utils.js.map +0 -1
|
@@ -0,0 +1,76 @@
|
|
|
1
|
+
'use strict';
|
|
2
|
+
|
|
3
|
+
var jsxRuntime = require('react/jsx-runtime');
|
|
4
|
+
var react = require('react');
|
|
5
|
+
var FlexLayoutHooks = require('../providers/FlexLayoutHooks');
|
|
6
|
+
var styles = require('../styles/FlexLayout.module.css');
|
|
7
|
+
var FlexLayoutContext = require('../providers/FlexLayoutContext');
|
|
8
|
+
|
|
9
|
+
function _interopDefault (e) { return e && e.__esModule ? e : { default: e }; }
|
|
10
|
+
|
|
11
|
+
var styles__default = /*#__PURE__*/_interopDefault(styles);
|
|
12
|
+
|
|
13
|
+
function FlexLayout({
|
|
14
|
+
layoutName,
|
|
15
|
+
direction,
|
|
16
|
+
children,
|
|
17
|
+
ref,
|
|
18
|
+
className,
|
|
19
|
+
panelClassName,
|
|
20
|
+
panelMovementMode = "divorce",
|
|
21
|
+
...props
|
|
22
|
+
}) {
|
|
23
|
+
const containerCount = react.Children.count(children);
|
|
24
|
+
const fitContent = direction === "row" ? "width" : "height";
|
|
25
|
+
const isFragmentElement = (node) => react.isValidElement(node) && node.type === react.Fragment;
|
|
26
|
+
const nodes = react.Children.toArray(children).flatMap(
|
|
27
|
+
(node) => isFragmentElement(node) ? react.Children.toArray(node.props.children) : [node]
|
|
28
|
+
);
|
|
29
|
+
const flattenedChildren = nodes.filter(
|
|
30
|
+
react.isValidElement
|
|
31
|
+
);
|
|
32
|
+
if (flattenedChildren.length === 0) {
|
|
33
|
+
return null;
|
|
34
|
+
}
|
|
35
|
+
return /* @__PURE__ */ jsxRuntime.jsx(jsxRuntime.Fragment, { children: /* @__PURE__ */ jsxRuntime.jsx(
|
|
36
|
+
FlexLayoutContext.FlexLayoutProvider,
|
|
37
|
+
{
|
|
38
|
+
value: {
|
|
39
|
+
layoutName,
|
|
40
|
+
direction,
|
|
41
|
+
panelMovementMode,
|
|
42
|
+
panelClassName,
|
|
43
|
+
containerCount,
|
|
44
|
+
fitContent
|
|
45
|
+
},
|
|
46
|
+
children: /* @__PURE__ */ jsxRuntime.jsx(
|
|
47
|
+
"div",
|
|
48
|
+
{
|
|
49
|
+
className: `${styles__default.default["flex-layout"]} ${className && className !== "" ? className : ""}`,
|
|
50
|
+
...ref ? { ref } : {},
|
|
51
|
+
...props,
|
|
52
|
+
"data-layout_name": layoutName,
|
|
53
|
+
"data-direction": direction,
|
|
54
|
+
children: flattenedChildren.map((child, index) => {
|
|
55
|
+
if (!child || !react.isValidElement(child)) return null;
|
|
56
|
+
return /* @__PURE__ */ jsxRuntime.jsxs(react.Fragment, { children: [
|
|
57
|
+
child,
|
|
58
|
+
/* @__PURE__ */ jsxRuntime.jsx(
|
|
59
|
+
FlexLayoutHooks.ContainerOpenCloseProvider,
|
|
60
|
+
{
|
|
61
|
+
layoutName,
|
|
62
|
+
containerName: child.props.containerName,
|
|
63
|
+
sizeName: fitContent
|
|
64
|
+
}
|
|
65
|
+
)
|
|
66
|
+
] }, index);
|
|
67
|
+
})
|
|
68
|
+
}
|
|
69
|
+
)
|
|
70
|
+
}
|
|
71
|
+
) });
|
|
72
|
+
}
|
|
73
|
+
|
|
74
|
+
module.exports = FlexLayout;
|
|
75
|
+
//# sourceMappingURL=FlexLayout.cjs.map
|
|
76
|
+
//# sourceMappingURL=FlexLayout.cjs.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"sources":["../../../src/flex-layout/components/FlexLayout.tsx"],"names":["Children","isValidElement","Fragment","jsx","FlexLayoutProvider","styles","jsxs","ContainerOpenCloseProvider"],"mappings":";;;;;;;;;;;;AAuCe,SAAR,UAAA,CAA4B;AAAA,EAClC,UAAA;AAAA,EACA,SAAA;AAAA,EACA,QAAA;AAAA,EACA,GAAA;AAAA,EACA,SAAA;AAAA,EACA,cAAA;AAAA,EACA,iBAAA,GAAoB,SAAA;AAAA,EACpB,GAAG;AACJ,CAAA,EAAoB;AACnB,EAAA,MAAM,cAAA,GAAiBA,cAAA,CAAS,KAAA,CAAM,QAAQ,CAAA;AAC9C,EAAA,MAAM,UAAA,GAAa,SAAA,KAAc,KAAA,GAAQ,OAAA,GAAU,QAAA;AAMnD,EAAA,MAAM,oBAAoB,CAAC,IAAA,KAC1BC,qBAAe,IAAI,CAAA,IAAK,KAAK,IAAA,KAASC,cAAAA;AAKvC,EAAA,MAAM,KAAA,GAAQF,cAAA,CAAS,OAAA,CAAQ,QAAQ,CAAA,CAAE,OAAA;AAAA,IAAQ,CAAC,IAAA,KACjD,iBAAA,CAAkB,IAAI,CAAA,GACnBA,cAAA,CAAS,OAAA,CAAQ,IAAA,CAAK,KAAA,CAAM,QAAQ,CAAA,GACpC,CAAC,IAAI;AAAA,GACT;AAGA,EAAA,MAAM,oBAAoB,KAAA,CAAM,MAAA;AAAA,IAC/BC;AAAA,GACD;AAEA,EAAA,IAAI,iBAAA,CAAkB,WAAW,CAAA,EAAG;AACnC,IAAA,OAAO,IAAA;AAAA,EACR;AAEA,EAAA,uBACCE,cAAA,CAAAD,mBAAA,EAAA,EACC,QAAA,kBAAAC,cAAA;AAAA,IAACC,oCAAA;AAAA,IAAA;AAAA,MACA,KAAA,EAAO;AAAA,QACN,UAAA;AAAA,QACA,SAAA;AAAA,QACA,iBAAA;AAAA,QACA,cAAA;AAAA,QACA,cAAA;AAAA,QACA;AAAA,OACD;AAAA,MAEA,QAAA,kBAAAD,cAAA;AAAA,QAAC,KAAA;AAAA,QAAA;AAAA,UACA,SAAA,EAAW,CAAA,EAAGE,uBAAA,CAAO,aAAa,CAAC,IAAI,SAAA,IAAa,SAAA,KAAc,EAAA,GAAK,SAAA,GAAY,EAAE,CAAA,CAAA;AAAA,UACpF,GAAI,GAAA,GAAM,EAAE,GAAA,KAAQ,EAAC;AAAA,UACrB,GAAG,KAAA;AAAA,UACJ,kBAAA,EAAkB,UAAA;AAAA,UAClB,gBAAA,EAAgB,SAAA;AAAA,UAEf,QAAA,EAAA,iBAAA,CAAkB,GAAA,CAAI,CAAC,KAAA,EAAO,KAAA,KAAU;AACxC,YAAA,IAAI,CAAC,KAAA,IAAS,CAACJ,oBAAA,CAAe,KAAK,GAAG,OAAO,IAAA;AAO7C,YAAA,uBACCK,eAAA,CAACJ,gBAAA,EACC,QAAA,EAAA;AAAA,cAAA,KAAA;AAAA,8BAaDC,cAAA;AAAA,gBAACI,0CAAA;AAAA,gBAAA;AAAA,kBACA,UAAA;AAAA,kBACA,aAAA,EAAe,MAAM,KAAA,CAAM,aAAA;AAAA,kBAC3B,QAAA,EAAU;AAAA;AAAA;AACV,aAAA,EAAA,EAlBa,KAmBf,CAAA;AAAA,UAEF,CAAC;AAAA;AAAA;AACF;AAAA,GACD,EACD,CAAA;AAEF","file":"FlexLayout.cjs","sourcesContent":["import {\n\tChildren,\n\tcloneElement,\n\tFragment,\n\tisValidElement,\n\tReactElement,\n\tReactNode,\n} from \"react\";\nimport { ContainerOpenCloseProvider } from \"../providers/FlexLayoutHooks\";\nimport styles from \"../styles/FlexLayout.module.css\";\nimport {\n\tFlexContainerProps,\n\tFlexLayoutChildrenType,\n\tFlexLayoutProps,\n} from \"../types/FlexLayoutTypes\";\n\nimport { FlexLayoutProvider } from \"../providers/FlexLayoutContext\";\n\nconst withFlexLayout =\n\t(\n\t\tlayoutName: string,\n\t\tfitContent: \"width\" | \"height\",\n\t\tcontainerCount: number,\n\t) =>\n\t(WrappedComponent: ReactElement<FlexLayoutChildrenType>) => {\n\t\tif (\n\t\t\tWrappedComponent.type === Fragment ||\n\t\t\tWrappedComponent.type === \"div\" ||\n\t\t\tWrappedComponent.type === \"span\"\n\t\t) {\n\t\t\treturn WrappedComponent; // Fragment는 수정 없이 반환\n\t\t}\n\t\treturn cloneElement(WrappedComponent, {\n\t\t\tlayoutName,\n\t\t\tfitContent,\n\t\t\tcontainerCount,\n\t\t} as Partial<FlexContainerProps>);\n\t};\n\nexport default function FlexLayout({\n\tlayoutName,\n\tdirection,\n\tchildren,\n\tref,\n\tclassName,\n\tpanelClassName,\n\tpanelMovementMode = \"divorce\",\n\t...props\n}: FlexLayoutProps) {\n\tconst containerCount = Children.count(children);\n\tconst fitContent = direction === \"row\" ? \"width\" : \"height\";\n\t// Flatten children and unwrap Fragments\n\ttype FragmentElement = ReactElement<\n\t\t{ children?: ReactNode },\n\t\ttypeof Fragment\n\t>;\n\tconst isFragmentElement = (node: ReactNode): node is FragmentElement =>\n\t\tisValidElement(node) && node.type === Fragment;\n\n\t// ...\n\n\t// Flatten children and unwrap Fragments (타입 안전)\n\tconst nodes = Children.toArray(children).flatMap((node) =>\n\t\tisFragmentElement(node)\n\t\t\t? Children.toArray(node.props.children)\n\t\t\t: [node],\n\t);\n\n\t// 엘리먼트만 남기고, props 타입을 FlexLayoutChildrenType으로 고정\n\tconst flattenedChildren = nodes.filter(\n\t\tisValidElement,\n\t) as ReactElement<FlexLayoutChildrenType>[];\n\n\tif (flattenedChildren.length === 0) {\n\t\treturn null;\n\t}\n\t//if (!childrenTemplate) return null;\n\treturn (\n\t\t<>\n\t\t\t<FlexLayoutProvider\n\t\t\t\tvalue={{\n\t\t\t\t\tlayoutName,\n\t\t\t\t\tdirection,\n\t\t\t\t\tpanelMovementMode,\n\t\t\t\t\tpanelClassName,\n\t\t\t\t\tcontainerCount,\n\t\t\t\t\tfitContent,\n\t\t\t\t}}\n\t\t\t>\n\t\t\t\t<div\n\t\t\t\t\tclassName={`${styles[\"flex-layout\"]} ${className && className !== \"\" ? className : \"\"}`}\n\t\t\t\t\t{...(ref ? { ref } : {})}\n\t\t\t\t\t{...props}\n\t\t\t\t\tdata-layout_name={layoutName}\n\t\t\t\t\tdata-direction={direction}\n\t\t\t\t>\n\t\t\t\t\t{flattenedChildren.map((child, index) => {\n\t\t\t\t\t\tif (!child || !isValidElement(child)) return null;\n\t\t\t\t\t\t//const key = child.key || `flex-child-${index}`;\n\t\t\t\t\t\t// const wrappedChild = withFlexLayout(\n\t\t\t\t\t\t// layoutName,\n\t\t\t\t\t\t// fitContent,\n\t\t\t\t\t\t// containerCount\n\t\t\t\t\t\t// )(child);\n\t\t\t\t\t\treturn (\n\t\t\t\t\t\t\t<Fragment key={index}>\n\t\t\t\t\t\t\t\t{child}\n\t\t\t\t\t\t\t\t{/*wrappedChild*/}\n\t\t\t\t\t\t\t\t{/*<FlexLayoutContainer\n {...containerProps}\n fitContent={fitContent}\n containerCount={\n (children && children.length) || 0\n }\n layoutName={props.layoutName}\n >\n {child}\n </FlexLayoutContainer>*/}\n\t\t\t\t\t\t\t\t{/* 클라이언트 사이드에서만 리사이즈 패널 처리 */}\n\t\t\t\t\t\t\t\t<ContainerOpenCloseProvider\n\t\t\t\t\t\t\t\t\tlayoutName={layoutName}\n\t\t\t\t\t\t\t\t\tcontainerName={child.props.containerName}\n\t\t\t\t\t\t\t\t\tsizeName={fitContent}\n\t\t\t\t\t\t\t\t></ContainerOpenCloseProvider>\n\t\t\t\t\t\t\t</Fragment>\n\t\t\t\t\t\t);\n\t\t\t\t\t})}\n\t\t\t\t</div>\n\t\t\t</FlexLayoutProvider>\n\t\t</>\n\t);\n}\n"]}
|
|
@@ -0,0 +1,70 @@
|
|
|
1
|
+
import { jsx, Fragment, jsxs } from 'react/jsx-runtime';
|
|
2
|
+
import { Children, isValidElement, Fragment as Fragment$1 } from 'react';
|
|
3
|
+
import { ContainerOpenCloseProvider } from '../providers/FlexLayoutHooks';
|
|
4
|
+
import styles from '../styles/FlexLayout.module.css';
|
|
5
|
+
import { FlexLayoutProvider } from '../providers/FlexLayoutContext';
|
|
6
|
+
|
|
7
|
+
function FlexLayout({
|
|
8
|
+
layoutName,
|
|
9
|
+
direction,
|
|
10
|
+
children,
|
|
11
|
+
ref,
|
|
12
|
+
className,
|
|
13
|
+
panelClassName,
|
|
14
|
+
panelMovementMode = "divorce",
|
|
15
|
+
...props
|
|
16
|
+
}) {
|
|
17
|
+
const containerCount = Children.count(children);
|
|
18
|
+
const fitContent = direction === "row" ? "width" : "height";
|
|
19
|
+
const isFragmentElement = (node) => isValidElement(node) && node.type === Fragment$1;
|
|
20
|
+
const nodes = Children.toArray(children).flatMap(
|
|
21
|
+
(node) => isFragmentElement(node) ? Children.toArray(node.props.children) : [node]
|
|
22
|
+
);
|
|
23
|
+
const flattenedChildren = nodes.filter(
|
|
24
|
+
isValidElement
|
|
25
|
+
);
|
|
26
|
+
if (flattenedChildren.length === 0) {
|
|
27
|
+
return null;
|
|
28
|
+
}
|
|
29
|
+
return /* @__PURE__ */ jsx(Fragment, { children: /* @__PURE__ */ jsx(
|
|
30
|
+
FlexLayoutProvider,
|
|
31
|
+
{
|
|
32
|
+
value: {
|
|
33
|
+
layoutName,
|
|
34
|
+
direction,
|
|
35
|
+
panelMovementMode,
|
|
36
|
+
panelClassName,
|
|
37
|
+
containerCount,
|
|
38
|
+
fitContent
|
|
39
|
+
},
|
|
40
|
+
children: /* @__PURE__ */ jsx(
|
|
41
|
+
"div",
|
|
42
|
+
{
|
|
43
|
+
className: `${styles["flex-layout"]} ${className && className !== "" ? className : ""}`,
|
|
44
|
+
...ref ? { ref } : {},
|
|
45
|
+
...props,
|
|
46
|
+
"data-layout_name": layoutName,
|
|
47
|
+
"data-direction": direction,
|
|
48
|
+
children: flattenedChildren.map((child, index) => {
|
|
49
|
+
if (!child || !isValidElement(child)) return null;
|
|
50
|
+
return /* @__PURE__ */ jsxs(Fragment$1, { children: [
|
|
51
|
+
child,
|
|
52
|
+
/* @__PURE__ */ jsx(
|
|
53
|
+
ContainerOpenCloseProvider,
|
|
54
|
+
{
|
|
55
|
+
layoutName,
|
|
56
|
+
containerName: child.props.containerName,
|
|
57
|
+
sizeName: fitContent
|
|
58
|
+
}
|
|
59
|
+
)
|
|
60
|
+
] }, index);
|
|
61
|
+
})
|
|
62
|
+
}
|
|
63
|
+
)
|
|
64
|
+
}
|
|
65
|
+
) });
|
|
66
|
+
}
|
|
67
|
+
|
|
68
|
+
export { FlexLayout as default };
|
|
69
|
+
//# sourceMappingURL=FlexLayout.js.map
|
|
70
|
+
//# sourceMappingURL=FlexLayout.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"sources":["../../../src/flex-layout/components/FlexLayout.tsx"],"names":["Fragment"],"mappings":";;;;;;AAuCe,SAAR,UAAA,CAA4B;AAAA,EAClC,UAAA;AAAA,EACA,SAAA;AAAA,EACA,QAAA;AAAA,EACA,GAAA;AAAA,EACA,SAAA;AAAA,EACA,cAAA;AAAA,EACA,iBAAA,GAAoB,SAAA;AAAA,EACpB,GAAG;AACJ,CAAA,EAAoB;AACnB,EAAA,MAAM,cAAA,GAAiB,QAAA,CAAS,KAAA,CAAM,QAAQ,CAAA;AAC9C,EAAA,MAAM,UAAA,GAAa,SAAA,KAAc,KAAA,GAAQ,OAAA,GAAU,QAAA;AAMnD,EAAA,MAAM,oBAAoB,CAAC,IAAA,KAC1B,eAAe,IAAI,CAAA,IAAK,KAAK,IAAA,KAASA,UAAAA;AAKvC,EAAA,MAAM,KAAA,GAAQ,QAAA,CAAS,OAAA,CAAQ,QAAQ,CAAA,CAAE,OAAA;AAAA,IAAQ,CAAC,IAAA,KACjD,iBAAA,CAAkB,IAAI,CAAA,GACnB,QAAA,CAAS,OAAA,CAAQ,IAAA,CAAK,KAAA,CAAM,QAAQ,CAAA,GACpC,CAAC,IAAI;AAAA,GACT;AAGA,EAAA,MAAM,oBAAoB,KAAA,CAAM,MAAA;AAAA,IAC/B;AAAA,GACD;AAEA,EAAA,IAAI,iBAAA,CAAkB,WAAW,CAAA,EAAG;AACnC,IAAA,OAAO,IAAA;AAAA,EACR;AAEA,EAAA,uBACC,GAAA,CAAA,QAAA,EAAA,EACC,QAAA,kBAAA,GAAA;AAAA,IAAC,kBAAA;AAAA,IAAA;AAAA,MACA,KAAA,EAAO;AAAA,QACN,UAAA;AAAA,QACA,SAAA;AAAA,QACA,iBAAA;AAAA,QACA,cAAA;AAAA,QACA,cAAA;AAAA,QACA;AAAA,OACD;AAAA,MAEA,QAAA,kBAAA,GAAA;AAAA,QAAC,KAAA;AAAA,QAAA;AAAA,UACA,SAAA,EAAW,CAAA,EAAG,MAAA,CAAO,aAAa,CAAC,IAAI,SAAA,IAAa,SAAA,KAAc,EAAA,GAAK,SAAA,GAAY,EAAE,CAAA,CAAA;AAAA,UACpF,GAAI,GAAA,GAAM,EAAE,GAAA,KAAQ,EAAC;AAAA,UACrB,GAAG,KAAA;AAAA,UACJ,kBAAA,EAAkB,UAAA;AAAA,UAClB,gBAAA,EAAgB,SAAA;AAAA,UAEf,QAAA,EAAA,iBAAA,CAAkB,GAAA,CAAI,CAAC,KAAA,EAAO,KAAA,KAAU;AACxC,YAAA,IAAI,CAAC,KAAA,IAAS,CAAC,cAAA,CAAe,KAAK,GAAG,OAAO,IAAA;AAO7C,YAAA,uBACC,IAAA,CAACA,YAAA,EACC,QAAA,EAAA;AAAA,cAAA,KAAA;AAAA,8BAaD,GAAA;AAAA,gBAAC,0BAAA;AAAA,gBAAA;AAAA,kBACA,UAAA;AAAA,kBACA,aAAA,EAAe,MAAM,KAAA,CAAM,aAAA;AAAA,kBAC3B,QAAA,EAAU;AAAA;AAAA;AACV,aAAA,EAAA,EAlBa,KAmBf,CAAA;AAAA,UAEF,CAAC;AAAA;AAAA;AACF;AAAA,GACD,EACD,CAAA;AAEF","file":"FlexLayout.js","sourcesContent":["import {\n\tChildren,\n\tcloneElement,\n\tFragment,\n\tisValidElement,\n\tReactElement,\n\tReactNode,\n} from \"react\";\nimport { ContainerOpenCloseProvider } from \"../providers/FlexLayoutHooks\";\nimport styles from \"../styles/FlexLayout.module.css\";\nimport {\n\tFlexContainerProps,\n\tFlexLayoutChildrenType,\n\tFlexLayoutProps,\n} from \"../types/FlexLayoutTypes\";\n\nimport { FlexLayoutProvider } from \"../providers/FlexLayoutContext\";\n\nconst withFlexLayout =\n\t(\n\t\tlayoutName: string,\n\t\tfitContent: \"width\" | \"height\",\n\t\tcontainerCount: number,\n\t) =>\n\t(WrappedComponent: ReactElement<FlexLayoutChildrenType>) => {\n\t\tif (\n\t\t\tWrappedComponent.type === Fragment ||\n\t\t\tWrappedComponent.type === \"div\" ||\n\t\t\tWrappedComponent.type === \"span\"\n\t\t) {\n\t\t\treturn WrappedComponent; // Fragment는 수정 없이 반환\n\t\t}\n\t\treturn cloneElement(WrappedComponent, {\n\t\t\tlayoutName,\n\t\t\tfitContent,\n\t\t\tcontainerCount,\n\t\t} as Partial<FlexContainerProps>);\n\t};\n\nexport default function FlexLayout({\n\tlayoutName,\n\tdirection,\n\tchildren,\n\tref,\n\tclassName,\n\tpanelClassName,\n\tpanelMovementMode = \"divorce\",\n\t...props\n}: FlexLayoutProps) {\n\tconst containerCount = Children.count(children);\n\tconst fitContent = direction === \"row\" ? \"width\" : \"height\";\n\t// Flatten children and unwrap Fragments\n\ttype FragmentElement = ReactElement<\n\t\t{ children?: ReactNode },\n\t\ttypeof Fragment\n\t>;\n\tconst isFragmentElement = (node: ReactNode): node is FragmentElement =>\n\t\tisValidElement(node) && node.type === Fragment;\n\n\t// ...\n\n\t// Flatten children and unwrap Fragments (타입 안전)\n\tconst nodes = Children.toArray(children).flatMap((node) =>\n\t\tisFragmentElement(node)\n\t\t\t? Children.toArray(node.props.children)\n\t\t\t: [node],\n\t);\n\n\t// 엘리먼트만 남기고, props 타입을 FlexLayoutChildrenType으로 고정\n\tconst flattenedChildren = nodes.filter(\n\t\tisValidElement,\n\t) as ReactElement<FlexLayoutChildrenType>[];\n\n\tif (flattenedChildren.length === 0) {\n\t\treturn null;\n\t}\n\t//if (!childrenTemplate) return null;\n\treturn (\n\t\t<>\n\t\t\t<FlexLayoutProvider\n\t\t\t\tvalue={{\n\t\t\t\t\tlayoutName,\n\t\t\t\t\tdirection,\n\t\t\t\t\tpanelMovementMode,\n\t\t\t\t\tpanelClassName,\n\t\t\t\t\tcontainerCount,\n\t\t\t\t\tfitContent,\n\t\t\t\t}}\n\t\t\t>\n\t\t\t\t<div\n\t\t\t\t\tclassName={`${styles[\"flex-layout\"]} ${className && className !== \"\" ? className : \"\"}`}\n\t\t\t\t\t{...(ref ? { ref } : {})}\n\t\t\t\t\t{...props}\n\t\t\t\t\tdata-layout_name={layoutName}\n\t\t\t\t\tdata-direction={direction}\n\t\t\t\t>\n\t\t\t\t\t{flattenedChildren.map((child, index) => {\n\t\t\t\t\t\tif (!child || !isValidElement(child)) return null;\n\t\t\t\t\t\t//const key = child.key || `flex-child-${index}`;\n\t\t\t\t\t\t// const wrappedChild = withFlexLayout(\n\t\t\t\t\t\t// layoutName,\n\t\t\t\t\t\t// fitContent,\n\t\t\t\t\t\t// containerCount\n\t\t\t\t\t\t// )(child);\n\t\t\t\t\t\treturn (\n\t\t\t\t\t\t\t<Fragment key={index}>\n\t\t\t\t\t\t\t\t{child}\n\t\t\t\t\t\t\t\t{/*wrappedChild*/}\n\t\t\t\t\t\t\t\t{/*<FlexLayoutContainer\n {...containerProps}\n fitContent={fitContent}\n containerCount={\n (children && children.length) || 0\n }\n layoutName={props.layoutName}\n >\n {child}\n </FlexLayoutContainer>*/}\n\t\t\t\t\t\t\t\t{/* 클라이언트 사이드에서만 리사이즈 패널 처리 */}\n\t\t\t\t\t\t\t\t<ContainerOpenCloseProvider\n\t\t\t\t\t\t\t\t\tlayoutName={layoutName}\n\t\t\t\t\t\t\t\t\tcontainerName={child.props.containerName}\n\t\t\t\t\t\t\t\t\tsizeName={fitContent}\n\t\t\t\t\t\t\t\t></ContainerOpenCloseProvider>\n\t\t\t\t\t\t\t</Fragment>\n\t\t\t\t\t\t);\n\t\t\t\t\t})}\n\t\t\t\t</div>\n\t\t\t</FlexLayoutProvider>\n\t\t</>\n\t);\n}\n"]}
|
|
@@ -0,0 +1,196 @@
|
|
|
1
|
+
'use strict';
|
|
2
|
+
|
|
3
|
+
var jsxRuntime = require('react/jsx-runtime');
|
|
4
|
+
var react = require('react');
|
|
5
|
+
var useSizes = require('../hooks/useSizes');
|
|
6
|
+
var FlexLayoutContext = require('../providers/FlexLayoutContext');
|
|
7
|
+
var FlexLayoutContainerStore = require('../store/FlexLayoutContainerStore');
|
|
8
|
+
var styles = require('../styles/FlexLayout.module.css');
|
|
9
|
+
var FlexLayoutUtils = require('../utils/FlexLayoutUtils');
|
|
10
|
+
var FlexLayoutResizePanel = require('./FlexLayoutResizePanel');
|
|
11
|
+
|
|
12
|
+
function _interopDefault (e) { return e && e.__esModule ? e : { default: e }; }
|
|
13
|
+
|
|
14
|
+
var styles__default = /*#__PURE__*/_interopDefault(styles);
|
|
15
|
+
var FlexLayoutResizePanel__default = /*#__PURE__*/_interopDefault(FlexLayoutResizePanel);
|
|
16
|
+
|
|
17
|
+
function FlexLayoutContainer({
|
|
18
|
+
isFitContent,
|
|
19
|
+
isFitResize,
|
|
20
|
+
// fitContent,
|
|
21
|
+
// containerCount,
|
|
22
|
+
// layoutName,
|
|
23
|
+
containerName,
|
|
24
|
+
grow: initialGrow,
|
|
25
|
+
prevGrow: initialPrevGrow,
|
|
26
|
+
isInitialResizable,
|
|
27
|
+
isResizePanel,
|
|
28
|
+
children,
|
|
29
|
+
className,
|
|
30
|
+
panelMode
|
|
31
|
+
}) {
|
|
32
|
+
const {
|
|
33
|
+
direction,
|
|
34
|
+
panelMovementMode,
|
|
35
|
+
panelClassName,
|
|
36
|
+
layoutName,
|
|
37
|
+
fitContent,
|
|
38
|
+
containerCount
|
|
39
|
+
} = FlexLayoutContext.useFlexLayoutContext();
|
|
40
|
+
const { ref, size } = (
|
|
41
|
+
// isFitContent && fitContent
|
|
42
|
+
//?
|
|
43
|
+
useSizes.useSize(fitContent)
|
|
44
|
+
);
|
|
45
|
+
const flexContainerNodeRef = react.useRef(null);
|
|
46
|
+
const flexContainerRef = react.useCallback(
|
|
47
|
+
(node) => {
|
|
48
|
+
flexContainerNodeRef.current = node;
|
|
49
|
+
if (node !== null) {
|
|
50
|
+
FlexLayoutContainerStore.setContainerRef(layoutName, containerName, { current: node });
|
|
51
|
+
}
|
|
52
|
+
},
|
|
53
|
+
[layoutName, containerName]
|
|
54
|
+
);
|
|
55
|
+
const [growState, setGrowState] = react.useState(initialGrow);
|
|
56
|
+
react.useEffect(() => {
|
|
57
|
+
setGrowState(initialGrow);
|
|
58
|
+
}, [initialGrow]);
|
|
59
|
+
const [prevGrowState, setPrevGrowState] = react.useState(
|
|
60
|
+
initialPrevGrow
|
|
61
|
+
);
|
|
62
|
+
const [isFirstLoad, setIsFirstLoad] = react.useState(true);
|
|
63
|
+
react.useEffect(() => {
|
|
64
|
+
if (!flexContainerNodeRef.current) return;
|
|
65
|
+
FlexLayoutContainerStore.setContainerRef(layoutName, containerName, flexContainerNodeRef);
|
|
66
|
+
return () => {
|
|
67
|
+
FlexLayoutContainerStore.setContainerRef(layoutName, containerName, {
|
|
68
|
+
current: null
|
|
69
|
+
});
|
|
70
|
+
};
|
|
71
|
+
}, [containerName, layoutName]);
|
|
72
|
+
react.useEffect(() => {
|
|
73
|
+
if (typeof window == "undefined" || flexContainerNodeRef.current === null)
|
|
74
|
+
return;
|
|
75
|
+
const storedGrow = sessionStorage.getItem(containerName);
|
|
76
|
+
if (storedGrow !== null) {
|
|
77
|
+
const parsed = parseFloat(storedGrow);
|
|
78
|
+
if (!isNaN(parsed)) {
|
|
79
|
+
flexContainerNodeRef.current.style.flex = `${parsed} 1 0%`;
|
|
80
|
+
setGrowState(parsed);
|
|
81
|
+
}
|
|
82
|
+
}
|
|
83
|
+
}, [containerName]);
|
|
84
|
+
react.useEffect(() => {
|
|
85
|
+
if (!flexContainerNodeRef.current) return;
|
|
86
|
+
const targetNode = flexContainerNodeRef.current;
|
|
87
|
+
const observer = new MutationObserver((mutations) => {
|
|
88
|
+
for (const mutation of mutations) {
|
|
89
|
+
if (mutation.type === "attributes" && mutation.attributeName === "style" && targetNode.style.flex) {
|
|
90
|
+
const flexValue = targetNode.style.flex;
|
|
91
|
+
const parsedGrow = parseFloat(flexValue.split(" ")[0]);
|
|
92
|
+
if (!isNaN(parsedGrow)) {
|
|
93
|
+
setGrowState(parsedGrow);
|
|
94
|
+
}
|
|
95
|
+
}
|
|
96
|
+
}
|
|
97
|
+
});
|
|
98
|
+
observer.observe(targetNode, {
|
|
99
|
+
attributes: true,
|
|
100
|
+
attributeFilter: ["style"],
|
|
101
|
+
attributeOldValue: true
|
|
102
|
+
});
|
|
103
|
+
return () => {
|
|
104
|
+
observer.disconnect();
|
|
105
|
+
};
|
|
106
|
+
}, [containerName]);
|
|
107
|
+
react.useEffect(() => {
|
|
108
|
+
if (!flexContainerNodeRef.current || !ref || !ref.current || !size || !fitContent)
|
|
109
|
+
return;
|
|
110
|
+
requestAnimationFrame(() => {
|
|
111
|
+
if (!flexContainerNodeRef.current) return;
|
|
112
|
+
const sizeName = `${fitContent.charAt(0).toUpperCase() + fitContent.substring(1)}`;
|
|
113
|
+
const parentSize = flexContainerNodeRef.current.parentElement && flexContainerNodeRef.current.parentElement["client" + sizeName] || 0;
|
|
114
|
+
if (isFitContent) {
|
|
115
|
+
flexContainerNodeRef.current.style["max" + sizeName] = size + "px";
|
|
116
|
+
}
|
|
117
|
+
if (!isFitResize && isFirstLoad) {
|
|
118
|
+
setIsFirstLoad(false);
|
|
119
|
+
return;
|
|
120
|
+
}
|
|
121
|
+
if (FlexLayoutUtils.getGrow(flexContainerNodeRef.current) != 0 && isFitResize) {
|
|
122
|
+
const newGrow = FlexLayoutUtils.mathGrow(size, parentSize, containerCount);
|
|
123
|
+
setPrevGrowState(growState);
|
|
124
|
+
setGrowState(newGrow);
|
|
125
|
+
}
|
|
126
|
+
});
|
|
127
|
+
}, [size, containerCount, isFitResize, children]);
|
|
128
|
+
react.useEffect(() => {
|
|
129
|
+
if (!flexContainerNodeRef.current) return;
|
|
130
|
+
let notGrowList = [];
|
|
131
|
+
let containerList = [
|
|
132
|
+
...flexContainerNodeRef.current.parentElement?.children || []
|
|
133
|
+
].filter((e) => e.hasAttribute("data-container_name"));
|
|
134
|
+
let remainingGrow = containerList.reduce((t, e, i) => {
|
|
135
|
+
let item = e;
|
|
136
|
+
if (item.classList.contains(styles__default.default["flex-resize-panel"])) return t;
|
|
137
|
+
if (e.hasAttribute("data-grow") == false || e.getAttribute("data-is_resize") === "true") {
|
|
138
|
+
notGrowList.push(item);
|
|
139
|
+
return t;
|
|
140
|
+
}
|
|
141
|
+
let grow = parseFloat(item.dataset.grow || "");
|
|
142
|
+
item.style.flex = `${grow} 1 0%`;
|
|
143
|
+
t -= grow;
|
|
144
|
+
return t;
|
|
145
|
+
}, containerList.length);
|
|
146
|
+
if (notGrowList.length != 0) {
|
|
147
|
+
let resizeWeight = FlexLayoutUtils.mathWeight(notGrowList.length, remainingGrow);
|
|
148
|
+
notGrowList.forEach((e) => {
|
|
149
|
+
e.dataset.grow = resizeWeight.toString();
|
|
150
|
+
e.style.flex = `${resizeWeight} 1 0%`;
|
|
151
|
+
});
|
|
152
|
+
}
|
|
153
|
+
}, []);
|
|
154
|
+
return /* @__PURE__ */ jsxRuntime.jsxs(jsxRuntime.Fragment, { children: [
|
|
155
|
+
/* @__PURE__ */ jsxRuntime.jsx(
|
|
156
|
+
"div",
|
|
157
|
+
{
|
|
158
|
+
id: containerName,
|
|
159
|
+
"data-container_name": containerName,
|
|
160
|
+
ref: flexContainerRef,
|
|
161
|
+
className: `${styles__default.default["flex-container"]} ${className && className !== "" ? className : ""}`,
|
|
162
|
+
...growState !== void 0 ? { ["data-grow"]: growState } : {},
|
|
163
|
+
...prevGrowState != void 0 ? { ["data-prev_grow"]: prevGrowState } : {},
|
|
164
|
+
"data-is_resize": isInitialResizable,
|
|
165
|
+
"data-is_resize_panel": isResizePanel,
|
|
166
|
+
style: growState !== void 0 && {
|
|
167
|
+
flex: `${growState} 1 0%`
|
|
168
|
+
} || {},
|
|
169
|
+
children: isFitContent && /* @__PURE__ */ jsxRuntime.jsx(
|
|
170
|
+
"div",
|
|
171
|
+
{
|
|
172
|
+
className: `${styles__default.default["flex-content-fit-wrapper"]}`,
|
|
173
|
+
ref,
|
|
174
|
+
children
|
|
175
|
+
}
|
|
176
|
+
) || children
|
|
177
|
+
}
|
|
178
|
+
),
|
|
179
|
+
isResizePanel && /* @__PURE__ */ jsxRuntime.jsx(
|
|
180
|
+
FlexLayoutResizePanel__default.default,
|
|
181
|
+
{
|
|
182
|
+
containerName,
|
|
183
|
+
layoutName,
|
|
184
|
+
direction,
|
|
185
|
+
containerCount,
|
|
186
|
+
panelMode,
|
|
187
|
+
panelClassName,
|
|
188
|
+
panelMovementMode
|
|
189
|
+
}
|
|
190
|
+
)
|
|
191
|
+
] });
|
|
192
|
+
}
|
|
193
|
+
|
|
194
|
+
module.exports = FlexLayoutContainer;
|
|
195
|
+
//# sourceMappingURL=FlexLayoutContainer.cjs.map
|
|
196
|
+
//# sourceMappingURL=FlexLayoutContainer.cjs.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"sources":["../../../src/flex-layout/components/FlexLayoutContainer.tsx"],"names":["useFlexLayoutContext","useSize","useRef","useCallback","setContainerRef","useState","useEffect","getGrow","mathGrow","styles","mathWeight","jsxs","Fragment","jsx","FlexLayoutResizePanel"],"mappings":"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","file":"FlexLayoutContainer.cjs","sourcesContent":["\"use client\";\r\nimport { useCallback, useEffect, useRef, useState } from \"react\";\r\nimport { useSize } from \"../hooks/useSizes\";\r\nimport { useFlexLayoutContext } from \"../providers/FlexLayoutContext\";\r\nimport { setContainerRef } from \"../store/FlexLayoutContainerStore\";\r\nimport styles from \"../styles/FlexLayout.module.css\";\r\nimport { FlexContainerProps } from \"../types/FlexLayoutTypes\";\r\nimport { getGrow, mathGrow, mathWeight } from \"../utils/FlexLayoutUtils\";\r\nimport FlexLayoutResizePanel from \"./FlexLayoutResizePanel\";\r\n\r\nexport default function FlexLayoutContainer({\r\n\tisFitContent,\r\n\tisFitResize,\r\n\t// fitContent,\r\n\t// containerCount,\r\n\t// layoutName,\r\n\tcontainerName,\r\n\tgrow: initialGrow,\r\n\tprevGrow: initialPrevGrow,\r\n\tisInitialResizable,\r\n\tisResizePanel,\r\n\tchildren,\r\n\tclassName,\r\n\tpanelMode,\r\n}: FlexContainerProps) {\r\n\tconst {\r\n\t\tdirection,\r\n\t\tpanelMovementMode,\r\n\t\tpanelClassName,\r\n\t\tlayoutName,\r\n\t\tfitContent,\r\n\t\tcontainerCount,\r\n\t} = useFlexLayoutContext();\r\n\r\n\tconst { ref, size } =\r\n\t\t// isFitContent && fitContent\r\n\t\t//?\r\n\t\tuseSize(fitContent);\r\n\t//: { ref: null, size: null };\r\n\t// 콜백 ref에서 접근하기 위한 내부 ref 생성\r\n\tconst flexContainerNodeRef = useRef<HTMLDivElement | null>(null);\r\n\r\n\t// 콜백 ref 정의\r\n\tconst flexContainerRef = useCallback(\r\n\t\t(node: HTMLDivElement | null) => {\r\n\t\t\tflexContainerNodeRef.current = node;\r\n\t\t\tif (node !== null) {\r\n\t\t\t\tsetContainerRef(layoutName, containerName, { current: node });\r\n\t\t\t} else {\r\n\t\t\t\t// 컴포넌트가 언마운트될 때 필요한 작업이 있다면 여기에 추가\r\n\t\t\t}\r\n\t\t},\r\n\t\t[layoutName, containerName],\r\n\t);\r\n\r\n\t// 초기 SSR 시점에는 sessionStorage를 사용할 수 없으므로 일단 initialGrow를 사용\r\n\tconst [growState, setGrowState] = useState<number | undefined>(initialGrow);\r\n\tuseEffect(() => {\r\n\t\tsetGrowState(initialGrow);\r\n\t}, [initialGrow]);\r\n\tconst [prevGrowState, setPrevGrowState] = useState<number | undefined>(\r\n\t\tinitialPrevGrow,\r\n\t);\r\n\tconst [isFirstLoad, setIsFirstLoad] = useState<boolean>(true);\r\n\r\n\tuseEffect(() => {\r\n\t\tif (!flexContainerNodeRef.current) return;\r\n\t\tsetContainerRef(layoutName, containerName, flexContainerNodeRef);\r\n\t\treturn () => {\r\n\t\t\tsetContainerRef(layoutName, containerName, {\r\n\t\t\t\tcurrent: null,\r\n\t\t\t} as any);\r\n\t\t};\r\n\t}, [containerName, layoutName]);\r\n\r\n\t// 클라이언트 마운트 후 sessionStorage에서 grow값을 가져와 state 업데이트 (SSR/Hydration 안정화)\r\n\tuseEffect(() => {\r\n\t\tif (\r\n\t\t\ttypeof window == \"undefined\" ||\r\n\t\t\tflexContainerNodeRef.current === null\r\n\t\t)\r\n\t\t\treturn;\r\n\r\n\t\tconst storedGrow = sessionStorage.getItem(containerName);\r\n\t\tif (storedGrow !== null) {\r\n\t\t\tconst parsed = parseFloat(storedGrow);\r\n\t\t\tif (!isNaN(parsed)) {\r\n\t\t\t\tflexContainerNodeRef.current.style.flex = `${parsed} 1 0%`;\r\n\t\t\t\tsetGrowState(parsed);\r\n\t\t\t}\r\n\t\t}\r\n\t}, [containerName]);\r\n\r\n\t// 스타일 변경 감지를 위한 MutationObserver\r\n\tuseEffect(() => {\r\n\t\tif (!flexContainerNodeRef.current) return;\r\n\t\tconst targetNode = flexContainerNodeRef.current;\r\n\r\n\t\tconst observer = new MutationObserver((mutations) => {\r\n\t\t\tfor (const mutation of mutations) {\r\n\t\t\t\tif (\r\n\t\t\t\t\tmutation.type === \"attributes\" &&\r\n\t\t\t\t\tmutation.attributeName === \"style\" &&\r\n\t\t\t\t\ttargetNode.style.flex\r\n\t\t\t\t) {\r\n\t\t\t\t\t// style.flex = \"X 1 0%\" 형태이므로 X를 파싱\r\n\t\t\t\t\tconst flexValue = targetNode.style.flex;\r\n\t\t\t\t\tconst parsedGrow = parseFloat(flexValue.split(\" \")[0]);\r\n\t\t\t\t\tif (!isNaN(parsedGrow)) {\r\n\t\t\t\t\t\t// sessionStorage에 저장\r\n\t\t\t\t\t\t// sessionStorage.setItem(\r\n\t\t\t\t\t\t// containerName,\r\n\t\t\t\t\t\t// parsedGrow.toString()\r\n\t\t\t\t\t\t// );\r\n\t\t\t\t\t\t// state 업데이트\r\n\t\t\t\t\t\tsetGrowState(parsedGrow);\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\tobserver.observe(targetNode, {\r\n\t\t\tattributes: true,\r\n\t\t\tattributeFilter: [\"style\"],\r\n\t\t\tattributeOldValue: true,\r\n\t\t});\r\n\r\n\t\treturn () => {\r\n\t\t\tobserver.disconnect();\r\n\t\t};\r\n\t}, [containerName]);\r\n\r\n\tuseEffect(() => {\r\n\t\t// 컴포넌트 크기 및 설정값에 따른 사이즈 재조정\r\n\t\tif (\r\n\t\t\t!flexContainerNodeRef.current ||\r\n\t\t\t!ref ||\r\n\t\t\t!ref.current ||\r\n\t\t\t!size ||\r\n\t\t\t!fitContent\r\n\t\t\t//||getGrow(flexContainerRef.current) == 0\r\n\t\t)\r\n\t\t\treturn;\r\n\t\trequestAnimationFrame(() => {\r\n\t\t\tif (!flexContainerNodeRef.current) return;\r\n\t\t\tconst sizeName = `${fitContent.charAt(0).toUpperCase() + fitContent.substring(1)}`;\r\n\t\t\tconst parentSize =\r\n\t\t\t\t(flexContainerNodeRef.current.parentElement &&\r\n\t\t\t\t\tflexContainerNodeRef.current.parentElement[\r\n\t\t\t\t\t\t(\"client\" + sizeName) as \"clientWidth\" | \"clientHeight\"\r\n\t\t\t\t\t]) ||\r\n\t\t\t\t0;\r\n\t\t\tif (isFitContent) {\r\n\t\t\t\tflexContainerNodeRef.current.style[\r\n\t\t\t\t\t(\"max\" + sizeName) as \"maxWidth\" | \"maxHeight\"\r\n\t\t\t\t] = size + \"px\";\r\n\t\t\t}\r\n\t\t\tif (!isFitResize && isFirstLoad) {\r\n\t\t\t\tsetIsFirstLoad(false);\r\n\t\t\t\treturn;\r\n\t\t\t}\r\n\r\n\t\t\tif (getGrow(flexContainerNodeRef.current) != 0 && isFitResize) {\r\n\t\t\t\tconst newGrow = mathGrow(size, parentSize, containerCount);\r\n\t\t\t\tsetPrevGrowState(growState);\r\n\t\t\t\tsetGrowState(newGrow);\r\n\t\t\t\t// flexContainerNodeRef.current.dataset.prev_grow =\r\n\t\t\t\t// flexContainerNodeRef.current.dataset.grow;\r\n\t\t\t\t// flexContainerNodeRef.current.dataset.grow = newGrow.toString();\r\n\t\t\t\t// flexContainerNodeRef.current.style.flex = `${newGrow} 1 0%`;\r\n\t\t\t}\r\n\t\t});\r\n\t}, [size, containerCount, isFitResize, children]);\r\n\r\n\tuseEffect(() => {\r\n\t\tif (!flexContainerNodeRef.current) return;\r\n\r\n\t\tlet notGrowList: Array<HTMLElement> = [];\r\n\t\tlet containerList = [\r\n\t\t\t...(flexContainerNodeRef.current.parentElement?.children || []),\r\n\t\t].filter((e) => e.hasAttribute(\"data-container_name\"));\r\n\t\tlet remainingGrow = containerList.reduce((t, e, i) => {\r\n\t\t\tlet item = e as HTMLElement;\r\n\r\n\t\t\tif (item.classList.contains(styles[\"flex-resize-panel\"])) return t;\r\n\r\n\t\t\tif (\r\n\t\t\t\te.hasAttribute(\"data-grow\") == false ||\r\n\t\t\t\te.getAttribute(\"data-is_resize\") === \"true\"\r\n\t\t\t) {\r\n\t\t\t\tnotGrowList.push(item);\r\n\t\t\t\treturn t;\r\n\t\t\t}\r\n\t\t\tlet grow = parseFloat(item.dataset.grow || \"\");\r\n\t\t\titem.style.flex = `${grow} 1 0%`;\r\n\t\t\tt -= grow;\r\n\t\t\treturn t;\r\n\t\t}, containerList.length);\r\n\t\tif (notGrowList.length != 0) {\r\n\t\t\tlet resizeWeight = mathWeight(notGrowList.length, remainingGrow);\r\n\t\t\tnotGrowList.forEach((e) => {\r\n\t\t\t\te.dataset.grow = resizeWeight.toString();\r\n\t\t\t\te.style.flex = `${resizeWeight} 1 0%`;\r\n\t\t\t});\r\n\t\t}\r\n\t}, []);\r\n\treturn (\r\n\t\t<>\r\n\t\t\t<div\r\n\t\t\t\tid={containerName}\r\n\t\t\t\tdata-container_name={containerName}\r\n\t\t\t\tref={flexContainerRef}\r\n\t\t\t\tclassName={`${styles[\"flex-container\"]} ${className && className !== \"\" ? className : \"\"}`}\r\n\t\t\t\t{...(growState !== undefined\r\n\t\t\t\t\t? { [\"data-grow\"]: growState }\r\n\t\t\t\t\t: {})}\r\n\t\t\t\t{...(prevGrowState != undefined\r\n\t\t\t\t\t? { [\"data-prev_grow\"]: prevGrowState }\r\n\t\t\t\t\t: {})}\r\n\t\t\t\tdata-is_resize={isInitialResizable}\r\n\t\t\t\tdata-is_resize_panel={isResizePanel}\r\n\t\t\t\tstyle={\r\n\t\t\t\t\t(growState !== undefined && {\r\n\t\t\t\t\t\tflex: `${growState} 1 0%`,\r\n\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\t{(isFitContent && (\r\n\t\t\t\t\t<div\r\n\t\t\t\t\t\tclassName={`${styles[\"flex-content-fit-wrapper\"]}`}\r\n\t\t\t\t\t\tref={ref}\r\n\t\t\t\t\t>\r\n\t\t\t\t\t\t{children}\r\n\t\t\t\t\t</div>\r\n\t\t\t\t)) ||\r\n\t\t\t\t\tchildren}\r\n\t\t\t</div>\r\n\t\t\t{isResizePanel && (\r\n\t\t\t\t<FlexLayoutResizePanel\r\n\t\t\t\t\tcontainerName={containerName}\r\n\t\t\t\t\tlayoutName={layoutName}\r\n\t\t\t\t\tdirection={direction}\r\n\t\t\t\t\tcontainerCount={containerCount}\r\n\t\t\t\t\tpanelMode={panelMode}\r\n\t\t\t\t\tpanelClassName={panelClassName}\r\n\t\t\t\t\tpanelMovementMode={panelMovementMode}\r\n\t\t\t\t/>\r\n\t\t\t)}\r\n\t\t</>\r\n\t);\r\n}\r\n"]}
|
|
@@ -0,0 +1,189 @@
|
|
|
1
|
+
import { jsxs, Fragment, jsx } from 'react/jsx-runtime';
|
|
2
|
+
import { useRef, useCallback, useState, useEffect } from 'react';
|
|
3
|
+
import { useSize } from '../hooks/useSizes';
|
|
4
|
+
import { useFlexLayoutContext } from '../providers/FlexLayoutContext';
|
|
5
|
+
import { setContainerRef } from '../store/FlexLayoutContainerStore';
|
|
6
|
+
import styles from '../styles/FlexLayout.module.css';
|
|
7
|
+
import { getGrow, mathGrow, mathWeight } from '../utils/FlexLayoutUtils';
|
|
8
|
+
import FlexLayoutResizePanel from './FlexLayoutResizePanel';
|
|
9
|
+
|
|
10
|
+
function FlexLayoutContainer({
|
|
11
|
+
isFitContent,
|
|
12
|
+
isFitResize,
|
|
13
|
+
// fitContent,
|
|
14
|
+
// containerCount,
|
|
15
|
+
// layoutName,
|
|
16
|
+
containerName,
|
|
17
|
+
grow: initialGrow,
|
|
18
|
+
prevGrow: initialPrevGrow,
|
|
19
|
+
isInitialResizable,
|
|
20
|
+
isResizePanel,
|
|
21
|
+
children,
|
|
22
|
+
className,
|
|
23
|
+
panelMode
|
|
24
|
+
}) {
|
|
25
|
+
const {
|
|
26
|
+
direction,
|
|
27
|
+
panelMovementMode,
|
|
28
|
+
panelClassName,
|
|
29
|
+
layoutName,
|
|
30
|
+
fitContent,
|
|
31
|
+
containerCount
|
|
32
|
+
} = useFlexLayoutContext();
|
|
33
|
+
const { ref, size } = (
|
|
34
|
+
// isFitContent && fitContent
|
|
35
|
+
//?
|
|
36
|
+
useSize(fitContent)
|
|
37
|
+
);
|
|
38
|
+
const flexContainerNodeRef = useRef(null);
|
|
39
|
+
const flexContainerRef = useCallback(
|
|
40
|
+
(node) => {
|
|
41
|
+
flexContainerNodeRef.current = node;
|
|
42
|
+
if (node !== null) {
|
|
43
|
+
setContainerRef(layoutName, containerName, { current: node });
|
|
44
|
+
}
|
|
45
|
+
},
|
|
46
|
+
[layoutName, containerName]
|
|
47
|
+
);
|
|
48
|
+
const [growState, setGrowState] = useState(initialGrow);
|
|
49
|
+
useEffect(() => {
|
|
50
|
+
setGrowState(initialGrow);
|
|
51
|
+
}, [initialGrow]);
|
|
52
|
+
const [prevGrowState, setPrevGrowState] = useState(
|
|
53
|
+
initialPrevGrow
|
|
54
|
+
);
|
|
55
|
+
const [isFirstLoad, setIsFirstLoad] = useState(true);
|
|
56
|
+
useEffect(() => {
|
|
57
|
+
if (!flexContainerNodeRef.current) return;
|
|
58
|
+
setContainerRef(layoutName, containerName, flexContainerNodeRef);
|
|
59
|
+
return () => {
|
|
60
|
+
setContainerRef(layoutName, containerName, {
|
|
61
|
+
current: null
|
|
62
|
+
});
|
|
63
|
+
};
|
|
64
|
+
}, [containerName, layoutName]);
|
|
65
|
+
useEffect(() => {
|
|
66
|
+
if (typeof window == "undefined" || flexContainerNodeRef.current === null)
|
|
67
|
+
return;
|
|
68
|
+
const storedGrow = sessionStorage.getItem(containerName);
|
|
69
|
+
if (storedGrow !== null) {
|
|
70
|
+
const parsed = parseFloat(storedGrow);
|
|
71
|
+
if (!isNaN(parsed)) {
|
|
72
|
+
flexContainerNodeRef.current.style.flex = `${parsed} 1 0%`;
|
|
73
|
+
setGrowState(parsed);
|
|
74
|
+
}
|
|
75
|
+
}
|
|
76
|
+
}, [containerName]);
|
|
77
|
+
useEffect(() => {
|
|
78
|
+
if (!flexContainerNodeRef.current) return;
|
|
79
|
+
const targetNode = flexContainerNodeRef.current;
|
|
80
|
+
const observer = new MutationObserver((mutations) => {
|
|
81
|
+
for (const mutation of mutations) {
|
|
82
|
+
if (mutation.type === "attributes" && mutation.attributeName === "style" && targetNode.style.flex) {
|
|
83
|
+
const flexValue = targetNode.style.flex;
|
|
84
|
+
const parsedGrow = parseFloat(flexValue.split(" ")[0]);
|
|
85
|
+
if (!isNaN(parsedGrow)) {
|
|
86
|
+
setGrowState(parsedGrow);
|
|
87
|
+
}
|
|
88
|
+
}
|
|
89
|
+
}
|
|
90
|
+
});
|
|
91
|
+
observer.observe(targetNode, {
|
|
92
|
+
attributes: true,
|
|
93
|
+
attributeFilter: ["style"],
|
|
94
|
+
attributeOldValue: true
|
|
95
|
+
});
|
|
96
|
+
return () => {
|
|
97
|
+
observer.disconnect();
|
|
98
|
+
};
|
|
99
|
+
}, [containerName]);
|
|
100
|
+
useEffect(() => {
|
|
101
|
+
if (!flexContainerNodeRef.current || !ref || !ref.current || !size || !fitContent)
|
|
102
|
+
return;
|
|
103
|
+
requestAnimationFrame(() => {
|
|
104
|
+
if (!flexContainerNodeRef.current) return;
|
|
105
|
+
const sizeName = `${fitContent.charAt(0).toUpperCase() + fitContent.substring(1)}`;
|
|
106
|
+
const parentSize = flexContainerNodeRef.current.parentElement && flexContainerNodeRef.current.parentElement["client" + sizeName] || 0;
|
|
107
|
+
if (isFitContent) {
|
|
108
|
+
flexContainerNodeRef.current.style["max" + sizeName] = size + "px";
|
|
109
|
+
}
|
|
110
|
+
if (!isFitResize && isFirstLoad) {
|
|
111
|
+
setIsFirstLoad(false);
|
|
112
|
+
return;
|
|
113
|
+
}
|
|
114
|
+
if (getGrow(flexContainerNodeRef.current) != 0 && isFitResize) {
|
|
115
|
+
const newGrow = mathGrow(size, parentSize, containerCount);
|
|
116
|
+
setPrevGrowState(growState);
|
|
117
|
+
setGrowState(newGrow);
|
|
118
|
+
}
|
|
119
|
+
});
|
|
120
|
+
}, [size, containerCount, isFitResize, children]);
|
|
121
|
+
useEffect(() => {
|
|
122
|
+
if (!flexContainerNodeRef.current) return;
|
|
123
|
+
let notGrowList = [];
|
|
124
|
+
let containerList = [
|
|
125
|
+
...flexContainerNodeRef.current.parentElement?.children || []
|
|
126
|
+
].filter((e) => e.hasAttribute("data-container_name"));
|
|
127
|
+
let remainingGrow = containerList.reduce((t, e, i) => {
|
|
128
|
+
let item = e;
|
|
129
|
+
if (item.classList.contains(styles["flex-resize-panel"])) return t;
|
|
130
|
+
if (e.hasAttribute("data-grow") == false || e.getAttribute("data-is_resize") === "true") {
|
|
131
|
+
notGrowList.push(item);
|
|
132
|
+
return t;
|
|
133
|
+
}
|
|
134
|
+
let grow = parseFloat(item.dataset.grow || "");
|
|
135
|
+
item.style.flex = `${grow} 1 0%`;
|
|
136
|
+
t -= grow;
|
|
137
|
+
return t;
|
|
138
|
+
}, containerList.length);
|
|
139
|
+
if (notGrowList.length != 0) {
|
|
140
|
+
let resizeWeight = mathWeight(notGrowList.length, remainingGrow);
|
|
141
|
+
notGrowList.forEach((e) => {
|
|
142
|
+
e.dataset.grow = resizeWeight.toString();
|
|
143
|
+
e.style.flex = `${resizeWeight} 1 0%`;
|
|
144
|
+
});
|
|
145
|
+
}
|
|
146
|
+
}, []);
|
|
147
|
+
return /* @__PURE__ */ jsxs(Fragment, { children: [
|
|
148
|
+
/* @__PURE__ */ jsx(
|
|
149
|
+
"div",
|
|
150
|
+
{
|
|
151
|
+
id: containerName,
|
|
152
|
+
"data-container_name": containerName,
|
|
153
|
+
ref: flexContainerRef,
|
|
154
|
+
className: `${styles["flex-container"]} ${className && className !== "" ? className : ""}`,
|
|
155
|
+
...growState !== void 0 ? { ["data-grow"]: growState } : {},
|
|
156
|
+
...prevGrowState != void 0 ? { ["data-prev_grow"]: prevGrowState } : {},
|
|
157
|
+
"data-is_resize": isInitialResizable,
|
|
158
|
+
"data-is_resize_panel": isResizePanel,
|
|
159
|
+
style: growState !== void 0 && {
|
|
160
|
+
flex: `${growState} 1 0%`
|
|
161
|
+
} || {},
|
|
162
|
+
children: isFitContent && /* @__PURE__ */ jsx(
|
|
163
|
+
"div",
|
|
164
|
+
{
|
|
165
|
+
className: `${styles["flex-content-fit-wrapper"]}`,
|
|
166
|
+
ref,
|
|
167
|
+
children
|
|
168
|
+
}
|
|
169
|
+
) || children
|
|
170
|
+
}
|
|
171
|
+
),
|
|
172
|
+
isResizePanel && /* @__PURE__ */ jsx(
|
|
173
|
+
FlexLayoutResizePanel,
|
|
174
|
+
{
|
|
175
|
+
containerName,
|
|
176
|
+
layoutName,
|
|
177
|
+
direction,
|
|
178
|
+
containerCount,
|
|
179
|
+
panelMode,
|
|
180
|
+
panelClassName,
|
|
181
|
+
panelMovementMode
|
|
182
|
+
}
|
|
183
|
+
)
|
|
184
|
+
] });
|
|
185
|
+
}
|
|
186
|
+
|
|
187
|
+
export { FlexLayoutContainer as default };
|
|
188
|
+
//# sourceMappingURL=FlexLayoutContainer.js.map
|
|
189
|
+
//# sourceMappingURL=FlexLayoutContainer.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"sources":["../../../src/flex-layout/components/FlexLayoutContainer.tsx"],"names":[],"mappings":";;;;;;;;;AAUe,SAAR,mBAAA,CAAqC;AAAA,EAC3C,YAAA;AAAA,EACA,WAAA;AAAA;AAAA;AAAA;AAAA,EAIA,aAAA;AAAA,EACA,IAAA,EAAM,WAAA;AAAA,EACN,QAAA,EAAU,eAAA;AAAA,EACV,kBAAA;AAAA,EACA,aAAA;AAAA,EACA,QAAA;AAAA,EACA,SAAA;AAAA,EACA;AACD,CAAA,EAAuB;AACtB,EAAA,MAAM;AAAA,IACL,SAAA;AAAA,IACA,iBAAA;AAAA,IACA,cAAA;AAAA,IACA,UAAA;AAAA,IACA,UAAA;AAAA,IACA;AAAA,MACG,oBAAA,EAAqB;AAEzB,EAAA,MAAM,EAAE,KAAK,IAAA,EAAK;AAAA;AAAA;AAAA,IAGjB,QAAQ,UAAU;AAAA,GAAA;AAGnB,EAAA,MAAM,oBAAA,GAAuB,OAA8B,IAAI,CAAA;AAG/D,EAAA,MAAM,gBAAA,GAAmB,WAAA;AAAA,IACxB,CAAC,IAAA,KAAgC;AAChC,MAAA,oBAAA,CAAqB,OAAA,GAAU,IAAA;AAC/B,MAAA,IAAI,SAAS,IAAA,EAAM;AAClB,QAAA,eAAA,CAAgB,UAAA,EAAY,aAAA,EAAe,EAAE,OAAA,EAAS,MAAM,CAAA;AAAA,MAC7D;AAEA,IACD,CAAA;AAAA,IACA,CAAC,YAAY,aAAa;AAAA,GAC3B;AAGA,EAAA,MAAM,CAAC,SAAA,EAAW,YAAY,CAAA,GAAI,SAA6B,WAAW,CAAA;AAC1E,EAAA,SAAA,CAAU,MAAM;AACf,IAAA,YAAA,CAAa,WAAW,CAAA;AAAA,EACzB,CAAA,EAAG,CAAC,WAAW,CAAC,CAAA;AAChB,EAAA,MAAM,CAAC,aAAA,EAAe,gBAAgB,CAAA,GAAI,QAAA;AAAA,IACzC;AAAA,GACD;AACA,EAAA,MAAM,CAAC,WAAA,EAAa,cAAc,CAAA,GAAI,SAAkB,IAAI,CAAA;AAE5D,EAAA,SAAA,CAAU,MAAM;AACf,IAAA,IAAI,CAAC,qBAAqB,OAAA,EAAS;AACnC,IAAA,eAAA,CAAgB,UAAA,EAAY,eAAe,oBAAoB,CAAA;AAC/D,IAAA,OAAO,MAAM;AACZ,MAAA,eAAA,CAAgB,YAAY,aAAA,EAAe;AAAA,QAC1C,OAAA,EAAS;AAAA,OACF,CAAA;AAAA,IACT,CAAA;AAAA,EACD,CAAA,EAAG,CAAC,aAAA,EAAe,UAAU,CAAC,CAAA;AAG9B,EAAA,SAAA,CAAU,MAAM;AACf,IAAA,IACC,OAAO,MAAA,IAAU,WAAA,IACjB,oBAAA,CAAqB,OAAA,KAAY,IAAA;AAEjC,MAAA;AAED,IAAA,MAAM,UAAA,GAAa,cAAA,CAAe,OAAA,CAAQ,aAAa,CAAA;AACvD,IAAA,IAAI,eAAe,IAAA,EAAM;AACxB,MAAA,MAAM,MAAA,GAAS,WAAW,UAAU,CAAA;AACpC,MAAA,IAAI,CAAC,KAAA,CAAM,MAAM,CAAA,EAAG;AACnB,QAAA,oBAAA,CAAqB,OAAA,CAAQ,KAAA,CAAM,IAAA,GAAO,CAAA,EAAG,MAAM,CAAA,KAAA,CAAA;AACnD,QAAA,YAAA,CAAa,MAAM,CAAA;AAAA,MACpB;AAAA,IACD;AAAA,EACD,CAAA,EAAG,CAAC,aAAa,CAAC,CAAA;AAGlB,EAAA,SAAA,CAAU,MAAM;AACf,IAAA,IAAI,CAAC,qBAAqB,OAAA,EAAS;AACnC,IAAA,MAAM,aAAa,oBAAA,CAAqB,OAAA;AAExC,IAAA,MAAM,QAAA,GAAW,IAAI,gBAAA,CAAiB,CAAC,SAAA,KAAc;AACpD,MAAA,KAAA,MAAW,YAAY,SAAA,EAAW;AACjC,QAAA,IACC,QAAA,CAAS,SAAS,YAAA,IAClB,QAAA,CAAS,kBAAkB,OAAA,IAC3B,UAAA,CAAW,MAAM,IAAA,EAChB;AAED,UAAA,MAAM,SAAA,GAAY,WAAW,KAAA,CAAM,IAAA;AACnC,UAAA,MAAM,aAAa,UAAA,CAAW,SAAA,CAAU,MAAM,GAAG,CAAA,CAAE,CAAC,CAAC,CAAA;AACrD,UAAA,IAAI,CAAC,KAAA,CAAM,UAAU,CAAA,EAAG;AAOvB,YAAA,YAAA,CAAa,UAAU,CAAA;AAAA,UACxB;AAAA,QACD;AAAA,MACD;AAAA,IACD,CAAC,CAAA;AAED,IAAA,QAAA,CAAS,QAAQ,UAAA,EAAY;AAAA,MAC5B,UAAA,EAAY,IAAA;AAAA,MACZ,eAAA,EAAiB,CAAC,OAAO,CAAA;AAAA,MACzB,iBAAA,EAAmB;AAAA,KACnB,CAAA;AAED,IAAA,OAAO,MAAM;AACZ,MAAA,QAAA,CAAS,UAAA,EAAW;AAAA,IACrB,CAAA;AAAA,EACD,CAAA,EAAG,CAAC,aAAa,CAAC,CAAA;AAElB,EAAA,SAAA,CAAU,MAAM;AAEf,IAAA,IACC,CAAC,oBAAA,CAAqB,OAAA,IACtB,CAAC,GAAA,IACD,CAAC,GAAA,CAAI,OAAA,IACL,CAAC,IAAA,IACD,CAAC,UAAA;AAGD,MAAA;AACD,IAAA,qBAAA,CAAsB,MAAM;AAC3B,MAAA,IAAI,CAAC,qBAAqB,OAAA,EAAS;AACnC,MAAA,MAAM,QAAA,GAAW,CAAA,EAAG,UAAA,CAAW,MAAA,CAAO,CAAC,CAAA,CAAE,WAAA,EAAY,GAAI,UAAA,CAAW,SAAA,CAAU,CAAC,CAAC,CAAA,CAAA;AAChF,MAAA,MAAM,UAAA,GACJ,qBAAqB,OAAA,CAAQ,aAAA,IAC7B,qBAAqB,OAAA,CAAQ,aAAA,CAC3B,QAAA,GAAW,QACb,CAAA,IACD,CAAA;AACD,MAAA,IAAI,YAAA,EAAc;AACjB,QAAA,oBAAA,CAAqB,OAAA,CAAQ,KAAA,CAC3B,KAAA,GAAQ,QACV,IAAI,IAAA,GAAO,IAAA;AAAA,MACZ;AACA,MAAA,IAAI,CAAC,eAAe,WAAA,EAAa;AAChC,QAAA,cAAA,CAAe,KAAK,CAAA;AACpB,QAAA;AAAA,MACD;AAEA,MAAA,IAAI,OAAA,CAAQ,oBAAA,CAAqB,OAAO,CAAA,IAAK,KAAK,WAAA,EAAa;AAC9D,QAAA,MAAM,OAAA,GAAU,QAAA,CAAS,IAAA,EAAM,UAAA,EAAY,cAAc,CAAA;AACzD,QAAA,gBAAA,CAAiB,SAAS,CAAA;AAC1B,QAAA,YAAA,CAAa,OAAO,CAAA;AAAA,MAKrB;AAAA,IACD,CAAC,CAAA;AAAA,EACF,GAAG,CAAC,IAAA,EAAM,cAAA,EAAgB,WAAA,EAAa,QAAQ,CAAC,CAAA;AAEhD,EAAA,SAAA,CAAU,MAAM;AACf,IAAA,IAAI,CAAC,qBAAqB,OAAA,EAAS;AAEnC,IAAA,IAAI,cAAkC,EAAC;AACvC,IAAA,IAAI,aAAA,GAAgB;AAAA,MACnB,GAAI,oBAAA,CAAqB,OAAA,CAAQ,aAAA,EAAe,YAAY;AAAC,MAC5D,MAAA,CAAO,CAAC,MAAM,CAAA,CAAE,YAAA,CAAa,qBAAqB,CAAC,CAAA;AACrD,IAAA,IAAI,gBAAgB,aAAA,CAAc,MAAA,CAAO,CAAC,CAAA,EAAG,GAAG,CAAA,KAAM;AACrD,MAAA,IAAI,IAAA,GAAO,CAAA;AAEX,MAAA,IAAI,KAAK,SAAA,CAAU,QAAA,CAAS,OAAO,mBAAmB,CAAC,GAAG,OAAO,CAAA;AAEjE,MAAA,IACC,CAAA,CAAE,aAAa,WAAW,CAAA,IAAK,SAC/B,CAAA,CAAE,YAAA,CAAa,gBAAgB,CAAA,KAAM,MAAA,EACpC;AACD,QAAA,WAAA,CAAY,KAAK,IAAI,CAAA;AACrB,QAAA,OAAO,CAAA;AAAA,MACR;AACA,MAAA,IAAI,IAAA,GAAO,UAAA,CAAW,IAAA,CAAK,OAAA,CAAQ,QAAQ,EAAE,CAAA;AAC7C,MAAA,IAAA,CAAK,KAAA,CAAM,IAAA,GAAO,CAAA,EAAG,IAAI,CAAA,KAAA,CAAA;AACzB,MAAA,CAAA,IAAK,IAAA;AACL,MAAA,OAAO,CAAA;AAAA,IACR,CAAA,EAAG,cAAc,MAAM,CAAA;AACvB,IAAA,IAAI,WAAA,CAAY,UAAU,CAAA,EAAG;AAC5B,MAAA,IAAI,YAAA,GAAe,UAAA,CAAW,WAAA,CAAY,MAAA,EAAQ,aAAa,CAAA;AAC/D,MAAA,WAAA,CAAY,OAAA,CAAQ,CAAC,CAAA,KAAM;AAC1B,QAAA,CAAA,CAAE,OAAA,CAAQ,IAAA,GAAO,YAAA,CAAa,QAAA,EAAS;AACvC,QAAA,CAAA,CAAE,KAAA,CAAM,IAAA,GAAO,CAAA,EAAG,YAAY,CAAA,KAAA,CAAA;AAAA,MAC/B,CAAC,CAAA;AAAA,IACF;AAAA,EACD,CAAA,EAAG,EAAE,CAAA;AACL,EAAA,uBACC,IAAA,CAAA,QAAA,EAAA,EACC,QAAA,EAAA;AAAA,oBAAA,GAAA;AAAA,MAAC,KAAA;AAAA,MAAA;AAAA,QACA,EAAA,EAAI,aAAA;AAAA,QACJ,qBAAA,EAAqB,aAAA;AAAA,QACrB,GAAA,EAAK,gBAAA;AAAA,QACL,SAAA,EAAW,CAAA,EAAG,MAAA,CAAO,gBAAgB,CAAC,IAAI,SAAA,IAAa,SAAA,KAAc,EAAA,GAAK,SAAA,GAAY,EAAE,CAAA,CAAA;AAAA,QACvF,GAAI,cAAc,MAAA,GAChB,EAAE,CAAC,WAAW,GAAG,SAAA,EAAU,GAC3B,EAAC;AAAA,QACH,GAAI,iBAAiB,MAAA,GACnB,EAAE,CAAC,gBAAgB,GAAG,aAAA,EAAc,GACpC,EAAC;AAAA,QACJ,gBAAA,EAAgB,kBAAA;AAAA,QAChB,sBAAA,EAAsB,aAAA;AAAA,QACtB,KAAA,EACE,cAAc,MAAA,IAAa;AAAA,UAC3B,IAAA,EAAM,GAAG,SAAS,CAAA,KAAA;AAAA,aAEnB,EAAC;AAAA,QAGA,QAAA,EAAA,YAAA,oBACD,GAAA;AAAA,UAAC,KAAA;AAAA,UAAA;AAAA,YACA,SAAA,EAAW,CAAA,EAAG,MAAA,CAAO,0BAA0B,CAAC,CAAA,CAAA;AAAA,YAChD,GAAA;AAAA,YAEC;AAAA;AAAA,SACF,IAEA;AAAA;AAAA,KACF;AAAA,IACC,aAAA,oBACA,GAAA;AAAA,MAAC,qBAAA;AAAA,MAAA;AAAA,QACA,aAAA;AAAA,QACA,UAAA;AAAA,QACA,SAAA;AAAA,QACA,cAAA;AAAA,QACA,SAAA;AAAA,QACA,cAAA;AAAA,QACA;AAAA;AAAA;AACD,GAAA,EAEF,CAAA;AAEF","file":"FlexLayoutContainer.js","sourcesContent":["\"use client\";\r\nimport { useCallback, useEffect, useRef, useState } from \"react\";\r\nimport { useSize } from \"../hooks/useSizes\";\r\nimport { useFlexLayoutContext } from \"../providers/FlexLayoutContext\";\r\nimport { setContainerRef } from \"../store/FlexLayoutContainerStore\";\r\nimport styles from \"../styles/FlexLayout.module.css\";\r\nimport { FlexContainerProps } from \"../types/FlexLayoutTypes\";\r\nimport { getGrow, mathGrow, mathWeight } from \"../utils/FlexLayoutUtils\";\r\nimport FlexLayoutResizePanel from \"./FlexLayoutResizePanel\";\r\n\r\nexport default function FlexLayoutContainer({\r\n\tisFitContent,\r\n\tisFitResize,\r\n\t// fitContent,\r\n\t// containerCount,\r\n\t// layoutName,\r\n\tcontainerName,\r\n\tgrow: initialGrow,\r\n\tprevGrow: initialPrevGrow,\r\n\tisInitialResizable,\r\n\tisResizePanel,\r\n\tchildren,\r\n\tclassName,\r\n\tpanelMode,\r\n}: FlexContainerProps) {\r\n\tconst {\r\n\t\tdirection,\r\n\t\tpanelMovementMode,\r\n\t\tpanelClassName,\r\n\t\tlayoutName,\r\n\t\tfitContent,\r\n\t\tcontainerCount,\r\n\t} = useFlexLayoutContext();\r\n\r\n\tconst { ref, size } =\r\n\t\t// isFitContent && fitContent\r\n\t\t//?\r\n\t\tuseSize(fitContent);\r\n\t//: { ref: null, size: null };\r\n\t// 콜백 ref에서 접근하기 위한 내부 ref 생성\r\n\tconst flexContainerNodeRef = useRef<HTMLDivElement | null>(null);\r\n\r\n\t// 콜백 ref 정의\r\n\tconst flexContainerRef = useCallback(\r\n\t\t(node: HTMLDivElement | null) => {\r\n\t\t\tflexContainerNodeRef.current = node;\r\n\t\t\tif (node !== null) {\r\n\t\t\t\tsetContainerRef(layoutName, containerName, { current: node });\r\n\t\t\t} else {\r\n\t\t\t\t// 컴포넌트가 언마운트될 때 필요한 작업이 있다면 여기에 추가\r\n\t\t\t}\r\n\t\t},\r\n\t\t[layoutName, containerName],\r\n\t);\r\n\r\n\t// 초기 SSR 시점에는 sessionStorage를 사용할 수 없으므로 일단 initialGrow를 사용\r\n\tconst [growState, setGrowState] = useState<number | undefined>(initialGrow);\r\n\tuseEffect(() => {\r\n\t\tsetGrowState(initialGrow);\r\n\t}, [initialGrow]);\r\n\tconst [prevGrowState, setPrevGrowState] = useState<number | undefined>(\r\n\t\tinitialPrevGrow,\r\n\t);\r\n\tconst [isFirstLoad, setIsFirstLoad] = useState<boolean>(true);\r\n\r\n\tuseEffect(() => {\r\n\t\tif (!flexContainerNodeRef.current) return;\r\n\t\tsetContainerRef(layoutName, containerName, flexContainerNodeRef);\r\n\t\treturn () => {\r\n\t\t\tsetContainerRef(layoutName, containerName, {\r\n\t\t\t\tcurrent: null,\r\n\t\t\t} as any);\r\n\t\t};\r\n\t}, [containerName, layoutName]);\r\n\r\n\t// 클라이언트 마운트 후 sessionStorage에서 grow값을 가져와 state 업데이트 (SSR/Hydration 안정화)\r\n\tuseEffect(() => {\r\n\t\tif (\r\n\t\t\ttypeof window == \"undefined\" ||\r\n\t\t\tflexContainerNodeRef.current === null\r\n\t\t)\r\n\t\t\treturn;\r\n\r\n\t\tconst storedGrow = sessionStorage.getItem(containerName);\r\n\t\tif (storedGrow !== null) {\r\n\t\t\tconst parsed = parseFloat(storedGrow);\r\n\t\t\tif (!isNaN(parsed)) {\r\n\t\t\t\tflexContainerNodeRef.current.style.flex = `${parsed} 1 0%`;\r\n\t\t\t\tsetGrowState(parsed);\r\n\t\t\t}\r\n\t\t}\r\n\t}, [containerName]);\r\n\r\n\t// 스타일 변경 감지를 위한 MutationObserver\r\n\tuseEffect(() => {\r\n\t\tif (!flexContainerNodeRef.current) return;\r\n\t\tconst targetNode = flexContainerNodeRef.current;\r\n\r\n\t\tconst observer = new MutationObserver((mutations) => {\r\n\t\t\tfor (const mutation of mutations) {\r\n\t\t\t\tif (\r\n\t\t\t\t\tmutation.type === \"attributes\" &&\r\n\t\t\t\t\tmutation.attributeName === \"style\" &&\r\n\t\t\t\t\ttargetNode.style.flex\r\n\t\t\t\t) {\r\n\t\t\t\t\t// style.flex = \"X 1 0%\" 형태이므로 X를 파싱\r\n\t\t\t\t\tconst flexValue = targetNode.style.flex;\r\n\t\t\t\t\tconst parsedGrow = parseFloat(flexValue.split(\" \")[0]);\r\n\t\t\t\t\tif (!isNaN(parsedGrow)) {\r\n\t\t\t\t\t\t// sessionStorage에 저장\r\n\t\t\t\t\t\t// sessionStorage.setItem(\r\n\t\t\t\t\t\t// containerName,\r\n\t\t\t\t\t\t// parsedGrow.toString()\r\n\t\t\t\t\t\t// );\r\n\t\t\t\t\t\t// state 업데이트\r\n\t\t\t\t\t\tsetGrowState(parsedGrow);\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\tobserver.observe(targetNode, {\r\n\t\t\tattributes: true,\r\n\t\t\tattributeFilter: [\"style\"],\r\n\t\t\tattributeOldValue: true,\r\n\t\t});\r\n\r\n\t\treturn () => {\r\n\t\t\tobserver.disconnect();\r\n\t\t};\r\n\t}, [containerName]);\r\n\r\n\tuseEffect(() => {\r\n\t\t// 컴포넌트 크기 및 설정값에 따른 사이즈 재조정\r\n\t\tif (\r\n\t\t\t!flexContainerNodeRef.current ||\r\n\t\t\t!ref ||\r\n\t\t\t!ref.current ||\r\n\t\t\t!size ||\r\n\t\t\t!fitContent\r\n\t\t\t//||getGrow(flexContainerRef.current) == 0\r\n\t\t)\r\n\t\t\treturn;\r\n\t\trequestAnimationFrame(() => {\r\n\t\t\tif (!flexContainerNodeRef.current) return;\r\n\t\t\tconst sizeName = `${fitContent.charAt(0).toUpperCase() + fitContent.substring(1)}`;\r\n\t\t\tconst parentSize =\r\n\t\t\t\t(flexContainerNodeRef.current.parentElement &&\r\n\t\t\t\t\tflexContainerNodeRef.current.parentElement[\r\n\t\t\t\t\t\t(\"client\" + sizeName) as \"clientWidth\" | \"clientHeight\"\r\n\t\t\t\t\t]) ||\r\n\t\t\t\t0;\r\n\t\t\tif (isFitContent) {\r\n\t\t\t\tflexContainerNodeRef.current.style[\r\n\t\t\t\t\t(\"max\" + sizeName) as \"maxWidth\" | \"maxHeight\"\r\n\t\t\t\t] = size + \"px\";\r\n\t\t\t}\r\n\t\t\tif (!isFitResize && isFirstLoad) {\r\n\t\t\t\tsetIsFirstLoad(false);\r\n\t\t\t\treturn;\r\n\t\t\t}\r\n\r\n\t\t\tif (getGrow(flexContainerNodeRef.current) != 0 && isFitResize) {\r\n\t\t\t\tconst newGrow = mathGrow(size, parentSize, containerCount);\r\n\t\t\t\tsetPrevGrowState(growState);\r\n\t\t\t\tsetGrowState(newGrow);\r\n\t\t\t\t// flexContainerNodeRef.current.dataset.prev_grow =\r\n\t\t\t\t// flexContainerNodeRef.current.dataset.grow;\r\n\t\t\t\t// flexContainerNodeRef.current.dataset.grow = newGrow.toString();\r\n\t\t\t\t// flexContainerNodeRef.current.style.flex = `${newGrow} 1 0%`;\r\n\t\t\t}\r\n\t\t});\r\n\t}, [size, containerCount, isFitResize, children]);\r\n\r\n\tuseEffect(() => {\r\n\t\tif (!flexContainerNodeRef.current) return;\r\n\r\n\t\tlet notGrowList: Array<HTMLElement> = [];\r\n\t\tlet containerList = [\r\n\t\t\t...(flexContainerNodeRef.current.parentElement?.children || []),\r\n\t\t].filter((e) => e.hasAttribute(\"data-container_name\"));\r\n\t\tlet remainingGrow = containerList.reduce((t, e, i) => {\r\n\t\t\tlet item = e as HTMLElement;\r\n\r\n\t\t\tif (item.classList.contains(styles[\"flex-resize-panel\"])) return t;\r\n\r\n\t\t\tif (\r\n\t\t\t\te.hasAttribute(\"data-grow\") == false ||\r\n\t\t\t\te.getAttribute(\"data-is_resize\") === \"true\"\r\n\t\t\t) {\r\n\t\t\t\tnotGrowList.push(item);\r\n\t\t\t\treturn t;\r\n\t\t\t}\r\n\t\t\tlet grow = parseFloat(item.dataset.grow || \"\");\r\n\t\t\titem.style.flex = `${grow} 1 0%`;\r\n\t\t\tt -= grow;\r\n\t\t\treturn t;\r\n\t\t}, containerList.length);\r\n\t\tif (notGrowList.length != 0) {\r\n\t\t\tlet resizeWeight = mathWeight(notGrowList.length, remainingGrow);\r\n\t\t\tnotGrowList.forEach((e) => {\r\n\t\t\t\te.dataset.grow = resizeWeight.toString();\r\n\t\t\t\te.style.flex = `${resizeWeight} 1 0%`;\r\n\t\t\t});\r\n\t\t}\r\n\t}, []);\r\n\treturn (\r\n\t\t<>\r\n\t\t\t<div\r\n\t\t\t\tid={containerName}\r\n\t\t\t\tdata-container_name={containerName}\r\n\t\t\t\tref={flexContainerRef}\r\n\t\t\t\tclassName={`${styles[\"flex-container\"]} ${className && className !== \"\" ? className : \"\"}`}\r\n\t\t\t\t{...(growState !== undefined\r\n\t\t\t\t\t? { [\"data-grow\"]: growState }\r\n\t\t\t\t\t: {})}\r\n\t\t\t\t{...(prevGrowState != undefined\r\n\t\t\t\t\t? { [\"data-prev_grow\"]: prevGrowState }\r\n\t\t\t\t\t: {})}\r\n\t\t\t\tdata-is_resize={isInitialResizable}\r\n\t\t\t\tdata-is_resize_panel={isResizePanel}\r\n\t\t\t\tstyle={\r\n\t\t\t\t\t(growState !== undefined && {\r\n\t\t\t\t\t\tflex: `${growState} 1 0%`,\r\n\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\t{(isFitContent && (\r\n\t\t\t\t\t<div\r\n\t\t\t\t\t\tclassName={`${styles[\"flex-content-fit-wrapper\"]}`}\r\n\t\t\t\t\t\tref={ref}\r\n\t\t\t\t\t>\r\n\t\t\t\t\t\t{children}\r\n\t\t\t\t\t</div>\r\n\t\t\t\t)) ||\r\n\t\t\t\t\tchildren}\r\n\t\t\t</div>\r\n\t\t\t{isResizePanel && (\r\n\t\t\t\t<FlexLayoutResizePanel\r\n\t\t\t\t\tcontainerName={containerName}\r\n\t\t\t\t\tlayoutName={layoutName}\r\n\t\t\t\t\tdirection={direction}\r\n\t\t\t\t\tcontainerCount={containerCount}\r\n\t\t\t\t\tpanelMode={panelMode}\r\n\t\t\t\t\tpanelClassName={panelClassName}\r\n\t\t\t\t\tpanelMovementMode={panelMovementMode}\r\n\t\t\t\t/>\r\n\t\t\t)}\r\n\t\t</>\r\n\t);\r\n}\r\n"]}
|