rubysasscompass-sasssusy-compass

susy 'Manual Start' - does it actually work?


On the Susy Getting Started page, there's a section marked 'Manual Start', which says :

"You can use this method if you're not using Compass from Terminal and/or Rails".

It then explains how to copy Susy's Sass definitions and @import "susy", after which (it claims), "you're good to go".

I'm trying to use Susy as part of my own build system, which uses the 'sass' command-line command to compile my stylesheets. Obviously, the Susy Sass mixins and includes depend on Compass, so I extracted the Compass Sass definitions from the Compass distribution, and put them where they could be accessed by Susy. I then tried to compile my stylesheets with:

sass -I scss/compass scss/foobar.scss ${CSSDIR}/foobar.css

When I do this, Susy throws a warning:

"You need to provide either a valid layout (number of columns) or a valid media-query min-width breakpoint (length)".

Digging into the code, it appears that the issue is that Susy calls the 'compact' function provided by Compass. The actual call is something like:

compact(false,false,false,...)

which - I presume - should evaluate to:

false

But 'compact' isn't a Sass feature; it's a Compass function, implemented in Ruby as part of Compass. If Compass's Ruby extensions aren't available, that call is left unchanged, so the Susy mixin is getting handed:

compact(false,false,false,...)

which is not 'false' ... and so things go pear-shaped. (The trouble happens at line 93 of susy/_grid.scss).

It looks to me as if using Susy without Compass is not actually possible. What's my best solution to this issue? Do I just use 'compass compile ...'instead of 'sass' to compile my stylesheet? Or can I somehow provide the 'compact' function to 'sass' in some other way?


Solution

  • You can add this function yourself, though I really recommend using Compass. All it requires is a config.rb file so that Compass knows where files are supposed to live for various helper functions. The command for compiling with Compass is more compact since the output location is already defined in the config file: compass watch or compass compile

    If you don't want to use Compass, you can add the function yourself. First you'll need the custom function, which comes from here: https://github.com/chriseppstein/compass/blob/stable/lib/compass/sass_extensions/functions/lists.rb#L18

    def compact(*args)
    sep = :comma
    if args.size == 1 && args.first.is_a?(Sass::Script::List)
      list = args.first
      args = list.value
      sep = list.separator
    end
    Sass::Script::List.new(args.reject{|a| !a.to_bool}, sep)
    end
    

    Place it in a ruby file wherever makes sense.

    Your sass command now just needs to add this flag: -r ./path/to/functions.rb