1module Container.Header where
4import Data.Foldable (intercalate)
5import Data.Int (toNumber)
6import Data.Maybe (Maybe(..))
7import Data.Monoid (guard)
8import Data.Newtype (class Newtype)
9import Data.Nullable (Nullable, null)
11import Effect.Class.Console (log)
12import JSS (jss, jssClasses)
13import React.Basic.DOM as R
14import React.Basic.Hooks (type (/\), Hook, ReactComponent, Ref, UseLayoutEffect, UseRef, UseState, coerceHook, component, element, readRefMaybe, useLayoutEffect, useRef, useState, (/\))
15import React.Basic.Hooks as React
17import Web.Event.EventTarget (EventListener, eventListener)
18import Web.HTML (HTMLElement, window)
19import Web.HTML.HTMLElement (offsetTop)
20import Web.HTML.HTMLElement as HTMLElement
21import Web.HTML.Window (scrollY)
22import Yoga.SVG.Icon (trianglelogoIcon)
23import Yoga.Scroll.Listener as Scroll
24import Yoga.Theme.Styles (makeStylesJSS)
25import Yoga.Theme.Types (CSSTheme)
26import Yoga.Typography.Header (HeadingLevel(..), mkH)
28mkHeader ∷ Effect (ReactComponent {})
33 $ jssClasses \(theme ∷ CSSTheme) ->
36 { backgroundColor: theme.interfaceColour
38 , fontFamily: intercalate ", " theme.headingFontFamily
41 , alignItems: "center"
42 , justifyContent: "flex-end"
46 , paddingBottom: "10px"
48 , sticky: jss { position: "fixed", top: "0", zIndex: 10 }
49 , title: jss { paddingRight: "30px" }
57 , fill: theme.textColour
60 component "Header" \{} -> React.do
61 classes <- useStyles {}
62 shouldBeSticky /\ nodeRef <- useShouldBeSticky
66 , className: classes.header <> " " <> guard shouldBeSticky classes.sticky
68 [ element h { level: H2, text: "Rowtype Yoga", className: Just classes.title }
69 , R.div { children: [ element trianglelogoIcon {} ], className: classes.logo }
73newtype UseShouldBeSticky hooks
74 = UseShouldBeSticky (UseLayoutEffect Unit (UseState Boolean (UseRef (Nullable Node) hooks)))
76derive instance ntUseShouldBeSticky ∷ Newtype (UseShouldBeSticky hooks) _
77useShouldBeSticky ∷ Hook UseShouldBeSticky (Boolean /\ Ref (Nullable Node))
80 nodeRef <- useRef null
81 mustBeSticky /\ modifyMustBeSticky <- useState false
83 setSticky = modifyMustBeSticky <<< const
84 useLayoutEffect unit do
85 maybeNode <- readRefMaybe nodeRef
86 case maybeNode >>= HTMLElement.fromNode of
88 log "Could not register listener because there was no node"
91 listener <- makeListener setSticky element
92 Scroll.registerListener listener
93 pure (mustBeSticky /\ nodeRef)
95makeListener ∷ (Boolean -> Effect Unit) -> HTMLElement -> Effect EventListener
96makeListener setSticky element = do
97 nodeStartPos <- offsetTop element
100 yPos <- window >>= scrollY <#> toNumber
101 setSticky $ nodeStartPos < yPos
keysesc to close
- j k
- move down, up
- enter
- open
- esc
- back, or up a level
- 1 2 3 4
- readme, files, commits, refs
- /
- filter
- y
- copy the clone command
- c
- compare the chosen commit with another (or shift-click both)
- ?
- show or hide this list