1module Container.Header where
5import Control.Alt ((<|>))
6import Data.Int (toNumber)
7import Data.Maybe (Maybe(..), fromMaybe)
8import Data.Monoid (guard)
9import Data.Nullable (null)
10import Debug.Trace (spy)
12import React.Basic.DOM (css)
13import React.Basic.DOM as R
14import React.Basic.Hooks (ReactComponent, component, element, readRef, readRefMaybe, useEffect, useLayoutEffect, useRef, useState, writeRef, (/\))
15import React.Basic.Hooks as React
16import SVG.Icon (pslogoIcon)
17import Theme.Styles (makeStyles)
18import Theme.Types (CSSTheme)
19import Typography.Header (HeadingLevel(..), mkH)
20import Web.Event.Event (EventType(..))
21import Web.Event.EventTarget (addEventListener, eventListener, removeEventListener)
22import Web.HTML (window)
23import Web.HTML.HTMLElement (offsetTop)
24import Web.HTML.HTMLElement as HTMLElement
25import Web.HTML.Window (scrollY, toEventTarget)
27mkHeader ∷ Effect (ReactComponent {})
31 makeStyles \(theme ∷ CSSTheme) ->
34 { backgroundColor: theme.backgroundColour
35 , borderBottom: "1px solid " <> theme.highlightColour
37 , fontFamily: theme.textFontFamily
40 , alignItems: "center"
44 , sticky: css { position: "fixed", top: "0" }
51 , fill: theme.textColour
54 useScrollYPosition <- mkUseScrollYPosition
55 component "Header" \{} -> React.do
57 mustBeSticky /\ modifyMustBeSticky <- useState false
58 nodeY /\ modifyNodeY <- useState 0
59 nodeOffset /\ modifyONP <- useState Nothing
60 nodeRef <- useRef null
61 scrollYPos <- useScrollYPosition
62 useEffect scrollYPos do
63 maybeNode <- readRefMaybe nodeRef
64 let maybeElem = maybeNode >>= HTMLElement.fromNode
66 Nothing -> pure (pure unit)
68 offset <- offsetTop element
71 Nothing -> Just offset
72 let offset' = fromMaybe offset nodeOffset
74 if toNumber scrollYPos > offset'
82 , className: classes.header <> " " <> guard mustBeSticky classes.sticky
84 [ R.div { children: [ element pslogoIcon {} ], className: classes.logo }
85 , element h { level: H2, text: "Purescript", className: Nothing }
89mkUseScrollYPosition = do
90 initialPosition <- window >>= scrollY
92 scrollPosY /\ modifyScrollPosY <- useState initialPosition
93 useLayoutEffect unit do
94 target <- window <#> toEventTarget
95 let eventType = EventType "scroll"
96 listener <- eventListener
97 \_ -> window >>= scrollY >>= \newPos -> modifyScrollPosY (const newPos)
98 addEventListener eventType listener false target
99 let _ = spy "registered event listener" unit
101 removeEventListener eventType listener false target
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