diff --git a/.gitignore b/.gitignore index dc99ae877bb12722f60c567114629f5e6775dff8..15cceb3616f81705edf47ec66f3850c3431e2065 100644 --- a/.gitignore +++ b/.gitignore @@ -23,3 +23,6 @@ package-lock.json *.njsproj *.sln *.sw? + +logs +run diff --git a/CHANGELOG.md b/CHANGELOG.md new file mode 100644 index 0000000000000000000000000000000000000000..cc107b5f28868c3f66b32377e9b9c0deb26561ca --- /dev/null +++ b/CHANGELOG.md @@ -0,0 +1,205 @@ +# [4.8.0](https://github.com/easy-team/egg-vue-webpack-boilerplate/compare/4.6.0...4.8.0) (2019-11-08) + + +### Features + +* ssr asyncData ([21e5b62](https://github.com/easy-team/egg-vue-webpack-boilerplate/commit/21e5b62)) +* use easy-team mode ([473617a](https://github.com/easy-team/egg-vue-webpack-boilerplate/commit/473617a)) + + + +# [4.7.0](https://github.com/easy-team/egg-vue-webpack-boilerplate/compare/4.6.0...4.7.0) (2019-10-13) + + +### Features + +* use easy-team mode ([473617a](https://github.com/easy-team/egg-vue-webpack-boilerplate/commit/473617a)) + + + +# [4.6.0](https://github.com/easy-team/egg-vue-webpack-boilerplate/compare/4.4.6...4.6.0) (2019-10-13) + + +### Bug Fixes + +* server side render hydrate not effective ([8ef6aa8](https://github.com/easy-team/egg-vue-webpack-boilerplate/commit/8ef6aa8)) +* server side render hydrate not effective ([7f1192f](https://github.com/easy-team/egg-vue-webpack-boilerplate/commit/7f1192f)) + + +### Features + +* add inject css and js demo ([11b6083](https://github.com/easy-team/egg-vue-webpack-boilerplate/commit/11b6083)) +* inject script tag demoe ([713fb43](https://github.com/easy-team/egg-vue-webpack-boilerplate/commit/713fb43)) +* load component on demand ([c95aecd](https://github.com/easy-team/egg-vue-webpack-boilerplate/commit/c95aecd)) +* set title ([fb99718](https://github.com/easy-team/egg-vue-webpack-boilerplate/commit/fb99718)) +* use easy-team mode ([36d74e3](https://github.com/easy-team/egg-vue-webpack-boilerplate/commit/36d74e3)) + + + +# [4.5.0](https://github.com/easy-team/egg-vue-webpack-boilerplate/compare/4.4.6...4.5.0) (2019-08-02) + + +### Bug Fixes + +* server side render hydrate not effective ([8ef6aa8](https://github.com/easy-team/egg-vue-webpack-boilerplate/commit/8ef6aa8)) + + +### Features + +* set title ([fb99718](https://github.com/easy-team/egg-vue-webpack-boilerplate/commit/fb99718)) + + + +## [4.4.6](https://github.com/easy-team/egg-vue-webpack-boilerplate/compare/4.4.5...4.4.6) (2018-12-12) + + +### Bug Fixes + +* not set baseUrl for axios ([d23a8c9](https://github.com/easy-team/egg-vue-webpack-boilerplate/commit/d23a8c9)) + + + +## [4.4.5](https://github.com/easy-team/egg-vue-webpack-boilerplate/compare/4.4.2...4.4.5) (2018-11-06) + + +### Bug Fixes + +* https://github.com/easy-team/egg-vue-webpack-boilerplate/issues/88 ([cd47e3a](https://github.com/easy-team/egg-vue-webpack-boilerplate/commit/cd47e3a)) +* https://github.com/easy-team/egg-vue-webpack-boilerplate/issues/99 ([4218f85](https://github.com/easy-team/egg-vue-webpack-boilerplate/commit/4218f85)) +* imagemini plugin no install ([f80b54c](https://github.com/easy-team/egg-vue-webpack-boilerplate/commit/f80b54c)) + + +### Features + +* add link asset file example ([cb81976](https://github.com/easy-team/egg-vue-webpack-boilerplate/commit/cb81976)) + +# [4.4.0](https://github.com/easy-team/egg-vue-webpack-boilerplate/compare/4.3.0...4.4.0) (2018-10-09) + + +### Bug Fixes + +* egg worker reload for config/manifest.json update ([c1df7f1](https://github.com/easy-team/egg-vue-webpack-boilerplate/commit/c1df7f1)) + + +### Features + +* simplified configuration ([1854282](https://github.com/easy-team/egg-vue-webpack-boilerplate/commit/1854282)) +* webpack zero config implement ([16ea32e](https://github.com/easy-team/egg-vue-webpack-boilerplate/commit/16ea32e)) + + + +# [4.3.0](https://github.com/easy-team/egg-vue-webpack-boilerplate/compare/4.0.0...4.3.0) (2018-09-11) + + +### Bug Fixes + +* add article and login style ([c510473](https://github.com/easy-team/egg-vue-webpack-boilerplate/commit/c510473)) +* ajax cross origin ([d9998de](https://github.com/easy-team/egg-vue-webpack-boilerplate/commit/d9998de)) +* article add and delete ([2a65c15](https://github.com/easy-team/egg-vue-webpack-boilerplate/commit/2a65c15)) +* autoprefixer invalid ([4e497df](https://github.com/easy-team/egg-vue-webpack-boilerplate/commit/4e497df)) +* dev local spa request error ([a79a408](https://github.com/easy-team/egg-vue-webpack-boilerplate/commit/a79a408)) +* id params ([21d8b39](https://github.com/easy-team/egg-vue-webpack-boilerplate/commit/21d8b39)) +* remove webpack4 compatible ([1734520](https://github.com/easy-team/egg-vue-webpack-boilerplate/commit/1734520)) + + +### Features + +* add component async load demo ([b8b3eaf](https://github.com/easy-team/egg-vue-webpack-boilerplate/commit/b8b3eaf)) +* add i18n menu ([b7f65b0](https://github.com/easy-team/egg-vue-webpack-boilerplate/commit/b7f65b0)) +* add npm clean command ([be4177d](https://github.com/easy-team/egg-vue-webpack-boilerplate/commit/be4177d)) +* admin dashboard ([e63dc83](https://github.com/easy-team/egg-vue-webpack-boilerplate/commit/e63dc83)) +* support i18n ([752baad](https://github.com/easy-team/egg-vue-webpack-boilerplate/commit/752baad)) +* use egg-bin and egg-scripts ([cf85319](https://github.com/easy-team/egg-vue-webpack-boilerplate/commit/cf85319)) + + +### Performance Improvements + +* build by BABEL_ENV ([8d05f71](https://github.com/easy-team/egg-vue-webpack-boilerplate/commit/8d05f71)) + + + +# [4.0.0](https://github.com/easy-team/egg-vue-webpack-boilerplate/compare/3.5.0...4.0.0) (2018-03-07) + + +### Bug Fixes + +* babel-eslint deps ([d7bb91a](https://github.com/easy-team/egg-vue-webpack-boilerplate/commit/d7bb91a)) +* dll remove element-ui ([a58a5ec](https://github.com/easy-team/egg-vue-webpack-boilerplate/commit/a58a5ec)) +* hack webpack, webpack issue 6681 ([e9ecb4c](https://github.com/easy-team/egg-vue-webpack-boilerplate/commit/e9ecb4c)) + + +### Features + +* add debug command ([aa7b344](https://github.com/easy-team/egg-vue-webpack-boilerplate/commit/aa7b344)) +* add dynamic vue componnet demo ([1768ee0](https://github.com/easy-team/egg-vue-webpack-boilerplate/commit/1768ee0)) +* dll ([f5c5679](https://github.com/easy-team/egg-vue-webpack-boilerplate/commit/f5c5679)) +* dll and lib support ([bf0019c](https://github.com/easy-team/egg-vue-webpack-boilerplate/commit/bf0019c)) +* spa dynamic import vue component ([a95b75f](https://github.com/easy-team/egg-vue-webpack-boilerplate/commit/a95b75f)) +* spa use loader template ([09ea960](https://github.com/easy-team/egg-vue-webpack-boilerplate/commit/09ea960)) +* support cli build dll and auto check dll file ([2f7e61a](https://github.com/easy-team/egg-vue-webpack-boilerplate/commit/2f7e61a)) +* support html dll inject ([880cad4](https://github.com/easy-team/egg-vue-webpack-boilerplate/commit/880cad4)) +* upgrade egg to 2.0.0 and node to 8 ([1313931](https://github.com/easy-team/egg-vue-webpack-boilerplate/commit/1313931)) +* use .vue file as webpack entry ([9622d86](https://github.com/easy-team/egg-vue-webpack-boilerplate/commit/9622d86)) +* use easywebpack env ([3d6ca7b](https://github.com/easy-team/egg-vue-webpack-boilerplate/commit/3d6ca7b)) +* webpack 4 deps ([b245087](https://github.com/easy-team/egg-vue-webpack-boilerplate/commit/b245087)) +* webpack4 ([2d58278](https://github.com/easy-team/egg-vue-webpack-boilerplate/commit/2d58278)) +* webpack4 running ([a9e46e2](https://github.com/easy-team/egg-vue-webpack-boilerplate/commit/a9e46e2)) +* webpack4 service worker adapter ([456ca48](https://github.com/easy-team/egg-vue-webpack-boilerplate/commit/456ca48)) + + + +## [3.2.2](https://github.com/easy-team/egg-vue-webpack-boilerplate/compare/v3.0.3...3.2.2) (2017-11-29) + + +### Bug Fixes + +* element ui css link url ([f265956](https://github.com/easy-team/egg-vue-webpack-boilerplate/commit/f265956)) + + +### Features + +* support import css in js file ([b32a082](https://github.com/easy-team/egg-vue-webpack-boilerplate/commit/b32a082)) + + + +## [3.0.3](https://github.com/easy-team/egg-vue-webpack-boilerplate/compare/v3.0.2...v3.0.3) (2017-10-26) + + + +## [3.0.2](https://github.com/easy-team/egg-vue-webpack-boilerplate/compare/v3.0.1...v3.0.2) (2017-10-26) + + + +## [3.0.1](https://github.com/easy-team/egg-vue-webpack-boilerplate/compare/3.0.0...v3.0.1) (2017-10-26) + + +### Features + +* add autoprefixer config ([be6837b](https://github.com/easy-team/egg-vue-webpack-boilerplate/commit/be6837b)) + + + +# [3.0.0](https://github.com/easy-team/egg-vue-webpack-boilerplate/compare/1.3.1...3.0.0) (2017-09-13) + + + +## [1.3.1](https://github.com/easy-team/egg-vue-webpack-boilerplate/compare/1.2.0...1.3.1) (2017-08-29) + + +### Bug Fixes + +* default node6 , node8 please see app/controller/await/await.js description ([75d0c57](https://github.com/easy-team/egg-vue-webpack-boilerplate/commit/75d0c57)) + + + +# [1.2.0](https://github.com/easy-team/egg-vue-webpack-boilerplate/compare/1.0.0...1.2.0) (2017-08-21) + + + +# [1.0.0](https://github.com/easy-team/egg-vue-webpack-boilerplate/compare/0.6.0...1.0.0) (2017-05-25) + + +## 0.0.1 (2017-04-24) + + + diff --git a/LICENSE b/LICENSE new file mode 100644 index 0000000000000000000000000000000000000000..6c44e1440c56da18e8cf5a86c7b20a041de7af5b --- /dev/null +++ b/LICENSE @@ -0,0 +1,21 @@ +The MIT License (MIT) + +Copyright (c) 2017 sky. + +Permission is hereby granted, free of charge, to any person obtaining a copy +of this software and associated documentation files (the "Software"), to deal +in the Software without restriction, including without limitation the rights +to use, copy, modify, merge, publish, distribute, sublicense, and/or sell +copies of the Software, and to permit persons to whom the Software is +furnished to do so, subject to the following conditions: + +The above copyright notice and this permission notice shall be included in all +copies or substantial portions of the Software. + +THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR +IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, +FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE +AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER +LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, +OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE +SOFTWARE. diff --git a/README.md b/README.md new file mode 100755 index 0000000000000000000000000000000000000000..c3291c67ee2d08f659f2d695304039320f6d60c5 --- /dev/null +++ b/README.md @@ -0,0 +1,425 @@ +# egg-vue-webpack-boilerplate + +> 功能性需求或者Bug问题, 欢迎大家 PR 完善, 如果你需要了解更多信息,请加QQ群: 433207205(备注:Node.js). + + +基于 Egg + Vue + Webpack SSR 服务端渲染工程骨架项目,包括前台系统(SSR MPA)和后台管理系统(SSR SPA)。 如果要深入了解,建议请先阅读 https://www.yuque.com/easy-team/egg-vue 专题。 + +## 系统功能 + +### 前台博客系统 http://localhost:7001 + +**采用 Egg + Vue 服务端渲染** + +![](https://github.com/easy-team/egg-vue-webpack-boilerplate/blob/master/docs/images/iblog.png?raw=true) + +- 博客首页 +- 文章列表 +- 文章详情 + +### 后台管理系统 http://localhost:7001/admin + +**采用 Egg + Vue + Vue-Router + Element 单页面服务端同构渲染** + +![](https://github.com/hubcarl/egg-vue-webpack-boilerplate/blob/master/docs/images/admin.png?raw=true) + +- Dashboard +- Markdown +- 文章管理 + +## 纯净版 + +因该项目包含了多种实现, 提供多种例子实现,为防干扰, 特提供了两个纯净版本分支用于实际项目开发, 请自行选用。 + +- Egg + Vue + Axios 多页面服务端渲染分支 [feature/green/multi](https://github.com/easy-team/egg-vue-webpack-boilerplate/tree/feature/green/multi) +- Egg + Vue + vue-router + vuex + axios 单页面服务端渲染分支 [feature/green/spa](https://github.com/easy-team/egg-vue-webpack-boilerplate/tree/feature/green/spa) +- Egg + Vue + vue-router + vuex + axios 前端渲染 asset 方案 [feature/green/asset](https://github.com/easy-team/egg-vue-webpack-boilerplate/tree/feature/green/asset) +- Egg + Vue + vue-router + vuex + axios 前端渲染一体化方案 [element-admin](https://github.com/easy-team/egg-vue-webpack-boilerplate/tree/element-admin) +- Egg + Vue + TypeScript 项目,请见项目 [egg-vue-typescript-boilerplate](https://github.com/easy-team/egg-vue-typescript-boilerplate) 和 [ves-admin](https://github.com/easy-team/ves-admin) + +以上项目,你可以通过 [easywebpack-cli](https://github.com/easy-team/easywebpack-cli) 初始化 + +## 版本 + +- Egg 版本: ^2.x.x +- Node 版本: ^8.x.x+ +- Vue 版本: ^2.5.0 +- Webpack 版本: ^4.x.x, 对应 `easywebpack-vue` 版本为 ^4.x.x; Webpack3 版本项目骨架请见 `webpack3` 分支, 对应 `easywebpack-react` 版本为 3.x.x + +## 说明 + +- 项目开发之前, 请阅读[Egg + Vue 解决方案](https://www.yuque.com/easy-team/egg-vue) +- 如果你需要了解 Egg+ Vue + Webpack 项目更多信息,请扫以下二维码加好友,请备注:Node.js。 骨架功能性需求或者 Bug 问题, 欢迎大家 PR 完善。 + +![hubcarl](https://avatars3.githubusercontent.com/u/4983042?v=4&u=0befb64a57a7911c630b7f97df5632385b08da2a&s=250) + +## 文档 + +- https://www.yuque.com/easy-team/egg-vue +- https://zhuanlan.zhihu.com/easywebpack + + +## 1.特性 + +- 支持服务端渲染SSR(Server Side Render), 前端渲染CSR(Client Side Render) 方式 + +- 支持 Node 和 前端代码修改, Webpack 自动编译和热更新, `npm run dev` 一键启动应用 + +- 基于 vue + axios 多页面服务端渲染, 客户端渲染同构实现, 支持 asyncData 渲染 + +- 基于 vue + vuex + vue-router + axios 单页面服务器客户端同构实现 + +- 支持 js/css/image 资源依赖, 内置支持 CDN 特性, 支持 css/sass/less 样式编写 + +- 支持根据 .vue 文件自动创建 Webpack Entry 入口文件 + +- 开始支持多进程和缓存编译, 支持 Webpack dll 自动化构建, 与多进程编译结合,构建速度减少 2/3 + +- 支持 Vue 组件 import 异步加载, 具体实例请看[app/web/page/dynamic](app/web/page/dynamic) + +- 支持服务端渲染(SSR)失败时,自动降级为前端渲染(CSR)模式 + +- 提供 国际化 i18n 多语言支持方案 + + +## 2.依赖 + +- [easywebpack](https://github.com/easy-team/easywebpack) ^4.x.x +- [easywebpack-vue](https://github.com/easy-team/easywebpack) ^4.x.x +- [egg-view-vue-ssr](https://github.com/easy-team/egg-view-vue-ssr) ^3.x.x +- [egg-webpack](https://github.com/easy-team/egg-webpack) ^4.x.x +- [egg-webpack-vue](https://github.com/easy-team/egg-webpack-vue) ^2.x.x + + +## 3. 使用 + +#### 3.1 安装cli(非必需) + +```bash +npm install @easy-team/easywebpack-cli -g +``` + +`easywebpack-cli` 已内置 `devDependencies` 中, 无需安装。如果你需要在命令行使用 `easy` 命令, 可以单独全局安装。 + +#### 3.2 安装依赖 + +```bash +npm install +``` + + +#### 3.3 本地开发启动应用 + +```bash +npm run dev +``` + +应用访问: http://127.0.0.1:7001 + +![npm start启动](https://github.com/hubcarl/egg-vue-webpack-boilerplate/blob/master/docs/images/webpack-build.png) + + +#### 3.4 发布模式启动应用 + +- 首先在本地或者ci构建好jsbundle文件 + +```bash +npm run build +``` + +- 然后,启动应用 + +```bash +npm start +``` + + +详细打包部署请见: http://hubcarl.github.io/easywebpack/vue/dev/ + +## 4. 配置说明(支持三种方式) + +#### 4.1 方式一: `easywebpack-cli` 根据 `webpack.config.js` 自动创建Webpack Config + +```js +`config/config.local.js` +const EasyWebpack = require('@easy-team/easywebpack-vue'); +exports.webpack = { + webpackConfigList:EasyWebpack.getWebpackConfig() +}; +``` + +#### 4.2 方式二: 自己编写Webpack配置 + +编写配置请见 tag `1.0.0` build目录代码实现 + +```js +`config/config.local.js` +exports.webpack = { + webpackConfigList: [ + require(path.join(app.baseDir, 'build/client')), // http://127.0.0.1:9000 + ] +}; +``` + +#### 4.3 方式三: 开启多进程编译 + +[egg npm start 启动开启多进程编译](http://hubcarl.github.io/easywebpack/vue/version/) + + +构建会同时启动两个 webpack 构建服务, 客户端js构建(build/client), 服务端构建(build/server), 默认端口9000, webpackConfigList 端口依次递增. + + +## 5. 项目结构和基本规范 + + ├── app + │   ├── controller + │   │   ├── test + │   │   │   └── test.js + │   ├── extend + │   ├── lib + │   ├── middleware + │   ├── mocks + │   ├── proxy + │   ├── router.js + │   ├── view + │   │ ├── about // 服务器编译的jsbundle文件 + │   │   │   └── about.js + │   │   ├── home + │   │  │   └── home.js // 服务器编译的jsbundle文件 + │   │   └── layout // 用于根据指定的layout生成对应的html页面, 用于服务器渲染失败时,采用客户端渲染 + │   │   └── layout.html + │   └── web // 前端工程目录 + │   ├── asset // 存放公共js,css资源 + │   ├── framework // 前端公共库和第三方库 + │   │   ├── fastclick + │   │   │   └── fastclick.js + │   │   ├── sdk + │   │   │   ├── sdk.js + │   │   ├── storage + │   │   │   └── storage.js + │   │   └── vue // 与vue相关的公开代码 + │   │   ├── app.js // 前后端调用入口, 默认引入componet/directive/filter + │   │   ├── component.js // 组件入口, 可以增加component目录,类似下面的directive + │   │   ├── directive // directive 目录,存放各种directive组件 + │   │   ├── directive.js // directive引用入口 + │   │   └── filter.js // filter引用入口 + │   ├── page // 前端页面和webpack构建目录, 也就是webpack打包配置entryDir + │   │   ├── home // 每个页面遵循目录名, js文件名, scss文件名, vue文件名相同 + │   │   │   ├── home.scss + │   │   │   ├── home.vue + │   │   │   ├── images // 页面自有图片,公共图片和css放到asset下面 + │   │   │   │   └── icon_more.png + │   │   │   └── w-week // 页面自有组件,公共组件放到widget下面 + │   │   │   ├── w-week.scss + │   │   │   └── w-week.vue + │   │   └── test // 每个页面遵循目录名, js文件名, scss文件名, vue文件名相同 + │   │   └── test.vue + │   ├── store // 引入vuex 的基本规范, 可以分模块 + │   │   ├── app + │   │   │   ├── actions.js + │   │   │   ├── getters.js + │   │   │   ├── index.js + │   │   │   ├── mutation-type.js + │   │   │   └── mutations.js + │   │   └── store.js + │   └── component // 公共业务组件, 比如loading, toast等, 遵循目录名, js文件名, scss文件名, vue文件名相同 + │   ├── loading + │   │   ├── loading.scss + │   │   └── loading.vue + │   ├── test + │   │   ├── test.vue + │   │   └── test.scss + │   └── toast + │   ├── toast.scss + │   └── toast.vue + ├── build // webpack 自定义配置入口, 会与默认配置进行合并(看似这么多,其实这里只是占个位说明一下) + │   ├── base + │   │  └── index.js // 公共配置 + │   ├── client // 客户端webpack编译配置 + │   │ ├── dev.js + │ │ ├── prod.js + │   │ └── index.js + │ ├── server // 服务端webpack编译配置 + │   │ ├── dev.js + │ │ ├── prod.js + │   │ └── index.js + │ └── index.js + ├── config + │   ├── config.default.js + │   ├── config.local.js + │   ├── config.prod.js + │   ├── config.test.js + │   └── plugin.js + ├── doc + ├── index.js + ├── public // webpack编译目录结构, render文件查找目录 + │   ├── manifest.json // 资源依赖表 + │   ├── static + │   │   ├── css + │   │   │   ├── home + │   │   │   │   ├── home.07012d33.css + │   │   │   └── test + │   │   │   ├── test.4bbb32ce.css + │   │   ├── img + │   │   │   ├── change_top.4735c57.png + │   │   │   └── intro.0e66266.png + │   ├── test + │   │   └── test.js + │   └── vendor.js // 生成的公共打包库 + + +## 6. 功能实现 + +支持多页面/单页面服务端渲染, 前端渲染, 静态页面三种方式. + + +### 6.1 多页面服务端渲染/前端渲染同构实现 + +#### 6.1.1 多页面前端页面实现 + +在app/web/page 目录下面创建home目录, home.vue 文件, Webpack自动根据.vue文件创建entry入口, 具体实现请见[webpack.config.js](webpack.config.js) + +- home.vue 编写界面逻辑, 根元素为layout(自定义组件, 全局注册, 统一的html, meta, header, body) + +```html + + + +``` + + +#### 6.1.2 多页面后端渲染实现, 通过 `egg-view-vue-ssr` 插件 `render` 方法实现 + +- 创建controller文件home.js + +```javascript +exports.index = function* (ctx) { + yield ctx.render('home/home.js', { message: 'vue server side render!' }); +}; +``` + +- 添加路由配置 + +```javascript +app.get('/home', app.controller.home.home.index); +``` + +#### 6.1.3 多页面走前端渲染(后端路由)实现, 通过 `egg-view-vue-ssr` 插件 `renderClient` 方法实现 + +- 创建controller文件home.js + +```javascript +exports.client = function* (ctx) { + yield ctx.renderClient('home/home.js', { message: 'vue server side render!' }); +}; +``` + +- 添加路由配置 + +```javascript +app.get('/client', app.controller.home.home.client); +``` + +#### 6.1.4 HTML静态页面前端渲染 + +- 直接有easywebpack构建出静态HTML文件, 请见 `webpack.config.js` 配置和 `app/web/page/html`代码实现 + +- 通过 `egg-static` 静态文件访问HTML文件 + + +### 6.2 单页面服务器渲染同构实现 + +#### 6.2.1 单页面前端实现 + +在app/web/page 目录下面创建app目录, app.vue, app.js 文件. + +- app.vue 编写界面逻辑, 根元素为layout(自定义组件, 全局注册, 统一的html, meta, header, body) + +```html + + + +``` + +- app.js 页面调用入口 + +```javascript +import { sync } from 'vuex-router-sync'; +import store from 'store/app'; +import router from 'component/app/router'; +import app from './app.vue'; +import App from 'app'; +import Layout from 'component/layout/app'; + +App.component(Layout.name, Layout); + +sync(store, router); + +export default App.init({ + base: '/app', + ...app, + router, + store +}); + +``` + +#### 6.2.2 单页面后端实现 + +- 创建controller文件app.js + +```javascript +exports.index = function* (ctx) { + yield ctx.render('app/app.js', { url: this.url.replace(/\/app/, '') }); +}; +``` + +- 添加路由配置 + +```javascript + app.get('/app(/.+)?', app.controller.app.app.index); +``` + + +## License + +[MIT](LICENSE) diff --git a/app/controller/admin/admin.js b/app/controller/admin/admin.js new file mode 100644 index 0000000000000000000000000000000000000000..f0cec3113f9b8c5ec4cd510d337e3cc6c0c7251e --- /dev/null +++ b/app/controller/admin/admin.js @@ -0,0 +1,31 @@ +'use strict'; +const egg = require('egg'); +module.exports = class AdminController extends egg.Controller { + async login(ctx) { + await ctx.renderClient('admin/login/login.js', {}); + } + async home(ctx) { + const url = ctx.url.replace(/\/admin/, ''); + const { mode } = ctx.query; + if (mode === 'csr') { + await ctx.renderClient('admin/home/home.js', { ctx, url, title: 'easy-admin' }); + } else { + await ctx.render('admin/home/home.js', { ctx, url, title: 'easy-admin' }); + } + } + async list(ctx) { + this.ctx.body = ctx.service.article.getArtilceList(ctx.request.body); + } + async add(ctx) { + ctx.body = this.service.article.saveArticle(ctx.request.body); + } + async del(ctx) { + const { id } = ctx.params; + ctx.body = this.service.article.deleteArticle(id); + } + async detail(ctx) { + const id = ctx.params.id; + console.log('>>id', Number(id)); + ctx.body = this.service.article.getArticle(Number(id)); + } +}; \ No newline at end of file diff --git a/app/controller/category/category.js b/app/controller/category/category.js new file mode 100644 index 0000000000000000000000000000000000000000..e295e461bf90a225206cf0ccf14e2d38d5dcedef --- /dev/null +++ b/app/controller/category/category.js @@ -0,0 +1,8 @@ +'use strict'; +module.exports = app => { + return class CategoryController extends app.Controller { + async index(ctx) { + await ctx.render('category/category.js', { message: 'Egg Vue Server Side Render: Category' }); + } + }; +}; \ No newline at end of file diff --git a/app/controller/index/index.js b/app/controller/index/index.js new file mode 100644 index 0000000000000000000000000000000000000000..2c0995e4920d9349981c65e3ef16ae5581fcbe81 --- /dev/null +++ b/app/controller/index/index.js @@ -0,0 +1,22 @@ +'usestrict'; +const egg = require('egg'); +module.exports = class IndexController extends egg.Controller { + + async ssr() { + const result = this.service.article.getArtilceList(); + await this.ctx.render('index/index.js', result); + } + + async csr() { + const result = this.service.article.getArtilceList(); + await this.ctx.renderClient('index/index.js', result); + } + + async list() { + this.ctx.body = this.service.article.getArtilceList(this.ctx.query); + } + + async detail() { + const id = this.ctx.query.id; + } +}; \ No newline at end of file diff --git a/app/extend/application.js b/app/extend/application.js new file mode 100644 index 0000000000000000000000000000000000000000..697c356334b7497ce1dc7ae41bc0ba522eadc1a2 --- /dev/null +++ b/app/extend/application.js @@ -0,0 +1,11 @@ +'use strict'; +const Factory = require('../lib/db/factory'); +const DBSymbol = Symbol('Application#db'); +module.exports = { + get db() { + if (!this[DBSymbol]) { + this[DBSymbol] = Factory(); + } + return this[DBSymbol]; + }, +}; \ No newline at end of file diff --git a/app/extend/context.js b/app/extend/context.js new file mode 100644 index 0000000000000000000000000000000000000000..bd0a53344cc68b6a1a319f8e86ecf15e4ed47338 --- /dev/null +++ b/app/extend/context.js @@ -0,0 +1,6 @@ +'use strict'; +module.exports = { + get db() { + return this.app.db; + } +}; \ No newline at end of file diff --git a/app/lib/db/base.js b/app/lib/db/base.js new file mode 100644 index 0000000000000000000000000000000000000000..278b4c16cb0392389f377d630beba20849f182ff --- /dev/null +++ b/app/lib/db/base.js @@ -0,0 +1,25 @@ +'use strict'; +const shortid = require('shortid'); +module.exports = class DB { + constructor(name = 'blog.json') { + this.name = name; + } + getUniqueId() { + return shortid.generate(); + } + get(collectionName) { + return null; + } + add(collectionName, json) { + return null; + } + update(collectionName, where, json) { + return null; + } + delete(collectionName, field) { + return null; + } + getPager(collectionName, query) { + return null; + } +}; \ No newline at end of file diff --git a/app/lib/db/collection.js b/app/lib/db/collection.js new file mode 100644 index 0000000000000000000000000000000000000000..889dd15cea7f6b38065c1f5fe18257aa2083fa2d --- /dev/null +++ b/app/lib/db/collection.js @@ -0,0 +1,31 @@ +'use strict'; +module.exports = class Collection { + constructor(db, name) { + this.db = db; + this.name = name; + } + get() { + return this.db.get(this.name); + } + getByWhere(json) { + return this.db.get(this.name).find(json); + } + add(json) { + return this.db.add(this.name, json); + } + update(where, json) { + return this.db.update(this.name, where, json); + } + delete(field) { + return this.db.delete(this.name, field); + } + getPager(query) { + return this.db.getPager(this.name, query); + } + getOrderAscByField(field) { + return this.get().orderBy(field, 'asc').value(); + } + getOrderDescByField(field) { + return this.get().orderBy(field, 'desc').value(); + } +}; \ No newline at end of file diff --git a/app/lib/db/factory.js b/app/lib/db/factory.js new file mode 100644 index 0000000000000000000000000000000000000000..c1618792a5ac2cbef6db6efd0f31b5aa1fce85b4 --- /dev/null +++ b/app/lib/db/factory.js @@ -0,0 +1,14 @@ +'use strict'; +const File = require('./file'); +const MySQL = require('./mysql'); +const MongoDB = require('./mongo'); +module.exports = type => { + switch (type) { + case 'mysql': + return new MySQL(); + case 'mongo': + return new MongoDB(); + default: + return new File(); + } +}; \ No newline at end of file diff --git a/app/lib/db/file.js b/app/lib/db/file.js new file mode 100644 index 0000000000000000000000000000000000000000..6bca8928288ae1a907a1d4f14c927345c5dc1cc0 --- /dev/null +++ b/app/lib/db/file.js @@ -0,0 +1,60 @@ +'use strict'; +const lowdb = require('lowdb'); +const lodashid = require('lodash-id'); +const FileSync = require('lowdb/adapters/FileSync'); +const Base = require('./base'); +module.exports = class FileDB extends Base { + constructor(name) { + super(name); + const file = new FileSync(this.name); + this.instance = lowdb(file); + this.instance._.mixin(lodashid); + this.create(); + } + create() { + this.instance.defaults({ + article: [], + user: {} + }).write(); + } + get(collectionName) { + return this.instance.get(collectionName); + } + add(collectionName, json) { + return this.get(collectionName) + .push(json) + .write(); + } + update(collectionName, where, json) { + return this.get(collectionName).find(where).assign(json).write(); + } + delete(collectionName, field) { + return this.get(collectionName).remove(field).write(); + } + getPager(collectionName, json) { + const { + where, + like, + pageIndex, + pageSize, + orderByField, + orderBy + } = json; + const start = (pageIndex - 1) * pageSize; + const end = pageIndex * pageSize; + const result = this.get(collectionName) + .filter(where) + .filter(item => { + return Object.keys(like).reduce((isLike, key) => { + return isLike && item[key] && item[key].indexOf(like[key]) > -1; + }, true); + }) + .orderBy(orderByField, orderBy); + const total = result.size().value(); + const list = result.slice(start, end).value(); + return { + total, + list + }; + } +}; \ No newline at end of file diff --git a/app/lib/db/mongo.js b/app/lib/db/mongo.js new file mode 100644 index 0000000000000000000000000000000000000000..453b55c71f50e0b11b15127dfb42020b8a64391d --- /dev/null +++ b/app/lib/db/mongo.js @@ -0,0 +1,3 @@ +'use strict'; +const Base = require('./base'); +module.exports = class MongoDB extends Base {}; \ No newline at end of file diff --git a/app/lib/db/mysql.js b/app/lib/db/mysql.js new file mode 100644 index 0000000000000000000000000000000000000000..70a8d2b0214550fea4eff26d652907130dba79e4 --- /dev/null +++ b/app/lib/db/mysql.js @@ -0,0 +1,3 @@ +'use strict'; +const Base = require('./base'); +module.exports = class MySQLDB extends Base {}; diff --git a/app/lib/db/query.js b/app/lib/db/query.js new file mode 100644 index 0000000000000000000000000000000000000000..b6c605c1e5161bc00e14ed2f6eb660b753b6c8dc --- /dev/null +++ b/app/lib/db/query.js @@ -0,0 +1,44 @@ +'use strict'; +module.exports = class Query { + constructor() { + this.orderByField = 'createTime'; + this.orderBy = 'desc'; + this._pageIndex = 1; + this._pageSize = 10; + this.where = new Proxy({}, { + set(target, key, value, proxy) { + if (value === undefined) { + return true; + } + return Reflect.set(target, key, value, proxy); + } + }); + + this.like = new Proxy({}, { + set(target, key, value, proxy) { + if (value === undefined) { + return true; + } + return Reflect.set(target, key, value, proxy); + } + }); + } + + get pageIndex() { + return this._pageIndex; + } + set pageIndex(value) { + if (value !== undefined) { + this._pageIndex = value; + } + } + + get pageSize() { + return this._pageSize; + } + set pageSize(value) { + if (value !== undefined) { + this._pageSize = value; + } + } +}; \ No newline at end of file diff --git a/app/middleware/access.js b/app/middleware/access.js new file mode 100644 index 0000000000000000000000000000000000000000..137b311f34ff90c569a9bd692523e2d7a86aa524 --- /dev/null +++ b/app/middleware/access.js @@ -0,0 +1,35 @@ +const path = require('path'); +const util = require('util'); + +module.exports = () => { + const skipExt = [ '.png', '.jpeg', '.jpg', '.ico', '.gif' ]; + return function* (next) { + const start = new Date().getTime(); + + yield* next; + + const rs = Math.ceil(new Date().getTime() - start); + + this.set('X-Response-Time', rs); + + const ext = path.extname(this.url).toLocaleLowerCase(); + const isSkip = skipExt.indexOf(ext) !== -1 && this.status < 400; + + if (!isSkip) { + const ip = this.get('X-Real-IP') || this.ip; + const port = this.get('X-Real-Port'); + const protocol = this.protocol.toUpperCase(); + const method = this.method; + const url = this.url; + const status = this.status; + const length = this.length || '-'; + const referrer = this.get('referrer') || '-'; + const ua = this.get('user-agent') || '-'; + const serverTime = this.response.get('X-Server-Response-Time') || '-'; + const message = util.format('[access] %s:%s - %s %s %s/%s %s %s %s %s %s', + ip, port, method, url, protocol, status, length, referrer, rs, serverTime, ua); + this.logger.info(message); + } + }; +}; + diff --git a/app/middleware/locals.js b/app/middleware/locals.js new file mode 100644 index 0000000000000000000000000000000000000000..2630d65968e3289a01daf6c91b4bb33288920a55 --- /dev/null +++ b/app/middleware/locals.js @@ -0,0 +1,7 @@ +module.exports = () => { + return async function locale(ctx, next) { + ctx.locals.locale = ctx.query.locale || 'cn'; + ctx.locals.origin = ctx.request.origin; + await next(); + }; +}; \ No newline at end of file diff --git a/app/model/article.js b/app/model/article.js new file mode 100644 index 0000000000000000000000000000000000000000..153cacfc172bb3d986e0f108b87c4c87bfc210e6 --- /dev/null +++ b/app/model/article.js @@ -0,0 +1,13 @@ +'use strict'; + +module.exports = class Model { + constructor() { + super(); + this.id = void 0; + this.title = undefined; + this.summary = undefined; + this.tag = undefined; + this.hits = 0; + this.createTime = Date.now(); + } +}; \ No newline at end of file diff --git a/app/model/artilcedetail.js b/app/model/artilcedetail.js new file mode 100644 index 0000000000000000000000000000000000000000..34c817ba401922c342239cd81fc793705d85a3da --- /dev/null +++ b/app/model/artilcedetail.js @@ -0,0 +1,2 @@ +'use strict'; +module.exports = class ArticleDetail {}; diff --git a/app/model/user.js b/app/model/user.js new file mode 100644 index 0000000000000000000000000000000000000000..700dc7b62dc200ed79f26bd51ded742e6ad7be6b --- /dev/null +++ b/app/model/user.js @@ -0,0 +1,9 @@ +'use strict'; +module.exports = class User { + constructor() { + this.id = null; + this.name = null; + this.password = null; + this.roleId = null; + } +}; \ No newline at end of file diff --git a/app/model/utils/base.js b/app/model/utils/base.js new file mode 100644 index 0000000000000000000000000000000000000000..bb3192c20e6fd5cd197b68fb20a4beb420e6b212 --- /dev/null +++ b/app/model/utils/base.js @@ -0,0 +1,7 @@ +'use strict'; +const Pagination = require('./pagination'); +module.exports = class Model { + constructor() { + this.pagination = new Pagination(); + } +}; \ No newline at end of file diff --git a/app/router.js b/app/router.js new file mode 100644 index 0000000000000000000000000000000000000000..b75bf6f681eeb8e4b98cfb66e74ec2a96eb52b1d --- /dev/null +++ b/app/router.js @@ -0,0 +1,14 @@ +'use strict'; +module.exports = app => { + const { router, controller } = app; + router.get('/', controller.index.index.ssr); + router.get('/csr', controller.index.index.csr); + router.get('/list', controller.index.index.list); + router.get('/category', controller.category.category.index); + router.get('/login', controller.admin.admin.login); + router.post('/admin/api/article/list', controller.admin.admin.list); + router.post('/admin/api/article/add', controller.admin.admin.add); + router.get('/admin/api/article/del/:id', controller.admin.admin.del); + router.get('/admin/api/article/:id', controller.admin.admin.detail); + router.get('/admin(/.+)?', controller.admin.admin.home); +}; \ No newline at end of file diff --git a/app/service/article.js b/app/service/article.js new file mode 100644 index 0000000000000000000000000000000000000000..34494e9ecd454d228a7988c27570c4b03e32f824 --- /dev/null +++ b/app/service/article.js @@ -0,0 +1,35 @@ +'use strict'; +const egg = require('egg'); +const Collection = require('../lib/db/collection'); +const Query = require('../lib/db/query'); +module.exports = class ArticeService extends egg.Service { + constructor(ctx) { + super(ctx); + this.ctx = ctx; + this.colllection = new Collection(ctx.db, 'article'); + } + getArtilceList(json = {}) { + const { title, categoryId, status, pageIndex, pageSize } = json; + const query = new Query(); + query.where.categoryId = categoryId; + query.where.status = status; + query.like.title = title; + query.pageIndex = pageIndex; + query.pageSize = pageSize; + return this.colllection.getPager(query); + } + getArticle(id) { + return this.colllection.getByWhere({ id }); + } + saveArticle(json) { + if (json.id) { + return this.colllection.update({ id: json.id }, json); + } + json.id = this.ctx.db.getUniqueId(); + this.colllection.add(json); + return json.id; + } + deleteArticle(id) { + return this.colllection.delete({ id }); + } +}; \ No newline at end of file diff --git a/app/view/README.md b/app/view/README.md new file mode 100644 index 0000000000000000000000000000000000000000..7f4b987f87efaac0f80067328b73eff652fc2437 --- /dev/null +++ b/app/view/README.md @@ -0,0 +1 @@ +## egg规范view目录, 保证view文件夹存在, 否则app.config.view.root为空, 编译服务器文件会存放到该目录. \ No newline at end of file diff --git a/app/web/asset/css/blog.css b/app/web/asset/css/blog.css new file mode 100755 index 0000000000000000000000000000000000000000..0aeef20feddeb7aeb52f4f5a325b906259e04dc2 --- /dev/null +++ b/app/web/asset/css/blog.css @@ -0,0 +1,534 @@ +body { + font-family: "Helvetica Neue", Arial, "Hiragino Sans GB", "STHeiti", "Microsoft YaHei", "WenQuanYi Micro Hei", SimSun, sans-serif; + line-height: 1.7; + font-size: 16px; + color: #404040; + overflow-x: hidden; +} +p { + margin: 30px 0; +} +h1, +h2, +h3, +h4, +h5, +h6 { + font-family: "Helvetica Neue", Arial, "Hiragino Sans GB", "STHeiti", "Microsoft YaHei", "WenQuanYi Micro Hei", SimSun, sans-serif; + + line-height: 1.1; + font-weight: 800; +} +h1 { + font-family: 'Open Sans', 'Helvetica Neue', Helvetica, Arial, sans-serif; +} +h4 { + font-size: 18px; + margin-top: 24px; + margin-bottom: 24px; +} +a { + color: #404040; +} +a:hover, +a:focus { + color: #0085a1; +} +a img:hover, +a img:focus { + cursor: zoom-in; +} +article { + overflow-x: hidden; +} +blockquote { + color: #808080; + font-style: italic; + font-size: 0.95em; + margin: 20px 0 20px; +} +blockquote p { + margin: 0; +} +@media screen and (max-width: 768px) { + select { + -webkit-appearance: none; + margin-top: 15px; + color: #44bff2; + border-color: #44bff2; + padding: 0em 0.4em; + background: white; + } +} +.table th, +.table td { + border: 1px solid #eee !important; +} +hr.small { + max-width: 100px; + margin: 15px auto; + border-width: 4px; + border-color: white; +} +hr.large { + max-width: 280px; + margin: 15px auto; + border-width: 4px; + border-color: white; +} +@media screen and (max-width: 500px) { + pre code { + display: block; + width: 500px; + } +} +.post-container a { + color: #2B4180; +} +.post-container a:hover, +.post-container a:focus { + color: #6bb4bf; +} +.post-container ul, +.post-container ol { + margin-bottom: 40px; +} +.post-container ol ol, +.post-container ol ul, +.post-container ul ol, +.post-container ul ul { + margin-bottom: 5px; +} +.post-container li p { + margin: 0; + margin-bottom: 5px; +} +.post-container li h1, +.post-container li h2, +.post-container li h3, +.post-container li h4, +.post-container li h5, +.post-container li h6 { + line-height: 2; + margin-top: 20px; +} +.navbar-custom { + background: white; + position: absolute; + top: 0; + left: 0; + width: 100%; + z-index: 3; + font-family: "Helvetica Neue", Arial, "Hiragino Sans GB", "STHeiti", "Microsoft YaHei", "WenQuanYi Micro Hei", SimSun, sans-serif; + line-height: 1.7; +} +.navbar-custom .navbar-brand { + font-weight: 800; +} +.navbar-custom .nav li a { + text-transform: uppercase; + font-size: 16px; + font-weight: 800; + letter-spacing: 1px; +} +@media only screen and (min-width: 768px) { + .navbar-custom { + background: transparent; + border-bottom: 1px solid transparent; + } + .navbar-custom body { + font-size: 20px; + } + .navbar-custom .navbar-brand { + color: white; + padding: 20px; + } + .navbar-custom .navbar-brand:hover, + .navbar-custom .navbar-brand:focus { + color: rgba(255, 255, 255, 0.8); + } + .navbar-custom .nav li a { + color: white; + padding: 20px; + } + .navbar-custom .nav li a:hover, + .navbar-custom .nav li a:focus { + color: rgba(255, 255, 255, 0.8); + } +} +@media only screen and (min-width: 1170px) { + .navbar-custom { + -webkit-transition: background-color 0.3s; + -moz-transition: background-color 0.3s; + transition: background-color 0.3s; + /* Force Hardware Acceleration in WebKit */ + -webkit-transform: translate3d(0, 0, 0); + -moz-transform: translate3d(0, 0, 0); + -ms-transform: translate3d(0, 0, 0); + -o-transform: translate3d(0, 0, 0); + transform: translate3d(0, 0, 0); + -webkit-backface-visibility: hidden; + backface-visibility: hidden; + } + .navbar-custom.is-fixed { + /* when the user scrolls down, we hide the header right above the viewport */ + position: fixed; + top: -61px; + background-color: rgba(255, 255, 255, 0.9); + border-bottom: 1px solid #f2f2f2; + -webkit-transition: -webkit-transform 0.3s; + -moz-transition: -moz-transform 0.3s; + transition: transform 0.3s; + } + .navbar-custom.is-fixed .navbar-brand { + color: #404040; + } + .navbar-custom.is-fixed .navbar-brand:hover, + .navbar-custom.is-fixed .navbar-brand:focus { + color: #0085a1; + } + .navbar-custom.is-fixed .nav li a { + color: #404040; + } + .navbar-custom.is-fixed .nav li a:hover, + .navbar-custom.is-fixed .nav li a:focus { + color: #0085a1; + } + .navbar-custom.is-visible { + /* if the user changes the scrolling direction, we show the header */ + -webkit-transform: translate3d(0, 100%, 0); + -moz-transform: translate3d(0, 100%, 0); + -ms-transform: translate3d(0, 100%, 0); + -o-transform: translate3d(0, 100%, 0); + transform: translate3d(0, 100%, 0); + } +} +.intro-header { + background: no-repeat center center; + background-color: #808080; + background-attachment: scroll; + -webkit-background-size: cover; + -moz-background-size: cover; + background-size: cover; + -o-background-size: cover; + margin-bottom: 0px; + /* 0 on mobile, changed the setting*/ +} +@media only screen and (min-width: 768px) { + .intro-header { + margin-bottom: 20px; + /* response on desktop */ + } +} +.intro-header .site-heading, +.intro-header .post-heading, +.intro-header .page-heading { + padding: 100px 0 50px; + color: white; +} +@media only screen and (min-width: 768px) { + .intro-header .site-heading, + .intro-header .post-heading, + .intro-header .page-heading { + padding: 150px 0; + } +} +.intro-header .site-heading, +.intro-header .page-heading { + text-align: center; +} +.intro-header .site-heading h1, +.intro-header .page-heading h1 { + margin-top: 0; + font-size: 36px; +} +.intro-header .site-heading .subheading, +.intro-header .page-heading .subheading { + font-family: "Helvetica Neue", Arial, "Hiragino Sans GB", "STHeiti", "Microsoft YaHei", "WenQuanYi Micro Hei", SimSun, sans-serif; + line-height: 1.7; + font-size: 20px; + line-height: 1.1; + display: block; + font-weight: 300; + margin: 10px 0 0; +} +@media only screen and (min-width: 768px) { + .intro-header .site-heading h1, + .intro-header .page-heading h1 { + font-size: 65px; + } +} +.intro-header .post-heading h1 { + font-size: 27px; +} +.intro-header .post-heading .subheading, +.intro-header .post-heading .meta { + line-height: 1.1; + display: block; +} +.intro-header .post-heading .subheading { + font-family: "Helvetica Neue", Arial, "Hiragino Sans GB", "STHeiti", "Microsoft YaHei", "WenQuanYi Micro Hei", SimSun, sans-serif; + line-height: 1.7; + font-size: 17px; + font-weight: normal; + margin: 10px 0 30px; + margin-top: -5px; +} +.intro-header .post-heading .meta { + font-family: 'Lora', 'Times New Roman', serif; + font-style: italic; + font-weight: 300; + font-size: 17px; +} +.intro-header .post-heading .meta a { + color: white; +} +@media only screen and (min-width: 768px) { + .intro-header .post-heading h1 { + font-size: 36px; + } + .intro-header .post-heading .subheading { + font-size: 30px; + } + .intro-header .post-heading .meta { + font-size: 20px; + } +} +.post-preview > a { + color: #404040; +} +.post-preview > a:hover, +.post-preview > a:focus { + text-decoration: none; + color: #0666C5; +} +.post-preview > a > .post-title { + font-size: 21px; + line-height: 1.3; + margin-top: 30px; + margin-bottom: 8px; +} +.post-preview > a > .post-subtitle { + font-size: 15px; + margin: 0; + font-weight: 300; + margin-bottom: 10px; +} +.post-preview > .post-meta { + font-family: 'Lora', 'Times New Roman', serif; + color: #808080; + font-size: 16px; + font-style: italic; + margin-top: 0; +} +.post-preview > .post-meta > a { + text-decoration: none; + color: #404040; +} +.post-preview > .post-meta > a:hover, +.post-preview > .post-meta > a:focus { + color: #2B4180; + text-decoration: underline; +} +@media only screen and (min-width: 768px) { + .post-preview > a > .post-title { + font-size: 26px; + line-height: 1.3; + margin-bottom: 10px; + } + .post-preview > a > .post-subtitle { + font-size: 16px; + } + .post-preview .post-meta { + font-size: 18px; + } +} +.post-content-preview { + font-size: 13px; + font-style: normal; + color: #a3a3a3; +} +.post-content-preview:hover { + color: #46A5ED; +} +@media only screen and (min-width: 768px) { + .post-content-preview { + font-size: 14px; + } +} +.section-heading { + font-size: 36px; + margin-top: 60px; + font-weight: 700; +} +.caption { + text-align: center; + font-size: 14px; + padding: 10px; + font-style: italic; + margin: 0; + display: block; + border-bottom-right-radius: 5px; + border-bottom-left-radius: 5px; +} +footer { + font-size: 20px; + padding: 50px 0 65px; +} +footer .list-inline { + margin: 0; + padding: 0; +} +footer .copyright { + font-size: 14px; + text-align: center; + margin-bottom: 0; +} +footer .copyright a { + color: #93e1de; +} +footer .copyright a:hover, +footer .copyright a:focus { + color: #44bff2; +} +.floating-label-form-group { + font-size: 14px; + position: relative; + margin-bottom: 0; + padding-bottom: 0.5em; + border-bottom: 1px solid #eeeeee; +} +.floating-label-form-group input, +.floating-label-form-group textarea { + z-index: 1; + position: relative; + padding-right: 0; + padding-left: 0; + border: none; + border-radius: 0; + font-size: 1.5em; + background: none; + box-shadow: none !important; + resize: none; +} +.floating-label-form-group label { + display: block; + z-index: 0; + position: relative; + top: 2em; + margin: 0; + font-size: 0.85em; + line-height: 1.764705882em; + vertical-align: middle; + vertical-align: baseline; + opacity: 0; + -webkit-transition: top 0.3s ease,opacity 0.3s ease; + -moz-transition: top 0.3s ease,opacity 0.3s ease; + -ms-transition: top 0.3s ease,opacity 0.3s ease; + transition: top 0.3s ease,opacity 0.3s ease; +} +.floating-label-form-group::not(:first-child) { + padding-left: 14px; + border-left: 1px solid #eeeeee; +} +.floating-label-form-group-with-value label { + top: 0; + opacity: 1; +} +.floating-label-form-group-with-focus label { + color: #2B4180; +} +form .row:first-child .floating-label-form-group { + border-top: 1px solid #eeeeee; +} +.btn { + font-family: "Helvetica Neue", Arial, "Hiragino Sans GB", "STHeiti", "Microsoft YaHei", "WenQuanYi Micro Hei", SimSun, sans-serif; + line-height: 1.7; + text-transform: uppercase; + font-size: 14px; + font-weight: 800; + letter-spacing: 1px; + border-radius: 0; + padding: 15px 25px; +} +.btn-lg { + font-size: 16px; + padding: 25px 35px; +} +.btn-default:hover, +.btn-default:focus { + background-color: #0085a1; + border: 1px solid #0085a1; + color: white; +} +.pager { + margin: 20px 0 0; +} +.pager li > a, +.pager li > span { + font-family: "Helvetica Neue", Arial, "Hiragino Sans GB", "STHeiti", "Microsoft YaHei", "WenQuanYi Micro Hei", SimSun, sans-serif; + line-height: 1.7; + text-transform: uppercase; + font-size: 14px; + font-weight: 800; + letter-spacing: 1px; + padding: 10px 5px; + background-color: white; + border-radius: 0; +} +@media only screen and (min-width: 768px) { + .pager li > a, + .pager li > span { + font-size: 14px; + padding: 15px 25px; + } +} +.pager li > a { + color: #404040; +}c +.pager li > a:hover, +.pager li > a:focus { + color: white; + background-color: #00c9d7; + border: 1px solid #00c9d7; +} +.pager .disabled > a, +.pager .disabled > a:hover, +.pager .disabled > a:focus, +.pager .disabled > span { + color: #808080; + background-color: #404040; + cursor: not-allowed; +} +::-moz-selection { + color: white; + text-shadow: none; + background: #00c9d7; +} +::selection { + color: white; + text-shadow: none; + background: #00c9d7; +} +img::selection { + color: white; + background: transparent; +} +img::-moz-selection { + color: white; + background: transparent; +} +body { + webkit-tap-highlight-color: #00c9d7; +} + + +/* Optimize UserExperience */ +.navbar-default .navbar-toggle:focus, +.navbar-default .navbar-toggle:hover { + background-color: inherit; +} +.navbar-default .navbar-toggle:active { + background-color: #ddd; +} + diff --git a/app/web/asset/css/bootstrap.css b/app/web/asset/css/bootstrap.css new file mode 100755 index 0000000000000000000000000000000000000000..c46af7dfbda90bd819d422ef941a49c65de63d27 --- /dev/null +++ b/app/web/asset/css/bootstrap.css @@ -0,0 +1,6566 @@ +/*! + * Bootstrap v3.3.2 (http://getbootstrap.com) + * Copyright 2011-2015 Twitter, Inc. + * Licensed under MIT (https://github.com/twbs/bootstrap/blob/master/LICENSE) + */ + +/*! normalize.css v3.0.2 | MIT License | git.io/normalize */ +html { + font-family: sans-serif; + -webkit-text-size-adjust: 100%; + -ms-text-size-adjust: 100%; +} +body { + margin: 0; +} +article, +aside, +details, +figcaption, +figure, +footer, +header, +hgroup, +main, +menu, +nav, +section, +summary { + display: block; +} +audio, +canvas, +progress, +video { + display: inline-block; + vertical-align: baseline; +} +audio:not([controls]) { + display: none; + height: 0; +} +[hidden], +template { + display: none; +} +a { + background-color: transparent; +} +a:active, +a:hover { + outline: 0; +} +abbr[title] { + border-bottom: 1px dotted; +} +b, +strong { + font-weight: bold; +} +dfn { + font-style: italic; +} +h1 { + margin: .67em 0; + font-size: 2em; +} +mark { + color: #000; + background: #ff0; +} +small { + font-size: 80%; +} +sub, +sup { + position: relative; + font-size: 75%; + line-height: 0; + vertical-align: baseline; +} +sup { + top: -.5em; +} +sub { + bottom: -.25em; +} +img { + border: 0; +} +svg:not(:root) { + overflow: hidden; +} +figure { + margin: 1em 40px; +} +hr { + height: 0; + -webkit-box-sizing: content-box; + -moz-box-sizing: content-box; + box-sizing: content-box; +} +pre { + overflow: auto; +} +code, +kbd, +pre, +samp { + font-family: monospace, monospace; + font-size: 1em; +} +button, +input, +optgroup, +select, +textarea { + margin: 0; + font: inherit; + color: inherit; +} +button { + overflow: visible; +} +button, +select { + text-transform: none; +} +button, +html input[type="button"], +input[type="reset"], +input[type="submit"] { + -webkit-appearance: button; + cursor: pointer; +} +button[disabled], +html input[disabled] { + cursor: default; +} +button::-moz-focus-inner, +input::-moz-focus-inner { + padding: 0; + border: 0; +} +input { + line-height: normal; +} +input[type="checkbox"], +input[type="radio"] { + -webkit-box-sizing: border-box; + -moz-box-sizing: border-box; + box-sizing: border-box; + padding: 0; +} +input[type="number"]::-webkit-inner-spin-button, +input[type="number"]::-webkit-outer-spin-button { + height: auto; +} +input[type="search"] { + -webkit-box-sizing: content-box; + -moz-box-sizing: content-box; + box-sizing: content-box; + -webkit-appearance: textfield; +} +input[type="search"]::-webkit-search-cancel-button, +input[type="search"]::-webkit-search-decoration { + -webkit-appearance: none; +} +fieldset { + padding: .35em .625em .75em; + margin: 0 2px; + border: 1px solid #c0c0c0; +} +legend { + padding: 0; + border: 0; +} +textarea { + overflow: auto; +} +optgroup { + font-weight: bold; +} +table { + border-spacing: 0; + border-collapse: collapse; +} +td, +th { + padding: 0; +} +/*! Source: https://github.com/h5bp/html5-boilerplate/blob/master/src/css/main.css */ +@media print { + *, + *:before, + *:after { + color: #000 !important; + text-shadow: none !important; + background: transparent !important; + -webkit-box-shadow: none !important; + box-shadow: none !important; + } + a, + a:visited { + text-decoration: underline; + } + a[href]:after { + content: " (" attr(href) ")"; + } + abbr[title]:after { + content: " (" attr(title) ")"; + } + a[href^="#"]:after, + a[href^="javascript:"]:after { + content: ""; + } + pre, + blockquote { + border: 1px solid #999; + + page-break-inside: avoid; + } + thead { + display: table-header-group; + } + tr, + img { + page-break-inside: avoid; + } + img { + max-width: 100% !important; + } + p, + h2, + h3 { + orphans: 3; + widows: 3; + } + h2, + h3 { + page-break-after: avoid; + } + select { + background: #fff !important; + } + .navbar { + display: none; + } + .btn > .caret, + .dropup > .btn > .caret { + border-top-color: #000 !important; + } + .label { + border: 1px solid #000; + } + .table { + border-collapse: collapse !important; + } + .table td, + .table th { + background-color: #fff !important; + } + .table-bordered th, + .table-bordered td { + border: 1px solid #ddd !important; + } +} +@font-face { + font-family: 'Glyphicons Halflings'; + + src: url('../fonts/glyphicons-halflings-regular.eot'); + src: url('../fonts/glyphicons-halflings-regular.eot?#iefix') format('embedded-opentype'), url('../fonts/glyphicons-halflings-regular.woff2') format('woff2'), url('../fonts/glyphicons-halflings-regular.woff') format('woff'), url('../fonts/glyphicons-halflings-regular.ttf') format('truetype'), url('../fonts/glyphicons-halflings-regular.svg#glyphicons_halflingsregular') format('svg'); +} +.glyphicon { + position: relative; + top: 1px; + display: inline-block; + font-family: 'Glyphicons Halflings'; + font-style: normal; + font-weight: normal; + line-height: 1; + + -webkit-font-smoothing: antialiased; + -moz-osx-font-smoothing: grayscale; +} +.glyphicon-asterisk:before { + content: "\2a"; +} +.glyphicon-plus:before { + content: "\2b"; +} +.glyphicon-euro:before, +.glyphicon-eur:before { + content: "\20ac"; +} +.glyphicon-minus:before { + content: "\2212"; +} +.glyphicon-cloud:before { + content: "\2601"; +} +.glyphicon-envelope:before { + content: "\2709"; +} +.glyphicon-pencil:before { + content: "\270f"; +} +.glyphicon-glass:before { + content: "\e001"; +} +.glyphicon-music:before { + content: "\e002"; +} +.glyphicon-search:before { + content: "\e003"; +} +.glyphicon-heart:before { + content: "\e005"; +} +.glyphicon-star:before { + content: "\e006"; +} +.glyphicon-star-empty:before { + content: "\e007"; +} +.glyphicon-user:before { + content: "\e008"; +} +.glyphicon-film:before { + content: "\e009"; +} +.glyphicon-th-large:before { + content: "\e010"; +} +.glyphicon-th:before { + content: "\e011"; +} +.glyphicon-th-list:before { + content: "\e012"; +} +.glyphicon-ok:before { + content: "\e013"; +} +.glyphicon-remove:before { + content: "\e014"; +} +.glyphicon-zoom-in:before { + content: "\e015"; +} +.glyphicon-zoom-out:before { + content: "\e016"; +} +.glyphicon-off:before { + content: "\e017"; +} +.glyphicon-signal:before { + content: "\e018"; +} +.glyphicon-cog:before { + content: "\e019"; +} +.glyphicon-trash:before { + content: "\e020"; +} +.glyphicon-home:before { + content: "\e021"; +} +.glyphicon-file:before { + content: "\e022"; +} +.glyphicon-time:before { + content: "\e023"; +} +.glyphicon-road:before { + content: "\e024"; +} +.glyphicon-download-alt:before { + content: "\e025"; +} +.glyphicon-download:before { + content: "\e026"; +} +.glyphicon-upload:before { + content: "\e027"; +} +.glyphicon-inbox:before { + content: "\e028"; +} +.glyphicon-play-circle:before { + content: "\e029"; +} +.glyphicon-repeat:before { + content: "\e030"; +} +.glyphicon-refresh:before { + content: "\e031"; +} +.glyphicon-list-alt:before { + content: "\e032"; +} +.glyphicon-lock:before { + content: "\e033"; +} +.glyphicon-flag:before { + content: "\e034"; +} +.glyphicon-headphones:before { + content: "\e035"; +} +.glyphicon-volume-off:before { + content: "\e036"; +} +.glyphicon-volume-down:before { + content: "\e037"; +} +.glyphicon-volume-up:before { + content: "\e038"; +} +.glyphicon-qrcode:before { + content: "\e039"; +} +.glyphicon-barcode:before { + content: "\e040"; +} +.glyphicon-tag:before { + content: "\e041"; +} +.glyphicon-tags:before { + content: "\e042"; +} +.glyphicon-book:before { + content: "\e043"; +} +.glyphicon-bookmark:before { + content: "\e044"; +} +.glyphicon-print:before { + content: "\e045"; +} +.glyphicon-camera:before { + content: "\e046"; +} +.glyphicon-font:before { + content: "\e047"; +} +.glyphicon-bold:before { + content: "\e048"; +} +.glyphicon-italic:before { + content: "\e049"; +} +.glyphicon-text-height:before { + content: "\e050"; +} +.glyphicon-text-width:before { + content: "\e051"; +} +.glyphicon-align-left:before { + content: "\e052"; +} +.glyphicon-align-center:before { + content: "\e053"; +} +.glyphicon-align-right:before { + content: "\e054"; +} +.glyphicon-align-justify:before { + content: "\e055"; +} +.glyphicon-list:before { + content: "\e056"; +} +.glyphicon-indent-left:before { + content: "\e057"; +} +.glyphicon-indent-right:before { + content: "\e058"; +} +.glyphicon-facetime-video:before { + content: "\e059"; +} +.glyphicon-picture:before { + content: "\e060"; +} +.glyphicon-map-marker:before { + content: "\e062"; +} +.glyphicon-adjust:before { + content: "\e063"; +} +.glyphicon-tint:before { + content: "\e064"; +} +.glyphicon-edit:before { + content: "\e065"; +} +.glyphicon-share:before { + content: "\e066"; +} +.glyphicon-check:before { + content: "\e067"; +} +.glyphicon-move:before { + content: "\e068"; +} +.glyphicon-step-backward:before { + content: "\e069"; +} +.glyphicon-fast-backward:before { + content: "\e070"; +} +.glyphicon-backward:before { + content: "\e071"; +} +.glyphicon-play:before { + content: "\e072"; +} +.glyphicon-pause:before { + content: "\e073"; +} +.glyphicon-stop:before { + content: "\e074"; +} +.glyphicon-forward:before { + content: "\e075"; +} +.glyphicon-fast-forward:before { + content: "\e076"; +} +.glyphicon-step-forward:before { + content: "\e077"; +} +.glyphicon-eject:before { + content: "\e078"; +} +.glyphicon-chevron-left:before { + content: "\e079"; +} +.glyphicon-chevron-right:before { + content: "\e080"; +} +.glyphicon-plus-sign:before { + content: "\e081"; +} +.glyphicon-minus-sign:before { + content: "\e082"; +} +.glyphicon-remove-sign:before { + content: "\e083"; +} +.glyphicon-ok-sign:before { + content: "\e084"; +} +.glyphicon-question-sign:before { + content: "\e085"; +} +.glyphicon-info-sign:before { + content: "\e086"; +} +.glyphicon-screenshot:before { + content: "\e087"; +} +.glyphicon-remove-circle:before { + content: "\e088"; +} +.glyphicon-ok-circle:before { + content: "\e089"; +} +.glyphicon-ban-circle:before { + content: "\e090"; +} +.glyphicon-arrow-left:before { + content: "\e091"; +} +.glyphicon-arrow-right:before { + content: "\e092"; +} +.glyphicon-arrow-up:before { + content: "\e093"; +} +.glyphicon-arrow-down:before { + content: "\e094"; +} +.glyphicon-share-alt:before { + content: "\e095"; +} +.glyphicon-resize-full:before { + content: "\e096"; +} +.glyphicon-resize-small:before { + content: "\e097"; +} +.glyphicon-exclamation-sign:before { + content: "\e101"; +} +.glyphicon-gift:before { + content: "\e102"; +} +.glyphicon-leaf:before { + content: "\e103"; +} +.glyphicon-fire:before { + content: "\e104"; +} +.glyphicon-eye-open:before { + content: "\e105"; +} +.glyphicon-eye-close:before { + content: "\e106"; +} +.glyphicon-warning-sign:before { + content: "\e107"; +} +.glyphicon-plane:before { + content: "\e108"; +} +.glyphicon-calendar:before { + content: "\e109"; +} +.glyphicon-random:before { + content: "\e110"; +} +.glyphicon-comment:before { + content: "\e111"; +} +.glyphicon-magnet:before { + content: "\e112"; +} +.glyphicon-chevron-up:before { + content: "\e113"; +} +.glyphicon-chevron-down:before { + content: "\e114"; +} +.glyphicon-retweet:before { + content: "\e115"; +} +.glyphicon-shopping-cart:before { + content: "\e116"; +} +.glyphicon-folder-close:before { + content: "\e117"; +} +.glyphicon-folder-open:before { + content: "\e118"; +} +.glyphicon-resize-vertical:before { + content: "\e119"; +} +.glyphicon-resize-horizontal:before { + content: "\e120"; +} +.glyphicon-hdd:before { + content: "\e121"; +} +.glyphicon-bullhorn:before { + content: "\e122"; +} +.glyphicon-bell:before { + content: "\e123"; +} +.glyphicon-certificate:before { + content: "\e124"; +} +.glyphicon-thumbs-up:before { + content: "\e125"; +} +.glyphicon-thumbs-down:before { + content: "\e126"; +} +.glyphicon-hand-right:before { + content: "\e127"; +} +.glyphicon-hand-left:before { + content: "\e128"; +} +.glyphicon-hand-up:before { + content: "\e129"; +} +.glyphicon-hand-down:before { + content: "\e130"; +} +.glyphicon-circle-arrow-right:before { + content: "\e131"; +} +.glyphicon-circle-arrow-left:before { + content: "\e132"; +} +.glyphicon-circle-arrow-up:before { + content: "\e133"; +} +.glyphicon-circle-arrow-down:before { + content: "\e134"; +} +.glyphicon-globe:before { + content: "\e135"; +} +.glyphicon-wrench:before { + content: "\e136"; +} +.glyphicon-tasks:before { + content: "\e137"; +} +.glyphicon-filter:before { + content: "\e138"; +} +.glyphicon-briefcase:before { + content: "\e139"; +} +.glyphicon-fullscreen:before { + content: "\e140"; +} +.glyphicon-dashboard:before { + content: "\e141"; +} +.glyphicon-paperclip:before { + content: "\e142"; +} +.glyphicon-heart-empty:before { + content: "\e143"; +} +.glyphicon-link:before { + content: "\e144"; +} +.glyphicon-phone:before { + content: "\e145"; +} +.glyphicon-pushpin:before { + content: "\e146"; +} +.glyphicon-usd:before { + content: "\e148"; +} +.glyphicon-gbp:before { + content: "\e149"; +} +.glyphicon-sort:before { + content: "\e150"; +} +.glyphicon-sort-by-alphabet:before { + content: "\e151"; +} +.glyphicon-sort-by-alphabet-alt:before { + content: "\e152"; +} +.glyphicon-sort-by-order:before { + content: "\e153"; +} +.glyphicon-sort-by-order-alt:before { + content: "\e154"; +} +.glyphicon-sort-by-attributes:before { + content: "\e155"; +} +.glyphicon-sort-by-attributes-alt:before { + content: "\e156"; +} +.glyphicon-unchecked:before { + content: "\e157"; +} +.glyphicon-expand:before { + content: "\e158"; +} +.glyphicon-collapse-down:before { + content: "\e159"; +} +.glyphicon-collapse-up:before { + content: "\e160"; +} +.glyphicon-log-in:before { + content: "\e161"; +} +.glyphicon-flash:before { + content: "\e162"; +} +.glyphicon-log-out:before { + content: "\e163"; +} +.glyphicon-new-window:before { + content: "\e164"; +} +.glyphicon-record:before { + content: "\e165"; +} +.glyphicon-save:before { + content: "\e166"; +} +.glyphicon-open:before { + content: "\e167"; +} +.glyphicon-saved:before { + content: "\e168"; +} +.glyphicon-import:before { + content: "\e169"; +} +.glyphicon-export:before { + content: "\e170"; +} +.glyphicon-send:before { + content: "\e171"; +} +.glyphicon-floppy-disk:before { + content: "\e172"; +} +.glyphicon-floppy-saved:before { + content: "\e173"; +} +.glyphicon-floppy-remove:before { + content: "\e174"; +} +.glyphicon-floppy-save:before { + content: "\e175"; +} +.glyphicon-floppy-open:before { + content: "\e176"; +} +.glyphicon-credit-card:before { + content: "\e177"; +} +.glyphicon-transfer:before { + content: "\e178"; +} +.glyphicon-cutlery:before { + content: "\e179"; +} +.glyphicon-header:before { + content: "\e180"; +} +.glyphicon-compressed:before { + content: "\e181"; +} +.glyphicon-earphone:before { + content: "\e182"; +} +.glyphicon-phone-alt:before { + content: "\e183"; +} +.glyphicon-tower:before { + content: "\e184"; +} +.glyphicon-stats:before { + content: "\e185"; +} +.glyphicon-sd-video:before { + content: "\e186"; +} +.glyphicon-hd-video:before { + content: "\e187"; +} +.glyphicon-subtitles:before { + content: "\e188"; +} +.glyphicon-sound-stereo:before { + content: "\e189"; +} +.glyphicon-sound-dolby:before { + content: "\e190"; +} +.glyphicon-sound-5-1:before { + content: "\e191"; +} +.glyphicon-sound-6-1:before { + content: "\e192"; +} +.glyphicon-sound-7-1:before { + content: "\e193"; +} +.glyphicon-copyright-mark:before { + content: "\e194"; +} +.glyphicon-registration-mark:before { + content: "\e195"; +} +.glyphicon-cloud-download:before { + content: "\e197"; +} +.glyphicon-cloud-upload:before { + content: "\e198"; +} +.glyphicon-tree-conifer:before { + content: "\e199"; +} +.glyphicon-tree-deciduous:before { + content: "\e200"; +} +.glyphicon-cd:before { + content: "\e201"; +} +.glyphicon-save-file:before { + content: "\e202"; +} +.glyphicon-open-file:before { + content: "\e203"; +} +.glyphicon-level-up:before { + content: "\e204"; +} +.glyphicon-copy:before { + content: "\e205"; +} +.glyphicon-paste:before { + content: "\e206"; +} +.glyphicon-alert:before { + content: "\e209"; +} +.glyphicon-equalizer:before { + content: "\e210"; +} +.glyphicon-king:before { + content: "\e211"; +} +.glyphicon-queen:before { + content: "\e212"; +} +.glyphicon-pawn:before { + content: "\e213"; +} +.glyphicon-bishop:before { + content: "\e214"; +} +.glyphicon-knight:before { + content: "\e215"; +} +.glyphicon-baby-formula:before { + content: "\e216"; +} +.glyphicon-tent:before { + content: "\26fa"; +} +.glyphicon-blackboard:before { + content: "\e218"; +} +.glyphicon-bed:before { + content: "\e219"; +} +.glyphicon-apple:before { + content: "\f8ff"; +} +.glyphicon-erase:before { + content: "\e221"; +} +.glyphicon-hourglass:before { + content: "\231b"; +} +.glyphicon-lamp:before { + content: "\e223"; +} +.glyphicon-duplicate:before { + content: "\e224"; +} +.glyphicon-piggy-bank:before { + content: "\e225"; +} +.glyphicon-scissors:before { + content: "\e226"; +} +.glyphicon-bitcoin:before { + content: "\e227"; +} +.glyphicon-yen:before { + content: "\00a5"; +} +.glyphicon-ruble:before { + content: "\20bd"; +} +.glyphicon-scale:before { + content: "\e230"; +} +.glyphicon-ice-lolly:before { + content: "\e231"; +} +.glyphicon-ice-lolly-tasted:before { + content: "\e232"; +} +.glyphicon-education:before { + content: "\e233"; +} +.glyphicon-option-horizontal:before { + content: "\e234"; +} +.glyphicon-option-vertical:before { + content: "\e235"; +} +.glyphicon-menu-hamburger:before { + content: "\e236"; +} +.glyphicon-modal-window:before { + content: "\e237"; +} +.glyphicon-oil:before { + content: "\e238"; +} +.glyphicon-grain:before { + content: "\e239"; +} +.glyphicon-sunglasses:before { + content: "\e240"; +} +.glyphicon-text-size:before { + content: "\e241"; +} +.glyphicon-text-color:before { + content: "\e242"; +} +.glyphicon-text-background:before { + content: "\e243"; +} +.glyphicon-object-align-top:before { + content: "\e244"; +} +.glyphicon-object-align-bottom:before { + content: "\e245"; +} +.glyphicon-object-align-horizontal:before { + content: "\e246"; +} +.glyphicon-object-align-left:before { + content: "\e247"; +} +.glyphicon-object-align-vertical:before { + content: "\e248"; +} +.glyphicon-object-align-right:before { + content: "\e249"; +} +.glyphicon-triangle-right:before { + content: "\e250"; +} +.glyphicon-triangle-left:before { + content: "\e251"; +} +.glyphicon-triangle-bottom:before { + content: "\e252"; +} +.glyphicon-triangle-top:before { + content: "\e253"; +} +.glyphicon-console:before { + content: "\e254"; +} +.glyphicon-superscript:before { + content: "\e255"; +} +.glyphicon-subscript:before { + content: "\e256"; +} +.glyphicon-menu-left:before { + content: "\e257"; +} +.glyphicon-menu-right:before { + content: "\e258"; +} +.glyphicon-menu-down:before { + content: "\e259"; +} +.glyphicon-menu-up:before { + content: "\e260"; +} +* { + -webkit-box-sizing: border-box; + -moz-box-sizing: border-box; + box-sizing: border-box; +} +*:before, +*:after { + -webkit-box-sizing: border-box; + -moz-box-sizing: border-box; + box-sizing: border-box; +} +html { + font-size: 10px; + + -webkit-tap-highlight-color: rgba(0, 0, 0, 0); +} +body { + font-family: "Helvetica Neue", Helvetica, Arial, sans-serif; + font-size: 14px; + line-height: 1.42857143; + color: #333; + background-color: #fff; +} +input, +button, +select, +textarea { + font-family: inherit; + font-size: inherit; + line-height: inherit; +} +a { + color: #337ab7; + text-decoration: none; +} +a:hover, +a:focus { + color: #23527c; + text-decoration: underline; +} +a:focus { + outline: thin dotted; + outline: 5px auto -webkit-focus-ring-color; + outline-offset: -2px; +} +figure { + margin: 0; +} +img { + vertical-align: middle; +} +.img-responsive, +.thumbnail > img, +.thumbnail a > img, +.carousel-inner > .item > img, +.carousel-inner > .item > a > img { + display: block; + max-width: 100%; + height: auto; +} +.img-rounded { + border-radius: 6px; +} +.img-thumbnail { + display: inline-block; + max-width: 100%; + height: auto; + padding: 4px; + line-height: 1.42857143; + background-color: #fff; + border: 1px solid #ddd; + border-radius: 4px; + -webkit-transition: all .2s ease-in-out; + -o-transition: all .2s ease-in-out; + transition: all .2s ease-in-out; +} +.img-circle { + border-radius: 50%; +} +hr { + margin-top: 20px; + margin-bottom: 20px; + border: 0; + border-top: 1px solid #eee; +} +.sr-only { + position: absolute; + width: 1px; + height: 1px; + padding: 0; + margin: -1px; + overflow: hidden; + clip: rect(0, 0, 0, 0); + border: 0; +} +.sr-only-focusable:active, +.sr-only-focusable:focus { + position: static; + width: auto; + height: auto; + margin: 0; + overflow: visible; + clip: auto; +} +h1, +h2, +h3, +h4, +h5, +h6, +.h1, +.h2, +.h3, +.h4, +.h5, +.h6 { + font-family: inherit; + font-weight: 500; + line-height: 1.1; + color: inherit; +} +h1 small, +h2 small, +h3 small, +h4 small, +h5 small, +h6 small, +.h1 small, +.h2 small, +.h3 small, +.h4 small, +.h5 small, +.h6 small, +h1 .small, +h2 .small, +h3 .small, +h4 .small, +h5 .small, +h6 .small, +.h1 .small, +.h2 .small, +.h3 .small, +.h4 .small, +.h5 .small, +.h6 .small { + font-weight: normal; + line-height: 1; + color: #777; +} +h1, +.h1, +h2, +.h2, +h3, +.h3 { + margin-top: 20px; + margin-bottom: 10px; +} +h1 small, +.h1 small, +h2 small, +.h2 small, +h3 small, +.h3 small, +h1 .small, +.h1 .small, +h2 .small, +.h2 .small, +h3 .small, +.h3 .small { + font-size: 65%; +} +h4, +.h4, +h5, +.h5, +h6, +.h6 { + margin-top: 10px; + margin-bottom: 10px; +} +h4 small, +.h4 small, +h5 small, +.h5 small, +h6 small, +.h6 small, +h4 .small, +.h4 .small, +h5 .small, +.h5 .small, +h6 .small, +.h6 .small { + font-size: 75%; +} +h1, +.h1 { + font-size: 36px; +} +h2, +.h2 { + font-size: 30px; +} +h3, +.h3 { + font-size: 24px; +} +h4, +.h4 { + font-size: 18px; +} +h5, +.h5 { + font-size: 14px; +} +h6, +.h6 { + font-size: 12px; +} +p { + margin: 0 0 10px; +} +.lead { + margin-bottom: 20px; + font-size: 16px; + font-weight: 300; + line-height: 1.4; +} +@media (min-width: 768px) { + .lead { + font-size: 21px; + } +} +small, +.small { + font-size: 85%; +} +mark, +.mark { + padding: .2em; + background-color: #fcf8e3; +} +.text-left { + text-align: left; +} +.text-right { + text-align: right; +} +.text-center { + text-align: center; +} +.text-justify { + text-align: justify; +} +.text-nowrap { + white-space: nowrap; +} +.text-lowercase { + text-transform: lowercase; +} +.text-uppercase { + text-transform: uppercase; +} +.text-capitalize { + text-transform: capitalize; +} +.text-muted { + color: #777; +} +.text-primary { + color: #337ab7; +} +a.text-primary:hover { + color: #286090; +} +.text-success { + color: #3c763d; +} +a.text-success:hover { + color: #2b542c; +} +.text-info { + color: #31708f; +} +a.text-info:hover { + color: #245269; +} +.text-warning { + color: #8a6d3b; +} +a.text-warning:hover { + color: #66512c; +} +.text-danger { + color: #a94442; +} +a.text-danger:hover { + color: #843534; +} +.bg-primary { + color: #fff; + background-color: #337ab7; +} +a.bg-primary:hover { + background-color: #286090; +} +.bg-success { + background-color: #dff0d8; +} +a.bg-success:hover { + background-color: #c1e2b3; +} +.bg-info { + background-color: #d9edf7; +} +a.bg-info:hover { + background-color: #afd9ee; +} +.bg-warning { + background-color: #fcf8e3; +} +a.bg-warning:hover { + background-color: #f7ecb5; +} +.bg-danger { + background-color: #f2dede; +} +a.bg-danger:hover { + background-color: #e4b9b9; +} +.page-header { + padding-bottom: 9px; + margin: 40px 0 20px; + border-bottom: 1px solid #eee; +} +ul, +ol { + margin-top: 0; + margin-bottom: 10px; +} +ul ul, +ol ul, +ul ol, +ol ol { + margin-bottom: 0; +} +.list-unstyled { + padding-left: 0; + list-style: none; +} +.list-inline { + padding-left: 0; + margin-left: -5px; + list-style: none; +} +.list-inline > li { + display: inline-block; + padding-right: 5px; + padding-left: 5px; +} +dl { + margin-top: 0; + margin-bottom: 20px; +} +dt, +dd { + line-height: 1.42857143; +} +dt { + font-weight: bold; +} +dd { + margin-left: 0; +} +@media (min-width: 768px) { + .dl-horizontal dt { + float: left; + width: 160px; + overflow: hidden; + clear: left; + text-align: right; + text-overflow: ellipsis; + white-space: nowrap; + } + .dl-horizontal dd { + margin-left: 180px; + } +} +abbr[title], +abbr[data-original-title] { + cursor: help; + border-bottom: 1px dotted #777; +} +.initialism { + font-size: 90%; + text-transform: uppercase; +} +blockquote { + padding: 10px 20px; + margin: 0 0 20px; + font-size: 17.5px; + border-left: 5px solid #eee; +} +blockquote p:last-child, +blockquote ul:last-child, +blockquote ol:last-child { + margin-bottom: 0; +} +blockquote footer, +blockquote small, +blockquote .small { + display: block; + font-size: 80%; + line-height: 1.42857143; + color: #777; +} +blockquote footer:before, +blockquote small:before, +blockquote .small:before { + content: '\2014 \00A0'; +} +.blockquote-reverse, +blockquote.pull-right { + padding-right: 15px; + padding-left: 0; + text-align: right; + border-right: 5px solid #eee; + border-left: 0; +} +.blockquote-reverse footer:before, +blockquote.pull-right footer:before, +.blockquote-reverse small:before, +blockquote.pull-right small:before, +.blockquote-reverse .small:before, +blockquote.pull-right .small:before { + content: ''; +} +.blockquote-reverse footer:after, +blockquote.pull-right footer:after, +.blockquote-reverse small:after, +blockquote.pull-right small:after, +.blockquote-reverse .small:after, +blockquote.pull-right .small:after { + content: '\00A0 \2014'; +} +address { + margin-bottom: 20px; + font-style: normal; + line-height: 1.42857143; +} +code, +kbd, +pre, +samp { + font-family: Menlo, Monaco, Consolas, "Courier New", monospace; +} +code { + padding: 2px 4px; + font-size: 90%; + color: #c7254e; + background-color: #f9f2f4; + border-radius: 4px; +} +kbd { + padding: 2px 4px; + font-size: 90%; + color: #fff; + background-color: #333; + border-radius: 3px; + -webkit-box-shadow: inset 0 -1px 0 rgba(0, 0, 0, .25); + box-shadow: inset 0 -1px 0 rgba(0, 0, 0, .25); +} +kbd kbd { + padding: 0; + font-size: 100%; + font-weight: bold; + -webkit-box-shadow: none; + box-shadow: none; +} +pre { + display: block; + padding: 9.5px; + margin: 0 0 10px; + font-size: 13px; + line-height: 1.42857143; + color: #333; + word-break: break-all; + word-wrap: break-word; + background-color: #f5f5f5; + border: 1px solid #ccc; + border-radius: 4px; +} +pre code { + padding: 0; + font-size: inherit; + color: inherit; + white-space: pre-wrap; + background-color: transparent; + border-radius: 0; +} +.pre-scrollable { + max-height: 340px; + overflow-y: scroll; +} +.container { + padding-right: 15px; + padding-left: 15px; + margin-right: auto; + margin-left: auto; +} +@media (min-width: 768px) { + .container { + width: 750px; + } +} +@media (min-width: 992px) { + .container { + width: 970px; + } +} +@media (min-width: 1200px) { + .container { + width: 1170px; + } +} +.container-fluid { + padding-right: 15px; + padding-left: 15px; + margin-right: auto; + margin-left: auto; +} +.row { + margin-right: -15px; + margin-left: -15px; +} +.col-xs-1, .col-sm-1, .col-md-1, .col-lg-1, .col-xs-2, .col-sm-2, .col-md-2, .col-lg-2, .col-xs-3, .col-sm-3, .col-md-3, .col-lg-3, .col-xs-4, .col-sm-4, .col-md-4, .col-lg-4, .col-xs-5, .col-sm-5, .col-md-5, .col-lg-5, .col-xs-6, .col-sm-6, .col-md-6, .col-lg-6, .col-xs-7, .col-sm-7, .col-md-7, .col-lg-7, .col-xs-8, .col-sm-8, .col-md-8, .col-lg-8, .col-xs-9, .col-sm-9, .col-md-9, .col-lg-9, .col-xs-10, .col-sm-10, .col-md-10, .col-lg-10, .col-xs-11, .col-sm-11, .col-md-11, .col-lg-11, .col-xs-12, .col-sm-12, .col-md-12, .col-lg-12 { + position: relative; + min-height: 1px; + padding-right: 15px; + padding-left: 15px; +} +.col-xs-1, .col-xs-2, .col-xs-3, .col-xs-4, .col-xs-5, .col-xs-6, .col-xs-7, .col-xs-8, .col-xs-9, .col-xs-10, .col-xs-11, .col-xs-12 { + float: left; +} +.col-xs-12 { + width: 100%; +} +.col-xs-11 { + width: 91.66666667%; +} +.col-xs-10 { + width: 83.33333333%; +} +.col-xs-9 { + width: 75%; +} +.col-xs-8 { + width: 66.66666667%; +} +.col-xs-7 { + width: 58.33333333%; +} +.col-xs-6 { + width: 50%; +} +.col-xs-5 { + width: 41.66666667%; +} +.col-xs-4 { + width: 33.33333333%; +} +.col-xs-3 { + width: 25%; +} +.col-xs-2 { + width: 16.66666667%; +} +.col-xs-1 { + width: 8.33333333%; +} +.col-xs-pull-12 { + right: 100%; +} +.col-xs-pull-11 { + right: 91.66666667%; +} +.col-xs-pull-10 { + right: 83.33333333%; +} +.col-xs-pull-9 { + right: 75%; +} +.col-xs-pull-8 { + right: 66.66666667%; +} +.col-xs-pull-7 { + right: 58.33333333%; +} +.col-xs-pull-6 { + right: 50%; +} +.col-xs-pull-5 { + right: 41.66666667%; +} +.col-xs-pull-4 { + right: 33.33333333%; +} +.col-xs-pull-3 { + right: 25%; +} +.col-xs-pull-2 { + right: 16.66666667%; +} +.col-xs-pull-1 { + right: 8.33333333%; +} +.col-xs-pull-0 { + right: auto; +} +.col-xs-push-12 { + left: 100%; +} +.col-xs-push-11 { + left: 91.66666667%; +} +.col-xs-push-10 { + left: 83.33333333%; +} +.col-xs-push-9 { + left: 75%; +} +.col-xs-push-8 { + left: 66.66666667%; +} +.col-xs-push-7 { + left: 58.33333333%; +} +.col-xs-push-6 { + left: 50%; +} +.col-xs-push-5 { + left: 41.66666667%; +} +.col-xs-push-4 { + left: 33.33333333%; +} +.col-xs-push-3 { + left: 25%; +} +.col-xs-push-2 { + left: 16.66666667%; +} +.col-xs-push-1 { + left: 8.33333333%; +} +.col-xs-push-0 { + left: auto; +} +.col-xs-offset-12 { + margin-left: 100%; +} +.col-xs-offset-11 { + margin-left: 91.66666667%; +} +.col-xs-offset-10 { + margin-left: 83.33333333%; +} +.col-xs-offset-9 { + margin-left: 75%; +} +.col-xs-offset-8 { + margin-left: 66.66666667%; +} +.col-xs-offset-7 { + margin-left: 58.33333333%; +} +.col-xs-offset-6 { + margin-left: 50%; +} +.col-xs-offset-5 { + margin-left: 41.66666667%; +} +.col-xs-offset-4 { + margin-left: 33.33333333%; +} +.col-xs-offset-3 { + margin-left: 25%; +} +.col-xs-offset-2 { + margin-left: 16.66666667%; +} +.col-xs-offset-1 { + margin-left: 8.33333333%; +} +.col-xs-offset-0 { + margin-left: 0; +} +@media (min-width: 768px) { + .col-sm-1, .col-sm-2, .col-sm-3, .col-sm-4, .col-sm-5, .col-sm-6, .col-sm-7, .col-sm-8, .col-sm-9, .col-sm-10, .col-sm-11, .col-sm-12 { + float: left; + } + .col-sm-12 { + width: 100%; + } + .col-sm-11 { + width: 91.66666667%; + } + .col-sm-10 { + width: 83.33333333%; + } + .col-sm-9 { + width: 75%; + } + .col-sm-8 { + width: 66.66666667%; + } + .col-sm-7 { + width: 58.33333333%; + } + .col-sm-6 { + width: 50%; + } + .col-sm-5 { + width: 41.66666667%; + } + .col-sm-4 { + width: 33.33333333%; + } + .col-sm-3 { + width: 25%; + } + .col-sm-2 { + width: 16.66666667%; + } + .col-sm-1 { + width: 8.33333333%; + } + .col-sm-pull-12 { + right: 100%; + } + .col-sm-pull-11 { + right: 91.66666667%; + } + .col-sm-pull-10 { + right: 83.33333333%; + } + .col-sm-pull-9 { + right: 75%; + } + .col-sm-pull-8 { + right: 66.66666667%; + } + .col-sm-pull-7 { + right: 58.33333333%; + } + .col-sm-pull-6 { + right: 50%; + } + .col-sm-pull-5 { + right: 41.66666667%; + } + .col-sm-pull-4 { + right: 33.33333333%; + } + .col-sm-pull-3 { + right: 25%; + } + .col-sm-pull-2 { + right: 16.66666667%; + } + .col-sm-pull-1 { + right: 8.33333333%; + } + .col-sm-pull-0 { + right: auto; + } + .col-sm-push-12 { + left: 100%; + } + .col-sm-push-11 { + left: 91.66666667%; + } + .col-sm-push-10 { + left: 83.33333333%; + } + .col-sm-push-9 { + left: 75%; + } + .col-sm-push-8 { + left: 66.66666667%; + } + .col-sm-push-7 { + left: 58.33333333%; + } + .col-sm-push-6 { + left: 50%; + } + .col-sm-push-5 { + left: 41.66666667%; + } + .col-sm-push-4 { + left: 33.33333333%; + } + .col-sm-push-3 { + left: 25%; + } + .col-sm-push-2 { + left: 16.66666667%; + } + .col-sm-push-1 { + left: 8.33333333%; + } + .col-sm-push-0 { + left: auto; + } + .col-sm-offset-12 { + margin-left: 100%; + } + .col-sm-offset-11 { + margin-left: 91.66666667%; + } + .col-sm-offset-10 { + margin-left: 83.33333333%; + } + .col-sm-offset-9 { + margin-left: 75%; + } + .col-sm-offset-8 { + margin-left: 66.66666667%; + } + .col-sm-offset-7 { + margin-left: 58.33333333%; + } + .col-sm-offset-6 { + margin-left: 50%; + } + .col-sm-offset-5 { + margin-left: 41.66666667%; + } + .col-sm-offset-4 { + margin-left: 33.33333333%; + } + .col-sm-offset-3 { + margin-left: 25%; + } + .col-sm-offset-2 { + margin-left: 16.66666667%; + } + .col-sm-offset-1 { + margin-left: 8.33333333%; + } + .col-sm-offset-0 { + margin-left: 0; + } +} +@media (min-width: 992px) { + .col-md-1, .col-md-2, .col-md-3, .col-md-4, .col-md-5, .col-md-6, .col-md-7, .col-md-8, .col-md-9, .col-md-10, .col-md-11, .col-md-12 { + float: left; + } + .col-md-12 { + width: 100%; + } + .col-md-11 { + width: 91.66666667%; + } + .col-md-10 { + width: 83.33333333%; + } + .col-md-9 { + width: 75%; + } + .col-md-8 { + width: 66.66666667%; + } + .col-md-7 { + width: 58.33333333%; + } + .col-md-6 { + width: 50%; + } + .col-md-5 { + width: 41.66666667%; + } + .col-md-4 { + width: 33.33333333%; + } + .col-md-3 { + width: 25%; + } + .col-md-2 { + width: 16.66666667%; + } + .col-md-1 { + width: 8.33333333%; + } + .col-md-pull-12 { + right: 100%; + } + .col-md-pull-11 { + right: 91.66666667%; + } + .col-md-pull-10 { + right: 83.33333333%; + } + .col-md-pull-9 { + right: 75%; + } + .col-md-pull-8 { + right: 66.66666667%; + } + .col-md-pull-7 { + right: 58.33333333%; + } + .col-md-pull-6 { + right: 50%; + } + .col-md-pull-5 { + right: 41.66666667%; + } + .col-md-pull-4 { + right: 33.33333333%; + } + .col-md-pull-3 { + right: 25%; + } + .col-md-pull-2 { + right: 16.66666667%; + } + .col-md-pull-1 { + right: 8.33333333%; + } + .col-md-pull-0 { + right: auto; + } + .col-md-push-12 { + left: 100%; + } + .col-md-push-11 { + left: 91.66666667%; + } + .col-md-push-10 { + left: 83.33333333%; + } + .col-md-push-9 { + left: 75%; + } + .col-md-push-8 { + left: 66.66666667%; + } + .col-md-push-7 { + left: 58.33333333%; + } + .col-md-push-6 { + left: 50%; + } + .col-md-push-5 { + left: 41.66666667%; + } + .col-md-push-4 { + left: 33.33333333%; + } + .col-md-push-3 { + left: 25%; + } + .col-md-push-2 { + left: 16.66666667%; + } + .col-md-push-1 { + left: 8.33333333%; + } + .col-md-push-0 { + left: auto; + } + .col-md-offset-12 { + margin-left: 100%; + } + .col-md-offset-11 { + margin-left: 91.66666667%; + } + .col-md-offset-10 { + margin-left: 83.33333333%; + } + .col-md-offset-9 { + margin-left: 75%; + } + .col-md-offset-8 { + margin-left: 66.66666667%; + } + .col-md-offset-7 { + margin-left: 58.33333333%; + } + .col-md-offset-6 { + margin-left: 50%; + } + .col-md-offset-5 { + margin-left: 41.66666667%; + } + .col-md-offset-4 { + margin-left: 33.33333333%; + } + .col-md-offset-3 { + margin-left: 25%; + } + .col-md-offset-2 { + margin-left: 16.66666667%; + } + .col-md-offset-1 { + margin-left: 8.33333333%; + } + .col-md-offset-0 { + margin-left: 0; + } +} +@media (min-width: 1200px) { + .col-lg-1, .col-lg-2, .col-lg-3, .col-lg-4, .col-lg-5, .col-lg-6, .col-lg-7, .col-lg-8, .col-lg-9, .col-lg-10, .col-lg-11, .col-lg-12 { + float: left; + } + .col-lg-12 { + width: 100%; + } + .col-lg-11 { + width: 91.66666667%; + } + .col-lg-10 { + width: 83.33333333%; + } + .col-lg-9 { + width: 75%; + } + .col-lg-8 { + width: 66.66666667%; + } + .col-lg-7 { + width: 58.33333333%; + } + .col-lg-6 { + width: 50%; + } + .col-lg-5 { + width: 41.66666667%; + } + .col-lg-4 { + width: 33.33333333%; + } + .col-lg-3 { + width: 25%; + } + .col-lg-2 { + width: 16.66666667%; + } + .col-lg-1 { + width: 8.33333333%; + } + .col-lg-pull-12 { + right: 100%; + } + .col-lg-pull-11 { + right: 91.66666667%; + } + .col-lg-pull-10 { + right: 83.33333333%; + } + .col-lg-pull-9 { + right: 75%; + } + .col-lg-pull-8 { + right: 66.66666667%; + } + .col-lg-pull-7 { + right: 58.33333333%; + } + .col-lg-pull-6 { + right: 50%; + } + .col-lg-pull-5 { + right: 41.66666667%; + } + .col-lg-pull-4 { + right: 33.33333333%; + } + .col-lg-pull-3 { + right: 25%; + } + .col-lg-pull-2 { + right: 16.66666667%; + } + .col-lg-pull-1 { + right: 8.33333333%; + } + .col-lg-pull-0 { + right: auto; + } + .col-lg-push-12 { + left: 100%; + } + .col-lg-push-11 { + left: 91.66666667%; + } + .col-lg-push-10 { + left: 83.33333333%; + } + .col-lg-push-9 { + left: 75%; + } + .col-lg-push-8 { + left: 66.66666667%; + } + .col-lg-push-7 { + left: 58.33333333%; + } + .col-lg-push-6 { + left: 50%; + } + .col-lg-push-5 { + left: 41.66666667%; + } + .col-lg-push-4 { + left: 33.33333333%; + } + .col-lg-push-3 { + left: 25%; + } + .col-lg-push-2 { + left: 16.66666667%; + } + .col-lg-push-1 { + left: 8.33333333%; + } + .col-lg-push-0 { + left: auto; + } + .col-lg-offset-12 { + margin-left: 100%; + } + .col-lg-offset-11 { + margin-left: 91.66666667%; + } + .col-lg-offset-10 { + margin-left: 83.33333333%; + } + .col-lg-offset-9 { + margin-left: 75%; + } + .col-lg-offset-8 { + margin-left: 66.66666667%; + } + .col-lg-offset-7 { + margin-left: 58.33333333%; + } + .col-lg-offset-6 { + margin-left: 50%; + } + .col-lg-offset-5 { + margin-left: 41.66666667%; + } + .col-lg-offset-4 { + margin-left: 33.33333333%; + } + .col-lg-offset-3 { + margin-left: 25%; + } + .col-lg-offset-2 { + margin-left: 16.66666667%; + } + .col-lg-offset-1 { + margin-left: 8.33333333%; + } + .col-lg-offset-0 { + margin-left: 0; + } +} +table { + background-color: transparent; +} +caption { + padding-top: 8px; + padding-bottom: 8px; + color: #777; + text-align: left; +} +th { + text-align: left; +} +.table { + width: 100%; + max-width: 100%; + margin-bottom: 20px; +} +.table > thead > tr > th, +.table > tbody > tr > th, +.table > tfoot > tr > th, +.table > thead > tr > td, +.table > tbody > tr > td, +.table > tfoot > tr > td { + padding: 8px; + line-height: 1.42857143; + vertical-align: top; + border-top: 1px solid #ddd; +} +.table > thead > tr > th { + vertical-align: bottom; + border-bottom: 2px solid #ddd; +} +.table > caption + thead > tr:first-child > th, +.table > colgroup + thead > tr:first-child > th, +.table > thead:first-child > tr:first-child > th, +.table > caption + thead > tr:first-child > td, +.table > colgroup + thead > tr:first-child > td, +.table > thead:first-child > tr:first-child > td { + border-top: 0; +} +.table > tbody + tbody { + border-top: 2px solid #ddd; +} +.table .table { + background-color: #fff; +} +.table-condensed > thead > tr > th, +.table-condensed > tbody > tr > th, +.table-condensed > tfoot > tr > th, +.table-condensed > thead > tr > td, +.table-condensed > tbody > tr > td, +.table-condensed > tfoot > tr > td { + padding: 5px; +} +.table-bordered { + border: 1px solid #ddd; +} +.table-bordered > thead > tr > th, +.table-bordered > tbody > tr > th, +.table-bordered > tfoot > tr > th, +.table-bordered > thead > tr > td, +.table-bordered > tbody > tr > td, +.table-bordered > tfoot > tr > td { + border: 1px solid #ddd; +} +.table-bordered > thead > tr > th, +.table-bordered > thead > tr > td { + border-bottom-width: 2px; +} +.table-striped > tbody > tr:nth-of-type(odd) { + background-color: #f9f9f9; +} +.table-hover > tbody > tr:hover { + background-color: #f5f5f5; +} +table col[class*="col-"] { + position: static; + display: table-column; + float: none; +} +table td[class*="col-"], +table th[class*="col-"] { + position: static; + display: table-cell; + float: none; +} +.table > thead > tr > td.active, +.table > tbody > tr > td.active, +.table > tfoot > tr > td.active, +.table > thead > tr > th.active, +.table > tbody > tr > th.active, +.table > tfoot > tr > th.active, +.table > thead > tr.active > td, +.table > tbody > tr.active > td, +.table > tfoot > tr.active > td, +.table > thead > tr.active > th, +.table > tbody > tr.active > th, +.table > tfoot > tr.active > th { + background-color: #f5f5f5; +} +.table-hover > tbody > tr > td.active:hover, +.table-hover > tbody > tr > th.active:hover, +.table-hover > tbody > tr.active:hover > td, +.table-hover > tbody > tr:hover > .active, +.table-hover > tbody > tr.active:hover > th { + background-color: #e8e8e8; +} +.table > thead > tr > td.success, +.table > tbody > tr > td.success, +.table > tfoot > tr > td.success, +.table > thead > tr > th.success, +.table > tbody > tr > th.success, +.table > tfoot > tr > th.success, +.table > thead > tr.success > td, +.table > tbody > tr.success > td, +.table > tfoot > tr.success > td, +.table > thead > tr.success > th, +.table > tbody > tr.success > th, +.table > tfoot > tr.success > th { + background-color: #dff0d8; +} +.table-hover > tbody > tr > td.success:hover, +.table-hover > tbody > tr > th.success:hover, +.table-hover > tbody > tr.success:hover > td, +.table-hover > tbody > tr:hover > .success, +.table-hover > tbody > tr.success:hover > th { + background-color: #d0e9c6; +} +.table > thead > tr > td.info, +.table > tbody > tr > td.info, +.table > tfoot > tr > td.info, +.table > thead > tr > th.info, +.table > tbody > tr > th.info, +.table > tfoot > tr > th.info, +.table > thead > tr.info > td, +.table > tbody > tr.info > td, +.table > tfoot > tr.info > td, +.table > thead > tr.info > th, +.table > tbody > tr.info > th, +.table > tfoot > tr.info > th { + background-color: #d9edf7; +} +.table-hover > tbody > tr > td.info:hover, +.table-hover > tbody > tr > th.info:hover, +.table-hover > tbody > tr.info:hover > td, +.table-hover > tbody > tr:hover > .info, +.table-hover > tbody > tr.info:hover > th { + background-color: #c4e3f3; +} +.table > thead > tr > td.warning, +.table > tbody > tr > td.warning, +.table > tfoot > tr > td.warning, +.table > thead > tr > th.warning, +.table > tbody > tr > th.warning, +.table > tfoot > tr > th.warning, +.table > thead > tr.warning > td, +.table > tbody > tr.warning > td, +.table > tfoot > tr.warning > td, +.table > thead > tr.warning > th, +.table > tbody > tr.warning > th, +.table > tfoot > tr.warning > th { + background-color: #fcf8e3; +} +.table-hover > tbody > tr > td.warning:hover, +.table-hover > tbody > tr > th.warning:hover, +.table-hover > tbody > tr.warning:hover > td, +.table-hover > tbody > tr:hover > .warning, +.table-hover > tbody > tr.warning:hover > th { + background-color: #faf2cc; +} +.table > thead > tr > td.danger, +.table > tbody > tr > td.danger, +.table > tfoot > tr > td.danger, +.table > thead > tr > th.danger, +.table > tbody > tr > th.danger, +.table > tfoot > tr > th.danger, +.table > thead > tr.danger > td, +.table > tbody > tr.danger > td, +.table > tfoot > tr.danger > td, +.table > thead > tr.danger > th, +.table > tbody > tr.danger > th, +.table > tfoot > tr.danger > th { + background-color: #f2dede; +} +.table-hover > tbody > tr > td.danger:hover, +.table-hover > tbody > tr > th.danger:hover, +.table-hover > tbody > tr.danger:hover > td, +.table-hover > tbody > tr:hover > .danger, +.table-hover > tbody > tr.danger:hover > th { + background-color: #ebcccc; +} +.table-responsive { + min-height: .01%; + overflow-x: auto; +} +@media screen and (max-width: 767px) { + .table-responsive { + width: 100%; + margin-bottom: 15px; + overflow-y: hidden; + -ms-overflow-style: -ms-autohiding-scrollbar; + border: 1px solid #ddd; + } + .table-responsive > .table { + margin-bottom: 0; + } + .table-responsive > .table > thead > tr > th, + .table-responsive > .table > tbody > tr > th, + .table-responsive > .table > tfoot > tr > th, + .table-responsive > .table > thead > tr > td, + .table-responsive > .table > tbody > tr > td, + .table-responsive > .table > tfoot > tr > td { + white-space: nowrap; + } + .table-responsive > .table-bordered { + border: 0; + } + .table-responsive > .table-bordered > thead > tr > th:first-child, + .table-responsive > .table-bordered > tbody > tr > th:first-child, + .table-responsive > .table-bordered > tfoot > tr > th:first-child, + .table-responsive > .table-bordered > thead > tr > td:first-child, + .table-responsive > .table-bordered > tbody > tr > td:first-child, + .table-responsive > .table-bordered > tfoot > tr > td:first-child { + border-left: 0; + } + .table-responsive > .table-bordered > thead > tr > th:last-child, + .table-responsive > .table-bordered > tbody > tr > th:last-child, + .table-responsive > .table-bordered > tfoot > tr > th:last-child, + .table-responsive > .table-bordered > thead > tr > td:last-child, + .table-responsive > .table-bordered > tbody > tr > td:last-child, + .table-responsive > .table-bordered > tfoot > tr > td:last-child { + border-right: 0; + } + .table-responsive > .table-bordered > tbody > tr:last-child > th, + .table-responsive > .table-bordered > tfoot > tr:last-child > th, + .table-responsive > .table-bordered > tbody > tr:last-child > td, + .table-responsive > .table-bordered > tfoot > tr:last-child > td { + border-bottom: 0; + } +} +fieldset { + min-width: 0; + padding: 0; + margin: 0; + border: 0; +} +legend { + display: block; + width: 100%; + padding: 0; + margin-bottom: 20px; + font-size: 21px; + line-height: inherit; + color: #333; + border: 0; + border-bottom: 1px solid #e5e5e5; +} +label { + display: inline-block; + max-width: 100%; + margin-bottom: 5px; + font-weight: bold; +} +input[type="search"] { + -webkit-box-sizing: border-box; + -moz-box-sizing: border-box; + box-sizing: border-box; +} +input[type="radio"], +input[type="checkbox"] { + margin: 4px 0 0; + margin-top: 1px \9; + line-height: normal; +} +input[type="file"] { + display: block; +} +input[type="range"] { + display: block; + width: 100%; +} +select[multiple], +select[size] { + height: auto; +} +input[type="file"]:focus, +input[type="radio"]:focus, +input[type="checkbox"]:focus { + outline: thin dotted; + outline: 5px auto -webkit-focus-ring-color; + outline-offset: -2px; +} +output { + display: block; + padding-top: 7px; + font-size: 14px; + line-height: 1.42857143; + color: #555; +} +.form-control { + display: block; + width: 100%; + height: 34px; + padding: 6px 12px; + font-size: 14px; + line-height: 1.42857143; + color: #555; + background-color: #fff; + background-image: none; + border: 1px solid #ccc; + border-radius: 4px; + -webkit-box-shadow: inset 0 1px 1px rgba(0, 0, 0, .075); + box-shadow: inset 0 1px 1px rgba(0, 0, 0, .075); + -webkit-transition: border-color ease-in-out .15s, -webkit-box-shadow ease-in-out .15s; + -o-transition: border-color ease-in-out .15s, box-shadow ease-in-out .15s; + transition: border-color ease-in-out .15s, box-shadow ease-in-out .15s; +} +.form-control:focus { + border-color: #66afe9; + outline: 0; + -webkit-box-shadow: inset 0 1px 1px rgba(0,0,0,.075), 0 0 8px rgba(102, 175, 233, .6); + box-shadow: inset 0 1px 1px rgba(0,0,0,.075), 0 0 8px rgba(102, 175, 233, .6); +} +.form-control::-moz-placeholder { + color: #999; + opacity: 1; +} +.form-control:-ms-input-placeholder { + color: #999; +} +.form-control::-webkit-input-placeholder { + color: #999; +} +.form-control[disabled], +.form-control[readonly], +fieldset[disabled] .form-control { + cursor: not-allowed; + background-color: #eee; + opacity: 1; +} +textarea.form-control { + height: auto; +} +input[type="search"] { + -webkit-appearance: none; +} +@media screen and (-webkit-min-device-pixel-ratio: 0) { + input[type="date"], + input[type="time"], + input[type="datetime-local"], + input[type="month"] { + line-height: 34px; + } + input[type="date"].input-sm, + input[type="time"].input-sm, + input[type="datetime-local"].input-sm, + input[type="month"].input-sm, + .input-group-sm input[type="date"], + .input-group-sm input[type="time"], + .input-group-sm input[type="datetime-local"], + .input-group-sm input[type="month"] { + line-height: 30px; + } + input[type="date"].input-lg, + input[type="time"].input-lg, + input[type="datetime-local"].input-lg, + input[type="month"].input-lg, + .input-group-lg input[type="date"], + .input-group-lg input[type="time"], + .input-group-lg input[type="datetime-local"], + .input-group-lg input[type="month"] { + line-height: 46px; + } +} +.form-group { + margin-bottom: 15px; +} +.radio, +.checkbox { + position: relative; + display: block; + margin-top: 10px; + margin-bottom: 10px; +} +.radio label, +.checkbox label { + min-height: 20px; + padding-left: 20px; + margin-bottom: 0; + font-weight: normal; + cursor: pointer; +} +.radio input[type="radio"], +.radio-inline input[type="radio"], +.checkbox input[type="checkbox"], +.checkbox-inline input[type="checkbox"] { + position: absolute; + margin-top: 4px \9; + margin-left: -20px; +} +.radio + .radio, +.checkbox + .checkbox { + margin-top: -5px; +} +.radio-inline, +.checkbox-inline { + display: inline-block; + padding-left: 20px; + margin-bottom: 0; + font-weight: normal; + vertical-align: middle; + cursor: pointer; +} +.radio-inline + .radio-inline, +.checkbox-inline + .checkbox-inline { + margin-top: 0; + margin-left: 10px; +} +input[type="radio"][disabled], +input[type="checkbox"][disabled], +input[type="radio"].disabled, +input[type="checkbox"].disabled, +fieldset[disabled] input[type="radio"], +fieldset[disabled] input[type="checkbox"] { + cursor: not-allowed; +} +.radio-inline.disabled, +.checkbox-inline.disabled, +fieldset[disabled] .radio-inline, +fieldset[disabled] .checkbox-inline { + cursor: not-allowed; +} +.radio.disabled label, +.checkbox.disabled label, +fieldset[disabled] .radio label, +fieldset[disabled] .checkbox label { + cursor: not-allowed; +} +.form-control-static { + padding-top: 7px; + padding-bottom: 7px; + margin-bottom: 0; +} +.form-control-static.input-lg, +.form-control-static.input-sm { + padding-right: 0; + padding-left: 0; +} +.input-sm { + height: 30px; + padding: 5px 10px; + font-size: 12px; + line-height: 1.5; + border-radius: 3px; +} +select.input-sm { + height: 30px; + line-height: 30px; +} +textarea.input-sm, +select[multiple].input-sm { + height: auto; +} +.form-group-sm .form-control { + height: 30px; + padding: 5px 10px; + font-size: 12px; + line-height: 1.5; + border-radius: 3px; +} +select.form-group-sm .form-control { + height: 30px; + line-height: 30px; +} +textarea.form-group-sm .form-control, +select[multiple].form-group-sm .form-control { + height: auto; +} +.form-group-sm .form-control-static { + height: 30px; + padding: 5px 10px; + font-size: 12px; + line-height: 1.5; +} +.input-lg { + height: 46px; + padding: 10px 16px; + font-size: 18px; + line-height: 1.3333333; + border-radius: 6px; +} +select.input-lg { + height: 46px; + line-height: 46px; +} +textarea.input-lg, +select[multiple].input-lg { + height: auto; +} +.form-group-lg .form-control { + height: 46px; + padding: 10px 16px; + font-size: 18px; + line-height: 1.3333333; + border-radius: 6px; +} +select.form-group-lg .form-control { + height: 46px; + line-height: 46px; +} +textarea.form-group-lg .form-control, +select[multiple].form-group-lg .form-control { + height: auto; +} +.form-group-lg .form-control-static { + height: 46px; + padding: 10px 16px; + font-size: 18px; + line-height: 1.3333333; +} +.has-feedback { + position: relative; +} +.has-feedback .form-control { + padding-right: 42.5px; +} +.form-control-feedback { + position: absolute; + top: 0; + right: 0; + z-index: 2; + display: block; + width: 34px; + height: 34px; + line-height: 34px; + text-align: center; + pointer-events: none; +} +.input-lg + .form-control-feedback { + width: 46px; + height: 46px; + line-height: 46px; +} +.input-sm + .form-control-feedback { + width: 30px; + height: 30px; + line-height: 30px; +} +.has-success .help-block, +.has-success .control-label, +.has-success .radio, +.has-success .checkbox, +.has-success .radio-inline, +.has-success .checkbox-inline, +.has-success.radio label, +.has-success.checkbox label, +.has-success.radio-inline label, +.has-success.checkbox-inline label { + color: #3c763d; +} +.has-success .form-control { + border-color: #3c763d; + -webkit-box-shadow: inset 0 1px 1px rgba(0, 0, 0, .075); + box-shadow: inset 0 1px 1px rgba(0, 0, 0, .075); +} +.has-success .form-control:focus { + border-color: #2b542c; + -webkit-box-shadow: inset 0 1px 1px rgba(0, 0, 0, .075), 0 0 6px #67b168; + box-shadow: inset 0 1px 1px rgba(0, 0, 0, .075), 0 0 6px #67b168; +} +.has-success .input-group-addon { + color: #3c763d; + background-color: #dff0d8; + border-color: #3c763d; +} +.has-success .form-control-feedback { + color: #3c763d; +} +.has-warning .help-block, +.has-warning .control-label, +.has-warning .radio, +.has-warning .checkbox, +.has-warning .radio-inline, +.has-warning .checkbox-inline, +.has-warning.radio label, +.has-warning.checkbox label, +.has-warning.radio-inline label, +.has-warning.checkbox-inline label { + color: #8a6d3b; +} +.has-warning .form-control { + border-color: #8a6d3b; + -webkit-box-shadow: inset 0 1px 1px rgba(0, 0, 0, .075); + box-shadow: inset 0 1px 1px rgba(0, 0, 0, .075); +} +.has-warning .form-control:focus { + border-color: #66512c; + -webkit-box-shadow: inset 0 1px 1px rgba(0, 0, 0, .075), 0 0 6px #c0a16b; + box-shadow: inset 0 1px 1px rgba(0, 0, 0, .075), 0 0 6px #c0a16b; +} +.has-warning .input-group-addon { + color: #8a6d3b; + background-color: #fcf8e3; + border-color: #8a6d3b; +} +.has-warning .form-control-feedback { + color: #8a6d3b; +} +.has-error .help-block, +.has-error .control-label, +.has-error .radio, +.has-error .checkbox, +.has-error .radio-inline, +.has-error .checkbox-inline, +.has-error.radio label, +.has-error.checkbox label, +.has-error.radio-inline label, +.has-error.checkbox-inline label { + color: #a94442; +} +.has-error .form-control { + border-color: #a94442; + -webkit-box-shadow: inset 0 1px 1px rgba(0, 0, 0, .075); + box-shadow: inset 0 1px 1px rgba(0, 0, 0, .075); +} +.has-error .form-control:focus { + border-color: #843534; + -webkit-box-shadow: inset 0 1px 1px rgba(0, 0, 0, .075), 0 0 6px #ce8483; + box-shadow: inset 0 1px 1px rgba(0, 0, 0, .075), 0 0 6px #ce8483; +} +.has-error .input-group-addon { + color: #a94442; + background-color: #f2dede; + border-color: #a94442; +} +.has-error .form-control-feedback { + color: #a94442; +} +.has-feedback label ~ .form-control-feedback { + top: 25px; +} +.has-feedback label.sr-only ~ .form-control-feedback { + top: 0; +} +.help-block { + display: block; + margin-top: 5px; + margin-bottom: 10px; + color: #737373; +} +@media (min-width: 768px) { + .form-inline .form-group { + display: inline-block; + margin-bottom: 0; + vertical-align: middle; + } + .form-inline .form-control { + display: inline-block; + width: auto; + vertical-align: middle; + } + .form-inline .form-control-static { + display: inline-block; + } + .form-inline .input-group { + display: inline-table; + vertical-align: middle; + } + .form-inline .input-group .input-group-addon, + .form-inline .input-group .input-group-btn, + .form-inline .input-group .form-control { + width: auto; + } + .form-inline .input-group > .form-control { + width: 100%; + } + .form-inline .control-label { + margin-bottom: 0; + vertical-align: middle; + } + .form-inline .radio, + .form-inline .checkbox { + display: inline-block; + margin-top: 0; + margin-bottom: 0; + vertical-align: middle; + } + .form-inline .radio label, + .form-inline .checkbox label { + padding-left: 0; + } + .form-inline .radio input[type="radio"], + .form-inline .checkbox input[type="checkbox"] { + position: relative; + margin-left: 0; + } + .form-inline .has-feedback .form-control-feedback { + top: 0; + } +} +.form-horizontal .radio, +.form-horizontal .checkbox, +.form-horizontal .radio-inline, +.form-horizontal .checkbox-inline { + padding-top: 7px; + margin-top: 0; + margin-bottom: 0; +} +.form-horizontal .radio, +.form-horizontal .checkbox { + min-height: 27px; +} +.form-horizontal .form-group { + margin-right: -15px; + margin-left: -15px; +} +@media (min-width: 768px) { + .form-horizontal .control-label { + padding-top: 7px; + margin-bottom: 0; + text-align: right; + } +} +.form-horizontal .has-feedback .form-control-feedback { + right: 15px; +} +@media (min-width: 768px) { + .form-horizontal .form-group-lg .control-label { + padding-top: 14.333333px; + } +} +@media (min-width: 768px) { + .form-horizontal .form-group-sm .control-label { + padding-top: 6px; + } +} +.btn { + display: inline-block; + padding: 6px 12px; + margin-bottom: 0; + font-size: 14px; + font-weight: normal; + line-height: 1.42857143; + text-align: center; + white-space: nowrap; + vertical-align: middle; + -ms-touch-action: manipulation; + touch-action: manipulation; + cursor: pointer; + -webkit-user-select: none; + -moz-user-select: none; + -ms-user-select: none; + user-select: none; + background-image: none; + border: 1px solid transparent; + border-radius: 4px; +} +.btn:focus, +.btn:active:focus, +.btn.active:focus, +.btn.focus, +.btn:active.focus, +.btn.active.focus { + outline: thin dotted; + outline: 5px auto -webkit-focus-ring-color; + outline-offset: -2px; +} +.btn:hover, +.btn:focus, +.btn.focus { + color: #333; + text-decoration: none; +} +.btn:active, +.btn.active { + background-image: none; + outline: 0; + -webkit-box-shadow: inset 0 3px 5px rgba(0, 0, 0, .125); + box-shadow: inset 0 3px 5px rgba(0, 0, 0, .125); +} +.btn.disabled, +.btn[disabled], +fieldset[disabled] .btn { + pointer-events: none; + cursor: not-allowed; + filter: alpha(opacity=65); + -webkit-box-shadow: none; + box-shadow: none; + opacity: .65; +} +.btn-default { + color: #333; + background-color: #fff; + border-color: #ccc; +} +.btn-default:hover, +.btn-default:focus, +.btn-default.focus, +.btn-default:active, +.btn-default.active, +.open > .dropdown-toggle.btn-default { + color: #333; + background-color: #e6e6e6; + border-color: #adadad; +} +.btn-default:active, +.btn-default.active, +.open > .dropdown-toggle.btn-default { + background-image: none; +} +.btn-default.disabled, +.btn-default[disabled], +fieldset[disabled] .btn-default, +.btn-default.disabled:hover, +.btn-default[disabled]:hover, +fieldset[disabled] .btn-default:hover, +.btn-default.disabled:focus, +.btn-default[disabled]:focus, +fieldset[disabled] .btn-default:focus, +.btn-default.disabled.focus, +.btn-default[disabled].focus, +fieldset[disabled] .btn-default.focus, +.btn-default.disabled:active, +.btn-default[disabled]:active, +fieldset[disabled] .btn-default:active, +.btn-default.disabled.active, +.btn-default[disabled].active, +fieldset[disabled] .btn-default.active { + background-color: #fff; + border-color: #ccc; +} +.btn-default .badge { + color: #fff; + background-color: #333; +} +.btn-primary { + color: #fff; + background-color: #337ab7; + border-color: #2e6da4; +} +.btn-primary:hover, +.btn-primary:focus, +.btn-primary.focus, +.btn-primary:active, +.btn-primary.active, +.open > .dropdown-toggle.btn-primary { + color: #fff; + background-color: #286090; + border-color: #204d74; +} +.btn-primary:active, +.btn-primary.active, +.open > .dropdown-toggle.btn-primary { + background-image: none; +} +.btn-primary.disabled, +.btn-primary[disabled], +fieldset[disabled] .btn-primary, +.btn-primary.disabled:hover, +.btn-primary[disabled]:hover, +fieldset[disabled] .btn-primary:hover, +.btn-primary.disabled:focus, +.btn-primary[disabled]:focus, +fieldset[disabled] .btn-primary:focus, +.btn-primary.disabled.focus, +.btn-primary[disabled].focus, +fieldset[disabled] .btn-primary.focus, +.btn-primary.disabled:active, +.btn-primary[disabled]:active, +fieldset[disabled] .btn-primary:active, +.btn-primary.disabled.active, +.btn-primary[disabled].active, +fieldset[disabled] .btn-primary.active { + background-color: #337ab7; + border-color: #2e6da4; +} +.btn-primary .badge { + color: #337ab7; + background-color: #fff; +} +.btn-success { + color: #fff; + background-color: #5cb85c; + border-color: #4cae4c; +} +.btn-success:hover, +.btn-success:focus, +.btn-success.focus, +.btn-success:active, +.btn-success.active, +.open > .dropdown-toggle.btn-success { + color: #fff; + background-color: #449d44; + border-color: #398439; +} +.btn-success:active, +.btn-success.active, +.open > .dropdown-toggle.btn-success { + background-image: none; +} +.btn-success.disabled, +.btn-success[disabled], +fieldset[disabled] .btn-success, +.btn-success.disabled:hover, +.btn-success[disabled]:hover, +fieldset[disabled] .btn-success:hover, +.btn-success.disabled:focus, +.btn-success[disabled]:focus, +fieldset[disabled] .btn-success:focus, +.btn-success.disabled.focus, +.btn-success[disabled].focus, +fieldset[disabled] .btn-success.focus, +.btn-success.disabled:active, +.btn-success[disabled]:active, +fieldset[disabled] .btn-success:active, +.btn-success.disabled.active, +.btn-success[disabled].active, +fieldset[disabled] .btn-success.active { + background-color: #5cb85c; + border-color: #4cae4c; +} +.btn-success .badge { + color: #5cb85c; + background-color: #fff; +} +.btn-info { + color: #fff; + background-color: #5bc0de; + border-color: #46b8da; +} +.btn-info:hover, +.btn-info:focus, +.btn-info.focus, +.btn-info:active, +.btn-info.active, +.open > .dropdown-toggle.btn-info { + color: #fff; + background-color: #31b0d5; + border-color: #269abc; +} +.btn-info:active, +.btn-info.active, +.open > .dropdown-toggle.btn-info { + background-image: none; +} +.btn-info.disabled, +.btn-info[disabled], +fieldset[disabled] .btn-info, +.btn-info.disabled:hover, +.btn-info[disabled]:hover, +fieldset[disabled] .btn-info:hover, +.btn-info.disabled:focus, +.btn-info[disabled]:focus, +fieldset[disabled] .btn-info:focus, +.btn-info.disabled.focus, +.btn-info[disabled].focus, +fieldset[disabled] .btn-info.focus, +.btn-info.disabled:active, +.btn-info[disabled]:active, +fieldset[disabled] .btn-info:active, +.btn-info.disabled.active, +.btn-info[disabled].active, +fieldset[disabled] .btn-info.active { + background-color: #5bc0de; + border-color: #46b8da; +} +.btn-info .badge { + color: #5bc0de; + background-color: #fff; +} +.btn-warning { + color: #fff; + background-color: #f0ad4e; + border-color: #eea236; +} +.btn-warning:hover, +.btn-warning:focus, +.btn-warning.focus, +.btn-warning:active, +.btn-warning.active, +.open > .dropdown-toggle.btn-warning { + color: #fff; + background-color: #ec971f; + border-color: #d58512; +} +.btn-warning:active, +.btn-warning.active, +.open > .dropdown-toggle.btn-warning { + background-image: none; +} +.btn-warning.disabled, +.btn-warning[disabled], +fieldset[disabled] .btn-warning, +.btn-warning.disabled:hover, +.btn-warning[disabled]:hover, +fieldset[disabled] .btn-warning:hover, +.btn-warning.disabled:focus, +.btn-warning[disabled]:focus, +fieldset[disabled] .btn-warning:focus, +.btn-warning.disabled.focus, +.btn-warning[disabled].focus, +fieldset[disabled] .btn-warning.focus, +.btn-warning.disabled:active, +.btn-warning[disabled]:active, +fieldset[disabled] .btn-warning:active, +.btn-warning.disabled.active, +.btn-warning[disabled].active, +fieldset[disabled] .btn-warning.active { + background-color: #f0ad4e; + border-color: #eea236; +} +.btn-warning .badge { + color: #f0ad4e; + background-color: #fff; +} +.btn-danger { + color: #fff; + background-color: #d9534f; + border-color: #d43f3a; +} +.btn-danger:hover, +.btn-danger:focus, +.btn-danger.focus, +.btn-danger:active, +.btn-danger.active, +.open > .dropdown-toggle.btn-danger { + color: #fff; + background-color: #c9302c; + border-color: #ac2925; +} +.btn-danger:active, +.btn-danger.active, +.open > .dropdown-toggle.btn-danger { + background-image: none; +} +.btn-danger.disabled, +.btn-danger[disabled], +fieldset[disabled] .btn-danger, +.btn-danger.disabled:hover, +.btn-danger[disabled]:hover, +fieldset[disabled] .btn-danger:hover, +.btn-danger.disabled:focus, +.btn-danger[disabled]:focus, +fieldset[disabled] .btn-danger:focus, +.btn-danger.disabled.focus, +.btn-danger[disabled].focus, +fieldset[disabled] .btn-danger.focus, +.btn-danger.disabled:active, +.btn-danger[disabled]:active, +fieldset[disabled] .btn-danger:active, +.btn-danger.disabled.active, +.btn-danger[disabled].active, +fieldset[disabled] .btn-danger.active { + background-color: #d9534f; + border-color: #d43f3a; +} +.btn-danger .badge { + color: #d9534f; + background-color: #fff; +} +.btn-link { + font-weight: normal; + color: #337ab7; + border-radius: 0; +} +.btn-link, +.btn-link:active, +.btn-link.active, +.btn-link[disabled], +fieldset[disabled] .btn-link { + background-color: transparent; + -webkit-box-shadow: none; + box-shadow: none; +} +.btn-link, +.btn-link:hover, +.btn-link:focus, +.btn-link:active { + border-color: transparent; +} +.btn-link:hover, +.btn-link:focus { + color: #23527c; + text-decoration: underline; + background-color: transparent; +} +.btn-link[disabled]:hover, +fieldset[disabled] .btn-link:hover, +.btn-link[disabled]:focus, +fieldset[disabled] .btn-link:focus { + color: #777; + text-decoration: none; +} +.btn-lg, +.btn-group-lg > .btn { + padding: 10px 16px; + font-size: 18px; + line-height: 1.3333333; + border-radius: 6px; +} +.btn-sm, +.btn-group-sm > .btn { + padding: 5px 10px; + font-size: 12px; + line-height: 1.5; + border-radius: 3px; +} +.btn-xs, +.btn-group-xs > .btn { + padding: 1px 5px; + font-size: 12px; + line-height: 1.5; + border-radius: 3px; +} +.btn-block { + display: block; + width: 100%; +} +.btn-block + .btn-block { + margin-top: 5px; +} +input[type="submit"].btn-block, +input[type="reset"].btn-block, +input[type="button"].btn-block { + width: 100%; +} +.fade { + opacity: 0; + -webkit-transition: opacity .15s linear; + -o-transition: opacity .15s linear; + transition: opacity .15s linear; +} +.fade.in { + opacity: 1; +} +.collapse { + display: none; + visibility: hidden; +} +.collapse.in { + display: block; + visibility: visible; +} +tr.collapse.in { + display: table-row; +} +tbody.collapse.in { + display: table-row-group; +} +.collapsing { + position: relative; + height: 0; + overflow: hidden; + -webkit-transition-timing-function: ease; + -o-transition-timing-function: ease; + transition-timing-function: ease; + -webkit-transition-duration: .35s; + -o-transition-duration: .35s; + transition-duration: .35s; + -webkit-transition-property: height, visibility; + -o-transition-property: height, visibility; + transition-property: height, visibility; +} +.caret { + display: inline-block; + width: 0; + height: 0; + margin-left: 2px; + vertical-align: middle; + border-top: 4px solid; + border-right: 4px solid transparent; + border-left: 4px solid transparent; +} +.dropup, +.dropdown { + position: relative; +} +.dropdown-toggle:focus { + outline: 0; +} +.dropdown-menu { + position: absolute; + top: 100%; + left: 0; + z-index: 1000; + display: none; + float: left; + min-width: 160px; + padding: 5px 0; + margin: 2px 0 0; + font-size: 14px; + text-align: left; + list-style: none; + background-color: #fff; + -webkit-background-clip: padding-box; + background-clip: padding-box; + border: 1px solid #ccc; + border: 1px solid rgba(0, 0, 0, .15); + border-radius: 4px; + -webkit-box-shadow: 0 6px 12px rgba(0, 0, 0, .175); + box-shadow: 0 6px 12px rgba(0, 0, 0, .175); +} +.dropdown-menu.pull-right { + right: 0; + left: auto; +} +.dropdown-menu .divider { + height: 1px; + margin: 9px 0; + overflow: hidden; + background-color: #e5e5e5; +} +.dropdown-menu > li > a { + display: block; + padding: 3px 20px; + clear: both; + font-weight: normal; + line-height: 1.42857143; + color: #333; + white-space: nowrap; +} +.dropdown-menu > li > a:hover, +.dropdown-menu > li > a:focus { + color: #262626; + text-decoration: none; + background-color: #f5f5f5; +} +.dropdown-menu > .active > a, +.dropdown-menu > .active > a:hover, +.dropdown-menu > .active > a:focus { + color: #fff; + text-decoration: none; + background-color: #337ab7; + outline: 0; +} +.dropdown-menu > .disabled > a, +.dropdown-menu > .disabled > a:hover, +.dropdown-menu > .disabled > a:focus { + color: #777; +} +.dropdown-menu > .disabled > a:hover, +.dropdown-menu > .disabled > a:focus { + text-decoration: none; + cursor: not-allowed; + background-color: transparent; + background-image: none; + filter: progid:DXImageTransform.Microsoft.gradient(enabled = false); +} +.open > .dropdown-menu { + display: block; +} +.open > a { + outline: 0; +} +.dropdown-menu-right { + right: 0; + left: auto; +} +.dropdown-menu-left { + right: auto; + left: 0; +} +.dropdown-header { + display: block; + padding: 3px 20px; + font-size: 12px; + line-height: 1.42857143; + color: #777; + white-space: nowrap; +} +.dropdown-backdrop { + position: fixed; + top: 0; + right: 0; + bottom: 0; + left: 0; + z-index: 990; +} +.pull-right > .dropdown-menu { + right: 0; + left: auto; +} +.dropup .caret, +.navbar-fixed-bottom .dropdown .caret { + content: ""; + border-top: 0; + border-bottom: 4px solid; +} +.dropup .dropdown-menu, +.navbar-fixed-bottom .dropdown .dropdown-menu { + top: auto; + bottom: 100%; + margin-bottom: 2px; +} +@media (min-width: 768px) { + .navbar-right .dropdown-menu { + right: 0; + left: auto; + } + .navbar-right .dropdown-menu-left { + right: auto; + left: 0; + } +} +.btn-group, +.btn-group-vertical { + position: relative; + display: inline-block; + vertical-align: middle; +} +.btn-group > .btn, +.btn-group-vertical > .btn { + position: relative; + float: left; +} +.btn-group > .btn:hover, +.btn-group-vertical > .btn:hover, +.btn-group > .btn:focus, +.btn-group-vertical > .btn:focus, +.btn-group > .btn:active, +.btn-group-vertical > .btn:active, +.btn-group > .btn.active, +.btn-group-vertical > .btn.active { + z-index: 2; +} +.btn-group .btn + .btn, +.btn-group .btn + .btn-group, +.btn-group .btn-group + .btn, +.btn-group .btn-group + .btn-group { + margin-left: -1px; +} +.btn-toolbar { + margin-left: -5px; +} +.btn-toolbar .btn-group, +.btn-toolbar .input-group { + float: left; +} +.btn-toolbar > .btn, +.btn-toolbar > .btn-group, +.btn-toolbar > .input-group { + margin-left: 5px; +} +.btn-group > .btn:not(:first-child):not(:last-child):not(.dropdown-toggle) { + border-radius: 0; +} +.btn-group > .btn:first-child { + margin-left: 0; +} +.btn-group > .btn:first-child:not(:last-child):not(.dropdown-toggle) { + border-top-right-radius: 0; + border-bottom-right-radius: 0; +} +.btn-group > .btn:last-child:not(:first-child), +.btn-group > .dropdown-toggle:not(:first-child) { + border-top-left-radius: 0; + border-bottom-left-radius: 0; +} +.btn-group > .btn-group { + float: left; +} +.btn-group > .btn-group:not(:first-child):not(:last-child) > .btn { + border-radius: 0; +} +.btn-group > .btn-group:first-child:not(:last-child) > .btn:last-child, +.btn-group > .btn-group:first-child:not(:last-child) > .dropdown-toggle { + border-top-right-radius: 0; + border-bottom-right-radius: 0; +} +.btn-group > .btn-group:last-child:not(:first-child) > .btn:first-child { + border-top-left-radius: 0; + border-bottom-left-radius: 0; +} +.btn-group .dropdown-toggle:active, +.btn-group.open .dropdown-toggle { + outline: 0; +} +.btn-group > .btn + .dropdown-toggle { + padding-right: 8px; + padding-left: 8px; +} +.btn-group > .btn-lg + .dropdown-toggle { + padding-right: 12px; + padding-left: 12px; +} +.btn-group.open .dropdown-toggle { + -webkit-box-shadow: inset 0 3px 5px rgba(0, 0, 0, .125); + box-shadow: inset 0 3px 5px rgba(0, 0, 0, .125); +} +.btn-group.open .dropdown-toggle.btn-link { + -webkit-box-shadow: none; + box-shadow: none; +} +.btn .caret { + margin-left: 0; +} +.btn-lg .caret { + border-width: 5px 5px 0; + border-bottom-width: 0; +} +.dropup .btn-lg .caret { + border-width: 0 5px 5px; +} +.btn-group-vertical > .btn, +.btn-group-vertical > .btn-group, +.btn-group-vertical > .btn-group > .btn { + display: block; + float: none; + width: 100%; + max-width: 100%; +} +.btn-group-vertical > .btn-group > .btn { + float: none; +} +.btn-group-vertical > .btn + .btn, +.btn-group-vertical > .btn + .btn-group, +.btn-group-vertical > .btn-group + .btn, +.btn-group-vertical > .btn-group + .btn-group { + margin-top: -1px; + margin-left: 0; +} +.btn-group-vertical > .btn:not(:first-child):not(:last-child) { + border-radius: 0; +} +.btn-group-vertical > .btn:first-child:not(:last-child) { + border-top-right-radius: 4px; + border-bottom-right-radius: 0; + border-bottom-left-radius: 0; +} +.btn-group-vertical > .btn:last-child:not(:first-child) { + border-top-left-radius: 0; + border-top-right-radius: 0; + border-bottom-left-radius: 4px; +} +.btn-group-vertical > .btn-group:not(:first-child):not(:last-child) > .btn { + border-radius: 0; +} +.btn-group-vertical > .btn-group:first-child:not(:last-child) > .btn:last-child, +.btn-group-vertical > .btn-group:first-child:not(:last-child) > .dropdown-toggle { + border-bottom-right-radius: 0; + border-bottom-left-radius: 0; +} +.btn-group-vertical > .btn-group:last-child:not(:first-child) > .btn:first-child { + border-top-left-radius: 0; + border-top-right-radius: 0; +} +.btn-group-justified { + display: table; + width: 100%; + table-layout: fixed; + border-collapse: separate; +} +.btn-group-justified > .btn, +.btn-group-justified > .btn-group { + display: table-cell; + float: none; + width: 1%; +} +.btn-group-justified > .btn-group .btn { + width: 100%; +} +.btn-group-justified > .btn-group .dropdown-menu { + left: auto; +} +[data-toggle="buttons"] > .btn input[type="radio"], +[data-toggle="buttons"] > .btn-group > .btn input[type="radio"], +[data-toggle="buttons"] > .btn input[type="checkbox"], +[data-toggle="buttons"] > .btn-group > .btn input[type="checkbox"] { + position: absolute; + clip: rect(0, 0, 0, 0); + pointer-events: none; +} +.input-group { + position: relative; + display: table; + border-collapse: separate; +} +.input-group[class*="col-"] { + float: none; + padding-right: 0; + padding-left: 0; +} +.input-group .form-control { + position: relative; + z-index: 2; + float: left; + width: 100%; + margin-bottom: 0; +} +.input-group-lg > .form-control, +.input-group-lg > .input-group-addon, +.input-group-lg > .input-group-btn > .btn { + height: 46px; + padding: 10px 16px; + font-size: 18px; + line-height: 1.3333333; + border-radius: 6px; +} +select.input-group-lg > .form-control, +select.input-group-lg > .input-group-addon, +select.input-group-lg > .input-group-btn > .btn { + height: 46px; + line-height: 46px; +} +textarea.input-group-lg > .form-control, +textarea.input-group-lg > .input-group-addon, +textarea.input-group-lg > .input-group-btn > .btn, +select[multiple].input-group-lg > .form-control, +select[multiple].input-group-lg > .input-group-addon, +select[multiple].input-group-lg > .input-group-btn > .btn { + height: auto; +} +.input-group-sm > .form-control, +.input-group-sm > .input-group-addon, +.input-group-sm > .input-group-btn > .btn { + height: 30px; + padding: 5px 10px; + font-size: 12px; + line-height: 1.5; + border-radius: 3px; +} +select.input-group-sm > .form-control, +select.input-group-sm > .input-group-addon, +select.input-group-sm > .input-group-btn > .btn { + height: 30px; + line-height: 30px; +} +textarea.input-group-sm > .form-control, +textarea.input-group-sm > .input-group-addon, +textarea.input-group-sm > .input-group-btn > .btn, +select[multiple].input-group-sm > .form-control, +select[multiple].input-group-sm > .input-group-addon, +select[multiple].input-group-sm > .input-group-btn > .btn { + height: auto; +} +.input-group-addon, +.input-group-btn, +.input-group .form-control { + display: table-cell; +} +.input-group-addon:not(:first-child):not(:last-child), +.input-group-btn:not(:first-child):not(:last-child), +.input-group .form-control:not(:first-child):not(:last-child) { + border-radius: 0; +} +.input-group-addon, +.input-group-btn { + width: 1%; + white-space: nowrap; + vertical-align: middle; +} +.input-group-addon { + padding: 6px 12px; + font-size: 14px; + font-weight: normal; + line-height: 1; + color: #555; + text-align: center; + background-color: #eee; + border: 1px solid #ccc; + border-radius: 4px; +} +.input-group-addon.input-sm { + padding: 5px 10px; + font-size: 12px; + border-radius: 3px; +} +.input-group-addon.input-lg { + padding: 10px 16px; + font-size: 18px; + border-radius: 6px; +} +.input-group-addon input[type="radio"], +.input-group-addon input[type="checkbox"] { + margin-top: 0; +} +.input-group .form-control:first-child, +.input-group-addon:first-child, +.input-group-btn:first-child > .btn, +.input-group-btn:first-child > .btn-group > .btn, +.input-group-btn:first-child > .dropdown-toggle, +.input-group-btn:last-child > .btn:not(:last-child):not(.dropdown-toggle), +.input-group-btn:last-child > .btn-group:not(:last-child) > .btn { + border-top-right-radius: 0; + border-bottom-right-radius: 0; +} +.input-group-addon:first-child { + border-right: 0; +} +.input-group .form-control:last-child, +.input-group-addon:last-child, +.input-group-btn:last-child > .btn, +.input-group-btn:last-child > .btn-group > .btn, +.input-group-btn:last-child > .dropdown-toggle, +.input-group-btn:first-child > .btn:not(:first-child), +.input-group-btn:first-child > .btn-group:not(:first-child) > .btn { + border-top-left-radius: 0; + border-bottom-left-radius: 0; +} +.input-group-addon:last-child { + border-left: 0; +} +.input-group-btn { + position: relative; + font-size: 0; + white-space: nowrap; +} +.input-group-btn > .btn { + position: relative; +} +.input-group-btn > .btn + .btn { + margin-left: -1px; +} +.input-group-btn > .btn:hover, +.input-group-btn > .btn:focus, +.input-group-btn > .btn:active { + z-index: 2; +} +.input-group-btn:first-child > .btn, +.input-group-btn:first-child > .btn-group { + margin-right: -1px; +} +.input-group-btn:last-child > .btn, +.input-group-btn:last-child > .btn-group { + margin-left: -1px; +} +.nav { + padding-left: 0; + margin-bottom: 0; + list-style: none; +} +.nav > li { + position: relative; + display: block; +} +.nav > li > a { + position: relative; + display: block; + padding: 10px 15px; +} +.nav > li > a:hover, +.nav > li > a:focus { + text-decoration: none; + background-color: #eee; +} +.nav > li.disabled > a { + color: #777; +} +.nav > li.disabled > a:hover, +.nav > li.disabled > a:focus { + color: #777; + text-decoration: none; + cursor: not-allowed; + background-color: transparent; +} +.nav .open > a, +.nav .open > a:hover, +.nav .open > a:focus { + background-color: #eee; + border-color: #337ab7; +} +.nav .nav-divider { + height: 1px; + margin: 9px 0; + overflow: hidden; + background-color: #e5e5e5; +} +.nav > li > a > img { + max-width: none; +} +.nav-tabs { + border-bottom: 1px solid #ddd; +} +.nav-tabs > li { + float: left; + margin-bottom: -1px; +} +.nav-tabs > li > a { + margin-right: 2px; + line-height: 1.42857143; + border: 1px solid transparent; + border-radius: 4px 4px 0 0; +} +.nav-tabs > li > a:hover { + border-color: #eee #eee #ddd; +} +.nav-tabs > li.active > a, +.nav-tabs > li.active > a:hover, +.nav-tabs > li.active > a:focus { + color: #555; + cursor: default; + background-color: #fff; + border: 1px solid #ddd; + border-bottom-color: transparent; +} +.nav-tabs.nav-justified { + width: 100%; + border-bottom: 0; +} +.nav-tabs.nav-justified > li { + float: none; +} +.nav-tabs.nav-justified > li > a { + margin-bottom: 5px; + text-align: center; +} +.nav-tabs.nav-justified > .dropdown .dropdown-menu { + top: auto; + left: auto; +} +@media (min-width: 768px) { + .nav-tabs.nav-justified > li { + display: table-cell; + width: 1%; + } + .nav-tabs.nav-justified > li > a { + margin-bottom: 0; + } +} +.nav-tabs.nav-justified > li > a { + margin-right: 0; + border-radius: 4px; +} +.nav-tabs.nav-justified > .active > a, +.nav-tabs.nav-justified > .active > a:hover, +.nav-tabs.nav-justified > .active > a:focus { + border: 1px solid #ddd; +} +@media (min-width: 768px) { + .nav-tabs.nav-justified > li > a { + border-bottom: 1px solid #ddd; + border-radius: 4px 4px 0 0; + } + .nav-tabs.nav-justified > .active > a, + .nav-tabs.nav-justified > .active > a:hover, + .nav-tabs.nav-justified > .active > a:focus { + border-bottom-color: #fff; + } +} +.nav-pills > li { + float: left; +} +.nav-pills > li > a { + border-radius: 4px; +} +.nav-pills > li + li { + margin-left: 2px; +} +.nav-pills > li.active > a, +.nav-pills > li.active > a:hover, +.nav-pills > li.active > a:focus { + color: #fff; + background-color: #337ab7; +} +.nav-stacked > li { + float: none; +} +.nav-stacked > li + li { + margin-top: 2px; + margin-left: 0; +} +.nav-justified { + width: 100%; +} +.nav-justified > li { + float: none; +} +.nav-justified > li > a { + margin-bottom: 5px; + text-align: center; +} +.nav-justified > .dropdown .dropdown-menu { + top: auto; + left: auto; +} +@media (min-width: 768px) { + .nav-justified > li { + display: table-cell; + width: 1%; + } + .nav-justified > li > a { + margin-bottom: 0; + } +} +.nav-tabs-justified { + border-bottom: 0; +} +.nav-tabs-justified > li > a { + margin-right: 0; + border-radius: 4px; +} +.nav-tabs-justified > .active > a, +.nav-tabs-justified > .active > a:hover, +.nav-tabs-justified > .active > a:focus { + border: 1px solid #ddd; +} +@media (min-width: 768px) { + .nav-tabs-justified > li > a { + border-bottom: 1px solid #ddd; + border-radius: 4px 4px 0 0; + } + .nav-tabs-justified > .active > a, + .nav-tabs-justified > .active > a:hover, + .nav-tabs-justified > .active > a:focus { + border-bottom-color: #fff; + } +} +.tab-content > .tab-pane { + display: none; + visibility: hidden; +} +.tab-content > .active { + display: block; + visibility: visible; +} +.nav-tabs .dropdown-menu { + margin-top: -1px; + border-top-left-radius: 0; + border-top-right-radius: 0; +} +.navbar { + position: relative; + min-height: 50px; + margin-bottom: 20px; + border: 1px solid transparent; +} +@media (min-width: 768px) { + .navbar { + border-radius: 4px; + } +} +@media (min-width: 768px) { + .navbar-header { + float: left; + } +} +.navbar-collapse { + padding-right: 15px; + padding-left: 15px; + overflow-x: visible; + -webkit-overflow-scrolling: touch; + border-top: 1px solid transparent; + -webkit-box-shadow: inset 0 1px 0 rgba(255, 255, 255, .1); + box-shadow: inset 0 1px 0 rgba(255, 255, 255, .1); +} +.navbar-collapse.in { + overflow-y: auto; +} +@media (min-width: 768px) { + .navbar-collapse { + width: auto; + border-top: 0; + -webkit-box-shadow: none; + box-shadow: none; + } + .navbar-collapse.collapse { + display: block !important; + height: auto !important; + padding-bottom: 0; + overflow: visible !important; + visibility: visible !important; + } + .navbar-collapse.in { + overflow-y: visible; + } + .navbar-fixed-top .navbar-collapse, + .navbar-static-top .navbar-collapse, + .navbar-fixed-bottom .navbar-collapse { + padding-right: 0; + padding-left: 0; + } +} +.navbar-fixed-top .navbar-collapse, +.navbar-fixed-bottom .navbar-collapse { + max-height: 340px; +} +@media (max-device-width: 480px) and (orientation: landscape) { + .navbar-fixed-top .navbar-collapse, + .navbar-fixed-bottom .navbar-collapse { + max-height: 200px; + } +} +.container > .navbar-header, +.container-fluid > .navbar-header, +.container > .navbar-collapse, +.container-fluid > .navbar-collapse { + margin-right: -15px; + margin-left: -15px; +} +@media (min-width: 768px) { + .container > .navbar-header, + .container-fluid > .navbar-header, + .container > .navbar-collapse, + .container-fluid > .navbar-collapse { + margin-right: 0; + margin-left: 0; + } +} +.navbar-static-top { + z-index: 1000; + border-width: 0 0 1px; +} +@media (min-width: 768px) { + .navbar-static-top { + border-radius: 0; + } +} +.navbar-fixed-top, +.navbar-fixed-bottom { + position: fixed; + right: 0; + left: 0; + z-index: 1030; +} +@media (min-width: 768px) { + .navbar-fixed-top, + .navbar-fixed-bottom { + border-radius: 0; + } +} +.navbar-fixed-top { + top: 0; + border-width: 0 0 1px; +} +.navbar-fixed-bottom { + bottom: 0; + margin-bottom: 0; + border-width: 1px 0 0; +} +.navbar-brand { + float: left; + height: 50px; + padding: 15px 15px; + font-size: 18px; + line-height: 20px; +} +.navbar-brand:hover, +.navbar-brand:focus { + text-decoration: none; +} +.navbar-brand > img { + display: block; +} +@media (min-width: 768px) { + .navbar > .container .navbar-brand, + .navbar > .container-fluid .navbar-brand { + margin-left: -15px; + } +} +.navbar-toggle { + position: relative; + float: right; + padding: 9px 10px; + margin-top: 8px; + margin-right: 15px; + margin-bottom: 8px; + background-color: transparent; + background-image: none; + border: 1px solid transparent; + border-radius: 4px; +} +.navbar-toggle:focus { + outline: 0; +} +.navbar-toggle .icon-bar { + display: block; + width: 22px; + height: 2px; + border-radius: 1px; +} +.navbar-toggle .icon-bar + .icon-bar { + margin-top: 4px; +} +@media (min-width: 768px) { + .navbar-toggle { + display: none; + } +} +.navbar-nav { + margin: 7.5px -15px; +} +.navbar-nav > li > a { + padding-top: 10px; + padding-bottom: 10px; + line-height: 20px; +} +@media (max-width: 767px) { + .navbar-nav .open .dropdown-menu { + position: static; + float: none; + width: auto; + margin-top: 0; + background-color: transparent; + border: 0; + -webkit-box-shadow: none; + box-shadow: none; + } + .navbar-nav .open .dropdown-menu > li > a, + .navbar-nav .open .dropdown-menu .dropdown-header { + padding: 5px 15px 5px 25px; + } + .navbar-nav .open .dropdown-menu > li > a { + line-height: 20px; + } + .navbar-nav .open .dropdown-menu > li > a:hover, + .navbar-nav .open .dropdown-menu > li > a:focus { + background-image: none; + } +} +@media (min-width: 768px) { + .navbar-nav { + float: left; + margin: 0; + } + .navbar-nav > li { + float: left; + } + .navbar-nav > li > a { + padding-top: 15px; + padding-bottom: 15px; + } +} +.navbar-form { + padding: 10px 15px; + margin-top: 8px; + margin-right: -15px; + margin-bottom: 8px; + margin-left: -15px; + border-top: 1px solid transparent; + border-bottom: 1px solid transparent; + -webkit-box-shadow: inset 0 1px 0 rgba(255, 255, 255, .1), 0 1px 0 rgba(255, 255, 255, .1); + box-shadow: inset 0 1px 0 rgba(255, 255, 255, .1), 0 1px 0 rgba(255, 255, 255, .1); +} +@media (min-width: 768px) { + .navbar-form .form-group { + display: inline-block; + margin-bottom: 0; + vertical-align: middle; + } + .navbar-form .form-control { + display: inline-block; + width: auto; + vertical-align: middle; + } + .navbar-form .form-control-static { + display: inline-block; + } + .navbar-form .input-group { + display: inline-table; + vertical-align: middle; + } + .navbar-form .input-group .input-group-addon, + .navbar-form .input-group .input-group-btn, + .navbar-form .input-group .form-control { + width: auto; + } + .navbar-form .input-group > .form-control { + width: 100%; + } + .navbar-form .control-label { + margin-bottom: 0; + vertical-align: middle; + } + .navbar-form .radio, + .navbar-form .checkbox { + display: inline-block; + margin-top: 0; + margin-bottom: 0; + vertical-align: middle; + } + .navbar-form .radio label, + .navbar-form .checkbox label { + padding-left: 0; + } + .navbar-form .radio input[type="radio"], + .navbar-form .checkbox input[type="checkbox"] { + position: relative; + margin-left: 0; + } + .navbar-form .has-feedback .form-control-feedback { + top: 0; + } +} +@media (max-width: 767px) { + .navbar-form .form-group { + margin-bottom: 5px; + } + .navbar-form .form-group:last-child { + margin-bottom: 0; + } +} +@media (min-width: 768px) { + .navbar-form { + width: auto; + padding-top: 0; + padding-bottom: 0; + margin-right: 0; + margin-left: 0; + border: 0; + -webkit-box-shadow: none; + box-shadow: none; + } +} +.navbar-nav > li > .dropdown-menu { + margin-top: 0; + border-top-left-radius: 0; + border-top-right-radius: 0; +} +.navbar-fixed-bottom .navbar-nav > li > .dropdown-menu { + margin-bottom: 0; + border-top-left-radius: 4px; + border-top-right-radius: 4px; + border-bottom-right-radius: 0; + border-bottom-left-radius: 0; +} +.navbar-btn { + margin-top: 8px; + margin-bottom: 8px; +} +.navbar-btn.btn-sm { + margin-top: 10px; + margin-bottom: 10px; +} +.navbar-btn.btn-xs { + margin-top: 14px; + margin-bottom: 14px; +} +.navbar-text { + margin-top: 15px; + margin-bottom: 15px; +} +@media (min-width: 768px) { + .navbar-text { + float: left; + margin-right: 15px; + margin-left: 15px; + } +} +@media (min-width: 768px) { + .navbar-left { + float: left !important; + } + .navbar-right { + float: right !important; + margin-right: -15px; + } + .navbar-right ~ .navbar-right { + margin-right: 0; + } +} +.navbar-default { + background-color: #f8f8f8; + border-color: #e7e7e7; +} +.navbar-default .navbar-brand { + color: #777; +} +.navbar-default .navbar-brand:hover, +.navbar-default .navbar-brand:focus { + color: #5e5e5e; + background-color: transparent; +} +.navbar-default .navbar-text { + color: #777; +} +.navbar-default .navbar-nav > li > a { + color: #777; +} +.navbar-default .navbar-nav > li > a:hover, +.navbar-default .navbar-nav > li > a:focus { + color: #333; + background-color: transparent; +} +.navbar-default .navbar-nav > .active > a, +.navbar-default .navbar-nav > .active > a:hover, +.navbar-default .navbar-nav > .active > a:focus { + color: #555; + background-color: #e7e7e7; +} +.navbar-default .navbar-nav > .disabled > a, +.navbar-default .navbar-nav > .disabled > a:hover, +.navbar-default .navbar-nav > .disabled > a:focus { + color: #ccc; + background-color: transparent; +} +.navbar-default .navbar-toggle { + border-color: #ddd; +} +.navbar-default .navbar-toggle:hover, +.navbar-default .navbar-toggle:focus { + background-color: #ddd; +} +.navbar-default .navbar-toggle .icon-bar { + background-color: #888; +} +.navbar-default .navbar-collapse, +.navbar-default .navbar-form { + border-color: #e7e7e7; +} +.navbar-default .navbar-nav > .open > a, +.navbar-default .navbar-nav > .open > a:hover, +.navbar-default .navbar-nav > .open > a:focus { + color: #555; + background-color: #e7e7e7; +} +@media (max-width: 767px) { + .navbar-default .navbar-nav .open .dropdown-menu > li > a { + color: #777; + } + .navbar-default .navbar-nav .open .dropdown-menu > li > a:hover, + .navbar-default .navbar-nav .open .dropdown-menu > li > a:focus { + color: #333; + background-color: transparent; + } + .navbar-default .navbar-nav .open .dropdown-menu > .active > a, + .navbar-default .navbar-nav .open .dropdown-menu > .active > a:hover, + .navbar-default .navbar-nav .open .dropdown-menu > .active > a:focus { + color: #555; + background-color: #e7e7e7; + } + .navbar-default .navbar-nav .open .dropdown-menu > .disabled > a, + .navbar-default .navbar-nav .open .dropdown-menu > .disabled > a:hover, + .navbar-default .navbar-nav .open .dropdown-menu > .disabled > a:focus { + color: #ccc; + background-color: transparent; + } +} +.navbar-default .navbar-link { + color: #777; +} +.navbar-default .navbar-link:hover { + color: #333; +} +.navbar-default .btn-link { + color: #777; +} +.navbar-default .btn-link:hover, +.navbar-default .btn-link:focus { + color: #333; +} +.navbar-default .btn-link[disabled]:hover, +fieldset[disabled] .navbar-default .btn-link:hover, +.navbar-default .btn-link[disabled]:focus, +fieldset[disabled] .navbar-default .btn-link:focus { + color: #ccc; +} +.navbar-inverse { + background-color: #222; + border-color: #080808; +} +.navbar-inverse .navbar-brand { + color: #9d9d9d; +} +.navbar-inverse .navbar-brand:hover, +.navbar-inverse .navbar-brand:focus { + color: #fff; + background-color: transparent; +} +.navbar-inverse .navbar-text { + color: #9d9d9d; +} +.navbar-inverse .navbar-nav > li > a { + color: #9d9d9d; +} +.navbar-inverse .navbar-nav > li > a:hover, +.navbar-inverse .navbar-nav > li > a:focus { + color: #fff; + background-color: transparent; +} +.navbar-inverse .navbar-nav > .active > a, +.navbar-inverse .navbar-nav > .active > a:hover, +.navbar-inverse .navbar-nav > .active > a:focus { + color: #fff; + background-color: #080808; +} +.navbar-inverse .navbar-nav > .disabled > a, +.navbar-inverse .navbar-nav > .disabled > a:hover, +.navbar-inverse .navbar-nav > .disabled > a:focus { + color: #444; + background-color: transparent; +} +.navbar-inverse .navbar-toggle { + border-color: #333; +} +.navbar-inverse .navbar-toggle:hover, +.navbar-inverse .navbar-toggle:focus { + background-color: #333; +} +.navbar-inverse .navbar-toggle .icon-bar { + background-color: #fff; +} +.navbar-inverse .navbar-collapse, +.navbar-inverse .navbar-form { + border-color: #101010; +} +.navbar-inverse .navbar-nav > .open > a, +.navbar-inverse .navbar-nav > .open > a:hover, +.navbar-inverse .navbar-nav > .open > a:focus { + color: #fff; + background-color: #080808; +} +@media (max-width: 767px) { + .navbar-inverse .navbar-nav .open .dropdown-menu > .dropdown-header { + border-color: #080808; + } + .navbar-inverse .navbar-nav .open .dropdown-menu .divider { + background-color: #080808; + } + .navbar-inverse .navbar-nav .open .dropdown-menu > li > a { + color: #9d9d9d; + } + .navbar-inverse .navbar-nav .open .dropdown-menu > li > a:hover, + .navbar-inverse .navbar-nav .open .dropdown-menu > li > a:focus { + color: #fff; + background-color: transparent; + } + .navbar-inverse .navbar-nav .open .dropdown-menu > .active > a, + .navbar-inverse .navbar-nav .open .dropdown-menu > .active > a:hover, + .navbar-inverse .navbar-nav .open .dropdown-menu > .active > a:focus { + color: #fff; + background-color: #080808; + } + .navbar-inverse .navbar-nav .open .dropdown-menu > .disabled > a, + .navbar-inverse .navbar-nav .open .dropdown-menu > .disabled > a:hover, + .navbar-inverse .navbar-nav .open .dropdown-menu > .disabled > a:focus { + color: #444; + background-color: transparent; + } +} +.navbar-inverse .navbar-link { + color: #9d9d9d; +} +.navbar-inverse .navbar-link:hover { + color: #fff; +} +.navbar-inverse .btn-link { + color: #9d9d9d; +} +.navbar-inverse .btn-link:hover, +.navbar-inverse .btn-link:focus { + color: #fff; +} +.navbar-inverse .btn-link[disabled]:hover, +fieldset[disabled] .navbar-inverse .btn-link:hover, +.navbar-inverse .btn-link[disabled]:focus, +fieldset[disabled] .navbar-inverse .btn-link:focus { + color: #444; +} +.breadcrumb { + padding: 8px 15px; + margin-bottom: 20px; + list-style: none; + background-color: #f5f5f5; + border-radius: 4px; +} +.breadcrumb > li { + display: inline-block; +} +.breadcrumb > li + li:before { + padding: 0 5px; + color: #ccc; + content: "/\00a0"; +} +.breadcrumb > .active { + color: #777; +} +.pagination { + display: inline-block; + padding-left: 0; + margin: 20px 0; + border-radius: 4px; +} +.pagination > li { + display: inline; +} +.pagination > li > a, +.pagination > li > span { + position: relative; + float: left; + padding: 6px 12px; + margin-left: -1px; + line-height: 1.42857143; + color: #337ab7; + text-decoration: none; + background-color: #fff; + border: 1px solid #ddd; +} +.pagination > li:first-child > a, +.pagination > li:first-child > span { + margin-left: 0; + border-top-left-radius: 4px; + border-bottom-left-radius: 4px; +} +.pagination > li:last-child > a, +.pagination > li:last-child > span { + border-top-right-radius: 4px; + border-bottom-right-radius: 4px; +} +.pagination > li > a:hover, +.pagination > li > span:hover, +.pagination > li > a:focus, +.pagination > li > span:focus { + color: #23527c; + background-color: #eee; + border-color: #ddd; +} +.pagination > .active > a, +.pagination > .active > span, +.pagination > .active > a:hover, +.pagination > .active > span:hover, +.pagination > .active > a:focus, +.pagination > .active > span:focus { + z-index: 2; + color: #fff; + cursor: default; + background-color: #337ab7; + border-color: #337ab7; +} +.pagination > .disabled > span, +.pagination > .disabled > span:hover, +.pagination > .disabled > span:focus, +.pagination > .disabled > a, +.pagination > .disabled > a:hover, +.pagination > .disabled > a:focus { + color: #777; + cursor: not-allowed; + background-color: #fff; + border-color: #ddd; +} +.pagination-lg > li > a, +.pagination-lg > li > span { + padding: 10px 16px; + font-size: 18px; +} +.pagination-lg > li:first-child > a, +.pagination-lg > li:first-child > span { + border-top-left-radius: 6px; + border-bottom-left-radius: 6px; +} +.pagination-lg > li:last-child > a, +.pagination-lg > li:last-child > span { + border-top-right-radius: 6px; + border-bottom-right-radius: 6px; +} +.pagination-sm > li > a, +.pagination-sm > li > span { + padding: 5px 10px; + font-size: 12px; +} +.pagination-sm > li:first-child > a, +.pagination-sm > li:first-child > span { + border-top-left-radius: 3px; + border-bottom-left-radius: 3px; +} +.pagination-sm > li:last-child > a, +.pagination-sm > li:last-child > span { + border-top-right-radius: 3px; + border-bottom-right-radius: 3px; +} +.pager { + padding-left: 0; + margin: 20px 0; + text-align: center; + list-style: none; +} +.pager li { + display: inline; +} +.pager li > a, +.pager li > span { + display: inline-block; + padding: 5px 14px; + background-color: #fff; + border: 1px solid #ddd; + border-radius: 15px; +} +.pager li > a:hover, +.pager li > a:focus { + text-decoration: none; + background-color: #eee; +} +.pager .next > a, +.pager .next > span { + float: right; +} +.pager .previous > a, +.pager .previous > span { + float: left; +} +.pager .disabled > a, +.pager .disabled > a:hover, +.pager .disabled > a:focus, +.pager .disabled > span { + color: #777; + cursor: not-allowed; + background-color: #fff; +} +.label { + display: inline; + padding: .2em .6em .3em; + font-size: 75%; + font-weight: bold; + line-height: 1; + color: #fff; + text-align: center; + white-space: nowrap; + vertical-align: baseline; + border-radius: .25em; +} +a.label:hover, +a.label:focus { + color: #fff; + text-decoration: none; + cursor: pointer; +} +.label:empty { + display: none; +} +.btn .label { + position: relative; + top: -1px; +} +.label-default { + background-color: #777; +} +.label-default[href]:hover, +.label-default[href]:focus { + background-color: #5e5e5e; +} +.label-primary { + background-color: #337ab7; +} +.label-primary[href]:hover, +.label-primary[href]:focus { + background-color: #286090; +} +.label-success { + background-color: #5cb85c; +} +.label-success[href]:hover, +.label-success[href]:focus { + background-color: #449d44; +} +.label-info { + background-color: #5bc0de; +} +.label-info[href]:hover, +.label-info[href]:focus { + background-color: #31b0d5; +} +.label-warning { + background-color: #f0ad4e; +} +.label-warning[href]:hover, +.label-warning[href]:focus { + background-color: #ec971f; +} +.label-danger { + background-color: #d9534f; +} +.label-danger[href]:hover, +.label-danger[href]:focus { + background-color: #c9302c; +} +.badge { + display: inline-block; + min-width: 10px; + padding: 3px 7px; + font-size: 12px; + font-weight: bold; + line-height: 1; + color: #fff; + text-align: center; + white-space: nowrap; + vertical-align: baseline; + background-color: #777; + border-radius: 10px; +} +.badge:empty { + display: none; +} +.btn .badge { + position: relative; + top: -1px; +} +.btn-xs .badge { + top: 0; + padding: 1px 5px; +} +a.badge:hover, +a.badge:focus { + color: #fff; + text-decoration: none; + cursor: pointer; +} +.list-group-item.active > .badge, +.nav-pills > .active > a > .badge { + color: #337ab7; + background-color: #fff; +} +.list-group-item > .badge { + float: right; +} +.list-group-item > .badge + .badge { + margin-right: 5px; +} +.nav-pills > li > a > .badge { + margin-left: 3px; +} +.jumbotron { + padding: 30px 15px; + margin-bottom: 30px; + color: inherit; + background-color: #eee; +} +.jumbotron h1, +.jumbotron .h1 { + color: inherit; +} +.jumbotron p { + margin-bottom: 15px; + font-size: 21px; + font-weight: 200; +} +.jumbotron > hr { + border-top-color: #d5d5d5; +} +.container .jumbotron, +.container-fluid .jumbotron { + border-radius: 6px; +} +.jumbotron .container { + max-width: 100%; +} +@media screen and (min-width: 768px) { + .jumbotron { + padding: 48px 0; + } + .container .jumbotron, + .container-fluid .jumbotron { + padding-right: 60px; + padding-left: 60px; + } + .jumbotron h1, + .jumbotron .h1 { + font-size: 63px; + } +} +.thumbnail { + display: block; + padding: 4px; + margin-bottom: 20px; + line-height: 1.42857143; + background-color: #fff; + border: 1px solid #ddd; + border-radius: 4px; + -webkit-transition: border .2s ease-in-out; + -o-transition: border .2s ease-in-out; + transition: border .2s ease-in-out; +} +.thumbnail > img, +.thumbnail a > img { + margin-right: auto; + margin-left: auto; +} +a.thumbnail:hover, +a.thumbnail:focus, +a.thumbnail.active { + border-color: #337ab7; +} +.thumbnail .caption { + padding: 9px; + color: #333; +} +.alert { + padding: 15px; + margin-bottom: 20px; + border: 1px solid transparent; + border-radius: 4px; +} +.alert h4 { + margin-top: 0; + color: inherit; +} +.alert .alert-link { + font-weight: bold; +} +.alert > p, +.alert > ul { + margin-bottom: 0; +} +.alert > p + p { + margin-top: 5px; +} +.alert-dismissable, +.alert-dismissible { + padding-right: 35px; +} +.alert-dismissable .close, +.alert-dismissible .close { + position: relative; + top: -2px; + right: -21px; + color: inherit; +} +.alert-success { + color: #3c763d; + background-color: #dff0d8; + border-color: #d6e9c6; +} +.alert-success hr { + border-top-color: #c9e2b3; +} +.alert-success .alert-link { + color: #2b542c; +} +.alert-info { + color: #31708f; + background-color: #d9edf7; + border-color: #bce8f1; +} +.alert-info hr { + border-top-color: #a6e1ec; +} +.alert-info .alert-link { + color: #245269; +} +.alert-warning { + color: #8a6d3b; + background-color: #fcf8e3; + border-color: #faebcc; +} +.alert-warning hr { + border-top-color: #f7e1b5; +} +.alert-warning .alert-link { + color: #66512c; +} +.alert-danger { + color: #a94442; + background-color: #f2dede; + border-color: #ebccd1; +} +.alert-danger hr { + border-top-color: #e4b9c0; +} +.alert-danger .alert-link { + color: #843534; +} +@-webkit-keyframes progress-bar-stripes { + from { + background-position: 40px 0; + } + to { + background-position: 0 0; + } +} +@-o-keyframes progress-bar-stripes { + from { + background-position: 40px 0; + } + to { + background-position: 0 0; + } +} +@keyframes progress-bar-stripes { + from { + background-position: 40px 0; + } + to { + background-position: 0 0; + } +} +.progress { + height: 20px; + margin-bottom: 20px; + overflow: hidden; + background-color: #f5f5f5; + border-radius: 4px; + -webkit-box-shadow: inset 0 1px 2px rgba(0, 0, 0, .1); + box-shadow: inset 0 1px 2px rgba(0, 0, 0, .1); +} +.progress-bar { + float: left; + width: 0; + height: 100%; + font-size: 12px; + line-height: 20px; + color: #fff; + text-align: center; + background-color: #337ab7; + -webkit-box-shadow: inset 0 -1px 0 rgba(0, 0, 0, .15); + box-shadow: inset 0 -1px 0 rgba(0, 0, 0, .15); + -webkit-transition: width .6s ease; + -o-transition: width .6s ease; + transition: width .6s ease; +} +.progress-striped .progress-bar, +.progress-bar-striped { + background-image: -webkit-linear-gradient(45deg, rgba(255, 255, 255, .15) 25%, transparent 25%, transparent 50%, rgba(255, 255, 255, .15) 50%, rgba(255, 255, 255, .15) 75%, transparent 75%, transparent); + background-image: -o-linear-gradient(45deg, rgba(255, 255, 255, .15) 25%, transparent 25%, transparent 50%, rgba(255, 255, 255, .15) 50%, rgba(255, 255, 255, .15) 75%, transparent 75%, transparent); + background-image: linear-gradient(45deg, rgba(255, 255, 255, .15) 25%, transparent 25%, transparent 50%, rgba(255, 255, 255, .15) 50%, rgba(255, 255, 255, .15) 75%, transparent 75%, transparent); + -webkit-background-size: 40px 40px; + background-size: 40px 40px; +} +.progress.active .progress-bar, +.progress-bar.active { + -webkit-animation: progress-bar-stripes 2s linear infinite; + -o-animation: progress-bar-stripes 2s linear infinite; + animation: progress-bar-stripes 2s linear infinite; +} +.progress-bar-success { + background-color: #5cb85c; +} +.progress-striped .progress-bar-success { + background-image: -webkit-linear-gradient(45deg, rgba(255, 255, 255, .15) 25%, transparent 25%, transparent 50%, rgba(255, 255, 255, .15) 50%, rgba(255, 255, 255, .15) 75%, transparent 75%, transparent); + background-image: -o-linear-gradient(45deg, rgba(255, 255, 255, .15) 25%, transparent 25%, transparent 50%, rgba(255, 255, 255, .15) 50%, rgba(255, 255, 255, .15) 75%, transparent 75%, transparent); + background-image: linear-gradient(45deg, rgba(255, 255, 255, .15) 25%, transparent 25%, transparent 50%, rgba(255, 255, 255, .15) 50%, rgba(255, 255, 255, .15) 75%, transparent 75%, transparent); +} +.progress-bar-info { + background-color: #5bc0de; +} +.progress-striped .progress-bar-info { + background-image: -webkit-linear-gradient(45deg, rgba(255, 255, 255, .15) 25%, transparent 25%, transparent 50%, rgba(255, 255, 255, .15) 50%, rgba(255, 255, 255, .15) 75%, transparent 75%, transparent); + background-image: -o-linear-gradient(45deg, rgba(255, 255, 255, .15) 25%, transparent 25%, transparent 50%, rgba(255, 255, 255, .15) 50%, rgba(255, 255, 255, .15) 75%, transparent 75%, transparent); + background-image: linear-gradient(45deg, rgba(255, 255, 255, .15) 25%, transparent 25%, transparent 50%, rgba(255, 255, 255, .15) 50%, rgba(255, 255, 255, .15) 75%, transparent 75%, transparent); +} +.progress-bar-warning { + background-color: #f0ad4e; +} +.progress-striped .progress-bar-warning { + background-image: -webkit-linear-gradient(45deg, rgba(255, 255, 255, .15) 25%, transparent 25%, transparent 50%, rgba(255, 255, 255, .15) 50%, rgba(255, 255, 255, .15) 75%, transparent 75%, transparent); + background-image: -o-linear-gradient(45deg, rgba(255, 255, 255, .15) 25%, transparent 25%, transparent 50%, rgba(255, 255, 255, .15) 50%, rgba(255, 255, 255, .15) 75%, transparent 75%, transparent); + background-image: linear-gradient(45deg, rgba(255, 255, 255, .15) 25%, transparent 25%, transparent 50%, rgba(255, 255, 255, .15) 50%, rgba(255, 255, 255, .15) 75%, transparent 75%, transparent); +} +.progress-bar-danger { + background-color: #d9534f; +} +.progress-striped .progress-bar-danger { + background-image: -webkit-linear-gradient(45deg, rgba(255, 255, 255, .15) 25%, transparent 25%, transparent 50%, rgba(255, 255, 255, .15) 50%, rgba(255, 255, 255, .15) 75%, transparent 75%, transparent); + background-image: -o-linear-gradient(45deg, rgba(255, 255, 255, .15) 25%, transparent 25%, transparent 50%, rgba(255, 255, 255, .15) 50%, rgba(255, 255, 255, .15) 75%, transparent 75%, transparent); + background-image: linear-gradient(45deg, rgba(255, 255, 255, .15) 25%, transparent 25%, transparent 50%, rgba(255, 255, 255, .15) 50%, rgba(255, 255, 255, .15) 75%, transparent 75%, transparent); +} +.media { + margin-top: 15px; +} +.media:first-child { + margin-top: 0; +} +.media, +.media-body { + overflow: hidden; + zoom: 1; +} +.media-body { + width: 10000px; +} +.media-object { + display: block; +} +.media-right, +.media > .pull-right { + padding-left: 10px; +} +.media-left, +.media > .pull-left { + padding-right: 10px; +} +.media-left, +.media-right, +.media-body { + display: table-cell; + vertical-align: top; +} +.media-middle { + vertical-align: middle; +} +.media-bottom { + vertical-align: bottom; +} +.media-heading { + margin-top: 0; + margin-bottom: 5px; +} +.media-list { + padding-left: 0; + list-style: none; +} +.list-group { + padding-left: 0; + margin-bottom: 20px; +} +.list-group-item { + position: relative; + display: block; + padding: 10px 15px; + margin-bottom: -1px; + background-color: #fff; + border: 1px solid #ddd; +} +.list-group-item:first-child { + border-top-left-radius: 4px; + border-top-right-radius: 4px; +} +.list-group-item:last-child { + margin-bottom: 0; + border-bottom-right-radius: 4px; + border-bottom-left-radius: 4px; +} +a.list-group-item { + color: #555; +} +a.list-group-item .list-group-item-heading { + color: #333; +} +a.list-group-item:hover, +a.list-group-item:focus { + color: #555; + text-decoration: none; + background-color: #f5f5f5; +} +.list-group-item.disabled, +.list-group-item.disabled:hover, +.list-group-item.disabled:focus { + color: #777; + cursor: not-allowed; + background-color: #eee; +} +.list-group-item.disabled .list-group-item-heading, +.list-group-item.disabled:hover .list-group-item-heading, +.list-group-item.disabled:focus .list-group-item-heading { + color: inherit; +} +.list-group-item.disabled .list-group-item-text, +.list-group-item.disabled:hover .list-group-item-text, +.list-group-item.disabled:focus .list-group-item-text { + color: #777; +} +.list-group-item.active, +.list-group-item.active:hover, +.list-group-item.active:focus { + z-index: 2; + color: #fff; + background-color: #337ab7; + border-color: #337ab7; +} +.list-group-item.active .list-group-item-heading, +.list-group-item.active:hover .list-group-item-heading, +.list-group-item.active:focus .list-group-item-heading, +.list-group-item.active .list-group-item-heading > small, +.list-group-item.active:hover .list-group-item-heading > small, +.list-group-item.active:focus .list-group-item-heading > small, +.list-group-item.active .list-group-item-heading > .small, +.list-group-item.active:hover .list-group-item-heading > .small, +.list-group-item.active:focus .list-group-item-heading > .small { + color: inherit; +} +.list-group-item.active .list-group-item-text, +.list-group-item.active:hover .list-group-item-text, +.list-group-item.active:focus .list-group-item-text { + color: #c7ddef; +} +.list-group-item-success { + color: #3c763d; + background-color: #dff0d8; +} +a.list-group-item-success { + color: #3c763d; +} +a.list-group-item-success .list-group-item-heading { + color: inherit; +} +a.list-group-item-success:hover, +a.list-group-item-success:focus { + color: #3c763d; + background-color: #d0e9c6; +} +a.list-group-item-success.active, +a.list-group-item-success.active:hover, +a.list-group-item-success.active:focus { + color: #fff; + background-color: #3c763d; + border-color: #3c763d; +} +.list-group-item-info { + color: #31708f; + background-color: #d9edf7; +} +a.list-group-item-info { + color: #31708f; +} +a.list-group-item-info .list-group-item-heading { + color: inherit; +} +a.list-group-item-info:hover, +a.list-group-item-info:focus { + color: #31708f; + background-color: #c4e3f3; +} +a.list-group-item-info.active, +a.list-group-item-info.active:hover, +a.list-group-item-info.active:focus { + color: #fff; + background-color: #31708f; + border-color: #31708f; +} +.list-group-item-warning { + color: #8a6d3b; + background-color: #fcf8e3; +} +a.list-group-item-warning { + color: #8a6d3b; +} +a.list-group-item-warning .list-group-item-heading { + color: inherit; +} +a.list-group-item-warning:hover, +a.list-group-item-warning:focus { + color: #8a6d3b; + background-color: #faf2cc; +} +a.list-group-item-warning.active, +a.list-group-item-warning.active:hover, +a.list-group-item-warning.active:focus { + color: #fff; + background-color: #8a6d3b; + border-color: #8a6d3b; +} +.list-group-item-danger { + color: #a94442; + background-color: #f2dede; +} +a.list-group-item-danger { + color: #a94442; +} +a.list-group-item-danger .list-group-item-heading { + color: inherit; +} +a.list-group-item-danger:hover, +a.list-group-item-danger:focus { + color: #a94442; + background-color: #ebcccc; +} +a.list-group-item-danger.active, +a.list-group-item-danger.active:hover, +a.list-group-item-danger.active:focus { + color: #fff; + background-color: #a94442; + border-color: #a94442; +} +.list-group-item-heading { + margin-top: 0; + margin-bottom: 5px; +} +.list-group-item-text { + margin-bottom: 0; + line-height: 1.3; +} +.panel { + margin-bottom: 20px; + background-color: #fff; + border: 1px solid transparent; + border-radius: 4px; + -webkit-box-shadow: 0 1px 1px rgba(0, 0, 0, .05); + box-shadow: 0 1px 1px rgba(0, 0, 0, .05); +} +.panel-body { + padding: 15px; +} +.panel-heading { + padding: 10px 15px; + border-bottom: 1px solid transparent; + border-top-left-radius: 3px; + border-top-right-radius: 3px; +} +.panel-heading > .dropdown .dropdown-toggle { + color: inherit; +} +.panel-title { + margin-top: 0; + margin-bottom: 0; + font-size: 16px; + color: inherit; +} +.panel-title > a, +.panel-title > small, +.panel-title > .small, +.panel-title > small > a, +.panel-title > .small > a { + color: inherit; +} +.panel-footer { + padding: 10px 15px; + background-color: #f5f5f5; + border-top: 1px solid #ddd; + border-bottom-right-radius: 3px; + border-bottom-left-radius: 3px; +} +.panel > .list-group, +.panel > .panel-collapse > .list-group { + margin-bottom: 0; +} +.panel > .list-group .list-group-item, +.panel > .panel-collapse > .list-group .list-group-item { + border-width: 1px 0; + border-radius: 0; +} +.panel > .list-group:first-child .list-group-item:first-child, +.panel > .panel-collapse > .list-group:first-child .list-group-item:first-child { + border-top: 0; + border-top-left-radius: 3px; + border-top-right-radius: 3px; +} +.panel > .list-group:last-child .list-group-item:last-child, +.panel > .panel-collapse > .list-group:last-child .list-group-item:last-child { + border-bottom: 0; + border-bottom-right-radius: 3px; + border-bottom-left-radius: 3px; +} +.panel-heading + .list-group .list-group-item:first-child { + border-top-width: 0; +} +.list-group + .panel-footer { + border-top-width: 0; +} +.panel > .table, +.panel > .table-responsive > .table, +.panel > .panel-collapse > .table { + margin-bottom: 0; +} +.panel > .table caption, +.panel > .table-responsive > .table caption, +.panel > .panel-collapse > .table caption { + padding-right: 15px; + padding-left: 15px; +} +.panel > .table:first-child, +.panel > .table-responsive:first-child > .table:first-child { + border-top-left-radius: 3px; + border-top-right-radius: 3px; +} +.panel > .table:first-child > thead:first-child > tr:first-child, +.panel > .table-responsive:first-child > .table:first-child > thead:first-child > tr:first-child, +.panel > .table:first-child > tbody:first-child > tr:first-child, +.panel > .table-responsive:first-child > .table:first-child > tbody:first-child > tr:first-child { + border-top-left-radius: 3px; + border-top-right-radius: 3px; +} +.panel > .table:first-child > thead:first-child > tr:first-child td:first-child, +.panel > .table-responsive:first-child > .table:first-child > thead:first-child > tr:first-child td:first-child, +.panel > .table:first-child > tbody:first-child > tr:first-child td:first-child, +.panel > .table-responsive:first-child > .table:first-child > tbody:first-child > tr:first-child td:first-child, +.panel > .table:first-child > thead:first-child > tr:first-child th:first-child, +.panel > .table-responsive:first-child > .table:first-child > thead:first-child > tr:first-child th:first-child, +.panel > .table:first-child > tbody:first-child > tr:first-child th:first-child, +.panel > .table-responsive:first-child > .table:first-child > tbody:first-child > tr:first-child th:first-child { + border-top-left-radius: 3px; +} +.panel > .table:first-child > thead:first-child > tr:first-child td:last-child, +.panel > .table-responsive:first-child > .table:first-child > thead:first-child > tr:first-child td:last-child, +.panel > .table:first-child > tbody:first-child > tr:first-child td:last-child, +.panel > .table-responsive:first-child > .table:first-child > tbody:first-child > tr:first-child td:last-child, +.panel > .table:first-child > thead:first-child > tr:first-child th:last-child, +.panel > .table-responsive:first-child > .table:first-child > thead:first-child > tr:first-child th:last-child, +.panel > .table:first-child > tbody:first-child > tr:first-child th:last-child, +.panel > .table-responsive:first-child > .table:first-child > tbody:first-child > tr:first-child th:last-child { + border-top-right-radius: 3px; +} +.panel > .table:last-child, +.panel > .table-responsive:last-child > .table:last-child { + border-bottom-right-radius: 3px; + border-bottom-left-radius: 3px; +} +.panel > .table:last-child > tbody:last-child > tr:last-child, +.panel > .table-responsive:last-child > .table:last-child > tbody:last-child > tr:last-child, +.panel > .table:last-child > tfoot:last-child > tr:last-child, +.panel > .table-responsive:last-child > .table:last-child > tfoot:last-child > tr:last-child { + border-bottom-right-radius: 3px; + border-bottom-left-radius: 3px; +} +.panel > .table:last-child > tbody:last-child > tr:last-child td:first-child, +.panel > .table-responsive:last-child > .table:last-child > tbody:last-child > tr:last-child td:first-child, +.panel > .table:last-child > tfoot:last-child > tr:last-child td:first-child, +.panel > .table-responsive:last-child > .table:last-child > tfoot:last-child > tr:last-child td:first-child, +.panel > .table:last-child > tbody:last-child > tr:last-child th:first-child, +.panel > .table-responsive:last-child > .table:last-child > tbody:last-child > tr:last-child th:first-child, +.panel > .table:last-child > tfoot:last-child > tr:last-child th:first-child, +.panel > .table-responsive:last-child > .table:last-child > tfoot:last-child > tr:last-child th:first-child { + border-bottom-left-radius: 3px; +} +.panel > .table:last-child > tbody:last-child > tr:last-child td:last-child, +.panel > .table-responsive:last-child > .table:last-child > tbody:last-child > tr:last-child td:last-child, +.panel > .table:last-child > tfoot:last-child > tr:last-child td:last-child, +.panel > .table-responsive:last-child > .table:last-child > tfoot:last-child > tr:last-child td:last-child, +.panel > .table:last-child > tbody:last-child > tr:last-child th:last-child, +.panel > .table-responsive:last-child > .table:last-child > tbody:last-child > tr:last-child th:last-child, +.panel > .table:last-child > tfoot:last-child > tr:last-child th:last-child, +.panel > .table-responsive:last-child > .table:last-child > tfoot:last-child > tr:last-child th:last-child { + border-bottom-right-radius: 3px; +} +.panel > .panel-body + .table, +.panel > .panel-body + .table-responsive, +.panel > .table + .panel-body, +.panel > .table-responsive + .panel-body { + border-top: 1px solid #ddd; +} +.panel > .table > tbody:first-child > tr:first-child th, +.panel > .table > tbody:first-child > tr:first-child td { + border-top: 0; +} +.panel > .table-bordered, +.panel > .table-responsive > .table-bordered { + border: 0; +} +.panel > .table-bordered > thead > tr > th:first-child, +.panel > .table-responsive > .table-bordered > thead > tr > th:first-child, +.panel > .table-bordered > tbody > tr > th:first-child, +.panel > .table-responsive > .table-bordered > tbody > tr > th:first-child, +.panel > .table-bordered > tfoot > tr > th:first-child, +.panel > .table-responsive > .table-bordered > tfoot > tr > th:first-child, +.panel > .table-bordered > thead > tr > td:first-child, +.panel > .table-responsive > .table-bordered > thead > tr > td:first-child, +.panel > .table-bordered > tbody > tr > td:first-child, +.panel > .table-responsive > .table-bordered > tbody > tr > td:first-child, +.panel > .table-bordered > tfoot > tr > td:first-child, +.panel > .table-responsive > .table-bordered > tfoot > tr > td:first-child { + border-left: 0; +} +.panel > .table-bordered > thead > tr > th:last-child, +.panel > .table-responsive > .table-bordered > thead > tr > th:last-child, +.panel > .table-bordered > tbody > tr > th:last-child, +.panel > .table-responsive > .table-bordered > tbody > tr > th:last-child, +.panel > .table-bordered > tfoot > tr > th:last-child, +.panel > .table-responsive > .table-bordered > tfoot > tr > th:last-child, +.panel > .table-bordered > thead > tr > td:last-child, +.panel > .table-responsive > .table-bordered > thead > tr > td:last-child, +.panel > .table-bordered > tbody > tr > td:last-child, +.panel > .table-responsive > .table-bordered > tbody > tr > td:last-child, +.panel > .table-bordered > tfoot > tr > td:last-child, +.panel > .table-responsive > .table-bordered > tfoot > tr > td:last-child { + border-right: 0; +} +.panel > .table-bordered > thead > tr:first-child > td, +.panel > .table-responsive > .table-bordered > thead > tr:first-child > td, +.panel > .table-bordered > tbody > tr:first-child > td, +.panel > .table-responsive > .table-bordered > tbody > tr:first-child > td, +.panel > .table-bordered > thead > tr:first-child > th, +.panel > .table-responsive > .table-bordered > thead > tr:first-child > th, +.panel > .table-bordered > tbody > tr:first-child > th, +.panel > .table-responsive > .table-bordered > tbody > tr:first-child > th { + border-bottom: 0; +} +.panel > .table-bordered > tbody > tr:last-child > td, +.panel > .table-responsive > .table-bordered > tbody > tr:last-child > td, +.panel > .table-bordered > tfoot > tr:last-child > td, +.panel > .table-responsive > .table-bordered > tfoot > tr:last-child > td, +.panel > .table-bordered > tbody > tr:last-child > th, +.panel > .table-responsive > .table-bordered > tbody > tr:last-child > th, +.panel > .table-bordered > tfoot > tr:last-child > th, +.panel > .table-responsive > .table-bordered > tfoot > tr:last-child > th { + border-bottom: 0; +} +.panel > .table-responsive { + margin-bottom: 0; + border: 0; +} +.panel-group { + margin-bottom: 20px; +} +.panel-group .panel { + margin-bottom: 0; + border-radius: 4px; +} +.panel-group .panel + .panel { + margin-top: 5px; +} +.panel-group .panel-heading { + border-bottom: 0; +} +.panel-group .panel-heading + .panel-collapse > .panel-body, +.panel-group .panel-heading + .panel-collapse > .list-group { + border-top: 1px solid #ddd; +} +.panel-group .panel-footer { + border-top: 0; +} +.panel-group .panel-footer + .panel-collapse .panel-body { + border-bottom: 1px solid #ddd; +} +.panel-default { + border-color: #ddd; +} +.panel-default > .panel-heading { + color: #333; + background-color: #f5f5f5; + border-color: #ddd; +} +.panel-default > .panel-heading + .panel-collapse > .panel-body { + border-top-color: #ddd; +} +.panel-default > .panel-heading .badge { + color: #f5f5f5; + background-color: #333; +} +.panel-default > .panel-footer + .panel-collapse > .panel-body { + border-bottom-color: #ddd; +} +.panel-primary { + border-color: #337ab7; +} +.panel-primary > .panel-heading { + color: #fff; + background-color: #337ab7; + border-color: #337ab7; +} +.panel-primary > .panel-heading + .panel-collapse > .panel-body { + border-top-color: #337ab7; +} +.panel-primary > .panel-heading .badge { + color: #337ab7; + background-color: #fff; +} +.panel-primary > .panel-footer + .panel-collapse > .panel-body { + border-bottom-color: #337ab7; +} +.panel-success { + border-color: #d6e9c6; +} +.panel-success > .panel-heading { + color: #3c763d; + background-color: #dff0d8; + border-color: #d6e9c6; +} +.panel-success > .panel-heading + .panel-collapse > .panel-body { + border-top-color: #d6e9c6; +} +.panel-success > .panel-heading .badge { + color: #dff0d8; + background-color: #3c763d; +} +.panel-success > .panel-footer + .panel-collapse > .panel-body { + border-bottom-color: #d6e9c6; +} +.panel-info { + border-color: #bce8f1; +} +.panel-info > .panel-heading { + color: #31708f; + background-color: #d9edf7; + border-color: #bce8f1; +} +.panel-info > .panel-heading + .panel-collapse > .panel-body { + border-top-color: #bce8f1; +} +.panel-info > .panel-heading .badge { + color: #d9edf7; + background-color: #31708f; +} +.panel-info > .panel-footer + .panel-collapse > .panel-body { + border-bottom-color: #bce8f1; +} +.panel-warning { + border-color: #faebcc; +} +.panel-warning > .panel-heading { + color: #8a6d3b; + background-color: #fcf8e3; + border-color: #faebcc; +} +.panel-warning > .panel-heading + .panel-collapse > .panel-body { + border-top-color: #faebcc; +} +.panel-warning > .panel-heading .badge { + color: #fcf8e3; + background-color: #8a6d3b; +} +.panel-warning > .panel-footer + .panel-collapse > .panel-body { + border-bottom-color: #faebcc; +} +.panel-danger { + border-color: #ebccd1; +} +.panel-danger > .panel-heading { + color: #a94442; + background-color: #f2dede; + border-color: #ebccd1; +} +.panel-danger > .panel-heading + .panel-collapse > .panel-body { + border-top-color: #ebccd1; +} +.panel-danger > .panel-heading .badge { + color: #f2dede; + background-color: #a94442; +} +.panel-danger > .panel-footer + .panel-collapse > .panel-body { + border-bottom-color: #ebccd1; +} +.embed-responsive { + position: relative; + display: block; + height: 0; + padding: 0; + overflow: hidden; +} +.embed-responsive .embed-responsive-item, +.embed-responsive iframe, +.embed-responsive embed, +.embed-responsive object, +.embed-responsive video { + position: absolute; + top: 0; + bottom: 0; + left: 0; + width: 100%; + height: 100%; + border: 0; +} +.embed-responsive.embed-responsive-16by9 { + padding-bottom: 56.25%; +} +.embed-responsive.embed-responsive-4by3 { + padding-bottom: 75%; +} +.well { + min-height: 20px; + padding: 19px; + margin-bottom: 20px; + background-color: #f5f5f5; + border: 1px solid #e3e3e3; + border-radius: 4px; + -webkit-box-shadow: inset 0 1px 1px rgba(0, 0, 0, .05); + box-shadow: inset 0 1px 1px rgba(0, 0, 0, .05); +} +.well blockquote { + border-color: #ddd; + border-color: rgba(0, 0, 0, .15); +} +.well-lg { + padding: 24px; + border-radius: 6px; +} +.well-sm { + padding: 9px; + border-radius: 3px; +} +.close { + float: right; + font-size: 21px; + font-weight: bold; + line-height: 1; + color: #000; + text-shadow: 0 1px 0 #fff; + filter: alpha(opacity=20); + opacity: .2; +} +.close:hover, +.close:focus { + color: #000; + text-decoration: none; + cursor: pointer; + filter: alpha(opacity=50); + opacity: .5; +} +button.close { + -webkit-appearance: none; + padding: 0; + cursor: pointer; + background: transparent; + border: 0; +} +.modal-open { + overflow: hidden; +} +.modal { + position: fixed; + top: 0; + right: 0; + bottom: 0; + left: 0; + z-index: 1040; + display: none; + overflow: hidden; + -webkit-overflow-scrolling: touch; + outline: 0; +} +.modal.fade .modal-dialog { + -webkit-transition: -webkit-transform .3s ease-out; + -o-transition: -o-transform .3s ease-out; + transition: transform .3s ease-out; + -webkit-transform: translate(0, -25%); + -ms-transform: translate(0, -25%); + -o-transform: translate(0, -25%); + transform: translate(0, -25%); +} +.modal.in .modal-dialog { + -webkit-transform: translate(0, 0); + -ms-transform: translate(0, 0); + -o-transform: translate(0, 0); + transform: translate(0, 0); +} +.modal-open .modal { + overflow-x: hidden; + overflow-y: auto; +} +.modal-dialog { + position: relative; + width: auto; + margin: 10px; +} +.modal-content { + position: relative; + background-color: #fff; + -webkit-background-clip: padding-box; + background-clip: padding-box; + border: 1px solid #999; + border: 1px solid rgba(0, 0, 0, .2); + border-radius: 6px; + outline: 0; + -webkit-box-shadow: 0 3px 9px rgba(0, 0, 0, .5); + box-shadow: 0 3px 9px rgba(0, 0, 0, .5); +} +.modal-backdrop { + position: absolute; + top: 0; + right: 0; + left: 0; + background-color: #000; +} +.modal-backdrop.fade { + filter: alpha(opacity=0); + opacity: 0; +} +.modal-backdrop.in { + filter: alpha(opacity=50); + opacity: .5; +} +.modal-header { + min-height: 16.42857143px; + padding: 15px; + border-bottom: 1px solid #e5e5e5; +} +.modal-header .close { + margin-top: -2px; +} +.modal-title { + margin: 0; + line-height: 1.42857143; +} +.modal-body { + position: relative; + padding: 15px; +} +.modal-footer { + padding: 15px; + text-align: right; + border-top: 1px solid #e5e5e5; +} +.modal-footer .btn + .btn { + margin-bottom: 0; + margin-left: 5px; +} +.modal-footer .btn-group .btn + .btn { + margin-left: -1px; +} +.modal-footer .btn-block + .btn-block { + margin-left: 0; +} +.modal-scrollbar-measure { + position: absolute; + top: -9999px; + width: 50px; + height: 50px; + overflow: scroll; +} +@media (min-width: 768px) { + .modal-dialog { + width: 600px; + margin: 30px auto; + } + .modal-content { + -webkit-box-shadow: 0 5px 15px rgba(0, 0, 0, .5); + box-shadow: 0 5px 15px rgba(0, 0, 0, .5); + } + .modal-sm { + width: 300px; + } +} +@media (min-width: 992px) { + .modal-lg { + width: 900px; + } +} +.tooltip { + position: absolute; + z-index: 1070; + display: block; + font-family: "Helvetica Neue", Helvetica, Arial, sans-serif; + font-size: 12px; + font-weight: normal; + line-height: 1.4; + visibility: visible; + filter: alpha(opacity=0); + opacity: 0; +} +.tooltip.in { + filter: alpha(opacity=90); + opacity: .9; +} +.tooltip.top { + padding: 5px 0; + margin-top: -3px; +} +.tooltip.right { + padding: 0 5px; + margin-left: 3px; +} +.tooltip.bottom { + padding: 5px 0; + margin-top: 3px; +} +.tooltip.left { + padding: 0 5px; + margin-left: -3px; +} +.tooltip-inner { + max-width: 200px; + padding: 3px 8px; + color: #fff; + text-align: center; + text-decoration: none; + background-color: #000; + border-radius: 4px; +} +.tooltip-arrow { + position: absolute; + width: 0; + height: 0; + border-color: transparent; + border-style: solid; +} +.tooltip.top .tooltip-arrow { + bottom: 0; + left: 50%; + margin-left: -5px; + border-width: 5px 5px 0; + border-top-color: #000; +} +.tooltip.top-left .tooltip-arrow { + right: 5px; + bottom: 0; + margin-bottom: -5px; + border-width: 5px 5px 0; + border-top-color: #000; +} +.tooltip.top-right .tooltip-arrow { + bottom: 0; + left: 5px; + margin-bottom: -5px; + border-width: 5px 5px 0; + border-top-color: #000; +} +.tooltip.right .tooltip-arrow { + top: 50%; + left: 0; + margin-top: -5px; + border-width: 5px 5px 5px 0; + border-right-color: #000; +} +.tooltip.left .tooltip-arrow { + top: 50%; + right: 0; + margin-top: -5px; + border-width: 5px 0 5px 5px; + border-left-color: #000; +} +.tooltip.bottom .tooltip-arrow { + top: 0; + left: 50%; + margin-left: -5px; + border-width: 0 5px 5px; + border-bottom-color: #000; +} +.tooltip.bottom-left .tooltip-arrow { + top: 0; + right: 5px; + margin-top: -5px; + border-width: 0 5px 5px; + border-bottom-color: #000; +} +.tooltip.bottom-right .tooltip-arrow { + top: 0; + left: 5px; + margin-top: -5px; + border-width: 0 5px 5px; + border-bottom-color: #000; +} +.popover { + position: absolute; + top: 0; + left: 0; + z-index: 1060; + display: none; + max-width: 276px; + padding: 1px; + font-family: "Helvetica Neue", Helvetica, Arial, sans-serif; + font-size: 14px; + font-weight: normal; + line-height: 1.42857143; + text-align: left; + white-space: normal; + background-color: #fff; + -webkit-background-clip: padding-box; + background-clip: padding-box; + border: 1px solid #ccc; + border: 1px solid rgba(0, 0, 0, .2); + border-radius: 6px; + -webkit-box-shadow: 0 5px 10px rgba(0, 0, 0, .2); + box-shadow: 0 5px 10px rgba(0, 0, 0, .2); +} +.popover.top { + margin-top: -10px; +} +.popover.right { + margin-left: 10px; +} +.popover.bottom { + margin-top: 10px; +} +.popover.left { + margin-left: -10px; +} +.popover-title { + padding: 8px 14px; + margin: 0; + font-size: 14px; + background-color: #f7f7f7; + border-bottom: 1px solid #ebebeb; + border-radius: 5px 5px 0 0; +} +.popover-content { + padding: 9px 14px; +} +.popover > .arrow, +.popover > .arrow:after { + position: absolute; + display: block; + width: 0; + height: 0; + border-color: transparent; + border-style: solid; +} +.popover > .arrow { + border-width: 11px; +} +.popover > .arrow:after { + content: ""; + border-width: 10px; +} +.popover.top > .arrow { + bottom: -11px; + left: 50%; + margin-left: -11px; + border-top-color: #999; + border-top-color: rgba(0, 0, 0, .25); + border-bottom-width: 0; +} +.popover.top > .arrow:after { + bottom: 1px; + margin-left: -10px; + content: " "; + border-top-color: #fff; + border-bottom-width: 0; +} +.popover.right > .arrow { + top: 50%; + left: -11px; + margin-top: -11px; + border-right-color: #999; + border-right-color: rgba(0, 0, 0, .25); + border-left-width: 0; +} +.popover.right > .arrow:after { + bottom: -10px; + left: 1px; + content: " "; + border-right-color: #fff; + border-left-width: 0; +} +.popover.bottom > .arrow { + top: -11px; + left: 50%; + margin-left: -11px; + border-top-width: 0; + border-bottom-color: #999; + border-bottom-color: rgba(0, 0, 0, .25); +} +.popover.bottom > .arrow:after { + top: 1px; + margin-left: -10px; + content: " "; + border-top-width: 0; + border-bottom-color: #fff; +} +.popover.left > .arrow { + top: 50%; + right: -11px; + margin-top: -11px; + border-right-width: 0; + border-left-color: #999; + border-left-color: rgba(0, 0, 0, .25); +} +.popover.left > .arrow:after { + right: 1px; + bottom: -10px; + content: " "; + border-right-width: 0; + border-left-color: #fff; +} +.carousel { + position: relative; +} +.carousel-inner { + position: relative; + width: 100%; + overflow: hidden; +} +.carousel-inner > .item { + position: relative; + display: none; + -webkit-transition: .6s ease-in-out left; + -o-transition: .6s ease-in-out left; + transition: .6s ease-in-out left; +} +.carousel-inner > .item > img, +.carousel-inner > .item > a > img { + line-height: 1; +} +@media all and (transform-3d), (-webkit-transform-3d) { + .carousel-inner > .item { + -webkit-transition: -webkit-transform .6s ease-in-out; + -o-transition: -o-transform .6s ease-in-out; + transition: transform .6s ease-in-out; + + -webkit-backface-visibility: hidden; + backface-visibility: hidden; + -webkit-perspective: 1000; + perspective: 1000; + } + .carousel-inner > .item.next, + .carousel-inner > .item.active.right { + left: 0; + -webkit-transform: translate3d(100%, 0, 0); + transform: translate3d(100%, 0, 0); + } + .carousel-inner > .item.prev, + .carousel-inner > .item.active.left { + left: 0; + -webkit-transform: translate3d(-100%, 0, 0); + transform: translate3d(-100%, 0, 0); + } + .carousel-inner > .item.next.left, + .carousel-inner > .item.prev.right, + .carousel-inner > .item.active { + left: 0; + -webkit-transform: translate3d(0, 0, 0); + transform: translate3d(0, 0, 0); + } +} +.carousel-inner > .active, +.carousel-inner > .next, +.carousel-inner > .prev { + display: block; +} +.carousel-inner > .active { + left: 0; +} +.carousel-inner > .next, +.carousel-inner > .prev { + position: absolute; + top: 0; + width: 100%; +} +.carousel-inner > .next { + left: 100%; +} +.carousel-inner > .prev { + left: -100%; +} +.carousel-inner > .next.left, +.carousel-inner > .prev.right { + left: 0; +} +.carousel-inner > .active.left { + left: -100%; +} +.carousel-inner > .active.right { + left: 100%; +} +.carousel-control { + position: absolute; + top: 0; + bottom: 0; + left: 0; + width: 15%; + font-size: 20px; + color: #fff; + text-align: center; + text-shadow: 0 1px 2px rgba(0, 0, 0, .6); + filter: alpha(opacity=50); + opacity: .5; +} +.carousel-control.left { + background-image: -webkit-linear-gradient(left, rgba(0, 0, 0, .5) 0%, rgba(0, 0, 0, .0001) 100%); + background-image: -o-linear-gradient(left, rgba(0, 0, 0, .5) 0%, rgba(0, 0, 0, .0001) 100%); + background-image: -webkit-gradient(linear, left top, right top, from(rgba(0, 0, 0, .5)), to(rgba(0, 0, 0, .0001))); + background-image: linear-gradient(to right, rgba(0, 0, 0, .5) 0%, rgba(0, 0, 0, .0001) 100%); + filter: progid:DXImageTransform.Microsoft.gradient(startColorstr='#80000000', endColorstr='#00000000', GradientType=1); + background-repeat: repeat-x; +} +.carousel-control.right { + right: 0; + left: auto; + background-image: -webkit-linear-gradient(left, rgba(0, 0, 0, .0001) 0%, rgba(0, 0, 0, .5) 100%); + background-image: -o-linear-gradient(left, rgba(0, 0, 0, .0001) 0%, rgba(0, 0, 0, .5) 100%); + background-image: -webkit-gradient(linear, left top, right top, from(rgba(0, 0, 0, .0001)), to(rgba(0, 0, 0, .5))); + background-image: linear-gradient(to right, rgba(0, 0, 0, .0001) 0%, rgba(0, 0, 0, .5) 100%); + filter: progid:DXImageTransform.Microsoft.gradient(startColorstr='#00000000', endColorstr='#80000000', GradientType=1); + background-repeat: repeat-x; +} +.carousel-control:hover, +.carousel-control:focus { + color: #fff; + text-decoration: none; + filter: alpha(opacity=90); + outline: 0; + opacity: .9; +} +.carousel-control .icon-prev, +.carousel-control .icon-next, +.carousel-control .glyphicon-chevron-left, +.carousel-control .glyphicon-chevron-right { + position: absolute; + top: 50%; + z-index: 5; + display: inline-block; +} +.carousel-control .icon-prev, +.carousel-control .glyphicon-chevron-left { + left: 50%; + margin-left: -10px; +} +.carousel-control .icon-next, +.carousel-control .glyphicon-chevron-right { + right: 50%; + margin-right: -10px; +} +.carousel-control .icon-prev, +.carousel-control .icon-next { + width: 20px; + height: 20px; + margin-top: -10px; + font-family: serif; + line-height: 1; +} +.carousel-control .icon-prev:before { + content: '\2039'; +} +.carousel-control .icon-next:before { + content: '\203a'; +} +.carousel-indicators { + position: absolute; + bottom: 10px; + left: 50%; + z-index: 15; + width: 60%; + padding-left: 0; + margin-left: -30%; + text-align: center; + list-style: none; +} +.carousel-indicators li { + display: inline-block; + width: 10px; + height: 10px; + margin: 1px; + text-indent: -999px; + cursor: pointer; + background-color: #000 \9; + background-color: rgba(0, 0, 0, 0); + border: 1px solid #fff; + border-radius: 10px; +} +.carousel-indicators .active { + width: 12px; + height: 12px; + margin: 0; + background-color: #fff; +} +.carousel-caption { + position: absolute; + right: 15%; + bottom: 20px; + left: 15%; + z-index: 10; + padding-top: 20px; + padding-bottom: 20px; + color: #fff; + text-align: center; + text-shadow: 0 1px 2px rgba(0, 0, 0, .6); +} +.carousel-caption .btn { + text-shadow: none; +} +@media screen and (min-width: 768px) { + .carousel-control .glyphicon-chevron-left, + .carousel-control .glyphicon-chevron-right, + .carousel-control .icon-prev, + .carousel-control .icon-next { + width: 30px; + height: 30px; + margin-top: -15px; + font-size: 30px; + } + .carousel-control .glyphicon-chevron-left, + .carousel-control .icon-prev { + margin-left: -15px; + } + .carousel-control .glyphicon-chevron-right, + .carousel-control .icon-next { + margin-right: -15px; + } + .carousel-caption { + right: 20%; + left: 20%; + padding-bottom: 30px; + } + .carousel-indicators { + bottom: 20px; + } +} +.clearfix:before, +.clearfix:after, +.dl-horizontal dd:before, +.dl-horizontal dd:after, +.container:before, +.container:after, +.container-fluid:before, +.container-fluid:after, +.row:before, +.row:after, +.form-horizontal .form-group:before, +.form-horizontal .form-group:after, +.btn-toolbar:before, +.btn-toolbar:after, +.btn-group-vertical > .btn-group:before, +.btn-group-vertical > .btn-group:after, +.nav:before, +.nav:after, +.navbar:before, +.navbar:after, +.navbar-header:before, +.navbar-header:after, +.navbar-collapse:before, +.navbar-collapse:after, +.pager:before, +.pager:after, +.panel-body:before, +.panel-body:after, +.modal-footer:before, +.modal-footer:after { + display: table; + content: " "; +} +.clearfix:after, +.dl-horizontal dd:after, +.container:after, +.container-fluid:after, +.row:after, +.form-horizontal .form-group:after, +.btn-toolbar:after, +.btn-group-vertical > .btn-group:after, +.nav:after, +.navbar:after, +.navbar-header:after, +.navbar-collapse:after, +.pager:after, +.panel-body:after, +.modal-footer:after { + clear: both; +} +.center-block { + display: block; + margin-right: auto; + margin-left: auto; +} +.pull-right { + float: right !important; +} +.pull-left { + float: left !important; +} +.hide { + display: none !important; +} +.show { + display: block !important; +} +.invisible { + visibility: hidden; +} +.text-hide { + font: 0/0 a; + color: transparent; + text-shadow: none; + background-color: transparent; + border: 0; +} +.hidden { + display: none !important; + visibility: hidden !important; +} +.affix { + position: fixed; +} +@-ms-viewport { + width: device-width; +} +.visible-xs, +.visible-sm, +.visible-md, +.visible-lg { + display: none !important; +} +.visible-xs-block, +.visible-xs-inline, +.visible-xs-inline-block, +.visible-sm-block, +.visible-sm-inline, +.visible-sm-inline-block, +.visible-md-block, +.visible-md-inline, +.visible-md-inline-block, +.visible-lg-block, +.visible-lg-inline, +.visible-lg-inline-block { + display: none !important; +} +@media (max-width: 767px) { + .visible-xs { + display: block !important; + } + table.visible-xs { + display: table; + } + tr.visible-xs { + display: table-row !important; + } + th.visible-xs, + td.visible-xs { + display: table-cell !important; + } +} +@media (max-width: 767px) { + .visible-xs-block { + display: block !important; + } +} +@media (max-width: 767px) { + .visible-xs-inline { + display: inline !important; + } +} +@media (max-width: 767px) { + .visible-xs-inline-block { + display: inline-block !important; + } +} +@media (min-width: 768px) and (max-width: 991px) { + .visible-sm { + display: block !important; + } + table.visible-sm { + display: table; + } + tr.visible-sm { + display: table-row !important; + } + th.visible-sm, + td.visible-sm { + display: table-cell !important; + } +} +@media (min-width: 768px) and (max-width: 991px) { + .visible-sm-block { + display: block !important; + } +} +@media (min-width: 768px) and (max-width: 991px) { + .visible-sm-inline { + display: inline !important; + } +} +@media (min-width: 768px) and (max-width: 991px) { + .visible-sm-inline-block { + display: inline-block !important; + } +} +@media (min-width: 992px) and (max-width: 1199px) { + .visible-md { + display: block !important; + } + table.visible-md { + display: table; + } + tr.visible-md { + display: table-row !important; + } + th.visible-md, + td.visible-md { + display: table-cell !important; + } +} +@media (min-width: 992px) and (max-width: 1199px) { + .visible-md-block { + display: block !important; + } +} +@media (min-width: 992px) and (max-width: 1199px) { + .visible-md-inline { + display: inline !important; + } +} +@media (min-width: 992px) and (max-width: 1199px) { + .visible-md-inline-block { + display: inline-block !important; + } +} +@media (min-width: 1200px) { + .visible-lg { + display: block !important; + } + table.visible-lg { + display: table; + } + tr.visible-lg { + display: table-row !important; + } + th.visible-lg, + td.visible-lg { + display: table-cell !important; + } +} +@media (min-width: 1200px) { + .visible-lg-block { + display: block !important; + } +} +@media (min-width: 1200px) { + .visible-lg-inline { + display: inline !important; + } +} +@media (min-width: 1200px) { + .visible-lg-inline-block { + display: inline-block !important; + } +} +@media (max-width: 767px) { + .hidden-xs { + display: none !important; + } +} +@media (min-width: 768px) and (max-width: 991px) { + .hidden-sm { + display: none !important; + } +} +@media (min-width: 992px) and (max-width: 1199px) { + .hidden-md { + display: none !important; + } +} +@media (min-width: 1200px) { + .hidden-lg { + display: none !important; + } +} +.visible-print { + display: none !important; +} +@media print { + .visible-print { + display: block !important; + } + table.visible-print { + display: table; + } + tr.visible-print { + display: table-row !important; + } + th.visible-print, + td.visible-print { + display: table-cell !important; + } +} +.visible-print-block { + display: none !important; +} +@media print { + .visible-print-block { + display: block !important; + } +} +.visible-print-inline { + display: none !important; +} +@media print { + .visible-print-inline { + display: inline !important; + } +} +.visible-print-inline-block { + display: none !important; +} +@media print { + .visible-print-inline-block { + display: inline-block !important; + } +} +@media print { + .hidden-print { + display: none !important; + } +} +/*# sourceMappingURL=bootstrap.css.map */ diff --git a/app/web/asset/css/font-awesome.min.css b/app/web/asset/css/font-awesome.min.css new file mode 100644 index 0000000000000000000000000000000000000000..540440ce89f2a408aa699b65100e18f15e0f09ca --- /dev/null +++ b/app/web/asset/css/font-awesome.min.css @@ -0,0 +1,4 @@ +/*! + * Font Awesome 4.7.0 by @davegandy - http://fontawesome.io - @fontawesome + * License - http://fontawesome.io/license (Font: SIL OFL 1.1, CSS: MIT License) + */@font-face{font-family:'FontAwesome';src:url('../fonts/fontawesome-webfont.eot?v=4.7.0');src:url('../fonts/fontawesome-webfont.eot?#iefix&v=4.7.0') format('embedded-opentype'),url('../fonts/fontawesome-webfont.woff2?v=4.7.0') format('woff2'),url('../fonts/fontawesome-webfont.woff?v=4.7.0') format('woff'),url('../fonts/fontawesome-webfont.ttf?v=4.7.0') format('truetype'),url('../fonts/fontawesome-webfont.svg?v=4.7.0#fontawesomeregular') format('svg');font-weight:normal;font-style:normal}.fa{display:inline-block;font:normal normal normal 14px/1 FontAwesome;font-size:inherit;text-rendering:auto;-webkit-font-smoothing:antialiased;-moz-osx-font-smoothing:grayscale}.fa-lg{font-size:1.33333333em;line-height:.75em;vertical-align:-15%}.fa-2x{font-size:2em}.fa-3x{font-size:3em}.fa-4x{font-size:4em}.fa-5x{font-size:5em}.fa-fw{width:1.28571429em;text-align:center}.fa-ul{padding-left:0;margin-left:2.14285714em;list-style-type:none}.fa-ul>li{position:relative}.fa-li{position:absolute;left:-2.14285714em;width:2.14285714em;top:.14285714em;text-align:center}.fa-li.fa-lg{left:-1.85714286em}.fa-border{padding:.2em .25em .15em;border:solid .08em #eee;border-radius:.1em}.fa-pull-left{float:left}.fa-pull-right{float:right}.fa.fa-pull-left{margin-right:.3em}.fa.fa-pull-right{margin-left:.3em}.pull-right{float:right}.pull-left{float:left}.fa.pull-left{margin-right:.3em}.fa.pull-right{margin-left:.3em}.fa-spin{-webkit-animation:fa-spin 2s infinite linear;animation:fa-spin 2s infinite linear}.fa-pulse{-webkit-animation:fa-spin 1s infinite steps(8);animation:fa-spin 1s infinite steps(8)}@-webkit-keyframes fa-spin{0%{-webkit-transform:rotate(0deg);transform:rotate(0deg)}100%{-webkit-transform:rotate(359deg);transform:rotate(359deg)}}@keyframes fa-spin{0%{-webkit-transform:rotate(0deg);transform:rotate(0deg)}100%{-webkit-transform:rotate(359deg);transform:rotate(359deg)}}.fa-rotate-90{-ms-filter:"progid:DXImageTransform.Microsoft.BasicImage(rotation=1)";-webkit-transform:rotate(90deg);-ms-transform:rotate(90deg);transform:rotate(90deg)}.fa-rotate-180{-ms-filter:"progid:DXImageTransform.Microsoft.BasicImage(rotation=2)";-webkit-transform:rotate(180deg);-ms-transform:rotate(180deg);transform:rotate(180deg)}.fa-rotate-270{-ms-filter:"progid:DXImageTransform.Microsoft.BasicImage(rotation=3)";-webkit-transform:rotate(270deg);-ms-transform:rotate(270deg);transform:rotate(270deg)}.fa-flip-horizontal{-ms-filter:"progid:DXImageTransform.Microsoft.BasicImage(rotation=0, mirror=1)";-webkit-transform:scale(-1, 1);-ms-transform:scale(-1, 1);transform:scale(-1, 1)}.fa-flip-vertical{-ms-filter:"progid:DXImageTransform.Microsoft.BasicImage(rotation=2, mirror=1)";-webkit-transform:scale(1, -1);-ms-transform:scale(1, -1);transform:scale(1, -1)}:root .fa-rotate-90,:root .fa-rotate-180,:root .fa-rotate-270,:root .fa-flip-horizontal,:root .fa-flip-vertical{filter:none}.fa-stack{position:relative;display:inline-block;width:2em;height:2em;line-height:2em;vertical-align:middle}.fa-stack-1x,.fa-stack-2x{position:absolute;left:0;width:100%;text-align:center}.fa-stack-1x{line-height:inherit}.fa-stack-2x{font-size:2em}.fa-inverse{color:#fff}.fa-glass:before{content:"\f000"}.fa-music:before{content:"\f001"}.fa-search:before{content:"\f002"}.fa-envelope-o:before{content:"\f003"}.fa-heart:before{content:"\f004"}.fa-star:before{content:"\f005"}.fa-star-o:before{content:"\f006"}.fa-user:before{content:"\f007"}.fa-film:before{content:"\f008"}.fa-th-large:before{content:"\f009"}.fa-th:before{content:"\f00a"}.fa-th-list:before{content:"\f00b"}.fa-check:before{content:"\f00c"}.fa-remove:before,.fa-close:before,.fa-times:before{content:"\f00d"}.fa-search-plus:before{content:"\f00e"}.fa-search-minus:before{content:"\f010"}.fa-power-off:before{content:"\f011"}.fa-signal:before{content:"\f012"}.fa-gear:before,.fa-cog:before{content:"\f013"}.fa-trash-o:before{content:"\f014"}.fa-home:before{content:"\f015"}.fa-file-o:before{content:"\f016"}.fa-clock-o:before{content:"\f017"}.fa-road:before{content:"\f018"}.fa-download:before{content:"\f019"}.fa-arrow-circle-o-down:before{content:"\f01a"}.fa-arrow-circle-o-up:before{content:"\f01b"}.fa-inbox:before{content:"\f01c"}.fa-play-circle-o:before{content:"\f01d"}.fa-rotate-right:before,.fa-repeat:before{content:"\f01e"}.fa-refresh:before{content:"\f021"}.fa-list-alt:before{content:"\f022"}.fa-lock:before{content:"\f023"}.fa-flag:before{content:"\f024"}.fa-headphones:before{content:"\f025"}.fa-volume-off:before{content:"\f026"}.fa-volume-down:before{content:"\f027"}.fa-volume-up:before{content:"\f028"}.fa-qrcode:before{content:"\f029"}.fa-barcode:before{content:"\f02a"}.fa-tag:before{content:"\f02b"}.fa-tags:before{content:"\f02c"}.fa-book:before{content:"\f02d"}.fa-bookmark:before{content:"\f02e"}.fa-print:before{content:"\f02f"}.fa-camera:before{content:"\f030"}.fa-font:before{content:"\f031"}.fa-bold:before{content:"\f032"}.fa-italic:before{content:"\f033"}.fa-text-height:before{content:"\f034"}.fa-text-width:before{content:"\f035"}.fa-align-left:before{content:"\f036"}.fa-align-center:before{content:"\f037"}.fa-align-right:before{content:"\f038"}.fa-align-justify:before{content:"\f039"}.fa-list:before{content:"\f03a"}.fa-dedent:before,.fa-outdent:before{content:"\f03b"}.fa-indent:before{content:"\f03c"}.fa-video-camera:before{content:"\f03d"}.fa-photo:before,.fa-image:before,.fa-picture-o:before{content:"\f03e"}.fa-pencil:before{content:"\f040"}.fa-map-marker:before{content:"\f041"}.fa-adjust:before{content:"\f042"}.fa-tint:before{content:"\f043"}.fa-edit:before,.fa-pencil-square-o:before{content:"\f044"}.fa-share-square-o:before{content:"\f045"}.fa-check-square-o:before{content:"\f046"}.fa-arrows:before{content:"\f047"}.fa-step-backward:before{content:"\f048"}.fa-fast-backward:before{content:"\f049"}.fa-backward:before{content:"\f04a"}.fa-play:before{content:"\f04b"}.fa-pause:before{content:"\f04c"}.fa-stop:before{content:"\f04d"}.fa-forward:before{content:"\f04e"}.fa-fast-forward:before{content:"\f050"}.fa-step-forward:before{content:"\f051"}.fa-eject:before{content:"\f052"}.fa-chevron-left:before{content:"\f053"}.fa-chevron-right:before{content:"\f054"}.fa-plus-circle:before{content:"\f055"}.fa-minus-circle:before{content:"\f056"}.fa-times-circle:before{content:"\f057"}.fa-check-circle:before{content:"\f058"}.fa-question-circle:before{content:"\f059"}.fa-info-circle:before{content:"\f05a"}.fa-crosshairs:before{content:"\f05b"}.fa-times-circle-o:before{content:"\f05c"}.fa-check-circle-o:before{content:"\f05d"}.fa-ban:before{content:"\f05e"}.fa-arrow-left:before{content:"\f060"}.fa-arrow-right:before{content:"\f061"}.fa-arrow-up:before{content:"\f062"}.fa-arrow-down:before{content:"\f063"}.fa-mail-forward:before,.fa-share:before{content:"\f064"}.fa-expand:before{content:"\f065"}.fa-compress:before{content:"\f066"}.fa-plus:before{content:"\f067"}.fa-minus:before{content:"\f068"}.fa-asterisk:before{content:"\f069"}.fa-exclamation-circle:before{content:"\f06a"}.fa-gift:before{content:"\f06b"}.fa-leaf:before{content:"\f06c"}.fa-fire:before{content:"\f06d"}.fa-eye:before{content:"\f06e"}.fa-eye-slash:before{content:"\f070"}.fa-warning:before,.fa-exclamation-triangle:before{content:"\f071"}.fa-plane:before{content:"\f072"}.fa-calendar:before{content:"\f073"}.fa-random:before{content:"\f074"}.fa-comment:before{content:"\f075"}.fa-magnet:before{content:"\f076"}.fa-chevron-up:before{content:"\f077"}.fa-chevron-down:before{content:"\f078"}.fa-retweet:before{content:"\f079"}.fa-shopping-cart:before{content:"\f07a"}.fa-folder:before{content:"\f07b"}.fa-folder-open:before{content:"\f07c"}.fa-arrows-v:before{content:"\f07d"}.fa-arrows-h:before{content:"\f07e"}.fa-bar-chart-o:before,.fa-bar-chart:before{content:"\f080"}.fa-twitter-square:before{content:"\f081"}.fa-facebook-square:before{content:"\f082"}.fa-camera-retro:before{content:"\f083"}.fa-key:before{content:"\f084"}.fa-gears:before,.fa-cogs:before{content:"\f085"}.fa-comments:before{content:"\f086"}.fa-thumbs-o-up:before{content:"\f087"}.fa-thumbs-o-down:before{content:"\f088"}.fa-star-half:before{content:"\f089"}.fa-heart-o:before{content:"\f08a"}.fa-sign-out:before{content:"\f08b"}.fa-linkedin-square:before{content:"\f08c"}.fa-thumb-tack:before{content:"\f08d"}.fa-external-link:before{content:"\f08e"}.fa-sign-in:before{content:"\f090"}.fa-trophy:before{content:"\f091"}.fa-github-square:before{content:"\f092"}.fa-upload:before{content:"\f093"}.fa-lemon-o:before{content:"\f094"}.fa-phone:before{content:"\f095"}.fa-square-o:before{content:"\f096"}.fa-bookmark-o:before{content:"\f097"}.fa-phone-square:before{content:"\f098"}.fa-twitter:before{content:"\f099"}.fa-facebook-f:before,.fa-facebook:before{content:"\f09a"}.fa-github:before{content:"\f09b"}.fa-unlock:before{content:"\f09c"}.fa-credit-card:before{content:"\f09d"}.fa-feed:before,.fa-rss:before{content:"\f09e"}.fa-hdd-o:before{content:"\f0a0"}.fa-bullhorn:before{content:"\f0a1"}.fa-bell:before{content:"\f0f3"}.fa-certificate:before{content:"\f0a3"}.fa-hand-o-right:before{content:"\f0a4"}.fa-hand-o-left:before{content:"\f0a5"}.fa-hand-o-up:before{content:"\f0a6"}.fa-hand-o-down:before{content:"\f0a7"}.fa-arrow-circle-left:before{content:"\f0a8"}.fa-arrow-circle-right:before{content:"\f0a9"}.fa-arrow-circle-up:before{content:"\f0aa"}.fa-arrow-circle-down:before{content:"\f0ab"}.fa-globe:before{content:"\f0ac"}.fa-wrench:before{content:"\f0ad"}.fa-tasks:before{content:"\f0ae"}.fa-filter:before{content:"\f0b0"}.fa-briefcase:before{content:"\f0b1"}.fa-arrows-alt:before{content:"\f0b2"}.fa-group:before,.fa-users:before{content:"\f0c0"}.fa-chain:before,.fa-link:before{content:"\f0c1"}.fa-cloud:before{content:"\f0c2"}.fa-flask:before{content:"\f0c3"}.fa-cut:before,.fa-scissors:before{content:"\f0c4"}.fa-copy:before,.fa-files-o:before{content:"\f0c5"}.fa-paperclip:before{content:"\f0c6"}.fa-save:before,.fa-floppy-o:before{content:"\f0c7"}.fa-square:before{content:"\f0c8"}.fa-navicon:before,.fa-reorder:before,.fa-bars:before{content:"\f0c9"}.fa-list-ul:before{content:"\f0ca"}.fa-list-ol:before{content:"\f0cb"}.fa-strikethrough:before{content:"\f0cc"}.fa-underline:before{content:"\f0cd"}.fa-table:before{content:"\f0ce"}.fa-magic:before{content:"\f0d0"}.fa-truck:before{content:"\f0d1"}.fa-pinterest:before{content:"\f0d2"}.fa-pinterest-square:before{content:"\f0d3"}.fa-google-plus-square:before{content:"\f0d4"}.fa-google-plus:before{content:"\f0d5"}.fa-money:before{content:"\f0d6"}.fa-caret-down:before{content:"\f0d7"}.fa-caret-up:before{content:"\f0d8"}.fa-caret-left:before{content:"\f0d9"}.fa-caret-right:before{content:"\f0da"}.fa-columns:before{content:"\f0db"}.fa-unsorted:before,.fa-sort:before{content:"\f0dc"}.fa-sort-down:before,.fa-sort-desc:before{content:"\f0dd"}.fa-sort-up:before,.fa-sort-asc:before{content:"\f0de"}.fa-envelope:before{content:"\f0e0"}.fa-linkedin:before{content:"\f0e1"}.fa-rotate-left:before,.fa-undo:before{content:"\f0e2"}.fa-legal:before,.fa-gavel:before{content:"\f0e3"}.fa-dashboard:before,.fa-tachometer:before{content:"\f0e4"}.fa-comment-o:before{content:"\f0e5"}.fa-comments-o:before{content:"\f0e6"}.fa-flash:before,.fa-bolt:before{content:"\f0e7"}.fa-sitemap:before{content:"\f0e8"}.fa-umbrella:before{content:"\f0e9"}.fa-paste:before,.fa-clipboard:before{content:"\f0ea"}.fa-lightbulb-o:before{content:"\f0eb"}.fa-exchange:before{content:"\f0ec"}.fa-cloud-download:before{content:"\f0ed"}.fa-cloud-upload:before{content:"\f0ee"}.fa-user-md:before{content:"\f0f0"}.fa-stethoscope:before{content:"\f0f1"}.fa-suitcase:before{content:"\f0f2"}.fa-bell-o:before{content:"\f0a2"}.fa-coffee:before{content:"\f0f4"}.fa-cutlery:before{content:"\f0f5"}.fa-file-text-o:before{content:"\f0f6"}.fa-building-o:before{content:"\f0f7"}.fa-hospital-o:before{content:"\f0f8"}.fa-ambulance:before{content:"\f0f9"}.fa-medkit:before{content:"\f0fa"}.fa-fighter-jet:before{content:"\f0fb"}.fa-beer:before{content:"\f0fc"}.fa-h-square:before{content:"\f0fd"}.fa-plus-square:before{content:"\f0fe"}.fa-angle-double-left:before{content:"\f100"}.fa-angle-double-right:before{content:"\f101"}.fa-angle-double-up:before{content:"\f102"}.fa-angle-double-down:before{content:"\f103"}.fa-angle-left:before{content:"\f104"}.fa-angle-right:before{content:"\f105"}.fa-angle-up:before{content:"\f106"}.fa-angle-down:before{content:"\f107"}.fa-desktop:before{content:"\f108"}.fa-laptop:before{content:"\f109"}.fa-tablet:before{content:"\f10a"}.fa-mobile-phone:before,.fa-mobile:before{content:"\f10b"}.fa-circle-o:before{content:"\f10c"}.fa-quote-left:before{content:"\f10d"}.fa-quote-right:before{content:"\f10e"}.fa-spinner:before{content:"\f110"}.fa-circle:before{content:"\f111"}.fa-mail-reply:before,.fa-reply:before{content:"\f112"}.fa-github-alt:before{content:"\f113"}.fa-folder-o:before{content:"\f114"}.fa-folder-open-o:before{content:"\f115"}.fa-smile-o:before{content:"\f118"}.fa-frown-o:before{content:"\f119"}.fa-meh-o:before{content:"\f11a"}.fa-gamepad:before{content:"\f11b"}.fa-keyboard-o:before{content:"\f11c"}.fa-flag-o:before{content:"\f11d"}.fa-flag-checkered:before{content:"\f11e"}.fa-terminal:before{content:"\f120"}.fa-code:before{content:"\f121"}.fa-mail-reply-all:before,.fa-reply-all:before{content:"\f122"}.fa-star-half-empty:before,.fa-star-half-full:before,.fa-star-half-o:before{content:"\f123"}.fa-location-arrow:before{content:"\f124"}.fa-crop:before{content:"\f125"}.fa-code-fork:before{content:"\f126"}.fa-unlink:before,.fa-chain-broken:before{content:"\f127"}.fa-question:before{content:"\f128"}.fa-info:before{content:"\f129"}.fa-exclamation:before{content:"\f12a"}.fa-superscript:before{content:"\f12b"}.fa-subscript:before{content:"\f12c"}.fa-eraser:before{content:"\f12d"}.fa-puzzle-piece:before{content:"\f12e"}.fa-microphone:before{content:"\f130"}.fa-microphone-slash:before{content:"\f131"}.fa-shield:before{content:"\f132"}.fa-calendar-o:before{content:"\f133"}.fa-fire-extinguisher:before{content:"\f134"}.fa-rocket:before{content:"\f135"}.fa-maxcdn:before{content:"\f136"}.fa-chevron-circle-left:before{content:"\f137"}.fa-chevron-circle-right:before{content:"\f138"}.fa-chevron-circle-up:before{content:"\f139"}.fa-chevron-circle-down:before{content:"\f13a"}.fa-html5:before{content:"\f13b"}.fa-css3:before{content:"\f13c"}.fa-anchor:before{content:"\f13d"}.fa-unlock-alt:before{content:"\f13e"}.fa-bullseye:before{content:"\f140"}.fa-ellipsis-h:before{content:"\f141"}.fa-ellipsis-v:before{content:"\f142"}.fa-rss-square:before{content:"\f143"}.fa-play-circle:before{content:"\f144"}.fa-ticket:before{content:"\f145"}.fa-minus-square:before{content:"\f146"}.fa-minus-square-o:before{content:"\f147"}.fa-level-up:before{content:"\f148"}.fa-level-down:before{content:"\f149"}.fa-check-square:before{content:"\f14a"}.fa-pencil-square:before{content:"\f14b"}.fa-external-link-square:before{content:"\f14c"}.fa-share-square:before{content:"\f14d"}.fa-compass:before{content:"\f14e"}.fa-toggle-down:before,.fa-caret-square-o-down:before{content:"\f150"}.fa-toggle-up:before,.fa-caret-square-o-up:before{content:"\f151"}.fa-toggle-right:before,.fa-caret-square-o-right:before{content:"\f152"}.fa-euro:before,.fa-eur:before{content:"\f153"}.fa-gbp:before{content:"\f154"}.fa-dollar:before,.fa-usd:before{content:"\f155"}.fa-rupee:before,.fa-inr:before{content:"\f156"}.fa-cny:before,.fa-rmb:before,.fa-yen:before,.fa-jpy:before{content:"\f157"}.fa-ruble:before,.fa-rouble:before,.fa-rub:before{content:"\f158"}.fa-won:before,.fa-krw:before{content:"\f159"}.fa-bitcoin:before,.fa-btc:before{content:"\f15a"}.fa-file:before{content:"\f15b"}.fa-file-text:before{content:"\f15c"}.fa-sort-alpha-asc:before{content:"\f15d"}.fa-sort-alpha-desc:before{content:"\f15e"}.fa-sort-amount-asc:before{content:"\f160"}.fa-sort-amount-desc:before{content:"\f161"}.fa-sort-numeric-asc:before{content:"\f162"}.fa-sort-numeric-desc:before{content:"\f163"}.fa-thumbs-up:before{content:"\f164"}.fa-thumbs-down:before{content:"\f165"}.fa-youtube-square:before{content:"\f166"}.fa-youtube:before{content:"\f167"}.fa-xing:before{content:"\f168"}.fa-xing-square:before{content:"\f169"}.fa-youtube-play:before{content:"\f16a"}.fa-dropbox:before{content:"\f16b"}.fa-stack-overflow:before{content:"\f16c"}.fa-instagram:before{content:"\f16d"}.fa-flickr:before{content:"\f16e"}.fa-adn:before{content:"\f170"}.fa-bitbucket:before{content:"\f171"}.fa-bitbucket-square:before{content:"\f172"}.fa-tumblr:before{content:"\f173"}.fa-tumblr-square:before{content:"\f174"}.fa-long-arrow-down:before{content:"\f175"}.fa-long-arrow-up:before{content:"\f176"}.fa-long-arrow-left:before{content:"\f177"}.fa-long-arrow-right:before{content:"\f178"}.fa-apple:before{content:"\f179"}.fa-windows:before{content:"\f17a"}.fa-android:before{content:"\f17b"}.fa-linux:before{content:"\f17c"}.fa-dribbble:before{content:"\f17d"}.fa-skype:before{content:"\f17e"}.fa-foursquare:before{content:"\f180"}.fa-trello:before{content:"\f181"}.fa-female:before{content:"\f182"}.fa-male:before{content:"\f183"}.fa-gittip:before,.fa-gratipay:before{content:"\f184"}.fa-sun-o:before{content:"\f185"}.fa-moon-o:before{content:"\f186"}.fa-archive:before{content:"\f187"}.fa-bug:before{content:"\f188"}.fa-vk:before{content:"\f189"}.fa-weibo:before{content:"\f18a"}.fa-renren:before{content:"\f18b"}.fa-pagelines:before{content:"\f18c"}.fa-stack-exchange:before{content:"\f18d"}.fa-arrow-circle-o-right:before{content:"\f18e"}.fa-arrow-circle-o-left:before{content:"\f190"}.fa-toggle-left:before,.fa-caret-square-o-left:before{content:"\f191"}.fa-dot-circle-o:before{content:"\f192"}.fa-wheelchair:before{content:"\f193"}.fa-vimeo-square:before{content:"\f194"}.fa-turkish-lira:before,.fa-try:before{content:"\f195"}.fa-plus-square-o:before{content:"\f196"}.fa-space-shuttle:before{content:"\f197"}.fa-slack:before{content:"\f198"}.fa-envelope-square:before{content:"\f199"}.fa-wordpress:before{content:"\f19a"}.fa-openid:before{content:"\f19b"}.fa-institution:before,.fa-bank:before,.fa-university:before{content:"\f19c"}.fa-mortar-board:before,.fa-graduation-cap:before{content:"\f19d"}.fa-yahoo:before{content:"\f19e"}.fa-google:before{content:"\f1a0"}.fa-reddit:before{content:"\f1a1"}.fa-reddit-square:before{content:"\f1a2"}.fa-stumbleupon-circle:before{content:"\f1a3"}.fa-stumbleupon:before{content:"\f1a4"}.fa-delicious:before{content:"\f1a5"}.fa-digg:before{content:"\f1a6"}.fa-pied-piper-pp:before{content:"\f1a7"}.fa-pied-piper-alt:before{content:"\f1a8"}.fa-drupal:before{content:"\f1a9"}.fa-joomla:before{content:"\f1aa"}.fa-language:before{content:"\f1ab"}.fa-fax:before{content:"\f1ac"}.fa-building:before{content:"\f1ad"}.fa-child:before{content:"\f1ae"}.fa-paw:before{content:"\f1b0"}.fa-spoon:before{content:"\f1b1"}.fa-cube:before{content:"\f1b2"}.fa-cubes:before{content:"\f1b3"}.fa-behance:before{content:"\f1b4"}.fa-behance-square:before{content:"\f1b5"}.fa-steam:before{content:"\f1b6"}.fa-steam-square:before{content:"\f1b7"}.fa-recycle:before{content:"\f1b8"}.fa-automobile:before,.fa-car:before{content:"\f1b9"}.fa-cab:before,.fa-taxi:before{content:"\f1ba"}.fa-tree:before{content:"\f1bb"}.fa-spotify:before{content:"\f1bc"}.fa-deviantart:before{content:"\f1bd"}.fa-soundcloud:before{content:"\f1be"}.fa-database:before{content:"\f1c0"}.fa-file-pdf-o:before{content:"\f1c1"}.fa-file-word-o:before{content:"\f1c2"}.fa-file-excel-o:before{content:"\f1c3"}.fa-file-powerpoint-o:before{content:"\f1c4"}.fa-file-photo-o:before,.fa-file-picture-o:before,.fa-file-image-o:before{content:"\f1c5"}.fa-file-zip-o:before,.fa-file-archive-o:before{content:"\f1c6"}.fa-file-sound-o:before,.fa-file-audio-o:before{content:"\f1c7"}.fa-file-movie-o:before,.fa-file-video-o:before{content:"\f1c8"}.fa-file-code-o:before{content:"\f1c9"}.fa-vine:before{content:"\f1ca"}.fa-codepen:before{content:"\f1cb"}.fa-jsfiddle:before{content:"\f1cc"}.fa-life-bouy:before,.fa-life-buoy:before,.fa-life-saver:before,.fa-support:before,.fa-life-ring:before{content:"\f1cd"}.fa-circle-o-notch:before{content:"\f1ce"}.fa-ra:before,.fa-resistance:before,.fa-rebel:before{content:"\f1d0"}.fa-ge:before,.fa-empire:before{content:"\f1d1"}.fa-git-square:before{content:"\f1d2"}.fa-git:before{content:"\f1d3"}.fa-y-combinator-square:before,.fa-yc-square:before,.fa-hacker-news:before{content:"\f1d4"}.fa-tencent-weibo:before{content:"\f1d5"}.fa-qq:before{content:"\f1d6"}.fa-wechat:before,.fa-weixin:before{content:"\f1d7"}.fa-send:before,.fa-paper-plane:before{content:"\f1d8"}.fa-send-o:before,.fa-paper-plane-o:before{content:"\f1d9"}.fa-history:before{content:"\f1da"}.fa-circle-thin:before{content:"\f1db"}.fa-header:before{content:"\f1dc"}.fa-paragraph:before{content:"\f1dd"}.fa-sliders:before{content:"\f1de"}.fa-share-alt:before{content:"\f1e0"}.fa-share-alt-square:before{content:"\f1e1"}.fa-bomb:before{content:"\f1e2"}.fa-soccer-ball-o:before,.fa-futbol-o:before{content:"\f1e3"}.fa-tty:before{content:"\f1e4"}.fa-binoculars:before{content:"\f1e5"}.fa-plug:before{content:"\f1e6"}.fa-slideshare:before{content:"\f1e7"}.fa-twitch:before{content:"\f1e8"}.fa-yelp:before{content:"\f1e9"}.fa-newspaper-o:before{content:"\f1ea"}.fa-wifi:before{content:"\f1eb"}.fa-calculator:before{content:"\f1ec"}.fa-paypal:before{content:"\f1ed"}.fa-google-wallet:before{content:"\f1ee"}.fa-cc-visa:before{content:"\f1f0"}.fa-cc-mastercard:before{content:"\f1f1"}.fa-cc-discover:before{content:"\f1f2"}.fa-cc-amex:before{content:"\f1f3"}.fa-cc-paypal:before{content:"\f1f4"}.fa-cc-stripe:before{content:"\f1f5"}.fa-bell-slash:before{content:"\f1f6"}.fa-bell-slash-o:before{content:"\f1f7"}.fa-trash:before{content:"\f1f8"}.fa-copyright:before{content:"\f1f9"}.fa-at:before{content:"\f1fa"}.fa-eyedropper:before{content:"\f1fb"}.fa-paint-brush:before{content:"\f1fc"}.fa-birthday-cake:before{content:"\f1fd"}.fa-area-chart:before{content:"\f1fe"}.fa-pie-chart:before{content:"\f200"}.fa-line-chart:before{content:"\f201"}.fa-lastfm:before{content:"\f202"}.fa-lastfm-square:before{content:"\f203"}.fa-toggle-off:before{content:"\f204"}.fa-toggle-on:before{content:"\f205"}.fa-bicycle:before{content:"\f206"}.fa-bus:before{content:"\f207"}.fa-ioxhost:before{content:"\f208"}.fa-angellist:before{content:"\f209"}.fa-cc:before{content:"\f20a"}.fa-shekel:before,.fa-sheqel:before,.fa-ils:before{content:"\f20b"}.fa-meanpath:before{content:"\f20c"}.fa-buysellads:before{content:"\f20d"}.fa-connectdevelop:before{content:"\f20e"}.fa-dashcube:before{content:"\f210"}.fa-forumbee:before{content:"\f211"}.fa-leanpub:before{content:"\f212"}.fa-sellsy:before{content:"\f213"}.fa-shirtsinbulk:before{content:"\f214"}.fa-simplybuilt:before{content:"\f215"}.fa-skyatlas:before{content:"\f216"}.fa-cart-plus:before{content:"\f217"}.fa-cart-arrow-down:before{content:"\f218"}.fa-diamond:before{content:"\f219"}.fa-ship:before{content:"\f21a"}.fa-user-secret:before{content:"\f21b"}.fa-motorcycle:before{content:"\f21c"}.fa-street-view:before{content:"\f21d"}.fa-heartbeat:before{content:"\f21e"}.fa-venus:before{content:"\f221"}.fa-mars:before{content:"\f222"}.fa-mercury:before{content:"\f223"}.fa-intersex:before,.fa-transgender:before{content:"\f224"}.fa-transgender-alt:before{content:"\f225"}.fa-venus-double:before{content:"\f226"}.fa-mars-double:before{content:"\f227"}.fa-venus-mars:before{content:"\f228"}.fa-mars-stroke:before{content:"\f229"}.fa-mars-stroke-v:before{content:"\f22a"}.fa-mars-stroke-h:before{content:"\f22b"}.fa-neuter:before{content:"\f22c"}.fa-genderless:before{content:"\f22d"}.fa-facebook-official:before{content:"\f230"}.fa-pinterest-p:before{content:"\f231"}.fa-whatsapp:before{content:"\f232"}.fa-server:before{content:"\f233"}.fa-user-plus:before{content:"\f234"}.fa-user-times:before{content:"\f235"}.fa-hotel:before,.fa-bed:before{content:"\f236"}.fa-viacoin:before{content:"\f237"}.fa-train:before{content:"\f238"}.fa-subway:before{content:"\f239"}.fa-medium:before{content:"\f23a"}.fa-yc:before,.fa-y-combinator:before{content:"\f23b"}.fa-optin-monster:before{content:"\f23c"}.fa-opencart:before{content:"\f23d"}.fa-expeditedssl:before{content:"\f23e"}.fa-battery-4:before,.fa-battery:before,.fa-battery-full:before{content:"\f240"}.fa-battery-3:before,.fa-battery-three-quarters:before{content:"\f241"}.fa-battery-2:before,.fa-battery-half:before{content:"\f242"}.fa-battery-1:before,.fa-battery-quarter:before{content:"\f243"}.fa-battery-0:before,.fa-battery-empty:before{content:"\f244"}.fa-mouse-pointer:before{content:"\f245"}.fa-i-cursor:before{content:"\f246"}.fa-object-group:before{content:"\f247"}.fa-object-ungroup:before{content:"\f248"}.fa-sticky-note:before{content:"\f249"}.fa-sticky-note-o:before{content:"\f24a"}.fa-cc-jcb:before{content:"\f24b"}.fa-cc-diners-club:before{content:"\f24c"}.fa-clone:before{content:"\f24d"}.fa-balance-scale:before{content:"\f24e"}.fa-hourglass-o:before{content:"\f250"}.fa-hourglass-1:before,.fa-hourglass-start:before{content:"\f251"}.fa-hourglass-2:before,.fa-hourglass-half:before{content:"\f252"}.fa-hourglass-3:before,.fa-hourglass-end:before{content:"\f253"}.fa-hourglass:before{content:"\f254"}.fa-hand-grab-o:before,.fa-hand-rock-o:before{content:"\f255"}.fa-hand-stop-o:before,.fa-hand-paper-o:before{content:"\f256"}.fa-hand-scissors-o:before{content:"\f257"}.fa-hand-lizard-o:before{content:"\f258"}.fa-hand-spock-o:before{content:"\f259"}.fa-hand-pointer-o:before{content:"\f25a"}.fa-hand-peace-o:before{content:"\f25b"}.fa-trademark:before{content:"\f25c"}.fa-registered:before{content:"\f25d"}.fa-creative-commons:before{content:"\f25e"}.fa-gg:before{content:"\f260"}.fa-gg-circle:before{content:"\f261"}.fa-tripadvisor:before{content:"\f262"}.fa-odnoklassniki:before{content:"\f263"}.fa-odnoklassniki-square:before{content:"\f264"}.fa-get-pocket:before{content:"\f265"}.fa-wikipedia-w:before{content:"\f266"}.fa-safari:before{content:"\f267"}.fa-chrome:before{content:"\f268"}.fa-firefox:before{content:"\f269"}.fa-opera:before{content:"\f26a"}.fa-internet-explorer:before{content:"\f26b"}.fa-tv:before,.fa-television:before{content:"\f26c"}.fa-contao:before{content:"\f26d"}.fa-500px:before{content:"\f26e"}.fa-amazon:before{content:"\f270"}.fa-calendar-plus-o:before{content:"\f271"}.fa-calendar-minus-o:before{content:"\f272"}.fa-calendar-times-o:before{content:"\f273"}.fa-calendar-check-o:before{content:"\f274"}.fa-industry:before{content:"\f275"}.fa-map-pin:before{content:"\f276"}.fa-map-signs:before{content:"\f277"}.fa-map-o:before{content:"\f278"}.fa-map:before{content:"\f279"}.fa-commenting:before{content:"\f27a"}.fa-commenting-o:before{content:"\f27b"}.fa-houzz:before{content:"\f27c"}.fa-vimeo:before{content:"\f27d"}.fa-black-tie:before{content:"\f27e"}.fa-fonticons:before{content:"\f280"}.fa-reddit-alien:before{content:"\f281"}.fa-edge:before{content:"\f282"}.fa-credit-card-alt:before{content:"\f283"}.fa-codiepie:before{content:"\f284"}.fa-modx:before{content:"\f285"}.fa-fort-awesome:before{content:"\f286"}.fa-usb:before{content:"\f287"}.fa-product-hunt:before{content:"\f288"}.fa-mixcloud:before{content:"\f289"}.fa-scribd:before{content:"\f28a"}.fa-pause-circle:before{content:"\f28b"}.fa-pause-circle-o:before{content:"\f28c"}.fa-stop-circle:before{content:"\f28d"}.fa-stop-circle-o:before{content:"\f28e"}.fa-shopping-bag:before{content:"\f290"}.fa-shopping-basket:before{content:"\f291"}.fa-hashtag:before{content:"\f292"}.fa-bluetooth:before{content:"\f293"}.fa-bluetooth-b:before{content:"\f294"}.fa-percent:before{content:"\f295"}.fa-gitlab:before{content:"\f296"}.fa-wpbeginner:before{content:"\f297"}.fa-wpforms:before{content:"\f298"}.fa-envira:before{content:"\f299"}.fa-universal-access:before{content:"\f29a"}.fa-wheelchair-alt:before{content:"\f29b"}.fa-question-circle-o:before{content:"\f29c"}.fa-blind:before{content:"\f29d"}.fa-audio-description:before{content:"\f29e"}.fa-volume-control-phone:before{content:"\f2a0"}.fa-braille:before{content:"\f2a1"}.fa-assistive-listening-systems:before{content:"\f2a2"}.fa-asl-interpreting:before,.fa-american-sign-language-interpreting:before{content:"\f2a3"}.fa-deafness:before,.fa-hard-of-hearing:before,.fa-deaf:before{content:"\f2a4"}.fa-glide:before{content:"\f2a5"}.fa-glide-g:before{content:"\f2a6"}.fa-signing:before,.fa-sign-language:before{content:"\f2a7"}.fa-low-vision:before{content:"\f2a8"}.fa-viadeo:before{content:"\f2a9"}.fa-viadeo-square:before{content:"\f2aa"}.fa-snapchat:before{content:"\f2ab"}.fa-snapchat-ghost:before{content:"\f2ac"}.fa-snapchat-square:before{content:"\f2ad"}.fa-pied-piper:before{content:"\f2ae"}.fa-first-order:before{content:"\f2b0"}.fa-yoast:before{content:"\f2b1"}.fa-themeisle:before{content:"\f2b2"}.fa-google-plus-circle:before,.fa-google-plus-official:before{content:"\f2b3"}.fa-fa:before,.fa-font-awesome:before{content:"\f2b4"}.fa-handshake-o:before{content:"\f2b5"}.fa-envelope-open:before{content:"\f2b6"}.fa-envelope-open-o:before{content:"\f2b7"}.fa-linode:before{content:"\f2b8"}.fa-address-book:before{content:"\f2b9"}.fa-address-book-o:before{content:"\f2ba"}.fa-vcard:before,.fa-address-card:before{content:"\f2bb"}.fa-vcard-o:before,.fa-address-card-o:before{content:"\f2bc"}.fa-user-circle:before{content:"\f2bd"}.fa-user-circle-o:before{content:"\f2be"}.fa-user-o:before{content:"\f2c0"}.fa-id-badge:before{content:"\f2c1"}.fa-drivers-license:before,.fa-id-card:before{content:"\f2c2"}.fa-drivers-license-o:before,.fa-id-card-o:before{content:"\f2c3"}.fa-quora:before{content:"\f2c4"}.fa-free-code-camp:before{content:"\f2c5"}.fa-telegram:before{content:"\f2c6"}.fa-thermometer-4:before,.fa-thermometer:before,.fa-thermometer-full:before{content:"\f2c7"}.fa-thermometer-3:before,.fa-thermometer-three-quarters:before{content:"\f2c8"}.fa-thermometer-2:before,.fa-thermometer-half:before{content:"\f2c9"}.fa-thermometer-1:before,.fa-thermometer-quarter:before{content:"\f2ca"}.fa-thermometer-0:before,.fa-thermometer-empty:before{content:"\f2cb"}.fa-shower:before{content:"\f2cc"}.fa-bathtub:before,.fa-s15:before,.fa-bath:before{content:"\f2cd"}.fa-podcast:before{content:"\f2ce"}.fa-window-maximize:before{content:"\f2d0"}.fa-window-minimize:before{content:"\f2d1"}.fa-window-restore:before{content:"\f2d2"}.fa-times-rectangle:before,.fa-window-close:before{content:"\f2d3"}.fa-times-rectangle-o:before,.fa-window-close-o:before{content:"\f2d4"}.fa-bandcamp:before{content:"\f2d5"}.fa-grav:before{content:"\f2d6"}.fa-etsy:before{content:"\f2d7"}.fa-imdb:before{content:"\f2d8"}.fa-ravelry:before{content:"\f2d9"}.fa-eercast:before{content:"\f2da"}.fa-microchip:before{content:"\f2db"}.fa-snowflake-o:before{content:"\f2dc"}.fa-superpowers:before{content:"\f2dd"}.fa-wpexplorer:before{content:"\f2de"}.fa-meetup:before{content:"\f2e0"}.sr-only{position:absolute;width:1px;height:1px;padding:0;margin:-1px;overflow:hidden;clip:rect(0, 0, 0, 0);border:0}.sr-only-focusable:active,.sr-only-focusable:focus{position:static;width:auto;height:auto;margin:0;overflow:visible;clip:auto} diff --git a/app/web/asset/css/global.css b/app/web/asset/css/global.css new file mode 100644 index 0000000000000000000000000000000000000000..9e2ab9801b72167128f68603a5709173eaccad62 --- /dev/null +++ b/app/web/asset/css/global.css @@ -0,0 +1,29 @@ +* { + padding: 0; + margin: 0; + outline: none; + box-sizing: border-box; +} +html, body{ + height: 100%; +} + +a { + color: #3c8dbc; + text-decoration: none; +} + +-webkit-scrollbar { + width: 4px; + background-color: #F5F5F5; +} + +-webkit-scrollbar-track { + box-shadow: inset 0 0 6px rgba(0, 0, 0, 0.3); + background-color: #F5F5F5; +} + +-webkit-scrollbar-thumb { + box-shadow: inset 0 0 6px rgba(0, 0, 0, .3); + background-color: #3e8dbb; +} \ No newline at end of file diff --git a/app/web/asset/fonts/FontAwesome.otf b/app/web/asset/fonts/FontAwesome.otf new file mode 100644 index 0000000000000000000000000000000000000000..401ec0f36e4f73b8efa40bd6f604fe80d286db70 Binary files /dev/null and b/app/web/asset/fonts/FontAwesome.otf differ diff --git a/app/web/asset/fonts/fontawesome-webfont.eot b/app/web/asset/fonts/fontawesome-webfont.eot new file mode 100644 index 0000000000000000000000000000000000000000..e9f60ca953f93e35eab4108bd414bc02ddcf3928 Binary files /dev/null and b/app/web/asset/fonts/fontawesome-webfont.eot differ diff --git a/app/web/asset/fonts/fontawesome-webfont.svg b/app/web/asset/fonts/fontawesome-webfont.svg new file mode 100644 index 0000000000000000000000000000000000000000..855c845e538b65548118279537a04eab2ec6ef0d --- /dev/null +++ b/app/web/asset/fonts/fontawesome-webfont.svg @@ -0,0 +1,2671 @@ + + + + +Created by FontForge 20120731 at Mon Oct 24 17:37:40 2016 + By ,,, +Copyright Dave Gandy 2016. All rights reserved. + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + diff --git a/app/web/asset/fonts/fontawesome-webfont.ttf b/app/web/asset/fonts/fontawesome-webfont.ttf new file mode 100644 index 0000000000000000000000000000000000000000..35acda2fa1196aad98c2adf4378a7611dd713aa3 Binary files /dev/null and b/app/web/asset/fonts/fontawesome-webfont.ttf differ diff --git a/app/web/asset/fonts/fontawesome-webfont.woff b/app/web/asset/fonts/fontawesome-webfont.woff new file mode 100644 index 0000000000000000000000000000000000000000..400014a4b06eee3d0c0d54402a47ab2601b2862b Binary files /dev/null and b/app/web/asset/fonts/fontawesome-webfont.woff differ diff --git a/app/web/asset/fonts/fontawesome-webfont.woff2 b/app/web/asset/fonts/fontawesome-webfont.woff2 new file mode 100644 index 0000000000000000000000000000000000000000..4d13fc60404b91e398a37200c4a77b645cfd9586 Binary files /dev/null and b/app/web/asset/fonts/fontawesome-webfont.woff2 differ diff --git a/app/web/asset/fonts/glyphicons-halflings-regular.eot b/app/web/asset/fonts/glyphicons-halflings-regular.eot new file mode 100755 index 0000000000000000000000000000000000000000..b93a4953fff68df523aa7656497ee339d6026d64 Binary files /dev/null and b/app/web/asset/fonts/glyphicons-halflings-regular.eot differ diff --git a/app/web/asset/fonts/glyphicons-halflings-regular.svg b/app/web/asset/fonts/glyphicons-halflings-regular.svg new file mode 100755 index 0000000000000000000000000000000000000000..94fb5490a2ed10b2c69a4a567a4fd2e4f706d841 --- /dev/null +++ b/app/web/asset/fonts/glyphicons-halflings-regular.svg @@ -0,0 +1,288 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + \ No newline at end of file diff --git a/app/web/asset/fonts/glyphicons-halflings-regular.ttf b/app/web/asset/fonts/glyphicons-halflings-regular.ttf new file mode 100755 index 0000000000000000000000000000000000000000..1413fc609ab6f21774de0cb7e01360095584f65b Binary files /dev/null and b/app/web/asset/fonts/glyphicons-halflings-regular.ttf differ diff --git a/app/web/asset/fonts/glyphicons-halflings-regular.woff b/app/web/asset/fonts/glyphicons-halflings-regular.woff new file mode 100755 index 0000000000000000000000000000000000000000..9e612858f802245ddcbf59788a0db942224bab35 Binary files /dev/null and b/app/web/asset/fonts/glyphicons-halflings-regular.woff differ diff --git a/app/web/asset/fonts/glyphicons-halflings-regular.woff2 b/app/web/asset/fonts/glyphicons-halflings-regular.woff2 new file mode 100755 index 0000000000000000000000000000000000000000..64539b54c3751a6d9adb44c8e3a45ba5a73b77f0 Binary files /dev/null and b/app/web/asset/fonts/glyphicons-halflings-regular.woff2 differ diff --git a/app/web/asset/images/egg-vue-webpack-dev.png b/app/web/asset/images/egg-vue-webpack-dev.png new file mode 100644 index 0000000000000000000000000000000000000000..0ef4ddd21a4fed1d7731208d067d8eabe0c7b84f Binary files /dev/null and b/app/web/asset/images/egg-vue-webpack-dev.png differ diff --git a/app/web/asset/images/favicon.ico b/app/web/asset/images/favicon.ico new file mode 100644 index 0000000000000000000000000000000000000000..e70edfda7e6e0e8e705028adc1a6943b3f7828e6 Binary files /dev/null and b/app/web/asset/images/favicon.ico differ diff --git a/app/web/asset/images/loading.gif b/app/web/asset/images/loading.gif new file mode 100755 index 0000000000000000000000000000000000000000..e99cda9fcd0996d2eafe5a7b9317b8d23058d173 Binary files /dev/null and b/app/web/asset/images/loading.gif differ diff --git a/app/web/asset/images/logo.png b/app/web/asset/images/logo.png new file mode 100644 index 0000000000000000000000000000000000000000..ed92d85058cedd7e3971c3ee7349f05271721e15 Binary files /dev/null and b/app/web/asset/images/logo.png differ diff --git a/app/web/component/MarkdownEditor/index.vue b/app/web/component/MarkdownEditor/index.vue new file mode 100644 index 0000000000000000000000000000000000000000..69ea122f1475a5b1782329033c8c3079a6e5aabe --- /dev/null +++ b/app/web/component/MarkdownEditor/index.vue @@ -0,0 +1,116 @@ + + + + + diff --git a/app/web/component/layout/admin/content/content.css b/app/web/component/layout/admin/content/content.css new file mode 100644 index 0000000000000000000000000000000000000000..70afeb19e6e691ff259d77a33fb80b17e13cd961 --- /dev/null +++ b/app/web/component/layout/admin/content/content.css @@ -0,0 +1,155 @@ +.main{ + margin-top: -80px; + padding: 80px 0 120px; + box-sizing: border-box; +} +.page-container{ + width: 1140px; + padding: 0 30px; + margin: 36 auto; +} +.page-component { + padding-bottom: 95px; + box-sizing: border-box +} + +.page-component .content { + margin-left: -1px +} + +.page-component .content > h3 { + margin: 45px 0 15px +} + +.page-component .content > table { + border-collapse: collapse; + width: 100%; + background-color: #fff; + color: #5e6d82; + font-size: 14px; + margin-bottom: 45px +} + +.page-component .content > table strong { + font-weight: 400 +} + +.page-component .content > table th { + text-align: left; + border-top: 1px solid #eaeefb; + background-color: #eff2f7; + white-space: nowrap +} + +.page-component .content > table td, .page-component .content > table th { + border-bottom: 1px solid #eaeefb; + padding: 10px; + max-width: 250px +} + +.page-component .content > table td:first-child, .page-component .content > table th:first-child { + padding-left: 10px +} + +.page-component .page-component-up { + background-color: #58b7ff; + position: fixed; + right: 100px; + bottom: 150px; + width: 50px; + height: 50px; + border-radius: 25px; + cursor: pointer; + opacity: .4; + transition: .3s +} + +.page-component .page-component-up i { + color: #fff; + display: block; + line-height: 50px; + text-align: center; + font-size: 22px +} + +.page-component .page-component-up.hover { + opacity: 1 +} + +.page-component .back-top-fade-enter, .page-component .back-top-fade-leave-active { + transform: translateY(-30px); + opacity: 0 +} + +.page-component { + padding-bottom: 95px; + box-sizing: border-box +} + +.page-component .content { + margin-left: -1px +} + +.page-component .content > h3 { + margin: 45px 0 15px +} + +.page-component .content > table { + border-collapse: collapse; + width: 100%; + background-color: #fff; + color: #5e6d82; + font-size: 14px; + margin-bottom: 45px +} + +.page-component .content > table strong { + font-weight: 400 +} + +.page-component .content > table th { + text-align: left; + border-top: 1px solid #eaeefb; + background-color: #eff2f7; + white-space: nowrap +} + +.page-component .content > table td, .page-component .content > table th { + border-bottom: 1px solid #eaeefb; + padding: 10px; + max-width: 250px +} + +.page-component .content > table td:first-child, .page-component .content > table th:first-child { + padding-left: 10px +} + +.page-component .page-component-up { + background-color: #58b7ff; + position: fixed; + right: 100px; + bottom: 150px; + width: 50px; + height: 50px; + border-radius: 25px; + cursor: pointer; + opacity: .4; + transition: .3s +} + +.page-component .page-component-up i { + color: #fff; + display: block; + line-height: 50px; + text-align: center; + font-size: 22px +} + +.page-component .page-component-up.hover { + opacity: 1 +} + +.page-component .back-top-fade-enter, .page-component .back-top-fade-leave-active { + transform: translateY(-30px); + opacity: 0 +} \ No newline at end of file diff --git a/app/web/component/layout/admin/content/content.vue b/app/web/component/layout/admin/content/content.vue new file mode 100644 index 0000000000000000000000000000000000000000..b430645e21f2a6977a8318ea354c7bea09023d4d --- /dev/null +++ b/app/web/component/layout/admin/content/content.vue @@ -0,0 +1,24 @@ + + + diff --git a/app/web/component/layout/admin/footer/footer.css b/app/web/component/layout/admin/footer/footer.css new file mode 100644 index 0000000000000000000000000000000000000000..0085b33eab30ac25b53b58055e84f55f6cc965d6 --- /dev/null +++ b/app/web/component/layout/admin/footer/footer.css @@ -0,0 +1,143 @@ +.footer { + height: 120px; + background-color: #324057; + color: #a4aebd; + width: 100%; +} + +.footer * { + word-spacing: 0 +} + +.footer .container { + height: 100%; + box-sizing: border-box +} + +.footer .footer-main { + font-size: 0; + padding-top: 40px; + display: inline-block +} + +.footer .footer-main .footer-main-title { + line-height: 1; + font-size: 22px; + margin: 0 +} + +.footer .footer-main .footer-main-link { + display: inline-block; + margin: 12px 18px 0 0; + line-height: 1; + font-size: 12px; + color: #768193 +} + +.footer .footer-main .footer-main-link a { + color: #768193; + text-decoration: none +} + +.footer .footer-social { + float: right; + line-height: 120px +} + +.footer .footer-social .elementdoc { + transition: .3s; + display: inline-block; + line-height: 32px; + text-align: center; + color: #8d99ab; + background-color: transparent; + width: 32px; + height: 32px; + font-size: 32px; + vertical-align: middle +} + +.footer .footer-social .elementdoc:hover { + transform: scale(1.2) +} + +.footer .footer-social .doc-icon-weixin { + margin-right: 36px +} + +.footer .footer-social .doc-icon-weixin:hover { + color: #fff +} + +.footer .footer-social .doc-icon-github { + margin-right: 0 +} + +.footer .footer-social .doc-icon-github:hover { + color: #fff +} + +.footer-popover { + padding: 0; + min-width: 120px; + line-height: normal; + box-shadow: 0 0 11px 0 rgba(174, 187, 211, .24) +} + +.footer-popover .footer-popover-title { + border-bottom: 1px solid #eaeefb; + height: 30px; + line-height: 30px; + text-align: center; + color: #99a9bf; + background-color: #f8f9fe +} + +.footer-popover img { + width: 100px; + height: 100px; + margin: 10px +} + +@media (max-width: 768px) { + .footer .footer-social { + display: none + } +} + +.footer-nav { + padding: 24px 0; + color: #99a9bf; + font-size: 14px +} + +.footer-nav:after { + content: ""; + display: block; + clear: both +} + +.footer-nav i { + transition: .3s; + color: #d9def1; + vertical-align: baseline +} + +.footer-nav-link { + cursor: pointer; + transition: .3s +} + +.footer-nav-link:hover, .footer-nav-link:hover i { + color: #20a0ff +} + +.footer-nav-left { + float: left; + margin-left: -4px +} + +.footer-nav-right { + float: right; + margin-right: -4px +} \ No newline at end of file diff --git a/app/web/component/layout/admin/footer/footer.vue b/app/web/component/layout/admin/footer/footer.vue new file mode 100644 index 0000000000000000000000000000000000000000..9f576058096fcd2ab52a993a76999c7cbd702f80 --- /dev/null +++ b/app/web/component/layout/admin/footer/footer.vue @@ -0,0 +1,18 @@ + + + diff --git a/app/web/component/layout/admin/header/header.css b/app/web/component/layout/admin/header/header.css new file mode 100644 index 0000000000000000000000000000000000000000..9bd87c8df39402ac175c151c8a6b1196810bac98 --- /dev/null +++ b/app/web/component/layout/admin/header/header.css @@ -0,0 +1,63 @@ +.admin-header { + width: 100%; + position: fixed; + display: flex; + height: 50px; + background-color: #3c8dbc; + z-index: 10; +} +.admin-header .admin-logo { + height: 50px; + text-align: center; + line-height: 50px; + color: #fff; + background-color: #367fa9; + -webkit-transition: width 0.35s; + transition: width 0.35s; +} + +.admin-header .admin-logo .admin-big { + width: 230px; + display: block; +} +.admin-header .admin-logo .admin-min { + width: 64px; + display: block; +} +.admin-header .right { + position: absolute; + right: 0; +} + +.admin-header .admin-header-btn { + overflow: hidden; + height: 50px; + display: inline-block; + text-align: center; + line-height: 50px; + cursor: pointer; + padding: 0 14px; + color: #fff; +} + +.admin-header .admin-header-btn:hover { + background-color: #367fa9 +} + +.admin-header .admin-header-btn .el-badge__content { + top: 14px; + right: 7px; + text-align: center; + font-size: 9px; + padding: 0 3px; + background-color: #00a65a; + color: #fff; + border: none; + white-space: nowrap; + vertical-align: baseline; + border-radius: .25em; +} + +.admin-menu { + border-right: none; +} \ No newline at end of file diff --git a/app/web/component/layout/admin/header/header.vue b/app/web/component/layout/admin/header/header.vue new file mode 100644 index 0000000000000000000000000000000000000000..fa8dcfeb1cbb73250c78f5496a4ac064250b98cf --- /dev/null +++ b/app/web/component/layout/admin/header/header.vue @@ -0,0 +1,81 @@ + + diff --git a/app/web/component/layout/admin/index.css b/app/web/component/layout/admin/index.css new file mode 100644 index 0000000000000000000000000000000000000000..62d96516ea14978df68b951b9bc61e4743a44d2d --- /dev/null +++ b/app/web/component/layout/admin/index.css @@ -0,0 +1,28 @@ +.admin .search { + margin-top: 8px; + margin-bottom: 16px; +} +.admin label { + padding-left: 8px; + padding-right: 8px; + color: #878d99 +} + +.admin .search-input{ + max-width: 200px; +} +.admin .search-button{ + margin-left: 16px; +} +.admin .add-button{ + float:right; + margin-right: 16px; +} + +.admin .long-input { + max-width: 75%; +} + +.admin .top16 { + margin-top: 16px; +} \ No newline at end of file diff --git a/app/web/component/layout/admin/index.js b/app/web/component/layout/admin/index.js new file mode 100644 index 0000000000000000000000000000000000000000..eb56124a6fb6f98b8069b757b7c7722c6d52f7d3 --- /dev/null +++ b/app/web/component/layout/admin/index.js @@ -0,0 +1,7 @@ +import Vue from 'vue'; +import MainLayout from './main.vue'; +import '../../../asset/css/global.css'; +import './index.css'; +import createLayout from '../layout'; +const tpl = '
'; +export default createLayout('Layout', { MainLayout }, tpl); diff --git a/app/web/component/layout/admin/main.vue b/app/web/component/layout/admin/main.vue new file mode 100644 index 0000000000000000000000000000000000000000..93fe5ef9fb273572b4a8d70abe11904447fc87f9 --- /dev/null +++ b/app/web/component/layout/admin/main.vue @@ -0,0 +1,41 @@ + + + diff --git a/app/web/component/layout/admin/menu/index.js b/app/web/component/layout/admin/menu/index.js new file mode 100644 index 0000000000000000000000000000000000000000..46f2c34b39461aea271135fff2dfb33b1a06967a --- /dev/null +++ b/app/web/component/layout/admin/menu/index.js @@ -0,0 +1,25 @@ +const menu = { + home: { + name: 'menu.home', + path: '/', + icon: 'el-icon-menu', + }, + content: { + name: 'menu.articlemanage', + icon: 'el-icon-document', + children: { + list: { + name: 'menu.articlequery', + icon: 'el-icon-edit-outline', + path: '/article/list' + }, + add: { + name: 'menu.articleadd', + icon: 'el-icon-edit-outline', + path: '/article/add' + } + } + } +}; + +export default menu; \ No newline at end of file diff --git a/app/web/component/layout/admin/menu/index.vue b/app/web/component/layout/admin/menu/index.vue new file mode 100644 index 0000000000000000000000000000000000000000..63b3e1d655f8e1a8ddc1898897e49d49a52cfad1 --- /dev/null +++ b/app/web/component/layout/admin/menu/index.vue @@ -0,0 +1,55 @@ + + + + \ No newline at end of file diff --git a/app/web/component/layout/default.js b/app/web/component/layout/default.js new file mode 100644 index 0000000000000000000000000000000000000000..f09bf50ec40b53cd2553ac0371381b68c23b00ae --- /dev/null +++ b/app/web/component/layout/default.js @@ -0,0 +1,6 @@ +import Vue from 'vue'; +import MainLayout from './main.vue'; +import '../../asset/css/global.css'; +import createLayout from './layout'; +const tpl = '
'; +export default createLayout('Layout', { }, tpl); \ No newline at end of file diff --git a/app/web/component/layout/index/content/content.css b/app/web/component/layout/index/content/content.css new file mode 100644 index 0000000000000000000000000000000000000000..70afeb19e6e691ff259d77a33fb80b17e13cd961 --- /dev/null +++ b/app/web/component/layout/index/content/content.css @@ -0,0 +1,155 @@ +.main{ + margin-top: -80px; + padding: 80px 0 120px; + box-sizing: border-box; +} +.page-container{ + width: 1140px; + padding: 0 30px; + margin: 36 auto; +} +.page-component { + padding-bottom: 95px; + box-sizing: border-box +} + +.page-component .content { + margin-left: -1px +} + +.page-component .content > h3 { + margin: 45px 0 15px +} + +.page-component .content > table { + border-collapse: collapse; + width: 100%; + background-color: #fff; + color: #5e6d82; + font-size: 14px; + margin-bottom: 45px +} + +.page-component .content > table strong { + font-weight: 400 +} + +.page-component .content > table th { + text-align: left; + border-top: 1px solid #eaeefb; + background-color: #eff2f7; + white-space: nowrap +} + +.page-component .content > table td, .page-component .content > table th { + border-bottom: 1px solid #eaeefb; + padding: 10px; + max-width: 250px +} + +.page-component .content > table td:first-child, .page-component .content > table th:first-child { + padding-left: 10px +} + +.page-component .page-component-up { + background-color: #58b7ff; + position: fixed; + right: 100px; + bottom: 150px; + width: 50px; + height: 50px; + border-radius: 25px; + cursor: pointer; + opacity: .4; + transition: .3s +} + +.page-component .page-component-up i { + color: #fff; + display: block; + line-height: 50px; + text-align: center; + font-size: 22px +} + +.page-component .page-component-up.hover { + opacity: 1 +} + +.page-component .back-top-fade-enter, .page-component .back-top-fade-leave-active { + transform: translateY(-30px); + opacity: 0 +} + +.page-component { + padding-bottom: 95px; + box-sizing: border-box +} + +.page-component .content { + margin-left: -1px +} + +.page-component .content > h3 { + margin: 45px 0 15px +} + +.page-component .content > table { + border-collapse: collapse; + width: 100%; + background-color: #fff; + color: #5e6d82; + font-size: 14px; + margin-bottom: 45px +} + +.page-component .content > table strong { + font-weight: 400 +} + +.page-component .content > table th { + text-align: left; + border-top: 1px solid #eaeefb; + background-color: #eff2f7; + white-space: nowrap +} + +.page-component .content > table td, .page-component .content > table th { + border-bottom: 1px solid #eaeefb; + padding: 10px; + max-width: 250px +} + +.page-component .content > table td:first-child, .page-component .content > table th:first-child { + padding-left: 10px +} + +.page-component .page-component-up { + background-color: #58b7ff; + position: fixed; + right: 100px; + bottom: 150px; + width: 50px; + height: 50px; + border-radius: 25px; + cursor: pointer; + opacity: .4; + transition: .3s +} + +.page-component .page-component-up i { + color: #fff; + display: block; + line-height: 50px; + text-align: center; + font-size: 22px +} + +.page-component .page-component-up.hover { + opacity: 1 +} + +.page-component .back-top-fade-enter, .page-component .back-top-fade-leave-active { + transform: translateY(-30px); + opacity: 0 +} \ No newline at end of file diff --git a/app/web/component/layout/index/content/content.vue b/app/web/component/layout/index/content/content.vue new file mode 100644 index 0000000000000000000000000000000000000000..a132fd13d89990294dd7ddc56fe8ce34418c5a63 --- /dev/null +++ b/app/web/component/layout/index/content/content.vue @@ -0,0 +1,22 @@ + + + diff --git a/app/web/component/layout/index/footer/footer.css b/app/web/component/layout/index/footer/footer.css new file mode 100644 index 0000000000000000000000000000000000000000..e69de29bb2d1d6434b8b29ae775ad8c2e48c5391 diff --git a/app/web/component/layout/index/footer/footer.vue b/app/web/component/layout/index/footer/footer.vue new file mode 100644 index 0000000000000000000000000000000000000000..4c01bac7577cc5712baeebea7ec296e83141f35c --- /dev/null +++ b/app/web/component/layout/index/footer/footer.vue @@ -0,0 +1,31 @@ + + + diff --git a/app/web/component/layout/index/header/header.css b/app/web/component/layout/index/header/header.css new file mode 100644 index 0000000000000000000000000000000000000000..6d7bb728860d037f9fb4780b34d97f13d0185e81 --- /dev/null +++ b/app/web/component/layout/index/header/header.css @@ -0,0 +1,54 @@ +.header { + width: 100%; + position: fixed; + display: flex; + height: 50px; + background-color: #3c8dbc; + z-index: 10; +} +.header .logo { + width: 230px; + height: 50px; + text-align: center; + line-height: 50px; + color: #fff; + background-color: #367fa9; + -webkit-transition: width 0.35s; + transition: width 0.35s; +} +.header .logo .min { + display: none; +} +.header .right { + position: absolute; + right: 0; +} +.header .header-btn { + overflow: hidden; + height: 50px; + display: inline-block; + text-align: center; + line-height: 50px; + cursor: pointer; + padding: 0 14px; + color: #fff; +} +.header .header-btn .el-badge__content { + top: 14px; + right: 7px; + text-align: center; + font-size: 9px; + padding: 0 3px; + background-color: #00a65a; + color: #fff; + border: none; + white-space: nowrap; + vertical-align: baseline; + border-radius: .25em; +} +.header .header-btn:hover { + background-color: #367fa9; +} +.menu { + border-right: none; +} diff --git a/app/web/component/layout/index/header/header.vue b/app/web/component/layout/index/header/header.vue new file mode 100644 index 0000000000000000000000000000000000000000..91c2289612cac7f21684923d3c551480456e6fd2 --- /dev/null +++ b/app/web/component/layout/index/header/header.vue @@ -0,0 +1,61 @@ + + diff --git a/app/web/component/layout/index/index.js b/app/web/component/layout/index/index.js new file mode 100644 index 0000000000000000000000000000000000000000..555364e59b040e625e0f6fe8a13822763b104c90 --- /dev/null +++ b/app/web/component/layout/index/index.js @@ -0,0 +1,6 @@ +import Vue from 'vue'; +import MainLayout from './main.vue'; +import '../../../asset/css/bootstrap.css'; +import '../../../asset/css/blog.css'; +import createLayout from '../layout'; +export default createLayout('Layout', { MainLayout }, '
'); diff --git a/app/web/component/layout/index/main.vue b/app/web/component/layout/index/main.vue new file mode 100644 index 0000000000000000000000000000000000000000..da00aa131374abc70b1dd4c92717bcf2f8246f87 --- /dev/null +++ b/app/web/component/layout/index/main.vue @@ -0,0 +1,20 @@ + + + diff --git a/app/web/component/layout/layout.js b/app/web/component/layout/layout.js new file mode 100644 index 0000000000000000000000000000000000000000..67f9408d6f29fe645744f12a4c161758ae761862 --- /dev/null +++ b/app/web/component/layout/layout.js @@ -0,0 +1,50 @@ +import Vue from 'vue'; +export default function createLayout(name, components, tpl) { + return { + name, + props: ['title', 'description', 'keywords'], + components, + computed: { + vTitle() { + return this.$root.title || this.title || 'IBlog'; + }, + vKeywords() { + return this.$root.keywords || this.keywords || 'egg, typescript, vue, webpack, server side render'; + }, + vDescription() { + return this.$root.description || this.description || 'IBlog'; + }, + baseClass() { + return this.$root.baseClass; + } + }, + template: EASY_ENV_IS_BROWSER ? tpl : ` + + + {{vTitle}} + + + + + + + + + + + + + + + + + + + ${tpl} + + `, + install(vue, options) { + // + } + }; +} diff --git a/app/web/framework/entry/template.js b/app/web/framework/entry/template.js new file mode 100644 index 0000000000000000000000000000000000000000..347d8400fa8c07f7d0497487eb7bf478666e86ae --- /dev/null +++ b/app/web/framework/entry/template.js @@ -0,0 +1,7 @@ +import Layout from 'component/layout/index'; +import plugin from 'framework/plugin'; + +export default function(Vue) { + Vue.use(plugin); + Vue.component(Layout.name, Layout); +} \ No newline at end of file diff --git a/app/web/framework/i18n/admin/cn.js b/app/web/framework/i18n/admin/cn.js new file mode 100644 index 0000000000000000000000000000000000000000..41e916ae8f0b5c0f395bc4f27ecd2b49a362b751 --- /dev/null +++ b/app/web/framework/i18n/admin/cn.js @@ -0,0 +1,13 @@ +'use strict'; +export default { + menu: { + home: '首页', + articlemanage: '文章管理', + articlequery: '文章查询', + articleadd: '添加文章' + }, + lang: { + href: '/admin?locale=en', + text: '中文' + } +}; \ No newline at end of file diff --git a/app/web/framework/i18n/admin/en.js b/app/web/framework/i18n/admin/en.js new file mode 100644 index 0000000000000000000000000000000000000000..6ff035afddd580a2e7a48563ab00903defe093c4 --- /dev/null +++ b/app/web/framework/i18n/admin/en.js @@ -0,0 +1,12 @@ +export default { + menu: { + home: 'Home', + articlemanage: 'Article Manage', + articlequery: 'Article Query', + articleadd: 'Article Add' + }, + lang: { + href: '/admin?locale=cn', + text: 'English' + } +}; \ No newline at end of file diff --git a/app/web/framework/i18n/admin/index.js b/app/web/framework/i18n/admin/index.js new file mode 100644 index 0000000000000000000000000000000000000000..4fcca24d7c24e198b090801f73a1c9e21e1efb6a --- /dev/null +++ b/app/web/framework/i18n/admin/index.js @@ -0,0 +1,12 @@ +import VueI18n from 'vue-i18n'; +import cn from './cn'; +import en from './en'; +export default function createI18n(locale) { + return new VueI18n({ + locale, + messages: { + en, + cn + } + }); +} \ No newline at end of file diff --git a/app/web/framework/i18n/site/cn.js b/app/web/framework/i18n/site/cn.js new file mode 100644 index 0000000000000000000000000000000000000000..9b9e79bfc8cb39cb634d6cae828e27866684b820 --- /dev/null +++ b/app/web/framework/i18n/site/cn.js @@ -0,0 +1,12 @@ +'use strict'; +export default { + menu: { + home: '首页', + category: '分类', + about: '关于' + }, + lang: { + href: '/?locale=en', + text: '中文' + } +}; \ No newline at end of file diff --git a/app/web/framework/i18n/site/en.js b/app/web/framework/i18n/site/en.js new file mode 100644 index 0000000000000000000000000000000000000000..85d5cc90d2bf15dfefd41221dae95d1740eb76b9 --- /dev/null +++ b/app/web/framework/i18n/site/en.js @@ -0,0 +1,11 @@ +export default { + menu: { + home: 'Home', + category: 'Catetory', + about: 'About', + }, + lang: { + href: '/?locale=cn', + text: 'English' + } +}; \ No newline at end of file diff --git a/app/web/framework/i18n/site/index.js b/app/web/framework/i18n/site/index.js new file mode 100644 index 0000000000000000000000000000000000000000..4fcca24d7c24e198b090801f73a1c9e21e1efb6a --- /dev/null +++ b/app/web/framework/i18n/site/index.js @@ -0,0 +1,12 @@ +import VueI18n from 'vue-i18n'; +import cn from './cn'; +import en from './en'; +export default function createI18n(locale) { + return new VueI18n({ + locale, + messages: { + en, + cn + } + }); +} \ No newline at end of file diff --git a/app/web/framework/network/request.js b/app/web/framework/network/request.js new file mode 100644 index 0000000000000000000000000000000000000000..fb78f6f8a7678fc05aaf867b284b25f62bb77f87 --- /dev/null +++ b/app/web/framework/network/request.js @@ -0,0 +1,21 @@ +'use strict'; +import axios from 'axios'; +// axios.defaults.baseURL = 'http://127.0.0.1:7001'; +axios.defaults.timeout = 15000; +axios.defaults.xsrfHeaderName = 'x-csrf-token'; +axios.defaults.xsrfCookieName = 'csrfToken'; +export default { + post(url, json, store = {}) { + const { state = { origin: '' } } = store; + const headers = {}; + if (EASY_ENV_IS_NODE) { + headers['x-csrf-token'] = state.csrf; + headers.Cookie = `csrfToken=${state.csrf}`; + } + return axios.post(`${state.origin}${url}`, json, { headers }); + }, + get(url, store = {}) { + const { state = { origin: '' } } = store; + return axios.get(`${state.origin}${url}`); + } +}; \ No newline at end of file diff --git a/app/web/framework/plugin/index.js b/app/web/framework/plugin/index.js new file mode 100644 index 0000000000000000000000000000000000000000..543430d8f10f9ebcf6a40ee1c7a28011047384da --- /dev/null +++ b/app/web/framework/plugin/index.js @@ -0,0 +1,22 @@ +'use strict'; +import axios from 'axios'; +import request from 'framework/network/request'; +import VueI18n from 'vue-i18n'; +import createI18n from 'framework/i18n/site'; + +export default { + install(Vue) { + if (!Vue.prototype.hasOwnProperty('$request')) { + Vue.prototype.$request = request; + } + if (!Vue.hook) { + Vue.use(VueI18n); + Vue.hook = { + render(context, options) { + const i18n = createI18n(context.state.locale); + options.i18n = i18n; + } + }; + } + } +}; \ No newline at end of file diff --git a/app/web/page/about/about.css b/app/web/page/about/about.css new file mode 100644 index 0000000000000000000000000000000000000000..e69de29bb2d1d6434b8b29ae775ad8c2e48c5391 diff --git a/app/web/page/about/about.vue b/app/web/page/about/about.vue new file mode 100644 index 0000000000000000000000000000000000000000..9cfd8bc0180b353e2f434567c3f1b47bf1d755df --- /dev/null +++ b/app/web/page/about/about.vue @@ -0,0 +1,32 @@ + + + + diff --git a/app/web/page/admin/home/component/panel.vue b/app/web/page/admin/home/component/panel.vue new file mode 100644 index 0000000000000000000000000000000000000000..8aa5c645cdc03122c404a9e93eadc1fe747c1add --- /dev/null +++ b/app/web/page/admin/home/component/panel.vue @@ -0,0 +1,148 @@ + + + + + diff --git a/app/web/page/admin/home/home.vue b/app/web/page/admin/home/home.vue new file mode 100755 index 0000000000000000000000000000000000000000..639461a51c000e42bf325e0f54e9470aebad8224 --- /dev/null +++ b/app/web/page/admin/home/home.vue @@ -0,0 +1,45 @@ + + diff --git a/app/web/page/admin/home/router/index.js b/app/web/page/admin/home/router/index.js new file mode 100755 index 0000000000000000000000000000000000000000..08f1a902c72f312b30aa2e28b86020c29bb0dc24 --- /dev/null +++ b/app/web/page/admin/home/router/index.js @@ -0,0 +1,52 @@ +import Vue from 'vue'; + +import VueRouter from 'vue-router'; +import Dashboard from '../view/dashboard/index.vue'; +import ArticleList from '../view/list.vue'; + +Vue.use(VueRouter); + +export default function createRouter() { + const router = new VueRouter({ + mode: 'history', + base: '/admin/', + routes: [ + { + path: '/', + component: Dashboard + }, + { + path: '/article/list', + component: ArticleList + }, + { + path: '/article/add', + component: () => import('../view/write/index.vue') + }, + { + path: '/article/detail/:id', + component: () => import('../view/detail.vue') + }, + { + path: '*', component: () => import('../view/notfound.vue') + } + ] + }); + + router.beforeEach((route, redirec, next) => { + next(); + }); + + router.afterEach((route, redirec) => { + if (EASY_ENV_IS_BROWSER && route.matched && route.matched.length) { + const matchComponent = route.matched[0].components.default; + const asyncData = matchComponent.methods && matchComponent.methods.fetchApi; + if (asyncData) { + console.log('router afterEach trigger asyncData', route); + asyncData(router.app.$store, route); + } + } + }); + + return router; +} \ No newline at end of file diff --git a/app/web/page/admin/home/store/app/actions.js b/app/web/page/admin/home/store/app/actions.js new file mode 100644 index 0000000000000000000000000000000000000000..7aed523c234e395fe84ea1570f90503a7b91595c --- /dev/null +++ b/app/web/page/admin/home/store/app/actions.js @@ -0,0 +1,40 @@ +'use strict'; + +import * as Type from './mutation-type'; +import Vue from 'vue'; +import Vuex from 'vuex'; +import request from 'framework/network/request'; + +Vue.use(Vuex); + +const actions = { + + SET_ARTICLE_LIST: (store, json) => { + return request.post('/admin/api/article/list', json, store).then(response => { + store.commit(Type.SET_ARTICLE_LIST, response.data); + }); + }, + SET_ARTICLE_DETAIL: (store, json) => { + const { commit, dispatch, state } = store; + return request.get(`/admin/api/article/${json.id}`, store) + .then(response => { + commit(Type.SET_ARTICLE_DETAIL, response.data); + }); + }, + SET_SAVE_ARTICLE: (store, json) => { + const { commit, dispatch, state } = store; + return request.post('/admin/api/article/add', json, store).then(response => { + commit(Type.SET_SAVE_ARTICLE, json); + }); + }, + DELETE_ARTICLE: (store, { id }) => { + // 鉴权 TODO + const { commit, dispatch, state } = store; + return request.get(`/admin/api/article/del/${id}`, store) + .then(response => { + commit(Type.DELETE_ARTICLE, { id }); + }); + }, +}; + +export default actions; \ No newline at end of file diff --git a/app/web/page/admin/home/store/app/getters.js b/app/web/page/admin/home/store/app/getters.js new file mode 100644 index 0000000000000000000000000000000000000000..4abd2b4961fc6d19d7202de016d30001c818324a --- /dev/null +++ b/app/web/page/admin/home/store/app/getters.js @@ -0,0 +1,3 @@ +'use strict'; + +export default {}; \ No newline at end of file diff --git a/app/web/page/admin/home/store/app/index.js b/app/web/page/admin/home/store/app/index.js new file mode 100644 index 0000000000000000000000000000000000000000..c8cb23be6e90814ea541d338084c0f0681521da2 --- /dev/null +++ b/app/web/page/admin/home/store/app/index.js @@ -0,0 +1,24 @@ +'use strict'; +import Vue from 'vue'; +import Vuex from 'vuex'; + +import actions from './actions'; +import getters from './getters'; +import mutations from './mutations'; + +Vue.use(Vuex); + +export default function createStore(initState) { + const state = { + articleTotal: 0, + articleList: [], + article: {}, + ...initState + }; + return new Vuex.Store({ + state, + actions, + getters, + mutations + }); +} \ No newline at end of file diff --git a/app/web/page/admin/home/store/app/mutation-type.js b/app/web/page/admin/home/store/app/mutation-type.js new file mode 100644 index 0000000000000000000000000000000000000000..50effdfbdaaf2a56c874e71415d77efc5d63f499 --- /dev/null +++ b/app/web/page/admin/home/store/app/mutation-type.js @@ -0,0 +1,6 @@ +'use strict'; + +export const SET_ARTICLE_LIST = 'SET_ARTICLE_LIST'; +export const SET_ARTICLE_DETAIL = 'SET_ARTICLE_DETAIL'; +export const SET_SAVE_ARTICLE = 'SET_SAVE_ARTICLE'; +export const DELETE_ARTICLE = 'DELETE_ARTICLE'; \ No newline at end of file diff --git a/app/web/page/admin/home/store/app/mutations.js b/app/web/page/admin/home/store/app/mutations.js new file mode 100644 index 0000000000000000000000000000000000000000..a931c9bd8bd9082840066ae56384297e1bbb8d43 --- /dev/null +++ b/app/web/page/admin/home/store/app/mutations.js @@ -0,0 +1,34 @@ +'use strict'; + +import { + SET_ARTICLE_LIST, + SET_ARTICLE_DETAIL, + SET_SAVE_ARTICLE, + DELETE_ARTICLE +} from './mutation-type'; + +const mutations = { + [SET_ARTICLE_LIST](state, { list, total }) { + state.articleTotal = total; + state.articleList = list; + }, + [SET_ARTICLE_DETAIL](state, data) { + console.log('>>>data', data); + if (Array.isArray(data) && data.length) { + state.article = data[0]; + } else { + state.article = data; + } + }, + [SET_SAVE_ARTICLE](state, data) { + state.articleTotal += 1; + state.articleList = [data].concat(state.articleList); + }, + [DELETE_ARTICLE](state, { id }) { + state.articleTotal -= 1; + state.articleList = state.articleList.filter(item => { + return item.id !== id; + }); + } +}; +export default mutations; diff --git a/app/web/page/admin/home/view/dashboard/index.vue b/app/web/page/admin/home/view/dashboard/index.vue new file mode 100644 index 0000000000000000000000000000000000000000..1b2ff6456824fe33edf5e89d5944781d84dbf5e0 --- /dev/null +++ b/app/web/page/admin/home/view/dashboard/index.vue @@ -0,0 +1,16 @@ + + + diff --git a/app/web/page/admin/home/view/detail.vue b/app/web/page/admin/home/view/detail.vue new file mode 100644 index 0000000000000000000000000000000000000000..5e71a82a9859e6112ce5e161935214239f2e435f --- /dev/null +++ b/app/web/page/admin/home/view/detail.vue @@ -0,0 +1,24 @@ + + + \ No newline at end of file diff --git a/app/web/page/admin/home/view/list.vue b/app/web/page/admin/home/view/list.vue new file mode 100644 index 0000000000000000000000000000000000000000..b79917421cc8bfb3f08f625a894a2d581c75a205 --- /dev/null +++ b/app/web/page/admin/home/view/list.vue @@ -0,0 +1,185 @@ + + + \ No newline at end of file diff --git a/app/web/page/admin/home/view/notfound.vue b/app/web/page/admin/home/view/notfound.vue new file mode 100644 index 0000000000000000000000000000000000000000..2a791e9a43b556b4e7f55a667dc5a283f3e89229 --- /dev/null +++ b/app/web/page/admin/home/view/notfound.vue @@ -0,0 +1,12 @@ + + + \ No newline at end of file diff --git a/app/web/page/admin/home/view/write/index.vue b/app/web/page/admin/home/view/write/index.vue new file mode 100644 index 0000000000000000000000000000000000000000..7760e9154b7b2b3ba8d54c85b4046a647f4394e1 --- /dev/null +++ b/app/web/page/admin/home/view/write/index.vue @@ -0,0 +1,58 @@ + + + \ No newline at end of file diff --git a/app/web/page/admin/login/login.css b/app/web/page/admin/login/login.css new file mode 100644 index 0000000000000000000000000000000000000000..7a5390c48942a46684dd014dca30cc24e8958514 --- /dev/null +++ b/app/web/page/admin/login/login.css @@ -0,0 +1,40 @@ +.login { + display: flex; + justify-content: center; + align-items: center; + position: absolute; + height: 100%; + width: 100%; + background-color: #e4e5e6; +} + +.login .login-info input { + width: 100%; +} + +.login .login-form { + width: 375px; + height: 400px; + padding: 30px; + background-color: white; + text-align: left; + border-radius: 4px; + position: relative; + margin-left: 0; + margin-right: 0; + zoom: 1; + display: block; +} + +.login .login-header { + text-align: center; + font-size: 16px; + font-weight: bold; + margin-bottom: 20px; +} + +.login .el-checkbox__label { + font-size: 14px; + font-weight: normal; + padding-left: 4px; +} diff --git a/app/web/page/admin/login/login.vue b/app/web/page/admin/login/login.vue new file mode 100644 index 0000000000000000000000000000000000000000..40ae6317dfb90fcc3c9240b0c8cf3c70d88f141f --- /dev/null +++ b/app/web/page/admin/login/login.vue @@ -0,0 +1,65 @@ + + + + + \ No newline at end of file diff --git a/app/web/page/category/category.css b/app/web/page/category/category.css new file mode 100644 index 0000000000000000000000000000000000000000..e69de29bb2d1d6434b8b29ae775ad8c2e48c5391 diff --git a/app/web/page/category/category.vue b/app/web/page/category/category.vue new file mode 100644 index 0000000000000000000000000000000000000000..287660493a7956cd9934a4cd40a14f7ea3c154d6 --- /dev/null +++ b/app/web/page/category/category.vue @@ -0,0 +1,37 @@ + + + + diff --git a/app/web/page/index/index.css b/app/web/page/index/index.css new file mode 100644 index 0000000000000000000000000000000000000000..e69de29bb2d1d6434b8b29ae775ad8c2e48c5391 diff --git a/app/web/page/index/index.vue b/app/web/page/index/index.vue new file mode 100644 index 0000000000000000000000000000000000000000..3e1cc1067326485360309b2132786954e64b717e --- /dev/null +++ b/app/web/page/index/index.vue @@ -0,0 +1,75 @@ + + + + diff --git a/app/web/view/layout.html b/app/web/view/layout.html new file mode 100644 index 0000000000000000000000000000000000000000..03a9b5d1b23dc88e20cc0a2cacb272068167ba7a --- /dev/null +++ b/app/web/view/layout.html @@ -0,0 +1,14 @@ + + + + IBlog + + + + + + + +
+ + \ No newline at end of file diff --git a/babel.config.js b/babel.config.js new file mode 100644 index 0000000000000000000000000000000000000000..7c09e1f92f711abee1d8838dd45cef02888e5ac7 --- /dev/null +++ b/babel.config.js @@ -0,0 +1,55 @@ +module.exports = { + "env": { + "node": { + "presets": [ + [ + "@babel/preset-env", + { + "modules": false, + "targets": { + "node": "current" + } + } + ] + ], + "plugins": [ + [ + "component", + { + "libraryName": "element-ui", + "styleLibraryName": "theme-chalk" + } + ], + "@babel/plugin-syntax-dynamic-import" + ] + }, + "web": { + "presets": [ + [ + "@babel/preset-env", + { + "modules": false, + "targets": { + "browsers": [ + "last 2 versions", + "safari >= 7" + ] + } + } + ] + ], + "plugins": [ + [ + "component", + { + "libraryName": "element-ui", + "styleLibraryName": "theme-chalk" + } + ], + "@babel/plugin-proposal-object-rest-spread", + "@babel/plugin-syntax-dynamic-import", + "@babel/plugin-transform-object-assign" + ] + } + } +} diff --git a/blog.json b/blog.json new file mode 100644 index 0000000000000000000000000000000000000000..8418edf824652a0c21c8bee9667693ef883ba82b --- /dev/null +++ b/blog.json @@ -0,0 +1,519 @@ +{ + "user": {}, + "article": [ + { + "id": 1, + "title": "vue-渐进式JavaScript 框架", + "summary": "简单小巧的核心,渐进式技术栈,足以应付任何规模的应用", + "hits": 200, + "url": "https://cn.vuejs.org", + "status": 1, + "tag": "egg,vue,webpack", + "categoryId": 1, + "authorId": 1, + "createTime": 1515671348289 + }, + { + "id": 2, + "title": "Webpack 配置官方文档", + "summary": "webpack is a module bundler for modern JavaScript applications.", + "hits": 550, + "url": "https://webpack.js.org/configuration/", + "status": 1, + "tag": "egg,vue,webpack", + "categoryId": 1, + "authorId": 1, + "createTime": 1515671348290 + }, + { + "id": 3, + "title": "egg-为企业级框架和应用而生", + "summary": "Born to buildbetter enterprise frameworks and apps with Node.js & Koa", + "hits": 278, + "url": "https://eggjs.org/", + "tag": "egg,vue,webpack", + "categoryId": 1, + "authorId": 1, + "createTime": 1515671348290 + }, + { + "id": 5, + "title": "Centralized State Management for Vue.js", + "summary": "Vuex 是一个专为Vue.js 应用程序开发的状态管理模式", + "hits": 232, + "url": "https://github.com/vuejs/vuex", + "tag": "egg,vue,webpack", + "categoryId": 1, + "authorId": 1, + "createTime": 1515671348293 + }, + { + "id": 6, + "title": "vue服务器渲染", + "summary": "服务器渲染可以加快首屏速度,利于SEO", + "hits": 565, + "url": "http://csbun.github.io/blog/2016/08/vue-2-0-server-side-rendering/", + "tag": "egg,vue,webpack", + "categoryId": 1, + "authorId": 1, + "createTime": 1515671348293 + }, + { + "id": 7, + "title": "webpack服务器构建", + "summary": "Webpack is an amazing tool.", + "hits": 988, + "url": "http://jlongster.com/Backend-Apps-with-Webpack--Part-I", + "tag": "egg,vue,webpack", + "categoryId": 1, + "authorId": 1, + "createTime": 1515671348294 + }, + { + "id": 8, + "title": "vue component loader for Webpack", + "summary": "Webpack loader for Vue.js components", + "hits": 322, + "url": "https://github.com/vuejs/vue-loader", + "tag": "egg,vue,webpack", + "categoryId": 1, + "authorId": 1, + "createTime": 1515671348295 + }, + { + "id": 9, + "title": "vue-router--The official router for Vue.js", + "summary": "It deeply integrates with Vue.js core to make building Single Page Applications with Vue.js a breeze", + "hits": 566, + "url": "https://github.com/vuejs/vue-router", + "tag": "egg,vue,webpack", + "categoryId": 1, + "authorId": 1, + "createTime": 1515671348295 + }, + { + "id": 10, + "title": "vue生命周期", + "summary": "Vue.js 生命周期和route的生命周期讲解", + "hits": 434, + "url": "http://www.jianshu.com/p/e9f884b6ba6c", + "tag": "egg,vue,webpack", + "categoryId": 1, + "authorId": 1, + "createTime": 1515671348296 + }, + { + "id": 11, + "title": "babel到底将代码转换成什么鸟样", + "summary": "将babel捧作前端一个划时代的工具一定也不为过,它的出现让许多程序员幸福地用上了es6新语法", + "hits": 432, + "url": "https://github.com/lcxfs1991/blog/issues/9", + "tag": "egg,vue,webpack", + "categoryId": 1, + "authorId": 1, + "createTime": 1515671348296 + }, + { + "id": 12, + "title": "HTTP2 的真正性能到底如何", + "summary": "HTTP2 的真正性能到底如何", + "hits": 565, + "url": "https://segmentfault.com/a/1190000007219256?utm_source=weekly&utm_medium=email&utm_campaign=email_weekly", + "tag": "egg,vue,webpack", + "categoryId": 1, + "authorId": 1, + "createTime": 1515671348296 + }, + { + "id": 13, + "title": "HTTP,HTTP2.0,SPDY,HTTPS讲解", + "summary": "使用SPDY加快你的网站速度", + "hits": 787, + "url": "http://www.alloyteam.com/2016/07/httphttp2-0spdyhttps-reading-this-is-enough/", + "tag": "egg,vue,webpack", + "categoryId": 1, + "authorId": 1, + "createTime": 1515671348297 + }, + { + "id": 14, + "title": "git - 简明指南", + "summary": "助你入门 git 的简明指南", + "hits": 121, + "url": "http://rogerdudler.github.io/git-guide/index.zh.html", + "tag": "egg,vue,webpack", + "categoryId": 1, + "authorId": 1, + "createTime": 1515671348297 + }, + { + "id": 15, + "title": "vue从1升级到2", + "summary": "Migrating from v1 to v2", + "hits": 555, + "url": "https://webpack.js.org/guides/migrating/", + "tag": "egg,vue,webpack", + "categoryId": 1, + "authorId": 1, + "createTime": 1515671348298 + }, + { + "id": 16, + "title": "vue-渐进式JavaScript 框架", + "summary": "简单小巧的核心,渐进式技术栈,足以应付任何规模的应用", + "hits": 200, + "url": "https://cn.vuejs.org", + "status": 1, + "tag": "egg,vue,webpack", + "categoryId": 1, + "authorId": 1, + "createTime": 1515671348299 + }, + { + "id": 17, + "title": "webpack配置官方文档", + "summary": "webpack is a module bundler for modern JavaScript applications.", + "hits": 550, + "url": "https://webpack.js.org/configuration/", + "status": 1, + "tag": "egg,vue,webpack", + "categoryId": 1, + "authorId": 1, + "createTime": 1515671348321 + }, + { + "id": 18, + "title": "egg-为企业级框架和应用而生", + "summary": "Born to buildbetter enterprise frameworks and apps with Node.js & Koa", + "hits": 278, + "url": "https://eggjs.org/", + "tag": "egg,vue,webpack", + "categoryId": 1, + "authorId": 1, + "createTime": 1515671348322 + }, + { + "id": 20, + "title": "Centralized State Management for Vue.js", + "summary": "Vuex 是一个专为Vue.js 应用程序开发的状态管理模式", + "hits": 232, + "url": "https://github.com/vuejs/vuex", + "tag": "egg,vue,webpack", + "categoryId": 1, + "authorId": 1, + "createTime": 1515671348326 + }, + { + "id": 21, + "title": "vue服务器渲染", + "summary": "服务器渲染可以加快首屏速度,利于SEO", + "hits": 565, + "url": "http://csbun.github.io/blog/2016/08/vue-2-0-server-side-rendering/", + "tag": "egg,vue,webpack", + "categoryId": 1, + "authorId": 1, + "createTime": 1515671348327 + }, + { + "id": 22, + "title": "webpack服务器构建", + "summary": "Webpack is an amazing tool.", + "hits": 988, + "url": "http://jlongster.com/Backend-Apps-with-Webpack--Part-I", + "tag": "egg,vue,webpack", + "categoryId": 1, + "authorId": 1, + "createTime": 1515671348329 + }, + { + "id": 23, + "title": "vue component loader for Webpack", + "summary": "Webpack loader for Vue.js components", + "hits": 322, + "url": "https://github.com/vuejs/vue-loader", + "tag": "egg,vue,webpack", + "categoryId": 1, + "authorId": 1, + "createTime": 1515671348330 + }, + { + "id": 24, + "title": "vue-router--The official router for Vue.js", + "summary": "It deeply integrates with Vue.js core to make building Single Page Applications with Vue.js a breeze", + "hits": 566, + "url": "https://github.com/vuejs/vue-router", + "tag": "egg,vue,webpack", + "categoryId": 1, + "authorId": 1, + "createTime": 1515671348330 + }, + { + "id": 25, + "title": "vue生命周期", + "summary": "Vue.js 生命周期和route的生命周期讲解", + "hits": 434, + "url": "http://www.jianshu.com/p/e9f884b6ba6c", + "tag": "egg,vue,webpack", + "categoryId": 1, + "authorId": 1, + "createTime": 1515671348331 + }, + { + "id": 26, + "title": "babel到底将代码转换成什么鸟样", + "summary": "将babel捧作前端一个划时代的工具一定也不为过,它的出现让许多程序员幸福地用上了es6新语法", + "hits": 432, + "url": "https://github.com/lcxfs1991/blog/issues/9", + "tag": "egg,vue,webpack", + "categoryId": 1, + "authorId": 1, + "createTime": 1515671348333 + }, + { + "id": 27, + "title": "HTTP2 的真正性能到底如何", + "summary": "HTTP2 的真正性能到底如何", + "hits": 565, + "url": "https://segmentfault.com/a/1190000007219256?utm_source=weekly&utm_medium=email&utm_campaign=email_weekly", + "tag": "egg,vue,webpack", + "categoryId": 1, + "authorId": 1, + "createTime": 1515671348333 + }, + { + "id": 28, + "title": "HTTP,HTTP2.0,SPDY,HTTPS讲解", + "summary": "使用SPDY加快你的网站速度", + "hits": 787, + "url": "http://www.alloyteam.com/2016/07/httphttp2-0spdyhttps-reading-this-is-enough/", + "tag": "egg,vue,webpack", + "categoryId": 1, + "authorId": 1, + "createTime": 1515671348334 + }, + { + "id": 29, + "title": "git - 简明指南", + "summary": "助你入门 git 的简明指南", + "hits": 121, + "url": "http://rogerdudler.github.io/git-guide/index.zh.html", + "tag": "egg,vue,webpack", + "categoryId": 1, + "authorId": 1, + "createTime": 1515671348335 + }, + { + "id": 30, + "title": "vue从1升级到2", + "summary": "Migrating from v1 to v2", + "hits": 555, + "url": "https://webpack.js.org/guides/migrating/", + "tag": "egg,vue,webpack", + "categoryId": 1, + "authorId": 1, + "createTime": 1515671348335 + }, + { + "id": 31, + "title": "vue-渐进式JavaScript 框架", + "summary": "简单小巧的核心,渐进式技术栈,足以应付任何规模的应用", + "hits": 200, + "url": "https://cn.vuejs.org", + "status": 1, + "tag": "egg,vue,webpack", + "categoryId": 1, + "authorId": 1, + "createTime": 1515671348336 + }, + { + "id": 32, + "title": "webpack配置官方文档", + "summary": "webpack is a module bundler for modern JavaScript applications.", + "hits": 550, + "url": "https://webpack.js.org/configuration/", + "status": 1, + "tag": "egg,vue,webpack", + "categoryId": 1, + "authorId": 1, + "createTime": 1515671348336 + }, + { + "id": 33, + "title": "egg-为企业级框架和应用而生", + "summary": "Born to buildbetter enterprise frameworks and apps with Node.js & Koa", + "hits": 278, + "url": "https://eggjs.org/", + "tag": "egg,vue,webpack", + "categoryId": 1, + "authorId": 1, + "createTime": 1515671348338 + }, + { + "id": 35, + "title": "Centralized State Management for Vue.js", + "summary": "Vuex 是一个专为Vue.js 应用程序开发的状态管理模式", + "hits": 232, + "url": "https://github.com/vuejs/vuex", + "tag": "egg,vue,webpack", + "categoryId": 1, + "authorId": 1, + "createTime": 1515671348339 + }, + { + "id": 36, + "title": "vue服务器渲染", + "summary": "服务器渲染可以加快首屏速度,利于SEO", + "hits": 565, + "url": "http://csbun.github.io/blog/2016/08/vue-2-0-server-side-rendering/", + "tag": "egg,vue,webpack", + "categoryId": 1, + "authorId": 1, + "createTime": 1515671348340 + }, + { + "id": 37, + "title": "webpack服务器构建", + "summary": "Webpack is an amazing tool.", + "hits": 988, + "url": "http://jlongster.com/Backend-Apps-with-Webpack--Part-I", + "tag": "egg,vue,webpack", + "categoryId": 1, + "authorId": 1, + "createTime": 1515671348340 + }, + { + "id": 38, + "title": "vue component loader for Webpack", + "summary": "Webpack loader for Vue.js components", + "hits": 322, + "url": "https://github.com/vuejs/vue-loader", + "tag": "egg,vue,webpack", + "categoryId": 1, + "authorId": 1, + "createTime": 1515671348341 + }, + { + "id": 39, + "title": "vue-router--The official router for Vue.js", + "summary": "It deeply integrates with Vue.js core to make building Single Page Applications with Vue.js a breeze", + "hits": 566, + "url": "https://github.com/vuejs/vue-router", + "tag": "egg,vue,webpack", + "categoryId": 1, + "authorId": 1, + "createTime": 1515671348341 + }, + { + "id": 40, + "title": "vue生命周期", + "summary": "Vue.js 生命周期和route的生命周期讲解", + "hits": 434, + "url": "http://www.jianshu.com/p/e9f884b6ba6c", + "tag": "egg,vue,webpack", + "categoryId": 1, + "authorId": 1, + "createTime": 1515671348342 + }, + { + "id": 41, + "title": "babel到底将代码转换成什么鸟样", + "summary": "将babel捧作前端一个划时代的工具一定也不为过,它的出现让许多程序员幸福地用上了es6新语法", + "hits": 432, + "url": "https://github.com/lcxfs1991/blog/issues/9", + "tag": "egg,vue,webpack", + "categoryId": 1, + "authorId": 1, + "createTime": 1515671348342 + }, + { + "id": 42, + "title": "HTTP2 的真正性能到底如何", + "summary": "HTTP2 的真正性能到底如何", + "hits": 565, + "url": "https://segmentfault.com/a/1190000007219256?utm_source=weekly&utm_medium=email&utm_campaign=email_weekly", + "tag": "egg,vue,webpack", + "categoryId": 1, + "authorId": 1, + "createTime": 1515671348343 + }, + { + "id": 43, + "title": "HTTP,HTTP2.0,SPDY,HTTPS讲解", + "summary": "使用SPDY加快你的网站速度", + "hits": 787, + "url": "http://www.alloyteam.com/2016/07/httphttp2-0spdyhttps-reading-this-is-enough/", + "tag": "egg,vue,webpack", + "categoryId": 1, + "authorId": 1, + "createTime": 1515671348343 + }, + { + "id": 44, + "title": "git - 简明指南", + "summary": "助你入门 git 的简明指南", + "hits": 121, + "url": "http://rogerdudler.github.io/git-guide/index.zh.html", + "tag": "egg,vue,webpack", + "categoryId": 1, + "authorId": 1, + "createTime": 1515671348344 + }, + { + "id": 45, + "title": "vue从1升级到2", + "summary": "Migrating from v1 to v2", + "hits": 555, + "url": "https://webpack.js.org/guides/migrating/", + "tag": "egg,vue,webpack", + "categoryId": 1, + "authorId": 1, + "createTime": 1515671348345 + }, + { + "id": 46, + "title": "vue-渐进式JavaScript 框架", + "summary": "简单小巧的核心,渐进式技术栈,足以应付任何规模的应用", + "hits": 200, + "url": "https://cn.vuejs.org", + "status": 1, + "tag": "egg,vue,webpack", + "categoryId": 1, + "authorId": 1, + "createTime": 1515671348345 + }, + { + "id": 47, + "title": "webpack配置官方文档", + "summary": "webpack is a module bundler for modern JavaScript applications.", + "hits": 550, + "url": "https://webpack.js.org/configuration/", + "status": 1, + "tag": "egg,vue,webpack", + "categoryId": 1, + "authorId": 1, + "createTime": 1515671348346 + }, + { + "id": 48, + "title": "egg-为企业级框架和应用而生", + "summary": "Born to buildbetter enterprise frameworks and apps with Node.js & Koa", + "hits": 278, + "url": "https://eggjs.org/", + "tag": "egg,vue,webpack", + "categoryId": 1, + "authorId": 1, + "createTime": 1515671348346 + }, + { + "id": 50, + "title": "Centralized State Management for Vue.js", + "summary": "Vuex 是一个专为Vue.js 应用程序开发的状态管理模式", + "hits": 232, + "url": "https://github.com/vuejs/vuex", + "tag": "egg,vue,webpack", + "categoryId": 1, + "authorId": 1, + "createTime": 1515671348347 + } + ] +} \ No newline at end of file diff --git a/config/config.default.js b/config/config.default.js new file mode 100644 index 0000000000000000000000000000000000000000..0194ec5ff21bda91bbbd63058939011edc88b5c8 --- /dev/null +++ b/config/config.default.js @@ -0,0 +1,56 @@ +'use strict'; +const path = require('path'); +const fs = require('fs'); +module.exports = app => { + const exports = {}; + + exports.siteFile = { + '/favicon.ico': fs.readFileSync(path.join(app.baseDir, 'app/web/asset/images/favicon.ico')) + }; + + exports.vuessr = { + layout: path.join(app.baseDir, 'app/web/view/layout.html'), + renderOptions: { + basedir: path.join(app.baseDir, 'app/view') + }, + injectRes:[ + { + url: 'https://cdnjs.cloudflare.com/ajax/libs/Swiper/4.0.2/css/swiper.min.css' + }, + { + url: 'https://cdnjs.cloudflare.com/ajax/libs/Swiper/4.0.2/js/swiper.min.js' + } + ] + }; + + exports.logger = { + consoleLevel: 'DEBUG', + dir: path.join(app.baseDir, 'logs') + }; + + exports.static = { + prefix: '/public/', + dir: path.join(app.baseDir, 'public') + }; + + exports.keys = '123456'; + + exports.middleware = [ + 'locals', + 'access' + ]; + + exports.security = { + csrf: { + ignoreJSON: false, + cookieName: 'csrfToken', + sessionName: 'csrfToken', + headerName: 'x-csrf-token' + }, + xframe: { + enable: false, + }, + }; + + return exports; +}; \ No newline at end of file diff --git a/config/config.local.js b/config/config.local.js new file mode 100644 index 0000000000000000000000000000000000000000..dddbb9d537ed3c0b479c93dc940b786b40a50e7a --- /dev/null +++ b/config/config.local.js @@ -0,0 +1,39 @@ +const path = require('path'); +const ip = require('ip'); +module.exports = app => { + const exports = {}; + + exports.view = { + cache: false + }; + + exports.static = { + maxAge: 0 // maxAge 缓存,默认 1 年 + }; + + exports.development = { + watchDirs: [], // 指定监视的目录(包括子目录),当目录下的文件变化的时候自动重载应用,路径从项目根目录开始写 + ignoreDirs: ['app/web', 'public', 'config/manifest.json'] // 指定过滤的目录(包括子目录) + }; + + exports.logview = { + dir: path.join(app.baseDir, 'logs') + }; + + exports.webpack = { + // browser: 'http://localhost:7001', + // webpackConfigList: require('easywebpack-vue').getWebpackConfig() + }; + + const localIP = ip.address(); + const domainWhiteList = []; + [7001, 9000, 9001].forEach(port => { + domainWhiteList.push(`http://localhost:${port}`); + domainWhiteList.push(`http://127.0.0.1:${port}`); + domainWhiteList.push(`http://${localIP}:${port}`); + }); + + exports.security = { domainWhiteList }; + + return exports; +}; diff --git a/config/config.prod.js b/config/config.prod.js new file mode 100644 index 0000000000000000000000000000000000000000..e4a94ef44487ca0c9009200f0d35c9a36454f61c --- /dev/null +++ b/config/config.prod.js @@ -0,0 +1,12 @@ +/** + * 生产环境配置 + * + * 最终生效的配置为 prod + default(前者覆盖后者) + */ + + +module.exports = app => { + const exports = {}; + + return exports; +}; diff --git a/config/config.test.js b/config/config.test.js new file mode 100644 index 0000000000000000000000000000000000000000..665acb2547be289c4cf03aeb3442519f2187bf49 --- /dev/null +++ b/config/config.test.js @@ -0,0 +1,7 @@ + + +module.exports = app => { + const exports = {}; + + return exports; +}; diff --git a/config/manifest.json b/config/manifest.json new file mode 100644 index 0000000000000000000000000000000000000000..0237015edb9b908d1560e8d8c79c8dbed3c687ee --- /dev/null +++ b/config/manifest.json @@ -0,0 +1,75 @@ +{ + "chunk/0.js": "/public/js/chunk/0.js", + "chunk/1.js": "/public/js/chunk/1.js", + "chunk/2.js": "/public/js/chunk/2.js", + "chunk/3.js": "/public/js/chunk/3.js", + "chunk/4.js": "/public/js/chunk/4.js", + "about/about.js": "/public/js/chunk/about/about.js", + "admin/home/home.js": "/public/js/chunk/admin/home/home.js", + "admin/login/login.js": "/public/js/chunk/admin/login/login.js", + "category/category.js": "/public/js/chunk/category/category.js", + "common.js": "/public/js/chunk/common.js", + "index/index.js": "/public/js/chunk/index/index.js", + "runtime.js": "/public/js/runtime.js", + "font/element-icons.ttf": "/public/font/element-icons.ttf", + "font/element-icons.woff": "/public/font/element-icons.woff", + "font/fontawesome-webfont.eot?v=4.7.0": "/public/font/fontawesome-webfont.eot", + "font/fontawesome-webfont.ttf?v=4.7.0": "/public/font/fontawesome-webfont.ttf", + "font/fontawesome-webfont.woff?v=4.7.0": "/public/font/fontawesome-webfont.woff", + "font/fontawesome-webfont.woff2?v=4.7.0": "/public/font/fontawesome-webfont.woff2", + "font/glyphicons-halflings-regular.eot": "/public/font/glyphicons-halflings-regular.eot", + "font/glyphicons-halflings-regular.ttf": "/public/font/glyphicons-halflings-regular.ttf", + "font/glyphicons-halflings-regular.woff": "/public/font/glyphicons-halflings-regular.woff", + "font/glyphicons-halflings-regular.woff2": "/public/font/glyphicons-halflings-regular.woff2", + "img/fontawesome-webfont.svg?v=4.7.0": "/public/img/fontawesome-webfont.svg", + "img/glyphicons-halflings-regular.svg": "/public/img/glyphicons-halflings-regular.svg", + "img/loading.gif": "/public/img/loading.gif", + "img/logo.png": "/public/img/logo.png", + "deps": { + "about/about.js": { + "js": [ + "/public/js/runtime.js", + "/public/js/chunk/common.js", + "/public/js/chunk/about/about.js" + ], + "css": [] + }, + "admin/home/home.js": { + "js": [ + "/public/js/runtime.js", + "/public/js/chunk/common.js", + "/public/js/chunk/admin/home/home.js" + ], + "css": [] + }, + "admin/login/login.js": { + "js": [ + "/public/js/runtime.js", + "/public/js/chunk/common.js", + "/public/js/chunk/admin/login/login.js" + ], + "css": [] + }, + "category/category.js": { + "js": [ + "/public/js/runtime.js", + "/public/js/chunk/common.js", + "/public/js/chunk/category/category.js" + ], + "css": [] + }, + "index/index.js": { + "js": [ + "/public/js/runtime.js", + "/public/js/chunk/common.js", + "/public/js/chunk/index/index.js" + ], + "css": [] + } + }, + "info": { + "publicPath": "/public/", + "buildPath": "public", + "mapped": true + } +} \ No newline at end of file diff --git a/config/plugin.js b/config/plugin.js new file mode 100644 index 0000000000000000000000000000000000000000..1b0e79693d0d39f7c1526b60af88c1ad778c51d4 --- /dev/null +++ b/config/plugin.js @@ -0,0 +1,4 @@ +exports.vuessr = { + enable: true, + package: 'egg-view-vue-ssr' +}; \ No newline at end of file diff --git a/config/plugin.local.js b/config/plugin.local.js new file mode 100644 index 0000000000000000000000000000000000000000..c218c8b9adf951ea970e7304876a4e443cf9adac --- /dev/null +++ b/config/plugin.local.js @@ -0,0 +1,19 @@ +exports.cors = { + enable: true, + package: 'egg-cors' +}; + +exports.webpack = { + enable: true, + package: 'egg-webpack' +}; + +exports.webpackvue = { + enable: true, + package: 'egg-webpack-vue' +}; + +exports.logview = { + package: 'egg-logview', + env: ['local'] +}; diff --git a/docs/images/admin.png b/docs/images/admin.png new file mode 100644 index 0000000000000000000000000000000000000000..0d1fa9f18146301334f58c63d6401e5fef4f9543 Binary files /dev/null and b/docs/images/admin.png differ diff --git a/docs/images/egg-webpack.png b/docs/images/egg-webpack.png new file mode 100644 index 0000000000000000000000000000000000000000..d9f46ac8b09a1da0eaac6282e8efe87b98a2144d Binary files /dev/null and b/docs/images/egg-webpack.png differ diff --git a/docs/images/iblog.png b/docs/images/iblog.png new file mode 100644 index 0000000000000000000000000000000000000000..817ed11b22ee33ca216fb8ca8e81d81d98e7c151 Binary files /dev/null and b/docs/images/iblog.png differ diff --git a/docs/images/vue-mutil-page.png b/docs/images/vue-mutil-page.png new file mode 100644 index 0000000000000000000000000000000000000000..47f74faa650743de541b947754a147a63daafb32 Binary files /dev/null and b/docs/images/vue-mutil-page.png differ diff --git a/docs/images/vue-single-page.png b/docs/images/vue-single-page.png new file mode 100644 index 0000000000000000000000000000000000000000..bb4351e1280c4c130d1184fb721687768987587c Binary files /dev/null and b/docs/images/vue-single-page.png differ diff --git a/docs/images/webpack-build.png b/docs/images/webpack-build.png new file mode 100644 index 0000000000000000000000000000000000000000..6884069b43e316bc2b753c41fc2f8ea45e463727 Binary files /dev/null and b/docs/images/webpack-build.png differ diff --git a/docs/images/webpack.png b/docs/images/webpack.png new file mode 100644 index 0000000000000000000000000000000000000000..26ff8b88712b9bc99982d95fab7fbed1c88839f2 Binary files /dev/null and b/docs/images/webpack.png differ diff --git a/docs/issue_template.md b/docs/issue_template.md new file mode 100644 index 0000000000000000000000000000000000000000..909e90c3bde81396f5a953c7e4db96f959947003 --- /dev/null +++ b/docs/issue_template.md @@ -0,0 +1,7 @@ + diff --git a/docs/perform.md b/docs/perform.md new file mode 100644 index 0000000000000000000000000000000000000000..69d1d14f9b7116418ca4d9ded1defcda67a2066b --- /dev/null +++ b/docs/perform.md @@ -0,0 +1,7 @@ +http://www.jianshu.com/p/1dffe3126686 + +http://alexkuz.github.io/webpack-chart/ +http://webpack.github.io/analyse/ + + +http://kiwenlau.com/2017/04/01/nodejs-async-await/ \ No newline at end of file diff --git a/package.json b/package.json index 72caa1750a1c44c18460a496d258fbd3c51c673a..a9120f2d21a5568f2a24b964c5a7e577b8c1a398 100644 --- a/package.json +++ b/package.json @@ -1,18 +1,74 @@ { - "name": "nodejs", - "version": "1.0.0", - "description": "", - "main": "index.js", - "scripts": { - "dev": "node index.js", - "test": "echo \"Error: no test specified\" && exit 1" - }, - "keywords": [], - "author": "", - "license": "ISC", - "dependencies": { - "@types/node": "^18.0.6", - "node-fetch": "^3.2.6" - } + "name": "Blog", + "version": "1.0.0", + "description": "基于 easywebpack-vue 和 egg-view-vue-ssr 插件的 Egg + Vue SSR 服务端渲染同构工程骨架项目", + "scripts": { + "dev": "egg-bin dev", + "start": "egg-scripts start", + "debug": "egg-bin debug", + "clean": "easy clean all", + "build": "easy build prod", + "lint": "eslint .", + "fix": "eslint --fix .", + "ii": "npm install --registry https://registry.npm.taobao.org", + "changelog": "conventional-changelog -p angular -i CHANGELOG.md -s" + }, + "dependencies": { + "axios": "^0.18.1", + "codemirror": "^4.13.0", + "cross-env": "^5.0.0", + "egg": "^2.1.0", + "egg-bin": "^4.3.7", + "egg-cors": "^2.0.0", + "egg-logger": "^1.5.0", + "egg-scripts": "^2.5.1", + "egg-validate": "^1.0.0", + "egg-view-vue-ssr": "^3.2.0", + "element-ui": "^2.0.8", + "extend": "~3.0.0", + "font-awesome": "^4.7.0", + "lodash": "^4.17.4", + "lodash-id": "^0.14.0", + "lowdb": "^1.0.0", + "mockjs": "^1.0.1-beta3", + "moment": "^2.17.1", + "shortid": "^2.2.8", + "showdown": "^1.8.6", + "simplemde": "^1.11.2", + "vue": "^2.5.0", + "vue-hot-reload-api": "^2.1.0", + "vue-i18n": "^8.1.0", + "vue-material-input": "^1.2.0", + "vue-router": "^3.0.1", + "vuex": "^3.0.1", + "vuex-router-sync": "^5.0.0" + }, + "devDependencies": { + "@easy-team/easywebpack-cli": "^4.0.0", + "@easy-team/easywebpack-vue": "^4.0.0", + "babel-plugin-component": "^1.1.1", + "egg-logview": "^1.0.0", + "egg-webpack": "^4.4.1", + "egg-webpack-vue": "^2.0.0", + "eslint": "^4.19.1", + "eslint-config-egg": "^5.0.0", + "eslint-plugin-vue": "^4.4.0", + "ip": "^1.1.5" + }, + "engines": { + "node": ">=8.0.0" + }, + "ci": { + "version": "8, 10" + }, + "repository": { + "type": "git", + "url": "git+https://github.com/easy-team/egg-vue-webpack-boilerplate.git" + }, + "author": "hubcarl@126.com", + "license": "MIT", + "homepage": "https://github.com/easy-team/egg-vue-webpack-boilerplate", + "webpack": { + "loaders": {} } - \ No newline at end of file +} diff --git a/test/event.js b/test/event.js new file mode 100644 index 0000000000000000000000000000000000000000..33306389e6d7711fc7fc47b23358cff6ca8f07f3 --- /dev/null +++ b/test/event.js @@ -0,0 +1,20 @@ +const EventEmitter = require('events'); +class MyEmitter extends EventEmitter{}; +const myEmitter = new MyEmitter(); +myEmitter.on('event', function() { + console.log('event1'); +}); +myEmitter.on('event', async function() { + console.log('event2'); + await new Promise((resolve, reject) => { + setTimeout(() => { + resolve(1); + }, 1000); + }); + console.log('event3'); +}); +myEmitter.on('event', function() { + console.log('event4'); +}); +myEmitter.emit('event'); +console.log('end'); diff --git a/test/glob.js b/test/glob.js new file mode 100644 index 0000000000000000000000000000000000000000..957162df290d635bc4723ffa3dfdd3a45cc0b8aa --- /dev/null +++ b/test/glob.js @@ -0,0 +1,19 @@ +const glob = require('glob'); +const str = 'app/web/page/**!(component|components|view|views)/*.vue'; +const result = str.match(/!\((.*)\)/); +if (result && result.length) { + const matchIgnore = result[0]; + const matchIgnoreKeys = result[1]; + const matchStr = str.replace(matchIgnore, ''); + const ignore = matchIgnoreKeys.split('|').map(key => { + if (/\./.test(key)) { + return `**/${key}/**`; + } + return `**/${key}/**`; + }); + const files = glob.sync(matchStr, { ignore }); + console.log(files); +} else { + const files = glob.sync(str); + console.log(files); +} diff --git a/test/node8.js b/test/node8.js new file mode 100644 index 0000000000000000000000000000000000000000..5f2688b63ecf023fd14bee0e343fdfde9818ce35 --- /dev/null +++ b/test/node8.js @@ -0,0 +1,3 @@ +function getList() { + +} \ No newline at end of file diff --git a/test/path.js b/test/path.js new file mode 100644 index 0000000000000000000000000000000000000000..6b09f8a209e338540cc17989001630a602760e8a --- /dev/null +++ b/test/path.js @@ -0,0 +1,11 @@ +'use strict'; +const path = require('path'); +const prefix = 'static/test'; +const url = 'js/index.js'; +console.log('--path.join--', path.join(prefix, url)); +console.log('--path.posix.join--', path.posix.join(prefix, url)); + +// windows print + +// --path.join-- static\test\js\index.js +// --path.posix.join-- static/test/js/index.js \ No newline at end of file diff --git a/test/resolve.js b/test/resolve.js new file mode 100644 index 0000000000000000000000000000000000000000..ed65fbcf7e1c9f648d051f37ea3b165c2f4d75b8 --- /dev/null +++ b/test/resolve.js @@ -0,0 +1,5 @@ +'use strict'; +const path = require('path'); +const resolve = require('resolve'); +const baseDir = process.cwd() + '/app/view'; +const res = resolve.sync('test', { basedir: baseDir }); \ No newline at end of file diff --git a/test/shell.js b/test/shell.js new file mode 100644 index 0000000000000000000000000000000000000000..6571c2dd3fd6a67e1e2cc178735369d583ecfdf0 --- /dev/null +++ b/test/shell.js @@ -0,0 +1,26 @@ +const os = require('os'); +const shell = require('shelljs'); + +function checkPortUsed(port) { + let cmd = ''; + switch (os.platform()) { + case 'win32': + cmd = `netstat -ano | findstr ${port}`; + break; + case 'darwin': + cmd = `netstat -anp tcp | grep ${port}`; + break; + case 'linux': + cmd = `netstat -apn | grep ${port}`; + break; + default: + cmd = `netstat -apn | grep ${port}`; + break; + } + try { + const result = shell.exec(cmd, { silent: true }); + return !!result.stdout; + } catch (err) { + return false; + } +} \ No newline at end of file diff --git a/test/spawn.js b/test/spawn.js new file mode 100644 index 0000000000000000000000000000000000000000..254ff2fca10e5794de2324ca65785b5d73ac2920 --- /dev/null +++ b/test/spawn.js @@ -0,0 +1,6 @@ +const spawn = require('cross-spawn'); +const output = spawn.sync('ls', ['-lrt'], { + stdio: ['ignore', 'pipe', 'inherit'] +}); + +console.log(output.stdout.toString()); \ No newline at end of file diff --git a/test/vue.html b/test/vue.html new file mode 100644 index 0000000000000000000000000000000000000000..c1a1a803d68b490449040e9149e4997634539d74 --- /dev/null +++ b/test/vue.html @@ -0,0 +1,62 @@ + + + + + Vue + + + + +
{{message}}
+ +
{{message}}
+
+ +
+
+ +
+ + + \ No newline at end of file diff --git a/webpack.config.js b/webpack.config.js new file mode 100644 index 0000000000000000000000000000000000000000..20ad67cfe7ebd2e8a9b960891ddf301d6f6c6782 --- /dev/null +++ b/webpack.config.js @@ -0,0 +1,7 @@ +'use strict'; +// Document:https://www.yuque.com/easy-team/easywebpack 和 https://www.yuque.com/easy-team/egg-vue +module.exports = { + plugins: [ + { imagemini: false } + ] +}; \ No newline at end of file