Просмотр исходного кода

Converted some files to unix endlines

Rafał Pitoń 12 лет назад
Родитель
Сommit
cd83707001
55 измененных файлов с 6645 добавлено и 6645 удалено
  1. 205 205
      .gitignore
  2. 6 6
      .travis.yml
  3. 125 125
      README.md
  4. 14 14
      cron.txt
  5. 178 178
      deployment/settings.py
  6. 9 9
      deployment/urls.py
  7. 28 28
      deployment/wsgi.py
  8. 87 87
      heartbeat.py
  9. 10 10
      manage.py
  10. 13 13
      requirements.txt
  11. 91 91
      static/admin/css/admin.less
  12. 62 62
      static/admin/css/admin/alerts.less
  13. 65 65
      static/admin/css/admin/avatars.less
  14. 102 102
      static/admin/css/admin/buttons.less
  15. 105 105
      static/admin/css/admin/forms.less
  16. 28 28
      static/admin/css/admin/graphs.less
  17. 171 171
      static/admin/css/admin/navbar.less
  18. 74 74
      static/admin/css/admin/navs.less
  19. 32 32
      static/admin/css/admin/popovers.less
  20. 94 94
      static/admin/css/admin/scaffolding.less
  21. 183 183
      static/admin/css/admin/tables.less
  22. 54 54
      static/admin/css/admin/users-lists.less
  23. 15 15
      static/admin/css/admin/wells.less
  24. 64 64
      static/admin/js/admin.js
  25. 97 97
      static/cranefly/css/cranefly.less
  26. 41 41
      static/cranefly/css/cranefly/alerts.less
  27. 32 32
      static/cranefly/css/cranefly/breadcrumbs.less
  28. 164 164
      static/cranefly/css/cranefly/buttons.less
  29. 259 259
      static/cranefly/css/cranefly/category.less
  30. 132 132
      static/cranefly/css/cranefly/changelog.less
  31. 70 70
      static/cranefly/css/cranefly/editor.less
  32. 55 55
      static/cranefly/css/cranefly/error.less
  33. 109 109
      static/cranefly/css/cranefly/forms.less
  34. 565 565
      static/cranefly/css/cranefly/forum.less
  35. 165 165
      static/cranefly/css/cranefly/forummap.less
  36. 170 170
      static/cranefly/css/cranefly/header.less
  37. 443 443
      static/cranefly/css/cranefly/index.less
  38. 44 44
      static/cranefly/css/cranefly/karmas.less
  39. 156 156
      static/cranefly/css/cranefly/markdown.less
  40. 43 43
      static/cranefly/css/cranefly/messages.less
  41. 486 486
      static/cranefly/css/cranefly/navbar.less
  42. 46 46
      static/cranefly/css/cranefly/newsfeed.less
  43. 46 46
      static/cranefly/css/cranefly/pagination.less
  44. 128 128
      static/cranefly/css/cranefly/profiles.less
  45. 78 78
      static/cranefly/css/cranefly/report.less
  46. 53 53
      static/cranefly/css/cranefly/reports.less
  47. 69 69
      static/cranefly/css/cranefly/scaffolding.less
  48. 105 105
      static/cranefly/css/cranefly/search.less
  49. 21 21
      static/cranefly/css/cranefly/signin.less
  50. 621 621
      static/cranefly/css/cranefly/thread.less
  51. 118 118
      static/cranefly/css/cranefly/usercp.less
  52. 30 30
      static/cranefly/css/cranefly/watchedthreads.less
  53. 50 50
      static/cranefly/css/ranks.less
  54. 232 232
      static/cranefly/js/cranefly.js
  55. 202 202
      static/cranefly/js/editor.js

+ 205 - 205
.gitignore

@@ -1,205 +1,205 @@
-
-#################
-## Eclipse
-#################
-
-*.pydevproject
-.project
-.metadata
-bin/**
-tmp/**
-tmp/**/*
-*.tmp
-*.bak
-*.swp
-*~.nib
-local.properties
-.classpath
-.settings/
-.loadpath
-
-# External tool builders
-.externalToolBuilders/
-
-# Locally stored "Eclipse launch configurations"
-*.launch
-
-# CDT-specific
-.cproject
-
-# PDT-specific
-.buildpath
-
-
-#################
-## Visual Studio
-#################
-
-## Ignore Visual Studio temporary files, build results, and
-## files generated by popular Visual Studio add-ons.
-
-# User-specific files
-*.suo
-*.user
-*.sln.docstates
-
-# Build results
-**/[Dd]ebug/
-**/[Rr]elease/
-*_i.c
-*_p.c
-*.ilk
-*.meta
-*.obj
-*.pch
-*.pdb
-*.pgc
-*.pgd
-*.rsp
-*.sbr
-*.tlb
-*.tli
-*.tlh
-*.tmp
-*.vspscc
-.builds
-**/*.dotCover
-
-## TODO: If you have NuGet Package Restore enabled, uncomment this
-#**/packages/ 
-
-# Visual C++ cache files
-ipch/
-*.aps
-*.ncb
-*.opensdf
-*.sdf
-
-# Visual Studio profiler
-*.psess
-*.vsp
-
-# ReSharper is a .NET coding add-in
-_ReSharper*
-
-# Installshield output folder 
-[Ee]xpress
-
-# DocProject is a documentation generator add-in
-DocProject/buildhelp/
-DocProject/Help/*.HxT
-DocProject/Help/*.HxC
-DocProject/Help/*.hhc
-DocProject/Help/*.hhk
-DocProject/Help/*.hhp
-DocProject/Help/Html2
-DocProject/Help/html
-
-# Click-Once directory
-publish
-
-# Others
-[Bb]in
-[Oo]bj
-sql
-TestResults
-*.Cache
-ClientBin
-stylecop.*
-~$*
-*.dbmdl
-Generated_Code #added for RIA/Silverlight projects
-
-# Backup & report files from converting an old project file to a newer
-# Visual Studio version. Backup files are not needed, because we have git ;-)
-_UpgradeReport_Files/
-Backup*/
-UpgradeLog*.XML
-
-
-
-############
-## Windows
-############
-
-# Windows image file caches
-Thumbs.db 
-
-# Folder config file
-Desktop.ini
-Github for Windows Log.lnk
-
-
-#############
-## Python
-#############
-
-*.py[co]
-
-# Packages
-*.egg
-*.egg-info
-dist
-build
-eggs
-parts
-bin
-var
-sdist
-develop-eggs
-.installed.cfg
-
-# Installer logs
-pip-log.txt
-
-# Unit test / coverage reports
-.coverage
-.tox
-
-#Mr Developer
-.mr.developer.cfg
-
-# Mac crap
-.DS_Store
-
-
-##################
-## 3rd Party Libs
-##################
-
-
-coffin/**
-debug_toolbar/**
-dev/**
-django/**
-haystack/**
-jinja2/**
-markdown/**
-mptt/**
-pytz/**
-recaptcha/**
-south/**
-whoosh/**
-custom/**
-searchindex/**
-static/avatars/protoss
-static/avatars/terran
-static/avatars/zerg
-static/avatars/_thumbs
-static/avatars/custom
-static/avatars/custom.gif
-unidecode/**
-yaml/**
-dev-manage.py
-path.py
-!templates/debug_toolbar/panels/acl.html
-static/emojis/**
-templates/debug_toolbar/**
-
-
-############
-## Vagrant
-############
-
-.vagrant
-database.db
+
+#################
+## Eclipse
+#################
+
+*.pydevproject
+.project
+.metadata
+bin/**
+tmp/**
+tmp/**/*
+*.tmp
+*.bak
+*.swp
+*~.nib
+local.properties
+.classpath
+.settings/
+.loadpath
+
+# External tool builders
+.externalToolBuilders/
+
+# Locally stored "Eclipse launch configurations"
+*.launch
+
+# CDT-specific
+.cproject
+
+# PDT-specific
+.buildpath
+
+
+#################
+## Visual Studio
+#################
+
+## Ignore Visual Studio temporary files, build results, and
+## files generated by popular Visual Studio add-ons.
+
+# User-specific files
+*.suo
+*.user
+*.sln.docstates
+
+# Build results
+**/[Dd]ebug/
+**/[Rr]elease/
+*_i.c
+*_p.c
+*.ilk
+*.meta
+*.obj
+*.pch
+*.pdb
+*.pgc
+*.pgd
+*.rsp
+*.sbr
+*.tlb
+*.tli
+*.tlh
+*.tmp
+*.vspscc
+.builds
+**/*.dotCover
+
+## TODO: If you have NuGet Package Restore enabled, uncomment this
+#**/packages/ 
+
+# Visual C++ cache files
+ipch/
+*.aps
+*.ncb
+*.opensdf
+*.sdf
+
+# Visual Studio profiler
+*.psess
+*.vsp
+
+# ReSharper is a .NET coding add-in
+_ReSharper*
+
+# Installshield output folder 
+[Ee]xpress
+
+# DocProject is a documentation generator add-in
+DocProject/buildhelp/
+DocProject/Help/*.HxT
+DocProject/Help/*.HxC
+DocProject/Help/*.hhc
+DocProject/Help/*.hhk
+DocProject/Help/*.hhp
+DocProject/Help/Html2
+DocProject/Help/html
+
+# Click-Once directory
+publish
+
+# Others
+[Bb]in
+[Oo]bj
+sql
+TestResults
+*.Cache
+ClientBin
+stylecop.*
+~$*
+*.dbmdl
+Generated_Code #added for RIA/Silverlight projects
+
+# Backup & report files from converting an old project file to a newer
+# Visual Studio version. Backup files are not needed, because we have git ;-)
+_UpgradeReport_Files/
+Backup*/
+UpgradeLog*.XML
+
+
+
+############
+## Windows
+############
+
+# Windows image file caches
+Thumbs.db 
+
+# Folder config file
+Desktop.ini
+Github for Windows Log.lnk
+
+
+#############
+## Python
+#############
+
+*.py[co]
+
+# Packages
+*.egg
+*.egg-info
+dist
+build
+eggs
+parts
+bin
+var
+sdist
+develop-eggs
+.installed.cfg
+
+# Installer logs
+pip-log.txt
+
+# Unit test / coverage reports
+.coverage
+.tox
+
+#Mr Developer
+.mr.developer.cfg
+
+# Mac crap
+.DS_Store
+
+
+##################
+## 3rd Party Libs
+##################
+
+
+coffin/**
+debug_toolbar/**
+dev/**
+django/**
+haystack/**
+jinja2/**
+markdown/**
+mptt/**
+pytz/**
+recaptcha/**
+south/**
+whoosh/**
+custom/**
+searchindex/**
+static/avatars/protoss
+static/avatars/terran
+static/avatars/zerg
+static/avatars/_thumbs
+static/avatars/custom
+static/avatars/custom.gif
+unidecode/**
+yaml/**
+dev-manage.py
+path.py
+!templates/debug_toolbar/panels/acl.html
+static/emojis/**
+templates/debug_toolbar/**
+
+
+############
+## Vagrant
+############
+
+.vagrant
+database.db

+ 6 - 6
.travis.yml

@@ -1,7 +1,7 @@
-language: python
-python:
-  - "2.7"
-# command to install dependencies
-install: "pip install -r requirements.txt --use-mirrors"
-# command to run tests
+language: python
+python:
+  - "2.7"
+# command to install dependencies
+install: "pip install -r requirements.txt --use-mirrors"
+# command to run tests
 script: python manage.py test

+ 125 - 125
README.md

@@ -1,125 +1,125 @@
-# Misago [![Build Status](https://travis-ci.org/rafalp/Misago.png?branch=master)](https://travis-ci.org/rafalp/Misago)
-
-Misago is an internet forum application written in Python and using Django as its foundation. Visit the project homepage for discussion and a live demo: <http://misago-project.org>
-
-> #### Notice!
->
-> __Misago is not yet production ready! Don't ever use it in anything thats anywhere close to a production enviroment!__
-
-The Tao AKA Mission Statement
------------------------------
-
-My vision is software focused on enabling a smooth flow of information between forum members. I don't want to build a "Facebook CMS" that contains lots of extra functionality like user galleries, blogs or user walls. Posting and replying in threads is the only focus of Misago with additional features implemented to improve the experience for forum users and staff.
-
-The secondary goal is making Misago a viable foundation for building and maintaining long-term discussion forums for administrators. Misago trades "casual admin" friendliness for advanced features aimed for use by web developers looking for a tool to build forums for their site.
-
-Finally, while Misago is built using Django, it's not a "Django application" and it won't integrate with existing Django projects. This is the result of a design decision to use custom users/session/auth/permissions functionality instead of native Django applications - however, in the future Misago will provide a web API allowing you to add Misago-powered features to your website and/or application.
-
-
-Dependencies
-------------
-
-* [Django](http://djangoproject.com)
-* [Django Debug Toolbar](https://github.com/django-debug-toolbar/django-debug-toolbar)
-* [Django-MPTT](https://github.com/django-mptt/django-mptt)
-* [Coffin](https://github.com/coffin/coffin)
-* [Django Haystack 2](http://haystacksearch.org/)
-* [Jinja2](https://github.com/mitsuhiko/jinja2)
-* [Markdown](http://pypi.python.org/pypi/Markdown)
-* [path](http://pypi.python.org/pypi/path.py)
-* [Pillow](http://pypi.python.org/pypi/Pillow/)
-* [pyTZ](http://pypi.python.org/pypi/pytz/2012h)
-* [reCAPTCHA-client](http://pypi.python.org/pypi/recaptcha-client)
-* [South](http://south.aeracode.org)
-* [Unidecode](http://pypi.python.org/pypi/Unidecode)
-
-You will also need search engine to provide search functionality. If you don't have one, [Whoosh 2](https://pypi.python.org/pypi/Whoosh/) is pure Python search engine that's easy to setup.
-
-Installation
-------------
-
-### Vagrant setup
-
-Misago comes with a Puppet-provisioned Vagrant-setup that you can use to get Misago up and running in a development environment with just a couple of commands. The first thing you want to do is clone Misago:
-
-```sh
-git clone git://github.com/rafalp/Misago.git
-```
-
-The next step is to boot up the VM and provision it:
-
-```sh
-cd Misago && vagrant up
-```
-
-You might want to grab a coffee while Puppet works its magic as the process usually takes ~5 minutes. When the VM is booted and Puppet is done provisioning, ssh into the VM and start the Django development server:
-
-```sh
-vagrant ssh
-cd /vagrant
-sudo python manage.py runserver 192.168.33.10:80 # Private network address as per the Vagrant config
-```
-
-Now navigate to [192.168.33.10](http://192.168.33.10) in your browser of choice to find your forums all set up and ready for testing and development. Puppet will have taken care of bootstrapping your Misago installation with a database, some dummy content and an admin user with the following credentials:
-
-__Username__: Admin  
-__Email__: admin@example.com  
-__Password__: password
-
-Be aware that the defualt configuration doesn't contain anything besides the bare-minimum for Misago to run - this meaning that things like an SMTP server will have to added manually if you wish to test Misago's email features.
-
-### Manual setup
-
-If you'd like to test Misago in a more production-ish environment instead of the Vagrant development environment, you're free to do so. The very first thing that needs to be done is ensure you have all the dependencies installed, most of which can be installed through `pip`.
-
-Misago comes with the "deployment" Python module that contains an empty Misago configuration and a default Django WSGI container for you to use in your deployments. On top of this you can then add an HTTP and/or HTTP Proxy server - Gunicorn and Nginx would be a good mix.
-
-After you set low-level configuration of Misago ([`deployment/settings.py`](deployment/settings.py)), fire the following commands on manage.py through the Python executable:
-
-* `startmisago [--quiet]`  
-  Creates the DB structure for Misago and populates it with default data
-* `adduser [--admin] <username> <email> <password>`  
-  Adds a new user to the database.  
-  Make sure to do something like `adduser Admin admin@example.com password --admin` to add an admin user when you first setup your forums.
-
-Misago stands on shoulders of Django and Django documentation covers deployment of apps extensively: https://docs.djangoproject.com/en/dev/howto/deployment/
-
-Don't forget to set up maintenance cronjobs to keep your database clean. You can look into [cron.txt](cron.txt) file to see what cronjobs to set up.
-
-While Misago will run without a cache set up, you are strongly encouraged to set one up for it. Even if you choose not to run one, you will still need to set a default one (such as dummy caching).
-
-
-Updating
---------
-
-You can use the `updatemisago` command to update your forums database to latest version _unless_ you are updating from `0.1` which is incompatibile with `0.2` and later releases.
-
-Support for migrations from `0.1` has been dropped with `0.3` release.
-
-
-Contributing
-------------
-
-Misago is an open source project. You are free to submit pull requests against the master branch and use the issue tracker to report bugs as well as propose improvements and/or new features.
-
-Finally, you can participate in discussion on the [project forums](http://misago-project.org). Your feedback means much to the project so please do share your thoughts!
-
-
-Authors
--------
-
-**Rafał Pitoń**
-
-+ http://rpiton.com
-+ http://github.com/ralfp
-+ https://twitter.com/RafalPiton
-
-
-Copyright and license
----------------------
-
-> __Misago__ - Copyright © 2013 [Rafał Pitoń](http://github.com/ralfp)  
-> This program comes with ABSOLUTELY NO WARRANTY.  
-> This is free software and you are welcome to redistribute it under the conditions described in the license.
->
-> For the complete license, refer to [LICENSE.md](LICENSE.md)
+# Misago [![Build Status](https://travis-ci.org/rafalp/Misago.png?branch=master)](https://travis-ci.org/rafalp/Misago)
+
+Misago is an internet forum application written in Python and using Django as its foundation. Visit the project homepage for discussion and a live demo: <http://misago-project.org>
+
+> #### Notice!
+>
+> __Misago is not yet production ready! Don't ever use it in anything thats anywhere close to a production enviroment!__
+
+The Tao AKA Mission Statement
+-----------------------------
+
+My vision is software focused on enabling a smooth flow of information between forum members. I don't want to build a "Facebook CMS" that contains lots of extra functionality like user galleries, blogs or user walls. Posting and replying in threads is the only focus of Misago with additional features implemented to improve the experience for forum users and staff.
+
+The secondary goal is making Misago a viable foundation for building and maintaining long-term discussion forums for administrators. Misago trades "casual admin" friendliness for advanced features aimed for use by web developers looking for a tool to build forums for their site.
+
+Finally, while Misago is built using Django, it's not a "Django application" and it won't integrate with existing Django projects. This is the result of a design decision to use custom users/session/auth/permissions functionality instead of native Django applications - however, in the future Misago will provide a web API allowing you to add Misago-powered features to your website and/or application.
+
+
+Dependencies
+------------
+
+* [Django](http://djangoproject.com)
+* [Django Debug Toolbar](https://github.com/django-debug-toolbar/django-debug-toolbar)
+* [Django-MPTT](https://github.com/django-mptt/django-mptt)
+* [Coffin](https://github.com/coffin/coffin)
+* [Django Haystack 2](http://haystacksearch.org/)
+* [Jinja2](https://github.com/mitsuhiko/jinja2)
+* [Markdown](http://pypi.python.org/pypi/Markdown)
+* [path](http://pypi.python.org/pypi/path.py)
+* [Pillow](http://pypi.python.org/pypi/Pillow/)
+* [pyTZ](http://pypi.python.org/pypi/pytz/2012h)
+* [reCAPTCHA-client](http://pypi.python.org/pypi/recaptcha-client)
+* [South](http://south.aeracode.org)
+* [Unidecode](http://pypi.python.org/pypi/Unidecode)
+
+You will also need search engine to provide search functionality. If you don't have one, [Whoosh 2](https://pypi.python.org/pypi/Whoosh/) is pure Python search engine that's easy to setup.
+
+Installation
+------------
+
+### Vagrant setup
+
+Misago comes with a Puppet-provisioned Vagrant-setup that you can use to get Misago up and running in a development environment with just a couple of commands. The first thing you want to do is clone Misago:
+
+```sh
+git clone git://github.com/rafalp/Misago.git
+```
+
+The next step is to boot up the VM and provision it:
+
+```sh
+cd Misago && vagrant up
+```
+
+You might want to grab a coffee while Puppet works its magic as the process usually takes ~5 minutes. When the VM is booted and Puppet is done provisioning, ssh into the VM and start the Django development server:
+
+```sh
+vagrant ssh
+cd /vagrant
+sudo python manage.py runserver 192.168.33.10:80 # Private network address as per the Vagrant config
+```
+
+Now navigate to [192.168.33.10](http://192.168.33.10) in your browser of choice to find your forums all set up and ready for testing and development. Puppet will have taken care of bootstrapping your Misago installation with a database, some dummy content and an admin user with the following credentials:
+
+__Username__: Admin  
+__Email__: admin@example.com  
+__Password__: password
+
+Be aware that the defualt configuration doesn't contain anything besides the bare-minimum for Misago to run - this meaning that things like an SMTP server will have to added manually if you wish to test Misago's email features.
+
+### Manual setup
+
+If you'd like to test Misago in a more production-ish environment instead of the Vagrant development environment, you're free to do so. The very first thing that needs to be done is ensure you have all the dependencies installed, most of which can be installed through `pip`.
+
+Misago comes with the "deployment" Python module that contains an empty Misago configuration and a default Django WSGI container for you to use in your deployments. On top of this you can then add an HTTP and/or HTTP Proxy server - Gunicorn and Nginx would be a good mix.
+
+After you set low-level configuration of Misago ([`deployment/settings.py`](deployment/settings.py)), fire the following commands on manage.py through the Python executable:
+
+* `startmisago [--quiet]`  
+  Creates the DB structure for Misago and populates it with default data
+* `adduser [--admin] <username> <email> <password>`  
+  Adds a new user to the database.  
+  Make sure to do something like `adduser Admin admin@example.com password --admin` to add an admin user when you first setup your forums.
+
+Misago stands on shoulders of Django and Django documentation covers deployment of apps extensively: https://docs.djangoproject.com/en/dev/howto/deployment/
+
+Don't forget to set up maintenance cronjobs to keep your database clean. You can look into [cron.txt](cron.txt) file to see what cronjobs to set up.
+
+While Misago will run without a cache set up, you are strongly encouraged to set one up for it. Even if you choose not to run one, you will still need to set a default one (such as dummy caching).
+
+
+Updating
+--------
+
+You can use the `updatemisago` command to update your forums database to latest version _unless_ you are updating from `0.1` which is incompatibile with `0.2` and later releases.
+
+Support for migrations from `0.1` has been dropped with `0.3` release.
+
+
+Contributing
+------------
+
+Misago is an open source project. You are free to submit pull requests against the master branch and use the issue tracker to report bugs as well as propose improvements and/or new features.
+
+Finally, you can participate in discussion on the [project forums](http://misago-project.org). Your feedback means much to the project so please do share your thoughts!
+
+
+Authors
+-------
+
+**Rafał Pitoń**
+
++ http://rpiton.com
++ http://github.com/ralfp
++ https://twitter.com/RafalPiton
+
+
+Copyright and license
+---------------------
+
+> __Misago__ - Copyright © 2013 [Rafał Pitoń](http://github.com/ralfp)  
+> This program comes with ABSOLUTELY NO WARRANTY.  
+> This is free software and you are welcome to redistribute it under the conditions described in the license.
+>
+> For the complete license, refer to [LICENSE.md](LICENSE.md)

+ 14 - 14
cron.txt

@@ -1,14 +1,14 @@
-0 3 * * * python $HOME/misago/manage.py clearalerts
-0 3 * * * python $HOME/misago/manage.py clearattempts
-0 */4 * * * python $HOME/misago/manage.py clearsessions
-20 3 * * * python $HOME/misago/manage.py cleartokens
-15 3 * * * python $HOME/misago/manage.py cleartracker
-0 0 * * 0 python $HOME/misago/manage.py forcepdssync
-0 3 * * * python $HOME/misago/manage.py pruneforums
-5 3 * * * python $HOME/misago/manage.py syncdeltas
-10 3 * * * python $HOME/misago/manage.py updateranking
-25 3 * * * python $HOME/misago/manage.py updatethreadranking
-*/30 * * * * python $HOME/misago/manage.py countreports
-* */2 * * * python $HOME/misago/manage.py update_index --age=2
-# Uncomment next line for heartbeat cron
-#*/3 * * * * python $HOME/misago/heartbeat.py deployment.settings --log=heartbeats.txt
+0 3 * * * python $HOME/misago/manage.py clearalerts
+0 3 * * * python $HOME/misago/manage.py clearattempts
+0 */4 * * * python $HOME/misago/manage.py clearsessions
+20 3 * * * python $HOME/misago/manage.py cleartokens
+15 3 * * * python $HOME/misago/manage.py cleartracker
+0 0 * * 0 python $HOME/misago/manage.py forcepdssync
+0 3 * * * python $HOME/misago/manage.py pruneforums
+5 3 * * * python $HOME/misago/manage.py syncdeltas
+10 3 * * * python $HOME/misago/manage.py updateranking
+25 3 * * * python $HOME/misago/manage.py updatethreadranking
+*/30 * * * * python $HOME/misago/manage.py countreports
+* */2 * * * python $HOME/misago/manage.py update_index --age=2
+# Uncomment next line for heartbeat cron
+#*/3 * * * * python $HOME/misago/heartbeat.py deployment.settings --log=heartbeats.txt

+ 178 - 178
deployment/settings.py

@@ -1,178 +1,178 @@
-import sys
-from misago.settings_base import *
-
-# Allow debug?
-DEBUG = True
-TEMPLATE_DEBUG = DEBUG
-
-# Board address
-BOARD_ADDRESS = 'http://somewhere.com'
-
-# Admin control panel path
-# Leave this setting empty or remove it to turn admin panel off.
-# Misago always asserts that it has correct admin path and fixes it
-# if neccessary. This means "/admincp////" becomes "admincp/" and
-# "administration" becomes "administration/"
-ADMIN_PATH = 'admincp'
-
-# System admins
-# Enter every admin using following pattern:
-# ('John', 'john@example.com'),
-# Note trailing separator!
-ADMINS = ()
-
-# Secret key is used by Django and Misago in hashes generation
-# YOU MUST REPLACE IT with random combination of characters
-# NEVER EVER SHARE THIS KEY WITH ANYBODY!
-# Make it messed up and long, this is example of good secret key:
-# yaobeifl1a6hf&3)^uc#^vlu1ud7xp^+*c5zoq*tf)fvs#*o$#
-SECRET_KEY = 'secret-key'
-
-# Database connection
-DATABASES = {
-    'default': {
-        'ENGINE': 'django.db.backends.sqlite3', # Can be either 'postgresql_psycopg2', 'mysql', 'sqlite3' or 'oracle'.
-        'NAME': 'database.db', # Name of the database or the path to the database file if using sqlite3.
-        'USER': '', # Not used with sqlite3.
-        'PASSWORD': '', # Not used with sqlite3.
-        'HOST': '', # Set to empty string for localhost. Not used with sqlite3.
-        'PORT': '', # Set to empty string for default. Not used with sqlite3.
-    }
-}
-
-# Cache engine
-# Misago is EXTREMELY data hungry
-# If you don't set any cache, it will BRUTALISE your database and memory
-# In production ALWAYS use cache
-# For reference read following document:
-# https://docs.djangoproject.com/en/dev/topics/cache/
-CACHES = {
-    'default': {
-        'BACKEND': 'django.core.cache.backends.dummy.DummyCache',
-    }
-}
-
-# Search engine
-# Misago relies on 3rd party search engines to index and search your forum content
-# Read following for information on configurating search:
-# http://django-haystack.readthedocs.org/en/latest/tutorial.html#modify-your-settings-py
-HAYSTACK_CONNECTIONS = {
-    'default': {
-        'ENGINE': 'haystack.backends.whoosh_backend.WhooshEngine', # Misago uses Whoosh by default
-        'PATH': 'searchindex',
-    },
-}
-
-# Cookies configuration
-COOKIES_DOMAIN = '192.168.33.10' # E.g. a cookie domain for "www.mysite.com" or "forum.mysite.com" is ".mysite.com"
-COOKIES_PATH = '/'
-COOKIES_PREFIX = '' # Allows you to avoid cookies collisions with other applications.
-COOKIES_SECURE = False # Set this to true if, AND ONLY IF, you are using SSL on your forum.
-
-# Sessions configuration
-SESSION_LIFETIME = 3600 # Number of seconds since last request after which session is marked as expired.
-
-# Local time zone for this installation. Choices can be found here:
-# http://en.wikipedia.org/wiki/List_of_tz_zones_by_name
-# although not all choices may be available on all operating systems.
-# On Unix systems, a value of None will cause Django to use the same
-# timezone as the operating system.
-# If running in a Windows environment this must be set to the same as your
-# system time zone.
-TIME_ZONE = 'UTC'
-
-# Language code for this installation. All choices can be found here:
-# http://www.i18nguy.com/unicode/language-identifiers.html
-LANGUAGE_CODE = 'en_US'
-
-# Absolute filesystem path to the directory that will hold user-uploaded files.
-# Always use forward slashes, even on Windows.
-# Example: "/home/media/media.lawrence.com/media/"
-MEDIA_ROOT = '/vagrant/media/'
-
-# URL that handles the media served from MEDIA_ROOT. Make sure to use a
-# trailing slash.
-# Examples: "http://media.lawrence.com/media/", "http://example.com/media/"
-MEDIA_URL = '/media/'
-
-# Absolute path to the directory static files should be collected to.
-# Don't put anything in this directory yourself; store your static files
-# Always use forward slashes, even on Windows.
-# in apps' "static/" subdirectories and in STATICFILES_DIRS.
-# Example: "/home/media/media.lawrence.com/static/"
-STATIC_ROOT = ''
-
-# URL prefix for static files.
-# Example: "http://media.lawrence.com/static/"
-STATIC_URL = '/static/'
-
-# Additional locations of static files
-STATICFILES_DIRS = (
-    # Put strings here, like "/home/html/static" or "C:/www/django/static".
-    # Always use forward slashes, even on Windows.
-    # Don't forget to use absolute paths, not relative paths.
-    # Make sure directory containing avatars is located under first directory on list
-    '/vagrant/static/',
-)
-
-# E-mail host
-EMAIL_HOST = ''
-
-# E-mail port
-EMAIL_PORT = 25
-
-# E-mail host user
-EMAIL_HOST_USER = ''
-
-# E-mail host password
-EMAIL_HOST_PASSWORD = ''
-
-# Use TLS encryption
-EMAIL_USE_TLS = False
-
-# E-mail subject prefix added to emails for staff
-EMAIL_SUBJECT_PREFIX = '[Misago]'
-
-# Catch-all e-mail address
-# If DEBUG_MODE is on, all emails will be sent to this address instead of real recipient.
-CATCH_ALL_EMAIL_ADDRESS = ''
-
-# Directories with templates
-TEMPLATE_DIRS = (
-    # Put strings here, like "/home/html/django_templates" or "C:/www/django/templates".
-    # Always use forward slashes, even on Windows.
-    # Don't forget to use absolute paths, not relative paths.
-    '/vagrant/templates'
-)
-
-# List of installed themes
-INSTALLED_THEMES = (
-    'cranefly', # Default style always first
-    'admin', # Admin theme always last
-)
-
-# Enable mobile subdomain for mobile stuff
-MOBILE_SUBDOMAIN = ''
-
-# Templates used by mobile version
-MOBILE_TEMPLATES = ''
-
-# Name of root urls configuration
-ROOT_URLCONF = 'deployment.urls'
-
-# Python dotted path to the WSGI application used by Django's runserver.
-WSGI_APPLICATION = 'deployment.wsgi.application'
-
-# Empty secret key if its known
-if SECRET_KEY == 'yaobeifl1a6hf&3)^uc#^vlu1ud7xp^+*c5zoq*tf)fvs#*o$#':
-    SECRET_KEY = ''
-
-# Override config if we are in tests
-if 'test' in sys.argv:
-    if not SECRET_KEY:
-        SECRET_KEY = 'SECRET4TESTS'
-    DATABASES['default'] = {'ENGINE': 'django.db.backends.sqlite3', 'NAME': 'db4testing'}
-    CACHES['default'] = {'BACKEND': 'django.core.cache.backends.dummy.DummyCache'}
-    SKIP_SOUTH_TESTS = True
-    MEDIA_URL = "http://media.domain.com/"
-    HAYSTACK_CONNECTIONS = {'default': {'ENGINE': 'haystack.backends.simple_backend.SimpleEngine',},}
+import sys
+from misago.settings_base import *
+
+# Allow debug?
+DEBUG = True
+TEMPLATE_DEBUG = DEBUG
+
+# Board address
+BOARD_ADDRESS = 'http://somewhere.com'
+
+# Admin control panel path
+# Leave this setting empty or remove it to turn admin panel off.
+# Misago always asserts that it has correct admin path and fixes it
+# if neccessary. This means "/admincp////" becomes "admincp/" and
+# "administration" becomes "administration/"
+ADMIN_PATH = 'admincp'
+
+# System admins
+# Enter every admin using following pattern:
+# ('John', 'john@example.com'),
+# Note trailing separator!
+ADMINS = ()
+
+# Secret key is used by Django and Misago in hashes generation
+# YOU MUST REPLACE IT with random combination of characters
+# NEVER EVER SHARE THIS KEY WITH ANYBODY!
+# Make it messed up and long, this is example of good secret key:
+# yaobeifl1a6hf&3)^uc#^vlu1ud7xp^+*c5zoq*tf)fvs#*o$#
+SECRET_KEY = 'secret-key'
+
+# Database connection
+DATABASES = {
+    'default': {
+        'ENGINE': 'django.db.backends.sqlite3', # Can be either 'postgresql_psycopg2', 'mysql', 'sqlite3' or 'oracle'.
+        'NAME': 'database.db', # Name of the database or the path to the database file if using sqlite3.
+        'USER': '', # Not used with sqlite3.
+        'PASSWORD': '', # Not used with sqlite3.
+        'HOST': '', # Set to empty string for localhost. Not used with sqlite3.
+        'PORT': '', # Set to empty string for default. Not used with sqlite3.
+    }
+}
+
+# Cache engine
+# Misago is EXTREMELY data hungry
+# If you don't set any cache, it will BRUTALISE your database and memory
+# In production ALWAYS use cache
+# For reference read following document:
+# https://docs.djangoproject.com/en/dev/topics/cache/
+CACHES = {
+    'default': {
+        'BACKEND': 'django.core.cache.backends.dummy.DummyCache',
+    }
+}
+
+# Search engine
+# Misago relies on 3rd party search engines to index and search your forum content
+# Read following for information on configurating search:
+# http://django-haystack.readthedocs.org/en/latest/tutorial.html#modify-your-settings-py
+HAYSTACK_CONNECTIONS = {
+    'default': {
+        'ENGINE': 'haystack.backends.whoosh_backend.WhooshEngine', # Misago uses Whoosh by default
+        'PATH': 'searchindex',
+    },
+}
+
+# Cookies configuration
+COOKIES_DOMAIN = '192.168.33.10' # E.g. a cookie domain for "www.mysite.com" or "forum.mysite.com" is ".mysite.com"
+COOKIES_PATH = '/'
+COOKIES_PREFIX = '' # Allows you to avoid cookies collisions with other applications.
+COOKIES_SECURE = False # Set this to true if, AND ONLY IF, you are using SSL on your forum.
+
+# Sessions configuration
+SESSION_LIFETIME = 3600 # Number of seconds since last request after which session is marked as expired.
+
+# Local time zone for this installation. Choices can be found here:
+# http://en.wikipedia.org/wiki/List_of_tz_zones_by_name
+# although not all choices may be available on all operating systems.
+# On Unix systems, a value of None will cause Django to use the same
+# timezone as the operating system.
+# If running in a Windows environment this must be set to the same as your
+# system time zone.
+TIME_ZONE = 'UTC'
+
+# Language code for this installation. All choices can be found here:
+# http://www.i18nguy.com/unicode/language-identifiers.html
+LANGUAGE_CODE = 'en_US'
+
+# Absolute filesystem path to the directory that will hold user-uploaded files.
+# Always use forward slashes, even on Windows.
+# Example: "/home/media/media.lawrence.com/media/"
+MEDIA_ROOT = '/vagrant/media/'
+
+# URL that handles the media served from MEDIA_ROOT. Make sure to use a
+# trailing slash.
+# Examples: "http://media.lawrence.com/media/", "http://example.com/media/"
+MEDIA_URL = '/media/'
+
+# Absolute path to the directory static files should be collected to.
+# Don't put anything in this directory yourself; store your static files
+# Always use forward slashes, even on Windows.
+# in apps' "static/" subdirectories and in STATICFILES_DIRS.
+# Example: "/home/media/media.lawrence.com/static/"
+STATIC_ROOT = ''
+
+# URL prefix for static files.
+# Example: "http://media.lawrence.com/static/"
+STATIC_URL = '/static/'
+
+# Additional locations of static files
+STATICFILES_DIRS = (
+    # Put strings here, like "/home/html/static" or "C:/www/django/static".
+    # Always use forward slashes, even on Windows.
+    # Don't forget to use absolute paths, not relative paths.
+    # Make sure directory containing avatars is located under first directory on list
+    '/vagrant/static/',
+)
+
+# E-mail host
+EMAIL_HOST = ''
+
+# E-mail port
+EMAIL_PORT = 25
+
+# E-mail host user
+EMAIL_HOST_USER = ''
+
+# E-mail host password
+EMAIL_HOST_PASSWORD = ''
+
+# Use TLS encryption
+EMAIL_USE_TLS = False
+
+# E-mail subject prefix added to emails for staff
+EMAIL_SUBJECT_PREFIX = '[Misago]'
+
+# Catch-all e-mail address
+# If DEBUG_MODE is on, all emails will be sent to this address instead of real recipient.
+CATCH_ALL_EMAIL_ADDRESS = ''
+
+# Directories with templates
+TEMPLATE_DIRS = (
+    # Put strings here, like "/home/html/django_templates" or "C:/www/django/templates".
+    # Always use forward slashes, even on Windows.
+    # Don't forget to use absolute paths, not relative paths.
+    '/vagrant/templates'
+)
+
+# List of installed themes
+INSTALLED_THEMES = (
+    'cranefly', # Default style always first
+    'admin', # Admin theme always last
+)
+
+# Enable mobile subdomain for mobile stuff
+MOBILE_SUBDOMAIN = ''
+
+# Templates used by mobile version
+MOBILE_TEMPLATES = ''
+
+# Name of root urls configuration
+ROOT_URLCONF = 'deployment.urls'
+
+# Python dotted path to the WSGI application used by Django's runserver.
+WSGI_APPLICATION = 'deployment.wsgi.application'
+
+# Empty secret key if its known
+if SECRET_KEY == 'yaobeifl1a6hf&3)^uc#^vlu1ud7xp^+*c5zoq*tf)fvs#*o$#':
+    SECRET_KEY = ''
+
+# Override config if we are in tests
+if 'test' in sys.argv:
+    if not SECRET_KEY:
+        SECRET_KEY = 'SECRET4TESTS'
+    DATABASES['default'] = {'ENGINE': 'django.db.backends.sqlite3', 'NAME': 'db4testing'}
+    CACHES['default'] = {'BACKEND': 'django.core.cache.backends.dummy.DummyCache'}
+    SKIP_SOUTH_TESTS = True
+    MEDIA_URL = "http://media.domain.com/"
+    HAYSTACK_CONNECTIONS = {'default': {'ENGINE': 'haystack.backends.simple_backend.SimpleEngine',},}

+ 9 - 9
deployment/urls.py

@@ -1,9 +1,9 @@
-from misago.urls import *
-
-# Your deployment urls configuration
-# This configuration already contains Misago urls configuration
-# If you want to add 3rd party apps urls to your Misago deployment
-# Uncomment bottom lines and use them to register custom url's
-# urlpatterns += patterns('',
-#    (r'^', include('somewhere.urls')),
-#)
+from misago.urls import *
+
+# Your deployment urls configuration
+# This configuration already contains Misago urls configuration
+# If you want to add 3rd party apps urls to your Misago deployment
+# Uncomment bottom lines and use them to register custom url's
+# urlpatterns += patterns('',
+#    (r'^', include('somewhere.urls')),
+#)

+ 28 - 28
deployment/wsgi.py

@@ -1,28 +1,28 @@
-"""
-WSGI config for Misago project.
-
-This module contains the WSGI application used by Django's development server
-and any production WSGI deployments. It should expose a module-level variable
-named ``application``. Django's ``runserver`` and ``runfcgi`` commands discover
-this application via the ``WSGI_APPLICATION`` setting.
-
-Usually you will have the standard Django WSGI application here, but it also
-might make sense to replace the whole Django WSGI application with a custom one
-that later delegates to the Django one. For example, you could introduce WSGI
-middleware here, or combine a Django application with an application of another
-framework.
-
-"""
-import os
-
-os.environ.setdefault("DJANGO_SETTINGS_MODULE", "deployment.settings")
-
-# This application object is used by any WSGI server configured to use this
-# file. This includes Django's development server, if the WSGI_APPLICATION
-# setting points here.
-from django.core.wsgi import get_wsgi_application
-application = get_wsgi_application()
-
-# Apply WSGI middleware here.
-# from helloworld.wsgi import HelloWorldApplication
-# application = HelloWorldApplication(application)
+"""
+WSGI config for Misago project.
+
+This module contains the WSGI application used by Django's development server
+and any production WSGI deployments. It should expose a module-level variable
+named ``application``. Django's ``runserver`` and ``runfcgi`` commands discover
+this application via the ``WSGI_APPLICATION`` setting.
+
+Usually you will have the standard Django WSGI application here, but it also
+might make sense to replace the whole Django WSGI application with a custom one
+that later delegates to the Django one. For example, you could introduce WSGI
+middleware here, or combine a Django application with an application of another
+framework.
+
+"""
+import os
+
+os.environ.setdefault("DJANGO_SETTINGS_MODULE", "deployment.settings")
+
+# This application object is used by any WSGI server configured to use this
+# file. This includes Django's development server, if the WSGI_APPLICATION
+# setting points here.
+from django.core.wsgi import get_wsgi_application
+application = get_wsgi_application()
+
+# Apply WSGI middleware here.
+# from helloworld.wsgi import HelloWorldApplication
+# application = HelloWorldApplication(application)

+ 87 - 87
heartbeat.py

@@ -1,87 +1,87 @@
-#!/usr/bin/python
-import os, sys
-import urllib2
-from time import gmtime, strftime, time
-try:
-    from argparse import OptionParser
-except ImportError:
-    from optparse import OptionParser
-
-
-def log_entry(logfile, response=None):
-    if response and response.getcode() == 200:
-        if response.time > 1:
-            stopwatch = '%ss' % round(response.time, 3)
-        else:
-            stopwatch = '%sms' % int(response.time * 1000)
-        msg = 'OK! HTTP 200 after %s' % stopwatch
-    else:
-        msg = 'FAIL!'
-
-    print msg
-
-    if logfile:
-        lf = open(logfile, 'a+')
-        lf.write('%s: ' % strftime("%a, %d %b %Y %X GMT", gmtime()))
-        lf.write('%s\n' % msg)
-        lf.close()
-
-
-def heartbeat():
-    # Change chdir to current file loation, then add it to pythonpath
-    sys.path.insert(0, os.path.dirname(os.path.abspath(__file__)))
-    os.chdir(os.path.dirname(os.path.abspath(__file__)))
-
-    # Parse options
-    parser = OptionParser()
-    parser.add_option("--timeout", dest="timeout", default=60, type="int",
-                      help="Number of seconds after which heartbeat timeouts.")
-    parser.add_option("--path", dest="pypath",
-                      help="Add extra entry to python-path.")
-    parser.add_option("--log", dest="logfile",
-                      help="Log responses to file.", metavar="FILE")
-
-    (options, argv) = parser.parse_args(sys.argv)
-
-    # Set extra pythonpath?
-    if options.pypath:
-        sys.path.insert(0, options.pypath)
-
-    # Validate timeout
-    if options.timeout < 5 or options.timeout > 300:
-        raise ValueError("Timeout cannot be lower than 5 seconds and greater than 5 minutes (300 seconds).")
-
-    try:
-        # Read Misago settings
-        settings = __import__(argv[1]).settings
-        BOARD_ADDRESS = settings.BOARD_ADDRESS
-        HEARTBEAT_PATH = settings.HEARTBEAT_PATH
-
-        # Validate
-        if not BOARD_ADDRESS:
-            raise ValueError('"BOARD_ADDRESS" setting is not set.')
-        if not HEARTBEAT_PATH:
-            raise ValueError('"HEARTBEAT_PATH" setting is not set.')
-
-        request_url = '%s/%s' % (BOARD_ADDRESS, HEARTBEAT_PATH)
-
-        # Send and handle request
-        try:
-            stopwatch = time()
-            response = urllib2.urlopen(request_url, timeout=options.timeout)
-            body = response.read()
-            response.close()
-            response.time = time() - stopwatch
-            log_entry(options.logfile, response)
-        except urllib2.URLError:
-            log_entry(options.logfile)
-    except IndexError:
-        raise ValueError("You have to specify name of Misago's settings module used by your forum.")
-    except ImportError:
-        raise ValueError('"%s" could not be imported.' % argv[1])
-    except AttributeError as e:
-        raise ValueError('"%s" is not correct settings module.' % argv[1])
-
-
-if __name__ == '__main__':
-    heartbeat()
+#!/usr/bin/python
+import os, sys
+import urllib2
+from time import gmtime, strftime, time
+try:
+    from argparse import OptionParser
+except ImportError:
+    from optparse import OptionParser
+
+
+def log_entry(logfile, response=None):
+    if response and response.getcode() == 200:
+        if response.time > 1:
+            stopwatch = '%ss' % round(response.time, 3)
+        else:
+            stopwatch = '%sms' % int(response.time * 1000)
+        msg = 'OK! HTTP 200 after %s' % stopwatch
+    else:
+        msg = 'FAIL!'
+
+    print msg
+
+    if logfile:
+        lf = open(logfile, 'a+')
+        lf.write('%s: ' % strftime("%a, %d %b %Y %X GMT", gmtime()))
+        lf.write('%s\n' % msg)
+        lf.close()
+
+
+def heartbeat():
+    # Change chdir to current file loation, then add it to pythonpath
+    sys.path.insert(0, os.path.dirname(os.path.abspath(__file__)))
+    os.chdir(os.path.dirname(os.path.abspath(__file__)))
+
+    # Parse options
+    parser = OptionParser()
+    parser.add_option("--timeout", dest="timeout", default=60, type="int",
+                      help="Number of seconds after which heartbeat timeouts.")
+    parser.add_option("--path", dest="pypath",
+                      help="Add extra entry to python-path.")
+    parser.add_option("--log", dest="logfile",
+                      help="Log responses to file.", metavar="FILE")
+
+    (options, argv) = parser.parse_args(sys.argv)
+
+    # Set extra pythonpath?
+    if options.pypath:
+        sys.path.insert(0, options.pypath)
+
+    # Validate timeout
+    if options.timeout < 5 or options.timeout > 300:
+        raise ValueError("Timeout cannot be lower than 5 seconds and greater than 5 minutes (300 seconds).")
+
+    try:
+        # Read Misago settings
+        settings = __import__(argv[1]).settings
+        BOARD_ADDRESS = settings.BOARD_ADDRESS
+        HEARTBEAT_PATH = settings.HEARTBEAT_PATH
+
+        # Validate
+        if not BOARD_ADDRESS:
+            raise ValueError('"BOARD_ADDRESS" setting is not set.')
+        if not HEARTBEAT_PATH:
+            raise ValueError('"HEARTBEAT_PATH" setting is not set.')
+
+        request_url = '%s/%s' % (BOARD_ADDRESS, HEARTBEAT_PATH)
+
+        # Send and handle request
+        try:
+            stopwatch = time()
+            response = urllib2.urlopen(request_url, timeout=options.timeout)
+            body = response.read()
+            response.close()
+            response.time = time() - stopwatch
+            log_entry(options.logfile, response)
+        except urllib2.URLError:
+            log_entry(options.logfile)
+    except IndexError:
+        raise ValueError("You have to specify name of Misago's settings module used by your forum.")
+    except ImportError:
+        raise ValueError('"%s" could not be imported.' % argv[1])
+    except AttributeError as e:
+        raise ValueError('"%s" is not correct settings module.' % argv[1])
+
+
+if __name__ == '__main__':
+    heartbeat()

+ 10 - 10
manage.py

@@ -1,10 +1,10 @@
-#!/usr/bin/env python
-import os
-import sys
-
-if __name__ == "__main__":
-    os.environ.setdefault("DJANGO_SETTINGS_MODULE", "deployment.settings")
-
-    from django.core.management import execute_from_command_line
-
-    execute_from_command_line(sys.argv)
+#!/usr/bin/env python
+import os
+import sys
+
+if __name__ == "__main__":
+    os.environ.setdefault("DJANGO_SETTINGS_MODULE", "deployment.settings")
+
+    from django.core.management import execute_from_command_line
+
+    execute_from_command_line(sys.argv)

+ 13 - 13
requirements.txt

@@ -1,14 +1,14 @@
-django
-django-debug-toolbar
-django-haystack
-django-mptt
-coffin
-jinja2
-markdown
-path.py
-Pillow
-pytz
-recaptcha-client
-South
-Unidecode
+django
+django-debug-toolbar
+django-haystack
+django-mptt
+coffin
+jinja2
+markdown
+path.py
+Pillow
+pytz
+recaptcha-client
+South
+Unidecode
 whoosh<2.5

+ 91 - 91
static/admin/css/admin.less

@@ -1,92 +1,92 @@
-/*!
- * Bootstrap v2.1.0
- *
- * Copyright 2012 Twitter, Inc
- * Licensed under the Apache License v2.0
- * http://www.apache.org/licenses/LICENSE-2.0
- *
- * Designed and built with all the love in the world @twitter by @mdo and @fat.
- */
-
-// CSS Reset
-@import "bootstrap/reset.less";
-
-// Core variables and mixins
-@import "variables.less";
-@import "bootstrap/mixins.less";
-
-// Grid system and page structure
-@import "bootstrap/scaffolding.less";
-@import "bootstrap/grid.less";
-@import "bootstrap/layouts.less";
-
-// Base CSS
-@import "bootstrap/type.less";
-@import "bootstrap/code.less";
-@import "bootstrap/forms.less";
-@import "bootstrap/tables.less";
-
-// Components: common
-@import "bootstrap/sprites.less";
-@import "bootstrap/dropdowns.less";
-@import "bootstrap/wells.less";
-@import "bootstrap/component-animations.less";
-@import "bootstrap/close.less";
-
-// Components: Buttons & Alerts
-@import "bootstrap/buttons.less";
-@import "bootstrap/button-groups.less";
-@import "bootstrap/alerts.less"; // Note: alerts share common CSS with buttons and thus have styles in buttons.less
-
-// Components: Nav
-@import "bootstrap/navs.less";
-@import "bootstrap/navbar.less";
-@import "bootstrap/breadcrumbs.less";
-@import "bootstrap/pagination.less";
-@import "bootstrap/pager.less";
-
-// Components: Popovers
-@import "bootstrap/modals.less";
-@import "bootstrap/tooltip.less";
-@import "bootstrap/popovers.less";
-
-// Components: Misc
-@import "bootstrap/thumbnails.less";
-@import "bootstrap/labels-badges.less";
-@import "bootstrap/progress-bars.less";
-@import "bootstrap/accordion.less";
-@import "bootstrap/carousel.less";
-@import "bootstrap/hero-unit.less";
-
-// Utility classes
-@import "bootstrap/utilities.less"; // Has to be last to override when necessary
-
-// Responsiveness
-@import "bootstrap/responsive-768px-979px.less";
-@import "bootstrap/responsive-1200px-min.less";
-
-
-// Yes-no Switch
-@import "bootstrap-toggle-buttons.css";
-
-
-// Admin theme
-@import "admin/scaffolding.less";
-
-@import "admin/forms.less";
-@import "admin/tables.less";
-
-@import "admin/wells.less";
-@import "admin/users-lists.less";
-
-@import "admin/buttons.less";
-@import "admin/alerts.less";
-
-@import "admin/avatars.less";
-@import "admin/navs.less";
-@import "admin/navbar.less";
-
-@import "admin/popovers.less";
-@import "admin/graphs.less";
-
+/*!
+ * Bootstrap v2.1.0
+ *
+ * Copyright 2012 Twitter, Inc
+ * Licensed under the Apache License v2.0
+ * http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Designed and built with all the love in the world @twitter by @mdo and @fat.
+ */
+
+// CSS Reset
+@import "bootstrap/reset.less";
+
+// Core variables and mixins
+@import "variables.less";
+@import "bootstrap/mixins.less";
+
+// Grid system and page structure
+@import "bootstrap/scaffolding.less";
+@import "bootstrap/grid.less";
+@import "bootstrap/layouts.less";
+
+// Base CSS
+@import "bootstrap/type.less";
+@import "bootstrap/code.less";
+@import "bootstrap/forms.less";
+@import "bootstrap/tables.less";
+
+// Components: common
+@import "bootstrap/sprites.less";
+@import "bootstrap/dropdowns.less";
+@import "bootstrap/wells.less";
+@import "bootstrap/component-animations.less";
+@import "bootstrap/close.less";
+
+// Components: Buttons & Alerts
+@import "bootstrap/buttons.less";
+@import "bootstrap/button-groups.less";
+@import "bootstrap/alerts.less"; // Note: alerts share common CSS with buttons and thus have styles in buttons.less
+
+// Components: Nav
+@import "bootstrap/navs.less";
+@import "bootstrap/navbar.less";
+@import "bootstrap/breadcrumbs.less";
+@import "bootstrap/pagination.less";
+@import "bootstrap/pager.less";
+
+// Components: Popovers
+@import "bootstrap/modals.less";
+@import "bootstrap/tooltip.less";
+@import "bootstrap/popovers.less";
+
+// Components: Misc
+@import "bootstrap/thumbnails.less";
+@import "bootstrap/labels-badges.less";
+@import "bootstrap/progress-bars.less";
+@import "bootstrap/accordion.less";
+@import "bootstrap/carousel.less";
+@import "bootstrap/hero-unit.less";
+
+// Utility classes
+@import "bootstrap/utilities.less"; // Has to be last to override when necessary
+
+// Responsiveness
+@import "bootstrap/responsive-768px-979px.less";
+@import "bootstrap/responsive-1200px-min.less";
+
+
+// Yes-no Switch
+@import "bootstrap-toggle-buttons.css";
+
+
+// Admin theme
+@import "admin/scaffolding.less";
+
+@import "admin/forms.less";
+@import "admin/tables.less";
+
+@import "admin/wells.less";
+@import "admin/users-lists.less";
+
+@import "admin/buttons.less";
+@import "admin/alerts.less";
+
+@import "admin/avatars.less";
+@import "admin/navs.less";
+@import "admin/navbar.less";
+
+@import "admin/popovers.less";
+@import "admin/graphs.less";
+
 @import "admin/utilities.less";

+ 62 - 62
static/admin/css/admin/alerts.less

@@ -1,62 +1,62 @@
-// Misago alerts
-// -------------------------
-.alerts-global {
-  margin-top: 16px;
-}
-
-.alert-form {
-  margin: 0px;
-  margin-bottom: 16px;
-  
-  font-weight: bold;
-}
-
-.alert-inline {
-  margin: 0px;
-  padding: 0px;
-}
-
-// Alerts icons
-// -------------------------
-.alert-icon {
-  float: left;
-  
-  span {
-    .border-radius(2px);
-    padding: 1px 2px; 
-  }
-}
-
-.alert .alert-icon span {
-  background: @orange;
-}
-
-.alert-error .alert-icon span {
-  background: @red;  
-}
-
-.alert-success .alert-icon span {
-  background: @green;  
-}
-
-.alert-info .alert-icon span {
-  background: @blue;  
-}
-
-// Alerts paddings
-// -------------------------
-.alert {
-  padding: 10px 11px;
-  
-  p {
-    margin-left: 28px;
-  }
-  
-  p:last-child {
-    margin-bottom: 0px;
-  }
-  
-  p.protip {
-    font-size: 100%;
-  }
-}
+// Misago alerts
+// -------------------------
+.alerts-global {
+  margin-top: 16px;
+}
+
+.alert-form {
+  margin: 0px;
+  margin-bottom: 16px;
+  
+  font-weight: bold;
+}
+
+.alert-inline {
+  margin: 0px;
+  padding: 0px;
+}
+
+// Alerts icons
+// -------------------------
+.alert-icon {
+  float: left;
+  
+  span {
+    .border-radius(2px);
+    padding: 1px 2px; 
+  }
+}
+
+.alert .alert-icon span {
+  background: @orange;
+}
+
+.alert-error .alert-icon span {
+  background: @red;  
+}
+
+.alert-success .alert-icon span {
+  background: @green;  
+}
+
+.alert-info .alert-icon span {
+  background: @blue;  
+}
+
+// Alerts paddings
+// -------------------------
+.alert {
+  padding: 10px 11px;
+  
+  p {
+    margin-left: 28px;
+  }
+  
+  p:last-child {
+    margin-bottom: 0px;
+  }
+  
+  p.protip {
+    font-size: 100%;
+  }
+}

+ 65 - 65
static/admin/css/admin/avatars.less

@@ -1,65 +1,65 @@
-// Misago avatars sizes
-// -------------------------
-img{
-  &.avatar-big {
-    border-radius: 3px;
-    width: 180px;
-    height: 180px;
-  }
-  
-  &.avatar-normal {
-    border-radius: 3px;
-    width: 64px;
-    height: 64px;
-  }
-  
-  &.avatar-small {
-    border-radius: 3px;
-    width: 28px;
-    height: 28px;
-  }
-  
-  &.avatar-tiny {
-    border-radius: 3px;
-    width: 16px;
-    height: 16px;
-  }
-}
-
-// Columns widths
-td, th {
-  &.avatar-big {width: 180px;}
-  &.avatar-normal {width: 72px;}
-  &.avatar-small {width: 44px;}
-  &.avatar-tiny {width: 32px;}
-  
-  &.avatar-big,
-  &.avatar-normal,
-  &.avatar-small,
-  &.avatar-tiny {
-    padding-left: 0px;
-    padding-right: 0px;
-    
-    text-align: center;
-  }
-}
-
-// Handle small avatar within different places
-// -------------------------
-.navbar {
-  img.avatar-small {
-    margin: -(@baseLineHeight / 2) 0px;
-    position: relative;
-    bottom: 1px;
-  }
-}
-
-.page-header {
-  .avatar-normal {
-    width: 42px;
-    height: 42px;
-    margin: -(@baseLineHeight / 2) 0px;
-    position: relative;
-    top: (@baseLineHeight / 2) - 13;
-  }
-}
+// Misago avatars sizes
+// -------------------------
+img{
+  &.avatar-big {
+    border-radius: 3px;
+    width: 180px;
+    height: 180px;
+  }
+  
+  &.avatar-normal {
+    border-radius: 3px;
+    width: 64px;
+    height: 64px;
+  }
+  
+  &.avatar-small {
+    border-radius: 3px;
+    width: 28px;
+    height: 28px;
+  }
+  
+  &.avatar-tiny {
+    border-radius: 3px;
+    width: 16px;
+    height: 16px;
+  }
+}
+
+// Columns widths
+td, th {
+  &.avatar-big {width: 180px;}
+  &.avatar-normal {width: 72px;}
+  &.avatar-small {width: 44px;}
+  &.avatar-tiny {width: 32px;}
+  
+  &.avatar-big,
+  &.avatar-normal,
+  &.avatar-small,
+  &.avatar-tiny {
+    padding-left: 0px;
+    padding-right: 0px;
+    
+    text-align: center;
+  }
+}
+
+// Handle small avatar within different places
+// -------------------------
+.navbar {
+  img.avatar-small {
+    margin: -(@baseLineHeight / 2) 0px;
+    position: relative;
+    bottom: 1px;
+  }
+}
+
+.page-header {
+  .avatar-normal {
+    width: 42px;
+    height: 42px;
+    margin: -(@baseLineHeight / 2) 0px;
+    position: relative;
+    top: (@baseLineHeight / 2) - 13;
+  }
+}

+ 102 - 102
static/admin/css/admin/buttons.less

@@ -1,103 +1,103 @@
-.button-colors (@btnColor) {
-  background: @btnColor;
-  border: 1px solid @btnColor;
-  *border: 0;
-}
-
-.button-icon (@default, @hover: 100) {
-  i {
-    .opacity(@default);
-  }
-  
-  &:hover, &:active {
-    i {
-      .opacity(@hover);
-    }
-  }
-}
-
-.button-style (@background, @highlight) {
-  .button-colors(@background);
-
-  color: darken(@white, 3%);
-  text-shadow: 0px 1px 0px darken(@background, 5%);
-
-  &:hover, &:active {
-    .button-colors(@highlight);
-  }
-}
-
-.btn {
-  .button-colors(@btnBackground);
-  .box-shadow(none);
-  padding: 4px 10px;
-  
-  color: lighten(@gray, 10%);
-  font-weight: bold;
-  text-shadow: none;
-  
-  &:hover, &:active {
-    .button-colors(@btnBackgroundHighlight);
-    box-shadow: none;
-  
-    color: @linkColor;
-  }
-  
-  .button-icon(70);
-  
-  &.btn-primary,
-  &.btn-info,
-  &.btn-success,
-  &.btn-warning,
-  &.btn-danger,
-  &.btn-inverse {
-    .button-icon(90);
-  
-    color: darken(@white, 5%);
-  
-    &:hover, &:active {  
-      color: @white;
-    }
-  }
-  
-  &.btn-primary {
-    .button-colors(@btnPrimaryBackground);
-    .button-style(@btnPrimaryBackground, @btnPrimaryBackgroundHighlight);
-  }
-  
-  &.btn-info {
-    .button-colors(@btnInfoBackground);
-    .button-style(@btnInfoBackground, @btnInfoBackgroundHighlight);
-  }
-  
-  &.btn-success {
-    .button-colors(@btnSuccessBackground);
-    .button-style(@btnSuccessBackground, @btnSuccessBackgroundHighlight);
-  }
-  
-  &.btn-warning {
-    .button-colors(@btnWarningBackground);
-    .button-style(@btnWarningBackground, @btnWarningBackgroundHighlight);
-  }
-  
-  &.btn-danger {
-    .button-colors(@btnDangerBackground);
-    .button-style(@btnDangerBackground, @btnDangerBackgroundHighlight);
-  }
-  
-  &.btn-inverse {
-    .button-colors(@btnInverseBackground);
-    .button-style(@btnInverseBackground, @btnInverseBackgroundHighlight);
-  }
-  
-  &.btn-link {
-    background: none;
-    border: none;
-  
-    &:hover, &:active {
-      color: @linkColorHover;
-      
-      text-decoration: none;
-    }
-  }
+.button-colors (@btnColor) {
+  background: @btnColor;
+  border: 1px solid @btnColor;
+  *border: 0;
+}
+
+.button-icon (@default, @hover: 100) {
+  i {
+    .opacity(@default);
+  }
+  
+  &:hover, &:active {
+    i {
+      .opacity(@hover);
+    }
+  }
+}
+
+.button-style (@background, @highlight) {
+  .button-colors(@background);
+
+  color: darken(@white, 3%);
+  text-shadow: 0px 1px 0px darken(@background, 5%);
+
+  &:hover, &:active {
+    .button-colors(@highlight);
+  }
+}
+
+.btn {
+  .button-colors(@btnBackground);
+  .box-shadow(none);
+  padding: 4px 10px;
+  
+  color: lighten(@gray, 10%);
+  font-weight: bold;
+  text-shadow: none;
+  
+  &:hover, &:active {
+    .button-colors(@btnBackgroundHighlight);
+    box-shadow: none;
+  
+    color: @linkColor;
+  }
+  
+  .button-icon(70);
+  
+  &.btn-primary,
+  &.btn-info,
+  &.btn-success,
+  &.btn-warning,
+  &.btn-danger,
+  &.btn-inverse {
+    .button-icon(90);
+  
+    color: darken(@white, 5%);
+  
+    &:hover, &:active {  
+      color: @white;
+    }
+  }
+  
+  &.btn-primary {
+    .button-colors(@btnPrimaryBackground);
+    .button-style(@btnPrimaryBackground, @btnPrimaryBackgroundHighlight);
+  }
+  
+  &.btn-info {
+    .button-colors(@btnInfoBackground);
+    .button-style(@btnInfoBackground, @btnInfoBackgroundHighlight);
+  }
+  
+  &.btn-success {
+    .button-colors(@btnSuccessBackground);
+    .button-style(@btnSuccessBackground, @btnSuccessBackgroundHighlight);
+  }
+  
+  &.btn-warning {
+    .button-colors(@btnWarningBackground);
+    .button-style(@btnWarningBackground, @btnWarningBackgroundHighlight);
+  }
+  
+  &.btn-danger {
+    .button-colors(@btnDangerBackground);
+    .button-style(@btnDangerBackground, @btnDangerBackgroundHighlight);
+  }
+  
+  &.btn-inverse {
+    .button-colors(@btnInverseBackground);
+    .button-style(@btnInverseBackground, @btnInverseBackgroundHighlight);
+  }
+  
+  &.btn-link {
+    background: none;
+    border: none;
+  
+    &:hover, &:active {
+      color: @linkColorHover;
+      
+      text-decoration: none;
+    }
+  }
 }

+ 105 - 105
static/admin/css/admin/forms.less

@@ -1,105 +1,105 @@
-// Misago forms
-// -------------------------
-form {
-  label {
-    color: @gray;
-    font-weight: bold;
-    cursor: pointer;
-  }
-  
-  fieldset {
-    border-top: 1px solid darken(@bodyBackground, 8%);
-    margin: 0px;
-    padding: 0px;
-    padding-top: 16px;
-    padding-bottom: 8px;
-  
-    legend {
-      margin: 0px;
-      margin-bottom: -8px;
-      padding: 0px;
-      padding-top: 8px;
-    }
-        
-    .control-group {
-      padding-bottom: 4px;
-    }
-    
-    .control-group:last-child {
-      padding-bottom: 0px;
-    }
-  }
-  
-  fieldset.first {
-    border-top: none;
-    padding-top: 0px;
-  }
-  
-  fieldset.last {
-    padding-bottom: 0px;
-    margin-bottom: 0px;
-  }
-  
-  .form-actions {
-    margin-top: -4px;
-  }
-}
-
-// Make textarea resizeable vertically only
-// -------------------------
-textarea {
-  resize: vertical;
-}
-
-
-// Lists styling
-// -------------------------
-.radio-group, .select-multiple, .yes-no-switch {
-  label {
-    color: @black;
-    font-weight: normal;
-  }
-  
-  margin-bottom: 8px;
-}
-
-.checkbox {
-  color: @black;
-  font-weight: normal;
-}
-
-// Side-search form
-// -------------------------
-.side-search {
-  background: @white;
-  border: 1px solid darken(@bodyBackground, 15%);
-  .border-radius(4px);
-  .box-shadow(0px 0px 0px 3px darken(@bodyBackground, 5%));
-  padding: 8px;
-  margin-left: 14px;
-  margin-right: -14px;
-  
-  h4 {
-    border-bottom: 1px solid darken(@bodyBackground, 15%);
-    padding-top: 0px;
-    padding-bottom: 8px;
-    margin-top: 0px;
-  }
-  
-  hr {
-    border-top: 1px solid darken(@bodyBackground, 7%);
-    margin-bottom: 16px;
-  }
-    
-  label.checkbox, label.radio {
-    font-weight: normal;
-  }
-    
-  .form-actions {
-    background: darken(@bodyBackground, 3%);
-    .border-radius(0px 0px 3px 3px);
-    padding: 12px 8px;
-    margin: -8px;
-    margin-top: 0px;
-  }
-}
+// Misago forms
+// -------------------------
+form {
+  label {
+    color: @gray;
+    font-weight: bold;
+    cursor: pointer;
+  }
+  
+  fieldset {
+    border-top: 1px solid darken(@bodyBackground, 8%);
+    margin: 0px;
+    padding: 0px;
+    padding-top: 16px;
+    padding-bottom: 8px;
+  
+    legend {
+      margin: 0px;
+      margin-bottom: -8px;
+      padding: 0px;
+      padding-top: 8px;
+    }
+        
+    .control-group {
+      padding-bottom: 4px;
+    }
+    
+    .control-group:last-child {
+      padding-bottom: 0px;
+    }
+  }
+  
+  fieldset.first {
+    border-top: none;
+    padding-top: 0px;
+  }
+  
+  fieldset.last {
+    padding-bottom: 0px;
+    margin-bottom: 0px;
+  }
+  
+  .form-actions {
+    margin-top: -4px;
+  }
+}
+
+// Make textarea resizeable vertically only
+// -------------------------
+textarea {
+  resize: vertical;
+}
+
+
+// Lists styling
+// -------------------------
+.radio-group, .select-multiple, .yes-no-switch {
+  label {
+    color: @black;
+    font-weight: normal;
+  }
+  
+  margin-bottom: 8px;
+}
+
+.checkbox {
+  color: @black;
+  font-weight: normal;
+}
+
+// Side-search form
+// -------------------------
+.side-search {
+  background: @white;
+  border: 1px solid darken(@bodyBackground, 15%);
+  .border-radius(4px);
+  .box-shadow(0px 0px 0px 3px darken(@bodyBackground, 5%));
+  padding: 8px;
+  margin-left: 14px;
+  margin-right: -14px;
+  
+  h4 {
+    border-bottom: 1px solid darken(@bodyBackground, 15%);
+    padding-top: 0px;
+    padding-bottom: 8px;
+    margin-top: 0px;
+  }
+  
+  hr {
+    border-top: 1px solid darken(@bodyBackground, 7%);
+    margin-bottom: 16px;
+  }
+    
+  label.checkbox, label.radio {
+    font-weight: normal;
+  }
+    
+  .form-actions {
+    background: darken(@bodyBackground, 3%);
+    .border-radius(0px 0px 3px 3px);
+    padding: 12px 8px;
+    margin: -8px;
+    margin-top: 0px;
+  }
+}

+ 28 - 28
static/admin/css/admin/graphs.less

@@ -1,28 +1,28 @@
-// Graphs
-// --------------------------------------------------
-.graph {
-  background: #FFF;
-  border: 1px solid #DDD;
-  .border-radius(3px);
-  padding: 5px;
-
-  .timeline {
-    overflow: auto;
-    margin-top: -12px;
-    padding: 0px 12px;
-  }
-
-  .peak {
-    background: #FFF;
-    border: 4px solid #F00;
-    .border-radius(12px);
-	position: absolute;
-    cursor: pointer;
-    width: 7px;
-    height: 7px;
-  }
-}
-
-.sub-graph {
-  margin-top: 8px;
-}
+// Graphs
+// --------------------------------------------------
+.graph {
+  background: #FFF;
+  border: 1px solid #DDD;
+  .border-radius(3px);
+  padding: 5px;
+
+  .timeline {
+    overflow: auto;
+    margin-top: -12px;
+    padding: 0px 12px;
+  }
+
+  .peak {
+    background: #FFF;
+    border: 4px solid #F00;
+    .border-radius(12px);
+	position: absolute;
+    cursor: pointer;
+    width: 7px;
+    height: 7px;
+  }
+}
+
+.sub-graph {
+  margin-top: 8px;
+}

+ 171 - 171
static/admin/css/admin/navbar.less

@@ -1,172 +1,172 @@
-// Admin sections and user navbar
-// -------------------------
-.navbar-sections {    
-  // Style brand
-  .brand {
-    margin-right: -10px;
-    
-    color: @grayDark;
-    font-size: 200%;
-    
-    span {
-      color: @grayLight;
-      font-size: 50%;
-      line-height: 50%;
-    }
-  }
-  
-  // Signed-in administrator profile 
-  .user-profile {
-    padding: ((@navbarHeight - @baseLineHeight) / 2)-15px 10px ((@navbarHeight - @baseLineHeight) / 2)-15px 3px;
-    margin: 15px 5px;
-    
-    color: @grayDarker;
-    font-weight: bold;
-  }
-      
-  // Make links look better
-  .nav {
-    // Drop side margins so we fit 1024px clients
-    margin-left: 0px;
-    margin-right: 0px;
-    
-    li {
-      a, a:link, a:visited, a:active {
-        .opacity(50);
-        padding: ((@navbarHeight - @baseLineHeight) / 2) 10px ((@navbarHeight - @baseLineHeight) / 2);
-        margin: 0px 5px;
-        
-        font-weight: bold;
-        text-shadow: 0px 1px 0px @white;
-      }
-
-      a:focus, a:hover {
-        background-color: @navbarLinkBackgroundHover;
-        .border-radius(4px);
-        padding: ((@navbarHeight - @baseLineHeight) / 2)-15px 10px ((@navbarHeight - @baseLineHeight) / 2)-15px;
-        margin: 15px 5px;
-        .opacity(100);
-      }
-      
-      form {
-        margin: 0px;
-        padding: 0px;
-      }
-    }
-    
-    li.active {
-      a, a:link, a:active, a:visited, a:hover {
-        background-color: @navbarLinkBackgroundActive;
-        .border-radius(4px);
-        .box-shadow(none);
-        padding: ((@navbarHeight - @baseLineHeight) / 2)-15px 10px ((@navbarHeight - @baseLineHeight) / 2)-15px;
-        margin: 15px 0px;
-        .opacity(100);
-          
-        text-shadow: 0px 1px 0px darken(@navbarLinkBackgroundActive, 5%);
-        
-        i {
-          background-image: url("@{iconWhiteSpritePath}");
-          .opacity(100);
-        }
-      }
-    }
-  }  
-    
-  // Sign-out button
-  .btn-link, .btn-link:link, .btn-link:visited {
-    .border-radius(4px);
-    padding: ((@navbarHeight - @baseLineHeight) / 2)-15px 8px ((@navbarHeight - @baseLineHeight) / 2)-15px;
-    margin: 15px 0px;
-    .opacity(60);
-    
-    color: @textColor;
-    font-weight: bold;
-    font-size: 100%;
-    
-    i {
-      .opacity(100);
-    }
-  }
-  
-  .btn-link:active, .btn-link:hover {
-    background: @navbarLinkBackgroundHover;
-    .opacity(100);
-    
-    color: @textColor;
-  }
-}
-
-// Admin section actions navbar
-// -------------------------
-.navbar-actions {  
-  border-bottom: 1px solid @navbarInverseBorder;
-  
-  // Fix inverse navbar height
-  .navbar-inner {
-    min-height: @navbarInverseHeight;
-  }
-  
-  .nav {
-    li {
-      a, a:link, a:active, a:visited {
-        .opacity(50);
-        padding: ((@navbarInverseHeight - @baseLineHeight) / 2) 15px ((@navbarInverseHeight - @baseLineHeight) / 2);
-        
-        color: @black;
-        font-weight: bold;
-        text-shadow: 0px 1px 0px @grayLighter;
-      }
-      
-      a:hover {        
-        .opacity(100);
-        
-      }
-      
-      form {
-        margin: 0px;
-        padding: 0px;
-      }
-    }
-    
-    li.active {      
-      a, a:link, a:active, a:visited, a:hover {
-        border-bottom: 4px solid @linkColor;
-        .box-shadow(none);
-        .opacity(100);
-        padding-bottom: ((@navbarInverseHeight - @baseLineHeight) / 2) - 3px;
-        margin-bottom: -1px;
-        
-        color: @grayDark;
-        text-shadow: 0px 1px 0px @white;
-        
-        i {
-          background-image: url("@{iconSpritePath}");
-          .opacity(100);
-        }
-      }
-    }
-  }
-}
-
-// Both Navbars
-// -------------------------
-.navbar {
-  // Inner style
-  .navbar-inner {
-    border: none;
-    background: none;
-    background-color: @navbarBackground;
-    .box-shadow(none);
-  }
-  // And black navbar style
-  &.navbar-inverse {  
-    font-size: 90%;
-      
-    // Inner style
-    .navbar-inner {
-      background: none;
-      background-color: @navbarInverseBackground;
-    }
-  }
+// Admin sections and user navbar
+// -------------------------
+.navbar-sections {    
+  // Style brand
+  .brand {
+    margin-right: -10px;
+    
+    color: @grayDark;
+    font-size: 200%;
+    
+    span {
+      color: @grayLight;
+      font-size: 50%;
+      line-height: 50%;
+    }
+  }
+  
+  // Signed-in administrator profile 
+  .user-profile {
+    padding: ((@navbarHeight - @baseLineHeight) / 2)-15px 10px ((@navbarHeight - @baseLineHeight) / 2)-15px 3px;
+    margin: 15px 5px;
+    
+    color: @grayDarker;
+    font-weight: bold;
+  }
+      
+  // Make links look better
+  .nav {
+    // Drop side margins so we fit 1024px clients
+    margin-left: 0px;
+    margin-right: 0px;
+    
+    li {
+      a, a:link, a:visited, a:active {
+        .opacity(50);
+        padding: ((@navbarHeight - @baseLineHeight) / 2) 10px ((@navbarHeight - @baseLineHeight) / 2);
+        margin: 0px 5px;
+        
+        font-weight: bold;
+        text-shadow: 0px 1px 0px @white;
+      }
+
+      a:focus, a:hover {
+        background-color: @navbarLinkBackgroundHover;
+        .border-radius(4px);
+        padding: ((@navbarHeight - @baseLineHeight) / 2)-15px 10px ((@navbarHeight - @baseLineHeight) / 2)-15px;
+        margin: 15px 5px;
+        .opacity(100);
+      }
+      
+      form {
+        margin: 0px;
+        padding: 0px;
+      }
+    }
+    
+    li.active {
+      a, a:link, a:active, a:visited, a:hover {
+        background-color: @navbarLinkBackgroundActive;
+        .border-radius(4px);
+        .box-shadow(none);
+        padding: ((@navbarHeight - @baseLineHeight) / 2)-15px 10px ((@navbarHeight - @baseLineHeight) / 2)-15px;
+        margin: 15px 0px;
+        .opacity(100);
+          
+        text-shadow: 0px 1px 0px darken(@navbarLinkBackgroundActive, 5%);
+        
+        i {
+          background-image: url("@{iconWhiteSpritePath}");
+          .opacity(100);
+        }
+      }
+    }
+  }  
+    
+  // Sign-out button
+  .btn-link, .btn-link:link, .btn-link:visited {
+    .border-radius(4px);
+    padding: ((@navbarHeight - @baseLineHeight) / 2)-15px 8px ((@navbarHeight - @baseLineHeight) / 2)-15px;
+    margin: 15px 0px;
+    .opacity(60);
+    
+    color: @textColor;
+    font-weight: bold;
+    font-size: 100%;
+    
+    i {
+      .opacity(100);
+    }
+  }
+  
+  .btn-link:active, .btn-link:hover {
+    background: @navbarLinkBackgroundHover;
+    .opacity(100);
+    
+    color: @textColor;
+  }
+}
+
+// Admin section actions navbar
+// -------------------------
+.navbar-actions {  
+  border-bottom: 1px solid @navbarInverseBorder;
+  
+  // Fix inverse navbar height
+  .navbar-inner {
+    min-height: @navbarInverseHeight;
+  }
+  
+  .nav {
+    li {
+      a, a:link, a:active, a:visited {
+        .opacity(50);
+        padding: ((@navbarInverseHeight - @baseLineHeight) / 2) 15px ((@navbarInverseHeight - @baseLineHeight) / 2);
+        
+        color: @black;
+        font-weight: bold;
+        text-shadow: 0px 1px 0px @grayLighter;
+      }
+      
+      a:hover {        
+        .opacity(100);
+        
+      }
+      
+      form {
+        margin: 0px;
+        padding: 0px;
+      }
+    }
+    
+    li.active {      
+      a, a:link, a:active, a:visited, a:hover {
+        border-bottom: 4px solid @linkColor;
+        .box-shadow(none);
+        .opacity(100);
+        padding-bottom: ((@navbarInverseHeight - @baseLineHeight) / 2) - 3px;
+        margin-bottom: -1px;
+        
+        color: @grayDark;
+        text-shadow: 0px 1px 0px @white;
+        
+        i {
+          background-image: url("@{iconSpritePath}");
+          .opacity(100);
+        }
+      }
+    }
+  }
+}
+
+// Both Navbars
+// -------------------------
+.navbar {
+  // Inner style
+  .navbar-inner {
+    border: none;
+    background: none;
+    background-color: @navbarBackground;
+    .box-shadow(none);
+  }
+  // And black navbar style
+  &.navbar-inverse {  
+    font-size: 90%;
+      
+    // Inner style
+    .navbar-inner {
+      background: none;
+      background-color: @navbarInverseBackground;
+    }
+  }
 }

+ 74 - 74
static/admin/css/admin/navs.less

@@ -1,75 +1,75 @@
-// Admin navs
-// -------------------------
-.tabs-header {
-  border-bottom: none;
-  padding-bottom: 0px;
-  
-  .nav-tabs {
-    margin-bottom: 0px;
-  }
-}
-
-.nav-tabs li {
-  a:link, a:active, a:visited {    
-    font-weight: bold;
-  }
-  
-  &.active a:link, &.active a:active,
-  &.active a:visited, &.active a:hover {
-    background-color: @bodyBackground;
-    border-bottom: 4px solid @linkColor;
-    border-width: 0px 0px 4px 0px;
-    padding-top: (@baseLineHeight / 2) - 1px;
-    padding-bottom: (@baseLineHeight / 2) - 5px;
-        
-    color: @textColor;
-  }
-    
-  &.fallback {
-    float:right;
-    
-    a:link, a:active,
-    a:visited, a:hover {
-      border-bottom: none;
-      .border-radius(3px);
-      margin-top: 4px;
-      padding: 4px 12px;
-    }
-  }
-}
-
-// Tables lists actions
-td>ul.list-actions {
-  list-style: none;
-  margin: 0px;
-  overflow: auto;
-  padding: 0px;
-  
-  &>li {
-    float: left;
-    margin: 0px;
-    padding: 0px;
-    
-    &>form {
-      margin: 0px;
-      padding: 0px;
-    }
-    
-    &>a, &>form>button {
-      background: none;
-      border: none;
-      .border-radius(3px);
-      display: block;
-      margin: 0px 3px;
-      padding: 2px 5px;
-      
-      &:hover {
-        background-color: @linkColor;
-        
-        i {
-          background-image: url("@{iconWhiteSpritePath}");          
-        }
-      }
-    }
-  }
+// Admin navs
+// -------------------------
+.tabs-header {
+  border-bottom: none;
+  padding-bottom: 0px;
+  
+  .nav-tabs {
+    margin-bottom: 0px;
+  }
+}
+
+.nav-tabs li {
+  a:link, a:active, a:visited {    
+    font-weight: bold;
+  }
+  
+  &.active a:link, &.active a:active,
+  &.active a:visited, &.active a:hover {
+    background-color: @bodyBackground;
+    border-bottom: 4px solid @linkColor;
+    border-width: 0px 0px 4px 0px;
+    padding-top: (@baseLineHeight / 2) - 1px;
+    padding-bottom: (@baseLineHeight / 2) - 5px;
+        
+    color: @textColor;
+  }
+    
+  &.fallback {
+    float:right;
+    
+    a:link, a:active,
+    a:visited, a:hover {
+      border-bottom: none;
+      .border-radius(3px);
+      margin-top: 4px;
+      padding: 4px 12px;
+    }
+  }
+}
+
+// Tables lists actions
+td>ul.list-actions {
+  list-style: none;
+  margin: 0px;
+  overflow: auto;
+  padding: 0px;
+  
+  &>li {
+    float: left;
+    margin: 0px;
+    padding: 0px;
+    
+    &>form {
+      margin: 0px;
+      padding: 0px;
+    }
+    
+    &>a, &>form>button {
+      background: none;
+      border: none;
+      .border-radius(3px);
+      display: block;
+      margin: 0px 3px;
+      padding: 2px 5px;
+      
+      &:hover {
+        background-color: @linkColor;
+        
+        i {
+          background-image: url("@{iconWhiteSpritePath}");          
+        }
+      }
+    }
+  }
 }

+ 32 - 32
static/admin/css/admin/popovers.less

@@ -1,32 +1,32 @@
-// Popovers
-// --------------------------------------------------
-.popover {
-  border: 1px solid #black;
-  .border-radius(3px);
-  .box-shadow(0px 0px 0px 3px rgba(0,0,0,.1));
-}
-
-.popover-title {
-  .user-card {
-    margin-top: 2px;
-    margin-bottom: -2px;
-    
-    font-weight: bold;
-    font-size: 160%;
-    
-    .avatar-small {
-      position: relative;
-      bottom: 2px;
-    }
-  }
-}
-
-// Popover infocard
-// --------------------------------------------------
-.user-infocard {
-  overflow: auto;
-  
-  .avatar-normal {
-    float: left;
-  }
-}
+// Popovers
+// --------------------------------------------------
+.popover {
+  border: 1px solid #black;
+  .border-radius(3px);
+  .box-shadow(0px 0px 0px 3px rgba(0,0,0,.1));
+}
+
+.popover-title {
+  .user-card {
+    margin-top: 2px;
+    margin-bottom: -2px;
+    
+    font-weight: bold;
+    font-size: 160%;
+    
+    .avatar-small {
+      position: relative;
+      bottom: 2px;
+    }
+  }
+}
+
+// Popover infocard
+// --------------------------------------------------
+.user-infocard {
+  overflow: auto;
+  
+  .avatar-normal {
+    float: left;
+  }
+}

+ 94 - 94
static/admin/css/admin/scaffolding.less

@@ -1,94 +1,94 @@
-// Compact layout, used for sign-in and "processing" pages
-// -------------------------
-body.layout-compact {
-  background-color: darken(@bodyBackground, 1%);
-  margin-top: 100px;
-  
-  h1 {
-    padding: 0px;
-    
-    color: @grayLight;
-    font-size: 180%;
-    
-    strong {
-      color: @grayDark;
-    }
-  }
-  
-  .block-bold {
-    background: @white;
-    border: 1px solid darken(@bodyBackground, 20%);
-    .border-radius(3px);
-    .box-shadow(0px 0px 0px 3px darken(@bodyBackground, 10%));
-    margin: 0px -19px;
-    
-    .alert{
-      border-width: 0px 0px 1px 0px;
-      .border-radius(2px 2px 0px 0px);
-      
-      margin: 0px;
-      padding: 12px;
-      font-weight: bold;
-    }
-    
-    form {
-      margin: 0px;
-      padding: 0px;
-      
-      .form-container {
-        padding: 20px 18px;
-        padding-bottom: 12px;
-      }
-      
-      .form-actions {
-        .border-radius(0px 0px 2px 2px);
-        margin: 0px;
-      }
-    }
-  }
-}
-
-// Footer
-footer {
-  padding-top: 16px;
-  padding-bottom: 32px;
-  
-  color: darken(@bodyBackground, 30%);
-  
-  a, a:link, a:active, a:visited {
-    color: darken(@bodyBackground, 30%);
-    text-decoration: underline;
-  }
-  
-  a:hover {
-    color: darken(@bodyBackground, 50%);
-  }
-  
-  .go-to-top {
-    float: right;
-    
-    &, &:link, &:active, &:visited {
-      text-decoration: none;
-      
-      i {
-        .opacity(40);
-      }
-    }
-    
-    &:hover {
-      i {
-        .opacity(65);
-      }
-    }
-  }
-}
-
-// Side-panel
-.side-panel {
-  padding-right: 30px;
-  border-right: 1px solid darken(@bodyBackground, 15%);
-}
-  
-.sidepanel-header {
-  margin-top: 0px;
-}
+// Compact layout, used for sign-in and "processing" pages
+// -------------------------
+body.layout-compact {
+  background-color: darken(@bodyBackground, 1%);
+  margin-top: 100px;
+  
+  h1 {
+    padding: 0px;
+    
+    color: @grayLight;
+    font-size: 180%;
+    
+    strong {
+      color: @grayDark;
+    }
+  }
+  
+  .block-bold {
+    background: @white;
+    border: 1px solid darken(@bodyBackground, 20%);
+    .border-radius(3px);
+    .box-shadow(0px 0px 0px 3px darken(@bodyBackground, 10%));
+    margin: 0px -19px;
+    
+    .alert{
+      border-width: 0px 0px 1px 0px;
+      .border-radius(2px 2px 0px 0px);
+      
+      margin: 0px;
+      padding: 12px;
+      font-weight: bold;
+    }
+    
+    form {
+      margin: 0px;
+      padding: 0px;
+      
+      .form-container {
+        padding: 20px 18px;
+        padding-bottom: 12px;
+      }
+      
+      .form-actions {
+        .border-radius(0px 0px 2px 2px);
+        margin: 0px;
+      }
+    }
+  }
+}
+
+// Footer
+footer {
+  padding-top: 16px;
+  padding-bottom: 32px;
+  
+  color: darken(@bodyBackground, 30%);
+  
+  a, a:link, a:active, a:visited {
+    color: darken(@bodyBackground, 30%);
+    text-decoration: underline;
+  }
+  
+  a:hover {
+    color: darken(@bodyBackground, 50%);
+  }
+  
+  .go-to-top {
+    float: right;
+    
+    &, &:link, &:active, &:visited {
+      text-decoration: none;
+      
+      i {
+        .opacity(40);
+      }
+    }
+    
+    &:hover {
+      i {
+        .opacity(65);
+      }
+    }
+  }
+}
+
+// Side-panel
+.side-panel {
+  padding-right: 30px;
+  border-right: 1px solid darken(@bodyBackground, 15%);
+}
+  
+.sidepanel-header {
+  margin-top: 0px;
+}

+ 183 - 183
static/admin/css/admin/tables.less

@@ -1,183 +1,183 @@
-// Tables
-// --------------------------------------------------
-.table-footer {
-  background: none;
-  margin-bottom: 0px;
-  padding: 0px 8px;
-  position: relative;
-  bottom: 20px;
-  
-  .pager {
-    margin: 0px 0px;
-    margin-top: 9px;
-    padding: 0px;
-    margin-right: 6px;
-    
-    &>li {
-      margin-right: 6px;
-    
-      &>a {
-        &:link, &:active, &:visited {
-          background: darken(@bodyBackground, 8%);
-          border: none;
-          .border-radius(3px);
-          padding: 2px 5px;
-        }
-      
-        &:hover {
-          background-color: @linkColor;
-          
-          i {
-            background-image: url("@{iconWhiteSpritePath}");          
-          }
-        }
-      }
-    }
-  }
-  
-  .table-count {
-    padding: 11px 0px;
-    
-    color: @gray;
-  }
-  
-  .form-inline {
-    margin: 0px;
-    padding: 6px 0px;
-  }
-  
-  .table-actions-right {
-    margin-right: 16px;
-  }
-}
-
-// Cell colors
-.table {
-  td {
-    &.perm-show,
-    &.perm-read,
-    &.perm-start,
-    &.perm-reply,
-    &.perm-upload,
-    &.perm-download {
-      text-align: center;
-    }
-  }
-  
-  tr:nth-child(even) {
-    .perm-show {background-color: lighten(@blue, 40%);}
-    .perm-read {background-color: lighten(@red, 40%);}
-    .perm-start {background-color: lighten(@green, 40%);}
-    .perm-reply {background-color: lighten(@yellow, 40%);}
-    .perm-upload {background-color: lighten(@pink, 40%);}
-    .perm-download {background-color: lighten(@orange, 40%);}
-  }
-  
-  tr:nth-child(odd) {
-    .perm-show {background-color: lighten(@blue, 30%);}
-    .perm-read {background-color: lighten(@red, 30%);}
-    .perm-start {background-color: lighten(@green, 30%);}
-    .perm-reply {background-color: lighten(@yellow, 30%);}
-    .perm-upload {background-color: lighten(@pink, 30%);}
-    .perm-download {background-color: lighten(@orange, 30%);}
-  }
-}
-
-// Checkbox cell
-td, th {
-  &.check-cell {
-    width: 32px;
-  }
-    
-  .checkbox {
-    margin-bottom: 0px;
-    position: relative;
-    bottom: 1px;
-    
-    input {
-      position: relative;
-      left: 9px;
-    }
-  }
-}
-
-// Lead cell
-td.lead-cell {
-  font-size: 120%;
-}
-
-// Vertically centered table
-.table {
-  td {
-    vertical-align: middle;
-  }
-  
-  select, .yes-no-switch {
-    margin: 0px;
-  }
-  
-  input {
-    width: 90% !important;
-  }
-    
-  .yes-no-switch {
-    position: relative;
-    top: 2px;
-  }
-}
-
-// Table sorting styles
-th.table-sort {
-  padding: 0px;
-  
-  a:link, a:active, a:visited a:hover{
-    display: block;
-    padding: 8px;
-  }
-  
-  &.sort-active-asc {
-    a:link, a:active, a:visited {
-      border-bottom: 3px solid @blue;
-      padding-bottom: 5px;
-    }
-    
-    a:hover {
-      border-bottom: 3px solid lighten(@red, 30%);
-      padding-bottom: 5px;
-      
-      text-decoration: none;
-    }
-  }
-  
-  &.sort-active-desc {
-    a:link, a:active, a:visited {
-      border-bottom: 3px solid lighten(@red, 20%);
-      padding-bottom: 5px;
-    }
-    
-    a:hover {
-      border-bottom: 3px solid lighten(@blue, 10%);
-      padding-bottom: 5px;
-      
-      text-decoration: none;
-    }
-  }
-  
-  &.sort-asc {
-    a:hover {
-      border-bottom: 3px solid lighten(@blue, 40%);
-      padding-bottom: 5px;
-      
-      text-decoration: none;
-    }
-  }
-  
-  &.sort-desc {    
-    a:hover {
-      border-bottom: 3px solid lighten(@red, 40%);
-      padding-bottom: 5px;
-      
-      text-decoration: none;
-    }    
-  }
-}
+// Tables
+// --------------------------------------------------
+.table-footer {
+  background: none;
+  margin-bottom: 0px;
+  padding: 0px 8px;
+  position: relative;
+  bottom: 20px;
+  
+  .pager {
+    margin: 0px 0px;
+    margin-top: 9px;
+    padding: 0px;
+    margin-right: 6px;
+    
+    &>li {
+      margin-right: 6px;
+    
+      &>a {
+        &:link, &:active, &:visited {
+          background: darken(@bodyBackground, 8%);
+          border: none;
+          .border-radius(3px);
+          padding: 2px 5px;
+        }
+      
+        &:hover {
+          background-color: @linkColor;
+          
+          i {
+            background-image: url("@{iconWhiteSpritePath}");          
+          }
+        }
+      }
+    }
+  }
+  
+  .table-count {
+    padding: 11px 0px;
+    
+    color: @gray;
+  }
+  
+  .form-inline {
+    margin: 0px;
+    padding: 6px 0px;
+  }
+  
+  .table-actions-right {
+    margin-right: 16px;
+  }
+}
+
+// Cell colors
+.table {
+  td {
+    &.perm-show,
+    &.perm-read,
+    &.perm-start,
+    &.perm-reply,
+    &.perm-upload,
+    &.perm-download {
+      text-align: center;
+    }
+  }
+  
+  tr:nth-child(even) {
+    .perm-show {background-color: lighten(@blue, 40%);}
+    .perm-read {background-color: lighten(@red, 40%);}
+    .perm-start {background-color: lighten(@green, 40%);}
+    .perm-reply {background-color: lighten(@yellow, 40%);}
+    .perm-upload {background-color: lighten(@pink, 40%);}
+    .perm-download {background-color: lighten(@orange, 40%);}
+  }
+  
+  tr:nth-child(odd) {
+    .perm-show {background-color: lighten(@blue, 30%);}
+    .perm-read {background-color: lighten(@red, 30%);}
+    .perm-start {background-color: lighten(@green, 30%);}
+    .perm-reply {background-color: lighten(@yellow, 30%);}
+    .perm-upload {background-color: lighten(@pink, 30%);}
+    .perm-download {background-color: lighten(@orange, 30%);}
+  }
+}
+
+// Checkbox cell
+td, th {
+  &.check-cell {
+    width: 32px;
+  }
+    
+  .checkbox {
+    margin-bottom: 0px;
+    position: relative;
+    bottom: 1px;
+    
+    input {
+      position: relative;
+      left: 9px;
+    }
+  }
+}
+
+// Lead cell
+td.lead-cell {
+  font-size: 120%;
+}
+
+// Vertically centered table
+.table {
+  td {
+    vertical-align: middle;
+  }
+  
+  select, .yes-no-switch {
+    margin: 0px;
+  }
+  
+  input {
+    width: 90% !important;
+  }
+    
+  .yes-no-switch {
+    position: relative;
+    top: 2px;
+  }
+}
+
+// Table sorting styles
+th.table-sort {
+  padding: 0px;
+  
+  a:link, a:active, a:visited a:hover{
+    display: block;
+    padding: 8px;
+  }
+  
+  &.sort-active-asc {
+    a:link, a:active, a:visited {
+      border-bottom: 3px solid @blue;
+      padding-bottom: 5px;
+    }
+    
+    a:hover {
+      border-bottom: 3px solid lighten(@red, 30%);
+      padding-bottom: 5px;
+      
+      text-decoration: none;
+    }
+  }
+  
+  &.sort-active-desc {
+    a:link, a:active, a:visited {
+      border-bottom: 3px solid lighten(@red, 20%);
+      padding-bottom: 5px;
+    }
+    
+    a:hover {
+      border-bottom: 3px solid lighten(@blue, 10%);
+      padding-bottom: 5px;
+      
+      text-decoration: none;
+    }
+  }
+  
+  &.sort-asc {
+    a:hover {
+      border-bottom: 3px solid lighten(@blue, 40%);
+      padding-bottom: 5px;
+      
+      text-decoration: none;
+    }
+  }
+  
+  &.sort-desc {    
+    a:hover {
+      border-bottom: 3px solid lighten(@red, 40%);
+      padding-bottom: 5px;
+      
+      text-decoration: none;
+    }    
+  }
+}

+ 54 - 54
static/admin/css/admin/users-lists.less

@@ -1,54 +1,54 @@
-// Users list
-// --------------------------------------------------
-.table-users {
-  a:link, a:active,
-  a:visited, a:hover {
-    color: @textColor;
-    font-size: 150%;
-    text-decoration: none
-  }
-  
-  .avatar {
-    .border-radius(3px);
-    width: 42px;
-    height: 42px;
-  }
-  
-  // Info popover
-  .info-popover {
-    background: darken(@bodyBackground, 10%);
-    .border-radius(3px);
-    padding: 2px;
-    padding-top: 0px;
-  
-    i {
-      margin: 0px;
-    }
-    
-    &:hover {
-      background: darken(@bodyBackground, 50%);
-      
-      i {
-        background-image: url("@{iconWhiteSpritePath}");
-      }
-    }
-  }
-  
-  // Tiny size, for lists with tons of members
-  &.list-tiny {
-    a:link, a:active,
-    a:visited, a:hover {
-      font-size: 100%;
-    }
-    
-    .avatar {
-      width: 22px;
-      height: 22px;
-    }
-    
-    i {
-      position: relative;
-      top: 2px;
-    }
-  }
-}
+// Users list
+// --------------------------------------------------
+.table-users {
+  a:link, a:active,
+  a:visited, a:hover {
+    color: @textColor;
+    font-size: 150%;
+    text-decoration: none
+  }
+  
+  .avatar {
+    .border-radius(3px);
+    width: 42px;
+    height: 42px;
+  }
+  
+  // Info popover
+  .info-popover {
+    background: darken(@bodyBackground, 10%);
+    .border-radius(3px);
+    padding: 2px;
+    padding-top: 0px;
+  
+    i {
+      margin: 0px;
+    }
+    
+    &:hover {
+      background: darken(@bodyBackground, 50%);
+      
+      i {
+        background-image: url("@{iconWhiteSpritePath}");
+      }
+    }
+  }
+  
+  // Tiny size, for lists with tons of members
+  &.list-tiny {
+    a:link, a:active,
+    a:visited, a:hover {
+      font-size: 100%;
+    }
+    
+    .avatar {
+      width: 22px;
+      height: 22px;
+    }
+    
+    i {
+      position: relative;
+      top: 2px;
+    }
+  }
+}

+ 15 - 15
static/admin/css/admin/wells.less

@@ -1,15 +1,15 @@
-// Wells
-// --------------------------------------------------
-.well {
-  background: darken(@bodyBackground, 1%);
-  border: 1px solid @white;
-  .border-radius(3px);
-  .box-shadow(0px 0px 3px darken(@bodyBackground, 20%));
-}
-
-.strong-well {
-  background: @white;
-  border: 1px solid darken(@bodyBackground, 20%);
-  .border-radius(3px);
-  .box-shadow(0px 0px 0px 3px darken(@bodyBackground, 10%));
-}
+// Wells
+// --------------------------------------------------
+.well {
+  background: darken(@bodyBackground, 1%);
+  border: 1px solid @white;
+  .border-radius(3px);
+  .box-shadow(0px 0px 3px darken(@bodyBackground, 20%));
+}
+
+.strong-well {
+  background: @white;
+  border: 1px solid darken(@bodyBackground, 20%);
+  .border-radius(3px);
+  .box-shadow(0px 0px 0px 3px darken(@bodyBackground, 10%));
+}

+ 64 - 64
static/admin/js/admin.js

@@ -1,65 +1,65 @@
-$(function () {
-	// Register tooltips
-	$('.tooltip-top').tooltip({placement: 'top'})
-	$('.tooltip-bottom').tooltip({placement: 'bottom'})
-	$('.tooltip-left').tooltip({placement: 'left'})
-	$('.tooltip-right').tooltip({placement: 'right'})
-	
-	// Register popovers
-	$('.popover-top').popover({placement: 'top'})
-	$('.popover-bottom').popover({placement: 'bottom'})
-	$('.popover-left').popover({placement: 'left'})
-	$('.popover-right').popover({placement: 'right'})
-	
-	// Start all dropdowns
-	$('.dropdown-toggle').dropdown()
-	
-	// Dont hide clickable dropdowns
-	$('.dropdown-clickable').on('click', function (e) {
-	  e.stopPropagation()
-	});
-	
-	// Make yes-no switches work
-	$('.yes-no-switch').toggleButtons({
-	  style: {
-	    enabled: "primary",
-	    disabled: "danger"
-	  }
-	});
-	
-	// Checkbox Group Master
-	$('input.checkbox-master').live('click', function(){
-		if($(this).is(':checked')){
-			$('input.checkbox-member').attr("checked" ,"checked");
-		}
-		else
-		{
-			$('input.checkbox-member').removeAttr('checked');
-		}
-	});
-	
-	// Checkbox Group Member
-	$('input.checkbox-member').live('click', function(){
-		if(!$(this).is(':checked')){
-			$('input.checkbox-master').removeAttr('checked');
-		}
-	});
-	
-	// Check Confirmation on links
-	$('a.confirm').live('click', function(){
-		var decision = confirm(jQuery.data(this, 'jsconfirm'));
-		return decision
-	});
-	
-	// Check Confirmation on forms
-	$('form.confirm').live('submit', function(){
-		data = $(this).data();
-		var decision = confirm(data.jsconfirm);
-		return decision
-	});
-	
-	// Go back one page
-	$('.go-back').on('click', function (e) {
-	  history.go(-1)
-	})
+$(function () {
+	// Register tooltips
+	$('.tooltip-top').tooltip({placement: 'top'})
+	$('.tooltip-bottom').tooltip({placement: 'bottom'})
+	$('.tooltip-left').tooltip({placement: 'left'})
+	$('.tooltip-right').tooltip({placement: 'right'})
+	
+	// Register popovers
+	$('.popover-top').popover({placement: 'top'})
+	$('.popover-bottom').popover({placement: 'bottom'})
+	$('.popover-left').popover({placement: 'left'})
+	$('.popover-right').popover({placement: 'right'})
+	
+	// Start all dropdowns
+	$('.dropdown-toggle').dropdown()
+	
+	// Dont hide clickable dropdowns
+	$('.dropdown-clickable').on('click', function (e) {
+	  e.stopPropagation()
+	});
+	
+	// Make yes-no switches work
+	$('.yes-no-switch').toggleButtons({
+	  style: {
+	    enabled: "primary",
+	    disabled: "danger"
+	  }
+	});
+	
+	// Checkbox Group Master
+	$('input.checkbox-master').live('click', function(){
+		if($(this).is(':checked')){
+			$('input.checkbox-member').attr("checked" ,"checked");
+		}
+		else
+		{
+			$('input.checkbox-member').removeAttr('checked');
+		}
+	});
+	
+	// Checkbox Group Member
+	$('input.checkbox-member').live('click', function(){
+		if(!$(this).is(':checked')){
+			$('input.checkbox-master').removeAttr('checked');
+		}
+	});
+	
+	// Check Confirmation on links
+	$('a.confirm').live('click', function(){
+		var decision = confirm(jQuery.data(this, 'jsconfirm'));
+		return decision
+	});
+	
+	// Check Confirmation on forms
+	$('form.confirm').live('submit', function(){
+		data = $(this).data();
+		var decision = confirm(data.jsconfirm);
+		return decision
+	});
+	
+	// Go back one page
+	$('.go-back').on('click', function (e) {
+	  history.go(-1)
+	})
 })

+ 97 - 97
static/cranefly/css/cranefly.less

@@ -1,98 +1,98 @@
-/*!
- * Bootstrap v2.1.0
- *
- * Copyright 2012 Twitter, Inc
- * Licensed under the Apache License v2.0
- * http://www.apache.org/licenses/LICENSE-2.0
- *
- * Designed and built with all the love in the world @twitter by @mdo and @fat.
- */
-
-// CSS Reset
-@import "bootstrap/reset.less";
-
-// Core variables and mixins
-@import "variables.less";
-@import "bootstrap/mixins.less";
-
-// Grid system and page structure
-@import "bootstrap/scaffolding.less";
-@import "bootstrap/grid.less";
-@import "bootstrap/layouts.less";
-
-// Base CSS
-@import "bootstrap/type.less";
-@import "bootstrap/code.less";
-@import "bootstrap/forms.less";
-@import "bootstrap/tables.less";
-
-// Components: common
-@import "bootstrap/sprites.less";
-@import "bootstrap/dropdowns.less";
-@import "bootstrap/wells.less";
-@import "bootstrap/component-animations.less";
-@import "bootstrap/close.less";
-
-// Components: Buttons & Alerts
-@import "bootstrap/buttons.less";
-@import "bootstrap/button-groups.less";
-@import "bootstrap/alerts.less"; // Note: alerts share common CSS with buttons and thus have styles in buttons.less
-
-// Components: Nav
-@import "bootstrap/navs.less";
-@import "bootstrap/navbar.less";
-@import "bootstrap/breadcrumbs.less";
-@import "bootstrap/pagination.less";
-@import "bootstrap/pager.less";
-
-// Components: Popovers
-@import "bootstrap/modals.less";
-@import "bootstrap/tooltip.less";
-@import "bootstrap/popovers.less";
-
-// Components: Misc
-@import "bootstrap/thumbnails.less";
-@import "bootstrap/labels-badges.less";
-@import "bootstrap/progress-bars.less";
-@import "bootstrap/accordion.less";
-@import "bootstrap/carousel.less";
-@import "bootstrap/hero-unit.less";
-
-// Utility classes
-@import "bootstrap/utilities.less"; // Has to be last to override when necessary
-
-// Responsiveness
-@import "bootstrap/responsive-1200px-min.less";
-
-// Sora theme
-@import "cranefly/header.less";
-@import "cranefly/scaffolding.less";
-@import "cranefly/navbar.less";
-@import "cranefly/breadcrumbs.less";
-@import "cranefly/messages.less";
-@import "cranefly/forms.less";
-@import "cranefly/buttons.less";
-@import "cranefly/pagination.less";
-@import "cranefly/editor.less";
-@import "cranefly/error.less";
-@import "cranefly/markdown.less";
-@import "cranefly/index.less";
-@import "cranefly/signin.less";
-@import "cranefly/usercp.less";
-@import "cranefly/forummap.less";
-@import "cranefly/watchedthreads.less";
-@import "cranefly/alerts.less";
-@import "cranefly/newsfeed.less";
-@import "cranefly/category.less";
-@import "cranefly/profiles.less";
-@import "cranefly/forum.less";
-@import "cranefly/thread.less";
-@import "cranefly/karmas.less";
-@import "cranefly/changelog.less";
-@import "cranefly/report.less";
-@import "cranefly/reports.less";
-@import "cranefly/search.less";
-
-// Keep ranks last for easy overrides!
-@import "ranks.less";
+/*!
+ * Bootstrap v2.1.0
+ *
+ * Copyright 2012 Twitter, Inc
+ * Licensed under the Apache License v2.0
+ * http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Designed and built with all the love in the world @twitter by @mdo and @fat.
+ */
+
+// CSS Reset
+@import "bootstrap/reset.less";
+
+// Core variables and mixins
+@import "variables.less";
+@import "bootstrap/mixins.less";
+
+// Grid system and page structure
+@import "bootstrap/scaffolding.less";
+@import "bootstrap/grid.less";
+@import "bootstrap/layouts.less";
+
+// Base CSS
+@import "bootstrap/type.less";
+@import "bootstrap/code.less";
+@import "bootstrap/forms.less";
+@import "bootstrap/tables.less";
+
+// Components: common
+@import "bootstrap/sprites.less";
+@import "bootstrap/dropdowns.less";
+@import "bootstrap/wells.less";
+@import "bootstrap/component-animations.less";
+@import "bootstrap/close.less";
+
+// Components: Buttons & Alerts
+@import "bootstrap/buttons.less";
+@import "bootstrap/button-groups.less";
+@import "bootstrap/alerts.less"; // Note: alerts share common CSS with buttons and thus have styles in buttons.less
+
+// Components: Nav
+@import "bootstrap/navs.less";
+@import "bootstrap/navbar.less";
+@import "bootstrap/breadcrumbs.less";
+@import "bootstrap/pagination.less";
+@import "bootstrap/pager.less";
+
+// Components: Popovers
+@import "bootstrap/modals.less";
+@import "bootstrap/tooltip.less";
+@import "bootstrap/popovers.less";
+
+// Components: Misc
+@import "bootstrap/thumbnails.less";
+@import "bootstrap/labels-badges.less";
+@import "bootstrap/progress-bars.less";
+@import "bootstrap/accordion.less";
+@import "bootstrap/carousel.less";
+@import "bootstrap/hero-unit.less";
+
+// Utility classes
+@import "bootstrap/utilities.less"; // Has to be last to override when necessary
+
+// Responsiveness
+@import "bootstrap/responsive-1200px-min.less";
+
+// Sora theme
+@import "cranefly/header.less";
+@import "cranefly/scaffolding.less";
+@import "cranefly/navbar.less";
+@import "cranefly/breadcrumbs.less";
+@import "cranefly/messages.less";
+@import "cranefly/forms.less";
+@import "cranefly/buttons.less";
+@import "cranefly/pagination.less";
+@import "cranefly/editor.less";
+@import "cranefly/error.less";
+@import "cranefly/markdown.less";
+@import "cranefly/index.less";
+@import "cranefly/signin.less";
+@import "cranefly/usercp.less";
+@import "cranefly/forummap.less";
+@import "cranefly/watchedthreads.less";
+@import "cranefly/alerts.less";
+@import "cranefly/newsfeed.less";
+@import "cranefly/category.less";
+@import "cranefly/profiles.less";
+@import "cranefly/forum.less";
+@import "cranefly/thread.less";
+@import "cranefly/karmas.less";
+@import "cranefly/changelog.less";
+@import "cranefly/report.less";
+@import "cranefly/reports.less";
+@import "cranefly/search.less";
+
+// Keep ranks last for easy overrides!
+@import "ranks.less";
 @import "jquery.Jcrop.min.css";

+ 41 - 41
static/cranefly/css/cranefly/alerts.less

@@ -1,42 +1,42 @@
-// User Alerts
-// -------------------------
-
-.user-alerts {
-  td {
-    vertical-align: middle;
-
-    &.alert-icon {
-      .label {
-        background-color: @gray;
-        border: 1px solid darken(@gray, 15%);
-        border-radius: @baseBorderRadius;
-        padding: 4px;
-        padding-top: 3px;
-
-        i {
-          background-image: url("@{iconWhiteSpritePath}");
-        }
-
-        &.label-warning {
-          background-color: @red;
-          border: 1px solid darken(@red, 15%);
-        }
-      }
-    }
-
-    &.alert-message {
-      color: @gray;
-      font-size: @baseFontSize * 1.2;
-
-      a:link, a:visited {
-        color: @textColor;
-        font-weight: bold;
-      }
-    }
-
-    &.alert-date {
-      color: @grayLight;
-      text-align: right;
-    }
-  }
+// User Alerts
+// -------------------------
+
+.user-alerts {
+  td {
+    vertical-align: middle;
+
+    &.alert-icon {
+      .label {
+        background-color: @gray;
+        border: 1px solid darken(@gray, 15%);
+        border-radius: @baseBorderRadius;
+        padding: 4px;
+        padding-top: 3px;
+
+        i {
+          background-image: url("@{iconWhiteSpritePath}");
+        }
+
+        &.label-warning {
+          background-color: @red;
+          border: 1px solid darken(@red, 15%);
+        }
+      }
+    }
+
+    &.alert-message {
+      color: @gray;
+      font-size: @baseFontSize * 1.2;
+
+      a:link, a:visited {
+        color: @textColor;
+        font-weight: bold;
+      }
+    }
+
+    &.alert-date {
+      color: @grayLight;
+      text-align: right;
+    }
+  }
 }

+ 32 - 32
static/cranefly/css/cranefly/breadcrumbs.less

@@ -1,33 +1,33 @@
-// Breadcrumbs
-// -------------------------
-
-// Footer
-// -------------------------
-footer {
-  .breadcrumb {
-  	background: none;
-  	border: none;
-  	margin: 0px;
-  	padding: 0px;
-
-  	font-weight: bold;
-	text-shadow: none;
-
-    li {
-	  text-shadow: none;
-
-	  a:link, a:active, a:visited, a:hover {
-	    color: @textColor;
-	  }	
-
-	  .divider {
-	  	.opacity(30);
-	  	margin-left: -6px;
-	  }
-
-	  &.active {
-	  	color: @gray;
-	  }
-    }
-  }
+// Breadcrumbs
+// -------------------------
+
+// Footer
+// -------------------------
+footer {
+  .breadcrumb {
+  	background: none;
+  	border: none;
+  	margin: 0px;
+  	padding: 0px;
+
+  	font-weight: bold;
+	text-shadow: none;
+
+    li {
+	  text-shadow: none;
+
+	  a:link, a:active, a:visited, a:hover {
+	    color: @textColor;
+	  }	
+
+	  .divider {
+	  	.opacity(30);
+	  	margin-left: -6px;
+	  }
+
+	  &.active {
+	  	color: @gray;
+	  }
+    }
+  }
 }

+ 164 - 164
static/cranefly/css/cranefly/buttons.less

@@ -1,165 +1,165 @@
-// Buttons styles
-// -------------------------
-
-.btn {
-  background: none;
-  background-color: @bodyBackground;
-  .box-shadow(none);
-
-  font-weight: bold;
-  
-  i {
-    .opacity(60);
-    position: relative;
-    bottom: 1px;
-  }
-
-  &:hover, &:active {
-    background-color: @white;
-    border-color: lighten(@grayLight, 5%);
-  
-    i {
-      .opacity(90);
-    }
-  }
-
-  &.btn-primary {
-    background-color: @bluePale;
-    border-color: darken(@bluePale, 5%);
-
-    text-shadow: 0px 1px 0px darken(@bluePale, 15%);
-
-    &:hover, &:active {
-      &:enabled {
-        background-color: saturate(@bluePale, 20%);
-        border-color: darken(saturate(@bluePale, 20%), 5%);
-      }
-    }
-
-    i {
-      background-image: url("@{iconWhiteSpritePath}");
-    }
-  }
-
-  &.btn-info {
-    background-color: desaturate(@bluePale, 25%);
-    border-color: darken(desaturate(@bluePale, 25%), 5%);
-
-    text-shadow: 0px 1px 0px darken(desaturate(@bluePale, 25%), 15%);
-
-    &:hover, &:active {
-      &:enabled {
-        background-color: desaturate(@bluePale, 10%);
-        border-color: darken(desaturate(@bluePale, 10%), 5%);
-      }
-    }
-
-    i {
-      background-image: url("@{iconWhiteSpritePath}");
-    }
-  }
-
-  &.btn-success {
-    background-color: desaturate(@green, 15%);
-    border-color: darken(desaturate(@green, 15%), 5%);
-
-    text-shadow: 0px 1px 0px darken(@green, 15%);
-
-    &:hover, &:active {
-      &:enabled {
-        background-color: @green;
-        border-color: darken(@green, 5%);
-      }
-    }
-
-    i {
-      background-image: url("@{iconWhiteSpritePath}");
-    }
-  }
-
-  &.btn-warning {
-    background-color: desaturate(@orange, 15%);
-    border-color: darken(desaturate(@orange, 15%), 5%);
-
-    text-shadow: 0px 1px 0px darken(@orange, 15%);
-
-    &:hover, &:active {
-      &:enabled {
-        background-color: @orange;
-        border-color: darken(@orange, 5%);
-      }
-    }
-
-    i {
-      background-image: url("@{iconWhiteSpritePath}");
-    }
-  }
-
-  &.btn-danger {
-    background-color: @red;
-    border-color: darken(@red, 5%);
-
-    text-shadow: 0px 1px 0px darken(@red, 15%);
-
-    &:hover, &:active {
-      &:enabled {
-        background-color: saturate(@red, 20%);
-        border-color: darken(saturate(@red, 20%), 5%);
-      }
-    }
-
-    i {
-      background-image: url("@{iconWhiteSpritePath}");
-    }
-  }
-
-  &.btn-inverse {
-    background-color: @textColor;
-    border-color: darken(@textColor, 5%);
-
-    text-shadow: 0px 1px 0px darken(@textColor, 15%);
-
-    &:hover, &:active {
-      &:enabled {
-        background-color: darken(@textColor, 5%);
-        border-color: darken(@textColor, 10%);
-      }
-    }
-
-    i {
-      background-image: url("@{iconWhiteSpritePath}");
-    }
-  }
-
-  &.btn-link {
-    background: none;
-    border: none;
-    .opacity(70);
-
-    color: @textColor;
-
-    &:hover, &:active, &:focus {
-      &:enabled {
-        .opacity(90);
-        
-        text-decoration: none;
-      }
-    }
-  }
-
-
-  &.btn-primary, &.btn-info, &.btn-success, &.btn-warning, &.btn-danger, &.btn-inverse, &.btn-link {
-    i {
-      .opacity(100);
-    }
-  }
-}
-
-a.btn-link {
-  &:hover, &:active, &:focus {
-    .opacity(90);
-
-    color: @textColor;
-    text-decoration: none;
-  }
+// Buttons styles
+// -------------------------
+
+.btn {
+  background: none;
+  background-color: @bodyBackground;
+  .box-shadow(none);
+
+  font-weight: bold;
+  
+  i {
+    .opacity(60);
+    position: relative;
+    bottom: 1px;
+  }
+
+  &:hover, &:active {
+    background-color: @white;
+    border-color: lighten(@grayLight, 5%);
+  
+    i {
+      .opacity(90);
+    }
+  }
+
+  &.btn-primary {
+    background-color: @bluePale;
+    border-color: darken(@bluePale, 5%);
+
+    text-shadow: 0px 1px 0px darken(@bluePale, 15%);
+
+    &:hover, &:active {
+      &:enabled {
+        background-color: saturate(@bluePale, 20%);
+        border-color: darken(saturate(@bluePale, 20%), 5%);
+      }
+    }
+
+    i {
+      background-image: url("@{iconWhiteSpritePath}");
+    }
+  }
+
+  &.btn-info {
+    background-color: desaturate(@bluePale, 25%);
+    border-color: darken(desaturate(@bluePale, 25%), 5%);
+
+    text-shadow: 0px 1px 0px darken(desaturate(@bluePale, 25%), 15%);
+
+    &:hover, &:active {
+      &:enabled {
+        background-color: desaturate(@bluePale, 10%);
+        border-color: darken(desaturate(@bluePale, 10%), 5%);
+      }
+    }
+
+    i {
+      background-image: url("@{iconWhiteSpritePath}");
+    }
+  }
+
+  &.btn-success {
+    background-color: desaturate(@green, 15%);
+    border-color: darken(desaturate(@green, 15%), 5%);
+
+    text-shadow: 0px 1px 0px darken(@green, 15%);
+
+    &:hover, &:active {
+      &:enabled {
+        background-color: @green;
+        border-color: darken(@green, 5%);
+      }
+    }
+
+    i {
+      background-image: url("@{iconWhiteSpritePath}");
+    }
+  }
+
+  &.btn-warning {
+    background-color: desaturate(@orange, 15%);
+    border-color: darken(desaturate(@orange, 15%), 5%);
+
+    text-shadow: 0px 1px 0px darken(@orange, 15%);
+
+    &:hover, &:active {
+      &:enabled {
+        background-color: @orange;
+        border-color: darken(@orange, 5%);
+      }
+    }
+
+    i {
+      background-image: url("@{iconWhiteSpritePath}");
+    }
+  }
+
+  &.btn-danger {
+    background-color: @red;
+    border-color: darken(@red, 5%);
+
+    text-shadow: 0px 1px 0px darken(@red, 15%);
+
+    &:hover, &:active {
+      &:enabled {
+        background-color: saturate(@red, 20%);
+        border-color: darken(saturate(@red, 20%), 5%);
+      }
+    }
+
+    i {
+      background-image: url("@{iconWhiteSpritePath}");
+    }
+  }
+
+  &.btn-inverse {
+    background-color: @textColor;
+    border-color: darken(@textColor, 5%);
+
+    text-shadow: 0px 1px 0px darken(@textColor, 15%);
+
+    &:hover, &:active {
+      &:enabled {
+        background-color: darken(@textColor, 5%);
+        border-color: darken(@textColor, 10%);
+      }
+    }
+
+    i {
+      background-image: url("@{iconWhiteSpritePath}");
+    }
+  }
+
+  &.btn-link {
+    background: none;
+    border: none;
+    .opacity(70);
+
+    color: @textColor;
+
+    &:hover, &:active, &:focus {
+      &:enabled {
+        .opacity(90);
+        
+        text-decoration: none;
+      }
+    }
+  }
+
+
+  &.btn-primary, &.btn-info, &.btn-success, &.btn-warning, &.btn-danger, &.btn-inverse, &.btn-link {
+    i {
+      .opacity(100);
+    }
+  }
+}
+
+a.btn-link {
+  &:hover, &:active, &:focus {
+    .opacity(90);
+
+    color: @textColor;
+    text-decoration: none;
+  }
 }

+ 259 - 259
static/cranefly/css/cranefly/category.less

@@ -1,260 +1,260 @@
-// Category view
-// -------------------------
-
-.category-forums-list {
-  background-color: @categoryBackground;
-  border: 1px solid @categoryBorder;
-  border-radius: @borderRadiusSmall;
-  .box-shadow(0px 0px 0px 3px @categoryShadow);
-  margin-bottom: @baseLineHeight;
-
-  .header {
-    background-color: @categoryHeader;
-    border: 1px solid @categoryBorder;
-    border-radius: @borderRadiusSmall @borderRadiusSmall 0px 0px;
-    margin: -1px;
-    margin-bottom: 0px;
-    padding: (@fontSizeSmall / 3) (@fontSizeSmall - 2px);
-
-    h2 {
-      margin: 0px;
-      padding: 0px;
-
-      color: @grayDark;
-      font-size: @fontSizeSmall;
-      font-weight: bold;
-      line-height: @baseLineHeight;
-      text-align: left;
-
-      small {
-        margin-left: @baseFontSize / 2;
-
-        color: @grayLight;
-        font-size: @fontSizeSmall;
-      }
-    }
-  }
-
-  .forum {
-    border-bottom: 1px solid @categoryBorder;
-    height: 21px;
-    overflow: visible;
-    padding: ((@fontSizeLarge / 2) + 6px) (@fontSizeSmall - 2px);
-
-    &.last {
-      border-bottom: none;
-    }
-
-    .forum-icon {
-      float: left;
-
-      .forum-icon-wrap {
-        background-color: @itemOldColor;
-        border: 1px solid darken(@itemOldColor, 10%);
-        border-radius: @baseBorderRadius;
-        padding: ((@forumIconSize - 22px) / 2) ((@forumIconSize - 16px) / 2);
-        position: relative;
-        bottom: (@forumIconSize - @baseLineHeight) / 2;
-
-        &.forum-icon-new {
-          background-color: @itemNewColor;
-          border: 1px solid darken(@itemNewColor, 10%);
-        }
-
-        &.forum-icon-redirect {
-          background-color: @itemMovedColor;
-          border: 1px solid darken(@itemMovedColor, 10%);
-        }
-      }
-    }
-
-    .forum-main {
-      margin-left: @forumIconSize + 10px;
-
-      h3 {
-        float: left;
-        margin: 0px;
-        padding: 0px;
-
-        font-size: @fontSizeLarge;
-        font-weight: normal;
-        line-height: @baseLineHeight;
-
-        a:link, a:visited {
-          color: @textColor;
-        }
-      }
-
-      .dropdown {
-        float: right;
-        right: @baseFontSize;
-
-        .subforum {
-          &:link, &:visited {
-            color: @grayLight;
-            font-weight: bold;
-          }
-
-          &:hover, &:active {
-            color: @textColor;
-          }
-        }
-
-        .dropdown-toggle {
-          padding: 4px 8px;
-          .opacity(60);
-
-          color: @textColor;
-          font-weight: bold;
-
-          &:hover, &:active, &:focus {
-            .opacity(100);
-
-            text-decoration: none;
-          }
-        }
-
-        &.open .dropdown-toggle {
-          background-color: @categoryShadow;
-          border-radius: @baseBorderRadius @baseBorderRadius 0px 0px;
-          .opacity(100);
-          padding-bottom: 6px;
-
-          text-decoration: none;
-        }
-
-        .dropdown-menu {
-          background: none;
-          border: none;
-          box-shadow: none;
-
-          .dropdown-shadow{
-            border-radius: @baseBorderRadius;
-            .box-shadow(0px 0px 3px @grayLight);
-            width: 256px;
-            position: relative;
-            right: 0px;
-            top: -4px;
-
-            ul {
-              background-color: @bodyBackground;
-              border-radius: @baseBorderRadius;
-              margin: 0px;
-              padding: 0px;
-
-              li {
-                margin: 0px;
-                padding: 0px;
-                list-style: none;
-
-                a {
-                  border-bottom: 1px dotted @categoryBorder;
-                  display: block;
-                  .opacity(70);
-                  padding: 6px 8px;
-
-                  color: @textColor;
-                  text-decoration: none;
-
-                  &:hover, &:active {
-                    .opacity(100);
-                  }
-                }
-
-                &:last-child a {
-                  border-bottom: none;
-                }
-              }
-            }
-          }
-        }
-      }
-
-      .forum-details {
-        border-left: 1px dotted darken(@categoryBackground, 12%);
-        float: right;
-        margin: -10px 0px;
-        margin-top: ((@baseFontSize - @fontSizeSmall) * -1) - 6px;
-        padding-left: @baseFontSize;
-        height: 35px;
-        width: 220px;
-
-        .thread-name {
-          a:link, a:active, a:visited, a:hover {
-            margin-bottom: 1px;
-
-            color: @textColor;
-            font-size: @fontSizeSmall;
-            font-weight: bold;
-          }
-        }
-
-        .muted {
-          font-size: @fontSizeMini;
-          line-height: @fontSizeMini;
-
-          .last-poster, a:link, a:active, a:visited, a:hover {
-            color: @gray;
-          }
-        }
-
-        em {
-          position: relative;
-          top: (35px - @baseLineHeight) / 2;
-
-          color: @grayLight;
-
-          strong {
-            color: @textColor;
-            font-weight: normal;
-          }
-        }
-      }
-
-      .forum-meta-tooltip {
-        .tooltip-inner {
-          max-width: 400px;
-          text-align: left;
-
-          .forum-stats {
-            color: @grayLight;
-            font-size: @fontSizeMini;
-
-            strong {
-              color: @white;
-            }
-
-            span {
-              margin-right: @baseFontSize;
-            }
-          }
-
-          .forum-description {
-            clear: both;
-            margin: 0px;
-            margin-bottom: @baseFontSize / 2;
-            padding: 0px;
-
-            color: @grayLighter;
-            font-size: @baseFontSize;
-          }
-        }
-      }
-    }
-  }
-
-  &.category-forums-important {
-    border-color: @red;
-    .box-shadow(0px 0px 0px 3px darken(@red, 10%));
-  }
-
-  &.category-forums-inverse {
-    border-color: @grayDark;
-    .box-shadow(0px 0px 0px 3px darken(@grayDark, 10%));
-  }
-
-  &.category-forums-info {
-    border-color: @bluePale;
-    .box-shadow(0px 0px 0px 3px darken(@bluePale, 10%));
-  }
+// Category view
+// -------------------------
+
+.category-forums-list {
+  background-color: @categoryBackground;
+  border: 1px solid @categoryBorder;
+  border-radius: @borderRadiusSmall;
+  .box-shadow(0px 0px 0px 3px @categoryShadow);
+  margin-bottom: @baseLineHeight;
+
+  .header {
+    background-color: @categoryHeader;
+    border: 1px solid @categoryBorder;
+    border-radius: @borderRadiusSmall @borderRadiusSmall 0px 0px;
+    margin: -1px;
+    margin-bottom: 0px;
+    padding: (@fontSizeSmall / 3) (@fontSizeSmall - 2px);
+
+    h2 {
+      margin: 0px;
+      padding: 0px;
+
+      color: @grayDark;
+      font-size: @fontSizeSmall;
+      font-weight: bold;
+      line-height: @baseLineHeight;
+      text-align: left;
+
+      small {
+        margin-left: @baseFontSize / 2;
+
+        color: @grayLight;
+        font-size: @fontSizeSmall;
+      }
+    }
+  }
+
+  .forum {
+    border-bottom: 1px solid @categoryBorder;
+    height: 21px;
+    overflow: visible;
+    padding: ((@fontSizeLarge / 2) + 6px) (@fontSizeSmall - 2px);
+
+    &.last {
+      border-bottom: none;
+    }
+
+    .forum-icon {
+      float: left;
+
+      .forum-icon-wrap {
+        background-color: @itemOldColor;
+        border: 1px solid darken(@itemOldColor, 10%);
+        border-radius: @baseBorderRadius;
+        padding: ((@forumIconSize - 22px) / 2) ((@forumIconSize - 16px) / 2);
+        position: relative;
+        bottom: (@forumIconSize - @baseLineHeight) / 2;
+
+        &.forum-icon-new {
+          background-color: @itemNewColor;
+          border: 1px solid darken(@itemNewColor, 10%);
+        }
+
+        &.forum-icon-redirect {
+          background-color: @itemMovedColor;
+          border: 1px solid darken(@itemMovedColor, 10%);
+        }
+      }
+    }
+
+    .forum-main {
+      margin-left: @forumIconSize + 10px;
+
+      h3 {
+        float: left;
+        margin: 0px;
+        padding: 0px;
+
+        font-size: @fontSizeLarge;
+        font-weight: normal;
+        line-height: @baseLineHeight;
+
+        a:link, a:visited {
+          color: @textColor;
+        }
+      }
+
+      .dropdown {
+        float: right;
+        right: @baseFontSize;
+
+        .subforum {
+          &:link, &:visited {
+            color: @grayLight;
+            font-weight: bold;
+          }
+
+          &:hover, &:active {
+            color: @textColor;
+          }
+        }
+
+        .dropdown-toggle {
+          padding: 4px 8px;
+          .opacity(60);
+
+          color: @textColor;
+          font-weight: bold;
+
+          &:hover, &:active, &:focus {
+            .opacity(100);
+
+            text-decoration: none;
+          }
+        }
+
+        &.open .dropdown-toggle {
+          background-color: @categoryShadow;
+          border-radius: @baseBorderRadius @baseBorderRadius 0px 0px;
+          .opacity(100);
+          padding-bottom: 6px;
+
+          text-decoration: none;
+        }
+
+        .dropdown-menu {
+          background: none;
+          border: none;
+          box-shadow: none;
+
+          .dropdown-shadow{
+            border-radius: @baseBorderRadius;
+            .box-shadow(0px 0px 3px @grayLight);
+            width: 256px;
+            position: relative;
+            right: 0px;
+            top: -4px;
+
+            ul {
+              background-color: @bodyBackground;
+              border-radius: @baseBorderRadius;
+              margin: 0px;
+              padding: 0px;
+
+              li {
+                margin: 0px;
+                padding: 0px;
+                list-style: none;
+
+                a {
+                  border-bottom: 1px dotted @categoryBorder;
+                  display: block;
+                  .opacity(70);
+                  padding: 6px 8px;
+
+                  color: @textColor;
+                  text-decoration: none;
+
+                  &:hover, &:active {
+                    .opacity(100);
+                  }
+                }
+
+                &:last-child a {
+                  border-bottom: none;
+                }
+              }
+            }
+          }
+        }
+      }
+
+      .forum-details {
+        border-left: 1px dotted darken(@categoryBackground, 12%);
+        float: right;
+        margin: -10px 0px;
+        margin-top: ((@baseFontSize - @fontSizeSmall) * -1) - 6px;
+        padding-left: @baseFontSize;
+        height: 35px;
+        width: 220px;
+
+        .thread-name {
+          a:link, a:active, a:visited, a:hover {
+            margin-bottom: 1px;
+
+            color: @textColor;
+            font-size: @fontSizeSmall;
+            font-weight: bold;
+          }
+        }
+
+        .muted {
+          font-size: @fontSizeMini;
+          line-height: @fontSizeMini;
+
+          .last-poster, a:link, a:active, a:visited, a:hover {
+            color: @gray;
+          }
+        }
+
+        em {
+          position: relative;
+          top: (35px - @baseLineHeight) / 2;
+
+          color: @grayLight;
+
+          strong {
+            color: @textColor;
+            font-weight: normal;
+          }
+        }
+      }
+
+      .forum-meta-tooltip {
+        .tooltip-inner {
+          max-width: 400px;
+          text-align: left;
+
+          .forum-stats {
+            color: @grayLight;
+            font-size: @fontSizeMini;
+
+            strong {
+              color: @white;
+            }
+
+            span {
+              margin-right: @baseFontSize;
+            }
+          }
+
+          .forum-description {
+            clear: both;
+            margin: 0px;
+            margin-bottom: @baseFontSize / 2;
+            padding: 0px;
+
+            color: @grayLighter;
+            font-size: @baseFontSize;
+          }
+        }
+      }
+    }
+  }
+
+  &.category-forums-important {
+    border-color: @red;
+    .box-shadow(0px 0px 0px 3px darken(@red, 10%));
+  }
+
+  &.category-forums-inverse {
+    border-color: @grayDark;
+    .box-shadow(0px 0px 0px 3px darken(@grayDark, 10%));
+  }
+
+  &.category-forums-info {
+    border-color: @bluePale;
+    .box-shadow(0px 0px 0px 3px darken(@bluePale, 10%));
+  }
 }

+ 132 - 132
static/cranefly/css/cranefly/changelog.less

@@ -1,133 +1,133 @@
-// Post Changelog
-// -------------------------
-
-.post-changelog {
-  table {
-    td {
-      vertical-align: middle;
-
-      .change-added, .change-removed, .change-none {
-        display: block;
-        font-size: @baseFontSize * 2;
-        font-weight: bold;
-        text-align: right;
-
-        &.change-small {
-          font-size: @baseFontSize;
-        }
-      }
-
-      .change-neutral {
-        color: @gray;
-      }
-
-      .change-added {
-        color: @green;
-      }
-
-      .change-removed {
-        color: @red;
-      }
-
-      .change-reason {
-        a:link, a:active, a:visited, a:hover {
-          color: @textColor;
-          font-weight: bold;
-        }
-      }
-
-      .change-no {
-        &:link, &:active, &:visited, &:hover {
-          float: right;
-
-          color: @gray;
-          font-weight: bold;
-        }
-      }
-
-      .change-description {
-        float: left;
-
-        font-size: @fontSizeSmall;
-
-        a:link, a:active, a:visited, a:hover {
-          color: @textColor;
-        }
-
-        .change-details {
-          color: @grayLight;
-
-          a:link, a:visited {
-            color: @gray;
-          }
-        }
-      }
-    }
-  }
-}
-
-.post-diff {
-  .diff-extra {
-    overflow: auto;
-  }
-
-  .post-diff-details {
-    background-color: @white;
-    border: 1px solid @categoryBorder;
-    border-radius: @borderRadiusSmall;
-    .box-shadow(0px 0px 0px 3px @categoryShadow);
-    margin-bottom: @baseLineHeight;
-
-    table {
-      margin: 0px;
-      width: 100%;
-
-      td {
-        padding: 1px 4px;
-
-        &.line {
-          background-color: @categoryShadow;
-          border-right: 1px solid @categoryBorder;
-          padding-left: @baseFontSize;
-          width: 1%;
-
-          text-align: right;
-
-          a:link, a:active, a:visited, a:hover {
-            color: @grayLight;
-          }
-        }
-
-        &.even {
-          background-color: darken(@white, 3%);
-        }
-
-        &.added {
-          background-color: lighten(@green, 45%);
-
-          color: darken(@green, 20%);
-          font-weight: bold;
-
-          &.even {
-            background-color: lighten(@green, 40%);
-          }
-        }
-
-        &.removed {
-          background-color: lighten(@red, 45%);
-
-          color: darken(@red, 20%);
-          font-weight: bold;
-
-          &.even {
-            background-color: lighten(@red, 40%);
-          }
-        }
-
-        &.stag {
-          color: @gray;
-        }
-      }
-    }
-  }
+// Post Changelog
+// -------------------------
+
+.post-changelog {
+  table {
+    td {
+      vertical-align: middle;
+
+      .change-added, .change-removed, .change-none {
+        display: block;
+        font-size: @baseFontSize * 2;
+        font-weight: bold;
+        text-align: right;
+
+        &.change-small {
+          font-size: @baseFontSize;
+        }
+      }
+
+      .change-neutral {
+        color: @gray;
+      }
+
+      .change-added {
+        color: @green;
+      }
+
+      .change-removed {
+        color: @red;
+      }
+
+      .change-reason {
+        a:link, a:active, a:visited, a:hover {
+          color: @textColor;
+          font-weight: bold;
+        }
+      }
+
+      .change-no {
+        &:link, &:active, &:visited, &:hover {
+          float: right;
+
+          color: @gray;
+          font-weight: bold;
+        }
+      }
+
+      .change-description {
+        float: left;
+
+        font-size: @fontSizeSmall;
+
+        a:link, a:active, a:visited, a:hover {
+          color: @textColor;
+        }
+
+        .change-details {
+          color: @grayLight;
+
+          a:link, a:visited {
+            color: @gray;
+          }
+        }
+      }
+    }
+  }
+}
+
+.post-diff {
+  .diff-extra {
+    overflow: auto;
+  }
+
+  .post-diff-details {
+    background-color: @white;
+    border: 1px solid @categoryBorder;
+    border-radius: @borderRadiusSmall;
+    .box-shadow(0px 0px 0px 3px @categoryShadow);
+    margin-bottom: @baseLineHeight;
+
+    table {
+      margin: 0px;
+      width: 100%;
+
+      td {
+        padding: 1px 4px;
+
+        &.line {
+          background-color: @categoryShadow;
+          border-right: 1px solid @categoryBorder;
+          padding-left: @baseFontSize;
+          width: 1%;
+
+          text-align: right;
+
+          a:link, a:active, a:visited, a:hover {
+            color: @grayLight;
+          }
+        }
+
+        &.even {
+          background-color: darken(@white, 3%);
+        }
+
+        &.added {
+          background-color: lighten(@green, 45%);
+
+          color: darken(@green, 20%);
+          font-weight: bold;
+
+          &.even {
+            background-color: lighten(@green, 40%);
+          }
+        }
+
+        &.removed {
+          background-color: lighten(@red, 45%);
+
+          color: darken(@red, 20%);
+          font-weight: bold;
+
+          &.even {
+            background-color: lighten(@red, 40%);
+          }
+        }
+
+        &.stag {
+          color: @gray;
+        }
+      }
+    }
+  }
 }

+ 70 - 70
static/cranefly/css/cranefly/editor.less

@@ -1,71 +1,71 @@
-// Editor style
-// -------------------------
-
-.editor {
-  background-color: @editorBackground;
-  border: 1px solid darken(@editorBackground, 10%);
-  border-radius: @baseBorderRadius;
-
-  .editor-error {
-    padding: @editorPadding;
-    padding-bottom: 0px;
-    margin-bottom: @editorPadding * -1;
-
-    .help-block {
-      color: @red;
-      font-weight: bold;
-    }
-  }
-
-  .editor-input {
-    padding: @editorPadding;
-
-    &>div {
-      margin-right: 2px;
-
-      textarea {
-        border: none;
-        box-shadow: none;
-        margin: @editorPadding * -1;
-        padding: @editorPadding;
-        width: 100%;
-
-        font-family: @monoFontFamily;
-      } 
-    }
-  }
-
-  .editor-actions {
-    border-top: 1px solid darken(@editorBackground, 10%);
-    overflow: auto;
-    padding: @editorPadding;
-
-    &>.btn {
-      margin-left: @baseFontSize;
-    }
-
-    .editor-tools {
-      margin: 0px;
-
-      li {
-        float: left;
-        margin-right: @editorPadding;
-
-        .btn {
-          padding-left: 7px;
-          padding-right: 7px;
-        }
-      }
-    }
-  }
-}
-
-.form-container {
-  .editor {
-    border-color: darken(@editorBackground, 20%);
-
-    .editor-actions {
-      border-top-color: darken(@editorBackground, 20%);
-    }
-  }
+// Editor style
+// -------------------------
+
+.editor {
+  background-color: @editorBackground;
+  border: 1px solid darken(@editorBackground, 10%);
+  border-radius: @baseBorderRadius;
+
+  .editor-error {
+    padding: @editorPadding;
+    padding-bottom: 0px;
+    margin-bottom: @editorPadding * -1;
+
+    .help-block {
+      color: @red;
+      font-weight: bold;
+    }
+  }
+
+  .editor-input {
+    padding: @editorPadding;
+
+    &>div {
+      margin-right: 2px;
+
+      textarea {
+        border: none;
+        box-shadow: none;
+        margin: @editorPadding * -1;
+        padding: @editorPadding;
+        width: 100%;
+
+        font-family: @monoFontFamily;
+      } 
+    }
+  }
+
+  .editor-actions {
+    border-top: 1px solid darken(@editorBackground, 10%);
+    overflow: auto;
+    padding: @editorPadding;
+
+    &>.btn {
+      margin-left: @baseFontSize;
+    }
+
+    .editor-tools {
+      margin: 0px;
+
+      li {
+        float: left;
+        margin-right: @editorPadding;
+
+        .btn {
+          padding-left: 7px;
+          padding-right: 7px;
+        }
+      }
+    }
+  }
+}
+
+.form-container {
+  .editor {
+    border-color: darken(@editorBackground, 20%);
+
+    .editor-actions {
+      border-top-color: darken(@editorBackground, 20%);
+    }
+  }
 }

+ 55 - 55
static/cranefly/css/cranefly/error.less

@@ -1,56 +1,56 @@
-// Error pages
-// -------------------------
-
-.error-page {
-	text-align: center;
-
-	.error-color {
-		color: @red;
-	}
-
-	.error-ban-reason {
-		border: 1px solid @red;
-		border-radius: @baseBorderRadius;
-		background-color: lighten(@red, 46%);
-		background-image: repeating-linear-gradient(45deg, transparent, transparent 5px, lighten(@red, 48%) 5px, lighten(@red, 48%) 10px);
-		.box-shadow(0px 0px 0px 3px lighten(@red, 20%));
-		padding: @paddingLarge;
-
-		text-align: left;
-
-		:last-child {
-			margin-bottom: 0px;
-			padding-bottom: 0px;
-		}
-	}
-
-	.error-ban-expires {
-		color: @red;
-		font-weight: bold;
-	}
-
-	.error-protips {
-		margin-top: (@baseLineHeight * 2);
-
-		.go-back {
-			display: none;
-		}
-
-		a:link, a:visited {
-			background-color: @textColor;
-			border: 1px solid @black;
-			border-radius: @borderRadiusLarge;
-			margin: @paddingSmall;
-			.opacity(70);
-			padding: @paddingLarge;
-
-			color: @white;
-			font-weight: bold;
-			text-decoration: none;
-		}
-
-		a:hover, a:active {
-			.opacity(100);
-		}
-	}
+// Error pages
+// -------------------------
+
+.error-page {
+	text-align: center;
+
+	.error-color {
+		color: @red;
+	}
+
+	.error-ban-reason {
+		border: 1px solid @red;
+		border-radius: @baseBorderRadius;
+		background-color: lighten(@red, 46%);
+		background-image: repeating-linear-gradient(45deg, transparent, transparent 5px, lighten(@red, 48%) 5px, lighten(@red, 48%) 10px);
+		.box-shadow(0px 0px 0px 3px lighten(@red, 20%));
+		padding: @paddingLarge;
+
+		text-align: left;
+
+		:last-child {
+			margin-bottom: 0px;
+			padding-bottom: 0px;
+		}
+	}
+
+	.error-ban-expires {
+		color: @red;
+		font-weight: bold;
+	}
+
+	.error-protips {
+		margin-top: (@baseLineHeight * 2);
+
+		.go-back {
+			display: none;
+		}
+
+		a:link, a:visited {
+			background-color: @textColor;
+			border: 1px solid @black;
+			border-radius: @borderRadiusLarge;
+			margin: @paddingSmall;
+			.opacity(70);
+			padding: @paddingLarge;
+
+			color: @white;
+			font-weight: bold;
+			text-decoration: none;
+		}
+
+		a:hover, a:active {
+			.opacity(100);
+		}
+	}
 }

+ 109 - 109
static/cranefly/css/cranefly/forms.less

@@ -1,110 +1,110 @@
-// Forms themes
-// -------------------------
-
-// Full-page form
-// -------------------------
-.form-container {
-  background: @white;
-  border: 1px solid darken(@bodyBackground, 8%);
-  border-radius: @baseBorderRadius;
-  margin: 0px ((@baseLineHeight * -1) - 1px);
-  margin-bottom: @baseLineHeight;
-  padding: @baseLineHeight;
-  padding-top: @baseLineHeight * -0.75;
-
-  .form-header {
-  	border-bottom: 1px solid darken(@bodyBackground, 8%);
-  	margin-top: @baseLineHeight * -1;
-  	margin-bottom: @baseLineHeight;
-  	padding: (@baseLineHeight / 2) 0px;
-
-  	h1 {
-  	  margin: 0px;
-  	  padding: 0px;
-
-  	  font-size: @fontSizeLarge;
-
-      small {
-        font-size: @fontSizeLarge * 0.75;
-        font-weight: bold;
-      }
-  	}
-
-    .btn {
-      margin-left: @baseFontSize;
-      position: relative;
-      bottom: @baseLineHeight * 1.5;
-    }
-  }
-
-  .form-preview {
-    background-color: @bodyBackground;
-    border: 1px solid darken(@bodyBackground, 8%);
-    border-radius: @baseBorderRadius;
-    margin-bottom: @baseLineHeight;
-    padding: @baseLineHeight;
-  }
-
-  form {
-  	margin: 0px;
-
-  	fieldset {
-  	  border-top: 1px solid darken(@bodyBackground, 8%);
-  	  padding-top: @baseLineHeight * 0.5;
-
-      legend {
-        margin-bottom: @baseLineHeight * -0.5;
-
-        color: @grayLight;
-        font-size: @baseFontSize;
-        font-weight: bold;
-
-        div {
-          margin-bottom: @baseLineHeight * -0.5;
-        }
-      }
-
-  	  &.first {
-  	  	border-top: none;
-  	  	padding-top: 0px;
-  	  }
-  	}
-
-  	.control-label {
-  	  font-weight: bold;
-  	}
-
-  	&.form-horizontal {
-  		fieldset {
-  			&.last {
-  		    .control-group:last-child {
-  		  		margin-bottom: 0px;
-  		  		padding-bottom: 0px;
-  		    }
-  		  }
-  		}
-
-		  .form-actions {
-	      padding-left: @horizontalComponentOffset + @baseLineHeight;
-		  }
-	  }
-  }
-
-  .form-actions {
-		border-radius: 0px 0px @baseBorderRadius @baseBorderRadius;
-		margin: (@baseLineHeight * -1);
-		margin-top: @baseLineHeight * 0.5;
-
-    .form-actions-protip {
-      margin-left: @baseFontSize;
-
-      color: @gray;
-      font-weight: bold;
-    }
-  }
-}
-
-// Only v-resize textareas
-textarea {
-  resize: vertical;
+// Forms themes
+// -------------------------
+
+// Full-page form
+// -------------------------
+.form-container {
+  background: @white;
+  border: 1px solid darken(@bodyBackground, 8%);
+  border-radius: @baseBorderRadius;
+  margin: 0px ((@baseLineHeight * -1) - 1px);
+  margin-bottom: @baseLineHeight;
+  padding: @baseLineHeight;
+  padding-top: @baseLineHeight * -0.75;
+
+  .form-header {
+  	border-bottom: 1px solid darken(@bodyBackground, 8%);
+  	margin-top: @baseLineHeight * -1;
+  	margin-bottom: @baseLineHeight;
+  	padding: (@baseLineHeight / 2) 0px;
+
+  	h1 {
+  	  margin: 0px;
+  	  padding: 0px;
+
+  	  font-size: @fontSizeLarge;
+
+      small {
+        font-size: @fontSizeLarge * 0.75;
+        font-weight: bold;
+      }
+  	}
+
+    .btn {
+      margin-left: @baseFontSize;
+      position: relative;
+      bottom: @baseLineHeight * 1.5;
+    }
+  }
+
+  .form-preview {
+    background-color: @bodyBackground;
+    border: 1px solid darken(@bodyBackground, 8%);
+    border-radius: @baseBorderRadius;
+    margin-bottom: @baseLineHeight;
+    padding: @baseLineHeight;
+  }
+
+  form {
+  	margin: 0px;
+
+  	fieldset {
+  	  border-top: 1px solid darken(@bodyBackground, 8%);
+  	  padding-top: @baseLineHeight * 0.5;
+
+      legend {
+        margin-bottom: @baseLineHeight * -0.5;
+
+        color: @grayLight;
+        font-size: @baseFontSize;
+        font-weight: bold;
+
+        div {
+          margin-bottom: @baseLineHeight * -0.5;
+        }
+      }
+
+  	  &.first {
+  	  	border-top: none;
+  	  	padding-top: 0px;
+  	  }
+  	}
+
+  	.control-label {
+  	  font-weight: bold;
+  	}
+
+  	&.form-horizontal {
+  		fieldset {
+  			&.last {
+  		    .control-group:last-child {
+  		  		margin-bottom: 0px;
+  		  		padding-bottom: 0px;
+  		    }
+  		  }
+  		}
+
+		  .form-actions {
+	      padding-left: @horizontalComponentOffset + @baseLineHeight;
+		  }
+	  }
+  }
+
+  .form-actions {
+		border-radius: 0px 0px @baseBorderRadius @baseBorderRadius;
+		margin: (@baseLineHeight * -1);
+		margin-top: @baseLineHeight * 0.5;
+
+    .form-actions-protip {
+      margin-left: @baseFontSize;
+
+      color: @gray;
+      font-weight: bold;
+    }
+  }
+}
+
+// Only v-resize textareas
+textarea {
+  resize: vertical;
 }

+ 565 - 565
static/cranefly/css/cranefly/forum.less

@@ -1,566 +1,566 @@
-// Forum View
-// -------------------------
-
-// Subforums list
-.forum-subforums-list {
-  background-color: @categoryBackground;
-  border: 1px solid @categoryBorder;
-  border-radius: @borderRadiusSmall;
-  .box-shadow(0px 0px 0px 3px @categoryShadow);
-  margin-bottom: @baseLineHeight;
-
-  .header {
-    background-color: @categoryHeader;
-    border: 1px solid @categoryBorder;
-    border-radius: @borderRadiusSmall @borderRadiusSmall 0px 0px;
-    margin: -1px;
-    margin-bottom: 0px;
-    padding: (@fontSizeSmall / 3) (@fontSizeSmall - 2px);
-
-    h2 {
-      margin: 0px;
-      padding: 0px;
-
-      color: @grayDark;
-      font-size: @fontSizeSmall;
-      font-weight: bold;
-      line-height: @baseLineHeight;
-      text-align: left;
-
-      small {
-        margin-left: @baseFontSize / 2;
-
-        color: @grayLight;
-        font-size: @fontSizeSmall;
-      }
-    }
-  }
-
-  .forum {
-    border-bottom: 1px solid @categoryBorder;
-    height: 21px;
-    overflow: visible;
-    padding: ((@fontSizeLarge / 2) + 6px) (@fontSizeSmall - 2px);
-
-    &.last {
-      border-bottom: none;
-    }
-
-    .forum-icon {
-      float: left;
-
-      .forum-icon-wrap {
-        background-color: @itemOldColor;
-        border: 1px solid darken(@itemOldColor, 10%);
-        border-radius: @baseBorderRadius;
-        padding: ((@forumIconSize - 22px) / 2) ((@forumIconSize - 16px) / 2);
-        position: relative;
-        bottom: (@forumIconSize - @baseLineHeight) / 2;
-
-        &.forum-icon-new {
-          background-color: @itemNewColor;
-          border: 1px solid darken(@itemNewColor, 10%);
-        }
-
-        &.forum-icon-redirect {
-          background-color: @itemMovedColor;
-          border: 1px solid darken(@itemMovedColor, 10%);
-        }
-      }
-    }
-
-    .forum-main {
-      margin-left: 34px;
-
-      h3 {
-        float: left;
-        margin: 0px;
-        padding: 0px;
-
-        font-size: @fontSizeLarge;
-        font-weight: normal;
-        line-height: @baseLineHeight;
-
-        a:link, a:visited {
-          color: @textColor;
-        }
-      }
-
-      .dropdown {
-        float: right;
-        right: @baseFontSize;
-
-        .subforum {
-          &:link, &:visited {
-            color: @grayLight;
-            font-weight: bold;
-          }
-
-          &:hover, &:active {
-            color: @textColor;
-          }
-        }
-
-        .dropdown-toggle {
-          padding: 4px 8px;
-          .opacity(60);
-
-          color: @textColor;
-          font-weight: bold;
-
-          &:hover, &:active, &:focus {
-            .opacity(100);
-
-            text-decoration: none;
-          }
-        }
-
-        &.open .dropdown-toggle {
-          background-color: @categoryShadow;
-          border-radius: @baseBorderRadius @baseBorderRadius 0px 0px;
-          .opacity(100);
-          padding-bottom: 6px;
-
-          text-decoration: none;
-        }
-
-        .dropdown-menu {
-          background: none;
-          border: none;
-          box-shadow: none;
-
-          .dropdown-shadow{
-            border-radius: @baseBorderRadius;
-            .box-shadow(0px 0px 3px @grayLight);
-            width: 256px;
-            position: relative;
-            right: 0px;
-            top: -4px;
-
-            ul {
-              background-color: @bodyBackground;
-              border-radius: @baseBorderRadius;
-              margin: 0px;
-              padding: 0px;
-
-              li {
-                margin: 0px;
-                padding: 0px;
-                list-style: none;
-
-                a {
-                  border-bottom: 1px dotted @categoryBorder;
-                  display: block;
-                  .opacity(70);
-                  padding: 6px 8px;
-
-                  color: @textColor;
-                  text-decoration: none;
-
-                  &:hover, &:active {
-                    .opacity(100);
-                  }
-                }
-
-                &:last-child a {
-                  border-bottom: none;
-                }
-              }
-            }
-          }
-        }
-      }
-
-      .forum-details {
-        border-left: 1px dotted darken(@categoryBackground, 12%);
-        float: right;
-        margin: -10px 0px;
-        margin-top: ((@baseFontSize - @fontSizeSmall) * -1) - 6px;
-        padding-left: @baseFontSize;
-        height: 35px;
-        width: 220px;
-
-        .thread-name {
-          a:link, a:active, a:visited, a:hover {
-            margin-bottom: 1px;
-
-            color: @textColor;
-            font-size: @fontSizeSmall;
-            font-weight: bold;
-          }
-        }
-
-        .muted {
-          font-size: @fontSizeMini;
-          line-height: @fontSizeMini;
-
-          .last-poster, a:link, a:active, a:visited, a:hover {
-            color: @gray;
-          }
-        }
-
-        em {
-          position: relative;
-          top: (35px - @baseLineHeight) / 2;
-
-          color: @grayLight;
-
-          strong {
-            color: @textColor;
-            font-weight: normal;
-          }
-        }
-      }
-
-      .forum-meta-tooltip {
-        .tooltip-inner {
-          max-width: 400px;
-          text-align: left;
-
-          .forum-stats {
-            color: @grayLight;
-            font-size: @fontSizeMini;
-
-            strong {
-              color: @white;
-            }
-
-            span {
-              margin-right: @baseFontSize;
-            }
-          }
-
-          .forum-description {
-            clear: both;
-            margin: 0px;
-            margin-bottom: @baseFontSize / 2;
-            padding: 0px;
-
-            color: @grayLighter;
-            font-size: @baseFontSize;
-          }
-        }
-      }
-    }
-  }
-
-  &.forum-subforums-important {
-    .header {
-      background-color: @red;
-      border: 1px solid darken(@red, 10%);
-
-      h2 {
-        color: @white;
-        text-shadow: 0px 1px 0px darken(@red, 25%);
-
-        small {
-          color: darken(@red, 40%);
-          text-shadow: none;
-        }
-      }
-    }
-  }
-
-  &.forum-subforums-inverse {
-    .header {
-      background-color: @grayDark;
-      border: 1px solid darken(@grayDark, 10%);
-
-      h2 {
-        color: @grayLighter;
-        text-shadow: 0px 1px 0px darken(@black, 25%);
-
-        small {
-          color: lighten(@grayLight, 10%);
-          text-shadow: none;
-        }
-      }
-    }
-  }
-
-  &.forum-subforums-info {
-    .header {
-      background-color: @bluePale;
-      border: 1px solid darken(@bluePale, 10%);
-
-      h2 {
-        color: @white;
-        text-shadow: 0px 1px 0px darken(@bluePale, 25%);
-
-        small {
-          color: darken(@bluePale, 25%);
-          text-shadow: none;
-        }
-      }
-    }
-  }
-}
-
-// Threads list
-.forum-threads-list {
-  background-color: @categoryBackground;
-  border: 1px solid @categoryBorder;
-  border-radius: @borderRadiusSmall;
-  .box-shadow(0px 0px 0px 3px @categoryShadow);
-  margin-bottom: @baseLineHeight;
-
-  .header {
-    background-color: @categoryHeader;
-    border: 1px solid @categoryBorder;
-    border-radius: @borderRadiusSmall @borderRadiusSmall 0px 0px;
-    margin: -1px;
-    margin-bottom: 0px;
-    padding-bottom: 1px;
-    overflow: auto;
-
-    color: @grayLight;
-    font-weight: bold;
-    font-size: @fontSizeSmall;
-
-    .row-fluid {
-      &>div {
-        min-height: auto;
-        padding: @paddingSmall;
-      }
-
-      .thread-replies {
-        float: left;
-        width: 106px;
-      }
-
-      .thread-last {
-        float: left;
-      }
-    }
-
-    .check-cell {
-      label {
-        margin: 0px;
-      }
-    }
-  }
-
-  .thread-row {
-    border-bottom: 1px solid @categoryBorder;
-    height: 38px;
-    overflow: hidden;
-    padding: (@fontSizeSmall - 2px) 0px;
-
-    .row-fluid {
-      &>div {
-        min-height: auto;
-        padding: @paddingSmall;
-        padding-bottom: 0px;
-      }
-    }
-
-    &.thread-last {
-      border-bottom: none;
-
-      &>div {
-        padding-bottom: 1px;
-      }
-    }
-
-    .thread-icon {
-      background-color: @itemOldColor;
-      border: 1px solid darken(@itemOldColor, 10%);
-      .border-radius(@baseBorderRadius);
-      display: block;
-      float: left;
-      margin: -2px 0px;
-      margin-left: -1px;
-      padding: 1px 4px;
-
-      &:hover, &:active {
-        .opacity(100);
-      }
-
-      i {
-        background-image: url("@{iconWhiteSpritePath}");
-      }
-    }
-
-    &.thread-new {
-      .thread-icon {
-        background-color: @itemNewColor;
-        border: 1px solid darken(@itemNewColor, 10%);
-      }
-
-      .thread-name {
-        color: @textColor !important;
-      }
-    }
-
-    &.threads-list-empty {
-      height: auto;
-      padding: @paddingLarge;
-
-      font-size: @fontSizeLarge;
-      text-align: center;
-    }
-
-    .thread-name {
-      margin-left: 10px;
-
-      color: lighten(@textColor, 17%);
-      font-size: @baseFontSize + 2px;
-      font-weight: bold;
-    }
-
-    .thread-details, .thread-last-reply {
-      color: @grayLight;
-      line-height: @baseFontSize;
-
-      a:link, a:visited {
-        color: @textColor;
-      }
-    }
-
-    .thread-details {
-      margin-left: 34px;
-
-      font-size: @fontSizeMini;
-    }
-
-    .thread-flags {
-      float: right;
-      margin: 0px;
-      position: relative;
-      right: -30px;
-      top: 5px;
-      padding: 0px;
-
-      li {
-        .border-radius(@baseBorderRadius);
-        display: block;
-        float: left;
-        margin-left: 3px;
-        padding: 2px 5px;
-
-        &.flag-reported {
-          background-color: @flagReported;
-        }
-
-        &.flag-notreviewed {
-          background-color: @flagReviewed;
-        }
-
-        &.flag-announcement {
-          background-color: @flagAnnouncement;
-        }
-
-        &.flag-sticky {
-          background-color: @flagSticky;
-        }
-
-        &.flag-deleted {
-          background-color: @flagDeleted;
-        }
-
-        &.flag-closed {
-          background-color: @flagClosed;
-        }
-      }
-
-      i {
-        background-image: url("@{iconWhiteSpritePath}");
-      }
-    }
-
-    .thread-activity {
-      border-left: 1px dotted darken(@categoryBackground, 12%);
-      position: relative;
-      bottom: 3px;
-
-      .thread-last-avatar {
-        float: left;
-
-        img {
-          .border-radius(@baseBorderRadius);
-          margin: 0px;
-          margin-right: @baseFontSize;
-          width: 40px;
-          height: 40px;
-        }
-      }
-
-      .thread-replies {
-        float: left;
-        margin-top: -1px;
-        margin-right: @baseFontSize;
-
-        color: @grayLight;
-        font-size: @fontSizeSmall;
-
-        .lead {
-          font-size: @baseFontSize;
-          font-weight: bold;
-          line-height: @baseLineHeight;
-        }
-
-        a:link, a:active, a:visited, a:hover {
-          color: @gray;
-        }
-      }
-
-      .thread-last-reply {
-        border-left: 1px dotted darken(@categoryBackground, 12%);
-        padding-left: @baseFontSize;
-
-      }
-
-      .thread-select {
-        background-color: darken(@categoryBackground, 5%);
-        display: block;
-        float: right;
-        margin: -12px -11px;
-        margin-left: 0px;
-        width: 29px;
-        height: 61px;
-
-        &:hover, &:focus, &:active {
-          background-color: @linkColor;
-        }
-
-        input {
-          margin: 0px;
-          position: relative;
-          right: 2px;
-          top: 26px;
-        }
-      }
-    }
-  }
-
-  .threads-actions {
-    background-color: @bodyBackground;
-    border-top: 1px solid @categoryBorder;
-    border-radius: 0px 0px @borderRadiusSmall @borderRadiusSmall;
-    overflow: auto;
-    padding: 4px;
-
-    color: @grayLight;
-    font-size: @fontSizeSmall;
-
-    form {
-      margin-bottom: 0px;
-    }
-  }
-}
-
-.forum-threads-extra {
-  overflow: auto;
-
-  &.extra-top {
-    margin-bottom: @baseLineHeight;
-  }
-
-  .threads-signin-message {
-    float: right;
-
-    a:link, a:visited {
-      color: @textColor;
-    }
-  }
+// Forum View
+// -------------------------
+
+// Subforums list
+.forum-subforums-list {
+  background-color: @categoryBackground;
+  border: 1px solid @categoryBorder;
+  border-radius: @borderRadiusSmall;
+  .box-shadow(0px 0px 0px 3px @categoryShadow);
+  margin-bottom: @baseLineHeight;
+
+  .header {
+    background-color: @categoryHeader;
+    border: 1px solid @categoryBorder;
+    border-radius: @borderRadiusSmall @borderRadiusSmall 0px 0px;
+    margin: -1px;
+    margin-bottom: 0px;
+    padding: (@fontSizeSmall / 3) (@fontSizeSmall - 2px);
+
+    h2 {
+      margin: 0px;
+      padding: 0px;
+
+      color: @grayDark;
+      font-size: @fontSizeSmall;
+      font-weight: bold;
+      line-height: @baseLineHeight;
+      text-align: left;
+
+      small {
+        margin-left: @baseFontSize / 2;
+
+        color: @grayLight;
+        font-size: @fontSizeSmall;
+      }
+    }
+  }
+
+  .forum {
+    border-bottom: 1px solid @categoryBorder;
+    height: 21px;
+    overflow: visible;
+    padding: ((@fontSizeLarge / 2) + 6px) (@fontSizeSmall - 2px);
+
+    &.last {
+      border-bottom: none;
+    }
+
+    .forum-icon {
+      float: left;
+
+      .forum-icon-wrap {
+        background-color: @itemOldColor;
+        border: 1px solid darken(@itemOldColor, 10%);
+        border-radius: @baseBorderRadius;
+        padding: ((@forumIconSize - 22px) / 2) ((@forumIconSize - 16px) / 2);
+        position: relative;
+        bottom: (@forumIconSize - @baseLineHeight) / 2;
+
+        &.forum-icon-new {
+          background-color: @itemNewColor;
+          border: 1px solid darken(@itemNewColor, 10%);
+        }
+
+        &.forum-icon-redirect {
+          background-color: @itemMovedColor;
+          border: 1px solid darken(@itemMovedColor, 10%);
+        }
+      }
+    }
+
+    .forum-main {
+      margin-left: 34px;
+
+      h3 {
+        float: left;
+        margin: 0px;
+        padding: 0px;
+
+        font-size: @fontSizeLarge;
+        font-weight: normal;
+        line-height: @baseLineHeight;
+
+        a:link, a:visited {
+          color: @textColor;
+        }
+      }
+
+      .dropdown {
+        float: right;
+        right: @baseFontSize;
+
+        .subforum {
+          &:link, &:visited {
+            color: @grayLight;
+            font-weight: bold;
+          }
+
+          &:hover, &:active {
+            color: @textColor;
+          }
+        }
+
+        .dropdown-toggle {
+          padding: 4px 8px;
+          .opacity(60);
+
+          color: @textColor;
+          font-weight: bold;
+
+          &:hover, &:active, &:focus {
+            .opacity(100);
+
+            text-decoration: none;
+          }
+        }
+
+        &.open .dropdown-toggle {
+          background-color: @categoryShadow;
+          border-radius: @baseBorderRadius @baseBorderRadius 0px 0px;
+          .opacity(100);
+          padding-bottom: 6px;
+
+          text-decoration: none;
+        }
+
+        .dropdown-menu {
+          background: none;
+          border: none;
+          box-shadow: none;
+
+          .dropdown-shadow{
+            border-radius: @baseBorderRadius;
+            .box-shadow(0px 0px 3px @grayLight);
+            width: 256px;
+            position: relative;
+            right: 0px;
+            top: -4px;
+
+            ul {
+              background-color: @bodyBackground;
+              border-radius: @baseBorderRadius;
+              margin: 0px;
+              padding: 0px;
+
+              li {
+                margin: 0px;
+                padding: 0px;
+                list-style: none;
+
+                a {
+                  border-bottom: 1px dotted @categoryBorder;
+                  display: block;
+                  .opacity(70);
+                  padding: 6px 8px;
+
+                  color: @textColor;
+                  text-decoration: none;
+
+                  &:hover, &:active {
+                    .opacity(100);
+                  }
+                }
+
+                &:last-child a {
+                  border-bottom: none;
+                }
+              }
+            }
+          }
+        }
+      }
+
+      .forum-details {
+        border-left: 1px dotted darken(@categoryBackground, 12%);
+        float: right;
+        margin: -10px 0px;
+        margin-top: ((@baseFontSize - @fontSizeSmall) * -1) - 6px;
+        padding-left: @baseFontSize;
+        height: 35px;
+        width: 220px;
+
+        .thread-name {
+          a:link, a:active, a:visited, a:hover {
+            margin-bottom: 1px;
+
+            color: @textColor;
+            font-size: @fontSizeSmall;
+            font-weight: bold;
+          }
+        }
+
+        .muted {
+          font-size: @fontSizeMini;
+          line-height: @fontSizeMini;
+
+          .last-poster, a:link, a:active, a:visited, a:hover {
+            color: @gray;
+          }
+        }
+
+        em {
+          position: relative;
+          top: (35px - @baseLineHeight) / 2;
+
+          color: @grayLight;
+
+          strong {
+            color: @textColor;
+            font-weight: normal;
+          }
+        }
+      }
+
+      .forum-meta-tooltip {
+        .tooltip-inner {
+          max-width: 400px;
+          text-align: left;
+
+          .forum-stats {
+            color: @grayLight;
+            font-size: @fontSizeMini;
+
+            strong {
+              color: @white;
+            }
+
+            span {
+              margin-right: @baseFontSize;
+            }
+          }
+
+          .forum-description {
+            clear: both;
+            margin: 0px;
+            margin-bottom: @baseFontSize / 2;
+            padding: 0px;
+
+            color: @grayLighter;
+            font-size: @baseFontSize;
+          }
+        }
+      }
+    }
+  }
+
+  &.forum-subforums-important {
+    .header {
+      background-color: @red;
+      border: 1px solid darken(@red, 10%);
+
+      h2 {
+        color: @white;
+        text-shadow: 0px 1px 0px darken(@red, 25%);
+
+        small {
+          color: darken(@red, 40%);
+          text-shadow: none;
+        }
+      }
+    }
+  }
+
+  &.forum-subforums-inverse {
+    .header {
+      background-color: @grayDark;
+      border: 1px solid darken(@grayDark, 10%);
+
+      h2 {
+        color: @grayLighter;
+        text-shadow: 0px 1px 0px darken(@black, 25%);
+
+        small {
+          color: lighten(@grayLight, 10%);
+          text-shadow: none;
+        }
+      }
+    }
+  }
+
+  &.forum-subforums-info {
+    .header {
+      background-color: @bluePale;
+      border: 1px solid darken(@bluePale, 10%);
+
+      h2 {
+        color: @white;
+        text-shadow: 0px 1px 0px darken(@bluePale, 25%);
+
+        small {
+          color: darken(@bluePale, 25%);
+          text-shadow: none;
+        }
+      }
+    }
+  }
+}
+
+// Threads list
+.forum-threads-list {
+  background-color: @categoryBackground;
+  border: 1px solid @categoryBorder;
+  border-radius: @borderRadiusSmall;
+  .box-shadow(0px 0px 0px 3px @categoryShadow);
+  margin-bottom: @baseLineHeight;
+
+  .header {
+    background-color: @categoryHeader;
+    border: 1px solid @categoryBorder;
+    border-radius: @borderRadiusSmall @borderRadiusSmall 0px 0px;
+    margin: -1px;
+    margin-bottom: 0px;
+    padding-bottom: 1px;
+    overflow: auto;
+
+    color: @grayLight;
+    font-weight: bold;
+    font-size: @fontSizeSmall;
+
+    .row-fluid {
+      &>div {
+        min-height: auto;
+        padding: @paddingSmall;
+      }
+
+      .thread-replies {
+        float: left;
+        width: 106px;
+      }
+
+      .thread-last {
+        float: left;
+      }
+    }
+
+    .check-cell {
+      label {
+        margin: 0px;
+      }
+    }
+  }
+
+  .thread-row {
+    border-bottom: 1px solid @categoryBorder;
+    height: 38px;
+    overflow: hidden;
+    padding: (@fontSizeSmall - 2px) 0px;
+
+    .row-fluid {
+      &>div {
+        min-height: auto;
+        padding: @paddingSmall;
+        padding-bottom: 0px;
+      }
+    }
+
+    &.thread-last {
+      border-bottom: none;
+
+      &>div {
+        padding-bottom: 1px;
+      }
+    }
+
+    .thread-icon {
+      background-color: @itemOldColor;
+      border: 1px solid darken(@itemOldColor, 10%);
+      .border-radius(@baseBorderRadius);
+      display: block;
+      float: left;
+      margin: -2px 0px;
+      margin-left: -1px;
+      padding: 1px 4px;
+
+      &:hover, &:active {
+        .opacity(100);
+      }
+
+      i {
+        background-image: url("@{iconWhiteSpritePath}");
+      }
+    }
+
+    &.thread-new {
+      .thread-icon {
+        background-color: @itemNewColor;
+        border: 1px solid darken(@itemNewColor, 10%);
+      }
+
+      .thread-name {
+        color: @textColor !important;
+      }
+    }
+
+    &.threads-list-empty {
+      height: auto;
+      padding: @paddingLarge;
+
+      font-size: @fontSizeLarge;
+      text-align: center;
+    }
+
+    .thread-name {
+      margin-left: 10px;
+
+      color: lighten(@textColor, 17%);
+      font-size: @baseFontSize + 2px;
+      font-weight: bold;
+    }
+
+    .thread-details, .thread-last-reply {
+      color: @grayLight;
+      line-height: @baseFontSize;
+
+      a:link, a:visited {
+        color: @textColor;
+      }
+    }
+
+    .thread-details {
+      margin-left: 34px;
+
+      font-size: @fontSizeMini;
+    }
+
+    .thread-flags {
+      float: right;
+      margin: 0px;
+      position: relative;
+      right: -30px;
+      top: 5px;
+      padding: 0px;
+
+      li {
+        .border-radius(@baseBorderRadius);
+        display: block;
+        float: left;
+        margin-left: 3px;
+        padding: 2px 5px;
+
+        &.flag-reported {
+          background-color: @flagReported;
+        }
+
+        &.flag-notreviewed {
+          background-color: @flagReviewed;
+        }
+
+        &.flag-announcement {
+          background-color: @flagAnnouncement;
+        }
+
+        &.flag-sticky {
+          background-color: @flagSticky;
+        }
+
+        &.flag-deleted {
+          background-color: @flagDeleted;
+        }
+
+        &.flag-closed {
+          background-color: @flagClosed;
+        }
+      }
+
+      i {
+        background-image: url("@{iconWhiteSpritePath}");
+      }
+    }
+
+    .thread-activity {
+      border-left: 1px dotted darken(@categoryBackground, 12%);
+      position: relative;
+      bottom: 3px;
+
+      .thread-last-avatar {
+        float: left;
+
+        img {
+          .border-radius(@baseBorderRadius);
+          margin: 0px;
+          margin-right: @baseFontSize;
+          width: 40px;
+          height: 40px;
+        }
+      }
+
+      .thread-replies {
+        float: left;
+        margin-top: -1px;
+        margin-right: @baseFontSize;
+
+        color: @grayLight;
+        font-size: @fontSizeSmall;
+
+        .lead {
+          font-size: @baseFontSize;
+          font-weight: bold;
+          line-height: @baseLineHeight;
+        }
+
+        a:link, a:active, a:visited, a:hover {
+          color: @gray;
+        }
+      }
+
+      .thread-last-reply {
+        border-left: 1px dotted darken(@categoryBackground, 12%);
+        padding-left: @baseFontSize;
+
+      }
+
+      .thread-select {
+        background-color: darken(@categoryBackground, 5%);
+        display: block;
+        float: right;
+        margin: -12px -11px;
+        margin-left: 0px;
+        width: 29px;
+        height: 61px;
+
+        &:hover, &:focus, &:active {
+          background-color: @linkColor;
+        }
+
+        input {
+          margin: 0px;
+          position: relative;
+          right: 2px;
+          top: 26px;
+        }
+      }
+    }
+  }
+
+  .threads-actions {
+    background-color: @bodyBackground;
+    border-top: 1px solid @categoryBorder;
+    border-radius: 0px 0px @borderRadiusSmall @borderRadiusSmall;
+    overflow: auto;
+    padding: 4px;
+
+    color: @grayLight;
+    font-size: @fontSizeSmall;
+
+    form {
+      margin-bottom: 0px;
+    }
+  }
+}
+
+.forum-threads-extra {
+  overflow: auto;
+
+  &.extra-top {
+    margin-bottom: @baseLineHeight;
+  }
+
+  .threads-signin-message {
+    float: right;
+
+    a:link, a:visited {
+      color: @textColor;
+    }
+  }
 }

+ 165 - 165
static/cranefly/css/cranefly/forummap.less

@@ -1,166 +1,166 @@
-// Forum Map
-// -------------------------
-
-.forum-map-category {
-  background-color: @categoryBackground;
-  border: 1px solid @categoryBorder;
-  border-radius: @borderRadiusSmall;
-  .box-shadow(0px 0px 0px 3px @categoryShadow);
-  margin-bottom: @baseLineHeight;
-
-  .header {
-    background-color: @categoryHeader;
-    border: 1px solid @categoryBorder;
-    border-radius: @borderRadiusSmall @borderRadiusSmall 0px 0px;
-    margin: -1px;
-    margin-bottom: 0px;
-    padding: (@fontSizeSmall / 3) (@fontSizeSmall - 2px);
-
-    h2 {
-      margin: 0px;
-      padding: 0px;
-
-      color: @grayDark;
-      font-size: @fontSizeSmall;
-      font-weight: bold;
-      line-height: @baseLineHeight;
-      text-align: left;
-
-      small {
-        margin-left: @baseFontSize / 2;
-
-        color: @grayLight;
-        font-size: @fontSizeSmall;
-      }
-    }
-  }
-
-  .forum-map-forum, .forum-map-subforum {
-    border-bottom: 1px solid @categoryBorder;
-    overflow: auto;
-    padding: (@fontSizeSmall / 2) (@fontSizeSmall - 2px);
-
-    h3 {
-      margin: 0px;
-      padding: 0px;
-
-      font-size: @baseFontSize;
-      line-height: @baseLineHeight;
-
-      a:link, a:visited {
-        color: @gray;
-      }
-
-      a:active, a:hover {
-        color: @textColor;
-      }
-    }
-  }
-
-  .forum-map-subforum {
-  	padding-left: @baseLineHeight * 0.75;
-
-  	span {
-  		&.tree-t, &.tree-l, &.tree-s, &.tree-i {
-  			display: inline-block;
-  			height: @baseLineHeight;
-  			width: @baseLineHeight * 0.5;
-  		}
-
-  		&.tree-t {
-  			border-left: 1px solid @grayLight;
-        margin-right: 2px;
-
-  			span {
-  				border-top: 1px solid @grayLight;
-  			  display: inline-block;
-  				height: 1px;
-  				width: 100%;
-  				margin-bottom: 3px;
-  			}
-  		}
-
-  		&.tree-l {
-        margin-right: 4px;
-
-  			span {
-  			  border-left: 1px solid @grayLight;
-  				border-bottom: 1px solid @grayLight;
-  			  display: inline-block;
-  				height: @baseLineHeight * 0.5;
-  				width: 100%;
-  				margin-bottom: 3px;
-  			}
-  		}
-
-  		&.tree-i {
-  			border-left: 1px solid @grayLight;
-  			position: relative;
-  			top: 5px;
-        margin-top: -5px;
-  			margin-right: 4px;
-  		}
-
-  		&.tree-s {
-        height: 1px;
-  			width: (@baseLineHeight * 0.5) + 2px;
-  			margin-right: 4px;
-  		}
-  	}
-  }
-
-  &>div:last-child {
-    border-bottom: none;
-  }
-  
-  &.forum-map-category-important {
-    .header {
-      background-color: @red;
-      border: 1px solid darken(@red, 10%);
-
-      h2 {
-        color: @white;
-        text-shadow: 0px 1px 0px darken(@red, 25%);
-
-        small {
-          color: darken(@red, 40%);
-          text-shadow: none;
-        }
-      }
-    }
-  }
-
-  &.forum-map-category-inverse {
-    .header {
-      background-color: @grayDark;
-      border: 1px solid darken(@grayDark, 10%);
-
-      h2 {
-        color: @grayLighter;
-        text-shadow: 0px 1px 0px darken(@black, 25%);
-
-        small {
-          color: lighten(@grayLight, 10%);
-          text-shadow: none;
-        }
-      }
-    }
-  }
-
-  &.forum-map-category-info {
-    .header {
-      background-color: @bluePale;
-      border: 1px solid darken(@bluePale, 10%);
-
-      h2 {
-        color: @white;
-        text-shadow: 0px 1px 0px darken(@bluePale, 25%);
-
-        small {
-          color: darken(@bluePale, 25%);
-          text-shadow: none;
-        }
-      }
-    }
-  }
+// Forum Map
+// -------------------------
+
+.forum-map-category {
+  background-color: @categoryBackground;
+  border: 1px solid @categoryBorder;
+  border-radius: @borderRadiusSmall;
+  .box-shadow(0px 0px 0px 3px @categoryShadow);
+  margin-bottom: @baseLineHeight;
+
+  .header {
+    background-color: @categoryHeader;
+    border: 1px solid @categoryBorder;
+    border-radius: @borderRadiusSmall @borderRadiusSmall 0px 0px;
+    margin: -1px;
+    margin-bottom: 0px;
+    padding: (@fontSizeSmall / 3) (@fontSizeSmall - 2px);
+
+    h2 {
+      margin: 0px;
+      padding: 0px;
+
+      color: @grayDark;
+      font-size: @fontSizeSmall;
+      font-weight: bold;
+      line-height: @baseLineHeight;
+      text-align: left;
+
+      small {
+        margin-left: @baseFontSize / 2;
+
+        color: @grayLight;
+        font-size: @fontSizeSmall;
+      }
+    }
+  }
+
+  .forum-map-forum, .forum-map-subforum {
+    border-bottom: 1px solid @categoryBorder;
+    overflow: auto;
+    padding: (@fontSizeSmall / 2) (@fontSizeSmall - 2px);
+
+    h3 {
+      margin: 0px;
+      padding: 0px;
+
+      font-size: @baseFontSize;
+      line-height: @baseLineHeight;
+
+      a:link, a:visited {
+        color: @gray;
+      }
+
+      a:active, a:hover {
+        color: @textColor;
+      }
+    }
+  }
+
+  .forum-map-subforum {
+  	padding-left: @baseLineHeight * 0.75;
+
+  	span {
+  		&.tree-t, &.tree-l, &.tree-s, &.tree-i {
+  			display: inline-block;
+  			height: @baseLineHeight;
+  			width: @baseLineHeight * 0.5;
+  		}
+
+  		&.tree-t {
+  			border-left: 1px solid @grayLight;
+        margin-right: 2px;
+
+  			span {
+  				border-top: 1px solid @grayLight;
+  			  display: inline-block;
+  				height: 1px;
+  				width: 100%;
+  				margin-bottom: 3px;
+  			}
+  		}
+
+  		&.tree-l {
+        margin-right: 4px;
+
+  			span {
+  			  border-left: 1px solid @grayLight;
+  				border-bottom: 1px solid @grayLight;
+  			  display: inline-block;
+  				height: @baseLineHeight * 0.5;
+  				width: 100%;
+  				margin-bottom: 3px;
+  			}
+  		}
+
+  		&.tree-i {
+  			border-left: 1px solid @grayLight;
+  			position: relative;
+  			top: 5px;
+        margin-top: -5px;
+  			margin-right: 4px;
+  		}
+
+  		&.tree-s {
+        height: 1px;
+  			width: (@baseLineHeight * 0.5) + 2px;
+  			margin-right: 4px;
+  		}
+  	}
+  }
+
+  &>div:last-child {
+    border-bottom: none;
+  }
+  
+  &.forum-map-category-important {
+    .header {
+      background-color: @red;
+      border: 1px solid darken(@red, 10%);
+
+      h2 {
+        color: @white;
+        text-shadow: 0px 1px 0px darken(@red, 25%);
+
+        small {
+          color: darken(@red, 40%);
+          text-shadow: none;
+        }
+      }
+    }
+  }
+
+  &.forum-map-category-inverse {
+    .header {
+      background-color: @grayDark;
+      border: 1px solid darken(@grayDark, 10%);
+
+      h2 {
+        color: @grayLighter;
+        text-shadow: 0px 1px 0px darken(@black, 25%);
+
+        small {
+          color: lighten(@grayLight, 10%);
+          text-shadow: none;
+        }
+      }
+    }
+  }
+
+  &.forum-map-category-info {
+    .header {
+      background-color: @bluePale;
+      border: 1px solid darken(@bluePale, 10%);
+
+      h2 {
+        color: @white;
+        text-shadow: 0px 1px 0px darken(@bluePale, 25%);
+
+        small {
+          color: darken(@bluePale, 25%);
+          text-shadow: none;
+        }
+      }
+    }
+  }
 }

+ 170 - 170
static/cranefly/css/cranefly/header.less

@@ -1,171 +1,171 @@
-// Primary header
-// -------------------------
-.header-primary {
-  background-color: @pageHeaderBackground;
-  border-bottom: 1px solid @pageHeaderBorder;
-  margin: 0px;
-  margin-top: 0px;
-  padding-top: @baseLineHeight / 2;
-
-  .breadcrumb {
-    background: none;
-    border: none;
-    margin: 0px;
-    margin-bottom: @fontSizeSmall * -0.5;
-    padding: 0px;
-
-    li {
-      font-size: @fontSizeSmall;
-      font-weight: bold;
-      text-shadow: none;
-
-      a:link, a:visited {
-        color: @grayLight;
-      }
-
-      a:hover, a:active {
-        color: @textColor;
-      }
-
-      .divider {
-        padding-left: 0px;
-        padding-right: 0px;
-
-        i {
-          .opacity(20);
-          position: relative;
-          bottom: 1px;
-        }
-      }
-    }
-  }
-
-  h1 {
-    color: @gray;
-    font-size: @fontSizeLarge * 2;
-    font-weight: normal;
-  }
-
-  .header-stats {
-    overflow: visible;
-    margin-bottom: 0px;
-
-    color: @grayLight;
-
-    li {
-      float: left;
-      margin-right: @baseFontSize;
-
-      &>a {
-        color: @grayLight;
-
-        &:hover, &:active {
-          color: @textColor;
-        }
-      }
-
-      &>i {
-        .opacity(50);
-      }
-
-      &.stats-form {
-        float: right;
-
-        form {
-          margin: 0px;
-          margin-bottom: -12px;
-          padding: 0px;
-
-          button {
-            position: relative;
-            bottom: 12px;
-
-            &>i {
-              position: relative;
-              top: 0px;
-            }
-          }
-        }
-      }
-    }
-  }
-
-  .header-tabs {
-    border-bottom: 0px;
-    margin: 0px;
-    margin-top: (@baseLineHeight  * -0.5);
-    position: relative;
-    top: (@baseLineHeight * 0.5) - 1px;
-
-    li {
-      a {
-        &:link, &:visited {
-          background: none;
-          border: none;
-          border-radius: 0px;
-          margin-bottom: 4px;
-          padding: (@baseLineHeight / 3) (@baseLineHeight / 2);
-
-          color: lighten(@gray, 20%);
-          font-weight: bold;
-        }
-
-        &:hover, &:active, a:focus {
-          background: none;
-          border-bottom: 4px solid @gray;
-          margin-bottom: 0px;
-
-          color: @gray;
-        }
-      }
-
-      &.active {
-        a:link, a:visited, a:hover, a:active {
-          background: none;
-          border-bottom: 4px solid @red;
-          margin-bottom: 0px;
-
-          color: @textColor;
-        }
-      }
-
-      .form-inline {
-        margin: 0px;
-        margin-left: @baseFontSize;
-        margin-bottom: 7px;
-
-        .btn-icon {
-          padding-left: 7px;
-          padding-right: 7px;
-        }
-
-        i {
-          position: relative;
-          top: 0px;
-        }
-      }
-
-      & {
-        a.btn {
-          border: 1px solid @btnBorder;
-          *border: 0; // Remove the border to prevent IE7's black border on input:focus
-          border-radius: @baseBorderRadius;
-          margin: 0px;
-          padding: 4px 12px;
-
-          color: @textColor;
-
-          i {
-            position: relative;
-            top: 0px;
-          }
-
-          &:visited, &:hover {
-            background-color: @white;
-            border-color: lighten(@grayLight, 5%);
-          }
-        }
-      }
-    }
-  }
+// Primary header
+// -------------------------
+.header-primary {
+  background-color: @pageHeaderBackground;
+  border-bottom: 1px solid @pageHeaderBorder;
+  margin: 0px;
+  margin-top: 0px;
+  padding-top: @baseLineHeight / 2;
+
+  .breadcrumb {
+    background: none;
+    border: none;
+    margin: 0px;
+    margin-bottom: @fontSizeSmall * -0.5;
+    padding: 0px;
+
+    li {
+      font-size: @fontSizeSmall;
+      font-weight: bold;
+      text-shadow: none;
+
+      a:link, a:visited {
+        color: @grayLight;
+      }
+
+      a:hover, a:active {
+        color: @textColor;
+      }
+
+      .divider {
+        padding-left: 0px;
+        padding-right: 0px;
+
+        i {
+          .opacity(20);
+          position: relative;
+          bottom: 1px;
+        }
+      }
+    }
+  }
+
+  h1 {
+    color: @gray;
+    font-size: @fontSizeLarge * 2;
+    font-weight: normal;
+  }
+
+  .header-stats {
+    overflow: visible;
+    margin-bottom: 0px;
+
+    color: @grayLight;
+
+    li {
+      float: left;
+      margin-right: @baseFontSize;
+
+      &>a {
+        color: @grayLight;
+
+        &:hover, &:active {
+          color: @textColor;
+        }
+      }
+
+      &>i {
+        .opacity(50);
+      }
+
+      &.stats-form {
+        float: right;
+
+        form {
+          margin: 0px;
+          margin-bottom: -12px;
+          padding: 0px;
+
+          button {
+            position: relative;
+            bottom: 12px;
+
+            &>i {
+              position: relative;
+              top: 0px;
+            }
+          }
+        }
+      }
+    }
+  }
+
+  .header-tabs {
+    border-bottom: 0px;
+    margin: 0px;
+    margin-top: (@baseLineHeight  * -0.5);
+    position: relative;
+    top: (@baseLineHeight * 0.5) - 1px;
+
+    li {
+      a {
+        &:link, &:visited {
+          background: none;
+          border: none;
+          border-radius: 0px;
+          margin-bottom: 4px;
+          padding: (@baseLineHeight / 3) (@baseLineHeight / 2);
+
+          color: lighten(@gray, 20%);
+          font-weight: bold;
+        }
+
+        &:hover, &:active, a:focus {
+          background: none;
+          border-bottom: 4px solid @gray;
+          margin-bottom: 0px;
+
+          color: @gray;
+        }
+      }
+
+      &.active {
+        a:link, a:visited, a:hover, a:active {
+          background: none;
+          border-bottom: 4px solid @red;
+          margin-bottom: 0px;
+
+          color: @textColor;
+        }
+      }
+
+      .form-inline {
+        margin: 0px;
+        margin-left: @baseFontSize;
+        margin-bottom: 7px;
+
+        .btn-icon {
+          padding-left: 7px;
+          padding-right: 7px;
+        }
+
+        i {
+          position: relative;
+          top: 0px;
+        }
+      }
+
+      & {
+        a.btn {
+          border: 1px solid @btnBorder;
+          *border: 0; // Remove the border to prevent IE7's black border on input:focus
+          border-radius: @baseBorderRadius;
+          margin: 0px;
+          padding: 4px 12px;
+
+          color: @textColor;
+
+          i {
+            position: relative;
+            top: 0px;
+          }
+
+          &:visited, &:hover {
+            background-color: @white;
+            border-color: lighten(@grayLight, 5%);
+          }
+        }
+      }
+    }
+  }
 }

+ 443 - 443
static/cranefly/css/cranefly/index.less

@@ -1,443 +1,443 @@
-//
-// Board index page
-// --------------------------------------------------
-
-.index-sidebar {
-  position: relative;
-  bottom: 9px;
-}
-
-// Forums list
-// -------------------------
-.index-category {
-  background-color: @categoryBackground;
-  border: 1px solid @categoryBorder;
-  border-radius: @borderRadiusSmall;
-  .box-shadow(0px 0px 0px 3px @categoryShadow);
-  margin-bottom: @baseLineHeight;
-
-  .header {
-    background-color: @categoryHeader;
-    border: 1px solid @categoryBorder;
-    border-radius: @borderRadiusSmall @borderRadiusSmall 0px 0px;
-    margin: -1px;
-    margin-bottom: 0px;
-    padding: (@fontSizeSmall / 3) (@fontSizeSmall - 2px);
-
-    h2 {
-      margin: 0px;
-      padding: 0px;
-
-      color: @grayDark;
-      font-size: @fontSizeSmall;
-      font-weight: bold;
-      line-height: @baseLineHeight;
-      text-align: left;
-
-      small {
-        margin-left: @baseFontSize / 2;
-
-        color: @grayLight;
-        font-size: @fontSizeSmall;
-      }
-    }
-  }
-
-  .forum {
-    border-bottom: 1px solid @categoryBorder;
-    height: 21px;
-    overflow: visible;
-    padding: ((@fontSizeLarge / 2) + 6px) (@fontSizeSmall - 2px);
-
-    &.last {
-      border-bottom: none;
-    }
-
-    .forum-icon {
-      float: left;
-
-      .forum-icon-wrap {
-        background-color: @itemOldColor;
-        border: 1px solid darken(@itemOldColor, 10%);
-        border-radius: @baseBorderRadius;
-        padding: ((@forumIconSize - 22px) / 2) ((@forumIconSize - 16px) / 2);
-        position: relative;
-        bottom: (@forumIconSize - @baseLineHeight) / 2;
-
-        &.forum-icon-new {
-          background-color: @itemNewColor;
-          border: 1px solid darken(@itemNewColor, 10%);
-        }
-
-        &.forum-icon-redirect {
-          background-color: @itemMovedColor;
-          border: 1px solid darken(@itemMovedColor, 10%);
-        }
-      }
-    }
-
-    .forum-main {
-      margin-left: @forumIconSize + 10px;
-
-      h3 {
-        float: left;
-        margin: 0px;
-        padding: 0px;
-
-        font-size: @fontSizeLarge;
-        font-weight: normal;
-        line-height: @baseLineHeight;
-
-        a:link, a:visited {
-          color: @textColor;
-        }
-      }
-
-      .dropdown {
-        float: right;
-        right: @baseFontSize;
-
-        .subforum {
-          &:link, &:visited {
-            color: @grayLight;
-            font-weight: bold;
-          }
-
-          &:hover, &:active {
-            color: @textColor;
-          }
-        }
-
-        .dropdown-toggle {
-          padding: 4px 8px;
-          .opacity(60);
-
-          color: @textColor;
-          font-weight: bold;
-
-          &:hover, &:active, &:focus {
-            .opacity(100);
-
-            text-decoration: none;
-          }
-        }
-
-        &.open .dropdown-toggle {
-          background-color: @categoryShadow;
-          border-radius: @baseBorderRadius @baseBorderRadius 0px 0px;
-          .opacity(100);
-          padding-bottom: 6px;
-
-          text-decoration: none;
-        }
-
-        .dropdown-menu {
-          background: none;
-          border: none;
-          box-shadow: none;
-
-          .dropdown-shadow{
-            border-radius: @baseBorderRadius;
-            .box-shadow(0px 0px 3px @grayLight);
-            width: 256px;
-            position: relative;
-            right: 0px;
-            top: -4px;
-
-            ul {
-              background-color: @bodyBackground;
-              border-radius: @baseBorderRadius;
-              margin: 0px;
-              padding: 0px;
-
-              li {
-                margin: 0px;
-                padding: 0px;
-                list-style: none;
-
-                a {
-                  border-bottom: 1px dotted @categoryBorder;
-                  display: block;
-                  .opacity(70);
-                  padding: 6px 8px;
-
-                  color: @textColor;
-                  text-decoration: none;
-
-                  &:hover, &:active {
-                    .opacity(100);
-                  }
-                }
-
-                &:last-child a {
-                  border-bottom: none;
-                }
-              }
-            }
-          }
-        }
-      }
-
-      .forum-details {
-        border-left: 1px dotted darken(@categoryBackground, 12%);
-        float: right;
-        margin: -10px 0px;
-        margin-top: ((@baseFontSize - @fontSizeSmall) * -1) - 6px;
-        padding-left: @baseFontSize;
-        height: 35px;
-        width: 220px;
-
-        .thread-name {
-          a:link, a:active, a:visited, a:hover {
-            margin-bottom: 1px;
-
-            color: @textColor;
-            font-size: @fontSizeSmall;
-            font-weight: bold;
-          }
-        }
-
-        .muted {
-          font-size: @fontSizeMini;
-          line-height: @fontSizeMini;
-
-          .last-poster, a:link, a:active, a:visited, a:hover {
-            color: @gray;
-          }
-        }
-
-        em {
-          position: relative;
-          top: (35px - @baseLineHeight) / 2;
-
-          color: @grayLight;
-
-          strong {
-            color: @textColor;
-            font-weight: normal;
-          }
-        }
-      }
-
-      .forum-meta-tooltip {
-        .tooltip-inner {
-          max-width: 400px;
-          text-align: left;
-
-          .forum-stats {
-            color: @grayLight;
-            font-size: @fontSizeMini;
-
-            strong {
-              color: @white;
-            }
-
-            span {
-              margin-right: @baseFontSize;
-            }
-          }
-
-          .forum-description {
-            clear: both;
-            margin: 0px;
-            margin-bottom: @baseFontSize / 2;
-            padding: 0px;
-
-            color: @grayLighter;
-            font-size: @baseFontSize;
-          }
-        }
-      }
-    }
-  }
-
-  &.index-category-important {
-    .header {
-      background-color: @red;
-      border: 1px solid darken(@red, 10%);
-
-      h2 {
-        color: @white;
-        text-shadow: 0px 1px 0px darken(@red, 25%);
-
-        small {
-          color: darken(@red, 40%);
-          text-shadow: none;
-        }
-      }
-    }
-  }
-
-  &.index-category-inverse {
-    .header {
-      background-color: @grayDark;
-      border: 1px solid darken(@grayDark, 10%);
-
-      h2 {
-        color: @grayLighter;
-        text-shadow: 0px 1px 0px darken(@black, 25%);
-
-        small {
-          color: lighten(@grayLight, 10%);
-          text-shadow: none;
-        }
-      }
-    }
-  }
-
-  &.index-category-info {
-    .header{
-      background-color: @bluePale;
-      border: 1px solid darken(@bluePale, 10%);
-
-      h2 {
-
-        color: @white;
-        text-shadow: 0px 1px 0px darken(@bluePale, 25%);
-
-        small {
-          color: darken(@bluePale, 25%);
-          text-shadow: none;
-        }
-      }
-    }
-  }
-}
-
-.index-forums-read-all {
-  margin: 0px;
-  padding: 0px;
-
-  .btn-link {
-    margin: 0px;
-    .opacity(50);
-    padding: 0px;
-
-    color: @textColor;
-    font-weight: bold;
-
-    &:active, &:hover {
-      .opacity(90);
-    }
-  }
-}
-
-// Online list
-// -------------------------
-.index-ranks-list {
-  h3 {
-    margin: 0px;
-    padding: 0px;
-
-    color: @grayLight;
-    font-size: @fontSizeLarge;
-    font-weight: bold;
-
-    a:link, a:active, a:visited, a:hover {
-      color: @grayLight;
-      font-size: @fontSizeLarge;
-      text-decoration: none;
-    }
-  }
-
-  ul {
-    background-color: @white;
-    border: 1px solid darken(@bodyBackground, 10%);
-    border-radius: @baseBorderRadius;
-    margin: 0px;
-    margin-bottom: @baseLineHeight;
-    padding: 0px;
-
-    li {
-      border-bottom: 1px dotted darken(@bodyBackground, 10%);
-      margin: 0px;
-      padding: 6px 8px;
-
-      font-weight: bold;
-
-      img {
-        background-color: @white;
-        border-radius: @borderRadiusSmall;
-        width: 28px;
-        height: 28px;
-      }
-
-      .user-name {
-        &:link, &:active, &:visited, &:hover {
-          position: relative;
-          top: (@fontSizeLarge - @baseFontSize) / 2;
-          margin: 0px 4px;
-
-          color: @textColor;
-          font-size: @fontSizeLarge;
-        }
-      }
-
-      .label {
-        float: right;
-        position: relative;
-        top: (@fontSizeLarge - @baseFontSize) + 1px;
-      }
-
-      &:last-child {
-        border-bottom: none;
-      }
-    }
-  }
-}
-
-// Popular threads
-// -------------------------
-.index-popular-threads { 
-  h3 {
-    margin: 0px;
-    margin-bottom: (@baseLineHeight * -0.5);
-    padding: 0px;
-
-    color: @grayLight;
-    font-size: @fontSizeLarge;
-    font-weight: bold;
-  }
-
-  ul {
-    margin: 0px;
-    margin-bottom: @baseLineHeight;
-    padding: 0px;
-
-    li {
-      border-bottom: 1px solid darken(@bodyBackground, 10%);
-      padding: (@baseFontSize / 2) 0px;
-
-      a:link, a:active, a:visited, a:hover {
-        color: @textColor;
-        font-weight: bold;
-      }
-
-      .muted {
-        font-size: @fontSizeMini;
-
-        a:link, a:active, a:visited, a:hover {
-          color: @gray;
-        }
-      }
-    }
-  }
-}
-
-// Forum stats
-// -------------------------
-.index-stats {
-  margin-bottom: @baseLineHeight;
-  .opacity(60);
-  overflow: auto;
-
-  font-weight: bold;
-
-  ul {
-    li {
-      float: left;
-      padding: 0px;
-      padding-right: @baseLineHeight;
-    }
-  }
-}
+//
+// Board index page
+// --------------------------------------------------
+
+.index-sidebar {
+  position: relative;
+  bottom: 9px;
+}
+
+// Forums list
+// -------------------------
+.index-category {
+  background-color: @categoryBackground;
+  border: 1px solid @categoryBorder;
+  border-radius: @borderRadiusSmall;
+  .box-shadow(0px 0px 0px 3px @categoryShadow);
+  margin-bottom: @baseLineHeight;
+
+  .header {
+    background-color: @categoryHeader;
+    border: 1px solid @categoryBorder;
+    border-radius: @borderRadiusSmall @borderRadiusSmall 0px 0px;
+    margin: -1px;
+    margin-bottom: 0px;
+    padding: (@fontSizeSmall / 3) (@fontSizeSmall - 2px);
+
+    h2 {
+      margin: 0px;
+      padding: 0px;
+
+      color: @grayDark;
+      font-size: @fontSizeSmall;
+      font-weight: bold;
+      line-height: @baseLineHeight;
+      text-align: left;
+
+      small {
+        margin-left: @baseFontSize / 2;
+
+        color: @grayLight;
+        font-size: @fontSizeSmall;
+      }
+    }
+  }
+
+  .forum {
+    border-bottom: 1px solid @categoryBorder;
+    height: 21px;
+    overflow: visible;
+    padding: ((@fontSizeLarge / 2) + 6px) (@fontSizeSmall - 2px);
+
+    &.last {
+      border-bottom: none;
+    }
+
+    .forum-icon {
+      float: left;
+
+      .forum-icon-wrap {
+        background-color: @itemOldColor;
+        border: 1px solid darken(@itemOldColor, 10%);
+        border-radius: @baseBorderRadius;
+        padding: ((@forumIconSize - 22px) / 2) ((@forumIconSize - 16px) / 2);
+        position: relative;
+        bottom: (@forumIconSize - @baseLineHeight) / 2;
+
+        &.forum-icon-new {
+          background-color: @itemNewColor;
+          border: 1px solid darken(@itemNewColor, 10%);
+        }
+
+        &.forum-icon-redirect {
+          background-color: @itemMovedColor;
+          border: 1px solid darken(@itemMovedColor, 10%);
+        }
+      }
+    }
+
+    .forum-main {
+      margin-left: @forumIconSize + 10px;
+
+      h3 {
+        float: left;
+        margin: 0px;
+        padding: 0px;
+
+        font-size: @fontSizeLarge;
+        font-weight: normal;
+        line-height: @baseLineHeight;
+
+        a:link, a:visited {
+          color: @textColor;
+        }
+      }
+
+      .dropdown {
+        float: right;
+        right: @baseFontSize;
+
+        .subforum {
+          &:link, &:visited {
+            color: @grayLight;
+            font-weight: bold;
+          }
+
+          &:hover, &:active {
+            color: @textColor;
+          }
+        }
+
+        .dropdown-toggle {
+          padding: 4px 8px;
+          .opacity(60);
+
+          color: @textColor;
+          font-weight: bold;
+
+          &:hover, &:active, &:focus {
+            .opacity(100);
+
+            text-decoration: none;
+          }
+        }
+
+        &.open .dropdown-toggle {
+          background-color: @categoryShadow;
+          border-radius: @baseBorderRadius @baseBorderRadius 0px 0px;
+          .opacity(100);
+          padding-bottom: 6px;
+
+          text-decoration: none;
+        }
+
+        .dropdown-menu {
+          background: none;
+          border: none;
+          box-shadow: none;
+
+          .dropdown-shadow{
+            border-radius: @baseBorderRadius;
+            .box-shadow(0px 0px 3px @grayLight);
+            width: 256px;
+            position: relative;
+            right: 0px;
+            top: -4px;
+
+            ul {
+              background-color: @bodyBackground;
+              border-radius: @baseBorderRadius;
+              margin: 0px;
+              padding: 0px;
+
+              li {
+                margin: 0px;
+                padding: 0px;
+                list-style: none;
+
+                a {
+                  border-bottom: 1px dotted @categoryBorder;
+                  display: block;
+                  .opacity(70);
+                  padding: 6px 8px;
+
+                  color: @textColor;
+                  text-decoration: none;
+
+                  &:hover, &:active {
+                    .opacity(100);
+                  }
+                }
+
+                &:last-child a {
+                  border-bottom: none;
+                }
+              }
+            }
+          }
+        }
+      }
+
+      .forum-details {
+        border-left: 1px dotted darken(@categoryBackground, 12%);
+        float: right;
+        margin: -10px 0px;
+        margin-top: ((@baseFontSize - @fontSizeSmall) * -1) - 6px;
+        padding-left: @baseFontSize;
+        height: 35px;
+        width: 220px;
+
+        .thread-name {
+          a:link, a:active, a:visited, a:hover {
+            margin-bottom: 1px;
+
+            color: @textColor;
+            font-size: @fontSizeSmall;
+            font-weight: bold;
+          }
+        }
+
+        .muted {
+          font-size: @fontSizeMini;
+          line-height: @fontSizeMini;
+
+          .last-poster, a:link, a:active, a:visited, a:hover {
+            color: @gray;
+          }
+        }
+
+        em {
+          position: relative;
+          top: (35px - @baseLineHeight) / 2;
+
+          color: @grayLight;
+
+          strong {
+            color: @textColor;
+            font-weight: normal;
+          }
+        }
+      }
+
+      .forum-meta-tooltip {
+        .tooltip-inner {
+          max-width: 400px;
+          text-align: left;
+
+          .forum-stats {
+            color: @grayLight;
+            font-size: @fontSizeMini;
+
+            strong {
+              color: @white;
+            }
+
+            span {
+              margin-right: @baseFontSize;
+            }
+          }
+
+          .forum-description {
+            clear: both;
+            margin: 0px;
+            margin-bottom: @baseFontSize / 2;
+            padding: 0px;
+
+            color: @grayLighter;
+            font-size: @baseFontSize;
+          }
+        }
+      }
+    }
+  }
+
+  &.index-category-important {
+    .header {
+      background-color: @red;
+      border: 1px solid darken(@red, 10%);
+
+      h2 {
+        color: @white;
+        text-shadow: 0px 1px 0px darken(@red, 25%);
+
+        small {
+          color: darken(@red, 40%);
+          text-shadow: none;
+        }
+      }
+    }
+  }
+
+  &.index-category-inverse {
+    .header {
+      background-color: @grayDark;
+      border: 1px solid darken(@grayDark, 10%);
+
+      h2 {
+        color: @grayLighter;
+        text-shadow: 0px 1px 0px darken(@black, 25%);
+
+        small {
+          color: lighten(@grayLight, 10%);
+          text-shadow: none;
+        }
+      }
+    }
+  }
+
+  &.index-category-info {
+    .header{
+      background-color: @bluePale;
+      border: 1px solid darken(@bluePale, 10%);
+
+      h2 {
+
+        color: @white;
+        text-shadow: 0px 1px 0px darken(@bluePale, 25%);
+
+        small {
+          color: darken(@bluePale, 25%);
+          text-shadow: none;
+        }
+      }
+    }
+  }
+}
+
+.index-forums-read-all {
+  margin: 0px;
+  padding: 0px;
+
+  .btn-link {
+    margin: 0px;
+    .opacity(50);
+    padding: 0px;
+
+    color: @textColor;
+    font-weight: bold;
+
+    &:active, &:hover {
+      .opacity(90);
+    }
+  }
+}
+
+// Online list
+// -------------------------
+.index-ranks-list {
+  h3 {
+    margin: 0px;
+    padding: 0px;
+
+    color: @grayLight;
+    font-size: @fontSizeLarge;
+    font-weight: bold;
+
+    a:link, a:active, a:visited, a:hover {
+      color: @grayLight;
+      font-size: @fontSizeLarge;
+      text-decoration: none;
+    }
+  }
+
+  ul {
+    background-color: @white;
+    border: 1px solid darken(@bodyBackground, 10%);
+    border-radius: @baseBorderRadius;
+    margin: 0px;
+    margin-bottom: @baseLineHeight;
+    padding: 0px;
+
+    li {
+      border-bottom: 1px dotted darken(@bodyBackground, 10%);
+      margin: 0px;
+      padding: 6px 8px;
+
+      font-weight: bold;
+
+      img {
+        background-color: @white;
+        border-radius: @borderRadiusSmall;
+        width: 28px;
+        height: 28px;
+      }
+
+      .user-name {
+        &:link, &:active, &:visited, &:hover {
+          position: relative;
+          top: (@fontSizeLarge - @baseFontSize) / 2;
+          margin: 0px 4px;
+
+          color: @textColor;
+          font-size: @fontSizeLarge;
+        }
+      }
+
+      .label {
+        float: right;
+        position: relative;
+        top: (@fontSizeLarge - @baseFontSize) + 1px;
+      }
+
+      &:last-child {
+        border-bottom: none;
+      }
+    }
+  }
+}
+
+// Popular threads
+// -------------------------
+.index-popular-threads { 
+  h3 {
+    margin: 0px;
+    margin-bottom: (@baseLineHeight * -0.5);
+    padding: 0px;
+
+    color: @grayLight;
+    font-size: @fontSizeLarge;
+    font-weight: bold;
+  }
+
+  ul {
+    margin: 0px;
+    margin-bottom: @baseLineHeight;
+    padding: 0px;
+
+    li {
+      border-bottom: 1px solid darken(@bodyBackground, 10%);
+      padding: (@baseFontSize / 2) 0px;
+
+      a:link, a:active, a:visited, a:hover {
+        color: @textColor;
+        font-weight: bold;
+      }
+
+      .muted {
+        font-size: @fontSizeMini;
+
+        a:link, a:active, a:visited, a:hover {
+          color: @gray;
+        }
+      }
+    }
+  }
+}
+
+// Forum stats
+// -------------------------
+.index-stats {
+  margin-bottom: @baseLineHeight;
+  .opacity(60);
+  overflow: auto;
+
+  font-weight: bold;
+
+  ul {
+    li {
+      float: left;
+      padding: 0px;
+      padding-right: @baseLineHeight;
+    }
+  }
+}

+ 44 - 44
static/cranefly/css/cranefly/karmas.less

@@ -1,45 +1,45 @@
-// Post Love/Hate Votes List
-// -------------------------
-
-.post-votes-list {
-  .vote-user {
-    &, &:link, &:visited {
-      color: @gray;
-      font-size: @fontSizeLarge;
-      font-weight: bold;
-    }
-
-    .vote-icon {
-      background-color: @grayLight;
-      border-radius: @baseBorderRadius;
-      padding: 2px 3px;
-      position: relative;
-      bottom: (@fontSizeLarge - @baseFontSize) / 2;
-
-      font-size: @baseFontSize;
-
-      i {
-        background-image: url("@{iconWhiteSpritePath}");
-      }
-    }
-  }
-
-  a.vote-user {
-    &:hover, &:active {
-      color: @textColor;
-      text-decoration: none;
-    }
-  }
-
-  .post-likes {
-    .vote-icon {
-      background-color: @green;
-    }
-  }
-
-  .post-dislikes {
-    .vote-icon {
-      background-color: @red;
-    }
-  }
+// Post Love/Hate Votes List
+// -------------------------
+
+.post-votes-list {
+  .vote-user {
+    &, &:link, &:visited {
+      color: @gray;
+      font-size: @fontSizeLarge;
+      font-weight: bold;
+    }
+
+    .vote-icon {
+      background-color: @grayLight;
+      border-radius: @baseBorderRadius;
+      padding: 2px 3px;
+      position: relative;
+      bottom: (@fontSizeLarge - @baseFontSize) / 2;
+
+      font-size: @baseFontSize;
+
+      i {
+        background-image: url("@{iconWhiteSpritePath}");
+      }
+    }
+  }
+
+  a.vote-user {
+    &:hover, &:active {
+      color: @textColor;
+      text-decoration: none;
+    }
+  }
+
+  .post-likes {
+    .vote-icon {
+      background-color: @green;
+    }
+  }
+
+  .post-dislikes {
+    .vote-icon {
+      background-color: @red;
+    }
+  }
 }

+ 156 - 156
static/cranefly/css/cranefly/markdown.less

@@ -1,157 +1,157 @@
-// Markdown output
-// -------------------------
-
-.markdown, .markdown article {
-  margin: 0px;
-  overflow: auto;
-
-  &>:first-child {
-    margin-top: 0px;
-  }
-
-  &>:last-child {
-    margin-bottom: 0px;
-
-    img:last-child {
-      margin-bottom: 0px;
-    }
-  }
-
-  h1 {
-    font-size: @baseFontSize * 1.7;
-  }
-
-  h2 {
-    font-size: @baseFontSize * 1.5;
-  }
-
-  h3 {
-    font-size: @baseFontSize * 1.2;
-  }
-
-  h4 {
-    font-size: @baseFontSize;
-  }
-
-  hr {
-    border: none;
-    border-top: 1px solid @hrBorder;
-    margin: @baseLineHeight 0px;
-  }
-
-  blockquote {
-    border-left-color: darken(@grayLighter, 5%);
-    padding: (@baseFontSize / 3) @baseFontSize;
-
-    header {
-      padding-bottom: (@baseLineHeight / 2);
-
-      font-size: @baseFontSize * 1.1;
-      font-weight: bold;
-      line-height: @baseLineHeight;
-    }
-
-    p {
-      margin: 0 0 (@baseLineHeight / 2);
-
-      font-size: @baseFontSize;
-    }
-
-    blockquote {
-      .opacity(85);
-    }
-  }
-
-  code {
-    background-color: @grayDark;
-    border: none;
-
-    color: @grayLighter;
-    font-size: @baseFontSize;
-  }
-
-  pre {
-    background-color: @grayDarker;
-    padding: (@baseFontSize / 2) @baseFontSize;
-
-    code {
-      background: none;
-      border: none;
-
-      color: @grayLighter;
-      font-size: @fontSizeSmall;
-    }
-  }
-
-  img {
-    background-color: @white;
-    border-radius: @baseBorderRadius;
-    margin: (@baseLineHeight / 2) 0px;
-  }
-
-  // Blocks margins
-  pre, blockquote, iframe {
-    margin-top: @baseLineHeight;
-    margin-bottom: @baseLineHeight;
-
-    &>:first-child {
-      margin-top: 0px;
-    }
-
-    &>:last-child {
-      margin-bottom: 0px;
-    }
-  }
-
-  // Emoticons
-  .emoji {
-    background: none;
-    border-radius: 0px;
-    margin: 0px;
-    vertical-align: middle;
-  }
-
-  h1 {
-    .emoji {
-      width: (@baseFontSize * 1.7) + 4px;
-      height: (@baseFontSize * 1.7) + 4px;
-    }
-  }
-
-  h2 {
-    .emoji {
-      width: (@baseFontSize * 1.5) + 4px;
-      height: (@baseFontSize * 1.5) + 4px;
-    }
-  }
-
-  h3 {
-    .emoji {
-      width: (@baseFontSize * 1.2) + 4px;
-      height: (@baseFontSize * 1.2) + 4px;
-    }
-  }
-
-  h4 {
-    .emoji {
-      width: @baseFontSize + 4px;
-      height: @baseFontSize + 4px;
-    }
-  }
-
-  p {
-    .emoji {
-      width: @baseFontSize + 4px;
-      height: @baseFontSize + 4px;
-    }
-  }
-
-  blockquote {
-    p {
-      .emoji {
-        width: @fontSizeSmall + 2px;
-        height: @fontSizeSmall + 2px;
-      }
-    }
-  }
+// Markdown output
+// -------------------------
+
+.markdown, .markdown article {
+  margin: 0px;
+  overflow: auto;
+
+  &>:first-child {
+    margin-top: 0px;
+  }
+
+  &>:last-child {
+    margin-bottom: 0px;
+
+    img:last-child {
+      margin-bottom: 0px;
+    }
+  }
+
+  h1 {
+    font-size: @baseFontSize * 1.7;
+  }
+
+  h2 {
+    font-size: @baseFontSize * 1.5;
+  }
+
+  h3 {
+    font-size: @baseFontSize * 1.2;
+  }
+
+  h4 {
+    font-size: @baseFontSize;
+  }
+
+  hr {
+    border: none;
+    border-top: 1px solid @hrBorder;
+    margin: @baseLineHeight 0px;
+  }
+
+  blockquote {
+    border-left-color: darken(@grayLighter, 5%);
+    padding: (@baseFontSize / 3) @baseFontSize;
+
+    header {
+      padding-bottom: (@baseLineHeight / 2);
+
+      font-size: @baseFontSize * 1.1;
+      font-weight: bold;
+      line-height: @baseLineHeight;
+    }
+
+    p {
+      margin: 0 0 (@baseLineHeight / 2);
+
+      font-size: @baseFontSize;
+    }
+
+    blockquote {
+      .opacity(85);
+    }
+  }
+
+  code {
+    background-color: @grayDark;
+    border: none;
+
+    color: @grayLighter;
+    font-size: @baseFontSize;
+  }
+
+  pre {
+    background-color: @grayDarker;
+    padding: (@baseFontSize / 2) @baseFontSize;
+
+    code {
+      background: none;
+      border: none;
+
+      color: @grayLighter;
+      font-size: @fontSizeSmall;
+    }
+  }
+
+  img {
+    background-color: @white;
+    border-radius: @baseBorderRadius;
+    margin: (@baseLineHeight / 2) 0px;
+  }
+
+  // Blocks margins
+  pre, blockquote, iframe {
+    margin-top: @baseLineHeight;
+    margin-bottom: @baseLineHeight;
+
+    &>:first-child {
+      margin-top: 0px;
+    }
+
+    &>:last-child {
+      margin-bottom: 0px;
+    }
+  }
+
+  // Emoticons
+  .emoji {
+    background: none;
+    border-radius: 0px;
+    margin: 0px;
+    vertical-align: middle;
+  }
+
+  h1 {
+    .emoji {
+      width: (@baseFontSize * 1.7) + 4px;
+      height: (@baseFontSize * 1.7) + 4px;
+    }
+  }
+
+  h2 {
+    .emoji {
+      width: (@baseFontSize * 1.5) + 4px;
+      height: (@baseFontSize * 1.5) + 4px;
+    }
+  }
+
+  h3 {
+    .emoji {
+      width: (@baseFontSize * 1.2) + 4px;
+      height: (@baseFontSize * 1.2) + 4px;
+    }
+  }
+
+  h4 {
+    .emoji {
+      width: @baseFontSize + 4px;
+      height: @baseFontSize + 4px;
+    }
+  }
+
+  p {
+    .emoji {
+      width: @baseFontSize + 4px;
+      height: @baseFontSize + 4px;
+    }
+  }
+
+  blockquote {
+    p {
+      .emoji {
+        width: @fontSizeSmall + 2px;
+        height: @fontSizeSmall + 2px;
+      }
+    }
+  }
 }

+ 43 - 43
static/cranefly/css/cranefly/messages.less

@@ -1,44 +1,44 @@
-//
-// Board Messages
-// --------------------------------------------------
-
-.messages-list {
-  .alert-icon {
-    float: left;
-  }
-
-  p {
-    margin: 0px;
-    margin-left: 28px;
-
-    color: @white;
-  }
-
-  a:link, a:visited {
-    .opacity(85);
-
-    color: @white;
-    font-size: 120%;
-    text-decoration: underline;
-  }
-
-  a:active, a:hover {
-    .opacity(100);
-  }
-  
-  .alert-info {
-    text-shadow: 0px 1px 0px darken(@infoBorder, 10%);
-  }
-
-  .alert-success {
-    text-shadow: 0px 1px 0px darken(@successBorder, 10%);
-  }
-
-  .alert-warning {
-    text-shadow: 0px 1px 0px darken(@warningBorder, 10%);
-  }
-
-  .alert-error {
-    text-shadow: 0px 1px 0px darken(@errorBorder, 10%);    
-  }
+//
+// Board Messages
+// --------------------------------------------------
+
+.messages-list {
+  .alert-icon {
+    float: left;
+  }
+
+  p {
+    margin: 0px;
+    margin-left: 28px;
+
+    color: @white;
+  }
+
+  a:link, a:visited {
+    .opacity(85);
+
+    color: @white;
+    font-size: 120%;
+    text-decoration: underline;
+  }
+
+  a:active, a:hover {
+    .opacity(100);
+  }
+  
+  .alert-info {
+    text-shadow: 0px 1px 0px darken(@infoBorder, 10%);
+  }
+
+  .alert-success {
+    text-shadow: 0px 1px 0px darken(@successBorder, 10%);
+  }
+
+  .alert-warning {
+    text-shadow: 0px 1px 0px darken(@warningBorder, 10%);
+  }
+
+  .alert-error {
+    text-shadow: 0px 1px 0px darken(@errorBorder, 10%);    
+  }
 }

+ 486 - 486
static/cranefly/css/cranefly/navbar.less

@@ -1,487 +1,487 @@
-// Navbar
-// -------------------------
-.navbar-header {
-  .navbar-inner {
-    background: none;
-    background-color: @navbarBackground;
-    border-bottom: 1px solid @navbarBorder;
-    .box-shadow(none);
-
-    .container {
-      background: url(@navbarLogoImage);
-      background-position: left center;
-      background-repeat: no-repeat;
-    }
-
-    .brand {
-      margin-left: @navbarLogoWidth - @baseFontSize;
-
-      text-shadow: none;
-
-      &:link, &:active, &:visited, &:hover {
-        color: @navbarBrandColor;
-        font-size: 200%;
-
-        span {
-          color: @navbarMottoColor;
-        } 
-      }
-    }
-
-    .navbar-search-form {
-      height: 30px;
-      width: @navbarSearchWidth + @baseFontSize;
-      margin-top: ((@navbarHeight - @baseLineHeight) / 2) - 6px;
-      overflow: visible;
-      position: relative;
-
-      .navbar-search-border {
-        background-color: @white;
-        border: 1px solid darken(@navbarBorder, 10%);
-        .border-radius(@baseBorderRadius);
-        position: absolute;
-        z-index: 2;
-
-        .navbar-search-text {
-          border: 1px solid darken(@navbarBorder, 10%);
-          border-radius: @baseBorderRadius;
-          margin: -1px;
-          padding: 1px 0px;
-
-          color: @textColor;
-
-          &>input {
-            border: none;
-            .box-shadow(none);
-            background: none;
-            margin: 0px;
-            width: @navbarSearchWidth;
-          }
-        }
-
-        &:hover, &.open {
-          .box-shadow(0px 0px 3px fadeout(@gray, 30%));
-
-          .navbar-search-text {
-            border-color: lighten(@blue, 20%);
-            margin-bottom: 0px;
-          }
-
-          .extra {
-            display: block;
-          }
-        }
-
-        &>.extra {
-          background: @white;
-          border-radius: @baseBorderRadius;
-          display: none;
-
-          .extra-form {
-            padding: 0px @navbarSearchPadding;
-
-            .control {
-              margin: (@navbarSearchPadding * 1.5) 0px;
-
-              label {
-                color: @gray;
-                font-weight: bold;
-              }
-
-              select {
-                margin: 0px;
-                width: 100%;
-              }
-
-              input[type="text"] {
-                margin: 0px;
-                width: (@navbarSearchWidth - (@navbarSearchPadding * 2) - 2px);
-              }
-
-              .checkbox {
-                margin-bottom: -3px;
-              }
-            }
-          }
-
-          .form-actions {
-            border-radius: 0px 0px (@baseBorderRadius - 1);
-            margin: 0px;
-            margin-top: (@baseFontSize / 2);
-            margin-bottom: 0px;
-            padding: @navbarSearchPadding;
-
-            .btn {
-              margin: 0px;
-            }
-
-            a:link, a:visited {
-              margin-left: (@baseFontSize / 2);
-              position: relative;
-              top: 1px;
-
-              color: @grayLight;
-              font-weight: bold;
-            }
-
-            a:active, a:hover {
-              color: @textColor;
-            }
-          }
-        }
-      }
-    }
-
-    .navbar-blocks {
-      margin-left: 6px;
-
-      li {
-        margin-left: 6px;
-
-        form {
-          margin: 0px;
-          padding: 0px;
-        }
-
-        a:link, a:visited, .btn-link {
-          background-color: lighten(@navbarBackground, 2%);
-          border: 1px solid darken(@navbarBorder, 2%);
-          border-radius: @baseBorderRadius;
-          padding: 5px 8px;
-          margin-top: ((@navbarHeight - @baseLineHeight) / 2) - 6;
-
-          i {
-            .opacity(70);
-          }
-
-          .label {
-            background-color: @red;
-            margin-left: 4px;
-            padding-left: 6px;
-            padding-right: 5px;
-            position: relative;
-            bottom: 1px;
-          }
-        }
-
-        a:hover, a:active, .btn-link:hover, .btn-link:active {
-          background-color: @linkColor;
-          border-color: darken(@linkColor, 10%);
-
-          &.danger {
-            background-color: @red;
-            border-color: darken(@red, 10%);
-          }
-
-          &.hot {
-            background-color: @orange;
-            border-color: darken(@orange, 10%);
-          }
-
-          &.fresh {
-            background-color: @green;
-            border-color: darken(@green, 10%);
-          }
-
-          i {
-            background-image: url("@{iconWhiteSpritePath}");
-            .opacity(100);
-          }
-
-          .label {
-            background-color: @grayLighter;
-
-            color: @textColor;
-          }
-        }
-
-        &.user-profile {
-          a:link, a:visited, a:hover, a:active {
-            background: none;
-            border: none;
-            margin-right: 8px;
-            margin-top: 5px;
-
-            font-weight: bold;
-            text-shadow: none;
-
-            img {
-              border-radius: @baseBorderRadius;
-              margin-right: 6px;
-              width: 32px;
-              height: 32px;
-              position: relative;
-              bottom: 1px;
-            }
-          }
-        }
-      }
-    }
-
-    .navbar-compact {
-      display: none;
-      
-      li {
-        &.user-profile {
-          &>a {
-            &:link, &:visited {
-              .border-radius(0);
-              margin-top: 0px;
-              padding: @baseFontSize;
-              padding-top: 10px;
-              padding-bottom: 8px;
-
-              img {
-                margin-right: 0px;
-                margin-left: 6px;
-              }
-
-              .caret-border {
-                background-color: @bodyBackground;
-                border: 1px solid @navbarBorder;
-                .border-radius(@baseBorderRadius);
-                margin-left: 8px;
-                padding: 0px 4px;
-
-                .caret {
-                  margin: 0px;
-                  padding: 0px;
-                  position: relative;
-                  top: 13px;
-                }
-              }
-            }
-
-            &:hover, &:active {
-              background-color: @bodyBackground;
-
-              .caret-border {
-                border-color: @grayLight;
-              }
-            }
-          }
-
-          &.open .dropdown-toggle {
-            &:link, &:visited, &:hover, &:focus {
-              background-color: @bodyBackground;
-
-              .caret-border {
-                background: @red;
-                border-color: @red;
-
-                .caret {
-                  border-top-color: @white;
-                }
-              }
-            }
-          }
-
-          .dropdown-menu {
-            border: none;
-            border: 1px solid darken(@navbarBorder, 10%);
-            .border-radius(@baseBorderRadius);
-            .box-shadow(0px 4px 3px fadeout(@gray, 30%));
-            margin: 0px;
-            margin-top: -6px;
-            margin-right: 0px;
-            padding: 4px 0px;
-            width: 270px;
-
-            &:before {
-              display: none;
-            }
-
-            &:after {
-              border-bottom: 6px solid @white;
-              margin-top: 0px;
-              margin-right: 11px;
-            }
-
-            &>li {
-              margin: 0px;
-              padding: 0px;
-
-              .label {
-                float: right;
-                margin: 0px;
-                margin-top: 2px;
-              }
-
-              a, .btn-link {
-                .border-radius(0);
-                clear: none;
-                display: block;
-                float: none;
-                margin: 0px;
-                padding: 6px 12px;
-
-                color: @textColor;
-                font-weight: normal;
-                text-align: left;
-                
-                i {
-                  .opacity(100);
-                }
-
-                &:link, &:active, &:visited, &:hover {
-                  .label {
-                    background-color: @red;
-                    float: right;
-
-                    color: @white;
-                    text-shadow: 0px 1px 0px darken(@red, 20%);
-                  }
-                }
-              }
-
-              a:link, a:visited {
-                .opacity(80);
-              }
-
-              a:hover {
-                background-color: @gray;
-                .opacity(100);
-
-                color: @white;
-              }
-
-              .btn-link {
-                background: none;
-                border: none;
-                width: 100%;
-
-                &:hover, &:active {
-                  background: @red;
-                  .opacity(100);
-
-                  color: @white;
-                  text-shadow: 0px 1px 0px darken(@red, 20%);
-                }
-
-                i {
-                  position: relative;
-                  top: 0px;
-                }
-              }
-            }
-          }
-        }
-      }
-    }
-
-    .navbar-user-nav {
-      li {
-        .btn {
-          padding: 2px 8px;
-          margin-left: 8px;
-          margin-top: (@baseLineHeight / 2) + 3;
-
-          &:link, &:active, &:hover, &:visited {
-            color: @white;
-          }
-
-          &.btn-danger {
-            text-shadow: 0px 1px 0px darken(@red, 15%);
-
-            &:hover, &:active, &:focus {
-              background-color: saturate(@red, 20%);
-              border-color: darken(saturate(@red, 20%), 5%);
-            }
-          }
-
-          &.btn-inverse {
-            text-shadow: 0px 1px 0px darken(@textColor, 15%);
-
-            &:hover, &:active, &:focus {
-              background-color: darken(@textColor, 5%);
-              border-color: darken(@textColor, 10%);
-            }
-          }
-        }
-      }
-    }
-  }
-}
-
-// Inversed navbar, used for moderation tools
-.navbar-modbar {
-  .navbar-inner {
-    background: none;
-    background-color: @grayDarker;
-    background-image: -webkit-gradient(linear, 0 0, 100% 100%,
-                color-stop(.25, rgba(0, 0, 0, 0.1)), color-stop(.25, transparent),
-                color-stop(.5, transparent), color-stop(.5, rgba(0, 0, 0, 0.1)),
-                color-stop(.75, rgba(0, 0, 0, 0.1)), color-stop(.75, transparent),
-                to(transparent));
-    background-image: -webkit-linear-gradient(-45deg, rgba(0, 0, 0, 0.1) 25%, transparent 25%,
-              transparent 50%, rgba(0, 0, 0, 0.1) 50%, rgba(0, 0, 0, 0.1) 75%,
-              transparent 75%, transparent);
-    background-image: -moz-linear-gradient(-45deg, rgba(0, 0, 0, 0.1) 25%, transparent 25%,
-              transparent 50%, rgba(0, 0, 0, 0.1) 50%, rgba(0, 0, 0, 0.1) 75%,
-              transparent 75%, transparent);
-    background-image: -ms-linear-gradient(-45deg, rgba(0, 0, 0, 0.1) 25%, transparent 25%,
-              transparent 50%, rgba(0, 0, 0, 0.1) 50%, rgba(0, 0, 0, 0.1) 75%,
-              transparent 75%, transparent);
-    background-image: -o-linear-gradient(-45deg, rgba(0, 0, 0, 0.1) 25%, transparent 25%,
-              transparent 50%, rgba(0, 0, 0, 0.1) 50%, rgba(0, 0, 0, 0.1) 75%,
-              transparent 75%, transparent);
-    background-image: linear-gradient(-45deg, rgba(0, 0, 0, 0.1) 25%, transparent 25%,
-              transparent 50%, rgba(0, 0, 0, 0.1) 50%, rgba(0, 0, 0, 0.1) 75%,
-              transparent 75%, transparent);
-    -webkit-background-size: 15px 15px;
-    -moz-background-size: 15px 15px;
-    background-size: 15px 15px;
-    border-bottom: 2px dashed @red;
-    min-height: 1px;
-
-    .nav {
-      a:link, a:visited {
-        padding: @fontSizeMini (@fontSizeMini * 1.4);
-
-        color: darken(@white, 30%);
-        text-shadow: 0px 1px 0px @black;
-      }
-
-      a:hover, a:active {
-        color: @white;
-      }
-
-      li.active {
-        a:link, a:visited {
-          color: @white;
-        }
-      }
-    }
-
-    .navbar-search-form {
-      background-color: darken(@grayDark, 15%);
-      border-radius: @baseBorderRadius;
-      margin-top: ((@navbarHeight - @baseLineHeight) / 2) - 9px;
-      padding: 1px 0px;
-
-      input {
-        background-color: darken(@grayDark, 15%);
-        border: none;
-        .box-shadow(none);
-        margin: 0px;
-
-        color: @grayLighter;
-        text-shadow: 0px 1px 0px @black;
-      }
-
-      button {
-        margin: 0px;
-        .opacity(60);
-
-        i {
-          background-image: url("@{iconWhiteSpritePath}");
-          .opacity(100);
-        }
-
-        &:hover, &:active {
-          .opacity(100);
-        }
-      }
-    }
-  }
+// Navbar
+// -------------------------
+.navbar-header {
+  .navbar-inner {
+    background: none;
+    background-color: @navbarBackground;
+    border-bottom: 1px solid @navbarBorder;
+    .box-shadow(none);
+
+    .container {
+      background: url(@navbarLogoImage);
+      background-position: left center;
+      background-repeat: no-repeat;
+    }
+
+    .brand {
+      margin-left: @navbarLogoWidth - @baseFontSize;
+
+      text-shadow: none;
+
+      &:link, &:active, &:visited, &:hover {
+        color: @navbarBrandColor;
+        font-size: 200%;
+
+        span {
+          color: @navbarMottoColor;
+        } 
+      }
+    }
+
+    .navbar-search-form {
+      height: 30px;
+      width: @navbarSearchWidth + @baseFontSize;
+      margin-top: ((@navbarHeight - @baseLineHeight) / 2) - 6px;
+      overflow: visible;
+      position: relative;
+
+      .navbar-search-border {
+        background-color: @white;
+        border: 1px solid darken(@navbarBorder, 10%);
+        .border-radius(@baseBorderRadius);
+        position: absolute;
+        z-index: 2;
+
+        .navbar-search-text {
+          border: 1px solid darken(@navbarBorder, 10%);
+          border-radius: @baseBorderRadius;
+          margin: -1px;
+          padding: 1px 0px;
+
+          color: @textColor;
+
+          &>input {
+            border: none;
+            .box-shadow(none);
+            background: none;
+            margin: 0px;
+            width: @navbarSearchWidth;
+          }
+        }
+
+        &:hover, &.open {
+          .box-shadow(0px 0px 3px fadeout(@gray, 30%));
+
+          .navbar-search-text {
+            border-color: lighten(@blue, 20%);
+            margin-bottom: 0px;
+          }
+
+          .extra {
+            display: block;
+          }
+        }
+
+        &>.extra {
+          background: @white;
+          border-radius: @baseBorderRadius;
+          display: none;
+
+          .extra-form {
+            padding: 0px @navbarSearchPadding;
+
+            .control {
+              margin: (@navbarSearchPadding * 1.5) 0px;
+
+              label {
+                color: @gray;
+                font-weight: bold;
+              }
+
+              select {
+                margin: 0px;
+                width: 100%;
+              }
+
+              input[type="text"] {
+                margin: 0px;
+                width: (@navbarSearchWidth - (@navbarSearchPadding * 2) - 2px);
+              }
+
+              .checkbox {
+                margin-bottom: -3px;
+              }
+            }
+          }
+
+          .form-actions {
+            border-radius: 0px 0px (@baseBorderRadius - 1);
+            margin: 0px;
+            margin-top: (@baseFontSize / 2);
+            margin-bottom: 0px;
+            padding: @navbarSearchPadding;
+
+            .btn {
+              margin: 0px;
+            }
+
+            a:link, a:visited {
+              margin-left: (@baseFontSize / 2);
+              position: relative;
+              top: 1px;
+
+              color: @grayLight;
+              font-weight: bold;
+            }
+
+            a:active, a:hover {
+              color: @textColor;
+            }
+          }
+        }
+      }
+    }
+
+    .navbar-blocks {
+      margin-left: 6px;
+
+      li {
+        margin-left: 6px;
+
+        form {
+          margin: 0px;
+          padding: 0px;
+        }
+
+        a:link, a:visited, .btn-link {
+          background-color: lighten(@navbarBackground, 2%);
+          border: 1px solid darken(@navbarBorder, 2%);
+          border-radius: @baseBorderRadius;
+          padding: 5px 8px;
+          margin-top: ((@navbarHeight - @baseLineHeight) / 2) - 6;
+
+          i {
+            .opacity(70);
+          }
+
+          .label {
+            background-color: @red;
+            margin-left: 4px;
+            padding-left: 6px;
+            padding-right: 5px;
+            position: relative;
+            bottom: 1px;
+          }
+        }
+
+        a:hover, a:active, .btn-link:hover, .btn-link:active {
+          background-color: @linkColor;
+          border-color: darken(@linkColor, 10%);
+
+          &.danger {
+            background-color: @red;
+            border-color: darken(@red, 10%);
+          }
+
+          &.hot {
+            background-color: @orange;
+            border-color: darken(@orange, 10%);
+          }
+
+          &.fresh {
+            background-color: @green;
+            border-color: darken(@green, 10%);
+          }
+
+          i {
+            background-image: url("@{iconWhiteSpritePath}");
+            .opacity(100);
+          }
+
+          .label {
+            background-color: @grayLighter;
+
+            color: @textColor;
+          }
+        }
+
+        &.user-profile {
+          a:link, a:visited, a:hover, a:active {
+            background: none;
+            border: none;
+            margin-right: 8px;
+            margin-top: 5px;
+
+            font-weight: bold;
+            text-shadow: none;
+
+            img {
+              border-radius: @baseBorderRadius;
+              margin-right: 6px;
+              width: 32px;
+              height: 32px;
+              position: relative;
+              bottom: 1px;
+            }
+          }
+        }
+      }
+    }
+
+    .navbar-compact {
+      display: none;
+      
+      li {
+        &.user-profile {
+          &>a {
+            &:link, &:visited {
+              .border-radius(0);
+              margin-top: 0px;
+              padding: @baseFontSize;
+              padding-top: 10px;
+              padding-bottom: 8px;
+
+              img {
+                margin-right: 0px;
+                margin-left: 6px;
+              }
+
+              .caret-border {
+                background-color: @bodyBackground;
+                border: 1px solid @navbarBorder;
+                .border-radius(@baseBorderRadius);
+                margin-left: 8px;
+                padding: 0px 4px;
+
+                .caret {
+                  margin: 0px;
+                  padding: 0px;
+                  position: relative;
+                  top: 13px;
+                }
+              }
+            }
+
+            &:hover, &:active {
+              background-color: @bodyBackground;
+
+              .caret-border {
+                border-color: @grayLight;
+              }
+            }
+          }
+
+          &.open .dropdown-toggle {
+            &:link, &:visited, &:hover, &:focus {
+              background-color: @bodyBackground;
+
+              .caret-border {
+                background: @red;
+                border-color: @red;
+
+                .caret {
+                  border-top-color: @white;
+                }
+              }
+            }
+          }
+
+          .dropdown-menu {
+            border: none;
+            border: 1px solid darken(@navbarBorder, 10%);
+            .border-radius(@baseBorderRadius);
+            .box-shadow(0px 4px 3px fadeout(@gray, 30%));
+            margin: 0px;
+            margin-top: -6px;
+            margin-right: 0px;
+            padding: 4px 0px;
+            width: 270px;
+
+            &:before {
+              display: none;
+            }
+
+            &:after {
+              border-bottom: 6px solid @white;
+              margin-top: 0px;
+              margin-right: 11px;
+            }
+
+            &>li {
+              margin: 0px;
+              padding: 0px;
+
+              .label {
+                float: right;
+                margin: 0px;
+                margin-top: 2px;
+              }
+
+              a, .btn-link {
+                .border-radius(0);
+                clear: none;
+                display: block;
+                float: none;
+                margin: 0px;
+                padding: 6px 12px;
+
+                color: @textColor;
+                font-weight: normal;
+                text-align: left;
+                
+                i {
+                  .opacity(100);
+                }
+
+                &:link, &:active, &:visited, &:hover {
+                  .label {
+                    background-color: @red;
+                    float: right;
+
+                    color: @white;
+                    text-shadow: 0px 1px 0px darken(@red, 20%);
+                  }
+                }
+              }
+
+              a:link, a:visited {
+                .opacity(80);
+              }
+
+              a:hover {
+                background-color: @gray;
+                .opacity(100);
+
+                color: @white;
+              }
+
+              .btn-link {
+                background: none;
+                border: none;
+                width: 100%;
+
+                &:hover, &:active {
+                  background: @red;
+                  .opacity(100);
+
+                  color: @white;
+                  text-shadow: 0px 1px 0px darken(@red, 20%);
+                }
+
+                i {
+                  position: relative;
+                  top: 0px;
+                }
+              }
+            }
+          }
+        }
+      }
+    }
+
+    .navbar-user-nav {
+      li {
+        .btn {
+          padding: 2px 8px;
+          margin-left: 8px;
+          margin-top: (@baseLineHeight / 2) + 3;
+
+          &:link, &:active, &:hover, &:visited {
+            color: @white;
+          }
+
+          &.btn-danger {
+            text-shadow: 0px 1px 0px darken(@red, 15%);
+
+            &:hover, &:active, &:focus {
+              background-color: saturate(@red, 20%);
+              border-color: darken(saturate(@red, 20%), 5%);
+            }
+          }
+
+          &.btn-inverse {
+            text-shadow: 0px 1px 0px darken(@textColor, 15%);
+
+            &:hover, &:active, &:focus {
+              background-color: darken(@textColor, 5%);
+              border-color: darken(@textColor, 10%);
+            }
+          }
+        }
+      }
+    }
+  }
+}
+
+// Inversed navbar, used for moderation tools
+.navbar-modbar {
+  .navbar-inner {
+    background: none;
+    background-color: @grayDarker;
+    background-image: -webkit-gradient(linear, 0 0, 100% 100%,
+                color-stop(.25, rgba(0, 0, 0, 0.1)), color-stop(.25, transparent),
+                color-stop(.5, transparent), color-stop(.5, rgba(0, 0, 0, 0.1)),
+                color-stop(.75, rgba(0, 0, 0, 0.1)), color-stop(.75, transparent),
+                to(transparent));
+    background-image: -webkit-linear-gradient(-45deg, rgba(0, 0, 0, 0.1) 25%, transparent 25%,
+              transparent 50%, rgba(0, 0, 0, 0.1) 50%, rgba(0, 0, 0, 0.1) 75%,
+              transparent 75%, transparent);
+    background-image: -moz-linear-gradient(-45deg, rgba(0, 0, 0, 0.1) 25%, transparent 25%,
+              transparent 50%, rgba(0, 0, 0, 0.1) 50%, rgba(0, 0, 0, 0.1) 75%,
+              transparent 75%, transparent);
+    background-image: -ms-linear-gradient(-45deg, rgba(0, 0, 0, 0.1) 25%, transparent 25%,
+              transparent 50%, rgba(0, 0, 0, 0.1) 50%, rgba(0, 0, 0, 0.1) 75%,
+              transparent 75%, transparent);
+    background-image: -o-linear-gradient(-45deg, rgba(0, 0, 0, 0.1) 25%, transparent 25%,
+              transparent 50%, rgba(0, 0, 0, 0.1) 50%, rgba(0, 0, 0, 0.1) 75%,
+              transparent 75%, transparent);
+    background-image: linear-gradient(-45deg, rgba(0, 0, 0, 0.1) 25%, transparent 25%,
+              transparent 50%, rgba(0, 0, 0, 0.1) 50%, rgba(0, 0, 0, 0.1) 75%,
+              transparent 75%, transparent);
+    -webkit-background-size: 15px 15px;
+    -moz-background-size: 15px 15px;
+    background-size: 15px 15px;
+    border-bottom: 2px dashed @red;
+    min-height: 1px;
+
+    .nav {
+      a:link, a:visited {
+        padding: @fontSizeMini (@fontSizeMini * 1.4);
+
+        color: darken(@white, 30%);
+        text-shadow: 0px 1px 0px @black;
+      }
+
+      a:hover, a:active {
+        color: @white;
+      }
+
+      li.active {
+        a:link, a:visited {
+          color: @white;
+        }
+      }
+    }
+
+    .navbar-search-form {
+      background-color: darken(@grayDark, 15%);
+      border-radius: @baseBorderRadius;
+      margin-top: ((@navbarHeight - @baseLineHeight) / 2) - 9px;
+      padding: 1px 0px;
+
+      input {
+        background-color: darken(@grayDark, 15%);
+        border: none;
+        .box-shadow(none);
+        margin: 0px;
+
+        color: @grayLighter;
+        text-shadow: 0px 1px 0px @black;
+      }
+
+      button {
+        margin: 0px;
+        .opacity(60);
+
+        i {
+          background-image: url("@{iconWhiteSpritePath}");
+          .opacity(100);
+        }
+
+        &:hover, &:active {
+          .opacity(100);
+        }
+      }
+    }
+  }
 }

+ 46 - 46
static/cranefly/css/cranefly/newsfeed.less

@@ -1,47 +1,47 @@
-// News feed
-// -------------------------
-
-.news-feed {
-  .media {
-    overflow: auto;
-
-    .media-object {
-      border-radius: @baseBorderRadius;
-      width: 52px;
-      height: 52px;
-    }
-
-    .media-body {
-      margin-left: 52px + @baseFontSize;
-
-      .post-preview {
-        &:link, &:active, &:visited, &:hover {
-          display: block;
-          margin-top: @baseFontSize / 2;
-
-          color: @textColor;
-          font-size: @baseFontSize * 1.2;
-          text-decoration: none;
-        }
-      }
-
-      .media-footer {
-        margin: 0px;
-
-        color: @grayLight;
-        font-size: @fontSizeMini;
-        font-weight: normal;
-
-        a {
-          color: @gray;
-        }
-      }
-    }
-  }
-
-  hr {
-    border: none;
-    border-top: 1px solid @grayLighter;
-    margin: @baseLineHeight 0px;
-  }
+// News feed
+// -------------------------
+
+.news-feed {
+  .media {
+    overflow: auto;
+
+    .media-object {
+      border-radius: @baseBorderRadius;
+      width: 52px;
+      height: 52px;
+    }
+
+    .media-body {
+      margin-left: 52px + @baseFontSize;
+
+      .post-preview {
+        &:link, &:active, &:visited, &:hover {
+          display: block;
+          margin-top: @baseFontSize / 2;
+
+          color: @textColor;
+          font-size: @baseFontSize * 1.2;
+          text-decoration: none;
+        }
+      }
+
+      .media-footer {
+        margin: 0px;
+
+        color: @grayLight;
+        font-size: @fontSizeMini;
+        font-weight: normal;
+
+        a {
+          color: @gray;
+        }
+      }
+    }
+  }
+
+  hr {
+    border: none;
+    border-top: 1px solid @grayLighter;
+    margin: @baseLineHeight 0px;
+  }
 }

+ 46 - 46
static/cranefly/css/cranefly/pagination.less

@@ -1,47 +1,47 @@
-// Pagination
-// -------------------------
-.pagination {
-  margin: 0px;
-  padding: 0px;
-  
-  .count {
-    margin-right: @baseFontSize * 0.75;
-    padding: 4px 0px;
-
-    color: @grayLight;
-  }
-
-  ul {
-    .box-shadow(none);
-
-    li {
-      float: left;
-      margin: 0px;
-      margin-right: @baseFontSize / 3;
-      padding: 0px;
-
-      a:link, a:visited {
-        background-color: @paginationBackground;
-        border: 1px solid @paginationBorder;
-        border-radius: @baseBorderRadius;
-        padding: 3px 7px;
-
-        color: @grayLight;
-
-        i {
-          .opacity(55);
-        }
-      }
-
-      a:active, a:hover {
-        border: 1px solid @paginationActiveBackground;
-
-        color: @gray;
-
-        i {
-          .opacity(100);
-        }
-      }
-    }
-  }
+// Pagination
+// -------------------------
+.pagination {
+  margin: 0px;
+  padding: 0px;
+  
+  .count {
+    margin-right: @baseFontSize * 0.75;
+    padding: 4px 0px;
+
+    color: @grayLight;
+  }
+
+  ul {
+    .box-shadow(none);
+
+    li {
+      float: left;
+      margin: 0px;
+      margin-right: @baseFontSize / 3;
+      padding: 0px;
+
+      a:link, a:visited {
+        background-color: @paginationBackground;
+        border: 1px solid @paginationBorder;
+        border-radius: @baseBorderRadius;
+        padding: 3px 7px;
+
+        color: @grayLight;
+
+        i {
+          .opacity(55);
+        }
+      }
+
+      a:active, a:hover {
+        border: 1px solid @paginationActiveBackground;
+
+        color: @gray;
+
+        i {
+          .opacity(100);
+        }
+      }
+    }
+  }
 }

+ 128 - 128
static/cranefly/css/cranefly/profiles.less

@@ -1,129 +1,129 @@
-// User Profiles
-// -------------------------
-
-.profiles-list {
-  .user-cell {
-    overflow: auto;
-
-    .user-avatar {
-      float: left;
-
-      img {
-        border-radius: @baseBorderRadius;
-        width: 36px;
-        height: 36px; 
-      }
-    }
-
-    .user-name {
-      &:link, &:active, &:visited, &:hover {
-        display: block;
-        margin: 0px;
-        margin-left: 36px + (@baseFontSize / 2);
-        margin-top: (36px - (@baseFontSize * 1.7)) / 2 + 3px;
-
-        color: @textColor;
-        font-size: @baseFontSize * 1.7;
-      }
-    }
-  }
-}
-
-.user-profile {
-  .user-profile-header {
-    .header-avatar {
-      border-radius: @baseBorderRadius;
-      float: left;
-      width: 80px;
-      height: 80px;
-      margin-top: -8px;
-    }
-
-    .header-side {
-      margin-left: 80px + @baseFontSize;
-
-      h1 {
-        margin-left: (@baseLineHeight / 3);
-      }
-    }
-  }
-
-  hr {
-    border: none;
-    border-top: 1px solid @grayLighter;
-    margin: @baseFontSize 0px;
-  }
-
-  .user-details {
-    .label {
-      font-size: @baseFontSize;
-    }
-  }
-
-  .user-list {
-    .user-cell {
-      overflow: auto;
-
-      .user-avatar {
-        float: left;
-
-        img {
-          border-radius: @baseBorderRadius;
-          width: 36px;
-          height: 36px; 
-        }
-      }
-
-      .user-name {
-        &:link, &:active, &:visited, &:hover {
-          display: block;
-          margin: 0px;
-          margin-left: 36px + (@baseFontSize / 2);
-          margin-top: (36px - (@baseFontSize * 1.7)) / 2 + 3px;
-
-          color: @textColor;
-          font-size: @baseFontSize * 1.7;
-        }
-      }
-    }
-  }
-
-  .content-list {
-    .media {
-      overflow: auto;
-
-      .media-object {
-        border-radius: @baseBorderRadius;
-        width: 52px;
-        height: 52px;
-      }
-
-      .media-body {
-        margin-left: 52px + @baseFontSize;
-
-        .post-preview {
-          &:link, &:active, &:visited, &:hover {
-            display: block;
-            margin-top: @baseFontSize / 2;
-
-            color: @textColor;
-            font-size: @baseFontSize * 1.2;
-            text-decoration: none;
-          }
-        }
-
-        .media-footer {
-          margin: 0px;
-
-          color: @grayLight;
-          font-size: @fontSizeMini;
-          font-weight: normal;
-
-          a {
-            color: @gray;
-          }
-        }
-      }
-    }
-  }
+// User Profiles
+// -------------------------
+
+.profiles-list {
+  .user-cell {
+    overflow: auto;
+
+    .user-avatar {
+      float: left;
+
+      img {
+        border-radius: @baseBorderRadius;
+        width: 36px;
+        height: 36px; 
+      }
+    }
+
+    .user-name {
+      &:link, &:active, &:visited, &:hover {
+        display: block;
+        margin: 0px;
+        margin-left: 36px + (@baseFontSize / 2);
+        margin-top: (36px - (@baseFontSize * 1.7)) / 2 + 3px;
+
+        color: @textColor;
+        font-size: @baseFontSize * 1.7;
+      }
+    }
+  }
+}
+
+.user-profile {
+  .user-profile-header {
+    .header-avatar {
+      border-radius: @baseBorderRadius;
+      float: left;
+      width: 80px;
+      height: 80px;
+      margin-top: -8px;
+    }
+
+    .header-side {
+      margin-left: 80px + @baseFontSize;
+
+      h1 {
+        margin-left: (@baseLineHeight / 3);
+      }
+    }
+  }
+
+  hr {
+    border: none;
+    border-top: 1px solid @grayLighter;
+    margin: @baseFontSize 0px;
+  }
+
+  .user-details {
+    .label {
+      font-size: @baseFontSize;
+    }
+  }
+
+  .user-list {
+    .user-cell {
+      overflow: auto;
+
+      .user-avatar {
+        float: left;
+
+        img {
+          border-radius: @baseBorderRadius;
+          width: 36px;
+          height: 36px; 
+        }
+      }
+
+      .user-name {
+        &:link, &:active, &:visited, &:hover {
+          display: block;
+          margin: 0px;
+          margin-left: 36px + (@baseFontSize / 2);
+          margin-top: (36px - (@baseFontSize * 1.7)) / 2 + 3px;
+
+          color: @textColor;
+          font-size: @baseFontSize * 1.7;
+        }
+      }
+    }
+  }
+
+  .content-list {
+    .media {
+      overflow: auto;
+
+      .media-object {
+        border-radius: @baseBorderRadius;
+        width: 52px;
+        height: 52px;
+      }
+
+      .media-body {
+        margin-left: 52px + @baseFontSize;
+
+        .post-preview {
+          &:link, &:active, &:visited, &:hover {
+            display: block;
+            margin-top: @baseFontSize / 2;
+
+            color: @textColor;
+            font-size: @baseFontSize * 1.2;
+            text-decoration: none;
+          }
+        }
+
+        .media-footer {
+          margin: 0px;
+
+          color: @grayLight;
+          font-size: @fontSizeMini;
+          font-weight: normal;
+
+          a {
+            color: @gray;
+          }
+        }
+      }
+    }
+  }
 }

+ 78 - 78
static/cranefly/css/cranefly/report.less

@@ -1,79 +1,79 @@
-// Report view
-// ------------------------
-
-.report-view {
-  .report-wrapper {
-    background-color: @grayLighter;
-    background-image: -webkit-gradient(linear, 0 0, 100% 100%,
-                color-stop(.25, rgba(255, 255, 255, .2)), color-stop(.25, transparent),
-                color-stop(.5, transparent), color-stop(.5, rgba(255, 255, 255, .2)),
-                color-stop(.75, rgba(255, 255, 255, .2)), color-stop(.75, transparent),
-                to(transparent));
-    background-image: -webkit-linear-gradient(-45deg, rgba(255, 255, 255, .2) 25%, transparent 25%,
-              transparent 50%, rgba(255, 255, 255, .2) 50%, rgba(255, 255, 255, .2) 75%,
-              transparent 75%, transparent);
-    background-image: -moz-linear-gradient(-45deg, rgba(255, 255, 255, .2) 25%, transparent 25%,
-              transparent 50%, rgba(255, 255, 255, .2) 50%, rgba(255, 255, 255, .2) 75%,
-              transparent 75%, transparent);
-    background-image: -ms-linear-gradient(-45deg, rgba(255, 255, 255, .2) 25%, transparent 25%,
-              transparent 50%, rgba(255, 255, 255, .2) 50%, rgba(255, 255, 255, .2) 75%,
-              transparent 75%, transparent);
-    background-image: -o-linear-gradient(-45deg, rgba(255, 255, 255, .2) 25%, transparent 25%,
-              transparent 50%, rgba(255, 255, 255, .2) 50%, rgba(255, 255, 255, .2) 75%,
-              transparent 75%, transparent);
-    background-image: linear-gradient(-45deg, rgba(255, 255, 255, .2) 25%, transparent 25%,
-              transparent 50%, rgba(255, 255, 255, .2) 50%, rgba(255, 255, 255, .2) 75%,
-              transparent 75%, transparent);
-    -webkit-background-size: 10px 10px;
-    -moz-background-size: 10px 10px;
-    background-size: 10px 10px;
-    .border-radius(6px);
-    padding: 8px;
-    margin-bottom: 8px;
-
-    .post-body {
-      margin-bottom: 0px;
-
-      .report-actions {
-        border-left: none !important;
-        float: left !important;
-        padding: 0px !important;
-
-        form:first-child .btn {
-          .border-radius(0px 0px 0px @baseBorderRadius) !important;
-        }
-
-        .btn {
-          .opacity(90) !important;
-          margin: 0px !important;
-          padding: 8px 12px !important;
-
-          color: @white !important;
-          font-weight: bold !important;
-
-          i {
-            background-image: url("@{iconWhiteSpritePath}");
-            position: relative;
-            top: 0px;
-          }
-
-          &:hover, &:active, &:focus {
-            .opacity(100) !important;
-
-            text-decoration: none !important;
-          }
-
-          &.btn-resolve {
-            background-color: darken(@green, 5%);
-            text-shadow: 0px 1px 0px darken(@green, 20%);
-          }
-
-          &.btn-bogus {
-            background-color: @grayDark;
-            text-shadow: 0px 1px 0px darken(@grayDark, 20%);
-          }
-        }
-      }
-    }
-  }
+// Report view
+// ------------------------
+
+.report-view {
+  .report-wrapper {
+    background-color: @grayLighter;
+    background-image: -webkit-gradient(linear, 0 0, 100% 100%,
+                color-stop(.25, rgba(255, 255, 255, .2)), color-stop(.25, transparent),
+                color-stop(.5, transparent), color-stop(.5, rgba(255, 255, 255, .2)),
+                color-stop(.75, rgba(255, 255, 255, .2)), color-stop(.75, transparent),
+                to(transparent));
+    background-image: -webkit-linear-gradient(-45deg, rgba(255, 255, 255, .2) 25%, transparent 25%,
+              transparent 50%, rgba(255, 255, 255, .2) 50%, rgba(255, 255, 255, .2) 75%,
+              transparent 75%, transparent);
+    background-image: -moz-linear-gradient(-45deg, rgba(255, 255, 255, .2) 25%, transparent 25%,
+              transparent 50%, rgba(255, 255, 255, .2) 50%, rgba(255, 255, 255, .2) 75%,
+              transparent 75%, transparent);
+    background-image: -ms-linear-gradient(-45deg, rgba(255, 255, 255, .2) 25%, transparent 25%,
+              transparent 50%, rgba(255, 255, 255, .2) 50%, rgba(255, 255, 255, .2) 75%,
+              transparent 75%, transparent);
+    background-image: -o-linear-gradient(-45deg, rgba(255, 255, 255, .2) 25%, transparent 25%,
+              transparent 50%, rgba(255, 255, 255, .2) 50%, rgba(255, 255, 255, .2) 75%,
+              transparent 75%, transparent);
+    background-image: linear-gradient(-45deg, rgba(255, 255, 255, .2) 25%, transparent 25%,
+              transparent 50%, rgba(255, 255, 255, .2) 50%, rgba(255, 255, 255, .2) 75%,
+              transparent 75%, transparent);
+    -webkit-background-size: 10px 10px;
+    -moz-background-size: 10px 10px;
+    background-size: 10px 10px;
+    .border-radius(6px);
+    padding: 8px;
+    margin-bottom: 8px;
+
+    .post-body {
+      margin-bottom: 0px;
+
+      .report-actions {
+        border-left: none !important;
+        float: left !important;
+        padding: 0px !important;
+
+        form:first-child .btn {
+          .border-radius(0px 0px 0px @baseBorderRadius) !important;
+        }
+
+        .btn {
+          .opacity(90) !important;
+          margin: 0px !important;
+          padding: 8px 12px !important;
+
+          color: @white !important;
+          font-weight: bold !important;
+
+          i {
+            background-image: url("@{iconWhiteSpritePath}");
+            position: relative;
+            top: 0px;
+          }
+
+          &:hover, &:active, &:focus {
+            .opacity(100) !important;
+
+            text-decoration: none !important;
+          }
+
+          &.btn-resolve {
+            background-color: darken(@green, 5%);
+            text-shadow: 0px 1px 0px darken(@green, 20%);
+          }
+
+          &.btn-bogus {
+            background-color: @grayDark;
+            text-shadow: 0px 1px 0px darken(@grayDark, 20%);
+          }
+        }
+      }
+    }
+  }
 }

+ 53 - 53
static/cranefly/css/cranefly/reports.less

@@ -1,54 +1,54 @@
-// Reports list
-// ------------------------
-
-.reports-list {
-  .thread-label {
-    overflow: visible;
-
-    .report-label {
-      .border-radius(3px);
-      float: right;
-      padding: 3px 8px;
-      position: relative;
-      right: -32px;
-      bottom: 2px;
-
-      color: @white;
-      font-weight: bold;
-
-      i {
-        background-image: url("@{iconWhiteSpritePath}");
-      }
-
-      &.report-open {
-        background-color: @orange;
-        text-shadow: 0px 1px 0px darken(@orange, 20%);
-      }
-
-      &.report-resolved {
-        background-color: @green;
-        text-shadow: 0px 1px 0px darken(@green, 20%);
-      }
-
-      &.report-bogus {
-        background-color: @gray;
-        text-shadow: 0px 1px 0px darken(@gray, 20%);
-      }
-    }
-  }
-
-  .thread-name {
-    .report-id {
-      color: @grayLight !important;
-    }
-  }
-
-  .thread-name, .thread-details {
-    margin-left: 0px !important;
-  }
-
-  .thread-icon {
-    display: none !important;
-    float: none;
-  }
+// Reports list
+// ------------------------
+
+.reports-list {
+  .thread-label {
+    overflow: visible;
+
+    .report-label {
+      .border-radius(3px);
+      float: right;
+      padding: 3px 8px;
+      position: relative;
+      right: -32px;
+      bottom: 2px;
+
+      color: @white;
+      font-weight: bold;
+
+      i {
+        background-image: url("@{iconWhiteSpritePath}");
+      }
+
+      &.report-open {
+        background-color: @orange;
+        text-shadow: 0px 1px 0px darken(@orange, 20%);
+      }
+
+      &.report-resolved {
+        background-color: @green;
+        text-shadow: 0px 1px 0px darken(@green, 20%);
+      }
+
+      &.report-bogus {
+        background-color: @gray;
+        text-shadow: 0px 1px 0px darken(@gray, 20%);
+      }
+    }
+  }
+
+  .thread-name {
+    .report-id {
+      color: @grayLight !important;
+    }
+  }
+
+  .thread-name, .thread-details {
+    margin-left: 0px !important;
+  }
+
+  .thread-icon {
+    display: none !important;
+    float: none;
+  }
 }

+ 69 - 69
static/cranefly/css/cranefly/scaffolding.less

@@ -1,70 +1,70 @@
-// Layout classess
-// -------------------------
-
-html, body {
-  height: 100%;
-}
-
-#wrap {
-  min-height: 100%;
-  height: auto !important;
-  height: 100%;
-  margin: 0 auto ((@footerHeight * -1) - @baseFontSize + 2px);
-
-  .container-primary {
-    padding-top: @baseLineHeight;
-    padding-bottom: @footerHeight + (@baseLineHeight * 1.5);
-
-    .page-description {
-      margin-bottom: @baseLineHeight;
-    }
-
-    hr {
-      border: none;
-      border-top: 1px solid @grayLighter;
-    }
-  }
-}
-
-// Footer
-// -------------------------
-footer {
-  background-color: @footerBackground;
-  border-top: 1px solid @footerBorder;
-  height: @footerHeight;
-  padding: @paddingLarge;
-  padding-bottom: 0px;
-
-  .container {
-    hr {
-      border-bottom: 1px solid @footerBorder;
-      margin: (@baseLineHeight / 2) 0px;
-    }
-
-    .credits {
-      p {
-        margin-bottom: 0px;
-
-        color: @gray;
-        font-size: 90%;
-
-        a:link, a:active, a:visited, a:hover {
-          color: @gray;
-        }
-      }
-    }
-  }
-}
-
-// Selection
-// -------------------------
-::selection {
-  background: @orange;
-
-  color: @white;
-}
-::-moz-selection {
-  background: @orange;
-
-  color: @white;
+// Layout classess
+// -------------------------
+
+html, body {
+  height: 100%;
+}
+
+#wrap {
+  min-height: 100%;
+  height: auto !important;
+  height: 100%;
+  margin: 0 auto ((@footerHeight * -1) - @baseFontSize + 2px);
+
+  .container-primary {
+    padding-top: @baseLineHeight;
+    padding-bottom: @footerHeight + (@baseLineHeight * 1.5);
+
+    .page-description {
+      margin-bottom: @baseLineHeight;
+    }
+
+    hr {
+      border: none;
+      border-top: 1px solid @grayLighter;
+    }
+  }
+}
+
+// Footer
+// -------------------------
+footer {
+  background-color: @footerBackground;
+  border-top: 1px solid @footerBorder;
+  height: @footerHeight;
+  padding: @paddingLarge;
+  padding-bottom: 0px;
+
+  .container {
+    hr {
+      border-bottom: 1px solid @footerBorder;
+      margin: (@baseLineHeight / 2) 0px;
+    }
+
+    .credits {
+      p {
+        margin-bottom: 0px;
+
+        color: @gray;
+        font-size: 90%;
+
+        a:link, a:active, a:visited, a:hover {
+          color: @gray;
+        }
+      }
+    }
+  }
+}
+
+// Selection
+// -------------------------
+::selection {
+  background: @orange;
+
+  color: @white;
+}
+::-moz-selection {
+  background: @orange;
+
+  color: @white;
 }

+ 105 - 105
static/cranefly/css/cranefly/search.less

@@ -1,106 +1,106 @@
-// Search forum
-// ------------------------
-
-.search-suggestion {
-  overflow: auto;
-
-  p, form {
-    float: left;
-  }
-
-  .lead {
-    color: lighten(@gray, 15%);
-  }
-
-  form {
-    .btn-link {
-      margin-top: 1px;
-
-      color: @bluePale;
-      font-size: @baseFontSize * 1.5;
-      font-style: italic;
-      font-weight: 200;
-      text-decoration: underline;
-
-      &:hover, &:active {
-        color: @bluePale;
-        text-decoration: underline !important;
-      }
-    }
-  }
-}
-
-.search-resume {
-  .muted {
-    color: lighten(@gray, 15%);
-
-    a {
-      color: @textColor;
-    }
-  }
-}
-
-.search-results {
-  .results-list {
-    .result {
-      border-bottom: 1px solid darken(@bodyBackground, 5%);
-      margin-bottom: (@baseLineHeight / 2);
-      padding-bottom: (@baseLineHeight / 2);
-
-      .result-avatar {
-        float: left;
-
-        img {
-          .border-radius(@baseBorderRadius);
-          width: 70px;
-          height: 70px;
-        }
-      }
-
-      .result-content {
-        margin-left: 70px + @baseFontSize;
-        h3 {
-          margin: 0px;
-
-          line-height: @baseLineHeight;
-
-          a:link, a:visited {
-            color: @gray;
-            font-weight: normal;
-            font-size: @baseFontSize * 1.3;
-            text-decoration: underline;
-          }
-
-          a:hover, a:active {
-            color: @textColor;
-          }
-        }
-
-        .post-preview {
-          margin: 0px;
-          margin-top: 6px;
-
-          color: @textColor;
-          font-size: @baseFontSize * 1.1;
-          line-height: @baseLineHeight;
-
-          strong {
-            color: @red;
-          }
-        }
-
-        .post-extra {
-          margin: 0px;
-
-          color: @grayLight;
-          font-size: @baseFontSize * 0.8;
-          line-height: @baseLineHeight;
-
-          a {
-            color: @textColor;
-          }
-        }
-      }
-    }
-  }
+// Search forum
+// ------------------------
+
+.search-suggestion {
+  overflow: auto;
+
+  p, form {
+    float: left;
+  }
+
+  .lead {
+    color: lighten(@gray, 15%);
+  }
+
+  form {
+    .btn-link {
+      margin-top: 1px;
+
+      color: @bluePale;
+      font-size: @baseFontSize * 1.5;
+      font-style: italic;
+      font-weight: 200;
+      text-decoration: underline;
+
+      &:hover, &:active {
+        color: @bluePale;
+        text-decoration: underline !important;
+      }
+    }
+  }
+}
+
+.search-resume {
+  .muted {
+    color: lighten(@gray, 15%);
+
+    a {
+      color: @textColor;
+    }
+  }
+}
+
+.search-results {
+  .results-list {
+    .result {
+      border-bottom: 1px solid darken(@bodyBackground, 5%);
+      margin-bottom: (@baseLineHeight / 2);
+      padding-bottom: (@baseLineHeight / 2);
+
+      .result-avatar {
+        float: left;
+
+        img {
+          .border-radius(@baseBorderRadius);
+          width: 70px;
+          height: 70px;
+        }
+      }
+
+      .result-content {
+        margin-left: 70px + @baseFontSize;
+        h3 {
+          margin: 0px;
+
+          line-height: @baseLineHeight;
+
+          a:link, a:visited {
+            color: @gray;
+            font-weight: normal;
+            font-size: @baseFontSize * 1.3;
+            text-decoration: underline;
+          }
+
+          a:hover, a:active {
+            color: @textColor;
+          }
+        }
+
+        .post-preview {
+          margin: 0px;
+          margin-top: 6px;
+
+          color: @textColor;
+          font-size: @baseFontSize * 1.1;
+          line-height: @baseLineHeight;
+
+          strong {
+            color: @red;
+          }
+        }
+
+        .post-extra {
+          margin: 0px;
+
+          color: @grayLight;
+          font-size: @baseFontSize * 0.8;
+          line-height: @baseLineHeight;
+
+          a {
+            color: @textColor;
+          }
+        }
+      }
+    }
+  }
 }

+ 21 - 21
static/cranefly/css/cranefly/signin.less

@@ -1,22 +1,22 @@
-// Sign-in page
-// -------------------------
-
-.signin-help {
-  h2 {
-    margin-bottom: 0px;
-
-    color: @grayLight;
-    font-size: @fontSizeLarge;
-  }
-
-  ul {
-    margin-bottom: 0px;
-  }
-
-  a:link, a:visited {
-    .opacity(90);
-
-    color: @textColor;
-    font-weight: bold;
-  }
+// Sign-in page
+// -------------------------
+
+.signin-help {
+  h2 {
+    margin-bottom: 0px;
+
+    color: @grayLight;
+    font-size: @fontSizeLarge;
+  }
+
+  ul {
+    margin-bottom: 0px;
+  }
+
+  a:link, a:visited {
+    .opacity(90);
+
+    color: @textColor;
+    font-weight: bold;
+  }
 }

+ 621 - 621
static/cranefly/css/cranefly/thread.less

@@ -1,622 +1,622 @@
-// Thread view
-// -------------------------
-
-.thread-buttons {
-  overflow: auto;
-
-  .pull-right {
-    margin-left: @baseFontSize;
-  }
-
-  .thread-signin-message {
-    float: right;
-
-    a:link, a:visited {
-      color: @textColor;
-    }
-  }
-}
-
-// Thread body styles
-.thread-body {
-  .post-wrapper {
-    // Post body
-    .post-body {
-      margin-bottom: @baseLineHeight;
-      overflow: auto;
-
-      .user-avatar {
-        border-radius: @borderRadiusLarge;
-        float: left;
-        width: 100px;
-        height: 100px;
-      }
-
-      .post-content {
-        background-color: @postBackground;
-        border: 1px solid @postBorder;
-        border-radius: @borderRadiusLarge;
-        margin-left: 100px + (@baseFontSize * 1.5);
-        min-height: 100px;
-        position: relative;
-
-        &:after, &:before {
-          right: 100%;
-          border: solid transparent;
-          content: "";
-          height: 0; width: 0;
-          position: absolute;
-          pointer-events: none;
-        }
-
-        &:after {
-          border-color: transparent;
-          border-right-color: @postBackground;
-          border-width: @fontSizeMini;
-          top: @baseFontSize;
-          margin-top: (@baseFontSize * -1) + @baseFontSize;
-        }
-
-        &:before {
-           border-color: transparent;
-           border-right-color: @postBorder;
-           border-width: @fontSizeMini + 1;
-           top: @baseFontSize;
-           margin-top: (@baseFontSize * -1) + @baseFontSize - 1px;
-        }
-
-        .post-header {
-          padding: (@baseFontSize / 2) @baseFontSize;
-          padding-bottom: 0px;
-
-          color: grayLighter;
-
-          .post-author {
-            color: @textColor;
-            font-weight: bold;
-          }
-
-          .post-author-label {
-            text-shadow: none;
-
-            &.post-label-guest {
-              background-color: @grayLighter;
-
-              color: @grayLight;
-            }
-          }
-
-          .separator {
-            color: @grayLighter;
-            font-size: @fontSizeLarge;
-            line-height: 5px;
-          }
-
-          .post-date {
-            color: @grayLight;
-          }
-
-          .post-changelog {
-            color: @grayLight;
-
-            &:hover, &:active {
-              color: @textColor;
-            }
-          }
-
-          .post-perma {
-            display: block;
-            float: right;
-            padding-left: 6px;
-
-            color: @grayLight;
-            font-weight: bold;
-
-            &:hover, &:active {
-              color: @textColor;
-            }
-          }
-
-          .post-checkbox {
-            float: right;
-            position: relative;
-            left: @baseFontSize - 4px;
-          }
-
-          .post-extra {
-            float: right;
-
-            .label {
-              margin-left: @baseFontSize / 4;
-
-              text-shadow: none;
-
-              &.label-purple {
-                background-color: #7e2ecf;
-              }
-            }
-          }
-        }
-
-        .post-message {
-          .markdown {
-            padding: @baseFontSize;
-          }
-
-          .post-signature {
-            border-top: 1px dotted darken(@postBackground, 25%);
-            .opacity(60);
-            margin: 0px @baseFontSize;
-
-            font-size: 80%;
-
-            .markdown {
-              padding: 0px;
-              padding-top: @baseLineHeight / 4;
-              padding-bottom: @baseFontSize;
-            }
-          }
-        }
-
-        .post-footer {
-          border-top: 1px solid @postBorder;
-          overflow: auto;
-
-          &:empty {
-            display: none;
-          }
-
-          .post-rating {
-            float: left;
-            overflow: auto;
-            padding: (@baseFontSize / 2) @baseFontSize;
-            border-right: 1px dotted @postBorder;
-
-            a {
-              color: @grayLight;
-
-              &:hover, a:active {
-                color: @textColor;
-              }
-            }
-
-            span {
-              float: left;
-
-              &.post-score {
-                color: @grayLight;
-                font-weight: bold;
-
-                &.post-score-good {
-                  color: @green;
-                }
-
-                &.post-score-bad {
-                  color: @red;
-                }
-              }
-
-              &.post-neutral, &.post-like, &.post-hate {
-                margin-left: (@baseFontSize / 4); 
-              }
-
-              &.post-neutral {
-                color: @grayLight;
-              }
-
-              &.post-like {
-                color: @green;
-              }
-
-              &.post-hate {
-                color: @red;
-              }
-            }
-
-            form {
-              float: left;
-              margin: 0px;
-              padding: 0px;
-
-              .btn-link {
-                float: right;
-                margin: 0px;
-                margin-left: (@baseFontSize / 4);
-                .opacity(100);
-                padding: 0px;
-
-                color: @grayLight;
-                font-weight: normal;
-
-                &:hover, &:active, &:focus {
-                  text-decoration: underline;
-                }
-
-                &.post-like {
-                  &:hover, &:active, &:focus, &:disabled {
-                    color: @green;
-                  }
-                }
-
-                &.post-hate {
-                  &:hover, &:active, &:focus, &:disabled {
-                    color: @red;
-                  }
-                }
-
-                &:disabled {
-                  &:hover, &:active, &:focus {
-                    text-decoration: none;
-                  }
-                }
-              }
-            }
-          }
-
-          .post-actions {
-            border-left: 1px dotted @postBorder;
-            float: right;
-            padding: (@baseFontSize / 2) @baseFontSize;
-
-            color: @grayLight;
-
-            a, span, form {
-              float: left;
-              overflow: auto;
-            }
-
-            form {
-              margin: 0px;
-              padding: 0px;
-
-              .btn {
-                float: right;
-                margin: 0px;
-                margin-left: @baseFontSize;
-                .opacity(100);
-                padding: 0px;
-
-                color: @grayLight;
-                font-weight: normal;
-
-                &:hover, &:active, &:focus {
-                  color: @red;
-                  text-decoration: underline;
-                }
-
-                &.btn-report {
-                  &:disabled {
-                    color: @green;
-                  }
-                }
-
-                &.btn-hide {
-                  &:hover, &:active, &:focus {
-                    color: @orange;
-                  }
-                }
-              }
-
-              &:first-child .btn {
-                margin-left: 0px;
-              }
-            }
-
-            a {
-              margin-left: @baseFontSize;
-
-              color: @grayLight;
-
-              &:hover, a:active {
-                color: @textColor;
-              }
-
-              &:first-child {
-                margin-left: 0px;
-              }
-
-              &.post-reply {
-                color: @gray;
-
-                &:hover, a:active {
-                  color: @blue;
-                }
-              }
-            }
-          }
-        }
-      }
-
-      &.post-muted {        
-        .user-avatar {
-          width: 50px;
-          height: 50px;
-          .opacity(75);
-        }
-
-        .post-content {
-          margin-left: 50px + (@baseFontSize * 1.5);
-          min-height: 0px;
-          .opacity(75);
-          padding: @baseFontSize;
-
-          .post-header {
-            float: right;
-            margin: 0px;
-            margin-top: ((@baseFontSize / 2) * -1);
-            margin-right: @baseFontSize * -1;
-
-            .post-header-compact {
-              float: left;
-              margin-right: @baseFontSize;
-            }
-          }
-
-          .post-message {
-            color: @grayLight;
-            font-size: @fontSizeLarge;
-
-            strong, a {
-              color: @textColor;
-              font-weight: normal;
-            }
-          }
-        }
-      }
-    }
-  }
-
-  .post-checkpoints {
-    .post-checkpoint {
-      text-align: center;
-
-      margin-bottom: @baseLineHeight;
-
-      &.checkpoint-deleted {
-        .opacity(30);
-
-        &:hover {
-          .opacity(60);
-        }
-      }
-
-      hr {
-        background-color: @grayLight;
-        background-image: -webkit-gradient(linear, 0 0, 100% 100%,
-                    color-stop(.25, rgba(255, 255, 255, .2)), color-stop(.25, transparent),
-                    color-stop(.5, transparent), color-stop(.5, rgba(255, 255, 255, .2)),
-                    color-stop(.75, rgba(255, 255, 255, .2)), color-stop(.75, transparent),
-                    to(transparent));
-        background-image: -webkit-linear-gradient(-45deg, rgba(255, 255, 255, .2) 25%, transparent 25%,
-                  transparent 50%, rgba(255, 255, 255, .2) 50%, rgba(255, 255, 255, .2) 75%,
-                  transparent 75%, transparent);
-        background-image: -moz-linear-gradient(-45deg, rgba(255, 255, 255, .2) 25%, transparent 25%,
-                  transparent 50%, rgba(255, 255, 255, .2) 50%, rgba(255, 255, 255, .2) 75%,
-                  transparent 75%, transparent);
-        background-image: -ms-linear-gradient(-45deg, rgba(255, 255, 255, .2) 25%, transparent 25%,
-                  transparent 50%, rgba(255, 255, 255, .2) 50%, rgba(255, 255, 255, .2) 75%,
-                  transparent 75%, transparent);
-        background-image: -o-linear-gradient(-45deg, rgba(255, 255, 255, .2) 25%, transparent 25%,
-                  transparent 50%, rgba(255, 255, 255, .2) 50%, rgba(255, 255, 255, .2) 75%,
-                  transparent 75%, transparent);
-        background-image: linear-gradient(-45deg, rgba(255, 255, 255, .2) 25%, transparent 25%,
-                  transparent 50%, rgba(255, 255, 255, .2) 50%, rgba(255, 255, 255, .2) 75%,
-                  transparent 75%, transparent);
-        -webkit-background-size: 10px 10px;
-        -moz-background-size: 10px 10px;
-        background-size: 10px 10px;
-        border: none;
-        height: 4px;
-        margin-bottom: (@baseLineHeight * -1) + (@baseFontSize / 2) + 1px;
-      }
-
-      span {
-        background-color: @bodyBackground;
-        padding: 0px @baseFontSize;
-
-        color: @grayLight;
-
-        a {
-          color: @textColor;
-        }
-
-        i {
-          .opacity(43);
-        }
-
-        form {
-          display: inline-block;
-          margin: 0px;
-          margin-top: -3px;
-          margin-left: @baseFontSize / 2;
-          padding: 0px;
-
-          .btn {
-            margin-top: -2px;
-            padding: 0px;
-
-            font-weight: normal;
-
-            &:active, &:hover {
-              text-decoration: underline;
-
-              &.btn-show, &.btn-hide {
-                color: @orange;
-              }
-
-              &.btn-delete {
-                color: @red;
-              }
-            }
-          }
-        }
-
-        form:first-of-type {
-          margin-left: @baseFontSize;
-        }
-      }
-    }
-  }
-}
-
-// Thread moderation
-.thread-moderation {
-  background-color: @categoryBackground;
-  border: 1px solid @categoryBorder;
-  border-radius: @baseBorderRadius;
-  .box-shadow(0px 0px 0px 3px @categoryShadow);
-  margin-bottom: @baseLineHeight;
-  overflow: auto;
-  padding: (@baseFontSize / 2);
-
-  form {
-    margin: 0px;
-  }
-}
-
-// Quick reply styles
-.thread-quick-reply {
-  overflow: auto;
-  margin-top: @baseLineHeight;
-
-  .user-avatar {
-    border-radius: @baseBorderRadius;
-    float: left;
-    width: 100px;
-    height: 100px;
-    overflow: visible;
-  }
-
-  .editor {
-    margin-left: 100px + (@baseFontSize * 1.5);
-    position: relative;
-
-    &:after, &:before {
-      right: 100%;
-      border: solid transparent;
-      content: "";
-      height: 0; width: 0;
-      position: absolute;
-      pointer-events: none;
-    }
-
-    &:after {
-      border-color: transparent;
-      border-right-color: @editorBackground;
-      border-width: @fontSizeMini;
-      top: @baseFontSize;
-      margin-top: (@baseFontSize * -1) + @baseFontSize;
-    }
-
-    &:before {
-       border-color: transparent;
-       border-right-color: darken(@editorBackground, 10%);
-       border-width: @fontSizeMini + 1;
-       top: @baseFontSize;
-       margin-top: (@baseFontSize * -1) + @baseFontSize - 1px;
-    }
-  }
-}
-
-// Thread participants list
-.thread-participants {
-  h3 {
-    margin: 0px;
-    margin-top: (@baseLineHeight - @baseFontSize) * -1;
-    padding: 0px;
-
-    color: @gray;
-    font-size: @fontSizeLarge;
-    font-weight: bold;
-  }
-
-  ul {
-    background-color: @white;
-    border: 1px solid darken(@bodyBackground, 10%);
-    border-radius: @baseBorderRadius;
-    margin: 0px;
-    margin-bottom: @baseLineHeight;
-    padding: 0px;
-
-    li {
-      border-bottom: 1px dotted darken(@bodyBackground, 10%);
-      margin: 0px;
-      padding: 6px 8px;
-
-      font-weight: bold;
-
-      img {
-        border-radius: @borderRadiusSmall;
-        width: 24px;
-        height: 24px;
-      }
-
-      a:link, a:active, a:visited, a:hover {
-        margin: 0px 4px;
-
-        color: @textColor;
-        font-weight: bold;
-      }
-
-      &:last-child {
-        border-bottom: none;
-      }
-
-      form {
-        float: right;
-        margin: 0px;
-        padding: 0px;
-
-        button {
-          padding-left: 5px;
-          padding-right: 5px;
-
-          i {
-            position: relative;
-            top: 1px;
-          }
-        }
-      }
-    }
-  }
-
-  h4 {
-    margin: 0px;
-    padding: 0px;
-
-    color: @gray;
-    font-size: @baseFontSize * 1.2;
-    font-weight: bold;
-  }
-
-  .no-participants {
-    margin-bottom: @baseLineHeight;
-  }
-
-  .invite-participant {
-    background-color: @white;
-    border: 1px solid darken(@bodyBackground, 15%);
-    border-radius: @baseBorderRadius;
-    margin-top: @baseLineHeight - @baseFontSize;
-    padding: 1px;
-
-    form {
-      margin: 0px;
-      padding: 0px;
-
-      input, button {
-        border: none;
-        background: none;
-        box-shadow: none;
-      }
-
-      input {
-        width: 70%;
-      }
-
-      button {
-        float: right;
-      }
-    }
-  }
+// Thread view
+// -------------------------
+
+.thread-buttons {
+  overflow: auto;
+
+  .pull-right {
+    margin-left: @baseFontSize;
+  }
+
+  .thread-signin-message {
+    float: right;
+
+    a:link, a:visited {
+      color: @textColor;
+    }
+  }
+}
+
+// Thread body styles
+.thread-body {
+  .post-wrapper {
+    // Post body
+    .post-body {
+      margin-bottom: @baseLineHeight;
+      overflow: auto;
+
+      .user-avatar {
+        border-radius: @borderRadiusLarge;
+        float: left;
+        width: 100px;
+        height: 100px;
+      }
+
+      .post-content {
+        background-color: @postBackground;
+        border: 1px solid @postBorder;
+        border-radius: @borderRadiusLarge;
+        margin-left: 100px + (@baseFontSize * 1.5);
+        min-height: 100px;
+        position: relative;
+
+        &:after, &:before {
+          right: 100%;
+          border: solid transparent;
+          content: "";
+          height: 0; width: 0;
+          position: absolute;
+          pointer-events: none;
+        }
+
+        &:after {
+          border-color: transparent;
+          border-right-color: @postBackground;
+          border-width: @fontSizeMini;
+          top: @baseFontSize;
+          margin-top: (@baseFontSize * -1) + @baseFontSize;
+        }
+
+        &:before {
+           border-color: transparent;
+           border-right-color: @postBorder;
+           border-width: @fontSizeMini + 1;
+           top: @baseFontSize;
+           margin-top: (@baseFontSize * -1) + @baseFontSize - 1px;
+        }
+
+        .post-header {
+          padding: (@baseFontSize / 2) @baseFontSize;
+          padding-bottom: 0px;
+
+          color: grayLighter;
+
+          .post-author {
+            color: @textColor;
+            font-weight: bold;
+          }
+
+          .post-author-label {
+            text-shadow: none;
+
+            &.post-label-guest {
+              background-color: @grayLighter;
+
+              color: @grayLight;
+            }
+          }
+
+          .separator {
+            color: @grayLighter;
+            font-size: @fontSizeLarge;
+            line-height: 5px;
+          }
+
+          .post-date {
+            color: @grayLight;
+          }
+
+          .post-changelog {
+            color: @grayLight;
+
+            &:hover, &:active {
+              color: @textColor;
+            }
+          }
+
+          .post-perma {
+            display: block;
+            float: right;
+            padding-left: 6px;
+
+            color: @grayLight;
+            font-weight: bold;
+
+            &:hover, &:active {
+              color: @textColor;
+            }
+          }
+
+          .post-checkbox {
+            float: right;
+            position: relative;
+            left: @baseFontSize - 4px;
+          }
+
+          .post-extra {
+            float: right;
+
+            .label {
+              margin-left: @baseFontSize / 4;
+
+              text-shadow: none;
+
+              &.label-purple {
+                background-color: #7e2ecf;
+              }
+            }
+          }
+        }
+
+        .post-message {
+          .markdown {
+            padding: @baseFontSize;
+          }
+
+          .post-signature {
+            border-top: 1px dotted darken(@postBackground, 25%);
+            .opacity(60);
+            margin: 0px @baseFontSize;
+
+            font-size: 80%;
+
+            .markdown {
+              padding: 0px;
+              padding-top: @baseLineHeight / 4;
+              padding-bottom: @baseFontSize;
+            }
+          }
+        }
+
+        .post-footer {
+          border-top: 1px solid @postBorder;
+          overflow: auto;
+
+          &:empty {
+            display: none;
+          }
+
+          .post-rating {
+            float: left;
+            overflow: auto;
+            padding: (@baseFontSize / 2) @baseFontSize;
+            border-right: 1px dotted @postBorder;
+
+            a {
+              color: @grayLight;
+
+              &:hover, a:active {
+                color: @textColor;
+              }
+            }
+
+            span {
+              float: left;
+
+              &.post-score {
+                color: @grayLight;
+                font-weight: bold;
+
+                &.post-score-good {
+                  color: @green;
+                }
+
+                &.post-score-bad {
+                  color: @red;
+                }
+              }
+
+              &.post-neutral, &.post-like, &.post-hate {
+                margin-left: (@baseFontSize / 4); 
+              }
+
+              &.post-neutral {
+                color: @grayLight;
+              }
+
+              &.post-like {
+                color: @green;
+              }
+
+              &.post-hate {
+                color: @red;
+              }
+            }
+
+            form {
+              float: left;
+              margin: 0px;
+              padding: 0px;
+
+              .btn-link {
+                float: right;
+                margin: 0px;
+                margin-left: (@baseFontSize / 4);
+                .opacity(100);
+                padding: 0px;
+
+                color: @grayLight;
+                font-weight: normal;
+
+                &:hover, &:active, &:focus {
+                  text-decoration: underline;
+                }
+
+                &.post-like {
+                  &:hover, &:active, &:focus, &:disabled {
+                    color: @green;
+                  }
+                }
+
+                &.post-hate {
+                  &:hover, &:active, &:focus, &:disabled {
+                    color: @red;
+                  }
+                }
+
+                &:disabled {
+                  &:hover, &:active, &:focus {
+                    text-decoration: none;
+                  }
+                }
+              }
+            }
+          }
+
+          .post-actions {
+            border-left: 1px dotted @postBorder;
+            float: right;
+            padding: (@baseFontSize / 2) @baseFontSize;
+
+            color: @grayLight;
+
+            a, span, form {
+              float: left;
+              overflow: auto;
+            }
+
+            form {
+              margin: 0px;
+              padding: 0px;
+
+              .btn {
+                float: right;
+                margin: 0px;
+                margin-left: @baseFontSize;
+                .opacity(100);
+                padding: 0px;
+
+                color: @grayLight;
+                font-weight: normal;
+
+                &:hover, &:active, &:focus {
+                  color: @red;
+                  text-decoration: underline;
+                }
+
+                &.btn-report {
+                  &:disabled {
+                    color: @green;
+                  }
+                }
+
+                &.btn-hide {
+                  &:hover, &:active, &:focus {
+                    color: @orange;
+                  }
+                }
+              }
+
+              &:first-child .btn {
+                margin-left: 0px;
+              }
+            }
+
+            a {
+              margin-left: @baseFontSize;
+
+              color: @grayLight;
+
+              &:hover, a:active {
+                color: @textColor;
+              }
+
+              &:first-child {
+                margin-left: 0px;
+              }
+
+              &.post-reply {
+                color: @gray;
+
+                &:hover, a:active {
+                  color: @blue;
+                }
+              }
+            }
+          }
+        }
+      }
+
+      &.post-muted {        
+        .user-avatar {
+          width: 50px;
+          height: 50px;
+          .opacity(75);
+        }
+
+        .post-content {
+          margin-left: 50px + (@baseFontSize * 1.5);
+          min-height: 0px;
+          .opacity(75);
+          padding: @baseFontSize;
+
+          .post-header {
+            float: right;
+            margin: 0px;
+            margin-top: ((@baseFontSize / 2) * -1);
+            margin-right: @baseFontSize * -1;
+
+            .post-header-compact {
+              float: left;
+              margin-right: @baseFontSize;
+            }
+          }
+
+          .post-message {
+            color: @grayLight;
+            font-size: @fontSizeLarge;
+
+            strong, a {
+              color: @textColor;
+              font-weight: normal;
+            }
+          }
+        }
+      }
+    }
+  }
+
+  .post-checkpoints {
+    .post-checkpoint {
+      text-align: center;
+
+      margin-bottom: @baseLineHeight;
+
+      &.checkpoint-deleted {
+        .opacity(30);
+
+        &:hover {
+          .opacity(60);
+        }
+      }
+
+      hr {
+        background-color: @grayLight;
+        background-image: -webkit-gradient(linear, 0 0, 100% 100%,
+                    color-stop(.25, rgba(255, 255, 255, .2)), color-stop(.25, transparent),
+                    color-stop(.5, transparent), color-stop(.5, rgba(255, 255, 255, .2)),
+                    color-stop(.75, rgba(255, 255, 255, .2)), color-stop(.75, transparent),
+                    to(transparent));
+        background-image: -webkit-linear-gradient(-45deg, rgba(255, 255, 255, .2) 25%, transparent 25%,
+                  transparent 50%, rgba(255, 255, 255, .2) 50%, rgba(255, 255, 255, .2) 75%,
+                  transparent 75%, transparent);
+        background-image: -moz-linear-gradient(-45deg, rgba(255, 255, 255, .2) 25%, transparent 25%,
+                  transparent 50%, rgba(255, 255, 255, .2) 50%, rgba(255, 255, 255, .2) 75%,
+                  transparent 75%, transparent);
+        background-image: -ms-linear-gradient(-45deg, rgba(255, 255, 255, .2) 25%, transparent 25%,
+                  transparent 50%, rgba(255, 255, 255, .2) 50%, rgba(255, 255, 255, .2) 75%,
+                  transparent 75%, transparent);
+        background-image: -o-linear-gradient(-45deg, rgba(255, 255, 255, .2) 25%, transparent 25%,
+                  transparent 50%, rgba(255, 255, 255, .2) 50%, rgba(255, 255, 255, .2) 75%,
+                  transparent 75%, transparent);
+        background-image: linear-gradient(-45deg, rgba(255, 255, 255, .2) 25%, transparent 25%,
+                  transparent 50%, rgba(255, 255, 255, .2) 50%, rgba(255, 255, 255, .2) 75%,
+                  transparent 75%, transparent);
+        -webkit-background-size: 10px 10px;
+        -moz-background-size: 10px 10px;
+        background-size: 10px 10px;
+        border: none;
+        height: 4px;
+        margin-bottom: (@baseLineHeight * -1) + (@baseFontSize / 2) + 1px;
+      }
+
+      span {
+        background-color: @bodyBackground;
+        padding: 0px @baseFontSize;
+
+        color: @grayLight;
+
+        a {
+          color: @textColor;
+        }
+
+        i {
+          .opacity(43);
+        }
+
+        form {
+          display: inline-block;
+          margin: 0px;
+          margin-top: -3px;
+          margin-left: @baseFontSize / 2;
+          padding: 0px;
+
+          .btn {
+            margin-top: -2px;
+            padding: 0px;
+
+            font-weight: normal;
+
+            &:active, &:hover {
+              text-decoration: underline;
+
+              &.btn-show, &.btn-hide {
+                color: @orange;
+              }
+
+              &.btn-delete {
+                color: @red;
+              }
+            }
+          }
+        }
+
+        form:first-of-type {
+          margin-left: @baseFontSize;
+        }
+      }
+    }
+  }
+}
+
+// Thread moderation
+.thread-moderation {
+  background-color: @categoryBackground;
+  border: 1px solid @categoryBorder;
+  border-radius: @baseBorderRadius;
+  .box-shadow(0px 0px 0px 3px @categoryShadow);
+  margin-bottom: @baseLineHeight;
+  overflow: auto;
+  padding: (@baseFontSize / 2);
+
+  form {
+    margin: 0px;
+  }
+}
+
+// Quick reply styles
+.thread-quick-reply {
+  overflow: auto;
+  margin-top: @baseLineHeight;
+
+  .user-avatar {
+    border-radius: @baseBorderRadius;
+    float: left;
+    width: 100px;
+    height: 100px;
+    overflow: visible;
+  }
+
+  .editor {
+    margin-left: 100px + (@baseFontSize * 1.5);
+    position: relative;
+
+    &:after, &:before {
+      right: 100%;
+      border: solid transparent;
+      content: "";
+      height: 0; width: 0;
+      position: absolute;
+      pointer-events: none;
+    }
+
+    &:after {
+      border-color: transparent;
+      border-right-color: @editorBackground;
+      border-width: @fontSizeMini;
+      top: @baseFontSize;
+      margin-top: (@baseFontSize * -1) + @baseFontSize;
+    }
+
+    &:before {
+       border-color: transparent;
+       border-right-color: darken(@editorBackground, 10%);
+       border-width: @fontSizeMini + 1;
+       top: @baseFontSize;
+       margin-top: (@baseFontSize * -1) + @baseFontSize - 1px;
+    }
+  }
+}
+
+// Thread participants list
+.thread-participants {
+  h3 {
+    margin: 0px;
+    margin-top: (@baseLineHeight - @baseFontSize) * -1;
+    padding: 0px;
+
+    color: @gray;
+    font-size: @fontSizeLarge;
+    font-weight: bold;
+  }
+
+  ul {
+    background-color: @white;
+    border: 1px solid darken(@bodyBackground, 10%);
+    border-radius: @baseBorderRadius;
+    margin: 0px;
+    margin-bottom: @baseLineHeight;
+    padding: 0px;
+
+    li {
+      border-bottom: 1px dotted darken(@bodyBackground, 10%);
+      margin: 0px;
+      padding: 6px 8px;
+
+      font-weight: bold;
+
+      img {
+        border-radius: @borderRadiusSmall;
+        width: 24px;
+        height: 24px;
+      }
+
+      a:link, a:active, a:visited, a:hover {
+        margin: 0px 4px;
+
+        color: @textColor;
+        font-weight: bold;
+      }
+
+      &:last-child {
+        border-bottom: none;
+      }
+
+      form {
+        float: right;
+        margin: 0px;
+        padding: 0px;
+
+        button {
+          padding-left: 5px;
+          padding-right: 5px;
+
+          i {
+            position: relative;
+            top: 1px;
+          }
+        }
+      }
+    }
+  }
+
+  h4 {
+    margin: 0px;
+    padding: 0px;
+
+    color: @gray;
+    font-size: @baseFontSize * 1.2;
+    font-weight: bold;
+  }
+
+  .no-participants {
+    margin-bottom: @baseLineHeight;
+  }
+
+  .invite-participant {
+    background-color: @white;
+    border: 1px solid darken(@bodyBackground, 15%);
+    border-radius: @baseBorderRadius;
+    margin-top: @baseLineHeight - @baseFontSize;
+    padding: 1px;
+
+    form {
+      margin: 0px;
+      padding: 0px;
+
+      input, button {
+        border: none;
+        background: none;
+        box-shadow: none;
+      }
+
+      input {
+        width: 70%;
+      }
+
+      button {
+        float: right;
+      }
+    }
+  }
 }

+ 118 - 118
static/cranefly/css/cranefly/usercp.less

@@ -1,119 +1,119 @@
-// User Control Panel
-// -------------------------
-
-.usercp {
-  .usercp-tabs {
-    border: none;
-
-    li {
-      float: none;
-      display: block;
-      width: 100%;
-
-      a:link, a:visited {
-        border: none;
-        border-radius: @borderRadiusSmall 0px 0px @borderRadiusSmall;
-        float: none;
-        display: block;
-        width: 100%;
-
-        color: @gray;
-        font-weight: bold;
-      }
-
-      a:active, a:hover {
-        background-color: @bluePale;
-
-        color: @white;
-        text-shadow: 0px 1px 0px darken(@bluePale, 25%);
-      }
-
-      &.active {
-        a:link, a:visited, a:active, a:hover {
-          background-color: @red;
-
-          color: @white;
-          text-shadow: 0px 1px 0px darken(@red, 25%);
-        }
-      }
-    }
-  }
-
-  .usercp-action {
-    .form-container {
-      min-height: 180px;
-    }
-  }
-}
-
-// Avatar Edit
-// -------------------------
-.usercp-avatar-menu {
-  margin-bottom: 0px;
-
-  .media-object {
-    border-radius: @borderRadiusLarge;
-    margin-top: @baseFontSize;
-    width: 125px;
-    height: 125px;
-  }
-
-  .media-body {
-    margin-left: (@baseFontSize * 2) + 125px;
-
-    ul.unstyled {
-      margin-left: @baseFontSize * -1 + 1px;
-    }
-  }
-}
-
-.usercp-avatar-select {
-  .usercp-avatar-gallery {
-    margin: 0px (@baseFontSize * -1);
-    overflow: auto;
-    padding-bottom-bottom: @baseFontSize;
-
-    .usercp-avatar-select-form {
-      margin: 0px;
-      padding: 0px;
-      float: left;
-
-      .usercp-btn-avatar {
-        margin: @baseFontSize;
-        padding: 0px;
-
-        &, &:active, &:hover {
-          .opacity(100);
-
-          img {
-            .opacity(100);
-          }
-        }
-
-        &:active, &:hover {
-          img {
-            border-color: @linkColor;
-            .box-shadow(0px 0px 3px @linkColor);
-          }
-        }
-      } 
-    }
-  }
-}
-
-.usercp-avatar-crop {
-  .avatar-crop-preview {
-    border-radius: @borderRadiusLarge;
-    float: left;
-    width: @fontSizeLarge * 2.5;
-    height: @fontSizeLarge * 2.5;
-    margin-right: @baseFontSize;
-    overflow: hidden;
-  }
-
-  .avatar-crop-target {
-    img {
-      background-color: @white;
-    }
-  }
+// User Control Panel
+// -------------------------
+
+.usercp {
+  .usercp-tabs {
+    border: none;
+
+    li {
+      float: none;
+      display: block;
+      width: 100%;
+
+      a:link, a:visited {
+        border: none;
+        border-radius: @borderRadiusSmall 0px 0px @borderRadiusSmall;
+        float: none;
+        display: block;
+        width: 100%;
+
+        color: @gray;
+        font-weight: bold;
+      }
+
+      a:active, a:hover {
+        background-color: @bluePale;
+
+        color: @white;
+        text-shadow: 0px 1px 0px darken(@bluePale, 25%);
+      }
+
+      &.active {
+        a:link, a:visited, a:active, a:hover {
+          background-color: @red;
+
+          color: @white;
+          text-shadow: 0px 1px 0px darken(@red, 25%);
+        }
+      }
+    }
+  }
+
+  .usercp-action {
+    .form-container {
+      min-height: 180px;
+    }
+  }
+}
+
+// Avatar Edit
+// -------------------------
+.usercp-avatar-menu {
+  margin-bottom: 0px;
+
+  .media-object {
+    border-radius: @borderRadiusLarge;
+    margin-top: @baseFontSize;
+    width: 125px;
+    height: 125px;
+  }
+
+  .media-body {
+    margin-left: (@baseFontSize * 2) + 125px;
+
+    ul.unstyled {
+      margin-left: @baseFontSize * -1 + 1px;
+    }
+  }
+}
+
+.usercp-avatar-select {
+  .usercp-avatar-gallery {
+    margin: 0px (@baseFontSize * -1);
+    overflow: auto;
+    padding-bottom-bottom: @baseFontSize;
+
+    .usercp-avatar-select-form {
+      margin: 0px;
+      padding: 0px;
+      float: left;
+
+      .usercp-btn-avatar {
+        margin: @baseFontSize;
+        padding: 0px;
+
+        &, &:active, &:hover {
+          .opacity(100);
+
+          img {
+            .opacity(100);
+          }
+        }
+
+        &:active, &:hover {
+          img {
+            border-color: @linkColor;
+            .box-shadow(0px 0px 3px @linkColor);
+          }
+        }
+      } 
+    }
+  }
+}
+
+.usercp-avatar-crop {
+  .avatar-crop-preview {
+    border-radius: @borderRadiusLarge;
+    float: left;
+    width: @fontSizeLarge * 2.5;
+    height: @fontSizeLarge * 2.5;
+    margin-right: @baseFontSize;
+    overflow: hidden;
+  }
+
+  .avatar-crop-target {
+    img {
+      background-color: @white;
+    }
+  }
 }

+ 30 - 30
static/cranefly/css/cranefly/watchedthreads.less

@@ -1,31 +1,31 @@
-// Watched threads
-// -------------------------
-
-.watched-threads {
-  .thread-last-reply {
-    border-left: none !important;
-    padding-left: 0px !important;
-  }
-
-  .thread-options {
-    float: right;
-    overflow: auto;
-    position: relative;
-    top: 8px;
-
-    form {
-      display: inline-block;
-      float: left;
-      margin: 0px;
-      padding: 0px;
-      overflow: auto;
-
-      .btn {
-        float: right;
-        padding: 3px 5px;
-        padding-bottom: 0px;
-        margin-left: @baseFontSize + 2px;
-      }
-    }
-  }
+// Watched threads
+// -------------------------
+
+.watched-threads {
+  .thread-last-reply {
+    border-left: none !important;
+    padding-left: 0px !important;
+  }
+
+  .thread-options {
+    float: right;
+    overflow: auto;
+    position: relative;
+    top: 8px;
+
+    form {
+      display: inline-block;
+      float: left;
+      margin: 0px;
+      padding: 0px;
+      overflow: auto;
+
+      .btn {
+        float: right;
+        padding: 3px 5px;
+        padding-bottom: 0px;
+        margin-left: @baseFontSize + 2px;
+      }
+    }
+  }
 }

+ 50 - 50
static/cranefly/css/ranks.less

@@ -1,50 +1,50 @@
-// Ranks styles
-// -------------------------
-
-// .rank-team
-.index-rank-team ul {
-  li {
-    .label {
-      background-color: @red;
-
-      color: @white;
-      text-shadow: 0px 1px 0px darken(@red, 35%);
-    }
-  }
-}
-
-.post-label-team {
-  background-color: @red;
-}
-
-// .rank-mvp
-.index-rank-mvp ul {
-  li {
-    .label {
-      background-color: @blue;
-
-      color: @white;
-      text-shadow: 0px 1px 0px darken(@blue, 35%);
-    }
-  }
-}
-
-.post-label-mvp {
-  background-color: @blue;
-}
-
-// .rank-top
-.index-rank-top ul {
-  li {
-    .label {
-      background-color: darken(@orange, 25%);
-
-      color: @white;
-      text-shadow: 0px 1px 0px darken(@orange, 35%);
-    }
-  }
-}
-
-.post-label-top {
-  background-color: @orange;
-}
+// Ranks styles
+// -------------------------
+
+// .rank-team
+.index-rank-team ul {
+  li {
+    .label {
+      background-color: @red;
+
+      color: @white;
+      text-shadow: 0px 1px 0px darken(@red, 35%);
+    }
+  }
+}
+
+.post-label-team {
+  background-color: @red;
+}
+
+// .rank-mvp
+.index-rank-mvp ul {
+  li {
+    .label {
+      background-color: @blue;
+
+      color: @white;
+      text-shadow: 0px 1px 0px darken(@blue, 35%);
+    }
+  }
+}
+
+.post-label-mvp {
+  background-color: @blue;
+}
+
+// .rank-top
+.index-rank-top ul {
+  li {
+    .label {
+      background-color: darken(@orange, 25%);
+
+      color: @white;
+      text-shadow: 0px 1px 0px darken(@orange, 35%);
+    }
+  }
+}
+
+.post-label-top {
+  background-color: @orange;
+}

+ 232 - 232
static/cranefly/js/cranefly.js

@@ -1,233 +1,233 @@
-$(function () {
-  // Register tooltips
-  $('.tooltip-top').tooltip({placement: 'top', container: 'body'})
-  $('.tooltip-bottom').tooltip({placement: 'bottom', container: 'body'})
-  $('.tooltip-left').tooltip({placement: 'left', container: 'body'})
-  $('.tooltip-right').tooltip({placement: 'right', container: 'body'})
-  
-  // Register popovers
-  $('.popover-top').popover({placement: 'top'})
-  $('.popover-bottom').popover({placement: 'bottom'})
-  $('.popover-left').popover({placement: 'left'})
-  $('.popover-right').popover({placement: 'right'})
-
-  // Dont fire popovers on touch devices
-  $("[class^='tooltip-']").on('show', function (e) {
-    if ('ontouchstart' in document.documentElement) {
-      e.preventDefault();
-    }
-  });
-  
-  // Start all dropdowns
-  $('.dropdown-toggle').dropdown()
-  
-  // Dont hide clickable dropdowns
-  $('.dropdown-clickable').on('click', function (e) {
-    e.stopPropagation()
-  });
-
-  // Fancy user nav activation
-  $('#fancy-user-nav').show();
-
-  // Search form extension
-  var nav_search_form = $('#navbar-search');
-  $('#search-field').hover(function() {
-    nav_search_form.addClass('open');
-  });
-
-  $('html').click(function() {
-    nav_search_form.removeClass('open');
-  });
-
-  nav_search_form.click(function(event) {
-    event.stopPropagation();
-  });
-  
-  // Checkbox Group Master
-  $('input.checkbox-master').live('click', function(){
-    if($(this).is(':checked')){
-      $('input.checkbox-member').attr("checked" ,"checked");
-    }
-    else
-    {
-      $('input.checkbox-member').removeAttr('checked');
-    }
-  });
-  
-  // Checkbox Group Member
-  $('input.checkbox-member').live('click', function(){
-    if(!$(this).is(':checked')){
-      $('input.checkbox-master').removeAttr('checked');
-    }
-  });
-  
-  // Check Confirmation on links
-  $('a.confirm').live('click', function(){
-    var decision = confirm(jQuery.data(this, 'jsconfirm'));
-    return decision
-  });
-  
-  // Check Confirmation on forms
-  $('form.confirm').live('submit', function(){
-    data = $(this).data();
-    var decision = confirm(data.jsconfirm);
-    return decision
-  });
-  
-  // Show go back link?
-  if (document.referrer
-      && document.referrer.indexOf(location.protocol + "//" + location.host) === 0
-      && document.referrer != document.url) {
-    $('.go-back').show();
-  }
-
-  // Go back one page
-  $('.go-back').on('click', function (e) {
-      history.go(-1)
-      return false;
-  })
-})
-
-function EnhancePostsMD() {
-  $(function () {
-    // Add labels to images
-    $('.markdown.js-extra img').not('.emoji').each(function() {
-      $(this).addClass('img-rounded');
-      if ($(this).attr('alt').length > 0 && $(this).attr('alt') != $(this).attr('src')) {
-        $(this).attr('title', $(this).attr('alt'));
-        $(this).tooltip({placement: 'top', container: 'body'});
-      }
-    });
-
-    // Automagically turn links into players
-    var players = new Array();
-    $('.markdown.js-extra').each(function() {
-      var post_players = 0;
-      $(this).find('a').each(function() {
-        match = link2player($.trim($(this).text()));
-        if (match && $.inArray(match, players) == -1 && players.length < 16 && post_players < 4) {
-          players.push(match);
-          post_players ++;
-          $(this).replaceWith(match);
-        }
-      });
-    });
-  });
-}
-
-// Turn link to player
-function link2player(link_href) {
-  // Youtube link
-  var re = /watch\?v=((\w|-)+)/;
-  if (re.test(link_href)) {
-    media_url = link_href.match(re);
-    return '<iframe width="480" height="360" src="http://www.youtube.com/embed/' + media_url[1] + '" frameborder="0" allowfullscreen></iframe>';
-  }
-
-  // Youtube feature=embed
-  var re = /watch\?feature=player_embedded&v=((\w|-)+)/;
-  if (re.test(link_href)) {
-    media_url = link_href.match(re);
-    return '<iframe width="480" height="360" src="http://www.youtube.com/embed/' + media_url[1] + '" frameborder="0" allowfullscreen></iframe>';
-  }
-
-  // Youtube embed with start time
-  var re = /youtu.be\/((\w|-)+)\?t=([A-Za-z0-9]+)/;
-  if (re.test(link_href)) {
-    media_url = link_href.match(re);
-    media_minutes = media_url[2].match(/([0-9]+)m/);
-    media_seconds = media_url[2].match(/([0-9]+)s/);
-    media_url[2] = 0;
-    if (media_minutes) { media_url[2] += (media_minutes[1] - 0) * 60; }
-    if (media_seconds) { media_url[2] += (media_seconds[1] - 0); }
-    return '<iframe width="480" height="360" src="http://www.youtube.com/embed/' + media_url[1] + '?start=' + media_url[2] + '" frameborder="0" allowfullscreen></iframe>';
-  }
-  
-  // Youtube embed
-  var re = /youtu.be\/((\w|-)+)/;
-  if (re.test(link_href)) {
-    media_url = link_href.match(re);
-    return '<iframe width="480" height="360" src="http://www.youtube.com/embed/' + media_url[1] + '" frameborder="0" allowfullscreen></iframe>';
-  }
-
-  // Vimeo link
-  var re = /vimeo.com\/([0-9]+)/;
-  if (re.test(link_href)) {
-    media_url = link_href.match(re);
-    return '<iframe src="http://player.vimeo.com/video/' + media_url[1] + '?color=CF402E" width="500" height="281" frameborder="0" webkitAllowFullScreen mozallowfullscreen allowFullScreen></iframe>';
-  }
-
-  // No link
-  return false;
-}
-
-// Ajax: Post votes
-$(function() {
-  $('.post-rating-actions').each(function() {
-    var action_parent = this;
-    var csrf_token = $(this).find('input[name="_csrf_token"]').val();
-    $(this).find('form').submit(function() {
-      var form = this;
-      $.post(this.action, {'_csrf_token': csrf_token}, "json").done(function(data, textStatus, jqXHR) {
-        // Reset stuff and set classess
-        $(action_parent).find('.post-score').removeClass('post-score-good post-score-bad');
-        if (data.score_total > 0) {
-          $(action_parent).find('.post-score-total').addClass('post-score-good');
-        } else if (data.score_total < 0) {
-          $(action_parent).find('.post-score-total').addClass('post-score-bad');
-        } 
-        if (data.score_upvotes > 0) {
-          $(action_parent).find('.post-score-upvotes').addClass('post-score-good');
-        }
-        if (data.score_downvotes > 0) {
-          $(action_parent).find('.post-score-downvotes').addClass('post-score-bad');
-        }
-
-        // Set votes
-        $(action_parent).find('.post-score-total').text(data.score_total);
-        $(action_parent).find('.post-score-upvotes').text(data.score_upvotes);
-        $(action_parent).find('.post-score-downvotes').text(data.score_downvotes);
-
-        // Disable and enable forms
-        if (data.user_vote == 1) {
-          $(action_parent).find('.form-upvote button').attr("disabled", "disabled");
-          $(action_parent).find('.form-downvote button').removeAttr("disabled");
-        } else {
-          $(action_parent).find('.form-upvote button').removeAttr("disabled");
-          $(action_parent).find('.form-downvote button').attr("disabled", "disabled");
-        }
-      }).fail(function() {
-        $(form).unbind();
-        $(form).trigger('submit');
-      });
-      return false;
-    });
-  });
-});
-
-// Ajax: Post reports
-$(function() {
-  $('.form-report').each(function() {
-    var action_parent = this;
-    var csrf_token = $(this).find('input[name="_csrf_token"]').val();
-    var button = $(this).find('button');
-    $(this).submit(function() {
-      var form = this;
-      $.post(form.action, {'_csrf_token': csrf_token}, "json").done(function(data, textStatus, jqXHR) {        
-        $(button).text(l_post_reported);
-        $(button).tooltip('destroy');
-        $(button).attr("title", data.message);
-        $(button).tooltip({placement: 'top', container: 'body'});
-        $(button).tooltip("show");
-        $(button).attr("disabled", "disabled");
-        setTimeout(function() {
-          $(button).tooltip('hide');
-        }, 2500);
-      }).fail(function() {
-        $(form).unbind();
-        $(form).trigger('submit');
-      });
-      return false;
-    });
-  });
+$(function () {
+  // Register tooltips
+  $('.tooltip-top').tooltip({placement: 'top', container: 'body'})
+  $('.tooltip-bottom').tooltip({placement: 'bottom', container: 'body'})
+  $('.tooltip-left').tooltip({placement: 'left', container: 'body'})
+  $('.tooltip-right').tooltip({placement: 'right', container: 'body'})
+  
+  // Register popovers
+  $('.popover-top').popover({placement: 'top'})
+  $('.popover-bottom').popover({placement: 'bottom'})
+  $('.popover-left').popover({placement: 'left'})
+  $('.popover-right').popover({placement: 'right'})
+
+  // Dont fire popovers on touch devices
+  $("[class^='tooltip-']").on('show', function (e) {
+    if ('ontouchstart' in document.documentElement) {
+      e.preventDefault();
+    }
+  });
+  
+  // Start all dropdowns
+  $('.dropdown-toggle').dropdown()
+  
+  // Dont hide clickable dropdowns
+  $('.dropdown-clickable').on('click', function (e) {
+    e.stopPropagation()
+  });
+
+  // Fancy user nav activation
+  $('#fancy-user-nav').show();
+
+  // Search form extension
+  var nav_search_form = $('#navbar-search');
+  $('#search-field').hover(function() {
+    nav_search_form.addClass('open');
+  });
+
+  $('html').click(function() {
+    nav_search_form.removeClass('open');
+  });
+
+  nav_search_form.click(function(event) {
+    event.stopPropagation();
+  });
+  
+  // Checkbox Group Master
+  $('input.checkbox-master').live('click', function(){
+    if($(this).is(':checked')){
+      $('input.checkbox-member').attr("checked" ,"checked");
+    }
+    else
+    {
+      $('input.checkbox-member').removeAttr('checked');
+    }
+  });
+  
+  // Checkbox Group Member
+  $('input.checkbox-member').live('click', function(){
+    if(!$(this).is(':checked')){
+      $('input.checkbox-master').removeAttr('checked');
+    }
+  });
+  
+  // Check Confirmation on links
+  $('a.confirm').live('click', function(){
+    var decision = confirm(jQuery.data(this, 'jsconfirm'));
+    return decision
+  });
+  
+  // Check Confirmation on forms
+  $('form.confirm').live('submit', function(){
+    data = $(this).data();
+    var decision = confirm(data.jsconfirm);
+    return decision
+  });
+  
+  // Show go back link?
+  if (document.referrer
+      && document.referrer.indexOf(location.protocol + "//" + location.host) === 0
+      && document.referrer != document.url) {
+    $('.go-back').show();
+  }
+
+  // Go back one page
+  $('.go-back').on('click', function (e) {
+      history.go(-1)
+      return false;
+  })
+})
+
+function EnhancePostsMD() {
+  $(function () {
+    // Add labels to images
+    $('.markdown.js-extra img').not('.emoji').each(function() {
+      $(this).addClass('img-rounded');
+      if ($(this).attr('alt').length > 0 && $(this).attr('alt') != $(this).attr('src')) {
+        $(this).attr('title', $(this).attr('alt'));
+        $(this).tooltip({placement: 'top', container: 'body'});
+      }
+    });
+
+    // Automagically turn links into players
+    var players = new Array();
+    $('.markdown.js-extra').each(function() {
+      var post_players = 0;
+      $(this).find('a').each(function() {
+        match = link2player($.trim($(this).text()));
+        if (match && $.inArray(match, players) == -1 && players.length < 16 && post_players < 4) {
+          players.push(match);
+          post_players ++;
+          $(this).replaceWith(match);
+        }
+      });
+    });
+  });
+}
+
+// Turn link to player
+function link2player(link_href) {
+  // Youtube link
+  var re = /watch\?v=((\w|-)+)/;
+  if (re.test(link_href)) {
+    media_url = link_href.match(re);
+    return '<iframe width="480" height="360" src="http://www.youtube.com/embed/' + media_url[1] + '" frameborder="0" allowfullscreen></iframe>';
+  }
+
+  // Youtube feature=embed
+  var re = /watch\?feature=player_embedded&v=((\w|-)+)/;
+  if (re.test(link_href)) {
+    media_url = link_href.match(re);
+    return '<iframe width="480" height="360" src="http://www.youtube.com/embed/' + media_url[1] + '" frameborder="0" allowfullscreen></iframe>';
+  }
+
+  // Youtube embed with start time
+  var re = /youtu.be\/((\w|-)+)\?t=([A-Za-z0-9]+)/;
+  if (re.test(link_href)) {
+    media_url = link_href.match(re);
+    media_minutes = media_url[2].match(/([0-9]+)m/);
+    media_seconds = media_url[2].match(/([0-9]+)s/);
+    media_url[2] = 0;
+    if (media_minutes) { media_url[2] += (media_minutes[1] - 0) * 60; }
+    if (media_seconds) { media_url[2] += (media_seconds[1] - 0); }
+    return '<iframe width="480" height="360" src="http://www.youtube.com/embed/' + media_url[1] + '?start=' + media_url[2] + '" frameborder="0" allowfullscreen></iframe>';
+  }
+  
+  // Youtube embed
+  var re = /youtu.be\/((\w|-)+)/;
+  if (re.test(link_href)) {
+    media_url = link_href.match(re);
+    return '<iframe width="480" height="360" src="http://www.youtube.com/embed/' + media_url[1] + '" frameborder="0" allowfullscreen></iframe>';
+  }
+
+  // Vimeo link
+  var re = /vimeo.com\/([0-9]+)/;
+  if (re.test(link_href)) {
+    media_url = link_href.match(re);
+    return '<iframe src="http://player.vimeo.com/video/' + media_url[1] + '?color=CF402E" width="500" height="281" frameborder="0" webkitAllowFullScreen mozallowfullscreen allowFullScreen></iframe>';
+  }
+
+  // No link
+  return false;
+}
+
+// Ajax: Post votes
+$(function() {
+  $('.post-rating-actions').each(function() {
+    var action_parent = this;
+    var csrf_token = $(this).find('input[name="_csrf_token"]').val();
+    $(this).find('form').submit(function() {
+      var form = this;
+      $.post(this.action, {'_csrf_token': csrf_token}, "json").done(function(data, textStatus, jqXHR) {
+        // Reset stuff and set classess
+        $(action_parent).find('.post-score').removeClass('post-score-good post-score-bad');
+        if (data.score_total > 0) {
+          $(action_parent).find('.post-score-total').addClass('post-score-good');
+        } else if (data.score_total < 0) {
+          $(action_parent).find('.post-score-total').addClass('post-score-bad');
+        } 
+        if (data.score_upvotes > 0) {
+          $(action_parent).find('.post-score-upvotes').addClass('post-score-good');
+        }
+        if (data.score_downvotes > 0) {
+          $(action_parent).find('.post-score-downvotes').addClass('post-score-bad');
+        }
+
+        // Set votes
+        $(action_parent).find('.post-score-total').text(data.score_total);
+        $(action_parent).find('.post-score-upvotes').text(data.score_upvotes);
+        $(action_parent).find('.post-score-downvotes').text(data.score_downvotes);
+
+        // Disable and enable forms
+        if (data.user_vote == 1) {
+          $(action_parent).find('.form-upvote button').attr("disabled", "disabled");
+          $(action_parent).find('.form-downvote button').removeAttr("disabled");
+        } else {
+          $(action_parent).find('.form-upvote button').removeAttr("disabled");
+          $(action_parent).find('.form-downvote button').attr("disabled", "disabled");
+        }
+      }).fail(function() {
+        $(form).unbind();
+        $(form).trigger('submit');
+      });
+      return false;
+    });
+  });
+});
+
+// Ajax: Post reports
+$(function() {
+  $('.form-report').each(function() {
+    var action_parent = this;
+    var csrf_token = $(this).find('input[name="_csrf_token"]').val();
+    var button = $(this).find('button');
+    $(this).submit(function() {
+      var form = this;
+      $.post(form.action, {'_csrf_token': csrf_token}, "json").done(function(data, textStatus, jqXHR) {        
+        $(button).text(l_post_reported);
+        $(button).tooltip('destroy');
+        $(button).attr("title", data.message);
+        $(button).tooltip({placement: 'top', container: 'body'});
+        $(button).tooltip("show");
+        $(button).attr("disabled", "disabled");
+        setTimeout(function() {
+          $(button).tooltip('hide');
+        }, 2500);
+      }).fail(function() {
+        $(form).unbind();
+        $(form).trigger('submit');
+      });
+      return false;
+    });
+  });
 });

+ 202 - 202
static/cranefly/js/editor.js

@@ -1,203 +1,203 @@
-// Basic editor functions
-function storeCaret(ftext) {    
-  if (ftext.createTextRange) {
-    ftext.caretPos = document.selection.createRange().duplicate();
-  }
-}
-
-function SelectionRange(start, end) {
-  this.start = start;
-  this.end = end;
-}
-
-function getSelection(textId) {
-  ctrl = document.getElementById(textId);
-  if (document.selection) {
-    ctrl.focus();
-    var range = document.selection.createRange();
-    var length = range.text.length;
-    range.moveStart('character', -ctrl.value.length);
-    return new SelectionRange(range.text.length - length, range.text.length);
-  } else if (ctrl.selectionStart || ctrl.selectionStart == '0') {
-    return new SelectionRange(ctrl.selectionStart, ctrl.selectionEnd);
-  }
-}
-
-function getSelectionText(textId) {
-  var ctrl = document.getElementById(textId);
-  var text = ctrl.value;
-  myRange = getSelection(textId);
-  return $.trim(text.substring(myRange.start, myRange.end));
-}
-
-function setSelection(textId, SelectionRange) {
-  ctrl = document.getElementById(textId);
-  if (ctrl.setSelectionRange) {
-    ctrl.focus();
-    ctrl.setSelectionRange(SelectionRange.start, SelectionRange.end);
-  } else if (ctrl.createTextRange) {
-    var range = ctrl.createTextRange();
-    range.collapse(true);
-    range.moveStart('character', SelectionRange.start);
-    range.moveEnd('character', SelectionRange.end);
-    range.select();
-  }
-}
-
-function _makeWrap(textId, myRange, wrap_start, wrap_end) {
-  var ctrl = document.getElementById(textId);
-  var text = ctrl.value;
-  var startText = text.substring(0, myRange.start) + wrap_start;
-  var middleText = text.substring(myRange.start, myRange.end);
-  var endText = wrap_end + text.substring(myRange.end);
-  ctrl.value = startText + middleText + endText;
-  setSelection(textId, new SelectionRange(startText.length, startText.length + middleText.length));
-}
-
-function makeWrap(textId, wrap_start, wrap_end) {
-  _makeWrap(textId, getSelection(textId), wrap_start, wrap_end);
-}
-
-function _makeReplace(textId, myRange, replacement) {
-  var ctrl = document.getElementById(textId);
-  var text = ctrl.value;
-  var startText = text.substring(0, myRange.start);
-  var middleText = text.substring(myRange.start, myRange.end);
-  var endText = text.substring(myRange.end);
-  ctrl.value = text.substring(0, myRange.start) + replacement + text.substring(myRange.end);
-  setSelection(textId, new SelectionRange(startText.length + middleText.length, startText.length + middleText.length));
-}
-
-function makeReplace(textId, replacement) {
-  _makeReplace(textId, getSelection(textId), replacement);
-}
-
-var url_pattern = new RegExp('^(https?:\\/\\/)?((([a-z\\d]([a-z\\d-]*[a-z\\d])*)\\.)+[a-z]{2,}|((\\d{1,3}\\.){3}\\d{1,3}))(\\:\\d+)?(\\/[-a-z\\d%_.~+]*)*(\\?[;&a-z\\d%_.~+=-]*)?(\\#[-a-z\\d_]*)?$','i');
-function is_url(str) {
-  return url_pattern.test($.trim(str));
-}
-
-function extractor(query) {
-    var result = /([^\s]+)$/.exec(query);
-    if(result && result[1])
-        return result[1].trim();
-    return '';
-}
-
-// Small and nice editor functionality
-$(function() {
-  $('.editor-tools').fadeIn(600);
-  $('.editor').each(function() {
-    // Get textarea stuff
-    var textarea = $(this).find('textarea');
-    var textarea_id = $(textarea).attr('id');
-    
-    // Do we have emojis?
-    if (1==2 && ed_emojis.length > 1) {
-      var mode = 0;
-      var open = -1;
-
-      $(textarea).focusout(function() {
-        mode = 0;
-        open = -1;
-      });
-
-      $(textarea).keyup(function() {
-        text = $(textarea).val();
-        cursor = getSelection(textarea_id).start;
-        if (cursor > 0) {
-          // Read typed character and previous character
-          input = text.substring(cursor - 1, cursor);
-          if (cursor > 1) {
-            pre = text.substring(cursor - 2, cursor - 1);
-          } else {
-            pre = '';
-          }
-
-          // Act accordingly to current mode
-          if (mode == 0) {
-            if (input == ':' && !pre.match(/^[A-Za-z0-9]+$/i)) {
-              // Test passed, mode 1 engaged!
-              mode = 1;
-              open = cursor;
-            }
-          } else if (mode == 1) {
-            // Inside emoji mode, we are helping user enter emoji input
-            if (cursor > open && !input.match(/^(\+|\-|[_A-Za-z0-9])+$/i)) {
-              // Emoji fail
-              mode = 0;
-            }
-          }
-        }
-      });
-    }
-
-    // Handle buttons
-    $('.editor-bold').click(function() {
-      makeWrap(textarea_id, '**', '**');
-      return false;
-    });
-    
-    $('.editor-emphasis').click(function() {
-      makeWrap(textarea_id, '*', '*');
-      return false;
-    });
-    
-    $('.editor-link').click(function() {
-      var selection = $.trim(getSelectionText(textarea_id));
-      if (is_url(selection)) {
-        var link_url = $.trim(prompt(ed_lang_enter_link_url, selection));
-        selection = false;
-      } else {
-        var link_url = $.trim(prompt(ed_lang_enter_link_url));
-      }
-
-      if (is_url(link_url)) {
-        if (selection) {
-          var link_label = $.trim(prompt(ed_lang_enter_link_label, selection));
-        } else {
-          var link_label = $.trim(prompt(ed_lang_enter_link_label));
-        }
-
-        if (link_label.length > 0) {
-          makeReplace(textarea_id, '[' + link_label + '](' + link_url + ')');
-        } else {
-          makeReplace(textarea_id, '<' + link_url + '>');
-        }
-      }
-
-      return false;
-    });
-    
-    $('.editor-image').click(function() {
-      var selection = $.trim(getSelectionText(textarea_id));
-      if (is_url(selection)) {
-        var image_url = $.trim(prompt(ed_lang_enter_image_url, selection));
-        selection = false;
-      } else {
-        var image_url = $.trim(prompt(ed_lang_enter_image_url));
-      }
-
-      if (is_url(image_url)) {
-        if (selection) {
-          var image_label = $.trim(prompt(ed_lang_enter_image_label, selection));
-        } else {
-          var image_label = $.trim(prompt(ed_lang_enter_image_label));
-        }
-
-        if (image_label.length > 0) {
-          makeReplace(textarea_id, '![' + image_label + '](' + image_url + ')');
-        } else {
-          makeReplace(textarea_id, '!(' + image_url + ')');
-        }
-      }
-
-      return false;
-    });
-    
-    $('.editor-hr').click(function() {
-      makeReplace(textarea_id, '\r\n\r\n- - - - -\r\n\r\n');
-      return false;
-    });
-  });
+// Basic editor functions
+function storeCaret(ftext) {    
+  if (ftext.createTextRange) {
+    ftext.caretPos = document.selection.createRange().duplicate();
+  }
+}
+
+function SelectionRange(start, end) {
+  this.start = start;
+  this.end = end;
+}
+
+function getSelection(textId) {
+  ctrl = document.getElementById(textId);
+  if (document.selection) {
+    ctrl.focus();
+    var range = document.selection.createRange();
+    var length = range.text.length;
+    range.moveStart('character', -ctrl.value.length);
+    return new SelectionRange(range.text.length - length, range.text.length);
+  } else if (ctrl.selectionStart || ctrl.selectionStart == '0') {
+    return new SelectionRange(ctrl.selectionStart, ctrl.selectionEnd);
+  }
+}
+
+function getSelectionText(textId) {
+  var ctrl = document.getElementById(textId);
+  var text = ctrl.value;
+  myRange = getSelection(textId);
+  return $.trim(text.substring(myRange.start, myRange.end));
+}
+
+function setSelection(textId, SelectionRange) {
+  ctrl = document.getElementById(textId);
+  if (ctrl.setSelectionRange) {
+    ctrl.focus();
+    ctrl.setSelectionRange(SelectionRange.start, SelectionRange.end);
+  } else if (ctrl.createTextRange) {
+    var range = ctrl.createTextRange();
+    range.collapse(true);
+    range.moveStart('character', SelectionRange.start);
+    range.moveEnd('character', SelectionRange.end);
+    range.select();
+  }
+}
+
+function _makeWrap(textId, myRange, wrap_start, wrap_end) {
+  var ctrl = document.getElementById(textId);
+  var text = ctrl.value;
+  var startText = text.substring(0, myRange.start) + wrap_start;
+  var middleText = text.substring(myRange.start, myRange.end);
+  var endText = wrap_end + text.substring(myRange.end);
+  ctrl.value = startText + middleText + endText;
+  setSelection(textId, new SelectionRange(startText.length, startText.length + middleText.length));
+}
+
+function makeWrap(textId, wrap_start, wrap_end) {
+  _makeWrap(textId, getSelection(textId), wrap_start, wrap_end);
+}
+
+function _makeReplace(textId, myRange, replacement) {
+  var ctrl = document.getElementById(textId);
+  var text = ctrl.value;
+  var startText = text.substring(0, myRange.start);
+  var middleText = text.substring(myRange.start, myRange.end);
+  var endText = text.substring(myRange.end);
+  ctrl.value = text.substring(0, myRange.start) + replacement + text.substring(myRange.end);
+  setSelection(textId, new SelectionRange(startText.length + middleText.length, startText.length + middleText.length));
+}
+
+function makeReplace(textId, replacement) {
+  _makeReplace(textId, getSelection(textId), replacement);
+}
+
+var url_pattern = new RegExp('^(https?:\\/\\/)?((([a-z\\d]([a-z\\d-]*[a-z\\d])*)\\.)+[a-z]{2,}|((\\d{1,3}\\.){3}\\d{1,3}))(\\:\\d+)?(\\/[-a-z\\d%_.~+]*)*(\\?[;&a-z\\d%_.~+=-]*)?(\\#[-a-z\\d_]*)?$','i');
+function is_url(str) {
+  return url_pattern.test($.trim(str));
+}
+
+function extractor(query) {
+    var result = /([^\s]+)$/.exec(query);
+    if(result && result[1])
+        return result[1].trim();
+    return '';
+}
+
+// Small and nice editor functionality
+$(function() {
+  $('.editor-tools').fadeIn(600);
+  $('.editor').each(function() {
+    // Get textarea stuff
+    var textarea = $(this).find('textarea');
+    var textarea_id = $(textarea).attr('id');
+    
+    // Do we have emojis?
+    if (1==2 && ed_emojis.length > 1) {
+      var mode = 0;
+      var open = -1;
+
+      $(textarea).focusout(function() {
+        mode = 0;
+        open = -1;
+      });
+
+      $(textarea).keyup(function() {
+        text = $(textarea).val();
+        cursor = getSelection(textarea_id).start;
+        if (cursor > 0) {
+          // Read typed character and previous character
+          input = text.substring(cursor - 1, cursor);
+          if (cursor > 1) {
+            pre = text.substring(cursor - 2, cursor - 1);
+          } else {
+            pre = '';
+          }
+
+          // Act accordingly to current mode
+          if (mode == 0) {
+            if (input == ':' && !pre.match(/^[A-Za-z0-9]+$/i)) {
+              // Test passed, mode 1 engaged!
+              mode = 1;
+              open = cursor;
+            }
+          } else if (mode == 1) {
+            // Inside emoji mode, we are helping user enter emoji input
+            if (cursor > open && !input.match(/^(\+|\-|[_A-Za-z0-9])+$/i)) {
+              // Emoji fail
+              mode = 0;
+            }
+          }
+        }
+      });
+    }
+
+    // Handle buttons
+    $('.editor-bold').click(function() {
+      makeWrap(textarea_id, '**', '**');
+      return false;
+    });
+    
+    $('.editor-emphasis').click(function() {
+      makeWrap(textarea_id, '*', '*');
+      return false;
+    });
+    
+    $('.editor-link').click(function() {
+      var selection = $.trim(getSelectionText(textarea_id));
+      if (is_url(selection)) {
+        var link_url = $.trim(prompt(ed_lang_enter_link_url, selection));
+        selection = false;
+      } else {
+        var link_url = $.trim(prompt(ed_lang_enter_link_url));
+      }
+
+      if (is_url(link_url)) {
+        if (selection) {
+          var link_label = $.trim(prompt(ed_lang_enter_link_label, selection));
+        } else {
+          var link_label = $.trim(prompt(ed_lang_enter_link_label));
+        }
+
+        if (link_label.length > 0) {
+          makeReplace(textarea_id, '[' + link_label + '](' + link_url + ')');
+        } else {
+          makeReplace(textarea_id, '<' + link_url + '>');
+        }
+      }
+
+      return false;
+    });
+    
+    $('.editor-image').click(function() {
+      var selection = $.trim(getSelectionText(textarea_id));
+      if (is_url(selection)) {
+        var image_url = $.trim(prompt(ed_lang_enter_image_url, selection));
+        selection = false;
+      } else {
+        var image_url = $.trim(prompt(ed_lang_enter_image_url));
+      }
+
+      if (is_url(image_url)) {
+        if (selection) {
+          var image_label = $.trim(prompt(ed_lang_enter_image_label, selection));
+        } else {
+          var image_label = $.trim(prompt(ed_lang_enter_image_label));
+        }
+
+        if (image_label.length > 0) {
+          makeReplace(textarea_id, '![' + image_label + '](' + image_url + ')');
+        } else {
+          makeReplace(textarea_id, '!(' + image_url + ')');
+        }
+      }
+
+      return false;
+    });
+    
+    $('.editor-hr').click(function() {
+      makeReplace(textarea_id, '\r\n\r\n- - - - -\r\n\r\n');
+      return false;
+    });
+  });
 });