├── css
├── .gitkeep
└── app.css
├── partials
├── .gitkeep
├── statusbar.html
├── sidebar.html
├── builder.html
├── masthead.html
├── startcontainer.html
├── images.html
├── settings.html
├── dashboard.html
├── containers.html
├── image.html
└── container.html
├── .godir
├── .gitignore
├── Procfile
├── container.png
├── containers.png
├── images
├── gritter.png
├── ie-spacer.gif
├── gritter-long.png
└── gritter-light.png
├── assets
├── ico
│ ├── favicon.ico
│ ├── apple-touch-icon-114-precomposed.png
│ ├── apple-touch-icon-144-precomposed.png
│ ├── apple-touch-icon-57-precomposed.png
│ └── apple-touch-icon-72-precomposed.png
├── font
│ ├── FontAwesome.otf
│ ├── fontawesome-webfont.eot
│ ├── fontawesome-webfont.ttf
│ └── fontawesome-webfont.woff
├── img
│ ├── less-logo-large.png
│ ├── examples
│ │ ├── slide-01.jpg
│ │ ├── slide-02.jpg
│ │ ├── slide-03.jpg
│ │ ├── browser-icon-chrome.png
│ │ ├── browser-icon-safari.png
│ │ ├── browser-icon-firefox.png
│ │ ├── bootstrap-example-fluid.jpg
│ │ ├── bootstrap-example-hero.jpg
│ │ ├── bootstrap-example-signin.png
│ │ ├── bootstrap-example-carousel.png
│ │ ├── bootstrap-example-starter.jpg
│ │ ├── bootstrap-example-sticky-footer.png
│ │ └── bootstrap-example-marketing-narrow.png
│ ├── grid-baseline-20px.png
│ ├── example-sites
│ │ ├── jshint.png
│ │ ├── kippt.png
│ │ ├── fleetio.png
│ │ ├── 8020select.png
│ │ ├── soundready.png
│ │ ├── adoptahydrant.png
│ │ ├── breakingnews.png
│ │ └── gathercontent.png
│ ├── bootstrap-mdo-sfmoma-01.jpg
│ ├── bootstrap-mdo-sfmoma-02.jpg
│ ├── bootstrap-mdo-sfmoma-03.jpg
│ ├── bs-docs-twitter-github.png
│ ├── bs-docs-masthead-pattern.png
│ ├── responsive-illustrations.png
│ ├── bs-docs-bootstrap-features.png
│ └── bs-docs-responsive-illustrations.png
├── js
│ ├── .jshintrc
│ ├── tests
│ │ ├── server.js
│ │ ├── unit
│ │ │ ├── bootstrap-transition.js
│ │ │ ├── bootstrap-phantom.js
│ │ │ ├── bootstrap-affix.js
│ │ │ ├── bootstrap-scrollspy.js
│ │ │ ├── bootstrap-alert.js
│ │ │ ├── bootstrap-tab.js
│ │ │ ├── bootstrap-collapse.js
│ │ │ ├── bootstrap-button.js
│ │ │ ├── bootstrap-modal.js
│ │ │ └── bootstrap-carousel.js
│ │ ├── index.html
│ │ └── phantom.js
│ ├── google-code-prettify
│ │ └── prettify.css
│ ├── bootstrap-transition.js
│ ├── bootstrap-alert.js
│ ├── angularjs
│ │ └── 1.2.6
│ │ │ ├── angular-resource.min.js
│ │ │ └── angular-route.min.js
│ ├── bootstrap-button.js
│ ├── bootstrap-popover.js
│ ├── README.md
│ ├── bootstrap-affix.js
│ ├── bootstrap-tab.js
│ └── application.js
├── less
│ ├── layouts.less
│ ├── component-animations.less
│ ├── utilities.less
│ ├── breadcrumbs.less
│ ├── wells.less
│ ├── grid.less
│ ├── responsive-768px-979px.less
│ ├── hero-unit.less
│ ├── responsive-1200px-min.less
│ ├── accordion.less
│ ├── close.less
│ ├── scaffolding.less
│ ├── pager.less
│ ├── media.less
│ ├── responsive.less
│ ├── thumbnails.less
│ ├── code.less
│ ├── alerts.less
│ ├── bootstrap.less
│ ├── responsive-utilities.less
│ ├── tooltip.less
│ ├── labels-badges.less
│ ├── modals.less
│ ├── pagination.less
│ ├── tests
│ │ └── forms-responsive.html
│ ├── progress-bars.less
│ ├── carousel.less
│ ├── popovers.less
│ └── responsive-767px-max.less
└── scss
│ ├── _layouts.scss
│ ├── _component-animations.scss
│ ├── _wells.scss
│ ├── _breadcrumbs.scss
│ ├── _grid.scss
│ ├── _responsive-768px-979px.scss
│ ├── _hero-unit.scss
│ ├── _responsive-1200px-min.scss
│ ├── _accordion.scss
│ ├── _utilities.scss
│ ├── _close.scss
│ ├── _scaffolding.scss
│ ├── _pager.scss
│ ├── _media.scss
│ ├── bootstrap-responsive.scss
│ ├── _thumbnails.scss
│ ├── _code.scss
│ ├── bootstrap.scss
│ ├── _alerts.scss
│ ├── _tooltip.scss
│ ├── _responsive-utilities.scss
│ ├── _labels-badges.scss
│ ├── _modals.scss
│ ├── _pagination.scss
│ ├── _carousel.scss
│ ├── _progress-bars.scss
│ ├── _popovers.scss
│ ├── _tables.scss
│ └── _responsive-767px-max.scss
├── Makefile
├── Dockerfile
├── lib
├── legend.js
├── jquery.gritter.css
└── jquery.gritter.min.js
├── js
├── viewmodel.js
├── app.js
└── filters.js
├── LICENSE
├── dockerui.go
├── index.html
└── README.md
/css/.gitkeep:
--------------------------------------------------------------------------------
1 |
--------------------------------------------------------------------------------
/partials/.gitkeep:
--------------------------------------------------------------------------------
1 |
--------------------------------------------------------------------------------
/.godir:
--------------------------------------------------------------------------------
1 | dockerui
2 |
--------------------------------------------------------------------------------
/.gitignore:
--------------------------------------------------------------------------------
1 | logs/*
2 | !.gitkeep
3 | dockerui
4 | *.esproj/*
5 |
--------------------------------------------------------------------------------
/Procfile:
--------------------------------------------------------------------------------
1 | web: dockerui -p ":$PORT" -e "$DOCKER_ENDPOINT"
2 |
--------------------------------------------------------------------------------
/container.png:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/abh1nav/dockerui/HEAD/container.png
--------------------------------------------------------------------------------
/containers.png:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/abh1nav/dockerui/HEAD/containers.png
--------------------------------------------------------------------------------
/images/gritter.png:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/abh1nav/dockerui/HEAD/images/gritter.png
--------------------------------------------------------------------------------
/images/ie-spacer.gif:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/abh1nav/dockerui/HEAD/images/ie-spacer.gif
--------------------------------------------------------------------------------
/assets/ico/favicon.ico:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/abh1nav/dockerui/HEAD/assets/ico/favicon.ico
--------------------------------------------------------------------------------
/images/gritter-long.png:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/abh1nav/dockerui/HEAD/images/gritter-long.png
--------------------------------------------------------------------------------
/images/gritter-light.png:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/abh1nav/dockerui/HEAD/images/gritter-light.png
--------------------------------------------------------------------------------
/assets/font/FontAwesome.otf:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/abh1nav/dockerui/HEAD/assets/font/FontAwesome.otf
--------------------------------------------------------------------------------
/assets/img/less-logo-large.png:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/abh1nav/dockerui/HEAD/assets/img/less-logo-large.png
--------------------------------------------------------------------------------
/assets/img/examples/slide-01.jpg:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/abh1nav/dockerui/HEAD/assets/img/examples/slide-01.jpg
--------------------------------------------------------------------------------
/assets/img/examples/slide-02.jpg:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/abh1nav/dockerui/HEAD/assets/img/examples/slide-02.jpg
--------------------------------------------------------------------------------
/assets/img/examples/slide-03.jpg:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/abh1nav/dockerui/HEAD/assets/img/examples/slide-03.jpg
--------------------------------------------------------------------------------
/assets/img/grid-baseline-20px.png:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/abh1nav/dockerui/HEAD/assets/img/grid-baseline-20px.png
--------------------------------------------------------------------------------
/assets/font/fontawesome-webfont.eot:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/abh1nav/dockerui/HEAD/assets/font/fontawesome-webfont.eot
--------------------------------------------------------------------------------
/assets/font/fontawesome-webfont.ttf:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/abh1nav/dockerui/HEAD/assets/font/fontawesome-webfont.ttf
--------------------------------------------------------------------------------
/assets/img/example-sites/jshint.png:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/abh1nav/dockerui/HEAD/assets/img/example-sites/jshint.png
--------------------------------------------------------------------------------
/assets/img/example-sites/kippt.png:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/abh1nav/dockerui/HEAD/assets/img/example-sites/kippt.png
--------------------------------------------------------------------------------
/assets/font/fontawesome-webfont.woff:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/abh1nav/dockerui/HEAD/assets/font/fontawesome-webfont.woff
--------------------------------------------------------------------------------
/assets/img/bootstrap-mdo-sfmoma-01.jpg:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/abh1nav/dockerui/HEAD/assets/img/bootstrap-mdo-sfmoma-01.jpg
--------------------------------------------------------------------------------
/assets/img/bootstrap-mdo-sfmoma-02.jpg:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/abh1nav/dockerui/HEAD/assets/img/bootstrap-mdo-sfmoma-02.jpg
--------------------------------------------------------------------------------
/assets/img/bootstrap-mdo-sfmoma-03.jpg:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/abh1nav/dockerui/HEAD/assets/img/bootstrap-mdo-sfmoma-03.jpg
--------------------------------------------------------------------------------
/assets/img/bs-docs-twitter-github.png:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/abh1nav/dockerui/HEAD/assets/img/bs-docs-twitter-github.png
--------------------------------------------------------------------------------
/assets/img/example-sites/fleetio.png:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/abh1nav/dockerui/HEAD/assets/img/example-sites/fleetio.png
--------------------------------------------------------------------------------
/assets/img/bs-docs-masthead-pattern.png:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/abh1nav/dockerui/HEAD/assets/img/bs-docs-masthead-pattern.png
--------------------------------------------------------------------------------
/assets/img/example-sites/8020select.png:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/abh1nav/dockerui/HEAD/assets/img/example-sites/8020select.png
--------------------------------------------------------------------------------
/assets/img/example-sites/soundready.png:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/abh1nav/dockerui/HEAD/assets/img/example-sites/soundready.png
--------------------------------------------------------------------------------
/assets/img/responsive-illustrations.png:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/abh1nav/dockerui/HEAD/assets/img/responsive-illustrations.png
--------------------------------------------------------------------------------
/assets/img/bs-docs-bootstrap-features.png:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/abh1nav/dockerui/HEAD/assets/img/bs-docs-bootstrap-features.png
--------------------------------------------------------------------------------
/assets/img/example-sites/adoptahydrant.png:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/abh1nav/dockerui/HEAD/assets/img/example-sites/adoptahydrant.png
--------------------------------------------------------------------------------
/assets/img/example-sites/breakingnews.png:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/abh1nav/dockerui/HEAD/assets/img/example-sites/breakingnews.png
--------------------------------------------------------------------------------
/assets/img/example-sites/gathercontent.png:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/abh1nav/dockerui/HEAD/assets/img/example-sites/gathercontent.png
--------------------------------------------------------------------------------
/assets/img/examples/browser-icon-chrome.png:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/abh1nav/dockerui/HEAD/assets/img/examples/browser-icon-chrome.png
--------------------------------------------------------------------------------
/assets/img/examples/browser-icon-safari.png:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/abh1nav/dockerui/HEAD/assets/img/examples/browser-icon-safari.png
--------------------------------------------------------------------------------
/assets/img/examples/browser-icon-firefox.png:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/abh1nav/dockerui/HEAD/assets/img/examples/browser-icon-firefox.png
--------------------------------------------------------------------------------
/assets/ico/apple-touch-icon-114-precomposed.png:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/abh1nav/dockerui/HEAD/assets/ico/apple-touch-icon-114-precomposed.png
--------------------------------------------------------------------------------
/assets/ico/apple-touch-icon-144-precomposed.png:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/abh1nav/dockerui/HEAD/assets/ico/apple-touch-icon-144-precomposed.png
--------------------------------------------------------------------------------
/assets/ico/apple-touch-icon-57-precomposed.png:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/abh1nav/dockerui/HEAD/assets/ico/apple-touch-icon-57-precomposed.png
--------------------------------------------------------------------------------
/assets/ico/apple-touch-icon-72-precomposed.png:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/abh1nav/dockerui/HEAD/assets/ico/apple-touch-icon-72-precomposed.png
--------------------------------------------------------------------------------
/assets/img/bs-docs-responsive-illustrations.png:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/abh1nav/dockerui/HEAD/assets/img/bs-docs-responsive-illustrations.png
--------------------------------------------------------------------------------
/assets/img/examples/bootstrap-example-fluid.jpg:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/abh1nav/dockerui/HEAD/assets/img/examples/bootstrap-example-fluid.jpg
--------------------------------------------------------------------------------
/assets/img/examples/bootstrap-example-hero.jpg:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/abh1nav/dockerui/HEAD/assets/img/examples/bootstrap-example-hero.jpg
--------------------------------------------------------------------------------
/assets/img/examples/bootstrap-example-signin.png:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/abh1nav/dockerui/HEAD/assets/img/examples/bootstrap-example-signin.png
--------------------------------------------------------------------------------
/assets/img/examples/bootstrap-example-carousel.png:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/abh1nav/dockerui/HEAD/assets/img/examples/bootstrap-example-carousel.png
--------------------------------------------------------------------------------
/assets/img/examples/bootstrap-example-starter.jpg:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/abh1nav/dockerui/HEAD/assets/img/examples/bootstrap-example-starter.jpg
--------------------------------------------------------------------------------
/assets/img/examples/bootstrap-example-sticky-footer.png:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/abh1nav/dockerui/HEAD/assets/img/examples/bootstrap-example-sticky-footer.png
--------------------------------------------------------------------------------
/assets/img/examples/bootstrap-example-marketing-narrow.png:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/abh1nav/dockerui/HEAD/assets/img/examples/bootstrap-example-marketing-narrow.png
--------------------------------------------------------------------------------
/partials/statusbar.html:
--------------------------------------------------------------------------------
1 |
4 |
--------------------------------------------------------------------------------
/assets/js/.jshintrc:
--------------------------------------------------------------------------------
1 | {
2 | "validthis": true,
3 | "laxcomma" : true,
4 | "laxbreak" : true,
5 | "browser" : true,
6 | "eqnull" : true,
7 | "debug" : true,
8 | "devel" : true,
9 | "boss" : true,
10 | "expr" : true,
11 | "asi" : true
12 | }
--------------------------------------------------------------------------------
/Makefile:
--------------------------------------------------------------------------------
1 | .PHONY: build run
2 |
3 | .SUFFIXES:
4 |
5 | OPEN = $(shell which xdg-open || which open)
6 | PORT ?= 9000
7 |
8 | build:
9 | docker build --rm -t dockerui .
10 |
11 | run:
12 | docker run -d -p $(PORT):9000 -v /var/run/docker.sock:/docker.sock dockerui -e /docker.sock
13 |
14 | open:
15 | $(OPEN) localhost:$(PORT)
16 |
17 |
18 |
--------------------------------------------------------------------------------
/assets/js/tests/server.js:
--------------------------------------------------------------------------------
1 | /*
2 | * Simple connect server for phantom.js
3 | * Adapted from Modernizr
4 | */
5 |
6 | var connect = require('connect')
7 | , http = require('http')
8 | , fs = require('fs')
9 | , app = connect()
10 | .use(connect.static(__dirname + '/../../'));
11 |
12 | http.createServer(app).listen(3000);
13 |
14 | fs.writeFileSync(__dirname + '/pid.txt', process.pid, 'utf-8')
--------------------------------------------------------------------------------
/assets/less/layouts.less:
--------------------------------------------------------------------------------
1 | //
2 | // Layouts
3 | // --------------------------------------------------
4 |
5 |
6 | // Container (centered, fixed-width layouts)
7 | .container {
8 | .container-fixed();
9 | }
10 |
11 | // Fluid layouts (left aligned, with sidebar, min- & max-width content)
12 | .container-fluid {
13 | padding-right: @gridGutterWidth;
14 | padding-left: @gridGutterWidth;
15 | .clearfix();
16 | }
--------------------------------------------------------------------------------
/assets/scss/_layouts.scss:
--------------------------------------------------------------------------------
1 | //
2 | // Layouts
3 | // --------------------------------------------------
4 |
5 |
6 | // Container (centered, fixed-width layouts)
7 | .container {
8 | @include container-fixed();
9 | }
10 |
11 | // Fluid layouts (left aligned, with sidebar, min- & max-width content)
12 | .container-fluid {
13 | padding-right: $gridGutterWidth;
14 | padding-left: $gridGutterWidth;
15 | @include clearfix();
16 | }
17 |
--------------------------------------------------------------------------------
/assets/less/component-animations.less:
--------------------------------------------------------------------------------
1 | //
2 | // Component animations
3 | // --------------------------------------------------
4 |
5 |
6 | .fade {
7 | opacity: 0;
8 | .transition(opacity .15s linear);
9 | &.in {
10 | opacity: 1;
11 | }
12 | }
13 |
14 | .collapse {
15 | position: relative;
16 | height: 0;
17 | overflow: hidden;
18 | .transition(height .35s ease);
19 | &.in {
20 | height: auto;
21 | }
22 | }
23 |
--------------------------------------------------------------------------------
/assets/scss/_component-animations.scss:
--------------------------------------------------------------------------------
1 | //
2 | // Component animations
3 | // --------------------------------------------------
4 |
5 |
6 | .fade {
7 | opacity: 0;
8 | @include transition(opacity .15s linear);
9 | &.in {
10 | opacity: 1;
11 | }
12 | }
13 |
14 | .collapse {
15 | position: relative;
16 | height: 0;
17 | overflow: hidden;
18 | @include transition(height .35s ease);
19 | &.in {
20 | height: auto;
21 | }
22 | }
23 |
--------------------------------------------------------------------------------
/assets/js/tests/unit/bootstrap-transition.js:
--------------------------------------------------------------------------------
1 | $(function () {
2 |
3 | module("bootstrap-transition")
4 |
5 | test("should be defined on jquery support object", function () {
6 | ok($.support.transition !== undefined, 'transition object is defined')
7 | })
8 |
9 | test("should provide an end object", function () {
10 | ok($.support.transition ? $.support.transition.end : true, 'end string is defined')
11 | })
12 |
13 | })
--------------------------------------------------------------------------------
/partials/sidebar.html:
--------------------------------------------------------------------------------
1 |
2 |
Running containers:
3 |
4 |
Endpoint: {{ endpoint }}
5 |
11 |
12 |
--------------------------------------------------------------------------------
/partials/builder.html:
--------------------------------------------------------------------------------
1 |
2 |
6 |
7 |
8 |
{{ messages }}
9 |
10 |
13 |
14 |
--------------------------------------------------------------------------------
/assets/less/utilities.less:
--------------------------------------------------------------------------------
1 | //
2 | // Utility classes
3 | // --------------------------------------------------
4 |
5 |
6 | // Quick floats
7 | .pull-right {
8 | float: right;
9 | }
10 | .pull-left {
11 | float: left;
12 | }
13 |
14 | // Toggling content
15 | .hide {
16 | display: none;
17 | }
18 | .show {
19 | display: block;
20 | }
21 |
22 | // Visibility
23 | .invisible {
24 | visibility: hidden;
25 | }
26 |
27 | // For Affix plugin
28 | .affix {
29 | position: fixed;
30 | }
31 |
--------------------------------------------------------------------------------
/Dockerfile:
--------------------------------------------------------------------------------
1 | FROM debian:jessie
2 |
3 | RUN apt-get update && apt-get install --no-install-recommends -y \
4 | ca-certificates \
5 | curl \
6 | mercurial \
7 | git-core
8 |
9 | RUN curl -s https://storage.googleapis.com/golang/go1.2.2.linux-amd64.tar.gz | tar -v -C /usr/local -xz
10 |
11 | ENV GOPATH /go
12 | ENV GOROOT /usr/local/go
13 | ENV PATH $PATH:/usr/local/go/bin:/go/bin
14 |
15 | ADD . /app/
16 | WORKDIR /app/
17 | RUN go build dockerui.go
18 | EXPOSE 9000
19 | ENTRYPOINT ["./dockerui"]
20 |
--------------------------------------------------------------------------------
/assets/less/breadcrumbs.less:
--------------------------------------------------------------------------------
1 | //
2 | // Breadcrumbs
3 | // --------------------------------------------------
4 |
5 |
6 | .breadcrumb {
7 | padding: 8px 15px;
8 | margin: 0 0 @baseLineHeight;
9 | list-style: none;
10 | background-color: #f5f5f5;
11 | > li {
12 | display: inline-block;
13 | .ie7-inline-block();
14 | text-shadow: 0 1px 0 @white;
15 | > .divider {
16 | padding: 0 5px;
17 | color: #ccc;
18 | }
19 | }
20 | > .active {
21 | color: @grayLight;
22 | }
23 | }
24 |
--------------------------------------------------------------------------------
/assets/less/wells.less:
--------------------------------------------------------------------------------
1 | //
2 | // Wells
3 | // --------------------------------------------------
4 |
5 |
6 | // Base class
7 | .well {
8 | min-height: 20px;
9 | padding: 19px;
10 | margin-bottom: 20px;
11 | background-color: @wellBackground;
12 | border: 1px solid darken(@wellBackground, 7%);
13 | blockquote {
14 | border-color: #ddd;
15 | border-color: rgba(0,0,0,.15);
16 | }
17 | }
18 |
19 | // Sizes
20 | .well-large {
21 | padding: 24px;
22 | }
23 | .well-small {
24 | padding: 9px;
25 | }
26 |
--------------------------------------------------------------------------------
/assets/scss/_wells.scss:
--------------------------------------------------------------------------------
1 | //
2 | // Wells
3 | // --------------------------------------------------
4 |
5 |
6 | // Base class
7 | .well {
8 | min-height: 20px;
9 | padding: 19px;
10 | margin-bottom: 20px;
11 | background-color: $wellBackground;
12 | border: 1px solid darken($wellBackground, 7%);
13 | blockquote {
14 | border-color: #ddd;
15 | border-color: rgba(0,0,0,.15);
16 | }
17 | }
18 |
19 | // Sizes
20 | .well-large {
21 | padding: 24px;
22 | }
23 | .well-small {
24 | padding: 9px;
25 | }
26 |
--------------------------------------------------------------------------------
/assets/scss/_breadcrumbs.scss:
--------------------------------------------------------------------------------
1 | //
2 | // Breadcrumbs
3 | // --------------------------------------------------
4 |
5 |
6 | .breadcrumb {
7 | padding: 8px 15px;
8 | margin: 0 0 $baseLineHeight;
9 | list-style: none;
10 | background-color: #f5f5f5;
11 | > li {
12 | display: inline-block;
13 | @include ie7-inline-block();
14 | text-shadow: 0 1px 0 $white;
15 | > .divider {
16 | padding: 0 5px;
17 | color: #ccc;
18 | }
19 | }
20 | .active {
21 | color: $grayLight;
22 | }
23 | }
24 |
--------------------------------------------------------------------------------
/assets/less/grid.less:
--------------------------------------------------------------------------------
1 | //
2 | // Grid system
3 | // --------------------------------------------------
4 |
5 |
6 | // Fixed (940px)
7 | #grid > .core(@gridColumnWidth, @gridGutterWidth);
8 |
9 | // Fluid (940px)
10 | #grid > .fluid(@fluidGridColumnWidth, @fluidGridGutterWidth);
11 |
12 | // Reset utility classes due to specificity
13 | [class*="span"].hide,
14 | .row-fluid [class*="span"].hide {
15 | display: none;
16 | }
17 |
18 | [class*="span"].pull-right,
19 | .row-fluid [class*="span"].pull-right {
20 | float: right;
21 | }
22 |
--------------------------------------------------------------------------------
/partials/masthead.html:
--------------------------------------------------------------------------------
1 |
16 |
--------------------------------------------------------------------------------
/assets/scss/_grid.scss:
--------------------------------------------------------------------------------
1 | //
2 | // Grid system
3 | // --------------------------------------------------
4 |
5 |
6 | // Fixed (940px)
7 | @include grid-core($gridColumnWidth, $gridGutterWidth);
8 |
9 | // Fluid (940px)
10 | @include grid-fluid($fluidGridColumnWidth, $fluidGridGutterWidth);
11 |
12 | // Reset utility classes due to specificity
13 | [class*="span"].hide,
14 | .row-fluid [class*="span"].hide {
15 | display: none;
16 | }
17 |
18 | [class*="span"].pull-right,
19 | .row-fluid [class*="span"].pull-right {
20 | float: right;
21 | }
22 |
--------------------------------------------------------------------------------
/assets/less/responsive-768px-979px.less:
--------------------------------------------------------------------------------
1 | //
2 | // Responsive: Tablet to desktop
3 | // --------------------------------------------------
4 |
5 |
6 | @media (min-width: 768px) and (max-width: 979px) {
7 |
8 | // Fixed grid
9 | #grid > .core(@gridColumnWidth768, @gridGutterWidth768);
10 |
11 | // Fluid grid
12 | #grid > .fluid(@fluidGridColumnWidth768, @fluidGridGutterWidth768);
13 |
14 | // Input grid
15 | #grid > .input(@gridColumnWidth768, @gridGutterWidth768);
16 |
17 | // No need to reset .thumbnails here since it's the same @gridGutterWidth
18 |
19 | }
20 |
--------------------------------------------------------------------------------
/assets/scss/_responsive-768px-979px.scss:
--------------------------------------------------------------------------------
1 | //
2 | // Responsive: Tablet to desktop
3 | // --------------------------------------------------
4 |
5 |
6 | @media (min-width: 768px) and (max-width: 979px) {
7 |
8 | // Fixed grid
9 | @include grid-core($gridColumnWidth768, $gridGutterWidth768);
10 |
11 | // Fluid grid
12 | @include grid-fluid($fluidGridColumnWidth768, $fluidGridGutterWidth768);
13 |
14 | // Input grid
15 | @include grid-input($gridColumnWidth768, $gridGutterWidth768);
16 |
17 | // No need to reset .thumbnails here since it's the same $gridGutterWidth
18 |
19 | }
20 |
--------------------------------------------------------------------------------
/lib/legend.js:
--------------------------------------------------------------------------------
1 | function legend(parent, data) {
2 | parent.className = 'legend';
3 | var datas = data.hasOwnProperty('datasets') ? data.datasets : data;
4 |
5 | datas.forEach(function(d) {
6 | var title = document.createElement('span');
7 | title.className = 'title';
8 | title.style.borderColor = d.hasOwnProperty('strokeColor') ? d.strokeColor : d.color;
9 | title.style.borderStyle = 'solid';
10 | parent.appendChild(title);
11 |
12 | var text = document.createTextNode(d.title);
13 | title.appendChild(text);
14 | });
15 | }
16 |
--------------------------------------------------------------------------------
/assets/less/hero-unit.less:
--------------------------------------------------------------------------------
1 | //
2 | // Hero unit
3 | // --------------------------------------------------
4 |
5 |
6 | .hero-unit {
7 | padding: 60px;
8 | margin-bottom: 30px;
9 | font-size: 18px;
10 | font-weight: 200;
11 | line-height: @baseLineHeight * 1.5;
12 | color: @heroUnitLeadColor;
13 | background-color: @heroUnitBackground;
14 | h1 {
15 | margin-bottom: 0;
16 | font-size: 60px;
17 | line-height: 1;
18 | color: @heroUnitHeadingColor;
19 | letter-spacing: -1px;
20 | }
21 | li {
22 | line-height: @baseLineHeight * 1.5; // Reset since we specify in type.less
23 | }
24 | }
25 |
--------------------------------------------------------------------------------
/assets/scss/_hero-unit.scss:
--------------------------------------------------------------------------------
1 | //
2 | // Hero unit
3 | // --------------------------------------------------
4 |
5 |
6 | .hero-unit {
7 | padding: 60px;
8 | margin-bottom: 30px;
9 | font-size: 18px;
10 | font-weight: 200;
11 | line-height: $baseLineHeight * 1.5;
12 | color: $heroUnitLeadColor;
13 | background-color: $heroUnitBackground;
14 | h1 {
15 | margin-bottom: 0;
16 | font-size: 60px;
17 | line-height: 1;
18 | color: $heroUnitHeadingColor;
19 | letter-spacing: -1px;
20 | }
21 | li {
22 | line-height: $baseLineHeight * 1.5; // Reset since we specify in type.scss
23 | }
24 | }
25 |
--------------------------------------------------------------------------------
/js/viewmodel.js:
--------------------------------------------------------------------------------
1 |
2 | function ImageViewModel(data) {
3 | this.Id = data.Id;
4 | this.Tag = data.Tag;
5 | this.Repository = data.Repository;
6 | this.Created = data.Created;
7 | this.Checked = false;
8 | this.RepoTags = data.RepoTags;
9 | this.VirtualSize = data.VirtualSize;
10 | }
11 |
12 | function ContainerViewModel(data) {
13 | this.Id = data.Id;
14 | this.Image = data.Image;
15 | this.Command = data.Command;
16 | this.Created = data.Created;
17 | this.SizeRw = data.SizeRw;
18 | this.Status = data.Status;
19 | this.Checked = false;
20 | this.Names = data.Names;
21 | }
22 |
--------------------------------------------------------------------------------
/assets/less/responsive-1200px-min.less:
--------------------------------------------------------------------------------
1 | //
2 | // Responsive: Large desktop and up
3 | // --------------------------------------------------
4 |
5 |
6 | @media (min-width: 1200px) {
7 |
8 | // Fixed grid
9 | #grid > .core(@gridColumnWidth1200, @gridGutterWidth1200);
10 |
11 | // Fluid grid
12 | #grid > .fluid(@fluidGridColumnWidth1200, @fluidGridGutterWidth1200);
13 |
14 | // Input grid
15 | #grid > .input(@gridColumnWidth1200, @gridGutterWidth1200);
16 |
17 | // Thumbnails
18 | .thumbnails {
19 | margin-left: -@gridGutterWidth1200;
20 | }
21 | .thumbnails > li {
22 | margin-left: @gridGutterWidth1200;
23 | }
24 | .row-fluid .thumbnails {
25 | margin-left: 0;
26 | }
27 |
28 | }
29 |
--------------------------------------------------------------------------------
/assets/scss/_responsive-1200px-min.scss:
--------------------------------------------------------------------------------
1 | //
2 | // Responsive: Large desktop and up
3 | // --------------------------------------------------
4 |
5 |
6 | @media (min-width: 1200px) {
7 |
8 | // Fixed grid
9 | @include grid-core($gridColumnWidth1200, $gridGutterWidth1200);
10 |
11 | // Fluid grid
12 | @include grid-fluid($fluidGridColumnWidth1200, $fluidGridGutterWidth1200);
13 |
14 | // Input grid
15 | @include grid-input($gridColumnWidth1200, $gridGutterWidth1200);
16 |
17 | // Thumbnails
18 | .thumbnails {
19 | margin-left: -$gridGutterWidth1200;
20 | }
21 | .thumbnails > li {
22 | margin-left: $gridGutterWidth1200;
23 | }
24 | .row-fluid .thumbnails {
25 | margin-left: 0;
26 | }
27 |
28 | }
29 |
--------------------------------------------------------------------------------
/assets/less/accordion.less:
--------------------------------------------------------------------------------
1 | //
2 | // Accordion
3 | // --------------------------------------------------
4 |
5 |
6 | // Parent container
7 | .accordion {
8 | margin-bottom: @baseLineHeight;
9 | }
10 |
11 | // Group == heading + body
12 | .accordion-group {
13 | margin-bottom: 2px;
14 | border: 1px solid #e5e5e5;
15 | }
16 | .accordion-heading {
17 | border-bottom: 0;
18 | }
19 | .accordion-heading .accordion-toggle {
20 | display: block;
21 | padding: 8px 15px;
22 | }
23 |
24 | // General toggle styles
25 | .accordion-toggle {
26 | cursor: pointer;
27 | }
28 |
29 | // Inner needs the styles because you can't animate properly with any styles on the element
30 | .accordion-inner {
31 | padding: 9px 15px;
32 | border-top: 1px solid #e5e5e5;
33 | }
34 |
--------------------------------------------------------------------------------
/assets/scss/_accordion.scss:
--------------------------------------------------------------------------------
1 | //
2 | // Accordion
3 | // --------------------------------------------------
4 |
5 |
6 | // Parent container
7 | .accordion {
8 | margin-bottom: $baseLineHeight;
9 | }
10 |
11 | // Group == heading + body
12 | .accordion-group {
13 | margin-bottom: 2px;
14 | border: 1px solid #e5e5e5;
15 | }
16 | .accordion-heading {
17 | border-bottom: 0;
18 | }
19 | .accordion-heading .accordion-toggle {
20 | display: block;
21 | padding: 8px 15px;
22 | }
23 |
24 | // General toggle styles
25 | .accordion-toggle {
26 | cursor: pointer;
27 | }
28 |
29 | // Inner needs the styles because you can't animate properly with any styles on the element
30 | .accordion-inner {
31 | padding: 9px 15px;
32 | border-top: 1px solid #e5e5e5;
33 | }
34 |
--------------------------------------------------------------------------------
/assets/less/close.less:
--------------------------------------------------------------------------------
1 | //
2 | // Close icons
3 | // --------------------------------------------------
4 |
5 |
6 | .close {
7 | float: right;
8 | font-size: 20px;
9 | font-weight: bold;
10 | line-height: @baseLineHeight;
11 | color: @black;
12 | text-shadow: 0 1px 0 rgba(255,255,255,1);
13 | .opacity(20);
14 | &:hover,
15 | &:focus {
16 | color: @black;
17 | text-decoration: none;
18 | cursor: pointer;
19 | .opacity(40);
20 | }
21 | }
22 |
23 | // Additional properties for button version
24 | // iOS requires the button element instead of an anchor tag.
25 | // If you want the anchor version, it requires `href="#"`.
26 | button.close {
27 | padding: 0;
28 | cursor: pointer;
29 | background: transparent;
30 | border: 0;
31 | -webkit-appearance: none;
32 | }
--------------------------------------------------------------------------------
/assets/scss/_utilities.scss:
--------------------------------------------------------------------------------
1 | //
2 | // Utility classes
3 | // --------------------------------------------------
4 |
5 |
6 | // Quick floats
7 | .pull-right {
8 | float: right;
9 | }
10 | .pull-left {
11 | float: left;
12 | }
13 |
14 | // Toggling content
15 | .hide {
16 | display: none;
17 | }
18 | .show {
19 | display: block;
20 | }
21 |
22 | // Visibility
23 | .invisible {
24 | visibility: hidden;
25 | }
26 |
27 | // For Affix plugin
28 | .affix {
29 | position: fixed;
30 | }
31 |
32 | // Clearing floats
33 | .clearfix {
34 | @include clearfix();
35 | }
36 |
37 | // Accessible yet invisible text
38 | .hide-text {
39 | @include hide-text();
40 | }
41 |
42 | // Uses box-sizing mixin, so must be defined here
43 | .input-block-level {
44 | @include input-block-level();
45 | }
46 |
--------------------------------------------------------------------------------
/assets/scss/_close.scss:
--------------------------------------------------------------------------------
1 | //
2 | // Close icons
3 | // --------------------------------------------------
4 |
5 |
6 | .close {
7 | float: right;
8 | font-size: 20px;
9 | font-weight: bold;
10 | line-height: $baseLineHeight;
11 | color: $black;
12 | text-shadow: 0 1px 0 rgba(255,255,255,1);
13 | @include opacity(20);
14 | &:hover,
15 | &:focus {
16 | color: $black;
17 | text-decoration: none;
18 | cursor: pointer;
19 | @include opacity(40);
20 | }
21 | }
22 |
23 | // Additional properties for button version
24 | // iOS requires the button element instead of an anchor tag.
25 | // If you want the anchor version, it requires `href="#"`.
26 | button.close {
27 | padding: 0;
28 | cursor: pointer;
29 | background: transparent;
30 | border: 0;
31 | -webkit-appearance: none;
32 | }
33 |
--------------------------------------------------------------------------------
/assets/js/tests/unit/bootstrap-phantom.js:
--------------------------------------------------------------------------------
1 | // Logging setup for phantom integration
2 | // adapted from Modernizr
3 |
4 | QUnit.begin = function () {
5 | console.log("Starting test suite")
6 | console.log("================================================\n")
7 | }
8 |
9 | QUnit.moduleDone = function (opts) {
10 | if (opts.failed === 0) {
11 | console.log("\u2714 All tests passed in '" + opts.name + "' module")
12 | } else {
13 | console.log("\u2716 " + opts.failed + " tests failed in '" + opts.name + "' module")
14 | }
15 | }
16 |
17 | QUnit.done = function (opts) {
18 | console.log("\n================================================")
19 | console.log("Tests completed in " + opts.runtime + " milliseconds")
20 | console.log(opts.passed + " tests of " + opts.total + " passed, " + opts.failed + " failed.")
21 | }
--------------------------------------------------------------------------------
/assets/scss/_scaffolding.scss:
--------------------------------------------------------------------------------
1 | //
2 | // Scaffolding
3 | // --------------------------------------------------
4 |
5 |
6 | // Body reset
7 | // -------------------------
8 |
9 | body {
10 | margin: 0;
11 | font-family: $baseFontFamily;
12 | font-size: $baseFontSize;
13 | line-height: $baseLineHeight;
14 | color: $textColor;
15 | background-color: $bodyBackground;
16 | }
17 |
18 |
19 | // Links
20 | // -------------------------
21 |
22 | a {
23 | color: $linkColor;
24 | text-decoration: none;
25 | }
26 | a:hover,
27 | a:focus {
28 | color: $linkColorHover;
29 | text-decoration: underline;
30 | }
31 |
32 |
33 | // Images
34 | // -------------------------
35 |
36 | // Add polaroid-esque trim
37 | .img-polaroid {
38 | padding: 4px;
39 | background-color: #fff;
40 | border: 1px solid #ccc;
41 | border: 1px solid rgba(0,0,0,.2);
42 | }
--------------------------------------------------------------------------------
/assets/less/scaffolding.less:
--------------------------------------------------------------------------------
1 | //
2 | // Scaffolding
3 | // --------------------------------------------------
4 |
5 |
6 | // Body reset
7 | // -------------------------
8 |
9 | body {
10 | margin: 0;
11 | font-family: @baseFontFamily;
12 | font-size: @baseFontSize;
13 | line-height: @baseLineHeight;
14 | color: @textColor;
15 | background-color: @bodyBackground;
16 | }
17 |
18 |
19 | // Links
20 | // -------------------------
21 |
22 | a {
23 | color: @linkColor;
24 | text-decoration: none;
25 | }
26 | a:hover,
27 | a:focus {
28 | color: @linkColorHover;
29 | text-decoration: underline;
30 | }
31 |
32 |
33 | // Images
34 | // -------------------------
35 |
36 |
37 | // Add polaroid-esque trim
38 | .img-polaroid {
39 | padding: 4px;
40 | background-color: #fff;
41 | border: 1px solid #ccc;
42 | border: 1px solid rgba(0,0,0,.2);
43 | }
44 |
--------------------------------------------------------------------------------
/assets/js/tests/unit/bootstrap-affix.js:
--------------------------------------------------------------------------------
1 | $(function () {
2 |
3 | module("bootstrap-affix")
4 |
5 | test("should provide no conflict", function () {
6 | var affix = $.fn.affix.noConflict()
7 | ok(!$.fn.affix, 'affix was set back to undefined (org value)')
8 | $.fn.affix = affix
9 | })
10 |
11 | test("should be defined on jquery object", function () {
12 | ok($(document.body).affix, 'affix method is defined')
13 | })
14 |
15 | test("should return element", function () {
16 | ok($(document.body).affix()[0] == document.body, 'document.body returned')
17 | })
18 |
19 | test("should exit early if element is not visible", function () {
20 | var $affix = $('
').affix()
21 | $affix.data('affix').checkPosition()
22 | ok(!$affix.hasClass('affix'), 'affix class was not added')
23 | })
24 |
25 | })
--------------------------------------------------------------------------------
/assets/less/pager.less:
--------------------------------------------------------------------------------
1 | //
2 | // Pager pagination
3 | // --------------------------------------------------
4 |
5 |
6 | .pager {
7 | margin: @baseLineHeight 0;
8 | list-style: none;
9 | text-align: center;
10 | .clearfix();
11 | }
12 | .pager li {
13 | display: inline;
14 | }
15 | .pager li > a,
16 | .pager li > span {
17 | display: inline-block;
18 | padding: 5px 14px;
19 | background-color: #fff;
20 | border: 1px solid #ddd;
21 | }
22 | .pager li > a:hover,
23 | .pager li > a:focus {
24 | text-decoration: none;
25 | background-color: #f5f5f5;
26 | }
27 | .pager .next > a,
28 | .pager .next > span {
29 | float: right;
30 | }
31 | .pager .previous > a,
32 | .pager .previous > span {
33 | float: left;
34 | }
35 | .pager .disabled > a,
36 | .pager .disabled > a:hover,
37 | .pager .disabled > a:focus,
38 | .pager .disabled > span {
39 | color: @grayLight;
40 | background-color: #fff;
41 | cursor: default;
42 | }
--------------------------------------------------------------------------------
/assets/scss/_pager.scss:
--------------------------------------------------------------------------------
1 | //
2 | // Pager pagination
3 | // --------------------------------------------------
4 |
5 |
6 | .pager {
7 | margin: $baseLineHeight 0;
8 | list-style: none;
9 | text-align: center;
10 | @include clearfix();
11 | }
12 | .pager li {
13 | display: inline;
14 | }
15 | .pager li > a,
16 | .pager li > span {
17 | display: inline-block;
18 | padding: 5px 14px;
19 | background-color: #fff;
20 | border: 1px solid #ddd;
21 | }
22 | .pager li > a:hover,
23 | .pager li > a:focus {
24 | text-decoration: none;
25 | background-color: #f5f5f5;
26 | }
27 | .pager .next > a,
28 | .pager .next > span {
29 | float: right;
30 | }
31 | .pager .previous > a,
32 | .pager .previous > span {
33 | float: left;
34 | }
35 | .pager .disabled > a,
36 | .pager .disabled > a:hover,
37 | .pager .disabled > a:focus,
38 | .pager .disabled > span {
39 | color: $grayLight;
40 | background-color: #fff;
41 | cursor: default;
42 | }
43 |
--------------------------------------------------------------------------------
/assets/js/google-code-prettify/prettify.css:
--------------------------------------------------------------------------------
1 | .com { color: #93a1a1; }
2 | .lit { color: #195f91; }
3 | .pun, .opn, .clo { color: #93a1a1; }
4 | .fun { color: #dc322f; }
5 | .str, .atv { color: #D14; }
6 | .kwd, .prettyprint .tag { color: #1e347b; }
7 | .typ, .atn, .dec, .var { color: teal; }
8 | .pln { color: #48484c; }
9 |
10 | .prettyprint {
11 | padding: 8px;
12 | background-color: #f7f7f9;
13 | border: 1px solid #e1e1e8;
14 | }
15 | .prettyprint.linenums {
16 | -webkit-box-shadow: inset 40px 0 0 #fbfbfc, inset 41px 0 0 #ececf0;
17 | -moz-box-shadow: inset 40px 0 0 #fbfbfc, inset 41px 0 0 #ececf0;
18 | box-shadow: inset 40px 0 0 #fbfbfc, inset 41px 0 0 #ececf0;
19 | }
20 |
21 | /* Specify class=linenums on a pre to get line numbering */
22 | ol.linenums {
23 | margin: 0 0 0 33px; /* IE indents via margin-left */
24 | }
25 | ol.linenums li {
26 | padding-left: 12px;
27 | color: #bebec5;
28 | line-height: 20px;
29 | text-shadow: 0 1px 0 #fff;
30 | }
--------------------------------------------------------------------------------
/LICENSE:
--------------------------------------------------------------------------------
1 | DockerUI: Copyright (c) 2013-2014 Michael Crosby. crosbymichael.com
2 |
3 | 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:
4 |
5 | The above copyright notice and this permission notice shall be included in all copies or substantial portions of the Software.
6 |
7 | 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.
8 |
--------------------------------------------------------------------------------
/assets/less/media.less:
--------------------------------------------------------------------------------
1 | // Media objects
2 | // Source: http://stubbornella.org/content/?p=497
3 | // --------------------------------------------------
4 |
5 |
6 | // Common styles
7 | // -------------------------
8 |
9 | // Clear the floats
10 | .media,
11 | .media-body {
12 | overflow: hidden;
13 | *overflow: visible;
14 | zoom: 1;
15 | }
16 |
17 | // Proper spacing between instances of .media
18 | .media,
19 | .media .media {
20 | margin-top: 15px;
21 | }
22 | .media:first-child {
23 | margin-top: 0;
24 | }
25 |
26 | // For images and videos, set to block
27 | .media-object {
28 | display: block;
29 | }
30 |
31 | // Reset margins on headings for tighter default spacing
32 | .media-heading {
33 | margin: 0 0 5px;
34 | }
35 |
36 |
37 | // Media image alignment
38 | // -------------------------
39 |
40 | .media > .pull-left {
41 | margin-right: 10px;
42 | }
43 | .media > .pull-right {
44 | margin-left: 10px;
45 | }
46 |
47 |
48 | // Media list variation
49 | // -------------------------
50 |
51 | // Undo default ul/ol styles
52 | .media-list {
53 | margin-left: 0;
54 | list-style: none;
55 | }
56 |
--------------------------------------------------------------------------------
/assets/scss/_media.scss:
--------------------------------------------------------------------------------
1 | // Media objects
2 | // Source: http://stubbornella.org/content/?p=497
3 | // --------------------------------------------------
4 |
5 |
6 | // Common styles
7 | // -------------------------
8 |
9 | // Clear the floats
10 | .media,
11 | .media-body {
12 | overflow: hidden;
13 | *overflow: visible;
14 | zoom: 1;
15 | }
16 |
17 | // Proper spacing between instances of .media
18 | .media,
19 | .media .media {
20 | margin-top: 15px;
21 | }
22 | .media:first-child {
23 | margin-top: 0;
24 | }
25 |
26 | // For images and videos, set to block
27 | .media-object {
28 | display: block;
29 | }
30 |
31 | // Reset margins on headings for tighter default spacing
32 | .media-heading {
33 | margin: 0 0 5px;
34 | }
35 |
36 |
37 | // Media image alignment
38 | // -------------------------
39 |
40 | .media > .pull-left {
41 | margin-right: 10px;
42 | }
43 | .media > .pull-right {
44 | margin-left: 10px;
45 | }
46 |
47 |
48 | // Media list variation
49 | // -------------------------
50 |
51 | // Undo default ul/ol styles
52 | .media-list {
53 | margin-left: 0;
54 | list-style: none;
55 | }
56 |
--------------------------------------------------------------------------------
/partials/startcontainer.html:
--------------------------------------------------------------------------------
1 |
2 |
6 |
7 |
28 |
29 |
32 |
33 |
--------------------------------------------------------------------------------
/assets/scss/bootstrap-responsive.scss:
--------------------------------------------------------------------------------
1 | /*!
2 | * Bootstrap Responsive v2.3.1
3 | *
4 | * Copyright 2012 Twitter, Inc
5 | * Licensed under the Apache License v2.0
6 | * http://www.apache.org/licenses/LICENSE-2.0
7 | *
8 | * Designed and built with all the love in the world @twitter by @mdo and @fat.
9 | */
10 |
11 |
12 | // Responsive
13 | // For phone and tablet devices
14 | // -------------------------------------------------------------
15 |
16 |
17 | // REPEAT VARIABLES & MIXINS
18 | // -------------------------
19 | // Required since we compile the responsive stuff separately
20 |
21 | @import "variables"; // Modify this for custom colors, font-sizes, etc
22 | @import "mixins";
23 |
24 |
25 | // RESPONSIVE CLASSES
26 | // ------------------
27 |
28 | @import "responsive-utilities";
29 |
30 |
31 | // MEDIA QUERIES
32 | // ------------------
33 |
34 | // Large desktops
35 | @import "responsive-1200px-min";
36 |
37 | // Tablets to regular desktops
38 | @import "responsive-768px-979px";
39 |
40 | // Phones to portrait tablets and narrow desktops
41 | @import "responsive-767px-max";
42 |
43 |
44 | // RESPONSIVE NAVBAR
45 | // ------------------
46 |
47 | // From 979px and below, show a button to toggle navbar contents
48 | @import "responsive-navbar";
49 |
--------------------------------------------------------------------------------
/assets/less/responsive.less:
--------------------------------------------------------------------------------
1 | /*!
2 | * Bootstrap Responsive v2.3.1
3 | *
4 | * Copyright 2012 Twitter, Inc
5 | * Licensed under the Apache License v2.0
6 | * http://www.apache.org/licenses/LICENSE-2.0
7 | *
8 | * Designed and built with all the love in the world @twitter by @mdo and @fat.
9 | */
10 |
11 |
12 | // Responsive.less
13 | // For phone and tablet devices
14 | // -------------------------------------------------------------
15 |
16 |
17 | // REPEAT VARIABLES & MIXINS
18 | // -------------------------
19 | // Required since we compile the responsive stuff separately
20 |
21 | @import "variables.less"; // Modify this for custom colors, font-sizes, etc
22 | @import "mixins.less";
23 |
24 |
25 | // RESPONSIVE CLASSES
26 | // ------------------
27 |
28 | @import "responsive-utilities.less";
29 |
30 |
31 | // MEDIA QUERIES
32 | // ------------------
33 |
34 | // Large desktops
35 | @import "responsive-1200px-min.less";
36 |
37 | // Tablets to regular desktops
38 | @import "responsive-768px-979px.less";
39 |
40 | // Phones to portrait tablets and narrow desktops
41 | @import "responsive-767px-max.less";
42 |
43 |
44 | // RESPONSIVE NAVBAR
45 | // ------------------
46 |
47 | // From 979px and below, show a button to toggle navbar contents
48 | @import "responsive-navbar.less";
49 |
--------------------------------------------------------------------------------
/assets/less/thumbnails.less:
--------------------------------------------------------------------------------
1 | //
2 | // Thumbnails
3 | // --------------------------------------------------
4 |
5 |
6 | // Note: `.thumbnails` and `.thumbnails > li` are overriden in responsive files
7 |
8 | // Make wrapper ul behave like the grid
9 | .thumbnails {
10 | margin-left: -@gridGutterWidth;
11 | list-style: none;
12 | .clearfix();
13 | }
14 | // Fluid rows have no left margin
15 | .row-fluid .thumbnails {
16 | margin-left: 0;
17 | }
18 |
19 | // Float li to make thumbnails appear in a row
20 | .thumbnails > li {
21 | float: left; // Explicity set the float since we don't require .span* classes
22 | margin-bottom: @baseLineHeight;
23 | margin-left: @gridGutterWidth;
24 | }
25 |
26 | // The actual thumbnail (can be `a` or `div`)
27 | .thumbnail {
28 | display: block;
29 | padding: 4px;
30 | line-height: @baseLineHeight;
31 | border: 1px solid #ddd;
32 | .transition(all .2s ease-in-out);
33 | }
34 | // Add a hover/focus state for linked versions only
35 | a.thumbnail:hover,
36 | a.thumbnail:focus {
37 | border-color: @linkColor;
38 | }
39 |
40 | // Images and captions
41 | .thumbnail > img {
42 | display: block;
43 | max-width: 100%;
44 | margin-left: auto;
45 | margin-right: auto;
46 | }
47 | .thumbnail .caption {
48 | padding: 9px;
49 | color: @gray;
50 | }
51 |
--------------------------------------------------------------------------------
/assets/scss/_thumbnails.scss:
--------------------------------------------------------------------------------
1 | //
2 | // Thumbnails
3 | // --------------------------------------------------
4 |
5 |
6 | // Note: `.thumbnails` and `.thumbnails > li` are overriden in responsive files
7 |
8 | // Make wrapper ul behave like the grid
9 | .thumbnails {
10 | margin-left: -$gridGutterWidth;
11 | list-style: none;
12 | @include clearfix();
13 | }
14 | // Fluid rows have no left margin
15 | .row-fluid .thumbnails {
16 | margin-left: 0;
17 | }
18 |
19 | // Float li to make thumbnails appear in a row
20 | .thumbnails > li {
21 | float: left; // Explicity set the float since we don't require .span* classes
22 | margin-bottom: $baseLineHeight;
23 | margin-left: $gridGutterWidth;
24 | }
25 |
26 | // The actual thumbnail (can be `a` or `div`)
27 | .thumbnail {
28 | display: block;
29 | padding: 4px;
30 | line-height: $baseLineHeight;
31 | border: 1px solid #ddd;
32 | @include transition(all .2s ease-in-out);
33 | }
34 | // Add a hover/focus state for linked versions only
35 | a.thumbnail:hover,
36 | a.thumbnail:focus {
37 | border-color: $linkColor;
38 | }
39 |
40 | // Images and captions
41 | .thumbnail > img {
42 | display: block;
43 | max-width: 100%;
44 | margin-left: auto;
45 | margin-right: auto;
46 | }
47 | .thumbnail .caption {
48 | padding: 9px;
49 | color: $gray;
50 | }
51 |
--------------------------------------------------------------------------------
/partials/images.html:
--------------------------------------------------------------------------------
1 |
2 |
3 |
4 | Images:
5 |
6 |
14 |
34 |
--------------------------------------------------------------------------------
/assets/js/tests/unit/bootstrap-scrollspy.js:
--------------------------------------------------------------------------------
1 | $(function () {
2 |
3 | module("bootstrap-scrollspy")
4 |
5 | test("should provide no conflict", function () {
6 | var scrollspy = $.fn.scrollspy.noConflict()
7 | ok(!$.fn.scrollspy, 'scrollspy was set back to undefined (org value)')
8 | $.fn.scrollspy = scrollspy
9 | })
10 |
11 | test("should be defined on jquery object", function () {
12 | ok($(document.body).scrollspy, 'scrollspy method is defined')
13 | })
14 |
15 | test("should return element", function () {
16 | ok($(document.body).scrollspy()[0] == document.body, 'document.body returned')
17 | })
18 |
19 | test("should switch active class on scroll", function () {
20 | var sectionHTML = '
'
21 | , $section = $(sectionHTML).append('#qunit-fixture')
22 | , topbarHTML =''
23 | + '
'
24 | + '
'
25 | + '
'
26 | + '
'
29 | + '
'
30 | + '
'
31 | + '
'
32 | , $topbar = $(topbarHTML).scrollspy()
33 |
34 | ok($topbar.find('.active', true))
35 | })
36 |
37 | })
--------------------------------------------------------------------------------
/js/app.js:
--------------------------------------------------------------------------------
1 | 'use strict';
2 |
3 | angular.module('dockerui', ['ngRoute', 'dockerui.services', 'dockerui.filters'])
4 | .config(['$routeProvider', function ($routeProvider) {
5 | $routeProvider.when('/', {templateUrl: 'partials/dashboard.html', controller: 'DashboardController'});
6 | $routeProvider.when('/containers/', {templateUrl: 'partials/containers.html', controller: 'ContainersController'});
7 | $routeProvider.when('/containers/:id/', {templateUrl: 'partials/container.html', controller: 'ContainerController'});
8 | $routeProvider.when('/images/', {templateUrl: 'partials/images.html', controller: 'ImagesController'});
9 | $routeProvider.when('/images/:id/', {templateUrl: 'partials/image.html', controller: 'ImageController'});
10 | $routeProvider.when('/settings', {templateUrl: 'partials/settings.html', controller: 'SettingsController'});
11 | $routeProvider.otherwise({redirectTo: '/'});
12 | }])
13 | // This is your docker url that the api will use to make requests
14 | // You need to set this to the api endpoint without the port i.e. http://192.168.1.9
15 | .constant('DOCKER_ENDPOINT', '/dockerapi')
16 | .constant('DOCKER_PORT', '') // Docker port, leave as an empty string if no port is requred. If you have a port, prefix it with a ':' i.e. :4243
17 | .constant('UI_VERSION', 'v0.4')
18 | .constant('DOCKER_API_VERSION', 'v1.8');
19 |
--------------------------------------------------------------------------------
/assets/less/code.less:
--------------------------------------------------------------------------------
1 | //
2 | // Code (inline and blocK)
3 | // --------------------------------------------------
4 |
5 |
6 | // Inline and block code styles
7 | code,
8 | pre {
9 | padding: 0 3px 2px;
10 | #font > #family > .monospace;
11 | font-size: @baseFontSize - 2;
12 | color: @grayDark;
13 | }
14 |
15 | // Inline code
16 | code {
17 | padding: 2px 4px;
18 | color: #d14;
19 | background-color: #f7f7f9;
20 | border: 1px solid #e1e1e8;
21 | white-space: nowrap;
22 | }
23 |
24 | // Blocks of code
25 | pre {
26 | display: block;
27 | padding: (@baseLineHeight - 1) / 2;
28 | margin: 0 0 @baseLineHeight / 2;
29 | font-size: @baseFontSize - 1; // 14px to 13px
30 | line-height: @baseLineHeight;
31 | word-break: break-all;
32 | word-wrap: break-word;
33 | white-space: pre;
34 | white-space: pre-wrap;
35 | background-color: #f5f5f5;
36 | border: 1px solid #ccc; // fallback for IE7-8
37 | border: 1px solid rgba(0,0,0,.15);
38 |
39 | // Make prettyprint styles more spaced out for readability
40 | &.prettyprint {
41 | margin-bottom: @baseLineHeight;
42 | }
43 |
44 | // Account for some code outputs that place code tags in pre tags
45 | code {
46 | padding: 0;
47 | color: inherit;
48 | white-space: pre;
49 | white-space: pre-wrap;
50 | background-color: transparent;
51 | border: 0;
52 | }
53 | }
54 |
55 | // Enable scrollable blocks of code
56 | .pre-scrollable {
57 | max-height: 340px;
58 | overflow-y: scroll;
59 | }
--------------------------------------------------------------------------------
/assets/scss/_code.scss:
--------------------------------------------------------------------------------
1 | //
2 | // Code (inline and blocK)
3 | // --------------------------------------------------
4 |
5 |
6 | // Inline and block code styles
7 | code,
8 | pre {
9 | padding: 0 3px 2px;
10 | @include font-family-monospace;
11 | font-size: $baseFontSize - 2;
12 | color: $grayDark;
13 | }
14 |
15 | // Inline code
16 | code {
17 | padding: 2px 4px;
18 | color: #d14;
19 | background-color: #f7f7f9;
20 | border: 1px solid #e1e1e8;
21 | white-space: nowrap;
22 | }
23 |
24 | // Blocks of code
25 | pre {
26 | display: block;
27 | padding: ($baseLineHeight - 1) / 2;
28 | margin: 0 0 $baseLineHeight / 2;
29 | font-size: $baseFontSize - 1; // 14px to 13px
30 | line-height: $baseLineHeight;
31 | word-break: break-all;
32 | word-wrap: break-word;
33 | white-space: pre;
34 | white-space: pre-wrap;
35 | background-color: #f5f5f5;
36 | border: 1px solid #ccc; // fallback for IE7-8
37 | border: 1px solid rgba(0,0,0,.15);
38 |
39 | // Make prettyprint styles more spaced out for readability
40 | &.prettyprint {
41 | margin-bottom: $baseLineHeight;
42 | }
43 |
44 | // Account for some code outputs that place code tags in pre tags
45 | code {
46 | padding: 0;
47 | color: inherit;
48 | white-space: pre;
49 | white-space: pre-wrap;
50 | background-color: transparent;
51 | border: 0;
52 | }
53 | }
54 |
55 | // Enable scrollable blocks of code
56 | .pre-scrollable {
57 | max-height: 340px;
58 | overflow-y: scroll;
59 | }
60 |
--------------------------------------------------------------------------------
/assets/scss/bootstrap.scss:
--------------------------------------------------------------------------------
1 | /*!
2 | * Bootstrap v2.3.1
3 | *
4 | * Copyright 2012 Twitter, Inc
5 | * Licensed under the Apache License v2.0
6 | * http://www.apache.org/licenses/LICENSE-2.0
7 | *
8 | * Designed and built with all the love in the world @twitter by @mdo and @fat.
9 | */
10 |
11 | // Core variables and mixins
12 | @import "variables"; // Modify this for custom colors, font-sizes, etc
13 | @import "mixins";
14 |
15 | // CSS Reset
16 | @import "reset";
17 |
18 | // Grid system and page structure
19 | @import "scaffolding";
20 | @import "grid";
21 | @import "layouts";
22 |
23 | // Base CSS
24 | @import "type";
25 | @import "code";
26 | @import "forms";
27 | @import "tables";
28 |
29 | // Components: common
30 | @import "font-awesome";
31 | @import "dropdowns";
32 | @import "wells";
33 | @import "component-animations";
34 | @import "close";
35 |
36 | // Components: Buttons & Alerts
37 | @import "buttons";
38 | @import "button-groups";
39 | @import "alerts"; // Note: alerts share common CSS with buttons and thus have styles in buttons
40 |
41 | // Components: Nav
42 | @import "navs";
43 | @import "navbar";
44 | @import "breadcrumbs";
45 | @import "pagination";
46 | @import "pager";
47 |
48 | // Components: Popovers
49 | @import "modals";
50 | @import "tooltip";
51 | @import "popovers";
52 |
53 | // Components: Misc
54 | @import "thumbnails";
55 | @import "media";
56 | @import "labels-badges";
57 | @import "progress-bars";
58 | @import "accordion";
59 | @import "carousel";
60 | @import "hero-unit";
61 |
62 | // Utility classes
63 | @import "utilities"; // Has to be last to override when necessary
64 |
--------------------------------------------------------------------------------
/partials/settings.html:
--------------------------------------------------------------------------------
1 |
2 |
Docker Information
3 |
4 |
5 | Endpoint: {{ endpoint }}
6 | Api Version: {{ apiVersion }}
7 | Version: {{ docker.Version }}
8 | Git Commit: {{ docker.GitCommit }}
9 | Go Version: {{ docker.GoVersion }}
10 |
11 |
12 |
13 |
14 |
15 |
16 | Containers:
17 | {{ info.Containers }}
18 |
19 |
20 | Images:
21 | {{ info.Images }}
22 |
23 |
24 | Debug:
25 | {{ info.Debug }}
26 |
27 |
28 | NFd:
29 | {{ info.NFd }}
30 |
31 |
32 | NGoroutines:
33 | {{ info.NGoroutines }}
34 |
35 |
36 | MemoryLimit:
37 | {{ info.MemoryLimit }}
38 |
39 |
40 | SwapLimit:
41 | {{ info.SwapLimit }}
42 |
43 |
44 | NFd:
45 | {{ info.NFd }}
46 |
47 |
48 |
49 |
50 |
--------------------------------------------------------------------------------
/assets/less/alerts.less:
--------------------------------------------------------------------------------
1 | //
2 | // Alerts
3 | // --------------------------------------------------
4 |
5 |
6 | // Base styles
7 | // -------------------------
8 |
9 | .alert {
10 | padding: 8px 35px 8px 14px;
11 | margin-bottom: @baseLineHeight;
12 | text-shadow: 0 1px 0 rgba(255,255,255,.5);
13 | background-color: @warningBackground;
14 | border: 1px solid @warningBorder;
15 | }
16 | .alert,
17 | .alert h4 {
18 | // Specified for the h4 to prevent conflicts of changing @headingsColor
19 | color: @warningText;
20 | }
21 | .alert h4 {
22 | margin: 0;
23 | }
24 |
25 | // Adjust close link position
26 | .alert .close {
27 | position: relative;
28 | top: -2px;
29 | right: -21px;
30 | line-height: @baseLineHeight;
31 | }
32 |
33 |
34 | // Alternate styles
35 | // -------------------------
36 |
37 | .alert-success {
38 | background-color: @successBackground;
39 | border-color: @successBorder;
40 | color: @successText;
41 | }
42 | .alert-success h4 {
43 | color: @successText;
44 | }
45 | .alert-danger,
46 | .alert-error {
47 | background-color: @errorBackground;
48 | border-color: @errorBorder;
49 | color: @errorText;
50 | }
51 | .alert-danger h4,
52 | .alert-error h4 {
53 | color: @errorText;
54 | }
55 | .alert-info {
56 | background-color: @infoBackground;
57 | border-color: @infoBorder;
58 | color: @infoText;
59 | }
60 | .alert-info h4 {
61 | color: @infoText;
62 | }
63 |
64 |
65 | // Block alerts
66 | // -------------------------
67 |
68 | .alert-block {
69 | padding-top: 14px;
70 | padding-bottom: 14px;
71 | }
72 | .alert-block > p,
73 | .alert-block > ul {
74 | margin-bottom: 0;
75 | }
76 | .alert-block p + p {
77 | margin-top: 5px;
78 | }
79 |
--------------------------------------------------------------------------------
/assets/scss/_alerts.scss:
--------------------------------------------------------------------------------
1 | //
2 | // Alerts
3 | // --------------------------------------------------
4 |
5 |
6 | // Base styles
7 | // -------------------------
8 |
9 | .alert {
10 | padding: 8px 35px 8px 14px;
11 | margin-bottom: $baseLineHeight;
12 | text-shadow: 0 1px 0 rgba(255,255,255,.5);
13 | background-color: $warningBackground;
14 | border: 1px solid $warningBorder;
15 | }
16 | .alert,
17 | .alert h4 {
18 | // Specified for the h4 to prevent conflicts of changing $headingsColor
19 | color: $warningText;
20 | }
21 | .alert h4 {
22 | margin: 0;
23 | }
24 |
25 | // Adjust close link position
26 | .alert .close {
27 | position: relative;
28 | top: -2px;
29 | right: -21px;
30 | line-height: $baseLineHeight;
31 | }
32 |
33 |
34 | // Alternate styles
35 | // -------------------------
36 |
37 | .alert-success {
38 | background-color: $successBackground;
39 | border-color: $successBorder;
40 | color: $successText;
41 | }
42 | .alert-success h4 {
43 | color: $successText;
44 | }
45 | .alert-danger,
46 | .alert-error {
47 | background-color: $errorBackground;
48 | border-color: $errorBorder;
49 | color: $errorText;
50 | }
51 | .alert-danger h4,
52 | .alert-error h4 {
53 | color: $errorText;
54 | }
55 | .alert-info {
56 | background-color: $infoBackground;
57 | border-color: $infoBorder;
58 | color: $infoText;
59 | }
60 | .alert-info h4 {
61 | color: $infoText;
62 | }
63 |
64 |
65 | // Block alerts
66 | // -------------------------
67 |
68 | .alert-block {
69 | padding-top: 14px;
70 | padding-bottom: 14px;
71 | }
72 | .alert-block > p,
73 | .alert-block > ul {
74 | margin-bottom: 0;
75 | }
76 | .alert-block p + p {
77 | margin-top: 5px;
78 | }
79 |
--------------------------------------------------------------------------------
/assets/less/bootstrap.less:
--------------------------------------------------------------------------------
1 | /*!
2 | * Bootstrap v2.3.1
3 | *
4 | * Copyright 2012 Twitter, Inc
5 | * Licensed under the Apache License v2.0
6 | * http://www.apache.org/licenses/LICENSE-2.0
7 | *
8 | * Designed and built with all the love in the world @twitter by @mdo and @fat.
9 | */
10 |
11 | // Core variables and mixins
12 | @import "variables.less"; // Modify this for custom colors, font-sizes, etc
13 | @import "mixins.less";
14 |
15 | // CSS Reset
16 | @import "reset.less";
17 |
18 | // Grid system and page structure
19 | @import "scaffolding.less";
20 | @import "grid.less";
21 | @import "layouts.less";
22 |
23 | // Base CSS
24 | @import "type.less";
25 | @import "code.less";
26 | @import "forms.less";
27 | @import "tables.less";
28 |
29 | // Components: common
30 | @import "font-awesome.less";
31 | @import "font-awesome-ie7.less";
32 | @import "dropdowns.less";
33 | @import "wells.less";
34 | @import "component-animations.less";
35 | @import "close.less";
36 |
37 | // Components: Buttons & Alerts
38 | @import "buttons.less";
39 | @import "button-groups.less";
40 | @import "alerts.less"; // Note: alerts share common CSS with buttons and thus have styles in buttons.less
41 |
42 | // Components: Nav
43 | @import "navs.less";
44 | @import "navbar.less";
45 | @import "breadcrumbs.less";
46 | @import "pagination.less";
47 | @import "pager.less";
48 |
49 | // Components: Popovers
50 | @import "modals.less";
51 | @import "tooltip.less";
52 | @import "popovers.less";
53 |
54 | // Components: Misc
55 | @import "thumbnails.less";
56 | @import "media.less";
57 | @import "labels-badges.less";
58 | @import "progress-bars.less";
59 | @import "accordion.less";
60 | @import "carousel.less";
61 | @import "hero-unit.less";
62 |
63 | // Utility classes
64 | @import "utilities.less"; // Has to be last to override when necessary
65 |
--------------------------------------------------------------------------------
/partials/dashboard.html:
--------------------------------------------------------------------------------
1 |
2 |
3 |
6 |
13 |
14 |
15 |
16 |
Running Containers
17 |
23 |
24 |
25 |
Status
26 |
27 | Get a better browser... Your holding everyone back.
28 |
29 |
30 |
31 |
32 |
33 |
34 |
35 |
Containers created
36 |
37 | Get a better browser... Your holding everyone back.
38 |
39 | Images created
40 |
41 | Get a better browser... Your holding everyone back.
42 |
43 |
44 |
45 |
--------------------------------------------------------------------------------
/assets/less/responsive-utilities.less:
--------------------------------------------------------------------------------
1 | //
2 | // Responsive: Utility classes
3 | // --------------------------------------------------
4 |
5 |
6 | // IE10 Metro responsive
7 | // Required for Windows 8 Metro split-screen snapping with IE10
8 | // Source: http://timkadlec.com/2012/10/ie10-snap-mode-and-responsive-design/
9 | @-ms-viewport{
10 | width: device-width;
11 | }
12 |
13 | // Hide from screenreaders and browsers
14 | // Credit: HTML5 Boilerplate
15 | .hidden {
16 | display: none;
17 | visibility: hidden;
18 | }
19 |
20 | // Visibility utilities
21 |
22 | // For desktops
23 | .visible-phone { display: none !important; }
24 | .visible-tablet { display: none !important; }
25 | .hidden-phone { }
26 | .hidden-tablet { }
27 | .hidden-desktop { display: none !important; }
28 | .visible-desktop { display: inherit !important; }
29 |
30 | // Tablets & small desktops only
31 | @media (min-width: 768px) and (max-width: 979px) {
32 | // Hide everything else
33 | .hidden-desktop { display: inherit !important; }
34 | .visible-desktop { display: none !important ; }
35 | // Show
36 | .visible-tablet { display: inherit !important; }
37 | // Hide
38 | .hidden-tablet { display: none !important; }
39 | }
40 |
41 | // Phones only
42 | @media (max-width: 767px) {
43 | // Hide everything else
44 | .hidden-desktop { display: inherit !important; }
45 | .visible-desktop { display: none !important; }
46 | // Show
47 | .visible-phone { display: inherit !important; } // Use inherit to restore previous behavior
48 | // Hide
49 | .hidden-phone { display: none !important; }
50 | }
51 |
52 | // Print utilities
53 | .visible-print { display: none !important; }
54 | .hidden-print { }
55 |
56 | @media print {
57 | .visible-print { display: inherit !important; }
58 | .hidden-print { display: none !important; }
59 | }
60 |
--------------------------------------------------------------------------------
/assets/less/tooltip.less:
--------------------------------------------------------------------------------
1 | //
2 | // Tooltips
3 | // --------------------------------------------------
4 |
5 |
6 | // Base class
7 | .tooltip {
8 | position: absolute;
9 | z-index: @zindexTooltip;
10 | display: block;
11 | visibility: visible;
12 | font-size: 11px;
13 | line-height: 1.4;
14 | .opacity(0);
15 | &.in { .opacity(80); }
16 | &.top { margin-top: -3px; padding: 5px 0; }
17 | &.right { margin-left: 3px; padding: 0 5px; }
18 | &.bottom { margin-top: 3px; padding: 5px 0; }
19 | &.left { margin-left: -3px; padding: 0 5px; }
20 | }
21 |
22 | // Wrapper for the tooltip content
23 | .tooltip-inner {
24 | max-width: 200px;
25 | padding: 8px;
26 | color: @tooltipColor;
27 | text-align: center;
28 | text-decoration: none;
29 | background-color: @tooltipBackground;
30 | }
31 |
32 | // Arrows
33 | .tooltip-arrow {
34 | position: absolute;
35 | width: 0;
36 | height: 0;
37 | border-color: transparent;
38 | border-style: solid;
39 | }
40 | .tooltip {
41 | &.top .tooltip-arrow {
42 | bottom: 0;
43 | left: 50%;
44 | margin-left: -@tooltipArrowWidth;
45 | border-width: @tooltipArrowWidth @tooltipArrowWidth 0;
46 | border-top-color: @tooltipArrowColor;
47 | }
48 | &.right .tooltip-arrow {
49 | top: 50%;
50 | left: 0;
51 | margin-top: -@tooltipArrowWidth;
52 | border-width: @tooltipArrowWidth @tooltipArrowWidth @tooltipArrowWidth 0;
53 | border-right-color: @tooltipArrowColor;
54 | }
55 | &.left .tooltip-arrow {
56 | top: 50%;
57 | right: 0;
58 | margin-top: -@tooltipArrowWidth;
59 | border-width: @tooltipArrowWidth 0 @tooltipArrowWidth @tooltipArrowWidth;
60 | border-left-color: @tooltipArrowColor;
61 | }
62 | &.bottom .tooltip-arrow {
63 | top: 0;
64 | left: 50%;
65 | margin-left: -@tooltipArrowWidth;
66 | border-width: 0 @tooltipArrowWidth @tooltipArrowWidth;
67 | border-bottom-color: @tooltipArrowColor;
68 | }
69 | }
70 |
--------------------------------------------------------------------------------
/assets/scss/_tooltip.scss:
--------------------------------------------------------------------------------
1 | //
2 | // Tooltips
3 | // --------------------------------------------------
4 |
5 |
6 | // Base class
7 | .tooltip {
8 | position: absolute;
9 | z-index: $zindexTooltip;
10 | display: block;
11 | visibility: visible;
12 | font-size: 11px;
13 | line-height: 1.4;
14 | @include opacity(0);
15 | &.in { @include opacity(80); }
16 | &.top { margin-top: -3px; padding: 5px 0; }
17 | &.right { margin-left: 3px; padding: 0 5px; }
18 | &.bottom { margin-top: 3px; padding: 5px 0; }
19 | &.left { margin-left: -3px; padding: 0 5px; }
20 | }
21 |
22 | // Wrapper for the tooltip content
23 | .tooltip-inner {
24 | max-width: 200px;
25 | padding: 8px;
26 | color: $tooltipColor;
27 | text-align: center;
28 | text-decoration: none;
29 | background-color: $tooltipBackground;
30 | }
31 |
32 | // Arrows
33 | .tooltip-arrow {
34 | position: absolute;
35 | width: 0;
36 | height: 0;
37 | border-color: transparent;
38 | border-style: solid;
39 | }
40 | .tooltip {
41 | &.top .tooltip-arrow {
42 | bottom: 0;
43 | left: 50%;
44 | margin-left: -$tooltipArrowWidth;
45 | border-width: $tooltipArrowWidth $tooltipArrowWidth 0;
46 | border-top-color: $tooltipArrowColor;
47 | }
48 | &.right .tooltip-arrow {
49 | top: 50%;
50 | left: 0;
51 | margin-top: -$tooltipArrowWidth;
52 | border-width: $tooltipArrowWidth $tooltipArrowWidth $tooltipArrowWidth 0;
53 | border-right-color: $tooltipArrowColor;
54 | }
55 | &.left .tooltip-arrow {
56 | top: 50%;
57 | right: 0;
58 | margin-top: -$tooltipArrowWidth;
59 | border-width: $tooltipArrowWidth 0 $tooltipArrowWidth $tooltipArrowWidth;
60 | border-left-color: $tooltipArrowColor;
61 | }
62 | &.bottom .tooltip-arrow {
63 | top: 0;
64 | left: 50%;
65 | margin-left: -$tooltipArrowWidth;
66 | border-width: 0 $tooltipArrowWidth $tooltipArrowWidth;
67 | border-bottom-color: $tooltipArrowColor;
68 | }
69 | }
70 |
--------------------------------------------------------------------------------
/assets/js/bootstrap-transition.js:
--------------------------------------------------------------------------------
1 | /* ===================================================
2 | * bootstrap-transition.js v2.3.1
3 | * http://twitter.github.com/bootstrap/javascript.html#transitions
4 | * ===================================================
5 | * Copyright 2012 Twitter, Inc.
6 | *
7 | * Licensed under the Apache License, Version 2.0 (the "License");
8 | * you may not use this file except in compliance with the License.
9 | * You may obtain a copy of the License at
10 | *
11 | * http://www.apache.org/licenses/LICENSE-2.0
12 | *
13 | * Unless required by applicable law or agreed to in writing, software
14 | * distributed under the License is distributed on an "AS IS" BASIS,
15 | * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
16 | * See the License for the specific language governing permissions and
17 | * limitations under the License.
18 | * ========================================================== */
19 |
20 |
21 | !function ($) {
22 |
23 | "use strict"; // jshint ;_;
24 |
25 |
26 | /* CSS TRANSITION SUPPORT (http://www.modernizr.com/)
27 | * ======================================================= */
28 |
29 | $(function () {
30 |
31 | $.support.transition = (function () {
32 |
33 | var transitionEnd = (function () {
34 |
35 | var el = document.createElement('bootstrap')
36 | , transEndEventNames = {
37 | 'WebkitTransition' : 'webkitTransitionEnd'
38 | , 'MozTransition' : 'transitionend'
39 | , 'OTransition' : 'oTransitionEnd otransitionend'
40 | , 'transition' : 'transitionend'
41 | }
42 | , name
43 |
44 | for (name in transEndEventNames){
45 | if (el.style[name] !== undefined) {
46 | return transEndEventNames[name]
47 | }
48 | }
49 |
50 | }())
51 |
52 | return transitionEnd && {
53 | end: transitionEnd
54 | }
55 |
56 | })()
57 |
58 | })
59 |
60 | }(window.jQuery);
--------------------------------------------------------------------------------
/partials/containers.html:
--------------------------------------------------------------------------------
1 |
2 | Containers:
3 |
4 |
5 |
17 |
18 |
19 | Display All
21 |
22 |
23 |
45 |
--------------------------------------------------------------------------------
/assets/less/labels-badges.less:
--------------------------------------------------------------------------------
1 | //
2 | // Labels and badges
3 | // --------------------------------------------------
4 |
5 |
6 | // Base classes
7 | .label,
8 | .badge {
9 | display: inline-block;
10 | padding: 2px 4px;
11 | font-size: @baseFontSize * .846;
12 | font-weight: bold;
13 | line-height: 14px; // ensure proper line-height if floated
14 | color: @white;
15 | vertical-align: baseline;
16 | white-space: nowrap;
17 | text-shadow: 0 -1px 0 rgba(0,0,0,.25);
18 | background-color: @grayLight;
19 | }
20 |
21 | .badge {
22 | padding-left: 9px;
23 | padding-right: 9px;
24 | }
25 |
26 | // Empty labels/badges collapse
27 | .label,
28 | .badge {
29 | &:empty {
30 | display: none;
31 | }
32 | }
33 |
34 | // Hover/focus state, but only for links
35 | a {
36 | &.label:hover,
37 | &.label:focus,
38 | &.badge:hover,
39 | &.badge:focus {
40 | color: @white;
41 | text-decoration: none;
42 | cursor: pointer;
43 | }
44 | }
45 |
46 | // Colors
47 | // Only give background-color difference to links (and to simplify, we don't qualifty with `a` but [href] attribute)
48 | .label,
49 | .badge {
50 | // Important (red)
51 | &-important { background-color: @errorText; }
52 | &-important[href] { background-color: darken(@errorText, 10%); }
53 | // Warnings (orange)
54 | &-warning { background-color: @orange; }
55 | &-warning[href] { background-color: darken(@orange, 10%); }
56 | // Success (green)
57 | &-success { background-color: @successText; }
58 | &-success[href] { background-color: darken(@successText, 10%); }
59 | // Info (turquoise)
60 | &-info { background-color: @infoText; }
61 | &-info[href] { background-color: darken(@infoText, 10%); }
62 | // Inverse (black)
63 | &-inverse { background-color: @grayDark; }
64 | &-inverse[href] { background-color: darken(@grayDark, 10%); }
65 | }
66 |
67 | // Quick fix for labels/badges in buttons
68 | .btn {
69 | .label,
70 | .badge {
71 | position: relative;
72 | top: -1px;
73 | }
74 | }
75 | .btn-mini {
76 | .label,
77 | .badge {
78 | top: 0;
79 | }
80 | }
81 |
--------------------------------------------------------------------------------
/assets/scss/_responsive-utilities.scss:
--------------------------------------------------------------------------------
1 | //
2 | // Responsive: Utility classes
3 | // --------------------------------------------------
4 |
5 |
6 | // IE10 Metro responsive
7 | // Required for Windows 8 Metro split-screen snapping with IE10
8 | // Source: http://timkadlec.com/2012/10/ie10-snap-mode-and-responsive-design/
9 | @-ms-viewport{
10 | width: device-width;
11 | }
12 |
13 | // Hide from screenreaders and browsers
14 | // Credit: HTML5 Boilerplate
15 | .hidden {
16 | display: none;
17 | visibility: hidden;
18 | }
19 |
20 | // Visibility utilities
21 |
22 | // For desktops
23 | .visible-phone { display: none !important; }
24 | .visible-tablet { display: none !important; }
25 | .hidden-phone { }
26 | .hidden-tablet { }
27 | .hidden-desktop { display: none !important; }
28 | .visible-desktop { display: inherit !important; }
29 |
30 | // Tablets & small desktops only
31 | @media (min-width: 768px) and (max-width: 979px) {
32 | // Hide everything else
33 | .hidden-desktop { display: inherit !important; }
34 | .visible-desktop { display: none !important ; }
35 | // Show
36 | .visible-tablet { display: inherit !important; }
37 | // Hide
38 | .hidden-tablet { display: none !important; }
39 | }
40 |
41 | // Phones only
42 | @media (max-width: 767px) {
43 | // Hide everything else
44 | .hidden-desktop { display: inherit !important; }
45 | .visible-desktop { display: none !important; }
46 | // Show
47 | .visible-phone { display: inherit !important; } // Use inherit to restore previous behavior
48 | // Hide
49 | .hidden-phone { display: none !important; }
50 | }
51 |
52 | // Print utilities
53 | .visible-print { display: none !important; }
54 | .hidden-print { }
55 |
56 | @media print {
57 | .visible-print { display: inherit !important; }
58 | .hidden-print { display: none !important; }
59 | }
60 |
61 | // Clearing floats
62 | .clearfix {
63 | @include clearfix();
64 | }
65 |
66 | // Accessible yet invisible text
67 | .hide-text {
68 | @include hide-text();
69 | }
70 |
71 | // Uses box-sizing mixin, so must be defined here
72 | .input-block-level {
73 | @include input-block-level();
74 | }
75 |
--------------------------------------------------------------------------------
/assets/scss/_labels-badges.scss:
--------------------------------------------------------------------------------
1 | //
2 | // Labels and badges
3 | // --------------------------------------------------
4 |
5 |
6 | // Base classes
7 | .label,
8 | .badge {
9 | display: inline-block;
10 | padding: 2px 4px;
11 | font-size: $baseFontSize * .846;
12 | font-weight: bold;
13 | line-height: 14px; // ensure proper line-height if floated
14 | color: $white;
15 | vertical-align: baseline;
16 | white-space: nowrap;
17 | text-shadow: 0 -1px 0 rgba(0,0,0,.25);
18 | background-color: $grayLight;
19 | }
20 |
21 | .badge {
22 | padding-left: 9px;
23 | padding-right: 9px;
24 | }
25 |
26 | // Empty labels/badges collapse
27 | .label,
28 | .badge {
29 | &:empty {
30 | display: none;
31 | }
32 | }
33 |
34 | // Hover/focus state, but only for links
35 | a {
36 | &.label:hover,
37 | &.label:focus,
38 | &.badge:hover,
39 | &.badge:focus {
40 | color: $white;
41 | text-decoration: none;
42 | cursor: pointer;
43 | }
44 | }
45 |
46 | // Colors
47 | // Only give background-color difference to links (and to simplify, we don't qualifty with `a` but [href] attribute)
48 | @each $item in label, badge {
49 | // Important (red)
50 | .#{$item}-important { background-color: $errorText; }
51 | .#{$item}-important[href] { background-color: darken($errorText, 10%); }
52 | // Warnings (orange)
53 | .#{$item}-warning { background-color: $orange; }
54 | .#{$item}-warning[href] { background-color: darken($orange, 10%); }
55 | // Success (green)
56 | .#{$item}-success { background-color: $successText; }
57 | .#{$item}-success[href] { background-color: darken($successText, 10%); }
58 | // Info (turquoise)
59 | .#{$item}-info { background-color: $infoText; }
60 | .#{$item}-info[href] { background-color: darken($infoText, 10%); }
61 | // Inverse (black)
62 | .#{$item}-inverse { background-color: $grayDark; }
63 | .#{$item}-inverse[href] { background-color: darken($grayDark, 10%); }
64 | }
65 |
66 | // Quick fix for labels/badges in buttons
67 | .btn {
68 | .label,
69 | .badge {
70 | position: relative;
71 | top: -1px;
72 | }
73 | }
74 | .btn-mini {
75 | .label,
76 | .badge {
77 | top: 0;
78 | }
79 | }
80 |
--------------------------------------------------------------------------------
/assets/less/modals.less:
--------------------------------------------------------------------------------
1 | //
2 | // Modals
3 | // --------------------------------------------------
4 |
5 | // Background
6 | .modal-backdrop {
7 | position: fixed;
8 | top: 0;
9 | right: 0;
10 | bottom: 0;
11 | left: 0;
12 | z-index: @zindexModalBackdrop;
13 | background-color: @black;
14 | // Fade for backdrop
15 | &.fade { opacity: 0; }
16 | }
17 |
18 | .modal-backdrop,
19 | .modal-backdrop.fade.in {
20 | .opacity(80);
21 | }
22 |
23 | // Base modal
24 | .modal {
25 | position: fixed;
26 | top: 10%;
27 | left: 50%;
28 | z-index: @zindexModal;
29 | width: 560px;
30 | margin-left: -280px;
31 | background-color: @white;
32 | border: 1px solid #999;
33 | border: 1px solid rgba(0,0,0,.3);
34 | *border: 1px solid #999; /* IE6-7 */
35 | .background-clip(padding-box);
36 | // Remove focus outline from opened modal
37 | outline: none;
38 |
39 | &.fade {
40 | .transition(e('opacity .3s linear, top .3s ease-out'));
41 | top: -25%;
42 | }
43 | &.fade.in { top: 10%; }
44 | }
45 | .modal-header {
46 | padding: 9px 15px;
47 | border-bottom: 1px solid #eee;
48 | // Close icon
49 | .close { margin-top: 2px; }
50 | // Heading
51 | h3 {
52 | margin: 0;
53 | line-height: 30px;
54 | }
55 | }
56 |
57 | // Body (where all modal content resides)
58 | .modal-body {
59 | position: relative;
60 | overflow-y: auto;
61 | max-height: 400px;
62 | padding: 15px;
63 | }
64 | // Remove bottom margin if need be
65 | .modal-form {
66 | margin-bottom: 0;
67 | }
68 |
69 | // Footer (for actions)
70 | .modal-footer {
71 | padding: 14px 15px 15px;
72 | margin-bottom: 0;
73 | text-align: right; // right align buttons
74 | background-color: #f5f5f5;
75 | border-top: 1px solid #ddd;
76 | .clearfix(); // clear it in case folks use .pull-* classes on buttons
77 |
78 | // Properly space out buttons
79 | .btn + .btn {
80 | margin-left: 5px;
81 | margin-bottom: 0; // account for input[type="submit"] which gets the bottom margin like all other inputs
82 | }
83 | // but override that for button groups
84 | .btn-group .btn + .btn {
85 | margin-left: -1px;
86 | }
87 | // and override it for block buttons as well
88 | .btn-block + .btn-block {
89 | margin-left: 0;
90 | }
91 | }
92 |
--------------------------------------------------------------------------------
/assets/scss/_modals.scss:
--------------------------------------------------------------------------------
1 | //
2 | // Modals
3 | // --------------------------------------------------
4 |
5 | // Background
6 | .modal-backdrop {
7 | position: fixed;
8 | top: 0;
9 | right: 0;
10 | bottom: 0;
11 | left: 0;
12 | z-index: $zindexModalBackdrop;
13 | background-color: $black;
14 | // Fade for backdrop
15 | &.fade { opacity: 0; }
16 | }
17 |
18 | .modal-backdrop,
19 | .modal-backdrop.fade.in {
20 | @include opacity(80);
21 | }
22 |
23 | // Base modal
24 | .modal {
25 | position: fixed;
26 | top: 10%;
27 | left: 50%;
28 | z-index: $zindexModal;
29 | width: 560px;
30 | margin-left: -280px;
31 | background-color: $white;
32 | border: 1px solid #999;
33 | border: 1px solid rgba(0,0,0,.3);
34 | *border: 1px solid #999; /* IE6-7 */
35 | @include background-clip(padding-box);
36 | // Remove focus outline from opened modal
37 | outline: none;
38 |
39 | &.fade {
40 | @include transition(opacity .3s linear, top .3s ease-out);
41 | top: -25%;
42 | }
43 | &.fade.in { top: 10%; }
44 | }
45 | .modal-header {
46 | padding: 9px 15px;
47 | border-bottom: 1px solid #eee;
48 | // Close icon
49 | .close { margin-top: 2px; }
50 | // Heading
51 | h3 {
52 | margin: 0;
53 | line-height: 30px;
54 | }
55 | }
56 |
57 | // Body (where all modal content resides)
58 | .modal-body {
59 | position: relative;
60 | overflow-y: auto;
61 | max-height: 400px;
62 | padding: 15px;
63 | }
64 | // Remove bottom margin if need be
65 | .modal-form {
66 | margin-bottom: 0;
67 | }
68 |
69 | // Footer (for actions)
70 | .modal-footer {
71 | padding: 14px 15px 15px;
72 | margin-bottom: 0;
73 | text-align: right; // right align buttons
74 | background-color: #f5f5f5;
75 | border-top: 1px solid #ddd;
76 | @include clearfix(); // clear it in case folks use .pull-* classes on buttons
77 |
78 | // Properly space out buttons
79 | .btn + .btn {
80 | margin-left: 5px;
81 | margin-bottom: 0; // account for input[type="submit"] which gets the bottom margin like all other inputs
82 | }
83 | // but override that for button groups
84 | .btn-group .btn + .btn {
85 | margin-left: -1px;
86 | }
87 | // and override it for block buttons as well
88 | .btn-block + .btn-block {
89 | margin-left: 0;
90 | }
91 | }
92 |
--------------------------------------------------------------------------------
/assets/js/tests/index.html:
--------------------------------------------------------------------------------
1 |
2 |
3 |
4 | Bootstrap Plugin Test Suite
5 |
6 |
7 |
8 |
9 |
10 |
11 |
12 |
13 |
14 |
15 |
16 |
17 |
18 |
19 |
20 |
21 |
22 |
23 |
24 |
25 |
26 |
27 |
28 |
29 |
30 |
31 |
32 |
33 |
34 |
35 |
36 |
37 |
38 |
39 |
40 |
41 |
42 |
43 |
44 |
45 |
46 |
47 |
48 |
49 |
50 |
51 |
52 |
53 |
54 |
55 |
56 |
--------------------------------------------------------------------------------
/assets/js/tests/unit/bootstrap-alert.js:
--------------------------------------------------------------------------------
1 | $(function () {
2 |
3 | module("bootstrap-alerts")
4 |
5 | test("should provide no conflict", function () {
6 | var alert = $.fn.alert.noConflict()
7 | ok(!$.fn.alert, 'alert was set back to undefined (org value)')
8 | $.fn.alert = alert
9 | })
10 |
11 | test("should be defined on jquery object", function () {
12 | ok($(document.body).alert, 'alert method is defined')
13 | })
14 |
15 | test("should return element", function () {
16 | ok($(document.body).alert()[0] == document.body, 'document.body returned')
17 | })
18 |
19 | test("should fade element out on clicking .close", function () {
20 | var alertHTML = ''
21 | + '
× '
22 | + '
Holy guacamole! Best check yo self, you\'re not looking too good.
'
23 | + '
'
24 | , alert = $(alertHTML).alert()
25 |
26 | alert.find('.close').click()
27 |
28 | ok(!alert.hasClass('in'), 'remove .in class on .close click')
29 | })
30 |
31 | test("should remove element when clicking .close", function () {
32 | $.support.transition = false
33 |
34 | var alertHTML = ''
35 | + '
× '
36 | + '
Holy guacamole! Best check yo self, you\'re not looking too good.
'
37 | + '
'
38 | , alert = $(alertHTML).appendTo('#qunit-fixture').alert()
39 |
40 | ok($('#qunit-fixture').find('.alert-message').length, 'element added to dom')
41 |
42 | alert.find('.close').click()
43 |
44 | ok(!$('#qunit-fixture').find('.alert-message').length, 'element removed from dom')
45 | })
46 |
47 | test("should not fire closed when close is prevented", function () {
48 | $.support.transition = false
49 | stop();
50 | $('
')
51 | .bind('close', function (e) {
52 | e.preventDefault();
53 | ok(true);
54 | start();
55 | })
56 | .bind('closed', function () {
57 | ok(false);
58 | })
59 | .alert('close')
60 | })
61 |
62 | })
--------------------------------------------------------------------------------
/assets/scss/_pagination.scss:
--------------------------------------------------------------------------------
1 | //
2 | // Pagination (multiple pages)
3 | // --------------------------------------------------
4 |
5 | // Space out pagination from surrounding content
6 | .pagination {
7 | margin: $baseLineHeight 0;
8 | }
9 |
10 | .pagination ul {
11 | // Allow for text-based alignment
12 | display: inline-block;
13 | @include ie7-inline-block();
14 | // Reset default ul styles
15 | margin-left: 0;
16 | margin-bottom: 0;
17 | }
18 | .pagination ul > li {
19 | display: inline; // Remove list-style and block-level defaults
20 | }
21 | .pagination ul > li > a,
22 | .pagination ul > li > span {
23 | float: left; // Collapse white-space
24 | padding: 4px 12px;
25 | line-height: $baseLineHeight;
26 | text-decoration: none;
27 | background-color: $paginationBackground;
28 | border: 1px solid $paginationBorder;
29 | border-left-width: 0;
30 | }
31 | .pagination ul > li > a:hover,
32 | .pagination ul > li > a:focus,
33 | .pagination ul > .active > a,
34 | .pagination ul > .active > span {
35 | background-color: $paginationActiveBackground;
36 | }
37 | .pagination ul > .active > a,
38 | .pagination ul > .active > span {
39 | color: $grayLight;
40 | cursor: default;
41 | }
42 | .pagination ul > .disabled > span,
43 | .pagination ul > .disabled > a,
44 | .pagination ul > .disabled > a:hover,
45 | .pagination ul > .disabled > a:focus {
46 | color: $grayLight;
47 | background-color: transparent;
48 | cursor: default;
49 | }
50 | .pagination ul > li:first-child > a,
51 | .pagination ul > li:first-child > span {
52 | border-left-width: 1px;
53 | }
54 |
55 |
56 | // Alignment
57 | // --------------------------------------------------
58 |
59 | .pagination-centered {
60 | text-align: center;
61 | }
62 | .pagination-right {
63 | text-align: right;
64 | }
65 |
66 |
67 | // Sizing
68 | // --------------------------------------------------
69 |
70 | // Large
71 | .pagination-large {
72 | ul > li > a,
73 | ul > li > span {
74 | padding: $paddingLarge;
75 | font-size: $fontSizeLarge;
76 | }
77 | }
78 |
79 | // Small
80 | .pagination-small {
81 | ul > li > a,
82 | ul > li > span {
83 | padding: $paddingSmall;
84 | font-size: $fontSizeSmall;
85 | }
86 | }
87 | // Mini
88 | .pagination-mini {
89 | ul > li > a,
90 | ul > li > span {
91 | padding: $paddingMini;
92 | font-size: $fontSizeMini;
93 | }
94 | }
95 |
--------------------------------------------------------------------------------
/assets/less/pagination.less:
--------------------------------------------------------------------------------
1 | //
2 | // Pagination (multiple pages)
3 | // --------------------------------------------------
4 |
5 | // Space out pagination from surrounding content
6 | .pagination {
7 | margin: @baseLineHeight 0;
8 | }
9 |
10 | .pagination ul {
11 | // Allow for text-based alignment
12 | display: inline-block;
13 | .ie7-inline-block();
14 | // Reset default ul styles
15 | margin-left: 0;
16 | margin-bottom: 0;
17 | // Visuals
18 | }
19 | .pagination ul > li {
20 | display: inline; // Remove list-style and block-level defaults
21 | }
22 | .pagination ul > li > a,
23 | .pagination ul > li > span {
24 | float: left; // Collapse white-space
25 | padding: 4px 12px;
26 | line-height: @baseLineHeight;
27 | text-decoration: none;
28 | background-color: @paginationBackground;
29 | border: 1px solid @paginationBorder;
30 | border-left-width: 0;
31 | }
32 | .pagination ul > li > a:hover,
33 | .pagination ul > li > a:focus,
34 | .pagination ul > .active > a,
35 | .pagination ul > .active > span {
36 | background-color: @paginationActiveBackground;
37 | }
38 | .pagination ul > .active > a,
39 | .pagination ul > .active > span {
40 | color: @grayLight;
41 | cursor: default;
42 | }
43 | .pagination ul > .disabled > span,
44 | .pagination ul > .disabled > a,
45 | .pagination ul > .disabled > a:hover,
46 | .pagination ul > .disabled > a:focus {
47 | color: @grayLight;
48 | background-color: transparent;
49 | cursor: default;
50 | }
51 | .pagination ul > li:first-child > a,
52 | .pagination ul > li:first-child > span {
53 | border-left-width: 1px;
54 | }
55 |
56 |
57 | // Alignment
58 | // --------------------------------------------------
59 |
60 | .pagination-centered {
61 | text-align: center;
62 | }
63 | .pagination-right {
64 | text-align: right;
65 | }
66 |
67 |
68 | // Sizing
69 | // --------------------------------------------------
70 |
71 | // Large
72 | .pagination-large {
73 | ul > li > a,
74 | ul > li > span {
75 | padding: @paddingLarge;
76 | font-size: @fontSizeLarge;
77 | }
78 | }
79 |
80 | // Small
81 | .pagination-small {
82 | ul > li > a,
83 | ul > li > span {
84 | padding: @paddingSmall;
85 | font-size: @fontSizeSmall;
86 | }
87 | }
88 | // Mini
89 | .pagination-mini {
90 | ul > li > a,
91 | ul > li > span {
92 | padding: @paddingMini;
93 | font-size: @fontSizeMini;
94 | }
95 | }
96 |
--------------------------------------------------------------------------------
/css/app.css:
--------------------------------------------------------------------------------
1 | body {
2 | padding-top: 20px;
3 | padding-bottom: 60px;
4 | }
5 |
6 | .container {
7 | margin: 0 auto;
8 | max-width: 1000px;
9 | }
10 |
11 | .container > hr {
12 | margin: 60px 0;
13 | }
14 |
15 | .jumbotron {
16 | margin: 80px 0;
17 | text-align: center;
18 | }
19 |
20 | .jumbotron h1 {
21 | font-size: 100px;
22 | line-height: 1;
23 | }
24 |
25 | .jumbotron .lead {
26 | font-size: 24px;
27 | line-height: 1.25;
28 | }
29 |
30 | .jumbotron .btn {
31 | font-size: 21px;
32 | padding: 14px 24px;
33 | }
34 |
35 | .marketing {
36 | margin: 60px 0;
37 | }
38 |
39 | .marketing p + h4 {
40 | margin-top: 28px;
41 | }
42 |
43 | .navbar .navbar-inner {
44 | padding: 0;
45 | }
46 |
47 | .navbar .nav {
48 | margin: 0;
49 | }
50 |
51 | .navbar .nav li {
52 | display: table-cell;
53 | width: 1%;
54 | float: none;
55 | }
56 |
57 | .navbar .nav li a {
58 | font-weight: bold;
59 | text-align: center;
60 | border-left: 1px solid rgba(255,255,255,.75);
61 | border-right: 1px solid rgba(0,0,0,.1);
62 | }
63 |
64 | .navbar .nav li:first-child a {
65 | border-left: 0;
66 | border-radius: 3px 0 0 3px;
67 | }
68 | .navbar .nav li:last-child a {
69 | border-right: 0;
70 | border-radius: 0 3px 3px 0;
71 | }
72 |
73 | .btn-group button {
74 | margin: 3px;
75 | }
76 |
77 | .detail {
78 | width: 80%;
79 | margin: 0 auto;
80 | }
81 |
82 | .center {
83 | width: 80%;
84 | margin: 0 auto;
85 | }
86 |
87 | .btn-remove {
88 | margin: 0 auto;
89 | max-width: 70%;
90 | }
91 |
92 | .actions {
93 | margin: 0 auto;
94 | }
95 |
96 | .container-bottom {
97 | height: 50px;
98 | }
99 |
100 | .footer {
101 | max-height:6px;
102 | }
103 |
104 | #response {
105 | width: 80%;
106 | margin: 0 auto;
107 | }
108 |
109 | #editor {
110 | height: 300px;
111 | width: 100%;
112 | border: 1px solid #DDD;
113 | margin-top: 5px;
114 | }
115 |
116 | .messages {
117 | max-height: 50px;
118 | overflow-y: scroll;
119 | overflow-x: hidden;
120 | }
121 |
122 | .legend .title {
123 | margin: 0.5em;
124 | border-style: solid;
125 | border-width: 0 0 0 1em;
126 | padding: 0 0.3em;
127 | }
128 |
129 | th.wide-th {
130 | width: 120px;
131 | }
--------------------------------------------------------------------------------
/assets/js/tests/phantom.js:
--------------------------------------------------------------------------------
1 | // Simple phantom.js integration script
2 | // Adapted from Modernizr
3 |
4 | function waitFor(testFx, onReady, timeOutMillis) {
5 | var maxtimeOutMillis = timeOutMillis ? timeOutMillis : 5001 //< Default Max Timout is 5s
6 | , start = new Date().getTime()
7 | , condition = false
8 | , interval = setInterval(function () {
9 | if ((new Date().getTime() - start < maxtimeOutMillis) && !condition) {
10 | // If not time-out yet and condition not yet fulfilled
11 | condition = (typeof(testFx) === "string" ? eval(testFx) : testFx()) //< defensive code
12 | } else {
13 | if (!condition) {
14 | // If condition still not fulfilled (timeout but condition is 'false')
15 | console.log("'waitFor()' timeout")
16 | phantom.exit(1)
17 | } else {
18 | // Condition fulfilled (timeout and/or condition is 'true')
19 | typeof(onReady) === "string" ? eval(onReady) : onReady() //< Do what it's supposed to do once the condition is fulfilled
20 | clearInterval(interval) //< Stop this interval
21 | }
22 | }
23 | }, 100) //< repeat check every 100ms
24 | }
25 |
26 |
27 | if (phantom.args.length === 0 || phantom.args.length > 2) {
28 | console.log('Usage: phantom.js URL')
29 | phantom.exit()
30 | }
31 |
32 | var page = new WebPage()
33 |
34 | // Route "console.log()" calls from within the Page context to the main Phantom context (i.e. current "this")
35 | page.onConsoleMessage = function(msg) {
36 | console.log(msg)
37 | };
38 |
39 | page.open(phantom.args[0], function(status){
40 | if (status !== "success") {
41 | console.log("Unable to access network")
42 | phantom.exit()
43 | } else {
44 | waitFor(function(){
45 | return page.evaluate(function(){
46 | var el = document.getElementById('qunit-testresult')
47 | if (el && el.innerText.match('completed')) {
48 | return true
49 | }
50 | return false
51 | })
52 | }, function(){
53 | var failedNum = page.evaluate(function(){
54 | var el = document.getElementById('qunit-testresult')
55 | try {
56 | return el.getElementsByClassName('failed')[0].innerHTML
57 | } catch (e) { }
58 | return 10000
59 | });
60 | phantom.exit((parseInt(failedNum, 10) > 0) ? 1 : 0)
61 | })
62 | }
63 | })
--------------------------------------------------------------------------------
/dockerui.go:
--------------------------------------------------------------------------------
1 | package main
2 |
3 | import (
4 | "flag"
5 | "io"
6 | "log"
7 | "net"
8 | "net/http"
9 | "net/http/httputil"
10 | "net/url"
11 | "os"
12 | "strings"
13 | )
14 |
15 | var (
16 | endpoint = flag.String("e", "/var/run/docker.sock", "Dockerd endpoint")
17 | addr = flag.String("p", ":9000", "Address and port to serve dockerui")
18 | assets = flag.String("a", ".", "Path to the assets")
19 | )
20 |
21 | type UnixHandler struct {
22 | path string
23 | }
24 |
25 | func (h *UnixHandler) ServeHTTP(w http.ResponseWriter, r *http.Request) {
26 | conn, err := net.Dial("unix", h.path)
27 | if err != nil {
28 | w.WriteHeader(http.StatusInternalServerError)
29 | log.Println(err)
30 | return
31 | }
32 | c := httputil.NewClientConn(conn, nil)
33 | defer c.Close()
34 |
35 | res, err := c.Do(r)
36 | if err != nil {
37 | w.WriteHeader(http.StatusInternalServerError)
38 | log.Println(err)
39 | return
40 | }
41 | defer res.Body.Close()
42 |
43 | copyHeader(w.Header(), res.Header)
44 | if _, err := io.Copy(w, res.Body); err != nil {
45 | log.Println(err)
46 | }
47 | }
48 |
49 | func copyHeader(dst, src http.Header) {
50 | for k, vv := range src {
51 | for _, v := range vv {
52 | dst.Add(k, v)
53 | }
54 | }
55 | }
56 |
57 | func createTcpHandler(e string) http.Handler {
58 | u, err := url.Parse(e)
59 | if err != nil {
60 | log.Fatal(err)
61 | }
62 | return httputil.NewSingleHostReverseProxy(u)
63 | }
64 |
65 | func createUnixHandler(e string) http.Handler {
66 | return &UnixHandler{e}
67 | }
68 |
69 | func createHandler(dir string, e string) http.Handler {
70 | var (
71 | mux = http.NewServeMux()
72 | fileHandler = http.FileServer(http.Dir(dir))
73 | h http.Handler
74 | )
75 |
76 | if strings.Contains(e, "http") {
77 | h = createTcpHandler(e)
78 | } else {
79 | if _, err := os.Stat(e); err != nil {
80 | if os.IsNotExist(err) {
81 | log.Fatalf("unix socket %s does not exist", e)
82 | }
83 | log.Fatal(err)
84 | }
85 | h = createUnixHandler(e)
86 | }
87 |
88 | mux.Handle("/dockerapi/", http.StripPrefix("/dockerapi", h))
89 | mux.Handle("/", fileHandler)
90 | return mux
91 | }
92 |
93 | func main() {
94 | flag.Parse()
95 |
96 | handler := createHandler(*assets, *endpoint)
97 | if err := http.ListenAndServe(*addr, handler); err != nil {
98 | log.Fatal(err)
99 | }
100 | }
101 |
--------------------------------------------------------------------------------
/lib/jquery.gritter.css:
--------------------------------------------------------------------------------
1 | /* the norm */
2 | #gritter-notice-wrapper {
3 | position:fixed;
4 | top:20px;
5 | right:20px;
6 | width:301px;
7 | z-index:9999;
8 | }
9 | #gritter-notice-wrapper.top-left {
10 | left: 20px;
11 | right: auto;
12 | }
13 | #gritter-notice-wrapper.bottom-right {
14 | top: auto;
15 | left: auto;
16 | bottom: 20px;
17 | right: 20px;
18 | }
19 | #gritter-notice-wrapper.bottom-left {
20 | top: auto;
21 | right: auto;
22 | bottom: 20px;
23 | left: 20px;
24 | }
25 | .gritter-item-wrapper {
26 | position:relative;
27 | margin:0 0 10px 0;
28 | background:url('../images/ie-spacer.gif'); /* ie7/8 fix */
29 | }
30 | .gritter-top {
31 | background:url(../images/gritter.png) no-repeat left -30px;
32 | height:10px;
33 | }
34 | .hover .gritter-top {
35 | background-position:right -30px;
36 | }
37 | .gritter-bottom {
38 | background:url(../images/gritter.png) no-repeat left bottom;
39 | height:8px;
40 | margin:0;
41 | }
42 | .hover .gritter-bottom {
43 | background-position: bottom right;
44 | }
45 | .gritter-item {
46 | display:block;
47 | background:url(../images/gritter.png) no-repeat left -40px;
48 | color:#eee;
49 | padding:2px 11px 8px 11px;
50 | font-size: 11px;
51 | font-family:verdana;
52 | }
53 | .hover .gritter-item {
54 | background-position:right -40px;
55 | }
56 | .gritter-item p {
57 | padding:0;
58 | margin:0;
59 | word-wrap:break-word;
60 | }
61 | .gritter-close {
62 | display:none;
63 | position:absolute;
64 | top:5px;
65 | left:3px;
66 | background:url(../images/gritter.png) no-repeat left top;
67 | cursor:pointer;
68 | width:30px;
69 | height:30px;
70 | }
71 | .gritter-title {
72 | font-size:14px;
73 | font-weight:bold;
74 | padding:0 0 7px 0;
75 | display:block;
76 | text-shadow:1px 1px 0 #000; /* Not supported by IE :( */
77 | }
78 | .gritter-image {
79 | width:48px;
80 | height:48px;
81 | float:left;
82 | }
83 | .gritter-with-image,
84 | .gritter-without-image {
85 | padding:0;
86 | }
87 | .gritter-with-image {
88 | width:220px;
89 | float:right;
90 | }
91 | /* for the light (white) version of the gritter notice */
92 | .gritter-light .gritter-item,
93 | .gritter-light .gritter-bottom,
94 | .gritter-light .gritter-top,
95 | .gritter-light .gritter-close {
96 | background-image: url(../images/gritter-light.png);
97 | color: #222;
98 | }
99 | .gritter-light .gritter-title {
100 | text-shadow: none;
101 | }
102 |
--------------------------------------------------------------------------------
/assets/less/tests/forms-responsive.html:
--------------------------------------------------------------------------------
1 |
2 |
3 |
4 |
5 | Bootstrap, from Twitter
6 |
7 |
8 |
9 |
10 |
11 |
12 |
13 |
19 |
20 |
21 |
24 |
25 |
26 |
27 |
28 |
29 |
30 |
31 |
32 |
33 |
34 |
35 |
69 |
70 |
71 |
72 |
--------------------------------------------------------------------------------
/assets/js/bootstrap-alert.js:
--------------------------------------------------------------------------------
1 | /* ==========================================================
2 | * bootstrap-alert.js v2.3.1
3 | * http://twitter.github.com/bootstrap/javascript.html#alerts
4 | * ==========================================================
5 | * Copyright 2012 Twitter, Inc.
6 | *
7 | * Licensed under the Apache License, Version 2.0 (the "License");
8 | * you may not use this file except in compliance with the License.
9 | * You may obtain a copy of the License at
10 | *
11 | * http://www.apache.org/licenses/LICENSE-2.0
12 | *
13 | * Unless required by applicable law or agreed to in writing, software
14 | * distributed under the License is distributed on an "AS IS" BASIS,
15 | * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
16 | * See the License for the specific language governing permissions and
17 | * limitations under the License.
18 | * ========================================================== */
19 |
20 |
21 | !function ($) {
22 |
23 | "use strict"; // jshint ;_;
24 |
25 |
26 | /* ALERT CLASS DEFINITION
27 | * ====================== */
28 |
29 | var dismiss = '[data-dismiss="alert"]'
30 | , Alert = function (el) {
31 | $(el).on('click', dismiss, this.close)
32 | }
33 |
34 | Alert.prototype.close = function (e) {
35 | var $this = $(this)
36 | , selector = $this.attr('data-target')
37 | , $parent
38 |
39 | if (!selector) {
40 | selector = $this.attr('href')
41 | selector = selector && selector.replace(/.*(?=#[^\s]*$)/, '') //strip for ie7
42 | }
43 |
44 | $parent = $(selector)
45 |
46 | e && e.preventDefault()
47 |
48 | $parent.length || ($parent = $this.hasClass('alert') ? $this : $this.parent())
49 |
50 | $parent.trigger(e = $.Event('close'))
51 |
52 | if (e.isDefaultPrevented()) return
53 |
54 | $parent.removeClass('in')
55 |
56 | function removeElement() {
57 | $parent
58 | .trigger('closed')
59 | .remove()
60 | }
61 |
62 | $.support.transition && $parent.hasClass('fade') ?
63 | $parent.on($.support.transition.end, removeElement) :
64 | removeElement()
65 | }
66 |
67 |
68 | /* ALERT PLUGIN DEFINITION
69 | * ======================= */
70 |
71 | var old = $.fn.alert
72 |
73 | $.fn.alert = function (option) {
74 | return this.each(function () {
75 | var $this = $(this)
76 | , data = $this.data('alert')
77 | if (!data) $this.data('alert', (data = new Alert(this)))
78 | if (typeof option == 'string') data[option].call($this)
79 | })
80 | }
81 |
82 | $.fn.alert.Constructor = Alert
83 |
84 |
85 | /* ALERT NO CONFLICT
86 | * ================= */
87 |
88 | $.fn.alert.noConflict = function () {
89 | $.fn.alert = old
90 | return this
91 | }
92 |
93 |
94 | /* ALERT DATA-API
95 | * ============== */
96 |
97 | $(document).on('click.alert.data-api', dismiss, Alert.prototype.close)
98 |
99 | }(window.jQuery);
--------------------------------------------------------------------------------
/js/filters.js:
--------------------------------------------------------------------------------
1 | 'use strict';
2 |
3 | angular.module('dockerui.filters', [])
4 | .filter('truncate', function() {
5 | return function(text, length, end) {
6 | if (isNaN(length))
7 | length = 10;
8 |
9 | if (end === undefined)
10 | end = "...";
11 |
12 | if (text.length <= length || text.length - end.length <= length) {
13 | return text;
14 | }
15 | else {
16 | return String(text).substring(0, length-end.length) + end;
17 | }
18 | };
19 | })
20 | .filter('statusbadge', function() {
21 | return function(text) {
22 | if (text === 'Ghost') {
23 | return 'important';
24 | } else if (text.indexOf('Exit') != -1 && text !== 'Exit 0') {
25 | return 'warning';
26 | }
27 | return 'success';
28 | };
29 | })
30 | .filter('getstatetext', function() {
31 | return function(state) {
32 | if (state == undefined) return '';
33 |
34 | if (state.Ghost && state.Running) {
35 | return 'Ghost';
36 | }
37 | if (state.Running) {
38 | return 'Running';
39 | }
40 | return 'Stopped';
41 | };
42 | })
43 | .filter('getstatelabel', function() {
44 | return function(state) {
45 | if (state == undefined) return '';
46 |
47 | if (state.Ghost && state.Running) {
48 | return 'label-important';
49 | }
50 | if (state.Running) {
51 | return 'label-success';
52 | }
53 | return '';
54 | };
55 | })
56 | .filter('humansize', function() {
57 | return function(bytes) {
58 | var sizes = ['Bytes', 'KB', 'MB', 'GB', 'TB'];
59 | if (bytes == 0) {
60 | return 'n/a';
61 | }
62 | var i = parseInt(Math.floor(Math.log(bytes) / Math.log(1024)));
63 | return Math.round(bytes / Math.pow(1024, i), 2) + ' ' + sizes[[i]];
64 | };
65 | })
66 | .filter('containername', function() {
67 | return function(container) {
68 | var name = container.Names[0];
69 | return name.substring(1, name.length);
70 | };
71 | })
72 | .filter('repotag', function() {
73 | return function(image) {
74 | if (image.RepoTags && image.RepoTags.length > 0) {
75 | var tag = image.RepoTags[0];
76 | if (tag == ':') { tag = ''; }
77 | return tag;
78 | }
79 | return '';
80 | };
81 | })
82 | .filter('getdate', function() {
83 | return function(data) {
84 | //Multiply by 1000 for the unix format
85 | var date = new Date(data * 1000);
86 | return date.toDateString();
87 | };
88 | });
89 |
--------------------------------------------------------------------------------
/assets/js/tests/unit/bootstrap-tab.js:
--------------------------------------------------------------------------------
1 | $(function () {
2 |
3 | module("bootstrap-tabs")
4 |
5 | test("should provide no conflict", function () {
6 | var tab = $.fn.tab.noConflict()
7 | ok(!$.fn.tab, 'tab was set back to undefined (org value)')
8 | $.fn.tab = tab
9 | })
10 |
11 | test("should be defined on jquery object", function () {
12 | ok($(document.body).tab, 'tabs method is defined')
13 | })
14 |
15 | test("should return element", function () {
16 | ok($(document.body).tab()[0] == document.body, 'document.body returned')
17 | })
18 |
19 | test("should activate element by tab id", function () {
20 | var tabsHTML =
21 | ''
25 |
26 | $('').appendTo("#qunit-fixture")
27 |
28 | $(tabsHTML).find('li:last a').tab('show')
29 | equals($("#qunit-fixture").find('.active').attr('id'), "profile")
30 |
31 | $(tabsHTML).find('li:first a').tab('show')
32 | equals($("#qunit-fixture").find('.active').attr('id'), "home")
33 | })
34 |
35 | test("should activate element by tab id", function () {
36 | var pillsHTML =
37 | ''
41 |
42 | $('').appendTo("#qunit-fixture")
43 |
44 | $(pillsHTML).find('li:last a').tab('show')
45 | equals($("#qunit-fixture").find('.active').attr('id'), "profile")
46 |
47 | $(pillsHTML).find('li:first a').tab('show')
48 | equals($("#qunit-fixture").find('.active').attr('id'), "home")
49 | })
50 |
51 |
52 | test("should not fire closed when close is prevented", function () {
53 | $.support.transition = false
54 | stop();
55 | $('
')
56 | .bind('show', function (e) {
57 | e.preventDefault();
58 | ok(true);
59 | start();
60 | })
61 | .bind('shown', function () {
62 | ok(false);
63 | })
64 | .tab('show')
65 | })
66 |
67 | test("show and shown events should reference correct relatedTarget", function () {
68 | var dropHTML =
69 | ''
70 | + '1 '
71 | + ''
75 | + ' '
76 | + ' '
77 |
78 | $(dropHTML).find('ul>li:first a').tab('show').end()
79 | .find('ul>li:last a').on('show', function(event){
80 | equals(event.relatedTarget.hash, "#1-1")
81 | }).on('shown', function(event){
82 | equals(event.relatedTarget.hash, "#1-1")
83 | }).tab('show')
84 | })
85 |
86 | })
--------------------------------------------------------------------------------
/index.html:
--------------------------------------------------------------------------------
1 |
2 |
3 |
4 |
5 | DockerUI
6 |
7 |
8 |
9 |
10 |
11 |
12 |
13 |
14 |
15 |
16 |
17 |
20 |
21 |
22 |
23 |
24 |
25 |
26 |
27 |
28 |
29 |
30 |
31 |
32 |
33 |
34 |
35 |
36 |
37 |
38 |
39 |
40 |
41 |
42 |
43 |
44 |
45 |
46 |
47 |
48 |
49 |
50 |
51 |
52 |
53 |
54 |
55 |
56 |
57 |
58 |
59 |
60 |
61 |
62 |
63 |
64 |
65 |
66 |
67 |
68 |
69 |
70 |
71 |
72 |
73 |
--------------------------------------------------------------------------------
/assets/js/angularjs/1.2.6/angular-resource.min.js:
--------------------------------------------------------------------------------
1 | /*
2 | AngularJS v1.2.6
3 | (c) 2010-2014 Google, Inc. http://angularjs.org
4 | License: MIT
5 | */
6 | (function(H,a,A){'use strict';function D(p,g){g=g||{};a.forEach(g,function(a,c){delete g[c]});for(var c in p)p.hasOwnProperty(c)&&("$"!==c.charAt(0)&&"$"!==c.charAt(1))&&(g[c]=p[c]);return g}var v=a.$$minErr("$resource"),C=/^(\.[a-zA-Z_$][0-9a-zA-Z_$]*)+$/;a.module("ngResource",["ng"]).factory("$resource",["$http","$q",function(p,g){function c(a,c){this.template=a;this.defaults=c||{};this.urlParams={}}function t(n,w,l){function r(h,d){var e={};d=x({},w,d);s(d,function(b,d){u(b)&&(b=b());var k;if(b&&
7 | b.charAt&&"@"==b.charAt(0)){k=h;var a=b.substr(1);if(null==a||""===a||"hasOwnProperty"===a||!C.test("."+a))throw v("badmember",a);for(var a=a.split("."),f=0,c=a.length;f .vertical(#f5f5f5, #f9f9f9);
50 | }
51 |
52 | // Bar of progress
53 | .progress .bar {
54 | width: 0%;
55 | height: 100%;
56 | color: @white;
57 | float: left;
58 | font-size: 12px;
59 | text-align: center;
60 | text-shadow: 0 -1px 0 rgba(0,0,0,.25);
61 | #gradient > .vertical(#149bdf, #0480be);
62 | .box-sizing(border-box);
63 | .transition(width .6s ease);
64 | }
65 | .progress .bar + .bar {
66 | }
67 |
68 | // Striped bars
69 | .progress-striped .bar {
70 | #gradient > .striped(#149bdf);
71 | .background-size(40px 40px);
72 | }
73 |
74 | // Call animation for the active one
75 | .progress.active .bar {
76 | -webkit-animation: progress-bar-stripes 2s linear infinite;
77 | -moz-animation: progress-bar-stripes 2s linear infinite;
78 | -ms-animation: progress-bar-stripes 2s linear infinite;
79 | -o-animation: progress-bar-stripes 2s linear infinite;
80 | animation: progress-bar-stripes 2s linear infinite;
81 | }
82 |
83 |
84 |
85 | // COLORS
86 | // ------
87 |
88 | // Danger (red)
89 | .progress-danger .bar, .progress .bar-danger {
90 | #gradient > .vertical(#ee5f5b, #c43c35);
91 | }
92 | .progress-danger.progress-striped .bar, .progress-striped .bar-danger {
93 | #gradient > .striped(#ee5f5b);
94 | }
95 |
96 | // Success (green)
97 | .progress-success .bar, .progress .bar-success {
98 | #gradient > .vertical(#62c462, #57a957);
99 | }
100 | .progress-success.progress-striped .bar, .progress-striped .bar-success {
101 | #gradient > .striped(#62c462);
102 | }
103 |
104 | // Info (teal)
105 | .progress-info .bar, .progress .bar-info {
106 | #gradient > .vertical(#5bc0de, #339bb9);
107 | }
108 | .progress-info.progress-striped .bar, .progress-striped .bar-info {
109 | #gradient > .striped(#5bc0de);
110 | }
111 |
112 | // Warning (orange)
113 | .progress-warning .bar, .progress .bar-warning {
114 | #gradient > .vertical(lighten(@orange, 15%), @orange);
115 | }
116 | .progress-warning.progress-striped .bar, .progress-striped .bar-warning {
117 | #gradient > .striped(lighten(@orange, 15%));
118 | }
119 |
--------------------------------------------------------------------------------
/assets/less/carousel.less:
--------------------------------------------------------------------------------
1 | //
2 | // Carousel
3 | // --------------------------------------------------
4 |
5 |
6 | .carousel {
7 | position: relative;
8 | margin-bottom: @baseLineHeight;
9 | line-height: 1;
10 | }
11 |
12 | .carousel-inner {
13 | overflow: hidden;
14 | width: 100%;
15 | position: relative;
16 | }
17 |
18 | .carousel-inner {
19 |
20 | > .item {
21 | display: none;
22 | position: relative;
23 | .transition(.6s ease-in-out left);
24 |
25 | // Account for jankitude on images
26 | > img,
27 | > a > img {
28 | display: block;
29 | line-height: 1;
30 | }
31 | }
32 |
33 | > .active,
34 | > .next,
35 | > .prev { display: block; }
36 |
37 | > .active {
38 | left: 0;
39 | }
40 |
41 | > .next,
42 | > .prev {
43 | position: absolute;
44 | top: 0;
45 | width: 100%;
46 | }
47 |
48 | > .next {
49 | left: 100%;
50 | }
51 | > .prev {
52 | left: -100%;
53 | }
54 | > .next.left,
55 | > .prev.right {
56 | left: 0;
57 | }
58 |
59 | > .active.left {
60 | left: -100%;
61 | }
62 | > .active.right {
63 | left: 100%;
64 | }
65 |
66 | }
67 |
68 | // Left/right controls for nav
69 | // ---------------------------
70 |
71 | .carousel-control {
72 | position: absolute;
73 | top: 40%;
74 | left: 15px;
75 | width: 40px;
76 | height: 40px;
77 | margin-top: -20px;
78 | font-size: 60px;
79 | font-weight: 100;
80 | line-height: 30px;
81 | color: @white;
82 | text-align: center;
83 | background: @grayDarker;
84 | border: 3px solid @white;
85 | .opacity(50);
86 |
87 | // we can't have this transition here
88 | // because webkit cancels the carousel
89 | // animation if you trip this while
90 | // in the middle of another animation
91 | // ;_;
92 | // .transition(opacity .2s linear);
93 |
94 | // Reposition the right one
95 | &.right {
96 | left: auto;
97 | right: 15px;
98 | }
99 |
100 | // Hover/focus state
101 | &:hover,
102 | &:focus {
103 | color: @white;
104 | text-decoration: none;
105 | .opacity(90);
106 | }
107 | }
108 |
109 | // Carousel indicator pips
110 | // -----------------------------
111 | .carousel-indicators {
112 | position: absolute;
113 | top: 15px;
114 | right: 15px;
115 | z-index: 5;
116 | margin: 0;
117 | list-style: none;
118 |
119 | li {
120 | display: block;
121 | float: left;
122 | width: 10px;
123 | height: 10px;
124 | margin-left: 5px;
125 | text-indent: -999px;
126 | background-color: #ccc;
127 | background-color: rgba(255,255,255,.25);
128 | }
129 | .active {
130 | background-color: #fff;
131 | }
132 | }
133 |
134 | // Caption for text below images
135 | // -----------------------------
136 |
137 | .carousel-caption {
138 | position: absolute;
139 | left: 0;
140 | right: 0;
141 | bottom: 0;
142 | padding: 15px;
143 | background: @grayDark;
144 | background: rgba(0,0,0,.75);
145 | }
146 | .carousel-caption h4,
147 | .carousel-caption p {
148 | color: @white;
149 | line-height: @baseLineHeight;
150 | }
151 | .carousel-caption h4 {
152 | margin: 0 0 5px;
153 | }
154 | .carousel-caption p {
155 | margin-bottom: 0;
156 | }
157 |
--------------------------------------------------------------------------------
/assets/js/tests/unit/bootstrap-collapse.js:
--------------------------------------------------------------------------------
1 | $(function () {
2 |
3 | module("bootstrap-collapse")
4 |
5 | test("should provide no conflict", function () {
6 | var collapse = $.fn.collapse.noConflict()
7 | ok(!$.fn.collapse, 'collapse was set back to undefined (org value)')
8 | $.fn.collapse = collapse
9 | })
10 |
11 | test("should be defined on jquery object", function () {
12 | ok($(document.body).collapse, 'collapse method is defined')
13 | })
14 |
15 | test("should return element", function () {
16 | ok($(document.body).collapse()[0] == document.body, 'document.body returned')
17 | })
18 |
19 | test("should show a collapsed element", function () {
20 | var el = $('
').collapse('show')
21 | ok(el.hasClass('in'), 'has class in')
22 | ok(/height/.test(el.attr('style')), 'has height set')
23 | })
24 |
25 | test("should hide a collapsed element", function () {
26 | var el = $('
').collapse('hide')
27 | ok(!el.hasClass('in'), 'does not have class in')
28 | ok(/height/.test(el.attr('style')), 'has height set')
29 | })
30 |
31 | test("should not fire shown when show is prevented", function () {
32 | $.support.transition = false
33 | stop()
34 | $('
')
35 | .bind('show', function (e) {
36 | e.preventDefault();
37 | ok(true);
38 | start();
39 | })
40 | .bind('shown', function () {
41 | ok(false);
42 | })
43 | .collapse('show')
44 | })
45 |
46 | test("should reset style to auto after finishing opening collapse", function () {
47 | $.support.transition = false
48 | stop()
49 | $('
')
50 | .bind('show', function () {
51 | ok(this.style.height == '0px')
52 | })
53 | .bind('shown', function () {
54 | ok(this.style.height == 'auto')
55 | start()
56 | })
57 | .collapse('show')
58 | })
59 |
60 | test("should add active class to target when collapse shown", function () {
61 | $.support.transition = false
62 | stop()
63 |
64 | var target = $(' ')
65 | .appendTo($('#qunit-fixture'))
66 |
67 | var collapsible = $('
')
68 | .appendTo($('#qunit-fixture'))
69 | .on('show', function () {
70 | ok(!target.hasClass('collapsed'))
71 | start()
72 | })
73 |
74 | target.click()
75 | })
76 |
77 | test("should remove active class to target when collapse hidden", function () {
78 | $.support.transition = false
79 | stop()
80 |
81 | var target = $(' ')
82 | .appendTo($('#qunit-fixture'))
83 |
84 | var collapsible = $('
')
85 | .appendTo($('#qunit-fixture'))
86 | .on('hide', function () {
87 | ok(target.hasClass('collapsed'))
88 | start()
89 | })
90 |
91 | target.click()
92 | })
93 |
94 | })
--------------------------------------------------------------------------------
/assets/scss/_carousel.scss:
--------------------------------------------------------------------------------
1 | //
2 | // Carousel
3 | // --------------------------------------------------
4 |
5 |
6 | .carousel {
7 | position: relative;
8 | margin-bottom: $baseLineHeight;
9 | line-height: 1;
10 | }
11 |
12 | .carousel-inner {
13 | overflow: hidden;
14 | width: 100%;
15 | position: relative;
16 | }
17 |
18 | .carousel-inner {
19 |
20 | > .item {
21 | display: none;
22 | position: relative;
23 | @include transition(.6s ease-in-out left);
24 |
25 | // Account for jankitude on images
26 | > img,
27 | > a > img {
28 | display: block;
29 | line-height: 1;
30 | }
31 | }
32 |
33 | > .active,
34 | > .next,
35 | > .prev { display: block; }
36 |
37 | > .active {
38 | left: 0;
39 | }
40 |
41 | > .next,
42 | > .prev {
43 | position: absolute;
44 | top: 0;
45 | width: 100%;
46 | }
47 |
48 | > .next {
49 | left: 100%;
50 | }
51 | > .prev {
52 | left: -100%;
53 | }
54 | > .next.left,
55 | > .prev.right {
56 | left: 0;
57 | }
58 |
59 | > .active.left {
60 | left: -100%;
61 | }
62 | > .active.right {
63 | left: 100%;
64 | }
65 |
66 | }
67 |
68 | // Left/right controls for nav
69 | // ---------------------------
70 |
71 | .carousel-control {
72 | position: absolute;
73 | top: 40%;
74 | left: 15px;
75 | width: 40px;
76 | height: 40px;
77 | margin-top: -20px;
78 | font-size: 60px;
79 | font-weight: 100;
80 | line-height: 30px;
81 | color: $white;
82 | text-align: center;
83 | background: $grayDarker;
84 | border: 3px solid $white;
85 | @include opacity(50);
86 |
87 | // we can't have this transition here
88 | // because webkit cancels the carousel
89 | // animation if you trip this while
90 | // in the middle of another animation
91 | // ;_;
92 | // .transition(opacity .2s linear);
93 |
94 | // Reposition the right one
95 | &.right {
96 | left: auto;
97 | right: 15px;
98 | }
99 |
100 | // Hover/focus state
101 | &:hover,
102 | &:focus {
103 | color: $white;
104 | text-decoration: none;
105 | @include opacity(90);
106 | }
107 | }
108 |
109 | // Carousel indicator pips
110 | // -----------------------------
111 | .carousel-indicators {
112 | position: absolute;
113 | top: 15px;
114 | right: 15px;
115 | z-index: 5;
116 | margin: 0;
117 | list-style: none;
118 |
119 | li {
120 | display: block;
121 | float: left;
122 | width: 10px;
123 | height: 10px;
124 | margin-left: 5px;
125 | text-indent: -999px;
126 | background-color: #ccc;
127 | background-color: rgba(255,255,255,.25);
128 | }
129 | .active {
130 | background-color: #fff;
131 | }
132 | }
133 |
134 | // Caption for text below images
135 | // -----------------------------
136 |
137 | .carousel-caption {
138 | position: absolute;
139 | left: 0;
140 | right: 0;
141 | bottom: 0;
142 | padding: 15px;
143 | background: $grayDark;
144 | background: rgba(0,0,0,.75);
145 | }
146 | .carousel-caption h4,
147 | .carousel-caption p {
148 | color: $white;
149 | line-height: $baseLineHeight;
150 | }
151 | .carousel-caption h4 {
152 | margin: 0 0 5px;
153 | }
154 | .carousel-caption p {
155 | margin-bottom: 0;
156 | }
157 |
--------------------------------------------------------------------------------
/assets/scss/_progress-bars.scss:
--------------------------------------------------------------------------------
1 | //
2 | // Progress bars
3 | // --------------------------------------------------
4 |
5 |
6 | // ANIMATIONS
7 | // ----------
8 |
9 | // Webkit
10 | @-webkit-keyframes progress-bar-stripes {
11 | from { background-position: 40px 0; }
12 | to { background-position: 0 0; }
13 | }
14 |
15 | // Firefox
16 | @-moz-keyframes progress-bar-stripes {
17 | from { background-position: 40px 0; }
18 | to { background-position: 0 0; }
19 | }
20 |
21 | // IE9
22 | @-ms-keyframes progress-bar-stripes {
23 | from { background-position: 40px 0; }
24 | to { background-position: 0 0; }
25 | }
26 |
27 | // Opera
28 | @-o-keyframes progress-bar-stripes {
29 | from { background-position: 0 0; }
30 | to { background-position: 40px 0; }
31 | }
32 |
33 | // Spec
34 | @keyframes progress-bar-stripes {
35 | from { background-position: 40px 0; }
36 | to { background-position: 0 0; }
37 | }
38 |
39 |
40 |
41 | // THE BARS
42 | // --------
43 |
44 | // Outer container
45 | .progress {
46 | overflow: hidden;
47 | height: $baseLineHeight;
48 | margin-bottom: $baseLineHeight;
49 | @include gradient-vertical(#f5f5f5, #f9f9f9);
50 | }
51 |
52 | // Bar of progress
53 | .progress .bar {
54 | width: 0%;
55 | height: 100%;
56 | color: $white;
57 | float: left;
58 | font-size: 12px;
59 | text-align: center;
60 | text-shadow: 0 -1px 0 rgba(0,0,0,.25);
61 | @include gradient-vertical(#149bdf, #0480be);
62 | @include box-sizing(border-box);
63 | @include transition(width .6s ease);
64 | }
65 | .progress .bar + .bar {
66 | }
67 |
68 | // Striped bars
69 | .progress-striped .bar {
70 | @include gradient-striped(#149bdf);
71 | @include background-size(40px 40px);
72 | }
73 |
74 | // Call animation for the active one
75 | .progress.active .bar {
76 | -webkit-animation: progress-bar-stripes 2s linear infinite;
77 | -moz-animation: progress-bar-stripes 2s linear infinite;
78 | -ms-animation: progress-bar-stripes 2s linear infinite;
79 | -o-animation: progress-bar-stripes 2s linear infinite;
80 | animation: progress-bar-stripes 2s linear infinite;
81 | }
82 |
83 |
84 |
85 | // COLORS
86 | // ------
87 |
88 | // Danger (red)
89 | .progress-danger .bar, .progress .bar-danger {
90 | @include gradient-vertical(#ee5f5b, #c43c35);
91 | }
92 | .progress-danger.progress-striped .bar, .progress-striped .bar-danger {
93 | @include gradient-striped(#ee5f5b);
94 | }
95 |
96 | // Success (green)
97 | .progress-success .bar, .progress .bar-success {
98 | @include gradient-vertical(#62c462, #57a957);
99 | }
100 | .progress-success.progress-striped .bar, .progress-striped .bar-success {
101 | @include gradient-striped(#62c462);
102 | }
103 |
104 | // Info (teal)
105 | .progress-info .bar, .progress .bar-info {
106 | @include gradient-vertical(#5bc0de, #339bb9);
107 | }
108 | .progress-info.progress-striped .bar, .progress-striped .bar-info {
109 | @include gradient-striped(#5bc0de);
110 | }
111 |
112 | // Warning (orange)
113 | .progress-warning .bar, .progress .bar-warning {
114 | @include gradient-vertical(lighten($orange, 15%), $orange);
115 | }
116 | .progress-warning.progress-striped .bar, .progress-striped .bar-warning {
117 | @include gradient-striped(lighten($orange, 15%));
118 | }
119 |
--------------------------------------------------------------------------------
/assets/js/bootstrap-button.js:
--------------------------------------------------------------------------------
1 | /* ============================================================
2 | * bootstrap-button.js v2.3.1
3 | * http://twitter.github.com/bootstrap/javascript.html#buttons
4 | * ============================================================
5 | * Copyright 2012 Twitter, Inc.
6 | *
7 | * Licensed under the Apache License, Version 2.0 (the "License");
8 | * you may not use this file except in compliance with the License.
9 | * You may obtain a copy of the License at
10 | *
11 | * http://www.apache.org/licenses/LICENSE-2.0
12 | *
13 | * Unless required by applicable law or agreed to in writing, software
14 | * distributed under the License is distributed on an "AS IS" BASIS,
15 | * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
16 | * See the License for the specific language governing permissions and
17 | * limitations under the License.
18 | * ============================================================ */
19 |
20 |
21 | !function ($) {
22 |
23 | "use strict"; // jshint ;_;
24 |
25 |
26 | /* BUTTON PUBLIC CLASS DEFINITION
27 | * ============================== */
28 |
29 | var Button = function (element, options) {
30 | this.$element = $(element)
31 | this.options = $.extend({}, $.fn.button.defaults, options)
32 | }
33 |
34 | Button.prototype.setState = function (state) {
35 | var d = 'disabled'
36 | , $el = this.$element
37 | , data = $el.data()
38 | , val = $el.is('input') ? 'val' : 'html'
39 |
40 | state = state + 'Text'
41 | data.resetText || $el.data('resetText', $el[val]())
42 |
43 | $el[val](data[state] || this.options[state])
44 |
45 | // push to event loop to allow forms to submit
46 | setTimeout(function () {
47 | state == 'loadingText' ?
48 | $el.addClass(d).attr(d, d) :
49 | $el.removeClass(d).removeAttr(d)
50 | }, 0)
51 | }
52 |
53 | Button.prototype.toggle = function () {
54 | var $parent = this.$element.closest('[data-toggle="buttons-radio"]')
55 |
56 | $parent && $parent
57 | .find('.active')
58 | .removeClass('active')
59 |
60 | this.$element.toggleClass('active')
61 | }
62 |
63 |
64 | /* BUTTON PLUGIN DEFINITION
65 | * ======================== */
66 |
67 | var old = $.fn.button
68 |
69 | $.fn.button = function (option) {
70 | return this.each(function () {
71 | var $this = $(this)
72 | , data = $this.data('button')
73 | , options = typeof option == 'object' && option
74 | if (!data) $this.data('button', (data = new Button(this, options)))
75 | if (option == 'toggle') data.toggle()
76 | else if (option) data.setState(option)
77 | })
78 | }
79 |
80 | $.fn.button.defaults = {
81 | loadingText: 'loading...'
82 | }
83 |
84 | $.fn.button.Constructor = Button
85 |
86 |
87 | /* BUTTON NO CONFLICT
88 | * ================== */
89 |
90 | $.fn.button.noConflict = function () {
91 | $.fn.button = old
92 | return this
93 | }
94 |
95 |
96 | /* BUTTON DATA-API
97 | * =============== */
98 |
99 | $(document).on('click.button.data-api', '[data-toggle^=button]', function (e) {
100 | var $btn = $(e.target)
101 | if (!$btn.hasClass('btn')) $btn = $btn.closest('.btn')
102 | $btn.button('toggle')
103 | })
104 |
105 | }(window.jQuery);
--------------------------------------------------------------------------------
/partials/image.html:
--------------------------------------------------------------------------------
1 |
2 |
3 |
4 | {{ error }}
5 |
6 |
7 |
8 |
9 |
Image: {{ tag }}
10 |
11 |
12 | Create
13 |
14 |
15 |
16 |
Containers created:
17 |
18 | Get a better broswer... Your holding everyone back.
19 |
20 |
21 |
22 |
23 |
24 |
25 | Created:
26 | {{ image.created }}
27 |
28 |
29 | Parent:
30 | {{ image.parent }}
31 |
32 |
33 | Size:
34 | {{ image.Size|humansize }}
35 |
36 |
37 |
38 | Hostname:
39 | {{ image.container_config.Hostname }}
40 |
41 |
42 | User:
43 | {{ image.container_config.User }}
44 |
45 |
46 | Cmd:
47 | {{ image.container_config.Cmd }}
48 |
49 |
50 | Volumes:
51 | {{ image.container_config.Volumes }}
52 |
53 |
54 | Volumes from:
55 | {{ image.container_config.VolumesFrom }}
56 |
57 |
58 | Comment:
59 | {{ image.comment }}
60 |
61 |
62 |
63 |
64 |
65 |
66 |
67 | History:
68 |
69 |
70 |
71 |
72 |
73 |
74 |
75 |
76 |
77 | {{ change.Id }} : Created: {{ change.Created|getdate }} Created by: {{ change.CreatedBy }}
78 |
79 |
80 |
81 |
82 |
83 |
84 |
85 |
96 |
97 |
98 |
99 |
100 |
101 | Remove Image
102 |
103 |
104 |
--------------------------------------------------------------------------------
/assets/less/popovers.less:
--------------------------------------------------------------------------------
1 | //
2 | // Popovers
3 | // --------------------------------------------------
4 |
5 |
6 | .popover {
7 | position: absolute;
8 | top: 0;
9 | left: 0;
10 | z-index: @zindexPopover;
11 | display: none;
12 | max-width: 276px;
13 | padding: 1px;
14 | text-align: left; // Reset given new insertion method
15 | background-color: @popoverBackground;
16 | -webkit-background-clip: padding-box;
17 | -moz-background-clip: padding;
18 | background-clip: padding-box;
19 | border: 1px solid #ccc;
20 | border: 1px solid rgba(0,0,0,.2);
21 |
22 | // Overrides for proper insertion
23 | white-space: normal;
24 |
25 | // Offset the popover to account for the popover arrow
26 | &.top { margin-top: -10px; }
27 | &.right { margin-left: 10px; }
28 | &.bottom { margin-top: 10px; }
29 | &.left { margin-left: -10px; }
30 | }
31 |
32 | .popover-title {
33 | margin: 0; // reset heading margin
34 | padding: 8px 14px;
35 | font-size: 14px;
36 | font-weight: normal;
37 | line-height: 18px;
38 | background-color: @popoverTitleBackground;
39 | border-bottom: 1px solid darken(@popoverTitleBackground, 5%);
40 |
41 | &:empty {
42 | display: none;
43 | }
44 | }
45 |
46 | .popover-content {
47 | padding: 9px 14px;
48 | }
49 |
50 | // Arrows
51 | //
52 | // .arrow is outer, .arrow:after is inner
53 |
54 | .popover .arrow,
55 | .popover .arrow:after {
56 | position: absolute;
57 | display: block;
58 | width: 0;
59 | height: 0;
60 | border-color: transparent;
61 | border-style: solid;
62 | }
63 | .popover .arrow {
64 | border-width: @popoverArrowOuterWidth;
65 | }
66 | .popover .arrow:after {
67 | border-width: @popoverArrowWidth;
68 | content: "";
69 | }
70 |
71 | .popover {
72 | &.top .arrow {
73 | left: 50%;
74 | margin-left: -@popoverArrowOuterWidth;
75 | border-bottom-width: 0;
76 | border-top-color: #999; // IE8 fallback
77 | border-top-color: @popoverArrowOuterColor;
78 | bottom: -@popoverArrowOuterWidth;
79 | &:after {
80 | bottom: 1px;
81 | margin-left: -@popoverArrowWidth;
82 | border-bottom-width: 0;
83 | border-top-color: @popoverArrowColor;
84 | }
85 | }
86 | &.right .arrow {
87 | top: 50%;
88 | left: -@popoverArrowOuterWidth;
89 | margin-top: -@popoverArrowOuterWidth;
90 | border-left-width: 0;
91 | border-right-color: #999; // IE8 fallback
92 | border-right-color: @popoverArrowOuterColor;
93 | &:after {
94 | left: 1px;
95 | bottom: -@popoverArrowWidth;
96 | border-left-width: 0;
97 | border-right-color: @popoverArrowColor;
98 | }
99 | }
100 | &.bottom .arrow {
101 | left: 50%;
102 | margin-left: -@popoverArrowOuterWidth;
103 | border-top-width: 0;
104 | border-bottom-color: #999; // IE8 fallback
105 | border-bottom-color: @popoverArrowOuterColor;
106 | top: -@popoverArrowOuterWidth;
107 | &:after {
108 | top: 1px;
109 | margin-left: -@popoverArrowWidth;
110 | border-top-width: 0;
111 | border-bottom-color: @popoverArrowColor;
112 | }
113 | }
114 |
115 | &.left .arrow {
116 | top: 50%;
117 | right: -@popoverArrowOuterWidth;
118 | margin-top: -@popoverArrowOuterWidth;
119 | border-right-width: 0;
120 | border-left-color: #999; // IE8 fallback
121 | border-left-color: @popoverArrowOuterColor;
122 | &:after {
123 | right: 1px;
124 | border-right-width: 0;
125 | border-left-color: @popoverArrowColor;
126 | bottom: -@popoverArrowWidth;
127 | }
128 | }
129 |
130 | }
131 |
--------------------------------------------------------------------------------
/assets/scss/_popovers.scss:
--------------------------------------------------------------------------------
1 | //
2 | // Popovers
3 | // --------------------------------------------------
4 |
5 |
6 | .popover {
7 | position: absolute;
8 | top: 0;
9 | left: 0;
10 | z-index: $zindexPopover;
11 | display: none;
12 | max-width: 276px;
13 | padding: 1px;
14 | text-align: left; // Reset given new insertion method
15 | background-color: $popoverBackground;
16 | -webkit-background-clip: padding-box;
17 | -moz-background-clip: padding;
18 | background-clip: padding-box;
19 | border: 1px solid #ccc;
20 | border: 1px solid rgba(0,0,0,.2);
21 |
22 | // Overrides for proper insertion
23 | white-space: normal;
24 |
25 | // Offset the popover to account for the popover arrow
26 | &.top { margin-top: -10px; }
27 | &.right { margin-left: 10px; }
28 | &.bottom { margin-top: 10px; }
29 | &.left { margin-left: -10px; }
30 | }
31 |
32 | .popover-title {
33 | margin: 0; // reset heading margin
34 | padding: 8px 14px;
35 | font-size: 14px;
36 | font-weight: normal;
37 | line-height: 18px;
38 | background-color: $popoverTitleBackground;
39 | border-bottom: 1px solid darken($popoverTitleBackground, 5%);
40 |
41 | &:empty {
42 | display: none;
43 | }
44 | }
45 |
46 | .popover-content {
47 | padding: 9px 14px;
48 | }
49 |
50 | // Arrows
51 | //
52 | // .arrow is outer, .arrow:after is inner
53 |
54 | .popover .arrow,
55 | .popover .arrow:after {
56 | position: absolute;
57 | display: block;
58 | width: 0;
59 | height: 0;
60 | border-color: transparent;
61 | border-style: solid;
62 | }
63 | .popover .arrow {
64 | border-width: $popoverArrowOuterWidth;
65 | }
66 | .popover .arrow:after {
67 | border-width: $popoverArrowWidth;
68 | content: "";
69 | }
70 |
71 | .popover {
72 | &.top .arrow {
73 | left: 50%;
74 | margin-left: -$popoverArrowOuterWidth;
75 | border-bottom-width: 0;
76 | border-top-color: #999; // IE8 fallback
77 | border-top-color: $popoverArrowOuterColor;
78 | bottom: -$popoverArrowOuterWidth;
79 | &:after {
80 | bottom: 1px;
81 | margin-left: -$popoverArrowWidth;
82 | border-bottom-width: 0;
83 | border-top-color: $popoverArrowColor;
84 | }
85 | }
86 | &.right .arrow {
87 | top: 50%;
88 | left: -$popoverArrowOuterWidth;
89 | margin-top: -$popoverArrowOuterWidth;
90 | border-left-width: 0;
91 | border-right-color: #999; // IE8 fallback
92 | border-right-color: $popoverArrowOuterColor;
93 | &:after {
94 | left: 1px;
95 | bottom: -$popoverArrowWidth;
96 | border-left-width: 0;
97 | border-right-color: $popoverArrowColor;
98 | }
99 | }
100 | &.bottom .arrow {
101 | left: 50%;
102 | margin-left: -$popoverArrowOuterWidth;
103 | border-top-width: 0;
104 | border-bottom-color: #999; // IE8 fallback
105 | border-bottom-color: $popoverArrowOuterColor;
106 | top: -$popoverArrowOuterWidth;
107 | &:after {
108 | top: 1px;
109 | margin-left: -$popoverArrowWidth;
110 | border-top-width: 0;
111 | border-bottom-color: $popoverArrowColor;
112 | }
113 | }
114 |
115 | &.left .arrow {
116 | top: 50%;
117 | right: -$popoverArrowOuterWidth;
118 | margin-top: -$popoverArrowOuterWidth;
119 | border-right-width: 0;
120 | border-left-color: #999; // IE8 fallback
121 | border-left-color: $popoverArrowOuterColor;
122 | &:after {
123 | right: 1px;
124 | border-right-width: 0;
125 | border-left-color: $popoverArrowColor;
126 | bottom: -$popoverArrowWidth;
127 | }
128 | }
129 |
130 | }
131 |
--------------------------------------------------------------------------------
/README.md:
--------------------------------------------------------------------------------
1 | ## DockerUI
2 |
3 | DockerUI is a web interface to interact with the Remote API. The goal is to provide a pure client side implementation so it is effortless to connect and manage docker. This project is not complete and is still under heavy development.
4 |
5 | ### Quickstart
6 |
7 | #### Step 1
8 |
9 | Pull the latest image:
10 |
11 | ```
12 | docker pull abh1nav/dockerui:latest
13 | ```
14 |
15 | #### Step 2
16 | If you're running Docker using a unix socket (default):
17 |
18 | ```
19 | docker run -d -p 9000:9000 -v /var/run/docker.sock:/docker.sock \
20 | --name dockerui abh1nav/dockerui:latest -e="/docker.sock"
21 | ```
22 |
23 | If you're running Docker over tcp:
24 |
25 | ```
26 | docker run -d -p 9000:9000 --name dockerui \
27 | abh1nav/dockerui:latest -e="http://:4243"
28 | ```
29 |
30 | #### Step 3
31 | Open your browser to `http://:9000`
32 |
33 | #### Warning
34 | Bind mounting the unix socket into the DockerUI container is much more secure than exposing your docker
35 | daemon over TCP. You should still secure your DockerUI instance behind some type of auth. Maybe running
36 | Nginx infront of DockerUI with basic auth.
37 |
38 | ### Screenshots
39 |
40 | 
41 |
42 | 
43 |
44 | 
45 |
46 | 
47 |
48 | 
49 |
50 | ### Goals
51 | * Little to no dependencies - I really want to keep this project a pure html/js app. I know this will have to change so that I can introduce authentication and authorization along with managing multiple docker endpoints.
52 | * Consistency - The web UI should be consistent with the commands found on the docker CLI.
53 |
54 | ### Stack
55 | * Angular.js
56 | * Flatstrap
57 | * Spin.js
58 | * Ace editor
59 |
60 | ### Todo:
61 | * Full repository support
62 | * Search
63 | * Push files to a container
64 | * Unit tests
65 |
66 | ### License - MIT
67 | The DockerUI code is licensed under the MIT license. Flatstrap (bootstrap) is licensed under the Apache License v2.0 and Angular.js is licensed under MIT.
68 |
69 | **DockerUI:**
70 | Copyright (c) 2013 Michael Crosby. http://crosbymichael.com
71 |
72 | Update credits:
73 | Abhinav Ajgaonkar http://blog.abhinav.ca
74 | Ryan Krieg http://ryankrieg.com
75 |
76 | Permission is hereby granted, free of charge, to any person
77 | obtaining a copy of this software and associated documentation
78 | files (the "Software"), to deal in the Software without
79 | restriction, including without limitation the rights to use, copy,
80 | modify, merge, publish, distribute, sublicense, and/or sell copies
81 | of the Software, and to permit persons to whom the Software is
82 | furnished to do so, subject to the following conditions:
83 |
84 | The above copyright notice and this permission notice shall be
85 | included in all copies or substantial portions of the Software.
86 |
87 | THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND,
88 | EXPRESS OR IMPLIED,
89 | INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
90 | FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT.
91 | IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT
92 | HOLDERS BE LIABLE FOR ANY CLAIM,
93 | DAMAGES OR OTHER LIABILITY,
94 | WHETHER IN AN ACTION OF CONTRACT,
95 | TORT OR OTHERWISE,
96 | ARISING FROM, OUT OF OR IN CONNECTION WITH
97 | THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE.
98 |
--------------------------------------------------------------------------------
/assets/js/bootstrap-popover.js:
--------------------------------------------------------------------------------
1 | /* ===========================================================
2 | * bootstrap-popover.js v2.3.1
3 | * http://twitter.github.com/bootstrap/javascript.html#popovers
4 | * ===========================================================
5 | * Copyright 2012 Twitter, Inc.
6 | *
7 | * Licensed under the Apache License, Version 2.0 (the "License");
8 | * you may not use this file except in compliance with the License.
9 | * You may obtain a copy of the License at
10 | *
11 | * http://www.apache.org/licenses/LICENSE-2.0
12 | *
13 | * Unless required by applicable law or agreed to in writing, software
14 | * distributed under the License is distributed on an "AS IS" BASIS,
15 | * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
16 | * See the License for the specific language governing permissions and
17 | * limitations under the License.
18 | * =========================================================== */
19 |
20 |
21 | !function ($) {
22 |
23 | "use strict"; // jshint ;_;
24 |
25 |
26 | /* POPOVER PUBLIC CLASS DEFINITION
27 | * =============================== */
28 |
29 | var Popover = function (element, options) {
30 | this.init('popover', element, options)
31 | }
32 |
33 |
34 | /* NOTE: POPOVER EXTENDS BOOTSTRAP-TOOLTIP.js
35 | ========================================== */
36 |
37 | Popover.prototype = $.extend({}, $.fn.tooltip.Constructor.prototype, {
38 |
39 | constructor: Popover
40 |
41 | , setContent: function () {
42 | var $tip = this.tip()
43 | , title = this.getTitle()
44 | , content = this.getContent()
45 |
46 | $tip.find('.popover-title')[this.options.html ? 'html' : 'text'](title)
47 | $tip.find('.popover-content')[this.options.html ? 'html' : 'text'](content)
48 |
49 | $tip.removeClass('fade top bottom left right in')
50 | }
51 |
52 | , hasContent: function () {
53 | return this.getTitle() || this.getContent()
54 | }
55 |
56 | , getContent: function () {
57 | var content
58 | , $e = this.$element
59 | , o = this.options
60 |
61 | content = (typeof o.content == 'function' ? o.content.call($e[0]) : o.content)
62 | || $e.attr('data-content')
63 |
64 | return content
65 | }
66 |
67 | , tip: function () {
68 | if (!this.$tip) {
69 | this.$tip = $(this.options.template)
70 | }
71 | return this.$tip
72 | }
73 |
74 | , destroy: function () {
75 | this.hide().$element.off('.' + this.type).removeData(this.type)
76 | }
77 |
78 | })
79 |
80 |
81 | /* POPOVER PLUGIN DEFINITION
82 | * ======================= */
83 |
84 | var old = $.fn.popover
85 |
86 | $.fn.popover = function (option) {
87 | return this.each(function () {
88 | var $this = $(this)
89 | , data = $this.data('popover')
90 | , options = typeof option == 'object' && option
91 | if (!data) $this.data('popover', (data = new Popover(this, options)))
92 | if (typeof option == 'string') data[option]()
93 | })
94 | }
95 |
96 | $.fn.popover.Constructor = Popover
97 |
98 | $.fn.popover.defaults = $.extend({} , $.fn.tooltip.defaults, {
99 | placement: 'right'
100 | , trigger: 'click'
101 | , content: ''
102 | , template: ''
103 | })
104 |
105 |
106 | /* POPOVER NO CONFLICT
107 | * =================== */
108 |
109 | $.fn.popover.noConflict = function () {
110 | $.fn.popover = old
111 | return this
112 | }
113 |
114 | }(window.jQuery);
115 |
--------------------------------------------------------------------------------
/assets/js/README.md:
--------------------------------------------------------------------------------
1 | ## 2.0 BOOTSTRAP JS PHILOSOPHY
2 | These are the high-level design rules which guide the development of Bootstrap's plugin apis.
3 |
4 | ---
5 |
6 | ### DATA-ATTRIBUTE API
7 |
8 | We believe you should be able to use all plugins provided by Bootstrap purely through the markup API without writing a single line of javascript.
9 |
10 | We acknowledge that this isn't always the most performant and sometimes it may be desirable to turn this functionality off altogether. Therefore, as of 2.0 we provide the ability to disable the data attribute API by unbinding all events on the body namespaced with `'data-api'`. This looks like this:
11 |
12 | $('body').off('.data-api')
13 |
14 | To target a specific plugin, just include the plugins name as a namespace along with the data-api namespace like this:
15 |
16 | $('body').off('.alert.data-api')
17 |
18 | ---
19 |
20 | ### PROGRAMATIC API
21 |
22 | We also believe you should be able to use all plugins provided by Bootstrap purely through the JS API.
23 |
24 | All public APIs should be single, chainable methods, and return the collection acted upon.
25 |
26 | $(".btn.danger").button("toggle").addClass("fat")
27 |
28 | All methods should accept an optional options object, a string which targets a particular method, or null which initiates the default behavior:
29 |
30 | $("#myModal").modal() // initialized with defaults
31 | $("#myModal").modal({ keyboard: false }) // initialized with now keyboard
32 | $("#myModal").modal('show') // initializes and invokes show immediately afterqwe2
33 |
34 | ---
35 |
36 | ### OPTIONS
37 |
38 | Options should be sparse and add universal value. We should pick the right defaults.
39 |
40 | All plugins should have a default object which can be modified to effect all instance's default options. The defaults object should be available via `$.fn.plugin.defaults`.
41 |
42 | $.fn.modal.defaults = { … }
43 |
44 | An options definition should take the following form:
45 |
46 | *noun*: *adjective* - describes or modifies a quality of an instance
47 |
48 | examples:
49 |
50 | backdrop: true
51 | keyboard: false
52 | placement: 'top'
53 |
54 | ---
55 |
56 | ### EVENTS
57 |
58 | All events should have an infinitive and past participle form. The infinitive is fired just before an action takes place, the past participle on completion of the action.
59 |
60 | show | shown
61 | hide | hidden
62 |
63 | ---
64 |
65 | ### CONSTRUCTORS
66 |
67 | Each plugin should expose it's raw constructor on a `Constructor` property -- accessed in the following way:
68 |
69 |
70 | $.fn.popover.Constructor
71 |
72 | ---
73 |
74 | ### DATA ACCESSOR
75 |
76 | Each plugin stores a copy of the invoked class on an object. This class instance can be accessed directly through jQuery's data API like this:
77 |
78 | $('[rel=popover]').data('popover') instanceof $.fn.popover.Constructor
79 |
80 | ---
81 |
82 | ### DATA ATTRIBUTES
83 |
84 | Data attributes should take the following form:
85 |
86 | - data-{{verb}}={{plugin}} - defines main interaction
87 | - data-target || href^=# - defined on "control" element (if element controls an element other than self)
88 | - data-{{noun}} - defines class instance options
89 |
90 | examples:
91 |
92 | // control other targets
93 | data-toggle="modal" data-target="#foo"
94 | data-toggle="collapse" data-target="#foo" data-parent="#bar"
95 |
96 | // defined on element they control
97 | data-spy="scroll"
98 |
99 | data-dismiss="modal"
100 | data-dismiss="alert"
101 |
102 | data-toggle="dropdown"
103 |
104 | data-toggle="button"
105 | data-toggle="buttons-checkbox"
106 | data-toggle="buttons-radio"
--------------------------------------------------------------------------------
/assets/js/angularjs/1.2.6/angular-route.min.js:
--------------------------------------------------------------------------------
1 | /*
2 | AngularJS v1.2.6
3 | (c) 2010-2014 Google, Inc. http://angularjs.org
4 | License: MIT
5 | */
6 | (function(h,e,A){'use strict';function u(w,q,k){return{restrict:"ECA",terminal:!0,priority:400,transclude:"element",link:function(a,c,b,f,n){function y(){l&&(l.$destroy(),l=null);g&&(k.leave(g),g=null)}function v(){var b=w.current&&w.current.locals;if(b&&b.$template){var b=a.$new(),f=w.current;g=n(b,function(d){k.enter(d,null,g||c,function(){!e.isDefined(t)||t&&!a.$eval(t)||q()});y()});l=f.scope=b;l.$emit("$viewContentLoaded");l.$eval(h)}else y()}var l,g,t=b.autoscroll,h=b.onload||"";a.$on("$routeChangeSuccess",
7 | v);v()}}}function z(e,h,k){return{restrict:"ECA",priority:-400,link:function(a,c){var b=k.current,f=b.locals;c.html(f.$template);var n=e(c.contents());b.controller&&(f.$scope=a,f=h(b.controller,f),b.controllerAs&&(a[b.controllerAs]=f),c.data("$ngControllerController",f),c.children().data("$ngControllerController",f));n(a)}}}h=e.module("ngRoute",["ng"]).provider("$route",function(){function h(a,c){return e.extend(new (e.extend(function(){},{prototype:a})),c)}function q(a,e){var b=e.caseInsensitiveMatch,
8 | f={originalPath:a,regexp:a},h=f.keys=[];a=a.replace(/([().])/g,"\\$1").replace(/(\/)?:(\w+)([\?|\*])?/g,function(a,e,b,c){a="?"===c?c:null;c="*"===c?c:null;h.push({name:b,optional:!!a});e=e||"";return""+(a?"":e)+"(?:"+(a?e:"")+(c&&"(.+?)"||"([^/]+)")+(a||"")+")"+(a||"")}).replace(/([\/$\*])/g,"\\$1");f.regexp=RegExp("^"+a+"$",b?"i":"");return f}var k={};this.when=function(a,c){k[a]=e.extend({reloadOnSearch:!0},c,a&&q(a,c));if(a){var b="/"==a[a.length-1]?a.substr(0,a.length-1):a+"/";k[b]=e.extend({redirectTo:a},
9 | q(b,c))}return this};this.otherwise=function(a){this.when(null,a);return this};this.$get=["$rootScope","$location","$routeParams","$q","$injector","$http","$templateCache","$sce",function(a,c,b,f,n,q,v,l){function g(){var d=t(),m=r.current;if(d&&m&&d.$$route===m.$$route&&e.equals(d.pathParams,m.pathParams)&&!d.reloadOnSearch&&!x)m.params=d.params,e.copy(m.params,b),a.$broadcast("$routeUpdate",m);else if(d||m)x=!1,a.$broadcast("$routeChangeStart",d,m),(r.current=d)&&d.redirectTo&&(e.isString(d.redirectTo)?
10 | c.path(u(d.redirectTo,d.params)).search(d.params).replace():c.url(d.redirectTo(d.pathParams,c.path(),c.search())).replace()),f.when(d).then(function(){if(d){var a=e.extend({},d.resolve),c,b;e.forEach(a,function(d,c){a[c]=e.isString(d)?n.get(d):n.invoke(d)});e.isDefined(c=d.template)?e.isFunction(c)&&(c=c(d.params)):e.isDefined(b=d.templateUrl)&&(e.isFunction(b)&&(b=b(d.params)),b=l.getTrustedResourceUrl(b),e.isDefined(b)&&(d.loadedTemplateUrl=b,c=q.get(b,{cache:v}).then(function(a){return a.data})));
11 | e.isDefined(c)&&(a.$template=c);return f.all(a)}}).then(function(c){d==r.current&&(d&&(d.locals=c,e.copy(d.params,b)),a.$broadcast("$routeChangeSuccess",d,m))},function(c){d==r.current&&a.$broadcast("$routeChangeError",d,m,c)})}function t(){var a,b;e.forEach(k,function(f,k){var p;if(p=!b){var s=c.path();p=f.keys;var l={};if(f.regexp)if(s=f.regexp.exec(s)){for(var g=1,q=s.length;g= scrollHeight - offsetBottom) ?
56 | 'bottom' : offsetTop != null && scrollTop <= offsetTop ?
57 | 'top' : false
58 |
59 | if (this.affixed === affix) return
60 |
61 | this.affixed = affix
62 | this.unpin = affix == 'bottom' ? position.top - scrollTop : null
63 |
64 | this.$element.removeClass(reset).addClass('affix' + (affix ? '-' + affix : ''))
65 | }
66 |
67 |
68 | /* AFFIX PLUGIN DEFINITION
69 | * ======================= */
70 |
71 | var old = $.fn.affix
72 |
73 | $.fn.affix = function (option) {
74 | return this.each(function () {
75 | var $this = $(this)
76 | , data = $this.data('affix')
77 | , options = typeof option == 'object' && option
78 | if (!data) $this.data('affix', (data = new Affix(this, options)))
79 | if (typeof option == 'string') data[option]()
80 | })
81 | }
82 |
83 | $.fn.affix.Constructor = Affix
84 |
85 | $.fn.affix.defaults = {
86 | offset: 0
87 | }
88 |
89 |
90 | /* AFFIX NO CONFLICT
91 | * ================= */
92 |
93 | $.fn.affix.noConflict = function () {
94 | $.fn.affix = old
95 | return this
96 | }
97 |
98 |
99 | /* AFFIX DATA-API
100 | * ============== */
101 |
102 | $(window).on('load', function () {
103 | $('[data-spy="affix"]').each(function () {
104 | var $spy = $(this)
105 | , data = $spy.data()
106 |
107 | data.offset = data.offset || {}
108 |
109 | data.offsetBottom && (data.offset.bottom = data.offsetBottom)
110 | data.offsetTop && (data.offset.top = data.offsetTop)
111 |
112 | $spy.affix(data)
113 | })
114 | })
115 |
116 |
117 | }(window.jQuery);
--------------------------------------------------------------------------------
/lib/jquery.gritter.min.js:
--------------------------------------------------------------------------------
1 | (function(b){b.gritter={};b.gritter.options={position:"",class_name:"",fade_in_speed:"medium",fade_out_speed:1000,time:6000};b.gritter.add=function(f){try{return a.add(f||{})}catch(d){var c="Gritter Error: "+d;(typeof(console)!="undefined"&&console.error)?console.error(c,f):alert(c)}};b.gritter.remove=function(d,c){a.removeSpecific(d,c||{})};b.gritter.removeAll=function(c){a.stop(c||{})};var a={position:"",fade_in_speed:"",fade_out_speed:"",time:"",_custom_timer:0,_item_count:0,_is_setup:0,_tpl_close:'
',_tpl_title:'[[title]] ',_tpl_item:'',_tpl_wrap:'
',add:function(g){if(typeof(g)=="string"){g={text:g}}if(g.text===null){throw'You must supply "text" parameter.'}if(!this._is_setup){this._runSetup()}var k=g.title,n=g.text,e=g.image||"",l=g.sticky||false,m=g.class_name||b.gritter.options.class_name,j=b.gritter.options.position,d=g.time||"";this._verifyWrapper();this._item_count++;var f=this._item_count,i=this._tpl_item;b(["before_open","after_open","before_close","after_close"]).each(function(p,q){a["_"+q+"_"+f]=(b.isFunction(g[q]))?g[q]:function(){}});this._custom_timer=0;if(d){this._custom_timer=d}var c=(e!="")?' ':"",h=(e!="")?"gritter-with-image":"gritter-without-image";if(k){k=this._str_replace("[[title]]",k,this._tpl_title)}else{k=""}i=this._str_replace(["[[title]]","[[text]]","[[close]]","[[image]]","[[number]]","[[class_name]]","[[item_class]]"],[k,n,this._tpl_close,c,this._item_count,h,m],i);if(this["_before_open_"+f]()===false){return false}b("#gritter-notice-wrapper").addClass(j).append(i);var o=b("#gritter-item-"+this._item_count);o.fadeIn(this.fade_in_speed,function(){a["_after_open_"+f](b(this))});if(!l){this._setFadeTimer(o,f)}b(o).bind("mouseenter mouseleave",function(p){if(p.type=="mouseenter"){if(!l){a._restoreItemIfFading(b(this),f)}}else{if(!l){a._setFadeTimer(b(this),f)}}a._hoverState(b(this),p.type)});b(o).find(".gritter-close").click(function(){a.removeSpecific(f,{},null,true)});return f},_countRemoveWrapper:function(c,d,f){d.remove();this["_after_close_"+c](d,f);if(b(".gritter-item-wrapper").length==0){b("#gritter-notice-wrapper").remove()}},_fade:function(g,d,j,f){var j=j||{},i=(typeof(j.fade)!="undefined")?j.fade:true,c=j.speed||this.fade_out_speed,h=f;this["_before_close_"+d](g,h);if(f){g.unbind("mouseenter mouseleave")}if(i){g.animate({opacity:0},c,function(){g.animate({height:0},300,function(){a._countRemoveWrapper(d,g,h)})})}else{this._countRemoveWrapper(d,g)}},_hoverState:function(d,c){if(c=="mouseenter"){d.addClass("hover");d.find(".gritter-close").show()}else{d.removeClass("hover");d.find(".gritter-close").hide()}},removeSpecific:function(c,g,f,d){if(!f){var f=b("#gritter-item-"+c)}this._fade(f,c,g||{},d)},_restoreItemIfFading:function(d,c){clearTimeout(this["_int_id_"+c]);d.stop().css({opacity:"",height:""})},_runSetup:function(){for(opt in b.gritter.options){this[opt]=b.gritter.options[opt]}this._is_setup=1},_setFadeTimer:function(f,d){var c=(this._custom_timer)?this._custom_timer:this.time;this["_int_id_"+d]=setTimeout(function(){a._fade(f,d)},c)},stop:function(e){var c=(b.isFunction(e.before_close))?e.before_close:function(){};var f=(b.isFunction(e.after_close))?e.after_close:function(){};var d=b("#gritter-notice-wrapper");c(d);d.fadeOut(function(){b(this).remove();f()})},_str_replace:function(v,e,o,n){var k=0,h=0,t="",m="",g=0,q=0,l=[].concat(v),c=[].concat(e),u=o,d=c instanceof Array,p=u instanceof Array;u=[].concat(u);if(n){this.window[n]=0}for(k=0,g=u.length;k .active')
75 | , transition = callback
76 | && $.support.transition
77 | && $active.hasClass('fade')
78 |
79 | function next() {
80 | $active
81 | .removeClass('active')
82 | .find('> .dropdown-menu > .active')
83 | .removeClass('active')
84 |
85 | element.addClass('active')
86 |
87 | if (transition) {
88 | element[0].offsetWidth // reflow for transition
89 | element.addClass('in')
90 | } else {
91 | element.removeClass('fade')
92 | }
93 |
94 | if ( element.parent('.dropdown-menu') ) {
95 | element.closest('li.dropdown').addClass('active')
96 | }
97 |
98 | callback && callback()
99 | }
100 |
101 | transition ?
102 | $active.one($.support.transition.end, next) :
103 | next()
104 |
105 | $active.removeClass('in')
106 | }
107 | }
108 |
109 |
110 | /* TAB PLUGIN DEFINITION
111 | * ===================== */
112 |
113 | var old = $.fn.tab
114 |
115 | $.fn.tab = function ( option ) {
116 | return this.each(function () {
117 | var $this = $(this)
118 | , data = $this.data('tab')
119 | if (!data) $this.data('tab', (data = new Tab(this)))
120 | if (typeof option == 'string') data[option]()
121 | })
122 | }
123 |
124 | $.fn.tab.Constructor = Tab
125 |
126 |
127 | /* TAB NO CONFLICT
128 | * =============== */
129 |
130 | $.fn.tab.noConflict = function () {
131 | $.fn.tab = old
132 | return this
133 | }
134 |
135 |
136 | /* TAB DATA-API
137 | * ============ */
138 |
139 | $(document).on('click.tab.data-api', '[data-toggle="tab"], [data-toggle="pill"]', function (e) {
140 | e.preventDefault()
141 | $(this).tab('show')
142 | })
143 |
144 | }(window.jQuery);
--------------------------------------------------------------------------------
/partials/container.html:
--------------------------------------------------------------------------------
1 |
2 |
3 |
Container: {{ container.Name }}
4 |
5 |
6 | Start
7 | Restart
8 | Stop
9 | Kill
10 |
11 |
12 |
13 |
14 |
15 | Created:
16 | {{ container.Created }}
17 |
18 |
19 | Path:
20 | {{ container.Path }}
21 |
22 |
23 | Args:
24 | {{ container.Args }}
25 |
26 |
27 | Exposed Ports:
28 |
29 |
32 |
33 |
34 |
35 | Environment:
36 |
37 |
40 |
41 |
42 |
43 |
44 | Publish All:
45 | {{ container.HostConfig.PublishAllPorts }}
46 |
47 |
48 | Ports:
49 |
50 |
51 |
52 | {{ containerport }} => {{ v.HostIp }}:{{ v.HostPort }}
53 |
54 |
55 |
56 |
57 |
58 |
59 | Hostname:
60 | {{ container.Config.Hostname }}
61 |
62 |
63 | IPAddress:
64 | {{ container.NetworkSettings.IPAddress }}
65 |
66 |
67 | Cmd:
68 | {{ container.Config.Cmd }}
69 |
70 |
71 | Entrypoint:
72 | {{ container.Config.Entrypoint }}
73 |
74 |
75 | Volumes:
76 | {{ container.Volumes }}
77 |
78 |
79 |
80 | SysInitpath:
81 | {{ container.SysInitPath }}
82 |
83 |
84 | Image:
85 | {{ container.Image }}
86 |
87 |
88 | State:
89 | {{ container.State|getstatetext }}
90 |
91 |
92 |
93 |
94 |
95 |
96 | Changes:
97 |
98 |
99 |
100 |
101 |
102 |
103 |
104 |
105 |
106 | {{ change.Path }} {{ change.Kind }}
107 |
108 |
109 |
110 |
111 |
112 |
113 |
114 | Remove Container
115 |
116 |
117 |
--------------------------------------------------------------------------------
/assets/js/tests/unit/bootstrap-button.js:
--------------------------------------------------------------------------------
1 | $(function () {
2 |
3 | module("bootstrap-buttons")
4 |
5 | test("should provide no conflict", function () {
6 | var button = $.fn.button.noConflict()
7 | ok(!$.fn.button, 'button was set back to undefined (org value)')
8 | $.fn.button = button
9 | })
10 |
11 | test("should be defined on jquery object", function () {
12 | ok($(document.body).button, 'button method is defined')
13 | })
14 |
15 | test("should return element", function () {
16 | ok($(document.body).button()[0] == document.body, 'document.body returned')
17 | })
18 |
19 | test("should return set state to loading", function () {
20 | var btn = $('mdo ')
21 | equals(btn.html(), 'mdo', 'btn text equals mdo')
22 | btn.button('loading')
23 | equals(btn.html(), 'fat', 'btn text equals fat')
24 | stop()
25 | setTimeout(function () {
26 | ok(btn.attr('disabled'), 'btn is disabled')
27 | ok(btn.hasClass('disabled'), 'btn has disabled class')
28 | start()
29 | }, 0)
30 | })
31 |
32 | test("should return reset state", function () {
33 | var btn = $('mdo ')
34 | equals(btn.html(), 'mdo', 'btn text equals mdo')
35 | btn.button('loading')
36 | equals(btn.html(), 'fat', 'btn text equals fat')
37 | stop()
38 | setTimeout(function () {
39 | ok(btn.attr('disabled'), 'btn is disabled')
40 | ok(btn.hasClass('disabled'), 'btn has disabled class')
41 | start()
42 | stop()
43 | }, 0)
44 | btn.button('reset')
45 | equals(btn.html(), 'mdo', 'btn text equals mdo')
46 | setTimeout(function () {
47 | ok(!btn.attr('disabled'), 'btn is not disabled')
48 | ok(!btn.hasClass('disabled'), 'btn does not have disabled class')
49 | start()
50 | }, 0)
51 | })
52 |
53 | test("should toggle active", function () {
54 | var btn = $('mdo ')
55 | ok(!btn.hasClass('active'), 'btn does not have active class')
56 | btn.button('toggle')
57 | ok(btn.hasClass('active'), 'btn has class active')
58 | })
59 |
60 | test("should toggle active when btn children are clicked", function () {
61 | var btn = $('mdo ')
62 | , inner = $(' ')
63 | btn
64 | .append(inner)
65 | .appendTo($('#qunit-fixture'))
66 | ok(!btn.hasClass('active'), 'btn does not have active class')
67 | inner.click()
68 | ok(btn.hasClass('active'), 'btn has class active')
69 | })
70 |
71 | test("should toggle active when btn children are clicked within btn-group", function () {
72 | var btngroup = $('
')
73 | , btn = $('fat ')
74 | , inner = $(' ')
75 | btngroup
76 | .append(btn.append(inner))
77 | .appendTo($('#qunit-fixture'))
78 | ok(!btn.hasClass('active'), 'btn does not have active class')
79 | inner.click()
80 | ok(btn.hasClass('active'), 'btn has class active')
81 | })
82 |
83 | test("should check for closest matching toggle", function () {
84 | var group = $("
")
85 | , btn1 = $(" ")
86 | , btn2 = $(" ")
87 | , wrap = $("
")
88 |
89 | wrap.append(btn1, btn2)
90 |
91 | group
92 | .append(wrap)
93 | .appendTo($('#qunit-fixture'))
94 |
95 | ok(btn1.hasClass('active'), 'btn1 has active class')
96 | ok(!btn2.hasClass('active'), 'btn2 does not have active class')
97 | btn2.click()
98 | ok(!btn1.hasClass('active'), 'btn1 does not have active class')
99 | ok(btn2.hasClass('active'), 'btn2 has active class')
100 | })
101 |
102 | })
--------------------------------------------------------------------------------
/assets/js/tests/unit/bootstrap-modal.js:
--------------------------------------------------------------------------------
1 | $(function () {
2 |
3 | module("bootstrap-modal")
4 |
5 | test("should provide no conflict", function () {
6 | var modal = $.fn.modal.noConflict()
7 | ok(!$.fn.modal, 'modal was set back to undefined (org value)')
8 | $.fn.modal = modal
9 | })
10 |
11 | test("should be defined on jquery object", function () {
12 | var div = $("
")
13 | ok(div.modal, 'modal method is defined')
14 | })
15 |
16 | test("should return element", function () {
17 | var div = $("
")
18 | ok(div.modal() == div, 'document.body returned')
19 | $('#modal-test').remove()
20 | })
21 |
22 | test("should expose defaults var for settings", function () {
23 | ok($.fn.modal.defaults, 'default object exposed')
24 | })
25 |
26 | test("should insert into dom when show method is called", function () {
27 | stop()
28 | $.support.transition = false
29 | $("
")
30 | .bind("shown", function () {
31 | ok($('#modal-test').length, 'modal insterted into dom')
32 | $(this).remove()
33 | start()
34 | })
35 | .modal("show")
36 | })
37 |
38 | test("should fire show event", function () {
39 | stop()
40 | $.support.transition = false
41 | $("
")
42 | .bind("show", function () {
43 | ok(true, "show was called")
44 | })
45 | .bind("shown", function () {
46 | $(this).remove()
47 | start()
48 | })
49 | .modal("show")
50 | })
51 |
52 | test("should not fire shown when default prevented", function () {
53 | stop()
54 | $.support.transition = false
55 | $("
")
56 | .bind("show", function (e) {
57 | e.preventDefault()
58 | ok(true, "show was called")
59 | start()
60 | })
61 | .bind("shown", function () {
62 | ok(false, "shown was called")
63 | })
64 | .modal("show")
65 | })
66 |
67 | test("should hide modal when hide is called", function () {
68 | stop()
69 | $.support.transition = false
70 |
71 | $("
")
72 | .bind("shown", function () {
73 | ok($('#modal-test').is(":visible"), 'modal visible')
74 | ok($('#modal-test').length, 'modal insterted into dom')
75 | $(this).modal("hide")
76 | })
77 | .bind("hidden", function() {
78 | ok(!$('#modal-test').is(":visible"), 'modal hidden')
79 | $('#modal-test').remove()
80 | start()
81 | })
82 | .modal("show")
83 | })
84 |
85 | test("should toggle when toggle is called", function () {
86 | stop()
87 | $.support.transition = false
88 | var div = $("
")
89 | div
90 | .bind("shown", function () {
91 | ok($('#modal-test').is(":visible"), 'modal visible')
92 | ok($('#modal-test').length, 'modal insterted into dom')
93 | div.modal("toggle")
94 | })
95 | .bind("hidden", function() {
96 | ok(!$('#modal-test').is(":visible"), 'modal hidden')
97 | div.remove()
98 | start()
99 | })
100 | .modal("toggle")
101 | })
102 |
103 | test("should remove from dom when click [data-dismiss=modal]", function () {
104 | stop()
105 | $.support.transition = false
106 | var div = $("
")
107 | div
108 | .bind("shown", function () {
109 | ok($('#modal-test').is(":visible"), 'modal visible')
110 | ok($('#modal-test').length, 'modal insterted into dom')
111 | div.find('.close').click()
112 | })
113 | .bind("hidden", function() {
114 | ok(!$('#modal-test').is(":visible"), 'modal hidden')
115 | div.remove()
116 | start()
117 | })
118 | .modal("toggle")
119 | })
120 | })
--------------------------------------------------------------------------------
/assets/scss/_tables.scss:
--------------------------------------------------------------------------------
1 | //
2 | // Tables
3 | // --------------------------------------------------
4 |
5 |
6 | // BASE TABLES
7 | // -----------------
8 |
9 | table {
10 | max-width: 100%;
11 | background-color: $tableBackground;
12 | border-collapse: collapse;
13 | border-spacing: 0;
14 | }
15 |
16 | // BASELINE STYLES
17 | // ---------------
18 |
19 | .table {
20 | width: 100%;
21 | margin-bottom: $baseLineHeight;
22 | // Cells
23 | th,
24 | td {
25 | padding: 8px;
26 | line-height: $baseLineHeight;
27 | text-align: left;
28 | vertical-align: top;
29 | border-top: 1px solid $tableBorder;
30 | }
31 | th {
32 | font-weight: bold;
33 | }
34 | // Bottom align for column headings
35 | thead th {
36 | vertical-align: bottom;
37 | }
38 | // Remove top border from thead by default
39 | caption + thead tr:first-child th,
40 | caption + thead tr:first-child td,
41 | colgroup + thead tr:first-child th,
42 | colgroup + thead tr:first-child td,
43 | thead:first-child tr:first-child th,
44 | thead:first-child tr:first-child td {
45 | border-top: 0;
46 | }
47 | // Account for multiple tbody instances
48 | tbody + tbody {
49 | border-top: 2px solid $tableBorder;
50 | }
51 |
52 | // Nesting
53 | .table {
54 | background-color: $bodyBackground;
55 | }
56 | }
57 |
58 |
59 |
60 | // CONDENSED TABLE W/ HALF PADDING
61 | // -------------------------------
62 |
63 | .table-condensed {
64 | th,
65 | td {
66 | padding: 4px 5px;
67 | }
68 | }
69 |
70 |
71 | // BORDERED VERSION
72 | // ----------------
73 |
74 | .table-bordered {
75 | border: 1px solid $tableBorder;
76 | border-collapse: separate; // Done so we can round those corners!
77 | *border-collapse: collapse; // IE7 can't round corners anyway
78 | border-left: 0;
79 | th,
80 | td {
81 | border-left: 1px solid $tableBorder;
82 | }
83 | // Prevent a double border
84 | caption + thead tr:first-child th,
85 | caption + tbody tr:first-child th,
86 | caption + tbody tr:first-child td,
87 | colgroup + thead tr:first-child th,
88 | colgroup + tbody tr:first-child th,
89 | colgroup + tbody tr:first-child td,
90 | thead:first-child tr:first-child th,
91 | tbody:first-child tr:first-child th,
92 | tbody:first-child tr:first-child td {
93 | border-top: 0;
94 | }
95 | }
96 |
97 |
98 |
99 |
100 | // ZEBRA-STRIPING
101 | // --------------
102 |
103 | // Default zebra-stripe styles (alternating gray and transparent backgrounds)
104 | .table-striped {
105 | tbody {
106 | > tr:nth-child(odd) > td,
107 | > tr:nth-child(odd) > th {
108 | background-color: $tableBackgroundAccent;
109 | }
110 | }
111 | }
112 |
113 |
114 | // HOVER EFFECT
115 | // ------------
116 | // Placed here since it has to come after the potential zebra striping
117 | .table-hover {
118 | tbody {
119 | tr:hover > td,
120 | tr:hover > th {
121 | background-color: $tableBackgroundHover;
122 | }
123 | }
124 | }
125 |
126 |
127 | // TABLE CELL SIZING
128 | // -----------------
129 |
130 | // Reset default grid behavior
131 | table td[class*="span"],
132 | table th[class*="span"],
133 | .row-fluid table td[class*="span"],
134 | .row-fluid table th[class*="span"] {
135 | display: table-cell;
136 | float: none; // undo default grid column styles
137 | margin-left: 0; // undo default grid column styles
138 | }
139 |
140 | // Change the column widths to account for td/th padding
141 | .table td,
142 | .table th {
143 | @for $i from 1 through 12 {
144 | &.span#{$i} { @include tableColumns($i); }
145 | }
146 | }
147 |
148 |
149 |
150 | // TABLE BACKGROUNDS
151 | // -----------------
152 | // Exact selectors below required to override .table-striped
153 |
154 | .table tbody tr {
155 | &.success > td {
156 | background-color: $successBackground;
157 | }
158 | &.error > td {
159 | background-color: $errorBackground;
160 | }
161 | &.warning > td {
162 | background-color: $warningBackground;
163 | }
164 | &.info > td {
165 | background-color: $infoBackground;
166 | }
167 | }
168 |
169 | // Hover states for .table-hover
170 | .table-hover tbody tr {
171 | &.success:hover > td {
172 | background-color: darken($successBackground, 5%);
173 | }
174 | &.error:hover > td {
175 | background-color: darken($errorBackground, 5%);
176 | }
177 | &.warning:hover > td {
178 | background-color: darken($warningBackground, 5%);
179 | }
180 | &.info:hover > td {
181 | background-color: darken($infoBackground, 5%);
182 | }
183 | }
184 |
--------------------------------------------------------------------------------
/assets/js/application.js:
--------------------------------------------------------------------------------
1 | // NOTICE!! DO NOT USE ANY OF THIS JAVASCRIPT
2 | // IT'S ALL JUST JUNK FOR OUR DOCS!
3 | // ++++++++++++++++++++++++++++++++++++++++++
4 |
5 | !function ($) {
6 |
7 | $(function(){
8 |
9 | var $window = $(window)
10 |
11 | // Disable certain links in docs
12 | $('section [href^=#]').click(function (e) {
13 | e.preventDefault()
14 | })
15 |
16 | // side bar
17 | $('.bs-docs-sidenav').affix({
18 | offset: {
19 | top: function () { return $window.width() <= 980 ? 290 : 210 }
20 | , bottom: 270
21 | }
22 | })
23 |
24 | // make code pretty
25 | window.prettyPrint && prettyPrint()
26 |
27 | // add-ons
28 | $('.add-on :checkbox').on('click', function () {
29 | var $this = $(this)
30 | , method = $this.attr('checked') ? 'addClass' : 'removeClass'
31 | $(this).parents('.add-on')[method]('active')
32 | })
33 |
34 | // add tipsies to grid for scaffolding
35 | if ($('#gridSystem').length) {
36 | $('#gridSystem').tooltip({
37 | selector: '.show-grid > div'
38 | , title: function () { return $(this).width() + 'px' }
39 | })
40 | }
41 |
42 | // tooltip demo
43 | $('.tooltip-demo').tooltip({
44 | selector: "a[rel=tooltip]"
45 | })
46 |
47 | $('.tooltip-test').tooltip()
48 | $('.popover-test').popover()
49 |
50 | // popover demo
51 | $("a[rel=popover]")
52 | .popover()
53 | .click(function(e) {
54 | e.preventDefault()
55 | })
56 |
57 | // button state demo
58 | $('#fat-btn')
59 | .click(function () {
60 | var btn = $(this)
61 | btn.button('loading')
62 | setTimeout(function () {
63 | btn.button('reset')
64 | }, 3000)
65 | })
66 |
67 | // carousel demo
68 | $('#myCarousel').carousel()
69 |
70 | // javascript build logic
71 | var inputsComponent = $("#components.download input")
72 | , inputsPlugin = $("#plugins.download input")
73 | , inputsVariables = $("#variables.download input")
74 |
75 | // toggle all plugin checkboxes
76 | $('#components.download .toggle-all').on('click', function (e) {
77 | e.preventDefault()
78 | inputsComponent.attr('checked', !inputsComponent.is(':checked'))
79 | })
80 |
81 | $('#plugins.download .toggle-all').on('click', function (e) {
82 | e.preventDefault()
83 | inputsPlugin.attr('checked', !inputsPlugin.is(':checked'))
84 | })
85 |
86 | $('#variables.download .toggle-all').on('click', function (e) {
87 | e.preventDefault()
88 | inputsVariables.val('')
89 | })
90 |
91 | // request built javascript
92 | $('.download-btn').on('click', function () {
93 |
94 | var css = $("#components.download input:checked")
95 | .map(function () { return this.value })
96 | .toArray()
97 | , js = $("#plugins.download input:checked")
98 | .map(function () { return this.value })
99 | .toArray()
100 | , vars = {}
101 | , img = ['glyphicons-halflings.png', 'glyphicons-halflings-white.png']
102 |
103 | $("#variables.download input")
104 | .each(function () {
105 | $(this).val() && (vars[ $(this).prev().text() ] = $(this).val())
106 | })
107 |
108 | $.ajax({
109 | type: 'POST'
110 | , url: /\?dev/.test(window.location) ? 'http://localhost:3000' : 'http://bootstrap.herokuapp.com'
111 | , dataType: 'jsonpi'
112 | , params: {
113 | js: js
114 | , css: css
115 | , vars: vars
116 | , img: img
117 | }
118 | })
119 | })
120 | })
121 |
122 | // Modified from the original jsonpi https://github.com/benvinegar/jquery-jsonpi
123 | $.ajaxTransport('jsonpi', function(opts, originalOptions, jqXHR) {
124 | var url = opts.url;
125 |
126 | return {
127 | send: function(_, completeCallback) {
128 | var name = 'jQuery_iframe_' + jQuery.now()
129 | , iframe, form
130 |
131 | iframe = $('