2016-10-21 20:55:54 -07:00
|
|
|
A [Dart][dart] implementation of [Sass][sass]. **Sass makes CSS fun again**.
|
|
|
|
|
2017-02-10 15:24:56 -08:00
|
|
|
[![Travis build status](https://api.travis-ci.org/sass/dart-sass.svg)](https://travis-ci.org/sass/dart-sass) [![Appveyor build status](https://ci.appveyor.com/api/projects/status/84rl9hvu8uoecgef?svg=true)](https://ci.appveyor.com/project/nex3/dart-sass)
|
2016-11-07 18:38:26 -08:00
|
|
|
|
2016-10-21 20:55:54 -07:00
|
|
|
[dart]: https://www.dartlang.org
|
|
|
|
[sass]: http://sass-lang.com/
|
|
|
|
|
|
|
|
* [Using Dart Sass](#using-dart-sass)
|
2017-02-10 16:44:02 -08:00
|
|
|
* [From Chocolatey (Windows)](#from-chocolatey-windows)
|
2016-10-21 20:55:54 -07:00
|
|
|
* [Standalone](#standalone)
|
2016-10-24 16:45:51 -07:00
|
|
|
* [From npm](#from-npm)
|
2016-10-21 20:55:54 -07:00
|
|
|
* [From Pub](#from-pub)
|
|
|
|
* [From Source](#from-source)
|
2017-11-03 14:23:48 -07:00
|
|
|
* [JavaScript API](#javascript-api)
|
2016-10-21 20:55:54 -07:00
|
|
|
* [Goals](#goals)
|
|
|
|
* [Behavioral Differences](#behavioral-differences)
|
2016-09-30 15:10:52 -07:00
|
|
|
|
|
|
|
## Using Dart Sass
|
|
|
|
|
2016-10-21 20:55:54 -07:00
|
|
|
There are a few different ways to install and run Dart Sass, depending on your
|
|
|
|
environment and your needs.
|
|
|
|
|
2017-02-10 16:44:02 -08:00
|
|
|
### From Chocolatey (Windows)
|
|
|
|
|
|
|
|
If you use [the Chocolatey package manager](https://chocolatey.org/) for
|
2017-02-10 16:45:03 -08:00
|
|
|
Windows, you can install Dart Sass by running
|
|
|
|
|
|
|
|
```cmd
|
|
|
|
choco install sass -prerelease
|
|
|
|
```
|
|
|
|
|
2017-02-10 16:44:02 -08:00
|
|
|
That'll give you a `sass` executable on your command line that will run Dart
|
|
|
|
Sass.
|
|
|
|
|
2016-10-21 20:55:54 -07:00
|
|
|
### Standalone
|
|
|
|
|
|
|
|
You can download the standalone Dart Sass archive for your operating
|
2017-05-18 23:18:03 +02:00
|
|
|
system—containing the Dart VM and the snapshot of the Sass library—from
|
2016-10-21 20:55:54 -07:00
|
|
|
[the release page][releases]. Extract it, add the directory to your path, and
|
|
|
|
the `dart-sass` executable is ready to run!
|
|
|
|
|
2016-12-19 15:35:31 -08:00
|
|
|
[releases]: https://github.com/sass/dart-sass/releases/
|
2016-10-21 20:55:54 -07:00
|
|
|
|
2017-02-02 14:20:24 -08:00
|
|
|
To add the directory to your path on Windows, open the Control Panel, then
|
|
|
|
search for and select "edit environment variables". Find the variable named
|
|
|
|
`PATH`, click Edit, add `;C:\path\to\dart-sass` to the end of the value, then
|
|
|
|
click OK.
|
|
|
|
|
|
|
|
On more Unix-y systems, edit your shell configuration file (usually `~/.bashrc`
|
|
|
|
or `~/.profile`) and add at the end:
|
|
|
|
|
|
|
|
```sh
|
|
|
|
export PATH=$PATH:/path/to/dart-sass
|
|
|
|
```
|
|
|
|
|
|
|
|
Regardless of your OS, you'll need to restart your terminal in order for this
|
|
|
|
configuration to take effect.
|
|
|
|
|
2016-10-24 16:45:51 -07:00
|
|
|
### From npm
|
2016-10-21 20:55:54 -07:00
|
|
|
|
2016-10-24 16:45:51 -07:00
|
|
|
Dart Sass is available, compiled to JavaScript, [as an npm package][npm]. You
|
2017-06-06 15:18:16 -07:00
|
|
|
can install it globally using `npm install -g sass`, or to your project using
|
|
|
|
`npm install sass`. This provides a `sass` executable as well as a library:
|
2016-10-21 20:55:54 -07:00
|
|
|
|
2017-06-06 15:18:16 -07:00
|
|
|
[npm]: https://www.npmjs.com/package/sass
|
2016-10-21 20:55:54 -07:00
|
|
|
|
|
|
|
```js
|
2017-06-13 01:28:48 -04:00
|
|
|
var sass = require('sass');
|
2016-10-21 20:55:54 -07:00
|
|
|
|
2016-11-07 16:49:09 -08:00
|
|
|
sass.render({file: scss_filename}, function(err, result) { /* ... */ });
|
|
|
|
|
|
|
|
// OR
|
|
|
|
|
|
|
|
var result = sass.renderSync({file: scss_filename});
|
2016-10-21 20:55:54 -07:00
|
|
|
```
|
|
|
|
|
2017-11-03 14:23:48 -07:00
|
|
|
[See below](#javascript-api) for details on Dart Sass's JavaScript API.
|
2016-10-21 20:55:54 -07:00
|
|
|
|
|
|
|
### From Pub
|
|
|
|
|
|
|
|
If you're a Dart user, you can install Dart Sass globally using `pub global
|
2016-12-28 06:58:05 +05:30
|
|
|
activate sass ^1.0.0-alpha`, which will provide a `dart-sass` executable. You can
|
2016-12-02 13:25:15 -08:00
|
|
|
also add it to your pubspec and use it as a library:
|
2016-10-21 20:55:54 -07:00
|
|
|
|
|
|
|
```dart
|
|
|
|
import 'package:sass/sass.dart' as sass;
|
|
|
|
|
|
|
|
void main(List<String> args) {
|
2017-07-07 17:03:31 -07:00
|
|
|
print(sass.compile(args.first));
|
2016-10-21 20:55:54 -07:00
|
|
|
}
|
|
|
|
```
|
|
|
|
|
|
|
|
See [the Dart API docs][api] for details.
|
|
|
|
|
|
|
|
[api]: https://www.dartdocs.org/documentation/sass/latest/sass/sass-library.html
|
|
|
|
|
|
|
|
### From Source
|
|
|
|
|
|
|
|
Assuming you've already checked out this repository:
|
2016-09-30 15:10:52 -07:00
|
|
|
|
|
|
|
1. [Install Dart](https://www.dartlang.org/install). If you download it
|
2016-10-14 15:04:45 -07:00
|
|
|
manually, make sure the SDK's `bin` directory is on your `PATH`.
|
2016-09-30 15:10:52 -07:00
|
|
|
|
|
|
|
2. In this repository, run `pub get`. This will install Dart Sass's
|
|
|
|
dependencies.
|
|
|
|
|
|
|
|
3. Run `dart bin/sass.dart path/to/file.scss`.
|
|
|
|
|
|
|
|
That's it!
|
|
|
|
|
2017-11-03 14:23:48 -07:00
|
|
|
## JavaScript API
|
|
|
|
|
|
|
|
When installed via NPM, Dart Sass supports a JavaScript API that aims to be
|
|
|
|
compatible with [Node Sass](https://github.com/sass/node-sass#usage). Full
|
|
|
|
compatibility is a work in progress, but Dart Sass currently supports the
|
2017-12-01 14:28:26 -08:00
|
|
|
`render()` and `renderSync()` functions. Note however that by default,
|
|
|
|
**`renderSync()` is more than twice as fast as `render()`**, due to the overhead
|
|
|
|
of asynchronous callbacks.
|
|
|
|
|
|
|
|
To avoid this performance hit, `render()` can use the [`fibers`][fibers] package
|
|
|
|
to call asynchronous importers from the synchronous code path. To enable this,
|
|
|
|
pass the `Fiber` class to the `fiber` option:
|
|
|
|
|
|
|
|
[fibers]: https://www.npmjs.com/package/fibers
|
|
|
|
|
|
|
|
```js
|
|
|
|
var sass = require("sass");
|
|
|
|
var Fiber = require("fibers");
|
|
|
|
|
|
|
|
render({
|
|
|
|
file: "input.scss",
|
|
|
|
importer: function(url, prev, done) {
|
|
|
|
// ...
|
|
|
|
},
|
|
|
|
fiber: Fiber
|
|
|
|
}, function(err, result) {
|
|
|
|
// ...
|
|
|
|
});
|
|
|
|
```
|
2017-11-29 18:13:48 -08:00
|
|
|
|
|
|
|
Both `render()` and `renderSync()` support the following options:
|
2017-11-03 14:23:48 -07:00
|
|
|
|
|
|
|
* [`file`](https://github.com/sass/node-sass#file)
|
|
|
|
* [`data`](https://github.com/sass/node-sass#data)
|
|
|
|
* [`includePaths`](https://github.com/sass/node-sass#includepaths)
|
|
|
|
* [`indentedSyntax`](https://github.com/sass/node-sass#indentedsyntax)
|
|
|
|
* [`indentType`](https://github.com/sass/node-sass#indenttype)
|
|
|
|
* [`indentWidth`](https://github.com/sass/node-sass#indentwidth)
|
|
|
|
* [`linefeed`](https://github.com/sass/node-sass#linefeed)
|
2017-11-29 18:13:48 -08:00
|
|
|
* [`importer`](https://github.com/sass/node-sass#importer--v200---experimental)
|
2017-11-03 14:23:48 -07:00
|
|
|
* Only the `"expanded"` value of
|
|
|
|
[`outputStyle`](https://github.com/sass/node-sass#outputstyle) is supported.
|
|
|
|
|
|
|
|
The following options are not yet supported, but are intended:
|
|
|
|
|
|
|
|
* [`functions`](https://github.com/sass/node-sass#functions--v300---experimental)
|
|
|
|
* [`omitSourceMapUrl`](https://github.com/sass/node-sass#omitsourcemapurl)
|
|
|
|
* [`outFile`](https://github.com/sass/node-sass#outfile)
|
|
|
|
* [`sourceMap`](https://github.com/sass/node-sass#sourcemap)
|
|
|
|
* [`sourceMapContents`](https://github.com/sass/node-sass#sourcemapcontents)
|
|
|
|
* [`sourceMapEmbed`](https://github.com/sass/node-sass#sourcemapembed)
|
|
|
|
* [`sourceMapRoot`](https://github.com/sass/node-sass#sourcemaproot)
|
|
|
|
|
|
|
|
No support is intended for the following options:
|
|
|
|
|
|
|
|
* [`precision`](https://github.com/sass/node-sass#precision). Dart Sass defaults
|
|
|
|
to a sufficiently high precision for all existing browsers, and making this
|
|
|
|
customizable would make the code substantially less efficient.
|
|
|
|
|
|
|
|
* [`sourceComments`](https://github.com/sass/node-sass#sourcecomments). Once
|
|
|
|
Dart Sass supports source maps, that will be the recommended way of locating
|
|
|
|
the origin of generated selectors.
|
|
|
|
|
2016-09-30 15:10:52 -07:00
|
|
|
## Goals
|
|
|
|
|
|
|
|
Dart Sass is intended to eventually replace Ruby Sass as the canonical
|
|
|
|
implementation of the Sass language. It has a number of advantages:
|
|
|
|
|
|
|
|
* It's fast. The Dart VM is highly optimized, and getting faster all the time
|
|
|
|
(for the latest performance numbers, see [`perf.md`][perf]). It's much faster
|
|
|
|
than Ruby, and not too far away from C.
|
|
|
|
|
|
|
|
* It's portable. The Dart VM has no external dependencies and can compile
|
|
|
|
applications into standalone snapshot files, so a fully-functional Dart Sass
|
|
|
|
could be distributed as only three files (the VM, the snapshot, and a wrapper
|
|
|
|
script). Dart can also be compiled to JavaScript, which would make it easy to
|
2016-10-24 16:45:51 -07:00
|
|
|
distribute Sass through npm or other JS package managers.
|
2016-09-30 15:10:52 -07:00
|
|
|
|
|
|
|
* It's friendlier to contributors. Dart is substantially easier to learn than
|
|
|
|
Ruby, and many Sass users in Google in particular are already familiar with
|
|
|
|
it. More contributors translates to faster, more consistent development.
|
|
|
|
|
|
|
|
[perf]: https://github.com/sass/dart-sass/blob/master/perf.md
|
2016-08-30 16:00:52 -07:00
|
|
|
|
2016-10-07 15:29:42 -07:00
|
|
|
## Behavioral Differences
|
|
|
|
|
|
|
|
There are a few intentional behavioral differences between Dart Sass and Ruby
|
|
|
|
Sass. These are generally places where Ruby Sass has an undesired behavior, and
|
|
|
|
it's substantially easier to implement the correct behavior than it would be to
|
|
|
|
implement compatible behavior. These should all have tracking bugs against Ruby
|
|
|
|
Sass to update the reference behavior.
|
|
|
|
|
|
|
|
1. `@extend` only accepts simple selectors, as does the second argument of
|
|
|
|
`selector-extend()`. See [issue 1599][].
|
|
|
|
|
|
|
|
2. Subject selectors are not supported. See [issue 1126][].
|
|
|
|
|
|
|
|
3. Pseudo selector arguments are parsed as `<declaration-value>`s rather than
|
|
|
|
having a more limited custom parsing. See [issue 2120][].
|
|
|
|
|
|
|
|
4. The numeric precision is set to 10. See [issue 1122][].
|
|
|
|
|
|
|
|
5. The indented syntax parser is more flexible: it doesn't require consistent
|
2016-10-21 21:07:36 -07:00
|
|
|
indentation across the whole document. See [issue 2176][].
|
2016-10-07 15:29:42 -07:00
|
|
|
|
|
|
|
6. Colors do not support channel-by-channel arithmetic. See [issue 2144][].
|
|
|
|
|
2016-10-18 21:38:27 -07:00
|
|
|
7. Unitless numbers aren't `==` to unit numbers with the same value. In
|
|
|
|
addition, map keys follow the same logic as `==`-equality. See
|
|
|
|
[issue 1496][].
|
|
|
|
|
2017-01-08 21:31:24 -08:00
|
|
|
8. `rgba()` and `hsla()` alpha values with percentage units are interpreted as
|
|
|
|
percentages. Other units are forbidden. See [issue 1525][].
|
|
|
|
|
2017-01-08 23:06:26 -08:00
|
|
|
9. Too many variable arguments passed to a function is an error. See
|
|
|
|
[issue 1408][].
|
|
|
|
|
2017-01-13 01:49:41 -08:00
|
|
|
10. Allow `@extend` to reach outside a media query if there's an identical
|
|
|
|
`@extend` defined outside that query. This isn't tracked explicitly, because
|
|
|
|
it'll be irrelevant when [issue 1050][] is fixed.
|
|
|
|
|
2017-07-07 17:03:31 -07:00
|
|
|
11. Some selector pseudos containing placeholder selectors will be compiled
|
2017-01-14 21:26:41 -08:00
|
|
|
where they wouldn't be in Ruby Sass. This better matches the semantics of
|
|
|
|
the selectors in question, and is more efficient. See [issue 2228][].
|
|
|
|
|
2017-02-16 18:44:54 -08:00
|
|
|
12. The old-style `:property value` syntax is not supported in the indented
|
|
|
|
syntax. See [issue 2245][].
|
|
|
|
|
2017-02-22 20:50:16 -08:00
|
|
|
13. The reference combinator is not supported. See [issue 303][].
|
2017-02-22 20:48:56 -08:00
|
|
|
|
2017-02-20 01:51:55 -08:00
|
|
|
14. Universal selector unification is symmetrical. See [issue 2247][].
|
|
|
|
|
2017-02-24 18:06:36 -08:00
|
|
|
15. `@extend` doesn't produce an error if it matches but fails to unify. See
|
|
|
|
[issue 2250][].
|
|
|
|
|
2017-05-28 16:36:11 -07:00
|
|
|
16. Dart Sass currently only supports UTF-8 documents. We'd like to support
|
|
|
|
more, but Dart currently doesn't support them. See [dart-lang/sdk#11744][],
|
|
|
|
for example.
|
|
|
|
|
2016-10-07 15:29:42 -07:00
|
|
|
[issue 1599]: https://github.com/sass/sass/issues/1599
|
|
|
|
[issue 1126]: https://github.com/sass/sass/issues/1126
|
|
|
|
[issue 2120]: https://github.com/sass/sass/issues/2120
|
|
|
|
[issue 1122]: https://github.com/sass/sass/issues/1122
|
2016-10-21 21:07:36 -07:00
|
|
|
[issue 2176]: https://github.com/sass/sass/issues/2176
|
2016-10-07 15:29:42 -07:00
|
|
|
[issue 2144]: https://github.com/sass/sass/issues/2144
|
2016-10-18 21:38:27 -07:00
|
|
|
[issue 1496]: https://github.com/sass/sass/issues/1496
|
2017-01-08 21:31:24 -08:00
|
|
|
[issue 1525]: https://github.com/sass/sass/issues/1525
|
2017-01-08 23:06:26 -08:00
|
|
|
[issue 1408]: https://github.com/sass/sass/issues/1408
|
2017-01-13 01:49:41 -08:00
|
|
|
[issue 1050]: https://github.com/sass/sass/issues/1050
|
2017-01-14 21:26:41 -08:00
|
|
|
[issue 2228]: https://github.com/sass/sass/issues/2228
|
2017-02-16 18:44:54 -08:00
|
|
|
[issue 2245]: https://github.com/sass/sass/issues/2245
|
2017-02-22 20:48:56 -08:00
|
|
|
[issue 303]: https://github.com/sass/sass/issues/303
|
2017-02-20 01:51:55 -08:00
|
|
|
[issue 2247]: https://github.com/sass/sass/issues/2247
|
2017-02-24 18:06:36 -08:00
|
|
|
[issue 2250]: https://github.com/sass/sass/issues/2250
|
2017-05-28 16:36:11 -07:00
|
|
|
[dart-lang/sdk#11744]: https://github.com/dart-lang/sdk/issues/11744
|
2016-10-07 15:29:42 -07:00
|
|
|
|
2016-08-30 16:00:52 -07:00
|
|
|
Disclaimer: this is not an official Google product.
|