From 971ab462180bc3f8a727fdc26ff1d07c3f5b63eb Mon Sep 17 00:00:00 2001 From: Steven Vandevelde Date: Thu, 7 Mar 2019 16:03:24 +0100 Subject: [PATCH] Insert demo tape --- src/Applications/UI.elm | 22 +++-- src/Applications/UI/Authentication.elm | 2 +- src/Applications/UI/Core.elm | 1 + src/Applications/UI/Kit.elm | 49 ++++++++--- src/Applications/UI/Reply.elm | 1 + src/Applications/UI/Settings/ImportExport.elm | 4 +- src/Applications/UI/Sources/Form.elm | 6 +- src/Applications/UI/Tracks.elm | 81 ++++++++++++++++--- src/Applications/UI/Tracks/Core.elm | 3 +- src/Applications/UI/Tracks/Scene/List.elm | 3 +- src/Applications/UI/UserData.elm | 16 +++- src/Library/Chunky.elm | 7 +- 12 files changed, 156 insertions(+), 39 deletions(-) diff --git a/src/Applications/UI.elm b/src/Applications/UI.elm index 23f92c0c..190414c1 100644 --- a/src/Applications/UI.elm +++ b/src/Applications/UI.elm @@ -336,7 +336,7 @@ update msg model = ----------------------------------------- -- Import / Export ----------------------------------------- - Export -> + Core.Export -> ( model , File.Download.string "diffuse.json" @@ -350,7 +350,7 @@ update msg model = ) ) - Import file -> + Core.Import file -> ( { model | isLoading = True } , 250 |> Process.sleep @@ -358,7 +358,7 @@ update msg model = |> Task.perform ImportJson ) - ImportJson json -> + Core.ImportJson json -> let notification = Notifications.success "Imported data successfully!" @@ -376,7 +376,14 @@ update msg model = |> N5.andThen2 (update <| ShowNotification notification) |> R2.addCmd (do <| ChangeUrlUsingPage Page.Index) - RequestImport -> + Core.InsertDemo -> + model + |> update (LoadHypaethralUserData UserData.demo) + |> N5.andThen2 (update Core.SaveFavourites) + |> N5.andThen2 (update Core.SaveSources) + |> N5.andThen2 (update Core.SaveTracks) + + Core.RequestImport -> ( model , File.Select.file [ "application/json" ] Import ) @@ -451,6 +458,9 @@ translateReply reply = Reply.GoToPage page -> ChangeUrlUsingPage page + Reply.InsertDemo -> + Core.InsertDemo + Reply.PlayTrack identifiedTrack -> QueueMsg (Queue.InjectFirstAndPlay identifiedTrack) @@ -648,8 +658,8 @@ defaultScreen model = -- Main ----------------------------------------- , UI.Kit.vessel - [ model.tracks - |> Lazy.lazy3 Tracks.view model.page model.viewport.height + [ model + |> Tracks.view |> Html.map TracksMsg -- Pages diff --git a/src/Applications/UI/Authentication.elm b/src/Applications/UI/Authentication.elm index 19da510d..21231ddc 100644 --- a/src/Applications/UI/Authentication.elm +++ b/src/Applications/UI/Authentication.elm @@ -175,7 +175,7 @@ view model = , Html.Styled.Events.onInput FabricateSecretKey ] , UI.Kit.button - UI.Kit.WithText + UI.Kit.Normal (SignIn method) (text "Continue") ] diff --git a/src/Applications/UI/Core.elm b/src/Applications/UI/Core.elm index 5a304b20..523c060c 100644 --- a/src/Applications/UI/Core.elm +++ b/src/Applications/UI/Core.elm @@ -116,6 +116,7 @@ type Msg | Export | Import File | ImportJson String + | InsertDemo | RequestImport ----------------------------------------- -- Notifications diff --git a/src/Applications/UI/Kit.elm b/src/Applications/UI/Kit.elm index 97d84997..b82b3c34 100644 --- a/src/Applications/UI/Kit.elm +++ b/src/Applications/UI/Kit.elm @@ -1,4 +1,4 @@ -module UI.Kit exposing (ButtonType(..), button, buttonFocus, buttonWithColor, canister, centeredContent, colorKit, colors, defaultFontFamilies, h1, h2, h3, headerFontFamilies, inlineIcon, inputFocus, insulationWidth, intro, label, link, logoBackdrop, navFocus, receptacle, select, textArea, textField, textFocus, vessel) +module UI.Kit exposing (ButtonType(..), button, buttonFocus, buttonLink, buttonWithColor, buttonWithOptions, canister, centeredContent, colorKit, colors, defaultFontFamilies, h1, h2, h3, headerFontFamilies, inlineIcon, inputFocus, insulationWidth, intro, label, link, logoBackdrop, navFocus, receptacle, select, textArea, textField, textFocus, vessel) import Chunky exposing (..) import Color @@ -174,8 +174,8 @@ maxInputWidth = type ButtonType - = WithIcon - | WithText + = IconOnly + | Normal button : ButtonType -> msg -> Html msg -> Html msg @@ -183,32 +183,59 @@ button = buttonWithColor colorKit.accent +buttonLink : String -> ButtonType -> Html msg -> Html msg +buttonLink theHref buttonType = + buttonWithOptions Html.a [ href theHref ] colorKit.accent buttonType Nothing + + buttonWithColor : Color.Color -> ButtonType -> msg -> Html msg -> Html msg -buttonWithColor buttonColor buttonType msg child = +buttonWithColor color buttonType msg = + buttonWithOptions Html.button [] color buttonType (Just msg) + + +buttonWithOptions : + (List (Html.Attribute msg) -> List (Html msg) -> Html msg) + -> List (Html.Attribute msg) + -> Color.Color + -> ButtonType + -> Maybe msg + -> Html msg + -> Html msg +buttonWithOptions tag attributes buttonColor buttonType maybeMsg child = slab - Html.button - [ css (buttonStyles buttonColor) - , onClick msg - ] + tag + (List.append + attributes + [ css (buttonStyles buttonColor) + , case maybeMsg of + Just msg -> + onClick msg + + Nothing -> + style "carry" "on" + ] + ) [ borderRadius , T.b__solid , T.bg_transparent , T.bw1 + , T.dib , T.f6 , T.fw7 + , T.no_underline , T.ph3 , T.pointer , T.pv2 ] [ case buttonType of - WithIcon -> + IconOnly -> slab Html.span [ style "font-size" "0" ] [ T.dib, T.lh_solid, T.v_top ] [ child ] - WithText -> + Normal -> chunk [ T.lh_copy ] [ child ] @@ -465,8 +492,6 @@ inlineIconStyles : List Css.Style inlineIconStyles = [ Css.fontSize (px 0) , Css.lineHeight (px 0) - , Css.position Css.relative - , Css.top (px -1) , Css.verticalAlign Css.sub -- diff --git a/src/Applications/UI/Reply.elm b/src/Applications/UI/Reply.elm index 4fd60ed4..508acf96 100644 --- a/src/Applications/UI/Reply.elm +++ b/src/Applications/UI/Reply.elm @@ -20,6 +20,7 @@ type Reply | Chill | FillQueue | GoToPage Page + | InsertDemo | PlayTrack IdentifiedTrack | ProcessSources | RemoveTracksWithSourceId String diff --git a/src/Applications/UI/Settings/ImportExport.elm b/src/Applications/UI/Settings/ImportExport.elm index 0f8524cf..2d72a343 100644 --- a/src/Applications/UI/Settings/ImportExport.elm +++ b/src/Applications/UI/Settings/ImportExport.elm @@ -48,7 +48,7 @@ view = , chunk [ T.mb2, T.mt4 ] [ UI.Kit.label [] "Import" ] , UI.Kit.buttonWithColor UI.Kit.colorKit.base05 - WithText + Normal UI.Core.RequestImport (text "Choose file") @@ -56,7 +56,7 @@ view = --------- , chunk [ T.mb2, T.mt4 ] [ UI.Kit.label [] "Export" ] , UI.Kit.button - WithText + Normal UI.Core.Export (text "Export data") ] diff --git a/src/Applications/UI/Sources/Form.elm b/src/Applications/UI/Sources/Form.elm index b2709f80..5d436195 100644 --- a/src/Applications/UI/Sources/Form.elm +++ b/src/Applications/UI/Sources/Form.elm @@ -199,7 +199,7 @@ newWhere { context } = -- Button --------- , UI.Kit.button - WithIcon + IconOnly TakeStep (Html.fromUnstyled <| Icons.arrow_forward UI.Kit.colorKit.accent 17) ] @@ -251,7 +251,7 @@ newHow { context } = , chunk [ T.mt3, T.tc ] [ UI.Kit.button - WithIcon + IconOnly TakeStep (Html.fromUnstyled <| Icons.arrow_forward UI.Kit.colorKit.accent 17) ] @@ -311,7 +311,7 @@ newBy { context } = -- Button --------- , UI.Kit.button - WithText + Normal AddSource (text "Add source") ] diff --git a/src/Applications/UI/Tracks.elm b/src/Applications/UI/Tracks.elm index 95036de2..a613878f 100644 --- a/src/Applications/UI/Tracks.elm +++ b/src/Applications/UI/Tracks.elm @@ -19,6 +19,7 @@ import Material.Icons.Action as Icons import Material.Icons.Av as Icons import Material.Icons.Content as Icons import Material.Icons.Editor as Icons +import Material.Icons.Image as Icons import Maybe.Extra as Maybe import Replying as N5 exposing (R3D3) import Return2 as R2 @@ -28,6 +29,7 @@ import Tracks exposing (..) import Tracks.Collection as Collection exposing (..) import Tracks.Encoding as Encoding import Tracks.Favourites as Favourites +import UI.Core import UI.Kit import UI.Navigation exposing (..) import UI.Page exposing (Page) @@ -67,12 +69,12 @@ update msg model = Bypass -> R3.withNothing model - Play identifiedTrack -> - ( model, Cmd.none, Just [ PlayTrack identifiedTrack ] ) - InfiniteListMsg infiniteList -> R3.withNothing { model | infiniteList = infiniteList } + Reply replies -> + ( model, Cmd.none, Just replies ) + ScrollToNowPlaying -> case model.nowPlaying of Just identifiedTrack -> @@ -310,8 +312,8 @@ toggleFavourite model ( i, t ) = -- 🗺 -view : Page -> Float -> Model -> Html Msg -view page screenHeight model = +view : UI.Core.Model -> Html Msg +view core = chunk [ T.flex , T.flex_column @@ -319,14 +321,23 @@ view page screenHeight model = ] [ lazy3 navigation - model.favouritesOnly - model.searchTerm - page + core.tracks.favouritesOnly + core.tracks.searchTerm + core.page -- - , case model.scene of - List -> - UI.Tracks.Scene.List.view { height = screenHeight } model + , if List.isEmpty core.tracks.collection.harvested then + lazy4 + noTracksView + core.sources.isProcessing + (List.length core.sources.collection) + (List.length core.tracks.collection.harvested) + (List.length core.tracks.favourites) + + else + case core.tracks.scene of + List -> + UI.Tracks.Scene.List.view { height = core.viewport.height } core.tracks ] @@ -455,6 +466,54 @@ navigation favouritesOnly searchTerm page = ] +noTracksView : Bool -> Int -> Int -> Int -> Html Msg +noTracksView isProcessing amountOfSources amountOfTracks amountOfFavourites = + UI.Kit.centeredContent + [ if isProcessing then + message "Processing Tracks" + + else if amountOfSources == 0 then + chunk + [] + [ UI.Kit.buttonLink + "/sources/new" + UI.Kit.Normal + (inline + [ UI.Kit.inlineIcon Icons.add + , text "Add some music" + ] + ) + , slab + Html.span + [] + [ T.dib, T.w1 ] + [] + , UI.Kit.buttonWithColor + UI.Kit.colorKit.base0B + UI.Kit.Normal + (Reply [ InsertDemo ]) + (inline + [ UI.Kit.inlineIcon Icons.music_note + , text "Insert demo" + ] + ) + ] + + else if amountOfTracks == 0 then + message "No tracks found" + + else + message "No sources available" + ] + + +message : String -> Html Msg +message m = + chunk + [ T.bb, T.bw1, T.f6, T.fw6, T.lh_title, T.pb1 ] + [ text m ] + + -- 🖼 diff --git a/src/Applications/UI/Tracks/Core.elm b/src/Applications/UI/Tracks/Core.elm index 50ba0a3f..762329ba 100644 --- a/src/Applications/UI/Tracks/Core.elm +++ b/src/Applications/UI/Tracks/Core.elm @@ -3,6 +3,7 @@ module UI.Tracks.Core exposing (Model, Msg(..), Scene(..)) import InfiniteList import Json.Encode as Json import Tracks exposing (..) +import UI.Reply exposing (Reply) @@ -31,7 +32,7 @@ type alias Model = type Msg = Bypass | InfiniteListMsg InfiniteList.Model - | Play IdentifiedTrack + | Reply (List Reply) | ScrollToNowPlaying | SetEnabledSourceIds (List String) | SetNowPlaying (Maybe IdentifiedTrack) diff --git a/src/Applications/UI/Tracks/Scene/List.elm b/src/Applications/UI/Tracks/Scene/List.elm index e19b0ada..0b02a4f2 100644 --- a/src/Applications/UI/Tracks/Scene/List.elm +++ b/src/Applications/UI/Tracks/Scene/List.elm @@ -18,6 +18,7 @@ import Tachyons.Classes as T import Task import Tracks exposing (..) import UI.Kit +import UI.Reply import UI.Tracks.Core exposing (..) @@ -342,7 +343,7 @@ itemView { favouritesOnly } _ idx ( identifiers, track ) = slab Html.li [ css (rowStyles idx identifiers) - , onDoubleClick (Play ( identifiers, track )) + , onDoubleClick (Reply [ UI.Reply.PlayTrack ( identifiers, track ) ]) ] [ T.dt_row diff --git a/src/Applications/UI/UserData.elm b/src/Applications/UI/UserData.elm index 4907d927..6fee240a 100644 --- a/src/Applications/UI/UserData.elm +++ b/src/Applications/UI/UserData.elm @@ -1,6 +1,7 @@ -module UI.UserData exposing (encodedFavourites, encodedSources, encodedTracks, exportEnclosed, importEnclosed, importHypaethral) +module UI.UserData exposing (demo, encodedFavourites, encodedSources, encodedTracks, exportEnclosed, importEnclosed, importHypaethral) import Authentication exposing (..) +import Base64 import Common exposing (Switch(..)) import Json.Decode as Json import Json.Decode.Pipeline exposing (..) @@ -185,3 +186,16 @@ mergeReplies list = ) [] |> Just + + + +-- DEMO + + +demo : Json.Value +demo = + "eyJmYXZvdXJpdGVzIjpbeyJhcnRpc3QiOiJKYW1lcyBCbGFrZSIsInRpdGxlIjoiRXNzZW50aWFsIE1peCAoMDktMTctMjAxMSkifV0sInNldHRpbmdzIjp7ImFwcGxpY2F0aW9uIjp7ImJhY2tncm91bmRJbWFnZSI6IjcuanBnIn0sImVxdWFsaXplciI6eyJsb3ciOjAsIm1pZCI6MCwiaGlnaCI6MCwidm9sdW1lIjoxfSwicXVldWUiOnsicmVwZWF0IjpmYWxzZSwic2h1ZmZsZSI6ZmFsc2V9LCJ0cmFja3MiOnsiZmF2b3VyaXRlc09ubHkiOmZhbHNlLCJzZWFyY2hUZXJtIjpudWxsLCJzZWxlY3RlZFBsYXlsaXN0IjpudWxsfX0sInNvdXJjZXMiOlt7ImlkIjoiMTUwNzY0MDIxODczNDIiLCJkYXRhIjp7ImFjY2Vzc0tleSI6IkFLSUFKUUNINTdZRkozVUVSWElBIiwiYnVja2V0TmFtZSI6Im9uZ2FrdS1yeW9oby1kZW1vIiwiZGlyZWN0b3J5UGF0aCI6Ii8iLCJuYW1lIjoiRGVtbyIsInJlZ2lvbiI6InVzLWVhc3QtMSIsInNlY3JldEtleSI6Ii9qSUM2REE5a2MyRFpTdzNLR3NGN1ZmdC94VEFSVHB0R2I5NmtrUDIifSwiZGlyZWN0b3J5UGxheWxpc3RzIjp0cnVlLCJlbmFibGVkIjp0cnVlLCJzZXJ2aWNlIjoiQW1hem9uUzMifV0sInRyYWNrcyI6W3siaWQiOiJNVFV3TnpZME1ESXhPRGN6TkRJdkwwWnlaV1VnYlhWemFXTXZLRk5YVERBeE15a3RiM0pwU21GdWRYTXRWMFZDTFRJd01UUXRSbEpGUlM4d01TMWliMjVwZEdFdWJYQXoiLCJwYXRoIjoiRnJlZSBtdXNpYy8oU1dMMDEzKS1vcmlKYW51cy1XRUItMjAxNC1GUkVFLzAxLWJvbml0YS5tcDMiLCJzb3VyY2VJZCI6IjE1MDc2NDAyMTg3MzQyIiwidGFncyI6eyJkaXNjIjoxLCJuciI6MSwiYWxidW0iOiJTb3VsZWN0aW9uIFdoaXRlIExhYmVsOiAwMTMiLCJhcnRpc3QiOiJvcmlKYW51cyIsInRpdGxlIjoiQm9uaXRhIiwiZ2VucmUiOiJTb3VsZWN0aW9uIiwicGljdHVyZSI6bnVsbCwieWVhciI6bnVsbH19LHsiaWQiOiJNVFV3TnpZME1ESXhPRGN6TkRJdkwwWnlaV1VnYlhWemFXTXZLRk5YVERBeE15a3RiM0pwU21GdWRYTXRWMFZDTFRJd01UUXRSbEpGUlM4d01pMDJMbTF3TXciLCJwYXRoIjoiRnJlZSBtdXNpYy8oU1dMMDEzKS1vcmlKYW51cy1XRUItMjAxNC1GUkVFLzAyLTYubXAzIiwic291cmNlSWQiOiIxNTA3NjQwMjE4NzM0MiIsInRhZ3MiOnsiZGlzYyI6MSwibnIiOjIsImFsYnVtIjoiU291bGVjdGlvbiBXaGl0ZSBMYWJlbDogMDEzIiwiYXJ0aXN0Ijoib3JpSmFudXMiLCJ0aXRsZSI6IjYiLCJnZW5yZSI6IlNvdWxlY3Rpb24iLCJwaWN0dXJlIjpudWxsLCJ5ZWFyIjpudWxsfX0seyJpZCI6Ik1UVXdOelkwTURJeE9EY3pOREl2TDBaeVpXVWdiWFZ6YVdNdktGTlhUREF4TXlrdGIzSnBTbUZ1ZFhNdFYwVkNMVEl3TVRRdFJsSkZSUzh3TXkxb2IzUmZjbVZ0YVhoZlpuUXVYM1JsYXk1c2RXNWZKbDk2YVd0dmJXOHViWEF6IiwicGF0aCI6IkZyZWUgbXVzaWMvKFNXTDAxMyktb3JpSmFudXMtV0VCLTIwMTQtRlJFRS8wMy1ob3RfcmVtaXhfZnQuX3Rlay5sdW5fJl96aWtvbW8ubXAzIiwic291cmNlSWQiOiIxNTA3NjQwMjE4NzM0MiIsInRhZ3MiOnsiZGlzYyI6MSwibnIiOjMsImFsYnVtIjoiU291bGVjdGlvbiBXaGl0ZSBMYWJlbDogMDEzIiwiYXJ0aXN0Ijoib3JpSmFudXMiLCJ0aXRsZSI6IkhvdCBSZW1peCBmdC4gVGVrLkx1biAmIFppa29tbyIsImdlbnJlIjoiU291bGVjdGlvbiIsInBpY3R1cmUiOm51bGwsInllYXIiOm51bGx9fSx7ImlkIjoiTVRVd056WTBNREl4T0Rjek5ESXZMMFp5WldVZ2JYVnphV012UTI5dFgxUnlkV2x6WlMxRGFHVnRhV05oYkY5TVpXZHpMVEl3TVRJdFJsSkZSUzh3TVMxamIyMWZkSEoxYVhObExXTm9aVzFwWTJGc1gyeGxaM011YlhBeiIsInBhdGgiOiJGcmVlIG11c2ljL0NvbV9UcnVpc2UtQ2hlbWljYWxfTGVncy0yMDEyLUZSRUUvMDEtY29tX3RydWlzZS1jaGVtaWNhbF9sZWdzLm1wMyIsInNvdXJjZUlkIjoiMTUwNzY0MDIxODczNDIiLCJ0YWdzIjp7ImRpc2MiOjEsIm5yIjo5LCJhbGJ1bSI6IkFkdWx0IFN3aW0gU2luZ2xlcyBQcm9qZWN0IDIwMTIiLCJhcnRpc3QiOiJDb20gVHJ1aXNlIiwidGl0bGUiOiJDaGVtaWNhbCBMZWdzIiwiZ2VucmUiOm51bGwsInBpY3R1cmUiOm51bGwsInllYXIiOjIwMTJ9fSx7ImlkIjoiTVRVd056WTBNREl4T0Rjek5ESXZMMFp5WldVZ2JYVnphV012VFdGdWRXVnNaVjlCZEhwbGJtbGZMVjh3TkY4dFgweHBkSFJzWlY5VGRHRnlMbTF3TXciLCJwYXRoIjoiRnJlZSBtdXNpYy9NYW51ZWxlX0F0emVuaV8tXzA0Xy1fTGl0dGxlX1N0YXIubXAzIiwic291cmNlSWQiOiIxNTA3NjQwMjE4NzM0MiIsInRhZ3MiOnsiZGlzYyI6MSwibnIiOjQsImFsYnVtIjoiVGhlIE1peWF6YWtpIFRvdXIgRVAiLCJhcnRpc3QiOiJNYW51ZWxlIEF0emVuaSIsInRpdGxlIjoiTGl0dGxlIFN0YXIiLCJnZW5yZSI6IkZ1bmsiLCJwaWN0dXJlIjpudWxsLCJ5ZWFyIjpudWxsfX0seyJpZCI6Ik1UVXdOelkwTURJeE9EY3pOREl2TDBaeVpXVWdiWFZ6YVdNdlVHRjBjbWxqYTE5TVpXVmZMVjh3TWw4dFgxRjFhWFIwYVc1ZlZHbHRaUzV0Y0RNIiwicGF0aCI6IkZyZWUgbXVzaWMvUGF0cmlja19MZWVfLV8wMl8tX1F1aXR0aW5fVGltZS5tcDMiLCJzb3VyY2VJZCI6IjE1MDc2NDAyMTg3MzQyIiwidGFncyI6eyJkaXNjIjoxLCJuciI6MiwiYWxidW0iOiJUaGUgTGFzdCBUaGluZyIsImFydGlzdCI6IlBhdHJpY2sgTGVlIiwidGl0bGUiOiJRdWl0dGluJyBUaW1lIiwiZ2VucmUiOiJFbGVjdHJvbmljIiwicGljdHVyZSI6bnVsbCwieWVhciI6bnVsbH19LHsiaWQiOiJNVFV3TnpZME1ESXhPRGN6TkRJdkwxSmhaR2x2TDJwaGJXVnpYMkpzWVd0bExXVnpjMlZ1ZEdsaGJGOXRhWGd0YzJGMExUQTVMVEUzTFRJd01URXViWEF6IiwicGF0aCI6IlJhZGlvL2phbWVzX2JsYWtlLWVzc2VudGlhbF9taXgtc2F0LTA5LTE3LTIwMTEubXAzIiwic291cmNlSWQiOiIxNTA3NjQwMjE4NzM0MiIsInRhZ3MiOnsiZGlzYyI6MSwibnIiOjEsImFsYnVtIjoiRXNzZW50aWFsIE1peC1TQVQtMDktMTciLCJhcnRpc3QiOiJKYW1lcyBCbGFrZSIsInRpdGxlIjoiRXNzZW50aWFsIE1peCAoMDktMTctMjAxMSkiLCJnZW5yZSI6IkVsZWN0cm9uaWMiLCJwaWN0dXJlIjpudWxsLCJ5ZWFyIjpudWxsfX1dfQ==" + |> Base64.decode + |> Result.mapError (\err -> Json.Failure err Json.Encode.null) + |> Result.andThen (Json.decodeString Json.value) + |> Result.withDefault (Json.Encode.object []) diff --git a/src/Library/Chunky.elm b/src/Library/Chunky.elm index 6381141a..f02cb368 100644 --- a/src/Library/Chunky.elm +++ b/src/Library/Chunky.elm @@ -1,4 +1,4 @@ -module Chunky exposing (brick, bricky, chunk, chunky, lineBreak, nothing, raw, rawy, slab, slaby) +module Chunky exposing (brick, bricky, chunk, chunky, inline, lineBreak, nothing, raw, rawy, slab, slaby) {-| Chunks, blocks and slabs. @@ -86,6 +86,11 @@ rawy = -- 5 +inline : List (Html msg) -> Html msg +inline = + Html.span [] + + nothing : Html msg nothing = Html.text "" -- 2.51.2