fixins
Version:
A collection of functions and mixins for use with precss and postcss-functions
573 lines (318 loc) • 10.4 kB
Markdown
# fixins
> A collection of functions and mixins for use with
[precss][0] and [postcss-functions][1]
## Install
```sh
npm install fixins --save-dev
```
## Usage
`fixins` should be required and passed into
[precss][0] and [postcss-functions][1] options within
a [postcss][4] plugin config.
Here is an example using gulp:
```js
// ...
const postcss = require('gulp-postcss');
const precss = require('precss');
const functions = require('postcss-functions');
const fixins = require('fixins');
// not required but certainly helps if you're
// using precss
const syntax = require('postcss-scss');
gulp.task('css', () => {
return gulp.src('src/**/*.css')
.pipe(postcss([
precss({
import: {
// this is just my personal preference
extension: 'pcss'
},
mixins: {
// this is required!
mixins: fixins.mixins
}
}),
functions({
// this is required!
functions: fixins.functions
}),
]))
.pipe(gulp.dest('build/'));
});
```
Consult [postcss#usage][3] for a more complete overview
of how to integrate postcss plugins (this is __not__ a plugin, btw).
# Overview
All fixins are prefixed with `fx-` as to not collide with other frameworks/collections.
Most mixins can be called with positional or named arguments unless otherwise stated.
Positional arguments are separated by comma and not enclosed in parenthesis, while named arguments
can appear in any order but must be enclosed in parenthesis. Functions do not support named syntax.
##### Example: positional vs named arguments:
```scss
/* positional arguments (col and float)*/
@mixin fx-span 3, none;
/* named - col arg defaults to 12 */
@mixin fx-span(float:right);
```
# API (Table of Contents)
+ Functions
+ [fx-lerp](#a0)
+ [fx-md-color](#a1)
+ [fx-closest-md-color](#a2)
+ [fx-red|orange|yellow|green|cyan|blue|violet|magenta|gray](#a3)
+ [fx-golden-ratio](#a4)
+ [fx-random](#a5)
+ [fx-str](#a6)
+ Mixins
+ [fx-ab](#a7)
+ [fx-box-shadow](#a8)
+ [fx-center](#a9)
+ [fx-ellipsis](#a10)
+ [fx-emboss](#a11)
+ [fx-horizontal-list](#a12)
+ [fx-list-unstyled](#a13)
+ [fx-size](#a14)
+ [fx-span](#a15)
+ [fx-underline-on-hover](#a16)
***
## Functions
## <a name="a0"></a> fx-lerp(color, color, [factor=0.5])
Mix `color1` and `color2` by `factor`.
The algorithm used is pretty basic. For more serious use, see
[postcss-color-mix](https://github.com/iamstarkov/postcss-color-mix)
#### Example
```scss
// input
fx-lerp(#ff0000, rgb(0,0,255,0))
// output
rgba(128,0,128,0.5)
```
#### Params
+ `color1` - CSS rgb, rgba, or hex string
+ `color2` - CSS rgb, rgba, or hex string
+ `[factor=0.5]` - range [0,1] or [0,100%]
#### Return
+ CSS rgba color
***
## <a name="a1"></a> fx-md-color(color1, [shade=500], [alpha])
Material design colors accessor
#### Example
```scss
// input
fx-md(red, 500)
// output
#f44336
// alpha support:
// input
fx-md(red, 500, 0.5)
// output
rgba(244, 67, 54, 0.5)
```
#### Params
+ `color` - material design color name
+ `shade` - material design color shade
+ `[alpha=1]` - range [0 1]
#### Return
+ CSS hex color if `alpha` argument is not passed
+ CSS rgba color if `alpha` was passed
##### Alias
+ `fx-mdc`
+ `fx-md`
***
## <a name="a2"></a> fx-closest-md-color(color)
Find the material design color that is closest to `color`.
#### Params
+ `color` - CSS hex color
#### Return
+ CSS hex color
##### Alias
+ `fx-cmd`
+ `fx-cmdc`
+ `fx-closest`
***
## <a name="a3"></a> fx-<red|orange|yellow|green|cyan|blue|violet|magenta|gray>(value, [alpha=1])
Get a shade of <color> between 0-255
#### Params
+ `value` - range [0, 255]
+ `[alpha=1]` - range [0, 1]
#### Return
+ CSS rgba color
##### Alias
+ gray: `grayscale`, `gray-scale`, and for you britts: `grey`, `greyscale`, `grey-scale`
+ violet: `purple`
+ magenta: `pink`
***
## <a name="a4"></a> fx-golden-ratio([number=100], [scale=1])
Get the golden ratio of `number` recursively scaled
`scale` times. A scale setting less then 1 will return
the smaller portion.
#### Example
```scss
fx-golden-ratio(30, 1) //=> 48.54102
fx-golden-ratio(30, 2) //=> 78.54102
fx-golden-ratio(30, -1) //=> 18.54102
fx-golden-ratio(30, -2) //=> 11.45898
```
#### Params
+ `[number=100] `- the base number
+ `[scale=1]` - the factor to scale `number` by
#### Return
+ The "A" (larger) portion if `number` is positive; "C" otherwise
##### Alias
+ fx-golden
***
## <a name="a5"></a> fx-random ([min=0], [max=256], [float=false [, inclusive=false]])
Get a random number between `min` and `max`, inclusive.
Random number generation provided by
[random-js](https://github.com/ckknight/random-js)
#### Params
+ `min` - range minimum (default = 0)
+ `max` - output range maximum (default = 255)
+ `float` - if truthy, output is floating point, default is false (integer output)
+ `inclusive` - if `float` is true, choose to include 0 and 1 (default false)
#### Return
+ a random integer or floating point number depending on the truthyness of `float`
***
## <a name="a6"></a> fx-str([input])
Wrap input as string, ensures output
in css is wrapped in quotes.
#### Params
+ `input` - anything
#### Return
+ "`input`"
***
## Mixins
## <a name="a7"></a> fx-ab([selector], prop, variable, [template])
This mixin outputs two rules for the passed selector:
one as is, with prop and variable as is; the other with `.b` class
appended to the selector, and a `b` prepended to the variable name before it is
evaluated. Note that `variable` is sass-like, but you should NOT include the dollar sign
of your variable when passing it into `fx-ab`. Note also that this mixin
does not support the named argument syntax like the most of the __fx-__
mixins do.
To futher compilcate things, `fx-ab` has different signatures
depending on if is being called in root context or not.
When on a root element the signature is `<selector>, <prop>, <variable>, [template]`.
In this context, `.b` is appended to the parent-most
(left-most) selector, so `x y z` will become `x.b y c`.
#### Example
```scss
// given input ...
$text-color: black;
$b-text-color: white;
// note the lack of `$` before `text-color`
@mixin fx-ab .box, color, text-color;
// results in ...
.box {
color: black;
}
.box.b {
color: white;
}
```
When inside a rule the signature is `<prop>, <variable>, [template]`.
The `.b` class will be appended to the child-most
(right-most) selector, so `x y z` will become `x y z.b`.
#### Example
```scss
// input
$text-color: black;
$b-text-color: white;
// note the lack of `$` before `text-color`
.box {
.medium {
@mixin fx-ab color, text-color;
}
}
// note again the difference in output in root context
@mixin .box .medium, color, text-color;
// output
.box .medium {
color: black;
}
.box .medium.b {
color: white;
}
.box .medium {
color: black;
}
.box.b .medium {
color: white;
}
```
Using an optional template, any occurrence of `$$` will
be replaced with `variable`. This is useful when your variable
is included in a multiple word value definition./
```scss
$color: black;
$b-color: white;
@mixin fx-ab .box, box-shadow, color, 0 1px 0 1px $$;
// results in
.box {
box-shadow: 0 1px 0 1px black;
}
.box.b {
box-shadow: 0 1px 0 1px white;
}
```
#### Params
+ `[selector]` - selector
+ `prop` - left handle property key
+ `variable` - sass-like variable reference without the leading `$`.
Passing `foo` is read internally as "use $foo and $b-foo".
If no reference to $foo or $b-foo is found, foo and b-foo literals will be output.
+ `[template]` - text sequence to use as the right-hand value with
any occurrence of `$$` replaced with `variable` results.
***
## <a name="a8"></a> fx-box-shadow([color=rgba(0, 0, 0, 0.25)])
***
## <a name="a9"></a> fx-center
#### Return
`margin: 0 auto;`
***
## <a name="a10"></a> fx-ellipsis
Truncate text with an ellipsis `...`.
Works best on elements with a determined height
(not `auto` or `100%`)
***
## <a name="a11"></a> fx-emboss([radius=0], [top-opacity=0.3], [bottom-opacity=0.25], [background-opacity=0.2])
An opinionated emboss effect suitable for square containers.
Currently only suitable for light themes.
***
## <a name="a12"></a> fx-horizontal-list
Bare bones horizontal list. Note that this mixin
is meant to be placed directly under a `ul|ol` or
class placed directly on a `ul|ol`
***
## <a name="a13"></a> fx-list-unstyled
***
## <a name="a14"></a> fx-size([width], [height=width])
Width and height together in one line.
Called with 1 arg, height will mimick width (output square).
Note that this mixin does not support the named
argument syntax as that is completely redundant.
***
## <a name="a15"></a> fx-span([cols=12], [float=left])
Dynamically add `$number` of columns to an element.
Assumes a 12 column grid with no gutters (no gutters? that's right,
using box-sizing:border-box on everything, wrappers for your grid classes
and padding for inner content and things become much simpler in grid land).
***
## <a name="a16"></a> fx-underline-on-hover([color=#000], [speed=0.3s])
Animated text underline.
If using with an `a` element, be sure to set
`text-decoration: none;` on the element and its `:hover`.
Credit goes to someone on Codepen, but somehow I misplaced the
link to that work... will update here when found. Thanks, whoever you are!
***
## Road Map
+ [ ] - support hsla
+ [ ] - flex-box helpers
+ [ ] - tighten test demo and github.io that sucker
## License
[MIT][2]
[0]: https://github.com/jonathantneal/precss
[1]: https://github.com/andyjansson/postcss-functions
[2]: http://lokua.net/license-mit.html
[3]: https://github.com/postcss/postcss#usage
[4]: https://github.com/postcss/postcss