Skip to content

Commit cd298d2

Browse files
authored
Support for custom pseudo-classes and pseudo-elements (#38)
1 parent 9cd4ffb commit cd298d2

File tree

4 files changed

+45
-25
lines changed

4 files changed

+45
-25
lines changed

CHANGELOG.md

+1
Original file line numberDiff line numberDiff line change
@@ -15,6 +15,7 @@ Breaking changes:
1515
New features:
1616
- `box-sizing` property nsaunders/purescript-tecton#31
1717
- `word-break` property nsaunders/purescript-tecton#32
18+
- Support for custom pseudo-classes and pseudo-elements via the `PseudoClass` and `PseudoElement` constructors nsaunders/purescript-tecton#38
1819

1920
Bugfixes:
2021

src/Tecton.purs

+2
Original file line numberDiff line numberDiff line change
@@ -6,6 +6,8 @@ import Tecton.Internal
66
, Declarations
77
, ElementId(..)
88
, KeyframesName(..)
9+
, PseudoClass(PseudoClass)
10+
, PseudoElement(PseudoElement)
911
, a
1012
, abbr
1113
, absolute

src/Tecton/Internal.purs

+27-25
Original file line numberDiff line numberDiff line change
@@ -65,8 +65,8 @@ module Tecton.Internal
6565
, Orientation
6666
, Pair(..)
6767
, Percentage
68-
, PseudoClass
69-
, PseudoElement
68+
, PseudoClass(..)
69+
, PseudoElement(..)
7070
, Ratio(..)
7171
, Repeat'
7272
, Repeating
@@ -6015,9 +6015,11 @@ byId s i' = Selector $ val s <> val "#" <> val i'
60156015

60166016
infixl 7 byId as &#
60176017

6018-
newtype PseudoClass = PseudoClass Val
6018+
data PseudoClass = PseudoClass String | PseudoClassVal Val
60196019

6020-
derive newtype instance ToVal PseudoClass
6020+
instance ToVal PseudoClass where
6021+
val (PseudoClass x) = val x
6022+
val (PseudoClassVal x) = x
60216023

60226024
class IsPseudoClass (a :: Type)
60236025

@@ -6064,47 +6066,47 @@ infixl 7 byPseudoElement as &::
60646066
-- https://www.w3.org/TR/selectors-3/#sel-link
60656067

60666068
link :: PseudoClass
6067-
link = PseudoClass $ val "link"
6069+
link = PseudoClass "link"
60686070

60696071
-- https://www.w3.org/TR/selectors-3/#sel-visited
60706072

60716073
visited :: PseudoClass
6072-
visited = PseudoClass $ val "visited"
6074+
visited = PseudoClass "visited"
60736075

60746076
-- https://www.w3.org/TR/selectors-3/#sel-hover
60756077

60766078
hover :: PseudoClass
6077-
hover = PseudoClass $ val "hover"
6079+
hover = PseudoClass "hover"
60786080

60796081
-- https://www.w3.org/TR/selectors-3/#sel-active
60806082

60816083
active :: PseudoClass
6082-
active = PseudoClass $ val "active"
6084+
active = PseudoClass "active"
60836085

60846086
-- https://www.w3.org/TR/selectors-3/#sel-focus
60856087

60866088
focus :: PseudoClass
6087-
focus = PseudoClass $ val "focus"
6089+
focus = PseudoClass "focus"
60886090

60896091
-- https://www.w3.org/TR/selectors-3/#lang-pseudo
60906092

60916093
lang :: String -> PseudoClass
6092-
lang c = PseudoClass $ fn "lang" c
6094+
lang c = PseudoClassVal $ fn "lang" c
60936095

60946096
-- https://www.w3.org/TR/selectors-3/#sel-enabled
60956097

60966098
enabled :: PseudoClass
6097-
enabled = PseudoClass $ val "enabled"
6099+
enabled = PseudoClass "enabled"
60986100

60996101
-- https://www.w3.org/TR/selectors-3/#sel-indeterminate
61006102

61016103
indeterminate :: PseudoClass
6102-
indeterminate = PseudoClass $ val "indeterminate"
6104+
indeterminate = PseudoClass "indeterminate"
61036105

61046106
-- https://www.w3.org/TR/selectors-3/#sel-root
61056107

61066108
root :: PseudoClass
6107-
root = PseudoClass $ val "root"
6109+
root = PseudoClass "root"
61086110

61096111
-- https://www.w3.org/TR/selectors-3/#sel-nth-child
61106112

@@ -6144,62 +6146,62 @@ anminusb a' b' = AnPlusB a' (-b')
61446146
infixl 9 anminusb as #-
61456147

61466148
nthChild :: AnPlusB -> PseudoClass
6147-
nthChild formula = PseudoClass $ fn "nth-child" formula
6149+
nthChild formula = PseudoClassVal $ fn "nth-child" formula
61486150

61496151
-- https://www.w3.org/TR/selectors-3/#sel-nth-last-child
61506152

61516153
nthLastChild :: AnPlusB -> PseudoClass
6152-
nthLastChild formula = PseudoClass $ fn "nth-last-child" formula
6154+
nthLastChild formula = PseudoClassVal $ fn "nth-last-child" formula
61536155

61546156
-- https://www.w3.org/TR/selectors-3/#sel-nth-of-type
61556157

61566158
nthOfType :: AnPlusB -> PseudoClass
6157-
nthOfType formula = PseudoClass $ fn "nth-of-type" formula
6159+
nthOfType formula = PseudoClassVal $ fn "nth-of-type" formula
61586160

61596161
-- https://www.w3.org/TR/selectors-3/#sel-first-child
61606162

61616163
firstChild :: PseudoClass
6162-
firstChild = PseudoClass $ val "first-child"
6164+
firstChild = PseudoClass "first-child"
61636165

61646166
-- https://www.w3.org/TR/selectors-3/#sel-last-child
61656167

61666168
lastChild :: PseudoClass
6167-
lastChild = PseudoClass $ val "last-child"
6169+
lastChild = PseudoClass "last-child"
61686170

61696171
-- https://www.w3.org/TR/selectors-3/#sel-first-of-type
61706172

61716173
firstOfType :: PseudoClass
6172-
firstOfType = PseudoClass $ val "first-of-type"
6174+
firstOfType = PseudoClass "first-of-type"
61736175

61746176
-- https://www.w3.org/TR/selectors-3/#sel-last-of-type
61756177

61766178
lastOfType :: PseudoClass
6177-
lastOfType = PseudoClass $ val "last-of-type"
6179+
lastOfType = PseudoClass "last-of-type"
61786180

61796181
-- https://www.w3.org/TR/selectors-3/#sel-only-child
61806182

61816183
onlyChild :: PseudoClass
6182-
onlyChild = PseudoClass $ val "only-child"
6184+
onlyChild = PseudoClass "only-child"
61836185

61846186
-- https://www.w3.org/TR/selectors-3/#sel-only-of-type
61856187

61866188
onlyOfType :: PseudoClass
6187-
onlyOfType = PseudoClass $ val "only-of-type"
6189+
onlyOfType = PseudoClass "only-of-type"
61886190

61896191
-- https://www.w3.org/TR/selectors-3/#sel-empty
61906192

61916193
empty :: PseudoClass
6192-
empty = PseudoClass $ val "empty"
6194+
empty = PseudoClass "empty"
61936195

61946196
-- https://www.w3.org/TR/selectors-4/#negation-pseudo
61956197

61966198
not :: forall s. IsSelectorList s => MultiVal s => s -> PseudoClass
6197-
not s = PseudoClass $ fn "not" s
6199+
not s = PseudoClassVal $ fn "not" s
61986200

61996201
-- https://www.w3.org/TR/selectors-4/#focus-within-pseudo
62006202

62016203
focusWithin :: PseudoClass
6202-
focusWithin = PseudoClass $ val "focus-within"
6204+
focusWithin = PseudoClass "focus-within"
62036205

62046206
-- https://www.w3.org/TR/selectors-3/#sel-first-line
62056207

test/SelectorsSpec.purs

+15
Original file line numberDiff line numberDiff line change
@@ -6,14 +6,18 @@ module Test.SelectorsSpec where
66

77
import Prelude hiding (not)
88

9+
import Color (rgb)
910
import Data.Tuple.Nested ((/\))
1011
import Tecton
1112
( AttrName(..)
1213
, ClassName(..)
1314
, ElementId(..)
15+
, PseudoClass(..)
16+
, PseudoElement(..)
1417
, a
1518
, active
1619
, after
20+
, backgroundColor
1721
, before
1822
, checked
1923
, disabled
@@ -259,6 +263,12 @@ spec = do
259263
`isRenderedFrom` do
260264
universal &: focusWithin ? width := nil
261265

266+
"*:-moz-user-disabled{background-color:#ff0000}"
267+
`isRenderedFrom` do
268+
universal &: PseudoClass "-moz-user-disabled"
269+
? backgroundColor
270+
:= rgb 255 0 0
271+
262272
describe "Pseudo-elements" do
263273

264274
"*::first-line{width:0}"
@@ -285,6 +295,11 @@ spec = do
285295
`isRenderedFrom` do
286296
universal &:: selection ? width := nil
287297

298+
"*::-webkit-meter-bar{background-color:#eeeeee}"
299+
`isRenderedFrom` do
300+
universal &:: PseudoElement "-webkit-meter-bar" ? backgroundColor :=
301+
rgb 238 238 238
302+
288303
describe "Combinators" do
289304

290305
"* *{width:0}" `isRenderedFrom` do universal |* universal ? width := nil

0 commit comments

Comments
 (0)