@@ -4,24 +4,25 @@ import Prelude
44import Data.Array (mapWithIndex, zip, (!!))
55import Data.Array as Array
66import Data.FoldableWithIndex (findWithIndex)
7+import Data.Interpolate as Interp
78import Data.Lens (set)
89import Data.Lens.Index (ix)
910import Data.Maybe (Maybe(..), fromMaybe)
1011import Data.Nullable (Nullable)
1112import Data.Nullable as Nullable
13+import Data.Symbol (SProxy(..))
1214import Data.Traversable (for, sequence)
1315import Data.Tuple.Nested ((/\), type (/\))
14−import Debug.Trace (spy)
1516import Effect (Effect)
16−import Effect.Aff (Milliseconds(..), delay, launchAff_)
1717import Justifill (justifill)
1818import React.Basic (ReactComponent)
1919import React.Basic.DOM (css)
2020import React.Basic.Helpers (jsx)
21−import React.Basic.Hooks (Ref, component, element, readRef, useEffect, useRef, writeRef)
21+import React.Basic.Hooks (Ref, component, element, readRef, useLayoutEffect, useRef, writeRef)
2222import React.Basic.Hooks as React
2323import React.Basic.Hooks.Spring (animatedDiv, useSprings)
2424import React.Basic.Hooks.UseGesture (useDrag, withDragProps)
25+import Record as Record
2526import Record.Extra (pick)
2627import Unsafe.Coerce (unsafeCoerce)
2728import Web.DOM (Node)
@@ -81,8 +82,20 @@ makeComponent = do
8182 useStyles <- makeStylesJSS styles
8283 component "Grimoire" \(props ∷ Props) -> React.do
8384 {} <- useStyles (pick props)
84− springs <- useSprings (Array.length props.spells) \_ -> { x: 0.0, y: 0.0, zIndex: 0, immediate: false, transform: "scale3d(1.0,1.0,1.0)" }
85− nodeRefs <- useRef (props.spells $> (Nullable.null ∷ (_ Node)))
85+ let
86+ defaultSprings = \_ ->
87+ { x: 0.0
88+ , y: 0.0
89+ , height: "100px"
90+ , shadow: 2
91+ , borderRadius: "var(--s-2)"
92+ , zIndex: 0
93+ , immediate: const false
94+ , transform: "scale3d(1.0,1.0,1.0)"
95+ }
96+ springs <-
97+ useSprings (Array.length props.spells) defaultSprings
98+ nodeRefs <- useRef (props.spells $> Nullable.null)
8699 positionsRef <- useRef ([] ∷ _ DOMRect)
87100 originalPositionsRef <- useRef ([] ∷ _ DOMRect)
88101 initialisedRef <- useRef false
@@ -95,19 +108,15 @@ makeComponent = do
95108 writeRef positionsRef (rects <#> fromMaybe emptyDomRect)
96109 writeRef originalPositionsRef (rects <#> fromMaybe emptyDomRect)
97110 writeRef initialisedRef true
98− useEffect windowSize do
111+ useLayoutEffect windowSize do
112+ springs.stop
99113 writeRef initialisedRef false
100− positions <- readRef positionsRef
101− let
102− newOriginalPositions = positions
103− writeRef positionsRef newOriginalPositions
104− init
114+ springs.set defaultSprings
105115 mempty
106116 theme ∷ CSSTheme <- useTheme
107117 bindDragProps <-
108− useDrag (justifill {}) \{ arg, down, movement: mx /\ my } -> do
118+ useDrag (justifill { filterTaps: true }) \{ arg, down, movement: mx /\ my } -> do
109119 init
110− rects <- getRects nodeRefs
111120 originalPositions <- readRef originalPositionsRef
112121 positionsBefore <- readRef positionsRef
113122 let
@@ -144,7 +153,10 @@ makeComponent = do
144153 { x: originalPosDragged.left - value.left + leftOffset
145154 , y: originalPosDragged.top - value.top + topOffset
146155 , zIndex: 0
156+ , shadow: 2
157+ , height: "100px"
147158 , transform: "scale3d(1.0, 1.0, 1.0)"
159+ , borderRadius: "var(--s-2)"
148160 , immediate: const false
149161 }
150162 true, true, _ ->
@@ -152,11 +164,17 @@ makeComponent = do
152164 , y: my + topOffset
153165 , zIndex: 1
154166 , transform: "scale3d(1.1, 1.1, 1.1)"
167+ , borderRadius: "var(--s-2)"
168+ , height: "100px"
169+ , shadow: 20
155170 , immediate: \n -> n == "x" || n == "y" || n == "zIndex"
156171 }
157172 _, _, _ ->
158173 { x: leftOffset
159174 , y: topOffset
175+ , shadow: 2
176+ , height: "100px"
177+ , borderRadius: "var(--s-2)"
160178 , zIndex: 0
161179 , transform: "scale3d(1.0, 1.0, 1.0)"
162180 , immediate: const false
@@ -165,7 +183,7 @@ makeComponent = do
165183 renderSpells =
166184 mapWithIndex \i (spell /\ style) ->
167185 animatedDiv
168− $ { style: css style
186+ $ { style: css (Record.insert (SProxy ∷ _ "boxShadow") ((unsafeCoerce (style.shadow ∷ Int)).interpolate (\s -> Interp.i "rgba(0, 0, 0, 0.15) 0px " s "px " (2 * s) "px 0px" ∷ String)) style)
169187 , ref: unsafeCoerce (unsafeUpdateRefs nodeRefs i)
170188 , children:
171189 [ element