diff --git a/CNAME b/CNAME new file mode 100644 index 0000000..3fb9a64 --- /dev/null +++ b/CNAME @@ -0,0 +1 @@ +apiblueprint.org diff --git a/developers.html b/developers.html new file mode 100644 index 0000000..2402d72 --- /dev/null +++ b/developers.html @@ -0,0 +1,279 @@ + + + + + + + + Developing tools for API Blueprint | API Blueprint + + + + + + + + + +
+
+
+ + +
+ +
+ + + + +
+
+ +
+ + +

API Blueprint can be consumed via an API Blueprint parser which outputs API Elements which can be processed.

+ + + +

API Elements

+ +

The API Elements is format use recommended format to consume API Blueprint, it supersedes the now deprecated API Blueprint AST.

+ +

For example, an HTTP Response can be expressed in API Elements using the following:

+
{
+  "element": "httpResponse",
+  "attributes": {
+    "statusCode": 200
+  },
+  "content": [
+    {
+      "element": "asset",
+      "attributes": {
+        "contentType": "text/plain"
+      },
+      "content": "Hello World"
+    }
+  ]
+}
+
+

API Elements are built on top of Refract. Refract is a versatile format for recursive structures. Its constructed of many element types which act as building blocks for building data structures and descriptions.

+ +

Every Refract element may have 4 attributes, the element name, Refract specific metadata, attributes specified by the element type, and a content value holding the content for the specific element.

+ +

NOTE: There are various tools for consuming Refract in JavaScript such as Fury and minim.

+ +

Parsing API Blueprint

+ +

Using the command line tool

+ +
    +
  1. +

    Get Drafter command line tool, for macOS using Homebrew:

    +
    $ brew install drafter
    +
    +

    See our installation instructions for other platforms

    +
  2. +
  3. +

    Parse API Blueprint into the Refract API Description namespace:

    +
    $ cat << 'EOF' | drafter --format json
    +# GET /message
    ++ Response 200 (text/plain)
    +
    +        Hello World!
    +EOF
    +{
    +  "element": "parseResult",
    +  "content": [
    +    {
    +      "element": "category",
    +
    + ...
    +
    +
  4. +
+ +

Using the API Blueprint parsing service

+ +

You can use the API Blueprint parsing service, full API documentation for the service can be found on Apiary.

+
$ curl -X POST
+    --header "Content-Type: text/vnd.apiblueprint" \
+    --header "Accept: application/vnd.refract.parse-result+json" \
+    --data-binary "# My API Blueprint" \
+    https://api.apiblueprint.org/parser
+{"element":"parseResult","content":[{"element":"category","meta":{"classes":["api"],"title":"My API Blueprint"},"content":[]}]}
+
+

Using a parser binding (Node.js)

+ +
    +
  1. +

    Install binding for your language (e.g. Drafter NPM for Node.js)

    +
    $ npm install drafter
    +
    +
  2. +
  3. +

    Parse your API Blueprint into Refract

    +
    var drafter = require('drafter');
    +
    +var blueprint = '''
    +# GET /message
    ++ Response 200 (text/plain)
    +
    +        Hello World!
    +''';
    +
    +protagonist.parse(blueprint, function(error, result) {
    +    ...
    +});
    +
    +
  4. +
+ +

Using drafter.js (Pure JavaScript parser)

+ +

drafter.js is a pure JavaScript version of the drafter library designed to work in web browsers. It exposes a single parse function which takes an API Blueprint string and options and returns the Refract Parse Result.

+ +
    +
  1. +

    Install drafter.js

    + +

    You may also download drafter.js from the releases page and reference it in HTML.

    +
    <script src="./drafter.js"></script>
    +<script src="./drafter.js.mem"></script>
    +
    +
  2. +
  3. +

    Parse your API Blueprint into Refract

    +
    var blueprint = '''
    +# GET /message
    ++ Response 200 (text/plain)
    +
    +        Hello World!
    +''';
    +
    +try {
    +  var res = drafter.parse(blueprint, {exportSourcemap: true});
    +  console.log(res);
    +} catch (err) {
    +  console.log(err);
    +}
    +
    +
  4. +
+ +

Using the native parser interface (C/C++)

+ +
    +
  1. Install Drafter +
  2. +
  3. +

    Parse your API Blueprint

    +
    #include <drafter/drafter.h>
    +
    +const char *blueprint =
    +  "# My API\n"
    +  "## GET /message\n"
    +  "+ Response 200 (text/plain)\n"
    +  "\n"
    +  "      Hello World!\n";
    +
    +drafter_parse_options* pOpts = drafter_init_parse_options();
    +drafter_set_name_required(pOpts);
    +
    +drafter_serialize_options* sOpts = drafter_init_serialize_options();
    +drafter_set_format(sOpts, DRAFTER_SERIALIZE_JSON);
    +
    +char *result = NULL;
    +if (DRAFTER_OK == drafter_parse_blueprint_to(blueprint, &result, pOpts, sOpts)) {
    +    printf("%s\n", result);
    +    free(result);
    +}
    +
    +

    Please see Drafter for full API documentation.

    +
  4. +
+ + +
+ + + +
+
+ + + + + + diff --git a/documentation/advanced-tutorial.html b/documentation/advanced-tutorial.html new file mode 100644 index 0000000..8f90416 --- /dev/null +++ b/documentation/advanced-tutorial.html @@ -0,0 +1,282 @@ + + + + + + + + API Blueprint Advanced Tutorial | API Blueprint + + + + + + + + + +
+
+
+ + +
+ +
+ + + + +
+
+ +
+
+ +
+

API Blueprint Advanced Tutorial

+ + +

Welcome to the advanced API Blueprint tutorial! This tutorial will take you +through advanced topics like JSON Schema, request and response attributes, data +structures and relation types.

+ +

This tutorial assumes that you have read the API Blueprint Tutorial.

+ +

JSON Schema

+ +

Action request and response bodies can have associated schemas that describe +the allowed structure of the body content. JSON bodies are typically described +with JSON Schema. Given a simple JSON response body +we can describe the structure of the response with JSON Schema in a + Schema +section.

+ +

The schema can describe the type of each member, which members are required, +default values, and support a number of other advanced features. Below is an +example, taken from the +Polls API +blueprint:

+
### Create a New Question [POST]
+You may create your own question using this action. It takes a JSON object
+containing a question and a collection of answers in the form of choices.
+
++ Request (application/json)
+
+    + Body
+
+            {
+              "question": "Favourite language?"
+              "choices": [
+                "Swift",
+                "Objective-C"
+              ]
+            }
+
+    + Schema
+
+            {
+              "$schema": "http://json-schema.org/draft-04/schema#",
+              "type": "object",
+              "properties": {
+                "question": {
+                  "type": "string"
+                },
+                "choices": {
+                  "type": "array",
+                  "items": {
+                    "type": "string"
+                  },
+                  "minItems": 2
+                }
+              }
+            }
+
+

Attributes

+ +

Another way of describing examples and the structure of your request and +response content is by using MSON. +MSON, like API Blueprint, allows you to use human-readable plain text to +describe things rather than formats designed for computer parsing like JSON or +YAML. Where API Blueprint allows you to describe your API, MSON allows you to +describe data structures.

+ +

MSON can be added to resources, actions, and individual requests or responses +via an + Attributes section.

+ +

Creating a new question in the polls API can be modeled using MSON:

+
### Create a New Question [POST]
+You may create your own question using this action. It takes a JSON object
+containing a question and a collection of answers in the form of choices.
+
++ Request (application/json)
+
+    + Attributes
+
+        + question: Favourite Language? (required)
+        + choices: Swift, `Objective-C` (array, required)
+
+
+

When the above blueprint is parsed it will have a JSON body and JSON Schema +example generated for it from the MSON attributes. Note, however, that the +generated JSON Schema may differ from a hand-written one. In this example, the +minItems will not be set. If you have such constraints you can override the +generated schema by providing your own, in which case only the JSON body will +be generated.

+ +

Data Structures

+ +

Once you start using MSON, you may find yourself wanting to reuse certain +commonly used or nested data structure components. This is possible with the +## Data Structures section. Attributes sections can then reference the data +structures defined in the Data Structures or other resource sections by name.

+ +

For example, using the polls API question collection resource, we can split out +the Question and Choice objects:

+
### List All Questions [GET]
++ Response 200 (application/json)
+
+    + Attributes (array[Question])
+
+## Data Structures
+
+### Question
++ question: Favourite programming language? (required)
++ published_at: `2014-11-11T08:40:51.620Z` (required)
++ url: /questions/1 (required)
++ choices (array[Choice], required)
+
+### Choice
++ choice: Javascript (required)
++ url: /questions/1/choices/1 (required)
++ votes: 2048 (number, required)
+
+
+

Relation Types

+ +

Actions in a blueprint can define a semantic domain-specific meaning by +defining a relation type using a + Relation section. This means that an +action can have a specific meaning regardless of its URI or name, and allows +clients to be built based on the domain of the API rather than specific URIs.

+ +

For example, in the polls API:

+
## Question [/question/{id}]
+### View a Question Detail [GET]
++ Relation: self
+
+### Delete a Question [DELETE]
++ Relation: delete
+
+## Questions Collection [/questions]
+### List All Questions [GET]
++ Relation: self
+
+

A server or client implementation can now use this information to handle the +specific API resource and action URIs. Please see the +Web Linking RFC 5988 and the +IANA Link Relation Types for +more information.

+ +

Conclusion

+ +

This tutorial has covered some advanced API Blueprint topics. +For more in-depth information and other advanced topics, +please see the API Blueprint Specification.

+ + +
+
+
+ + + +
+
+ + + + + + diff --git a/documentation/examples/01-simplest-api.html b/documentation/examples/01-simplest-api.html new file mode 100644 index 0000000..58af800 --- /dev/null +++ b/documentation/examples/01-simplest-api.html @@ -0,0 +1,160 @@ + + + + + + + + 01. Simplest API | API Blueprint + + + + + + + + + +
+
+
+ + +
+ +
+ + + + +
+
+ +
+
+ +
+

01. Simplest API

+ +
FORMAT: 1A
+
+# The Simplest API
+This is one of the simplest APIs written in the **API Blueprint**. One plain
+resource combined with a method and that's it! We will explain what is going on
+in the next installment - 
+[Resource and Actions](02.%20Resource%20and%20Actions.md).
+
+**Note:** As we progress through the examples, do not also forget to view the
+[Raw](https://raw.github.com/apiaryio/api-blueprint/master/examples/01.%20Simplest%20API.md)
+code to see what is really going on in the API Blueprint, as opposed to just
+seeing the output of the Github Markdown parser.
+
+Also please keep in mind that every single example in this course is a **real
+API Blueprint** and as such you can **parse** it with the 
+[API Blueprint parser](https://github.com/apiaryio/drafter) or one of its
+[bindings](https://github.com/apiaryio/drafter#bindings).
+
+
+# GET /message
++ Response 200 (text/plain)
+
+        Hello World!
+
+ +
+
+
+ + + +
+
+ + + + + + diff --git a/documentation/examples/02-resource-and-actions.html b/documentation/examples/02-resource-and-actions.html new file mode 100644 index 0000000..842059e --- /dev/null +++ b/documentation/examples/02-resource-and-actions.html @@ -0,0 +1,176 @@ + + + + + + + + 02. Resource and Actions | API Blueprint + + + + + + + + + +
+
+
+ + +
+ +
+ + + + +
+
+ +
+
+ +
+

02. Resource and Actions

+ +
FORMAT: 1A
+
+# Resource and Actions API
+This API example demonstrates how to define a resource with multiple actions.
+
+
+# /message
+This is our [resource](http://www.w3.org/TR/di-gloss/#def-resource). It is
+defined by its
+[URI](http://www.w3.org/TR/di-gloss/#def-uniform-resource-identifier) or, more
+precisely, by its [URI Template](http://tools.ietf.org/html/rfc6570).
+
+This resource has no actions specified but we will fix that soon.
+
+## GET
+Here we define an action using the `GET` [HTTP request method](http://www.w3schools.com/tags/ref_httpmethods.asp) for our resource `/message`.
+
+As with every good action it should return a
+[response](http://www.w3.org/TR/di-gloss/#def-http-response). A response always
+bears a status code. Code 200 is great as it means all is green. Responding
+with some data can be a great idea as well so let's add a plain text message to
+our response.
+
++ Response 200 (text/plain)
+
+        Hello World!
+
+## PUT
+OK, let's add another action. This time to put new data to our resource
+(essentially an update action). We will need to send something in a
+[request](http://www.w3.org/TR/di-gloss/#def-http-request) and then send a
+response back confirming the posting was a success (_HTTP Status Code 204 ~
+Resource updated successfully, no content is returned_).
+
++ Request (text/plain)
+
+        All your base are belong to us.
+
++ Response 204
+
+ +
+
+
+ + + +
+
+ + + + + + diff --git a/documentation/examples/03-named-resource-and-actions.html b/documentation/examples/03-named-resource-and-actions.html new file mode 100644 index 0000000..7709ece --- /dev/null +++ b/documentation/examples/03-named-resource-and-actions.html @@ -0,0 +1,164 @@ + + + + + + + + 03. Named Resource and Actions | API Blueprint + + + + + + + + + +
+
+
+ + +
+ +
+ + + + +
+
+ +
+
+ +
+

03. Named Resource and Actions

+ +
FORMAT: 1A
+
+# Named Resource and Actions API
+This API example demonstrates how to name a resource and its actions, to give
+the reader a better idea about what the resource is used for.
+
+
+# My Message [/message]
+OK, `My Message` probably isn't the best name for our resource but it will do
+for now. Note the URI `/message` is enclosed in square brackets.
+
+## Retrieve a Message [GET]
+Now this is informative! No extra explanation needed here. This action clearly
+retrieves the message.
+
++ Response 200 (text/plain)
+
+        Hello World!
+
+## Update a Message [PUT]
+`Update a message` - nice and simple naming is the best way to go.
+
++ Request (text/plain)
+
+        All your base are belong to us.
+
++ Response 204
+
+ +
+
+
+ + + +
+
+ + + + + + diff --git a/documentation/examples/04-grouping-resources.html b/documentation/examples/04-grouping-resources.html new file mode 100644 index 0000000..81ec069 --- /dev/null +++ b/documentation/examples/04-grouping-resources.html @@ -0,0 +1,176 @@ + + + + + + + + 04. Grouping Resources | API Blueprint + + + + + + + + + +
+
+
+ + +
+ +
+ + + + +
+
+ +
+
+ +
+

04. Grouping Resources

+ +
FORMAT: 1A
+
+# Grouping Resources API
+This API example demonstrates how to group resources and form **groups of
+resources**. You can create as many or as few groups as you like. If you do not
+create any group all your resources will be part of an "unnamed" group.
+
+
+# Group Messages
+Group of all messages-related resources.
+
+This is the first group of resources in this document. It is **recognized** by
+the **keyword `group`** and its name is `Messages`.
+
+Any following resource definition is considered to be a part of this group
+until another group is defined. It is **customary** to increase header level of
+resources (and actions) nested under a resource.
+
+## My Message [/message]
+
+### Retrieve a Message [GET]
+
++ Response 200 (text/plain)
+
+        Hello World!
+
+### Update a Message [PUT]
+
++ Request (text/plain)
+
+        All your base are belong to us.
+
++ Response 204
+
+# Group Users
+Group of all user-related resources.
+
+This is the second group in this blueprint. For now, no resources were defined
+here and as such we will omit it from the next installment of this course.
+
+ +
+
+
+ + + +
+
+ + + + + + diff --git a/documentation/examples/05-responses.html b/documentation/examples/05-responses.html new file mode 100644 index 0000000..8593a51 --- /dev/null +++ b/documentation/examples/05-responses.html @@ -0,0 +1,185 @@ + + + + + + + + 05. Responses | API Blueprint + + + + + + + + + +
+
+
+ + +
+ +
+ + + + +
+
+ +
+
+ +
+

05. Responses

+ +
FORMAT: 1A
+
+# Responses API
+In this API example we will discuss what information a response can bear and
+how to define multiple responses. Technically a response is represented by a
+payload that is sent back in response to a request.
+
+
+# Group Messages
+Group of all messages-related resources.
+
+## My Message [/message]
+
+### Retrieve a Message [GET]
+This action has **two** responses defined: One returning plain text and the
+other a JSON representation of our resource. Both have the same HTTP status
+code. Also both responses bear additional information in the form of a custom
+HTTP header. Note that both responses have set the `Content-Type` HTTP header
+just by specifying `(text/plain)` or `(application/json)` in their respective
+signatures.
+
++ Response 200 (text/plain)
+
+    + Headers
+
+            X-My-Message-Header: 42
+
+    + Body
+
+            Hello World!
+
++ Response 200 (application/json)
+
+    + Headers
+
+            X-My-Message-Header: 42
+
+    + Body
+
+            { "message": "Hello World!" }
+
+### Update a Message [PUT]
+
++ Request (text/plain)
+
+        All your base are belong to us.
+
++ Response 204
+
+ +
+
+
+ + + +
+
+ + + + + + diff --git a/documentation/examples/06-requests.html b/documentation/examples/06-requests.html new file mode 100644 index 0000000..296af0b --- /dev/null +++ b/documentation/examples/06-requests.html @@ -0,0 +1,200 @@ + + + + + + + + 06. Requests | API Blueprint + + + + + + + + + +
+
+
+ + +
+ +
+ + + + +
+
+ +
+
+ +
+

06. Requests

+ +
FORMAT: 1A
+
+# Requests API
+Following the [Responses](05.%20Responses.md) example, this API will show you
+how to define multiple requests and what data these requests can bear. Let's
+demonstrate multiple requests on a trivial example of content negotiation.
+
+
+# Group Messages
+Group of all messages-related resources.
+
+## My Message [/message]
+
+### Retrieve a Message [GET]
+In API Blueprint, _requests_ can hold exactly the same kind of information and
+can be described using exactly the same structure as _responses_, only with
+different signature – using the `Request` keyword. The string that follows
+after the `Request` keyword is a request identifier. Again, using explanatory
+and simple naming is the best way to go.
+
++ Request Plain Text Message
+
+    + Headers
+
+            Accept: text/plain
+
++ Response 200 (text/plain)
+
+    + Headers
+
+            X-My-Message-Header: 42
+
+    + Body
+
+            Hello World!
+
++ Request JSON Message
+
+    + Headers
+
+            Accept: application/json
+
++ Response 200 (application/json)
+
+    + Headers
+
+            X-My-Message-Header: 42
+
+    + Body
+
+            { "message": "Hello World!" }
+
+### Update a Message [PUT]
+
++ Request Update Plain Text Message (text/plain)
+
+        All your base are belong to us.
+
++ Request Update JSON Message (application/json)
+
+        { "message": "All your base are belong to us." }
+
++ Response 204
+
+ +
+
+
+ + + +
+
+ + + + + + diff --git a/documentation/examples/07-parameters.html b/documentation/examples/07-parameters.html new file mode 100644 index 0000000..7572db5 --- /dev/null +++ b/documentation/examples/07-parameters.html @@ -0,0 +1,241 @@ + + + + + + + + 07. Parameters | API Blueprint + + + + + + + + + +
+
+
+ + +
+ +
+ + + + +
+
+ +
+
+ +
+

07. Parameters

+ +
FORMAT: 1A
+
+# Parameters API
+In this installment of the API Blueprint course we will discuss how to describe URI parameters.
+
+But first let's add more messages to our system. For that we would need
+introduce an message identifier – id. This id will be our parameter when
+communicating with our API about messages.
+
+
+# Group Messages
+Group of all messages-related resources.
+
+## My Message [/message/{id}]
+Here we have added the message `id` parameter as an 
+[URI Template variable](http://tools.ietf.org/html/rfc6570) in the Message
+resource's URI. Note the parameter name `id` is enclosed in curly brackets. We
+will discuss this parameter in the `Parameters` section below, where we will
+also set its example value to `1` and declare it of an arbitrary 'number' type.
+
++ Parameters
+
+    + id: 1 (number) - An unique identifier of the message.
+
+### Retrieve a Message [GET]
+
++ Request Plain Text Message
+
+    + Headers
+
+            Accept: text/plain
+
++ Response 200 (text/plain)
+
+    + Headers
+
+            X-My-Message-Header: 42
+
+    + Body
+
+            Hello World!
+
++ Request JSON Message
+
+    + Headers
+
+            Accept: application/json
+
++ Response 200 (application/json)
+
+    + Headers
+
+            X-My-Message-Header: 42
+
+    + Body
+
+            {
+              "id": 1,
+              "message": "Hello World!"
+            }
+
+### Update a Message [PUT]
+
++ Request Update Plain Text Message (text/plain)
+
+        All your base are belong to us.
+
++ Request Update JSON Message (application/json)
+
+        { "message": "All your base are belong to us." }
+
++ Response 204
+
+## All My Messages [/messages{?limit}]
+A resource representing all of my messages in the system.
+
+We have added the query URI template parameter - `limit`. This parameter is
+used for limiting the number of results returned by some actions on this
+resource. It does not affect every possible action of this resource, therefore
+we will discuss it only at the particular action level below.
+
+### Retrieve all Messages [GET]
+
++ Parameters
+
+    + limit (number, optional) - The maximum number of results to return.
+        + Default: `20`
+
++ Response 200 (application/json)
+
+        [
+          {
+            "id": 1,
+            "message": "Hello World!"
+          },
+          {
+            "id": 2,
+            "message": "Time is an illusion. Lunchtime doubly so."
+          },
+          {
+            "id": 3,
+            "message": "So long, and thanks for all the fish."
+          }
+        ]
+
+ +
+
+
+ + + +
+
+ + + + + + diff --git a/documentation/examples/08-attributes.html b/documentation/examples/08-attributes.html new file mode 100644 index 0000000..7670304 --- /dev/null +++ b/documentation/examples/08-attributes.html @@ -0,0 +1,178 @@ + + + + + + + + 08. Attributes | API Blueprint + + + + + + + + + +
+
+
+ + +
+ +
+ + + + +
+
+ +
+
+ +
+

08. Attributes

+ +
FORMAT: 1A
+
+# Attributes API
+This API example demonstrates how to describe body attributes of a request or
+response message.
+
+In this case, the description is complementary (and duplicate!) to the provided
+JSON example in the body section. The 
+[Advanced Attributes](09.%20Advanced%20Attributes.md) API example will
+demonstrate how to avoid duplicates and how to reuse attribute descriptions.
+
+
+# Group Coupons
+
+## Coupon [/coupons/{id}]
+A coupon contains information about a percent-off or amount-off discount you
+might want to apply to a customer.
+
+### Retrieve a Coupon [GET]
+Retrieves the coupon with the given ID.
+
++ Response 200 (application/json)
+
+    + Attributes (object)
+        + id: 250FF (string, required)
+        + created: 1415203908 (number) - Time stamp
+        + percent_off: 25 (number)
+
+            A positive integer between 1 and 100 that represents the discount
+            the coupon will apply.
+
+        + redeem_by (number) - Date after which the coupon can no longer be redeemed
+
+    + Body
+
+            {
+                "id": "250FF",
+                "created": 1415203908,
+                "percent_off": 25,
+                "redeem_by": null
+            }
+
+ +
+
+
+ + + +
+
+ + + + + + diff --git a/documentation/examples/09-advanced-attributes.html b/documentation/examples/09-advanced-attributes.html new file mode 100644 index 0000000..267b847 --- /dev/null +++ b/documentation/examples/09-advanced-attributes.html @@ -0,0 +1,214 @@ + + + + + + + + 09. Advanced Attributes | API Blueprint + + + + + + + + + +
+
+
+ + +
+ +
+ + + + +
+
+ +
+
+ +
+

09. Advanced Attributes

+ +
FORMAT: 1A
+
+# Advanced Attributes API
+Improving the previous [Attributes](08.%20Attributes.md) description example,
+this API example describes the `Coupon` resource attributes (data structure)
+regardless of the serialization format. These attributes can be later
+referenced using the resource name.
+
+These attributes are then reused in the `Retrieve a Coupon` action. Since they
+describe the complete message, no explicit JSON body example is needed.
+
+Moving forward, the `Coupon` resource data structure is then reused when
+defining the attributes of the coupons collection resource – `Coupons`.
+
+The `Create a Coupon` action also demonstrate the description of request
+attributes – once defined, these attributes are implied on every `Create a
+Coupon` request unless the request specifies otherwise. Apparently, the
+description of action attributes is somewhat duplicate to the definition of
+`Coupon` resource attributes. We will address this in the next 
+[Data Structures](10.%20Data%20Structures.md) example.
+
+
+# Group Coupons
+
+## Coupon [/coupons/{id}]
+A coupon contains information about a percent-off or amount-off discount you
+might want to apply to a customer.
+
++ Parameters
+    + id (string)
+
+        The ID of the desired coupon.
+
++ Attributes (object)
+    + id: 250FF (string, required)
+    + created: 1415203908 (number) - Time stamp
+    + percent_off: 25 (number)
+
+        A positive integer between 1 and 100 that represents the discount the coupon will apply.
+
+    + redeem_by (number) - Date after which the coupon can no longer be redeemed
+
+### Retrieve a Coupon [GET]
+Retrieves the coupon with the given ID.
+
++ Response 200 (application/json)
+    + Attributes (Coupon)
+
+## Coupons [/coupons{?limit}]
+
++ Attributes (array[Coupon])
+
+### List all Coupons [GET]
+Returns a list of your coupons.
+
++ Parameters
+    + limit (number, optional)
+
+        A limit on the number of objects to be returned. Limit can range
+        between 1 and 100 items.
+
+        + Default: `10`
+
++ Response 200 (application/json)
+    + Attributes (Coupons)
+
+### Create a Coupon [POST]
+Creates a new Coupon.
+
++ Attributes (object)
+    + percent_off: 25 (number)
+    + redeem_by (number)
+
++ Request (application/json)
+
++ Response 200 (application/json)
+    + Attributes (Coupon)
+
+ +
+
+
+ + + +
+
+ + + + + + diff --git a/documentation/examples/10-data-structures.html b/documentation/examples/10-data-structures.html new file mode 100644 index 0000000..393610c --- /dev/null +++ b/documentation/examples/10-data-structures.html @@ -0,0 +1,208 @@ + + + + + + + + 10. Data Structures | API Blueprint + + + + + + + + + +
+
+
+ + +
+ +
+ + + + +
+
+ +
+
+ +
+

10. Data Structures

+ +
FORMAT: 1A
+
+# Data Structures API
+Following [Advanced Attributes](09.%20Advanced%20Attributes.md), this example
+demonstrates defining arbitrary data structure to be reused by various
+attribute descriptions.
+
+Since a portion of the `Coupon` data structure is shared between the `Coupon`
+definition itself and the `Create a Coupon` action, it was separated into a
+`Coupon Base` data structure in the `Data Structures` API Blueprint Section.
+Doing so enables us to reuse it as a base-type of other attribute definitions.
+
+
+# Group Coupons
+
+## Coupon [/coupons/{id}]
+A coupon contains information about a percent-off or amount-off discount you
+might want to apply to a customer.
+
++ Parameters
+    + id (string)
+
+        The ID of the desired coupon.
+
++ Attributes (Coupon Base)
+    + id: 250FF (string, required)
+    + created: 1415203908 (number) - Time stamp
+
+### Retrieve a Coupon [GET]
+Retrieves the coupon with the given ID.
+
++ Response 200 (application/json)
+    + Attributes (Coupon)
+
+## Coupons [/coupons{?limit}]
+
++ Attributes (array[Coupon])
+
+### List all Coupons [GET]
+Returns a list of your coupons.
+
++ Parameters
+    + limit (number, optional)
+
+        A limit on the number of objects to be returned. Limit can range
+        between 1 and 100 items.
+
+        + Default: `10`
+
++ Response 200 (application/json)
+    + Attributes (Coupons)
+
+### Create a Coupon [POST]
+Creates a new Coupon.
+
++ Attributes (Coupon Base)
+
++ Request (application/json)
+
++ Response 200 (application/json)
+    + Attributes (Coupon)
+
+# Data Structures
+
+## Coupon Base (object)
++ percent_off: 25 (number)
+
+    A positive integer between 1 and 100 that represents the discount the
+    coupon will apply.
+
++ redeem_by (number) - Date after which the coupon can no longer be redeemed
+
+ +
+
+
+ + + +
+
+ + + + + + diff --git a/documentation/examples/11-resource-model.html b/documentation/examples/11-resource-model.html new file mode 100644 index 0000000..442b392 --- /dev/null +++ b/documentation/examples/11-resource-model.html @@ -0,0 +1,196 @@ + + + + + + + + 11. Resource Model | API Blueprint + + + + + + + + + +
+
+
+ + +
+ +
+ + + + +
+
+ +
+
+ +
+

11. Resource Model

+ +
FORMAT: 1A
+
+# Resource Model API
+Resource model is a [resource manifestation](http://www.w3.org/TR/di-gloss/#def-resource-manifestation).
+One particular representation of your resource.
+
+Furthermore, in API Blueprint, any `resource model` you have defined can be
+referenced in a request or response section, saving you lots of time
+maintaining your API blueprint. You simply define a resource model as any
+payload (e.g. [request](https://github.com/apiaryio/api-blueprint/blob/master/examples/06.%20Requests.md)
+or [response](https://github.com/apiaryio/api-blueprint/blob/master/examples/5.%20Responses.md))
+and then reference it later where you would normally write a `request` or
+`response`.
+
+
+# Group Messages
+Group of all messages-related resources.
+
+## My Message [/message]
+
++ Model (application/vnd.siren+json)
+
+    This is the `application/vnd.siren+json` message resource representation.
+
+    + Headers
+
+            Location: http://api.acme.com/message
+
+    + Body
+
+            {
+              "class": [ "message" ],
+              "properties": {
+                    "message": "Hello World!"
+              },
+              "links": [
+                    { "rel": "self" , "href": "/message" }
+              ]
+            }
+
+### Retrieve a Message [GET]
+At this point we will utilize our `Message` resource model and reference it in
+`Response 200`.
+
++ Response 200
+
+    [My Message][]
+
+### Update a Message [PUT]
+
++ Request Update Plain Text Message (text/plain)
+
+        All your base are belong to us.
+
++ Request Update JSON Message (application/json)
+
+        { "message": "All your base are belong to us." }
+
++ Response 204
+
+ +
+
+
+ + + +
+
+ + + + + + diff --git a/documentation/examples/12-advanced-action.html b/documentation/examples/12-advanced-action.html new file mode 100644 index 0000000..e835c7e --- /dev/null +++ b/documentation/examples/12-advanced-action.html @@ -0,0 +1,190 @@ + + + + + + + + 12. Advanced Action | API Blueprint + + + + + + + + + +
+
+
+ + +
+ +
+ + + + +
+
+ +
+
+ +
+

12. Advanced Action

+ +
FORMAT: 1A
+
+# Advanced Action API
+A resource action is – in fact – a state transition. This API example
+demonstrates an action - state transition - to another resource.
+
+
+# Tasks [/tasks/tasks{?status,priority}]
+
++ Parameters
+    + status (string)
+    + priority (number)
+
+## List All Tasks [GET]
+
++ Response 200 (application/json)
+
+        [
+            {
+                "id": 123,
+                "name": "Exercise in gym",
+                "done": false,
+                "type": "task"
+            },
+            {
+                "id": 124,
+                "name": "Shop for groceries",
+                "done": true,
+                "type": "task"
+            }
+        ]
+
+## Retrieve Task [GET /task/{id}]
+This is a state transition to another resource.
+
++ Parameters
+    + id (string)
+
++ Response 200 (application/json)
+
+        {
+            "id": 123,
+            "name": "Go to gym",
+            "done": false,
+            "type": "task"
+        }
+
+## Delete Task [DELETE /task/{id}]
+
++ Parameters
+    + id (string)
+
++ Response 204
+
+ +
+
+
+ + + +
+
+ + + + + + diff --git a/documentation/examples/13-named-endpoints.html b/documentation/examples/13-named-endpoints.html new file mode 100644 index 0000000..59fcb52 --- /dev/null +++ b/documentation/examples/13-named-endpoints.html @@ -0,0 +1,176 @@ + + + + + + + + 13. Named Endpoints | API Blueprint + + + + + + + + + +
+
+
+ + +
+ +
+ + + + +
+
+ +
+
+ +
+

13. Named Endpoints

+ +
FORMAT: 1A
+
+# Named Endpoints API
+This API example demonstrates how to define a standalone endpoint with an identifier.
+
+
+# Group Quick start
+
+## Create message [POST /messages]
+
+Start out by creating a message for the world to see.
+
++ Request (application/json)
+
+        { "message": "Hello World!" }
+
++ Response 201
+
+    + Headers
+
+            Location: /messages/1337
+
+## Create a new task [POST /tasks]
+
+Now create a task that you need to do at a later date.
+
++ Request (application/json)
+
+        {
+            "name": "Exercise in gym",
+            "done": false,
+            "type": "task"
+        }
+
++ Response 201
+
+    + Headers
+
+            Location: /tasks/1992
+
+ +
+
+
+ + + +
+
+ + + + + + diff --git a/documentation/examples/14-json-schema.html b/documentation/examples/14-json-schema.html new file mode 100644 index 0000000..7bc7316 --- /dev/null +++ b/documentation/examples/14-json-schema.html @@ -0,0 +1,229 @@ + + + + + + + + 14. JSON Schema | API Blueprint + + + + + + + + + +
+
+
+ + +
+ +
+ + + + +
+
+ +
+
+ +
+

14. JSON Schema

+ +
FORMAT: 1A
+
+# JSON Schema
+Every request and response can have a schema. Below you will find examples
+using [JSON Schema](http://json-schema.org/) to describe the format of request
+and response body content.
+
+
+# Notes [/notes/{id}]
+
++ Parameters
+
+    + id: abc123 (required) - Unique identifier for a note
+
+## Get a note [GET]
+Gets a single note by its unique identifier.
+
++ Response 200 (application/json)
+
+    + Body
+
+            {
+                "id": "abc123",
+                "title": "This is a note",
+                "content": "This is the note content."
+                "tags": [
+                    "todo",
+                    "home"
+                ]
+            }
+
+    + Schema
+
+            {
+                "type": "object",
+                "properties": {
+                    "id": {
+                        "type": "string"
+                    },
+                    "title": {
+                        "type": "string"
+                    },
+                    "content": {
+                        "type": "string"
+                    },
+                    "tags": {
+                        "type": "array",
+                        "items": {
+                            "type": "string"
+                        }
+                    }
+                }
+            }
+
+## Update a note [PATCH]
+Modify a note's data using its unique identifier. You can edit the `title`,
+`content`, and `tags`.
+
++ Request (application/json)
+
+    + Body
+
+            {
+                "title": "This is another note",
+                "tags": [
+                    "todo",
+                    "work"
+                ]
+            }
+
+    + Schema
+
+            {
+                "type": "object",
+                "properties": {
+                    "title": {
+                        "type": "string"
+                    },
+                    "content": {
+                        "type": "string"
+                    },
+                    "tags": {
+                        "type": "array",
+                        "items": {
+                            "type": "string"
+                        }
+                    }
+                },
+                "additionalProperties": false
+            }
+
++ Response 204
+
+ +
+
+
+ + + +
+
+ + + + + + diff --git a/documentation/examples/15-advanced-json-schema.html b/documentation/examples/15-advanced-json-schema.html new file mode 100644 index 0000000..90d9ed3 --- /dev/null +++ b/documentation/examples/15-advanced-json-schema.html @@ -0,0 +1,199 @@ + + + + + + + + 15. Advanced JSON Schema | API Blueprint + + + + + + + + + +
+
+
+ + +
+ +
+ + + + +
+
+ +
+
+ +
+

15. Advanced JSON Schema

+ +
FORMAT: 1A
+
+# Advanced JSON Schema
+The JSON body and JSON Schema for a request or response can be generated from
+the attributes section MSON data structure. The generated schema can also be
+overridden by providing an explicit schema, as you can see in the examples
+below.
+
+
+# Notes [/notes/{id}]
+
++ Parameters
+
+    + id: abc123 (required) - Unique identifier for a note
+
+## Get a note [GET]
+Gets a single note by its unique identifier.
+
++ Response 200 (application/json)
+
+    + Attributes
+
+        + id: abc123
+        + title: This is a note
+        + content: This is the note content.
+        + tags: todo, home (array[string])
+
+## Update a note [PATCH]
+Modify a note's data using its unique identifier. You can edit the `title`,
+`content`, and `tags`.
+
++ Request (application/json)
+
+    + Attributes
+
+        + title: This is another note
+        + content
+        + tags: todo, work (array[string])
+
+    + Schema
+
+            {
+                "type": "object",
+                "description": "This is a custom schema!",
+                "properties": {
+                    "title": {
+                        "type": "string"
+                    },
+                    "content": {
+                        "type": "string"
+                    },
+                    "tags": {
+                        "type": "array",
+                        "items": {
+                            "type": "string"
+                        }
+                    }
+                },
+                "additionalProperties": false
+            }
+
++ Response 204
+
+ +
+
+
+ + + +
+
+ + + + + + diff --git a/documentation/examples/gist-fox-api-+-auth.html b/documentation/examples/gist-fox-api-+-auth.html new file mode 100644 index 0000000..0dd3b55 --- /dev/null +++ b/documentation/examples/gist-fox-api-+-auth.html @@ -0,0 +1,411 @@ + + + + + + + + Gist Fox API + Auth | API Blueprint + + + + + + + + + +
+
+
+ + +
+ +
+ + + + +
+
+ +
+
+ +
+

Gist Fox API + Auth

+ +
FORMAT: 1A
+
+# Gist Fox API
+Gist Fox API is a **pastes service** similar to [GitHub's Gist](http://gist.github.com).
+
+## Authentication
+*Gist Fox API* uses OAuth Authorization. First you create a new (or acquire existing) OAuth token using Basic Authentication. After you have acquired your token you can use it to access other resources within token' scope.
+
+## Media Types
+Where applicable this API uses the [HAL+JSON](https://github.com/mikekelly/hal_specification/blob/master/hal_specification.md) media-type to represent resources states and affordances.
+
+Requests with a message-body are using plain JSON to set or update resource states.
+
+## Error States
+The common [HTTP Response Status Codes](https://github.com/for-GET/know-your-http-well/blob/master/status-codes.md) are used.
+
+# Gist Fox API Root [/]
+Gist Fox API entry point.
+
+This resource does not have any attributes. Instead it offers the initial API affordances in the form of the HTTP Link header and
+HAL links.
+
+## Retrieve the Entry Point [GET]
+
++ Response 200 (application/hal+json)
+    + Headers
+
+            Link: <http:/api.gistfox.com/>;rel="self",<http:/api.gistfox.com/gists>;rel="gists",<http:/api.gistfox.com/authorization>;rel="authorization"
+
+    + Body
+
+            {
+                "_links": {
+                    "self": { "href": "/" },
+                    "gists": { "href": "/gists?{since}", "templated": true },
+                    "authorization": { "href": "/authorization"}
+                }
+            }
+
+# Group Gist
+Gist-related resources of *Gist Fox API*.
+
+## Gist [/gists/{id}{?access_token}]
+A single Gist object. The Gist resource is the central resource in the Gist Fox API. It represents one paste - a single text note.
+
+The Gist resource has the following attributes:
+
++ id
++ created_at
++ description
++ content
+
+The states *id* and *created_at* are assigned by the Gist Fox API at the moment of creation.
+
++ Parameters
+    + id (string) - ID of the Gist in the form of a hash.
+    + access_token (string, optional) - Gist Fox API access token.
+
++ Model (application/hal+json)
+
+    HAL+JSON representation of Gist Resource. In addition to representing its state in the JSON form it offers affordances in the form of the HTTP Link header and HAL links.
+
+    + Headers
+
+            Link: <http:/api.gistfox.com/gists/42>;rel="self", <http:/api.gistfox.com/gists/42/star>;rel="star"
+
+    + Body
+
+            {
+                "_links": {
+                    "self": { "href": "/gists/42" },
+                    "star": { "href": "/gists/42/star" },
+                },
+                "id": "42",
+                "created_at": "2014-04-14T02:15:15Z",
+                "description": "Description of Gist",
+                "content": "String contents"
+            }
+
+### Retrieve a Single Gist [GET]
++ Response 200
+
+    [Gist][]
+
+### Edit a Gist [PATCH]
+To update a Gist send a JSON with updated value for one or more of the Gist resource attributes. All attributes values (states) from the previous version of this Gist are carried over by default if not included in the hash.
+
++ Request (application/json)
+
+        {
+            "content": "Updated file contents"
+        }
+
++ Response 200
+
+    [Gist][]
+
+### Delete a Gist [DELETE]
++ Response 204
+
+## Gists Collection [/gists{?access_token,since}]
+Collection of all Gists.
+
+The Gist Collection resource has the following attribute:
+
++ total
+
+In addition it **embeds** *Gist Resources* in the Gist Fox API.
+
++ Model (application/hal+json)
+
+    HAL+JSON representation of Gist Collection Resource. The Gist resources in collections are embedded. Note the embedded Gists resource are incomplete representations of the Gist in question. Use the respective Gist link to retrieve its full representation.
+
+    + Headers
+
+            Link: <http:/api.gistfox.com/gists>;rel="self"
+
+    + Body
+
+            {
+                "_links": {
+                    "self": { "href": "/gists" }
+                },
+                "_embedded": {
+                    "gists": [
+                        {
+                            "_links" : {
+                                "self": { "href": "/gists/42" }
+                            },
+                            "id": "42",
+                            "created_at": "2014-04-14T02:15:15Z",
+                            "description": "Description of Gist"
+                        }
+                    ]
+                },
+                "total": 1
+            }
+
+### List All Gists [GET]
++ Parameters
+    + since (string, optional) - Timestamp in ISO 8601 format: `YYYY-MM-DDTHH:MM:SSZ` Only gists updated at or after this time are returned.
+
++ Response 200
+
+    [Gists Collection][]
+
+### Create a Gist [POST]
+To create a new Gist simply provide a JSON hash of the *description* and *content* attributes for the new Gist.
+
+This action requires an `access_token` with `gist_write` scope.
+
++ Parameters
+    + access_token (string, optional) - Gist Fox API access token.
+
++ Request (application/json)
+
+        {
+            "description": "Description of Gist",
+            "content": "String content"
+        }
+
++ Response 201
+
+    [Gist][]
+
+## Star [/gists/{id}/star{?access_token}]
+Star resource represents a Gist starred status.
+
+The Star resource has the following attribute:
+
++ starred
+
++ Parameters
+    + id (string) - ID of the gist in the form of a hash
+    + access_token (string, optional) - Gist Fox API access token.
+
++ Model (application/hal+json)
+
+    HAL+JSON representation of Star Resource.
+
+    + Headers
+
+            Link: <http:/api.gistfox.com/gists/42/star>;rel="self"
+
+    + Body
+
+            {
+                "_links": {
+                    "self": { "href": "/gists/42/star" },
+                },
+                "starred": true
+            }
+
+### Star a Gist [PUT]
+This action requires an `access_token` with `gist_write` scope.
+
++ Response 204
+
+### Unstar a Gist [DELETE]
+This action requires an `access_token` with `gist_write` scope.
+
++ Response 204
+
+### Check if a Gist is Starred [GET]
++ Response 200
+
+    [Star][]
+
+# Group Access Authorization and Control
+Access and Control of *Gist Fox API* OAuth token.
+
+## Authorization [/authorization]
+Authorization Resource represents an authorization granted to the user. You can **only** access your own authorization, and only through **Basic Authentication**.
+
+The Authorization Resource has the following attribute:
+
++ token
++ scopes
+
+Where *token* represents an OAuth token and *scopes* is an array of scopes granted for the given authorization. At this moment the only available scope is `gist_write`.
+
++ Model (application/hal+json)
+
+    + Headers
+
+            Link: <http:/api.gistfox.com/authorizations/1>;rel="self"
+
+    + Body
+
+            {
+                "_links": {
+                    "self": { "href": "/authorizations" },
+                },
+                "scopes": [
+                    "gist_write"
+                ],
+                "token": "abc123"
+            }
+
+### Retrieve Authorization [GET]
++ Request
+    + Headers
+
+            Authorization: Basic QWxhZGRpbjpvcGVuIHNlc2FtZQ==
+
++ Response 200
+
+    [Authorization][]
+
+### Create Authorization [POST]
++ Request (application/json)
+    + Headers
+
+            Authorization: Basic QWxhZGRpbjpvcGVuIHNlc2FtZQ==
+
+    + Body
+
+            {
+                "scopes": [
+                    "gist_write"
+                ]
+            }
+
++ Response 201
+
+        [Authorization][]
+
+### Remove an Authorization [DELETE]
++ Request
+    + Headers
+
+            Authorization: Basic QWxhZGRpbjpvcGVuIHNlc2FtZQ==
+
++ Response 204
+
+ +
+
+
+ + + +
+
+ + + + + + diff --git a/documentation/examples/gist-fox-api.html b/documentation/examples/gist-fox-api.html new file mode 100644 index 0000000..9e29b43 --- /dev/null +++ b/documentation/examples/gist-fox-api.html @@ -0,0 +1,336 @@ + + + + + + + + Gist Fox API | API Blueprint + + + + + + + + + +
+
+
+ + +
+ +
+ + + + +
+
+ +
+
+ +
+

Gist Fox API

+ +
FORMAT: 1A
+
+# Gist Fox API
+Gist Fox API is a **pastes service** similar to [GitHub's Gist](http://gist.github.com).
+
+## Authentication
+Currently the Gist Fox API does not provide authenticated access.
+
+## Media Types
+Where applicable this API uses the [HAL+JSON](https://github.com/mikekelly/hal_specification/blob/master/hal_specification.md) media-type to represent resources states and affordances.
+
+Requests with a message-body are using plain JSON to set or update resource states.
+
+## Error States
+The common [HTTP Response Status Codes](https://github.com/for-GET/know-your-http-well/blob/master/status-codes.md) are used.
+
+# Gist Fox API Root [/]
+Gist Fox API entry point.
+
+This resource does not have any attributes. Instead it offers the initial API affordances in the form of the HTTP Link header and
+HAL links.
+
+## Retrieve the Entry Point [GET]
+
++ Response 200 (application/hal+json)
+    + Headers
+
+            Link: <http:/api.gistfox.com/>;rel="self",<http:/api.gistfox.com/gists>;rel="gists"
+
+    + Body
+
+            {
+                "_links": {
+                    "self": { "href": "/" },
+                    "gists": { "href": "/gists?{since}", "templated": true }
+                }
+            }
+
+# Group Gist
+Gist-related resources of *Gist Fox API*.
+
+## Gist [/gists/{id}]
+A single Gist object. The Gist resource is the central resource in the Gist Fox API. It represents one paste - a single text note.
+
+The Gist resource has the following attributes:
+
++ id
++ created_at
++ description
++ content
+
+The states *id* and *created_at* are assigned by the Gist Fox API at the moment of creation.
+
+
++ Parameters
+    + id (string) - ID of the Gist in the form of a hash.
+
++ Model (application/hal+json)
+
+    HAL+JSON representation of Gist Resource. In addition to representing its state in the JSON form it offers affordances in the form of the HTTP Link header and HAL links.
+
+    + Headers
+
+            Link: <http:/api.gistfox.com/gists/42>;rel="self", <http:/api.gistfox.com/gists/42/star>;rel="star"
+
+    + Body
+
+            {
+                "_links": {
+                    "self": { "href": "/gists/42" },
+                    "star": { "href": "/gists/42/star" }
+                },
+                "id": "42",
+                "created_at": "2014-04-14T02:15:15Z",
+                "description": "Description of Gist",
+                "content": "String contents"
+            }
+
+### Retrieve a Single Gist [GET]
++ Response 200
+
+    [Gist][]
+
+### Edit a Gist [PATCH]
+To update a Gist send a JSON with updated value for one or more of the Gist resource attributes. All attributes values (states) from the previous version of this Gist are carried over by default if not included in the hash.
+
++ Request (application/json)
+
+        {
+            "content": "Updated file contents"
+        }
+
++ Response 200
+
+    [Gist][]
+
+### Delete a Gist [DELETE]
++ Response 204
+
+## Gists Collection [/gists{?since}]
+Collection of all Gists.
+
+The Gist Collection resource has the following attribute:
+
++ total
+
+In addition it **embeds** *Gist Resources* in the Gist Fox API.
+
+
++ Model (application/hal+json)
+
+    HAL+JSON representation of Gist Collection Resource. The Gist resources in collections are embedded. Note the embedded Gists resource are incomplete representations of the Gist in question. Use the respective Gist link to retrieve its full representation.
+
+    + Headers
+
+            Link: <http:/api.gistfox.com/gists>;rel="self"
+
+    + Body
+
+            {
+                "_links": {
+                    "self": { "href": "/gists" }
+                },
+                "_embedded": {
+                    "gists": [
+                        {
+                            "_links" : {
+                                "self": { "href": "/gists/42" }
+                            },
+                            "id": "42",
+                            "created_at": "2014-04-14T02:15:15Z",
+                            "description": "Description of Gist"
+                        }
+                    ]
+                },
+                "total": 1
+            }
+
+### List All Gists [GET]
++ Parameters
+    + since (string, optional) - Timestamp in ISO 8601 format: `YYYY-MM-DDTHH:MM:SSZ` Only gists updated at or after this time are returned.
+
++ Response 200
+
+    [Gists Collection][]
+
+### Create a Gist [POST]
+To create a new Gist simply provide a JSON hash of the *description* and *content* attributes for the new Gist.
+
++ Request (application/json)
+
+        {
+            "description": "Description of Gist",
+            "content": "String content"
+        }
+
++ Response 201
+
+    [Gist][]
+
+## Star [/gists/{id}/star]
+Star resource represents a Gist starred status.
+
+The Star resource has the following attribute:
+
++ starred
+
+
++ Parameters
+
+    + id (string) - ID of the gist in the form of a hash
+
++ Model (application/hal+json)
+
+    HAL+JSON representation of Star Resource.
+
+    + Headers
+
+            Link: <http:/api.gistfox.com/gists/42/star>;rel="self"
+
+    + Body
+
+            {
+                "_links": {
+                    "self": { "href": "/gists/42/star" }
+                },
+                "starred": true
+            }
+
+### Star a Gist [PUT]
++ Response 204
+
+### Unstar a Gist [DELETE]
++ Response 204
+
+### Check if a Gist is Starred [GET]
++ Response 200
+
+    [Star][]
+
+ +
+
+
+ + + +
+
+ + + + + + diff --git a/documentation/examples/index.html b/documentation/examples/index.html new file mode 100644 index 0000000..d8f6893 --- /dev/null +++ b/documentation/examples/index.html @@ -0,0 +1,162 @@ + + + + + + + + Examples | API Blueprint + + + + + + + + + +
+
+
+ + +
+ +
+ + + + +
+
+ +
+
+ + +
+
+ + + +
+
+ + + + + + diff --git a/documentation/examples/polls-api.html b/documentation/examples/polls-api.html new file mode 100644 index 0000000..0945897 --- /dev/null +++ b/documentation/examples/polls-api.html @@ -0,0 +1,312 @@ + + + + + + + + Polls API | API Blueprint + + + + + + + + + +
+
+
+ + +
+ +
+ + + + +
+
+ +
+
+ +
+

Polls API

+ +
FORMAT: 1A
+HOST: http://polls.apiblueprint.org/
+
+# Polls
+
+Polls is a simple API allowing consumers to view polls and vote in them. You can view this documentation over at [Apiary](http://docs.pollsapi.apiary.io).
+
+# Polls API Root [/]
+
+This resource does not have any attributes. Instead it offers the initial API affordances in the form of the links in the JSON body.
+
+It is recommend to follow the “url” link values, [Link](https://tools.ietf.org/html/rfc5988) or Location headers where applicable to retrieve resources. Instead of constructing your own URLs, to keep your client decoupled from implementation details.
+
+## Retrieve the Entry Point [GET]
+
++ Response 200 (application/json)
+
+        {
+            "questions_url": "/questions"
+        }
+
+## Group Question
+
+Resources related to questions in the API.
+
+## Question [/questions/{question_id}]
+
+A Question object has the following attributes:
+
++ question
++ published_at - An ISO8601 date when the question was published.
++ url
++ choices - An array of Choice objects.
+
++ Parameters
+    + question_id: 1 (required, number) - ID of the Question in form of an integer
+
+### View a Questions Detail [GET]
+
++ Response 200 (application/json)
+
+        {
+            "question": "Favourite programming language?",
+            "published_at": "2014-11-11T08:40:51.620Z",
+            "url": "/questions/1",
+            "choices": [
+                {
+                    "choice": "Swift",
+                    "url": "/questions/1/choices/1",
+                    "votes": 2048
+                }, {
+                    "choice": "Python",
+                    "url": "/questions/1/choices/2",
+                    "votes": 1024
+                }, {
+                    "choice": "Objective-C",
+                    "url": "/questions/1/choices/3",
+                    "votes": 512
+                }, {
+                    "choice": "Ruby",
+                    "url": "/questions/1/choices/4",
+                    "votes": 256
+                }
+            ]
+        }
+
+## Choice [/questions/{question_id}/choices/{choice_id}]
+
++ Parameters
+    + question_id: 1 (required, number) - ID of the Question in form of an integer
+    + choice_id: 1 (required, number) - ID of the Choice in form of an integer
+
+### Vote on a Choice [POST]
+
+This action allows you to vote on a question's choice.
+
++ Response 201
+
+    + Headers
+
+            Location: /questions/1
+
+## Questions Collection [/questions{?page}]
+
++ Parameters
+    + page: 1 (optional, number) - The page of questions to return
+
+### List All Questions [GET]
+
++ Response 200 (application/json)
+
+    + Headers
+
+            Link: </questions?page=2>; rel="next"
+
+    + Body
+
+            [
+                {
+                    "question": "Favourite programming language?",
+                    "published_at": "2014-11-11T08:40:51.620Z",
+                    "url": "/questions/1",
+                    "choices": [
+                        {
+                            "choice": "Swift",
+                            "url": "/questions/1/choices/1",
+                            "votes": 2048
+                        }, {
+                            "choice": "Python",
+                            "url": "/questions/1/choices/2",
+                            "votes": 1024
+                        }, {
+                            "choice": "Objective-C",
+                            "url": "/questions/1/choices/3",
+                            "votes": 512
+                        }, {
+                            "choice": "Ruby",
+                            "url": "/questions/1/choices/4",
+                            "votes": 256
+                        }
+                    ]
+                }
+            ]
+
+### Create a New Question [POST]
+
+You may create your own question using this action. It takes a JSON object containing a question and a collection of answers in the form of choices.
+
++ question (string) - The question
++ choices (array[string]) - A collection of choices.
+
++ Request (application/json)
+
+        {
+            "question": "Favourite programming language?",
+            "choices": [
+                "Swift",
+                "Python",
+                "Objective-C",
+                "Ruby"
+            ]
+        }
+
++ Response 201 (application/json)
+
+    + Headers
+
+            Location: /questions/2
+
+    + Body
+
+            {
+                "question": "Favourite programming language?",
+                "published_at": "2014-11-11T08:40:51.620Z",
+                "url": "/questions/2",
+                "choices": [
+                    {
+                        "choice": "Swift",
+                        "url": "/questions/2/choices/1",
+                        "votes": 0
+                    }, {
+                        "choice": "Python",
+                        "url": "/questions/2/choices/2",
+                        "votes": 0
+                    }, {
+                        "choice": "Objective-C",
+                        "url": "/questions/2/choices/3",
+                        "votes": 0
+                    }, {
+                        "choice": "Ruby",
+                        "url": "/questions/2/choices/4",
+                        "votes": 0
+                    }
+                ]
+            }
+
+ +
+
+
+ + + +
+
+ + + + + + diff --git a/documentation/examples/polls-hypermedia-api.html b/documentation/examples/polls-hypermedia-api.html new file mode 100644 index 0000000..bd0b545 --- /dev/null +++ b/documentation/examples/polls-hypermedia-api.html @@ -0,0 +1,760 @@ + + + + + + + + Polls Hypermedia API | API Blueprint + + + + + + + + + +
+
+
+ + +
+ +
+ + + + +
+
+ +
+
+ +
+

Polls Hypermedia API

+ +
FORMAT: 1A
+HOST: http://polls.apiblueprint.org/
+
+# Polls
+
+Polls is a simple API allowing consumers to view polls and vote in them. You can view this documentation over at [Apiary](http://docs.pollshypermedia.apiary.io/).
+
+# Polls API Root [/]
+
+This resource does not have any attributes. Instead it offers the initial API affordances.
+
+## Retrieve the Entry Point [GET]
+
++ Response 200 (application/vnd.siren+json)
+
+        {
+            "links": [
+                {
+                    "rel": [ "questions" ],
+                    "href": "/questions"
+                }
+            ]
+        }
+
++ Response 200 (application/hal+json)
+
+        {
+            "_links": {
+                "questions": { "href": "/questions" }
+            }
+        }
+
+## Questions Collection [/questions{?page}]
+
++ Parameters
+    + page: 1 (optional, number) - The page of questions to return
+
+### List All Questions [GET]
+
++ Relation: questions
+
++ Response 200 (application/vnd.siren+json)
+
+        {
+            "actions": [
+                {
+                    "name": "add",
+                    "href": "/questions",
+                    "method": "POST",
+                    "type": "application/json",
+                    "fields": [
+                        {
+                            "name": "question"
+                        }, {
+                            "name": "choices"
+                        }
+                    ]
+                }
+            ],
+            "links": [
+                {
+                  "rel": [ "next" ],
+                  "href": "/questions?page=2"
+                },
+                {
+                  "rel": [ "self" ],
+                  "href": "/questions"
+                }
+            ],
+            "entities": [
+                {
+                    "actions": [
+                        {
+                            "name": "delete",
+                            "href": "/questions/1",
+                            "method": "DELETE"
+                        }
+                    ],
+                    "rel": [ "question" ],
+                    "properties": {
+                        "published_at": "2014-11-11T08:40:51.620Z",
+                        "question": "Favourite programming language?"
+                    },
+                    "links": [
+                        {
+                            "rel": [ "self" ],
+                            "href": "/questions/1"
+                        }
+                    ],
+                    "entities": [
+                        {
+                            "actions": [
+                                {
+                                    "name": "vote",
+                                    "href": "/questions/1/choices/1",
+                                    "method": "POST"
+                                }
+                            ],
+                            "rel": [ "choice" ],
+                            "properties": {
+                                "choice": "Swift",
+                                "votes": 2048
+                            },
+                            "links": [
+                                {
+                                    "rel": [ "self" ],
+                                    "href": "/questions/1/choices/1"
+                                }
+                            ]
+                        }, {
+                            "actions": [
+                                {
+                                    "name": "vote",
+                                    "href": "/questions/1/choices/2",
+                                    "method": "POST"
+                                }
+                            ],
+                            "rel": [ "choice" ],
+                            "properties": {
+                                "choice": "Python",
+                                "votes": 1024
+                            },
+                            "links": [
+                                {
+                                    "rel": [ "self" ],
+                                    "href": "/questions/1/choices/2"
+                                }
+                            ]
+                        }, {
+                            "actions": [
+                                {
+                                    "name": "vote",
+                                    "href": "/questions/1/choices/3",
+                                    "method": "POST"
+                                }
+                            ],
+                            "rel": [ "choice" ],
+                            "properties": {
+                                "choice": "Objective-C",
+                                "votes": 512
+                            },
+                            "links": [
+                                {
+                                    "rel": [ "self" ],
+                                    "href": "/questions/1/choices/3"
+                                }
+                            ]
+                        }, {
+                            "actions": [
+                                {
+                                    "name": "vote",
+                                    "href": "/questions/1/choices/4",
+                                    "method": "POST"
+                                }
+                            ],
+                            "rel": [ "choice" ],
+                            "properties": {
+                                "choice": "Ruby",
+                                "votes": 256
+                            },
+                            "links": [
+                                {
+                                    "rel": [ "self" ],
+                                    "href": "/questions/1/choices/4"
+                                }
+                            ]
+                        }
+                    ]
+                }
+            ]
+        }
+
++ Response 200 (application/hal+json)
+
+        {
+            "_links": {
+                "self": { "href": "/questions" },
+                "next": { "href": "/questions?page=2" }
+            },
+            "_embedded": {
+                "question": [
+                    {
+                        "_links": {
+                            "self": { "self": "/questions/1" }
+                        },
+                        "_embedded": {
+                            "choice": [
+                                {
+                                    "_links": {
+                                        "self": { "self": "/questions/1/choices/1" }
+                                    },
+                                    "choice": "Swift",
+                                    "votes": 2048
+                                }, {
+                                    "_links": {
+                                        "self": { "self": "/questions/1/choices/2" }
+                                    },
+                                    "choice": "Python",
+                                    "votes": 1024
+                                }, {
+                                    "_links": {
+                                        "self": { "self": "/questions/1/choices/3" }
+                                    },
+                                    "choice": "Objective-C",
+                                    "votes": 512
+                                }, {
+                                    "_links": {
+                                        "self": { "self": "/questions/1/choices/4" }
+                                    },
+                                    "choice": "Ruby",
+                                    "votes": 256
+                                }
+                            ]
+                        },
+                        "question": "Favourite programming language?",
+                        "published_at": "2014-11-11T08:40:51.620Z"
+                    }
+                ]
+            }
+        }
+
+### Create a New Question [POST]
+
+You may create your own question using this action. It takes a JSON object containing a question and a collection of answers in the form of choices.
+
++ question (string) - The question
++ choices (array[string]) - A collection of choices.
+
++ Relation: create
+
++ Request (application/json)
+
+        {
+            "question": "Favourite programming language?",
+            "choices": [
+                "Swift",
+                "Python",
+                "Objective-C",
+                "Ruby"
+            ]
+        }
+
++ Response 201 (application/vnd.siren+json)
+
+        {
+            "actions": [
+                {
+                    "name": "delete",
+                    "href": "/questions/1",
+                    "method": "DELETE"
+                }
+            ],
+            "properties": {
+                "published_at": "2014-11-11T08:40:51.620Z",
+                "question": "Favourite programming language?"
+            },
+            "links": [
+                {
+                    "rel": [ "self" ],
+                    "href": "/questions/1"
+                }
+            ],
+            "entities": [
+                {
+                    "actions": [
+                        {
+                            "name": "vote",
+                            "href": "/questions/1/choices/1",
+                            "method": "POST"
+                        }
+                    ],
+                    "rel": [ "choices" ],
+                    "properties": {
+                        "choice": "Swift",
+                        "votes": 2048
+                    },
+                    "links": [
+                        {
+                            "rel": [ "self" ],
+                            "href": "/questions/1/choices/1"
+                        }
+                    ]
+                }, {
+                    "actions": [
+                        {
+                            "name": "vote",
+                            "href": "/questions/1/choices/2",
+                            "method": "POST"
+                        }
+                    ],
+                    "rel": [ "choices" ],
+                    "properties": {
+                        "choice": "Python",
+                        "votes": 1024
+                    },
+                    "links": [
+                        {
+                            "rel": [ "self" ],
+                            "href": "/questions/1/choices/2"
+                        }
+                    ]
+                }, {
+                    "actions": [
+                        {
+                            "name": "vote",
+                            "href": "/questions/1/choices/3",
+                            "method": "POST"
+                        }
+                    ],
+                    "rel": [ "choices" ],
+                    "properties": {
+                        "choice": "Objective-C",
+                        "votes": 512
+                    },
+                    "links": [
+                        {
+                            "rel": [ "self" ],
+                            "href": "/questions/1/choices/3"
+                        }
+                    ]
+                }, {
+                    "actions": [
+                        {
+                            "name": "vote",
+                            "href": "/questions/1/choices/4",
+                            "method": "POST"
+                        }
+                    ],
+                    "rel": [ "choices" ],
+                    "properties": {
+                        "choice": "Ruby",
+                        "votes": 256
+                    },
+                    "links": [
+                        {
+                            "rel": [ "self" ],
+                            "href": "/questions/1/choices/4"
+                        }
+                    ]
+                }
+            ]
+        }
+
++ Response 201 (application/hal+json)
+
+        {
+            "_links": {
+                "self": { "href": "/questions/1" }
+            },
+            "_embedded": {
+                "choices": [
+                    {
+                        "_links": {
+                            "self": { "self": "/questions/1/choices/1" }
+                        },
+                        "choice": "Swift",
+                        "votes": 2048
+                    }, {
+                        "_links": {
+                            "self": { "self": "/questions/1/choices/2" }
+                        },
+                        "choice": "Python",
+                        "votes": 1024
+                    }, {
+                        "_links": {
+                            "self": { "self": "/questions/1/choices/3" }
+                        },
+                        "choice": "Objective-C",
+                        "votes": 512
+                    }, {
+                        "_links": {
+                            "self": { "self": "/questions/1/choices/4" }
+                        },
+                        "choice": "Ruby",
+                        "votes": 256
+                    }
+                ]
+            },
+            "published_at": "2014-11-11T08:40:51.620Z",
+            "question": "Favourite programming language?"
+        }
+
+## Group Question
+
+Resources related to questions in the API.
+
+## Question [/questions/{question_id}]
+
+A Question object has the following attributes:
+
++ question
++ published_at - An ISO8601 date when the question was published.
++ url
++ choices - An array of Choice objects.
+
++ Parameters
+    + question_id: 1 (required, number) - ID of the Question in form of an integer
+
+### View a Questions Detail [GET]
+
++ Relation: question
+
++ Response 200 (application/vnd.siren+json)
+
+        {
+            "actions": [
+                {
+                    "name": "delete",
+                    "href": "/questions/1",
+                    "method": "DELETE"
+                }
+            ],
+            "properties": {
+                "published_at": "2014-11-11T08:40:51.620Z",
+                "question": "Favourite programming language?"
+            },
+            "links": [
+                {
+                    "rel": [ "self" ],
+                    "href": "/questions/1"
+                }
+            ],
+            "entities": [
+                {
+                    "actions": [
+                        {
+                            "name": "vote",
+                            "href": "/questions/1/choices/1",
+                            "method": "POST"
+                        }
+                    ],
+                    "rel": [ "choices" ],
+                    "properties": {
+                        "choice": "Swift",
+                        "votes": 2048
+                    },
+                    "links": [
+                        {
+                            "rel": [ "self" ],
+                            "href": "/questions/1/choices/1"
+                        }
+                    ]
+                }, {
+                    "actions": [
+                        {
+                            "name": "vote",
+                            "href": "/questions/1/choices/2",
+                            "method": "POST"
+                        }
+                    ],
+                    "rel": [ "choices" ],
+                    "properties": {
+                        "choice": "Python",
+                        "votes": 1024
+                    },
+                    "links": [
+                        {
+                            "rel": [ "self" ],
+                            "href": "/questions/1/choices/2"
+                        }
+                    ]
+                }, {
+                    "actions": [
+                        {
+                            "name": "vote",
+                            "href": "/questions/1/choices/3",
+                            "method": "POST"
+                        }
+                    ],
+                    "rel": [ "choices" ],
+                    "properties": {
+                        "choice": "Objective-C",
+                        "votes": 512
+                    },
+                    "links": [
+                        {
+                            "rel": [ "self" ],
+                            "href": "/questions/1/choices/3"
+                        }
+                    ]
+                }, {
+                    "actions": [
+                        {
+                            "name": "vote",
+                            "href": "/questions/1/choices/4",
+                            "method": "POST"
+                        }
+                    ],
+                    "rel": [ "choices" ],
+                    "properties": {
+                        "choice": "Ruby",
+                        "votes": 256
+                    },
+                    "links": [
+                        {
+                            "rel": [ "self" ],
+                            "href": "/questions/1/choices/4"
+                        }
+                    ]
+                }
+            ]
+        }
+
++ Response 200 (application/hal+json)
+
+        {
+            "_links": {
+                "self": { "href": "/questions/1" }
+            },
+            "_embedded": {
+                "choices": [
+                    {
+                        "_links": {
+                            "self": { "self": "/questions/1/choices/1" }
+                        },
+                        "choice": "Swift",
+                        "votes": 2048
+                    }, {
+                        "_links": {
+                            "self": { "self": "/questions/1/choices/2" }
+                        },
+                        "choice": "Python",
+                        "votes": 1024
+                    }, {
+                        "_links": {
+                            "self": { "self": "/questions/1/choices/3" }
+                        },
+                        "choice": "Objective-C",
+                        "votes": 512
+                    }, {
+                        "_links": {
+                            "self": { "self": "/questions/1/choices/4" }
+                        },
+                        "choice": "Ruby",
+                        "votes": 256
+                    }
+                ]
+            },
+            "published_at": "2014-11-11T08:40:51.620Z",
+            "question": "Favourite programming language?"
+        }
+
+## Choice [/questions/{question_id}/choices/{choice_id}]
+
++ Parameters
+    + question_id: 1 (required, number) - ID of the Question in form of an integer
+    + choice_id: 1 (required, number) - ID of the Choice in form of an integer
+
+### View a Choice Detail [GET]
+
++ Relation: choice
+
++ Response 200 (application/vnd.siren+json)
+
+        {
+            "actions": [
+                {
+                    "name": "vote",
+                    "href": "/questions/1/choices/1",
+                    "method": "POST"
+                }
+            ],
+            "rel": [ "choice" ],
+            "properties": {
+                "choice": "Swift",
+                "votes": 2048
+            },
+            "links": [
+                {
+                    "rel": [ "self" ],
+                    "href": "/questions/1/choices/1"
+                }
+            ]
+        }
+
++ Response 200 (application/hal+json)
+
+        {
+            "_links": {
+                "self": { "href": "/questions/1/choices/1" }
+            },
+            "choice": "Swift",
+            "votes": 2048
+        }
+
+### Vote on a Choice [POST]
+
+This action allows you to vote on a question's choice.
+
++ Relation: vote
+
++ Response 201 (application/vnd.siren+json)
+
+        {
+            "actions": [
+                {
+                    "name": "vote",
+                    "href": "/questions/1/choices/1",
+                    "method": "POST"
+                }
+            ],
+            "rel": [ "choice" ],
+            "properties": {
+                "choice": "Swift",
+                "votes": 2049
+            },
+            "links": [
+                {
+                    "rel": [ "self" ],
+                    "href": "/questions/1/choices/1"
+                }
+            ]
+        }
+
++ Response 201 (application/hal+json)
+
+        {
+            "_links": {
+                "self": "/questions/1/choices/1"
+            },
+            "choice": "Swift",
+            "votes": 2049
+        }
+
+ +
+
+
+ + + +
+
+ + + + + + diff --git a/documentation/examples/real-world-api.html b/documentation/examples/real-world-api.html new file mode 100644 index 0000000..2100b92 --- /dev/null +++ b/documentation/examples/real-world-api.html @@ -0,0 +1,290 @@ + + + + + + + + Real World API | API Blueprint + + + + + + + + + +
+
+
+ + +
+ +
+ + + + +
+
+ +
+
+ +
+

Real World API

+ +
FORMAT: 1A
+HOST: https://alpha-api.app.net
+
+# Real World API
+This API Blueprint demonstrates a real world example documenting a portion of
+[App.net API](http://developers.app.net).
+
+NOTE: This document is a **work in progress**.
+
+# Group Posts
+This section groups App.net post resources.
+
+## Post [/stream/0/posts/{post_id}]
+A Post is the other central object utilized by the App.net Stream API. It has
+rich text and annotations which comprise all of the content a users sees in
+their feed. Posts are closely tied to the follow graph...
+
++ Parameters
+    + post_id: `1` (string) - The id of the Post.
+
++ Model (application/json)
+
+    ```js
+    {
+        "data": {
+            "id": "1", // note this is a string
+            "user": {
+                ...
+            },
+            "created_at": "2012-07-16T17:25:47Z",
+            "text": "@berg FIRST post on this new site #newsocialnetwork",
+            "html": "<span itemprop=\"mention\" data-mention-name=\"berg\" data-mention-id=\"2\">@berg</span> FIRST post on <a href=\"https://join.app.net\" rel=\"nofollow\">this new site</a> <span itemprop=\"hashtag\" data-hashtag-name=\"newsocialnetwork\">#newsocialnetwork</span>.",
+            "source": {
+                "client_id": "udxGzAVBdXwGtkHmvswR5MbMEeVnq6n4",
+                "name": "Clientastic for iOS",
+                "link": "http://app.net"
+            },
+            "machine_only": false,
+            "reply_to": null,
+            "thread_id": "1",
+            "num_replies": 3,
+            "num_reposts": 0,
+            "num_stars": 0,
+            "entities": {
+                "mentions": [{
+                    "name": "berg",
+                    "id": "2",
+                    "pos": 0,
+                    "len": 5
+                }],
+                "hashtags": [{
+                    "name": "newsocialnetwork",
+                    "pos": 34,
+                    "len": 17
+                }],
+                "links": [{
+                    "text": "this new site",
+                    "url": "https://join.app.net"
+                    "pos": 20,
+                    "len": 13
+                }]
+            },
+            "you_reposted": false,
+            "you_starred": false
+        },
+        "meta": {
+            "code": 200,
+        }
+    }
+    ```
+
+### Retrieve a Post [GET]
+Returns a specific Post.
+
++ Response 200
+
+    [Post][]
+
+### Delete a Post [DELETE]
+Delete a Post. The current user must be the same user who created the Post. It
+returns the deleted Post on success.
+
++ Response 204
+
+## Posts Collection [/stream/0/posts]
+A Collection of posts.
+
++ Model (application/json)
+
+    ```js
+    {
+        "data": [
+            {
+                "id": "1", // note this is a string
+                ...
+            },
+            {
+                "id": "2",
+                ...
+            },
+            {
+                "id": "3",
+                ...
+            },
+        ],
+        "meta": {
+            "code": 200,
+        }
+    }
+    ```
+
+### Create a Post [POST]
+Create a new Post object. Mentions and hashtags will be parsed out of the post
+text, as will bare URLs...
+
++ Request
+
+    [Post][]
+
++ Response 201
+
+    [Post][]
+
+### Retrieve all Posts [GET]
+Retrieves all posts.
+
++ Response 200
+
+    [Posts Collection][]
+
+## Stars [/stream/0/posts/{post_id}/star]
+A User’s stars are visible to others, but they are not automatically added to
+your followers’ streams.
+
++ Parameters
+    + post_id: `1` (string) - The id of the Post.
+
+### Star a Post [POST]
+Save a given Post to the current User’s stars. This is just a “save” action,
+not a sharing action.
+
+*Note: A repost cannot be starred. Please star the parent Post.*
+
++ Response 200
+
+    [Post][]
+
+### Unstar a Post [DELETE]
+Remove a Star from a Post.
+
++ Response 200
+
+    [Post][]
+
+ +
+
+
+ + + +
+
+ + + + + + diff --git a/documentation/glossary.html b/documentation/glossary.html new file mode 100644 index 0000000..80a36af --- /dev/null +++ b/documentation/glossary.html @@ -0,0 +1,311 @@ + + + + + + + + Glossary of Terms | API Blueprint + + + + + + + + + +
+
+
+ + +
+ +
+ + + + +
+
+ +
+
+ +
+

Glossary of Terms

+ + +

A brief list of terms as used in the API Blueprint context.

+ +

Glossary

+ +

+ +

Action

+ +

An HTTP transaction (a request-response transaction).

+ +

Actions are specified by an HTTP request method within a resource.

+ +

+ +

API

+ +

An HTTP Application programming interface. Might refer to an API +description. See API Blueprint.

+ +

+ +

API Blueprint

+ +

The API Blueprint language. A format used to describe API in an API blueprint file.

+ +

+ +

Asset

+ +

Atomic data. Most often representing one resource representation in the form of message-body or its validation schema.

+ +

+ +

Attribute

+ +

Based on the context, attribute (property) of a message-body data structure, or +attribute of a resource, or an input attribute of a transition – +Action.

+ +

+ +

Blueprint

+ +

An API description. A blueprint file (or a set of files) that describes an API using the API Blueprint language.

+ +

+ +

Data Structure

+ +

A particular data organization, or a description of it. In API Blueprint, data +structures and their Attributes are described using the +Markdown Syntax for Object Notation – MSON.

+ +

+ +

Entity

+ +

Entity being transferred in a payload.

+ +

+ + + +

A message-header.

+ +

+ +

Method

+ +

An HTTP Request Method.

+ +

+ +

Message

+ +

An HTTP transaction message.

+ +

+ +

Message body

+ +

An asset representing HTTP transaction message body.

+ +

+ +

Message header

+ +

An asset representing HTTP transaction message header. +

+ +

Parameter

+ +

An URI template variable.

+ +

+ +

Payload

+ +

An HTTP transaction message including its discussion and any additional assets such as entity-body validation schema.

+ +

A payload may have an identifier – a string for a request +payload or an +HTTP status code for a +response payload.

+ +

+ +

Property

+ +

An entity field (attribute).

+ +

+ +

Request

+ +

A payload containing one specific HTTP Request.

+ +

+ +

Response

+ +

A payload containing one specific HTTP Response.

+ +

+ +

Resource

+ +

An API resource specified by +its URI. It can also refer to a set of resources +matching one URI template.

+ +

+ +

Resource Model

+ +

One manifestation of a resource in the +form of a payload. A resource model is an example +representation of its resource. Can be referenced later in the place of a +payload.

+ +

+ +

Resource Set

+ +

A set of API resources. Its +URI matches one specific URI template.

+ +

+ +

Trait

+ +

A quality or characteristic of an API Blueprint SECTION.

+ +

+ +

Schema

+ +

A validation schema in a form of an asset used to validate (or describe) a message-body.

+ +

+ +

URI template

+ +

A compact sequence of characters for describing a range of Uniform Resource Identifiers through variable expansion, see RFC 6570.

+ +

Additional resources

+ + + + +
+
+
+ + + +
+
+ + + + + + diff --git a/documentation/index.html b/documentation/index.html new file mode 100644 index 0000000..03b6843 --- /dev/null +++ b/documentation/index.html @@ -0,0 +1,151 @@ + + + + + + + + Documentation | API Blueprint + + + + + + + + + +
+
+
+ + +
+ +
+ + + + +
+
+ +
+
+ +
+

Documentation

+ + +

A powerful high-level API design language for web APIs.

+ +

API Blueprint is simple and accessible to everybody involved in the API design +lifecycle. Its syntax is concise yet expressive.

+ +

With API Blueprint you can quickly prototype and model APIs to be created or +describe already deployed mission-critical APIs. From a car to the +largest Content Distribution Network (CDN) in the world.

+ +

The API Blueprint is built to encourage dialogue and collaboration between +project stakeholders, developers and customers at any point in the API +lifecycle. At the same time, the API Blueprint tools provide the support +to achieve the goals be it API development, governance or delivery.

+ + +
+
+
+ + + +
+
+ + + + + + diff --git a/documentation/mson/cheatsheet.html b/documentation/mson/cheatsheet.html new file mode 100644 index 0000000..d401eb9 --- /dev/null +++ b/documentation/mson/cheatsheet.html @@ -0,0 +1,280 @@ + + + + + + + + MSON Cheatsheet | API Blueprint + + + + + + + + + +
+
+
+ + +
+ +
+ + + + +
+
+ +
+
+ +
+

MSON Cheatsheet

+ + +

This cheatsheet is an example orientated document showing some MSON features in +the context of API Blueprint. Refer to the MSON +Specification for detailed +documentation on MSON.

+ +

Core Syntax

+ +

Declaring an API Blueprint +Action describing how +GET requests to /files may look in an API. The API Blueprint describes that +the API may return a 200 response using JSON (with the application/json +content type). It may return an array which can only contain objects which must +have the key path.

+
# GET /files
+
++ Response 200 (application/json)
+    + Attributes (array, fixed-type)
+        + (object)
+            + path: `/files` (required)
+
+

Declaring Types

+ +

MSON allows declaring types to allow reusable structures and to keep API +Blueprint's short and simple. Reusable data structures sit under the Data +Structures heading.

+
# My API
+
+## GET /files
+
++ Response 200 (application/json)
+    + Attributes (array[File], fixed-type)
+
+## Data Structures
+
+### File (object)
+
++ name: `index.html`
++ size: 5012 (number)
++ `created_at`: `2007-04-05T24:00` (string)
++ permissions (Permission)
+
+### Permission (enum)
+
++ r (default) - Read only
++ rw - Read-write
+
+

NOTE: It's important to note, that if a key or value contains reserved +characters such as :, (,), <, >, {, }, [, ], _, +&ast;, -, +, ` then the value must be wrapped in a +code-block using back-ticks.

+ +

Types

+ +

Objects

+ +

Objects consist of key-value pairs. Properties are optional by default. Values +of properties are string by default.

+
+ name: API Blueprint (required)
+
+

An object consisting of a date property which must be present, but may be null:

+
+ date (required, nullable)
+
+

The fixed keyword can be used to declare that the value must be present with +as-is, for example the following declares a member type which if present must +have the value admin.

+
+ type: admin (fixed)
+
+

One Of

+ +

One Of can be used to describe mutually exclusive sets of members. For example, +User type must contain the name property, and must contain either an id, or a +username property.

+
## User (object)
+
++ name: Kyle (required)
++ One Of
+    + username: kylef (required)
+    + id: 1 (number, required)
+
+

See the enum type for declaring a mutally exclusive set of +types or values.

+ +

Arrays

+ +

Declaring an array which may only contain strings or numbers (array of a fixed-type, string or number):

+
+ Attributes (array[string, number], fixed-type)
+
+

With example values, and descriptions:

+
+ Attributes (array, fixed-type)
+    + 10 GBP
+    + 20 GBP
+    + 12.99 (number)
+
+

Declaring an array which may only contain the specified object which requires a +name property:

+
+ Attributes (array, fixed-type)
+    + (object)
+        + name (required)
+
+

Enumerations

+ +

The enum type can be used to describe an exclusive list of possible values or types.

+ +

Declaring an enumeration which may only contain one of the permitted values +(north, east, south, west):

+
## Direction (enum)
+
++ north
++ east
++ south
++ west
+
+

Declaring an enumeration where any value is permitted providing the value is a +string or a number:

+
## Data Structures
+
+### StringOrNumber (enum[string, number])
+
+## GET /products
+
++ Response 200 (application/json)
+    + Attributes (array, fixed-type)
+        + (object)
+            + name: API Blueprint
+            + price: 2.99 (StringOrNumber) - Price to purchase the product, as a string or a number
+            + state (enum)
+                + `in stock` (default)
+                + `sold-out`
+
+

Primitive Types

+ +

The primitive types string, number, and boolean may be used.

+
## Example Object
+
++ name (string)
++ `is_admin` (boolean)
++ age (number)
++ extra (array)
+    + hello world
+    + 2 (number)
+    + true (boolean)
+
+ + +
+
+
+ + + +
+
+ + + + + + diff --git a/documentation/mson/specification.html b/documentation/mson/specification.html new file mode 100644 index 0000000..5d40377 --- /dev/null +++ b/documentation/mson/specification.html @@ -0,0 +1,1436 @@ + + + + + + + + MSON Specification | API Blueprint + + + + + + + + + +
+
+
+ + +
+ +
+ + + + +
+
+ +
+
+ +
+

MSON Specification

+ + +

Markdown Syntax for Object Notation (MSON) is a plain-text syntax for the description and validation of data structures.

+ + + + + +

1 How to Read the Grammar

+ +
    +
  • An arrow (→) mark grammar productions that can be read as "is defined by|is defined by a(n)"
  • +
  • A double arrow (⇒) marks grammar productions that can be read as "contains|contains a(n)"
  • +
  • +Italic text indicates syntactic categories
  • +
  • A code span indicates literal characters, words and punctuations
  • +
  • A pipe character (|) separates alternative grammar productions
  • +
  • A following [opt] indicates optional syntactic categories and literals
  • +
+ +

1.1 Markdown Syntax

+ +

Note this reference is using ATX-style headers (#) and hyphen-style lists (-) exclusively. However you MAY use +Setext-style headers and/or asterisk (*) or plus (+) style lists if you prefer.

+ +

1.2 Notational Conventions

+ +

The key words "MUST", "MUST NOT", "REQUIRED", "SHALL", "SHALL NOT", "SHOULD", "SHOULD NOT", "RECOMMENDED", "MAY", and +"OPTIONAL" in this document are to be interpreted as described in RFC2119.

+ +

1.3 Promises

+ +

By default, MSON explicitly defines data structures and the meaning of their members without making any assertion to the +exclusivity of structures or their members. Further, no assertion is made concerning the presence of defined +structures or members. Rather, MSON describes structures that MAY be observed versus what MUST be observed.

+ +

However, much like JSON Schema being able to restrict "additionalProperties", MSON allows annotating structures to +indicate when they are strictly defined to preclude other structures and members and when they have strict ordering.

+ +

2 Types

+ +

In MSON, data structures are described by header-defined and/or list-defined Types and/or combinations thereof built +from a limited set of Base Types. A particular Type is defined by its Type Declaration and combination of +optional Type Sections.

+ +

TypeType Declaration

+ +

TypeType Sections [opt]

+ +

More specifically:

+ +

TypeType Declaration

+ +

TypeBlock Description [opt]

+ +

TypeMember Type Group [opt] | Nested Member Types [opt]

+ +

TypeSample [opt]

+ +

TypeValidations [opt]

+ +
    +
  • +

    Header-defined Named Type

    +
    # Person (object)
    +A person.
    +
    +## Properties
    +- `first_name`
    +- `last_name`
    +- address
    +    - city
    +    - street
    +
    +
  • +
  • +

    List-defined Member Type

    +
    - person (object) - A person
    +    - `first_name`
    +    - `last_name`
    +    - address
    +        - city
    +        - street
    +
    +

    or, equivalently:

    +
    - person (Person) - A person
    +
    +
  • +
+ +

2.1 Base Types

+ +

MSON defines a number of distinct base, case-insensitive Primitive and Structure Types from which all data +structures are built (sub-typed).

+ +

2.1.1 Primitive Types

+ +

Applies to basic data structure and type definitions. Types that are sub-typed from Primitive Types MUST NOT +contain a Member Type Group or Nested Member Types.

+ +
    +
  • +

    boolean

    + +

    Specifies a type with allowed values of true or false.

    +
  • +
  • +

    string

    + +

    Specifies any string.

    +
  • +
  • +

    number

    + +

    Specifies any number.

    +
  • +
+ +

2.1.2 Structure Types

+ +

Applies to recursive, composite data structure and type definitions. Types that are sub-typed from +Structure Types MAY contain a Member Type Group or Nested Member Types.

+ +

Structure Types may directly or indirectly contain recursive references to +themselves.

+ +
    +
  • +

    array

    + +

    Specifies a list of items for values.

    +
  • +
  • +

    enum

    + +

    Specifies an exclusive list of possible Values or Types for values.

    +
  • +
  • +

    object

    + +

    Specifies a structure that contains properties as members.

    +
  • +
+ +

2.2 Named Types

+ +

Users may extend Base Types to define new header-defined Named Types that MAY be referenced to build other +Types.

+ +

Named TypeNamed Declaration | Generic Named Declaration

+ +

Named TypeType Sections [opt]

+
# Person (object)
+- first_name
+- last_name
+
+

2.3 Member Types

+ +

Markdown lists specify MSON Member Types, which define the structure and types of individual +members of Types built from Structure Types. A Member Type that contains Nested Member Types +defines an inner, anonymous type that specifies the structure of values of that particular member.

+ +

2.3.1 Property Member Types

+ +

Define individual members of object type structures.

+ +

Property Member TypeProperty Member Declaration

+ +

Property Member TypeType Sections [opt]

+ +

Any list of Property Member Types collectively MAY define an implied parent object type structure.

+
- person (object) - A person
+    - `first_name`
+    - `last_name`
+    - address
+- company (string)
+
+

Defines a person Property Member Type with a value that is an explicit object type structure with members +first_name, last_name, and address and, at the same time, is a member together with company of another +implied object structure.

+ +

2.3.2 Value Member Types

+ +

Define individual members of array or enum type structures.

+ +

Value Member TypeValue Member Declaration

+ +

Value Member TypeType Sections [opt]

+
- (array)
+    - red (string) - A sample value
+    - green (string)
+
+

3 Type Declaration

+ +

Defines a particular MSON Type.

+ +

Type DeclarationNamed Declaration | Generic Named Declaration | Property Member Declaration | Value Member Declaration

+ +

3.1 Named Declaration

+ +

Defines a Named Type.

+ +

Named Declaration# Type NameType Definition [opt]

+
# Person (object)
+
+

3.1.1 Generic Named Declaration

+ +

Defines a Named Type that allows an italicized Variable Type Name to represent a Type Name +at any location in the Type Specification of a Variable Type Specification.

+ +

Generic Named Declaration# Type NameVariable Type Specification

+
# One or Many (enum[*T*])
+
+

3.2 Property Member Declaration

+ +

Defines a Property Member Type.

+ +

Property Member Declaration- Property Name : [opt] Value Definition [opt] - [opt] Description [opt]

+
- person (object) - A person
+
+

The optional : is only applicable in the case where a Value Definition is present and includes a Value.

+
- company: Apiary (string)
+
+

3.2.1 Property Name

+ +

Defines the name of a property in an object type structure.

+ +

Property NameLiteral Value | Variable Property Name

+
- customer (object)
+
+

Defines a Property Member Declaration with a Property Name "customer".

+ +

3.2.2 Variable Property Name

+ +

Defines a Property Name that is associated with a specific Value Definition in an object type structure +that MAY be any arbitrary name in an actual implementation. The Value of the Variable Property Name serves as +a sample.

+ +

Variable Property Name*Value Definition*

+ +

In the case of specifying a Variable Property Name, the Value Definition MAY reference a Named Type +that MUST be sub-typed from a string Primitive Type.

+
*rel (Custom String)* (object)
+
+

Where rel is a sample value for the arbitrary Property Name of a Property Member Declaration.

+ +

3.3 Value Member Declaration

+ +

Defines a Value Member Type. A Value Member Declaration MUST only be used to define structures of array +or enum Member Types.

+ +

Value Member Declaration- Value Definition - [opt] Description [opt]

+ +

The optional - is only applicable in the case where a Description is provided.

+
- (array)
+
+

3.4 Value Definition

+ +

Every Member Type MAY specify type information associated with values in a structure or member in a structure. +This includes a Value Definition that may include literal or sample Values and a Type Definition, including +a Type Specification and/or Type Attributes, of associated types.

+ +

Value DefinitionValue [opt] Type Definition [opt]

+ +

A Value Definition MUST include at least a Value or a Type Definition. A Value Definition of an +object Member Type MUST NOT specify a Value.

+
5, 6 (array)
+
+

Defines a Value Definition for an array type structure with sample values "5" and "6".

+ +

3.4.1 Value

+ +

Defines either sample or actual value(s) in Member Types based on the associated Type Definition in a +Value Definition.

+ +

ValueLiteral Value | Variable Value | Values List

+ +

Values ListValue | Value, Values List

+ +

A Values List MUST only be used with array or enum Structure Types or Named Types derived from them.

+ +

By default:

+ +
    +
  • A Value Definition that incorporates a Values List but has no Type Definition implies an +array type structure.
  • +
+
- list: 1, 2, 3
+
+

is equivalent to:

+
- list: 1, 2, 3 (array)
+
+

Where "1", "2", and "3" are sample values of the array structure.

+ +
    +
  • A Value Definition that incorporates a Values List defines fully-qualified values of an enum type structure.
  • +
+
- colors: red, green (enum)
+
+

Where "red" and "green" are fully-qualified values of the colors enumeration.

+ +

3.4.2 Literal Value

+ +

Literal value of a type instance. Some limitations apply (see Reserved Characters & Keywords).

+
5
+
+

3.4.3 Variable Value

+ +

Defines a Value that is not concrete using Markdown italics.

+ +

Variable Value*Literal Value*

+ +

A Variable Value MAY be used to indicate a Variable Property Name in a Property Member Declaration or +more generally, a sample value in a Value Definition.

+
*rel*
+
+

3.5 Type Definition

+ +

Explicitly specifies the type of a value in an MSON instance.

+ +

Type Definition(Type Specification [opt] , [opt] Type Attributes List [opt])

+ +

Type Attributes ListType Attribute | Type Attribute, Type Attributes List

+ +

A Type Definition MUST separate multiple items with commas and is order-independent.

+
(enum, optional)
+
+

3.5.1 Type Specification

+ +

Defines sub-typed Base Types or Types for a particular Type.

+ +

Type SpecificationType Name | Type Name[Nested Type Name List]

+ +

Nested Type Name ListType Name | Type Name, Nested Type Name List

+ +

An array or enum Value Definition MAY specify the Type Specifications of implied +Nested Member Types members in-line using [] as a Nested Type Name List.

+
array[number, string]
+
+

Indicates a array type structure MAY include distinct numbers or strings as values.

+ +
3.5.1.1 Variable Type Specification
+ +

Defines a variable Type Specification to indicate generic Named Types.

+ +

Variable Type SpecificationType Specification

+ +

A Variable Type Specification MUST include at least one Variable Type Name.

+
# One or Many (enum[*T*])
+
+

3.5.2 Type Name

+ +

References the name of a type in Base Types or Named Types. Some limitations apply (see +Reserved Characters & Keywords).

+ +

Type NameLiteral Value | Variable Type Name | Wildcard Type Name | Referenced Type Name

+ +

Referenced Type NameA valid Markdown-style link, where the link name MUST be a Literal Value

+ +

A Variable Type Name MUST only be used in two situations: +- As a Type Name in a Type Definition for a Generic Named Type. +- As an associated Type Name in Nested Member Types of the Generic Named Type.

+ +

A Referenced Type Name MAY be used to link to a Type Name defined in another location in an MSON document +solely as a navigation convenience.

+ +
3.5.2.1 Variable Type Name
+ +

An italicized variable that MAY be used in place of a Type Name for a Type Definition in a +Generic Named Declaration.

+ +

Variable Type Name*Literal Value*

+ +
3.5.2.2 Wildcard Type Name
+ +

Indicates any type MAY be possible.

+ +

Wildcard Type Name*

+ +

A Wildcard Type Name MAY only be used in a Type Specification for Member Types.

+ +

3.5.3 Type Attribute

+ +

Defines extra attributes associated with the implementation of a type.

+ +
    +
  • +required - instance of this type is required
  • +
  • +optional - instance of this type is optional (default)
  • +
  • +fixed - instance of this type structure and values are fixed. This attribute propagates to Nested Member Types.
  • +
  • +fixed-type - instance of this type structure is fixed, value is not. This attribute does not propagate to Nested Member Types.
  • +
  • +nullable - instance of this type Value MAY be unset (e.g. null or nil). nullable may only be used within properties of objects.
  • +
  • +sample - Alternate way to indicate a Value is a sample. See Sample.
  • +
  • +default - Alternate way to indicate a Value is a default. See Default.
  • +
+ +

A sample Type Attribute is mutually exclusive with default.

+ +

3.6 Description

+ +

Describes a Member Type in-line.

+ +

Description- Markdown-formatted text

+
- name: Andrew (string) - A Description
+
+

4 Type Sections

+ +

Types MAY contain any Block Description, Member Type Group, Nested Member Types, +Sample, Default and/or Validations Type Sections. Apart from a Block Description, multiple +Type Sections MAY be specified and MAY have any order.

+
# Person (object)
+An additional
+multi-line description
+
+- here
+- there
+
+## Sample
+...
+
+## Properties
+- `first_name`
+- `last_name`
+
+## Validations
+...
+
+## Sample
+Another ...
+
+

In general, Type Sections nested under: +- A Named Declaration MUST use header-defined (##) variations. +- A Property Member Declaration or Value Member Declaration MUST use list-defined (-) variations.

+ +

4.1 Block Description

+ +

Describes a Type using a nested (multi-line) Markdown text block.

+ +

Block DescriptionMarkdown-formatted text

+ +

A Block Description MUST be located directly under a Type Declaration and MUST start with text. Markdown lists +MAY be included in a Block Description after initial text content and are considered part of the block text.

+
- name: Andrew (string) - A Description
+
+    An additional
+    multi-line description.
+
+    - here
+    - there
+
+    More text.
+
+

Note that here and there are NOT Nested Member Types but rather are part of a Markdown list in the +Block Description.

+ +

A Member Types Block Description MUST escape Member Type Separator Keywords as a code span +when used in a Markdown list.

+
- person (object)
+    This person does not have:
+
+    - `Properties`
+        - first_name
+        - last_name
+
+    - Properties
+        - `given_name`
+        - surname
+
+

4.2 Member Type Group

+ +

A Member Type Group delineates Nested Member Types and MUST be used when other Type Sections are present.

+ +

Member Type Group- Member Type Separator | ## Member Type Separator

+ +

Member Type GroupNested Member Types

+ +

In order to specify Nested Member Types after a Block Description, Types MUST use an appropriate +Member Type Group to indicate the end of the Block Description and the beginning of a +Nested Member Types list.

+ +
    +
  • +

    Named Type

    + +

    A header-defined (##) Member Type Group SHOULD be nested one additional header level under the associated +Named Type, when required.

    +
    # Person (object)
    +An additional
    +multi-line description
    +
    +- here
    +- there
    +
    +## Properties
    +- `first_name`
    +- `last_name`
    +
    +
  • +
  • +

    Member Type

    + +

    A list-defined (-) Member Type Group SHOULD be nested one indentation level under the associated +Member Type.

    +
    - person (object)
    +
    +    An additional
    +    multi-line description
    +
    +    - here
    +    - there
    +
    +    - Properties
    +        - `first_name`
    +        - `last_name`
    +
    +
  • +
+ +

A Member Type Group of an appropriate type MUST be used to define Nested Member Types whenever any other +Type Section is specified at the same level.

+ + + +

4.2.1 Member Type Separator

+ +

Defines the names of separators to indicate the beginning of a section of Nested Member Types.

+ +

Member Type SeparatorItems | Members | Properties

+ +
    +
  • Array Structures - MUST use Items for a Member Type Separator

  • +
  • Enum Structures - MUST use Members for a Member Type Separator

  • +
  • Object Structures - MUST use Properties for a Member Type Separator

  • +
+ +

4.3 Nested Member Types

+ +

Types built from Structure Types MAY contain Nested Member Types, which are defined using nested Markdown +lists of allowed Member Types.

+ +

A Member Type that contains Nested Member Types defines an inner, anonymous type that specifies the structure +of values of that particular member.

+ +

Nested Member TypesMember Types

+ +

By Default:

+ +
    +
  • +

    Un-nested Member Types

    + +

    A Member Type that does not contain Nested Member Types and does not contain a Type Definition +implies a string Type Specification.

    +
    - count: 1
    +
    +

    Implies:

    +
    - count: 1 (string)
    +
    +
  • +
  • +

    Object Structures

    + +

    A Property Member Type without a Type Definition that contains Nested Member Types implies +an object type structure.

    +
    - address
    +    - city
    +    - state
    +
    +

    Implies:

    +
    - address (object)
    +    - city
    +    - state
    +
    +
  • +
  • +

    Array Structures

    + +

    A Member Type with an array Type Definition that contains Nested Member Types +specifies an array type structure that MAY contain items of the specified type and +sample values per the particular Value Definition.

    +
    - colors (array)
    +    - red (string)
    +    - 5 (number)
    +
    +

    Implies an array structure whose individual items MAY be strings or numbers with sample values "red" and 5, +respectively.

    +
  • +
  • +

    Enum Structures

    + +

    A Member Type with an enum Type Definition that contains Nested Member Types +specifies an enum type structure that MUST only contain items of the specified type and +values per the particular Value Definition.

    +
    - colors (enum)
    +    - red (string)
    +    - 5 (number)
    +
    +

    Implies a colors Property Member Type that MUST only have a value of the string "red" or the number 5.

    + +

    A Variable Value in a Nested Member Type under a enum type structure indicates an allowed type +with an associated sample value.

    +
    - colors (enum)
    +    - red (string)
    +    - *5* (number)
    +
    +

    Implies a colors Property Member Type that MUST have either the string "red" or any number as +a value, where "5" is a sample of a number value.

    +
  • +
  • +

    Named Types

    + +

    Nested Member Types MAY be nested directly under a Named Declaration when there are no other +Type Sections present.

    +
    # Person (object)
    +- `first_name`
    +- `last_name`
    +
    +
  • +
+ +

With a fixed Type Attribute:

+ +
    +
  • +

    If a Named Type or Member Type annotates its type as fixed, all Nested Member Types inherit +the fixed attribute as well.

    +
    - person (object, fixed)
    +    - name
    +
    +

    Implies:

    +
    - person (object, fixed)
    +    - name (fixed)
    +
    +
  • +
  • +

    An array based Named Type or Member Type MAY specify fixed to indicate the structure is a +"fixed ordered list" of only the specified values and/or types, if any, of its Nested Member Types.

    +
    - colors (array, fixed)
    +    - red
    +    - green
    +
    +

    Implies a fixed-list array structure that MUST only contain the two items "red" and "green" in that order.

    +
    - components (array, fixed)
    +    - (object)
    +    - (string)
    +
    +

    Implies a fixed-list array structure that MUST only contain the two items of an arbitrary object and string +in that order.

    +
  • +
  • +

    An object based Named Type or Member Type MAY specify fixed to indicate a "value object" where all +the properties MUST be present and the values of the properties MUST be the values specified, if any, in its +Nested Member Types. Further, such an object type structure MUST NOT contain any other properties.

    +
    - person (object, fixed)
    +    - `first_name`: Andrew
    +    - `last_name`: Smith
    +
    +

    Implies a "value object" that MUST contain only the properties "firstname" and "lastname" with the values +"Andrew" and "Smith", respectively.

    +
    - person (object, fixed)
    +    - `first_name`
    +    - `last_name`
    +
    +

    Implies an object that MUST contain only the properties "firstname" and "lastname", respectively.

    +
  • +
  • +

    Individual Nested Member Types MAY override inherited behavior from a fixed inherited type +by using an optional attribute and/or MAY indicate values are samples using a Variable Value.

    +
    - person (object, fixed)
    +    - `first_name`
    +    - `last_name` (optional)
    +
    +

    Implies a "value object" that MUST contain the property "firstname" and MAY contain the property +"lastname".

    +
    - colors (array, fixed)
    +    - red
    +    - *green*
    +
    +

    Implies an array type structure that MUST contain "red" as an item and MAY contain any other strings, where +"green" is a sample value.

    +
  • +
+ +

With a fixed-type Type Attribute:

+ +
    +
  • If a Named Type or Member Type annotates its type as fixed-type, Nested Member Types do not inherit +the fixed-type attribute.

  • +
  • +

    An array based Named Type or Member Type MAY specify fixed-type to indicate the structure +MUST contain items of the specified types only.

    +
    - colors (array, fixed-type)
    +    - red (string)
    +
    +

    Implies a fixed-list array structure that MUST only contain any string items; red is an example value.

    +
  • +
  • +

    An object based Named Type or Member Type MAY specify fixed-type to indicate an object where all +the properties MUST be present. Further, such an object type structure MUST NOT contain any other properties.

    +
    - person (object, fixed-type)
    +    - first_name: John
    +    - last_name: Smith
    +
    +

    Implies an object that MUST contain only the properties "firstname" and "lastname", respectively; +John and Smith are example values.

    +
  • +
+ +

4.4 Sample

+ +

Defines alternate sample Values for Member Types as a nested Markdown list with (multi-line) text.

+ +

Sample- Sample | - Sample : Value | ## Sample

+ +

SampleMarkdown-formatted text | Value Member Types

+ +

A Type MAY have multiple Sample lists.

+ +
    +
  • +

    Named Types

    + +

    A header-defined (##) Sample MUST be nested one additional header level under the associated +Named Type if a Block Description is used.

    +
    # Colors (array)
    +A list of colors
    +
    +## Sample
    +- red
    +
    +## Items
    +- (string)
    +
    +## Sample
    +- blue
    +- green
    +
    +

    A sample Type Attribute MUST NOT be used in the Type Definition of a Named Declaration.

    +
  • +
  • +

    Member Types

    + +

    A list-defined (-) Sample SHOULD be nested one indentation level under the associated +Member Type.

    +
    - colors (array)
    +  - Sample: red
    +  - Sample
    +      - blue
    +      - green
    +
    +

    A sample Type Attribute MAY be used to indicate a Value in a Value Member Type is a sample +value.

    +
    - list: 3, 4 (enum, sample)
    +
    +

    Is equivalent to:

    +
    - list: *3, 4* (enum)
    +
    +

    Which, is equivalent to:

    +
    - list (enum)
    +    - Sample
    +        - 3
    +        - 4
    +
    +
  • +
+ +

4.5 Default

+ +

Indicates Values for Member Types as a nested Markdown list with (multi-line) text are defaults.

+ +

Default- Default | - Default : Value | ## Default

+ +

DefaultMarkdown-formatted text | Value Member Types

+ +

A Type MAY have one Default Type Section. A Default for a Member Type MAY also indicate a +Sample.

+ +
    +
  • +

    Named Types

    + +

    A header-defined (##) Default MUST be nested one additional header level under the associated +Named Type if a Block Description is used.

    +
    # Colors (array)
    +A list of colors
    +
    +## Default
    +- red
    +
    +## Items
    +- (string)
    +
    +

    A default Type Attribute MUST NOT be used in the Type Definition of a Named Declaration.

    +
  • +
  • +

    Member Types

    + +

    A list-defined (-) default SHOULD be nested one indentation level under the associated +Member Type.

    +
    - colors (array)
    +  - Default: red
    +
    +

    A default Type Attribute MAY be used to indicate a Value in a Value Member Type is a default +value.

    +
    - list: 4 (enum, default)
    +    - 3
    +    - 4
    +
    +

    is equivalent to:

    +
    - list: 3, 4 (enum)
    +    - Default: 4
    +
    +
  • +
+ +

4.6 Validations

+ +

Reserved for future use.

+ +

5 Type Inheritance

+ +

A Member Type or Named Type that inherits from another Named Type also inherits any +Nested Member Types in the same order they are defined in the inherited Named Type and in order based +on the placement of the Mixin Type.

+
# Person (object)
+- `first_name`
+- `last_name`
+
+

And:

+
- person (Person)
+    - address
+
+

Implies the same structure as:

+
- person (object)
+    - `first_name`
+    - `last_name`
+    - address
+
+

Where the inherited Member Types from Person Named Type are listed first.

+ +

An object may not inherit from itself, either directly or indirectly.

+ +

5.1 Mixin Type

+ +

MSON defines a Mixin Type that supports multiple inheritance from another Named Type. The Named Type being inherited MUST be a Structure Type or its sub-type.

+ +

Nested Member Types defined in and inherited from the mixed-in Named Type are added at the same indentation level of the Mixin Type.

+ +

Mixin Type- Include Type Name | - Include Type Definition

+ +

Example 1

+
# Person (object)
+- `first_name`
+- `last_name`
+
+

And:

+
- `formal_person` (object)
+    - prefix: Mr
+    - Include Person
+
+

Implies the same structure as:

+
- `formal_person` (object)
+    - prefix: Mr
+    - `first_name`
+    - `last_name`
+
+

Example 2

+ +

Alternately:

+
- `formal_person` (object)
+    - Include Person
+    - prefix: Mr.
+
+

Implies the same structure as:

+
- `formal_person` (object)
+    - `first_name`
+    - `last_name`
+    - prefix: Mr.
+
+

A Mixin Type MUST use an appropriate Member Type Separator in a Member Type Group in order to specify +Nested Member Types after a Block Description.

+
- address (object)
+    An address
+
+    - Properties
+        - Include Address
+
+

5.2 One Of Type

+ +

MSON defines a One Of Type that can be used to describe mutually exclusive sets of Nested Member Types. A +One of Type MUST only be used to define Property Member Types for a object type structure.

+ +

One of Type- One Of

+ +

One of TypeMember Type Group

+ +

One of TypeNested Member Types

+ +

One of TypeMixin Type

+ +

One of TypeOne of Type

+
- `first_name`
+- One Of
+    - `last_name`
+    - One Of
+        - `given_name`: Smith
+        - `suffixed_name`: Smith, Sr.
+
+

Implies values with a structure of:

+
- `first_name`
+- `last_name`
+
+

Or:

+
- `first_name`
+- `given_name`: Smith
+
+

Or:

+
- `first_name`
+- `suffixed_name`: Smith, Sr.
+
+

A One Of Type MUST use a Properties Member Type Separator in a Member Type Group: +- In order to specify Nested Member Types after a Block Description.

+
```
+- address (object)
+    An address
+
+    - Properties
+        - One Of
+            - state
+            - province
+```
+
+
    +
  • +

    When it contains a Member Type Group.

    +
    - person (object)
    +    - One Of
    +        - `full_name`
    +        - Properties
    +            - `first_name`
    +            - `last_name`
    +
    +
  • +
+ +

5.3 Generic Named Type

+ +

Defines a Named Type that allows an italicized Variable Type Name to represent a Type Name +at any location in a Type Specification.

+ +

Generic Named TypeNamed Type

+ +

By default: +- A Named Type that contains at least one Variable Type Name is a Generic Named Type. +- A Variable Type Name in a Type Specification MAY only be used in the Type Definition of explicitly +defined Nested Member Types in the Generic Named Type and MUST NOT define any implied Nested Member Types.

+ +
    +
  • +

    Inherited type as a variable

    +
    # Address Decorator (*T*)
    +    - address
    +
    +# Person (object)
    +    - `first_name`
    +    - `last_name`
    +
    +

    And:

    +
    - `decorated_person` (Address Decorator(Person))
    +
    +

    Implies the same structure as:

    +
    - decorated_person (object)
    +    - `first_name`
    +    - `last_name`
    +    - address
    +
    +
  • +
  • +

    Type passed into explicitly defined Member Types

    +
    # One or Many (*S*[*T*, string])
    +- (*T*)
    +- (array[*T*])
    +
    +

    And:

    +
    - rel (One or Many(enum, object))
    +
    +

    Implies the same structure as:

    +
    - rel (enum)
    +    - (string)
    +    - (object)
    +    - array[object]
    +
    +
  • +
+ +

5.4 Member Type Precedence

+ +

Implementers of tooling for MSON structures SHOULD use an inheritance precedence such that the last redundant +Member Type specified in a list at the same indentation level appends or overrides a previously defined +Member Type.

+
# Person (object, fixed)
+- `first_name`
+- `last_name`
+- address (object)
+
+
    +
  • +

    Add/Override Attributes

    + +

    Example 1

    +
    - person (Person)
    +    - `last_name` (optional)
    +
    +

    Is literally the same as:

    +
    - person (object)
    +    - `first_name` (fixed)
    +    - `last_name` (fixed)
    +    - address (object, fixed)
    +    - `last_name` (optional)
    +
    +

    Which implies a structure the same as:

    +
    - person (object)
    +    - `first_name` (fixed)
    +    - `last_name` (optional)
    +    - address (object, fixed)
    +
    +

    Example 2

    +
    - person (object)
    +    - `first_name` (optional)
    +    - Include Person
    +
    +

    Is literally the same as:

    +
    - person (object)
    +    - `first_name` (optional)
    +    - `first_name` (fixed)
    +    - `last_name` (fixed)
    +    - address (object, fixed)
    +
    +

    Which implies a structure the same as:

    +
    - person (object)
    +    - `first_name` (fixed)
    +    - `last_name` (fixed)
    +    - address (object, fixed)
    +
    +

    Example 3

    +
    - person (object)
    +    - Include Person
    +    - `first_name` (optional)
    +
    +
    +

    Is literally the same as:

    +
    - person (object)
    +    - `first_name` (fixed)
    +    - `last_name` (fixed)
    +    - address (object, fixed)
    +    - `first_name` (optional)
    +
    +

    Implies a structure the same as:

    +
    - person (object)
    +    - `first_name` (optional)
    +    - `last_name` (fixed)
    +    - address (object, fixed)
    +
    +
  • +
  • +

    Add New Member Types

    +
    - person (Person)
    +    - citizenship
    +
    +

    Implies a structure the same as:

    +
    - person (object, fixed)
    +    - `first_name`
    +    - `last_name`
    +    - address (object)
    +    - citizenship
    +
    +
  • +
  • +

    Override Member Types

    +
    - person (object)
    +    - Include Person
    +    - address (string)
    +
    +

    Is literally the same as:

    +
    - person (object)
    +    - `first_name` (fixed)
    +    - `last_name` (fixed)
    +    - address (object, fixed)
    +    - address (string)
    +
    +

    Implies a structure the same as:

    +
    - person (object)
    +    - `first_name` (fixed)
    +    - `last_name` (fixed)
    +    - address (string)
    +
    +
  • +
+ +

6 Reserved Characters & Keywords

+ +

When using following characters or keywords in a Property Name, Literal Value or Type Name the name +or literal MUST be escaped in backticks `. Otherwise, a code span MAY be used for any arbitrary formatting +and has no specific meaning in an MSON document.

+ +

6.1 Characters

+ +

:, (,), <, >, {, }, [, ], _, *, -, +, `

+ +

6.2 Keywords

+ +

Property, Properties, Item, Items, Member, Members, Include, One of, Sample

+ +

Note keywords are case-insensitive.

+ +

6.3 Additional Keywords

+ +

Following keywords are reserved for future use:

+ +

Trait, Traits, Parameter, Parameters, Attribute, Attributes, Filter, Validation, Choice, Choices, +Enumeration, Enum, Object, Array, Element, Elements, Description

+ + +
+
+
+ + + +
+
+ + + + + + diff --git a/documentation/mson/tutorial.html b/documentation/mson/tutorial.html new file mode 100644 index 0000000..95a6646 --- /dev/null +++ b/documentation/mson/tutorial.html @@ -0,0 +1,209 @@ + + + + + + + + MSON Tutorial | API Blueprint + + + + + + + + + +
+
+
+ + +
+ +
+ + + + +
+
+ +
+
+ +
+

MSON Tutorial

+ + +

MSON is short for Markdown Syntax for Object Notation, and it's a way to represent data structures in a human readable plain text form. This tutorial will take you though the basics of MSON and how you can use MSON to describe a data structure.

+ +
+

NOTE: Additional MSON Resources

+ + +
+ +

Data structures in MSON

+ +

To get started, we're going to create a data structure in MSON to represent a Person which has a name.

+ +

A data structure to store a Person could be represented in MSON using the following:

+
# Person
+
++ name
+
+

Here we've declared our own named type called "Person". A heading is one or more # symbols followed by a string representing the name of our data structure. By default, named types like Person are object types.

+ +

An object is constructed with properties, and in this case we've listed them below the heading in a list. Lists are created by putting each list item on its own line and preceding each line with either a +, * or -.

+ +

In our Person data structure, we have a single property called name. Similarly to our Person definition, we can declare the type that our property is, with round brackets. For example, we can declare that our name is a string using + name (string). By default, properties on objects are string's unless specified to another type, as in our above example we have omitted the string type definition.

+ +

We can attach a description for our name property by following the type definition with a dash (-) followed by the description.

+
+ name (string) - The Person's name
+
+

We may also specify a sample value for the person's name by preceding the property name by a colon (:) and then the value.

+
+ name: Kyle (string) - The Person's name
+
+

NOTE: It's important to note, that if a sample value contains reserved characters such as :, (,), <, >, {, }, [, ], _, &ast;, -, +, ` then the sample value must be wrapped in a code-block using back-ticks:

+
+ name: `Spencer-Churchill` (string) - The Person's name
+
+

So far we have used the object and string types. MSON includes a total of 6 base types. Three of these base types are primitive types such as boolean, string and number. There are also three structure types called array, enum and object. Let's use some of these new types to create another data structure.

+
# Company
+
++ name: Apiary
++ founder (Person)
++ founded: 2011 (number) - The year in which the company was founded
+
+

Inheritance

+ +

When declaring a named type, you may also inherit from another type. For example, we could declare a data structure called "Administrator" which inherits from the Person type.

+
# Administrator (Person)
+
++ role (string) - The administrators role
+
+

When inheriting from another data structure, all of the parents properties will be inherited. For example, our Administrator structure will contain the name property from our previous definition.

+ +

Nesting

+ +

It's also possible to nest other data structures directly without a data structure instead of referencing another type as we have done above between our Company and Person.

+
# Company
+
++ name: Apiary
++ founder (Person)
++ founded: 2011 (number) - The year in which the company was founded
++ address
+    + street: 235 Ninth Street
+    + city: San Francisco
+    + state: California
+
+

In this example, we've declared a property called address which is a nested structure within our Company.

+ +

NOTE: In this case, since we have inline properties within our address property, the default type for the address is object instead of string.

+ +

Additional Learning

+ +

You can find more examples of MSON, along with additional information from the MSON Specification.

+ + +
+
+
+ + + +
+
+ + + + + + diff --git a/documentation/specification.html b/documentation/specification.html new file mode 100644 index 0000000..494eee8 --- /dev/null +++ b/documentation/specification.html @@ -0,0 +1,1839 @@ + + + + + + + + API Blueprint Specification | API Blueprint + + + + + + + + + +
+
+
+ + +
+ +
+ + + + +
+
+ +
+
+ +
+

API Blueprint Specification

+ + +
+ +

Author: z@apiary.io +Version: 1A9

+ +
+ +

Format 1A revision 9

+ +

I. API Blueprint Language

+ + + +

II. Sections Reference

+ +

Abstract

+ + + +

Section Basics

+ + + +

Going Further

+ + + +

III. Appendix

+ + + +
+ +


+ +

+ +

I. API Blueprint Language

+ +

+ +

Introduction

+ +

This documents is a full specification of the API Blueprint format. For a less +formal introduction to API Blueprint visit the +API Blueprint Tutorial or check some of the examples.

+ +

+ +

API Blueprint

+ +

API Blueprint is a documentation-oriented web API description language. The +API Blueprint is essentially a set of semantic assumptions laid on top of the +Markdown syntax used to describe a web API.

+ +

In addition to the regular Markdown syntax, API Blueprint conforms to the +GitHub Flavored Markdown syntax.

+ +

+ +

API Blueprint document

+ +

An API Blueprint document – a blueprint – is a plain text Markdown document +describing a Web API in whole or in part. The document is structured into +logical sections. Each section has its distinctive meaning, content and +position in the document.

+ +

General section definition and structure is discussed in detail later in the +Blueprint section chapter.

+ +

All of the blueprint sections are optional. However, when present, a section +must follow the API Blueprint document structure.

+ +

Blueprint document structure

+ + + +
+

NOTE: The number prior to a section name denotes the allowed number of +the section occurrences.

+ +

NOTE: Refer to Sections Reference for +description of a specific section type.

+
+ +

+ +

Blueprint section

+ +

A Section represents a logical unit of an API Blueprint. For example: an API +overview, a group of resources or a resource definition.

+ +

In general a section is defined using a keyword in a Markdown entity. +Depending on the type of section the keyword is written either as a Markdown +header entity or in a list item entity.

+ +

A section definition may also contain additional variable components such +as its identifier and additional modifiers.

+ +
+

NOTE: There are two special sections that are recognized by their +position in the document instead of a keyword: The Metadata section and +the API Name & Overview section. Refer to the respective section entry +for details on its definition.

+
+ +

Example: Header-defined sections

+
# <keyword>
+
+ ...
+
+# <keyword>
+
+ ...
+
+
+

NOTE: While this specification uses "atx"-style headers (using #s) + you can also use "Setext" header syntax interchangeably:

+
<keyword>
+=========
+
+...
+
+<keyword>
+=========
+
+...
+
+
+ +

Example: List-defined sections

+
+ <keyword>
+
+ ...
+
++ <keyword>
+
+ ...
+
+
+

NOTE: While this specification uses pluses (+) as list markers you can +use any Markdown list syntax using asterisks (*), pluses (+) and +hyphens (-) interchangeably:

+
* <keyword>
+
+...
+
+- <keyword>
+
+...
+
+
+ +

+ +

Section types

+ +

There are several types of API Blueprint sections. You can find the complete +listing of the section types in the +Section Reference.

+ +

The Blueprint section chapter discusses the section syntax in general. +A specific section type may conform only to some parts of this general syntax. +Always refer for respective section reference for details on its syntax.

+ +

+ +

Section structure

+ +

A general structure of an API Blueprint section defined by a keyword +includes an identifier (name), section description and nested +sections or a specifically formatted content.

+ +

Example: Header-defined section structure

+
# <keyword> <identifier>
+
+<description>
+
+<specific content>
+
+<nested sections>
+
+

Example: List-defined section structure

+
+ <keyword> <identifier>
+
+    <description>
+
+    <specific content>
+
+    <nested sections>
+
+

+ +

Keywords

+ +

Following reserved keywords are used in section definitions:

+ +

Header keywords

+ +
    +
  • Group
  • +
  • Data Structures
  • +
  • +HTTP methods (e.g. GET, POST, PUT, DELETE...)
  • +
  • +URI templates (e.g. /resource/{id})
  • +
  • Combinations of an HTTP method and URI Template (e.g. GET /resource/{id})
  • +
+ +

List keywords

+ +
    +
  • Request
  • +
  • Response
  • +
  • Body
  • +
  • Schema
  • +
  • Model
  • +
  • +Header & Headers +
  • +
  • +Parameter & Parameters +
  • +
  • Values
  • +
  • +Attribute & Attributes +
  • +
  • Relation
  • +
+ +
+

NOTE: Avoid using these keywords in other Markdown headers or lists

+ +

NOTE: With the exception of HTTP methods keywords the section keywords +are case insensitive.

+
+ +

+ +

Identifier

+ +

A section definition may or must include an identifier of the section. +An identifier is any non-empty combination of any character except [, ], +(, ) and newline characters.

+ +

An identifier must not contain any of the keywords.

+ +

Example

+
Adam's Message 42
+
+
my-awesome-message_2
+
+

+ +

Description

+ +

A section description is any arbitrary Markdown-formatted content following the +section definition.

+ +

It is possible to use any Markdown header or list item in a section description +as long as it does not clash with any of the +reserved keywords.

+ +
+

NOTE: It is considered good practice to keep the header level nested +under the actual section.

+
+ +

+ +

Nested sections

+ +

A section may contain another nested section(s).

+ +

Depending on the nested section type, to nest a section simply increase its +header level or its list item indentation. Anything between the section start +and the start of following section at the same level is considered to be part +of the section.

+ +

What sections can be nested and where depends upon the section in case, as +described in the relevant section's entry.

+ +

Example: Nested header-defined section

+
# <section definition>
+
+ ...
+
+## <nested section definition>
+
+ ...
+
+

Example: Nested list-defined section

+
+ <section definition>
+
+     ...
+
+    + <nested section definition>
+
+     ...
+
+
+

NOTE: While not necessary it is a good habit to increase the level of a +nested section markdown-header.

+ +

NOTE: A markdown-list section is always considered to be nested under the +preceding markdown-header section.

+
+ +
+ +

+ +

II. Sections Reference

+ +
+

NOTE: Sections marked as "Abstract" serve as a base for other sections +and as such they cannot be used directly.

+
+ +

Abstract

+ +

+ +

Named section

+ +
    +
  • Abstract
  • +
  • +Parent sections: vary, see descendants
  • +
  • +Nested sections: vary, see descendants
  • +
  • +Markdown entity: header, list
  • +
  • +Inherits from: none
  • +
+ +

Definition

+ +

Defined by a keyword followed by an optional section name - +identifier in a Markdown header or list entity.

+
# <keyword> <identifier>
+
+
+ <keyword> <identifier>
+
+

Description

+ +

Named section is the base section for most of the API Blueprint sections. It +conforms to the general section and as such it is +composed of a section name (identifier), description and nested sections or +specific formatted content (see descendants descriptions).

+ +

Example

+
# <keyword> Section Name
+This the `Section Name` description.
+
+- one
+- **two**
+- three
+
+<nested sections> |  <formatted content>
+
+
+ +

+ +

Asset section

+ +
    +
  • Abstract
  • +
  • +Parent sections: vary, see descendants
  • +
  • +Nested sections: none
  • +
  • +Markdown entity: list
  • +
  • +Inherits from: none
  • +
+ +

Definition

+ +

Defined by a keyword in Markdown list entity.

+
+ <keyword>
+
+

Description

+ +

The asset section is the base section for atomic data in API Blueprint. The content +of this section is expected to be a +pre-formatted code block.

+ +

Example

+
+ <keyword>
+
+        {
+            "message": "Hello"
+        }
+
+

Example: Fenced code blocks

+
+ <keyword>
+
+    ```
+    {
+        "message": "Hello"
+    }
+    ```
+
+
+ +

+ +

Payload section

+ + + +

Definition

+ +

Defined by a keyword in Markdown list entity. The keyword may be followed by identifier. +The definition may include payload's media-type enclosed in braces.

+
+ <keyword> <identifier> (<media type>)
+
+
+

NOTE: Refer to descendant for the particular section type definition.

+
+ +

Description

+ +

Payload sections represent the information transferred as a payload of an HTTP +request or response messages. A Payload consists of optional meta information +in the form of HTTP headers and optional content in the form of an HTTP body.

+ +

Furthermore, in API Blueprint context, a payload includes its description, +description of its message-body attributes and a message-body validation +schema.

+ +

A payload may have its media type associated. A payload's media type +represents the metadata received or sent in the form of a HTTP Content-Type +header. When specified a payload should include nested +Body section.

+ +

This section should include at least one of the following nested sections:

+ + + +

If there is no nested section the content of the payload section is considered +as content of the Body section.

+ +

Relation of Body, Schema and Attributes sections

+ +

Each of body, schema and attributes sections describe a message payload's body. +These descriptions should be consistent, not violating each other. When +multiple body descriptions are provided they should be prioritized as +follows:

+ +
    +
  1. +

    For resolving message-body schema

    + +
      +
    1. Schema section
    2. +
    3. Attributes section
    4. +
    5. Body section
    6. +
    +
  2. +
  3. +

    For resolving message-body example

    + +
      +
    1. Body section
    2. +
    3. Attributes section
    4. +
    5. Schema section
    6. +
    +
  4. +
+ +

Referencing

+ +

Instead of providing a payload section content, a +model payload section can be referenced using the +Markdown implicit reference syntax:

+
[<identifier>][]
+
+

Example

+
+ <keyword> Payload Name (application/json)
+
+    This the `Payload Name` description.
+
+    + Headers
+
+     ...
+
+    + Body
+
+     ...
+
+    + Schema
+
+    ...
+
+

Example: Referencing model payload

+
+ <keyword> Payload Name
+
+    [Resource model identifier][]
+
+
+ +

Section Basics

+ +

+ +

Metadata section

+ +
    +
  • +Parent sections: none
  • +
  • +Nested sections: none
  • +
  • +Markdown entity: special
  • +
  • +Inherits from: none
  • +
+ +

Definition

+ +

Key-value pairs. Each key is separated from its value by a colon (:). One +pair per line. Starts at the beginning of the document and ends with the first +Markdown element that is not recognized as a key-value pair.

+ +

Description

+ +

Metadata keys and their values are tool-specific. Refer to relevant tool +documentation for the list of supported keys.

+ +

Example

+
FORMAT: 1A
+HOST: http://blog.acme.com
+
+
+ +

+ +

API name & overview section

+ +
    +
  • +Parent sections: none
  • +
  • +Nested sections: none
  • +
  • +Markdown entity: special, header
  • +
  • +Inherits from: Named section +
  • +
+ +

Definition

+ +

Defined by the first Markdown header in the blueprint document, unless it +represents another section definition.

+ +

Description

+ +

Name and description of the API

+ +

Example

+
# Basic ACME Blog API
+Welcome to the **ACME Blog** API. This API provides access to the **ACME
+Blog** service.
+
+
+ +

+ +

Resource group section

+ + + +

Definition

+ +

Defined by the Group keyword followed by group name (identifier):

+
# Group <identifier>
+
+

Description

+ +

This section represents a group of resources (Resource Sections). May +include one or more nested Resource Sections.

+ +

Example

+
# Group Blog Posts
+
+## Resource 1 [/resource1]
+
+ ...
+
+# Group Authors
+Resources in this groups are related to **ACME Blog** authors.
+
+## Resource 2 [/resource2]
+
+ ...
+
+
+ +

+ +

Resource section

+ + + +

Definition

+ +

Defined by an URI template:

+
# <URI template>
+
+

-- or --

+ +

Defined by a resource name (identifier) followed by an +URI template enclosed in square brackets [].

+
# <identifier> [<URI template>]
+
+

-- or --

+ +

Defined by an HTTP request method followed by URI template:

+
# <HTTP request method> <URI template>
+
+

-- or --

+ +

Defined by a resource name (identifier) followed by an +HTTP request method and an URI template enclosed +in square brackets []:

+
# <identifier> [<HTTP request method> <URI template>]
+
+
+

NOTE: In the latter two cases the rest of this section represents the +Action section including its description and nested +sections and follows the rules of the Action section instead.

+
+ +

Description

+ +

An API resource as specified by +its URI or a set of resources (a resource template) matching its URI +template.

+ +

This section should include at least one nested +Action section and may include following nested +sections:

+ + + +
+

NOTE: A blueprint document may contain multiple sections for the same +resource (or resource set), as long as their HTTP methods differ. However it +is considered good practice to group multiple HTTP methods under one resource +(resource set).

+
+ +

Example

+
# Blog Posts [/posts/{id}]
+Resource representing **ACME Blog** posts.
+
+
# /posts/{id}
+
+
# GET /posts/{id}
+
+
+ +

+ +

Resource model section

+ + + +

Definition

+ +

Defined by the Model keyword followed by an optional media type:

+
+ Model (<media type>)
+
+

Description

+ +

A resource manifestation - one +exemplary representation of the resource in the form of a +payload.

+ +

Referencing

+ +

The payload defined in this section may be referenced in any response or +request section in the document using parent section's identifier. You can +refer to this payload in any of the following Request +or Response payload sections using the Markdown +implicit reference syntax.

+ +

Example

+
# My Resource [/resource]
+
++ Model (text/plain)
+
+        Hello World
+
+## Retrieve My Resource [GET]
+
++ Response 200
+
+    [My Resource][]
+
+
+ +

+ +

Schema section

+ + + +

Definition

+ +

Defined by the Schema keyword in Markdown list entity.

+
+ Schema
+
+

Description

+ +

Specifies a validation schema for the HTTP message-body of parent payload section.

+ +

Example

+ +

Following example uses Body section to provide an example of an application/json payload, and Schema section to provide a JSON Schema describing all possible valid shapes of the payload.

+
## Retrieve a Message [GET]
+
++ Response 200 (application/json)
+    + Body
+
+            {"message": "Hello world!"}
+
+    + Schema
+
+            {
+                "$schema": "http://json-schema.org/draft-04/schema#",
+                "type": "object",
+                "properties": {
+                    "message": {
+                        "type": "string"
+                    }
+                }
+            }
+
+
+ +

+ +

Action section

+ + + +

Definition

+ +

Defined by an HTTP request method:

+
## <HTTP request method>
+
+

-- or --

+ +

Defined by an action name (identifier) followed by an +HTTP request method enclosed in square brackets [].

+
## <identifier> [<HTTP request method>]
+
+

-- or --

+ +

Defined by an action name (identifier) followed by an +HTTP request method and +URI template enclosed in square brackets [].

+
## <identifier> [<HTTP request method> <URI template>]
+
+

Description

+ +

Definition of at least one complete HTTP transaction as performed with the +parent resource section. An action section may consist of multiple HTTP +transaction examples for the given HTTP request method.

+ +

This section may include one nested +URI parameters section describing any URI +parameters specific to the action – URI parameters discussed in the scope of +an Action section apply to the respective Action section ONLY.

+ +

This section may include one nested Attributes section defining the +input (request) attributes of the section. If present, these attributes +should be inherited in every Action's Request section unless specified +otherwise.

+ +

Action section should include at least one nested +Response section and may include additional nested +Request and Response sections.

+ +

Nested Request and Response sections may be ordered into groups where each +group represents one transaction example. The first transaction example group +starts with the first nested Request or Response section. Subsequent groups +start with the first nested Request section following a Response section.

+ +

Multiple Request and Response nested sections within one transaction example +should have different identifiers.

+ +

Example

+
# Blog Posts [/posts{?limit}]
+ ...
+
+## Retrieve Blog Posts [GET]
+Retrieves the list of **ACME Blog** posts.
+
++ Parameters
+    + limit (optional, number) ... Maximum number of posts to retrieve
+
++ Response 200
+
+        ...
+
+## Create a Post [POST]
+
++ Attributes
+
+        ...
+
++ Request
+
+        ...
+
++ Response 201
+
+        ...
+
+## Delete a Post [DELETE /posts/{id}]
+
++ Parameters
+    + id (string) ... Id of the post
+
++ Response 204
+
+

Example Multiple Transaction Examples

+
# Resource [/resource]
+## Create Resource [POST]
+
++ request A
+
+        ...
+
++ response 200
+
+        ...
+
++ request B
+
+        ...
+
++ response 200
+
+        ...
+
++ response 500
+
+        ...
+
++ request C
+
+        ...
+
++ request D
+
+        ...
+
++ response 200
+
+        ...
+
+
+

NOTE: The "Multiple Transaction Examples" example demonstrates three +transaction examples for one given action:

+ +
    +
  1. 1st example: request A, response 200 +
  2. +
  3. 2nd example: request B, responses 200 and 500 +
  4. +
  5. 3rd example: requests C and D, response 200 +
  6. +
+
+ +
+ +

+ +

Request section

+ + + +

Definition

+ +

Defined by the Request keyword followed by an optional identifier:

+
+ Request <identifier> (<Media Type>)
+
+

Description

+ +

One HTTP request-message example – payload.

+ +

Example

+
+ Request Create Blog Post (application/json)
+
+        { "message" : "Hello World." }
+
+
+ +

+ +

Response section

+ + + +

Definition

+ +

Defined by the Response keyword. The response section definition should +include an HTTP status code as its identifier.

+
+ Response <HTTP status code> (<Media Type>)
+
+

Description

+ +

One HTTP response-message example – payload.

+ +

Example

+
+ Response 201 (application/json)
+
+            { "message" : "created" }
+
+
+ +

+ +

URI parameters section

+ + + +

Definition

+ +

Defined by the Parameters keyword written in a Markdown list item:

+
+ Parameters
+
+

Description

+ +

Discussion of URI parameters in the scope of the parent section.

+ +

This section must be composed of nested list items only. This section +must not contain any other elements. Each list item describes a single URI +parameter. The nested list items subsections inherit from the +Named section and are subject to additional formatting as +follows:

+
+ <parameter name>: `<example value>` (<type> | enum[<type>], required | optional) - <description>
+
+    <additional description>
+
+    + Default: `<default value>`
+
+    + Members
+        + `<enumeration value 1>`
+        + `<enumeration value 2>`
+        ...
+        + `<enumeration value N>`
+
+

Where:

+ +
    +
  • +<parameter name> is the parameter name as written in +Resource Section's URI (e.g. "id").
  • +
  • +<description> is any optional Markdown-formatted description of the +parameter.
  • +
  • +<additional description> is any additional optional Markdown-formatted +description of the parameter.
  • +
  • +<default value> is an optional default value of the parameter – a value +that is used when no value is explicitly set (optional parameters only).
  • +
  • +<example value> is an optional example value of the parameter (e.g. 1234).
  • +
  • +<type> is the optional parameter type as expected by the API (e.g. +"number", "string", "boolean"). "string" is the default.
  • +
  • +Members is the optional enumeration of possible values. +<type> should be surrounded by enum[] if this is present. +For example, if enumeration values are present for a parameter whose type is +number, then enum[number] should be used instead of number to.
  • +
  • +<enumeration value n> represents an element of enumeration type.
  • +
  • +required is the optional specifier of a required parameter +(this is the default)
  • +
  • +optional is the optional specifier of an optional parameter.
  • +
+ +
+

NOTE: This section should only contain parameters that are specified +in the parent's resource URI template, and does not have to list every URI +parameter.

+
+ +

Example

+
# GET /posts/{id}
+
+
+ Parameters
+    + id - Id of a post.
+
+
+ Parameters
+    + id (number) - Id of a post.
+
+
+ Parameters
+    + id: `1001` (number, required) - Id of a post.
+
+
+ Parameters
+    + id: `1001` (number, optional) - Id of a post.
+        + Default: `20`
+
+
+ Parameters
+    + id (enum[string])
+
+        Id of a Post
+
+        + Members
+            + `A`
+            + `B`
+            + `C`
+
+
+ +

+ +

Attributes Section

+ + + +

Definition

+ +

Defined by the Attributes keyword followed by an optional +MSON Type Definition enclosed in parentheses.

+
+ Attributes <Type Definition>
+
+

<Type Definition> is the type definition of the data structure being +described. If the <Type Definition> is not specified, an object base type +is assumed. See MSON Type Definition for details.

+ +
Example
+
+ Attributes (object)
+
+

Description

+ +

This section describes a data structure using the +Markdown Syntax for Object Notation (MSON). +Based on the parent section, the data structure being described is one of the +following:

+ +
    +
  1. Resource data structure attributes (Resource section)
  2. +
  3. Action request attributes (Action section)
  4. +
  5. Payload message-body attributes (Payload section)
  6. +
+ +

Data structures defined in this section may refer to any arbitrary data +structures defined in the Data Structures section as +well as to any data structures defined by a named resource attributes +description (see below).

+ +

Resource Attributes description

+ +

Description of the resource data structure.

+ +

If defined in a named Resource section, this data +structure may be referenced by other data structures using the resource +name.

+ +
Example
+
# Blog Post [/posts/{id}]
+Resource representing **ACME Blog** posts.
+
++ Attributes
+    + id (number)
+    + message (string) - The blog post article
+    + author: john@appleseed.com (string) - Author of the blog post
+
+
+

NOTE: This data structure can be later referred as:

+
+ Attributes (Blog Post)
+
+
+ +

Action Attributes description

+ +

Description of the default request message-body data structure.

+ +

If defined, all the Request sections of the respective +Action section inherits these attributes unless +specified otherwise.

+ +
Example
+
## Create a Post [POST]
+
++ Attributes
+    + message (string) - The blog post article
+    + author: john@appleseed.com (string) - Author of the blog post
+
++ Request (application/json)
+
++ Request (application/yaml)
+
++ Response 201
+
+

Payload Attributes description

+ +

Description of payload (request, response, model) message-body attributes.

+ +

Not every attribute has to be described. However, when an attribute is +described, it should appear in the respective +Body section example, if a Body section is provided.

+ +

If defined, the Body section may be omitted and the +example representation should be generated from the attributes description.

+ +

The description of message-body attributes may be used to describe +message-body validation if no Schema section is +provided. When a Schema section is provided, the attributes description +should conform to the schema.

+ +
Example
+
## Retrieve a Post [GET]
+
++ Response 200 (application/json)
+
+    + Attributes (object)
+        + message (string) - Message to the world
+
+    + Body
+
+            { "message" : "Hello World." }
+
+
+ +

+ +

Headers section

+ +
    +
  • +Parent sections: Payload section +
  • +
  • +Nested sections: none
  • +
  • +Markdown entity: list
  • +
  • +Inherits from: none
  • +
+ +

Definition

+ +

Defined by the Headers keyword in Markdown list entity.

+
+ Headers
+
+

Description

+ +

Specifies the HTTP message-headers of the parent payload section. The content +this section is expected to be a pre-formatted code block +with the following syntax:

+
<HTTP header name>: <value>
+
+

One HTTP header per line.

+ +

Example

+
+ Headers
+
+        Accept-Charset: utf-8
+        Connection: keep-alive
+        Content-Type: multipart/form-data, boundary=AaB03x
+
+
+ +

+ +

Body section

+ + + +

Definition

+ +

Defined by the Body keyword in Markdown list entity.

+
+ Body
+
+

Description

+ +

Specifies the HTTP message-body of a payload section.

+ +

Example

+
+ Body
+
+        {
+            "message": "Hello"
+        }
+
+
+ +

+ +

Data Structures section

+ +
    +
  • +Parent sections: none
  • +
  • +Nested sections: MSON Named Type definition (see below)
  • +
  • +Markdown entity: header
  • +
  • +Inherits from: none
  • +
+ +

Definition

+ +

Defined by the Data Structures keyword.

+
# Data Structures
+
+

Description

+ +

This section holds arbitrary data structures definitions defined in the form of +MSON Named Types.

+ +

Data structures defined in this section may be used in any Attributes section. +Similarly, any data structures defined in a Attributes section of a named +Resource Section may be used in a data structure definition.

+ +

Refer to the MSON specification for full details on how to define an MSON Named type.

+ +

Example

+
# Data Structures
+
+## Message (object)
+
++ text (string) - text of the message
++ author (Author) - author of the message
+
+## Author (object)
+
++ name: John
++ email: john@appleseed.com
+
+

Example reusing Data Structure in Resource

+
# User [/user]
+
++ Attributes (Author)
+
+# Data Structures
+
+## Author (object)
+
++ name: John
++ email: john@appleseed.com
+
+

Example reusing Resource-defined Data Structure

+
# User [/user]
+
++ Attributes
+    + name: John
+    + email: john@appleseed.com
+
+# Data Structures
+
+## Author (User)
+
+
+ +

+ +

Relation section

+ +
    +
  • +Parent sections: Action section +
  • +
  • +Nested Sections: none
  • +
  • +Markdown entity: list
  • +
  • +Inherits from: none
  • +
+ +

Definition

+ +

Defined by the Relation keyword written in a Markdown list item followed by a +colon (:) and a link relation identifier.

+
+ Relation: <link relation identifier>
+
+

Description

+ +

This section specifies a link relation type +for the given action as specified by RFC 5988.

+ +
+

NOTE: The link relation identifiers should be unique per resource in the blueprint document.

+
+ +

Example

+
# Task [/tasks/{id}]
+
++ Parameters
+    + id
+
+## Retrieve Task [GET]
+
++ Relation: task
++ Response 200
+
+        { ... }
+
+## Delete Task [DELETE]
+
++ Relation: delete
++ Response 204
+
+
+ +


+ +

+ +

III. Appendix

+ +

+ +

URI Templates

+ +

The API Blueprint uses a subset of RFC6570 to define a resource URI Template.

+ +

URI Path Segment

+ +

At its simplest form – without any variables – a path segment of an +URI Template is identical to an URI path segment:

+
/path/to/resources/42
+
+

URI Template Variable

+ +

Variable names are case-sensitive. The variable name may consists of following +characters only:

+ +
    +
  • ASCII alpha numeric characters (a-z, A-Z)
  • +
  • Decimal digits (0-9)
  • +
  • _
  • +
  • +Percent-encoded characters
  • +
  • .
  • +
+ +

Multiple variables are separated by the comma without any leading or +trailing spaces. A variable(s) must be enclosed in braces – {} +without any additional leading or trailing whitespace.

+ +

Operators

+ +

The first variable in the braces might be preceded by an operator. +API Blueprint currently supports the following operators:

+ +
    +
  • +#fragment identifier operator
  • +
  • ++reserved value operator
  • +
  • +?form-style query operator
  • +
  • +&form-style query continuation operator
  • +
+ +

Examples

+
{var}
+{var1,var2,var3}
+{#var}
+{+var}
+{?var}
+{?var1,var2}
+{?%24var}
+{&var}
+
+
+

NOTE: The explode variable modifier is also supported. +Refer to RFC6570 for its description.

+
+ +

Variable Reserved Values

+ +

Following characters are reserved in variable values:

+ +

: / / / ? / # / [ / ] / @ / ! / $ / & / ' / ( / ) / * / + / , / ; / =

+ +

Path Segment Variable

+ +

Simple path segment component variable is defined without any operator:

+
/path/to/resources/{var}
+
+

With var := 42 the expansion is /path/to/resources/42.

+ +
+

NOTE: RFC6570 – Level 1

+
+ +

Fragment Identifier Variable

+ +

URI Template variables for fragment identifiers are defined using the +crosshatch (#) operator:

+
/path/to/resources/42{#var}
+
+

With var := my_id the expansion is /path/to/resources/42#my_id.

+ +
+

NOTE: RFC6570 – Level 2

+
+ +

Variable with Reserved Characters Values

+ +

To define URI Template variables with reserved URI characters, +use the plus (+) operator:

+
/path/{+var}/42
+
+

With var := to/resources the expansion is /path/to/resources/42.

+ +
+

NOTE: RFC6570 – Level 2

+
+ +

Form-style Query Variable

+ +

To define variables for a form-style query use the question mark (?) operator

+
/path/to/resources/{varone}{?vartwo}
+
+

With varone := 42 and vartwo = hello the expansion is /path/to/resources/42?vartwo=hello.

+ +

To continue a form-style query use the ampersand (&) operator:

+
/path/to/resources/{varone}?path=test{&vartwo,varthree}
+
+

With varone := 42, vartwo = hello, varthree = 1024 the expansion is /path/to/resources/42?path=test&vartwo=hello&varthree=1024.

+ +
+

NOTE: RFC6570 – Part of Level 3

+
+ +
+ + +
+
+
+ + + +
+
+ + + + + + diff --git a/documentation/tutorial.html b/documentation/tutorial.html new file mode 100644 index 0000000..29c2811 --- /dev/null +++ b/documentation/tutorial.html @@ -0,0 +1,388 @@ + + + + + + + + API Blueprint Tutorial | API Blueprint + + + + + + + + + +
+
+
+ + +
+ +
+ + + + +
+
+ +
+
+ +
+

API Blueprint Tutorial

+ + +

Welcome to an API Blueprint Tutorial! This tutorial will take you through the +basics of the API Blueprint language. We’re going to build an API blueprint +step by step for a service called Polls – a simple API allowing consumers to +view polls and vote in them. You can take a look at the +full version of the blueprint used in this tutorial for +reference.

+ +
+

Note: Additional API Blueprint Resources

+ + +
+ +

API Blueprint

+ +

The first step for creating a blueprint is to specify the API Name and +metadata. This step looks as follows:

+
FORMAT: 1A
+
+# Polls
+
+Polls is a simple API allowing consumers to view polls and vote in them.
+
+

Metadata

+ +

The blueprint starts with a metadata section. In this case we have specified +that FORMAT has the value of 1A. The format keyword denotes the version of +the API Blueprint.

+ +

API Name & Description

+ +

The first heading in the blueprint serves as the name of your API, which in +this case is "Polls". Headings start with one or more # symbols followed by a +title. The API Name here uses one hash to distinguish it as the first level. +The number of # you use will determine the level of the heading.

+ +

Following the heading is a description of the API. You may use further headings +to break up the description section.

+ +

Resource Groups

+ +

Now it's time to start documenting the API resources. Using the Group keyword +at the start of a heading, we've created a group of related resources.

+
# Group Questions
+
+Resources related to questions in the API.
+
+

Resource

+ +

Within the questions resource group, we have a resource called "Question +Collection". This resource allows you to view a list of questions. The heading +specifies the URI used to access the resource inside of square brackets at the +end of the heading.

+
## Question Collection [/questions]
+
+

Actions

+ +

API Blueprint allows you to specify each action you may make on a resource. An +action is specified with a sub-heading inside of a resource with the name of +the action followed by the HTTP method.

+
### List All Questions [GET]
+
+

An action should include at least one response from the server which must +include a status code and may contain a body. A response is defined as a list +item within an action. Lists are created by preceding list items with either a ++, * or -.

+ +

This action returns a 200 status code along with a JSON body.

+
+ Response 200 (application/json)
+
+        [
+            {
+                "question": "Favourite programming language?",
+                "published_at": "2014-11-11T08:40:51.620Z",
+                "url": "/questions/1",
+                "choices": [
+                    {
+                        "choice": "Swift",
+                        "url": "/questions/1/choices/1",
+                        "votes": 2048
+                    }, {
+                        "choice": "Python",
+                        "url": "/questions/1/choices/2",
+                        "votes": 1024
+                    }, {
+                        "choice": "Objective-C",
+                        "url": "/questions/1/choices/3",
+                        "votes": 512
+                    }, {
+                        "choice": "Ruby",
+                        "url": "/questions/1/choices/4",
+                        "votes": 256
+                    }
+                ]
+            }
+        ]
+
+
+

Note: Specifying the media type after the response status code generates +a Content-Type HTTP header. You do not have to explicitly specify the +Content-Type header.

+
+ +

The polls resource has a second action which allows you to create a new +question. This action includes a description showing the structure you would +send to the server to perform this action.

+
### Create a New Question [POST]
+
+You may create your own question using this action. It takes a JSON object
+containing a question and a collection of answers in the form of choices.
+
++ question (string) - The question
++ choices (array[string]) - A collection of choices.
+
+

This action takes a JSON payload as part of the request as follows:

+
+ Request (application/json)
+
+            {
+                "question": "Favourite programming language?",
+                "choices": [
+                    "Swift",
+                    "Python",
+                    "Objective-C",
+                    "Ruby"
+                ]
+            }
+
+

This example returns a 201 status code, along with HTTP headers and a body.

+
+ Response 201 (application/json)
+
+    + Headers
+
+            Location: /questions/1
+
+    + Body
+
+                {
+                    "question": "Favourite programming language?",
+                    "published_at": "2014-11-11T08:40:51.620Z",
+                    "url": "/questions/1",
+                    "choices": [
+                        {
+                            "choice": "Swift",
+                            "url": "/questions/1/choices/1",
+                            "votes": 0
+                        }, {
+                            "choice": "Python",
+                            "url": "/questions/1/choices/2",
+                            "votes": 0
+                        }, {
+                            "choice": "Objective-C",
+                            "url": "/questions/1/choices/3",
+                            "votes": 0
+                        }, {
+                            "choice": "Ruby",
+                            "url": "/questions/1/choices/4",
+                            "votes": 0
+                        }
+                    ]
+                }
+
+

The next resource is “Question”, which represents a single question.

+
## Question [/questions/{question_id}]
+
+

URI Template

+ +

The URI for the “Question” resource uses a variable component, expressed by +URI Template. In this case, there is an ID variable called question_id, +represented in the URI template as {question_id}.

+ +

+ +

URI Parameters

+ +

URI parameters should describe the URI using a list of Parameters. For +“Question” it would be as follows:

+
+ Parameters
+    + question_id (number) - ID of the Question in the form of an integer
+
+

The question_id variable of the URI template is a parameter for every action +on this resource. It's defined here using an arbitrary type number, followed +by a description for the parameter.

+ +
+

Refer to API Blueprint Specification's URI Parameters Section for more +examples.

+
+ +

Actions

+ +

This resource has an action to retrieve the question's detail.

+
### View a Questions Detail [GET]
+
++ Response 200 (application/json)
+
+            {
+                "question": "Favourite programming language?",
+                "published_at": "2014-11-11T08:40:51.620Z",
+                "url": "/questions/1",
+                "choices": [
+                    {
+                        "choice": "Swift",
+                        "url": "/questions/1/choices/1",
+                        "votes": 2048
+                    }, {
+                        "choice": "Python",
+                        "url": "/questions/1/choices/2",
+                        "votes": 1024
+                    }, {
+                        "choice": "Objective-C",
+                        "url": "/questions/1/choices/3",
+                        "votes": 512
+                    }, {
+                        "choice": "Ruby",
+                        "url": "/questions/1/choices/4",
+                        "votes": 256
+                    }
+                ]
+            }
+
+

Response Without a Body

+ +

This resource has a delete action. The server will return a 204 response +without a body.

+
### Delete [DELETE]
+
++ Response 204
+
+

Complete Blueprint

+ +

You can find an implementation of this +API at http://polls.apiblueprint.org/ along with the complete +Poll API Blueprint in the API Blueprint Examples repository. You can +also enjoy it rendered on Apiary.

+ +
+

Note: Take a look at the API Blueprint Glossary of Terms if you need +clarification of some of the terms used though this document.

+
+ +

API Blueprint Tools

+ +

Visit the Tooling Section of apiblueprint.org to find tools to use with +API Blueprints.

+ + +
+
+
+ + + +
+
+ + + + + + diff --git a/images/api-blueprint-69eb89fa.svg b/images/api-blueprint-69eb89fa.svg new file mode 100644 index 0000000..4398754 --- /dev/null +++ b/images/api-blueprint-69eb89fa.svg @@ -0,0 +1,20 @@ + + + + api-blueprint + Created with Sketch. + + + + + + + + + + + + + + + \ No newline at end of file diff --git a/images/apiblueprint-footer-81a6c64c.svg b/images/apiblueprint-footer-81a6c64c.svg new file mode 100644 index 0000000..6ea62e7 --- /dev/null +++ b/images/apiblueprint-footer-81a6c64c.svg @@ -0,0 +1,20 @@ + + + + apiblueprint-footer.svg + Created with Sketch. + + + + + + + + + + + + + + + \ No newline at end of file diff --git a/images/favicon-10b3ff24.png b/images/favicon-10b3ff24.png new file mode 100644 index 0000000..46524c2 Binary files /dev/null and b/images/favicon-10b3ff24.png differ diff --git a/images/github-893a5b9a.svg b/images/github-893a5b9a.svg new file mode 100644 index 0000000..62c0ee8 --- /dev/null +++ b/images/github-893a5b9a.svg @@ -0,0 +1,14 @@ + + + + github + Created with Sketch. + + + + + + + + + \ No newline at end of file diff --git a/images/index-bg-06ef8c4d.jpg b/images/index-bg-06ef8c4d.jpg new file mode 100644 index 0000000..9e774f3 Binary files /dev/null and b/images/index-bg-06ef8c4d.jpg differ diff --git a/images/moon-c1a23ddc.svg b/images/moon-c1a23ddc.svg new file mode 100644 index 0000000..d02361c --- /dev/null +++ b/images/moon-c1a23ddc.svg @@ -0,0 +1,54 @@ + + + + moon + Created with Sketch. + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + \ No newline at end of file diff --git a/images/rocket-3f9ca466.svg b/images/rocket-3f9ca466.svg new file mode 100644 index 0000000..5b6e2ce --- /dev/null +++ b/images/rocket-3f9ca466.svg @@ -0,0 +1,21 @@ + + + + rocket + Created with Sketch. + + + + + + + + + + + + + + + + \ No newline at end of file diff --git a/images/search-69c734af.svg b/images/search-69c734af.svg new file mode 100644 index 0000000..f1f8283 --- /dev/null +++ b/images/search-69c734af.svg @@ -0,0 +1,17 @@ + + + + search + Created with Sketch. + + + + + + + + + + + + \ No newline at end of file diff --git a/images/slack-dba1e617.svg b/images/slack-dba1e617.svg new file mode 100644 index 0000000..0470fb9 --- /dev/null +++ b/images/slack-dba1e617.svg @@ -0,0 +1,14 @@ + + + + slack + Created with Sketch. + + + + + + + + + \ No newline at end of file diff --git a/images/stackoverflow-994229fe.svg b/images/stackoverflow-994229fe.svg new file mode 100644 index 0000000..7890d13 --- /dev/null +++ b/images/stackoverflow-994229fe.svg @@ -0,0 +1,14 @@ + + + + stackoverflow + Created with Sketch. + + + + + + + + + \ No newline at end of file diff --git a/images/stars-c1ce35a2.svg b/images/stars-c1ce35a2.svg new file mode 100644 index 0000000..2e35d80 --- /dev/null +++ b/images/stars-c1ce35a2.svg @@ -0,0 +1,142 @@ + + + + stars + Created with Sketch. + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + \ No newline at end of file diff --git a/images/twitter-2ade0f64.svg b/images/twitter-2ade0f64.svg new file mode 100644 index 0000000..49246ac --- /dev/null +++ b/images/twitter-2ade0f64.svg @@ -0,0 +1,14 @@ + + + + twitter + Created with Sketch. + + + + + + + + + \ No newline at end of file diff --git a/index.html b/index.html new file mode 100644 index 0000000..737a195 --- /dev/null +++ b/index.html @@ -0,0 +1,212 @@ + + + + + + + + API Blueprint | API Blueprint + + + + + + + + + +
+
+
+ + +
+ +
+ + + + +
+
+ +
+ + +

API Blueprint. A powerful high-level API description language for web APIs.

+ +

API Blueprint is simple and accessible to everybody involved in the API +lifecycle. Its syntax is concise yet expressive. With API Blueprint you can +quickly design and prototype APIs to be created or document and test already +deployed mission-critical APIs.

+ +

Tutorial Tools section

+
# GET /message
++ Response 200 (text/plain)
+
+        Hello World!
+
+

Focused on Collaboration

+ +

API Blueprint is built to encourage dialogue and collaboration between +project stakeholders, developers and customers at any point in the API +lifecycle. At the same time, the API Blueprint tools provide the support to +achieve the goals be it API development, governance or delivery.

+ +

Open

+ +

API Blueprint is completely open sourced under the MIT license. +Its future is transparent and open. +API Blueprint doesn't need a closed work group. Instead it uses the RFC +process similar to Rust language or Django Enhancement Proposal RFC processes.

+ +

To contribute, submit a proposal to API Blueprint RFC repository.

+ +

At home on GitHub

+ +

The API Blueprint language is recognized by GitHub. +Search for API Blueprint on GitHub using the +language:"API Blueprint" query.

+ +

The media type for API Blueprint is text/vnd.apiblueprint, and the +standard file extension is .apib. If you use this extension your +blueprints on GitHub will get syntax-highlighted.

+ +

Built for better API Designs

+ +

API Blueprint is built to encourage better API designs through abstraction. +The goal of API Blueprint is to decouple elements of API to enable modularity +while encapsulating backend implementation behavior.

+ +

For example, model your data first using the data description syntax.

+
# Data Structures
+
+## Blog Post (object)
++ id: 42 (number, required)
++ text: Hello World (string)
++ author (Author) - Author of the blog post.
+
+## Author (object)
++ name: Boba Fett
++ email: fett@intergalactic.com
+
+

Then, use and reuse the data in your API endpoints.

+
# Blog Posts [/posts]
+
+## Retrieve All Posts [GET]
++ Response 200 (application/json)
+    + Attributes (array[Blog Post])
+
+

Design-first

+ +

API Blueprint is all about the design-first philosophy. Similar to tests in +test-driven development, API Blueprint represents a contract for an API. +Discussing your API and settling on the contract before it is developed tends to +lead to better API designs.

+ +

Once your API Blueprint is in place everybody can test whether the +implementation is living up to the expectations set in the contract.

+ +

Awesome Tools

+ +

Thanks to its broad adoption there is a plethora of tools built for API Blueprint. +From various standalone tools such as mock server, documentation and testing +tools to full-featured API life-cycle solutions.

+ +

See the Tools section for the list.

+ +
+ +

Getting Started

+ +

To get started with API Blueprint you will need a plain-text editor. For the +best editing experience switch the syntax-highlighting to Markdown or +directly to API Blueprint (if supported by your editor).

+ +

With editor ready, follow the API Blueprint tutorial.

+ +

Once you have written your first API Blueprint you can discuss the API design +with friends and use the tools for API Blueprint. For example, +to render documentation, generate a mock of your service or start testing your +backend implementation.

+ +

Check the Documentation section for additional resources on +the API Blueprint syntax.

+ + +
+ + + +
+
+ + + + + + diff --git a/javascripts/all.js b/javascripts/all.js new file mode 100644 index 0000000..3758392 --- /dev/null +++ b/javascripts/all.js @@ -0,0 +1,23 @@ +/* +The MIT License (MIT) + +Copyright (c) 2013 Honza Javorek + +Permission is hereby granted, free of charge, to any person obtaining a copy of +this software and associated documentation files (the "Software"), to deal in +the Software without restriction, including without limitation the rights to +use, copy, modify, merge, publish, distribute, sublicense, and/or sell copies of +the Software, and to permit persons to whom the Software is furnished to do so, +subject to the following conditions: + +The above copyright notice and this permission notice shall be included in all +copies or substantial portions of the Software. + +THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR +IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, FITNESS +FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR +COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER +IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN +CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE. +*/ +$(function(){for(var n=[],t=1;t<=6;t++)n.push("h"+t+"[id]");$(n.join(", "),".page-content").each(function(){var n=$(this),t=$("",{href:"#"+n.attr("id"),"class":"permalink",title:"Permanent Link",text:"#"}),a=$("",{"class":"permalink-container"});n.append(a),a.append(t)})}),$(function(){$(document).on("click",".tool",function(){var n=$(this).find("a").attr("href");window.location=n})}); \ No newline at end of file diff --git a/javascripts/permalinks.js b/javascripts/permalinks.js new file mode 100644 index 0000000..779e38e --- /dev/null +++ b/javascripts/permalinks.js @@ -0,0 +1,23 @@ +/* +The MIT License (MIT) + +Copyright (c) 2013 Honza Javorek + +Permission is hereby granted, free of charge, to any person obtaining a copy of +this software and associated documentation files (the "Software"), to deal in +the Software without restriction, including without limitation the rights to +use, copy, modify, merge, publish, distribute, sublicense, and/or sell copies of +the Software, and to permit persons to whom the Software is furnished to do so, +subject to the following conditions: + +The above copyright notice and this permission notice shall be included in all +copies or substantial portions of the Software. + +THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR +IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, FITNESS +FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR +COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER +IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN +CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE. +*/ +$(function(){for(var n=[],a=1;a<=6;a++)n.push("h"+a+"[id]");$(n.join(", "),".page-content").each(function(){var n=$(this),a=$("",{href:"#"+n.attr("id"),"class":"permalink",title:"Permanent Link",text:"#"}),e=$("",{"class":"permalink-container"});n.append(e),e.append(a)})}); \ No newline at end of file diff --git a/stylesheets/all.css b/stylesheets/all.css new file mode 100644 index 0000000..83b2619 --- /dev/null +++ b/stylesheets/all.css @@ -0,0 +1 @@ +html{box-sizing:border-box}*,*:before,*:after{box-sizing:inherit}body{background:#2C1B56;background-image:linear-gradient(#0F0626, #2C1B56 1100px);color:#B9AED2;font-family:'Open Sans', sans-serif;position:relative}::selection{background:#5E9CFF}h1,h2,h3,h4,h5,h6{font-weight:300;color:#FFF}a{color:#FFF;border-bottom:1px solid rgba(255,255,255,0.19);-webkit-transition:border .1s ease-out;-moz-transition:border .1s ease-out;-o-transition:border .1s ease-out;transition:border .1s ease-out}a:hover{border-bottom-color:#fff}ul{font-size:18px}a:hover{color:#FFF;text-decoration:none}p{font-size:18px}header{height:50px;margin:15px 0 55px;position:relative;z-index:10}header:after{content:'';background-image:url(/images/stars-c1ce35a2.svg);background-size:cover;width:1000px;height:200px;position:absolute;left:50%;top:0;margin-left:-500px;z-index:1;max-width:100%}header hr{border:0;height:10px}header .container{position:relative;z-index:2}header .navbar-brand{padding:0;font-size:18px;text-transform:lowercase;color:#FFF;font-weight:300;border-bottom:none;padding-left:15px}header .navbar-brand:before{content:url(/images/api-blueprint-69eb89fa.svg);height:47px;width:51px;padding-right:15px;vertical-align:text-bottom}.navbar-collapse{z-index:40}.navbar-collapse.in,.navbar-collapse.collapsing{background:rgba(29,17,64,0.85)}.navbar-nav a{font-size:16px;border-bottom:2px solid transparent;-webkit-transition:all .1s ease-out;-moz-transition:all .1s ease-out;-o-transition:all .1s ease-out;transition:all .1s ease-out}header .navbar-nav a:hover,header .navbar-nav a:focus{background:inherit}.nav a{border-bottom:none}header .nav a:hover{border-bottom:2px solid #FFF;opacity:1}body.documentation header .nav a.documentation{border-bottom:2px solid #FFF;opacity:1}body.developers header .nav a.developers{border-bottom:2px solid #FFF;opacity:1}body.support header .nav a.support{border-bottom:2px solid #FFF;opacity:1}body.tools header .nav a.tools{border-bottom:2px solid #FFF;opacity:1}footer{margin-top:50px;clear:both}footer .brand-block img{float:left}footer .brand-block .brand-info span{display:block}footer .brand{text-transform:lowercase}footer .nav-pills{margin:20px 0}footer .nav-pills>li{display:block;float:none}footer .social li img{float:left}#sidebar .nav .nav{display:none}#sidebar .nav .active .nav{display:block}#sidebar .nav>li>a{padding:0;font-size:15px;color:#FFFFFF;line-height:40px;-webkit-transition:all .1s ease-out;-moz-transition:all .1s ease-out;-o-transition:all .1s ease-out;transition:all .1s ease-out;border-left:3px solid transparent;margin-left:-3px}#sidebar .nav>li>a:hover,#sidebar .nav li.active>a{border-left:3px solid #9073D2;padding-left:15px;margin-left:0;color:#9073D2;background:transparent}footer{margin-bottom:50px}footer .social{background:#00D779;padding:20px}footer .social li{padding-left:40px;padding-right:40px;margin-bottom:20px;margin-top:20px}footer .social li:first-child{border:0}footer .social a{border:0;font-size:18px}footer .social .service{color:rgba(255,255,255,0.7);font-size:13px;display:block}footer .license{text-align:center;padding:20px 0;opacity:.5}footer ul{padding-left:10px;list-style-type:none;margin:0}footer img{margin-right:.5em;margin-bottom:.5em}footer .info li.brand{font-size:20px;font-weight:300;text-transform:lowercase;color:#FFF}hr{border-top:1px solid #472F82}pre{background:rgba(29,17,64,0.85);border:0;border-left:4px solid #7371B7;border-radius:0;color:#6C7887;overflow-x:auto}pre code{overflow-wrap:normal;white-space:pre;color:#B4AEC5}code{background:#1F133E;border:0;border-radius:0;color:#EBE7F5}blockquote{border-left:4px solid #9073D2}body>.container{position:relative;z-index:4}body>.container>h2,body>.container>h3,.text h2,.text h3{font-weight:lighter;font-size:24px;color:#FFFFFF;line-height:50px;margin-top:52px}body>.container>h2:first-child,.text h2:first-child{font-size:25px;line-height:41px;margin-top:0}body>.container>p,.text p{font-weight:lighter;font-size:18px;color:#B9AED2}body>.container>ul:not(.nav),.text ul:not(.nav){list-style:none;padding:0;margin:0;margin-bottom:20px}body>.container>ul:not(.nav) li,.text ul:not(.nav) li{position:relative;margin-bottom:5px}body>.container>ul:not(.nav) li:before,.text ul:not(.nav) li:before{content:'';display:inline-block;width:10px;height:10px;border-radius:10px;border:2px solid #5E9CFF;margin-right:15px}body>.container>ol,.text ol{list-style:none;padding:0;margin:0;counter-reset:ol-counter}body>.container>ol li,.text ol li{position:relative;padding-left:60px;margin-bottom:50px;margin-top:40px}body>.container>ol li:before,.text ol li:before{content:counter(ol-counter);counter-increment:ol-counter;border:2px solid #160B35;width:40px;height:40px;line-height:36px;border-radius:40px;display:inline-block;text-align:center;font-weight:bold;color:#5E9CFC;font-size:16px;position:absolute;left:0}.container ul:not(.nav) ul{padding-left:30px}.container ul:not(.nav) ul li:before{border:2px solid #FFFFFF}body>.container pre,.text pre{padding:40px}body>.container>p,body>.container>ul:not(.nav),body>.container>ol,.text p,.text ul:not(.nav),.text ol{line-height:34px;margin-bottom:24px}#filters{padding:52px 0}.search-form{border-bottom:1px solid #593F93;position:relative}.search-form:before{content:url(/images/search-69c734af.svg);height:22px;width:22px;position:absolute;top:50%;margin-top:-11px;left:20px;opacity:.5}.search-form input{padding:22px;background:transparent;font-size:20px;color:#fff;line-height:25px;padding-left:55px;width:100%;border:0;outline:none}.nav.nav-pills a{font-size:15px;color:#FFFFFF;line-height:18px;border-radius:40px;-webkit-transition:all .1s ease-out;-moz-transition:all .1s ease-out;-o-transition:all .1s ease-out;transition:all .1s ease-out}.nav.nav-pills .active a,.nav.nav-pills a:hover{background:#9073D2}.tool{padding:31px 0;border-top:1px solid #593F93;transition:background .1s ease-out}.tool:hover{background:rgba(255,255,255,0.05);cursor:pointer}.tool h3{font-size:24px;color:#FFFFFF;line-height:33px;margin:0;padding:0}.tool h3 a{text-decoration:none;border-bottom:0}.tool .summary p{font-size:16px;color:#768491;line-height:26px;margin:0;padding:0}.tool .label.label-default{border:2px solid #4D5862;border-radius:3px;background:transparent;margin-top:8px;display:inline-block}body.index{background:#2C1B56 url(/images/index-bg-06ef8c4d.jpg) no-repeat top center;background-size:100% auto}body.index>.container p:first-of-type{opacity:0.63;font-size:17px;color:#FFFFFF;line-height:34px;margin-top:30px}body.index>.container p:nth-of-type(2){margin-bottom:100px}body.index>.container p:nth-of-type(2) a{background:#00D779;border-radius:46px;border:2px solid transparent;display:block;padding:5px 50px;margin:0;margin-bottom:10px;text-align:center;-webkit-transition:all .1s ease-out;-moz-transition:all .1s ease-out;-o-transition:all .1s ease-out;transition:all .1s ease-out}body.index>.container p:nth-of-type(2) a:last-child{background:transparent;border:2px solid #7966AC}body.index>.container p:nth-of-type(2) a:hover{background:#00b767;border-color:#00b767}.navbar-toggle{border:1px solid #fff}.navbar-toggle .icon-bar{background:#fff}@media (min-width: 768px){.navbar-nav a{opacity:.5}.text-md-right{text-align:right}footer .nav-pills>li{display:inline-block}header{margin:75px 0 95px;z-index:1}header .navbar-brand{font-size:32px;padding-left:0}body>.container>h2:first-child,.text h2:first-child{font-size:32px;line-height:50px}body.index>.container p:nth-of-type(2) a{display:inline-block}body.index>.container h2:first-of-type,body.index>.container p:first-of-type{max-width:75%}.rocket{content:url(/images/rocket-3f9ca466.svg);height:23px;width:36px;position:absolute;top:150px;left:5%}.moon{content:url(/images/moon-c1a23ddc.svg);height:46px;width:46px;position:absolute;top:100px;right:5%}footer .social{display:flex;padding:50px}footer .social li{flex-grow:1;margin:0;border-left:1px solid rgba(0,0,0,0.19)}footer .nav-pills{margin:0}}@media (min-width: 992px){.container{width:960px}}h1 .permalink,h2 .permalink,h3 .permalink,h4 .permalink,h5 .permalink,h6 .permalink{display:none;margin-left:10px}h1:hover .permalink,h2:hover .permalink,h3:hover .permalink,h4:hover .permalink,h5:hover .permalink,h6:hover .permalink{display:inline} \ No newline at end of file diff --git a/stylesheets/application b/stylesheets/application new file mode 100644 index 0000000..7c7f7af --- /dev/null +++ b/stylesheets/application @@ -0,0 +1,5648 @@ +@charset "UTF-8"; +/*! + * Bootstrap v3.4.1 (https://getbootstrap.com/) + * Copyright 2011-2019 Twitter, Inc. + * Licensed under MIT (https://github.com/twbs/bootstrap/blob/master/LICENSE) + */ +/*! normalize.css v3.0.3 | MIT License | github.com/necolas/normalize.css */ +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, +menu, +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-color: transparent; } + +a:active, +a:hover { + outline: 0; } + +abbr[title] { + border-bottom: none; + text-decoration: underline; + text-decoration: underline 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 { + 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; + 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; } + +/*! Source: https://github.com/h5bp/html5-boilerplate/blob/master/src/css/main.css */ +@media print { + *, + *:before, + *:after { + color: #000 !important; + text-shadow: none !important; + background: transparent !important; + box-shadow: none !important; } + a, + a:visited { + text-decoration: underline; } + a[href]:after { + content: " (" attr(href) ")"; } + abbr[title]:after { + content: " (" attr(title) ")"; } + a[href^="#"]:after, + a[href^="javascript:"]: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; } + .navbar { + display: none; } + .btn > .caret, + .dropup > .btn > .caret { + border-top-color: #000 !important; } + .label { + border: 1px solid #000; } + .table { + border-collapse: collapse !important; } + .table td, + .table th { + background-color: #fff !important; } + .table-bordered th, + .table-bordered td { + border: 1px solid #ddd !important; } } + +@font-face { + font-family: "Glyphicons Halflings"; + src: url("../fonts/bootstrap/glyphicons-halflings-regular.eot"); + src: url("../fonts/bootstrap/glyphicons-halflings-regular.eot?#iefix") format("embedded-opentype"), url("../fonts/bootstrap/glyphicons-halflings-regular.woff2") format("woff2"), url("../fonts/bootstrap/glyphicons-halflings-regular.woff") format("woff"), url("../fonts/bootstrap/glyphicons-halflings-regular.ttf") format("truetype"), url("../fonts/bootstrap/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: 400; + line-height: 1; + -webkit-font-smoothing: antialiased; + -moz-osx-font-smoothing: grayscale; } + +.glyphicon-asterisk:before { + content: "\002a"; } + +.glyphicon-plus:before { + content: "\002b"; } + +.glyphicon-euro:before, +.glyphicon-eur: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"; } + +.glyphicon-cd:before { + content: "\e201"; } + +.glyphicon-save-file:before { + content: "\e202"; } + +.glyphicon-open-file:before { + content: "\e203"; } + +.glyphicon-level-up:before { + content: "\e204"; } + +.glyphicon-copy:before { + content: "\e205"; } + +.glyphicon-paste:before { + content: "\e206"; } + +.glyphicon-alert:before { + content: "\e209"; } + +.glyphicon-equalizer:before { + content: "\e210"; } + +.glyphicon-king:before { + content: "\e211"; } + +.glyphicon-queen:before { + content: "\e212"; } + +.glyphicon-pawn:before { + content: "\e213"; } + +.glyphicon-bishop:before { + content: "\e214"; } + +.glyphicon-knight:before { + content: "\e215"; } + +.glyphicon-baby-formula:before { + content: "\e216"; } + +.glyphicon-tent:before { + content: "\26fa"; } + +.glyphicon-blackboard:before { + content: "\e218"; } + +.glyphicon-bed:before { + content: "\e219"; } + +.glyphicon-apple:before { + content: "\f8ff"; } + +.glyphicon-erase:before { + content: "\e221"; } + +.glyphicon-hourglass:before { + content: "\231b"; } + +.glyphicon-lamp:before { + content: "\e223"; } + +.glyphicon-duplicate:before { + content: "\e224"; } + +.glyphicon-piggy-bank:before { + content: "\e225"; } + +.glyphicon-scissors:before { + content: "\e226"; } + +.glyphicon-bitcoin:before { + content: "\e227"; } + +.glyphicon-btc:before { + content: "\e227"; } + +.glyphicon-xbt:before { + content: "\e227"; } + +.glyphicon-yen:before { + content: "\00a5"; } + +.glyphicon-jpy:before { + content: "\00a5"; } + +.glyphicon-ruble:before { + content: "\20bd"; } + +.glyphicon-rub:before { + content: "\20bd"; } + +.glyphicon-scale:before { + content: "\e230"; } + +.glyphicon-ice-lolly:before { + content: "\e231"; } + +.glyphicon-ice-lolly-tasted:before { + content: "\e232"; } + +.glyphicon-education:before { + content: "\e233"; } + +.glyphicon-option-horizontal:before { + content: "\e234"; } + +.glyphicon-option-vertical:before { + content: "\e235"; } + +.glyphicon-menu-hamburger:before { + content: "\e236"; } + +.glyphicon-modal-window:before { + content: "\e237"; } + +.glyphicon-oil:before { + content: "\e238"; } + +.glyphicon-grain:before { + content: "\e239"; } + +.glyphicon-sunglasses:before { + content: "\e240"; } + +.glyphicon-text-size:before { + content: "\e241"; } + +.glyphicon-text-color:before { + content: "\e242"; } + +.glyphicon-text-background:before { + content: "\e243"; } + +.glyphicon-object-align-top:before { + content: "\e244"; } + +.glyphicon-object-align-bottom:before { + content: "\e245"; } + +.glyphicon-object-align-horizontal:before { + content: "\e246"; } + +.glyphicon-object-align-left:before { + content: "\e247"; } + +.glyphicon-object-align-vertical:before { + content: "\e248"; } + +.glyphicon-object-align-right:before { + content: "\e249"; } + +.glyphicon-triangle-right:before { + content: "\e250"; } + +.glyphicon-triangle-left:before { + content: "\e251"; } + +.glyphicon-triangle-bottom:before { + content: "\e252"; } + +.glyphicon-triangle-top:before { + content: "\e253"; } + +.glyphicon-console:before { + content: "\e254"; } + +.glyphicon-superscript:before { + content: "\e255"; } + +.glyphicon-subscript:before { + content: "\e256"; } + +.glyphicon-menu-left:before { + content: "\e257"; } + +.glyphicon-menu-right:before { + content: "\e258"; } + +.glyphicon-menu-down:before { + content: "\e259"; } + +.glyphicon-menu-up:before { + content: "\e260"; } + +* { + -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: 10px; + -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: #fff; } + +input, +button, +select, +textarea { + font-family: inherit; + font-size: inherit; + line-height: inherit; } + +a { + color: #337ab7; + text-decoration: none; } + a:hover, a:focus { + color: #23527c; + text-decoration: underline; } + a:focus { + outline: 5px auto -webkit-focus-ring-color; + outline-offset: -2px; } + +figure { + margin: 0; } + +img { + vertical-align: middle; } + +.img-responsive { + display: block; + max-width: 100%; + height: auto; } + +.img-rounded { + border-radius: 6px; } + +.img-thumbnail { + padding: 4px; + line-height: 1.428571429; + background-color: #fff; + border: 1px solid #ddd; + border-radius: 4px; + -webkit-transition: all 0.2s ease-in-out; + -o-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; + padding: 0; + margin: -1px; + overflow: hidden; + clip: rect(0, 0, 0, 0); + border: 0; } + +.sr-only-focusable:active, .sr-only-focusable:focus { + position: static; + width: auto; + height: auto; + margin: 0; + overflow: visible; + clip: auto; } + +[role="button"] { + cursor: pointer; } + +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, + h1 .small, h2 small, + h2 .small, h3 small, + h3 .small, h4 small, + h4 .small, h5 small, + h5 .small, h6 small, + h6 .small, + .h1 small, + .h1 .small, .h2 small, + .h2 .small, .h3 small, + .h3 .small, .h4 small, + .h4 .small, .h5 small, + .h5 .small, .h6 small, + .h6 .small { + font-weight: 400; + line-height: 1; + color: #777777; } + +h1, .h1, +h2, .h2, +h3, .h3 { + margin-top: 20px; + margin-bottom: 10px; } + h1 small, + h1 .small, .h1 small, + .h1 .small, + h2 small, + h2 .small, .h2 small, + .h2 .small, + h3 small, + h3 .small, .h3 small, + .h3 .small { + font-size: 65%; } + +h4, .h4, +h5, .h5, +h6, .h6 { + margin-top: 10px; + margin-bottom: 10px; } + h4 small, + h4 .small, .h4 small, + .h4 .small, + h5 small, + h5 .small, .h5 small, + .h5 .small, + h6 small, + h6 .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: 300; + line-height: 1.4; } + @media (min-width: 768px) { + .lead { + font-size: 21px; } } +small, +.small { + font-size: 85%; } + +mark, +.mark { + padding: .2em; + background-color: #fcf8e3; } + +.text-left { + text-align: left; } + +.text-right { + text-align: right; } + +.text-center { + text-align: center; } + +.text-justify { + text-align: justify; } + +.text-nowrap { + white-space: nowrap; } + +.text-lowercase { + text-transform: lowercase; } + +.text-uppercase, .initialism { + text-transform: uppercase; } + +.text-capitalize { + text-transform: capitalize; } + +.text-muted { + color: #777777; } + +.text-primary { + color: #337ab7; } + +a.text-primary:hover, +a.text-primary:focus { + color: #286090; } + +.text-success { + color: #3c763d; } + +a.text-success:hover, +a.text-success:focus { + color: #2b542c; } + +.text-info { + color: #31708f; } + +a.text-info:hover, +a.text-info:focus { + color: #245269; } + +.text-warning { + color: #8a6d3b; } + +a.text-warning:hover, +a.text-warning:focus { + color: #66512c; } + +.text-danger { + color: #a94442; } + +a.text-danger:hover, +a.text-danger:focus { + color: #843534; } + +.bg-primary { + color: #fff; } + +.bg-primary { + background-color: #337ab7; } + +a.bg-primary:hover, +a.bg-primary:focus { + background-color: #286090; } + +.bg-success { + background-color: #dff0d8; } + +a.bg-success:hover, +a.bg-success:focus { + background-color: #c1e2b3; } + +.bg-info { + background-color: #d9edf7; } + +a.bg-info:hover, +a.bg-info:focus { + background-color: #afd9ee; } + +.bg-warning { + background-color: #fcf8e3; } + +a.bg-warning:hover, +a.bg-warning:focus { + background-color: #f7ecb5; } + +.bg-danger { + background-color: #f2dede; } + +a.bg-danger:hover, +a.bg-danger:focus { + background-color: #e4b9b9; } + +.page-header { + padding-bottom: 9px; + margin: 40px 0 20px; + border-bottom: 1px solid #eeeeee; } + +ul, +ol { + margin-top: 0; + margin-bottom: 10px; } + ul ul, + ul ol, + ol ul, + 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-right: 5px; + padding-left: 5px; } + +dl { + margin-top: 0; + margin-bottom: 20px; } + +dt, +dd { + line-height: 1.428571429; } + +dt { + font-weight: 700; } + +dd { + margin-left: 0; } + +.dl-horizontal dd:before, .dl-horizontal dd:after { + display: table; + content: " "; } + +.dl-horizontal dd:after { + clear: both; } + +@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; } + +.initialism { + font-size: 90%; } + +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: #777777; } + blockquote footer:before, + blockquote small:before, + blockquote .small:before { + content: "\2014 \00A0"; } + +.blockquote-reverse, +blockquote.pull-right { + padding-right: 15px; + padding-left: 0; + text-align: right; + border-right: 5px solid #eeeeee; + border-left: 0; } + .blockquote-reverse footer:before, + .blockquote-reverse small:before, + .blockquote-reverse .small:before, + blockquote.pull-right footer:before, + blockquote.pull-right small:before, + blockquote.pull-right .small:before { + content: ""; } + .blockquote-reverse footer:after, + .blockquote-reverse small:after, + .blockquote-reverse .small:after, + blockquote.pull-right footer:after, + blockquote.pull-right small:after, + blockquote.pull-right .small:after { + content: "\00A0 \2014"; } + +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; + border-radius: 4px; } + +kbd { + padding: 2px 4px; + font-size: 90%; + color: #fff; + background-color: #333; + border-radius: 3px; + box-shadow: inset 0 -1px 0 rgba(0, 0, 0, 0.25); } + kbd kbd { + padding: 0; + font-size: 100%; + font-weight: 700; + box-shadow: none; } + +pre { + display: block; + padding: 9.5px; + margin: 0 0 10px; + font-size: 13px; + line-height: 1.428571429; + color: #333333; + word-break: break-all; + word-wrap: break-word; + background-color: #f5f5f5; + border: 1px solid #ccc; + border-radius: 4px; } + 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 { + padding-right: 15px; + padding-left: 15px; + margin-right: auto; + margin-left: auto; } + .container:before, .container:after { + display: table; + content: " "; } + .container:after { + clear: both; } + @media (min-width: 768px) { + .container { + width: 750px; } } + @media (min-width: 992px) { + .container { + width: 970px; } } + @media (min-width: 1200px) { + .container { + width: 1170px; } } +.container-fluid { + padding-right: 15px; + padding-left: 15px; + margin-right: auto; + margin-left: auto; } + .container-fluid:before, .container-fluid:after { + display: table; + content: " "; } + .container-fluid:after { + clear: both; } + +.row { + margin-right: -15px; + margin-left: -15px; } + .row:before, .row:after { + display: table; + content: " "; } + .row:after { + clear: both; } + +.row-no-gutters { + margin-right: 0; + margin-left: 0; } + .row-no-gutters [class*="col-"] { + padding-right: 0; + padding-left: 0; } + +.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-right: 15px; + padding-left: 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-1 { + width: 8.3333333333%; } + +.col-xs-2 { + width: 16.6666666667%; } + +.col-xs-3 { + width: 25%; } + +.col-xs-4 { + width: 33.3333333333%; } + +.col-xs-5 { + width: 41.6666666667%; } + +.col-xs-6 { + width: 50%; } + +.col-xs-7 { + width: 58.3333333333%; } + +.col-xs-8 { + width: 66.6666666667%; } + +.col-xs-9 { + width: 75%; } + +.col-xs-10 { + width: 83.3333333333%; } + +.col-xs-11 { + width: 91.6666666667%; } + +.col-xs-12 { + width: 100%; } + +.col-xs-pull-0 { + right: auto; } + +.col-xs-pull-1 { + right: 8.3333333333%; } + +.col-xs-pull-2 { + right: 16.6666666667%; } + +.col-xs-pull-3 { + right: 25%; } + +.col-xs-pull-4 { + right: 33.3333333333%; } + +.col-xs-pull-5 { + right: 41.6666666667%; } + +.col-xs-pull-6 { + right: 50%; } + +.col-xs-pull-7 { + right: 58.3333333333%; } + +.col-xs-pull-8 { + right: 66.6666666667%; } + +.col-xs-pull-9 { + right: 75%; } + +.col-xs-pull-10 { + right: 83.3333333333%; } + +.col-xs-pull-11 { + right: 91.6666666667%; } + +.col-xs-pull-12 { + right: 100%; } + +.col-xs-push-0 { + left: auto; } + +.col-xs-push-1 { + left: 8.3333333333%; } + +.col-xs-push-2 { + left: 16.6666666667%; } + +.col-xs-push-3 { + left: 25%; } + +.col-xs-push-4 { + left: 33.3333333333%; } + +.col-xs-push-5 { + left: 41.6666666667%; } + +.col-xs-push-6 { + left: 50%; } + +.col-xs-push-7 { + left: 58.3333333333%; } + +.col-xs-push-8 { + left: 66.6666666667%; } + +.col-xs-push-9 { + left: 75%; } + +.col-xs-push-10 { + left: 83.3333333333%; } + +.col-xs-push-11 { + left: 91.6666666667%; } + +.col-xs-push-12 { + left: 100%; } + +.col-xs-offset-0 { + margin-left: 0%; } + +.col-xs-offset-1 { + margin-left: 8.3333333333%; } + +.col-xs-offset-2 { + margin-left: 16.6666666667%; } + +.col-xs-offset-3 { + margin-left: 25%; } + +.col-xs-offset-4 { + margin-left: 33.3333333333%; } + +.col-xs-offset-5 { + margin-left: 41.6666666667%; } + +.col-xs-offset-6 { + margin-left: 50%; } + +.col-xs-offset-7 { + margin-left: 58.3333333333%; } + +.col-xs-offset-8 { + margin-left: 66.6666666667%; } + +.col-xs-offset-9 { + margin-left: 75%; } + +.col-xs-offset-10 { + margin-left: 83.3333333333%; } + +.col-xs-offset-11 { + margin-left: 91.6666666667%; } + +.col-xs-offset-12 { + margin-left: 100%; } + +@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-1 { + width: 8.3333333333%; } + .col-sm-2 { + width: 16.6666666667%; } + .col-sm-3 { + width: 25%; } + .col-sm-4 { + width: 33.3333333333%; } + .col-sm-5 { + width: 41.6666666667%; } + .col-sm-6 { + width: 50%; } + .col-sm-7 { + width: 58.3333333333%; } + .col-sm-8 { + width: 66.6666666667%; } + .col-sm-9 { + width: 75%; } + .col-sm-10 { + width: 83.3333333333%; } + .col-sm-11 { + width: 91.6666666667%; } + .col-sm-12 { + width: 100%; } + .col-sm-pull-0 { + right: auto; } + .col-sm-pull-1 { + right: 8.3333333333%; } + .col-sm-pull-2 { + right: 16.6666666667%; } + .col-sm-pull-3 { + right: 25%; } + .col-sm-pull-4 { + right: 33.3333333333%; } + .col-sm-pull-5 { + right: 41.6666666667%; } + .col-sm-pull-6 { + right: 50%; } + .col-sm-pull-7 { + right: 58.3333333333%; } + .col-sm-pull-8 { + right: 66.6666666667%; } + .col-sm-pull-9 { + right: 75%; } + .col-sm-pull-10 { + right: 83.3333333333%; } + .col-sm-pull-11 { + right: 91.6666666667%; } + .col-sm-pull-12 { + right: 100%; } + .col-sm-push-0 { + left: auto; } + .col-sm-push-1 { + left: 8.3333333333%; } + .col-sm-push-2 { + left: 16.6666666667%; } + .col-sm-push-3 { + left: 25%; } + .col-sm-push-4 { + left: 33.3333333333%; } + .col-sm-push-5 { + left: 41.6666666667%; } + .col-sm-push-6 { + left: 50%; } + .col-sm-push-7 { + left: 58.3333333333%; } + .col-sm-push-8 { + left: 66.6666666667%; } + .col-sm-push-9 { + left: 75%; } + .col-sm-push-10 { + left: 83.3333333333%; } + .col-sm-push-11 { + left: 91.6666666667%; } + .col-sm-push-12 { + left: 100%; } + .col-sm-offset-0 { + margin-left: 0%; } + .col-sm-offset-1 { + margin-left: 8.3333333333%; } + .col-sm-offset-2 { + margin-left: 16.6666666667%; } + .col-sm-offset-3 { + margin-left: 25%; } + .col-sm-offset-4 { + margin-left: 33.3333333333%; } + .col-sm-offset-5 { + margin-left: 41.6666666667%; } + .col-sm-offset-6 { + margin-left: 50%; } + .col-sm-offset-7 { + margin-left: 58.3333333333%; } + .col-sm-offset-8 { + margin-left: 66.6666666667%; } + .col-sm-offset-9 { + margin-left: 75%; } + .col-sm-offset-10 { + margin-left: 83.3333333333%; } + .col-sm-offset-11 { + margin-left: 91.6666666667%; } + .col-sm-offset-12 { + margin-left: 100%; } } + +@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-1 { + width: 8.3333333333%; } + .col-md-2 { + width: 16.6666666667%; } + .col-md-3 { + width: 25%; } + .col-md-4 { + width: 33.3333333333%; } + .col-md-5 { + width: 41.6666666667%; } + .col-md-6 { + width: 50%; } + .col-md-7 { + width: 58.3333333333%; } + .col-md-8 { + width: 66.6666666667%; } + .col-md-9 { + width: 75%; } + .col-md-10 { + width: 83.3333333333%; } + .col-md-11 { + width: 91.6666666667%; } + .col-md-12 { + width: 100%; } + .col-md-pull-0 { + right: auto; } + .col-md-pull-1 { + right: 8.3333333333%; } + .col-md-pull-2 { + right: 16.6666666667%; } + .col-md-pull-3 { + right: 25%; } + .col-md-pull-4 { + right: 33.3333333333%; } + .col-md-pull-5 { + right: 41.6666666667%; } + .col-md-pull-6 { + right: 50%; } + .col-md-pull-7 { + right: 58.3333333333%; } + .col-md-pull-8 { + right: 66.6666666667%; } + .col-md-pull-9 { + right: 75%; } + .col-md-pull-10 { + right: 83.3333333333%; } + .col-md-pull-11 { + right: 91.6666666667%; } + .col-md-pull-12 { + right: 100%; } + .col-md-push-0 { + left: auto; } + .col-md-push-1 { + left: 8.3333333333%; } + .col-md-push-2 { + left: 16.6666666667%; } + .col-md-push-3 { + left: 25%; } + .col-md-push-4 { + left: 33.3333333333%; } + .col-md-push-5 { + left: 41.6666666667%; } + .col-md-push-6 { + left: 50%; } + .col-md-push-7 { + left: 58.3333333333%; } + .col-md-push-8 { + left: 66.6666666667%; } + .col-md-push-9 { + left: 75%; } + .col-md-push-10 { + left: 83.3333333333%; } + .col-md-push-11 { + left: 91.6666666667%; } + .col-md-push-12 { + left: 100%; } + .col-md-offset-0 { + margin-left: 0%; } + .col-md-offset-1 { + margin-left: 8.3333333333%; } + .col-md-offset-2 { + margin-left: 16.6666666667%; } + .col-md-offset-3 { + margin-left: 25%; } + .col-md-offset-4 { + margin-left: 33.3333333333%; } + .col-md-offset-5 { + margin-left: 41.6666666667%; } + .col-md-offset-6 { + margin-left: 50%; } + .col-md-offset-7 { + margin-left: 58.3333333333%; } + .col-md-offset-8 { + margin-left: 66.6666666667%; } + .col-md-offset-9 { + margin-left: 75%; } + .col-md-offset-10 { + margin-left: 83.3333333333%; } + .col-md-offset-11 { + margin-left: 91.6666666667%; } + .col-md-offset-12 { + margin-left: 100%; } } + +@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-1 { + width: 8.3333333333%; } + .col-lg-2 { + width: 16.6666666667%; } + .col-lg-3 { + width: 25%; } + .col-lg-4 { + width: 33.3333333333%; } + .col-lg-5 { + width: 41.6666666667%; } + .col-lg-6 { + width: 50%; } + .col-lg-7 { + width: 58.3333333333%; } + .col-lg-8 { + width: 66.6666666667%; } + .col-lg-9 { + width: 75%; } + .col-lg-10 { + width: 83.3333333333%; } + .col-lg-11 { + width: 91.6666666667%; } + .col-lg-12 { + width: 100%; } + .col-lg-pull-0 { + right: auto; } + .col-lg-pull-1 { + right: 8.3333333333%; } + .col-lg-pull-2 { + right: 16.6666666667%; } + .col-lg-pull-3 { + right: 25%; } + .col-lg-pull-4 { + right: 33.3333333333%; } + .col-lg-pull-5 { + right: 41.6666666667%; } + .col-lg-pull-6 { + right: 50%; } + .col-lg-pull-7 { + right: 58.3333333333%; } + .col-lg-pull-8 { + right: 66.6666666667%; } + .col-lg-pull-9 { + right: 75%; } + .col-lg-pull-10 { + right: 83.3333333333%; } + .col-lg-pull-11 { + right: 91.6666666667%; } + .col-lg-pull-12 { + right: 100%; } + .col-lg-push-0 { + left: auto; } + .col-lg-push-1 { + left: 8.3333333333%; } + .col-lg-push-2 { + left: 16.6666666667%; } + .col-lg-push-3 { + left: 25%; } + .col-lg-push-4 { + left: 33.3333333333%; } + .col-lg-push-5 { + left: 41.6666666667%; } + .col-lg-push-6 { + left: 50%; } + .col-lg-push-7 { + left: 58.3333333333%; } + .col-lg-push-8 { + left: 66.6666666667%; } + .col-lg-push-9 { + left: 75%; } + .col-lg-push-10 { + left: 83.3333333333%; } + .col-lg-push-11 { + left: 91.6666666667%; } + .col-lg-push-12 { + left: 100%; } + .col-lg-offset-0 { + margin-left: 0%; } + .col-lg-offset-1 { + margin-left: 8.3333333333%; } + .col-lg-offset-2 { + margin-left: 16.6666666667%; } + .col-lg-offset-3 { + margin-left: 25%; } + .col-lg-offset-4 { + margin-left: 33.3333333333%; } + .col-lg-offset-5 { + margin-left: 41.6666666667%; } + .col-lg-offset-6 { + margin-left: 50%; } + .col-lg-offset-7 { + margin-left: 58.3333333333%; } + .col-lg-offset-8 { + margin-left: 66.6666666667%; } + .col-lg-offset-9 { + margin-left: 75%; } + .col-lg-offset-10 { + margin-left: 83.3333333333%; } + .col-lg-offset-11 { + margin-left: 91.6666666667%; } + .col-lg-offset-12 { + margin-left: 100%; } } + +table { + background-color: transparent; } + table col[class*="col-"] { + position: static; + display: table-column; + float: none; } + table td[class*="col-"], + table th[class*="col-"] { + position: static; + display: table-cell; + float: none; } + +caption { + padding-top: 8px; + padding-bottom: 8px; + color: #777777; + text-align: left; } + +th { + text-align: left; } + +.table { + width: 100%; + max-width: 100%; + margin-bottom: 20px; } + .table > thead > tr > th, + .table > thead > tr > td, + .table > tbody > tr > th, + .table > tbody > tr > td, + .table > tfoot > tr > th, + .table > tfoot > tr > td { + padding: 8px; + line-height: 1.428571429; + vertical-align: top; + border-top: 1px solid #ddd; } + .table > thead > tr > th { + vertical-align: bottom; + border-bottom: 2px solid #ddd; } + .table > caption + thead > tr:first-child > th, + .table > caption + thead > tr:first-child > td, + .table > colgroup + thead > tr:first-child > th, + .table > colgroup + thead > tr:first-child > td, + .table > thead:first-child > tr:first-child > th, + .table > thead:first-child > tr:first-child > td { + border-top: 0; } + .table > tbody + tbody { + border-top: 2px solid #ddd; } + .table .table { + background-color: #fff; } + +.table-condensed > thead > tr > th, +.table-condensed > thead > tr > td, +.table-condensed > tbody > tr > th, +.table-condensed > tbody > tr > td, +.table-condensed > tfoot > tr > th, +.table-condensed > tfoot > tr > td { + padding: 5px; } + +.table-bordered { + border: 1px solid #ddd; } + .table-bordered > thead > tr > th, + .table-bordered > thead > tr > td, + .table-bordered > tbody > tr > th, + .table-bordered > tbody > tr > td, + .table-bordered > tfoot > tr > th, + .table-bordered > tfoot > tr > td { + border: 1px solid #ddd; } + .table-bordered > thead > tr > th, + .table-bordered > thead > tr > td { + border-bottom-width: 2px; } + +.table-striped > tbody > tr:nth-of-type(odd) { + background-color: #f9f9f9; } + +.table-hover > tbody > tr:hover { + background-color: #f5f5f5; } + +.table > thead > tr > td.active, +.table > thead > tr > th.active, .table > thead > tr.active > td, .table > thead > tr.active > th, +.table > tbody > tr > td.active, +.table > tbody > tr > th.active, +.table > tbody > tr.active > td, +.table > tbody > tr.active > th, +.table > tfoot > tr > td.active, +.table > tfoot > tr > th.active, +.table > tfoot > tr.active > td, +.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:hover > .active, .table-hover > tbody > tr.active:hover > th { + background-color: #e8e8e8; } + +.table > thead > tr > td.success, +.table > thead > tr > th.success, .table > thead > tr.success > td, .table > thead > tr.success > th, +.table > tbody > tr > td.success, +.table > tbody > tr > th.success, +.table > tbody > tr.success > td, +.table > tbody > tr.success > th, +.table > tfoot > tr > td.success, +.table > tfoot > tr > th.success, +.table > tfoot > tr.success > td, +.table > tfoot > tr.success > th { + background-color: #dff0d8; } + +.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:hover > .success, .table-hover > tbody > tr.success:hover > th { + background-color: #d0e9c6; } + +.table > thead > tr > td.info, +.table > thead > tr > th.info, .table > thead > tr.info > td, .table > thead > tr.info > th, +.table > tbody > tr > td.info, +.table > tbody > tr > th.info, +.table > tbody > tr.info > td, +.table > tbody > tr.info > th, +.table > tfoot > tr > td.info, +.table > tfoot > tr > th.info, +.table > tfoot > tr.info > td, +.table > tfoot > tr.info > th { + background-color: #d9edf7; } + +.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:hover > .info, .table-hover > tbody > tr.info:hover > th { + background-color: #c4e3f3; } + +.table > thead > tr > td.warning, +.table > thead > tr > th.warning, .table > thead > tr.warning > td, .table > thead > tr.warning > th, +.table > tbody > tr > td.warning, +.table > tbody > tr > th.warning, +.table > tbody > tr.warning > td, +.table > tbody > tr.warning > th, +.table > tfoot > tr > td.warning, +.table > tfoot > tr > th.warning, +.table > tfoot > tr.warning > td, +.table > tfoot > tr.warning > th { + background-color: #fcf8e3; } + +.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:hover > .warning, .table-hover > tbody > tr.warning:hover > th { + background-color: #faf2cc; } + +.table > thead > tr > td.danger, +.table > thead > tr > th.danger, .table > thead > tr.danger > td, .table > thead > tr.danger > th, +.table > tbody > tr > td.danger, +.table > tbody > tr > th.danger, +.table > tbody > tr.danger > td, +.table > tbody > tr.danger > th, +.table > tfoot > tr > td.danger, +.table > tfoot > tr > th.danger, +.table > tfoot > tr.danger > td, +.table > tfoot > tr.danger > th { + background-color: #f2dede; } + +.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:hover > .danger, .table-hover > tbody > tr.danger:hover > th { + background-color: #ebcccc; } + +.table-responsive { + min-height: .01%; + overflow-x: auto; } + @media screen and (max-width: 767px) { + .table-responsive { + width: 100%; + margin-bottom: 15px; + overflow-y: hidden; + -ms-overflow-style: -ms-autohiding-scrollbar; + border: 1px solid #ddd; } + .table-responsive > .table { + margin-bottom: 0; } + .table-responsive > .table > thead > tr > th, + .table-responsive > .table > thead > tr > td, + .table-responsive > .table > tbody > tr > th, + .table-responsive > .table > tbody > tr > td, + .table-responsive > .table > tfoot > tr > th, + .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 > thead > tr > td:first-child, + .table-responsive > .table-bordered > tbody > tr > th:first-child, + .table-responsive > .table-bordered > tbody > tr > td:first-child, + .table-responsive > .table-bordered > tfoot > tr > th: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 > thead > tr > td:last-child, + .table-responsive > .table-bordered > tbody > tr > th:last-child, + .table-responsive > .table-bordered > tbody > tr > td:last-child, + .table-responsive > .table-bordered > tfoot > tr > th: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 > tbody > tr:last-child > td, + .table-responsive > .table-bordered > tfoot > tr:last-child > th, + .table-responsive > .table-bordered > tfoot > tr:last-child > td { + border-bottom: 0; } } +fieldset { + min-width: 0; + padding: 0; + margin: 0; + border: 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; + max-width: 100%; + margin-bottom: 5px; + font-weight: 700; } + +input[type="search"] { + -webkit-box-sizing: border-box; + -moz-box-sizing: border-box; + box-sizing: border-box; + -webkit-appearance: none; + appearance: none; } + +input[type="radio"], +input[type="checkbox"] { + margin: 4px 0 0; + margin-top: 1px \9; + line-height: normal; } + input[type="radio"][disabled], input.disabled[type="radio"], fieldset[disabled] input[type="radio"], + input[type="checkbox"][disabled], + input.disabled[type="checkbox"], fieldset[disabled] input[type="checkbox"] { + cursor: not-allowed; } + +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: 5px auto -webkit-focus-ring-color; + outline-offset: -2px; } + +output { + display: block; + padding-top: 7px; + font-size: 14px; + line-height: 1.428571429; + color: #555555; } + +.form-control { + display: block; + width: 100%; + height: 34px; + padding: 6px 12px; + font-size: 14px; + line-height: 1.428571429; + color: #555555; + background-color: #fff; + background-image: none; + border: 1px solid #ccc; + border-radius: 4px; + -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 0.15s, box-shadow ease-in-out 0.15s; + -o-transition: border-color ease-in-out 0.15s, box-shadow ease-in-out 0.15s; + transition: border-color ease-in-out 0.15s, box-shadow ease-in-out 0.15s; } + .form-control:focus { + border-color: #66afe9; + outline: 0; + -webkit-box-shadow: inset 0 1px 1px rgba(0, 0, 0, 0.075), 0 0 8px rgba(102, 175, 233, 0.6); + box-shadow: inset 0 1px 1px rgba(0, 0, 0, 0.075), 0 0 8px rgba(102, 175, 233, 0.6); } + .form-control::-moz-placeholder { + color: #999; + opacity: 1; } + .form-control:-ms-input-placeholder { + color: #999; } + .form-control::-webkit-input-placeholder { + color: #999; } + .form-control::-ms-expand { + background-color: transparent; + border: 0; } + .form-control[disabled], .form-control[readonly], fieldset[disabled] .form-control { + background-color: #eeeeee; + opacity: 1; } + .form-control[disabled], fieldset[disabled] .form-control { + cursor: not-allowed; } + +textarea.form-control { + height: auto; } + +@media screen and (-webkit-min-device-pixel-ratio: 0) { + input.form-control[type="date"], + input.form-control[type="time"], + input.form-control[type="datetime-local"], + input.form-control[type="month"] { + line-height: 34px; } + input.input-sm[type="date"], .input-group-sm > .form-control[type="date"], + .input-group-sm > .input-group-addon[type="date"], + .input-group-sm > .input-group-btn > .btn[type="date"], .input-group-sm input[type="date"], + input.input-sm[type="time"], + .input-group-sm > .form-control[type="time"], + .input-group-sm > .input-group-addon[type="time"], + .input-group-sm > .input-group-btn > .btn[type="time"], .input-group-sm input[type="time"], + input.input-sm[type="datetime-local"], + .input-group-sm > .form-control[type="datetime-local"], + .input-group-sm > .input-group-addon[type="datetime-local"], + .input-group-sm > .input-group-btn > .btn[type="datetime-local"], .input-group-sm input[type="datetime-local"], + input.input-sm[type="month"], + .input-group-sm > .form-control[type="month"], + .input-group-sm > .input-group-addon[type="month"], + .input-group-sm > .input-group-btn > .btn[type="month"], .input-group-sm input[type="month"] { + line-height: 30px; } + input.input-lg[type="date"], .input-group-lg > .form-control[type="date"], + .input-group-lg > .input-group-addon[type="date"], + .input-group-lg > .input-group-btn > .btn[type="date"], .input-group-lg input[type="date"], + input.input-lg[type="time"], + .input-group-lg > .form-control[type="time"], + .input-group-lg > .input-group-addon[type="time"], + .input-group-lg > .input-group-btn > .btn[type="time"], .input-group-lg input[type="time"], + input.input-lg[type="datetime-local"], + .input-group-lg > .form-control[type="datetime-local"], + .input-group-lg > .input-group-addon[type="datetime-local"], + .input-group-lg > .input-group-btn > .btn[type="datetime-local"], .input-group-lg input[type="datetime-local"], + input.input-lg[type="month"], + .input-group-lg > .form-control[type="month"], + .input-group-lg > .input-group-addon[type="month"], + .input-group-lg > .input-group-btn > .btn[type="month"], .input-group-lg input[type="month"] { + line-height: 46px; } } + +.form-group { + margin-bottom: 15px; } + +.radio, +.checkbox { + position: relative; + display: block; + margin-top: 10px; + margin-bottom: 10px; } + .radio.disabled label, fieldset[disabled] .radio label, + .checkbox.disabled label, fieldset[disabled] .checkbox label { + cursor: not-allowed; } + .radio label, + .checkbox label { + min-height: 20px; + padding-left: 20px; + margin-bottom: 0; + font-weight: 400; + cursor: pointer; } + +.radio input[type="radio"], +.radio-inline input[type="radio"], +.checkbox input[type="checkbox"], +.checkbox-inline input[type="checkbox"] { + position: absolute; + margin-top: 4px \9; + margin-left: -20px; } + +.radio + .radio, +.checkbox + .checkbox { + margin-top: -5px; } + +.radio-inline, +.checkbox-inline { + position: relative; + display: inline-block; + padding-left: 20px; + margin-bottom: 0; + font-weight: 400; + vertical-align: middle; + cursor: pointer; } + .radio-inline.disabled, fieldset[disabled] .radio-inline, + .checkbox-inline.disabled, fieldset[disabled] .checkbox-inline { + cursor: not-allowed; } + +.radio-inline + .radio-inline, +.checkbox-inline + .checkbox-inline { + margin-top: 0; + margin-left: 10px; } + +.form-control-static { + min-height: 34px; + padding-top: 7px; + padding-bottom: 7px; + margin-bottom: 0; } + .form-control-static.input-lg, .input-group-lg > .form-control-static.form-control, + .input-group-lg > .form-control-static.input-group-addon, + .input-group-lg > .input-group-btn > .form-control-static.btn, .form-control-static.input-sm, .input-group-sm > .form-control-static.form-control, + .input-group-sm > .form-control-static.input-group-addon, + .input-group-sm > .input-group-btn > .form-control-static.btn { + padding-right: 0; + padding-left: 0; } + +.input-sm, .input-group-sm > .form-control, +.input-group-sm > .input-group-addon, +.input-group-sm > .input-group-btn > .btn { + height: 30px; + padding: 5px 10px; + font-size: 12px; + line-height: 1.5; + border-radius: 3px; } + +select.input-sm, .input-group-sm > select.form-control, +.input-group-sm > select.input-group-addon, +.input-group-sm > .input-group-btn > select.btn { + height: 30px; + line-height: 30px; } + +textarea.input-sm, .input-group-sm > textarea.form-control, +.input-group-sm > textarea.input-group-addon, +.input-group-sm > .input-group-btn > textarea.btn, +select.input-sm[multiple], +.input-group-sm > .form-control[multiple], +.input-group-sm > .input-group-addon[multiple], +.input-group-sm > .input-group-btn > .btn[multiple] { + height: auto; } + +.form-group-sm .form-control { + height: 30px; + padding: 5px 10px; + font-size: 12px; + line-height: 1.5; + border-radius: 3px; } + +.form-group-sm select.form-control { + height: 30px; + line-height: 30px; } + +.form-group-sm textarea.form-control, +.form-group-sm select.form-control[multiple] { + height: auto; } + +.form-group-sm .form-control-static { + height: 30px; + min-height: 32px; + padding: 6px 10px; + font-size: 12px; + line-height: 1.5; } + +.input-lg, .input-group-lg > .form-control, +.input-group-lg > .input-group-addon, +.input-group-lg > .input-group-btn > .btn { + height: 46px; + padding: 10px 16px; + font-size: 18px; + line-height: 1.3333333; + border-radius: 6px; } + +select.input-lg, .input-group-lg > select.form-control, +.input-group-lg > select.input-group-addon, +.input-group-lg > .input-group-btn > select.btn { + height: 46px; + line-height: 46px; } + +textarea.input-lg, .input-group-lg > textarea.form-control, +.input-group-lg > textarea.input-group-addon, +.input-group-lg > .input-group-btn > textarea.btn, +select.input-lg[multiple], +.input-group-lg > .form-control[multiple], +.input-group-lg > .input-group-addon[multiple], +.input-group-lg > .input-group-btn > .btn[multiple] { + height: auto; } + +.form-group-lg .form-control { + height: 46px; + padding: 10px 16px; + font-size: 18px; + line-height: 1.3333333; + border-radius: 6px; } + +.form-group-lg select.form-control { + height: 46px; + line-height: 46px; } + +.form-group-lg textarea.form-control, +.form-group-lg select.form-control[multiple] { + height: auto; } + +.form-group-lg .form-control-static { + height: 46px; + min-height: 38px; + padding: 11px 16px; + font-size: 18px; + line-height: 1.3333333; } + +.has-feedback { + position: relative; } + .has-feedback .form-control { + padding-right: 42.5px; } + +.form-control-feedback { + position: absolute; + top: 0; + right: 0; + z-index: 2; + display: block; + width: 34px; + height: 34px; + line-height: 34px; + text-align: center; + pointer-events: none; } + +.input-lg + .form-control-feedback, .input-group-lg > .form-control + .form-control-feedback, +.input-group-lg > .input-group-addon + .form-control-feedback, +.input-group-lg > .input-group-btn > .btn + .form-control-feedback, +.input-group-lg + .form-control-feedback, +.form-group-lg .form-control + .form-control-feedback { + width: 46px; + height: 46px; + line-height: 46px; } + +.input-sm + .form-control-feedback, .input-group-sm > .form-control + .form-control-feedback, +.input-group-sm > .input-group-addon + .form-control-feedback, +.input-group-sm > .input-group-btn > .btn + .form-control-feedback, +.input-group-sm + .form-control-feedback, +.form-group-sm .form-control + .form-control-feedback { + width: 30px; + height: 30px; + line-height: 30px; } + +.has-success .help-block, +.has-success .control-label, +.has-success .radio, +.has-success .checkbox, +.has-success .radio-inline, +.has-success .checkbox-inline, .has-success.radio label, .has-success.checkbox label, .has-success.radio-inline label, .has-success.checkbox-inline label { + color: #3c763d; } + +.has-success .form-control { + border-color: #3c763d; + -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: #2b542c; + -webkit-box-shadow: inset 0 1px 1px rgba(0, 0, 0, 0.075), 0 0 6px #67b168; + box-shadow: inset 0 1px 1px rgba(0, 0, 0, 0.075), 0 0 6px #67b168; } + +.has-success .input-group-addon { + color: #3c763d; + background-color: #dff0d8; + border-color: #3c763d; } + +.has-success .form-control-feedback { + color: #3c763d; } + +.has-warning .help-block, +.has-warning .control-label, +.has-warning .radio, +.has-warning .checkbox, +.has-warning .radio-inline, +.has-warning .checkbox-inline, .has-warning.radio label, .has-warning.checkbox label, .has-warning.radio-inline label, .has-warning.checkbox-inline label { + color: #8a6d3b; } + +.has-warning .form-control { + border-color: #8a6d3b; + -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: #66512c; + -webkit-box-shadow: inset 0 1px 1px rgba(0, 0, 0, 0.075), 0 0 6px #c0a16b; + box-shadow: inset 0 1px 1px rgba(0, 0, 0, 0.075), 0 0 6px #c0a16b; } + +.has-warning .input-group-addon { + color: #8a6d3b; + background-color: #fcf8e3; + border-color: #8a6d3b; } + +.has-warning .form-control-feedback { + color: #8a6d3b; } + +.has-error .help-block, +.has-error .control-label, +.has-error .radio, +.has-error .checkbox, +.has-error .radio-inline, +.has-error .checkbox-inline, .has-error.radio label, .has-error.checkbox label, .has-error.radio-inline label, .has-error.checkbox-inline label { + color: #a94442; } + +.has-error .form-control { + border-color: #a94442; + -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: #843534; + -webkit-box-shadow: inset 0 1px 1px rgba(0, 0, 0, 0.075), 0 0 6px #ce8483; + box-shadow: inset 0 1px 1px rgba(0, 0, 0, 0.075), 0 0 6px #ce8483; } + +.has-error .input-group-addon { + color: #a94442; + background-color: #f2dede; + border-color: #a94442; } + +.has-error .form-control-feedback { + color: #a94442; } + +.has-feedback label ~ .form-control-feedback { + top: 25px; } + +.has-feedback label.sr-only ~ .form-control-feedback { + top: 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 .form-control-static { + display: inline-block; } + .form-inline .input-group { + display: inline-table; + vertical-align: middle; } + .form-inline .input-group .input-group-addon, + .form-inline .input-group .input-group-btn, + .form-inline .input-group .form-control { + width: auto; } + .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; + vertical-align: middle; } + .form-inline .radio label, + .form-inline .checkbox label { + padding-left: 0; } + .form-inline .radio input[type="radio"], + .form-inline .checkbox input[type="checkbox"] { + position: relative; + margin-left: 0; } + .form-inline .has-feedback .form-control-feedback { + top: 0; } } + +.form-horizontal .radio, +.form-horizontal .checkbox, +.form-horizontal .radio-inline, +.form-horizontal .checkbox-inline { + padding-top: 7px; + margin-top: 0; + margin-bottom: 0; } + +.form-horizontal .radio, +.form-horizontal .checkbox { + min-height: 27px; } + +.form-horizontal .form-group { + margin-right: -15px; + margin-left: -15px; } + .form-horizontal .form-group:before, .form-horizontal .form-group:after { + display: table; + content: " "; } + .form-horizontal .form-group:after { + clear: both; } + +@media (min-width: 768px) { + .form-horizontal .control-label { + padding-top: 7px; + margin-bottom: 0; + text-align: right; } } + +.form-horizontal .has-feedback .form-control-feedback { + right: 15px; } + +@media (min-width: 768px) { + .form-horizontal .form-group-lg .control-label { + padding-top: 11px; + font-size: 18px; } } + +@media (min-width: 768px) { + .form-horizontal .form-group-sm .control-label { + padding-top: 6px; + font-size: 12px; } } + +.btn { + display: inline-block; + margin-bottom: 0; + font-weight: normal; + text-align: center; + white-space: nowrap; + vertical-align: middle; + touch-action: manipulation; + cursor: pointer; + background-image: none; + border: 1px solid transparent; + padding: 6px 12px; + font-size: 14px; + line-height: 1.428571429; + border-radius: 4px; + -webkit-user-select: none; + -moz-user-select: none; + -ms-user-select: none; + user-select: none; } + .btn:focus, .btn.focus, .btn:active:focus, .btn.focus:active, .btn.active:focus, .btn.active.focus { + outline: 5px auto -webkit-focus-ring-color; + outline-offset: -2px; } + .btn:hover, .btn:focus, .btn.focus { + color: #333; + text-decoration: none; } + .btn:active, .btn.active { + background-image: none; + outline: 0; + -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; + filter: alpha(opacity=65); + opacity: 0.65; + -webkit-box-shadow: none; + box-shadow: none; } + +a.btn.disabled, fieldset[disabled] a.btn { + pointer-events: none; } + +.btn-default { + color: #333; + background-color: #fff; + border-color: #ccc; } + .btn-default:focus, .btn-default.focus { + color: #333; + background-color: #e6e6e6; + border-color: #8c8c8c; } + .btn-default:hover { + color: #333; + background-color: #e6e6e6; + border-color: #adadad; } + .btn-default:active, .btn-default.active, .open > .btn-default.dropdown-toggle { + color: #333; + background-color: #e6e6e6; + background-image: none; + border-color: #adadad; } + .btn-default:active:hover, .btn-default:active:focus, .btn-default.focus:active, .btn-default.active:hover, .btn-default.active:focus, .btn-default.active.focus, .open > .btn-default.dropdown-toggle:hover, .open > .btn-default.dropdown-toggle:focus, .open > .btn-default.dropdown-toggle.focus { + color: #333; + background-color: #d4d4d4; + border-color: #8c8c8c; } + .btn-default.disabled:hover, .btn-default.disabled:focus, .btn-default.disabled.focus, .btn-default[disabled]:hover, .btn-default[disabled]:focus, .btn-default.focus[disabled], fieldset[disabled] .btn-default:hover, fieldset[disabled] .btn-default:focus, fieldset[disabled] .btn-default.focus { + background-color: #fff; + border-color: #ccc; } + .btn-default .badge { + color: #fff; + background-color: #333; } + +.btn-primary { + color: #fff; + background-color: #337ab7; + border-color: #2e6da4; } + .btn-primary:focus, .btn-primary.focus { + color: #fff; + background-color: #286090; + border-color: #122b40; } + .btn-primary:hover { + color: #fff; + background-color: #286090; + border-color: #204d74; } + .btn-primary:active, .btn-primary.active, .open > .btn-primary.dropdown-toggle { + color: #fff; + background-color: #286090; + background-image: none; + border-color: #204d74; } + .btn-primary:active:hover, .btn-primary:active:focus, .btn-primary.focus:active, .btn-primary.active:hover, .btn-primary.active:focus, .btn-primary.active.focus, .open > .btn-primary.dropdown-toggle:hover, .open > .btn-primary.dropdown-toggle:focus, .open > .btn-primary.dropdown-toggle.focus { + color: #fff; + background-color: #204d74; + border-color: #122b40; } + .btn-primary.disabled:hover, .btn-primary.disabled:focus, .btn-primary.disabled.focus, .btn-primary[disabled]:hover, .btn-primary[disabled]:focus, .btn-primary.focus[disabled], fieldset[disabled] .btn-primary:hover, fieldset[disabled] .btn-primary:focus, fieldset[disabled] .btn-primary.focus { + background-color: #337ab7; + border-color: #2e6da4; } + .btn-primary .badge { + color: #337ab7; + background-color: #fff; } + +.btn-success { + color: #fff; + background-color: #5cb85c; + border-color: #4cae4c; } + .btn-success:focus, .btn-success.focus { + color: #fff; + background-color: #449d44; + border-color: #255625; } + .btn-success:hover { + color: #fff; + background-color: #449d44; + border-color: #398439; } + .btn-success:active, .btn-success.active, .open > .btn-success.dropdown-toggle { + color: #fff; + background-color: #449d44; + background-image: none; + border-color: #398439; } + .btn-success:active:hover, .btn-success:active:focus, .btn-success.focus:active, .btn-success.active:hover, .btn-success.active:focus, .btn-success.active.focus, .open > .btn-success.dropdown-toggle:hover, .open > .btn-success.dropdown-toggle:focus, .open > .btn-success.dropdown-toggle.focus { + color: #fff; + background-color: #398439; + border-color: #255625; } + .btn-success.disabled:hover, .btn-success.disabled:focus, .btn-success.disabled.focus, .btn-success[disabled]:hover, .btn-success[disabled]:focus, .btn-success.focus[disabled], fieldset[disabled] .btn-success:hover, fieldset[disabled] .btn-success:focus, fieldset[disabled] .btn-success.focus { + background-color: #5cb85c; + border-color: #4cae4c; } + .btn-success .badge { + color: #5cb85c; + background-color: #fff; } + +.btn-info { + color: #fff; + background-color: #5bc0de; + border-color: #46b8da; } + .btn-info:focus, .btn-info.focus { + color: #fff; + background-color: #31b0d5; + border-color: #1b6d85; } + .btn-info:hover { + color: #fff; + background-color: #31b0d5; + border-color: #269abc; } + .btn-info:active, .btn-info.active, .open > .btn-info.dropdown-toggle { + color: #fff; + background-color: #31b0d5; + background-image: none; + border-color: #269abc; } + .btn-info:active:hover, .btn-info:active:focus, .btn-info.focus:active, .btn-info.active:hover, .btn-info.active:focus, .btn-info.active.focus, .open > .btn-info.dropdown-toggle:hover, .open > .btn-info.dropdown-toggle:focus, .open > .btn-info.dropdown-toggle.focus { + color: #fff; + background-color: #269abc; + border-color: #1b6d85; } + .btn-info.disabled:hover, .btn-info.disabled:focus, .btn-info.disabled.focus, .btn-info[disabled]:hover, .btn-info[disabled]:focus, .btn-info.focus[disabled], fieldset[disabled] .btn-info:hover, fieldset[disabled] .btn-info:focus, fieldset[disabled] .btn-info.focus { + background-color: #5bc0de; + border-color: #46b8da; } + .btn-info .badge { + color: #5bc0de; + background-color: #fff; } + +.btn-warning { + color: #fff; + background-color: #f0ad4e; + border-color: #eea236; } + .btn-warning:focus, .btn-warning.focus { + color: #fff; + background-color: #ec971f; + border-color: #985f0d; } + .btn-warning:hover { + color: #fff; + background-color: #ec971f; + border-color: #d58512; } + .btn-warning:active, .btn-warning.active, .open > .btn-warning.dropdown-toggle { + color: #fff; + background-color: #ec971f; + background-image: none; + border-color: #d58512; } + .btn-warning:active:hover, .btn-warning:active:focus, .btn-warning.focus:active, .btn-warning.active:hover, .btn-warning.active:focus, .btn-warning.active.focus, .open > .btn-warning.dropdown-toggle:hover, .open > .btn-warning.dropdown-toggle:focus, .open > .btn-warning.dropdown-toggle.focus { + color: #fff; + background-color: #d58512; + border-color: #985f0d; } + .btn-warning.disabled:hover, .btn-warning.disabled:focus, .btn-warning.disabled.focus, .btn-warning[disabled]:hover, .btn-warning[disabled]:focus, .btn-warning.focus[disabled], fieldset[disabled] .btn-warning:hover, fieldset[disabled] .btn-warning:focus, fieldset[disabled] .btn-warning.focus { + background-color: #f0ad4e; + border-color: #eea236; } + .btn-warning .badge { + color: #f0ad4e; + background-color: #fff; } + +.btn-danger { + color: #fff; + background-color: #d9534f; + border-color: #d43f3a; } + .btn-danger:focus, .btn-danger.focus { + color: #fff; + background-color: #c9302c; + border-color: #761c19; } + .btn-danger:hover { + color: #fff; + background-color: #c9302c; + border-color: #ac2925; } + .btn-danger:active, .btn-danger.active, .open > .btn-danger.dropdown-toggle { + color: #fff; + background-color: #c9302c; + background-image: none; + border-color: #ac2925; } + .btn-danger:active:hover, .btn-danger:active:focus, .btn-danger.focus:active, .btn-danger.active:hover, .btn-danger.active:focus, .btn-danger.active.focus, .open > .btn-danger.dropdown-toggle:hover, .open > .btn-danger.dropdown-toggle:focus, .open > .btn-danger.dropdown-toggle.focus { + color: #fff; + background-color: #ac2925; + border-color: #761c19; } + .btn-danger.disabled:hover, .btn-danger.disabled:focus, .btn-danger.disabled.focus, .btn-danger[disabled]:hover, .btn-danger[disabled]:focus, .btn-danger.focus[disabled], fieldset[disabled] .btn-danger:hover, fieldset[disabled] .btn-danger:focus, fieldset[disabled] .btn-danger.focus { + background-color: #d9534f; + border-color: #d43f3a; } + .btn-danger .badge { + color: #d9534f; + background-color: #fff; } + +.btn-link { + font-weight: 400; + color: #337ab7; + border-radius: 0; } + .btn-link, .btn-link:active, .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: #23527c; + text-decoration: underline; + background-color: transparent; } + .btn-link[disabled]:hover, .btn-link[disabled]:focus, fieldset[disabled] .btn-link:hover, fieldset[disabled] .btn-link:focus { + color: #777777; + text-decoration: none; } + +.btn-lg, .btn-group-lg > .btn { + padding: 10px 16px; + font-size: 18px; + line-height: 1.3333333; + border-radius: 6px; } + +.btn-sm, .btn-group-sm > .btn { + padding: 5px 10px; + font-size: 12px; + line-height: 1.5; + border-radius: 3px; } + +.btn-xs, .btn-group-xs > .btn { + padding: 1px 5px; + font-size: 12px; + line-height: 1.5; + border-radius: 3px; } + +.btn-block { + display: block; + width: 100%; } + +.btn-block + .btn-block { + margin-top: 5px; } + +input.btn-block[type="submit"], +input.btn-block[type="reset"], +input.btn-block[type="button"] { + width: 100%; } + +.fade { + opacity: 0; + -webkit-transition: opacity 0.15s linear; + -o-transition: opacity 0.15s linear; + transition: opacity 0.15s linear; } + .fade.in { + opacity: 1; } + +.collapse { + display: none; } + .collapse.in { + display: block; } + +tr.collapse.in { + display: table-row; } + +tbody.collapse.in { + display: table-row-group; } + +.collapsing { + position: relative; + height: 0; + overflow: hidden; + -webkit-transition-property: height, visibility; + transition-property: height, visibility; + -webkit-transition-duration: 0.35s; + transition-duration: 0.35s; + -webkit-transition-timing-function: ease; + transition-timing-function: ease; } + +.caret { + display: inline-block; + width: 0; + height: 0; + margin-left: 2px; + vertical-align: middle; + border-top: 4px dashed; + border-top: 4px solid \9; + border-right: 4px solid transparent; + border-left: 4px solid transparent; } + +.dropup, +.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; + font-size: 14px; + text-align: left; + list-style: none; + background-color: #fff; + background-clip: padding-box; + border: 1px solid #ccc; + border: 1px solid rgba(0, 0, 0, 0.15); + border-radius: 4px; + -webkit-box-shadow: 0 6px 12px rgba(0, 0, 0, 0.175); + box-shadow: 0 6px 12px rgba(0, 0, 0, 0.175); } + .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: 400; + line-height: 1.428571429; + color: #333333; + white-space: nowrap; } + .dropdown-menu > li > a:hover, .dropdown-menu > li > a:focus { + color: #262626; + text-decoration: none; + background-color: #f5f5f5; } + +.dropdown-menu > .active > a, .dropdown-menu > .active > a:hover, .dropdown-menu > .active > a:focus { + color: #fff; + text-decoration: none; + background-color: #337ab7; + outline: 0; } + +.dropdown-menu > .disabled > a, .dropdown-menu > .disabled > a:hover, .dropdown-menu > .disabled > a:focus { + color: #777777; } + +.dropdown-menu > .disabled > a:hover, .dropdown-menu > .disabled > a:focus { + text-decoration: none; + cursor: not-allowed; + background-color: transparent; + background-image: none; + filter: progid:DXImageTransform.Microsoft.gradient(enabled = false); } + +.open > .dropdown-menu { + display: block; } + +.open > a { + outline: 0; } + +.dropdown-menu-right { + right: 0; + left: auto; } + +.dropdown-menu-left { + right: auto; + left: 0; } + +.dropdown-header { + display: block; + padding: 3px 20px; + font-size: 12px; + line-height: 1.428571429; + color: #777777; + white-space: nowrap; } + +.dropdown-backdrop { + position: fixed; + top: 0; + right: 0; + bottom: 0; + left: 0; + z-index: 990; } + +.pull-right > .dropdown-menu { + right: 0; + left: auto; } + +.dropup .caret, +.navbar-fixed-bottom .dropdown .caret { + content: ""; + border-top: 0; + border-bottom: 4px dashed; + border-bottom: 4px solid \9; } + +.dropup .dropdown-menu, +.navbar-fixed-bottom .dropdown .dropdown-menu { + top: auto; + bottom: 100%; + margin-bottom: 2px; } + +@media (min-width: 768px) { + .navbar-right .dropdown-menu { + right: 0; + left: auto; } + .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 > .btn:focus, .btn-group > .btn:active, .btn-group > .btn.active, + .btn-group-vertical > .btn:hover, + .btn-group-vertical > .btn:focus, + .btn-group-vertical > .btn:active, + .btn-group-vertical > .btn.active { + z-index: 2; } + +.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:before, .btn-toolbar:after { + display: table; + content: " "; } + .btn-toolbar:after { + clear: both; } + .btn-toolbar .btn, + .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-top-right-radius: 0; + border-bottom-right-radius: 0; } + +.btn-group > .btn:last-child:not(:first-child), +.btn-group > .dropdown-toggle:not(:first-child) { + border-top-left-radius: 0; + border-bottom-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:not(:last-child) > .btn:last-child, +.btn-group > .btn-group:first-child:not(:last-child) > .dropdown-toggle { + border-top-right-radius: 0; + border-bottom-right-radius: 0; } + +.btn-group > .btn-group:last-child:not(:first-child) > .btn:first-child { + border-top-left-radius: 0; + border-bottom-left-radius: 0; } + +.btn-group .dropdown-toggle:active, +.btn-group.open .dropdown-toggle { + outline: 0; } + +.btn-group > .btn + .dropdown-toggle { + padding-right: 8px; + padding-left: 8px; } + +.btn-group > .btn-lg + .dropdown-toggle, .btn-group-lg.btn-group > .btn + .dropdown-toggle { + padding-right: 12px; + padding-left: 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, .btn-group-lg > .btn .caret { + border-width: 5px 5px 0; + border-bottom-width: 0; } + +.dropup .btn-lg .caret, .dropup .btn-group-lg > .btn .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:before, .btn-group-vertical > .btn-group:after { + display: table; + content: " "; } + +.btn-group-vertical > .btn-group:after { + clear: both; } + +.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-left-radius: 4px; + border-top-right-radius: 4px; + border-bottom-right-radius: 0; + border-bottom-left-radius: 0; } + +.btn-group-vertical > .btn:last-child:not(:first-child) { + border-top-left-radius: 0; + border-top-right-radius: 0; + border-bottom-right-radius: 4px; + border-bottom-left-radius: 4px; } + +.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-left-radius: 0; + border-top-right-radius: 0; } + +.btn-group-justified { + display: table; + width: 100%; + table-layout: fixed; + border-collapse: separate; } + .btn-group-justified > .btn, + .btn-group-justified > .btn-group { + display: table-cell; + float: none; + width: 1%; } + .btn-group-justified > .btn-group .btn { + width: 100%; } + .btn-group-justified > .btn-group .dropdown-menu { + left: auto; } + +[data-toggle="buttons"] > .btn input[type="radio"], +[data-toggle="buttons"] > .btn input[type="checkbox"], +[data-toggle="buttons"] > .btn-group > .btn input[type="radio"], +[data-toggle="buttons"] > .btn-group > .btn input[type="checkbox"] { + position: absolute; + clip: rect(0, 0, 0, 0); + pointer-events: none; } + +.input-group { + position: relative; + display: table; + border-collapse: separate; } + .input-group[class*="col-"] { + float: none; + padding-right: 0; + padding-left: 0; } + .input-group .form-control { + position: relative; + z-index: 2; + float: left; + width: 100%; + margin-bottom: 0; } + .input-group .form-control:focus { + z-index: 3; } + +.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: 6px 12px; + font-size: 14px; + font-weight: 400; + line-height: 1; + color: #555555; + text-align: center; + background-color: #eeeeee; + border: 1px solid #ccc; + border-radius: 4px; } + .input-group-addon.input-sm, + .input-group-sm > .input-group-addon, + .input-group-sm > .input-group-btn > .input-group-addon.btn { + padding: 5px 10px; + font-size: 12px; + border-radius: 3px; } + .input-group-addon.input-lg, + .input-group-lg > .input-group-addon, + .input-group-lg > .input-group-btn > .input-group-addon.btn { + padding: 10px 16px; + font-size: 18px; + border-radius: 6px; } + .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-top-right-radius: 0; + border-bottom-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-top-left-radius: 0; + border-bottom-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 { + z-index: 2; + margin-left: -1px; } + +.nav { + padding-left: 0; + margin-bottom: 0; + list-style: none; } + .nav:before, .nav:after { + display: table; + content: " "; } + .nav:after { + clear: both; } + .nav > li { + position: relative; + display: block; } + .nav > li > a { + position: relative; + display: block; + padding: 10px 15px; } + .nav > li > a:hover, .nav > li > a:focus { + text-decoration: none; + background-color: #eeeeee; } + .nav > li.disabled > a { + color: #777777; } + .nav > li.disabled > a:hover, .nav > li.disabled > a:focus { + color: #777777; + text-decoration: none; + cursor: not-allowed; + background-color: transparent; } + .nav .open > a, .nav .open > a:hover, .nav .open > a:focus { + background-color: #eeeeee; + border-color: #337ab7; } + .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 #ddd; } + .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: 4px 4px 0 0; } + .nav-tabs > li > a:hover { + border-color: #eeeeee #eeeeee #ddd; } + .nav-tabs > li.active > a, .nav-tabs > li.active > a:hover, .nav-tabs > li.active > a:focus { + color: #555555; + cursor: default; + background-color: #fff; + border: 1px solid #ddd; + border-bottom-color: transparent; } + +.nav-pills > li { + float: left; } + .nav-pills > li > a { + border-radius: 4px; } + .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: #fff; + background-color: #337ab7; } + +.nav-stacked > li { + float: none; } + .nav-stacked > li + li { + margin-top: 2px; + margin-left: 0; } + +.nav-justified, .nav-tabs.nav-justified { + width: 100%; } + .nav-justified > li, .nav-tabs.nav-justified > li { + float: none; } + .nav-justified > li > a, .nav-tabs.nav-justified > li > a { + margin-bottom: 5px; + text-align: center; } + .nav-justified > .dropdown .dropdown-menu { + top: auto; + left: auto; } + @media (min-width: 768px) { + .nav-justified > li, .nav-tabs.nav-justified > li { + display: table-cell; + width: 1%; } + .nav-justified > li > a, .nav-tabs.nav-justified > li > a { + margin-bottom: 0; } } +.nav-tabs-justified, .nav-tabs.nav-justified { + border-bottom: 0; } + .nav-tabs-justified > li > a, .nav-tabs.nav-justified > li > a { + margin-right: 0; + border-radius: 4px; } + .nav-tabs-justified > .active > a, .nav-tabs.nav-justified > .active > a, + .nav-tabs-justified > .active > a:hover, + .nav-tabs-justified > .active > a:focus { + border: 1px solid #ddd; } + @media (min-width: 768px) { + .nav-tabs-justified > li > a, .nav-tabs.nav-justified > li > a { + border-bottom: 1px solid #ddd; + border-radius: 4px 4px 0 0; } + .nav-tabs-justified > .active > a, .nav-tabs.nav-justified > .active > a, + .nav-tabs-justified > .active > a:hover, + .nav-tabs-justified > .active > a:focus { + border-bottom-color: #fff; } } +.tab-content > .tab-pane { + display: none; } + +.tab-content > .active { + display: block; } + +.nav-tabs .dropdown-menu { + margin-top: -1px; + border-top-left-radius: 0; + border-top-right-radius: 0; } + +.navbar { + position: relative; + min-height: 50px; + margin-bottom: 20px; + border: 1px solid transparent; } + .navbar:before, .navbar:after { + display: table; + content: " "; } + .navbar:after { + clear: both; } + @media (min-width: 768px) { + .navbar { + border-radius: 4px; } } +.navbar-header:before, .navbar-header:after { + display: table; + content: " "; } + +.navbar-header:after { + clear: both; } + +@media (min-width: 768px) { + .navbar-header { + float: left; } } + +.navbar-collapse { + padding-right: 15px; + padding-left: 15px; + overflow-x: visible; + border-top: 1px solid transparent; + box-shadow: inset 0 1px 0 rgba(255, 255, 255, 0.1); + -webkit-overflow-scrolling: touch; } + .navbar-collapse:before, .navbar-collapse:after { + display: table; + content: " "; } + .navbar-collapse:after { + clear: both; } + .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-right: 0; + padding-left: 0; } } +.navbar-fixed-top, +.navbar-fixed-bottom { + position: fixed; + right: 0; + left: 0; + z-index: 1030; } + .navbar-fixed-top .navbar-collapse, + .navbar-fixed-bottom .navbar-collapse { + max-height: 340px; } + @media (max-device-width: 480px) and (orientation: landscape) { + .navbar-fixed-top .navbar-collapse, + .navbar-fixed-bottom .navbar-collapse { + max-height: 200px; } } + @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; } + +.container > .navbar-header, +.container > .navbar-collapse, +.container-fluid > .navbar-header, +.container-fluid > .navbar-collapse { + margin-right: -15px; + margin-left: -15px; } + @media (min-width: 768px) { + .container > .navbar-header, + .container > .navbar-collapse, + .container-fluid > .navbar-header, + .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-brand { + float: left; + height: 50px; + padding: 15px 15px; + font-size: 18px; + line-height: 20px; } + .navbar-brand:hover, .navbar-brand:focus { + text-decoration: none; } + .navbar-brand > img { + display: block; } + @media (min-width: 768px) { + .navbar > .container .navbar-brand, .navbar > .container-fluid .navbar-brand { + margin-left: -15px; } } +.navbar-toggle { + position: relative; + float: right; + padding: 9px 10px; + margin-right: 15px; + margin-top: 8px; + margin-bottom: 8px; + background-color: transparent; + background-image: none; + border: 1px solid transparent; + border-radius: 4px; } + .navbar-toggle:focus { + outline: 0; } + .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: 7.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: 15px; + padding-bottom: 15px; } } +.navbar-form { + padding: 10px 15px; + margin-right: -15px; + margin-left: -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: 8px; + margin-bottom: 8px; } + @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 .form-control-static { + display: inline-block; } + .navbar-form .input-group { + display: inline-table; + vertical-align: middle; } + .navbar-form .input-group .input-group-addon, + .navbar-form .input-group .input-group-btn, + .navbar-form .input-group .form-control { + width: auto; } + .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; + vertical-align: middle; } + .navbar-form .radio label, + .navbar-form .checkbox label { + padding-left: 0; } + .navbar-form .radio input[type="radio"], + .navbar-form .checkbox input[type="checkbox"] { + position: relative; + margin-left: 0; } + .navbar-form .has-feedback .form-control-feedback { + top: 0; } } + @media (max-width: 767px) { + .navbar-form .form-group { + margin-bottom: 5px; } + .navbar-form .form-group:last-child { + margin-bottom: 0; } } + @media (min-width: 768px) { + .navbar-form { + width: auto; + padding-top: 0; + padding-bottom: 0; + margin-right: 0; + margin-left: 0; + border: 0; + -webkit-box-shadow: none; + box-shadow: none; } } +.navbar-nav > li > .dropdown-menu { + margin-top: 0; + border-top-left-radius: 0; + border-top-right-radius: 0; } + +.navbar-fixed-bottom .navbar-nav > li > .dropdown-menu { + margin-bottom: 0; + border-top-left-radius: 4px; + border-top-right-radius: 4px; + border-bottom-right-radius: 0; + border-bottom-left-radius: 0; } + +.navbar-btn { + margin-top: 8px; + margin-bottom: 8px; } + .navbar-btn.btn-sm, .btn-group-sm > .navbar-btn.btn { + margin-top: 10px; + margin-bottom: 10px; } + .navbar-btn.btn-xs, .btn-group-xs > .navbar-btn.btn { + margin-top: 14px; + margin-bottom: 14px; } + +.navbar-text { + margin-top: 15px; + margin-bottom: 15px; } + @media (min-width: 768px) { + .navbar-text { + float: left; + margin-right: 15px; + margin-left: 15px; } } +@media (min-width: 768px) { + .navbar-left { + float: left !important; } + .navbar-right { + float: right !important; + margin-right: -15px; } + .navbar-right ~ .navbar-right { + margin-right: 0; } } + +.navbar-default { + background-color: #f8f8f8; + border-color: #e7e7e7; } + .navbar-default .navbar-brand { + color: #777; } + .navbar-default .navbar-brand:hover, .navbar-default .navbar-brand:focus { + color: #5e5e5e; + background-color: transparent; } + .navbar-default .navbar-text { + color: #777; } + .navbar-default .navbar-nav > li > a { + color: #777; } + .navbar-default .navbar-nav > li > a:hover, .navbar-default .navbar-nav > li > a:focus { + color: #333; + background-color: transparent; } + .navbar-default .navbar-nav > .active > a, .navbar-default .navbar-nav > .active > a:hover, .navbar-default .navbar-nav > .active > a:focus { + color: #555; + background-color: #e7e7e7; } + .navbar-default .navbar-nav > .disabled > a, .navbar-default .navbar-nav > .disabled > a:hover, .navbar-default .navbar-nav > .disabled > a:focus { + color: #ccc; + background-color: transparent; } + .navbar-default .navbar-nav > .open > a, .navbar-default .navbar-nav > .open > a:hover, .navbar-default .navbar-nav > .open > a:focus { + color: #555; + background-color: #e7e7e7; } + @media (max-width: 767px) { + .navbar-default .navbar-nav .open .dropdown-menu > li > a { + color: #777; } + .navbar-default .navbar-nav .open .dropdown-menu > li > a:hover, .navbar-default .navbar-nav .open .dropdown-menu > li > a:focus { + color: #333; + 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: #555; + background-color: #e7e7e7; } + .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: #ccc; + background-color: transparent; } } + .navbar-default .navbar-toggle { + border-color: #ddd; } + .navbar-default .navbar-toggle:hover, .navbar-default .navbar-toggle:focus { + background-color: #ddd; } + .navbar-default .navbar-toggle .icon-bar { + background-color: #888; } + .navbar-default .navbar-collapse, + .navbar-default .navbar-form { + border-color: #e7e7e7; } + .navbar-default .navbar-link { + color: #777; } + .navbar-default .navbar-link:hover { + color: #333; } + .navbar-default .btn-link { + color: #777; } + .navbar-default .btn-link:hover, .navbar-default .btn-link:focus { + color: #333; } + .navbar-default .btn-link[disabled]:hover, .navbar-default .btn-link[disabled]:focus, fieldset[disabled] .navbar-default .btn-link:hover, fieldset[disabled] .navbar-default .btn-link:focus { + color: #ccc; } + +.navbar-inverse { + background-color: #222; + border-color: #090909; } + .navbar-inverse .navbar-brand { + color: #9d9d9d; } + .navbar-inverse .navbar-brand:hover, .navbar-inverse .navbar-brand:focus { + color: #fff; + background-color: transparent; } + .navbar-inverse .navbar-text { + color: #9d9d9d; } + .navbar-inverse .navbar-nav > li > a { + color: #9d9d9d; } + .navbar-inverse .navbar-nav > li > a:hover, .navbar-inverse .navbar-nav > li > a:focus { + color: #fff; + background-color: transparent; } + .navbar-inverse .navbar-nav > .active > a, .navbar-inverse .navbar-nav > .active > a:hover, .navbar-inverse .navbar-nav > .active > a:focus { + color: #fff; + background-color: #090909; } + .navbar-inverse .navbar-nav > .disabled > a, .navbar-inverse .navbar-nav > .disabled > a:hover, .navbar-inverse .navbar-nav > .disabled > a:focus { + color: #444; + background-color: transparent; } + .navbar-inverse .navbar-nav > .open > a, .navbar-inverse .navbar-nav > .open > a:hover, .navbar-inverse .navbar-nav > .open > a:focus { + color: #fff; + background-color: #090909; } + @media (max-width: 767px) { + .navbar-inverse .navbar-nav .open .dropdown-menu > .dropdown-header { + border-color: #090909; } + .navbar-inverse .navbar-nav .open .dropdown-menu .divider { + background-color: #090909; } + .navbar-inverse .navbar-nav .open .dropdown-menu > li > a { + color: #9d9d9d; } + .navbar-inverse .navbar-nav .open .dropdown-menu > li > a:hover, .navbar-inverse .navbar-nav .open .dropdown-menu > li > a:focus { + color: #fff; + 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: #fff; + background-color: #090909; } + .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: #444; + background-color: transparent; } } + .navbar-inverse .navbar-toggle { + border-color: #333; } + .navbar-inverse .navbar-toggle:hover, .navbar-inverse .navbar-toggle:focus { + background-color: #333; } + .navbar-inverse .navbar-toggle .icon-bar { + background-color: #fff; } + .navbar-inverse .navbar-collapse, + .navbar-inverse .navbar-form { + border-color: #101010; } + .navbar-inverse .navbar-link { + color: #9d9d9d; } + .navbar-inverse .navbar-link:hover { + color: #fff; } + .navbar-inverse .btn-link { + color: #9d9d9d; } + .navbar-inverse .btn-link:hover, .navbar-inverse .btn-link:focus { + color: #fff; } + .navbar-inverse .btn-link[disabled]:hover, .navbar-inverse .btn-link[disabled]:focus, fieldset[disabled] .navbar-inverse .btn-link:hover, fieldset[disabled] .navbar-inverse .btn-link:focus { + color: #444; } + +.breadcrumb { + padding: 8px 15px; + margin-bottom: 20px; + list-style: none; + background-color: #f5f5f5; + border-radius: 4px; } + .breadcrumb > li { + display: inline-block; } + .breadcrumb > li + li:before { + padding: 0 5px; + color: #ccc; + content: "/ "; } + .breadcrumb > .active { + color: #777777; } + +.pagination { + display: inline-block; + padding-left: 0; + margin: 20px 0; + border-radius: 4px; } + .pagination > li { + display: inline; } + .pagination > li > a, + .pagination > li > span { + position: relative; + float: left; + padding: 6px 12px; + margin-left: -1px; + line-height: 1.428571429; + color: #337ab7; + text-decoration: none; + background-color: #fff; + border: 1px solid #ddd; } + .pagination > li > a:hover, .pagination > li > a:focus, + .pagination > li > span:hover, + .pagination > li > span:focus { + z-index: 2; + color: #23527c; + background-color: #eeeeee; + border-color: #ddd; } + .pagination > li:first-child > a, + .pagination > li:first-child > span { + margin-left: 0; + border-top-left-radius: 4px; + border-bottom-left-radius: 4px; } + .pagination > li:last-child > a, + .pagination > li:last-child > span { + border-top-right-radius: 4px; + border-bottom-right-radius: 4px; } + .pagination > .active > a, .pagination > .active > a:hover, .pagination > .active > a:focus, + .pagination > .active > span, + .pagination > .active > span:hover, + .pagination > .active > span:focus { + z-index: 3; + color: #fff; + cursor: default; + background-color: #337ab7; + border-color: #337ab7; } + .pagination > .disabled > span, + .pagination > .disabled > span:hover, + .pagination > .disabled > span:focus, + .pagination > .disabled > a, + .pagination > .disabled > a:hover, + .pagination > .disabled > a:focus { + color: #777777; + cursor: not-allowed; + background-color: #fff; + border-color: #ddd; } + +.pagination-lg > li > a, +.pagination-lg > li > span { + padding: 10px 16px; + font-size: 18px; + line-height: 1.3333333; } + +.pagination-lg > li:first-child > a, +.pagination-lg > li:first-child > span { + border-top-left-radius: 6px; + border-bottom-left-radius: 6px; } + +.pagination-lg > li:last-child > a, +.pagination-lg > li:last-child > span { + border-top-right-radius: 6px; + border-bottom-right-radius: 6px; } + +.pagination-sm > li > a, +.pagination-sm > li > span { + padding: 5px 10px; + font-size: 12px; + line-height: 1.5; } + +.pagination-sm > li:first-child > a, +.pagination-sm > li:first-child > span { + border-top-left-radius: 3px; + border-bottom-left-radius: 3px; } + +.pagination-sm > li:last-child > a, +.pagination-sm > li:last-child > span { + border-top-right-radius: 3px; + border-bottom-right-radius: 3px; } + +.pager { + padding-left: 0; + margin: 20px 0; + text-align: center; + list-style: none; } + .pager:before, .pager:after { + display: table; + content: " "; } + .pager:after { + clear: both; } + .pager li { + display: inline; } + .pager li > a, + .pager li > span { + display: inline-block; + padding: 5px 14px; + background-color: #fff; + border: 1px solid #ddd; + 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: #777777; + cursor: not-allowed; + background-color: #fff; } + +.label { + display: inline; + padding: .2em .6em .3em; + font-size: 75%; + font-weight: 700; + line-height: 1; + color: #fff; + text-align: center; + white-space: nowrap; + vertical-align: baseline; + border-radius: .25em; } + .label:empty { + display: none; } + .btn .label { + position: relative; + top: -1px; } + +a.label:hover, a.label:focus { + color: #fff; + text-decoration: none; + cursor: pointer; } + +.label-default { + background-color: #777777; } + .label-default[href]:hover, .label-default[href]:focus { + background-color: #5e5e5e; } + +.label-primary { + background-color: #337ab7; } + .label-primary[href]:hover, .label-primary[href]:focus { + background-color: #286090; } + +.label-success { + background-color: #5cb85c; } + .label-success[href]:hover, .label-success[href]:focus { + background-color: #449d44; } + +.label-info { + background-color: #5bc0de; } + .label-info[href]:hover, .label-info[href]:focus { + background-color: #31b0d5; } + +.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; + line-height: 1; + color: #fff; + text-align: center; + white-space: nowrap; + vertical-align: middle; + background-color: #777777; + border-radius: 10px; } + .badge:empty { + display: none; } + .btn .badge { + position: relative; + top: -1px; } + .btn-xs .badge, .btn-group-xs > .btn .badge { + top: 0; + padding: 1px 5px; } + .list-group-item.active > .badge, .nav-pills > .active > a > .badge { + color: #337ab7; + background-color: #fff; } + .list-group-item > .badge { + float: right; } + .list-group-item > .badge + .badge { + margin-right: 5px; } + .nav-pills > li > a > .badge { + margin-left: 3px; } + +a.badge:hover, a.badge:focus { + color: #fff; + text-decoration: none; + cursor: pointer; } + +.jumbotron { + padding-top: 30px; + padding-bottom: 30px; + margin-bottom: 30px; + color: inherit; + background-color: #eeeeee; } + .jumbotron h1, + .jumbotron .h1 { + color: inherit; } + .jumbotron p { + margin-bottom: 15px; + font-size: 21px; + font-weight: 200; } + .jumbotron > hr { + border-top-color: #d5d5d5; } + .container .jumbotron, .container-fluid .jumbotron { + padding-right: 15px; + padding-left: 15px; + border-radius: 6px; } + .jumbotron .container { + max-width: 100%; } + @media screen and (min-width: 768px) { + .jumbotron { + padding-top: 48px; + padding-bottom: 48px; } + .container .jumbotron, .container-fluid .jumbotron { + padding-right: 60px; + padding-left: 60px; } + .jumbotron h1, + .jumbotron .h1 { + font-size: 63px; } } +.thumbnail { + display: block; + padding: 4px; + margin-bottom: 20px; + line-height: 1.428571429; + background-color: #fff; + border: 1px solid #ddd; + border-radius: 4px; + -webkit-transition: border 0.2s ease-in-out; + -o-transition: border 0.2s ease-in-out; + transition: border 0.2s ease-in-out; } + .thumbnail > img, + .thumbnail a > img { + display: block; + max-width: 100%; + height: auto; + margin-right: auto; + margin-left: auto; } + .thumbnail .caption { + padding: 9px; + color: #333333; } + +a.thumbnail:hover, +a.thumbnail:focus, +a.thumbnail.active { + border-color: #337ab7; } + +.alert { + padding: 15px; + margin-bottom: 20px; + border: 1px solid transparent; + border-radius: 4px; } + .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, +.alert-dismissible { + padding-right: 35px; } + .alert-dismissable .close, + .alert-dismissible .close { + position: relative; + top: -2px; + right: -21px; + color: inherit; } + +.alert-success { + color: #3c763d; + background-color: #dff0d8; + border-color: #d6e9c6; } + .alert-success hr { + border-top-color: #c9e2b3; } + .alert-success .alert-link { + color: #2b542c; } + +.alert-info { + color: #31708f; + background-color: #d9edf7; + border-color: #bce8f1; } + .alert-info hr { + border-top-color: #a6e1ec; } + .alert-info .alert-link { + color: #245269; } + +.alert-warning { + color: #8a6d3b; + background-color: #fcf8e3; + border-color: #faebcc; } + .alert-warning hr { + border-top-color: #f7e1b5; } + .alert-warning .alert-link { + color: #66512c; } + +.alert-danger { + color: #a94442; + background-color: #f2dede; + border-color: #ebccd1; } + .alert-danger hr { + border-top-color: #e4b9c0; } + .alert-danger .alert-link { + color: #843534; } + +@-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 { + height: 20px; + margin-bottom: 20px; + overflow: hidden; + background-color: #f5f5f5; + border-radius: 4px; + -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: #fff; + text-align: center; + background-color: #337ab7; + -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; + -o-transition: width 0.6s ease; + transition: width 0.6s ease; } + +.progress-striped .progress-bar, +.progress-bar-striped { + 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: -o-linear-gradient(45deg, rgba(255, 255, 255, 0.15) 25%, transparent 25%, transparent 50%, rgba(255, 255, 255, 0.15) 50%, rgba(255, 255, 255, 0.15) 75%, transparent 75%, transparent); + background-image: linear-gradient(45deg, rgba(255, 255, 255, 0.15) 25%, transparent 25%, transparent 50%, rgba(255, 255, 255, 0.15) 50%, rgba(255, 255, 255, 0.15) 75%, transparent 75%, transparent); + background-size: 40px 40px; } + +.progress.active .progress-bar, +.progress-bar.active { + -webkit-animation: progress-bar-stripes 2s linear infinite; + -o-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: -o-linear-gradient(45deg, rgba(255, 255, 255, 0.15) 25%, transparent 25%, transparent 50%, rgba(255, 255, 255, 0.15) 50%, rgba(255, 255, 255, 0.15) 75%, transparent 75%, transparent); + background-image: linear-gradient(45deg, rgba(255, 255, 255, 0.15) 25%, transparent 25%, transparent 50%, rgba(255, 255, 255, 0.15) 50%, rgba(255, 255, 255, 0.15) 75%, transparent 75%, transparent); } + +.progress-bar-info { + background-color: #5bc0de; } + .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: -o-linear-gradient(45deg, rgba(255, 255, 255, 0.15) 25%, transparent 25%, transparent 50%, rgba(255, 255, 255, 0.15) 50%, rgba(255, 255, 255, 0.15) 75%, transparent 75%, transparent); + background-image: linear-gradient(45deg, rgba(255, 255, 255, 0.15) 25%, transparent 25%, transparent 50%, rgba(255, 255, 255, 0.15) 50%, rgba(255, 255, 255, 0.15) 75%, transparent 75%, transparent); } + +.progress-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: -o-linear-gradient(45deg, rgba(255, 255, 255, 0.15) 25%, transparent 25%, transparent 50%, rgba(255, 255, 255, 0.15) 50%, rgba(255, 255, 255, 0.15) 75%, transparent 75%, transparent); + background-image: linear-gradient(45deg, rgba(255, 255, 255, 0.15) 25%, transparent 25%, transparent 50%, rgba(255, 255, 255, 0.15) 50%, rgba(255, 255, 255, 0.15) 75%, transparent 75%, transparent); } + +.progress-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: -o-linear-gradient(45deg, rgba(255, 255, 255, 0.15) 25%, transparent 25%, transparent 50%, rgba(255, 255, 255, 0.15) 50%, rgba(255, 255, 255, 0.15) 75%, transparent 75%, transparent); + background-image: linear-gradient(45deg, rgba(255, 255, 255, 0.15) 25%, transparent 25%, transparent 50%, rgba(255, 255, 255, 0.15) 50%, rgba(255, 255, 255, 0.15) 75%, transparent 75%, transparent); } + +.media { + margin-top: 15px; } + .media:first-child { + margin-top: 0; } + +.media, +.media-body { + overflow: hidden; + zoom: 1; } + +.media-body { + width: 10000px; } + +.media-object { + display: block; } + .media-object.img-thumbnail { + max-width: none; } + +.media-right, +.media > .pull-right { + padding-left: 10px; } + +.media-left, +.media > .pull-left { + padding-right: 10px; } + +.media-left, +.media-right, +.media-body { + display: table-cell; + vertical-align: top; } + +.media-middle { + vertical-align: middle; } + +.media-bottom { + vertical-align: bottom; } + +.media-heading { + margin-top: 0; + margin-bottom: 5px; } + +.media-list { + padding-left: 0; + list-style: none; } + +.list-group { + padding-left: 0; + margin-bottom: 20px; } + +.list-group-item { + position: relative; + display: block; + padding: 10px 15px; + margin-bottom: -1px; + background-color: #fff; + border: 1px solid #ddd; } + .list-group-item:first-child { + border-top-left-radius: 4px; + border-top-right-radius: 4px; } + .list-group-item:last-child { + margin-bottom: 0; + border-bottom-right-radius: 4px; + border-bottom-left-radius: 4px; } + .list-group-item.disabled, .list-group-item.disabled:hover, .list-group-item.disabled:focus { + color: #777777; + cursor: not-allowed; + background-color: #eeeeee; } + .list-group-item.disabled .list-group-item-heading, .list-group-item.disabled:hover .list-group-item-heading, .list-group-item.disabled:focus .list-group-item-heading { + color: inherit; } + .list-group-item.disabled .list-group-item-text, .list-group-item.disabled:hover .list-group-item-text, .list-group-item.disabled:focus .list-group-item-text { + color: #777777; } + .list-group-item.active, .list-group-item.active:hover, .list-group-item.active:focus { + z-index: 2; + color: #fff; + background-color: #337ab7; + border-color: #337ab7; } + .list-group-item.active .list-group-item-heading, + .list-group-item.active .list-group-item-heading > small, + .list-group-item.active .list-group-item-heading > .small, .list-group-item.active:hover .list-group-item-heading, + .list-group-item.active:hover .list-group-item-heading > small, + .list-group-item.active:hover .list-group-item-heading > .small, .list-group-item.active:focus .list-group-item-heading, + .list-group-item.active:focus .list-group-item-heading > small, + .list-group-item.active:focus .list-group-item-heading > .small { + color: inherit; } + .list-group-item.active .list-group-item-text, .list-group-item.active:hover .list-group-item-text, .list-group-item.active:focus .list-group-item-text { + color: #c7ddef; } + +a.list-group-item, +button.list-group-item { + color: #555; } + a.list-group-item .list-group-item-heading, + button.list-group-item .list-group-item-heading { + color: #333; } + a.list-group-item:hover, a.list-group-item:focus, + button.list-group-item:hover, + button.list-group-item:focus { + color: #555; + text-decoration: none; + background-color: #f5f5f5; } + +button.list-group-item { + width: 100%; + text-align: left; } + +.list-group-item-success { + color: #3c763d; + background-color: #dff0d8; } + +a.list-group-item-success, +button.list-group-item-success { + color: #3c763d; } + a.list-group-item-success .list-group-item-heading, + button.list-group-item-success .list-group-item-heading { + color: inherit; } + a.list-group-item-success:hover, a.list-group-item-success:focus, + button.list-group-item-success:hover, + button.list-group-item-success:focus { + color: #3c763d; + background-color: #d0e9c6; } + a.list-group-item-success.active, a.list-group-item-success.active:hover, a.list-group-item-success.active:focus, + button.list-group-item-success.active, + button.list-group-item-success.active:hover, + button.list-group-item-success.active:focus { + color: #fff; + background-color: #3c763d; + border-color: #3c763d; } + +.list-group-item-info { + color: #31708f; + background-color: #d9edf7; } + +a.list-group-item-info, +button.list-group-item-info { + color: #31708f; } + a.list-group-item-info .list-group-item-heading, + button.list-group-item-info .list-group-item-heading { + color: inherit; } + a.list-group-item-info:hover, a.list-group-item-info:focus, + button.list-group-item-info:hover, + button.list-group-item-info:focus { + color: #31708f; + background-color: #c4e3f3; } + a.list-group-item-info.active, a.list-group-item-info.active:hover, a.list-group-item-info.active:focus, + button.list-group-item-info.active, + button.list-group-item-info.active:hover, + button.list-group-item-info.active:focus { + color: #fff; + background-color: #31708f; + border-color: #31708f; } + +.list-group-item-warning { + color: #8a6d3b; + background-color: #fcf8e3; } + +a.list-group-item-warning, +button.list-group-item-warning { + color: #8a6d3b; } + a.list-group-item-warning .list-group-item-heading, + button.list-group-item-warning .list-group-item-heading { + color: inherit; } + a.list-group-item-warning:hover, a.list-group-item-warning:focus, + button.list-group-item-warning:hover, + button.list-group-item-warning:focus { + color: #8a6d3b; + background-color: #faf2cc; } + a.list-group-item-warning.active, a.list-group-item-warning.active:hover, a.list-group-item-warning.active:focus, + button.list-group-item-warning.active, + button.list-group-item-warning.active:hover, + button.list-group-item-warning.active:focus { + color: #fff; + background-color: #8a6d3b; + border-color: #8a6d3b; } + +.list-group-item-danger { + color: #a94442; + background-color: #f2dede; } + +a.list-group-item-danger, +button.list-group-item-danger { + color: #a94442; } + a.list-group-item-danger .list-group-item-heading, + button.list-group-item-danger .list-group-item-heading { + color: inherit; } + a.list-group-item-danger:hover, a.list-group-item-danger:focus, + button.list-group-item-danger:hover, + button.list-group-item-danger:focus { + color: #a94442; + background-color: #ebcccc; } + a.list-group-item-danger.active, a.list-group-item-danger.active:hover, a.list-group-item-danger.active:focus, + button.list-group-item-danger.active, + button.list-group-item-danger.active:hover, + button.list-group-item-danger.active:focus { + color: #fff; + background-color: #a94442; + border-color: #a94442; } + +.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: #fff; + border: 1px solid transparent; + border-radius: 4px; + -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-body:before, .panel-body:after { + display: table; + content: " "; } + .panel-body:after { + clear: both; } + +.panel-heading { + padding: 10px 15px; + border-bottom: 1px solid transparent; + border-top-left-radius: 3px; + border-top-right-radius: 3px; } + .panel-heading > .dropdown .dropdown-toggle { + color: inherit; } + +.panel-title { + margin-top: 0; + margin-bottom: 0; + font-size: 16px; + color: inherit; } + .panel-title > a, + .panel-title > small, + .panel-title > .small, + .panel-title > small > a, + .panel-title > .small > a { + color: inherit; } + +.panel-footer { + padding: 10px 15px; + background-color: #f5f5f5; + border-top: 1px solid #ddd; + border-bottom-right-radius: 3px; + border-bottom-left-radius: 3px; } + +.panel > .list-group, +.panel > .panel-collapse > .list-group { + margin-bottom: 0; } + .panel > .list-group .list-group-item, + .panel > .panel-collapse > .list-group .list-group-item { + border-width: 1px 0; + border-radius: 0; } + .panel > .list-group:first-child .list-group-item:first-child, + .panel > .panel-collapse > .list-group:first-child .list-group-item:first-child { + border-top: 0; + border-top-left-radius: 3px; + border-top-right-radius: 3px; } + .panel > .list-group:last-child .list-group-item:last-child, + .panel > .panel-collapse > .list-group:last-child .list-group-item:last-child { + border-bottom: 0; + border-bottom-right-radius: 3px; + border-bottom-left-radius: 3px; } + +.panel > .panel-heading + .panel-collapse > .list-group .list-group-item:first-child { + border-top-left-radius: 0; + border-top-right-radius: 0; } + +.panel-heading + .list-group .list-group-item:first-child { + border-top-width: 0; } + +.list-group + .panel-footer { + border-top-width: 0; } + +.panel > .table, +.panel > .table-responsive > .table, +.panel > .panel-collapse > .table { + margin-bottom: 0; } + .panel > .table caption, + .panel > .table-responsive > .table caption, + .panel > .panel-collapse > .table caption { + padding-right: 15px; + padding-left: 15px; } + +.panel > .table:first-child, +.panel > .table-responsive:first-child > .table:first-child { + border-top-left-radius: 3px; + border-top-right-radius: 3px; } + .panel > .table:first-child > thead:first-child > tr:first-child, + .panel > .table:first-child > tbody:first-child > tr:first-child, + .panel > .table-responsive:first-child > .table:first-child > thead:first-child > tr:first-child, + .panel > .table-responsive:first-child > .table:first-child > tbody:first-child > tr:first-child { + border-top-left-radius: 3px; + border-top-right-radius: 3px; } + .panel > .table:first-child > thead:first-child > tr:first-child td:first-child, + .panel > .table:first-child > thead:first-child > tr:first-child th:first-child, + .panel > .table:first-child > tbody:first-child > tr:first-child td:first-child, + .panel > .table:first-child > tbody:first-child > tr:first-child th:first-child, + .panel > .table-responsive:first-child > .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 th:first-child, + .panel > .table-responsive:first-child > .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 th:first-child { + border-top-left-radius: 3px; } + .panel > .table:first-child > thead:first-child > tr:first-child td:last-child, + .panel > .table:first-child > thead:first-child > tr:first-child th:last-child, + .panel > .table:first-child > tbody:first-child > tr:first-child td:last-child, + .panel > .table:first-child > tbody:first-child > tr:first-child th:last-child, + .panel > .table-responsive:first-child > .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 th:last-child, + .panel > .table-responsive:first-child > .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 th:last-child { + border-top-right-radius: 3px; } + +.panel > .table:last-child, +.panel > .table-responsive:last-child > .table:last-child { + border-bottom-right-radius: 3px; + border-bottom-left-radius: 3px; } + .panel > .table:last-child > tbody:last-child > tr:last-child, + .panel > .table:last-child > tfoot:last-child > tr:last-child, + .panel > .table-responsive:last-child > .table:last-child > tbody:last-child > tr:last-child, + .panel > .table-responsive:last-child > .table:last-child > tfoot:last-child > tr:last-child { + border-bottom-right-radius: 3px; + border-bottom-left-radius: 3px; } + .panel > .table:last-child > tbody:last-child > tr:last-child td:first-child, + .panel > .table:last-child > tbody:last-child > tr:last-child th:first-child, + .panel > .table:last-child > tfoot:last-child > tr:last-child td:first-child, + .panel > .table:last-child > tfoot:last-child > tr:last-child th:first-child, + .panel > .table-responsive:last-child > .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 th:first-child, + .panel > .table-responsive:last-child > .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 th:first-child { + border-bottom-left-radius: 3px; } + .panel > .table:last-child > tbody:last-child > tr:last-child td:last-child, + .panel > .table:last-child > tbody:last-child > tr:last-child th:last-child, + .panel > .table:last-child > tfoot:last-child > tr:last-child td:last-child, + .panel > .table:last-child > tfoot:last-child > tr:last-child th:last-child, + .panel > .table-responsive:last-child > .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 th:last-child, + .panel > .table-responsive:last-child > .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 th:last-child { + border-bottom-right-radius: 3px; } + +.panel > .panel-body + .table, +.panel > .panel-body + .table-responsive, +.panel > .table + .panel-body, +.panel > .table-responsive + .panel-body { + border-top: 1px solid #ddd; } + +.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-bordered > thead > tr > td:first-child, + .panel > .table-bordered > tbody > tr > th:first-child, + .panel > .table-bordered > tbody > tr > td:first-child, + .panel > .table-bordered > tfoot > tr > th:first-child, + .panel > .table-bordered > tfoot > tr > td:first-child, + .panel > .table-responsive > .table-bordered > thead > tr > th:first-child, + .panel > .table-responsive > .table-bordered > thead > tr > td:first-child, + .panel > .table-responsive > .table-bordered > tbody > tr > th:first-child, + .panel > .table-responsive > .table-bordered > tbody > tr > td:first-child, + .panel > .table-responsive > .table-bordered > tfoot > tr > th: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-bordered > thead > tr > td:last-child, + .panel > .table-bordered > tbody > tr > th:last-child, + .panel > .table-bordered > tbody > tr > td:last-child, + .panel > .table-bordered > tfoot > tr > th:last-child, + .panel > .table-bordered > tfoot > tr > td:last-child, + .panel > .table-responsive > .table-bordered > thead > tr > th:last-child, + .panel > .table-responsive > .table-bordered > thead > tr > td:last-child, + .panel > .table-responsive > .table-bordered > tbody > tr > th:last-child, + .panel > .table-responsive > .table-bordered > tbody > tr > td:last-child, + .panel > .table-responsive > .table-bordered > tfoot > tr > th: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-bordered > thead > tr:first-child > th, + .panel > .table-bordered > tbody > tr:first-child > td, + .panel > .table-bordered > tbody > tr:first-child > th, + .panel > .table-responsive > .table-bordered > thead > tr:first-child > td, + .panel > .table-responsive > .table-bordered > thead > tr:first-child > th, + .panel > .table-responsive > .table-bordered > tbody > tr:first-child > td, + .panel > .table-responsive > .table-bordered > tbody > tr:first-child > th { + border-bottom: 0; } + .panel > .table-bordered > tbody > tr:last-child > td, + .panel > .table-bordered > tbody > tr:last-child > th, + .panel > .table-bordered > tfoot > tr:last-child > td, + .panel > .table-bordered > tfoot > tr:last-child > th, + .panel > .table-responsive > .table-bordered > tbody > tr:last-child > td, + .panel > .table-responsive > .table-bordered > tbody > tr:last-child > th, + .panel > .table-responsive > .table-bordered > tfoot > tr:last-child > td, + .panel > .table-responsive > .table-bordered > tfoot > tr:last-child > th { + border-bottom: 0; } + +.panel > .table-responsive { + margin-bottom: 0; + border: 0; } + +.panel-group { + margin-bottom: 20px; } + .panel-group .panel { + margin-bottom: 0; + border-radius: 4px; } + .panel-group .panel + .panel { + margin-top: 5px; } + .panel-group .panel-heading { + border-bottom: 0; } + .panel-group .panel-heading + .panel-collapse > .panel-body, + .panel-group .panel-heading + .panel-collapse > .list-group { + border-top: 1px solid #ddd; } + .panel-group .panel-footer { + border-top: 0; } + .panel-group .panel-footer + .panel-collapse .panel-body { + border-bottom: 1px solid #ddd; } + +.panel-default { + border-color: #ddd; } + .panel-default > .panel-heading { + color: #333333; + background-color: #f5f5f5; + border-color: #ddd; } + .panel-default > .panel-heading + .panel-collapse > .panel-body { + border-top-color: #ddd; } + .panel-default > .panel-heading .badge { + color: #f5f5f5; + background-color: #333333; } + .panel-default > .panel-footer + .panel-collapse > .panel-body { + border-bottom-color: #ddd; } + +.panel-primary { + border-color: #337ab7; } + .panel-primary > .panel-heading { + color: #fff; + background-color: #337ab7; + border-color: #337ab7; } + .panel-primary > .panel-heading + .panel-collapse > .panel-body { + border-top-color: #337ab7; } + .panel-primary > .panel-heading .badge { + color: #337ab7; + background-color: #fff; } + .panel-primary > .panel-footer + .panel-collapse > .panel-body { + border-bottom-color: #337ab7; } + +.panel-success { + border-color: #d6e9c6; } + .panel-success > .panel-heading { + color: #3c763d; + background-color: #dff0d8; + border-color: #d6e9c6; } + .panel-success > .panel-heading + .panel-collapse > .panel-body { + border-top-color: #d6e9c6; } + .panel-success > .panel-heading .badge { + color: #dff0d8; + background-color: #3c763d; } + .panel-success > .panel-footer + .panel-collapse > .panel-body { + border-bottom-color: #d6e9c6; } + +.panel-info { + border-color: #bce8f1; } + .panel-info > .panel-heading { + color: #31708f; + background-color: #d9edf7; + border-color: #bce8f1; } + .panel-info > .panel-heading + .panel-collapse > .panel-body { + border-top-color: #bce8f1; } + .panel-info > .panel-heading .badge { + color: #d9edf7; + background-color: #31708f; } + .panel-info > .panel-footer + .panel-collapse > .panel-body { + border-bottom-color: #bce8f1; } + +.panel-warning { + border-color: #faebcc; } + .panel-warning > .panel-heading { + color: #8a6d3b; + background-color: #fcf8e3; + border-color: #faebcc; } + .panel-warning > .panel-heading + .panel-collapse > .panel-body { + border-top-color: #faebcc; } + .panel-warning > .panel-heading .badge { + color: #fcf8e3; + background-color: #8a6d3b; } + .panel-warning > .panel-footer + .panel-collapse > .panel-body { + border-bottom-color: #faebcc; } + +.panel-danger { + border-color: #ebccd1; } + .panel-danger > .panel-heading { + color: #a94442; + background-color: #f2dede; + border-color: #ebccd1; } + .panel-danger > .panel-heading + .panel-collapse > .panel-body { + border-top-color: #ebccd1; } + .panel-danger > .panel-heading .badge { + color: #f2dede; + background-color: #a94442; } + .panel-danger > .panel-footer + .panel-collapse > .panel-body { + border-bottom-color: #ebccd1; } + +.embed-responsive { + position: relative; + display: block; + height: 0; + padding: 0; + overflow: hidden; } + .embed-responsive .embed-responsive-item, + .embed-responsive iframe, + .embed-responsive embed, + .embed-responsive object, + .embed-responsive video { + position: absolute; + top: 0; + bottom: 0; + left: 0; + width: 100%; + height: 100%; + border: 0; } + +.embed-responsive-16by9 { + padding-bottom: 56.25%; } + +.embed-responsive-4by3 { + padding-bottom: 75%; } + +.well { + min-height: 20px; + padding: 19px; + margin-bottom: 20px; + background-color: #f5f5f5; + border: 1px solid #e3e3e3; + border-radius: 4px; + -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: 6px; } + +.well-sm { + padding: 9px; + border-radius: 3px; } + +.close { + float: right; + font-size: 21px; + font-weight: bold; + line-height: 1; + color: #000; + text-shadow: 0 1px 0 #fff; + filter: alpha(opacity=20); + opacity: 0.2; } + .close:hover, .close:focus { + color: #000; + text-decoration: none; + cursor: pointer; + filter: alpha(opacity=50); + opacity: 0.5; } + +button.close { + padding: 0; + cursor: pointer; + background: transparent; + border: 0; + -webkit-appearance: none; + appearance: none; } + +.modal-open { + overflow: hidden; } + +.modal { + position: fixed; + top: 0; + right: 0; + bottom: 0; + left: 0; + z-index: 1050; + display: none; + overflow: hidden; + -webkit-overflow-scrolling: touch; + outline: 0; } + .modal.fade .modal-dialog { + -webkit-transform: translate(0, -25%); + -ms-transform: translate(0, -25%); + -o-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); + -o-transform: translate(0, 0); + transform: translate(0, 0); } + +.modal-open .modal { + overflow-x: hidden; + overflow-y: auto; } + +.modal-dialog { + position: relative; + width: auto; + margin: 10px; } + +.modal-content { + position: relative; + background-color: #fff; + background-clip: padding-box; + border: 1px solid #999; + border: 1px solid rgba(0, 0, 0, 0.2); + border-radius: 6px; + -webkit-box-shadow: 0 3px 9px rgba(0, 0, 0, 0.5); + box-shadow: 0 3px 9px rgba(0, 0, 0, 0.5); + outline: 0; } + +.modal-backdrop { + position: fixed; + top: 0; + right: 0; + bottom: 0; + left: 0; + z-index: 1040; + background-color: #000; } + .modal-backdrop.fade { + filter: alpha(opacity=0); + opacity: 0; } + .modal-backdrop.in { + filter: alpha(opacity=50); + opacity: 0.5; } + +.modal-header { + padding: 15px; + border-bottom: 1px solid #e5e5e5; } + .modal-header:before, .modal-header:after { + display: table; + content: " "; } + .modal-header:after { + clear: both; } + +.modal-header .close { + margin-top: -2px; } + +.modal-title { + margin: 0; + line-height: 1.428571429; } + +.modal-body { + position: relative; + padding: 15px; } + +.modal-footer { + padding: 15px; + text-align: right; + border-top: 1px solid #e5e5e5; } + .modal-footer:before, .modal-footer:after { + display: table; + content: " "; } + .modal-footer:after { + clear: both; } + .modal-footer .btn + .btn { + margin-bottom: 0; + margin-left: 5px; } + .modal-footer .btn-group .btn + .btn { + margin-left: -1px; } + .modal-footer .btn-block + .btn-block { + margin-left: 0; } + +.modal-scrollbar-measure { + position: absolute; + top: -9999px; + width: 50px; + height: 50px; + overflow: scroll; } + +@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: 1070; + display: block; + font-family: "Helvetica Neue", Helvetica, Arial, sans-serif; + font-style: normal; + font-weight: 400; + line-height: 1.428571429; + line-break: auto; + text-align: left; + text-align: start; + text-decoration: none; + text-shadow: none; + text-transform: none; + letter-spacing: normal; + word-break: normal; + word-spacing: normal; + word-wrap: normal; + white-space: normal; + font-size: 12px; + filter: alpha(opacity=0); + opacity: 0; } + .tooltip.in { + filter: alpha(opacity=90); + opacity: 0.9; } + .tooltip.top { + padding: 5px 0; + margin-top: -3px; } + .tooltip.right { + padding: 0 5px; + margin-left: 3px; } + .tooltip.bottom { + padding: 5px 0; + margin-top: 3px; } + .tooltip.left { + padding: 0 5px; + margin-left: -3px; } + .tooltip.top .tooltip-arrow { + bottom: 0; + left: 50%; + margin-left: -5px; + border-width: 5px 5px 0; + border-top-color: #000; } + .tooltip.top-left .tooltip-arrow { + right: 5px; + bottom: 0; + margin-bottom: -5px; + border-width: 5px 5px 0; + border-top-color: #000; } + .tooltip.top-right .tooltip-arrow { + bottom: 0; + left: 5px; + margin-bottom: -5px; + border-width: 5px 5px 0; + border-top-color: #000; } + .tooltip.right .tooltip-arrow { + top: 50%; + left: 0; + margin-top: -5px; + border-width: 5px 5px 5px 0; + border-right-color: #000; } + .tooltip.left .tooltip-arrow { + top: 50%; + right: 0; + margin-top: -5px; + border-width: 5px 0 5px 5px; + border-left-color: #000; } + .tooltip.bottom .tooltip-arrow { + top: 0; + left: 50%; + margin-left: -5px; + border-width: 0 5px 5px; + border-bottom-color: #000; } + .tooltip.bottom-left .tooltip-arrow { + top: 0; + right: 5px; + margin-top: -5px; + border-width: 0 5px 5px; + border-bottom-color: #000; } + .tooltip.bottom-right .tooltip-arrow { + top: 0; + left: 5px; + margin-top: -5px; + border-width: 0 5px 5px; + border-bottom-color: #000; } + +.tooltip-inner { + max-width: 200px; + padding: 3px 8px; + color: #fff; + text-align: center; + background-color: #000; + border-radius: 4px; } + +.tooltip-arrow { + position: absolute; + width: 0; + height: 0; + border-color: transparent; + border-style: solid; } + +.popover { + position: absolute; + top: 0; + left: 0; + z-index: 1060; + display: none; + max-width: 276px; + padding: 1px; + font-family: "Helvetica Neue", Helvetica, Arial, sans-serif; + font-style: normal; + font-weight: 400; + line-height: 1.428571429; + line-break: auto; + text-align: left; + text-align: start; + text-decoration: none; + text-shadow: none; + text-transform: none; + letter-spacing: normal; + word-break: normal; + word-spacing: normal; + word-wrap: normal; + white-space: normal; + font-size: 14px; + background-color: #fff; + background-clip: padding-box; + border: 1px solid #ccc; + border: 1px solid rgba(0, 0, 0, 0.2); + border-radius: 6px; + -webkit-box-shadow: 0 5px 10px rgba(0, 0, 0, 0.2); + box-shadow: 0 5px 10px rgba(0, 0, 0, 0.2); } + .popover.top { + margin-top: -10px; } + .popover.right { + margin-left: 10px; } + .popover.bottom { + margin-top: 10px; } + .popover.left { + margin-left: -10px; } + .popover > .arrow { + border-width: 11px; } + .popover > .arrow, .popover > .arrow:after { + position: absolute; + display: block; + width: 0; + height: 0; + border-color: transparent; + border-style: solid; } + .popover > .arrow:after { + content: ""; + border-width: 10px; } + .popover.top > .arrow { + bottom: -11px; + left: 50%; + margin-left: -11px; + border-top-color: #999999; + border-top-color: rgba(0, 0, 0, 0.25); + border-bottom-width: 0; } + .popover.top > .arrow:after { + bottom: 1px; + margin-left: -10px; + content: " "; + border-top-color: #fff; + border-bottom-width: 0; } + .popover.right > .arrow { + top: 50%; + left: -11px; + margin-top: -11px; + border-right-color: #999999; + border-right-color: rgba(0, 0, 0, 0.25); + border-left-width: 0; } + .popover.right > .arrow:after { + bottom: -10px; + left: 1px; + content: " "; + border-right-color: #fff; + border-left-width: 0; } + .popover.bottom > .arrow { + top: -11px; + left: 50%; + margin-left: -11px; + border-top-width: 0; + border-bottom-color: #999999; + border-bottom-color: rgba(0, 0, 0, 0.25); } + .popover.bottom > .arrow:after { + top: 1px; + margin-left: -10px; + content: " "; + border-top-width: 0; + border-bottom-color: #fff; } + .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 { + right: 1px; + bottom: -10px; + content: " "; + border-right-width: 0; + border-left-color: #fff; } + +.popover-title { + padding: 8px 14px; + margin: 0; + font-size: 14px; + background-color: #f7f7f7; + border-bottom: 1px solid #ebebeb; + border-radius: 5px 5px 0 0; } + +.popover-content { + padding: 9px 14px; } + +.carousel { + position: relative; } + +.carousel-inner { + position: relative; + width: 100%; + overflow: hidden; } + .carousel-inner > .item { + position: relative; + display: none; + -webkit-transition: 0.6s ease-in-out left; + -o-transition: 0.6s ease-in-out left; + transition: 0.6s ease-in-out left; } + .carousel-inner > .item > img, + .carousel-inner > .item > a > img { + display: block; + max-width: 100%; + height: auto; + line-height: 1; } + @media all and (transform-3d), (-webkit-transform-3d) { + .carousel-inner > .item { + -webkit-transition: -webkit-transform 0.6s ease-in-out; + -moz-transition: -moz-transform 0.6s ease-in-out; + -o-transition: -o-transform 0.6s ease-in-out; + transition: transform 0.6s ease-in-out; + -webkit-backface-visibility: hidden; + -moz-backface-visibility: hidden; + backface-visibility: hidden; + -webkit-perspective: 1000px; + -moz-perspective: 1000px; + perspective: 1000px; } + .carousel-inner > .item.next, .carousel-inner > .item.active.right { + -webkit-transform: translate3d(100%, 0, 0); + transform: translate3d(100%, 0, 0); + left: 0; } + .carousel-inner > .item.prev, .carousel-inner > .item.active.left { + -webkit-transform: translate3d(-100%, 0, 0); + transform: translate3d(-100%, 0, 0); + left: 0; } + .carousel-inner > .item.next.left, .carousel-inner > .item.prev.right, .carousel-inner > .item.active { + -webkit-transform: translate3d(0, 0, 0); + transform: translate3d(0, 0, 0); + left: 0; } } + .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; + bottom: 0; + left: 0; + width: 15%; + font-size: 20px; + color: #fff; + text-align: center; + text-shadow: 0 1px 2px rgba(0, 0, 0, 0.6); + background-color: rgba(0, 0, 0, 0); + filter: alpha(opacity=50); + opacity: 0.5; } + .carousel-control.left { + background-image: -webkit-linear-gradient(left, rgba(0, 0, 0, 0.5) 0%, rgba(0, 0, 0, 0.0001) 100%); + background-image: -o-linear-gradient(left, rgba(0, 0, 0, 0.5) 0%, 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%); + filter: progid:DXImageTransform.Microsoft.gradient(startColorstr='#80000000', endColorstr='#00000000', GradientType=1); + background-repeat: repeat-x; } + .carousel-control.right { + right: 0; + left: auto; + background-image: -webkit-linear-gradient(left, rgba(0, 0, 0, 0.0001) 0%, rgba(0, 0, 0, 0.5) 100%); + background-image: -o-linear-gradient(left, rgba(0, 0, 0, 0.0001) 0%, 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%); + filter: progid:DXImageTransform.Microsoft.gradient(startColorstr='#00000000', endColorstr='#80000000', GradientType=1); + background-repeat: repeat-x; } + .carousel-control:hover, .carousel-control:focus { + color: #fff; + text-decoration: none; + outline: 0; + filter: alpha(opacity=90); + opacity: 0.9; } + .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; + margin-top: -10px; } + .carousel-control .icon-prev, + .carousel-control .glyphicon-chevron-left { + left: 50%; + margin-left: -10px; } + .carousel-control .icon-next, + .carousel-control .glyphicon-chevron-right { + right: 50%; + margin-right: -10px; } + .carousel-control .icon-prev, + .carousel-control .icon-next { + width: 20px; + height: 20px; + font-family: serif; + line-height: 1; } + .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%; + padding-left: 0; + margin-left: -30%; + text-align: center; + list-style: none; } + .carousel-indicators li { + display: inline-block; + width: 10px; + height: 10px; + margin: 1px; + text-indent: -999px; + cursor: pointer; + background-color: #000 \9; + background-color: rgba(0, 0, 0, 0); + border: 1px solid #fff; + border-radius: 10px; } + .carousel-indicators .active { + width: 12px; + height: 12px; + margin: 0; + background-color: #fff; } + +.carousel-caption { + position: absolute; + right: 15%; + bottom: 20px; + left: 15%; + z-index: 10; + padding-top: 20px; + padding-bottom: 20px; + color: #fff; + 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: -10px; + font-size: 30px; } + .carousel-control .glyphicon-chevron-left, + .carousel-control .icon-prev { + margin-left: -10px; } + .carousel-control .glyphicon-chevron-right, + .carousel-control .icon-next { + margin-right: -10px; } + .carousel-caption { + right: 20%; + left: 20%; + padding-bottom: 30px; } + .carousel-indicators { + bottom: 20px; } } + +.clearfix:before, .clearfix:after { + display: table; + content: " "; } + +.clearfix:after { + clear: both; } + +.center-block { + display: block; + margin-right: auto; + margin-left: 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; } + +.affix { + position: fixed; } + +@-ms-viewport { + width: device-width; } + +.visible-xs { + display: none !important; } + +.visible-sm { + display: none !important; } + +.visible-md { + display: none !important; } + +.visible-lg { + display: none !important; } + +.visible-xs-block, +.visible-xs-inline, +.visible-xs-inline-block, +.visible-sm-block, +.visible-sm-inline, +.visible-sm-inline-block, +.visible-md-block, +.visible-md-inline, +.visible-md-inline-block, +.visible-lg-block, +.visible-lg-inline, +.visible-lg-inline-block { + display: none !important; } + +@media (max-width: 767px) { + .visible-xs { + display: block !important; } + table.visible-xs { + display: table !important; } + tr.visible-xs { + display: table-row !important; } + th.visible-xs, + td.visible-xs { + display: table-cell !important; } } + +@media (max-width: 767px) { + .visible-xs-block { + display: block !important; } } + +@media (max-width: 767px) { + .visible-xs-inline { + display: inline !important; } } + +@media (max-width: 767px) { + .visible-xs-inline-block { + display: inline-block !important; } } + +@media (min-width: 768px) and (max-width: 991px) { + .visible-sm { + display: block !important; } + table.visible-sm { + display: table !important; } + tr.visible-sm { + display: table-row !important; } + th.visible-sm, + td.visible-sm { + display: table-cell !important; } } + +@media (min-width: 768px) and (max-width: 991px) { + .visible-sm-block { + display: block !important; } } + +@media (min-width: 768px) and (max-width: 991px) { + .visible-sm-inline { + display: inline !important; } } + +@media (min-width: 768px) and (max-width: 991px) { + .visible-sm-inline-block { + display: inline-block !important; } } + +@media (min-width: 992px) and (max-width: 1199px) { + .visible-md { + display: block !important; } + table.visible-md { + display: table !important; } + tr.visible-md { + display: table-row !important; } + th.visible-md, + td.visible-md { + display: table-cell !important; } } + +@media (min-width: 992px) and (max-width: 1199px) { + .visible-md-block { + display: block !important; } } + +@media (min-width: 992px) and (max-width: 1199px) { + .visible-md-inline { + display: inline !important; } } + +@media (min-width: 992px) and (max-width: 1199px) { + .visible-md-inline-block { + display: inline-block !important; } } + +@media (min-width: 1200px) { + .visible-lg { + display: block !important; } + table.visible-lg { + display: table !important; } + tr.visible-lg { + display: table-row !important; } + th.visible-lg, + td.visible-lg { + display: table-cell !important; } } + +@media (min-width: 1200px) { + .visible-lg-block { + display: block !important; } } + +@media (min-width: 1200px) { + .visible-lg-inline { + display: inline !important; } } + +@media (min-width: 1200px) { + .visible-lg-inline-block { + display: inline-block !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 !important; } + tr.visible-print { + display: table-row !important; } + th.visible-print, + td.visible-print { + display: table-cell !important; } } + +.visible-print-block { + display: none !important; } + @media print { + .visible-print-block { + display: block !important; } } +.visible-print-inline { + display: none !important; } + @media print { + .visible-print-inline { + display: inline !important; } } +.visible-print-inline-block { + display: none !important; } + @media print { + .visible-print-inline-block { + display: inline-block !important; } } +@media print { + .hidden-print { + display: none !important; } } diff --git a/stylesheets/highlight.css b/stylesheets/highlight.css new file mode 100644 index 0000000..60f7390 --- /dev/null +++ b/stylesheets/highlight.css @@ -0,0 +1 @@ +.hll{background-color:#49483e}.c{color:#75715e}.err{color:#960050;background-color:#1e0010}.k{color:#66d9ef}.l{color:#ae81ff}.n{color:#f8f8f2}.o{color:#f92672}.p{color:#f8f8f2}.cm{color:#75715e}.cp{color:#75715e}.c1{color:#75715e}.cs{color:#75715e}.gd{color:#f92672}.ge{font-style:italic}.gi{color:#a6e22e}.gs{font-weight:bold}.gu{color:#8672BF}.kc{color:#66d9ef}.kd{color:#66d9ef}.kn{color:#f92672}.kp{color:#66d9ef}.kr{color:#66d9ef}.kt{color:#66d9ef}.ld{color:#e6db74}.m{color:#ae81ff}.s{color:#e6db74}.na{color:#a6e22e}.nb{color:#f8f8f2}.nc{color:#a6e22e}.no{color:#66d9ef}.nd{color:#a6e22e}.ni{color:#f8f8f2}.ne{color:#a6e22e}.nf{color:#a6e22e}.nl{color:#f8f8f2}.nn{color:#f8f8f2}.nx{color:#a6e22e}.py{color:#f8f8f2}.nt{color:#f92672}.nv{color:#f8f8f2}.ow{color:#f92672}.w{color:#f8f8f2}.mb{color:#ae81ff}.mf{color:#ae81ff}.mh{color:#ae81ff}.mi{color:#ae81ff}.mo{color:#ae81ff}.sb{color:#e6db74}.sc{color:#e6db74}.sd{color:#e6db74}.s2{color:#e6db74}.se{color:#ae81ff}.sh{color:#e6db74}.si{color:#e6db74}.sx{color:#e6db74}.sr{color:#e6db74}.s1{color:#e6db74}.ss{color:#e6db74}.bp{color:#f8f8f2}.vc{color:#f8f8f2}.vg{color:#f8f8f2}.vi{color:#f8f8f2}.il{color:#ae81ff} \ No newline at end of file diff --git a/stylesheets/normalize.css b/stylesheets/normalize.css new file mode 100644 index 0000000..ad634fd --- /dev/null +++ b/stylesheets/normalize.css @@ -0,0 +1 @@ +/*! normalize.css v2.0.1 | MIT License | git.io/normalize */article,aside,details,figcaption,figure,footer,header,hgroup,nav,section,summary{display:block}audio,canvas,video{display:inline-block}audio:not([controls]){display:none;height:0}[hidden]{display:none}html{font-family:sans-serif;-webkit-text-size-adjust:100%;-ms-text-size-adjust:100%}body{margin:0}a:focus{outline:thin dotted}a:active,a:hover{outline:0}h1{font-size:2em}abbr[title]{border-bottom:1px dotted}b,strong{font-weight:bold}dfn{font-style:italic}mark{background:#ff0;color:#000}code,kbd,pre,samp{font-family:monospace, serif;font-size:1em}pre{white-space:pre;white-space:pre-wrap;word-wrap:break-word}q{quotes:"\201C" "\201D" "\2018" "\2019"}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:0}fieldset{border:1px solid #c0c0c0;margin:0 2px;padding:0.35em 0.625em 0.75em}legend{border:0;padding:0}button,input,select,textarea{font-family:inherit;font-size:100%;margin:0}button,input{line-height:normal}button,html input[type="button"],input[type="reset"],input[type="submit"]{-webkit-appearance:button;cursor:pointer}button[disabled],input[disabled]{cursor:default}input[type="checkbox"],input[type="radio"]{box-sizing:border-box;padding:0}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}button::-moz-focus-inner,input::-moz-focus-inner{border:0;padding:0}textarea{overflow:auto;vertical-align:top}table{border-collapse:collapse;border-spacing:0} \ No newline at end of file diff --git a/support.html b/support.html new file mode 100644 index 0000000..66af904 --- /dev/null +++ b/support.html @@ -0,0 +1,152 @@ + + + + + + + + Support | API Blueprint + + + + + + + + + +
+
+
+ + +
+ +
+ + + + +
+
+ +
+ + +

Getting Help

+ +

Stack Overflow

+ +

Stack Overflow is a great way to ask questions, you can use the +apiblueprint tag.

+ +

Reporting Bugs

+ +

If you've encountered a bug in our API Blueprint parser Drafter you can report +it in our GitHub issue tracker for Drafter.

+ +

Please search existing issues beforehand to see if the problem is already known.

+ +

When filing a new bug please include the following:

+ + + +

Contributing

+ +

We welcome any contributions to the language or parsers, please get in touch +with us on Slack if you're looking for any guidance.

+ +

API Blueprint Request for Comments

+ +

Many changes, including bug fixes and documentation improvements can be +implemented and reviewed via the normal GitHub pull request workflow directly +to the API Blueprint Language.

+ +

Some changes though are "substantial", and we ask that these be put through a +bit of a design process and produce a consensus among the API Blueprint team.

+ +

The "RFC" (request for comments) +process is intended to provide a consistent and controlled path for new +features to enter the language.

+ + +
+ + + +
+
+ + + + + + diff --git a/tools.html b/tools.html new file mode 100644 index 0000000..cb0131a --- /dev/null +++ b/tools.html @@ -0,0 +1,1056 @@ + + + + + + + + API Blueprint Tools | API Blueprint + + + + + + + + + +
+
+
+ + +
+ +
+ + + + +
+
+ +
+ + + +
+ +
+ +
+
+
+
+

Apiary

+ + editors +
+ +
+

Apiary supercharges your Blueprints with interactive documentation, API mock, test suites, validations, traffic inspector and collaboration.

+
+
+
+
+

Dredd

+ + testing +
+ +
+

Plug your API Blueprint into the CI and get no more outdated API documentation.

+
+
+
+
+

Drafter

+ + parsers +
+ +
+

Native C/C++ API Blueprint Parser

+
+
+
+
+

Protagonist

+ + parsers +
+ +
+

Node.js wrapper for the API Blueprint parser

+
+
+
+
+

Drakov

+ + mock servers +
+ +
+

Mock server that implements the API Blueprint specification, with a few extras rolled in. Usable as both a standalone server as well as a Node.js module.

+
+
+
+ + +
+

Record HTTP communication directly in the API Blueprint format.

+
+
+
+
+

RSpec API Blueprint

+ + testing +
+ +
+

Generate API Blueprint from request specs.

+
+
+
+
+

Snowboard

+ + parsers + renderers +
+ +
+

Render HTML documentation from API blueprint. Support custom templates.

+
+
+
+
+

Sublime Text plugin

+ + editors +
+ +
+

API Blueprint & MSON syntax highlighting, live validation and parsing in your favorite text editor.

+
+
+
+
+

Atom editor language

+ + editors +
+ +
+

API Blueprint & MSON syntax highlighting.

+
+
+
+
+

Atom editor preview

+ + editors +
+ +
+

Preview HTML Blueprint in the editor.

+
+
+
+
+

Vim editor plugin

+ + editors +
+ +
+

API Blueprint syntax highlighting and integration with Vim.

+
+
+
+
+

Aglio

+ + renderers +
+ +
+

Render HTML from API blueprint files, with support for custom themes. Executable and asynchronous Node.js library.

+
+
+
+
+

API-Mock

+ + mock servers +
+ +
+

Generate a simple, fast mock server from an API Blueprint.

+
+
+
+
+

API Blueprint Mock Server

+ + mock servers +
+ +
+

Run a simple, fast mock server in Java from an API Blueprint. Plans for Android support in the future.

+
+
+
+
+

Blueman

+ + converters +
+ +
+

Convert an API Blueprint into a Postman collection.

+
+
+
+
+

postman2apiary

+ + converters +
+ +
+

Tool for generating Blueprint API markup or the Apiary API from a Postman collection.

+
+
+
+
+

apiary2postman

+ + converters +
+ +
+

Convert an API Blueprint into a Postman collection, supports fetching from Apiary API and reading from files or stdin.

+
+
+
+
+

Blueprint docify

+ + renderers +
+ +
+

Add your API spec in the root of your repo and push! It will make great API docs for each branch, which are available at http://org.github.io/repo/branch

+
+
+
+
+

CCLRequestReplay

+ + testing +
+ +
+

Write your iOS and OS X tests directly to your API specification without writing any extra code.

+
+
+
+ + +
+

This plugin is available for SoapUI Pro versions 5.1 and above. The plugin allows you import API Blueprint files into SoapUI Pro for testing and mocking, as well as generate an API Blueprint file for any REST API defined in SoapUI Pro. You can get the plugin by downloading a version of SoapUI Pro.

+
+
+
+
+

vREST.io

+ + testing +
+ +
+

This tool allows you to record, specify, mock and test your web APIs. You can import existing API Blueprints into this tool.

+
+
+
+
+

Sandbox

+ + testing +
+ +
+

Simplify your testing. Quick and easy web API mocks, generated from API Blueprint, instant deploy, collaborative build, and debugging tools for API integration.

+
+
+
+
+

Vigia

+ + testing +
+ +
+

Flexible and scalable tool to provide RSpec integration tests using definition files such as API Blueprint

+
+
+
+
+

Paw

+ +
+ +
+

A fully-featured HTTP client for the Mac featuring API Blueprint integration via extensions.

+
+
+
+
+

APIMATIC

+ +
+ +
+

Generates SDKs in various programming languages using API descriptions, such as API Blueprint. Also offers a Code-generation-as-a-Service API for CI integration.

+
+
+
+
+

ASP.net Blueprint Mock Server

+ + mock servers +
+ +
+

Host your API Blueprints inside your ASP.net solution using this built-in mock server inside an encapsulated HTTP module.

+
+
+
+
+

grape-apiary

+ +
+ +
+

Generate API blueprints automatically from your already defined Grape api endpoints.

+
+
+
+ + +
+

Generate your full API blueprint APIB by concatenation from smaller sections.

+
+
+
+ + +
+

Yeoman generator to create a new apiblueprint project with a Grunfile allowing generation of HTML (via aglio), a connect HTTP server and live-reload.

+
+
+
+
+

Dredd::Rack

+ + testing +
+ +
+

A configurable Dredd runner and a clonable Rake task to automate the testing of your Rack (Rails, Sinatra, Grape...) applications API against their blueprints, with Dredd, in Ruby.

+
+
+
+
+

Hyperdrive

+ +
+ +
+

Hyperdrive allows you to build Swift applications that can evolve at run-time powered by API Blueprint.

+
+
+
+ + +
+

Check your implementation state, and generate entities and request based on API Blueprint.

+
+
+
+
+

Hercule

+ +
+ +
+

Ideal for working with multiple API blueprint files.

+
+
+
+
+

Apigility

+ +
+ +
+

Beautiful and powerful documentation for your API created with Apigility.

+
+
+
+ + +
+

Gulp tasks for writing large API Blueprints efficiently

+
+
+
+
+

Bluepaste

+ + renderers +
+ +
+

API Blueprint pastebin service.

+
+
+
+
+

swagger2blueprint

+ + converters +
+ +
+

Convert Swagger API descriptions into API Blueprint.

+
+
+
+
+

Gelato.io

+ +
+ +
+

Import your API Blueprint and get hosted documentation, with an API Explorer, Developer Registration, proper Search and more!

+
+
+
+
+

API Transformer

+ + converters +
+ +
+

Transforms API descriptions from/to various formats. You can covert all famous API description formats to API Blueprint with MSON. It also performs validation to detect several types of errors that may exist in our API descritpion. Minor errors are automatically fixed through a linting process.

+
+
+
+ + +
+

Ensure your Blueprint API files conform to a standard. This plugin validates the format, JSON bodies and Schema in your Blueprint spec files.

+
+
+
+
+

API Blueprint Linter

+ + editors +
+ +
+

Linter plugin providing API Blueprint validation and access to the parser output.

+
+
+
+
+

plueprint

+ + parsers +
+ +
+

API Blueprint Python parser

+
+
+
+
+

test2doc

+ +
+ +
+

Generate API documentation from your tests: a simple addition to Go's testing pkg

+
+
+
+
+

apish

+ + testing + mock servers +
+ +
+

Mock APIs and Services from API Blueprint in JS tests

+
+
+
+
+

apib-mode

+ + editors +
+ +
+

Emacs major mode for API Blueprint.

+
+
+
+
+

Bluth

+ +
+ +
+

Node.js library to validate payloads against a specified JSON Schema within your API Blueprint.

+
+
+
+ + +
+

A complete workflow for converting API Blueprint to hosted documentation on S3.

+
+
+
+
+

vscode-apielements

+ + editors +
+ +
+

Visual Studio Code extension for API Blueprint

+
+
+
+
+

doc-proxy

+ +
+ +
+

Node server to generate documentation.md file for all the endpoints supported by your server

+
+
+
+
+

PHPDraft

+ + renderers +
+ +
+

Generate static HTML documentation from API Blueprint.

+
+
+
+
+

MSONGenerator

+ + parsers + renderers +
+ +
+

Generate MSON from JSON. (Site may be first time long responds)

+
+
+
+
+

docprint

+ + renderers +
+ +
+

Generate Clean Static HTML documentation from API Blueprint file. Provides waypoints, attributes and multiple language code snippets.

+
+
+
+
+

SwiftAPI

+ + converters +
+ +
+

Convert an API Blueprint into executable Swift code.

+
+
+
+
+

pyabp

+ +
+ +
+

API Blueprint from python docstring.

+
+
+
+
+

apib2json

+ + converters +
+ +
+

A command-line utility to convert API Blueprint to JSON Schema.

+
+
+
+
+

Blueprint-agreement

+ + testing +
+ +
+

A ruby minitest API documentation matcher based on Api Blueprint schema.

+
+
+
+
+

test2doc.js

+ + testing +
+ +
+

test2doc.js helps you generate API documentation from your tests/specs.

+
+
+
+
+

pmtoapib

+ + converters +
+ +
+

A simple tool to convert Postman collection exports (v2) to Api Blueprint.

+
+
+
+
+

Draughtsman

+ + parsers +
+ +
+

API Blueprint Parser for Python 3

+
+
+
+
+

fitting

+ + testing +
+ +
+

Library add improve test log for RSpec and WebMock, validate its according to API Blueprint and Open API, show the documentation coverage with log.

+
+
+
+
+

mson-to-schemas

+ + parsers +
+ +
+

Generate JSON schema from your MSON data structures

+
+
+
+
+

pygments-apiblueprint

+ + lexers +
+ +
+

API Blueprint Lexer for Python (Pygments)

+
+
+
+
+

rouge

+ + lexers +
+ +
+

API Blueprint Lexer for Ruby

+
+
+
+
+

blueprint-sdk-maker

+ + converters +
+ +
+

Create SDK client in PHP from API Blueprint

+
+
+
+
+

BlueBird

+ + testing +
+ +
+

Generate API Blueprint from tests with Phoenix Framework.

+
+
+
+
+

Dox

+ + testing +
+ +
+

Generate API Blueprint from RSpec tests in a Rails application.

+
+
+
+
+

esplanade

+ +
+ +
+

Validate requests and responses against API Blueprint specifications for Ruby.

+
+
+
+
+

apiaryio

+ +
+ +
+

Node.JS CLI tool for publishing API Blueprint to apiary.

+
+
+
+
+

Laravel Blueprint Docs

+ + renderers +
+ +
+

API Blueprint Renderer for Laravel, themeable via Blade templates.

+
+
+
+
+

django-apiblueprint-view

+ + renderers +
+ +
+

Render API Blueprints on-the-fly using Django templates

+
+
+
+
+

Vanadia

+ + converters +
+ +
+

Convert API Blueprint file into a Postman latest collection format.

+
+
+
+
+

postman2apiary

+ + converters +
+ +
+

Parse Postman collection to blueprint documentation

+
+
+
+
+

BlueprintStack

+ + editors +
+ +
+

An awesome API blueprint playground for new people to experiment on.

+
+
+
+
+

APIDocumenter

+ + editors +
+ +
+

A simple and more manageable approach to create & share documents for your APIs using MSON (API Blueprint)

+
+
+
+ + +
+

It helps you to navigate in large API doc files easier using the VS Code Outline view. This extension adds the sections of the API doc to the Outline view in a hierarchical tree structure.

+
+
+
+
+

Crafter

+ + parsers +
+ +
+

API Blueprint parser written in pure JavaScript

+
+
+
+
+

Blueprinter

+ + renderers +
+ +
+

API Blueprint renderer to output documentation as an HTML page

+
+
+
+
+

vscode-apib-ls

+ + editors +
+ +
+

VSCode extension that brings Language Server support for API Blueprint

+
+
+
+
+

API Validator

+ + testing +
+ +
+

A frontend tool to validate server response against API Blueprint documentation

+
+
+ +
+ + +
+

Written your own API Blueprint tool? Add it to the list.

+
+
+
+
+ + + +
+ + + +
+
+ + + + + +