From: Jean Privat Date: Tue, 10 Jun 2014 19:10:59 +0000 (-0400) Subject: Merge: Move sensors and Dalvik related services from mnit to android (and fixes) X-Git-Tag: v0.6.6~40 X-Git-Url: http://nitlanguage.org?hp=9d54d0a9875459df816afe92b932a6805228818d Merge: Move sensors and Dalvik related services from mnit to android (and fixes) Pull-Request: #487 Reviewed-by: Lucas Bajolet Reviewed-by: Jean Privat --- diff --git a/.gitignore b/.gitignore index 12fcc43..eed3179 100644 --- a/.gitignore +++ b/.gitignore @@ -25,7 +25,6 @@ src/version.nit src/callgrind.* src/*.log src/*.dot -src/doc src/*.dat src/*.gnu src/*.bin diff --git a/lib/android/native_app_glue.nit b/lib/android/native_app_glue.nit index 9e9aabf..50368de 100644 --- a/lib/android/native_app_glue.nit +++ b/lib/android/native_app_glue.nit @@ -123,7 +123,7 @@ extern class NativeActivity in "Java" `{ android.app.NativeActivity `} end redef class App - redef init + redef fun setup do var native_app_glue = native_app_glue native_app_glue.user_data = self diff --git a/lib/app.nit b/lib/app.nit index bd74daa..3e2d737 100644 --- a/lib/app.nit +++ b/lib/app.nit @@ -27,6 +27,10 @@ module app class App protected init do end + # Starts the internal setup of graphical and other stuff + # Is called just before run + protected fun setup do end + # Main entry point of your application fun run do end @@ -49,4 +53,5 @@ class App end protected fun app: App do return once new App +app.setup app.run diff --git a/lib/geometry/boxes.nit b/lib/geometry/boxes.nit index 61af367..1596c1e 100644 --- a/lib/geometry/boxes.nit +++ b/lib/geometry/boxes.nit @@ -74,6 +74,15 @@ interface Boxed[N: Numeric] return self.left <= other.right and other.left <= self.right and self.top >= other.bottom and other.top >= self.bottom end + + # Create a bounding box that englobes the actual bounding box. + # `dist` is the distance between the inner boundaries and the outer boundaries. + # ~~~ + # var p = new Point[Int](5,10) + # var b = p.padded(3) + # assert b.top == 2 and b.bot = 8 and b.left == 7 and b.right == 13 + # ~~~ + fun padded(dist: N): Box[N] do return new Box[N].lrtb(left - dist, right + dist, top + dist, bottom - dist) end # A 2d bounded object and an implementation of `Boxed` @@ -201,6 +210,8 @@ interface Boxed3d[N: Numeric] return super and (not other isa Boxed3d[N] or (self.back <= other.front and other.back <= self.front)) end + + redef fun padded(dist: N): Box3d[N] do return new Box3d[N].lrtbfb(left - dist, right + dist, top + dist, bottom - dist, front + dist, back - dist) end # A 3d bounded object and an implementation of Boxed @@ -317,3 +328,31 @@ redef class ILine3d[N] redef fun front do return point_left.z.min(point_right.z) redef fun back do return point_left.z.max(point_right.z) end + +# Base for all data structures containing multiple Boxed Objects +interface BoxedCollection[E: Boxed[Numeric]] + super SimpleCollection[E] + + # returns all the items overlapping with `region` + fun items_overlapping(region :Boxed[Numeric]): SimpleCollection[E] is abstract +end + +# A BoxedCollection implemented with an array, linear performances for searching but really +# fast for creation and filling +class BoxedArray[E: Boxed[Numeric]] + super BoxedCollection[E] + + private var data: Array[E] = new Array[E] + + redef fun add(item: E) do data.add(item) + redef fun items_overlapping(item: Boxed[Numeric]): SimpleCollection[E] + do + var arr = new Array[E] + for i in data do + if i.intersects(item) then arr.add(i) + end + return arr + end + + redef fun iterator do return data.iterator +end diff --git a/lib/geometry/quadtree.nit b/lib/geometry/quadtree.nit new file mode 100644 index 0000000..97c0783 --- /dev/null +++ b/lib/geometry/quadtree.nit @@ -0,0 +1,247 @@ +# This file is part of NIT (http://www.nitlanguage.org). +# +# Copyright 2014 Romain Chanoir +# +# 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. + +# QuadTree API mostly used for 2 dimensional collision detection +# The QuadTree data structure partition a 2D space by recursively +# subdividing it into 4 regions when it's capacity is reached +# This module introduce 2 principal implementation of the structure, +# the static and the dynamic QuadTree +module quadtree + +import boxes +import pipeline + +# Abstract QuadTree implementing most of the basic functions +# and introducing specific QuadTree data +abstract class QuadTree[E: Boxed[Numeric]] + super BoxedCollection[E] + + protected var center: nullable Point[Numeric] + var data: Array[E] = new Array[E] + + # ________________ + # | | | + # | 1 | 2 | + # |-------|-------| + # | 0 | 3 | + # |_______|_______| + + protected var child0: nullable QuadTree[E] + protected var child1: nullable QuadTree[E] + protected var child2: nullable QuadTree[E] + protected var child3: nullable QuadTree[E] + + # represent the threshold before subdividing the node + protected var item_limit = 4 + protected var parent_node: nullable QuadTree[E] + + # create the quadtree and set the item limit for each node + init(limit: Int) + do + self.item_limit = limit + end + + # create a node, giving him self as a parent. Used to create children nodes + init with_parent(limit: Int, parent: QuadTree[E]) + do + init(limit) + self.parent_node = parent + end + + redef fun items_overlapping(region :Boxed[Numeric]): SimpleCollection[E] do + var res = new Array[E] + items_overlapping_in(region,res) + return res + end + + # add the item to the tree, create children if the limit is reached + redef fun add(item: E) do if self.is_leaf then self.data.add(item) else add_to_children(item) + + private fun add_to_children(item: Boxed[Numeric]) + do + if self.child0 != null then + if self.center.x > item.right then + if self.center.y > item.top then + child0.add(item) + else if self.center.y < item.bottom then + child1.add(item) + else + self.data.add(item) + end + else if self.center.x < item.left then + if self.center.y > item.top then + child3.add(item) + else if self.center.y < item.bottom then + child2.add(item) + else + self.data.add(item) + end + else if self.center.y > item.top then + self.data.add(item) + else if self.center.y < item.bottom then + self.data.add(item) + else + self.data.add(item) + end + end + end + + redef fun is_empty: Bool do return data.is_empty and (self.is_leaf or (child0.is_empty and child1.is_empty and child2.is_empty and child3.is_empty)) + + # Return whether or not the Node is a leaf of the tree + fun is_leaf: Bool do return child0 == null + + # var dquadtree = new DQuadTree[Point[Int]](2) + # var p1 = new Point[Int](0,0) + # var p2 = new Point[Int](0,9) + # var p3 = new Point[Int](9,0) + # dquadtree.add(p1) + # dquadtree.add(p2) + # dquadtree.add(p3) + # var result = dquadtree.items_overlapping(p3) + # assert result.length == 1 + # result.clear + # var p4 = new Point[Int](9,9) + # result = dquadtree.items_overlapping(p4) + # assert result.length == 0 + # result = dquadtree.items_overlapping(p4.padded(10)) + # assert result.length == 3 + fun items_overlapping_in(region: Boxed[Numeric], mdata: SimpleCollection[E]) + do + if self.is_leaf and data.length >= item_limit then + subdivide + var data_copy = data + data = new Array[E] + #add to the right Node + for d in data_copy do + add_to_children(d) + end + end + for i in data do if i.intersects(region) then mdata.add(i) + if self.child0 != null then + if self.center.x > region.right then + if self.center.y > region.top then + child0.items_overlapping_in(region, mdata) + else if self.center.y < region.bottom then + child1.items_overlapping_in(region, mdata) + else + child0.items_overlapping_in(region,mdata) + child1.items_overlapping_in(region, mdata) + end + else if self.center.x < region.left then + if self.center.y > region.top then + child3.items_overlapping_in(region, mdata) + else if self.center.y < region.bottom then + child2.items_overlapping_in(region, mdata) + else + child3.items_overlapping_in(region, mdata) + child2.items_overlapping_in(region, mdata) + end + else if self.center.y > region.top then + child0.items_overlapping_in(region, mdata) + child3.items_overlapping_in(region, mdata) + else if self.center.y < region.bottom then + child1.items_overlapping_in(region, mdata) + child2.items_overlapping_in(region, mdata) + else + child0.items_overlapping_in(region, mdata) + child1.items_overlapping_in(region, mdata) + child2.items_overlapping_in(region, mdata) + child3.items_overlapping_in(region, mdata) + end + end + end + + # this function is responsible of the creation of the children, + # depending on your needs + protected fun subdivide is abstract + + redef fun iterator do if self.is_leaf then return data.iterator else return data.iterator + child0.iterator + child1.iterator + child2.iterator + child3.iterator +end + +# A dynamic implementation of the quadtree data structure +# the center of the parent node is determined by the average +# values of the data it contains when the item limit is reached +class DQuadTree[E: Boxed[Numeric]] + super QuadTree[E] + + redef fun subdivide + do + self.center = new Point[Numeric](average_x, average_y) + child0 = new DQuadTree[E].with_parent(self.item_limit, self) + child1 = new DQuadTree[E].with_parent(self.item_limit, self) + child2 = new DQuadTree[E].with_parent(self.item_limit, self) + child3 = new DQuadTree[E].with_parent(self.item_limit, self) + end + + # average x of data in this node + fun average_x: Numeric + do + var x_total = data.first.left.zero + for data in self.data do + x_total += (data.left + data.right)/x_total.value_of(2) + end + return x_total/x_total.value_of(self.data.length) + end + + # average y of data in this node + fun average_y: Numeric + do + var y_total = data.first.left.zero + for data in self.data do + y_total += (data.left + data.right)/y_total.value_of(2) + end + return y_total/y_total.value_of(self.data.length) + end +end + +# Static implementation of the quadtree structure. +# You need to specify a zone when creating the quadtree, +# which will be the zone corresponding to the root node. +# each subdivision cut the space in 4 equal regions from +# the center of the parent node +class SQuadTree[E: Boxed[Numeric]] + super QuadTree[E] + + # the width of the current node of the QuadTree + var width: Numeric + # the height of the current node of the QuadTree + var height: Numeric + + init(l: Int, c: Point[Numeric], w: Numeric, h: Numeric) + do + self.item_limit = l + self.center = c + self.width = w + self.height = h + end + + init with_parent(l: Int, c: Point[Numeric], w: Numeric, h: Numeric, p: QuadTree[E]) + do + init(l, c, w, h) + self.parent_node = p + end + + redef fun subdivide + do + var two = self.center.x.value_of(2) + var tree = self.center.x.value_of(3) + child0 = new SQuadTree[E].with_parent(self.item_limit, new Point[Numeric](self.center.x/two, self.center.y/two), self.width/two, self.height/two, self) + child1 = new SQuadTree[E].with_parent(self.item_limit, new Point[Numeric](self.center.x/two, (self.center.y*tree)/two), self.width/two, self.height/two, self) + child2 = new SQuadTree[E].with_parent(self.item_limit, new Point[Numeric]((self.center.x*tree)/two, (self.center.y*tree)/two), self.width/two, self.height/two, self) + child3 = new SQuadTree[E].with_parent(self.item_limit, new Point[Numeric]((self.center.x*tree)/two, self.center.y/two), self.width/two, self.height/two, self) + end +end diff --git a/lib/html.nit b/lib/html.nit index d6c8092..4fc8530 100644 --- a/lib/html.nit +++ b/lib/html.nit @@ -194,7 +194,25 @@ class HTMLTag # var ul = new HTMLTag("ul") # ul.add(new HTMLTag("li")) # assert ul.write_to_string == "
" - fun add(child: HTMLTag) do children.add(child) + # returns `self` for fluent programming + fun add(child: HTMLTag): HTMLTag + do + children.add(child) + return self + end + + # Create a new HTMLTag child and return it + # + # var ul = new HTMLTag("ul") + # ul.open("li").append("1").append("2") + # ul.open("li").append("3").append("4") + # assert ul.write_to_string == "
  • 12
  • 34
" + fun open(tag: String): HTMLTag + do + var res = new HTMLTag(tag) + add(res) + return res + end # List of children HTML elements var children: Set[HTMLTag] = new HashSet[HTMLTag] diff --git a/lib/mnit/opengles1.nit b/lib/mnit/opengles1.nit index a0233fa..dd5af2d 100644 --- a/lib/mnit/opengles1.nit +++ b/lib/mnit/opengles1.nit @@ -421,6 +421,14 @@ class Opengles1Display glClearColor( r, g, b, a ); glClear(GL_COLOR_BUFFER_BIT | GL_DEPTH_BUFFER_BIT); `} + + # Set the current color applied to all drawing + # + # require: r, g, b, a in [0.0 .. 1.0] + fun color(r, g, b, a: Float) `{ glColor4f(r, g, b, a); `} + + # Reset the current color to opaque white + fun reset_color `{ glColor4f(1.0f, 1.0f, 1.0f, 1.0f); `} end extern class Opengles1Image in "C" `{struct mnit_opengles_Texture *`} diff --git a/lib/mnit/tileset.nit b/lib/mnit/tileset.nit new file mode 100644 index 0000000..7b473f3 --- /dev/null +++ b/lib/mnit/tileset.nit @@ -0,0 +1,125 @@ +# This file is part of NIT ( http://www.nitlanguage.org ). +# +# 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. + +# Manage images that are tileset or glyphset (for bitmap fonts) +module tileset + +import mnit_display + +# Efficienly retrieve tiles in a big image +class TileSet + # The image containing the tileset + var image: Image + + # The witdh of a tile + var width: Int + + # The height of a tile + var height: Int + + init(image: Image, width: Int, height: Int) + do + self.image = image + self.width = width + self.height = height + + self.nb_cols = image.width / width + self.nb_rows = image.height / height + + for j in [0..nb_rows[ do + for i in [0..nb_cols[ do + subimages.add image.subimage(i*width,j*height,width,height) + end + end + end + + # The number of columns of tiles in the image + var nb_cols: Int + + # The number of rows of tiles in the image + var nb_rows: Int + + # Cache for images of tiles + private var subimages = new Array[Image] + + # The subimage of given tile + # Aborts if x or y are out of bound + fun [](x,y: Int): Image + do + assert x >= 0 and x < nb_cols and y >= 0 and y <= nb_rows else print "{x}x{y}right, then top->bottom order + # Use space (' ') for holes in the tileset + var chars: String + + init(image: Image, width: Int, height: Int, chars: String) + do + super + self.chars = chars + end + + # Additional space to insert horizontally between characters + # A negave value will display tile overlaped + var hspace: Int writable = 0 + + # Additional space to insert vertically between characters + # A negave value will display tile overlaped + var vspace: Int writable = 0 + + # The glyph (tile) associated to the caracter `c` according to `chars` + # Returns null if `c` is not in `chars` + fun char(c: Char): nullable Image + do + var i = chars.index_of(c) + if i == -1 then return null + return subimages[i] + end +end + +redef class Display + # Blit the text using a monospace bitmap font + # '\n' are rendered as carriage return + fun text(text: String, font: TileSetFont, x, y: Int) + do + var cx = x + var cy = y + var sw = font.width + font.hspace + var sh = font.height + font.vspace + for c in text.chars do + if c == '\n' then + cx = x + cy += sh + continue + end + if c == ' ' then + cx += sw + continue + end + var image = font.char(c) + if image != null then + blit(image, cx, cy) + end + cx += sw + end + end +end diff --git a/lib/mnit_android/android_app.nit b/lib/mnit_android/android_app.nit index 8ca123c..c25e56a 100644 --- a/lib/mnit_android/android_app.nit +++ b/lib/mnit_android/android_app.nit @@ -199,7 +199,7 @@ extern class AndroidKeyEvent in "C" `{AInputEvent *`} return 0; `} - fun is_back_key: Bool do return key_code == 2 + fun is_back_key: Bool do return key_code == 4 fun is_menu_key: Bool do return key_code == 82 fun is_search_key: Bool do return key_code == 84 end diff --git a/lib/mnit_display.nit b/lib/mnit_display.nit index 26a4bde..f04dadc 100644 --- a/lib/mnit_display.nit +++ b/lib/mnit_display.nit @@ -61,6 +61,17 @@ interface Drawable # Draw image on self, for top left position fun blit( image: I, x, y: Int ) is abstract + # Draw image on self, for top left position but scaled + # the width and height of the target rectangle is specified + fun blit_scaled(image: Image, x, y, w, h: Int) + do + var fx = x.to_f + var fy = y.to_f + var fx2 = fx + w.to_f + var fy2 = fy + h.to_f + blit_stretched(image, fx, fy, fx, fy2, fx2, fy2, fx2, fy) + end + # Draw image, centered at position fun blit_centered( image: I, x, y: Int ) is abstract @@ -71,8 +82,13 @@ interface Drawable fun blit_rotated_scaled( image: I, x, y, angle, scale: Float ) is abstract # Draw image by specifying the positon of each image corners - # Corners are in clockwise order stating top right - # a is top right, b is bottom right, c is bottom left and d is top left + # Corners are in counter-clockwise order stating top left + # a is top left, b is bottom left, c is bottom right and d is top right + # ~~~ + # a-d + # | | + # b-c + # ~~~ fun blit_stretched( image: I, ax, ay, bx, by, cx, cy, dx, dy: Float ) is abstract diff --git a/lib/mnit_linux/linux_app.nit b/lib/mnit_linux/linux_app.nit index 5534d5a..4b599ed 100644 --- a/lib/mnit_linux/linux_app.nit +++ b/lib/mnit_linux/linux_app.nit @@ -29,7 +29,7 @@ redef class App redef type D: Opengles1Display redef type I: Opengles1Image - redef init + redef fun setup do display = new Opengles1Display diff --git a/lib/mnit_linux/linux_assets.nit b/lib/mnit_linux/linux_assets.nit index 9247991..2c75bb5 100644 --- a/lib/mnit_linux/linux_assets.nit +++ b/lib/mnit_linux/linux_assets.nit @@ -22,7 +22,7 @@ import linux_app redef class App var assets_dir: String - redef init + redef fun setup do assets_dir = sys.program_name.dirname + "/../assets/" diff --git a/lib/ropes_debug.nit b/lib/ropes_debug.nit new file mode 100644 index 0000000..b9ba5ab --- /dev/null +++ b/lib/ropes_debug.nit @@ -0,0 +1,76 @@ +# This file is part of NIT ( http://www.nitlanguage.org ). +# +# Copyright 2004-2008 Jean Privat +# Copyright 2006-2008 Floréal Morandat +# +# This file is free software, which comes along with NIT. This software is +# distributed in the hope that it will be useful, but WITHOUT ANY WARRANTY; +# without even the implied warranty of MERCHANTABILITY or FITNESS FOR A +# PARTICULAR PURPOSE. You can modify it is you want, provided this header +# is kept unaltered, and a notification of the changes is added. +# You are allowed to redistribute it and sell it, alone or is a part of +# another product. + +# Exposes methods for debugging ropes when needed. +module ropes_debug + +intrude import ::standard::ropes +import ::standard + +redef class Rope + # Writes self as a dot file on the hard drive + fun to_dot(filepath: String): String is abstract +end + +redef class RopeNode + # Generates a dot string + fun to_dot(s: String): String is abstract +end + +redef class Leaf + redef fun to_dot(s): String + do + s += "n{object_id} [label = \"{str}\" shape = rect];\n" + s += "n{str.object_id} -> n{object_id} [label = \"contains\"];\n" + s = str.to_dot(s) + return s + end +end + +redef class Concat + redef fun to_dot(s): String + do + s += "n{object_id} [label = {length}];\n" + if left != null then + s += "n{object_id} -> n{left.object_id} [label = \"left\"];\n" + s = left.to_dot(s) + end + if right != null then + s += "n{object_id} -> n{right.object_id} [label = \"right\"];\n" + s = right.to_dot(s) + end + return s + end +end + +redef class FlatString + fun to_dot(s: String): String + do + return s + "n{object_id} [label=\"FlatString\\nindex_from = {index_from}\\nindex_to = {index_to}\\nNativeString = {items.to_s_with_length(items.cstring_length)}\"];\n" + end +end + +redef class RopeString + redef fun to_dot(filepath: String) + do + var of = new OFStream.open(filepath) + var ret: String = new RopeString.from("digraph g \{\n") + ret = root.to_dot(ret).as(RopeString) + ret += "\}\n" + ret.write_to(of) + of.close + return ret + end +end + + diff --git a/lib/standard/file.nit b/lib/standard/file.nit index 27b2626..f82a1fd 100644 --- a/lib/standard/file.nit +++ b/lib/standard/file.nit @@ -16,7 +16,7 @@ module file intrude import stream -intrude import string +intrude import ropes import string_search import time @@ -134,7 +134,11 @@ class OFStream redef fun write(s) do assert _writable - write_native(s.to_cstring, s.length) + if s isa FlatText then + write_native(s.to_cstring, s.length) + else + for i in s.substrings do write_native(i.to_cstring, i.length) + end end redef fun is_writable do return _writable diff --git a/lib/standard/ropes.nit b/lib/standard/ropes.nit index 5758afd..45c1cbd 100644 --- a/lib/standard/ropes.nit +++ b/lib/standard/ropes.nit @@ -15,1066 +15,840 @@ # A rope is a kind of string but instead of being flat, it relies on a binary tree structure to store data. module ropes -import file intrude import string -# Structure, tuple containing a LeafNode and an Int -# Used for methods like [] or has/has_only -private class TupleLeafNodePos - private var curr_node: LeafNode - private var corrected_pos: Int - private var visit_stack: List[TupleVisitNode] +# Used when searching for a particular node +# Returns the path to the node from the root of the rope +# Also, the node and the offset for seeked position in the rope +private class Path + # Leaf found + var leaf: Leaf + # Offset in leaf + var offset: Int + # Stack of the nodes traversed, and the path used + var stack: List[PathElement] end -# Abstract class, represents all the services offered by both mutable and immutable ropes -abstract class Rope - super Comparable - super StringCapable - - # Cached version of self as a flat String - private var str_representation: nullable String = null - - redef type OTHER: Rope +# An element for a Path, has the concat node and whether or not +# left or right child was visited. +private class PathElement + # Visited node + var node: Concat + # Was the left child visited ? + var left = false + # Was the right child visited ? + var right = false +end - # The first node of the hierarchy - private var parent_node: RopeNode +# A node for a Rope +private abstract class RopeNode + # Length of the node + var length = 0 +end - # Needed by the compiler to avoid producing an error with constructors in subclasses - init do - self.parent_node = new ConcatNode - end +# Node that represents a concatenation between two nodes (of any RopeNode type) +private class Concat + super RopeNode - # Initializes a new Rope with a text embedded in directly - init with_string(str: String) do - self.parent_node = new ConcatNode - parent_node.as(ConcatNode).right_child = new LeafNode(str) - parent_node.as(ConcatNode).update_data - end + # Left child of the node + var _left: nullable RopeNode = null + # Right child of the node + var _right: nullable RopeNode = null - # Returns a view on the rope - fun chars: SequenceRead[Char] - do - return new CharRopeView(self) - end + fun left: nullable RopeNode do return _left + fun right: nullable RopeNode do return _right - # Gets the total length of the Rope - fun length: Int + fun left=(l: RopeNode) do - return parent_node.length + _left = l + length = l.length + if _right != null then length += _right.length end - # Returns a flat version of self - redef fun to_s + fun right=(r: RopeNode) do - if self.str_representation == null then flatten - return str_representation.as(not null) + _right = r + length = r.length + if _left != null then length += _left.length end +end - # Stores a flat version of self in cache - private fun flatten: FlatString - do - var native_final_str = calloc_string(length + 1) - - native_final_str[length] = '\0' - - var offset = 0 - - var iter = new DFSRopeLeafIterator(self) - - while iter.is_ok do - iter.item.value.as(FlatString).items.copy_to(native_final_str, iter.item.value.length, 0, offset) - offset += iter.item.value.length - iter.next - end +# Leaf of a Rope, contains a FlatString +private class Leaf + super RopeNode - return native_final_str.to_s_with_length(length) - end + # Encapsulated FlatString in the leaf node + var str: FlatString - # Gets a node containing the substring to seek the char at the require position - private fun get_node_for_pos(position: Int): TupleLeafNodePos - do - assert position >= 0 and position < self.length - - var curr_node: nullable RopeNode = parent_node - - var visit_stack = new List[TupleVisitNode] - - var curr_visit_tuple: TupleVisitNode - - loop - if curr_node isa ConcatNode then - curr_visit_tuple = new TupleVisitNode(curr_node) - if curr_node.left_child != null and position < curr_node.left_child.length then - curr_visit_tuple.left_visited = true - curr_node = curr_node.left_child - else if curr_node.right_child != null then - curr_visit_tuple.left_visited = true - curr_visit_tuple.right_visited = true - if curr_node.left_child != null then position -= curr_node.left_child.length - curr_node = curr_node.right_child - else - print "Fatal Error" - abort - end - visit_stack.push(curr_visit_tuple) - else if curr_node isa LeafNode then - return new TupleLeafNodePos(curr_node, position, visit_stack) - end - end + init(val: FlatString) do + self.str = val + length = str.length end - # Concats two ropes and returns a new one - fun +(other: Rope): Rope do - var new_rope = new BufferRope +end - var first_iter = new DFSRopeLeafIterator(self) +# Basic structure, binary tree with a root node. +# +# Also shared services by subsequent implementations. +abstract class Rope + super Text - while first_iter.is_ok do - new_rope.append(first_iter.item.value) - first_iter.next - end + # Root node, entry point of a Rope. + private var root: RopeNode - var second_iter = new DFSRopeLeafIterator(other) + # Cached version of self as a flat String + private var str_representation: nullable NativeString = null - while second_iter.is_ok do - new_rope.append(second_iter.item.value) - second_iter.next - end + # Empty Rope + init do from("") - return new_rope + # Creates a new Rope with `s` as root + init from(s: String) do + if s isa RopeString then root = s.root else root = new Leaf(s.as(FlatString)) end - # Returns a copy of several ropes concatenated - # - # Is equivalent to a chain of + operations - # Except this one is optimized for performance - fun multi_concat(ropes: Rope...): Rope + private init from_root(r: RopeNode) do - var new_rope = new BufferRope + root = r + end - var self_iter = self.iterator - while self_iter.is_ok do - new_rope.append(self_iter.item.value) - self_iter.next - end + redef fun length do return root.length - for i in ropes do - var iter = i.iterator - while iter.is_ok do - new_rope.append(iter.item.value) - iter.next - end - end + # Iterator on the nodes of the rope, in forward postfix order + private fun postfix(from: Int): Postfix do return new Postfix.from(self, from) - return new_rope - end + # Iterator on the leaves of the rope, forward order + private fun leaves(from: Int): LeavesIterator do return new LeavesIterator(self, from) - # Appends the content of self multiple times in a new Rope object - fun *(repeats: Int): Rope do + # Iterator on the substrings from 0, in forward order + redef fun substrings do return new SubstringsIterator(self, 0) - var new_rope = new BufferRope + # Iterator on the substrings, starting at position `from`, in forward order + fun substrings_from(from: Int): IndexedIterator[Text] do return new SubstringsIterator(self, from) - var str = self.to_s + # Iterator on the nodes of the rope, in backwards postfix order + private fun reverse_postfix(from: Int): ReversePostfix do return new ReversePostfix.from(self, from) - for i in [1 .. repeats] do new_rope.append(str) + # Iterator on the leaves of the rope, backwards order + private fun reverse_leaves(from: Int): ReverseLeavesIterator do return new ReverseLeavesIterator(self,from) - return new_rope - end + # Iterator on the substrings, in reverse order + fun reverse_substrings: IndexedIterator[Text] do return new ReverseSubstringsIterator(self, length-1) - # Returns an iterator on self - # - # Unsafe modifications on a MutableRope - # - private fun iterator: Iterator[LeafNode] do return new DFSRopeLeafIterator(self) + # Iterator on the substrings, in reverse order, starting iteration at position `from` + fun reverse_substrings_from(from: Int): IndexedIterator[Text] do return new ReverseSubstringsIterator(self, from) - # Creates a subrope. - # - # var rope = (new BufferRope).append("abcd") - # - # assert rope.subrope(1, 2) == "bc" - # assert rope.subrope(-1, ) == "a" - # assert rope.subrope(1, 0) == "" - # assert rope.subrope(2, 5) == "cd" - # - # A `index_from` index < 0 will be replaced by 0. - # Unless a `count` value is > 0 at the same time. - # In this case, `index_from += count` and `count -= index_from`. - # - fun subrope(index_from: Int, count: Int): Rope + redef fun output do - assert count >= 0 - - if index_from < 0 then - count += index_from - if count < 0 then count = 0 - index_from = 0 + for i in substrings do + i.output end + end - if count - index_from >= self.length then count = length - index_from + redef fun to_cstring + do + if str_representation != null then return str_representation.as(not null) - var buffer = new BufferRope + var native_final_str = calloc_string(length + 1) - var iter = new DFSRopeLeafIterator.with_index(self, index_from) + native_final_str[length] = '\0' - var curr_subrope_index = index_from - iter.pos + if self.length == 0 then + str_representation = native_final_str + return native_final_str + end - while iter.is_ok do - if count == 0 then break - if curr_subrope_index > 0 then - if count >= iter.item.value.length then - buffer.append(iter.item.value.substring(curr_subrope_index, count)) - count -= iter.item.value.length - curr_subrope_index - curr_subrope_index = 0 - else - buffer.append(iter.item.value.substring(curr_subrope_index, count)) - break - end - else - if count >= iter.item.value.length then - buffer.append(iter.item.value) - count -= iter.item.value.length - else - buffer.append(iter.item.value.substring(0, count)) - break - end - end + var offset = 0 - iter.next + for i in substrings do + var str = i.flatten + if str isa FlatString then str.items.copy_to(native_final_str, str.length, str.index_from, offset) + offset += i.length end - return buffer - end + str_representation = native_final_str - # Returns an upper (capitalized) version of self - fun to_upper: Rope - do - var new_rope = new BufferRope - var iter = new DFSRopeLeafIterator(self) - while iter.is_ok do - new_rope.append(iter.item.value.to_upper) - iter.next - end - return new_rope + return native_final_str end - # Returns a lower (minuscule) version of self - fun to_lower: Rope + # Path to the Leaf for `position` + private fun node_at(position: Int): Path do - var new_rope = new BufferRope - var iter = new DFSRopeLeafIterator(self) - while iter.is_ok do - new_rope.append(iter.item.value.to_lower) - iter.next - end - return new_rope + assert position >= 0 and position < length + return get_node_from(root.as(not null), 0, position, new List[PathElement]) end - ############################################################################ - # Comparable Refined Methods # - ############################################################################ - - # Compares the current Rope to another object (either another rope or a String) - redef fun == (other) + # Builds the path to Leaf at position `seek_pos` + private fun get_node_from(node: RopeNode, curr_pos: Int, seek_pos: Int, stack: List[PathElement]): Path do - if other == null or not (other isa Rope or other isa FlatText) then return false - var self_iter = new RopeCharIterator(self) - if other isa Rope then - if self.length != other.length then return false - var other_iterator = new RopeCharIterator(other) - while self_iter.is_ok do - if self_iter.item != other_iterator.item then return false - self_iter.next - other_iterator.next - end - else if other isa FlatText then - var pos = 0 - if self.length != other.length then return false - while self_iter.is_ok do - if self_iter.item != other[pos] then return false - pos += 1 - self_iter.next + assert curr_pos >= 0 + if node isa Leaf then return new Path(node, seek_pos - curr_pos, stack) + node = node.as(Concat) + + if node.left != null then + var next_pos = curr_pos + node.left.length + stack.add(new PathElement(node)) + if next_pos > seek_pos then + stack.last.left = true + return get_node_from(node.left.as(not null), curr_pos, seek_pos, stack) end + stack.last.right = true + return get_node_from(node.right.as(not null), next_pos, seek_pos, stack) + else + var vis = new PathElement(node) + vis.right = true + stack.add(vis) + return get_node_from(node.right.as(not null), curr_pos, seek_pos, stack) end - return true end - # Checks if self is lesser than other - # - # Comparison done in lexicographical order - # i.e. 'aa' < 'b' - # - redef fun <(other) + redef fun ==(o) do - var other_iter = other.chars.iterator - for i in self.chars do - if not other_iter.is_ok then return false - if i < other_iter.item then return true - if i > other_iter.item then return false - other_iter.next + if not o isa Text then return false + if o.length != self.length then return false + var oit = o.chars.iterator + for i in self.chars.iterator do + if i != oit.item then return false + oit.next end - if other_iter.is_ok then return true - return false + return true end - end -# Rope that can be modified -# -# /!\ Non Thread-safe /!\ -# -class BufferRope +# Rope that cannot be modified +class RopeString super Rope + super String - var is_dirty: Bool = false + redef fun to_s do return self - init - do - super - end + redef fun empty do return once new RopeString.from("") - redef init with_string(str) - do - super - end - - ############################################################################ - # Tree Balancing Methods # - ############################################################################ + redef var chars: SequenceRead[Char] = new RopeStringChars(self) - # Performs a right rotation on a node of the Rope - # - # Root Pivot - # / \ / \ - # Pivot Leaf3 => Leaf1 Root - # / \ / \ - # Leaf1 Leaf2 Leaf2 Leaf3 - private fun rotate_right(root: ConcatNode) + redef fun reversed do - assert root.left_child != null - var pivot = root.left_child.as(ConcatNode) - var root_new_left = pivot.right_child - var root_parent = root.parent - - root.left_child = root_new_left - pivot.right_child = root - if root_parent == null then - self.parent_node = pivot - pivot.parent = null - return + var ret = empty.as(RopeString) + for i in substrings do + ret = ret.prepend(i.reversed.to_s).as(RopeString) end - - if root_parent.left_child == root then - root_parent.left_child = pivot - else - root_parent.right_child = pivot - end - - root.update_data - pivot.update_data - root_parent.update_data + return ret end - # Performs a left rotation on a node of the Rope - # - # Root Pivot - # / \ / \ - # Leaf1 Pivot => Root Leaf3 - # / \ / \ - # Leaf2 Leaf3 Leaf1 Leaf2 - private fun rotate_left(root: ConcatNode) + redef fun to_upper do - assert root.right_child != null - var pivot = root.right_child.as(ConcatNode) - var root_new_right = pivot.left_child - var root_parent = root.parent - - root.right_child = root_new_right - pivot.left_child = root - if root_parent == null then - self.parent_node = pivot - pivot.parent = null - return + var ret = empty + for i in substrings do + ret += i.to_upper end - - if root_parent.left_child == root then - root_parent.left_child = pivot - else - root_parent.right_child = pivot - end - - root.update_data - pivot.update_data - root_parent.update_data + return ret end - # Shortcut method to balance a node and its parents - # based on the rules of the AVL Tree - private fun balance_from_node(parent_node: nullable ConcatNode) + redef fun to_lower do - while parent_node != null do - parent_node.update_data - var node_balance = parent_node.balance_factor - if node_balance < -1 or node_balance > 1 then - balance_node(parent_node) - end - parent_node = parent_node.parent + var ret = empty + for i in substrings do + ret += i.to_lower end + return ret end - # Performs rotations to balance a node according to AVL Tree rules - private fun balance_node(node: ConcatNode) + redef fun +(o) do return insert_at(o.to_s, length) + + redef fun *(n) do - var balance_factor = node.balance_factor - if balance_factor < -1 then - var right_balance = node.right_child.balance_factor - if right_balance < 0 then - rotate_left(node) - else - rotate_right(node.right_child.as(ConcatNode)) - rotate_left(node) - end - else - var left_balance = node.left_child.balance_factor - if left_balance > 0 then - rotate_right(node) - else - rotate_left(node.left_child.as(ConcatNode)) - rotate_right(node) - end + var ret = new RopeString.from("") + for i in [0..n[ do + ret = (ret + self).as(RopeString) end + return ret end - ############################################################################ - # BufferRope exclusive Methods # - ############################################################################ - - # Appends a new Collection[Char] at the end of the current rope - fun append(str: String): BufferRope + # Inserts a String `str` at position `pos` + redef fun insert_at(str, pos) do - var last_node = parent_node - - while last_node isa ConcatNode and last_node.right_child != null do - last_node = last_node.right_child.as(not null) - end - - if last_node isa ConcatNode then - last_node.right_child = new LeafNode(str.to_s) - else if last_node isa LeafNode then - var last_node_parent = last_node.parent - var new_concat = new ConcatNode - last_node_parent.right_child = new_concat - new_concat.left_child = last_node - new_concat.right_child = new LeafNode(str.to_s) - last_node = new_concat - else - print "Fatal Error, please report to the developers for more insight." - abort - end + if str.length == 0 then return self + if self.length == 0 then return new RopeString.from(str) - balance_from_node(last_node) + assert pos >= 0 and pos <= length - is_dirty = true + if pos == length then return append(str).as(RopeString) - return self - end + var path = node_at(pos) - # Variatic function to append several collections of Chars - fun append_multi(strs: String...): BufferRope - do - for i in strs do - append(i) - end - return self - end + var last_concat = new Concat - # Adds a new Collection[Char] at the beginning of the rope - fun prepend(str: String): BufferRope - do - var curr_node = parent_node - - while curr_node isa ConcatNode and curr_node.left_child != null do - curr_node = curr_node.left_child.as(not null) - end - - if curr_node isa ConcatNode then - curr_node.left_child = new LeafNode(str.to_s) - else if curr_node isa LeafNode then - var parent = curr_node.parent - var new_concat = new ConcatNode - var new_leaf = new LeafNode(str.to_s) - new_concat.left_child = new_leaf - new_concat.right_child = curr_node - parent.left_child = new_concat - curr_node = new_concat + if path.offset == 0 then + last_concat.right = path.leaf + if str isa FlatString then last_concat.left = new Leaf(str) else last_concat.left = str.as(RopeString).root + else if path.offset == path.leaf.length then + if str isa FlatString then last_concat.right = new Leaf(str) else last_concat.right = str.as(RopeString).root + last_concat.left = path.leaf else - print "Fatal Error" - abort + var s = path.leaf.str + var l_half = s.substring(0, s.length - path.offset) + var r_half = s.substring_from(s.length - path.offset) + var cct = new Concat + cct.right = new Leaf(r_half.as(FlatString)) + last_concat.left = new Leaf(l_half.as(FlatString)) + if str isa FlatString then last_concat.right = new Leaf(str) else last_concat.right = str.as(RopeString).root + cct.left = last_concat + last_concat = cct + end + + for i in path.stack.reverse_iterator do + var nod = new Concat + if i.left then + nod.right = i.node.right.as(not null) + nod.left = last_concat + else + nod.left = i.node.left.as(not null) + nod.right = last_concat + end + last_concat = nod end - balance_from_node(curr_node) + return new RopeString.from_root(last_concat) + end - is_dirty = true + # Adds `s` at the beginning of self + redef fun prepend(s) do return insert_at(s, 0) - return self + # Adds `s` at the end of self + redef fun append(s) + do + if self.is_empty then return s + return new RopeString.from_root(append_to_path(root,s)) end - # Variatic function to prepend several collections of Chars - fun prepend_multi(strs: String...): BufferRope + # Builds a new path from root to the rightmost node with s appended + private fun append_to_path(node: RopeNode, s: String): RopeNode do - for i in strs do - prepend(i) + var cct = new Concat + if node isa Leaf then + cct.left = node + if s isa FlatString then cct.right = new Leaf(s) else cct.right = s.as(RopeString).root + else if node isa Concat then + var right = node.right + if node.left != null then cct.left = node.left.as(not null) + if right == null then + if s isa FlatString then cct.right = new Leaf(s) else cct.right = s.as(RopeString).root + else + cct.right = append_to_path(right, s) + end end - return self + return cct end - # Adds the content of `str` after self, does not create a new rope object - fun concat(str: Rope): Rope + # O(log(n)) + # + # var rope = new RopeString.from("abcd") + # assert rope.substring(1, 2) == "bc" + # assert rope.substring(-1, 2) == "a" + # assert rope.substring(1, 0) == "" + # assert rope.substring(2, 5) == "cd" + # + redef fun substring(pos, len) do - var other_iter = new DFSRopeLeafIterator(str) - - var modif_list = new List[String] - - while other_iter.is_ok do - modif_list.push(other_iter.item.value) - other_iter.next + if pos < 0 then + len += pos + pos = 0 end - while modif_list.length > 0 do - self.append(modif_list.shift) - end + if pos + len > length then len = length - pos - if not is_dirty then is_dirty = true + if len <= 0 then return new RopeString.from("") - return self - end + var path = node_at(pos) - # Returns the content of the current BufferRope object as an ImmutableRope - fun freeze: ImmutableRope - do - var buffer_rope = new BufferRope - var new_rope = new ImmutableRope + var lf = path.leaf + var offset = path.offset + + if path.leaf.str.length - offset > len then lf = new Leaf(lf.str.substring(offset,len).as(FlatString)) else lf = new Leaf(lf.str.substring_from(offset).as(FlatString)) - var iter = new DFSRopeLeafIterator(self) + var nod: RopeNode = lf - while iter.is_ok do - buffer_rope.append(iter.item.value) - iter.next + for i in path.stack.reverse_iterator do + if i.right then continue + var tmp = new Concat + tmp.left = nod + var r = i.node.right + if r != null then tmp.right = r + nod = tmp end - new_rope.parent_node = buffer_rope.parent_node + var ret = new RopeString + ret.root = nod - if not is_dirty then new_rope.str_representation = self.str_representation + path = ret.node_at(len-1) - return new_rope - end + offset = path.offset + nod = new Leaf(path.leaf.str.substring(0, offset+1).as(FlatString)) - # Unsafe method to convert self as an ImmutableRope - # - # To be used internally only - private fun to_immutable: ImmutableRope - do - var immutable_self = new ImmutableRope - immutable_self.parent_node = self.parent_node - return immutable_self - end + for i in path.stack.reverse_iterator do + if i.left then continue + var tmp = new Concat + tmp.right = nod + var l = i.node.left + if l != null then tmp.left = l + nod = tmp + end - ############################################################################ - # Rope refined Methods # - ############################################################################ + ret.root = nod - redef fun subrope(index_from: Int, count: Int): BufferRope - do - return super.as(BufferRope) + return ret end +end - redef fun *(repeats: Int): BufferRope - do - return super.as(BufferRope) - end +redef class FlatString - redef fun +(other: Rope): BufferRope - do - return super.as(BufferRope) - end + redef fun append(s) do return (new RopeString.from(self)) + s - redef fun multi_concat(ropes: Rope...): BufferRope - do - return super.as(BufferRope) - end + redef fun prepend(s) do return (new RopeString.from(self)).prepend(s) - # Refines to add a cache method, calculates only once for every modification - # the string representation for self - redef fun to_s + redef fun insert_at(s, pos) do - if self.str_representation == null or is_dirty then - self.str_representation = flatten - is_dirty = false - end - return self.str_representation.as(not null) + if pos == 0 then return prepend(s) + if pos == length then return append(s) + + var l = substring(0,pos) + var r = substring_from(pos) + var ret: String = new RopeString.from(l) + ret += s + return ret + r end end -# Rope that cannot be modified -class ImmutableRope - super Rope +private class RopeStringChars + super SequenceRead[Char] - init - do - super - end + var tgt: Rope - redef init with_string(str) + redef fun [](pos) do - super + assert pos < tgt.length + var path = tgt.node_at(pos) + return path.leaf.str.chars[path.offset] end - ############################################################################ - # Rope refined Methods # - ############################################################################ + redef fun iterator do return iterator_from(0) - redef fun subrope(index_from: Int, count: Int): ImmutableRope - do - return (super.as(BufferRope)).to_immutable - end + redef fun iterator_from(pos) do return new RopeCharIterator(tgt, pos) - redef fun *(repeats: Int): ImmutableRope - do - return (super.as(BufferRope)).to_immutable - end + redef fun reverse_iterator do return reverse_iterator_from(tgt.length-1) - redef fun +(other: Rope): ImmutableRope - do - return (super.as(BufferRope)).to_immutable - end + redef fun reverse_iterator_from(pos) do return new ReverseRopeCharIterator(tgt, pos) +end - redef fun multi_concat(ropes: Rope...): ImmutableRope +# Used to iterate on a Rope +private class IteratorElement + + init(e: RopeNode) do - return (super.as(BufferRope)).to_immutable + if e isa Leaf then + left = true + right = true + end + node = e end + # The node being visited + var node: RopeNode + # If the node has a left child, was it visited ? + var left = false + # If the node has a right child, was it visited ? + var right = false + # Was the current node visited ? + var done = false end -############################################ -# Rope view classes # -############################################ +# Simple Postfix iterator on the nodes of a Rope +private class Postfix + super IndexedIterator[RopeNode] -class CharRopeView - super SequenceRead[Char] + # Target Rope to iterate on + var target: Rope + + # Current position in Rope + var pos: Int - # Targeted Rope for the view - private var target: Rope + # Visited nodes + var stack = new List[IteratorElement] - init(tgt: Rope) + init from(tgt: Rope, pos: Int) do self.target = tgt + self.pos = pos + if pos < 0 or pos >= tgt.length then return + var path = tgt.node_at(pos) + self.pos -= path.offset + for i in path.stack do + var item = new IteratorElement(i.node) + item.left = true + if i.right then item.right = true + stack.push item + end + var item = new IteratorElement(path.leaf) + item.done = true + stack.push item end - redef fun [](position) + redef fun item do - var tuple = target.get_node_for_pos(position) - return tuple.curr_node.value[tuple.corrected_pos] + assert is_ok + return stack.last.node end - redef fun first do return self[0] + redef fun is_ok do return not stack.is_empty - redef fun index_of(char) - do - var intern_iter = new RopeCharIterator(target) - while intern_iter.is_ok do - if intern_iter.item == char then return intern_iter.index - intern_iter.next - end - return -1 - end + redef fun index do return pos - redef fun iterator do - return new RopeCharIterator(target) + redef fun next do + if stack.is_empty then return + if pos > target.length-1 then + stack.clear + return + end + var lst = stack.last + if lst.done then + if lst.node isa Leaf then + pos += lst.node.length + end + stack.pop + next + return + end + if not lst.left then + lst.left = true + var nod = lst.node + if nod isa Concat and nod.left != null then + stack.push(new IteratorElement(nod.left.as(not null))) + next + return + end + end + if not lst.right then + lst.right = true + var nod = lst.node + if nod isa Concat and nod.right != null then + stack.push(new IteratorElement(nod.right.as(not null))) + next + return + end + end + lst.done = true end +end - redef fun last do return self[self.length-1] +# Iterates on the leaves (substrings) of the Rope +class LeavesIterator + super IndexedIterator[Leaf] - redef fun length do return target.length + private var nodes: Postfix - redef fun count(item) + init(tgt: Rope, pos: Int) do - var count = 0 - var iter = self.iterator - - for i in self do - if i == item then count += 1 - end - - return count + nodes = tgt.postfix(pos) end - redef fun has_only(item) - do - for i in self do - if i != item then return false - end - return true - end - - redef fun is_empty do return length == 0 + redef fun is_ok do return nodes.is_ok - redef fun to_a do - return to_s.to_a + redef fun item + do + assert is_ok + return nodes.item.as(Leaf) end - redef fun to_s do - return target.to_s - end + redef fun index do return nodes.index - redef fun ==(other) + redef fun next do - if not other isa SequenceRead[Char] then return false - - if self.length != other then return false - - var iter = other.iterator - - for i in self do - if i != iter.item then return false - iter.next + while nodes.is_ok do + nodes.next + if nodes.is_ok and nodes.item isa Leaf then break end - - return true end - end -########################################### -# Iterator classes # -########################################### - -# A tuple representing the state of a node for a tree parsing algorithm -private class TupleVisitNode +# Uses the leaves and calculates a new substring on each iteration +class SubstringsIterator + super IndexedIterator[Text] - init(tgt: ConcatNode) - do - self.node = tgt - end - - private var node: ConcatNode + private var nodes: IndexedIterator[Leaf] - private var left_visited = false - private var right_visited = false - -end + # Current position in Rope + var pos: Int -# Any kind of iterator parsing a Rope for LeafNodes -private abstract class RopeIterator - super IndexedIterator[LeafNode] + # Current substring, computed from the current Leaf and indexes + var substring: Text - # Rope meant to be visited - private var _target: Rope + init(tgt: Rope, pos: Int) + do + nodes = tgt.leaves(pos) + self.pos = pos + if pos < 0 or pos >= tgt.length then return + make_substring + end - private fun target: Rope do return self._target + # Compute the bounds of the current substring and makes the substring + private fun make_substring + do + substring = nodes.item.str + var min = 0 + var length = substring.length + if nodes.index < pos then + min = pos - nodes.index + end + substring = substring.substring(min, length) + end - # Position in target - private var pos = 0 + redef fun is_ok do return nodes.is_ok - init(tgt: Rope) + redef fun item do - self._target = tgt + assert is_ok + return substring end - init with_index(tgt: Rope, index: Int) + redef fun index do return pos + + redef fun next do - self._target = tgt + pos += substring.length + nodes.next + if nodes.is_ok then make_substring end end -# Iterator returning the content of a rope one char at a time class RopeCharIterator super IndexedIterator[Char] - # The iterator used to visit the rope - private var sub_str_iter: DFSRopeLeafIterator + var substrings: IndexedIterator[Text] - # The current position in the rope - private var abs_pos = 0 + var pos: Int - # The position in the current substring - private var sub_pos: Int = 0 + var max: Int - # The substring contained in the current node visited by `sub_str_iter` - private var curr_substring: nullable String + var substr_iter: IndexedIterator[Char] - init(tgt: Rope) + init(tgt: Rope, from: Int) do - sub_str_iter = new DFSRopeLeafIterator(tgt) - if sub_str_iter.is_ok then curr_substring = sub_str_iter.item.value + substrings = tgt.substrings_from(from) + max = tgt.length - 1 + if not substrings.is_ok then + pos = tgt.length + return + end + pos = from + substr_iter = substrings.item.chars.iterator end - redef fun item do return curr_substring[sub_pos] + redef fun item do return substr_iter.item - redef fun is_ok - do - if sub_str_iter.is_ok then return true - if not sub_str_iter.is_ok and curr_substring != null and sub_pos < curr_substring.length then return true - return false - end + redef fun is_ok do return pos <= max + + redef fun index do return pos redef fun next do - assert is_ok - if sub_pos < curr_substring.length - 1 then - sub_pos += 1 - else - sub_str_iter.next - if sub_str_iter.is_ok then - curr_substring = sub_str_iter.item.value - sub_pos = 0 - else - sub_pos = curr_substring.length + pos += 1 + if substr_iter.is_ok then + substr_iter.next + end + if not substr_iter.is_ok then + substrings.next + if substrings.is_ok then + substr_iter = substrings.item.chars.iterator end end - abs_pos += 1 end - - redef fun index do return abs_pos - end -# Special kind of iterator -# -# Performs a Depth-First Search on RopeLeaf items -# -private class DFSRopeLeafIterator - super RopeIterator +private class ReversePostfix + super IndexedIterator[RopeNode] - # Stack of the visited nodes in the rope - private var visit_stack = new List[TupleVisitNode] + var target: Rope - # The leaf node being visited by the iterator - private var curr_leaf: nullable LeafNode + var pos: Int - init(tgt: Rope) - do - super + var min = 0 - var first_node = target.parent_node + var stack = new List[IteratorElement] - if first_node isa ConcatNode then - visit_stack.push(new TupleVisitNode(first_node)) - else if first_node isa LeafNode then - curr_leaf = first_node - return + init from(tgt: Rope, pos: Int) + do + self.pos = pos + target = tgt + if pos < 0 or pos >= tgt.length then return + var path = tgt.node_at(pos) + self.pos -= path.offset + for i in path.stack do + var elemt = new IteratorElement(i.node) + elemt.right = true + if i.left then + elemt.left = true + end + stack.push elemt end - - next_body + stack.push(new IteratorElement(path.leaf)) + stack.last.done = true end - # Creates a new iterator on `tgt` starting at `index` - redef init with_index(tgt: Rope, index: Int) - do - super - - var returned_tuple = target.get_node_for_pos(index) - curr_leaf = returned_tuple.curr_node - visit_stack = returned_tuple.visit_stack - pos = index - returned_tuple.corrected_pos + redef fun item do + assert is_ok + return stack.last.node end - redef fun is_ok do return curr_leaf != null + redef fun is_ok do return not stack.is_empty + + redef fun index do return pos redef fun next do - assert is_ok - pos += curr_leaf.value.length - next_body + if stack.is_empty then return + if pos < min then + stack.clear + return + end + var lst = stack.last + if lst.done then + stack.pop + next + return + end + if not lst.right then + var nod = lst.node.as(Concat) + var rgt = nod.right + lst.right = true + if rgt != null then + stack.push(new IteratorElement(rgt)) + next + return + end + end + if not lst.left then + var nod = lst.node.as(Concat) + var lft = nod.left + lst.left = true + if lft != null then + stack.push(new IteratorElement(lft)) + next + return + end + end + if lst.node isa Leaf then pos -= lst.node.length + lst.done = true end +end - private fun next_body - do - var next_node: nullable RopeNode - while not visit_stack.is_empty do - var curr_concat_tuple = visit_stack.last - if not curr_concat_tuple.left_visited then - - curr_concat_tuple.left_visited = true - - next_node = curr_concat_tuple.node.left_child - - if next_node == null then continue - - if next_node isa ConcatNode then - visit_stack.push(new TupleVisitNode(next_node)) - else if next_node isa LeafNode then - curr_leaf = next_node - return - end - - else if not curr_concat_tuple.right_visited then +private class ReverseLeavesIterator + super IndexedIterator[Leaf] - curr_concat_tuple.right_visited = true + var nodes: ReversePostfix - next_node = curr_concat_tuple.node.right_child + init(tgt: Rope, from: Int) + do + nodes = tgt.reverse_postfix(from) + end - if next_node == null then continue + redef fun is_ok do return nodes.is_ok - if next_node isa ConcatNode then - visit_stack.push(new TupleVisitNode(next_node)) - else if next_node isa LeafNode then - curr_leaf = next_node - return - end + redef fun item do + assert is_ok + return nodes.item.as(Leaf) + end - else - visit_stack.pop - end + redef fun next do + while nodes.is_ok do + nodes.next + if nodes.is_ok then if nodes.item isa Leaf then break end - self.curr_leaf = null end - redef fun item - do - assert is_ok - return curr_leaf.as(not null) - end + redef fun index do return nodes.index end -########################################### -# Node classes # -########################################### - -# A node for a Rope -private abstract class RopeNode - - private var _length = 0 - - private var parent: nullable ConcatNode = null - - private var height = 0 - - # The balance factor of a node, if it is a Leaf, it equals its length - # Else, it will be equal to the difference between the height on the left and on the right - private fun balance_factor: Int do return height end +private class ReverseSubstringsIterator + super IndexedIterator[Text] - fun length: Int do return _length + var leaves: ReverseLeavesIterator - private fun length=(len: Int) - do - _length = len - end -end - -# Node that represents a concatenation between two nodes (of any RopeNode type) -private class ConcatNode - super RopeNode + var pos: Int - private var _left_child: nullable RopeNode = null - private var _right_child: nullable RopeNode = null + var str: Text - private fun left_child: nullable RopeNode + init(tgt: Rope, from: Int) do - if _left_child != null then - return _left_child - else - return null - end + leaves = tgt.reverse_leaves(from) + pos = from + if not leaves.is_ok then return + str = leaves.item.str + make_substring end - private fun right_child: nullable RopeNode + fun make_substring do - if _right_child != null then - return _right_child - else - return null - end + if pos >= (leaves.index + str.length - 1) then return + str = str.substring(0, (pos - leaves.index + 1)) end - private fun left_child=(new_node: nullable RopeNode) - do - self._left_child = new_node - new_node.parent = self - update_data - end + redef fun is_ok do return leaves.is_ok - private fun right_child=(new_node: nullable RopeNode) - do - self._right_child = new_node - new_node.parent = self - update_data + redef fun item do + assert is_ok + return str end - # Updates the internal data of the current node - # - # Concretely, updates the length and the height of the node - private fun update_data - do - self.length = 0 - self.height = 1 - if left_child != null then - self.length += left_child.length - if left_child.height + 1 > self.height then self.height = left_child.height + 1 - end - if right_child != null then - self.length += right_child.length - if right_child.height + 1 > self.height then self.height = right_child.height + 1 - end - end + redef fun index do return pos - # Computes and returns the balance factor (used for AVL trees) - # - # Formula : left.height - right.height - redef private fun balance_factor - do - var left_height = 0 - var right_height = 0 - if left_child != null then left_height = left_child.height - if right_child != null then right_height = right_child.height - return left_height - right_height + redef fun next do + pos -= str.length + leaves.next + if not leaves.is_ok then return + str = leaves.item.str + make_substring end end -# A leaf node contains a substring of some sort -private class LeafNode - super RopeNode +private class ReverseRopeCharIterator + super IndexedIterator[Char] - # Encapsulated string in the leaf node - private var _value: String + var substrs: IndexedIterator[Text] - init(val: String) - do - self._value = val.to_s - self.length = val.length - end + var pos: Int - private fun value: String do return self._value + var subiter: IndexedIterator[Char] - private fun value= (val: String) + init(tgt: Rope, from: Int) do - _value = val + substrs = tgt.reverse_substrings_from(from) + if not substrs.is_ok then + pos = -1 + return + end + subiter = substrs.item.chars.reverse_iterator + pos = from end -end -##################################################### -# Foreign classes refinement # -##################################################### + redef fun is_ok do return pos >= 0 -redef class String - redef fun ==(other) - do - if other isa Rope then - return other == self - else - return super - end + redef fun item do + assert is_ok + return subiter.item end -end -redef class Buffer - redef fun ==(other) - do - if other isa Rope then - return other == self - else - return super + redef fun index do return pos + + redef fun next do + pos -= 1 + if subiter.is_ok then subiter.next + if not subiter.is_ok then + if substrs.is_ok then substrs.next + if substrs.is_ok then subiter = substrs.item.chars.reverse_iterator end end end + diff --git a/lib/standard/standard.nit b/lib/standard/standard.nit index 6297038..85d28c9 100644 --- a/lib/standard/standard.nit +++ b/lib/standard/standard.nit @@ -22,7 +22,7 @@ import string_search import file import exec import stream -import string +import ropes import collection import math import kernel diff --git a/lib/standard/stream.nit b/lib/standard/stream.nit index 507ba8d..504396a 100644 --- a/lib/standard/stream.nit +++ b/lib/standard/stream.nit @@ -13,7 +13,7 @@ # Input and output streams of characters module stream -import string +intrude import ropes in "C" `{ #include @@ -136,6 +136,29 @@ redef class Text redef fun write_to(stream) do stream.write(self) end +redef class RopeNode + super Streamable +end + +redef class Leaf + + redef fun write_to(s) do s.write(str) +end + +redef class Concat + + redef fun write_to(s) + do + if left != null then left.write_to(s) + if right != null then right.write_to(s) + end +end + +redef class RopeString + + redef fun write_to(s) do root.write_to(s) +end + # Input streams with a buffer abstract class BufferedIStream super IStream diff --git a/lib/standard/string.nit b/lib/standard/string.nit index 59a286d..fcc1f1b 100644 --- a/lib/standard/string.nit +++ b/lib/standard/string.nit @@ -59,6 +59,9 @@ abstract class Text # In this case, `from += count` and `count -= from`. fun substring(from: Int, count: Int): SELFTYPE is abstract + # Iterates on the substrings of self if any + fun substrings: Iterator[Text] is abstract + # Concatenates `o` to `self` # # assert "hello" + "world" == "helloworld" @@ -609,6 +612,28 @@ abstract class String redef fun to_s do return self + fun append(s: String): SELFTYPE is abstract + + fun prepend(s: String): SELFTYPE is abstract + + fun insert_at(s: String, pos: Int): SELFTYPE is abstract +end + +private class FlatSubstringsIter + super Iterator[FlatText] + + var tgt: nullable FlatText + + init(tgt: FlatText) do self.tgt = tgt + + redef fun item do + assert is_ok + return tgt.as(not null) + end + + redef fun is_ok do return tgt != null + + redef fun next do tgt = null end # Immutable strings of characters. @@ -616,8 +641,6 @@ class FlatString super FlatText super String - redef type SELFTYPE: FlatString - # Index in _items of the start of the string private var index_from: Int @@ -876,6 +899,8 @@ class FlatString return hash_cache.as(not null) end + + redef fun substrings do return new FlatSubstringsIter(self) end private class FlatStringReverseIterator @@ -1011,6 +1036,8 @@ class FlatBuffer private var capacity: Int = 0 + redef fun substrings do return new FlatSubstringsIter(self) + redef fun []=(index, item) do is_dirty = true diff --git a/share/nitdoc/css/Nitdoc.GitHub.css b/share/nitdoc/css/Nitdoc.GitHub.css index bba519c..a2d675f 100644 --- a/share/nitdoc/css/Nitdoc.GitHub.css +++ b/share/nitdoc/css/Nitdoc.GitHub.css @@ -20,18 +20,11 @@ * Nitdoc Github Login Box */ -#nitdoc-github-li { - float: left; - padding: 0; - margin: -2px 5px 5px 15px; -} - #nitdoc-github-li.current { color: #999; } -#nitdoc-github-li .nitdoc-github-li-img { - width: 20px; +#nitdoc-github-li .glyphicon { cursor: pointer; } @@ -93,23 +86,6 @@ text-align:center; } -#nitdoc-github-loginbox input { - width: 212px; - height: 20px; - padding: 3px; - margin: 5px 0px 5px 0px; - color: black; - font-style: normal; - font-size: 12px; - border: 1px solid #CCC; -} - -#nitdoc-github-loginbox button { - margin-top: 15px; - width: 220px; - font-weight: bold; -} - #nitdoc-github-loginbox h4 { display: block; width: 100%; @@ -126,57 +102,6 @@ color: #0D8921; } -/* - * Nitdoc Github buttons - */ - -.nitdoc-github-button { - display: inline-block; - cursor: pointer; - background-color: #92C929; - background-image: -webkit-gradient(linear, left top, left bottom, from(#92C929), to(#1d7900)); /* Saf4+, Chrome */ - background-image: -webkit-linear-gradient(top, #92C929, #1d7900); /* Chrome 10+, Saf5.1+ */ - background-image: -moz-linear-gradient(top, #92C929, #1d7900); /* FF3.6 */ - background-image: -ms-linear-gradient(top, #92C929, #1d7900); /* IE10 */ - background-image: -o-linear-gradient(top, #92C929, #1d7900); /* Opera 11.10+ */ - background-image: linear-gradient(top, #92C929, #1d7900); - filter: progid:DXImageTransform.Microsoft.gradient(startColorStr='#92C929', EndColorStr='#1d7900'); /* IE6–IE9 */ - border-radius: 2px; - -moz-border-radius: 2px; - -webkit-border-radius: 2px; - -moz-background-clip: padding; -webkit-background-clip: padding-box; background-clip: padding-box; - box-shadow: 0px 2px 4px rgba(0,0,0, .2); - -moz-box-shadow: 0px 2px 4px rgba(0,0,0, .2); - -webkit-box-shadow: 0px 2px 4px rgba(0,0,0, .2); - text-shadow: 0px -1px 0px rgba(0, 0, 0, 0.2); - -moz-text-shadow: 0px -1px 0px rgba(0, 0, 0, 0.2); - -webkit-text-shadow: 0px -1px 0px rgba(0, 0, 0, 0.2); - border: 1px solid #1d7900; - color: #fff; - font-size: 14px; - padding: 5px 7px 5px 7px; - text-align: center; -} - -button.nitdoc-github-button[disabled=disabled] { - background-color: #999999; - background-image: -webkit-gradient(linear, left top, left bottom, from(#999999), to(#333333)); /* Saf4+, Chrome */ - background-image: -webkit-linear-gradient(top, #999999, #333333); /* Chrome 10+, Saf5.1+ */ - background-image: -moz-linear-gradient(top, #999999, #333333); /* FF3.6 */ - background-image: -ms-linear-gradient(top, #999999, #333333); /* IE10 */ - background-image: -o-linear-gradient(top, #999999, #333333); /* Opera 11.10+ */ - background-image: linear-gradient(top, #999999, #333333); - filter: progid:DXImageTransform.Microsoft.gradient(startColorStr='#999999', EndColorStr='#333333'); /* IE6–IE9 */ - border: 1px solid #333333; -} - -button.nitdoc-github-button img { - margin-right: 7px; - margin-bottom: -3px; - height: 16px; - width: 16px; -} - /* Comment editing */ .nitdoc-github-commentbox { diff --git a/share/nitdoc/css/Nitdoc.QuickSearch.css b/share/nitdoc/css/Nitdoc.QuickSearch.css index 42b3925..81bba5d 100644 --- a/share/nitdoc/css/Nitdoc.QuickSearch.css +++ b/share/nitdoc/css/Nitdoc.QuickSearch.css @@ -20,19 +20,9 @@ * Nitdoc Quick Search JS module */ -#nitdoc-qs-li { - float: right; - padding: 0; - margin: 0; -} - #nitdoc-qs-field { width: 300px; -} - -#nitdoc-qs-field.nitdoc-qs-field-notused { - color: #999; - font-style: italic; + margin-top: 3px; } #nitdoc-qs-table { diff --git a/share/nitdoc/css/main.css b/share/nitdoc/css/main.css deleted file mode 100644 index 4659036..0000000 --- a/share/nitdoc/css/main.css +++ /dev/null @@ -1,482 +0,0 @@ -/* General */ - -body { - font: 14px "Helvetica Neue", Helvetica, Tahoma, sans-serif; -} - -a { - color: #333; - text-decoration: none; -} - -a:hover { - color: #0D8921; -} - -ul { - list-style-type: square; -} - -pre, code { - white-space: pre; - font-family: monospace; - font-size: 1em; -} - -.description div.comment { - background: #EEE; - color: black; - overflow: auto; - padding: 0 0 0 12px; - margin: 1em 0 0 0; -} - -.description textarea.baseComment { - display: none; -} - -hr { - background-color: #DDD; - height: 1px; - border: 0; -} - -div.clear { - clear: both; -} - -/* Titles */ - -h1, h2, h3, h4, h5 { - font-family: Verdana, Geneva, sans-serif; - color: #6C6C6C; - font-weight: normal; -} - -h1 { - font-size: 300%; - margin: 0 0 10px 0; -} - -h3 { - font-weight: bold; -} - -/* Page display */ - -html { - height: 100%; - overflow: hidden; -} - -body { - height: 100%; - margin: 0; -} - -header { - position: fixed; - z-index: 50; - left: 0; - right: 0; -} - -.page { - margin: auto; - height: 100%; -} - -.sidebar { - position: fixed; - z-index: 10; - top: 50px; - bottom: 1em; - width: 250px; - overflow-y: scroll; -} - -.sidebar nav:last-child { - margin-bottom: 0; -} - -.content { - position: fixed; - z-index: 10; - top: 50px; - bottom: 1em; - left: 0; - right: 0; - margin-left: 265px; - overflow-y: scroll; - margin-right: 5px; - padding-right: 10px; -} - -.content.fullpage { - margin-left: 20px; - width: auto; -} - -.page.footed .content, .page.footed .sidebar { - bottom: 2em; -} - -footer { - position: fixed; - z-index: 50; - bottom: 0; - width: 100%; -} - -/* Webkit scroll bars */ - -.sidebar { - overflow-y: hidden; -} - -.sidebar:hover { - overflow-y: scroll; -} - -.sidebar::-webkit-scrollbar, .content::-webkit-scrollbar { - width: 10px; -} - -.sidebar::-webkit-scrollbar-thumb, .content::-webkit-scrollbar-thumb { - background: #CCC; - -webkit-box-shadow: inset 1px 1px 0 rgba(0,0,0,0.10),inset 0 -1px 0 rgba(0,0,0,0.07); -} - -.sidebar::-webkit-scrollbar-thumb:hover, .content::-webkit-scrollbar-thumb:hover { - background: #999; -} - -.sidebar::-webkit-scrollbar-corner, .content::-webkit-scrollbar-corner { - background: transparent; -} - -.sidebar::-webkit-scrollbar-button, .content::-webkit-scrollbar-button { - width: 0; - height: 0; - display: none; -} - -/* Header, Footer */ - -header nav ul { - padding: 0; - list-style-type: none; - margin: auto; -} - -header nav ul li { - display: inline; - padding: 3px 6px; - margin: auto 5px; - color: #999; -} - -footer { - text-align: center; - padding-bottom: 10px; - color: #CCC; -} - -/* Main menu */ - -header nav.main { - background: #f1f1f1; - border-bottom: 1px solid #ddd; - padding: 7px 0; -} - -header nav.main ul li.current { - background: #0D8921; - border-radius: 2px; - -moz-border-radius: 2px; - -webkit-border-radius: 2px; - border: 1px solid #1d7900; - color: #fff; - text-shadow: 0px -1px 0px rgba(0, 0, 0, 0.2); - -moz-text-shadow: 0px -1px 0px rgba(0, 0, 0, 0.2); - -webkit-text-shadow: 0px -1px 0px rgba(0, 0, 0, 0.2); -} - -/* Sidebar */ - -.sidebar nav { - margin: 20px; - width: 208px; - border: 1px solid #ddd; -} - -.sidebar nav:first-child { - margin-top: 0; -} - -.sidebar nav h3 { - margin: 0; - padding: 5px; - background: #f1f1f1; - font-size: 1em; - -webkit-touch-callout: none; - -webkit-user-select: none; - -khtml-user-select: none; - -moz-user-select: none; - -ms-user-select: none; - user-select: none; -} - -.sidebar nav h4 { - font-weight: bold; - color: #555555; - margin: 10px 0 0 10px; - font-size: 12px; -} - -.sidebar nav h4:last-child { - margin-bottom: 5px; -} - -.sidebar nav ul { - margin: 10px; - padding: 0; - list-style-type: none; -} - -.sidebar nav ul li { - overflow: hidden; - color: #CCC; -} - -/* Content */ - -.content article { - color: #6C6C6C; - background-repeat: no-repeat; - background-position: left 7px; - margin: 20px 0; - padding: 5px 20px; -} - -.content article h3 { - margin: 0; - font-weight: bold; - color: #333; -} - -.content article.graph { - text-align: center; -} - -.content article.modules, -.content article.classes, -.content article.properties { - float: left; - width: 250px; - overflow: hidden; -} - -.content article.overview ul, -.content article.modules ul, -.content article.classes ul, -.content article.properties ul { - list-style-type: none; - padding: 0; -} - -.content article.properties ul ul { - padding-left: 10px; -} - -nav ul li span { - color: #CCC; - text-align: center; - font-family: monospace; - margin-right: 5px; -} - -.content article.modules ul code, -.content article.classes ul code, -.content article.properties ul code { - font-weight: normal; -} - -.content section.summary h2, .content section.summary article{ - color: #000000; -} - -.content section.summary article h3{ - font-weight: bold; - color: #555; -} - -.content article:target { - background-color: #FFF3C2; - color: black; -} - -.content .subtitle { - color: #6C6C6C; -} - -.content a { - color: #0D8921; -} - -.content a:hover { - color: #333; -} - -.info { - color: #6C6C6C; -} - -.info a { - color: #333; -} - -.info a:hover { - color: #0D8921; -} - - -article .info .code { - float: right; -} - -.description .inheritance { - text-align: right; - margin: 2px; - -} - -.content .concern-doc { - border-bottom: 1px dashed #CCC; - padding: 5px 0; - color: #6C6C6C; -} - -.content section.concerns { - padding: 10px; - border: 1px solid #ccc; - -} - -.content section.concerns h2 { - margin-top: 0; -} - -.content section.concerns ul { - list-style-type: none; - padding-left: 0; - margin: 0; -} - -.content section.concerns li { - margin-top: 10px; -} - -.content section.concerns ul ul { - padding-left: 20px; -} - -.content section.concerns ul ul li { - margin-top: 0; -} - -.content section.methods h3.concern-toplevel { - padding: 10px; - border: 1px solid #ccc; - color: #6C6C6C; -} - -.show-code { - margin: 0; -} - -/* Icons */ - -.type.public, .interface.public, .abstract.class.public { background-image: url('../resources/icons/vtype_public.png')} -.type.protected, .interface.protected, .abstract.class.protected { background-image: url('../resources/icons/vtype_protected.png')} -.type.private, .interface.private, .abstract.class.private { background-image: url('../resources/icons/vtype_private.png')} -.init.public, .enum.public { background-image: url('../resources/icons/const_public.png')} -.init.protected, .enum.protected { background-image: url('../resources/icons/const_protected.png')} -.init.private, .enum.private { background-image: url('../resources/icons/const_private.png')} -.fun.public, .class.public, .extern.public { background-image: url('../resources/icons/meth_public.png')} -.fun.protected, .class.protected, .extern.protected { background-image: url('../resources/icons/meth_protected.png')} -.fun.private, .class.private, .extern.private { background-image: url('../resources/icons/meth_private.png')} - -/* Form elements */ - -input[type=text] { - border: 1px solid #CCC; - padding: 1px 2px; -} - -nav.main input[type=text] { - margin: -2px 10px; - color: black; - font-style: normal; -} - -/* New comments style */ - -.nitdoc { - background: #F7F7F7; - padding: 5px; - color: black; - overflow: auto; -} - -.nitdoc pre { - background: #EEE; -} - -.nitdoc code { - background: #DDD; - padding: 0 1px; -} - -.nitdoc pre code { - background: none; -} - -.nitdoc .synopsys, .nitdoc p:first-child { - font-weight: bold; - color: #6c6c6c; -} - -.rawcode { -} - -.nitcode a { color: inherit; text-decoration: inherit; } /* hide links */ -.nitcode a:hover { text-decoration: underline; } /* underline links */ -.nitcode span[title]:hover { text-decoration: underline; } /* underline titles */ -/* lexical raw tokens. independent of usage or semantic: */ -.nitcode .nc_c { color: gray; font-style: italic; } /* comment */ -.nitcode .nc_d { color: #3D8127; font-style: italic; } /* documentation comments */ -.nitcode .nc_k { font-weight: bold; } /* keyword */ -.nitcode .nc_o {} /* operator */ -.nitcode .nc_i {} /* standard identifier */ -.nitcode .nc_t { color: #445588; font-weight: bold; } /* type/class identifier */ -.nitcode .nc_a { color: #445588; font-style: italic; } /* old style attribute identifier */ -.nitcode .nc_l { color: #009999; } /* char and number literal */ -.nitcode .nc_s { color: #8F1546; } /* string literal */ -/* syntactic token usage. added because of their position in the AST */ -.nitcode .nc_ast { color: blue; } /* assert label */ -.nitcode .nc_la { color: blue; } /* break/continue label */ -.nitcode .nc_m { color: #445588; } /* module name */ -/* syntactic groups */ -.nitcode .nc_def { font-weight: bold; color: blue; } /* name used in a definition */ -.nitcode .nc_def.nc_a { color: blue; } /* name used in a attribute definition */ -.nitcode .nc_def.nc_t { color: blue; } /* name used in a class or vt definition */ -.nitcode .nc_ss { color: #9E6BEB; } /* superstrings */ -.nitcode .nc_cdef {} /* A whole class definition */ -.nitcode .nc_pdef {} /* A whole property definition */ -/* semantic token usage */ -.nitcode .nc_v { font-style: italic; } /* local variable or parameter */ -.nitcode .nc_vt { font-style: italic; } /* virtual type or formal type */ - -.nitcode .nc_error { border: 1px red solid;} /* not used */ - diff --git a/share/nitdoc/css/nitdoc.bootstrap.css b/share/nitdoc/css/nitdoc.bootstrap.css new file mode 100644 index 0000000..0351b6f --- /dev/null +++ b/share/nitdoc/css/nitdoc.bootstrap.css @@ -0,0 +1,5784 @@ +/*! + * Bootstrap v3.1.1 + * + * Copyright 2014 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 by @mdo and @fat. + * BootSwatchr built and provided by @DrewStrickland + */ +/*! normalize.css v3.0.0 | MIT License | git.io/normalize */ +html { + font-family: sans-serif; + -ms-text-size-adjust: 100%; + -webkit-text-size-adjust: 100%; +} +body { + margin: 0; +} +article, +aside, +details, +figcaption, +figure, +footer, +header, +hgroup, +main, +nav, +section, +summary { + display: block; +} +audio, +canvas, +progress, +video { + display: inline-block; + vertical-align: baseline; +} +audio:not([controls]) { + display: none; + height: 0; +} +[hidden], +template { + display: none; +} +a { + background: transparent; +} +a:active, +a:hover { + outline: 0; +} +abbr[title] { + border-bottom: 1px dotted; +} +b, +strong { + font-weight: bold; +} +dfn { + font-style: italic; +} +h1 { + font-size: 2em; + margin: 0.67em 0; +} +mark { + background: #ff0; + color: #000; +} +small { + font-size: 80%; +} +sub, +sup { + font-size: 75%; + line-height: 0; + position: relative; + vertical-align: baseline; +} +sup { + top: -0.5em; +} +sub { + bottom: -0.25em; +} +img { + border: 0; +} +svg:not(:root) { + overflow: hidden; +} +figure { + margin: 1em 40px; +} +hr { + -moz-box-sizing: content-box; + box-sizing: content-box; + height: 0; +} +pre { + overflow: auto; +} +code, +kbd, +pre, +samp { + font-family: monospace, monospace; + font-size: 1em; +} +button, +input, +optgroup, +select, +textarea { + color: inherit; + font: inherit; + margin: 0; +} +button { + overflow: visible; +} +button, +select { + text-transform: none; +} +button, +html input[type="button"], +input[type="reset"], +input[type="submit"] { + -webkit-appearance: button; + cursor: pointer; +} +button[disabled], +html input[disabled] { + cursor: default; +} +button::-moz-focus-inner, +input::-moz-focus-inner { + border: 0; + padding: 0; +} +input { + line-height: normal; +} +input[type="checkbox"], +input[type="radio"] { + box-sizing: border-box; + padding: 0; +} +input[type="number"]::-webkit-inner-spin-button, +input[type="number"]::-webkit-outer-spin-button { + height: auto; +} +input[type="search"] { + -webkit-appearance: textfield; + -moz-box-sizing: content-box; + -webkit-box-sizing: content-box; + box-sizing: content-box; +} +input[type="search"]::-webkit-search-cancel-button, +input[type="search"]::-webkit-search-decoration { + -webkit-appearance: none; +} +fieldset { + border: 1px solid #c0c0c0; + margin: 0 2px; + padding: 0.35em 0.625em 0.75em; +} +legend { + border: 0; + padding: 0; +} +textarea { + overflow: auto; +} +optgroup { + font-weight: bold; +} +table { + border-collapse: collapse; + border-spacing: 0; +} +td, +th { + padding: 0; +} +@media print { + * { + text-shadow: none !important; + color: #000 !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) ")"; + } + 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; + } + p, + h2, + h3 { + orphans: 3; + widows: 3; + } + h2, + h3 { + page-break-after: avoid; + } + select { + background: #fff !important; + } + .navbar { + display: none; + } + .table td, + .table th { + background-color: #fff !important; + } + .btn > .caret, + .dropup > .btn > .caret { + border-top-color: #000 !important; + } + .label { + border: 1px solid #000; + } + .table { + border-collapse: collapse !important; + } + .table-bordered th, + .table-bordered td { + border: 1px solid #ddd !important; + } +} +* { + -webkit-box-sizing: border-box; + -moz-box-sizing: border-box; + box-sizing: border-box; +} +*:before, +*:after { + -webkit-box-sizing: border-box; + -moz-box-sizing: border-box; + box-sizing: border-box; +} +html { + font-size: 62.5%; + -webkit-tap-highlight-color: rgba(0, 0, 0, 0); +} +body { + font-family: "Helvetica Neue", Helvetica, Arial, sans-serif; + font-size: 14px; + line-height: 1.428571429; + color: #333333; + background-color: #ffffff; +} +input, +button, +select, +textarea { + font-family: inherit; + font-size: inherit; + line-height: inherit; +} +a { + color: #222222; + text-decoration: none; +} +a:hover, +a:focus { + color: #0d8921; + text-decoration: underline; +} +a:focus { + outline: thin dotted; + outline: 5px auto -webkit-focus-ring-color; + outline-offset: -2px; +} +figure { + margin: 0; +} +img { + vertical-align: middle; +} +.img-responsive, +.thumbnail > img, +.thumbnail a > img, +.carousel-inner > .item > img, +.carousel-inner > .item > a > img { + display: block; + max-width: 100%; + height: auto; +} +.img-rounded { + border-radius: 4px; +} +.img-thumbnail { + padding: 4px; + line-height: 1.428571429; + background-color: #ffffff; + border: 1px solid #dddddd; + border-radius: 3px; + -webkit-transition: all 0.2s ease-in-out; + transition: all 0.2s ease-in-out; + display: inline-block; + max-width: 100%; + height: auto; +} +.img-circle { + border-radius: 50%; +} +hr { + margin-top: 20px; + margin-bottom: 20px; + border: 0; + border-top: 1px solid #eeeeee; +} +.sr-only { + position: absolute; + width: 1px; + height: 1px; + margin: -1px; + padding: 0; + overflow: hidden; + clip: rect(0, 0, 0, 0); + border: 0; +} +h1, +h2, +h3, +h4, +h5, +h6, +.h1, +.h2, +.h3, +.h4, +.h5, +.h6 { + font-family: inherit; + font-weight: 500; + line-height: 1.1; + color: inherit; +} +h1 small, +h2 small, +h3 small, +h4 small, +h5 small, +h6 small, +.h1 small, +.h2 small, +.h3 small, +.h4 small, +.h5 small, +.h6 small, +h1 .small, +h2 .small, +h3 .small, +h4 .small, +h5 .small, +h6 .small, +.h1 .small, +.h2 .small, +.h3 .small, +.h4 .small, +.h5 .small, +.h6 .small { + font-weight: normal; + line-height: 1; + color: #999999; +} +h1, +.h1, +h2, +.h2, +h3, +.h3 { + margin-top: 20px; + margin-bottom: 10px; +} +h1 small, +.h1 small, +h2 small, +.h2 small, +h3 small, +.h3 small, +h1 .small, +.h1 .small, +h2 .small, +.h2 .small, +h3 .small, +.h3 .small { + font-size: 65%; +} +h4, +.h4, +h5, +.h5, +h6, +.h6 { + margin-top: 10px; + margin-bottom: 10px; +} +h4 small, +.h4 small, +h5 small, +.h5 small, +h6 small, +.h6 small, +h4 .small, +.h4 .small, +h5 .small, +.h5 .small, +h6 .small, +.h6 .small { + font-size: 75%; +} +h1, +.h1 { + font-size: 36px; +} +h2, +.h2 { + font-size: 30px; +} +h3, +.h3 { + font-size: 24px; +} +h4, +.h4 { + font-size: 18px; +} +h5, +.h5 { + font-size: 14px; +} +h6, +.h6 { + font-size: 12px; +} +p { + margin: 0 0 10px; +} +.lead { + margin-bottom: 20px; + font-size: 16px; + font-weight: 200; + line-height: 1.4; +} +@media (min-width: 768px) { + .lead { + font-size: 21px; + } +} +small, +.small { + font-size: 85%; +} +cite { + font-style: normal; +} +.text-left { + text-align: left; +} +.text-right { + text-align: right; +} +.text-center { + text-align: center; +} +.text-justify { + text-align: justify; +} +.text-muted { + color: #999999; +} +.text-primary { + color: #0d8921; +} +a.text-primary:hover { + color: #095a16; +} +.text-success { + color: #5cb85c; +} +a.text-success:hover { + color: #449d44; +} +.text-info { + color: #6c6c6c; +} +a.text-info:hover { + color: #525252; +} +.text-warning { + color: #f0ad4e; +} +a.text-warning:hover { + color: #ec971f; +} +.text-danger { + color: #d9534f; +} +a.text-danger:hover { + color: #c9302c; +} +.bg-primary { + color: #fff; + background-color: #0d8921; +} +a.bg-primary:hover { + background-color: #095a16; +} +.bg-success { + background-color: #eaf6ea; +} +a.bg-success:hover { + background-color: #c7e6c7; +} +.bg-info { + background-color: #ececec; +} +a.bg-info:hover { + background-color: #d2d2d2; +} +.bg-warning { + background-color: #fef9f3; +} +a.bg-warning:hover { + background-color: #fae3c4; +} +.bg-danger { + background-color: #f9e2e2; +} +a.bg-danger:hover { + background-color: #f0b9b8; +} +.page-header { + padding-bottom: 9px; + margin: 40px 0 20px; + border-bottom: 1px solid #eeeeee; +} +ul, +ol { + margin-top: 0; + margin-bottom: 10px; +} +ul ul, +ol ul, +ul ol, +ol ol { + margin-bottom: 0; +} +.list-unstyled { + padding-left: 0; + list-style: none; +} +.list-inline { + padding-left: 0; + list-style: none; + margin-left: -5px; +} +.list-inline > li { + display: inline-block; + padding-left: 5px; + padding-right: 5px; +} +dl { + margin-top: 0; + margin-bottom: 20px; +} +dt, +dd { + line-height: 1.428571429; +} +dt { + font-weight: bold; +} +dd { + margin-left: 0; +} +@media (min-width: 768px) { + .dl-horizontal dt { + float: left; + width: 160px; + clear: left; + text-align: right; + overflow: hidden; + text-overflow: ellipsis; + white-space: nowrap; + } + .dl-horizontal dd { + margin-left: 180px; + } +} +abbr[title], +abbr[data-original-title] { + cursor: help; + border-bottom: 1px dotted #999999; +} +.initialism { + font-size: 90%; + text-transform: uppercase; +} +blockquote { + padding: 10px 20px; + margin: 0 0 20px; + font-size: 17.5px; + border-left: 5px solid #eeeeee; +} +blockquote p:last-child, +blockquote ul:last-child, +blockquote ol:last-child { + margin-bottom: 0; +} +blockquote footer, +blockquote small, +blockquote .small { + display: block; + font-size: 80%; + line-height: 1.428571429; + color: #999999; +} +blockquote footer:before, +blockquote small:before, +blockquote .small:before { + content: '\2014 \00A0'; +} +.blockquote-reverse, +blockquote.pull-right { + padding-right: 15px; + padding-left: 0; + border-right: 5px solid #eeeeee; + border-left: 0; + text-align: right; +} +.blockquote-reverse footer:before, +blockquote.pull-right footer:before, +.blockquote-reverse small:before, +blockquote.pull-right small:before, +.blockquote-reverse .small:before, +blockquote.pull-right .small:before { + content: ''; +} +.blockquote-reverse footer:after, +blockquote.pull-right footer:after, +.blockquote-reverse small:after, +blockquote.pull-right small:after, +.blockquote-reverse .small:after, +blockquote.pull-right .small:after { + content: '\00A0 \2014'; +} +blockquote:before, +blockquote:after { + content: ""; +} +address { + margin-bottom: 20px; + font-style: normal; + line-height: 1.428571429; +} +code, +kbd, +pre, +samp { + font-family: Menlo, Monaco, Consolas, "Courier New", monospace; +} +code { + padding: 2px 4px; + font-size: 90%; + color: #c7254e; + background-color: #f9f2f4; + white-space: nowrap; + border-radius: 3px; +} +kbd { + padding: 2px 4px; + font-size: 90%; + color: #ffffff; + background-color: #333333; + border-radius: 2px; + box-shadow: inset 0 -1px 0 rgba(0, 0, 0, 0.25); +} +pre { + display: block; + padding: 9.5px; + margin: 0 0 10px; + font-size: 13px; + line-height: 1.428571429; + word-break: break-all; + word-wrap: break-word; + color: #333333; + background-color: #f5f5f5; + border: 1px solid #cccccc; + border-radius: 3px; +} +pre code { + padding: 0; + font-size: inherit; + color: inherit; + white-space: pre-wrap; + background-color: transparent; + border-radius: 0; +} +.pre-scrollable { + max-height: 340px; + overflow-y: scroll; +} +.container { + margin-right: auto; + margin-left: auto; + padding-left: 15px; + padding-right: 15px; +} +@media (min-width: 768px) { + .container { + width: 750px; + } +} +@media (min-width: 992px) { + .container { + width: 970px; + } +} +@media (min-width: 1200px) { + .container { + width: 1170px; + } +} +.container-fluid { + margin-right: auto; + margin-left: auto; + padding-left: 15px; + padding-right: 15px; +} +.row { + margin-left: -15px; + margin-right: -15px; +} +.col-xs-1, .col-sm-1, .col-md-1, .col-lg-1, .col-xs-2, .col-sm-2, .col-md-2, .col-lg-2, .col-xs-3, .col-sm-3, .col-md-3, .col-lg-3, .col-xs-4, .col-sm-4, .col-md-4, .col-lg-4, .col-xs-5, .col-sm-5, .col-md-5, .col-lg-5, .col-xs-6, .col-sm-6, .col-md-6, .col-lg-6, .col-xs-7, .col-sm-7, .col-md-7, .col-lg-7, .col-xs-8, .col-sm-8, .col-md-8, .col-lg-8, .col-xs-9, .col-sm-9, .col-md-9, .col-lg-9, .col-xs-10, .col-sm-10, .col-md-10, .col-lg-10, .col-xs-11, .col-sm-11, .col-md-11, .col-lg-11, .col-xs-12, .col-sm-12, .col-md-12, .col-lg-12 { + position: relative; + min-height: 1px; + padding-left: 15px; + padding-right: 15px; +} +.col-xs-1, .col-xs-2, .col-xs-3, .col-xs-4, .col-xs-5, .col-xs-6, .col-xs-7, .col-xs-8, .col-xs-9, .col-xs-10, .col-xs-11, .col-xs-12 { + float: left; +} +.col-xs-12 { + width: 100%; +} +.col-xs-11 { + width: 91.66666666666666%; +} +.col-xs-10 { + width: 83.33333333333334%; +} +.col-xs-9 { + width: 75%; +} +.col-xs-8 { + width: 66.66666666666666%; +} +.col-xs-7 { + width: 58.333333333333336%; +} +.col-xs-6 { + width: 50%; +} +.col-xs-5 { + width: 41.66666666666667%; +} +.col-xs-4 { + width: 33.33333333333333%; +} +.col-xs-3 { + width: 25%; +} +.col-xs-2 { + width: 16.666666666666664%; +} +.col-xs-1 { + width: 8.333333333333332%; +} +.col-xs-pull-12 { + right: 100%; +} +.col-xs-pull-11 { + right: 91.66666666666666%; +} +.col-xs-pull-10 { + right: 83.33333333333334%; +} +.col-xs-pull-9 { + right: 75%; +} +.col-xs-pull-8 { + right: 66.66666666666666%; +} +.col-xs-pull-7 { + right: 58.333333333333336%; +} +.col-xs-pull-6 { + right: 50%; +} +.col-xs-pull-5 { + right: 41.66666666666667%; +} +.col-xs-pull-4 { + right: 33.33333333333333%; +} +.col-xs-pull-3 { + right: 25%; +} +.col-xs-pull-2 { + right: 16.666666666666664%; +} +.col-xs-pull-1 { + right: 8.333333333333332%; +} +.col-xs-pull-0 { + right: 0%; +} +.col-xs-push-12 { + left: 100%; +} +.col-xs-push-11 { + left: 91.66666666666666%; +} +.col-xs-push-10 { + left: 83.33333333333334%; +} +.col-xs-push-9 { + left: 75%; +} +.col-xs-push-8 { + left: 66.66666666666666%; +} +.col-xs-push-7 { + left: 58.333333333333336%; +} +.col-xs-push-6 { + left: 50%; +} +.col-xs-push-5 { + left: 41.66666666666667%; +} +.col-xs-push-4 { + left: 33.33333333333333%; +} +.col-xs-push-3 { + left: 25%; +} +.col-xs-push-2 { + left: 16.666666666666664%; +} +.col-xs-push-1 { + left: 8.333333333333332%; +} +.col-xs-push-0 { + left: 0%; +} +.col-xs-offset-12 { + margin-left: 100%; +} +.col-xs-offset-11 { + margin-left: 91.66666666666666%; +} +.col-xs-offset-10 { + margin-left: 83.33333333333334%; +} +.col-xs-offset-9 { + margin-left: 75%; +} +.col-xs-offset-8 { + margin-left: 66.66666666666666%; +} +.col-xs-offset-7 { + margin-left: 58.333333333333336%; +} +.col-xs-offset-6 { + margin-left: 50%; +} +.col-xs-offset-5 { + margin-left: 41.66666666666667%; +} +.col-xs-offset-4 { + margin-left: 33.33333333333333%; +} +.col-xs-offset-3 { + margin-left: 25%; +} +.col-xs-offset-2 { + margin-left: 16.666666666666664%; +} +.col-xs-offset-1 { + margin-left: 8.333333333333332%; +} +.col-xs-offset-0 { + margin-left: 0%; +} +@media (min-width: 768px) { + .col-sm-1, .col-sm-2, .col-sm-3, .col-sm-4, .col-sm-5, .col-sm-6, .col-sm-7, .col-sm-8, .col-sm-9, .col-sm-10, .col-sm-11, .col-sm-12 { + float: left; + } + .col-sm-12 { + width: 100%; + } + .col-sm-11 { + width: 91.66666666666666%; + } + .col-sm-10 { + width: 83.33333333333334%; + } + .col-sm-9 { + width: 75%; + } + .col-sm-8 { + width: 66.66666666666666%; + } + .col-sm-7 { + width: 58.333333333333336%; + } + .col-sm-6 { + width: 50%; + } + .col-sm-5 { + width: 41.66666666666667%; + } + .col-sm-4 { + width: 33.33333333333333%; + } + .col-sm-3 { + width: 25%; + } + .col-sm-2 { + width: 16.666666666666664%; + } + .col-sm-1 { + width: 8.333333333333332%; + } + .col-sm-pull-12 { + right: 100%; + } + .col-sm-pull-11 { + right: 91.66666666666666%; + } + .col-sm-pull-10 { + right: 83.33333333333334%; + } + .col-sm-pull-9 { + right: 75%; + } + .col-sm-pull-8 { + right: 66.66666666666666%; + } + .col-sm-pull-7 { + right: 58.333333333333336%; + } + .col-sm-pull-6 { + right: 50%; + } + .col-sm-pull-5 { + right: 41.66666666666667%; + } + .col-sm-pull-4 { + right: 33.33333333333333%; + } + .col-sm-pull-3 { + right: 25%; + } + .col-sm-pull-2 { + right: 16.666666666666664%; + } + .col-sm-pull-1 { + right: 8.333333333333332%; + } + .col-sm-pull-0 { + right: 0%; + } + .col-sm-push-12 { + left: 100%; + } + .col-sm-push-11 { + left: 91.66666666666666%; + } + .col-sm-push-10 { + left: 83.33333333333334%; + } + .col-sm-push-9 { + left: 75%; + } + .col-sm-push-8 { + left: 66.66666666666666%; + } + .col-sm-push-7 { + left: 58.333333333333336%; + } + .col-sm-push-6 { + left: 50%; + } + .col-sm-push-5 { + left: 41.66666666666667%; + } + .col-sm-push-4 { + left: 33.33333333333333%; + } + .col-sm-push-3 { + left: 25%; + } + .col-sm-push-2 { + left: 16.666666666666664%; + } + .col-sm-push-1 { + left: 8.333333333333332%; + } + .col-sm-push-0 { + left: 0%; + } + .col-sm-offset-12 { + margin-left: 100%; + } + .col-sm-offset-11 { + margin-left: 91.66666666666666%; + } + .col-sm-offset-10 { + margin-left: 83.33333333333334%; + } + .col-sm-offset-9 { + margin-left: 75%; + } + .col-sm-offset-8 { + margin-left: 66.66666666666666%; + } + .col-sm-offset-7 { + margin-left: 58.333333333333336%; + } + .col-sm-offset-6 { + margin-left: 50%; + } + .col-sm-offset-5 { + margin-left: 41.66666666666667%; + } + .col-sm-offset-4 { + margin-left: 33.33333333333333%; + } + .col-sm-offset-3 { + margin-left: 25%; + } + .col-sm-offset-2 { + margin-left: 16.666666666666664%; + } + .col-sm-offset-1 { + margin-left: 8.333333333333332%; + } + .col-sm-offset-0 { + margin-left: 0%; + } +} +@media (min-width: 992px) { + .col-md-1, .col-md-2, .col-md-3, .col-md-4, .col-md-5, .col-md-6, .col-md-7, .col-md-8, .col-md-9, .col-md-10, .col-md-11, .col-md-12 { + float: left; + } + .col-md-12 { + width: 100%; + } + .col-md-11 { + width: 91.66666666666666%; + } + .col-md-10 { + width: 83.33333333333334%; + } + .col-md-9 { + width: 75%; + } + .col-md-8 { + width: 66.66666666666666%; + } + .col-md-7 { + width: 58.333333333333336%; + } + .col-md-6 { + width: 50%; + } + .col-md-5 { + width: 41.66666666666667%; + } + .col-md-4 { + width: 33.33333333333333%; + } + .col-md-3 { + width: 25%; + } + .col-md-2 { + width: 16.666666666666664%; + } + .col-md-1 { + width: 8.333333333333332%; + } + .col-md-pull-12 { + right: 100%; + } + .col-md-pull-11 { + right: 91.66666666666666%; + } + .col-md-pull-10 { + right: 83.33333333333334%; + } + .col-md-pull-9 { + right: 75%; + } + .col-md-pull-8 { + right: 66.66666666666666%; + } + .col-md-pull-7 { + right: 58.333333333333336%; + } + .col-md-pull-6 { + right: 50%; + } + .col-md-pull-5 { + right: 41.66666666666667%; + } + .col-md-pull-4 { + right: 33.33333333333333%; + } + .col-md-pull-3 { + right: 25%; + } + .col-md-pull-2 { + right: 16.666666666666664%; + } + .col-md-pull-1 { + right: 8.333333333333332%; + } + .col-md-pull-0 { + right: 0%; + } + .col-md-push-12 { + left: 100%; + } + .col-md-push-11 { + left: 91.66666666666666%; + } + .col-md-push-10 { + left: 83.33333333333334%; + } + .col-md-push-9 { + left: 75%; + } + .col-md-push-8 { + left: 66.66666666666666%; + } + .col-md-push-7 { + left: 58.333333333333336%; + } + .col-md-push-6 { + left: 50%; + } + .col-md-push-5 { + left: 41.66666666666667%; + } + .col-md-push-4 { + left: 33.33333333333333%; + } + .col-md-push-3 { + left: 25%; + } + .col-md-push-2 { + left: 16.666666666666664%; + } + .col-md-push-1 { + left: 8.333333333333332%; + } + .col-md-push-0 { + left: 0%; + } + .col-md-offset-12 { + margin-left: 100%; + } + .col-md-offset-11 { + margin-left: 91.66666666666666%; + } + .col-md-offset-10 { + margin-left: 83.33333333333334%; + } + .col-md-offset-9 { + margin-left: 75%; + } + .col-md-offset-8 { + margin-left: 66.66666666666666%; + } + .col-md-offset-7 { + margin-left: 58.333333333333336%; + } + .col-md-offset-6 { + margin-left: 50%; + } + .col-md-offset-5 { + margin-left: 41.66666666666667%; + } + .col-md-offset-4 { + margin-left: 33.33333333333333%; + } + .col-md-offset-3 { + margin-left: 25%; + } + .col-md-offset-2 { + margin-left: 16.666666666666664%; + } + .col-md-offset-1 { + margin-left: 8.333333333333332%; + } + .col-md-offset-0 { + margin-left: 0%; + } +} +@media (min-width: 1200px) { + .col-lg-1, .col-lg-2, .col-lg-3, .col-lg-4, .col-lg-5, .col-lg-6, .col-lg-7, .col-lg-8, .col-lg-9, .col-lg-10, .col-lg-11, .col-lg-12 { + float: left; + } + .col-lg-12 { + width: 100%; + } + .col-lg-11 { + width: 91.66666666666666%; + } + .col-lg-10 { + width: 83.33333333333334%; + } + .col-lg-9 { + width: 75%; + } + .col-lg-8 { + width: 66.66666666666666%; + } + .col-lg-7 { + width: 58.333333333333336%; + } + .col-lg-6 { + width: 50%; + } + .col-lg-5 { + width: 41.66666666666667%; + } + .col-lg-4 { + width: 33.33333333333333%; + } + .col-lg-3 { + width: 25%; + } + .col-lg-2 { + width: 16.666666666666664%; + } + .col-lg-1 { + width: 8.333333333333332%; + } + .col-lg-pull-12 { + right: 100%; + } + .col-lg-pull-11 { + right: 91.66666666666666%; + } + .col-lg-pull-10 { + right: 83.33333333333334%; + } + .col-lg-pull-9 { + right: 75%; + } + .col-lg-pull-8 { + right: 66.66666666666666%; + } + .col-lg-pull-7 { + right: 58.333333333333336%; + } + .col-lg-pull-6 { + right: 50%; + } + .col-lg-pull-5 { + right: 41.66666666666667%; + } + .col-lg-pull-4 { + right: 33.33333333333333%; + } + .col-lg-pull-3 { + right: 25%; + } + .col-lg-pull-2 { + right: 16.666666666666664%; + } + .col-lg-pull-1 { + right: 8.333333333333332%; + } + .col-lg-pull-0 { + right: 0%; + } + .col-lg-push-12 { + left: 100%; + } + .col-lg-push-11 { + left: 91.66666666666666%; + } + .col-lg-push-10 { + left: 83.33333333333334%; + } + .col-lg-push-9 { + left: 75%; + } + .col-lg-push-8 { + left: 66.66666666666666%; + } + .col-lg-push-7 { + left: 58.333333333333336%; + } + .col-lg-push-6 { + left: 50%; + } + .col-lg-push-5 { + left: 41.66666666666667%; + } + .col-lg-push-4 { + left: 33.33333333333333%; + } + .col-lg-push-3 { + left: 25%; + } + .col-lg-push-2 { + left: 16.666666666666664%; + } + .col-lg-push-1 { + left: 8.333333333333332%; + } + .col-lg-push-0 { + left: 0%; + } + .col-lg-offset-12 { + margin-left: 100%; + } + .col-lg-offset-11 { + margin-left: 91.66666666666666%; + } + .col-lg-offset-10 { + margin-left: 83.33333333333334%; + } + .col-lg-offset-9 { + margin-left: 75%; + } + .col-lg-offset-8 { + margin-left: 66.66666666666666%; + } + .col-lg-offset-7 { + margin-left: 58.333333333333336%; + } + .col-lg-offset-6 { + margin-left: 50%; + } + .col-lg-offset-5 { + margin-left: 41.66666666666667%; + } + .col-lg-offset-4 { + margin-left: 33.33333333333333%; + } + .col-lg-offset-3 { + margin-left: 25%; + } + .col-lg-offset-2 { + margin-left: 16.666666666666664%; + } + .col-lg-offset-1 { + margin-left: 8.333333333333332%; + } + .col-lg-offset-0 { + margin-left: 0%; + } +} +table { + max-width: 100%; + background-color: transparent; +} +th { + text-align: left; +} +.table { + width: 100%; + margin-bottom: 20px; +} +.table > thead > tr > th, +.table > tbody > tr > th, +.table > tfoot > tr > th, +.table > thead > tr > td, +.table > tbody > tr > td, +.table > tfoot > tr > td { + padding: 8px; + line-height: 1.428571429; + vertical-align: top; + border-top: 1px solid #dddddd; +} +.table > thead > tr > th { + vertical-align: bottom; + border-bottom: 2px solid #dddddd; +} +.table > caption + thead > tr:first-child > th, +.table > colgroup + thead > tr:first-child > th, +.table > thead:first-child > tr:first-child > th, +.table > caption + thead > tr:first-child > td, +.table > colgroup + thead > tr:first-child > td, +.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 > thead > tr > th, +.table-condensed > tbody > tr > th, +.table-condensed > tfoot > tr > th, +.table-condensed > thead > tr > td, +.table-condensed > tbody > tr > td, +.table-condensed > tfoot > tr > td { + padding: 5px; +} +.table-bordered { + border: 1px solid #dddddd; +} +.table-bordered > thead > tr > th, +.table-bordered > tbody > tr > th, +.table-bordered > tfoot > tr > th, +.table-bordered > thead > tr > td, +.table-bordered > tbody > tr > td, +.table-bordered > tfoot > tr > td { + border: 1px solid #dddddd; +} +.table-bordered > thead > tr > th, +.table-bordered > thead > tr > td { + border-bottom-width: 2px; +} +.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 col[class*="col-"] { + position: static; + float: none; + display: table-column; +} +table td[class*="col-"], +table th[class*="col-"] { + position: static; + float: none; + display: table-cell; +} +.table > thead > tr > td.active, +.table > tbody > tr > td.active, +.table > tfoot > tr > td.active, +.table > thead > tr > th.active, +.table > tbody > tr > th.active, +.table > tfoot > tr > th.active, +.table > thead > tr.active > td, +.table > tbody > tr.active > td, +.table > tfoot > tr.active > td, +.table > thead > tr.active > th, +.table > tbody > tr.active > th, +.table > tfoot > tr.active > th { + background-color: #f5f5f5; +} +.table-hover > tbody > tr > td.active:hover, +.table-hover > tbody > tr > th.active:hover, +.table-hover > tbody > tr.active:hover > td, +.table-hover > tbody > tr.active:hover > th { + background-color: #e8e8e8; +} +.table > thead > tr > td.success, +.table > tbody > tr > td.success, +.table > tfoot > tr > td.success, +.table > thead > tr > th.success, +.table > tbody > tr > th.success, +.table > tfoot > tr > th.success, +.table > thead > tr.success > td, +.table > tbody > tr.success > td, +.table > tfoot > tr.success > td, +.table > thead > tr.success > th, +.table > tbody > tr.success > th, +.table > tfoot > tr.success > th { + background-color: #eaf6ea; +} +.table-hover > tbody > tr > td.success:hover, +.table-hover > tbody > tr > th.success:hover, +.table-hover > tbody > tr.success:hover > td, +.table-hover > tbody > tr.success:hover > th { + background-color: #d8eed8; +} +.table > thead > tr > td.info, +.table > tbody > tr > td.info, +.table > tfoot > tr > td.info, +.table > thead > tr > th.info, +.table > tbody > tr > th.info, +.table > tfoot > tr > th.info, +.table > thead > tr.info > td, +.table > tbody > tr.info > td, +.table > tfoot > tr.info > td, +.table > thead > tr.info > th, +.table > tbody > tr.info > th, +.table > tfoot > tr.info > th { + background-color: #ececec; +} +.table-hover > tbody > tr > td.info:hover, +.table-hover > tbody > tr > th.info:hover, +.table-hover > tbody > tr.info:hover > td, +.table-hover > tbody > tr.info:hover > th { + background-color: #dfdfdf; +} +.table > thead > tr > td.warning, +.table > tbody > tr > td.warning, +.table > tfoot > tr > td.warning, +.table > thead > tr > th.warning, +.table > tbody > tr > th.warning, +.table > tfoot > tr > th.warning, +.table > thead > tr.warning > td, +.table > tbody > tr.warning > td, +.table > tfoot > tr.warning > td, +.table > thead > tr.warning > th, +.table > tbody > tr.warning > th, +.table > tfoot > tr.warning > th { + background-color: #fef9f3; +} +.table-hover > tbody > tr > td.warning:hover, +.table-hover > tbody > tr > th.warning:hover, +.table-hover > tbody > tr.warning:hover > td, +.table-hover > tbody > tr.warning:hover > th { + background-color: #fceedb; +} +.table > thead > tr > td.danger, +.table > tbody > tr > td.danger, +.table > tfoot > tr > td.danger, +.table > thead > tr > th.danger, +.table > tbody > tr > th.danger, +.table > tfoot > tr > th.danger, +.table > thead > tr.danger > td, +.table > tbody > tr.danger > td, +.table > tfoot > tr.danger > td, +.table > thead > tr.danger > th, +.table > tbody > tr.danger > th, +.table > tfoot > tr.danger > th { + background-color: #f9e2e2; +} +.table-hover > tbody > tr > td.danger:hover, +.table-hover > tbody > tr > th.danger:hover, +.table-hover > tbody > tr.danger:hover > td, +.table-hover > tbody > tr.danger:hover > th { + background-color: #f4cecd; +} +@media (max-width: 767px) { + .table-responsive { + width: 100%; + margin-bottom: 15px; + overflow-y: hidden; + overflow-x: scroll; + -ms-overflow-style: -ms-autohiding-scrollbar; + border: 1px solid #dddddd; + -webkit-overflow-scrolling: touch; + } + .table-responsive > .table { + margin-bottom: 0; + } + .table-responsive > .table > thead > tr > th, + .table-responsive > .table > tbody > tr > th, + .table-responsive > .table > tfoot > tr > th, + .table-responsive > .table > thead > tr > td, + .table-responsive > .table > tbody > tr > td, + .table-responsive > .table > tfoot > tr > td { + white-space: nowrap; + } + .table-responsive > .table-bordered { + border: 0; + } + .table-responsive > .table-bordered > thead > tr > th:first-child, + .table-responsive > .table-bordered > tbody > tr > th:first-child, + .table-responsive > .table-bordered > tfoot > tr > th:first-child, + .table-responsive > .table-bordered > thead > tr > td:first-child, + .table-responsive > .table-bordered > tbody > tr > td:first-child, + .table-responsive > .table-bordered > tfoot > tr > td:first-child { + border-left: 0; + } + .table-responsive > .table-bordered > thead > tr > th:last-child, + .table-responsive > .table-bordered > tbody > tr > th:last-child, + .table-responsive > .table-bordered > tfoot > tr > th:last-child, + .table-responsive > .table-bordered > thead > tr > td:last-child, + .table-responsive > .table-bordered > tbody > tr > td:last-child, + .table-responsive > .table-bordered > tfoot > tr > td:last-child { + border-right: 0; + } + .table-responsive > .table-bordered > tbody > tr:last-child > th, + .table-responsive > .table-bordered > tfoot > tr:last-child > th, + .table-responsive > .table-bordered > tbody > tr:last-child > td, + .table-responsive > .table-bordered > tfoot > tr:last-child > td { + border-bottom: 0; + } +} +fieldset { + padding: 0; + margin: 0; + border: 0; + min-width: 0; +} +legend { + display: block; + width: 100%; + padding: 0; + margin-bottom: 20px; + font-size: 21px; + line-height: inherit; + color: #333333; + border: 0; + border-bottom: 1px solid #e5e5e5; +} +label { + display: inline-block; + margin-bottom: 5px; + font-weight: bold; +} +input[type="search"] { + -webkit-box-sizing: border-box; + -moz-box-sizing: border-box; + box-sizing: border-box; +} +input[type="radio"], +input[type="checkbox"] { + margin: 4px 0 0; + margin-top: 1px \9; + /* IE8-9 */ + line-height: normal; +} +input[type="file"] { + display: block; +} +input[type="range"] { + display: block; + width: 100%; +} +select[multiple], +select[size] { + height: auto; +} +input[type="file"]:focus, +input[type="radio"]:focus, +input[type="checkbox"]:focus { + outline: thin dotted; + outline: 5px auto -webkit-focus-ring-color; + outline-offset: -2px; +} +output { + display: block; + padding-top: 3px; + font-size: 14px; + line-height: 1.428571429; + color: #555555; +} +.form-control { + display: block; + width: 100%; + height: 26px; + padding: 2px 5px; + font-size: 14px; + line-height: 1.428571429; + color: #555555; + background-color: #ffffff; + background-image: none; + border: 1px solid #cccccc; + border-radius: 3px; + -webkit-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-color ease-in-out .15s, box-shadow ease-in-out .15s; + transition: border-color ease-in-out .15s, box-shadow ease-in-out .15s; +} +.form-control:focus { + border-color: #6c6c6c; + outline: 0; + -webkit-box-shadow: inset 0 1px 1px rgba(0,0,0,.075), 0 0 8px rgba(108, 108, 108, 0.6); + box-shadow: inset 0 1px 1px rgba(0,0,0,.075), 0 0 8px rgba(108, 108, 108, 0.6); +} +.form-control::-moz-placeholder { + color: #999999; + opacity: 1; +} +.form-control:-ms-input-placeholder { + color: #999999; +} +.form-control::-webkit-input-placeholder { + color: #999999; +} +.form-control[disabled], +.form-control[readonly], +fieldset[disabled] .form-control { + cursor: not-allowed; + background-color: #eeeeee; + opacity: 1; +} +textarea.form-control { + height: auto; +} +input[type="search"] { + -webkit-appearance: none; +} +input[type="date"] { + line-height: 26px; +} +.form-group { + margin-bottom: 15px; +} +.radio, +.checkbox { + display: block; + min-height: 20px; + margin-top: 10px; + margin-bottom: 10px; + padding-left: 20px; +} +.radio label, +.checkbox label { + display: inline; + font-weight: normal; + cursor: pointer; +} +.radio input[type="radio"], +.radio-inline input[type="radio"], +.checkbox input[type="checkbox"], +.checkbox-inline input[type="checkbox"] { + float: left; + margin-left: -20px; +} +.radio + .radio, +.checkbox + .checkbox { + margin-top: -5px; +} +.radio-inline, +.checkbox-inline { + display: inline-block; + padding-left: 20px; + margin-bottom: 0; + vertical-align: middle; + font-weight: normal; + cursor: pointer; +} +.radio-inline + .radio-inline, +.checkbox-inline + .checkbox-inline { + margin-top: 0; + margin-left: 10px; +} +input[type="radio"][disabled], +input[type="checkbox"][disabled], +.radio[disabled], +.radio-inline[disabled], +.checkbox[disabled], +.checkbox-inline[disabled], +fieldset[disabled] input[type="radio"], +fieldset[disabled] input[type="checkbox"], +fieldset[disabled] .radio, +fieldset[disabled] .radio-inline, +fieldset[disabled] .checkbox, +fieldset[disabled] .checkbox-inline { + cursor: not-allowed; +} +.input-sm { + height: 22px; + padding: 1px 5px; + font-size: 12px; + line-height: 1.5; + border-radius: 2px; +} +select.input-sm { + height: 22px; + line-height: 22px; +} +textarea.input-sm, +select[multiple].input-sm { + height: auto; +} +.input-lg { + height: 36px; + padding: 5px 10px; + font-size: 18px; + line-height: 1.33; + border-radius: 4px; +} +select.input-lg { + height: 36px; + line-height: 36px; +} +textarea.input-lg, +select[multiple].input-lg { + height: auto; +} +.has-feedback { + position: relative; +} +.has-feedback .form-control { + padding-right: 32.5px; +} +.has-feedback .form-control-feedback { + position: absolute; + top: 25px; + right: 0; + display: block; + width: 26px; + height: 26px; + line-height: 26px; + text-align: center; +} +.has-success .help-block, +.has-success .control-label, +.has-success .radio, +.has-success .checkbox, +.has-success .radio-inline, +.has-success .checkbox-inline { + color: #5cb85c; +} +.has-success .form-control { + border-color: #5cb85c; + -webkit-box-shadow: inset 0 1px 1px rgba(0, 0, 0, 0.075); + box-shadow: inset 0 1px 1px rgba(0, 0, 0, 0.075); +} +.has-success .form-control:focus { + border-color: #449d44; + -webkit-box-shadow: inset 0 1px 1px rgba(0, 0, 0, 0.075), 0 0 6px #a3d7a3; + box-shadow: inset 0 1px 1px rgba(0, 0, 0, 0.075), 0 0 6px #a3d7a3; +} +.has-success .input-group-addon { + color: #5cb85c; + border-color: #5cb85c; + background-color: #eaf6ea; +} +.has-success .form-control-feedback { + color: #5cb85c; +} +.has-warning .help-block, +.has-warning .control-label, +.has-warning .radio, +.has-warning .checkbox, +.has-warning .radio-inline, +.has-warning .checkbox-inline { + color: #f0ad4e; +} +.has-warning .form-control { + border-color: #f0ad4e; + -webkit-box-shadow: inset 0 1px 1px rgba(0, 0, 0, 0.075); + box-shadow: inset 0 1px 1px rgba(0, 0, 0, 0.075); +} +.has-warning .form-control:focus { + border-color: #ec971f; + -webkit-box-shadow: inset 0 1px 1px rgba(0, 0, 0, 0.075), 0 0 6px #f8d9ac; + box-shadow: inset 0 1px 1px rgba(0, 0, 0, 0.075), 0 0 6px #f8d9ac; +} +.has-warning .input-group-addon { + color: #f0ad4e; + border-color: #f0ad4e; + background-color: #fef9f3; +} +.has-warning .form-control-feedback { + color: #f0ad4e; +} +.has-error .help-block, +.has-error .control-label, +.has-error .radio, +.has-error .checkbox, +.has-error .radio-inline, +.has-error .checkbox-inline { + color: #d9534f; +} +.has-error .form-control { + border-color: #d9534f; + -webkit-box-shadow: inset 0 1px 1px rgba(0, 0, 0, 0.075); + box-shadow: inset 0 1px 1px rgba(0, 0, 0, 0.075); +} +.has-error .form-control:focus { + border-color: #c9302c; + -webkit-box-shadow: inset 0 1px 1px rgba(0, 0, 0, 0.075), 0 0 6px #eba5a3; + box-shadow: inset 0 1px 1px rgba(0, 0, 0, 0.075), 0 0 6px #eba5a3; +} +.has-error .input-group-addon { + color: #d9534f; + border-color: #d9534f; + background-color: #f9e2e2; +} +.has-error .form-control-feedback { + color: #d9534f; +} +.form-control-static { + margin-bottom: 0; +} +.help-block { + display: block; + margin-top: 5px; + margin-bottom: 10px; + color: #737373; +} +@media (min-width: 768px) { + .form-inline .form-group { + display: inline-block; + margin-bottom: 0; + vertical-align: middle; + } + .form-inline .form-control { + display: inline-block; + width: auto; + vertical-align: middle; + } + .form-inline .input-group > .form-control { + width: 100%; + } + .form-inline .control-label { + margin-bottom: 0; + vertical-align: middle; + } + .form-inline .radio, + .form-inline .checkbox { + display: inline-block; + margin-top: 0; + margin-bottom: 0; + padding-left: 0; + vertical-align: middle; + } + .form-inline .radio input[type="radio"], + .form-inline .checkbox input[type="checkbox"] { + float: none; + margin-left: 0; + } + .form-inline .has-feedback .form-control-feedback { + top: 0; + } +} +.form-horizontal .control-label, +.form-horizontal .radio, +.form-horizontal .checkbox, +.form-horizontal .radio-inline, +.form-horizontal .checkbox-inline { + margin-top: 0; + margin-bottom: 0; + padding-top: 3px; +} +.form-horizontal .radio, +.form-horizontal .checkbox { + min-height: 23px; +} +.form-horizontal .form-group { + margin-left: -15px; + margin-right: -15px; +} +.form-horizontal .form-control-static { + padding-top: 3px; +} +@media (min-width: 768px) { + .form-horizontal .control-label { + text-align: right; + } +} +.form-horizontal .has-feedback .form-control-feedback { + top: 0; + right: 15px; +} +.btn { + display: inline-block; + margin-bottom: 0; + font-weight: normal; + text-align: center; + vertical-align: middle; + cursor: pointer; + background-image: none; + border: 1px solid transparent; + white-space: nowrap; + padding: 2px 5px; + font-size: 14px; + line-height: 1.428571429; + border-radius: 3px; + -webkit-user-select: none; + -moz-user-select: none; + -ms-user-select: none; + user-select: none; +} +.btn:focus, +.btn:active:focus, +.btn.active:focus { + outline: thin dotted; + outline: 5px auto -webkit-focus-ring-color; + outline-offset: -2px; +} +.btn:hover, +.btn:focus { + color: #333333; + text-decoration: none; +} +.btn:active, +.btn.active { + outline: 0; + background-image: none; + -webkit-box-shadow: inset 0 3px 5px rgba(0, 0, 0, 0.125); + box-shadow: inset 0 3px 5px rgba(0, 0, 0, 0.125); +} +.btn.disabled, +.btn[disabled], +fieldset[disabled] .btn { + cursor: not-allowed; + pointer-events: none; + opacity: 0.65; + filter: alpha(opacity=65); + -webkit-box-shadow: none; + box-shadow: none; +} +.btn-default { + color: #333333; + background-color: #ffffff; + border-color: #cccccc; +} +.btn-default:hover, +.btn-default:focus, +.btn-default:active, +.btn-default.active, +.open .dropdown-toggle.btn-default { + color: #333333; + background-color: #ebebeb; + border-color: #adadad; +} +.btn-default:active, +.btn-default.active, +.open .dropdown-toggle.btn-default { + background-image: none; +} +.btn-default.disabled, +.btn-default[disabled], +fieldset[disabled] .btn-default, +.btn-default.disabled:hover, +.btn-default[disabled]:hover, +fieldset[disabled] .btn-default:hover, +.btn-default.disabled:focus, +.btn-default[disabled]:focus, +fieldset[disabled] .btn-default:focus, +.btn-default.disabled:active, +.btn-default[disabled]:active, +fieldset[disabled] .btn-default:active, +.btn-default.disabled.active, +.btn-default[disabled].active, +fieldset[disabled] .btn-default.active { + background-color: #ffffff; + border-color: #cccccc; +} +.btn-default .badge { + color: #ffffff; + background-color: #333333; +} +.btn-primary { + color: #ffffff; + background-color: #0d8921; + border-color: #0b721b; +} +.btn-primary:hover, +.btn-primary:focus, +.btn-primary:active, +.btn-primary.active, +.open .dropdown-toggle.btn-primary { + color: #ffffff; + background-color: #096418; + border-color: #053a0e; +} +.btn-primary:active, +.btn-primary.active, +.open .dropdown-toggle.btn-primary { + background-image: none; +} +.btn-primary.disabled, +.btn-primary[disabled], +fieldset[disabled] .btn-primary, +.btn-primary.disabled:hover, +.btn-primary[disabled]:hover, +fieldset[disabled] .btn-primary:hover, +.btn-primary.disabled:focus, +.btn-primary[disabled]:focus, +fieldset[disabled] .btn-primary:focus, +.btn-primary.disabled:active, +.btn-primary[disabled]:active, +fieldset[disabled] .btn-primary:active, +.btn-primary.disabled.active, +.btn-primary[disabled].active, +fieldset[disabled] .btn-primary.active { + background-color: #0d8921; + border-color: #0b721b; +} +.btn-primary .badge { + color: #0d8921; + background-color: #ffffff; +} +.btn-success { + color: #ffffff; + background-color: #5cb85c; + border-color: #4cae4c; +} +.btn-success:hover, +.btn-success:focus, +.btn-success:active, +.btn-success.active, +.open .dropdown-toggle.btn-success { + color: #ffffff; + background-color: #47a447; + border-color: #398439; +} +.btn-success:active, +.btn-success.active, +.open .dropdown-toggle.btn-success { + background-image: none; +} +.btn-success.disabled, +.btn-success[disabled], +fieldset[disabled] .btn-success, +.btn-success.disabled:hover, +.btn-success[disabled]:hover, +fieldset[disabled] .btn-success:hover, +.btn-success.disabled:focus, +.btn-success[disabled]:focus, +fieldset[disabled] .btn-success:focus, +.btn-success.disabled:active, +.btn-success[disabled]:active, +fieldset[disabled] .btn-success:active, +.btn-success.disabled.active, +.btn-success[disabled].active, +fieldset[disabled] .btn-success.active { + background-color: #5cb85c; + border-color: #4cae4c; +} +.btn-success .badge { + color: #5cb85c; + background-color: #ffffff; +} +.btn-info { + color: #ffffff; + background-color: #6c6c6c; + border-color: #5f5f5f; +} +.btn-info:hover, +.btn-info:focus, +.btn-info:active, +.btn-info.active, +.open .dropdown-toggle.btn-info { + color: #ffffff; + background-color: #585858; + border-color: #414141; +} +.btn-info:active, +.btn-info.active, +.open .dropdown-toggle.btn-info { + background-image: none; +} +.btn-info.disabled, +.btn-info[disabled], +fieldset[disabled] .btn-info, +.btn-info.disabled:hover, +.btn-info[disabled]:hover, +fieldset[disabled] .btn-info:hover, +.btn-info.disabled:focus, +.btn-info[disabled]:focus, +fieldset[disabled] .btn-info:focus, +.btn-info.disabled:active, +.btn-info[disabled]:active, +fieldset[disabled] .btn-info:active, +.btn-info.disabled.active, +.btn-info[disabled].active, +fieldset[disabled] .btn-info.active { + background-color: #6c6c6c; + border-color: #5f5f5f; +} +.btn-info .badge { + color: #6c6c6c; + background-color: #ffffff; +} +.btn-warning { + color: #ffffff; + background-color: #f0ad4e; + border-color: #eea236; +} +.btn-warning:hover, +.btn-warning:focus, +.btn-warning:active, +.btn-warning.active, +.open .dropdown-toggle.btn-warning { + color: #ffffff; + background-color: #ed9c28; + border-color: #d58512; +} +.btn-warning:active, +.btn-warning.active, +.open .dropdown-toggle.btn-warning { + background-image: none; +} +.btn-warning.disabled, +.btn-warning[disabled], +fieldset[disabled] .btn-warning, +.btn-warning.disabled:hover, +.btn-warning[disabled]:hover, +fieldset[disabled] .btn-warning:hover, +.btn-warning.disabled:focus, +.btn-warning[disabled]:focus, +fieldset[disabled] .btn-warning:focus, +.btn-warning.disabled:active, +.btn-warning[disabled]:active, +fieldset[disabled] .btn-warning:active, +.btn-warning.disabled.active, +.btn-warning[disabled].active, +fieldset[disabled] .btn-warning.active { + background-color: #f0ad4e; + border-color: #eea236; +} +.btn-warning .badge { + color: #f0ad4e; + background-color: #ffffff; +} +.btn-danger { + color: #ffffff; + background-color: #d9534f; + border-color: #d43f3a; +} +.btn-danger:hover, +.btn-danger:focus, +.btn-danger:active, +.btn-danger.active, +.open .dropdown-toggle.btn-danger { + color: #ffffff; + background-color: #d2322d; + border-color: #ac2925; +} +.btn-danger:active, +.btn-danger.active, +.open .dropdown-toggle.btn-danger { + background-image: none; +} +.btn-danger.disabled, +.btn-danger[disabled], +fieldset[disabled] .btn-danger, +.btn-danger.disabled:hover, +.btn-danger[disabled]:hover, +fieldset[disabled] .btn-danger:hover, +.btn-danger.disabled:focus, +.btn-danger[disabled]:focus, +fieldset[disabled] .btn-danger:focus, +.btn-danger.disabled:active, +.btn-danger[disabled]:active, +fieldset[disabled] .btn-danger:active, +.btn-danger.disabled.active, +.btn-danger[disabled].active, +fieldset[disabled] .btn-danger.active { + background-color: #d9534f; + border-color: #d43f3a; +} +.btn-danger .badge { + color: #d9534f; + background-color: #ffffff; +} +.btn-link { + color: #222222; + font-weight: normal; + cursor: pointer; + border-radius: 0; +} +.btn-link, +.btn-link:active, +.btn-link[disabled], +fieldset[disabled] .btn-link { + background-color: transparent; + -webkit-box-shadow: none; + box-shadow: none; +} +.btn-link, +.btn-link:hover, +.btn-link:focus, +.btn-link:active { + border-color: transparent; +} +.btn-link:hover, +.btn-link:focus { + color: #0d8921; + text-decoration: underline; + background-color: transparent; +} +.btn-link[disabled]:hover, +fieldset[disabled] .btn-link:hover, +.btn-link[disabled]:focus, +fieldset[disabled] .btn-link:focus { + color: #999999; + text-decoration: none; +} +.btn-lg, +.btn-group-lg > .btn { + padding: 5px 10px; + font-size: 18px; + line-height: 1.33; + border-radius: 4px; +} +.btn-sm, +.btn-group-sm > .btn { + padding: 1px 5px; + font-size: 12px; + line-height: 1.5; + border-radius: 2px; +} +.btn-xs, +.btn-group-xs > .btn { + padding: 0px 3px; + font-size: 12px; + line-height: 1.5; + border-radius: 2px; +} +.btn-block { + display: block; + width: 100%; + padding-left: 0; + padding-right: 0; +} +.btn-block + .btn-block { + margin-top: 5px; +} +input[type="submit"].btn-block, +input[type="reset"].btn-block, +input[type="button"].btn-block { + width: 100%; +} +.fade { + opacity: 0; + -webkit-transition: opacity 0.15s linear; + transition: opacity 0.15s linear; +} +.fade.in { + opacity: 1; +} +.collapse { + display: none; +} +.collapse.in { + display: block; +} +.collapsing { + position: relative; + height: 0; + overflow: hidden; + -webkit-transition: height 0.35s ease; + transition: height 0.35s ease; +} +@font-face { + font-family: 'Glyphicons Halflings'; + src: url('../fonts/glyphicons-halflings-regular.eot'); + src: url('../fonts/glyphicons-halflings-regular.eot?#iefix') format('embedded-opentype'), url('../fonts/glyphicons-halflings-regular.woff') format('woff'), url('../fonts/glyphicons-halflings-regular.ttf') format('truetype'), url('../fonts/glyphicons-halflings-regular.svg#glyphicons_halflingsregular') format('svg'); +} +.glyphicon { + position: relative; + top: 1px; + display: inline-block; + font-family: 'Glyphicons Halflings'; + font-style: normal; + font-weight: normal; + line-height: 1; + -webkit-font-smoothing: antialiased; + -moz-osx-font-smoothing: grayscale; +} +.glyphicon-asterisk:before { + content: "\2a"; +} +.glyphicon-plus:before { + content: "\2b"; +} +.glyphicon-euro:before { + content: "\20ac"; +} +.glyphicon-minus:before { + content: "\2212"; +} +.glyphicon-cloud:before { + content: "\2601"; +} +.glyphicon-envelope:before { + content: "\2709"; +} +.glyphicon-pencil:before { + content: "\270f"; +} +.glyphicon-glass:before { + content: "\e001"; +} +.glyphicon-music:before { + content: "\e002"; +} +.glyphicon-search:before { + content: "\e003"; +} +.glyphicon-heart:before { + content: "\e005"; +} +.glyphicon-star:before { + content: "\e006"; +} +.glyphicon-star-empty:before { + content: "\e007"; +} +.glyphicon-user:before { + content: "\e008"; +} +.glyphicon-film:before { + content: "\e009"; +} +.glyphicon-th-large:before { + content: "\e010"; +} +.glyphicon-th:before { + content: "\e011"; +} +.glyphicon-th-list:before { + content: "\e012"; +} +.glyphicon-ok:before { + content: "\e013"; +} +.glyphicon-remove:before { + content: "\e014"; +} +.glyphicon-zoom-in:before { + content: "\e015"; +} +.glyphicon-zoom-out:before { + content: "\e016"; +} +.glyphicon-off:before { + content: "\e017"; +} +.glyphicon-signal:before { + content: "\e018"; +} +.glyphicon-cog:before { + content: "\e019"; +} +.glyphicon-trash:before { + content: "\e020"; +} +.glyphicon-home:before { + content: "\e021"; +} +.glyphicon-file:before { + content: "\e022"; +} +.glyphicon-time:before { + content: "\e023"; +} +.glyphicon-road:before { + content: "\e024"; +} +.glyphicon-download-alt:before { + content: "\e025"; +} +.glyphicon-download:before { + content: "\e026"; +} +.glyphicon-upload:before { + content: "\e027"; +} +.glyphicon-inbox:before { + content: "\e028"; +} +.glyphicon-play-circle:before { + content: "\e029"; +} +.glyphicon-repeat:before { + content: "\e030"; +} +.glyphicon-refresh:before { + content: "\e031"; +} +.glyphicon-list-alt:before { + content: "\e032"; +} +.glyphicon-lock:before { + content: "\e033"; +} +.glyphicon-flag:before { + content: "\e034"; +} +.glyphicon-headphones:before { + content: "\e035"; +} +.glyphicon-volume-off:before { + content: "\e036"; +} +.glyphicon-volume-down:before { + content: "\e037"; +} +.glyphicon-volume-up:before { + content: "\e038"; +} +.glyphicon-qrcode:before { + content: "\e039"; +} +.glyphicon-barcode:before { + content: "\e040"; +} +.glyphicon-tag:before { + content: "\e041"; +} +.glyphicon-tags:before { + content: "\e042"; +} +.glyphicon-book:before { + content: "\e043"; +} +.glyphicon-bookmark:before { + content: "\e044"; +} +.glyphicon-print:before { + content: "\e045"; +} +.glyphicon-camera:before { + content: "\e046"; +} +.glyphicon-font:before { + content: "\e047"; +} +.glyphicon-bold:before { + content: "\e048"; +} +.glyphicon-italic:before { + content: "\e049"; +} +.glyphicon-text-height:before { + content: "\e050"; +} +.glyphicon-text-width:before { + content: "\e051"; +} +.glyphicon-align-left:before { + content: "\e052"; +} +.glyphicon-align-center:before { + content: "\e053"; +} +.glyphicon-align-right:before { + content: "\e054"; +} +.glyphicon-align-justify:before { + content: "\e055"; +} +.glyphicon-list:before { + content: "\e056"; +} +.glyphicon-indent-left:before { + content: "\e057"; +} +.glyphicon-indent-right:before { + content: "\e058"; +} +.glyphicon-facetime-video:before { + content: "\e059"; +} +.glyphicon-picture:before { + content: "\e060"; +} +.glyphicon-map-marker:before { + content: "\e062"; +} +.glyphicon-adjust:before { + content: "\e063"; +} +.glyphicon-tint:before { + content: "\e064"; +} +.glyphicon-edit:before { + content: "\e065"; +} +.glyphicon-share:before { + content: "\e066"; +} +.glyphicon-check:before { + content: "\e067"; +} +.glyphicon-move:before { + content: "\e068"; +} +.glyphicon-step-backward:before { + content: "\e069"; +} +.glyphicon-fast-backward:before { + content: "\e070"; +} +.glyphicon-backward:before { + content: "\e071"; +} +.glyphicon-play:before { + content: "\e072"; +} +.glyphicon-pause:before { + content: "\e073"; +} +.glyphicon-stop:before { + content: "\e074"; +} +.glyphicon-forward:before { + content: "\e075"; +} +.glyphicon-fast-forward:before { + content: "\e076"; +} +.glyphicon-step-forward:before { + content: "\e077"; +} +.glyphicon-eject:before { + content: "\e078"; +} +.glyphicon-chevron-left:before { + content: "\e079"; +} +.glyphicon-chevron-right:before { + content: "\e080"; +} +.glyphicon-plus-sign:before { + content: "\e081"; +} +.glyphicon-minus-sign:before { + content: "\e082"; +} +.glyphicon-remove-sign:before { + content: "\e083"; +} +.glyphicon-ok-sign:before { + content: "\e084"; +} +.glyphicon-question-sign:before { + content: "\e085"; +} +.glyphicon-info-sign:before { + content: "\e086"; +} +.glyphicon-screenshot:before { + content: "\e087"; +} +.glyphicon-remove-circle:before { + content: "\e088"; +} +.glyphicon-ok-circle:before { + content: "\e089"; +} +.glyphicon-ban-circle:before { + content: "\e090"; +} +.glyphicon-arrow-left:before { + content: "\e091"; +} +.glyphicon-arrow-right:before { + content: "\e092"; +} +.glyphicon-arrow-up:before { + content: "\e093"; +} +.glyphicon-arrow-down:before { + content: "\e094"; +} +.glyphicon-share-alt:before { + content: "\e095"; +} +.glyphicon-resize-full:before { + content: "\e096"; +} +.glyphicon-resize-small:before { + content: "\e097"; +} +.glyphicon-exclamation-sign:before { + content: "\e101"; +} +.glyphicon-gift:before { + content: "\e102"; +} +.glyphicon-leaf:before { + content: "\e103"; +} +.glyphicon-fire:before { + content: "\e104"; +} +.glyphicon-eye-open:before { + content: "\e105"; +} +.glyphicon-eye-close:before { + content: "\e106"; +} +.glyphicon-warning-sign:before { + content: "\e107"; +} +.glyphicon-plane:before { + content: "\e108"; +} +.glyphicon-calendar:before { + content: "\e109"; +} +.glyphicon-random:before { + content: "\e110"; +} +.glyphicon-comment:before { + content: "\e111"; +} +.glyphicon-magnet:before { + content: "\e112"; +} +.glyphicon-chevron-up:before { + content: "\e113"; +} +.glyphicon-chevron-down:before { + content: "\e114"; +} +.glyphicon-retweet:before { + content: "\e115"; +} +.glyphicon-shopping-cart:before { + content: "\e116"; +} +.glyphicon-folder-close:before { + content: "\e117"; +} +.glyphicon-folder-open:before { + content: "\e118"; +} +.glyphicon-resize-vertical:before { + content: "\e119"; +} +.glyphicon-resize-horizontal:before { + content: "\e120"; +} +.glyphicon-hdd:before { + content: "\e121"; +} +.glyphicon-bullhorn:before { + content: "\e122"; +} +.glyphicon-bell:before { + content: "\e123"; +} +.glyphicon-certificate:before { + content: "\e124"; +} +.glyphicon-thumbs-up:before { + content: "\e125"; +} +.glyphicon-thumbs-down:before { + content: "\e126"; +} +.glyphicon-hand-right:before { + content: "\e127"; +} +.glyphicon-hand-left:before { + content: "\e128"; +} +.glyphicon-hand-up:before { + content: "\e129"; +} +.glyphicon-hand-down:before { + content: "\e130"; +} +.glyphicon-circle-arrow-right:before { + content: "\e131"; +} +.glyphicon-circle-arrow-left:before { + content: "\e132"; +} +.glyphicon-circle-arrow-up:before { + content: "\e133"; +} +.glyphicon-circle-arrow-down:before { + content: "\e134"; +} +.glyphicon-globe:before { + content: "\e135"; +} +.glyphicon-wrench:before { + content: "\e136"; +} +.glyphicon-tasks:before { + content: "\e137"; +} +.glyphicon-filter:before { + content: "\e138"; +} +.glyphicon-briefcase:before { + content: "\e139"; +} +.glyphicon-fullscreen:before { + content: "\e140"; +} +.glyphicon-dashboard:before { + content: "\e141"; +} +.glyphicon-paperclip:before { + content: "\e142"; +} +.glyphicon-heart-empty:before { + content: "\e143"; +} +.glyphicon-link:before { + content: "\e144"; +} +.glyphicon-phone:before { + content: "\e145"; +} +.glyphicon-pushpin:before { + content: "\e146"; +} +.glyphicon-usd:before { + content: "\e148"; +} +.glyphicon-gbp:before { + content: "\e149"; +} +.glyphicon-sort:before { + content: "\e150"; +} +.glyphicon-sort-by-alphabet:before { + content: "\e151"; +} +.glyphicon-sort-by-alphabet-alt:before { + content: "\e152"; +} +.glyphicon-sort-by-order:before { + content: "\e153"; +} +.glyphicon-sort-by-order-alt:before { + content: "\e154"; +} +.glyphicon-sort-by-attributes:before { + content: "\e155"; +} +.glyphicon-sort-by-attributes-alt:before { + content: "\e156"; +} +.glyphicon-unchecked:before { + content: "\e157"; +} +.glyphicon-expand:before { + content: "\e158"; +} +.glyphicon-collapse-down:before { + content: "\e159"; +} +.glyphicon-collapse-up:before { + content: "\e160"; +} +.glyphicon-log-in:before { + content: "\e161"; +} +.glyphicon-flash:before { + content: "\e162"; +} +.glyphicon-log-out:before { + content: "\e163"; +} +.glyphicon-new-window:before { + content: "\e164"; +} +.glyphicon-record:before { + content: "\e165"; +} +.glyphicon-save:before { + content: "\e166"; +} +.glyphicon-open:before { + content: "\e167"; +} +.glyphicon-saved:before { + content: "\e168"; +} +.glyphicon-import:before { + content: "\e169"; +} +.glyphicon-export:before { + content: "\e170"; +} +.glyphicon-send:before { + content: "\e171"; +} +.glyphicon-floppy-disk:before { + content: "\e172"; +} +.glyphicon-floppy-saved:before { + content: "\e173"; +} +.glyphicon-floppy-remove:before { + content: "\e174"; +} +.glyphicon-floppy-save:before { + content: "\e175"; +} +.glyphicon-floppy-open:before { + content: "\e176"; +} +.glyphicon-credit-card:before { + content: "\e177"; +} +.glyphicon-transfer:before { + content: "\e178"; +} +.glyphicon-cutlery:before { + content: "\e179"; +} +.glyphicon-header:before { + content: "\e180"; +} +.glyphicon-compressed:before { + content: "\e181"; +} +.glyphicon-earphone:before { + content: "\e182"; +} +.glyphicon-phone-alt:before { + content: "\e183"; +} +.glyphicon-tower:before { + content: "\e184"; +} +.glyphicon-stats:before { + content: "\e185"; +} +.glyphicon-sd-video:before { + content: "\e186"; +} +.glyphicon-hd-video:before { + content: "\e187"; +} +.glyphicon-subtitles:before { + content: "\e188"; +} +.glyphicon-sound-stereo:before { + content: "\e189"; +} +.glyphicon-sound-dolby:before { + content: "\e190"; +} +.glyphicon-sound-5-1:before { + content: "\e191"; +} +.glyphicon-sound-6-1:before { + content: "\e192"; +} +.glyphicon-sound-7-1:before { + content: "\e193"; +} +.glyphicon-copyright-mark:before { + content: "\e194"; +} +.glyphicon-registration-mark:before { + content: "\e195"; +} +.glyphicon-cloud-download:before { + content: "\e197"; +} +.glyphicon-cloud-upload:before { + content: "\e198"; +} +.glyphicon-tree-conifer:before { + content: "\e199"; +} +.glyphicon-tree-deciduous:before { + content: "\e200"; +} +.caret { + display: inline-block; + width: 0; + height: 0; + margin-left: 2px; + vertical-align: middle; + border-top: 4px solid; + border-right: 4px solid transparent; + border-left: 4px solid transparent; +} +.dropdown { + position: relative; +} +.dropdown-toggle:focus { + outline: 0; +} +.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; + font-size: 14px; + background-color: #ffffff; + border: 1px solid #cccccc; + border: 1px solid rgba(0, 0, 0, 0.15); + border-radius: 3px; + -webkit-box-shadow: 0 6px 12px rgba(0, 0, 0, 0.175); + box-shadow: 0 6px 12px rgba(0, 0, 0, 0.175); + background-clip: padding-box; +} +.dropdown-menu.pull-right { + right: 0; + left: auto; +} +.dropdown-menu .divider { + height: 1px; + margin: 9px 0; + overflow: hidden; + background-color: #e5e5e5; +} +.dropdown-menu > li > a { + display: block; + padding: 3px 20px; + clear: both; + font-weight: normal; + line-height: 1.428571429; + color: #333333; + white-space: nowrap; +} +.dropdown-menu > li > a:hover, +.dropdown-menu > li > a:focus { + text-decoration: none; + color: #262626; + background-color: #f5f5f5; +} +.dropdown-menu > .active > a, +.dropdown-menu > .active > a:hover, +.dropdown-menu > .active > a:focus { + color: #ffffff; + text-decoration: none; + outline: 0; + background-color: #0d8921; +} +.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; + background-color: transparent; + background-image: none; + filter: progid:DXImageTransform.Microsoft.gradient(enabled = false); + cursor: not-allowed; +} +.open > .dropdown-menu { + display: block; +} +.open > a { + outline: 0; +} +.dropdown-menu-right { + left: auto; + right: 0; +} +.dropdown-menu-left { + left: 0; + right: auto; +} +.dropdown-header { + display: block; + padding: 3px 20px; + font-size: 12px; + line-height: 1.428571429; + color: #999999; +} +.dropdown-backdrop { + position: fixed; + left: 0; + right: 0; + bottom: 0; + top: 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; + content: ""; +} +.dropup .dropdown-menu, +.navbar-fixed-bottom .dropdown .dropdown-menu { + top: auto; + bottom: 100%; + margin-bottom: 1px; +} +@media (min-width: 768px) { + .navbar-right .dropdown-menu { + left: auto; + right: 0; + } + .navbar-right .dropdown-menu-left { + left: 0; + right: auto; + } +} +.btn-group, +.btn-group-vertical { + position: relative; + display: inline-block; + vertical-align: middle; +} +.btn-group > .btn, +.btn-group-vertical > .btn { + position: relative; + float: left; +} +.btn-group > .btn:hover, +.btn-group-vertical > .btn:hover, +.btn-group > .btn:focus, +.btn-group-vertical > .btn:focus, +.btn-group > .btn:active, +.btn-group-vertical > .btn:active, +.btn-group > .btn.active, +.btn-group-vertical > .btn.active { + z-index: 2; +} +.btn-group > .btn:focus, +.btn-group-vertical > .btn:focus { + outline: none; +} +.btn-group .btn + .btn, +.btn-group .btn + .btn-group, +.btn-group .btn-group + .btn, +.btn-group .btn-group + .btn-group { + margin-left: -1px; +} +.btn-toolbar { + margin-left: -5px; +} +.btn-toolbar .btn-group, +.btn-toolbar .input-group { + float: left; +} +.btn-toolbar > .btn, +.btn-toolbar > .btn-group, +.btn-toolbar > .input-group { + margin-left: 5px; +} +.btn-group > .btn:not(:first-child):not(:last-child):not(.dropdown-toggle) { + border-radius: 0; +} +.btn-group > .btn:first-child { + margin-left: 0; +} +.btn-group > .btn:first-child:not(:last-child):not(.dropdown-toggle) { + border-bottom-right-radius: 0; + border-top-right-radius: 0; +} +.btn-group > .btn:last-child:not(:first-child), +.btn-group > .dropdown-toggle:not(:first-child) { + border-bottom-left-radius: 0; + border-top-left-radius: 0; +} +.btn-group > .btn-group { + float: left; +} +.btn-group > .btn-group:not(:first-child):not(:last-child) > .btn { + border-radius: 0; +} +.btn-group > .btn-group:first-child > .btn:last-child, +.btn-group > .btn-group:first-child > .dropdown-toggle { + border-bottom-right-radius: 0; + border-top-right-radius: 0; +} +.btn-group > .btn-group:last-child > .btn:first-child { + border-bottom-left-radius: 0; + border-top-left-radius: 0; +} +.btn-group .dropdown-toggle:active, +.btn-group.open .dropdown-toggle { + outline: 0; +} +.btn-group > .btn + .dropdown-toggle { + padding-left: 8px; + padding-right: 8px; +} +.btn-group > .btn-lg + .dropdown-toggle { + padding-left: 12px; + padding-right: 12px; +} +.btn-group.open .dropdown-toggle { + -webkit-box-shadow: inset 0 3px 5px rgba(0, 0, 0, 0.125); + box-shadow: inset 0 3px 5px rgba(0, 0, 0, 0.125); +} +.btn-group.open .dropdown-toggle.btn-link { + -webkit-box-shadow: none; + box-shadow: none; +} +.btn .caret { + margin-left: 0; +} +.btn-lg .caret { + border-width: 5px 5px 0; + border-bottom-width: 0; +} +.dropup .btn-lg .caret { + border-width: 0 5px 5px; +} +.btn-group-vertical > .btn, +.btn-group-vertical > .btn-group, +.btn-group-vertical > .btn-group > .btn { + display: block; + float: none; + width: 100%; + max-width: 100%; +} +.btn-group-vertical > .btn-group > .btn { + float: none; +} +.btn-group-vertical > .btn + .btn, +.btn-group-vertical > .btn + .btn-group, +.btn-group-vertical > .btn-group + .btn, +.btn-group-vertical > .btn-group + .btn-group { + margin-top: -1px; + margin-left: 0; +} +.btn-group-vertical > .btn:not(:first-child):not(:last-child) { + border-radius: 0; +} +.btn-group-vertical > .btn:first-child:not(:last-child) { + border-top-right-radius: 3px; + border-bottom-right-radius: 0; + border-bottom-left-radius: 0; +} +.btn-group-vertical > .btn:last-child:not(:first-child) { + border-bottom-left-radius: 3px; + border-top-right-radius: 0; + border-top-left-radius: 0; +} +.btn-group-vertical > .btn-group:not(:first-child):not(:last-child) > .btn { + border-radius: 0; +} +.btn-group-vertical > .btn-group:first-child:not(:last-child) > .btn:last-child, +.btn-group-vertical > .btn-group:first-child:not(:last-child) > .dropdown-toggle { + border-bottom-right-radius: 0; + border-bottom-left-radius: 0; +} +.btn-group-vertical > .btn-group:last-child:not(:first-child) > .btn:first-child { + border-top-right-radius: 0; + border-top-left-radius: 0; +} +.btn-group-justified { + display: table; + width: 100%; + table-layout: fixed; + border-collapse: separate; +} +.btn-group-justified > .btn, +.btn-group-justified > .btn-group { + float: none; + display: table-cell; + width: 1%; +} +.btn-group-justified > .btn-group .btn { + width: 100%; +} +[data-toggle="buttons"] > .btn > input[type="radio"], +[data-toggle="buttons"] > .btn > input[type="checkbox"] { + display: none; +} +.input-group { + position: relative; + display: table; + border-collapse: separate; +} +.input-group[class*="col-"] { + float: none; + padding-left: 0; + padding-right: 0; +} +.input-group .form-control { + position: relative; + z-index: 2; + float: left; + width: 100%; + margin-bottom: 0; +} +.input-group-lg > .form-control, +.input-group-lg > .input-group-addon, +.input-group-lg > .input-group-btn > .btn { + height: 36px; + padding: 5px 10px; + font-size: 18px; + line-height: 1.33; + border-radius: 4px; +} +select.input-group-lg > .form-control, +select.input-group-lg > .input-group-addon, +select.input-group-lg > .input-group-btn > .btn { + height: 36px; + line-height: 36px; +} +textarea.input-group-lg > .form-control, +textarea.input-group-lg > .input-group-addon, +textarea.input-group-lg > .input-group-btn > .btn, +select[multiple].input-group-lg > .form-control, +select[multiple].input-group-lg > .input-group-addon, +select[multiple].input-group-lg > .input-group-btn > .btn { + height: auto; +} +.input-group-sm > .form-control, +.input-group-sm > .input-group-addon, +.input-group-sm > .input-group-btn > .btn { + height: 22px; + padding: 1px 5px; + font-size: 12px; + line-height: 1.5; + border-radius: 2px; +} +select.input-group-sm > .form-control, +select.input-group-sm > .input-group-addon, +select.input-group-sm > .input-group-btn > .btn { + height: 22px; + line-height: 22px; +} +textarea.input-group-sm > .form-control, +textarea.input-group-sm > .input-group-addon, +textarea.input-group-sm > .input-group-btn > .btn, +select[multiple].input-group-sm > .form-control, +select[multiple].input-group-sm > .input-group-addon, +select[multiple].input-group-sm > .input-group-btn > .btn { + height: auto; +} +.input-group-addon, +.input-group-btn, +.input-group .form-control { + display: table-cell; +} +.input-group-addon:not(:first-child):not(:last-child), +.input-group-btn:not(:first-child):not(:last-child), +.input-group .form-control:not(:first-child):not(:last-child) { + border-radius: 0; +} +.input-group-addon, +.input-group-btn { + width: 1%; + white-space: nowrap; + vertical-align: middle; +} +.input-group-addon { + padding: 2px 5px; + font-size: 14px; + font-weight: normal; + line-height: 1; + color: #555555; + text-align: center; + background-color: #eeeeee; + border: 1px solid #cccccc; + border-radius: 3px; +} +.input-group-addon.input-sm { + padding: 1px 5px; + font-size: 12px; + border-radius: 2px; +} +.input-group-addon.input-lg { + padding: 5px 10px; + font-size: 18px; + border-radius: 4px; +} +.input-group-addon input[type="radio"], +.input-group-addon input[type="checkbox"] { + margin-top: 0; +} +.input-group .form-control:first-child, +.input-group-addon:first-child, +.input-group-btn:first-child > .btn, +.input-group-btn:first-child > .btn-group > .btn, +.input-group-btn:first-child > .dropdown-toggle, +.input-group-btn:last-child > .btn:not(:last-child):not(.dropdown-toggle), +.input-group-btn:last-child > .btn-group:not(:last-child) > .btn { + border-bottom-right-radius: 0; + border-top-right-radius: 0; +} +.input-group-addon:first-child { + border-right: 0; +} +.input-group .form-control:last-child, +.input-group-addon:last-child, +.input-group-btn:last-child > .btn, +.input-group-btn:last-child > .btn-group > .btn, +.input-group-btn:last-child > .dropdown-toggle, +.input-group-btn:first-child > .btn:not(:first-child), +.input-group-btn:first-child > .btn-group:not(:first-child) > .btn { + border-bottom-left-radius: 0; + border-top-left-radius: 0; +} +.input-group-addon:last-child { + border-left: 0; +} +.input-group-btn { + position: relative; + font-size: 0; + white-space: nowrap; +} +.input-group-btn > .btn { + position: relative; +} +.input-group-btn > .btn + .btn { + margin-left: -1px; +} +.input-group-btn > .btn:hover, +.input-group-btn > .btn:focus, +.input-group-btn > .btn:active { + z-index: 2; +} +.input-group-btn:first-child > .btn, +.input-group-btn:first-child > .btn-group { + margin-right: -1px; +} +.input-group-btn:last-child > .btn, +.input-group-btn:last-child > .btn-group { + margin-left: -1px; +} +.nav { + margin-bottom: 0; + padding-left: 0; + list-style: none; +} +.nav > li { + position: relative; + display: block; +} +.nav > li > a { + position: relative; + display: block; + padding: 5px 10px; +} +.nav > li > a:hover, +.nav > li > a:focus { + text-decoration: none; + background-color: #eeeeee; +} +.nav > li.disabled > a { + color: #999999; +} +.nav > li.disabled > a:hover, +.nav > li.disabled > a:focus { + color: #999999; + text-decoration: none; + background-color: transparent; + cursor: not-allowed; +} +.nav .open > a, +.nav .open > a:hover, +.nav .open > a:focus { + background-color: #eeeeee; + border-color: #222222; +} +.nav .nav-divider { + height: 1px; + margin: 9px 0; + overflow: hidden; + background-color: #e5e5e5; +} +.nav > li > a > img { + max-width: none; +} +.nav-tabs { + border-bottom: 1px solid #dddddd; +} +.nav-tabs > li { + float: left; + margin-bottom: -1px; +} +.nav-tabs > li > a { + margin-right: 2px; + line-height: 1.428571429; + border: 1px solid transparent; + border-radius: 3px 3px 0 0; +} +.nav-tabs > li > a:hover { + border-color: #eeeeee #eeeeee #dddddd; +} +.nav-tabs > li.active > a, +.nav-tabs > li.active > a:hover, +.nav-tabs > li.active > a:focus { + color: #555555; + background-color: #ffffff; + border: 1px solid #dddddd; + border-bottom-color: transparent; + cursor: default; +} +.nav-tabs.nav-justified { + width: 100%; + border-bottom: 0; +} +.nav-tabs.nav-justified > li { + float: none; +} +.nav-tabs.nav-justified > li > a { + text-align: center; + margin-bottom: 5px; +} +.nav-tabs.nav-justified > .dropdown .dropdown-menu { + top: auto; + left: auto; +} +@media (min-width: 768px) { + .nav-tabs.nav-justified > li { + display: table-cell; + width: 1%; + } + .nav-tabs.nav-justified > li > a { + margin-bottom: 0; + } +} +.nav-tabs.nav-justified > li > a { + margin-right: 0; + border-radius: 3px; +} +.nav-tabs.nav-justified > .active > a, +.nav-tabs.nav-justified > .active > a:hover, +.nav-tabs.nav-justified > .active > a:focus { + border: 1px solid #dddddd; +} +@media (min-width: 768px) { + .nav-tabs.nav-justified > li > a { + border-bottom: 1px solid #dddddd; + border-radius: 3px 3px 0 0; + } + .nav-tabs.nav-justified > .active > a, + .nav-tabs.nav-justified > .active > a:hover, + .nav-tabs.nav-justified > .active > a:focus { + border-bottom-color: #ffffff; + } +} +.nav-pills > li { + float: left; +} +.nav-pills > li > a { + border-radius: 3px; +} +.nav-pills > li + li { + margin-left: 2px; +} +.nav-pills > li.active > a, +.nav-pills > li.active > a:hover, +.nav-pills > li.active > a:focus { + color: #ffffff; + background-color: #0d8921; +} +.nav-stacked > li { + float: none; +} +.nav-stacked > li + li { + margin-top: 2px; + margin-left: 0; +} +.nav-justified { + width: 100%; +} +.nav-justified > li { + float: none; +} +.nav-justified > li > a { + text-align: center; + margin-bottom: 5px; +} +.nav-justified > .dropdown .dropdown-menu { + top: auto; + left: auto; +} +@media (min-width: 768px) { + .nav-justified > li { + display: table-cell; + width: 1%; + } + .nav-justified > li > a { + margin-bottom: 0; + } +} +.nav-tabs-justified { + border-bottom: 0; +} +.nav-tabs-justified > li > a { + margin-right: 0; + border-radius: 3px; +} +.nav-tabs-justified > .active > a, +.nav-tabs-justified > .active > a:hover, +.nav-tabs-justified > .active > a:focus { + border: 1px solid #dddddd; +} +@media (min-width: 768px) { + .nav-tabs-justified > li > a { + border-bottom: 1px solid #dddddd; + border-radius: 3px 3px 0 0; + } + .nav-tabs-justified > .active > a, + .nav-tabs-justified > .active > a:hover, + .nav-tabs-justified > .active > a:focus { + border-bottom-color: #ffffff; + } +} +.tab-content > .tab-pane { + display: none; +} +.tab-content > .active { + display: block; +} +.nav-tabs .dropdown-menu { + margin-top: -1px; + border-top-right-radius: 0; + border-top-left-radius: 0; +} +.navbar { + position: relative; + min-height: 30px; + margin-bottom: 20px; + border: 1px solid transparent; +} +@media (min-width: 768px) { + .navbar { + border-radius: 3px; + } +} +@media (min-width: 768px) { + .navbar-header { + float: left; + } +} +.navbar-collapse { + max-height: 340px; + overflow-x: visible; + padding-right: 15px; + padding-left: 15px; + border-top: 1px solid transparent; + box-shadow: inset 0 1px 0 rgba(255, 255, 255, 0.1); + -webkit-overflow-scrolling: touch; +} +.navbar-collapse.in { + overflow-y: auto; +} +@media (min-width: 768px) { + .navbar-collapse { + width: auto; + border-top: 0; + box-shadow: none; + } + .navbar-collapse.collapse { + display: block !important; + height: auto !important; + padding-bottom: 0; + overflow: visible !important; + } + .navbar-collapse.in { + overflow-y: visible; + } + .navbar-fixed-top .navbar-collapse, + .navbar-static-top .navbar-collapse, + .navbar-fixed-bottom .navbar-collapse { + padding-left: 0; + padding-right: 0; + } +} +.container > .navbar-header, +.container-fluid > .navbar-header, +.container > .navbar-collapse, +.container-fluid > .navbar-collapse { + margin-right: -15px; + margin-left: -15px; +} +@media (min-width: 768px) { + .container > .navbar-header, + .container-fluid > .navbar-header, + .container > .navbar-collapse, + .container-fluid > .navbar-collapse { + margin-right: 0; + margin-left: 0; + } +} +.navbar-static-top { + z-index: 1000; + border-width: 0 0 1px; +} +@media (min-width: 768px) { + .navbar-static-top { + border-radius: 0; + } +} +.navbar-fixed-top, +.navbar-fixed-bottom { + position: fixed; + right: 0; + left: 0; + z-index: 1030; +} +@media (min-width: 768px) { + .navbar-fixed-top, + .navbar-fixed-bottom { + border-radius: 0; + } +} +.navbar-fixed-top { + top: 0; + border-width: 0 0 1px; +} +.navbar-fixed-bottom { + bottom: 0; + margin-bottom: 0; + border-width: 1px 0 0; +} +.navbar-brand { + float: left; + padding: 5px 15px; + font-size: 18px; + line-height: 20px; + height: 30px; +} +.navbar-brand:hover, +.navbar-brand:focus { + text-decoration: none; +} +@media (min-width: 768px) { + .navbar > .container .navbar-brand, + .navbar > .container-fluid .navbar-brand { + margin-left: -15px; + } +} +.navbar-toggle { + position: relative; + float: right; + margin-right: 15px; + padding: 9px 10px; + margin-top: -2px; + margin-bottom: -2px; + background-color: transparent; + background-image: none; + border: 1px solid transparent; + border-radius: 3px; +} +.navbar-toggle:focus { + outline: none; +} +.navbar-toggle .icon-bar { + display: block; + width: 22px; + height: 2px; + border-radius: 1px; +} +.navbar-toggle .icon-bar + .icon-bar { + margin-top: 4px; +} +@media (min-width: 768px) { + .navbar-toggle { + display: none; + } +} +.navbar-nav { + margin: 2.5px -15px; +} +.navbar-nav > li > a { + padding-top: 10px; + padding-bottom: 10px; + line-height: 20px; +} +@media (max-width: 767px) { + .navbar-nav .open .dropdown-menu { + position: static; + float: none; + width: auto; + margin-top: 0; + background-color: transparent; + border: 0; + box-shadow: none; + } + .navbar-nav .open .dropdown-menu > li > a, + .navbar-nav .open .dropdown-menu .dropdown-header { + padding: 5px 15px 5px 25px; + } + .navbar-nav .open .dropdown-menu > li > a { + line-height: 20px; + } + .navbar-nav .open .dropdown-menu > li > a:hover, + .navbar-nav .open .dropdown-menu > li > a:focus { + background-image: none; + } +} +@media (min-width: 768px) { + .navbar-nav { + float: left; + margin: 0; + } + .navbar-nav > li { + float: left; + } + .navbar-nav > li > a { + padding-top: 5px; + padding-bottom: 5px; + } + .navbar-nav.navbar-right:last-child { + margin-right: -15px; + } +} +@media (min-width: 768px) { + .navbar-left { + float: left !important; + } + .navbar-right { + float: right !important; + } +} +.navbar-form { + margin-left: -15px; + margin-right: -15px; + padding: 10px 15px; + border-top: 1px solid transparent; + border-bottom: 1px solid transparent; + -webkit-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); + margin-top: 2px; + margin-bottom: 2px; +} +@media (min-width: 768px) { + .navbar-form .form-group { + display: inline-block; + margin-bottom: 0; + vertical-align: middle; + } + .navbar-form .form-control { + display: inline-block; + width: auto; + vertical-align: middle; + } + .navbar-form .input-group > .form-control { + width: 100%; + } + .navbar-form .control-label { + margin-bottom: 0; + vertical-align: middle; + } + .navbar-form .radio, + .navbar-form .checkbox { + display: inline-block; + margin-top: 0; + margin-bottom: 0; + padding-left: 0; + vertical-align: middle; + } + .navbar-form .radio input[type="radio"], + .navbar-form .checkbox input[type="checkbox"] { + float: none; + margin-left: 0; + } + .navbar-form .has-feedback .form-control-feedback { + top: 0; + } +} +@media (max-width: 767px) { + .navbar-form .form-group { + margin-bottom: 5px; + } +} +@media (min-width: 768px) { + .navbar-form { + width: auto; + border: 0; + margin-left: 0; + margin-right: 0; + padding-top: 0; + padding-bottom: 0; + -webkit-box-shadow: none; + box-shadow: none; + } + .navbar-form.navbar-right:last-child { + margin-right: -15px; + } +} +.navbar-nav > li > .dropdown-menu { + margin-top: 0; + border-top-right-radius: 0; + border-top-left-radius: 0; +} +.navbar-fixed-bottom .navbar-nav > li > .dropdown-menu { + border-bottom-right-radius: 0; + border-bottom-left-radius: 0; +} +.navbar-btn { + margin-top: 2px; + margin-bottom: 2px; +} +.navbar-btn.btn-sm { + margin-top: 4px; + margin-bottom: 4px; +} +.navbar-btn.btn-xs { + margin-top: 4px; + margin-bottom: 4px; +} +.navbar-text { + margin-top: 5px; + margin-bottom: 5px; +} +@media (min-width: 768px) { + .navbar-text { + float: left; + margin-left: 15px; + margin-right: 15px; + } + .navbar-text.navbar-right:last-child { + margin-right: 0; + } +} +.navbar-default { + background-color: #f1f1f1; + border-color: #e0e0e0; +} +.navbar-default .navbar-brand { + color: #333333; +} +.navbar-default .navbar-brand:hover, +.navbar-default .navbar-brand:focus { + color: #1a1a1a; + background-color: transparent; +} +.navbar-default .navbar-text { + color: #333333; +} +.navbar-default .navbar-nav > li > a { + color: #333333; +} +.navbar-default .navbar-nav > li > a:hover, +.navbar-default .navbar-nav > li > a:focus { + color: #0d8921; + background-color: transparent; +} +.navbar-default .navbar-nav > .active > a, +.navbar-default .navbar-nav > .active > a:hover, +.navbar-default .navbar-nav > .active > a:focus { + color: #ffffff; + background-color: #0d8921; +} +.navbar-default .navbar-nav > .disabled > a, +.navbar-default .navbar-nav > .disabled > a:hover, +.navbar-default .navbar-nav > .disabled > a:focus { + color: #cccccc; + background-color: transparent; +} +.navbar-default .navbar-toggle { + border-color: #dddddd; +} +.navbar-default .navbar-toggle:hover, +.navbar-default .navbar-toggle:focus { + background-color: #dddddd; +} +.navbar-default .navbar-toggle .icon-bar { + background-color: #888888; +} +.navbar-default .navbar-collapse, +.navbar-default .navbar-form { + border-color: #e0e0e0; +} +.navbar-default .navbar-nav > .open > a, +.navbar-default .navbar-nav > .open > a:hover, +.navbar-default .navbar-nav > .open > a:focus { + background-color: #0d8921; + color: #ffffff; +} +@media (max-width: 767px) { + .navbar-default .navbar-nav .open .dropdown-menu > li > a { + color: #333333; + } + .navbar-default .navbar-nav .open .dropdown-menu > li > a:hover, + .navbar-default .navbar-nav .open .dropdown-menu > li > a:focus { + color: #0d8921; + background-color: transparent; + } + .navbar-default .navbar-nav .open .dropdown-menu > .active > a, + .navbar-default .navbar-nav .open .dropdown-menu > .active > a:hover, + .navbar-default .navbar-nav .open .dropdown-menu > .active > a:focus { + color: #ffffff; + background-color: #0d8921; + } + .navbar-default .navbar-nav .open .dropdown-menu > .disabled > a, + .navbar-default .navbar-nav .open .dropdown-menu > .disabled > a:hover, + .navbar-default .navbar-nav .open .dropdown-menu > .disabled > a:focus { + color: #cccccc; + background-color: transparent; + } +} +.navbar-default .navbar-link { + color: #333333; +} +.navbar-default .navbar-link:hover { + color: #0d8921; +} +.navbar-inverse { + background-color: #222222; + border-color: #080808; +} +.navbar-inverse .navbar-brand { + color: #999999; +} +.navbar-inverse .navbar-brand:hover, +.navbar-inverse .navbar-brand:focus { + color: #ffffff; + background-color: transparent; +} +.navbar-inverse .navbar-text { + color: #999999; +} +.navbar-inverse .navbar-nav > li > a { + color: #999999; +} +.navbar-inverse .navbar-nav > li > a:hover, +.navbar-inverse .navbar-nav > li > a:focus { + color: #ffffff; + background-color: transparent; +} +.navbar-inverse .navbar-nav > .active > a, +.navbar-inverse .navbar-nav > .active > a:hover, +.navbar-inverse .navbar-nav > .active > a:focus { + color: #ffffff; + background-color: #080808; +} +.navbar-inverse .navbar-nav > .disabled > a, +.navbar-inverse .navbar-nav > .disabled > a:hover, +.navbar-inverse .navbar-nav > .disabled > a:focus { + color: #444444; + background-color: transparent; +} +.navbar-inverse .navbar-toggle { + border-color: #333333; +} +.navbar-inverse .navbar-toggle:hover, +.navbar-inverse .navbar-toggle:focus { + background-color: #333333; +} +.navbar-inverse .navbar-toggle .icon-bar { + background-color: #ffffff; +} +.navbar-inverse .navbar-collapse, +.navbar-inverse .navbar-form { + border-color: #101010; +} +.navbar-inverse .navbar-nav > .open > a, +.navbar-inverse .navbar-nav > .open > a:hover, +.navbar-inverse .navbar-nav > .open > a:focus { + background-color: #080808; + color: #ffffff; +} +@media (max-width: 767px) { + .navbar-inverse .navbar-nav .open .dropdown-menu > .dropdown-header { + border-color: #080808; + } + .navbar-inverse .navbar-nav .open .dropdown-menu .divider { + background-color: #080808; + } + .navbar-inverse .navbar-nav .open .dropdown-menu > li > a { + color: #999999; + } + .navbar-inverse .navbar-nav .open .dropdown-menu > li > a:hover, + .navbar-inverse .navbar-nav .open .dropdown-menu > li > a:focus { + color: #ffffff; + background-color: transparent; + } + .navbar-inverse .navbar-nav .open .dropdown-menu > .active > a, + .navbar-inverse .navbar-nav .open .dropdown-menu > .active > a:hover, + .navbar-inverse .navbar-nav .open .dropdown-menu > .active > a:focus { + color: #ffffff; + background-color: #080808; + } + .navbar-inverse .navbar-nav .open .dropdown-menu > .disabled > a, + .navbar-inverse .navbar-nav .open .dropdown-menu > .disabled > a:hover, + .navbar-inverse .navbar-nav .open .dropdown-menu > .disabled > a:focus { + color: #444444; + background-color: transparent; + } +} +.navbar-inverse .navbar-link { + color: #999999; +} +.navbar-inverse .navbar-link:hover { + color: #ffffff; +} +.breadcrumb { + padding: 8px 15px; + margin-bottom: 20px; + list-style: none; + background-color: #f5f5f5; + border-radius: 3px; +} +.breadcrumb > li { + display: inline-block; +} +.breadcrumb > li + li:before { + content: "/\00a0"; + padding: 0 5px; + color: #cccccc; +} +.breadcrumb > .active { + color: #999999; +} +.pagination { + display: inline-block; + padding-left: 0; + margin: 20px 0; + border-radius: 3px; +} +.pagination > li { + display: inline; +} +.pagination > li > a, +.pagination > li > span { + position: relative; + float: left; + padding: 2px 5px; + line-height: 1.428571429; + text-decoration: none; + color: #222222; + background-color: #ffffff; + border: 1px solid #dddddd; + margin-left: -1px; +} +.pagination > li:first-child > a, +.pagination > li:first-child > span { + margin-left: 0; + border-bottom-left-radius: 3px; + border-top-left-radius: 3px; +} +.pagination > li:last-child > a, +.pagination > li:last-child > span { + border-bottom-right-radius: 3px; + border-top-right-radius: 3px; +} +.pagination > li > a:hover, +.pagination > li > span:hover, +.pagination > li > a:focus, +.pagination > li > span:focus { + color: #0d8921; + background-color: #eeeeee; + border-color: #dddddd; +} +.pagination > .active > a, +.pagination > .active > span, +.pagination > .active > a:hover, +.pagination > .active > span:hover, +.pagination > .active > a:focus, +.pagination > .active > span:focus { + z-index: 2; + color: #ffffff; + background-color: #0d8921; + border-color: #0d8921; + cursor: default; +} +.pagination > .disabled > span, +.pagination > .disabled > span:hover, +.pagination > .disabled > span:focus, +.pagination > .disabled > a, +.pagination > .disabled > a:hover, +.pagination > .disabled > a:focus { + color: #999999; + background-color: #ffffff; + border-color: #dddddd; + cursor: not-allowed; +} +.pagination-lg > li > a, +.pagination-lg > li > span { + padding: 5px 10px; + font-size: 18px; +} +.pagination-lg > li:first-child > a, +.pagination-lg > li:first-child > span { + border-bottom-left-radius: 4px; + border-top-left-radius: 4px; +} +.pagination-lg > li:last-child > a, +.pagination-lg > li:last-child > span { + border-bottom-right-radius: 4px; + border-top-right-radius: 4px; +} +.pagination-sm > li > a, +.pagination-sm > li > span { + padding: 1px 5px; + font-size: 12px; +} +.pagination-sm > li:first-child > a, +.pagination-sm > li:first-child > span { + border-bottom-left-radius: 2px; + border-top-left-radius: 2px; +} +.pagination-sm > li:last-child > a, +.pagination-sm > li:last-child > span { + border-bottom-right-radius: 2px; + border-top-right-radius: 2px; +} +.pager { + padding-left: 0; + margin: 20px 0; + list-style: none; + text-align: center; +} +.pager li { + display: inline; +} +.pager li > a, +.pager li > span { + display: inline-block; + padding: 5px 14px; + background-color: #ffffff; + border: 1px solid #dddddd; + border-radius: 15px; +} +.pager li > a:hover, +.pager li > a:focus { + text-decoration: none; + background-color: #eeeeee; +} +.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; + background-color: #ffffff; + cursor: not-allowed; +} +.label { + display: inline; + padding: .2em .6em .3em; + font-size: 75%; + font-weight: bold; + line-height: 1; + color: #ffffff; + text-align: center; + white-space: nowrap; + vertical-align: baseline; + border-radius: .25em; +} +.label[href]:hover, +.label[href]:focus { + color: #ffffff; + text-decoration: none; + cursor: pointer; +} +.label:empty { + display: none; +} +.btn .label { + position: relative; + top: -1px; +} +.label-default { + background-color: #999999; +} +.label-default[href]:hover, +.label-default[href]:focus { + background-color: #808080; +} +.label-primary { + background-color: #0d8921; +} +.label-primary[href]:hover, +.label-primary[href]:focus { + background-color: #095a16; +} +.label-success { + background-color: #5cb85c; +} +.label-success[href]:hover, +.label-success[href]:focus { + background-color: #449d44; +} +.label-info { + background-color: #6c6c6c; +} +.label-info[href]:hover, +.label-info[href]:focus { + background-color: #525252; +} +.label-warning { + background-color: #f0ad4e; +} +.label-warning[href]:hover, +.label-warning[href]:focus { + background-color: #ec971f; +} +.label-danger { + background-color: #d9534f; +} +.label-danger[href]:hover, +.label-danger[href]:focus { + background-color: #c9302c; +} +.badge { + display: inline-block; + min-width: 10px; + padding: 3px 7px; + font-size: 12px; + font-weight: bold; + color: #ffffff; + line-height: 1; + vertical-align: baseline; + white-space: nowrap; + text-align: center; + background-color: #999999; + border-radius: 10px; +} +.badge:empty { + display: none; +} +.btn .badge { + position: relative; + top: -1px; +} +.btn-xs .badge { + top: 0; + padding: 1px 5px; +} +a.badge:hover, +a.badge:focus { + color: #ffffff; + text-decoration: none; + cursor: pointer; +} +a.list-group-item.active > .badge, +.nav-pills > .active > a > .badge { + color: #222222; + background-color: #ffffff; +} +.nav-pills > li > a > .badge { + margin-left: 3px; +} +.jumbotron { + padding: 20px; + margin-bottom: 20px; + color: inherit; + background-color: #eeeeee; +} +.jumbotron h1, +.jumbotron .h1 { + color: inherit; +} +.jumbotron p { + margin-bottom: 10px; + font-size: 17px; + font-weight: 200; +} +.container .jumbotron { + border-radius: 4px; +} +.jumbotron .container { + max-width: 100%; +} +@media screen and (min-width: 768px) { + .jumbotron { + padding-top: 32px; + padding-bottom: 32px; + } + .container .jumbotron { + padding-left: 40px; + padding-right: 40px; + } + .jumbotron h1, + .jumbotron .h1 { + font-size: 63px; + } +} +.thumbnail { + display: block; + padding: 4px; + margin-bottom: 20px; + line-height: 1.428571429; + background-color: #ffffff; + border: 1px solid #dddddd; + border-radius: 3px; + -webkit-transition: all 0.2s ease-in-out; + transition: all 0.2s ease-in-out; +} +.thumbnail > img, +.thumbnail a > img { + margin-left: auto; + margin-right: auto; +} +a.thumbnail:hover, +a.thumbnail:focus, +a.thumbnail.active { + border-color: #222222; +} +.thumbnail .caption { + padding: 9px; + color: #333333; +} +.alert { + padding: 15px; + margin-bottom: 20px; + border: 1px solid transparent; + border-radius: 3px; +} +.alert h4 { + margin-top: 0; + color: inherit; +} +.alert .alert-link { + font-weight: bold; +} +.alert > p, +.alert > ul { + margin-bottom: 0; +} +.alert > p + p { + margin-top: 5px; +} +.alert-dismissable { + padding-right: 35px; +} +.alert-dismissable .close { + position: relative; + top: -2px; + right: -21px; + color: inherit; +} +.alert-success { + background-color: #eaf6ea; + border-color: #bcdfb5; + color: #5cb85c; +} +.alert-success hr { + border-top-color: #acd7a3; +} +.alert-success .alert-link { + color: #449d44; +} +.alert-info { + background-color: #ececec; + border-color: #d2d2d2; + color: #6c6c6c; +} +.alert-info hr { + border-top-color: #c5c5c5; +} +.alert-info .alert-link { + color: #525252; +} +.alert-warning { + background-color: #fef9f3; + border-color: #fadac4; + color: #f0ad4e; +} +.alert-warning hr { + border-top-color: #f8ccac; +} +.alert-warning .alert-link { + color: #ec971f; +} +.alert-danger { + background-color: #f9e2e2; + border-color: #f0b8c0; + color: #d9534f; +} +.alert-danger hr { + border-top-color: #eba3ad; +} +.alert-danger .alert-link { + color: #c9302c; +} +@-webkit-keyframes progress-bar-stripes { + from { + background-position: 40px 0; + } + to { + background-position: 0 0; + } +} +@keyframes progress-bar-stripes { + from { + background-position: 40px 0; + } + to { + background-position: 0 0; + } +} +.progress { + overflow: hidden; + height: 20px; + margin-bottom: 20px; + background-color: #f5f5f5; + border-radius: 3px; + -webkit-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; + line-height: 20px; + color: #ffffff; + text-align: center; + background-color: #0d8921; + -webkit-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-transition: width 0.6s ease; + transition: width 0.6s ease; +} +.progress-striped .progress-bar { + 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: 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-size: 40px 40px; +} +.progress.active .progress-bar { + -webkit-animation: progress-bar-stripes 2s linear infinite; + animation: progress-bar-stripes 2s linear infinite; +} +.progress-bar-success { + background-color: #5cb85c; +} +.progress-striped .progress-bar-success { + 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: 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-bar-info { + background-color: #6c6c6c; +} +.progress-striped .progress-bar-info { + 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: 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-bar-warning { + background-color: #f0ad4e; +} +.progress-striped .progress-bar-warning { + 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: 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-bar-danger { + background-color: #d9534f; +} +.progress-striped .progress-bar-danger { + 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: 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); +} +.media, +.media-body { + overflow: hidden; + 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 { + padding-left: 0; + list-style: none; +} +.list-group { + margin-bottom: 20px; + padding-left: 0; +} +.list-group-item { + position: relative; + display: block; + padding: 10px 15px; + margin-bottom: -1px; + background-color: #ffffff; + border: 1px solid #dddddd; +} +.list-group-item:first-child { + border-top-right-radius: 3px; + border-top-left-radius: 3px; +} +.list-group-item:last-child { + margin-bottom: 0; + border-bottom-right-radius: 3px; + border-bottom-left-radius: 3px; +} +.list-group-item > .badge { + float: right; +} +.list-group-item > .badge + .badge { + margin-right: 5px; +} +a.list-group-item { + color: #555555; +} +a.list-group-item .list-group-item-heading { + color: #333333; +} +a.list-group-item:hover, +a.list-group-item:focus { + text-decoration: none; + background-color: #f5f5f5; +} +a.list-group-item.active, +a.list-group-item.active:hover, +a.list-group-item.active:focus { + z-index: 2; + color: #ffffff; + background-color: #0d8921; + border-color: #0d8921; +} +a.list-group-item.active .list-group-item-heading, +a.list-group-item.active:hover .list-group-item-heading, +a.list-group-item.active:focus .list-group-item-heading { + color: inherit; +} +a.list-group-item.active .list-group-item-text, +a.list-group-item.active:hover .list-group-item-text, +a.list-group-item.active:focus .list-group-item-text { + color: #71f185; +} +.list-group-item-success { + color: #5cb85c; + background-color: #eaf6ea; +} +a.list-group-item-success { + color: #5cb85c; +} +a.list-group-item-success .list-group-item-heading { + color: inherit; +} +a.list-group-item-success:hover, +a.list-group-item-success:focus { + color: #5cb85c; + background-color: #d8eed8; +} +a.list-group-item-success.active, +a.list-group-item-success.active:hover, +a.list-group-item-success.active:focus { + color: #fff; + background-color: #5cb85c; + border-color: #5cb85c; +} +.list-group-item-info { + color: #6c6c6c; + background-color: #ececec; +} +a.list-group-item-info { + color: #6c6c6c; +} +a.list-group-item-info .list-group-item-heading { + color: inherit; +} +a.list-group-item-info:hover, +a.list-group-item-info:focus { + color: #6c6c6c; + background-color: #dfdfdf; +} +a.list-group-item-info.active, +a.list-group-item-info.active:hover, +a.list-group-item-info.active:focus { + color: #fff; + background-color: #6c6c6c; + border-color: #6c6c6c; +} +.list-group-item-warning { + color: #f0ad4e; + background-color: #fef9f3; +} +a.list-group-item-warning { + color: #f0ad4e; +} +a.list-group-item-warning .list-group-item-heading { + color: inherit; +} +a.list-group-item-warning:hover, +a.list-group-item-warning:focus { + color: #f0ad4e; + background-color: #fceedb; +} +a.list-group-item-warning.active, +a.list-group-item-warning.active:hover, +a.list-group-item-warning.active:focus { + color: #fff; + background-color: #f0ad4e; + border-color: #f0ad4e; +} +.list-group-item-danger { + color: #d9534f; + background-color: #f9e2e2; +} +a.list-group-item-danger { + color: #d9534f; +} +a.list-group-item-danger .list-group-item-heading { + color: inherit; +} +a.list-group-item-danger:hover, +a.list-group-item-danger:focus { + color: #d9534f; + background-color: #f4cecd; +} +a.list-group-item-danger.active, +a.list-group-item-danger.active:hover, +a.list-group-item-danger.active:focus { + color: #fff; + background-color: #d9534f; + border-color: #d9534f; +} +.list-group-item-heading { + margin-top: 0; + margin-bottom: 5px; +} +.list-group-item-text { + margin-bottom: 0; + line-height: 1.3; +} +.panel { + margin-bottom: 20px; + background-color: #ffffff; + border: 1px solid transparent; + border-radius: 3px; + -webkit-box-shadow: 0 1px 1px rgba(0, 0, 0, 0.05); + box-shadow: 0 1px 1px rgba(0, 0, 0, 0.05); +} +.panel-body { + padding: 15px; +} +.panel-heading { + padding: 10px 15px; + border-bottom: 1px solid transparent; + border-top-right-radius: 2px; + border-top-left-radius: 2px; +} +.panel-heading > .dropdown .dropdown-toggle { + color: inherit; +} +.panel-title { + margin-top: 0; + margin-bottom: 0; + font-size: 16px; + color: inherit; +} +.panel-title > a { + color: inherit; +} +.panel-footer { + padding: 10px 15px; + background-color: #f5f5f5; + border-top: 1px solid #dddddd; + border-bottom-right-radius: 2px; + border-bottom-left-radius: 2px; +} +.panel > .list-group { + margin-bottom: 0; +} +.panel > .list-group .list-group-item { + border-width: 1px 0; + border-radius: 0; +} +.panel > .list-group:first-child .list-group-item:first-child { + border-top: 0; + border-top-right-radius: 2px; + border-top-left-radius: 2px; +} +.panel > .list-group:last-child .list-group-item:last-child { + border-bottom: 0; + border-bottom-right-radius: 2px; + border-bottom-left-radius: 2px; +} +.panel-heading + .list-group .list-group-item:first-child { + border-top-width: 0; +} +.panel > .table, +.panel > .table-responsive > .table { + margin-bottom: 0; +} +.panel > .table:first-child, +.panel > .table-responsive:first-child > .table:first-child { + border-top-right-radius: 2px; + border-top-left-radius: 2px; +} +.panel > .table:first-child > thead:first-child > tr:first-child td:first-child, +.panel > .table-responsive:first-child > .table:first-child > thead:first-child > tr:first-child td:first-child, +.panel > .table:first-child > tbody:first-child > tr:first-child td:first-child, +.panel > .table-responsive:first-child > .table:first-child > tbody:first-child > tr:first-child td:first-child, +.panel > .table:first-child > thead:first-child > tr:first-child th:first-child, +.panel > .table-responsive:first-child > .table:first-child > thead:first-child > tr:first-child th:first-child, +.panel > .table:first-child > tbody:first-child > tr:first-child th:first-child, +.panel > .table-responsive:first-child > .table:first-child > tbody:first-child > tr:first-child th:first-child { + border-top-left-radius: 2px; +} +.panel > .table:first-child > thead:first-child > tr:first-child td:last-child, +.panel > .table-responsive:first-child > .table:first-child > thead:first-child > tr:first-child td:last-child, +.panel > .table:first-child > tbody:first-child > tr:first-child td:last-child, +.panel > .table-responsive:first-child > .table:first-child > tbody:first-child > tr:first-child td:last-child, +.panel > .table:first-child > thead:first-child > tr:first-child th:last-child, +.panel > .table-responsive:first-child > .table:first-child > thead:first-child > tr:first-child th:last-child, +.panel > .table:first-child > tbody:first-child > tr:first-child th:last-child, +.panel > .table-responsive:first-child > .table:first-child > tbody:first-child > tr:first-child th:last-child { + border-top-right-radius: 2px; +} +.panel > .table:last-child, +.panel > .table-responsive:last-child > .table:last-child { + border-bottom-right-radius: 2px; + border-bottom-left-radius: 2px; +} +.panel > .table:last-child > tbody:last-child > tr:last-child td:first-child, +.panel > .table-responsive:last-child > .table:last-child > tbody:last-child > tr:last-child td:first-child, +.panel > .table:last-child > tfoot:last-child > tr:last-child td:first-child, +.panel > .table-responsive:last-child > .table:last-child > tfoot:last-child > tr:last-child td:first-child, +.panel > .table:last-child > tbody:last-child > tr:last-child th:first-child, +.panel > .table-responsive:last-child > .table:last-child > tbody:last-child > tr:last-child th:first-child, +.panel > .table:last-child > tfoot:last-child > tr:last-child th:first-child, +.panel > .table-responsive:last-child > .table:last-child > tfoot:last-child > tr:last-child th:first-child { + border-bottom-left-radius: 2px; +} +.panel > .table:last-child > tbody:last-child > tr:last-child td:last-child, +.panel > .table-responsive:last-child > .table:last-child > tbody:last-child > tr:last-child td:last-child, +.panel > .table:last-child > tfoot:last-child > tr:last-child td:last-child, +.panel > .table-responsive:last-child > .table:last-child > tfoot:last-child > tr:last-child td:last-child, +.panel > .table:last-child > tbody:last-child > tr:last-child th:last-child, +.panel > .table-responsive:last-child > .table:last-child > tbody:last-child > tr:last-child th:last-child, +.panel > .table:last-child > tfoot:last-child > tr:last-child th:last-child, +.panel > .table-responsive:last-child > .table:last-child > tfoot:last-child > tr:last-child th:last-child { + border-bottom-right-radius: 2px; +} +.panel > .panel-body + .table, +.panel > .panel-body + .table-responsive { + border-top: 1px solid #dddddd; +} +.panel > .table > tbody:first-child > tr:first-child th, +.panel > .table > tbody:first-child > tr:first-child td { + border-top: 0; +} +.panel > .table-bordered, +.panel > .table-responsive > .table-bordered { + border: 0; +} +.panel > .table-bordered > thead > tr > th:first-child, +.panel > .table-responsive > .table-bordered > thead > tr > th:first-child, +.panel > .table-bordered > tbody > tr > th:first-child, +.panel > .table-responsive > .table-bordered > tbody > tr > th:first-child, +.panel > .table-bordered > tfoot > tr > th:first-child, +.panel > .table-responsive > .table-bordered > tfoot > tr > th:first-child, +.panel > .table-bordered > thead > tr > td:first-child, +.panel > .table-responsive > .table-bordered > thead > tr > td:first-child, +.panel > .table-bordered > tbody > tr > td:first-child, +.panel > .table-responsive > .table-bordered > tbody > tr > td:first-child, +.panel > .table-bordered > tfoot > tr > td:first-child, +.panel > .table-responsive > .table-bordered > tfoot > tr > td:first-child { + border-left: 0; +} +.panel > .table-bordered > thead > tr > th:last-child, +.panel > .table-responsive > .table-bordered > thead > tr > th:last-child, +.panel > .table-bordered > tbody > tr > th:last-child, +.panel > .table-responsive > .table-bordered > tbody > tr > th:last-child, +.panel > .table-bordered > tfoot > tr > th:last-child, +.panel > .table-responsive > .table-bordered > tfoot > tr > th:last-child, +.panel > .table-bordered > thead > tr > td:last-child, +.panel > .table-responsive > .table-bordered > thead > tr > td:last-child, +.panel > .table-bordered > tbody > tr > td:last-child, +.panel > .table-responsive > .table-bordered > tbody > tr > td:last-child, +.panel > .table-bordered > tfoot > tr > td:last-child, +.panel > .table-responsive > .table-bordered > tfoot > tr > td:last-child { + border-right: 0; +} +.panel > .table-bordered > thead > tr:first-child > td, +.panel > .table-responsive > .table-bordered > thead > tr:first-child > td, +.panel > .table-bordered > tbody > tr:first-child > td, +.panel > .table-responsive > .table-bordered > tbody > tr:first-child > td, +.panel > .table-bordered > thead > tr:first-child > th, +.panel > .table-responsive > .table-bordered > thead > tr:first-child > th, +.panel > .table-bordered > tbody > tr:first-child > th, +.panel > .table-responsive > .table-bordered > tbody > tr:first-child > th { + border-bottom: 0; +} +.panel > .table-bordered > tbody > tr:last-child > td, +.panel > .table-responsive > .table-bordered > tbody > tr:last-child > td, +.panel > .table-bordered > tfoot > tr:last-child > td, +.panel > .table-responsive > .table-bordered > tfoot > tr:last-child > td, +.panel > .table-bordered > tbody > tr:last-child > th, +.panel > .table-responsive > .table-bordered > tbody > tr:last-child > th, +.panel > .table-bordered > tfoot > tr:last-child > th, +.panel > .table-responsive > .table-bordered > tfoot > tr:last-child > th { + border-bottom: 0; +} +.panel > .table-responsive { + border: 0; + margin-bottom: 0; +} +.panel-group { + margin-bottom: 20px; +} +.panel-group .panel { + margin-bottom: 0; + border-radius: 3px; + overflow: hidden; +} +.panel-group .panel + .panel { + margin-top: 5px; +} +.panel-group .panel-heading { + border-bottom: 0; +} +.panel-group .panel-heading + .panel-collapse .panel-body { + border-top: 1px solid #dddddd; +} +.panel-group .panel-footer { + border-top: 0; +} +.panel-group .panel-footer + .panel-collapse .panel-body { + border-bottom: 1px solid #dddddd; +} +.panel-default { + border-color: #dddddd; +} +.panel-default > .panel-heading { + color: #333333; + background-color: #f5f5f5; + border-color: #dddddd; +} +.panel-default > .panel-heading + .panel-collapse .panel-body { + border-top-color: #dddddd; +} +.panel-default > .panel-footer + .panel-collapse .panel-body { + border-bottom-color: #dddddd; +} +.panel-primary { + border-color: #0d8921; +} +.panel-primary > .panel-heading { + color: #ffffff; + background-color: #0d8921; + border-color: #0d8921; +} +.panel-primary > .panel-heading + .panel-collapse .panel-body { + border-top-color: #0d8921; +} +.panel-primary > .panel-footer + .panel-collapse .panel-body { + border-bottom-color: #0d8921; +} +.panel-success { + border-color: #bcdfb5; +} +.panel-success > .panel-heading { + color: #5cb85c; + background-color: #eaf6ea; + border-color: #bcdfb5; +} +.panel-success > .panel-heading + .panel-collapse .panel-body { + border-top-color: #bcdfb5; +} +.panel-success > .panel-footer + .panel-collapse .panel-body { + border-bottom-color: #bcdfb5; +} +.panel-info { + border-color: #d2d2d2; +} +.panel-info > .panel-heading { + color: #6c6c6c; + background-color: #ececec; + border-color: #d2d2d2; +} +.panel-info > .panel-heading + .panel-collapse .panel-body { + border-top-color: #d2d2d2; +} +.panel-info > .panel-footer + .panel-collapse .panel-body { + border-bottom-color: #d2d2d2; +} +.panel-warning { + border-color: #fadac4; +} +.panel-warning > .panel-heading { + color: #f0ad4e; + background-color: #fef9f3; + border-color: #fadac4; +} +.panel-warning > .panel-heading + .panel-collapse .panel-body { + border-top-color: #fadac4; +} +.panel-warning > .panel-footer + .panel-collapse .panel-body { + border-bottom-color: #fadac4; +} +.panel-danger { + border-color: #f0b8c0; +} +.panel-danger > .panel-heading { + color: #d9534f; + background-color: #f9e2e2; + border-color: #f0b8c0; +} +.panel-danger > .panel-heading + .panel-collapse .panel-body { + border-top-color: #f0b8c0; +} +.panel-danger > .panel-footer + .panel-collapse .panel-body { + border-bottom-color: #f0b8c0; +} +.well { + min-height: 20px; + padding: 19px; + margin-bottom: 20px; + background-color: #f5f5f5; + border: 1px solid #e3e3e3; + border-radius: 3px; + -webkit-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-lg { + padding: 24px; + border-radius: 4px; +} +.well-sm { + padding: 9px; + border-radius: 2px; +} +.close { + float: right; + font-size: 21px; + font-weight: bold; + line-height: 1; + 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.5; + filter: alpha(opacity=50); +} +button.close { + padding: 0; + cursor: pointer; + background: transparent; + border: 0; + -webkit-appearance: none; +} +.modal-open { + overflow: hidden; +} +.modal { + display: none; + overflow: auto; + overflow-y: scroll; + position: fixed; + top: 0; + right: 0; + bottom: 0; + left: 0; + z-index: 1050; + -webkit-overflow-scrolling: touch; + outline: 0; +} +.modal.fade .modal-dialog { + -webkit-transform: translate(0, -25%); + -ms-transform: translate(0, -25%); + transform: translate(0, -25%); + -webkit-transition: -webkit-transform 0.3s ease-out; + -moz-transition: -moz-transform 0.3s ease-out; + -o-transition: -o-transform 0.3s ease-out; + transition: transform 0.3s ease-out; +} +.modal.in .modal-dialog { + -webkit-transform: translate(0, 0); + -ms-transform: translate(0, 0); + transform: translate(0, 0); +} +.modal-dialog { + position: relative; + width: auto; + margin: 10px; +} +.modal-content { + position: relative; + background-color: #ffffff; + border: 1px solid #999999; + border: 1px solid rgba(0, 0, 0, 0.2); + border-radius: 4px; + -webkit-box-shadow: 0 3px 9px rgba(0, 0, 0, 0.5); + box-shadow: 0 3px 9px rgba(0, 0, 0, 0.5); + background-clip: padding-box; + outline: none; +} +.modal-backdrop { + position: fixed; + top: 0; + right: 0; + bottom: 0; + left: 0; + z-index: 1040; + background-color: #000000; +} +.modal-backdrop.fade { + opacity: 0; + filter: alpha(opacity=0); +} +.modal-backdrop.in { + opacity: 0.5; + filter: alpha(opacity=50); +} +.modal-header { + padding: 15px; + border-bottom: 1px solid #e5e5e5; + min-height: 16.428571429px; +} +.modal-header .close { + margin-top: -2px; +} +.modal-title { + margin: 0; + line-height: 1.428571429; +} +.modal-body { + position: relative; + padding: 20px; +} +.modal-footer { + margin-top: 15px; + padding: 19px 20px 20px; + text-align: right; + border-top: 1px solid #e5e5e5; +} +.modal-footer .btn + .btn { + margin-left: 5px; + margin-bottom: 0; +} +.modal-footer .btn-group .btn + .btn { + margin-left: -1px; +} +.modal-footer .btn-block + .btn-block { + margin-left: 0; +} +@media (min-width: 768px) { + .modal-dialog { + width: 600px; + margin: 30px auto; + } + .modal-content { + -webkit-box-shadow: 0 5px 15px rgba(0, 0, 0, 0.5); + box-shadow: 0 5px 15px rgba(0, 0, 0, 0.5); + } + .modal-sm { + width: 300px; + } +} +@media (min-width: 992px) { + .modal-lg { + width: 900px; + } +} +.tooltip { + position: absolute; + z-index: 1030; + display: block; + visibility: visible; + font-size: 12px; + line-height: 1.4; + opacity: 0; + filter: alpha(opacity=0); +} +.tooltip.in { + opacity: 0.9; + filter: alpha(opacity=90); +} +.tooltip.top { + margin-top: -3px; + padding: 5px 0; +} +.tooltip.right { + margin-left: 3px; + padding: 0 5px; +} +.tooltip.bottom { + margin-top: 3px; + padding: 5px 0; +} +.tooltip.left { + margin-left: -3px; + padding: 0 5px; +} +.tooltip-inner { + max-width: 200px; + padding: 3px 8px; + color: #ffffff; + text-align: center; + text-decoration: none; + background-color: #000000; + border-radius: 3px; +} +.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-width: 5px 5px 0; + border-top-color: #000000; +} +.tooltip.top-left .tooltip-arrow { + bottom: 0; + left: 5px; + border-width: 5px 5px 0; + border-top-color: #000000; +} +.tooltip.top-right .tooltip-arrow { + bottom: 0; + right: 5px; + border-width: 5px 5px 0; + border-top-color: #000000; +} +.tooltip.right .tooltip-arrow { + top: 50%; + left: 0; + margin-top: -5px; + border-width: 5px 5px 5px 0; + border-right-color: #000000; +} +.tooltip.left .tooltip-arrow { + top: 50%; + right: 0; + margin-top: -5px; + border-width: 5px 0 5px 5px; + border-left-color: #000000; +} +.tooltip.bottom .tooltip-arrow { + top: 0; + left: 50%; + margin-left: -5px; + border-width: 0 5px 5px; + border-bottom-color: #000000; +} +.tooltip.bottom-left .tooltip-arrow { + top: 0; + left: 5px; + border-width: 0 5px 5px; + border-bottom-color: #000000; +} +.tooltip.bottom-right .tooltip-arrow { + top: 0; + right: 5px; + border-width: 0 5px 5px; + border-bottom-color: #000000; +} +.popover { + position: absolute; + top: 0; + left: 0; + z-index: 1010; + display: none; + max-width: 276px; + padding: 1px; + text-align: left; + background-color: #ffffff; + background-clip: padding-box; + border: 1px solid #cccccc; + border: 1px solid rgba(0, 0, 0, 0.2); + border-radius: 4px; + -webkit-box-shadow: 0 5px 10px rgba(0, 0, 0, 0.2); + box-shadow: 0 5px 10px rgba(0, 0, 0, 0.2); + white-space: normal; +} +.popover.top { + margin-top: -10px; +} +.popover.right { + margin-left: 10px; +} +.popover.bottom { + margin-top: 10px; +} +.popover.left { + margin-left: -10px; +} +.popover-title { + margin: 0; + padding: 8px 14px; + font-size: 14px; + font-weight: normal; + line-height: 18px; + background-color: #f7f7f7; + border-bottom: 1px solid #ebebeb; + border-radius: 5px 5px 0 0; +} +.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 { + left: 50%; + margin-left: -11px; + border-bottom-width: 0; + border-top-color: #999999; + border-top-color: rgba(0, 0, 0, 0.25); + bottom: -11px; +} +.popover.top > .arrow:after { + content: " "; + bottom: 1px; + margin-left: -10px; + border-bottom-width: 0; + border-top-color: #ffffff; +} +.popover.right > .arrow { + top: 50%; + left: -11px; + margin-top: -11px; + border-left-width: 0; + border-right-color: #999999; + border-right-color: rgba(0, 0, 0, 0.25); +} +.popover.right > .arrow:after { + content: " "; + left: 1px; + bottom: -10px; + border-left-width: 0; + border-right-color: #ffffff; +} +.popover.bottom > .arrow { + left: 50%; + margin-left: -11px; + border-top-width: 0; + border-bottom-color: #999999; + border-bottom-color: rgba(0, 0, 0, 0.25); + top: -11px; +} +.popover.bottom > .arrow:after { + content: " "; + top: 1px; + margin-left: -10px; + border-top-width: 0; + border-bottom-color: #ffffff; +} +.popover.left > .arrow { + top: 50%; + right: -11px; + margin-top: -11px; + border-right-width: 0; + border-left-color: #999999; + border-left-color: rgba(0, 0, 0, 0.25); +} +.popover.left > .arrow:after { + content: " "; + right: 1px; + border-right-width: 0; + border-left-color: #ffffff; + bottom: -10px; +} +.carousel { + position: relative; +} +.carousel-inner { + position: relative; + overflow: hidden; + width: 100%; +} +.carousel-inner > .item { + display: none; + position: relative; + -webkit-transition: 0.6s ease-in-out left; + transition: 0.6s ease-in-out left; +} +.carousel-inner > .item > img, +.carousel-inner > .item > a > img { + 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: 0; + left: 0; + bottom: 0; + width: 15%; + opacity: 0.5; + filter: alpha(opacity=50); + font-size: 20px; + color: #ffffff; + text-align: center; + text-shadow: 0 1px 2px rgba(0, 0, 0, 0.6); +} +.carousel-control.left { + background-image: -webkit-linear-gradient(left, color-stop(rgba(0, 0, 0, 0.5) 0%), color-stop(rgba(0, 0, 0, 0.0001) 100%)); + background-image: linear-gradient(to right, rgba(0, 0, 0, 0.5) 0%, rgba(0, 0, 0, 0.0001) 100%); + background-repeat: repeat-x; + filter: progid:DXImageTransform.Microsoft.gradient(startColorstr='#80000000', endColorstr='#00000000', GradientType=1); +} +.carousel-control.right { + left: auto; + right: 0; + background-image: -webkit-linear-gradient(left, color-stop(rgba(0, 0, 0, 0.0001) 0%), color-stop(rgba(0, 0, 0, 0.5) 100%)); + background-image: linear-gradient(to right, rgba(0, 0, 0, 0.0001) 0%, rgba(0, 0, 0, 0.5) 100%); + background-repeat: repeat-x; + filter: progid:DXImageTransform.Microsoft.gradient(startColorstr='#00000000', endColorstr='#80000000', GradientType=1); +} +.carousel-control:hover, +.carousel-control:focus { + outline: none; + color: #ffffff; + text-decoration: none; + opacity: 0.9; + filter: alpha(opacity=90); +} +.carousel-control .icon-prev, +.carousel-control .icon-next, +.carousel-control .glyphicon-chevron-left, +.carousel-control .glyphicon-chevron-right { + position: absolute; + top: 50%; + z-index: 5; + display: inline-block; +} +.carousel-control .icon-prev, +.carousel-control .glyphicon-chevron-left { + left: 50%; +} +.carousel-control .icon-next, +.carousel-control .glyphicon-chevron-right { + right: 50%; +} +.carousel-control .icon-prev, +.carousel-control .icon-next { + width: 20px; + height: 20px; + margin-top: -10px; + margin-left: -10px; + font-family: serif; +} +.carousel-control .icon-prev:before { + content: '\2039'; +} +.carousel-control .icon-next:before { + content: '\203a'; +} +.carousel-indicators { + position: absolute; + bottom: 10px; + left: 50%; + z-index: 15; + width: 60%; + margin-left: -30%; + padding-left: 0; + list-style: none; + text-align: center; +} +.carousel-indicators li { + display: inline-block; + width: 10px; + height: 10px; + margin: 1px; + text-indent: -999px; + border: 1px solid #ffffff; + border-radius: 10px; + cursor: pointer; + background-color: #000 \9; + background-color: rgba(0, 0, 0, 0); +} +.carousel-indicators .active { + margin: 0; + width: 12px; + height: 12px; + background-color: #ffffff; +} +.carousel-caption { + position: absolute; + left: 15%; + right: 15%; + bottom: 20px; + z-index: 10; + padding-top: 20px; + padding-bottom: 20px; + color: #ffffff; + text-align: center; + text-shadow: 0 1px 2px rgba(0, 0, 0, 0.6); +} +.carousel-caption .btn { + text-shadow: none; +} +@media screen and (min-width: 768px) { + .carousel-control .glyphicon-chevron-left, + .carousel-control .glyphicon-chevron-right, + .carousel-control .icon-prev, + .carousel-control .icon-next { + width: 30px; + height: 30px; + margin-top: -15px; + margin-left: -15px; + font-size: 30px; + } + .carousel-caption { + left: 20%; + right: 20%; + padding-bottom: 30px; + } + .carousel-indicators { + bottom: 20px; + } +} +.clearfix:before, +.clearfix:after, +.container:before, +.container:after, +.container-fluid:before, +.container-fluid:after, +.row:before, +.row:after, +.form-horizontal .form-group:before, +.form-horizontal .form-group:after, +.btn-toolbar:before, +.btn-toolbar:after, +.btn-group-vertical > .btn-group:before, +.btn-group-vertical > .btn-group:after, +.nav:before, +.nav:after, +.navbar:before, +.navbar:after, +.navbar-header:before, +.navbar-header:after, +.navbar-collapse:before, +.navbar-collapse:after, +.pager:before, +.pager:after, +.panel-body:before, +.panel-body:after, +.modal-footer:before, +.modal-footer:after { + content: " "; + display: table; +} +.clearfix:after, +.container:after, +.container-fluid:after, +.row:after, +.form-horizontal .form-group:after, +.btn-toolbar:after, +.btn-group-vertical > .btn-group:after, +.nav:after, +.navbar:after, +.navbar-header:after, +.navbar-collapse:after, +.pager:after, +.panel-body:after, +.modal-footer:after { + clear: both; +} +.center-block { + display: block; + margin-left: auto; + margin-right: auto; +} +.pull-right { + float: right !important; +} +.pull-left { + float: left !important; +} +.hide { + display: none !important; +} +.show { + display: block !important; +} +.invisible { + visibility: hidden; +} +.text-hide { + font: 0/0 a; + color: transparent; + text-shadow: none; + background-color: transparent; + border: 0; +} +.hidden { + display: none !important; + visibility: hidden !important; +} +.affix { + position: fixed; +} +@-ms-viewport { + width: device-width; +} +.visible-xs, +.visible-sm, +.visible-md, +.visible-lg { + display: none !important; +} +@media (max-width: 767px) { + .visible-xs { + display: block !important; + } + table.visible-xs { + display: table; + } + tr.visible-xs { + display: table-row !important; + } + th.visible-xs, + td.visible-xs { + display: table-cell !important; + } +} +@media (min-width: 768px) and (max-width: 991px) { + .visible-sm { + display: block !important; + } + table.visible-sm { + display: table; + } + tr.visible-sm { + display: table-row !important; + } + th.visible-sm, + td.visible-sm { + display: table-cell !important; + } +} +@media (min-width: 992px) and (max-width: 1199px) { + .visible-md { + display: block !important; + } + table.visible-md { + display: table; + } + tr.visible-md { + display: table-row !important; + } + th.visible-md, + td.visible-md { + display: table-cell !important; + } +} +@media (min-width: 1200px) { + .visible-lg { + display: block !important; + } + table.visible-lg { + display: table; + } + tr.visible-lg { + display: table-row !important; + } + th.visible-lg, + td.visible-lg { + display: table-cell !important; + } +} +@media (max-width: 767px) { + .hidden-xs { + display: none !important; + } +} +@media (min-width: 768px) and (max-width: 991px) { + .hidden-sm { + display: none !important; + } +} +@media (min-width: 992px) and (max-width: 1199px) { + .hidden-md { + display: none !important; + } +} +@media (min-width: 1200px) { + .hidden-lg { + display: none !important; + } +} +.visible-print { + display: none !important; +} +@media print { + .visible-print { + display: block !important; + } + table.visible-print { + display: table; + } + tr.visible-print { + display: table-row !important; + } + th.visible-print, + td.visible-print { + display: table-cell !important; + } +} +@media print { + .hidden-print { + display: none !important; + } +} diff --git a/share/nitdoc/css/nitdoc.css b/share/nitdoc/css/nitdoc.css new file mode 100644 index 0000000..77c96be --- /dev/null +++ b/share/nitdoc/css/nitdoc.css @@ -0,0 +1,266 @@ +body { + text-align: justify; +} + +a:hover { + text-decoration: none; +} + +ul li .label { + padding: 1px 4px; + font-size: 70%; + vertical-align: middle; + border-radius: .25em; + margin: 3px; + font-family: monospace; +} + +#sidebar .panel { + margin-bottom: 10px; + color: #666; + box-shadow: none; +} + +#sidebar .panel a { + color: #666; +} + +#sidebar .panel a:hover { + color: #333; +} + +#sidebar .panel-heading { + padding: 3px 0 0 0; + font-size: 16px; +} + +#sidebar .panel-body { + padding: 0; +} + +#sidebar .panel-body ul>li>a { + padding: 0; +} + +#sidebar .panel-body ul>li { + padding: 0 0 0 15px; + font-size: 15px; +} + +#sidebar .panel-body ul ul>li { + padding: 0 0 0 30px; + font-size: 14px; +} + +#sidebar .panel-body ul .list-labeled>li { + padding: 0 0 0 10px; + font-size: 14px; +} + +#sidebar .panel-body ul ul ul>li { + padding: 0 0 0 45px; + font-size: 13px; +} + +#sidebar .panel-heading a:hover, #sidebar .panel ul a:hover { + color: #0d8921; + background-color: transparent; +} + +#content { + position: fixed; + top: 30px; + bottom: 0; + left: 10px; + right: 15px; +} + +#content>.col { + height: 100%; + overflow: hidden; +} + +#content>.col:hover { + overflow-y: scroll; +} + +#content>.col::-webkit-scrollbar { + width: 7px; + height: 7px; +} + +#content>.col::-webkit-scrollbar-thumb { + background: #CCC; + -webkit-box-shadow: inset 1px 1px 0 rgba(0,0,0,0.10),inset 0 -1px 0 rgba(0,0,0,0.07); +} + +#content>.col::-webkit-scrollbar-thumb:hover { + background: #999; +} + +#content>.col::-webkit-scrollbar-corner { + background: transparent; +} + +#content>.col::-webkit-scrollbar-button { + width: 0; + height: 0; + display: none; +} + +#content article { + padding: 10px 0px; +} + +#content article:target { + padding-left: 10px; + margin-left: -10px; + border-left: 2px solid #0d8921; +} + +.footer { + padding: 10px; + margin: 20px 0; +} + +.subtitle { + margin-bottom: 25px; +} + +.signature span.glyphicon { + margin: 0 10px 5px 0; + font-size: 55%; + vertical-align: middle; +} + +.signature a, .list-definition a { + color: #0d8921; +} + +.info { + color: #888; +} + +.info a { + color: #666; +} + +.info a:hover { + color: #333; +} + +.graph { + text-align: center; +} + +.synopsys { + margin: 5px 0; + font-size: 16px; + font-weight: bold; + line-height: 1.4; +} + +.public { + color: #5cb85c; +} + +.protected { + color: #f0ad4e; +} + +.private { + color: #a94442; +} + +.nitcode a { color: inherit; text-decoration: inherit; } /* hide links */ +.nitcode a:hover { text-decoration: underline; } /* underline links */ +.nitcode span[title]:hover { text-decoration: underline; } /* underline titles */ +/* lexical raw tokens. independent of usage or semantic: */ +.nitcode .nc_c { color: gray; font-style: italic; } /* comment */ +.nitcode .nc_d { color: #3D8127; font-style: italic; } /* documentation comments */ +.nitcode .nc_k { font-weight: bold; } /* keyword */ +.nitcode .nc_o {} /* operator */ +.nitcode .nc_i {} /* standard identifier */ +.nitcode .nc_t { color: #445588; font-weight: bold; } /* type/class identifier */ +.nitcode .nc_a { color: #445588; font-style: italic; } /* old style attribute identifier */ +.nitcode .nc_l { color: #009999; } /* char and number literal */ +.nitcode .nc_s { color: #8F1546; } /* string literal */ +/* syntactic token usage. added because of their position in the AST */ +.nitcode .nc_ast { color: blue; } /* assert label */ +.nitcode .nc_la { color: blue; } /* break/continue label */ +.nitcode .nc_m { color: #445588; } /* module name */ +/* syntactic groups */ +.nitcode .nc_def { font-weight: bold; color: blue; } /* name used in a definition */ +.nitcode .nc_def.nc_a { color: blue; } /* name used in a attribute definition */ +.nitcode .nc_def.nc_t { color: blue; } /* name used in a class or vt definition */ +.nitcode .nc_ss { color: #9E6BEB; } /* superstrings */ +.nitcode .nc_cdef {} /* A whole class definition */ +.nitcode .nc_pdef {} /* A whole property definition */ +/* semantic token usage */ +.nitcode .nc_v { font-style: italic; } /* local variable or parameter */ +.nitcode .nc_vt { font-style: italic; } /* virtual type or formal type */ + +.nitcode .nc_error { border: 1px red solid;} /* not used */ + + +#sidebar .summary .nav>li>a { + padding: 2px 0 0 15px; + font-size: 15px; + border-left: 2px solid transparent; +} + +#sidebar .summary .nav .nav>li>a { + padding: 2px 0 0 30px; + font-size: 14px; + border-left: 2px solid transparent; +} + +#sidebar .summary .nav .nav .nav>li>a { + padding: 1px 0 0 45px; + font-size: 13px; +} + +#sidebar .summary .nav .nav .nav .nav>li>a { + padding: 1px 0 0 60px; + font-size: 12px; +} + +#sidebar .summary .nav>.active>a, +#sidebar .summary .nav>.active>a:hover, +#sidebar .summary .nav>li>a:hover { + color: #0d8921; + background-color: transparent; +} + +#sidebar .summary .nav>.active>a, +#sidebar .summary .nav .nav>.active>a, +#sidebar .summary .nav .nav>.active>a:hover { + color: #0d8921; + border-left: 2px solid #0d8921; + margin-left: 0px; +} + +#sidebar .summary .nav .nav>li>a:hover { + color: #0d8921; + border-left: 1px solid #0d8921; + margin-left: 1px; + background-color: transparent; +} + +.label:empty { + display:inline; +} + +.label.intro:before { + content: "I"; +} +.label.redef:before { + content: "R"; +} +.label.inherit:before { + content: "H"; +} + +.list-definition .list-definition { + margin-left: 30px; +} diff --git a/share/nitdoc/js/nitdoc.js b/share/nitdoc/js/nitdoc.js index 73d33a4..0c90d58 100644 --- a/share/nitdoc/js/nitdoc.js +++ b/share/nitdoc/js/nitdoc.js @@ -9,18 +9,17 @@ require.config({ quicksearchList: searchList, jQueryUI: "jquery-ui", }, - shim: { + /*shim: { "jQueryUI": { export: "$", deps: ['jquery'] } - } + }*/ }); // nitdoc main module define([ - "plugins/folding", - "plugins/filtering", + //"plugins/filtering", "plugins/quicksearch", "plugins/github", ], function() {}); diff --git a/share/nitdoc/js/plugins/folding.js b/share/nitdoc/js/plugins/folding.js deleted file mode 100644 index 9d58e3b..0000000 --- a/share/nitdoc/js/plugins/folding.js +++ /dev/null @@ -1,66 +0,0 @@ -/* This file is part of NIT ( http://www.nitlanguage.org ). - - 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. - - Documentation generator for the nit language. - Generate API documentation in HTML format from nit source code. -*/ - -/* - * Nitdoc Folding - * - * Allow user to fold sidebar blocks - */ -define([ - 'jquery', - 'jQueryUI' -], function($) { - $.widget("nitdoc.folding", { - - options: { - foldText: "-", - unfoldText: "+", - linkHolder: "h3", - linkClass: "nitdoc-ui-fold", - linkCSS: { - "cursor": "pointer" - } - }, - - _create: function() { - this._foldLink = $("") - .addClass(this.options.linkClass) - .text(this.options.foldText); - - this.element.find(this.options.linkHolder) - .prepend(this._foldLink) - .css(this.options.linkCSS) - .toggle( - $.proxy(this._fold, this), - $.proxy(this._unfold, this) - ); - }, - - _fold: function(event) { - this._foldLink.text(this.options.unfoldText); - this.element.find(this.options.linkHolder).nextAll().toggle(); - }, - - _unfold: function() { - this._foldLink.text(this.options.foldText); - this.element.find(this.options.linkHolder).nextAll().toggle(); - } - }); - - $(".sidebar nav").folding(); -}); diff --git a/share/nitdoc/js/plugins/github.js b/share/nitdoc/js/plugins/github.js index 84ad4f2..c77c0d0 100644 --- a/share/nitdoc/js/plugins/github.js +++ b/share/nitdoc/js/plugins/github.js @@ -46,11 +46,21 @@ define([ this.origin = this._parseUpstream(upstream); this._initMarked(); // Add github menu - $("nav.main ul").append( - $("
  • ") - .attr("id", "nitdoc-github-li") + $("#topmenu>.container-fluid").append( + $("") + .attr({ + "id": "nitdoc-github-li", + "type": "button", + "class": "navbar-btn navbar-right btn-link", + "href": "#", + "data-container": "body", + "data-toggle": "popover", + "data-placement": "bottom", + "data-content": "bottom", + "data-html": "true", + }) .loginbox() - .loginbox("displayLogin") + //.loginbox("displayLogin") .bind("loginbox_logoff", function() { GithubUI.disactivate(); }) @@ -124,7 +134,7 @@ define([ .modalbox("open"); } else if(isok == "error:sha") { $("

    ") - .text("The provided Github repository must contain the base commit '" + UI.origin.sha + "'.") + .text("The provided Github repository must contain the base commit '" + this.origin.sha + "'.") .modalbox({ title: "Github base commit error", isError: true diff --git a/share/nitdoc/js/plugins/github/loginbox.js b/share/nitdoc/js/plugins/github/loginbox.js index 119b5e8..55fbffe 100644 --- a/share/nitdoc/js/plugins/github/loginbox.js +++ b/share/nitdoc/js/plugins/github/loginbox.js @@ -40,16 +40,16 @@ define([ _create: function() { this.element.append( - $("") - .append( - $("") - .attr({ - src: this.options.icon, - alt: this.options.iconAlt - }) - .addClass("nitdoc-github-li-img") - ) - .click($.proxy(this.toggle, this)) + $("") + .addClass("glyphicon glyphicon-off") + //.click($.proxy(this.toggle, this)) + .attr({ + "data-container": "body", + "data-toggle": "popover", + "data-placement": "bottom", + "data-content": "bottom", + "data-html": "true", + }) ); this.content = $("

    "); @@ -133,56 +133,77 @@ define([ $("
    ") .keyup($.proxy(this._doFormChange, this)) .append( - $("