Skip to content
This repository was archived by the owner on Jun 7, 2022. It is now read-only.

Commit 34f1ac2

Browse files
authored
Readme + documentation (#7)
1 parent dada5a9 commit 34f1ac2

File tree

6 files changed

+119
-38
lines changed

6 files changed

+119
-38
lines changed

.travis.yml

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -40,4 +40,5 @@ install:
4040
- pushd tests && elm-package install --yes && popd
4141

4242
script:
43+
- elm-make --yes
4344
- npm test

README.md

Lines changed: 81 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,81 @@
1+
# Class Namespaces
2+
3+
[![Build Status](https://travis-ci.org/GlobalWebIndex/class-namespaces.svg?branch=master)](https://travis-ci.org/GlobalWebIndex/class-namespaces)
4+
5+
Abstraction for easier work with conventional namespaced class names in Elm + TEA.
6+
Currently only our in-house [WeakCss](https://github.com/GlobalWebIndex/weak-css) style is supported.
7+
We're considering adding classic [BEM](http://getbem.com/) style support in future though.
8+
9+
**This package is highly experimental and might change a lot over time.**
10+
11+
Feedback and contributions to both code and documentation are very welcome.
12+
13+
## Installation
14+
15+
Usual elm package install:
16+
17+
```
18+
$ elm package install GlobalWebIndex/class-namespaces
19+
```
20+
21+
## Usage
22+
23+
Just simply use `WeakCss` module's API instead of using `Html.Attributes.class` directly.
24+
25+
```elm
26+
import Html exposing (Html, Attribute)
27+
import WeakCss exposing (ClassName)
28+
29+
moduleClass : ClassName
30+
moduleClass =
31+
WeakCss.namespace "menu"
32+
33+
view : Html msg
34+
view =
35+
let
36+
navClass =
37+
moduleClass
38+
|> WeakCss.addElement "nav"
39+
40+
itemClass =
41+
navClass
42+
|> WeakCss.addElement "item"
43+
in
44+
Html.aside
45+
[ moduleClass |> WeakCss.toClass ]
46+
[ Html.nav
47+
[ navClass |> WeakCss.toClass ]
48+
[ Html.ul
49+
[ navClass |> nested "list" ]
50+
[ Html.li [ itemClass |> WeakCss.withStates [] ] [ Html.text "first item"]
51+
, Html.li [ itemClass |> WeakCss.withStates ["active"] ] [ Html.text "second active item"]
52+
]
53+
]
54+
]
55+
```
56+
57+
This is structure of corresponding CSS file written in [SCSS](http://sass-lang.com/):
58+
59+
```scss
60+
.menu {
61+
&__nav {
62+
&--list {
63+
}
64+
65+
&--item {
66+
&.active {
67+
}
68+
}
69+
}
70+
}
71+
```
72+
73+
And this is how selectors in compiled CSS file will look like:
74+
75+
```css
76+
.menu {}
77+
.menu__nav {}
78+
.menu__nav--list {}
79+
.menu__nav--item {}
80+
.menu__nav--item.active {}
81+
```

elm-package.json

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -6,7 +6,7 @@
66
"source-directories": [
77
"src"
88
],
9-
"exposed-modules": ["NamespaceClass"],
9+
"exposed-modules": ["WeakCss"],
1010
"dependencies": {
1111
"elm-lang/core": "5.1.1 <= v < 6.0.0",
1212
"elm-lang/html": "2.0.0 <= v < 3.0.0"

src/Escape.elm

Lines changed: 11 additions & 16 deletions
Original file line numberDiff line numberDiff line change
@@ -4,22 +4,7 @@ import Regex exposing (Regex)
44

55

66
sanitizeNamespace : String -> String
7-
sanitizeNamespace =
8-
sanitize_
9-
10-
11-
sanitize : String -> String
12-
sanitize str =
13-
let
14-
regex =
15-
Regex.regex "_{2,}|-{2,}" |> Regex.caseInsensitive
16-
in
17-
sanitize_ str
18-
|> Regex.replace Regex.All regex (\_ -> "")
19-
20-
21-
sanitize_ : String -> String
22-
sanitize_ str =
7+
sanitizeNamespace str =
238
let
249
sanitizeRegex =
2510
Regex.regex "[^a-z0-9\\-_]"
@@ -35,3 +20,13 @@ sanitize_ str =
3520
str
3621
|> Regex.replace Regex.All sanitizeRegex replacement
3722
|> Regex.replace Regex.All leadNumbers replacement
23+
24+
25+
sanitize : String -> String
26+
sanitize str =
27+
let
28+
regex =
29+
Regex.regex "_{2,}|-{2,}" |> Regex.caseInsensitive
30+
in
31+
sanitizeNamespace str
32+
|> Regex.replace Regex.All regex (\_ -> "")

src/WeakCss.elm

Lines changed: 21 additions & 17 deletions
Original file line numberDiff line numberDiff line change
@@ -2,25 +2,26 @@ module WeakCss
22
exposing
33
( ClassName
44
, namespace
5-
, element
5+
, addElement
66
, toClass
77
, nested
88
, withStates
99
)
1010

11-
{-| Abstraction for generating convetional class names
11+
{-| Abstraction for working with [`Weak Css`](https://github.com/GlobalWebIndex/weak-css)
12+
style class names.
1213
1314
# Type and Constructor
1415
1516
@docs ClassName, namespace
1617
1718
# Adding Elements
1819
19-
@docs element
20+
@docs addElement
2021
2122
# Convert to Attribute
2223
23-
@docs toClass, element, nested, withStates
24+
@docs toClass, nested, withStates
2425
2526
-}
2627

@@ -32,13 +33,16 @@ import Escape
3233
-- Type
3334

3435

35-
{-| ClassName type describes selector used to style element.
36+
{-| ClassName type describes class selector used to style element.
37+
38+
All strings are sanitized to prevent missuse and odd resulting selectors.
39+
**It's highly recommended to avoid spaces, `__` and `--` in arguments though.**
3640
-}
3741
type ClassName
3842
= ClassName String (List String)
3943

4044

41-
{-| Construct [`ClassName`](#ClassName) with given namespace
45+
{-| Construct [`ClassName`](#ClassName) with given namespace.
4246
4347
>>> import Html.Attributes exposing (class)
4448
@@ -51,28 +55,28 @@ namespace name =
5155

5256

5357

54-
-- Add nested element
58+
-- Add nested element to element path.
5559

5660

5761
{-| Add element
5862
5963
>>> import Html.Attributes exposing (class)
6064
6165
>>> namespace "menu"
62-
... |> element "list"
66+
... |> addElement "list"
6367
... |> toClass
6468
class "menu__list"
6569
-}
66-
element : String -> ClassName -> ClassName
67-
element name (ClassName namespace list) =
70+
addElement : String -> ClassName -> ClassName
71+
addElement name (ClassName namespace list) =
6872
ClassName namespace <| (Escape.sanitize name) :: list
6973

7074

7175

7276
-- Convert to Html.Attribute
7377

7478

75-
{-| Convert [`ClassName`](#ClassName) to `Html.Attribute msg`
79+
{-| Convert [`ClassName`](#ClassName) to `Html.Attribute msg`.
7680
7781
>>> import Html.Attributes exposing (class)
7882
@@ -81,7 +85,7 @@ element name (ClassName namespace list) =
8185
class "menu"
8286
8387
>>> namespace "menu"
84-
... |> element "list"
88+
... |> addElement "list"
8589
... |> toClass
8690
class "menu__list"
8791
-}
@@ -90,7 +94,7 @@ toClass =
9094
class << toString
9195

9296

93-
{-| Add new element and turn to `Html.Attribute msg`
97+
{-| Add new element and convert to `Html.Attribute msg`.
9498
9599
>>> import Html.Attributes exposing (class)
96100
@@ -99,21 +103,21 @@ toClass =
99103
class "menu__item"
100104
101105
>>> namespace "menu"
102-
... |> element "item"
106+
... |> addElement "item"
103107
... |> nested "link"
104108
class "menu__item--link"
105109
-}
106110
nested : String -> ClassName -> Attribute msg
107111
nested name =
108-
toClass << element name
112+
toClass << addElement name
109113

110114

111-
{-| Add state to [`ClassName`](#ClassName) and turn to `Html.Attrinute msg`
115+
{-| Add state to last element [`ClassName`](#ClassName) and convert to `Html.Attrinute msg`.
112116
113117
>>> import Html.Attributes exposing (class)
114118
115119
>>> namespace "menu"
116-
... |> element "item"
120+
... |> addElement "item"
117121
... |> withStates ["active", "highlighted"]
118122
class "menu__item active highlighted"
119123

tests/Tests.elm

Lines changed: 4 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -16,7 +16,7 @@ namespaced =
1616

1717

1818
inElement =
19-
element "list" namespaced
19+
addElement "list" namespaced
2020

2121

2222
all : Test
@@ -45,19 +45,19 @@ namespaceClassTest =
4545
, test "more elements" <|
4646
\() ->
4747
inElement
48-
|> element "item"
48+
|> addElement "item"
4949
|> nested "link"
5050
|> Expect.equal (class "menu__list--item--link")
5151
, test "with state" <|
5252
\() ->
5353
inElement
54-
|> element "item"
54+
|> addElement "item"
5555
|> withStates [ "active", "edited" ]
5656
|> Expect.equal (class "menu__list--item active edited")
5757
, test "with empty state" <|
5858
\() ->
5959
inElement
60-
|> element "item"
60+
|> addElement "item"
6161
|> withStates []
6262
|> Expect.equal (class "menu__list--item")
6363
]

0 commit comments

Comments
 (0)