Showing preview only (9,231K chars total). Download the full file or copy to clipboard to get everything.
Repository: filearts/plunker
Branch: master
Commit: 84071165b63e
Files: 360
Total size: 8.7 MB
Directory structure:
gitextract_2z_jhlig/
├── .gitignore
├── .gitmodules
├── LICENSE
├── README.md
├── config.sample.json
├── package.json
├── server.js
└── servers/
├── api/
│ ├── .gitignore
│ ├── .npmignore
│ ├── errors.coffee
│ ├── index.coffee
│ ├── lib/
│ │ └── database.coffee
│ ├── middleware/
│ │ ├── cache.coffee
│ │ ├── cors.coffee
│ │ ├── json.coffee
│ │ ├── session.coffee
│ │ └── user.coffee
│ ├── package.json
│ ├── schema/
│ │ ├── packages/
│ │ │ ├── create.json
│ │ │ └── update.json
│ │ └── plunks/
│ │ ├── create.json
│ │ └── update.json
│ └── server.js
├── embed/
│ ├── .gitignore
│ ├── assets/
│ │ ├── bootstrap/
│ │ │ ├── js/
│ │ │ │ ├── bootstrap-affix.js
│ │ │ │ ├── bootstrap-alert.js
│ │ │ │ ├── bootstrap-all.js
│ │ │ │ ├── bootstrap-button.js
│ │ │ │ ├── bootstrap-carousel.js
│ │ │ │ ├── bootstrap-collapse.js
│ │ │ │ ├── bootstrap-dropdown.js
│ │ │ │ ├── bootstrap-modal.js
│ │ │ │ ├── bootstrap-popover.js
│ │ │ │ ├── bootstrap-scrollspy.js
│ │ │ │ ├── bootstrap-tab.js
│ │ │ │ ├── bootstrap-tooltip.js
│ │ │ │ ├── bootstrap-transition.js
│ │ │ │ └── bootstrap-typeahead.js
│ │ │ └── less/
│ │ │ ├── accordion.less
│ │ │ ├── alerts.less
│ │ │ ├── bootstrap.less
│ │ │ ├── breadcrumbs.less
│ │ │ ├── button-groups.less
│ │ │ ├── buttons.less
│ │ │ ├── carousel.less
│ │ │ ├── close.less
│ │ │ ├── code.less
│ │ │ ├── component-animations.less
│ │ │ ├── dropdowns.less
│ │ │ ├── font-awesome.less
│ │ │ ├── forms.less
│ │ │ ├── grid.less
│ │ │ ├── hero-unit.less
│ │ │ ├── labels-badges.less
│ │ │ ├── layouts.less
│ │ │ ├── mixins.less
│ │ │ ├── modals.less
│ │ │ ├── navbar.less
│ │ │ ├── navs.less
│ │ │ ├── pager.less
│ │ │ ├── pagination.less
│ │ │ ├── popovers.less
│ │ │ ├── progress-bars.less
│ │ │ ├── reset.less
│ │ │ ├── responsive-1200px-min.less
│ │ │ ├── responsive-767px-max.less
│ │ │ ├── responsive-768px-979px.less
│ │ │ ├── responsive-navbar.less
│ │ │ ├── responsive-utilities.less
│ │ │ ├── responsive.less
│ │ │ ├── scaffolding.less
│ │ │ ├── sprites.less
│ │ │ ├── tables.less
│ │ │ ├── thumbnails.less
│ │ │ ├── tooltip.less
│ │ │ ├── type.less
│ │ │ ├── utilities.less
│ │ │ ├── variables.less
│ │ │ └── wells.less
│ │ ├── css/
│ │ │ ├── components/
│ │ │ │ └── navbar.less
│ │ │ ├── pages/
│ │ │ │ └── embed.less
│ │ │ └── vendor/
│ │ │ └── prettify.less
│ │ └── js/
│ │ ├── pages/
│ │ │ └── embed.coffee
│ │ ├── services/
│ │ │ ├── importer.coffee
│ │ │ ├── plunks.coffee
│ │ │ └── url.coffee
│ │ └── vendor/
│ │ ├── angular-sanitize.js
│ │ ├── angular-ui.js
│ │ ├── angular.js
│ │ ├── jquery.cookie.js
│ │ ├── jquery.js
│ │ ├── overthrow.js
│ │ ├── prettify.js
│ │ └── showdown.js
│ ├── index.coffee
│ ├── middleware/
│ │ └── expose.coffee
│ ├── package.json
│ ├── server.js
│ └── views/
│ └── embed.jade
├── raw/
│ ├── .gitignore
│ ├── index.coffee
│ ├── package.json
│ ├── server.js
│ └── views/
│ └── directory.jade
├── run/
│ ├── .gitignore
│ ├── index.coffee
│ ├── middleware/
│ │ ├── cors.coffee
│ │ └── json.coffee
│ ├── package.json
│ ├── schema/
│ │ └── previews/
│ │ └── create.json
│ ├── server.js
│ └── views/
│ └── directory.jade
└── www/
├── .gitignore
├── assets/
│ ├── bootstrap/
│ │ ├── js/
│ │ │ ├── bootstrap-affix.js
│ │ │ ├── bootstrap-alert.js
│ │ │ ├── bootstrap-all.js
│ │ │ ├── bootstrap-button.js
│ │ │ ├── bootstrap-carousel.js
│ │ │ ├── bootstrap-collapse.js
│ │ │ ├── bootstrap-dropdown.js
│ │ │ ├── bootstrap-modal.js
│ │ │ ├── bootstrap-popover.js
│ │ │ ├── bootstrap-scrollspy.js
│ │ │ ├── bootstrap-tab.js
│ │ │ ├── bootstrap-tooltip.js
│ │ │ ├── bootstrap-transition.js
│ │ │ └── bootstrap-typeahead.js
│ │ └── less/
│ │ ├── accordion.less
│ │ ├── alerts.less
│ │ ├── bootstrap.less
│ │ ├── breadcrumbs.less
│ │ ├── button-groups.less
│ │ ├── buttons.less
│ │ ├── carousel.less
│ │ ├── close.less
│ │ ├── code.less
│ │ ├── component-animations.less
│ │ ├── dropdowns.less
│ │ ├── font-awesome.less
│ │ ├── forms.less
│ │ ├── grid.less
│ │ ├── hero-unit.less
│ │ ├── labels-badges.less
│ │ ├── layouts.less
│ │ ├── mixins.less
│ │ ├── modals.less
│ │ ├── navbar.less
│ │ ├── navs.less
│ │ ├── pager.less
│ │ ├── pagination.less
│ │ ├── popovers.less
│ │ ├── progress-bars.less
│ │ ├── reset.less
│ │ ├── responsive-1200px-min.less
│ │ ├── responsive-767px-max.less
│ │ ├── responsive-768px-979px.less
│ │ ├── responsive-navbar.less
│ │ ├── responsive-utilities.less
│ │ ├── responsive.less
│ │ ├── scaffolding.less
│ │ ├── sprites.less
│ │ ├── tables.less
│ │ ├── thumbnails.less
│ │ ├── tooltip.less
│ │ ├── type.less
│ │ ├── utilities.less
│ │ ├── variables.less
│ │ └── wells.less
│ ├── css/
│ │ ├── common/
│ │ │ └── style.less
│ │ ├── components/
│ │ │ ├── discussion.less
│ │ │ ├── gallery.less
│ │ │ ├── importer.less
│ │ │ ├── multipanel.less
│ │ │ ├── navbar.less
│ │ │ ├── previewer.less
│ │ │ ├── share.less
│ │ │ ├── sidebar.less
│ │ │ ├── statusbar.less
│ │ │ ├── streamer.less
│ │ │ ├── tags.less
│ │ │ ├── toolbar.less
│ │ │ └── userpanel.less
│ │ ├── pages/
│ │ │ ├── editor.less
│ │ │ ├── landing.less
│ │ │ └── preview.less
│ │ └── vendor/
│ │ ├── jquery-layout.less
│ │ └── prettify.less
│ └── js/
│ ├── directives/
│ │ ├── ace.coffee
│ │ ├── builder.coffee
│ │ ├── card.coffee
│ │ ├── chat.coffee
│ │ ├── discussion.coffee
│ │ ├── layout.coffee
│ │ ├── multipanel.coffee
│ │ ├── share.coffee
│ │ ├── statusbar.coffee
│ │ ├── toolbar.coffee
│ │ └── userpanel.coffee
│ ├── pages/
│ │ ├── editor.coffee
│ │ └── landing.coffee
│ ├── services/
│ │ ├── catalogue.coffee
│ │ ├── downloader.coffee
│ │ ├── importer.coffee
│ │ ├── modes.coffee
│ │ ├── notifier.coffee
│ │ ├── pages.coffee
│ │ ├── panels.coffee
│ │ ├── panes/
│ │ │ ├── builder.coffee
│ │ │ ├── explore.coffee
│ │ │ ├── lint.coffee
│ │ │ ├── previewer.coffee
│ │ │ ├── readme.coffee
│ │ │ └── streamer.coffee
│ │ ├── panes-dev/
│ │ │ ├── about.coffee
│ │ │ ├── compiler.coffee
│ │ │ ├── discussion.coffee
│ │ │ └── settings.coffee
│ │ ├── plunks.coffee
│ │ ├── scratch.coffee
│ │ ├── session.coffee
│ │ ├── url.coffee
│ │ └── whitelist.coffee
│ ├── socialbuttons.js
│ └── vendor/
│ ├── ace/
│ │ ├── ace.js
│ │ ├── keybinding-emacs.js
│ │ ├── keybinding-vim.js
│ │ ├── mode-c9search.js
│ │ ├── mode-c_cpp.js
│ │ ├── mode-clojure.js
│ │ ├── mode-coffee.js
│ │ ├── mode-coldfusion.js
│ │ ├── mode-csharp.js
│ │ ├── mode-css.js
│ │ ├── mode-diff.js
│ │ ├── mode-glsl.js
│ │ ├── mode-golang.js
│ │ ├── mode-groovy.js
│ │ ├── mode-haxe.js
│ │ ├── mode-html.js
│ │ ├── mode-jade.js
│ │ ├── mode-java.js
│ │ ├── mode-javascript.js
│ │ ├── mode-json.js
│ │ ├── mode-jsp.js
│ │ ├── mode-jsx.js
│ │ ├── mode-latex.js
│ │ ├── mode-less.js
│ │ ├── mode-liquid.js
│ │ ├── mode-lua.js
│ │ ├── mode-luapage.js
│ │ ├── mode-markdown.js
│ │ ├── mode-ocaml.js
│ │ ├── mode-perl.js
│ │ ├── mode-pgsql.js
│ │ ├── mode-php.js
│ │ ├── mode-powershell.js
│ │ ├── mode-python.js
│ │ ├── mode-ruby.js
│ │ ├── mode-scad.js
│ │ ├── mode-scala.js
│ │ ├── mode-scss.js
│ │ ├── mode-sh.js
│ │ ├── mode-sql.js
│ │ ├── mode-svg.js
│ │ ├── mode-tcl.js
│ │ ├── mode-text.js
│ │ ├── mode-textile.js
│ │ ├── mode-xml.js
│ │ ├── mode-xquery.js
│ │ ├── mode-yaml.js
│ │ ├── theme-ambiance.js
│ │ ├── theme-chrome.js
│ │ ├── theme-clouds.js
│ │ ├── theme-clouds_midnight.js
│ │ ├── theme-cobalt.js
│ │ ├── theme-crimson_editor.js
│ │ ├── theme-dawn.js
│ │ ├── theme-dreamweaver.js
│ │ ├── theme-eclipse.js
│ │ ├── theme-github.js
│ │ ├── theme-idle_fingers.js
│ │ ├── theme-kr_theme.js
│ │ ├── theme-merbivore.js
│ │ ├── theme-merbivore_soft.js
│ │ ├── theme-mono_industrial.js
│ │ ├── theme-monokai.js
│ │ ├── theme-pastel_on_dark.js
│ │ ├── theme-solarized_dark.js
│ │ ├── theme-solarized_light.js
│ │ ├── theme-textmate.js
│ │ ├── theme-tomorrow.js
│ │ ├── theme-tomorrow_night.js
│ │ ├── theme-tomorrow_night_blue.js
│ │ ├── theme-tomorrow_night_bright.js
│ │ ├── theme-tomorrow_night_eighties.js
│ │ ├── theme-twilight.js
│ │ ├── theme-vibrant_ink.js
│ │ ├── theme-xcode.js
│ │ ├── worker-coffee.js
│ │ ├── worker-css.js
│ │ ├── worker-javascript.js
│ │ ├── worker-json.js
│ │ └── worker-xquery.js
│ ├── angular-cookies.js
│ ├── angular-jq.js
│ ├── angular-resource.js
│ ├── angular-sanitize.js
│ ├── angular-ui.js
│ ├── angular.js
│ ├── backbone.js
│ ├── beautify.js
│ ├── handlebars.js
│ ├── jquery.cookie.js
│ ├── jquery.history.js
│ ├── jquery.js
│ ├── jquery.layout.js
│ ├── jquery.lazyload.js
│ ├── jquery.timeago.js
│ ├── jquery.ui.custom.js
│ ├── jszip.js
│ ├── noty/
│ │ ├── jquery.noty.js
│ │ ├── layouts/
│ │ │ ├── bottom.js
│ │ │ ├── bottomCenter.js
│ │ │ ├── bottomLeft.js
│ │ │ ├── bottomRight.js
│ │ │ ├── center.js
│ │ │ ├── centerLeft.js
│ │ │ ├── centerRight.js
│ │ │ ├── inline.js
│ │ │ ├── top.js
│ │ │ ├── topCenter.js
│ │ │ ├── topLeft.js
│ │ │ └── topRight.js
│ │ ├── promise.js
│ │ └── themes/
│ │ └── default.js
│ ├── overthrow.js
│ ├── page.js
│ ├── postmessage.js
│ ├── prettify.js
│ ├── semver.js
│ ├── showdown.js
│ └── underscore.js
├── index.coffee
├── middleware/
│ ├── error.coffee
│ ├── expose.coffee
│ └── session.coffee
├── models/
│ └── user.coffee
├── package.json
├── server.js
└── views/
├── auth/
│ ├── error.jade
│ └── success.jade
├── editor.jade
├── landing.jade
└── partials/
├── discuss.jade
├── home.jade
├── preview.jade
├── tag.jade
├── tags.jade
├── user.jade
└── users.jade
================================================
FILE CONTENTS
================================================
================================================
FILE: .gitignore
================================================
lib-cov
*.seed
*.log
*.csv
*.dat
*.out
*.pid
*.gz
pids
logs
results
tests
config.json
node_modules
npm-debug.log
.c9revisions
builtAssets
================================================
FILE: .gitmodules
================================================
[submodule "servers/www/assets/select2"]
path = servers/www/assets/select2
url = git://github.com/ivaynberg/select2.git
================================================
FILE: LICENSE
================================================
Copyright (C) 2015 Filearts
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.
================================================
FILE: README.md
================================================
# Plunker
[](https://gitter.im/filearts/plunker?utm_source=badge&utm_medium=badge&utm_campaign=pr-badge&utm_content=badge)
The next generation of lightweight collaborative online editing.
#### WARNING: This repository does not contain the code for what you see running on http://plnkr.co
> The current code for Plunker is in the repositories listed below
Originally, Plunker was coded in a single repository with different sub-servers existing in the `/servers`
path. The entire application was run on a single server.
However, with increasing popularity, reality decided to come hang out and make everyone's lives difficult.
The solution was simple; since the components of Plunker were designed as 'sub-servers', it should be easy
to split them out and run them separately. However, having different logical entities with different
functions in the same repository doesn't make sense.
I decided to create separate repositories for each of the Plunker servers that are currently deployed on
Nodejitsu. They are as follows:
#### Plunker component repositories
* [plunker_api](//github.com/filearts/plunker_api) The server that connects to a mongodb database and serves requests over a restful api.
* [plunker_www](//github.com/filearts/plunker_www) The server that is responsible for hosting and running the front-end that users see and touch everyday.
* [plunker-run-plugin](//github.com/ggoodman/plunker-run-plugin) The server that allows for previewing of plunks and temporary previews and also does the dynamic transpilation.
* [plunker_collab](//github.com/filearts/plunker_collab) The server that serves the code necessary for collaborative coding as well as doing the actual operational transformation over a browserchannel connection.
* [plunker_embed](//github.com/filearts/plunker_embed) The server that hosts the embedded views of plunks.
### Plunker config files
Each server, once cloned locally, requires one or two `config.json` files to run.
**Servers that use the environment-specific config files `config.development.json` and `config.production.json`:**
* plunker_api
* plunker_www
* plunker_run
* plunker_collab
Only `plunker_embed` uses a single `config.json` file.
**Sample configuration file:**
> Not all fields are required by each server, but if all are present no harm *should* come to any small animals.
```javascript
{
"host": "hostname.com",
"url": {
"www": "http://hostname.com",
"collab": "http://collab.hostname.com",
"api": "http://api.hostname.com",
"embed": "http://embed.hostname.com",
"run": "http://run.hostname.com",
"carbonadsH": "OOPS, this is pretty specific to my current deploy",
"carbonadsV": "OOPS, this is pretty specific to my current deploy"
},
"port": 8080,
"oauth": {
"github": {
"id": "series_of_random_chars",
"secret": "longer_series_of_random_chars"
}
}
}
```
# Everything below this point is out of date or incorrect!
> ...And there be dragons
# Usage
```
git clone git://github.com/filearts/plunker.git
git submodule update --init
npm install
node server.js
```
## Editor API
### `POST /edit/`
You can send a `POST` request to `/edit/` to bootstrap the editor with the basic structure of a plunk. The JSON format for this is described below.
```javascript
{
"description": "Description of Plunk",
"tags": ["array", "of", "tags"],
"files": [
{
"filename": "index.html",
"content": "<html><script src=\"script.js\"></script></html>"
},
{
"filename": "script.js",
"content": "alert('hello world');"
}
]
}
```
## License
Copyright [Filearts](https://github.com/filearts)
================================================
FILE: config.sample.json
================================================
{
"host": "localhost", // (Required) The hostname at which Plunk will be run
"nosubdomains": true, // Run Plunker off of a single domain (instead of {api,run,embed,raw}.host)
"oauth": {
"github": { // To enable logging in via github
"id": "111111111111111",
"secret": "11111111111111111111111111111111"
}
},
"mongodb": {
"hostname": "localhost",
"port": 27017,
"pathname": "plunker",
"auth": "plunker:plunker"
}
}
================================================
FILE: package.json
================================================
{
"name": "plunker",
"subdomain": "plunker",
"scripts": {
"start": "server.js"
},
"engines": {
"node": "0.6.x"
},
"version": "0.3.13-4",
"private": true,
"dependencies": {
"coffee-script": "1.3.x",
"express": "2.5.x",
"gzippo": "0.1.x",
"jade": "0.25.x",
"less": "1.3.x",
"mime": "1.2.x",
"underscore": "1.3.x",
"backbone": "0.9.x",
"connect-assets": "2.2.x",
"share": "0.5.x",
"express-subdomains": "0.0.x",
"authom": "0.4.x",
"nconf": "0.5.x",
"json-schema": "https://github.com/kriszyp/json-schema/tarball/master",
"request": "2.9.x",
"connect": "1.x",
"async": "0.1.x",
"mongoose": "3.x",
"lru-cache": "1.1.x"
},
"bundledDependencies": [
"json-schema"
]
}
================================================
FILE: server.js
================================================
// Everything starts better with coffee
var coffee = require("coffee-script");
var express = require("express");
var nconf = require("nconf").use("memory")
.argv()
.env()
.file({file: "config.json"})
.defaults({
"PORT": 8080
});
if (!nconf.get("host")) {
console.error("The host option is required for Plunker to start");
} else {
var host = nconf.get("host");
// Configure global paths
if (nconf.get("nosubdomains")) {
nconf.set("url:www", "http://" + host);
nconf.set("url:raw", "http://" + host + "/raw");
nconf.set("url:run", "http://" + host + "/run");
nconf.set("url:api", "http://" + host + "/api");
} else {
nconf.set("url:www", "http://" + host);
nconf.set("url:raw", "http://raw." + host);
nconf.set("url:run", "http://run." + host);
nconf.set("url:api", "http://api." + host);
}
// Create and start the parent server
express.createServer()
//.use(express.logger())
.use(require("express-subdomains").use("raw").use("api").use("run").use("embed").middleware)
.use("/api", require("./servers/api"))
.use("/raw", require("./servers/raw"))
.use("/run", require("./servers/run"))
.use("/embed", require("./servers/embed"))
.use(require("./servers/www"))
.listen(nconf.get("PORT"));
console.log("Started plunker in", nconf.get("NODE_ENV") || "development", "at", nconf.get("host"), "on port", nconf.get("PORT"), "using subdomains:", !nconf.get("nosubdomains"));
}
================================================
FILE: servers/api/.gitignore
================================================
lib-cov
*.seed
*.log
*.csv
*.dat
*.out
*.pid
*.gz
pids
logs
results
tests
node_modules
npm-debug.log
.c9revisions
builtAssets
================================================
FILE: servers/api/.npmignore
================================================
lib-cov
*.seed
*.log
*.csv
*.dat
*.out
*.pid
*.gz
pids
logs
results
tests
node_modules
npm-debug.log
.c9revisions
builtAssets
================================================
FILE: servers/api/errors.coffee
================================================
class APIError extends Error
toJSON: -> {@code, @message}
module.exports =
ParseError: class extends APIError
constructor: ->
@code = 400
@message = "Problems parsing JSON"
ValidationError: class extends APIError
constructor: (@errors) ->
@code = 422
@message = "Validation failed"
toJSON: -> {@errors, @code, @message}
NotFound: class extends APIError
constructor: ->
@code = 404
@message = "Not found"
PermissionDenied: class extends APIError
constructor: ->
@code = 404
@message = "Permission denied"
InternalServerError: class extends APIError
constructor: ->
@code = 500
@message = "Internal server error"
================================================
FILE: servers/api/index.coffee
================================================
nconf = require("nconf")
request = require("request")
mime = require("mime")
express = require("express")
url = require("url")
querystring = require("querystring")
_ = require("underscore")._
validator = require("json-schema")
mime = require("mime")
gate = require("json-gate")
semver = require("semver")
apiErrors = require("./errors")
apiUrl = nconf.get('url:api')
module.exports = app = express.createServer()
genid = (len = 16, prefix = "", keyspace = "ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz0123456789") ->
prefix += keyspace.charAt(Math.floor(Math.random() * keyspace.length)) while len-- > 0
prefix
database = require("./lib/database")
Session = database.model("Session")
User = database.model("User")
Plunk = database.model("Plunk")
Package = database.model("Package")
PRUNE_FREQUENCY = 1000 * 60 * 60 * 6 # Prune the sessions every 6 hours
SCORE_INCREMENT = 1000 * 60 * 60 * 6 # Each vote bumps the plunk forward 6 hours
pruneSessions = ->
console.log "Pruning sessions"
Session.prune()
setInterval pruneSessions, PRUNE_FREQUENCY
pruneSessions()
app.configure ->
app.use require("./middleware/cors").middleware()
app.use require("./middleware/cache").middleware()
app.use require("./middleware/json").middleware()
app.use require("./middleware/session").middleware(sessions: database.model("Session"))
app.use app.router
app.use (err, req, res, next) ->
json = if err.toJSON? then err.toJSON() else
message: err.message or "Unknown error"
code: err.code or 500
res.json(json, json.code)
throw err
app.set "jsonp callback", true
###
# RESTful sessions
###
createSession = (token, user, cb) ->
session = new Session
last_access: new Date
keychain: {}
session.user = user if user
session.save (err) -> cb(err, session)
# Convenience endpoint to get the current session or create a new one
app.get "/session", (req, res, next) ->
res.header "Cache-Control", "no-cache"
if req.session then res.json(req.session)
else createSession null, null, (err, session) ->
if err then next(err)
else res.json(session, 201)
app.post "/sessions", (req, res, next) ->
createSession null, null, (err, session) ->
if err then next(err)
else res.json(session, 201)
app.get "/sessions/:id", (req, res, next) ->
Session.findById(req.params.id).populate("user").exec (err, session) ->
if err then next(err)
else unless session then next(new apiErrors.NotFound)
else if Date.now() - session.last_access.valueOf() > nconf.get("session:max_age") then next(new apiErrors.NotFound)
else
unless session.user then res.json(session.toJSON())
else User.findById session.user, (err, user) ->
if err then next(err)
else res.json(_.extend(session, user: user.toJSON()))
app.del "/sessions/:id/user", (req, res, next) ->
Session.findById req.params.id, (err, session) ->
if err then next(err)
else unless session then next(new apiErrors.NotFound)
else
session.user = null
session.save (err) ->
if err then next(err)
else res.json(session)
app.post "/sessions/:id/user", (req, res, next) ->
Session.findById req.params.id, (err, session) ->
if err then next(new apiErrors.NotFound)
else
unless token = req.param("token") then next(new apiErrors.MissingArgument("token"))
else
sessid = req.param("id")
request.get "https://api.github.com/user?access_token=#{token}", (err, response, body) ->
return next(new apiErrors.Error(err)) if err
return next(new apiErrors.PermissionDenied) if response.status >= 400
try
body = JSON.parse(body)
catch e
return next(new apiErrors.ParseError)
service_id = "github:#{body.id}"
createUser = (cb) ->
user_json =
login: body.login
gravatar_id: body.gravatar_id
service_id: service_id
User.create(user_json, cb)
withUser = (err, user) ->
if err then next(err)
else
session.user = user
session.auth =
service_name: "github"
service_token: token
session.save (err) ->
if err then next(err)
else res.json(_.extend(session.toJSON(), user: user.toJSON()), 201)
User.findOne { service_id: service_id }, (err, user) ->
unless err or not user then withUser(null, user)
else createUser(withUser)
###
# Plunks
###
ownsPlunk = (session, json) ->
owner = false
if session
owner ||= !!(json.user and session.user and json.user.login is session.user.login)
owner ||= !!(session.keychain and session.keychain.id(json.id)?.token is json.token)
owner
preparePlunk = (session, plunk, populate = {}) ->
json = _.extend plunk.toJSON(), populate
delete json.token unless ownsPlunk(session, json)
delete json.voters
if json.files then json.files = do ->
files = {}
for file in json.files
file.raw_url = "#{json.raw_url}#{file.filename}"
files[file.filename] = file
files
json.thumbed = session?.user? and plunk.voters.indexOf(""+session.user._id) >= 0
json
preparePlunks = (session, plunks) -> _.map plunks, (plunk) -> preparePlunk(session, plunk)
fetchPlunks = (options, req, res, next) ->
page = parseInt(req.param("p", "1"), 10)
limit = parseInt(req.param("pp", "8"))
options.baseUrl ||= "#{apiUrl}/plunks"
search = options.query or {}
if req.user
search.$or = [
'private': $ne: true
,
user: req.user._id
]
else
search.private = $ne: true
query = Plunk.find(search)
query.sort(options.sort or {updated_at: -1})
query.select("-files")
query.populate("user").paginate page, limit, (err, plunks, count, pages, current) ->
if err then next(err)
else
link = []
if current < pages
link.push "<#{options.baseUrl}?p=#{page+1}&pp=#{limit}>; rel=\"next\""
link.push "<#{options.baseUrl}?p=#{pages}&pp=#{limit}>; rel=\"last\""
if current > 1
link.push "<#{options.baseUrl}?p=#{page-1}&pp=#{limit}>; rel=\"prev\""
link.push "<#{options.baseUrl}?p=1&pp=#{limit}>; rel=\"first\""
res.header("Link", link.join(", ")) if link.length
res.json(preparePlunks(req.session, plunks))
# List plunks
app.get "/plunks", (req, res, next) ->
fetchPlunks({}, req, res, next)
# List plunks
app.get "/plunks/trending", (req, res, next) ->
options =
baseUrl: "#{apiUrl}/plunks/trending"
sort: "-score -updated_at"
fetchPlunks(options, req, res, next)
# List plunks
app.get "/plunks/popular", (req, res, next) ->
options =
baseUrl: "#{apiUrl}/plunks/popular"
sort: "-thumbs -updated_at"
fetchPlunks(options, req, res, next)
# Create plunk
app.post "/plunks", (req, res, next) ->
json = req.body
schema = require("./schema/plunks/create")
{valid, errors} = validator.validate(json, schema)
# Despite its awesomeness, revalidator does not support disallow or additionalProperties; we need to check plunk.files size
if json.files and _.isEmpty(json.files)
valid = false
errors.push
attribute: "minProperties"
property: "files"
message: "A minimum of one file is required"
unless valid then next(new apiErrors.ValidationError(errors))
else
json.files = _.map json.files, (file, filename) ->
filename: filename
content: file.content
mime: mime.lookup(filename, "text/plain")
json.tags = _.uniq(json.tags) if json.tags
plunk = new Plunk(json)
plunk.user = req.user._id if req.user
# TODO: This is inefficient as the number space fills up; consider: http://www.faqs.org/patents/app/20090063601
# Keep generating new ids until not taken
savePlunk = ->
plunk._id = if json.private then genid(20) else genid(6)
plunk.save (err) ->
if err
if err.code is 11000 then savePlunk()
else next(err)
else
unless req.user and req.session and req.session.keychain
req.session.keychain.push _id: plunk._id, token: plunk.token
req.session.save()
populate = {}
populate.user = req.user.toJSON() if req.user
# User is not populated so we shove it in **UGLY**
res.json(preparePlunk(req.session, plunk, populate), 201)
savePlunk()
# Read plunk
app.get "/plunks/:id", (req, res, next) ->
Plunk.findById(req.params.id).populate("user").exec (err, plunk) ->
if err or not plunk then next(new apiErrors.NotFound)
else res.json(preparePlunk(req.session, plunk))
# Update plunk
app.post "/plunks/:id", (req, res, next) ->
Plunk.findById(req.params.id).populate("user").exec (err, plunk) ->
if err or not plunk or not ownsPlunk(req.session, plunk) then next(new apiErrors.NotFound)
else
json = req.body
schema = require("./schema/plunks/update")
{valid, errors} = validator.validate(json, schema)
# Despite its awesomeness, validator does not support disallow or additionalProperties; we need to check plunk.files size
if json.files and _.isEmpty(json.files)
valid = false
errors.push
attribute: "minProperties"
property: "files"
message: "A minimum of one file is required"
unless valid then next(new apiErrors.ValidationError(errors))
else
oldFiles = {}
for file, index in plunk.files
oldFiles[file.filename] = file
for filename, file of json.files
# Attempt to delete
if file is null
oldFiles[filename].remove() if oldFiles[filename]
# Modification to an existing file
else if old = oldFiles[filename]
if file.filename
old.filename = file.filename
old.mime = mime.lookup(file.filename, "text/plain")
if file.content?
old.content = file.content
if file.filename or file.content then old.save()
# New file; handle only if content provided
else if file.content
plunk.files.push
filename: filename
content: file.content
if json.tags
plunk.tags ||= []
for tagname, add of json.tags
if add
plunk.tags.push(tagname)
else
plunk.tags.splice(idx, 1) if (idx = plunk.tags.indexOf(tagname)) >= 0
plunk.tags = _.uniq(plunk.tags)
plunk.updated_at = new Date
plunk.description = json.description if json.description
plunk.user = req.user._id if req.user
plunk.save (err) ->
if err then next(new apiErrors.InternalServerError(err))
else
populate = {}
populate.user = req.user.toJSON() if req.user
res.json(preparePlunk(req.session, plunk, populate))
# Obtain a list of a plunk's forks
app.get "/plunks/:id/forks", (req, res, next) ->
Plunk.findOne({_id: req.params.id}).exec (err, plunk) ->
if err or not plunk then next(new apiErrors.NotFound)
else
options =
query: {fork_of: req.params.id}
baseUrl: "#{apiUrl}/plunk/#{req.params.id}/forks"
sort: "-updated_at"
fetchPlunks(options, req, res, next)
# Give a thumbs-up to a plunk
app.post "/plunks/:id/thumb", (req, res, next) ->
unless req.user then return next(new apiErrors.NotFound)
Plunk.findOne(_id: req.params.id).where("voters").ne(req.user).exec (err, plunk) ->
if err or not plunk then next(new apiErrors.NotFound)
else
plunk.score ||= plunk.created_at.valueOf()
plunk.thumbs ||= 0
plunk.voters.addToSet(req.user._id)
plunk.score += SCORE_INCREMENT
plunk.thumbs++
plunk.save (err) ->
if err then next(new apiErrors.InternalServerError(err))
else res.json({ thumbs: plunk.get("thumbs"), score: plunk.score}, 201)
# Remove a thumbs-up to a plunk
app.del "/plunks/:id/thumb", (req, res, next) ->
unless req.user then return next(new apiErrors.NotFound)
Plunk.findOne(_id: req.params.id).where("voters").equals(req.user).exec (err, plunk) ->
if err or not plunk then next(new apiErrors.NotFound)
else
plunk.voters.remove(req.user)
plunk.score -= SCORE_INCREMENT
plunk.thumbs--
plunk.save (err) ->
if err then next(new apiErrors.InternalServerError(err))
else res.json({ thumbs: plunk.get("thumbs"), score: plunk.score}, 200)
# Fork an existing plunk
app.post "/plunks/:id/forks", (req, res, next) ->
Plunk.findById(req.params.id).populate("user").exec (err, parent) ->
if err or not parent then next(new apiErrors.NotFound)
else
json = req.body
schema = require("./schema/plunks/create")
{valid, errors} = validator.validate(json, schema)
# Despite its awesomeness, revalidator does not support disallow or additionalProperties; we need to check plunk.files size
if json.files and _.isEmpty(json.files)
valid = false
errors.push
attribute: "minProperties"
property: "files"
message: "A minimum of one file is required"
unless valid then next(new apiErrors.ValidationError(errors))
else
json.files = _.map json.files, (file, filename) ->
filename: filename
content: file.content
mime: mime.lookup(filename, "text/plain")
json.tags = _.uniq(json.tags) if json.tags
plunk = new Plunk(json)
plunk.user = req.user._id if req.user
plunk.fork_of = parent._id
# TODO: This is inefficient as the number space fills up; consider: http://www.faqs.org/patents/app/20090063601
# Keep generating new ids until not taken
savePlunk = ->
plunk._id = if json.private then genid(20) else genid(6)
plunk.save (err) ->
if err
if err.code is 11000 then savePlunk()
else next(err)
else
# Update syntax to avoid triggering auto-update of updated_at on parent
parent.forks.push(plunk._id)
parent.save()
if not req.user and req.session and req.session.keychain
req.session.keychain.push _id: plunk._id, token: plunk.token
req.session.save()
populate = {}
populate.user = req.user.toJSON() if req.user
res.json(preparePlunk(req.session, plunk, populate), 201)
savePlunk()
# Delete plunk
app.del "/plunks/:id", (req, res, next) ->
Plunk.findById(req.params.id).populate("user").exec (err, plunk) ->
if err or not plunk or not ownsPlunk(req.session, plunk) then next(new apiErrors.NotFound)
else plunk.remove ->
res.send(204)
fetchUser = (req, res, next) ->
User.findOne({login: req.params.username}).exec (err, user) ->
if err or not user then next(new apiErrors.NotFound)
else
req.found_user = user
next()
# Fetch a user
app.get "/users/:username", fetchUser, (req, res, next) ->
res.json(req.found_user)
# List a user's plunks
app.get "/users/:username/plunks", fetchUser, (req, res, next) ->
options =
query: {user: req.found_user._id}
baseUrl: "#{apiUrl}/users/#{req.params.username}/plunks"
fetchPlunks(options, req, res, next)
# List plunks a user gave a thumbs-up
app.get "/users/:username/thumbed", fetchUser, (req, res, next) ->
options =
query: {voters: req.found_user._id}
baseUrl: "#{apiUrl}/users/#{req.params.username}/thumbed"
fetchPlunks(options, req, res, next)
app.get "/tags", (req, res, next) ->
Plunk.aggregate [
$unwind: "$tags"
,
$group: _id: "$tags", count: { $sum: 1 }
], (err, json) ->
if err then res.send(404, err)
else res.json(json)
# List plunks having a specific tag
app.get "/tags/:tagname/plunks", (req, res, next) ->
options =
query: {tags: req.params.tagname}
baseUrl: "#{apiUrl}/tags/#{req.params.tagname}/plunks"
fetchPlunks(options, req, res, next)
createSchema = gate.createSchema(require("./schema/packages/create.json"))
updateSchema = gate.createSchema(require("./schema/packages/update.json"))
withUser = (req, res, next) ->
unless req.user then res.send(400)
else next()
withPackage = (req, res, next) ->
Package.findOne({name: req.params.name}).select("-_id -versions._id").exec (err, pkg) ->
if err then res.send(404)
else
req.package = pkg
next()
preparePackage = (session, pkg, populate = {}) ->
json = _.extend pkg.toJSON(), populate
delete json.id
json.editable = true if session?.user and 0 <= json.maintainers.indexOf(session.user.login)
json.versions.sort (v1, v2) -> semver.rcompare(v1.semver, v2.semver)
json
preparePackages = (session, pkgs) -> _.map pkgs, (pkg) -> preparePackage(session, pkg)
app.get "/packages", (req, res, next) ->
Package.find({}).select("-_id -versions._id").exec (err, docs) ->
if err then res.send(err, 404)
else res.json(preparePackages(req.session, docs))
app.post "/packages", withUser, (req, res, next) ->
createSchema.validate req.body, (err, json) ->
if err then res.json err, 400
else
json.maintainers = [req.user.login]
versions = []
versions.push versionDef for version, versionDef of req.body.versions
json.versions = versions
Package.create json, (err, pkg) ->
if err
if err.code is 11000 then res.json "A package with that name already exists", 409
else res.json err.message, 500
else res.json preparePackage(req.session, pkg), 201
app.get "/packages/:name", withPackage, (req, res, next) ->
res.json(preparePackage(req.session, req.package))
app.post "/packages/:name", withUser, (req, res, next) ->
updateSchema.validate req.body, (err, json) ->
if err
console.log "Invalid request", arguments...
res.json err, 400
else
for keyword, val of json.keywords
if val is null then (json.$pullAll ||= keywords: []).keywords.push keyword
else (json.$pushAll ||= keywords: []).keywords.push keyword
delete json.keywords
Package.findOneAndUpdate
name: req.params.name
maintainers: req.user.login
, json, (err, pkg) ->
if err then res.json(err, 404)
else res.json(preparePackage(req.session, pkg), 200)
app.del "/packages/:name", withUser, (req, res, next) ->
Package.findOneAndRemove
name: req.params.name
maintainers: req.user.login
, (err, pkg) ->
if err then res.json(err, 404)
else if pkg then res.send(204)
else res.send(404)
app.all "*", (req, res, next) ->
next new apiErrors.NotFound
================================================
FILE: servers/api/lib/database.coffee
================================================
mongoose = require("mongoose")
nconf = require("nconf")
mime = require("mime")
url = require("url")
mime = require("mime")
mongoose.connect "mongodb:" + url.format(nconf.get("mongodb"))
connectTimeout = setTimeout(errorConnecting, 1000 * 30)
apiUrl = nconf.get('url:api')
wwwUrl = nconf.get('url:www')
runUrl = nconf.get('url:run')
errorConnecting = ->
console.error "Error connecting to mongodb"
process.exit(1)
mongoose.connection.on "open", -> clearTimeout(connectTimeout)
{Schema, Document, Query} = mongoose
{ObjectId} = Schema
genid = (len = 16, prefix = "", keyspace = "ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz0123456789") ->
prefix += keyspace.charAt(Math.floor(Math.random() * keyspace.length)) while len-- > 0
prefix
# Change object _id to normal id
Document::toJSON = ->
json = @toObject(json: true, virtuals: true)
json.id = json._id if json._id
delete json._id
delete json.__v
json
Query::paginate = (page, limit, cb) ->
page = Math.max(1, parseInt(page, 10))
limit = Math.max(4, Math.min(12, parseInt(limit, 10))) # [4, 10]
query = @
model = @model
query.skip(page * limit - limit).limit(limit).exec (err, docs) ->
if err then return cb(err, null, null)
model.count query._conditions, (err, count) ->
if err then return cb(err, null, null)
cb(null, docs, count, Math.ceil(count / limit), page)
lastModified = (schema, options = {}) ->
schema.add updated_at: Date
schema.pre "save", (next) ->
@updated_at = new Date
next()
if options.index then schema.path("updated_at").index(options.index)
TokenSchema = new Schema
_id: String
token: String
SessionSchema = new Schema
user:
type: Schema.ObjectId
ref: "User"
last_access: { type: Date, index: true, 'default': Date.now }
public_id: { type: String, 'default': genid }
auth: {}
keychain: [TokenSchema]
SessionSchema.virtual("url").get -> apiUrl + "/sessions/#{@_id}"
SessionSchema.virtual("user_url").get -> apiUrl + "/sessions/#{@_id}/user"
SessionSchema.virtual("age").get -> Date.now() - @last_access
SessionSchema.plugin(lastModified)
SessionSchema.statics.prune = (max_age = 1000 * 60 * 60 * 24 * 7 * 2, cb = ->) ->
@find({}).where("last_access").lt(new Date(Date.now() - max_age)).remove()
mongoose.model "Session", SessionSchema
mongoose.model "User", UserSchema = new Schema
login: { type: String, index: true }
gravatar_id: String
service_id: { type: String, index: { unique: true } }
profile: {}
PlunkFileSchema = new Schema
filename: String
content: String
PlunkFileSchema.virtual("mime").get -> mime.lookup(@filename, "text/plain")
PlunkVoteSchema = new Schema
user: { type: Schema.ObjectId, ref: "User" }
created_at: { type: Date, 'default': Date.now }
PlunkSchema = new Schema
_id: { type: String, index: true }
description: String
score: { type: Number, 'default': Date.now }
thumbs: { type: Number, 'default': 0 }
created_at: { type: Date, 'default': Date.now }
updated_at: { type: Date, 'default': Date.now }
token: { type: String, 'default': genid.bind(null, 16) }
'private': { type: Boolean, 'default': false }
source: {}
files: [PlunkFileSchema]
user: { type: Schema.ObjectId, ref: "User", index: true }
comments: { type: Number, 'default': 0 }
fork_of: { type: String, ref: "Plunk", index: true }
forks: [{ type: String, ref: "Plunk", index: true }]
tags: [{ type: String, index: true}]
voters: [{ type: Schema.ObjectId, ref: "Users", index: true }]
PlunkSchema.index(score: -1, updated_at: -1)
PlunkSchema.index(thumbs: -1, updated_at: -1)
PlunkSchema.virtual("url").get -> apiUrl + "/plunks/#{@_id}"
PlunkSchema.virtual("raw_url").get -> runUrl + "/plunks/#{@_id}/"
PlunkSchema.virtual("comments_url").get -> wwwUrl + "/#{@_id}/comments"
mongoose.model "Plunk", PlunkSchema
PackageVersionSchema = new Schema
semver: String
scripts: [String]
styles: [String]
PackageSchema = new Schema
name: { type: String, match: /^[-_.a-z0-9]+$/i, index: true, unique: true }
description: { type: String }
homepage: String
keywords: [{type: String, index: true}]
versions: [PackageVersionSchema]
maintainers: [{ type: String, index: true }]
mongoose.model "Package", PackageSchema
module.exports = mongoose
================================================
FILE: servers/api/middleware/cache.coffee
================================================
module.exports.middleware = (config = {}) ->
(req, res, next) ->
res.header("Cache-Control", "no-cache")
res.header("Expires", "0")
next()
================================================
FILE: servers/api/middleware/cors.coffee
================================================
nconf = require("nconf")
module.exports.middleware = (config = {}) ->
valid = [nconf.get('url:www'), nconf.get('url:embed'), "http://plnkr.co"]
(req, res, next) ->
# Just send the headers all the time. That way we won't miss the right request ;-)
# Other CORS middleware just wouldn't work for me
# TODO: Minimize these headers to only those needed at the right time
res.header("Access-Control-Allow-Origin", if req.headers.origin in valid then req.headers.origin else "*")
res.header("Access-Control-Allow-Methods", "OPTIONS,GET,PUT,POST,DELETE")
res.header("Access-Control-Allow-Headers", "Authorization, User-Agent, Referer, X-Requested-With, Proxy-Authorization, Proxy-Connection, Accept-Language, Accept-Encoding, Accept-Charset, Connection, Content-Length, Host, Origin, Pragma, Accept-Charset, Cache-Control, Accept, Content-Type")
res.header("Access-Control-Expose-Headers", "Link")
res.header("Access-Control-Max-Age", "60")
if "OPTIONS" == req.method then res.send(200)
else next()
================================================
FILE: servers/api/middleware/json.coffee
================================================
apiErrors = require("../errors")
module.exports.middleware = (config = {}) ->
(req, res, next) ->
if "GET" == req.method or "HEAD" == req.method then return next()
req.body ||= {}
buf = '';
req.setEncoding('utf8');
req.on "data", (chunk) -> buf += chunk
req.on "end", ->
return next() unless buf
try
req.body = JSON.parse(buf)
next()
catch err
next(new apiErrors.ParseError())
================================================
FILE: servers/api/middleware/session.coffee
================================================
nconf = require("nconf")
module.exports.middleware = (config = {}) ->
(req, res, next) ->
if req.query.sessid then sessid = req.query.sessid
else if auth = req.header("Authorization") then [header, sessid] = auth.match(/^token (\S+)$/i)
if sessid and sessid.length then config.sessions.findById(sessid).populate("user").exec (err, session) ->
return next(err) if err
return next() unless session
return next() if Date.now() - session.last_access.valueOf() > nconf.get("session:max_age")
session.last_access = new Date
session.save -> # Don't wait for the response
req.session = session
req.user = session.user if session.user
next()
else next()
================================================
FILE: servers/api/middleware/user.coffee
================================================
module.exports.middleware = (config = {}) ->
(req, res, next) ->
unless req.session and req.session.user then next()
else config.users.findById req.session.user, (err, user) ->
return next(err) if err
unless user
delete req.user
delete req.session.user
else req.user = user
next()
================================================
FILE: servers/api/package.json
================================================
{
"name": "plunker-api",
"subdomain": "plunker-api",
"domains": [
"api.plnkr.co"
],
"scripts": {
"start": "server.js"
},
"engines": {
"node": "0.8.x"
},
"version": "0.3.14-27",
"private": true,
"dependencies": {
"coffee-script": "1.3.x",
"express": "2.5.11",
"mime": "1.2.x",
"underscore": "1.3.x",
"backbone": "0.9.x",
"nconf": "0.5.x",
"json-schema": "https://github.com/kriszyp/json-schema/tarball/master",
"request": "2.9.x",
"connect": "1.x",
"async": "0.1.x",
"mongoose": "3.4.x",
"lru-cache": "1.1.x",
"json-gate": "0.8.x",
"semver": "1.1.x"
}
}
================================================
FILE: servers/api/schema/packages/create.json
================================================
{
"type": "object",
"additionalProperties": false,
"properties": {
"name": {
"type": "string",
"required": true
},
"description": {
"type": "string",
"default": ""
},
"homepage": {
"type": "string",
"default": ""
},
"keywords": {
"type": "array",
"additionalItems": false,
"uniqueItems": true,
"items": {
"type": "string"
}
},
"versions": {
"required": true,
"type": "object",
"additionalProperties": false,
"patternProperties": {
"^(\\d+\\.\\d+\\.\\d+)(?:-([0-9A-Za-z-]+(?:\\.[0-9A-Za-z-]+)*))?(?:\\+([0-9A-Za-z-]+(?:\\.[0-9A-Za-z-]+)*))?$": {
"type": "object",
"required": true,
"additionalProperties": false,
"properties": {
"semver": {
"type": "string",
"required": true,
"pattern": "^(\\d+\\.\\d+\\.\\d+)(?:-([0-9A-Za-z-]+(?:\\.[0-9A-Za-z-]+)*))?(?:\\+([0-9A-Za-z-]+(?:\\.[0-9A-Za-z-]+)*))?$"
},
"scripts": {
"type": "array",
"items": {
"type": "string"
}
},
"styles": {
"type": "array",
"items": {
"type": "string"
}
}
}
}
}
}
}
}
================================================
FILE: servers/api/schema/packages/update.json
================================================
{
"type": "object",
"additionalProperties": false,
"properties": {
"name": {
"type": "string"
},
"description": {
"type": "string",
"default": ""
},
"homepage": {
"type": "string",
"default": ""
},
"keywords": {
"type": "object",
"additionalProperties": false,
"patternProperties": {
"^(.+)?$": {
"type": "boolean",
"required": true
}
}
}
}
}
================================================
FILE: servers/api/schema/plunks/create.json
================================================
{
"type": "object",
"additionalProperties": false,
"properties": {
"description": {
"type": "string",
"default": ""
},
"tags": {
"type": "array",
"additionalItems": false,
"uniqueItems": true,
"items": {
"type": "string"
}
},
"private": {
"type": "boolean",
"default": false
},
"source": {
"type": [
{
"type": "null"
}, {
"type": "object",
"properties": {
"type": {
"type": "string",
"required": true,
"enum": [ "plunker_no_de", "gist" ]
},
"url": {
"type": "string",
"required": true
},
"title": {
"type": "string",
"required": true
},
"description": {
"type": "string"
}
}
}
]
},
"files": {
"required": true,
"type": "object",
"additionalProperties": false,
"patternProperties": {
"^[a-zA-z0-9_-]+(\\.[a-zA-Z0-9]+)?$": {
"type": "object",
"properties": {
"content": {
"type": "string",
"required": true
}
}
}
}
}
}
}
================================================
FILE: servers/api/schema/plunks/update.json
================================================
{
"type": "object",
"additionalProperties": false,
"minProperties": 1,
"properties": {
"description": {
"type": "string",
"default": ""
},
"tags": {
"type": "object",
"additionalProperties": false,
"patternProperties": {
"^[a-zA-Z0-9_][-a-zA-Z0-9_ :]*$": {
"type": "boolean"
}
}
},
"files": {
"type": "object",
"additionalProperties": false,
"patternProperties": {
"^[-a-zA-Z0-9_]+(\\.[a-zA-Z0-9]+)?$": {
"type": [
{
"type": "null"
}, {
"type": "object",
"properties": {
"filename": {
"type": "string"
},
"content": {
"type": "string"
}
},
"minProperties": 1
}
]
}
}
}
}
}
================================================
FILE: servers/api/server.js
================================================
// Everything starts better with coffee
var coffee = require("coffee-script");
var express = require("express");
var nconf = require("nconf").use("memory")
.argv()
.env()
.file({file: "config.json"})
.defaults({
"PORT": 8080
});
if (!nconf.get("host")) {
console.error("The host option is required for Plunker to start");
} else {
//process.env.NODE_ENV = "production";
var host = nconf.get("host");
// Configure global paths
if (nconf.get("nosubdomains")) {
nconf.set("url:www", "http://" + host);
nconf.set("url:raw", "http://" + host + "/raw");
nconf.set("url:run", "http://" + host + "/run");
nconf.set("url:api", "http://" + host + "/api");
} else {
nconf.set("url:www", "http://" + host);
nconf.set("url:raw", "http://raw." + host);
nconf.set("url:run", "http://run." + host);
nconf.set("url:api", "http://api." + host);
}
// Create and start the parent server
require("./index").listen(nconf.get("PORT"));
console.log("Started plunker-www in", nconf.get("NODE_ENV") || "development", "at", nconf.get("host"), "on port", nconf.get("PORT"), "using subdomains:", !nconf.get("nosubdomains"));
}
================================================
FILE: servers/embed/.gitignore
================================================
lib-cov
*.seed
*.log
*.csv
*.dat
*.out
*.pid
*.gz
pids
logs
results
tests
node_modules
npm-debug.log
.c9revisions
builtAssets
================================================
FILE: servers/embed/assets/bootstrap/js/bootstrap-affix.js
================================================
/* ==========================================================
* bootstrap-affix.js v2.1.0
* http://twitter.github.com/bootstrap/javascript.html#affix
* ==========================================================
* Copyright 2012 Twitter, Inc.
*
* Licensed under the Apache License, Version 2.0 (the "License");
* you may not use this file except in compliance with the License.
* You may obtain a copy of the License at
*
* http://www.apache.org/licenses/LICENSE-2.0
*
* Unless required by applicable law or agreed to in writing, software
* distributed under the License is distributed on an "AS IS" BASIS,
* WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
* See the License for the specific language governing permissions and
* limitations under the License.
* ========================================================== */
!function ($) {
"use strict"; // jshint ;_;
/* AFFIX CLASS DEFINITION
* ====================== */
var Affix = function (element, options) {
this.options = $.extend({}, $.fn.affix.defaults, options)
this.$window = $(window).on('scroll.affix.data-api', $.proxy(this.checkPosition, this))
this.$element = $(element)
this.checkPosition()
}
Affix.prototype.checkPosition = function () {
if (!this.$element.is(':visible')) return
var scrollHeight = $(document).height()
, scrollTop = this.$window.scrollTop()
, position = this.$element.offset()
, offset = this.options.offset
, offsetBottom = offset.bottom
, offsetTop = offset.top
, reset = 'affix affix-top affix-bottom'
, affix
if (typeof offset != 'object') offsetBottom = offsetTop = offset
if (typeof offsetTop == 'function') offsetTop = offset.top()
if (typeof offsetBottom == 'function') offsetBottom = offset.bottom()
affix = this.unpin != null && (scrollTop + this.unpin <= position.top) ?
false : offsetBottom != null && (position.top + this.$element.height() >= scrollHeight - offsetBottom) ?
'bottom' : offsetTop != null && scrollTop <= offsetTop ?
'top' : false
if (this.affixed === affix) return
this.affixed = affix
this.unpin = affix == 'bottom' ? position.top - scrollTop : null
this.$element.removeClass(reset).addClass('affix' + (affix ? '-' + affix : ''))
}
/* AFFIX PLUGIN DEFINITION
* ======================= */
$.fn.affix = function (option) {
return this.each(function () {
var $this = $(this)
, data = $this.data('affix')
, options = typeof option == 'object' && option
if (!data) $this.data('affix', (data = new Affix(this, options)))
if (typeof option == 'string') data[option]()
})
}
$.fn.affix.Constructor = Affix
$.fn.affix.defaults = {
offset: 0
}
/* AFFIX DATA-API
* ============== */
$(window).on('load', function () {
$('[data-spy="affix"]').each(function () {
var $spy = $(this)
, data = $spy.data()
data.offset = data.offset || {}
data.offsetBottom && (data.offset.bottom = data.offsetBottom)
data.offsetTop && (data.offset.top = data.offsetTop)
$spy.affix(data)
})
})
}(window.jQuery);
================================================
FILE: servers/embed/assets/bootstrap/js/bootstrap-alert.js
================================================
/* ==========================================================
* bootstrap-alert.js v2.1.0
* http://twitter.github.com/bootstrap/javascript.html#alerts
* ==========================================================
* Copyright 2012 Twitter, Inc.
*
* Licensed under the Apache License, Version 2.0 (the "License");
* you may not use this file except in compliance with the License.
* You may obtain a copy of the License at
*
* http://www.apache.org/licenses/LICENSE-2.0
*
* Unless required by applicable law or agreed to in writing, software
* distributed under the License is distributed on an "AS IS" BASIS,
* WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
* See the License for the specific language governing permissions and
* limitations under the License.
* ========================================================== */
!function ($) {
"use strict"; // jshint ;_;
/* ALERT CLASS DEFINITION
* ====================== */
var dismiss = '[data-dismiss="alert"]'
, Alert = function (el) {
$(el).on('click', dismiss, this.close)
}
Alert.prototype.close = function (e) {
var $this = $(this)
, selector = $this.attr('data-target')
, $parent
if (!selector) {
selector = $this.attr('href')
selector = selector && selector.replace(/.*(?=#[^\s]*$)/, '') //strip for ie7
}
$parent = $(selector)
e && e.preventDefault()
$parent.length || ($parent = $this.hasClass('alert') ? $this : $this.parent())
$parent.trigger(e = $.Event('close'))
if (e.isDefaultPrevented()) return
$parent.removeClass('in')
function removeElement() {
$parent
.trigger('closed')
.remove()
}
$.support.transition && $parent.hasClass('fade') ?
$parent.on($.support.transition.end, removeElement) :
removeElement()
}
/* ALERT PLUGIN DEFINITION
* ======================= */
$.fn.alert = function (option) {
return this.each(function () {
var $this = $(this)
, data = $this.data('alert')
if (!data) $this.data('alert', (data = new Alert(this)))
if (typeof option == 'string') data[option].call($this)
})
}
$.fn.alert.Constructor = Alert
/* ALERT DATA-API
* ============== */
$(function () {
$('body').on('click.alert.data-api', dismiss, Alert.prototype.close)
})
}(window.jQuery);
================================================
FILE: servers/embed/assets/bootstrap/js/bootstrap-all.js
================================================
//= require bootstrap-transition
//= require bootstrap-button
//= require bootstrap-dropdown
================================================
FILE: servers/embed/assets/bootstrap/js/bootstrap-button.js
================================================
/* ============================================================
* bootstrap-button.js v2.1.0
* http://twitter.github.com/bootstrap/javascript.html#buttons
* ============================================================
* Copyright 2012 Twitter, Inc.
*
* Licensed under the Apache License, Version 2.0 (the "License");
* you may not use this file except in compliance with the License.
* You may obtain a copy of the License at
*
* http://www.apache.org/licenses/LICENSE-2.0
*
* Unless required by applicable law or agreed to in writing, software
* distributed under the License is distributed on an "AS IS" BASIS,
* WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
* See the License for the specific language governing permissions and
* limitations under the License.
* ============================================================ */
!function ($) {
"use strict"; // jshint ;_;
/* BUTTON PUBLIC CLASS DEFINITION
* ============================== */
var Button = function (element, options) {
this.$element = $(element)
this.options = $.extend({}, $.fn.button.defaults, options)
}
Button.prototype.setState = function (state) {
var d = 'disabled'
, $el = this.$element
, data = $el.data()
, val = $el.is('input') ? 'val' : 'html'
state = state + 'Text'
data.resetText || $el.data('resetText', $el[val]())
$el[val](data[state] || this.options[state])
// push to event loop to allow forms to submit
setTimeout(function () {
state == 'loadingText' ?
$el.addClass(d).attr(d, d) :
$el.removeClass(d).removeAttr(d)
}, 0)
}
Button.prototype.toggle = function () {
var $parent = this.$element.parent('[data-toggle="buttons-radio"]')
$parent && $parent
.find('.active')
.removeClass('active')
this.$element.toggleClass('active')
}
/* BUTTON PLUGIN DEFINITION
* ======================== */
$.fn.button = function (option) {
return this.each(function () {
var $this = $(this)
, data = $this.data('button')
, options = typeof option == 'object' && option
if (!data) $this.data('button', (data = new Button(this, options)))
if (option == 'toggle') data.toggle()
else if (option) data.setState(option)
})
}
$.fn.button.defaults = {
loadingText: 'loading...'
}
$.fn.button.Constructor = Button
/* BUTTON DATA-API
* =============== */
$(function () {
$('body').on('click.button.data-api', '[data-toggle^=button]', function ( e ) {
var $btn = $(e.target)
if (!$btn.hasClass('btn')) $btn = $btn.closest('.btn')
$btn.button('toggle')
})
})
}(window.jQuery);
================================================
FILE: servers/embed/assets/bootstrap/js/bootstrap-carousel.js
================================================
/* ==========================================================
* bootstrap-carousel.js v2.1.0
* http://twitter.github.com/bootstrap/javascript.html#carousel
* ==========================================================
* Copyright 2012 Twitter, Inc.
*
* Licensed under the Apache License, Version 2.0 (the "License");
* you may not use this file except in compliance with the License.
* You may obtain a copy of the License at
*
* http://www.apache.org/licenses/LICENSE-2.0
*
* Unless required by applicable law or agreed to in writing, software
* distributed under the License is distributed on an "AS IS" BASIS,
* WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
* See the License for the specific language governing permissions and
* limitations under the License.
* ========================================================== */
!function ($) {
"use strict"; // jshint ;_;
/* CAROUSEL CLASS DEFINITION
* ========================= */
var Carousel = function (element, options) {
this.$element = $(element)
this.options = options
this.options.slide && this.slide(this.options.slide)
this.options.pause == 'hover' && this.$element
.on('mouseenter', $.proxy(this.pause, this))
.on('mouseleave', $.proxy(this.cycle, this))
}
Carousel.prototype = {
cycle: function (e) {
if (!e) this.paused = false
this.options.interval
&& !this.paused
&& (this.interval = setInterval($.proxy(this.next, this), this.options.interval))
return this
}
, to: function (pos) {
var $active = this.$element.find('.item.active')
, children = $active.parent().children()
, activePos = children.index($active)
, that = this
if (pos > (children.length - 1) || pos < 0) return
if (this.sliding) {
return this.$element.one('slid', function () {
that.to(pos)
})
}
if (activePos == pos) {
return this.pause().cycle()
}
return this.slide(pos > activePos ? 'next' : 'prev', $(children[pos]))
}
, pause: function (e) {
if (!e) this.paused = true
if (this.$element.find('.next, .prev').length && $.support.transition.end) {
this.$element.trigger($.support.transition.end)
this.cycle()
}
clearInterval(this.interval)
this.interval = null
return this
}
, next: function () {
if (this.sliding) return
return this.slide('next')
}
, prev: function () {
if (this.sliding) return
return this.slide('prev')
}
, slide: function (type, next) {
var $active = this.$element.find('.item.active')
, $next = next || $active[type]()
, isCycling = this.interval
, direction = type == 'next' ? 'left' : 'right'
, fallback = type == 'next' ? 'first' : 'last'
, that = this
, e = $.Event('slide', {
relatedTarget: $next[0]
})
this.sliding = true
isCycling && this.pause()
$next = $next.length ? $next : this.$element.find('.item')[fallback]()
if ($next.hasClass('active')) return
if ($.support.transition && this.$element.hasClass('slide')) {
this.$element.trigger(e)
if (e.isDefaultPrevented()) return
$next.addClass(type)
$next[0].offsetWidth // force reflow
$active.addClass(direction)
$next.addClass(direction)
this.$element.one($.support.transition.end, function () {
$next.removeClass([type, direction].join(' ')).addClass('active')
$active.removeClass(['active', direction].join(' '))
that.sliding = false
setTimeout(function () { that.$element.trigger('slid') }, 0)
})
} else {
this.$element.trigger(e)
if (e.isDefaultPrevented()) return
$active.removeClass('active')
$next.addClass('active')
this.sliding = false
this.$element.trigger('slid')
}
isCycling && this.cycle()
return this
}
}
/* CAROUSEL PLUGIN DEFINITION
* ========================== */
$.fn.carousel = function (option) {
return this.each(function () {
var $this = $(this)
, data = $this.data('carousel')
, options = $.extend({}, $.fn.carousel.defaults, typeof option == 'object' && option)
, action = typeof option == 'string' ? option : options.slide
if (!data) $this.data('carousel', (data = new Carousel(this, options)))
if (typeof option == 'number') data.to(option)
else if (action) data[action]()
else if (options.interval) data.cycle()
})
}
$.fn.carousel.defaults = {
interval: 5000
, pause: 'hover'
}
$.fn.carousel.Constructor = Carousel
/* CAROUSEL DATA-API
* ================= */
$(function () {
$('body').on('click.carousel.data-api', '[data-slide]', function ( e ) {
var $this = $(this), href
, $target = $($this.attr('data-target') || (href = $this.attr('href')) && href.replace(/.*(?=#[^\s]+$)/, '')) //strip for ie7
, options = !$target.data('modal') && $.extend({}, $target.data(), $this.data())
$target.carousel(options)
e.preventDefault()
})
})
}(window.jQuery);
================================================
FILE: servers/embed/assets/bootstrap/js/bootstrap-collapse.js
================================================
/* =============================================================
* bootstrap-collapse.js v2.1.0
* http://twitter.github.com/bootstrap/javascript.html#collapse
* =============================================================
* Copyright 2012 Twitter, Inc.
*
* Licensed under the Apache License, Version 2.0 (the "License");
* you may not use this file except in compliance with the License.
* You may obtain a copy of the License at
*
* http://www.apache.org/licenses/LICENSE-2.0
*
* Unless required by applicable law or agreed to in writing, software
* distributed under the License is distributed on an "AS IS" BASIS,
* WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
* See the License for the specific language governing permissions and
* limitations under the License.
* ============================================================ */
!function ($) {
"use strict"; // jshint ;_;
/* COLLAPSE PUBLIC CLASS DEFINITION
* ================================ */
var Collapse = function (element, options) {
this.$element = $(element)
this.options = $.extend({}, $.fn.collapse.defaults, options)
if (this.options.parent) {
this.$parent = $(this.options.parent)
}
this.options.toggle && this.toggle()
}
Collapse.prototype = {
constructor: Collapse
, dimension: function () {
var hasWidth = this.$element.hasClass('width')
return hasWidth ? 'width' : 'height'
}
, show: function () {
var dimension
, scroll
, actives
, hasData
if (this.transitioning) return
dimension = this.dimension()
scroll = $.camelCase(['scroll', dimension].join('-'))
actives = this.$parent && this.$parent.find('> .accordion-group > .in')
if (actives && actives.length) {
hasData = actives.data('collapse')
if (hasData && hasData.transitioning) return
actives.collapse('hide')
hasData || actives.data('collapse', null)
}
this.$element[dimension](0)
this.transition('addClass', $.Event('show'), 'shown')
$.support.transition && this.$element[dimension](this.$element[0][scroll])
}
, hide: function () {
var dimension
if (this.transitioning) return
dimension = this.dimension()
this.reset(this.$element[dimension]())
this.transition('removeClass', $.Event('hide'), 'hidden')
this.$element[dimension](0)
}
, reset: function (size) {
var dimension = this.dimension()
this.$element
.removeClass('collapse')
[dimension](size || 'auto')
[0].offsetWidth
this.$element[size !== null ? 'addClass' : 'removeClass']('collapse')
return this
}
, transition: function (method, startEvent, completeEvent) {
var that = this
, complete = function () {
if (startEvent.type == 'show') that.reset()
that.transitioning = 0
that.$element.trigger(completeEvent)
}
this.$element.trigger(startEvent)
if (startEvent.isDefaultPrevented()) return
this.transitioning = 1
this.$element[method]('in')
$.support.transition && this.$element.hasClass('collapse') ?
this.$element.one($.support.transition.end, complete) :
complete()
}
, toggle: function () {
this[this.$element.hasClass('in') ? 'hide' : 'show']()
}
}
/* COLLAPSIBLE PLUGIN DEFINITION
* ============================== */
$.fn.collapse = function (option) {
return this.each(function () {
var $this = $(this)
, data = $this.data('collapse')
, options = typeof option == 'object' && option
if (!data) $this.data('collapse', (data = new Collapse(this, options)))
if (typeof option == 'string') data[option]()
})
}
$.fn.collapse.defaults = {
toggle: true
}
$.fn.collapse.Constructor = Collapse
/* COLLAPSIBLE DATA-API
* ==================== */
$(function () {
$('body').on('click.collapse.data-api', '[data-toggle=collapse]', function (e) {
var $this = $(this), href
, target = $this.attr('data-target')
|| e.preventDefault()
|| (href = $this.attr('href')) && href.replace(/.*(?=#[^\s]+$)/, '') //strip for ie7
, option = $(target).data('collapse') ? 'toggle' : $this.data()
$this[$(target).hasClass('in') ? 'addClass' : 'removeClass']('collapsed')
$(target).collapse(option)
})
})
}(window.jQuery);
================================================
FILE: servers/embed/assets/bootstrap/js/bootstrap-dropdown.js
================================================
/* ============================================================
* bootstrap-dropdown.js v2.1.0
* http://twitter.github.com/bootstrap/javascript.html#dropdowns
* ============================================================
* Copyright 2012 Twitter, Inc.
*
* Licensed under the Apache License, Version 2.0 (the "License");
* you may not use this file except in compliance with the License.
* You may obtain a copy of the License at
*
* http://www.apache.org/licenses/LICENSE-2.0
*
* Unless required by applicable law or agreed to in writing, software
* distributed under the License is distributed on an "AS IS" BASIS,
* WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
* See the License for the specific language governing permissions and
* limitations under the License.
* ============================================================ */
!function ($) {
"use strict"; // jshint ;_;
/* DROPDOWN CLASS DEFINITION
* ========================= */
var toggle = '[data-toggle=dropdown]'
, Dropdown = function (element) {
var $el = $(element).on('click.dropdown.data-api', this.toggle)
$('html').on('click.dropdown.data-api', function () {
$el.parent().removeClass('open')
})
}
Dropdown.prototype = {
constructor: Dropdown
, toggle: function (e) {
var $this = $(this)
, $parent
, isActive
if ($this.is('.disabled, :disabled')) return
$parent = getParent($this)
isActive = $parent.hasClass('open')
clearMenus()
if (!isActive) {
$parent.toggleClass('open')
$this.focus()
}
return false
}
, keydown: function (e) {
var $this
, $items
, $active
, $parent
, isActive
, index
if (!/(38|40|27)/.test(e.keyCode)) return
$this = $(this)
e.preventDefault()
e.stopPropagation()
if ($this.is('.disabled, :disabled')) return
$parent = getParent($this)
isActive = $parent.hasClass('open')
if (!isActive || (isActive && e.keyCode == 27)) return $this.click()
$items = $('[role=menu] li:not(.divider) a', $parent)
if (!$items.length) return
index = $items.index($items.filter(':focus'))
if (e.keyCode == 38 && index > 0) index-- // up
if (e.keyCode == 40 && index < $items.length - 1) index++ // down
if (!~index) index = 0
$items
.eq(index)
.focus()
}
}
function clearMenus() {
getParent($(toggle))
.removeClass('open')
}
function getParent($this) {
var selector = $this.attr('data-target')
, $parent
if (!selector) {
selector = $this.attr('href')
selector = selector && selector.replace(/.*(?=#[^\s]*$)/, '') //strip for ie7
}
$parent = $(selector)
$parent.length || ($parent = $this.parent())
return $parent
}
/* DROPDOWN PLUGIN DEFINITION
* ========================== */
$.fn.dropdown = function (option) {
return this.each(function () {
var $this = $(this)
, data = $this.data('dropdown')
if (!data) $this.data('dropdown', (data = new Dropdown(this)))
if (typeof option == 'string') data[option].call($this)
})
}
$.fn.dropdown.Constructor = Dropdown
/* APPLY TO STANDARD DROPDOWN ELEMENTS
* =================================== */
$(function () {
$('html')
.on('click.dropdown.data-api touchstart.dropdown.data-api', clearMenus)
$('body')
.on('click.dropdown touchstart.dropdown.data-api', '.dropdown', function (e) { e.stopPropagation() })
.on('click.dropdown.data-api touchstart.dropdown.data-api' , toggle, Dropdown.prototype.toggle)
.on('keydown.dropdown.data-api touchstart.dropdown.data-api', toggle + ', [role=menu]' , Dropdown.prototype.keydown)
})
}(window.jQuery);
================================================
FILE: servers/embed/assets/bootstrap/js/bootstrap-modal.js
================================================
/* =========================================================
* bootstrap-modal.js v2.1.0
* http://twitter.github.com/bootstrap/javascript.html#modals
* =========================================================
* Copyright 2012 Twitter, Inc.
*
* Licensed under the Apache License, Version 2.0 (the "License");
* you may not use this file except in compliance with the License.
* You may obtain a copy of the License at
*
* http://www.apache.org/licenses/LICENSE-2.0
*
* Unless required by applicable law or agreed to in writing, software
* distributed under the License is distributed on an "AS IS" BASIS,
* WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
* See the License for the specific language governing permissions and
* limitations under the License.
* ========================================================= */
!function ($) {
"use strict"; // jshint ;_;
/* MODAL CLASS DEFINITION
* ====================== */
var Modal = function (element, options) {
this.options = options
this.$element = $(element)
.delegate('[data-dismiss="modal"]', 'click.dismiss.modal', $.proxy(this.hide, this))
this.options.remote && this.$element.find('.modal-body').load(this.options.remote)
}
Modal.prototype = {
constructor: Modal
, toggle: function () {
return this[!this.isShown ? 'show' : 'hide']()
}
, show: function () {
var that = this
, e = $.Event('show')
this.$element.trigger(e)
if (this.isShown || e.isDefaultPrevented()) return
$('body').addClass('modal-open')
this.isShown = true
this.escape()
this.backdrop(function () {
var transition = $.support.transition && that.$element.hasClass('fade')
if (!that.$element.parent().length) {
that.$element.appendTo(document.body) //don't move modals dom position
}
that.$element
.show()
if (transition) {
that.$element[0].offsetWidth // force reflow
}
that.$element
.addClass('in')
.attr('aria-hidden', false)
.focus()
that.enforceFocus()
transition ?
that.$element.one($.support.transition.end, function () { that.$element.trigger('shown') }) :
that.$element.trigger('shown')
})
}
, hide: function (e) {
e && e.preventDefault()
var that = this
e = $.Event('hide')
this.$element.trigger(e)
if (!this.isShown || e.isDefaultPrevented()) return
this.isShown = false
$('body').removeClass('modal-open')
this.escape()
$(document).off('focusin.modal')
this.$element
.removeClass('in')
.attr('aria-hidden', true)
$.support.transition && this.$element.hasClass('fade') ?
this.hideWithTransition() :
this.hideModal()
}
, enforceFocus: function () {
var that = this
$(document).on('focusin.modal', function (e) {
if (that.$element[0] !== e.target && !that.$element.has(e.target).length) {
that.$element.focus()
}
})
}
, escape: function () {
var that = this
if (this.isShown && this.options.keyboard) {
this.$element.on('keyup.dismiss.modal', function ( e ) {
e.which == 27 && that.hide()
})
} else if (!this.isShown) {
this.$element.off('keyup.dismiss.modal')
}
}
, hideWithTransition: function () {
var that = this
, timeout = setTimeout(function () {
that.$element.off($.support.transition.end)
that.hideModal()
}, 500)
this.$element.one($.support.transition.end, function () {
clearTimeout(timeout)
that.hideModal()
})
}
, hideModal: function (that) {
this.$element
.hide()
.trigger('hidden')
this.backdrop()
}
, removeBackdrop: function () {
this.$backdrop.remove()
this.$backdrop = null
}
, backdrop: function (callback) {
var that = this
, animate = this.$element.hasClass('fade') ? 'fade' : ''
if (this.isShown && this.options.backdrop) {
var doAnimate = $.support.transition && animate
this.$backdrop = $('<div class="modal-backdrop ' + animate + '" />')
.appendTo(document.body)
if (this.options.backdrop != 'static') {
this.$backdrop.click($.proxy(this.hide, this))
}
if (doAnimate) this.$backdrop[0].offsetWidth // force reflow
this.$backdrop.addClass('in')
doAnimate ?
this.$backdrop.one($.support.transition.end, callback) :
callback()
} else if (!this.isShown && this.$backdrop) {
this.$backdrop.removeClass('in')
$.support.transition && this.$element.hasClass('fade')?
this.$backdrop.one($.support.transition.end, $.proxy(this.removeBackdrop, this)) :
this.removeBackdrop()
} else if (callback) {
callback()
}
}
}
/* MODAL PLUGIN DEFINITION
* ======================= */
$.fn.modal = function (option) {
return this.each(function () {
var $this = $(this)
, data = $this.data('modal')
, options = $.extend({}, $.fn.modal.defaults, $this.data(), typeof option == 'object' && option)
if (!data) $this.data('modal', (data = new Modal(this, options)))
if (typeof option == 'string') data[option]()
else if (options.show) data.show()
})
}
$.fn.modal.defaults = {
backdrop: true
, keyboard: true
, show: true
}
$.fn.modal.Constructor = Modal
/* MODAL DATA-API
* ============== */
$(function () {
$('body').on('click.modal.data-api', '[data-toggle="modal"]', function ( e ) {
var $this = $(this)
, href = $this.attr('href')
, $target = $($this.attr('data-target') || (href && href.replace(/.*(?=#[^\s]+$)/, ''))) //strip for ie7
, option = $target.data('modal') ? 'toggle' : $.extend({ remote: !/#/.test(href) && href }, $target.data(), $this.data())
e.preventDefault()
$target
.modal(option)
.one('hide', function () {
$this.focus()
})
})
})
}(window.jQuery);
================================================
FILE: servers/embed/assets/bootstrap/js/bootstrap-popover.js
================================================
/* ===========================================================
* bootstrap-popover.js v2.1.0
* http://twitter.github.com/bootstrap/javascript.html#popovers
* ===========================================================
* Copyright 2012 Twitter, Inc.
*
* Licensed under the Apache License, Version 2.0 (the "License");
* you may not use this file except in compliance with the License.
* You may obtain a copy of the License at
*
* http://www.apache.org/licenses/LICENSE-2.0
*
* Unless required by applicable law or agreed to in writing, software
* distributed under the License is distributed on an "AS IS" BASIS,
* WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
* See the License for the specific language governing permissions and
* limitations under the License.
* =========================================================== */
!function ($) {
"use strict"; // jshint ;_;
/* POPOVER PUBLIC CLASS DEFINITION
* =============================== */
var Popover = function (element, options) {
this.init('popover', element, options)
}
/* NOTE: POPOVER EXTENDS BOOTSTRAP-TOOLTIP.js
========================================== */
Popover.prototype = $.extend({}, $.fn.tooltip.Constructor.prototype, {
constructor: Popover
, setContent: function () {
var $tip = this.tip()
, title = this.getTitle()
, content = this.getContent()
$tip.find('.popover-title')[this.options.html ? 'html' : 'text'](title)
$tip.find('.popover-content > *')[this.options.html ? 'html' : 'text'](content)
$tip.removeClass('fade top bottom left right in')
}
, hasContent: function () {
return this.getTitle() || this.getContent()
}
, getContent: function () {
var content
, $e = this.$element
, o = this.options
content = $e.attr('data-content')
|| (typeof o.content == 'function' ? o.content.call($e[0]) : o.content)
return content
}
, tip: function () {
if (!this.$tip) {
this.$tip = $(this.options.template)
}
return this.$tip
}
, destroy: function () {
this.hide().$element.off('.' + this.type).removeData(this.type)
}
})
/* POPOVER PLUGIN DEFINITION
* ======================= */
$.fn.popover = function (option) {
return this.each(function () {
var $this = $(this)
, data = $this.data('popover')
, options = typeof option == 'object' && option
if (!data) $this.data('popover', (data = new Popover(this, options)))
if (typeof option == 'string') data[option]()
})
}
$.fn.popover.Constructor = Popover
$.fn.popover.defaults = $.extend({} , $.fn.tooltip.defaults, {
placement: 'right'
, trigger: 'click'
, content: ''
, template: '<div class="popover"><div class="arrow"></div><div class="popover-inner"><h3 class="popover-title"></h3><div class="popover-content"><p></p></div></div></div>'
})
}(window.jQuery);
================================================
FILE: servers/embed/assets/bootstrap/js/bootstrap-scrollspy.js
================================================
/* =============================================================
* bootstrap-scrollspy.js v2.1.0
* http://twitter.github.com/bootstrap/javascript.html#scrollspy
* =============================================================
* Copyright 2012 Twitter, Inc.
*
* Licensed under the Apache License, Version 2.0 (the "License");
* you may not use this file except in compliance with the License.
* You may obtain a copy of the License at
*
* http://www.apache.org/licenses/LICENSE-2.0
*
* Unless required by applicable law or agreed to in writing, software
* distributed under the License is distributed on an "AS IS" BASIS,
* WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
* See the License for the specific language governing permissions and
* limitations under the License.
* ============================================================== */
!function ($) {
"use strict"; // jshint ;_;
/* SCROLLSPY CLASS DEFINITION
* ========================== */
function ScrollSpy(element, options) {
var process = $.proxy(this.process, this)
, $element = $(element).is('body') ? $(window) : $(element)
, href
this.options = $.extend({}, $.fn.scrollspy.defaults, options)
this.$scrollElement = $element.on('scroll.scroll-spy.data-api', process)
this.selector = (this.options.target
|| ((href = $(element).attr('href')) && href.replace(/.*(?=#[^\s]+$)/, '')) //strip for ie7
|| '') + ' .nav li > a'
this.$body = $('body')
this.refresh()
this.process()
}
ScrollSpy.prototype = {
constructor: ScrollSpy
, refresh: function () {
var self = this
, $targets
this.offsets = $([])
this.targets = $([])
$targets = this.$body
.find(this.selector)
.map(function () {
var $el = $(this)
, href = $el.data('target') || $el.attr('href')
, $href = /^#\w/.test(href) && $(href)
return ( $href
&& $href.length
&& [[ $href.position().top, href ]] ) || null
})
.sort(function (a, b) { return a[0] - b[0] })
.each(function () {
self.offsets.push(this[0])
self.targets.push(this[1])
})
}
, process: function () {
var scrollTop = this.$scrollElement.scrollTop() + this.options.offset
, scrollHeight = this.$scrollElement[0].scrollHeight || this.$body[0].scrollHeight
, maxScroll = scrollHeight - this.$scrollElement.height()
, offsets = this.offsets
, targets = this.targets
, activeTarget = this.activeTarget
, i
if (scrollTop >= maxScroll) {
return activeTarget != (i = targets.last()[0])
&& this.activate ( i )
}
for (i = offsets.length; i--;) {
activeTarget != targets[i]
&& scrollTop >= offsets[i]
&& (!offsets[i + 1] || scrollTop <= offsets[i + 1])
&& this.activate( targets[i] )
}
}
, activate: function (target) {
var active
, selector
this.activeTarget = target
$(this.selector)
.parent('.active')
.removeClass('active')
selector = this.selector
+ '[data-target="' + target + '"],'
+ this.selector + '[href="' + target + '"]'
active = $(selector)
.parent('li')
.addClass('active')
if (active.parent('.dropdown-menu').length) {
active = active.closest('li.dropdown').addClass('active')
}
active.trigger('activate')
}
}
/* SCROLLSPY PLUGIN DEFINITION
* =========================== */
$.fn.scrollspy = function (option) {
return this.each(function () {
var $this = $(this)
, data = $this.data('scrollspy')
, options = typeof option == 'object' && option
if (!data) $this.data('scrollspy', (data = new ScrollSpy(this, options)))
if (typeof option == 'string') data[option]()
})
}
$.fn.scrollspy.Constructor = ScrollSpy
$.fn.scrollspy.defaults = {
offset: 10
}
/* SCROLLSPY DATA-API
* ================== */
$(window).on('load', function () {
$('[data-spy="scroll"]').each(function () {
var $spy = $(this)
$spy.scrollspy($spy.data())
})
})
}(window.jQuery);
================================================
FILE: servers/embed/assets/bootstrap/js/bootstrap-tab.js
================================================
/* ========================================================
* bootstrap-tab.js v2.1.0
* http://twitter.github.com/bootstrap/javascript.html#tabs
* ========================================================
* Copyright 2012 Twitter, Inc.
*
* Licensed under the Apache License, Version 2.0 (the "License");
* you may not use this file except in compliance with the License.
* You may obtain a copy of the License at
*
* http://www.apache.org/licenses/LICENSE-2.0
*
* Unless required by applicable law or agreed to in writing, software
* distributed under the License is distributed on an "AS IS" BASIS,
* WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
* See the License for the specific language governing permissions and
* limitations under the License.
* ======================================================== */
!function ($) {
"use strict"; // jshint ;_;
/* TAB CLASS DEFINITION
* ==================== */
var Tab = function (element) {
this.element = $(element)
}
Tab.prototype = {
constructor: Tab
, show: function () {
var $this = this.element
, $ul = $this.closest('ul:not(.dropdown-menu)')
, selector = $this.attr('data-target')
, previous
, $target
, e
if (!selector) {
selector = $this.attr('href')
selector = selector && selector.replace(/.*(?=#[^\s]*$)/, '') //strip for ie7
}
if ( $this.parent('li').hasClass('active') ) return
previous = $ul.find('.active a').last()[0]
e = $.Event('show', {
relatedTarget: previous
})
$this.trigger(e)
if (e.isDefaultPrevented()) return
$target = $(selector)
this.activate($this.parent('li'), $ul)
this.activate($target, $target.parent(), function () {
$this.trigger({
type: 'shown'
, relatedTarget: previous
})
})
}
, activate: function ( element, container, callback) {
var $active = container.find('> .active')
, transition = callback
&& $.support.transition
&& $active.hasClass('fade')
function next() {
$active
.removeClass('active')
.find('> .dropdown-menu > .active')
.removeClass('active')
element.addClass('active')
if (transition) {
element[0].offsetWidth // reflow for transition
element.addClass('in')
} else {
element.removeClass('fade')
}
if ( element.parent('.dropdown-menu') ) {
element.closest('li.dropdown').addClass('active')
}
callback && callback()
}
transition ?
$active.one($.support.transition.end, next) :
next()
$active.removeClass('in')
}
}
/* TAB PLUGIN DEFINITION
* ===================== */
$.fn.tab = function ( option ) {
return this.each(function () {
var $this = $(this)
, data = $this.data('tab')
if (!data) $this.data('tab', (data = new Tab(this)))
if (typeof option == 'string') data[option]()
})
}
$.fn.tab.Constructor = Tab
/* TAB DATA-API
* ============ */
$(function () {
$('body').on('click.tab.data-api', '[data-toggle="tab"], [data-toggle="pill"]', function (e) {
e.preventDefault()
$(this).tab('show')
})
})
}(window.jQuery);
================================================
FILE: servers/embed/assets/bootstrap/js/bootstrap-tooltip.js
================================================
/* ===========================================================
* bootstrap-tooltip.js v2.1.0
* http://twitter.github.com/bootstrap/javascript.html#tooltips
* Inspired by the original jQuery.tipsy by Jason Frame
* ===========================================================
* Copyright 2012 Twitter, Inc.
*
* Licensed under the Apache License, Version 2.0 (the "License");
* you may not use this file except in compliance with the License.
* You may obtain a copy of the License at
*
* http://www.apache.org/licenses/LICENSE-2.0
*
* Unless required by applicable law or agreed to in writing, software
* distributed under the License is distributed on an "AS IS" BASIS,
* WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
* See the License for the specific language governing permissions and
* limitations under the License.
* ========================================================== */
!function ($) {
"use strict"; // jshint ;_;
/* TOOLTIP PUBLIC CLASS DEFINITION
* =============================== */
var Tooltip = function (element, options) {
this.init('tooltip', element, options)
}
Tooltip.prototype = {
constructor: Tooltip
, init: function (type, element, options) {
var eventIn
, eventOut
this.type = type
this.$element = $(element)
this.options = this.getOptions(options)
this.enabled = true
if (this.options.trigger == 'click') {
this.$element.on('click.' + this.type, this.options.selector, $.proxy(this.toggle, this))
} else if (this.options.trigger != 'manual') {
eventIn = this.options.trigger == 'hover' ? 'mouseenter' : 'focus'
eventOut = this.options.trigger == 'hover' ? 'mouseleave' : 'blur'
this.$element.on(eventIn + '.' + this.type, this.options.selector, $.proxy(this.enter, this))
this.$element.on(eventOut + '.' + this.type, this.options.selector, $.proxy(this.leave, this))
}
this.options.selector ?
(this._options = $.extend({}, this.options, { trigger: 'manual', selector: '' })) :
this.fixTitle()
}
, getOptions: function (options) {
options = $.extend({}, $.fn[this.type].defaults, options, this.$element.data())
if (options.delay && typeof options.delay == 'number') {
options.delay = {
show: options.delay
, hide: options.delay
}
}
return options
}
, enter: function (e) {
var self = $(e.currentTarget)[this.type](this._options).data(this.type)
if (!self.options.delay || !self.options.delay.show) return self.show()
clearTimeout(this.timeout)
self.hoverState = 'in'
this.timeout = setTimeout(function() {
if (self.hoverState == 'in') self.show()
}, self.options.delay.show)
}
, leave: function (e) {
var self = $(e.currentTarget)[this.type](this._options).data(this.type)
if (this.timeout) clearTimeout(this.timeout)
if (!self.options.delay || !self.options.delay.hide) return self.hide()
self.hoverState = 'out'
this.timeout = setTimeout(function() {
if (self.hoverState == 'out') self.hide()
}, self.options.delay.hide)
}
, show: function () {
var $tip
, inside
, pos
, actualWidth
, actualHeight
, placement
, tp
if (this.hasContent() && this.enabled) {
$tip = this.tip()
this.setContent()
if (this.options.animation) {
$tip.addClass('fade')
}
placement = typeof this.options.placement == 'function' ?
this.options.placement.call(this, $tip[0], this.$element[0]) :
this.options.placement
inside = /in/.test(placement)
$tip
.remove()
.css({ top: 0, left: 0, display: 'block' })
.appendTo(inside ? this.$element : document.body)
pos = this.getPosition(inside)
actualWidth = $tip[0].offsetWidth
actualHeight = $tip[0].offsetHeight
switch (inside ? placement.split(' ')[1] : placement) {
case 'bottom':
tp = {top: pos.top + pos.height, left: pos.left + pos.width / 2 - actualWidth / 2}
break
case 'top':
tp = {top: pos.top - actualHeight, left: pos.left + pos.width / 2 - actualWidth / 2}
break
case 'left':
tp = {top: pos.top + pos.height / 2 - actualHeight / 2, left: pos.left - actualWidth}
break
case 'right':
tp = {top: pos.top + pos.height / 2 - actualHeight / 2, left: pos.left + pos.width}
break
}
$tip
.css(tp)
.addClass(placement)
.addClass('in')
}
}
, setContent: function () {
var $tip = this.tip()
, title = this.getTitle()
$tip.find('.tooltip-inner')[this.options.html ? 'html' : 'text'](title)
$tip.removeClass('fade in top bottom left right')
}
, hide: function () {
var that = this
, $tip = this.tip()
$tip.removeClass('in')
function removeWithAnimation() {
var timeout = setTimeout(function () {
$tip.off($.support.transition.end).remove()
}, 500)
$tip.one($.support.transition.end, function () {
clearTimeout(timeout)
$tip.remove()
})
}
$.support.transition && this.$tip.hasClass('fade') ?
removeWithAnimation() :
$tip.remove()
return this
}
, fixTitle: function () {
var $e = this.$element
if ($e.attr('title') || typeof($e.attr('data-original-title')) != 'string') {
$e.attr('data-original-title', $e.attr('title') || '').removeAttr('title')
}
}
, hasContent: function () {
return this.getTitle()
}
, getPosition: function (inside) {
return $.extend({}, (inside ? {top: 0, left: 0} : this.$element.offset()), {
width: this.$element[0].offsetWidth
, height: this.$element[0].offsetHeight
})
}
, getTitle: function () {
var title
, $e = this.$element
, o = this.options
title = $e.attr('data-original-title')
|| (typeof o.title == 'function' ? o.title.call($e[0]) : o.title)
return title
}
, tip: function () {
return this.$tip = this.$tip || $(this.options.template)
}
, validate: function () {
if (!this.$element[0].parentNode) {
this.hide()
this.$element = null
this.options = null
}
}
, enable: function () {
this.enabled = true
}
, disable: function () {
this.enabled = false
}
, toggleEnabled: function () {
this.enabled = !this.enabled
}
, toggle: function () {
this[this.tip().hasClass('in') ? 'hide' : 'show']()
}
, destroy: function () {
this.hide().$element.off('.' + this.type).removeData(this.type)
}
}
/* TOOLTIP PLUGIN DEFINITION
* ========================= */
$.fn.tooltip = function ( option ) {
return this.each(function () {
var $this = $(this)
, data = $this.data('tooltip')
, options = typeof option == 'object' && option
if (!data) $this.data('tooltip', (data = new Tooltip(this, options)))
if (typeof option == 'string') data[option]()
})
}
$.fn.tooltip.Constructor = Tooltip
$.fn.tooltip.defaults = {
animation: true
, placement: 'top'
, selector: false
, template: '<div class="tooltip"><div class="tooltip-arrow"></div><div class="tooltip-inner"></div></div>'
, trigger: 'hover'
, title: ''
, delay: 0
, html: true
}
}(window.jQuery);
================================================
FILE: servers/embed/assets/bootstrap/js/bootstrap-transition.js
================================================
/* ===================================================
* bootstrap-transition.js v2.1.0
* http://twitter.github.com/bootstrap/javascript.html#transitions
* ===================================================
* Copyright 2012 Twitter, Inc.
*
* Licensed under the Apache License, Version 2.0 (the "License");
* you may not use this file except in compliance with the License.
* You may obtain a copy of the License at
*
* http://www.apache.org/licenses/LICENSE-2.0
*
* Unless required by applicable law or agreed to in writing, software
* distributed under the License is distributed on an "AS IS" BASIS,
* WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
* See the License for the specific language governing permissions and
* limitations under the License.
* ========================================================== */
!function ($) {
$(function () {
"use strict"; // jshint ;_;
/* CSS TRANSITION SUPPORT (http://www.modernizr.com/)
* ======================================================= */
$.support.transition = (function () {
var transitionEnd = (function () {
var el = document.createElement('bootstrap')
, transEndEventNames = {
'WebkitTransition' : 'webkitTransitionEnd'
, 'MozTransition' : 'transitionend'
, 'OTransition' : 'oTransitionEnd otransitionend'
, 'transition' : 'transitionend'
}
, name
for (name in transEndEventNames){
if (el.style[name] !== undefined) {
return transEndEventNames[name]
}
}
}())
return transitionEnd && {
end: transitionEnd
}
})()
})
}(window.jQuery);
================================================
FILE: servers/embed/assets/bootstrap/js/bootstrap-typeahead.js
================================================
/* =============================================================
* bootstrap-typeahead.js v2.1.0
* http://twitter.github.com/bootstrap/javascript.html#typeahead
* =============================================================
* Copyright 2012 Twitter, Inc.
*
* Licensed under the Apache License, Version 2.0 (the "License");
* you may not use this file except in compliance with the License.
* You may obtain a copy of the License at
*
* http://www.apache.org/licenses/LICENSE-2.0
*
* Unless required by applicable law or agreed to in writing, software
* distributed under the License is distributed on an "AS IS" BASIS,
* WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
* See the License for the specific language governing permissions and
* limitations under the License.
* ============================================================ */
!function($){
"use strict"; // jshint ;_;
/* TYPEAHEAD PUBLIC CLASS DEFINITION
* ================================= */
var Typeahead = function (element, options) {
this.$element = $(element)
this.options = $.extend({}, $.fn.typeahead.defaults, options)
this.matcher = this.options.matcher || this.matcher
this.sorter = this.options.sorter || this.sorter
this.highlighter = this.options.highlighter || this.highlighter
this.updater = this.options.updater || this.updater
this.$menu = $(this.options.menu).appendTo('body')
this.source = this.options.source
this.shown = false
this.listen()
}
Typeahead.prototype = {
constructor: Typeahead
, select: function () {
var val = this.$menu.find('.active').attr('data-value')
this.$element
.val(this.updater(val))
.change()
return this.hide()
}
, updater: function (item) {
return item
}
, show: function () {
var pos = $.extend({}, this.$element.offset(), {
height: this.$element[0].offsetHeight
})
this.$menu.css({
top: pos.top + pos.height
, left: pos.left
})
this.$menu.show()
this.shown = true
return this
}
, hide: function () {
this.$menu.hide()
this.shown = false
return this
}
, lookup: function (event) {
var items
this.query = this.$element.val()
if (!this.query || this.query.length < this.options.minLength) {
return this.shown ? this.hide() : this
}
items = $.isFunction(this.source) ? this.source(this.query, $.proxy(this.process, this)) : this.source
return items ? this.process(items) : this
}
, process: function (items) {
var that = this
items = $.grep(items, function (item) {
return that.matcher(item)
})
items = this.sorter(items)
if (!items.length) {
return this.shown ? this.hide() : this
}
return this.render(items.slice(0, this.options.items)).show()
}
, matcher: function (item) {
return ~item.toLowerCase().indexOf(this.query.toLowerCase())
}
, sorter: function (items) {
var beginswith = []
, caseSensitive = []
, caseInsensitive = []
, item
while (item = items.shift()) {
if (!item.toLowerCase().indexOf(this.query.toLowerCase())) beginswith.push(item)
else if (~item.indexOf(this.query)) caseSensitive.push(item)
else caseInsensitive.push(item)
}
return beginswith.concat(caseSensitive, caseInsensitive)
}
, highlighter: function (item) {
var query = this.query.replace(/[\-\[\]{}()*+?.,\\\^$|#\s]/g, '\\$&')
return item.replace(new RegExp('(' + query + ')', 'ig'), function ($1, match) {
return '<strong>' + match + '</strong>'
})
}
, render: function (items) {
var that = this
items = $(items).map(function (i, item) {
i = $(that.options.item).attr('data-value', item)
i.find('a').html(that.highlighter(item))
return i[0]
})
items.first().addClass('active')
this.$menu.html(items)
return this
}
, next: function (event) {
var active = this.$menu.find('.active').removeClass('active')
, next = active.next()
if (!next.length) {
next = $(this.$menu.find('li')[0])
}
next.addClass('active')
}
, prev: function (event) {
var active = this.$menu.find('.active').removeClass('active')
, prev = active.prev()
if (!prev.length) {
prev = this.$menu.find('li').last()
}
prev.addClass('active')
}
, listen: function () {
this.$element
.on('blur', $.proxy(this.blur, this))
.on('keypress', $.proxy(this.keypress, this))
.on('keyup', $.proxy(this.keyup, this))
if ($.browser.webkit || $.browser.msie) {
this.$element.on('keydown', $.proxy(this.keydown, this))
}
this.$menu
.on('click', $.proxy(this.click, this))
.on('mouseenter', 'li', $.proxy(this.mouseenter, this))
}
, move: function (e) {
if (!this.shown) return
switch(e.keyCode) {
case 9: // tab
case 13: // enter
case 27: // escape
e.preventDefault()
break
case 38: // up arrow
e.preventDefault()
this.prev()
break
case 40: // down arrow
e.preventDefault()
this.next()
break
}
e.stopPropagation()
}
, keydown: function (e) {
this.suppressKeyPressRepeat = !~$.inArray(e.keyCode, [40,38,9,13,27])
this.move(e)
}
, keypress: function (e) {
if (this.suppressKeyPressRepeat) return
this.move(e)
}
, keyup: function (e) {
switch(e.keyCode) {
case 40: // down arrow
case 38: // up arrow
break
case 9: // tab
case 13: // enter
if (!this.shown) return
this.select()
break
case 27: // escape
if (!this.shown) return
this.hide()
break
default:
this.lookup()
}
e.stopPropagation()
e.preventDefault()
}
, blur: function (e) {
var that = this
setTimeout(function () { that.hide() }, 150)
}
, click: function (e) {
e.stopPropagation()
e.preventDefault()
this.select()
}
, mouseenter: function (e) {
this.$menu.find('.active').removeClass('active')
$(e.currentTarget).addClass('active')
}
}
/* TYPEAHEAD PLUGIN DEFINITION
* =========================== */
$.fn.typeahead = function (option) {
return this.each(function () {
var $this = $(this)
, data = $this.data('typeahead')
, options = typeof option == 'object' && option
if (!data) $this.data('typeahead', (data = new Typeahead(this, options)))
if (typeof option == 'string') data[option]()
})
}
$.fn.typeahead.defaults = {
source: []
, items: 8
, menu: '<ul class="typeahead dropdown-menu"></ul>'
, item: '<li><a href="#"></a></li>'
, minLength: 1
}
$.fn.typeahead.Constructor = Typeahead
/* TYPEAHEAD DATA-API
* ================== */
$(function () {
$('body').on('focus.typeahead.data-api', '[data-provide="typeahead"]', function (e) {
var $this = $(this)
if ($this.data('typeahead')) return
e.preventDefault()
$this.typeahead($this.data())
})
})
}(window.jQuery);
================================================
FILE: servers/embed/assets/bootstrap/less/accordion.less
================================================
//
// Accordion
// --------------------------------------------------
// Parent container
.accordion {
margin-bottom: @baseLineHeight;
}
// Group == heading + body
.accordion-group {
margin-bottom: 2px;
border: 1px solid #e5e5e5;
.border-radius(4px);
}
.accordion-heading {
border-bottom: 0;
}
.accordion-heading .accordion-toggle {
display: block;
padding: 8px 15px;
}
// General toggle styles
.accordion-toggle {
cursor: pointer;
}
// Inner needs the styles because you can't animate properly with any styles on the element
.accordion-inner {
padding: 9px 15px;
border-top: 1px solid #e5e5e5;
}
================================================
FILE: servers/embed/assets/bootstrap/less/alerts.less
================================================
//
// Alerts
// --------------------------------------------------
// Base styles
// -------------------------
.alert {
padding: 8px 35px 8px 14px;
margin-bottom: @baseLineHeight;
text-shadow: 0 1px 0 rgba(255,255,255,.5);
background-color: @warningBackground;
border: 1px solid @warningBorder;
.border-radius(4px);
color: @warningText;
}
.alert h4 {
margin: 0;
}
// Adjust close link position
.alert .close {
position: relative;
top: -2px;
right: -21px;
line-height: @baseLineHeight;
}
// Alternate styles
// -------------------------
.alert-success {
background-color: @successBackground;
border-color: @successBorder;
color: @successText;
}
.alert-danger,
.alert-error {
background-color: @errorBackground;
border-color: @errorBorder;
color: @errorText;
}
.alert-info {
background-color: @infoBackground;
border-color: @infoBorder;
color: @infoText;
}
// Block alerts
// -------------------------
.alert-block {
padding-top: 14px;
padding-bottom: 14px;
}
.alert-block > p,
.alert-block > ul {
margin-bottom: 0;
}
.alert-block p + p {
margin-top: 5px;
}
================================================
FILE: servers/embed/assets/bootstrap/less/bootstrap.less
================================================
/*!
* Bootstrap v2.1.0
*
* Copyright 2012 Twitter, Inc
* Licensed under the Apache License v2.0
* http://www.apache.org/licenses/LICENSE-2.0
*
* Designed and built with all the love in the world @twitter by @mdo and @fat.
*/
// CSS Reset
@import "reset.less";
// Core variables and mixins
@import "variables.less"; // Modify this for custom colors, font-sizes, etc
@import "mixins.less";
// Grid system and page structure
@import "scaffolding.less";
@import "grid.less";
@import "layouts.less";
// Base CSS
@import "type.less";
@import "code.less";
@import "forms.less";
@import "tables.less";
// Components: common
@import "font-awesome.less";
@import "dropdowns.less";
@import "wells.less";
@import "component-animations.less";
@import "close.less";
// Components: Buttons & Alerts
@import "buttons.less";
@import "button-groups.less";
@import "alerts.less"; // Note: alerts share common CSS with buttons and thus have styles in buttons.less
// Components: Nav
@import "navs.less";
@import "navbar.less";
@import "breadcrumbs.less";
@import "pagination.less";
@import "pager.less";
// Components: Popovers
@import "modals.less";
@import "tooltip.less";
@import "popovers.less";
// Components: Misc
@import "thumbnails.less";
@import "labels-badges.less";
@import "progress-bars.less";
@import "accordion.less";
@import "carousel.less";
@import "hero-unit.less";
// Utility classes
@import "utilities.less"; // Has to be last to override when necessary
================================================
FILE: servers/embed/assets/bootstrap/less/breadcrumbs.less
================================================
//
// Breadcrumbs
// --------------------------------------------------
.breadcrumb {
padding: 8px 15px;
margin: 0 0 @baseLineHeight;
list-style: none;
background-color: #f5f5f5;
.border-radius(4px);
li {
display: inline-block;
.ie7-inline-block();
text-shadow: 0 1px 0 @white;
}
.divider {
padding: 0 5px;
color: #ccc;
}
.active {
color: @grayLight;
}
}
================================================
FILE: servers/embed/assets/bootstrap/less/button-groups.less
================================================
//
// Button groups
// --------------------------------------------------
// Make the div behave like a button
.btn-group {
position: relative;
font-size: 0; // remove as part 1 of font-size inline-block hack
white-space: nowrap; // prevent buttons from wrapping when in tight spaces (e.g., the table on the tests page)
.ie7-restore-left-whitespace();
}
// Space out series of button groups
.btn-group + .btn-group {
margin-left: 5px;
}
// Optional: Group multiple button groups together for a toolbar
.btn-toolbar {
font-size: 0; // Hack to remove whitespace that results from using inline-block
margin-top: @baseLineHeight / 2;
margin-bottom: @baseLineHeight / 2;
.btn-group {
display: inline-block;
.ie7-inline-block();
}
.btn + .btn,
.btn-group + .btn,
.btn + .btn-group {
margin-left: 5px;
}
}
// Float them, remove border radius, then re-add to first and last elements
.btn-group > .btn {
position: relative;
.border-radius(0);
}
.btn-group > .btn + .btn {
margin-left: -1px;
}
.btn-group > .btn,
.btn-group > .dropdown-menu {
font-size: @baseFontSize; // redeclare as part 2 of font-size inline-block hack
}
// Reset fonts for other sizes
.btn-group > .btn-mini {
font-size: 11px;
}
.btn-group > .btn-small {
font-size: 12px;
}
.btn-group > .btn-large {
font-size: 16px;
}
// Set corners individual because sometimes a single button can be in a .btn-group and we need :first-child and :last-child to both match
.btn-group > .btn:first-child {
margin-left: 0;
-webkit-border-top-left-radius: 4px;
-moz-border-radius-topleft: 4px;
border-top-left-radius: 4px;
-webkit-border-bottom-left-radius: 4px;
-moz-border-radius-bottomleft: 4px;
border-bottom-left-radius: 4px;
}
// Need .dropdown-toggle since :last-child doesn't apply given a .dropdown-menu immediately after it
.btn-group > .btn:last-child,
.btn-group > .dropdown-toggle {
-webkit-border-top-right-radius: 4px;
-moz-border-radius-topright: 4px;
border-top-right-radius: 4px;
-webkit-border-bottom-right-radius: 4px;
-moz-border-radius-bottomright: 4px;
border-bottom-right-radius: 4px;
}
// Reset corners for large buttons
.btn-group > .btn.large:first-child {
margin-left: 0;
-webkit-border-top-left-radius: 6px;
-moz-border-radius-topleft: 6px;
border-top-left-radius: 6px;
-webkit-border-bottom-left-radius: 6px;
-moz-border-radius-bottomleft: 6px;
border-bottom-left-radius: 6px;
}
.btn-group > .btn.large:last-child,
.btn-group > .large.dropdown-toggle {
-webkit-border-top-right-radius: 6px;
-moz-border-radius-topright: 6px;
border-top-right-radius: 6px;
-webkit-border-bottom-right-radius: 6px;
-moz-border-radius-bottomright: 6px;
border-bottom-right-radius: 6px;
}
// On hover/focus/active, bring the proper btn to front
.btn-group > .btn:hover,
.btn-group > .btn:focus,
.btn-group > .btn:active,
.btn-group > .btn.active {
z-index: 2;
}
// On active and open, don't show outline
.btn-group .dropdown-toggle:active,
.btn-group.open .dropdown-toggle {
outline: 0;
}
// Split button dropdowns
// ----------------------
// Give the line between buttons some depth
.btn-group > .btn + .dropdown-toggle {
padding-left: 8px;
padding-right: 8px;
.box-shadow(~"inset 1px 0 0 rgba(255,255,255,.125), inset 0 1px 0 rgba(255,255,255,.2), 0 1px 2px rgba(0,0,0,.05)");
*padding-top: 5px;
*padding-bottom: 5px;
}
.btn-group > .btn-mini + .dropdown-toggle {
padding-left: 5px;
padding-right: 5px;
*padding-top: 2px;
*padding-bottom: 2px;
}
.btn-group > .btn-small + .dropdown-toggle {
*padding-top: 5px;
*padding-bottom: 4px;
}
.btn-group > .btn-large + .dropdown-toggle {
padding-left: 12px;
padding-right: 12px;
*padding-top: 7px;
*padding-bottom: 7px;
}
.btn-group.open {
// The clickable button for toggling the menu
// Remove the gradient and set the same inset shadow as the :active state
.dropdown-toggle {
background-image: none;
.box-shadow(~"inset 0 2px 4px rgba(0,0,0,.15), 0 1px 2px rgba(0,0,0,.05)");
}
// Keep the hover's background when dropdown is open
.btn.dropdown-toggle {
background-color: @btnBackgroundHighlight;
}
.btn-primary.dropdown-toggle {
background-color: @btnPrimaryBackgroundHighlight;
}
.btn-warning.dropdown-toggle {
background-color: @btnWarningBackgroundHighlight;
}
.btn-danger.dropdown-toggle {
background-color: @btnDangerBackgroundHighlight;
}
.btn-success.dropdown-toggle {
background-color: @btnSuccessBackgroundHighlight;
}
.btn-info.dropdown-toggle {
background-color: @btnInfoBackgroundHighlight;
}
.btn-inverse.dropdown-toggle {
background-color: @btnInverseBackgroundHighlight;
}
}
// Reposition the caret
.btn .caret {
margin-top: 8px;
margin-left: 0;
}
// Carets in other button sizes
.btn-mini .caret,
.btn-small .caret,
.btn-large .caret {
margin-top: 6px;
}
.btn-large .caret {
border-left-width: 5px;
border-right-width: 5px;
border-top-width: 5px;
}
// Upside down carets for .dropup
.dropup .btn-large .caret {
border-bottom: 5px solid @black;
border-top: 0;
}
// Account for other colors
.btn-primary,
.btn-warning,
.btn-danger,
.btn-info,
.btn-success,
.btn-inverse {
.caret {
border-top-color: @white;
border-bottom-color: @white;
}
}
// Vertical button groups
// ----------------------
.btn-group-vertical {
display: inline-block; // makes buttons only take up the width they need
.ie7-inline-block();
}
.btn-group-vertical .btn {
display: block;
float: none;
width: 100%;
.border-radius(0);
}
.btn-group-vertical .btn + .btn {
margin-left: 0;
margin-top: -1px;
}
.btn-group-vertical .btn:first-child {
.border-radius(4px 4px 0 0);
}
.btn-group-vertical .btn:last-child {
.border-radius(0 0 4px 4px);
}
.btn-group-vertical .btn-large:first-child {
.border-radius(6px 6px 0 0);
}
.btn-group-vertical .btn-large:last-child {
.border-radius(0 0 6px 6px);
}
================================================
FILE: servers/embed/assets/bootstrap/less/buttons.less
================================================
//
// Buttons
// --------------------------------------------------
// Base styles
// --------------------------------------------------
// Core
.btn {
display: inline-block;
.ie7-inline-block();
padding: 4px 14px;
margin-bottom: 0; // For input.btn
font-size: @baseFontSize;
line-height: @baseLineHeight;
*line-height: @baseLineHeight;
text-align: center;
vertical-align: middle;
cursor: pointer;
.buttonBackground(@btnBackground, @btnBackgroundHighlight, @grayDark, 0 1px 1px rgba(255,255,255,.75));
border: 1px solid @btnBorder;
*border: 0; // Remove the border to prevent IE7's black border on input:focus
border-bottom-color: darken(@btnBorder, 10%);
.border-radius(4px);
.ie7-restore-left-whitespace(); // Give IE7 some love
.box-shadow(~"inset 0 1px 0 rgba(255,255,255,.2), 0 1px 2px rgba(0,0,0,.05)");
// Hover state
&:hover {
color: @grayDark;
text-decoration: none;
background-color: darken(@white, 10%);
*background-color: darken(@white, 15%); /* Buttons in IE7 don't get borders, so darken on hover */
background-position: 0 -15px;
// transition is only when going to hover, otherwise the background
// behind the gradient (there for IE<=9 fallback) gets mismatched
.transition(background-position .1s linear);
}
// Focus state for keyboard and accessibility
&:focus {
.tab-focus();
}
// Active state
&.active,
&:active {
background-color: darken(@white, 10%);
background-color: darken(@white, 15%) e("\9");
background-image: none;
outline: 0;
.box-shadow(~"inset 0 2px 4px rgba(0,0,0,.15), 0 1px 2px rgba(0,0,0,.05)");
}
// Disabled state
&.disabled,
&[disabled] {
cursor: default;
background-color: darken(@white, 10%);
background-image: none;
.opacity(65);
.box-shadow(none);
}
}
// Button Sizes
// --------------------------------------------------
// Large
.btn-large {
padding: 9px 14px;
font-size: @baseFontSize + 2px;
line-height: normal;
.border-radius(5px);
}
.btn-large [class^="icon-"] {
margin-top: 2px;
}
// Small
.btn-small {
padding: 3px 9px;
font-size: @baseFontSize - 2px;
line-height: @baseLineHeight - 2px;
}
.btn-small [class^="icon-"] {
margin-top: 0;
}
// Mini
.btn-mini {
padding: 2px 6px;
font-size: @baseFontSize - 3px;
line-height: @baseLineHeight - 4px;
}
// Block button
.btn-block {
display: block;
width: 100%;
padding-left: 0;
padding-right: 0;
.box-sizing(border-box);
}
.btn-block + .btn-block {
margin-top: 5px;
}
// Alternate buttons
// --------------------------------------------------
// Provide *some* extra contrast for those who can get it
.btn-primary.active,
.btn-warning.active,
.btn-danger.active,
.btn-success.active,
.btn-info.active,
.btn-inverse.active {
color: rgba(255,255,255,.75);
}
// Set the backgrounds
// -------------------------
.btn {
// reset here as of 2.0.3 due to Recess property order
border-color: #c5c5c5;
border-color: rgba(0,0,0,.15) rgba(0,0,0,.15) rgba(0,0,0,.25);
}
.btn-primary {
.buttonBackground(@btnPrimaryBackground, @btnPrimaryBackgroundHighlight);
}
// Warning appears are orange
.btn-warning {
.buttonBackground(@btnWarningBackground, @btnWarningBackgroundHighlight);
}
// Danger and error appear as red
.btn-danger {
.buttonBackground(@btnDangerBackground, @btnDangerBackgroundHighlight);
}
// Success appears as green
.btn-success {
.buttonBackground(@btnSuccessBackground, @btnSuccessBackgroundHighlight);
}
// Info appears as a neutral blue
.btn-info {
.buttonBackground(@btnInfoBackground, @btnInfoBackgroundHighlight);
}
// Inverse appears as dark gray
.btn-inverse {
.buttonBackground(@btnInverseBackground, @btnInverseBackgroundHighlight);
}
// Cross-browser Jank
// --------------------------------------------------
button.btn,
input[type="submit"].btn {
// Firefox 3.6 only I believe
&::-moz-focus-inner {
padding: 0;
border: 0;
}
// IE7 has some default padding on button controls
*padding-top: 3px;
*padding-bottom: 3px;
&.btn-large {
*padding-top: 7px;
*padding-bottom: 7px;
}
&.btn-small {
*padding-top: 3px;
*padding-bottom: 3px;
}
&.btn-mini {
*padding-top: 1px;
*padding-bottom: 1px;
}
}
// Link buttons
// --------------------------------------------------
// Make a button look and behave like a link
.btn-link,
.btn-link:active {
background-color: transparent;
background-image: none;
.box-shadow(none);
}
.btn-link {
border-color: transparent;
cursor: pointer;
color: @linkColor;
.border-radius(0);
}
.btn-link:hover {
color: @linkColorHover;
text-decoration: underline;
background-color: transparent;
}
================================================
FILE: servers/embed/assets/bootstrap/less/carousel.less
================================================
//
// Carousel
// --------------------------------------------------
.carousel {
position: relative;
margin-bottom: @baseLineHeight;
line-height: 1;
}
.carousel-inner {
overflow: hidden;
width: 100%;
position: relative;
}
.carousel {
.item {
display: none;
position: relative;
.transition(.6s ease-in-out left);
}
// Account for jankitude on images
.item > img {
display: block;
line-height: 1;
}
.active,
.next,
.prev { display: block; }
.active {
left: 0;
}
.next,
.prev {
position: absolute;
top: 0;
width: 100%;
}
.next {
left: 100%;
}
.prev {
left: -100%;
}
.next.left,
.prev.right {
left: 0;
}
.active.left {
left: -100%;
}
.active.right {
left: 100%;
}
}
// Left/right controls for nav
// ---------------------------
.carousel-control {
position: absolute;
top: 40%;
left: 15px;
width: 40px;
height: 40px;
margin-top: -20px;
font-size: 60px;
font-weight: 100;
line-height: 30px;
color: @white;
text-align: center;
background: @grayDarker;
border: 3px solid @white;
.border-radius(23px);
.opacity(50);
// we can't have this transition here
// because webkit cancels the carousel
// animation if you trip this while
// in the middle of another animation
// ;_;
// .transition(opacity .2s linear);
// Reposition the right one
&.right {
left: auto;
right: 15px;
}
// Hover state
&:hover {
color: @white;
text-decoration: none;
.opacity(90);
}
}
// Caption for text below images
// -----------------------------
.carousel-caption {
position: absolute;
left: 0;
right: 0;
bottom: 0;
padding: 15px;
background: @grayDark;
background: rgba(0,0,0,.75);
}
.carousel-caption h4,
.carousel-caption p {
color: @white;
line-height: @baseLineHeight;
}
.carousel-caption h4 {
margin: 0 0 5px;
}
.carousel-caption p {
margin-bottom: 0;
}
================================================
FILE: servers/embed/assets/bootstrap/less/close.less
================================================
//
// Close icons
// --------------------------------------------------
.close {
float: right;
font-size: 20px;
font-weight: bold;
line-height: @baseLineHeight;
color: @black;
text-shadow: 0 1px 0 rgba(255,255,255,1);
.opacity(20);
&:hover {
color: @black;
text-decoration: none;
cursor: pointer;
.opacity(40);
}
}
// Additional properties for button version
// iOS requires the button element instead of an anchor tag.
// If you want the anchor version, it requires `href="#"`.
button.close {
padding: 0;
cursor: pointer;
background: transparent;
border: 0;
-webkit-appearance: none;
}
================================================
FILE: servers/embed/assets/bootstrap/less/code.less
================================================
//
// Code (inline and blocK)
// --------------------------------------------------
// Inline and block code styles
code,
pre {
padding: 0 3px 2px;
#font > #family > .monospace;
font-size: @baseFontSize - 2;
color: @grayDark;
.border-radius(3px);
}
// Inline code
code {
padding: 2px 4px;
color: #d14;
background-color: #f7f7f9;
border: 1px solid #e1e1e8;
}
// Blocks of code
pre {
display: block;
padding: (@baseLineHeight - 1) / 2;
margin: 0 0 @baseLineHeight / 2;
font-size: @baseFontSize - 1; // 14px to 13px
line-height: @baseLineHeight;
word-break: break-all;
word-wrap: break-word;
white-space: pre;
white-space: pre-wrap;
background-color: #f5f5f5;
border: 1px solid #ccc; // fallback for IE7-8
border: 1px solid rgba(0,0,0,.15);
.border-radius(4px);
// Make prettyprint styles more spaced out for readability
&.prettyprint {
margin-bottom: @baseLineHeight;
}
// Account for some code outputs that place code tags in pre tags
code {
padding: 0;
color: inherit;
background-color: transparent;
border: 0;
}
}
// Enable scrollable blocks of code
.pre-scrollable {
max-height: 340px;
overflow-y: scroll;
}
================================================
FILE: servers/embed/assets/bootstrap/less/component-animations.less
================================================
//
// Component animations
// --------------------------------------------------
.fade {
opacity: 0;
.transition(opacity .15s linear);
&.in {
opacity: 1;
}
}
.collapse {
position: relative;
height: 0;
overflow: hidden;
overflow: visible \9;
.transition(height .35s ease);
&.in {
height: auto;
}
}
================================================
FILE: servers/embed/assets/bootstrap/less/dropdowns.less
================================================
//
// Dropdown menus
// --------------------------------------------------
// Use the .menu class on any <li> element within the topbar or ul.tabs and you'll get some superfancy dropdowns
.dropup,
.dropdown {
position: relative;
}
.dropdown-toggle {
// The caret makes the toggle a bit too tall in IE7
*margin-bottom: -3px;
}
.dropdown-toggle:active,
.open .dropdown-toggle {
outline: 0;
}
// Dropdown arrow/caret
// --------------------
.caret {
display: inline-block;
width: 0;
height: 0;
vertical-align: top;
border-top: 4px solid @black;
border-right: 4px solid transparent;
border-left: 4px solid transparent;
content: "";
}
// Place the caret
.dropdown .caret {
margin-top: 8px;
margin-left: 2px;
}
// The dropdown menu (ul)
// ----------------------
.dropdown-menu {
position: absolute;
top: 100%;
left: 0;
z-index: @zindexDropdown;
display: none; // none by default, but block on "open" of the menu
float: left;
min-width: 160px;
padding: 5px 0;
margin: 2px 0 0; // override default ul
list-style: none;
background-color: @dropdownBackground;
border: 1px solid #ccc; // Fallback for IE7-8
border: 1px solid @dropdownBorder;
*border-right-width: 2px;
*border-bottom-width: 2px;
.border-radius(6px);
.box-shadow(0 5px 10px rgba(0,0,0,.2));
-webkit-background-clip: padding-box;
-moz-background-clip: padding;
background-clip: padding-box;
// Aligns the dropdown menu to right
&.pull-right {
right: 0;
left: auto;
}
// Dividers (basically an hr) within the dropdown
.divider {
.nav-divider(@dropdownDividerTop, @dropdownDividerBottom);
}
// Links within the dropdown menu
a {
display: block;
padding: 3px 20px;
clear: both;
font-weight: normal;
line-height: @baseLineHeight;
color: @dropdownLinkColor;
white-space: nowrap;
}
}
// Hover state
// -----------
.dropdown-menu li > a:hover,
.dropdown-menu li > a:focus,
.dropdown-submenu:hover > a {
text-decoration: none;
color: @dropdownLinkColorHover;
background-color: @dropdownLinkBackgroundHover;
#gradient > .vertical(@dropdownLinkBackgroundHover, darken(@dropdownLinkBackgroundHover, 5%));
}
// Active state
// ------------
.dropdown-menu .active > a,
.dropdown-menu .active > a:hover {
color: @dropdownLinkColorHover;
text-decoration: none;
outline: 0;
background-color: @dropdownLinkBackgroundActive;
#gradient > .vertical(@dropdownLinkBackgroundActive, darken(@dropdownLinkBackgroundActive, 5%));
}
// Disabled state
// --------------
// Gray out text and ensure the hover state remains gray
.dropdown-menu .disabled > a,
.dropdown-menu .disabled > a:hover {
color: @grayLight;
}
// Nuke hover effects
.dropdown-menu .disabled > a:hover {
text-decoration: none;
background-color: transparent;
cursor: default;
}
// Open state for the dropdown
// ---------------------------
.open {
// IE7's z-index only goes to the nearest positioned ancestor, which would
// make the menu appear below buttons that appeared later on the page
*z-index: @zindexDropdown;
& > .dropdown-menu {
display: block;
}
}
// Right aligned dropdowns
// ---------------------------
.pull-right > .dropdown-menu {
right: 0;
left: auto;
}
// Allow for dropdowns to go bottom up (aka, dropup-menu)
// ------------------------------------------------------
// Just add .dropup after the standard .dropdown class and you're set, bro.
// TODO: abstract this so that the navbar fixed styles are not placed here?
.dropup,
.navbar-fixed-bottom .dropdown {
// Reverse the caret
.caret {
border-top: 0;
border-bottom: 4px solid @black;
content: "\2191";
}
// Different positioning for bottom up menu
.dropdown-menu {
top: auto;
bottom: 100%;
margin-bottom: 1px;
}
}
// Sub menus
// ---------------------------
.dropdown-submenu {
position: relative;
}
.dropdown-submenu > .dropdown-menu {
top: 0;
left: 100%;
margin-top: -6px;
margin-left: -1px;
-webkit-border-radius: 0 6px 6px 6px;
-moz-border-radius: 0 6px 6px 6px;
border-radius: 0 6px 6px 6px;
}
.dropdown-submenu:hover .dropdown-menu {
display: block;
}
.dropdown-submenu > a:after {
display: block;
content: " ";
float: right;
width: 0;
height: 0;
border-color: transparent;
border-style: solid;
border-width: 5px 0 5px 5px;
border-left-color: darken(@dropdownBackground, 20%);
margin-top: 5px;
margin-right: -10px;
}
.dropdown-submenu:hover > a:after {
border-left-color: @dropdownLinkColorHover;
}
// Tweak nav headers
// -----------------
// Increase padding from 15px to 20px on sides
.dropdown .dropdown-menu .nav-header {
padding-left: 20px;
padding-right: 20px;
}
// Typeahead
// ---------
.typeahead {
margin-top: 2px; // give it some space to breathe
.border-radius(4px);
}
================================================
FILE: servers/embed/assets/bootstrap/less/font-awesome.less
================================================
/* Font Awesome
the iconic font designed for use with Twitter Bootstrap
-------------------------------------------------------
The full suite of pictographic icons, examples, and documentation
can be found at: http://fortawesome.github.com/Font-Awesome/
License
-------------------------------------------------------
The Font Awesome webfont, CSS, and LESS files are licensed under CC BY 3.0:
http://creativecommons.org/licenses/by/3.0/ A mention of
'Font Awesome - http://fortawesome.github.com/Font-Awesome' in human-readable
source code is considered acceptable attribution (most common on the web).
If human readable source code is not available to the end user, a mention in
an 'About' or 'Credits' screen is considered acceptable (most common in desktop
or mobile software).
Contact
-------------------------------------------------------
Email: dave@davegandy.com
Twitter: http://twitter.com/fortaweso_me
Work: Lead Product Designer @ http://kyruus.com
*/
@font-face {
font-family: 'FontAwesome';
src: url('../../font/fontawesome-webfont.eot');
src: url('../../font/fontawesome-webfont.eot?#iefix') format('embedded-opentype'),
url('../../font/fontawesome-webfont.woff') format('woff'),
url('../../font/fontawesome-webfont.ttf') format('truetype'),
url('../../font/fontawesome-webfont.svg#FontAwesome') format('svg');
font-weight: normal;
font-style: normal;
}
/* Font Awesome styles
------------------------------------------------------- */
[class^="icon-"]:before,
[class*=" icon-"]:before {
font-family: FontAwesome;
font-weight: normal;
font-style: normal;
display: inline-block;
text-decoration: inherit;
}
a [class^="icon-"],
a [class*=" icon-"] {
display: inline-block;
text-decoration: inherit;
}
/* makes the font 33% larger relative to the icon container */
.icon-large:before {
vertical-align: middle;
font-size: 4/3em;
}
.btn, .nav-tabs {
[class^="icon-"],
[class*=" icon-"] {
/* keeps button heights with and without icons the same */
line-height: .9em;
}
}
li {
[class^="icon-"],
[class*=" icon-"] {
display: inline-block;
width: 1.25em;
text-align: center;
}
.icon-large:before,
.icon-large:before {
/* 1.5 increased font size for icon-large * 1.25 width */
width: 1.5*1.25em;
}
}
ul.icons {
list-style-type: none;
margin-left: 2em;
text-indent: -.8em;
li {
[class^="icon-"],
[class*=" icon-"] {
width: .8em;
}
.icon-large:before,
.icon-large:before {
/* 1.5 increased font size for icon-large * 1.25 width */
vertical-align: initial;
// width: 1.5*1.25em;
}
}
}
/* Font Awesome uses the Unicode Private Use Area (PUA) to ensure screen
readers do not read off random characters that represent icons */
.icon-glass:before { content: "\f000"; }
.icon-music:before { content: "\f001"; }
.icon-search:before { content: "\f002"; }
.icon-envelope:before { content: "\f003"; }
.icon-heart:before { content: "\f004"; }
.icon-star:before { content: "\f005"; }
.icon-star-empty:before { content: "\f006"; }
.icon-user:before { content: "\f007"; }
.icon-film:before { content: "\f008"; }
.icon-th-large:before { content: "\f009"; }
.icon-th:before { content: "\f00a"; }
.icon-th-list:before { content: "\f00b"; }
.icon-ok:before { content: "\f00c"; }
.icon-remove:before { content: "\f00d"; }
.icon-zoom-in:before { content: "\f00e"; }
.icon-zoom-out:before { content: "\f010"; }
.icon-off:before { content: "\f011"; }
.icon-signal:before { content: "\f012"; }
.icon-cog:before { content: "\f013"; }
.icon-trash:before { content: "\f014"; }
.icon-home:before { content: "\f015"; }
.icon-file:before { content: "\f016"; }
.icon-time:before { content: "\f017"; }
.icon-road:before { content: "\f018"; }
.icon-download-alt:before { content: "\f019"; }
.icon-download:before { content: "\f01a"; }
.icon-upload:before { content: "\f01b"; }
.icon-inbox:before { content: "\f01c"; }
.icon-play-circle:before { content: "\f01d"; }
.icon-repeat:before { content: "\f01e"; }
/* \f020 is not a valid unicode character. all shifted one down */
.icon-refresh:before { content: "\f021"; }
.icon-list-alt:before { content: "\f022"; }
.icon-lock:before { content: "\f023"; }
.icon-flag:before { content: "\f024"; }
.icon-headphones:before { content: "\f025"; }
.icon-volume-off:before { content: "\f026"; }
.icon-volume-down:before { content: "\f027"; }
.icon-volume-up:before { content: "\f028"; }
.icon-qrcode:before { content: "\f029"; }
.icon-barcode:before { content: "\f02a"; }
.icon-tag:before { content: "\f02b"; }
.icon-tags:before { content: "\f02c"; }
.icon-book:before { content: "\f02d"; }
.icon-bookmark:before { content: "\f02e"; }
.icon-print:before { content: "\f02f"; }
.icon-camera:before { content: "\f030"; }
.icon-font:before { content: "\f031"; }
.icon-bold:before { content: "\f032"; }
.icon-italic:before { content: "\f033"; }
.icon-text-height:before { content: "\f034"; }
.icon-text-width:before { content: "\f035"; }
.icon-align-left:before { content: "\f036"; }
.icon-align-center:before { content: "\f037"; }
.icon-align-right:before { content: "\f038"; }
.icon-align-justify:before { content: "\f039"; }
.icon-list:before { content: "\f03a"; }
.icon-indent-left:before { content: "\f03b"; }
.icon-indent-right:before { content: "\f03c"; }
.icon-facetime-video:before { content: "\f03d"; }
.icon-picture:before { content: "\f03e"; }
.icon-pencil:before { content: "\f040"; }
.icon-map-marker:before { content: "\f041"; }
.icon-adjust:before { content: "\f042"; }
.icon-tint:before { content: "\f043"; }
.icon-edit:before { content: "\f044"; }
.icon-share:before { content: "\f045"; }
.icon-check:before { content: "\f046"; }
.icon-move:before { content: "\f047"; }
.icon-step-backward:before { content: "\f048"; }
.icon-fast-backward:before { content: "\f049"; }
.icon-backward:before { content: "\f04a"; }
.icon-play:before { content: "\f04b"; }
.icon-pause:before { content: "\f04c"; }
.icon-stop:before { content: "\f04d"; }
.icon-forward:before { content: "\f04e"; }
.icon-fast-forward:before { content: "\f050"; }
.icon-step-forward:before { content: "\f051"; }
.icon-eject:before { content: "\f052"; }
.icon-chevron-left:before { content: "\f053"; }
.icon-chevron-right:before { content: "\f054"; }
.icon-plus-sign:before { content: "\f055"; }
.icon-minus-sign:before { content: "\f056"; }
.icon-remove-sign:before { content: "\f057"; }
.icon-ok-sign:before { content: "\f058"; }
.icon-question-sign:before { content: "\f059"; }
.icon-info-sign:before { content: "\f05a"; }
.icon-screenshot:before { content: "\f05b"; }
.icon-remove-circle:before { content: "\f05c"; }
.icon-ok-circle:before { content: "\f05d"; }
.icon-ban-circle:before { content: "\f05e"; }
.icon-arrow-left:before { content: "\f060"; }
.icon-arrow-right:before { content: "\f061"; }
.icon-arrow-up:before { content: "\f062"; }
.icon-arrow-down:before { content: "\f063"; }
.icon-share-alt:before { content: "\f064"; }
.icon-resize-full:before { content: "\f065"; }
.icon-resize-small:before { content: "\f066"; }
.icon-plus:before { content: "\f067"; }
.icon-minus:before { content: "\f068"; }
.icon-asterisk:before { content: "\f069"; }
.icon-exclamation-sign:before { content: "\f06a"; }
.icon-gift:before { content: "\f06b"; }
.icon-leaf:before { content: "\f06c"; }
.icon-fire:before { content: "\f06d"; }
.icon-eye-open:before { content: "\f06e"; }
.icon-eye-close:before { content: "\f070"; }
.icon-warning-sign:before { content: "\f071"; }
.icon-plane:before { content: "\f072"; }
.icon-calendar:before { content: "\f073"; }
.icon-random:before { content: "\f074"; }
.icon-comment:before { content: "\f075"; }
.icon-magnet:before { content: "\f076"; }
.icon-chevron-up:before { content: "\f077"; }
.icon-chevron-down:before { content: "\f078"; }
.icon-retweet:before { content: "\f079"; }
.icon-shopping-cart:before { content: "\f07a"; }
.icon-folder-close:before { content: "\f07b"; }
.icon-folder-open:before { content: "\f07c"; }
.icon-resize-vertical:before { content: "\f07d"; }
.icon-resize-horizontal:before { content: "\f07e"; }
.icon-bar-chart:before { content: "\f080"; }
.icon-twitter-sign:before { content: "\f081"; }
.icon-facebook-sign:before { content: "\f082"; }
.icon-camera-retro:before { content: "\f083"; }
.icon-key:before { content: "\f084"; }
.icon-cogs:before { content: "\f085"; }
.icon-comments:before { content: "\f086"; }
.icon-thumbs-up:before { content: "\f087"; }
.icon-thumbs-down:before { content: "\f088"; }
.icon-star-half:before { content: "\f089"; }
.icon-heart-empty:before { content: "\f08a"; }
.icon-signout:before { content: "\f08b"; }
.icon-linkedin-sign:before { content: "\f08c"; }
.icon-pushpin:before { content: "\f08d"; }
.icon-external-link:before { content: "\f08e"; }
.icon-signin:before { content: "\f090"; }
.icon-trophy:before { content: "\f091"; }
.icon-github-sign:before { content: "\f092"; }
.icon-upload-alt:before { content: "\f093"; }
.icon-lemon:before { content: "\f094"; }
.icon-phone:before { content: "\f095"; }
.icon-check-empty:before { content: "\f096"; }
.icon-bookmark-empty:before { content: "\f097"; }
.icon-phone-sign:before { content: "\f098"; }
.icon-twitter:before { content: "\f099"; }
.icon-facebook:before { content: "\f09a"; }
.icon-github:before { content: "\f09b"; }
.icon-unlock:before { content: "\f09c"; }
.icon-credit-card:before { content: "\f09d"; }
.icon-rss:before { content: "\f09e"; }
.icon-hdd:before { content: "\f0a0"; }
.icon-bullhorn:before { content: "\f0a1"; }
.icon-bell:before { content: "\f0a2"; }
.icon-certificate:before { content: "\f0a3"; }
.icon-hand-right:before { content: "\f0a4"; }
.icon-hand-left:before { content: "\f0a5"; }
.icon-hand-up:before { content: "\f0a6"; }
.icon-hand-down:before { content: "\f0a7"; }
.icon-circle-arrow-left:before { content: "\f0a8"; }
.icon-circle-arrow-right:before { content: "\f0a9"; }
.icon-circle-arrow-up:before { content: "\f0aa"; }
.icon-circle-arrow-down:before { content: "\f0ab"; }
.icon-globe:before { content: "\f0ac"; }
.icon-wrench:before { content: "\f0ad"; }
.icon-tasks:before { content: "\f0ae"; }
.icon-filter:before { content: "\f0b0"; }
.icon-briefcase:before { content: "\f0b1"; }
.icon-fullscreen:before { content: "\f0b2"; }
.icon-group:before { content: "\f0c0"; }
.icon-link:before { content: "\f0c1"; }
.icon-cloud:before { content: "\f0c2"; }
.icon-beaker:before { content: "\f0c3"; }
.icon-cut:before { content: "\f0c4"; }
.icon-copy:before { content: "\f0c5"; }
.icon-paper-clip:before { content: "\f0c6"; }
.icon-save:before { content: "\f0c7"; }
.icon-sign-blank:before { content: "\f0c8"; }
.icon-reorder:before { content: "\f0c9"; }
.icon-list-ul:before { content: "\f0ca"; }
.icon-list-ol:before { content: "\f0cb"; }
.icon-strikethrough:before { content: "\f0cc"; }
.icon-underline:before { content: "\f0cd"; }
.icon-table:before { content: "\f0ce"; }
.icon-table:before { content: "\f0ce"; }
.icon-magic:before { content: "\f0d0"; }
.icon-truck:before { content: "\f0d1"; }
.icon-pinterest:before { content: "\f0d2"; }
.icon-pinterest-sign:before { content: "\f0d3"; }
.icon-google-plus-sign:before { content: "\f0d4"; }
.icon-google-plus:before { content: "\f0d5"; }
.icon-money:before { content: "\f0d6"; }
.icon-caret-down:before { content: "\f0d7"; }
.icon-caret-up:before { content: "\f0d8"; }
.icon-caret-left:before { content: "\f0d9"; }
.icon-caret-right:before { content: "\f0da"; }
.icon-columns:before { content: "\f0db"; }
.icon-sort:before { content: "\f0dc"; }
.icon-sort-down:before { content: "\f0dd"; }
.icon-sort-up:before { content: "\f0de"; }
.icon-envelope-alt:before { content: "\f0e0"; }
.icon-linkedin:before { content: "\f0e1"; }
.icon-undo:before { content: "\f0e2"; }
.icon-legal:before { content: "\f0e3"; }
.icon-dashboard:before { content: "\f0e4"; }
.icon-comment-alt:before { content: "\f0e5"; }
.icon-comments-alt:before { content: "\f0e6"; }
.icon-bolt:before { content: "\f0e7"; }
.icon-sitemap:before { content: "\f0e8"; }
.icon-umbrella:before { content: "\f0e9"; }
.icon-paste:before { content: "\f0ea"; }
.icon-user-md:before { content: "\f200"; }
.icon-apple-logo:before { content: "\f500"; }
.icon-windows-8:before { content: "\f501"; }
.icon-js-fiddle:before { content: "\f502"; }
.icon-skype:before { content: "\f503"; }
.icon-youtube-sign:before { content: "\f504"; }
.icon-youtube:before { content: "\f505"; }
.icon-vimeo-sign:before { content: "\f506"; }
.icon-vimeo:before { content: "\f507"; }
.icon-lastfm-sign:before { content: "\f508"; }
.icon-lastfm:before { content: "\f509"; }
.icon-rss-sign:before { content: "\f50a"; }
.icon-reddit:before { content: "\f50b"; }
.icon-delicious-sign:before { content: "\f50c"; }
.icon-wordpress-sign:before { content: "\f50d"; }
.icon-wordpress:before { content: "\f50e"; }
.icon-git-fork:before { content: "\f50f"; }
.icon-blogger-sign:before { content: "\f510"; }
.icon-blogger:before { content: "\f511"; }
.icon-tumblr-sign:before { content: "\f512"; }
.icon-tumblr:before { content: "\f513"; }
.icon-flickr-sign:before { content: "\f514"; }
.icon-flickr:before { content: "\f515"; }
.icon-picasa-sign:before { content: "\f516"; }
.icon-picasa:before { content: "\f517"; }
.icon-amazon-sign:before { content: "\f518"; }
.icon-amazon:before { content: "\f519"; }
.icon-yelp-sign:before { content: "\f51a"; }
.icon-yelp:before { content: "\f51b"; }
.icon-soundcloud:before { content: "\f51c"; }
.icon-spotify:before { content: "\f51d"; }
.icon-yahoo-sign:before { content: "\f520"; }
.icon-yahoo:before { content: "\f521"; }
.icon-evernote-sign:before { content: "\f522"; }
.icon-evernote:before { content: "\f523"; }
.icon-google-sign:before { content: "\f524"; }
.icon-google:before { content: "\f525"; }
.icon-hacker-news:before { content: "\f526"; }
.icon-map:before { content: "\f529"; }
.icon-bus-sign:before { content: "\f52a"; }
.icon-bike-sign:before { content: "\f52b"; }
.icon-car-sign:before { content: "\f52c"; }
.icon-taxi-sign:before { content: "\f52d"; }
.icon-truck-sign:before { content: "\f52e"; }
.icon-handicap-sign:before { content: "\f52f"; }
================================================
FILE: servers/embed/assets/bootstrap/less/forms.less
================================================
//
// Forms
// --------------------------------------------------
// GENERAL STYLES
// --------------
// Make all forms have space below them
form {
margin: 0 0 @baseLineHeight;
}
fieldset {
padding: 0;
margin: 0;
border: 0;
}
// Groups of fields with labels on top (legends)
legend {
display: block;
width: 100%;
padding: 0;
margin-bottom: @baseLineHeight;
font-size: @baseFontSize * 1.5;
line-height: @baseLineHeight * 2;
color: @grayDark;
border: 0;
border-bottom: 1px solid #e5e5e5;
// Small
small {
font-size: @baseLineHeight * .75;
color: @grayLight;
}
}
// Set font for forms
label,
input,
button,
select,
textarea {
#font > .shorthand(@baseFontSize,normal,@baseLineHeight); // Set size, weight, line-height here
}
input,
button,
select,
textarea {
font-family: @baseFontFamily; // And only set font-family here for those that need it (note the missing label element)
}
// Identify controls by their labels
label {
display: block;
margin-bottom: 5px;
}
// Form controls
// -------------------------
// Shared size and type resets
select,
textarea,
input[type="text"],
input[type="password"],
input[type="datetime"],
input[type="datetime-local"],
input[type="date"],
input[type="month"],
input[type="time"],
input[type="week"],
input[type="number"],
input[type="email"],
input[type="url"],
input[type="search"],
input[type="tel"],
input[type="color"],
.uneditable-input {
display: inline-block;
height: @baseLineHeight;
padding: 4px 6px;
margin-bottom: 9px;
font-size: @baseFontSize;
line-height: @baseLineHeight;
color: @gray;
.border-radius(@inputBorderRadius);
}
// Reset appearance properties for textual inputs and textarea
// Declare width for legacy (can't be on input[type=*] selectors or it's too specific)
input,
textarea {
width: 210px;
}
// Reset height since textareas have rows
textarea {
height: auto;
}
// Everything else
textarea,
input[type="text"],
input[type="password"],
input[type="datetime"],
input[type="datetime-local"],
input[type="date"],
input[type="month"],
input[type="time"],
input[type="week"],
input[type="number"],
input[type="email"],
input[type="url"],
input[type="search"],
input[type="tel"],
input[type="color"],
.uneditable-input {
background-color: @inputBackground;
border: 1px solid @inputBorder;
.box-shadow(inset 0 1px 1px rgba(0,0,0,.075));
.transition(~"border linear .2s, box-shadow linear .2s");
// Focus state
&:focus {
border-color: rgba(82,168,236,.8);
outline: 0;
outline: thin dotted \9; /* IE6-9 */
.box-shadow(~"inset 0 1px 1px rgba(0,0,0,.075), 0 0 8px rgba(82,168,236,.6)");
}
}
// Position radios and checkboxes better
input[type="radio"],
input[type="checkbox"] {
margin: 4px 0 0;
*margin-top: 0; /* IE7 */
margin-top: 1px \9; /* IE8-9 */
line-height: normal;
cursor: pointer;
}
// Reset width of input images, buttons, radios, checkboxes
input[type="file"],
input[type="image"],
input[type="submit"],
input[type="reset"],
input[type="button"],
input[type="radio"],
input[type="checkbox"] {
width: auto; // Override of generic input selector
}
// Set the height of select and file controls to match text inputs
select,
input[type="file"] {
height: 30px; /* In IE7, the height of the select element cannot be changed by height, only font-size */
*margin-top: 4px; /* For IE7, add top margin to align select with labels */
line-height: 30px;
}
// Make select elements obey height by applying a border
select {
width: 220px; // default input width + 10px of padding that doesn't get applied
border: 1px solid #bbb;
background-color: @inputBackground; // Chrome on Linux and Mobile Safari need background-color
}
// Make multiple select elements height not fixed
select[multiple],
select[size] {
height: auto;
}
// Focus for select, file, radio, and checkbox
select:focus,
input[type="file"]:focus,
input[type="radio"]:focus,
input[type="checkbox"]:focus {
.tab-focus();
}
// Uneditable inputs
// -------------------------
// Make uneditable inputs look inactive
.uneditable-input,
.uneditable-textarea {
color: @grayLight;
background-color: darken(@inputBackground, 1%);
border-color: @inputBorder;
.box-shadow(inset 0 1px 2px rgba(0,0,0,.025));
cursor: not-allowed;
}
// For text that needs to appear as an input but should not be an input
.uneditable-input {
overflow: hidden; // prevent text from wrapping, but still cut it off like an input does
white-space: nowrap;
}
// Make uneditable textareas behave like a textarea
.uneditable-textarea {
width: auto;
height: auto;
}
// Placeholder
// -------------------------
// Placeholder text gets special styles; can't be bundled together though for some reason
input,
textarea {
.placeholder();
}
// CHECKBOXES & RADIOS
// -------------------
// Indent the labels to position radios/checkboxes as hanging
.radio,
.checkbox {
min-height: 18px; // clear the floating input if there is no label text
padding-left: 18px;
}
.radio input[type="radio"],
.checkbox input[type="checkbox"] {
float: left;
margin-left: -18px;
}
// Move the options list down to align with labels
.controls > .radio:first-child,
.controls > .checkbox:first-child {
padding-top: 5px; // has to be padding because margin collaspes
}
// Radios and checkboxes on same line
// TODO v3: Convert .inline to .control-inline
.radio.inline,
.checkbox.inline {
display: inline-block;
padding-top: 5px;
margin-bottom: 0;
vertical-align: middle;
}
.radio.inline + .radio.inline,
.checkbox.inline + .checkbox.inline {
margin-left: 10px; // space out consecutive inline controls
}
// INPUT SIZES
// -----------
// General classes for quick sizes
.input-mini { width: 60px; }
.input-small { width: 90px; }
.input-medium { width: 150px; }
.input-large { width: 210px; }
.input-xlarge { width: 270px; }
.input-xxlarge { width: 530px; }
// Grid style input sizes
input[class*="span"],
select[class*="span"],
textarea[class*="span"],
.uneditable-input[class*="span"],
// Redeclare since the fluid row class is more specific
.row-fluid input[class*="span"],
.row-fluid select[class*="span"],
.row-fluid textarea[class*="span"],
.row-fluid .uneditable-input[class*="span"] {
float: none;
margin-left: 0;
}
// Ensure input-prepend/append never wraps
.input-append input[class*="span"],
.input-append .uneditable-input[class*="span"],
.input-prepend input[class*="span"],
.input-prepend .uneditable-input[class*="span"],
.row-fluid input[class*="span"],
.row-fluid select[class*="span"],
.row-fluid textarea[class*="span"],
.row-fluid .uneditable-input[class*="span"],
.row-fluid .input-prepend [class*="span"],
.row-fluid .input-append [class*="span"] {
display: inline-block;
}
// GRID SIZING FOR INPUTS
// ----------------------
// Grid sizes
#grid > .input(@gridColumnWidth, @gridGutterWidth);
// Control row for multiple inputs per line
.controls-row {
.clearfix(); // Clear the float from controls
}
.controls-row [class*="span"] {
float: left; // Float to collapse white-space for proper grid alignment
}
// DISABLED STATE
// --------------
// Disabled and read-only inputs
input[disabled],
select[disabled],
textarea[disabled],
input[readonly],
select[readonly],
textarea[readonly] {
cursor: not-allowed;
background-color: @inputDisabledBackground;
}
// Explicitly reset the colors here
input[type="radio"][disabled],
input[type="checkbox"][disabled],
input[type="radio"][readonly],
input[type="checkbox"][readonly] {
background-color: transparent;
}
// FORM FIELD FEEDBACK STATES
// --------------------------
// Warning
.control-group.warning {
.formFieldState(@warningText, @warningText, @warningBackground);
}
// Error
.control-group.error {
.formFieldState(@errorText, @errorText, @errorBackground);
}
// Success
.control-group.success {
.formFieldState(@successText, @successText, @successBackground);
}
// HTML5 invalid states
// Shares styles with the .control-group.error above
input:focus:required:invalid,
textarea:focus:required:invalid,
select:focus:required:invalid {
color: #b94a48;
border-color: #ee5f5b;
&:focus {
border-color: darken(#ee5f5b, 10%);
.box-shadow(0 0 6px lighten(#ee5f5b, 20%));
}
}
// FORM ACTIONS
// ------------
.form-actions {
padding: (@baseLineHeight - 1) 20px @baseLineHeight;
margin-top: @baseLineHeight;
margin-bottom: @baseLineHeight;
background-color: @formActionsBackground;
border-top: 1px solid #e5e5e5;
.clearfix(); // Adding clearfix to allow for .pull-right button containers
}
// HELP TEXT
// ---------
.help-block,
.help-inline {
color: lighten(@textColor, 15%); // lighten the text some for contrast
}
.help-block {
display: block; // account for any element using help-block
margin-bottom: @baseLineHeight / 2;
}
.help-inline {
display: inline-block;
.ie7-inline-block();
vertical-align: middle;
padding-left: 5px;
}
// INPUT GROUPS
// ------------
// Allow us to put symbols and text within the input field for a cleaner look
.input-append,
.input-prepend {
margin-bottom: 5px;
font-size: 0;
white-space: nowrap; // Prevent span and input from separating
input,
select,
.uneditable-input {
position: relative; // placed here by default so that on :focus we can place the input above the .add-on for full border and box-shadow goodness
margin-bottom: 0; // prevent bottom margin from screwing up alignment in stacked forms
*margin-left: 0;
font-size: @baseFontSize;
vertical-align: top;
.border-radius(0 @inputBorderRadius @inputBorderRadius 0);
// Make input on top when focused so blue border and shadow always show
&:focus {
z-index: 2;
}
}
.add-on {
display: inline-block;
width: auto;
height: @baseLineHeight;
min-width: 16px;
padding: 4px 5px;
font-size: @baseFontSize;
font-weight: normal;
line-height: @baseLineHeight;
text-align: center;
text-shadow: 0 1px 0 @white;
background-color: @grayLighter;
border: 1px solid #ccc;
}
.add-on,
.btn {
margin-left: -1px;
vertical-align: top;
.border-radius(0);
}
.active {
background-color: lighten(@green, 30);
border-color: @green;
}
}
.input-prepend {
.add-on,
.btn {
margin-right: -1px;
}
.add-on:first-child,
.btn:first-child {
.border-radius(@inputBorderRadius 0 0 @inputBorderRadius);
}
}
.input-append {
input,
select,
.uneditable-input {
.border-radius(@inputBorderRadius 0 0 @inputBorderRadius);
}
.add-on:last-child,
.btn:last-child {
.border-radius(0 @inputBorderRadius @inputBorderRadius 0);
}
}
// Remove all border-radius for inputs with both prepend and append
.input-prepend.input-append {
input,
select,
.uneditable-input {
.border-radius(0);
}
.add-on:first-child,
.btn:first-child {
margin-right: -1px;
.border-radius(@inputBorderRadius 0 0 @inputBorderRadius);
}
.add-on:last-child,
.btn:last-child {
margin-left: -1px;
.border-radius(0 @inputBorderRadius @inputBorderRadius 0);
}
}
// SEARCH FORM
// -----------
input.search-query {
padding-right: 14px;
padding-right: 4px \9;
padding-left: 14px;
padding-left: 4px \9; /* IE7-8 doesn't have border-radius, so don't indent the padding */
margin-bottom: 0; // Remove the default margin on all inputs
.border-radius(15px);
}
/* Allow for input prepend/append in search forms */
.form-search .input-append .search-query,
.form-search .input-prepend .search-query {
.border-radius(0); // Override due to specificity
}
.form-search .input-append .search-query {
.border-radius(14px 0 0 14px)
}
.form-search .input-append .btn {
.border-radius(0 14px 14px 0)
}
.form-search .input-prepend .search-query {
.border-radius(0 14px 14px 0)
}
.form-search .input-prepend .btn {
.border-radius(14px 0 0 14px)
}
// HORIZONTAL & VERTICAL FORMS
// ---------------------------
// Common properties
// -----------------
.form-search,
.form-inline,
.form-horizontal {
input,
textarea,
select,
.help-inline,
.uneditable-input,
.input-prepend,
.input-append {
display: inline-block;
.ie7-inline-block();
margin-bottom: 0;
vertical-align: middle;
}
// Re-hide hidden elements due to specifity
.hide {
display: none;
}
}
.form-search label,
.form-inline label,
.form-search .btn-group,
.form-inline .btn-group {
display: inline-block;
}
// Remove margin for input-prepend/-append
.form-search .input-append,
.form-inline .input-append,
.form-search .input-prepend,
.form-inline .input-prepend {
margin-bottom: 0;
}
// Inline checkbox/radio labels (remove padding on left)
.form-search .radio,
.form-search .checkbox,
.form-inline .radio,
.form-inline .checkbox {
padding-left: 0;
margin-bottom: 0;
vertical-align: middle;
}
// Remove float and margin, set to inline-block
.form-search .radio input[type="radio"],
.form-search .checkbox input[type="checkbox"],
.form-inline .radio input[type="radio"],
.form-inline .checkbox input[type="checkbox"] {
float: left;
margin-right: 3px;
margin-left: 0;
}
// Margin to space out fieldsets
.control-group {
margin-bottom: @baseLineHeight / 2;
}
// Legend collapses margin, so next element is responsible for spacing
legend + .control-group {
margin-top: @baseLineHeight;
-webkit-margin-top-collapse: separate;
}
// Horizontal-specific styles
// --------------------------
.form-horizontal {
// Increase spacing between groups
.control-group {
margin-bottom: @baseLineHeight;
.clearfix();
}
// Float the labels left
.control-label {
float: left;
width: 140px;
padding-top: 5px;
text-align: right;
}
// Move over all input controls and content
.controls {
// Super jank IE7 fix to ensure the inputs in .input-append and input-prepend
// don't inherit the margin of the parent, in this case .controls
*display: inline-block;
*padding-left: 20px;
margin-left: 160px;
*margin-left: 0;
&:first-child {
*padding-left: 160px;
}
}
// Remove bottom margin on block level help text since that's accounted for on .control-group
.help-block {
margin-top: @baseLineHeight / 2;
margin-bottom: 0;
}
// Move over buttons in .form-actions to align with .controls
.form-actions {
padding-left: 160px;
}
}
================================================
FILE: servers/embed/assets/bootstrap/less/grid.less
================================================
//
// Grid system
// --------------------------------------------------
// Fixed (940px)
#grid > .core(@gridColumnWidth, @gridGutterWidth);
// Fluid (940px)
#grid > .fluid(@fluidGridColumnWidth, @fluidGridGutterWidth);
// Reset utility classes due to specificity
[class*="span"].hide,
.row-fluid [class*="span"].hide {
display: none;
}
[class*="span"].pull-right,
.row-fluid [class*="span"].pull-right {
float: right;
}
================================================
FILE: servers/embed/assets/bootstrap/less/hero-unit.less
================================================
//
// Hero unit
// --------------------------------------------------
.hero-unit {
padding: 60px;
margin-bottom: 30px;
background-color: @heroUnitBackground;
.border-radius(6px);
h1 {
margin-bottom: 0;
font-size: 60px;
line-height: 1;
color: @heroUnitHeadingColor;
letter-spacing: -1px;
}
p {
font-size: 18px;
font-weight: 200;
line-height: @baseLineHeight * 1.5;
color: @heroUnitLeadColor;
}
}
================================================
FILE: servers/embed/assets/bootstrap/less/labels-badges.less
================================================
//
// Labels and badges
// --------------------------------------------------
// Base classes
.label,
.badge {
font-size: @baseFontSize * .846;
font-weight: bold;
line-height: 14px; // ensure proper line-height if floated
color: @white;
vertical-align: baseline;
white-space: nowrap;
text-shadow: 0 -1px 0 rgba(0,0,0,.25);
background-color: @grayLight;
}
// Set unique padding and border-radii
.label {
padding: 1px 4px 2px;
.border-radius(3px);
}
.badge {
padding: 1px 9px 2px;
.border-radius(9px);
}
// Hover state, but only for links
a {
&.label:hover,
&.badge:hover {
color: @white;
text-decoration: none;
cursor: pointer;
}
}
// Colors
// Only give background-color difference to links (and to simplify, we don't qualifty with `a` but [href] attribute)
.label,
.badge {
// Important (red)
&-important { background-color: @errorText; }
&-important[href] { background-color: darken(@errorText, 10%); }
// Warnings (orange)
&-warning { background-color: @orange; }
&-warning[href] { background-color: darken(@orange, 10%); }
// Success (green)
&-success { background-color: @successText; }
&-success[href] { background-color: darken(@successText, 10%); }
// Info (turquoise)
&-info { background-color: @infoText; }
&-info[href] { background-color: darken(@infoText, 10%); }
// Inverse (black)
&-inverse { background-color: @grayDark; }
&-inverse[href] { background-color: darken(@grayDark, 10%); }
}
// Quick fix for labels/badges in buttons
.btn {
.label,
.badge {
position: relative;
top: -1px;
}
}
.btn-mini {
.label,
.badge {
top: 0;
}
}
================================================
FILE: servers/embed/assets/bootstrap/less/layouts.less
================================================
//
// Layouts
// --------------------------------------------------
// Container (centered, fixed-width layouts)
.container {
.container-fixed();
}
// Fluid layouts (left aligned, with sidebar, min- & max-width content)
.container-fluid {
padding-right: @gridGutterWidth;
padding-left: @gridGutterWidth;
.clearfix();
}
================================================
FILE: servers/embed/assets/bootstrap/less/mixins.less
================================================
//
// Mixins
// --------------------------------------------------
// UTILITY MIXINS
// --------------------------------------------------
// Clearfix
// --------
// For clearing floats like a boss h5bp.com/q
.clearfix {
*zoom: 1;
&:before,
&:after {
display: table;
content: "";
// Fixes Opera/contenteditable bug:
// http://nicolasgallagher.com/micro-clearfix-hack/#comment-36952
line-height: 0;
}
&:after {
clear: both;
}
}
// Webkit-style focus
// ------------------
.tab-focus() {
// Default
outline: thin dotted #333;
// Webkit
outline: 5px auto -webkit-focus-ring-color;
outline-offset: -2px;
}
// Center-align a block level element
// ----------------------------------
.center-block() {
display: block;
margin-left: auto;
margin-right: auto;
}
// IE7 inline-block
// ----------------
.ie7-inline-block() {
*display: inline; /* IE7 inline-block hack */
*zoom: 1;
}
// IE7 likes to collapse whitespace on either side of the inline-block elements.
// Ems because we're attempting to match the width of a space character. Left
// version is for form buttons, which typically come after other elements, and
// right version is for icons, which come before. Applying both is ok, but it will
// mean that space between those elements will be .6em (~2 space characters) in IE7,
// instead of the 1 space in other browsers.
.ie7-restore-left-whitespace() {
*margin-left: .3em;
&:first-child {
*margin-left: 0;
}
}
.ie7-restore-right-whitespace() {
*margin-right: .3em;
}
// Sizing shortcuts
// -------------------------
.size(@height, @width) {
width: @width;
height: @height;
}
.square(@size) {
.size(@size, @size);
}
// Placeholder text
// -------------------------
.placeholder(@color: @placeholderText) {
&:-moz-placeholder {
color: @color;
}
&:-ms-input-placeholder {
color: @color;
}
&::-webkit-input-placeholder {
color: @color;
}
}
// Text overflow
// -------------------------
// Requires inline-block or block for proper styling
.text-overflow() {
overflow: hidden;
text-overflow: ellipsis;
white-space: nowrap;
}
// CSS image replacement
// -------------------------
// Source: https://github.com/h5bp/html5-boilerplate/commit/aa0396eae757
.hide-text {
font: 0/0 a;
color: transparent;
text-shadow: none;
background-color: transparent;
border: 0;
}
// FONTS
// --------------------------------------------------
#font {
#family {
.serif() {
font-family: @serifFontFamily;
}
.sans-serif() {
font-family: @sansFontFamily;
}
.monospace() {
font-family: @monoFontFamily;
}
}
.shorthand(@size: @baseFontSize, @weight: normal, @lineHeight: @baseLineHeight) {
font-size: @size;
font-weight: @weight;
line-height: @lineHeight;
}
.serif(@size: @baseFontSize, @weight: normal, @lineHeight: @baseLineHeight) {
#font > #family > .serif;
#font > .shorthand(@size, @weight, @lineHeight);
}
.sans-serif(@size: @baseFontSize, @weight: normal, @lineHeight: @baseLineHeight) {
#font > #family > .sans-serif;
#font > .shorthand(@size, @weight, @lineHeight);
}
.monospace(@size: @baseFontSize, @weight: normal, @lineHeight: @baseLineHeight) {
#font > #family > .monospace;
#font > .shorthand(@size, @weight, @lineHeight);
}
}
// FORMS
// --------------------------------------------------
// Block level inputs
.input-block-level {
display: block;
width: 100%;
min-height: 30px; // Make inputs at least the height of their button counterpart
.box-sizing(border-box); // Makes inputs behave like true block-level elements
}
// Mixin for form field states
.formFieldState(@textColor: #555, @borderColor: #ccc, @backgroundColor: #f5f5f5) {
// Set the text color
> label,
.help-block,
.help-inline {
color: @textColor;
}
// Style inputs accordingly
.checkbox,
.radio,
input,
select,
textarea {
color: @textColor;
border-color: @borderColor;
.box-shadow(inset 0 1px 1px rgba(0,0,0,.075)); // Redeclare so transitions work
&:focus {
border-color: darken(@borderColor, 10%);
// Write out in full since the lighten() function isn't easily escaped
-webkit-box-shadow: inset 0 1px 1px rgba(0,0,0,.075), 0 0 6px lighten(@borderColor, 20%);
-moz-box-shadow: inset 0 1px 1px rgba(0,0,0,.075), 0 0 6px lighten(@borderColor, 20%);
box-shadow: inset 0 1px 1px rgba(0,0,0,.075), 0 0 6px lighten(@borderColor, 20%);
}
}
// Give a small background color for input-prepend/-append
.input-prepend .add-on,
.input-append .add-on {
color: @textColor;
background-color: @backgroundColor;
border-color: @textColor;
}
}
// CSS3 PROPERTIES
// --------------------------------------------------
// Border Radius
.border-radius(@radius) {
-webkit-border-radius: @radius;
-moz-border-radius: @radius;
border-radius: @radius;
}
// Single Corner Border Radius
.border-top-left-radius(@radius) {
-webkit-border-top-left-radius: @radius;
-moz-border-radius-topleft: @radius;
border-top-left-radius: @radius;
}
.border-top-right-radius(@radius) {
-webkit-border-top-right-radius: @radius;
-moz-border-radius-topright: @radius;
border-top-right-radius: @radius;
}
.border-bottom-right-radius(@radius) {
-webkit-border-bottom-right-radius: @radius;
-moz-border-radius-bottomright: @radius;
border-bottom-right-radius: @radius;
}
.border-bottom-left-radius(@radius) {
-webkit-border-bottom-left-radius: @radius;
-moz-border-radius-bottomleft: @radius;
border-bottom-left-radius: @radius;
}
// Single Side Border Radius
.border-top-radius(@radius) {
.border-top-right-radius(@radius);
.border-top-left-radius(@radius);
}
.border-right-radius(@radius) {
.border-top-right-radius(@radius);
.border-bottom-right-radius(@radius);
}
.border-bottom-radius(@radius) {
.border-bottom-right-radius(@radius);
.border-bottom-left-radius(@radius);
}
.border-left-radius(@radius) {
.border-top-left-radius(@radius);
.border-bottom-left-radius(@radius);
}
// Drop shadows
.box-shadow(@shadow) {
-webkit-box-shadow: @shadow;
-moz-box-shadow: @shadow;
box-shadow: @shadow;
}
// Transitions
.transition(@transition) {
-webkit-transition: @transition;
-moz-transition: @transition;
-o-transition: @transition;
transition: @transition;
}
// Transformations
.rotate(@degrees) {
-webkit-transform: rotate(@degrees);
-moz-transform: rotate(@degrees);
-ms-transform: rotate(@degrees);
-o-transform: rotate(@degrees);
transform: rotate(@degrees);
}
.scale(@ratio) {
-webkit-transform: scale(@ratio);
-moz-transform: scale(@ratio);
-ms-transform: scale(@ratio);
-o-transform: scale(@ratio);
transform: scale(@ratio);
}
.translate(@x, @y) {
-webkit-transform: translate(@x, @y);
-moz-transform: translate(@x, @y);
-ms-transform: translate(@x, @y);
-o-transform: translate(@x, @y);
transform: translate(@x, @y);
}
.skew(@x, @y) {
-webkit-transform: skew(@x, @y);
-moz-transform: skew(@x, @y);
-ms-transform: skew(@x, @y);
-o-transform: skew(@x, @y);
transform: skew(@x, @y);
}
.translate3d(@x, @y, @z) {
-webkit-transform: translate3d(@x, @y, @z);
-moz-transform: translate3d(@x, @y, @z);
-o-transform: translate3d(@x, @y, @z);
transform: translate3d(@x, @y, @z);
}
// Backface visibility
// Prevent browsers from flickering when using CSS 3D transforms.
// Default value is `visible`, but can be changed to `hidden
// See git pull https://github.com/dannykeane/bootstrap.git backface-visibility for examples
.backface-visibility(@visibility){
-webkit-backface-visibility: @visibility;
-moz-backface-visibility: @visibility;
backface-visibility: @visibility;
}
// Background clipping
// Heads up: FF 3.6 and under need "padding" instead of "padding-box"
.background-clip(@clip) {
-webkit-background-clip: @clip;
-moz-background-clip: @clip;
background-clip: @clip;
}
// Background sizing
.background-size(@size){
-webkit-background-size: @size;
-moz-background-size: @size;
-o-background-size: @size;
background-size: @size;
}
// Box sizing
.box-sizing(@boxmodel) {
-webkit-box-sizing: @boxmodel;
-moz-box-sizing: @boxmodel;
box-sizing: @boxmodel;
}
// User select
// For selecting text on the page
.user-select(@select) {
-webkit-user-select: @select;
-moz-user-select: @select;
-ms-user-select: @select;
-o-user-select: @select;
user-select: @select;
}
// Resize anything
.resizable(@direction) {
resize: @direction; // Options: horizontal, vertical, both
overflow: auto; // Safari fix
}
// CSS3 Content Columns
.content-columns(@columnCount, @columnGap: @gridGutterWidth) {
-webkit-column-count: @columnCount;
-moz-column-count: @columnCount;
column-count: @columnCount;
-webkit-column-gap: @columnGap;
-moz-column-gap: @columnGap;
column-gap: @columnGap;
}
// Optional hyphenation
.hyphens(@mode: auto) {
word-wrap: break-word;
-webkit-hyphens: @mode;
-moz-hyphens: @mode;
-ms-hyphens: @mode;
-o-hyphens: @mode;
hyphens: @mode;
}
// Opacity
.opacity(@opacity) {
opacity: @opacity / 100;
filter: ~"alpha(opacity=@{opacity})";
}
// BACKGROUNDS
// --------------------------------------------------
// Add an alphatransparency value to any background or border color (via Elyse Holladay)
#translucent {
.background(@color: @white, @alpha: 1) {
background-color: hsla(hue(@color), saturation(@color), lightness(@color), @alpha);
}
.border(@color: @white, @alpha: 1) {
border-color: hsla(hue(@color), saturation(@color), lightness(@color), @alpha);
.background-clip(padding-box);
}
}
// Gradient Bar Colors for buttons and alerts
.gradientBar(@primaryColor, @secondaryColor, @textColor: #fff, @textShadow: 0 -1px 0 rgba(0,0,0,.25)) {
color: @textColor;
text-shadow: @textShadow;
#gradient > .vertical(@primaryColor, @secondaryColor);
border-color: @secondaryColor @secondaryColor darken(@secondaryColor, 15%);
border-color: rgba(0,0,0,.1) rgba(0,0,0,.1) fadein(rgba(0,0,0,.1), 15%);
}
// Gradients
#gradient {
.horizontal(@startColor: #555, @endColor: #333) {
background-color: @endColor;
background-image: -moz-linear-gradient(left, @startColor, @endColor); // FF 3.6+
background-image: -webkit-gradient(linear, 0 0, 100% 0, from(@startColor), to(@endColor)); // Safari 4+, Chrome 2+
background-image: -webkit-linear-gradient(left, @startColor, @endColor); // Safari 5.1+, Chrome 10+
background-image: -o-linear-gradient(left, @startColor, @endColor); // Opera 11.10
background-image: linear-gradient(to right, @startColor, @endColor); // Standard, IE10
background-repeat: repeat-x;
filter: e(%("progid:DXImageTransform.Microsoft.gradient(startColorstr='%d', endColorstr='%d', GradientType=1)",argb(@startColor),argb(@endColor))); // IE9 and down
}
.vertical(@startColor: #555, @endColor: #333) {
background-color: mix(@startColor, @endColor, 60%);
background-image: -moz-linear-gradient(top, @startColor, @endColor); // FF 3.6+
background-image: -webkit-gradient(linear, 0 0, 0 100%, from(@startColor), to(@endColor)); // Safari 4+, Chrome 2+
background-image: -webkit-linear-gradient(top, @startColor, @endColor); // Safari 5.1+, Chrome 10+
background-image: -o-linear-gradient(top, @startColor, @endColor); // Opera 11.10
background-image: linear-gradient(to bottom, @startColor, @endColor); // Standard, IE10
background-repeat: repeat-x;
filter: e(%("progid:DXImageTransform.Microsoft.gradient(startColorstr='%d', endColorstr='%d', GradientType=0)",argb(@startColor),argb(@endColor))); // IE9 and down
}
.directional(@startColor: #555, @endColor: #333, @deg: 45deg) {
background-color: @endColor;
background-repeat: repeat-x;
background-image: -moz-linear-gradient(@deg, @startColor, @endColor); // FF 3.6+
background-image: -webkit-linear-gradient(@deg, @startColor, @endColor); // Safari 5.1+, Chrome 10+
background-image: -o-linear-gradient(@deg, @startColor, @endColor); // Opera 11.10
background-image: linear-gradient(@deg, @startColor, @endColor); // Standard, IE10
}
.vertical-three-colors(@startColor: #00b3ee, @midColor: #7a43b6, @colorStop: 50%, @endColor: #c3325f) {
background-color: mix(@midColor, @endColor, 80%);
background-image: -webkit-gradient(linear, 0 0, 0 100%, from(@startColor), color-stop(@colorStop, @midColor), to(@endColor));
background-image: -webkit-linear-gradient(@startColor, @midColor @colorStop, @endColor);
background-image: -moz-linear-gradient(top, @startColor, @midColor @colorStop*100%, @endColor);
background-image: -o-linear-gradient(@startColor, @midColor @colorStop, @endColor);
background-image: linear-gradient(@startColor, @midColor @colorStop, @endColor);
background-repeat: no-repeat;
filter: e(%("progid:DXImageTransform.Microsoft.gradient(startColorstr='%d', endColorstr='%d', GradientType=0)",argb(@startColor),argb(@endColor))); // IE9 and down, gets no color-stop at all for proper fallback
}
.radial(@innerColor: #555, @outerColor: #333) {
background-color: @outerColor;
background-image: -webkit-gradient(radial, center center, 0, center center, 460, from(@innerColor), to(@outerColor));
background-image: -webkit-radial-gradient(circle, @innerColor, @outerColor);
background-image: -moz-radial-gradient(circle, @innerColor, @outerColor);
background-image: -o-radial-gradient(circle, @innerColor, @outerColor);
background-repeat: no-repeat;
}
.striped(@color, @angle: 45deg) {
background-color: @color;
background-image: -webkit-gradient(linear, 0 100%, 100% 0, color-stop(.25, rgba(255,255,255,.15)), color-stop(.25, transparent), color-stop(.5, transparent), color-stop(.5, rgba(255,255,255,.15)), color-stop(.75, rgba(255,255,255,.15)), color-stop(.75, transparent), to(transparent));
background-image: -webkit-linear-gradient(@angle, rgba(255,255,255,.15) 25%, transparent 25%, transparent 50%, rgba(255,255,255,.15) 50%, rgba(255,255,255,.15) 75%, transparent 75%, transparent);
background-image: -moz-linear-gradient(@angle, rgba(255,255,255,.15) 25%, transparent 25%, transparent 50%, rgba(255,255,255,.15) 50%, rgba(255,255,255,.15) 75%, transparent 75%, transparent);
background-image: -o-linear-gradient(@angle, rgba(255,255,255,.15) 25%, transparent 25%, transparent 50%, rgba(255,255,255,.15) 50%, rgba(255,255,255,.15) 75%, transparent 75%, transparent);
background-image: linear-gradient(@angle, rgba(255,255,255,.15) 25%, transparent 25%, transparent 50%, rgba(255,255,255,.15) 50%, rgba(255,255,255,.15) 75%, transparent 75%, transparent);
}
}
// Reset filters for IE
.reset-filter() {
filter: e(%("progid:DXImageTransform.Microsoft.gradient(enabled = false)"));
}
// COMPONENT MIXINS
// --------------------------------------------------
// Horizontal dividers
// -------------------------
// Dividers (basically an hr) within dropdowns and nav lists
.nav-divider(@top: #e5e5e5, @bottom: @white) {
// IE7 needs a set width since we gave a height. Restricting just
// to IE7 to keep the 1px left/right space in other browsers.
// It is unclear where IE is getting the extra space that we need
// to negative-margin away, but so it goes.
*width: 100%;
height: 1px;
margin: ((@baseLineHeight / 2) - 1) 1px; // 8px 1px
*margin: -5px 0 5px;
overflow: hidden;
background-color: @top;
border-bottom: 1px solid @bottom;
}
// Button backgrounds
// ------------------
.buttonBackground(@startColor, @endColor, @textColor: #fff, @textShadow: 0 -1px 0 rgba(0,0,0,.25)) {
// gradientBar will set the background to a pleasing blend of these, to support IE<=9
.gradientBar(@startColor, @endColor, @textColor, @textShadow);
*background-color: @endColor; /* Darken IE7 buttons by default so they stand out more given they won't have borders */
.reset-filter();
// in these cases the gradient won't cover the background, so we override
&:hover, &:active, &.active, &.disabled, &[disabled] {
color: @textColor;
background-color: @endColor;
*background-color: darken(@endColor, 5%);
}
// IE 7 + 8 can't handle box-shadow to show active, so we darken a bit ourselves
&:active,
&.active {
background-color: darken(@endColor, 10%) e("\9");
}
}
// Navbar vertical align
// -------------------------
// Vertically center elements in the navbar.
// Example: an element has a height of 30px, so write out `.navbarVerticalAlign(30px);` to calculate the appropriate top margin.
.navbarVerticalAlign(@elementHeight) {
margin-top: (@navbarHeight - @elementHeight) / 2;
}
// Grid System
// -----------
// Centered container element
.container-fixed() {
margin-right: auto;
margin-left: auto;
.clearfix();
}
// Table columns
.tableColumns(@columnSpan: 1) {
float: none; // undo default grid column styles
width: ((@gridColumnWidth) * @columnSpan) + (@gridGutterWidth * (@columnSpan - 1)) - 16; // 16 is total padding on left and right of table cells
margin-left: 0; // undo default grid column styles
}
// Make a Grid
// Use .makeRow and .makeColumn to assign semantic layouts grid system behavior
.makeRow() {
margin-left: @gridGutterWidth * -1;
.clearfix();
}
.makeColumn(@columns: 1, @offset: 0) {
float: left;
margin-left: (@gridColumnWidth * @offset) + (@gridGutterWidth * (@offset - 1)) + (@gridGutterWidth * 2);
width: (@gridColumnWidth * @columns) + (@gridGutterWidth * (@columns - 1));
}
// The Grid
#grid {
.core (@gridColumnWidth, @gridGutterWidth) {
.spanX (@index) when (@index > 0) {
(~".span@{index}") { .span(@index); }
.spanX(@index - 1);
}
.spanX (0) {}
.offsetX (@index) when (@index > 0) {
(~".offset@{index}") { .offset(@index); }
.offsetX(@index - 1);
}
.offsetX (0) {}
.offset (@columns) {
margin-left: (@gridColumnWidth * @columns) + (@gridGutterWidth * (@columns + 1));
}
.span (@columns) {
width: (@gridColumnWidth * @columns) + (@gridGutterWidth * (@columns - 1));
}
.row {
margin-left: @gridGutterWidth * -1;
.clearfix();
}
[class*="span"] {
float: left;
margin-left: @gridGutterWidth;
}
// Set the container width, and override it for fixed navbars in media queries
.container,
.navbar-static-top .container,
.navbar-fixed-top .container,
.navbar-fixed-bottom .container { .span(@gridColumns); }
// generate .spanX and .offsetX
.spanX (@gridColumns);
.offsetX (@gridColumns);
}
.fluid (@fluidGridColumnWidth, @fluidGridGutterWidth) {
.spanX (@index) when (@index > 0) {
(~".span@{index}") { .span(@index); }
.spanX(@index - 1);
}
.spanX (0) {}
.offsetX (@index) when (@index > 0) {
(~'.offset@{index}') { .offset(@index); }
(~'.offset@{index}:first-child') { .offsetFirstChild(@index); }
.offsetX(@index - 1);
}
.offsetX (0) {}
.offset (@columns) {
margin-left: (@fluidGridColumnWidth * @columns) + (@fluidGridGutterWidth * (@columns - 1)) + (@fluidGridGutterWidth*2);
*margin-left: (@fluidGridColumnWidth * @columns) + (@fluidGridGutterWidth * (@columns - 1)) - (.5 / @gridRowWidth * 100 * 1%) + (@fluidGridGutterWidth*2) - (.5 / @gridRowWidth * 100 * 1%);
}
.offsetFirstChild (@columns) {
margin-left: (@fluidGridColumnWidth * @columns) + (@fluidGridGutterWidth * (@columns - 1)) + (@fluidGridGutterWidth);
*margin-left: (@fluidGridColumnWidth * @columns) + (@fluidGridGutterWidth * (@columns - 1)) - (.5 / @gridRowWidth * 100 * 1%) + @fluidGridGutterWidth - (.5 / @gridRowWidth * 100 * 1%);
}
.span (@columns) {
width: (@fluidGridColumnWidth * @columns) + (@fluidGridGutterWidth * (@columns - 1));
*width: (@fluidGridColumnWidth * @columns) + (@fluidGridGutterWidth * (@columns - 1)) - (.5 / @gridRowWidth * 100 * 1%);
}
.row-fluid {
width: 100%;
.clearfix();
[class*="span"] {
.input-block-level();
float: left;
margin-left: @fluidGridGutterWidth;
*margin-left: @fluidGridGutterWidth - (.5 / @gridRowWidth * 100 * 1%);
}
[class*="span"]:first-child {
margin-left: 0;
}
// generate .spanX and .offsetX
.spanX (@gridColumns);
.offsetX (@gridColumns);
}
}
.input(@gridColumnWidth, @gridGutterWidth) {
.spanX (@index) when (@index > 0) {
(~"input.span@{index}, textarea.span@{index}, .uneditable-input.span@{index}") { .span(@index); }
.spanX(@index - 1);
}
.spanX (0) {}
.span(@columns) {
width: ((@gridColumnWidth) * @columns) + (@gridGutterWidth * (@columns - 1)) - 14;
}
input,
textarea,
.uneditable-input {
margin-left: 0; // override margin-left from core grid system
}
// Space grid-sized controls properly if multiple per line
.controls-row [class*="span"] + [class*="span"] {
margin-left: @gridGutterWidth;
}
// generate .spanX
.spanX (@gridColumns);
}
}
================================================
FILE: servers/embed/assets/bootstrap/less/modals.less
================================================
//
// Modals
// --------------------------------------------------
// Recalculate z-index where appropriate
.modal-open {
.dropdown-menu { z-index: @zindexDropdown + @zindexModal; }
.dropdown.open { *z-index: @zindexDropdown + @zindexModal; }
.popover { z-index: @zindexPopover + @zindexModal; }
.tooltip { z-index: @zindexTooltip + @zindexModal; }
}
// Background
.modal-backdrop {
position: fixed;
top: 0;
right: 0;
bottom: 0;
left: 0;
z-index: @zindexModalBackdrop;
background-color: @black;
// Fade for backdrop
&.fade { opacity: 0; }
}
.modal-backdrop,
.modal-backdrop.fade.in {
.opacity(80);
}
// Base modal
.modal {
position: fixed;
top: 50%;
left: 50%;
z-index: @zindexModal;
overflow: auto;
width: 560px;
margin: -250px 0 0 -280px;
background-color: @white;
border: 1px solid #999;
border: 1px solid rgba(0,0,0,.3);
*border: 1px solid #999; /* IE6-7 */
.border-radius(6px);
.box-shadow(0 3px 7px rgba(0,0,0,0.3));
.background-clip(padding-box);
&.fade {
.transition(e('opacity .3s linear, top .3s ease-out'));
top: -25%;
}
&.fade.in { top: 50%; }
}
.modal-header {
padding: 9px 15px;
border-bottom: 1px solid #eee;
// Close icon
.close { margin-top: 2px; }
// Heading
h3 {
margin: 0;
line-height: 30px;
}
}
// Body (where all modal content resides)
.modal-body {
overflow-y: auto;
max-height: 400px;
padding: 15px;
}
// Remove bottom margin if need be
.modal-form {
margin-bottom: 0;
}
// Footer (for actions)
.modal-footer {
padding: 14px 15px 15px;
margin-bottom: 0;
text-align: right; // right align buttons
background-color: #f5f5f5;
border-top: 1px solid #ddd;
.border-radius(0 0 6px 6px);
.box-shadow(inset 0 1px 0 @white);
.clearfix(); // clear it in case folks use .pull-* classes on buttons
// Properly space out buttons
.btn + .btn {
margin-left: 5px;
margin-bottom: 0; // account for input[type="submit"] which gets the bottom margin like all other inputs
}
// but override that for button groups
.btn-group .btn + .btn {
margin-left: -1px;
}
}
================================================
FILE: servers/embed/assets/bootstrap/less/navbar.less
================================================
//
// Navbars (Redux)
// --------------------------------------------------
// COMMON STYLES
// -------------
// Base class and wrapper
.navbar {
overflow: visible;
margin-bottom: @baseLineHeight;
color: @navbarText;
// Fix for IE7's bad z-indexing so dropdowns don't appear below content that follows the navbar
*position: relative;
*z-index: 2;
}
// Inner for background effects
// Gradient is applied to its own element because overflow visible is not honored by IE when filter is present
.navbar-inner {
min-height: @navbarHeight;
padding-left: 20px;
padding-right: 20px;
#gradient > .vertical(@navbarBackgroundHighlight, @navbarBackground);
border: 1px solid @navbarBorder;
.border-radius(4px);
.box-shadow(0 1px 4px rgba(0,0,0,.065));
}
// Set width to auto for default container
// We then reset it for fixed navbars in the #gridSystem mixin
.navbar .container {
width: auto;
}
// Override the default collapsed state
.nav-collapse.collapse {
height: auto;
}
// Brand: website or project name
// -------------------------
.navbar .brand {
float: left;
display: block;
// Vertically center the text given @navbarHeight
padding: ((@navbarHeight - @baseLineHeight) / 2) 20px ((@navbarHeight - @baseLineHeight) / 2);
margin-left: -20px; // negative indent to left-align the text down the page
font-size: 20px;
font-weight: 200;
color: @navbarBrandColor;
text-shadow: 0 1px 0 @navbarBackgroundHighlight;
&:hover {
text-decoration: none;
}
}
// Plain text in topbar
// -------------------------
.navbar-text {
margin-bottom: 0;
line-height: @navbarHeight;
}
// Janky solution for now to account for links outside the .nav
// -------------------------
.navbar-link {
color: @navbarLinkColor;
&:hover {
color: @navbarLinkColorHover;
}
}
// Dividers in navbar
// -------------------------
.navbar .divider-vertical {
height: @navbarHeight;
margin: 0 9px;
border-left: 1px solid @navbarBackground;
border-right: 1px solid @navbarBackgroundHighlight;
}
// Buttons in navbar
// -------------------------
.navbar .btn,
.navbar .btn-group {
.navbarVerticalAlign(28px); // Vertically center in navbar
}
.navbar .btn-group .btn {
margin: 0; // then undo the margin here so we don't accidentally double it
}
// Navbar forms
.navbar-form {
margin-bottom: 0; // remove default bottom margin
.clearfix();
input,
select,
.radio,
.checkbox {
.navbarVerticalAlign(30px); // Vertically center in navbar
}
input,
select,
.btn {
display: inline-block;
margin-bottom: 0;
}
input[type="image"],
input[type="checkbox"],
input[type="radio"] {
margin-top: 3px;
}
.input-append,
.input-prepend {
margin-top: 6px;
white-space: nowrap; // preven two items from separating within a .navbar-form that has .pull-left
input {
margin-top: 0; // remove the margin on top since it's on the parent
}
}
}
// Navbar search
.navbar-search {
position: relative;
float: left;
.navbarVerticalAlign(30px); // Vertically center in navbar
margin-bottom: 0;
.search-query {
margin-bottom: 0;
padding: 4px 14px;
#font > .sans-serif(13px, normal, 1);
.border-radius(15px); // redeclare because of specificity of the type attribute
}
}
// Static navbar
// -------------------------
.navbar-static-top {
position: static;
width: 100%;
margin-bottom: 0; // remove 18px margin for default navbar
.navbar-inner {
.border-radius(0);
}
}
// Fixed navbar
// -------------------------
// Shared (top/bottom) styles
.navbar-fixed-top,
.navbar-fixed-bottom {
position: fixed;
right: 0;
left: 0;
z-index: @zindexFixedNavbar;
margin-bottom: 0; // remove 18px margin for default navbar
}
.navbar-fixed-top,
.navbar-fixed-bottom,
.navbar-static-top {
.navbar-inner {
border: 0;
}
}
.navbar-fixed-top .navbar-inner,
.navbar-fixed-bottom .navbar-inner {
padding-left: 0;
padding-right: 0;
.border-radius(0);
}
// Reset container width
// Required here as we reset the width earlier on and the grid mixins don't override early enough
.navbar-static-top .container,
.navbar-fixed-top .container,
.navbar-fixed-bottom .container {
#grid > .core > .span(@gridColumns);
}
// Fixed to top
.navbar-fixed-top {
top: 0;
}
.navbar-fixed-top,
.navbar-static-top {
.navbar-inner {
.box-shadow(~"inset 0 -1px 0 rgba(0,0,0,.1), 0 1px 10px rgba(0,0,0,.1)");
}
}
// Fixed to bottom
.navbar-fixed-bottom {
bottom: 0;
.navbar-inner {
.box-shadow(~"inset 0 1px 0 rgba(0,0,0,.1), 0 -1px 10px rgba(0,0,0,.1)");
}
}
// NAVIGATION
// ----------
.navbar .nav {
position: relative;
left: 0;
display: block;
float: left;
margin: 0 10px 0 0;
}
.navbar .nav.pull-right {
float: right; // redeclare due to specificity
}
.navbar .nav > li {
float: left;
}
// Links
.navbar .nav > li > a {
float: none;
// Vertically center the text given @navbarHeight
padding: ((@navbarHeight - @baseLineHeight) / 2) 15px ((@navbarHeight - @baseLineHeight) / 2);
color: @navbarLinkColor;
text-decoration: none;
text-shadow: 0 1px 0 @navbarBackgroundHighlight;
}
.navbar .nav .dropdown-toggle .caret {
margin-top: 8px;
}
// Hover
.navbar .nav > li > a:focus,
.navbar .nav > li > a:hover {
background-color: @navbarLinkBackgroundHover; // "transparent" is default to differentiate :hover from .active
color: @navbarLinkColorHover;
text-decoration: none;
}
// Active nav items
.navbar .nav > .active > a,
.navbar .nav > .active > a:hover,
.navbar .nav > .active > a:focus {
color: @navbarLinkColorActive;
text-decoration: none;
background-color: @navbarLinkBackgroundActive;
-webkit-box-shadow: inset 0 3px 8px rgba(0,0,0,.125);
-moz-box-shadow: inset 0 3px 8px rgba(0,0,0,.125);
box-shadow: inset 0 3px 8px rgba(0,0,0,.125);
}
// Navbar button for toggling navbar items in responsive layouts
// These definitions need to come after '.navbar .btn'
.navbar .btn-navbar {
display: none;
float: right;
padding: 7px 10px;
margin-left: 5px;
margin-right: 5px;
.buttonBackground(darken(@navbarBackgroundHighlight, 5%), darken(@navbarBackground, 5%));
.box-shadow(~"inset 0 1px 0 rgba(255,255,255,.1), 0 1px 0 rgba(255,255,255,.075)");
}
.navbar .btn-navbar .icon-bar {
display: block;
width: 18px;
height: 2px;
background-color: #f5f5f5;
.border-radius(1px);
.box-shadow(0 1px 0 rgba(0,0,0,.25));
}
.btn-navbar .icon-bar + .icon-bar {
margin-top: 3px;
}
// Dropdown menus
// --------------
// Menu position and menu carets
.navbar .nav > li > .dropdown-menu {
&:before {
content: '';
display: inline-block;
border-left: 7px solid transparent;
border-right: 7px solid transparent;
border-bottom: 7px solid #ccc;
border-bottom-color: @dropdownBorder;
position: absolute;
top: -7px;
left: 9px;
}
&:after {
content: '';
display: inline-block;
border-left: 6px solid transparent;
border-right: 6px solid transparent;
border-bottom: 6px solid @dropdownBackground;
position: absolute;
top: -6px;
left: 10px;
}
}
// Menu position and menu caret support for dropups via extra dropup class
.navbar-fixed-bottom .nav > li > .dropdown-menu {
&:before {
border-top: 7px solid #ccc;
border-top-color: @dropdownBorder;
border-bottom: 0;
bottom: -7px;
top: auto;
}
&:after {
border-top: 6px solid @dropdownBackground;
border-bottom: 0;
bottom: -6px;
top: auto;
}
}
// Remove background color from open dropdown
.navbar .nav li.dropdown.open > .dropdown-toggle,
.navbar .nav li.dropdown.active > .dropdown-toggle,
.navbar .nav li.dropdown.open.active > .dropdown-toggle {
background-color: @navbarLinkBackgroundActive;
color: @navbarLinkColorActive;
}
.navbar .nav li.dropdown > .dropdown-toggle .caret {
border-top-color: @navbarLinkColor;
border-bottom-color: @navbarLinkColor;
}
.navbar .nav li.dropdown.open > .dropdown-toggle .caret,
.navbar .nav li.dropdown.active > .dropdown-toggle .caret,
.navbar .nav li.dropdown.open.active > .dropdown-toggle .caret {
border-top-color: @navbarLinkColorActive;
border-bottom-color: @navbarLinkColorActive;
}
// Right aligned menus need alt position
.navbar .pull-right > li > .dropdown-menu,
.navbar .nav > li > .dropdown-menu.pull-right {
left: auto;
right: 0;
&:before {
left: auto;
right: 12px;
}
&:after {
left: auto;
right: 13px;
}
.dropdown-menu {
left: auto;
right: 100%;
margin-left: 0;
margin-right: -1px;
.border-radius(6px 0 6px 6px);
}
}
// Inverted navbar
// -------------------------
.navbar-inverse {
color: @navbarInverseText;
.navbar-inner {
#gradient > .vertical(@navbarInverseBackgroundHighlight, @navbarInverseBackground);
border-color: @navbarInverseBorder;
}
.brand,
.nav > li > a {
color: @navbarInverseLinkColor;
text-shadow: 0 -1px 0 rgba(0,0,0,.25);
&:hover {
color: @navbarInverseLinkColorHover;
}
}
.nav > li > a:focus,
.nav > li > a:hover {
background-color: @navbarInverseLinkBackgroundHover;
color: @navbarInverseLinkColorHover;
}
.nav .active > a,
.nav .active > a:hover,
.nav .active > a:focus {
color: @navbarInverseLinkColorActive;
background-color: @navbarInverseLinkBackgroundActive;
}
// Inline text links
.navbar-link {
color: @navbarInverseLinkColor;
&:hover {
color: @navbarInverseLinkColorHover;
}
}
// Dividers in navbar
.divider-vertical {
border-left-color: @navbarInverseBackground;
border-right-color: @navbarInverseBackgroundHighlight;
}
// Dropdowns
.nav li.dropdown.open > .dropdown-toggle,
.nav li.dropdown.active > .dropdown-toggle,
.nav li.dropdown.open.active > .dropdown-toggle {
background-color: @navbarInverseLinkBackgroundActive;
color: @navbarInverseLinkColorActive;
}
.nav li.dropdown > .dropdown-toggle .caret {
border-top-color: @navbarInverseLinkColor;
border-bottom-color: @navbarInverseLinkColor;
}
.nav li.dropdown.open > .dropdown-toggle .caret,
.nav li.dropdown.active > .dropdown-toggle .caret,
.nav li.dropdown.open.active > .dropdown-toggle .caret {
border-top-color: @navbarInverseLinkColorActive;
border-bottom-color: @navbarInverseLinkColorActive;
}
// Navbar search
.navbar-search {
.search-query {
color: @white;
background-color: @navbarInverseSearchBackground;
border-color: @navbarInverseSearchBorder;
.box-shadow(~"inset 0 1px 2px rgba(0,0,0,.1), 0 1px 0 rgba(255,255,255,.15)");
.transition(none);
.placeholder(@navbarInverseSearchPlaceholderColor);
// Focus states (we use .focused since IE7-8 and down doesn't support :focus)
&:focus,
&.focused {
padding: 5px 15px;
color: @grayDark;
text-shadow: 0 1px 0 @white;
background-color: @navbarInverseSearchBackgroundFocus;
border: 0;
.box-shadow(0 0 3px rgba(0,0,0,.15));
outline: 0;
}
}
}
// Navbar collapse button
.btn-navbar {
.buttonBackground(darken(@navbarInverseBackgroundHighlight, 5%), darken(@navbarInverseBackground, 5%));
}
}
================================================
FILE: servers/embed/assets/bootstrap/less/navs.less
================================================
//
// Navs
// --------------------------------------------------
// BASE CLASS
// ----------
.
gitextract_2z_jhlig/
├── .gitignore
├── .gitmodules
├── LICENSE
├── README.md
├── config.sample.json
├── package.json
├── server.js
└── servers/
├── api/
│ ├── .gitignore
│ ├── .npmignore
│ ├── errors.coffee
│ ├── index.coffee
│ ├── lib/
│ │ └── database.coffee
│ ├── middleware/
│ │ ├── cache.coffee
│ │ ├── cors.coffee
│ │ ├── json.coffee
│ │ ├── session.coffee
│ │ └── user.coffee
│ ├── package.json
│ ├── schema/
│ │ ├── packages/
│ │ │ ├── create.json
│ │ │ └── update.json
│ │ └── plunks/
│ │ ├── create.json
│ │ └── update.json
│ └── server.js
├── embed/
│ ├── .gitignore
│ ├── assets/
│ │ ├── bootstrap/
│ │ │ ├── js/
│ │ │ │ ├── bootstrap-affix.js
│ │ │ │ ├── bootstrap-alert.js
│ │ │ │ ├── bootstrap-all.js
│ │ │ │ ├── bootstrap-button.js
│ │ │ │ ├── bootstrap-carousel.js
│ │ │ │ ├── bootstrap-collapse.js
│ │ │ │ ├── bootstrap-dropdown.js
│ │ │ │ ├── bootstrap-modal.js
│ │ │ │ ├── bootstrap-popover.js
│ │ │ │ ├── bootstrap-scrollspy.js
│ │ │ │ ├── bootstrap-tab.js
│ │ │ │ ├── bootstrap-tooltip.js
│ │ │ │ ├── bootstrap-transition.js
│ │ │ │ └── bootstrap-typeahead.js
│ │ │ └── less/
│ │ │ ├── accordion.less
│ │ │ ├── alerts.less
│ │ │ ├── bootstrap.less
│ │ │ ├── breadcrumbs.less
│ │ │ ├── button-groups.less
│ │ │ ├── buttons.less
│ │ │ ├── carousel.less
│ │ │ ├── close.less
│ │ │ ├── code.less
│ │ │ ├── component-animations.less
│ │ │ ├── dropdowns.less
│ │ │ ├── font-awesome.less
│ │ │ ├── forms.less
│ │ │ ├── grid.less
│ │ │ ├── hero-unit.less
│ │ │ ├── labels-badges.less
│ │ │ ├── layouts.less
│ │ │ ├── mixins.less
│ │ │ ├── modals.less
│ │ │ ├── navbar.less
│ │ │ ├── navs.less
│ │ │ ├── pager.less
│ │ │ ├── pagination.less
│ │ │ ├── popovers.less
│ │ │ ├── progress-bars.less
│ │ │ ├── reset.less
│ │ │ ├── responsive-1200px-min.less
│ │ │ ├── responsive-767px-max.less
│ │ │ ├── responsive-768px-979px.less
│ │ │ ├── responsive-navbar.less
│ │ │ ├── responsive-utilities.less
│ │ │ ├── responsive.less
│ │ │ ├── scaffolding.less
│ │ │ ├── sprites.less
│ │ │ ├── tables.less
│ │ │ ├── thumbnails.less
│ │ │ ├── tooltip.less
│ │ │ ├── type.less
│ │ │ ├── utilities.less
│ │ │ ├── variables.less
│ │ │ └── wells.less
│ │ ├── css/
│ │ │ ├── components/
│ │ │ │ └── navbar.less
│ │ │ ├── pages/
│ │ │ │ └── embed.less
│ │ │ └── vendor/
│ │ │ └── prettify.less
│ │ └── js/
│ │ ├── pages/
│ │ │ └── embed.coffee
│ │ ├── services/
│ │ │ ├── importer.coffee
│ │ │ ├── plunks.coffee
│ │ │ └── url.coffee
│ │ └── vendor/
│ │ ├── angular-sanitize.js
│ │ ├── angular-ui.js
│ │ ├── angular.js
│ │ ├── jquery.cookie.js
│ │ ├── jquery.js
│ │ ├── overthrow.js
│ │ ├── prettify.js
│ │ └── showdown.js
│ ├── index.coffee
│ ├── middleware/
│ │ └── expose.coffee
│ ├── package.json
│ ├── server.js
│ └── views/
│ └── embed.jade
├── raw/
│ ├── .gitignore
│ ├── index.coffee
│ ├── package.json
│ ├── server.js
│ └── views/
│ └── directory.jade
├── run/
│ ├── .gitignore
│ ├── index.coffee
│ ├── middleware/
│ │ ├── cors.coffee
│ │ └── json.coffee
│ ├── package.json
│ ├── schema/
│ │ └── previews/
│ │ └── create.json
│ ├── server.js
│ └── views/
│ └── directory.jade
└── www/
├── .gitignore
├── assets/
│ ├── bootstrap/
│ │ ├── js/
│ │ │ ├── bootstrap-affix.js
│ │ │ ├── bootstrap-alert.js
│ │ │ ├── bootstrap-all.js
│ │ │ ├── bootstrap-button.js
│ │ │ ├── bootstrap-carousel.js
│ │ │ ├── bootstrap-collapse.js
│ │ │ ├── bootstrap-dropdown.js
│ │ │ ├── bootstrap-modal.js
│ │ │ ├── bootstrap-popover.js
│ │ │ ├── bootstrap-scrollspy.js
│ │ │ ├── bootstrap-tab.js
│ │ │ ├── bootstrap-tooltip.js
│ │ │ ├── bootstrap-transition.js
│ │ │ └── bootstrap-typeahead.js
│ │ └── less/
│ │ ├── accordion.less
│ │ ├── alerts.less
│ │ ├── bootstrap.less
│ │ ├── breadcrumbs.less
│ │ ├── button-groups.less
│ │ ├── buttons.less
│ │ ├── carousel.less
│ │ ├── close.less
│ │ ├── code.less
│ │ ├── component-animations.less
│ │ ├── dropdowns.less
│ │ ├── font-awesome.less
│ │ ├── forms.less
│ │ ├── grid.less
│ │ ├── hero-unit.less
│ │ ├── labels-badges.less
│ │ ├── layouts.less
│ │ ├── mixins.less
│ │ ├── modals.less
│ │ ├── navbar.less
│ │ ├── navs.less
│ │ ├── pager.less
│ │ ├── pagination.less
│ │ ├── popovers.less
│ │ ├── progress-bars.less
│ │ ├── reset.less
│ │ ├── responsive-1200px-min.less
│ │ ├── responsive-767px-max.less
│ │ ├── responsive-768px-979px.less
│ │ ├── responsive-navbar.less
│ │ ├── responsive-utilities.less
│ │ ├── responsive.less
│ │ ├── scaffolding.less
│ │ ├── sprites.less
│ │ ├── tables.less
│ │ ├── thumbnails.less
│ │ ├── tooltip.less
│ │ ├── type.less
│ │ ├── utilities.less
│ │ ├── variables.less
│ │ └── wells.less
│ ├── css/
│ │ ├── common/
│ │ │ └── style.less
│ │ ├── components/
│ │ │ ├── discussion.less
│ │ │ ├── gallery.less
│ │ │ ├── importer.less
│ │ │ ├── multipanel.less
│ │ │ ├── navbar.less
│ │ │ ├── previewer.less
│ │ │ ├── share.less
│ │ │ ├── sidebar.less
│ │ │ ├── statusbar.less
│ │ │ ├── streamer.less
│ │ │ ├── tags.less
│ │ │ ├── toolbar.less
│ │ │ └── userpanel.less
│ │ ├── pages/
│ │ │ ├── editor.less
│ │ │ ├── landing.less
│ │ │ └── preview.less
│ │ └── vendor/
│ │ ├── jquery-layout.less
│ │ └── prettify.less
│ └── js/
│ ├── directives/
│ │ ├── ace.coffee
│ │ ├── builder.coffee
│ │ ├── card.coffee
│ │ ├── chat.coffee
│ │ ├── discussion.coffee
│ │ ├── layout.coffee
│ │ ├── multipanel.coffee
│ │ ├── share.coffee
│ │ ├── statusbar.coffee
│ │ ├── toolbar.coffee
│ │ └── userpanel.coffee
│ ├── pages/
│ │ ├── editor.coffee
│ │ └── landing.coffee
│ ├── services/
│ │ ├── catalogue.coffee
│ │ ├── downloader.coffee
│ │ ├── importer.coffee
│ │ ├── modes.coffee
│ │ ├── notifier.coffee
│ │ ├── pages.coffee
│ │ ├── panels.coffee
│ │ ├── panes/
│ │ │ ├── builder.coffee
│ │ │ ├── explore.coffee
│ │ │ ├── lint.coffee
│ │ │ ├── previewer.coffee
│ │ │ ├── readme.coffee
│ │ │ └── streamer.coffee
│ │ ├── panes-dev/
│ │ │ ├── about.coffee
│ │ │ ├── compiler.coffee
│ │ │ ├── discussion.coffee
│ │ │ └── settings.coffee
│ │ ├── plunks.coffee
│ │ ├── scratch.coffee
│ │ ├── session.coffee
│ │ ├── url.coffee
│ │ └── whitelist.coffee
│ ├── socialbuttons.js
│ └── vendor/
│ ├── ace/
│ │ ├── ace.js
│ │ ├── keybinding-emacs.js
│ │ ├── keybinding-vim.js
│ │ ├── mode-c9search.js
│ │ ├── mode-c_cpp.js
│ │ ├── mode-clojure.js
│ │ ├── mode-coffee.js
│ │ ├── mode-coldfusion.js
│ │ ├── mode-csharp.js
│ │ ├── mode-css.js
│ │ ├── mode-diff.js
│ │ ├── mode-glsl.js
│ │ ├── mode-golang.js
│ │ ├── mode-groovy.js
│ │ ├── mode-haxe.js
│ │ ├── mode-html.js
│ │ ├── mode-jade.js
│ │ ├── mode-java.js
│ │ ├── mode-javascript.js
│ │ ├── mode-json.js
│ │ ├── mode-jsp.js
│ │ ├── mode-jsx.js
│ │ ├── mode-latex.js
│ │ ├── mode-less.js
│ │ ├── mode-liquid.js
│ │ ├── mode-lua.js
│ │ ├── mode-luapage.js
│ │ ├── mode-markdown.js
│ │ ├── mode-ocaml.js
│ │ ├── mode-perl.js
│ │ ├── mode-pgsql.js
│ │ ├── mode-php.js
│ │ ├── mode-powershell.js
│ │ ├── mode-python.js
│ │ ├── mode-ruby.js
│ │ ├── mode-scad.js
│ │ ├── mode-scala.js
│ │ ├── mode-scss.js
│ │ ├── mode-sh.js
│ │ ├── mode-sql.js
│ │ ├── mode-svg.js
│ │ ├── mode-tcl.js
│ │ ├── mode-text.js
│ │ ├── mode-textile.js
│ │ ├── mode-xml.js
│ │ ├── mode-xquery.js
│ │ ├── mode-yaml.js
│ │ ├── theme-ambiance.js
│ │ ├── theme-chrome.js
│ │ ├── theme-clouds.js
│ │ ├── theme-clouds_midnight.js
│ │ ├── theme-cobalt.js
│ │ ├── theme-crimson_editor.js
│ │ ├── theme-dawn.js
│ │ ├── theme-dreamweaver.js
│ │ ├── theme-eclipse.js
│ │ ├── theme-github.js
│ │ ├── theme-idle_fingers.js
│ │ ├── theme-kr_theme.js
│ │ ├── theme-merbivore.js
│ │ ├── theme-merbivore_soft.js
│ │ ├── theme-mono_industrial.js
│ │ ├── theme-monokai.js
│ │ ├── theme-pastel_on_dark.js
│ │ ├── theme-solarized_dark.js
│ │ ├── theme-solarized_light.js
│ │ ├── theme-textmate.js
│ │ ├── theme-tomorrow.js
│ │ ├── theme-tomorrow_night.js
│ │ ├── theme-tomorrow_night_blue.js
│ │ ├── theme-tomorrow_night_bright.js
│ │ ├── theme-tomorrow_night_eighties.js
│ │ ├── theme-twilight.js
│ │ ├── theme-vibrant_ink.js
│ │ ├── theme-xcode.js
│ │ ├── worker-coffee.js
│ │ ├── worker-css.js
│ │ ├── worker-javascript.js
│ │ ├── worker-json.js
│ │ └── worker-xquery.js
│ ├── angular-cookies.js
│ ├── angular-jq.js
│ ├── angular-resource.js
│ ├── angular-sanitize.js
│ ├── angular-ui.js
│ ├── angular.js
│ ├── backbone.js
│ ├── beautify.js
│ ├── handlebars.js
│ ├── jquery.cookie.js
│ ├── jquery.history.js
│ ├── jquery.js
│ ├── jquery.layout.js
│ ├── jquery.lazyload.js
│ ├── jquery.timeago.js
│ ├── jquery.ui.custom.js
│ ├── jszip.js
│ ├── noty/
│ │ ├── jquery.noty.js
│ │ ├── layouts/
│ │ │ ├── bottom.js
│ │ │ ├── bottomCenter.js
│ │ │ ├── bottomLeft.js
│ │ │ ├── bottomRight.js
│ │ │ ├── center.js
│ │ │ ├── centerLeft.js
│ │ │ ├── centerRight.js
│ │ │ ├── inline.js
│ │ │ ├── top.js
│ │ │ ├── topCenter.js
│ │ │ ├── topLeft.js
│ │ │ └── topRight.js
│ │ ├── promise.js
│ │ └── themes/
│ │ └── default.js
│ ├── overthrow.js
│ ├── page.js
│ ├── postmessage.js
│ ├── prettify.js
│ ├── semver.js
│ ├── showdown.js
│ └── underscore.js
├── index.coffee
├── middleware/
│ ├── error.coffee
│ ├── expose.coffee
│ └── session.coffee
├── models/
│ └── user.coffee
├── package.json
├── server.js
└── views/
├── auth/
│ ├── error.jade
│ └── success.jade
├── editor.jade
├── landing.jade
└── partials/
├── discuss.jade
├── home.jade
├── preview.jade
├── tag.jade
├── tags.jade
├── user.jade
└── users.jade
SYMBOL INDEX (822 symbols across 55 files)
FILE: servers/embed/assets/bootstrap/js/bootstrap-alert.js
function removeElement (line 56) | function removeElement() {
FILE: servers/embed/assets/bootstrap/js/bootstrap-dropdown.js
function clearMenus (line 102) | function clearMenus() {
function getParent (line 107) | function getParent($this) {
FILE: servers/embed/assets/bootstrap/js/bootstrap-scrollspy.js
function ScrollSpy (line 29) | function ScrollSpy(element, options) {
FILE: servers/embed/assets/bootstrap/js/bootstrap-tab.js
function next (line 79) | function next() {
FILE: servers/embed/assets/bootstrap/js/bootstrap-tooltip.js
function removeWithAnimation (line 167) | function removeWithAnimation() {
FILE: servers/embed/assets/js/vendor/angular-sanitize.js
function makeMap (line 175) | function makeMap(str) {
function htmlParser (line 194) | function htmlParser( html, handler ) {
function decodeEntities (line 323) | function decodeEntities(value) {
function encodeEntities (line 335) | function encodeEntities(value) {
function htmlSanitizeWriter (line 355) | function htmlSanitizeWriter(buf){
FILE: servers/embed/assets/js/vendor/angular.js
function fromCharCode (line 55) | function fromCharCode(code) {return String.fromCharCode(code);}
function forEach (line 100) | function forEach(obj, iterator, context) {
function sortedKeys (line 125) | function sortedKeys(obj) {
function forEachSorted (line 135) | function forEachSorted(obj, iterator, context) {
function reverseParams (line 149) | function reverseParams(iteratorFn) {
function nextUid (line 161) | function nextUid() {
function extend (line 195) | function extend(dst) {
function int (line 206) | function int(str) {
function inherit (line 211) | function inherit(parent, extra) {
function noop (line 231) | function noop() {}
function identity (line 250) | function identity($) {return $;}
function valueFn (line 254) | function valueFn(value) {return function() {return value;};}
function isUndefined (line 267) | function isUndefined(value){return typeof value == 'undefined';}
function isDefined (line 281) | function isDefined(value){return typeof value != 'undefined';}
function isObject (line 296) | function isObject(value){return value != null && typeof value == 'object';}
function isString (line 310) | function isString(value){return typeof value == 'string';}
function isNumber (line 324) | function isNumber(value){return typeof value == 'number';}
function isDate (line 338) | function isDate(value){
function isArray (line 354) | function isArray(value) {
function isFunction (line 370) | function isFunction(value){return typeof value == 'function';}
function isWindow (line 380) | function isWindow(obj) {
function isScope (line 385) | function isScope(obj) {
function isFile (line 390) | function isFile(obj) {
function isBoolean (line 395) | function isBoolean(value) {
function trim (line 400) | function trim(value) {
function isElement (line 415) | function isElement(node) {
function makeMap (line 425) | function makeMap(str){
function map (line 446) | function map(obj, iterator, context) {
function size (line 467) | function size(obj, ownPropsOnly) {
function includes (line 482) | function includes(array, obj) {
function indexOf (line 486) | function indexOf(array, obj) {
function arrayRemove (line 495) | function arrayRemove(array, value) {
function isLeafNode (line 502) | function isLeafNode (node) {
function copy (line 536) | function copy(source, destination){
function shallowCopy (line 573) | function shallowCopy(src, dst) {
function equals (line 610) | function equals(o1, o2) {
function concat (line 646) | function concat(array1, array2, index) {
function sliceArgs (line 650) | function sliceArgs(args, startIndex) {
function bind (line 670) | function bind(self, fn) {
function toJsonReplacer (line 691) | function toJsonReplacer(key, value) {
function toJson (line 720) | function toJson(obj, pretty) {
function fromJson (line 736) | function fromJson(json) {
function toBoolean (line 743) | function toBoolean(value) {
function startingTag (line 756) | function startingTag(element) {
function parseKeyValue (line 775) | function parseKeyValue(/**string*/keyValue) {
function toKeyValue (line 787) | function toKeyValue(obj) {
function encodeUriSegment (line 807) | function encodeUriSegment(val) {
function encodeUriQuery (line 826) | function encodeUriQuery(val, pctEncodeSpaces) {
function angularInit (line 864) | function angularInit(element, bootstrap) {
function bootstrap (line 920) | function bootstrap(element, modules) {
function snake_case (line 940) | function snake_case(name, separator){
function bindJQuery (line 947) | function bindJQuery() {
function assertArg (line 971) | function assertArg(arg, name, reason) {
function assertArgFn (line 978) | function assertArgFn(arg, name, acceptArrayAnnotation) {
function setupModuleLoader (line 996) | function setupModuleLoader(window) {
function publishExternalAPI (line 1258) | function publishExternalAPI(angular){
function jqNextId (line 1451) | function jqNextId() { return ++jqId; }
function camelCase (line 1462) | function camelCase(name) {
function JQLitePatchJQueryRemove (line 1478) | function JQLitePatchJQueryRemove(name, dispatchThis) {
function JQLite (line 1517) | function JQLite(element) {
function JQLiteClone (line 1541) | function JQLiteClone(element) {
function JQLiteDealoc (line 1545) | function JQLiteDealoc(element){
function JQLiteUnbind (line 1552) | function JQLiteUnbind(element, type, fn) {
function JQLiteRemoveData (line 1573) | function JQLiteRemoveData(element) {
function JQLiteExpandoStore (line 1587) | function JQLiteExpandoStore(element, key, value) {
function JQLiteData (line 1602) | function JQLiteData(element, key, value) {
function JQLiteHasClass (line 1628) | function JQLiteHasClass(element, selector) {
function JQLiteRemoveClass (line 1633) | function JQLiteRemoveClass(element, selector) {
function JQLiteAddClass (line 1645) | function JQLiteAddClass(element, selector) {
function JQLiteAddNodes (line 1655) | function JQLiteAddNodes(root, elements) {
function JQLiteController (line 1666) | function JQLiteController(element, name) {
function JQLiteInheritedData (line 1670) | function JQLiteInheritedData(element, name, value) {
function trigger (line 1692) | function trigger() {
function getBooleanAttrName (line 1732) | function getBooleanAttrName(element, name) {
function createEventHandler (line 1898) | function createEventHandler(element, events) {
function hashKey (line 2129) | function hashKey(obj) {
function HashMap (line 2150) | function HashMap(array){
function HashQueueMap (line 2186) | function HashQueueMap() {}
function annotate (line 2258) | function annotate(fn) {
function createInjector (line 2611) | function createInjector(modulesToLoad) {
function $AnchorScrollProvider (line 2833) | function $AnchorScrollProvider() {
function Browser (line 2906) | function Browser(window, document, $log, $sniffer) {
function $BrowserProvider (line 3238) | function $BrowserProvider(){
function $CacheFactoryProvider (line 3267) | function $CacheFactoryProvider() {
function $TemplateCacheProvider (line 3407) | function $TemplateCacheProvider() {
function $CompileProvider (line 3577) | function $CompileProvider($provide) {
function directiveNormalize (line 4492) | function directiveNormalize(name) {
function nodesetLinkingFn (line 4539) | function nodesetLinkingFn(
function directiveLinkingFn (line 4546) | function directiveLinkingFn(
function $ControllerProvider (line 4564) | function $ControllerProvider() {
function $DocumentProvider (line 4634) | function $DocumentProvider(){
function $ExceptionHandlerProvider (line 4657) | function $ExceptionHandlerProvider() {
function $InterpolateProvider (line 4674) | function $InterpolateProvider() {
function encodePath (line 4820) | function encodePath(path) {
function stripHash (line 4831) | function stripHash(url) {
function matchUrl (line 4836) | function matchUrl(url, obj) {
function composeProtocolHostPort (line 4858) | function composeProtocolHostPort(protocol, host, port) {
function pathPrefixFromBase (line 4863) | function pathPrefixFromBase(basePath) {
function convertToHtml5Url (line 4868) | function convertToHtml5Url(url, basePath, hashPrefix) {
function convertToHashbangUrl (line 4883) | function convertToHashbangUrl(url, basePath, hashPrefix) {
function LocationUrl (line 4914) | function LocationUrl(url, pathPrefix, appBaseUrl) {
function LocationHashbangUrl (line 4969) | function LocationHashbangUrl(url, hashPrefix, appBaseUrl) {
function LocationHashbangInHtml5Url (line 5207) | function LocationHashbangInHtml5Url(url, hashPrefix, appBaseUrl, baseExt...
function locationGetter (line 5220) | function locationGetter(property) {
function locationGetterSetter (line 5227) | function locationGetterSetter(property, preprocess) {
function $LocationProvider (line 5275) | function $LocationProvider(){
function $LogProvider (line 5459) | function $LogProvider(){
function lex (line 5566) | function lex(text, csp){
function parser (line 5800) | function parser(text, json, $filter, csp){
function setter (line 6180) | function setter(obj, path, setValue) {
function getter (line 6203) | function getter(obj, path, bindFnToScope) {
function cspSafeGetterFn (line 6229) | function cspSafeGetterFn(key0, key1, key2, key3, key4) {
function getterFn (line 6293) | function getterFn(path, csp) {
function $ParseProvider (line 6379) | function $ParseProvider() {
function $QProvider (line 6521) | function $QProvider() {
function qFactory (line 6539) | function qFactory(nextTick, exceptionHandler) {
function $RouteProvider (line 6796) | function $RouteProvider(){
function $RouteParamsProvider (line 7260) | function $RouteParamsProvider() {
function $RootScopeProvider (line 7322) | function $RootScopeProvider(){
function $SnifferProvider (line 8065) | function $SnifferProvider() {
function $WindowProvider (line 8121) | function $WindowProvider(){
function parseHeaders (line 8131) | function parseHeaders(headers) {
function headersGetter (line 8166) | function headersGetter(headers) {
function transformData (line 8191) | function transformData(data, headers, fns) {
function isSuccess (line 8203) | function isSuccess(status) {
function $HttpProvider (line 8208) | function $HttpProvider() {
function $HttpBackendProvider (line 8913) | function $HttpBackendProvider() {
function createHttpBackend (line 8920) | function createHttpBackend($browser, XHR, $browserDefer, callbacks, rawD...
function $LocaleProvider (line 9025) | function $LocaleProvider(){
function $TimeoutProvider (line 9086) | function $TimeoutProvider() {
function $FilterProvider (line 9246) | function $FilterProvider($provide) {
function filterFilter (line 9353) | function filterFilter() {
function currencyFilter (line 9478) | function currencyFilter($locale) {
function numberFilter (line 9535) | function numberFilter($locale) {
function formatNumber (line 9544) | function formatNumber(number, pattern, groupSep, decimalSep, fractionSiz...
function padNumber (line 9604) | function padNumber(num, digits, trim) {
function dateGetter (line 9618) | function dateGetter(name, size, offset, trim) {
function dateStrGetter (line 9628) | function dateStrGetter(name, shortForm) {
function timeZoneGetter (line 9637) | function timeZoneGetter(date) {
function ampmGetter (line 9642) | function ampmGetter(date, formats) {
function dateFilter (line 9753) | function dateFilter($locale) {
function jsonFilter (line 9848) | function jsonFilter() {
function limitToFilter (line 9929) | function limitToFilter(){
function orderByFilter (line 10049) | function orderByFilter($parse){
function ngDirective (line 10098) | function ngDirective(directive) {
function FormController (line 10482) | function FormController(element, attrs) {
function isEmpty (line 11074) | function isEmpty(value) {
function textInputType (line 11079) | function textInputType(scope, element, attr, ctrl, $sniffer, $browser) {
function numberInputType (line 11192) | function numberInputType(scope, element, attr, ctrl, $sniffer, $browser) {
function urlInputType (line 11254) | function urlInputType(scope, element, attr, ctrl, $sniffer, $browser) {
function emailInputType (line 11271) | function emailInputType(scope, element, attr, ctrl, $sniffer, $browser) {
function radioInputType (line 11288) | function radioInputType(scope, element, attr, ctrl) {
function checkboxInputType (line 11310) | function checkboxInputType(scope, element, attr, ctrl) {
function toggleValidCss (line 11611) | function toggleValidCss(isValid, validationErrorKey) {
function classDirective (line 12101) | function classDirective(name, selector) {
function destroyLastScope (line 13665) | function destroyLastScope() {
function clearContent (line 13672) | function clearContent() {
function update (line 13677) | function update() {
function Single (line 13988) | function Single(scope, selectElement, ngModelCtrl, selectCtrl) {
function Multiple (line 14013) | function Multiple(scope, selectElement, ctrl) {
function Options (line 14044) | function Options(scope, selectElement, ctrl) {
FILE: servers/embed/assets/js/vendor/jquery.js
function jQuerySub (line 897) | function jQuerySub( selector, context ) {
function doScrollCheck (line 963) | function doScrollCheck() {
function createFlags (line 990) | function createFlags( flags ) {
function resolveFunc (line 1325) | function resolveFunc( i ) {
function progressFunc (line 1333) | function progressFunc( i ) {
function dataAttr (line 1985) | function dataAttr( elem, key, data ) {
function isEmptyDataObject (line 2016) | function isEmptyDataObject( obj ) {
function handleQueueMarkDefer (line 2034) | function handleQueueMarkDefer( elem, type, src ) {
function resolve (line 2193) | function resolve() {
function returnFalse (line 3546) | function returnFalse() {
function returnTrue (line 3549) | function returnTrue() {
function dirNodeCheck (line 5260) | function dirNodeCheck( dir, cur, doneName, checkSet, nodeCheck, isXML ) {
function dirCheck (line 5293) | function dirCheck( dir, cur, doneName, checkSet, nodeCheck, isXML ) {
function isDisconnected (line 5566) | function isDisconnected( node ) {
function winnow (line 5683) | function winnow( elements, qualifier, keep ) {
function createSafeFragment (line 5720) | function createSafeFragment( document ) {
function root (line 6092) | function root( elem, cur ) {
function cloneCopyEvent (line 6099) | function cloneCopyEvent( src, dest ) {
function cloneFixAttributes (line 6127) | function cloneFixAttributes( src, dest ) {
function getAll (line 6272) | function getAll( elem ) {
function fixDefaultChecked (line 6285) | function fixDefaultChecked( elem ) {
function findInputs (line 6291) | function findInputs( elem ) {
function shimCloneNode (line 6302) | function shimCloneNode( elem ) {
function getWidthOrHeight (line 6793) | function getWidthOrHeight( elem, name, extra ) {
function addToPrefiltersOrTransports (line 7034) | function addToPrefiltersOrTransports( structure ) {
function inspectPrefiltersOrTransports (line 7070) | function inspectPrefiltersOrTransports( structure, options, originalOpti...
function ajaxExtend (line 7112) | function ajaxExtend( target, src ) {
function done (line 7454) | function done( status, nativeStatusText, responses, headers ) {
function buildParams (line 7769) | function buildParams( prefix, obj, traditional, add ) {
function ajaxHandleResponses (line 7819) | function ajaxHandleResponses( s, jqXHR, responses ) {
function ajaxConvert (line 7884) | function ajaxConvert( s, response ) {
function createStandardXHR (line 8149) | function createStandardXHR() {
function createActiveXHR (line 8155) | function createActiveXHR() {
function doAnimation (line 8494) | function doAnimation() {
function stopQueue (line 8650) | function stopQueue( elem, data, index ) {
function createFxNow (line 8692) | function createFxNow() {
function clearFxNow (line 8697) | function clearFxNow() {
function genFx (line 8702) | function genFx( type, num ) {
function t (line 8817) | function t( gotoEnd ) {
function defaultDisplay (line 9015) | function defaultDisplay( nodeName ) {
function getWindow (line 9299) | function getWindow( elem ) {
FILE: servers/embed/assets/js/vendor/prettify.js
function L (line 2) | function L(a){function m(a){var f=a.charCodeAt(0);if(f!==92)return f;var...
function M (line 6) | function M(a){function m(a){switch(a.nodeType){case 1:if(e.test(a.classN...
function B (line 7) | function B(a,m,e,h){m&&(a={a:m,d:a},e(a),h.push.apply(h,a.e))}
function x (line 7) | function x(a,m){function e(a){for(var l=a.d,p=[l,"pln"],d=0,g=a.a.match(...
function u (line 9) | function u(a){var m=[],e=[];a.tripleQuotedStrings?m.push(["str",/^(?:'''...
function D (line 12) | function D(a,m){function e(a){switch(a.nodeType){case 1:if(k.test(a.clas...
function k (line 15) | function k(a,m){for(var e=m.length;--e>=0;){var h=m[e];A.hasOwnProperty(...
function C (line 15) | function C(a,m){if(!a||!A.hasOwnProperty(a))a=/^\s*</.test(m)?"default-m...
function E (line 15) | function E(a){var m=
function m (line 25) | function m(){for(var e=window.PR_SHOULD_USE_CONTINUATION?l.now()+250:Inf...
FILE: servers/embed/assets/js/vendor/showdown.js
function headerId (line 698) | function headerId(m) {
function char2hex (line 1212) | function char2hex(ch) {
FILE: servers/www/assets/bootstrap/js/bootstrap-alert.js
function removeElement (line 56) | function removeElement() {
FILE: servers/www/assets/bootstrap/js/bootstrap-dropdown.js
function clearMenus (line 102) | function clearMenus() {
function getParent (line 107) | function getParent($this) {
FILE: servers/www/assets/bootstrap/js/bootstrap-scrollspy.js
function ScrollSpy (line 29) | function ScrollSpy(element, options) {
FILE: servers/www/assets/bootstrap/js/bootstrap-tab.js
function next (line 79) | function next() {
FILE: servers/www/assets/bootstrap/js/bootstrap-tooltip.js
function removeWithAnimation (line 167) | function removeWithAnimation() {
FILE: servers/www/assets/js/socialbuttons.js
function initSocialButtons (line 1) | function initSocialButtons() {
FILE: servers/www/assets/js/vendor/ace/ace.js
function exportAce (line 166) | function exportAce(ns) {
function getNativeFlags (line 360) | function getNativeFlags (regex) {
function indexOf (line 368) | function indexOf (array, item, from) {
function doesDefinePropertyWork (line 958) | function doesDefinePropertyWork(object) {
function onReleaseCapture (line 1738) | function onReleaseCapture(e) {
function onMouseUp (line 1761) | function onMouseUp(e) {
function normalizeCommandKeys (line 1852) | function normalizeCommandKeys(callback, e, keyCode) {
function reset (line 3568) | function reset(full) {
function sendText (line 3579) | function sendText(valueToSend) {
function isFocused (line 3773) | function isFocused() {
function onContextMenuClose (line 3810) | function onContextMenuClose() {
function DefaultHandlers (line 3973) | function DefaultHandlers(mouseHandler) {
function calcDistance (line 4264) | function calcDistance(ax, ay, bx, by) {
function calcRangeOrientation (line 4268) | function calcRangeOrientation(range, cursor) {
function GutterHandler (line 4287) | function GutterHandler(mouseHandler) {
function FoldHandler (line 4557) | function FoldHandler(editor) {
function done (line 5305) | function done(module) {
function fetch (line 5318) | function fetch(name, callback) {
function isInsert (line 5554) | function isInsert(delta) {
function addSplit (line 6043) | function addSplit(screenPos) {
function isFullWidth (line 6448) | function isFullWidth(c) {
function deHyphenate (line 6592) | function deHyphenate(str) {
function addUnicodePackage (line 8303) | function addUnicodePackage (pack) {
function Folding (line 9069) | function Folding() {
function FoldLine (line 9745) | function FoldLine(foldData, folds) {
function BracketMatch (line 10160) | function BracketMatch() {
function HashHandler (line 10772) | function HashHandler(config, platform) {
function bindKey (line 10906) | function bindKey(win, mac) {
function afterLoad (line 12314) | function afterLoad(theme) {
function addTokens (line 13259) | function addTokens(tokens, from, to) {
function find (line 13997) | function find(session, needle, dir) {
function strRepeat (line 14643) | function strRepeat(n, ch) {
function alignLeft (line 14647) | function alignLeft(m) {
function alignRight (line 14652) | function alignRight(m) {
function unAlign (line 14657) | function unAlign(m) {
function isSamePoint (line 14666) | function isSamePoint(p1, p2) {
function MultiSelect (line 14711) | function MultiSelect(editor) {
function addAltCursorListeners (line 14726) | function addAltCursorListeners(editor){
function isSamePoint (line 14955) | function isSamePoint(p1, p2) {
function onMouseDown (line 14959) | function onMouseDown(e) {
function StateHandler (line 15292) | function StateHandler(keymapping) {
FILE: servers/www/assets/js/vendor/ace/keybinding-vim.js
function setPreviousCommand (line 596) | function setPreviousCommand(fn) {
function Motion (line 844) | function Motion(getRange, type){
function find (line 947) | function find(editor, needle, dir) {
FILE: servers/www/assets/js/vendor/ace/mode-coffee.js
function Mode (line 43) | function Mode() {
function CoffeeHighlightRules (line 124) | function CoffeeHighlightRules() {
FILE: servers/www/assets/js/vendor/ace/mode-coldfusion.js
function string (line 171) | function string(state) {
function multiLineString (line 191) | function multiLineString(quote, state) {
function hasType (line 259) | function hasType(token, type) {
FILE: servers/www/assets/js/vendor/ace/mode-html.js
function string (line 1411) | function string(state) {
function multiLineString (line 1431) | function multiLineString(quote, state) {
function hasType (line 1500) | function hasType(token, type) {
function hasType (line 1560) | function hasType(token, type) {
FILE: servers/www/assets/js/vendor/ace/mode-jade.js
function mixin_embed (line 75) | function mixin_embed(tag, prefix) {
function github_embed (line 328) | function github_embed(tag, prefix) {
function string (line 971) | function string(state) {
function multiLineString (line 991) | function multiLineString(quote, state) {
function CoffeeHighlightRules (line 1864) | function CoffeeHighlightRules() {
FILE: servers/www/assets/js/vendor/ace/mode-jsp.js
function string (line 836) | function string(state) {
function multiLineString (line 856) | function multiLineString(quote, state) {
FILE: servers/www/assets/js/vendor/ace/mode-jsx.js
function Mode (line 12) | function Mode() {
FILE: servers/www/assets/js/vendor/ace/mode-liquid.js
function string (line 880) | function string(state) {
function multiLineString (line 900) | function multiLineString(quote, state) {
FILE: servers/www/assets/js/vendor/ace/mode-lua.js
function getNetIndentLevel (line 63) | function getNetIndentLevel(tokens) {
FILE: servers/www/assets/js/vendor/ace/mode-luapage.js
function string (line 1404) | function string(state) {
function multiLineString (line 1424) | function multiLineString(quote, state) {
function hasType (line 1493) | function hasType(token, type) {
function hasType (line 1553) | function hasType(token, type) {
function getNetIndentLevel (line 1977) | function getNetIndentLevel(tokens) {
FILE: servers/www/assets/js/vendor/ace/mode-markdown.js
function string (line 1139) | function string(state) {
function multiLineString (line 1159) | function multiLineString(quote, state) {
function hasType (line 1227) | function hasType(token, type) {
function hasType (line 1942) | function hasType(token, type) {
function github_embed (line 2106) | function github_embed(tag, prefix) {
FILE: servers/www/assets/js/vendor/ace/mode-php.js
function string (line 1867) | function string(state) {
function multiLineString (line 1887) | function multiLineString(quote, state) {
FILE: servers/www/assets/js/vendor/ace/mode-svg.js
function string (line 178) | function string(state) {
function multiLineString (line 198) | function multiLineString(quote, state) {
function hasType (line 266) | function hasType(token, type) {
FILE: servers/www/assets/js/vendor/ace/mode-xml.js
function string (line 136) | function string(state) {
function multiLineString (line 156) | function multiLineString(quote, state) {
function hasType (line 224) | function hasType(token, type) {
FILE: servers/www/assets/js/vendor/ace/worker-coffee.js
function initBaseUrls (line 91) | function initBaseUrls(topLevelNamespaces) {
function initSender (line 95) | function initSender() {
function getNativeFlags (line 249) | function getNativeFlags (regex) {
function indexOf (line 257) | function indexOf (array, item, from) {
function doesDefinePropertyWork (line 847) | function doesDefinePropertyWork(object) {
function Lexer (line 2679) | function Lexer() {}
function Rewriter (line 3391) | function Rewriter() {}
function popStack (line 4260) | function popStack(n) {
function lex (line 4265) | function lex() {
function ctor (line 4358) | function ctor() { this.constructor = child; }
function Base (line 4390) | function Base() {}
function Block (line 4552) | function Block(nodes) {
function Literal (line 4752) | function Literal(value) {
function Return (line 4810) | function Return(expr) {
function Value (line 4846) | function Value(base, props, tag) {
function Comment (line 5000) | function Comment(comment) {
function Call (line 5025) | function Call(variable, args, soak) {
function Extends (line 5198) | function Extends(child, parent) {
function Access (line 5219) | function Access(name, tag) {
function Index (line 5249) | function Index(index) {
function Range (line 5275) | function Range(from, to, tag) {
function Slice (line 5360) | function Slice(range) {
function Obj (line 5386) | function Obj(props, generated) {
function Arr (line 5467) | function Arr(objs) {
function Class (line 5517) | function Class(variable, parent, body) {
function Assign (line 5693) | function Assign(variable, value, context, options) {
function Code (line 5901) | function Code(params, body, tag) {
function Param (line 6039) | function Param(name, value, splat) {
function Splat (line 6121) | function Splat(name) {
function While (line 6185) | function While(condition, options) {
function Op (line 6260) | function Op(op, first, second, flip) {
function In (line 6434) | function In(object, array) {
function Try (line 6508) | function Try(attempt, error, recovery, ensure) {
function Throw (line 6563) | function Throw(expression) {
function Existence (line 6589) | function Existence(expression) {
function Parens (line 6624) | function Parens(body) {
function For (line 6664) | function For(body, source) {
function Switch (line 6805) | function Switch(subject, cases, otherwise) {
function If (line 6882) | function If(condition, body, options) {
function Scope (line 7098) | function Scope(parent, expressions, method) {
FILE: servers/www/assets/js/vendor/ace/worker-css.js
function initBaseUrls (line 91) | function initBaseUrls(topLevelNamespaces) {
function initSender (line 95) | function initSender() {
function getNativeFlags (line 249) | function getNativeFlags (regex) {
function indexOf (line 257) | function indexOf (array, item, from) {
function doesDefinePropertyWork (line 847) | function doesDefinePropertyWork(object) {
function EventTarget (line 2671) | function EventTarget(){
function StringReader (line 2752) | function StringReader(text){
function SyntaxError (line 2983) | function SyntaxError(message, line, col){
function SyntaxUnit (line 2998) | function SyntaxUnit(text, line, col, type){
function TokenStreamBase (line 3058) | function TokenStreamBase(input, tokenData){
function Combinator (line 3593) | function Combinator(text, line, col){
function MediaFeature (line 3622) | function MediaFeature(name, value){
function MediaQuery (line 3643) | function MediaQuery(modifier, mediaType, features, line, col){
function Parser (line 3667) | function Parser(options){
function PropertyName (line 6336) | function PropertyName(text, hack, line, col){
function PropertyValue (line 6360) | function PropertyValue(parts, line, col){
function PropertyValueIterator (line 6377) | function PropertyValueIterator(value){
function PropertyValuePart (line 6434) | function PropertyValuePart(text, line, col){
function Selector (line 6603) | function Selector(parts, line, col){
function SelectorPart (line 6629) | function SelectorPart(elementName, modifiers, text, line, col){
function SelectorSubPart (line 6651) | function SelectorSubPart(text, type, line, col){
function Specificity (line 6671) | function Specificity(a, b, c, d){
function updateValues (line 6727) | function updateValues(part){
function isHexDigit (line 6785) | function isHexDigit(c){
function isDigit (line 6789) | function isDigit(c){
function isWhitespace (line 6793) | function isWhitespace(c){
function isNewLine (line 6797) | function isNewLine(c){
function isNameStart (line 6801) | function isNameStart(c){
function isNameChar (line 6805) | function isNameChar(c){
function isIdentStart (line 6809) | function isIdentStart(c){
function mix (line 6813) | function mix(receiver, supplier){
function TokenStream (line 6834) | function TokenStream(input){
function ValidationError (line 8074) | function ValidationError(message, line, col){
function Reporter (line 8588) | function Reporter(lines, ruleset){
function startRule (line 8856) | function startRule(){
function endRule (line 8860) | function endRule(){
function reportProperty (line 9141) | function reportProperty(name, display, msg){
function startRule (line 9149) | function startRule(){
function endRule (line 9153) | function endRule(){
function startRule (line 9268) | function startRule(event){
function startRule (line 9365) | function startRule(event){
function startRule (line 9995) | function startRule(event){
function endRule (line 10009) | function endRule(event){
function startRule (line 10249) | function startRule(event){
function endRule (line 10254) | function endRule(event){
function startRule (line 10308) | function startRule(event){
function endRule (line 10313) | function endRule(event){
function startRule (line 10561) | function startRule(){
function endRule (line 10567) | function endRule(event){
FILE: servers/www/assets/js/vendor/ace/worker-javascript.js
function initBaseUrls (line 91) | function initBaseUrls(topLevelNamespaces) {
function initSender (line 95) | function initSender() {
function getNativeFlags (line 249) | function getNativeFlags (regex) {
function indexOf (line 257) | function indexOf (array, item, from) {
function doesDefinePropertyWork (line 847) | function doesDefinePropertyWork(object) {
function F (line 3423) | function F() {} // Used by Object.create
function is_own (line 3425) | function is_own(object, name) {
function checkOption (line 3433) | function checkOption(name, t) {
function combine (line 3525) | function combine(t, o) {
function assume (line 3534) | function assume() {
function quit (line 3591) | function quit(message, line, chr) {
function isundef (line 3603) | function isundef(scope, m, t, a) {
function warning (line 3607) | function warning(m, t, a, b, c, d) {
function warningAt (line 3638) | function warningAt(m, l, ch, a, b, c, d) {
function error (line 3645) | function error(m, t, a, b, c, d) {
function errorAt (line 3649) | function errorAt(m, l, ch, a, b, c, d) {
function nextLine (line 3665) | function nextLine() {
function it (line 3705) | function it(type, value) {
function match (line 3805) | function match(x) {
function string (line 3818) | function string(x) {
function addlabel (line 4348) | function addlabel(t, type) {
function doOption (line 4379) | function doOption() {
function peek (line 4497) | function peek(p) {
function advance (line 4514) | function advance(id, t) {
function expression (line 4584) | function expression(rbp, initial) {
function adjacent (line 4633) | function adjacent(left, right) {
function nobreak (line 4644) | function nobreak(left, right) {
function nospace (line 4652) | function nospace(left, right) {
function nonadjacent (line 4662) | function nonadjacent(left, right) {
function nobreaknonadjacent (line 4674) | function nobreaknonadjacent(left, right) {
function indentation (line 4690) | function indentation(bias) {
function nolinebreak (line 4702) | function nolinebreak(t) {
function comma (line 4710) | function comma() {
function symbol (line 4731) | function symbol(s, p) {
function delim (line 4744) | function delim(s) {
function stmt (line 4749) | function stmt(s, f) {
function blockstmt (line 4757) | function blockstmt(s, f) {
function reserveName (line 4764) | function reserveName(x) {
function prefix (line 4773) | function prefix(s, f) {
function type (line 4793) | function type(s, f) {
function reserve (line 4801) | function reserve(s, f) {
function reservevar (line 4808) | function reservevar(s, v) {
function infix (line 4818) | function infix(s, f, p, w) {
function relation (line 4841) | function relation(s, f) {
function isPoorRelation (line 4866) | function isPoorRelation(node) {
function assignop (line 4877) | function assignop(s, f) {
function bitwise (line 4916) | function bitwise(s, f, p) {
function bitwiseassignop (line 4931) | function bitwiseassignop(s) {
function suffix (line 4957) | function suffix(s, f) {
function optionalidentifier (line 4975) | function optionalidentifier(fnparam) {
function identifier (line 4993) | function identifier(fnparam) {
function reachable (line 5007) | function reachable(s) {
function statement (line 5034) | function statement(noindent) {
function statements (line 5106) | function statements(startLine) {
function directives (line 5129) | function directives() {
function block (line 5191) | function block(ordinary, stmt, isfunc) {
function countMember (line 5271) | function countMember(m) {
function note_implied (line 5283) | function note_implied(token) {
function property_name (line 5853) | function property_name() {
function functionparams (line 5868) | function functionparams() {
function doFunction (line 5891) | function doFunction(i, statement) {
function saveProperty (line 5930) | function saveProperty(name, token) {
function saveSetter (line 5940) | function saveSetter(name, token) {
function saveGetter (line 5952) | function saveGetter(name) {
function jsonValue (line 6630) | function jsonValue() {
function detail (line 6970) | function detail(h, array) {
function pushDestructuringVarDecls (line 7121) | function pushDestructuringVarDecls(n, s) {
function Parser (line 7132) | function Parser(tokenizer) {
function StaticContext (line 7141) | function StaticContext(parentScript, parentBlock, inModule, inFunction, ...
function Pragma (line 7266) | function Pragma(n) {
function Node (line 7280) | function Node(t, init) {
function SyntheticNode (line 7305) | function SyntheticNode(init) {
function unevalableConst (line 7324) | function unevalableConst(code) {
function tokenString (line 7376) | function tokenString(tt) {
function blockInit (line 7409) | function blockInit() {
function scriptInit (line 7413) | function scriptInit() {
function Export (line 7493) | function Export(node, isDefinition) {
function registerExport (line 7502) | function registerExport(exports, decl) {
function Module (line 7563) | function Module(node) {
function isPragmaToken (line 7993) | function isPragmaToken(tt) {
function parse (line 8997) | function parse(s, f, l) {
function parseFunction (line 9009) | function parseFunction(s, requireName, form, f, l) {
function parseStdin (line 9019) | function parseStdin(s, ln, prefix, isCommand) {
function parseMultiline (line 9059) | function parseMultiline(ln, prefix) {
function isValidIdentifierChar (line 9127) | function isValidIdentifierChar(ch, first) {
function isIdentifier (line 9151) | function isIdentifier(str) {
function Tokenizer (line 9172) | function Tokenizer(s, f, l, allowHTMLComments) {
method done (line 9186) | get done() {
method token (line 9192) | get token() {
function defineGetter (line 9856) | function defineGetter(obj, prop, fn, dontDelete, dontEnum) {
function defineGetterSetter (line 9861) | function defineGetterSetter(obj, prop, getter, setter, dontDelete, dontE...
function defineMemoGetter (line 9870) | function defineMemoGetter(obj, prop, fn, dontDelete, dontEnum) {
function defineProperty (line 9882) | function defineProperty(obj, prop, val, dontDelete, readOnly, dontEnum) {
function isNativeCode (line 9889) | function isNativeCode(fn) {
function apply (line 9896) | function apply(f, o, a) {
function getPropertyDescriptor (line 9927) | function getPropertyDescriptor(obj, name) {
function getPropertyNames (line 9935) | function getPropertyNames(obj) {
function getOwnProperties (line 9946) | function getOwnProperties(obj) {
function blacklistHandler (line 9953) | function blacklistHandler(target, blacklist) {
function whitelistHandler (line 9959) | function whitelistHandler(target, whitelist) {
function mixinHandler (line 9983) | function mixinHandler(redirect, catchall) {
function makePassthruHandler (line 10049) | function makePassthruHandler(obj) {
function hasOwn (line 10100) | function hasOwn(obj, name) {
function Dict (line 10104) | function Dict(table, size) {
function WeakMap (line 10183) | function WeakMap(array) {
function searchMap (line 10187) | function searchMap(map, key, found, notFound) {
function Stack (line 10225) | function Stack(elts) {
FILE: servers/www/assets/js/vendor/ace/worker-json.js
function initBaseUrls (line 91) | function initBaseUrls(topLevelNamespaces) {
function initSender (line 95) | function initSender() {
function getNativeFlags (line 249) | function getNativeFlags (regex) {
function indexOf (line 257) | function indexOf (array, item, from) {
function doesDefinePropertyWork (line 847) | function doesDefinePropertyWork(object) {
FILE: servers/www/assets/js/vendor/ace/worker-xquery.js
function initBaseUrls (line 91) | function initBaseUrls(topLevelNamespaces) {
function initSender (line 95) | function initSender() {
function getNativeFlags (line 249) | function getNativeFlags (regex) {
function indexOf (line 257) | function indexOf (array, item, from) {
function doesDefinePropertyWork (line 847) | function doesDefinePropertyWork(object) {
FILE: servers/www/assets/js/vendor/angular-cookies.js
function push (line 61) | function push() {
FILE: servers/www/assets/js/vendor/angular-resource.js
function encodeUriSegment (line 244) | function encodeUriSegment(val) {
function encodeUriQuery (line 263) | function encodeUriQuery(val, pctEncodeSpaces) {
function Route (line 272) | function Route(template, defaults) {
function ResourceFactory (line 309) | function ResourceFactory(url, paramDefaults, actions, parser) {
FILE: servers/www/assets/js/vendor/angular-sanitize.js
function makeMap (line 175) | function makeMap(str) {
function htmlParser (line 194) | function htmlParser( html, handler ) {
function decodeEntities (line 323) | function decodeEntities(value) {
function encodeEntities (line 335) | function encodeEntities(value) {
function htmlSanitizeWriter (line 355) | function htmlSanitizeWriter(buf){
FILE: servers/www/assets/js/vendor/angular.js
function fromCharCode (line 55) | function fromCharCode(code) {return String.fromCharCode(code);}
function forEach (line 100) | function forEach(obj, iterator, context) {
function sortedKeys (line 125) | function sortedKeys(obj) {
function forEachSorted (line 135) | function forEachSorted(obj, iterator, context) {
function reverseParams (line 149) | function reverseParams(iteratorFn) {
function nextUid (line 161) | function nextUid() {
function extend (line 195) | function extend(dst) {
function int (line 206) | function int(str) {
function inherit (line 211) | function inherit(parent, extra) {
function noop (line 231) | function noop() {}
function identity (line 250) | function identity($) {return $;}
function valueFn (line 254) | function valueFn(value) {return function() {return value;};}
function isUndefined (line 267) | function isUndefined(value){return typeof value == 'undefined';}
function isDefined (line 281) | function isDefined(value){return typeof value != 'undefined';}
function isObject (line 296) | function isObject(value){return value != null && typeof value == 'object';}
function isString (line 310) | function isString(value){return typeof value == 'string';}
function isNumber (line 324) | function isNumber(value){return typeof value == 'number';}
function isDate (line 338) | function isDate(value){
function isArray (line 354) | function isArray(value) {
function isFunction (line 370) | function isFunction(value){return typeof value == 'function';}
function isWindow (line 380) | function isWindow(obj) {
function isScope (line 385) | function isScope(obj) {
function isFile (line 390) | function isFile(obj) {
function isBoolean (line 395) | function isBoolean(value) {
function trim (line 400) | function trim(value) {
function isElement (line 415) | function isElement(node) {
function makeMap (line 425) | function makeMap(str){
function map (line 446) | function map(obj, iterator, context) {
function size (line 467) | function size(obj, ownPropsOnly) {
function includes (line 482) | function includes(array, obj) {
function indexOf (line 486) | function indexOf(array, obj) {
function arrayRemove (line 495) | function arrayRemove(array, value) {
function isLeafNode (line 502) | function isLeafNode (node) {
function copy (line 536) | function copy(source, destination){
function shallowCopy (line 573) | function shallowCopy(src, dst) {
function equals (line 610) | function equals(o1, o2) {
function concat (line 646) | function concat(array1, array2, index) {
function sliceArgs (line 650) | function sliceArgs(args, startIndex) {
function bind (line 670) | function bind(self, fn) {
function toJsonReplacer (line 691) | function toJsonReplacer(key, value) {
function toJson (line 720) | function toJson(obj, pretty) {
function fromJson (line 736) | function fromJson(json) {
function toBoolean (line 743) | function toBoolean(value) {
function startingTag (line 756) | function startingTag(element) {
function parseKeyValue (line 775) | function parseKeyValue(/**string*/keyValue) {
function toKeyValue (line 787) | function toKeyValue(obj) {
function encodeUriSegment (line 807) | function encodeUriSegment(val) {
function encodeUriQuery (line 826) | function encodeUriQuery(val, pctEncodeSpaces) {
function angularInit (line 864) | function angularInit(element, bootstrap) {
function bootstrap (line 920) | function bootstrap(element, modules) {
function snake_case (line 940) | function snake_case(name, separator){
function bindJQuery (line 947) | function bindJQuery() {
function assertArg (line 971) | function assertArg(arg, name, reason) {
function assertArgFn (line 978) | function assertArgFn(arg, name, acceptArrayAnnotation) {
function setupModuleLoader (line 996) | function setupModuleLoader(window) {
function publishExternalAPI (line 1258) | function publishExternalAPI(angular){
function jqNextId (line 1451) | function jqNextId() { return ++jqId; }
function camelCase (line 1462) | function camelCase(name) {
function JQLitePatchJQueryRemove (line 1478) | function JQLitePatchJQueryRemove(name, dispatchThis) {
function JQLite (line 1517) | function JQLite(element) {
function JQLiteClone (line 1541) | function JQLiteClone(element) {
function JQLiteDealoc (line 1545) | function JQLiteDealoc(element){
function JQLiteUnbind (line 1552) | function JQLiteUnbind(element, type, fn) {
function JQLiteRemoveData (line 1573) | function JQLiteRemoveData(element) {
function JQLiteExpandoStore (line 1587) | function JQLiteExpandoStore(element, key, value) {
function JQLiteData (line 1602) | function JQLiteData(element, key, value) {
function JQLiteHasClass (line 1628) | function JQLiteHasClass(element, selector) {
function JQLiteRemoveClass (line 1633) | function JQLiteRemoveClass(element, selector) {
function JQLiteAddClass (line 1645) | function JQLiteAddClass(element, selector) {
function JQLiteAddNodes (line 1655) | function JQLiteAddNodes(root, elements) {
function JQLiteController (line 1666) | function JQLiteController(element, name) {
function JQLiteInheritedData (line 1670) | function JQLiteInheritedData(element, name, value) {
function trigger (line 1692) | function trigger() {
function getBooleanAttrName (line 1732) | function getBooleanAttrName(element, name) {
function createEventHandler (line 1898) | function createEventHandler(element, events) {
function hashKey (line 2129) | function hashKey(obj) {
function HashMap (line 2150) | function HashMap(array){
function HashQueueMap (line 2186) | function HashQueueMap() {}
function annotate (line 2258) | function annotate(fn) {
function createInjector (line 2611) | function createInjector(modulesToLoad) {
function $AnchorScrollProvider (line 2833) | function $AnchorScrollProvider() {
function Browser (line 2906) | function Browser(window, document, $log, $sniffer) {
function $BrowserProvider (line 3238) | function $BrowserProvider(){
function $CacheFactoryProvider (line 3267) | function $CacheFactoryProvider() {
function $TemplateCacheProvider (line 3407) | function $TemplateCacheProvider() {
function $CompileProvider (line 3577) | function $CompileProvider($provide) {
function directiveNormalize (line 4492) | function directiveNormalize(name) {
function nodesetLinkingFn (line 4539) | function nodesetLinkingFn(
function directiveLinkingFn (line 4546) | function directiveLinkingFn(
function $ControllerProvider (line 4564) | function $ControllerProvider() {
function $DocumentProvider (line 4634) | function $DocumentProvider(){
function $ExceptionHandlerProvider (line 4657) | function $ExceptionHandlerProvider() {
function $InterpolateProvider (line 4674) | function $InterpolateProvider() {
function encodePath (line 4820) | function encodePath(path) {
function stripHash (line 4831) | function stripHash(url) {
function matchUrl (line 4836) | function matchUrl(url, obj) {
function composeProtocolHostPort (line 4858) | function composeProtocolHostPort(protocol, host, port) {
function pathPrefixFromBase (line 4863) | function pathPrefixFromBase(basePath) {
function convertToHtml5Url (line 4868) | function convertToHtml5Url(url, basePath, hashPrefix) {
function convertToHashbangUrl (line 4883) | function convertToHashbangUrl(url, basePath, hashPrefix) {
function LocationUrl (line 4914) | function LocationUrl(url, pathPrefix, appBaseUrl) {
function LocationHashbangUrl (line 4969) | function LocationHashbangUrl(url, hashPrefix, appBaseUrl) {
function LocationHashbangInHtml5Url (line 5207) | function LocationHashbangInHtml5Url(url, hashPrefix, appBaseUrl, baseExt...
function locationGetter (line 5220) | function locationGetter(property) {
function locationGetterSetter (line 5227) | function locationGetterSetter(property, preprocess) {
function $LocationProvider (line 5275) | function $LocationProvider(){
function $LogProvider (line 5459) | function $LogProvider(){
function lex (line 5566) | function lex(text, csp){
function parser (line 5800) | function parser(text, json, $filter, csp){
function setter (line 6180) | function setter(obj, path, setValue) {
function getter (line 6203) | function getter(obj, path, bindFnToScope) {
function cspSafeGetterFn (line 6229) | function cspSafeGetterFn(key0, key1, key2, key3, key4) {
function getterFn (line 6293) | function getterFn(path, csp) {
function $ParseProvider (line 6379) | function $ParseProvider() {
function $QProvider (line 6521) | function $QProvider() {
function qFactory (line 6539) | function qFactory(nextTick, exceptionHandler) {
function $RouteProvider (line 6796) | function $RouteProvider(){
function $RouteParamsProvider (line 7260) | function $RouteParamsProvider() {
function $RootScopeProvider (line 7322) | function $RootScopeProvider(){
function $SnifferProvider (line 8065) | function $SnifferProvider() {
function $WindowProvider (line 8121) | function $WindowProvider(){
function parseHeaders (line 8131) | function parseHeaders(headers) {
function headersGetter (line 8166) | function headersGetter(headers) {
function transformData (line 8191) | function transformData(data, headers, fns) {
function isSuccess (line 8203) | function isSuccess(status) {
function $HttpProvider (line 8208) | function $HttpProvider() {
function $HttpBackendProvider (line 8913) | function $HttpBackendProvider() {
function createHttpBackend (line 8920) | function createHttpBackend($browser, XHR, $browserDefer, callbacks, rawD...
function $LocaleProvider (line 9025) | function $LocaleProvider(){
function $TimeoutProvider (line 9086) | function $TimeoutProvider() {
function $FilterProvider (line 9246) | function $FilterProvider($provide) {
function filterFilter (line 9353) | function filterFilter() {
function currencyFilter (line 9478) | function currencyFilter($locale) {
function numberFilter (line 9535) | function numberFilter($locale) {
function formatNumber (line 9544) | function formatNumber(number, pattern, groupSep, decimalSep, fractionSiz...
function padNumber (line 9604) | function padNumber(num, digits, trim) {
function dateGetter (line 9618) | function dateGetter(name, size, offset, trim) {
function dateStrGetter (line 9628) | function dateStrGetter(name, shortForm) {
function timeZoneGetter (line 9637) | function timeZoneGetter(date) {
function ampmGetter (line 9642) | function ampmGetter(date, formats) {
function dateFilter (line 9753) | function dateFilter($locale) {
function jsonFilter (line 9848) | function jsonFilter() {
function limitToFilter (line 9929) | function limitToFilter(){
function orderByFilter (line 10049) | function orderByFilter($parse){
function ngDirective (line 10098) | function ngDirective(directive) {
function FormController (line 10482) | function FormController(element, attrs) {
function isEmpty (line 11074) | function isEmpty(value) {
function textInputType (line 11079) | function textInputType(scope, element, attr, ctrl, $sniffer, $browser) {
function numberInputType (line 11192) | function numberInputType(scope, element, attr, ctrl, $sniffer, $browser) {
function urlInputType (line 11254) | function urlInputType(scope, element, attr, ctrl, $sniffer, $browser) {
function emailInputType (line 11271) | function emailInputType(scope, element, attr, ctrl, $sniffer, $browser) {
function radioInputType (line 11288) | function radioInputType(scope, element, attr, ctrl) {
function checkboxInputType (line 11310) | function checkboxInputType(scope, element, attr, ctrl) {
function toggleValidCss (line 11611) | function toggleValidCss(isValid, validationErrorKey) {
function classDirective (line 12101) | function classDirective(name, selector) {
function destroyLastScope (line 13665) | function destroyLastScope() {
function clearContent (line 13672) | function clearContent() {
function update (line 13677) | function update() {
function Single (line 13988) | function Single(scope, selectElement, ngModelCtrl, selectCtrl) {
function Multiple (line 14013) | function Multiple(scope, selectElement, ctrl) {
function Options (line 14044) | function Options(scope, selectElement, ctrl) {
FILE: servers/www/assets/js/vendor/beautify.js
function style_html (line 39) | function style_html(html_source, options) {
FILE: servers/www/assets/js/vendor/handlebars.js
function popStack (line 207) | function popStack(n) {
function lex (line 212) | function lex() {
function compile (line 1471) | function compile() {
FILE: servers/www/assets/js/vendor/jquery.js
function jQuerySub (line 897) | function jQuerySub( selector, context ) {
function doScrollCheck (line 963) | function doScrollCheck() {
function createFlags (line 990) | function createFlags( flags ) {
function resolveFunc (line 1325) | function resolveFunc( i ) {
function progressFunc (line 1333) | function progressFunc( i ) {
function dataAttr (line 1985) | function dataAttr( elem, key, data ) {
function isEmptyDataObject (line 2016) | function isEmptyDataObject( obj ) {
function handleQueueMarkDefer (line 2034) | function handleQueueMarkDefer( elem, type, src ) {
function resolve (line 2193) | function resolve() {
function returnFalse (line 3546) | function returnFalse() {
function returnTrue (line 3549) | function returnTrue() {
function dirNodeCheck (line 5260) | function dirNodeCheck( dir, cur, doneName, checkSet, nodeCheck, isXML ) {
function dirCheck (line 5293) | function dirCheck( dir, cur, doneName, checkSet, nodeCheck, isXML ) {
function isDisconnected (line 5566) | function isDisconnected( node ) {
function winnow (line 5683) | function winnow( elements, qualifier, keep ) {
function createSafeFragment (line 5720) | function createSafeFragment( document ) {
function root (line 6092) | function root( elem, cur ) {
function cloneCopyEvent (line 6099) | function cloneCopyEvent( src, dest ) {
function cloneFixAttributes (line 6127) | function cloneFixAttributes( src, dest ) {
function getAll (line 6272) | function getAll( elem ) {
function fixDefaultChecked (line 6285) | function fixDefaultChecked( elem ) {
function findInputs (line 6291) | function findInputs( elem ) {
function shimCloneNode (line 6302) | function shimCloneNode( elem ) {
function getWidthOrHeight (line 6793) | function getWidthOrHeight( elem, name, extra ) {
function addToPrefiltersOrTransports (line 7034) | function addToPrefiltersOrTransports( structure ) {
function inspectPrefiltersOrTransports (line 7070) | function inspectPrefiltersOrTransports( structure, options, originalOpti...
function ajaxExtend (line 7112) | function ajaxExtend( target, src ) {
function done (line 7454) | function done( status, nativeStatusText, responses, headers ) {
function buildParams (line 7769) | function buildParams( prefix, obj, traditional, add ) {
function ajaxHandleResponses (line 7819) | function ajaxHandleResponses( s, jqXHR, responses ) {
function ajaxConvert (line 7884) | function ajaxConvert( s, response ) {
function createStandardXHR (line 8149) | function createStandardXHR() {
function createActiveXHR (line 8155) | function createActiveXHR() {
function doAnimation (line 8494) | function doAnimation() {
function stopQueue (line 8650) | function stopQueue( elem, data, index ) {
function createFxNow (line 8692) | function createFxNow() {
function clearFxNow (line 8697) | function clearFxNow() {
function genFx (line 8702) | function genFx( type, num ) {
function t (line 8817) | function t( gotoEnd ) {
function defaultDisplay (line 9015) | function defaultDisplay( nodeName ) {
function getWindow (line 9299) | function getWindow( elem ) {
FILE: servers/www/assets/js/vendor/jquery.layout.js
function isStr (line 36) | function isStr (v) { return $.type(v) === "string"; }
function runPluginCallbacks (line 38) | function runPluginCallbacks (Instance, a_fn) {
function createLog (line 601) | function createLog () {
function getBranch (line 893) | function getBranch (path, create) {
function createFxOptions (line 1835) | function createFxOptions ( pane ) {
function close_2 (line 2996) | function close_2 () {
function open_2 (line 3175) | function open_2 () {
function open_NOW (line 3296) | function open_NOW () {
function close_NOW (line 3329) | function close_NOW () {
function cancelMouseOut (line 3465) | function cancelMouseOut (evt) {
function sizePane_2 (line 3663) | function sizePane_2 () {
function _below (line 4016) | function _below ($E) {
function _measure (line 4020) | function _measure () {
function copy (line 4354) | function copy (n) { // n = pane
function move (line 4368) | function move (oPane, pane) {
function keyDown (line 4460) | function keyDown (evt) {
function allowOverflow (line 4518) | function allowOverflow (el) {
function resetOverflow (line 4587) | function resetOverflow (el) {
function parse (line 4999) | function parse (h) {
function calc (line 5442) | function calc (x,y) { return (parseInt(x,10) / parseInt(y,10) * 100).toF...
FILE: servers/www/assets/js/vendor/jquery.lazyload.js
function update (line 33) | function update() {
FILE: servers/www/assets/js/vendor/jquery.timeago.js
function substitute (line 69) | function substitute(stringOrFunction, number) {
function refresh (line 117) | function refresh() {
function prepareData (line 125) | function prepareData(element) {
function inWords (line 137) | function inWords(date) {
function distance (line 141) | function distance(date) {
FILE: servers/www/assets/js/vendor/jquery.ui.custom.js
function reduce (line 144) | function reduce( elem, size, border, margin ) {
function focusable (line 179) | function focusable( element, isTabIndexNotNaN ) {
function visible (line 200) | function visible( element ) {
FILE: servers/www/assets/js/vendor/noty/jquery.noty.js
function F (line 14) | function F() {
function noty (line 416) | function noty(options) {
FILE: servers/www/assets/js/vendor/noty/promise.js
function createFlags (line 27) | function createFlags( flags ) {
function resolve (line 167) | function resolve() {
function handleQueueMarkDefer (line 186) | function handleQueueMarkDefer( elem, type, src ) {
function resolve (line 414) | function resolve() {
FILE: servers/www/assets/js/vendor/page.js
function page (line 30) | function page(path, fn) {
function next (line 138) | function next() {
function unhandled (line 156) | function unhandled(ctx) {
function Context (line 172) | function Context(path, state) {
function Route (line 206) | function Route(path, options) {
function pathtoRegexp (line 285) | function pathtoRegexp(path, keys, sensitive, strict) {
function onpopstate (line 312) | function onpopstate(e) {
function onclick (line 325) | function onclick(e) {
function sameOrigin (line 344) | function sameOrigin(href) {
FILE: servers/www/assets/js/vendor/postmessage.js
function sendReply (line 241) | function sendReply ( data ) {
function sendReply (line 388) | function sendReply ( data ) {
function f (line 438) | function f(n){return n<10?"0"+n:n}
function quote (line 438) | function quote(string){escapable.lastIndex=0;return escapable.test(strin...
function str (line 438) | function str(key,holder){var i,k,v,length,mind=gap,partial,value=holder[...
function walk (line 438) | function walk(holder,key){var k,v,value=holder[key];if(value&&typeof val...
FILE: servers/www/assets/js/vendor/prettify.js
function L (line 2) | function L(a){function m(a){var f=a.charCodeAt(0);if(f!==92)return f;var...
function M (line 6) | function M(a){function m(a){switch(a.nodeType){case 1:if(e.test(a.classN...
function B (line 7) | function B(a,m,e,h){m&&(a={a:m,d:a},e(a),h.push.apply(h,a.e))}
function x (line 7) | function x(a,m){function e(a){for(var l=a.d,p=[l,"pln"],d=0,g=a.a.match(...
function u (line 9) | function u(a){var m=[],e=[];a.tripleQuotedStrings?m.push(["str",/^(?:'''...
function D (line 12) | function D(a,m){function e(a){switch(a.nodeType){case 1:if(k.test(a.clas...
function k (line 15) | function k(a,m){for(var e=m.length;--e>=0;){var h=m[e];A.hasOwnProperty(...
function C (line 15) | function C(a,m){if(!a||!A.hasOwnProperty(a))a=/^\s*</.test(m)?"default-m...
function E (line 15) | function E(a){var m=
function m (line 25) | function m(){for(var e=window.PR_SHOULD_USE_CONTINUATION?l.now()+250:Inf...
FILE: servers/www/assets/js/vendor/semver.js
function stringify (line 58) | function stringify (version) {
function clean (line 63) | function clean (version) {
function valid (line 69) | function valid (version) {
function validPackage (line 74) | function validPackage (version) {
function toComparators (line 91) | function toComparators (range) {
function replaceStars (line 116) | function replaceStars (stars) {
function replaceXRanges (line 122) | function replaceXRanges (ranges) {
function replaceXRange (line 128) | function replaceXRange (version) {
function replaceSpermies (line 163) | function replaceSpermies (version) {
function validRange (line 186) | function validRange (range) {
function maxSatisfying (line 195) | function maxSatisfying (versions, range) {
function satisfies (line 201) | function satisfies (version, range) {
function compare (line 226) | function compare (v1, v2) {
function rcompare (line 231) | function rcompare (v1, v2) {
function lt (line 235) | function lt (v1, v2) { return gt(v2, v1) }
function gte (line 236) | function gte (v1, v2) { return !lt(v1, v2) }
function lte (line 237) | function lte (v1, v2) { return !gt(v1, v2) }
function eq (line 238) | function eq (v1, v2) { return gt(v1, v2) === null }
function neq (line 239) | function neq (v1, v2) { return gt(v1, v2) !== null }
function cmp (line 240) | function cmp (v1, c, v2) {
function num (line 255) | function num (v) {
function gt (line 258) | function gt (v1, v2) {
function inc (line 281) | function inc (version, release) {
FILE: servers/www/assets/js/vendor/showdown.js
function headerId (line 698) | function headerId(m) {
function char2hex (line 1212) | function char2hex(ch) {
FILE: servers/www/assets/js/vendor/underscore.js
function eq (line 682) | function eq(a, b, stack) {
Condensed preview — 360 files, each showing path, character count, and a content snippet. Download the .json file or copy for the full structured content (9,703K chars).
[
{
"path": ".gitignore",
"chars": 142,
"preview": "lib-cov\n*.seed\n*.log\n*.csv\n*.dat\n*.out\n*.pid\n*.gz\n\npids\nlogs\nresults\ntests\n\nconfig.json\n\nnode_modules\nnpm-debug.log\n\n.c9"
},
{
"path": ".gitmodules",
"chars": 122,
"preview": "[submodule \"servers/www/assets/select2\"]\n\tpath = servers/www/assets/select2\n\turl = git://github.com/ivaynberg/select2.gi"
},
{
"path": "LICENSE",
"chars": 1071,
"preview": "Copyright (C) 2015 Filearts\r\n\r\nPermission is hereby granted, free of charge, to any person obtaining a copy of\r\nthis sof"
},
{
"path": "README.md",
"chars": 3718,
"preview": "# Plunker\n\n[](https://gitter.im/filearts/plunker?utm_source=badge&utm"
},
{
"path": "config.sample.json",
"chars": 476,
"preview": "{\r\n \"host\": \"localhost\", // (Required) The hostname at which Plunk will be run\r\n \"nosubdomains\": true, // Run Plunker "
},
{
"path": "package.json",
"chars": 771,
"preview": "{\n \"name\": \"plunker\",\n \"subdomain\": \"plunker\",\n \"scripts\": {\n \"start\": \"server.js\"\n },\n \"engines\": {\n \"node\":"
},
{
"path": "server.js",
"chars": 1478,
"preview": "// Everything starts better with coffee\nvar coffee = require(\"coffee-script\");\nvar express = require(\"express\");\n\n\nvar n"
},
{
"path": "servers/api/.gitignore",
"chars": 148,
"preview": "lib-cov\r\n*.seed\r\n*.log\r\n*.csv\r\n*.dat\r\n*.out\r\n*.pid\r\n*.gz\r\n\r\npids\r\nlogs\r\nresults\r\ntests\r\n\r\nnode_modules\r\nnpm-debug.log\r\n\r"
},
{
"path": "servers/api/.npmignore",
"chars": 148,
"preview": "lib-cov\r\n*.seed\r\n*.log\r\n*.csv\r\n*.dat\r\n*.out\r\n*.pid\r\n*.gz\r\n\r\npids\r\nlogs\r\nresults\r\ntests\r\n\r\nnode_modules\r\nnpm-debug.log\r\n\r"
},
{
"path": "servers/api/errors.coffee",
"chars": 707,
"preview": "class APIError extends Error\n toJSON: -> {@code, @message}\n\nmodule.exports =\n ParseError: class extends APIError\n c"
},
{
"path": "servers/api/index.coffee",
"chars": 19953,
"preview": "nconf = require(\"nconf\")\r\nrequest = require(\"request\")\r\nmime = require(\"mime\")\r\nexpress = require(\"express\")\r\nurl = requ"
},
{
"path": "servers/api/lib/database.coffee",
"chars": 4300,
"preview": "mongoose = require(\"mongoose\")\nnconf = require(\"nconf\")\nmime = require(\"mime\")\nurl = require(\"url\")\nmime = require(\"mime"
},
{
"path": "servers/api/middleware/cache.coffee",
"chars": 162,
"preview": "module.exports.middleware = (config = {}) ->\r\n (req, res, next) ->\r\n res.header(\"Cache-Control\", \"no-cache\")\r\n re"
},
{
"path": "servers/api/middleware/cors.coffee",
"chars": 1044,
"preview": "nconf = require(\"nconf\")\n\nmodule.exports.middleware = (config = {}) ->\n \n valid = [nconf.get('url:www'), nconf.get('ur"
},
{
"path": "servers/api/middleware/json.coffee",
"chars": 480,
"preview": "apiErrors = require(\"../errors\")\r\n\r\n\r\nmodule.exports.middleware = (config = {}) ->\r\n (req, res, next) ->\r\n if \"GET\" "
},
{
"path": "servers/api/middleware/session.coffee",
"chars": 738,
"preview": "nconf = require(\"nconf\")\r\n\r\nmodule.exports.middleware = (config = {}) ->\r\n (req, res, next) ->\r\n if req.query.sessid"
},
{
"path": "servers/api/middleware/user.coffee",
"chars": 355,
"preview": "module.exports.middleware = (config = {}) ->\r\n (req, res, next) ->\r\n unless req.session and req.session.user then ne"
},
{
"path": "servers/api/package.json",
"chars": 644,
"preview": "{\n \"name\": \"plunker-api\",\n \"subdomain\": \"plunker-api\",\n \"domains\": [\n \"api.plnkr.co\"\n ],\n \"scripts\": {\n \"star"
},
{
"path": "servers/api/schema/packages/create.json",
"chars": 1440,
"preview": "{\r\n \"type\": \"object\",\r\n \"additionalProperties\": false,\r\n \"properties\": {\r\n \"name\": {\r\n \"type\": \"string\",\r\n "
},
{
"path": "servers/api/schema/packages/update.json",
"chars": 498,
"preview": "{\r\n \"type\": \"object\",\r\n \"additionalProperties\": false,\r\n \"properties\": {\r\n \"name\": {\r\n \"type\": \"string\"\r\n "
},
{
"path": "servers/api/schema/plunks/create.json",
"chars": 1404,
"preview": "{\r\n \"type\": \"object\",\r\n \"additionalProperties\": false,\r\n \"properties\": {\r\n \"description\": {\r\n \"type\": \"string"
},
{
"path": "servers/api/schema/plunks/update.json",
"chars": 977,
"preview": "{\r\n \"type\": \"object\",\r\n \"additionalProperties\": false,\r\n \"minProperties\": 1,\r\n \"properties\": {\r\n \"description\": {"
},
{
"path": "servers/api/server.js",
"chars": 1217,
"preview": "// Everything starts better with coffee\r\nvar coffee = require(\"coffee-script\");\r\nvar express = require(\"express\");\r\n\r\n\r\n"
},
{
"path": "servers/embed/.gitignore",
"chars": 148,
"preview": "lib-cov\r\n*.seed\r\n*.log\r\n*.csv\r\n*.dat\r\n*.out\r\n*.pid\r\n*.gz\r\n\r\npids\r\nlogs\r\nresults\r\ntests\r\n\r\nnode_modules\r\nnpm-debug.log\r\n\r"
},
{
"path": "servers/embed/assets/bootstrap/js/bootstrap-affix.js",
"chars": 3205,
"preview": "/* ==========================================================\n * bootstrap-affix.js v2.1.0\n * http://twitter.github.com/"
},
{
"path": "servers/embed/assets/bootstrap/js/bootstrap-alert.js",
"chars": 2392,
"preview": "/* ==========================================================\n * bootstrap-alert.js v2.1.0\n * http://twitter.github.com/"
},
{
"path": "servers/embed/assets/bootstrap/js/bootstrap-all.js",
"chars": 94,
"preview": "//= require bootstrap-transition\r\n//= require bootstrap-button\r\n//= require bootstrap-dropdown"
},
{
"path": "servers/embed/assets/bootstrap/js/bootstrap-button.js",
"chars": 2713,
"preview": "/* ============================================================\n * bootstrap-button.js v2.1.0\n * http://twitter.github.c"
},
{
"path": "servers/embed/assets/bootstrap/js/bootstrap-carousel.js",
"chars": 5270,
"preview": "/* ==========================================================\n * bootstrap-carousel.js v2.1.0\n * http://twitter.github.c"
},
{
"path": "servers/embed/assets/bootstrap/js/bootstrap-collapse.js",
"chars": 4500,
"preview": "/* =============================================================\n * bootstrap-collapse.js v2.1.0\n * http://twitter.githu"
},
{
"path": "servers/embed/assets/bootstrap/js/bootstrap-dropdown.js",
"chars": 3948,
"preview": "/* ============================================================\n * bootstrap-dropdown.js v2.1.0\n * http://twitter.github"
},
{
"path": "servers/embed/assets/bootstrap/js/bootstrap-modal.js",
"chars": 6490,
"preview": "/* =========================================================\n * bootstrap-modal.js v2.1.0\n * http://twitter.github.com/b"
},
{
"path": "servers/embed/assets/bootstrap/js/bootstrap-popover.js",
"chars": 2993,
"preview": "/* ===========================================================\n * bootstrap-popover.js v2.1.0\n * http://twitter.github.c"
},
{
"path": "servers/embed/assets/bootstrap/js/bootstrap-scrollspy.js",
"chars": 4401,
"preview": "/* =============================================================\n * bootstrap-scrollspy.js v2.1.0\n * http://twitter.gith"
},
{
"path": "servers/embed/assets/bootstrap/js/bootstrap-tab.js",
"chars": 3382,
"preview": "/* ========================================================\n * bootstrap-tab.js v2.1.0\n * http://twitter.github.com/boot"
},
{
"path": "servers/embed/assets/bootstrap/js/bootstrap-tooltip.js",
"chars": 7696,
"preview": "/* ===========================================================\n * bootstrap-tooltip.js v2.1.0\n * http://twitter.github.c"
},
{
"path": "servers/embed/assets/bootstrap/js/bootstrap-transition.js",
"chars": 1762,
"preview": "/* ===================================================\n * bootstrap-transition.js v2.1.0\n * http://twitter.github.com/bo"
},
{
"path": "servers/embed/assets/bootstrap/js/bootstrap-typeahead.js",
"chars": 7464,
"preview": "/* =============================================================\n * bootstrap-typeahead.js v2.1.0\n * http://twitter.gith"
},
{
"path": "servers/embed/assets/bootstrap/less/accordion.less",
"chars": 622,
"preview": "//\n// Accordion\n// --------------------------------------------------\n\n\n// Parent container\n.accordion {\n margin-bottom"
},
{
"path": "servers/embed/assets/bootstrap/less/alerts.less",
"chars": 1116,
"preview": "//\n// Alerts\n// --------------------------------------------------\n\n\n// Base styles\n// -------------------------\n\n.alert"
},
{
"path": "servers/embed/assets/bootstrap/less/bootstrap.less",
"chars": 1472,
"preview": "/*!\n * Bootstrap v2.1.0\n *\n * Copyright 2012 Twitter, Inc\n * Licensed under the Apache License v2.0\n * http://www.apache"
},
{
"path": "servers/embed/assets/bootstrap/less/breadcrumbs.less",
"chars": 403,
"preview": "//\n// Breadcrumbs\n// --------------------------------------------------\n\n\n.breadcrumb {\n padding: 8px 15px;\n margin: 0"
},
{
"path": "servers/embed/assets/bootstrap/less/button-groups.less",
"chars": 6099,
"preview": "//\n// Button groups\n// --------------------------------------------------\n\n\n// Make the div behave like a button\n.btn-gr"
},
{
"path": "servers/embed/assets/bootstrap/less/buttons.less",
"chars": 4718,
"preview": "//\n// Buttons\n// --------------------------------------------------\n\n\n// Base styles\n// --------------------------------"
},
{
"path": "servers/embed/assets/bootstrap/less/carousel.less",
"chars": 1960,
"preview": "//\n// Carousel\n// --------------------------------------------------\n\n\n.carousel {\n position: relative;\n margin-bottom"
},
{
"path": "servers/embed/assets/bootstrap/less/close.less",
"chars": 633,
"preview": "//\n// Close icons\n// --------------------------------------------------\n\n\n.close {\n float: right;\n font-size: 20px;\n "
},
{
"path": "servers/embed/assets/bootstrap/less/code.less",
"chars": 1196,
"preview": "//\n// Code (inline and blocK)\n// --------------------------------------------------\n\n\n// Inline and block code styles\nco"
},
{
"path": "servers/embed/assets/bootstrap/less/component-animations.less",
"chars": 330,
"preview": "//\n// Component animations\n// --------------------------------------------------\n\n\n.fade {\n opacity: 0;\n .transition(o"
},
{
"path": "servers/embed/assets/bootstrap/less/dropdowns.less",
"chars": 4862,
"preview": "//\n// Dropdown menus\n// --------------------------------------------------\n\n\n// Use the .menu class on any <li> element "
},
{
"path": "servers/embed/assets/bootstrap/less/font-awesome.less",
"chars": 17228,
"preview": "/* Font Awesome\n the iconic font designed for use with Twitter Bootstrap\n ---------------------------------------"
},
{
"path": "servers/embed/assets/bootstrap/less/forms.less",
"chars": 14394,
"preview": "//\n// Forms\n// --------------------------------------------------\n\n\n// GENERAL STYLES\n// --------------\n\n// Make all for"
},
{
"path": "servers/embed/assets/bootstrap/less/grid.less",
"chars": 429,
"preview": "//\n// Grid system\n// --------------------------------------------------\n\n\n// Fixed (940px)\n#grid > .core(@gridColumnWidt"
},
{
"path": "servers/embed/assets/bootstrap/less/hero-unit.less",
"chars": 449,
"preview": "//\n// Hero unit\n// --------------------------------------------------\n\n\n.hero-unit {\n padding: 60px;\n margin-bottom: 3"
},
{
"path": "servers/embed/assets/bootstrap/less/labels-badges.less",
"chars": 1717,
"preview": "//\n// Labels and badges\n// --------------------------------------------------\n\n\n// Base classes\n.label,\n.badge {\n font-"
},
{
"path": "servers/embed/assets/bootstrap/less/layouts.less",
"chars": 329,
"preview": "//\n// Layouts\n// --------------------------------------------------\n\n\n// Container (centered, fixed-width layouts)\n.cont"
},
{
"path": "servers/embed/assets/bootstrap/less/mixins.less",
"chars": 21424,
"preview": "//\n// Mixins\n// --------------------------------------------------\n\n\n// UTILITY MIXINS\n// ------------------------------"
},
{
"path": "servers/embed/assets/bootstrap/less/modals.less",
"chars": 2130,
"preview": "//\n// Modals\n// --------------------------------------------------\n\n\n// Recalculate z-index where appropriate\n.modal-ope"
},
{
"path": "servers/embed/assets/bootstrap/less/navbar.less",
"chars": 11250,
"preview": "//\n// Navbars (Redux)\n// --------------------------------------------------\n\n\n// COMMON STYLES\n// -------------\n\n// Base"
},
{
"path": "servers/embed/assets/bootstrap/less/navs.less",
"chars": 7343,
"preview": "//\n// Navs\n// --------------------------------------------------\n\n\n// BASE CLASS\n// ----------\n\n.nav {\n margin-left: 0;"
},
{
"path": "servers/embed/assets/bootstrap/less/pager.less",
"chars": 604,
"preview": "//\n// Pager pagination\n// --------------------------------------------------\n\n\n.pager {\n margin: @baseLineHeight 0;\n l"
},
{
"path": "servers/embed/assets/bootstrap/less/pagination.less",
"chars": 1297,
"preview": "//\n// Pagination (multiple pages)\n// --------------------------------------------------\n\n\n.pagination {\n height: @baseL"
},
{
"path": "servers/embed/assets/bootstrap/less/popovers.less",
"chars": 3015,
"preview": "//\n// Popovers\n// --------------------------------------------------\n\n\n.popover {\n position: absolute;\n top: 0;\n left"
},
{
"path": "servers/embed/assets/bootstrap/less/progress-bars.less",
"chars": 2844,
"preview": "//\n// Progress bars\n// --------------------------------------------------\n\n\n// ANIMATIONS\n// ----------\n\n// Webkit\n@-web"
},
{
"path": "servers/embed/assets/bootstrap/less/reset.less",
"chars": 2596,
"preview": "//\n// Modals\n// Adapted from http://github.com/necolas/normalize.css\n// ------------------------------------------------"
},
{
"path": "servers/embed/assets/bootstrap/less/responsive-1200px-min.less",
"chars": 565,
"preview": "//\n// Responsive: Large desktop and up\n// --------------------------------------------------\n\n\n@media (min-width: 1200px"
},
{
"path": "servers/embed/assets/bootstrap/less/responsive-767px-max.less",
"chars": 3328,
"preview": "//\n// Responsive: Landscape phone to desktop/tablet\n// --------------------------------------------------\n\n\n@media (max-"
},
{
"path": "servers/embed/assets/bootstrap/less/responsive-768px-979px.less",
"chars": 463,
"preview": "//\n// Responsive: Tablet to desktop\n// --------------------------------------------------\n\n\n@media (min-width: 768px) an"
},
{
"path": "servers/embed/assets/bootstrap/less/responsive-navbar.less",
"chars": 3599,
"preview": "//\n// Responsive: Navbar\n// --------------------------------------------------\n\n\n// TABLETS AND BELOW\n// ---------------"
},
{
"path": "servers/embed/assets/bootstrap/less/responsive-utilities.less",
"chars": 1187,
"preview": "//\n// Responsive: Utility classes\n// --------------------------------------------------\n\n\n// Hide from screenreaders and"
},
{
"path": "servers/embed/assets/bootstrap/less/responsive.less",
"chars": 1069,
"preview": "/*!\n * Bootstrap Responsive v2.1.0\n *\n * Copyright 2012 Twitter, Inc\n * Licensed under the Apache License v2.0\n * http:/"
},
{
"path": "servers/embed/assets/bootstrap/less/scaffolding.less",
"chars": 842,
"preview": "//\n// Scaffolding\n// --------------------------------------------------\n\n\n// Body reset\n// -------------------------\n\nbo"
},
{
"path": "servers/embed/assets/bootstrap/less/sprites.less",
"chars": 10315,
"preview": "//\n// Sprites\n// --------------------------------------------------\n\n\n// ICONS\n// -----\n\n// All icons receive the styles"
},
{
"path": "servers/embed/assets/bootstrap/less/tables.less",
"chars": 5760,
"preview": "//\n// Tables\n// --------------------------------------------------\n\n\n// BASE TABLES\n// -----------------\n\ntable {\n max-"
},
{
"path": "servers/embed/assets/bootstrap/less/thumbnails.less",
"chars": 1153,
"preview": "//\n// Thumbnails\n// --------------------------------------------------\n\n\n// Note: `.thumbnails` and `.thumbnails > li` a"
},
{
"path": "servers/embed/assets/bootstrap/less/tooltip.less",
"chars": 1606,
"preview": "//\n// Tooltips\n// --------------------------------------------------\n\n\n// Base class\n.tooltip {\n position: absolute;\n "
},
{
"path": "servers/embed/assets/bootstrap/less/type.less",
"chars": 3437,
"preview": "//\n// Typography\n// --------------------------------------------------\n\n\n// Body text\n// -------------------------\n\np {\n"
},
{
"path": "servers/embed/assets/bootstrap/less/utilities.less",
"chars": 335,
"preview": "//\n// Utility classes\n// --------------------------------------------------\n\n\n// Quick floats\n.pull-right {\n float: rig"
},
{
"path": "servers/embed/assets/bootstrap/less/variables.less",
"chars": 8378,
"preview": "//\n// Variables\n// --------------------------------------------------\n\n\n// Global values\n// ----------------------------"
},
{
"path": "servers/embed/assets/bootstrap/less/wells.less",
"chars": 508,
"preview": "//\n// Wells\n// --------------------------------------------------\n\n\n// Base class\n.well {\n min-height: 20px;\n padding:"
},
{
"path": "servers/embed/assets/css/components/navbar.less",
"chars": 451,
"preview": ".navbar {\r\n .navbar-inner {\r\n padding: 0 8px;\r\n min-height: 30px;\r\n }\r\n \r\n .brand {\r\n background: rgba(0,0,"
},
{
"path": "servers/embed/assets/css/pages/embed.less",
"chars": 1266,
"preview": "@import \"../../bootstrap/less/bootstrap\";\r\n\r\n@import \"../components/navbar\";\r\n\r\n@import \"../vendor/prettify\";\r\n\r\n#embed "
},
{
"path": "servers/embed/assets/css/vendor/prettify.less",
"chars": 844,
"preview": ".com { color: #93a1a1; }\r\n.lit { color: #195f91; }\r\n.pun, .opn, .clo { color: #93a1a1; }\r\n.fun { color: #dc322f; }\r\n.str"
},
{
"path": "servers/embed/assets/js/pages/embed.coffee",
"chars": 3158,
"preview": "#= require ../vendor/showdown\r\n#= require ../vendor/prettify\r\n#= require ../vendor/overthrow\r\n\r\n#= require ../services/i"
},
{
"path": "servers/embed/assets/js/services/importer.coffee",
"chars": 2135,
"preview": "#= require ../services/plunks\r\n\r\nplunkerRegex = ///\r\n ^\r\n \\s* # Leading whitespace\r\n (?:plunk:)"
},
{
"path": "servers/embed/assets/js/services/plunks.coffee",
"chars": 6815,
"preview": "#= require ../vendor/jquery.cookie\n\n#= require ../services/url\n\nmodule = angular.module(\"plunker.plunks\", [\"plunker.url\""
},
{
"path": "servers/embed/assets/js/services/url.coffee",
"chars": 165,
"preview": "\nmodule = angular.module(\"plunker.url\", [])\n\nmodule.service \"url\", [ ->\n if _plunker and _plunker.url then _plunker.url"
},
{
"path": "servers/embed/assets/js/vendor/angular-sanitize.js",
"chars": 17880,
"preview": "/**\r\n * @license AngularJS v1.0.1\r\n * (c) 2010-2012 Google, Inc. http://angularjs.org\r\n * License: MIT\r\n */\r\n(function(w"
},
{
"path": "servers/embed/assets/js/vendor/angular-ui.js",
"chars": 2951,
"preview": "/**\r\n * AngularUI for AngularJS\r\n * v0.1.0\r\n * \r\n * @link http://angular-ui.github.com/\r\n */\r\n\r\nangular.module('ui.confi"
},
{
"path": "servers/embed/assets/js/vendor/angular.js",
"chars": 487581,
"preview": "/**\r\n * @license AngularJS v1.0.1\r\n * (c) 2010-2012 Google, Inc. http://angularjs.org\r\n * License: MIT\r\n */\r\n(function(w"
},
{
"path": "servers/embed/assets/js/vendor/jquery.cookie.js",
"chars": 1986,
"preview": "/*!\r\n * jQuery Cookie Plugin\r\n * https://github.com/carhartl/jquery-cookie\r\n *\r\n * Copyright 2011, Klaus Hartl\r\n * Dual "
},
{
"path": "servers/embed/assets/js/vendor/jquery.js",
"chars": 262284,
"preview": "/*!\r\n * jQuery JavaScript Library v1.7.2\r\n * http://jquery.com/\r\n *\r\n * Copyright 2011, John Resig\r\n * Dual licensed und"
},
{
"path": "servers/embed/assets/js/vendor/overthrow.js",
"chars": 13743,
"preview": "/*! Overthrow v.0.1.0. An overflow:auto polyfill for responsive design. (c) 2012: Scott Jehl, Filament Group, Inc. http:"
},
{
"path": "servers/embed/assets/js/vendor/prettify.js",
"chars": 13658,
"preview": "var q=null;window.PR_SHOULD_USE_CONTINUATION=!0;\r\n(function(){function L(a){function m(a){var f=a.charCodeAt(0);if(f!==9"
},
{
"path": "servers/embed/assets/js/vendor/showdown.js",
"chars": 36503,
"preview": "//\r\n// showdown.js -- A javascript port of Markdown.\r\n//\r\n// Copyright (c) 2007 John Fraser.\r\n//\r\n// Original Markdown C"
},
{
"path": "servers/embed/index.coffee",
"chars": 1225,
"preview": "coffee = require(\"coffee-script\")\r\nless = require(\"less\")\r\njade = require(\"jade\")\r\nexpress = require(\"express\")\r\ngzippo "
},
{
"path": "servers/embed/middleware/expose.coffee",
"chars": 132,
"preview": "module.exports.middleware = (options = {}) ->\n (req, res, next) ->\n res.locals[key] = value for key, value of option"
},
{
"path": "servers/embed/package.json",
"chars": 452,
"preview": "{\n \"name\": \"plunker-embed\",\n \"subdomain\": \"plunker-embed\",\n \"domains\": [\n \"embed.plnkr.co\"\n ],\n \"scripts\": {\n "
},
{
"path": "servers/embed/server.js",
"chars": 1331,
"preview": "// Everything starts better with coffee\r\nvar coffee = require(\"coffee-script\");\r\nvar express = require(\"express\");\r\n\r\n\r\n"
},
{
"path": "servers/embed/views/embed.jade",
"chars": 3560,
"preview": "!!! 5\r\nhtml(ng-app=\"plunker.embed\")\r\n head\r\n meta(charset=\"utf-8\")\r\n meta(name=\"viewport\",content=\"width=device-w"
},
{
"path": "servers/raw/.gitignore",
"chars": 148,
"preview": "lib-cov\r\n*.seed\r\n*.log\r\n*.csv\r\n*.dat\r\n*.out\r\n*.pid\r\n*.gz\r\n\r\npids\r\nlogs\r\nresults\r\ntests\r\n\r\nnode_modules\r\nnpm-debug.log\r\n\r"
},
{
"path": "servers/raw/index.coffee",
"chars": 1450,
"preview": "express = require(\"express\")\r\nrequest = require(\"request\")\r\nnconf = require(\"nconf\")\r\nurl = require(\"url\")\r\n\r\nmodule.exp"
},
{
"path": "servers/raw/package.json",
"chars": 371,
"preview": "{\n \"name\": \"plunker-raw\",\n \"subdomain\": \"plunker-raw\",\n \"domains\": [\n \"raw.plnkr.co\"\n ],\n \"scripts\": {\n \"star"
},
{
"path": "servers/raw/server.js",
"chars": 1326,
"preview": "// Everything starts better with coffee\r\nvar coffee = require(\"coffee-script\");\r\nvar express = require(\"express\");\r\n\r\n\r\n"
},
{
"path": "servers/raw/views/directory.jade",
"chars": 1135,
"preview": "!!! 5\r\nhtml\r\n head\r\n title #{plunk.description}\r\n link(href=\"http://twitter.github.com/bootstrap/assets/css/boots"
},
{
"path": "servers/run/.gitignore",
"chars": 148,
"preview": "lib-cov\r\n*.seed\r\n*.log\r\n*.csv\r\n*.dat\r\n*.out\r\n*.pid\r\n*.gz\r\n\r\npids\r\nlogs\r\nresults\r\ntests\r\n\r\nnode_modules\r\nnpm-debug.log\r\n\r"
},
{
"path": "servers/run/index.coffee",
"chars": 5847,
"preview": "express = require(\"express\")\r\nnconf = require(\"nconf\")\r\n_ = require(\"underscore\")._\r\nvalidator = require(\"json-schema\")\r"
},
{
"path": "servers/run/middleware/cors.coffee",
"chars": 898,
"preview": "module.exports.middleware = (config = {}) ->\n (req, res, next) ->\n # Just send the headers all the time. That way we"
},
{
"path": "servers/run/middleware/json.coffee",
"chars": 419,
"preview": "module.exports.middleware = (config = {}) ->\r\n (req, res, next) ->\r\n if \"GET\" == req.method or \"HEAD\" == req.method "
},
{
"path": "servers/run/package.json",
"chars": 726,
"preview": "{\n \"name\": \"plunker-run\",\n \"subdomain\": \"plunker-run\",\n \"domains\": [\n \"run.plnkr.co\"\n ],\n \"scripts\": {\n \"star"
},
{
"path": "servers/run/schema/previews/create.json",
"chars": 510,
"preview": "{\r\n \"type\": \"object\",\r\n \"additionalProperties\": false,\r\n \"properties\": {\r\n \"files\": {\r\n \"required\": true,\r\n "
},
{
"path": "servers/run/server.js",
"chars": 1326,
"preview": "// Everything starts better with coffee\r\nvar coffee = require(\"coffee-script\");\r\nvar express = require(\"express\");\r\n\r\n\r\n"
},
{
"path": "servers/run/views/directory.jade",
"chars": 1037,
"preview": "!!! 5\r\nhtml\r\n head\r\n title Plunker - Preview\r\n link(href=\"http://twitter.github.com/bootstrap/assets/css/bootstra"
},
{
"path": "servers/www/.gitignore",
"chars": 148,
"preview": "lib-cov\r\n*.seed\r\n*.log\r\n*.csv\r\n*.dat\r\n*.out\r\n*.pid\r\n*.gz\r\n\r\npids\r\nlogs\r\nresults\r\ntests\r\n\r\nnode_modules\r\nnpm-debug.log\r\n\r"
},
{
"path": "servers/www/assets/bootstrap/js/bootstrap-affix.js",
"chars": 3205,
"preview": "/* ==========================================================\n * bootstrap-affix.js v2.1.0\n * http://twitter.github.com/"
},
{
"path": "servers/www/assets/bootstrap/js/bootstrap-alert.js",
"chars": 2392,
"preview": "/* ==========================================================\n * bootstrap-alert.js v2.1.0\n * http://twitter.github.com/"
},
{
"path": "servers/www/assets/bootstrap/js/bootstrap-all.js",
"chars": 374,
"preview": "//= require bootstrap-transition\r\n//= require bootstrap-alert\r\n//= require bootstrap-button\r\n//= require bootstrap-carou"
},
{
"path": "servers/www/assets/bootstrap/js/bootstrap-button.js",
"chars": 2713,
"preview": "/* ============================================================\n * bootstrap-button.js v2.1.0\n * http://twitter.github.c"
},
{
"path": "servers/www/assets/bootstrap/js/bootstrap-carousel.js",
"chars": 5270,
"preview": "/* ==========================================================\n * bootstrap-carousel.js v2.1.0\n * http://twitter.github.c"
},
{
"path": "servers/www/assets/bootstrap/js/bootstrap-collapse.js",
"chars": 4500,
"preview": "/* =============================================================\n * bootstrap-collapse.js v2.1.0\n * http://twitter.githu"
},
{
"path": "servers/www/assets/bootstrap/js/bootstrap-dropdown.js",
"chars": 3948,
"preview": "/* ============================================================\n * bootstrap-dropdown.js v2.1.0\n * http://twitter.github"
},
{
"path": "servers/www/assets/bootstrap/js/bootstrap-modal.js",
"chars": 6490,
"preview": "/* =========================================================\n * bootstrap-modal.js v2.1.0\n * http://twitter.github.com/b"
},
{
"path": "servers/www/assets/bootstrap/js/bootstrap-popover.js",
"chars": 2993,
"preview": "/* ===========================================================\n * bootstrap-popover.js v2.1.0\n * http://twitter.github.c"
},
{
"path": "servers/www/assets/bootstrap/js/bootstrap-scrollspy.js",
"chars": 4401,
"preview": "/* =============================================================\n * bootstrap-scrollspy.js v2.1.0\n * http://twitter.gith"
},
{
"path": "servers/www/assets/bootstrap/js/bootstrap-tab.js",
"chars": 3382,
"preview": "/* ========================================================\n * bootstrap-tab.js v2.1.0\n * http://twitter.github.com/boot"
},
{
"path": "servers/www/assets/bootstrap/js/bootstrap-tooltip.js",
"chars": 7696,
"preview": "/* ===========================================================\n * bootstrap-tooltip.js v2.1.0\n * http://twitter.github.c"
},
{
"path": "servers/www/assets/bootstrap/js/bootstrap-transition.js",
"chars": 1762,
"preview": "/* ===================================================\n * bootstrap-transition.js v2.1.0\n * http://twitter.github.com/bo"
},
{
"path": "servers/www/assets/bootstrap/js/bootstrap-typeahead.js",
"chars": 7464,
"preview": "/* =============================================================\n * bootstrap-typeahead.js v2.1.0\n * http://twitter.gith"
},
{
"path": "servers/www/assets/bootstrap/less/accordion.less",
"chars": 622,
"preview": "//\n// Accordion\n// --------------------------------------------------\n\n\n// Parent container\n.accordion {\n margin-bottom"
},
{
"path": "servers/www/assets/bootstrap/less/alerts.less",
"chars": 1116,
"preview": "//\n// Alerts\n// --------------------------------------------------\n\n\n// Base styles\n// -------------------------\n\n.alert"
},
{
"path": "servers/www/assets/bootstrap/less/bootstrap.less",
"chars": 1472,
"preview": "/*!\n * Bootstrap v2.1.1\n *\n * Copyright 2012 Twitter, Inc\n * Licensed under the Apache License v2.0\n * http://www.apache"
},
{
"path": "servers/www/assets/bootstrap/less/breadcrumbs.less",
"chars": 403,
"preview": "//\n// Breadcrumbs\n// --------------------------------------------------\n\n\n.breadcrumb {\n padding: 8px 15px;\n margin: 0"
},
{
"path": "servers/www/assets/bootstrap/less/button-groups.less",
"chars": 6170,
"preview": "//\n// Button groups\n// --------------------------------------------------\n\n\n// Make the div behave like a button\n.btn-gr"
},
{
"path": "servers/www/assets/bootstrap/less/buttons.less",
"chars": 5019,
"preview": "//\n// Buttons\n// --------------------------------------------------\n\n\n// Base styles\n// --------------------------------"
},
{
"path": "servers/www/assets/bootstrap/less/carousel.less",
"chars": 1960,
"preview": "//\n// Carousel\n// --------------------------------------------------\n\n\n.carousel {\n position: relative;\n margin-bottom"
},
{
"path": "servers/www/assets/bootstrap/less/close.less",
"chars": 633,
"preview": "//\n// Close icons\n// --------------------------------------------------\n\n\n.close {\n float: right;\n font-size: 20px;\n "
},
{
"path": "servers/www/assets/bootstrap/less/code.less",
"chars": 1196,
"preview": "//\n// Code (inline and blocK)\n// --------------------------------------------------\n\n\n// Inline and block code styles\nco"
},
{
"path": "servers/www/assets/bootstrap/less/component-animations.less",
"chars": 306,
"preview": "//\n// Component animations\n// --------------------------------------------------\n\n\n.fade {\n opacity: 0;\n .transition(o"
},
{
"path": "servers/www/assets/bootstrap/less/dropdowns.less",
"chars": 4859,
"preview": "//\n// Dropdown menus\n// --------------------------------------------------\n\n\n// Use the .menu class on any <li> element "
},
{
"path": "servers/www/assets/bootstrap/less/font-awesome.less",
"chars": 17228,
"preview": "/* Font Awesome\n the iconic font designed for use with Twitter Bootstrap\n ---------------------------------------"
},
{
"path": "servers/www/assets/bootstrap/less/forms.less",
"chars": 14835,
"preview": "//\n// Forms\n// --------------------------------------------------\n\n\n// GENERAL STYLES\n// --------------\n\n// Make all for"
},
{
"path": "servers/www/assets/bootstrap/less/grid.less",
"chars": 429,
"preview": "//\n// Grid system\n// --------------------------------------------------\n\n\n// Fixed (940px)\n#grid > .core(@gridColumnWidt"
},
{
"path": "servers/www/assets/bootstrap/less/hero-unit.less",
"chars": 449,
"preview": "//\n// Hero unit\n// --------------------------------------------------\n\n\n.hero-unit {\n padding: 60px;\n margin-bottom: 3"
},
{
"path": "servers/www/assets/bootstrap/less/labels-badges.less",
"chars": 1717,
"preview": "//\n// Labels and badges\n// --------------------------------------------------\n\n\n// Base classes\n.label,\n.badge {\n font-"
},
{
"path": "servers/www/assets/bootstrap/less/layouts.less",
"chars": 329,
"preview": "//\n// Layouts\n// --------------------------------------------------\n\n\n// Container (centered, fixed-width layouts)\n.cont"
},
{
"path": "servers/www/assets/bootstrap/less/mixins.less",
"chars": 21706,
"preview": "//\n// Mixins\n// --------------------------------------------------\n\n\n// UTILITY MIXINS\n// ------------------------------"
},
{
"path": "servers/www/assets/bootstrap/less/modals.less",
"chars": 2181,
"preview": "//\n// Modals\n// --------------------------------------------------\n\n\n// Recalculate z-index where appropriate,\n// but on"
},
{
"path": "servers/www/assets/bootstrap/less/navbar.less",
"chars": 11412,
"preview": "//\n// Navbars (Redux)\n// --------------------------------------------------\n\n\n// COMMON STYLES\n// -------------\n\n// Base"
},
{
"path": "servers/www/assets/bootstrap/less/navs.less",
"chars": 7343,
"preview": "//\n// Navs\n// --------------------------------------------------\n\n\n// BASE CLASS\n// ----------\n\n.nav {\n margin-left: 0;"
},
{
"path": "servers/www/assets/bootstrap/less/pager.less",
"chars": 659,
"preview": "//\n// Pager pagination\n// --------------------------------------------------\n\n\n.pager {\n margin: @baseLineHeight 0;\n l"
},
{
"path": "servers/www/assets/bootstrap/less/pagination.less",
"chars": 1405,
"preview": "//\n// Pagination (multiple pages)\n// --------------------------------------------------\n\n\n.pagination {\n height: @baseL"
},
{
"path": "servers/www/assets/bootstrap/less/popovers.less",
"chars": 3015,
"preview": "//\n// Popovers\n// --------------------------------------------------\n\n\n.popover {\n position: absolute;\n top: 0;\n left"
},
{
"path": "servers/www/assets/bootstrap/less/progress-bars.less",
"chars": 2841,
"preview": "//\n// Progress bars\n// --------------------------------------------------\n\n\n// ANIMATIONS\n// ----------\n\n// Webkit\n@-web"
},
{
"path": "servers/www/assets/bootstrap/less/reset.less",
"chars": 2799,
"preview": "//\n// Modals\n// Adapted from http://github.com/necolas/normalize.css\n// ------------------------------------------------"
},
{
"path": "servers/www/assets/bootstrap/less/responsive-1200px-min.less",
"chars": 565,
"preview": "//\n// Responsive: Large desktop and up\n// --------------------------------------------------\n\n\n@media (min-width: 1200px"
},
{
"path": "servers/www/assets/bootstrap/less/responsive-767px-max.less",
"chars": 3442,
"preview": "//\n// Responsive: Landscape phone to desktop/tablet\n// --------------------------------------------------\n\n\n@media (max-"
},
{
"path": "servers/www/assets/bootstrap/less/responsive-768px-979px.less",
"chars": 463,
"preview": "//\n// Responsive: Tablet to desktop\n// --------------------------------------------------\n\n\n@media (min-width: 768px) an"
},
{
"path": "servers/www/assets/bootstrap/less/responsive-navbar.less",
"chars": 3898,
"preview": "//\n// Responsive: Navbar\n// --------------------------------------------------\n\n\n// TABLETS AND BELOW\n// ---------------"
},
{
"path": "servers/www/assets/bootstrap/less/responsive-utilities.less",
"chars": 1187,
"preview": "//\n// Responsive: Utility classes\n// --------------------------------------------------\n\n\n// Hide from screenreaders and"
},
{
"path": "servers/www/assets/bootstrap/less/responsive.less",
"chars": 1069,
"preview": "/*!\n * Bootstrap Responsive v2.1.1\n *\n * Copyright 2012 Twitter, Inc\n * Licensed under the Apache License v2.0\n * http:/"
},
{
"path": "servers/www/assets/bootstrap/less/scaffolding.less",
"chars": 876,
"preview": "//\n// Scaffolding\n// --------------------------------------------------\n\n\n// Body reset\n// -------------------------\n\nbo"
},
{
"path": "servers/www/assets/bootstrap/less/sprites.less",
"chars": 10616,
"preview": "//\n// Sprites\n// --------------------------------------------------\n\n\n// ICONS\n// -----\n\n// All icons receive the styles"
},
{
"path": "servers/www/assets/bootstrap/less/tables.less",
"chars": 6187,
"preview": "//\n// Tables\n// --------------------------------------------------\n\n\n// BASE TABLES\n// -----------------\n\ntable {\n max-"
},
{
"path": "servers/www/assets/bootstrap/less/thumbnails.less",
"chars": 1153,
"preview": "//\n// Thumbnails\n// --------------------------------------------------\n\n\n// Note: `.thumbnails` and `.thumbnails > li` a"
},
{
"path": "servers/www/assets/bootstrap/less/tooltip.less",
"chars": 1606,
"preview": "//\n// Tooltips\n// --------------------------------------------------\n\n\n// Base class\n.tooltip {\n position: absolute;\n "
},
{
"path": "servers/www/assets/bootstrap/less/type.less",
"chars": 3744,
"preview": "//\n// Typography\n// --------------------------------------------------\n\n\n// Body text\n// -------------------------\n\np {\n"
},
{
"path": "servers/www/assets/bootstrap/less/utilities.less",
"chars": 335,
"preview": "//\n// Utility classes\n// --------------------------------------------------\n\n\n// Quick floats\n.pull-right {\n float: rig"
},
{
"path": "servers/www/assets/bootstrap/less/variables.less",
"chars": 8473,
"preview": "//\n// Variables\n// --------------------------------------------------\n\n\n// Global values\n// ----------------------------"
},
{
"path": "servers/www/assets/bootstrap/less/wells.less",
"chars": 508,
"preview": "//\n// Wells\n// --------------------------------------------------\n\n\n// Base class\n.well {\n min-height: 20px;\n padding:"
},
{
"path": "servers/www/assets/css/common/style.less",
"chars": 55,
"preview": ".help-block {\n font-style: italic;\n font-size: 80%;\n}"
},
{
"path": "servers/www/assets/css/components/discussion.less",
"chars": 898,
"preview": ".plunker-discussion {\r\n .thumbnails {\r\n margin-bottom: 4px;\r\n margin-left: -10px;\r\n }\r\n \r\n form {\r\n margin-"
},
{
"path": "servers/www/assets/css/components/gallery.less",
"chars": 2363,
"preview": "@import \"./tags\";\r\n\r\n.card.span3 {\r\n width: 270px;\r\n}\r\n\r\n.page-header {\r\n margin: 18px 0 10px;\r\n border-bottom: 1px s"
},
{
"path": "servers/www/assets/css/components/importer.less",
"chars": 581,
"preview": "#importer {\r\n position: relative;\r\n\r\n .import-form {\r\n padding-top: 46px;\r\n padding-left: 5px;\r\n margin-botto"
},
{
"path": "servers/www/assets/css/components/multipanel.less",
"chars": 1249,
"preview": "#multipanel {\n .panel {\n width: 100%;\n height: 100%;\n position: relative;\n }\n}\n\n#multipane-buttons {\n backgr"
},
{
"path": "servers/www/assets/css/components/navbar.less",
"chars": 755,
"preview": ".navbar {\r\n .navbar-inner {\r\n padding: 0 8px;\r\n }\r\n \r\n .brand {\r\n background: rgba(0,0,0,0.0) url('../../img/p"
},
{
"path": "servers/www/assets/css/components/previewer.less",
"chars": 1085,
"preview": ".plnk-previewer {\n width: 100%; height: 100%;\n overflow: hidden;\n}\n.plnk-runner {\n border: 0; margin: 0; padding: 0;\n"
},
{
"path": "servers/www/assets/css/components/share.less",
"chars": 121,
"preview": "div.share-panel {\n padding: 8px;\n \n #share-embed {\n //width: 100%;\n }\n .share-button {\n margin-top: 6px;\n }\n"
},
{
"path": "servers/www/assets/css/components/sidebar.less",
"chars": 1969,
"preview": ".plnk-sidebar {\n position: absolute;\n top: 0; bottom: 0; left: 0; right: 0;\n background-color: #f5f5f5;\n \n details "
},
{
"path": "servers/www/assets/css/components/statusbar.less",
"chars": 629,
"preview": "#editor-file-list {\n .file {\n position: relative;\n \n .file-ops {\n display: none;\n }\n }\n \n .file:hov"
},
{
"path": "servers/www/assets/css/components/streamer.less",
"chars": 0,
"preview": ""
},
{
"path": "servers/www/assets/css/components/tags.less",
"chars": 1353,
"preview": "ul.tags {\r\n margin: 0 11px; padding: 0; border: 0;\r\n list-style: none;\r\n display: block;\r\n overflow: hidden;\r\n widt"
},
{
"path": "servers/www/assets/css/components/toolbar.less",
"chars": 411,
"preview": "#toolbar {\n margin: 0; padding: 0;\n \n > .btn-group {\n padding-bottom: 0;\n }\n \n .dropdown-menu > li {\n positi"
},
{
"path": "servers/www/assets/css/components/userpanel.less",
"chars": 281,
"preview": "#userpanel {\r\n margin-left: 18px;\r\n \r\n .user-menu {\r\n position: relative;\r\n padding-left: 30px;\r\n \r\n .gra"
},
{
"path": "servers/www/assets/css/pages/editor.less",
"chars": 2007,
"preview": "@import url(http://fonts.googleapis.com/css?family=Exo:900);\r\n\r\n@import \"../../bootstrap/less/bootstrap\";\r\n@import \"../."
},
{
"path": "servers/www/assets/css/pages/landing.less",
"chars": 1089,
"preview": "@import url(http://fonts.googleapis.com/css?family=Exo:900);\n\n@import \"../common/style\";\n\n@import \"../../bootstrap/less/"
},
{
"path": "servers/www/assets/css/pages/preview.less",
"chars": 871,
"preview": "@import url(http://fonts.googleapis.com/css?family=Exo:900);\r\n\r\n@import \"../../bootstrap/less/bootstrap\";\r\n@import \"../."
},
{
"path": "servers/www/assets/css/vendor/jquery-layout.less",
"chars": 5135,
"preview": "/*\r\n * Default Layout Theme\r\n *\r\n * Created for jquery.layout \r\n *\r\n * Copyright (c) 2010 \r\n * Fabrizio Balliano (http"
},
{
"path": "servers/www/assets/css/vendor/prettify.less",
"chars": 844,
"preview": ".com { color: #93a1a1; }\r\n.lit { color: #195f91; }\r\n.pun, .opn, .clo { color: #93a1a1; }\r\n.fun { color: #dc322f; }\r\n.str"
},
{
"path": "servers/www/assets/js/directives/ace.coffee",
"chars": 2984,
"preview": "#= require ../services/modes\r\n\r\nEditSession = require(\"ace/edit_session\").EditSession\r\nUndoManager = require(\"ace/undoma"
},
{
"path": "servers/www/assets/js/directives/builder.coffee",
"chars": 5823,
"preview": "#= require ../../select2/select2\r\n\r\n#= require ../vendor/underscore\r\n#= require ../vendor/semver\r\n#= require ../vendor/b"
},
{
"path": "servers/www/assets/js/directives/card.coffee",
"chars": 5372,
"preview": "#= require ../vendor/jquery.timeago\r\n#= require ../vendor/jquery.lazyload\r\n\r\n#= require ../services/plunks\r\n\r\nmodule = a"
},
{
"path": "servers/www/assets/js/directives/chat.coffee",
"chars": 1673,
"preview": "#= require ../services/session\r\n\r\nmodule = angular.module(\"plunker.chat\", [])\r\n\r\nmodule.directive \"plunkerChat\", [\"$time"
},
{
"path": "servers/www/assets/js/directives/discussion.coffee",
"chars": 5830,
"preview": "#= require ../vendor/angular-ui\r\n#= require ../vendor/showdown\r\n#= require ../vendor/prettify\r\n#= require ../vendor/jque"
},
{
"path": "servers/www/assets/js/directives/layout.coffee",
"chars": 3246,
"preview": "#= require ../vendor/jquery.ui.custom\n#= require ../vendor/jquery.layout\n\n#= require_tree ../services/panes\n#= require ."
},
{
"path": "servers/www/assets/js/directives/multipanel.coffee",
"chars": 1082,
"preview": "#= require ../services/panels\n#= require_tree ../services/panes\n\nmodule = angular.module(\"plunker.multipanel\", [\"plunker"
},
{
"path": "servers/www/assets/js/directives/share.coffee",
"chars": 1806,
"preview": "#= require ../services/url\r\n\r\n#= require ../socialbuttons\r\n\r\n\r\nmodule = angular.module(\"plunker.share\", [])\r\n\r\nmodule.di"
},
{
"path": "servers/www/assets/js/directives/statusbar.coffee",
"chars": 1606,
"preview": "#= require ../services/scratch\r\n\r\nmodule = angular.module(\"plunker.statusbar\", [])\r\n\r\nmodule.directive \"plunkerStatusbar"
},
{
"path": "servers/www/assets/js/directives/toolbar.coffee",
"chars": 5727,
"preview": "#= require ../services/scratch\r\n#= require ../services/downloader\r\n\r\n#= require ../directives/share\r\n\r\n\r\nmodule = angula"
},
{
"path": "servers/www/assets/js/directives/userpanel.coffee",
"chars": 2157,
"preview": "#= require ../services/session\n\nmodule = angular.module(\"plunker.userpanel\", [\"plunker.session\"])\n\nmodule.directive \"pln"
},
{
"path": "servers/www/assets/js/pages/editor.coffee",
"chars": 2393,
"preview": "#= require ../../bootstrap/js/bootstrap-all\r\n\r\n#= require ../../select2/select2\r\n\r\n#= require ../vendor/angular-ui\r\n#= r"
},
{
"path": "servers/www/assets/js/pages/landing.coffee",
"chars": 7909,
"preview": "#= require ../../bootstrap/js/bootstrap-all\r\n\r\n#= require ../services/plunks\r\n#= require ../services/url\r\n#= require ../"
}
]
// ... and 160 more files (download for full content)
About this extraction
This page contains the full source code of the filearts/plunker GitHub repository, extracted and formatted as plain text for AI agents and large language models (LLMs). The extraction includes 360 files (8.7 MB), approximately 2.3M tokens, and a symbol index with 822 extracted functions, classes, methods, constants, and types. Use this with OpenClaw, Claude, ChatGPT, Cursor, Windsurf, or any other AI tool that accepts text input. You can copy the full output to your clipboard or download it as a .txt file.
Extracted by GitExtract — free GitHub repo to text converter for AI. Built by Nikandr Surkov.