git.iko.soy/rowtype-yoga/psfp
on master help sign in
Fix some stuff
commit3d6eb2fd95e015f937465fe3165632c4ba270535 authorMark Eibes <mark.eibes@gmail.com> dateFri 8 May 2020, 12:34 (6 years ago) parentc8302a6
17 files changed+139−160
blog/src/components/PSLayout.purs−1 blog/static/fonts/PragmataProLiga-Regular.woff blog/static/fonts/PragmataProLiga-Regular.woff2 client/src/Container/Component.purs+4−4 client/src/Container/Header.purs+2−1 client/src/Container/Landing.purs+12−12 client/src/Container/Sidebar.purs+5−4 client/src/Container/Stories.purs+1−1 client/src/Decorator/FullScreen.purs−119 components/src/React/Basic/Hooks/Spring.js+1−1 components/src/Yoga/Grimoire/Component.purs+48−11 components/src/Yoga/Grimoire/Spell/Component.purs+1−1 components/src/Yoga/Grimoire/Spell/Spec.purs+1−1 components/src/Yoga/Grimoire/Spell/Styles.purs+7−3 components/src/Yoga/Resize/Hook.purs+39 components/src/Yoga/Resize/Listener.purs+17 components/src/Yoga/Theme/Default.purs+1−1
blog/src/components/PSLayout.purs−1
@@ -215,7 +215,6 @@ mkMdxProviderComponent compiler = do
215215 , pre:
216216 mkFn2 \(props ∷ PreProps) other -> do
217217 let
218− _ = spy "other" other
219218
220219 childrenQ = Nullable.toMaybe props.children
221220
blog/static/fonts/PragmataProLiga-Regular.woffdeleted

Binary file not shown.

blog/static/fonts/PragmataProLiga-Regular.woff2deleted

Binary file not shown.

client/src/Container/Component.purs+4−4
@@ -13,6 +13,7 @@ import React.Basic.DOM as R
1313import React.Basic.Hooks (ReactComponent, component, element, useRef, useState, (/\))
1414import React.Basic.Hooks as React
1515import Yoga.CompileEditor.Component (mkCompileEditor)
16+import Yoga.Compiler.Api (apiCompiler)
1617import Yoga.Polyfill.SmoothScrolling (smoothScrollPolyfill)
1718import Yoga.SVG.Icon (appendIcon, applyflippedIcon, bindIcon, mapIcon)
1819import Yoga.Theme.Provider (mkThemeProvider)
@@ -40,8 +41,7 @@ mkContainerContent = do
4041 $ jssClasses \(theme ∷ CSSTheme) ->
4142 { container:
4243 jss
43− { fontFamily: theme.textFontFamily
44− , color: theme.textColour
44+ { color: theme.textColour
4545 , display: "flex"
4646 , flexDirection: "column"
4747 , width: "100%"
@@ -55,13 +55,13 @@ mkContainerContent = do
5555 , paddingLeft: "100px"
5656 , zIndex: 0
5757 }
58− , icon: jss { fill: "theme.textColour" }
58+ , icon: jss { fill: theme.textColour }
5959 }
6060 landingPage <- mkLandingPage
6161 sidebar <- mkSidebar
6262 header <- mkHeader
6363 sidebarLink <- mkSidebarLink
64− editor <- mkCompileEditor windowFetch
64+ editor <- mkCompileEditor (apiCompiler windowFetch)
6565 component "ContainerContent" \{ kids } -> React.do
6666 classes <- useStyles {}
6767 collapsed /\ modifyCollapsed <- useState true
client/src/Container/Header.purs+2−1
@@ -1,6 +1,7 @@
11module Container.Header where
22
33import Prelude
4+import Data.Foldable (intercalate)
45import Data.Int (toNumber)
56import Data.Maybe (Maybe(..))
67import Data.Monoid (guard)
@@ -34,7 +35,7 @@ mkHeader = do
3435 jss
3536 { backgroundColor: theme.interfaceColour
3637 , borderBottom: "0"
37− , fontFamily: theme.headingFontFamily
38+ , fontFamily: intercalate ", " theme.headingFontFamily
3839 , gridArea: "header"
3940 , display: "flex"
4041 , alignItems: "center"
client/src/Container/Landing.purs+12−12
@@ -8,6 +8,7 @@ import Effect.Uncurried (runEffectFn1)
88import JSS (jss, jssClasses)
99import React.Basic.DOM as R
1010import React.Basic.Events (handler_)
11+import React.Basic.Helpers (jsx)
1112import React.Basic.Hooks (ReactComponent, component, element, readRefMaybe, useRef)
1213import React.Basic.Hooks as React
1314import Unsafe.Coerce (unsafeCoerce)
@@ -82,6 +83,7 @@ mkLandingPage = do
8283 , landingImage:
8384 jss
8485 { position: "absolute"
86+ , maxWidth: "none"
8587 , width: "100%"
8688 , height: "100%"
8789 }
@@ -112,21 +114,19 @@ mkLandingPage = do
112114 , R.div
113115 { className: classes.actionButton
114116 , children:
115− [ element button
116− { buttonProps:
117− { onClick:
118− handler_ do
119− maybeNode <- readRefMaybe ref
120− for_ (maybeNode >>= HTMLElement.fromNode) \n -> do
121− height <- getBoundingClientRect n <#> _.height
122− win <- window
123− runEffectFn1 ((unsafeCoerce win).scrollTo)
124− { top: height, left: 0, behavior: "smooth" }
125− }
117+ [ jsx button
118+ { onClick:
119+ handler_ do
120+ maybeNode <- readRefMaybe ref
121+ for_ (maybeNode >>= HTMLElement.fromNode) \n -> do
122+ height <- getBoundingClientRect n <#> _.height
123+ win <- window
124+ runEffectFn1 ((unsafeCoerce win).scrollTo)
125+ { top: height, left: 0, behavior: "smooth" }
126126 , buttonType: HighlightedButton
127− , kids: [ R.text buttonText ]
128127 , className: classes.actualActionButton
129128 }
129+ [ R.text buttonText ]
130130 ]
131131 }
132132 ]
client/src/Container/Sidebar.purs+5−4
@@ -1,6 +1,7 @@
11module Container.Sidebar where
22
33import Prelude
4+import Data.Foldable (intercalate)
45import Data.Monoid (guard)
56import Effect (Effect)
67import JSS (jss, jssClasses)
@@ -28,7 +29,7 @@ mkSidebar = do
2829 { sidebar:
2930 jss
3031 { background: theme.interfaceColourLighter
31− , fontFamily: theme.textFontFamily
32+ , fontFamily: intercalate ", " theme.textFontFamily
3233 , borderRadius: "0 12px 12px 0"
3334 , color: theme.textColour
3435 , position: "absolute"
@@ -86,7 +87,7 @@ mkSidebarLink = do
8687 $ jssClasses \(theme ∷ CSSTheme) ->
8788 { sidebarEntry:
8889 jss
89− { fontFamily: theme.headingFontFamily
90+ { fontFamily: intercalate ", " theme.headingFontFamily
9091 , alignSelf: "flex-end"
9192 , justifyContent: "space-between"
9293 , alignContent: "stretch"
@@ -106,7 +107,7 @@ mkSidebarLink = do
106107 }
107108 , label:
108109 jss
109− { fontFamily: theme.textFontFamily
110+ { fontFamily: intercalate ", " theme.textFontFamily
110111 , color: theme.textColour
111112 , paddingLeft: "20px"
112113 , textTransform: "uppercase"
@@ -121,7 +122,7 @@ mkSidebarLink = do
121122 , transition: "0.2s ease-in-out"
122123 , transitionDelay: "0.1s"
123124 , alignSelf: "flex-end"
124− , fill: theme.textColour <> " !important"
125+ , fill: theme.textColour
125126 }
126127 }
127128 component "SidebarLink" \{ name, icon, collapsed } -> React.do
client/src/Container/Stories.purs+1−1
@@ -2,10 +2,10 @@ module Container.Stories where
22
33import Prelude hiding (add)
44import Container.Component (mkContainer)
5−import Decorator.FullScreen (fullScreenDecorator)
65import Effect (Effect)
76import React.Basic.Hooks (component, element)
87import React.Basic.Hooks as React
8+import Storybook.Decorator.FullScreen (fullScreenDecorator)
99import Storybook.React (Storybook, add, addDecorator, storiesOf)
1010import Yoga.Theme.Styles (useTheme)
1111
client/src/Decorator/FullScreen.pursdeleted−119
@@ -1,119 +0,0 @@
1−module Decorator.FullScreen where
2−
3−import Prelude
4−import Data.Array (find)
5−import Data.Map (Map)
6−import Data.Maybe (Maybe, fromMaybe)
7−import Data.Traversable (traverse_)
8−import Effect (Effect)
9−import JSS (jss, jssClasses)
10−import React.Basic (JSX)
11−import React.Basic.DOM (css)
12−import React.Basic.DOM as R
13−import React.Basic.DOM.Events (targetValue)
14−import React.Basic.Events (handler)
15−import React.Basic.Hooks (ReactComponent, component, element, useState, (/\))
16−import React.Basic.Hooks as React
17−import Simple.JSON (readJSON_, writeJSON)
18−import Web.HTML (window)
19−import Web.HTML.Window (localStorage)
20−import Web.Storage.Storage (getItem, setItem)
21−import Yoga.Font.Rubik as Rubik
22−import Yoga.Font.VictorMono as VictorMono
23−import Yoga.Theme (fromTheme)
24−import Yoga.Theme.Default (darkTheme, lightTheme)
25−import Yoga.Theme.Provider (mkThemeProvider)
26−import Yoga.Theme.Styles (makeStylesJSS)
27−import Yoga.Theme.Types (CSSTheme)
28−
29−fullScreenDecorator ∷ Effect JSX -> Effect JSX
30−fullScreenDecorator mkChild = do
31− let
32− dark = fromTheme darkTheme
33−
34− light = fromTheme lightTheme
35− child <- mkChild
36− themeSwitcher <- mkThemeSwitcher
37− pure
38− $ R.div
39− { style:
40− css
41− { minWidth: "100vw"
42− , height: "100vh"
43− }
44− , children:
45− [ element themeSwitcher
46− { kids: [ child ]
47− , defaultTheme: { name: "Dark", theme: dark }
48− , themes:
49− [ { name: "Dark", theme: dark }
50− , { name: "Light", theme: light }
51− ]
52− }
53− ]
54− }
55−
56−type ThemesWithNames
57− = Map String CSSTheme
58−
59−type DefaultTheme
60− = { name ∷ String, theme ∷ CSSTheme }
61−
62−mkThemeSwitcher ∷
63− Effect
64− ( ReactComponent { defaultTheme ∷ DefaultTheme, themes ∷ Array DefaultTheme, kids ∷ Array JSX }
65− )
66−mkThemeSwitcher = do
67− themeProvider <- mkThemeProvider
68− useStyles <-
69− makeStylesJSS
70− $ jssClasses \_ ->
71− { selector:
72− jss
73− { position: "fixed"
74− , zIndex: 20
75− , top: 10
76− , right: 10
77− }
78− , "@font-face": jss $ Rubik.fontFamilies <> VictorMono.fontFamilies
79− }
80− storage <- window >>= localStorage
81− saved ∷ (Maybe DefaultTheme) <- getItem "theme" storage <#> (_ >>= readJSON_)
82− component "ThemeSwitcher" \{ defaultTheme, themes, kids } -> React.do
83− classes <- useStyles {}
84− { theme, name } /\ modTheme <- useState $ fromMaybe defaultTheme saved
85− let
86− setTheme newTheme = do
87− setItem "theme" (writeJSON newTheme) storage
88− modTheme (const newTheme)
89− let
90− handleClicked maybeValue =
91− traverse_ setTheme do
92− value <- maybeValue
93− themes # find \x -> x.name == value
94− let
95− themeSelect =
96− R.select
97− { onChange: handler targetValue handleClicked
98− , value: name
99− , className: classes.selector
100− , children:
101− themes
102− <#> \x ->
103− R.option
104− { value: x.name
105− , key: x.name
106− , children: [ R.text x.name ]
107− }
108− }
109− pure
110− $ element themeProvider
111− { theme
112− , children:
113− [ R.div
114− { style: css { backgroundColor: theme.backgroundColour, width: "100%", height: "100%" }
115− , children:
116− [ themeSelect ] <> kids
117− }
118− ]
119− }
components/src/React/Basic/Hooks/Spring.js+1−1
@@ -1,13 +1,13 @@
11"use strict";
22Object.defineProperty(exports, "__esModule", { value: true });
33var react_spring_1 = require("react-spring");
4+exports.interpolateImpl = react_spring_1.interpolate;
45exports.useSpringImpl = function (mkStyles) { return function () {
56 var result = react_spring_1.useSpring(mkStyles);
67 return { style: result[0], set: result[1], stop: result[2] };
78}; };
89exports.useSpringsImpl = function (n) { return function (fn) { return function () {
910 var result = react_spring_1.useSprings(n, fn);
10− console.log("REEEEEEEEESLUT", result);
1111 return { styles: result[0], set: result[1], stop: result[2] };
1212}; }; };
1313exports.useTransitionImpl = react_spring_1.useTransition;
components/src/Yoga/Grimoire/Component.purs+48−11
@@ -6,18 +6,19 @@ import Data.Array as Array
66import Data.FoldableWithIndex (findWithIndex)
77import Data.Lens (set)
88import Data.Lens.Index (ix)
9−import Data.Maybe (Maybe(..), fromMaybe, isJust)
9+import Data.Maybe (Maybe(..), fromMaybe)
1010import Data.Nullable (Nullable)
1111import Data.Nullable as Nullable
1212import Data.Traversable (for, sequence)
1313import Data.Tuple.Nested ((/\), type (/\))
1414import Debug.Trace (spy)
1515import Effect (Effect)
16+import Effect.Aff (Milliseconds(..), delay, launchAff_)
1617import Justifill (justifill)
1718import React.Basic (ReactComponent)
1819import React.Basic.DOM (css)
1920import React.Basic.Helpers (jsx)
20−import React.Basic.Hooks (Ref, component, element, readRef, useLayoutEffect, useRef, writeRef)
21+import React.Basic.Hooks (Ref, component, element, readRef, useEffect, useRef, writeRef)
2122import React.Basic.Hooks as React
2223import React.Basic.Hooks.Spring (animatedDiv, useSprings)
2324import React.Basic.Hooks.UseGesture (useDrag, withDragProps)
@@ -30,6 +31,7 @@ import Yoga.Grid.Component as Grid
3031import Yoga.Grimoire.Spell.Component as GrimoireSpell
3132import Yoga.Grimoire.Styles (styles)
3233import Yoga.Helpers ((?||))
34+import Yoga.Resize.Hook (useResize)
3335import Yoga.Spell.Types (Spell)
3436import Yoga.Theme.Styles (makeStylesJSS, useTheme)
3537import Yoga.Theme.Types (CSSTheme)
@@ -83,14 +85,28 @@ makeComponent = do
8385 nodeRefs <- useRef (props.spells $> (Nullable.null ∷ (_ Node)))
8486 positionsRef <- useRef ([] ∷ _ DOMRect)
8587 originalPositionsRef <- useRef ([] ∷ _ DOMRect)
86− useLayoutEffect unit do
87− rects <- getRects nodeRefs
88− writeRef positionsRef (rects <#> fromMaybe emptyDomRect)
89− writeRef originalPositionsRef (rects <#> fromMaybe emptyDomRect)
88+ initialisedRef <- useRef false
89+ windowSize <- useResize
90+ let
91+ init = do
92+ initialised <- readRef initialisedRef
93+ unless initialised do
94+ rects <- getRects nodeRefs
95+ writeRef positionsRef (rects <#> fromMaybe emptyDomRect)
96+ writeRef originalPositionsRef (rects <#> fromMaybe emptyDomRect)
97+ writeRef initialisedRef true
98+ useEffect windowSize do
99+ writeRef initialisedRef false
100+ positions <- readRef positionsRef
101+ let
102+ newOriginalPositions = positions
103+ writeRef positionsRef newOriginalPositions
104+ init
90105 mempty
91106 theme ∷ CSSTheme <- useTheme
92107 bindDragProps <-
93− useDrag (justifill {}) \{ arg, down, movement: mx /\ my, xy: x /\ y } -> do
108+ useDrag (justifill {}) \{ arg, down, movement: mx /\ my } -> do
109+ init
94110 rects <- getRects nodeRefs
95111 originalPositions <- readRef originalPositionsRef
96112 positionsBefore <- readRef positionsRef
@@ -101,7 +117,10 @@ makeComponent = do
101117
102118 overlapsOtherBefore = positionsBefore # findWithIndex \i' pos -> i' /= arg && overlaps currentPosDraggedBefore pos
103119 case down, overlapsOtherBefore of
104− false, Just { index, value } -> writeRef positionsRef (swap arg index positionsBefore ?|| positionsBefore)
120+ false, Just { index, value } -> do
121+ let
122+ swapped = swap arg index positionsBefore ?|| positionsBefore
123+ writeRef positionsRef swapped
105124 _, _ -> mempty
106125 positions <- readRef positionsRef
107126 let
@@ -121,9 +140,27 @@ makeComponent = do
121140 topOffset = if iPos == origIPos then 0.0 else iPos.top - origIPos.top
122141 case i == arg, down, overlapsOther of
123142 false, true, Just { index, value }
124− | index == i -> { x: originalPosDragged.left - value.left + leftOffset, y: originalPosDragged.top - value.top + topOffset, zIndex: 0, transform: "scale3d(1.0, 1.0, 1.0)", immediate: const false }
125− true, true, _ -> { x: mx + leftOffset, y: my + topOffset, zIndex: 1, transform: "scale3d(1.1, 1.1, 1.1)", immediate: \n -> n == "x" || n == "y" || n == "zIndex" }
126− _, _, _ -> { x: leftOffset, y: topOffset, zIndex: 0, transform: "scale3d(1.0, 1.0, 1.0)", immediate: const false }
143+ | index == i ->
144+ { x: originalPosDragged.left - value.left + leftOffset
145+ , y: originalPosDragged.top - value.top + topOffset
146+ , zIndex: 0
147+ , transform: "scale3d(1.0, 1.0, 1.0)"
148+ , immediate: const false
149+ }
150+ true, true, _ ->
151+ { x: mx + leftOffset
152+ , y: my + topOffset
153+ , zIndex: 1
154+ , transform: "scale3d(1.1, 1.1, 1.1)"
155+ , immediate: \n -> n == "x" || n == "y" || n == "zIndex"
156+ }
157+ _, _, _ ->
158+ { x: leftOffset
159+ , y: topOffset
160+ , zIndex: 0
161+ , transform: "scale3d(1.0, 1.0, 1.0)"
162+ , immediate: const false
163+ }
127164 let
128165 renderSpells =
129166 mapWithIndex \i (spell /\ style) ->
components/src/Yoga/Grimoire/Spell/Component.purs+1−1
@@ -56,7 +56,7 @@ makeComponent = do
5656 ]
5757 ]
5858 pure
59− $ jsx card { divRef: props.cardRef }
59+ $ jsx card { divRef: props.cardRef, className: style.card }
6060 [ jsx box { className: style.container, padding: "var(--s-1)" }
6161 [ jsx stack { space: "var(--s-3)" }
6262 [ headerCluster
components/src/Yoga/Grimoire/Spell/Spec.purs+1−1
@@ -1,4 +1,4 @@
1−module Yoga.Grimoire.Spell.Spec where
1+module Yoga.Spell.Spec where
22
33import Prelude
44import Justifill (justifill)
components/src/Yoga/Grimoire/Spell/Styles.purs+7−3
@@ -1,11 +1,10 @@
11module Yoga.Grimoire.Spell.Styles where
22
33import Prelude hiding (top)
4−import CSS (ColorSpace(..), backgroundColor, border, borderRadius, color, fontFamily, fontSize, fontStyle, height, mix, pct, sansSerif, solid, width)
4+import CSS (backgroundColor, color, fontFamily, fontSize, fontStyle, height, pct, sansSerif, width)
55import CSS.FontStyle (italic)
66import CSS.TextAlign (rightTextAlign, textAlign)
77import Data.Array (fromFoldable)
8−import Data.NonEmpty (NonEmpty(..))
98import Data.NonEmpty as NonEmpty
109import JSS (JSSClasses, JSSElem, jss, jssClasses)
1110import Yoga.Theme.Types (YogaTheme)
@@ -20,13 +19,18 @@ type Classes a
2019 = ( container ∷ a
2120 , signature ∷ a
2221 , description ∷ a
22+ , card ∷ a
2323 , name ∷ a
2424 )
2525
2626styles ∷ JSSClasses YogaTheme Props (Classes (JSSElem Props))
2727styles =
2828 jssClasses \theme@{ s0, s1, s4, s5, s_5 } ->
29− { container:
29+ { card:
30+ do
31+ width (100.0 # pct)
32+ height (100.0 # pct)
33+ , container:
3034 jss { userSelect: "none" }
3135 <> jss do
3236 backgroundColor theme.backgroundColourLighter
components/src/Yoga/Resize/Hook.pursnew file+39
@@ -0,0 +1,39 @@
1+module Yoga.Resize.Hook where
2+
3+import Prelude
4+import Data.Int (toNumber)
5+import Data.Newtype (class Newtype)
6+import Effect (Effect)
7+import React.Basic.Hooks (Hook, UseLayoutEffect, UseState, coerceHook, useLayoutEffect, useState, (/\))
8+import React.Basic.Hooks as React
9+import Web.Event.EventTarget (EventListener, eventListener)
10+import Web.HTML (window)
11+import Web.HTML.Window (innerHeight, innerWidth)
12+import Yoga.Resize.Listener as Resize
13+
14+newtype UseResize hooks
15+ = UseResize (UseLayoutEffect Unit (UseState { width ∷ Number, height ∷ Number } hooks))
16+
17+derive instance ntUseResize ∷ Newtype (UseResize hooks) _
18+useResize ∷ Hook UseResize { width ∷ Number, height ∷ Number }
19+useResize =
20+ coerceHook React.do
21+ size /\ updateSize <- useState { width: 0.0, height: 0.0 }
22+ let
23+ setSize = updateSize <<< const
24+ useLayoutEffect unit do
25+ setSizeFromWindow setSize
26+ listener <- makeListener setSize
27+ Resize.registerListener listener
28+ pure size
29+
30+setSizeFromWindow setSize = do
31+ win <- window
32+ width <- innerWidth win <#> toNumber
33+ height <- innerHeight win <#> toNumber
34+ setSize { width, height }
35+
36+makeListener ∷ ({ height ∷ Number, width ∷ Number } -> Effect Unit) -> Effect EventListener
37+makeListener setSize = do
38+ eventListener
39+ $ const (setSizeFromWindow setSize)
components/src/Yoga/Resize/Listener.pursnew file+17
@@ -0,0 +1,17 @@
1+module Yoga.Resize.Listener (registerListener) where
2+
3+import Prelude
4+import Effect (Effect)
5+import Web.Event.Event (EventType(..))
6+import Web.Event.EventTarget (EventListener, addEventListener, removeEventListener)
7+import Web.HTML (window)
8+import Web.HTML.Window (toEventTarget)
9+
10+eventType ∷ EventType
11+eventType = EventType "resize"
12+
13+registerListener ∷ EventListener -> Effect (Effect Unit)
14+registerListener listener = do
15+ target <- window <#> toEventTarget
16+ addEventListener eventType listener false target
17+ pure $ removeEventListener eventType listener false target
components/src/Yoga/Theme/Default.purs+1−1
@@ -49,7 +49,7 @@ lightTheme =
4949 { textColour = Color.hsl 220.0 0.18 0.30
5050 , backgroundColour = Color.hsl 30.0 0.50 0.96
5151 , interfaceColour = Color.hsl 210.0 0.10 0.89
52− , highlightColour = Color.hsl 350.0 0.93 0.62
52+ , highlightColour = Color.hsl 350.0 0.93 0.67
5353 , altHighlightColour = Color.hsl 84.0 0.617 0.631
5454 , green = Color.hsl 170.0 0.39 0.40
5555 , purple = Color.hsl 284.0 0.64 0.60