@byeolnaerim/flex-layout 0.0.7 → 0.0.9
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 +62 -28
- package/dist/flex-layout/components/FlexLayout.cjs.map +1 -1
- package/dist/flex-layout/components/FlexLayout.js +26 -11
- package/dist/flex-layout/components/FlexLayout.js.map +1 -1
- package/dist/flex-layout/components/FlexLayoutContainer.cjs +121 -55
- package/dist/flex-layout/components/FlexLayoutContainer.cjs.map +1 -1
- package/dist/flex-layout/components/FlexLayoutContainer.js +68 -25
- package/dist/flex-layout/components/FlexLayoutContainer.js.map +1 -1
- package/dist/flex-layout/components/FlexLayoutIFramePane.cjs +68 -0
- package/dist/flex-layout/components/FlexLayoutIFramePane.cjs.map +1 -0
- package/dist/flex-layout/components/FlexLayoutIFramePane.d.ts +4 -0
- package/dist/flex-layout/components/FlexLayoutIFramePane.js +44 -0
- package/dist/flex-layout/components/FlexLayoutIFramePane.js.map +1 -0
- package/dist/flex-layout/components/FlexLayoutResizePanel.cjs +111 -46
- package/dist/flex-layout/components/FlexLayoutResizePanel.cjs.map +1 -1
- package/dist/flex-layout/components/FlexLayoutResizePanel.d.ts +1 -1
- package/dist/flex-layout/components/FlexLayoutResizePanel.js +68 -27
- package/dist/flex-layout/components/FlexLayoutResizePanel.js.map +1 -1
- package/dist/flex-layout/components/FlexLayoutSplitScreen.cjs +184 -143
- package/dist/flex-layout/components/FlexLayoutSplitScreen.cjs.map +1 -1
- package/dist/flex-layout/components/FlexLayoutSplitScreen.js +71 -32
- package/dist/flex-layout/components/FlexLayoutSplitScreen.js.map +1 -1
- package/dist/flex-layout/components/FlexLayoutSplitScreenDragBox.cjs +253 -60
- package/dist/flex-layout/components/FlexLayoutSplitScreenDragBox.cjs.map +1 -1
- package/dist/flex-layout/components/FlexLayoutSplitScreenDragBox.d.ts +1 -1
- package/dist/flex-layout/components/FlexLayoutSplitScreenDragBox.js +215 -39
- package/dist/flex-layout/components/FlexLayoutSplitScreenDragBox.js.map +1 -1
- package/dist/flex-layout/components/FlexLayoutSplitScreenDragBoxContainer.cjs +40 -17
- package/dist/flex-layout/components/FlexLayoutSplitScreenDragBoxContainer.cjs.map +1 -1
- package/dist/flex-layout/components/FlexLayoutSplitScreenDragBoxContainer.js +7 -7
- package/dist/flex-layout/components/FlexLayoutSplitScreenDragBoxContainer.js.map +1 -1
- package/dist/flex-layout/components/FlexLayoutSplitScreenDragBoxItem.cjs +44 -21
- package/dist/flex-layout/components/FlexLayoutSplitScreenDragBoxItem.cjs.map +1 -1
- package/dist/flex-layout/components/FlexLayoutSplitScreenDragBoxItem.js +7 -8
- package/dist/flex-layout/components/FlexLayoutSplitScreenDragBoxItem.js.map +1 -1
- package/dist/flex-layout/components/FlexLayoutSplitScreenDragBoxTitleMore.cjs +40 -17
- package/dist/flex-layout/components/FlexLayoutSplitScreenDragBoxTitleMore.cjs.map +1 -1
- package/dist/flex-layout/components/FlexLayoutSplitScreenDragBoxTitleMore.js +5 -6
- package/dist/flex-layout/components/FlexLayoutSplitScreenDragBoxTitleMore.js.map +1 -1
- package/dist/flex-layout/components/FlexLayoutSplitScreenScrollBox.cjs +53 -29
- package/dist/flex-layout/components/FlexLayoutSplitScreenScrollBox.cjs.map +1 -1
- package/dist/flex-layout/components/FlexLayoutSplitScreenScrollBox.js +14 -10
- package/dist/flex-layout/components/FlexLayoutSplitScreenScrollBox.js.map +1 -1
- package/dist/flex-layout/components/FlexLayoutStickyBox.cjs +46 -27
- package/dist/flex-layout/components/FlexLayoutStickyBox.cjs.map +1 -1
- package/dist/flex-layout/components/FlexLayoutStickyBox.d.ts +1 -0
- package/dist/flex-layout/components/FlexLayoutStickyBox.js +13 -8
- package/dist/flex-layout/components/FlexLayoutStickyBox.js.map +1 -1
- package/dist/flex-layout/components/index.cjs +54 -49
- package/dist/flex-layout/components/index.cjs.map +1 -1
- package/dist/flex-layout/components/index.js +16 -8
- package/dist/flex-layout/components/index.js.map +1 -1
- package/dist/flex-layout/hooks/index.cjs +23 -19
- package/dist/flex-layout/hooks/index.cjs.map +1 -1
- package/dist/flex-layout/hooks/index.js +2 -3
- package/dist/flex-layout/hooks/index.js.map +1 -1
- package/dist/flex-layout/hooks/useDrag.cjs +136 -79
- package/dist/flex-layout/hooks/useDrag.cjs.map +1 -1
- package/dist/flex-layout/hooks/useDrag.d.ts +5 -0
- package/dist/flex-layout/hooks/useDrag.js +86 -47
- package/dist/flex-layout/hooks/useDrag.js.map +1 -1
- package/dist/flex-layout/hooks/useFlexLayoutSplitScreen.cjs +40 -19
- package/dist/flex-layout/hooks/useFlexLayoutSplitScreen.cjs.map +1 -1
- package/dist/flex-layout/hooks/useFlexLayoutSplitScreen.js +9 -7
- package/dist/flex-layout/hooks/useFlexLayoutSplitScreen.js.map +1 -1
- package/dist/flex-layout/hooks/useListPaging.cjs +68 -35
- package/dist/flex-layout/hooks/useListPaging.cjs.map +1 -1
- package/dist/flex-layout/hooks/useListPaging.js +34 -18
- package/dist/flex-layout/hooks/useListPaging.js.map +1 -1
- package/dist/flex-layout/hooks/useSizes.cjs +45 -23
- package/dist/flex-layout/hooks/useSizes.cjs.map +1 -1
- package/dist/flex-layout/hooks/useSizes.js +6 -6
- package/dist/flex-layout/hooks/useSizes.js.map +1 -1
- package/dist/flex-layout/index.cjs +29 -40
- package/dist/flex-layout/index.cjs.map +1 -1
- package/dist/flex-layout/index.js +5 -6
- package/dist/flex-layout/index.js.map +1 -1
- package/dist/flex-layout/providers/FlexLayoutContext.cjs +35 -12
- package/dist/flex-layout/providers/FlexLayoutContext.cjs.map +1 -1
- package/dist/flex-layout/providers/FlexLayoutContext.js +7 -6
- package/dist/flex-layout/providers/FlexLayoutContext.js.map +1 -1
- package/dist/flex-layout/providers/FlexLayoutHooks.cjs +82 -53
- package/dist/flex-layout/providers/FlexLayoutHooks.cjs.map +1 -1
- package/dist/flex-layout/providers/FlexLayoutHooks.js +33 -8
- package/dist/flex-layout/providers/FlexLayoutHooks.js.map +1 -1
- package/dist/flex-layout/providers/index.cjs +21 -12
- package/dist/flex-layout/providers/index.cjs.map +1 -1
- package/dist/flex-layout/providers/index.js +1 -2
- package/dist/flex-layout/providers/index.js.map +1 -1
- package/dist/flex-layout/store/FlexLayoutContainerStore.cjs +130 -76
- package/dist/flex-layout/store/FlexLayoutContainerStore.cjs.map +1 -1
- package/dist/flex-layout/store/FlexLayoutContainerStore.d.ts +1 -0
- package/dist/flex-layout/store/FlexLayoutContainerStore.js +63 -38
- package/dist/flex-layout/store/FlexLayoutContainerStore.js.map +1 -1
- package/dist/flex-layout/store/index.cjs +21 -12
- package/dist/flex-layout/store/index.cjs.map +1 -1
- package/dist/flex-layout/store/index.js +1 -2
- package/dist/flex-layout/store/index.js.map +1 -1
- package/dist/flex-layout/types/FlexDirectionTypes.cjs +16 -3
- package/dist/flex-layout/types/FlexDirectionTypes.cjs.map +1 -1
- package/dist/flex-layout/types/FlexDirectionTypes.js +0 -2
- package/dist/flex-layout/types/FlexDirectionTypes.js.map +1 -1
- package/dist/flex-layout/types/FlexLayoutTypes.cjs +16 -3
- package/dist/flex-layout/types/FlexLayoutTypes.cjs.map +1 -1
- package/dist/flex-layout/types/FlexLayoutTypes.d.ts +1 -3
- package/dist/flex-layout/types/FlexLayoutTypes.js +0 -2
- package/dist/flex-layout/types/FlexLayoutTypes.js.map +1 -1
- package/dist/flex-layout/utils/FlexLayoutUtils.cjs +57 -20
- package/dist/flex-layout/utils/FlexLayoutUtils.cjs.map +1 -1
- package/dist/flex-layout/utils/FlexLayoutUtils.d.ts +4 -4
- package/dist/flex-layout/utils/FlexLayoutUtils.js +23 -8
- package/dist/flex-layout/utils/FlexLayoutUtils.js.map +1 -1
- package/dist/flex-layout/utils/index.cjs +21 -12
- package/dist/flex-layout/utils/index.cjs.map +1 -1
- package/dist/flex-layout/utils/index.js +1 -2
- package/dist/flex-layout/utils/index.js.map +1 -1
- package/dist/index.cjs +21 -12
- package/dist/index.cjs.map +1 -1
- package/dist/index.js +1 -2
- package/dist/index.js.map +1 -1
- package/dist/metafile-cjs.json +1 -0
- package/dist/metafile-esm.json +1 -0
- package/dist/types/css.d.cjs +1 -3
- package/dist/types/css.d.cjs.map +1 -1
- package/dist/types/css.d.js +0 -2
- package/dist/types/css.d.js.map +1 -1
- package/package.json +5 -1
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"sources":["../../../src/flex-layout/components/FlexLayoutStickyBox.tsx"],"names":["useRef","useState","useEffect","jsx"],"mappings":";;;;;AAiCA,SAAS,KAAA,CAAM,CAAA,EAAW,GAAA,EAAa,GAAA,EAAa;AACnD,EAAA,OAAO,KAAK,GAAA,CAAI,GAAA,EAAK,KAAK,GAAA,CAAI,GAAA,EAAK,CAAC,CAAC,CAAA;AACtC;AAEA,SAAS,qBAAA,GAAwC;AAChD,EAAA,IAAI,OAAO,QAAA,KAAa,WAAA,EAAa,OAAO,IAAA;AAE5C,EAAA,IAAI,KAAqB,QAAA,CAAS,IAAA;AAClC,EAAA,OAAO,MAAM,EAAA,KAAO,QAAA,CAAS,eAAA,IAAmB,EAAA,KAAO,SAAS,IAAA,EAAM;AACrE,IAAA,MAAM,KAAA,GAAQ,iBAAiB,EAAE,CAAA;AACjC,IAAA,MAAM,KAAK,KAAA,CAAM,SAAA;AACjB,IAAA,MAAM,KAAK,KAAA,CAAM,SAAA;AACjB,IAAA,MAAM,aACL,EAAA,KAAO,MAAA,IACP,OAAO,QAAA,IACP,EAAA,KAAO,UACP,EAAA,KAAO,QAAA;AACR,IAAA,IAAI,YAAY,OAAO,EAAA;AACvB,IAAA,EAAA,GAAK,EAAA,CAAG,aAAA;AAAA,EACT;AACA,EAAA,OAAO,IAAA;AACR;AAEA,SAAS,iBAAiB,IAAA,EAA+B;AACxD,EAAA,IAAI,OAAO,MAAA,IAAU,WAAA,EAAa,OAAO,IAAA;AACzC,EAAA,IAAI,CAAC,IAAA,EAAM;AACV,IAAA,OAAO,QAAA,CAAS,eAAA,CAAgB,YAAA,GAAe,MAAA,CAAO,WAAA,GAAc,CAAA;AAAA,EACrE;AACA,EAAA,MAAM,EAAA,GAAK,IAAA;AACX,EAAA,OAAO,EAAA,CAAG,YAAA,GAAe,EAAA,CAAG,YAAA,GAAe,CAAA;AAC5C;AAEA,MAAM,MAAM,OAAO,MAAA,IAAU,WAAA,GAAc,MAAA,CAAO,oBAAoB,CAAA,GAAI,CAAA;AAC1E,SAAS,sBAAsB,CAAA,EAAW;AACzC,EAAA,OAAO,IAAA,CAAK,KAAA,CAAM,CAAA,GAAI,GAAG,CAAA,GAAI,GAAA;AAC9B;AAcA,MAAM,sBAAoD,CAAC;AAAA,EAC1D,IAAA,GAAO,MAAA;AAAA,EACP,MAAA,GAAS,EAAA;AAAA,EACT,UAAA,GAAa,IAAA;AAAA,EACb,KAAA,GAAQ,KAAA;AAAA,EACR,QAAA;AAAA,EACA,KAAA;AAAA,EACA,SAAA;AAAA,EACA,oBAAoB,MAAM;AAAA,EAAC,CAAA;AAAA,EAC3B,GAAG;AACJ,CAAA,KAAM;AACL,EAAA,MAAM,SAAA,GAAYA,aAAO,MAAM,CAAA;AAC/B,EAAA,MAAM,OAAA,GAAUA,aAAuB,IAAI,CAAA;AAC3C,EAAA,MAAM,UAAA,GAAaA,aAAuB,IAAI,CAAA;AAC9C,EAAA,MAAM,WAAA,GAAcA,aAAO,KAAK,CAAA;AAChC,EAAA,MAAM,aAAA,GAAgBA,aAAO,CAAC,CAAA;AAC9B,EAAA,MAAM,CAAC,YAAA,EAAc,eAAe,CAAA,GAAIC,eAAe,KAAK,CAAA;AAC5D,EAAA,MAAM,KAAA,GAAQD,aAAsB,IAAI,CAAA;AAGxC,EAAA,MAAM,CAAC,mBAAA,EAAqB,sBAAsB,CAAA,GACjDC,cAAA,CAAwB,EAAE,CAAA;AAC3B,EAAAC,eAAA,CAAU,MAAM;AAKf,IAAA,sBAAA,CAAuB;AAAA,MACtB,UAAA,EAAY,WAAA;AAAA,MACZ,UAAA,EAAY;AAAA,KACZ,CAAA;AAAA,EAEF,CAAA,EAAG,EAAE,CAAA;AAEL,EAAAA,eAAA,CAAU,MAAM;AACf,IAAA,SAAA,CAAU,OAAA,GAAU,MAAA;AACpB,IAAA,cAAA,EAAe;AAAA,EAChB,CAAA,EAAG,CAAC,MAAM,CAAC,CAAA;AACX,EAAA,MAAM,CAAC,MAAA,EAAQ,SAAS,CAAA,GAAID,eAAyB,IAAI,CAAA;AACzD,EAAAC,eAAA,CAAU,MAAM;AAEf,IAAA,MAAM,IAAA,GAAO,cAAc,qBAAA,EAAsB;AACjD,IAAA,eAAA;AAAA,MACC,SAAS,MAAA,GAAU,gBAAA,CAAiB,IAAI,CAAA,GAAI,QAAQ,MAAA,GAAU;AAAA,KAC/D;AAEA,IAAA,SAAA,CAAU,IAAI,CAAA;AAAA,EACf,CAAA,EAAG,CAAC,IAAA,EAAM,UAAU,CAAC,CAAA;AACrB,EAAAA,eAAA,CAAU,MAAM;AACf,IAAA,IAAI,SAAS,MAAA,EAAQ;AACpB,MAAA,eAAA,CAAgB,IAAI,CAAA;AACpB,MAAA;AAAA,IACD;AACA,IAAA,MAAM,QAAA,GAAW,iBAAiB,MAAM,CAAA;AACxC,IAAA,eAAA,CAAgB,QAAA,GAAW,QAAQ,MAAM,CAAA;AAAA,EAC1C,CAAA,EAAG,CAAC,IAAA,EAAM,MAAM,CAAC,CAAA;AAEjB,EAAAA,eAAA,CAAU,MAAM;AAAA,EAAC,CAAA,EAAG,EAAE,CAAA;AAEtB,EAAA,MAAM,iBAAiB,MAAM;AAC5B,IAAA,IAAI,KAAA,CAAM,WAAW,IAAA,EAAM;AAC3B,IAAA,KAAA,CAAM,OAAA,GAAU,sBAAsB,MAAM;AAC3C,MAAA,KAAA,CAAM,OAAA,GAAU,IAAA;AAChB,MAAA,QAAA,EAAS;AAAA,IACV,CAAC,CAAA;AAAA,EACF,CAAA;AAEA,EAAA,MAAM,WAAW,MAAM;AACtB,IAAA,IAAI,YAAY,OAAA,EAAS;AACzB,IAAA,WAAA,CAAY,OAAA,GAAU,IAAA;AAEtB,IAAA,MAAM,SAAS,OAAA,CAAQ,OAAA;AACvB,IAAA,MAAM,YAAY,UAAA,CAAW,OAAA;AAC7B,IAAA,IAAI,CAAC,MAAA,IAAU,CAAC,SAAA,EAAW;AAC1B,MAAA,WAAA,CAAY,OAAA,GAAU,KAAA;AACtB,MAAA;AAAA,IACD;AAEA,IAAA,MAAM,WAAW,MAAA,CAAO,aAAA;AACxB,IAAA,IAAI,CAAC,QAAA,EAAU;AACd,MAAA,WAAA,CAAY,OAAA,GAAU,KAAA;AACtB,MAAA;AAAA,IACD;AAEA,IAAA,MAAM,UAAA,GACL,MAAA,IAAU,uBAAA,IAA2B,MAAA,GACjC,OAAmB,qBAAA,EAAsB,GAC1C,IAAI,OAAA,CAAQ,CAAA,EAAG,CAAA,EAAG,MAAA,CAAO,UAAA,EAAY,OAAO,WAAW,CAAA;AAE3D,IAAA,MAAM,UAAA,GAAa,SAAS,qBAAA,EAAsB;AAClD,IAAA,MAAM,WAAA,GAAc,UAAU,qBAAA,EAAsB;AAEpD,IAAA,IAAI,SAAA,GAAY,CAAA;AAEhB,IAAA,IAAI,YAAA,KAAiB,KAAA,IAAS,YAAA,KAAiB,QAAA,EAAU;AACxD,MAAA,MAAM,eAAe,IAAA,CAAK,GAAA;AAAA,QACzB,CAAA;AAAA,QACA,UAAA,CAAW,SAAS,WAAA,CAAY;AAAA,OACjC;AACA,MAAA,IAAI,UAAA,GAAa,CAAA;AAEjB,MAAA,IAAI,iBAAiB,KAAA,EAAO;AAC3B,QAAA,UAAA,GACC,UAAA,CAAW,GAAA,GAAM,SAAA,CAAU,OAAA,GAAU,UAAA,CAAW,GAAA;AAAA,MAClD,CAAA,MAAO;AAEN,QAAA,MAAM,4BACL,IAAA,CAAK,GAAA;AAAA,UACJ,UAAA,CAAW,MAAA;AAAA,UACX,UAAA,CAAW,SAAS,SAAA,CAAU;AAAA,YAC3B,UAAA,CAAW,GAAA;AAChB,QAAA,UAAA,GAAa,4BAA4B,WAAA,CAAY,MAAA;AAAA,MACtD;AACA,MAAA,SAAA,GAAY,KAAA,CAAM,UAAA,EAAY,CAAA,EAAG,YAAY,CAAA;AAAA,IAC9C,CAAA,MAAO;AAEN,MAAA,MAAM,eAAe,IAAA,CAAK,GAAA;AAAA,QACzB,CAAA;AAAA,QACA,UAAA,CAAW,QAAQ,WAAA,CAAY;AAAA,OAChC;AACA,MAAA,IAAI,WAAA,GAAc,CAAA;AAElB,MAAA,IAAI,iBAAiB,MAAA,EAAQ;AAC5B,QAAA,WAAA,GACC,UAAA,CAAW,IAAA,GAAO,SAAA,CAAU,OAAA,GAAU,UAAA,CAAW,IAAA;AAAA,MACnD,CAAA,MAAO;AAEN,QAAA,MAAM,4BACL,IAAA,CAAK,GAAA;AAAA,UACJ,UAAA,CAAW,KAAA;AAAA,UACX,UAAA,CAAW,QAAQ,SAAA,CAAU;AAAA,YAC1B,UAAA,CAAW,IAAA;AAChB,QAAA,WAAA,GAAc,4BAA4B,WAAA,CAAY,KAAA;AAAA,MACvD;AACA,MAAA,SAAA,GAAY,KAAA,CAAM,WAAA,EAAa,CAAA,EAAG,YAAY,CAAA;AAAA,IAC/C;AAEA,IAAA,MAAM,UAAA,GAAa,sBAAsB,SAAS,CAAA;AAGlD,IAAA,IAAI,KAAK,GAAA,CAAI,aAAA,CAAc,OAAA,GAAU,UAAU,IAAI,GAAA,EAAK;AACvD,MAAA,IAAI,YAAA,KAAiB,KAAA,IAAS,YAAA,KAAiB,QAAA,EAAU;AACxD,QAAA,SAAA,CAAU,KAAA,CAAM,SAAA,GAAY,CAAA,WAAA,EAAc,UAAU,CAAA,GAAA,CAAA;AAAA,MACrD,CAAA,MAAO;AACN,QAAA,SAAA,CAAU,KAAA,CAAM,SAAA,GAAY,CAAA,WAAA,EAAc,UAAU,CAAA,GAAA,CAAA;AAAA,MACrD;AACA,MAAA,aAAA,CAAc,OAAA,GAAU,UAAA;AACxB,MAAA,iBAAA,CAAkB,UAAA,EAAY,SAAS,UAAU,CAAA;AAAA,IAClD;AAEA,IAAA,IAAI,KAAA,EAAO;AACV,MAAA,MAAA,CAAO,MAAM,OAAA,GAAU,2BAAA;AACvB,MAAA,SAAA,CAAU,MAAM,OAAA,GAAU,+BAAA;AAAA,IAC3B;AAEA,IAAA,cAAA,CAAe,MAAM;AACpB,MAAA,WAAA,CAAY,OAAA,GAAU,KAAA;AAAA,IACvB,CAAC,CAAA;AAAA,EACF,CAAA;AAGA,EAAAA,eAAA,CAAU,MAAM;AACf,IAAA,IAAI,OAAO,UAAU,WAAA,EAAa;AAClC,IAAA,MAAM,SAAS,OAAA,CAAQ,OAAA;AACvB,IAAA,IAAI,CAAC,MAAA,EAAQ;AAEb,IAAA,MAAM,WAAW,MAAA,CAAO,aAAA;AAExB,IAAA,OAAA,CAAQ,IAAI,QAAQ,CAAA;AACpB,IAAA,IAAI,CAAC,QAAA,EAAU;AAEf,IAAA,MAAM,OAAA,GAAqB,CAAC,QAAQ,CAAA;AAEpC,IAAA,MAAM,mBAAmB,MAAM;AAC9B,MAAA,IAAI,CAAC,WAAA,CAAY,OAAA,EAAS,cAAA,EAAe;AAAA,IAC1C,CAAA;AAEA,IAAA,MAAM,EAAA,GAAK,IAAI,oBAAA,CAAqB,gBAAA,EAAkB;AAAA,MACrD,IAAA,EAAM,MAAA,YAAkB,OAAA,GAAU,MAAA,GAAS,IAAA;AAAA,MAC3C,SAAA,EAAW,CAAA;AAAA,MACX,UAAA,EAAY;AAAA,KACZ,CAAA;AAED,IAAA,MAAM,EAAA,GAAK,IAAI,cAAA,CAAe,gBAAgB,CAAA;AAE9C,IAAA,OAAA,CAAQ,QAAQ,CAAC,CAAA,KAAM,EAAA,CAAG,OAAA,CAAQ,CAAC,CAAC,CAAA;AACpC,IAAA,EAAA,CAAG,QAAQ,QAAQ,CAAA;AACnB,IAAA,IAAI,WAAW,OAAA,EAAS;AACvB,MAAA,EAAA,CAAG,OAAA,CAAQ,WAAW,OAAO,CAAA;AAAA,IAC9B;AAEA,IAAA,MAAM,eAAe,MAAA,IAAU,MAAA;AAC/B,IAAA,YAAA,CAAa,gBAAA,CAAiB,UAAU,cAAA,EAAgB;AAAA,MACvD,OAAA,EAAS;AAAA,KACT,CAAA;AACD,IAAA,MAAA,CAAO,gBAAA,CAAiB,UAAU,cAAc,CAAA;AAGhD,IAAA,cAAA,EAAe;AAEf,IAAA,OAAO,MAAM;AACZ,MAAA,EAAA,CAAG,UAAA,EAAW;AACd,MAAA,EAAA,CAAG,UAAA,EAAW;AACd,MAAA,YAAA,CAAa,mBAAA,CAAoB,UAAU,cAAc,CAAA;AACzD,MAAA,MAAA,CAAO,mBAAA,CAAoB,UAAU,cAAc,CAAA;AACnD,MAAA,IAAI,KAAA,CAAM,WAAW,IAAA,EAAM;AAC1B,QAAA,oBAAA,CAAqB,MAAM,OAAO,CAAA;AAClC,QAAA,KAAA,CAAM,OAAA,GAAU,IAAA;AAAA,MACjB;AAAA,IACD,CAAA;AAAA,EAED,GAAG,CAAC,MAAA,EAAQ,YAAA,EAAc,MAAA,EAAQ,KAAK,CAAC,CAAA;AAExC,EAAA,uBACCC,cAAA;AAAA,IAAC,KAAA;AAAA,IAAA;AAAA,MACA,GAAA,EAAK,OAAA;AAAA,MACL,SAAA;AAAA,MACA,KAAA,EAAO;AAAA,QACN,OAAA,EAAS,OAAA;AAAA,QACT,QAAA,EAAU,CAAA;AAAA,QACV,SAAA,EAAW,CAAA;AAAA,QACX,MAAA,EAAQ,MAAA;AAAA;AAAA,QACR,GAAG;AAAA,OACJ;AAAA,MACC,GAAG,IAAA;AAAA,MAEJ,QAAA,kBAAAA,cAAA;AAAA,QAAC,KAAA;AAAA,QAAA;AAAA,UACA,GAAA,EAAK,UAAA;AAAA,UAEL,KAAA,EAAO,mBAAA;AAAA,UAEN;AAAA;AAAA;AACF;AAAA,GACD;AAEF,CAAA;AAEA,IAAO,2BAAA,GAAQ","file":"FlexLayoutStickyBox.cjs","sourcesContent":["\"use client\";\r\nimport {\r\n\tCSSProperties,\r\n\tFC,\r\n\tHTMLAttributes,\r\n\tReactNode,\r\n\tRefObject,\r\n\tuseEffect,\r\n\tuseRef,\r\n\tuseState,\r\n} from \"react\";\r\n\r\ntype Edge = \"auto\" | \"top\" | \"bottom\" | \"left\" | \"right\";\r\n\r\ninterface FlexLayoutStickyBoxProps extends HTMLAttributes<HTMLDivElement> {\r\n\t/** 어느 방향으로 붙일지. 기본은 'auto' (세로 스크롤이면 top, 가로 스크롤이면 left) */\r\n\tedge?: Edge;\r\n\t/** 화면 모서리와의 여백(px). 기본 16 */\r\n\toffset?: number;\r\n\t/** 스크롤 루트. 명시 안 하면 가장 흔한 케이스인 <main> → 없으면 window(=viewport) */\r\n\tscrollRoot?: Element | null;\r\n\t/** 디버그 보조선 표시 */\r\n\tdebug?: boolean;\r\n\t/** 자식 */\r\n\tchildren: ReactNode;\r\n\r\n\tonTranslateChange?: (\r\n\t\tvalue: number,\r\n\t\trootRef: RefObject<HTMLDivElement | null>,\r\n\t\tcontentRef: RefObject<HTMLDivElement | null>,\r\n\t) => void;\r\n}\r\n\r\nfunction clamp(n: number, min: number, max: number) {\r\n\treturn Math.max(min, Math.min(max, n));\r\n}\r\n\r\nfunction pickDefaultScrollRoot(): Element | null {\r\n\tif (typeof document === \"undefined\") return null;\r\n\r\n\tlet el: Element | null = document.body;\r\n\twhile (el && el !== document.documentElement && el !== document.body) {\r\n\t\tconst style = getComputedStyle(el);\r\n\t\tconst oy = style.overflowY;\r\n\t\tconst ox = style.overflowX;\r\n\t\tconst scrollable =\r\n\t\t\toy === \"auto\" ||\r\n\t\t\toy === \"scroll\" ||\r\n\t\t\tox === \"auto\" ||\r\n\t\t\tox === \"scroll\";\r\n\t\tif (scrollable) return el;\r\n\t\tel = el.parentElement;\r\n\t}\r\n\treturn null;\r\n}\r\n\r\nfunction isVerticalScroll(root: Element | null): boolean {\r\n\tif (typeof window == \"undefined\") return true;\r\n\tif (!root) {\r\n\t\treturn document.documentElement.scrollHeight > window.innerHeight + 1;\r\n\t}\r\n\tconst el = root as HTMLElement;\r\n\treturn el.scrollHeight > el.clientHeight + 1;\r\n}\r\n\r\nconst dpr = typeof window != \"undefined\" ? window.devicePixelRatio || 1 : 1;\r\nfunction quantizeToDevicePixel(n: number) {\r\n\treturn Math.round(n * dpr) / dpr;\r\n}\r\n\r\n/**\r\n * FlexLayoutStickyBox\r\n * 부모(실제 경계) 안에서만 움직이며, `transform`을 동적으로 부여해\r\n * “sticky처럼 보이도록” 만든다.\r\n *\r\n * 구조:\r\n * <div data-root> // 이 박스가 부모 경계 안에서 공간을 차지\r\n * <div data-content> // 이 박스가 transform으로 부드럽게 움직임\r\n * {children}\r\n * </div>\r\n * </div>\r\n */\r\nconst FlexLayoutStickyBox: FC<FlexLayoutStickyBoxProps> = ({\r\n\tedge = \"auto\",\r\n\toffset = 16,\r\n\tscrollRoot = null,\r\n\tdebug = false,\r\n\tchildren,\r\n\tstyle,\r\n\tclassName,\r\n\tonTranslateChange = () => {},\r\n\t...rest\r\n}) => {\r\n\tconst offsetRef = useRef(offset);\r\n\tconst rootRef = useRef<HTMLDivElement>(null); // 내가 들어있는 박스(부모의 자식)\r\n\tconst contentRef = useRef<HTMLDivElement>(null); // 실제 내용\r\n\tconst mutatingRef = useRef(false);\r\n\tconst lastOffsetRef = useRef(0);\r\n\tconst [resolvedEdge, setResolvedEdge] = useState<Edge>(\"top\");\r\n\tconst rafId = useRef<number | null>(null);\r\n\r\n\t// 마운트 이후에만(클라이언트에서만) 터치 스타일을 적용\r\n\tconst [contentDynamicStyle, setContentDynamicStyle] =\r\n\t\tuseState<CSSProperties>({});\r\n\tuseEffect(() => {\r\n\t\t// if (\r\n\t\t// typeof navigator !== 'undefined' &&\r\n\t\t// (navigator.maxTouchPoints ?? 0) > 0\r\n\t\t// ) {\r\n\t\tsetContentDynamicStyle({\r\n\t\t\twillChange: \"transform\",\r\n\t\t\ttransition: \"transform 50ms linear\",\r\n\t\t});\r\n\t\t// }\r\n\t}, []);\r\n\r\n\tuseEffect(() => {\r\n\t\toffsetRef.current = offset;\r\n\t\tscheduleUpdate();\r\n\t}, [offset]);\r\n\tconst [ioRoot, setIoRoot] = useState<Element | null>(null);\r\n\tuseEffect(() => {\r\n\t\t// CSR로 전환된 후에 반드시 최신 scroll root를 계산\r\n\t\tconst root = scrollRoot ?? pickDefaultScrollRoot();\r\n\t\tsetResolvedEdge(\r\n\t\t\tedge === \"auto\" ? (isVerticalScroll(root) ? \"top\" : \"left\") : edge,\r\n\t\t);\r\n\r\n\t\tsetIoRoot(root);\r\n\t}, [edge, scrollRoot]);\r\n\tuseEffect(() => {\r\n\t\tif (edge !== \"auto\") {\r\n\t\t\tsetResolvedEdge(edge);\r\n\t\t\treturn;\r\n\t\t}\r\n\t\tconst vertical = isVerticalScroll(ioRoot);\r\n\t\tsetResolvedEdge(vertical ? \"top\" : \"left\");\r\n\t}, [edge, ioRoot]);\r\n\r\n\tuseEffect(() => {}, []);\r\n\r\n\tconst scheduleUpdate = () => {\r\n\t\tif (rafId.current != null) return;\r\n\t\trafId.current = requestAnimationFrame(() => {\r\n\t\t\trafId.current = null;\r\n\t\t\tdoUpdate();\r\n\t\t});\r\n\t};\r\n\r\n\tconst doUpdate = () => {\r\n\t\tif (mutatingRef.current) return;\r\n\t\tmutatingRef.current = true;\r\n\r\n\t\tconst rootEl = rootRef.current;\r\n\t\tconst contentEl = contentRef.current;\r\n\t\tif (!rootEl || !contentEl) {\r\n\t\t\tmutatingRef.current = false;\r\n\t\t\treturn;\r\n\t\t}\r\n\r\n\t\tconst parentEl = rootEl.parentElement;\r\n\t\tif (!parentEl) {\r\n\t\t\tmutatingRef.current = false;\r\n\t\t\treturn;\r\n\t\t}\r\n\r\n\t\tconst rootBounds =\r\n\t\t\tioRoot && \"getBoundingClientRect\" in ioRoot\r\n\t\t\t\t? (ioRoot as Element).getBoundingClientRect()\r\n\t\t\t\t: new DOMRect(0, 0, window.innerWidth, window.innerHeight);\r\n\r\n\t\tconst parentRect = parentEl.getBoundingClientRect();\r\n\t\tconst contentRect = contentEl.getBoundingClientRect();\r\n\r\n\t\tlet newOffset = 0;\r\n\r\n\t\tif (resolvedEdge === \"top\" || resolvedEdge === \"bottom\") {\r\n\t\t\tconst maxTranslate = Math.max(\r\n\t\t\t\t0,\r\n\t\t\t\tparentRect.height - contentRect.height,\r\n\t\t\t);\r\n\t\t\tlet desiredTop = 0;\r\n\r\n\t\t\tif (resolvedEdge === \"top\") {\r\n\t\t\t\tdesiredTop =\r\n\t\t\t\t\trootBounds.top + offsetRef.current - parentRect.top;\r\n\t\t\t} else {\r\n\t\t\t\t// bottom\r\n\t\t\t\tconst targetBottomFromParentTop =\r\n\t\t\t\t\tMath.min(\r\n\t\t\t\t\t\tparentRect.bottom,\r\n\t\t\t\t\t\trootBounds.bottom - offsetRef.current,\r\n\t\t\t\t\t) - parentRect.top;\r\n\t\t\t\tdesiredTop = targetBottomFromParentTop - contentRect.height;\r\n\t\t\t}\r\n\t\t\tnewOffset = clamp(desiredTop, 0, maxTranslate);\r\n\t\t} else {\r\n\t\t\t// left or right\r\n\t\t\tconst maxTranslate = Math.max(\r\n\t\t\t\t0,\r\n\t\t\t\tparentRect.width - contentRect.width,\r\n\t\t\t);\r\n\t\t\tlet desiredLeft = 0;\r\n\r\n\t\t\tif (resolvedEdge === \"left\") {\r\n\t\t\t\tdesiredLeft =\r\n\t\t\t\t\trootBounds.left + offsetRef.current - parentRect.left;\r\n\t\t\t} else {\r\n\t\t\t\t// right\r\n\t\t\t\tconst targetRightFromParentLeft =\r\n\t\t\t\t\tMath.min(\r\n\t\t\t\t\t\tparentRect.right,\r\n\t\t\t\t\t\trootBounds.right - offsetRef.current,\r\n\t\t\t\t\t) - parentRect.left;\r\n\t\t\t\tdesiredLeft = targetRightFromParentLeft - contentRect.width;\r\n\t\t\t}\r\n\t\t\tnewOffset = clamp(desiredLeft, 0, maxTranslate);\r\n\t\t}\r\n\r\n\t\tconst nextOffset = quantizeToDevicePixel(newOffset);\r\n\r\n\t\t// 변화가 거의 없으면 업데이트 건너뛰기 (미세한 떨림 방지)\r\n\t\tif (Math.abs(lastOffsetRef.current - nextOffset) > 0.5) {\r\n\t\t\tif (resolvedEdge === \"top\" || resolvedEdge === \"bottom\") {\r\n\t\t\t\tcontentEl.style.transform = `translateY(${nextOffset}px)`;\r\n\t\t\t} else {\r\n\t\t\t\tcontentEl.style.transform = `translateX(${nextOffset}px)`;\r\n\t\t\t}\r\n\t\t\tlastOffsetRef.current = nextOffset;\r\n\t\t\tonTranslateChange(nextOffset, rootRef, contentRef);\r\n\t\t}\r\n\r\n\t\tif (debug) {\r\n\t\t\trootEl.style.outline = \"1px dashed rgba(0,0,0,.2)\";\r\n\t\t\tcontentEl.style.outline = \"1px solid rgba(0,128,255,.35)\";\r\n\t\t}\r\n\r\n\t\tqueueMicrotask(() => {\r\n\t\t\tmutatingRef.current = false;\r\n\t\t});\r\n\t};\r\n\r\n\t// IntersectionObserver, ResizeObserver, Event Listeners 설정\r\n\tuseEffect(() => {\r\n\t\tif (typeof window == \"undefined\") return;\r\n\t\tconst rootEl = rootRef.current;\r\n\t\tif (!rootEl) return;\r\n\r\n\t\tconst parentEl = rootEl.parentElement;\r\n\r\n\t\tconsole.log(parentEl);\r\n\t\tif (!parentEl) return;\r\n\r\n\t\tconst targets: Element[] = [parentEl];\r\n\r\n\t\tconst observerCallback = () => {\r\n\t\t\tif (!mutatingRef.current) scheduleUpdate();\r\n\t\t};\r\n\r\n\t\tconst io = new IntersectionObserver(observerCallback, {\r\n\t\t\troot: ioRoot instanceof Element ? ioRoot : null,\r\n\t\t\tthreshold: 0,\r\n\t\t\trootMargin: \"1px\",\r\n\t\t});\r\n\r\n\t\tconst ro = new ResizeObserver(observerCallback);\r\n\r\n\t\ttargets.forEach((t) => io.observe(t));\r\n\t\tro.observe(parentEl);\r\n\t\tif (contentRef.current) {\r\n\t\t\tro.observe(contentRef.current);\r\n\t\t}\r\n\r\n\t\tconst scrollTarget = ioRoot || window;\r\n\t\tscrollTarget.addEventListener(\"scroll\", scheduleUpdate, {\r\n\t\t\tpassive: true,\r\n\t\t});\r\n\t\twindow.addEventListener(\"resize\", scheduleUpdate);\r\n\r\n\t\t// 최초 1회 계산\r\n\t\tscheduleUpdate();\r\n\r\n\t\treturn () => {\r\n\t\t\tio.disconnect();\r\n\t\t\tro.disconnect();\r\n\t\t\tscrollTarget.removeEventListener(\"scroll\", scheduleUpdate);\r\n\t\t\twindow.removeEventListener(\"resize\", scheduleUpdate);\r\n\t\t\tif (rafId.current != null) {\r\n\t\t\t\tcancelAnimationFrame(rafId.current);\r\n\t\t\t\trafId.current = null;\r\n\t\t\t}\r\n\t\t};\r\n\t\t// eslint-disable-next-line react-hooks/exhaustive-deps\r\n\t}, [ioRoot, resolvedEdge, offset, debug]);\r\n\r\n\treturn (\r\n\t\t<div\r\n\t\t\tref={rootRef}\r\n\t\t\tclassName={className}\r\n\t\t\tstyle={{\r\n\t\t\t\tdisplay: \"block\",\r\n\t\t\t\tminWidth: 0,\r\n\t\t\t\tminHeight: 0,\r\n\t\t\t\theight: \"100%\", // 부모 높이를 채우도록 설정\r\n\t\t\t\t...style,\r\n\t\t\t}}\r\n\t\t\t{...rest}\r\n\t\t>\r\n\t\t\t<div\r\n\t\t\t\tref={contentRef}\r\n\t\t\t\t// SSR/클라이언트 첫 렌더 동일 → 마운트 후에만 스타일 부여\r\n\t\t\t\tstyle={contentDynamicStyle}\r\n\t\t\t>\r\n\t\t\t\t{children}\r\n\t\t\t</div>\r\n\t\t</div>\r\n\t);\r\n};\r\n\r\nexport default FlexLayoutStickyBox;\r\n"]}
|
|
1
|
+
{"version":3,"sources":["../../../src/flex-layout/components/FlexLayoutStickyBox.tsx"],"sourcesContent":["\"use client\";\r\nimport {\r\n\tCSSProperties,\r\n\tFC,\r\n\tHTMLAttributes,\r\n\tReactNode,\r\n\tRefObject,\r\n\tuseEffect,\r\n\tuseRef,\r\n\tuseState,\r\n} from \"react\";\r\n\r\ntype Edge = \"auto\" | \"top\" | \"bottom\" | \"left\" | \"right\";\r\n\r\ninterface FlexLayoutStickyBoxProps extends HTMLAttributes<HTMLDivElement> {\r\n\t/** 어느 방향으로 붙일지. 기본은 'auto' (세로 스크롤이면 top, 가로 스크롤이면 left) */\r\n\tedge?: Edge;\r\n\t/** 화면 모서리와의 여백(px). 기본 16 */\r\n\toffset?: number;\r\n\t/** 스크롤 루트. 명시 안 하면 가장 흔한 케이스인 <main> → 없으면 window(=viewport) */\r\n\tscrollRoot?: Element | null;\r\n\t/** 디버그 보조선 표시 */\r\n\tdebug?: boolean;\r\n\t/** 자식 */\r\n\tchildren: ReactNode;\r\n\r\n\ttransitionDurationMs?: number;\r\n\r\n\tonTranslateChange?: (\r\n\t\tvalue: number,\r\n\t\trootRef: RefObject<HTMLDivElement | null>,\r\n\t\tcontentRef: RefObject<HTMLDivElement | null>,\r\n\t) => void;\r\n}\r\n\r\nfunction clamp(n: number, min: number, max: number) {\r\n\treturn Math.max(min, Math.min(max, n));\r\n}\r\n\r\nfunction pickDefaultScrollRoot(): Element | null {\r\n\tif (typeof document === \"undefined\") return null;\r\n\r\n\tlet el: Element | null = document.body;\r\n\twhile (el && el !== document.documentElement && el !== document.body) {\r\n\t\tconst style = getComputedStyle(el);\r\n\t\tconst oy = style.overflowY;\r\n\t\tconst ox = style.overflowX;\r\n\t\tconst scrollable =\r\n\t\t\toy === \"auto\" ||\r\n\t\t\toy === \"scroll\" ||\r\n\t\t\tox === \"auto\" ||\r\n\t\t\tox === \"scroll\";\r\n\t\tif (scrollable) return el;\r\n\t\tel = el.parentElement;\r\n\t}\r\n\treturn null;\r\n}\r\n\r\nfunction isVerticalScroll(root: Element | null): boolean {\r\n\tif (typeof window == \"undefined\") return true;\r\n\tif (!root) {\r\n\t\treturn document.documentElement.scrollHeight > window.innerHeight + 1;\r\n\t}\r\n\tconst el = root as HTMLElement;\r\n\treturn el.scrollHeight > el.clientHeight + 1;\r\n}\r\n\r\nconst dpr = typeof window != \"undefined\" ? window.devicePixelRatio || 1 : 1;\r\nfunction quantizeToDevicePixel(n: number) {\r\n\treturn Math.round(n * dpr) / dpr;\r\n}\r\n\r\n/**\r\n * FlexLayoutStickyBox\r\n * 부모(실제 경계) 안에서만 움직이며, `transform`을 동적으로 부여해\r\n * “sticky처럼 보이도록” 만든다.\r\n *\r\n * 구조:\r\n * <div data-root> // 이 박스가 부모 경계 안에서 공간을 차지\r\n * <div data-content> // 이 박스가 transform으로 부드럽게 움직임\r\n * {children}\r\n * </div>\r\n * </div>\r\n */\r\nconst FlexLayoutStickyBox: FC<FlexLayoutStickyBoxProps> = ({\r\n\tedge = \"auto\",\r\n\toffset = 16,\r\n\tscrollRoot = null,\r\n\tdebug = false,\r\n\tchildren,\r\n\tstyle,\r\n\tclassName,\r\n\ttransitionDurationMs = 200,\r\n\tonTranslateChange = () => {},\r\n\t...rest\r\n}) => {\r\n\tconst offsetRef = useRef(offset);\r\n\tconst rootRef = useRef<HTMLDivElement>(null); // 내가 들어있는 박스(부모의 자식)\r\n\tconst contentRef = useRef<HTMLDivElement>(null); // 실제 내용\r\n\tconst mutatingRef = useRef(false);\r\n\tconst lastOffsetRef = useRef(0);\r\n\tconst [resolvedEdge, setResolvedEdge] = useState<Edge>(\"top\");\r\n\tconst rafId = useRef<number | null>(null);\r\n\r\n\t// 마운트 이후에만(클라이언트에서만) 터치 스타일을 적용\r\n\tconst [contentDynamicStyle, setContentDynamicStyle] =\r\n\t\tuseState<CSSProperties>({});\r\n\tuseEffect(() => {\r\n\t\t// if (\r\n\t\t// typeof navigator !== 'undefined' &&\r\n\t\t// (navigator.maxTouchPoints ?? 0) > 0\r\n\t\t// ) {\r\n\t\tsetContentDynamicStyle({\r\n\t\t\twillChange: \"transform\",\r\n\t\t\ttransition: `transform ${transitionDurationMs}ms linear`,\r\n\t\t});\r\n\t\t// }\r\n\t}, [transitionDurationMs]);\r\n\r\n\tuseEffect(() => {\r\n\t\toffsetRef.current = offset;\r\n\t\tscheduleUpdate();\r\n\t}, [offset]);\r\n\tconst [ioRoot, setIoRoot] = useState<Element | null>(null);\r\n\tuseEffect(() => {\r\n\t\t// CSR로 전환된 후에 반드시 최신 scroll root를 계산\r\n\t\tconst root = scrollRoot ?? pickDefaultScrollRoot();\r\n\t\tsetResolvedEdge(\r\n\t\t\tedge === \"auto\" ? (isVerticalScroll(root) ? \"top\" : \"left\") : edge,\r\n\t\t);\r\n\r\n\t\tsetIoRoot(root);\r\n\t}, [edge, scrollRoot]);\r\n\tuseEffect(() => {\r\n\t\tif (edge !== \"auto\") {\r\n\t\t\tsetResolvedEdge(edge);\r\n\t\t\treturn;\r\n\t\t}\r\n\t\tconst vertical = isVerticalScroll(ioRoot);\r\n\t\tsetResolvedEdge(vertical ? \"top\" : \"left\");\r\n\t}, [edge, ioRoot]);\r\n\r\n\tuseEffect(() => {}, []);\r\n\r\n\tconst scheduleUpdate = () => {\r\n\t\tif (rafId.current != null) return;\r\n\t\trafId.current = requestAnimationFrame(() => {\r\n\t\t\trafId.current = null;\r\n\t\t\tdoUpdate();\r\n\t\t});\r\n\t};\r\n\r\n\tconst doUpdate = () => {\r\n\t\tif (mutatingRef.current) return;\r\n\t\tmutatingRef.current = true;\r\n\r\n\t\tconst rootEl = rootRef.current;\r\n\t\tconst contentEl = contentRef.current;\r\n\t\tif (!rootEl || !contentEl) {\r\n\t\t\tmutatingRef.current = false;\r\n\t\t\treturn;\r\n\t\t}\r\n\r\n\t\tconst parentEl = rootEl.parentElement;\r\n\t\tif (!parentEl) {\r\n\t\t\tmutatingRef.current = false;\r\n\t\t\treturn;\r\n\t\t}\r\n\r\n\t\tconst rootBounds =\r\n\t\t\tioRoot && \"getBoundingClientRect\" in ioRoot\r\n\t\t\t\t? (ioRoot as Element).getBoundingClientRect()\r\n\t\t\t\t: new DOMRect(0, 0, window.innerWidth, window.innerHeight);\r\n\r\n\t\tconst parentRect = parentEl.getBoundingClientRect();\r\n\t\tconst contentRect = contentEl.getBoundingClientRect();\r\n\r\n\t\tlet newOffset = 0;\r\n\r\n\t\tif (resolvedEdge === \"top\" || resolvedEdge === \"bottom\") {\r\n\t\t\tconst maxTranslate = Math.max(\r\n\t\t\t\t0,\r\n\t\t\t\tparentRect.height - contentRect.height,\r\n\t\t\t);\r\n\t\t\tlet desiredTop = 0;\r\n\r\n\t\t\tif (resolvedEdge === \"top\") {\r\n\t\t\t\tdesiredTop =\r\n\t\t\t\t\trootBounds.top + offsetRef.current - parentRect.top;\r\n\t\t\t} else {\r\n\t\t\t\t// bottom\r\n\t\t\t\tconst targetBottomFromParentTop =\r\n\t\t\t\t\tMath.min(\r\n\t\t\t\t\t\tparentRect.bottom,\r\n\t\t\t\t\t\trootBounds.bottom - offsetRef.current,\r\n\t\t\t\t\t) - parentRect.top;\r\n\t\t\t\tdesiredTop = targetBottomFromParentTop - contentRect.height;\r\n\t\t\t}\r\n\t\t\tnewOffset = clamp(desiredTop, 0, maxTranslate);\r\n\t\t} else {\r\n\t\t\t// left or right\r\n\t\t\tconst maxTranslate = Math.max(\r\n\t\t\t\t0,\r\n\t\t\t\tparentRect.width - contentRect.width,\r\n\t\t\t);\r\n\t\t\tlet desiredLeft = 0;\r\n\r\n\t\t\tif (resolvedEdge === \"left\") {\r\n\t\t\t\tdesiredLeft =\r\n\t\t\t\t\trootBounds.left + offsetRef.current - parentRect.left;\r\n\t\t\t} else {\r\n\t\t\t\t// right\r\n\t\t\t\tconst targetRightFromParentLeft =\r\n\t\t\t\t\tMath.min(\r\n\t\t\t\t\t\tparentRect.right,\r\n\t\t\t\t\t\trootBounds.right - offsetRef.current,\r\n\t\t\t\t\t) - parentRect.left;\r\n\t\t\t\tdesiredLeft = targetRightFromParentLeft - contentRect.width;\r\n\t\t\t}\r\n\t\t\tnewOffset = clamp(desiredLeft, 0, maxTranslate);\r\n\t\t}\r\n\r\n\t\tconst nextOffset = quantizeToDevicePixel(newOffset);\r\n\r\n\t\t// 변화가 거의 없으면 업데이트 건너뛰기 (미세한 떨림 방지)\r\n\t\tif (Math.abs(lastOffsetRef.current - nextOffset) > 0.5) {\r\n\t\t\tif (resolvedEdge === \"top\" || resolvedEdge === \"bottom\") {\r\n\t\t\t\tcontentEl.style.transform = `translateY(${nextOffset}px)`;\r\n\t\t\t} else {\r\n\t\t\t\tcontentEl.style.transform = `translateX(${nextOffset}px)`;\r\n\t\t\t}\r\n\t\t\tlastOffsetRef.current = nextOffset;\r\n\t\t\tonTranslateChange(nextOffset, rootRef, contentRef);\r\n\t\t}\r\n\r\n\t\tif (debug) {\r\n\t\t\trootEl.style.outline = \"1px dashed rgba(0,0,0,.2)\";\r\n\t\t\tcontentEl.style.outline = \"1px solid rgba(0,128,255,.35)\";\r\n\t\t}\r\n\r\n\t\tqueueMicrotask(() => {\r\n\t\t\tmutatingRef.current = false;\r\n\t\t});\r\n\t};\r\n\r\n\t// IntersectionObserver, ResizeObserver, Event Listeners 설정\r\n\tuseEffect(() => {\r\n\t\tif (typeof window == \"undefined\") return;\r\n\t\tconst rootEl = rootRef.current;\r\n\t\tif (!rootEl) return;\r\n\r\n\t\tconst parentEl = rootEl.parentElement;\r\n\r\n\t\tconsole.log(parentEl);\r\n\t\tif (!parentEl) return;\r\n\r\n\t\tconst targets: Element[] = [parentEl];\r\n\r\n\t\tconst observerCallback = () => {\r\n\t\t\tif (!mutatingRef.current) scheduleUpdate();\r\n\t\t};\r\n\r\n\t\tconst io = new IntersectionObserver(observerCallback, {\r\n\t\t\troot: ioRoot instanceof Element ? ioRoot : null,\r\n\t\t\tthreshold: 0,\r\n\t\t\trootMargin: \"1px\",\r\n\t\t});\r\n\r\n\t\tconst ro = new ResizeObserver(observerCallback);\r\n\r\n\t\ttargets.forEach((t) => io.observe(t));\r\n\t\tro.observe(parentEl);\r\n\t\tif (contentRef.current) {\r\n\t\t\tro.observe(contentRef.current);\r\n\t\t}\r\n\r\n\t\tconst scrollTarget = ioRoot || window;\r\n\t\tscrollTarget.addEventListener(\"scroll\", scheduleUpdate, {\r\n\t\t\tpassive: true,\r\n\t\t});\r\n\t\twindow.addEventListener(\"resize\", scheduleUpdate);\r\n\r\n\t\t// 최초 1회 계산\r\n\t\tscheduleUpdate();\r\n\r\n\t\treturn () => {\r\n\t\t\tio.disconnect();\r\n\t\t\tro.disconnect();\r\n\t\t\tscrollTarget.removeEventListener(\"scroll\", scheduleUpdate);\r\n\t\t\twindow.removeEventListener(\"resize\", scheduleUpdate);\r\n\t\t\tif (rafId.current != null) {\r\n\t\t\t\tcancelAnimationFrame(rafId.current);\r\n\t\t\t\trafId.current = null;\r\n\t\t\t}\r\n\t\t};\r\n\t\t// eslint-disable-next-line react-hooks/exhaustive-deps\r\n\t}, [ioRoot, resolvedEdge, offset, debug]);\r\n\r\n\treturn (\r\n\t\t<div\r\n\t\t\tref={rootRef}\r\n\t\t\tclassName={className}\r\n\t\t\tstyle={{\r\n\t\t\t\tdisplay: \"block\",\r\n\t\t\t\tminWidth: 0,\r\n\t\t\t\tminHeight: 0,\r\n\t\t\t\theight: \"100%\", // 부모 높이를 채우도록 설정\r\n\t\t\t\t...style,\r\n\t\t\t}}\r\n\t\t\t{...rest}\r\n\t\t>\r\n\t\t\t<div\r\n\t\t\t\tref={contentRef}\r\n\t\t\t\t// SSR/클라이언트 첫 렌더 동일 → 마운트 후에만 스타일 부여\r\n\t\t\t\tstyle={contentDynamicStyle}\r\n\t\t\t>\r\n\t\t\t\t{children}\r\n\t\t\t</div>\r\n\t\t</div>\r\n\t);\r\n};\r\n\r\nexport default FlexLayoutStickyBox;\r\n"],"mappings":"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","names":[]}
|
|
@@ -11,6 +11,7 @@ interface FlexLayoutStickyBoxProps extends HTMLAttributes<HTMLDivElement> {
|
|
|
11
11
|
debug?: boolean;
|
|
12
12
|
/** 자식 */
|
|
13
13
|
children: ReactNode;
|
|
14
|
+
transitionDurationMs?: number;
|
|
14
15
|
onTranslateChange?: (value: number, rootRef: RefObject<HTMLDivElement | null>, contentRef: RefObject<HTMLDivElement | null>) => void;
|
|
15
16
|
}
|
|
16
17
|
/**
|
|
@@ -1,6 +1,10 @@
|
|
|
1
|
-
|
|
2
|
-
import {
|
|
3
|
-
|
|
1
|
+
"use client";
|
|
2
|
+
import { jsx } from "react/jsx-runtime";
|
|
3
|
+
import {
|
|
4
|
+
useEffect,
|
|
5
|
+
useRef,
|
|
6
|
+
useState
|
|
7
|
+
} from "react";
|
|
4
8
|
function clamp(n, min, max) {
|
|
5
9
|
return Math.max(min, Math.min(max, n));
|
|
6
10
|
}
|
|
@@ -37,6 +41,7 @@ const FlexLayoutStickyBox = ({
|
|
|
37
41
|
children,
|
|
38
42
|
style,
|
|
39
43
|
className,
|
|
44
|
+
transitionDurationMs = 200,
|
|
40
45
|
onTranslateChange = () => {
|
|
41
46
|
},
|
|
42
47
|
...rest
|
|
@@ -52,9 +57,9 @@ const FlexLayoutStickyBox = ({
|
|
|
52
57
|
useEffect(() => {
|
|
53
58
|
setContentDynamicStyle({
|
|
54
59
|
willChange: "transform",
|
|
55
|
-
transition:
|
|
60
|
+
transition: `transform ${transitionDurationMs}ms linear`
|
|
56
61
|
});
|
|
57
|
-
}, []);
|
|
62
|
+
}, [transitionDurationMs]);
|
|
58
63
|
useEffect(() => {
|
|
59
64
|
offsetRef.current = offset;
|
|
60
65
|
scheduleUpdate();
|
|
@@ -218,7 +223,7 @@ const FlexLayoutStickyBox = ({
|
|
|
218
223
|
);
|
|
219
224
|
};
|
|
220
225
|
var FlexLayoutStickyBox_default = FlexLayoutStickyBox;
|
|
221
|
-
|
|
222
|
-
|
|
223
|
-
|
|
226
|
+
export {
|
|
227
|
+
FlexLayoutStickyBox_default as default
|
|
228
|
+
};
|
|
224
229
|
//# sourceMappingURL=FlexLayoutStickyBox.js.map
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"sources":["../../../src/flex-layout/components/FlexLayoutStickyBox.tsx"],"names":[],"mappings":"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","file":"FlexLayoutStickyBox.js","sourcesContent":["\"use client\";\r\nimport {\r\n\tCSSProperties,\r\n\tFC,\r\n\tHTMLAttributes,\r\n\tReactNode,\r\n\tRefObject,\r\n\tuseEffect,\r\n\tuseRef,\r\n\tuseState,\r\n} from \"react\";\r\n\r\ntype Edge = \"auto\" | \"top\" | \"bottom\" | \"left\" | \"right\";\r\n\r\ninterface FlexLayoutStickyBoxProps extends HTMLAttributes<HTMLDivElement> {\r\n\t/** 어느 방향으로 붙일지. 기본은 'auto' (세로 스크롤이면 top, 가로 스크롤이면 left) */\r\n\tedge?: Edge;\r\n\t/** 화면 모서리와의 여백(px). 기본 16 */\r\n\toffset?: number;\r\n\t/** 스크롤 루트. 명시 안 하면 가장 흔한 케이스인 <main> → 없으면 window(=viewport) */\r\n\tscrollRoot?: Element | null;\r\n\t/** 디버그 보조선 표시 */\r\n\tdebug?: boolean;\r\n\t/** 자식 */\r\n\tchildren: ReactNode;\r\n\r\n\tonTranslateChange?: (\r\n\t\tvalue: number,\r\n\t\trootRef: RefObject<HTMLDivElement | null>,\r\n\t\tcontentRef: RefObject<HTMLDivElement | null>,\r\n\t) => void;\r\n}\r\n\r\nfunction clamp(n: number, min: number, max: number) {\r\n\treturn Math.max(min, Math.min(max, n));\r\n}\r\n\r\nfunction pickDefaultScrollRoot(): Element | null {\r\n\tif (typeof document === \"undefined\") return null;\r\n\r\n\tlet el: Element | null = document.body;\r\n\twhile (el && el !== document.documentElement && el !== document.body) {\r\n\t\tconst style = getComputedStyle(el);\r\n\t\tconst oy = style.overflowY;\r\n\t\tconst ox = style.overflowX;\r\n\t\tconst scrollable =\r\n\t\t\toy === \"auto\" ||\r\n\t\t\toy === \"scroll\" ||\r\n\t\t\tox === \"auto\" ||\r\n\t\t\tox === \"scroll\";\r\n\t\tif (scrollable) return el;\r\n\t\tel = el.parentElement;\r\n\t}\r\n\treturn null;\r\n}\r\n\r\nfunction isVerticalScroll(root: Element | null): boolean {\r\n\tif (typeof window == \"undefined\") return true;\r\n\tif (!root) {\r\n\t\treturn document.documentElement.scrollHeight > window.innerHeight + 1;\r\n\t}\r\n\tconst el = root as HTMLElement;\r\n\treturn el.scrollHeight > el.clientHeight + 1;\r\n}\r\n\r\nconst dpr = typeof window != \"undefined\" ? window.devicePixelRatio || 1 : 1;\r\nfunction quantizeToDevicePixel(n: number) {\r\n\treturn Math.round(n * dpr) / dpr;\r\n}\r\n\r\n/**\r\n * FlexLayoutStickyBox\r\n * 부모(실제 경계) 안에서만 움직이며, `transform`을 동적으로 부여해\r\n * “sticky처럼 보이도록” 만든다.\r\n *\r\n * 구조:\r\n * <div data-root> // 이 박스가 부모 경계 안에서 공간을 차지\r\n * <div data-content> // 이 박스가 transform으로 부드럽게 움직임\r\n * {children}\r\n * </div>\r\n * </div>\r\n */\r\nconst FlexLayoutStickyBox: FC<FlexLayoutStickyBoxProps> = ({\r\n\tedge = \"auto\",\r\n\toffset = 16,\r\n\tscrollRoot = null,\r\n\tdebug = false,\r\n\tchildren,\r\n\tstyle,\r\n\tclassName,\r\n\tonTranslateChange = () => {},\r\n\t...rest\r\n}) => {\r\n\tconst offsetRef = useRef(offset);\r\n\tconst rootRef = useRef<HTMLDivElement>(null); // 내가 들어있는 박스(부모의 자식)\r\n\tconst contentRef = useRef<HTMLDivElement>(null); // 실제 내용\r\n\tconst mutatingRef = useRef(false);\r\n\tconst lastOffsetRef = useRef(0);\r\n\tconst [resolvedEdge, setResolvedEdge] = useState<Edge>(\"top\");\r\n\tconst rafId = useRef<number | null>(null);\r\n\r\n\t// 마운트 이후에만(클라이언트에서만) 터치 스타일을 적용\r\n\tconst [contentDynamicStyle, setContentDynamicStyle] =\r\n\t\tuseState<CSSProperties>({});\r\n\tuseEffect(() => {\r\n\t\t// if (\r\n\t\t// typeof navigator !== 'undefined' &&\r\n\t\t// (navigator.maxTouchPoints ?? 0) > 0\r\n\t\t// ) {\r\n\t\tsetContentDynamicStyle({\r\n\t\t\twillChange: \"transform\",\r\n\t\t\ttransition: \"transform 50ms linear\",\r\n\t\t});\r\n\t\t// }\r\n\t}, []);\r\n\r\n\tuseEffect(() => {\r\n\t\toffsetRef.current = offset;\r\n\t\tscheduleUpdate();\r\n\t}, [offset]);\r\n\tconst [ioRoot, setIoRoot] = useState<Element | null>(null);\r\n\tuseEffect(() => {\r\n\t\t// CSR로 전환된 후에 반드시 최신 scroll root를 계산\r\n\t\tconst root = scrollRoot ?? pickDefaultScrollRoot();\r\n\t\tsetResolvedEdge(\r\n\t\t\tedge === \"auto\" ? (isVerticalScroll(root) ? \"top\" : \"left\") : edge,\r\n\t\t);\r\n\r\n\t\tsetIoRoot(root);\r\n\t}, [edge, scrollRoot]);\r\n\tuseEffect(() => {\r\n\t\tif (edge !== \"auto\") {\r\n\t\t\tsetResolvedEdge(edge);\r\n\t\t\treturn;\r\n\t\t}\r\n\t\tconst vertical = isVerticalScroll(ioRoot);\r\n\t\tsetResolvedEdge(vertical ? \"top\" : \"left\");\r\n\t}, [edge, ioRoot]);\r\n\r\n\tuseEffect(() => {}, []);\r\n\r\n\tconst scheduleUpdate = () => {\r\n\t\tif (rafId.current != null) return;\r\n\t\trafId.current = requestAnimationFrame(() => {\r\n\t\t\trafId.current = null;\r\n\t\t\tdoUpdate();\r\n\t\t});\r\n\t};\r\n\r\n\tconst doUpdate = () => {\r\n\t\tif (mutatingRef.current) return;\r\n\t\tmutatingRef.current = true;\r\n\r\n\t\tconst rootEl = rootRef.current;\r\n\t\tconst contentEl = contentRef.current;\r\n\t\tif (!rootEl || !contentEl) {\r\n\t\t\tmutatingRef.current = false;\r\n\t\t\treturn;\r\n\t\t}\r\n\r\n\t\tconst parentEl = rootEl.parentElement;\r\n\t\tif (!parentEl) {\r\n\t\t\tmutatingRef.current = false;\r\n\t\t\treturn;\r\n\t\t}\r\n\r\n\t\tconst rootBounds =\r\n\t\t\tioRoot && \"getBoundingClientRect\" in ioRoot\r\n\t\t\t\t? (ioRoot as Element).getBoundingClientRect()\r\n\t\t\t\t: new DOMRect(0, 0, window.innerWidth, window.innerHeight);\r\n\r\n\t\tconst parentRect = parentEl.getBoundingClientRect();\r\n\t\tconst contentRect = contentEl.getBoundingClientRect();\r\n\r\n\t\tlet newOffset = 0;\r\n\r\n\t\tif (resolvedEdge === \"top\" || resolvedEdge === \"bottom\") {\r\n\t\t\tconst maxTranslate = Math.max(\r\n\t\t\t\t0,\r\n\t\t\t\tparentRect.height - contentRect.height,\r\n\t\t\t);\r\n\t\t\tlet desiredTop = 0;\r\n\r\n\t\t\tif (resolvedEdge === \"top\") {\r\n\t\t\t\tdesiredTop =\r\n\t\t\t\t\trootBounds.top + offsetRef.current - parentRect.top;\r\n\t\t\t} else {\r\n\t\t\t\t// bottom\r\n\t\t\t\tconst targetBottomFromParentTop =\r\n\t\t\t\t\tMath.min(\r\n\t\t\t\t\t\tparentRect.bottom,\r\n\t\t\t\t\t\trootBounds.bottom - offsetRef.current,\r\n\t\t\t\t\t) - parentRect.top;\r\n\t\t\t\tdesiredTop = targetBottomFromParentTop - contentRect.height;\r\n\t\t\t}\r\n\t\t\tnewOffset = clamp(desiredTop, 0, maxTranslate);\r\n\t\t} else {\r\n\t\t\t// left or right\r\n\t\t\tconst maxTranslate = Math.max(\r\n\t\t\t\t0,\r\n\t\t\t\tparentRect.width - contentRect.width,\r\n\t\t\t);\r\n\t\t\tlet desiredLeft = 0;\r\n\r\n\t\t\tif (resolvedEdge === \"left\") {\r\n\t\t\t\tdesiredLeft =\r\n\t\t\t\t\trootBounds.left + offsetRef.current - parentRect.left;\r\n\t\t\t} else {\r\n\t\t\t\t// right\r\n\t\t\t\tconst targetRightFromParentLeft =\r\n\t\t\t\t\tMath.min(\r\n\t\t\t\t\t\tparentRect.right,\r\n\t\t\t\t\t\trootBounds.right - offsetRef.current,\r\n\t\t\t\t\t) - parentRect.left;\r\n\t\t\t\tdesiredLeft = targetRightFromParentLeft - contentRect.width;\r\n\t\t\t}\r\n\t\t\tnewOffset = clamp(desiredLeft, 0, maxTranslate);\r\n\t\t}\r\n\r\n\t\tconst nextOffset = quantizeToDevicePixel(newOffset);\r\n\r\n\t\t// 변화가 거의 없으면 업데이트 건너뛰기 (미세한 떨림 방지)\r\n\t\tif (Math.abs(lastOffsetRef.current - nextOffset) > 0.5) {\r\n\t\t\tif (resolvedEdge === \"top\" || resolvedEdge === \"bottom\") {\r\n\t\t\t\tcontentEl.style.transform = `translateY(${nextOffset}px)`;\r\n\t\t\t} else {\r\n\t\t\t\tcontentEl.style.transform = `translateX(${nextOffset}px)`;\r\n\t\t\t}\r\n\t\t\tlastOffsetRef.current = nextOffset;\r\n\t\t\tonTranslateChange(nextOffset, rootRef, contentRef);\r\n\t\t}\r\n\r\n\t\tif (debug) {\r\n\t\t\trootEl.style.outline = \"1px dashed rgba(0,0,0,.2)\";\r\n\t\t\tcontentEl.style.outline = \"1px solid rgba(0,128,255,.35)\";\r\n\t\t}\r\n\r\n\t\tqueueMicrotask(() => {\r\n\t\t\tmutatingRef.current = false;\r\n\t\t});\r\n\t};\r\n\r\n\t// IntersectionObserver, ResizeObserver, Event Listeners 설정\r\n\tuseEffect(() => {\r\n\t\tif (typeof window == \"undefined\") return;\r\n\t\tconst rootEl = rootRef.current;\r\n\t\tif (!rootEl) return;\r\n\r\n\t\tconst parentEl = rootEl.parentElement;\r\n\r\n\t\tconsole.log(parentEl);\r\n\t\tif (!parentEl) return;\r\n\r\n\t\tconst targets: Element[] = [parentEl];\r\n\r\n\t\tconst observerCallback = () => {\r\n\t\t\tif (!mutatingRef.current) scheduleUpdate();\r\n\t\t};\r\n\r\n\t\tconst io = new IntersectionObserver(observerCallback, {\r\n\t\t\troot: ioRoot instanceof Element ? ioRoot : null,\r\n\t\t\tthreshold: 0,\r\n\t\t\trootMargin: \"1px\",\r\n\t\t});\r\n\r\n\t\tconst ro = new ResizeObserver(observerCallback);\r\n\r\n\t\ttargets.forEach((t) => io.observe(t));\r\n\t\tro.observe(parentEl);\r\n\t\tif (contentRef.current) {\r\n\t\t\tro.observe(contentRef.current);\r\n\t\t}\r\n\r\n\t\tconst scrollTarget = ioRoot || window;\r\n\t\tscrollTarget.addEventListener(\"scroll\", scheduleUpdate, {\r\n\t\t\tpassive: true,\r\n\t\t});\r\n\t\twindow.addEventListener(\"resize\", scheduleUpdate);\r\n\r\n\t\t// 최초 1회 계산\r\n\t\tscheduleUpdate();\r\n\r\n\t\treturn () => {\r\n\t\t\tio.disconnect();\r\n\t\t\tro.disconnect();\r\n\t\t\tscrollTarget.removeEventListener(\"scroll\", scheduleUpdate);\r\n\t\t\twindow.removeEventListener(\"resize\", scheduleUpdate);\r\n\t\t\tif (rafId.current != null) {\r\n\t\t\t\tcancelAnimationFrame(rafId.current);\r\n\t\t\t\trafId.current = null;\r\n\t\t\t}\r\n\t\t};\r\n\t\t// eslint-disable-next-line react-hooks/exhaustive-deps\r\n\t}, [ioRoot, resolvedEdge, offset, debug]);\r\n\r\n\treturn (\r\n\t\t<div\r\n\t\t\tref={rootRef}\r\n\t\t\tclassName={className}\r\n\t\t\tstyle={{\r\n\t\t\t\tdisplay: \"block\",\r\n\t\t\t\tminWidth: 0,\r\n\t\t\t\tminHeight: 0,\r\n\t\t\t\theight: \"100%\", // 부모 높이를 채우도록 설정\r\n\t\t\t\t...style,\r\n\t\t\t}}\r\n\t\t\t{...rest}\r\n\t\t>\r\n\t\t\t<div\r\n\t\t\t\tref={contentRef}\r\n\t\t\t\t// SSR/클라이언트 첫 렌더 동일 → 마운트 후에만 스타일 부여\r\n\t\t\t\tstyle={contentDynamicStyle}\r\n\t\t\t>\r\n\t\t\t\t{children}\r\n\t\t\t</div>\r\n\t\t</div>\r\n\t);\r\n};\r\n\r\nexport default FlexLayoutStickyBox;\r\n"]}
|
|
1
|
+
{"version":3,"sources":["../../../src/flex-layout/components/FlexLayoutStickyBox.tsx"],"sourcesContent":["\"use client\";\r\nimport {\r\n\tCSSProperties,\r\n\tFC,\r\n\tHTMLAttributes,\r\n\tReactNode,\r\n\tRefObject,\r\n\tuseEffect,\r\n\tuseRef,\r\n\tuseState,\r\n} from \"react\";\r\n\r\ntype Edge = \"auto\" | \"top\" | \"bottom\" | \"left\" | \"right\";\r\n\r\ninterface FlexLayoutStickyBoxProps extends HTMLAttributes<HTMLDivElement> {\r\n\t/** 어느 방향으로 붙일지. 기본은 'auto' (세로 스크롤이면 top, 가로 스크롤이면 left) */\r\n\tedge?: Edge;\r\n\t/** 화면 모서리와의 여백(px). 기본 16 */\r\n\toffset?: number;\r\n\t/** 스크롤 루트. 명시 안 하면 가장 흔한 케이스인 <main> → 없으면 window(=viewport) */\r\n\tscrollRoot?: Element | null;\r\n\t/** 디버그 보조선 표시 */\r\n\tdebug?: boolean;\r\n\t/** 자식 */\r\n\tchildren: ReactNode;\r\n\r\n\ttransitionDurationMs?: number;\r\n\r\n\tonTranslateChange?: (\r\n\t\tvalue: number,\r\n\t\trootRef: RefObject<HTMLDivElement | null>,\r\n\t\tcontentRef: RefObject<HTMLDivElement | null>,\r\n\t) => void;\r\n}\r\n\r\nfunction clamp(n: number, min: number, max: number) {\r\n\treturn Math.max(min, Math.min(max, n));\r\n}\r\n\r\nfunction pickDefaultScrollRoot(): Element | null {\r\n\tif (typeof document === \"undefined\") return null;\r\n\r\n\tlet el: Element | null = document.body;\r\n\twhile (el && el !== document.documentElement && el !== document.body) {\r\n\t\tconst style = getComputedStyle(el);\r\n\t\tconst oy = style.overflowY;\r\n\t\tconst ox = style.overflowX;\r\n\t\tconst scrollable =\r\n\t\t\toy === \"auto\" ||\r\n\t\t\toy === \"scroll\" ||\r\n\t\t\tox === \"auto\" ||\r\n\t\t\tox === \"scroll\";\r\n\t\tif (scrollable) return el;\r\n\t\tel = el.parentElement;\r\n\t}\r\n\treturn null;\r\n}\r\n\r\nfunction isVerticalScroll(root: Element | null): boolean {\r\n\tif (typeof window == \"undefined\") return true;\r\n\tif (!root) {\r\n\t\treturn document.documentElement.scrollHeight > window.innerHeight + 1;\r\n\t}\r\n\tconst el = root as HTMLElement;\r\n\treturn el.scrollHeight > el.clientHeight + 1;\r\n}\r\n\r\nconst dpr = typeof window != \"undefined\" ? window.devicePixelRatio || 1 : 1;\r\nfunction quantizeToDevicePixel(n: number) {\r\n\treturn Math.round(n * dpr) / dpr;\r\n}\r\n\r\n/**\r\n * FlexLayoutStickyBox\r\n * 부모(실제 경계) 안에서만 움직이며, `transform`을 동적으로 부여해\r\n * “sticky처럼 보이도록” 만든다.\r\n *\r\n * 구조:\r\n * <div data-root> // 이 박스가 부모 경계 안에서 공간을 차지\r\n * <div data-content> // 이 박스가 transform으로 부드럽게 움직임\r\n * {children}\r\n * </div>\r\n * </div>\r\n */\r\nconst FlexLayoutStickyBox: FC<FlexLayoutStickyBoxProps> = ({\r\n\tedge = \"auto\",\r\n\toffset = 16,\r\n\tscrollRoot = null,\r\n\tdebug = false,\r\n\tchildren,\r\n\tstyle,\r\n\tclassName,\r\n\ttransitionDurationMs = 200,\r\n\tonTranslateChange = () => {},\r\n\t...rest\r\n}) => {\r\n\tconst offsetRef = useRef(offset);\r\n\tconst rootRef = useRef<HTMLDivElement>(null); // 내가 들어있는 박스(부모의 자식)\r\n\tconst contentRef = useRef<HTMLDivElement>(null); // 실제 내용\r\n\tconst mutatingRef = useRef(false);\r\n\tconst lastOffsetRef = useRef(0);\r\n\tconst [resolvedEdge, setResolvedEdge] = useState<Edge>(\"top\");\r\n\tconst rafId = useRef<number | null>(null);\r\n\r\n\t// 마운트 이후에만(클라이언트에서만) 터치 스타일을 적용\r\n\tconst [contentDynamicStyle, setContentDynamicStyle] =\r\n\t\tuseState<CSSProperties>({});\r\n\tuseEffect(() => {\r\n\t\t// if (\r\n\t\t// typeof navigator !== 'undefined' &&\r\n\t\t// (navigator.maxTouchPoints ?? 0) > 0\r\n\t\t// ) {\r\n\t\tsetContentDynamicStyle({\r\n\t\t\twillChange: \"transform\",\r\n\t\t\ttransition: `transform ${transitionDurationMs}ms linear`,\r\n\t\t});\r\n\t\t// }\r\n\t}, [transitionDurationMs]);\r\n\r\n\tuseEffect(() => {\r\n\t\toffsetRef.current = offset;\r\n\t\tscheduleUpdate();\r\n\t}, [offset]);\r\n\tconst [ioRoot, setIoRoot] = useState<Element | null>(null);\r\n\tuseEffect(() => {\r\n\t\t// CSR로 전환된 후에 반드시 최신 scroll root를 계산\r\n\t\tconst root = scrollRoot ?? pickDefaultScrollRoot();\r\n\t\tsetResolvedEdge(\r\n\t\t\tedge === \"auto\" ? (isVerticalScroll(root) ? \"top\" : \"left\") : edge,\r\n\t\t);\r\n\r\n\t\tsetIoRoot(root);\r\n\t}, [edge, scrollRoot]);\r\n\tuseEffect(() => {\r\n\t\tif (edge !== \"auto\") {\r\n\t\t\tsetResolvedEdge(edge);\r\n\t\t\treturn;\r\n\t\t}\r\n\t\tconst vertical = isVerticalScroll(ioRoot);\r\n\t\tsetResolvedEdge(vertical ? \"top\" : \"left\");\r\n\t}, [edge, ioRoot]);\r\n\r\n\tuseEffect(() => {}, []);\r\n\r\n\tconst scheduleUpdate = () => {\r\n\t\tif (rafId.current != null) return;\r\n\t\trafId.current = requestAnimationFrame(() => {\r\n\t\t\trafId.current = null;\r\n\t\t\tdoUpdate();\r\n\t\t});\r\n\t};\r\n\r\n\tconst doUpdate = () => {\r\n\t\tif (mutatingRef.current) return;\r\n\t\tmutatingRef.current = true;\r\n\r\n\t\tconst rootEl = rootRef.current;\r\n\t\tconst contentEl = contentRef.current;\r\n\t\tif (!rootEl || !contentEl) {\r\n\t\t\tmutatingRef.current = false;\r\n\t\t\treturn;\r\n\t\t}\r\n\r\n\t\tconst parentEl = rootEl.parentElement;\r\n\t\tif (!parentEl) {\r\n\t\t\tmutatingRef.current = false;\r\n\t\t\treturn;\r\n\t\t}\r\n\r\n\t\tconst rootBounds =\r\n\t\t\tioRoot && \"getBoundingClientRect\" in ioRoot\r\n\t\t\t\t? (ioRoot as Element).getBoundingClientRect()\r\n\t\t\t\t: new DOMRect(0, 0, window.innerWidth, window.innerHeight);\r\n\r\n\t\tconst parentRect = parentEl.getBoundingClientRect();\r\n\t\tconst contentRect = contentEl.getBoundingClientRect();\r\n\r\n\t\tlet newOffset = 0;\r\n\r\n\t\tif (resolvedEdge === \"top\" || resolvedEdge === \"bottom\") {\r\n\t\t\tconst maxTranslate = Math.max(\r\n\t\t\t\t0,\r\n\t\t\t\tparentRect.height - contentRect.height,\r\n\t\t\t);\r\n\t\t\tlet desiredTop = 0;\r\n\r\n\t\t\tif (resolvedEdge === \"top\") {\r\n\t\t\t\tdesiredTop =\r\n\t\t\t\t\trootBounds.top + offsetRef.current - parentRect.top;\r\n\t\t\t} else {\r\n\t\t\t\t// bottom\r\n\t\t\t\tconst targetBottomFromParentTop =\r\n\t\t\t\t\tMath.min(\r\n\t\t\t\t\t\tparentRect.bottom,\r\n\t\t\t\t\t\trootBounds.bottom - offsetRef.current,\r\n\t\t\t\t\t) - parentRect.top;\r\n\t\t\t\tdesiredTop = targetBottomFromParentTop - contentRect.height;\r\n\t\t\t}\r\n\t\t\tnewOffset = clamp(desiredTop, 0, maxTranslate);\r\n\t\t} else {\r\n\t\t\t// left or right\r\n\t\t\tconst maxTranslate = Math.max(\r\n\t\t\t\t0,\r\n\t\t\t\tparentRect.width - contentRect.width,\r\n\t\t\t);\r\n\t\t\tlet desiredLeft = 0;\r\n\r\n\t\t\tif (resolvedEdge === \"left\") {\r\n\t\t\t\tdesiredLeft =\r\n\t\t\t\t\trootBounds.left + offsetRef.current - parentRect.left;\r\n\t\t\t} else {\r\n\t\t\t\t// right\r\n\t\t\t\tconst targetRightFromParentLeft =\r\n\t\t\t\t\tMath.min(\r\n\t\t\t\t\t\tparentRect.right,\r\n\t\t\t\t\t\trootBounds.right - offsetRef.current,\r\n\t\t\t\t\t) - parentRect.left;\r\n\t\t\t\tdesiredLeft = targetRightFromParentLeft - contentRect.width;\r\n\t\t\t}\r\n\t\t\tnewOffset = clamp(desiredLeft, 0, maxTranslate);\r\n\t\t}\r\n\r\n\t\tconst nextOffset = quantizeToDevicePixel(newOffset);\r\n\r\n\t\t// 변화가 거의 없으면 업데이트 건너뛰기 (미세한 떨림 방지)\r\n\t\tif (Math.abs(lastOffsetRef.current - nextOffset) > 0.5) {\r\n\t\t\tif (resolvedEdge === \"top\" || resolvedEdge === \"bottom\") {\r\n\t\t\t\tcontentEl.style.transform = `translateY(${nextOffset}px)`;\r\n\t\t\t} else {\r\n\t\t\t\tcontentEl.style.transform = `translateX(${nextOffset}px)`;\r\n\t\t\t}\r\n\t\t\tlastOffsetRef.current = nextOffset;\r\n\t\t\tonTranslateChange(nextOffset, rootRef, contentRef);\r\n\t\t}\r\n\r\n\t\tif (debug) {\r\n\t\t\trootEl.style.outline = \"1px dashed rgba(0,0,0,.2)\";\r\n\t\t\tcontentEl.style.outline = \"1px solid rgba(0,128,255,.35)\";\r\n\t\t}\r\n\r\n\t\tqueueMicrotask(() => {\r\n\t\t\tmutatingRef.current = false;\r\n\t\t});\r\n\t};\r\n\r\n\t// IntersectionObserver, ResizeObserver, Event Listeners 설정\r\n\tuseEffect(() => {\r\n\t\tif (typeof window == \"undefined\") return;\r\n\t\tconst rootEl = rootRef.current;\r\n\t\tif (!rootEl) return;\r\n\r\n\t\tconst parentEl = rootEl.parentElement;\r\n\r\n\t\tconsole.log(parentEl);\r\n\t\tif (!parentEl) return;\r\n\r\n\t\tconst targets: Element[] = [parentEl];\r\n\r\n\t\tconst observerCallback = () => {\r\n\t\t\tif (!mutatingRef.current) scheduleUpdate();\r\n\t\t};\r\n\r\n\t\tconst io = new IntersectionObserver(observerCallback, {\r\n\t\t\troot: ioRoot instanceof Element ? ioRoot : null,\r\n\t\t\tthreshold: 0,\r\n\t\t\trootMargin: \"1px\",\r\n\t\t});\r\n\r\n\t\tconst ro = new ResizeObserver(observerCallback);\r\n\r\n\t\ttargets.forEach((t) => io.observe(t));\r\n\t\tro.observe(parentEl);\r\n\t\tif (contentRef.current) {\r\n\t\t\tro.observe(contentRef.current);\r\n\t\t}\r\n\r\n\t\tconst scrollTarget = ioRoot || window;\r\n\t\tscrollTarget.addEventListener(\"scroll\", scheduleUpdate, {\r\n\t\t\tpassive: true,\r\n\t\t});\r\n\t\twindow.addEventListener(\"resize\", scheduleUpdate);\r\n\r\n\t\t// 최초 1회 계산\r\n\t\tscheduleUpdate();\r\n\r\n\t\treturn () => {\r\n\t\t\tio.disconnect();\r\n\t\t\tro.disconnect();\r\n\t\t\tscrollTarget.removeEventListener(\"scroll\", scheduleUpdate);\r\n\t\t\twindow.removeEventListener(\"resize\", scheduleUpdate);\r\n\t\t\tif (rafId.current != null) {\r\n\t\t\t\tcancelAnimationFrame(rafId.current);\r\n\t\t\t\trafId.current = null;\r\n\t\t\t}\r\n\t\t};\r\n\t\t// eslint-disable-next-line react-hooks/exhaustive-deps\r\n\t}, [ioRoot, resolvedEdge, offset, debug]);\r\n\r\n\treturn (\r\n\t\t<div\r\n\t\t\tref={rootRef}\r\n\t\t\tclassName={className}\r\n\t\t\tstyle={{\r\n\t\t\t\tdisplay: \"block\",\r\n\t\t\t\tminWidth: 0,\r\n\t\t\t\tminHeight: 0,\r\n\t\t\t\theight: \"100%\", // 부모 높이를 채우도록 설정\r\n\t\t\t\t...style,\r\n\t\t\t}}\r\n\t\t\t{...rest}\r\n\t\t>\r\n\t\t\t<div\r\n\t\t\t\tref={contentRef}\r\n\t\t\t\t// SSR/클라이언트 첫 렌더 동일 → 마운트 후에만 스타일 부여\r\n\t\t\t\tstyle={contentDynamicStyle}\r\n\t\t\t>\r\n\t\t\t\t{children}\r\n\t\t\t</div>\r\n\t\t</div>\r\n\t);\r\n};\r\n\r\nexport default FlexLayoutStickyBox;\r\n"],"mappings":"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","names":[]}
|
|
@@ -1,52 +1,57 @@
|
|
|
1
|
-
|
|
2
|
-
|
|
3
|
-
var
|
|
4
|
-
var
|
|
5
|
-
var
|
|
6
|
-
var
|
|
7
|
-
var
|
|
8
|
-
var
|
|
9
|
-
var
|
|
10
|
-
|
|
11
|
-
|
|
12
|
-
|
|
13
|
-
|
|
14
|
-
|
|
15
|
-
|
|
16
|
-
|
|
17
|
-
|
|
18
|
-
|
|
19
|
-
|
|
20
|
-
|
|
21
|
-
|
|
22
|
-
|
|
23
|
-
|
|
24
|
-
|
|
25
|
-
|
|
1
|
+
"use strict";
|
|
2
|
+
var __create = Object.create;
|
|
3
|
+
var __defProp = Object.defineProperty;
|
|
4
|
+
var __getOwnPropDesc = Object.getOwnPropertyDescriptor;
|
|
5
|
+
var __getOwnPropNames = Object.getOwnPropertyNames;
|
|
6
|
+
var __getProtoOf = Object.getPrototypeOf;
|
|
7
|
+
var __hasOwnProp = Object.prototype.hasOwnProperty;
|
|
8
|
+
var __export = (target, all) => {
|
|
9
|
+
for (var name in all)
|
|
10
|
+
__defProp(target, name, { get: all[name], enumerable: true });
|
|
11
|
+
};
|
|
12
|
+
var __copyProps = (to, from, except, desc) => {
|
|
13
|
+
if (from && typeof from === "object" || typeof from === "function") {
|
|
14
|
+
for (let key of __getOwnPropNames(from))
|
|
15
|
+
if (!__hasOwnProp.call(to, key) && key !== except)
|
|
16
|
+
__defProp(to, key, { get: () => from[key], enumerable: !(desc = __getOwnPropDesc(from, key)) || desc.enumerable });
|
|
17
|
+
}
|
|
18
|
+
return to;
|
|
19
|
+
};
|
|
20
|
+
var __toESM = (mod, isNodeMode, target) => (target = mod != null ? __create(__getProtoOf(mod)) : {}, __copyProps(
|
|
21
|
+
// If the importer is in node compatibility mode or this is not an ESM
|
|
22
|
+
// file that has been converted to a CommonJS file using a Babel-
|
|
23
|
+
// compatible transform (i.e. "__esModule" has not been set), then set
|
|
24
|
+
// "default" to the CommonJS "module.exports" for node compatibility.
|
|
25
|
+
isNodeMode || !mod || !mod.__esModule ? __defProp(target, "default", { value: mod, enumerable: true }) : target,
|
|
26
|
+
mod
|
|
27
|
+
));
|
|
28
|
+
var __toCommonJS = (mod) => __copyProps(__defProp({}, "__esModule", { value: true }), mod);
|
|
29
|
+
var components_exports = {};
|
|
30
|
+
__export(components_exports, {
|
|
31
|
+
FlexLayout: () => import_FlexLayout.default,
|
|
32
|
+
FlexLayoutContainer: () => import_FlexLayoutContainer.default,
|
|
33
|
+
FlexLayoutResizePanel: () => import_FlexLayoutResizePanel.default,
|
|
34
|
+
FlexLayoutSplitScreen: () => import_FlexLayoutSplitScreen.default,
|
|
35
|
+
FlexLayoutSplitScreenDragBox: () => import_FlexLayoutSplitScreenDragBox.default,
|
|
36
|
+
FlexLayoutSplitScreenScrollBox: () => import_FlexLayoutSplitScreenScrollBox.default,
|
|
37
|
+
FlexLayoutStickyBox: () => import_FlexLayoutStickyBox.default
|
|
26
38
|
});
|
|
27
|
-
|
|
28
|
-
|
|
29
|
-
|
|
39
|
+
module.exports = __toCommonJS(components_exports);
|
|
40
|
+
var import_FlexLayout = __toESM(require("./FlexLayout"), 1);
|
|
41
|
+
var import_FlexLayoutContainer = __toESM(require("./FlexLayoutContainer"), 1);
|
|
42
|
+
var import_FlexLayoutResizePanel = __toESM(require("./FlexLayoutResizePanel"), 1);
|
|
43
|
+
var import_FlexLayoutSplitScreen = __toESM(require("./FlexLayoutSplitScreen"), 1);
|
|
44
|
+
var import_FlexLayoutSplitScreenDragBox = __toESM(require("./FlexLayoutSplitScreenDragBox"), 1);
|
|
45
|
+
var import_FlexLayoutSplitScreenScrollBox = __toESM(require("./FlexLayoutSplitScreenScrollBox"), 1);
|
|
46
|
+
var import_FlexLayoutStickyBox = __toESM(require("./FlexLayoutStickyBox"), 1);
|
|
47
|
+
// Annotate the CommonJS export names for ESM import in node:
|
|
48
|
+
0 && (module.exports = {
|
|
49
|
+
FlexLayout,
|
|
50
|
+
FlexLayoutContainer,
|
|
51
|
+
FlexLayoutResizePanel,
|
|
52
|
+
FlexLayoutSplitScreen,
|
|
53
|
+
FlexLayoutSplitScreenDragBox,
|
|
54
|
+
FlexLayoutSplitScreenScrollBox,
|
|
55
|
+
FlexLayoutStickyBox
|
|
30
56
|
});
|
|
31
|
-
Object.defineProperty(exports, "FlexLayoutResizePanel", {
|
|
32
|
-
enumerable: true,
|
|
33
|
-
get: function () { return FlexLayoutResizePanel__default.default; }
|
|
34
|
-
});
|
|
35
|
-
Object.defineProperty(exports, "FlexLayoutSplitScreen", {
|
|
36
|
-
enumerable: true,
|
|
37
|
-
get: function () { return FlexLayoutSplitScreen__default.default; }
|
|
38
|
-
});
|
|
39
|
-
Object.defineProperty(exports, "FlexLayoutSplitScreenDragBox", {
|
|
40
|
-
enumerable: true,
|
|
41
|
-
get: function () { return FlexLayoutSplitScreenDragBox__default.default; }
|
|
42
|
-
});
|
|
43
|
-
Object.defineProperty(exports, "FlexLayoutSplitScreenScrollBox", {
|
|
44
|
-
enumerable: true,
|
|
45
|
-
get: function () { return FlexLayoutSplitScreenScrollBox__default.default; }
|
|
46
|
-
});
|
|
47
|
-
Object.defineProperty(exports, "FlexLayoutStickyBox", {
|
|
48
|
-
enumerable: true,
|
|
49
|
-
get: function () { return FlexLayoutStickyBox__default.default; }
|
|
50
|
-
});
|
|
51
|
-
//# sourceMappingURL=index.cjs.map
|
|
52
57
|
//# sourceMappingURL=index.cjs.map
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"sources":[],"
|
|
1
|
+
{"version":3,"sources":["../../../src/flex-layout/components/index.ts"],"sourcesContent":["// src/flex-layout/components/index.ts\r\n\r\nexport { default as FlexLayout } from \"./FlexLayout\";\r\nexport { default as FlexLayoutContainer } from \"./FlexLayoutContainer\";\r\nexport { default as FlexLayoutResizePanel } from \"./FlexLayoutResizePanel\";\r\nexport { default as FlexLayoutSplitScreen } from \"./FlexLayoutSplitScreen\";\r\nexport { default as FlexLayoutSplitScreenDragBox } from \"./FlexLayoutSplitScreenDragBox\";\r\nexport { default as FlexLayoutSplitScreenScrollBox } from \"./FlexLayoutSplitScreenScrollBox\";\r\nexport { default as FlexLayoutStickyBox } from \"./FlexLayoutStickyBox\";\r\n"],"mappings":";;;;;;;;;;;;;;;;;;;;;;;;;;;;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAEA,wBAAsC;AACtC,iCAA+C;AAC/C,mCAAiD;AACjD,mCAAiD;AACjD,0CAAwD;AACxD,4CAA0D;AAC1D,iCAA+C;","names":[]}
|
|
@@ -1,9 +1,17 @@
|
|
|
1
|
-
|
|
2
|
-
|
|
3
|
-
|
|
4
|
-
|
|
5
|
-
|
|
6
|
-
|
|
7
|
-
|
|
8
|
-
|
|
1
|
+
import { default as default2 } from "./FlexLayout";
|
|
2
|
+
import { default as default3 } from "./FlexLayoutContainer";
|
|
3
|
+
import { default as default4 } from "./FlexLayoutResizePanel";
|
|
4
|
+
import { default as default5 } from "./FlexLayoutSplitScreen";
|
|
5
|
+
import { default as default6 } from "./FlexLayoutSplitScreenDragBox";
|
|
6
|
+
import { default as default7 } from "./FlexLayoutSplitScreenScrollBox";
|
|
7
|
+
import { default as default8 } from "./FlexLayoutStickyBox";
|
|
8
|
+
export {
|
|
9
|
+
default2 as FlexLayout,
|
|
10
|
+
default3 as FlexLayoutContainer,
|
|
11
|
+
default4 as FlexLayoutResizePanel,
|
|
12
|
+
default5 as FlexLayoutSplitScreen,
|
|
13
|
+
default6 as FlexLayoutSplitScreenDragBox,
|
|
14
|
+
default7 as FlexLayoutSplitScreenScrollBox,
|
|
15
|
+
default8 as FlexLayoutStickyBox
|
|
16
|
+
};
|
|
9
17
|
//# sourceMappingURL=index.js.map
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"sources":[],"
|
|
1
|
+
{"version":3,"sources":["../../../src/flex-layout/components/index.ts"],"sourcesContent":["// src/flex-layout/components/index.ts\r\n\r\nexport { default as FlexLayout } from \"./FlexLayout\";\r\nexport { default as FlexLayoutContainer } from \"./FlexLayoutContainer\";\r\nexport { default as FlexLayoutResizePanel } from \"./FlexLayoutResizePanel\";\r\nexport { default as FlexLayoutSplitScreen } from \"./FlexLayoutSplitScreen\";\r\nexport { default as FlexLayoutSplitScreenDragBox } from \"./FlexLayoutSplitScreenDragBox\";\r\nexport { default as FlexLayoutSplitScreenScrollBox } from \"./FlexLayoutSplitScreenScrollBox\";\r\nexport { default as FlexLayoutStickyBox } from \"./FlexLayoutStickyBox\";\r\n"],"mappings":"AAEA,SAAoB,WAAXA,gBAA6B;AACtC,SAAoB,WAAXA,gBAAsC;AAC/C,SAAoB,WAAXA,gBAAwC;AACjD,SAAoB,WAAXA,gBAAwC;AACjD,SAAoB,WAAXA,gBAA+C;AACxD,SAAoB,WAAXA,gBAAiD;AAC1D,SAAoB,WAAXA,gBAAsC;","names":["default"]}
|
|
@@ -1,21 +1,25 @@
|
|
|
1
|
-
|
|
2
|
-
|
|
3
|
-
var
|
|
4
|
-
var
|
|
5
|
-
|
|
6
|
-
|
|
7
|
-
|
|
8
|
-
|
|
9
|
-
|
|
10
|
-
|
|
11
|
-
|
|
12
|
-
|
|
1
|
+
"use strict";
|
|
2
|
+
var __defProp = Object.defineProperty;
|
|
3
|
+
var __getOwnPropDesc = Object.getOwnPropertyDescriptor;
|
|
4
|
+
var __getOwnPropNames = Object.getOwnPropertyNames;
|
|
5
|
+
var __hasOwnProp = Object.prototype.hasOwnProperty;
|
|
6
|
+
var __copyProps = (to, from, except, desc) => {
|
|
7
|
+
if (from && typeof from === "object" || typeof from === "function") {
|
|
8
|
+
for (let key of __getOwnPropNames(from))
|
|
9
|
+
if (!__hasOwnProp.call(to, key) && key !== except)
|
|
10
|
+
__defProp(to, key, { get: () => from[key], enumerable: !(desc = __getOwnPropDesc(from, key)) || desc.enumerable });
|
|
11
|
+
}
|
|
12
|
+
return to;
|
|
13
|
+
};
|
|
14
|
+
var __reExport = (target, mod, secondTarget) => (__copyProps(target, mod, "default"), secondTarget && __copyProps(secondTarget, mod, "default"));
|
|
15
|
+
var __toCommonJS = (mod) => __copyProps(__defProp({}, "__esModule", { value: true }), mod);
|
|
16
|
+
var hooks_exports = {};
|
|
17
|
+
module.exports = __toCommonJS(hooks_exports);
|
|
18
|
+
__reExport(hooks_exports, require("./useDrag"), module.exports);
|
|
19
|
+
__reExport(hooks_exports, require("./useListPaging"), module.exports);
|
|
20
|
+
// Annotate the CommonJS export names for ESM import in node:
|
|
21
|
+
0 && (module.exports = {
|
|
22
|
+
...require("./useDrag"),
|
|
23
|
+
...require("./useListPaging")
|
|
13
24
|
});
|
|
14
|
-
Object.keys(useListPaging).forEach(function (k) {
|
|
15
|
-
if (k !== 'default' && !Object.prototype.hasOwnProperty.call(exports, k)) Object.defineProperty(exports, k, {
|
|
16
|
-
enumerable: true,
|
|
17
|
-
get: function () { return useListPaging[k]; }
|
|
18
|
-
});
|
|
19
|
-
});
|
|
20
|
-
//# sourceMappingURL=index.cjs.map
|
|
21
25
|
//# sourceMappingURL=index.cjs.map
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"sources":[],"
|
|
1
|
+
{"version":3,"sources":["../../../src/flex-layout/hooks/index.ts"],"sourcesContent":["export * from \"./useDrag\";\r\nexport * from \"./useListPaging\";\r\n"],"mappings":";;;;;;;;;;;;;;;AAAA;AAAA;AAAA,0BAAc,sBAAd;AACA,0BAAc,4BADd;","names":[]}
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"sources":[],"
|
|
1
|
+
{"version":3,"sources":["../../../src/flex-layout/hooks/index.ts"],"sourcesContent":["export * from \"./useDrag\";\r\nexport * from \"./useListPaging\";\r\n"],"mappings":"AAAA,cAAc;AACd,cAAc;","names":[]}
|