From 80cea1a511a9fda3d13f16c65f185ba4902aef45 Mon Sep 17 00:00:00 2001 From: chriswmackey Date: Tue, 13 Feb 2024 20:32:17 +0000 Subject: [PATCH] deploy: update docs --- .nojekyll | 1 + README.md | 1 + docs/.buildinfo | 4 + docs/.doctrees/cli/index.doctree | Bin 0 -> 3080 bytes docs/.doctrees/environment.pickle | Bin 0 -> 824537 bytes docs/.doctrees/index.doctree | Bin 0 -> 7436 bytes .../ladybug_display.altnumber.doctree | Bin 0 -> 9463 bytes .../ladybug_display.dictutil.doctree | Bin 0 -> 8466 bytes docs/.doctrees/ladybug_display.doctree | Bin 0 -> 4528 bytes ...ug_display.extension.adaptivechart.doctree | Bin 0 -> 17509 bytes .../ladybug_display.extension.compass.doctree | Bin 0 -> 19664 bytes .../ladybug_display.extension.doctree | Bin 0 -> 4999 bytes ...dybug_display.extension.hourlyplot.doctree | Bin 0 -> 14541 bytes ...bug_display.extension.monthlychart.doctree | Bin 0 -> 18168 bytes ...dybug_display.extension.psychchart.doctree | Bin 0 -> 21380 bytes .../ladybug_display.extension.raddome.doctree | Bin 0 -> 13058 bytes .../ladybug_display.extension.radrose.doctree | Bin 0 -> 14955 bytes .../ladybug_display.extension.skydome.doctree | Bin 0 -> 11932 bytes ..._display.extension.study.directsun.doctree | Bin 0 -> 13996 bytes .../ladybug_display.extension.study.doctree | Bin 0 -> 4273 bytes ..._display.extension.study.radiation.doctree | Bin 0 -> 15290 bytes .../ladybug_display.extension.sunpath.doctree | Bin 0 -> 25104 bytes ...ybug_display.extension.windprofile.doctree | Bin 0 -> 25672 bytes ...ladybug_display.extension.windrose.doctree | Bin 0 -> 12469 bytes .../ladybug_display.geometry2d.arc.doctree | Bin 0 -> 51585 bytes .../ladybug_display.geometry2d.doctree | Bin 0 -> 4392 bytes .../ladybug_display.geometry2d.line.doctree | Bin 0 -> 51231 bytes .../ladybug_display.geometry2d.mesh.doctree | Bin 0 -> 52211 bytes .../ladybug_display.geometry2d.point.doctree | Bin 0 -> 42547 bytes ...ladybug_display.geometry2d.polygon.doctree | Bin 0 -> 60587 bytes ...adybug_display.geometry2d.polyline.doctree | Bin 0 -> 57091 bytes .../ladybug_display.geometry2d.ray.doctree | Bin 0 -> 38781 bytes .../ladybug_display.geometry2d.vector.doctree | Bin 0 -> 39652 bytes .../ladybug_display.geometry3d.arc.doctree | Bin 0 -> 58004 bytes .../ladybug_display.geometry3d.cone.doctree | Bin 0 -> 50911 bytes ...adybug_display.geometry3d.cylinder.doctree | Bin 0 -> 52175 bytes .../ladybug_display.geometry3d.doctree | Bin 0 -> 4634 bytes .../ladybug_display.geometry3d.face.doctree | Bin 0 -> 59354 bytes .../ladybug_display.geometry3d.line.doctree | Bin 0 -> 54103 bytes .../ladybug_display.geometry3d.mesh.doctree | Bin 0 -> 58753 bytes .../ladybug_display.geometry3d.plane.doctree | Bin 0 -> 51209 bytes .../ladybug_display.geometry3d.point.doctree | Bin 0 -> 47050 bytes ...adybug_display.geometry3d.polyface.doctree | Bin 0 -> 70121 bytes ...adybug_display.geometry3d.polyline.doctree | Bin 0 -> 59965 bytes .../ladybug_display.geometry3d.ray.doctree | Bin 0 -> 41600 bytes .../ladybug_display.geometry3d.sphere.doctree | Bin 0 -> 55209 bytes .../ladybug_display.geometry3d.text.doctree | Bin 0 -> 60854 bytes .../ladybug_display.geometry3d.vector.doctree | Bin 0 -> 45733 bytes docs/.doctrees/ladybug_display.typing.doctree | Bin 0 -> 30431 bytes .../ladybug_display.visualization.doctree | Bin 0 -> 277815 bytes docs/.doctrees/modules.doctree | Bin 0 -> 2753 bytes docs/.nojekyll | 0 docs/README.md | 1 + docs/_modules/index.html | 961 ++ docs/_modules/ladybug_display/altnumber.html | 959 ++ docs/_modules/ladybug_display/dictutil.html | 986 ++ .../extension/adaptivechart.html | 1115 ++ .../ladybug_display/extension/compass.html | 1042 ++ .../ladybug_display/extension/hourlyplot.html | 1022 ++ .../extension/monthlychart.html | 1091 ++ .../ladybug_display/extension/psychchart.html | 1153 ++ .../ladybug_display/extension/raddome.html | 1050 ++ .../ladybug_display/extension/radrose.html | 1053 ++ .../ladybug_display/extension/skydome.html | 1022 ++ .../extension/study/directsun.html | 1013 ++ .../extension/study/radiation.html | 1035 ++ .../ladybug_display/extension/sunpath.html | 1122 ++ .../extension/windprofile.html | 1084 ++ .../ladybug_display/extension/windrose.html | 1016 ++ .../ladybug_display/geometry2d/arc.html | 1041 ++ .../ladybug_display/geometry2d/line.html | 1035 ++ .../ladybug_display/geometry2d/mesh.html | 1041 ++ .../ladybug_display/geometry2d/point.html | 1026 ++ .../ladybug_display/geometry2d/polygon.html | 1065 ++ .../ladybug_display/geometry2d/polyline.html | 1054 ++ .../ladybug_display/geometry2d/ray.html | 998 ++ .../ladybug_display/geometry2d/vector.html | 1072 ++ .../ladybug_display/geometry3d/arc.html | 1055 ++ .../ladybug_display/geometry3d/cone.html | 1029 ++ .../ladybug_display/geometry3d/cylinder.html | 1029 ++ .../ladybug_display/geometry3d/face.html | 1066 ++ .../ladybug_display/geometry3d/line.html | 1035 ++ .../ladybug_display/geometry3d/mesh.html | 1053 ++ .../ladybug_display/geometry3d/plane.html | 1050 ++ .../ladybug_display/geometry3d/point.html | 1032 ++ .../ladybug_display/geometry3d/polyface.html | 1091 ++ .../ladybug_display/geometry3d/polyline.html | 1054 ++ .../ladybug_display/geometry3d/ray.html | 998 ++ .../ladybug_display/geometry3d/sphere.html | 1041 ++ .../ladybug_display/geometry3d/text.html | 1150 ++ .../ladybug_display/geometry3d/vector.html | 1090 ++ docs/_modules/ladybug_display/typing.html | 1044 ++ .../ladybug_display/visualization.html | 2525 ++++ docs/_sources/cli/index.rst.txt | 7 + docs/_sources/index.rst.txt | 28 + .../ladybug_display.altnumber.rst.txt | 7 + .../_sources/ladybug_display.dictutil.rst.txt | 7 + ...ug_display.extension.adaptivechart.rst.txt | 7 + .../ladybug_display.extension.compass.rst.txt | 7 + ...dybug_display.extension.hourlyplot.rst.txt | 7 + ...bug_display.extension.monthlychart.rst.txt | 7 + ...dybug_display.extension.psychchart.rst.txt | 7 + .../ladybug_display.extension.raddome.rst.txt | 7 + .../ladybug_display.extension.radrose.rst.txt | 7 + .../ladybug_display.extension.rst.txt | 36 + .../ladybug_display.extension.skydome.rst.txt | 7 + ..._display.extension.study.directsun.rst.txt | 7 + ..._display.extension.study.radiation.rst.txt | 7 + .../ladybug_display.extension.study.rst.txt | 19 + .../ladybug_display.extension.sunpath.rst.txt | 7 + ...ybug_display.extension.windprofile.rst.txt | 7 + ...ladybug_display.extension.windrose.rst.txt | 7 + .../ladybug_display.geometry2d.arc.rst.txt | 7 + .../ladybug_display.geometry2d.line.rst.txt | 7 + .../ladybug_display.geometry2d.mesh.rst.txt | 7 + .../ladybug_display.geometry2d.point.rst.txt | 7 + ...ladybug_display.geometry2d.polygon.rst.txt | 7 + ...adybug_display.geometry2d.polyline.rst.txt | 7 + .../ladybug_display.geometry2d.ray.rst.txt | 7 + .../ladybug_display.geometry2d.rst.txt | 25 + .../ladybug_display.geometry2d.vector.rst.txt | 7 + .../ladybug_display.geometry3d.arc.rst.txt | 7 + .../ladybug_display.geometry3d.cone.rst.txt | 7 + ...adybug_display.geometry3d.cylinder.rst.txt | 7 + .../ladybug_display.geometry3d.face.rst.txt | 7 + .../ladybug_display.geometry3d.line.rst.txt | 7 + .../ladybug_display.geometry3d.mesh.rst.txt | 7 + .../ladybug_display.geometry3d.plane.rst.txt | 7 + .../ladybug_display.geometry3d.point.rst.txt | 7 + ...adybug_display.geometry3d.polyface.rst.txt | 7 + ...adybug_display.geometry3d.polyline.rst.txt | 7 + .../ladybug_display.geometry3d.ray.rst.txt | 7 + .../ladybug_display.geometry3d.rst.txt | 31 + .../ladybug_display.geometry3d.sphere.rst.txt | 7 + .../ladybug_display.geometry3d.text.rst.txt | 7 + .../ladybug_display.geometry3d.vector.rst.txt | 7 + docs/_sources/ladybug_display.rst.txt | 31 + docs/_sources/ladybug_display.typing.rst.txt | 7 + .../ladybug_display.visualization.rst.txt | 7 + docs/_sources/modules.rst.txt | 7 + .../_sphinx_javascript_frameworks_compat.js | 134 + docs/_static/basic.css | 899 ++ .../css/bootstrap-responsive.css | 1109 ++ .../css/bootstrap-responsive.min.css | 9 + .../_static/bootstrap-2.3.2/css/bootstrap.css | 6167 +++++++++ .../bootstrap-2.3.2/css/bootstrap.min.css | 9 + .../img/glyphicons-halflings-white.png | Bin 0 -> 8777 bytes .../img/glyphicons-halflings.png | Bin 0 -> 12799 bytes docs/_static/bootstrap-2.3.2/js/bootstrap.js | 2287 ++++ .../bootstrap-2.3.2/js/bootstrap.min.js | 6 + .../bootstrap-3.4.1/css/bootstrap-theme.css | 587 + .../css/bootstrap-theme.css.map | 1 + .../css/bootstrap-theme.min.css | 6 + .../css/bootstrap-theme.min.css.map | 1 + .../_static/bootstrap-3.4.1/css/bootstrap.css | 6834 ++++++++++ .../bootstrap-3.4.1/css/bootstrap.css.map | 1 + .../bootstrap-3.4.1/css/bootstrap.min.css | 6 + .../bootstrap-3.4.1/css/bootstrap.min.css.map | 1 + .../fonts/glyphicons-halflings-regular.eot | Bin 0 -> 20127 bytes .../fonts/glyphicons-halflings-regular.svg | 288 + .../fonts/glyphicons-halflings-regular.ttf | Bin 0 -> 45404 bytes .../fonts/glyphicons-halflings-regular.woff | Bin 0 -> 23424 bytes .../fonts/glyphicons-halflings-regular.woff2 | Bin 0 -> 18028 bytes docs/_static/bootstrap-3.4.1/js/bootstrap.js | 2580 ++++ .../bootstrap-3.4.1/js/bootstrap.min.js | 6 + docs/_static/bootstrap-3.4.1/js/npm.js | 13 + docs/_static/bootstrap-sphinx.css | 223 + docs/_static/bootstrap-sphinx.js | 175 + .../bootswatch-2.3.2/amelia/bootstrap.min.css | 9 + .../cerulean/bootstrap.min.css | 9 + .../bootswatch-2.3.2/cosmo/bootstrap.min.css | 9 + .../bootswatch-2.3.2/cyborg/bootstrap.min.css | 9 + .../bootswatch-2.3.2/flatly/bootstrap.min.css | 9 + .../img/glyphicons-halflings-white.png | Bin 0 -> 8777 bytes .../img/glyphicons-halflings.png | Bin 0 -> 12799 bytes .../journal/bootstrap.min.css | 9 + .../readable/bootstrap.min.css | 9 + .../simplex/bootstrap.min.css | 9 + .../bootswatch-2.3.2/slate/bootstrap.min.css | 9 + .../spacelab/bootstrap.min.css | 9 + .../bootswatch-2.3.2/spruce/bootstrap.min.css | 9 + .../superhero/bootstrap.min.css | 9 + .../bootswatch-2.3.2/united/bootstrap.min.css | 9 + .../cerulean/bootstrap.min.css | 11 + .../bootswatch-3.4.1/cosmo/bootstrap.min.css | 11 + .../bootswatch-3.4.1/cyborg/bootstrap.min.css | 11 + .../bootswatch-3.4.1/darkly/bootstrap.min.css | 11 + .../bootswatch-3.4.1/flatly/bootstrap.min.css | 11 + .../fonts/glyphicons-halflings-regular.eot | Bin 0 -> 20127 bytes .../fonts/glyphicons-halflings-regular.svg | 288 + .../fonts/glyphicons-halflings-regular.ttf | Bin 0 -> 45404 bytes .../fonts/glyphicons-halflings-regular.woff | Bin 0 -> 23424 bytes .../fonts/glyphicons-halflings-regular.woff2 | Bin 0 -> 18028 bytes .../journal/bootstrap.min.css | 11 + .../bootswatch-3.4.1/lumen/bootstrap.min.css | 11 + .../bootswatch-3.4.1/paper/bootstrap.min.css | 11 + .../readable/bootstrap.min.css | 11 + .../sandstone/bootstrap.min.css | 11 + .../simplex/bootstrap.min.css | 11 + .../bootswatch-3.4.1/slate/bootstrap.min.css | 11 + .../spacelab/bootstrap.min.css | 11 + .../superhero/bootstrap.min.css | 11 + .../bootswatch-3.4.1/united/bootstrap.min.css | 11 + .../bootswatch-3.4.1/yeti/bootstrap.min.css | 11 + docs/_static/custom.css | 48 + docs/_static/doctools.js | 156 + docs/_static/documentation_options.js | 14 + docs/_static/file.png | Bin 0 -> 286 bytes docs/_static/jquery-3.6.0.js | 10881 ++++++++++++++++ docs/_static/jquery.js | 2 + docs/_static/js/jquery-1.12.4.min.js | 5 + docs/_static/js/jquery-fix.js | 2 + docs/_static/language_data.js | 199 + docs/_static/minus.png | Bin 0 -> 90 bytes docs/_static/plus.png | Bin 0 -> 90 bytes docs/_static/pygments.css | 84 + docs/_static/searchtools.js | 566 + docs/_static/sphinx_highlight.js | 144 + docs/_static/underscore-1.13.1.js | 2042 +++ docs/_static/underscore.js | 6 + docs/cli/index.html | 933 ++ docs/genindex.html | 2787 ++++ docs/index.html | 1014 ++ docs/ladybug_display.altnumber.html | 1001 ++ docs/ladybug_display.dictutil.html | 986 ++ ...dybug_display.extension.adaptivechart.html | 1060 ++ docs/ladybug_display.extension.compass.html | 1063 ++ .../ladybug_display.extension.hourlyplot.html | 1044 ++ docs/ladybug_display.extension.html | 1078 ++ ...adybug_display.extension.monthlychart.html | 1058 ++ .../ladybug_display.extension.psychchart.html | 1075 ++ docs/ladybug_display.extension.raddome.html | 1039 ++ docs/ladybug_display.extension.radrose.html | 1045 ++ docs/ladybug_display.extension.skydome.html | 1034 ++ ...bug_display.extension.study.directsun.html | 1036 ++ docs/ladybug_display.extension.study.html | 1010 ++ ...bug_display.extension.study.radiation.html | 1039 ++ docs/ladybug_display.extension.sunpath.html | 1070 ++ ...ladybug_display.extension.windprofile.html | 1072 ++ docs/ladybug_display.extension.windrose.html | 1037 ++ docs/ladybug_display.geometry2d.arc.html | 1236 ++ docs/ladybug_display.geometry2d.html | 1192 ++ docs/ladybug_display.geometry2d.line.html | 1227 ++ docs/ladybug_display.geometry2d.mesh.html | 1240 ++ docs/ladybug_display.geometry2d.point.html | 1188 ++ docs/ladybug_display.geometry2d.polygon.html | 1272 ++ docs/ladybug_display.geometry2d.polyline.html | 1254 ++ docs/ladybug_display.geometry2d.ray.html | 1176 ++ docs/ladybug_display.geometry2d.vector.html | 1174 ++ docs/ladybug_display.geometry3d.arc.html | 1281 ++ docs/ladybug_display.geometry3d.cone.html | 1249 ++ docs/ladybug_display.geometry3d.cylinder.html | 1249 ++ docs/ladybug_display.geometry3d.face.html | 1288 ++ docs/ladybug_display.geometry3d.html | 1381 ++ docs/ladybug_display.geometry3d.line.html | 1254 ++ docs/ladybug_display.geometry3d.mesh.html | 1285 ++ docs/ladybug_display.geometry3d.plane.html | 1244 ++ docs/ladybug_display.geometry3d.point.html | 1224 ++ docs/ladybug_display.geometry3d.polyface.html | 1332 ++ docs/ladybug_display.geometry3d.polyline.html | 1281 ++ docs/ladybug_display.geometry3d.ray.html | 1203 ++ docs/ladybug_display.geometry3d.sphere.html | 1267 ++ docs/ladybug_display.geometry3d.text.html | 1285 ++ docs/ladybug_display.geometry3d.vector.html | 1216 ++ docs/ladybug_display.html | 1281 ++ docs/ladybug_display.typing.html | 1046 ++ docs/ladybug_display.visualization.html | 2256 ++++ docs/modules.html | 988 ++ docs/objects.inv | Bin 0 -> 4663 bytes docs/py-modindex.html | 1157 ++ docs/search.html | 949 ++ docs/searchindex.js | 1 + 272 files changed, 140091 insertions(+) create mode 100644 .nojekyll create mode 100644 README.md create mode 100644 docs/.buildinfo create mode 100644 docs/.doctrees/cli/index.doctree create mode 100644 docs/.doctrees/environment.pickle create mode 100644 docs/.doctrees/index.doctree create mode 100644 docs/.doctrees/ladybug_display.altnumber.doctree create mode 100644 docs/.doctrees/ladybug_display.dictutil.doctree create mode 100644 docs/.doctrees/ladybug_display.doctree create mode 100644 docs/.doctrees/ladybug_display.extension.adaptivechart.doctree create mode 100644 docs/.doctrees/ladybug_display.extension.compass.doctree create mode 100644 docs/.doctrees/ladybug_display.extension.doctree create mode 100644 docs/.doctrees/ladybug_display.extension.hourlyplot.doctree create mode 100644 docs/.doctrees/ladybug_display.extension.monthlychart.doctree create mode 100644 docs/.doctrees/ladybug_display.extension.psychchart.doctree create mode 100644 docs/.doctrees/ladybug_display.extension.raddome.doctree create mode 100644 docs/.doctrees/ladybug_display.extension.radrose.doctree create mode 100644 docs/.doctrees/ladybug_display.extension.skydome.doctree create mode 100644 docs/.doctrees/ladybug_display.extension.study.directsun.doctree create mode 100644 docs/.doctrees/ladybug_display.extension.study.doctree create mode 100644 docs/.doctrees/ladybug_display.extension.study.radiation.doctree create mode 100644 docs/.doctrees/ladybug_display.extension.sunpath.doctree create mode 100644 docs/.doctrees/ladybug_display.extension.windprofile.doctree create mode 100644 docs/.doctrees/ladybug_display.extension.windrose.doctree create mode 100644 docs/.doctrees/ladybug_display.geometry2d.arc.doctree create mode 100644 docs/.doctrees/ladybug_display.geometry2d.doctree create mode 100644 docs/.doctrees/ladybug_display.geometry2d.line.doctree create mode 100644 docs/.doctrees/ladybug_display.geometry2d.mesh.doctree create mode 100644 docs/.doctrees/ladybug_display.geometry2d.point.doctree create mode 100644 docs/.doctrees/ladybug_display.geometry2d.polygon.doctree create mode 100644 docs/.doctrees/ladybug_display.geometry2d.polyline.doctree create mode 100644 docs/.doctrees/ladybug_display.geometry2d.ray.doctree create mode 100644 docs/.doctrees/ladybug_display.geometry2d.vector.doctree create mode 100644 docs/.doctrees/ladybug_display.geometry3d.arc.doctree create mode 100644 docs/.doctrees/ladybug_display.geometry3d.cone.doctree create mode 100644 docs/.doctrees/ladybug_display.geometry3d.cylinder.doctree create mode 100644 docs/.doctrees/ladybug_display.geometry3d.doctree create mode 100644 docs/.doctrees/ladybug_display.geometry3d.face.doctree create mode 100644 docs/.doctrees/ladybug_display.geometry3d.line.doctree create mode 100644 docs/.doctrees/ladybug_display.geometry3d.mesh.doctree create mode 100644 docs/.doctrees/ladybug_display.geometry3d.plane.doctree create mode 100644 docs/.doctrees/ladybug_display.geometry3d.point.doctree create mode 100644 docs/.doctrees/ladybug_display.geometry3d.polyface.doctree create mode 100644 docs/.doctrees/ladybug_display.geometry3d.polyline.doctree create mode 100644 docs/.doctrees/ladybug_display.geometry3d.ray.doctree create mode 100644 docs/.doctrees/ladybug_display.geometry3d.sphere.doctree create mode 100644 docs/.doctrees/ladybug_display.geometry3d.text.doctree create mode 100644 docs/.doctrees/ladybug_display.geometry3d.vector.doctree create mode 100644 docs/.doctrees/ladybug_display.typing.doctree create mode 100644 docs/.doctrees/ladybug_display.visualization.doctree create mode 100644 docs/.doctrees/modules.doctree create mode 100644 docs/.nojekyll create mode 100644 docs/README.md create mode 100644 docs/_modules/index.html create mode 100644 docs/_modules/ladybug_display/altnumber.html create mode 100644 docs/_modules/ladybug_display/dictutil.html create mode 100644 docs/_modules/ladybug_display/extension/adaptivechart.html create mode 100644 docs/_modules/ladybug_display/extension/compass.html create mode 100644 docs/_modules/ladybug_display/extension/hourlyplot.html create mode 100644 docs/_modules/ladybug_display/extension/monthlychart.html create mode 100644 docs/_modules/ladybug_display/extension/psychchart.html create mode 100644 docs/_modules/ladybug_display/extension/raddome.html create mode 100644 docs/_modules/ladybug_display/extension/radrose.html create mode 100644 docs/_modules/ladybug_display/extension/skydome.html create mode 100644 docs/_modules/ladybug_display/extension/study/directsun.html create mode 100644 docs/_modules/ladybug_display/extension/study/radiation.html create mode 100644 docs/_modules/ladybug_display/extension/sunpath.html create mode 100644 docs/_modules/ladybug_display/extension/windprofile.html create mode 100644 docs/_modules/ladybug_display/extension/windrose.html create mode 100644 docs/_modules/ladybug_display/geometry2d/arc.html create mode 100644 docs/_modules/ladybug_display/geometry2d/line.html create mode 100644 docs/_modules/ladybug_display/geometry2d/mesh.html create mode 100644 docs/_modules/ladybug_display/geometry2d/point.html create mode 100644 docs/_modules/ladybug_display/geometry2d/polygon.html create mode 100644 docs/_modules/ladybug_display/geometry2d/polyline.html create mode 100644 docs/_modules/ladybug_display/geometry2d/ray.html create mode 100644 docs/_modules/ladybug_display/geometry2d/vector.html create mode 100644 docs/_modules/ladybug_display/geometry3d/arc.html create mode 100644 docs/_modules/ladybug_display/geometry3d/cone.html create mode 100644 docs/_modules/ladybug_display/geometry3d/cylinder.html create mode 100644 docs/_modules/ladybug_display/geometry3d/face.html create mode 100644 docs/_modules/ladybug_display/geometry3d/line.html create mode 100644 docs/_modules/ladybug_display/geometry3d/mesh.html create mode 100644 docs/_modules/ladybug_display/geometry3d/plane.html create mode 100644 docs/_modules/ladybug_display/geometry3d/point.html create mode 100644 docs/_modules/ladybug_display/geometry3d/polyface.html create mode 100644 docs/_modules/ladybug_display/geometry3d/polyline.html create mode 100644 docs/_modules/ladybug_display/geometry3d/ray.html create mode 100644 docs/_modules/ladybug_display/geometry3d/sphere.html create mode 100644 docs/_modules/ladybug_display/geometry3d/text.html create mode 100644 docs/_modules/ladybug_display/geometry3d/vector.html create mode 100644 docs/_modules/ladybug_display/typing.html create mode 100644 docs/_modules/ladybug_display/visualization.html create mode 100644 docs/_sources/cli/index.rst.txt create mode 100644 docs/_sources/index.rst.txt create mode 100644 docs/_sources/ladybug_display.altnumber.rst.txt create mode 100644 docs/_sources/ladybug_display.dictutil.rst.txt create mode 100644 docs/_sources/ladybug_display.extension.adaptivechart.rst.txt create mode 100644 docs/_sources/ladybug_display.extension.compass.rst.txt create mode 100644 docs/_sources/ladybug_display.extension.hourlyplot.rst.txt create mode 100644 docs/_sources/ladybug_display.extension.monthlychart.rst.txt create mode 100644 docs/_sources/ladybug_display.extension.psychchart.rst.txt create mode 100644 docs/_sources/ladybug_display.extension.raddome.rst.txt create mode 100644 docs/_sources/ladybug_display.extension.radrose.rst.txt create mode 100644 docs/_sources/ladybug_display.extension.rst.txt create mode 100644 docs/_sources/ladybug_display.extension.skydome.rst.txt create mode 100644 docs/_sources/ladybug_display.extension.study.directsun.rst.txt create mode 100644 docs/_sources/ladybug_display.extension.study.radiation.rst.txt create mode 100644 docs/_sources/ladybug_display.extension.study.rst.txt create mode 100644 docs/_sources/ladybug_display.extension.sunpath.rst.txt create mode 100644 docs/_sources/ladybug_display.extension.windprofile.rst.txt create mode 100644 docs/_sources/ladybug_display.extension.windrose.rst.txt create mode 100644 docs/_sources/ladybug_display.geometry2d.arc.rst.txt create mode 100644 docs/_sources/ladybug_display.geometry2d.line.rst.txt create mode 100644 docs/_sources/ladybug_display.geometry2d.mesh.rst.txt create mode 100644 docs/_sources/ladybug_display.geometry2d.point.rst.txt create mode 100644 docs/_sources/ladybug_display.geometry2d.polygon.rst.txt create mode 100644 docs/_sources/ladybug_display.geometry2d.polyline.rst.txt create mode 100644 docs/_sources/ladybug_display.geometry2d.ray.rst.txt create mode 100644 docs/_sources/ladybug_display.geometry2d.rst.txt create mode 100644 docs/_sources/ladybug_display.geometry2d.vector.rst.txt create mode 100644 docs/_sources/ladybug_display.geometry3d.arc.rst.txt create mode 100644 docs/_sources/ladybug_display.geometry3d.cone.rst.txt create mode 100644 docs/_sources/ladybug_display.geometry3d.cylinder.rst.txt create mode 100644 docs/_sources/ladybug_display.geometry3d.face.rst.txt create mode 100644 docs/_sources/ladybug_display.geometry3d.line.rst.txt create mode 100644 docs/_sources/ladybug_display.geometry3d.mesh.rst.txt create mode 100644 docs/_sources/ladybug_display.geometry3d.plane.rst.txt create mode 100644 docs/_sources/ladybug_display.geometry3d.point.rst.txt create mode 100644 docs/_sources/ladybug_display.geometry3d.polyface.rst.txt create mode 100644 docs/_sources/ladybug_display.geometry3d.polyline.rst.txt create mode 100644 docs/_sources/ladybug_display.geometry3d.ray.rst.txt create mode 100644 docs/_sources/ladybug_display.geometry3d.rst.txt create mode 100644 docs/_sources/ladybug_display.geometry3d.sphere.rst.txt create mode 100644 docs/_sources/ladybug_display.geometry3d.text.rst.txt create mode 100644 docs/_sources/ladybug_display.geometry3d.vector.rst.txt create mode 100644 docs/_sources/ladybug_display.rst.txt create mode 100644 docs/_sources/ladybug_display.typing.rst.txt create mode 100644 docs/_sources/ladybug_display.visualization.rst.txt create mode 100644 docs/_sources/modules.rst.txt create mode 100644 docs/_static/_sphinx_javascript_frameworks_compat.js create mode 100644 docs/_static/basic.css create mode 100644 docs/_static/bootstrap-2.3.2/css/bootstrap-responsive.css create mode 100644 docs/_static/bootstrap-2.3.2/css/bootstrap-responsive.min.css create mode 100644 docs/_static/bootstrap-2.3.2/css/bootstrap.css create mode 100644 docs/_static/bootstrap-2.3.2/css/bootstrap.min.css create mode 100644 docs/_static/bootstrap-2.3.2/img/glyphicons-halflings-white.png create mode 100644 docs/_static/bootstrap-2.3.2/img/glyphicons-halflings.png create mode 100644 docs/_static/bootstrap-2.3.2/js/bootstrap.js create mode 100644 docs/_static/bootstrap-2.3.2/js/bootstrap.min.js create mode 100644 docs/_static/bootstrap-3.4.1/css/bootstrap-theme.css create mode 100644 docs/_static/bootstrap-3.4.1/css/bootstrap-theme.css.map create mode 100644 docs/_static/bootstrap-3.4.1/css/bootstrap-theme.min.css create mode 100644 docs/_static/bootstrap-3.4.1/css/bootstrap-theme.min.css.map create mode 100644 docs/_static/bootstrap-3.4.1/css/bootstrap.css create mode 100644 docs/_static/bootstrap-3.4.1/css/bootstrap.css.map create mode 100644 docs/_static/bootstrap-3.4.1/css/bootstrap.min.css create mode 100644 docs/_static/bootstrap-3.4.1/css/bootstrap.min.css.map create mode 100644 docs/_static/bootstrap-3.4.1/fonts/glyphicons-halflings-regular.eot create mode 100644 docs/_static/bootstrap-3.4.1/fonts/glyphicons-halflings-regular.svg create mode 100644 docs/_static/bootstrap-3.4.1/fonts/glyphicons-halflings-regular.ttf create mode 100644 docs/_static/bootstrap-3.4.1/fonts/glyphicons-halflings-regular.woff create mode 100644 docs/_static/bootstrap-3.4.1/fonts/glyphicons-halflings-regular.woff2 create mode 100644 docs/_static/bootstrap-3.4.1/js/bootstrap.js create mode 100644 docs/_static/bootstrap-3.4.1/js/bootstrap.min.js create mode 100644 docs/_static/bootstrap-3.4.1/js/npm.js create mode 100644 docs/_static/bootstrap-sphinx.css create mode 100644 docs/_static/bootstrap-sphinx.js create mode 100644 docs/_static/bootswatch-2.3.2/amelia/bootstrap.min.css create mode 100644 docs/_static/bootswatch-2.3.2/cerulean/bootstrap.min.css create mode 100644 docs/_static/bootswatch-2.3.2/cosmo/bootstrap.min.css create mode 100644 docs/_static/bootswatch-2.3.2/cyborg/bootstrap.min.css create mode 100644 docs/_static/bootswatch-2.3.2/flatly/bootstrap.min.css create mode 100644 docs/_static/bootswatch-2.3.2/img/glyphicons-halflings-white.png create mode 100644 docs/_static/bootswatch-2.3.2/img/glyphicons-halflings.png create mode 100644 docs/_static/bootswatch-2.3.2/journal/bootstrap.min.css create mode 100644 docs/_static/bootswatch-2.3.2/readable/bootstrap.min.css create mode 100644 docs/_static/bootswatch-2.3.2/simplex/bootstrap.min.css create mode 100644 docs/_static/bootswatch-2.3.2/slate/bootstrap.min.css create mode 100644 docs/_static/bootswatch-2.3.2/spacelab/bootstrap.min.css create mode 100644 docs/_static/bootswatch-2.3.2/spruce/bootstrap.min.css create mode 100644 docs/_static/bootswatch-2.3.2/superhero/bootstrap.min.css create mode 100644 docs/_static/bootswatch-2.3.2/united/bootstrap.min.css create mode 100644 docs/_static/bootswatch-3.4.1/cerulean/bootstrap.min.css create mode 100644 docs/_static/bootswatch-3.4.1/cosmo/bootstrap.min.css create mode 100644 docs/_static/bootswatch-3.4.1/cyborg/bootstrap.min.css create mode 100644 docs/_static/bootswatch-3.4.1/darkly/bootstrap.min.css create mode 100644 docs/_static/bootswatch-3.4.1/flatly/bootstrap.min.css create mode 100644 docs/_static/bootswatch-3.4.1/fonts/glyphicons-halflings-regular.eot create mode 100644 docs/_static/bootswatch-3.4.1/fonts/glyphicons-halflings-regular.svg create mode 100644 docs/_static/bootswatch-3.4.1/fonts/glyphicons-halflings-regular.ttf create mode 100644 docs/_static/bootswatch-3.4.1/fonts/glyphicons-halflings-regular.woff create mode 100644 docs/_static/bootswatch-3.4.1/fonts/glyphicons-halflings-regular.woff2 create mode 100644 docs/_static/bootswatch-3.4.1/journal/bootstrap.min.css create mode 100644 docs/_static/bootswatch-3.4.1/lumen/bootstrap.min.css create mode 100644 docs/_static/bootswatch-3.4.1/paper/bootstrap.min.css create mode 100644 docs/_static/bootswatch-3.4.1/readable/bootstrap.min.css create mode 100644 docs/_static/bootswatch-3.4.1/sandstone/bootstrap.min.css create mode 100644 docs/_static/bootswatch-3.4.1/simplex/bootstrap.min.css create mode 100644 docs/_static/bootswatch-3.4.1/slate/bootstrap.min.css create mode 100644 docs/_static/bootswatch-3.4.1/spacelab/bootstrap.min.css create mode 100644 docs/_static/bootswatch-3.4.1/superhero/bootstrap.min.css create mode 100644 docs/_static/bootswatch-3.4.1/united/bootstrap.min.css create mode 100644 docs/_static/bootswatch-3.4.1/yeti/bootstrap.min.css create mode 100644 docs/_static/custom.css create mode 100644 docs/_static/doctools.js create mode 100644 docs/_static/documentation_options.js create mode 100644 docs/_static/file.png create mode 100644 docs/_static/jquery-3.6.0.js create mode 100644 docs/_static/jquery.js create mode 100644 docs/_static/js/jquery-1.12.4.min.js create mode 100644 docs/_static/js/jquery-fix.js create mode 100644 docs/_static/language_data.js create mode 100644 docs/_static/minus.png create mode 100644 docs/_static/plus.png create mode 100644 docs/_static/pygments.css create mode 100644 docs/_static/searchtools.js create mode 100644 docs/_static/sphinx_highlight.js create mode 100644 docs/_static/underscore-1.13.1.js create mode 100644 docs/_static/underscore.js create mode 100644 docs/cli/index.html create mode 100644 docs/genindex.html create mode 100644 docs/index.html create mode 100644 docs/ladybug_display.altnumber.html create mode 100644 docs/ladybug_display.dictutil.html create mode 100644 docs/ladybug_display.extension.adaptivechart.html create mode 100644 docs/ladybug_display.extension.compass.html create mode 100644 docs/ladybug_display.extension.hourlyplot.html create mode 100644 docs/ladybug_display.extension.html create mode 100644 docs/ladybug_display.extension.monthlychart.html create mode 100644 docs/ladybug_display.extension.psychchart.html create mode 100644 docs/ladybug_display.extension.raddome.html create mode 100644 docs/ladybug_display.extension.radrose.html create mode 100644 docs/ladybug_display.extension.skydome.html create mode 100644 docs/ladybug_display.extension.study.directsun.html create mode 100644 docs/ladybug_display.extension.study.html create mode 100644 docs/ladybug_display.extension.study.radiation.html create mode 100644 docs/ladybug_display.extension.sunpath.html create mode 100644 docs/ladybug_display.extension.windprofile.html create mode 100644 docs/ladybug_display.extension.windrose.html create mode 100644 docs/ladybug_display.geometry2d.arc.html create mode 100644 docs/ladybug_display.geometry2d.html create mode 100644 docs/ladybug_display.geometry2d.line.html create mode 100644 docs/ladybug_display.geometry2d.mesh.html create mode 100644 docs/ladybug_display.geometry2d.point.html create mode 100644 docs/ladybug_display.geometry2d.polygon.html create mode 100644 docs/ladybug_display.geometry2d.polyline.html create mode 100644 docs/ladybug_display.geometry2d.ray.html create mode 100644 docs/ladybug_display.geometry2d.vector.html create mode 100644 docs/ladybug_display.geometry3d.arc.html create mode 100644 docs/ladybug_display.geometry3d.cone.html create mode 100644 docs/ladybug_display.geometry3d.cylinder.html create mode 100644 docs/ladybug_display.geometry3d.face.html create mode 100644 docs/ladybug_display.geometry3d.html create mode 100644 docs/ladybug_display.geometry3d.line.html create mode 100644 docs/ladybug_display.geometry3d.mesh.html create mode 100644 docs/ladybug_display.geometry3d.plane.html create mode 100644 docs/ladybug_display.geometry3d.point.html create mode 100644 docs/ladybug_display.geometry3d.polyface.html create mode 100644 docs/ladybug_display.geometry3d.polyline.html create mode 100644 docs/ladybug_display.geometry3d.ray.html create mode 100644 docs/ladybug_display.geometry3d.sphere.html create mode 100644 docs/ladybug_display.geometry3d.text.html create mode 100644 docs/ladybug_display.geometry3d.vector.html create mode 100644 docs/ladybug_display.html create mode 100644 docs/ladybug_display.typing.html create mode 100644 docs/ladybug_display.visualization.html create mode 100644 docs/modules.html create mode 100644 docs/objects.inv create mode 100644 docs/py-modindex.html create mode 100644 docs/search.html create mode 100644 docs/searchindex.js diff --git a/.nojekyll b/.nojekyll new file mode 100644 index 0000000..8b13789 --- /dev/null +++ b/.nojekyll @@ -0,0 +1 @@ + diff --git a/README.md b/README.md new file mode 100644 index 0000000..ebfb366 --- /dev/null +++ b/README.md @@ -0,0 +1 @@ +# documentation diff --git a/docs/.buildinfo b/docs/.buildinfo new file mode 100644 index 0000000..c94df96 --- /dev/null +++ b/docs/.buildinfo @@ -0,0 +1,4 @@ +# Sphinx build info version 1 +# This file hashes the configuration used when building these files. When it is not found, a full rebuild will be done. +config: c56abcf1e782822eb1141ce22e3b8599 +tags: 645f666f9bcd5a90fca523b33c5a78b7 diff --git a/docs/.doctrees/cli/index.doctree b/docs/.doctrees/cli/index.doctree new file mode 100644 index 0000000000000000000000000000000000000000..38fc9f813ca7c0e0ed2d372432ec679af2d3bda8 GIT binary patch literal 3080 zcmbtWTWcFf6i#BxvTRwllg5-LP8CWThelQ?eF%Lhg@i(ItA~*Gt*l48Bh8@MneAL+ z=^@ZQ1QM91X8Lmr{bqM{vC^i{3Isc6&Ya6P-#K%B-TdRv-7DqK@0)^gIXxv=CRIjF z@Y|V6T~4J9@4|!M!mDuNTbf)L<#bAezXFYvagk{%!_UEYqPpe6oYv=?hNhM)xj4=m zY>PF24kxVT8rPkVy)&wXOUUVWP@iWM%_#WF$O|>HzdicukFkg%f*nS6HP}^ z$N8ou^9qA$Np)bshsw;lalKGh0>G0AlYo_#=VT2LXg>eYlLk2so;Gs zGdexh2C3XRyXJ;$w?caf*TG!i+s~x2LTLN{oCR}3lB?5d@1vp@LA`I+Pu_gsuy{zXiR5xWbopkxAYZ>jPD$j|` zx)Jd%H(g%ENi*zd4I+qH*BRP9KVQS8+v_nZiu3dG+E3V#fBaub`>)~ z&=lNKO~fhypZrTA$m8hmGhIfBYPiMDR-JwLf}X|L+>n0o7QbP~3+fZw{9HVs|#(q%tqLEh8Qkez6^%D^en&jPq5snmre_;_N+>i*cIX~+%*uFo&|q>q?DD)(v{7#t9~ywLh15k zI#N0hkaP^1QIW)=!BGQ~w<-x0w3H+l+_Gfeo8YlNP&ccAZ);j8Z4*IXQW4Is`5i{Y zV%hMAbjpF1CDxg_Qo}bgik1X-oeQERu!4rBB!{GBHA!hqD!lO>E(>Q9DpQp~EBKbP zqu%45;rPCNc{8C}E1fV@zn~g8$52xn{JwJbvXw?@CHUjDoi!8eci*XuE(2)%_~N_X zV>rLOv3AlQ!~_gbV!%frq2Tufkz+^36mVx)U&C|dZ=fY9oh2D9Kn}R!V8+02rAm&F zBjDg!QlRPcX<%EvL!4E~Qsl33FlsMzd66tw2UJS|2jR3NA{yK;C4g3%c=t338&SqqNMo9VJ5o*OA!%V`gn(zV7!SHmAkRG9^!y9`}R488xG&sF_%r16>O= zw;}J{d-N6H=;%?pW5Ow+Yp!oZ3<810~yMHWzT#vSf$~$SezI+x{4Q z%9BNDEfPpf5ij_yKPuxwXQMhki=b^pDFcspF|RC^sJp}1Do_q`jOr3R=QjLsaNi%8 znY3h@Fg|7ie~@=msL1=a$qB0L7l)!YFnFU}SIb1Gl+@53rwq?zii@v`4OdyZ!s&@C z5M!K<%8{pT0&l?{m2x=(2j*Sjdh8R%4cGK|9?2^dsY)>pHIo3&Tr@i&<%0g-0;PeKSFXOP}x2xWQVg@xao$&a6 zCzj|jMX$o3bci59HH#JtxU)DKy+Zf9B(26Lh+%ECSZu|T!sG>cGYYHk6DAmE86(cO zqSVd`pdCjQF<{xivAgk`;~65X=ltF(7fM@uDF>rsFtA@qV#Ut&s-RaTl^#;T)#pPc z7W67rKUxzmv|E=fw&q^TL)S0aN9WZxw)&gvw(6ZLeh2*|RW5dm;CE9c1YkxEcu<;8 zYWX{$@H#w4abXNYnPNUQU_<3_(N->rcNgOF0(ZGgh07v=#_{fUve^0RCJ|p_H$43d DZY8qE literal 0 HcmV?d00001 diff --git a/docs/.doctrees/environment.pickle b/docs/.doctrees/environment.pickle new file mode 100644 index 0000000000000000000000000000000000000000..e1bb9eda47cb9714197b8e50ddbd302a4f0d6435 GIT binary patch literal 824537 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 J-M!QM{{igIxfcKc literal 0 HcmV?d00001 diff --git a/docs/.doctrees/index.doctree b/docs/.doctrees/index.doctree new file mode 100644 index 0000000000000000000000000000000000000000..9e3ee7195cde7cf5553a8fc063f6dad457d0bbef GIT binary patch literal 7436 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:YkdAmpNzBBZXmj+Vc@$Va5nNI| zkZzEW`m3%eVW|_EsJ&p+Y2*^agqii3%1UfuA|vH$6I~)#vo?I%NY3R<;Sjtp7qFQG zE}$z}u$p|BIdpw&j;iw!i%iN~!j){bUu1YAm@Aeh+m;{XLPW{h>MFVuluMCY2?k-j zxths)Xe3dhk)~iHNLN6bv*_=C?BT~Cj>ULrx5!gZMgD<;JbcX}i`!!Hz-3~n)_~Wp zaxwC;SXWpZZ~{m0?Aok650e_1rFWGZ$m?eN@~q;^4N$qF$QG7MQgUF*^Y~VwY{K=H z2`%6e!6qEccSp$He)jYwc{ISu8*`ORdeIbG2Gt{Y{y(j4Gx`LlXcBz|^6EsM@SWozU_#Q#M$A=MDQAX(G z<)kXD)XuA1RdGu_>chtl2~M%>CXN*Ehgj>bC)U+R9*Asi@S)0Lsl=W~7fz3Er5=S} zDnL!;sk-?q@ts2HLAg4)obDlzD#mF&)qC_fzyPd$v=REHN2#G7XmysOyA6unVpTP1 zr9mI(O)ThuyQfVne={NH0HJo6Qg%I)^LFU_uq@aRj?tM<<^8Wi@2_Q_C%Cd=AQQ|e mfdl9TOC)V{&zIfGX6N0&_EU#^W|MGl&LObRaZz8I2mb?oRLbxG literal 0 HcmV?d00001 diff --git a/docs/.doctrees/ladybug_display.dictutil.doctree b/docs/.doctrees/ladybug_display.dictutil.doctree new file mode 100644 index 0000000000000000000000000000000000000000..ba9ec20e3183b693e8191cafd0c4a58ba12fbae9 GIT binary patch literal 8466 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 literal 0 HcmV?d00001 diff --git a/docs/.doctrees/ladybug_display.extension.adaptivechart.doctree b/docs/.doctrees/ladybug_display.extension.adaptivechart.doctree new file mode 100644 index 0000000000000000000000000000000000000000..f64ee099ea16ed97d7d8ddd0d5fc52b1d1eeb0d7 GIT binary patch literal 17509 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 literal 0 HcmV?d00001 diff --git a/docs/.doctrees/ladybug_display.extension.hourlyplot.doctree b/docs/.doctrees/ladybug_display.extension.hourlyplot.doctree new file mode 100644 index 0000000000000000000000000000000000000000..3c3bd9266d26ef67f5928b6baea0019bde4c4a9e GIT binary patch literal 14541 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 ALI3~& literal 0 HcmV?d00001 diff --git a/docs/.doctrees/ladybug_display.extension.psychchart.doctree b/docs/.doctrees/ladybug_display.extension.psychchart.doctree new file mode 100644 index 0000000000000000000000000000000000000000..efd71c8f0670dce9e0a9fbab540c81a77b15f160 GIT binary patch literal 21380 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 RySh$JKK6$+_Xt~?{|CiR5q|&x literal 0 HcmV?d00001 diff --git a/docs/.doctrees/ladybug_display.extension.raddome.doctree b/docs/.doctrees/ladybug_display.extension.raddome.doctree new file mode 100644 index 0000000000000000000000000000000000000000..b433b8e914e8a34256e3c5da8202d94d9e3a0a32 GIT binary patch literal 13058 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 literal 0 HcmV?d00001 diff --git a/docs/.doctrees/ladybug_display.extension.skydome.doctree b/docs/.doctrees/ladybug_display.extension.skydome.doctree new file mode 100644 index 0000000000000000000000000000000000000000..1e8912570407f28207d7dd25f85d690f598d6866 GIT binary patch literal 11932 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 Bh0Fi| literal 0 HcmV?d00001 diff --git a/docs/.doctrees/ladybug_display.extension.study.radiation.doctree b/docs/.doctrees/ladybug_display.extension.study.radiation.doctree new file mode 100644 index 0000000000000000000000000000000000000000..fcb874318131097f09d7aaee6a242e0d81f27075 GIT binary patch literal 15290 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 Kq}@l)j-( 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 Br@#OJ literal 0 HcmV?d00001 diff --git a/docs/.doctrees/ladybug_display.geometry2d.mesh.doctree b/docs/.doctrees/ladybug_display.geometry2d.mesh.doctree new file mode 100644 index 0000000000000000000000000000000000000000..609f6a0b797df410dbc4abead12945aee9622fdb GIT binary patch literal 52211 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 literal 0 HcmV?d00001 diff --git a/docs/.doctrees/ladybug_display.geometry2d.polygon.doctree b/docs/.doctrees/ladybug_display.geometry2d.polygon.doctree new file mode 100644 index 0000000000000000000000000000000000000000..f6f3d9bbcafd1f2cea3be88cfa688cacb61ccce6 GIT binary patch literal 60587 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 F{~x!~M4SKs literal 0 HcmV?d00001 diff --git a/docs/.doctrees/ladybug_display.geometry2d.polyline.doctree b/docs/.doctrees/ladybug_display.geometry2d.polyline.doctree new file mode 100644 index 0000000000000000000000000000000000000000..8272692611c1a0573fda26e9cd8357c44320a83f GIT binary patch literal 57091 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 C4CAf< literal 0 HcmV?d00001 diff --git a/docs/.doctrees/ladybug_display.geometry2d.ray.doctree b/docs/.doctrees/ladybug_display.geometry2d.ray.doctree new file mode 100644 index 0000000000000000000000000000000000000000..fc544268a71b87f309cbb0ee071282e995523edf GIT binary patch literal 38781 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%0AE=M(Oy~hT`+`>m*WjxDVjp* zGtCBQ+z$5QY7F^F95@f{3Ch*_9CSbf!^H#@QFGSHS6v|Gh1)1c<0gSh&>4IaQo#^j z0tvq7#c1SG9JAn_DR~QSwN`@vA9?~Xp5QyFX1J(O*4mteHQaA0YY^2(D813EFSam$ z@y!xmFrJ~BxD8XBQeKMPaNYx4L6LTXNT^y2ltrC5)--B8+~OB!QtR#lM1y41HfMee z(~zo&^btyw&#X+d*hBay;-i#I?lxr-FOEn4)epBO#e2+Qhj118up}md^C4J=Fz}N* zR}TqGE^Q9;p=yMgsr3Y=6!ulLC$?$Jz*qqd<@X7P9kaXE!bN|r))!a zF@2A`T%J$@U3wTh`%Vx{x;Q7V1oe$D@MMDq!86HQOtKg&TdMVPty!V5I#0u7tU{BF K!eiOP)Bg+Sx?Fbv literal 0 HcmV?d00001 diff --git a/docs/.doctrees/ladybug_display.geometry2d.vector.doctree b/docs/.doctrees/ladybug_display.geometry2d.vector.doctree new file mode 100644 index 0000000000000000000000000000000000000000..f247f3e8c5bde9b1fa45e133215edaa08416bd72 GIT binary patch literal 39652 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 literal 0 HcmV?d00001 diff --git a/docs/.doctrees/ladybug_display.geometry3d.arc.doctree b/docs/.doctrees/ladybug_display.geometry3d.arc.doctree new file mode 100644 index 0000000000000000000000000000000000000000..de4dd79751ba12c9aa3ebdf03ac6272f932ebdf1 GIT binary patch literal 58004 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 literal 0 HcmV?d00001 diff --git a/docs/.doctrees/ladybug_display.geometry3d.cone.doctree b/docs/.doctrees/ladybug_display.geometry3d.cone.doctree new file mode 100644 index 0000000000000000000000000000000000000000..2b27cb4f1bac2ca9324edb3eb1050310c0e9a551 GIT binary patch literal 50911 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

_pk-mty@;{a~q<^rJrCh}xks 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 Pv`RHHOcKL|PAvRC_>1}b literal 0 HcmV?d00001 diff --git a/docs/.doctrees/ladybug_display.geometry3d.cylinder.doctree b/docs/.doctrees/ladybug_display.geometry3d.cylinder.doctree new file mode 100644 index 0000000000000000000000000000000000000000..fb80ffde85ff03d2673379a355498f2bb737f274 GIT binary patch literal 52175 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 P#7Z>+DDBIYPAvX^1&|kF literal 0 HcmV?d00001 diff --git a/docs/.doctrees/ladybug_display.geometry3d.doctree b/docs/.doctrees/ladybug_display.geometry3d.doctree new file mode 100644 index 0000000000000000000000000000000000000000..e2aa1a56e4dab2235638593e06999dc3711f6171 GIT binary patch literal 4634 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¬i?w6{<-W%efglLdNO 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 Mf-Py`g~rVMKO&VP@&Et; literal 0 HcmV?d00001 diff --git a/docs/.doctrees/ladybug_display.geometry3d.line.doctree b/docs/.doctrees/ladybug_display.geometry3d.line.doctree new file mode 100644 index 0000000000000000000000000000000000000000..9f2e750ae59a5471d17e1a8f39abaaec5c4b6d3d GIT binary patch literal 54103 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 KX~Tt1%>I88Hi{1b literal 0 HcmV?d00001 diff --git a/docs/.doctrees/ladybug_display.geometry3d.mesh.doctree b/docs/.doctrees/ladybug_display.geometry3d.mesh.doctree new file mode 100644 index 0000000000000000000000000000000000000000..b3df441f6ff7c703191934d5d25b375f10ade65f GIT binary patch literal 58753 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 literal 0 HcmV?d00001 diff --git a/docs/.doctrees/ladybug_display.geometry3d.plane.doctree b/docs/.doctrees/ladybug_display.geometry3d.plane.doctree new file mode 100644 index 0000000000000000000000000000000000000000..8d4da9dadef5f08d367e2b5e5950201fc3c06c7a GIT binary patch literal 51209 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 P%{0k0NfZ}4vGD%@gBg6q literal 0 HcmV?d00001 diff --git a/docs/.doctrees/ladybug_display.geometry3d.point.doctree b/docs/.doctrees/ladybug_display.geometry3d.point.doctree new file mode 100644 index 0000000000000000000000000000000000000000..628cc23ecde4ac3e634c249f93070608e5e394b7 GIT binary patch literal 47050 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 literal 0 HcmV?d00001 diff --git a/docs/.doctrees/ladybug_display.geometry3d.ray.doctree b/docs/.doctrees/ladybug_display.geometry3d.ray.doctree new file mode 100644 index 0000000000000000000000000000000000000000..d8dda608bebcf14e1c6f32a56fb8be00c6609c27 GIT binary patch literal 41600 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 DvXd`i literal 0 HcmV?d00001 diff --git a/docs/.doctrees/ladybug_display.geometry3d.sphere.doctree b/docs/.doctrees/ladybug_display.geometry3d.sphere.doctree new file mode 100644 index 0000000000000000000000000000000000000000..c56430aaa859a33b22add3d3ae8e358f6e0ef885 GIT binary patch literal 55209 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 literal 0 HcmV?d00001 diff --git a/docs/.doctrees/ladybug_display.geometry3d.text.doctree b/docs/.doctrees/ladybug_display.geometry3d.text.doctree new file mode 100644 index 0000000000000000000000000000000000000000..532cd74800b0a29a4c60638cc88ff6f3f902b02a GIT binary patch literal 60854 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 literal 0 HcmV?d00001 diff --git a/docs/.doctrees/ladybug_display.geometry3d.vector.doctree b/docs/.doctrees/ladybug_display.geometry3d.vector.doctree new file mode 100644 index 0000000000000000000000000000000000000000..bb268ac6c088fd9f9e044c5e37ea4ef935873d34 GIT binary patch literal 45733 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 literal 0 HcmV?d00001 diff --git a/docs/.doctrees/modules.doctree b/docs/.doctrees/modules.doctree new file mode 100644 index 0000000000000000000000000000000000000000..90742cb7448cbdc9b324deb4d325095e56ce5df6 GIT binary patch literal 2753 zcmZWrO>Y}F5KV0B(~|s=rYMlOMNy*T>z}T5=35EDnb=^Jd-*`PbgR{|)a{f8oFtLh9uiWlS5!T?~C@ zvNGq|#}D!8-|=mH5(buDIaAt<$8ZN4nUIQEuH)+%CQ02(<<6S(J;yUIjc$*Nj_8Ws z>-ab;e-(gSD0wJVuR7j32Q z^PO@A{Qb=2g()@LNLHOkaR>fQ<}Ke$WV81LaEULG!LRT=!uJ^8Q+y9Xuki!CNST!t z%8QTl`%k1{Bz2}r#^(}&0kZg!hJH?$j2B+S^F5@D7FCsz;Ds`?cpbVzG6qsyhjDYd z74&tP&$#6*p5F<>iUZDQwSw*t+`0*;6yJ#N#EE!@JnSL0QF+jqu$tv1*4#~ zr+Iw#&~T!-`G6A8^)=hQ9rVr8=FT+ zCJyW=2nd?SgoDWkwS+5PNywG-f~=bg9-9MAmtBOB<%O}HDE@}4c)k;cf~t1e2}gV> zktDEe}&|w^d0`4YP)N14k8kW->l7Y80;|WxJA0|>4r6*ixhCwTaLFwnG&rhAi z?}yu)gj;JY5mYk;GNEw5mU)aFQ~GTyoytlKC%1NPnGk=5Np18dfX?qPemQ*(=i3{% zPKLt-z#&Tl`B4BA!&p(hDCvSD-3;p;G+4N2d1fpl=thtOZc;B_gl=Z^92k)f$w+}| zC6`fj!-SUJkQ-6hkzmxAm3cv0)*-8vK!R{qQ&W3|Z!hPltS2 z7{|%x$%-PGCvT*aH9rqhThWuwOw!U$j-_)nXmGH%q!dIE(>!3zRR7$Z8X z@Q#vXM&UXUJA5X*FWe8)Da7uqSb1UenX!v$4EK{}vXnH5=Q*Gr)^xaV!6=(;&KzAvbOCNtdd>jtlN_)B_LN0{D2lDPI zlXyRJIYpQKQKG3G4Bo5O^^z!)(R#RtlT1(mLgDLXLn$j)IDJ_bh%sIA)zof=07g6{ zQqRGG^;9@cbHbIgTY552i)z038Rbjyc+JzLPspr+JJqFFrg)Gjz?6>j(=1PQ8n zyjqZM+;QnK5RSK`^}P=LJxiI*-6lEAMDB>HU>uP&VU68~R{ zkqhI^>Q|@7nFNQDdswU`sYlm(b(ouyS`Wda*!j$;mQa=IC%1&H_F&86VC}U!bi8FB zv)1}F-0$DE)$HKj#stamA^}Ze*w2hoNGvem3hDja$Ugx5yZ9U02@f+gCZ19b^{*Ya ggJes*--@e}?Kf`+P-c;;HDqblHDe*&zvb-ge=yof>i_@% literal 0 HcmV?d00001 diff --git a/docs/.nojekyll b/docs/.nojekyll new file mode 100644 index 0000000..e69de29 diff --git a/docs/README.md b/docs/README.md new file mode 100644 index 0000000..ebfb366 --- /dev/null +++ b/docs/README.md @@ -0,0 +1 @@ +# documentation diff --git a/docs/_modules/index.html b/docs/_modules/index.html new file mode 100644 index 0000000..d280747 --- /dev/null +++ b/docs/_modules/index.html @@ -0,0 +1,961 @@ + + + + + + + Overview: module code — ladybug-display documentation + + + + + + + + + + + + + + + + + + + + + + +

+ + +
+
+

+ Back to top + +

+

+ © Copyright 2024, Ladybug Tools.
+ Created using Sphinx 5.3.0.
+

+
+
+ + \ No newline at end of file diff --git a/docs/_modules/ladybug_display/altnumber.html b/docs/_modules/ladybug_display/altnumber.html new file mode 100644 index 0000000..96a6a57 --- /dev/null +++ b/docs/_modules/ladybug_display/altnumber.html @@ -0,0 +1,959 @@ + + + + + + + ladybug_display.altnumber — ladybug-display documentation + + + + + + + + + + + + + + + + + + + + + + + + +
+
+ +
+ +

Source code for ladybug_display.altnumber

+"""Objects used as alternatives to various numerical properties."""
+
+
+class _AltNumber(object):
+    __slots__ = ()
+
+    def __init__(self):
+        pass
+
+    @property
+    def name(self):
+        return self.__class__.__name__
+
+    def to_dict(self):
+        """Get the object as a dictionary."""
+        return {'type': self.name}
+
+    def ToString(self):
+        return self.__repr__()
+
+    def __eq__(self, other):
+        return self.__class__ == other.__class__
+
+    def __ne__(self, other):
+        return not self.__eq__(other)
+
+    def __repr__(self):
+        return self.name
+
+
+
[docs]class Default(_AltNumber): + """Object to signify when the default value of a visual interface should be used.""" + __slots__ = () + pass
+ + +default = Default() +
+ +
+ +
+
+
+
+

+ Back to top + +

+

+ © Copyright 2024, Ladybug Tools.
+ Created using Sphinx 5.3.0.
+

+
+
+ + \ No newline at end of file diff --git a/docs/_modules/ladybug_display/dictutil.html b/docs/_modules/ladybug_display/dictutil.html new file mode 100644 index 0000000..ba21ab5 --- /dev/null +++ b/docs/_modules/ladybug_display/dictutil.html @@ -0,0 +1,986 @@ + + + + + + + ladybug_display.dictutil — ladybug-display documentation + + + + + + + + + + + + + + + + + + + + + + + + +
+
+ +
+ +

Source code for ladybug_display.dictutil

+# coding=utf-8
+"""Utilities to convert any Ladybug Display dictionary to Python objects."""
+
+from ladybug_display.geometry2d import DisplayVector2D, DisplayPoint2D, \
+    DisplayRay2D, DisplayLineSegment2D, DisplayPolyline2D, DisplayArc2D, \
+    DisplayPolygon2D, DisplayMesh2D
+from ladybug_display.geometry3d import DisplayVector3D, DisplayPoint3D, \
+    DisplayRay3D, DisplayPlane, DisplayLineSegment3D, DisplayPolyline3D, DisplayArc3D, \
+    DisplayFace3D, DisplayMesh3D, DisplayPolyface3D, DisplaySphere, DisplayCone, \
+    DisplayCylinder, DisplayText3D
+
+
+
[docs]def dict_to_object(display_dict, raise_exception=True): + """ + Args: + display_dict (dict): A dictionary of any Ladybug Display geometry object. + raise_exception (bool): Boolean to note whether an exception should be + raised if the object is not identified as a part of + ladybug_display. (Default: True). + + Returns: + A Python object derived from the input display_dict. + """ + lbt_types = { + 'DisplayVector2D': DisplayVector2D, + 'DisplayPoint2D': DisplayPoint2D, + 'DisplayRay2D': DisplayRay2D, + 'DisplayLineSegment2D': DisplayLineSegment2D, + 'DisplayArc2D': DisplayArc2D, + 'DisplayPolyline2D': DisplayPolyline2D, + 'DisplayPolygon2D': DisplayPolygon2D, + 'DisplayMesh2D': DisplayMesh2D, + 'DisplayVector3D': DisplayVector3D, + 'DisplayPoint3D': DisplayPoint3D, + 'DisplayRay3D': DisplayRay3D, + 'DisplayLineSegment3D': DisplayLineSegment3D, + 'DisplayArc3D': DisplayArc3D, + 'DisplayPolyline3D': DisplayPolyline3D, + 'DisplayMesh3D': DisplayMesh3D, + 'DisplayPlane': DisplayPlane, + 'DisplayPolyface3D': DisplayPolyface3D, + 'DisplayFace3D': DisplayFace3D, + 'DisplaySphere': DisplaySphere, + 'DisplayCone': DisplayCone, + 'DisplayCylinder': DisplayCylinder, + 'DisplayText3D': DisplayText3D + } + + # Get the ladybug_geometry object 'Type' + try: + obj_type = display_dict['type'] + except KeyError: + raise ValueError('Ladybug dictionary lacks required "type" key.') + + # Build a new Ladybug Python Object based on the "Type" + try: + lbt_class = lbt_types[obj_type] + return lbt_class.from_dict(display_dict) + except KeyError: + if raise_exception: + raise ValueError( + '{} is not a recognized ladybug display type'.format(obj_type)) + else: + return None
+
+ +
+ +
+
+
+
+

+ Back to top + +

+

+ © Copyright 2024, Ladybug Tools.
+ Created using Sphinx 5.3.0.
+

+
+
+ + \ No newline at end of file diff --git a/docs/_modules/ladybug_display/extension/adaptivechart.html b/docs/_modules/ladybug_display/extension/adaptivechart.html new file mode 100644 index 0000000..f9b70c9 --- /dev/null +++ b/docs/_modules/ladybug_display/extension/adaptivechart.html @@ -0,0 +1,1115 @@ + + + + + + + ladybug_display.extension.adaptivechart — ladybug-display documentation + + + + + + + + + + + + + + + + + + + + + + + + +
+
+ +
+ +

Source code for ladybug_display.extension.adaptivechart

+"""Method to draw an AdaptiveChart as a VisualizationSet."""
+from ladybug_geometry.geometry2d import Polyline2D
+from ladybug_geometry.geometry3d import Vector3D, Point3D, Plane, LineSegment3D, \
+    Polyline3D, Mesh3D
+from ladybug.datatype.time import Time
+from ladybug.legend import LegendParameters
+
+from ladybug_display.geometry3d import DisplayLineSegment3D, DisplayPolyline3D, \
+    DisplayText3D
+from ladybug_display.visualization import VisualizationSet, AnalysisGeometry, \
+    VisualizationData, ContextGeometry
+
+
+
[docs]def adaptive_chart_to_vis_set( + adaptive_chart, data=None, legend_parameters=None, z=0): + """Get a Ladybug AdaptiveChart represented as a VisualizationSet. + + Args: + adaptive_chart: A Ladybug AdaptiveChart object. + data: An optional list of data collection objects, which are aligned with + the prevailing and operative temperature values of the chart. and will + generate additional colored AnalysisGeometries on the chart. + legend_parameters: An optional LegendParameter object or list of LegendParameter + objects to customize the display of the data on the adaptive + chart. Note that this relates only to the data supplied as input + for this method and, to customize the display of the time/frequency + mesh, the AdaptiveChart's native legend_parameters should be + edited. If a list is used here, this should align with the input data + (one legend parameter per data collection). + z: A number for the Z-coordinate to be used in translation. (Default: 0). + + Returns: + A VisualizationSet with the adaptive chart represented several + ContextGeometries and an AnalysisGeometry. This includes these objects + in the following order. + + - Title -- A ContextGeometry for the title and border around the + adaptive chart. + + - Prevailing_Axis -- A ContextGeometry with lines and text for the + Prevailing Outdoor Temperature (X) axis of the adaptive chart. + + - Operative_Axis -- A ContextGeometry with lines and text for the + Indoor Operative Temperature (Y) axis of the adaptive chart. + + - Comfort_Polygon -- A ContextGeometry with lines for the comfort polygon + and neutral temperature of the adaptive chart. + + - Analysis_Data -- An AnalysisGeometry for the data on the adaptive + chart. This will include multiple data sets if the data input + is provided. + """ + # establish the VisualizationSet object + vis_set = VisualizationSet('Adaptive_Chart', ()) + vis_set.display_name = 'Adaptive Chart' + + # get values used throughout the translation + txt_hgt = adaptive_chart.legend_parameters.text_height + font = adaptive_chart.legend_parameters.font + bp = Plane(o=Point3D(0, 0, z)) + + # add the title and border + meta_i = adaptive_chart.operative_temperature.header.metadata.items() + title_items = ['Adaptive Chart', 'Time [hr]'] + \ + ['{}: {}'.format(k, v) for k, v in meta_i] + ttl_pl = adaptive_chart.container.lower_title_location.move( + Vector3D(0, -txt_hgt * 3)) + if z != 0: + ttl_pl = Plane(n=ttl_pl.n, o=Point3D(ttl_pl.o.x, ttl_pl.o.y, z), x=ttl_pl.x) + ttl_txt = DisplayText3D( + '\n'.join(title_items), ttl_pl, txt_hgt * 1.5, None, font, 'Left', 'Top') + border_geo = Polyline3D.from_polyline2d( + Polyline2D.from_polygon(adaptive_chart.chart_border), bp) + title_objs = [ttl_txt, DisplayPolyline3D(border_geo, line_width=2)] + title = ContextGeometry('Title', title_objs) + vis_set.add_geometry(title) + + # add the prevailing temperature axis + tm_pl = _plane_from_point(adaptive_chart.x_axis_location, z) + temp_txt = DisplayText3D( + adaptive_chart.x_axis_text, tm_pl, txt_hgt * 1.5, None, font, 'Center', 'Top') + temp_geo = [temp_txt] + for tl in adaptive_chart.prevailing_lines: + tl_geo = LineSegment3D.from_line_segment2d(tl, z) + temp_geo.append(DisplayLineSegment3D(tl_geo, line_type='Dotted')) + tl_pts = adaptive_chart.prevailing_label_points + for txt, pt in zip(adaptive_chart.prevailing_labels, tl_pts): + t_pln = Plane(o=Point3D(pt.x, pt.y, z)) + txt_obj = DisplayText3D(txt, t_pln, txt_hgt, None, font, 'Center', 'Top') + temp_geo.append(txt_obj) + temp_axis = ContextGeometry('Prevailing_Axis', temp_geo) + temp_axis.display_name = 'Prevailing Axis' + vis_set.add_geometry(temp_axis) + + # add the operative temperature axis + op_pl = _plane_from_point(adaptive_chart.y_axis_location, z, Vector3D(0, 1)) + op_txt = DisplayText3D( + adaptive_chart.y_axis_text, op_pl, txt_hgt * 1.5, None, font, 'Center', 'Top') + op_geo = [op_txt] + for hl in adaptive_chart.operative_lines: + hl_geo = LineSegment3D.from_line_segment2d(hl, z) + op_geo.append(DisplayLineSegment3D(hl_geo, line_type='Dotted')) + op_pts = adaptive_chart.operative_label_points + for txt, pt in zip(adaptive_chart.operative_labels, op_pts): + t_pln = Plane(o=Point3D(pt.x, pt.y, z)) + txt_obj = DisplayText3D(txt, t_pln, txt_hgt, None, font, 'Left', 'Middle') + op_geo.append(txt_obj) + op_axis = ContextGeometry('Operative_Axis', op_geo) + op_axis.display_name = 'Operative Axis' + vis_set.add_geometry(op_axis) + + # add the comfort polygon + poly_geo = [] + neutral_geo = Polyline3D.from_polyline2d( + Polyline2D.from_polygon(adaptive_chart.comfort_polygon), bp) + poly_geo.append(DisplayPolyline3D(neutral_geo, line_width=3)) + neutral_geo = Polyline3D.from_polyline2d(adaptive_chart.neutral_polyline, bp) + poly_geo.append(DisplayPolyline3D(neutral_geo, line_width=1)) + comf_poly = ContextGeometry('Comfort_Polygon', poly_geo) + comf_poly.display_name = 'Comfort Polygon' + vis_set.add_geometry(comf_poly) + + # add the analysis geometry + # ensure 3D legend defaults are overridden to make the data readable + l_par = adaptive_chart.legend.legend_parameters.duplicate() + l_par.base_plane = l_par.base_plane + l_par.segment_height = l_par.segment_height + l_par.segment_width = l_par.segment_width + # gather all of the visualization data sets + vis_data = [VisualizationData(adaptive_chart.hour_values, l_par, Time(), 'hr')] + if data is not None and len(data) != 0: + if legend_parameters is None: + l_pars = [LegendParameters()] * len(data) + elif isinstance(legend_parameters, LegendParameters): + l_pars = [legend_parameters] * len(data) + else: # assume it's a list that aligns with the data + l_pars = legend_parameters + for dat, lp in zip(data, l_pars): + # process the legend parameters + lp = lp.duplicate() + if lp.is_base_plane_default: + lp.base_plane = l_par.base_plane + if lp.is_segment_height_default: + lp.segment_height = l_par.segment_height + if lp.is_segment_width_default: + lp.segment_width = l_par.segment_width + # check to be sure the data collection aligns + d_vals = dat.values + _tp_values = adaptive_chart.prevailing_outdoor_temperature.values + _to_values = adaptive_chart.operative_temperature.values + # create a matrix with a tally of the hours for all the data + base_mtx = [[[] for val in adaptive_chart._tp_category] + for rh in adaptive_chart._to_category] + for tp, to, val in zip(_tp_values, _to_values, d_vals): + if tp < adaptive_chart._min_prevailing or \ + tp > adaptive_chart._max_prevailing: + continue # temperature value does not currently fit on the chart + if to < adaptive_chart._min_operative or \ + to > adaptive_chart._max_operative: + continue # temperature value does not currently fit on the chart + for y, to_cat in enumerate(adaptive_chart._to_category): + if to < to_cat: + break + for x, tp_cat in enumerate(adaptive_chart._tp_category): + if tp < tp_cat: + break + base_mtx[y][x].append(val) + # compute average values + avg_values = [sum(val_list) / len(val_list) for rh_l in base_mtx + for val_list in rh_l if len(val_list) != 0] + hd = dat.header + vd = VisualizationData(avg_values, lp, hd.data_type, hd.unit) + vis_data.append(vd) + # create the analysis geometry + mesh_3d = Mesh3D.from_mesh2d(adaptive_chart.colored_mesh, bp) + mesh_geo = AnalysisGeometry( + 'Analysis_Data', [mesh_3d], vis_data, active_data=len(vis_data) - 1) + mesh_geo.display_name = 'Analysis Data' + mesh_geo.display_mode = 'Surface' + vis_set.add_geometry(mesh_geo) + + return vis_set
+ + +def _plane_from_point(point_2d, z, align_vec=Vector3D(1, 0, 0)): + """Get a Plane from a Point2D. + + Args: + point_2d: A Point2D to serve as the origin of the plane. + z: The Z value for the plane origin. + align_vec: A Vector3D to serve as the X-Axis of the plane. + """ + return Plane(o=Point3D(point_2d.x, point_2d.y, z), x=align_vec) +
+ +
+ +
+
+
+
+

+ Back to top + +

+

+ © Copyright 2024, Ladybug Tools.
+ Created using Sphinx 5.3.0.
+

+
+
+ + \ No newline at end of file diff --git a/docs/_modules/ladybug_display/extension/compass.html b/docs/_modules/ladybug_display/extension/compass.html new file mode 100644 index 0000000..a75c0ce --- /dev/null +++ b/docs/_modules/ladybug_display/extension/compass.html @@ -0,0 +1,1042 @@ + + + + + + + ladybug_display.extension.compass — ladybug-display documentation + + + + + + + + + + + + + + + + + + + + + + + + +
+
+ +
+ +

Source code for ladybug_display.extension.compass

+"""Method to draw a Compass as a VisualizationSet."""
+import math
+
+from ladybug_geometry.geometry3d import Vector3D, Point3D, Plane, LineSegment3D, Arc3D
+
+from ..geometry3d import DisplayText3D, DisplayArc3D, DisplayLineSegment3D
+from ..visualization import VisualizationSet, ContextGeometry
+
+
+
[docs]def compass_to_vis_set(compass, z=0, custom_angles=None, projection=None, font='Arial', + maj_txt_size=None, min_txt_size=None): + """Translate a Ladybug Compass object into Display geometry. + + Args: + compass: A Ladybug Compass object to be converted to display geometry. + z: A number for the Z-coordinate to be used in translation. (Default: 0) + custom_angles: An array of numbers between 0 and 360 to be used to + generate custom angle labels around the compass. + projection: Text for the name of the projection to use from the sky + dome hemisphere to the 2D plane. If None, no altitude circles o + labels will be drawn (Default: None). Choose from the following: + + * Orthographic + * Stereographic + + font: Optional text for the font to be used in creating the text. + (Default: 'Arial') + maj_txt_size: An optional number for the size of the major text. If None, + it will be set to one 20th of the radius. + min_txt_size: An optional number for the size of the major text. Set to + zero to have no minor text in the compass. If None, it will be set + to half of the major text size. + + Returns: + A VisualizationSet with the Compass represented as a single ContextGeometry. + This context geometry includes these objects in the following order. + + - all_boundary_circles -- Three Circle objects for the compass boundary. + + - major_azimuth_ticks -- Line objects for the major azimuth labels. + + - major_azimuth_text -- Text objects for the major azimuth labels. + + - minor_azimuth_ticks -- Line objects for the minor azimuth labels + (if applicable). + + - minor_azimuth_text -- Text objects for the minor azimuth + labels (if applicable). + + - altitude_circles -- Circle objects for altitude labels (if projection + is not None). + + - altitude_text -- Text objects for altitude labels (if projection + is not None). + + """ + # set default variables based on the compass properties + maj_txt = compass.radius / 20 if maj_txt_size is None else maj_txt_size + min_txt = maj_txt / 2 if min_txt_size is None else min_txt_size + xaxis = Vector3D(1, 0, 0).rotate_xy(math.radians(compass.north_angle)) + + result = [] # list to hold all of the returned objects + for i, circle in enumerate(compass.all_boundary_circles): + lw = 2 if i == 0 else 1 + result.append(DisplayArc3D(Arc3D.from_arc2d(circle, z), line_width=lw)) + + # create a method that translates LineSegment2D into DisplayLineSegment3D + def from_linesegment2d(line, z, line_width=1): + pt_array = ((line.p1.x, line.p1.y, z), (line.p2.x, line.p2.y, z)) + ls_3d = LineSegment3D.from_array(pt_array) + return DisplayLineSegment3D(ls_3d, line_width=line_width) + + # generate the labels and tick marks for the azimuths + if custom_angles is None: + for line in compass.major_azimuth_ticks: + result.append(from_linesegment2d(line, z, 2)) + for txt, pt in zip(compass.MAJOR_TEXT, compass.major_azimuth_points): + txt_pln = Plane(o=Point3D(pt.x, pt.y, z), x=xaxis) + result.append( + DisplayText3D(txt, txt_pln, maj_txt, None, font, 'Center', 'Middle')) + if min_txt > 0: + for line in compass.minor_azimuth_ticks: + result.append(from_linesegment2d(line, z)) + for txt, pt in zip(compass.MINOR_TEXT, compass.minor_azimuth_points): + txt_pln = Plane(o=Point3D(pt.x, pt.y, z), x=xaxis) + result.append( + DisplayText3D(txt, txt_pln, min_txt, None, font, 'Center', 'Middle')) + else: + for line in compass.ticks_from_angles(custom_angles): + result.append(from_linesegment2d(line, z)) + for txt, pt in zip( + custom_angles, compass.label_points_from_angles(custom_angles)): + t_pln = Plane(o=Point3D(pt.x, pt.y, z), x=xaxis) + d_t = DisplayText3D(str(txt), t_pln, maj_txt, None, font, 'Center', 'Middle') + result.append(d_t) + + # generate the labels and tick marks for the altitudes + if projection is not None: + if projection.title() == 'Orthographic': + for circle in compass.orthographic_altitude_circles: + arc_geo = Arc3D.from_arc2d(circle, z) + result.append(DisplayArc3D(arc_geo, line_width=1, line_type='Dotted')) + for txt, pt in zip(compass.ALTITUDES, compass.orthographic_altitude_points): + txt_pln = Plane(o=Point3D(pt.x, pt.y, z + 0.01), x=xaxis) + d_txt = DisplayText3D( + str(txt), txt_pln, min_txt, None, font, 'Center', 'Top') + result.append(d_txt) + elif projection.title() == 'Stereographic': + for circle in compass.stereographic_altitude_circles: + arc_geo = Arc3D.from_arc2d(circle, z) + result.append(DisplayArc3D(arc_geo, line_width=1, line_type='Dotted')) + for txt, pt in zip(compass.ALTITUDES, compass.stereographic_altitude_points): + txt_pln = Plane(o=Point3D(pt.x, pt.y, z + 0.01), x=xaxis) + d_txt = DisplayText3D( + str(txt), txt_pln, min_txt, None, font, 'Center', 'Top') + result.append(d_txt) + + # assemble everything into a ContextGeometry and VisualizationSet + con_geo = ContextGeometry('Compass', result) + return VisualizationSet('Compass', [con_geo])
+
+ +
+ +
+
+
+
+

+ Back to top + +

+

+ © Copyright 2024, Ladybug Tools.
+ Created using Sphinx 5.3.0.
+

+
+
+ + \ No newline at end of file diff --git a/docs/_modules/ladybug_display/extension/hourlyplot.html b/docs/_modules/ladybug_display/extension/hourlyplot.html new file mode 100644 index 0000000..a8b0f15 --- /dev/null +++ b/docs/_modules/ladybug_display/extension/hourlyplot.html @@ -0,0 +1,1022 @@ + + + + + + + ladybug_display.extension.hourlyplot — ladybug-display documentation + + + + + + + + + + + + + + + + + + + + + + + + +
+
+ +
+ +

Source code for ladybug_display.extension.hourlyplot

+"""Method to draw an HourlyPlot as a VisualizationSet."""
+from ladybug_geometry.geometry3d import Plane
+
+from ladybug_display.geometry3d import DisplayLineSegment3D, DisplayPolyline3D, \
+    DisplayText3D
+from ladybug_display.visualization import VisualizationSet, AnalysisGeometry, \
+    VisualizationData, ContextGeometry
+
+
+
[docs]def hourly_plot_to_vis_set( + hourly_plot, z=0, custom_hours=(0, 3, 6, 9, 12, 15, 18, 21, 24), + include_title=True): + """Get a Ladybug HourlyPlot represented as a VisualizationSet. + + Args: + hourly_plot: A Ladybug HourlyPlot object. + z: A number for the Z-coordinate to be used in translation. (Default: 0). + custom_hours: A tuple of integers from 0 to 24 to indicate which hours + of the day should appear in the Hour_Axis of the visualization. + The default is (0, 3, 6, 9, 12, 15, 18, 21, 24). + include_title: Boolean to note whether the title should be included + in the output visualization. (Default: True). + + Returns: + A VisualizationSet with the hourly plot represented several ContextGeometries + (and an AnalysisGeometry). This includes these objects in the following order. + + - Hour_Axis -- A ContextGeometry with lines and text for the hour-of-the-day + axis of the hourly plot. + + - Month_Axis -- A ContextGeometry with lines and text for the month-of-the-year + axis of the hourly plot. + + - Title -- A ContextGeometry with text for the title of the hourly plot. + This layer will be excluded if include_title is False. + + - Analysis_Data -- An AnalysisGeometry for the data on the hourly plot. + """ + # establish the VisualizationSet object + data_header = hourly_plot.data_collection.header + data_type, unit = data_header.data_type, data_header.unit + set_id = 'Hourly_Plot_{}'.format(data_type.name.replace(' ', '_')) + vis_set = VisualizationSet(set_id, ()) + + # get global variables used in other places + chart_border = DisplayPolyline3D(hourly_plot.chart_border3d, line_width=2) + txt_h = hourly_plot.legend_parameters.text_height + font = hourly_plot.legend_parameters.font + major_hr = hourly_plot.HOUR_LABELS + + # add the hour axis + dis_hour, dis_hour_text = [], [] + h_lines = hourly_plot.custom_hour_lines3d(custom_hours) + h_pts = hourly_plot.custom_hour_label_points3d(custom_hours) + h_text = hourly_plot.custom_hour_labels(custom_hours) + for hr, lin, pt, txt in zip(custom_hours, h_lines, h_pts, h_text): + if hr in major_hr: + lt, t_sz = 'Continuous', txt_h + else: + lt, t_sz = 'Dotted', txt_h * 0.8 + dis_hour.append(DisplayLineSegment3D(lin, line_width=1, line_type=lt)) + d_txt = DisplayText3D(txt, Plane(o=pt), t_sz, None, font, 'Right', 'Middle') + dis_hour_text.append(d_txt) + hour_axis = ContextGeometry('Hour_Axis', [chart_border] + dis_hour + dis_hour_text) + hour_axis.display_name = 'Hour Axis' + vis_set.add_geometry(hour_axis) + + # add the month axis + dis_month, dis_month_text = [], [] + m_lines = hourly_plot.month_lines3d + m_pts = hourly_plot.month_label_points3d + m_text = hourly_plot.month_labels + for lin in m_lines: + dis_month.append(DisplayLineSegment3D(lin, line_width=1)) + for pt, txt in zip(m_pts, m_text): + d_txt = DisplayText3D(txt, Plane(o=pt), t_sz, None, font, 'Center', 'Top') + dis_month_text.append(d_txt) + month_axis = ContextGeometry( + 'Month_Axis', [chart_border] + dis_month + dis_month_text) + month_axis.display_name = 'Month Axis' + vis_set.add_geometry(month_axis) + + if include_title: + tit_txt = DisplayText3D( + hourly_plot.title_text, hourly_plot.lower_title_location, txt_h, + None, font, 'Left', 'Bottom') + title = ContextGeometry('Title', [tit_txt]) + title.display_name = 'Title' + vis_set.add_geometry(title) + + # add the colored mesh + vis_data = VisualizationData( + hourly_plot.values, hourly_plot.legend_parameters, data_type, unit) + mesh_geo = AnalysisGeometry( + 'Analysis_Data', [hourly_plot.colored_mesh3d], [vis_data]) + mesh_geo.display_name = data_type.name + mesh_geo.display_mode = 'Surface' + vis_set.add_geometry(mesh_geo) + + return vis_set
+
+ +
+ +
+
+
+
+

+ Back to top + +

+

+ © Copyright 2024, Ladybug Tools.
+ Created using Sphinx 5.3.0.
+

+
+
+ + \ No newline at end of file diff --git a/docs/_modules/ladybug_display/extension/monthlychart.html b/docs/_modules/ladybug_display/extension/monthlychart.html new file mode 100644 index 0000000..467d77b --- /dev/null +++ b/docs/_modules/ladybug_display/extension/monthlychart.html @@ -0,0 +1,1091 @@ + + + + + + + ladybug_display.extension.monthlychart — ladybug-display documentation + + + + + + + + + + + + + + + + + + + + + + + + +
+
+ +
+ +

Source code for ladybug_display.extension.monthlychart

+"""Method to draw an MonthlyChart as a VisualizationSet."""
+from ladybug_geometry.geometry3d import Point3D, Plane, LineSegment3D, Polyline3D, \
+    Mesh3D
+
+from ladybug_display.geometry3d import DisplayLineSegment3D, DisplayPolyline3D, \
+    DisplayText3D
+from ladybug_display.visualization import VisualizationSet, AnalysisGeometry, \
+    VisualizationData, ContextGeometry
+
+
+
[docs]def monthly_chart_to_vis_set( + monthly_chart, z=0, time_marks=False, global_title=None, y_axis_title=None): + """Get a Ladybug MonthlyChart represented as a VisualizationSet. + + Args: + monthly_chart: A Ladybug MonthlyChart object. + z: A number for the Z-coordinate to be used in translation. (Default: 0). + time_marks: Boolean to note whether the month labels should be replaced with + marks for the time of day in each month. This is useful for displaying + hourly data, particularly when the input data is only for a month + and not the whole year. + global_title: A text string to label the entire entire chart. It will be + displayed in the lower left of the output chart. If None, the + default is to display the metadata of the chart data. + y_axis_title: A text string to label the Y-axis of the chart. This can + also be a list of 2 Y-axis titles if there are two different types + of data plotted on the chart and there are two axes labels on either + side of the chart. The default will display the data type and + units of the plotted data. + + Returns: + A VisualizationSet with the monthly chart represented several ContextGeometries + (and an AnalysisGeometry). This includes these objects in the following order. + + - X_Axis -- A ContextGeometry with lines and text for the X axis of + the monthly chart. + + - Y_Axis -- A ContextGeometry with lines and text for the Y axis of + the monthly chart. + + - Y_Axis2 -- A ContextGeometry with lines and text for the second Y axis + of the monthly chart. + + - Title -- A ContextGeometry with text for the title of the monthly chart. + + - Data_Outlines -- A ContextGeometry with a list of polylines that outline + the input data. These will represent the average or total at + each hour whenever the input data is hourly or monthly-per-hour data. + + - Analysis_Data -- An AnalysisGeometry for the data on the monthly chart. + """ + # establish the VisualizationSet object + data_header = monthly_chart.data_collections[0].header + data_type = data_header.data_type + set_id = 'Monthly_Chart_{}'.format(data_type.name.replace(' ', '_')) + vis_set = VisualizationSet(set_id, ()) + + # get values used througout the translation + txt_hgt = monthly_chart.legend_parameters.text_height + font = monthly_chart.legend_parameters.font + x_dim = monthly_chart.x_dim + bp = Plane(o=Point3D(0, 0, z)) + + # add the X axis + border = Polyline3D.from_polyline2d(monthly_chart.chart_border, bp) + x_geo = [DisplayPolyline3D(border, line_width=2)] + for line in monthly_chart.month_lines: + line3d = LineSegment3D.from_line_segment2d(line, z) + x_geo.append(DisplayLineSegment3D(line3d)) + if time_marks: + txt_h = x_dim / 20 if x_dim / 20 < txt_hgt * 0.75 else txt_hgt * 0.75 + for txt, pt in zip(monthly_chart.time_labels, monthly_chart.time_label_points): + t_pln = Plane(o=Point3D(pt.x, pt.y, z)) + txt_obj = DisplayText3D(txt, t_pln, txt_h, None, font, 'Center', 'Top') + x_geo.append(txt_obj) + for line in monthly_chart.time_ticks: + line3d = LineSegment3D.from_line_segment2d(line, z) + x_geo.append(DisplayLineSegment3D(line3d)) + else: + for txt, pt in zip(monthly_chart.month_labels, monthly_chart.month_label_points): + t_pln = Plane(o=Point3D(pt.x, pt.y, z)) + txt_obj = DisplayText3D(txt, t_pln, txt_hgt, None, font, 'Center', 'Top') + x_geo.append(txt_obj) + x_axis = ContextGeometry('X_Axis', x_geo) + x_axis.display_name = 'X Axis' + vis_set.add_geometry(x_axis) + + # add the y axis + y_geo = [] + for line in monthly_chart.y_axis_lines: + line3d = LineSegment3D.from_line_segment2d(line, z) + y_geo.append(DisplayLineSegment3D(line3d, line_type='Dashed')) + if y_axis_title is None or len(y_axis_title) == 0: + y1_txt = monthly_chart.y_axis_title_text1 + else: + y1_txt = y_axis_title if isinstance(y_axis_title, str) else y_axis_title[0] + y_pl = monthly_chart.y_axis_title_location1 + if z != 0: + y_pl = Plane(n=y_pl.n, o=Point3D(y_pl.o.x, y_pl.o.y, z), x=y_pl.x) + y_title = DisplayText3D(y1_txt, y_pl, txt_hgt, None, font) + y_geo.append(y_title) + for txt, pt in zip(monthly_chart.y_axis_labels1, monthly_chart.y_axis_label_points1): + t_pln = Plane(o=Point3D(pt.x, pt.y, z)) + txt_obj = DisplayText3D(txt, t_pln, txt_hgt, None, font, 'Right', 'Middle') + y_geo.append(txt_obj) + y_axis = ContextGeometry('Y_Axis', y_geo) + y_axis.display_name = y1_txt + vis_set.add_geometry(y_axis) + + # add the second y axis if it exists + if monthly_chart.y_axis_title_text2 is not None: + y2_geo = [] + if y_axis_title is None or len(y_axis_title) <= 1: + y2_txt = monthly_chart.y_axis_title_text2 + else: + y2_txt = monthly_chart.y_axis_title_text2 \ + if isinstance(y_axis_title, str) else y_axis_title[1] + y2_pl = monthly_chart.y_axis_title_location2 + if z != 0: + y2_pl = Plane(n=y2_pl.n, o=Point3D(y2_pl.o.x, y2_pl.o.y, z), x=y2_pl.x) + y_title2 = DisplayText3D(y2_txt, y2_pl, txt_hgt, None, font) + y2_geo.append(y_title2) + y2_label_pts = monthly_chart.y_axis_label_points2 + for txt, pt in zip(monthly_chart.y_axis_labels2, y2_label_pts): + t_pln = Plane(o=Point3D(pt.x, pt.y, z)) + txt_obj = DisplayText3D(txt, t_pln, txt_hgt, None, font, 'Left', 'Middle') + y2_geo.append(txt_obj) + y2_axis = ContextGeometry('Y_Axis2', y2_geo) + y2_axis.display_name = y2_txt + vis_set.add_geometry(y2_axis) + + # add the title + title_txt = monthly_chart.title_text if global_title is None else global_title + ttl_pl = monthly_chart.lower_title_location + if z != 0: + ttl_pl = Plane(n=ttl_pl.n, o=Point3D(ttl_pl.o.x, ttl_pl.o.y, z), x=ttl_pl.x) + title = DisplayText3D(title_txt, ttl_pl, txt_hgt, None, font) + title_obj = ContextGeometry('Title', [title]) + vis_set.add_geometry(title_obj) + + # add the analysis geometry + legend = monthly_chart.legend + if monthly_chart.time_interval == 'MonthlyPerHour': + data_lines = [Polyline3D.from_polyline2d(line, bp) + for line in monthly_chart.data_polylines] + month_count = len(data_lines) / len(monthly_chart.data_collections) + data_vals = [int(i / month_count) for i, pline in enumerate(data_lines)] + vis_data = VisualizationData(data_vals, legend.legend_parameters) + a_geo = AnalysisGeometry('Analysis_Data', data_lines, [vis_data]) + else: + d_meshes = monthly_chart.data_meshes + data_mesh = [Mesh3D.from_mesh2d(msh, bp) for msh in d_meshes] + vis_data = VisualizationData(legend.values, legend.legend_parameters) + a_geo = AnalysisGeometry('Analysis_Data', data_mesh, [vis_data]) + if monthly_chart.time_interval == 'Monthly': + a_geo.display_mode = 'SurfaceWithEdges' + elif monthly_chart.time_interval == 'Daily': + a_geo.display_mode = 'Surface' + else: + out_geo = [] + for line in monthly_chart.data_polylines: + line3d = Polyline3D.from_polyline2d(line, bp) + out_geo.append(DisplayPolyline3D(line3d)) + data_outline = ContextGeometry('Data_Outlines', out_geo) + data_outline.display_name = 'Data Outlines' + vis_set.add_geometry(data_outline) + vis_set.add_geometry(a_geo) + + return vis_set
+
+ +
+ +
+
+
+
+

+ Back to top + +

+

+ © Copyright 2024, Ladybug Tools.
+ Created using Sphinx 5.3.0.
+

+
+
+ + \ No newline at end of file diff --git a/docs/_modules/ladybug_display/extension/psychchart.html b/docs/_modules/ladybug_display/extension/psychchart.html new file mode 100644 index 0000000..e3776a5 --- /dev/null +++ b/docs/_modules/ladybug_display/extension/psychchart.html @@ -0,0 +1,1153 @@ + + + + + + + ladybug_display.extension.psychchart — ladybug-display documentation + + + + + + + + + + + + + + + + + + + + + + + + +
+
+ +
+ +

Source code for ladybug_display.extension.psychchart

+"""Method to draw an PsychrometricChart as a VisualizationSet."""
+from ladybug_geometry.geometry3d import Vector3D, Point3D, Plane, LineSegment3D, \
+    Polyline3D, Mesh3D
+from ladybug.datatype.time import Time
+from ladybug.datacollection import BaseCollection
+from ladybug.legend import LegendParameters
+
+from ladybug_display.geometry3d import DisplayLineSegment3D, DisplayPolyline3D, \
+    DisplayText3D
+from ladybug_display.visualization import VisualizationSet, AnalysisGeometry, \
+    VisualizationData, ContextGeometry
+
+
+
[docs]def psychrometric_chart_to_vis_set( + psych_chart, data=None, legend_parameters=None, z=0, plot_wet_bulb=False): + """Get a Ladybug PsychrometricChart represented as a VisualizationSet. + + Args: + psych_chart: A Ladybug PsychrometricChart object. + data: An optional list of data collection objects, which are aligned with + the psychrometric chart temperature and relative_humidity and will + generate additional colored AnalysisGeometries on the chart. + legend_parameters: An optional LegendParameter object or list of LegendParameter + objects to customize the display of the data on the psychrometric + chart. Note that this relates only to the data supplied as input + for this method and, to customize the display of the time/frequency + mesh, the PsychrometricChart's native legend_parameters should be + edited. If a list is used here, this should align with the input data + (one legend parameter per data collection). + z: A number for the Z-coordinate to be used in translation. (Default: 0). + plot_wet_bulb: Boolean to note whether the psychrometric chart should be + plotted with lines of constant enthalpy (False) or lines of constant + wet bulb temperature (True). (Default: False). + + Returns: + A VisualizationSet with the psychrometric chart represented several + ContextGeometries and an AnalysisGeometry. This includes these objects + in the following order. + + - Title -- A ContextGeometry for the title and border around the + psychrometric chart. + + - Temperature_Axis -- A ContextGeometry with lines and text for the + Temperature (X) axis of the psychrometric chart. + + - Humidity_Axis -- A ContextGeometry with lines and text for the + Humidity (Y) axis of the psychrometric chart. + + - Relative_Humidity_Lines -- A ContextGeometry with lines and text + for the relative humidity of the psychrometric chart. + + - Enthalpy_Lines -- A ContextGeometry with lines and text for the + enthalpy of the psychrometric chart. This layer will not be + included if plot_wet_bulb is True. + + - Wet_Bulb_Lines -- A ContextGeometry with lines and text for the wet bulb + temperature of the psychrometric chart. This layer will not be + included if plot_wet_bulb is False. + + - Analysis_Data -- An AnalysisGeometry for the data on the psychrometric + chart. This will include multiple data sets if the data input + is provided. + """ + # establish the VisualizationSet object + vis_set = VisualizationSet('Psychrometric_Chart', ()) + vis_set.display_name = 'Psychrometric Chart' + + # get values used throughout the translation + txt_hgt = psych_chart.legend_parameters.text_height + font = psych_chart.legend_parameters.font + bp = Plane(o=Point3D(0, 0, z)) + + # add the title and border + if isinstance(psych_chart.temperature, BaseCollection): + meta_i = psych_chart.temperature.header.metadata.items() + title_items = ['Time [hr]'] + ['{}: {}'.format(k, v) for k, v in meta_i] + else: + title_items = ['Psychrometric Chart'] + ttl_pl = psych_chart.container.upper_title_location + if z != 0: + ttl_pl = Plane(n=ttl_pl.n, o=Point3D(ttl_pl.o.x, ttl_pl.o.y, z), x=ttl_pl.x) + ttl_txt = DisplayText3D( + '\n'.join(title_items), ttl_pl, txt_hgt * 1.5, None, font, 'Left', 'Top') + border_geo = Polyline3D.from_polyline2d(psych_chart.chart_border, bp) + sat_geo = Polyline3D.from_polyline2d(psych_chart.saturation_line, bp) + title_objs = [ttl_txt, DisplayPolyline3D(sat_geo, line_width=2), + DisplayPolyline3D(border_geo, line_width=2)] + title = ContextGeometry('Title', title_objs) + vis_set.add_geometry(title) + + # add the temperature axis + tm_pl = _plane_from_point(psych_chart.x_axis_location, z) + temp_txt = DisplayText3D( + psych_chart.x_axis_text, tm_pl, txt_hgt * 1.5, None, font, 'Left', 'Top') + temp_geo = [temp_txt] + for tl in psych_chart.temperature_lines: + tl_geo = LineSegment3D.from_line_segment2d(tl, z) + temp_geo.append(DisplayLineSegment3D(tl_geo)) + tl_pts = psych_chart.temperature_label_points + for txt, pt in zip(psych_chart.temperature_labels, tl_pts): + t_pln = Plane(o=Point3D(pt.x, pt.y, z)) + txt_obj = DisplayText3D(txt, t_pln, txt_hgt, None, font, 'Center', 'Top') + temp_geo.append(txt_obj) + temp_axis = ContextGeometry('Temperature_Axis', temp_geo) + temp_axis.display_name = 'Temperature Axis' + vis_set.add_geometry(temp_axis) + + # add the humidity axis + hr_pl = _plane_from_point(psych_chart.y_axis_location, z, Vector3D(0, 1)) + hr_txt = DisplayText3D( + psych_chart.y_axis_text, hr_pl, txt_hgt * 1.5, None, font, 'Right', 'Top') + hr_geo = [hr_txt] + for hl in psych_chart.hr_lines: + hl_geo = LineSegment3D.from_line_segment2d(hl, z) + hr_geo.append(DisplayLineSegment3D(hl_geo)) + for txt, pt in zip(psych_chart.hr_labels, psych_chart.hr_label_points): + t_pln = Plane(o=Point3D(pt.x, pt.y, z)) + txt_obj = DisplayText3D(txt, t_pln, txt_hgt, None, font, 'Left', 'Middle') + hr_geo.append(txt_obj) + hr_axis = ContextGeometry('Humidity_Axis', hr_geo) + hr_axis.display_name = 'Humidity Axis' + vis_set.add_geometry(hr_axis) + + # add the relative humidity lines + rh_geo = [] + for rl in psych_chart.rh_lines: + rl_geo = Polyline3D.from_polyline2d(rl, bp) + rh_geo.append(DisplayPolyline3D(rl_geo)) + for txt, pt in zip(psych_chart.rh_labels[:-1], psych_chart.rh_label_points[:-1]): + t_pln = Plane(o=Point3D(pt.x, pt.y, z)) + txt_obj = DisplayText3D(txt, t_pln, txt_hgt * 0.8, None, font, 'Right', 'Middle') + rh_geo.append(txt_obj) + rh_axis = ContextGeometry('Relative_Humidity_Lines', rh_geo) + rh_axis.display_name = 'Relative Humidity Lines' + vis_set.add_geometry(rh_axis) + + # add enthalpy or wet bulb lines + if plot_wet_bulb: + wb_geo = [] + for wl in psych_chart.wb_lines: + wl_geo = LineSegment3D.from_line_segment2d(wl, z) + wb_geo.append(DisplayLineSegment3D(wl_geo, line_type='Dotted')) + for txt, pt in zip(psych_chart.wb_labels, psych_chart.wb_label_points): + t_pln = Plane(o=Point3D(pt.x, pt.y, z)) + txt_obj = DisplayText3D(txt, t_pln, txt_hgt, None, font, 'Right', 'Middle') + wb_geo.append(txt_obj) + wb_axis = ContextGeometry('Wet_Bulb_Lines', wb_geo) + wb_axis.display_name = 'Wet Bulb Lines' + vis_set.add_geometry(wb_axis) + else: + enth_geo = [] + for wl in psych_chart.enthalpy_lines: + wl_geo = LineSegment3D.from_line_segment2d(wl, z) + enth_geo.append(DisplayLineSegment3D(wl_geo, line_type='Dotted')) + enth_pts = psych_chart.enthalpy_label_points + for txt, pt in zip(psych_chart.enthalpy_labels, enth_pts): + t_pln = Plane(o=Point3D(pt.x, pt.y, z)) + txt_obj = DisplayText3D(txt, t_pln, txt_hgt, None, font, 'Right', 'Middle') + enth_geo.append(txt_obj) + enth_axis = ContextGeometry('Enthalpy_Lines', enth_geo) + enth_axis.display_name = 'Enthalpy Lines' + vis_set.add_geometry(enth_axis) + + # add the analysis geometry + # ensure 3D legend defaults are overridden to make the data readable + l_par = psych_chart.legend.legend_parameters.duplicate() + l_par.base_plane = l_par.base_plane + l_par.segment_height = l_par.segment_height + l_par.segment_width = l_par.segment_width + # gather all of the visualization data sets + vis_data = [VisualizationData(psych_chart.hour_values, l_par, Time(), 'hr')] + if data is not None and len(data) != 0: + if legend_parameters is None: + l_pars = [LegendParameters()] * len(data) + elif isinstance(legend_parameters, LegendParameters): + l_pars = [legend_parameters] * len(data) + else: # assume it's a list that aligns with the data + l_pars = legend_parameters + for dat, lp in zip(data, l_pars): + # process the legend parameters + lp = lp.duplicate() + if lp.is_base_plane_default: + lp.base_plane = l_par.base_plane + if lp.is_segment_height_default: + lp.segment_height = l_par.segment_height + if lp.is_segment_width_default: + lp.segment_width = l_par.segment_width + # check to be sure the data collection aligns + d_vals = dat.values + assert len(d_vals) == psych_chart._calc_length, \ + 'Number of data collection values ' \ + 'must match those of the psychrometric chart temperature and humidity.' + # create a matrix with a tally of the hours for all the data + base_mtx = [[[] for val in psych_chart._t_category] + for rh in psych_chart._rh_category] + for t, rh, v in zip(psych_chart._t_values, psych_chart._rh_values, d_vals): + if t < psych_chart._min_temperature or t > psych_chart._max_temperature: + continue # temperature value does not currently fit on the chart + for y, rh_cat in enumerate(psych_chart._rh_category): + if rh < rh_cat: + break + for x, t_cat in enumerate(psych_chart._t_category): + if t < t_cat: + break + base_mtx[y][x].append(v) + # compute average values + avg_values = [sum(val_list) / len(val_list) for rh_l in base_mtx + for val_list in rh_l if len(val_list) != 0] + hd = dat.header + vd = VisualizationData(avg_values, lp, hd.data_type, hd.unit) + vis_data.append(vd) + # create the analysis geometry + mesh_3d = Mesh3D.from_mesh2d(psych_chart.colored_mesh, bp) + mesh_geo = AnalysisGeometry( + 'Analysis_Data', [mesh_3d], vis_data, active_data=len(vis_data) - 1) + mesh_geo.display_name = 'Analysis Data' + mesh_geo.display_mode = 'Surface' + vis_set.add_geometry(mesh_geo) + + return vis_set
+ + +def _plane_from_point(point_2d, z, align_vec=Vector3D(1, 0, 0)): + """Get a Plane from a Point2D. + + Args: + point_2d: A Point2D to serve as the origin of the plane. + z: The Z value for the plane origin. + align_vec: A Vector3D to serve as the X-Axis of the plane. + """ + return Plane(o=Point3D(point_2d.x, point_2d.y, z), x=align_vec) +
+ +
+ +
+
+
+
+

+ Back to top + +

+

+ © Copyright 2024, Ladybug Tools.
+ Created using Sphinx 5.3.0.
+

+
+
+ + \ No newline at end of file diff --git a/docs/_modules/ladybug_display/extension/raddome.html b/docs/_modules/ladybug_display/extension/raddome.html new file mode 100644 index 0000000..95e1d55 --- /dev/null +++ b/docs/_modules/ladybug_display/extension/raddome.html @@ -0,0 +1,1050 @@ + + + + + + + ladybug_display.extension.raddome — ladybug-display documentation + + + + + + + + + + + + + + + + + + + + + + + + +
+
+ +
+ +

Source code for ladybug_display.extension.raddome

+"""Method to draw a RadiationDome as a VisualizationSet."""
+from ladybug_geometry.geometry3d import Vector3D, Point3D, Plane
+
+from ladybug_display.geometry3d import DisplayPoint3D, DisplayText3D
+from ladybug_display.visualization import VisualizationSet, AnalysisGeometry, \
+    VisualizationData, ContextGeometry
+
+
+
[docs]def radiation_dome_to_vis_set(radiation_dome, show_components=False, include_title=True): + """Translate radiation dome geometry into a VisualizationSet. + + Args: + radiation_dome: A Ladybug-Radiance RadiationDome object. + show_components: Boolean to indicate whether only one dome with total radiation + should be displayed (False) or three domes with the solar radiation + components (total, direct, and diffuse) should be shown. (Default: False). + include_title: Boolean to note whether the title should be included + in the output visualization. (Default: True). + + Returns: + A VisualizationSet with the radiation dome represented as ContextGeometries + and an AnalysisGeometry. This includes these objects in the following order. + + - Compass -- A ContextGeometry for the Compass at the base of the dome. + + - Max_Info -- A ContextGeometry with a Point and text for the maximum + radiation occurring on the dome. + + - Title -- A ContextGeometry with text for the title of the dome. + This layer will be excluded if include_title is False. + + - Radiation_Data -- An AnalysisGeometry for the radiation dome data. + """ + # extract properties relevant for the Compass + cent_pt = radiation_dome.center_point + radius = radiation_dome.radius + proj = radiation_dome.projection + az = radiation_dome.azimuth_count + + # create the dome visualization + if not show_components: # only create the total dome mesh + mesh, compass_obj, dome_graphic, title_txt = radiation_dome.draw() + compass, title = _translate_context( + compass_obj, dome_graphic, title_txt, cent_pt, proj, az) + mesh, title = [mesh], [title] + mesh_values = radiation_dome.total_values + else: # create domes for total, direct and diffuse + # loop through the 3 radiation types and produce a dome + mesh, compass, title, mesh_values = [], [], [], [] + rad_types = ('total', 'direct', 'diffuse') + for dome_i in range(3): + c_pt = Point3D(cent_pt.x + radius * 3 * dome_i, cent_pt.y, cent_pt.z) + dome_mesh, dome_compass, dome_graphic, dome_title = \ + radiation_dome.draw(rad_types[dome_i], c_pt) + compass_con, title_con = _translate_context( + dome_compass, dome_graphic, dome_title, cent_pt, proj, az) + mesh.append(dome_mesh) + compass.extend(compass_con) + title.append(title_con) + mesh_values.extend( + getattr(radiation_dome, '{}_values'.format(rad_types[dome_i]))) + + # create the visualization set object + vis_set = VisualizationSet('RadiationDome', ()) + vis_set.display_name = 'Radiation Dome' + + # create all of the ContextGeometries + compass_geo = ContextGeometry('Compass', compass) \ + if isinstance(compass, list) else compass + vis_set.add_geometry(compass_geo) + if include_title: + title_geo = ContextGeometry('Title', title) + vis_set.add_geometry(title_geo) + m_pt = radiation_dome.max_point + txt_hgt = dome_graphic.legend_parameters.text_height * 0.5 + max_pt = DisplayPoint3D(m_pt, radius=3) + m_pl = Plane(o=Point3D(m_pt.x, m_pt.y - txt_hgt * 1.5, m_pt.z + 0.01), + n=Vector3D(0, 0, 1)) + max_info = DisplayText3D( + radiation_dome.max_info, m_pl, txt_hgt, None, + dome_graphic.legend_parameters.font, 'Center', 'Top') + max_geo = ContextGeometry('Max_Info', (max_pt, max_info)) + max_geo.display_name = 'Max Info' + vis_set.add_geometry(max_geo) + + # create the AnalysisGeometry + vis_data = VisualizationData( + mesh_values, radiation_dome.legend_parameters, + dome_graphic.data_type, dome_graphic.unit) + mesh_geo = AnalysisGeometry( + 'Radiation_Data', mesh, [vis_data]) + mesh_geo.display_name = dome_graphic.data_type.name + mesh_geo.display_mode = 'Surface' + vis_set.add_geometry(mesh_geo) + + return vis_set
+ + +def _translate_context(compass, graphic, title_txt, cent_pt, projection, az_count): + """Translate radiation dome geometry into Display geometry objects. + + Args: + compass: A ladybug Compass object. + graphic: A GraphicContainer for the dome. + title_txt: Text for title of the dome. + cent_pt: The center point of the dome. + project: Text for the projection of the radiation dome. + az_count: The number of azimuth directions in the dome. + + Returns: + dome_compass: A ContextGeometry for the dome compass. + dome_title: DisplayText3D for the title for the dome. + """ + dome_angles = list(range(0, 360, int(360 / az_count))) + start, stop, step, dome_angles = 0, 360, 360 / az_count, [] + while start < stop: + dome_angles.append(start) + start += step + dome_angles = [int(n) for n in dome_angles] + if len(dome_angles) > 36: + dome_angles = dome_angles[::2] + dome_compass = compass.to_vis_set( + cent_pt.z, dome_angles, projection, graphic.legend_parameters.font)[0] + dome_title = DisplayText3D( + title_txt, graphic.lower_title_location, + graphic.legend_parameters.text_height, None, + graphic.legend_parameters.font, 'Left', 'Top') + return dome_compass, dome_title +
+ +
+ +
+
+
+
+

+ Back to top + +

+

+ © Copyright 2024, Ladybug Tools.
+ Created using Sphinx 5.3.0.
+

+
+
+ + \ No newline at end of file diff --git a/docs/_modules/ladybug_display/extension/radrose.html b/docs/_modules/ladybug_display/extension/radrose.html new file mode 100644 index 0000000..8468e21 --- /dev/null +++ b/docs/_modules/ladybug_display/extension/radrose.html @@ -0,0 +1,1053 @@ + + + + + + + ladybug_display.extension.radrose — ladybug-display documentation + + + + + + + + + + + + + + + + + + + + + + + + +
+
+ +
+ +

Source code for ladybug_display.extension.radrose

+"""Method to draw a RadiationRose as a VisualizationSet."""
+from ladybug_geometry.geometry3d import Point3D
+
+from ladybug_display.geometry3d import DisplayLineSegment3D, DisplayText3D
+from ladybug_display.visualization import VisualizationSet, AnalysisGeometry, \
+    VisualizationData, ContextGeometry
+
+
+
[docs]def radiation_rose_to_vis_set( + radiation_rose, max_rad=None, show_components=False, include_title=True): + """Translate radiation rose geometry into a format suitable for Rhino. + + Args: + radiation_rose: A Ladybug-Radiance RadiationRose object. + max_rad: An optional number to set the level of radiation or irradiance + associated with the full radius of the rose. If None, this is + determined by the maximum level of radiation in the input data + but a number can be specified here to fix this at a specific value. + This is particularly useful when comparing different roses to one + another. (Default: None). + show_components: Boolean to indicate whether only one rose with total radiation + should be displayed (False) or three roses with the solar radiation + components (total, direct, and diffuse) should be shown. (Default: False). + include_title: Boolean to note whether the title should be included + in the output visualization. (Default: True). + + Returns: + A VisualizationSet with the radiation rose represented as ContextGeometries + and an AnalysisGeometry. This includes these objects in the following order. + + - Compass -- A ContextGeometry for the Compass at the base of the rose. + + - Orientation_Lines -- A ContextGeometry with lines representing the + edges (or "spokes") of the wind rose directions. + + - Title -- A ContextGeometry with text for the title of the rose. + This layer will be excluded if include_title is False. + + - Radiation_Data -- An AnalysisGeometry for the radiation rose data. + """ + # extract properties relevant for the Compass + cent_pt = radiation_rose.center_point + radius = radiation_rose.radius + d_count = radiation_rose.direction_count + + # create the rose visualization + if not show_components: # only create the total rose mesh + mesh, orient, compass_obj, rose_graphic, title_txt = \ + radiation_rose.draw(max_rad=max_rad) + compass, orient_lines, title = _translate_context( + compass_obj, orient, rose_graphic, title_txt, cent_pt, d_count) + mesh, title = [mesh], [title] + mesh_values = radiation_rose.total_values + else: # create roses for total, direct and diffuse + # loop through the 3 radiation types and produce a rose + mesh, orient_lines, compass, title, mesh_values = [], [], [], [], [] + rad_types = ('total', 'direct', 'diffuse') + for rose_i in range(3): + c_pt = Point3D(cent_pt.x + radius * 3 * rose_i, cent_pt.y, cent_pt.z) + rose_mesh, orient, rose_compass, rose_graphic, rose_title = \ + radiation_rose.draw(rad_types[rose_i], c_pt, max_rad=max_rad) + compass_con, orient_con, title_con = _translate_context( + rose_compass, orient, rose_graphic, rose_title, cent_pt, d_count) + mesh.append(rose_mesh) + orient_lines.extend(orient_con) + compass.extend(compass_con) + title.append(title_con) + mesh_values.extend( + getattr(radiation_rose, '{}_values'.format(rad_types[rose_i]))) + + # create the visualization set object + vis_set = VisualizationSet('RadiationRose', ()) + vis_set.display_name = 'Radiation Rose' + + # create all of the ContextGeometries + compass_geo = ContextGeometry('Compass', compass) \ + if isinstance(compass, list) else compass + vis_set.add_geometry(compass_geo) + orient_geo = ContextGeometry('Orientation_Lines', orient_lines) + vis_set.display_name = 'Orientation Lines' + vis_set.add_geometry(orient_geo) + if include_title: + title_geo = ContextGeometry('Title', title) + vis_set.add_geometry(title_geo) + + # create the AnalysisGeometry + vis_data = VisualizationData( + mesh_values, radiation_rose.legend_parameters, + rose_graphic.data_type, rose_graphic.unit) + mesh_geo = AnalysisGeometry( + 'Radiation_Data', mesh, [vis_data]) + mesh_geo.display_name = rose_graphic.data_type.name + mesh_geo.display_mode = 'Surface' + vis_set.add_geometry(mesh_geo) + + return vis_set
+ + +def _translate_context(compass, dir_lines, graphic, title_txt, cent_pt, dir_count): + """Translate radiation rose geometry into Display geometry objects. + + Args: + compass: A ladybug Compass object. + dir_lines: Line segments for each of the directions plotted on the rose. + graphic: A GraphicContainer for the rose. + title_txt: Text for title of the rose. + cent_pt: The center point of the sky rose. + dir_count: The number of directions in the rose. + + Returns: + rose_compass: A ContextGeometry for the rose compass. + rose_lines: DisplayLineSegment3D for the directions of the rose. + rose_title: DisplayText3D for the title for the rose. + """ + rose_angles = list(range(0, 360, int(360 / dir_count))) + start, stop, step, rose_angles = 0, 360, 360 / dir_count, [] + while start < stop: + rose_angles.append(start) + start += step + rose_angles = [int(n) for n in rose_angles] + if len(rose_angles) > 36: + rose_angles = rose_angles[::2] + rose_compass = compass.to_vis_set( + cent_pt.z, rose_angles, None, graphic.legend_parameters.font)[0] + rose_lines = [DisplayLineSegment3D(lin, line_width=1, line_type='Dotted') + for lin in dir_lines] + rose_title = DisplayText3D( + title_txt, graphic.lower_title_location, + graphic.legend_parameters.text_height, None, + graphic.legend_parameters.font, 'Left', 'Top') + return rose_compass, rose_lines, rose_title +
+ +
+ +
+
+
+
+

+ Back to top + +

+

+ © Copyright 2024, Ladybug Tools.
+ Created using Sphinx 5.3.0.
+

+
+
+ + \ No newline at end of file diff --git a/docs/_modules/ladybug_display/extension/skydome.html b/docs/_modules/ladybug_display/extension/skydome.html new file mode 100644 index 0000000..9aa42e7 --- /dev/null +++ b/docs/_modules/ladybug_display/extension/skydome.html @@ -0,0 +1,1022 @@ + + + + + + + ladybug_display.extension.skydome — ladybug-display documentation + + + + + + + + + + + + + + + + + + + + + + + + +
+
+ +
+ +

Source code for ladybug_display.extension.skydome

+"""Method to draw a SkyDome as a VisualizationSet."""
+from ladybug_geometry.geometry3d.pointvector import Point3D
+
+from ladybug_display.geometry3d import DisplayText3D
+from ladybug_display.visualization import VisualizationSet, AnalysisGeometry, \
+    VisualizationData, ContextGeometry
+
+
+
[docs]def sky_dome_to_vis_set(sky_dome, show_components=False, include_title=True): + """Translate sky dome geometry into a VisualizationSet. + + Args: + sky_dome: A Ladybug-Radiance SkyDome object. + show_components: Boolean to indicate whether only one dome with total radiation + should be displayed (False) or three domes with the solar radiation + components (total, direct, and diffuse) should be shown. (Default: False). + include_title: Boolean to note whether the title should be included + in the output visualization. (Default: True). + + Returns: + A VisualizationSet with the sky dome represented as ContextGeometries + and an AnalysisGeometry. This includes these objects in the following order. + + - Compass -- A ContextGeometry for the Compass at the base of the sky dome. + + - Title -- A ContextGeometry with text for the title of the sky dome. + This layer will be excluded if include_title is False. + + - Radiation_Data -- An AnalysisGeometry for the sky dome data. + """ + # extract properties relevant for the Compass + cent_pt, radius, proj = sky_dome.center_point, sky_dome.radius, sky_dome.projection + + # create the dome visualization + if not show_components: # only create the total dome mesh + mesh, compass_obj, dome_graphic, title_txt, mesh_values = sky_dome.draw() + compass, title = _translate_context( + compass_obj, dome_graphic, title_txt, cent_pt, proj) + mesh, title = [mesh], [title] + else: # create domes for total, direct and diffuse + # loop through the 3 radiation types and produce a dome + mesh, compass, title, mesh_values = [], [], [], [] + rad_types = ('total', 'direct', 'diffuse') + for dome_i in range(3): + c_pt = Point3D(cent_pt.x + radius * 3 * dome_i, cent_pt.y, cent_pt.z) + dome_mesh, dome_compass, dome_graphic, dome_title, dome_values = \ + sky_dome.draw(rad_types[dome_i], c_pt) + compass_con, title_con = _translate_context( + dome_compass, dome_graphic, dome_title, cent_pt, proj) + mesh.append(dome_mesh) + compass.extend(compass_con) + title.append(title_con) + mesh_values.extend(dome_values) + + # create the visualization set object + vis_set = VisualizationSet('SkyDome', ()) + vis_set.display_name = 'Sky Dome' + + # merge all of the ContextGeometries + compass_geo = ContextGeometry('Compass', compass) \ + if isinstance(compass, list) else compass + vis_set.add_geometry(compass_geo) + if include_title: + title_geo = ContextGeometry('Title', title) + vis_set.add_geometry(title_geo) + + # create the AnalysisGeometry + vis_data = VisualizationData( + mesh_values, sky_dome.legend_parameters, + dome_graphic.data_type, dome_graphic.unit) + mesh_geo = AnalysisGeometry( + 'Radiation_Data', mesh, [vis_data]) + mesh_geo.display_name = dome_graphic.data_type.name + mesh_geo.display_mode = 'Surface' + vis_set.add_geometry(mesh_geo) + + return vis_set
+ + +def _translate_context(compass, graphic, title_txt, cent_pt, projection): + """Translate sky dome geometry into Display geometry objects. + + Args: + compass: A ladybug Compass object. + graphic: A GraphicContainer for the dome. + title_txt: Text for title of the dome. + cent_pt: The center point of the sky dome. + project: Text for the projection of the sky dome. + + Returns: + dome_compass: A ContextGeometry for the dome compass. + dome_title: DisplayText3D for the title for the dome. + """ + dome_compass = compass.to_vis_set( + cent_pt.z, None, projection, graphic.legend_parameters.font)[0] + dome_title = DisplayText3D( + title_txt, graphic.lower_title_location, + graphic.legend_parameters.text_height, None, + graphic.legend_parameters.font, 'Left', 'Top') + return dome_compass, dome_title +
+ +
+ +
+
+
+
+

+ Back to top + +

+

+ © Copyright 2024, Ladybug Tools.
+ Created using Sphinx 5.3.0.
+

+
+
+ + \ No newline at end of file diff --git a/docs/_modules/ladybug_display/extension/study/directsun.html b/docs/_modules/ladybug_display/extension/study/directsun.html new file mode 100644 index 0000000..e6c03e6 --- /dev/null +++ b/docs/_modules/ladybug_display/extension/study/directsun.html @@ -0,0 +1,1013 @@ + + + + + + + ladybug_display.extension.study.directsun — ladybug-display documentation + + + + + + + + + + + + + + + + + + + + + + + + +
+
+ +
+ +

Source code for ladybug_display.extension.study.directsun

+"""Method to draw a RadiationDome as a VisualizationSet."""
+from ladybug_geometry.bounding import bounding_box
+from ladybug_geometry.geometry3d import Mesh3D
+from ladybug.color import Colorset, Color
+from ladybug.legend import LegendParameters
+from ladybug.graphic import GraphicContainer
+from ladybug.datatype.time import Time
+
+from ladybug_display.geometry3d import DisplayText3D, DisplayMesh3D, DisplayFace3D
+from ladybug_display.visualization import VisualizationSet, AnalysisGeometry, \
+    VisualizationData, ContextGeometry
+
+
+
[docs]def direct_sun_study_to_vis_set( + direct_sun_study, legend_parameters=None, + include_title=True, include_context=False): + """Translate direct sun study into a VisualizationSet. + + Args: + direct_sun_study: A Ladybug-Radiance DirectSunStudy object. + legend_parameters: An optional LegendParameter object to change the display + of the direct sun study. If None, default legend parameters will be + used. (Default: None). + include_title: Boolean to note whether the title should be included + in the output visualization. (Default: True). + include_context: Boolean to note whether the context geometry should be + included in the output visualization. (Default: False). + + Returns: + A VisualizationSet with the direct sun study represented as an + AnalysisGeometry. This includes these objects in the following order. + + - Direct_Sun_Data -- An AnalysisGeometry for the direct sun data. + + - Title -- A ContextGeometry with text for the title of the study. + This layer will be excluded if include_title is False. + + - Context_Geometry -- A ContextGeometry with the shading context used + in the study. This layer will be excluded when include_context is False. + """ + # process the legend parameters and override the legend colors + if legend_parameters is not None: + assert isinstance(legend_parameters, LegendParameters), \ + 'Expected LegendParameters. Got {}.'.format(type(legend_parameters)) + l_par = legend_parameters.duplicate() + else: + l_par = LegendParameters() + if l_par.are_colors_default: + l_par.colors = Colorset.ecotect() + + # create the visualization set object + vis_set = VisualizationSet('DirectSunStudy', ()) + vis_set.display_name = 'Direct Sun Study' + d_type, unit = Time(), 'hr' + sun_data = direct_sun_study.direct_sun_hours + + # create the AnalysisGeometry + vis_data = VisualizationData(sun_data, l_par, d_type, unit) + mesh_geo = AnalysisGeometry( + 'Direct_Sun_Data', [direct_sun_study.study_mesh], [vis_data]) + mesh_geo.display_name = 'Direct Sun Data' + mesh_geo.display_mode = 'Surface' + vis_set.add_geometry(mesh_geo) + + # create the ContextGeometry for the title + if include_title: + all_geo = (direct_sun_study.study_mesh,) + direct_sun_study.context_geometry + min_pt, max_pt = bounding_box(all_geo) + graphic = GraphicContainer( + sun_data, min_pt, max_pt, l_par, d_type, unit) + study_title = DisplayText3D( + 'Direct Sun Hours', graphic.lower_title_location, + graphic.legend_parameters.text_height, None, + graphic.legend_parameters.font, 'Left', 'Top') + title_geo = ContextGeometry('Title', [study_title]) + vis_set.add_geometry(title_geo) + + # create the ContextGeometry for the context + if include_context: + con_color = Color(125, 125, 125, 125) + con_geos = [] + for geo in direct_sun_study.context_geometry: + if isinstance(geo, Mesh3D): + con_geos.append(DisplayMesh3D(geo, con_color)) + else: # it's a Face3D + con_geos.append(DisplayFace3D(geo, con_color)) + context_geo = ContextGeometry('Context_Geometry', con_geos) + context_geo.display_name = 'Context Geometry' + vis_set.add_geometry(context_geo) + + return vis_set
+
+ +
+ +
+
+
+
+

+ Back to top + +

+

+ © Copyright 2024, Ladybug Tools.
+ Created using Sphinx 5.3.0.
+

+
+
+ + \ No newline at end of file diff --git a/docs/_modules/ladybug_display/extension/study/radiation.html b/docs/_modules/ladybug_display/extension/study/radiation.html new file mode 100644 index 0000000..c939efe --- /dev/null +++ b/docs/_modules/ladybug_display/extension/study/radiation.html @@ -0,0 +1,1035 @@ + + + + + + + ladybug_display.extension.study.radiation — ladybug-display documentation + + + + + + + + + + + + + + + + + + + + + + + + +
+
+ +
+ +

Source code for ladybug_display.extension.study.radiation

+"""Method to draw a RadiationDome as a VisualizationSet."""
+from ladybug_geometry.bounding import bounding_box
+from ladybug_geometry.geometry3d import Mesh3D
+from ladybug.color import Colorset, Color
+from ladybug.legend import LegendParameters
+from ladybug.graphic import GraphicContainer
+from ladybug.datatype.energyintensity import Radiation
+from ladybug.datatype.energyflux import Irradiance
+
+from ladybug_display.geometry3d import DisplayText3D, DisplayMesh3D, DisplayFace3D
+from ladybug_display.visualization import VisualizationSet, AnalysisGeometry, \
+    VisualizationData, ContextGeometry
+
+
+
[docs]def radiation_study_to_vis_set( + radiation_study, legend_parameters=None, plot_irradiance=False, + include_title=True, include_context=False): + """Translate radiation study into a VisualizationSet. + + Args: + radiation_study: A Ladybug-Radiance RadiationStudy object. + legend_parameters: An optional LegendParameter object to change the display + of the radiation study. If None, default legend parameters will be + used. (Default: None). + plot_irradiance: Boolean to note whether the results should be plotted + with units of total Radiation (kWh/m2) [False] or with units of average + Irradiance (W/m2) [True]. (Default: False). + include_title: Boolean to note whether the title should be included + in the output visualization. (Default: True). + include_context: Boolean to note whether the context geometry should be + included in the output visualization. (Default: False). + + Returns: + A VisualizationSet with the radiation study represented as an + AnalysisGeometry. This includes these objects in the following order. + + - Radiation_Data -- An AnalysisGeometry for the radiation data. + + - Title -- A ContextGeometry with text for the title of the study. + This layer will be excluded if include_title is False. + + - Context_Geometry -- A ContextGeometry with the shading context used + in the study. This layer will be excluded when include_context is False. + """ + # get the radiation data + if plot_irradiance: + d_type, unit, title = Irradiance(), 'W/m2', 'Incident Irradiance' + rad_data = radiation_study.irradiance_values + else: + d_type, unit, title = Radiation(), 'kWh/m2', 'Incident Radiation' + rad_data = radiation_study.radiation_values + if radiation_study.is_benefit: + title = '{} Benefit/Harm'.format(title) + + # process the legend parameters and override the legend colors + if legend_parameters is not None: + assert isinstance(legend_parameters, LegendParameters), \ + 'Expected LegendParameters. Got {}.'.format(type(legend_parameters)) + l_par = legend_parameters.duplicate() + else: + l_par = LegendParameters() + if radiation_study.is_benefit: + if l_par.min is None: + l_par.min = min((min(rad_data), -max(rad_data))) + if l_par.max is None: + l_par.max = max((-min(rad_data), max(rad_data))) + if l_par.are_colors_default: + l_par.colors = reversed(Colorset.benefit_harm()) + else: + if l_par.min is None: + l_par.min = 0 + if l_par.max is None: + l_par.max = max(rad_data) + + # create the visualization set object + vis_set = VisualizationSet('RadiationStudy', ()) + vis_set.display_name = 'Radiation Study' + + # create the AnalysisGeometry + vis_data = VisualizationData(rad_data, l_par, d_type, unit) + mesh_geo = AnalysisGeometry( + 'Radiation_Data', [radiation_study.study_mesh], [vis_data]) + mesh_geo.display_name = 'Radiation Data' + mesh_geo.display_mode = 'Surface' + vis_set.add_geometry(mesh_geo) + + # create the ContextGeometry for the title + if include_title: + all_geo = (radiation_study.study_mesh,) + radiation_study.context_geometry + min_pt, max_pt = bounding_box(all_geo) + graphic = GraphicContainer( + rad_data, min_pt, max_pt, l_par, d_type, unit) + study_title = DisplayText3D( + title, graphic.lower_title_location, + graphic.legend_parameters.text_height, None, + graphic.legend_parameters.font, 'Left', 'Top') + title_geo = ContextGeometry('Title', [study_title]) + vis_set.add_geometry(title_geo) + + # create the ContextGeometry for the context + if include_context: + con_color = Color(125, 125, 125, 125) + con_geos = [] + for geo in radiation_study.context_geometry: + if isinstance(geo, Mesh3D): + con_geos.append(DisplayMesh3D(geo, con_color)) + else: # it's a Face3D + con_geos.append(DisplayFace3D(geo, con_color)) + context_geo = ContextGeometry('Context_Geometry', con_geos) + context_geo.display_name = 'Context Geometry' + vis_set.add_geometry(context_geo) + + return vis_set
+
+ +
+ +
+
+
+
+

+ Back to top + +

+

+ © Copyright 2024, Ladybug Tools.
+ Created using Sphinx 5.3.0.
+

+
+
+ + \ No newline at end of file diff --git a/docs/_modules/ladybug_display/extension/sunpath.html b/docs/_modules/ladybug_display/extension/sunpath.html new file mode 100644 index 0000000..40c4c5f --- /dev/null +++ b/docs/_modules/ladybug_display/extension/sunpath.html @@ -0,0 +1,1122 @@ + + + + + + + ladybug_display.extension.sunpath — ladybug-display documentation + + + + + + + + + + + + + + + + + + + + + + + + +
+
+ +
+ +

Source code for ladybug_display.extension.sunpath

+"""Method to draw a Sunpath as a VisualizationSet."""
+from ladybug_geometry.geometry2d.pointvector import Point2D
+from ladybug_geometry.geometry3d import Point3D, Plane, Polyline3D, Sphere
+from ladybug.dt import Date
+from ladybug.color import Color
+from ladybug.legend import LegendParameters
+from ladybug.compass import Compass
+
+from ..geometry3d import DisplayPoint3D, DisplayArc3D, DisplayPolyline3D, DisplaySphere
+from ..visualization import VisualizationSet, \
+    ContextGeometry, AnalysisGeometry, VisualizationData
+from .compass import compass_to_vis_set
+
+
+
[docs]def sunpath_to_vis_set( + sunpath, hoys=None, data=None, legend_parameters=None, + radius=100, center_point=Point3D(0, 0, 0), + solar_time=False, daily=False, projection=None, sun_spheres=False): + """Get a Ladybug Sunpath represented as a VisualizationSet. + + Args: + sunpath: A Ladybug Sunpath object. + hoys: An optional list of numbers between 0 and 8760 that represent the + hours of the year at which the sun position will be displayed. + The Ladybug AnalysisPeriod class can output a list of HOYs within + a certain hour or date range. (Default: None). + data: An optional list of hourly data collection objects, which will + generate colored sun positions for each of the hoys. + legend_parameters: An optional LegendParameter object or list of LegendParameter + objects to customize the display of the data on the sun path. If a + list is used, these should align with the input data (one legend + parameter per data collection). + radius: Number for the radius of the sun path. (Default: 100). + center_point: Point3D for the center of the sun path. (Default: (0, 0, 0)). + solar_time: A boolean to indicate if the sunpath should be drawn with solar + time hours instead of standard or daylight time. (Default: False) + daily: Boolean to note whether the sunpath should display only one daily + arc for each unique day in the input hoys_ (True) or whether the + output sun path geometry should be for the entire year, complete + with analemmas for all sun-up hours and a daily arc for each + month (False). (Default: False) + projection: Optional text for the name of a projection to use from the sky + dome hemisphere to the 2D plane. If None, a 3D sun path will be drawn + instead of a 2D one. (Default: None) Choose from the following: + * Orthographic + * Stereographic + sun_spheres: Boolean to note whether sun positions should be drawn as points + or as fully-detailed spheres. Note that this option should only be + used when there are relatively few hoys input. Anything more than + 100 hoys can make the display very slow. (Default: False). + + Returns: + A VisualizationSet with the Sunpath represented several ContextGeometries + (and optionally an AnalysisGeometry if data is input). This includes these + objects in the following order. + + - Compass -- A ContextGeometry for the Compass at the base of the sunpath. + + - Analemmas -- A ContextGeometry for the analemmas of the sunpath (if + the daily input is False). + + - Daily_Arcs -- A ContextGeometry for the daily arcs across the sunpath. + + - Sun_Positions -- Either a ContextGeometry or an AnalysisGeometry for + the sun positions (if hoys are input). The object will be an + AnalysisGeometry if data is input, indicating that suns are colored + with this data. + """ + # establish the VisualizationSet object + vis_set = VisualizationSet( + 'Sunpath_{}_{}'.format(int(sunpath.latitude), int(sunpath.longitude)), ()) + vis_set.display_name = 'Sunpath' + + # add the compass to the bottom of the path + center_2d = Point2D(center_point.x, center_point.y) + compass = Compass(radius, center_2d, sunpath.north_angle) + compass_vis = compass_to_vis_set(compass, z=center_point.z, projection=projection) + vis_set.add_geometry(compass_vis[0]) + + # create a intersection of the input hoys and the data hoys (if provided) + if data is not None and len(data) > 0 and hoys is not None and len(hoys) > 0: + all_aligned = all(data[0].is_collection_aligned(d) for d in data[1:]) + assert all_aligned, 'All collections input to data must be aligned for ' \ + 'each Sunpath.\nGrafting the data and supplying multiple grafted ' \ + '_center_pt_ can be used to view each data on its own path.' + data_hoys = set(dt.hoy for dt in data[0].datetimes) + hoys = list(data_hoys.intersection(set(hoys))) + + # get the relevant sus and datetimes + suns, datetimes, moys = [], [], [] + if hoys is not None and len(hoys) > 0: + for hoy in hoys: + sun = sunpath.calculate_sun_from_hoy(hoy, solar_time) + if sun.is_during_day: + suns.append(sun) + datetimes.append(sun.datetime) + moys.append(sun.datetime.moy) + + # add the daily arcs and analemmas to the visualization set + original_dls = sunpath.daylight_saving_period + sunpath.daylight_saving_period = None # set here so analemmas aren't messed up + center_pt, z = Point2D(center_point.x, center_point.y), center_point.z + if not daily: + if projection is None: + # draw arcs and analemmas in 3D + ana_plin_1 = sunpath.hourly_analemma_polyline3d( + center_point, radius, True, solar_time, 1, 6, 4) + ana_plin_2 = sunpath.hourly_analemma_polyline3d( + center_point, radius, True, solar_time, 7, 12, 4) + analemma = [DisplayPolyline3D(pl, line_width=1) for pl in ana_plin_1] + \ + [DisplayPolyline3D(pl, line_width=1, line_type='Dashed') + for pl in ana_plin_2] + daily_arc = sunpath.monthly_day_arc3d(center_point, radius) + daily = [] + for i, arc in enumerate(daily_arc): + lw = 2 if (i + 1) % 6 == 0 else 1 + lt = 'Continuous' if i <= 5 else 'Dashed' + daily.append(DisplayArc3D(arc, line_width=lw, line_type=lt)) + else: + # draw arcs and analemmas in the requested projection + bp = Plane(o=Point3D(0, 0, z)) + ana_plin_1 = sunpath.hourly_analemma_polyline2d( + projection, center_point, radius, True, solar_time, 1, 6, 4) + ana_plin_2 = sunpath.hourly_analemma_polyline2d( + projection, center_point, radius, True, solar_time, 7, 12, 4) + analemma = \ + [DisplayPolyline3D(Polyline3D.from_polyline2d(p, bp), line_width=1) + for p in ana_plin_1] + \ + [DisplayPolyline3D( + Polyline3D.from_polyline2d(p, bp), line_width=1, line_type='Dashed') + for p in ana_plin_2] + daily_arc = sunpath.monthly_day_polyline2d( + projection, center_point, radius, divisions=30) + daily = [] + for i, arc in enumerate(daily_arc): + lw = 2 if (i + 1) % 6 == 0 else 1 + lt = 'Continuous' if i <= 5 else 'Dashed' + pline = Polyline3D.from_polyline2d(arc, bp) + daily.append(DisplayPolyline3D(pline, line_width=lw, line_type=lt)) + analemma_geo = ContextGeometry('Analemmas', analemma) + vis_set.add_geometry(analemma_geo) + else: + # just draw daily arcs without the analemmas + doys = set(dt.doy for dt in datetimes) + dates = [Date.from_doy(doy) for doy in doys] + if projection is None: + daily = [] + for dat in dates: + d_arc = sunpath.day_arc3d(dat.month, dat.day, center_point, radius) + daily.append(DisplayArc3D(d_arc, line_width=1)) + else: + bp = Plane(o=Point3D(0, 0, z)) + daily = [] + for dat in dates: + d_arc = sunpath.day_polyline2d( + dat.month, dat.day, projection, center_pt, radius, divisions=30) + daily.append(DisplayPolyline3D( + Polyline3D.from_polyline2d(d_arc, bp), line_width=1)) + if len(daily) != 0: + daily_geo = ContextGeometry('Daily_Arcs', daily) + daily_geo.display_name = 'Daily Arcs' + vis_set.add_geometry(daily_geo) + sunpath.daylight_saving_period = original_dls # put back to avoid mutation + + # plot the sun positions as points on the sunpath + if hoys is not None and len(hoys) > 0: + # get Point3Ds for all of the sun positions + if projection is None: + sun_pts = [sun.position_3d(center_point, radius) for sun in suns] + else: + sun_pts = [] + for sun in suns: + pt2d = sun.position_2d(projection, center_point, radius) + sun_pts.append(Point3D.from_point2d(pt2d, z)) + if sun_spheres: + sun_pts = [Sphere(pt, radius / 30) for pt in sun_pts] + # plot the sun positions as either context or analysis geometry + if data is not None and len(data) > 0: + # plot points as context or analysis geometry (if data is connected) + if isinstance(legend_parameters, LegendParameters): + legend_parameters = [legend_parameters] * len(data) + all_data = [] + for i, dat_c in enumerate(data): + l_par = legend_parameters[i] if legend_parameters is not None else None + n_data = dat_c.filter_by_moys(moys) # filter data by sun-up hours + v_data = VisualizationData( + n_data.values, l_par, dat_c.header.data_type, dat_c.header.unit) + all_data.append(v_data) + sun_geo = AnalysisGeometry('Sun_Positions', sun_pts, all_data) + else: # otherwise, plot the suns as context geometry + orange = Color(255, 165, 0) + if sun_spheres: + dis_pts = [DisplaySphere(pt, color=orange) for pt in sun_pts] + else: + dis_pts = [DisplayPoint3D(pt, color=orange, radius=5) for pt in sun_pts] + sun_geo = ContextGeometry('Sun_Positions', dis_pts) + sun_geo.display_name = 'Sun Positions' + vis_set.add_geometry(sun_geo) + + return vis_set
+
+ +
+ +
+
+
+
+

+ Back to top + +

+

+ © Copyright 2024, Ladybug Tools.
+ Created using Sphinx 5.3.0.
+

+
+
+ + \ No newline at end of file diff --git a/docs/_modules/ladybug_display/extension/windprofile.html b/docs/_modules/ladybug_display/extension/windprofile.html new file mode 100644 index 0000000..6fee9fb --- /dev/null +++ b/docs/_modules/ladybug_display/extension/windprofile.html @@ -0,0 +1,1084 @@ + + + + + + + ladybug_display.extension.windprofile — ladybug-display documentation + + + + + + + + + + + + + + + + + + + + + + + + +
+
+ +
+ +

Source code for ladybug_display.extension.windprofile

+"""Method to draw a WindProfile as a VisualizationSet."""
+from ladybug_geometry.geometry3d import Point3D
+
+from ladybug.datatype.speed import WindSpeed
+from ladybug.legend import LegendParameters
+
+from ladybug_display.geometry3d import DisplayLineSegment3D, DisplayPolyline3D, \
+    DisplayMesh3D, DisplayText3D
+from ladybug_display.visualization import VisualizationSet, AnalysisGeometry, \
+    VisualizationData, ContextGeometry
+
+
+
[docs]def wind_profile_to_vis_set( + profile, meteorological_wind_speed=5, direction=None, + legend_parameters=None, base_point=Point3D(0, 0, 0), + max_height=30, vector_spacing=2, + vector_length_dimension=5, vector_height_dimension=1, + max_speed=None, scale_factor=1, feet_labels=False): + """Get a Ladybug WindProfile represented as a VisualizationSet. + + Args: + profile: A Ladybug WindProfile object. + meteorological_wind_speed: A number for the meteorological wind speed [m/s]. + This is usually for a point in time or it is the average wind speed + over a range of times. (Default: 5). + direction: An optional number between 0 and 360 that represents the + cardinal direction that the wind profile is facing in the XY + plane. 0 = North, 90 = East, 180 = South, 270 = West. Note that this + should already account for any difference between true North and + project North, which simply involves subtracting the counterclockwise + north angle from the wind direction. If None, the wind profile will + simply be placed in the XY plane. (Default: None). + legend_parameters: Optional LegendParameters to change the display of the + wind profile arrows. + base_point: A ladybug-geometry Point3D that represents the ground + location of the wind profile. (Default, (0, 0, 0)). + max_height: A number in meters to specify the maximum height of the + wind profile curve. (Default: 30 meters). + vector_spacing: A number in meters to specify the difference in height + between each of the mesh arrows. (Default 2 meters). + vector_length_dimension: A number to denote the length dimension of a 1 m/s + wind vector in meters. (Default: 5). + vector_height_dimension: A number to denote the height dimension of the + wind vector in meters. (Default: 1). + max_speed: A number for the maximum wind speed along the speed axis + in [m/s]. If None, it will be set automatically by the wind profile + maximum value. (Default: None). + scale_factor: An optional number that will be multiplied by all dimensions + to account for the fact that the wind profile may be displaying in + a units system other than meters. (Default: 1). + feet_labels: A boolean to note whether the text labels on the height axis + should be in feet (True) or meters (False). (Default: False). + + Returns: + A VisualizationSet with the wind profile represented several ContextGeometries + and an AnalysisGeometry. This includes these objects in the following order. + + - Arrows -- An AnalysisGeometry of colored mesh objects that represent + the wind speeds along the height of the wind profile. + + - Profile -- A Polyline outlining the wind speed as it changes + with height. + + - Speed_Axis -- A ContextGeometry of line segments and text objects + that mark the X axis, which relates to the wind speed in (m/s). + + - Height_Axis -- A ContextGeometry of line segments and text objects + that mark the Y axis, which relates to the the height above the ground. + """ + # establish the VisualizationSet object + vis_set = VisualizationSet( + 'WindProfile_{}'.format(int(meteorological_wind_speed)), ()) + vis_set.display_name = 'Wind Profile' + + # shorten the names of the inputs to make them easier to work with + met_ws = meteorological_wind_speed + bp, len_d, height_d = base_point, vector_length_dimension, vector_height_dimension + + # generate the arrow geometries of the visualization + _, mesh_arrows, wind_speeds, wind_vectors, anchor_pts = \ + profile.mesh_arrow_profile( + met_ws, max_height, vector_spacing, direction, bp, + len_d, height_d, scale_factor) + + # customize the legend parameters to ensure the default legend looks good + legend_par = legend_parameters.duplicate() if legend_parameters is not None \ + else LegendParameters() + max_speed = round(wind_speeds[-1]) if max_speed is None else max_speed + max_pt = Point3D(bp.x + ((max_speed + 2) * len_d * scale_factor), + bp.y + (30 * scale_factor), bp.z) + # set the default segment_height + if legend_par.is_segment_height_default: + s_count = legend_par.segment_count + denom = s_count if s_count >= 8 else 8 + if legend_par.vertical: + seg_height = float((max_pt.y - bp.y) / denom) + if seg_height == 0: + seg_height = float((max_pt.x - bp.x) / denom) + else: + seg_height = float((max_pt.x - bp.x) / (denom * 2)) + if seg_height == 0: + seg_height = float((max_pt.y - bp.y) / denom) + legend_par.properties_3d.segment_height = seg_height + # set the default segment_width + if legend_par.is_segment_width_default: + if legend_par.vertical: + seg_width = legend_par.segment_height / 2 + else: + seg_width = legend_par.text_height * \ + (len(str(int(legend_par.max))) + legend_par.decimal_count + 2) + legend_par.properties_3d.segment_width = seg_width + # set the default base_plane + if legend_par.is_base_plane_default: + legend_par.base_plane = \ + profile.legend_plane(max_speed, direction, bp, len_d, scale_factor) + + # create an AnalysisGeometry for the colored arrows + vis_data = VisualizationData(wind_speeds, legend_par, WindSpeed(), 'm/s') + a_geo = AnalysisGeometry('Arrows', mesh_arrows, [vis_data]) + vis_set.add_geometry(a_geo) + + # create a ContextGeometry for the profile line + pl, _, _ = profile.profile_polyline3d( + met_ws, max_height, 0.1, direction, bp, len_d, scale_factor) + dis_profile_line = DisplayPolyline3D(pl, line_width=1) + profile_geo = ContextGeometry('Profile', [dis_profile_line]) + vis_set.add_geometry(profile_geo) + + # create a ContextGeometry for the speed axis + txt_h = legend_par.text_height + axis_line, axis_arrow, axis_ticks, text_planes, text = \ + profile.speed_axis(max_speed, direction, bp, len_d, scale_factor, txt_h) + speed_axis = [DisplayLineSegment3D(axis_line), DisplayMesh3D(axis_arrow)] + for tic in axis_ticks: + speed_axis.append(DisplayLineSegment3D(tic)) + for i, (pl, txt) in enumerate(zip(text_planes, text)): + txt_i_h = txt_h if i != len(text) - 1 else txt_h * 1.25 + txt_obj = DisplayText3D(txt, pl, txt_i_h, None, legend_par.font, 'Center', 'Top') + speed_axis.append(txt_obj) + speed_axis_geo = ContextGeometry('Speed_Axis', speed_axis) + speed_axis_geo.display_name = 'Speed Axis' + vis_set.add_geometry(speed_axis_geo) + + # create a ContextGeometry for the height axis + axis_line, axis_arrow, axis_ticks, text_planes, text = \ + profile.height_axis(max_height, vector_spacing * 2, direction, bp, + scale_factor, txt_h, feet_labels) + height_axis = [DisplayLineSegment3D(axis_line), DisplayMesh3D(axis_arrow)] + for tic in axis_ticks: + height_axis.append(DisplayLineSegment3D(tic)) + for i, (pl, txt) in enumerate(zip(text_planes, text)): + if i != len(text) - 1: + txt_i_h, ha, va = txt_h, 'Right', 'Middle' + else: + txt_i_h, ha, va = txt_h * 1.25, 'Center', 'Bottom' + txt_obj = DisplayText3D(txt, pl, txt_i_h, None, legend_par.font, ha, va) + height_axis.append(txt_obj) + height_axis_geo = ContextGeometry('Height_Axis', height_axis) + height_axis_geo.display_name = 'Height Axis' + vis_set.add_geometry(height_axis_geo) + + return vis_set
+
+ +
+ +
+
+
+
+

+ Back to top + +

+

+ © Copyright 2024, Ladybug Tools.
+ Created using Sphinx 5.3.0.
+

+
+
+ + \ No newline at end of file diff --git a/docs/_modules/ladybug_display/extension/windrose.html b/docs/_modules/ladybug_display/extension/windrose.html new file mode 100644 index 0000000..19aea8f --- /dev/null +++ b/docs/_modules/ladybug_display/extension/windrose.html @@ -0,0 +1,1016 @@ + + + + + + + ladybug_display.extension.windrose — ladybug-display documentation + + + + + + + + + + + + + + + + + + + + + + + + +
+
+ +
+ +

Source code for ladybug_display.extension.windrose

+"""Method to draw a WindRose as a VisualizationSet."""
+import math
+
+from ladybug_geometry.geometry2d import Polyline2D
+from ladybug_geometry.geometry3d import Vector3D, Point3D, Plane, LineSegment3D, \
+    Polyline3D, Mesh3D
+
+from ladybug_display.geometry3d import DisplayLineSegment3D, DisplayPolyline3D, \
+    DisplayText3D
+from ladybug_display.visualization import VisualizationSet, AnalysisGeometry, \
+    VisualizationData, ContextGeometry
+from ladybug_display.extension.compass import compass_to_vis_set
+
+
+
[docs]def wind_rose_to_vis_set(windrose, z=0, frequency_labels=True): + """Get a Ladybug WindRose represented as a VisualizationSet. + + Args: + windrose: A Ladybug WindRose object. + z: A number for the Z-coordinate to be used in translation. (Default: 0). + frequency_labels: A boolean to note whether frequency labels should be + included in the output visualization. (Default: True). + + Returns: + A VisualizationSet with the wind rose represented several ContextGeometries + and an AnalysisGeometry. This includes these objects in the following order. + + - Compass -- A ContextGeometry for the Compass at the base of the wind rose. + + - Orientation_Lines -- A ContextGeometry with lines representing the + edges (or "spokes") of the wind rose directions. + + - Frequency_Lines -- A ContextGeometry with polygons representing + the frequency intervals of the wind rose. + + - Analysis_Data -- An AnalysisGeometry for the wind rose data. + """ + # establish the VisualizationSet object + wr_metadata = windrose.analysis_data_collection.header.metadata + set_id = 'Wind_Rose_{}'.format(wr_metadata['city'].replace(' ', '_')) \ + if wr_metadata is not None \ + and 'city' in wr_metadata else 'Wind_Rose' + vis_set = VisualizationSet(set_id, ()) + + # add the compass to the bottom of the path + legend_par = windrose.legend.legend_parameters + font, txt_h = legend_par.font, legend_par.text_height + vis_set.add_geometry(compass_to_vis_set(windrose.compass, z=z, font=font)[0]) + + # add the orientation lines + orient_line = [LineSegment3D.from_line_segment2d(seg, z) for seg in + windrose.orientation_lines] + dis_orient = [] + for lin in orient_line: + dis_orient.append(DisplayLineSegment3D(lin, line_width=1, line_type='Dotted')) + orient_geo = ContextGeometry('Orientation_Lines', dis_orient) + orient_geo.display_name = 'Orientation Lines' + vis_set.add_geometry(orient_geo) + + # add the frequency lines + wr_pln = Plane(o=Point3D(0, 0, z)) + freq_line = [Polyline3D.from_polyline2d(Polyline2D.from_polygon(poly), wr_pln) + for poly in windrose.frequency_lines[:-1]] + dis_freq, freq_text = [], [] + for lin in freq_line: + dis_freq.append(DisplayPolyline3D(lin, line_width=1, line_type='Dotted')) + if frequency_labels: + b_pln_x = Vector3D(1, 0, 0) if windrose.north == 0 else \ + Vector3D(1, 0, 0).rotate_xy(math.radians(windrose.north)) + f_int = windrose.frequency_hours + txt_h = min((windrose.frequency_spacing_distance / 4, txt_h)) + freqs = range(0, f_int * windrose.frequency_intervals_compass, f_int) + for i, (lin, val) in enumerate(zip(freq_line, freqs)): + if i % 2 == 0 and i != 0: + b_pln = Plane(o=lin.segments[0].midpoint, x=b_pln_x) + d_txt = DisplayText3D(str(val), b_pln, txt_h, None, font, + 'Center', 'Bottom') + freq_text.append(d_txt) + freq_geo = ContextGeometry('Frequency_Lines', dis_freq + freq_text) + freq_geo.display_name = 'Frequency Lines' + vis_set.add_geometry(freq_geo) + + # add the colored mesh + msh = Mesh3D.from_mesh2d(windrose.colored_mesh, wr_pln) + data_header = windrose.analysis_data_collection.header + data_type, unit = data_header.data_type, data_header.unit + vis_data = VisualizationData( + windrose._color_array, windrose.legend_parameters, data_type, unit) + mesh_geo = AnalysisGeometry('Analysis_Data', [msh], [vis_data]) + mesh_geo.display_name = data_type.name + mesh_geo.display_mode = 'SurfaceWithEdges' + vis_set.add_geometry(mesh_geo) + + return vis_set
+
+ +
+ +
+
+
+
+

+ Back to top + +

+

+ © Copyright 2024, Ladybug Tools.
+ Created using Sphinx 5.3.0.
+

+
+
+ + \ No newline at end of file diff --git a/docs/_modules/ladybug_display/geometry2d/arc.html b/docs/_modules/ladybug_display/geometry2d/arc.html new file mode 100644 index 0000000..568a451 --- /dev/null +++ b/docs/_modules/ladybug_display/geometry2d/arc.html @@ -0,0 +1,1041 @@ + + + + + + + ladybug_display.geometry2d.arc — ladybug-display documentation + + + + + + + + + + + + + + + + + + + + + + + + +
+
+ +
+ +

Source code for ladybug_display.geometry2d.arc

+"""An arc that can be displayed in 2D space."""
+from ladybug_geometry.geometry2d.arc import Arc2D
+from ladybug.color import Color
+
+from ladybug_display.altnumber import default
+from ._base import _LineCurveBase2D
+
+
+
[docs]class DisplayArc2D(_LineCurveBase2D): + """An arc in 2D space with display properties. + + Args: + geometry: A ladybug-geometry Arc2D object. + color: A ladybug Color object. If None, a default black color will be + used. (Default: None). + line_width: Number for line width in pixels (for the screen). For print, + this will be converted a value in millimeters or inches assuming + standard web resolution (72 pixels per inch). This can also be the + Default object to indicate that the default settings of the + interface should be used (typically one pixel). + line_type: Get or set text to indicate the type of line to display. + Choose from the following. (Default: "Continuous") + + * Continuous + * Dashed + * Dotted + * DashDot + + Properties: + * geometry + * color + * line_width + * line_type + * c + * r + * p1 + * p2 + * length + * is_circle + * user_data + """ + __slots__ = () + + def __init__(self, geometry, color=None, line_width=default, line_type='Continuous'): + """Initialize base with shade object.""" + assert isinstance(geometry, Arc2D), '\ + Expected ladybug_geometry Arc2D. Got {}'.format(type(geometry)) + _LineCurveBase2D.__init__(self, geometry, color, line_width, line_type) + +
[docs] @classmethod + def from_dict(cls, data): + """Initialize a DisplayArc2D from a dictionary. + + Args: + data: A dictionary representation of an DisplayArc2D object. + """ + assert data['type'] == 'DisplayArc2D', \ + 'Expected DisplayArc2D dictionary. Got {}.'.format(data['type']) + color = Color.from_dict(data['color']) if 'color' in data and data['color'] \ + is not None else None + lw = default if 'line_width' not in data or \ + data['line_width'] == default.to_dict() else data['line_width'] + lt = data['line_type'] if 'line_type' in data and data['line_type'] \ + is not None else 'Continuous' + geo = cls(Arc2D.from_dict(data['geometry']), color, lw, lt) + if 'user_data' in data and data['user_data'] is not None: + geo.user_data = data['user_data'] + return geo
+ + @property + def c(self): + """Get a Point2D for the center of the arc.""" + return self._geometry.c + + @property + def r(self): + """Get a number for the radius of the arc.""" + return self._geometry.r + + @property + def p1(self): + """Get a Point2D representing the first end point of the arc.""" + return self._geometry.p1 + + @property + def p2(self): + """Get a Point2D representing the second end point of the arc.""" + return self._geometry.p2 + + @property + def length(self): + """Get a number for the length of the arc.""" + return self._geometry.length + + @property + def is_circle(self): + """Get a boolean for whether the arc is a circle.""" + return self._geometry.is_circle + +
[docs] def to_dict(self): + """Return DisplayArc2D as a dictionary.""" + base = {'type': 'DisplayArc2D'} + base['geometry'] = self._geometry.to_dict() + base['color'] = self.color.to_dict() + base['line_width'] = default.to_dict() if \ + self.line_width == default else self.line_width + base['line_type'] = self.line_type + if self.user_data is not None: + base['user_data'] = self.user_data + return base
+ + def __copy__(self): + new_g = DisplayArc2D( + self.geometry, self.color, self.line_width, self.line_type) + new_g._user_data = None if self.user_data is None else self.user_data.copy() + return new_g + + def __repr__(self): + return 'DisplayArc2D: {}'.format(self.geometry)
+
+ +
+ +
+
+
+
+

+ Back to top + +

+

+ © Copyright 2024, Ladybug Tools.
+ Created using Sphinx 5.3.0.
+

+
+
+ + \ No newline at end of file diff --git a/docs/_modules/ladybug_display/geometry2d/line.html b/docs/_modules/ladybug_display/geometry2d/line.html new file mode 100644 index 0000000..99635b7 --- /dev/null +++ b/docs/_modules/ladybug_display/geometry2d/line.html @@ -0,0 +1,1035 @@ + + + + + + + ladybug_display.geometry2d.line — ladybug-display documentation + + + + + + + + + + + + + + + + + + + + + + + + +
+
+ +
+ +

Source code for ladybug_display.geometry2d.line

+"""A line segment that can be displayed in 2D space."""
+from ladybug_geometry.geometry2d.line import LineSegment2D
+from ladybug.color import Color
+
+from ladybug_display.altnumber import default
+from ._base import _LineCurveBase2D
+
+
+
[docs]class DisplayLineSegment2D(_LineCurveBase2D): + """A single line segment in 2D space with display properties. + + Args: + geometry: A ladybug-geometry LineSegment2D object. + color: A ladybug Color object. If None, a default black color will be + used. (Default: None). + line_width: Number for line width in pixels (for the screen). For print, + this will be converted a value in millimeters or inches assuming + standard web resolution (72 pixels per inch). This can also be the + Default object to indicate that the default settings of the + interface should be used (typically one pixel). + line_type: Get or set text to indicate the type of line to display. + Choose from the following. (Default: "Continuous") + + * Continuous + * Dashed + * Dotted + * DashDot + + Properties: + * geometry + * color + * line_width + * line_type + * p + * v + * p1 + * p2 + * length + * user_data + """ + __slots__ = () + + def __init__(self, geometry, color=None, line_width=default, line_type='Continuous'): + """Initialize base with shade object.""" + assert isinstance(geometry, LineSegment2D), '\ + Expected ladybug_geometry LineSegment2D. Got {}'.format(type(geometry)) + _LineCurveBase2D.__init__(self, geometry, color, line_width, line_type) + +
[docs] @classmethod + def from_dict(cls, data): + """Initialize a DisplayLineSegment2D from a dictionary. + + Args: + data: A dictionary representation of an DisplayLineSegment2D object. + """ + assert data['type'] == 'DisplayLineSegment2D', \ + 'Expected DisplayLineSegment2D dictionary. Got {}.'.format(data['type']) + color = Color.from_dict(data['color']) if 'color' in data and data['color'] \ + is not None else None + lw = default if 'line_width' not in data or \ + data['line_width'] == default.to_dict() else data['line_width'] + lt = data['line_type'] if 'line_type' in data and data['line_type'] \ + is not None else 'Continuous' + geo = cls(LineSegment2D.from_dict(data['geometry']), color, lw, lt) + if 'user_data' in data and data['user_data'] is not None: + geo.user_data = data['user_data'] + return geo
+ + @property + def p(self): + """Get a Point2D representing the base of the line segment.""" + return self._geometry.p + + @property + def v(self): + """Get a Vector2D representing the direction of the line segment.""" + return self._geometry.v + + @property + def p1(self): + """Get a Point2D representing the first point of the line segment.""" + return self._geometry.p1 + + @property + def p2(self): + """Get a Point2D representing the second point of the line segment.""" + return self._geometry.p2 + + @property + def length(self): + """Get a number for the length of the line segment.""" + return self._geometry.length + +
[docs] def to_dict(self): + """Return DisplayLineSegment2D as a dictionary.""" + base = {'type': 'DisplayLineSegment2D'} + base['geometry'] = self._geometry.to_dict() + base['color'] = self.color.to_dict() + base['line_width'] = default.to_dict() if \ + self.line_width == default else self.line_width + base['line_type'] = self.line_type + if self.user_data is not None: + base['user_data'] = self.user_data + return base
+ + def __copy__(self): + new_g = DisplayLineSegment2D( + self.geometry, self.color, self.line_width, self.line_type) + new_g._user_data = None if self.user_data is None else self.user_data.copy() + return new_g + + def __repr__(self): + return 'DisplayLineSegment2D: {}'.format(self.geometry)
+
+ +
+ +
+
+
+
+

+ Back to top + +

+

+ © Copyright 2024, Ladybug Tools.
+ Created using Sphinx 5.3.0.
+

+
+
+ + \ No newline at end of file diff --git a/docs/_modules/ladybug_display/geometry2d/mesh.html b/docs/_modules/ladybug_display/geometry2d/mesh.html new file mode 100644 index 0000000..c62fa64 --- /dev/null +++ b/docs/_modules/ladybug_display/geometry2d/mesh.html @@ -0,0 +1,1041 @@ + + + + + + + ladybug_display.geometry2d.mesh — ladybug-display documentation + + + + + + + + + + + + + + + + + + + + + + + + +
+
+ +
+ +

Source code for ladybug_display.geometry2d.mesh

+"""A mesh in 2D space with display properties."""
+from ladybug_geometry.geometry2d.mesh import Mesh2D
+from ladybug.color import Color
+
+from ._base import _SingleColorModeBase2D
+
+
+
[docs]class DisplayMesh2D(_SingleColorModeBase2D): + """A mesh in 2D space with display properties. + + Args: + geometry: A ladybug-geometry Mesh2D. + color: A ladybug Color object. If None, a default black color will be + used. (Default: None). + display_mode: Text to indicate the display mode (surface, wireframe, etc.). + Choose from the following. (Default: Surface). + + * Surface + * SurfaceWithEdges + * Wireframe + * Points + + Properties: + * geometry + * color + * display_mode + * vertices + * faces + * min + * max + * center + * area + * face_areas + * face_centroids + * user_data + """ + __slots__ = () + + def __init__(self, geometry, color=None, display_mode='Surface'): + """Initialize base with shade object.""" + assert isinstance(geometry, Mesh2D), '\ + Expected ladybug_geometry Mesh2D. Got {}'.format(type(geometry)) + _SingleColorModeBase2D.__init__(self, geometry, color, display_mode) + +
[docs] @classmethod + def from_dict(cls, data): + """Initialize a DisplayMesh2D from a dictionary. + + Args: + data: A dictionary representation of an DisplayMesh2D object. + """ + assert data['type'] == 'DisplayMesh2D', \ + 'Expected DisplayMesh2D dictionary. Got {}.'.format(data['type']) + color = Color.from_dict(data['color']) if 'color' in data and data['color'] \ + is not None else None + d_mode = data['display_mode'] if 'display_mode' in data and \ + data['display_mode'] is not None else 'Surface' + geo = cls(Mesh2D.from_dict(data['geometry']), color, d_mode) + if 'user_data' in data and data['user_data'] is not None: + geo.user_data = data['user_data'] + return geo
+ + @property + def vertices(self): + """Get a tuple of vertices in the mesh.""" + return self._geometry.vertices + + @property + def faces(self): + """Get a tuple of all faces in the mesh.""" + return self._geometry.faces + + @property + def min(self): + """Get a Point2D for the minimum of the bounding box around the object.""" + return self._geometry.min + + @property + def max(self): + """Get a Point2D for the maximum of the bounding box around the object.""" + return self._geometry.max + + @property + def center(self): + """Get a Point2D for the center of the bounding box around the object.""" + return self._geometry.center + + @property + def area(self): + """Get the area of the mesh.""" + return self._geometry.area + + @property + def face_areas(self): + """Get a tuple with the area of each face in the mesh.""" + return self._geometry.face_areas + + @property + def face_centroids(self): + """Get a tuple with the centroid of each face in the mesh.""" + return self._geometry.face_centroids + +
[docs] def to_dict(self): + """Return DisplayMesh2D as a dictionary.""" + base = {'type': 'DisplayMesh2D'} + base['geometry'] = self._geometry.to_dict() + base['color'] = self.color.to_dict() + base['display_mode'] = self.display_mode + if self.user_data is not None: + base['user_data'] = self.user_data + return base
+ + def __copy__(self): + new_g = DisplayMesh2D(self.geometry, self.color, self.display_mode) + new_g._user_data = None if self.user_data is None else self.user_data.copy() + return new_g + + def __repr__(self): + return 'DisplayMesh2D: {}'.format(self.geometry)
+
+ +
+ +
+
+
+
+

+ Back to top + +

+

+ © Copyright 2024, Ladybug Tools.
+ Created using Sphinx 5.3.0.
+

+
+
+ + \ No newline at end of file diff --git a/docs/_modules/ladybug_display/geometry2d/point.html b/docs/_modules/ladybug_display/geometry2d/point.html new file mode 100644 index 0000000..1d8d739 --- /dev/null +++ b/docs/_modules/ladybug_display/geometry2d/point.html @@ -0,0 +1,1026 @@ + + + + + + + ladybug_display.geometry2d.point — ladybug-display documentation + + + + + + + + + + + + + + + + + + + + + + + + +
+
+ +
+ +

Source code for ladybug_display.geometry2d.point

+"""A point that can be displayed in 2D space."""
+from ladybug_geometry.geometry2d.pointvector import Point2D
+from ladybug.color import Color
+
+from ._base import _SingleColorBase2D
+from ladybug_display.altnumber import default
+from ladybug_display.typing import float_positive
+
+
+
[docs]class DisplayPoint2D(_SingleColorBase2D): + """A point in 2D space with display properties. + + Args: + geometry: A ladybug-geometry Point2D object. + color: A ladybug Color object. If None, a default black color will be + used. (Default: None). + radius: Number for radius in pixels (for the screen) or millimeters + (in print). This can also be the Default object to indicate that the + default settings of the interface should be used. + + Properties: + * geometry + * color + * radius + * x + * y + * user_data + """ + __slots__ = ('_radius',) + + def __init__(self, geometry, color=None, radius=default): + """Initialize base with shade object.""" + assert isinstance(geometry, Point2D), '\ + Expected ladybug_geometry Point2D. Got {}'.format(type(geometry)) + _SingleColorBase2D.__init__(self, geometry, color) + self.radius = radius + +
[docs] @classmethod + def from_dict(cls, data): + """Initialize a DisplayPoint2D from a dictionary. + + Args: + data: A dictionary representation of an DisplayPoint2D object. + """ + assert data['type'] == 'DisplayPoint2D', \ + 'Expected DisplayPoint2D dictionary. Got {}.'.format(data['type']) + color = Color.from_dict(data['color']) if 'color' in data and data['color'] \ + is not None else None + rad = default if 'radius' not in data or \ + data['radius'] == default.to_dict() else data['radius'] + geo = cls(Point2D.from_dict(data['geometry']), color, rad) + if 'user_data' in data and data['user_data'] is not None: + geo.user_data = data['user_data'] + return geo
+ + @property + def radius(self): + """Get or set a number for the radius of this object.""" + return self._radius + + @radius.setter + def radius(self, value): + if value == default: + self._radius = default + else: + self._radius = float_positive(value, 'point radius') + + @property + def x(self): + """Get the X coordinate.""" + return self._geometry.x + + @property + def y(self): + """Get the Y coordinate.""" + return self._geometry.y + +
[docs] def distance_to_point(self, point): + """Get the distance from this point to another DisplayPoint2D.""" + return self.geometry.distance_to_point(point.geometry)
+ +
[docs] def to_dict(self): + """Return DisplayPoint2D as a dictionary.""" + base = {'type': 'DisplayPoint2D'} + base['geometry'] = self._geometry.to_dict() + base['color'] = self.color.to_dict() + base['radius'] = default.to_dict() if self.radius == default else self.radius + if self.user_data is not None: + base['user_data'] = self.user_data + return base
+ + def __copy__(self): + new_g = DisplayPoint2D(self.geometry, self.color, self.radius) + new_g._user_data = None if self.user_data is None else self.user_data.copy() + return new_g + + def __getitem__(self, key): + return (self.x, self.y)[key] + + def __iter__(self): + return iter((self.x, self.y)) + + def __repr__(self): + return 'DisplayPoint2D: {}'.format(self.geometry)
+
+ +
+ +
+
+
+
+

+ Back to top + +

+

+ © Copyright 2024, Ladybug Tools.
+ Created using Sphinx 5.3.0.
+

+
+
+ + \ No newline at end of file diff --git a/docs/_modules/ladybug_display/geometry2d/polygon.html b/docs/_modules/ladybug_display/geometry2d/polygon.html new file mode 100644 index 0000000..0881959 --- /dev/null +++ b/docs/_modules/ladybug_display/geometry2d/polygon.html @@ -0,0 +1,1065 @@ + + + + + + + ladybug_display.geometry2d.polygon — ladybug-display documentation + + + + + + + + + + + + + + + + + + + + + + + + +
+
+ +
+ +

Source code for ladybug_display.geometry2d.polygon

+"""A polygon that can be displayed in 2D space."""
+from ladybug_geometry.geometry2d.polygon import Polygon2D
+from ladybug.color import Color
+
+from ladybug_display.altnumber import default
+from ._base import _LineCurveBase2D
+
+
+
[docs]class DisplayPolygon2D(_LineCurveBase2D): + """A polygon in 2D space with display properties. + + Args: + geometry: A ladybug-geometry Polygon2D object. + color: A ladybug Color object. If None, a default black color will be + used. (Default: None). + line_width: Number for line width in pixels (for the screen). For print, + this will be converted a value in millimeters or inches assuming + standard web resolution (72 pixels per inch). This can also be the + Default object to indicate that the default settings of the + interface should be used (typically one pixel). + line_type: Get or set text to indicate the type of line to display. + Choose from the following. (Default: "Continuous") + + * Continuous + * Dashed + * Dotted + * DashDot + + Properties: + * geometry + * color + * line_width + * line_type + * vertices + * segments + * min + * max + * center + * perimeter + * area + * is_clockwise + * is_convex + * is_self_intersecting + * user_data + """ + __slots__ = () + + def __init__(self, geometry, color=None, line_width=default, line_type='Continuous'): + """Initialize base with shade object.""" + assert isinstance(geometry, Polygon2D), '\ + Expected ladybug_geometry Polygon2D. Got {}'.format(type(geometry)) + _LineCurveBase2D.__init__(self, geometry, color, line_width, line_type) + +
[docs] @classmethod + def from_dict(cls, data): + """Initialize a DisplayPolygon2D from a dictionary. + + Args: + data: A dictionary representation of an DisplayPolygon2D object. + """ + assert data['type'] == 'DisplayPolygon2D', \ + 'Expected DisplayPolygon2D dictionary. Got {}.'.format(data['type']) + color = Color.from_dict(data['color']) if 'color' in data and data['color'] \ + is not None else None + lw = default if 'line_width' not in data or \ + data['line_width'] == default.to_dict() else data['line_width'] + lt = data['line_type'] if 'line_type' in data and data['line_type'] \ + is not None else 'Continuous' + geo = cls(Polygon2D.from_dict(data['geometry']), color, lw, lt) + if 'user_data' in data and data['user_data'] is not None: + geo.user_data = data['user_data'] + return geo
+ + @property + def vertices(self): + """Get a tuple of Point2Ds that make up the polygon.""" + return self._geometry.vertices + + @property + def segments(self): + """Get a tuple of LineSegment2Ds that make up the polygon.""" + return self._geometry.segments + + @property + def min(self): + """Get a Point2D for the minimum of the bounding box around the object.""" + return self._geometry.min + + @property + def max(self): + """Get a Point2D for the maximum of the bounding box around the object.""" + return self._geometry.max + + @property + def center(self): + """Get a Point2D for the center of the bounding box around the object.""" + return self._geometry.center + + @property + def perimeter(self): + """Get a number for the perimeter of the polygon.""" + return self._geometry.perimeter + + @property + def area(self): + """Get a number for the area of the polygon.""" + return self._geometry.area + + @property + def is_clockwise(self): + """Get a boolean for whether the polygon is clockwise.""" + return self._geometry.is_clockwise + + @property + def is_convex(self): + """Get a boolean for whether the polygon is convex.""" + return self._geometry.is_convex + + @property + def is_self_intersecting(self): + """Get a boolean for whether the polygon is self intersecting.""" + return self._geometry.is_self_intersecting + +
[docs] def to_dict(self): + """Return DisplayPolygon2D as a dictionary.""" + base = {'type': 'DisplayPolygon2D'} + base['geometry'] = self._geometry.to_dict() + base['color'] = self.color.to_dict() + base['line_width'] = default.to_dict() if \ + self.line_width == default else self.line_width + base['line_type'] = self.line_type + if self.user_data is not None: + base['user_data'] = self.user_data + return base
+ + def __copy__(self): + new_g = DisplayPolygon2D( + self.geometry, self.color, self.line_width, self.line_type) + new_g._user_data = None if self.user_data is None else self.user_data.copy() + return new_g + + def __repr__(self): + return 'DisplayPolygon2D: {}'.format(self.geometry)
+
+ +
+ +
+
+
+
+

+ Back to top + +

+

+ © Copyright 2024, Ladybug Tools.
+ Created using Sphinx 5.3.0.
+

+
+
+ + \ No newline at end of file diff --git a/docs/_modules/ladybug_display/geometry2d/polyline.html b/docs/_modules/ladybug_display/geometry2d/polyline.html new file mode 100644 index 0000000..8eb84a2 --- /dev/null +++ b/docs/_modules/ladybug_display/geometry2d/polyline.html @@ -0,0 +1,1054 @@ + + + + + + + ladybug_display.geometry2d.polyline — ladybug-display documentation + + + + + + + + + + + + + + + + + + + + + + + + +
+
+ +
+ +

Source code for ladybug_display.geometry2d.polyline

+"""A polyline that can be displayed in 2D space."""
+from ladybug_geometry.geometry2d.polyline import Polyline2D
+from ladybug.color import Color
+
+from ladybug_display.altnumber import default
+from ._base import _LineCurveBase2D
+
+
+
[docs]class DisplayPolyline2D(_LineCurveBase2D): + """A polyline in 2D space with display properties. + + Args: + geometry: A ladybug-geometry Polyline2D object. + color: A ladybug Color object. If None, a default black color will be + used. (Default: None). + line_width: Number for line width in pixels (for the screen). For print, + this will be converted a value in millimeters or inches assuming + standard web resolution (72 pixels per inch). This can also be the + Default object to indicate that the default settings of the + interface should be used (typically one pixel). + line_type: Get or set text to indicate the type of line to display. + Choose from the following. (Default: "Continuous") + + * Continuous + * Dashed + * Dotted + * DashDot + + Properties: + * geometry + * color + * line_width + * line_type + * vertices + * segments + * interpolated + * p1 + * p2 + * length + * min + * max + * user_data + """ + __slots__ = () + + def __init__(self, geometry, color=None, line_width=default, line_type='Continuous'): + """Initialize base with shade object.""" + assert isinstance(geometry, Polyline2D), '\ + Expected ladybug_geometry Polyline2D. Got {}'.format(type(geometry)) + _LineCurveBase2D.__init__(self, geometry, color, line_width, line_type) + +
[docs] @classmethod + def from_dict(cls, data): + """Initialize a DisplayPolyline2D from a dictionary. + + Args: + data: A dictionary representation of an DisplayPolyline2D object. + """ + assert data['type'] == 'DisplayPolyline2D', \ + 'Expected DisplayPolyline2D dictionary. Got {}.'.format(data['type']) + color = Color.from_dict(data['color']) if 'color' in data and data['color'] \ + is not None else None + lw = default if 'line_width' not in data or \ + data['line_width'] == default.to_dict() else data['line_width'] + lt = data['line_type'] if 'line_type' in data and data['line_type'] \ + is not None else 'Continuous' + geo = cls(Polyline2D.from_dict(data['geometry']), color, lw, lt) + if 'user_data' in data and data['user_data'] is not None: + geo.user_data = data['user_data'] + return geo
+ + @property + def vertices(self): + """Get a tuple of Point2D for the vertices of the polyline.""" + return self._geometry.vertices + + @property + def segments(self): + """Get a tuple of LineSegment2D for the segments of the polyline.""" + return self._geometry.segments + + @property + def interpolated(self): + """Get a boolean for whether the polyline should be interpreted as interpolated. + """ + return self._geometry.interpolated + + @property + def p1(self): + """Get a Point2D representing the first end point of the polyline.""" + return self._geometry.p1 + + @property + def p2(self): + """Get a Point2D representing the second end point of the polyline.""" + return self._geometry.p2 + + @property + def length(self): + """Get a number for the length of the polyline.""" + return self._geometry.length + + @property + def min(self): + """Get a Point2D for the minimum of the bounding box around the object.""" + return self._geometry.min + + @property + def max(self): + """Get a Point2D for the maximum of the bounding box around the object.""" + return self._geometry.max + +
[docs] def to_dict(self): + """Return DisplayPolyline2D as a dictionary.""" + base = {'type': 'DisplayPolyline2D'} + base['geometry'] = self._geometry.to_dict() + base['color'] = self.color.to_dict() + base['line_width'] = default.to_dict() if \ + self.line_width == default else self.line_width + base['line_type'] = self.line_type + if self.user_data is not None: + base['user_data'] = self.user_data + return base
+ + def __copy__(self): + new_g = DisplayPolyline2D( + self.geometry, self.color, self.line_width, self.line_type) + new_g._user_data = None if self.user_data is None else self.user_data.copy() + return new_g + + def __repr__(self): + return 'DisplayPolyline2D: {}'.format(self.geometry)
+
+ +
+ +
+
+
+
+

+ Back to top + +

+

+ © Copyright 2024, Ladybug Tools.
+ Created using Sphinx 5.3.0.
+

+
+
+ + \ No newline at end of file diff --git a/docs/_modules/ladybug_display/geometry2d/ray.html b/docs/_modules/ladybug_display/geometry2d/ray.html new file mode 100644 index 0000000..edffd52 --- /dev/null +++ b/docs/_modules/ladybug_display/geometry2d/ray.html @@ -0,0 +1,998 @@ + + + + + + + ladybug_display.geometry2d.ray — ladybug-display documentation + + + + + + + + + + + + + + + + + + + + + + + + +
+
+ +
+ +

Source code for ladybug_display.geometry2d.ray

+"""A ray that can be displayed in 2D space."""
+from ladybug_geometry.geometry2d.ray import Ray2D
+from ladybug.color import Color
+
+from ._base import _SingleColorBase2D
+
+
+
[docs]class DisplayRay2D(_SingleColorBase2D): + """A ray in 2D space with display properties. + + Args: + geometry: A ladybug-geometry Ray2D object. + color: A ladybug Color object. If None, a default black color will be + used. (Default: None). + + Properties: + * geometry + * color + * p + * v + * user_data + """ + __slots__ = () + + def __init__(self, geometry, color=None): + """Initialize base with shade object.""" + assert isinstance(geometry, Ray2D), '\ + Expected ladybug_geometry Ray2D. Got {}'.format(type(geometry)) + _SingleColorBase2D.__init__(self, geometry, color) + +
[docs] @classmethod + def from_dict(cls, data): + """Initialize a DisplayRay2D from a dictionary. + + Args: + data: A dictionary representation of an DisplayRay2D object. + """ + assert data['type'] == 'DisplayRay2D', \ + 'Expected DisplayRay2D dictionary. Got {}.'.format(data['type']) + color = Color.from_dict(data['color']) if 'color' in data and data['color'] \ + is not None else None + geo = cls(Ray2D.from_dict(data['geometry']), color) + if 'user_data' in data and data['user_data'] is not None: + geo.user_data = data['user_data'] + return geo
+ + @property + def p(self): + """Get a Point2D representing the base of the ray.""" + return self._geometry.p + + @property + def v(self): + """Get a Vector2D representing the direction of the ray.""" + return self._geometry.v + +
[docs] def reverse(self): + """Reverse this DisplayRay2D.""" + self._geometry = self._geometry.reverse()
+ +
[docs] def to_dict(self): + """Return DisplayRay2D as a dictionary.""" + base = {'type': 'DisplayRay2D'} + base['geometry'] = self._geometry.to_dict() + base['color'] = self.color.to_dict() + if self.user_data is not None: + base['user_data'] = self.user_data + return base
+ + def __copy__(self): + new_g = DisplayRay2D(self.geometry, self.color) + new_g._user_data = None if self.user_data is None else self.user_data.copy() + return new_g + + def __repr__(self): + return 'DisplayRay2D: {}'.format(self.geometry)
+
+ +
+ +
+
+
+
+

+ Back to top + +

+

+ © Copyright 2024, Ladybug Tools.
+ Created using Sphinx 5.3.0.
+

+
+
+ + \ No newline at end of file diff --git a/docs/_modules/ladybug_display/geometry2d/vector.html b/docs/_modules/ladybug_display/geometry2d/vector.html new file mode 100644 index 0000000..8dd8777 --- /dev/null +++ b/docs/_modules/ladybug_display/geometry2d/vector.html @@ -0,0 +1,1072 @@ + + + + + + + ladybug_display.geometry2d.vector — ladybug-display documentation + + + + + + + + + + + + + + + + + + + + + + + + +
+
+ +
+ +

Source code for ladybug_display.geometry2d.vector

+"""A vector that can be displayed in 2D space."""
+import math
+
+from ladybug_geometry.geometry2d.pointvector import Vector2D
+from ladybug.color import Color
+
+from .._base import _DisplayBase
+
+
+
[docs]class DisplayVector2D(_DisplayBase): + """A vector in 2D space with display properties. + + Args: + geometry: A ladybug-geometry Vector2D object. + color: A ladybug Color object. If None, a default black color will be + used. (Default: None). + + Properties: + * geometry + * color + * x + * y + * magnitude + * user_data + """ + __slots__ = ('_color',) + + def __init__(self, geometry, color=None): + """Initialize base with shade object.""" + assert isinstance(geometry, Vector2D), '\ + Expected ladybug_geometry Vector2D. Got {}'.format(type(geometry)) + _DisplayBase.__init__(self, geometry) + self.color = color + +
[docs] @classmethod + def from_dict(cls, data): + """Initialize a DisplayVector2D from a dictionary. + + Args: + data: A dictionary representation of an DisplayVector2D object. + """ + assert data['type'] == 'DisplayVector2D', \ + 'Expected DisplayVector2D dictionary. Got {}.'.format(data['type']) + color = Color.from_dict(data['color']) if 'color' in data and data['color'] \ + is not None else None + geo = cls(Vector2D.from_dict(data['geometry']), color) + if 'user_data' in data and data['user_data'] is not None: + geo.user_data = data['user_data'] + return geo
+ + @property + def color(self): + """Get or set a color for this object.""" + return self._color + + @color.setter + def color(self, value): + if value is None: + value = Color(0, 0, 0) + else: + assert isinstance(value, Color), 'Expected Color for ladybug_display ' \ + 'object color. Got {}.'.format(type(value)) + self._color = value + + @property + def x(self): + """Get the X coordinate.""" + return self._geometry.x + + @property + def y(self): + """Get the Y coordinate.""" + return self._geometry.y + + @property + def magnitude(self): + """Get the magnitude of the vector.""" + return self._geometry.magnitude + +
[docs] def normalize(self): + """Ensure that this DisplayVector2D is a unit vector (magnitude=1).""" + self._geometry = self._geometry.normalize()
+ +
[docs] def reverse(self): + """Get a copy of this vector that is reversed.""" + self._geometry = self._geometry.__neg__()
+ +
[docs] def dot(self, other): + """Get the dot product of this vector with another DisplayVector2D.""" + return self.geometry.dot(other.geometry)
+ +
[docs] def angle(self, other): + """Get the angle between this vector and another DisplayVector2D in degrees.""" + return math.degrees(self.geometry.angle(other.geometry))
+ +
[docs] def rotate(self, angle): + """Rotate this geometry by a certain angle around an axis and origin. + + Args: + axis: A ladybug_geometry Vector2D axis representing the axis of rotation. + angle: An angle for rotation in degrees. + """ + self._geometry = self.geometry.rotate(math.radians(angle))
+ +
[docs] def reflect(self, normal): + """Reflect this geometry across a plane with the input normal vector. + + Args: + normal: A Vector2D representing the normal vector for the plane across + which the vector will be reflected. THIS VECTOR MUST BE NORMALIZED. + """ + self._geometry = self.geometry.reflect(normal)
+ +
[docs] def to_dict(self): + """Return DisplayVector2D as a dictionary. + """ + base = {'type': 'DisplayVector2D'} + base['geometry'] = self._geometry.to_dict() + base['color'] = self.color.to_dict() + if self.user_data is not None: + base['user_data'] = self.user_data + return base
+ + def __copy__(self): + new_g = DisplayVector2D(self.geometry, self.color) + new_g._user_data = None if self.user_data is None else self.user_data.copy() + return new_g + + def __getitem__(self, key): + return (self.x, self.y)[key] + + def __iter__(self): + return iter((self.x, self.y)) + + def __mul__(self, other): + assert type(other) in (int, float), 'Cannot multiply types {} and {}'.format( + self.__class__.__name__, type(other)) + new_g = DisplayVector2D(self.geometry * other, self.color) + new_g._user_data = None if self.user_data is None else self.user_data.copy() + return new_g + + def __div__(self, other): + assert type(other) in (int, float), 'Cannot divide types {} and {}'.format( + self.__class__.__name__, type(other)) + new_g = DisplayVector2D(self.geometry / other, self.color) + new_g._user_data = None if self.user_data is None else self.user_data.copy() + return new_g + + def __repr__(self): + return 'DisplayVector2D: {}'.format(self.geometry)
+
+ +
+ +
+
+
+
+

+ Back to top + +

+

+ © Copyright 2024, Ladybug Tools.
+ Created using Sphinx 5.3.0.
+

+
+
+ + \ No newline at end of file diff --git a/docs/_modules/ladybug_display/geometry3d/arc.html b/docs/_modules/ladybug_display/geometry3d/arc.html new file mode 100644 index 0000000..5a2fcc8 --- /dev/null +++ b/docs/_modules/ladybug_display/geometry3d/arc.html @@ -0,0 +1,1055 @@ + + + + + + + ladybug_display.geometry3d.arc — ladybug-display documentation + + + + + + + + + + + + + + + + + + + + + + + + +
+
+ +
+ +

Source code for ladybug_display.geometry3d.arc

+"""An arc that can be displayed in 3D space."""
+import math
+
+from ladybug_geometry.geometry3d.arc import Arc3D
+from ladybug.color import Color
+
+from ladybug_display.altnumber import default
+from ._base import _LineCurveBase3D
+
+
+
[docs]class DisplayArc3D(_LineCurveBase3D): + """An arc in 3D space with display properties. + + Args: + geometry: A ladybug-geometry Arc3D object. + color: A ladybug Color object. If None, a default black color will be + used. (Default: None). + line_width: Number for line width in pixels (for the screen). For print, + this will be converted a value in millimeters or inches assuming + standard web resolution (72 pixels per inch). This can also be the + Default object to indicate that the default settings of the + interface should be used (typically one pixel). + line_type: Get or set text to indicate the type of line to display. + Choose from the following. (Default: "Continuous") + + * Continuous + * Dashed + * Dotted + * DashDot + + Properties: + * geometry + * color + * line_width + * line_type + * plane + * radius + * p1 + * p2 + * c + * angle + * length + * is_circle + * user_data + """ + __slots__ = () + + def __init__(self, geometry, color=None, line_width=default, line_type='Continuous'): + """Initialize base with shade object.""" + assert isinstance(geometry, Arc3D), '\ + Expected ladybug_geometry Arc3D. Got {}'.format(type(geometry)) + _LineCurveBase3D.__init__(self, geometry, color, line_width, line_type) + +
[docs] @classmethod + def from_dict(cls, data): + """Initialize a DisplayArc3D from a dictionary. + + Args: + data: A dictionary representation of an DisplayArc3D object. + """ + assert data['type'] == 'DisplayArc3D', \ + 'Expected DisplayArc3D dictionary. Got {}.'.format(data['type']) + color = Color.from_dict(data['color']) if 'color' in data and data['color'] \ + is not None else None + lw = default if 'line_width' not in data or \ + data['line_width'] == default.to_dict() else data['line_width'] + lt = data['line_type'] if 'line_type' in data and data['line_type'] \ + is not None else 'Continuous' + geo = cls(Arc3D.from_dict(data['geometry']), color, lw, lt) + if 'user_data' in data and data['user_data'] is not None: + geo.user_data = data['user_data'] + return geo
+ + @property + def plane(self): + """Get a Plane which the arc lies with an origin representing the center.""" + return self._geometry.plane + + @property + def radius(self): + """Get a number for the radius of the arc.""" + return self._geometry.radius + + @property + def p1(self): + """Get a Point3D representing the first end point of the arc.""" + return self._geometry.p1 + + @property + def p2(self): + """Get a Point3D representing the second end point of the arc.""" + return self._geometry.p2 + + @property + def c(self): + """Get a Point3D representing the center of the arc.""" + return self._geometry.c + + @property + def angle(self): + """The total angle over the domain of the arc in degrees.""" + return math.degrees(self._geometry.angle) + + @property + def length(self): + """Get a number for the length of the arc.""" + return self._geometry.length + + @property + def is_circle(self): + """Get a boolean for whether the arc is a circle.""" + return self._geometry.is_circle + +
[docs] def to_dict(self): + """Return DisplayArc3D as a dictionary.""" + base = {'type': 'DisplayArc3D'} + base['geometry'] = self._geometry.to_dict() + base['color'] = self.color.to_dict() + base['line_width'] = default.to_dict() if \ + self.line_width == default else self.line_width + base['line_type'] = self.line_type + if self.user_data is not None: + base['user_data'] = self.user_data + return base
+ + def __copy__(self): + new_g = DisplayArc3D( + self.geometry, self.color, self.line_width, self.line_type) + new_g._user_data = None if self.user_data is None else self.user_data.copy() + return new_g + + def __repr__(self): + return 'DisplayArc3D: {}'.format(self.geometry)
+
+ +
+ +
+
+
+
+

+ Back to top + +

+

+ © Copyright 2024, Ladybug Tools.
+ Created using Sphinx 5.3.0.
+

+
+
+ + \ No newline at end of file diff --git a/docs/_modules/ladybug_display/geometry3d/cone.html b/docs/_modules/ladybug_display/geometry3d/cone.html new file mode 100644 index 0000000..aefed94 --- /dev/null +++ b/docs/_modules/ladybug_display/geometry3d/cone.html @@ -0,0 +1,1029 @@ + + + + + + + ladybug_display.geometry3d.cone — ladybug-display documentation + + + + + + + + + + + + + + + + + + + + + + + + +
+
+ +
+ +

Source code for ladybug_display.geometry3d.cone

+"""A cone that can be displayed in 3D space."""
+from ladybug_geometry.geometry3d.cone import Cone
+from ladybug.color import Color
+
+from ._base import _SingleColorModeBase3D
+
+
+
[docs]class DisplayCone(_SingleColorModeBase3D): + """A cone in 3D space with display properties. + + Args: + geometry: A ladybug-geometry Cone. + color: A ladybug Color object. If None, a default black color will be + used. (Default: None). + display_mode: Text to indicate the display mode (surface, wireframe, etc.). + Choose from the following. (Default: Surface). + + * Surface + * SurfaceWithEdges + * Wireframe + * Points + + Properties: + * geometry + * color + * display_mode + * vertex + * axis + * height + * radius + * area + * volume + * user_data + """ + __slots__ = () + + def __init__(self, geometry, color=None, display_mode='Surface'): + """Initialize base with shade object.""" + assert isinstance(geometry, Cone), '\ + Expected ladybug_geometry Cone. Got {}'.format(type(geometry)) + _SingleColorModeBase3D.__init__(self, geometry, color, display_mode) + +
[docs] @classmethod + def from_dict(cls, data): + """Initialize a DisplayCone from a dictionary. + + Args: + data: A dictionary representation of an DisplayCone object. + """ + assert data['type'] == 'DisplayCone', \ + 'Expected DisplayCone dictionary. Got {}.'.format(data['type']) + color = Color.from_dict(data['color']) if 'color' in data and data['color'] \ + is not None else None + d_mode = data['display_mode'] if 'display_mode' in data and \ + data['display_mode'] is not None else 'Surface' + geo = cls(Cone.from_dict(data['geometry']), color, d_mode) + if 'user_data' in data and data['user_data'] is not None: + geo.user_data = data['user_data'] + return geo
+ + @property + def vertex(self): + """Get a Point3D for the vertex of the cone.""" + return self._geometry.vertex + + @property + def axis(self): + """Get a Vector3D for the axis of the cone.""" + return self._geometry.axis + + @property + def height(self): + """Get a number for the height of the cone.""" + return self._geometry.height + + @property + def radius(self): + """Get the radius of the cone.""" + return self._geometry.radius + + @property + def area(self): + """Get the surface area of the cone.""" + return self._geometry.area + + @property + def volume(self): + """Get the volume of the cone.""" + return self._geometry.volume + +
[docs] def to_dict(self): + """Return DisplayCone as a dictionary.""" + base = {'type': 'DisplayCone'} + base['geometry'] = self._geometry.to_dict() + base['color'] = self.color.to_dict() + base['display_mode'] = self.display_mode + if self.user_data is not None: + base['user_data'] = self.user_data + return base
+ + def __copy__(self): + new_g = DisplayCone(self.geometry, self.color, self.display_mode) + new_g._user_data = None if self.user_data is None else self.user_data.copy() + return new_g + + def __repr__(self): + return 'DisplayCone: {}'.format(self.geometry)
+
+ +
+ +
+
+
+
+

+ Back to top + +

+

+ © Copyright 2024, Ladybug Tools.
+ Created using Sphinx 5.3.0.
+

+
+
+ + \ No newline at end of file diff --git a/docs/_modules/ladybug_display/geometry3d/cylinder.html b/docs/_modules/ladybug_display/geometry3d/cylinder.html new file mode 100644 index 0000000..746c9ef --- /dev/null +++ b/docs/_modules/ladybug_display/geometry3d/cylinder.html @@ -0,0 +1,1029 @@ + + + + + + + ladybug_display.geometry3d.cylinder — ladybug-display documentation + + + + + + + + + + + + + + + + + + + + + + + + +
+
+ +
+ +

Source code for ladybug_display.geometry3d.cylinder

+"""A cylinder that can be displayed in 3D space."""
+from ladybug_geometry.geometry3d.cylinder import Cylinder
+from ladybug.color import Color
+
+from ._base import _SingleColorModeBase3D
+
+
+
[docs]class DisplayCylinder(_SingleColorModeBase3D): + """A cylinder in 3D space with display properties. + + Args: + geometry: A ladybug-geometry Cylinder. + color: A ladybug Color object. If None, a default black color will be + used. (Default: None). + display_mode: Text to indicate the display mode (surface, wireframe, etc.). + Choose from the following. (Default: Surface). + + * Surface + * SurfaceWithEdges + * Wireframe + * Points + + Properties: + * geometry + * color + * display_mode + * center + * axis + * height + * radius + * area + * volume + * user_data + """ + __slots__ = () + + def __init__(self, geometry, color=None, display_mode='Surface'): + """Initialize base with shade object.""" + assert isinstance(geometry, Cylinder), '\ + Expected ladybug_geometry Cylinder. Got {}'.format(type(geometry)) + _SingleColorModeBase3D.__init__(self, geometry, color, display_mode) + +
[docs] @classmethod + def from_dict(cls, data): + """Initialize a DisplayCylinder from a dictionary. + + Args: + data: A dictionary representation of an DisplayCylinder object. + """ + assert data['type'] == 'DisplayCylinder', \ + 'Expected DisplayCylinder dictionary. Got {}.'.format(data['type']) + color = Color.from_dict(data['color']) if 'color' in data and data['color'] \ + is not None else None + d_mode = data['display_mode'] if 'display_mode' in data and \ + data['display_mode'] is not None else 'Surface' + geo = cls(Cylinder.from_dict(data['geometry']), color, d_mode) + if 'user_data' in data and data['user_data'] is not None: + geo.user_data = data['user_data'] + return geo
+ + @property + def center(self): + """Get a Point3D for the center of the bottom of the cylinder.""" + return self._geometry.center + + @property + def axis(self): + """Get a Vector3D for the axis of the cylinder.""" + return self._geometry.axis + + @property + def height(self): + """Get a number for the height of the cylinder.""" + return self._geometry.height + + @property + def radius(self): + """Get the radius of the cylinder.""" + return self._geometry.radius + + @property + def area(self): + """Get the surface area of the cylinder.""" + return self._geometry.area + + @property + def volume(self): + """Get the volume of the cylinder.""" + return self._geometry.volume + +
[docs] def to_dict(self): + """Return DisplayCylinder as a dictionary.""" + base = {'type': 'DisplayCylinder'} + base['geometry'] = self._geometry.to_dict() + base['color'] = self.color.to_dict() + base['display_mode'] = self.display_mode + if self.user_data is not None: + base['user_data'] = self.user_data + return base
+ + def __copy__(self): + new_g = DisplayCylinder(self.geometry, self.color, self.display_mode) + new_g._user_data = None if self.user_data is None else self.user_data.copy() + return new_g + + def __repr__(self): + return 'DisplayCylinder: {}'.format(self.geometry)
+
+ +
+ +
+
+
+
+

+ Back to top + +

+

+ © Copyright 2024, Ladybug Tools.
+ Created using Sphinx 5.3.0.
+

+
+
+ + \ No newline at end of file diff --git a/docs/_modules/ladybug_display/geometry3d/face.html b/docs/_modules/ladybug_display/geometry3d/face.html new file mode 100644 index 0000000..1145231 --- /dev/null +++ b/docs/_modules/ladybug_display/geometry3d/face.html @@ -0,0 +1,1066 @@ + + + + + + + ladybug_display.geometry3d.face — ladybug-display documentation + + + + + + + + + + + + + + + + + + + + + + + + +
+
+ +
+ +

Source code for ladybug_display.geometry3d.face

+"""A single planar face that can be displayed in 3D space."""
+import math
+
+from ladybug_geometry.geometry3d.face import Face3D
+from ladybug.color import Color
+
+from ._base import _SingleColorModeBase3D
+
+
+
[docs]class DisplayFace3D(_SingleColorModeBase3D): + """A single planar face in 3D space with display properties. + + Args: + geometry: A ladybug-geometry Face3D. + color: A ladybug Color object. If None, a default black color will be + used. (Default: None). + display_mode: Text to indicate the display mode (surface, wireframe, etc.). + Choose from the following. (Default: Surface). + + * Surface + * SurfaceWithEdges + * Wireframe + * Points + + Properties: + * geometry + * color + * display_mode + * vertices + * normal + * center + * area + * perimeter + * min + * max + * altitude + * azimuth + * user_data + """ + __slots__ = () + + def __init__(self, geometry, color=None, display_mode='Surface'): + """Initialize object.""" + assert isinstance(geometry, Face3D), '\ + Expected ladybug_geometry Face3D. Got {}'.format(type(geometry)) + _SingleColorModeBase3D.__init__(self, geometry, color, display_mode) + +
[docs] @classmethod + def from_dict(cls, data): + """Initialize a DisplayFace3D from a dictionary. + + Args: + data: A dictionary representation of an DisplayFace3D object. + """ + assert data['type'] == 'DisplayFace3D', \ + 'Expected DisplayFace3D dictionary. Got {}.'.format(data['type']) + color = Color.from_dict(data['color']) if 'color' in data and data['color'] \ + is not None else None + d_mode = data['display_mode'] if 'display_mode' in data and \ + data['display_mode'] is not None else 'Surface' + geo = cls(Face3D.from_dict(data['geometry']), color, d_mode) + if 'user_data' in data and data['user_data'] is not None: + geo.user_data = data['user_data'] + return geo
+ + @property + def vertices(self): + """Get a list of vertices for the face (in counter-clockwise order).""" + return self._geometry.vertices + + @property + def normal(self): + """Get a Vector3D for the direction in which the face is pointing. + """ + return self._geometry.normal + + @property + def center(self): + """Get a Point3D for the center of the face. + + Note that this is the center of the bounding rectangle around this geometry + and not the area centroid. + """ + return self._geometry.center + + @property + def area(self): + """Get the area of the face.""" + return self._geometry.area + + @property + def perimeter(self): + """Get the perimeter of the face. This includes the length of holes in the face. + """ + return self._geometry.perimeter + + @property + def min(self): + """Get a Point3D for the minimum of the bounding box around the object.""" + return self._geometry.min + + @property + def max(self): + """Get a Point3D for the maximum of the bounding box around the object.""" + return self._geometry.max + + @property + def altitude(self): + """Get the altitude of the geometry between +90 (up) and -90 (down).""" + return math.degrees(self._geometry.altitude) + + @property + def azimuth(self): + """Get the azimuth of the geometry, between 0 and 360. + + Given Y-axis as North, 0 = North, 90 = East, 180 = South, 270 = West + This will be zero if the Face3D is perfectly horizontal. + """ + return math.degrees(self._geometry.azimuth) + +
[docs] def to_dict(self, include_plane=True): + """Return DisplayFace3D as a dictionary. + + Args: + include_plane: Boolean to note wether the plane of the Face3D should be + included in the output. This can preserve the orientation of the + X/Y axes of the plane but is not required and can be removed to + keep the dictionary smaller. (Default: True). + """ + base = {'type': 'DisplayFace3D'} + base['geometry'] = self._geometry.to_dict(include_plane) + base['color'] = self.color.to_dict() + base['display_mode'] = self.display_mode + if self.user_data is not None: + base['user_data'] = self.user_data + return base
+ + def __copy__(self): + new_g = DisplayFace3D(self.geometry, self.color, self.display_mode) + new_g._user_data = None if self.user_data is None else self.user_data.copy() + return new_g + + def __repr__(self): + return 'DisplayFace3D: {}'.format(self.geometry)
+
+ +
+ +
+
+
+
+

+ Back to top + +

+

+ © Copyright 2024, Ladybug Tools.
+ Created using Sphinx 5.3.0.
+

+
+
+ + \ No newline at end of file diff --git a/docs/_modules/ladybug_display/geometry3d/line.html b/docs/_modules/ladybug_display/geometry3d/line.html new file mode 100644 index 0000000..2a01fdf --- /dev/null +++ b/docs/_modules/ladybug_display/geometry3d/line.html @@ -0,0 +1,1035 @@ + + + + + + + ladybug_display.geometry3d.line — ladybug-display documentation + + + + + + + + + + + + + + + + + + + + + + + + +
+
+ +
+ +

Source code for ladybug_display.geometry3d.line

+"""A line segment that can be displayed in 3D space."""
+from ladybug_geometry.geometry3d.line import LineSegment3D
+from ladybug.color import Color
+
+from ladybug_display.altnumber import default
+from ._base import _LineCurveBase3D
+
+
+
[docs]class DisplayLineSegment3D(_LineCurveBase3D): + """A single line segment in 3D space with display properties. + + Args: + geometry: A ladybug-geometry LineSegment3D object. + color: A ladybug Color object. If None, a default black color will be + used. (Default: None). + line_width: Number for line width in pixels (for the screen). For print, + this will be converted a value in millimeters or inches assuming + standard web resolution (72 pixels per inch). This can also be the + Default object to indicate that the default settings of the + interface should be used (typically one pixel). + line_type: Get or set text to indicate the type of line to display. + Choose from the following. (Default: "Continuous") + + * Continuous + * Dashed + * Dotted + * DashDot + + Properties: + * geometry + * color + * line_width + * line_type + * p + * v + * p1 + * p2 + * length + * user_data + """ + __slots__ = () + + def __init__(self, geometry, color=None, line_width=default, line_type='Continuous'): + """Initialize base with shade object.""" + assert isinstance(geometry, LineSegment3D), '\ + Expected ladybug_geometry LineSegment3D. Got {}'.format(type(geometry)) + _LineCurveBase3D.__init__(self, geometry, color, line_width, line_type) + +
[docs] @classmethod + def from_dict(cls, data): + """Initialize a DisplayLineSegment3D from a dictionary. + + Args: + data: A dictionary representation of an DisplayLineSegment3D object. + """ + assert data['type'] == 'DisplayLineSegment3D', \ + 'Expected DisplayLineSegment3D dictionary. Got {}.'.format(data['type']) + color = Color.from_dict(data['color']) if 'color' in data and data['color'] \ + is not None else None + lw = default if 'line_width' not in data or \ + data['line_width'] == default.to_dict() else data['line_width'] + lt = data['line_type'] if 'line_type' in data and data['line_type'] \ + is not None else 'Continuous' + geo = cls(LineSegment3D.from_dict(data['geometry']), color, lw, lt) + if 'user_data' in data and data['user_data'] is not None: + geo.user_data = data['user_data'] + return geo
+ + @property + def p(self): + """Get a Point3D representing the base of the line segment.""" + return self._geometry.p + + @property + def v(self): + """Get a Vector3D representing the direction of the line segment.""" + return self._geometry.v + + @property + def p1(self): + """Get a Point3D representing the first point of the line segment.""" + return self._geometry.p1 + + @property + def p2(self): + """Get a Point3D representing the second point of the line segment.""" + return self._geometry.p2 + + @property + def length(self): + """Get a number for the length of the line segment.""" + return self._geometry.length + +
[docs] def to_dict(self): + """Return DisplayLineSegment3D as a dictionary.""" + base = {'type': 'DisplayLineSegment3D'} + base['geometry'] = self._geometry.to_dict() + base['color'] = self.color.to_dict() + base['line_width'] = default.to_dict() if \ + self.line_width == default else self.line_width + base['line_type'] = self.line_type + if self.user_data is not None: + base['user_data'] = self.user_data + return base
+ + def __copy__(self): + new_g = DisplayLineSegment3D( + self.geometry, self.color, self.line_width, self.line_type) + new_g._user_data = None if self.user_data is None else self.user_data.copy() + return new_g + + def __repr__(self): + return 'DisplayLineSegment3D: {}'.format(self.geometry)
+
+ +
+ +
+
+
+
+

+ Back to top + +

+

+ © Copyright 2024, Ladybug Tools.
+ Created using Sphinx 5.3.0.
+

+
+
+ + \ No newline at end of file diff --git a/docs/_modules/ladybug_display/geometry3d/mesh.html b/docs/_modules/ladybug_display/geometry3d/mesh.html new file mode 100644 index 0000000..183a96d --- /dev/null +++ b/docs/_modules/ladybug_display/geometry3d/mesh.html @@ -0,0 +1,1053 @@ + + + + + + + ladybug_display.geometry3d.mesh — ladybug-display documentation + + + + + + + + + + + + + + + + + + + + + + + + +
+
+ +
+ +

Source code for ladybug_display.geometry3d.mesh

+"""A mesh in 3D space with display properties."""
+from ladybug_geometry.geometry3d.mesh import Mesh3D
+from ladybug.color import Color
+
+from ._base import _SingleColorModeBase3D
+
+
+
[docs]class DisplayMesh3D(_SingleColorModeBase3D): + """A mesh in 3D space with display properties. + + Args: + geometry: A ladybug-geometry Mesh3D. + color: A ladybug Color object. If None, a default black color will be + used. (Default: None). + display_mode: Text to indicate the display mode (surface, wireframe, etc.). + Choose from the following. (Default: Surface). + + * Surface + * SurfaceWithEdges + * Wireframe + * Points + + Properties: + * geometry + * color + * display_mode + * vertices + * faces + * min + * max + * center + * area + * face_areas + * face_centroids + * face_normals + * vertex_normals + * user_data + """ + __slots__ = () + + def __init__(self, geometry, color=None, display_mode='Surface'): + """Initialize base with shade object.""" + assert isinstance(geometry, Mesh3D), '\ + Expected ladybug_geometry Mesh3D. Got {}'.format(type(geometry)) + _SingleColorModeBase3D.__init__(self, geometry, color, display_mode) + +
[docs] @classmethod + def from_dict(cls, data): + """Initialize a DisplayMesh3D from a dictionary. + + Args: + data: A dictionary representation of an DisplayMesh3D object. + """ + assert data['type'] == 'DisplayMesh3D', \ + 'Expected DisplayMesh3D dictionary. Got {}.'.format(data['type']) + color = Color.from_dict(data['color']) if 'color' in data and data['color'] \ + is not None else None + d_mode = data['display_mode'] if 'display_mode' in data and \ + data['display_mode'] is not None else 'Surface' + geo = cls(Mesh3D.from_dict(data['geometry']), color, d_mode) + if 'user_data' in data and data['user_data'] is not None: + geo.user_data = data['user_data'] + return geo
+ + @property + def vertices(self): + """Get a tuple of vertices in the mesh.""" + return self._geometry.vertices + + @property + def faces(self): + """Get a tuple of all faces in the mesh.""" + return self._geometry.faces + + @property + def min(self): + """Get a Point3D for the minimum of the bounding box around the object.""" + return self._geometry.min + + @property + def max(self): + """Get a Point3D for the maximum of the bounding box around the object.""" + return self._geometry.max + + @property + def center(self): + """Get a Point3D for the center of the bounding box around the object.""" + return self._geometry.center + + @property + def area(self): + """Get the area of the mesh.""" + return self._geometry.area + + @property + def face_areas(self): + """Get a tuple with the area of each face in the mesh.""" + return self._geometry.face_areas + + @property + def face_centroids(self): + """Get a tuple with the centroid of each face in the mesh.""" + return self._geometry.face_centroids + + @property + def face_normals(self): + """Get a tuple of Vector3D objects for all face normals.""" + return self._geometry.face_normals + + @property + def vertex_normals(self): + """Get a tuple of Vector3D objects for all vertex normals.""" + return self._geometry.vertex_normals + +
[docs] def to_dict(self): + """Return DisplayMesh3D as a dictionary.""" + base = {'type': 'DisplayMesh3D'} + base['geometry'] = self._geometry.to_dict() + base['color'] = self.color.to_dict() + base['display_mode'] = self.display_mode + if self.user_data is not None: + base['user_data'] = self.user_data + return base
+ + def __copy__(self): + new_g = DisplayMesh3D(self.geometry, self.color, self.display_mode) + new_g._user_data = None if self.user_data is None else self.user_data.copy() + return new_g + + def __repr__(self): + return 'DisplayMesh3D: {}'.format(self.geometry)
+
+ +
+ +
+
+
+
+

+ Back to top + +

+

+ © Copyright 2024, Ladybug Tools.
+ Created using Sphinx 5.3.0.
+

+
+
+ + \ No newline at end of file diff --git a/docs/_modules/ladybug_display/geometry3d/plane.html b/docs/_modules/ladybug_display/geometry3d/plane.html new file mode 100644 index 0000000..7ef87d6 --- /dev/null +++ b/docs/_modules/ladybug_display/geometry3d/plane.html @@ -0,0 +1,1050 @@ + + + + + + + ladybug_display.geometry3d.plane — ladybug-display documentation + + + + + + + + + + + + + + + + + + + + + + + + +
+
+ +
+ +

Source code for ladybug_display.geometry3d.plane

+"""A plane that can be displayed in 3D space."""
+from ladybug_geometry.geometry3d.plane import Plane
+from ladybug.color import Color
+
+from ._base import _SingleColorBase3D
+
+
+
[docs]class DisplayPlane(_SingleColorBase3D): + """A plane in 3D space with display properties. + + Args: + geometry: A ladybug-geometry Plane object. + color: A ladybug Color object. If None, a default black color will be + used. (Default: None). + show_axes: A boolean to note whether the plane should be displayed with + XY axes instead of just an origin point and a normal vector. + show_grid: A boolean to note whether the plane should be displayed + with a grid. + + Properties: + * geometry + * color + * show_axes + * show_grid + * o + * n + * x + * y + * k + * user_data + """ + __slots__ = ('_show_axes', '_show_grid') + + def __init__(self, geometry, color=None, show_axes=False, show_grid=False): + """Initialize base with shade object.""" + assert isinstance(geometry, Plane), '\ + Expected ladybug_geometry Plane. Got {}'.format(type(geometry)) + _SingleColorBase3D.__init__(self, geometry, color) + self.show_axes = show_axes + self.show_grid = show_grid + +
[docs] @classmethod + def from_dict(cls, data): + """Initialize a DisplayPlane from a dictionary. + + Args: + data: A dictionary representation of an DisplayPlane object. + """ + assert data['type'] == 'DisplayPlane', \ + 'Expected DisplayPlane dictionary. Got {}.'.format(data['type']) + color = Color.from_dict(data['color']) if 'color' in data and data['color'] \ + is not None else None + ax = data['show_axes'] if 'show_axes' in data else False + gd = data['show_grid'] if 'show_grid' in data else False + geo = cls(Plane.from_dict(data['geometry']), color, ax, gd) + if 'user_data' in data and data['user_data'] is not None: + geo.user_data = data['user_data'] + return geo
+ + @property + def show_axes(self): + """Get or set a boolean for whether to display the XY axes of the plane.""" + return self._show_axes + + @show_axes.setter + def show_axes(self, value): + try: + self._show_axes = bool(value) + except TypeError: + raise TypeError( + 'Expected boolean for DisplayPlane.show_axes. Got {}.'.format(value)) + + @property + def show_grid(self): + """Get or set a boolean for whether to display the grid of the plane.""" + return self._show_grid + + @show_grid.setter + def show_grid(self, value): + try: + self._show_grid = bool(value) + except TypeError: + raise TypeError( + 'Expected boolean for DisplayPlane.show_grid. Got {}.'.format(value)) + + @property + def o(self): + """Get a Point3D representing the origin of the plane.""" + return self._geometry.o + + @property + def n(self): + """Get a Vector3D representing the normal of the plane.""" + return self._geometry.n + + @property + def x(self): + """Get aVector3D representing the x axis of the plane.""" + return self._geometry.x + + @property + def y(self): + """Get a Vector3D representing the y axis of the plane.""" + return self._geometry.y + + @property + def k(self): + """Get a number for the constant of the plane.""" + return self._geometry.k + +
[docs] def to_dict(self): + """Return DisplayPlane as a dictionary.""" + base = {'type': 'DisplayPlane'} + base['geometry'] = self._geometry.to_dict() + base['color'] = self.color.to_dict() + base['show_axes'] = self.show_axes + base['show_grid'] = self.show_grid + if self.user_data is not None: + base['user_data'] = self.user_data + return base
+ + def __copy__(self): + new_g = DisplayPlane(self.geometry, self.color, self.show_axes, self.show_grid) + new_g._user_data = None if self.user_data is None else self.user_data.copy() + return new_g + + def __repr__(self): + return 'DisplayPlane: {}'.format(self.geometry)
+
+ +
+ +
+
+
+
+

+ Back to top + +

+

+ © Copyright 2024, Ladybug Tools.
+ Created using Sphinx 5.3.0.
+

+
+
+ + \ No newline at end of file diff --git a/docs/_modules/ladybug_display/geometry3d/point.html b/docs/_modules/ladybug_display/geometry3d/point.html new file mode 100644 index 0000000..442ee14 --- /dev/null +++ b/docs/_modules/ladybug_display/geometry3d/point.html @@ -0,0 +1,1032 @@ + + + + + + + ladybug_display.geometry3d.point — ladybug-display documentation + + + + + + + + + + + + + + + + + + + + + + + + +
+
+ +
+ +

Source code for ladybug_display.geometry3d.point

+"""A point that can be displayed in 3D space."""
+from ladybug_geometry.geometry3d.pointvector import Point3D
+from ladybug.color import Color
+
+from ._base import _SingleColorBase3D
+from ladybug_display.altnumber import default
+from ladybug_display.typing import float_positive
+
+
+
[docs]class DisplayPoint3D(_SingleColorBase3D): + """A point in 3D space with display properties. + + Args: + geometry: A ladybug-geometry Point3D object. + color: A ladybug Color object. If None, a default black color will be + used. (Default: None). + radius: Number for radius in pixels (for the screen) or millimeters + (in print). This can also be the Default object to indicate that the + default settings of the interface should be used. + + Properties: + * geometry + * color + * radius + * x + * y + * z + * user_data + """ + __slots__ = ('_radius',) + + def __init__(self, geometry, color=None, radius=default): + """Initialize base with shade object.""" + assert isinstance(geometry, Point3D), '\ + Expected ladybug_geometry Point3D. Got {}'.format(type(geometry)) + _SingleColorBase3D.__init__(self, geometry, color) + self.radius = radius + +
[docs] @classmethod + def from_dict(cls, data): + """Initialize a DisplayPoint3D from a dictionary. + + Args: + data: A dictionary representation of an DisplayPoint3D object. + """ + assert data['type'] == 'DisplayPoint3D', \ + 'Expected DisplayPoint3D dictionary. Got {}.'.format(data['type']) + color = Color.from_dict(data['color']) if 'color' in data and data['color'] \ + is not None else None + rad = default if 'radius' not in data or \ + data['radius'] == default.to_dict() else data['radius'] + geo = cls(Point3D.from_dict(data['geometry']), color, rad) + if 'user_data' in data and data['user_data'] is not None: + geo.user_data = data['user_data'] + return geo
+ + @property + def radius(self): + """Get or set a number for the radius of this object.""" + return self._radius + + @radius.setter + def radius(self, value): + if value == default: + self._radius = default + else: + self._radius = float_positive(value, 'point radius') + + @property + def x(self): + """Get the X coordinate.""" + return self._geometry.x + + @property + def y(self): + """Get the Y coordinate.""" + return self._geometry.y + + @property + def z(self): + """Get the Z coordinate.""" + return self._geometry.z + +
[docs] def distance_to_point(self, point): + """Get the distance from this point to another DisplayPoint3D.""" + return self.geometry.distance_to_point(point.geometry)
+ +
[docs] def to_dict(self): + """Return DisplayPoint3D as a dictionary.""" + base = {'type': 'DisplayPoint3D'} + base['geometry'] = self._geometry.to_dict() + base['color'] = self.color.to_dict() + base['radius'] = default.to_dict() if self.radius == default else self.radius + if self.user_data is not None: + base['user_data'] = self.user_data + return base
+ + def __copy__(self): + new_g = DisplayPoint3D(self.geometry, self.color, self.radius) + new_g._user_data = None if self.user_data is None else self.user_data.copy() + return new_g + + def __getitem__(self, key): + return (self.x, self.y, self.z)[key] + + def __iter__(self): + return iter((self.x, self.y, self.z)) + + def __repr__(self): + return 'DisplayPoint3D: {}'.format(self.geometry)
+
+ +
+ +
+
+
+
+

+ Back to top + +

+

+ © Copyright 2024, Ladybug Tools.
+ Created using Sphinx 5.3.0.
+

+
+
+ + \ No newline at end of file diff --git a/docs/_modules/ladybug_display/geometry3d/polyface.html b/docs/_modules/ladybug_display/geometry3d/polyface.html new file mode 100644 index 0000000..38e1499 --- /dev/null +++ b/docs/_modules/ladybug_display/geometry3d/polyface.html @@ -0,0 +1,1091 @@ + + + + + + + ladybug_display.geometry3d.polyface — ladybug-display documentation + + + + + + + + + + + + + + + + + + + + + + + + +
+
+ +
+ +

Source code for ladybug_display.geometry3d.polyface

+"""A polyface in 3D space with display properties."""
+from ladybug_geometry.geometry3d.polyface import Polyface3D
+from ladybug.color import Color
+
+from ._base import _SingleColorModeBase3D
+
+
+
[docs]class DisplayPolyface3D(_SingleColorModeBase3D): + """A polyface in 3D space with display properties. + + Args: + geometry: A ladybug-geometry Polyface3D. + color: A ladybug Color object. If None, a default black color will be + used. (Default: None). + display_mode: Text to indicate the display mode (surface, wireframe, etc.). + Choose from the following. (Default: Surface). + + * Surface + * SurfaceWithEdges + * Wireframe + * Points + + Properties: + * geometry + * color + * display_mode + * vertices + * faces + * edges + * naked_edges + * internal_edges + * non_manifold_edges + * face_indices + * edge_indices + * edge_types + * min + * max + * center + * area + * volume + * is_solid + * user_data + """ + __slots__ = () + + def __init__(self, geometry, color=None, display_mode='Surface'): + """Initialize base with shade object.""" + assert isinstance(geometry, Polyface3D), '\ + Expected ladybug_geometry Polyface3D. Got {}'.format(type(geometry)) + _SingleColorModeBase3D.__init__(self, geometry, color, display_mode) + +
[docs] @classmethod + def from_dict(cls, data): + """Initialize a DisplayPolyface3D from a dictionary. + + Args: + data: A dictionary representation of an DisplayPolyface3D object. + """ + assert data['type'] == 'DisplayPolyface3D', \ + 'Expected DisplayPolyface3D dictionary. Got {}.'.format(data['type']) + color = Color.from_dict(data['color']) if 'color' in data and data['color'] \ + is not None else None + d_mode = data['display_mode'] if 'display_mode' in data and \ + data['display_mode'] is not None else 'Surface' + geo = cls(Polyface3D.from_dict(data['geometry']), color, d_mode) + if 'user_data' in data and data['user_data'] is not None: + geo.user_data = data['user_data'] + return geo
+ + @property + def vertices(self): + """Get a tuple of vertices in the polyface.""" + return self._geometry.vertices + + @property + def faces(self): + """Get a tuple of all Face3D objects making up this polyface.""" + return self._geometry.faces + + @property + def edges(self): + """Get a tuple of all edges in this polyface as LineSegment3D objects.""" + return self._geometry.edges + + @property + def naked_edges(self): + """Get a tuple of all naked edges in this polyface as LineSegment3D objects.""" + return self._geometry.naked_edges + + @property + def internal_edges(self): + """Get a tuple of all internal edges in this polyface as LineSegment3D objects. + """ + return self._geometry.internal_edges + + @property + def non_manifold_edges(self): + """Get a tuple of all non-manifold edges as LineSegment3D objects.""" + return self._geometry.non_manifold_edges + + @property + def face_indices(self): + """Get a tuple of face tuples with integers corresponding to indices of vertices. + """ + return self._geometry.face_indices + + @property + def edge_indices(self): + """Get a tuple of edge tuples with integers corresponding to indices of vertices. + """ + return self._geometry.edge_indices + + @property + def edge_types(self): + """Get a tuple of integers for each edge that denotes the type of edge. + + 0 denotes a naked edge, 1 denotes an internal edge, and anything higher is a + non-manifold edge. + """ + return self._geometry.edge_types + + @property + def min(self): + """Get a Point3D for the minimum of the bounding box around the object.""" + return self._geometry.min + + @property + def max(self): + """Get a Point3D for the maximum of the bounding box around the object.""" + return self._geometry.max + + @property + def center(self): + """Get a Point3D for the center of the bounding box around the object.""" + return self._geometry.center + + @property + def area(self): + """Get the area of the polyface.""" + return self._geometry.area + + @property + def volume(self): + """Get the volume of the polyface.""" + return self._geometry.volume + + @property + def is_solid(self): + """Get a boolean to note whether the polyface is solid (True) or is open (False). + """ + return self._geometry.is_solid + +
[docs] def to_dict(self): + """Return DisplayPolyface3D as a dictionary.""" + base = {'type': 'DisplayPolyface3D'} + base['geometry'] = self._geometry.to_dict() + base['color'] = self.color.to_dict() + base['display_mode'] = self.display_mode + if self.user_data is not None: + base['user_data'] = self.user_data + return base
+ + def __copy__(self): + new_g = DisplayPolyface3D(self.geometry, self.color, self.display_mode) + new_g._user_data = None if self.user_data is None else self.user_data.copy() + return new_g + + def __repr__(self): + return 'DisplayPolyface3D: {}'.format(self.geometry)
+
+ +
+ +
+
+
+
+

+ Back to top + +

+

+ © Copyright 2024, Ladybug Tools.
+ Created using Sphinx 5.3.0.
+

+
+
+ + \ No newline at end of file diff --git a/docs/_modules/ladybug_display/geometry3d/polyline.html b/docs/_modules/ladybug_display/geometry3d/polyline.html new file mode 100644 index 0000000..2239502 --- /dev/null +++ b/docs/_modules/ladybug_display/geometry3d/polyline.html @@ -0,0 +1,1054 @@ + + + + + + + ladybug_display.geometry3d.polyline — ladybug-display documentation + + + + + + + + + + + + + + + + + + + + + + + + +
+
+ +
+ +

Source code for ladybug_display.geometry3d.polyline

+"""A polyline that can be displayed in 3D space."""
+from ladybug_geometry.geometry3d.polyline import Polyline3D
+from ladybug.color import Color
+
+from ladybug_display.altnumber import default
+from ._base import _LineCurveBase3D
+
+
+
[docs]class DisplayPolyline3D(_LineCurveBase3D): + """A polyline in 3D space with display properties. + + Args: + geometry: A ladybug-geometry Polyline3D object. + color: A ladybug Color object. If None, a default black color will be + used. (Default: None). + line_width: Number for line width in pixels (for the screen). For print, + this will be converted a value in millimeters or inches assuming + standard web resolution (72 pixels per inch). This can also be the + Default object to indicate that the default settings of the + interface should be used (typically one pixel). + line_type: Get or set text to indicate the type of line to display. + Choose from the following. (Default: "Continuous") + + * Continuous + * Dashed + * Dotted + * DashDot + + Properties: + * geometry + * color + * line_width + * line_type + * vertices + * segments + * interpolated + * p1 + * p2 + * length + * min + * max + * user_data + """ + __slots__ = () + + def __init__(self, geometry, color=None, line_width=default, line_type='Continuous'): + """Initialize base with shade object.""" + assert isinstance(geometry, Polyline3D), '\ + Expected ladybug_geometry Polyline3D. Got {}'.format(type(geometry)) + _LineCurveBase3D.__init__(self, geometry, color, line_width, line_type) + +
[docs] @classmethod + def from_dict(cls, data): + """Initialize a DisplayPolyline3D from a dictionary. + + Args: + data: A dictionary representation of an DisplayPolyline3D object. + """ + assert data['type'] == 'DisplayPolyline3D', \ + 'Expected DisplayPolyline3D dictionary. Got {}.'.format(data['type']) + color = Color.from_dict(data['color']) if 'color' in data and data['color'] \ + is not None else None + lw = default if 'line_width' not in data or \ + data['line_width'] == default.to_dict() else data['line_width'] + lt = data['line_type'] if 'line_type' in data and data['line_type'] \ + is not None else 'Continuous' + geo = cls(Polyline3D.from_dict(data['geometry']), color, lw, lt) + if 'user_data' in data and data['user_data'] is not None: + geo.user_data = data['user_data'] + return geo
+ + @property + def vertices(self): + """Get a tuple of Point3D for the vertices of the polyline.""" + return self._geometry.vertices + + @property + def segments(self): + """Get a tuple of LineSegment3D for the segments of the polyline.""" + return self._geometry.segments + + @property + def interpolated(self): + """Get a boolean for whether the polyline should be interpreted as interpolated. + """ + return self._geometry.interpolated + + @property + def p1(self): + """Get a Point3D representing the first end point of the polyline.""" + return self._geometry.p1 + + @property + def p2(self): + """Get a Point3D representing the second end point of the polyline.""" + return self._geometry.p2 + + @property + def length(self): + """Get a number for the length of the polyline.""" + return self._geometry.length + + @property + def min(self): + """Get a Point3D for the minimum of the bounding box around the object.""" + return self._geometry.min + + @property + def max(self): + """Get a Point3D for the maximum of the bounding box around the object.""" + return self._geometry.max + +
[docs] def to_dict(self): + """Return DisplayPolyline3D as a dictionary.""" + base = {'type': 'DisplayPolyline3D'} + base['geometry'] = self._geometry.to_dict() + base['color'] = self.color.to_dict() + base['line_width'] = default.to_dict() if \ + self.line_width == default else self.line_width + base['line_type'] = self.line_type + if self.user_data is not None: + base['user_data'] = self.user_data + return base
+ + def __copy__(self): + new_g = DisplayPolyline3D( + self.geometry, self.color, self.line_width, self.line_type) + new_g._user_data = None if self.user_data is None else self.user_data.copy() + return new_g + + def __repr__(self): + return 'DisplayPolyline3D: {}'.format(self.geometry)
+
+ +
+ +
+
+
+
+

+ Back to top + +

+

+ © Copyright 2024, Ladybug Tools.
+ Created using Sphinx 5.3.0.
+

+
+
+ + \ No newline at end of file diff --git a/docs/_modules/ladybug_display/geometry3d/ray.html b/docs/_modules/ladybug_display/geometry3d/ray.html new file mode 100644 index 0000000..a3970c7 --- /dev/null +++ b/docs/_modules/ladybug_display/geometry3d/ray.html @@ -0,0 +1,998 @@ + + + + + + + ladybug_display.geometry3d.ray — ladybug-display documentation + + + + + + + + + + + + + + + + + + + + + + + + +
+
+ +
+ +

Source code for ladybug_display.geometry3d.ray

+"""A ray that can be displayed in 3D space."""
+from ladybug_geometry.geometry3d.ray import Ray3D
+from ladybug.color import Color
+
+from ._base import _SingleColorBase3D
+
+
+
[docs]class DisplayRay3D(_SingleColorBase3D): + """A ray in 3D space with display properties. + + Args: + geometry: A ladybug-geometry Ray3D object. + color: A ladybug Color object. If None, a default black color will be + used. (Default: None). + + Properties: + * geometry + * color + * p + * v + * user_data + """ + __slots__ = () + + def __init__(self, geometry, color=None): + """Initialize base with shade object.""" + assert isinstance(geometry, Ray3D), '\ + Expected ladybug_geometry Ray3D. Got {}'.format(type(geometry)) + _SingleColorBase3D.__init__(self, geometry, color) + +
[docs] @classmethod + def from_dict(cls, data): + """Initialize a DisplayRay3D from a dictionary. + + Args: + data: A dictionary representation of an DisplayRay3D object. + """ + assert data['type'] == 'DisplayRay3D', \ + 'Expected DisplayRay3D dictionary. Got {}.'.format(data['type']) + color = Color.from_dict(data['color']) if 'color' in data and data['color'] \ + is not None else None + geo = cls(Ray3D.from_dict(data['geometry']), color) + if 'user_data' in data and data['user_data'] is not None: + geo.user_data = data['user_data'] + return geo
+ + @property + def p(self): + """Get a Point3D representing the base of the ray.""" + return self._geometry.p + + @property + def v(self): + """Get a Vector3D representing the direction of the ray.""" + return self._geometry.v + +
[docs] def reverse(self): + """Reverse this DisplayRay3D.""" + self._geometry = self._geometry.reverse()
+ +
[docs] def to_dict(self): + """Return DisplayRay3D as a dictionary.""" + base = {'type': 'DisplayRay3D'} + base['geometry'] = self._geometry.to_dict() + base['color'] = self.color.to_dict() + if self.user_data is not None: + base['user_data'] = self.user_data + return base
+ + def __copy__(self): + new_g = DisplayRay3D(self.geometry, self.color) + new_g._user_data = None if self.user_data is None else self.user_data.copy() + return new_g + + def __repr__(self): + return 'DisplayRay3D: {}'.format(self.geometry)
+
+ +
+ +
+
+
+
+

+ Back to top + +

+

+ © Copyright 2024, Ladybug Tools.
+ Created using Sphinx 5.3.0.
+

+
+
+ + \ No newline at end of file diff --git a/docs/_modules/ladybug_display/geometry3d/sphere.html b/docs/_modules/ladybug_display/geometry3d/sphere.html new file mode 100644 index 0000000..4c79024 --- /dev/null +++ b/docs/_modules/ladybug_display/geometry3d/sphere.html @@ -0,0 +1,1041 @@ + + + + + + + ladybug_display.geometry3d.sphere — ladybug-display documentation + + + + + + + + + + + + + + + + + + + + + + + + +
+
+ +
+ +

Source code for ladybug_display.geometry3d.sphere

+"""A sphere that can be displayed in 3D space."""
+from ladybug_geometry.geometry3d.sphere import Sphere
+from ladybug.color import Color
+
+from ._base import _SingleColorModeBase3D
+
+
+
[docs]class DisplaySphere(_SingleColorModeBase3D): + """A sphere in 3D space with display properties. + + Args: + geometry: A ladybug-geometry Sphere. + color: A ladybug Color object. If None, a default black color will be + used. (Default: None). + display_mode: Text to indicate the display mode (surface, wireframe, etc.). + Choose from the following. (Default: Surface). + + * Surface + * SurfaceWithEdges + * Wireframe + * Points + + Properties: + * geometry + * color + * display_mode + * center + * radius + * min + * max + * diameter + * circumference + * area + * volume + * user_data + """ + __slots__ = () + + def __init__(self, geometry, color=None, display_mode='Surface'): + """Initialize base with shade object.""" + assert isinstance(geometry, Sphere), '\ + Expected ladybug_geometry Sphere. Got {}'.format(type(geometry)) + _SingleColorModeBase3D.__init__(self, geometry, color, display_mode) + +
[docs] @classmethod + def from_dict(cls, data): + """Initialize a DisplaySphere from a dictionary. + + Args: + data: A dictionary representation of an DisplaySphere object. + """ + assert data['type'] == 'DisplaySphere', \ + 'Expected DisplaySphere dictionary. Got {}.'.format(data['type']) + color = Color.from_dict(data['color']) if 'color' in data and data['color'] \ + is not None else None + d_mode = data['display_mode'] if 'display_mode' in data and \ + data['display_mode'] is not None else 'Surface' + geo = cls(Sphere.from_dict(data['geometry']), color, d_mode) + if 'user_data' in data and data['user_data'] is not None: + geo.user_data = data['user_data'] + return geo
+ + @property + def center(self): + """Get a Point3D for the center of the sphere.""" + return self._geometry.center + + @property + def radius(self): + """Get a number for the radius of the sphere.""" + return self._geometry.radius + + @property + def min(self): + """Get a Point3D for the minimum of the bounding box around the object.""" + return self._geometry.min + + @property + def max(self): + """Get a Point3D for the maximum of the bounding box around the object.""" + return self._geometry.max + + @property + def diameter(self): + """Get the diameter of the sphere.""" + return self._geometry.diameter + + @property + def circumference(self): + """Get the circumference of the sphere.""" + return self._geometry.circumference + + @property + def area(self): + """Get the surface area of the sphere.""" + return self._geometry.area + + @property + def volume(self): + """Get the volume of the sphere.""" + return self._geometry.volume + +
[docs] def to_dict(self): + """Return DisplaySphere as a dictionary.""" + base = {'type': 'DisplaySphere'} + base['geometry'] = self._geometry.to_dict() + base['color'] = self.color.to_dict() + base['display_mode'] = self.display_mode + if self.user_data is not None: + base['user_data'] = self.user_data + return base
+ + def __copy__(self): + new_g = DisplaySphere(self.geometry, self.color, self.display_mode) + new_g._user_data = None if self.user_data is None else self.user_data.copy() + return new_g + + def __repr__(self): + return 'DisplaySphere: {}'.format(self.geometry)
+
+ +
+ +
+
+
+
+

+ Back to top + +

+

+ © Copyright 2024, Ladybug Tools.
+ Created using Sphinx 5.3.0.
+

+
+
+ + \ No newline at end of file diff --git a/docs/_modules/ladybug_display/geometry3d/text.html b/docs/_modules/ladybug_display/geometry3d/text.html new file mode 100644 index 0000000..fb31b81 --- /dev/null +++ b/docs/_modules/ladybug_display/geometry3d/text.html @@ -0,0 +1,1150 @@ + + + + + + + ladybug_display.geometry3d.text — ladybug-display documentation + + + + + + + + + + + + + + + + + + + + + + + + +
+
+ +
+ +

Source code for ladybug_display.geometry3d.text

+"""Class for specifying text within the 3D scene."""
+from ladybug_geometry.geometry3d import Plane, Point3D
+from ladybug.color import Color
+
+from ._base import _SingleColorBase3D
+from ladybug_display.typing import float_positive
+
+
+
[docs]class DisplayText3D(_SingleColorBase3D): + """A text object in 3D space with display properties. + + Args: + text: A text string to be displayed in the 3D scene. + plane: A ladybug-geometry Plane object to locate and orient the text in + the 3D scene. + height: A number for the height of the text in the 3D scene. + color: A ladybug Color object. If None, a default black color will be + used. (Default: None). + font: A text string for the font in which to draw the text. Note that this field + may not be interpreted the same on all machines and in all interfaces, + particularly when a machine lacks a given font. (Default: Arial) + horizontal_alignment: String to specify the horizontal alignment + of the text. (Default: Left). Choose from: + + * Left + * Center + * Right + + vertical_alignment: String to specify the vertical alignment + of the text. (Default: Bottom). Choose from: + + * Top + * Middle + * Bottom + + Properties: + * text + * plane + * geometry + * height + * color + * font + * horizontal_alignment + * vertical_alignment + * min + * max + * user_data + """ + __slots__ = ('_text', '_height', '_font', '_horizontal_alignment', + '_vertical_alignment') + + HORIZONTAL_ALIGN = ('Left', 'Center', 'Right') + VERTICAL_ALIGN = ('Top', 'Middle', 'Bottom') + + def __init__(self, text, plane, height, color=None, font='Arial', + horizontal_alignment='Left', vertical_alignment='Bottom'): + """Initialize object.""" + assert isinstance(plane, Plane), '\ + Expected ladybug_geometry Plane. Got {}'.format(type(plane)) + _SingleColorBase3D.__init__(self, plane, color) + self.text = text + self.height = height + self.font = font + self.horizontal_alignment = horizontal_alignment + self.vertical_alignment = vertical_alignment + +
[docs] @classmethod + def from_dict(cls, data): + """Initialize a DisplayText3D from a dictionary. + + Args: + data: A dictionary representation of an DisplayText3D object. + """ + assert data['type'] == 'DisplayText3D', \ + 'Expected DisplayText3D dictionary. Got {}.'.format(data['type']) + color = Color.from_dict(data['color']) if 'color' in data and data['color'] \ + is not None else None + font = data['font'] if 'font' in data and \ + data['font'] is not None else 'Arial' + h_align = data['horizontal_alignment'] if 'horizontal_alignment' in data and \ + data['horizontal_alignment'] is not None else 'Left' + v_align = data['vertical_alignment'] if 'vertical_alignment' in data and \ + data['vertical_alignment'] is not None else 'Bottom' + geo = cls(data['text'], Plane.from_dict(data['plane']), data['height'], + color, font, h_align, v_align) + if 'user_data' in data and data['user_data'] is not None: + geo.user_data = data['user_data'] + return geo
+ + @property + def text(self): + """Get or set a text string to be displayed in the 3D scene.""" + return self._text + + @text.setter + def text(self, value): + self._text = str(value) + + @property + def plane(self): + """Get a ladybug_geometry Plane for the text.""" + return self._geometry + + @property + def height(self): + """Get or set a number for the height of the text in the 3D scene.""" + return self._height + + @height.setter + def height(self, value): + self._height = float_positive(value, 'text height') + + @property + def font(self): + """Get or set a string for the font in which to draw the text.""" + return self._font + + @font.setter + def font(self, value): + self._font = str(value) + + @property + def horizontal_alignment(self): + """Get or set text to specify the horizontal alignment.""" + return self._horizontal_alignment + + @horizontal_alignment.setter + def horizontal_alignment(self, value): + clean_input = value.lower() + for key in self.HORIZONTAL_ALIGN: + if key.lower() == clean_input: + value = key + break + else: + raise ValueError( + 'horizontal_alignment {} is not recognized.\nChoose from the ' + 'following:\n{}'.format(value, self.HORIZONTAL_ALIGN)) + self._horizontal_alignment = value + + @property + def vertical_alignment(self): + """Get or set text to specify the vertical alignment.""" + return self._vertical_alignment + + @vertical_alignment.setter + def vertical_alignment(self, value): + clean_input = value.lower() + for key in self.VERTICAL_ALIGN: + if key.lower() == clean_input: + value = key + break + else: + raise ValueError( + 'vertical_alignment {} is not recognized.\nChoose from the ' + 'following:\n{}'.format(value, self.VERTICAL_ALIGN)) + self._vertical_alignment = value + + @property + def min(self): + """Get a Point3D for the minimum of the bounding box around the object.""" + sep_text = self.text.split('\n') + h_len = max([len(txt) for txt in sep_text]) + v_len = len(sep_text) + + if self.horizontal_alignment == 'Right': + min_x = h_len * self.height + elif self.horizontal_alignment == 'Center': + min_x = (h_len * self.height) / 2 + else: + min_x = 0 + min_x = self.plane.o.x - min_x + + if self.vertical_alignment == 'Top': + min_y = v_len * self.height + elif self.vertical_alignment == 'Middle': + min_y = (v_len * self.height) / 2 + else: + min_y = 0 + min_y = self.plane.o.y + min_y + return Point3D(min_x, min_y, self.plane.o.z) + + @property + def max(self): + """Get a Point3D for the maximum of the bounding box around the object.""" + sep_text = self.text.split('\n') + h_len = max([len(txt) for txt in sep_text]) + v_len = len(sep_text) + + if self.horizontal_alignment == 'Left': + max_x = h_len * self.height + elif self.horizontal_alignment == 'Center': + max_x = (h_len * self.height) / 2 + else: + max_x = 0 + max_x = self.plane.o.x + max_x + + if self.vertical_alignment == 'Bottom': + max_y = v_len * self.height + elif self.vertical_alignment == 'Middle': + max_y = (v_len * self.height) / 2 + else: + max_y = self.height + max_y = self.plane.o.y + max_y + return Point3D(max_x, max_y, self.plane.o.z) + +
[docs] def to_dict(self): + """Return DisplayText3D as a dictionary.""" + base = {'type': 'DisplayText3D'} + base['text'] = self.text + base['plane'] = self.plane.to_dict() + base['height'] = self.height + base['color'] = self.color.to_dict() + base['font'] = self.font + base['horizontal_alignment'] = self.horizontal_alignment + base['vertical_alignment'] = self.vertical_alignment + if self.user_data is not None: + base['user_data'] = self.user_data + return base
+ + def __copy__(self): + new_g = DisplayText3D( + self.text, self.plane, self.height, self.color, self.font, + self.horizontal_alignment, self.vertical_alignment) + new_g._user_data = None if self.user_data is None else self.user_data.copy() + return new_g + + def __repr__(self): + return 'DisplayText3D: {}'.format(self.plane)
+
+ +
+ +
+
+
+
+

+ Back to top + +

+

+ © Copyright 2024, Ladybug Tools.
+ Created using Sphinx 5.3.0.
+

+
+
+ + \ No newline at end of file diff --git a/docs/_modules/ladybug_display/geometry3d/vector.html b/docs/_modules/ladybug_display/geometry3d/vector.html new file mode 100644 index 0000000..5d3b989 --- /dev/null +++ b/docs/_modules/ladybug_display/geometry3d/vector.html @@ -0,0 +1,1090 @@ + + + + + + + ladybug_display.geometry3d.vector — ladybug-display documentation + + + + + + + + + + + + + + + + + + + + + + + + +
+
+ +
+ +

Source code for ladybug_display.geometry3d.vector

+"""A vector that can be displayed in 3D space."""
+import math
+
+from ladybug_geometry.geometry3d.pointvector import Vector3D
+from ladybug.color import Color
+
+from .._base import _DisplayBase
+
+
+
[docs]class DisplayVector3D(_DisplayBase): + """A vector in 3D space with display properties. + + Args: + geometry: A ladybug-geometry Vector3D object. + color: A ladybug Color object. If None, a default black color will be + used. (Default: None). + + Properties: + * geometry + * color + * x + * y + * z + * magnitude + * user_data + """ + __slots__ = ('_color',) + + def __init__(self, geometry, color=None): + """Initialize base with shade object.""" + assert isinstance(geometry, Vector3D), '\ + Expected ladybug_geometry Vector3D. Got {}'.format(type(geometry)) + _DisplayBase.__init__(self, geometry) + self.color = color + +
[docs] @classmethod + def from_dict(cls, data): + """Initialize a DisplayVector3D from a dictionary. + + Args: + data: A dictionary representation of an DisplayVector3D object. + """ + assert data['type'] == 'DisplayVector3D', \ + 'Expected DisplayVector3D dictionary. Got {}.'.format(data['type']) + color = Color.from_dict(data['color']) if 'color' in data and data['color'] \ + is not None else None + geo = cls(Vector3D.from_dict(data['geometry']), color) + if 'user_data' in data and data['user_data'] is not None: + geo.user_data = data['user_data'] + return geo
+ + @property + def color(self): + """Get or set a color for this object.""" + return self._color + + @color.setter + def color(self, value): + if value is None: + value = Color(0, 0, 0) + else: + assert isinstance(value, Color), 'Expected Color for ladybug_display ' \ + 'object color. Got {}.'.format(type(value)) + self._color = value + + @property + def x(self): + """Get the X coordinate.""" + return self._geometry.x + + @property + def y(self): + """Get the Y coordinate.""" + return self._geometry.y + + @property + def z(self): + """Get the Z coordinate.""" + return self._geometry.z + + @property + def magnitude(self): + """Get the magnitude of the vector.""" + return self._geometry.magnitude + +
[docs] def normalize(self): + """Ensure that this DisplayVector3D is a unit vector (magnitude=1).""" + self._geometry = self._geometry.normalize()
+ +
[docs] def reverse(self): + """Reverse this DisplayVector3D.""" + self._geometry = self._geometry.__neg__()
+ +
[docs] def dot(self, other): + """Get the dot product of this vector with another DisplayVector3D.""" + return self.geometry.dot(other.geometry)
+ +
[docs] def cross(self, other): + """Get the cross product of this vector and another DisplayVector3D.""" + return self.geometry.cross(other.geometry)
+ +
[docs] def angle(self, other): + """Get the angle between this vector and another DisplayVector3D in degrees.""" + return math.degrees(self.geometry.angle(other.geometry))
+ +
[docs] def rotate(self, axis, angle): + """Rotate this geometry by a certain angle around an axis and origin. + + Args: + axis: A ladybug_geometry Vector3D axis representing the axis of rotation. + angle: An angle for rotation in degrees. + """ + self._geometry = self.geometry.rotate(axis, math.radians(angle))
+ +
[docs] def rotate_xy(self, angle): + """Rotate this geometry counterclockwise in the world XY plane by an angle. + + Args: + angle: An angle in degrees. + """ + self._geometry = self.geometry.rotate_xy(math.radians(angle))
+ +
[docs] def reflect(self, normal): + """Reflect this geometry across a plane with the input normal vector. + + Args: + normal: A Vector3D representing the normal vector for the plane across + which the vector will be reflected. THIS VECTOR MUST BE NORMALIZED. + """ + self._geometry = self.geometry.reflect(normal)
+ +
[docs] def to_dict(self): + """Return DisplayVector3D as a dictionary. + """ + base = {'type': 'DisplayVector3D'} + base['geometry'] = self._geometry.to_dict() + base['color'] = self.color.to_dict() + if self.user_data is not None: + base['user_data'] = self.user_data + return base
+ + def __copy__(self): + new_g = DisplayVector3D(self.geometry, self.color) + new_g._user_data = None if self.user_data is None else self.user_data.copy() + return new_g + + def __getitem__(self, key): + return (self.x, self.y, self.z)[key] + + def __iter__(self): + return iter((self.x, self.y, self.z)) + + def __mul__(self, other): + assert type(other) in (int, float), 'Cannot multiply types {} and {}'.format( + self.__class__.__name__, type(other)) + new_g = DisplayVector3D(self.geometry * other, self.color) + new_g._user_data = None if self.user_data is None else self.user_data.copy() + return new_g + + def __div__(self, other): + assert type(other) in (int, float), 'Cannot divide types {} and {}'.format( + self.__class__.__name__, type(other)) + new_g = DisplayVector3D(self.geometry / other, self.color) + new_g._user_data = None if self.user_data is None else self.user_data.copy() + return new_g + + def __repr__(self): + return 'DisplayVector3D: {}'.format(self.geometry)
+
+ +
+ +
+
+
+
+

+ Back to top + +

+

+ © Copyright 2024, Ladybug Tools.
+ Created using Sphinx 5.3.0.
+

+
+
+ + \ No newline at end of file diff --git a/docs/_modules/ladybug_display/typing.html b/docs/_modules/ladybug_display/typing.html new file mode 100644 index 0000000..197e67d --- /dev/null +++ b/docs/_modules/ladybug_display/typing.html @@ -0,0 +1,1044 @@ + + + + + + + ladybug_display.typing — ladybug-display documentation + + + + + + + + + + + + + + + + + + + + + + + + +
+
+ +
+ +

Source code for ladybug_display.typing

+"""Collection of methods for type input checking."""
+import re
+import math
+
+try:
+    INFPOS = math.inf
+    INFNEG = -1 * math.inf
+except AttributeError:
+    # python 2
+    INFPOS = float('inf')
+    INFNEG = float('-inf')
+
+
+
[docs]def valid_string(value, input_name=''): + """Check that a string is valid as an identifier.""" + try: + illegal_match = re.search(r'[^.A-Za-z0-9_-]', value) + except TypeError: + raise TypeError('Input {} must be a text string. Got {}: {}.'.format( + input_name, type(value), value)) + assert illegal_match is None, 'Illegal character "{}" found in {}'.format( + illegal_match.group(0), input_name) + assert len(value) > 0, 'Input {} "{}" contains no characters.'.format( + input_name, value) + assert len(value) <= 100, 'Input {} "{}" must be less than 100 characters.'.format( + input_name, value) + return value
+ + +def _number_check(value, input_name): + """Check if value is a number.""" + try: + number = float(value) + except (ValueError, TypeError): + raise TypeError('Input {} must be a number. Got {}: {}.'.format( + input_name, type(value), value)) + return number + + +
[docs]def float_in_range(value, mi=INFNEG, ma=INFPOS, input_name=''): + """Check a float value to be between minimum and maximum.""" + number = _number_check(value, input_name) + assert mi <= number <= ma, 'Input number {} must be between {} and {}. ' \ + 'Got {}'.format(input_name, mi, ma, value) + return number
+ + +
[docs]def float_in_range_excl(value, mi=INFNEG, ma=INFPOS, input_name=''): + """Check a float value to be greater than minimum and less than maximum.""" + number = _number_check(value, input_name) + assert mi < number < ma, 'Input number {} must be greater than {} ' \ + 'and less than {}. Got {}'.format(input_name, mi, ma, value) + return number
+ + +
[docs]def float_in_range_excl_incl(value, mi=INFNEG, ma=INFPOS, input_name=''): + """Check a float value to be greater than minimum and less than/equal to maximum.""" + number = _number_check(value, input_name) + assert mi < number <= ma, 'Input number {} must be greater than {} and less than ' \ + 'or equal to {}. Got {}'.format(input_name, mi, ma, value) + return number
+ + +
[docs]def float_in_range_incl_excl(value, mi=INFNEG, ma=INFPOS, input_name=''): + """Check a float value to be greater than/equal to minimum and less than maximum.""" + number = _number_check(value, input_name) + assert mi <= number < ma, 'Input number {} must be greater than or equal to {} ' \ + 'and less than {}. Got {}'.format(input_name, mi, ma, value) + return number
+ + +
[docs]def int_in_range(value, mi=INFNEG, ma=INFPOS, input_name=''): + """Check an integer value to be between minimum and maximum.""" + try: + number = int(value) + except ValueError: + # try to convert to float and then digit if possible + try: + number = int(float(value)) + except (ValueError, TypeError): + raise TypeError('Input {} must be an integer. Got {}: {}.'.format( + input_name, type(value), value)) + except (ValueError, TypeError): + raise TypeError('Input {} must be an integer. Got {}: {}.'.format( + input_name, type(value), value)) + assert mi <= number <= ma, 'Input integer {} must be between {} and {}. ' \ + 'Got {}.'.format(input_name, mi, ma, value) + return number
+ + +
[docs]def float_positive(value, input_name=''): + """Check a float value to be positive.""" + return float_in_range_excl(value, 0, INFPOS, input_name)
+ + +
[docs]def int_positive(value, input_name=''): + """Check if an integer value is positive.""" + return int_in_range(value, 0, INFPOS, input_name)
+ + +
[docs]def tuple_with_length(value, length=3, item_type=float, input_name=''): + """Try to create a tuple with a certain value.""" + try: + value = tuple(item_type(v) for v in value) + except (ValueError, TypeError): + raise TypeError('Input {} must be a {}.'.format( + input_name, item_type)) + assert len(value) == length, 'Input {} length must be {} not {}'.format( + input_name, length, len(value)) + return value
+ + +
[docs]def list_with_length(value, length=3, item_type=float, input_name=''): + """Try to create a list with a certain value.""" + try: + value = [item_type(v) for v in value] + except (ValueError, TypeError): + raise TypeError('Input {} must be a {}.'.format( + input_name, item_type)) + assert len(value) == length, 'Input {} length must be {} not {}'.format( + input_name, length, len(value)) + return value
+
+ +
+ +
+
+
+
+

+ Back to top + +

+

+ © Copyright 2024, Ladybug Tools.
+ Created using Sphinx 5.3.0.
+

+
+
+ + \ No newline at end of file diff --git a/docs/_modules/ladybug_display/visualization.html b/docs/_modules/ladybug_display/visualization.html new file mode 100644 index 0000000..a58b5b3 --- /dev/null +++ b/docs/_modules/ladybug_display/visualization.html @@ -0,0 +1,2525 @@ + + + + + + + ladybug_display.visualization — ladybug-display documentation + + + + + + + + + + + + + + + + + + + + + + + + +
+
+ +
+ +

Source code for ladybug_display.visualization

+# coding=utf-8
+from __future__ import division
+import os
+import sys
+import json
+import collections
+try:  # check if we are in IronPython
+    import cPickle as pickle
+except ImportError:  # wea are in cPython
+    import pickle
+
+from ladybug.legend import Legend, LegendParameters, LegendParametersCategorized
+from ladybug.graphic import GraphicContainer
+from ladybug.datatype.base import DataTypeBase
+
+from ladybug_geometry.geometry2d import Vector2D, Point2D, Ray2D, LineSegment2D, \
+    Polyline2D, Arc2D, Polygon2D, Mesh2D
+from ladybug_geometry.geometry3d import Vector3D, Point3D, Ray3D, Plane, LineSegment3D, \
+    Polyline3D, Arc3D, Face3D, Mesh3D, Polyface3D, Sphere, Cone, Cylinder
+from .geometry2d import DisplayVector2D, DisplayPoint2D, \
+    DisplayRay2D, DisplayLineSegment2D, DisplayPolyline2D, DisplayArc2D, \
+    DisplayPolygon2D, DisplayMesh2D
+from .geometry3d import DisplayVector3D, DisplayPoint3D, \
+    DisplayRay3D, DisplayPlane, DisplayLineSegment3D, DisplayPolyline3D, DisplayArc3D, \
+    DisplayFace3D, DisplayMesh3D, DisplayPolyface3D, DisplaySphere, DisplayCone, \
+    DisplayCylinder, DisplayText3D
+from ladybug_geometry.bounding import bounding_box
+from ladybug_geometry.dictutil import geometry_dict_to_object
+
+from ._base import DISPLAY_MODES
+from .geometry2d._base import _DisplayBase2D
+from .geometry3d._base import _DisplayBase3D
+from .typing import int_in_range, valid_string
+from .dictutil import dict_to_object
+
+GEOMETRY_UNION = (
+    Vector2D, Point2D, Ray2D, LineSegment2D, Polyline2D, Arc2D, Polygon2D,
+    Mesh2D, Vector3D, Point3D, Ray3D, Plane, LineSegment3D,
+    Polyline3D, Arc3D, Face3D, Mesh3D, Polyface3D, Sphere, Cone, Cylinder
+)
+DISPLAY_UNION = (
+    DisplayVector2D, DisplayPoint2D, DisplayRay2D, DisplayLineSegment2D,
+    DisplayPolyline2D, DisplayArc2D, DisplayPolygon2D, DisplayMesh2D,
+    DisplayVector3D, DisplayPoint3D, DisplayRay3D, DisplayPlane, DisplayLineSegment3D,
+    DisplayPolyline3D, DisplayArc3D, DisplayFace3D, DisplayMesh3D,
+    DisplayPolyface3D, DisplaySphere, DisplayCone, DisplayCylinder, DisplayText3D
+)
+
+
+class _VisualizationBase(object):
+    """A base class for visualization objects.
+
+    Args:
+        identifier: Text string for a unique object ID. Must be less than 100
+            characters and not contain spaces or special characters.
+
+    Properties:
+        * identifier
+        * display_name
+        * full_id
+        * user_data
+    """
+    __slots__ = ('_identifier', '_display_name', '_user_data')
+
+    def __init__(self, identifier):
+        """Initialize base object."""
+        self.identifier = identifier
+        self._display_name = None
+        self._user_data = None
+
+    @property
+    def identifier(self):
+        """Get or set a text string for the unique object identifier.
+
+        This identifier remains constant as the object is mutated, copied, and
+        serialized to different formats.
+        """
+        return self._identifier
+
+    @identifier.setter
+    def identifier(self, value):
+        self._identifier = valid_string(value, 'visualization object identifier')
+
+    @property
+    def display_name(self):
+        """Get or set text for the object name without any character restrictions.
+
+        This is typically used to set the layer of the object in the interface that
+        renders the VisualizationSet. A :: in the display_name can be used to denote
+        sub-layers following a convention of ParentLayer::SubLayer.
+
+        If not set, the display_name will be equal to the object identifier.
+        """
+        if self._display_name is None:
+            return self._identifier
+        return self._display_name
+
+    @display_name.setter
+    def display_name(self, value):
+        if value is not None:
+            try:
+                value = str(value)
+            except UnicodeEncodeError:  # Python 2 machine lacking the character set
+                pass  # keep it as unicode
+        self._display_name = value
+
+    @property
+    def full_id(self):
+        """Get a string with both the object display_name and identifier.
+
+        This is formatted as display_name[identifier].
+
+        This is useful in error messages to give users an easy means of finding
+        invalid objects within models. If there is no display_name assigned,
+        only the identifier will be returned.
+        """
+        if self._display_name is None:
+            return self._identifier
+        else:
+            return '{}[{}]'.format(self._display_name, self._identifier)
+
+    @property
+    def user_data(self):
+        """Get or set an optional dictionary for additional meta data for this object.
+
+        This will be None until it has been set. All keys and values of this
+        dictionary should be of a standard Python type to ensure correct
+        serialization of the object to/from JSON (eg. str, float, int, list, dict)
+        """
+        return self._user_data
+
+    @user_data.setter
+    def user_data(self, value):
+        if value is not None:
+            assert isinstance(value, dict), 'Expected dictionary for visualization ' \
+                'object user_data. Got {}.'.format(type(value))
+        self._user_data = value
+
+    def duplicate(self):
+        """Get a copy of this object."""
+        return self.__copy__()
+
+    def __copy__(self):
+        new_obj = _VisualizationBase(self.identifier)
+        new_obj._display_name = self._display_name
+        new_obj._user_data = None if self.user_data is None else self.user_data.copy()
+        return new_obj
+
+
+
[docs]class VisualizationSet(_VisualizationBase): + """A visualization set containing analysis and context geometry to be visualized. + + Args: + identifier: Text string for a unique object ID. Must be less than 100 + characters and not contain spaces or special characters. + geometry: A list of AnalysisGeometry and ContextGeometry objects to display + in the visualization. Each geometry object will typically be translated + to its own layer within the interface that renders the VisualizationSet. + units: Text for the units system in which the visualization geometry + exists. If None, the geometry will always be assumed to be in the current + units system of the display interface. (Default: None). Choose from + the following: + + * Meters + * Millimeters + * Feet + * Inches + * Centimeters + + Properties: + * identifier + * display_name + * geometry + * min_point + * max_point + * units + * user_data + """ + __slots__ = ('_geometry', '_min_point', '_max_point', '_units') + + UNITS = ('Meters', 'Millimeters', 'Feet', 'Inches', 'Centimeters') + + def __init__(self, identifier, geometry, units=None): + """Initialize VisualizationSet.""" + _VisualizationBase.__init__(self, identifier) # process the identifier + self.geometry = geometry + self.units = units + self._min_point = None + self._max_point = None + +
[docs] @classmethod + def from_dict(cls, data): + """Create an VisualizationSet from a dictionary. + + Args: + data: A python dictionary in the following format + + .. code-block:: python + + { + "type": "VisualizationSet", + "identifier": "", # unique object identifier + "geometry": [] # list of AnalysisGeometry and ContextGeometry objects + } + """ + # check the type key + assert data['type'] == 'VisualizationSet', \ + 'Expected VisualizationSet, Got {}.'.format(data['type']) + # re-serialize the context and analysis geometry + geos = [] + for geo_data in data['geometry']: + if geo_data['type'] == 'AnalysisGeometry': + geos.append(AnalysisGeometry.from_dict(geo_data)) + else: + geos.append(ContextGeometry.from_dict(geo_data)) + new_obj = cls(data['identifier'], geos) + if 'units' in data and data['units'] is not None: + new_obj.units = data['units'] + if 'display_name' in data and data['display_name'] is not None: + new_obj.display_name = data['display_name'] + if 'user_data' in data and data['user_data'] is not None: + new_obj.user_data = data['user_data'] + return new_obj
+ +
[docs] @classmethod + def from_file(cls, vis_set_file): + """Initialize a VisualizationSet from a JSON or pkl file, auto-sensing the type. + + Args: + VisualizationSet: Path to either a VisualizationSet JSON or pkl file. + """ + # sense the file type from the first character to avoid maxing memory with JSON + # this is needed since queenbee overwrites all file extensions + with open(vis_set_file) as inf: + try: + first_char = inf.read(1) + is_json = True if first_char == '{' else False + except UnicodeDecodeError: # definitely a pkl file + is_json = False + # load the file using either JSON pathway or pkl + if is_json: + return cls.from_json(vis_set_file) + return cls.from_pkl(vis_set_file)
+ +
[docs] @classmethod + def from_json(cls, json_file): + """Initialize a VisualizationSet from a JSON file. + + Args: + json_file: Path to VisualizationSet JSON file. + """ + assert os.path.isfile(json_file), 'Failed to find %s' % json_file + if (sys.version_info < (3, 0)): + with open(json_file) as inf: + data = json.load(inf) + else: + with open(json_file, encoding='utf-8') as inf: + data = json.load(inf) + return cls.from_dict(data)
+ +
[docs] @classmethod + def from_pkl(cls, pkl_file): + """Initialize a Model from a pkl file. + + Args: + pkl_file: Path to pkl file. + """ + assert os.path.isfile(pkl_file), 'Failed to find %s' % pkl_file + with open(pkl_file, 'rb') as inf: + data = pickle.load(inf) + return cls.from_dict(data)
+ +
[docs] @classmethod + def from_single_analysis_geo( + cls, identifier, geometry, values, legend_parameters=None, + data_type=None, unit=None): + """Create an VisualizationSet from a raw geometry object and a list of values. + + Args: + identifier: Text string for a unique object ID. Must be less than 100 + characters and not contain spaces or special characters. + geometry: A list of ladybug-geometry objects that is aligned with the + values. The length of this list should usually be equal to the total + number of values in each data_set, indicating that each geometry gets + a single color. Alternatively, if all of the geometry objects are + meshes, the number of values in the data can be equal to the total + number of faces across the meshes or the total number of vertices + across the meshes. + values: A list of numerical values that will be used to generate the + visualization colors. + legend_parameters: An Optional LegendParameters object to override default + parameters of the legend. None indicates that default legend parameters + will be used. (Default: None). + data_type: Optional DataType from the ladybug datatype subpackage (ie. + Temperature()) , which will be used to assign default legend properties. + If None, the legend associated with this object will contain no units + unless a unit below is specified. (Default: None). + unit: Optional text string for the units of the values. (ie. "C"). If None + or empty, the default units of the data_type will be used. If no data + type is specified in this case, this will simply be an empty + string. (Default: None). + """ + viz_data = VisualizationData(values, legend_parameters, data_type, unit) + a_geo = AnalysisGeometry('{}_Geometry'.format(identifier), geometry, [viz_data]) + return cls(identifier, (a_geo,))
+ + @property + def geometry(self): + """Get or set a tuple of AnalysisGeometry and ContextGeometry objects.""" + return self._geometry + + @geometry.setter + def geometry(self, value): + assert isinstance(value, (list, tuple)), 'Expected list or tuple for' \ + ' VisualizationSet geometry. Got {}.'.format(type(value)) + if not isinstance(value, tuple): + value = tuple(value) + for geo in value: + self._check_geometry(geo) + self._geometry = value + + @property + def min_point(self): + """A Point3D for the minimum bounding box vertex around all of the geometry.""" + if self._min_point is None: + self._calculate_min_max() + return self._min_point + + @property + def max_point(self): + """A Point3D for the maximum bounding box vertex around all of the geometry.""" + if self._max_point is None: + self._calculate_min_max() + return self._max_point + + @property + def units(self): + """Get or set Text for the units system in which the geometry exists.""" + return self._units + + @units.setter + def units(self, value): + if value is not None: + value = value.title() + assert value in self.UNITS, '{} is not supported as a units system. ' \ + 'Choose from the following: {}'.format(value, self.UNITS) + self._units = value + +
[docs] def add_vis_set(self, vis_set): + """Add all geometry objects of another VisualizationSet to this one. + + Args: + vis_set: A VisualizationData object to be added to this AnalysisGeometry. + """ + for geo in vis_set.geometry: + self.add_geometry(geo)
+ +
[docs] def add_geometry(self, geometry, insert_index=None): + """Add a ContextGeometry or AnalysisGeometry object to this VisualizationSet. + + Args: + geometry: A ContextGeometry or AnalysisGeometry object to be added + to this VisualizationSet. + insert_index: An integer for the index at which the data should be + inserted. If None, the data will be appended to the end. (Default: None). + """ + self._check_geometry(geometry) + if insert_index is None: + self._geometry = self._geometry + (geometry,) + else: + geos_list = list(self._geometry) + geos_list.insert(insert_index, geometry) + self._geometry = tuple(geos_list) + self._min_point = None + self._max_point = None
+ +
[docs] def remove_geometry(self, geo_index): + """Remove a geometry object from this VisualizationSet. + + Args: + geo_index: An integer for the geometry index to be removed. + """ + assert geo_index < len(self._geometry), 'geo_index ({}) must be less than ' \ + 'the number of items in the data_sets ({}).'.format( + geo_index, len(self._geometry)) + geos_list = list(self._geometry) + geos_list.pop(geo_index) + self._geometry = tuple(geos_list) + self._min_point = None + self._max_point = None
+ +
[docs] def check_duplicate_identifiers(self, raise_exception=True, detailed=False): + """Check that there are no duplicate geometry object identifiers in the set. + + Args: + raise_exception: Boolean to note whether a ValueError should be raised + if duplicate identifiers are found. (Default: True). + detailed: Boolean for whether the returned object is a detailed list of + dicts with error info or a string with a message. (Default: False). + + Returns: + A string with the message or a list with a dictionary if detailed is True. + """ + detailed = False if raise_exception else detailed + obj_id_iter = (obj.identifier for obj in self.geometry) + dup = [t for t, c in collections.Counter(obj_id_iter).items() if c > 1] + if len(dup) != 0: + if detailed: + err_list = [] + for dup_id in dup: + msg = 'There is a duplicated geometry identifier: {}'.format(dup_id) + dup_dict = { + 'type': 'ValidationError', + 'element_type': 'Geometry', + 'element_id': dup_id, + 'element_name': dup_id, + 'message': msg + } + err_list.append(dup_dict) + return err_list + msg = 'The following duplicated Geometry identifiers were found:\n{}'.format( + '\n'.join(dup)) + if raise_exception: + raise ValueError(msg) + return msg + return [] if detailed else ''
+ +
[docs] def graphic_container(self, geo_index=0, data_index=None, + min_point=None, max_point=None): + """Get a Ladybug GraphicContainer object, which can be used to draw legends. + + Args: + geo_index: Integer for the index of the geometry for which a + GraphicContainer will be returned. Note that this index must refer + to an analysis geometry in order to produce a valid graphic + container. (Default: 0). + data_index: Integer for the index of the data set for which a + GraphicContainer will be returned. If None, the active_data set + will be used. (Default: None). + min_point: An optional Point3D to denote the minimum bounding box + for the graphic container. If None, this object's own min_point + will be used, which corresponds to the bounding box around + the geometry. (Default: None). + max_point: An optional Point3D to denote the maximum bounding box + for the graphic container. If None, this object's own max_point + will be used, which corresponds to the bounding box around + the geometry. (Default: None). + """ + # check to be sure that there is analysis geometry + geo_obj = self.geometry[geo_index] + assert isinstance(geo_obj, AnalysisGeometry), 'VisualizationSet geo_index ' \ + 'must refer to an AnalysisGeometry in order to use ' \ + 'graphic_container method.' + # ensure that min and max points always make sense + min_point = self.min_point if min_point is None else min_point + max_point = self.max_point if max_point is None else max_point + # return the Graphic Container for the correct data set + data_index = geo_obj.active_data if data_index is None else data_index + dat_set = geo_obj.data_sets[data_index] + return dat_set.graphic_container(min_point, max_point)
+ +
[docs] def move(self, moving_vec): + """Move this VisualizationSet along a vector. + + Args: + moving_vec: A ladybug_geometry Vector3D with the direction and distance + to move the VisualizationSet. + """ + for geo in self.geometry: + geo.move(moving_vec)
+ +
[docs] def rotate_xy(self, angle, origin): + """Rotate this VisualizationSet counterclockwise in the world XY plane. + + Args: + angle: An angle in degrees. + origin: A ladybug_geometry Point3D for the origin around which the + object will be rotated. + """ + for geo in self.geometry: + geo.rotate_xy(angle, origin)
+ +
[docs] def scale(self, factor, origin=None): + """Scale this VisualizationSet by a factor from an origin point. + + Args: + factor: A number representing how much the object should be scaled. + origin: A ladybug_geometry Point3D representing the origin from which + to scale. If None, it will be scaled from the World origin (0, 0, 0). + """ + for geo in self._geometry: + geo.scale(factor, origin)
+ +
[docs] def convert_to_units(self, units): + """Convert all of the geometry in this VisualizationSet to certain units. + + This involves scaling the geometry and changing the VisualizationSet's + units property. + + Args: + units: Text for the units to which the VisualizationSet geometry should be + converted. Choose from the following: + + * Meters + * Millimeters + * Feet + * Inches + * Centimeters + """ + if self.units != units: + scale_fac1 = self._conversion_factor_to_meters(self.units) + scale_fac2 = self._conversion_factor_to_meters(units) + scale_fac = scale_fac1 / scale_fac2 + self.scale(scale_fac) + self.units = units
+ +
[docs] def to_dict(self): + """Get VisualizationSet as a dictionary.""" + base = { + 'type': 'VisualizationSet', + 'identifier': self.identifier, + 'geometry': [geo_obj.to_dict() for geo_obj in self.geometry] + } + if self._units is not None: + base['units'] = self.units + if self._display_name is not None: + base['display_name'] = self.display_name + if self.user_data is not None: + base['user_data'] = self.user_data + return base
+ +
[docs] def to_json(self, name, folder, indent=None): + """Write VisualizationSet to JSON. + + Args: + name: A text string for the name of the JSON file. + folder: A text string for the directory where the JSON will be written. + indent: A positive integer to set the indentation used in the resulting + JSON file. (Default: None). + """ + # create dictionary from the VisualizationSet + vs_dict = self.to_dict() + # set up a name and folder for the JSON + nl = name.lower() + file_name = name if nl.endswith('.vsf') or nl.endswith('.json') \ + else '{}.vsf'.format(name) + if not os.path.isdir(folder): + os.makedirs(folder) + vs_file = os.path.join(folder, file_name) + # write JSON + with open(vs_file, 'w') as fp: + json.dump(vs_dict, fp, indent=indent) + return vs_file
+ +
[docs] def to_pkl(self, name, folder): + """Write VisualizationSet to compressed pickle file (pkl). + + Args: + name: A text string for the name of the pickle file. + folder: A text string for the directory where the pickle file will be + written. + """ + # create dictionary from the VisualizationSet + vs_dict = self.to_dict() + # set up a name and folder for the pkl + nl = name.lower() + file_name = name if nl.endswith('.vsf') or nl.endswith('.pkl') \ + else '{}.vsf'.format(name) + if not os.path.isdir(folder): + os.makedirs(folder) + vs_file = os.path.join(folder, file_name) + # write the Model dictionary into a file + with open(vs_file, 'wb') as fp: + pickle.dump(vs_dict, fp) + return vs_file
+ + def _check_geometry(self, geo): + """Check that the geometry object is valid.""" + assert isinstance(geo, (AnalysisGeometry, ContextGeometry)), 'Expected ' \ + 'AnalysisGeometry or ContextGeometry for VisualizationSet geometry. ' \ + 'Got {}.'.format(type(geo)) + + def _calculate_min_max(self): + """Calculate maximum and minimum Point3D for this object.""" + all_geo = [] + for geo_obj in self.geometry: + all_geo.append(geo_obj.min_point) + all_geo.append(geo_obj.max_point) + if len(all_geo) != 0: + self._min_point, self._max_point = bounding_box(all_geo) + + def _conversion_factor_to_meters(self, units): + """Get the conversion factor to meters based on input units. + + Args: + units: Text for the units. + + Returns: + A number for the conversion factor, which should be multiplied by + all distance units taken from Rhino geometry in order to convert + them to meters. + """ + if units == 'Meters': + return 1.0 + elif units == 'Millimeters': + return 0.001 + elif units == 'Feet': + return 0.305 + elif units == 'Inches': + return 0.0254 + elif units == 'Centimeters': + return 0.01 + else: + raise ValueError( + 'You are kidding me! What units are you using? {}?\n' + 'Please use one of the following: {}'.format(units, ' '.join(self.UNITS)) + ) + +
[docs] def ToString(self): + """Overwrite .NET ToString.""" + return self.__repr__()
+ + def __copy__(self): + new_geo_objs = tuple(obj.duplicate() for obj in self.geometry) + new_obj = VisualizationSet(self.identifier, new_geo_objs, self.units) + new_obj._display_name = self._display_name + new_obj._user_data = None if self.user_data is None else self.user_data.copy() + return new_obj + + def __len__(self): + """Return number of geometries on the object.""" + return len(self.geometry) + + def __getitem__(self, key): + """Return one of the geometries.""" + return self.geometry[key] + + def __iter__(self): + """Iterate through the geometries.""" + return iter(self.geometry) + + def __repr__(self): + """VisualizationSet representation.""" + return 'Visualization Set: {}'.format(self.display_name)
+ + +
[docs]class ContextGeometry(_VisualizationBase): + """An object representing context geometry to display. + + Args: + identifier: Text string for a unique object ID. Must be less than 100 + characters and not contain spaces or special characters. + geometry: A list of ladybug-geometry or ladybug-display objects that gives + context to analysis geometry or other aspects of the visualization. + Typically, these will display in wireframe around the geometry, though + the properties of display geometry can be used to customize the + visualization. + hidden: A boolean to note whether the geometry is hidden by default and + must be un-hidden to be visible in the 3D scene. (Default: False). + + Properties: + * identifier + * display_name + * geometry + * hidden + * min_point + * max_point + * user_data + """ + __slots__ = ('_geometry', '_min_point', '_max_point', '_hidden') + + WIREFRAME_MAP = { + Vector2D: (DisplayVector2D, None), + Point2D: (DisplayPoint2D, None), + Ray2D: (DisplayRay2D, None), + LineSegment2D: (DisplayLineSegment2D, None), + Polyline2D: (DisplayPolyline2D, None), + Arc2D: (DisplayArc2D, None), + Polygon2D: (DisplayPolygon2D, None, 'Wireframe'), + Mesh2D: (DisplayMesh2D, None, 'Wireframe'), + Vector3D: (DisplayVector3D, None), + Point3D: (DisplayPoint3D, None), + Ray3D: (DisplayRay3D, None), + Plane: (DisplayPlane, None), + LineSegment3D: (DisplayLineSegment3D, None), + Polyline3D: (DisplayPolyline3D, None), + Arc3D: (DisplayArc3D, None), + Face3D: (DisplayFace3D, None, 'Wireframe'), + Mesh3D: (DisplayMesh3D, None, 'Wireframe'), + Polyface3D: (DisplayPolyface3D, None, 'Wireframe'), + Sphere: (DisplaySphere, None, 'Wireframe'), + Cone: (DisplayCone, None, 'Wireframe'), + Cylinder: (DisplayCylinder, None, 'Wireframe') + } + + def __init__(self, identifier, geometry, hidden=False): + """Initialize ContextGeometry.""" + _VisualizationBase.__init__(self, identifier) # process the identifier + self.geometry = geometry + self.hidden = hidden + self._min_point = None + self._max_point = None + +
[docs] @classmethod + def from_dict(cls, data): + """Create an ContextGeometry from a dictionary. + + Args: + data: A python dictionary in the following format + + .. code-block:: python + + { + "type": "ContextGeometry", + "identifier": "", # unique object identifier + "geometry": [], # list of ladybug-display geometry objects + "hidden": True # boolean for whether the layer is hidden by default + } + """ + # check the type key + assert data['type'] == 'ContextGeometry', \ + 'Expected ContextGeometry, Got {}.'.format(data['type']) + # re-serialize the object + geos = tuple(dict_to_object(geo) for geo in data['geometry']) + hidden = False if 'hidden' not in data else data['hidden'] + new_obj = cls(data['identifier'], geos, hidden) + if 'display_name' in data and data['display_name'] is not None: + new_obj.display_name = data['display_name'] + if 'user_data' in data and data['user_data'] is not None: + new_obj.user_data = data['user_data'] + return new_obj
+ + @property + def geometry(self): + """Get or set a tuple of ladybug_display geometry objects for context. + + When setting this property, it is also acceptable to include raw + ladybug_geometry objects in the list and they will automatically be + converted into a wireframe representation as a ladybug-display object. + """ + return self._geometry + + @geometry.setter + def geometry(self, value): + assert isinstance(value, (list, tuple)), 'Expected list or tuple for' \ + ' ContextGeometry geometry. Got {}.'.format(type(value)) + processed_value = [] + for geo in value: + if isinstance(geo, DISPLAY_UNION): + processed_value.append(geo) + elif isinstance(geo, GEOMETRY_UNION): + processed_value.append(self.geometry_to_wireframe(geo)) + else: + raise ValueError( + 'Expected ladybug-geometry or ladybug-display object for ' + 'ContextGeometry. Got {}.'.format(type(geo))) + self._geometry = tuple(processed_value) + + @property + def hidden(self): + """Get or set a boolean for whether the geometry is hidden by default.""" + return self._hidden + + @hidden.setter + def hidden(self, value): + self._hidden = bool(value) + + @property + def min_point(self): + """A Point3D for the minimum bounding box vertex around all of the geometry.""" + if self._min_point is None: + self._calculate_min_max() + return self._min_point + + @property + def max_point(self): + """A Point3D for the maximum bounding box vertex around all of the geometry.""" + if self._max_point is None: + self._calculate_min_max() + return self._max_point + +
[docs] def move(self, moving_vec): + """Move this ContextGeometry along a vector. + + Args: + moving_vec: A ladybug_geometry Vector3D with the direction and distance + to move the ContextGeometry. + """ + moving_vec_2d = Vector2D(moving_vec.x, moving_vec.y) + for geo in self._geometry: + if isinstance(geo, _DisplayBase3D): + geo.move(moving_vec) + elif isinstance(geo, _DisplayBase2D): + geo.move(moving_vec_2d)
+ +
[docs] def rotate_xy(self, angle, origin): + """Rotate this ContextGeometry counterclockwise in the world XY plane. + + Args: + angle: An angle in degrees. + origin: A ladybug_geometry Point3D for the origin around which the + object will be rotated. + """ + origin_2d = Point2D(origin.x, origin.y) + for geo in self._geometry: + if isinstance(geo, _DisplayBase3D): + geo.rotate_xy(angle, origin) + elif isinstance(geo, _DisplayBase2D): + geo.rotate(angle, origin_2d)
+ +
[docs] def scale(self, factor, origin=None): + """Scale this ContextGeometry by a factor from an origin point. + + Args: + factor: A number representing how much the object should be scaled. + origin: A ladybug_geometry Point3D representing the origin from which + to scale. If None, it will be scaled from the World origin (0, 0, 0). + """ + origin_2d = Point2D(origin.x, origin.y) if origin is not None else None + for geo in self._geometry: + if isinstance(geo, _DisplayBase3D): + geo.scale(factor, origin) + elif isinstance(geo, _DisplayBase2D): + geo.scale(factor, origin_2d)
+ +
[docs] def to_dict(self): + """Get ContextGeometry as a dictionary.""" + base = { + 'type': 'ContextGeometry', + 'identifier': self.identifier, + 'geometry': [geo.to_dict() for geo in self.geometry], + 'hidden': self.hidden + } + if self._display_name is not None: + base['display_name'] = self.display_name + if self.user_data is not None: + base['user_data'] = self.user_data + return base
+ +
[docs] @staticmethod + def geometry_to_wireframe(geometry): + """Convert a raw ladybug-geometry object into a wireframe ladybug-display object. + + Args: + geometry: A raw ladybug-geometry object to be converted to a wireframe + ladybug-display object. + """ + conv_info = ContextGeometry.WIREFRAME_MAP[geometry.__class__] + new_class, wire_args = conv_info[0], list(conv_info[1:]) + wire_args.insert(0, geometry) + return new_class(*wire_args)
+ + def _calculate_min_max(self): + """Calculate maximum and minimum Point3D for this object.""" + lb_geos = [d_geo.geometry for d_geo in self.geometry] + self._min_point, self._max_point = bounding_box(lb_geos) + + def __copy__(self): + new_geo_objs = tuple(geo.duplicate() for geo in self.geometry) + new_obj = ContextGeometry(self.identifier, new_geo_objs, self.hidden) + new_obj._display_name = self._display_name + new_obj._user_data = None if self.user_data is None else self.user_data.copy() + return new_obj + + def __len__(self): + """Return number of geometries on the object.""" + return len(self.geometry) + + def __getitem__(self, key): + """Return one of the geometries.""" + return self.geometry[key] + + def __iter__(self): + """Iterate through the geometries.""" + return iter(self.geometry) + +
[docs] def ToString(self): + """Overwrite .NET ToString.""" + return self.__repr__()
+ + def __repr__(self): + """AnalysisGeometry representation.""" + return 'Context Geometry: {}'.format(self.display_name)
+ + +
[docs]class AnalysisGeometry(_VisualizationBase): + """An object where geometry is colored with data. + + Multiple data sets for different metrics can correspond to the same geometry. + + Args: + identifier: Text string for a unique object ID. Must be less than 100 + characters and not contain spaces or special characters. + geometry: A list of ladybug-geometry objects that is aligned with the values in + the input data_sets. The length of this list should usually be equal to the + total number of values in each data_set, indicating that each geometry + gets a single color. Alternatively, if all of the geometry objects are + meshes, the number of values in the data can be equal to the total number + of faces across the meshes or the total number of vertices across the meshes. + data_sets: A list of VisualizationData objects representing the data sets + that are associated with the input geometry. + active_data: An integer to denote which of the input data_sets should be + displayed by default. (Default: 0). + display_mode: Text to indicate the display mode (surface, wireframe, etc.). + Choose from the following. (Default: Surface). + + * Surface + * SurfaceWithEdges + * Wireframe + * Points + + hidden: A boolean to note whether the geometry is hidden by default and + must be un-hidden to be visible in the 3D scene. (Default: False). + + Properties: + * identifier + * display_name + * geometry + * data_sets + * active_data + * display_mode + * hidden + * min_point + * max_point + * matching_method + * user_data + """ + __slots__ = ( + '_geometry', '_data_sets', '_active_data', '_display_mode', '_hidden', + '_min_point', '_max_point', '_possible_lengths', '_matching_method') + T_FORMABLE_2D = (Point2D, Ray2D, LineSegment2D, Polyline2D, Arc2D, Polygon2D, Mesh2D) + + def __init__(self, identifier, geometry, data_sets, + active_data=0, display_mode='Surface', hidden=False): + """Initialize AnalysisGeometry.""" + _VisualizationBase.__init__(self, identifier) # process the identifier + if not isinstance(geometry, tuple): + geometry = tuple(geometry) + if not isinstance(data_sets, tuple): + data_sets = tuple(data_sets) + self._possible_lengths = self._possible_data_lengths(geometry) + self._matching_method = None + for dat in data_sets: + self._check_data_set(dat) + self._geometry = geometry + self._data_sets = data_sets + self.active_data = active_data + self.display_mode = display_mode + self.hidden = hidden + self._min_point = None + self._max_point = None + +
[docs] @classmethod + def from_dict(cls, data): + """Create an AnalysisGeometry from a dictionary. + + Args: + data: A python dictionary in the following format + + .. code-block:: python + + { + "type": "AnalysisGeometry", + "identifier": "", # unique object identifier + "geometry": [], # list of geometry objects + "data_sets": [], # list of data sets associated with the geometry + "active_data": 0, # integer for the index of the active data set + "display_mode": "Surface", # text for the display mode of the data + "hidden": True # boolean for whether the layer is hidden by default + } + """ + # check the type key + assert data['type'] == 'AnalysisGeometry', \ + 'Expected AnalysisGeometry, Got {}.'.format(data['type']) + # re-serialize the geometry and data sets + geos = tuple(geometry_dict_to_object(geo) for geo in data['geometry']) + dts = tuple(VisualizationData.from_dict(dt) for dt in data['data_sets']) + # re-serialize the data type and unit + act_dt = data['active_data'] if 'active_data' in data else 0 + d_mode = data['display_mode'] if 'display_mode' in data else 'Surface' + hidden = False if 'hidden' not in data else data['hidden'] + new_obj = cls(data['identifier'], geos, dts, act_dt, d_mode, hidden) + if 'display_name' in data and data['display_name'] is not None: + new_obj.display_name = data['display_name'] + if 'user_data' in data and data['user_data'] is not None: + new_obj.user_data = data['user_data'] + return new_obj
+ + @property + def geometry(self): + """Get a tuple of geometry objects assigned to this AnalysisGeometry.""" + return self._geometry + + @property + def data_sets(self): + """Get a tuple of VisualizationData assigned to the AnalysisGeometry.""" + return self._data_sets + + @property + def active_data(self): + """Get or set an integer for the index of data set that is actively displaying. + """ + return self._active_data + + @active_data.setter + def active_data(self, value): + self._active_data = int_in_range( + value, 0, len(self._data_sets) - 1, 'active_data') + + @property + def display_mode(self): + """Get or set text to indicate the display mode.""" + return self._display_mode + + @display_mode.setter + def display_mode(self, value): + clean_input = value.lower() + for key in DISPLAY_MODES: + if key.lower() == clean_input: + value = key + break + else: + raise ValueError( + 'display_mode {} is not recognized.\nChoose from the ' + 'following:\n{}'.format(value, DISPLAY_MODES)) + self._display_mode = value + + @property + def hidden(self): + """Get or set a boolean for whether the geometry is hidden by default.""" + return self._hidden + + @hidden.setter + def hidden(self, value): + self._hidden = bool(value) + + @property + def min_point(self): + """A Point3D for the minimum bounding box vertex around all of the geometry.""" + if self._min_point is None: + self._calculate_min_max() + return self._min_point + + @property + def max_point(self): + """A Point3D for the maximum bounding box vertex around all of the geometry.""" + if self._max_point is None: + self._calculate_min_max() + return self._max_point + + @property + def matching_method(self): + """Get text for the method by which the data is matched to the geometry. + + This will be one of the following. + + * geometries - One value is assigned for each geometry + * faces - One value is assigned per each face of the Mesh + * vertices - One value is assigned per each vertex of the Mesh + """ + return self._matching_method + + @property + def user_data(self): + """Get or set an optional dictionary for additional meta data for this object. + + This will be None until it has been set. All keys and values of this + dictionary should be of a standard Python type to ensure correct + serialization of the object to/from JSON (eg. str, float, int, list, dict) + """ + return self._user_data + + @user_data.setter + def user_data(self, value): + if value is not None: + assert isinstance(value, dict), 'Expected dictionary for ' \ + 'object user_data. Got {}.'.format(type(value)) + self._user_data = value + +
[docs] def add_data_set(self, data, insert_index=None): + """Add a data set to this AnalysisGeometry object. + + Args: + data: A VisualizationData object to be added to this AnalysisGeometry. + insert_index: An integer for the index at which the data should be + inserted. If None, the data will be appended to the end. (Default: None). + """ + self._check_data_set(data) + if insert_index is None: + self._data_sets = self._data_sets + (data,) + else: + ds_list = list(self._data_sets) + ds_list.insert(insert_index, data) + self._data_sets = tuple(ds_list)
+ +
[docs] def remove_data_set(self, data_index): + """Remove a data set from this AnalysisGeometry object. + + Args: + data_index: An integer for the data index to be removed. + """ + assert data_index < len(self._data_sets), 'data_index ({}) must be less than ' \ + 'the number of items in the data_sets ({}).'.format( + data_index, len(self._data_sets)) + ds_list = list(self._data_sets) + ds_list.pop(data_index) + self._data_sets = tuple(ds_list) + if self._active_data == len(self._data_sets): + self._active_data = len(self._data_sets) - 1
+ +
[docs] def graphic_container(self, data_index=None, min_point=None, max_point=None): + """Get a Ladybug GraphicContainer object, which can be used to draw legends. + + Args: + data_index: Integer for the index of the data set for which a + GraphicContainer will be returned. If None, the active_data set + will be used. (Default: None). + min_point: An optional Point3D to denote the minimum bounding box + for the graphic container. If None, this object's own min_point + will be used, which corresponds to the bounding box around + the geometry. (Default: None). + max_point: An optional Point3D to denote the maximum bounding box + for the graphic container. If None, this object's own max_point + will be used, which corresponds to the bounding box around + the geometry. (Default: None). + """ + # ensure that min and max points always make sense + min_point = self.min_point if min_point is None else min_point + max_point = self.max_point if max_point is None else max_point + # return the Graphic Container for the correct data set + data_index = self.active_data if data_index is None else data_index + return self.data_sets[data_index].graphic_container(min_point, max_point)
+ +
[docs] def move(self, moving_vec): + """Move this AnalysisGeometry along a vector. + + Args: + moving_vec: A ladybug_geometry Vector3D with the direction and distance + to move the AnalysisGeometry. + """ + new_geo = [] + moving_vec_2d = Vector2D(moving_vec.x, moving_vec.y) + for geo in self._geometry: + try: # most likely a 3D object + new_geo.append(geo.move(moving_vec)) + except Exception: # possibly a 2D object + if isinstance(geo, self.T_FORMABLE_2D): + new_geo.append(geo.move(moving_vec_2d)) + else: # object like a vector for which the transform is meaningless + new_geo.append(geo) + self._geometry = tuple(new_geo)
+ +
[docs] def rotate_xy(self, angle, origin): + """Rotate this AnalysisGeometry counterclockwise in the world XY plane. + + Args: + angle: An angle in degrees. + origin: A ladybug_geometry Point3D for the origin around which the + object will be rotated. + """ + new_geo = [] + origin_2d = Point2D(origin.x, origin.y) + for geo in self._geometry: + try: + new_geo.append(geo.rotate_xy(angle, origin)) + except Exception: # possibly a 2D object + if isinstance(geo, self.T_FORMABLE_2D): + new_geo.append(geo.rotate(angle, origin_2d)) + else: # object like a vector for which the transform is meaningless + new_geo.append(geo) + self._geometry = tuple(new_geo)
+ +
[docs] def scale(self, factor, origin=None): + """Scale this AnalysisGeometry by a factor from an origin point. + + Args: + factor: A number representing how much the object should be scaled. + origin: A ladybug_geometry Point3D representing the origin from which + to scale. If None, it will be scaled from the World origin (0, 0, 0). + """ + new_geo = [] + origin_2d = Point2D(origin.x, origin.y) if origin is not None else None + for geo in self._geometry: + try: + new_geo.append(geo.scale(factor, origin)) + except Exception: # possibly a 2D object + if isinstance(geo, self.T_FORMABLE_2D): + new_geo.append(geo.scale(factor, origin_2d)) + else: # object like a vector for which the transform is meaningless + new_geo.append(geo) + self._geometry = tuple(new_geo)
+ +
[docs] def to_dict(self): + """Get AnalysisGeometry as a dictionary.""" + base = { + 'type': 'AnalysisGeometry', + 'identifier': self.identifier, + 'geometry': [geo.to_dict() for geo in self.geometry], + 'data_sets': [ds.to_dict() for ds in self.data_sets], + 'active_data': self.active_data, + 'display_mode': self.display_mode, + 'hidden': self.hidden + } + if self._display_name is not None: + base['display_name'] = self.display_name + if self.user_data is not None: + base['user_data'] = self.user_data + return base
+ + def _check_data_set(self, data_set): + """Check that a data set is compatible with the geometry.""" + assert isinstance(data_set, VisualizationData), 'Expected VisualizationData ' \ + 'for AnalysisGeometry. Got {}.'.format(type(data_set)) + if self._matching_method is None: # first data set to be matched + pl = self._possible_lengths + if pl[1] == 0 and pl[2] == 0: + assert len(data_set) == pl[0], 'Expected number of data set values ' \ + '({}) to align with the number of geometries ({}).'.format( + len(data_set.values), pl[0]) + else: + assert len(data_set) in pl, 'Expected number of data set values ' \ + '({}) to align with the number of geometries ({}), the number of ' \ + 'geometry faces ({}), or the number of geometry vertices ' \ + '({}).'.format(len(data_set.values), pl[0], pl[1], pl[2]) + self._matching_method = self._matching_type(data_set)[0] + else: + assert self._matching_type(data_set)[0] == self._matching_method, \ + 'Expected number of data set values ({}) to align with the number ' \ + 'of {} ({}).'.format(len(data_set.values), self._matching_method, + self._matching_type(data_set)[1]) + + def _matching_type(self, dat_set): + """Get text and number of values for the method by which data and geometry match. + + Args: + dat_set: A data set which will have its length evaluated in relation to + this object's geometry. + """ + geo_len, face_len, vert_len = self._possible_lengths + if len(dat_set) == geo_len: + return 'geometries', geo_len + if len(dat_set) == face_len: + return 'faces', face_len + if len(dat_set) == vert_len: + return 'vertices', vert_len + + def _calculate_min_max(self): + """Calculate maximum and minimum Point3D for this object.""" + self._min_point, self._max_point = bounding_box(self.geometry) + + @staticmethod + def _possible_data_lengths(geometry): + """Get the acceptable data lengths given the input geometry.""" + geo_count_0, geo_count_1, geo_count_2 = len(geometry), 0, 0 + for geo in geometry: + if isinstance(geo, (Mesh2D, Mesh3D)): + geo_count_1 += len(geo.faces) + geo_count_2 += len(geo.vertices) + else: + assert isinstance(geo, GEOMETRY_UNION), 'Expected ladybug geometry ' \ + 'object for AnalysisGeometry. Got {}.'.format(type(geo)) + return (geo_count_0, geo_count_1, geo_count_2) + + def __copy__(self): + new_d = tuple(data.duplicate() for data in self.data_sets) + new_obj = AnalysisGeometry( + self.identifier, self.geometry, new_d, self.active_data, + self.display_mode, self.hidden) + new_obj._display_name = self._display_name + new_obj._user_data = None if self.user_data is None else self.user_data.copy() + return new_obj + + def __len__(self): + """Return number of data sets on the object.""" + return len(self.data_sets) + + def __getitem__(self, key): + """Return one of the data sets.""" + return self.data_sets[key] + + def __iter__(self): + """Iterate through the data sets.""" + return iter(self.data_sets) + +
[docs] def ToString(self): + """Overwrite .NET ToString.""" + return self.__repr__()
+ + def __repr__(self): + """AnalysisGeometry representation.""" + return 'Analysis Geometry: {}'.format(self.display_name)
+ + +
[docs]class VisualizationMetaData(object): + """Represents the metadata for visualization with legend parameters and data type. + + Args: + legend_parameters: An Optional LegendParameters object to override default + parameters of the legend. None indicates that default legend parameters + will be used. (Default: None). + data_type: Optional DataType from the ladybug datatype subpackage (ie. + Temperature()) , which will be used to assign default legend properties. + If None, the legend associated with this object will contain no units + unless a unit below is specified. (Default: None). + unit: Optional text string for the units of the values. (ie. "C"). If None + or empty, the default units of the data_type will be used. If no data + type is specified in this case, this will simply be an empty + string. (Default: None). + + Properties: + * legend_parameters + * data_type + * unit + * user_data + """ + __slots__ = ('_legend_parameters', '_data_type', '_unit', '_user_data') + + def __init__(self, legend_parameters=None, data_type=None, unit=None): + """Initialize VisualizationMetaData.""" + self._legend_parameters = legend_parameters + self._data_type = data_type + self._unit = unit + self._user_data = None + +
[docs] @classmethod + def from_dict(cls, data): + """Create VisualizationMetaData from a dictionary. + + Args: + data: A python dictionary in the following format + + .. code-block:: python + + { + "type": "VisualizationMetaData", + "legend_parameters": {}, # optional LegendParameter specification + "data_type": {}, # optional DataType object + "unit": "C" # optional text for the units + } + """ + # check the type key + assert data['type'] == 'VisualizationMetaData', \ + 'Expected VisualizationMetaData, Got {}.'.format(data['type']) + # re-serialize the legend parameters + legend_parameters = None + if 'legend_parameters' in data and data['legend_parameters'] is not None: + if data['legend_parameters']['type'] == 'LegendParametersCategorized': + legend_parameters = LegendParametersCategorized.from_dict( + data['legend_parameters']) + else: + legend_parameters = LegendParameters.from_dict(data['legend_parameters']) + # re-serialize the data type and unit + data_type = None + if 'data_type' in data and data['data_type'] is not None: + data_type = DataTypeBase.from_dict(data['data_type']) + unit = data['unit'] if 'unit' in data else None + new_obj = cls(legend_parameters, data_type, unit) + if 'user_data' in data and data['user_data'] is not None: + new_obj.user_data = data['user_data'] + return new_obj
+ + @property + def legend_parameters(self): + """Get the legend parameters assigned to this data set.""" + return self._legend_parameters + + @property + def data_type(self): + """Get the data_type input to this object (if it exists).""" + return self._data_type + + @property + def unit(self): + """Get the unit input to this object (if it exists).""" + return self._unit + + @property + def user_data(self): + """Get or set an optional dictionary for additional meta data for this object. + + This will be None until it has been set. All keys and values of this + dictionary should be of a standard Python type to ensure correct + serialization of the object to/from JSON (eg. str, float, int, list, dict) + """ + return self._user_data + + @user_data.setter + def user_data(self, value): + if value is not None: + assert isinstance(value, dict), 'Expected dictionary for ' \ + 'object user_data. Got {}.'.format(type(value)) + self._user_data = value + +
[docs] def to_dict(self): + """Get visualization data as a dictionary.""" + base = { + 'type': 'VisualizationMetaData' + } + if self._legend_parameters is not None: + base['legend_parameters'] = self._legend_parameters.to_dict() + if self.data_type is not None: + base['data_type'] = self.data_type.to_dict() + if self.unit: + base['unit'] = self.unit + if self.user_data is not None: + base['user_data'] = self.user_data + return base
+ +
[docs] def ToString(self): + """Overwrite .NET ToString.""" + return self.__repr__()
+ + def __repr__(self): + """VisualizationMetaData representation.""" + return 'Visualization MetaData'
+ + +
[docs]class VisualizationData(VisualizationMetaData): + """Represents a data set for visualization with legend parameters and data type. + + Args: + values: A list of numerical values that will be used to generate the + visualization colors. + legend_parameters: An Optional LegendParameters object to override default + parameters of the legend. None indicates that default legend parameters + will be used. (Default: None). + data_type: Optional DataType from the ladybug datatype subpackage (ie. + Temperature()) , which will be used to assign default legend properties. + If None, the legend associated with this object will contain no units + unless a unit below is specified. (Default: None). + unit: Optional text string for the units of the values. (ie. "C"). If None + or empty, the default units of the data_type will be used. If no data + type is specified in this case, this will simply be an empty + string. (Default: None). + + Properties: + * values + * legend_parameters + * legend + * data_type + * unit + * value_colors + * user_data + """ + __slots__ = ('_legend',) + + def __init__(self, values, legend_parameters=None, data_type=None, unit=None): + """Initialize VisualizationData.""" + # set up the legend using the values and legend parameters + VisualizationMetaData.__init__(self, legend_parameters, data_type, unit) + + # assign defaults to the legend parameter using the values and the data type + self._legend = Legend(values, legend_parameters) + if data_type is not None: + assert isinstance(data_type, DataTypeBase), \ + 'data_type should be a ladybug DataType. Got {}'.format(type(data_type)) + if self.legend_parameters.is_title_default: + unit = unit if unit else data_type.units[0] + data_type.is_unit_acceptable(unit) + self.legend_parameters.title = unit if \ + self.legend_parameters.vertical \ + else '{} ({})'.format(data_type.name, unit) + if data_type.unit_descr is not None and \ + self.legend_parameters.ordinal_dictionary is None and not \ + isinstance(self.legend_parameters, LegendParametersCategorized): + self.legend_parameters.ordinal_dictionary = data_type.unit_descr + sorted_keys = sorted(data_type.unit_descr.keys()) + if self.legend.is_min_default: + self.legend_parameters._min = sorted_keys[0] + if self.legend.is_max_default: + self.legend_parameters._max = sorted_keys[-1] + assert self.legend_parameters._min <= self.legend_parameters._max, \ + 'Legend min is greater than legend max. {} > {}.'.format( + self.legend_parameters._min, self.legend_parameters._max) + if self.legend_parameters.is_segment_count_default: + try: # try to set the number of segments to align with ordinal text + min_i = sorted_keys.index(self.legend_parameters.min) + max_i = sorted_keys.index(self.legend_parameters.max) + self.legend_parameters.segment_count = \ + len(sorted_keys[min_i:max_i + 1]) + except IndexError: + pass + elif unit and self.legend_parameters.is_title_default: + assert isinstance(unit, str), \ + 'Expected string for unit. Got {}.'.format(type(unit)) + self.legend_parameters.title = unit + +
[docs] @classmethod + def from_dict(cls, data): + """Create VisualizationData from a dictionary. + + Args: + data: A python dictionary in the following format + + .. code-block:: python + + { + "type": "VisualizationData", + "values": [0, 10], + "legend_parameters": {}, # optional LegendParameter specification + "data_type": {}, # optional DataType object + "unit": "C" # optional text for the units + } + """ + # check the type key + assert data['type'] == 'VisualizationData', \ + 'Expected VisualizationData, Got {}.'.format(data['type']) + # re-serialize the legend parameters + legend_parameters = None + if 'legend_parameters' in data and data['legend_parameters'] is not None: + if data['legend_parameters']['type'] == 'LegendParametersCategorized': + legend_parameters = LegendParametersCategorized.from_dict( + data['legend_parameters']) + else: + legend_parameters = LegendParameters.from_dict(data['legend_parameters']) + # re-serialize the data type and unit + data_type = None + if 'data_type' in data and data['data_type'] is not None: + data_type = DataTypeBase.from_dict(data['data_type']) + unit = data['unit'] if 'unit' in data else None + new_obj = cls(data['values'], legend_parameters, data_type, unit) + if 'user_data' in data and data['user_data'] is not None: + new_obj.user_data = data['user_data'] + return new_obj
+ + @property + def values(self): + """Get the values assigned to the data set.""" + return self._legend.values + + @property + def legend_parameters(self): + """Get the legend parameters assigned to this data set.""" + return self._legend._legend_par + + @property + def legend(self): + """Get the legend assigned to this data set.""" + return self._legend + + @property + def value_colors(self): + """Get a List of colors associated with the assigned values.""" + return self._legend.value_colors + +
[docs] def graphic_container(self, min_point, max_point): + """Get a Ladybug GraphicContainer object, which can be used to a draw legend. + + Args: + min_point: An optional Point3D to denote the minimum bounding box + for the graphic container. + max_point: An optional Point3D to denote the maximum bounding box + for the graphic container. + """ + return GraphicContainer( + self.values, min_point, max_point, self._legend_parameters, + self._data_type, self._unit)
+ +
[docs] def to_dict(self): + """Get visualization data as a dictionary.""" + base = { + 'type': 'VisualizationData', + 'values': self.values + } + if self._legend_parameters is not None: + base['legend_parameters'] = self._legend_parameters.to_dict() + if self.data_type is not None: + base['data_type'] = self.data_type.to_dict() + if self.unit: + base['unit'] = self.unit + if self.user_data is not None: + base['user_data'] = self.user_data + return base
+ +
[docs] def duplicate(self): + """Get a copy of this object.""" + return self.__copy__()
+ + def __copy__(self): + new_obj = VisualizationData( + self.values, self._legend_parameters, self._data_type, self._unit) + new_obj._user_data = None if self.user_data is None else self.user_data.copy() + return new_obj + + def __len__(self): + """Return length of values on the object.""" + return len(self._legend._values) + + def __getitem__(self, key): + """Return one of the values.""" + return self._legend._values[key] + + def __iter__(self): + """Iterate through the values.""" + return iter(self._legend._values) + +
[docs] def ToString(self): + """Overwrite .NET ToString.""" + return self.__repr__()
+ + def __repr__(self): + """VisualizationData representation.""" + return 'Visualization Data ({} values)'.format(len(self))
+
+ +
+ +
+
+
+
+

+ Back to top + +

+

+ © Copyright 2024, Ladybug Tools.
+ Created using Sphinx 5.3.0.
+

+
+
+ + \ No newline at end of file diff --git a/docs/_sources/cli/index.rst.txt b/docs/_sources/cli/index.rst.txt new file mode 100644 index 0000000..6172e77 --- /dev/null +++ b/docs/_sources/cli/index.rst.txt @@ -0,0 +1,7 @@ +CLI Docs +======== + +Installation +------------ + +To check if the command line is installed correctly use ``ladybug-display --help`` diff --git a/docs/_sources/index.rst.txt b/docs/_sources/index.rst.txt new file mode 100644 index 0000000..e255363 --- /dev/null +++ b/docs/_sources/index.rst.txt @@ -0,0 +1,28 @@ +Welcome to ladybug-display's documentation! +=================================== + +A library that assigns basic display attributes to ladybug-geometry objects (color, line weight, line type, etc). + + +Installation +============ + +``pip install ladybug-display`` + + +ladybug-display +======= + +.. toctree:: + :maxdepth: 2 + :caption: Contents: + +.. include:: modules.rst + + +Indices and tables +================== + +* :ref:`genindex` +* :ref:`modindex` +* :ref:`search` diff --git a/docs/_sources/ladybug_display.altnumber.rst.txt b/docs/_sources/ladybug_display.altnumber.rst.txt new file mode 100644 index 0000000..c01dcfb --- /dev/null +++ b/docs/_sources/ladybug_display.altnumber.rst.txt @@ -0,0 +1,7 @@ +ladybug\_display.altnumber module +================================= + +.. automodule:: ladybug_display.altnumber + :members: + :undoc-members: + :show-inheritance: diff --git a/docs/_sources/ladybug_display.dictutil.rst.txt b/docs/_sources/ladybug_display.dictutil.rst.txt new file mode 100644 index 0000000..995ca97 --- /dev/null +++ b/docs/_sources/ladybug_display.dictutil.rst.txt @@ -0,0 +1,7 @@ +ladybug\_display.dictutil module +================================ + +.. automodule:: ladybug_display.dictutil + :members: + :undoc-members: + :show-inheritance: diff --git a/docs/_sources/ladybug_display.extension.adaptivechart.rst.txt b/docs/_sources/ladybug_display.extension.adaptivechart.rst.txt new file mode 100644 index 0000000..96980fe --- /dev/null +++ b/docs/_sources/ladybug_display.extension.adaptivechart.rst.txt @@ -0,0 +1,7 @@ +ladybug\_display.extension.adaptivechart module +=============================================== + +.. automodule:: ladybug_display.extension.adaptivechart + :members: + :undoc-members: + :show-inheritance: diff --git a/docs/_sources/ladybug_display.extension.compass.rst.txt b/docs/_sources/ladybug_display.extension.compass.rst.txt new file mode 100644 index 0000000..1b6fffb --- /dev/null +++ b/docs/_sources/ladybug_display.extension.compass.rst.txt @@ -0,0 +1,7 @@ +ladybug\_display.extension.compass module +========================================= + +.. automodule:: ladybug_display.extension.compass + :members: + :undoc-members: + :show-inheritance: diff --git a/docs/_sources/ladybug_display.extension.hourlyplot.rst.txt b/docs/_sources/ladybug_display.extension.hourlyplot.rst.txt new file mode 100644 index 0000000..0724912 --- /dev/null +++ b/docs/_sources/ladybug_display.extension.hourlyplot.rst.txt @@ -0,0 +1,7 @@ +ladybug\_display.extension.hourlyplot module +============================================ + +.. automodule:: ladybug_display.extension.hourlyplot + :members: + :undoc-members: + :show-inheritance: diff --git a/docs/_sources/ladybug_display.extension.monthlychart.rst.txt b/docs/_sources/ladybug_display.extension.monthlychart.rst.txt new file mode 100644 index 0000000..6e1cba6 --- /dev/null +++ b/docs/_sources/ladybug_display.extension.monthlychart.rst.txt @@ -0,0 +1,7 @@ +ladybug\_display.extension.monthlychart module +============================================== + +.. automodule:: ladybug_display.extension.monthlychart + :members: + :undoc-members: + :show-inheritance: diff --git a/docs/_sources/ladybug_display.extension.psychchart.rst.txt b/docs/_sources/ladybug_display.extension.psychchart.rst.txt new file mode 100644 index 0000000..59a3904 --- /dev/null +++ b/docs/_sources/ladybug_display.extension.psychchart.rst.txt @@ -0,0 +1,7 @@ +ladybug\_display.extension.psychchart module +============================================ + +.. automodule:: ladybug_display.extension.psychchart + :members: + :undoc-members: + :show-inheritance: diff --git a/docs/_sources/ladybug_display.extension.raddome.rst.txt b/docs/_sources/ladybug_display.extension.raddome.rst.txt new file mode 100644 index 0000000..651007b --- /dev/null +++ b/docs/_sources/ladybug_display.extension.raddome.rst.txt @@ -0,0 +1,7 @@ +ladybug\_display.extension.raddome module +========================================= + +.. automodule:: ladybug_display.extension.raddome + :members: + :undoc-members: + :show-inheritance: diff --git a/docs/_sources/ladybug_display.extension.radrose.rst.txt b/docs/_sources/ladybug_display.extension.radrose.rst.txt new file mode 100644 index 0000000..70c5eb9 --- /dev/null +++ b/docs/_sources/ladybug_display.extension.radrose.rst.txt @@ -0,0 +1,7 @@ +ladybug\_display.extension.radrose module +========================================= + +.. automodule:: ladybug_display.extension.radrose + :members: + :undoc-members: + :show-inheritance: diff --git a/docs/_sources/ladybug_display.extension.rst.txt b/docs/_sources/ladybug_display.extension.rst.txt new file mode 100644 index 0000000..5e9da9d --- /dev/null +++ b/docs/_sources/ladybug_display.extension.rst.txt @@ -0,0 +1,36 @@ +ladybug\_display.extension package +================================== + +Subpackages +----------- + +.. toctree:: + :maxdepth: 4 + + ladybug_display.extension.study + +Submodules +---------- + +.. toctree:: + :maxdepth: 4 + + ladybug_display.extension.adaptivechart + ladybug_display.extension.compass + ladybug_display.extension.hourlyplot + ladybug_display.extension.monthlychart + ladybug_display.extension.psychchart + ladybug_display.extension.raddome + ladybug_display.extension.radrose + ladybug_display.extension.skydome + ladybug_display.extension.sunpath + ladybug_display.extension.windprofile + ladybug_display.extension.windrose + +Module contents +--------------- + +.. automodule:: ladybug_display.extension + :members: + :undoc-members: + :show-inheritance: diff --git a/docs/_sources/ladybug_display.extension.skydome.rst.txt b/docs/_sources/ladybug_display.extension.skydome.rst.txt new file mode 100644 index 0000000..6365d4d --- /dev/null +++ b/docs/_sources/ladybug_display.extension.skydome.rst.txt @@ -0,0 +1,7 @@ +ladybug\_display.extension.skydome module +========================================= + +.. automodule:: ladybug_display.extension.skydome + :members: + :undoc-members: + :show-inheritance: diff --git a/docs/_sources/ladybug_display.extension.study.directsun.rst.txt b/docs/_sources/ladybug_display.extension.study.directsun.rst.txt new file mode 100644 index 0000000..a5644c4 --- /dev/null +++ b/docs/_sources/ladybug_display.extension.study.directsun.rst.txt @@ -0,0 +1,7 @@ +ladybug\_display.extension.study.directsun module +================================================= + +.. automodule:: ladybug_display.extension.study.directsun + :members: + :undoc-members: + :show-inheritance: diff --git a/docs/_sources/ladybug_display.extension.study.radiation.rst.txt b/docs/_sources/ladybug_display.extension.study.radiation.rst.txt new file mode 100644 index 0000000..a781610 --- /dev/null +++ b/docs/_sources/ladybug_display.extension.study.radiation.rst.txt @@ -0,0 +1,7 @@ +ladybug\_display.extension.study.radiation module +================================================= + +.. automodule:: ladybug_display.extension.study.radiation + :members: + :undoc-members: + :show-inheritance: diff --git a/docs/_sources/ladybug_display.extension.study.rst.txt b/docs/_sources/ladybug_display.extension.study.rst.txt new file mode 100644 index 0000000..dee71d4 --- /dev/null +++ b/docs/_sources/ladybug_display.extension.study.rst.txt @@ -0,0 +1,19 @@ +ladybug\_display.extension.study package +======================================== + +Submodules +---------- + +.. toctree:: + :maxdepth: 4 + + ladybug_display.extension.study.directsun + ladybug_display.extension.study.radiation + +Module contents +--------------- + +.. automodule:: ladybug_display.extension.study + :members: + :undoc-members: + :show-inheritance: diff --git a/docs/_sources/ladybug_display.extension.sunpath.rst.txt b/docs/_sources/ladybug_display.extension.sunpath.rst.txt new file mode 100644 index 0000000..0cb21e3 --- /dev/null +++ b/docs/_sources/ladybug_display.extension.sunpath.rst.txt @@ -0,0 +1,7 @@ +ladybug\_display.extension.sunpath module +========================================= + +.. automodule:: ladybug_display.extension.sunpath + :members: + :undoc-members: + :show-inheritance: diff --git a/docs/_sources/ladybug_display.extension.windprofile.rst.txt b/docs/_sources/ladybug_display.extension.windprofile.rst.txt new file mode 100644 index 0000000..e7d6eb1 --- /dev/null +++ b/docs/_sources/ladybug_display.extension.windprofile.rst.txt @@ -0,0 +1,7 @@ +ladybug\_display.extension.windprofile module +============================================= + +.. automodule:: ladybug_display.extension.windprofile + :members: + :undoc-members: + :show-inheritance: diff --git a/docs/_sources/ladybug_display.extension.windrose.rst.txt b/docs/_sources/ladybug_display.extension.windrose.rst.txt new file mode 100644 index 0000000..6777523 --- /dev/null +++ b/docs/_sources/ladybug_display.extension.windrose.rst.txt @@ -0,0 +1,7 @@ +ladybug\_display.extension.windrose module +========================================== + +.. automodule:: ladybug_display.extension.windrose + :members: + :undoc-members: + :show-inheritance: diff --git a/docs/_sources/ladybug_display.geometry2d.arc.rst.txt b/docs/_sources/ladybug_display.geometry2d.arc.rst.txt new file mode 100644 index 0000000..94c15e6 --- /dev/null +++ b/docs/_sources/ladybug_display.geometry2d.arc.rst.txt @@ -0,0 +1,7 @@ +ladybug\_display.geometry2d.arc module +====================================== + +.. automodule:: ladybug_display.geometry2d.arc + :members: + :undoc-members: + :show-inheritance: diff --git a/docs/_sources/ladybug_display.geometry2d.line.rst.txt b/docs/_sources/ladybug_display.geometry2d.line.rst.txt new file mode 100644 index 0000000..6304a80 --- /dev/null +++ b/docs/_sources/ladybug_display.geometry2d.line.rst.txt @@ -0,0 +1,7 @@ +ladybug\_display.geometry2d.line module +======================================= + +.. automodule:: ladybug_display.geometry2d.line + :members: + :undoc-members: + :show-inheritance: diff --git a/docs/_sources/ladybug_display.geometry2d.mesh.rst.txt b/docs/_sources/ladybug_display.geometry2d.mesh.rst.txt new file mode 100644 index 0000000..b6ffcc4 --- /dev/null +++ b/docs/_sources/ladybug_display.geometry2d.mesh.rst.txt @@ -0,0 +1,7 @@ +ladybug\_display.geometry2d.mesh module +======================================= + +.. automodule:: ladybug_display.geometry2d.mesh + :members: + :undoc-members: + :show-inheritance: diff --git a/docs/_sources/ladybug_display.geometry2d.point.rst.txt b/docs/_sources/ladybug_display.geometry2d.point.rst.txt new file mode 100644 index 0000000..0ec905e --- /dev/null +++ b/docs/_sources/ladybug_display.geometry2d.point.rst.txt @@ -0,0 +1,7 @@ +ladybug\_display.geometry2d.point module +======================================== + +.. automodule:: ladybug_display.geometry2d.point + :members: + :undoc-members: + :show-inheritance: diff --git a/docs/_sources/ladybug_display.geometry2d.polygon.rst.txt b/docs/_sources/ladybug_display.geometry2d.polygon.rst.txt new file mode 100644 index 0000000..7327a49 --- /dev/null +++ b/docs/_sources/ladybug_display.geometry2d.polygon.rst.txt @@ -0,0 +1,7 @@ +ladybug\_display.geometry2d.polygon module +========================================== + +.. automodule:: ladybug_display.geometry2d.polygon + :members: + :undoc-members: + :show-inheritance: diff --git a/docs/_sources/ladybug_display.geometry2d.polyline.rst.txt b/docs/_sources/ladybug_display.geometry2d.polyline.rst.txt new file mode 100644 index 0000000..63000b4 --- /dev/null +++ b/docs/_sources/ladybug_display.geometry2d.polyline.rst.txt @@ -0,0 +1,7 @@ +ladybug\_display.geometry2d.polyline module +=========================================== + +.. automodule:: ladybug_display.geometry2d.polyline + :members: + :undoc-members: + :show-inheritance: diff --git a/docs/_sources/ladybug_display.geometry2d.ray.rst.txt b/docs/_sources/ladybug_display.geometry2d.ray.rst.txt new file mode 100644 index 0000000..3168a38 --- /dev/null +++ b/docs/_sources/ladybug_display.geometry2d.ray.rst.txt @@ -0,0 +1,7 @@ +ladybug\_display.geometry2d.ray module +====================================== + +.. automodule:: ladybug_display.geometry2d.ray + :members: + :undoc-members: + :show-inheritance: diff --git a/docs/_sources/ladybug_display.geometry2d.rst.txt b/docs/_sources/ladybug_display.geometry2d.rst.txt new file mode 100644 index 0000000..a566d74 --- /dev/null +++ b/docs/_sources/ladybug_display.geometry2d.rst.txt @@ -0,0 +1,25 @@ +ladybug\_display.geometry2d package +=================================== + +Submodules +---------- + +.. toctree:: + :maxdepth: 4 + + ladybug_display.geometry2d.arc + ladybug_display.geometry2d.line + ladybug_display.geometry2d.mesh + ladybug_display.geometry2d.point + ladybug_display.geometry2d.polygon + ladybug_display.geometry2d.polyline + ladybug_display.geometry2d.ray + ladybug_display.geometry2d.vector + +Module contents +--------------- + +.. automodule:: ladybug_display.geometry2d + :members: + :undoc-members: + :show-inheritance: diff --git a/docs/_sources/ladybug_display.geometry2d.vector.rst.txt b/docs/_sources/ladybug_display.geometry2d.vector.rst.txt new file mode 100644 index 0000000..51a198a --- /dev/null +++ b/docs/_sources/ladybug_display.geometry2d.vector.rst.txt @@ -0,0 +1,7 @@ +ladybug\_display.geometry2d.vector module +========================================= + +.. automodule:: ladybug_display.geometry2d.vector + :members: + :undoc-members: + :show-inheritance: diff --git a/docs/_sources/ladybug_display.geometry3d.arc.rst.txt b/docs/_sources/ladybug_display.geometry3d.arc.rst.txt new file mode 100644 index 0000000..7cf8fa9 --- /dev/null +++ b/docs/_sources/ladybug_display.geometry3d.arc.rst.txt @@ -0,0 +1,7 @@ +ladybug\_display.geometry3d.arc module +====================================== + +.. automodule:: ladybug_display.geometry3d.arc + :members: + :undoc-members: + :show-inheritance: diff --git a/docs/_sources/ladybug_display.geometry3d.cone.rst.txt b/docs/_sources/ladybug_display.geometry3d.cone.rst.txt new file mode 100644 index 0000000..d1685e8 --- /dev/null +++ b/docs/_sources/ladybug_display.geometry3d.cone.rst.txt @@ -0,0 +1,7 @@ +ladybug\_display.geometry3d.cone module +======================================= + +.. automodule:: ladybug_display.geometry3d.cone + :members: + :undoc-members: + :show-inheritance: diff --git a/docs/_sources/ladybug_display.geometry3d.cylinder.rst.txt b/docs/_sources/ladybug_display.geometry3d.cylinder.rst.txt new file mode 100644 index 0000000..5c7996b --- /dev/null +++ b/docs/_sources/ladybug_display.geometry3d.cylinder.rst.txt @@ -0,0 +1,7 @@ +ladybug\_display.geometry3d.cylinder module +=========================================== + +.. automodule:: ladybug_display.geometry3d.cylinder + :members: + :undoc-members: + :show-inheritance: diff --git a/docs/_sources/ladybug_display.geometry3d.face.rst.txt b/docs/_sources/ladybug_display.geometry3d.face.rst.txt new file mode 100644 index 0000000..004d24b --- /dev/null +++ b/docs/_sources/ladybug_display.geometry3d.face.rst.txt @@ -0,0 +1,7 @@ +ladybug\_display.geometry3d.face module +======================================= + +.. automodule:: ladybug_display.geometry3d.face + :members: + :undoc-members: + :show-inheritance: diff --git a/docs/_sources/ladybug_display.geometry3d.line.rst.txt b/docs/_sources/ladybug_display.geometry3d.line.rst.txt new file mode 100644 index 0000000..e05ac92 --- /dev/null +++ b/docs/_sources/ladybug_display.geometry3d.line.rst.txt @@ -0,0 +1,7 @@ +ladybug\_display.geometry3d.line module +======================================= + +.. automodule:: ladybug_display.geometry3d.line + :members: + :undoc-members: + :show-inheritance: diff --git a/docs/_sources/ladybug_display.geometry3d.mesh.rst.txt b/docs/_sources/ladybug_display.geometry3d.mesh.rst.txt new file mode 100644 index 0000000..05612dc --- /dev/null +++ b/docs/_sources/ladybug_display.geometry3d.mesh.rst.txt @@ -0,0 +1,7 @@ +ladybug\_display.geometry3d.mesh module +======================================= + +.. automodule:: ladybug_display.geometry3d.mesh + :members: + :undoc-members: + :show-inheritance: diff --git a/docs/_sources/ladybug_display.geometry3d.plane.rst.txt b/docs/_sources/ladybug_display.geometry3d.plane.rst.txt new file mode 100644 index 0000000..eb1689b --- /dev/null +++ b/docs/_sources/ladybug_display.geometry3d.plane.rst.txt @@ -0,0 +1,7 @@ +ladybug\_display.geometry3d.plane module +======================================== + +.. automodule:: ladybug_display.geometry3d.plane + :members: + :undoc-members: + :show-inheritance: diff --git a/docs/_sources/ladybug_display.geometry3d.point.rst.txt b/docs/_sources/ladybug_display.geometry3d.point.rst.txt new file mode 100644 index 0000000..30fb6ee --- /dev/null +++ b/docs/_sources/ladybug_display.geometry3d.point.rst.txt @@ -0,0 +1,7 @@ +ladybug\_display.geometry3d.point module +======================================== + +.. automodule:: ladybug_display.geometry3d.point + :members: + :undoc-members: + :show-inheritance: diff --git a/docs/_sources/ladybug_display.geometry3d.polyface.rst.txt b/docs/_sources/ladybug_display.geometry3d.polyface.rst.txt new file mode 100644 index 0000000..e7cb147 --- /dev/null +++ b/docs/_sources/ladybug_display.geometry3d.polyface.rst.txt @@ -0,0 +1,7 @@ +ladybug\_display.geometry3d.polyface module +=========================================== + +.. automodule:: ladybug_display.geometry3d.polyface + :members: + :undoc-members: + :show-inheritance: diff --git a/docs/_sources/ladybug_display.geometry3d.polyline.rst.txt b/docs/_sources/ladybug_display.geometry3d.polyline.rst.txt new file mode 100644 index 0000000..1815e21 --- /dev/null +++ b/docs/_sources/ladybug_display.geometry3d.polyline.rst.txt @@ -0,0 +1,7 @@ +ladybug\_display.geometry3d.polyline module +=========================================== + +.. automodule:: ladybug_display.geometry3d.polyline + :members: + :undoc-members: + :show-inheritance: diff --git a/docs/_sources/ladybug_display.geometry3d.ray.rst.txt b/docs/_sources/ladybug_display.geometry3d.ray.rst.txt new file mode 100644 index 0000000..57c7eea --- /dev/null +++ b/docs/_sources/ladybug_display.geometry3d.ray.rst.txt @@ -0,0 +1,7 @@ +ladybug\_display.geometry3d.ray module +====================================== + +.. automodule:: ladybug_display.geometry3d.ray + :members: + :undoc-members: + :show-inheritance: diff --git a/docs/_sources/ladybug_display.geometry3d.rst.txt b/docs/_sources/ladybug_display.geometry3d.rst.txt new file mode 100644 index 0000000..989a3e9 --- /dev/null +++ b/docs/_sources/ladybug_display.geometry3d.rst.txt @@ -0,0 +1,31 @@ +ladybug\_display.geometry3d package +=================================== + +Submodules +---------- + +.. toctree:: + :maxdepth: 4 + + ladybug_display.geometry3d.arc + ladybug_display.geometry3d.cone + ladybug_display.geometry3d.cylinder + ladybug_display.geometry3d.face + ladybug_display.geometry3d.line + ladybug_display.geometry3d.mesh + ladybug_display.geometry3d.plane + ladybug_display.geometry3d.point + ladybug_display.geometry3d.polyface + ladybug_display.geometry3d.polyline + ladybug_display.geometry3d.ray + ladybug_display.geometry3d.sphere + ladybug_display.geometry3d.text + ladybug_display.geometry3d.vector + +Module contents +--------------- + +.. automodule:: ladybug_display.geometry3d + :members: + :undoc-members: + :show-inheritance: diff --git a/docs/_sources/ladybug_display.geometry3d.sphere.rst.txt b/docs/_sources/ladybug_display.geometry3d.sphere.rst.txt new file mode 100644 index 0000000..9bf78b3 --- /dev/null +++ b/docs/_sources/ladybug_display.geometry3d.sphere.rst.txt @@ -0,0 +1,7 @@ +ladybug\_display.geometry3d.sphere module +========================================= + +.. automodule:: ladybug_display.geometry3d.sphere + :members: + :undoc-members: + :show-inheritance: diff --git a/docs/_sources/ladybug_display.geometry3d.text.rst.txt b/docs/_sources/ladybug_display.geometry3d.text.rst.txt new file mode 100644 index 0000000..2914b59 --- /dev/null +++ b/docs/_sources/ladybug_display.geometry3d.text.rst.txt @@ -0,0 +1,7 @@ +ladybug\_display.geometry3d.text module +======================================= + +.. automodule:: ladybug_display.geometry3d.text + :members: + :undoc-members: + :show-inheritance: diff --git a/docs/_sources/ladybug_display.geometry3d.vector.rst.txt b/docs/_sources/ladybug_display.geometry3d.vector.rst.txt new file mode 100644 index 0000000..923e90a --- /dev/null +++ b/docs/_sources/ladybug_display.geometry3d.vector.rst.txt @@ -0,0 +1,7 @@ +ladybug\_display.geometry3d.vector module +========================================= + +.. automodule:: ladybug_display.geometry3d.vector + :members: + :undoc-members: + :show-inheritance: diff --git a/docs/_sources/ladybug_display.rst.txt b/docs/_sources/ladybug_display.rst.txt new file mode 100644 index 0000000..0f65fee --- /dev/null +++ b/docs/_sources/ladybug_display.rst.txt @@ -0,0 +1,31 @@ +ladybug\_display package +======================== + +Subpackages +----------- + +.. toctree:: + :maxdepth: 4 + + ladybug_display.extension + ladybug_display.geometry2d + ladybug_display.geometry3d + +Submodules +---------- + +.. toctree:: + :maxdepth: 4 + + ladybug_display.altnumber + ladybug_display.dictutil + ladybug_display.typing + ladybug_display.visualization + +Module contents +--------------- + +.. automodule:: ladybug_display + :members: + :undoc-members: + :show-inheritance: diff --git a/docs/_sources/ladybug_display.typing.rst.txt b/docs/_sources/ladybug_display.typing.rst.txt new file mode 100644 index 0000000..f6e8776 --- /dev/null +++ b/docs/_sources/ladybug_display.typing.rst.txt @@ -0,0 +1,7 @@ +ladybug\_display.typing module +============================== + +.. automodule:: ladybug_display.typing + :members: + :undoc-members: + :show-inheritance: diff --git a/docs/_sources/ladybug_display.visualization.rst.txt b/docs/_sources/ladybug_display.visualization.rst.txt new file mode 100644 index 0000000..62de668 --- /dev/null +++ b/docs/_sources/ladybug_display.visualization.rst.txt @@ -0,0 +1,7 @@ +ladybug\_display.visualization module +===================================== + +.. automodule:: ladybug_display.visualization + :members: + :undoc-members: + :show-inheritance: diff --git a/docs/_sources/modules.rst.txt b/docs/_sources/modules.rst.txt new file mode 100644 index 0000000..51b6f80 --- /dev/null +++ b/docs/_sources/modules.rst.txt @@ -0,0 +1,7 @@ +ladybug_display +=============== + +.. toctree:: + :maxdepth: 4 + + ladybug_display diff --git a/docs/_static/_sphinx_javascript_frameworks_compat.js b/docs/_static/_sphinx_javascript_frameworks_compat.js new file mode 100644 index 0000000..8549469 --- /dev/null +++ b/docs/_static/_sphinx_javascript_frameworks_compat.js @@ -0,0 +1,134 @@ +/* + * _sphinx_javascript_frameworks_compat.js + * ~~~~~~~~~~ + * + * Compatability shim for jQuery and underscores.js. + * + * WILL BE REMOVED IN Sphinx 6.0 + * xref RemovedInSphinx60Warning + * + */ + +/** + * select a different prefix for underscore + */ +$u = _.noConflict(); + + +/** + * small helper function to urldecode strings + * + * See https://developer.mozilla.org/en-US/docs/Web/JavaScript/Reference/Global_Objects/decodeURIComponent#Decoding_query_parameters_from_a_URL + */ +jQuery.urldecode = function(x) { + if (!x) { + return x + } + return decodeURIComponent(x.replace(/\+/g, ' ')); +}; + +/** + * small helper function to urlencode strings + */ +jQuery.urlencode = encodeURIComponent; + +/** + * This function returns the parsed url parameters of the + * current request. Multiple values per key are supported, + * it will always return arrays of strings for the value parts. + */ +jQuery.getQueryParameters = function(s) { + if (typeof s === 'undefined') + s = document.location.search; + var parts = s.substr(s.indexOf('?') + 1).split('&'); + var result = {}; + for (var i = 0; i < parts.length; i++) { + var tmp = parts[i].split('=', 2); + var key = jQuery.urldecode(tmp[0]); + var value = jQuery.urldecode(tmp[1]); + if (key in result) + result[key].push(value); + else + result[key] = [value]; + } + return result; +}; + +/** + * highlight a given string on a jquery object by wrapping it in + * span elements with the given class name. + */ +jQuery.fn.highlightText = function(text, className) { + function highlight(node, addItems) { + if (node.nodeType === 3) { + var val = node.nodeValue; + var pos = val.toLowerCase().indexOf(text); + if (pos >= 0 && + !jQuery(node.parentNode).hasClass(className) && + !jQuery(node.parentNode).hasClass("nohighlight")) { + var span; + var isInSVG = jQuery(node).closest("body, svg, foreignObject").is("svg"); + if (isInSVG) { + span = document.createElementNS("http://www.w3.org/2000/svg", "tspan"); + } else { + span = document.createElement("span"); + span.className = className; + } + span.appendChild(document.createTextNode(val.substr(pos, text.length))); + node.parentNode.insertBefore(span, node.parentNode.insertBefore( + document.createTextNode(val.substr(pos + text.length)), + node.nextSibling)); + node.nodeValue = val.substr(0, pos); + if (isInSVG) { + var rect = document.createElementNS("http://www.w3.org/2000/svg", "rect"); + var bbox = node.parentElement.getBBox(); + rect.x.baseVal.value = bbox.x; + rect.y.baseVal.value = bbox.y; + rect.width.baseVal.value = bbox.width; + rect.height.baseVal.value = bbox.height; + rect.setAttribute('class', className); + addItems.push({ + "parent": node.parentNode, + "target": rect}); + } + } + } + else if (!jQuery(node).is("button, select, textarea")) { + jQuery.each(node.childNodes, function() { + highlight(this, addItems); + }); + } + } + var addItems = []; + var result = this.each(function() { + highlight(this, addItems); + }); + for (var i = 0; i < addItems.length; ++i) { + jQuery(addItems[i].parent).before(addItems[i].target); + } + return result; +}; + +/* + * backward compatibility for jQuery.browser + * This will be supported until firefox bug is fixed. + */ +if (!jQuery.browser) { + jQuery.uaMatch = function(ua) { + ua = ua.toLowerCase(); + + var match = /(chrome)[ \/]([\w.]+)/.exec(ua) || + /(webkit)[ \/]([\w.]+)/.exec(ua) || + /(opera)(?:.*version|)[ \/]([\w.]+)/.exec(ua) || + /(msie) ([\w.]+)/.exec(ua) || + ua.indexOf("compatible") < 0 && /(mozilla)(?:.*? rv:([\w.]+)|)/.exec(ua) || + []; + + return { + browser: match[ 1 ] || "", + version: match[ 2 ] || "0" + }; + }; + jQuery.browser = {}; + jQuery.browser[jQuery.uaMatch(navigator.userAgent).browser] = true; +} diff --git a/docs/_static/basic.css b/docs/_static/basic.css new file mode 100644 index 0000000..eeb0519 --- /dev/null +++ b/docs/_static/basic.css @@ -0,0 +1,899 @@ +/* + * basic.css + * ~~~~~~~~~ + * + * Sphinx stylesheet -- basic theme. + * + * :copyright: Copyright 2007-2022 by the Sphinx team, see AUTHORS. + * :license: BSD, see LICENSE for details. + * + */ + +/* -- main layout ----------------------------------------------------------- */ + +div.clearer { + clear: both; +} + +div.section::after { + display: block; + content: ''; + clear: left; +} + +/* -- relbar ---------------------------------------------------------------- */ + +div.related { + width: 100%; + font-size: 90%; +} + +div.related h3 { + display: none; +} + +div.related ul { + margin: 0; + padding: 0 0 0 10px; + list-style: none; +} + +div.related li { + display: inline; +} + +div.related li.right { + float: right; + margin-right: 5px; +} + +/* -- sidebar --------------------------------------------------------------- */ + +div.sphinxsidebarwrapper { + padding: 10px 5px 0 10px; +} + +div.sphinxsidebar { + float: left; + width: 230px; + margin-left: -100%; + font-size: 90%; + word-wrap: break-word; + overflow-wrap : break-word; +} + +div.sphinxsidebar ul { + list-style: none; +} + +div.sphinxsidebar ul ul, +div.sphinxsidebar ul.want-points { + margin-left: 20px; + list-style: square; +} + +div.sphinxsidebar ul ul { + margin-top: 0; + margin-bottom: 0; +} + +div.sphinxsidebar form { + margin-top: 10px; +} + +div.sphinxsidebar input { + border: 1px solid #98dbcc; + font-family: sans-serif; + font-size: 1em; +} + +div.sphinxsidebar #searchbox form.search { + overflow: hidden; +} + +div.sphinxsidebar #searchbox input[type="text"] { + float: left; + width: 80%; + padding: 0.25em; + box-sizing: border-box; +} + +div.sphinxsidebar #searchbox input[type="submit"] { + float: left; + width: 20%; + border-left: none; + padding: 0.25em; + box-sizing: border-box; +} + + +img { + border: 0; + max-width: 100%; +} + +/* -- search page ----------------------------------------------------------- */ + +ul.search { + margin: 10px 0 0 20px; + padding: 0; +} + +ul.search li { + padding: 5px 0 5px 20px; + background-image: url(file.png); + background-repeat: no-repeat; + background-position: 0 7px; +} + +ul.search li a { + font-weight: bold; +} + +ul.search li p.context { + color: #888; + margin: 2px 0 0 30px; + text-align: left; +} + +ul.keywordmatches li.goodmatch a { + font-weight: bold; +} + +/* -- index page ------------------------------------------------------------ */ + +table.contentstable { + width: 90%; + margin-left: auto; + margin-right: auto; +} + +table.contentstable p.biglink { + line-height: 150%; +} + +a.biglink { + font-size: 1.3em; +} + +span.linkdescr { + font-style: italic; + padding-top: 5px; + font-size: 90%; +} + +/* -- general index --------------------------------------------------------- */ + +table.indextable { + width: 100%; +} + +table.indextable td { + text-align: left; + vertical-align: top; +} + +table.indextable ul { + margin-top: 0; + margin-bottom: 0; + list-style-type: none; +} + +table.indextable > tbody > tr > td > ul { + padding-left: 0em; +} + +table.indextable tr.pcap { + height: 10px; +} + +table.indextable tr.cap { + margin-top: 10px; + background-color: #f2f2f2; +} + +img.toggler { + margin-right: 3px; + margin-top: 3px; + cursor: pointer; +} + +div.modindex-jumpbox { + border-top: 1px solid #ddd; + border-bottom: 1px solid #ddd; + margin: 1em 0 1em 0; + padding: 0.4em; +} + +div.genindex-jumpbox { + border-top: 1px solid #ddd; + border-bottom: 1px solid #ddd; + margin: 1em 0 1em 0; + padding: 0.4em; +} + +/* -- domain module index --------------------------------------------------- */ + +table.modindextable td { + padding: 2px; + border-collapse: collapse; +} + +/* -- general body styles --------------------------------------------------- */ + +div.body { + min-width: 360px; + max-width: 800px; +} + +div.body p, div.body dd, div.body li, div.body blockquote { + -moz-hyphens: auto; + -ms-hyphens: auto; + -webkit-hyphens: auto; + hyphens: auto; +} + +a.headerlink { + visibility: hidden; +} +a.brackets:before, +span.brackets > a:before{ + content: "["; +} + +a.brackets:after, +span.brackets > a:after { + content: "]"; +} + + +h1:hover > a.headerlink, +h2:hover > a.headerlink, +h3:hover > a.headerlink, +h4:hover > a.headerlink, +h5:hover > a.headerlink, +h6:hover > a.headerlink, +dt:hover > a.headerlink, +caption:hover > a.headerlink, +p.caption:hover > a.headerlink, +div.code-block-caption:hover > a.headerlink { + visibility: visible; +} + +div.body p.caption { + text-align: inherit; +} + +div.body td { + text-align: left; +} + +.first { + margin-top: 0 !important; +} + +p.rubric { + margin-top: 30px; + font-weight: bold; +} + +img.align-left, figure.align-left, .figure.align-left, object.align-left { + clear: left; + float: left; + margin-right: 1em; +} + +img.align-right, figure.align-right, .figure.align-right, object.align-right { + clear: right; + float: right; + margin-left: 1em; +} + +img.align-center, figure.align-center, .figure.align-center, object.align-center { + display: block; + margin-left: auto; + margin-right: auto; +} + +img.align-default, figure.align-default, .figure.align-default { + display: block; + margin-left: auto; + margin-right: auto; +} + +.align-left { + text-align: left; +} + +.align-center { + text-align: center; +} + +.align-default { + text-align: center; +} + +.align-right { + text-align: right; +} + +/* -- sidebars -------------------------------------------------------------- */ + +div.sidebar, +aside.sidebar { + margin: 0 0 0.5em 1em; + border: 1px solid #ddb; + padding: 7px; + background-color: #ffe; + width: 40%; + float: right; + clear: right; + overflow-x: auto; +} + +p.sidebar-title { + font-weight: bold; +} +div.admonition, div.topic, blockquote { + clear: left; +} + +/* -- topics ---------------------------------------------------------------- */ +div.topic { + border: 1px solid #ccc; + padding: 7px; + margin: 10px 0 10px 0; +} + +p.topic-title { + font-size: 1.1em; + font-weight: bold; + margin-top: 10px; +} + +/* -- admonitions ----------------------------------------------------------- */ + +div.admonition { + margin-top: 10px; + margin-bottom: 10px; + padding: 7px; +} + +div.admonition dt { + font-weight: bold; +} + +p.admonition-title { + margin: 0px 10px 5px 0px; + font-weight: bold; +} + +div.body p.centered { + text-align: center; + margin-top: 25px; +} + +/* -- content of sidebars/topics/admonitions -------------------------------- */ + +div.sidebar > :last-child, +aside.sidebar > :last-child, +div.topic > :last-child, +div.admonition > :last-child { + margin-bottom: 0; +} + +div.sidebar::after, +aside.sidebar::after, +div.topic::after, +div.admonition::after, +blockquote::after { + display: block; + content: ''; + clear: both; +} + +/* -- tables ---------------------------------------------------------------- */ + +table.docutils { + margin-top: 10px; + margin-bottom: 10px; + border: 0; + border-collapse: collapse; +} + +table.align-center { + margin-left: auto; + margin-right: auto; +} + +table.align-default { + margin-left: auto; + margin-right: auto; +} + +table caption span.caption-number { + font-style: italic; +} + +table caption span.caption-text { +} + +table.docutils td, table.docutils th { + padding: 1px 8px 1px 5px; + border-top: 0; + border-left: 0; + border-right: 0; + border-bottom: 1px solid #aaa; +} + +th { + text-align: left; + padding-right: 5px; +} + +table.citation { + border-left: solid 1px gray; + margin-left: 1px; +} + +table.citation td { + border-bottom: none; +} + +th > :first-child, +td > :first-child { + margin-top: 0px; +} + +th > :last-child, +td > :last-child { + margin-bottom: 0px; +} + +/* -- figures --------------------------------------------------------------- */ + +div.figure, figure { + margin: 0.5em; + padding: 0.5em; +} + +div.figure p.caption, figcaption { + padding: 0.3em; +} + +div.figure p.caption span.caption-number, +figcaption span.caption-number { + font-style: italic; +} + +div.figure p.caption span.caption-text, +figcaption span.caption-text { +} + +/* -- field list styles ----------------------------------------------------- */ + +table.field-list td, table.field-list th { + border: 0 !important; +} + +.field-list ul { + margin: 0; + padding-left: 1em; +} + +.field-list p { + margin: 0; +} + +.field-name { + -moz-hyphens: manual; + -ms-hyphens: manual; + -webkit-hyphens: manual; + hyphens: manual; +} + +/* -- hlist styles ---------------------------------------------------------- */ + +table.hlist { + margin: 1em 0; +} + +table.hlist td { + vertical-align: top; +} + +/* -- object description styles --------------------------------------------- */ + +.sig { + font-family: 'Consolas', 'Menlo', 'DejaVu Sans Mono', 'Bitstream Vera Sans Mono', monospace; +} + +.sig-name, code.descname { + background-color: transparent; + font-weight: bold; +} + +.sig-name { + font-size: 1.1em; +} + +code.descname { + font-size: 1.2em; +} + +.sig-prename, code.descclassname { + background-color: transparent; +} + +.optional { + font-size: 1.3em; +} + +.sig-paren { + font-size: larger; +} + +.sig-param.n { + font-style: italic; +} + +/* C++ specific styling */ + +.sig-inline.c-texpr, +.sig-inline.cpp-texpr { + font-family: unset; +} + +.sig.c .k, .sig.c .kt, +.sig.cpp .k, .sig.cpp .kt { + color: #0033B3; +} + +.sig.c .m, +.sig.cpp .m { + color: #1750EB; +} + +.sig.c .s, .sig.c .sc, +.sig.cpp .s, .sig.cpp .sc { + color: #067D17; +} + + +/* -- other body styles ----------------------------------------------------- */ + +ol.arabic { + list-style: decimal; +} + +ol.loweralpha { + list-style: lower-alpha; +} + +ol.upperalpha { + list-style: upper-alpha; +} + +ol.lowerroman { + list-style: lower-roman; +} + +ol.upperroman { + list-style: upper-roman; +} + +:not(li) > ol > li:first-child > :first-child, +:not(li) > ul > li:first-child > :first-child { + margin-top: 0px; +} + +:not(li) > ol > li:last-child > :last-child, +:not(li) > ul > li:last-child > :last-child { + margin-bottom: 0px; +} + +ol.simple ol p, +ol.simple ul p, +ul.simple ol p, +ul.simple ul p { + margin-top: 0; +} + +ol.simple > li:not(:first-child) > p, +ul.simple > li:not(:first-child) > p { + margin-top: 0; +} + +ol.simple p, +ul.simple p { + margin-bottom: 0; +} +dl.footnote > dt, +dl.citation > dt { + float: left; + margin-right: 0.5em; +} + +dl.footnote > dd, +dl.citation > dd { + margin-bottom: 0em; +} + +dl.footnote > dd:after, +dl.citation > dd:after { + content: ""; + clear: both; +} + +dl.field-list { + display: grid; + grid-template-columns: fit-content(30%) auto; +} + +dl.field-list > dt { + font-weight: bold; + word-break: break-word; + padding-left: 0.5em; + padding-right: 5px; +} +dl.field-list > dt:after { + content: ":"; +} + + +dl.field-list > dd { + padding-left: 0.5em; + margin-top: 0em; + margin-left: 0em; + margin-bottom: 0em; +} + +dl { + margin-bottom: 15px; +} + +dd > :first-child { + margin-top: 0px; +} + +dd ul, dd table { + margin-bottom: 10px; +} + +dd { + margin-top: 3px; + margin-bottom: 10px; + margin-left: 30px; +} + +dl > dd:last-child, +dl > dd:last-child > :last-child { + margin-bottom: 0; +} + +dt:target, span.highlighted { + background-color: #fbe54e; +} + +rect.highlighted { + fill: #fbe54e; +} + +dl.glossary dt { + font-weight: bold; + font-size: 1.1em; +} + +.versionmodified { + font-style: italic; +} + +.system-message { + background-color: #fda; + padding: 5px; + border: 3px solid red; +} + +.footnote:target { + background-color: #ffa; +} + +.line-block { + display: block; + margin-top: 1em; + margin-bottom: 1em; +} + +.line-block .line-block { + margin-top: 0; + margin-bottom: 0; + margin-left: 1.5em; +} + +.guilabel, .menuselection { + font-family: sans-serif; +} + +.accelerator { + text-decoration: underline; +} + +.classifier { + font-style: oblique; +} + +.classifier:before { + font-style: normal; + margin: 0 0.5em; + content: ":"; + display: inline-block; +} + +abbr, acronym { + border-bottom: dotted 1px; + cursor: help; +} + +/* -- code displays --------------------------------------------------------- */ + +pre { + overflow: auto; + overflow-y: hidden; /* fixes display issues on Chrome browsers */ +} + +pre, div[class*="highlight-"] { + clear: both; +} + +span.pre { + -moz-hyphens: none; + -ms-hyphens: none; + -webkit-hyphens: none; + hyphens: none; + white-space: nowrap; +} + +div[class*="highlight-"] { + margin: 1em 0; +} + +td.linenos pre { + border: 0; + background-color: transparent; + color: #aaa; +} + +table.highlighttable { + display: block; +} + +table.highlighttable tbody { + display: block; +} + +table.highlighttable tr { + display: flex; +} + +table.highlighttable td { + margin: 0; + padding: 0; +} + +table.highlighttable td.linenos { + padding-right: 0.5em; +} + +table.highlighttable td.code { + flex: 1; + overflow: hidden; +} + +.highlight .hll { + display: block; +} + +div.highlight pre, +table.highlighttable pre { + margin: 0; +} + +div.code-block-caption + div { + margin-top: 0; +} + +div.code-block-caption { + margin-top: 1em; + padding: 2px 5px; + font-size: small; +} + +div.code-block-caption code { + background-color: transparent; +} + +table.highlighttable td.linenos, +span.linenos, +div.highlight span.gp { /* gp: Generic.Prompt */ + user-select: none; + -webkit-user-select: text; /* Safari fallback only */ + -webkit-user-select: none; /* Chrome/Safari */ + -moz-user-select: none; /* Firefox */ + -ms-user-select: none; /* IE10+ */ +} + +div.code-block-caption span.caption-number { + padding: 0.1em 0.3em; + font-style: italic; +} + +div.code-block-caption span.caption-text { +} + +div.literal-block-wrapper { + margin: 1em 0; +} + +code.xref, a code { + background-color: transparent; + font-weight: bold; +} + +h1 code, h2 code, h3 code, h4 code, h5 code, h6 code { + background-color: transparent; +} + +.viewcode-link { + float: right; +} + +.viewcode-back { + float: right; + font-family: sans-serif; +} + +div.viewcode-block:target { + margin: -1px -10px; + padding: 0 10px; +} + +/* -- math display ---------------------------------------------------------- */ + +img.math { + vertical-align: middle; +} + +div.body div.math p { + text-align: center; +} + +span.eqno { + float: right; +} + +span.eqno a.headerlink { + position: absolute; + z-index: 1; +} + +div.math:hover a.headerlink { + visibility: visible; +} + +/* -- printout stylesheet --------------------------------------------------- */ + +@media print { + div.document, + div.documentwrapper, + div.bodywrapper { + margin: 0 !important; + width: 100%; + } + + div.sphinxsidebar, + div.related, + div.footer, + #top-link { + display: none; + } +} \ No newline at end of file diff --git a/docs/_static/bootstrap-2.3.2/css/bootstrap-responsive.css b/docs/_static/bootstrap-2.3.2/css/bootstrap-responsive.css new file mode 100644 index 0000000..09e88ce --- /dev/null +++ b/docs/_static/bootstrap-2.3.2/css/bootstrap-responsive.css @@ -0,0 +1,1109 @@ +/*! + * Bootstrap Responsive v2.3.2 + * + * 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. + */ + +.clearfix { + *zoom: 1; +} + +.clearfix:before, +.clearfix:after { + display: table; + line-height: 0; + content: ""; +} + +.clearfix:after { + clear: both; +} + +.hide-text { + font: 0/0 a; + color: transparent; + text-shadow: none; + background-color: transparent; + border: 0; +} + +.input-block-level { + display: block; + width: 100%; + min-height: 30px; + -webkit-box-sizing: border-box; + -moz-box-sizing: border-box; + box-sizing: border-box; +} + +@-ms-viewport { + width: device-width; +} + +.hidden { + display: none; + visibility: hidden; +} + +.visible-phone { + display: none !important; +} + +.visible-tablet { + display: none !important; +} + +.hidden-desktop { + display: none !important; +} + +.visible-desktop { + display: inherit !important; +} + +@media (min-width: 768px) and (max-width: 979px) { + .hidden-desktop { + display: inherit !important; + } + .visible-desktop { + display: none !important ; + } + .visible-tablet { + display: inherit !important; + } + .hidden-tablet { + display: none !important; + } +} + +@media (max-width: 767px) { + .hidden-desktop { + display: inherit !important; + } + .visible-desktop { + display: none !important; + } + .visible-phone { + display: inherit !important; + } + .hidden-phone { + display: none !important; + } +} + +.visible-print { + display: none !important; +} + +@media print { + .visible-print { + display: inherit !important; + } + .hidden-print { + display: none !important; + } +} + +@media (min-width: 1200px) { + .row { + margin-left: -30px; + *zoom: 1; + } + .row:before, + .row:after { + display: table; + line-height: 0; + content: ""; + } + .row:after { + clear: both; + } + [class*="span"] { + float: left; + min-height: 1px; + margin-left: 30px; + } + .container, + .navbar-static-top .container, + .navbar-fixed-top .container, + .navbar-fixed-bottom .container { + width: 1170px; + } + .span12 { + width: 1170px; + } + .span11 { + width: 1070px; + } + .span10 { + width: 970px; + } + .span9 { + width: 870px; + } + .span8 { + width: 770px; + } + .span7 { + width: 670px; + } + .span6 { + width: 570px; + } + .span5 { + width: 470px; + } + .span4 { + width: 370px; + } + .span3 { + width: 270px; + } + .span2 { + width: 170px; + } + .span1 { + width: 70px; + } + .offset12 { + margin-left: 1230px; + } + .offset11 { + margin-left: 1130px; + } + .offset10 { + margin-left: 1030px; + } + .offset9 { + margin-left: 930px; + } + .offset8 { + margin-left: 830px; + } + .offset7 { + margin-left: 730px; + } + .offset6 { + margin-left: 630px; + } + .offset5 { + margin-left: 530px; + } + .offset4 { + margin-left: 430px; + } + .offset3 { + margin-left: 330px; + } + .offset2 { + margin-left: 230px; + } + .offset1 { + margin-left: 130px; + } + .row-fluid { + width: 100%; + *zoom: 1; + } + .row-fluid:before, + .row-fluid:after { + display: table; + line-height: 0; + content: ""; + } + .row-fluid:after { + clear: both; + } + .row-fluid [class*="span"] { + display: block; + float: left; + width: 100%; + min-height: 30px; + margin-left: 2.564102564102564%; + *margin-left: 2.5109110747408616%; + -webkit-box-sizing: border-box; + -moz-box-sizing: border-box; + box-sizing: border-box; + } + .row-fluid [class*="span"]:first-child { + margin-left: 0; + } + .row-fluid .controls-row [class*="span"] + [class*="span"] { + margin-left: 2.564102564102564%; + } + .row-fluid .span12 { + width: 100%; + *width: 99.94680851063829%; + } + .row-fluid .span11 { + width: 91.45299145299145%; + *width: 91.39979996362975%; + } + .row-fluid .span10 { + width: 82.90598290598291%; + *width: 82.8527914166212%; + } + .row-fluid .span9 { + width: 74.35897435897436%; + *width: 74.30578286961266%; + } + .row-fluid .span8 { + width: 65.81196581196582%; + *width: 65.75877432260411%; + } + .row-fluid .span7 { + width: 57.26495726495726%; + *width: 57.21176577559556%; + } + .row-fluid .span6 { + width: 48.717948717948715%; + *width: 48.664757228587014%; + } + .row-fluid .span5 { + width: 40.17094017094017%; + *width: 40.11774868157847%; + } + .row-fluid .span4 { + width: 31.623931623931625%; + *width: 31.570740134569924%; + } + .row-fluid .span3 { + width: 23.076923076923077%; + *width: 23.023731587561375%; + } + .row-fluid .span2 { + width: 14.52991452991453%; + *width: 14.476723040552828%; + } + .row-fluid .span1 { + width: 5.982905982905983%; + *width: 5.929714493544281%; + } + .row-fluid .offset12 { + margin-left: 105.12820512820512%; + *margin-left: 105.02182214948171%; + } + .row-fluid .offset12:first-child { + margin-left: 102.56410256410257%; + *margin-left: 102.45771958537915%; + } + .row-fluid .offset11 { + margin-left: 96.58119658119658%; + *margin-left: 96.47481360247316%; + } + .row-fluid .offset11:first-child { + margin-left: 94.01709401709402%; + *margin-left: 93.91071103837061%; + } + .row-fluid .offset10 { + margin-left: 88.03418803418803%; + *margin-left: 87.92780505546462%; + } + .row-fluid .offset10:first-child { + margin-left: 85.47008547008548%; + *margin-left: 85.36370249136206%; + } + .row-fluid .offset9 { + margin-left: 79.48717948717949%; + *margin-left: 79.38079650845607%; + } + .row-fluid .offset9:first-child { + margin-left: 76.92307692307693%; + *margin-left: 76.81669394435352%; + } + .row-fluid .offset8 { + margin-left: 70.94017094017094%; + *margin-left: 70.83378796144753%; + } + .row-fluid .offset8:first-child { + margin-left: 68.37606837606839%; + *margin-left: 68.26968539734497%; + } + .row-fluid .offset7 { + margin-left: 62.393162393162385%; + *margin-left: 62.28677941443899%; + } + .row-fluid .offset7:first-child { + margin-left: 59.82905982905982%; + *margin-left: 59.72267685033642%; + } + .row-fluid .offset6 { + margin-left: 53.84615384615384%; + *margin-left: 53.739770867430444%; + } + .row-fluid .offset6:first-child { + margin-left: 51.28205128205128%; + *margin-left: 51.175668303327875%; + } + .row-fluid .offset5 { + margin-left: 45.299145299145295%; + *margin-left: 45.1927623204219%; + } + .row-fluid .offset5:first-child { + margin-left: 42.73504273504273%; + *margin-left: 42.62865975631933%; + } + .row-fluid .offset4 { + margin-left: 36.75213675213675%; + *margin-left: 36.645753773413354%; + } + .row-fluid .offset4:first-child { + margin-left: 34.18803418803419%; + *margin-left: 34.081651209310785%; + } + .row-fluid .offset3 { + margin-left: 28.205128205128204%; + *margin-left: 28.0987452264048%; + } + .row-fluid .offset3:first-child { + margin-left: 25.641025641025642%; + *margin-left: 25.53464266230224%; + } + .row-fluid .offset2 { + margin-left: 19.65811965811966%; + *margin-left: 19.551736679396257%; + } + .row-fluid .offset2:first-child { + margin-left: 17.094017094017094%; + *margin-left: 16.98763411529369%; + } + .row-fluid .offset1 { + margin-left: 11.11111111111111%; + *margin-left: 11.004728132387708%; + } + .row-fluid .offset1:first-child { + margin-left: 8.547008547008547%; + *margin-left: 8.440625568285142%; + } + input, + textarea, + .uneditable-input { + margin-left: 0; + } + .controls-row [class*="span"] + [class*="span"] { + margin-left: 30px; + } + input.span12, + textarea.span12, + .uneditable-input.span12 { + width: 1156px; + } + input.span11, + textarea.span11, + .uneditable-input.span11 { + width: 1056px; + } + input.span10, + textarea.span10, + .uneditable-input.span10 { + width: 956px; + } + input.span9, + textarea.span9, + .uneditable-input.span9 { + width: 856px; + } + input.span8, + textarea.span8, + .uneditable-input.span8 { + width: 756px; + } + input.span7, + textarea.span7, + .uneditable-input.span7 { + width: 656px; + } + input.span6, + textarea.span6, + .uneditable-input.span6 { + width: 556px; + } + input.span5, + textarea.span5, + .uneditable-input.span5 { + width: 456px; + } + input.span4, + textarea.span4, + .uneditable-input.span4 { + width: 356px; + } + input.span3, + textarea.span3, + .uneditable-input.span3 { + width: 256px; + } + input.span2, + textarea.span2, + .uneditable-input.span2 { + width: 156px; + } + input.span1, + textarea.span1, + .uneditable-input.span1 { + width: 56px; + } + .thumbnails { + margin-left: -30px; + } + .thumbnails > li { + margin-left: 30px; + } + .row-fluid .thumbnails { + margin-left: 0; + } +} + +@media (min-width: 768px) and (max-width: 979px) { + .row { + margin-left: -20px; + *zoom: 1; + } + .row:before, + .row:after { + display: table; + line-height: 0; + content: ""; + } + .row:after { + clear: both; + } + [class*="span"] { + float: left; + min-height: 1px; + margin-left: 20px; + } + .container, + .navbar-static-top .container, + .navbar-fixed-top .container, + .navbar-fixed-bottom .container { + width: 724px; + } + .span12 { + width: 724px; + } + .span11 { + width: 662px; + } + .span10 { + width: 600px; + } + .span9 { + width: 538px; + } + .span8 { + width: 476px; + } + .span7 { + width: 414px; + } + .span6 { + width: 352px; + } + .span5 { + width: 290px; + } + .span4 { + width: 228px; + } + .span3 { + width: 166px; + } + .span2 { + width: 104px; + } + .span1 { + width: 42px; + } + .offset12 { + margin-left: 764px; + } + .offset11 { + margin-left: 702px; + } + .offset10 { + margin-left: 640px; + } + .offset9 { + margin-left: 578px; + } + .offset8 { + margin-left: 516px; + } + .offset7 { + margin-left: 454px; + } + .offset6 { + margin-left: 392px; + } + .offset5 { + margin-left: 330px; + } + .offset4 { + margin-left: 268px; + } + .offset3 { + margin-left: 206px; + } + .offset2 { + margin-left: 144px; + } + .offset1 { + margin-left: 82px; + } + .row-fluid { + width: 100%; + *zoom: 1; + } + .row-fluid:before, + .row-fluid:after { + display: table; + line-height: 0; + content: ""; + } + .row-fluid:after { + clear: both; + } + .row-fluid [class*="span"] { + display: block; + float: left; + width: 100%; + min-height: 30px; + margin-left: 2.7624309392265194%; + *margin-left: 2.709239449864817%; + -webkit-box-sizing: border-box; + -moz-box-sizing: border-box; + box-sizing: border-box; + } + .row-fluid [class*="span"]:first-child { + margin-left: 0; + } + .row-fluid .controls-row [class*="span"] + [class*="span"] { + margin-left: 2.7624309392265194%; + } + .row-fluid .span12 { + width: 100%; + *width: 99.94680851063829%; + } + .row-fluid .span11 { + width: 91.43646408839778%; + *width: 91.38327259903608%; + } + .row-fluid .span10 { + width: 82.87292817679558%; + *width: 82.81973668743387%; + } + .row-fluid .span9 { + width: 74.30939226519337%; + *width: 74.25620077583166%; + } + .row-fluid .span8 { + width: 65.74585635359117%; + *width: 65.69266486422946%; + } + .row-fluid .span7 { + width: 57.18232044198895%; + *width: 57.12912895262725%; + } + .row-fluid .span6 { + width: 48.61878453038674%; + *width: 48.56559304102504%; + } + .row-fluid .span5 { + width: 40.05524861878453%; + *width: 40.00205712942283%; + } + .row-fluid .span4 { + width: 31.491712707182323%; + *width: 31.43852121782062%; + } + .row-fluid .span3 { + width: 22.92817679558011%; + *width: 22.87498530621841%; + } + .row-fluid .span2 { + width: 14.3646408839779%; + *width: 14.311449394616199%; + } + .row-fluid .span1 { + width: 5.801104972375691%; + *width: 5.747913483013988%; + } + .row-fluid .offset12 { + margin-left: 105.52486187845304%; + *margin-left: 105.41847889972962%; + } + .row-fluid .offset12:first-child { + margin-left: 102.76243093922652%; + *margin-left: 102.6560479605031%; + } + .row-fluid .offset11 { + margin-left: 96.96132596685082%; + *margin-left: 96.8549429881274%; + } + .row-fluid .offset11:first-child { + margin-left: 94.1988950276243%; + *margin-left: 94.09251204890089%; + } + .row-fluid .offset10 { + margin-left: 88.39779005524862%; + *margin-left: 88.2914070765252%; + } + .row-fluid .offset10:first-child { + margin-left: 85.6353591160221%; + *margin-left: 85.52897613729868%; + } + .row-fluid .offset9 { + margin-left: 79.8342541436464%; + *margin-left: 79.72787116492299%; + } + .row-fluid .offset9:first-child { + margin-left: 77.07182320441989%; + *margin-left: 76.96544022569647%; + } + .row-fluid .offset8 { + margin-left: 71.2707182320442%; + *margin-left: 71.16433525332079%; + } + .row-fluid .offset8:first-child { + margin-left: 68.50828729281768%; + *margin-left: 68.40190431409427%; + } + .row-fluid .offset7 { + margin-left: 62.70718232044199%; + *margin-left: 62.600799341718584%; + } + .row-fluid .offset7:first-child { + margin-left: 59.94475138121547%; + *margin-left: 59.838368402492065%; + } + .row-fluid .offset6 { + margin-left: 54.14364640883978%; + *margin-left: 54.037263430116376%; + } + .row-fluid .offset6:first-child { + margin-left: 51.38121546961326%; + *margin-left: 51.27483249088986%; + } + .row-fluid .offset5 { + margin-left: 45.58011049723757%; + *margin-left: 45.47372751851417%; + } + .row-fluid .offset5:first-child { + margin-left: 42.81767955801105%; + *margin-left: 42.71129657928765%; + } + .row-fluid .offset4 { + margin-left: 37.01657458563536%; + *margin-left: 36.91019160691196%; + } + .row-fluid .offset4:first-child { + margin-left: 34.25414364640884%; + *margin-left: 34.14776066768544%; + } + .row-fluid .offset3 { + margin-left: 28.45303867403315%; + *margin-left: 28.346655695309746%; + } + .row-fluid .offset3:first-child { + margin-left: 25.69060773480663%; + *margin-left: 25.584224756083227%; + } + .row-fluid .offset2 { + margin-left: 19.88950276243094%; + *margin-left: 19.783119783707537%; + } + .row-fluid .offset2:first-child { + margin-left: 17.12707182320442%; + *margin-left: 17.02068884448102%; + } + .row-fluid .offset1 { + margin-left: 11.32596685082873%; + *margin-left: 11.219583872105325%; + } + .row-fluid .offset1:first-child { + margin-left: 8.56353591160221%; + *margin-left: 8.457152932878806%; + } + input, + textarea, + .uneditable-input { + margin-left: 0; + } + .controls-row [class*="span"] + [class*="span"] { + margin-left: 20px; + } + input.span12, + textarea.span12, + .uneditable-input.span12 { + width: 710px; + } + input.span11, + textarea.span11, + .uneditable-input.span11 { + width: 648px; + } + input.span10, + textarea.span10, + .uneditable-input.span10 { + width: 586px; + } + input.span9, + textarea.span9, + .uneditable-input.span9 { + width: 524px; + } + input.span8, + textarea.span8, + .uneditable-input.span8 { + width: 462px; + } + input.span7, + textarea.span7, + .uneditable-input.span7 { + width: 400px; + } + input.span6, + textarea.span6, + .uneditable-input.span6 { + width: 338px; + } + input.span5, + textarea.span5, + .uneditable-input.span5 { + width: 276px; + } + input.span4, + textarea.span4, + .uneditable-input.span4 { + width: 214px; + } + input.span3, + textarea.span3, + .uneditable-input.span3 { + width: 152px; + } + input.span2, + textarea.span2, + .uneditable-input.span2 { + width: 90px; + } + input.span1, + textarea.span1, + .uneditable-input.span1 { + width: 28px; + } +} + +@media (max-width: 767px) { + body { + padding-right: 20px; + padding-left: 20px; + } + .navbar-fixed-top, + .navbar-fixed-bottom, + .navbar-static-top { + margin-right: -20px; + margin-left: -20px; + } + .container-fluid { + padding: 0; + } + .dl-horizontal dt { + float: none; + width: auto; + clear: none; + text-align: left; + } + .dl-horizontal dd { + margin-left: 0; + } + .container { + width: auto; + } + .row-fluid { + width: 100%; + } + .row, + .thumbnails { + margin-left: 0; + } + .thumbnails > li { + float: none; + margin-left: 0; + } + [class*="span"], + .uneditable-input[class*="span"], + .row-fluid [class*="span"] { + display: block; + float: none; + width: 100%; + margin-left: 0; + -webkit-box-sizing: border-box; + -moz-box-sizing: border-box; + box-sizing: border-box; + } + .span12, + .row-fluid .span12 { + width: 100%; + -webkit-box-sizing: border-box; + -moz-box-sizing: border-box; + box-sizing: border-box; + } + .row-fluid [class*="offset"]:first-child { + margin-left: 0; + } + .input-large, + .input-xlarge, + .input-xxlarge, + input[class*="span"], + select[class*="span"], + textarea[class*="span"], + .uneditable-input { + display: block; + width: 100%; + min-height: 30px; + -webkit-box-sizing: border-box; + -moz-box-sizing: border-box; + box-sizing: border-box; + } + .input-prepend input, + .input-append input, + .input-prepend input[class*="span"], + .input-append input[class*="span"] { + display: inline-block; + width: auto; + } + .controls-row [class*="span"] + [class*="span"] { + margin-left: 0; + } + .modal { + position: fixed; + top: 20px; + right: 20px; + left: 20px; + width: auto; + margin: 0; + } + .modal.fade { + top: -100px; + } + .modal.fade.in { + top: 20px; + } +} + +@media (max-width: 480px) { + .nav-collapse { + -webkit-transform: translate3d(0, 0, 0); + } + .page-header h1 small { + display: block; + line-height: 20px; + } + input[type="checkbox"], + input[type="radio"] { + border: 1px solid #ccc; + } + .form-horizontal .control-label { + float: none; + width: auto; + padding-top: 0; + text-align: left; + } + .form-horizontal .controls { + margin-left: 0; + } + .form-horizontal .control-list { + padding-top: 0; + } + .form-horizontal .form-actions { + padding-right: 10px; + padding-left: 10px; + } + .media .pull-left, + .media .pull-right { + display: block; + float: none; + margin-bottom: 10px; + } + .media-object { + margin-right: 0; + margin-left: 0; + } + .modal { + top: 10px; + right: 10px; + left: 10px; + } + .modal-header .close { + padding: 10px; + margin: -10px; + } + .carousel-caption { + position: static; + } +} + +@media (max-width: 979px) { + body { + padding-top: 0; + } + .navbar-fixed-top, + .navbar-fixed-bottom { + position: static; + } + .navbar-fixed-top { + margin-bottom: 20px; + } + .navbar-fixed-bottom { + margin-top: 20px; + } + .navbar-fixed-top .navbar-inner, + .navbar-fixed-bottom .navbar-inner { + padding: 5px; + } + .navbar .container { + width: auto; + padding: 0; + } + .navbar .brand { + padding-right: 10px; + padding-left: 10px; + margin: 0 0 0 -5px; + } + .nav-collapse { + clear: both; + } + .nav-collapse .nav { + float: none; + margin: 0 0 10px; + } + .nav-collapse .nav > li { + float: none; + } + .nav-collapse .nav > li > a { + margin-bottom: 2px; + } + .nav-collapse .nav > .divider-vertical { + display: none; + } + .nav-collapse .nav .nav-header { + color: #777777; + text-shadow: none; + } + .nav-collapse .nav > li > a, + .nav-collapse .dropdown-menu a { + padding: 9px 15px; + font-weight: bold; + color: #777777; + -webkit-border-radius: 3px; + -moz-border-radius: 3px; + border-radius: 3px; + } + .nav-collapse .btn { + padding: 4px 10px 4px; + font-weight: normal; + -webkit-border-radius: 4px; + -moz-border-radius: 4px; + border-radius: 4px; + } + .nav-collapse .dropdown-menu li + li a { + margin-bottom: 2px; + } + .nav-collapse .nav > li > a:hover, + .nav-collapse .nav > li > a:focus, + .nav-collapse .dropdown-menu a:hover, + .nav-collapse .dropdown-menu a:focus { + background-color: #f2f2f2; + } + .navbar-inverse .nav-collapse .nav > li > a, + .navbar-inverse .nav-collapse .dropdown-menu a { + color: #999999; + } + .navbar-inverse .nav-collapse .nav > li > a:hover, + .navbar-inverse .nav-collapse .nav > li > a:focus, + .navbar-inverse .nav-collapse .dropdown-menu a:hover, + .navbar-inverse .nav-collapse .dropdown-menu a:focus { + background-color: #111111; + } + .nav-collapse.in .btn-group { + padding: 0; + margin-top: 5px; + } + .nav-collapse .dropdown-menu { + position: static; + top: auto; + left: auto; + display: none; + float: none; + max-width: none; + padding: 0; + margin: 0 15px; + background-color: transparent; + border: none; + -webkit-border-radius: 0; + -moz-border-radius: 0; + border-radius: 0; + -webkit-box-shadow: none; + -moz-box-shadow: none; + box-shadow: none; + } + .nav-collapse .open > .dropdown-menu { + display: block; + } + .nav-collapse .dropdown-menu:before, + .nav-collapse .dropdown-menu:after { + display: none; + } + .nav-collapse .dropdown-menu .divider { + display: none; + } + .nav-collapse .nav > li > .dropdown-menu:before, + .nav-collapse .nav > li > .dropdown-menu:after { + display: none; + } + .nav-collapse .navbar-form, + .nav-collapse .navbar-search { + float: none; + padding: 10px 15px; + margin: 10px 0; + border-top: 1px solid #f2f2f2; + border-bottom: 1px solid #f2f2f2; + -webkit-box-shadow: inset 0 1px 0 rgba(255, 255, 255, 0.1), 0 1px 0 rgba(255, 255, 255, 0.1); + -moz-box-shadow: inset 0 1px 0 rgba(255, 255, 255, 0.1), 0 1px 0 rgba(255, 255, 255, 0.1); + box-shadow: inset 0 1px 0 rgba(255, 255, 255, 0.1), 0 1px 0 rgba(255, 255, 255, 0.1); + } + .navbar-inverse .nav-collapse .navbar-form, + .navbar-inverse .nav-collapse .navbar-search { + border-top-color: #111111; + border-bottom-color: #111111; + } + .navbar .nav-collapse .nav.pull-right { + float: none; + margin-left: 0; + } + .nav-collapse, + .nav-collapse.collapse { + height: 0; + overflow: hidden; + } + .navbar .btn-navbar { + display: block; + } + .navbar-static .navbar-inner { + padding-right: 10px; + padding-left: 10px; + } +} + +@media (min-width: 980px) { + .nav-collapse.collapse { + height: auto !important; + overflow: visible !important; + } +} diff --git a/docs/_static/bootstrap-2.3.2/css/bootstrap-responsive.min.css b/docs/_static/bootstrap-2.3.2/css/bootstrap-responsive.min.css new file mode 100644 index 0000000..f4ede63 --- /dev/null +++ b/docs/_static/bootstrap-2.3.2/css/bootstrap-responsive.min.css @@ -0,0 +1,9 @@ +/*! + * Bootstrap Responsive v2.3.2 + * + * 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. + */.clearfix{*zoom:1}.clearfix:before,.clearfix:after{display:table;line-height:0;content:""}.clearfix:after{clear:both}.hide-text{font:0/0 a;color:transparent;text-shadow:none;background-color:transparent;border:0}.input-block-level{display:block;width:100%;min-height:30px;-webkit-box-sizing:border-box;-moz-box-sizing:border-box;box-sizing:border-box}@-ms-viewport{width:device-width}.hidden{display:none;visibility:hidden}.visible-phone{display:none!important}.visible-tablet{display:none!important}.hidden-desktop{display:none!important}.visible-desktop{display:inherit!important}@media(min-width:768px) and (max-width:979px){.hidden-desktop{display:inherit!important}.visible-desktop{display:none!important}.visible-tablet{display:inherit!important}.hidden-tablet{display:none!important}}@media(max-width:767px){.hidden-desktop{display:inherit!important}.visible-desktop{display:none!important}.visible-phone{display:inherit!important}.hidden-phone{display:none!important}}.visible-print{display:none!important}@media print{.visible-print{display:inherit!important}.hidden-print{display:none!important}}@media(min-width:1200px){.row{margin-left:-30px;*zoom:1}.row:before,.row:after{display:table;line-height:0;content:""}.row:after{clear:both}[class*="span"]{float:left;min-height:1px;margin-left:30px}.container,.navbar-static-top .container,.navbar-fixed-top .container,.navbar-fixed-bottom .container{width:1170px}.span12{width:1170px}.span11{width:1070px}.span10{width:970px}.span9{width:870px}.span8{width:770px}.span7{width:670px}.span6{width:570px}.span5{width:470px}.span4{width:370px}.span3{width:270px}.span2{width:170px}.span1{width:70px}.offset12{margin-left:1230px}.offset11{margin-left:1130px}.offset10{margin-left:1030px}.offset9{margin-left:930px}.offset8{margin-left:830px}.offset7{margin-left:730px}.offset6{margin-left:630px}.offset5{margin-left:530px}.offset4{margin-left:430px}.offset3{margin-left:330px}.offset2{margin-left:230px}.offset1{margin-left:130px}.row-fluid{width:100%;*zoom:1}.row-fluid:before,.row-fluid:after{display:table;line-height:0;content:""}.row-fluid:after{clear:both}.row-fluid [class*="span"]{display:block;float:left;width:100%;min-height:30px;margin-left:2.564102564102564%;*margin-left:2.5109110747408616%;-webkit-box-sizing:border-box;-moz-box-sizing:border-box;box-sizing:border-box}.row-fluid [class*="span"]:first-child{margin-left:0}.row-fluid .controls-row [class*="span"]+[class*="span"]{margin-left:2.564102564102564%}.row-fluid .span12{width:100%;*width:99.94680851063829%}.row-fluid .span11{width:91.45299145299145%;*width:91.39979996362975%}.row-fluid .span10{width:82.90598290598291%;*width:82.8527914166212%}.row-fluid .span9{width:74.35897435897436%;*width:74.30578286961266%}.row-fluid .span8{width:65.81196581196582%;*width:65.75877432260411%}.row-fluid .span7{width:57.26495726495726%;*width:57.21176577559556%}.row-fluid .span6{width:48.717948717948715%;*width:48.664757228587014%}.row-fluid .span5{width:40.17094017094017%;*width:40.11774868157847%}.row-fluid .span4{width:31.623931623931625%;*width:31.570740134569924%}.row-fluid .span3{width:23.076923076923077%;*width:23.023731587561375%}.row-fluid .span2{width:14.52991452991453%;*width:14.476723040552828%}.row-fluid .span1{width:5.982905982905983%;*width:5.929714493544281%}.row-fluid .offset12{margin-left:105.12820512820512%;*margin-left:105.02182214948171%}.row-fluid .offset12:first-child{margin-left:102.56410256410257%;*margin-left:102.45771958537915%}.row-fluid .offset11{margin-left:96.58119658119658%;*margin-left:96.47481360247316%}.row-fluid .offset11:first-child{margin-left:94.01709401709402%;*margin-left:93.91071103837061%}.row-fluid .offset10{margin-left:88.03418803418803%;*margin-left:87.92780505546462%}.row-fluid .offset10:first-child{margin-left:85.47008547008548%;*margin-left:85.36370249136206%}.row-fluid .offset9{margin-left:79.48717948717949%;*margin-left:79.38079650845607%}.row-fluid .offset9:first-child{margin-left:76.92307692307693%;*margin-left:76.81669394435352%}.row-fluid .offset8{margin-left:70.94017094017094%;*margin-left:70.83378796144753%}.row-fluid .offset8:first-child{margin-left:68.37606837606839%;*margin-left:68.26968539734497%}.row-fluid .offset7{margin-left:62.393162393162385%;*margin-left:62.28677941443899%}.row-fluid .offset7:first-child{margin-left:59.82905982905982%;*margin-left:59.72267685033642%}.row-fluid .offset6{margin-left:53.84615384615384%;*margin-left:53.739770867430444%}.row-fluid .offset6:first-child{margin-left:51.28205128205128%;*margin-left:51.175668303327875%}.row-fluid .offset5{margin-left:45.299145299145295%;*margin-left:45.1927623204219%}.row-fluid .offset5:first-child{margin-left:42.73504273504273%;*margin-left:42.62865975631933%}.row-fluid .offset4{margin-left:36.75213675213675%;*margin-left:36.645753773413354%}.row-fluid .offset4:first-child{margin-left:34.18803418803419%;*margin-left:34.081651209310785%}.row-fluid .offset3{margin-left:28.205128205128204%;*margin-left:28.0987452264048%}.row-fluid .offset3:first-child{margin-left:25.641025641025642%;*margin-left:25.53464266230224%}.row-fluid .offset2{margin-left:19.65811965811966%;*margin-left:19.551736679396257%}.row-fluid .offset2:first-child{margin-left:17.094017094017094%;*margin-left:16.98763411529369%}.row-fluid .offset1{margin-left:11.11111111111111%;*margin-left:11.004728132387708%}.row-fluid .offset1:first-child{margin-left:8.547008547008547%;*margin-left:8.440625568285142%}input,textarea,.uneditable-input{margin-left:0}.controls-row [class*="span"]+[class*="span"]{margin-left:30px}input.span12,textarea.span12,.uneditable-input.span12{width:1156px}input.span11,textarea.span11,.uneditable-input.span11{width:1056px}input.span10,textarea.span10,.uneditable-input.span10{width:956px}input.span9,textarea.span9,.uneditable-input.span9{width:856px}input.span8,textarea.span8,.uneditable-input.span8{width:756px}input.span7,textarea.span7,.uneditable-input.span7{width:656px}input.span6,textarea.span6,.uneditable-input.span6{width:556px}input.span5,textarea.span5,.uneditable-input.span5{width:456px}input.span4,textarea.span4,.uneditable-input.span4{width:356px}input.span3,textarea.span3,.uneditable-input.span3{width:256px}input.span2,textarea.span2,.uneditable-input.span2{width:156px}input.span1,textarea.span1,.uneditable-input.span1{width:56px}.thumbnails{margin-left:-30px}.thumbnails>li{margin-left:30px}.row-fluid .thumbnails{margin-left:0}}@media(min-width:768px) and (max-width:979px){.row{margin-left:-20px;*zoom:1}.row:before,.row:after{display:table;line-height:0;content:""}.row:after{clear:both}[class*="span"]{float:left;min-height:1px;margin-left:20px}.container,.navbar-static-top .container,.navbar-fixed-top .container,.navbar-fixed-bottom .container{width:724px}.span12{width:724px}.span11{width:662px}.span10{width:600px}.span9{width:538px}.span8{width:476px}.span7{width:414px}.span6{width:352px}.span5{width:290px}.span4{width:228px}.span3{width:166px}.span2{width:104px}.span1{width:42px}.offset12{margin-left:764px}.offset11{margin-left:702px}.offset10{margin-left:640px}.offset9{margin-left:578px}.offset8{margin-left:516px}.offset7{margin-left:454px}.offset6{margin-left:392px}.offset5{margin-left:330px}.offset4{margin-left:268px}.offset3{margin-left:206px}.offset2{margin-left:144px}.offset1{margin-left:82px}.row-fluid{width:100%;*zoom:1}.row-fluid:before,.row-fluid:after{display:table;line-height:0;content:""}.row-fluid:after{clear:both}.row-fluid [class*="span"]{display:block;float:left;width:100%;min-height:30px;margin-left:2.7624309392265194%;*margin-left:2.709239449864817%;-webkit-box-sizing:border-box;-moz-box-sizing:border-box;box-sizing:border-box}.row-fluid [class*="span"]:first-child{margin-left:0}.row-fluid .controls-row [class*="span"]+[class*="span"]{margin-left:2.7624309392265194%}.row-fluid .span12{width:100%;*width:99.94680851063829%}.row-fluid .span11{width:91.43646408839778%;*width:91.38327259903608%}.row-fluid .span10{width:82.87292817679558%;*width:82.81973668743387%}.row-fluid .span9{width:74.30939226519337%;*width:74.25620077583166%}.row-fluid .span8{width:65.74585635359117%;*width:65.69266486422946%}.row-fluid .span7{width:57.18232044198895%;*width:57.12912895262725%}.row-fluid .span6{width:48.61878453038674%;*width:48.56559304102504%}.row-fluid .span5{width:40.05524861878453%;*width:40.00205712942283%}.row-fluid .span4{width:31.491712707182323%;*width:31.43852121782062%}.row-fluid .span3{width:22.92817679558011%;*width:22.87498530621841%}.row-fluid .span2{width:14.3646408839779%;*width:14.311449394616199%}.row-fluid .span1{width:5.801104972375691%;*width:5.747913483013988%}.row-fluid .offset12{margin-left:105.52486187845304%;*margin-left:105.41847889972962%}.row-fluid .offset12:first-child{margin-left:102.76243093922652%;*margin-left:102.6560479605031%}.row-fluid .offset11{margin-left:96.96132596685082%;*margin-left:96.8549429881274%}.row-fluid .offset11:first-child{margin-left:94.1988950276243%;*margin-left:94.09251204890089%}.row-fluid .offset10{margin-left:88.39779005524862%;*margin-left:88.2914070765252%}.row-fluid .offset10:first-child{margin-left:85.6353591160221%;*margin-left:85.52897613729868%}.row-fluid .offset9{margin-left:79.8342541436464%;*margin-left:79.72787116492299%}.row-fluid .offset9:first-child{margin-left:77.07182320441989%;*margin-left:76.96544022569647%}.row-fluid .offset8{margin-left:71.2707182320442%;*margin-left:71.16433525332079%}.row-fluid .offset8:first-child{margin-left:68.50828729281768%;*margin-left:68.40190431409427%}.row-fluid .offset7{margin-left:62.70718232044199%;*margin-left:62.600799341718584%}.row-fluid .offset7:first-child{margin-left:59.94475138121547%;*margin-left:59.838368402492065%}.row-fluid .offset6{margin-left:54.14364640883978%;*margin-left:54.037263430116376%}.row-fluid .offset6:first-child{margin-left:51.38121546961326%;*margin-left:51.27483249088986%}.row-fluid .offset5{margin-left:45.58011049723757%;*margin-left:45.47372751851417%}.row-fluid .offset5:first-child{margin-left:42.81767955801105%;*margin-left:42.71129657928765%}.row-fluid .offset4{margin-left:37.01657458563536%;*margin-left:36.91019160691196%}.row-fluid .offset4:first-child{margin-left:34.25414364640884%;*margin-left:34.14776066768544%}.row-fluid .offset3{margin-left:28.45303867403315%;*margin-left:28.346655695309746%}.row-fluid .offset3:first-child{margin-left:25.69060773480663%;*margin-left:25.584224756083227%}.row-fluid .offset2{margin-left:19.88950276243094%;*margin-left:19.783119783707537%}.row-fluid .offset2:first-child{margin-left:17.12707182320442%;*margin-left:17.02068884448102%}.row-fluid .offset1{margin-left:11.32596685082873%;*margin-left:11.219583872105325%}.row-fluid .offset1:first-child{margin-left:8.56353591160221%;*margin-left:8.457152932878806%}input,textarea,.uneditable-input{margin-left:0}.controls-row [class*="span"]+[class*="span"]{margin-left:20px}input.span12,textarea.span12,.uneditable-input.span12{width:710px}input.span11,textarea.span11,.uneditable-input.span11{width:648px}input.span10,textarea.span10,.uneditable-input.span10{width:586px}input.span9,textarea.span9,.uneditable-input.span9{width:524px}input.span8,textarea.span8,.uneditable-input.span8{width:462px}input.span7,textarea.span7,.uneditable-input.span7{width:400px}input.span6,textarea.span6,.uneditable-input.span6{width:338px}input.span5,textarea.span5,.uneditable-input.span5{width:276px}input.span4,textarea.span4,.uneditable-input.span4{width:214px}input.span3,textarea.span3,.uneditable-input.span3{width:152px}input.span2,textarea.span2,.uneditable-input.span2{width:90px}input.span1,textarea.span1,.uneditable-input.span1{width:28px}}@media(max-width:767px){body{padding-right:20px;padding-left:20px}.navbar-fixed-top,.navbar-fixed-bottom,.navbar-static-top{margin-right:-20px;margin-left:-20px}.container-fluid{padding:0}.dl-horizontal dt{float:none;width:auto;clear:none;text-align:left}.dl-horizontal dd{margin-left:0}.container{width:auto}.row-fluid{width:100%}.row,.thumbnails{margin-left:0}.thumbnails>li{float:none;margin-left:0}[class*="span"],.uneditable-input[class*="span"],.row-fluid [class*="span"]{display:block;float:none;width:100%;margin-left:0;-webkit-box-sizing:border-box;-moz-box-sizing:border-box;box-sizing:border-box}.span12,.row-fluid .span12{width:100%;-webkit-box-sizing:border-box;-moz-box-sizing:border-box;box-sizing:border-box}.row-fluid [class*="offset"]:first-child{margin-left:0}.input-large,.input-xlarge,.input-xxlarge,input[class*="span"],select[class*="span"],textarea[class*="span"],.uneditable-input{display:block;width:100%;min-height:30px;-webkit-box-sizing:border-box;-moz-box-sizing:border-box;box-sizing:border-box}.input-prepend input,.input-append input,.input-prepend input[class*="span"],.input-append input[class*="span"]{display:inline-block;width:auto}.controls-row [class*="span"]+[class*="span"]{margin-left:0}.modal{position:fixed;top:20px;right:20px;left:20px;width:auto;margin:0}.modal.fade{top:-100px}.modal.fade.in{top:20px}}@media(max-width:480px){.nav-collapse{-webkit-transform:translate3d(0,0,0)}.page-header h1 small{display:block;line-height:20px}input[type="checkbox"],input[type="radio"]{border:1px solid #ccc}.form-horizontal .control-label{float:none;width:auto;padding-top:0;text-align:left}.form-horizontal .controls{margin-left:0}.form-horizontal .control-list{padding-top:0}.form-horizontal .form-actions{padding-right:10px;padding-left:10px}.media .pull-left,.media .pull-right{display:block;float:none;margin-bottom:10px}.media-object{margin-right:0;margin-left:0}.modal{top:10px;right:10px;left:10px}.modal-header .close{padding:10px;margin:-10px}.carousel-caption{position:static}}@media(max-width:979px){body{padding-top:0}.navbar-fixed-top,.navbar-fixed-bottom{position:static}.navbar-fixed-top{margin-bottom:20px}.navbar-fixed-bottom{margin-top:20px}.navbar-fixed-top .navbar-inner,.navbar-fixed-bottom .navbar-inner{padding:5px}.navbar .container{width:auto;padding:0}.navbar .brand{padding-right:10px;padding-left:10px;margin:0 0 0 -5px}.nav-collapse{clear:both}.nav-collapse .nav{float:none;margin:0 0 10px}.nav-collapse .nav>li{float:none}.nav-collapse .nav>li>a{margin-bottom:2px}.nav-collapse .nav>.divider-vertical{display:none}.nav-collapse .nav .nav-header{color:#777;text-shadow:none}.nav-collapse .nav>li>a,.nav-collapse .dropdown-menu a{padding:9px 15px;font-weight:bold;color:#777;-webkit-border-radius:3px;-moz-border-radius:3px;border-radius:3px}.nav-collapse .btn{padding:4px 10px 4px;font-weight:normal;-webkit-border-radius:4px;-moz-border-radius:4px;border-radius:4px}.nav-collapse .dropdown-menu li+li a{margin-bottom:2px}.nav-collapse .nav>li>a:hover,.nav-collapse .nav>li>a:focus,.nav-collapse .dropdown-menu a:hover,.nav-collapse .dropdown-menu a:focus{background-color:#f2f2f2}.navbar-inverse .nav-collapse .nav>li>a,.navbar-inverse .nav-collapse .dropdown-menu a{color:#999}.navbar-inverse .nav-collapse .nav>li>a:hover,.navbar-inverse .nav-collapse .nav>li>a:focus,.navbar-inverse .nav-collapse .dropdown-menu a:hover,.navbar-inverse .nav-collapse .dropdown-menu a:focus{background-color:#111}.nav-collapse.in .btn-group{padding:0;margin-top:5px}.nav-collapse .dropdown-menu{position:static;top:auto;left:auto;display:none;float:none;max-width:none;padding:0;margin:0 15px;background-color:transparent;border:0;-webkit-border-radius:0;-moz-border-radius:0;border-radius:0;-webkit-box-shadow:none;-moz-box-shadow:none;box-shadow:none}.nav-collapse .open>.dropdown-menu{display:block}.nav-collapse .dropdown-menu:before,.nav-collapse .dropdown-menu:after{display:none}.nav-collapse .dropdown-menu .divider{display:none}.nav-collapse .nav>li>.dropdown-menu:before,.nav-collapse .nav>li>.dropdown-menu:after{display:none}.nav-collapse .navbar-form,.nav-collapse .navbar-search{float:none;padding:10px 15px;margin:10px 0;border-top:1px solid #f2f2f2;border-bottom:1px solid #f2f2f2;-webkit-box-shadow:inset 0 1px 0 rgba(255,255,255,0.1),0 1px 0 rgba(255,255,255,0.1);-moz-box-shadow:inset 0 1px 0 rgba(255,255,255,0.1),0 1px 0 rgba(255,255,255,0.1);box-shadow:inset 0 1px 0 rgba(255,255,255,0.1),0 1px 0 rgba(255,255,255,0.1)}.navbar-inverse .nav-collapse .navbar-form,.navbar-inverse .nav-collapse .navbar-search{border-top-color:#111;border-bottom-color:#111}.navbar .nav-collapse .nav.pull-right{float:none;margin-left:0}.nav-collapse,.nav-collapse.collapse{height:0;overflow:hidden}.navbar .btn-navbar{display:block}.navbar-static .navbar-inner{padding-right:10px;padding-left:10px}}@media(min-width:980px){.nav-collapse.collapse{height:auto!important;overflow:visible!important}} diff --git a/docs/_static/bootstrap-2.3.2/css/bootstrap.css b/docs/_static/bootstrap-2.3.2/css/bootstrap.css new file mode 100644 index 0000000..b725064 --- /dev/null +++ b/docs/_static/bootstrap-2.3.2/css/bootstrap.css @@ -0,0 +1,6167 @@ +/*! + * Bootstrap v2.3.2 + * + * 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. + */ + +.clearfix { + *zoom: 1; +} + +.clearfix:before, +.clearfix:after { + display: table; + line-height: 0; + content: ""; +} + +.clearfix:after { + clear: both; +} + +.hide-text { + font: 0/0 a; + color: transparent; + text-shadow: none; + background-color: transparent; + border: 0; +} + +.input-block-level { + display: block; + width: 100%; + min-height: 30px; + -webkit-box-sizing: border-box; + -moz-box-sizing: border-box; + box-sizing: border-box; +} + +article, +aside, +details, +figcaption, +figure, +footer, +header, +hgroup, +nav, +section { + display: block; +} + +audio, +canvas, +video { + display: inline-block; + *display: inline; + *zoom: 1; +} + +audio:not([controls]) { + display: none; +} + +html { + font-size: 100%; + -webkit-text-size-adjust: 100%; + -ms-text-size-adjust: 100%; +} + +a:focus { + outline: thin dotted #333; + outline: 5px auto -webkit-focus-ring-color; + outline-offset: -2px; +} + +a:hover, +a:active { + outline: 0; +} + +sub, +sup { + position: relative; + font-size: 75%; + line-height: 0; + vertical-align: baseline; +} + +sup { + top: -0.5em; +} + +sub { + bottom: -0.25em; +} + +img { + width: auto\9; + height: auto; + max-width: 100%; + vertical-align: middle; + border: 0; + -ms-interpolation-mode: bicubic; +} + +#map_canvas img, +.google-maps img { + max-width: none; +} + +button, +input, +select, +textarea { + margin: 0; + font-size: 100%; + vertical-align: middle; +} + +button, +input { + *overflow: visible; + line-height: normal; +} + +button::-moz-focus-inner, +input::-moz-focus-inner { + padding: 0; + border: 0; +} + +button, +html input[type="button"], +input[type="reset"], +input[type="submit"] { + cursor: pointer; + -webkit-appearance: button; +} + +label, +select, +button, +input[type="button"], +input[type="reset"], +input[type="submit"], +input[type="radio"], +input[type="checkbox"] { + cursor: pointer; +} + +input[type="search"] { + -webkit-box-sizing: content-box; + -moz-box-sizing: content-box; + box-sizing: content-box; + -webkit-appearance: textfield; +} + +input[type="search"]::-webkit-search-decoration, +input[type="search"]::-webkit-search-cancel-button { + -webkit-appearance: none; +} + +textarea { + overflow: auto; + vertical-align: top; +} + +@media print { + * { + color: #000 !important; + text-shadow: none !important; + background: transparent !important; + box-shadow: none !important; + } + a, + a:visited { + text-decoration: underline; + } + a[href]:after { + content: " (" attr(href) ")"; + } + abbr[title]:after { + content: " (" attr(title) ")"; + } + .ir a:after, + a[href^="javascript:"]:after, + a[href^="#"]:after { + content: ""; + } + pre, + blockquote { + border: 1px solid #999; + page-break-inside: avoid; + } + thead { + display: table-header-group; + } + tr, + img { + page-break-inside: avoid; + } + img { + max-width: 100% !important; + } + @page { + margin: 0.5cm; + } + p, + h2, + h3 { + orphans: 3; + widows: 3; + } + h2, + h3 { + page-break-after: avoid; + } +} + +body { + margin: 0; + font-family: "Helvetica Neue", Helvetica, Arial, sans-serif; + font-size: 14px; + line-height: 20px; + color: #333333; + background-color: #ffffff; +} + +a { + color: #0088cc; + text-decoration: none; +} + +a:hover, +a:focus { + color: #005580; + text-decoration: underline; +} + +.img-rounded { + -webkit-border-radius: 6px; + -moz-border-radius: 6px; + border-radius: 6px; +} + +.img-polaroid { + padding: 4px; + background-color: #fff; + border: 1px solid #ccc; + border: 1px solid rgba(0, 0, 0, 0.2); + -webkit-box-shadow: 0 1px 3px rgba(0, 0, 0, 0.1); + -moz-box-shadow: 0 1px 3px rgba(0, 0, 0, 0.1); + box-shadow: 0 1px 3px rgba(0, 0, 0, 0.1); +} + +.img-circle { + -webkit-border-radius: 500px; + -moz-border-radius: 500px; + border-radius: 500px; +} + +.row { + margin-left: -20px; + *zoom: 1; +} + +.row:before, +.row:after { + display: table; + line-height: 0; + content: ""; +} + +.row:after { + clear: both; +} + +[class*="span"] { + float: left; + min-height: 1px; + margin-left: 20px; +} + +.container, +.navbar-static-top .container, +.navbar-fixed-top .container, +.navbar-fixed-bottom .container { + width: 940px; +} + +.span12 { + width: 940px; +} + +.span11 { + width: 860px; +} + +.span10 { + width: 780px; +} + +.span9 { + width: 700px; +} + +.span8 { + width: 620px; +} + +.span7 { + width: 540px; +} + +.span6 { + width: 460px; +} + +.span5 { + width: 380px; +} + +.span4 { + width: 300px; +} + +.span3 { + width: 220px; +} + +.span2 { + width: 140px; +} + +.span1 { + width: 60px; +} + +.offset12 { + margin-left: 980px; +} + +.offset11 { + margin-left: 900px; +} + +.offset10 { + margin-left: 820px; +} + +.offset9 { + margin-left: 740px; +} + +.offset8 { + margin-left: 660px; +} + +.offset7 { + margin-left: 580px; +} + +.offset6 { + margin-left: 500px; +} + +.offset5 { + margin-left: 420px; +} + +.offset4 { + margin-left: 340px; +} + +.offset3 { + margin-left: 260px; +} + +.offset2 { + margin-left: 180px; +} + +.offset1 { + margin-left: 100px; +} + +.row-fluid { + width: 100%; + *zoom: 1; +} + +.row-fluid:before, +.row-fluid:after { + display: table; + line-height: 0; + content: ""; +} + +.row-fluid:after { + clear: both; +} + +.row-fluid [class*="span"] { + display: block; + float: left; + width: 100%; + min-height: 30px; + margin-left: 2.127659574468085%; + *margin-left: 2.074468085106383%; + -webkit-box-sizing: border-box; + -moz-box-sizing: border-box; + box-sizing: border-box; +} + +.row-fluid [class*="span"]:first-child { + margin-left: 0; +} + +.row-fluid .controls-row [class*="span"] + [class*="span"] { + margin-left: 2.127659574468085%; +} + +.row-fluid .span12 { + width: 100%; + *width: 99.94680851063829%; +} + +.row-fluid .span11 { + width: 91.48936170212765%; + *width: 91.43617021276594%; +} + +.row-fluid .span10 { + width: 82.97872340425532%; + *width: 82.92553191489361%; +} + +.row-fluid .span9 { + width: 74.46808510638297%; + *width: 74.41489361702126%; +} + +.row-fluid .span8 { + width: 65.95744680851064%; + *width: 65.90425531914893%; +} + +.row-fluid .span7 { + width: 57.44680851063829%; + *width: 57.39361702127659%; +} + +.row-fluid .span6 { + width: 48.93617021276595%; + *width: 48.88297872340425%; +} + +.row-fluid .span5 { + width: 40.42553191489362%; + *width: 40.37234042553192%; +} + +.row-fluid .span4 { + width: 31.914893617021278%; + *width: 31.861702127659576%; +} + +.row-fluid .span3 { + width: 23.404255319148934%; + *width: 23.351063829787233%; +} + +.row-fluid .span2 { + width: 14.893617021276595%; + *width: 14.840425531914894%; +} + +.row-fluid .span1 { + width: 6.382978723404255%; + *width: 6.329787234042553%; +} + +.row-fluid .offset12 { + margin-left: 104.25531914893617%; + *margin-left: 104.14893617021275%; +} + +.row-fluid .offset12:first-child { + margin-left: 102.12765957446808%; + *margin-left: 102.02127659574467%; +} + +.row-fluid .offset11 { + margin-left: 95.74468085106382%; + *margin-left: 95.6382978723404%; +} + +.row-fluid .offset11:first-child { + margin-left: 93.61702127659574%; + *margin-left: 93.51063829787232%; +} + +.row-fluid .offset10 { + margin-left: 87.23404255319149%; + *margin-left: 87.12765957446807%; +} + +.row-fluid .offset10:first-child { + margin-left: 85.1063829787234%; + *margin-left: 84.99999999999999%; +} + +.row-fluid .offset9 { + margin-left: 78.72340425531914%; + *margin-left: 78.61702127659572%; +} + +.row-fluid .offset9:first-child { + margin-left: 76.59574468085106%; + *margin-left: 76.48936170212764%; +} + +.row-fluid .offset8 { + margin-left: 70.2127659574468%; + *margin-left: 70.10638297872339%; +} + +.row-fluid .offset8:first-child { + margin-left: 68.08510638297872%; + *margin-left: 67.9787234042553%; +} + +.row-fluid .offset7 { + margin-left: 61.70212765957446%; + *margin-left: 61.59574468085106%; +} + +.row-fluid .offset7:first-child { + margin-left: 59.574468085106375%; + *margin-left: 59.46808510638297%; +} + +.row-fluid .offset6 { + margin-left: 53.191489361702125%; + *margin-left: 53.085106382978715%; +} + +.row-fluid .offset6:first-child { + margin-left: 51.063829787234035%; + *margin-left: 50.95744680851063%; +} + +.row-fluid .offset5 { + margin-left: 44.68085106382979%; + *margin-left: 44.57446808510638%; +} + +.row-fluid .offset5:first-child { + margin-left: 42.5531914893617%; + *margin-left: 42.4468085106383%; +} + +.row-fluid .offset4 { + margin-left: 36.170212765957444%; + *margin-left: 36.06382978723405%; +} + +.row-fluid .offset4:first-child { + margin-left: 34.04255319148936%; + *margin-left: 33.93617021276596%; +} + +.row-fluid .offset3 { + margin-left: 27.659574468085104%; + *margin-left: 27.5531914893617%; +} + +.row-fluid .offset3:first-child { + margin-left: 25.53191489361702%; + *margin-left: 25.425531914893618%; +} + +.row-fluid .offset2 { + margin-left: 19.148936170212764%; + *margin-left: 19.04255319148936%; +} + +.row-fluid .offset2:first-child { + margin-left: 17.02127659574468%; + *margin-left: 16.914893617021278%; +} + +.row-fluid .offset1 { + margin-left: 10.638297872340425%; + *margin-left: 10.53191489361702%; +} + +.row-fluid .offset1:first-child { + margin-left: 8.51063829787234%; + *margin-left: 8.404255319148938%; +} + +[class*="span"].hide, +.row-fluid [class*="span"].hide { + display: none; +} + +[class*="span"].pull-right, +.row-fluid [class*="span"].pull-right { + float: right; +} + +.container { + margin-right: auto; + margin-left: auto; + *zoom: 1; +} + +.container:before, +.container:after { + display: table; + line-height: 0; + content: ""; +} + +.container:after { + clear: both; +} + +.container-fluid { + padding-right: 20px; + padding-left: 20px; + *zoom: 1; +} + +.container-fluid:before, +.container-fluid:after { + display: table; + line-height: 0; + content: ""; +} + +.container-fluid:after { + clear: both; +} + +p { + margin: 0 0 10px; +} + +.lead { + margin-bottom: 20px; + font-size: 21px; + font-weight: 200; + line-height: 30px; +} + +small { + font-size: 85%; +} + +strong { + font-weight: bold; +} + +em { + font-style: italic; +} + +cite { + font-style: normal; +} + +.muted { + color: #999999; +} + +a.muted:hover, +a.muted:focus { + color: #808080; +} + +.text-warning { + color: #c09853; +} + +a.text-warning:hover, +a.text-warning:focus { + color: #a47e3c; +} + +.text-error { + color: #b94a48; +} + +a.text-error:hover, +a.text-error:focus { + color: #953b39; +} + +.text-info { + color: #3a87ad; +} + +a.text-info:hover, +a.text-info:focus { + color: #2d6987; +} + +.text-success { + color: #468847; +} + +a.text-success:hover, +a.text-success:focus { + color: #356635; +} + +.text-left { + text-align: left; +} + +.text-right { + text-align: right; +} + +.text-center { + text-align: center; +} + +h1, +h2, +h3, +h4, +h5, +h6 { + margin: 10px 0; + font-family: inherit; + font-weight: bold; + line-height: 20px; + color: inherit; + text-rendering: optimizelegibility; +} + +h1 small, +h2 small, +h3 small, +h4 small, +h5 small, +h6 small { + font-weight: normal; + line-height: 1; + color: #999999; +} + +h1, +h2, +h3 { + line-height: 40px; +} + +h1 { + font-size: 38.5px; +} + +h2 { + font-size: 31.5px; +} + +h3 { + font-size: 24.5px; +} + +h4 { + font-size: 17.5px; +} + +h5 { + font-size: 14px; +} + +h6 { + font-size: 11.9px; +} + +h1 small { + font-size: 24.5px; +} + +h2 small { + font-size: 17.5px; +} + +h3 small { + font-size: 14px; +} + +h4 small { + font-size: 14px; +} + +.page-header { + padding-bottom: 9px; + margin: 20px 0 30px; + border-bottom: 1px solid #eeeeee; +} + +ul, +ol { + padding: 0; + margin: 0 0 10px 25px; +} + +ul ul, +ul ol, +ol ol, +ol ul { + margin-bottom: 0; +} + +li { + line-height: 20px; +} + +ul.unstyled, +ol.unstyled { + margin-left: 0; + list-style: none; +} + +ul.inline, +ol.inline { + margin-left: 0; + list-style: none; +} + +ul.inline > li, +ol.inline > li { + display: inline-block; + *display: inline; + padding-right: 5px; + padding-left: 5px; + *zoom: 1; +} + +dl { + margin-bottom: 20px; +} + +dt, +dd { + line-height: 20px; +} + +dt { + font-weight: bold; +} + +dd { + margin-left: 10px; +} + +.dl-horizontal { + *zoom: 1; +} + +.dl-horizontal:before, +.dl-horizontal:after { + display: table; + line-height: 0; + content: ""; +} + +.dl-horizontal:after { + clear: both; +} + +.dl-horizontal dt { + float: left; + width: 160px; + overflow: hidden; + clear: left; + text-align: right; + text-overflow: ellipsis; + white-space: nowrap; +} + +.dl-horizontal dd { + margin-left: 180px; +} + +hr { + margin: 20px 0; + border: 0; + border-top: 1px solid #eeeeee; + border-bottom: 1px solid #ffffff; +} + +abbr[title], +abbr[data-original-title] { + cursor: help; + border-bottom: 1px dotted #999999; +} + +abbr.initialism { + font-size: 90%; + text-transform: uppercase; +} + +blockquote { + padding: 0 0 0 15px; + margin: 0 0 20px; + border-left: 5px solid #eeeeee; +} + +blockquote p { + margin-bottom: 0; + font-size: 17.5px; + font-weight: 300; + line-height: 1.25; +} + +blockquote small { + display: block; + line-height: 20px; + color: #999999; +} + +blockquote small:before { + content: '\2014 \00A0'; +} + +blockquote.pull-right { + float: right; + padding-right: 15px; + padding-left: 0; + border-right: 5px solid #eeeeee; + border-left: 0; +} + +blockquote.pull-right p, +blockquote.pull-right small { + text-align: right; +} + +blockquote.pull-right small:before { + content: ''; +} + +blockquote.pull-right small:after { + content: '\00A0 \2014'; +} + +q:before, +q:after, +blockquote:before, +blockquote:after { + content: ""; +} + +address { + display: block; + margin-bottom: 20px; + font-style: normal; + line-height: 20px; +} + +code, +pre { + padding: 0 3px 2px; + font-family: Monaco, Menlo, Consolas, "Courier New", monospace; + font-size: 12px; + color: #333333; + -webkit-border-radius: 3px; + -moz-border-radius: 3px; + border-radius: 3px; +} + +code { + padding: 2px 4px; + color: #d14; + white-space: nowrap; + background-color: #f7f7f9; + border: 1px solid #e1e1e8; +} + +pre { + display: block; + padding: 9.5px; + margin: 0 0 10px; + font-size: 13px; + line-height: 20px; + word-break: break-all; + word-wrap: break-word; + white-space: pre; + white-space: pre-wrap; + background-color: #f5f5f5; + border: 1px solid #ccc; + border: 1px solid rgba(0, 0, 0, 0.15); + -webkit-border-radius: 4px; + -moz-border-radius: 4px; + border-radius: 4px; +} + +pre.prettyprint { + margin-bottom: 20px; +} + +pre code { + padding: 0; + color: inherit; + white-space: pre; + white-space: pre-wrap; + background-color: transparent; + border: 0; +} + +.pre-scrollable { + max-height: 340px; + overflow-y: scroll; +} + +form { + margin: 0 0 20px; +} + +fieldset { + padding: 0; + margin: 0; + border: 0; +} + +legend { + display: block; + width: 100%; + padding: 0; + margin-bottom: 20px; + font-size: 21px; + line-height: 40px; + color: #333333; + border: 0; + border-bottom: 1px solid #e5e5e5; +} + +legend small { + font-size: 15px; + color: #999999; +} + +label, +input, +button, +select, +textarea { + font-size: 14px; + font-weight: normal; + line-height: 20px; +} + +input, +button, +select, +textarea { + font-family: "Helvetica Neue", Helvetica, Arial, sans-serif; +} + +label { + display: block; + margin-bottom: 5px; +} + +select, +textarea, +input[type="text"], +input[type="password"], +input[type="datetime"], +input[type="datetime-local"], +input[type="date"], +input[type="month"], +input[type="time"], +input[type="week"], +input[type="number"], +input[type="email"], +input[type="url"], +input[type="search"], +input[type="tel"], +input[type="color"], +.uneditable-input { + display: inline-block; + height: 20px; + padding: 4px 6px; + margin-bottom: 10px; + font-size: 14px; + line-height: 20px; + color: #555555; + vertical-align: middle; + -webkit-border-radius: 4px; + -moz-border-radius: 4px; + border-radius: 4px; +} + +input, +textarea, +.uneditable-input { + width: 206px; +} + +textarea { + height: auto; +} + +textarea, +input[type="text"], +input[type="password"], +input[type="datetime"], +input[type="datetime-local"], +input[type="date"], +input[type="month"], +input[type="time"], +input[type="week"], +input[type="number"], +input[type="email"], +input[type="url"], +input[type="search"], +input[type="tel"], +input[type="color"], +.uneditable-input { + background-color: #ffffff; + border: 1px solid #cccccc; + -webkit-box-shadow: inset 0 1px 1px rgba(0, 0, 0, 0.075); + -moz-box-shadow: inset 0 1px 1px rgba(0, 0, 0, 0.075); + box-shadow: inset 0 1px 1px rgba(0, 0, 0, 0.075); + -webkit-transition: border linear 0.2s, box-shadow linear 0.2s; + -moz-transition: border linear 0.2s, box-shadow linear 0.2s; + -o-transition: border linear 0.2s, box-shadow linear 0.2s; + transition: border linear 0.2s, box-shadow linear 0.2s; +} + +textarea:focus, +input[type="text"]:focus, +input[type="password"]:focus, +input[type="datetime"]:focus, +input[type="datetime-local"]:focus, +input[type="date"]:focus, +input[type="month"]:focus, +input[type="time"]:focus, +input[type="week"]:focus, +input[type="number"]:focus, +input[type="email"]:focus, +input[type="url"]:focus, +input[type="search"]:focus, +input[type="tel"]:focus, +input[type="color"]:focus, +.uneditable-input:focus { + border-color: rgba(82, 168, 236, 0.8); + outline: 0; + outline: thin dotted \9; + /* IE6-9 */ + + -webkit-box-shadow: inset 0 1px 1px rgba(0, 0, 0, 0.075), 0 0 8px rgba(82, 168, 236, 0.6); + -moz-box-shadow: inset 0 1px 1px rgba(0, 0, 0, 0.075), 0 0 8px rgba(82, 168, 236, 0.6); + box-shadow: inset 0 1px 1px rgba(0, 0, 0, 0.075), 0 0 8px rgba(82, 168, 236, 0.6); +} + +input[type="radio"], +input[type="checkbox"] { + margin: 4px 0 0; + margin-top: 1px \9; + *margin-top: 0; + line-height: normal; +} + +input[type="file"], +input[type="image"], +input[type="submit"], +input[type="reset"], +input[type="button"], +input[type="radio"], +input[type="checkbox"] { + width: auto; +} + +select, +input[type="file"] { + height: 30px; + /* In IE7, the height of the select element cannot be changed by height, only font-size */ + + *margin-top: 4px; + /* For IE7, add top margin to align select with labels */ + + line-height: 30px; +} + +select { + width: 220px; + background-color: #ffffff; + border: 1px solid #cccccc; +} + +select[multiple], +select[size] { + height: auto; +} + +select:focus, +input[type="file"]:focus, +input[type="radio"]:focus, +input[type="checkbox"]:focus { + outline: thin dotted #333; + outline: 5px auto -webkit-focus-ring-color; + outline-offset: -2px; +} + +.uneditable-input, +.uneditable-textarea { + color: #999999; + cursor: not-allowed; + background-color: #fcfcfc; + border-color: #cccccc; + -webkit-box-shadow: inset 0 1px 2px rgba(0, 0, 0, 0.025); + -moz-box-shadow: inset 0 1px 2px rgba(0, 0, 0, 0.025); + box-shadow: inset 0 1px 2px rgba(0, 0, 0, 0.025); +} + +.uneditable-input { + overflow: hidden; + white-space: nowrap; +} + +.uneditable-textarea { + width: auto; + height: auto; +} + +input:-moz-placeholder, +textarea:-moz-placeholder { + color: #999999; +} + +input:-ms-input-placeholder, +textarea:-ms-input-placeholder { + color: #999999; +} + +input::-webkit-input-placeholder, +textarea::-webkit-input-placeholder { + color: #999999; +} + +.radio, +.checkbox { + min-height: 20px; + padding-left: 20px; +} + +.radio input[type="radio"], +.checkbox input[type="checkbox"] { + float: left; + margin-left: -20px; +} + +.controls > .radio:first-child, +.controls > .checkbox:first-child { + padding-top: 5px; +} + +.radio.inline, +.checkbox.inline { + display: inline-block; + padding-top: 5px; + margin-bottom: 0; + vertical-align: middle; +} + +.radio.inline + .radio.inline, +.checkbox.inline + .checkbox.inline { + margin-left: 10px; +} + +.input-mini { + width: 60px; +} + +.input-small { + width: 90px; +} + +.input-medium { + width: 150px; +} + +.input-large { + width: 210px; +} + +.input-xlarge { + width: 270px; +} + +.input-xxlarge { + width: 530px; +} + +input[class*="span"], +select[class*="span"], +textarea[class*="span"], +.uneditable-input[class*="span"], +.row-fluid input[class*="span"], +.row-fluid select[class*="span"], +.row-fluid textarea[class*="span"], +.row-fluid .uneditable-input[class*="span"] { + float: none; + margin-left: 0; +} + +.input-append input[class*="span"], +.input-append .uneditable-input[class*="span"], +.input-prepend input[class*="span"], +.input-prepend .uneditable-input[class*="span"], +.row-fluid input[class*="span"], +.row-fluid select[class*="span"], +.row-fluid textarea[class*="span"], +.row-fluid .uneditable-input[class*="span"], +.row-fluid .input-prepend [class*="span"], +.row-fluid .input-append [class*="span"] { + display: inline-block; +} + +input, +textarea, +.uneditable-input { + margin-left: 0; +} + +.controls-row [class*="span"] + [class*="span"] { + margin-left: 20px; +} + +input.span12, +textarea.span12, +.uneditable-input.span12 { + width: 926px; +} + +input.span11, +textarea.span11, +.uneditable-input.span11 { + width: 846px; +} + +input.span10, +textarea.span10, +.uneditable-input.span10 { + width: 766px; +} + +input.span9, +textarea.span9, +.uneditable-input.span9 { + width: 686px; +} + +input.span8, +textarea.span8, +.uneditable-input.span8 { + width: 606px; +} + +input.span7, +textarea.span7, +.uneditable-input.span7 { + width: 526px; +} + +input.span6, +textarea.span6, +.uneditable-input.span6 { + width: 446px; +} + +input.span5, +textarea.span5, +.uneditable-input.span5 { + width: 366px; +} + +input.span4, +textarea.span4, +.uneditable-input.span4 { + width: 286px; +} + +input.span3, +textarea.span3, +.uneditable-input.span3 { + width: 206px; +} + +input.span2, +textarea.span2, +.uneditable-input.span2 { + width: 126px; +} + +input.span1, +textarea.span1, +.uneditable-input.span1 { + width: 46px; +} + +.controls-row { + *zoom: 1; +} + +.controls-row:before, +.controls-row:after { + display: table; + line-height: 0; + content: ""; +} + +.controls-row:after { + clear: both; +} + +.controls-row [class*="span"], +.row-fluid .controls-row [class*="span"] { + float: left; +} + +.controls-row .checkbox[class*="span"], +.controls-row .radio[class*="span"] { + padding-top: 5px; +} + +input[disabled], +select[disabled], +textarea[disabled], +input[readonly], +select[readonly], +textarea[readonly] { + cursor: not-allowed; + background-color: #eeeeee; +} + +input[type="radio"][disabled], +input[type="checkbox"][disabled], +input[type="radio"][readonly], +input[type="checkbox"][readonly] { + background-color: transparent; +} + +.control-group.warning .control-label, +.control-group.warning .help-block, +.control-group.warning .help-inline { + color: #c09853; +} + +.control-group.warning .checkbox, +.control-group.warning .radio, +.control-group.warning input, +.control-group.warning select, +.control-group.warning textarea { + color: #c09853; +} + +.control-group.warning input, +.control-group.warning select, +.control-group.warning textarea { + border-color: #c09853; + -webkit-box-shadow: inset 0 1px 1px rgba(0, 0, 0, 0.075); + -moz-box-shadow: inset 0 1px 1px rgba(0, 0, 0, 0.075); + box-shadow: inset 0 1px 1px rgba(0, 0, 0, 0.075); +} + +.control-group.warning input:focus, +.control-group.warning select:focus, +.control-group.warning textarea:focus { + border-color: #a47e3c; + -webkit-box-shadow: inset 0 1px 1px rgba(0, 0, 0, 0.075), 0 0 6px #dbc59e; + -moz-box-shadow: inset 0 1px 1px rgba(0, 0, 0, 0.075), 0 0 6px #dbc59e; + box-shadow: inset 0 1px 1px rgba(0, 0, 0, 0.075), 0 0 6px #dbc59e; +} + +.control-group.warning .input-prepend .add-on, +.control-group.warning .input-append .add-on { + color: #c09853; + background-color: #fcf8e3; + border-color: #c09853; +} + +.control-group.error .control-label, +.control-group.error .help-block, +.control-group.error .help-inline { + color: #b94a48; +} + +.control-group.error .checkbox, +.control-group.error .radio, +.control-group.error input, +.control-group.error select, +.control-group.error textarea { + color: #b94a48; +} + +.control-group.error input, +.control-group.error select, +.control-group.error textarea { + border-color: #b94a48; + -webkit-box-shadow: inset 0 1px 1px rgba(0, 0, 0, 0.075); + -moz-box-shadow: inset 0 1px 1px rgba(0, 0, 0, 0.075); + box-shadow: inset 0 1px 1px rgba(0, 0, 0, 0.075); +} + +.control-group.error input:focus, +.control-group.error select:focus, +.control-group.error textarea:focus { + border-color: #953b39; + -webkit-box-shadow: inset 0 1px 1px rgba(0, 0, 0, 0.075), 0 0 6px #d59392; + -moz-box-shadow: inset 0 1px 1px rgba(0, 0, 0, 0.075), 0 0 6px #d59392; + box-shadow: inset 0 1px 1px rgba(0, 0, 0, 0.075), 0 0 6px #d59392; +} + +.control-group.error .input-prepend .add-on, +.control-group.error .input-append .add-on { + color: #b94a48; + background-color: #f2dede; + border-color: #b94a48; +} + +.control-group.success .control-label, +.control-group.success .help-block, +.control-group.success .help-inline { + color: #468847; +} + +.control-group.success .checkbox, +.control-group.success .radio, +.control-group.success input, +.control-group.success select, +.control-group.success textarea { + color: #468847; +} + +.control-group.success input, +.control-group.success select, +.control-group.success textarea { + border-color: #468847; + -webkit-box-shadow: inset 0 1px 1px rgba(0, 0, 0, 0.075); + -moz-box-shadow: inset 0 1px 1px rgba(0, 0, 0, 0.075); + box-shadow: inset 0 1px 1px rgba(0, 0, 0, 0.075); +} + +.control-group.success input:focus, +.control-group.success select:focus, +.control-group.success textarea:focus { + border-color: #356635; + -webkit-box-shadow: inset 0 1px 1px rgba(0, 0, 0, 0.075), 0 0 6px #7aba7b; + -moz-box-shadow: inset 0 1px 1px rgba(0, 0, 0, 0.075), 0 0 6px #7aba7b; + box-shadow: inset 0 1px 1px rgba(0, 0, 0, 0.075), 0 0 6px #7aba7b; +} + +.control-group.success .input-prepend .add-on, +.control-group.success .input-append .add-on { + color: #468847; + background-color: #dff0d8; + border-color: #468847; +} + +.control-group.info .control-label, +.control-group.info .help-block, +.control-group.info .help-inline { + color: #3a87ad; +} + +.control-group.info .checkbox, +.control-group.info .radio, +.control-group.info input, +.control-group.info select, +.control-group.info textarea { + color: #3a87ad; +} + +.control-group.info input, +.control-group.info select, +.control-group.info textarea { + border-color: #3a87ad; + -webkit-box-shadow: inset 0 1px 1px rgba(0, 0, 0, 0.075); + -moz-box-shadow: inset 0 1px 1px rgba(0, 0, 0, 0.075); + box-shadow: inset 0 1px 1px rgba(0, 0, 0, 0.075); +} + +.control-group.info input:focus, +.control-group.info select:focus, +.control-group.info textarea:focus { + border-color: #2d6987; + -webkit-box-shadow: inset 0 1px 1px rgba(0, 0, 0, 0.075), 0 0 6px #7ab5d3; + -moz-box-shadow: inset 0 1px 1px rgba(0, 0, 0, 0.075), 0 0 6px #7ab5d3; + box-shadow: inset 0 1px 1px rgba(0, 0, 0, 0.075), 0 0 6px #7ab5d3; +} + +.control-group.info .input-prepend .add-on, +.control-group.info .input-append .add-on { + color: #3a87ad; + background-color: #d9edf7; + border-color: #3a87ad; +} + +input:focus:invalid, +textarea:focus:invalid, +select:focus:invalid { + color: #b94a48; + border-color: #ee5f5b; +} + +input:focus:invalid:focus, +textarea:focus:invalid:focus, +select:focus:invalid:focus { + border-color: #e9322d; + -webkit-box-shadow: 0 0 6px #f8b9b7; + -moz-box-shadow: 0 0 6px #f8b9b7; + box-shadow: 0 0 6px #f8b9b7; +} + +.form-actions { + padding: 19px 20px 20px; + margin-top: 20px; + margin-bottom: 20px; + background-color: #f5f5f5; + border-top: 1px solid #e5e5e5; + *zoom: 1; +} + +.form-actions:before, +.form-actions:after { + display: table; + line-height: 0; + content: ""; +} + +.form-actions:after { + clear: both; +} + +.help-block, +.help-inline { + color: #595959; +} + +.help-block { + display: block; + margin-bottom: 10px; +} + +.help-inline { + display: inline-block; + *display: inline; + padding-left: 5px; + vertical-align: middle; + *zoom: 1; +} + +.input-append, +.input-prepend { + display: inline-block; + margin-bottom: 10px; + font-size: 0; + white-space: nowrap; + vertical-align: middle; +} + +.input-append input, +.input-prepend input, +.input-append select, +.input-prepend select, +.input-append .uneditable-input, +.input-prepend .uneditable-input, +.input-append .dropdown-menu, +.input-prepend .dropdown-menu, +.input-append .popover, +.input-prepend .popover { + font-size: 14px; +} + +.input-append input, +.input-prepend input, +.input-append select, +.input-prepend select, +.input-append .uneditable-input, +.input-prepend .uneditable-input { + position: relative; + margin-bottom: 0; + *margin-left: 0; + vertical-align: top; + -webkit-border-radius: 0 4px 4px 0; + -moz-border-radius: 0 4px 4px 0; + border-radius: 0 4px 4px 0; +} + +.input-append input:focus, +.input-prepend input:focus, +.input-append select:focus, +.input-prepend select:focus, +.input-append .uneditable-input:focus, +.input-prepend .uneditable-input:focus { + z-index: 2; +} + +.input-append .add-on, +.input-prepend .add-on { + display: inline-block; + width: auto; + height: 20px; + min-width: 16px; + padding: 4px 5px; + font-size: 14px; + font-weight: normal; + line-height: 20px; + text-align: center; + text-shadow: 0 1px 0 #ffffff; + background-color: #eeeeee; + border: 1px solid #ccc; +} + +.input-append .add-on, +.input-prepend .add-on, +.input-append .btn, +.input-prepend .btn, +.input-append .btn-group > .dropdown-toggle, +.input-prepend .btn-group > .dropdown-toggle { + vertical-align: top; + -webkit-border-radius: 0; + -moz-border-radius: 0; + border-radius: 0; +} + +.input-append .active, +.input-prepend .active { + background-color: #a9dba9; + border-color: #46a546; +} + +.input-prepend .add-on, +.input-prepend .btn { + margin-right: -1px; +} + +.input-prepend .add-on:first-child, +.input-prepend .btn:first-child { + -webkit-border-radius: 4px 0 0 4px; + -moz-border-radius: 4px 0 0 4px; + border-radius: 4px 0 0 4px; +} + +.input-append input, +.input-append select, +.input-append .uneditable-input { + -webkit-border-radius: 4px 0 0 4px; + -moz-border-radius: 4px 0 0 4px; + border-radius: 4px 0 0 4px; +} + +.input-append input + .btn-group .btn:last-child, +.input-append select + .btn-group .btn:last-child, +.input-append .uneditable-input + .btn-group .btn:last-child { + -webkit-border-radius: 0 4px 4px 0; + -moz-border-radius: 0 4px 4px 0; + border-radius: 0 4px 4px 0; +} + +.input-append .add-on, +.input-append .btn, +.input-append .btn-group { + margin-left: -1px; +} + +.input-append .add-on:last-child, +.input-append .btn:last-child, +.input-append .btn-group:last-child > .dropdown-toggle { + -webkit-border-radius: 0 4px 4px 0; + -moz-border-radius: 0 4px 4px 0; + border-radius: 0 4px 4px 0; +} + +.input-prepend.input-append input, +.input-prepend.input-append select, +.input-prepend.input-append .uneditable-input { + -webkit-border-radius: 0; + -moz-border-radius: 0; + border-radius: 0; +} + +.input-prepend.input-append input + .btn-group .btn, +.input-prepend.input-append select + .btn-group .btn, +.input-prepend.input-append .uneditable-input + .btn-group .btn { + -webkit-border-radius: 0 4px 4px 0; + -moz-border-radius: 0 4px 4px 0; + border-radius: 0 4px 4px 0; +} + +.input-prepend.input-append .add-on:first-child, +.input-prepend.input-append .btn:first-child { + margin-right: -1px; + -webkit-border-radius: 4px 0 0 4px; + -moz-border-radius: 4px 0 0 4px; + border-radius: 4px 0 0 4px; +} + +.input-prepend.input-append .add-on:last-child, +.input-prepend.input-append .btn:last-child { + margin-left: -1px; + -webkit-border-radius: 0 4px 4px 0; + -moz-border-radius: 0 4px 4px 0; + border-radius: 0 4px 4px 0; +} + +.input-prepend.input-append .btn-group:first-child { + margin-left: 0; +} + +input.search-query { + padding-right: 14px; + padding-right: 4px \9; + padding-left: 14px; + padding-left: 4px \9; + /* IE7-8 doesn't have border-radius, so don't indent the padding */ + + margin-bottom: 0; + -webkit-border-radius: 15px; + -moz-border-radius: 15px; + border-radius: 15px; +} + +/* Allow for input prepend/append in search forms */ + +.form-search .input-append .search-query, +.form-search .input-prepend .search-query { + -webkit-border-radius: 0; + -moz-border-radius: 0; + border-radius: 0; +} + +.form-search .input-append .search-query { + -webkit-border-radius: 14px 0 0 14px; + -moz-border-radius: 14px 0 0 14px; + border-radius: 14px 0 0 14px; +} + +.form-search .input-append .btn { + -webkit-border-radius: 0 14px 14px 0; + -moz-border-radius: 0 14px 14px 0; + border-radius: 0 14px 14px 0; +} + +.form-search .input-prepend .search-query { + -webkit-border-radius: 0 14px 14px 0; + -moz-border-radius: 0 14px 14px 0; + border-radius: 0 14px 14px 0; +} + +.form-search .input-prepend .btn { + -webkit-border-radius: 14px 0 0 14px; + -moz-border-radius: 14px 0 0 14px; + border-radius: 14px 0 0 14px; +} + +.form-search input, +.form-inline input, +.form-horizontal input, +.form-search textarea, +.form-inline textarea, +.form-horizontal textarea, +.form-search select, +.form-inline select, +.form-horizontal select, +.form-search .help-inline, +.form-inline .help-inline, +.form-horizontal .help-inline, +.form-search .uneditable-input, +.form-inline .uneditable-input, +.form-horizontal .uneditable-input, +.form-search .input-prepend, +.form-inline .input-prepend, +.form-horizontal .input-prepend, +.form-search .input-append, +.form-inline .input-append, +.form-horizontal .input-append { + display: inline-block; + *display: inline; + margin-bottom: 0; + vertical-align: middle; + *zoom: 1; +} + +.form-search .hide, +.form-inline .hide, +.form-horizontal .hide { + display: none; +} + +.form-search label, +.form-inline label, +.form-search .btn-group, +.form-inline .btn-group { + display: inline-block; +} + +.form-search .input-append, +.form-inline .input-append, +.form-search .input-prepend, +.form-inline .input-prepend { + margin-bottom: 0; +} + +.form-search .radio, +.form-search .checkbox, +.form-inline .radio, +.form-inline .checkbox { + padding-left: 0; + margin-bottom: 0; + vertical-align: middle; +} + +.form-search .radio input[type="radio"], +.form-search .checkbox input[type="checkbox"], +.form-inline .radio input[type="radio"], +.form-inline .checkbox input[type="checkbox"] { + float: left; + margin-right: 3px; + margin-left: 0; +} + +.control-group { + margin-bottom: 10px; +} + +legend + .control-group { + margin-top: 20px; + -webkit-margin-top-collapse: separate; +} + +.form-horizontal .control-group { + margin-bottom: 20px; + *zoom: 1; +} + +.form-horizontal .control-group:before, +.form-horizontal .control-group:after { + display: table; + line-height: 0; + content: ""; +} + +.form-horizontal .control-group:after { + clear: both; +} + +.form-horizontal .control-label { + float: left; + width: 160px; + padding-top: 5px; + text-align: right; +} + +.form-horizontal .controls { + *display: inline-block; + *padding-left: 20px; + margin-left: 180px; + *margin-left: 0; +} + +.form-horizontal .controls:first-child { + *padding-left: 180px; +} + +.form-horizontal .help-block { + margin-bottom: 0; +} + +.form-horizontal input + .help-block, +.form-horizontal select + .help-block, +.form-horizontal textarea + .help-block, +.form-horizontal .uneditable-input + .help-block, +.form-horizontal .input-prepend + .help-block, +.form-horizontal .input-append + .help-block { + margin-top: 10px; +} + +.form-horizontal .form-actions { + padding-left: 180px; +} + +table { + max-width: 100%; + background-color: transparent; + border-collapse: collapse; + border-spacing: 0; +} + +.table { + width: 100%; + margin-bottom: 20px; +} + +.table th, +.table td { + padding: 8px; + line-height: 20px; + text-align: left; + vertical-align: top; + border-top: 1px solid #dddddd; +} + +.table th { + font-weight: bold; +} + +.table thead th { + vertical-align: bottom; +} + +.table caption + thead tr:first-child th, +.table caption + thead tr:first-child td, +.table colgroup + thead tr:first-child th, +.table colgroup + thead tr:first-child td, +.table thead:first-child tr:first-child th, +.table thead:first-child tr:first-child td { + border-top: 0; +} + +.table tbody + tbody { + border-top: 2px solid #dddddd; +} + +.table .table { + background-color: #ffffff; +} + +.table-condensed th, +.table-condensed td { + padding: 4px 5px; +} + +.table-bordered { + border: 1px solid #dddddd; + border-collapse: separate; + *border-collapse: collapse; + border-left: 0; + -webkit-border-radius: 4px; + -moz-border-radius: 4px; + border-radius: 4px; +} + +.table-bordered th, +.table-bordered td { + border-left: 1px solid #dddddd; +} + +.table-bordered caption + thead tr:first-child th, +.table-bordered caption + tbody tr:first-child th, +.table-bordered caption + tbody tr:first-child td, +.table-bordered colgroup + thead tr:first-child th, +.table-bordered colgroup + tbody tr:first-child th, +.table-bordered colgroup + tbody tr:first-child td, +.table-bordered thead:first-child tr:first-child th, +.table-bordered tbody:first-child tr:first-child th, +.table-bordered tbody:first-child tr:first-child td { + border-top: 0; +} + +.table-bordered thead:first-child tr:first-child > th:first-child, +.table-bordered tbody:first-child tr:first-child > td:first-child, +.table-bordered tbody:first-child tr:first-child > th:first-child { + -webkit-border-top-left-radius: 4px; + border-top-left-radius: 4px; + -moz-border-radius-topleft: 4px; +} + +.table-bordered thead:first-child tr:first-child > th:last-child, +.table-bordered tbody:first-child tr:first-child > td:last-child, +.table-bordered tbody:first-child tr:first-child > th:last-child { + -webkit-border-top-right-radius: 4px; + border-top-right-radius: 4px; + -moz-border-radius-topright: 4px; +} + +.table-bordered thead:last-child tr:last-child > th:first-child, +.table-bordered tbody:last-child tr:last-child > td:first-child, +.table-bordered tbody:last-child tr:last-child > th:first-child, +.table-bordered tfoot:last-child tr:last-child > td:first-child, +.table-bordered tfoot:last-child tr:last-child > th:first-child { + -webkit-border-bottom-left-radius: 4px; + border-bottom-left-radius: 4px; + -moz-border-radius-bottomleft: 4px; +} + +.table-bordered thead:last-child tr:last-child > th:last-child, +.table-bordered tbody:last-child tr:last-child > td:last-child, +.table-bordered tbody:last-child tr:last-child > th:last-child, +.table-bordered tfoot:last-child tr:last-child > td:last-child, +.table-bordered tfoot:last-child tr:last-child > th:last-child { + -webkit-border-bottom-right-radius: 4px; + border-bottom-right-radius: 4px; + -moz-border-radius-bottomright: 4px; +} + +.table-bordered tfoot + tbody:last-child tr:last-child td:first-child { + -webkit-border-bottom-left-radius: 0; + border-bottom-left-radius: 0; + -moz-border-radius-bottomleft: 0; +} + +.table-bordered tfoot + tbody:last-child tr:last-child td:last-child { + -webkit-border-bottom-right-radius: 0; + border-bottom-right-radius: 0; + -moz-border-radius-bottomright: 0; +} + +.table-bordered caption + thead tr:first-child th:first-child, +.table-bordered caption + tbody tr:first-child td:first-child, +.table-bordered colgroup + thead tr:first-child th:first-child, +.table-bordered colgroup + tbody tr:first-child td:first-child { + -webkit-border-top-left-radius: 4px; + border-top-left-radius: 4px; + -moz-border-radius-topleft: 4px; +} + +.table-bordered caption + thead tr:first-child th:last-child, +.table-bordered caption + tbody tr:first-child td:last-child, +.table-bordered colgroup + thead tr:first-child th:last-child, +.table-bordered colgroup + tbody tr:first-child td:last-child { + -webkit-border-top-right-radius: 4px; + border-top-right-radius: 4px; + -moz-border-radius-topright: 4px; +} + +.table-striped tbody > tr:nth-child(odd) > td, +.table-striped tbody > tr:nth-child(odd) > th { + background-color: #f9f9f9; +} + +.table-hover tbody tr:hover > td, +.table-hover tbody tr:hover > th { + background-color: #f5f5f5; +} + +table td[class*="span"], +table th[class*="span"], +.row-fluid table td[class*="span"], +.row-fluid table th[class*="span"] { + display: table-cell; + float: none; + margin-left: 0; +} + +.table td.span1, +.table th.span1 { + float: none; + width: 44px; + margin-left: 0; +} + +.table td.span2, +.table th.span2 { + float: none; + width: 124px; + margin-left: 0; +} + +.table td.span3, +.table th.span3 { + float: none; + width: 204px; + margin-left: 0; +} + +.table td.span4, +.table th.span4 { + float: none; + width: 284px; + margin-left: 0; +} + +.table td.span5, +.table th.span5 { + float: none; + width: 364px; + margin-left: 0; +} + +.table td.span6, +.table th.span6 { + float: none; + width: 444px; + margin-left: 0; +} + +.table td.span7, +.table th.span7 { + float: none; + width: 524px; + margin-left: 0; +} + +.table td.span8, +.table th.span8 { + float: none; + width: 604px; + margin-left: 0; +} + +.table td.span9, +.table th.span9 { + float: none; + width: 684px; + margin-left: 0; +} + +.table td.span10, +.table th.span10 { + float: none; + width: 764px; + margin-left: 0; +} + +.table td.span11, +.table th.span11 { + float: none; + width: 844px; + margin-left: 0; +} + +.table td.span12, +.table th.span12 { + float: none; + width: 924px; + margin-left: 0; +} + +.table tbody tr.success > td { + background-color: #dff0d8; +} + +.table tbody tr.error > td { + background-color: #f2dede; +} + +.table tbody tr.warning > td { + background-color: #fcf8e3; +} + +.table tbody tr.info > td { + background-color: #d9edf7; +} + +.table-hover tbody tr.success:hover > td { + background-color: #d0e9c6; +} + +.table-hover tbody tr.error:hover > td { + background-color: #ebcccc; +} + +.table-hover tbody tr.warning:hover > td { + background-color: #faf2cc; +} + +.table-hover tbody tr.info:hover > td { + background-color: #c4e3f3; +} + +[class^="icon-"], +[class*=" icon-"] { + display: inline-block; + width: 14px; + height: 14px; + margin-top: 1px; + *margin-right: .3em; + line-height: 14px; + vertical-align: text-top; + background-image: url("../img/glyphicons-halflings.png"); + background-position: 14px 14px; + background-repeat: no-repeat; +} + +/* White icons with optional class, or on hover/focus/active states of certain elements */ + +.icon-white, +.nav-pills > .active > a > [class^="icon-"], +.nav-pills > .active > a > [class*=" icon-"], +.nav-list > .active > a > [class^="icon-"], +.nav-list > .active > a > [class*=" icon-"], +.navbar-inverse .nav > .active > a > [class^="icon-"], +.navbar-inverse .nav > .active > a > [class*=" icon-"], +.dropdown-menu > li > a:hover > [class^="icon-"], +.dropdown-menu > li > a:focus > [class^="icon-"], +.dropdown-menu > li > a:hover > [class*=" icon-"], +.dropdown-menu > li > a:focus > [class*=" icon-"], +.dropdown-menu > .active > a > [class^="icon-"], +.dropdown-menu > .active > a > [class*=" icon-"], +.dropdown-submenu:hover > a > [class^="icon-"], +.dropdown-submenu:focus > a > [class^="icon-"], +.dropdown-submenu:hover > a > [class*=" icon-"], +.dropdown-submenu:focus > a > [class*=" icon-"] { + background-image: url("../img/glyphicons-halflings-white.png"); +} + +.icon-glass { + background-position: 0 0; +} + +.icon-music { + background-position: -24px 0; +} + +.icon-search { + background-position: -48px 0; +} + +.icon-envelope { + background-position: -72px 0; +} + +.icon-heart { + background-position: -96px 0; +} + +.icon-star { + background-position: -120px 0; +} + +.icon-star-empty { + background-position: -144px 0; +} + +.icon-user { + background-position: -168px 0; +} + +.icon-film { + background-position: -192px 0; +} + +.icon-th-large { + background-position: -216px 0; +} + +.icon-th { + background-position: -240px 0; +} + +.icon-th-list { + background-position: -264px 0; +} + +.icon-ok { + background-position: -288px 0; +} + +.icon-remove { + background-position: -312px 0; +} + +.icon-zoom-in { + background-position: -336px 0; +} + +.icon-zoom-out { + background-position: -360px 0; +} + +.icon-off { + background-position: -384px 0; +} + +.icon-signal { + background-position: -408px 0; +} + +.icon-cog { + background-position: -432px 0; +} + +.icon-trash { + background-position: -456px 0; +} + +.icon-home { + background-position: 0 -24px; +} + +.icon-file { + background-position: -24px -24px; +} + +.icon-time { + background-position: -48px -24px; +} + +.icon-road { + background-position: -72px -24px; +} + +.icon-download-alt { + background-position: -96px -24px; +} + +.icon-download { + background-position: -120px -24px; +} + +.icon-upload { + background-position: -144px -24px; +} + +.icon-inbox { + background-position: -168px -24px; +} + +.icon-play-circle { + background-position: -192px -24px; +} + +.icon-repeat { + background-position: -216px -24px; +} + +.icon-refresh { + background-position: -240px -24px; +} + +.icon-list-alt { + background-position: -264px -24px; +} + +.icon-lock { + background-position: -287px -24px; +} + +.icon-flag { + background-position: -312px -24px; +} + +.icon-headphones { + background-position: -336px -24px; +} + +.icon-volume-off { + background-position: -360px -24px; +} + +.icon-volume-down { + background-position: -384px -24px; +} + +.icon-volume-up { + background-position: -408px -24px; +} + +.icon-qrcode { + background-position: -432px -24px; +} + +.icon-barcode { + background-position: -456px -24px; +} + +.icon-tag { + background-position: 0 -48px; +} + +.icon-tags { + background-position: -25px -48px; +} + +.icon-book { + background-position: -48px -48px; +} + +.icon-bookmark { + background-position: -72px -48px; +} + +.icon-print { + background-position: -96px -48px; +} + +.icon-camera { + background-position: -120px -48px; +} + +.icon-font { + background-position: -144px -48px; +} + +.icon-bold { + background-position: -167px -48px; +} + +.icon-italic { + background-position: -192px -48px; +} + +.icon-text-height { + background-position: -216px -48px; +} + +.icon-text-width { + background-position: -240px -48px; +} + +.icon-align-left { + background-position: -264px -48px; +} + +.icon-align-center { + background-position: -288px -48px; +} + +.icon-align-right { + background-position: -312px -48px; +} + +.icon-align-justify { + background-position: -336px -48px; +} + +.icon-list { + background-position: -360px -48px; +} + +.icon-indent-left { + background-position: -384px -48px; +} + +.icon-indent-right { + background-position: -408px -48px; +} + +.icon-facetime-video { + background-position: -432px -48px; +} + +.icon-picture { + background-position: -456px -48px; +} + +.icon-pencil { + background-position: 0 -72px; +} + +.icon-map-marker { + background-position: -24px -72px; +} + +.icon-adjust { + background-position: -48px -72px; +} + +.icon-tint { + background-position: -72px -72px; +} + +.icon-edit { + background-position: -96px -72px; +} + +.icon-share { + background-position: -120px -72px; +} + +.icon-check { + background-position: -144px -72px; +} + +.icon-move { + background-position: -168px -72px; +} + +.icon-step-backward { + background-position: -192px -72px; +} + +.icon-fast-backward { + background-position: -216px -72px; +} + +.icon-backward { + background-position: -240px -72px; +} + +.icon-play { + background-position: -264px -72px; +} + +.icon-pause { + background-position: -288px -72px; +} + +.icon-stop { + background-position: -312px -72px; +} + +.icon-forward { + background-position: -336px -72px; +} + +.icon-fast-forward { + background-position: -360px -72px; +} + +.icon-step-forward { + background-position: -384px -72px; +} + +.icon-eject { + background-position: -408px -72px; +} + +.icon-chevron-left { + background-position: -432px -72px; +} + +.icon-chevron-right { + background-position: -456px -72px; +} + +.icon-plus-sign { + background-position: 0 -96px; +} + +.icon-minus-sign { + background-position: -24px -96px; +} + +.icon-remove-sign { + background-position: -48px -96px; +} + +.icon-ok-sign { + background-position: -72px -96px; +} + +.icon-question-sign { + background-position: -96px -96px; +} + +.icon-info-sign { + background-position: -120px -96px; +} + +.icon-screenshot { + background-position: -144px -96px; +} + +.icon-remove-circle { + background-position: -168px -96px; +} + +.icon-ok-circle { + background-position: -192px -96px; +} + +.icon-ban-circle { + background-position: -216px -96px; +} + +.icon-arrow-left { + background-position: -240px -96px; +} + +.icon-arrow-right { + background-position: -264px -96px; +} + +.icon-arrow-up { + background-position: -289px -96px; +} + +.icon-arrow-down { + background-position: -312px -96px; +} + +.icon-share-alt { + background-position: -336px -96px; +} + +.icon-resize-full { + background-position: -360px -96px; +} + +.icon-resize-small { + background-position: -384px -96px; +} + +.icon-plus { + background-position: -408px -96px; +} + +.icon-minus { + background-position: -433px -96px; +} + +.icon-asterisk { + background-position: -456px -96px; +} + +.icon-exclamation-sign { + background-position: 0 -120px; +} + +.icon-gift { + background-position: -24px -120px; +} + +.icon-leaf { + background-position: -48px -120px; +} + +.icon-fire { + background-position: -72px -120px; +} + +.icon-eye-open { + background-position: -96px -120px; +} + +.icon-eye-close { + background-position: -120px -120px; +} + +.icon-warning-sign { + background-position: -144px -120px; +} + +.icon-plane { + background-position: -168px -120px; +} + +.icon-calendar { + background-position: -192px -120px; +} + +.icon-random { + width: 16px; + background-position: -216px -120px; +} + +.icon-comment { + background-position: -240px -120px; +} + +.icon-magnet { + background-position: -264px -120px; +} + +.icon-chevron-up { + background-position: -288px -120px; +} + +.icon-chevron-down { + background-position: -313px -119px; +} + +.icon-retweet { + background-position: -336px -120px; +} + +.icon-shopping-cart { + background-position: -360px -120px; +} + +.icon-folder-close { + width: 16px; + background-position: -384px -120px; +} + +.icon-folder-open { + width: 16px; + background-position: -408px -120px; +} + +.icon-resize-vertical { + background-position: -432px -119px; +} + +.icon-resize-horizontal { + background-position: -456px -118px; +} + +.icon-hdd { + background-position: 0 -144px; +} + +.icon-bullhorn { + background-position: -24px -144px; +} + +.icon-bell { + background-position: -48px -144px; +} + +.icon-certificate { + background-position: -72px -144px; +} + +.icon-thumbs-up { + background-position: -96px -144px; +} + +.icon-thumbs-down { + background-position: -120px -144px; +} + +.icon-hand-right { + background-position: -144px -144px; +} + +.icon-hand-left { + background-position: -168px -144px; +} + +.icon-hand-up { + background-position: -192px -144px; +} + +.icon-hand-down { + background-position: -216px -144px; +} + +.icon-circle-arrow-right { + background-position: -240px -144px; +} + +.icon-circle-arrow-left { + background-position: -264px -144px; +} + +.icon-circle-arrow-up { + background-position: -288px -144px; +} + +.icon-circle-arrow-down { + background-position: -312px -144px; +} + +.icon-globe { + background-position: -336px -144px; +} + +.icon-wrench { + background-position: -360px -144px; +} + +.icon-tasks { + background-position: -384px -144px; +} + +.icon-filter { + background-position: -408px -144px; +} + +.icon-briefcase { + background-position: -432px -144px; +} + +.icon-fullscreen { + background-position: -456px -144px; +} + +.dropup, +.dropdown { + position: relative; +} + +.dropdown-toggle { + *margin-bottom: -3px; +} + +.dropdown-toggle:active, +.open .dropdown-toggle { + outline: 0; +} + +.caret { + display: inline-block; + width: 0; + height: 0; + vertical-align: top; + border-top: 4px solid #000000; + border-right: 4px solid transparent; + border-left: 4px solid transparent; + content: ""; +} + +.dropdown .caret { + margin-top: 8px; + margin-left: 2px; +} + +.dropdown-menu { + position: absolute; + top: 100%; + left: 0; + z-index: 1000; + display: none; + float: left; + min-width: 160px; + padding: 5px 0; + margin: 2px 0 0; + list-style: none; + background-color: #ffffff; + border: 1px solid #ccc; + border: 1px solid rgba(0, 0, 0, 0.2); + *border-right-width: 2px; + *border-bottom-width: 2px; + -webkit-border-radius: 6px; + -moz-border-radius: 6px; + border-radius: 6px; + -webkit-box-shadow: 0 5px 10px rgba(0, 0, 0, 0.2); + -moz-box-shadow: 0 5px 10px rgba(0, 0, 0, 0.2); + box-shadow: 0 5px 10px rgba(0, 0, 0, 0.2); + -webkit-background-clip: padding-box; + -moz-background-clip: padding; + background-clip: padding-box; +} + +.dropdown-menu.pull-right { + right: 0; + left: auto; +} + +.dropdown-menu .divider { + *width: 100%; + height: 1px; + margin: 9px 1px; + *margin: -5px 0 5px; + overflow: hidden; + background-color: #e5e5e5; + border-bottom: 1px solid #ffffff; +} + +.dropdown-menu > li > a { + display: block; + padding: 3px 20px; + clear: both; + font-weight: normal; + line-height: 20px; + color: #333333; + white-space: nowrap; +} + +.dropdown-menu > li > a:hover, +.dropdown-menu > li > a:focus, +.dropdown-submenu:hover > a, +.dropdown-submenu:focus > a { + color: #ffffff; + text-decoration: none; + background-color: #0081c2; + background-image: -moz-linear-gradient(top, #0088cc, #0077b3); + background-image: -webkit-gradient(linear, 0 0, 0 100%, from(#0088cc), to(#0077b3)); + background-image: -webkit-linear-gradient(top, #0088cc, #0077b3); + background-image: -o-linear-gradient(top, #0088cc, #0077b3); + background-image: linear-gradient(to bottom, #0088cc, #0077b3); + background-repeat: repeat-x; + filter: progid:DXImageTransform.Microsoft.gradient(startColorstr='#ff0088cc', endColorstr='#ff0077b3', GradientType=0); +} + +.dropdown-menu > .active > a, +.dropdown-menu > .active > a:hover, +.dropdown-menu > .active > a:focus { + color: #ffffff; + text-decoration: none; + background-color: #0081c2; + background-image: -moz-linear-gradient(top, #0088cc, #0077b3); + background-image: -webkit-gradient(linear, 0 0, 0 100%, from(#0088cc), to(#0077b3)); + background-image: -webkit-linear-gradient(top, #0088cc, #0077b3); + background-image: -o-linear-gradient(top, #0088cc, #0077b3); + background-image: linear-gradient(to bottom, #0088cc, #0077b3); + background-repeat: repeat-x; + outline: 0; + filter: progid:DXImageTransform.Microsoft.gradient(startColorstr='#ff0088cc', endColorstr='#ff0077b3', GradientType=0); +} + +.dropdown-menu > .disabled > a, +.dropdown-menu > .disabled > a:hover, +.dropdown-menu > .disabled > a:focus { + color: #999999; +} + +.dropdown-menu > .disabled > a:hover, +.dropdown-menu > .disabled > a:focus { + text-decoration: none; + cursor: default; + background-color: transparent; + background-image: none; + filter: progid:DXImageTransform.Microsoft.gradient(enabled=false); +} + +.open { + *z-index: 1000; +} + +.open > .dropdown-menu { + display: block; +} + +.dropdown-backdrop { + position: fixed; + top: 0; + right: 0; + bottom: 0; + left: 0; + z-index: 990; +} + +.pull-right > .dropdown-menu { + right: 0; + left: auto; +} + +.dropup .caret, +.navbar-fixed-bottom .dropdown .caret { + border-top: 0; + border-bottom: 4px solid #000000; + content: ""; +} + +.dropup .dropdown-menu, +.navbar-fixed-bottom .dropdown .dropdown-menu { + top: auto; + bottom: 100%; + margin-bottom: 1px; +} + +.dropdown-submenu { + position: relative; +} + +.dropdown-submenu > .dropdown-menu { + top: 0; + left: 100%; + margin-top: -6px; + margin-left: -1px; + -webkit-border-radius: 0 6px 6px 6px; + -moz-border-radius: 0 6px 6px 6px; + border-radius: 0 6px 6px 6px; +} + +.dropdown-submenu:hover > .dropdown-menu { + display: block; +} + +.dropup .dropdown-submenu > .dropdown-menu { + top: auto; + bottom: 0; + margin-top: 0; + margin-bottom: -2px; + -webkit-border-radius: 5px 5px 5px 0; + -moz-border-radius: 5px 5px 5px 0; + border-radius: 5px 5px 5px 0; +} + +.dropdown-submenu > a:after { + display: block; + float: right; + width: 0; + height: 0; + margin-top: 5px; + margin-right: -10px; + border-color: transparent; + border-left-color: #cccccc; + border-style: solid; + border-width: 5px 0 5px 5px; + content: " "; +} + +.dropdown-submenu:hover > a:after { + border-left-color: #ffffff; +} + +.dropdown-submenu.pull-left { + float: none; +} + +.dropdown-submenu.pull-left > .dropdown-menu { + left: -100%; + margin-left: 10px; + -webkit-border-radius: 6px 0 6px 6px; + -moz-border-radius: 6px 0 6px 6px; + border-radius: 6px 0 6px 6px; +} + +.dropdown .dropdown-menu .nav-header { + padding-right: 20px; + padding-left: 20px; +} + +.typeahead { + z-index: 1051; + margin-top: 2px; + -webkit-border-radius: 4px; + -moz-border-radius: 4px; + border-radius: 4px; +} + +.well { + min-height: 20px; + padding: 19px; + margin-bottom: 20px; + background-color: #f5f5f5; + border: 1px solid #e3e3e3; + -webkit-border-radius: 4px; + -moz-border-radius: 4px; + border-radius: 4px; + -webkit-box-shadow: inset 0 1px 1px rgba(0, 0, 0, 0.05); + -moz-box-shadow: inset 0 1px 1px rgba(0, 0, 0, 0.05); + box-shadow: inset 0 1px 1px rgba(0, 0, 0, 0.05); +} + +.well blockquote { + border-color: #ddd; + border-color: rgba(0, 0, 0, 0.15); +} + +.well-large { + padding: 24px; + -webkit-border-radius: 6px; + -moz-border-radius: 6px; + border-radius: 6px; +} + +.well-small { + padding: 9px; + -webkit-border-radius: 3px; + -moz-border-radius: 3px; + border-radius: 3px; +} + +.fade { + opacity: 0; + -webkit-transition: opacity 0.15s linear; + -moz-transition: opacity 0.15s linear; + -o-transition: opacity 0.15s linear; + transition: opacity 0.15s linear; +} + +.fade.in { + opacity: 1; +} + +.collapse { + position: relative; + height: 0; + overflow: hidden; + -webkit-transition: height 0.35s ease; + -moz-transition: height 0.35s ease; + -o-transition: height 0.35s ease; + transition: height 0.35s ease; +} + +.collapse.in { + height: auto; +} + +.close { + float: right; + font-size: 20px; + font-weight: bold; + line-height: 20px; + color: #000000; + text-shadow: 0 1px 0 #ffffff; + opacity: 0.2; + filter: alpha(opacity=20); +} + +.close:hover, +.close:focus { + color: #000000; + text-decoration: none; + cursor: pointer; + opacity: 0.4; + filter: alpha(opacity=40); +} + +button.close { + padding: 0; + cursor: pointer; + background: transparent; + border: 0; + -webkit-appearance: none; +} + +.btn { + display: inline-block; + *display: inline; + padding: 4px 12px; + margin-bottom: 0; + *margin-left: .3em; + font-size: 14px; + line-height: 20px; + color: #333333; + text-align: center; + text-shadow: 0 1px 1px rgba(255, 255, 255, 0.75); + vertical-align: middle; + cursor: pointer; + background-color: #f5f5f5; + *background-color: #e6e6e6; + background-image: -moz-linear-gradient(top, #ffffff, #e6e6e6); + background-image: -webkit-gradient(linear, 0 0, 0 100%, from(#ffffff), to(#e6e6e6)); + background-image: -webkit-linear-gradient(top, #ffffff, #e6e6e6); + background-image: -o-linear-gradient(top, #ffffff, #e6e6e6); + background-image: linear-gradient(to bottom, #ffffff, #e6e6e6); + background-repeat: repeat-x; + border: 1px solid #cccccc; + *border: 0; + border-color: #e6e6e6 #e6e6e6 #bfbfbf; + border-color: rgba(0, 0, 0, 0.1) rgba(0, 0, 0, 0.1) rgba(0, 0, 0, 0.25); + border-bottom-color: #b3b3b3; + -webkit-border-radius: 4px; + -moz-border-radius: 4px; + border-radius: 4px; + filter: progid:DXImageTransform.Microsoft.gradient(startColorstr='#ffffffff', endColorstr='#ffe6e6e6', GradientType=0); + filter: progid:DXImageTransform.Microsoft.gradient(enabled=false); + *zoom: 1; + -webkit-box-shadow: inset 0 1px 0 rgba(255, 255, 255, 0.2), 0 1px 2px rgba(0, 0, 0, 0.05); + -moz-box-shadow: inset 0 1px 0 rgba(255, 255, 255, 0.2), 0 1px 2px rgba(0, 0, 0, 0.05); + box-shadow: inset 0 1px 0 rgba(255, 255, 255, 0.2), 0 1px 2px rgba(0, 0, 0, 0.05); +} + +.btn:hover, +.btn:focus, +.btn:active, +.btn.active, +.btn.disabled, +.btn[disabled] { + color: #333333; + background-color: #e6e6e6; + *background-color: #d9d9d9; +} + +.btn:active, +.btn.active { + background-color: #cccccc \9; +} + +.btn:first-child { + *margin-left: 0; +} + +.btn:hover, +.btn:focus { + color: #333333; + text-decoration: none; + background-position: 0 -15px; + -webkit-transition: background-position 0.1s linear; + -moz-transition: background-position 0.1s linear; + -o-transition: background-position 0.1s linear; + transition: background-position 0.1s linear; +} + +.btn:focus { + outline: thin dotted #333; + outline: 5px auto -webkit-focus-ring-color; + outline-offset: -2px; +} + +.btn.active, +.btn:active { + background-image: none; + outline: 0; + -webkit-box-shadow: inset 0 2px 4px rgba(0, 0, 0, 0.15), 0 1px 2px rgba(0, 0, 0, 0.05); + -moz-box-shadow: inset 0 2px 4px rgba(0, 0, 0, 0.15), 0 1px 2px rgba(0, 0, 0, 0.05); + box-shadow: inset 0 2px 4px rgba(0, 0, 0, 0.15), 0 1px 2px rgba(0, 0, 0, 0.05); +} + +.btn.disabled, +.btn[disabled] { + cursor: default; + background-image: none; + opacity: 0.65; + filter: alpha(opacity=65); + -webkit-box-shadow: none; + -moz-box-shadow: none; + box-shadow: none; +} + +.btn-large { + padding: 11px 19px; + font-size: 17.5px; + -webkit-border-radius: 6px; + -moz-border-radius: 6px; + border-radius: 6px; +} + +.btn-large [class^="icon-"], +.btn-large [class*=" icon-"] { + margin-top: 4px; +} + +.btn-small { + padding: 2px 10px; + font-size: 11.9px; + -webkit-border-radius: 3px; + -moz-border-radius: 3px; + border-radius: 3px; +} + +.btn-small [class^="icon-"], +.btn-small [class*=" icon-"] { + margin-top: 0; +} + +.btn-mini [class^="icon-"], +.btn-mini [class*=" icon-"] { + margin-top: -1px; +} + +.btn-mini { + padding: 0 6px; + font-size: 10.5px; + -webkit-border-radius: 3px; + -moz-border-radius: 3px; + border-radius: 3px; +} + +.btn-block { + display: block; + width: 100%; + padding-right: 0; + padding-left: 0; + -webkit-box-sizing: border-box; + -moz-box-sizing: border-box; + box-sizing: border-box; +} + +.btn-block + .btn-block { + margin-top: 5px; +} + +input[type="submit"].btn-block, +input[type="reset"].btn-block, +input[type="button"].btn-block { + width: 100%; +} + +.btn-primary.active, +.btn-warning.active, +.btn-danger.active, +.btn-success.active, +.btn-info.active, +.btn-inverse.active { + color: rgba(255, 255, 255, 0.75); +} + +.btn-primary { + color: #ffffff; + text-shadow: 0 -1px 0 rgba(0, 0, 0, 0.25); + background-color: #006dcc; + *background-color: #0044cc; + background-image: -moz-linear-gradient(top, #0088cc, #0044cc); + background-image: -webkit-gradient(linear, 0 0, 0 100%, from(#0088cc), to(#0044cc)); + background-image: -webkit-linear-gradient(top, #0088cc, #0044cc); + background-image: -o-linear-gradient(top, #0088cc, #0044cc); + background-image: linear-gradient(to bottom, #0088cc, #0044cc); + background-repeat: repeat-x; + border-color: #0044cc #0044cc #002a80; + border-color: rgba(0, 0, 0, 0.1) rgba(0, 0, 0, 0.1) rgba(0, 0, 0, 0.25); + filter: progid:DXImageTransform.Microsoft.gradient(startColorstr='#ff0088cc', endColorstr='#ff0044cc', GradientType=0); + filter: progid:DXImageTransform.Microsoft.gradient(enabled=false); +} + +.btn-primary:hover, +.btn-primary:focus, +.btn-primary:active, +.btn-primary.active, +.btn-primary.disabled, +.btn-primary[disabled] { + color: #ffffff; + background-color: #0044cc; + *background-color: #003bb3; +} + +.btn-primary:active, +.btn-primary.active { + background-color: #003399 \9; +} + +.btn-warning { + color: #ffffff; + text-shadow: 0 -1px 0 rgba(0, 0, 0, 0.25); + background-color: #faa732; + *background-color: #f89406; + background-image: -moz-linear-gradient(top, #fbb450, #f89406); + background-image: -webkit-gradient(linear, 0 0, 0 100%, from(#fbb450), to(#f89406)); + background-image: -webkit-linear-gradient(top, #fbb450, #f89406); + background-image: -o-linear-gradient(top, #fbb450, #f89406); + background-image: linear-gradient(to bottom, #fbb450, #f89406); + background-repeat: repeat-x; + border-color: #f89406 #f89406 #ad6704; + border-color: rgba(0, 0, 0, 0.1) rgba(0, 0, 0, 0.1) rgba(0, 0, 0, 0.25); + filter: progid:DXImageTransform.Microsoft.gradient(startColorstr='#fffbb450', endColorstr='#fff89406', GradientType=0); + filter: progid:DXImageTransform.Microsoft.gradient(enabled=false); +} + +.btn-warning:hover, +.btn-warning:focus, +.btn-warning:active, +.btn-warning.active, +.btn-warning.disabled, +.btn-warning[disabled] { + color: #ffffff; + background-color: #f89406; + *background-color: #df8505; +} + +.btn-warning:active, +.btn-warning.active { + background-color: #c67605 \9; +} + +.btn-danger { + color: #ffffff; + text-shadow: 0 -1px 0 rgba(0, 0, 0, 0.25); + background-color: #da4f49; + *background-color: #bd362f; + background-image: -moz-linear-gradient(top, #ee5f5b, #bd362f); + background-image: -webkit-gradient(linear, 0 0, 0 100%, from(#ee5f5b), to(#bd362f)); + background-image: -webkit-linear-gradient(top, #ee5f5b, #bd362f); + background-image: -o-linear-gradient(top, #ee5f5b, #bd362f); + background-image: linear-gradient(to bottom, #ee5f5b, #bd362f); + background-repeat: repeat-x; + border-color: #bd362f #bd362f #802420; + border-color: rgba(0, 0, 0, 0.1) rgba(0, 0, 0, 0.1) rgba(0, 0, 0, 0.25); + filter: progid:DXImageTransform.Microsoft.gradient(startColorstr='#ffee5f5b', endColorstr='#ffbd362f', GradientType=0); + filter: progid:DXImageTransform.Microsoft.gradient(enabled=false); +} + +.btn-danger:hover, +.btn-danger:focus, +.btn-danger:active, +.btn-danger.active, +.btn-danger.disabled, +.btn-danger[disabled] { + color: #ffffff; + background-color: #bd362f; + *background-color: #a9302a; +} + +.btn-danger:active, +.btn-danger.active { + background-color: #942a25 \9; +} + +.btn-success { + color: #ffffff; + text-shadow: 0 -1px 0 rgba(0, 0, 0, 0.25); + background-color: #5bb75b; + *background-color: #51a351; + background-image: -moz-linear-gradient(top, #62c462, #51a351); + background-image: -webkit-gradient(linear, 0 0, 0 100%, from(#62c462), to(#51a351)); + background-image: -webkit-linear-gradient(top, #62c462, #51a351); + background-image: -o-linear-gradient(top, #62c462, #51a351); + background-image: linear-gradient(to bottom, #62c462, #51a351); + background-repeat: repeat-x; + border-color: #51a351 #51a351 #387038; + border-color: rgba(0, 0, 0, 0.1) rgba(0, 0, 0, 0.1) rgba(0, 0, 0, 0.25); + filter: progid:DXImageTransform.Microsoft.gradient(startColorstr='#ff62c462', endColorstr='#ff51a351', GradientType=0); + filter: progid:DXImageTransform.Microsoft.gradient(enabled=false); +} + +.btn-success:hover, +.btn-success:focus, +.btn-success:active, +.btn-success.active, +.btn-success.disabled, +.btn-success[disabled] { + color: #ffffff; + background-color: #51a351; + *background-color: #499249; +} + +.btn-success:active, +.btn-success.active { + background-color: #408140 \9; +} + +.btn-info { + color: #ffffff; + text-shadow: 0 -1px 0 rgba(0, 0, 0, 0.25); + background-color: #49afcd; + *background-color: #2f96b4; + background-image: -moz-linear-gradient(top, #5bc0de, #2f96b4); + background-image: -webkit-gradient(linear, 0 0, 0 100%, from(#5bc0de), to(#2f96b4)); + background-image: -webkit-linear-gradient(top, #5bc0de, #2f96b4); + background-image: -o-linear-gradient(top, #5bc0de, #2f96b4); + background-image: linear-gradient(to bottom, #5bc0de, #2f96b4); + background-repeat: repeat-x; + border-color: #2f96b4 #2f96b4 #1f6377; + border-color: rgba(0, 0, 0, 0.1) rgba(0, 0, 0, 0.1) rgba(0, 0, 0, 0.25); + filter: progid:DXImageTransform.Microsoft.gradient(startColorstr='#ff5bc0de', endColorstr='#ff2f96b4', GradientType=0); + filter: progid:DXImageTransform.Microsoft.gradient(enabled=false); +} + +.btn-info:hover, +.btn-info:focus, +.btn-info:active, +.btn-info.active, +.btn-info.disabled, +.btn-info[disabled] { + color: #ffffff; + background-color: #2f96b4; + *background-color: #2a85a0; +} + +.btn-info:active, +.btn-info.active { + background-color: #24748c \9; +} + +.btn-inverse { + color: #ffffff; + text-shadow: 0 -1px 0 rgba(0, 0, 0, 0.25); + background-color: #363636; + *background-color: #222222; + background-image: -moz-linear-gradient(top, #444444, #222222); + background-image: -webkit-gradient(linear, 0 0, 0 100%, from(#444444), to(#222222)); + background-image: -webkit-linear-gradient(top, #444444, #222222); + background-image: -o-linear-gradient(top, #444444, #222222); + background-image: linear-gradient(to bottom, #444444, #222222); + background-repeat: repeat-x; + border-color: #222222 #222222 #000000; + border-color: rgba(0, 0, 0, 0.1) rgba(0, 0, 0, 0.1) rgba(0, 0, 0, 0.25); + filter: progid:DXImageTransform.Microsoft.gradient(startColorstr='#ff444444', endColorstr='#ff222222', GradientType=0); + filter: progid:DXImageTransform.Microsoft.gradient(enabled=false); +} + +.btn-inverse:hover, +.btn-inverse:focus, +.btn-inverse:active, +.btn-inverse.active, +.btn-inverse.disabled, +.btn-inverse[disabled] { + color: #ffffff; + background-color: #222222; + *background-color: #151515; +} + +.btn-inverse:active, +.btn-inverse.active { + background-color: #080808 \9; +} + +button.btn, +input[type="submit"].btn { + *padding-top: 3px; + *padding-bottom: 3px; +} + +button.btn::-moz-focus-inner, +input[type="submit"].btn::-moz-focus-inner { + padding: 0; + border: 0; +} + +button.btn.btn-large, +input[type="submit"].btn.btn-large { + *padding-top: 7px; + *padding-bottom: 7px; +} + +button.btn.btn-small, +input[type="submit"].btn.btn-small { + *padding-top: 3px; + *padding-bottom: 3px; +} + +button.btn.btn-mini, +input[type="submit"].btn.btn-mini { + *padding-top: 1px; + *padding-bottom: 1px; +} + +.btn-link, +.btn-link:active, +.btn-link[disabled] { + background-color: transparent; + background-image: none; + -webkit-box-shadow: none; + -moz-box-shadow: none; + box-shadow: none; +} + +.btn-link { + color: #0088cc; + cursor: pointer; + border-color: transparent; + -webkit-border-radius: 0; + -moz-border-radius: 0; + border-radius: 0; +} + +.btn-link:hover, +.btn-link:focus { + color: #005580; + text-decoration: underline; + background-color: transparent; +} + +.btn-link[disabled]:hover, +.btn-link[disabled]:focus { + color: #333333; + text-decoration: none; +} + +.btn-group { + position: relative; + display: inline-block; + *display: inline; + *margin-left: .3em; + font-size: 0; + white-space: nowrap; + vertical-align: middle; + *zoom: 1; +} + +.btn-group:first-child { + *margin-left: 0; +} + +.btn-group + .btn-group { + margin-left: 5px; +} + +.btn-toolbar { + margin-top: 10px; + margin-bottom: 10px; + font-size: 0; +} + +.btn-toolbar > .btn + .btn, +.btn-toolbar > .btn-group + .btn, +.btn-toolbar > .btn + .btn-group { + margin-left: 5px; +} + +.btn-group > .btn { + position: relative; + -webkit-border-radius: 0; + -moz-border-radius: 0; + border-radius: 0; +} + +.btn-group > .btn + .btn { + margin-left: -1px; +} + +.btn-group > .btn, +.btn-group > .dropdown-menu, +.btn-group > .popover { + font-size: 14px; +} + +.btn-group > .btn-mini { + font-size: 10.5px; +} + +.btn-group > .btn-small { + font-size: 11.9px; +} + +.btn-group > .btn-large { + font-size: 17.5px; +} + +.btn-group > .btn:first-child { + margin-left: 0; + -webkit-border-bottom-left-radius: 4px; + border-bottom-left-radius: 4px; + -webkit-border-top-left-radius: 4px; + border-top-left-radius: 4px; + -moz-border-radius-bottomleft: 4px; + -moz-border-radius-topleft: 4px; +} + +.btn-group > .btn:last-child, +.btn-group > .dropdown-toggle { + -webkit-border-top-right-radius: 4px; + border-top-right-radius: 4px; + -webkit-border-bottom-right-radius: 4px; + border-bottom-right-radius: 4px; + -moz-border-radius-topright: 4px; + -moz-border-radius-bottomright: 4px; +} + +.btn-group > .btn.large:first-child { + margin-left: 0; + -webkit-border-bottom-left-radius: 6px; + border-bottom-left-radius: 6px; + -webkit-border-top-left-radius: 6px; + border-top-left-radius: 6px; + -moz-border-radius-bottomleft: 6px; + -moz-border-radius-topleft: 6px; +} + +.btn-group > .btn.large:last-child, +.btn-group > .large.dropdown-toggle { + -webkit-border-top-right-radius: 6px; + border-top-right-radius: 6px; + -webkit-border-bottom-right-radius: 6px; + border-bottom-right-radius: 6px; + -moz-border-radius-topright: 6px; + -moz-border-radius-bottomright: 6px; +} + +.btn-group > .btn:hover, +.btn-group > .btn:focus, +.btn-group > .btn:active, +.btn-group > .btn.active { + z-index: 2; +} + +.btn-group .dropdown-toggle:active, +.btn-group.open .dropdown-toggle { + outline: 0; +} + +.btn-group > .btn + .dropdown-toggle { + *padding-top: 5px; + padding-right: 8px; + *padding-bottom: 5px; + padding-left: 8px; + -webkit-box-shadow: inset 1px 0 0 rgba(255, 255, 255, 0.125), inset 0 1px 0 rgba(255, 255, 255, 0.2), 0 1px 2px rgba(0, 0, 0, 0.05); + -moz-box-shadow: inset 1px 0 0 rgba(255, 255, 255, 0.125), inset 0 1px 0 rgba(255, 255, 255, 0.2), 0 1px 2px rgba(0, 0, 0, 0.05); + box-shadow: inset 1px 0 0 rgba(255, 255, 255, 0.125), inset 0 1px 0 rgba(255, 255, 255, 0.2), 0 1px 2px rgba(0, 0, 0, 0.05); +} + +.btn-group > .btn-mini + .dropdown-toggle { + *padding-top: 2px; + padding-right: 5px; + *padding-bottom: 2px; + padding-left: 5px; +} + +.btn-group > .btn-small + .dropdown-toggle { + *padding-top: 5px; + *padding-bottom: 4px; +} + +.btn-group > .btn-large + .dropdown-toggle { + *padding-top: 7px; + padding-right: 12px; + *padding-bottom: 7px; + padding-left: 12px; +} + +.btn-group.open .dropdown-toggle { + background-image: none; + -webkit-box-shadow: inset 0 2px 4px rgba(0, 0, 0, 0.15), 0 1px 2px rgba(0, 0, 0, 0.05); + -moz-box-shadow: inset 0 2px 4px rgba(0, 0, 0, 0.15), 0 1px 2px rgba(0, 0, 0, 0.05); + box-shadow: inset 0 2px 4px rgba(0, 0, 0, 0.15), 0 1px 2px rgba(0, 0, 0, 0.05); +} + +.btn-group.open .btn.dropdown-toggle { + background-color: #e6e6e6; +} + +.btn-group.open .btn-primary.dropdown-toggle { + background-color: #0044cc; +} + +.btn-group.open .btn-warning.dropdown-toggle { + background-color: #f89406; +} + +.btn-group.open .btn-danger.dropdown-toggle { + background-color: #bd362f; +} + +.btn-group.open .btn-success.dropdown-toggle { + background-color: #51a351; +} + +.btn-group.open .btn-info.dropdown-toggle { + background-color: #2f96b4; +} + +.btn-group.open .btn-inverse.dropdown-toggle { + background-color: #222222; +} + +.btn .caret { + margin-top: 8px; + margin-left: 0; +} + +.btn-large .caret { + margin-top: 6px; +} + +.btn-large .caret { + border-top-width: 5px; + border-right-width: 5px; + border-left-width: 5px; +} + +.btn-mini .caret, +.btn-small .caret { + margin-top: 8px; +} + +.dropup .btn-large .caret { + border-bottom-width: 5px; +} + +.btn-primary .caret, +.btn-warning .caret, +.btn-danger .caret, +.btn-info .caret, +.btn-success .caret, +.btn-inverse .caret { + border-top-color: #ffffff; + border-bottom-color: #ffffff; +} + +.btn-group-vertical { + display: inline-block; + *display: inline; + /* IE7 inline-block hack */ + + *zoom: 1; +} + +.btn-group-vertical > .btn { + display: block; + float: none; + max-width: 100%; + -webkit-border-radius: 0; + -moz-border-radius: 0; + border-radius: 0; +} + +.btn-group-vertical > .btn + .btn { + margin-top: -1px; + margin-left: 0; +} + +.btn-group-vertical > .btn:first-child { + -webkit-border-radius: 4px 4px 0 0; + -moz-border-radius: 4px 4px 0 0; + border-radius: 4px 4px 0 0; +} + +.btn-group-vertical > .btn:last-child { + -webkit-border-radius: 0 0 4px 4px; + -moz-border-radius: 0 0 4px 4px; + border-radius: 0 0 4px 4px; +} + +.btn-group-vertical > .btn-large:first-child { + -webkit-border-radius: 6px 6px 0 0; + -moz-border-radius: 6px 6px 0 0; + border-radius: 6px 6px 0 0; +} + +.btn-group-vertical > .btn-large:last-child { + -webkit-border-radius: 0 0 6px 6px; + -moz-border-radius: 0 0 6px 6px; + border-radius: 0 0 6px 6px; +} + +.alert { + padding: 8px 35px 8px 14px; + margin-bottom: 20px; + text-shadow: 0 1px 0 rgba(255, 255, 255, 0.5); + background-color: #fcf8e3; + border: 1px solid #fbeed5; + -webkit-border-radius: 4px; + -moz-border-radius: 4px; + border-radius: 4px; +} + +.alert, +.alert h4 { + color: #c09853; +} + +.alert h4 { + margin: 0; +} + +.alert .close { + position: relative; + top: -2px; + right: -21px; + line-height: 20px; +} + +.alert-success { + color: #468847; + background-color: #dff0d8; + border-color: #d6e9c6; +} + +.alert-success h4 { + color: #468847; +} + +.alert-danger, +.alert-error { + color: #b94a48; + background-color: #f2dede; + border-color: #eed3d7; +} + +.alert-danger h4, +.alert-error h4 { + color: #b94a48; +} + +.alert-info { + color: #3a87ad; + background-color: #d9edf7; + border-color: #bce8f1; +} + +.alert-info h4 { + color: #3a87ad; +} + +.alert-block { + padding-top: 14px; + padding-bottom: 14px; +} + +.alert-block > p, +.alert-block > ul { + margin-bottom: 0; +} + +.alert-block p + p { + margin-top: 5px; +} + +.nav { + margin-bottom: 20px; + margin-left: 0; + list-style: none; +} + +.nav > li > a { + display: block; +} + +.nav > li > a:hover, +.nav > li > a:focus { + text-decoration: none; + background-color: #eeeeee; +} + +.nav > li > a > img { + max-width: none; +} + +.nav > .pull-right { + float: right; +} + +.nav-header { + display: block; + padding: 3px 15px; + font-size: 11px; + font-weight: bold; + line-height: 20px; + color: #999999; + text-shadow: 0 1px 0 rgba(255, 255, 255, 0.5); + text-transform: uppercase; +} + +.nav li + .nav-header { + margin-top: 9px; +} + +.nav-list { + padding-right: 15px; + padding-left: 15px; + margin-bottom: 0; +} + +.nav-list > li > a, +.nav-list .nav-header { + margin-right: -15px; + margin-left: -15px; + text-shadow: 0 1px 0 rgba(255, 255, 255, 0.5); +} + +.nav-list > li > a { + padding: 3px 15px; +} + +.nav-list > .active > a, +.nav-list > .active > a:hover, +.nav-list > .active > a:focus { + color: #ffffff; + text-shadow: 0 -1px 0 rgba(0, 0, 0, 0.2); + background-color: #0088cc; +} + +.nav-list [class^="icon-"], +.nav-list [class*=" icon-"] { + margin-right: 2px; +} + +.nav-list .divider { + *width: 100%; + height: 1px; + margin: 9px 1px; + *margin: -5px 0 5px; + overflow: hidden; + background-color: #e5e5e5; + border-bottom: 1px solid #ffffff; +} + +.nav-tabs, +.nav-pills { + *zoom: 1; +} + +.nav-tabs:before, +.nav-pills:before, +.nav-tabs:after, +.nav-pills:after { + display: table; + line-height: 0; + content: ""; +} + +.nav-tabs:after, +.nav-pills:after { + clear: both; +} + +.nav-tabs > li, +.nav-pills > li { + float: left; +} + +.nav-tabs > li > a, +.nav-pills > li > a { + padding-right: 12px; + padding-left: 12px; + margin-right: 2px; + line-height: 14px; +} + +.nav-tabs { + border-bottom: 1px solid #ddd; +} + +.nav-tabs > li { + margin-bottom: -1px; +} + +.nav-tabs > li > a { + padding-top: 8px; + padding-bottom: 8px; + line-height: 20px; + border: 1px solid transparent; + -webkit-border-radius: 4px 4px 0 0; + -moz-border-radius: 4px 4px 0 0; + border-radius: 4px 4px 0 0; +} + +.nav-tabs > li > a:hover, +.nav-tabs > li > a:focus { + border-color: #eeeeee #eeeeee #dddddd; +} + +.nav-tabs > .active > a, +.nav-tabs > .active > a:hover, +.nav-tabs > .active > a:focus { + color: #555555; + cursor: default; + background-color: #ffffff; + border: 1px solid #ddd; + border-bottom-color: transparent; +} + +.nav-pills > li > a { + padding-top: 8px; + padding-bottom: 8px; + margin-top: 2px; + margin-bottom: 2px; + -webkit-border-radius: 5px; + -moz-border-radius: 5px; + border-radius: 5px; +} + +.nav-pills > .active > a, +.nav-pills > .active > a:hover, +.nav-pills > .active > a:focus { + color: #ffffff; + background-color: #0088cc; +} + +.nav-stacked > li { + float: none; +} + +.nav-stacked > li > a { + margin-right: 0; +} + +.nav-tabs.nav-stacked { + border-bottom: 0; +} + +.nav-tabs.nav-stacked > li > a { + border: 1px solid #ddd; + -webkit-border-radius: 0; + -moz-border-radius: 0; + border-radius: 0; +} + +.nav-tabs.nav-stacked > li:first-child > a { + -webkit-border-top-right-radius: 4px; + border-top-right-radius: 4px; + -webkit-border-top-left-radius: 4px; + border-top-left-radius: 4px; + -moz-border-radius-topright: 4px; + -moz-border-radius-topleft: 4px; +} + +.nav-tabs.nav-stacked > li:last-child > a { + -webkit-border-bottom-right-radius: 4px; + border-bottom-right-radius: 4px; + -webkit-border-bottom-left-radius: 4px; + border-bottom-left-radius: 4px; + -moz-border-radius-bottomright: 4px; + -moz-border-radius-bottomleft: 4px; +} + +.nav-tabs.nav-stacked > li > a:hover, +.nav-tabs.nav-stacked > li > a:focus { + z-index: 2; + border-color: #ddd; +} + +.nav-pills.nav-stacked > li > a { + margin-bottom: 3px; +} + +.nav-pills.nav-stacked > li:last-child > a { + margin-bottom: 1px; +} + +.nav-tabs .dropdown-menu { + -webkit-border-radius: 0 0 6px 6px; + -moz-border-radius: 0 0 6px 6px; + border-radius: 0 0 6px 6px; +} + +.nav-pills .dropdown-menu { + -webkit-border-radius: 6px; + -moz-border-radius: 6px; + border-radius: 6px; +} + +.nav .dropdown-toggle .caret { + margin-top: 6px; + border-top-color: #0088cc; + border-bottom-color: #0088cc; +} + +.nav .dropdown-toggle:hover .caret, +.nav .dropdown-toggle:focus .caret { + border-top-color: #005580; + border-bottom-color: #005580; +} + +/* move down carets for tabs */ + +.nav-tabs .dropdown-toggle .caret { + margin-top: 8px; +} + +.nav .active .dropdown-toggle .caret { + border-top-color: #fff; + border-bottom-color: #fff; +} + +.nav-tabs .active .dropdown-toggle .caret { + border-top-color: #555555; + border-bottom-color: #555555; +} + +.nav > .dropdown.active > a:hover, +.nav > .dropdown.active > a:focus { + cursor: pointer; +} + +.nav-tabs .open .dropdown-toggle, +.nav-pills .open .dropdown-toggle, +.nav > li.dropdown.open.active > a:hover, +.nav > li.dropdown.open.active > a:focus { + color: #ffffff; + background-color: #999999; + border-color: #999999; +} + +.nav li.dropdown.open .caret, +.nav li.dropdown.open.active .caret, +.nav li.dropdown.open a:hover .caret, +.nav li.dropdown.open a:focus .caret { + border-top-color: #ffffff; + border-bottom-color: #ffffff; + opacity: 1; + filter: alpha(opacity=100); +} + +.tabs-stacked .open > a:hover, +.tabs-stacked .open > a:focus { + border-color: #999999; +} + +.tabbable { + *zoom: 1; +} + +.tabbable:before, +.tabbable:after { + display: table; + line-height: 0; + content: ""; +} + +.tabbable:after { + clear: both; +} + +.tab-content { + overflow: auto; +} + +.tabs-below > .nav-tabs, +.tabs-right > .nav-tabs, +.tabs-left > .nav-tabs { + border-bottom: 0; +} + +.tab-content > .tab-pane, +.pill-content > .pill-pane { + display: none; +} + +.tab-content > .active, +.pill-content > .active { + display: block; +} + +.tabs-below > .nav-tabs { + border-top: 1px solid #ddd; +} + +.tabs-below > .nav-tabs > li { + margin-top: -1px; + margin-bottom: 0; +} + +.tabs-below > .nav-tabs > li > a { + -webkit-border-radius: 0 0 4px 4px; + -moz-border-radius: 0 0 4px 4px; + border-radius: 0 0 4px 4px; +} + +.tabs-below > .nav-tabs > li > a:hover, +.tabs-below > .nav-tabs > li > a:focus { + border-top-color: #ddd; + border-bottom-color: transparent; +} + +.tabs-below > .nav-tabs > .active > a, +.tabs-below > .nav-tabs > .active > a:hover, +.tabs-below > .nav-tabs > .active > a:focus { + border-color: transparent #ddd #ddd #ddd; +} + +.tabs-left > .nav-tabs > li, +.tabs-right > .nav-tabs > li { + float: none; +} + +.tabs-left > .nav-tabs > li > a, +.tabs-right > .nav-tabs > li > a { + min-width: 74px; + margin-right: 0; + margin-bottom: 3px; +} + +.tabs-left > .nav-tabs { + float: left; + margin-right: 19px; + border-right: 1px solid #ddd; +} + +.tabs-left > .nav-tabs > li > a { + margin-right: -1px; + -webkit-border-radius: 4px 0 0 4px; + -moz-border-radius: 4px 0 0 4px; + border-radius: 4px 0 0 4px; +} + +.tabs-left > .nav-tabs > li > a:hover, +.tabs-left > .nav-tabs > li > a:focus { + border-color: #eeeeee #dddddd #eeeeee #eeeeee; +} + +.tabs-left > .nav-tabs .active > a, +.tabs-left > .nav-tabs .active > a:hover, +.tabs-left > .nav-tabs .active > a:focus { + border-color: #ddd transparent #ddd #ddd; + *border-right-color: #ffffff; +} + +.tabs-right > .nav-tabs { + float: right; + margin-left: 19px; + border-left: 1px solid #ddd; +} + +.tabs-right > .nav-tabs > li > a { + margin-left: -1px; + -webkit-border-radius: 0 4px 4px 0; + -moz-border-radius: 0 4px 4px 0; + border-radius: 0 4px 4px 0; +} + +.tabs-right > .nav-tabs > li > a:hover, +.tabs-right > .nav-tabs > li > a:focus { + border-color: #eeeeee #eeeeee #eeeeee #dddddd; +} + +.tabs-right > .nav-tabs .active > a, +.tabs-right > .nav-tabs .active > a:hover, +.tabs-right > .nav-tabs .active > a:focus { + border-color: #ddd #ddd #ddd transparent; + *border-left-color: #ffffff; +} + +.nav > .disabled > a { + color: #999999; +} + +.nav > .disabled > a:hover, +.nav > .disabled > a:focus { + text-decoration: none; + cursor: default; + background-color: transparent; +} + +.navbar { + *position: relative; + *z-index: 2; + margin-bottom: 20px; + overflow: visible; +} + +.navbar-inner { + min-height: 40px; + padding-right: 20px; + padding-left: 20px; + background-color: #fafafa; + background-image: -moz-linear-gradient(top, #ffffff, #f2f2f2); + background-image: -webkit-gradient(linear, 0 0, 0 100%, from(#ffffff), to(#f2f2f2)); + background-image: -webkit-linear-gradient(top, #ffffff, #f2f2f2); + background-image: -o-linear-gradient(top, #ffffff, #f2f2f2); + background-image: linear-gradient(to bottom, #ffffff, #f2f2f2); + background-repeat: repeat-x; + border: 1px solid #d4d4d4; + -webkit-border-radius: 4px; + -moz-border-radius: 4px; + border-radius: 4px; + filter: progid:DXImageTransform.Microsoft.gradient(startColorstr='#ffffffff', endColorstr='#fff2f2f2', GradientType=0); + *zoom: 1; + -webkit-box-shadow: 0 1px 4px rgba(0, 0, 0, 0.065); + -moz-box-shadow: 0 1px 4px rgba(0, 0, 0, 0.065); + box-shadow: 0 1px 4px rgba(0, 0, 0, 0.065); +} + +.navbar-inner:before, +.navbar-inner:after { + display: table; + line-height: 0; + content: ""; +} + +.navbar-inner:after { + clear: both; +} + +.navbar .container { + width: auto; +} + +.nav-collapse.collapse { + height: auto; + overflow: visible; +} + +.navbar .brand { + display: block; + float: left; + padding: 10px 20px 10px; + margin-left: -20px; + font-size: 20px; + font-weight: 200; + color: #777777; + text-shadow: 0 1px 0 #ffffff; +} + +.navbar .brand:hover, +.navbar .brand:focus { + text-decoration: none; +} + +.navbar-text { + margin-bottom: 0; + line-height: 40px; + color: #777777; +} + +.navbar-link { + color: #777777; +} + +.navbar-link:hover, +.navbar-link:focus { + color: #333333; +} + +.navbar .divider-vertical { + height: 40px; + margin: 0 9px; + border-right: 1px solid #ffffff; + border-left: 1px solid #f2f2f2; +} + +.navbar .btn, +.navbar .btn-group { + margin-top: 5px; +} + +.navbar .btn-group .btn, +.navbar .input-prepend .btn, +.navbar .input-append .btn, +.navbar .input-prepend .btn-group, +.navbar .input-append .btn-group { + margin-top: 0; +} + +.navbar-form { + margin-bottom: 0; + *zoom: 1; +} + +.navbar-form:before, +.navbar-form:after { + display: table; + line-height: 0; + content: ""; +} + +.navbar-form:after { + clear: both; +} + +.navbar-form input, +.navbar-form select, +.navbar-form .radio, +.navbar-form .checkbox { + margin-top: 5px; +} + +.navbar-form input, +.navbar-form select, +.navbar-form .btn { + display: inline-block; + margin-bottom: 0; +} + +.navbar-form input[type="image"], +.navbar-form input[type="checkbox"], +.navbar-form input[type="radio"] { + margin-top: 3px; +} + +.navbar-form .input-append, +.navbar-form .input-prepend { + margin-top: 5px; + white-space: nowrap; +} + +.navbar-form .input-append input, +.navbar-form .input-prepend input { + margin-top: 0; +} + +.navbar-search { + position: relative; + float: left; + margin-top: 5px; + margin-bottom: 0; +} + +.navbar-search .search-query { + padding: 4px 14px; + margin-bottom: 0; + font-family: "Helvetica Neue", Helvetica, Arial, sans-serif; + font-size: 13px; + font-weight: normal; + line-height: 1; + -webkit-border-radius: 15px; + -moz-border-radius: 15px; + border-radius: 15px; +} + +.navbar-static-top { + position: static; + margin-bottom: 0; +} + +.navbar-static-top .navbar-inner { + -webkit-border-radius: 0; + -moz-border-radius: 0; + border-radius: 0; +} + +.navbar-fixed-top, +.navbar-fixed-bottom { + position: fixed; + right: 0; + left: 0; + z-index: 1030; + margin-bottom: 0; +} + +.navbar-fixed-top .navbar-inner, +.navbar-static-top .navbar-inner { + border-width: 0 0 1px; +} + +.navbar-fixed-bottom .navbar-inner { + border-width: 1px 0 0; +} + +.navbar-fixed-top .navbar-inner, +.navbar-fixed-bottom .navbar-inner { + padding-right: 0; + padding-left: 0; + -webkit-border-radius: 0; + -moz-border-radius: 0; + border-radius: 0; +} + +.navbar-static-top .container, +.navbar-fixed-top .container, +.navbar-fixed-bottom .container { + width: 940px; +} + +.navbar-fixed-top { + top: 0; +} + +.navbar-fixed-top .navbar-inner, +.navbar-static-top .navbar-inner { + -webkit-box-shadow: 0 1px 10px rgba(0, 0, 0, 0.1); + -moz-box-shadow: 0 1px 10px rgba(0, 0, 0, 0.1); + box-shadow: 0 1px 10px rgba(0, 0, 0, 0.1); +} + +.navbar-fixed-bottom { + bottom: 0; +} + +.navbar-fixed-bottom .navbar-inner { + -webkit-box-shadow: 0 -1px 10px rgba(0, 0, 0, 0.1); + -moz-box-shadow: 0 -1px 10px rgba(0, 0, 0, 0.1); + box-shadow: 0 -1px 10px rgba(0, 0, 0, 0.1); +} + +.navbar .nav { + position: relative; + left: 0; + display: block; + float: left; + margin: 0 10px 0 0; +} + +.navbar .nav.pull-right { + float: right; + margin-right: 0; +} + +.navbar .nav > li { + float: left; +} + +.navbar .nav > li > a { + float: none; + padding: 10px 15px 10px; + color: #777777; + text-decoration: none; + text-shadow: 0 1px 0 #ffffff; +} + +.navbar .nav .dropdown-toggle .caret { + margin-top: 8px; +} + +.navbar .nav > li > a:focus, +.navbar .nav > li > a:hover { + color: #333333; + text-decoration: none; + background-color: transparent; +} + +.navbar .nav > .active > a, +.navbar .nav > .active > a:hover, +.navbar .nav > .active > a:focus { + color: #555555; + text-decoration: none; + background-color: #e5e5e5; + -webkit-box-shadow: inset 0 3px 8px rgba(0, 0, 0, 0.125); + -moz-box-shadow: inset 0 3px 8px rgba(0, 0, 0, 0.125); + box-shadow: inset 0 3px 8px rgba(0, 0, 0, 0.125); +} + +.navbar .btn-navbar { + display: none; + float: right; + padding: 7px 10px; + margin-right: 5px; + margin-left: 5px; + color: #ffffff; + text-shadow: 0 -1px 0 rgba(0, 0, 0, 0.25); + background-color: #ededed; + *background-color: #e5e5e5; + background-image: -moz-linear-gradient(top, #f2f2f2, #e5e5e5); + background-image: -webkit-gradient(linear, 0 0, 0 100%, from(#f2f2f2), to(#e5e5e5)); + background-image: -webkit-linear-gradient(top, #f2f2f2, #e5e5e5); + background-image: -o-linear-gradient(top, #f2f2f2, #e5e5e5); + background-image: linear-gradient(to bottom, #f2f2f2, #e5e5e5); + background-repeat: repeat-x; + border-color: #e5e5e5 #e5e5e5 #bfbfbf; + border-color: rgba(0, 0, 0, 0.1) rgba(0, 0, 0, 0.1) rgba(0, 0, 0, 0.25); + filter: progid:DXImageTransform.Microsoft.gradient(startColorstr='#fff2f2f2', endColorstr='#ffe5e5e5', GradientType=0); + filter: progid:DXImageTransform.Microsoft.gradient(enabled=false); + -webkit-box-shadow: inset 0 1px 0 rgba(255, 255, 255, 0.1), 0 1px 0 rgba(255, 255, 255, 0.075); + -moz-box-shadow: inset 0 1px 0 rgba(255, 255, 255, 0.1), 0 1px 0 rgba(255, 255, 255, 0.075); + box-shadow: inset 0 1px 0 rgba(255, 255, 255, 0.1), 0 1px 0 rgba(255, 255, 255, 0.075); +} + +.navbar .btn-navbar:hover, +.navbar .btn-navbar:focus, +.navbar .btn-navbar:active, +.navbar .btn-navbar.active, +.navbar .btn-navbar.disabled, +.navbar .btn-navbar[disabled] { + color: #ffffff; + background-color: #e5e5e5; + *background-color: #d9d9d9; +} + +.navbar .btn-navbar:active, +.navbar .btn-navbar.active { + background-color: #cccccc \9; +} + +.navbar .btn-navbar .icon-bar { + display: block; + width: 18px; + height: 2px; + background-color: #f5f5f5; + -webkit-border-radius: 1px; + -moz-border-radius: 1px; + border-radius: 1px; + -webkit-box-shadow: 0 1px 0 rgba(0, 0, 0, 0.25); + -moz-box-shadow: 0 1px 0 rgba(0, 0, 0, 0.25); + box-shadow: 0 1px 0 rgba(0, 0, 0, 0.25); +} + +.btn-navbar .icon-bar + .icon-bar { + margin-top: 3px; +} + +.navbar .nav > li > .dropdown-menu:before { + position: absolute; + top: -7px; + left: 9px; + display: inline-block; + border-right: 7px solid transparent; + border-bottom: 7px solid #ccc; + border-left: 7px solid transparent; + border-bottom-color: rgba(0, 0, 0, 0.2); + content: ''; +} + +.navbar .nav > li > .dropdown-menu:after { + position: absolute; + top: -6px; + left: 10px; + display: inline-block; + border-right: 6px solid transparent; + border-bottom: 6px solid #ffffff; + border-left: 6px solid transparent; + content: ''; +} + +.navbar-fixed-bottom .nav > li > .dropdown-menu:before { + top: auto; + bottom: -7px; + border-top: 7px solid #ccc; + border-bottom: 0; + border-top-color: rgba(0, 0, 0, 0.2); +} + +.navbar-fixed-bottom .nav > li > .dropdown-menu:after { + top: auto; + bottom: -6px; + border-top: 6px solid #ffffff; + border-bottom: 0; +} + +.navbar .nav li.dropdown > a:hover .caret, +.navbar .nav li.dropdown > a:focus .caret { + border-top-color: #333333; + border-bottom-color: #333333; +} + +.navbar .nav li.dropdown.open > .dropdown-toggle, +.navbar .nav li.dropdown.active > .dropdown-toggle, +.navbar .nav li.dropdown.open.active > .dropdown-toggle { + color: #555555; + background-color: #e5e5e5; +} + +.navbar .nav li.dropdown > .dropdown-toggle .caret { + border-top-color: #777777; + border-bottom-color: #777777; +} + +.navbar .nav li.dropdown.open > .dropdown-toggle .caret, +.navbar .nav li.dropdown.active > .dropdown-toggle .caret, +.navbar .nav li.dropdown.open.active > .dropdown-toggle .caret { + border-top-color: #555555; + border-bottom-color: #555555; +} + +.navbar .pull-right > li > .dropdown-menu, +.navbar .nav > li > .dropdown-menu.pull-right { + right: 0; + left: auto; +} + +.navbar .pull-right > li > .dropdown-menu:before, +.navbar .nav > li > .dropdown-menu.pull-right:before { + right: 12px; + left: auto; +} + +.navbar .pull-right > li > .dropdown-menu:after, +.navbar .nav > li > .dropdown-menu.pull-right:after { + right: 13px; + left: auto; +} + +.navbar .pull-right > li > .dropdown-menu .dropdown-menu, +.navbar .nav > li > .dropdown-menu.pull-right .dropdown-menu { + right: 100%; + left: auto; + margin-right: -1px; + margin-left: 0; + -webkit-border-radius: 6px 0 6px 6px; + -moz-border-radius: 6px 0 6px 6px; + border-radius: 6px 0 6px 6px; +} + +.navbar-inverse .navbar-inner { + background-color: #1b1b1b; + background-image: -moz-linear-gradient(top, #222222, #111111); + background-image: -webkit-gradient(linear, 0 0, 0 100%, from(#222222), to(#111111)); + background-image: -webkit-linear-gradient(top, #222222, #111111); + background-image: -o-linear-gradient(top, #222222, #111111); + background-image: linear-gradient(to bottom, #222222, #111111); + background-repeat: repeat-x; + border-color: #252525; + filter: progid:DXImageTransform.Microsoft.gradient(startColorstr='#ff222222', endColorstr='#ff111111', GradientType=0); +} + +.navbar-inverse .brand, +.navbar-inverse .nav > li > a { + color: #999999; + text-shadow: 0 -1px 0 rgba(0, 0, 0, 0.25); +} + +.navbar-inverse .brand:hover, +.navbar-inverse .nav > li > a:hover, +.navbar-inverse .brand:focus, +.navbar-inverse .nav > li > a:focus { + color: #ffffff; +} + +.navbar-inverse .brand { + color: #999999; +} + +.navbar-inverse .navbar-text { + color: #999999; +} + +.navbar-inverse .nav > li > a:focus, +.navbar-inverse .nav > li > a:hover { + color: #ffffff; + background-color: transparent; +} + +.navbar-inverse .nav .active > a, +.navbar-inverse .nav .active > a:hover, +.navbar-inverse .nav .active > a:focus { + color: #ffffff; + background-color: #111111; +} + +.navbar-inverse .navbar-link { + color: #999999; +} + +.navbar-inverse .navbar-link:hover, +.navbar-inverse .navbar-link:focus { + color: #ffffff; +} + +.navbar-inverse .divider-vertical { + border-right-color: #222222; + border-left-color: #111111; +} + +.navbar-inverse .nav li.dropdown.open > .dropdown-toggle, +.navbar-inverse .nav li.dropdown.active > .dropdown-toggle, +.navbar-inverse .nav li.dropdown.open.active > .dropdown-toggle { + color: #ffffff; + background-color: #111111; +} + +.navbar-inverse .nav li.dropdown > a:hover .caret, +.navbar-inverse .nav li.dropdown > a:focus .caret { + border-top-color: #ffffff; + border-bottom-color: #ffffff; +} + +.navbar-inverse .nav li.dropdown > .dropdown-toggle .caret { + border-top-color: #999999; + border-bottom-color: #999999; +} + +.navbar-inverse .nav li.dropdown.open > .dropdown-toggle .caret, +.navbar-inverse .nav li.dropdown.active > .dropdown-toggle .caret, +.navbar-inverse .nav li.dropdown.open.active > .dropdown-toggle .caret { + border-top-color: #ffffff; + border-bottom-color: #ffffff; +} + +.navbar-inverse .navbar-search .search-query { + color: #ffffff; + background-color: #515151; + border-color: #111111; + -webkit-box-shadow: inset 0 1px 2px rgba(0, 0, 0, 0.1), 0 1px 0 rgba(255, 255, 255, 0.15); + -moz-box-shadow: inset 0 1px 2px rgba(0, 0, 0, 0.1), 0 1px 0 rgba(255, 255, 255, 0.15); + box-shadow: inset 0 1px 2px rgba(0, 0, 0, 0.1), 0 1px 0 rgba(255, 255, 255, 0.15); + -webkit-transition: none; + -moz-transition: none; + -o-transition: none; + transition: none; +} + +.navbar-inverse .navbar-search .search-query:-moz-placeholder { + color: #cccccc; +} + +.navbar-inverse .navbar-search .search-query:-ms-input-placeholder { + color: #cccccc; +} + +.navbar-inverse .navbar-search .search-query::-webkit-input-placeholder { + color: #cccccc; +} + +.navbar-inverse .navbar-search .search-query:focus, +.navbar-inverse .navbar-search .search-query.focused { + padding: 5px 15px; + color: #333333; + text-shadow: 0 1px 0 #ffffff; + background-color: #ffffff; + border: 0; + outline: 0; + -webkit-box-shadow: 0 0 3px rgba(0, 0, 0, 0.15); + -moz-box-shadow: 0 0 3px rgba(0, 0, 0, 0.15); + box-shadow: 0 0 3px rgba(0, 0, 0, 0.15); +} + +.navbar-inverse .btn-navbar { + color: #ffffff; + text-shadow: 0 -1px 0 rgba(0, 0, 0, 0.25); + background-color: #0e0e0e; + *background-color: #040404; + background-image: -moz-linear-gradient(top, #151515, #040404); + background-image: -webkit-gradient(linear, 0 0, 0 100%, from(#151515), to(#040404)); + background-image: -webkit-linear-gradient(top, #151515, #040404); + background-image: -o-linear-gradient(top, #151515, #040404); + background-image: linear-gradient(to bottom, #151515, #040404); + background-repeat: repeat-x; + border-color: #040404 #040404 #000000; + border-color: rgba(0, 0, 0, 0.1) rgba(0, 0, 0, 0.1) rgba(0, 0, 0, 0.25); + filter: progid:DXImageTransform.Microsoft.gradient(startColorstr='#ff151515', endColorstr='#ff040404', GradientType=0); + filter: progid:DXImageTransform.Microsoft.gradient(enabled=false); +} + +.navbar-inverse .btn-navbar:hover, +.navbar-inverse .btn-navbar:focus, +.navbar-inverse .btn-navbar:active, +.navbar-inverse .btn-navbar.active, +.navbar-inverse .btn-navbar.disabled, +.navbar-inverse .btn-navbar[disabled] { + color: #ffffff; + background-color: #040404; + *background-color: #000000; +} + +.navbar-inverse .btn-navbar:active, +.navbar-inverse .btn-navbar.active { + background-color: #000000 \9; +} + +.breadcrumb { + padding: 8px 15px; + margin: 0 0 20px; + list-style: none; + background-color: #f5f5f5; + -webkit-border-radius: 4px; + -moz-border-radius: 4px; + border-radius: 4px; +} + +.breadcrumb > li { + display: inline-block; + *display: inline; + text-shadow: 0 1px 0 #ffffff; + *zoom: 1; +} + +.breadcrumb > li > .divider { + padding: 0 5px; + color: #ccc; +} + +.breadcrumb > .active { + color: #999999; +} + +.pagination { + margin: 20px 0; +} + +.pagination ul { + display: inline-block; + *display: inline; + margin-bottom: 0; + margin-left: 0; + -webkit-border-radius: 4px; + -moz-border-radius: 4px; + border-radius: 4px; + *zoom: 1; + -webkit-box-shadow: 0 1px 2px rgba(0, 0, 0, 0.05); + -moz-box-shadow: 0 1px 2px rgba(0, 0, 0, 0.05); + box-shadow: 0 1px 2px rgba(0, 0, 0, 0.05); +} + +.pagination ul > li { + display: inline; +} + +.pagination ul > li > a, +.pagination ul > li > span { + float: left; + padding: 4px 12px; + line-height: 20px; + text-decoration: none; + background-color: #ffffff; + border: 1px solid #dddddd; + border-left-width: 0; +} + +.pagination ul > li > a:hover, +.pagination ul > li > a:focus, +.pagination ul > .active > a, +.pagination ul > .active > span { + background-color: #f5f5f5; +} + +.pagination ul > .active > a, +.pagination ul > .active > span { + color: #999999; + cursor: default; +} + +.pagination ul > .disabled > span, +.pagination ul > .disabled > a, +.pagination ul > .disabled > a:hover, +.pagination ul > .disabled > a:focus { + color: #999999; + cursor: default; + background-color: transparent; +} + +.pagination ul > li:first-child > a, +.pagination ul > li:first-child > span { + border-left-width: 1px; + -webkit-border-bottom-left-radius: 4px; + border-bottom-left-radius: 4px; + -webkit-border-top-left-radius: 4px; + border-top-left-radius: 4px; + -moz-border-radius-bottomleft: 4px; + -moz-border-radius-topleft: 4px; +} + +.pagination ul > li:last-child > a, +.pagination ul > li:last-child > span { + -webkit-border-top-right-radius: 4px; + border-top-right-radius: 4px; + -webkit-border-bottom-right-radius: 4px; + border-bottom-right-radius: 4px; + -moz-border-radius-topright: 4px; + -moz-border-radius-bottomright: 4px; +} + +.pagination-centered { + text-align: center; +} + +.pagination-right { + text-align: right; +} + +.pagination-large ul > li > a, +.pagination-large ul > li > span { + padding: 11px 19px; + font-size: 17.5px; +} + +.pagination-large ul > li:first-child > a, +.pagination-large ul > li:first-child > span { + -webkit-border-bottom-left-radius: 6px; + border-bottom-left-radius: 6px; + -webkit-border-top-left-radius: 6px; + border-top-left-radius: 6px; + -moz-border-radius-bottomleft: 6px; + -moz-border-radius-topleft: 6px; +} + +.pagination-large ul > li:last-child > a, +.pagination-large ul > li:last-child > span { + -webkit-border-top-right-radius: 6px; + border-top-right-radius: 6px; + -webkit-border-bottom-right-radius: 6px; + border-bottom-right-radius: 6px; + -moz-border-radius-topright: 6px; + -moz-border-radius-bottomright: 6px; +} + +.pagination-mini ul > li:first-child > a, +.pagination-small ul > li:first-child > a, +.pagination-mini ul > li:first-child > span, +.pagination-small ul > li:first-child > span { + -webkit-border-bottom-left-radius: 3px; + border-bottom-left-radius: 3px; + -webkit-border-top-left-radius: 3px; + border-top-left-radius: 3px; + -moz-border-radius-bottomleft: 3px; + -moz-border-radius-topleft: 3px; +} + +.pagination-mini ul > li:last-child > a, +.pagination-small ul > li:last-child > a, +.pagination-mini ul > li:last-child > span, +.pagination-small ul > li:last-child > span { + -webkit-border-top-right-radius: 3px; + border-top-right-radius: 3px; + -webkit-border-bottom-right-radius: 3px; + border-bottom-right-radius: 3px; + -moz-border-radius-topright: 3px; + -moz-border-radius-bottomright: 3px; +} + +.pagination-small ul > li > a, +.pagination-small ul > li > span { + padding: 2px 10px; + font-size: 11.9px; +} + +.pagination-mini ul > li > a, +.pagination-mini ul > li > span { + padding: 0 6px; + font-size: 10.5px; +} + +.pager { + margin: 20px 0; + text-align: center; + list-style: none; + *zoom: 1; +} + +.pager:before, +.pager:after { + display: table; + line-height: 0; + content: ""; +} + +.pager:after { + clear: both; +} + +.pager li { + display: inline; +} + +.pager li > a, +.pager li > span { + display: inline-block; + padding: 5px 14px; + background-color: #fff; + border: 1px solid #ddd; + -webkit-border-radius: 15px; + -moz-border-radius: 15px; + border-radius: 15px; +} + +.pager li > a:hover, +.pager li > a:focus { + text-decoration: none; + background-color: #f5f5f5; +} + +.pager .next > a, +.pager .next > span { + float: right; +} + +.pager .previous > a, +.pager .previous > span { + float: left; +} + +.pager .disabled > a, +.pager .disabled > a:hover, +.pager .disabled > a:focus, +.pager .disabled > span { + color: #999999; + cursor: default; + background-color: #fff; +} + +.modal-backdrop { + position: fixed; + top: 0; + right: 0; + bottom: 0; + left: 0; + z-index: 1040; + background-color: #000000; +} + +.modal-backdrop.fade { + opacity: 0; +} + +.modal-backdrop, +.modal-backdrop.fade.in { + opacity: 0.8; + filter: alpha(opacity=80); +} + +.modal { + position: fixed; + top: 10%; + left: 50%; + z-index: 1050; + width: 560px; + margin-left: -280px; + background-color: #ffffff; + border: 1px solid #999; + border: 1px solid rgba(0, 0, 0, 0.3); + *border: 1px solid #999; + -webkit-border-radius: 6px; + -moz-border-radius: 6px; + border-radius: 6px; + outline: none; + -webkit-box-shadow: 0 3px 7px rgba(0, 0, 0, 0.3); + -moz-box-shadow: 0 3px 7px rgba(0, 0, 0, 0.3); + box-shadow: 0 3px 7px rgba(0, 0, 0, 0.3); + -webkit-background-clip: padding-box; + -moz-background-clip: padding-box; + background-clip: padding-box; +} + +.modal.fade { + top: -25%; + -webkit-transition: opacity 0.3s linear, top 0.3s ease-out; + -moz-transition: opacity 0.3s linear, top 0.3s ease-out; + -o-transition: opacity 0.3s linear, top 0.3s ease-out; + transition: opacity 0.3s linear, top 0.3s ease-out; +} + +.modal.fade.in { + top: 10%; +} + +.modal-header { + padding: 9px 15px; + border-bottom: 1px solid #eee; +} + +.modal-header .close { + margin-top: 2px; +} + +.modal-header h3 { + margin: 0; + line-height: 30px; +} + +.modal-body { + position: relative; + max-height: 400px; + padding: 15px; + overflow-y: auto; +} + +.modal-form { + margin-bottom: 0; +} + +.modal-footer { + padding: 14px 15px 15px; + margin-bottom: 0; + text-align: right; + background-color: #f5f5f5; + border-top: 1px solid #ddd; + -webkit-border-radius: 0 0 6px 6px; + -moz-border-radius: 0 0 6px 6px; + border-radius: 0 0 6px 6px; + *zoom: 1; + -webkit-box-shadow: inset 0 1px 0 #ffffff; + -moz-box-shadow: inset 0 1px 0 #ffffff; + box-shadow: inset 0 1px 0 #ffffff; +} + +.modal-footer:before, +.modal-footer:after { + display: table; + line-height: 0; + content: ""; +} + +.modal-footer:after { + clear: both; +} + +.modal-footer .btn + .btn { + margin-bottom: 0; + margin-left: 5px; +} + +.modal-footer .btn-group .btn + .btn { + margin-left: -1px; +} + +.modal-footer .btn-block + .btn-block { + margin-left: 0; +} + +.tooltip { + position: absolute; + z-index: 1030; + display: block; + font-size: 11px; + line-height: 1.4; + opacity: 0; + filter: alpha(opacity=0); + visibility: visible; +} + +.tooltip.in { + opacity: 0.8; + filter: alpha(opacity=80); +} + +.tooltip.top { + padding: 5px 0; + margin-top: -3px; +} + +.tooltip.right { + padding: 0 5px; + margin-left: 3px; +} + +.tooltip.bottom { + padding: 5px 0; + margin-top: 3px; +} + +.tooltip.left { + padding: 0 5px; + margin-left: -3px; +} + +.tooltip-inner { + max-width: 200px; + padding: 8px; + color: #ffffff; + text-align: center; + text-decoration: none; + background-color: #000000; + -webkit-border-radius: 4px; + -moz-border-radius: 4px; + border-radius: 4px; +} + +.tooltip-arrow { + position: absolute; + width: 0; + height: 0; + border-color: transparent; + border-style: solid; +} + +.tooltip.top .tooltip-arrow { + bottom: 0; + left: 50%; + margin-left: -5px; + border-top-color: #000000; + border-width: 5px 5px 0; +} + +.tooltip.right .tooltip-arrow { + top: 50%; + left: 0; + margin-top: -5px; + border-right-color: #000000; + border-width: 5px 5px 5px 0; +} + +.tooltip.left .tooltip-arrow { + top: 50%; + right: 0; + margin-top: -5px; + border-left-color: #000000; + border-width: 5px 0 5px 5px; +} + +.tooltip.bottom .tooltip-arrow { + top: 0; + left: 50%; + margin-left: -5px; + border-bottom-color: #000000; + border-width: 0 5px 5px; +} + +.popover { + position: absolute; + top: 0; + left: 0; + z-index: 1010; + display: none; + max-width: 276px; + padding: 1px; + text-align: left; + white-space: normal; + background-color: #ffffff; + border: 1px solid #ccc; + border: 1px solid rgba(0, 0, 0, 0.2); + -webkit-border-radius: 6px; + -moz-border-radius: 6px; + border-radius: 6px; + -webkit-box-shadow: 0 5px 10px rgba(0, 0, 0, 0.2); + -moz-box-shadow: 0 5px 10px rgba(0, 0, 0, 0.2); + box-shadow: 0 5px 10px rgba(0, 0, 0, 0.2); + -webkit-background-clip: padding-box; + -moz-background-clip: padding; + background-clip: padding-box; +} + +.popover.top { + margin-top: -10px; +} + +.popover.right { + margin-left: 10px; +} + +.popover.bottom { + margin-top: 10px; +} + +.popover.left { + margin-left: -10px; +} + +.popover-title { + padding: 8px 14px; + margin: 0; + font-size: 14px; + font-weight: normal; + line-height: 18px; + background-color: #f7f7f7; + border-bottom: 1px solid #ebebeb; + -webkit-border-radius: 5px 5px 0 0; + -moz-border-radius: 5px 5px 0 0; + border-radius: 5px 5px 0 0; +} + +.popover-title:empty { + display: none; +} + +.popover-content { + padding: 9px 14px; +} + +.popover .arrow, +.popover .arrow:after { + position: absolute; + display: block; + width: 0; + height: 0; + border-color: transparent; + border-style: solid; +} + +.popover .arrow { + border-width: 11px; +} + +.popover .arrow:after { + border-width: 10px; + content: ""; +} + +.popover.top .arrow { + bottom: -11px; + left: 50%; + margin-left: -11px; + border-top-color: #999; + border-top-color: rgba(0, 0, 0, 0.25); + border-bottom-width: 0; +} + +.popover.top .arrow:after { + bottom: 1px; + margin-left: -10px; + border-top-color: #ffffff; + border-bottom-width: 0; +} + +.popover.right .arrow { + top: 50%; + left: -11px; + margin-top: -11px; + border-right-color: #999; + border-right-color: rgba(0, 0, 0, 0.25); + border-left-width: 0; +} + +.popover.right .arrow:after { + bottom: -10px; + left: 1px; + border-right-color: #ffffff; + border-left-width: 0; +} + +.popover.bottom .arrow { + top: -11px; + left: 50%; + margin-left: -11px; + border-bottom-color: #999; + border-bottom-color: rgba(0, 0, 0, 0.25); + border-top-width: 0; +} + +.popover.bottom .arrow:after { + top: 1px; + margin-left: -10px; + border-bottom-color: #ffffff; + border-top-width: 0; +} + +.popover.left .arrow { + top: 50%; + right: -11px; + margin-top: -11px; + border-left-color: #999; + border-left-color: rgba(0, 0, 0, 0.25); + border-right-width: 0; +} + +.popover.left .arrow:after { + right: 1px; + bottom: -10px; + border-left-color: #ffffff; + border-right-width: 0; +} + +.thumbnails { + margin-left: -20px; + list-style: none; + *zoom: 1; +} + +.thumbnails:before, +.thumbnails:after { + display: table; + line-height: 0; + content: ""; +} + +.thumbnails:after { + clear: both; +} + +.row-fluid .thumbnails { + margin-left: 0; +} + +.thumbnails > li { + float: left; + margin-bottom: 20px; + margin-left: 20px; +} + +.thumbnail { + display: block; + padding: 4px; + line-height: 20px; + border: 1px solid #ddd; + -webkit-border-radius: 4px; + -moz-border-radius: 4px; + border-radius: 4px; + -webkit-box-shadow: 0 1px 3px rgba(0, 0, 0, 0.055); + -moz-box-shadow: 0 1px 3px rgba(0, 0, 0, 0.055); + box-shadow: 0 1px 3px rgba(0, 0, 0, 0.055); + -webkit-transition: all 0.2s ease-in-out; + -moz-transition: all 0.2s ease-in-out; + -o-transition: all 0.2s ease-in-out; + transition: all 0.2s ease-in-out; +} + +a.thumbnail:hover, +a.thumbnail:focus { + border-color: #0088cc; + -webkit-box-shadow: 0 1px 4px rgba(0, 105, 214, 0.25); + -moz-box-shadow: 0 1px 4px rgba(0, 105, 214, 0.25); + box-shadow: 0 1px 4px rgba(0, 105, 214, 0.25); +} + +.thumbnail > img { + display: block; + max-width: 100%; + margin-right: auto; + margin-left: auto; +} + +.thumbnail .caption { + padding: 9px; + color: #555555; +} + +.media, +.media-body { + overflow: hidden; + *overflow: visible; + zoom: 1; +} + +.media, +.media .media { + margin-top: 15px; +} + +.media:first-child { + margin-top: 0; +} + +.media-object { + display: block; +} + +.media-heading { + margin: 0 0 5px; +} + +.media > .pull-left { + margin-right: 10px; +} + +.media > .pull-right { + margin-left: 10px; +} + +.media-list { + margin-left: 0; + list-style: none; +} + +.label, +.badge { + display: inline-block; + padding: 2px 4px; + font-size: 11.844px; + font-weight: bold; + line-height: 14px; + color: #ffffff; + text-shadow: 0 -1px 0 rgba(0, 0, 0, 0.25); + white-space: nowrap; + vertical-align: baseline; + background-color: #999999; +} + +.label { + -webkit-border-radius: 3px; + -moz-border-radius: 3px; + border-radius: 3px; +} + +.badge { + padding-right: 9px; + padding-left: 9px; + -webkit-border-radius: 9px; + -moz-border-radius: 9px; + border-radius: 9px; +} + +.label:empty, +.badge:empty { + display: none; +} + +a.label:hover, +a.label:focus, +a.badge:hover, +a.badge:focus { + color: #ffffff; + text-decoration: none; + cursor: pointer; +} + +.label-important, +.badge-important { + background-color: #b94a48; +} + +.label-important[href], +.badge-important[href] { + background-color: #953b39; +} + +.label-warning, +.badge-warning { + background-color: #f89406; +} + +.label-warning[href], +.badge-warning[href] { + background-color: #c67605; +} + +.label-success, +.badge-success { + background-color: #468847; +} + +.label-success[href], +.badge-success[href] { + background-color: #356635; +} + +.label-info, +.badge-info { + background-color: #3a87ad; +} + +.label-info[href], +.badge-info[href] { + background-color: #2d6987; +} + +.label-inverse, +.badge-inverse { + background-color: #333333; +} + +.label-inverse[href], +.badge-inverse[href] { + background-color: #1a1a1a; +} + +.btn .label, +.btn .badge { + position: relative; + top: -1px; +} + +.btn-mini .label, +.btn-mini .badge { + top: 0; +} + +@-webkit-keyframes progress-bar-stripes { + from { + background-position: 40px 0; + } + to { + background-position: 0 0; + } +} + +@-moz-keyframes progress-bar-stripes { + from { + background-position: 40px 0; + } + to { + background-position: 0 0; + } +} + +@-ms-keyframes progress-bar-stripes { + from { + background-position: 40px 0; + } + to { + background-position: 0 0; + } +} + +@-o-keyframes progress-bar-stripes { + from { + background-position: 0 0; + } + to { + background-position: 40px 0; + } +} + +@keyframes progress-bar-stripes { + from { + background-position: 40px 0; + } + to { + background-position: 0 0; + } +} + +.progress { + height: 20px; + margin-bottom: 20px; + overflow: hidden; + background-color: #f7f7f7; + background-image: -moz-linear-gradient(top, #f5f5f5, #f9f9f9); + background-image: -webkit-gradient(linear, 0 0, 0 100%, from(#f5f5f5), to(#f9f9f9)); + background-image: -webkit-linear-gradient(top, #f5f5f5, #f9f9f9); + background-image: -o-linear-gradient(top, #f5f5f5, #f9f9f9); + background-image: linear-gradient(to bottom, #f5f5f5, #f9f9f9); + background-repeat: repeat-x; + -webkit-border-radius: 4px; + -moz-border-radius: 4px; + border-radius: 4px; + filter: progid:DXImageTransform.Microsoft.gradient(startColorstr='#fff5f5f5', endColorstr='#fff9f9f9', GradientType=0); + -webkit-box-shadow: inset 0 1px 2px rgba(0, 0, 0, 0.1); + -moz-box-shadow: inset 0 1px 2px rgba(0, 0, 0, 0.1); + box-shadow: inset 0 1px 2px rgba(0, 0, 0, 0.1); +} + +.progress .bar { + float: left; + width: 0; + height: 100%; + font-size: 12px; + color: #ffffff; + text-align: center; + text-shadow: 0 -1px 0 rgba(0, 0, 0, 0.25); + background-color: #0e90d2; + background-image: -moz-linear-gradient(top, #149bdf, #0480be); + background-image: -webkit-gradient(linear, 0 0, 0 100%, from(#149bdf), to(#0480be)); + background-image: -webkit-linear-gradient(top, #149bdf, #0480be); + background-image: -o-linear-gradient(top, #149bdf, #0480be); + background-image: linear-gradient(to bottom, #149bdf, #0480be); + background-repeat: repeat-x; + filter: progid:DXImageTransform.Microsoft.gradient(startColorstr='#ff149bdf', endColorstr='#ff0480be', GradientType=0); + -webkit-box-shadow: inset 0 -1px 0 rgba(0, 0, 0, 0.15); + -moz-box-shadow: inset 0 -1px 0 rgba(0, 0, 0, 0.15); + box-shadow: inset 0 -1px 0 rgba(0, 0, 0, 0.15); + -webkit-box-sizing: border-box; + -moz-box-sizing: border-box; + box-sizing: border-box; + -webkit-transition: width 0.6s ease; + -moz-transition: width 0.6s ease; + -o-transition: width 0.6s ease; + transition: width 0.6s ease; +} + +.progress .bar + .bar { + -webkit-box-shadow: inset 1px 0 0 rgba(0, 0, 0, 0.15), inset 0 -1px 0 rgba(0, 0, 0, 0.15); + -moz-box-shadow: inset 1px 0 0 rgba(0, 0, 0, 0.15), inset 0 -1px 0 rgba(0, 0, 0, 0.15); + box-shadow: inset 1px 0 0 rgba(0, 0, 0, 0.15), inset 0 -1px 0 rgba(0, 0, 0, 0.15); +} + +.progress-striped .bar { + background-color: #149bdf; + background-image: -webkit-gradient(linear, 0 100%, 100% 0, color-stop(0.25, rgba(255, 255, 255, 0.15)), color-stop(0.25, transparent), color-stop(0.5, transparent), color-stop(0.5, rgba(255, 255, 255, 0.15)), color-stop(0.75, rgba(255, 255, 255, 0.15)), color-stop(0.75, transparent), to(transparent)); + background-image: -webkit-linear-gradient(45deg, rgba(255, 255, 255, 0.15) 25%, transparent 25%, transparent 50%, rgba(255, 255, 255, 0.15) 50%, rgba(255, 255, 255, 0.15) 75%, transparent 75%, transparent); + background-image: -moz-linear-gradient(45deg, rgba(255, 255, 255, 0.15) 25%, transparent 25%, transparent 50%, rgba(255, 255, 255, 0.15) 50%, rgba(255, 255, 255, 0.15) 75%, transparent 75%, transparent); + background-image: -o-linear-gradient(45deg, rgba(255, 255, 255, 0.15) 25%, transparent 25%, transparent 50%, rgba(255, 255, 255, 0.15) 50%, rgba(255, 255, 255, 0.15) 75%, transparent 75%, transparent); + background-image: linear-gradient(45deg, rgba(255, 255, 255, 0.15) 25%, transparent 25%, transparent 50%, rgba(255, 255, 255, 0.15) 50%, rgba(255, 255, 255, 0.15) 75%, transparent 75%, transparent); + -webkit-background-size: 40px 40px; + -moz-background-size: 40px 40px; + -o-background-size: 40px 40px; + background-size: 40px 40px; +} + +.progress.active .bar { + -webkit-animation: progress-bar-stripes 2s linear infinite; + -moz-animation: progress-bar-stripes 2s linear infinite; + -ms-animation: progress-bar-stripes 2s linear infinite; + -o-animation: progress-bar-stripes 2s linear infinite; + animation: progress-bar-stripes 2s linear infinite; +} + +.progress-danger .bar, +.progress .bar-danger { + background-color: #dd514c; + background-image: -moz-linear-gradient(top, #ee5f5b, #c43c35); + background-image: -webkit-gradient(linear, 0 0, 0 100%, from(#ee5f5b), to(#c43c35)); + background-image: -webkit-linear-gradient(top, #ee5f5b, #c43c35); + background-image: -o-linear-gradient(top, #ee5f5b, #c43c35); + background-image: linear-gradient(to bottom, #ee5f5b, #c43c35); + background-repeat: repeat-x; + filter: progid:DXImageTransform.Microsoft.gradient(startColorstr='#ffee5f5b', endColorstr='#ffc43c35', GradientType=0); +} + +.progress-danger.progress-striped .bar, +.progress-striped .bar-danger { + background-color: #ee5f5b; + background-image: -webkit-gradient(linear, 0 100%, 100% 0, color-stop(0.25, rgba(255, 255, 255, 0.15)), color-stop(0.25, transparent), color-stop(0.5, transparent), color-stop(0.5, rgba(255, 255, 255, 0.15)), color-stop(0.75, rgba(255, 255, 255, 0.15)), color-stop(0.75, transparent), to(transparent)); + background-image: -webkit-linear-gradient(45deg, rgba(255, 255, 255, 0.15) 25%, transparent 25%, transparent 50%, rgba(255, 255, 255, 0.15) 50%, rgba(255, 255, 255, 0.15) 75%, transparent 75%, transparent); + background-image: -moz-linear-gradient(45deg, rgba(255, 255, 255, 0.15) 25%, transparent 25%, transparent 50%, rgba(255, 255, 255, 0.15) 50%, rgba(255, 255, 255, 0.15) 75%, transparent 75%, transparent); + background-image: -o-linear-gradient(45deg, rgba(255, 255, 255, 0.15) 25%, transparent 25%, transparent 50%, rgba(255, 255, 255, 0.15) 50%, rgba(255, 255, 255, 0.15) 75%, transparent 75%, transparent); + background-image: linear-gradient(45deg, rgba(255, 255, 255, 0.15) 25%, transparent 25%, transparent 50%, rgba(255, 255, 255, 0.15) 50%, rgba(255, 255, 255, 0.15) 75%, transparent 75%, transparent); +} + +.progress-success .bar, +.progress .bar-success { + background-color: #5eb95e; + background-image: -moz-linear-gradient(top, #62c462, #57a957); + background-image: -webkit-gradient(linear, 0 0, 0 100%, from(#62c462), to(#57a957)); + background-image: -webkit-linear-gradient(top, #62c462, #57a957); + background-image: -o-linear-gradient(top, #62c462, #57a957); + background-image: linear-gradient(to bottom, #62c462, #57a957); + background-repeat: repeat-x; + filter: progid:DXImageTransform.Microsoft.gradient(startColorstr='#ff62c462', endColorstr='#ff57a957', GradientType=0); +} + +.progress-success.progress-striped .bar, +.progress-striped .bar-success { + background-color: #62c462; + background-image: -webkit-gradient(linear, 0 100%, 100% 0, color-stop(0.25, rgba(255, 255, 255, 0.15)), color-stop(0.25, transparent), color-stop(0.5, transparent), color-stop(0.5, rgba(255, 255, 255, 0.15)), color-stop(0.75, rgba(255, 255, 255, 0.15)), color-stop(0.75, transparent), to(transparent)); + background-image: -webkit-linear-gradient(45deg, rgba(255, 255, 255, 0.15) 25%, transparent 25%, transparent 50%, rgba(255, 255, 255, 0.15) 50%, rgba(255, 255, 255, 0.15) 75%, transparent 75%, transparent); + background-image: -moz-linear-gradient(45deg, rgba(255, 255, 255, 0.15) 25%, transparent 25%, transparent 50%, rgba(255, 255, 255, 0.15) 50%, rgba(255, 255, 255, 0.15) 75%, transparent 75%, transparent); + background-image: -o-linear-gradient(45deg, rgba(255, 255, 255, 0.15) 25%, transparent 25%, transparent 50%, rgba(255, 255, 255, 0.15) 50%, rgba(255, 255, 255, 0.15) 75%, transparent 75%, transparent); + background-image: linear-gradient(45deg, rgba(255, 255, 255, 0.15) 25%, transparent 25%, transparent 50%, rgba(255, 255, 255, 0.15) 50%, rgba(255, 255, 255, 0.15) 75%, transparent 75%, transparent); +} + +.progress-info .bar, +.progress .bar-info { + background-color: #4bb1cf; + background-image: -moz-linear-gradient(top, #5bc0de, #339bb9); + background-image: -webkit-gradient(linear, 0 0, 0 100%, from(#5bc0de), to(#339bb9)); + background-image: -webkit-linear-gradient(top, #5bc0de, #339bb9); + background-image: -o-linear-gradient(top, #5bc0de, #339bb9); + background-image: linear-gradient(to bottom, #5bc0de, #339bb9); + background-repeat: repeat-x; + filter: progid:DXImageTransform.Microsoft.gradient(startColorstr='#ff5bc0de', endColorstr='#ff339bb9', GradientType=0); +} + +.progress-info.progress-striped .bar, +.progress-striped .bar-info { + background-color: #5bc0de; + background-image: -webkit-gradient(linear, 0 100%, 100% 0, color-stop(0.25, rgba(255, 255, 255, 0.15)), color-stop(0.25, transparent), color-stop(0.5, transparent), color-stop(0.5, rgba(255, 255, 255, 0.15)), color-stop(0.75, rgba(255, 255, 255, 0.15)), color-stop(0.75, transparent), to(transparent)); + background-image: -webkit-linear-gradient(45deg, rgba(255, 255, 255, 0.15) 25%, transparent 25%, transparent 50%, rgba(255, 255, 255, 0.15) 50%, rgba(255, 255, 255, 0.15) 75%, transparent 75%, transparent); + background-image: -moz-linear-gradient(45deg, rgba(255, 255, 255, 0.15) 25%, transparent 25%, transparent 50%, rgba(255, 255, 255, 0.15) 50%, rgba(255, 255, 255, 0.15) 75%, transparent 75%, transparent); + background-image: -o-linear-gradient(45deg, rgba(255, 255, 255, 0.15) 25%, transparent 25%, transparent 50%, rgba(255, 255, 255, 0.15) 50%, rgba(255, 255, 255, 0.15) 75%, transparent 75%, transparent); + background-image: linear-gradient(45deg, rgba(255, 255, 255, 0.15) 25%, transparent 25%, transparent 50%, rgba(255, 255, 255, 0.15) 50%, rgba(255, 255, 255, 0.15) 75%, transparent 75%, transparent); +} + +.progress-warning .bar, +.progress .bar-warning { + background-color: #faa732; + background-image: -moz-linear-gradient(top, #fbb450, #f89406); + background-image: -webkit-gradient(linear, 0 0, 0 100%, from(#fbb450), to(#f89406)); + background-image: -webkit-linear-gradient(top, #fbb450, #f89406); + background-image: -o-linear-gradient(top, #fbb450, #f89406); + background-image: linear-gradient(to bottom, #fbb450, #f89406); + background-repeat: repeat-x; + filter: progid:DXImageTransform.Microsoft.gradient(startColorstr='#fffbb450', endColorstr='#fff89406', GradientType=0); +} + +.progress-warning.progress-striped .bar, +.progress-striped .bar-warning { + background-color: #fbb450; + background-image: -webkit-gradient(linear, 0 100%, 100% 0, color-stop(0.25, rgba(255, 255, 255, 0.15)), color-stop(0.25, transparent), color-stop(0.5, transparent), color-stop(0.5, rgba(255, 255, 255, 0.15)), color-stop(0.75, rgba(255, 255, 255, 0.15)), color-stop(0.75, transparent), to(transparent)); + background-image: -webkit-linear-gradient(45deg, rgba(255, 255, 255, 0.15) 25%, transparent 25%, transparent 50%, rgba(255, 255, 255, 0.15) 50%, rgba(255, 255, 255, 0.15) 75%, transparent 75%, transparent); + background-image: -moz-linear-gradient(45deg, rgba(255, 255, 255, 0.15) 25%, transparent 25%, transparent 50%, rgba(255, 255, 255, 0.15) 50%, rgba(255, 255, 255, 0.15) 75%, transparent 75%, transparent); + background-image: -o-linear-gradient(45deg, rgba(255, 255, 255, 0.15) 25%, transparent 25%, transparent 50%, rgba(255, 255, 255, 0.15) 50%, rgba(255, 255, 255, 0.15) 75%, transparent 75%, transparent); + background-image: linear-gradient(45deg, rgba(255, 255, 255, 0.15) 25%, transparent 25%, transparent 50%, rgba(255, 255, 255, 0.15) 50%, rgba(255, 255, 255, 0.15) 75%, transparent 75%, transparent); +} + +.accordion { + margin-bottom: 20px; +} + +.accordion-group { + margin-bottom: 2px; + border: 1px solid #e5e5e5; + -webkit-border-radius: 4px; + -moz-border-radius: 4px; + border-radius: 4px; +} + +.accordion-heading { + border-bottom: 0; +} + +.accordion-heading .accordion-toggle { + display: block; + padding: 8px 15px; +} + +.accordion-toggle { + cursor: pointer; +} + +.accordion-inner { + padding: 9px 15px; + border-top: 1px solid #e5e5e5; +} + +.carousel { + position: relative; + margin-bottom: 20px; + line-height: 1; +} + +.carousel-inner { + position: relative; + width: 100%; + overflow: hidden; +} + +.carousel-inner > .item { + position: relative; + display: none; + -webkit-transition: 0.6s ease-in-out left; + -moz-transition: 0.6s ease-in-out left; + -o-transition: 0.6s ease-in-out left; + transition: 0.6s ease-in-out left; +} + +.carousel-inner > .item > img, +.carousel-inner > .item > a > img { + display: block; + line-height: 1; +} + +.carousel-inner > .active, +.carousel-inner > .next, +.carousel-inner > .prev { + display: block; +} + +.carousel-inner > .active { + left: 0; +} + +.carousel-inner > .next, +.carousel-inner > .prev { + position: absolute; + top: 0; + width: 100%; +} + +.carousel-inner > .next { + left: 100%; +} + +.carousel-inner > .prev { + left: -100%; +} + +.carousel-inner > .next.left, +.carousel-inner > .prev.right { + left: 0; +} + +.carousel-inner > .active.left { + left: -100%; +} + +.carousel-inner > .active.right { + left: 100%; +} + +.carousel-control { + position: absolute; + top: 40%; + left: 15px; + width: 40px; + height: 40px; + margin-top: -20px; + font-size: 60px; + font-weight: 100; + line-height: 30px; + color: #ffffff; + text-align: center; + background: #222222; + border: 3px solid #ffffff; + -webkit-border-radius: 23px; + -moz-border-radius: 23px; + border-radius: 23px; + opacity: 0.5; + filter: alpha(opacity=50); +} + +.carousel-control.right { + right: 15px; + left: auto; +} + +.carousel-control:hover, +.carousel-control:focus { + color: #ffffff; + text-decoration: none; + opacity: 0.9; + filter: alpha(opacity=90); +} + +.carousel-indicators { + position: absolute; + top: 15px; + right: 15px; + z-index: 5; + margin: 0; + list-style: none; +} + +.carousel-indicators li { + display: block; + float: left; + width: 10px; + height: 10px; + margin-left: 5px; + text-indent: -999px; + background-color: #ccc; + background-color: rgba(255, 255, 255, 0.25); + border-radius: 5px; +} + +.carousel-indicators .active { + background-color: #fff; +} + +.carousel-caption { + position: absolute; + right: 0; + bottom: 0; + left: 0; + padding: 15px; + background: #333333; + background: rgba(0, 0, 0, 0.75); +} + +.carousel-caption h4, +.carousel-caption p { + line-height: 20px; + color: #ffffff; +} + +.carousel-caption h4 { + margin: 0 0 5px; +} + +.carousel-caption p { + margin-bottom: 0; +} + +.hero-unit { + padding: 60px; + margin-bottom: 30px; + font-size: 18px; + font-weight: 200; + line-height: 30px; + color: inherit; + background-color: #eeeeee; + -webkit-border-radius: 6px; + -moz-border-radius: 6px; + border-radius: 6px; +} + +.hero-unit h1 { + margin-bottom: 0; + font-size: 60px; + line-height: 1; + letter-spacing: -1px; + color: inherit; +} + +.hero-unit li { + line-height: 30px; +} + +.pull-right { + float: right; +} + +.pull-left { + float: left; +} + +.hide { + display: none; +} + +.show { + display: block; +} + +.invisible { + visibility: hidden; +} + +.affix { + position: fixed; +} diff --git a/docs/_static/bootstrap-2.3.2/css/bootstrap.min.css b/docs/_static/bootstrap-2.3.2/css/bootstrap.min.css new file mode 100644 index 0000000..b6428e6 --- /dev/null +++ b/docs/_static/bootstrap-2.3.2/css/bootstrap.min.css @@ -0,0 +1,9 @@ +/*! + * Bootstrap v2.3.2 + * + * 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. + */.clearfix{*zoom:1}.clearfix:before,.clearfix:after{display:table;line-height:0;content:""}.clearfix:after{clear:both}.hide-text{font:0/0 a;color:transparent;text-shadow:none;background-color:transparent;border:0}.input-block-level{display:block;width:100%;min-height:30px;-webkit-box-sizing:border-box;-moz-box-sizing:border-box;box-sizing:border-box}article,aside,details,figcaption,figure,footer,header,hgroup,nav,section{display:block}audio,canvas,video{display:inline-block;*display:inline;*zoom:1}audio:not([controls]){display:none}html{font-size:100%;-webkit-text-size-adjust:100%;-ms-text-size-adjust:100%}a:focus{outline:thin dotted #333;outline:5px auto -webkit-focus-ring-color;outline-offset:-2px}a:hover,a:active{outline:0}sub,sup{position:relative;font-size:75%;line-height:0;vertical-align:baseline}sup{top:-0.5em}sub{bottom:-0.25em}img{width:auto\9;height:auto;max-width:100%;vertical-align:middle;border:0;-ms-interpolation-mode:bicubic}#map_canvas img,.google-maps img{max-width:none}button,input,select,textarea{margin:0;font-size:100%;vertical-align:middle}button,input{*overflow:visible;line-height:normal}button::-moz-focus-inner,input::-moz-focus-inner{padding:0;border:0}button,html input[type="button"],input[type="reset"],input[type="submit"]{cursor:pointer;-webkit-appearance:button}label,select,button,input[type="button"],input[type="reset"],input[type="submit"],input[type="radio"],input[type="checkbox"]{cursor:pointer}input[type="search"]{-webkit-box-sizing:content-box;-moz-box-sizing:content-box;box-sizing:content-box;-webkit-appearance:textfield}input[type="search"]::-webkit-search-decoration,input[type="search"]::-webkit-search-cancel-button{-webkit-appearance:none}textarea{overflow:auto;vertical-align:top}@media print{*{color:#000!important;text-shadow:none!important;background:transparent!important;box-shadow:none!important}a,a:visited{text-decoration:underline}a[href]:after{content:" (" attr(href) ")"}abbr[title]:after{content:" (" attr(title) ")"}.ir a:after,a[href^="javascript:"]:after,a[href^="#"]:after{content:""}pre,blockquote{border:1px solid #999;page-break-inside:avoid}thead{display:table-header-group}tr,img{page-break-inside:avoid}img{max-width:100%!important}@page{margin:.5cm}p,h2,h3{orphans:3;widows:3}h2,h3{page-break-after:avoid}}body{margin:0;font-family:"Helvetica Neue",Helvetica,Arial,sans-serif;font-size:14px;line-height:20px;color:#333;background-color:#fff}a{color:#08c;text-decoration:none}a:hover,a:focus{color:#005580;text-decoration:underline}.img-rounded{-webkit-border-radius:6px;-moz-border-radius:6px;border-radius:6px}.img-polaroid{padding:4px;background-color:#fff;border:1px solid #ccc;border:1px solid rgba(0,0,0,0.2);-webkit-box-shadow:0 1px 3px rgba(0,0,0,0.1);-moz-box-shadow:0 1px 3px rgba(0,0,0,0.1);box-shadow:0 1px 3px rgba(0,0,0,0.1)}.img-circle{-webkit-border-radius:500px;-moz-border-radius:500px;border-radius:500px}.row{margin-left:-20px;*zoom:1}.row:before,.row:after{display:table;line-height:0;content:""}.row:after{clear:both}[class*="span"]{float:left;min-height:1px;margin-left:20px}.container,.navbar-static-top .container,.navbar-fixed-top .container,.navbar-fixed-bottom .container{width:940px}.span12{width:940px}.span11{width:860px}.span10{width:780px}.span9{width:700px}.span8{width:620px}.span7{width:540px}.span6{width:460px}.span5{width:380px}.span4{width:300px}.span3{width:220px}.span2{width:140px}.span1{width:60px}.offset12{margin-left:980px}.offset11{margin-left:900px}.offset10{margin-left:820px}.offset9{margin-left:740px}.offset8{margin-left:660px}.offset7{margin-left:580px}.offset6{margin-left:500px}.offset5{margin-left:420px}.offset4{margin-left:340px}.offset3{margin-left:260px}.offset2{margin-left:180px}.offset1{margin-left:100px}.row-fluid{width:100%;*zoom:1}.row-fluid:before,.row-fluid:after{display:table;line-height:0;content:""}.row-fluid:after{clear:both}.row-fluid [class*="span"]{display:block;float:left;width:100%;min-height:30px;margin-left:2.127659574468085%;*margin-left:2.074468085106383%;-webkit-box-sizing:border-box;-moz-box-sizing:border-box;box-sizing:border-box}.row-fluid [class*="span"]:first-child{margin-left:0}.row-fluid .controls-row [class*="span"]+[class*="span"]{margin-left:2.127659574468085%}.row-fluid .span12{width:100%;*width:99.94680851063829%}.row-fluid .span11{width:91.48936170212765%;*width:91.43617021276594%}.row-fluid .span10{width:82.97872340425532%;*width:82.92553191489361%}.row-fluid .span9{width:74.46808510638297%;*width:74.41489361702126%}.row-fluid .span8{width:65.95744680851064%;*width:65.90425531914893%}.row-fluid .span7{width:57.44680851063829%;*width:57.39361702127659%}.row-fluid .span6{width:48.93617021276595%;*width:48.88297872340425%}.row-fluid .span5{width:40.42553191489362%;*width:40.37234042553192%}.row-fluid .span4{width:31.914893617021278%;*width:31.861702127659576%}.row-fluid .span3{width:23.404255319148934%;*width:23.351063829787233%}.row-fluid .span2{width:14.893617021276595%;*width:14.840425531914894%}.row-fluid .span1{width:6.382978723404255%;*width:6.329787234042553%}.row-fluid .offset12{margin-left:104.25531914893617%;*margin-left:104.14893617021275%}.row-fluid .offset12:first-child{margin-left:102.12765957446808%;*margin-left:102.02127659574467%}.row-fluid .offset11{margin-left:95.74468085106382%;*margin-left:95.6382978723404%}.row-fluid .offset11:first-child{margin-left:93.61702127659574%;*margin-left:93.51063829787232%}.row-fluid .offset10{margin-left:87.23404255319149%;*margin-left:87.12765957446807%}.row-fluid .offset10:first-child{margin-left:85.1063829787234%;*margin-left:84.99999999999999%}.row-fluid .offset9{margin-left:78.72340425531914%;*margin-left:78.61702127659572%}.row-fluid .offset9:first-child{margin-left:76.59574468085106%;*margin-left:76.48936170212764%}.row-fluid .offset8{margin-left:70.2127659574468%;*margin-left:70.10638297872339%}.row-fluid .offset8:first-child{margin-left:68.08510638297872%;*margin-left:67.9787234042553%}.row-fluid .offset7{margin-left:61.70212765957446%;*margin-left:61.59574468085106%}.row-fluid .offset7:first-child{margin-left:59.574468085106375%;*margin-left:59.46808510638297%}.row-fluid .offset6{margin-left:53.191489361702125%;*margin-left:53.085106382978715%}.row-fluid .offset6:first-child{margin-left:51.063829787234035%;*margin-left:50.95744680851063%}.row-fluid .offset5{margin-left:44.68085106382979%;*margin-left:44.57446808510638%}.row-fluid .offset5:first-child{margin-left:42.5531914893617%;*margin-left:42.4468085106383%}.row-fluid .offset4{margin-left:36.170212765957444%;*margin-left:36.06382978723405%}.row-fluid .offset4:first-child{margin-left:34.04255319148936%;*margin-left:33.93617021276596%}.row-fluid .offset3{margin-left:27.659574468085104%;*margin-left:27.5531914893617%}.row-fluid .offset3:first-child{margin-left:25.53191489361702%;*margin-left:25.425531914893618%}.row-fluid .offset2{margin-left:19.148936170212764%;*margin-left:19.04255319148936%}.row-fluid .offset2:first-child{margin-left:17.02127659574468%;*margin-left:16.914893617021278%}.row-fluid .offset1{margin-left:10.638297872340425%;*margin-left:10.53191489361702%}.row-fluid .offset1:first-child{margin-left:8.51063829787234%;*margin-left:8.404255319148938%}[class*="span"].hide,.row-fluid [class*="span"].hide{display:none}[class*="span"].pull-right,.row-fluid [class*="span"].pull-right{float:right}.container{margin-right:auto;margin-left:auto;*zoom:1}.container:before,.container:after{display:table;line-height:0;content:""}.container:after{clear:both}.container-fluid{padding-right:20px;padding-left:20px;*zoom:1}.container-fluid:before,.container-fluid:after{display:table;line-height:0;content:""}.container-fluid:after{clear:both}p{margin:0 0 10px}.lead{margin-bottom:20px;font-size:21px;font-weight:200;line-height:30px}small{font-size:85%}strong{font-weight:bold}em{font-style:italic}cite{font-style:normal}.muted{color:#999}a.muted:hover,a.muted:focus{color:#808080}.text-warning{color:#c09853}a.text-warning:hover,a.text-warning:focus{color:#a47e3c}.text-error{color:#b94a48}a.text-error:hover,a.text-error:focus{color:#953b39}.text-info{color:#3a87ad}a.text-info:hover,a.text-info:focus{color:#2d6987}.text-success{color:#468847}a.text-success:hover,a.text-success:focus{color:#356635}.text-left{text-align:left}.text-right{text-align:right}.text-center{text-align:center}h1,h2,h3,h4,h5,h6{margin:10px 0;font-family:inherit;font-weight:bold;line-height:20px;color:inherit;text-rendering:optimizelegibility}h1 small,h2 small,h3 small,h4 small,h5 small,h6 small{font-weight:normal;line-height:1;color:#999}h1,h2,h3{line-height:40px}h1{font-size:38.5px}h2{font-size:31.5px}h3{font-size:24.5px}h4{font-size:17.5px}h5{font-size:14px}h6{font-size:11.9px}h1 small{font-size:24.5px}h2 small{font-size:17.5px}h3 small{font-size:14px}h4 small{font-size:14px}.page-header{padding-bottom:9px;margin:20px 0 30px;border-bottom:1px solid #eee}ul,ol{padding:0;margin:0 0 10px 25px}ul ul,ul ol,ol ol,ol ul{margin-bottom:0}li{line-height:20px}ul.unstyled,ol.unstyled{margin-left:0;list-style:none}ul.inline,ol.inline{margin-left:0;list-style:none}ul.inline>li,ol.inline>li{display:inline-block;*display:inline;padding-right:5px;padding-left:5px;*zoom:1}dl{margin-bottom:20px}dt,dd{line-height:20px}dt{font-weight:bold}dd{margin-left:10px}.dl-horizontal{*zoom:1}.dl-horizontal:before,.dl-horizontal:after{display:table;line-height:0;content:""}.dl-horizontal:after{clear:both}.dl-horizontal dt{float:left;width:160px;overflow:hidden;clear:left;text-align:right;text-overflow:ellipsis;white-space:nowrap}.dl-horizontal dd{margin-left:180px}hr{margin:20px 0;border:0;border-top:1px solid #eee;border-bottom:1px solid #fff}abbr[title],abbr[data-original-title]{cursor:help;border-bottom:1px dotted #999}abbr.initialism{font-size:90%;text-transform:uppercase}blockquote{padding:0 0 0 15px;margin:0 0 20px;border-left:5px solid #eee}blockquote p{margin-bottom:0;font-size:17.5px;font-weight:300;line-height:1.25}blockquote small{display:block;line-height:20px;color:#999}blockquote small:before{content:'\2014 \00A0'}blockquote.pull-right{float:right;padding-right:15px;padding-left:0;border-right:5px solid #eee;border-left:0}blockquote.pull-right p,blockquote.pull-right small{text-align:right}blockquote.pull-right small:before{content:''}blockquote.pull-right small:after{content:'\00A0 \2014'}q:before,q:after,blockquote:before,blockquote:after{content:""}address{display:block;margin-bottom:20px;font-style:normal;line-height:20px}code,pre{padding:0 3px 2px;font-family:Monaco,Menlo,Consolas,"Courier New",monospace;font-size:12px;color:#333;-webkit-border-radius:3px;-moz-border-radius:3px;border-radius:3px}code{padding:2px 4px;color:#d14;white-space:nowrap;background-color:#f7f7f9;border:1px solid #e1e1e8}pre{display:block;padding:9.5px;margin:0 0 10px;font-size:13px;line-height:20px;word-break:break-all;word-wrap:break-word;white-space:pre;white-space:pre-wrap;background-color:#f5f5f5;border:1px solid #ccc;border:1px solid rgba(0,0,0,0.15);-webkit-border-radius:4px;-moz-border-radius:4px;border-radius:4px}pre.prettyprint{margin-bottom:20px}pre code{padding:0;color:inherit;white-space:pre;white-space:pre-wrap;background-color:transparent;border:0}.pre-scrollable{max-height:340px;overflow-y:scroll}form{margin:0 0 20px}fieldset{padding:0;margin:0;border:0}legend{display:block;width:100%;padding:0;margin-bottom:20px;font-size:21px;line-height:40px;color:#333;border:0;border-bottom:1px solid #e5e5e5}legend small{font-size:15px;color:#999}label,input,button,select,textarea{font-size:14px;font-weight:normal;line-height:20px}input,button,select,textarea{font-family:"Helvetica Neue",Helvetica,Arial,sans-serif}label{display:block;margin-bottom:5px}select,textarea,input[type="text"],input[type="password"],input[type="datetime"],input[type="datetime-local"],input[type="date"],input[type="month"],input[type="time"],input[type="week"],input[type="number"],input[type="email"],input[type="url"],input[type="search"],input[type="tel"],input[type="color"],.uneditable-input{display:inline-block;height:20px;padding:4px 6px;margin-bottom:10px;font-size:14px;line-height:20px;color:#555;vertical-align:middle;-webkit-border-radius:4px;-moz-border-radius:4px;border-radius:4px}input,textarea,.uneditable-input{width:206px}textarea{height:auto}textarea,input[type="text"],input[type="password"],input[type="datetime"],input[type="datetime-local"],input[type="date"],input[type="month"],input[type="time"],input[type="week"],input[type="number"],input[type="email"],input[type="url"],input[type="search"],input[type="tel"],input[type="color"],.uneditable-input{background-color:#fff;border:1px solid #ccc;-webkit-box-shadow:inset 0 1px 1px rgba(0,0,0,0.075);-moz-box-shadow:inset 0 1px 1px rgba(0,0,0,0.075);box-shadow:inset 0 1px 1px rgba(0,0,0,0.075);-webkit-transition:border linear .2s,box-shadow linear .2s;-moz-transition:border linear .2s,box-shadow linear .2s;-o-transition:border linear .2s,box-shadow linear .2s;transition:border linear .2s,box-shadow linear .2s}textarea:focus,input[type="text"]:focus,input[type="password"]:focus,input[type="datetime"]:focus,input[type="datetime-local"]:focus,input[type="date"]:focus,input[type="month"]:focus,input[type="time"]:focus,input[type="week"]:focus,input[type="number"]:focus,input[type="email"]:focus,input[type="url"]:focus,input[type="search"]:focus,input[type="tel"]:focus,input[type="color"]:focus,.uneditable-input:focus{border-color:rgba(82,168,236,0.8);outline:0;outline:thin dotted \9;-webkit-box-shadow:inset 0 1px 1px rgba(0,0,0,0.075),0 0 8px rgba(82,168,236,0.6);-moz-box-shadow:inset 0 1px 1px rgba(0,0,0,0.075),0 0 8px rgba(82,168,236,0.6);box-shadow:inset 0 1px 1px rgba(0,0,0,0.075),0 0 8px rgba(82,168,236,0.6)}input[type="radio"],input[type="checkbox"]{margin:4px 0 0;margin-top:1px \9;*margin-top:0;line-height:normal}input[type="file"],input[type="image"],input[type="submit"],input[type="reset"],input[type="button"],input[type="radio"],input[type="checkbox"]{width:auto}select,input[type="file"]{height:30px;*margin-top:4px;line-height:30px}select{width:220px;background-color:#fff;border:1px solid #ccc}select[multiple],select[size]{height:auto}select:focus,input[type="file"]:focus,input[type="radio"]:focus,input[type="checkbox"]:focus{outline:thin dotted #333;outline:5px auto -webkit-focus-ring-color;outline-offset:-2px}.uneditable-input,.uneditable-textarea{color:#999;cursor:not-allowed;background-color:#fcfcfc;border-color:#ccc;-webkit-box-shadow:inset 0 1px 2px rgba(0,0,0,0.025);-moz-box-shadow:inset 0 1px 2px rgba(0,0,0,0.025);box-shadow:inset 0 1px 2px rgba(0,0,0,0.025)}.uneditable-input{overflow:hidden;white-space:nowrap}.uneditable-textarea{width:auto;height:auto}input:-moz-placeholder,textarea:-moz-placeholder{color:#999}input:-ms-input-placeholder,textarea:-ms-input-placeholder{color:#999}input::-webkit-input-placeholder,textarea::-webkit-input-placeholder{color:#999}.radio,.checkbox{min-height:20px;padding-left:20px}.radio input[type="radio"],.checkbox input[type="checkbox"]{float:left;margin-left:-20px}.controls>.radio:first-child,.controls>.checkbox:first-child{padding-top:5px}.radio.inline,.checkbox.inline{display:inline-block;padding-top:5px;margin-bottom:0;vertical-align:middle}.radio.inline+.radio.inline,.checkbox.inline+.checkbox.inline{margin-left:10px}.input-mini{width:60px}.input-small{width:90px}.input-medium{width:150px}.input-large{width:210px}.input-xlarge{width:270px}.input-xxlarge{width:530px}input[class*="span"],select[class*="span"],textarea[class*="span"],.uneditable-input[class*="span"],.row-fluid input[class*="span"],.row-fluid select[class*="span"],.row-fluid textarea[class*="span"],.row-fluid .uneditable-input[class*="span"]{float:none;margin-left:0}.input-append input[class*="span"],.input-append .uneditable-input[class*="span"],.input-prepend input[class*="span"],.input-prepend .uneditable-input[class*="span"],.row-fluid input[class*="span"],.row-fluid select[class*="span"],.row-fluid textarea[class*="span"],.row-fluid .uneditable-input[class*="span"],.row-fluid .input-prepend [class*="span"],.row-fluid .input-append [class*="span"]{display:inline-block}input,textarea,.uneditable-input{margin-left:0}.controls-row [class*="span"]+[class*="span"]{margin-left:20px}input.span12,textarea.span12,.uneditable-input.span12{width:926px}input.span11,textarea.span11,.uneditable-input.span11{width:846px}input.span10,textarea.span10,.uneditable-input.span10{width:766px}input.span9,textarea.span9,.uneditable-input.span9{width:686px}input.span8,textarea.span8,.uneditable-input.span8{width:606px}input.span7,textarea.span7,.uneditable-input.span7{width:526px}input.span6,textarea.span6,.uneditable-input.span6{width:446px}input.span5,textarea.span5,.uneditable-input.span5{width:366px}input.span4,textarea.span4,.uneditable-input.span4{width:286px}input.span3,textarea.span3,.uneditable-input.span3{width:206px}input.span2,textarea.span2,.uneditable-input.span2{width:126px}input.span1,textarea.span1,.uneditable-input.span1{width:46px}.controls-row{*zoom:1}.controls-row:before,.controls-row:after{display:table;line-height:0;content:""}.controls-row:after{clear:both}.controls-row [class*="span"],.row-fluid .controls-row [class*="span"]{float:left}.controls-row .checkbox[class*="span"],.controls-row .radio[class*="span"]{padding-top:5px}input[disabled],select[disabled],textarea[disabled],input[readonly],select[readonly],textarea[readonly]{cursor:not-allowed;background-color:#eee}input[type="radio"][disabled],input[type="checkbox"][disabled],input[type="radio"][readonly],input[type="checkbox"][readonly]{background-color:transparent}.control-group.warning .control-label,.control-group.warning .help-block,.control-group.warning .help-inline{color:#c09853}.control-group.warning .checkbox,.control-group.warning .radio,.control-group.warning input,.control-group.warning select,.control-group.warning textarea{color:#c09853}.control-group.warning input,.control-group.warning select,.control-group.warning textarea{border-color:#c09853;-webkit-box-shadow:inset 0 1px 1px rgba(0,0,0,0.075);-moz-box-shadow:inset 0 1px 1px rgba(0,0,0,0.075);box-shadow:inset 0 1px 1px rgba(0,0,0,0.075)}.control-group.warning input:focus,.control-group.warning select:focus,.control-group.warning textarea:focus{border-color:#a47e3c;-webkit-box-shadow:inset 0 1px 1px rgba(0,0,0,0.075),0 0 6px #dbc59e;-moz-box-shadow:inset 0 1px 1px rgba(0,0,0,0.075),0 0 6px #dbc59e;box-shadow:inset 0 1px 1px rgba(0,0,0,0.075),0 0 6px #dbc59e}.control-group.warning .input-prepend .add-on,.control-group.warning .input-append .add-on{color:#c09853;background-color:#fcf8e3;border-color:#c09853}.control-group.error .control-label,.control-group.error .help-block,.control-group.error .help-inline{color:#b94a48}.control-group.error .checkbox,.control-group.error .radio,.control-group.error input,.control-group.error select,.control-group.error textarea{color:#b94a48}.control-group.error input,.control-group.error select,.control-group.error textarea{border-color:#b94a48;-webkit-box-shadow:inset 0 1px 1px rgba(0,0,0,0.075);-moz-box-shadow:inset 0 1px 1px rgba(0,0,0,0.075);box-shadow:inset 0 1px 1px rgba(0,0,0,0.075)}.control-group.error input:focus,.control-group.error select:focus,.control-group.error textarea:focus{border-color:#953b39;-webkit-box-shadow:inset 0 1px 1px rgba(0,0,0,0.075),0 0 6px #d59392;-moz-box-shadow:inset 0 1px 1px rgba(0,0,0,0.075),0 0 6px #d59392;box-shadow:inset 0 1px 1px rgba(0,0,0,0.075),0 0 6px #d59392}.control-group.error .input-prepend .add-on,.control-group.error .input-append .add-on{color:#b94a48;background-color:#f2dede;border-color:#b94a48}.control-group.success .control-label,.control-group.success .help-block,.control-group.success .help-inline{color:#468847}.control-group.success .checkbox,.control-group.success .radio,.control-group.success input,.control-group.success select,.control-group.success textarea{color:#468847}.control-group.success input,.control-group.success select,.control-group.success textarea{border-color:#468847;-webkit-box-shadow:inset 0 1px 1px rgba(0,0,0,0.075);-moz-box-shadow:inset 0 1px 1px rgba(0,0,0,0.075);box-shadow:inset 0 1px 1px rgba(0,0,0,0.075)}.control-group.success input:focus,.control-group.success select:focus,.control-group.success textarea:focus{border-color:#356635;-webkit-box-shadow:inset 0 1px 1px rgba(0,0,0,0.075),0 0 6px #7aba7b;-moz-box-shadow:inset 0 1px 1px rgba(0,0,0,0.075),0 0 6px #7aba7b;box-shadow:inset 0 1px 1px rgba(0,0,0,0.075),0 0 6px #7aba7b}.control-group.success .input-prepend .add-on,.control-group.success .input-append .add-on{color:#468847;background-color:#dff0d8;border-color:#468847}.control-group.info .control-label,.control-group.info .help-block,.control-group.info .help-inline{color:#3a87ad}.control-group.info .checkbox,.control-group.info .radio,.control-group.info input,.control-group.info select,.control-group.info textarea{color:#3a87ad}.control-group.info input,.control-group.info select,.control-group.info textarea{border-color:#3a87ad;-webkit-box-shadow:inset 0 1px 1px rgba(0,0,0,0.075);-moz-box-shadow:inset 0 1px 1px rgba(0,0,0,0.075);box-shadow:inset 0 1px 1px rgba(0,0,0,0.075)}.control-group.info input:focus,.control-group.info select:focus,.control-group.info textarea:focus{border-color:#2d6987;-webkit-box-shadow:inset 0 1px 1px rgba(0,0,0,0.075),0 0 6px #7ab5d3;-moz-box-shadow:inset 0 1px 1px rgba(0,0,0,0.075),0 0 6px #7ab5d3;box-shadow:inset 0 1px 1px rgba(0,0,0,0.075),0 0 6px #7ab5d3}.control-group.info .input-prepend .add-on,.control-group.info .input-append .add-on{color:#3a87ad;background-color:#d9edf7;border-color:#3a87ad}input:focus:invalid,textarea:focus:invalid,select:focus:invalid{color:#b94a48;border-color:#ee5f5b}input:focus:invalid:focus,textarea:focus:invalid:focus,select:focus:invalid:focus{border-color:#e9322d;-webkit-box-shadow:0 0 6px #f8b9b7;-moz-box-shadow:0 0 6px #f8b9b7;box-shadow:0 0 6px #f8b9b7}.form-actions{padding:19px 20px 20px;margin-top:20px;margin-bottom:20px;background-color:#f5f5f5;border-top:1px solid #e5e5e5;*zoom:1}.form-actions:before,.form-actions:after{display:table;line-height:0;content:""}.form-actions:after{clear:both}.help-block,.help-inline{color:#595959}.help-block{display:block;margin-bottom:10px}.help-inline{display:inline-block;*display:inline;padding-left:5px;vertical-align:middle;*zoom:1}.input-append,.input-prepend{display:inline-block;margin-bottom:10px;font-size:0;white-space:nowrap;vertical-align:middle}.input-append input,.input-prepend input,.input-append select,.input-prepend select,.input-append .uneditable-input,.input-prepend .uneditable-input,.input-append .dropdown-menu,.input-prepend .dropdown-menu,.input-append .popover,.input-prepend .popover{font-size:14px}.input-append input,.input-prepend input,.input-append select,.input-prepend select,.input-append .uneditable-input,.input-prepend .uneditable-input{position:relative;margin-bottom:0;*margin-left:0;vertical-align:top;-webkit-border-radius:0 4px 4px 0;-moz-border-radius:0 4px 4px 0;border-radius:0 4px 4px 0}.input-append input:focus,.input-prepend input:focus,.input-append select:focus,.input-prepend select:focus,.input-append .uneditable-input:focus,.input-prepend .uneditable-input:focus{z-index:2}.input-append .add-on,.input-prepend .add-on{display:inline-block;width:auto;height:20px;min-width:16px;padding:4px 5px;font-size:14px;font-weight:normal;line-height:20px;text-align:center;text-shadow:0 1px 0 #fff;background-color:#eee;border:1px solid #ccc}.input-append .add-on,.input-prepend .add-on,.input-append .btn,.input-prepend .btn,.input-append .btn-group>.dropdown-toggle,.input-prepend .btn-group>.dropdown-toggle{vertical-align:top;-webkit-border-radius:0;-moz-border-radius:0;border-radius:0}.input-append .active,.input-prepend .active{background-color:#a9dba9;border-color:#46a546}.input-prepend .add-on,.input-prepend .btn{margin-right:-1px}.input-prepend .add-on:first-child,.input-prepend .btn:first-child{-webkit-border-radius:4px 0 0 4px;-moz-border-radius:4px 0 0 4px;border-radius:4px 0 0 4px}.input-append input,.input-append select,.input-append .uneditable-input{-webkit-border-radius:4px 0 0 4px;-moz-border-radius:4px 0 0 4px;border-radius:4px 0 0 4px}.input-append input+.btn-group .btn:last-child,.input-append select+.btn-group .btn:last-child,.input-append .uneditable-input+.btn-group .btn:last-child{-webkit-border-radius:0 4px 4px 0;-moz-border-radius:0 4px 4px 0;border-radius:0 4px 4px 0}.input-append .add-on,.input-append .btn,.input-append .btn-group{margin-left:-1px}.input-append .add-on:last-child,.input-append .btn:last-child,.input-append .btn-group:last-child>.dropdown-toggle{-webkit-border-radius:0 4px 4px 0;-moz-border-radius:0 4px 4px 0;border-radius:0 4px 4px 0}.input-prepend.input-append input,.input-prepend.input-append select,.input-prepend.input-append .uneditable-input{-webkit-border-radius:0;-moz-border-radius:0;border-radius:0}.input-prepend.input-append input+.btn-group .btn,.input-prepend.input-append select+.btn-group .btn,.input-prepend.input-append .uneditable-input+.btn-group .btn{-webkit-border-radius:0 4px 4px 0;-moz-border-radius:0 4px 4px 0;border-radius:0 4px 4px 0}.input-prepend.input-append .add-on:first-child,.input-prepend.input-append .btn:first-child{margin-right:-1px;-webkit-border-radius:4px 0 0 4px;-moz-border-radius:4px 0 0 4px;border-radius:4px 0 0 4px}.input-prepend.input-append .add-on:last-child,.input-prepend.input-append .btn:last-child{margin-left:-1px;-webkit-border-radius:0 4px 4px 0;-moz-border-radius:0 4px 4px 0;border-radius:0 4px 4px 0}.input-prepend.input-append .btn-group:first-child{margin-left:0}input.search-query{padding-right:14px;padding-right:4px \9;padding-left:14px;padding-left:4px \9;margin-bottom:0;-webkit-border-radius:15px;-moz-border-radius:15px;border-radius:15px}.form-search .input-append .search-query,.form-search .input-prepend .search-query{-webkit-border-radius:0;-moz-border-radius:0;border-radius:0}.form-search .input-append .search-query{-webkit-border-radius:14px 0 0 14px;-moz-border-radius:14px 0 0 14px;border-radius:14px 0 0 14px}.form-search .input-append .btn{-webkit-border-radius:0 14px 14px 0;-moz-border-radius:0 14px 14px 0;border-radius:0 14px 14px 0}.form-search .input-prepend .search-query{-webkit-border-radius:0 14px 14px 0;-moz-border-radius:0 14px 14px 0;border-radius:0 14px 14px 0}.form-search .input-prepend .btn{-webkit-border-radius:14px 0 0 14px;-moz-border-radius:14px 0 0 14px;border-radius:14px 0 0 14px}.form-search input,.form-inline input,.form-horizontal input,.form-search textarea,.form-inline textarea,.form-horizontal textarea,.form-search select,.form-inline select,.form-horizontal select,.form-search .help-inline,.form-inline .help-inline,.form-horizontal .help-inline,.form-search .uneditable-input,.form-inline .uneditable-input,.form-horizontal .uneditable-input,.form-search .input-prepend,.form-inline .input-prepend,.form-horizontal .input-prepend,.form-search .input-append,.form-inline .input-append,.form-horizontal .input-append{display:inline-block;*display:inline;margin-bottom:0;vertical-align:middle;*zoom:1}.form-search .hide,.form-inline .hide,.form-horizontal .hide{display:none}.form-search label,.form-inline label,.form-search .btn-group,.form-inline .btn-group{display:inline-block}.form-search .input-append,.form-inline .input-append,.form-search .input-prepend,.form-inline .input-prepend{margin-bottom:0}.form-search .radio,.form-search .checkbox,.form-inline .radio,.form-inline .checkbox{padding-left:0;margin-bottom:0;vertical-align:middle}.form-search .radio input[type="radio"],.form-search .checkbox input[type="checkbox"],.form-inline .radio input[type="radio"],.form-inline .checkbox input[type="checkbox"]{float:left;margin-right:3px;margin-left:0}.control-group{margin-bottom:10px}legend+.control-group{margin-top:20px;-webkit-margin-top-collapse:separate}.form-horizontal .control-group{margin-bottom:20px;*zoom:1}.form-horizontal .control-group:before,.form-horizontal .control-group:after{display:table;line-height:0;content:""}.form-horizontal .control-group:after{clear:both}.form-horizontal .control-label{float:left;width:160px;padding-top:5px;text-align:right}.form-horizontal .controls{*display:inline-block;*padding-left:20px;margin-left:180px;*margin-left:0}.form-horizontal .controls:first-child{*padding-left:180px}.form-horizontal .help-block{margin-bottom:0}.form-horizontal input+.help-block,.form-horizontal select+.help-block,.form-horizontal textarea+.help-block,.form-horizontal .uneditable-input+.help-block,.form-horizontal .input-prepend+.help-block,.form-horizontal .input-append+.help-block{margin-top:10px}.form-horizontal .form-actions{padding-left:180px}table{max-width:100%;background-color:transparent;border-collapse:collapse;border-spacing:0}.table{width:100%;margin-bottom:20px}.table th,.table td{padding:8px;line-height:20px;text-align:left;vertical-align:top;border-top:1px solid #ddd}.table th{font-weight:bold}.table thead th{vertical-align:bottom}.table caption+thead tr:first-child th,.table caption+thead tr:first-child td,.table colgroup+thead tr:first-child th,.table colgroup+thead tr:first-child td,.table thead:first-child tr:first-child th,.table thead:first-child tr:first-child td{border-top:0}.table tbody+tbody{border-top:2px solid #ddd}.table .table{background-color:#fff}.table-condensed th,.table-condensed td{padding:4px 5px}.table-bordered{border:1px solid #ddd;border-collapse:separate;*border-collapse:collapse;border-left:0;-webkit-border-radius:4px;-moz-border-radius:4px;border-radius:4px}.table-bordered th,.table-bordered td{border-left:1px solid #ddd}.table-bordered caption+thead tr:first-child th,.table-bordered caption+tbody tr:first-child th,.table-bordered caption+tbody tr:first-child td,.table-bordered colgroup+thead tr:first-child th,.table-bordered colgroup+tbody tr:first-child th,.table-bordered colgroup+tbody tr:first-child td,.table-bordered thead:first-child tr:first-child th,.table-bordered tbody:first-child tr:first-child th,.table-bordered tbody:first-child tr:first-child td{border-top:0}.table-bordered thead:first-child tr:first-child>th:first-child,.table-bordered tbody:first-child tr:first-child>td:first-child,.table-bordered tbody:first-child tr:first-child>th:first-child{-webkit-border-top-left-radius:4px;border-top-left-radius:4px;-moz-border-radius-topleft:4px}.table-bordered thead:first-child tr:first-child>th:last-child,.table-bordered tbody:first-child tr:first-child>td:last-child,.table-bordered tbody:first-child tr:first-child>th:last-child{-webkit-border-top-right-radius:4px;border-top-right-radius:4px;-moz-border-radius-topright:4px}.table-bordered thead:last-child tr:last-child>th:first-child,.table-bordered tbody:last-child tr:last-child>td:first-child,.table-bordered tbody:last-child tr:last-child>th:first-child,.table-bordered tfoot:last-child tr:last-child>td:first-child,.table-bordered tfoot:last-child tr:last-child>th:first-child{-webkit-border-bottom-left-radius:4px;border-bottom-left-radius:4px;-moz-border-radius-bottomleft:4px}.table-bordered thead:last-child tr:last-child>th:last-child,.table-bordered tbody:last-child tr:last-child>td:last-child,.table-bordered tbody:last-child tr:last-child>th:last-child,.table-bordered tfoot:last-child tr:last-child>td:last-child,.table-bordered tfoot:last-child tr:last-child>th:last-child{-webkit-border-bottom-right-radius:4px;border-bottom-right-radius:4px;-moz-border-radius-bottomright:4px}.table-bordered tfoot+tbody:last-child tr:last-child td:first-child{-webkit-border-bottom-left-radius:0;border-bottom-left-radius:0;-moz-border-radius-bottomleft:0}.table-bordered tfoot+tbody:last-child tr:last-child td:last-child{-webkit-border-bottom-right-radius:0;border-bottom-right-radius:0;-moz-border-radius-bottomright:0}.table-bordered caption+thead tr:first-child th:first-child,.table-bordered caption+tbody tr:first-child td:first-child,.table-bordered colgroup+thead tr:first-child th:first-child,.table-bordered colgroup+tbody tr:first-child td:first-child{-webkit-border-top-left-radius:4px;border-top-left-radius:4px;-moz-border-radius-topleft:4px}.table-bordered caption+thead tr:first-child th:last-child,.table-bordered caption+tbody tr:first-child td:last-child,.table-bordered colgroup+thead tr:first-child th:last-child,.table-bordered colgroup+tbody tr:first-child td:last-child{-webkit-border-top-right-radius:4px;border-top-right-radius:4px;-moz-border-radius-topright:4px}.table-striped tbody>tr:nth-child(odd)>td,.table-striped tbody>tr:nth-child(odd)>th{background-color:#f9f9f9}.table-hover tbody tr:hover>td,.table-hover tbody tr:hover>th{background-color:#f5f5f5}table td[class*="span"],table th[class*="span"],.row-fluid table td[class*="span"],.row-fluid table th[class*="span"]{display:table-cell;float:none;margin-left:0}.table td.span1,.table th.span1{float:none;width:44px;margin-left:0}.table td.span2,.table th.span2{float:none;width:124px;margin-left:0}.table td.span3,.table th.span3{float:none;width:204px;margin-left:0}.table td.span4,.table th.span4{float:none;width:284px;margin-left:0}.table td.span5,.table th.span5{float:none;width:364px;margin-left:0}.table td.span6,.table th.span6{float:none;width:444px;margin-left:0}.table td.span7,.table th.span7{float:none;width:524px;margin-left:0}.table td.span8,.table th.span8{float:none;width:604px;margin-left:0}.table td.span9,.table th.span9{float:none;width:684px;margin-left:0}.table td.span10,.table th.span10{float:none;width:764px;margin-left:0}.table td.span11,.table th.span11{float:none;width:844px;margin-left:0}.table td.span12,.table th.span12{float:none;width:924px;margin-left:0}.table tbody tr.success>td{background-color:#dff0d8}.table tbody tr.error>td{background-color:#f2dede}.table tbody tr.warning>td{background-color:#fcf8e3}.table tbody tr.info>td{background-color:#d9edf7}.table-hover tbody tr.success:hover>td{background-color:#d0e9c6}.table-hover tbody tr.error:hover>td{background-color:#ebcccc}.table-hover tbody tr.warning:hover>td{background-color:#faf2cc}.table-hover tbody tr.info:hover>td{background-color:#c4e3f3}[class^="icon-"],[class*=" icon-"]{display:inline-block;width:14px;height:14px;margin-top:1px;*margin-right:.3em;line-height:14px;vertical-align:text-top;background-image:url("../img/glyphicons-halflings.png");background-position:14px 14px;background-repeat:no-repeat}.icon-white,.nav-pills>.active>a>[class^="icon-"],.nav-pills>.active>a>[class*=" icon-"],.nav-list>.active>a>[class^="icon-"],.nav-list>.active>a>[class*=" icon-"],.navbar-inverse .nav>.active>a>[class^="icon-"],.navbar-inverse .nav>.active>a>[class*=" icon-"],.dropdown-menu>li>a:hover>[class^="icon-"],.dropdown-menu>li>a:focus>[class^="icon-"],.dropdown-menu>li>a:hover>[class*=" icon-"],.dropdown-menu>li>a:focus>[class*=" icon-"],.dropdown-menu>.active>a>[class^="icon-"],.dropdown-menu>.active>a>[class*=" icon-"],.dropdown-submenu:hover>a>[class^="icon-"],.dropdown-submenu:focus>a>[class^="icon-"],.dropdown-submenu:hover>a>[class*=" icon-"],.dropdown-submenu:focus>a>[class*=" icon-"]{background-image:url("../img/glyphicons-halflings-white.png")}.icon-glass{background-position:0 0}.icon-music{background-position:-24px 0}.icon-search{background-position:-48px 0}.icon-envelope{background-position:-72px 0}.icon-heart{background-position:-96px 0}.icon-star{background-position:-120px 0}.icon-star-empty{background-position:-144px 0}.icon-user{background-position:-168px 0}.icon-film{background-position:-192px 0}.icon-th-large{background-position:-216px 0}.icon-th{background-position:-240px 0}.icon-th-list{background-position:-264px 0}.icon-ok{background-position:-288px 0}.icon-remove{background-position:-312px 0}.icon-zoom-in{background-position:-336px 0}.icon-zoom-out{background-position:-360px 0}.icon-off{background-position:-384px 0}.icon-signal{background-position:-408px 0}.icon-cog{background-position:-432px 0}.icon-trash{background-position:-456px 0}.icon-home{background-position:0 -24px}.icon-file{background-position:-24px -24px}.icon-time{background-position:-48px -24px}.icon-road{background-position:-72px -24px}.icon-download-alt{background-position:-96px -24px}.icon-download{background-position:-120px -24px}.icon-upload{background-position:-144px -24px}.icon-inbox{background-position:-168px -24px}.icon-play-circle{background-position:-192px -24px}.icon-repeat{background-position:-216px -24px}.icon-refresh{background-position:-240px -24px}.icon-list-alt{background-position:-264px -24px}.icon-lock{background-position:-287px -24px}.icon-flag{background-position:-312px -24px}.icon-headphones{background-position:-336px -24px}.icon-volume-off{background-position:-360px -24px}.icon-volume-down{background-position:-384px -24px}.icon-volume-up{background-position:-408px -24px}.icon-qrcode{background-position:-432px -24px}.icon-barcode{background-position:-456px -24px}.icon-tag{background-position:0 -48px}.icon-tags{background-position:-25px -48px}.icon-book{background-position:-48px -48px}.icon-bookmark{background-position:-72px -48px}.icon-print{background-position:-96px -48px}.icon-camera{background-position:-120px -48px}.icon-font{background-position:-144px -48px}.icon-bold{background-position:-167px -48px}.icon-italic{background-position:-192px -48px}.icon-text-height{background-position:-216px -48px}.icon-text-width{background-position:-240px -48px}.icon-align-left{background-position:-264px -48px}.icon-align-center{background-position:-288px -48px}.icon-align-right{background-position:-312px -48px}.icon-align-justify{background-position:-336px -48px}.icon-list{background-position:-360px -48px}.icon-indent-left{background-position:-384px -48px}.icon-indent-right{background-position:-408px -48px}.icon-facetime-video{background-position:-432px -48px}.icon-picture{background-position:-456px -48px}.icon-pencil{background-position:0 -72px}.icon-map-marker{background-position:-24px -72px}.icon-adjust{background-position:-48px -72px}.icon-tint{background-position:-72px -72px}.icon-edit{background-position:-96px -72px}.icon-share{background-position:-120px -72px}.icon-check{background-position:-144px -72px}.icon-move{background-position:-168px -72px}.icon-step-backward{background-position:-192px -72px}.icon-fast-backward{background-position:-216px -72px}.icon-backward{background-position:-240px -72px}.icon-play{background-position:-264px -72px}.icon-pause{background-position:-288px -72px}.icon-stop{background-position:-312px -72px}.icon-forward{background-position:-336px -72px}.icon-fast-forward{background-position:-360px -72px}.icon-step-forward{background-position:-384px -72px}.icon-eject{background-position:-408px -72px}.icon-chevron-left{background-position:-432px -72px}.icon-chevron-right{background-position:-456px -72px}.icon-plus-sign{background-position:0 -96px}.icon-minus-sign{background-position:-24px -96px}.icon-remove-sign{background-position:-48px -96px}.icon-ok-sign{background-position:-72px -96px}.icon-question-sign{background-position:-96px -96px}.icon-info-sign{background-position:-120px -96px}.icon-screenshot{background-position:-144px -96px}.icon-remove-circle{background-position:-168px -96px}.icon-ok-circle{background-position:-192px -96px}.icon-ban-circle{background-position:-216px -96px}.icon-arrow-left{background-position:-240px -96px}.icon-arrow-right{background-position:-264px -96px}.icon-arrow-up{background-position:-289px -96px}.icon-arrow-down{background-position:-312px -96px}.icon-share-alt{background-position:-336px -96px}.icon-resize-full{background-position:-360px -96px}.icon-resize-small{background-position:-384px -96px}.icon-plus{background-position:-408px -96px}.icon-minus{background-position:-433px -96px}.icon-asterisk{background-position:-456px -96px}.icon-exclamation-sign{background-position:0 -120px}.icon-gift{background-position:-24px -120px}.icon-leaf{background-position:-48px -120px}.icon-fire{background-position:-72px -120px}.icon-eye-open{background-position:-96px -120px}.icon-eye-close{background-position:-120px -120px}.icon-warning-sign{background-position:-144px -120px}.icon-plane{background-position:-168px -120px}.icon-calendar{background-position:-192px -120px}.icon-random{width:16px;background-position:-216px -120px}.icon-comment{background-position:-240px -120px}.icon-magnet{background-position:-264px -120px}.icon-chevron-up{background-position:-288px -120px}.icon-chevron-down{background-position:-313px -119px}.icon-retweet{background-position:-336px -120px}.icon-shopping-cart{background-position:-360px -120px}.icon-folder-close{width:16px;background-position:-384px -120px}.icon-folder-open{width:16px;background-position:-408px -120px}.icon-resize-vertical{background-position:-432px -119px}.icon-resize-horizontal{background-position:-456px -118px}.icon-hdd{background-position:0 -144px}.icon-bullhorn{background-position:-24px -144px}.icon-bell{background-position:-48px -144px}.icon-certificate{background-position:-72px -144px}.icon-thumbs-up{background-position:-96px -144px}.icon-thumbs-down{background-position:-120px -144px}.icon-hand-right{background-position:-144px -144px}.icon-hand-left{background-position:-168px -144px}.icon-hand-up{background-position:-192px -144px}.icon-hand-down{background-position:-216px -144px}.icon-circle-arrow-right{background-position:-240px -144px}.icon-circle-arrow-left{background-position:-264px -144px}.icon-circle-arrow-up{background-position:-288px -144px}.icon-circle-arrow-down{background-position:-312px -144px}.icon-globe{background-position:-336px -144px}.icon-wrench{background-position:-360px -144px}.icon-tasks{background-position:-384px -144px}.icon-filter{background-position:-408px -144px}.icon-briefcase{background-position:-432px -144px}.icon-fullscreen{background-position:-456px -144px}.dropup,.dropdown{position:relative}.dropdown-toggle{*margin-bottom:-3px}.dropdown-toggle:active,.open .dropdown-toggle{outline:0}.caret{display:inline-block;width:0;height:0;vertical-align:top;border-top:4px solid #000;border-right:4px solid transparent;border-left:4px solid transparent;content:""}.dropdown .caret{margin-top:8px;margin-left:2px}.dropdown-menu{position:absolute;top:100%;left:0;z-index:1000;display:none;float:left;min-width:160px;padding:5px 0;margin:2px 0 0;list-style:none;background-color:#fff;border:1px solid #ccc;border:1px solid rgba(0,0,0,0.2);*border-right-width:2px;*border-bottom-width:2px;-webkit-border-radius:6px;-moz-border-radius:6px;border-radius:6px;-webkit-box-shadow:0 5px 10px rgba(0,0,0,0.2);-moz-box-shadow:0 5px 10px rgba(0,0,0,0.2);box-shadow:0 5px 10px rgba(0,0,0,0.2);-webkit-background-clip:padding-box;-moz-background-clip:padding;background-clip:padding-box}.dropdown-menu.pull-right{right:0;left:auto}.dropdown-menu .divider{*width:100%;height:1px;margin:9px 1px;*margin:-5px 0 5px;overflow:hidden;background-color:#e5e5e5;border-bottom:1px solid #fff}.dropdown-menu>li>a{display:block;padding:3px 20px;clear:both;font-weight:normal;line-height:20px;color:#333;white-space:nowrap}.dropdown-menu>li>a:hover,.dropdown-menu>li>a:focus,.dropdown-submenu:hover>a,.dropdown-submenu:focus>a{color:#fff;text-decoration:none;background-color:#0081c2;background-image:-moz-linear-gradient(top,#08c,#0077b3);background-image:-webkit-gradient(linear,0 0,0 100%,from(#08c),to(#0077b3));background-image:-webkit-linear-gradient(top,#08c,#0077b3);background-image:-o-linear-gradient(top,#08c,#0077b3);background-image:linear-gradient(to bottom,#08c,#0077b3);background-repeat:repeat-x;filter:progid:DXImageTransform.Microsoft.gradient(startColorstr='#ff0088cc',endColorstr='#ff0077b3',GradientType=0)}.dropdown-menu>.active>a,.dropdown-menu>.active>a:hover,.dropdown-menu>.active>a:focus{color:#fff;text-decoration:none;background-color:#0081c2;background-image:-moz-linear-gradient(top,#08c,#0077b3);background-image:-webkit-gradient(linear,0 0,0 100%,from(#08c),to(#0077b3));background-image:-webkit-linear-gradient(top,#08c,#0077b3);background-image:-o-linear-gradient(top,#08c,#0077b3);background-image:linear-gradient(to bottom,#08c,#0077b3);background-repeat:repeat-x;outline:0;filter:progid:DXImageTransform.Microsoft.gradient(startColorstr='#ff0088cc',endColorstr='#ff0077b3',GradientType=0)}.dropdown-menu>.disabled>a,.dropdown-menu>.disabled>a:hover,.dropdown-menu>.disabled>a:focus{color:#999}.dropdown-menu>.disabled>a:hover,.dropdown-menu>.disabled>a:focus{text-decoration:none;cursor:default;background-color:transparent;background-image:none;filter:progid:DXImageTransform.Microsoft.gradient(enabled=false)}.open{*z-index:1000}.open>.dropdown-menu{display:block}.dropdown-backdrop{position:fixed;top:0;right:0;bottom:0;left:0;z-index:990}.pull-right>.dropdown-menu{right:0;left:auto}.dropup .caret,.navbar-fixed-bottom .dropdown .caret{border-top:0;border-bottom:4px solid #000;content:""}.dropup .dropdown-menu,.navbar-fixed-bottom .dropdown .dropdown-menu{top:auto;bottom:100%;margin-bottom:1px}.dropdown-submenu{position:relative}.dropdown-submenu>.dropdown-menu{top:0;left:100%;margin-top:-6px;margin-left:-1px;-webkit-border-radius:0 6px 6px 6px;-moz-border-radius:0 6px 6px 6px;border-radius:0 6px 6px 6px}.dropdown-submenu:hover>.dropdown-menu{display:block}.dropup .dropdown-submenu>.dropdown-menu{top:auto;bottom:0;margin-top:0;margin-bottom:-2px;-webkit-border-radius:5px 5px 5px 0;-moz-border-radius:5px 5px 5px 0;border-radius:5px 5px 5px 0}.dropdown-submenu>a:after{display:block;float:right;width:0;height:0;margin-top:5px;margin-right:-10px;border-color:transparent;border-left-color:#ccc;border-style:solid;border-width:5px 0 5px 5px;content:" "}.dropdown-submenu:hover>a:after{border-left-color:#fff}.dropdown-submenu.pull-left{float:none}.dropdown-submenu.pull-left>.dropdown-menu{left:-100%;margin-left:10px;-webkit-border-radius:6px 0 6px 6px;-moz-border-radius:6px 0 6px 6px;border-radius:6px 0 6px 6px}.dropdown .dropdown-menu .nav-header{padding-right:20px;padding-left:20px}.typeahead{z-index:1051;margin-top:2px;-webkit-border-radius:4px;-moz-border-radius:4px;border-radius:4px}.well{min-height:20px;padding:19px;margin-bottom:20px;background-color:#f5f5f5;border:1px solid #e3e3e3;-webkit-border-radius:4px;-moz-border-radius:4px;border-radius:4px;-webkit-box-shadow:inset 0 1px 1px rgba(0,0,0,0.05);-moz-box-shadow:inset 0 1px 1px rgba(0,0,0,0.05);box-shadow:inset 0 1px 1px rgba(0,0,0,0.05)}.well blockquote{border-color:#ddd;border-color:rgba(0,0,0,0.15)}.well-large{padding:24px;-webkit-border-radius:6px;-moz-border-radius:6px;border-radius:6px}.well-small{padding:9px;-webkit-border-radius:3px;-moz-border-radius:3px;border-radius:3px}.fade{opacity:0;-webkit-transition:opacity .15s linear;-moz-transition:opacity .15s linear;-o-transition:opacity .15s linear;transition:opacity .15s linear}.fade.in{opacity:1}.collapse{position:relative;height:0;overflow:hidden;-webkit-transition:height .35s ease;-moz-transition:height .35s ease;-o-transition:height .35s ease;transition:height .35s ease}.collapse.in{height:auto}.close{float:right;font-size:20px;font-weight:bold;line-height:20px;color:#000;text-shadow:0 1px 0 #fff;opacity:.2;filter:alpha(opacity=20)}.close:hover,.close:focus{color:#000;text-decoration:none;cursor:pointer;opacity:.4;filter:alpha(opacity=40)}button.close{padding:0;cursor:pointer;background:transparent;border:0;-webkit-appearance:none}.btn{display:inline-block;*display:inline;padding:4px 12px;margin-bottom:0;*margin-left:.3em;font-size:14px;line-height:20px;color:#333;text-align:center;text-shadow:0 1px 1px rgba(255,255,255,0.75);vertical-align:middle;cursor:pointer;background-color:#f5f5f5;*background-color:#e6e6e6;background-image:-moz-linear-gradient(top,#fff,#e6e6e6);background-image:-webkit-gradient(linear,0 0,0 100%,from(#fff),to(#e6e6e6));background-image:-webkit-linear-gradient(top,#fff,#e6e6e6);background-image:-o-linear-gradient(top,#fff,#e6e6e6);background-image:linear-gradient(to bottom,#fff,#e6e6e6);background-repeat:repeat-x;border:1px solid #ccc;*border:0;border-color:#e6e6e6 #e6e6e6 #bfbfbf;border-color:rgba(0,0,0,0.1) rgba(0,0,0,0.1) rgba(0,0,0,0.25);border-bottom-color:#b3b3b3;-webkit-border-radius:4px;-moz-border-radius:4px;border-radius:4px;filter:progid:DXImageTransform.Microsoft.gradient(startColorstr='#ffffffff',endColorstr='#ffe6e6e6',GradientType=0);filter:progid:DXImageTransform.Microsoft.gradient(enabled=false);*zoom:1;-webkit-box-shadow:inset 0 1px 0 rgba(255,255,255,0.2),0 1px 2px rgba(0,0,0,0.05);-moz-box-shadow:inset 0 1px 0 rgba(255,255,255,0.2),0 1px 2px rgba(0,0,0,0.05);box-shadow:inset 0 1px 0 rgba(255,255,255,0.2),0 1px 2px rgba(0,0,0,0.05)}.btn:hover,.btn:focus,.btn:active,.btn.active,.btn.disabled,.btn[disabled]{color:#333;background-color:#e6e6e6;*background-color:#d9d9d9}.btn:active,.btn.active{background-color:#ccc \9}.btn:first-child{*margin-left:0}.btn:hover,.btn:focus{color:#333;text-decoration:none;background-position:0 -15px;-webkit-transition:background-position .1s linear;-moz-transition:background-position .1s linear;-o-transition:background-position .1s linear;transition:background-position .1s linear}.btn:focus{outline:thin dotted #333;outline:5px auto -webkit-focus-ring-color;outline-offset:-2px}.btn.active,.btn:active{background-image:none;outline:0;-webkit-box-shadow:inset 0 2px 4px rgba(0,0,0,0.15),0 1px 2px rgba(0,0,0,0.05);-moz-box-shadow:inset 0 2px 4px rgba(0,0,0,0.15),0 1px 2px rgba(0,0,0,0.05);box-shadow:inset 0 2px 4px rgba(0,0,0,0.15),0 1px 2px rgba(0,0,0,0.05)}.btn.disabled,.btn[disabled]{cursor:default;background-image:none;opacity:.65;filter:alpha(opacity=65);-webkit-box-shadow:none;-moz-box-shadow:none;box-shadow:none}.btn-large{padding:11px 19px;font-size:17.5px;-webkit-border-radius:6px;-moz-border-radius:6px;border-radius:6px}.btn-large [class^="icon-"],.btn-large [class*=" icon-"]{margin-top:4px}.btn-small{padding:2px 10px;font-size:11.9px;-webkit-border-radius:3px;-moz-border-radius:3px;border-radius:3px}.btn-small [class^="icon-"],.btn-small [class*=" icon-"]{margin-top:0}.btn-mini [class^="icon-"],.btn-mini [class*=" icon-"]{margin-top:-1px}.btn-mini{padding:0 6px;font-size:10.5px;-webkit-border-radius:3px;-moz-border-radius:3px;border-radius:3px}.btn-block{display:block;width:100%;padding-right:0;padding-left:0;-webkit-box-sizing:border-box;-moz-box-sizing:border-box;box-sizing:border-box}.btn-block+.btn-block{margin-top:5px}input[type="submit"].btn-block,input[type="reset"].btn-block,input[type="button"].btn-block{width:100%}.btn-primary.active,.btn-warning.active,.btn-danger.active,.btn-success.active,.btn-info.active,.btn-inverse.active{color:rgba(255,255,255,0.75)}.btn-primary{color:#fff;text-shadow:0 -1px 0 rgba(0,0,0,0.25);background-color:#006dcc;*background-color:#04c;background-image:-moz-linear-gradient(top,#08c,#04c);background-image:-webkit-gradient(linear,0 0,0 100%,from(#08c),to(#04c));background-image:-webkit-linear-gradient(top,#08c,#04c);background-image:-o-linear-gradient(top,#08c,#04c);background-image:linear-gradient(to bottom,#08c,#04c);background-repeat:repeat-x;border-color:#04c #04c #002a80;border-color:rgba(0,0,0,0.1) rgba(0,0,0,0.1) rgba(0,0,0,0.25);filter:progid:DXImageTransform.Microsoft.gradient(startColorstr='#ff0088cc',endColorstr='#ff0044cc',GradientType=0);filter:progid:DXImageTransform.Microsoft.gradient(enabled=false)}.btn-primary:hover,.btn-primary:focus,.btn-primary:active,.btn-primary.active,.btn-primary.disabled,.btn-primary[disabled]{color:#fff;background-color:#04c;*background-color:#003bb3}.btn-primary:active,.btn-primary.active{background-color:#039 \9}.btn-warning{color:#fff;text-shadow:0 -1px 0 rgba(0,0,0,0.25);background-color:#faa732;*background-color:#f89406;background-image:-moz-linear-gradient(top,#fbb450,#f89406);background-image:-webkit-gradient(linear,0 0,0 100%,from(#fbb450),to(#f89406));background-image:-webkit-linear-gradient(top,#fbb450,#f89406);background-image:-o-linear-gradient(top,#fbb450,#f89406);background-image:linear-gradient(to bottom,#fbb450,#f89406);background-repeat:repeat-x;border-color:#f89406 #f89406 #ad6704;border-color:rgba(0,0,0,0.1) rgba(0,0,0,0.1) rgba(0,0,0,0.25);filter:progid:DXImageTransform.Microsoft.gradient(startColorstr='#fffbb450',endColorstr='#fff89406',GradientType=0);filter:progid:DXImageTransform.Microsoft.gradient(enabled=false)}.btn-warning:hover,.btn-warning:focus,.btn-warning:active,.btn-warning.active,.btn-warning.disabled,.btn-warning[disabled]{color:#fff;background-color:#f89406;*background-color:#df8505}.btn-warning:active,.btn-warning.active{background-color:#c67605 \9}.btn-danger{color:#fff;text-shadow:0 -1px 0 rgba(0,0,0,0.25);background-color:#da4f49;*background-color:#bd362f;background-image:-moz-linear-gradient(top,#ee5f5b,#bd362f);background-image:-webkit-gradient(linear,0 0,0 100%,from(#ee5f5b),to(#bd362f));background-image:-webkit-linear-gradient(top,#ee5f5b,#bd362f);background-image:-o-linear-gradient(top,#ee5f5b,#bd362f);background-image:linear-gradient(to bottom,#ee5f5b,#bd362f);background-repeat:repeat-x;border-color:#bd362f #bd362f #802420;border-color:rgba(0,0,0,0.1) rgba(0,0,0,0.1) rgba(0,0,0,0.25);filter:progid:DXImageTransform.Microsoft.gradient(startColorstr='#ffee5f5b',endColorstr='#ffbd362f',GradientType=0);filter:progid:DXImageTransform.Microsoft.gradient(enabled=false)}.btn-danger:hover,.btn-danger:focus,.btn-danger:active,.btn-danger.active,.btn-danger.disabled,.btn-danger[disabled]{color:#fff;background-color:#bd362f;*background-color:#a9302a}.btn-danger:active,.btn-danger.active{background-color:#942a25 \9}.btn-success{color:#fff;text-shadow:0 -1px 0 rgba(0,0,0,0.25);background-color:#5bb75b;*background-color:#51a351;background-image:-moz-linear-gradient(top,#62c462,#51a351);background-image:-webkit-gradient(linear,0 0,0 100%,from(#62c462),to(#51a351));background-image:-webkit-linear-gradient(top,#62c462,#51a351);background-image:-o-linear-gradient(top,#62c462,#51a351);background-image:linear-gradient(to bottom,#62c462,#51a351);background-repeat:repeat-x;border-color:#51a351 #51a351 #387038;border-color:rgba(0,0,0,0.1) rgba(0,0,0,0.1) rgba(0,0,0,0.25);filter:progid:DXImageTransform.Microsoft.gradient(startColorstr='#ff62c462',endColorstr='#ff51a351',GradientType=0);filter:progid:DXImageTransform.Microsoft.gradient(enabled=false)}.btn-success:hover,.btn-success:focus,.btn-success:active,.btn-success.active,.btn-success.disabled,.btn-success[disabled]{color:#fff;background-color:#51a351;*background-color:#499249}.btn-success:active,.btn-success.active{background-color:#408140 \9}.btn-info{color:#fff;text-shadow:0 -1px 0 rgba(0,0,0,0.25);background-color:#49afcd;*background-color:#2f96b4;background-image:-moz-linear-gradient(top,#5bc0de,#2f96b4);background-image:-webkit-gradient(linear,0 0,0 100%,from(#5bc0de),to(#2f96b4));background-image:-webkit-linear-gradient(top,#5bc0de,#2f96b4);background-image:-o-linear-gradient(top,#5bc0de,#2f96b4);background-image:linear-gradient(to bottom,#5bc0de,#2f96b4);background-repeat:repeat-x;border-color:#2f96b4 #2f96b4 #1f6377;border-color:rgba(0,0,0,0.1) rgba(0,0,0,0.1) rgba(0,0,0,0.25);filter:progid:DXImageTransform.Microsoft.gradient(startColorstr='#ff5bc0de',endColorstr='#ff2f96b4',GradientType=0);filter:progid:DXImageTransform.Microsoft.gradient(enabled=false)}.btn-info:hover,.btn-info:focus,.btn-info:active,.btn-info.active,.btn-info.disabled,.btn-info[disabled]{color:#fff;background-color:#2f96b4;*background-color:#2a85a0}.btn-info:active,.btn-info.active{background-color:#24748c \9}.btn-inverse{color:#fff;text-shadow:0 -1px 0 rgba(0,0,0,0.25);background-color:#363636;*background-color:#222;background-image:-moz-linear-gradient(top,#444,#222);background-image:-webkit-gradient(linear,0 0,0 100%,from(#444),to(#222));background-image:-webkit-linear-gradient(top,#444,#222);background-image:-o-linear-gradient(top,#444,#222);background-image:linear-gradient(to bottom,#444,#222);background-repeat:repeat-x;border-color:#222 #222 #000;border-color:rgba(0,0,0,0.1) rgba(0,0,0,0.1) rgba(0,0,0,0.25);filter:progid:DXImageTransform.Microsoft.gradient(startColorstr='#ff444444',endColorstr='#ff222222',GradientType=0);filter:progid:DXImageTransform.Microsoft.gradient(enabled=false)}.btn-inverse:hover,.btn-inverse:focus,.btn-inverse:active,.btn-inverse.active,.btn-inverse.disabled,.btn-inverse[disabled]{color:#fff;background-color:#222;*background-color:#151515}.btn-inverse:active,.btn-inverse.active{background-color:#080808 \9}button.btn,input[type="submit"].btn{*padding-top:3px;*padding-bottom:3px}button.btn::-moz-focus-inner,input[type="submit"].btn::-moz-focus-inner{padding:0;border:0}button.btn.btn-large,input[type="submit"].btn.btn-large{*padding-top:7px;*padding-bottom:7px}button.btn.btn-small,input[type="submit"].btn.btn-small{*padding-top:3px;*padding-bottom:3px}button.btn.btn-mini,input[type="submit"].btn.btn-mini{*padding-top:1px;*padding-bottom:1px}.btn-link,.btn-link:active,.btn-link[disabled]{background-color:transparent;background-image:none;-webkit-box-shadow:none;-moz-box-shadow:none;box-shadow:none}.btn-link{color:#08c;cursor:pointer;border-color:transparent;-webkit-border-radius:0;-moz-border-radius:0;border-radius:0}.btn-link:hover,.btn-link:focus{color:#005580;text-decoration:underline;background-color:transparent}.btn-link[disabled]:hover,.btn-link[disabled]:focus{color:#333;text-decoration:none}.btn-group{position:relative;display:inline-block;*display:inline;*margin-left:.3em;font-size:0;white-space:nowrap;vertical-align:middle;*zoom:1}.btn-group:first-child{*margin-left:0}.btn-group+.btn-group{margin-left:5px}.btn-toolbar{margin-top:10px;margin-bottom:10px;font-size:0}.btn-toolbar>.btn+.btn,.btn-toolbar>.btn-group+.btn,.btn-toolbar>.btn+.btn-group{margin-left:5px}.btn-group>.btn{position:relative;-webkit-border-radius:0;-moz-border-radius:0;border-radius:0}.btn-group>.btn+.btn{margin-left:-1px}.btn-group>.btn,.btn-group>.dropdown-menu,.btn-group>.popover{font-size:14px}.btn-group>.btn-mini{font-size:10.5px}.btn-group>.btn-small{font-size:11.9px}.btn-group>.btn-large{font-size:17.5px}.btn-group>.btn:first-child{margin-left:0;-webkit-border-bottom-left-radius:4px;border-bottom-left-radius:4px;-webkit-border-top-left-radius:4px;border-top-left-radius:4px;-moz-border-radius-bottomleft:4px;-moz-border-radius-topleft:4px}.btn-group>.btn:last-child,.btn-group>.dropdown-toggle{-webkit-border-top-right-radius:4px;border-top-right-radius:4px;-webkit-border-bottom-right-radius:4px;border-bottom-right-radius:4px;-moz-border-radius-topright:4px;-moz-border-radius-bottomright:4px}.btn-group>.btn.large:first-child{margin-left:0;-webkit-border-bottom-left-radius:6px;border-bottom-left-radius:6px;-webkit-border-top-left-radius:6px;border-top-left-radius:6px;-moz-border-radius-bottomleft:6px;-moz-border-radius-topleft:6px}.btn-group>.btn.large:last-child,.btn-group>.large.dropdown-toggle{-webkit-border-top-right-radius:6px;border-top-right-radius:6px;-webkit-border-bottom-right-radius:6px;border-bottom-right-radius:6px;-moz-border-radius-topright:6px;-moz-border-radius-bottomright:6px}.btn-group>.btn:hover,.btn-group>.btn:focus,.btn-group>.btn:active,.btn-group>.btn.active{z-index:2}.btn-group .dropdown-toggle:active,.btn-group.open .dropdown-toggle{outline:0}.btn-group>.btn+.dropdown-toggle{*padding-top:5px;padding-right:8px;*padding-bottom:5px;padding-left:8px;-webkit-box-shadow:inset 1px 0 0 rgba(255,255,255,0.125),inset 0 1px 0 rgba(255,255,255,0.2),0 1px 2px rgba(0,0,0,0.05);-moz-box-shadow:inset 1px 0 0 rgba(255,255,255,0.125),inset 0 1px 0 rgba(255,255,255,0.2),0 1px 2px rgba(0,0,0,0.05);box-shadow:inset 1px 0 0 rgba(255,255,255,0.125),inset 0 1px 0 rgba(255,255,255,0.2),0 1px 2px rgba(0,0,0,0.05)}.btn-group>.btn-mini+.dropdown-toggle{*padding-top:2px;padding-right:5px;*padding-bottom:2px;padding-left:5px}.btn-group>.btn-small+.dropdown-toggle{*padding-top:5px;*padding-bottom:4px}.btn-group>.btn-large+.dropdown-toggle{*padding-top:7px;padding-right:12px;*padding-bottom:7px;padding-left:12px}.btn-group.open .dropdown-toggle{background-image:none;-webkit-box-shadow:inset 0 2px 4px rgba(0,0,0,0.15),0 1px 2px rgba(0,0,0,0.05);-moz-box-shadow:inset 0 2px 4px rgba(0,0,0,0.15),0 1px 2px rgba(0,0,0,0.05);box-shadow:inset 0 2px 4px rgba(0,0,0,0.15),0 1px 2px rgba(0,0,0,0.05)}.btn-group.open .btn.dropdown-toggle{background-color:#e6e6e6}.btn-group.open .btn-primary.dropdown-toggle{background-color:#04c}.btn-group.open .btn-warning.dropdown-toggle{background-color:#f89406}.btn-group.open .btn-danger.dropdown-toggle{background-color:#bd362f}.btn-group.open .btn-success.dropdown-toggle{background-color:#51a351}.btn-group.open .btn-info.dropdown-toggle{background-color:#2f96b4}.btn-group.open .btn-inverse.dropdown-toggle{background-color:#222}.btn .caret{margin-top:8px;margin-left:0}.btn-large .caret{margin-top:6px}.btn-large .caret{border-top-width:5px;border-right-width:5px;border-left-width:5px}.btn-mini .caret,.btn-small .caret{margin-top:8px}.dropup .btn-large .caret{border-bottom-width:5px}.btn-primary .caret,.btn-warning .caret,.btn-danger .caret,.btn-info .caret,.btn-success .caret,.btn-inverse .caret{border-top-color:#fff;border-bottom-color:#fff}.btn-group-vertical{display:inline-block;*display:inline;*zoom:1}.btn-group-vertical>.btn{display:block;float:none;max-width:100%;-webkit-border-radius:0;-moz-border-radius:0;border-radius:0}.btn-group-vertical>.btn+.btn{margin-top:-1px;margin-left:0}.btn-group-vertical>.btn:first-child{-webkit-border-radius:4px 4px 0 0;-moz-border-radius:4px 4px 0 0;border-radius:4px 4px 0 0}.btn-group-vertical>.btn:last-child{-webkit-border-radius:0 0 4px 4px;-moz-border-radius:0 0 4px 4px;border-radius:0 0 4px 4px}.btn-group-vertical>.btn-large:first-child{-webkit-border-radius:6px 6px 0 0;-moz-border-radius:6px 6px 0 0;border-radius:6px 6px 0 0}.btn-group-vertical>.btn-large:last-child{-webkit-border-radius:0 0 6px 6px;-moz-border-radius:0 0 6px 6px;border-radius:0 0 6px 6px}.alert{padding:8px 35px 8px 14px;margin-bottom:20px;text-shadow:0 1px 0 rgba(255,255,255,0.5);background-color:#fcf8e3;border:1px solid #fbeed5;-webkit-border-radius:4px;-moz-border-radius:4px;border-radius:4px}.alert,.alert h4{color:#c09853}.alert h4{margin:0}.alert .close{position:relative;top:-2px;right:-21px;line-height:20px}.alert-success{color:#468847;background-color:#dff0d8;border-color:#d6e9c6}.alert-success h4{color:#468847}.alert-danger,.alert-error{color:#b94a48;background-color:#f2dede;border-color:#eed3d7}.alert-danger h4,.alert-error h4{color:#b94a48}.alert-info{color:#3a87ad;background-color:#d9edf7;border-color:#bce8f1}.alert-info h4{color:#3a87ad}.alert-block{padding-top:14px;padding-bottom:14px}.alert-block>p,.alert-block>ul{margin-bottom:0}.alert-block p+p{margin-top:5px}.nav{margin-bottom:20px;margin-left:0;list-style:none}.nav>li>a{display:block}.nav>li>a:hover,.nav>li>a:focus{text-decoration:none;background-color:#eee}.nav>li>a>img{max-width:none}.nav>.pull-right{float:right}.nav-header{display:block;padding:3px 15px;font-size:11px;font-weight:bold;line-height:20px;color:#999;text-shadow:0 1px 0 rgba(255,255,255,0.5);text-transform:uppercase}.nav li+.nav-header{margin-top:9px}.nav-list{padding-right:15px;padding-left:15px;margin-bottom:0}.nav-list>li>a,.nav-list .nav-header{margin-right:-15px;margin-left:-15px;text-shadow:0 1px 0 rgba(255,255,255,0.5)}.nav-list>li>a{padding:3px 15px}.nav-list>.active>a,.nav-list>.active>a:hover,.nav-list>.active>a:focus{color:#fff;text-shadow:0 -1px 0 rgba(0,0,0,0.2);background-color:#08c}.nav-list [class^="icon-"],.nav-list [class*=" icon-"]{margin-right:2px}.nav-list .divider{*width:100%;height:1px;margin:9px 1px;*margin:-5px 0 5px;overflow:hidden;background-color:#e5e5e5;border-bottom:1px solid #fff}.nav-tabs,.nav-pills{*zoom:1}.nav-tabs:before,.nav-pills:before,.nav-tabs:after,.nav-pills:after{display:table;line-height:0;content:""}.nav-tabs:after,.nav-pills:after{clear:both}.nav-tabs>li,.nav-pills>li{float:left}.nav-tabs>li>a,.nav-pills>li>a{padding-right:12px;padding-left:12px;margin-right:2px;line-height:14px}.nav-tabs{border-bottom:1px solid #ddd}.nav-tabs>li{margin-bottom:-1px}.nav-tabs>li>a{padding-top:8px;padding-bottom:8px;line-height:20px;border:1px solid transparent;-webkit-border-radius:4px 4px 0 0;-moz-border-radius:4px 4px 0 0;border-radius:4px 4px 0 0}.nav-tabs>li>a:hover,.nav-tabs>li>a:focus{border-color:#eee #eee #ddd}.nav-tabs>.active>a,.nav-tabs>.active>a:hover,.nav-tabs>.active>a:focus{color:#555;cursor:default;background-color:#fff;border:1px solid #ddd;border-bottom-color:transparent}.nav-pills>li>a{padding-top:8px;padding-bottom:8px;margin-top:2px;margin-bottom:2px;-webkit-border-radius:5px;-moz-border-radius:5px;border-radius:5px}.nav-pills>.active>a,.nav-pills>.active>a:hover,.nav-pills>.active>a:focus{color:#fff;background-color:#08c}.nav-stacked>li{float:none}.nav-stacked>li>a{margin-right:0}.nav-tabs.nav-stacked{border-bottom:0}.nav-tabs.nav-stacked>li>a{border:1px solid #ddd;-webkit-border-radius:0;-moz-border-radius:0;border-radius:0}.nav-tabs.nav-stacked>li:first-child>a{-webkit-border-top-right-radius:4px;border-top-right-radius:4px;-webkit-border-top-left-radius:4px;border-top-left-radius:4px;-moz-border-radius-topright:4px;-moz-border-radius-topleft:4px}.nav-tabs.nav-stacked>li:last-child>a{-webkit-border-bottom-right-radius:4px;border-bottom-right-radius:4px;-webkit-border-bottom-left-radius:4px;border-bottom-left-radius:4px;-moz-border-radius-bottomright:4px;-moz-border-radius-bottomleft:4px}.nav-tabs.nav-stacked>li>a:hover,.nav-tabs.nav-stacked>li>a:focus{z-index:2;border-color:#ddd}.nav-pills.nav-stacked>li>a{margin-bottom:3px}.nav-pills.nav-stacked>li:last-child>a{margin-bottom:1px}.nav-tabs .dropdown-menu{-webkit-border-radius:0 0 6px 6px;-moz-border-radius:0 0 6px 6px;border-radius:0 0 6px 6px}.nav-pills .dropdown-menu{-webkit-border-radius:6px;-moz-border-radius:6px;border-radius:6px}.nav .dropdown-toggle .caret{margin-top:6px;border-top-color:#08c;border-bottom-color:#08c}.nav .dropdown-toggle:hover .caret,.nav .dropdown-toggle:focus .caret{border-top-color:#005580;border-bottom-color:#005580}.nav-tabs .dropdown-toggle .caret{margin-top:8px}.nav .active .dropdown-toggle .caret{border-top-color:#fff;border-bottom-color:#fff}.nav-tabs .active .dropdown-toggle .caret{border-top-color:#555;border-bottom-color:#555}.nav>.dropdown.active>a:hover,.nav>.dropdown.active>a:focus{cursor:pointer}.nav-tabs .open .dropdown-toggle,.nav-pills .open .dropdown-toggle,.nav>li.dropdown.open.active>a:hover,.nav>li.dropdown.open.active>a:focus{color:#fff;background-color:#999;border-color:#999}.nav li.dropdown.open .caret,.nav li.dropdown.open.active .caret,.nav li.dropdown.open a:hover .caret,.nav li.dropdown.open a:focus .caret{border-top-color:#fff;border-bottom-color:#fff;opacity:1;filter:alpha(opacity=100)}.tabs-stacked .open>a:hover,.tabs-stacked .open>a:focus{border-color:#999}.tabbable{*zoom:1}.tabbable:before,.tabbable:after{display:table;line-height:0;content:""}.tabbable:after{clear:both}.tab-content{overflow:auto}.tabs-below>.nav-tabs,.tabs-right>.nav-tabs,.tabs-left>.nav-tabs{border-bottom:0}.tab-content>.tab-pane,.pill-content>.pill-pane{display:none}.tab-content>.active,.pill-content>.active{display:block}.tabs-below>.nav-tabs{border-top:1px solid #ddd}.tabs-below>.nav-tabs>li{margin-top:-1px;margin-bottom:0}.tabs-below>.nav-tabs>li>a{-webkit-border-radius:0 0 4px 4px;-moz-border-radius:0 0 4px 4px;border-radius:0 0 4px 4px}.tabs-below>.nav-tabs>li>a:hover,.tabs-below>.nav-tabs>li>a:focus{border-top-color:#ddd;border-bottom-color:transparent}.tabs-below>.nav-tabs>.active>a,.tabs-below>.nav-tabs>.active>a:hover,.tabs-below>.nav-tabs>.active>a:focus{border-color:transparent #ddd #ddd #ddd}.tabs-left>.nav-tabs>li,.tabs-right>.nav-tabs>li{float:none}.tabs-left>.nav-tabs>li>a,.tabs-right>.nav-tabs>li>a{min-width:74px;margin-right:0;margin-bottom:3px}.tabs-left>.nav-tabs{float:left;margin-right:19px;border-right:1px solid #ddd}.tabs-left>.nav-tabs>li>a{margin-right:-1px;-webkit-border-radius:4px 0 0 4px;-moz-border-radius:4px 0 0 4px;border-radius:4px 0 0 4px}.tabs-left>.nav-tabs>li>a:hover,.tabs-left>.nav-tabs>li>a:focus{border-color:#eee #ddd #eee #eee}.tabs-left>.nav-tabs .active>a,.tabs-left>.nav-tabs .active>a:hover,.tabs-left>.nav-tabs .active>a:focus{border-color:#ddd transparent #ddd #ddd;*border-right-color:#fff}.tabs-right>.nav-tabs{float:right;margin-left:19px;border-left:1px solid #ddd}.tabs-right>.nav-tabs>li>a{margin-left:-1px;-webkit-border-radius:0 4px 4px 0;-moz-border-radius:0 4px 4px 0;border-radius:0 4px 4px 0}.tabs-right>.nav-tabs>li>a:hover,.tabs-right>.nav-tabs>li>a:focus{border-color:#eee #eee #eee #ddd}.tabs-right>.nav-tabs .active>a,.tabs-right>.nav-tabs .active>a:hover,.tabs-right>.nav-tabs .active>a:focus{border-color:#ddd #ddd #ddd transparent;*border-left-color:#fff}.nav>.disabled>a{color:#999}.nav>.disabled>a:hover,.nav>.disabled>a:focus{text-decoration:none;cursor:default;background-color:transparent}.navbar{*position:relative;*z-index:2;margin-bottom:20px;overflow:visible}.navbar-inner{min-height:40px;padding-right:20px;padding-left:20px;background-color:#fafafa;background-image:-moz-linear-gradient(top,#fff,#f2f2f2);background-image:-webkit-gradient(linear,0 0,0 100%,from(#fff),to(#f2f2f2));background-image:-webkit-linear-gradient(top,#fff,#f2f2f2);background-image:-o-linear-gradient(top,#fff,#f2f2f2);background-image:linear-gradient(to bottom,#fff,#f2f2f2);background-repeat:repeat-x;border:1px solid #d4d4d4;-webkit-border-radius:4px;-moz-border-radius:4px;border-radius:4px;filter:progid:DXImageTransform.Microsoft.gradient(startColorstr='#ffffffff',endColorstr='#fff2f2f2',GradientType=0);*zoom:1;-webkit-box-shadow:0 1px 4px rgba(0,0,0,0.065);-moz-box-shadow:0 1px 4px rgba(0,0,0,0.065);box-shadow:0 1px 4px rgba(0,0,0,0.065)}.navbar-inner:before,.navbar-inner:after{display:table;line-height:0;content:""}.navbar-inner:after{clear:both}.navbar .container{width:auto}.nav-collapse.collapse{height:auto;overflow:visible}.navbar .brand{display:block;float:left;padding:10px 20px 10px;margin-left:-20px;font-size:20px;font-weight:200;color:#777;text-shadow:0 1px 0 #fff}.navbar .brand:hover,.navbar .brand:focus{text-decoration:none}.navbar-text{margin-bottom:0;line-height:40px;color:#777}.navbar-link{color:#777}.navbar-link:hover,.navbar-link:focus{color:#333}.navbar .divider-vertical{height:40px;margin:0 9px;border-right:1px solid #fff;border-left:1px solid #f2f2f2}.navbar .btn,.navbar .btn-group{margin-top:5px}.navbar .btn-group .btn,.navbar .input-prepend .btn,.navbar .input-append .btn,.navbar .input-prepend .btn-group,.navbar .input-append .btn-group{margin-top:0}.navbar-form{margin-bottom:0;*zoom:1}.navbar-form:before,.navbar-form:after{display:table;line-height:0;content:""}.navbar-form:after{clear:both}.navbar-form input,.navbar-form select,.navbar-form .radio,.navbar-form .checkbox{margin-top:5px}.navbar-form input,.navbar-form select,.navbar-form .btn{display:inline-block;margin-bottom:0}.navbar-form input[type="image"],.navbar-form input[type="checkbox"],.navbar-form input[type="radio"]{margin-top:3px}.navbar-form .input-append,.navbar-form .input-prepend{margin-top:5px;white-space:nowrap}.navbar-form .input-append input,.navbar-form .input-prepend input{margin-top:0}.navbar-search{position:relative;float:left;margin-top:5px;margin-bottom:0}.navbar-search .search-query{padding:4px 14px;margin-bottom:0;font-family:"Helvetica Neue",Helvetica,Arial,sans-serif;font-size:13px;font-weight:normal;line-height:1;-webkit-border-radius:15px;-moz-border-radius:15px;border-radius:15px}.navbar-static-top{position:static;margin-bottom:0}.navbar-static-top .navbar-inner{-webkit-border-radius:0;-moz-border-radius:0;border-radius:0}.navbar-fixed-top,.navbar-fixed-bottom{position:fixed;right:0;left:0;z-index:1030;margin-bottom:0}.navbar-fixed-top .navbar-inner,.navbar-static-top .navbar-inner{border-width:0 0 1px}.navbar-fixed-bottom .navbar-inner{border-width:1px 0 0}.navbar-fixed-top .navbar-inner,.navbar-fixed-bottom .navbar-inner{padding-right:0;padding-left:0;-webkit-border-radius:0;-moz-border-radius:0;border-radius:0}.navbar-static-top .container,.navbar-fixed-top .container,.navbar-fixed-bottom .container{width:940px}.navbar-fixed-top{top:0}.navbar-fixed-top .navbar-inner,.navbar-static-top .navbar-inner{-webkit-box-shadow:0 1px 10px rgba(0,0,0,0.1);-moz-box-shadow:0 1px 10px rgba(0,0,0,0.1);box-shadow:0 1px 10px rgba(0,0,0,0.1)}.navbar-fixed-bottom{bottom:0}.navbar-fixed-bottom .navbar-inner{-webkit-box-shadow:0 -1px 10px rgba(0,0,0,0.1);-moz-box-shadow:0 -1px 10px rgba(0,0,0,0.1);box-shadow:0 -1px 10px rgba(0,0,0,0.1)}.navbar .nav{position:relative;left:0;display:block;float:left;margin:0 10px 0 0}.navbar .nav.pull-right{float:right;margin-right:0}.navbar .nav>li{float:left}.navbar .nav>li>a{float:none;padding:10px 15px 10px;color:#777;text-decoration:none;text-shadow:0 1px 0 #fff}.navbar .nav .dropdown-toggle .caret{margin-top:8px}.navbar .nav>li>a:focus,.navbar .nav>li>a:hover{color:#333;text-decoration:none;background-color:transparent}.navbar .nav>.active>a,.navbar .nav>.active>a:hover,.navbar .nav>.active>a:focus{color:#555;text-decoration:none;background-color:#e5e5e5;-webkit-box-shadow:inset 0 3px 8px rgba(0,0,0,0.125);-moz-box-shadow:inset 0 3px 8px rgba(0,0,0,0.125);box-shadow:inset 0 3px 8px rgba(0,0,0,0.125)}.navbar .btn-navbar{display:none;float:right;padding:7px 10px;margin-right:5px;margin-left:5px;color:#fff;text-shadow:0 -1px 0 rgba(0,0,0,0.25);background-color:#ededed;*background-color:#e5e5e5;background-image:-moz-linear-gradient(top,#f2f2f2,#e5e5e5);background-image:-webkit-gradient(linear,0 0,0 100%,from(#f2f2f2),to(#e5e5e5));background-image:-webkit-linear-gradient(top,#f2f2f2,#e5e5e5);background-image:-o-linear-gradient(top,#f2f2f2,#e5e5e5);background-image:linear-gradient(to bottom,#f2f2f2,#e5e5e5);background-repeat:repeat-x;border-color:#e5e5e5 #e5e5e5 #bfbfbf;border-color:rgba(0,0,0,0.1) rgba(0,0,0,0.1) rgba(0,0,0,0.25);filter:progid:DXImageTransform.Microsoft.gradient(startColorstr='#fff2f2f2',endColorstr='#ffe5e5e5',GradientType=0);filter:progid:DXImageTransform.Microsoft.gradient(enabled=false);-webkit-box-shadow:inset 0 1px 0 rgba(255,255,255,0.1),0 1px 0 rgba(255,255,255,0.075);-moz-box-shadow:inset 0 1px 0 rgba(255,255,255,0.1),0 1px 0 rgba(255,255,255,0.075);box-shadow:inset 0 1px 0 rgba(255,255,255,0.1),0 1px 0 rgba(255,255,255,0.075)}.navbar .btn-navbar:hover,.navbar .btn-navbar:focus,.navbar .btn-navbar:active,.navbar .btn-navbar.active,.navbar .btn-navbar.disabled,.navbar .btn-navbar[disabled]{color:#fff;background-color:#e5e5e5;*background-color:#d9d9d9}.navbar .btn-navbar:active,.navbar .btn-navbar.active{background-color:#ccc \9}.navbar .btn-navbar .icon-bar{display:block;width:18px;height:2px;background-color:#f5f5f5;-webkit-border-radius:1px;-moz-border-radius:1px;border-radius:1px;-webkit-box-shadow:0 1px 0 rgba(0,0,0,0.25);-moz-box-shadow:0 1px 0 rgba(0,0,0,0.25);box-shadow:0 1px 0 rgba(0,0,0,0.25)}.btn-navbar .icon-bar+.icon-bar{margin-top:3px}.navbar .nav>li>.dropdown-menu:before{position:absolute;top:-7px;left:9px;display:inline-block;border-right:7px solid transparent;border-bottom:7px solid #ccc;border-left:7px solid transparent;border-bottom-color:rgba(0,0,0,0.2);content:''}.navbar .nav>li>.dropdown-menu:after{position:absolute;top:-6px;left:10px;display:inline-block;border-right:6px solid transparent;border-bottom:6px solid #fff;border-left:6px solid transparent;content:''}.navbar-fixed-bottom .nav>li>.dropdown-menu:before{top:auto;bottom:-7px;border-top:7px solid #ccc;border-bottom:0;border-top-color:rgba(0,0,0,0.2)}.navbar-fixed-bottom .nav>li>.dropdown-menu:after{top:auto;bottom:-6px;border-top:6px solid #fff;border-bottom:0}.navbar .nav li.dropdown>a:hover .caret,.navbar .nav li.dropdown>a:focus .caret{border-top-color:#333;border-bottom-color:#333}.navbar .nav li.dropdown.open>.dropdown-toggle,.navbar .nav li.dropdown.active>.dropdown-toggle,.navbar .nav li.dropdown.open.active>.dropdown-toggle{color:#555;background-color:#e5e5e5}.navbar .nav li.dropdown>.dropdown-toggle .caret{border-top-color:#777;border-bottom-color:#777}.navbar .nav li.dropdown.open>.dropdown-toggle .caret,.navbar .nav li.dropdown.active>.dropdown-toggle .caret,.navbar .nav li.dropdown.open.active>.dropdown-toggle .caret{border-top-color:#555;border-bottom-color:#555}.navbar .pull-right>li>.dropdown-menu,.navbar .nav>li>.dropdown-menu.pull-right{right:0;left:auto}.navbar .pull-right>li>.dropdown-menu:before,.navbar .nav>li>.dropdown-menu.pull-right:before{right:12px;left:auto}.navbar .pull-right>li>.dropdown-menu:after,.navbar .nav>li>.dropdown-menu.pull-right:after{right:13px;left:auto}.navbar .pull-right>li>.dropdown-menu .dropdown-menu,.navbar .nav>li>.dropdown-menu.pull-right .dropdown-menu{right:100%;left:auto;margin-right:-1px;margin-left:0;-webkit-border-radius:6px 0 6px 6px;-moz-border-radius:6px 0 6px 6px;border-radius:6px 0 6px 6px}.navbar-inverse .navbar-inner{background-color:#1b1b1b;background-image:-moz-linear-gradient(top,#222,#111);background-image:-webkit-gradient(linear,0 0,0 100%,from(#222),to(#111));background-image:-webkit-linear-gradient(top,#222,#111);background-image:-o-linear-gradient(top,#222,#111);background-image:linear-gradient(to bottom,#222,#111);background-repeat:repeat-x;border-color:#252525;filter:progid:DXImageTransform.Microsoft.gradient(startColorstr='#ff222222',endColorstr='#ff111111',GradientType=0)}.navbar-inverse .brand,.navbar-inverse .nav>li>a{color:#999;text-shadow:0 -1px 0 rgba(0,0,0,0.25)}.navbar-inverse .brand:hover,.navbar-inverse .nav>li>a:hover,.navbar-inverse .brand:focus,.navbar-inverse .nav>li>a:focus{color:#fff}.navbar-inverse .brand{color:#999}.navbar-inverse .navbar-text{color:#999}.navbar-inverse .nav>li>a:focus,.navbar-inverse .nav>li>a:hover{color:#fff;background-color:transparent}.navbar-inverse .nav .active>a,.navbar-inverse .nav .active>a:hover,.navbar-inverse .nav .active>a:focus{color:#fff;background-color:#111}.navbar-inverse .navbar-link{color:#999}.navbar-inverse .navbar-link:hover,.navbar-inverse .navbar-link:focus{color:#fff}.navbar-inverse .divider-vertical{border-right-color:#222;border-left-color:#111}.navbar-inverse .nav li.dropdown.open>.dropdown-toggle,.navbar-inverse .nav li.dropdown.active>.dropdown-toggle,.navbar-inverse .nav li.dropdown.open.active>.dropdown-toggle{color:#fff;background-color:#111}.navbar-inverse .nav li.dropdown>a:hover .caret,.navbar-inverse .nav li.dropdown>a:focus .caret{border-top-color:#fff;border-bottom-color:#fff}.navbar-inverse .nav li.dropdown>.dropdown-toggle .caret{border-top-color:#999;border-bottom-color:#999}.navbar-inverse .nav li.dropdown.open>.dropdown-toggle .caret,.navbar-inverse .nav li.dropdown.active>.dropdown-toggle .caret,.navbar-inverse .nav li.dropdown.open.active>.dropdown-toggle .caret{border-top-color:#fff;border-bottom-color:#fff}.navbar-inverse .navbar-search .search-query{color:#fff;background-color:#515151;border-color:#111;-webkit-box-shadow:inset 0 1px 2px rgba(0,0,0,0.1),0 1px 0 rgba(255,255,255,0.15);-moz-box-shadow:inset 0 1px 2px rgba(0,0,0,0.1),0 1px 0 rgba(255,255,255,0.15);box-shadow:inset 0 1px 2px rgba(0,0,0,0.1),0 1px 0 rgba(255,255,255,0.15);-webkit-transition:none;-moz-transition:none;-o-transition:none;transition:none}.navbar-inverse .navbar-search .search-query:-moz-placeholder{color:#ccc}.navbar-inverse .navbar-search .search-query:-ms-input-placeholder{color:#ccc}.navbar-inverse .navbar-search .search-query::-webkit-input-placeholder{color:#ccc}.navbar-inverse .navbar-search .search-query:focus,.navbar-inverse .navbar-search .search-query.focused{padding:5px 15px;color:#333;text-shadow:0 1px 0 #fff;background-color:#fff;border:0;outline:0;-webkit-box-shadow:0 0 3px rgba(0,0,0,0.15);-moz-box-shadow:0 0 3px rgba(0,0,0,0.15);box-shadow:0 0 3px rgba(0,0,0,0.15)}.navbar-inverse .btn-navbar{color:#fff;text-shadow:0 -1px 0 rgba(0,0,0,0.25);background-color:#0e0e0e;*background-color:#040404;background-image:-moz-linear-gradient(top,#151515,#040404);background-image:-webkit-gradient(linear,0 0,0 100%,from(#151515),to(#040404));background-image:-webkit-linear-gradient(top,#151515,#040404);background-image:-o-linear-gradient(top,#151515,#040404);background-image:linear-gradient(to bottom,#151515,#040404);background-repeat:repeat-x;border-color:#040404 #040404 #000;border-color:rgba(0,0,0,0.1) rgba(0,0,0,0.1) rgba(0,0,0,0.25);filter:progid:DXImageTransform.Microsoft.gradient(startColorstr='#ff151515',endColorstr='#ff040404',GradientType=0);filter:progid:DXImageTransform.Microsoft.gradient(enabled=false)}.navbar-inverse .btn-navbar:hover,.navbar-inverse .btn-navbar:focus,.navbar-inverse .btn-navbar:active,.navbar-inverse .btn-navbar.active,.navbar-inverse .btn-navbar.disabled,.navbar-inverse .btn-navbar[disabled]{color:#fff;background-color:#040404;*background-color:#000}.navbar-inverse .btn-navbar:active,.navbar-inverse .btn-navbar.active{background-color:#000 \9}.breadcrumb{padding:8px 15px;margin:0 0 20px;list-style:none;background-color:#f5f5f5;-webkit-border-radius:4px;-moz-border-radius:4px;border-radius:4px}.breadcrumb>li{display:inline-block;*display:inline;text-shadow:0 1px 0 #fff;*zoom:1}.breadcrumb>li>.divider{padding:0 5px;color:#ccc}.breadcrumb>.active{color:#999}.pagination{margin:20px 0}.pagination ul{display:inline-block;*display:inline;margin-bottom:0;margin-left:0;-webkit-border-radius:4px;-moz-border-radius:4px;border-radius:4px;*zoom:1;-webkit-box-shadow:0 1px 2px rgba(0,0,0,0.05);-moz-box-shadow:0 1px 2px rgba(0,0,0,0.05);box-shadow:0 1px 2px rgba(0,0,0,0.05)}.pagination ul>li{display:inline}.pagination ul>li>a,.pagination ul>li>span{float:left;padding:4px 12px;line-height:20px;text-decoration:none;background-color:#fff;border:1px solid #ddd;border-left-width:0}.pagination ul>li>a:hover,.pagination ul>li>a:focus,.pagination ul>.active>a,.pagination ul>.active>span{background-color:#f5f5f5}.pagination ul>.active>a,.pagination ul>.active>span{color:#999;cursor:default}.pagination ul>.disabled>span,.pagination ul>.disabled>a,.pagination ul>.disabled>a:hover,.pagination ul>.disabled>a:focus{color:#999;cursor:default;background-color:transparent}.pagination ul>li:first-child>a,.pagination ul>li:first-child>span{border-left-width:1px;-webkit-border-bottom-left-radius:4px;border-bottom-left-radius:4px;-webkit-border-top-left-radius:4px;border-top-left-radius:4px;-moz-border-radius-bottomleft:4px;-moz-border-radius-topleft:4px}.pagination ul>li:last-child>a,.pagination ul>li:last-child>span{-webkit-border-top-right-radius:4px;border-top-right-radius:4px;-webkit-border-bottom-right-radius:4px;border-bottom-right-radius:4px;-moz-border-radius-topright:4px;-moz-border-radius-bottomright:4px}.pagination-centered{text-align:center}.pagination-right{text-align:right}.pagination-large ul>li>a,.pagination-large ul>li>span{padding:11px 19px;font-size:17.5px}.pagination-large ul>li:first-child>a,.pagination-large ul>li:first-child>span{-webkit-border-bottom-left-radius:6px;border-bottom-left-radius:6px;-webkit-border-top-left-radius:6px;border-top-left-radius:6px;-moz-border-radius-bottomleft:6px;-moz-border-radius-topleft:6px}.pagination-large ul>li:last-child>a,.pagination-large ul>li:last-child>span{-webkit-border-top-right-radius:6px;border-top-right-radius:6px;-webkit-border-bottom-right-radius:6px;border-bottom-right-radius:6px;-moz-border-radius-topright:6px;-moz-border-radius-bottomright:6px}.pagination-mini ul>li:first-child>a,.pagination-small ul>li:first-child>a,.pagination-mini ul>li:first-child>span,.pagination-small ul>li:first-child>span{-webkit-border-bottom-left-radius:3px;border-bottom-left-radius:3px;-webkit-border-top-left-radius:3px;border-top-left-radius:3px;-moz-border-radius-bottomleft:3px;-moz-border-radius-topleft:3px}.pagination-mini ul>li:last-child>a,.pagination-small ul>li:last-child>a,.pagination-mini ul>li:last-child>span,.pagination-small ul>li:last-child>span{-webkit-border-top-right-radius:3px;border-top-right-radius:3px;-webkit-border-bottom-right-radius:3px;border-bottom-right-radius:3px;-moz-border-radius-topright:3px;-moz-border-radius-bottomright:3px}.pagination-small ul>li>a,.pagination-small ul>li>span{padding:2px 10px;font-size:11.9px}.pagination-mini ul>li>a,.pagination-mini ul>li>span{padding:0 6px;font-size:10.5px}.pager{margin:20px 0;text-align:center;list-style:none;*zoom:1}.pager:before,.pager:after{display:table;line-height:0;content:""}.pager:after{clear:both}.pager li{display:inline}.pager li>a,.pager li>span{display:inline-block;padding:5px 14px;background-color:#fff;border:1px solid #ddd;-webkit-border-radius:15px;-moz-border-radius:15px;border-radius:15px}.pager li>a:hover,.pager li>a:focus{text-decoration:none;background-color:#f5f5f5}.pager .next>a,.pager .next>span{float:right}.pager .previous>a,.pager .previous>span{float:left}.pager .disabled>a,.pager .disabled>a:hover,.pager .disabled>a:focus,.pager .disabled>span{color:#999;cursor:default;background-color:#fff}.modal-backdrop{position:fixed;top:0;right:0;bottom:0;left:0;z-index:1040;background-color:#000}.modal-backdrop.fade{opacity:0}.modal-backdrop,.modal-backdrop.fade.in{opacity:.8;filter:alpha(opacity=80)}.modal{position:fixed;top:10%;left:50%;z-index:1050;width:560px;margin-left:-280px;background-color:#fff;border:1px solid #999;border:1px solid rgba(0,0,0,0.3);*border:1px solid #999;-webkit-border-radius:6px;-moz-border-radius:6px;border-radius:6px;outline:0;-webkit-box-shadow:0 3px 7px rgba(0,0,0,0.3);-moz-box-shadow:0 3px 7px rgba(0,0,0,0.3);box-shadow:0 3px 7px rgba(0,0,0,0.3);-webkit-background-clip:padding-box;-moz-background-clip:padding-box;background-clip:padding-box}.modal.fade{top:-25%;-webkit-transition:opacity .3s linear,top .3s ease-out;-moz-transition:opacity .3s linear,top .3s ease-out;-o-transition:opacity .3s linear,top .3s ease-out;transition:opacity .3s linear,top .3s ease-out}.modal.fade.in{top:10%}.modal-header{padding:9px 15px;border-bottom:1px solid #eee}.modal-header .close{margin-top:2px}.modal-header h3{margin:0;line-height:30px}.modal-body{position:relative;max-height:400px;padding:15px;overflow-y:auto}.modal-form{margin-bottom:0}.modal-footer{padding:14px 15px 15px;margin-bottom:0;text-align:right;background-color:#f5f5f5;border-top:1px solid #ddd;-webkit-border-radius:0 0 6px 6px;-moz-border-radius:0 0 6px 6px;border-radius:0 0 6px 6px;*zoom:1;-webkit-box-shadow:inset 0 1px 0 #fff;-moz-box-shadow:inset 0 1px 0 #fff;box-shadow:inset 0 1px 0 #fff}.modal-footer:before,.modal-footer:after{display:table;line-height:0;content:""}.modal-footer:after{clear:both}.modal-footer .btn+.btn{margin-bottom:0;margin-left:5px}.modal-footer .btn-group .btn+.btn{margin-left:-1px}.modal-footer .btn-block+.btn-block{margin-left:0}.tooltip{position:absolute;z-index:1030;display:block;font-size:11px;line-height:1.4;opacity:0;filter:alpha(opacity=0);visibility:visible}.tooltip.in{opacity:.8;filter:alpha(opacity=80)}.tooltip.top{padding:5px 0;margin-top:-3px}.tooltip.right{padding:0 5px;margin-left:3px}.tooltip.bottom{padding:5px 0;margin-top:3px}.tooltip.left{padding:0 5px;margin-left:-3px}.tooltip-inner{max-width:200px;padding:8px;color:#fff;text-align:center;text-decoration:none;background-color:#000;-webkit-border-radius:4px;-moz-border-radius:4px;border-radius:4px}.tooltip-arrow{position:absolute;width:0;height:0;border-color:transparent;border-style:solid}.tooltip.top .tooltip-arrow{bottom:0;left:50%;margin-left:-5px;border-top-color:#000;border-width:5px 5px 0}.tooltip.right .tooltip-arrow{top:50%;left:0;margin-top:-5px;border-right-color:#000;border-width:5px 5px 5px 0}.tooltip.left .tooltip-arrow{top:50%;right:0;margin-top:-5px;border-left-color:#000;border-width:5px 0 5px 5px}.tooltip.bottom .tooltip-arrow{top:0;left:50%;margin-left:-5px;border-bottom-color:#000;border-width:0 5px 5px}.popover{position:absolute;top:0;left:0;z-index:1010;display:none;max-width:276px;padding:1px;text-align:left;white-space:normal;background-color:#fff;border:1px solid #ccc;border:1px solid rgba(0,0,0,0.2);-webkit-border-radius:6px;-moz-border-radius:6px;border-radius:6px;-webkit-box-shadow:0 5px 10px rgba(0,0,0,0.2);-moz-box-shadow:0 5px 10px rgba(0,0,0,0.2);box-shadow:0 5px 10px rgba(0,0,0,0.2);-webkit-background-clip:padding-box;-moz-background-clip:padding;background-clip:padding-box}.popover.top{margin-top:-10px}.popover.right{margin-left:10px}.popover.bottom{margin-top:10px}.popover.left{margin-left:-10px}.popover-title{padding:8px 14px;margin:0;font-size:14px;font-weight:normal;line-height:18px;background-color:#f7f7f7;border-bottom:1px solid #ebebeb;-webkit-border-radius:5px 5px 0 0;-moz-border-radius:5px 5px 0 0;border-radius:5px 5px 0 0}.popover-title:empty{display:none}.popover-content{padding:9px 14px}.popover .arrow,.popover .arrow:after{position:absolute;display:block;width:0;height:0;border-color:transparent;border-style:solid}.popover .arrow{border-width:11px}.popover .arrow:after{border-width:10px;content:""}.popover.top .arrow{bottom:-11px;left:50%;margin-left:-11px;border-top-color:#999;border-top-color:rgba(0,0,0,0.25);border-bottom-width:0}.popover.top .arrow:after{bottom:1px;margin-left:-10px;border-top-color:#fff;border-bottom-width:0}.popover.right .arrow{top:50%;left:-11px;margin-top:-11px;border-right-color:#999;border-right-color:rgba(0,0,0,0.25);border-left-width:0}.popover.right .arrow:after{bottom:-10px;left:1px;border-right-color:#fff;border-left-width:0}.popover.bottom .arrow{top:-11px;left:50%;margin-left:-11px;border-bottom-color:#999;border-bottom-color:rgba(0,0,0,0.25);border-top-width:0}.popover.bottom .arrow:after{top:1px;margin-left:-10px;border-bottom-color:#fff;border-top-width:0}.popover.left .arrow{top:50%;right:-11px;margin-top:-11px;border-left-color:#999;border-left-color:rgba(0,0,0,0.25);border-right-width:0}.popover.left .arrow:after{right:1px;bottom:-10px;border-left-color:#fff;border-right-width:0}.thumbnails{margin-left:-20px;list-style:none;*zoom:1}.thumbnails:before,.thumbnails:after{display:table;line-height:0;content:""}.thumbnails:after{clear:both}.row-fluid .thumbnails{margin-left:0}.thumbnails>li{float:left;margin-bottom:20px;margin-left:20px}.thumbnail{display:block;padding:4px;line-height:20px;border:1px solid #ddd;-webkit-border-radius:4px;-moz-border-radius:4px;border-radius:4px;-webkit-box-shadow:0 1px 3px rgba(0,0,0,0.055);-moz-box-shadow:0 1px 3px rgba(0,0,0,0.055);box-shadow:0 1px 3px rgba(0,0,0,0.055);-webkit-transition:all .2s ease-in-out;-moz-transition:all .2s ease-in-out;-o-transition:all .2s ease-in-out;transition:all .2s ease-in-out}a.thumbnail:hover,a.thumbnail:focus{border-color:#08c;-webkit-box-shadow:0 1px 4px rgba(0,105,214,0.25);-moz-box-shadow:0 1px 4px rgba(0,105,214,0.25);box-shadow:0 1px 4px rgba(0,105,214,0.25)}.thumbnail>img{display:block;max-width:100%;margin-right:auto;margin-left:auto}.thumbnail .caption{padding:9px;color:#555}.media,.media-body{overflow:hidden;*overflow:visible;zoom:1}.media,.media .media{margin-top:15px}.media:first-child{margin-top:0}.media-object{display:block}.media-heading{margin:0 0 5px}.media>.pull-left{margin-right:10px}.media>.pull-right{margin-left:10px}.media-list{margin-left:0;list-style:none}.label,.badge{display:inline-block;padding:2px 4px;font-size:11.844px;font-weight:bold;line-height:14px;color:#fff;text-shadow:0 -1px 0 rgba(0,0,0,0.25);white-space:nowrap;vertical-align:baseline;background-color:#999}.label{-webkit-border-radius:3px;-moz-border-radius:3px;border-radius:3px}.badge{padding-right:9px;padding-left:9px;-webkit-border-radius:9px;-moz-border-radius:9px;border-radius:9px}.label:empty,.badge:empty{display:none}a.label:hover,a.label:focus,a.badge:hover,a.badge:focus{color:#fff;text-decoration:none;cursor:pointer}.label-important,.badge-important{background-color:#b94a48}.label-important[href],.badge-important[href]{background-color:#953b39}.label-warning,.badge-warning{background-color:#f89406}.label-warning[href],.badge-warning[href]{background-color:#c67605}.label-success,.badge-success{background-color:#468847}.label-success[href],.badge-success[href]{background-color:#356635}.label-info,.badge-info{background-color:#3a87ad}.label-info[href],.badge-info[href]{background-color:#2d6987}.label-inverse,.badge-inverse{background-color:#333}.label-inverse[href],.badge-inverse[href]{background-color:#1a1a1a}.btn .label,.btn .badge{position:relative;top:-1px}.btn-mini .label,.btn-mini .badge{top:0}@-webkit-keyframes progress-bar-stripes{from{background-position:40px 0}to{background-position:0 0}}@-moz-keyframes progress-bar-stripes{from{background-position:40px 0}to{background-position:0 0}}@-ms-keyframes progress-bar-stripes{from{background-position:40px 0}to{background-position:0 0}}@-o-keyframes progress-bar-stripes{from{background-position:0 0}to{background-position:40px 0}}@keyframes progress-bar-stripes{from{background-position:40px 0}to{background-position:0 0}}.progress{height:20px;margin-bottom:20px;overflow:hidden;background-color:#f7f7f7;background-image:-moz-linear-gradient(top,#f5f5f5,#f9f9f9);background-image:-webkit-gradient(linear,0 0,0 100%,from(#f5f5f5),to(#f9f9f9));background-image:-webkit-linear-gradient(top,#f5f5f5,#f9f9f9);background-image:-o-linear-gradient(top,#f5f5f5,#f9f9f9);background-image:linear-gradient(to bottom,#f5f5f5,#f9f9f9);background-repeat:repeat-x;-webkit-border-radius:4px;-moz-border-radius:4px;border-radius:4px;filter:progid:DXImageTransform.Microsoft.gradient(startColorstr='#fff5f5f5',endColorstr='#fff9f9f9',GradientType=0);-webkit-box-shadow:inset 0 1px 2px rgba(0,0,0,0.1);-moz-box-shadow:inset 0 1px 2px rgba(0,0,0,0.1);box-shadow:inset 0 1px 2px rgba(0,0,0,0.1)}.progress .bar{float:left;width:0;height:100%;font-size:12px;color:#fff;text-align:center;text-shadow:0 -1px 0 rgba(0,0,0,0.25);background-color:#0e90d2;background-image:-moz-linear-gradient(top,#149bdf,#0480be);background-image:-webkit-gradient(linear,0 0,0 100%,from(#149bdf),to(#0480be));background-image:-webkit-linear-gradient(top,#149bdf,#0480be);background-image:-o-linear-gradient(top,#149bdf,#0480be);background-image:linear-gradient(to bottom,#149bdf,#0480be);background-repeat:repeat-x;filter:progid:DXImageTransform.Microsoft.gradient(startColorstr='#ff149bdf',endColorstr='#ff0480be',GradientType=0);-webkit-box-shadow:inset 0 -1px 0 rgba(0,0,0,0.15);-moz-box-shadow:inset 0 -1px 0 rgba(0,0,0,0.15);box-shadow:inset 0 -1px 0 rgba(0,0,0,0.15);-webkit-box-sizing:border-box;-moz-box-sizing:border-box;box-sizing:border-box;-webkit-transition:width .6s ease;-moz-transition:width .6s ease;-o-transition:width .6s ease;transition:width .6s ease}.progress .bar+.bar{-webkit-box-shadow:inset 1px 0 0 rgba(0,0,0,0.15),inset 0 -1px 0 rgba(0,0,0,0.15);-moz-box-shadow:inset 1px 0 0 rgba(0,0,0,0.15),inset 0 -1px 0 rgba(0,0,0,0.15);box-shadow:inset 1px 0 0 rgba(0,0,0,0.15),inset 0 -1px 0 rgba(0,0,0,0.15)}.progress-striped .bar{background-color:#149bdf;background-image:-webkit-gradient(linear,0 100%,100% 0,color-stop(0.25,rgba(255,255,255,0.15)),color-stop(0.25,transparent),color-stop(0.5,transparent),color-stop(0.5,rgba(255,255,255,0.15)),color-stop(0.75,rgba(255,255,255,0.15)),color-stop(0.75,transparent),to(transparent));background-image:-webkit-linear-gradient(45deg,rgba(255,255,255,0.15) 25%,transparent 25%,transparent 50%,rgba(255,255,255,0.15) 50%,rgba(255,255,255,0.15) 75%,transparent 75%,transparent);background-image:-moz-linear-gradient(45deg,rgba(255,255,255,0.15) 25%,transparent 25%,transparent 50%,rgba(255,255,255,0.15) 50%,rgba(255,255,255,0.15) 75%,transparent 75%,transparent);background-image:-o-linear-gradient(45deg,rgba(255,255,255,0.15) 25%,transparent 25%,transparent 50%,rgba(255,255,255,0.15) 50%,rgba(255,255,255,0.15) 75%,transparent 75%,transparent);background-image:linear-gradient(45deg,rgba(255,255,255,0.15) 25%,transparent 25%,transparent 50%,rgba(255,255,255,0.15) 50%,rgba(255,255,255,0.15) 75%,transparent 75%,transparent);-webkit-background-size:40px 40px;-moz-background-size:40px 40px;-o-background-size:40px 40px;background-size:40px 40px}.progress.active .bar{-webkit-animation:progress-bar-stripes 2s linear infinite;-moz-animation:progress-bar-stripes 2s linear infinite;-ms-animation:progress-bar-stripes 2s linear infinite;-o-animation:progress-bar-stripes 2s linear infinite;animation:progress-bar-stripes 2s linear infinite}.progress-danger .bar,.progress .bar-danger{background-color:#dd514c;background-image:-moz-linear-gradient(top,#ee5f5b,#c43c35);background-image:-webkit-gradient(linear,0 0,0 100%,from(#ee5f5b),to(#c43c35));background-image:-webkit-linear-gradient(top,#ee5f5b,#c43c35);background-image:-o-linear-gradient(top,#ee5f5b,#c43c35);background-image:linear-gradient(to bottom,#ee5f5b,#c43c35);background-repeat:repeat-x;filter:progid:DXImageTransform.Microsoft.gradient(startColorstr='#ffee5f5b',endColorstr='#ffc43c35',GradientType=0)}.progress-danger.progress-striped .bar,.progress-striped .bar-danger{background-color:#ee5f5b;background-image:-webkit-gradient(linear,0 100%,100% 0,color-stop(0.25,rgba(255,255,255,0.15)),color-stop(0.25,transparent),color-stop(0.5,transparent),color-stop(0.5,rgba(255,255,255,0.15)),color-stop(0.75,rgba(255,255,255,0.15)),color-stop(0.75,transparent),to(transparent));background-image:-webkit-linear-gradient(45deg,rgba(255,255,255,0.15) 25%,transparent 25%,transparent 50%,rgba(255,255,255,0.15) 50%,rgba(255,255,255,0.15) 75%,transparent 75%,transparent);background-image:-moz-linear-gradient(45deg,rgba(255,255,255,0.15) 25%,transparent 25%,transparent 50%,rgba(255,255,255,0.15) 50%,rgba(255,255,255,0.15) 75%,transparent 75%,transparent);background-image:-o-linear-gradient(45deg,rgba(255,255,255,0.15) 25%,transparent 25%,transparent 50%,rgba(255,255,255,0.15) 50%,rgba(255,255,255,0.15) 75%,transparent 75%,transparent);background-image:linear-gradient(45deg,rgba(255,255,255,0.15) 25%,transparent 25%,transparent 50%,rgba(255,255,255,0.15) 50%,rgba(255,255,255,0.15) 75%,transparent 75%,transparent)}.progress-success .bar,.progress .bar-success{background-color:#5eb95e;background-image:-moz-linear-gradient(top,#62c462,#57a957);background-image:-webkit-gradient(linear,0 0,0 100%,from(#62c462),to(#57a957));background-image:-webkit-linear-gradient(top,#62c462,#57a957);background-image:-o-linear-gradient(top,#62c462,#57a957);background-image:linear-gradient(to bottom,#62c462,#57a957);background-repeat:repeat-x;filter:progid:DXImageTransform.Microsoft.gradient(startColorstr='#ff62c462',endColorstr='#ff57a957',GradientType=0)}.progress-success.progress-striped .bar,.progress-striped .bar-success{background-color:#62c462;background-image:-webkit-gradient(linear,0 100%,100% 0,color-stop(0.25,rgba(255,255,255,0.15)),color-stop(0.25,transparent),color-stop(0.5,transparent),color-stop(0.5,rgba(255,255,255,0.15)),color-stop(0.75,rgba(255,255,255,0.15)),color-stop(0.75,transparent),to(transparent));background-image:-webkit-linear-gradient(45deg,rgba(255,255,255,0.15) 25%,transparent 25%,transparent 50%,rgba(255,255,255,0.15) 50%,rgba(255,255,255,0.15) 75%,transparent 75%,transparent);background-image:-moz-linear-gradient(45deg,rgba(255,255,255,0.15) 25%,transparent 25%,transparent 50%,rgba(255,255,255,0.15) 50%,rgba(255,255,255,0.15) 75%,transparent 75%,transparent);background-image:-o-linear-gradient(45deg,rgba(255,255,255,0.15) 25%,transparent 25%,transparent 50%,rgba(255,255,255,0.15) 50%,rgba(255,255,255,0.15) 75%,transparent 75%,transparent);background-image:linear-gradient(45deg,rgba(255,255,255,0.15) 25%,transparent 25%,transparent 50%,rgba(255,255,255,0.15) 50%,rgba(255,255,255,0.15) 75%,transparent 75%,transparent)}.progress-info .bar,.progress .bar-info{background-color:#4bb1cf;background-image:-moz-linear-gradient(top,#5bc0de,#339bb9);background-image:-webkit-gradient(linear,0 0,0 100%,from(#5bc0de),to(#339bb9));background-image:-webkit-linear-gradient(top,#5bc0de,#339bb9);background-image:-o-linear-gradient(top,#5bc0de,#339bb9);background-image:linear-gradient(to bottom,#5bc0de,#339bb9);background-repeat:repeat-x;filter:progid:DXImageTransform.Microsoft.gradient(startColorstr='#ff5bc0de',endColorstr='#ff339bb9',GradientType=0)}.progress-info.progress-striped .bar,.progress-striped .bar-info{background-color:#5bc0de;background-image:-webkit-gradient(linear,0 100%,100% 0,color-stop(0.25,rgba(255,255,255,0.15)),color-stop(0.25,transparent),color-stop(0.5,transparent),color-stop(0.5,rgba(255,255,255,0.15)),color-stop(0.75,rgba(255,255,255,0.15)),color-stop(0.75,transparent),to(transparent));background-image:-webkit-linear-gradient(45deg,rgba(255,255,255,0.15) 25%,transparent 25%,transparent 50%,rgba(255,255,255,0.15) 50%,rgba(255,255,255,0.15) 75%,transparent 75%,transparent);background-image:-moz-linear-gradient(45deg,rgba(255,255,255,0.15) 25%,transparent 25%,transparent 50%,rgba(255,255,255,0.15) 50%,rgba(255,255,255,0.15) 75%,transparent 75%,transparent);background-image:-o-linear-gradient(45deg,rgba(255,255,255,0.15) 25%,transparent 25%,transparent 50%,rgba(255,255,255,0.15) 50%,rgba(255,255,255,0.15) 75%,transparent 75%,transparent);background-image:linear-gradient(45deg,rgba(255,255,255,0.15) 25%,transparent 25%,transparent 50%,rgba(255,255,255,0.15) 50%,rgba(255,255,255,0.15) 75%,transparent 75%,transparent)}.progress-warning .bar,.progress .bar-warning{background-color:#faa732;background-image:-moz-linear-gradient(top,#fbb450,#f89406);background-image:-webkit-gradient(linear,0 0,0 100%,from(#fbb450),to(#f89406));background-image:-webkit-linear-gradient(top,#fbb450,#f89406);background-image:-o-linear-gradient(top,#fbb450,#f89406);background-image:linear-gradient(to bottom,#fbb450,#f89406);background-repeat:repeat-x;filter:progid:DXImageTransform.Microsoft.gradient(startColorstr='#fffbb450',endColorstr='#fff89406',GradientType=0)}.progress-warning.progress-striped .bar,.progress-striped .bar-warning{background-color:#fbb450;background-image:-webkit-gradient(linear,0 100%,100% 0,color-stop(0.25,rgba(255,255,255,0.15)),color-stop(0.25,transparent),color-stop(0.5,transparent),color-stop(0.5,rgba(255,255,255,0.15)),color-stop(0.75,rgba(255,255,255,0.15)),color-stop(0.75,transparent),to(transparent));background-image:-webkit-linear-gradient(45deg,rgba(255,255,255,0.15) 25%,transparent 25%,transparent 50%,rgba(255,255,255,0.15) 50%,rgba(255,255,255,0.15) 75%,transparent 75%,transparent);background-image:-moz-linear-gradient(45deg,rgba(255,255,255,0.15) 25%,transparent 25%,transparent 50%,rgba(255,255,255,0.15) 50%,rgba(255,255,255,0.15) 75%,transparent 75%,transparent);background-image:-o-linear-gradient(45deg,rgba(255,255,255,0.15) 25%,transparent 25%,transparent 50%,rgba(255,255,255,0.15) 50%,rgba(255,255,255,0.15) 75%,transparent 75%,transparent);background-image:linear-gradient(45deg,rgba(255,255,255,0.15) 25%,transparent 25%,transparent 50%,rgba(255,255,255,0.15) 50%,rgba(255,255,255,0.15) 75%,transparent 75%,transparent)}.accordion{margin-bottom:20px}.accordion-group{margin-bottom:2px;border:1px solid #e5e5e5;-webkit-border-radius:4px;-moz-border-radius:4px;border-radius:4px}.accordion-heading{border-bottom:0}.accordion-heading .accordion-toggle{display:block;padding:8px 15px}.accordion-toggle{cursor:pointer}.accordion-inner{padding:9px 15px;border-top:1px solid #e5e5e5}.carousel{position:relative;margin-bottom:20px;line-height:1}.carousel-inner{position:relative;width:100%;overflow:hidden}.carousel-inner>.item{position:relative;display:none;-webkit-transition:.6s ease-in-out left;-moz-transition:.6s ease-in-out left;-o-transition:.6s ease-in-out left;transition:.6s ease-in-out left}.carousel-inner>.item>img,.carousel-inner>.item>a>img{display:block;line-height:1}.carousel-inner>.active,.carousel-inner>.next,.carousel-inner>.prev{display:block}.carousel-inner>.active{left:0}.carousel-inner>.next,.carousel-inner>.prev{position:absolute;top:0;width:100%}.carousel-inner>.next{left:100%}.carousel-inner>.prev{left:-100%}.carousel-inner>.next.left,.carousel-inner>.prev.right{left:0}.carousel-inner>.active.left{left:-100%}.carousel-inner>.active.right{left:100%}.carousel-control{position:absolute;top:40%;left:15px;width:40px;height:40px;margin-top:-20px;font-size:60px;font-weight:100;line-height:30px;color:#fff;text-align:center;background:#222;border:3px solid #fff;-webkit-border-radius:23px;-moz-border-radius:23px;border-radius:23px;opacity:.5;filter:alpha(opacity=50)}.carousel-control.right{right:15px;left:auto}.carousel-control:hover,.carousel-control:focus{color:#fff;text-decoration:none;opacity:.9;filter:alpha(opacity=90)}.carousel-indicators{position:absolute;top:15px;right:15px;z-index:5;margin:0;list-style:none}.carousel-indicators li{display:block;float:left;width:10px;height:10px;margin-left:5px;text-indent:-999px;background-color:#ccc;background-color:rgba(255,255,255,0.25);border-radius:5px}.carousel-indicators .active{background-color:#fff}.carousel-caption{position:absolute;right:0;bottom:0;left:0;padding:15px;background:#333;background:rgba(0,0,0,0.75)}.carousel-caption h4,.carousel-caption p{line-height:20px;color:#fff}.carousel-caption h4{margin:0 0 5px}.carousel-caption p{margin-bottom:0}.hero-unit{padding:60px;margin-bottom:30px;font-size:18px;font-weight:200;line-height:30px;color:inherit;background-color:#eee;-webkit-border-radius:6px;-moz-border-radius:6px;border-radius:6px}.hero-unit h1{margin-bottom:0;font-size:60px;line-height:1;letter-spacing:-1px;color:inherit}.hero-unit li{line-height:30px}.pull-right{float:right}.pull-left{float:left}.hide{display:none}.show{display:block}.invisible{visibility:hidden}.affix{position:fixed} diff --git a/docs/_static/bootstrap-2.3.2/img/glyphicons-halflings-white.png b/docs/_static/bootstrap-2.3.2/img/glyphicons-halflings-white.png new file mode 100644 index 0000000000000000000000000000000000000000..3bf6484a29d8da269f9bc874b25493a45fae3bae GIT binary patch literal 8777 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 B7G?kd literal 0 HcmV?d00001 diff --git a/docs/_static/bootstrap-2.3.2/img/glyphicons-halflings.png b/docs/_static/bootstrap-2.3.2/img/glyphicons-halflings.png new file mode 100644 index 0000000000000000000000000000000000000000..a9969993201f9cee63cf9f49217646347297b643 GIT binary patch literal 12799 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 literal 0 HcmV?d00001 diff --git a/docs/_static/bootstrap-2.3.2/js/bootstrap.js b/docs/_static/bootstrap-2.3.2/js/bootstrap.js new file mode 100644 index 0000000..638bb18 --- /dev/null +++ b/docs/_static/bootstrap-2.3.2/js/bootstrap.js @@ -0,0 +1,2287 @@ +/* =================================================== + * bootstrap-transition.js v2.3.2 + * http://twitter.github.com/bootstrap/javascript.html#transitions + * =================================================== + * Copyright 2012 Twitter, Inc. + * + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + * ========================================================== */ + + +!function ($) { + + "use strict"; // jshint ;_; + + + /* CSS TRANSITION SUPPORT (http://www.modernizr.com/) + * ======================================================= */ + + $(function () { + + $.support.transition = (function () { + + var transitionEnd = (function () { + + var el = document.createElement('bootstrap') + , transEndEventNames = { + 'WebkitTransition' : 'webkitTransitionEnd' + , 'MozTransition' : 'transitionend' + , 'OTransition' : 'oTransitionEnd otransitionend' + , 'transition' : 'transitionend' + } + , name + + for (name in transEndEventNames){ + if (el.style[name] !== undefined) { + return transEndEventNames[name] + } + } + + }()) + + return transitionEnd && { + end: transitionEnd + } + + })() + + }) + +}(window.$jqTheme || window.jQuery); +/* ========================================================== + * bootstrap-alert.js v2.3.2 + * http://twitter.github.com/bootstrap/javascript.html#alerts + * ========================================================== + * Copyright 2012 Twitter, Inc. + * + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + * ========================================================== */ + + +!function ($) { + + "use strict"; // jshint ;_; + + + /* ALERT CLASS DEFINITION + * ====================== */ + + var dismiss = '[data-dismiss="alert"]' + , Alert = function (el) { + $(el).on('click', dismiss, this.close) + } + + Alert.prototype.close = function (e) { + var $this = $(this) + , selector = $this.attr('data-target') + , $parent + + if (!selector) { + selector = $this.attr('href') + selector = selector && selector.replace(/.*(?=#[^\s]*$)/, '') //strip for ie7 + } + + $parent = $(selector) + + e && e.preventDefault() + + $parent.length || ($parent = $this.hasClass('alert') ? $this : $this.parent()) + + $parent.trigger(e = $.Event('close')) + + if (e.isDefaultPrevented()) return + + $parent.removeClass('in') + + function removeElement() { + $parent + .trigger('closed') + .remove() + } + + $.support.transition && $parent.hasClass('fade') ? + $parent.on($.support.transition.end, removeElement) : + removeElement() + } + + + /* ALERT PLUGIN DEFINITION + * ======================= */ + + var old = $.fn.alert + + $.fn.alert = function (option) { + return this.each(function () { + var $this = $(this) + , data = $this.data('alert') + if (!data) $this.data('alert', (data = new Alert(this))) + if (typeof option == 'string') data[option].call($this) + }) + } + + $.fn.alert.Constructor = Alert + + + /* ALERT NO CONFLICT + * ================= */ + + $.fn.alert.noConflict = function () { + $.fn.alert = old + return this + } + + + /* ALERT DATA-API + * ============== */ + + $(document).on('click.alert.data-api', dismiss, Alert.prototype.close) + +}(window.$jqTheme || window.jQuery); +/* ============================================================ + * bootstrap-button.js v2.3.2 + * http://twitter.github.com/bootstrap/javascript.html#buttons + * ============================================================ + * Copyright 2012 Twitter, Inc. + * + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + * ============================================================ */ + + +!function ($) { + + "use strict"; // jshint ;_; + + + /* BUTTON PUBLIC CLASS DEFINITION + * ============================== */ + + var Button = function (element, options) { + this.$element = $(element) + this.options = $.extend({}, $.fn.button.defaults, options) + } + + Button.prototype.setState = function (state) { + var d = 'disabled' + , $el = this.$element + , data = $el.data() + , val = $el.is('input') ? 'val' : 'html' + + state = state + 'Text' + data.resetText || $el.data('resetText', $el[val]()) + + $el[val](data[state] || this.options[state]) + + // push to event loop to allow forms to submit + setTimeout(function () { + state == 'loadingText' ? + $el.addClass(d).attr(d, d) : + $el.removeClass(d).removeAttr(d) + }, 0) + } + + Button.prototype.toggle = function () { + var $parent = this.$element.closest('[data-toggle="buttons-radio"]') + + $parent && $parent + .find('.active') + .removeClass('active') + + this.$element.toggleClass('active') + } + + + /* BUTTON PLUGIN DEFINITION + * ======================== */ + + var old = $.fn.button + + $.fn.button = function (option) { + return this.each(function () { + var $this = $(this) + , data = $this.data('button') + , options = typeof option == 'object' && option + if (!data) $this.data('button', (data = new Button(this, options))) + if (option == 'toggle') data.toggle() + else if (option) data.setState(option) + }) + } + + $.fn.button.defaults = { + loadingText: 'loading...' + } + + $.fn.button.Constructor = Button + + + /* BUTTON NO CONFLICT + * ================== */ + + $.fn.button.noConflict = function () { + $.fn.button = old + return this + } + + + /* BUTTON DATA-API + * =============== */ + + $(document).on('click.button.data-api', '[data-toggle^=button]', function (e) { + var $btn = $(e.target) + if (!$btn.hasClass('btn')) $btn = $btn.closest('.btn') + $btn.button('toggle') + }) + +}(window.$jqTheme || window.jQuery); +/* ========================================================== + * bootstrap-carousel.js v2.3.2 + * http://twitter.github.com/bootstrap/javascript.html#carousel + * ========================================================== + * Copyright 2012 Twitter, Inc. + * + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + * ========================================================== */ + + +!function ($) { + + "use strict"; // jshint ;_; + + + /* CAROUSEL CLASS DEFINITION + * ========================= */ + + var Carousel = function (element, options) { + this.$element = $(element) + this.$indicators = this.$element.find('.carousel-indicators') + this.options = options + this.options.pause == 'hover' && this.$element + .on('mouseenter', $.proxy(this.pause, this)) + .on('mouseleave', $.proxy(this.cycle, this)) + } + + Carousel.prototype = { + + cycle: function (e) { + if (!e) this.paused = false + if (this.interval) clearInterval(this.interval); + this.options.interval + && !this.paused + && (this.interval = setInterval($.proxy(this.next, this), this.options.interval)) + return this + } + + , getActiveIndex: function () { + this.$active = this.$element.find('.item.active') + this.$items = this.$active.parent().children() + return this.$items.index(this.$active) + } + + , to: function (pos) { + var activeIndex = this.getActiveIndex() + , that = this + + if (pos > (this.$items.length - 1) || pos < 0) return + + if (this.sliding) { + return this.$element.one('slid', function () { + that.to(pos) + }) + } + + if (activeIndex == pos) { + return this.pause().cycle() + } + + return this.slide(pos > activeIndex ? 'next' : 'prev', $(this.$items[pos])) + } + + , pause: function (e) { + if (!e) this.paused = true + if (this.$element.find('.next, .prev').length && $.support.transition.end) { + this.$element.trigger($.support.transition.end) + this.cycle(true) + } + clearInterval(this.interval) + this.interval = null + return this + } + + , next: function () { + if (this.sliding) return + return this.slide('next') + } + + , prev: function () { + if (this.sliding) return + return this.slide('prev') + } + + , slide: function (type, next) { + var $active = this.$element.find('.item.active') + , $next = next || $active[type]() + , isCycling = this.interval + , direction = type == 'next' ? 'left' : 'right' + , fallback = type == 'next' ? 'first' : 'last' + , that = this + , e + + this.sliding = true + + isCycling && this.pause() + + $next = $next.length ? $next : this.$element.find('.item')[fallback]() + + e = $.Event('slide', { + relatedTarget: $next[0] + , direction: direction + }) + + if ($next.hasClass('active')) return + + if (this.$indicators.length) { + this.$indicators.find('.active').removeClass('active') + this.$element.one('slid', function () { + var $nextIndicator = $(that.$indicators.children()[that.getActiveIndex()]) + $nextIndicator && $nextIndicator.addClass('active') + }) + } + + if ($.support.transition && this.$element.hasClass('slide')) { + this.$element.trigger(e) + if (e.isDefaultPrevented()) return + $next.addClass(type) + $next[0].offsetWidth // force reflow + $active.addClass(direction) + $next.addClass(direction) + this.$element.one($.support.transition.end, function () { + $next.removeClass([type, direction].join(' ')).addClass('active') + $active.removeClass(['active', direction].join(' ')) + that.sliding = false + setTimeout(function () { that.$element.trigger('slid') }, 0) + }) + } else { + this.$element.trigger(e) + if (e.isDefaultPrevented()) return + $active.removeClass('active') + $next.addClass('active') + this.sliding = false + this.$element.trigger('slid') + } + + isCycling && this.cycle() + + return this + } + + } + + + /* CAROUSEL PLUGIN DEFINITION + * ========================== */ + + var old = $.fn.carousel + + $.fn.carousel = function (option) { + return this.each(function () { + var $this = $(this) + , data = $this.data('carousel') + , options = $.extend({}, $.fn.carousel.defaults, typeof option == 'object' && option) + , action = typeof option == 'string' ? option : options.slide + if (!data) $this.data('carousel', (data = new Carousel(this, options))) + if (typeof option == 'number') data.to(option) + else if (action) data[action]() + else if (options.interval) data.pause().cycle() + }) + } + + $.fn.carousel.defaults = { + interval: 5000 + , pause: 'hover' + } + + $.fn.carousel.Constructor = Carousel + + + /* CAROUSEL NO CONFLICT + * ==================== */ + + $.fn.carousel.noConflict = function () { + $.fn.carousel = old + return this + } + + /* CAROUSEL DATA-API + * ================= */ + + $(document).on('click.carousel.data-api', '[data-slide], [data-slide-to]', function (e) { + var $this = $(this), href + , $target = $($this.attr('data-target') || (href = $this.attr('href')) && href.replace(/.*(?=#[^\s]+$)/, '')) //strip for ie7 + , options = $.extend({}, $target.data(), $this.data()) + , slideIndex + + $target.carousel(options) + + if (slideIndex = $this.attr('data-slide-to')) { + $target.data('carousel').pause().to(slideIndex).cycle() + } + + e.preventDefault() + }) + +}(window.$jqTheme || window.jQuery); +/* ============================================================= + * bootstrap-collapse.js v2.3.2 + * http://twitter.github.com/bootstrap/javascript.html#collapse + * ============================================================= + * Copyright 2012 Twitter, Inc. + * + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + * ============================================================ */ + + +!function ($) { + + "use strict"; // jshint ;_; + + + /* COLLAPSE PUBLIC CLASS DEFINITION + * ================================ */ + + var Collapse = function (element, options) { + this.$element = $(element) + this.options = $.extend({}, $.fn.collapse.defaults, options) + + if (this.options.parent) { + this.$parent = $(this.options.parent) + } + + this.options.toggle && this.toggle() + } + + Collapse.prototype = { + + constructor: Collapse + + , dimension: function () { + var hasWidth = this.$element.hasClass('width') + return hasWidth ? 'width' : 'height' + } + + , show: function () { + var dimension + , scroll + , actives + , hasData + + if (this.transitioning || this.$element.hasClass('in')) return + + dimension = this.dimension() + scroll = $.camelCase(['scroll', dimension].join('-')) + actives = this.$parent && this.$parent.find('> .accordion-group > .in') + + if (actives && actives.length) { + hasData = actives.data('collapse') + if (hasData && hasData.transitioning) return + actives.collapse('hide') + hasData || actives.data('collapse', null) + } + + this.$element[dimension](0) + this.transition('addClass', $.Event('show'), 'shown') + $.support.transition && this.$element[dimension](this.$element[0][scroll]) + } + + , hide: function () { + var dimension + if (this.transitioning || !this.$element.hasClass('in')) return + dimension = this.dimension() + this.reset(this.$element[dimension]()) + this.transition('removeClass', $.Event('hide'), 'hidden') + this.$element[dimension](0) + } + + , reset: function (size) { + var dimension = this.dimension() + + this.$element + .removeClass('collapse') + [dimension](size || 'auto') + [0].offsetWidth + + this.$element[size !== null ? 'addClass' : 'removeClass']('collapse') + + return this + } + + , transition: function (method, startEvent, completeEvent) { + var that = this + , complete = function () { + if (startEvent.type == 'show') that.reset() + that.transitioning = 0 + that.$element.trigger(completeEvent) + } + + this.$element.trigger(startEvent) + + if (startEvent.isDefaultPrevented()) return + + this.transitioning = 1 + + this.$element[method]('in') + + $.support.transition && this.$element.hasClass('collapse') ? + this.$element.one($.support.transition.end, complete) : + complete() + } + + , toggle: function () { + this[this.$element.hasClass('in') ? 'hide' : 'show']() + } + + } + + + /* COLLAPSE PLUGIN DEFINITION + * ========================== */ + + var old = $.fn.collapse + + $.fn.collapse = function (option) { + return this.each(function () { + var $this = $(this) + , data = $this.data('collapse') + , options = $.extend({}, $.fn.collapse.defaults, $this.data(), typeof option == 'object' && option) + if (!data) $this.data('collapse', (data = new Collapse(this, options))) + if (typeof option == 'string') data[option]() + }) + } + + $.fn.collapse.defaults = { + toggle: true + } + + $.fn.collapse.Constructor = Collapse + + + /* COLLAPSE NO CONFLICT + * ==================== */ + + $.fn.collapse.noConflict = function () { + $.fn.collapse = old + return this + } + + + /* COLLAPSE DATA-API + * ================= */ + + $(document).on('click.collapse.data-api', '[data-toggle=collapse]', function (e) { + var $this = $(this), href + , target = $this.attr('data-target') + || e.preventDefault() + || (href = $this.attr('href')) && href.replace(/.*(?=#[^\s]+$)/, '') //strip for ie7 + , option = $(target).data('collapse') ? 'toggle' : $this.data() + $this[$(target).hasClass('in') ? 'addClass' : 'removeClass']('collapsed') + $(target).collapse(option) + }) + +}(window.$jqTheme || window.jQuery); +/* ============================================================ + * bootstrap-dropdown.js v2.3.2 + * http://twitter.github.com/bootstrap/javascript.html#dropdowns + * ============================================================ + * Copyright 2012 Twitter, Inc. + * + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + * ============================================================ */ + + +!function ($) { + + "use strict"; // jshint ;_; + + + /* DROPDOWN CLASS DEFINITION + * ========================= */ + + var toggle = '[data-toggle=dropdown]' + , Dropdown = function (element) { + var $el = $(element).on('click.dropdown.data-api', this.toggle) + $('html').on('click.dropdown.data-api', function () { + $el.parent().removeClass('open') + }) + } + + Dropdown.prototype = { + + constructor: Dropdown + + , toggle: function (e) { + var $this = $(this) + , $parent + , isActive + + if ($this.is('.disabled, :disabled')) return + + $parent = getParent($this) + + isActive = $parent.hasClass('open') + + clearMenus() + + if (!isActive) { + if ('ontouchstart' in document.documentElement) { + // if mobile we we use a backdrop because click events don't delegate + $('