@@ -31,6 +31,7 @@ module Yoga.Block.Internal
3131 , unsafeAddProps
3232 , createRef
3333 , getBoundingBoxFromRef
34+ , getClientDimensionsFromRef
3435 , getElementFromRef
3536 , getHTMLElementFromRef
3637 , getOffsetHeightFromRef
@@ -44,6 +45,7 @@ module Yoga.Block.Internal
4445 ) where
4546
4647import Prelude
48+
4749import Control.Monad.Cont.Trans (lift)
4850import Control.Monad.Maybe.Trans (MaybeT(..), runMaybeT)
4951import Data.Array as Array
@@ -64,11 +66,12 @@ import React.Basic.Emotion as E
6466import React.Basic.Events (EventHandler)
6567import React.Basic.Hooks (JSX, ReactComponent, Ref, Render, readRefMaybe)
6668import Record.Extra (class Keys, keys)
69+import Record.Unsafe.Union (unsafeUnion)
6770import Type.Proxy (Proxy(..))
6871import Unsafe.Coerce (unsafeCoerce)
6972import Untagged.Union (UndefinedOr, uorToMaybe)
7073import Web.DOM (Element, Node)
71−import Web.DOM.Element (scrollHeight, scrollWidth, DOMRect, getBoundingClientRect)
74+import Web.DOM.Element (DOMRect, clientHeight, clientWidth, getBoundingClientRect, scrollHeight, scrollWidth)
7275import Web.DOM.Element as Element
7376import Web.DOM.NonElementParentNode (getElementById)
7477import Web.HTML (window)
@@ -78,7 +81,6 @@ import Web.HTML.HTMLElement as HTMLElement
7881import Web.HTML.Window (document)
7982import Yoga.Block.Internal.CSS (_0)
8083import Yoga.Block.Internal.OptionalProp (OptionalProp(..), Id, appendIfDefined, asOptional, composeHandler, getOr, getOrFlipped, ifTrue, isTruthy, maybeToOp, opToMaybe, setOrDelete, unsafeUnMaybe, unsafeUnOptional, (<>?), (?||))
81−import Record.Unsafe.Union (unsafeUnion)
8284
8385unsafeAddProps ∷ ∀ r s. { | r } → { | s } → { | r }
8486unsafeAddProps = unsafeUnion
@@ -154,6 +156,15 @@ getScrollDimensionsFromRef itemRef =
154156 height <- lift $ scrollHeight elem
155157 pure { width, height }
156158
159+getClientDimensionsFromRef ∷ NodeRef -> Effect (Maybe { height ∷ Number, width ∷ Number })
160+getClientDimensionsFromRef itemRef =
161+ runMaybeT do
162+ node <- MaybeT $ readRefMaybe itemRef
163+ elem <- MaybeT $ pure $ Element.fromNode node
164+ width <- lift $ clientWidth elem
165+ height <- lift $ clientHeight elem
166+ pure { width, height }
167+
157168getHTMLElementFromRef ∷ Ref (Nullable Node) -> Effect (Maybe HTMLElement)
158169getHTMLElementFromRef itemRef =
159170 runMaybeT do
@@ -748,4 +759,4 @@ type ButtonReadablePropsNoChildrenF f more =
748759 , vocab ∷ f String
749760 , wmode ∷ f String
750761 | more
751− )
762+ )