Skip to content
New issue

Have a question about this project? Sign up for a free GitHub account to open an issue and contact its maintainers and the community.

By clicking “Sign up for GitHub”, you agree to our terms of service and privacy statement. We’ll occasionally send you account related emails.

Already on GitHub? Sign in to your account

Implement support for CSS at rules #238

Merged
merged 4 commits into from
Mar 31, 2020
Merged
Show file tree
Hide file tree
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
41 changes: 41 additions & 0 deletions spec/compilers/css_font_face
Original file line number Diff line number Diff line change
@@ -0,0 +1,41 @@
component Main {
style test {
@font-face {
src: url(sansation_light.woff);
font-family: myFirstFont;
}

@font-face {
src: url(sansation_light2.woff);
font-family: myFirstFont;
font-weight: bold;
}
}

fun render : Html {
<div::test/>
}
}
--------------------------------------------------------------------------------
class A extends _C {
render() {
return _h("div", {
className: `a`
});
}
};

A.displayName = "Main";

_insertStyles(`
@font-face {
src: url(sansation_light.woff);
font-family: myFirstFont;
}

@font-face {
src: url(sansation_light2.woff);
font-family: myFirstFont;
font-weight: bold;
}
`);
81 changes: 81 additions & 0 deletions spec/compilers/css_keyframes
Original file line number Diff line number Diff line change
@@ -0,0 +1,81 @@
component Main {
property opacity : Number = 1

style test {
@keyframes animation {
from {
opacity: 0;
}

to {
opacity: #{opacity};
}
}

@keyframes animation {
from {
opacity: 0;
}

to {
opacity: 1;
}
}
}

fun render : Html {
<div::test/>
}
}
--------------------------------------------------------------------------------
class A extends _C {
constructor(props) {
super(props);

this._d({
a: [
null,
1
]
});
}

$a() {
const _ = {
[`--a-a`]: this.a
};

return _;
}

render() {
return _h("div", {
className: `a`,
style: _style([this.$a()])
});
}
};

A.displayName = "Main";

_insertStyles(`
@keyframes animation {
from {
opacity: 0;
}

to {
opacity: var(--a-a);
}
}

@keyframes animation {
from {
opacity: 0;
}

to {
opacity: 1;
}
}
`);
51 changes: 51 additions & 0 deletions spec/compilers/css_supports
Original file line number Diff line number Diff line change
@@ -0,0 +1,51 @@
component Main {
property color : String = "blue"

style test {
@supports (screen) {
color: #{color};
}
}

fun render : Html {
<div::test/>
}
}
--------------------------------------------------------------------------------
class A extends _C {
constructor(props) {
super(props);

this._d({
a: [
null,
`blue`
]
});
}

$a() {
const _ = {
[`--a-a`]: this.a
};

return _;
}

render() {
return _h("div", {
className: `a`,
style: _style([this.$a()])
});
}
};

A.displayName = "Main";

_insertStyles(`
@supports (screen) {
.a {
color: var(--a-a);
}
}
`);
12 changes: 12 additions & 0 deletions spec/parsers/css_keyframes.cr
Original file line number Diff line number Diff line change
@@ -0,0 +1,12 @@
require "../spec_helper"

describe "Css Keyframes" do
subject css_keyframes

expect_error "@keyframes", Mint::Parser::CssKeyframesExpectedName
expect_error "@kayframes test ", Mint::Parser::CssKeyframesExpectedOpeningBracket
expect_error "@keyframes test {", Mint::Parser::CssKeyframesExpectedClosingBracket

expect_ok "@keyframes test { }"
expect_ok "@keyframes test { 0% { a: b; } }"
end
31 changes: 31 additions & 0 deletions spec/type_checking/css_font_face
Original file line number Diff line number Diff line change
@@ -0,0 +1,31 @@
component Main {
style test {
@font-face {
src: url(sansation_light.woff);
font-family: myFirstFont;
}

@font-face {
src: url(sansation_light2.woff);
font-family: myFirstFont;
font-weight: bold;
}
}

fun render : Html {
<div::test/>
}
}
--------------------------------------------------------CssFontFaceInterpolation
component Main {
style test {
@font-face {
src: url(sansation_light.woff);
font-family: #{"myFirstFont"};
}
}

fun render : Html {
<div::test/>
}
}
1 change: 1 addition & 0 deletions src/all.cr
Original file line number Diff line number Diff line change
Expand Up @@ -6,6 +6,7 @@ require "file_utils"
require "colorize"
require "markd"
require "kemal"
require "uuid"
require "html"
require "json"

Expand Down
13 changes: 13 additions & 0 deletions src/ast/css_font_face.cr
Original file line number Diff line number Diff line change
@@ -0,0 +1,13 @@
module Mint
class Ast
class CssFontFace < Node
getter definitions

def initialize(@definitions : Array(Node),
@input : Data,
@from : Int32,
@to : Int32)
end
end
end
end
14 changes: 14 additions & 0 deletions src/ast/css_keyframes.cr
Original file line number Diff line number Diff line change
@@ -0,0 +1,14 @@
module Mint
class Ast
class CssKeyframes < Node
getter selectors, name

def initialize(@selectors : Array(Node),
@name : String,
@input : Data,
@from : Int32,
@to : Int32)
end
end
end
end
5 changes: 3 additions & 2 deletions src/ast/css_media.cr → src/ast/css_nested_at.cr
Original file line number Diff line number Diff line change
@@ -1,10 +1,11 @@
module Mint
class Ast
class CssMedia < Node
getter content, body
class CssNestedAt < Node
getter content, body, name

def initialize(@body : Array(Node),
@content : String,
@name : String,
@input : Data,
@from : Int32,
@to : Int32)
Expand Down
10 changes: 0 additions & 10 deletions src/formatters/css_media.cr

This file was deleted.

10 changes: 10 additions & 0 deletions src/formatters/css_nested_at.cr
Original file line number Diff line number Diff line change
@@ -0,0 +1,10 @@
module Mint
class Formatter
def format(node : Ast::CssNestedAt) : String
body =
list node.body

"@#{node.name} #{node.content.strip} {\n#{indent(body)}\n}"
end
end
end
7 changes: 7 additions & 0 deletions src/messages/css_font_face_expected_closing_bracket.cr
Original file line number Diff line number Diff line change
@@ -0,0 +1,7 @@
message CssFontFaceExpectedClosingBracket do
title "Syntax Error"

closing_bracket "font-face", got

snippet node
end
7 changes: 7 additions & 0 deletions src/messages/css_font_face_expected_opening_bracket.cr
Original file line number Diff line number Diff line change
@@ -0,0 +1,7 @@
message CssFontFaceExpectedOpeningBracket do
title "Syntax Error"

opening_bracket "font-face", got

snippet node
end
9 changes: 9 additions & 0 deletions src/messages/css_font_face_interpolation.cr
Original file line number Diff line number Diff line change
@@ -0,0 +1,9 @@
message CssFontFaceInterpolation do
title "Type Error"

block do
text "Interpolations are not allowed inside a font-face rule."
end

snippet node
end
7 changes: 7 additions & 0 deletions src/messages/css_keyframes_expected_closing_bracket.cr
Original file line number Diff line number Diff line change
@@ -0,0 +1,7 @@
message CssKeyframesExpectedClosingBracket do
title "Syntax Error"

closing_bracket "keyframes", got

snippet node
end
11 changes: 11 additions & 0 deletions src/messages/css_keyframes_expected_name.cr
Original file line number Diff line number Diff line change
@@ -0,0 +1,11 @@
message CssKeyframesExpectedName do
title "Syntax Error"

block do
text "An name of a keyframes must be defined."
end

was_looking_for "name", got

snippet node
end
7 changes: 7 additions & 0 deletions src/messages/css_keyframes_expected_opening_bracket.cr
Original file line number Diff line number Diff line change
@@ -0,0 +1,7 @@
message CssKeyframesExpectedOpeningBracket do
title "Syntax Error"

opening_bracket "keyframes", got

snippet node
end
7 changes: 0 additions & 7 deletions src/messages/css_media_expected_closing_bracket.cr

This file was deleted.

12 changes: 0 additions & 12 deletions src/messages/css_media_expected_name.cr

This file was deleted.

7 changes: 0 additions & 7 deletions src/messages/css_media_expected_opening_bracket.cr

This file was deleted.

7 changes: 7 additions & 0 deletions src/messages/css_nested_at_expected_closing_bracket.cr
Original file line number Diff line number Diff line change
@@ -0,0 +1,7 @@
message CssNestedAtExpectedClosingBracket do
title "Syntax Error"

closing_bracket "at rule", got

snippet node
end
11 changes: 11 additions & 0 deletions src/messages/css_nested_at_expected_condition.cr
Original file line number Diff line number Diff line change
@@ -0,0 +1,11 @@
message CssNestedAtExpectedCondition do
title "Syntax Error"

block do
text "An at rule must define at least one condition."
end

was_looking_for "condition", got

snippet node
end
Loading