Commits

Anonymous committed 42af44e

say hello to werkzeug.

  • Participants
  • Parent commits 171eb0a

Comments (0)

Files changed (42)

+Installation instruction for friendpaste
+======================================
+
+
+Requirements :
+ * CouchDB 7.2 & above 
+ * couchdb-python (http://code.google.com/p/couchdb-python))
+ * werkzeug (http://werkzeug.pocoo.org/), use hg last tip
+ * jinja (http://jinja.pocoo.org/), use hg last tip
+ * wtforms (http://dev.simplecodes.com/projects/wtforms), 
+   use hg last tip
+ * pygments 0.8 (http://pygments.org/)
+
+Code source here :
+hg clone http://dev.e-engura.com/hg/friendpaste
+
+By default friendpaste dev version use a database named 
+"friendpaste" and couchdb on "http://localhost:5984". 
+You could change it in settings.py file.
+
+
+To launch friendpaste :
+
+python management_friendpaste.py runserver (or shell if you want a shell)
+
+The first time, this script is launched database and views are created.
-Copyright (c) 2007, Benoît Chesneau <benoitc@e-engura.org>
-All rights reserved.
+All source code published here is available under the terms of the 
+GNU Affero General Public License, version 3. Please see 
+http://gplv3.fsf.org/ for more information.
 
-Redistribution and use in source and binary forms, with or without modification, are permitted provided that the following conditions are met:
-
-    * Redistributions of source code must retain the above copyright notice, this list of conditions and the following disclaimer.
-    * Redistributions in binary form must reproduce the above copyright notice, this list of conditions and the following disclaimer in the documentation and/or other materials provided with the distribution.
-    * Neither the name of the <ORGANIZATION> nor the names of its contributors may be used to endorse or promote products derived from this software without specific prior written permission.
-
-THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS
-"AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT
-LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR
-A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT OWNER OR
-CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL,
-EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO,
-PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR
-PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF
-LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING
-NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS
-SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
-
+A more liberal license may be available at a later date. (When code will be finnished)

File friendpaste/__init__.py

+# -*- coding: utf-8 -*-
+"""
+    :copyright: 2008 by Benoît Chesneau 
+    :license: GNU Affero General Public License, see license for more details
+"""
+from friendpaste.application import Friendpaste

File friendpaste/application.py

+# -*- coding: utf-8 -
+"""
+    :copyright: 2008 by Benoît Chesneau 
+    :license: GNU Affero General Public License, see license for more details
+"""
+
+from werkzeug import ClosingIterator, SharedDataMiddleware, redirect, cookie_date
+
+from werkzeug.exceptions import HTTPException, BadRequest, Forbidden, \
+     NotFound
+from jinja import Environment
+from couchdb import Server, ResourceConflict
+
+from friendpaste import settings
+from friendpaste.urls import map, all_views
+from friendpaste.utils import local, local_manager
+from friendpaste.template import TemplateLoader, do_highlight, \
+        ALL_COLORSHEME
+from friendpaste.http import Request
+
+
+class Friendpaste(object):
+    def __init__(self):
+        self.templates_path = settings.TEMPLATES_PATH
+
+        self.views = all_views.copy()
+
+        self.dispatch_request = SharedDataMiddleware(self.dispatch_request, {
+            '/static':     settings.SHARED_DATA
+        })
+
+        env = Environment(loader=TemplateLoader(self))
+        env.template_charset = 'utf-8'
+        env.filters['highlight']=do_highlight
+        env.globals['ALL_COLORSHEME'] = ALL_COLORSHEME 
+        self.template_env = env
+        
+        self.couchdb_server = Server('http://localhost:5984/')
+        try:
+            self.db = self.couchdb_server.create('friendpaste')
+        except ResourceConflict:
+            self.db = self.couchdb_server['friendpaste']
+
+        self.initialized = True
+
+    def bind_to_thread(self):
+        local.application = self
+
+    def bind_to_context(self):
+        local.application = self
+
+    def dispatch_request(self, environ, start_response):
+        local.application = self 
+        local.url_adapter = adapter  = map.bind_to_environ(environ)
+        request = object.__new__(Request)
+        local.request = request
+        request.__init__(self, environ)
+        try:
+            endpoint, args = adapter.match(request.path)
+            response = self.views[endpoint](request, **args)
+        except NotFound, e:
+            response =  e.get_response(environ)
+            response.status_code = 404
+        except HTTPException, e:
+            response = e.get_response(environ)
+
+
+        return response(environ, start_response)
+
+    def __call__(self, environ, start_response):
+        """Just forward a WSGI call to the first internal middleware."""
+        return ClosingIterator(self.dispatch_request(environ, start_response),
+                               [local_manager.cleanup])

File friendpaste/http.py

+# -*- coding: utf-8 -
+"""
+    :copyright: 2008 by Benoît Chesneau 
+    :license: GNU Affero General Public License, see license for more details
+"""
+from werkzeug import BaseRequest, BaseResponse
+
+class Request(BaseRequest):
+    charset = 'utf-8'
+
+    def __init__(self, app, environ):
+        super(Request, self).__init__(environ)
+        self.app = app
+
+        
+class Response(BaseResponse):
+    """
+    An utf-8 response, with text/html as default mimetype.
+    """
+    charset = 'utf-8'
+    default_mimetype = 'text/html'

File friendpaste/paste/__init__.py

Empty file added.

File friendpaste/paste/models.py

+# -*- coding: utf-8 -
+
+from couchdb.schema import *
+
+class Snippet(Document):
+    title=TextField()
+    snippet=TextField()
+    language=TextField()

File friendpaste/paste/views.py

+# -*- coding: utf-8 -
+
+import os.path
+
+from wtforms import Form, TextField, TextAreaField, SelectField
+from pygments.lexers import get_all_lexers
+from pygments.styles import get_all_styles
+from pygments.formatters import HtmlFormatter
+from werkzeug import redirect
+
+from friendpaste.settings import SHARED_DATA
+from friendpaste.utils import local
+from friendpaste.http import Response
+from friendpaste.template import render_response
+from friendpaste.paste.models import Snippet
+
+
+def _get_lexers():
+    lexers = get_all_lexers()
+    ret = [] 
+    for l in lexers:
+        ret.append((l[1][0],l[0]))
+    ret.sort()
+    return ret
+
+LEXERS_CHOICE = _get_lexers()
+ALL_LEXERS=get_all_lexers()
+
+ALL_COLORSHEME = list(get_all_styles())
+
+class PasteForm(Form):
+    title=TextField('Title')
+    snippet=TextAreaField('Paste')
+    language = SelectField(u'Programming Language', choices=LEXERS_CHOICE)
+
+def create_snippet(request):
+    form = PasteForm(request.form, prefix='paste')
+    if request.method=='POST' and form.validate():
+        s = Snippet(title=form.data['title'], snippet=form.data['snippet'], language=form.data['language'])
+        s.store(local.application.db)
+        return redirect ('/%s' % s.id)
+
+    return render_response('paste/index.html', form=form)
+
+def view_snippet(request, id):
+    db = local.application.db
+    s = Snippet.load(db, id)
+
+    theme='default'
+    highlight_css = "%s/css/%s.css" % (SHARED_DATA, theme)
+    if not os.path.exists(highlight_css):
+        css = HtmlFormatter(style=theme).get_style_defs('.highlight')
+        f = open(highlight_css, 'w')
+        f.write(css)
+        f.close()
+
+    return render_response('paste/view.html', snippet=s, theme=theme)
+
+def view_rawsnippet(request, id):
+    db = local.application.db
+    s = Snippet.load(db, id)
+    response = Response(s.snippet)
+    response.headers['content-type'] = 'text/plain'
+    return response
+
+def view_original(request, id):
+    db = local.application.db
+    s = Snippet.load(db, id)
+    from pygments import lexers
+    lexer = lexers.get_lexer_by_name(s.language)
+    response = Response(s.snippet)
+    response.headers['content-type'] = lexer.mimetypes[0]
+    if lexer.filenames and len(lexer.filenames)>0:
+        response.headers['content-disposition'] =  "filename=%s%s" % (
+            s.id, lexer.filenames[0][1:])
+    else:
+        response.headers['content-disposition'] =  "filename=%s.txt" % s.id
+    return response
+

File friendpaste/settings.py

+# -*- coding: utf-8 -*-
+import os
+
+# database
+DATABASE_URI='mysql://work:test@localhost:3306/metavers'
+
+# path 
+PROJECT_PATH = os.path.dirname(os.path.abspath(__file__))
+SHARED_DATA = os.path.join(PROJECT_PATH, '../static')
+TEMPLATES_PATH = os.path.join(PROJECT_PATH, '../templates')
+
+SITE_ID=1
+SECRET_KEY='*j4c=nhmvl@up^@)ftp0i8^2r8woplh^tlwen=z1vs=yod^bc%'
+
+############
+# SESSIONS #
+############
+SESSION_COOKIE_NAME = 'METAVERS_SID'
+SESSION_COOKIE_AGE = 60 * 60 * 24 * 7 * 2
+SESSION_COOKIE_DOMAIN = None
+SESSION_COOKIE_PATH = '/'
+SESSION_COOKIE_SECURE = False
+
+###########
+# AWS     #
+###########
+AWS_ACCESS_KEY_ID = "12VJB7K4SQSXNBF7WJR2"
+AWS_SECRET_ACCESS_KEY = "1DSTJ2Gs2mi9RdVNemwa+7H+FObj6ryb5/UwtK+3"

File friendpaste/template.py

+# -*- coding: utf-8 -
+import codecs
+import os
+
+from jinja.loaders import BaseLoader
+from jinja.exceptions import TemplateNotFound
+from jinja.datastructure import Deferred
+from jinja.filters import stringfilter
+
+from pygments import highlight, lexers, formatters
+from pygments.styles import get_all_styles
+
+from friendpaste.http import Request, Response
+from friendpaste.utils import local
+
+class TemplateLoader(BaseLoader):
+
+    def __init__(self, app):
+        self.app = app
+        super(TemplateLoader, self).__init__(app, auto_reload=True)
+
+    def get_source(self, environment, name, parent):
+
+        filename = os.path.join(self.app.templates_path, name)
+        if not os.path.exists(filename):
+            raise TemplateNotFound(name)
+        f = codecs.open(filename, 'r', environment.template_charset)
+        try:
+            return f.read()
+        finally:
+            f.close()
+
+def render_response(template_name, **kwargs):
+    return Response(render_template(template_name, **kwargs))
+
+def render_template(template_name, _stream=False, **kwargs):
+    tmpl = local.application.template_env.get_template(template_name)
+    if _stream:
+        return tmpl.stream(kwargs)
+    return tmpl.render(kwargs)
+
+@stringfilter
+def do_highlight(value, language):
+    lexer = lexers.get_lexer_by_name(language)
+    highlighted = highlight(value, lexer,
+    formatters.HtmlFormatter(linenos=True, 
+        cssclass="source", lineseparator="<br />",
+        nowrap=True))
+    return highlighted
+
+ALL_COLORSHEME = list(get_all_styles())

File friendpaste/urls.py

+from werkzeug.routing import Map, Rule, RequestRedirect,Submount
+
+from friendpaste.paste import views as paste
+
+all_views = {
+        'paste/create': paste.create_snippet,
+        'paste/view': paste.view_snippet,
+        'paste/raw': paste.view_rawsnippet,
+        'paste/original': paste.view_original
+}
+
+
+map = Map([ 
+    Rule('/', endpoint='paste/create'),
+    Rule('/<id>/raw', endpoint='paste/raw'),
+    Rule('/<id>/original', endpoint='paste/original'),
+    Rule('/<id>', endpoint='paste/view')
+])
+
+

File friendpaste/utils.py

+# -*- coding: utf-8 -
+"""
+    :copyright: 2008 by Benoît Chesneau 
+    :license: GNU Affero General Public License, see license for more details
+"""
+
+from werkzeug import Local, LocalManager
+
+local = Local()
+local_manager = LocalManager([local])

File management_friendpaste.py

+#!/usr/bin/env python
+# -*- coding: utf-8 -*-
+"""
+    :copyright: 2008 by Benoît Chesneau 
+    :license: GNU Affero General Public License, see license for more details
+"""
+
+from werkzeug import script
+
+def make_friendpaste():
+    from friendpaste import Friendpaste
+    return Friendpaste()
+
+def shell_init_func():
+    from friendpaste import settings
+    friendpaste = make_friendpaste()
+    return locals() 
+
+action_runserver = script.make_runserver(make_friendpaste, use_reloader=True)
+action_shell = script.make_shell(shell_init_func)
+
+if __name__ == '__main__':
+    script.run()

File static/css/base.css

+body { 
+	margin: 0;
+	padding: 0;
+	background: #f5f8fa url(../images/bg.gif) repeat-x;
+	font-family: 'Helvetica Neue', Helvetica, Arial, sans-serif;
+	font-size: 12px;
+	color: #000;
+}
+ul, ol, li, h1, h2, h3, h4, h5, p { margin: 0 0 0.3em 0; padding: 0; }
+strong { font-weight: bold;}
+a:link { text-decoration: none; color: #fe4e00; }
+a:visited { text-decoration: none; color: #fe4e00; }
+a:hover { text-decoration: underline; }
+a:active { text-decoration: underline; }
+
+.form-row { clear: both; overflow:hidden; padding-top:5px; font-weight:normal;font-size:12px; }
+.form-row img, .form-row input { vertical-align:middle; }
+label {  margin-right: 4px;}
+.aligned label { display:block; padding:0 1em 3px 0; float:left; width:12em; }
+.aligned label.inline { display:inline; float:none; }
+.submit-row { padding-top:10px; line-height: 1.3em; vertical-align: middle; }

File static/css/blueprint/Changelog

+Blueprint CSS Framework Change Log
+
+* URL:    code.google.com/p/blueprintcss
+* List:   groups.google.com/group/blueprintcss
+* News:   bjorkoy.com
+
+----------------------------------------------------------------
+
+Version 0.6 - 21.9.2007
+--
+  * Created a new plugin, "iepngfix", that adds support for PNG transparency in IE5.5+ [OFB]
+  * Added an IE stylesheet, updated the test files and the readme accordingly [OFB]
+  * Re-added improved support for em units [OFB]
+  * Lots of minor changes to typography.css and reset.css, provided by Christian Montoya [OFB]
+  * Extracted the fancy typography section in typography.css to a new plugin [OFB]
+  * Extracted the support for CSS buttons into a new plugin. [OFB]
+  * Added new plugin structure. [OFB]
+  * Changed some default fonts so that BP works better with ClearType in XP [OFB]
+  * Re-added the hack for clearing floats without extra markup. [OFB]
+  * Added Changelog.txt to track changes in each release. [GR]
+  * Cleaned up and rationalized SVN dir structure. [GR, OFB]
+  * print.css : removed reference to 'baseline.png' as it no longer exists. [GR]
+  * grid.css : removed reference to '.first' css class as it no longer exists. [GR]
+  * Added append-13 to append-23 and prepend-13 to prepend-23 to allow pushing elements
+    to both extreme sides of the grid. Added test cases to tests/grid.css [GR]
+  * Moved test sample files to blueprint/tests sub-directory so tests stay with the code. [GR]
+  * Consolidated all references to release version number to screen.css [OFB]
+  * Added ruby script (generate_compressed_css.rb) to scripts dir, and 'csstidy' binary (OS X Universal) 
+    for generating tidied version of Blueprint (lib/compressed.css).
+  * Consolidated test pages into one single page (test.html).  Uses compressed stylesheet by default.  This ensures test of 
+    the chain of generation.  (todo) Intention is to delete other test files if single file works well. (todo) ensure singular 
+    test file contains latest changes to other test files.   [GR]
+  * Moved the blueprint framework to its own folder in the package, so that the tests, script,
+    license and readme don't clutter up our BP folder. [OFB]
+  * Re-saved grid.png with Photoshop to remove Fireworks data which was bloating it.  
+    Now its about 3KB instead of 40+KB. Resolves Issue 22. [GR]
+  * Moved compressed files to new compressed dir [OFB]
+  * print.css is now also being generated by the compressor ruby script and is available for use.
+  * Added new script 'validate_css.rb' which will validate all css files and present a report with 
+    a local java binary of the W3C validator.
+  * Created an experimental CSS classes plugin, by popular demand. [OFB]
+  * Improved handling of multi-line headings. [OFB]
+  * Improved styling of <table>s, you may now use .span classes on <th>s to create tables that follow the grid. [OFB]
+  * Added support for indented paragraphs to the Fancy-type plugin. [OFB]
+  * Added a new plugin: link-icons. [OFB]
+  * Seperated the plugins tests into their own file. [OFB]
+  * Re-structured some of the tests.html sections. [OFB]
+  * Added class ".colborder" to grid.css. [OFB]
+  * Added .error, .notice and .success classes to typography.css. [OFB]
+  * Added tests for more elements which gets reset in reset.css [OFB, GR]
+  * Added forms.css, awaiting implementation. Moved form styling from typography.css [OFB]
+  * Updated compressor script to include forms.css [OFB]
+  * Improved forms.html tests for upcoming forms.css implementation. This will change based on the 
+    markup that forms.css will use. [OFB]
+  * Fixed clearing image in button element bug in buttons.css [OFB]
+  * Fixed bug where IE6 clips pushed/pulled elements. [OFB]
+  * Fixed typo in grid.css formula. [OFB]
+  * Fixed varying formatting across core files. [OFB]
+  * Fixed legend element in IE6. [OFB]
+  * Fixed indentation in test files. [OFB]
+  * Removed tests for plugins not bundled with the next release. [OFB]
+  * Improved styling of <h3>. [OFB]
+  * Fixed indentation bug in ul/ol, removed some redundant styling. [OFB]
+  * Fixed validation errors in tests. [OFB]
+  * Changed IE stylesheet condition comment to include all versions of IE. [OFB]
+  * Started on a new approach for the PNG plugin. Will not be included in this release. [OFB]
+  * Fixed incorrect rendering of ol in IE6/7. [OFB]
+  * Created a new, spiffier sample page. [OFB]
+  
+
+Version 0.5 - 28/8/2007
+--
+  * Changed grid width from 14 to 24 columns [OFB]
+  * Removed 'first' CSS class and the need to apply it to the first column in a row of columns. [OFB]
+  * Reverted to using pixels instead of em units to specify vertical spacing due to baseline issues with 
+    all browsers except Firefox. [OFB]
+  * New set of default fonts. (Experimental) [OFB]
+  * Added test files [OFB]
+
+
+Version 0.4 - 11/08/2007
+--
+  * All font sizes and vertical margins are now elastic, through the use of em units. 
+    Resizing works great in every tested browser. [OFB]
+  * Comes with a new, compressed version of BP, which reduces the size of the core files by 60 percent. [OFB]
+  * Support for incremental leading, contributed by Mark Boulton. [OFB]
+  * Adds perfected CSS buttons, by Kevin Hale of Particletree fame. [OFB]
+  * Fixes all known IE bugs. [OFB]
+  * Loads of minor fixes and additions. [OFB]
+
+
+Initial Release - 03/08/2007
+--
+  * Initial release of Blueprint
+

File static/css/blueprint/License

+Copyright (c) 2007 Olav Bjorkoy (http://bjorkoy.com)
+
+Permission is hereby granted, free of charge, to any person obtaining a copy
+of this software and associated documentation files (the "Software"), to deal
+in the Software without restriction, including without limitation the rights
+to use, copy, modify, merge, publish, distribute, sub-license, and/or sell
+copies of the Software, and to permit persons to whom the Software is
+furnished to do so, subject to the following conditions:
+
+The above copyright notice, and every other copyright notice found in this 
+software, and all the attributions in every file, and this permission notice 
+shall be included in all copies or substantial portions of the Software.
+
+THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
+IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
+FITNESS FOR A PARTICULAR PURPOSE AND NON-INFRINGEMENT. IN NO EVENT SHALL THE
+AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
+LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,
+OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN
+THE SOFTWARE.
+

File static/css/blueprint/compressed/print.css

+body {
+line-height:1.5;
+font-family:"Helvetica Neue", "Lucida Grande", Arial, Verdana, sans-serif;
+color:#000;
+background:none;
+font-size:10pt;
+}
+
+.container {
+background:none;
+}
+
+h1,h2,h3,h4,h5,h6 {
+font-family:"Helvetica Neue", Arial, "Lucida Grande", sans-serif;
+}
+
+code {
+font:.9em "Courier New", Monaco, Courier, monospace;
+}
+
+img {
+float:left;
+margin:1.5em 1.5em 1.5em 0;
+}
+
+a img {
+border:none;
+}
+
+p img.top {
+margin-top:0;
+}
+
+hr {
+background:#ccc;
+color:#ccc;
+width:100%;
+height:2px;
+border:none;
+margin:2em 0;
+padding:0;
+}
+
+blockquote {
+font-style:italic;
+font-size:.9em;
+margin:1.5em;
+padding:1em;
+}
+
+.small {
+font-size:.9em;
+}
+
+.large {
+font-size:1.1em;
+}
+
+.quiet {
+color:#999;
+}
+
+.hide {
+display:none;
+}
+
+a:link,a:visited {
+background:transparent;
+font-weight:700;
+text-decoration:underline;
+}
+
+a:link:after,a:visited:after {
+content:" (" attr(href) ") ";
+font-size:90%;
+}

File static/css/blueprint/compressed/screen.css

+html,body,div,span,object,iframe,h1,h2,h3,h4,h5,h6,p,blockquote,pre,a,abbr,acronym,address,code,del,dfn,em,img,q,dl,dt,dd,ol,ul,li,fieldset,form,label,legend,table,caption,tbody,tfoot,thead,tr,th,td {
+border:0;
+font-weight:inherit;
+font-style:inherit;
+font-size:100%;
+font-family:inherit;
+vertical-align:baseline;
+margin:0;
+padding:0;
+}
+
+body {
+line-height:1.5;
+background:#fff;
+font-size:75%;
+color:#222;
+font-family:"Helvetica Neue", "Lucida Grande", Helvetica, Arial, Verdana, sans-serif;
+margin:1.5em 0;
+}
+
+table {
+border-collapse:separate;
+border-spacing:0;
+margin-bottom:1.4em;
+}
+
+caption,th,td {
+text-align:left;
+font-weight:400;
+}
+
+blockquote:before,blockquote:after,q:before,q:after {
+content:"";
+}
+
+blockquote,q {
+quotes:;
+}
+
+a img {
+border:none;
+}
+
+h1,h2,h3,h4,h5,h6 {
+color:#111;
+font-family:"Helvetica Neue", Helvetica, Arial, sans-serif;
+font-weight:400;
+}
+
+h1 {
+font-size:3em;
+line-height:1;
+margin-bottom:.5em;
+}
+
+h2 {
+font-size:2em;
+margin-bottom:.75em;
+}
+
+h3 {
+font-size:1.5em;
+line-height:1;
+margin-bottom:1em;
+}
+
+h4 {
+font-size:1.2em;
+line-height:1.25;
+margin-bottom:1.25em;
+}
+
+h5 {
+font-size:1em;
+font-weight:700;
+margin-bottom:1.5em;
+}
+
+h6 {
+font-size:1em;
+font-weight:700;
+}
+
+p.last {
+margin-bottom:0;
+}
+
+p img {
+float:left;
+margin:1.5em 1.5em 1.5em 0;
+padding:0;
+}
+
+p img.top {
+margin-top:0;
+}
+
+ul,ol {
+margin:0 1.5em 1.5em;
+}
+
+ul {
+list-style-type:circle;
+}
+
+ol {
+list-style-type:decimal;
+}
+
+dd {
+margin-left:1.5em;
+}
+
+abbr,acronym {
+border-bottom:1px dotted #666;
+}
+
+address {
+margin-top:1.5em;
+font-style:italic;
+}
+
+a:focus,a:hover {
+color:#000;
+}
+
+a {
+color:#009;
+text-decoration:underline;
+}
+
+blockquote {
+color:#666;
+font-style:italic;
+margin:1.5em;
+}
+
+em,dfn {
+font-style:italic;
+background:#ffc;
+}
+
+pre,code {
+white-space:pre;
+margin:1.5em 0;
+}
+
+pre,code,tt {
+font:1em 'andale mono', monotype.com, 'lucida console', monospace;
+line-height:1.5;
+}
+
+tt {
+display:block;
+line-height:1.5;
+margin:1.5em 0;
+}
+
+th {
+border-bottom:2px solid #ccc;
+font-weight:700;
+}
+
+td {
+border-bottom:1px solid #ddd;
+}
+
+th,td {
+padding:4px 10px 4px 0;
+}
+
+tfoot {
+font-style:italic;
+}
+
+caption {
+background:#ffc;
+}
+
+table .last {
+padding-right:0;
+}
+
+.small {
+font-size:.8em;
+margin-bottom:1.875em;
+line-height:1.875em;
+}
+
+.large {
+font-size:1.2em;
+line-height:2.5em;
+margin-bottom:1.25em;
+}
+
+.hide {
+display:none;
+}
+
+.highlight {
+background:#ff0;
+}
+
+.added {
+color:#060;
+}
+
+.removed {
+color:#900;
+}
+
+.top {
+margin-top:0;
+padding-top:0;
+}
+
+.bottom {
+margin-bottom:0;
+padding-bottom:0;
+}
+
+.container {
+width:950px;
+margin:0 auto;
+}
+
+.column {
+float:left;
+margin-right:10px;
+}
+
+.last {
+margin-right:0;
+}
+
+.span-1 {
+width:30px;
+}
+
+.span-2 {
+width:70px;
+}
+
+.span-3 {
+width:110px;
+}
+
+.span-4 {
+width:150px;
+}
+
+.span-5 {
+width:190px;
+}
+
+.span-6 {
+width:230px;
+}
+
+.span-7 {
+width:270px;
+}
+
+.span-8 {
+width:310px;
+}
+
+.span-9 {
+width:350px;
+}
+
+.span-10 {
+width:390px;
+}
+
+.span-11 {
+width:430px;
+}
+
+.span-12 {
+width:470px;
+}
+
+.span-13 {
+width:510px;
+}
+
+.span-14 {
+width:550px;
+}
+
+.span-15 {
+width:590px;
+}
+
+.span-16 {
+width:630px;
+}
+
+.span-17 {
+width:670px;
+}
+
+.span-18 {
+width:710px;
+}
+
+.span-19 {
+width:750px;
+}
+
+.span-20 {
+width:790px;
+}
+
+.span-21 {
+width:830px;
+}
+
+.span-22 {
+width:870px;
+}
+
+.span-23 {
+width:910px;
+}
+
+.span-24 {
+width:950px;
+margin:0;
+}
+
+.append-1 {
+padding-right:40px;
+}
+
+.append-2 {
+padding-right:80px;
+}
+
+.append-3 {
+padding-right:120px;
+}
+
+.append-4 {
+padding-right:160px;
+}
+
+.append-5 {
+padding-right:200px;
+}
+
+.append-6 {
+padding-right:240px;
+}
+
+.append-7 {
+padding-right:280px;
+}
+
+.append-8 {
+padding-right:320px;
+}
+
+.append-9 {
+padding-right:360px;
+}
+
+.append-10 {
+padding-right:400px;
+}
+
+.append-11 {
+padding-right:440px;
+}
+
+.append-12 {
+padding-right:480px;
+}
+
+.append-13 {
+padding-right:520px;
+}
+
+.append-14 {
+padding-right:560px;
+}
+
+.append-15 {
+padding-right:600px;
+}
+
+.append-16 {
+padding-right:640px;
+}
+
+.append-17 {
+padding-right:680px;
+}
+
+.append-18 {
+padding-right:720px;
+}
+
+.append-19 {
+padding-right:760px;
+}
+
+.append-20 {
+padding-right:800px;
+}
+
+.append-21 {
+padding-right:840px;
+}
+
+.append-22 {
+padding-right:880px;
+}
+
+.append-23 {
+padding-right:920px;
+}
+
+.prepend-1 {
+padding-left:40px;
+}
+
+.prepend-2 {
+padding-left:80px;
+}
+
+.prepend-3 {
+padding-left:120px;
+}
+
+.prepend-4 {
+padding-left:160px;
+}
+
+.prepend-5 {
+padding-left:200px;
+}
+
+.prepend-6 {
+padding-left:240px;
+}
+
+.prepend-7 {
+padding-left:280px;
+}
+
+.prepend-8 {
+padding-left:320px;
+}
+
+.prepend-9 {
+padding-left:360px;
+}
+
+.prepend-10 {
+padding-left:400px;
+}
+
+.prepend-11 {
+padding-left:440px;
+}
+
+.prepend-12 {
+padding-left:480px;
+}
+
+.prepend-13 {
+padding-left:520px;
+}
+
+.prepend-14 {
+padding-left:560px;
+}
+
+.prepend-15 {
+padding-left:600px;
+}
+
+.prepend-16 {
+padding-left:640px;
+}
+
+.prepend-17 {
+padding-left:680px;
+}
+
+.prepend-18 {
+padding-left:720px;
+}
+
+.prepend-19 {
+padding-left:760px;
+}
+
+.prepend-20 {
+padding-left:800px;
+}
+
+.prepend-21 {
+padding-left:840px;
+}
+
+.prepend-22 {
+padding-left:880px;
+}
+
+.prepend-23 {
+padding-left:920px;
+}
+
+.border {
+padding-right:4px;
+margin-right:5px;
+border-right:1px solid #eee;
+}
+
+.colborder {
+padding-right:24px;
+margin-right:25px;
+border-right:1px solid #eee;
+}
+
+.pull-1 {
+margin-left:-40px;
+}
+
+.pull-2 {
+margin-left:-80px;
+}
+
+.pull-3 {
+margin-left:-120px;
+}
+
+.pull-4 {
+margin-left:-160px;
+}
+
+.push-0 {
+margin:0 0 0 18px;
+}
+
+.push-1 {
+margin:0 -40px 0 18px;
+}
+
+.push-2 {
+margin:0 -80px 0 18px;
+}
+
+.push-3 {
+margin:0 -120px 0 18px;
+}
+
+.push-4 {
+margin:0 -160px 0 18px;
+}
+
+.push-0,.push-1,.push-2,.push-3,.push-4 {
+float:right;
+}
+
+.box {
+margin-bottom:1.5em;
+background:#eee;
+padding:1.5em;
+}
+
+hr {
+background:#ddd;
+color:#ddd;
+clear:both;
+float:none;
+width:100%;
+height:.1em;
+border:none;
+margin:0 0 1.4em;
+}
+
+hr.space {
+background:#fff;
+color:#fff;
+}
+
+.clear {
+display:block;
+}
+
+.clear:after,.container:after {
+content:".";
+display:block;
+height:0;
+clear:both;
+visibility:hidden;
+}
+
+* html .clear {
+height:1%;
+}
+
+fieldset {
+border:1px solid #ccc;
+margin:0 0 1.5em;
+padding:1.4em;
+}
+
+legend {
+font-weight:700;
+font-size:1.2em;
+}
+
+input.text,input.title {
+width:300px;
+border:1px solid #bbb;
+background:#f6f6f6;
+margin:.5em .5em .5em 0;
+padding:5px;
+}
+
+input.title {
+font-size:1.5em;
+}
+
+textarea {
+width:400px;
+height:250px;
+border:1px solid #bbb;
+background:#eee;
+margin:.5em .5em .5em 0;
+padding:5px;
+}
+
+select {
+border:1px solid #ccc;
+background:#f6f6f6;
+width:200px;
+}
+
+.error,.notice,.success {
+margin-bottom:1em;
+border:2px solid #ddd;
+padding:.8em;
+}
+
+.error {
+background:#FBE3E4;
+color:#D12F19;
+border-color:#FBC2C4;
+}
+
+.notice {
+background:#FFF6BF;
+color:#817134;
+border-color:#FFD324;
+}
+
+.success {
+background:#E6EFC2;
+color:#529214;
+border-color:#C6D880;
+}
+
+.error a {
+color:#D12F19;
+}
+
+.notice a {
+color:#817134;
+}
+
+.success a {
+color:#529214;
+}
+
+p,img,dl {
+margin:0 0 1.5em;
+}
+
+dl dt,strong,dfn,label {
+font-weight:700;
+}
+
+del,.quiet {
+color:#666;
+}
+
+input.text:focus,input.title:focus,textarea:focus,select:focus {
+background:#fff;
+border:1px solid #999;
+}

File static/css/blueprint/lib/forms.css

+/* -------------------------------------------------------------- 
+   
+   forms.css
+   * Sets up some default styling for forms
+   * Gives you classes to enhance your forms
+   
+   Usage:
+   * For text fields, use class .title or .text
+   
+-------------------------------------------------------------- */
+
+label { font-weight: bold; }
+
+
+/* Fieldsets */
+fieldset    { padding:1.4em; margin: 0 0 1.5em 0; border: 1px solid #ccc; }
+legend      { font-weight: bold; font-size:1.2em; }
+
+/* Text fields */
+input.text, input.title   { width: 300px; margin:0.5em 0.5em 0.5em 0; }
+input.text, input.title   { border:1px solid #bbb; background:#f6f6f6; padding:5px; }
+input.text:focus,
+input.title:focus         { border:1px solid #999; background:#fff; }
+input.title               { font-size:1.5em; }
+
+/* Textareas */
+textarea            { width: 400px; height: 250px; margin:0.5em 0.5em 0.5em 0; }
+textarea            { border:1px solid #bbb; background:#eee; padding:5px; }
+textarea:focus      { border:1px solid #999; background:#fff; }
+
+/* Select fields */
+select              { border:1px solid #ccc; background:#f6f6f6; width:200px; }
+select:focus        { border:1px solid #999; background:#fff; }
+
+
+/* Success, error & notice boxes for messages and errors. */
+.error,
+.notice, 
+.success    { padding: .8em; margin-bottom: 1em; border: 2px solid #ddd; }
+.error      { background: #FBE3E4; color: #D12F19; border-color: #FBC2C4; }
+.notice     { background: #FFF6BF; color: #817134; border-color: #FFD324; }
+.success    { background: #E6EFC2; color: #529214; border-color: #C6D880; }
+.error a    { color: #D12F19; }
+.notice a   { color: #817134; }
+.success a  { color: #529214; }

File static/css/blueprint/lib/grid.css

+/* -------------------------------------------------------------- 
+   
+   grid.css
+   * Sets up an easy-to-use grid of 24 columns.
+   
+   Based on work by:
+   * Nathan Borror     [playgroundblues.com]
+   * Jeff Croft        [jeffcroft.com]
+   * Christian Metts   [mintchaos.com]
+   * Khoi Vinh         [subtraction.com]
+   
+   By default, the grid is 950px wide, with 24 columns 
+   spanning 30px, and a 10px margin between columns.
+   
+   If you need fewer or more columns, use this 
+   formula to find the new total width: 
+   Total width = (columns * 40) - 10
+   
+   Read more about using a grid here:
+   * subtraction.com/archives/2007/0318_oh_yeeaahh.php
+   
+-------------------------------------------------------------- */
+
+/* A container should group all your columns. */
+.container {
+  width: 950px;
+  margin: 0 auto;
+}
+
+
+/* Columns
+-------------------------------------------------------------- */
+
+/* Use this class together with the .span-x classes
+   to create any composition of columns in a layout. */
+   
+.column {
+  float: left;
+  margin-right: 10px;
+}
+
+
+/* The last column in a row needs this class. */
+.last { margin-right: 0; }
+
+/* Use these classes to set the width of a column. */
+.span-1   { width: 30px; }
+.span-2   { width: 70px; }
+.span-3   { width: 110px; }
+.span-4   { width: 150px; }
+.span-5   { width: 190px; }
+.span-6   { width: 230px; }
+.span-7   { width: 270px; }
+.span-8   { width: 310px; }
+.span-9   { width: 350px; }
+.span-10  { width: 390px; }
+.span-11  { width: 430px; }
+.span-12  { width: 470px; }
+.span-13  { width: 510px; }
+.span-14  { width: 550px; }
+.span-15  { width: 590px; }
+.span-16  { width: 630px; }
+.span-17  { width: 670px; }
+.span-18  { width: 710px; }
+.span-19  { width: 750px; }
+.span-20  { width: 790px; }
+.span-21  { width: 830px; }
+.span-22  { width: 870px; }
+.span-23  { width: 910px; }
+.span-24  { width: 950px; margin: 0; }
+
+/* Add these to a column to append empty cols. */
+.append-1   { padding-right: 40px; }  
+.append-2   { padding-right: 80px; } 
+.append-3   { padding-right: 120px; } 
+.append-4   { padding-right: 160px; } 
+.append-5   { padding-right: 200px; } 
+.append-6   { padding-right: 240px; } 
+.append-7   { padding-right: 280px; } 
+.append-8   { padding-right: 320px; } 
+.append-9   { padding-right: 360px; } 
+.append-10  { padding-right: 400px; } 
+.append-11  { padding-right: 440px; } 
+.append-12  { padding-right: 480px; } 
+.append-13  { padding-right: 520px; } 
+.append-14  { padding-right: 560px; } 
+.append-15  { padding-right: 600px; } 
+.append-16  { padding-right: 640px; } 
+.append-17  { padding-right: 680px; } 
+.append-18  { padding-right: 720px; } 
+.append-19  { padding-right: 760px; } 
+.append-20  { padding-right: 800px; } 
+.append-21  { padding-right: 840px; } 
+.append-22  { padding-right: 880px; } 
+.append-23  { padding-right: 920px; } 
+
+/* Add these to a column to prepend empty cols. */
+.prepend-1   { padding-left: 40px; }  
+.prepend-2   { padding-left: 80px; } 
+.prepend-3   { padding-left: 120px; } 
+.prepend-4   { padding-left: 160px; } 
+.prepend-5   { padding-left: 200px; } 
+.prepend-6   { padding-left: 240px; } 
+.prepend-7   { padding-left: 280px; } 
+.prepend-8   { padding-left: 320px; } 
+.prepend-9   { padding-left: 360px; } 
+.prepend-10  { padding-left: 400px; } 
+.prepend-11  { padding-left: 440px; } 
+.prepend-12  { padding-left: 480px; } 
+.prepend-13  { padding-left: 520px; } 
+.prepend-14  { padding-left: 560px; } 
+.prepend-15  { padding-left: 600px; } 
+.prepend-16  { padding-left: 640px; } 
+.prepend-17  { padding-left: 680px; } 
+.prepend-18  { padding-left: 720px; } 
+.prepend-19  { padding-left: 760px; } 
+.prepend-20  { padding-left: 800px; } 
+.prepend-21  { padding-left: 840px; } 
+.prepend-22  { padding-left: 880px; } 
+.prepend-23  { padding-left: 920px; } 
+
+
+/* Border on right hand side of a column. */
+.border {
+  padding-right: 4px;
+  margin-right: 5px;
+  border-right: 1px solid #eee;
+}
+
+/* Border with more whitespace, spans one column. */
+.colborder {
+  padding-right: 24px;
+  margin-right: 25px;
+  border-right: 1px solid #eee;
+}
+
+
+/* Use these classes on an element to push it into the 
+   next column, or to pull it into the previous column. */
+
+.pull-1  { margin-left: -40px; }
+.pull-2  { margin-left: -80px; }
+.pull-3  { margin-left: -120px; }
+.pull-4  { margin-left: -160px; }
+
+.push-0  { margin: 0 0 0 18px; }
+.push-1  { margin: 0 -40px 0 18px; }
+.push-2  { margin: 0 -80px 0 18px; }
+.push-3  { margin: 0 -120px 0 18px; }
+.push-4  { margin: 0 -160px 0 18px; }
+.push-0, .push-1, .push-2, .push-3, .push-4 { float: right; }
+
+
+/* Misc classes and elements
+-------------------------------------------------------------- */
+
+/* Use a .box to create a padded box inside a column.  */ 
+.box { 
+  padding: 1.5em; 
+  margin-bottom: 1.5em; 
+  background: #eee; 
+}
+
+/* Use this to create a horizontal ruler across a column. */
+hr {
+  background: #ddd; 
+  color: #ddd;
+  clear: both; 
+  float: none; 
+  width: 100%; 
+  height: .1em;
+  margin: 0 0 1.4em;
+  border: none; 
+}
+hr.space {
+  background: #fff;
+  color: #fff;
+}
+
+/* Clearing floats without extra markup
+   Based on How To Clear Floats Without Structural Markup by PiE
+   [http://www.positioniseverything.net/easyclearing.html] */
+
+.clear { display: inline-block; }   
+.clear:after, .container:after {
+  content: "."; 
+  display: block; 
+  height: 0; 
+  clear: both; 
+  visibility: hidden;
+}
+* html .clear { height: 1%; }
+.clear { display: block; }

File static/css/blueprint/lib/grid.png

Added
New image

File static/css/blueprint/lib/ie.css

+/* -------------------------------------------------------------- 
+   
+   ie.css
+   
+   Contains every hack for Internet Explorer versions prior 
+   to IE7, so that our core files stay sweet and nimble.
+   
+-------------------------------------------------------------- */
+
+/* Make sure the layout is centered in IE5 */
+body        { text-align: center; }
+.container  { text-align: left; }
+
+
+/* This fixes the problem where IE6 adds an extra 3px margin to
+   two columns that are floated up against each other. */
+
+* html .column { overflow-x: hidden; } /* IE6 fix */
+
+.pull-1, .pull-2, .pull-3, .pull-4,
+.push-1, .push-2, .push-3, .push-4, 
+ul, ol {
+  position: relative; /* Keeps IE6 from cutting pulled/pushed images */
+}
+
+/* Fixes incorrect styling of legend in IE6 fieldsets. */
+legend { margin-bottom:1.4em; }
+
+/* Fixes incorrect placement of numbers in ol's in IE6/7 */
+ol { margin-left:2em; }

File static/css/blueprint/lib/reset.css

+/* -------------------------------------------------------------- 
+  
+   reset.css
+   * Resets default browser CSS.
+   
+   Based on work by Eric Meyer:
+   * meyerweb.com/eric/thoughts/2007/05/01/reset-reloaded/
+   
+-------------------------------------------------------------- */
+
+html, body, div, span, object, iframe,
+h1, h2, h3, h4, h5, h6, p, blockquote, pre,
+a, abbr, acronym, address, code,
+del, dfn, em, img, q, dl, dt, dd, ol, ul, li,
+fieldset, form, label, legend,
+table, caption, tbody, tfoot, thead, tr, th, td {
+	margin: 0;
+	padding: 0;
+	border: 0;
+	font-weight: inherit;
+	font-style: inherit;
+	font-size: 100%;
+	font-family: inherit;
+	vertical-align: baseline;
+}
+
+
+body { line-height: 1.5; background: #fff; margin:1.5em 0; }
+
+/* Tables still need 'cellspacing="0"' in the markup. */
+table { border-collapse: separate; border-spacing: 0; }
+caption, th, td { text-align: left; font-weight:400; }
+
+/* Remove possible quote marks (") from <q>, <blockquote>. */
+blockquote:before, blockquote:after, q:before, q:after { content: ""; }
+blockquote, q { quotes: "" ""; }
+
+a img { border: none; }
+

File static/css/blueprint/lib/typography.css

+/* -------------------------------------------------------------- 
+   
+   typography.css
+   * Sets up some sensible default typography.
+  
+   Based on work by:
+   * Nathan Borror     [playgroundblues.com]
+   * Jeff Croft        [jeffcroft.com]
+   * Christian Metts   [mintchaos.com]
+   * Wilson Miner      [wilsonminer.com]
+   * Richard Rutter    [clagnut.com]
+   
+   Read more about using a baseline here:
+   * alistapart.com/articles/settingtypeontheweb
+  
+-------------------------------------------------------------- */
+
+/* This is where you set your desired font size. The line-heights 
+   and vertical margins are automatically calculated from this. 
+   The percentage is of 16px (0.75 * 16px = 12px). */
+   
+body { font-size: 75%; }
+
+
+/* Default fonts and colors. 
+   If you prefer serif fonts, remove the font-family 
+   on the headings, and apply this one to the body:
+   font: 1em Georgia, "lucida bright", "times new roman", serif; */
+   
+body { 
+  color: #222; 
+  font-family: "Helvetica Neue", "Lucida Grande", Helvetica, Arial, Verdana, sans-serif; 
+}
+h1,h2,h3,h4,h5,h6 { 
+  color: #111; 
+  font-family: "Helvetica Neue", Helvetica, Arial, sans-serif; 
+}
+
+
+/* Headings
+-------------------------------------------------------------- */
+
+h1,h2,h3,h4,h5,h6 { font-weight: normal; }
+
+h1 { font-size: 3em; line-height: 1; margin-bottom: 0.5em; }
+h2 { font-size: 2em; margin-bottom: 0.75em; }
+h3 { font-size: 1.5em; line-height: 1; margin-bottom: 1em; }
+h4 { font-size: 1.2em; line-height: 1.25; margin-bottom: 1.25em; }
+h5 { font-size: 1em; font-weight: bold; margin-bottom: 1.5em; }
+h6 { font-size: 1em; font-weight: bold; }
+
+
+/* Text elements
+-------------------------------------------------------------- */
+
+p           { margin: 0 0 1.5em; }
+p.last      { margin-bottom: 0; }
+p img       { float: left; margin: 1.5em 1.5em 1.5em 0; padding: 0; }
+p img.top   { margin-top: 0; } /* Use this if the image is at the top of the <p>. */
+img         { margin: 0 0 1.5em; }
+
+ul, ol      { margin:0 1.5em 1.5em 1.5em; }
+ul          { list-style-type: circle; }
+ol          { list-style-type: decimal; }
+dl          { margin: 0 0 1.5em 0; }
+dl dt       { font-weight: bold; }
+dd          { margin-left: 1.5em;}
+
+abbr, 
+acronym     { border-bottom: 1px dotted #666; }
+address     { margin-top: 1.5em; font-style: italic; }
+del         { color:#666; }
+
+a:focus, 
+a:hover     { color: #000; }
+a           { color: #009; text-decoration: underline; }
+
+blockquote  { margin: 1.5em; color: #666; font-style: italic; }
+strong      { font-weight: bold; }
+em,dfn      { font-style: italic; background: #ffc; }
+dfn         { font-weight: bold; }
+pre,code    { margin: 1.5em 0; white-space: pre; }
+pre,code,tt { font: 1em 'andale mono', 'monotype.com', 'lucida console', monospace; line-height: 1.5; } 
+tt          { display: block; margin: 1.5em 0; line-height: 1.5; }
+
+
+/* Tables
+-------------------------------------------------------------- */
+
+table   { margin-bottom: 1.4em; }
+th      { border-bottom: 2px solid #ccc; font-weight: bold; }
+td      { border-bottom: 1px solid #ddd; }
+th,td   { padding: 4px 10px 4px 0; }
+tfoot   { font-style: italic; }
+caption { background: #ffc; }
+
+/* Use this if you use span-x classes on th/td. */
+table .last { padding-right: 0; } 
+
+
+/* Some default classes
+-------------------------------------------------------------- */
+
+.small      { font-size: .8em; margin-bottom: 1.875em; line-height: 1.875em; }
+.large      { font-size: 1.2em; line-height: 2.5em; margin-bottom: 1.25em; }
+.quiet      { color: #666; }
+
+.hide       { display: none; }
+.highlight  { background:#ff0; }
+.added      { color:#060; }
+.removed    { color:#900; }
+
+.top        { margin-top:0; padding-top:0; }
+.bottom     { margin-bottom:0; padding-bottom:0; }
+
+

File static/css/blueprint/plugins/buttons/Readme

+Buttons
+* Gives you great looking CSS buttons, for both <a> and <button>.
+* Demo: particletree.com/features/rediscovering-the-button-element
+
+
+Credits
+----------------------------------------------------------------
+
+* Created by Kevin Hale [particletree.com]
+* Adapted for Blueprint by Olav Bjorkoy [bjorkoy.com]
+
+
+Usage
+----------------------------------------------------------------
+
+1) Add this line to "blueprint/screen.css":
+	 @import 'plugins/buttons/buttons.css';
+
+2) Use the following HTML code to place the buttons on your site:
+
+	<button type="submit" class="button positive">
+	  <img src="css/blueprint/plugins/buttons/icons/tick.png" alt=""/> Save
+	</button>
+
+	<a class="button" href="/password/reset/">
+	  <img src="css/blueprint/plugins/buttons/icons/key.png" alt=""/> Change Password
+	</a>
+
+	<a href="#" class="button negative">
+	  <img src="css/blueprint/plugins/buttons/icons/cross.png" alt=""/> Cancel
+	</a>

File static/css/blueprint/plugins/buttons/buttons.css

+/* -------------------------------------------------------------- 
+  
+   buttons.css
+   * Gives you some great CSS-only buttons.
+   
+   Created by Kevin Hale [particletree.com]
+   * particletree.com/features/rediscovering-the-button-element
+
+   See Readme.txt in this folder for instructions.
+
+-------------------------------------------------------------- */
+
+a.button, button {
+  display:block;
+  float:left;
+  margin:0 0.583em 0.667em 0;
+  padding:5px 10px 5px 7px;   /* Links */
+  
+  border:1px solid #dedede;
+  border-top:1px solid #eee;
+  border-left:1px solid #eee;
+
+  background-color:#f5f5f5;
+  font-family:"Lucida Grande", Tahoma, Arial, Verdana, sans-serif;
+  font-size:100%;
+  line-height:130%;
+  text-decoration:none;
+  font-weight:bold;
+  color:#565656;
+  cursor:pointer;
+}
+button {
+  width:auto;
+  overflow:visible;
+  padding:4px 10px 3px 7px;   /* IE6 */
+}
+button[type] {
+  padding:4px 10px 4px 7px;   /* Firefox */
+  line-height:17px;           /* Safari */
+}
+*:first-child+html button[type] {
+  padding:4px 10px 3px 7px;   /* IE7 */
+}
+button img, a.button img{
+  margin:0 3px -3px 0 !important;
+  padding:0;
+  border:none;
+  width:16px;
+  height:16px;
+  float:none;
+}
+
+
+/* Button colors
+-------------------------------------------------------------- */
+
+/* Standard */
+button:hover, a.button:hover{
+  background-color:#dff4ff;
+  border:1px solid #c2e1ef;
+  color:#336699;
+}
+a.button:active{
+  background-color:#6299c5;
+  border:1px solid #6299c5;
+  color:#fff;
+}
+
+/* Positive */
+body .positive {
+  color:#529214;
+}
+a.positive:hover, button.positive:hover {
+  background-color:#E6EFC2;
+  border:1px solid #C6D880;
+  color:#529214;
+}
+a.positive:active {
+  background-color:#529214;
+  border:1px solid #529214;
+  color:#fff;
+}
+
+/* Negative */
+body .negative {
+  color:#d12f19;
+}
+a.negative:hover, button.negative:hover {
+  background:#fbe3e4;
+  border:1px solid #fbc2c4;
+  color:#d12f19;
+}
+a.negative:active {
+  background-color:#d12f19;
+  border:1px solid #d12f19;
+  color:#fff;
+}

File static/css/blueprint/plugins/buttons/icons/cross.png

Added
New image

File static/css/blueprint/plugins/buttons/icons/key.png

Added
New image

File static/css/blueprint/plugins/buttons/icons/tick.png

Added
New image

File static/css/blueprint/plugins/css-classes/Readme

+CSS Development Classes Plugin
+
+Sets up some classes to use in CSS development
+
+This is an experimental plugin, and the tools it provides
+are not exactly semantically correct, so use with care,
+and preferably only in development. :)
+
+
+Usage
+----------------------------------------------------------------
+
+1) Add this line to "blueprint/screen.css", and you're done:
+	 @import 'plugins/css-classes/css-classes.css';

File static/css/blueprint/plugins/css-classes/css-classes.css

+/* -------------------------------------------------------------- 
+
+   css-classes.css
+   * Classes for CSS development
+   
+   See the Readme file in this directory
+   for further instructions.
+   
+-------------------------------------------------------------- */
+
+.left   { float:left; }
+.right  { float:right; }
+
+.hide   { display:none; }
+
+.reset-margin   { margin:0; } 
+.reset-padding  { padding:0; } 
+.reset          { margin:0; padding:0; } 
+
+.align-justify  { text-align:justify; } 
+.align-left     { text-align:left; } 
+.align-center   { text-align:center; } 
+.align-right    { text-align:right; } 
+

File static/css/blueprint/plugins/fancy-type/Readme

+Fancy Type
+* Gives you classes to use if you'd like some 
+  extra fancy typography. 
+
+Credits and instructions are specified above each class
+in the fancy-type.css file in this directory.
+
+
+Usage
+----------------------------------------------------------------
+
+1) Add this line to "blueprint/screen.css", and you're done:
+	 @import 'plugins/fancy-type/fancy-type-compressed.css';
+
+Note that this uses the compressed version of the CSS file, 
+as the original file contains a lot of instructing comments.
+
+Remember to re-compress (or change) the compressed file 
+if you make any changes to the original CSS file.
+
+Here's a pretty good CSS compressor: 
+http://teenage.cz/acidofil/tools/cssformat.php

File static/css/blueprint/plugins/fancy-type/fancy-type-compressed.css