A fast, modern JavaScript version of the Cassowary hierarchial linear constraint solver
npm install cassowary#### This module hasn't been tested yet.
To try it out:
``js``
var Cassowary = require('./index.js')
For the time being, see the 'browser' directory for usage examples (the API is, more or less, the same).
----------------------------------------------------------------
Cassowary JS
============
Cassowary is an algorithm that computes flexible, responsive layouts quickly
without resorting to piles of imperative code. Just describe the preferred
relationships between values, noting which constraints are more important than
others, and Cassowary figures out an optimal solution based on the current
inputs. When the inputs or constraints change, Cassowary is particularly
efficient at computing a new answer quickly based on the last-known solution.
These properties together make it ideal for use in layout systems -- indeed,
it's the algorithm at the center of Apple's new automatic layout system for
Cocoa.
This repo hosts an improved version of Greg Badros's
port of
the Cassowary hierarchial constraint
toolkit to
JavaScript.
This version dramatically improves the performance of the original translation,
removes external library dependencies, and improves hackability. The solver
core can now be used inside web workers, at the command line, and directly in
modern browsers.
For civil discussion of this port and constraint-based UIs, join the
Overconstrained mailing
list.
Constraint Solver? Say What?
----------------------------
Constraint solvers are iterative algorithms that work towards ever more ideal
solutions, often using some variant of Dantzig's simplex
method. They are primarialy of
interest in situations where it's possible to easily set up a set of rules
which you would like a solution to adhere to, but when it is very difficult to
consider all of the possible solutions yourself.
Cassowary and other hierarchial constraint toolkits add a unique mechanism for
deciding between sets of rules that might conflict in determining which of a
set of possible solutions are "better". By allowing constraint authors to
specify weights for the constraints, the toolkit can decide in terms of
stronger constraints over weaker ones, allowing for more optimal solutions.
These sorts of situations arise all the time in UI programming; e.g.: "I'd
like this to be it's natural width, but only if that's smaller than 600px, and
never let it get smaller than 200px". Constraint solvers offer a way out of the
primordial mess of nasty conditionals and brittle invalidations.
If all of this sounds like it's either deeply esoteric or painfully academic,
you might start by boning up on what optimizers like this do and what they're
good for. I recommend John W. Chinneck's "Practical Optimization: A Gentle
Introduction" and the
Cassowary paper that got me into all of this: "Constraint Cascading Style
Sheets for the
Web"