susy 3.0.0.alpha.1 → 3.0.0.alpha.2
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- checksums.yaml +4 -4
- data/README.md +153 -100
- data/VERSION +1 -1
- data/sass/_prefix.scss +1 -0
- data/sass/plugins/_svg-grid.scss +5 -0
- data/sass/plugins/svg-grid/_prefix.scss +7 -0
- data/sass/plugins/svg-grid/_svg-api.scss +78 -0
- data/sass/plugins/svg-grid/_svg-grid-math.scss +72 -0
- data/sass/plugins/svg-grid/_svg-settings.scss +14 -0
- data/sass/plugins/svg-grid/_svg-unprefix.scss +18 -0
- data/sass/plugins/svg-grid/_svg-utilities.scss +127 -0
- data/sass/susy/_api.scss +46 -15
- data/sass/susy/_grids.scss +7 -9
- data/sass/susy/_parser.scss +68 -32
- data/sass/susy/_settings.scss +6 -1
- data/sass/susy/_utilities.scss +60 -0
- data/sass/susy/_validation.scss +78 -12
- metadata +11 -3
checksums.yaml
CHANGED
@@ -1,7 +1,7 @@
|
|
1
1
|
---
|
2
2
|
SHA1:
|
3
|
-
metadata.gz:
|
4
|
-
data.tar.gz:
|
3
|
+
metadata.gz: 8abe53f196f31e63a27a0457d54af4b1586a60b0
|
4
|
+
data.tar.gz: 084c64a7897e0b887078063b6ddbe410d8f46616
|
5
5
|
SHA512:
|
6
|
-
metadata.gz:
|
7
|
-
data.tar.gz:
|
6
|
+
metadata.gz: 1164998a065a00be67b0b8253b4d0fd60f7e974d80f22a12dbb5b29b3cd09d9c2295c5a2580a79b987f4ab6fb9cade596d9d78fda428ab91df81eaa9dca64d7a
|
7
|
+
data.tar.gz: 73c1eddf36ad9161bdac645fe76db17cfd8227fbe50b8baddf392df75444625b72fc7e9076c2f1f72f7a3f8974ccbbd204e1b35586027afc5b8a60cd7dea81bb
|
data/README.md
CHANGED
@@ -10,136 +10,189 @@ full of rules and restrictions —
|
|
10
10
|
we wanted a power tool
|
11
11
|
for building our own damn systems.
|
12
12
|
|
13
|
-
|
14
|
-
|
15
|
-
|
16
|
-
|
13
|
+
Version Three is trimmed down to it's most basic components —
|
14
|
+
functions that can be used to build any grid system.
|
15
|
+
This is truely a grids-on-demand approach,
|
16
|
+
where you build your own system,
|
17
|
+
and we handle the math.
|
18
|
+
|
19
|
+
We're planning to build various output-modules
|
20
|
+
with mixins to help you get started.
|
21
|
+
We'll probably start with a float-based module,
|
22
|
+
and a flexbox module.
|
23
|
+
If you have ideas for another plugin,
|
24
|
+
or want to help move floats or flexbox along,
|
25
|
+
pull requests are welcome!
|
17
26
|
|
18
27
|
|
19
28
|
Getting Started
|
20
29
|
---------------
|
21
30
|
|
22
|
-
|
23
|
-
|
31
|
+
You can install Susy as a rubygem,
|
32
|
+
npm module, bower package, or git repo.
|
24
33
|
|
25
|
-
|
26
|
-
|
34
|
+
```
|
35
|
+
npm install susy@pre
|
36
|
+
```
|
27
37
|
|
38
|
+
There are two imports to choose from.
|
39
|
+
The default `sass/_susy.scss` comes with
|
40
|
+
un-prefixed versions of the core API functions.
|
41
|
+
If you want Susy to be name-spaced,
|
42
|
+
import `sass/_prefix.scss` instead.
|
28
43
|
|
29
|
-
|
44
|
+
```scss
|
45
|
+
@import '../node_modules/susy/sass/susy';
|
46
|
+
```
|
30
47
|
|
31
|
-
The `columns` setting describes the columns in your grid.
|
32
|
-
The most basic syntax uses a list of numbers
|
33
|
-
to describe the relative size of each column.
|
34
48
|
|
35
|
-
|
36
|
-
|
37
|
-
$symmetrical: (1 1 1 1 1);
|
49
|
+
Spanning Columns & Gutters
|
50
|
+
--------------------------
|
38
51
|
|
39
|
-
|
40
|
-
|
52
|
+
There are two core funtions:
|
53
|
+
`span()` (or `susy-span()`),
|
54
|
+
and `gutter()` (or `susy-gutter()`).
|
55
|
+
|
56
|
+
The **gutter** function returns
|
57
|
+
the width of a single gutter on your grid —
|
58
|
+
to be applied as you see fit:
|
59
|
+
|
60
|
+
```scss
|
61
|
+
.example {
|
62
|
+
margin: susy-gutter();
|
63
|
+
}
|
41
64
|
```
|
42
65
|
|
43
|
-
|
44
|
-
|
45
|
-
|
66
|
+
The **span** function
|
67
|
+
describes a span of one or more columns,
|
68
|
+
and any relevant gutters along the way:
|
46
69
|
|
47
70
|
```scss
|
48
|
-
|
49
|
-
|
71
|
+
.example {
|
72
|
+
// the width of three columns, and the two intervening gutters
|
73
|
+
width: susy-span(3);
|
74
|
+
}
|
75
|
+
```
|
76
|
+
|
77
|
+
When nesting fluid grids,
|
78
|
+
you can use the old `of $n` syntax
|
79
|
+
to describe changes in context —
|
80
|
+
e.g. `susy-span(3 of 6)`.
|
81
|
+
When using asymmetrical grids,
|
82
|
+
you can use the old `at $n`, `first`, or `last` syntax
|
83
|
+
to describe the specific columns you want to span —
|
84
|
+
e.g. `susy-span(3 at 2 of (1 2 3 4 5 6))`
|
85
|
+
to span across `(2 3 4)`.
|
86
|
+
|
87
|
+
You can use these two functions
|
88
|
+
to build all sorts of grids:
|
50
89
|
|
51
|
-
|
52
|
-
|
90
|
+
```scss
|
91
|
+
.float {
|
92
|
+
float: left;
|
93
|
+
width: span(3);
|
94
|
+
margin-right: gutter();
|
95
|
+
}
|
96
|
+
|
97
|
+
.flexbox {
|
98
|
+
flex-basis: span(3);
|
99
|
+
padding: gutter() / 2;
|
100
|
+
}
|
101
|
+
|
102
|
+
// Make your own class system!
|
103
|
+
.span {
|
104
|
+
float: left;
|
105
|
+
margin-right: gutter();
|
106
|
+
|
107
|
+
&.last {
|
108
|
+
margin-right: 0;
|
109
|
+
}
|
110
|
+
}
|
111
|
+
|
112
|
+
@for $span from 1 through susy-get('columns') {
|
113
|
+
.span-#{$i} {
|
114
|
+
width: span($i);
|
115
|
+
}
|
116
|
+
}
|
53
117
|
```
|
54
118
|
|
55
|
-
|
56
|
-
|
57
|
-
|
119
|
+
|
120
|
+
Defining Grids
|
121
|
+
--------------
|
122
|
+
|
123
|
+
A grid is defined by a series of `columns`
|
124
|
+
with optional `gutters` between them.
|
125
|
+
|
126
|
+
**Columns** are described by a list of numbers,
|
127
|
+
representing the relative width of each column.
|
128
|
+
By default, a grid is fluid —
|
129
|
+
but you can add units to create a static layout:
|
58
130
|
|
59
131
|
```scss
|
60
|
-
//
|
61
|
-
$
|
132
|
+
// six equal fluid columns
|
133
|
+
$equal: (1 1 1 1 1 1);
|
134
|
+
|
135
|
+
// six equal 5em columns
|
136
|
+
$static: (5em 5em 5em 5em 5em 5em);
|
137
|
+
|
138
|
+
// six unequal fluid columns
|
139
|
+
$asymmetrical: (1 1 2 3 5 8);
|
62
140
|
|
63
|
-
//
|
64
|
-
|
141
|
+
// six unequal fluid columns
|
142
|
+
// you can mix units, as long as they are comparable...
|
143
|
+
$strange: (1in 1cm 2pt 3mm 5in 8cm);
|
65
144
|
```
|
66
145
|
|
67
|
-
|
68
|
-
|
69
|
-
|
70
|
-
representing the number of columns in the grid.
|
71
|
-
The second value is the letter "x"
|
72
|
-
(not a star or times symbol).
|
73
|
-
The third value is the static width of your columns.
|
146
|
+
Since `(1 1 1 1 1 1)` is so repetative,
|
147
|
+
we've provided a shorthand syntax
|
148
|
+
for describung equal columns:
|
74
149
|
|
150
|
+
```scss
|
151
|
+
// six equal fluid columns (shorthand)
|
152
|
+
$fluid: 6;
|
75
153
|
|
76
|
-
|
154
|
+
// six 120px static columns (shorthand)
|
155
|
+
// that's a lowercase 'x' — not a star or any other symbol...
|
156
|
+
$static: 6 x 120px;
|
157
|
+
```
|
77
158
|
|
78
|
-
|
79
|
-
|
80
|
-
|
81
|
-
|
82
|
-
|
159
|
+
**Gutters**
|
160
|
+
are defined relative to columns,
|
161
|
+
in comparable units.
|
162
|
+
Both settings go together
|
163
|
+
in a single map variable:
|
83
164
|
|
84
165
|
```scss
|
85
|
-
// fluid 4-column grid
|
86
|
-
|
87
|
-
$
|
88
|
-
|
89
|
-
|
90
|
-
|
91
|
-
|
166
|
+
// fluid 4-column grid
|
167
|
+
// with gutters 1/4 the size of a column
|
168
|
+
$fluid: (
|
169
|
+
'columns': 4;
|
170
|
+
'gutters': 0.25;
|
171
|
+
);
|
172
|
+
|
173
|
+
// Static un-equal grid
|
174
|
+
// with comparable gutters
|
175
|
+
$static: (
|
176
|
+
'columns': (1em 1em 2em 3em 5em 8em)
|
177
|
+
'gutters': 0.25em;
|
178
|
+
);
|
92
179
|
```
|
93
180
|
|
94
|
-
|
95
|
-
|
96
|
-
|
97
|
-
|
98
|
-
|
99
|
-
|
100
|
-
|
101
|
-
|
102
|
-
|
103
|
-
|
104
|
-
|
105
|
-
|
106
|
-
|
107
|
-
|
108
|
-
|
109
|
-
|
110
|
-
- The most common answer is `3`.
|
111
|
-
Gutters only exist between the columns —
|
112
|
-
`c1 (g1) c2 (g2) c3 (g3) c4`.
|
113
|
-
We call that option `narrow`,
|
114
|
-
and it is the default value for both
|
115
|
-
spans and containers.
|
116
|
-
|
117
|
-
- The other common answer is `5`,
|
118
|
-
if we want to include gutters on the outside edges —
|
119
|
-
`(g1) c1 (g2) c2 (g3) c3 (g4) c4 (g5)`.
|
120
|
-
We call that option `wider`.
|
121
|
-
|
122
|
-
- Less commonly,
|
123
|
-
you might want only one edge gutter
|
124
|
-
either before or after —
|
125
|
-
`c1 (g1) c2 (g2) c3 (g3) c4 (g4)` —
|
126
|
-
leaving your with `4` gutters.
|
127
|
-
We call that `wide`.
|
128
|
-
|
129
|
-
Spread and container-spread work in the same way,
|
130
|
-
but one applies to a span,
|
131
|
-
and the other applies to the parent context
|
132
|
-
when calculating relative widths.
|
133
|
-
If you are using static grids,
|
134
|
-
the `container-spread` isn't used.
|
135
|
-
|
136
|
-
In most cases,
|
137
|
-
you can set the default spread for a project,
|
138
|
-
and never look back.
|
139
|
-
Sometimes,
|
140
|
-
when you are pushing and pulling
|
141
|
-
elements around on the grid,
|
142
|
-
it is helpful to add and remove gutters on the fly.
|
181
|
+
Anything you put in the root `$susy` variable map
|
182
|
+
will be treated as a global default
|
183
|
+
across your project.
|
184
|
+
|
185
|
+
|
186
|
+
Advanced Features
|
187
|
+
-----------------
|
188
|
+
|
189
|
+
Once you get used to the basics,
|
190
|
+
you can dig into the `spread` options —
|
191
|
+
allowing you to include extra gutters in a span —
|
192
|
+
and the `susy-slice()` function
|
193
|
+
that can help you handle nesting-context with asymmetrical grids.
|
194
|
+
|
195
|
+
Happy grid-building!
|
143
196
|
|
144
197
|
|
145
198
|
Resources
|
data/VERSION
CHANGED
@@ -1 +1 @@
|
|
1
|
-
3.0.0.alpha.
|
1
|
+
3.0.0.alpha.2
|
data/sass/_prefix.scss
CHANGED
@@ -0,0 +1,78 @@
|
|
1
|
+
// SVG API
|
2
|
+
// =======
|
3
|
+
|
4
|
+
|
5
|
+
|
6
|
+
// SVG Grid
|
7
|
+
// --------
|
8
|
+
/// Return inline svg-data in to display the grid
|
9
|
+
/// (import `plugins/svg-grid/prefix` to remove unprefixed alias)
|
10
|
+
///
|
11
|
+
/// @group plugin_svg-grid
|
12
|
+
///
|
13
|
+
/// @param {Map | List} $grid [$susy] -
|
14
|
+
/// Map or shorthand defining the current grid
|
15
|
+
/// @param {Color | List | null} $colors [null] -
|
16
|
+
/// Column color, or list of colors for column-gradient,
|
17
|
+
/// used to override the global `svg-grid-colors` setting
|
18
|
+
/// @param {Length | null} $offset [null] -
|
19
|
+
/// Manually override the default grid-image offset,
|
20
|
+
/// to account for grid edges
|
21
|
+
///
|
22
|
+
/// @return {String} -
|
23
|
+
/// CSS inline-data SVG string, in `url(<svg>)` format,
|
24
|
+
/// for use in image or content properties
|
25
|
+
@function susy-svg-grid(
|
26
|
+
$grid: $susy,
|
27
|
+
$colors: null,
|
28
|
+
$offset: null
|
29
|
+
) {
|
30
|
+
// Grid parsing & normalizing
|
31
|
+
@if (type-of($grid) != 'map') and (length($grid) > 0) {
|
32
|
+
@if (not index($grid, 'of')) {
|
33
|
+
@if su-valid-columns($grid, 'fail-silent') {
|
34
|
+
$grid: 'of' $grid;
|
35
|
+
} @else {
|
36
|
+
$grid: join('of', $grid);
|
37
|
+
}
|
38
|
+
}
|
39
|
+
|
40
|
+
$grid: susy-parse($grid);
|
41
|
+
}
|
42
|
+
|
43
|
+
$grid: susy-settings($grid);
|
44
|
+
$grid: susy-normalize($grid);
|
45
|
+
|
46
|
+
|
47
|
+
// Color and gradient handling
|
48
|
+
$gradient: '';
|
49
|
+
|
50
|
+
@if (not $colors) {
|
51
|
+
$colors: susy-get('svg-grid-colors');
|
52
|
+
}
|
53
|
+
|
54
|
+
@if length($colors) > 1 {
|
55
|
+
$gradient: _susy-svg-gradient($colors);
|
56
|
+
$colors: 'url(%23susy-svg-gradient)';
|
57
|
+
} @else {
|
58
|
+
$colors: _susy-svg-color($colors);
|
59
|
+
}
|
60
|
+
|
61
|
+
|
62
|
+
// SVG construction
|
63
|
+
$columns: map-get($grid, 'columns');
|
64
|
+
$offset: $offset or _susy-svg-offset($grid);
|
65
|
+
|
66
|
+
$svg: 'data:image/svg+xml,';
|
67
|
+
$svg: $svg + '%3Csvg xmlns="http://www.w3.org/2000/svg" fill="#{$colors}" %3E';
|
68
|
+
$svg: $svg + $gradient;
|
69
|
+
|
70
|
+
@for $column from 1 through length($columns) {
|
71
|
+
$width: susy-span(1 at $column, $grid);
|
72
|
+
$x: _susy-svg-column-position($column, $grid);
|
73
|
+
|
74
|
+
$svg: $svg + _susy-svg-rect($x, $width, $offset);
|
75
|
+
}
|
76
|
+
|
77
|
+
@return url('#{$svg}%3C/svg%3E');
|
78
|
+
}
|
@@ -0,0 +1,72 @@
|
|
1
|
+
// SVG Grid Math
|
2
|
+
// =============
|
3
|
+
|
4
|
+
|
5
|
+
|
6
|
+
// SVG Column Position
|
7
|
+
// -------------------
|
8
|
+
/// Determine the proper horizontal position
|
9
|
+
/// for a column rectangle
|
10
|
+
///
|
11
|
+
/// @access private
|
12
|
+
///
|
13
|
+
/// @param {Integer} $column -
|
14
|
+
/// 1-indexed column location on the grid
|
15
|
+
/// @param {Map} $grid -
|
16
|
+
/// Normalized settings map representing the current grid
|
17
|
+
///
|
18
|
+
/// @return {Length} -
|
19
|
+
/// Horizontal position of svg column rectangle,
|
20
|
+
/// as distance from the grid edge
|
21
|
+
@function _susy-svg-column-position(
|
22
|
+
$column,
|
23
|
+
$grid
|
24
|
+
) {
|
25
|
+
$x: $column - 1;
|
26
|
+
|
27
|
+
@if ($x > 0) {
|
28
|
+
$x: susy-span(first $x wide, $grid);
|
29
|
+
}
|
30
|
+
|
31
|
+
@return $x;
|
32
|
+
}
|
33
|
+
|
34
|
+
|
35
|
+
|
36
|
+
// SVG Offset
|
37
|
+
// ----------
|
38
|
+
/// Determine if a grid image needs to be offset,
|
39
|
+
/// to account for edge gutters.
|
40
|
+
///
|
41
|
+
/// @access private
|
42
|
+
///
|
43
|
+
/// @param {Map} $grid -
|
44
|
+
/// Normalized settings map representing the current grid
|
45
|
+
///
|
46
|
+
/// @return {Length | null} -
|
47
|
+
/// Expected distance from container edge to first column,
|
48
|
+
/// based on spread values and gutter-widths
|
49
|
+
@function _susy-svg-offset(
|
50
|
+
$grid
|
51
|
+
) {
|
52
|
+
$columns: su-valid-columns(map-get($grid, 'columns'));
|
53
|
+
$gutters: su-valid-gutters(map-get($grid, 'gutters'), $columns);
|
54
|
+
$first: nth($columns, 1);
|
55
|
+
|
56
|
+
@if (unitless($first)) and (not unitless($gutters)) {
|
57
|
+
@return null;
|
58
|
+
}
|
59
|
+
|
60
|
+
$container: map-get($grid, 'container-spread');
|
61
|
+
$span: map-get($grid, 'spread');
|
62
|
+
$extra: $container - $span;
|
63
|
+
|
64
|
+
@if $extra == 0 {
|
65
|
+
@return null;
|
66
|
+
}
|
67
|
+
|
68
|
+
@return $extra * susy-gutter($config: $grid) / 2;
|
69
|
+
}
|
70
|
+
|
71
|
+
|
72
|
+
|
@@ -0,0 +1,14 @@
|
|
1
|
+
// SVG Settings
|
2
|
+
// ============
|
3
|
+
|
4
|
+
|
5
|
+
// Susy SVG Defaults
|
6
|
+
// =================
|
7
|
+
/// This plugin adds the `svg-grid-colors` property
|
8
|
+
/// and default value to `$susy-defaults` —
|
9
|
+
/// you can override that value in `$susy`
|
10
|
+
/// or any other grid settings map.
|
11
|
+
/// @group plugin_svg-grid
|
12
|
+
$susy-defaults: map-merge((
|
13
|
+
'svg-grid-colors': hsla(120, 50%, 50%, 0.5) hsla(120, 50%, 75%, 0.5),
|
14
|
+
), $susy-defaults);
|
@@ -0,0 +1,18 @@
|
|
1
|
+
// Unprefix Susy SVG Grid
|
2
|
+
// ======================
|
3
|
+
|
4
|
+
|
5
|
+
|
6
|
+
// SVG Grid
|
7
|
+
// --------
|
8
|
+
/// Un-prefixed alias for `susy-svg-grid`
|
9
|
+
///
|
10
|
+
/// @group plugin_svg-grid
|
11
|
+
/// @alias susy-svg-grid
|
12
|
+
@function svg-grid(
|
13
|
+
$grid: $susy,
|
14
|
+
$colors: susy-get('svg-grid-colors'),
|
15
|
+
$offset: null
|
16
|
+
) {
|
17
|
+
@return susy-svg-grid($grid, $colors, $offset);
|
18
|
+
}
|
@@ -0,0 +1,127 @@
|
|
1
|
+
// SVG Utilities
|
2
|
+
// =============
|
3
|
+
|
4
|
+
|
5
|
+
|
6
|
+
// SVG Validate Units
|
7
|
+
// ------------------
|
8
|
+
/// Make sure a length is supported in svg
|
9
|
+
///
|
10
|
+
/// @access private
|
11
|
+
///
|
12
|
+
/// @param {Length} $length -
|
13
|
+
/// The length to validate
|
14
|
+
/// @param {String} $name [null] -
|
15
|
+
/// Optional name of length origin,
|
16
|
+
/// for error reporting
|
17
|
+
///
|
18
|
+
/// @return {Length} -
|
19
|
+
/// An svg-validated length, or comparable valid length
|
20
|
+
@function _susy-svg-validate-units(
|
21
|
+
$length,
|
22
|
+
$name: null
|
23
|
+
) {
|
24
|
+
$_svg-units: ('em', 'ex', 'px', 'pt', 'pc', 'cm', 'mm', 'in', '%');
|
25
|
+
|
26
|
+
@if ($length == 0) or index($_svg-units, unit($length)) {
|
27
|
+
@return $length;
|
28
|
+
}
|
29
|
+
|
30
|
+
@return _susy-error(
|
31
|
+
'`#{unit($length)}` #{$name} units are not supported in SVG',
|
32
|
+
'_susy-svg-validate-units');
|
33
|
+
}
|
34
|
+
|
35
|
+
|
36
|
+
|
37
|
+
// SVG Rect
|
38
|
+
// --------
|
39
|
+
/// Build a single svg rectangle
|
40
|
+
///
|
41
|
+
/// @access private
|
42
|
+
///
|
43
|
+
/// @param {Length} $x -
|
44
|
+
/// Horizontal position for the rectangle
|
45
|
+
/// @param {Length} $width -
|
46
|
+
/// Width of the rectangle
|
47
|
+
/// @param {Length} $offset [null] -
|
48
|
+
/// Offset the rectangle, to account for edge gutters
|
49
|
+
///
|
50
|
+
/// @return {String} -
|
51
|
+
/// Escaped string representing one svg rectangle
|
52
|
+
@function _susy-svg-rect(
|
53
|
+
$x,
|
54
|
+
$width,
|
55
|
+
$offset: null
|
56
|
+
) {
|
57
|
+
$x: _susy-svg-validate-units($x);
|
58
|
+
$width: _susy-svg-validate-units($width);
|
59
|
+
$offset: if($offset == 0, null, $offset);
|
60
|
+
|
61
|
+
@if $offset and comparable($x, $offset) {
|
62
|
+
$x: $x + $offset;
|
63
|
+
$offset: null;
|
64
|
+
} @else if $offset {
|
65
|
+
$offset: 'style="transform:translateX(#{$offset})"';
|
66
|
+
}
|
67
|
+
|
68
|
+
@return '%3Crect x="#{$x}" width="#{$width}" height="100%" #{$offset}/%3E';
|
69
|
+
}
|
70
|
+
|
71
|
+
|
72
|
+
|
73
|
+
// SVG Color
|
74
|
+
// ---------
|
75
|
+
/// Stringify colors, and escape hex symbol
|
76
|
+
///
|
77
|
+
/// @access private
|
78
|
+
///
|
79
|
+
/// @param {Color} $color -
|
80
|
+
/// Color to stringify and escape
|
81
|
+
///
|
82
|
+
/// @return {String} -
|
83
|
+
/// Escaped string value of color
|
84
|
+
@function _susy-svg-color(
|
85
|
+
$color
|
86
|
+
) {
|
87
|
+
$color: inspect($color); // convert to string
|
88
|
+
|
89
|
+
@if (str-index($color, '#') == 1) {
|
90
|
+
$color: '%23' + str-slice($color, 2);
|
91
|
+
}
|
92
|
+
|
93
|
+
@return $color;
|
94
|
+
}
|
95
|
+
|
96
|
+
|
97
|
+
|
98
|
+
// SVG Gradient
|
99
|
+
// ------------
|
100
|
+
/// Create a multi-color svg gradient
|
101
|
+
///
|
102
|
+
/// @access private
|
103
|
+
///
|
104
|
+
/// @param {List} $colors -
|
105
|
+
/// List of colors to be equally spaced from `0%` to `100%`
|
106
|
+
/// in each column rectangle
|
107
|
+
///
|
108
|
+
/// @return {String} -
|
109
|
+
/// Escaped string representing one svg gradient
|
110
|
+
/// (`id="susy-svg-gradient"`)
|
111
|
+
@function _susy-svg-gradient(
|
112
|
+
$colors
|
113
|
+
) {
|
114
|
+
$gradient: '%3Cdefs%3E%3ClinearGradient spreadMethod="pad"';
|
115
|
+
$gradient: '#{$gradient} id="susy-svg-gradient"';
|
116
|
+
$gradient: '#{$gradient} x1="0%" y1="0%" x2="100%" y2="0%"%3E';
|
117
|
+
|
118
|
+
@for $i from 1 through length($colors) {
|
119
|
+
$color: _susy-svg-color(nth($colors, $i));
|
120
|
+
$offset: percentage(($i - 1) / (length($colors) - 1));
|
121
|
+
$stop: '%3Cstop offset="#{$offset}" style="stop-color:#{$color};" /%3E';
|
122
|
+
|
123
|
+
$gradient: $gradient + $stop;
|
124
|
+
}
|
125
|
+
|
126
|
+
@return $gradient + '%3C/linearGradient%3E%3C/defs%3E';
|
127
|
+
}
|
data/sass/susy/_api.scss
CHANGED
@@ -18,13 +18,15 @@
|
|
18
18
|
/// @group api
|
19
19
|
///
|
20
20
|
/// @param {List} $span -
|
21
|
-
/// Shorthand expression to define the width of the span
|
22
|
-
/// containing
|
23
|
-
///
|
24
|
-
///
|
25
|
-
///
|
26
|
-
///
|
27
|
-
///
|
21
|
+
/// Shorthand expression to define the width of the span,
|
22
|
+
/// optionally containing:
|
23
|
+
/// - a count, length, or column-list span;
|
24
|
+
/// - `at $n`, `first`, or `last` location on asymmetrical grids;
|
25
|
+
/// - `narrow`, `wide`, or `wider` for optionally spreading
|
26
|
+
/// across adjacent gutters;
|
27
|
+
/// - `of $n <spread>` for available grid columns
|
28
|
+
/// and spread of the container;
|
29
|
+
/// - and `set-gutters $n` to override global gutter settings
|
28
30
|
/// @param {Map} $config [()] -
|
29
31
|
/// Optional map of Susy grid configuration settings
|
30
32
|
///
|
@@ -48,7 +50,24 @@
|
|
48
50
|
$input: susy-settings($config, susy-parse($span));
|
49
51
|
$normal: susy-normalize($input);
|
50
52
|
|
51
|
-
@
|
53
|
+
@if map-get($normal, 'span') {
|
54
|
+
$args: (
|
55
|
+
'span', 'columns', 'gutters', 'spread', 'container-spread', 'location'
|
56
|
+
);
|
57
|
+
|
58
|
+
@each $key in map-keys($normal) {
|
59
|
+
@if not (index($args, $key)) {
|
60
|
+
$normal: map-remove($normal, $key);
|
61
|
+
}
|
62
|
+
}
|
63
|
+
|
64
|
+
@return su-span($normal...);
|
65
|
+
}
|
66
|
+
|
67
|
+
$actual: '[#{type-of($span)}] `#{inspect($span)}`';
|
68
|
+
@return _susy-error(
|
69
|
+
'Unable to determine span value from #{$actual}.',
|
70
|
+
'susy-span');
|
52
71
|
}
|
53
72
|
|
54
73
|
|
@@ -62,7 +81,10 @@
|
|
62
81
|
/// @group api
|
63
82
|
///
|
64
83
|
/// @param {Number | List} $context [null] -
|
65
|
-
/// Optional
|
84
|
+
/// Optional context for nested gutters,
|
85
|
+
/// including shorthand for
|
86
|
+
/// `columns`, `gutters`, and `container-spread`
|
87
|
+
/// (additional shorthand will be ignored)
|
66
88
|
/// @param {Map} $config [()] -
|
67
89
|
/// Optional map of Susy grid configuration settings
|
68
90
|
///
|
@@ -78,16 +100,25 @@
|
|
78
100
|
$context: susy-get('columns'),
|
79
101
|
$config: ()
|
80
102
|
) {
|
103
|
+
@if (not index($context, 'of')) {
|
104
|
+
@if su-valid-columns($context, 'fail-silent') {
|
105
|
+
$context: 'of' $context;
|
106
|
+
} @else {
|
107
|
+
$context: join('of', $context);
|
108
|
+
}
|
109
|
+
}
|
110
|
+
|
111
|
+
$parsed: susy-settings($config, susy-parse($context));
|
112
|
+
$normal: susy-normalize($parsed);
|
81
113
|
$args: ('columns', 'gutters', 'container-spread');
|
82
|
-
$input: susy-settings($config, ('columns': $context));
|
83
|
-
$normal: susy-normalize($input);
|
84
|
-
$output: ();
|
85
114
|
|
86
|
-
@each $
|
87
|
-
|
115
|
+
@each $key in map-keys($normal) {
|
116
|
+
@if not (index($args, $key)) {
|
117
|
+
$normal: map-remove($normal, $key);
|
118
|
+
}
|
88
119
|
}
|
89
120
|
|
90
|
-
@return su-gutter($
|
121
|
+
@return su-gutter($normal...);
|
91
122
|
}
|
92
123
|
|
93
124
|
|
data/sass/susy/_grids.scss
CHANGED
@@ -38,18 +38,18 @@
|
|
38
38
|
$container-spread: $spread,
|
39
39
|
$location: 1
|
40
40
|
) {
|
41
|
+
$span: su-valid-span($span);
|
41
42
|
$columns: su-valid-columns($columns);
|
42
43
|
$gutters: su-valid-gutters($gutters, $columns);
|
43
44
|
$spread: su-valid-spread($spread);
|
44
45
|
|
45
46
|
@if (type-of($span) == 'number') {
|
46
|
-
@if unitless($span) {
|
47
|
-
$location: su-valid-location($span, $location, $columns);
|
48
|
-
$span: su-slice($span, $columns, $location, $validate: false);
|
49
|
-
} @else {
|
50
|
-
// if you give us e.g. 3em, fine, we'll give it right back
|
47
|
+
@if (not unitless($span)) {
|
51
48
|
@return $span;
|
52
49
|
}
|
50
|
+
|
51
|
+
$location: su-valid-location($span, $location, $columns);
|
52
|
+
$span: su-slice($span, $columns, $location, $validate: false);
|
53
53
|
}
|
54
54
|
|
55
55
|
$span-width: su-sum($span, $gutters, $spread, $validate: false);
|
@@ -135,10 +135,8 @@
|
|
135
135
|
$column-sum: $column-sum + $column;
|
136
136
|
}
|
137
137
|
|
138
|
-
// Gutters are removed from the math if they
|
139
|
-
|
140
|
-
$is-mismatch: unitless($column-sum) and (not unitless($gutters));
|
141
|
-
@if ($not-comparable or $is-mismatch) {
|
138
|
+
// Gutters are removed from the math if they are non-comparable
|
139
|
+
@if (unitless($column-sum)) and (not unitless($gutters)) {
|
142
140
|
@return $column-sum;
|
143
141
|
}
|
144
142
|
|
data/sass/susy/_parser.scss
CHANGED
@@ -8,6 +8,7 @@
|
|
8
8
|
// - susy-normalize-location [function]
|
9
9
|
|
10
10
|
|
11
|
+
|
11
12
|
// Parse
|
12
13
|
// -----
|
13
14
|
/// Parse shorthand span expression
|
@@ -15,23 +16,27 @@
|
|
15
16
|
/// @access private
|
16
17
|
///
|
17
18
|
/// @param {List} $shorthand -
|
18
|
-
/// Shorthand expression to define the width of the span
|
19
|
-
/// containing
|
20
|
-
///
|
21
|
-
///
|
22
|
-
///
|
23
|
-
///
|
24
|
-
///
|
19
|
+
/// Shorthand expression to define the width of the span,
|
20
|
+
/// optionally containing:
|
21
|
+
/// - a count, length, or column-list span;
|
22
|
+
/// - `at $n`, `first`, or `last` location on asymmetrical grids;
|
23
|
+
/// - `narrow`, `wide`, or `wider` for optionally spreading
|
24
|
+
/// across adjacent gutters;
|
25
|
+
/// - `of $n <spread>` for available grid columns
|
26
|
+
/// and spread of the container;
|
27
|
+
/// - and `set-gutters $n` to override global gutter settings
|
28
|
+
/// @param {Bool} $context-only -
|
29
|
+
/// Allow the parser to ignore span and span-spread values,
|
30
|
+
/// only parsing context and container-spread
|
25
31
|
///
|
26
32
|
/// @return {Map} -
|
27
33
|
/// Map of span settings
|
28
|
-
/// (`span`, `location`, `columns`, `spread`, `container-spread`)
|
34
|
+
/// (`span`, `location`, `columns`, `gutters`, `spread`, `container-spread`)
|
29
35
|
/// parsed from shorthand input
|
30
36
|
@function susy-parse(
|
31
37
|
$shorthand
|
32
38
|
) {
|
33
|
-
$
|
34
|
-
$parse-error: 'Unknown span property:';
|
39
|
+
$parse-error: 'Unknown shorthand property:';
|
35
40
|
$options: (
|
36
41
|
'first': 'location',
|
37
42
|
'last': 'location',
|
@@ -46,80 +51,106 @@
|
|
46
51
|
$span: null;
|
47
52
|
$columns: null;
|
48
53
|
|
49
|
-
$of:
|
54
|
+
$of: null;
|
50
55
|
$next: false;
|
51
56
|
|
57
|
+
// loop through the shorthand list
|
52
58
|
@for $i from 1 through length($shorthand) {
|
53
59
|
$item: nth($shorthand, $i);
|
54
60
|
$type: type-of($item);
|
61
|
+
$details: '[#{$type}] `#{$item}`';
|
55
62
|
|
63
|
+
// if we know what's supposed to be coming next…
|
56
64
|
@if $next {
|
65
|
+
// If it's supposed to be a column width…
|
57
66
|
@if ($next == 'column-width') {
|
67
|
+
// if it looks like a column width…
|
58
68
|
@if ($type == 'number') and (not unitless($item)) {
|
59
|
-
|
69
|
+
// could be either span or context width…
|
70
|
+
@if $of {
|
60
71
|
$columns: join($columns, ('x' $item));
|
61
72
|
} @else {
|
62
73
|
$span: join($span, ('x' $item));
|
63
74
|
}
|
64
|
-
|
65
|
-
|
75
|
+
|
76
|
+
} @else { // Column-width error
|
77
|
+
@return _susy-error(
|
78
|
+
'`#{$item}` is not a valid column-width',
|
79
|
+
'susy-parse');
|
66
80
|
}
|
67
|
-
|
81
|
+
|
82
|
+
} @else { // For other values of next, we simply add to the return map
|
68
83
|
$return: map-merge($return, ($next: $item));
|
69
84
|
}
|
70
85
|
|
86
|
+
// Reset next to `false`
|
71
87
|
$next: false;
|
72
|
-
|
88
|
+
|
89
|
+
} @else { // If we don't know what's supposed to be coming…
|
90
|
+
// Keywords…
|
73
91
|
@if ($type == 'string') {
|
92
|
+
// Check the map for keywords…
|
74
93
|
@if map-has-key($options, $item) {
|
75
94
|
$setting: map-get($options, $item);
|
76
95
|
|
77
|
-
|
96
|
+
// Spread could be on the span or the container…
|
97
|
+
@if ($setting == 'spread') and ($of) {
|
78
98
|
$return: map-merge($return, ('container-spread': $item));
|
79
99
|
} @else {
|
80
100
|
$return: map-merge($return, ($setting: $item));
|
81
101
|
}
|
82
|
-
|
102
|
+
|
103
|
+
} @else if ($item == 'all') { // `All` is a span shortcut
|
83
104
|
$span: 'all';
|
84
|
-
|
85
|
-
|
86
|
-
} @else if ($item == 'at') {
|
105
|
+
|
106
|
+
} @else if ($item == 'at') { // Some keywords setup what's next…
|
87
107
|
$next: 'location';
|
88
108
|
} @else if ($item == 'x') {
|
89
109
|
$next: 'column-width';
|
110
|
+
} @else if ($item == 'set-gutters') {
|
111
|
+
$next: 'gutters';
|
90
112
|
} @else if ($item == 'of') {
|
91
113
|
$of: true;
|
92
|
-
|
93
|
-
|
114
|
+
|
115
|
+
} @else { // Error if we're out of ideas
|
116
|
+
@return _susy-error('#{$parse-error} #{$details}', 'susy-parse');
|
94
117
|
}
|
95
|
-
|
96
|
-
|
118
|
+
|
119
|
+
} @else if ($type == 'number') or ($type == 'list') { // Numbers & lists…
|
120
|
+
|
121
|
+
// We don't have a span, and we're not expecting context…
|
122
|
+
@if not ($span or $of) {
|
97
123
|
$span: $item;
|
98
|
-
|
124
|
+
|
125
|
+
} @else if ($of) and (not $columns) { // We are expecting context…
|
99
126
|
$columns: $item;
|
100
|
-
|
101
|
-
|
127
|
+
|
128
|
+
} @else { // Error if we don't understand…
|
129
|
+
@return _susy-error('#{$parse-error} #{$details}', 'susy-parse');
|
102
130
|
}
|
103
|
-
|
104
|
-
|
131
|
+
|
132
|
+
} @else { // Error if we don't know this type…
|
133
|
+
@return _susy-error('#{$parse-error} #{$details}', 'susy-parse');
|
105
134
|
}
|
106
135
|
}
|
107
136
|
}
|
108
137
|
|
138
|
+
// If we have span, merge it in
|
109
139
|
@if $span {
|
110
140
|
$return: map-merge($return, ('span': $span));
|
111
|
-
} @else {
|
112
|
-
@error $span-error;
|
113
141
|
}
|
114
142
|
|
143
|
+
// If we have columns, merge them in
|
115
144
|
@if $columns {
|
116
145
|
$return: map-merge($return, ('columns': $columns));
|
117
146
|
}
|
118
147
|
|
148
|
+
// Return the map of settings…
|
119
149
|
@return $return;
|
120
150
|
}
|
121
151
|
|
122
152
|
|
153
|
+
|
123
154
|
// Susy Normalize
|
124
155
|
// --------------
|
125
156
|
/// Normalize the values in a configuration map
|
@@ -139,6 +170,7 @@
|
|
139
170
|
|
140
171
|
@if $value {
|
141
172
|
$function: if(($setting == 'container-spread'), 'spread', $setting);
|
173
|
+
$function: _susy-get-function($function);
|
142
174
|
$value: call('susy-normalize-#{$function}', $value);
|
143
175
|
}
|
144
176
|
|
@@ -163,6 +195,7 @@
|
|
163
195
|
}
|
164
196
|
|
165
197
|
|
198
|
+
|
166
199
|
// Normalize Columns
|
167
200
|
// -----------------
|
168
201
|
/// Normalize `columns` shorthand for Su
|
@@ -199,6 +232,7 @@
|
|
199
232
|
}
|
200
233
|
|
201
234
|
|
235
|
+
|
202
236
|
// Normalize Span
|
203
237
|
// --------------
|
204
238
|
/// Normalize `span` shorthand for Su
|
@@ -226,6 +260,7 @@
|
|
226
260
|
}
|
227
261
|
|
228
262
|
|
263
|
+
|
229
264
|
// Normalize Spread
|
230
265
|
// ----------------
|
231
266
|
/// Normalize `spread` shorthand for Su
|
@@ -251,6 +286,7 @@
|
|
251
286
|
}
|
252
287
|
|
253
288
|
|
289
|
+
|
254
290
|
// Normalize Location
|
255
291
|
// ------------------
|
256
292
|
/// Normalize `location` shorthand for Su
|
data/sass/susy/_settings.scss
CHANGED
@@ -6,6 +6,7 @@
|
|
6
6
|
// - susy-get [function]
|
7
7
|
|
8
8
|
|
9
|
+
|
9
10
|
// Susy
|
10
11
|
// ----
|
11
12
|
/// Custom user configuration map for Susy
|
@@ -40,6 +41,7 @@
|
|
40
41
|
$susy: () !default;
|
41
42
|
|
42
43
|
|
44
|
+
|
43
45
|
// Susy Defaults
|
44
46
|
// -------------
|
45
47
|
/// Configuration map of Susy factory defaults
|
@@ -95,6 +97,7 @@ $susy-defaults: (
|
|
95
97
|
}
|
96
98
|
|
97
99
|
|
100
|
+
|
98
101
|
// Susy Get
|
99
102
|
// --------
|
100
103
|
/// Return the current value of any Susy setting
|
@@ -113,7 +116,9 @@ $susy-defaults: (
|
|
113
116
|
$settings: susy-settings();
|
114
117
|
|
115
118
|
@if not map-has-key($settings, $key) {
|
116
|
-
@error
|
119
|
+
@return _susy-error(
|
120
|
+
'There is no Susy setting called `#{$key}`',
|
121
|
+
'susy-get');
|
117
122
|
}
|
118
123
|
|
119
124
|
@return map-get($settings, $key);
|
@@ -0,0 +1,60 @@
|
|
1
|
+
// Sass Utilities
|
2
|
+
// ==============
|
3
|
+
// - Susy Get Function [function]
|
4
|
+
// - Susy Error Output Override [variable]
|
5
|
+
// - Susy Error [function]
|
6
|
+
|
7
|
+
|
8
|
+
|
9
|
+
// Susy Get Function
|
10
|
+
// -----------------
|
11
|
+
/// Get a first-class function in Sass 3.5+,
|
12
|
+
/// or the function name string (unchanged)
|
13
|
+
/// in older Sass versions.
|
14
|
+
///
|
15
|
+
/// @access private
|
16
|
+
///
|
17
|
+
/// @param {String} $function -
|
18
|
+
/// The name (string) of a function to be called.
|
19
|
+
/// @return {String | Function} -
|
20
|
+
/// Returns a first-class function in Sass 3.5+,
|
21
|
+
/// or the function name string in older Sass versions.
|
22
|
+
@function _susy-get-function(
|
23
|
+
$function
|
24
|
+
) {
|
25
|
+
$type: type-of($function);
|
26
|
+
|
27
|
+
@if ($type != 'string') {
|
28
|
+
@return _susy-error(
|
29
|
+
'Invalid function-name [#{$type}] `#{$function}`, name must be a string.',
|
30
|
+
'_susy-get-function');
|
31
|
+
}
|
32
|
+
|
33
|
+
@if function-exists('get-function') {
|
34
|
+
@return get-function($function);
|
35
|
+
}
|
36
|
+
|
37
|
+
@return $function;
|
38
|
+
}
|
39
|
+
|
40
|
+
|
41
|
+
|
42
|
+
// Susy Error Output Override
|
43
|
+
// --------------------------
|
44
|
+
$_susy-error-output-override: false !default;
|
45
|
+
|
46
|
+
|
47
|
+
|
48
|
+
// Susy Error
|
49
|
+
// ----------
|
50
|
+
@function _susy-error(
|
51
|
+
$message,
|
52
|
+
$source,
|
53
|
+
$override: $_susy-error-output-override
|
54
|
+
) {
|
55
|
+
@if $override {
|
56
|
+
@return 'ERROR [#{$source}] #{$message}';
|
57
|
+
}
|
58
|
+
|
59
|
+
@error '[#{$source}] #{$message}';
|
60
|
+
}
|
data/sass/susy/_validation.scss
CHANGED
@@ -6,6 +6,37 @@
|
|
6
6
|
// - su-valid-location [function]
|
7
7
|
|
8
8
|
|
9
|
+
|
10
|
+
// Valid Span
|
11
|
+
// ----------
|
12
|
+
/// Check that the `span` argument
|
13
|
+
/// is a number, length, or column-list
|
14
|
+
///
|
15
|
+
/// @access private
|
16
|
+
///
|
17
|
+
/// @param {Number | List} $span -
|
18
|
+
/// Number of columns, or length of span
|
19
|
+
///
|
20
|
+
/// @return {Number | List} -
|
21
|
+
/// Validated `$span` number, length, or columns list
|
22
|
+
@function su-valid-span(
|
23
|
+
$span
|
24
|
+
) {
|
25
|
+
$type: type-of($span);
|
26
|
+
@if ($type == 'number') {
|
27
|
+
@return $span;
|
28
|
+
} @else if ($type == 'list') and su-valid-columns($span, 'silent-failure') {
|
29
|
+
@return $span;
|
30
|
+
}
|
31
|
+
|
32
|
+
$actual: '[#{type-of($span)}] `#{inspect($span)}`';
|
33
|
+
@return _susy-error(
|
34
|
+
'#{$actual} is not a valid number, length, or column-list for $span.',
|
35
|
+
'su-valid-span');
|
36
|
+
}
|
37
|
+
|
38
|
+
|
39
|
+
|
9
40
|
// Valid Columns
|
10
41
|
// -------------
|
11
42
|
/// Check that the `columns` argument is a valid
|
@@ -15,25 +46,36 @@
|
|
15
46
|
///
|
16
47
|
/// @param {List} $columns -
|
17
48
|
/// List of column-lengths using comparable units
|
49
|
+
/// @param {Bool} $silent-failure [true] -
|
50
|
+
/// Set false to return null on failure
|
18
51
|
///
|
19
52
|
/// @return {List} -
|
20
53
|
/// Validated `$columns` list
|
21
54
|
@function su-valid-columns(
|
22
|
-
$columns
|
55
|
+
$columns,
|
56
|
+
$silent-failure: false
|
23
57
|
) {
|
24
58
|
$first: nth($columns, 1);
|
25
59
|
|
26
60
|
@each $col in $columns {
|
27
|
-
@if (type-of($col) != 'number') or (not comparable($col, $first)) {
|
61
|
+
@if (type-of($col) != 'number') or (not comparable($col, $first)) or (unitless($col) and not unitless($first)) or (unitless($first) and not unitless($col)) {
|
62
|
+
@if $silent-failure {
|
63
|
+
@return null;
|
64
|
+
}
|
65
|
+
|
28
66
|
$actual: '[#{type-of($columns)}] `#{inspect($columns)}`';
|
29
|
-
@error
|
67
|
+
@return _susy-error(
|
68
|
+
'#{$actual} is not a valid list of comparable lengths for $columns.',
|
69
|
+
'su-valid-columns');
|
30
70
|
}
|
71
|
+
|
31
72
|
}
|
32
73
|
|
33
74
|
@return $columns;
|
34
75
|
}
|
35
76
|
|
36
77
|
|
78
|
+
|
37
79
|
// Valid Gutters
|
38
80
|
// -------------
|
39
81
|
/// Check that the `gutters` argument is a valid number
|
@@ -54,18 +96,31 @@
|
|
54
96
|
$type: type-of($gutters);
|
55
97
|
|
56
98
|
@if ($type == 'number') {
|
57
|
-
|
58
|
-
|
99
|
+
$first: nth($columns, 1);
|
100
|
+
|
101
|
+
@if (unitless($gutters) and not unitless($first)) {
|
102
|
+
@return _susy-error(
|
103
|
+
'Gutters must have units for a static grid.',
|
104
|
+
'su-valid-gutters');
|
105
|
+
}
|
106
|
+
|
107
|
+
@if (not comparable($gutters, $first)) {
|
108
|
+
@return _susy-error(
|
109
|
+
'Gutter and column units must be comparable.',
|
110
|
+
'su-valid-gutters');
|
59
111
|
}
|
60
112
|
|
61
113
|
@return $gutters;
|
62
114
|
}
|
63
115
|
|
64
116
|
$actual: '[#{$type}] `#{inspect($gutters)}`';
|
65
|
-
@error
|
117
|
+
@return _susy-error(
|
118
|
+
'#{$actual} is not a value for $gutters.',
|
119
|
+
'su-valid-gutters');
|
66
120
|
}
|
67
121
|
|
68
122
|
|
123
|
+
|
69
124
|
// Valid Spread
|
70
125
|
// ------------
|
71
126
|
/// Check that the `spread` argument is a valid
|
@@ -87,10 +142,13 @@
|
|
87
142
|
}
|
88
143
|
|
89
144
|
$actual: '[#{type-of($spread)}] `#{inspect($spread)}`';
|
90
|
-
@error
|
145
|
+
@return _susy-error(
|
146
|
+
'#{$actual} is not a normalized [0 | 1 | -1] value for `$spread`.',
|
147
|
+
'su-valid-spread');
|
91
148
|
}
|
92
149
|
|
93
150
|
|
151
|
+
|
94
152
|
// Valid Location
|
95
153
|
// --------------
|
96
154
|
/// Check that the `location` argument is a valid number,
|
@@ -117,14 +175,22 @@
|
|
117
175
|
@if $location {
|
118
176
|
@if (type-of($location) != 'number') or (not unitless($location)) {
|
119
177
|
$actual: '[#{type-of($location)}] `#{$location}`';
|
120
|
-
@error
|
178
|
+
@return _susy-error(
|
179
|
+
'#{$actual} is not a unitless number for $location.',
|
180
|
+
'su-valid-location');
|
121
181
|
} @else if (round($location) != $location) {
|
122
|
-
@error
|
123
|
-
|
124
|
-
|
182
|
+
@return _susy-error(
|
183
|
+
'Location (`#{$location}`) must be a 1-indexed intiger position.',
|
184
|
+
'su-valid-location');
|
185
|
+
} @else if ($location > $count) or ($location < 1) {
|
186
|
+
@return _susy-error(
|
187
|
+
'Position `#{$location}` does not exist in grid `#{$columns}`.',
|
188
|
+
'su-valid-location');
|
125
189
|
} @else if ($location + $span - 1 > $count) {
|
126
190
|
$details: 'grid `#{$columns}` for span `#{$span}` at `#{$location}`';
|
127
|
-
@error
|
191
|
+
@return _susy-error(
|
192
|
+
'There are not enough columns in #{$details}.',
|
193
|
+
'su-valid-location');
|
128
194
|
}
|
129
195
|
}
|
130
196
|
|
metadata
CHANGED
@@ -1,7 +1,7 @@
|
|
1
1
|
--- !ruby/object:Gem::Specification
|
2
2
|
name: susy
|
3
3
|
version: !ruby/object:Gem::Version
|
4
|
-
version: 3.0.0.alpha.
|
4
|
+
version: 3.0.0.alpha.2
|
5
5
|
platform: ruby
|
6
6
|
authors:
|
7
7
|
- Miriam Eric Suzanne
|
@@ -46,11 +46,19 @@ files:
|
|
46
46
|
- lib/susy.rb
|
47
47
|
- sass/_prefix.scss
|
48
48
|
- sass/_susy.scss
|
49
|
+
- sass/plugins/_svg-grid.scss
|
50
|
+
- sass/plugins/svg-grid/_prefix.scss
|
51
|
+
- sass/plugins/svg-grid/_svg-api.scss
|
52
|
+
- sass/plugins/svg-grid/_svg-grid-math.scss
|
53
|
+
- sass/plugins/svg-grid/_svg-settings.scss
|
54
|
+
- sass/plugins/svg-grid/_svg-unprefix.scss
|
55
|
+
- sass/plugins/svg-grid/_svg-utilities.scss
|
49
56
|
- sass/susy/_api.scss
|
50
57
|
- sass/susy/_grids.scss
|
51
58
|
- sass/susy/_parser.scss
|
52
59
|
- sass/susy/_settings.scss
|
53
60
|
- sass/susy/_unprefix.scss
|
61
|
+
- sass/susy/_utilities.scss
|
54
62
|
- sass/susy/_validation.scss
|
55
63
|
- CHANGELOG.md
|
56
64
|
- LICENSE.txt
|
@@ -77,9 +85,9 @@ required_ruby_version: !ruby/object:Gem::Requirement
|
|
77
85
|
version: '0'
|
78
86
|
required_rubygems_version: !ruby/object:Gem::Requirement
|
79
87
|
requirements:
|
80
|
-
- - '
|
88
|
+
- - '>='
|
81
89
|
- !ruby/object:Gem::Version
|
82
|
-
version: 1.
|
90
|
+
version: '1.2'
|
83
91
|
requirements: []
|
84
92
|
rubyforge_project: susy
|
85
93
|
rubygems_version: 2.1.10
|