csster 1.2.0 → 1.3.0

Sign up to get free protection for your applications and to get access to all the features.
checksums.yaml CHANGED
@@ -1,7 +1,7 @@
1
1
  ---
2
2
  SHA1:
3
- metadata.gz: 49e218f2e03cfc824d645e24a282a3108bb8ce63
4
- data.tar.gz: 4ac80fbca170a31ef84d3e82d78f6a070d052856
3
+ metadata.gz: 4346d10b45afa599e70155d7b400416b78421696
4
+ data.tar.gz: e37d54be1ad7079244f2e627f99cf772781694ca
5
5
  SHA512:
6
- metadata.gz: 8f79414e804667b33edf7ab88ef34eb06a53911debd1f96d64cbec907cb9ea714b5259cf05db3925b725935e064f04873a8e974af3a9e3507c323dee8208ab7d
7
- data.tar.gz: e9b56552eb9ba9e07a0fd6c79086bf0f0d41fd570a15863d28a1327fc41236ac2fa86a9efb9a25e074d815da0c8e3870373c109f1423394c47941838e8b86bd6
6
+ metadata.gz: 65a58688bcda5f312fd6bc28c5436d7a8d4ab2fdd969930e5445e374c893d663d63ef4ee5f8fe193715fab1ba3c1eb91621e41c1c6523f19cbab6333edaf33a0
7
+ data.tar.gz: 8cf3e1869bd77e321fe8ae290f30485fbc75341ca5c9bd69dacd1bf9014660a217130fd56258f183fa9019c9bbe0bf665c6a2242f20b8414393c6520f20ca07c
data/README.md CHANGED
@@ -8,7 +8,7 @@ Concisely generate CSS style rules within Javascript. Features:
8
8
 
9
9
  * standard "object literal"/JSON format with good editor support
10
10
  * nesting to DRY up stylesheets
11
- * color functions like <code>darken</code> and <code>saturate</code>
11
+ * color functions like `darken` and `saturate`
12
12
  * built-in macros for common CSS idioms like *clearfix*, *rounded corners*, *drop shadows*.
13
13
  * extension points for custom behavior or cross-browser support.
14
14
  * and all the plain old Javascript behavior: functions, data structures, looping, Math operations, etc.
@@ -59,42 +59,49 @@ The result is inserted in DOM automatically at the bottom of the &lt;head&gt; el
59
59
 
60
60
  ```html
61
61
  ...
62
- &lt;style type="text/stylesheet"&gt;
62
+ <style type="text/stylesheet">
63
63
  h1 {
64
64
  font-size: 18px;
65
65
  color: red;
66
66
  }
67
- &lt;/style&gt;
68
- &lt;/head&gt;
67
+ </style>
68
+ </head>
69
69
  ...
70
70
  ```
71
71
 
72
- ### Format of CSS Rules
72
+ ### Node Usage
73
73
 
74
- The *style* method accepts CSS rules passed either as arrays or hashes, arrays just being
74
+ `Csster.buildCss` accepts arrays or hashes of rules and returns a text string of the Css rules.
75
+ The caller is responsible for writing to the browser.
76
+
77
+
78
+ ### Building CSS Rules
79
+
80
+ The `Csster.style` method accepts CSS rules passed either as arrays or hashes, arrays just being
75
81
  a way to order the hashes. For example:
76
82
 
77
- <pre>
78
- {
83
+ ```javascript
84
+ Csster.style({
79
85
  ul: {
80
86
  margin: 5,
81
87
  padding: 0,
82
88
  }
83
89
  'ul li:first': {
84
- paddingLeft: 20px
90
+ paddingLeft: '20px'
85
91
  }
86
92
  }
87
- </pre>
93
+ ```
88
94
 
89
95
  Note that
90
96
 
91
- * property names are automatically converted to hyphenated format from camelcase, so in many cases you can omit the quotation marks. ('float' needs to quoted since it's a reserved word.)
92
- * all raw numbers are assumed to be "pixels" (or "px"), and rendered as such.
97
+ * property names are automatically converted to hyphenated format from camelCase, so in many cases you can omit the quotation marks. (`float` needs to quoted since it's a reserved word.)
98
+ * most raw numbers are assumed to be "pixels" (or "px"), and rendered as such. A heuristic helps in this, skipping `opacity`, `z-index`, etc.
93
99
  * any sort of selectors are allowed... they are just passed through to the stylesheet.
94
100
 
95
101
  #### Nesting
96
102
  Csster supports nesting of rules to keep things more concise:
97
- <pre>
103
+
104
+ ```javascript
98
105
  {
99
106
  ul: {
100
107
  margin: 5,
@@ -106,65 +113,92 @@ Csster supports nesting of rules to keep things more concise:
106
113
  }
107
114
  }
108
115
  }
109
- </pre>
116
+ ```
110
117
 
111
118
  The "li" property in this case might be a selector or might be a property name. A list of valid
112
119
  property names is used to identify properties right now, and otherwise it's considered a sub-selector.
113
120
 
114
- Csster supports SASS's "&" operator, to indicate that the selector should be combined with the parent selector.
121
+ Csster supports SASS's `&` operator, to indicate that the selector should be combined with the parent selector.
115
122
  Instead of the default "any descendent" space character being inserted, no space is inserted.
116
123
 
117
124
  Combined rules (with commas) are expanded as expected, so nested rules with commas have their parents expanded.
118
125
 
119
126
 
127
+ #### Functions
128
+ Most manipulations you'll want don't require any special syntax. They will fall into
129
+ Javascript's language support, as far as any math or looping.
130
+ Use Javascript to write necessary functions! Include them directly in the
131
+ CSS rule definitions.
120
132
 
121
133
 
122
- #### Functions
123
- Most manipulations will fall into Javascript's language support, as far as any math or looping. Use Javascript to write necessary functions.
134
+ #### Colors
124
135
 
125
- functions/color.es6 contains SASS-like color functions mixed into the base String object:
136
+ Colors can be particularly brittle in CSS, so color conversion functions are included.
137
+ The easiest way to enable this is to call:
138
+
139
+ Csster.colorizeString()
140
+
141
+ Now the `String` prototype will include SASS-like color functions:
126
142
 
127
- * <code>"#ab342c".darken(%)</code> -- make color darker by given percent
128
- * <code>"#ab342c".lighten(%)</code> -- make color lighter by given percent
129
- * <code>"#ab342c".saturate(%)</code> -- make color more saturated by given percent. To *desaturate*, use negative values for the percent. Note that <code>"#ab342c".saturate(-100)</code> renders in grayscale.
143
+ * `"#ab342c".darken(%)` -- make color darker by given percent
144
+ * `"#ab342c".lighten(%)` -- make color lighter by given percent
145
+ * `"#ab342c".saturate(%)` -- make color more saturated by given percent. To *desaturate*, use negative values for the percent. Note that `"#ab342c".saturate(-100)` renders in grayscale.
130
146
 
131
147
  There are also color conversion routines if you want to build your own manipulation.
132
148
 
133
- * <code>"#ab342c".toRGB()</code>
134
- * <code>"#ab342c".toHSL()</code>
135
- * <code>Csster.hslToHexColor(h,s,l)</code>
149
+ * `"#ab342c".toRGB()`
150
+ * `"#ab342c".toHSL()`
151
+ * `Csster.hslToHexColor(h,s,l)`
136
152
 
137
153
  Opacity is currently not supported by the color model.
138
154
 
139
- #### Macros using "has" key
155
+ ### Macros
156
+
157
+ Although the Javascript language probably offers enough flexibility for most of what you
158
+ want, macros are also a core part of Csster.
159
+
160
+ #### Pre-build Macros
140
161
 
141
162
  There are a host of pre-made macros that may be useful:
142
163
 
143
- * <code>roundedCorners(radius)</code> -- add rounded corners on all sides
144
- * <code>roundedCorners(side, radius)</code> -- add rounded corners on specified side: <code>'top'</code>, <code>'left'</code>, <code>'bottom'</code> or <code>'right'</code>
145
- * <code>roundedCorners(corner, radius)</code> -- add rounded corners to a specified corner: <code>'tl'</code>, <code>'tr'</code>, <code>'bl'</code> or <code>'br'</code>
146
- * <code>imageReplacement(width, height, img, imgXPosition=0, imgYPosition=0)</code> -- phark image replacement with optional background image offset.
147
- * <code>boxShadow([xoffset, yoffset], radius, color)</code>
148
- * <code>verticalCentering(height)</code> and <code>horizontalCentering(width)</code> -- center using the top 50% / margin-top -width/2 technique. See http://stackoverflow.com/questions/148251/css-centering-tricks
149
- * <code>clearfix()</code> -- standard clearfix
164
+ * `roundedCorners(radius)` -- add rounded corners on all sides
165
+ * `roundedCorners(side, radius)` -- add rounded corners on specified side: `'top'`, `'left'`, `'bottom'` or `'right'`
166
+ * `roundedCorners(corner, radius)` -- add rounded corners to a specified corner: `'tl'`, `'tr'`, `'bl'` or `'br'`
167
+ * `imageReplacement(width, height, img, imgXPosition=0, imgYPosition=0)` -- phark image replacement with optional background image offset.
168
+ * `boxShadow([xoffset, yoffset], radius, color)`
169
+ * `verticalCentering(height)` and `horizontalCentering(width)` -- center using the top 50% / margin-top -width/2 technique. See http://stackoverflow.com/questions/148251/css-centering-tricks
170
+ * `clearfix()` -- standard clearfix
150
171
 
151
- To "mix these in", use the "has" key:
172
+ #### Using macros with the "has" or "mixin" key
152
173
 
153
- <pre>
154
- {
155
- 'div#featured_box': {
156
- backgroundColor: '#394c89',
157
- has: roundedCorner(5)
174
+ To "mix these in", use the `has`, `mixin` or `mixins` key:
175
+
176
+ {
177
+ 'div#featured_box': {
178
+ backgroundColor: '#394c89',
179
+ has: roundedCorner(5)
180
+ }
158
181
  }
159
- }
160
- </pre>
161
182
 
162
- Multiple macros can be included by making that a list, eg. <code>has: [roundedCorners(5), dropShadow()]</code>.
183
+ Multiple macros can be included by making that a list, eg. `has: [roundedCorners(5), dropShadow()]`.
184
+
185
+ #### Macros fake property names
186
+
187
+ You can also make these _pseudo properties_ using the `Csster.setMacro` method. For example,
188
+
189
+ Csster.setMacro('roundedCorners', (px) => { return { borderRadius: px } })
190
+
191
+ As you might expect, this defines a property that is rendered with the given function. Therefore:
192
+
193
+ ...
194
+ Csster.style({ div: roundedCorners: 5 })
195
+
196
+ #### Writing Macros
163
197
 
164
- It's all Javascript, so macros and more complex functions are easy to write. To mix in a set of values, create a function
165
- that returns a hash of values, for example:
198
+ It's all Javascript, so macros and more complex functions are easy to write.
199
+ To mix in a set of values, create a function that returns a hash of values, for example:
166
200
 
167
- <pre>
201
+ ```javascript
168
202
  function roundedCorners(radius) {
169
203
  return {
170
204
  '-webkit-border-radius': radius,
@@ -172,21 +206,38 @@ that returns a hash of values, for example:
172
206
  'border-radius': radius
173
207
  }
174
208
  }
175
- </pre>
209
+ ```
210
+
211
+ A macro's properties will be overwritten similar to how the cascade takes the last defined value: later ones override earlier ones.
212
+
213
+
214
+ ## Verification
215
+
216
+ By default, property names are validated against recent HTML specs.
217
+ The build-in tool rejects non-standard property names,
218
+ although by default popular "-moz" and "-webkit" properties are added.
219
+ Use `Csster.addPropertyNames` to supplement property names it might not
220
+ consider valid.
221
+
222
+ At this time of history, though, validation is not necessarily what you want.
223
+ To turn this off, use:
224
+
225
+ Csster.propertyNameValidator.setConfig('strictNames', false)
176
226
 
177
- A macro's properties will be overwritten by properties within including selector (or later included macros), similar to how the cascade takes the last defined value.
227
+ By default, any browser extension property (such as `-moz-boo`) is allowed. To
228
+ restrict this, turn on the validation:
229
+
230
+ Csster.propertyNameValidator.setConfig('anyBrowserExtension', false)
178
231
 
179
232
 
180
233
  ## jQuery Integration
181
234
 
182
- If jQuery is loaded first, Csster provides a "csster" method:
235
+ If jQuery is loaded before Csster, it provides a "csster" plugin:
183
236
 
184
- <pre>
185
- $('.sidebar').csster({ border: '5px solid green', padding: 10 });
186
- </pre>
237
+ $('.sidebar').csster({ border: '5px solid green', padding: 10 });
187
238
 
188
239
  As expected, this adds a rule to the document with the ".sidebar" selector.
189
- In general, this can be called identically to the <code>css()</code> function.
240
+ In general, this can be called identically to the `css()` function.
190
241
  This is useful is the DOM on the page is dynamic and when a rule is more efficient than applying
191
242
  a style repeatedly to all the DOM nodes.
192
243
 
@@ -196,40 +247,8 @@ nothing is done to convert or report unsupported selectors (just like regular CS
196
247
 
197
248
  ## Extending Csster
198
249
 
199
- Csster is built as an extensible system.
200
-
201
- ### Adding Custom Property Names
202
- Use <code>Csster.addPropertyNames</code> to add any non-standard property names you'd like to be considered valid. The build-in tool rejects non-standard property names, although by default popular "-moz" and "-webkit" properties are added.
203
-
204
- ### Pre-process rules
205
- <del>Functions called before properties are processed stored in <code>Csster.propertyPreprocessors</code>. Callback is provided a hash of properties to values, which it modifies in any way it wants. This is used to interpret macros.</del>
206
-
207
- <del>### Post-processing
208
- Functions called after rules are processed stored in <code>Csster.rulesPostProcessors</code>. Called with an array of processed rules. Can be used to eliminate duplicates, modify selectors, etc. Standard list simplifies overly complex selectors with multiple IDs.
209
-
210
- A convenient built-in function is <code>compressSelectors</code>. Using this processor, rules with multiple '#'s are simplified. For example, '#a #b #c' becomes '#c'. Usually this is what you will want, so include it with <code>Csster.rulePostProcessors.push(Csster.compressSelectors);</code>.
211
-
212
- This is used to write custom browser overrides. For example, this one makes opacity work for IE:
213
-
214
- <pre>
215
- Csster.rulesPostProcessors.push(function ieOpacity(rules) {
216
- // http://www.smashingmagazine.com/2010/04/28/css3-solutions-for-internet-explorer/
217
- if (Csster.browserInfo().msie) {
218
- for (var i = 0; i &lt; rules.length; i++) {
219
- var rule = rules[i];
220
- var value = rule.props['opacity']
221
- if (value) {
222
- value = Math.round(value * 100.0);
223
- rules[i].props['filter'] = 'progid:DXImageTransform.Microsoft.Alpha(opacity=' + value + ')';
224
- }
225
- }
226
- }
227
- });
228
- </pre>
229
- </del>
230
-
231
250
  ### Inserting into the DOM
232
- Function that outputs a set of rules into the DOM is <code>Csster.insertCss</code> and can be replaced if desired.
251
+ Function that outputs a set of rules into the DOM is `Csster.insertCss` and can be replaced if desired.
233
252
 
234
253
  ## V2.0 Changes
235
254
 
@@ -241,6 +260,7 @@ Function that outputs a set of rules into the DOM is <code>Csster.insertCss</cod
241
260
  ### Other changes:
242
261
 
243
262
  * use ES6 for implementation and provide a more compressed and clean script.
263
+ * fake-property-based macros
244
264
  * add ability to turn off property name validation.
245
265
  * add ability to warn about unknown browser extensions for property names.
246
266
 
@@ -269,10 +289,10 @@ Function that outputs a set of rules into the DOM is <code>Csster.insertCss</cod
269
289
  2. Update `bin/build.sh#2` `VERSION=` code.
270
290
  3. `bin/build.sh`
271
291
  4. `rake build`
272
- 5. `rake checkin`
292
+ 5. `git checkin...`
273
293
  6. `rake push...`
274
- 7. `rake release`
275
- 8. `npm publish`
294
+ 7. `rake release` # Ruby Gem
295
+ 8. `npm publish` # Node module
276
296
 
277
297
 
278
298
  ### TDD
@@ -1,3 +1,3 @@
1
1
  module Csster
2
- VERSION = "1.2.0"
2
+ VERSION = "1.3.0"
3
3
  end
@@ -1,4 +1,4 @@
1
- // Csster version 1.2.0; Copyright (c) Andrew J. Peterson / ndpsoftware.com. All Rights Reserved
1
+ // Csster version 1.3.0; Copyright (c) Andrew J. Peterson / ndpsoftware.com. All Rights Reserved
2
2
  (function webpackUniversalModuleDefinition(root, factory) {
3
3
  if(typeof exports === 'object' && typeof module === 'object')
4
4
  module.exports = factory();
@@ -104,6 +104,8 @@ return /******/ (function(modules) { // webpackBootstrap
104
104
 
105
105
  var macros = _interopRequireWildcard(_macros);
106
106
 
107
+ var _macroProcessor = __webpack_require__(12);
108
+
107
109
  var _array = __webpack_require__(9);
108
110
 
109
111
  var _browser = __webpack_require__(27);
@@ -126,14 +128,15 @@ return /******/ (function(modules) { // webpackBootstrap
126
128
  insertCss: _insertCss2.default,
127
129
  style: style,
128
130
  macros: macros,
131
+ setMacro: _macroProcessor.setMacro,
129
132
  arrayFlatten: _array.arrayFlatten,
130
133
  browserInfo: _browser.browserInfo,
131
134
  hslToHexColor: _color.hslToHexColor,
132
- addPropertyNames: addPropertyNames
135
+ addPropertyNames: addPropertyNames,
136
+ propertyNameValidator: propertyNameValidator,
137
+ colorizeString: _color.colorizeString
133
138
  };
134
139
 
135
- (0, _color.colorizeString)();
136
-
137
140
  /***/ },
138
141
  /* 4 */
139
142
  /***/ function(module, exports, __webpack_require__) {
@@ -168,12 +171,13 @@ return /******/ (function(modules) { // webpackBootstrap
168
171
  Object.defineProperty(exports, "__esModule", {
169
172
  value: true
170
173
  });
171
- exports.rejectUnknownPropertyKeys = exports.dasherizePropertyKeys = undefined;
174
+ exports.dasherizePropertyKeys = undefined;
172
175
 
173
- exports.default = function (obj) {
176
+ exports.default = function (objOrArray) {
177
+ var a = (0, _array.arrayFlatten)([objOrArray]);
174
178
  var rules = [];
175
- (0, _array.arrayEach)((0, _array.arrayFlatten)([obj]), function (o) {
176
- rules.push(objectToRulesArray(process(o)));
179
+ (0, _array.arrayEach)(a, function (o) {
180
+ return rules.push(objectToRulesArray(process(o)));
177
181
  });
178
182
  return (0, _array.arrayFlatten)(rules);
179
183
  };
@@ -190,8 +194,6 @@ return /******/ (function(modules) { // webpackBootstrap
190
194
 
191
195
  var _properties = __webpack_require__(13);
192
196
 
193
- var applyMacros = (0, _object.filterValuesRecursively)(_macroProcessor.macroProcessor);
194
-
195
197
  // @param cssRule { selector: { prop1: value, prop2: value, subselector: { prop3: value}}
196
198
  var objectToRulesArray = function objectToRulesArray(o) {
197
199
  var result = [];
@@ -203,9 +205,13 @@ return /******/ (function(modules) { // webpackBootstrap
203
205
 
204
206
  var dasherizePropertyKeys = exports.dasherizePropertyKeys = (0, _object.filterValuesRecursively)(_properties.dasherizeKeys);
205
207
 
206
- var rejectUnknownPropertyKeys = exports.rejectUnknownPropertyKeys = (0, _object.filterValuesRecursively)(_properties.rejectUnknownKeys);
208
+ var log = function log(x) {
209
+ console.log(x);return x;
210
+ };
207
211
 
208
- var process = (0, _fn.compose)(rejectUnknownPropertyKeys, dasherizePropertyKeys, _cssObject.compressSelectors, _cssObject.flattenObject, applyMacros);
212
+ var process = (0, _fn.compose)(_properties.rejectUnknownPropertyKeys, dasherizePropertyKeys,
213
+ //compressSelectors,
214
+ _cssObject.flattenObject, _macroProcessor.macroProcessor);
209
215
 
210
216
  ;
211
217
  /* WEBPACK VAR INJECTION */}.call(exports, __webpack_require__(6)))
@@ -316,7 +322,7 @@ return /******/ (function(modules) { // webpackBootstrap
316
322
  Object.defineProperty(exports, "__esModule", {
317
323
  value: true
318
324
  });
319
- exports.filterValuesRecursively = exports.applyToKeys = exports.mergeHashInto = undefined;
325
+ exports.filterObjectsRecursively = exports.filterValuesRecursively = exports.visitChildren = exports.applyToKeys = exports.mergeHashInto = undefined;
320
326
 
321
327
  var _typeof = typeof Symbol === "function" && typeof Symbol.iterator === "symbol" ? function (obj) { return typeof obj; } : function (obj) { return obj && typeof Symbol === "function" && obj.constructor === Symbol ? "symbol" : typeof obj; };
322
328
 
@@ -341,6 +347,7 @@ return /******/ (function(modules) { // webpackBootstrap
341
347
  // fn: (key) => new key
342
348
  // o: object to filter
343
349
  var applyToKeys = exports.applyToKeys = (0, _fn.curry)(function (fn, o) {
350
+ if ((typeof o === 'undefined' ? 'undefined' : _typeof(o)) !== 'object') return o;
344
351
  var out = {};
345
352
  for (var k in o) {
346
353
  out[fn(k)] = o[k];
@@ -348,19 +355,42 @@ return /******/ (function(modules) { // webpackBootstrap
348
355
  return out;
349
356
  });
350
357
 
358
+ var visitChildren = exports.visitChildren = (0, _fn.curry)(function (fn, o) {
359
+ if ((typeof o === 'undefined' ? 'undefined' : _typeof(o)) == 'object') {
360
+ for (var key1 in o) {
361
+ if (_typeof(o[key1]) == 'object') {
362
+ fn(o[key1], key1);
363
+ }
364
+ }
365
+ }
366
+ return o;
367
+ });
368
+
351
369
  // Filter values of an object, recursively
352
370
  // fn: fn(value, key) => new value
353
371
  // o: object to process
354
372
  var filterValuesRecursively = exports.filterValuesRecursively = (0, _fn.curry)(function (fn, o) {
373
+ if ((typeof o === 'undefined' ? 'undefined' : _typeof(o)) !== 'object') return o;
374
+
355
375
  var out = {};
356
- for (var k in o) {
357
- var v = o[k];
358
- var newValue = fn(v, k);
376
+ for (var key in o) {
377
+ var newValue = fn(o[key], key);
378
+ if ((typeof newValue === 'undefined' ? 'undefined' : _typeof(newValue)) == 'object') {
379
+ newValue = filterValuesRecursively(fn, newValue);
380
+ }
381
+ out[key] = newValue;
382
+ }
383
+ return out;
384
+ });
359
385
 
360
- if ((typeof newV === 'undefined' ? 'undefined' : _typeof(newV)) === 'object') {
361
- out[k] = filterValuesRecursively(fn, newValue);
362
- } else {
363
- out[k] = newValue;
386
+ // Filter values of an object, recursively
387
+ // fn: fn(value, key) => new value
388
+ // o: object to process
389
+ var filterObjectsRecursively = exports.filterObjectsRecursively = (0, _fn.curry)(function (fn, o) {
390
+ var out = fn(o);
391
+ for (var key in out) {
392
+ if (_typeof(out[key]) == 'object') {
393
+ out[key] = filterObjectsRecursively(fn, out[key]);
364
394
  }
365
395
  }
366
396
  return out;
@@ -456,11 +486,24 @@ return /******/ (function(modules) { // webpackBootstrap
456
486
  return false;
457
487
  }
458
488
 
489
+ function map(fn, obj) {
490
+ var result = [];
491
+ if (isArray(obj)) {
492
+ for (var i = 0; i < obj.length;) {
493
+ result.push(fn(obj[i], i++));
494
+ }
495
+ } else {
496
+ result = fn(obj);
497
+ }
498
+ return result;
499
+ }
500
+
459
501
  exports.isArray = isArray;
460
502
  exports.arrayEach = arrayEach;
461
503
  exports.arrayInject = arrayInject;
462
504
  exports.arrayFlatten = arrayFlatten;
463
505
  exports.includes = includes;
506
+ exports.map = map;
464
507
 
465
508
  /***/ },
466
509
  /* 10 */
@@ -552,23 +595,31 @@ return /******/ (function(modules) { // webpackBootstrap
552
595
 
553
596
  /***/ },
554
597
  /* 11 */
555
- /***/ function(module, exports) {
598
+ /***/ function(module, exports, __webpack_require__) {
556
599
 
557
- "use strict";
600
+ 'use strict';
558
601
 
559
602
  Object.defineProperty(exports, "__esModule", {
560
603
  value: true
561
604
  });
562
- // S T R I N G s
563
- var dasherize = function dasherize(s) {
605
+ exports.trim = exports.dasherize = undefined;
606
+
607
+ var _fn = __webpack_require__(8);
608
+
609
+ var onString = (0, _fn.curry)(function (fn, s) {
610
+ if (typeof s === 'string') return fn(s);else return s;
611
+ }); // S T R I N G s
612
+
613
+
614
+ var dasherize = onString(function (s) {
564
615
  return s.replace(/([A-Z])/g, function ($1) {
565
616
  return "-" + $1.toLowerCase();
566
617
  });
567
- };
618
+ });
568
619
 
569
- var trim = function trim(text) {
620
+ var trim = onString(function (text) {
570
621
  return (text || "").replace(/^(\s|\u00A0)+|(\s|\u00A0)+$/g, "");
571
- };
622
+ });
572
623
 
573
624
  exports.dasherize = dasherize;
574
625
  exports.trim = trim;
@@ -582,55 +633,64 @@ return /******/ (function(modules) { // webpackBootstrap
582
633
  Object.defineProperty(exports, "__esModule", {
583
634
  value: true
584
635
  });
585
- exports.setMacroKeys = setMacroKeys;
586
- exports.macroProcessor = macroProcessor;
636
+ exports.macroProcessor = undefined;
637
+
638
+ var _typeof = typeof Symbol === "function" && typeof Symbol.iterator === "symbol" ? function (obj) { return typeof obj; } : function (obj) { return obj && typeof Symbol === "function" && obj.constructor === Symbol ? "symbol" : typeof obj; };
639
+
640
+ exports.setMacro = setMacro;
587
641
  exports.isMacroKey = isMacroKey;
588
642
 
589
643
  var _object = __webpack_require__(7);
590
644
 
591
645
  var _array = __webpack_require__(9);
592
646
 
593
- var macroKeys = ['has', 'mixin', 'mixins'];
594
- function setMacroKeys(keys) {
595
- macroKeys = keys;
596
- }
647
+ var macroKeys = {
648
+ 'has': inLineIt,
649
+ 'mixin': inLineIt,
650
+ 'mixins': inLineIt
651
+ };
597
652
 
598
- function macroProcessor(properties) {
653
+ function setMacro(key, fn) {
654
+ macroKeys[key] = fn;
655
+ }
599
656
 
600
- function applyMacros(macroList) {
657
+ function isMacroKey(k) {
658
+ return !!macroKeys[k];
659
+ }
601
660
 
602
- var props = {};
661
+ // Simplest macro just inlines
662
+ function inLineIt() {
663
+ var expanded = {};
603
664
 
604
- var macros = (0, _array.arrayFlatten)([macroList]); // support single or multiple sets of properties
605
- for (var i = 0; i < macros.length; i++) {
606
- var macro = macros[i];
607
- if (typeof macro == 'function') macro = macro();
608
- for (var mp in macro) {
609
- if (isMacroKey(mp)) {
610
- (0, _object.mergeHashInto)(props, applyMacros(macro[mp]));
611
- } else {
612
- props[mp] = macro[mp];
613
- }
614
- }
615
- }
616
- return props;
665
+ for (var _len = arguments.length, value = Array(_len), _key = 0; _key < _len; _key++) {
666
+ value[_key] = arguments[_key];
617
667
  }
618
668
 
619
- for (var k in properties) {
620
- if (isMacroKey(k)) {
621
- var macros = properties[k];
622
- delete properties[k];
623
- if (macros) {
624
- (0, _object.mergeHashInto)(properties, applyMacros(macros));
669
+ (0, _array.map)(function (val) {
670
+ if (typeof val == 'function') val = val();
671
+ (0, _object.mergeHashInto)(expanded, val);
672
+ }, value);
673
+ return expanded;
674
+ }
675
+
676
+ function process(o) {
677
+
678
+ if ((typeof o === 'undefined' ? 'undefined' : _typeof(o)) !== 'object') return o;
679
+
680
+ var result = {};
681
+ for (var key in o) {
682
+ var value = o[key];
683
+ if (isMacroKey(key)) {
684
+ var expanded = macroKeys[key].apply(null, (0, _array.isArray)(value) ? value : [value]);
685
+ (0, _object.mergeHashInto)(result, process(expanded)); // Recurse
686
+ } else {
687
+ result[key] = value;
625
688
  }
626
- }
627
689
  }
628
- return properties;
690
+ return result;
629
691
  }
630
692
 
631
- function isMacroKey(k) {
632
- return (0, _array.includes)(macroKeys, k);
633
- }
693
+ var macroProcessor = exports.macroProcessor = (0, _object.filterObjectsRecursively)(process);
634
694
 
635
695
  /***/ },
636
696
  /* 13 */
@@ -641,33 +701,28 @@ return /******/ (function(modules) { // webpackBootstrap
641
701
  Object.defineProperty(exports, "__esModule", {
642
702
  value: true
643
703
  });
644
- exports.rejectUnknownKeys = exports.dasherizeKeys = undefined;
704
+ exports.rejectUnknownPropertyKeys = exports.dasherizeKeys = undefined;
645
705
 
646
706
  var _string = __webpack_require__(11);
647
707
 
648
708
  var _object = __webpack_require__(7);
649
709
 
650
- var _fn = __webpack_require__(8);
651
-
652
710
  var _propertyNameValidator = __webpack_require__(14);
653
711
 
654
712
  var propertyNameValidator = _interopRequireWildcard(_propertyNameValidator);
655
713
 
714
+ var _object2 = __webpack_require__(7);
715
+
656
716
  function _interopRequireWildcard(obj) { if (obj && obj.__esModule) { return obj; } else { var newObj = {}; if (obj != null) { for (var key in obj) { if (Object.prototype.hasOwnProperty.call(obj, key)) newObj[key] = obj[key]; } } newObj.default = obj; return newObj; } }
657
717
 
658
718
  var dasherizeKeys = exports.dasherizeKeys = (0, _object.applyToKeys)(_string.dasherize);
659
719
 
660
- var propertyKeyVisitor = (0, _fn.curry)(function (fn, rules, ctx) {
720
+ var rejectUnknownPropertyKeys = exports.rejectUnknownPropertyKeys = (0, _object2.visitChildren)(function (rules, selector) {
661
721
  for (var prop in rules) {
662
- fn(prop, ctx);
663
- }
664
- return rules;
665
- });
666
-
667
- var rejectUnknownKeys = exports.rejectUnknownKeys = propertyKeyVisitor(function (prop, ctx) {
668
- var error = propertyNameValidator.error(prop);
669
- if (error) {
670
- throw '' + error + '. Context: "' + ctx + '"';
722
+ var error = propertyNameValidator.error(prop);
723
+ if (error) {
724
+ throw '' + error + '. Context: "' + selector + '"';
725
+ }
671
726
  }
672
727
  });
673
728
 
@@ -682,7 +737,6 @@ return /******/ (function(modules) { // webpackBootstrap
682
737
  });
683
738
  exports.setConfig = setConfig;
684
739
  exports.addNames = addNames;
685
- exports.validate = validate;
686
740
  exports.error = error;
687
741
 
688
742
  var _array = __webpack_require__(9);
@@ -697,9 +751,6 @@ return /******/ (function(modules) { // webpackBootstrap
697
751
  config[key] = value;
698
752
  }
699
753
 
700
- /**
701
- * Add more valid properties to the list of valid property names.
702
- */
703
754
  function addNames() {
704
755
  for (var _len = arguments.length, propertyNames = Array(_len), _key = 0; _key < _len; _key++) {
705
756
  propertyNames[_key] = arguments[_key];
@@ -732,10 +783,6 @@ return /******/ (function(modules) { // webpackBootstrap
732
783
  }
733
784
  }
734
785
 
735
- function validate(name) {
736
- return !error(name) ? name : null;
737
- }
738
-
739
786
  function error(name) {
740
787
  if (/^\-\w+\-/.exec(name)) {
741
788
  if (!config.anyBrowserExtension && !validNames[name]) {
@@ -792,11 +839,10 @@ return /******/ (function(modules) { // webpackBootstrap
792
839
  return Object.keys(props).reduce(function (s, p) {
793
840
  return s + propertyEntry.format(p, props[p]);
794
841
  }, '');
795
- };
796
-
797
- // Rule: object with `sel` and `props` keys.
842
+ }; // Rule: object with `sel` and `props` keys.
798
843
  // .sel is the selector
799
844
  // .props in an object holding CSS property rules
845
+
800
846
  var format = exports.format = function format(rule) {
801
847
  return rule.sel + ' { ' + formatProperties(rule.props) + " }\n";
802
848
  };
@@ -808,7 +854,7 @@ return /******/ (function(modules) { // webpackBootstrap
808
854
  'use strict';
809
855
 
810
856
  Object.defineProperty(exports, "__esModule", {
811
- value: true
857
+ value: true
812
858
  });
813
859
  exports.format = undefined;
814
860
 
@@ -822,12 +868,10 @@ return /******/ (function(modules) { // webpackBootstrap
822
868
 
823
869
  function _interopRequireWildcard(obj) { if (obj && obj.__esModule) { return obj; } else { var newObj = {}; if (obj != null) { for (var key in obj) { if (Object.prototype.hasOwnProperty.call(obj, key)) newObj[key] = obj[key]; } } newObj.default = obj; return newObj; } }
824
870
 
825
- var format = function format(name, value) {
826
- return propertyName.format(name) + ": " + propertyValue.format(value, name) + ";\r";
871
+ var format = exports.format = function format(name, value) {
872
+ return propertyName.format(name) + ": " + propertyValue.format(value, name) + ";\r";
827
873
  };
828
874
 
829
- exports.format = format;
830
-
831
875
  /***/ },
832
876
  /* 18 */
833
877
  /***/ function(module, exports, __webpack_require__) {
@@ -853,7 +897,7 @@ return /******/ (function(modules) { // webpackBootstrap
853
897
  */
854
898
  var propertyNameOf = exports.propertyNameOf = function propertyNameOf(p) {
855
899
  var name = (0, _string.dasherize)(p);
856
- return propertyNameValidator.validate(name);
900
+ return !propertyNameValidator.error(name) ? name : null;
857
901
  };
858
902
 
859
903
  var format = exports.format = function format(name) {
@@ -872,14 +916,13 @@ return /******/ (function(modules) { // webpackBootstrap
872
916
  value: true
873
917
  });
874
918
 
875
- var format = function format(value, name) {
876
- if (value && typeof value == 'number' && name != 'z-index' && name != 'opacity' && name != 'zoom') {
877
- return '' + value + 'px';
878
- }
879
- return value;
880
- };
881
919
 
882
- exports.format = format;
920
+ var unitlessProperties = ['z-index', 'opacity', 'zoom'];
921
+
922
+ var format = exports.format = function format(value, name) {
923
+ var appendPx = value && typeof value == 'number' && unitlessProperties.indexOf(name) == -1;
924
+ return '' + value + (appendPx ? 'px' : '');
925
+ };
883
926
 
884
927
  /***/ },
885
928
  /* 20 */
metadata CHANGED
@@ -1,14 +1,14 @@
1
1
  --- !ruby/object:Gem::Specification
2
2
  name: csster
3
3
  version: !ruby/object:Gem::Version
4
- version: 1.2.0
4
+ version: 1.3.0
5
5
  platform: ruby
6
6
  authors:
7
7
  - Andrew Peterson
8
8
  autorequire:
9
9
  bindir: bin
10
10
  cert_chain: []
11
- date: 2016-03-04 00:00:00.000000000 Z
11
+ date: 2016-03-08 00:00:00.000000000 Z
12
12
  dependencies:
13
13
  - !ruby/object:Gem::Dependency
14
14
  name: railties