GithubHelp home page GithubHelp logo

allanderek / elm-css Goto Github PK

View Code? Open in Web Editor NEW

This project forked from rtfeldman/elm-css

0.0 3.0 0.0 4.97 MB

CSS preprocessor where you can share code between your stylesheets and your Elm views.

Home Page: http://package.elm-lang.org/packages/rtfeldman/elm-css/latest

License: BSD 3-Clause "New" or "Revised" License

JavaScript 2.54% Elm 97.46%

elm-css's Introduction

Logo

elm-css Version Travis build Status AppVeyor build status

elm-css lets you define CSS in Elm, like so:

module MyCss exposing (..)

import Css exposing (..)
import Css.Elements exposing (body, li)
import Css.Namespace exposing (namespace)


type CssClasses
    = NavBar


type CssIds
    = Page


css =
    (stylesheet << namespace "dreamwriter")
    [ body
        [ overflowX auto
        , minWidth (px 1280)
        ]
    , id Page
        [ backgroundColor (rgb 200 128 64)
        , color (hex "CCFFFF")
        , width (pct 100)
        , height (pct 100)
        , boxSizing borderBox
        , padding (px 8)
        , margin zero
        ]
    , class NavBar
        [ margin zero
        , padding zero
        , children
            [ li
                [ (display inlineBlock) |> important
                , color primaryAccentColor
                ]
            ]
        ]
    ]


primaryAccentColor =
    hex "ccffaa"

Here's what you can do with this code:

  • You can generate a .css file from it.
  • You can use it to generate type-checked inline styles.
  • You can share NavBar and Page with your Elm view code, so your classes and IDs can never get out of sync due to a typo or refactor.
  • You can move this code into your view file and have your styles live side-by-side with your view functions themselves.

elm-css works hard to prevent invalid styles from being generated; for example, if you write color "blah" or margin (rgb 1 2 3), you'll get a type mismatch. If you write (rgb 3000 0 -3) you'll get a build-time validation error (RGB values must be between 0 and 255) if you try to compile it to a stylesheet.

elm-css draws inspiration from the excellent Sass, Stylus, and CSS Modules. It includes popular features like:

There are two popular approaches to using it; you can use either or combine both of these, depending on your needs and preferences.

Approach 1: Inline Styles

One way to use elm-css is for inline styles, using the asPairs function:

styles =
    Css.asPairs >> Html.Attributes.style

button [ styles [ position absolute, left (px 5) ] ]
    [ text "Whee!" ]

This approach is the simplest way to get started with elm-css. One advantage of inline styles is that these can be dynamically changed at runtime; a limitation is that CSS pseudo-classes and pseudo-elements cannot be used with inline styles.

Approach 2: Generating CSS files

You can also use elm-css as a CSS preprocessor which generates separate .css files.

To do this, you will need to install both the node module and the Elm library:

npm install -g elm-css
elm package install rtfeldman/elm-css

Then you'll need a special module with a port for elm-css to access:

port module Stylesheets exposing (..)

import Css.File exposing (CssFileStructure, CssCompilerProgram)
import MyCss


port files : CssFileStructure -> Cmd msg


fileStructure : CssFileStructure
fileStructure =
    Css.File.toFileStructure
        [ ( "index.css", Css.File.compile [ MyCss.css ] ) ]


main : CssCompilerProgram
main =
    Css.File.compiler files fileStructure

Run elm-css on the file containing this Stylesheets module. Then include that css file in your web page.

The above elm-css stylesheet compiles to the following .css file:

body {
    overflow-x: auto;
    min-width: 1280px;
}

#dreamwriterPage {
    background-color: rgb(200, 128, 64);
    color: #CCFFFF;
    width: 100%;
    height: 100%;
    box-sizing: border-box;
    padding: 8px;
    margin: 0;
}

.dreamwriterNavBar {
    margin: 0;
    padding: 0;
}

.dreamwriterNavBar > li {
    display: inline-block !important;
    color: #ccffaa;
}

Try it out! (make sure you already have elm installed, e.g. with npm install -g elm)

$ npm install -g elm-css
$ git clone https://github.com/rtfeldman/elm-css.git
$ cd elm-css/examples
$ elm-css src/Stylesheets.elm
$ less homepage.css

A gentle introduction to some of the features of elm-css is also available in the tutorial.

Examples

There are a few examples to check out!

  • json-to-elm which can see be seen live here
  • the examples folder, which contains a working project with a README
  • the example above

Using elm-css with Elm view code

Here's how to use elm-css in your projects:

In your Elm code, use the same union types to represent classes and ids. Then they can't get out of sync with your CSS. To do this, you'll need special versions the of id, class, and classList functions from elm-html.

Install the handy package that combines elm-html and elm-css:

 elm package install rtfeldman/elm-css-helpers

The Elm.CssHelpers.withNamespace returns a record full of handy functions. Use that, and then construct Html using classes and ids defined in your union types. For example:

module MyView exposing (..)


import Html.CssHelpers
import MyCss


{ id, class, classList } =
    Html.CssHelpers.withNamespace "dreamwriter"


view =
    Html.div []
        [ Html.div [ class [ MyCss.NavBar ] ] [ Html.text "this has the NavBar class" ]
        , Html.div [ id MyCss.Page ] [ Html.text "this has the Page id" ]
        ]

Missing CSS properties

elm-css is still in development. Not all CSS properties have been added yet. If you run into this problem, elm-css includes the property function. It takes two Strings; the property key, and its value.

e.g.

We want z-index, but suppose elm-css did not implement it. We would define it ourselves:

import Css exposing (..)

zIndex : Int -> Mixin
zIndex i =
    property "z-index" <| toString i

Now zIndex 9999 is available to use inside our Stylesheet.

Related Projects

elm-css's People

Contributors

eeue56 avatar tolgap avatar bobwhitelock avatar wmjoubert avatar ahstro avatar vipentti avatar akoppela avatar devnacho avatar robrtle avatar k15a avatar krisajenkins avatar rodrigo-morais avatar scottcorgan avatar roberto avatar minibill avatar jwoudenberg avatar irio avatar tommcgurl avatar stoeffel avatar stkb avatar szubtsovskiy avatar sandicat avatar bardt avatar raiscui avatar pauldijou avatar nmsmith avatar nicholasgwk avatar neverwintermoon avatar maxekman avatar martindemello avatar

Watchers

allanderek avatar James Cloos avatar  avatar

Recommend Projects

  • React photo React

    A declarative, efficient, and flexible JavaScript library for building user interfaces.

  • Vue.js photo Vue.js

    ๐Ÿ–– Vue.js is a progressive, incrementally-adoptable JavaScript framework for building UI on the web.

  • Typescript photo Typescript

    TypeScript is a superset of JavaScript that compiles to clean JavaScript output.

  • TensorFlow photo TensorFlow

    An Open Source Machine Learning Framework for Everyone

  • Django photo Django

    The Web framework for perfectionists with deadlines.

  • D3 photo D3

    Bring data to life with SVG, Canvas and HTML. ๐Ÿ“Š๐Ÿ“ˆ๐ŸŽ‰

Recommend Topics

  • javascript

    JavaScript (JS) is a lightweight interpreted programming language with first-class functions.

  • web

    Some thing interesting about web. New door for the world.

  • server

    A server is a program made to process requests and deliver data to clients.

  • Machine learning

    Machine learning is a way of modeling and interpreting data that allows a piece of software to respond intelligently.

  • Game

    Some thing interesting about game, make everyone happy.

Recommend Org

  • Facebook photo Facebook

    We are working to build community through open source technology. NB: members must have two-factor auth.

  • Microsoft photo Microsoft

    Open source projects and samples from Microsoft.

  • Google photo Google

    Google โค๏ธ Open Source for everyone.

  • D3 photo D3

    Data-Driven Documents codes.