@@ -4,24 +4,25 @@ import Prelude
4import Data.Array (mapWithIndex, zip, (!!))
4import Data.Array (mapWithIndex, zip, (!!))
5import Data.Array as Array
5import Data.Array as Array
6import Data.FoldableWithIndex (findWithIndex)
6import Data.FoldableWithIndex (findWithIndex)
7+import Data.Interpolate as Interp
7import Data.Lens (set)
8import Data.Lens (set)
8import Data.Lens.Index (ix)
9import Data.Lens.Index (ix)
9import Data.Maybe (Maybe(..), fromMaybe)
10import Data.Maybe (Maybe(..), fromMaybe)
10import Data.Nullable (Nullable)
11import Data.Nullable (Nullable)
11import Data.Nullable as Nullable
12import Data.Nullable as Nullable
13+import Data.Symbol (SProxy(..))
12import Data.Traversable (for, sequence)
14import Data.Traversable (for, sequence)
13import Data.Tuple.Nested ((/\), type (/\))
15import Data.Tuple.Nested ((/\), type (/\))
14−import Debug.Trace (spy)
15import Effect (Effect)
16import Effect (Effect)
16−import Effect.Aff (Milliseconds(..), delay, launchAff_)
17import Justifill (justifill)
17import Justifill (justifill)
18import React.Basic (ReactComponent)
18import React.Basic (ReactComponent)
19import React.Basic.DOM (css)
19import React.Basic.DOM (css)
20import React.Basic.Helpers (jsx)
20import 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)
22import React.Basic.Hooks as React
22import React.Basic.Hooks as React
23import React.Basic.Hooks.Spring (animatedDiv, useSprings)
23import React.Basic.Hooks.Spring (animatedDiv, useSprings)
24import React.Basic.Hooks.UseGesture (useDrag, withDragProps)
24import React.Basic.Hooks.UseGesture (useDrag, withDragProps)
25+import Record as Record
25import Record.Extra (pick)
26import Record.Extra (pick)
26import Unsafe.Coerce (unsafeCoerce)
27import Unsafe.Coerce (unsafeCoerce)
27import Web.DOM (Node)
28import Web.DOM (Node)
@@ -81,8 +82,20 @@ makeComponent = do
81 useStyles <- makeStylesJSS styles
82 useStyles <- makeStylesJSS styles
82 component "Grimoire" \(props ∷ Props) -> React.do
83 component "Grimoire" \(props ∷ Props) -> React.do
83 {} <- useStyles (pick props)
84 {} <- 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+ let
86+ defaultSprings = \_ ->
91+ , borderRadius: "var(--s-2)"
93+ , immediate: const false
94+ , transform: "scale3d(1.0,1.0,1.0)"
97+ useSprings (Array.length props.spells) defaultSprings
85− nodeRefs <- useRef (props.spells $> (Nullable.null ∷ (_ Node)))
98+ nodeRefs <- useRef (props.spells $> Nullable.null)
86 positionsRef <- useRef ([] ∷ _ DOMRect)
99 positionsRef <- useRef ([] ∷ _ DOMRect)
87 originalPositionsRef <- useRef ([] ∷ _ DOMRect)
100 originalPositionsRef <- useRef ([] ∷ _ DOMRect)
88 initialisedRef <- useRef false
101 initialisedRef <- useRef false
@@ -95,19 +108,15 @@ makeComponent = do
95 writeRef positionsRef (rects <#> fromMaybe emptyDomRect)
108 writeRef positionsRef (rects <#> fromMaybe emptyDomRect)
96 writeRef originalPositionsRef (rects <#> fromMaybe emptyDomRect)
109 writeRef originalPositionsRef (rects <#> fromMaybe emptyDomRect)
97 writeRef initialisedRef true
110 writeRef initialisedRef true
98− useEffect windowSize do
111+ useLayoutEffect windowSize do
99 writeRef initialisedRef false
113 writeRef initialisedRef false
100− positions <- readRef positionsRef
114+ springs.set defaultSprings
102− newOriginalPositions = positions
103− writeRef positionsRef newOriginalPositions
106 theme ∷ CSSTheme <- useTheme
116 theme ∷ CSSTheme <- useTheme
107 bindDragProps <-
117 bindDragProps <-
108− useDrag (justifill {}) \{ arg, down, movement: mx /\ my } -> do
118+ useDrag (justifill { filterTaps: true }) \{ arg, down, movement: mx /\ my } -> do
110− rects <- getRects nodeRefs
111 originalPositions <- readRef originalPositionsRef
120 originalPositions <- readRef originalPositionsRef
112 positionsBefore <- readRef positionsRef
121 positionsBefore <- readRef positionsRef
@@ -144,7 +153,10 @@ makeComponent = do
144 { x: originalPosDragged.left - value.left + leftOffset
153 { x: originalPosDragged.left - value.left + leftOffset
145 , y: originalPosDragged.top - value.top + topOffset
154 , y: originalPosDragged.top - value.top + topOffset
146 , zIndex: 0
155 , zIndex: 0
147 , transform: "scale3d(1.0, 1.0, 1.0)"
158 , transform: "scale3d(1.0, 1.0, 1.0)"
159+ , borderRadius: "var(--s-2)"
148 , immediate: const false
160 , immediate: const false
150 true, true, _ ->
162 true, true, _ ->
@@ -152,11 +164,17 @@ makeComponent = do
152 , y: my + topOffset
164 , y: my + topOffset
153 , zIndex: 1
165 , zIndex: 1
154 , transform: "scale3d(1.1, 1.1, 1.1)"
166 , transform: "scale3d(1.1, 1.1, 1.1)"
167+ , borderRadius: "var(--s-2)"
155 , immediate: \n -> n == "x" || n == "y" || n == "zIndex"
170 , immediate: \n -> n == "x" || n == "y" || n == "zIndex"
157 _, _, _ ->
172 _, _, _ ->
158 { x: leftOffset
173 { x: leftOffset
159 , y: topOffset
174 , y: topOffset
177+ , borderRadius: "var(--s-2)"
160 , zIndex: 0
178 , zIndex: 0
161 , transform: "scale3d(1.0, 1.0, 1.0)"
179 , transform: "scale3d(1.0, 1.0, 1.0)"
162 , immediate: const false
180 , immediate: const false
@@ -165,7 +183,7 @@ makeComponent = do
165 renderSpells =
183 renderSpells =
166 mapWithIndex \i (spell /\ style) ->
184 mapWithIndex \i (spell /\ style) ->
167 animatedDiv
185 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)
169 , ref: unsafeCoerce (unsafeUpdateRefs nodeRefs i)
187 , ref: unsafeCoerce (unsafeUpdateRefs nodeRefs i)
170 , children:
188 , children:
171 [ element
189 [ element