1module Container.Header where
4import CSS.Safer (cssSafer)
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 React.Basic.DOM as R
13import React.Basic.Hooks (type (/\), Hook, ReactComponent, Ref, UseLayoutEffect, UseRef, UseState, coerceHook, component, element, readRefMaybe, useLayoutEffect, useRef, useState, (/\))
14import React.Basic.Hooks as React
15import SVG.Icon (trianglelogoIcon)
16import Scroll.Listener as Scroll
17import Theme.Styles (makeStyles)
18import Theme.Types (CSSTheme)
19import Typography.Header (HeadingLevel(..), mkH)
21import Web.Event.EventTarget (EventListener, eventListener)
22import Web.HTML (HTMLElement, window)
23import Web.HTML.HTMLElement (offsetTop)
24import Web.HTML.HTMLElement as HTMLElement
25import Web.HTML.Window (scrollY)
27mkHeader ∷ Effect (ReactComponent {})
31 makeStyles \(theme ∷ CSSTheme) ->
34 { backgroundColor: theme.interfaceColour
36 , fontFamily: theme.headingFontFamily
39 , alignItems: "center"
40 , justifyContent: "flex-end"
44 , paddingBottom: "10px"
46 , sticky: cssSafer { position: "fixed", top: "0", zIndex: 10 }
47 , title: cssSafer { paddingRight: "30px" }
55 , fill: theme.textColour
58 component "Header" \{} -> React.do
60 shouldBeSticky /\ nodeRef <- useShouldBeSticky
64 , className: classes.header <> " " <> guard shouldBeSticky classes.sticky
66 [ element h { level: H2, text: "Rowtype Yoga", className: Just classes.title }
67 , R.div { children: [ element trianglelogoIcon {} ], className: classes.logo }
71newtype UseShouldBeSticky hooks
72 = UseShouldBeSticky (UseLayoutEffect Unit (UseState Boolean (UseRef (Nullable Node) hooks)))
74derive instance ntUseShouldBeSticky ∷ Newtype (UseShouldBeSticky hooks) _
76useShouldBeSticky ∷ Hook UseShouldBeSticky (Boolean /\ Ref (Nullable Node))
79 nodeRef <- useRef null
80 mustBeSticky /\ modifyMustBeSticky <- useState false
82 setSticky = modifyMustBeSticky <<< const
83 useLayoutEffect unit do
84 maybeNode <- readRefMaybe nodeRef
85 case maybeNode >>= HTMLElement.fromNode of
87 log "Could not register listener because there was no node"
90 listener <- makeListener setSticky element
91 Scroll.registerListener listener
92 pure (mustBeSticky /\ nodeRef)
94makeListener ∷ (Boolean -> Effect Unit) -> HTMLElement -> Effect EventListener
95makeListener setSticky element = do
96 nodeStartPos <- offsetTop element
99 yPos <- window >>= scrollY <#> toNumber
100 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