diff --git a/source/README b/source/README new file mode 100644 index 0000000000000000000000000000000000000000..abe76a60654c51abf6bffdaa2432163c57cca975_c291cmNlL1JFQURNRQ== --- /dev/null +++ b/source/README @@ -0,0 +1,13 @@ +You generate this website by using yatiblog from here: + +http://github.com/tav/ampify/blob/master/environ/startup/yatiblog + +by running + +yatiblog <path to website dir> you'll get a website subdirectory which +contains all necessary stuff to upload and deploy. + +Other required dependencies (argh): + * "genshi" from http://genshi.edgewall.org/ + * "pygments" from "easy_install pygments" + * "yaml" from ... (I give up at that point, as this doesn't compile) diff --git a/source/TODO b/source/TODO new file mode 100644 index 0000000000000000000000000000000000000000..abe76a60654c51abf6bffdaa2432163c57cca975_c291cmNlL1RPRE8= --- /dev/null +++ b/source/TODO @@ -0,0 +1,16 @@ +* drop-down or other menu that allows a one-click access to each + of the pages here + +* svn cp release/1.2.x release/1.2.0 +* svn cp release/1.2.x dist + +* finish the release announcement pypy/doc/release-1.2.0.txt + +* binary tarballs: use pypy/tool/package.py on Linux and Mac OS/X, + make it manually on Windows for now + +* source tarballs: make them manually? + +* move the tarballs to http://codespeak.net/download/pypy/ + +* recompute the html files on codespeak, from dist and from trunk diff --git a/source/_config.yml b/source/_config.yml new file mode 100644 index 0000000000000000000000000000000000000000..abe76a60654c51abf6bffdaa2432163c57cca975_c291cmNlL19jb25maWcueW1s --- /dev/null +++ b/source/_config.yml @@ -0,0 +1,12 @@ +site_author: PyPy Team +site_description: PyPy +site_license: MIT +site_title: PyPy +site_url: http://pypy.org + +analytics_id: UA-90176-26 +section_id: code +typekit: disabled + +index_pages: +- archive.html: archive.genshi diff --git a/source/_layouts/archive.genshi b/source/_layouts/archive.genshi new file mode 100644 index 0000000000000000000000000000000000000000..abe76a60654c51abf6bffdaa2432163c57cca975_c291cmNlL19sYXlvdXRzL2FyY2hpdmUuZ2Vuc2hp --- /dev/null +++ b/source/_layouts/archive.genshi @@ -0,0 +1,34 @@ +--- +layout: site +license: MIT +--- +<div xmlns:py="http://genshi.edgewall.org/"> +<?python + + MONTHS = [ + 'Zero Month', + 'January', 'February', 'March', 'April', 'May', 'June', + 'July', 'August', 'September', 'October', 'November', 'December' + ] + + items = [] + +?> +<div class="section-info" id="all-articles"><strong>Blog Posts Archive</strong></div> +<ul> + <li py:for="item in sorted([item for item in items if item.get('x-created') and not item.get('subtitle')], key=lambda x: x['x-created'], reverse=True)"> + <a id="article-${item['__name__']}" href="${item['__name__']}.html">${Markup(item.get('title') or item['__title__'])}</a> + — + <span py:with="created=item['x-created']">${created[9:11]} ${MONTHS[int(created[6:8])]} ${created[1:5]}</span> + </li> +</ul> + +<br /> + +<div class="section-info" id="all-articles"><strong>Other Articles</strong></div> +<ul> + <li py:for="item in sorted([item for item in items if not(item.get('x-created') and not item.get('subtitle'))], key=lambda x: x['__name__'])"> + <a id="article-${item['__name__']}" href="${item['__name__']}.html">${Markup(item.get('title') or item['__title__'])}</a> + </li> +</ul> +</div> diff --git a/source/_layouts/page.genshi b/source/_layouts/page.genshi new file mode 100644 index 0000000000000000000000000000000000000000..abe76a60654c51abf6bffdaa2432163c57cca975_c291cmNlL19sYXlvdXRzL3BhZ2UuZ2Vuc2hp --- /dev/null +++ b/source/_layouts/page.genshi @@ -0,0 +1,37 @@ +--- +layout: site +license: MIT +--- + +<div xmlns:py="http://genshi.edgewall.org/"> +<div id="main"> +<h1 class="title" py:if="defined('title')">${Markup(title)}</h1> +${Markup(content)} +</div> +<div id="sidebar"> +<ul> + <li> + <div class="sidepic"> + <form action="https://www.paypal.com/cgi-bin/webscr" method="post"> +<input type="hidden" name="cmd" value="_s-xclick"/> +<input type="hidden" name="encrypted" value="-----BEGIN PKCS7-----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-----END PKCS7----- +"/> +<input type="image" src="https://www.paypal.com/en_US/i/btn/btn_donateCC_LG.gif" border="0" name="submit" alt="PayPal - The safer, easier way to pay online!" /> +<img alt="" border="0" src="https://www.paypal.com/en_US/i/scr/pixel.gif" width="1" height="1" /> +</form> + </div> + </li> + <li> + <div class="sidepic"> + <a id="main_download" href="#"></a> + </div> + </li> +</ul> +<py:if test="defined('__by__')"> +<h3>Meta</h3> +<div class="sidebar-text"> +This page was last updated by <a href="mailto:${__by__}">${__by__.split('@')[0] or 'unknown'}</a> on ${__updated__.strftime('%B %d, %Y')} @ <a href="http://github.com/tav/pypy-site/commits/master/${__id__}">${__updated__.strftime('%H:%M')}</a> <a href="http://github.com/tav/ampify/raw/master/LICENSE"><img src="http://static.ampify.it/gfx.public-domain.png" width="20px" height="20px" alt="Public Domain" class="absmiddle" /></a> +</div> +</py:if> +</div> +</div> diff --git a/source/_layouts/site.genshi b/source/_layouts/site.genshi new file mode 100644 index 0000000000000000000000000000000000000000..abe76a60654c51abf6bffdaa2432163c57cca975_c291cmNlL19sYXlvdXRzL3NpdGUuZ2Vuc2hp --- /dev/null +++ b/source/_layouts/site.genshi @@ -0,0 +1,81 @@ +<!DOCTYPE html> +<html xmlns:py="http://genshi.edgewall.org/"> +<?python + + section_data = { + 'code': [ + ('Home', 'index.html'), + ('Download', 'download.html'), + ('Compatibility', 'compat.html'), + ('Performance', 'http://speed.pypy.org'), + ('Dev Site', 'http://codespeak.net/pypy/trunk/pypy/doc/index.html'), + ('Blog', 'http://morepypy.blogspot.com'), + ], + } + + menu_class = {} + + for section in section_data.keys(): + if section == section_id: + menu_class[section] = {'class': 'selected'} + else: + menu_class[section] = {} + +?> +<head> + <title py:if="defined('title')">PyPy :: ${title}</title> + <title py:if="not defined('title')">${site_title}</title> + <meta http-equiv="content-language" content="en" /> + <meta http-equiv="content-type" content="text/html; charset=utf-8" /> + <meta name="author" content="${site_author}" /> + <meta name="description" content="${site_description}" /> + <meta name="copyright" content="${site_license}" /> + <meta name="document-rating" content="general" /> + <link rel="stylesheet" type="text/css" media="screen" title="default" href="css/site.css" /> + <link rel="alternate" type="application/rss+xml" title="RSS Feed for PyPy" href="http://feeds.feedburner.com/PyPyStatusBlog" /> + <py:if test="defined('typekit')"> + <script type="text/javascript" src="http://use.typekit.com/hdt8sni.js"></script> + <script type="text/javascript">try{Typekit.load();}catch(e){}</script> + </py:if> + <script type="text/javascript" src="http://ajax.googleapis.com/ajax/libs/jquery/1.4.2/jquery.min.js"></script> + <script type="text/javascript" src="js/detect.js"></script> +</head> +<body> +<script type="text/javascript"> + var _gaq = [['_setAccount', '${analytics_id}'], ['_trackPageview']]; + if (document.location.protocol !== 'file:') { + (function() { + var ga = document.createElement('script'); ga.type = 'text/javascript'; ga.async = true; + ga.src = ('https:' == document.location.protocol ? 'https://ssl' : 'http://www') + '.google-analytics.com/ga.js'; + (document.getElementsByTagName('head')[0] || document.getElementsByTagName('body')[0]).appendChild(ga); + })(); + } +</script> + +<div id="body-outer"><div id="body-inner"><div id="body" class="clearfix"> + +<div id="header"> + <div id="menu-follow"> + <div><a href="http://search.twitter.com/search?q=%23pypy" title="Follow the conversation on Twitter"><img src="http://static.ampify.it/icon.twitter.gif" alt="Follow the conversation on Twitter" width="14px" height="14px" /></a></div> + <div><a href="http://codespeak.net/svn/pypy/trunk/"><img src="http://svn.apache.org/repos/asf/subversion/trunk/notes/logo/256-colour/subversion_logo_notxt-32.png" width="14px" height="14px"/></a></div> + <div><a href="http://feeds.feedburner.com/PyPyStatusBlog" title="Subscribe to the RSS Feed"><img src="http://static.ampify.it/icon.rss.png" alt="Subscribe to the RSS Feed" width="14px" height="14px" /></a></div> + </div> + <div id="logo"><a href="http://pypy.org"><img src="image/pypy-logo.png" alt="PyPy" width="149px" height="110px" /></a></div> + <!-- + <div id="menu"><ul> + <li><a href="http://dev.ampify.it" py:attrs="menu_class['code']">Code</a></li> + </ul></div> + --> + <hr class="clear-left" /> + <div id="menu-sub" py:with="section_info=section_data[section_id]; last_menu_idx=len(section_info)-1"><py:for each="idx, (menu_item, menu_url) in enumerate(section_info)"><a href="${menu_url}">${menu_item}</a><span py:if="idx != last_menu_idx" class="menu-sub-sep"> | </span></py:for></div> + <hr class="clear" /> +</div> + +<div id="content" py:if="defined('content')"> +${Markup(content)} +</div> + +</div></div></div> + +</body> +</html> diff --git a/source/compat.txt b/source/compat.txt new file mode 100644 index 0000000000000000000000000000000000000000..abe76a60654c51abf6bffdaa2432163c57cca975_c291cmNlL2NvbXBhdC50eHQ= --- /dev/null +++ b/source/compat.txt @@ -0,0 +1,67 @@ +--- +layout: page +title: Python compatibility +--- + +PyPy implements Python language version 2.5. It supports all of the core +language, passing Python test suite (with minor modifications that were +already accepted in main python in newer versions). It supports most +of commonly used Python `standard library modules`_, list below. + +PyPy does not support `CPython C API`_, which means that third party +libraries for python, written in C, will not work. + +Standard library modules supported by PyPy, in alphabetical order: + +* ``__builtin__ __pypy__ _codecs _lsprof _minimal_curses _random _rawffi _socket _sre _weakref bz2 cStringIO crypt errno exceptions fcntl gc itertools marshal math md5 mmap operator parser posix pyexpat select sha signal struct symbol sys termios thread time token unicodedata zipimport zlib`` + +Supported, but written in pure-python: + +* ``array binascii cPickle cmath collections ctypes datetime functools grp md5 pwd pyexpat sha sqlite3 syslog`` + +All modules that are pure python in CPython of course work. + +Python libraries known to work under PyPy (the list is not exhaustive): + +* ctypes + +* django (without any DB but sqlite) + +* twisted (without ssl support) + +* pylons + +* divmod's nevow + +* pyglet + +Known differencies that are not going to be fixed: + +* PyPy does not support refcounting semantics. The code below + won't fill the file immediately, but only after a certain period + of time, when the GC will collect:: + + open("filename", "w").write("stuff") + + The proper fix is:: + + f = open("filename", "w") + f.write("stuff") + f.close() + +* We don't support certain attributes that were decided to be + implementation-dependent. For example ``gc.get_referrers``. ``gc.enable`` + and ``gc.disable`` are supported, but they don't enable and disable GC, + but instead enable and disable running of finalizers. + +* You can't attach a ``__del__`` method to a class after its creation. + +* You can't store non-string keys in type objects. Example:: + + class A(object): + locals()[42] = 3 + + won't work. + +.. _`CPython C API`: http://docs.python.org/c-api/ +.. _`standard library modules`: http://docs.python.org/library/ diff --git a/source/download.txt b/source/download.txt new file mode 100644 index 0000000000000000000000000000000000000000..abe76a60654c51abf6bffdaa2432163c57cca975_c291cmNlL2Rvd25sb2FkLnR4dA== --- /dev/null +++ b/source/download.txt @@ -0,0 +1,197 @@ +--- +layout: page +title: Download and install +--- + +Download +============================================================ + +Here are the various binaries of **PyPy 1.2** that we provide for x86 Linux, +Mac OS/X or Windows. + +* `With a JIT Compiler`_ **(recommended!)** +* `With no JIT Compiler`_ +* `Sandboxed version`_ +* `Stackless version`_ +* `Building from source`_ + +The release 1.2 of PyPy supports **Python version 2.5**. +If you are interested in helping +with 2.6, 2.7 or 3.x features, `contact us`_! + + +.. _`With a JIT Compiler`: + +"JIT Compiler" version +------------------------------- + +These binaries include a Just-in-Time compiler. They only work on +**32-bit** `x86 (IA-32)`_ CPUs that have the SSE2_ instruction set (most of +them do, nowadays), as well as on any `x86-64`_ machine in the 32-bit +compatibility mode. + +* Linux binary +* Mac OS/X binary +* Windows binary (this version is alpha software!) + +If your CPU is really old, it may not have SSE2. In this case, you need +to translate_ yourself with the option ``--jit-backend=x86-without-sse2``. + +If your CPU is a 64-bit machine and you want to translate_ a 32-bit +version of PyPy yourself, `here are hints`_. + +If you want to help us with implementing the 64-bit JIT backend, +`contact us`_! + + +.. _`With no JIT Compiler`: +.. _`no jit version.`: + +"No JIT" version +------------------------------- + +**WARNING!** Unless you really want to try this out, we recommend the JIT +version. + +This version still has a few advantages over the JIT Compiler version. +Notably, for Python programs that require large amounts of memory (at +least a few hundred MBs), the following version of ``pypy-c`` runs them +by requiring generally 1.5x or 2x less memory than CPython. These +binaries work on 32-bit `x86 (IA-32)`_ CPUs as well as `x86-64`_ CPUs +in the 32-bit compatibility mode. + +* Linux binary +* Mac OS/X binary +* Windows binary + +If your CPU is a 64-bit machine and you want to translate_ a 32-bit +version of PyPy yourself, `here are hints`_. + +If you want to help us with finishing the implementation of the native +64-bit version (there are a few known issues, like missing code in +`ctypes`_ to implement calls to C functions), `contact us`_ or +**donate money**! + + +.. _`Sandboxed version`: + +"Sandbox" version +------------------------------- + +A special safe version. Read the docs about sandboxing_. These +binaries work on 32-bit `x86 (IA-32)`_ CPUs as well as `x86-64`_ CPUs +in the 32-bit compatibility mode. + +* Linux binary +* Mac OS/X binary +* Windows binary + +It is also possible to translate_ a version that includes both +sandboxing and the JIT compiler, although as the JIT is relatively +complicated, this reduce a bit the level of confidence we can put in it. + +If your CPU is a 64-bit machine and you want to translate_ a 32-bit +version of PyPy yourself, `here are hints`_. + +The native 64-bit version needs testing and careful reviewing; +`contact us`_! + + +.. _`Stackless version`: + +"Stackless" version +------------------------------- + +Provides Stackless_ extensions, as well as greenlets_. These +binaries work on 32-bit `x86 (IA-32)`_ CPUs as well as `x86-64`_ CPUs +in the 32-bit compatibility mode. + +* Linux binary +* Mac OS/X binary +* Windows binary + +It is not possible right now to combine Stackless features with the JIT. + +If your CPU is a 64-bit machine and you want to translate_ a 32-bit +version of PyPy yourself, `here are hints`_. + +For the native 64-bit version, see the issues of the `no jit version.`_. + + +.. _translate: + +Building from source +------------------------------- + +1. Get the source code. The following packages contain the source at + the same revision as the above binaries: + + * `pypy-1.2.0.tar.bz2`_ (sources, Unix line endings) + * `pypy-1.2.0.zip`_ (sources, Windows line endings) + + Or you can checkout the current trunk using Subversion_ (the trunk + usually works and is of course more up-to-date):: + + svn co http://codespeak.net/svn/pypy/trunk pypy-dist + +2. Enter the ``goal`` directory:: + + cd pypy-dist/pypy/translator/goal + +3. Run the ``translate.py`` script. Here are the common combinations + of options:: + + python translate.py -Ojit # get the JIT version + python translate.py -O2 # get the no-jit version + python translate.py --sandbox # get the sandbox version + python translate.py --stackless # get the stackless version + python translate.py -Ojit --backend=cli # only for branch/cli-jit + +4. Enjoy Mandelbrot ``:-)`` It takes on the order of one hour to + finish the translation, and 1.3 GB of RAM on a 32-bit system. + (Do not start a translation on a machine with 1GB or less!) + + +.. _`here are hints`: + +Note on building a 32-bit version on 64-bit systems ++++++++++++++++++++++++++++++++++++++++++++++++++++ + +To build 32-bit versions of ``pypy-c`` you need to run ``translate.py`` +in a 32-bit version of Python. You can check with:: + + $ python + Python 2.6.2 (...) + >>> import sys + >>> sys.maxint + +This prints 9223372036854775807 in 64-bit versions and 2147483647 in +32-bit versions. + +On Linux, you may have to compile yourself a 32-bit Python, e.g.:: + + cd Python-2.6.4 + CC="gcc -m32" LDFLAGS="-L/lib32 -L/usr/lib32 \ + -L`pwd`/lib32 -Wl,-rpath,/lib32 -Wl,-rpath,/usr/lib32" \ + ./configure + make + # and then use this ./python to run translate.py + +On Mac OS/X: the easiest is to systematically use Python 2.5 when +working with PyPy. Indeed, the standard Python 2.5 runs in 32-bit mode. + +On Windows, I only know about the solution of installing a 32-bit Python +manually. + + +.. _`x86 (IA-32)`: http://en.wikipedia.org/wiki/IA-32 +.. _`x86-64`: http://en.wikipedia.org/wiki/X86-64 +.. _SSE2: http://en.wikipedia.org/wiki/SSE2 +.. _`ctypes`: http://www.python.org/doc/2.5.4/lib/module-ctypes.html +.. _`contact us`: http://codespeak.net/mailman/listinfo/pypy-dev +.. _`sandboxing`: sandbox.html +.. _`stackless`: http://www.stackless.com/ +.. _`greenlets`: http://codespeak.net/svn/greenlet/trunk/doc/greenlet.txt +.. _`pypy-1.2.0.tar.bz2`: binaries/pypy-1.2.0.tar.bz2 +.. _`pypy-1.2.0.zip`: binaries/pypy-1.2.0.zip +.. _Subversion: http://subversion.tigris.org/ diff --git a/source/index.txt b/source/index.txt new file mode 100644 index 0000000000000000000000000000000000000000..abe76a60654c51abf6bffdaa2432163c57cca975_c291cmNlL2luZGV4LnR4dA== --- /dev/null +++ b/source/index.txt @@ -0,0 +1,45 @@ +--- +layout: page +title: PyPy +--- + +PyPy is a `very compliant`_ implementation of the `Python`_ language. +PyPy has several advantages and distinctive features: + + * **Speed:** thanks to its Just-in-Time compiler, Python programs + often run `faster`_ on PyPy. `(What is a JIT compiler?)`_ + + * **Memory usage:** large, memory-hungry Python programs might end up + taking `less space`_ than they do in CPython. + + * **Sandboxing:** PyPy provides the ability to `run untrusted code`_ in a + fully secure way. + + * **Stackless:** PyPy can be configured to run in `stackless`_ mode, + providing micro-threads for massive concurrency. + + * As well as `other features`_. + +.. class:: download + +`Download and try out the PyPy release 1.2!`__ + +.. __: download.html + +To read more about Python, look into `Python docs`_ and check our +Compatibility_ page. PyPy can run such python libraries as `twisted`_ +and `django`_ and supports `ctypes`_. + +.. _`stackless`: http://www.stackless.com/ +.. _`Python`: http://python.org/ +.. _`faster`: http://speed.pypy.org/ +.. _`(What is a JIT compiler?)`: http://en.wikipedia.org/wiki/Just-in-time_compilation +.. _`run untrusted code`: sandbox.html +.. _`very compliant`: compat.html +.. _`Python docs`: http://www.python.org/doc/2.5.4/ +.. _`twisted`: http://twistedmatrix.com/ +.. _`django`: http://www.djangoproject.com/ +.. _`ctypes`: http://www.python.org/doc/2.5.4/lib/module-ctypes.html +.. _`other features`: more.html +.. _`less space`: http://morepypy.blogspot.com/2009/10/gc-improvements.html +.. _Compatibility: compat.html diff --git a/source/more.txt b/source/more.txt new file mode 100644 index 0000000000000000000000000000000000000000..abe76a60654c51abf6bffdaa2432163c57cca975_c291cmNlL21vcmUudHh0 --- /dev/null +++ b/source/more.txt @@ -0,0 +1,31 @@ +--- +layout: page +title: More features +--- + +Other features +=========================================================== + +PyPy has many secondary features and semi-independent +projects. We will mention here: + +* **the .NET backend:** you get a version of ``pypy-c`` that runs + natively in the .NET/CLI VM. Of particular interest is `the cli-jit + branch,`_ in which you can make a version of ``pypy-c`` which also + contains a high-level JIT compiler (it compiles your Python programs + Just in Time into CLR bytecodes, which are in turn compiled natively + by the VM). + +* **the Java backend:** PyPy can run on the Java VM, but more + care is needed to finish this project. Writing a backend for our + high-level JIT compiler would be excellent. `Contact us!`_ + +* **Other languages:** available in a `separate part of the repository`_, + we implemented other languages too: Prolog_ (almost complete), as + well as Smalltalk, JavaScript, Io, Scheme and Gameboy. + + +.. _`the cli-jit branch,`: http://codespeak.net/svn/pypy/branch/cli-jit/ +.. _`contact us!`: http://codespeak.net/mailman/listinfo/pypy-dev +.. _`separate part of the repository`: http://codespeak.net/svn/pypy/lang/ +.. _Prolog: http://codespeak.net/svn/pypy/lang/prolog/trunk diff --git a/source/sandbox.txt b/source/sandbox.txt new file mode 100644 index 0000000000000000000000000000000000000000..abe76a60654c51abf6bffdaa2432163c57cca975_c291cmNlL3NhbmRib3gudHh0 --- /dev/null +++ b/source/sandbox.txt @@ -0,0 +1,19 @@ +--- +layout: page +title: Sandboxing +--- + +PyPy's *sandboxing* is a working prototype for the idea of running untrusted +user programs. Unlike other sandboxing approaches for Python, PyPy's does not +try to limit language features considered "unsafe". Instead we replace all +calls to external libraries (C or platform) with a stub that communicates +with an external process handling the policy. + +To run the sandboxed process, get a `sandboxed pypy-c`_ and run:: + + pypy_interact.py pypy-c-sandbox + +To read more about its features, go to `our dev site`_. + +.. _`sandboxed pypy-c`: download.html#sandbox +.. _`our dev site`: http://codespeak.net/pypy/dist/pypy/doc/sandbox.html diff --git a/source/website/css/site.css b/source/website/css/site.css new file mode 100644 index 0000000000000000000000000000000000000000..abe76a60654c51abf6bffdaa2432163c57cca975_c291cmNlL3dlYnNpdGUvY3NzL3NpdGUuY3Nz --- /dev/null +++ b/source/website/css/site.css @@ -0,0 +1,1352 @@ +/* No Copyright (-) 2010 The Ampify Authors. This file is under the */ +/* Public Domain license that can be found in the root LICENSE file. */ + +/* Element styles */ + +* { + margin: 0; + padding: 0; +} + +html { + height: 100%; +} + +body { + background-color: #efefef; + background-repeat: repeat; + font: 90%/1em 'Lucida Grande', 'Lucida Sans Unicode', Optima, Verdana, sans-serif; + height: 100%; + width: 100%; +} + +a, a:visited, a:hover, a:active, a:hover { + color: blue; + text-decoration: underline; +} + +a:hover { + text-decoration: none; +} + +a.promote-fb, a.promote-fb:active, a.promote-fb:hover, a.promote-fb:visited { + background: url(http://static.ampify.it/gfx.share-facebook-sprite.png) no-repeat; + color: transparent; + display: block; + float: left; + height: 22px; + margin: 0 16px 0 0px; + outline; none; + overflow: hidden; + position: relative; + text-indent: 9999px !important; + top: -2px; + vertical-align: middle; + width: 146px; +} + +a.promote-fb:hover { + background-position: 0 -22px; +} + +a.promote-fb:active { + background-position: 0 -44px; +} + +blockquote, p, dl, h1, h2, h3, h4, h5, h6, ol, ul { + padding-top: 0.5em; + padding-bottom: 0.5em; +} + +code, .literal { + background-color: #f0f0f0; + border: 1px solid #dadada; + padding: 1px 3px; + font-family: Monaco, "DejaVu Sans Mono", "Bitstream Vera Sans Mono", monospace; +} + +dl, ol, ul { + padding-left: 20px; +} + +h1 { + font-size: 2.25em; +} + +h1, h2 { + color: #c32528; + font-family: "museo-1", "museo-2", Verdana; + letter-spacing: 1px; + text-shadow: #eee 2px 2px 3px; +} + +img { + border: 0; +} + +label, input, select, textarea { + cursor: pointer; +} + +pre { + background-color: #fff; + border: 1px solid #cacaca; + color: #101010; + font: 12px/1.4em Monaco, "DejaVu Sans Mono", "Bitstream Vera Sans Mono", monospace; + overflow: auto; + padding: 7px 0 8px 7px; + margin: 10px 30px 0 30px; + -moz-border-radius: 5px; + -webkit-border-radius: 5px; + border-radius: 5px; + -webkit-box-shadow: 0px 0px 7px #cacaca; +} + +pre.ascii-art { + line-height: 1em; + overflow: visible; +} + +pre code { + background-color: transparent; + border: 0; + padding: 0; +} + +select { + max-width: 200px; +} + + +strong { + font-family: Museo, Verdana; + font-size: 1.1em; +} + +table, table.docutils { + border: 0; + border-collapse: collapse; + margin: 0 auto; + text-align: left; +} + +table.docutils { + margin: 5px 40px 10px 30px; +} + +/* +table a { + text-decoration: none; +} +*/ + +th { + border-bottom: 2px solid #808096; + padding: 8px; +} + +table.docutils td { + border-bottom: 1px solid #ccc; + padding: 9px 8px 8px 8px; +} + +ul { + list-style-type: circle; +} + +/* ID styles */ + +#body { + background-color: #fff; + border-radius: 15px; + -webkit-border-radius: 15px; + -moz-border-radius: 15px; + padding: 5px; +} + +#body-inner { + margin: 0 auto; + padding: 10px 20px; + width: 950px; +} + +#body-outer { + height: 100%; +} + +body > #body-outer { + height: auto; + min-height: 100%; +} + +#content { + line-height: 1.55em; +} + +#footer-espians { + margin: 0 auto; + text-align: center; +} + +#footer { + background-color: #161616; + background-image: url(http://static.ampify.it/gfx.footer-background.png); + background-position: top left; + background-repeat: repeat-x; + clear: both; + color: #fff; + height: 50px; + margin-top: -200px; + position: relative; + text-align: center; + width: 100%; +} + +#footer-content { + margin: 0 auto; + padding-top: 15px; + text-align: center; +} + +#header { + width: 100%; + border-bottom: 1px dashed #9e9e9e; + margin-bottom: 10px; +} + +#logo { + float: left; +} + +#main { + float: left; + padding: 10px 30px 0 10px; + width: 630px; + line-height: 2em; + font-size: 0.9em; +} + +#main blockquote { + padding-left: 20px; +} + +#main h1 { + font-size: 1.5em; + padding-top: 20px; + padding-bottom: 0; +} + +#main h1.title { + font-size: 1.8em; + padding-top: 0; + padding-bottom: 10px; +} + +#main p { + padding-top: 10px; +} + +#main pre { + font-size: 14px; + font-family: "inconsolata-1", "inconsolata-2", Monaco, "DejaVu Sans Mono", "Bitstream Vera Sans Mono", monospace; +} + +#main ul, #main ol { + padding-left: 35px; +} + +#main li { + padding-top: 5px; +} + +#sidebar { + float: left; + width: 270px; + font-size: 0.9em; + line-height: 1.6em; +} + +#sidebar a, #sidebar a:hover, #sidebar a:active, #sidebar a:visited { + text-decoration: none; +} + +#sidebar a:hover { + text-decoration: underline; +} + +#sidebar h3 { + text-align: right; + border-bottom: 1px solid #cacaca; + margin-bottom: 10px; +} + +#sidebar ul { + list-style-type: none; + padding: 0; + margin: 0; +} + +#sidebar li { + padding-bottom: 12px; +} + +#sidebar li div, .sidebar-text { + color: #6e6e6e; + font-size: 0.9em; +} + +#table-of-contents { + float: right; + margin: 10px 0 10px 20px; + border: 1px solid #cacaca; +} + +#table-of-contents .topic-title { + display: none; +} + +#table-of-contents ul { + padding: 0 20px 5px 20px; +} + +#main-support-page { + width: 540px; + margin: 0 auto; +} + +#main-support-page pre { + width: 350px; +} + +#menu ul { + list-style-type: none; + padding: 0; +} + +#menu ul li { + background-color: #fff; + float: left; + margin-left: 12px; + text-align: center; +} + +#menu a { + border-top: 2px solid #ccc; + color: #000; + display: block; + font-size: 18px; + padding-top: 6px; + padding-bottom: 8px; + text-decoration: none; +} + +#menu a.selected, #menu a.selected:hover { + background-color: #f6f6f6; + border-top: 2px solid #a9151b; +} + +#menu a:hover { + border-top: 2px solid #969696; +} + +#menu-follow { + float: right; +} + +#menu-follow div { + padding: 0 5px 5px 0; +} + +#menu-lang { + margin: 0 105px 0 20px; + float: left; + text-align: right; + width: 140px; +} + +#menu-lang select { + max-width: 120px; +} + +#menu-lang-form { + display: none; + margin-top: 5px; +} + +#menu-sub { + font-size: 1em; + padding-bottom: 10px; + text-align: center; +} + +.menu-sub-sep { + color: #9f9f9f; + padding: 2px; +} + +#spread-button { + background-color: #ffffff; + border-radius: 5px; + -webkit-border-radius: 5px; + -moz-border-radius: 5px; + padding: 5px; +} + +/* Support site IDs */ + +#help-spread-the-word { + float: left; +} + +/* Class styles */ + +.absmiddle { + vertical-align: middle; +} + +.boxed { + border: 1px solid #cacaca; + -moz-border-radius: 5px; + -webkit-border-radius: 5px; + border-radius: 5px; + -webkit-box-shadow: 0px 0px 7px #cacaca; +} + +.center { + text-align: center; +} + +/* clear utility classes */ + +.clear { + background-color: transparent; + border: 0px solid; + clear: both; + height: 0; + margin: 0; + padding: 0; + width: 0; +} + +.clear-left { + background-color: transparent; + border: 0px solid; + clear: left; + height: 0; + margin: 0; + padding: 0; + width: 0; +} + +.clear-right { + background-color: transparent; + border: 0px solid; + clear: right; + height: 0; + margin: 0; + padding: 0; + width: 0; +} + +/* clearfix */ + +.clearfix:after { + content: "."; + display: block; + height: 0; + clear: both; + visibility: hidden; +} + +.clearfix { + display: inline-block; +} + +/* Hides from IE-mac \*/ +* html .clearfix { + height: 1%; +} +.clearfix { + display: block; +} +/* End hide from IE-mac */ + +/* float utility classes */ + +.float-left { + float: left; + padding-bottom: 7px; + padding-right: 7px; +} + +.float-right { + float: right; + padding-bottom: 7px; + padding-left: 7px; +} + +/* footer classes */ + +.footer-follow { + margin: 0 45px 15px 0; + float: left; +} + +.footer-follow a { + color: #fff; + text-decoration: underline; + font-size: 10px; +} + +.footer-follow a:hover { + text-decoration: none; +} + +.footer-follow div { + white-space: nowrap; +} + +.footer-menu { + float: right; + margin: 17px 50px 0 0; + font-size: 10px; +} + +.footer-menu a { + color: #fff; + padding-left: 5px; + padding-right: 5px; +} + +.footer-text { + text-align: left; +} + +/* quoted blocks with attribution */ + +.quote { + background: transparent url(http://static.ampify.it/gfx.blockquote.gif) no-repeat 0 0; + padding: 6px 12px 0 40px; + color: #575757; + font-size: 22px; + line-height: 28px; +} + +.quote-attribution { + color: #575757; + font-size: 14px; + text-align: right; + padding: 10px 12px 10px 0; +} + +.quote-attribution a, .quote-attribution a:active, .quote-attribution a:visited { + color: #575757; + text-decoration: underline; +} + +.quote-attribution a:hover { + text-decoration: none; +} + +/* Source code syntax highlighting */ + +.syntax .c { color: #919191 } /* Comment */ +.syntax .cm { color: #919191 } /* Comment.Multiline */ +.syntax .cp { color: #919191 } /* Comment.Preproc */ +.syntax .cs { color: #919191 } /* Comment.Special */ +.syntax .c1 { color: #919191 } /* Comment.Single */ + +.syntax .err { color: #a61717; background-color: #e3d2d2 } /* Error */ + +.syntax .g { color: #101010 } /* Generic */ +.syntax .gd { color: #d22323 } /* Generic.Deleted */ +.syntax .ge { color: #101010; font-style: italic } /* Generic.Emph */ +.syntax .gh { color: #101010 } /* Generic.Heading */ +.syntax .gi { color: #589819 } /* Generic.Inserted */ +.syntax .go { color: #6a6a6a } /* Generic.Output */ +.syntax .gp { color: #6a6a6a } /* Generic.Prompt */ +.syntax .gr { color: #d22323 } /* Generic.Error */ +.syntax .gs { color: #101010 } /* Generic.Strong */ +.syntax .gt { color: #d22323 } /* Generic.Traceback */ +.syntax .gu { color: #101010 } /* Generic.Subheading */ + +.syntax .k { color: #c32528 } /* Keyword */ /* espian red */ +.syntax .k { color: #ff5600 } /* Keyword */ /* orangy */ +.syntax .kc { color: #ff5600 } /* Keyword.Constant */ +.syntax .kd { color: #ff5600 } /* Keyword.Declaration */ +.syntax .kd { color: #ff5600 } /* Keyword.Declaration */ +.syntax .kn { color: #ff5600 } /* Keyword */ +.syntax .kp { color: #ff5600 } /* Keyword.Pseudo */ +.syntax .kr { color: #ff5600 } /* Keyword.Reserved */ +.syntax .kt { color: #ff5600 } /* Keyword.Type */ + +.syntax .l { color: #101010 } /* Literal */ +.syntax .ld { color: #101010 } /* Literal.Date */ + +.syntax .m { color: #3677a9 } /* Literal.Number */ /* darkish pastely blue */ +.syntax .m { color: #00a33f } /* Literal.Number */ /* brightish green */ +.syntax .m { color: #1550a2 } /* Literal.Number */ /* darker blue */ +.syntax .m { color: #5d90cd } /* Literal.Number */ /* pastely blue */ +.syntax .mf { color: #5d90cd } /* Literal.Number.Float */ +.syntax .mh { color: #5d90cd } /* Literal.Number.Hex */ +.syntax .mi { color: #5d90cd } /* Literal.Number.Integer */ +.syntax .il { color: #5d90cd } /* Literal.Number.Integer.Long */ +.syntax .mo { color: #5d90cd } /* Literal.Number.Oct */ + +.syntax .bp { color: #a535ae } /* Name.Builtin.Pseudo */ +.syntax .n { color: #101010 } /* Name */ +.syntax .na { color: #bbbbbb } /* Name.Attribute */ +.syntax .nb { color: #bf78cc } /* Name.Builtin */ /* pastely purple */ +.syntax .nb { color: #af956f } /* Name.Builtin */ /* pastely light brown */ +.syntax .nb { color: #a535ae } /* Name.Builtin */ /* brightish pastely purple */ +.syntax .nc { color: #101010 } /* Name.Class */ +.syntax .nd { color: #6d8091 } /* Name.Decorator */ +.syntax .ne { color: #af956f } /* Name.Exception */ +.syntax .nf { color: #3677a9 } /* Name.Function */ +.syntax .nf { color: #1550a2 } /* Name.Function */ +.syntax .ni { color: #101010 } /* Name.Entity */ +.syntax .nl { color: #101010 } /* Name.Label */ +.syntax .nn { color: #101010 } /* Name.Namespace */ +.syntax .nn { color: #101010 } /* Name.Namespace */ +.syntax .no { color: #101010 } /* Name.Constant */ +.syntax .nx { color: #101010 } /* Name.Other */ +.syntax .nt { color: #6d8091 } /* Name.Tag */ +.syntax .nv { color: #101010 } /* Name.Variable */ +.syntax .vc { color: #101010 } /* Name.Variable.Class */ +.syntax .vg { color: #101010 } /* Name.Variable.Global */ +.syntax .vi { color: #101010 } /* Name.Variable.Instance */ +.syntax .py { color: #101010 } /* Name.Property */ + +.syntax .o { color: #ff5600 } /* Operator */ /* orangy */ +.syntax .o { color: #101010 } /* Operator */ +.syntax .ow { color: #101010 } /* Operator.Word */ + +.syntax .p { color: #101010 } /* Punctuation */ + +.syntax .s { color: #dd1144 } /* Literal.String */ /* darkish red */ +.syntax .s { color: #c32528 } /* Literal.String */ /* espian red */ +.syntax .s { color: #39946a } /* Literal.String */ /* pastely greeny */ +.syntax .s { color: #5d90cd } /* Literal.String */ /* pastely blue */ +.syntax .s { color: #00a33f } /* Literal.String */ /* brightish green */ +.syntax .sb { color: #00a33f } /* Literal.String.Backtick */ +.syntax .sc { color: #00a33f } /* Literal.String.Char */ +.syntax .sd { color: #00a33f } /* Literal.String.Doc */ +.syntax .se { color: #00a33f } /* Literal.String.Escape */ +.syntax .sh { color: #00a33f } /* Literal.String.Heredoc */ +.syntax .si { color: #00a33f } /* Literal.String.Interpol */ +.syntax .sr { color: #00a33f } /* Literal.String.Regex */ +.syntax .ss { color: #00a33f } /* Literal.String.Symbol */ +.syntax .sx { color: #00a33f } /* Literal.String.Other */ +.syntax .s1 { color: #00a33f } /* Literal.String.Single */ +.syntax .s2 { color: #00a33f } /* Literal.String.Double */ + +.syntax .w { color: #101010 } /* Text.Whitespace */ +.syntax .x { color: #101010 } /* Other */ + +.syntax.bash .nb { color: #101010 } +.syntax.bash .nv { color: #c32528 } + +.syntax.css .k { color: #606060 } +.syntax.css .nc { color: #c32528 } +.syntax.css .nf { color: #c32528 } +.syntax.css .nt { color: #c32528 } + +.syntax.rst .k { color: #5d90cd } +.syntax.rst .ow { color: #5d90cd } +.syntax.rst .p { color: #5d90cd } + +.syntax.yaml .l-Scalar-Plain { color: #5d90cd } +.syntax.yaml .p-Indicator { color: #101010 } + +/* classes for support pages */ + +.community-section { + margin: 10px auto 10px auto; + width: 500px; +} + +.community-section-heading { + font-size: 1.6em; + margin-top: 10px; +} + +.community-section-heading span { + background-color: #efd7d7; + line-height: 1.7em; +} + +.community-section-text { + line-height: 1.6em; + padding: 10px 0 0 50px; +} + +.support-page-banner { + font-size: 1.2em; + line-height: 1.6em; + margin: 20px 0; +} + +.support-page-banner-text { + background-color: #f0f0f0; +} + +/* classes for the main support page */ + +.promote { + margin: 5px 0 0px 26px; +} + +.promote-retweet { + margin-top: 2px; + float: left; +} + +.promote-yahoo-buzz { + margin: -2px 15px 0 0; + float: left; + padding-bottom: 5px; +} + +.promote-google-buzz, .promote-google-buzz:active, .promote-google-buzz:visited, .promote-google-buzz:hover { + background: url(http://static.ampify.it/icon.google-buzz.png) no-repeat 0 3px; + color: #666; + float: left; + font-size: 0.9em; + font-weight: bold; + margin-top: -2px; + padding: 0 10px 5px 20px; + text-decoration: none; +} + +.promote-google-buzz:hover { + text-decoration: underline; +} + +.share-text { + font-size: 18px; + line-height: 24px; + margin: 0px 0 12px 26px; + color: #aaa; +} + +/* thanks to mashable.com for these wonderful share icons + css!! thanks guys -- you rock!! */ + +ul.share-buttons { + line-height: normal; + margin: 12px 0 0 24px; + padding: 0; +} + +.share-buttons li { + display: inline; + float: left; + list-style-type: none; + margin: 0 18px 12px 0; + padding-top: 1px; +} + +.share-buttons a { + background: url(http://static.ampify.it/gfx.mashable-syndication.gif) no-repeat; + color: #575757; + display: block; + font-size: 7px; + height: 14px; + overflow: hidden; + padding: 33px 0 0; + text-align: center; + text-decoration: none; + white-space: nowrap; + width: 46px; +} + +.share-buttons a:hover { + text-decoration:none; +} + +.share-buttons .delicious a { + background-position: -138px 0; +} + +.share-buttons .delicious a:hover { + background-position: -138px -47px; +} + +.share-buttons .digg a { + background-position: 0 0; +} + +.share-buttons .digg a:hover { + background-position: 0 -47px; +} + +.share-buttons .facebook a { + background-position: -184px 0; +} + +.share-buttons .facebook a:hover { + background-position: -184px -47px; +} + +.share-buttons .google a { + background-position: -276px 0; +} + +.share-buttons .google a:hover { + background-position: -276px -47px; +} + +.share-buttons .myspace a { + background-position: -230px 0; +} + +.share-buttons .myspace a:hover { + background-position: -230px -47px; +} + +.share-buttons .reddit a { + background-position: -414px 0; +} + +.share-buttons .reddit a:hover { + background-position: -414px -47px; +} + +.share-buttons .sharethis a { + background-position: -460px 0; +} + +.share-buttons .sharethis a:hover { + background-position: -460px -47px; +} + +.share-buttons .stumbleupon a { + background-position: -92px 0; +} + +.share-buttons .stumbleupon a:hover { + background-position: -92px -47px; +} + +.share-buttons .technorati a { + background-position: -322px 0; +} + +.share-buttons .technorati a:hover { + background-position: -322px -47px; +} + +.share-buttons .twitter a { + background-position: -46px 0; +} + +.share-buttons .twitter a:hover { + background-position: -46px -47px; +} + +.share-buttons .yahoo a { + background-position: -368px 0; +} + +.share-buttons .yahoo a:hover { + background-position: -368px -47px; +} + +/* Unsorted */ + +.columns { + max-width: 940px; + width: 940px; +} + +.column, .column-last { + float: left; + /* + height: 180px; + */ + padding: 0 10px 0 0; + position: relative; + width: 227px; +} + +.column-last { + padding: 0 0 0 0; +} + +.column-text { + font-size: 12px; + line-height: 18px; + margin: 10px 0 20px 15px; +} + +.column-footer { + background-image: url(bottom.gif); + background-repeat: no-repeat; + background-color: transparent; +/* + background-attachment: scroll; + */ +} + +.column-left { + border-right: 0px solid #f00; + float: left; + width: 455px; +} + +.column-left-text { + font-size: 12px; + line-height: 18px; + margin-left: 12px; +} + +.column-right { + float: right; + width: 485px; +} + +.follow { + display: block; + list-style-type: none; + margin: 12px 0px 0px 24px; + padding: 0px; + text-align: center; +} + +.follow li { + float: left; + display: block; + margin-right: 30px; + margin-bottom: 18px; +} + +.follow a { + color: #575757; + display: block; + font-size: 10px; + margin-top: 7px; + text-decoration: underline; + text-decoration: none; + font-weight: bold; +} + +.follow a:hover { + text-decoration: none; +} + +.get-left { + float: left; + width: 230px; + margin-right: 12px; + font-weight: bold; +} + +.get-right { + float: right; + width: 230px; + margin-right: 12px; + font-weight: bold; +} + +.get-item { + border: 1px solid #ccc; + border-radius: 15px; + -webkit-border-radius: 15px; + -moz-border-radius: 15px; + margin-top: 10px; + font-weight: normal; + margin: 12px 0 12px 0; + padding: 10px; +} + +.get-item img { + float: left; + margin-right: 5px; + padding-top: 3px; + vertical-align: middle; +} + +.headline { + margin-bottom: 10px; + text-align: center; + line-height: 36px; +} + +.headline-text { + background-color: #f0f0f0; + font-size: 20px; +} + +.headline-text-small { + background-color: #f0f0f0; + font-size: 20px; +} + +.lede { + background-color: #dfdfdf; +} + +.link { + font-size: 16px; +} + +.oneoff { + margin: 12px 12px 12px 0; + font-size: 14px; + line-height: 20px; + border-top: 1px solid #ccc; + border-bottom: 1px solid #ccc; + padding: 12px 0 12px 0; +} + +.optional { + color: #666; + font-size: 9px; + vertical-align: super; +} + +/* other */ + +#callout { + background-color: #fff; + margin-bottom: 10px; +/* + border-bottom-left-radius: 15px; + border-bottom-right-radius: 15px; + -moz-border-radius-bottomleft: 15px; + -moz-border-radius-bottomright: 15px; + -webkit-border-bottom-left-radius: 15px; + -webkit-border-bottom-right-radius: 15px; +*/ + padding: 10px; +} + +#feature { + float: right; +} + +#supporter-form { + font-size: 14px; + line-height: 26px; + margin: 8px 0 0 0; + padding-top: 5px; +} + +#supporter-form td { + padding-top: 10px; + vertical-align: top; +} + +#supporter-form .label { + text-align: right; + width: 205px; + padding-right: 10px; + padding-left: 10px; + font-size: 12px; + font-weight: bold; + white-space: nowrap; +} + +.input-item input, .input-item textarea { + /* thanks soundcloud! */ + background-image: url(http://static.ampify.it/gfx.button-repeat.png); + background-position: 0 -1200px; + background-repeat: repeat-x; + border: 1px solid #ccc; + border-radius: 5px; + -webkit-border-radius: 5px; + -moz-border-radius: 5px; + color: #333; + font-size: 20px; + max-width: 220px; + padding: 3px 0 3px 3px; + width: 220px; +} + +.input-item select { + font-size: 16px; +} + +.male { + border: 2px solid #70b1e6; + background-color: #eaf3fb; +} + +.male .label { + color: #70b1e6; +} + +.female { + border: 2px solid #ed6aa4; + background-color: #fee5f5; +} + +.female .label { + color: #ed6aa4; +} + +#supporter-submit { + text-align: center; + padding: 0 0 15px 0; +} + +#support { + font-size: 20px; + margin-bottom: 15px; + margin-top: 5px; +} + +.male-counter { + color: #70b1e6; + font-size: 12px; + margin-bottom: -50px; + white-space: nowrap; +} + +.female-counter { + color: #ed6aa4; + font-size: 12px; + padding-left: 24px; + margin-bottom: -50px; + white-space: nowrap; +} + + +.tav-thanks { + font-size: 14px; + line-height: 26px; + margin: 12px 12px 12px 0; + color: #575757; + color: #000; + font-style: italic; +} + +.tav-thanks img { + float: right; + margin-left: 12px; +} + +.tav-thanks div { + text-align: right; + font-size: 12px; + line-height: 20px; + margin-top: 12px; +} +/* +.tav-thanks a { + color: #000; + text-decoration: underline; +} + +.tav-thanks a:hover { + text-decoration: none; +} +*/ + +.the-disqus-section { + margin: 12px 12px 12px 0; + min-height: 500px; +} + +.the-disqus-section h3 { + margin-top: 10px; + margin-bottom: 12px; + font-size: 20px; +} + +.action-items { + font-size: 14px; + line-height: 26px; + margin: 10px 24px; 20px 24px; +} + +.action-left { + float: left; + margin-right: 20px; +} + +.action-link { + margin-top: 20px; +} + +.action-text { + margin-top: 20px; +} + +/* plan file related css */ + +a.button { + background: transparent url('http://static.ampify.it/gfx.bg-button-a.gif') no-repeat scroll top right; + color: #444; + display: block; + float: left; + font: normal 12px arial, sans-serif; + height: 24px; + margin-right: 6px; + padding-right: 18px; /* sliding doors padding */ + text-decoration: none; +} + +a.button span { + background: transparent url('http://static.ampify.it/gfx.bg-button-span.gif') no-repeat; + display: block; + line-height: 14px; + padding: 5px 0 5px 18px; +} + +a.button:active { + background-position: bottom right; + color: #000; + outline: none; /* hide dotted outline in Firefox */ +} + +a.button:active span { + background-position: bottom left; + padding: 6px 0 4px 18px; /* push text down 1px */ +} + +a.buttondown { + background: transparent url('http://static.ampify.it/gfx.bg-button-a.gif') no-repeat scroll top right; + color: #444; + display: block; + float: left; + font: normal 12px arial, sans-serif; + height: 24px; + margin-right: 6px; + padding-right: 18px; /* sliding doors padding */ + text-decoration: none; + background-position: bottom right; + color: #000; + outline: none; /* hide dotted outline in Firefox */ +} + +a.buttondown span { + background: transparent url('http://static.ampify.it/gfx.bg-button-span.gif') no-repeat; + display: block; + line-height: 14px; + padding: 5px 0 5px 18px; + background-position: bottom left; + padding: 6px 0 4px 18px; /* push text down 1px */ +} + +.tag-segment { + text-align: right; +} + +.tag-segment span { + color: #fff; + padding: 0.5em; + font-size: 0.7em; +} + +.tag-link { + text-decoration: none; + color: #000; +} + +.tag { + background-color: #696969; +} + +.tag-val-done { + background-color: #007f16; + background-color: #00782d; + background-color: #006400; +} + +.tag-val-needsreview { + background-color: #a4ff00; + color: #000 !important; +} + +.tag-val-inreview { + background-color: #3056bf; +} + +.tag-val-todo { + background-color: #a60c00; + background-color: #d0006e; + background-color: #8B0000; +} + +.tag-val-wip { + background-color: #a66e00; + background-color: #ff550f; +} + +.tag-type-1 { +} + +.tag-type-2 { /* #hashtags */ + background-color: #2a4580; + background-color: #696969; +} + +.tag-type-dep { + display: none; +} + +.tag-type-milestone { + background-color: #00008B; + background-color: #06276f; + background-color: #a4ff00; /* nice colour! */ + /* color: #000 !important; */ + background-color: #002ca6; + background-color: #3056bf; + background-color: #898989; +} + +.tag-type-priority { + background-color: #481254; +} + +.tag-type-zuser { + background-color: #4573d5; + background-color: #696969; +} + +#plan-tags a, #site-tags a { + margin-bottom: 0.7em; +} + +#plan-container { + margin-top: 1.2em; + margin-bottom: 2.4em; +} + +.plan-help { + font-size: 0.9em; + font-weight: bold; + text-align: right; + margin-bottom: 1.4em; +} + +.container { + padding-left: 20px; +} + +.container blockquote { + padding: 0 0 0 30px; +} + +.container > p:first-child { + font-weight: bold; + font-family: "museo-1", "museo-2", Verdana; + padding-bottom: 0; +} + +.sidepic { + padding-top: 50px; + text-align: center; +} + +a#main_download { + -moz-border-radius: 10px; + -webkit-border-radius: 10px; + border-radius: 5px; + margin-left: 10%; + margin-right: 10%; + padding: 5px; + display: block; + color: white; + background-color: #0b0; +} \ No newline at end of file diff --git a/source/website/image/header-background.png b/source/website/image/header-background.png new file mode 100644 index 0000000000000000000000000000000000000000..fd1fbf805101c6387d906c30f75b59b552ff23cd GIT binary patch literal 421 zc$@*H0b2fvP)<h;3K|Lk000e1NJLTq00062005B)0ssI2W+wig00009a7bBm000XU z000XU0RWnu7ytkPS4l)cR45fyl8Ft3Fbo8fh#Kg>Fls=eg51nHaFCPE_}K@CzVCZ$ zZM4=6y-yy-<hix2S1}1av(BV(OG}(50bJ*piO(cc!-tt742zmcF~JSPv=?+0^|JId z7CmM0M;Udifjem?wdQd>5~wN534nhT_+L1Sp#km?xQBW!JpmM_ll<hxK=xvmv!RZu z^bB~Qm*yCA$goU&-*2;;HK^e}AC~^!{6~n%MW*b+CFE7$w8($1QP;j$CWE7AR-D9m z_>W}JA`i2K%8P(BYfFsCyzXc%tDN!b4tC-9yGN)1l8$VLe9UmJ3$W#+_UiLsv2XL< ztt_e=^PQz=<~Jc{_NbSYxz@YKn3EaQ;ABmbiK9Wx=Ii<?<TmA0AbY`EnXspnxb$L5 zSyGG21}4t4!t2}RmRu2#r&sX1=qm2sm*tyn*LBHrp66faJ8~-=$HB-C+CVMEGy56z P00000NkvXXu0mjf;Zw$K diff --git a/source/website/image/pypy-logo.png b/source/website/image/pypy-logo.png new file mode 100644 index 0000000000000000000000000000000000000000..e330518199f344cc3847f06623723655c5b5341a GIT binary patch literal 7265 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 diff --git a/source/website/js/detect.js b/source/website/js/detect.js new file mode 100644 index 0000000000000000000000000000000000000000..abe76a60654c51abf6bffdaa2432163c57cca975_c291cmNlL3dlYnNpdGUvanMvZGV0ZWN0Lmpz --- /dev/null +++ b/source/website/js/detect.js @@ -0,0 +1,18 @@ + +$(document).ready(function() { + var download_url, download_text; + if (navigator.platform.indexOf('Linux') != -1) { + download_url = 'download/pypy-1.2.tar.bz2'; + download_text = 'Download linux i386 bin'; + } else if (navigator.platform.indexOf('Windows') != -1) { + download_url = 'download/pypy-1.2-win32.zip'; + download_text = 'Download Windows i386 bin'; + } else if (navigator.platform.indexOf('Mac') != 1) { + download_url = 'download/pypy-1.2-mac.tar.bz2'; + downloat_text = 'Download Mac OS X 10.6 bin'; + } else { + return; + } + $("#main_download").attr('href', download_url); + $("#main_download").text(download_text); +});