5import Data.Array as Array
6import Data.Array.NonEmpty as NEA
7import Data.Maybe (Maybe(..), fromMaybe)
8import Data.Nullable (Nullable)
9import Data.Nullable as Nullable
10import Data.String as String
11import Data.Tuple.Nested ((/\))
12import Debug.Trace (spy)
14import JSS (jss, jssClasses)
15import Justifill (justifill)
16import Milkis.Impl (FetchImpl)
17import React.Basic (JSX, ReactComponent)
18import React.Basic.DOM (unsafeCreateDOMComponent)
19import React.Basic.DOM as R
20import React.Basic.Helpers (jsx)
21import React.Basic.Hooks (ReactChildren, component, componentWithChildren, element, reactChildrenToArray, useEffect, useState)
22import React.Basic.Hooks as React
23import Unsafe.Coerce (unsafeCoerce)
24import Yoga.Box.Component as Box
25import Yoga.CompileEditor.Component (mkCompileEditor)
26import Yoga.Compiler.Api (apiCompiler)
27import Yoga.FillInTheGaps.Component as FillInTheGaps
28import Yoga.FillInTheGaps.Logic (parseSegments)
29import Yoga.Header.Component (mkHeader)
30import Yoga.Helpers ((?||))
31import Yoga.InlineCode.Component as InlineCode
32import Yoga.Theme (fromTheme)
33import Yoga.Theme.CSSBaseline (mkCssBaseline)
34import Yoga.Theme.Default (darkTheme)
35import Yoga.Theme.Provider (mkThemeProvider)
36import Yoga.Theme.Styles (makeStylesJSS)
37import Yoga.Theme.Types (CSSTheme)
38import Yoga.Typography.Header (HeadingLevel(..), mkH)
39import Yoga.Typography.Paragraph (mkP)
40import Yoga.WithSidebar.Component (makeComponent) as WithSidebar
46 , menuLinks ∷ Array { name ∷ String, link ∷ String }
56 { mdxType ∷ Nullable String
57 , children ∷ Nullable String
58 , className ∷ Nullable String
67 { children ∷ ReactChildren JSX
68 , siteInfo ∷ SiteQueryResult
71mkLayout fetchImpl = do
72 themeProvider <- mkThemeProvider
73 mdxProviderComponent <- mkMdxProviderComponent fetchImpl
74 componentWithChildren "MDXLayout" \{ children, siteInfo } -> React.do
76 $ element themeProvider
77 { theme: fromTheme darkTheme
79 [ element mdxProviderComponent
86mkSecret ∷ Effect (ReactComponent { kids ∷ Array JSX, visible ∷ Boolean, register ∷ Effect Unit })
88 component "Secret" \{ kids, visible, register } -> React.do
90 unless visible register
94 { style: R.css { visibility: if visible then "visible" else "hidden" }
98mkMdxProviderComponent ∷
102 { children ∷ ReactChildren JSX
103 , siteInfo ∷ SiteQueryResult
106mkMdxProviderComponent fetchImpl = do
107 cssBaseline <- mkCssBaseline
108 editor <- mkCompileEditor fetchImpl
109 fillInTheGaps <- FillInTheGaps.makeComponent
110 box <- Box.makeComponent
113 yogaInlineCode <- InlineCode.makeComponent
119 $ jssClasses \(theme ∷ CSSTheme) ->
121 { fontFamily: theme.codeFontFamily # NEA.head
122 , backgroundColor: theme.interfaceColour
124 , border: "1px solid #383c39"
126 , borderRadius: "3px"
130 , flexDirection: "row"
133 componentWithChildren "MDXProviderComponent" \{ children, siteInfo } -> React.do
134 classes <- useStyles {}
135 visibleThroughKey /\ updateVisible <- useState ""
137 baseline child = element cssBaseline { kids: child }
139 kids = reactChildrenToArray children
144 i <- kids # A.findIndex (\x -> (unsafeCoerce x).key == visibleThroughKey)
145 pure $ A.take (i + 1) kids
150 [ jsx header { className: "" } [ R.text siteInfo.site.siteMetadata.title ]
151 , element sidebar { links: siteInfo.site.siteMetadata.menuLinks }
152 , jsx box {} visibleKids
159 element h ({ level: H2, text: props.children, className: Nothing })
162 element h { level: H3, text: props.children, className: Nothing }
165 element h { level: H4, text: props.children, className: Nothing }
169 { children: [ element p { text: props.children } ]
172 -- \props -> jsx secret { register: updateSections (Map.insert ) }
175 R.span { className: classes.code, children: props.children }
177 \(props ∷ PreProps) -> do
179 childrenQ = Nullable.toMaybe props.children
181 propsQ = (_.props >>> Nullable.toMaybe) =<< childrenQ
183 mdxTypeQ = (_.mdxType >>> Nullable.toMaybe) =<< propsQ
185 childrenQ2 = (_.children >>> Nullable.toMaybe) =<< propsQ
187 classNameQ = (_.className >>> Nullable.toMaybe) =<< propsQ
189 isCode = fromMaybe false (mdxTypeQ <#> eq "code")
194 (fromMaybe 200 >>> show >>> (_ <> "px")) do
197 ( String.split (String.Pattern "\n") code
199 # \x -> (x * 12) + 100
202 language = fromMaybe "" (classNameQ >>= String.stripPrefix (String.Pattern "language-"))
203 case isCode, language of
205 element fillInTheGaps
206 { initialSegments: parseSegments (codeQ ?|| "")
207 , update: \segs -> pure unit
211 { initialCode: fromMaybe "" codeQ
215 false, _ -> element (unsafeCreateDOMComponent "pre") props
217 useEffect (A.length kids) do
219 firstGaps = kids # A.find (\x -> (unsafeCoerce x).props.mdxType == "pre" && ((unsafeCoerce x).props.children.props.className == "language-puregaps")) <#> (\x -> (unsafeCoerce x).key)
221 lastKey = kids # A.last # unsafeCoerce # _.key
222 updateVisible (const (firstGaps ?|| lastKey))
226 [ element mdxProvider
230 , components: mdxComponents
235 withSidebar <- WithSidebar.makeComponent
238 $ jssClasses \(theme ∷ CSSTheme) ->
242 , flexDirection: "row"
247 component "Sidebar" \{ links } -> React.do
248 classes <- useStyles {}
250 $ element withSidebar
252 { sidebarChildren: [ R.div_ [ R.text "hahahaha" ] ]
253 , notSidebarChildren: [] ∷ Array JSX
257foreign import mdxProvider ∷
260 { components ∷ { | r } -- TODO Don't lie
261 , children ∷ Array JSX
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