Merge pull request #2 from aiordache/master
Compose app samples from the application-template repopull/3/head
commit
c162e00952
@ -0,0 +1,25 @@ |
||||
This is free and unencumbered software released into the public domain. |
||||
|
||||
Anyone is free to copy, modify, publish, use, compile, sell, or |
||||
distribute this software, either in source code form or as a compiled |
||||
binary, for any purpose, commercial or non-commercial, and by any |
||||
means. |
||||
|
||||
In jurisdictions that recognize copyright laws, the author or authors |
||||
of this software dedicate any and all copyright interest in the |
||||
software to the public domain. We make this dedication for the benefit |
||||
of the public at large and to the detriment of our heirs and |
||||
successors. We intend this dedication to be an overt act of |
||||
relinquishment in perpetuity of all present and future rights to this |
||||
software under copyright law. |
||||
|
||||
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 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. |
||||
|
||||
For more information, please refer to <https://unlicense.org> |
||||
|
@ -0,0 +1,10 @@ |
||||
FROM node:10 |
||||
|
||||
RUN mkdir /project |
||||
WORKDIR /project |
||||
|
||||
COPY . . |
||||
|
||||
RUN npm install -g @angular/cli |
||||
RUN yarn install |
||||
CMD ["ng", "serve", "--host", "0.0.0.0"] |
@ -0,0 +1,27 @@ |
||||
# Angular |
||||
|
||||
This project was generated with [Angular CLI](https://github.com/angular/angular-cli) version 8.3.23. |
||||
|
||||
## Development server |
||||
|
||||
Run `ng serve` for a dev server. Navigate to `http://localhost:4200/`. The app will automatically reload if you change any of the source files. |
||||
|
||||
## Code scaffolding |
||||
|
||||
Run `ng generate component component-name` to generate a new component. You can also use `ng generate directive|pipe|service|class|guard|interface|enum|module`. |
||||
|
||||
## Build |
||||
|
||||
Run `ng build` to build the project. The build artifacts will be stored in the `dist/` directory. Use the `--prod` flag for a production build. |
||||
|
||||
## Running unit tests |
||||
|
||||
Run `ng test` to execute the unit tests via [Karma](https://karma-runner.github.io). |
||||
|
||||
## Running end-to-end tests |
||||
|
||||
Run `ng e2e` to execute the end-to-end tests via [Protractor](http://www.protractortest.org/). |
||||
|
||||
## Further help |
||||
|
||||
To get more help on the Angular CLI use `ng help` or go check out the [Angular CLI README](https://github.com/angular/angular-cli/blob/master/README.md). |
@ -0,0 +1,125 @@ |
||||
{ |
||||
"$schema": "./node_modules/@angular/cli/lib/config/schema.json", |
||||
"version": 1, |
||||
"newProjectRoot": "projects", |
||||
"projects": { |
||||
"angular": { |
||||
"projectType": "application", |
||||
"schematics": {}, |
||||
"root": "", |
||||
"sourceRoot": "src", |
||||
"prefix": "app", |
||||
"architect": { |
||||
"build": { |
||||
"builder": "@angular-devkit/build-angular:browser", |
||||
"options": { |
||||
"outputPath": "dist/angular", |
||||
"index": "src/index.html", |
||||
"main": "src/main.ts", |
||||
"polyfills": "src/polyfills.ts", |
||||
"tsConfig": "tsconfig.app.json", |
||||
"aot": false, |
||||
"assets": [ |
||||
"src/favicon.ico", |
||||
"src/assets" |
||||
], |
||||
"styles": [ |
||||
"src/styles.css" |
||||
], |
||||
"scripts": [] |
||||
}, |
||||
"configurations": { |
||||
"production": { |
||||
"fileReplacements": [ |
||||
{ |
||||
"replace": "src/environments/environment.ts", |
||||
"with": "src/environments/environment.prod.ts" |
||||
} |
||||
], |
||||
"optimization": true, |
||||
"outputHashing": "all", |
||||
"sourceMap": false, |
||||
"extractCss": true, |
||||
"namedChunks": false, |
||||
"aot": true, |
||||
"extractLicenses": true, |
||||
"vendorChunk": false, |
||||
"buildOptimizer": true, |
||||
"budgets": [ |
||||
{ |
||||
"type": "initial", |
||||
"maximumWarning": "2mb", |
||||
"maximumError": "5mb" |
||||
}, |
||||
{ |
||||
"type": "anyComponentStyle", |
||||
"maximumWarning": "6kb", |
||||
"maximumError": "10kb" |
||||
} |
||||
] |
||||
} |
||||
} |
||||
}, |
||||
"serve": { |
||||
"builder": "@angular-devkit/build-angular:dev-server", |
||||
"options": { |
||||
"browserTarget": "angular:build" |
||||
}, |
||||
"configurations": { |
||||
"production": { |
||||
"browserTarget": "angular:build:production" |
||||
} |
||||
} |
||||
}, |
||||
"extract-i18n": { |
||||
"builder": "@angular-devkit/build-angular:extract-i18n", |
||||
"options": { |
||||
"browserTarget": "angular:build" |
||||
} |
||||
}, |
||||
"test": { |
||||
"builder": "@angular-devkit/build-angular:karma", |
||||
"options": { |
||||
"main": "src/test.ts", |
||||
"polyfills": "src/polyfills.ts", |
||||
"tsConfig": "tsconfig.spec.json", |
||||
"karmaConfig": "karma.conf.js", |
||||
"assets": [ |
||||
"src/favicon.ico", |
||||
"src/assets" |
||||
], |
||||
"styles": [ |
||||
"src/styles.css" |
||||
], |
||||
"scripts": [] |
||||
} |
||||
}, |
||||
"lint": { |
||||
"builder": "@angular-devkit/build-angular:tslint", |
||||
"options": { |
||||
"tsConfig": [ |
||||
"tsconfig.app.json", |
||||
"tsconfig.spec.json", |
||||
"e2e/tsconfig.json" |
||||
], |
||||
"exclude": [ |
||||
"**/node_modules/**" |
||||
] |
||||
} |
||||
}, |
||||
"e2e": { |
||||
"builder": "@angular-devkit/build-angular:protractor", |
||||
"options": { |
||||
"protractorConfig": "e2e/protractor.conf.js", |
||||
"devServerTarget": "angular:serve" |
||||
}, |
||||
"configurations": { |
||||
"production": { |
||||
"devServerTarget": "angular:serve:production" |
||||
} |
||||
} |
||||
} |
||||
} |
||||
}}, |
||||
"defaultProject": "angular" |
||||
} |
@ -0,0 +1,12 @@ |
||||
# This file is used by the build system to adjust CSS and JS output to support the specified browsers below. |
||||
# For additional information regarding the format and rule options, please see: |
||||
# https://github.com/browserslist/browserslist#queries |
||||
|
||||
# You can see what browsers were selected by your queries by running: |
||||
# npx browserslist |
||||
|
||||
> 0.5% |
||||
last 2 versions |
||||
Firefox ESR |
||||
not dead |
||||
not IE 9-11 # For IE 9-11 support, remove 'not'. |
@ -0,0 +1,32 @@ |
||||
// @ts-check
|
||||
// Protractor configuration file, see link for more information
|
||||
// https://github.com/angular/protractor/blob/master/lib/config.ts
|
||||
|
||||
const { SpecReporter } = require('jasmine-spec-reporter'); |
||||
|
||||
/** |
||||
* @type { import("protractor").Config } |
||||
*/ |
||||
exports.config = { |
||||
allScriptsTimeout: 11000, |
||||
specs: [ |
||||
'./src/**/*.e2e-spec.ts' |
||||
], |
||||
capabilities: { |
||||
browserName: 'chrome' |
||||
}, |
||||
directConnect: true, |
||||
baseUrl: 'http://localhost:4200/', |
||||
framework: 'jasmine', |
||||
jasmineNodeOpts: { |
||||
showColors: true, |
||||
defaultTimeoutInterval: 30000, |
||||
print: function() {} |
||||
}, |
||||
onPrepare() { |
||||
require('ts-node').register({ |
||||
project: require('path').join(__dirname, './tsconfig.json') |
||||
}); |
||||
jasmine.getEnv().addReporter(new SpecReporter({ spec: { displayStacktrace: true } })); |
||||
} |
||||
}; |
@ -0,0 +1,23 @@ |
||||
import { AppPage } from './app.po'; |
||||
import { browser, logging } from 'protractor'; |
||||
|
||||
describe('workspace-project App', () => { |
||||
let page: AppPage; |
||||
|
||||
beforeEach(() => { |
||||
page = new AppPage(); |
||||
}); |
||||
|
||||
it('should display welcome message', () => { |
||||
page.navigateTo(); |
||||
expect(page.getTitleText()).toEqual('angular app is running!'); |
||||
}); |
||||
|
||||
afterEach(async () => { |
||||
// Assert that there are no errors emitted from the browser
|
||||
const logs = await browser.manage().logs().get(logging.Type.BROWSER); |
||||
expect(logs).not.toContain(jasmine.objectContaining({ |
||||
level: logging.Level.SEVERE, |
||||
} as logging.Entry)); |
||||
}); |
||||
}); |
@ -0,0 +1,11 @@ |
||||
import { browser, by, element } from 'protractor'; |
||||
|
||||
export class AppPage { |
||||
navigateTo() { |
||||
return browser.get(browser.baseUrl) as Promise<any>; |
||||
} |
||||
|
||||
getTitleText() { |
||||
return element(by.css('app-root .content span')).getText() as Promise<string>; |
||||
} |
||||
} |
@ -0,0 +1,13 @@ |
||||
{ |
||||
"extends": "../tsconfig.json", |
||||
"compilerOptions": { |
||||
"outDir": "../out-tsc/e2e", |
||||
"module": "commonjs", |
||||
"target": "es5", |
||||
"types": [ |
||||
"jasmine", |
||||
"jasminewd2", |
||||
"node" |
||||
] |
||||
} |
||||
} |
@ -0,0 +1,32 @@ |
||||
// Karma configuration file, see link for more information
|
||||
// https://karma-runner.github.io/1.0/config/configuration-file.html
|
||||
|
||||
module.exports = function (config) { |
||||
config.set({ |
||||
basePath: '', |
||||
frameworks: ['jasmine', '@angular-devkit/build-angular'], |
||||
plugins: [ |
||||
require('karma-jasmine'), |
||||
require('karma-chrome-launcher'), |
||||
require('karma-jasmine-html-reporter'), |
||||
require('karma-coverage-istanbul-reporter'), |
||||
require('@angular-devkit/build-angular/plugins/karma') |
||||
], |
||||
client: { |
||||
clearContext: false // leave Jasmine Spec Runner output visible in browser
|
||||
}, |
||||
coverageIstanbulReporter: { |
||||
dir: require('path').join(__dirname, './coverage/angular'), |
||||
reports: ['html', 'lcovonly', 'text-summary'], |
||||
fixWebpackSourcePaths: true |
||||
}, |
||||
reporters: ['progress', 'kjhtml'], |
||||
port: 9876, |
||||
colors: true, |
||||
logLevel: config.LOG_INFO, |
||||
autoWatch: true, |
||||
browsers: ['Chrome'], |
||||
singleRun: false, |
||||
restartOnFileChange: true |
||||
}); |
||||
}; |
@ -0,0 +1,47 @@ |
||||
{ |
||||
"name": "angular", |
||||
"version": "0.0.0", |
||||
"scripts": { |
||||
"ng": "ng", |
||||
"start": "ng serve", |
||||
"build": "ng build", |
||||
"test": "ng test", |
||||
"lint": "ng lint", |
||||
"e2e": "ng e2e" |
||||
}, |
||||
"private": true, |
||||
"dependencies": { |
||||
"@angular/animations": "~8.2.14", |
||||
"@angular/common": "~8.2.14", |
||||
"@angular/compiler": "~8.2.14", |
||||
"@angular/core": "~8.2.14", |
||||
"@angular/forms": "~8.2.14", |
||||
"@angular/platform-browser": "~8.2.14", |
||||
"@angular/platform-browser-dynamic": "~8.2.14", |
||||
"@angular/router": "~8.2.14", |
||||
"rxjs": "~6.4.0", |
||||
"tslib": "^1.10.0", |
||||
"zone.js": "~0.9.1" |
||||
}, |
||||
"devDependencies": { |
||||
"@angular-devkit/build-angular": "~0.803.23", |
||||
"@angular/cli": "~8.3.23", |
||||
"@angular/compiler-cli": "~8.2.14", |
||||
"@angular/language-service": "~8.2.14", |
||||
"@types/node": "~8.9.4", |
||||
"@types/jasmine": "~3.3.8", |
||||
"@types/jasminewd2": "~2.0.3", |
||||
"codelyzer": "^5.0.0", |
||||
"jasmine-core": "~3.4.0", |
||||
"jasmine-spec-reporter": "~4.2.1", |
||||
"karma": "~4.1.0", |
||||
"karma-chrome-launcher": "~2.2.0", |
||||
"karma-coverage-istanbul-reporter": "~2.0.1", |
||||
"karma-jasmine": "~2.0.1", |
||||
"karma-jasmine-html-reporter": "^1.4.0", |
||||
"protractor": "~5.4.0", |
||||
"ts-node": "~7.0.0", |
||||
"tslint": "~5.15.0", |
||||
"typescript": "~3.5.3" |
||||
} |
||||
} |
@ -0,0 +1,11 @@ |
||||
import { NgModule } from '@angular/core'; |
||||
import { Routes, RouterModule } from '@angular/router'; |
||||
|
||||
|
||||
const routes: Routes = []; |
||||
|
||||
@NgModule({ |
||||
imports: [RouterModule.forRoot(routes)], |
||||
exports: [RouterModule] |
||||
}) |
||||
export class AppRoutingModule { } |
@ -0,0 +1,538 @@ |
||||
<!-- * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * --> |
||||
<!-- * * * * * * * * * * * The content below * * * * * * * * * * * --> |
||||
<!-- * * * * * * * * * * is only a placeholder * * * * * * * * * * --> |
||||
<!-- * * * * * * * * * * and can be replaced. * * * * * * * * * * * --> |
||||
<!-- * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * --> |
||||
<!-- * * * * * * * * * Delete the template below * * * * * * * * * * --> |
||||
<!-- * * * * * * * to get started with your project! * * * * * * * * --> |
||||
<!-- * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * --> |
||||
|
||||
<style> |
||||
:host { |
||||
font-family: -apple-system, BlinkMacSystemFont, "Segoe UI", Roboto, Helvetica, Arial, sans-serif, "Apple Color Emoji", "Segoe UI Emoji", "Segoe UI Symbol"; |
||||
font-size: 14px; |
||||
color: #333; |
||||
box-sizing: border-box; |
||||
-webkit-font-smoothing: antialiased; |
||||
-moz-osx-font-smoothing: grayscale; |
||||
} |
||||
|
||||
h1, |
||||
h2, |
||||
h3, |
||||
h4, |
||||
h5, |
||||
h6 { |
||||
margin: 8px 0; |
||||
} |
||||
|
||||
p { |
||||
margin: 0; |
||||
} |
||||
|
||||
.spacer { |
||||
flex: 1; |
||||
} |
||||
|
||||
.toolbar { |
||||
height: 60px; |
||||
margin: -8px; |
||||
display: flex; |
||||
align-items: center; |
||||
background-color: #1976d2; |
||||
color: white; |
||||
font-weight: 600; |
||||
} |
||||
|
||||
.toolbar img { |
||||
margin: 0 16px; |
||||
} |
||||
|
||||
.toolbar #twitter-logo { |
||||
height: 40px; |
||||
margin: 0 16px; |
||||
} |
||||
|
||||
.toolbar #twitter-logo:hover { |
||||
opacity: 0.8; |
||||
} |
||||
|
||||
.content { |
||||
display: flex; |
||||
margin: 32px auto; |
||||
padding: 0 16px; |
||||
max-width: 960px; |
||||
flex-direction: column; |
||||
align-items: center; |
||||
} |
||||
|
||||
svg.material-icons { |
||||
height: 24px; |
||||
width: auto; |
||||
} |
||||
|
||||
svg.material-icons:not(:last-child) { |
||||
margin-right: 8px; |
||||
} |
||||
|
||||
.card svg.material-icons path { |
||||
fill: #888; |
||||
} |
||||
|
||||
.card-container { |
||||
display: flex; |
||||
flex-wrap: wrap; |
||||
justify-content: center; |
||||
margin-top: 16px; |
||||
} |
||||
|
||||
.card { |
||||
border-radius: 4px; |
||||
border: 1px solid #eee; |
||||
background-color: #fafafa; |
||||
height: 40px; |
||||
width: 200px; |
||||
margin: 0 8px 16px; |
||||
padding: 16px; |
||||
display: flex; |
||||
flex-direction: row; |
||||
justify-content: center; |
||||
align-items: center; |
||||
transition: all 0.2s ease-in-out; |
||||
line-height: 24px; |
||||
} |
||||
|
||||
.card-container .card:not(:last-child) { |
||||
margin-right: 0; |
||||
} |
||||
|
||||
.card.card-small { |
||||
height: 16px; |
||||
width: 168px; |
||||
} |
||||
|
||||
.card-container .card:not(.highlight-card) { |
||||
cursor: pointer; |
||||
} |
||||
|
||||
.card-container .card:not(.highlight-card):hover { |
||||
transform: translateY(-3px); |
||||
box-shadow: 0 4px 17px rgba(black, 0.35); |
||||
} |
||||
|
||||
.card-container .card:not(.highlight-card):hover .material-icons path { |
||||
fill: rgb(105, 103, 103); |
||||
} |
||||
|
||||
.card.highlight-card { |
||||
background-color: #1976d2; |
||||
color: white; |
||||
font-weight: 600; |
||||
border: none; |
||||
width: auto; |
||||
min-width: 30%; |
||||
position: relative; |
||||
} |
||||
|
||||
.card.card.highlight-card span { |
||||
margin-left: 60px; |
||||
} |
||||
|
||||
svg#rocket { |
||||
width: 80px; |
||||
position: absolute; |
||||
left: -10px; |
||||
top: -24px; |
||||
} |
||||
|
||||
svg#rocket-smoke { |
||||
height: 100vh; |
||||
position: absolute; |
||||
top: 10px; |
||||
right: 180px; |
||||
z-index: -10; |
||||
} |
||||
|
||||
a, |
||||
a:visited, |
||||
a:hover { |
||||
color: #1976d2; |
||||
text-decoration: none; |
||||
} |
||||
|
||||
a:hover { |
||||
color: #125699; |
||||
} |
||||
|
||||
.terminal { |
||||
position: relative; |
||||
width: 80%; |
||||
max-width: 600px; |
||||
border-radius: 6px; |
||||
padding-top: 45px; |
||||
margin-top: 8px; |
||||
overflow: hidden; |
||||
background-color: rgb(15, 15, 16); |
||||
} |
||||
|
||||
.terminal::before { |
||||
content: "\2022 \2022 \2022"; |
||||
position: absolute; |
||||
top: 0; |
||||
left: 0; |
||||
height: 4px; |
||||
background: rgb(58, 58, 58); |
||||
color: #c2c3c4; |
||||
width: 100%; |
||||
font-size: 2rem; |
||||
line-height: 0; |
||||
padding: 14px 0; |
||||
text-indent: 4px; |
||||
} |
||||
|
||||
.terminal pre { |
||||
font-family: SFMono-Regular,Consolas,Liberation Mono,Menlo,monospace; |
||||
color: white; |
||||
padding: 0 1rem 1rem; |
||||
margin: 0; |
||||
} |
||||
|
||||
.circle-link { |
||||
height: 40px; |
||||
width: 40px; |
||||
border-radius: 40px; |
||||
margin: 8px; |
||||
background-color: white; |
||||
border: 1px solid #eeeeee; |
||||
display: flex; |
||||
justify-content: center; |
||||
align-items: center; |
||||
cursor: pointer; |
||||
box-shadow: 0 1px 3px rgba(0, 0, 0, 0.12), 0 1px 2px rgba(0, 0, 0, 0.24); |
||||
transition: 1s ease-out; |
||||
} |
||||
|
||||
.circle-link:hover { |
||||
transform: translateY(-0.25rem); |
||||
box-shadow: 0px 3px 15px rgba(0, 0, 0, 0.2); |
||||
} |
||||
|
||||
footer { |
||||
margin-top: 8px; |
||||
display: flex; |
||||
align-items: center; |
||||
line-height: 20px; |
||||
} |
||||
|
||||
footer a { |
||||
display: flex; |
||||
align-items: center; |
||||
} |
||||
|
||||
.github-star-badge { |
||||
color: #24292e; |
||||
display: flex; |
||||
align-items: center; |
||||
font-size: 12px; |
||||
padding: 3px 10px; |
||||
border: 1px solid rgba(27,31,35,.2); |
||||
border-radius: 3px; |
||||
background-image: linear-gradient(-180deg,#fafbfc,#eff3f6 90%); |
||||
margin-left: 4px; |
||||
font-weight: 600; |
||||
font-family: -apple-system,BlinkMacSystemFont,Segoe UI,Helvetica,Arial,sans-serif,Apple Color Emoji,Segoe UI Emoji,Segoe UI Symbol; |
||||
} |
||||
|
||||
.github-star-badge:hover { |
||||
background-image: linear-gradient(-180deg,#f0f3f6,#e6ebf1 90%); |
||||
border-color: rgba(27,31,35,.35); |
||||
background-position: -.5em; |
||||
} |
||||
|
||||
.github-star-badge .material-icons { |
||||
height: 16px; |
||||
width: 16px; |
||||
margin-right: 4px; |
||||
} |
||||
|
||||
svg#clouds { |
||||
position: fixed; |
||||
bottom: -160px; |
||||
left: -230px; |
||||
z-index: -10; |
||||
width: 1920px; |
||||
} |
||||
|
||||
|
||||
/* Responsive Styles */ |
||||
@media screen and (max-width: 767px) { |
||||
|
||||
.card-container > *:not(.circle-link) , |
||||
.terminal { |
||||
width: 100%; |
||||
} |
||||
|
||||
.card:not(.highlight-card) { |
||||
height: 16px; |
||||
margin: 8px 0; |
||||
} |
||||
|
||||
.card.highlight-card span { |
||||
margin-left: 72px; |
||||
} |
||||
|
||||
svg#rocket-smoke { |
||||
right: 120px; |
||||
transform: rotate(-5deg); |
||||
} |
||||
} |
||||
|
||||
@media screen and (max-width: 575px) { |
||||
svg#rocket-smoke { |
||||
display: none; |
||||
visibility: hidden; |
||||
} |
||||
} |
||||
</style> |
||||
|
||||
<!-- Toolbar --> |
||||
<div class="toolbar" role="banner"> |
||||
<img |
||||
width="40" |
||||
alt="Angular Logo" |
||||
src="data:image/svg+xml;base64,PHN2ZyB4bWxucz0iaHR0cDovL3d3dy53My5vcmcvMjAwMC9zdmciIHZpZXdCb3g9IjAgMCAyNTAgMjUwIj4KICAgIDxwYXRoIGZpbGw9IiNERDAwMzEiIGQ9Ik0xMjUgMzBMMzEuOSA2My4ybDE0LjIgMTIzLjFMMTI1IDIzMGw3OC45LTQzLjcgMTQuMi0xMjMuMXoiIC8+CiAgICA8cGF0aCBmaWxsPSIjQzMwMDJGIiBkPSJNMTI1IDMwdjIyLjItLjFWMjMwbDc4LjktNDMuNyAxNC4yLTEyMy4xTDEyNSAzMHoiIC8+CiAgICA8cGF0aCAgZmlsbD0iI0ZGRkZGRiIgZD0iTTEyNSA1Mi4xTDY2LjggMTgyLjZoMjEuN2wxMS43LTI5LjJoNDkuNGwxMS43IDI5LjJIMTgzTDEyNSA1Mi4xem0xNyA4My4zaC0zNGwxNy00MC45IDE3IDQwLjl6IiAvPgogIDwvc3ZnPg==" |
||||
/> |
||||
<span>Welcome</span> |
||||
<div class="spacer"></div> |
||||
<a aria-label="Angular on twitter" target="_blank" rel="noopener" href="https://twitter.com/angular" title="Twitter"> |
||||
|
||||
<svg id="twitter-logo" height="24" data-name="Logo — FIXED" xmlns="http://www.w3.org/2000/svg" viewBox="0 0 400 400"> |
||||
<defs> |
||||
<style> |
||||
.cls-1 { |
||||
fill: none; |
||||
} |
||||
|
||||
.cls-2 { |
||||
fill: #ffffff; |
||||
} |
||||
</style> |
||||
</defs> |
||||
<rect class="cls-1" width="400" height="400" /> |
||||
<path class="cls-2" d="M153.62,301.59c94.34,0,145.94-78.16,145.94-145.94,0-2.22,0-4.43-.15-6.63A104.36,104.36,0,0,0,325,122.47a102.38,102.38,0,0,1-29.46,8.07,51.47,51.47,0,0,0,22.55-28.37,102.79,102.79,0,0,1-32.57,12.45,51.34,51.34,0,0,0-87.41,46.78A145.62,145.62,0,0,1,92.4,107.81a51.33,51.33,0,0,0,15.88,68.47A50.91,50.91,0,0,1,85,169.86c0,.21,0,.43,0,.65a51.31,51.31,0,0,0,41.15,50.28,51.21,51.21,0,0,1-23.16.88,51.35,51.35,0,0,0,47.92,35.62,102.92,102.92,0,0,1-63.7,22A104.41,104.41,0,0,1,75,278.55a145.21,145.21,0,0,0,78.62,23" |
||||
/> |
||||
</svg> |
||||
|
||||
</a> |
||||
</div> |
||||
|
||||
<div class="content" role="main"> |
||||
|
||||
<!-- Highlight Card --> |
||||
<div class="card highlight-card card-small"> |
||||
|
||||
<svg id="rocket" alt="Rocket Ship" xmlns="http://www.w3.org/2000/svg" width="101.678" height="101.678" viewBox="0 0 101.678 101.678"> |
||||
<g id="Group_83" data-name="Group 83" transform="translate(-141 -696)"> |
||||
<circle id="Ellipse_8" data-name="Ellipse 8" cx="50.839" cy="50.839" r="50.839" transform="translate(141 696)" fill="#dd0031"/> |
||||
<g id="Group_47" data-name="Group 47" transform="translate(165.185 720.185)"> |
||||
<path id="Path_33" data-name="Path 33" d="M3.4,42.615a3.084,3.084,0,0,0,3.553,3.553,21.419,21.419,0,0,0,12.215-6.107L9.511,30.4A21.419,21.419,0,0,0,3.4,42.615Z" transform="translate(0.371 3.363)" fill="#fff"/> |
||||
<path id="Path_34" data-name="Path 34" d="M53.3,3.221A3.09,3.09,0,0,0,50.081,0,48.227,48.227,0,0,0,18.322,13.437c-6-1.666-14.991-1.221-18.322,7.218A33.892,33.892,0,0,1,9.439,25.1l-.333.666a3.013,3.013,0,0,0,.555,3.553L23.985,43.641a2.9,2.9,0,0,0,3.553.555l.666-.333A33.892,33.892,0,0,1,32.647,53.3c8.55-3.664,8.884-12.326,7.218-18.322A48.227,48.227,0,0,0,53.3,3.221ZM34.424,9.772a6.439,6.439,0,1,1,9.106,9.106,6.368,6.368,0,0,1-9.106,0A6.467,6.467,0,0,1,34.424,9.772Z" transform="translate(0 0.005)" fill="#fff"/> |
||||
</g> |
||||
</g> |
||||
</svg> |
||||
|
||||
<span>{{ title }} app is running!</span> |
||||
|
||||
<svg id="rocket-smoke" alt="Rocket Ship Smoke" xmlns="http://www.w3.org/2000/svg" width="516.119" height="1083.632" viewBox="0 0 516.119 1083.632"> |
||||
<path id="Path_40" data-name="Path 40" d="M644.6,141S143.02,215.537,147.049,870.207s342.774,201.755,342.774,201.755S404.659,847.213,388.815,762.2c-27.116-145.51-11.551-384.124,271.9-609.1C671.15,139.365,644.6,141,644.6,141Z" transform="translate(-147.025 -140.939)" fill="#f5f5f5"/> |
||||
</svg> |
||||
|
||||
</div> |
||||
|
||||
<!-- Resources --> |
||||
<h2>Resources</h2> |
||||
<p>Here are some links to help you get started:</p> |
||||
|
||||
<div class="card-container"> |
||||
<a class="card" target="_blank" rel="noopener" href="https://angular.io/tutorial"> |
||||
<svg class="material-icons" xmlns="http://www.w3.org/2000/svg" width="24" height="24" viewBox="0 0 24 24"><path d="M5 13.18v4L12 21l7-3.82v-4L12 17l-7-3.82zM12 3L1 9l11 6 9-4.91V17h2V9L12 3z"/></svg> |
||||
|
||||
<span>Learn Angular</span> |
||||
|
||||
<svg class="material-icons" xmlns="http://www.w3.org/2000/svg" width="24" height="24" viewBox="0 0 24 24"><path d="M10 6L8.59 7.41 13.17 12l-4.58 4.59L10 18l6-6z"/></svg> </a> |
||||
|
||||
<a class="card" target="_blank" rel="noopener" href="https://angular.io/cli"> |
||||
<svg class="material-icons" xmlns="http://www.w3.org/2000/svg" width="24" height="24" viewBox="0 0 24 24"><path d="M9.4 16.6L4.8 12l4.6-4.6L8 6l-6 6 6 6 1.4-1.4zm5.2 0l4.6-4.6-4.6-4.6L16 6l6 6-6 6-1.4-1.4z"/></svg> |
||||
|
||||
<span>CLI Documentation</span> |
||||
|
||||
<svg class="material-icons" xmlns="http://www.w3.org/2000/svg" width="24" height="24" viewBox="0 0 24 24"><path d="M10 6L8.59 7.41 13.17 12l-4.58 4.59L10 18l6-6z"/></svg> |
||||
</a> |
||||
|
||||
<a class="card" target="_blank" rel="noopener" href="https://blog.angular.io/"> |
||||
<svg class="material-icons" xmlns="http://www.w3.org/2000/svg" width="24" height="24" viewBox="0 0 24 24"><path d="M13.5.67s.74 2.65.74 4.8c0 2.06-1.35 3.73-3.41 3.73-2.07 0-3.63-1.67-3.63-3.73l.03-.36C5.21 7.51 4 10.62 4 14c0 4.42 3.58 8 8 8s8-3.58 8-8C20 8.61 17.41 3.8 13.5.67zM11.71 19c-1.78 0-3.22-1.4-3.22-3.14 0-1.62 1.05-2.76 2.81-3.12 1.77-.36 3.6-1.21 4.62-2.58.39 1.29.59 2.65.59 4.04 0 2.65-2.15 4.8-4.8 4.8z"/></svg> |
||||
|
||||
<span>Angular Blog</span> |
||||
|
||||
<svg class="material-icons" xmlns="http://www.w3.org/2000/svg" width="24" height="24" viewBox="0 0 24 24"><path d="M10 6L8.59 7.41 13.17 12l-4.58 4.59L10 18l6-6z"/></svg> |
||||
</a> |
||||
|
||||
</div> |
||||
|
||||
<!-- Next Steps --> |
||||
<h2>Next Steps</h2> |
||||
<p>What do you want to do next with your app?</p> |
||||
|
||||
<input type="hidden" #selection> |
||||
|
||||
<div class="card-container"> |
||||
<div class="card card-small" (click)="selection.value = 'component'" tabindex="0"> |
||||
<svg class="material-icons" xmlns="http://www.w3.org/2000/svg" width="24" height="24" viewBox="0 0 24 24"><path d="M19 13h-6v6h-2v-6H5v-2h6V5h2v6h6v2z"/></svg> |
||||
|
||||
<span>New Component</span> |
||||
</div> |
||||
|
||||
<div class="card card-small" (click)="selection.value = 'material'" tabindex="0"> |
||||
<svg class="material-icons" xmlns="http://www.w3.org/2000/svg" width="24" height="24" viewBox="0 0 24 24"><path d="M19 13h-6v6h-2v-6H5v-2h6V5h2v6h6v2z"/></svg> |
||||
|
||||
<span>Angular Material</span> |
||||
</div> |
||||
|
||||
<div class="card card-small" (click)="selection.value = 'dependency'" tabindex="0"> |
||||
<svg class="material-icons" xmlns="http://www.w3.org/2000/svg" width="24" height="24" viewBox="0 0 24 24"><path d="M19 13h-6v6h-2v-6H5v-2h6V5h2v6h6v2z"/></svg> |
||||
|
||||
<span>Add Dependency</span> |
||||
</div> |
||||
|
||||
<div class="card card-small" (click)="selection.value = 'test'" tabindex="0"> |
||||
<svg class="material-icons" xmlns="http://www.w3.org/2000/svg" width="24" height="24" viewBox="0 0 24 24"><path d="M19 13h-6v6h-2v-6H5v-2h6V5h2v6h6v2z"/></svg> |
||||
|
||||
<span>Run and Watch Tests</span> |
||||
</div> |
||||
|
||||
<div class="card card-small" (click)="selection.value = 'build'" tabindex="0"> |
||||
<svg class="material-icons" xmlns="http://www.w3.org/2000/svg" width="24" height="24" viewBox="0 0 24 24"><path d="M19 13h-6v6h-2v-6H5v-2h6V5h2v6h6v2z"/></svg> |
||||
|
||||
<span>Build for Production</span> |
||||
</div> |
||||
</div> |
||||
|
||||
<!-- Terminal --> |
||||
<div class="terminal" [ngSwitch]="selection.value"> |
||||
<pre *ngSwitchDefault>ng generate component xyz</pre> |
||||
<pre *ngSwitchCase="'material'">ng add @angular/material</pre> |
||||
<pre *ngSwitchCase="'dependency'">ng add _____</pre> |
||||
<pre *ngSwitchCase="'test'">ng test</pre> |
||||
<pre *ngSwitchCase="'build'">ng build --prod</pre> |
||||
</div> |
||||
|
||||
<!-- Links --> |
||||
<div class="card-container"> |
||||
<a class="circle-link" title="Animations" href="https://angular.io/guide/animations" target="_blank" rel="noopener"> |
||||
<svg id="Group_20" data-name="Group 20" xmlns="http://www.w3.org/2000/svg" width="21.813" height="23.453" viewBox="0 0 21.813 23.453"> |
||||
<path id="Path_15" data-name="Path 15" d="M4099.584,972.736h0l-10.882,3.9,1.637,14.4,9.245,5.153,9.245-5.153,1.686-14.4Z" transform="translate(-4088.702 -972.736)" fill="#ffa726"/> |
||||
<path id="Path_16" data-name="Path 16" d="M4181.516,972.736v23.453l9.245-5.153,1.686-14.4Z" transform="translate(-4170.633 -972.736)" fill="#fb8c00"/> |
||||
<path id="Path_17" data-name="Path 17" d="M4137.529,1076.127l-7.7-3.723,4.417-2.721,7.753,3.723Z" transform="translate(-4125.003 -1058.315)" fill="#ffe0b2"/> |
||||
<path id="Path_18" data-name="Path 18" d="M4137.529,1051.705l-7.7-3.723,4.417-2.721,7.753,3.723Z" transform="translate(-4125.003 -1036.757)" fill="#fff3e0"/> |
||||
<path id="Path_19" data-name="Path 19" d="M4137.529,1027.283l-7.7-3.723,4.417-2.721,7.753,3.723Z" transform="translate(-4125.003 -1015.199)" fill="#fff"/> |
||||
</svg> |
||||
</a> |
||||
|
||||
<a class="circle-link" title="CLI" href="https://cli.angular.io/" target="_blank" rel="noopener"> |
||||
<svg alt="Angular CLI Logo" xmlns="http://www.w3.org/2000/svg" width="21.762" height="23.447" viewBox="0 0 21.762 23.447"> |
||||
<g id="Group_21" data-name="Group 21" transform="translate(0)"> |
||||
<path id="Path_20" data-name="Path 20" d="M2660.313,313.618h0l-10.833,3.9,1.637,14.4,9.2,5.152,9.244-5.152,1.685-14.4Z" transform="translate(-2649.48 -313.618)" fill="#37474f"/> |
||||
<path id="Path_21" data-name="Path 21" d="M2741.883,313.618v23.447l9.244-5.152,1.685-14.4Z" transform="translate(-2731.05 -313.618)" fill="#263238"/> |
||||
<path id="Path_22" data-name="Path 22" d="M2692.293,379.169h11.724V368.618h-11.724Zm11.159-.6h-10.608v-9.345h10.621v9.345Z" transform="translate(-2687.274 -362.17)" fill="#fff"/> |
||||
<path id="Path_23" data-name="Path 23" d="M2709.331,393.688l.4.416,2.265-2.28-2.294-2.294-.4.4,1.893,1.893Z" transform="translate(-2702.289 -380.631)" fill="#fff"/> |
||||
<rect id="Rectangle_12" data-name="Rectangle 12" width="3.517" height="0.469" transform="translate(9.709 13.744)" fill="#fff"/> |
||||
</g> |
||||
</svg> |
||||
</a> |
||||
|
||||
<a class="circle-link" title="Augury" href="https://augury.rangle.io/" target="_blank" rel="noopener"> |
||||
<svg alt="Angular Augury Logo" xmlns="http://www.w3.org/2000/svg" xmlns:xlink="http://www.w3.org/1999/xlink" width="21.81" height="23.447" viewBox="0 0 21.81 23.447"> |
||||
<defs> |
||||
<clipPath id="clip-path"> |
||||
<rect id="Rectangle_13" data-name="Rectangle 13" width="10.338" height="10.27" fill="none"/> |
||||
</clipPath> |
||||
</defs> |
||||
<g id="Group_25" data-name="Group 25" transform="translate(0)"> |
||||
<path id="Path_24" data-name="Path 24" d="M3780.155,311.417h0l-10.881,3.9,1.637,14.4,9.244,5.152,9.244-5.152,1.685-14.4Z" transform="translate(-3769.274 -311.417)" fill="#4a3493"/> |
||||
<path id="Path_25" data-name="Path 25" d="M3862.088,311.417v23.447l9.244-5.152,1.685-14.4Z" transform="translate(-3851.207 -311.417)" fill="#311b92"/> |
||||
<g id="Group_24" data-name="Group 24" transform="translate(6.194 6.73)" opacity="0.5"> |
||||
<g id="Group_23" data-name="Group 23" transform="translate(0 0)"> |
||||
<g id="Group_22" data-name="Group 22" clip-path="url(#clip-path)"> |
||||
<path id="Path_26" data-name="Path 26" d="M3832.4,373.252a5.168,5.168,0,1,1-5.828-4.383,5.216,5.216,0,0,1,2.574.3,3.017,3.017,0,1,0,3.252,4.086Z" transform="translate(-3822.107 -368.821)" fill="#fff"/> |
||||
</g> |
||||
</g> |
||||
</g> |
||||
<path id="Path_27" data-name="Path 27" d="M3830.582,370.848a5.162,5.162,0,1,1-3.254-4.086,3.017,3.017,0,1,0,3.252,4.086Z" transform="translate(-3814.311 -359.969)" fill="#fff"/> |
||||
</g> |
||||
</svg> |
||||
</a> |
||||
|
||||
<a class="circle-link" title="Protractor" href="https://www.protractortest.org/" target="_blank" rel="noopener"> |
||||
<svg alt="Angular Protractor Logo" xmlns="http://www.w3.org/2000/svg" width="21.81" height="23.447" viewBox="0 0 21.81 23.447"> |
||||
<g id="Group_26" data-name="Group 26" transform="translate(0)"> |
||||
<path id="Path_28" data-name="Path 28" d="M4620.155,311.417h0l-10.881,3.9,1.637,14.4,9.244,5.152,9.244-5.152,1.685-14.4Z" transform="translate(-4609.274 -311.417)" fill="#e13439"/> |
||||
<path id="Path_29" data-name="Path 29" d="M4702.088,311.417v23.447l9.244-5.152,1.685-14.4Z" transform="translate(-4691.207 -311.417)" fill="#b52f32"/> |
||||
<path id="Path_30" data-name="Path 30" d="M4651.044,369.58v-.421h1.483a7.6,7.6,0,0,0-2.106-5.052l-1.123,1.123-.3-.3,1.122-1.121a7.588,7.588,0,0,0-4.946-2.055v1.482h-.421v-1.485a7.589,7.589,0,0,0-5.051,2.058l1.122,1.121-.3.3-1.123-1.123a7.591,7.591,0,0,0-2.106,5.052h1.482v.421h-1.489v1.734h15.241V369.58Zm-10.966-.263a4.835,4.835,0,0,1,9.67,0Z" transform="translate(-4634.008 -355.852)" fill="#fff"/> |
||||
</g> |
||||
</svg> |
||||
</a> |
||||
|
||||
<a class="circle-link" title="Find a Local Meetup" href="https://www.meetup.com/find/?keywords=angular" target="_blank" rel="noopener"> |
||||
<svg alt="Meetup Logo" xmlns="http://www.w3.org/2000/svg" width="24.607" height="23.447" viewBox="0 0 24.607 23.447"> |
||||
<path id="logo--mSwarm" d="M21.221,14.95A4.393,4.393,0,0,1,17.6,19.281a4.452,4.452,0,0,1-.8.069c-.09,0-.125.035-.154.117a2.939,2.939,0,0,1-2.506,2.091,2.868,2.868,0,0,1-2.248-.624.168.168,0,0,0-.245-.005,3.926,3.926,0,0,1-2.589.741,4.015,4.015,0,0,1-3.7-3.347,2.7,2.7,0,0,1-.043-.38c0-.106-.042-.146-.143-.166a3.524,3.524,0,0,1-1.516-.69A3.623,3.623,0,0,1,2.23,14.557a3.66,3.66,0,0,1,1.077-3.085.138.138,0,0,0,.026-.2,3.348,3.348,0,0,1-.451-1.821,3.46,3.46,0,0,1,2.749-3.28.44.44,0,0,0,.355-.281,5.072,5.072,0,0,1,3.863-3,5.028,5.028,0,0,1,3.555.666.31.31,0,0,0,.271.03A4.5,4.5,0,0,1,18.3,4.7a4.4,4.4,0,0,1,1.334,2.751,3.658,3.658,0,0,1,.022.706.131.131,0,0,0,.1.157,2.432,2.432,0,0,1,1.574,1.645,2.464,2.464,0,0,1-.7,2.616c-.065.064-.051.1-.014.166A4.321,4.321,0,0,1,21.221,14.95ZM13.4,14.607a2.09,2.09,0,0,0,1.409,1.982,4.7,4.7,0,0,0,1.275.221,1.807,1.807,0,0,0,.9-.151.542.542,0,0,0,.321-.545.558.558,0,0,0-.359-.534,1.2,1.2,0,0,0-.254-.078c-.262-.047-.526-.086-.787-.138a.674.674,0,0,1-.617-.75,3.394,3.394,0,0,1,.218-1.109c.217-.658.509-1.286.79-1.918a15.609,15.609,0,0,0,.745-1.86,1.95,1.95,0,0,0,.06-1.073,1.286,1.286,0,0,0-1.051-1.033,1.977,1.977,0,0,0-1.521.2.339.339,0,0,1-.446-.042c-.1-.092-.2-.189-.307-.284a1.214,1.214,0,0,0-1.643-.061,7.563,7.563,0,0,1-.614.512A.588.588,0,0,1,10.883,8c-.215-.115-.437-.215-.659-.316a2.153,2.153,0,0,0-.695-.248A2.091,2.091,0,0,0,7.541,8.562a9.915,9.915,0,0,0-.405.986c-.559,1.545-1.015,3.123-1.487,4.7a1.528,1.528,0,0,0,.634,1.777,1.755,1.755,0,0,0,1.5.211,1.35,1.35,0,0,0,.824-.858c.543-1.281,1.032-2.584,1.55-3.875.142-.355.28-.712.432-1.064a.548.548,0,0,1,.851-.24.622.622,0,0,1,.185.539,2.161,2.161,0,0,1-.181.621c-.337.852-.68,1.7-1.018,2.552a2.564,2.564,0,0,0-.173.528.624.624,0,0,0,.333.71,1.073,1.073,0,0,0,.814.034,1.22,1.22,0,0,0,.657-.655q.758-1.488,1.511-2.978.35-.687.709-1.37a1.073,1.073,0,0,1,.357-.434.43.43,0,0,1,.463-.016.373.373,0,0,1,.153.387.7.7,0,0,1-.057.236c-.065.157-.127.316-.2.469-.42.883-.846,1.763-1.262,2.648A2.463,2.463,0,0,0,13.4,14.607Zm5.888,6.508a1.09,1.09,0,0,0-2.179.006,1.09,1.09,0,0,0,2.179-.006ZM1.028,12.139a1.038,1.038,0,1,0,.01-2.075,1.038,1.038,0,0,0-.01,2.075ZM13.782.528a1.027,1.027,0,1,0-.011,2.055A1.027,1.027,0,0,0,13.782.528ZM22.21,6.95a.882.882,0,0,0-1.763.011A.882.882,0,0,0,22.21,6.95ZM4.153,4.439a.785.785,0,1,0,.787-.78A.766.766,0,0,0,4.153,4.439Zm8.221,18.22a.676.676,0,1,0-.677.666A.671.671,0,0,0,12.374,22.658ZM22.872,12.2a.674.674,0,0,0-.665.665.656.656,0,0,0,.655.643.634.634,0,0,0,.655-.644A.654.654,0,0,0,22.872,12.2ZM7.171-.123A.546.546,0,0,0,6.613.43a.553.553,0,1,0,1.106,0A.539.539,0,0,0,7.171-.123ZM24.119,9.234a.507.507,0,0,0-.493.488.494.494,0,0,0,.494.494.48.48,0,0,0,.487-.483A.491.491,0,0,0,24.119,9.234Zm-19.454,9.7a.5.5,0,0,0-.488-.488.491.491,0,0,0-.487.5.483.483,0,0,0,.491.479A.49.49,0,0,0,4.665,18.936Z" transform="translate(0 0.123)" fill="#f64060"/> |
||||
</svg> |
||||
</a> |
||||
|
||||
<a class="circle-link" title="Join the Conversation on Gitter" href="https://gitter.im/angular/angular" target="_blank" rel="noopener"> |
||||
<svg alt="Gitter Logo" xmlns="http://www.w3.org/2000/svg" width="19.447" height="19.447" viewBox="0 0 19.447 19.447"> |
||||
<g id="Group_40" data-name="Group 40" transform="translate(-1612 -405)"> |
||||
<rect id="Rectangle_19" data-name="Rectangle 19" width="19.447" height="19.447" transform="translate(1612 405)" fill="#e60257"/> |
||||
<g id="gitter" transform="translate(1617.795 408.636)"> |
||||
<g id="Group_33" data-name="Group 33" transform="translate(0 0)"> |
||||
<rect id="Rectangle_15" data-name="Rectangle 15" width="1.04" height="9.601" transform="translate(2.304 2.324)" fill="#fff"/> |
||||
<rect id="Rectangle_16" data-name="Rectangle 16" width="1.04" height="9.601" transform="translate(4.607 2.324)" fill="#fff"/> |
||||
<rect id="Rectangle_17" data-name="Rectangle 17" width="1.04" height="4.648" transform="translate(6.91 2.324)" fill="#fff"/> |
||||
<rect id="Rectangle_18" data-name="Rectangle 18" width="1.04" height="6.971" transform="translate(0 0)" fill="#fff"/> |
||||
</g> |
||||
</g> |
||||
</g> |
||||
</svg> |
||||
</a> |
||||
</div> |
||||
|
||||
<!-- Footer --> |
||||
<footer> |
||||
Love Angular? |
||||
<a href="https://github.com/angular/angular" target="_blank" rel="noopener"> Give our repo a star. |
||||
<div class="github-star-badge"> |
||||
<svg class="material-icons" xmlns="http://www.w3.org/2000/svg" width="24" height="24" viewBox="0 0 24 24"><path d="M0 0h24v24H0z" fill="none"/><path d="M12 17.27L18.18 21l-1.64-7.03L22 9.24l-7.19-.61L12 2 9.19 8.63 2 9.24l5.46 4.73L5.82 21z"/></svg> |
||||
Star |
||||
</div> |
||||
</a> |
||||
<a href="https://github.com/angular/angular" target="_blank" rel="noopener"> |
||||
<svg class="material-icons" xmlns="http://www.w3.org/2000/svg" width="24" height="24" viewBox="0 0 24 24"><path d="M10 6L8.59 7.41 13.17 12l-4.58 4.59L10 18l6-6z" fill="#1976d2"/><path d="M0 0h24v24H0z" fill="none"/></svg> |
||||
</a> |
||||
</footer> |
||||
|
||||
<svg id="clouds" alt="Gray Clouds Background" xmlns="http://www.w3.org/2000/svg" width="2611.084" height="485.677" viewBox="0 0 2611.084 485.677"> |
||||
<path id="Path_39" data-name="Path 39" d="M2379.709,863.793c10-93-77-171-168-149-52-114-225-105-264,15-75,3-140,59-152,133-30,2.83-66.725,9.829-93.5,26.25-26.771-16.421-63.5-23.42-93.5-26.25-12-74-77-130-152-133-39-120-212-129-264-15-54.084-13.075-106.753,9.173-138.488,48.9-31.734-39.726-84.4-61.974-138.487-48.9-52-114-225-105-264,15a162.027,162.027,0,0,0-103.147,43.044c-30.633-45.365-87.1-72.091-145.206-58.044-52-114-225-105-264,15-75,3-140,59-152,133-53,5-127,23-130,83-2,42,35,72,70,86,49,20,106,18,157,5a165.625,165.625,0,0,0,120,0c47,94,178,113,251,33,61.112,8.015,113.854-5.72,150.492-29.764a165.62,165.62,0,0,0,110.861-3.236c47,94,178,113,251,33,31.385,4.116,60.563,2.495,86.487-3.311,25.924,5.806,55.1,7.427,86.488,3.311,73,80,204,61,251-33a165.625,165.625,0,0,0,120,0c51,13,108,15,157-5a147.188,147.188,0,0,0,33.5-18.694,147.217,147.217,0,0,0,33.5,18.694c49,20,106,18,157,5a165.625,165.625,0,0,0,120,0c47,94,178,113,251,33C2446.709,1093.793,2554.709,922.793,2379.709,863.793Z" transform="translate(142.69 -634.312)" fill="#eee"/> |
||||
</svg> |
||||
|
||||
</div> |
||||
|
||||
<!-- * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * --> |
||||
<!-- * * * * * * * * * * * The content above * * * * * * * * * * * --> |
||||
<!-- * * * * * * * * * * is only a placeholder * * * * * * * * * * --> |
||||
<!-- * * * * * * * * * * and can be replaced. * * * * * * * * * * * --> |
||||
<!-- * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * --> |
||||
<!-- * * * * * * * * * * End of Placeholder * * * * * * * * * * * --> |
||||
<!-- * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * --> |
||||
|
||||
|
||||
|
||||
<router-outlet></router-outlet> |
@ -0,0 +1,35 @@ |
||||
import { TestBed, async } from '@angular/core/testing'; |
||||
import { RouterTestingModule } from '@angular/router/testing'; |
||||
import { AppComponent } from './app.component'; |
||||
|
||||
describe('AppComponent', () => { |
||||
beforeEach(async(() => { |
||||
TestBed.configureTestingModule({ |
||||
imports: [ |
||||
RouterTestingModule |
||||
], |
||||
declarations: [ |
||||
AppComponent |
||||
], |
||||
}).compileComponents(); |
||||
})); |
||||
|
||||
it('should create the app', () => { |
||||
const fixture = TestBed.createComponent(AppComponent); |
||||
const app = fixture.debugElement.componentInstance; |
||||
expect(app).toBeTruthy(); |
||||
}); |
||||
|
||||
it(`should have as title 'angular'`, () => { |
||||
const fixture = TestBed.createComponent(AppComponent); |
||||
const app = fixture.debugElement.componentInstance; |
||||
expect(app.title).toEqual('angular'); |
||||
}); |
||||
|
||||
it('should render title', () => { |
||||
const fixture = TestBed.createComponent(AppComponent); |
||||
fixture.detectChanges(); |
||||
const compiled = fixture.debugElement.nativeElement; |
||||
expect(compiled.querySelector('.content span').textContent).toContain('angular app is running!'); |
||||
}); |
||||
}); |
@ -0,0 +1,10 @@ |
||||
import { Component } from '@angular/core'; |
||||
|
||||
@Component({ |
||||
selector: 'app-root', |
||||
templateUrl: './app.component.html', |
||||
styleUrls: ['./app.component.css'] |
||||
}) |
||||
export class AppComponent { |
||||
title = 'angular'; |
||||
} |
@ -0,0 +1,18 @@ |
||||
import { BrowserModule } from '@angular/platform-browser'; |
||||
import { NgModule } from '@angular/core'; |
||||
|
||||
import { AppRoutingModule } from './app-routing.module'; |
||||
import { AppComponent } from './app.component'; |
||||
|
||||
@NgModule({ |
||||
declarations: [ |
||||
AppComponent |
||||
], |
||||
imports: [ |
||||
BrowserModule, |
||||
AppRoutingModule |
||||
], |
||||
providers: [], |
||||
bootstrap: [AppComponent] |
||||
}) |
||||
export class AppModule { } |
@ -0,0 +1,3 @@ |
||||
export const environment = { |
||||
production: true |
||||
}; |
@ -0,0 +1,16 @@ |
||||
// This file can be replaced during build by using the `fileReplacements` array.
|
||||
// `ng build --prod` replaces `environment.ts` with `environment.prod.ts`.
|
||||
// The list of file replacements can be found in `angular.json`.
|
||||
|
||||
export const environment = { |
||||
production: false |
||||
}; |
||||
|
||||
/* |
||||
* For easier debugging in development mode, you can import the following file |
||||
* to ignore zone related error stack frames such as `zone.run`, `zoneDelegate.invokeTask`. |
||||
* |
||||
* This import should be commented out in production mode because it will have a negative impact |
||||
* on performance if an error is thrown. |
||||
*/ |
||||
// import 'zone.js/dist/zone-error'; // Included with Angular CLI.
|
After Width: | Height: | Size: 948 B |
@ -0,0 +1,13 @@ |
||||
<!doctype html> |
||||
<html lang="en"> |
||||
<head> |
||||
<meta charset="utf-8"> |
||||
<title>Angular</title> |
||||
<base href="/"> |
||||
<meta name="viewport" content="width=device-width, initial-scale=1"> |
||||
<link rel="icon" type="image/x-icon" href="favicon.ico"> |
||||
</head> |
||||
<body> |
||||
<app-root></app-root> |
||||
</body> |
||||
</html> |
@ -0,0 +1,12 @@ |
||||
import { enableProdMode } from '@angular/core'; |
||||
import { platformBrowserDynamic } from '@angular/platform-browser-dynamic'; |
||||
|
||||
import { AppModule } from './app/app.module'; |
||||
import { environment } from './environments/environment'; |
||||
|
||||
if (environment.production) { |
||||
enableProdMode(); |
||||
} |
||||
|
||||
platformBrowserDynamic().bootstrapModule(AppModule) |
||||
.catch(err => console.error(err)); |
@ -0,0 +1,63 @@ |
||||
/** |
||||
* This file includes polyfills needed by Angular and is loaded before the app. |
||||
* You can add your own extra polyfills to this file. |
||||
* |
||||
* This file is divided into 2 sections: |
||||
* 1. Browser polyfills. These are applied before loading ZoneJS and are sorted by browsers. |
||||
* 2. Application imports. Files imported after ZoneJS that should be loaded before your main |
||||
* file. |
||||
* |
||||
* The current setup is for so-called "evergreen" browsers; the last versions of browsers that |
||||
* automatically update themselves. This includes Safari >= 10, Chrome >= 55 (including Opera), |
||||
* Edge >= 13 on the desktop, and iOS 10 and Chrome on mobile. |
||||
* |
||||
* Learn more in https://angular.io/guide/browser-support
|
||||
*/ |
||||
|
||||
/*************************************************************************************************** |
||||
* BROWSER POLYFILLS |
||||
*/ |
||||
|
||||
/** IE10 and IE11 requires the following for NgClass support on SVG elements */ |
||||
// import 'classlist.js'; // Run `npm install --save classlist.js`.
|
||||
|
||||
/** |
||||
* Web Animations `@angular/platform-browser/animations` |
||||
* Only required if AnimationBuilder is used within the application and using IE/Edge or Safari. |
||||
* Standard animation support in Angular DOES NOT require any polyfills (as of Angular 6.0). |
||||
*/ |
||||
// import 'web-animations-js'; // Run `npm install --save web-animations-js`.
|
||||
|
||||
/** |
||||
* By default, zone.js will patch all possible macroTask and DomEvents |
||||
* user can disable parts of macroTask/DomEvents patch by setting following flags |
||||
* because those flags need to be set before `zone.js` being loaded, and webpack |
||||
* will put import in the top of bundle, so user need to create a separate file |
||||
* in this directory (for example: zone-flags.ts), and put the following flags |
||||
* into that file, and then add the following code before importing zone.js. |
||||
* import './zone-flags.ts'; |
||||
* |
||||
* The flags allowed in zone-flags.ts are listed here. |
||||
* |
||||
* The following flags will work for all browsers. |
||||
* |
||||
* (window as any).__Zone_disable_requestAnimationFrame = true; // disable patch requestAnimationFrame
|
||||
* (window as any).__Zone_disable_on_property = true; // disable patch onProperty such as onclick
|
||||
* (window as any).__zone_symbol__UNPATCHED_EVENTS = ['scroll', 'mousemove']; // disable patch specified eventNames
|
||||
* |
||||
* in IE/Edge developer tools, the addEventListener will also be wrapped by zone.js |
||||
* with the following flag, it will bypass `zone.js` patch for IE/Edge |
||||
* |
||||
* (window as any).__Zone_enable_cross_context_check = true; |
||||
* |
||||
*/ |
||||
|
||||
/*************************************************************************************************** |
||||
* Zone JS is required by default for Angular itself. |
||||
*/ |
||||
import 'zone.js/dist/zone'; // Included with Angular CLI.
|
||||
|
||||
|
||||
/*************************************************************************************************** |
||||
* APPLICATION IMPORTS |
||||
*/ |
@ -0,0 +1 @@ |
||||
/* You can add global styles to this file, and also import other style files */ |
@ -0,0 +1,20 @@ |
||||
// This file is required by karma.conf.js and loads recursively all the .spec and framework files
|
||||
|
||||
import 'zone.js/dist/zone-testing'; |
||||
import { getTestBed } from '@angular/core/testing'; |
||||
import { |
||||
BrowserDynamicTestingModule, |
||||
platformBrowserDynamicTesting |
||||
} from '@angular/platform-browser-dynamic/testing'; |
||||
|
||||
declare const require: any; |
||||
|
||||
// First, initialize the Angular testing environment.
|
||||
getTestBed().initTestEnvironment( |
||||
BrowserDynamicTestingModule, |
||||
platformBrowserDynamicTesting() |
||||
); |
||||
// Then we find all the tests.
|
||||
const context = require.context('./', true, /\.spec\.ts$/); |
||||
// And load the modules.
|
||||
context.keys().map(context); |
@ -0,0 +1,18 @@ |
||||
{ |
||||
"extends": "./tsconfig.json", |
||||
"compilerOptions": { |
||||
"outDir": "./out-tsc/app", |
||||
"types": [] |
||||
}, |
||||
"files": [ |
||||
"src/main.ts", |
||||
"src/polyfills.ts" |
||||
], |
||||
"include": [ |
||||
"src/**/*.ts" |
||||
], |
||||
"exclude": [ |
||||
"src/test.ts", |
||||
"src/**/*.spec.ts" |
||||
] |
||||
} |
@ -0,0 +1,26 @@ |
||||
{ |
||||
"compileOnSave": false, |
||||
"compilerOptions": { |
||||
"baseUrl": "./", |
||||
"outDir": "./dist/out-tsc", |
||||
"sourceMap": true, |
||||
"declaration": false, |
||||
"downlevelIteration": true, |
||||
"experimentalDecorators": true, |
||||
"module": "esnext", |
||||
"moduleResolution": "node", |
||||
"importHelpers": true, |
||||
"target": "es2015", |
||||
"typeRoots": [ |
||||
"node_modules/@types" |
||||
], |
||||
"lib": [ |
||||
"es2018", |
||||
"dom" |
||||
] |
||||
}, |
||||
"angularCompilerOptions": { |
||||
"fullTemplateTypeCheck": true, |
||||
"strictInjectionParameters": true |
||||
} |
||||
} |
@ -0,0 +1,18 @@ |
||||
{ |
||||
"extends": "./tsconfig.json", |
||||
"compilerOptions": { |
||||
"outDir": "./out-tsc/spec", |
||||
"types": [ |
||||
"jasmine", |
||||
"node" |
||||
] |
||||
}, |
||||
"files": [ |
||||
"src/test.ts", |
||||
"src/polyfills.ts" |
||||
], |
||||
"include": [ |
||||
"src/**/*.spec.ts", |
||||
"src/**/*.d.ts" |
||||
] |
||||
} |
@ -0,0 +1,91 @@ |
||||
{ |
||||
"extends": "tslint:recommended", |
||||
"rules": { |
||||
"array-type": false, |
||||
"arrow-parens": false, |
||||
"deprecation": { |
||||
"severity": "warning" |
||||
}, |
||||
"component-class-suffix": true, |
||||
"contextual-lifecycle": true, |
||||
"directive-class-suffix": true, |
||||
"directive-selector": [ |
||||
true, |
||||
"attribute", |
||||
"app", |
||||
"camelCase" |
||||
], |
||||
"component-selector": [ |
||||
true, |
||||
"element", |
||||
"app", |
||||
"kebab-case" |
||||
], |
||||
"import-blacklist": [ |
||||
true, |
||||
"rxjs/Rx" |
||||
], |
||||
"interface-name": false, |
||||
"max-classes-per-file": false, |
||||
"max-line-length": [ |
||||
true, |
||||
140 |
||||
], |
||||
"member-access": false, |
||||
"member-ordering": [ |
||||
true, |
||||
{ |
||||
"order": [ |
||||
"static-field", |
||||
"instance-field", |
||||
"static-method", |
||||
"instance-method" |
||||
] |
||||
} |
||||
], |
||||
"no-consecutive-blank-lines": false, |
||||
"no-console": [ |
||||
true, |
||||
"debug", |
||||
"info", |
||||
"time", |
||||
"timeEnd", |
||||
"trace" |
||||
], |
||||
"no-empty": false, |
||||
"no-inferrable-types": [ |
||||
true, |
||||
"ignore-params" |
||||
], |
||||
"no-non-null-assertion": true, |
||||
"no-redundant-jsdoc": true, |
||||
"no-switch-case-fall-through": true, |
||||
"no-var-requires": false, |
||||
"object-literal-key-quotes": [ |
||||
true, |
||||
"as-needed" |
||||
], |
||||
"object-literal-sort-keys": false, |
||||
"ordered-imports": false, |
||||
"quotemark": [ |
||||
true, |
||||
"single" |
||||
], |
||||
"trailing-comma": false, |
||||
"no-conflicting-lifecycle": true, |
||||
"no-host-metadata-property": true, |
||||
"no-input-rename": true, |
||||
"no-inputs-metadata-property": true, |
||||
"no-output-native": true, |
||||
"no-output-on-prefix": true, |
||||
"no-output-rename": true, |
||||
"no-outputs-metadata-property": true, |
||||
"template-banana-in-box": true, |
||||
"template-no-negated-async": true, |
||||
"use-lifecycle-interface": true, |
||||
"use-pipe-transform-interface": true |
||||
}, |
||||
"rulesDirectory": [ |
||||
"codelyzer" |
||||
] |
||||
} |
@ -0,0 +1,9 @@ |
||||
version: "3.7" |
||||
services: |
||||
angular: |
||||
build: angular |
||||
ports: |
||||
- 80:4200 |
||||
volumes: |
||||
- ./angular:/project |
||||
- /project/node_modules |
@ -0,0 +1,18 @@ |
||||
<Project> |
||||
|
||||
<PropertyGroup> |
||||
<DefaultItemExcludes>$(DefaultItemExcludes);$(MSBuildProjectDirectory)/obj/**/*</DefaultItemExcludes> |
||||
<DefaultItemExcludes>$(DefaultItemExcludes);$(MSBuildProjectDirectory)/bin/**/*</DefaultItemExcludes> |
||||
</PropertyGroup> |
||||
|
||||
<PropertyGroup Condition="'$(DOTNET_RUNNING_IN_CONTAINER)' == 'true'"> |
||||
<BaseIntermediateOutputPath>$(MSBuildProjectDirectory)/obj/container/</BaseIntermediateOutputPath> |
||||
<BaseOutputPath>$(MSBuildProjectDirectory)/bin/container/</BaseOutputPath> |
||||
</PropertyGroup> |
||||
|
||||
<PropertyGroup Condition="'$(DOTNET_RUNNING_IN_CONTAINER)' != 'true'"> |
||||
<BaseIntermediateOutputPath>$(MSBuildProjectDirectory)/obj/local/</BaseIntermediateOutputPath> |
||||
<BaseOutputPath>$(MSBuildProjectDirectory)/bin/local/</BaseOutputPath> |
||||
</PropertyGroup> |
||||
|
||||
</Project> |
@ -0,0 +1,19 @@ |
||||
FROM mcr.microsoft.com/dotnet/core/sdk:2.1 AS build |
||||
WORKDIR /app |
||||
|
||||
# copy csproj and restore as distinct layers |
||||
COPY *.sln . |
||||
COPY aspnetapp/*.csproj ./aspnetapp/ |
||||
RUN dotnet restore |
||||
|
||||
# copy everything else and build app |
||||
COPY aspnetapp/. ./aspnetapp/ |
||||
WORKDIR /app/aspnetapp |
||||
RUN dotnet publish -c Release -o out |
||||
|
||||
|
||||
FROM mcr.microsoft.com/dotnet/core/aspnet:2.1 AS runtime |
||||
EXPOSE 80 |
||||
WORKDIR /app |
||||
COPY --from=build /app/aspnetapp/out ./ |
||||
ENTRYPOINT ["dotnet", "aspnetapp.dll"] |
@ -0,0 +1,18 @@ |
||||
FROM mcr.microsoft.com/dotnet/core/sdk:2.1 AS build |
||||
WORKDIR /app |
||||
|
||||
# copy csproj and restore as distinct layers |
||||
COPY *.sln . |
||||
COPY aspnetapp/*.csproj ./aspnetapp/ |
||||
RUN dotnet restore |
||||
|
||||
# copy everything else and build app |
||||
COPY aspnetapp/. ./aspnetapp/ |
||||
WORKDIR /app/aspnetapp |
||||
RUN dotnet publish -c Release -o out |
||||
|
||||
|
||||
FROM mcr.microsoft.com/dotnet/core/aspnet:2.1 AS runtime |
||||
WORKDIR /app |
||||
COPY --from=build /app/aspnetapp/out ./ |
||||
ENTRYPOINT ["dotnet", "aspnetapp.dll"] |
@ -0,0 +1,18 @@ |
||||
FROM mcr.microsoft.com/dotnet/core/sdk:2.1 AS build |
||||
WORKDIR /app |
||||
|
||||
# copy csproj and restore as distinct layers |
||||
COPY *.sln . |
||||
COPY aspnetapp/*.csproj ./aspnetapp/ |
||||
RUN dotnet restore |
||||
|
||||
# copy everything else and build app |
||||
COPY aspnetapp/. ./aspnetapp/ |
||||
WORKDIR /app/aspnetapp |
||||
RUN dotnet publish -c Release -o out |
||||
|
||||
|
||||
FROM mcr.microsoft.com/dotnet/core/aspnet:2.1 AS runtime |
||||
WORKDIR /app |
||||
COPY --from=build /app/aspnetapp/out ./ |
||||
ENTRYPOINT ["dotnet", "aspnetapp.dll"] |
@ -0,0 +1,19 @@ |
||||
# This Dockerfile uses nightly preview builds for .NET Core |
||||
FROM mcr.microsoft.com/dotnet/core/sdk:2.2 AS build |
||||
WORKDIR /app |
||||
|
||||
# copy csproj and restore as distinct layers |
||||
COPY *.sln . |
||||
COPY aspnetapp/*.csproj ./aspnetapp/ |
||||
RUN dotnet restore |
||||
|
||||
# copy everything else and build app |
||||
COPY aspnetapp/. ./aspnetapp/ |
||||
WORKDIR /app/aspnetapp |
||||
RUN dotnet publish -c Release -o out |
||||
|
||||
|
||||
FROM mcr.microsoft.com/dotnet/core/aspnet:2.2 AS runtime |
||||
WORKDIR /app |
||||
COPY --from=build /app/aspnetapp/out ./ |
||||
ENTRYPOINT ["dotnet", "aspnetapp.dll"] |
@ -0,0 +1,163 @@ |
||||
# ASP.NET Core Docker Sample |
||||
|
||||
This [sample Dockerfile](Dockerfile) demonstrates how to use ASP.NET Core and Docker together. The sample works with both Linux and Windows containers and can also be used without Docker. There are also instructions that demonstrate how to push the sample to [Azure Container Registry](../dotnetapp/push-image-to-acr.md) and test it with [Azure Container Instance](deploy-container-to-aci.md). You can [configure ASP.NET Core to use HTTPS with Docker](aspnetcore-docker-https.md). |
||||
|
||||
The sample builds the application in a container based on the larger [.NET Core SDK Docker image](https://hub.docker.com/r/microsoft/dotnet/). It builds the application and then copies the final build result into a Docker image based on the smaller [ASP.NET Core Docker Runtime image](https://hub.docker.com/r/microsoft/aspnetcore/). |
||||
|
||||
This sample requires [Docker 17.06](https://docs.docker.com/release-notes/docker-ce) or later of the [Docker client](https://www.docker.com/products/docker). |
||||
|
||||
## Try a pre-built ASP.NET Core Docker Image |
||||
|
||||
You can quickly run a container with a pre-built [sample ASP.NET Core Docker image](https://hub.docker.com/r/microsoft/dotnet-samples/), based on this [sample](Dockerfile). |
||||
|
||||
Type the following command to run a sample with [Docker](https://www.docker.com/products/docker): |
||||
|
||||
```console |
||||
docker run --name aspnetcore_sample --rm -it -p 8000:80 microsoft/dotnet-samples:aspnetapp |
||||
``` |
||||
|
||||
After the application starts, navigate to `http://localhost:8000` in your web browser. On Windows, you may need to navigate to the container via IP address. See [ASP.NET Core apps in Windows Containers](aspnetcore-docker-windows.md) for instructions on determining the IP address, using the value of `--name` that you used in `docker run`. |
||||
|
||||
See [Hosting ASP.NET Core Images with Docker over HTTPS](aspnetcore-docker-https.md) to use HTTPS with this image. |
||||
|
||||
## Getting the sample |
||||
|
||||
The easiest way to get the sample is by cloning the samples repository with git, using the following instructions: |
||||
|
||||
```console |
||||
git clone https://github.com/dotnet/dotnet-docker/ |
||||
``` |
||||
|
||||
You can also [download the repository as a zip](https://github.com/dotnet/dotnet-docker/archive/master.zip). |
||||
|
||||
## Build and run the sample with Docker |
||||
|
||||
You can build and run the sample in Docker using the following commands. The instructions assume that you are in the root of the repository. |
||||
|
||||
```console |
||||
cd samples |
||||
cd aspnetapp |
||||
docker build --pull -t aspnetapp . |
||||
docker run --name aspnetcore_sample --rm -it -p 8000:80 aspnetapp |
||||
``` |
||||
|
||||
You should see the following console output as the application starts. |
||||
|
||||
```console |
||||
C:\git\dotnet-docker\samples\aspnetapp>docker run --name aspnetcore_sample --rm -it -p 8000:80 aspnetapp |
||||
Hosting environment: Production |
||||
Content root path: /app |
||||
Now listening on: http://[::]:80 |
||||
Application started. Press Ctrl+C to shut down. |
||||
``` |
||||
|
||||
After the application starts, navigate to `http://localhost:8000` in your web browser. On Windows, you may need to navigate to the container via IP address. See [ASP.NET Core apps in Windows Containers](aspnetcore-docker-windows.md) for instructions on determining the IP address, using the value of `--name` that you used in `docker run`. |
||||
|
||||
> Note: The `-p` argument maps port 8000 on your local machine to port 80 in the container (the form of the port mapping is `host:container`). See the [Docker run reference](https://docs.docker.com/engine/reference/commandline/run/) for more information on commandline parameters. In some cases, you might see an error because the host port you select is already in use. Choose a different port in that case. |
||||
|
||||
## Additional Samples |
||||
|
||||
Multiple variations of this sample have been provided, as follows. Some of these example Dockerfiles are demonstrated later. Specify an alternate Dockerfile via the `-f` argument. |
||||
|
||||
* [Multi-arch sample](Dockerfile) |
||||
* [Multi-arch sample, using a preview version of .NET Core](Dockerfile.preview) |
||||
* [Nanoserver 2016 SAC sample](Dockerfile.nanoserver-sac2016) |
||||
* [Alpine sample](Dockerfile.alpine-x64) |
||||
|
||||
## Deploying with HTTPS |
||||
|
||||
ASP.NET Core 2.1 uses [HTTPS by default](https://docs.microsoft.com/en-us/aspnet/core/security/enforcing-ssl). You can [configure ASP.NET Core to use HTTPS with Docker](aspnetcore-docker-https.md). |
||||
|
||||
## Build and run the sample for Alpine X64 with Docker |
||||
|
||||
You can build and run the sample for Alpine using the following instructions. Make sure Docker is set to Linux containers if you are on Windows. |
||||
|
||||
```console |
||||
cd samples |
||||
cd aspnetapp |
||||
docker build --pull -t aspnetapp -f Dockerfile.alpine-x64 . |
||||
docker run --name aspnetcore_sample --rm -it -p 8000:80 aspnetapp |
||||
``` |
||||
|
||||
After the application starts, navigate to `http://localhost:8000` in your web browser. |
||||
|
||||
## Build and run the sample for Ubuntu 18.04 with Docker |
||||
|
||||
You can also build for [Ubuntu 18.04](https://hub.docker.com/_/ubuntu/), with a `bionic` tag. The `bionic` tags are documented at [microsoft/dotnet](https://hub.docker.com/r/microsoft/dotnet/). You would switch to the following tags: |
||||
|
||||
* SDK: 2.1-sdk-bionic |
||||
* Runtime:-2.1-aspnetcore-runtime-bionic |
||||
|
||||
## Build and run the sample for Linux ARM32 with Docker |
||||
|
||||
You can build and run the sample for ARM32 and Raspberry Pi with [Build ASP.NET Core Applications for Raspberry Pi with Docker](aspnetcore-docker-arm32.md) instructions. |
||||
|
||||
## Develop ASP.NET Core Applications in a container |
||||
|
||||
You can develop applications without a .NET Core installation on your machine with the [Develop ASP.NET Core applications in a container](aspnet-docker-dev-in-container.md) instructions. These instructions are also useful if your development and production environments do not match. |
||||
|
||||
## Deploying to Production vs Development |
||||
|
||||
The approach for running containers differs between development and production. |
||||
|
||||
In production, you will typically start your container with `docker run -d`. This argument starts the container as a service, without any console interaction. You then interact with it through other Docker commands or APIs exposed by the containerized application. |
||||
|
||||
In development, you will typically start containers with `docker run --rm -it`. These arguments enable you to see a console (important when there are errors), terminate the container with `CTRL-C` and cleans up all container resources when the container is termiantes. You also typically don't mind blocking the console. This approach is demonstrated in prior examples in this document. |
||||
|
||||
We recommend that you do not use `--rm` in production. It cleans up container resources, preventing you from collecting logs that may have been captured in a container that has either stopped or crashed. |
||||
|
||||
## Build and run the sample locally |
||||
|
||||
You can build and run the sample locally with the [.NET Core 2.1 SDK](https://www.microsoft.com/net/download/core) using the following commands. The commands assume that you are in the root of the repository. |
||||
|
||||
```console |
||||
cd samples |
||||
cd aspnetapp |
||||
dotnet run |
||||
``` |
||||
|
||||
After the application starts, visit `http://localhost:5000` in your web browser. |
||||
|
||||
You can produce an application that is ready to deploy to production locally using the following command. |
||||
|
||||
```console |
||||
dotnet publish -c Release -o out |
||||
``` |
||||
|
||||
You can run the application using the following commands. |
||||
|
||||
```console |
||||
cd out |
||||
dotnet aspnetapp.dll |
||||
``` |
||||
|
||||
Note: The `-c Release` argument builds the application in release mode (the default is debug mode). See the [dotnet publish reference](https://docs.microsoft.com/dotnet/core/tools/dotnet-publish) for more information on commandline parameters. |
||||
|
||||
## .NET Core Resources |
||||
|
||||
More Samples |
||||
|
||||
* [.NET Core Docker Samples](../README.md) |
||||
* [.NET Framework Docker Samples](https://github.com/microsoft/dotnet-framework-docker/blob/master/samples/README.md) |
||||
|
||||
Docs and More Information: |
||||
|
||||
* [.NET Docs](https://docs.microsoft.com/dotnet/) |
||||
* [ASP.NET Docs](https://docs.microsoft.com/aspnet/) |
||||
* [dotnet/core](https://github.com/dotnet/core) for starting with .NET Core on GitHub. |
||||
* [dotnet/announcements](https://github.com/dotnet/announcements/issues) for .NET announcements. |
||||
|
||||
## Related Repositories |
||||
|
||||
.NET Core Docker Hub repos: |
||||
|
||||
* [microsoft/aspnetcore](https://hub.docker.com/r/microsoft/aspnetcore/) for ASP.NET Core images. |
||||
* [microsoft/dotnet](https://hub.docker.com/r/microsoft/dotnet/) for .NET Core images. |
||||
* [microsoft/dotnet-nightly](https://hub.docker.com/r/microsoft/dotnet-nightly/) for .NET Core preview images. |
||||
* [microsoft/dotnet-samples](https://hub.docker.com/r/microsoft/dotnet-samples/) for .NET Core sample images. |
||||
|
||||
.NET Framework Docker Hub repos: |
||||
|
||||
* [microsoft/aspnet](https://hub.docker.com/r/microsoft/aspnet/) for ASP.NET Web Forms and MVC images. |
||||
* [microsoft/dotnet-framework](https://hub.docker.com/r/microsoft/dotnet-framework/) for .NET Framework images. |
||||
* [microsoft/dotnet-framework-samples](https://hub.docker.com/r/microsoft/dotnet-framework-samples/) for .NET Framework and ASP.NET sample images. |
@ -0,0 +1,68 @@ |
||||
# Develop ASP.NET Core Applications in a Container |
||||
|
||||
You can use containers to establish a .NET Core development environment with only Docker and optionally a code editor installed on your machine. The environment can be made to match your local machine, production or both. If you support multiple operating systems, then this approach might become a key part of your development process. |
||||
|
||||
A common use case of Docker is to [containerize an application](README.md). You can define the environment necessary to run the application and even build the application itself within a Dockerfile. This document describes a much more iterative and dynamic use of Docker, defining the container environment primarily via the commandline. .NET Core includes a command called `dotnet watch` that can rerun your application or your tests on each code change. This document describes how to use the Docker CLI and `dotnet watch` to develop applications in a container. |
||||
|
||||
See [Develop .NET Core Applications in a Container](../dotnetapp/dotnet-docker-dev-in-container.md) for .NET Core-specific instructions. |
||||
|
||||
## Getting the sample |
||||
|
||||
The easiest way to get the sample is by cloning the samples repository with [git](https://git-scm.com/downloads), using the following instructions: |
||||
|
||||
```console |
||||
git clone https://github.com/dotnet/dotnet-docker/ |
||||
``` |
||||
|
||||
You can also [download the repository as a zip](https://github.com/dotnet/dotnet-docker/archive/master.zip). |
||||
|
||||
## Requirements |
||||
|
||||
It is recommended that you add a [Directory.Build.props](Directory.Build.props) file to your project to use different `obj` and `bin` folders for local and container use, to avoid conflicts between them. You should delete your existing obj and bin folders before making this change. You can also use `dotnet clean` for this purpose. |
||||
|
||||
This approach relies on [volume mounting](https://docs.docker.com/engine/admin/volumes/volumes/) (that's the `-v` argument in the following commands) to mount source into the container (without using a Dockerfile). You may need to [Enable shared drives (Windows)](https://docs.docker.com/docker-for-windows/#shared-drives) or [file sharing (macOS)](https://docs.docker.com/docker-for-mac/#file-sharing) first. |
||||
|
||||
## Run your application in a container while you Develop |
||||
|
||||
You can re-run your application in a container with every local code change. This scenario works for both console applications and websites. The syntax differs a bit for Windows and Linux containers. |
||||
|
||||
The instructions assume that you are in the root of the repository. You can use the following commands, given your environment: |
||||
|
||||
### Windows using Linux containers |
||||
|
||||
```console |
||||
docker run --rm -it -p 8000:80 -v c:\git\dotnet-docker\samples\aspnetapp:/app/ -w /app/aspnetapp microsoft/dotnet:2.1-sdk dotnet watch run |
||||
``` |
||||
|
||||
You can use CTRL-C to terminate `dotnet watch`. Navigate to the site at `http://localhost:8000` in your browser. |
||||
|
||||
### macOS or Linux using Linux containers |
||||
|
||||
```console |
||||
docker run --rm -it -p 8000:80 -v ~/git/dotnet-docker/samples/aspnetapp:/app/ -w /app/aspnetapp microsoft/dotnet:2.1-sdk dotnet watch run |
||||
``` |
||||
|
||||
You can use CTRL-C to terminate `dotnet watch`. Navigate to the site at `http://localhost:8000` in your browser. |
||||
|
||||
### Windows using Windows containers |
||||
|
||||
```console |
||||
docker run --rm -it -p 8000:80 -v c:\git\dotnet-docker\samples\aspnetapp:c:\app\ -w \app\aspnetapp --name aspnetappsample microsoft/dotnet:2.1-sdk dotnet watch run |
||||
``` |
||||
|
||||
You can use CTRL-C to terminate `dotnet watch`. |
||||
|
||||
After the application starts, navigate to `http://localhost:8000` in your web browser. On Windows, you may need to navigate to the container via IP address. See [ASP.NET Core apps in Windows Containers](aspnetcore-docker-windows.md) for instructions on determining the IP address, using the value of `--name` that you used in `docker run`. |
||||
|
||||
## Updating the site while the container is running |
||||
|
||||
You can demo a relaunch of the site by changing the About controller method in `HomeController.cs`, waiting a few seconds for the site to recompile and then visit `http://localhost:8000/Home/About` |
||||
|
||||
## Test your application in a container while you develop |
||||
|
||||
You can retest your application in a container with every local code change. You can see this demonstrated in [Develop .NET Core Applications in a Container](../dotnetapp/dotnet-docker-dev-in-container.md). |
||||
|
||||
## More Samples |
||||
|
||||
* [.NET Core Docker Samples](../README.md) |
||||
* [.NET Framework Docker Samples](https://github.com/microsoft/dotnet-framework-docker-samples/) |
@ -0,0 +1,11 @@ |
||||
using System; |
||||
|
||||
namespace aspnetapp.Models |
||||
{ |
||||
public class ErrorViewModel |
||||
{ |
||||
public string RequestId { get; set; } |
||||
|
||||
public bool ShowRequestId => !string.IsNullOrEmpty(RequestId); |
||||
} |
||||
} |
@ -0,0 +1,18 @@ |
||||
<environment include="Development"> |
||||
<script src="~/lib/jquery-validation/dist/jquery.validate.js"></script> |
||||
<script src="~/lib/jquery-validation-unobtrusive/jquery.validate.unobtrusive.js"></script> |
||||
</environment> |
||||
<environment exclude="Development"> |
||||
<script src="https://ajax.aspnetcdn.com/ajax/jquery.validate/1.17.0/jquery.validate.min.js" |
||||
asp-fallback-src="~/lib/jquery-validation/dist/jquery.validate.min.js" |
||||
asp-fallback-test="window.jQuery && window.jQuery.validator" |
||||
crossorigin="anonymous" |
||||
integrity="sha384-rZfj/ogBloos6wzLGpPkkOr/gpkBNLZ6b6yLy4o+ok+t/SAKlL5mvXLr0OXNi1Hp"> |
||||
</script> |
||||
<script src="https://ajax.aspnetcdn.com/ajax/jquery.validation.unobtrusive/3.2.9/jquery.validate.unobtrusive.min.js" |
||||
asp-fallback-src="~/lib/jquery-validation-unobtrusive/jquery.validate.unobtrusive.min.js" |
||||
asp-fallback-test="window.jQuery && window.jQuery.validator && window.jQuery.validator.unobtrusive" |
||||
crossorigin="anonymous" |
||||
integrity="sha384-ifv0TYDWxBHzvAk2Z0n8R434FL1Rlv/Av18DXE43N/1rvHyOG4izKst0f2iSLdds"> |
||||
</script> |
||||
</environment> |
@ -0,0 +1,9 @@ |
||||
{ |
||||
"Logging": { |
||||
"LogLevel": { |
||||
"Default": "Debug", |
||||
"System": "Information", |
||||
"Microsoft": "Information" |
||||
} |
||||
} |
||||
} |
@ -0,0 +1,8 @@ |
||||
{ |
||||
"Logging": { |
||||
"LogLevel": { |
||||
"Default": "Warning" |
||||
} |
||||
}, |
||||
"AllowedHosts": "*" |
||||
} |
@ -0,0 +1,12 @@ |
||||
<Project Sdk="Microsoft.NET.Sdk.Web"> |
||||
|
||||
<PropertyGroup> |
||||
<TargetFramework>netcoreapp2.1</TargetFramework> |
||||
<UserSecretsId>31051026529000467138</UserSecretsId> |
||||
</PropertyGroup> |
||||
|
||||
<ItemGroup> |
||||
<PackageReference Include="Microsoft.AspNetCore.App" /> |
||||
</ItemGroup> |
||||
|
||||
</Project> |
@ -0,0 +1 @@ |
||||
body{padding-top:50px;padding-bottom:20px}.body-content{padding-left:15px;padding-right:15px}.carousel-caption p{font-size:20px;line-height:1.4}.carousel-inner .item img[src$=".svg"]{width:100%}#qrCode{margin:15px}@media screen and (max-width:767px){.carousel-caption{display:none}} |
After Width: | Height: | Size: 31 KiB |
After Width: | Height: | Size: 9.5 KiB |
After Width: | Height: | Size: 8.2 KiB |
After Width: | Height: | Size: 12 KiB |
@ -0,0 +1,45 @@ |
||||
{ |
||||
"name": "bootstrap", |
||||
"description": "The most popular front-end framework for developing responsive, mobile first projects on the web.", |
||||
"keywords": [ |
||||
"css", |
||||
"js", |
||||
"less", |
||||
"mobile-first", |
||||
"responsive", |
||||
"front-end", |
||||
"framework", |
||||
"web" |
||||
], |
||||
"homepage": "http://getbootstrap.com", |
||||
"license": "MIT", |
||||
"moduleType": "globals", |
||||
"main": [ |
||||
"less/bootstrap.less", |
||||
"dist/js/bootstrap.js" |
||||
], |
||||
"ignore": [ |
||||
"/.*", |
||||
"_config.yml", |
||||
"CNAME", |
||||
"composer.json", |
||||
"CONTRIBUTING.md", |
||||
"docs", |
||||
"js/tests", |
||||
"test-infra" |
||||
], |
||||
"dependencies": { |
||||
"jquery": "1.9.1 - 3" |
||||
}, |
||||
"version": "3.3.7", |
||||
"_release": "3.3.7", |
||||
"_resolution": { |
||||
"type": "version", |
||||
"tag": "v3.3.7", |
||||
"commit": "0b9c4a4007c44201dce9a6cc1a38407005c26c86" |
||||
}, |
||||
"_source": "https://github.com/twbs/bootstrap.git", |
||||
"_target": "v3.3.7", |
||||
"_originalSource": "bootstrap", |
||||
"_direct": true |
||||
} |
@ -0,0 +1,21 @@ |
||||
The MIT License (MIT) |
||||
|
||||
Copyright (c) 2011-2016 Twitter, Inc. |
||||
|
||||
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. |
@ -0,0 +1,587 @@ |
||||
/*! |
||||
* Bootstrap v3.3.7 (http://getbootstrap.com) |
||||
* Copyright 2011-2016 Twitter, Inc. |
||||
* Licensed under MIT (https://github.com/twbs/bootstrap/blob/master/LICENSE) |
||||
*/ |
||||
.btn-default, |
||||
.btn-primary, |
||||
.btn-success, |
||||
.btn-info, |
||||
.btn-warning, |
||||
.btn-danger { |
||||
text-shadow: 0 -1px 0 rgba(0, 0, 0, .2); |
||||
-webkit-box-shadow: inset 0 1px 0 rgba(255, 255, 255, .15), 0 1px 1px rgba(0, 0, 0, .075); |
||||
box-shadow: inset 0 1px 0 rgba(255, 255, 255, .15), 0 1px 1px rgba(0, 0, 0, .075); |
||||
} |
||||
.btn-default:active, |
||||
.btn-primary:active, |
||||
.btn-success:active, |
||||
.btn-info:active, |
||||
.btn-warning:active, |
||||
.btn-danger:active, |
||||
.btn-default.active, |
||||
.btn-primary.active, |
||||
.btn-success.active, |
||||
.btn-info.active, |
||||
.btn-warning.active, |
||||
.btn-danger.active { |
||||
-webkit-box-shadow: inset 0 3px 5px rgba(0, 0, 0, .125); |
||||
box-shadow: inset 0 3px 5px rgba(0, 0, 0, .125); |
||||
} |
||||
.btn-default.disabled, |
||||
.btn-primary.disabled, |
||||
.btn-success.disabled, |
||||
.btn-info.disabled, |
||||
.btn-warning.disabled, |
||||
.btn-danger.disabled, |
||||
.btn-default[disabled], |
||||
.btn-primary[disabled], |
||||
.btn-success[disabled], |
||||
.btn-info[disabled], |
||||
.btn-warning[disabled], |
||||
.btn-danger[disabled], |
||||
fieldset[disabled] .btn-default, |
||||
fieldset[disabled] .btn-primary, |
||||
fieldset[disabled] .btn-success, |
||||
fieldset[disabled] .btn-info, |
||||
fieldset[disabled] .btn-warning, |
||||
fieldset[disabled] .btn-danger { |
||||
-webkit-box-shadow: none; |
||||
box-shadow: none; |
||||
} |
||||
.btn-default .badge, |
||||
.btn-primary .badge, |
||||
.btn-success .badge, |
||||
.btn-info .badge, |
||||
.btn-warning .badge, |
||||
.btn-danger .badge { |
||||
text-shadow: none; |
||||
} |
||||
.btn:active, |
||||
.btn.active { |
||||
background-image: none; |
||||
} |
||||
.btn-default { |
||||
text-shadow: 0 1px 0 #fff; |
||||
background-image: -webkit-linear-gradient(top, #fff 0%, #e0e0e0 100%); |
||||
background-image: -o-linear-gradient(top, #fff 0%, #e0e0e0 100%); |
||||
background-image: -webkit-gradient(linear, left top, left bottom, from(#fff), to(#e0e0e0)); |
||||
background-image: linear-gradient(to bottom, #fff 0%, #e0e0e0 100%); |
||||
filter: progid:DXImageTransform.Microsoft.gradient(startColorstr='#ffffffff', endColorstr='#ffe0e0e0', GradientType=0); |
||||
filter: progid:DXImageTransform.Microsoft.gradient(enabled = false); |
||||
background-repeat: repeat-x; |
||||
border-color: #dbdbdb; |
||||
border-color: #ccc; |
||||
} |
||||
.btn-default:hover, |
||||
.btn-default:focus { |
||||
background-color: #e0e0e0; |
||||
background-position: 0 -15px; |
||||
} |
||||
.btn-default:active, |
||||
.btn-default.active { |
||||
background-color: #e0e0e0; |
||||
border-color: #dbdbdb; |
||||
} |
||||
.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: #e0e0e0; |
||||
background-image: none; |
||||
} |
||||
.btn-primary { |
||||
background-image: -webkit-linear-gradient(top, #337ab7 0%, #265a88 100%); |
||||
background-image: -o-linear-gradient(top, #337ab7 0%, #265a88 100%); |
||||
background-image: -webkit-gradient(linear, left top, left bottom, from(#337ab7), to(#265a88)); |
||||
background-image: linear-gradient(to bottom, #337ab7 0%, #265a88 100%); |
||||
filter: progid:DXImageTransform.Microsoft.gradient(startColorstr='#ff337ab7', endColorstr='#ff265a88', GradientType=0); |
||||
filter: progid:DXImageTransform.Microsoft.gradient(enabled = false); |
||||
background-repeat: repeat-x; |
||||
border-color: #245580; |
||||
} |
||||
.btn-primary:hover, |
||||
.btn-primary:focus { |
||||
background-color: #265a88; |
||||
background-position: 0 -15px; |
||||
} |
||||
.btn-primary:active, |
||||
.btn-primary.active { |
||||
background-color: #265a88; |
||||
border-color: #245580; |
||||
} |
||||
.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: #265a88; |
||||
background-image: none; |
||||
} |
||||
.btn-success { |
||||
background-image: -webkit-linear-gradient(top, #5cb85c 0%, #419641 100%); |
||||
background-image: -o-linear-gradient(top, #5cb85c 0%, #419641 100%); |
||||
background-image: -webkit-gradient(linear, left top, left bottom, from(#5cb85c), to(#419641)); |
||||
background-image: linear-gradient(to bottom, #5cb85c 0%, #419641 100%); |
||||
filter: progid:DXImageTransform.Microsoft.gradient(startColorstr='#ff5cb85c', endColorstr='#ff419641', GradientType=0); |
||||
filter: progid:DXImageTransform.Microsoft.gradient(enabled = false); |
||||
background-repeat: repeat-x; |
||||
border-color: #3e8f3e; |
||||
} |
||||
.btn-success:hover, |
||||
.btn-success:focus { |
||||
background-color: #419641; |
||||
background-position: 0 -15px; |
||||
} |
||||
.btn-success:active, |
||||
.btn-success.active { |
||||
background-color: #419641; |
||||
border-color: #3e8f3e; |
||||
} |
||||
.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: #419641; |
||||
background-image: none; |
||||
} |
||||
.btn-info { |
||||
background-image: -webkit-linear-gradient(top, #5bc0de 0%, #2aabd2 100%); |
||||
background-image: -o-linear-gradient(top, #5bc0de 0%, #2aabd2 100%); |
||||
background-image: -webkit-gradient(linear, left top, left bottom, from(#5bc0de), to(#2aabd2)); |
||||
background-image: linear-gradient(to bottom, #5bc0de 0%, #2aabd2 100%); |
||||
filter: progid:DXImageTransform.Microsoft.gradient(startColorstr='#ff5bc0de', endColorstr='#ff2aabd2', GradientType=0); |
||||
filter: progid:DXImageTransform.Microsoft.gradient(enabled = false); |
||||
background-repeat: repeat-x; |
||||
border-color: #28a4c9; |
||||
} |
||||
.btn-info:hover, |
||||
.btn-info:focus { |
||||
background-color: #2aabd2; |
||||
background-position: 0 -15px; |
||||
} |
||||
.btn-info:active, |
||||
.btn-info.active { |
||||
background-color: #2aabd2; |
||||
border-color: #28a4c9; |
||||
} |
||||
.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: #2aabd2; |
||||
background-image: none; |
||||
} |
||||
.btn-warning { |
||||
background-image: -webkit-linear-gradient(top, #f0ad4e 0%, #eb9316 100%); |
||||
background-image: -o-linear-gradient(top, #f0ad4e 0%, #eb9316 100%); |
||||
background-image: -webkit-gradient(linear, left top, left bottom, from(#f0ad4e), to(#eb9316)); |
||||
background-image: linear-gradient(to bottom, #f0ad4e 0%, #eb9316 100%); |
||||
filter: progid:DXImageTransform.Microsoft.gradient(startColorstr='#fff0ad4e', endColorstr='#ffeb9316', GradientType=0); |
||||
filter: progid:DXImageTransform.Microsoft.gradient(enabled = false); |
||||
background-repeat: repeat-x; |
||||
border-color: #e38d13; |
||||
} |
||||
.btn-warning:hover, |
||||
.btn-warning:focus { |
||||
background-color: #eb9316; |
||||
background-position: 0 -15px; |
||||
} |
||||
.btn-warning:active, |
||||
.btn-warning.active { |
||||
background-color: #eb9316; |
||||
border-color: #e38d13; |
||||
} |
||||
.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: #eb9316; |
||||
background-image: none; |
||||
} |
||||
.btn-danger { |
||||
background-image: -webkit-linear-gradient(top, #d9534f 0%, #c12e2a 100%); |
||||
background-image: -o-linear-gradient(top, #d9534f 0%, #c12e2a 100%); |
||||
background-image: -webkit-gradient(linear, left top, left bottom, from(#d9534f), to(#c12e2a)); |
||||
background-image: linear-gradient(to bottom, #d9534f 0%, #c12e2a 100%); |
||||
filter: progid:DXImageTransform.Microsoft.gradient(startColorstr='#ffd9534f', endColorstr='#ffc12e2a', GradientType=0); |
||||
filter: progid:DXImageTransform.Microsoft.gradient(enabled = false); |
||||
background-repeat: repeat-x; |
||||
border-color: #b92c28; |
||||
} |
||||
.btn-danger:hover, |
||||
.btn-danger:focus { |
||||
background-color: #c12e2a; |
||||
background-position: 0 -15px; |
||||
} |
||||
.btn-danger:active, |
||||
.btn-danger.active { |
||||
background-color: #c12e2a; |
||||
border-color: #b92c28; |
||||
} |
||||
.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: #c12e2a; |
||||
background-image: none; |
||||
} |
||||
.thumbnail, |
||||
.img-thumbnail { |
||||
-webkit-box-shadow: 0 1px 2px rgba(0, 0, 0, .075); |
||||
box-shadow: 0 1px 2px rgba(0, 0, 0, .075); |
||||
} |
||||
.dropdown-menu > li > a:hover, |
||||
.dropdown-menu > li > a:focus { |
||||
background-color: #e8e8e8; |
||||
background-image: -webkit-linear-gradient(top, #f5f5f5 0%, #e8e8e8 100%); |
||||
background-image: -o-linear-gradient(top, #f5f5f5 0%, #e8e8e8 100%); |
||||
background-image: -webkit-gradient(linear, left top, left bottom, from(#f5f5f5), to(#e8e8e8)); |
||||
background-image: linear-gradient(to bottom, #f5f5f5 0%, #e8e8e8 100%); |
||||
filter: progid:DXImageTransform.Microsoft.gradient(startColorstr='#fff5f5f5', endColorstr='#ffe8e8e8', GradientType=0); |
||||
background-repeat: repeat-x; |
||||
} |
||||
.dropdown-menu > .active > a, |
||||
.dropdown-menu > .active > a:hover, |
||||
.dropdown-menu > .active > a:focus { |
||||
background-color: #2e6da4; |
||||
background-image: -webkit-linear-gradient(top, #337ab7 0%, #2e6da4 100%); |
||||
background-image: -o-linear-gradient(top, #337ab7 0%, #2e6da4 100%); |
||||
background-image: -webkit-gradient(linear, left top, left bottom, from(#337ab7), to(#2e6da4)); |
||||
background-image: linear-gradient(to bottom, #337ab7 0%, #2e6da4 100%); |
||||
filter: progid:DXImageTransform.Microsoft.gradient(startColorstr='#ff337ab7', endColorstr='#ff2e6da4', GradientType=0); |
||||
background-repeat: repeat-x; |
||||
} |
||||
.navbar-default { |
||||
background-image: -webkit-linear-gradient(top, #fff 0%, #f8f8f8 100%); |
||||
background-image: -o-linear-gradient(top, #fff 0%, #f8f8f8 100%); |
||||
background-image: -webkit-gradient(linear, left top, left bottom, from(#fff), to(#f8f8f8)); |
||||
background-image: linear-gradient(to bottom, #fff 0%, #f8f8f8 100%); |
||||
filter: progid:DXImageTransform.Microsoft.gradient(startColorstr='#ffffffff', endColorstr='#fff8f8f8', GradientType=0); |
||||
filter: progid:DXImageTransform.Microsoft.gradient(enabled = false); |
||||
background-repeat: repeat-x; |
||||
border-radius: 4px; |
||||
-webkit-box-shadow: inset 0 1px 0 rgba(255, 255, 255, .15), 0 1px 5px rgba(0, 0, 0, .075); |
||||
box-shadow: inset 0 1px 0 rgba(255, 255, 255, .15), 0 1px 5px rgba(0, 0, 0, .075); |
||||
} |
||||
.navbar-default .navbar-nav > .open > a, |
||||
.navbar-default .navbar-nav > .active > a { |
||||
background-image: -webkit-linear-gradient(top, #dbdbdb 0%, #e2e2e2 100%); |
||||
background-image: -o-linear-gradient(top, #dbdbdb 0%, #e2e2e2 100%); |
||||
background-image: -webkit-gradient(linear, left top, left bottom, from(#dbdbdb), to(#e2e2e2)); |
||||
background-image: linear-gradient(to bottom, #dbdbdb 0%, #e2e2e2 100%); |
||||
filter: progid:DXImageTransform.Microsoft.gradient(startColorstr='#ffdbdbdb', endColorstr='#ffe2e2e2', GradientType=0); |
||||
background-repeat: repeat-x; |
||||
-webkit-box-shadow: inset 0 3px 9px rgba(0, 0, 0, .075); |
||||
box-shadow: inset 0 3px 9px rgba(0, 0, 0, .075); |
||||
} |
||||
.navbar-brand, |
||||
.navbar-nav > li > a { |
||||
text-shadow: 0 1px 0 rgba(255, 255, 255, .25); |
||||
} |
||||
.navbar-inverse { |
||||
background-image: -webkit-linear-gradient(top, #3c3c3c 0%, #222 100%); |
||||
background-image: -o-linear-gradient(top, #3c3c3c 0%, #222 100%); |
||||
background-image: -webkit-gradient(linear, left top, left bottom, from(#3c3c3c), to(#222)); |
||||
background-image: linear-gradient(to bottom, #3c3c3c 0%, #222 100%); |
||||
filter: progid:DXImageTransform.Microsoft.gradient(startColorstr='#ff3c3c3c', endColorstr='#ff222222', GradientType=0); |
||||
filter: progid:DXImageTransform.Microsoft.gradient(enabled = false); |
||||
background-repeat: repeat-x; |
||||
border-radius: 4px; |
||||
} |
||||
.navbar-inverse .navbar-nav > .open > a, |
||||
.navbar-inverse .navbar-nav > .active > a { |
||||
background-image: -webkit-linear-gradient(top, #080808 0%, #0f0f0f 100%); |
||||
background-image: -o-linear-gradient(top, #080808 0%, #0f0f0f 100%); |
||||
background-image: -webkit-gradient(linear, left top, left bottom, from(#080808), to(#0f0f0f)); |
||||
background-image: linear-gradient(to bottom, #080808 0%, #0f0f0f 100%); |
||||
filter: progid:DXImageTransform.Microsoft.gradient(startColorstr='#ff080808', endColorstr='#ff0f0f0f', GradientType=0); |
||||
background-repeat: repeat-x; |
||||
-webkit-box-shadow: inset 0 3px 9px rgba(0, 0, 0, .25); |
||||
box-shadow: inset 0 3px 9px rgba(0, 0, 0, .25); |
||||
} |
||||
.navbar-inverse .navbar-brand, |
||||
.navbar-inverse .navbar-nav > li > a { |
||||
text-shadow: 0 -1px 0 rgba(0, 0, 0, .25); |
||||
} |
||||
.navbar-static-top, |
||||
.navbar-fixed-top, |
||||
.navbar-fixed-bottom { |
||||
border-radius: 0; |
||||
} |
||||
@media (max-width: 767px) { |
||||
.navbar .navbar-nav .open .dropdown-menu > .active > a, |
||||
.navbar .navbar-nav .open .dropdown-menu > .active > a:hover, |
||||
.navbar .navbar-nav .open .dropdown-menu > .active > a:focus { |
||||
color: #fff; |
||||
background-image: -webkit-linear-gradient(top, #337ab7 0%, #2e6da4 100%); |
||||
background-image: -o-linear-gradient(top, #337ab7 0%, #2e6da4 100%); |
||||
background-image: -webkit-gradient(linear, left top, left bottom, from(#337ab7), to(#2e6da4)); |
||||
background-image: linear-gradient(to bottom, #337ab7 0%, #2e6da4 100%); |
||||
filter: progid:DXImageTransform.Microsoft.gradient(startColorstr='#ff337ab7', endColorstr='#ff2e6da4', GradientType=0); |
||||
background-repeat: repeat-x; |
||||
} |
||||
} |
||||
.alert { |
||||
text-shadow: 0 1px 0 rgba(255, 255, 255, .2); |
||||
-webkit-box-shadow: inset 0 1px 0 rgba(255, 255, 255, .25), 0 1px 2px rgba(0, 0, 0, .05); |
||||
box-shadow: inset 0 1px 0 rgba(255, 255, 255, .25), 0 1px 2px rgba(0, 0, 0, .05); |
||||
} |
||||
.alert-success { |
||||
background-image: -webkit-linear-gradient(top, #dff0d8 0%, #c8e5bc 100%); |
||||
background-image: -o-linear-gradient(top, #dff0d8 0%, #c8e5bc 100%); |
||||
background-image: -webkit-gradient(linear, left top, left bottom, from(#dff0d8), to(#c8e5bc)); |
||||
background-image: linear-gradient(to bottom, #dff0d8 0%, #c8e5bc 100%); |
||||
filter: progid:DXImageTransform.Microsoft.gradient(startColorstr='#ffdff0d8', endColorstr='#ffc8e5bc', GradientType=0); |
||||
background-repeat: repeat-x; |
||||
border-color: #b2dba1; |
||||
} |
||||
.alert-info { |
||||
background-image: -webkit-linear-gradient(top, #d9edf7 0%, #b9def0 100%); |
||||
background-image: -o-linear-gradient(top, #d9edf7 0%, #b9def0 100%); |
||||
background-image: -webkit-gradient(linear, left top, left bottom, from(#d9edf7), to(#b9def0)); |
||||
background-image: linear-gradient(to bottom, #d9edf7 0%, #b9def0 100%); |
||||
filter: progid:DXImageTransform.Microsoft.gradient(startColorstr='#ffd9edf7', endColorstr='#ffb9def0', GradientType=0); |
||||
background-repeat: repeat-x; |
||||
border-color: #9acfea; |
||||
} |
||||
.alert-warning { |
||||
background-image: -webkit-linear-gradient(top, #fcf8e3 0%, #f8efc0 100%); |
||||
background-image: -o-linear-gradient(top, #fcf8e3 0%, #f8efc0 100%); |
||||
background-image: -webkit-gradient(linear, left top, left bottom, from(#fcf8e3), to(#f8efc0)); |
||||
background-image: linear-gradient(to bottom, #fcf8e3 0%, #f8efc0 100%); |
||||
filter: progid:DXImageTransform.Microsoft.gradient(startColorstr='#fffcf8e3', endColorstr='#fff8efc0', GradientType=0); |
||||
background-repeat: repeat-x; |
||||
border-color: #f5e79e; |
||||
} |
||||
.alert-danger { |
||||
background-image: -webkit-linear-gradient(top, #f2dede 0%, #e7c3c3 100%); |
||||
background-image: -o-linear-gradient(top, #f2dede 0%, #e7c3c3 100%); |
||||
background-image: -webkit-gradient(linear, left top, left bottom, from(#f2dede), to(#e7c3c3)); |
||||
background-image: linear-gradient(to bottom, #f2dede 0%, #e7c3c3 100%); |
||||
filter: progid:DXImageTransform.Microsoft.gradient(startColorstr='#fff2dede', endColorstr='#ffe7c3c3', GradientType=0); |
||||
background-repeat: repeat-x; |
||||
border-color: #dca7a7; |
||||
} |
||||
.progress { |
||||
background-image: -webkit-linear-gradient(top, #ebebeb 0%, #f5f5f5 100%); |
||||
background-image: -o-linear-gradient(top, #ebebeb 0%, #f5f5f5 100%); |
||||
background-image: -webkit-gradient(linear, left top, left bottom, from(#ebebeb), to(#f5f5f5)); |
||||
background-image: linear-gradient(to bottom, #ebebeb 0%, #f5f5f5 100%); |
||||
filter: progid:DXImageTransform.Microsoft.gradient(startColorstr='#ffebebeb', endColorstr='#fff5f5f5', GradientType=0); |
||||
background-repeat: repeat-x; |
||||
} |
||||
.progress-bar { |
||||
background-image: -webkit-linear-gradient(top, #337ab7 0%, #286090 100%); |
||||
background-image: -o-linear-gradient(top, #337ab7 0%, #286090 100%); |
||||
background-image: -webkit-gradient(linear, left top, left bottom, from(#337ab7), to(#286090)); |
||||
background-image: linear-gradient(to bottom, #337ab7 0%, #286090 100%); |
||||
filter: progid:DXImageTransform.Microsoft.gradient(startColorstr='#ff337ab7', endColorstr='#ff286090', GradientType=0); |
||||
background-repeat: repeat-x; |
||||
} |
||||
.progress-bar-success { |
||||
background-image: -webkit-linear-gradient(top, #5cb85c 0%, #449d44 100%); |
||||
background-image: -o-linear-gradient(top, #5cb85c 0%, #449d44 100%); |
||||
background-image: -webkit-gradient(linear, left top, left bottom, from(#5cb85c), to(#449d44)); |
||||
background-image: linear-gradient(to bottom, #5cb85c 0%, #449d44 100%); |
||||
filter: progid:DXImageTransform.Microsoft.gradient(startColorstr='#ff5cb85c', endColorstr='#ff449d44', GradientType=0); |
||||
background-repeat: repeat-x; |
||||
} |
||||
.progress-bar-info { |
||||
background-image: -webkit-linear-gradient(top, #5bc0de 0%, #31b0d5 100%); |
||||
background-image: -o-linear-gradient(top, #5bc0de 0%, #31b0d5 100%); |
||||
background-image: -webkit-gradient(linear, left top, left bottom, from(#5bc0de), to(#31b0d5)); |
||||
background-image: linear-gradient(to bottom, #5bc0de 0%, #31b0d5 100%); |
||||
filter: progid:DXImageTransform.Microsoft.gradient(startColorstr='#ff5bc0de', endColorstr='#ff31b0d5', GradientType=0); |
||||
background-repeat: repeat-x; |
||||
} |
||||
.progress-bar-warning { |
||||
background-image: -webkit-linear-gradient(top, #f0ad4e 0%, #ec971f 100%); |
||||
background-image: -o-linear-gradient(top, #f0ad4e 0%, #ec971f 100%); |
||||
background-image: -webkit-gradient(linear, left top, left bottom, from(#f0ad4e), to(#ec971f)); |
||||
background-image: linear-gradient(to bottom, #f0ad4e 0%, #ec971f 100%); |
||||
filter: progid:DXImageTransform.Microsoft.gradient(startColorstr='#fff0ad4e', endColorstr='#ffec971f', GradientType=0); |
||||
background-repeat: repeat-x; |
||||
} |
||||
.progress-bar-danger { |
||||
background-image: -webkit-linear-gradient(top, #d9534f 0%, #c9302c 100%); |
||||
background-image: -o-linear-gradient(top, #d9534f 0%, #c9302c 100%); |
||||
background-image: -webkit-gradient(linear, left top, left bottom, from(#d9534f), to(#c9302c)); |
||||
background-image: linear-gradient(to bottom, #d9534f 0%, #c9302c 100%); |
||||
filter: progid:DXImageTransform.Microsoft.gradient(startColorstr='#ffd9534f', endColorstr='#ffc9302c', GradientType=0); |
||||
background-repeat: repeat-x; |
||||
} |
||||
.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); |
||||
} |
||||
.list-group { |
||||
border-radius: 4px; |
||||
-webkit-box-shadow: 0 1px 2px rgba(0, 0, 0, .075); |
||||
box-shadow: 0 1px 2px rgba(0, 0, 0, .075); |
||||
} |
||||
.list-group-item.active, |
||||
.list-group-item.active:hover, |
||||
.list-group-item.active:focus { |
||||
text-shadow: 0 -1px 0 #286090; |
||||
background-image: -webkit-linear-gradient(top, #337ab7 0%, #2b669a 100%); |
||||
background-image: -o-linear-gradient(top, #337ab7 0%, #2b669a 100%); |
||||
background-image: -webkit-gradient(linear, left top, left bottom, from(#337ab7), to(#2b669a)); |
||||
background-image: linear-gradient(to bottom, #337ab7 0%, #2b669a 100%); |
||||
filter: progid:DXImageTransform.Microsoft.gradient(startColorstr='#ff337ab7', endColorstr='#ff2b669a', GradientType=0); |
||||
background-repeat: repeat-x; |
||||
border-color: #2b669a; |
||||
} |
||||
.list-group-item.active .badge, |
||||
.list-group-item.active:hover .badge, |
||||
.list-group-item.active:focus .badge { |
||||
text-shadow: none; |
||||
} |
||||
.panel { |
||||
-webkit-box-shadow: 0 1px 2px rgba(0, 0, 0, .05); |
||||
box-shadow: 0 1px 2px rgba(0, 0, 0, .05); |
||||
} |
||||
.panel-default > .panel-heading { |
||||
background-image: -webkit-linear-gradient(top, #f5f5f5 0%, #e8e8e8 100%); |
||||
background-image: -o-linear-gradient(top, #f5f5f5 0%, #e8e8e8 100%); |
||||
background-image: -webkit-gradient(linear, left top, left bottom, from(#f5f5f5), to(#e8e8e8)); |
||||
background-image: linear-gradient(to bottom, #f5f5f5 0%, #e8e8e8 100%); |
||||
filter: progid:DXImageTransform.Microsoft.gradient(startColorstr='#fff5f5f5', endColorstr='#ffe8e8e8', GradientType=0); |
||||
background-repeat: repeat-x; |
||||
} |
||||
.panel-primary > .panel-heading { |
||||
background-image: -webkit-linear-gradient(top, #337ab7 0%, #2e6da4 100%); |
||||
background-image: -o-linear-gradient(top, #337ab7 0%, #2e6da4 100%); |
||||
background-image: -webkit-gradient(linear, left top, left bottom, from(#337ab7), to(#2e6da4)); |
||||
background-image: linear-gradient(to bottom, #337ab7 0%, #2e6da4 100%); |
||||
filter: progid:DXImageTransform.Microsoft.gradient(startColorstr='#ff337ab7', endColorstr='#ff2e6da4', GradientType=0); |
||||
background-repeat: repeat-x; |
||||
} |
||||
.panel-success > .panel-heading { |
||||
background-image: -webkit-linear-gradient(top, #dff0d8 0%, #d0e9c6 100%); |
||||
background-image: -o-linear-gradient(top, #dff0d8 0%, #d0e9c6 100%); |
||||
background-image: -webkit-gradient(linear, left top, left bottom, from(#dff0d8), to(#d0e9c6)); |
||||
background-image: linear-gradient(to bottom, #dff0d8 0%, #d0e9c6 100%); |
||||
filter: progid:DXImageTransform.Microsoft.gradient(startColorstr='#ffdff0d8', endColorstr='#ffd0e9c6', GradientType=0); |
||||
background-repeat: repeat-x; |
||||
} |
||||
.panel-info > .panel-heading { |
||||
background-image: -webkit-linear-gradient(top, #d9edf7 0%, #c4e3f3 100%); |
||||
background-image: -o-linear-gradient(top, #d9edf7 0%, #c4e3f3 100%); |
||||
background-image: -webkit-gradient(linear, left top, left bottom, from(#d9edf7), to(#c4e3f3)); |
||||
background-image: linear-gradient(to bottom, #d9edf7 0%, #c4e3f3 100%); |
||||
filter: progid:DXImageTransform.Microsoft.gradient(startColorstr='#ffd9edf7', endColorstr='#ffc4e3f3', GradientType=0); |
||||
background-repeat: repeat-x; |
||||
} |
||||
.panel-warning > .panel-heading { |
||||
background-image: -webkit-linear-gradient(top, #fcf8e3 0%, #faf2cc 100%); |
||||
background-image: -o-linear-gradient(top, #fcf8e3 0%, #faf2cc 100%); |
||||
background-image: -webkit-gradient(linear, left top, left bottom, from(#fcf8e3), to(#faf2cc)); |
||||
background-image: linear-gradient(to bottom, #fcf8e3 0%, #faf2cc 100%); |
||||
filter: progid:DXImageTransform.Microsoft.gradient(startColorstr='#fffcf8e3', endColorstr='#fffaf2cc', GradientType=0); |
||||
background-repeat: repeat-x; |
||||
} |
||||
.panel-danger > .panel-heading { |
||||
background-image: -webkit-linear-gradient(top, #f2dede 0%, #ebcccc 100%); |
||||
background-image: -o-linear-gradient(top, #f2dede 0%, #ebcccc 100%); |
||||
background-image: -webkit-gradient(linear, left top, left bottom, from(#f2dede), to(#ebcccc)); |
||||
background-image: linear-gradient(to bottom, #f2dede 0%, #ebcccc 100%); |
||||
filter: progid:DXImageTransform.Microsoft.gradient(startColorstr='#fff2dede', endColorstr='#ffebcccc', GradientType=0); |
||||
background-repeat: repeat-x; |
||||
} |
||||
.well { |
||||
background-image: -webkit-linear-gradient(top, #e8e8e8 0%, #f5f5f5 100%); |
||||
background-image: -o-linear-gradient(top, #e8e8e8 0%, #f5f5f5 100%); |
||||
background-image: -webkit-gradient(linear, left top, left bottom, from(#e8e8e8), to(#f5f5f5)); |
||||
background-image: linear-gradient(to bottom, #e8e8e8 0%, #f5f5f5 100%); |
||||
filter: progid:DXImageTransform.Microsoft.gradient(startColorstr='#ffe8e8e8', endColorstr='#fff5f5f5', GradientType=0); |
||||
background-repeat: repeat-x; |
||||
border-color: #dcdcdc; |
||||
-webkit-box-shadow: inset 0 1px 3px rgba(0, 0, 0, .05), 0 1px 0 rgba(255, 255, 255, .1); |
||||
box-shadow: inset 0 1px 3px rgba(0, 0, 0, .05), 0 1px 0 rgba(255, 255, 255, .1); |
||||
} |
||||
/*# sourceMappingURL=bootstrap-theme.css.map */ |
File diff suppressed because one or more lines are too long
File diff suppressed because one or more lines are too long
File diff suppressed because one or more lines are too long
File diff suppressed because it is too large
Load Diff
File diff suppressed because one or more lines are too long
File diff suppressed because one or more lines are too long
File diff suppressed because one or more lines are too long
Binary file not shown.
After Width: | Height: | Size: 106 KiB |
Binary file not shown.
Binary file not shown.
Binary file not shown.
File diff suppressed because it is too large
Load Diff
File diff suppressed because one or more lines are too long
@ -0,0 +1,13 @@ |
||||
// This file is autogenerated via the `commonjs` Grunt task. You can require() this file in a CommonJS environment.
|
||||
require('../../js/transition.js') |
||||
require('../../js/alert.js') |
||||
require('../../js/button.js') |
||||
require('../../js/carousel.js') |
||||
require('../../js/collapse.js') |
||||
require('../../js/dropdown.js') |
||||
require('../../js/modal.js') |
||||
require('../../js/tooltip.js') |
||||
require('../../js/popover.js') |
||||
require('../../js/scrollspy.js') |
||||
require('../../js/tab.js') |
||||
require('../../js/affix.js') |
@ -0,0 +1,15 @@ |
||||
{ |
||||
"name": "jquery-validation-unobtrusive", |
||||
"homepage": "https://github.com/aspnet/jquery-validation-unobtrusive", |
||||
"version": "3.2.9", |
||||
"_release": "3.2.9", |
||||
"_resolution": { |
||||
"type": "version", |
||||
"tag": "v3.2.9", |
||||
"commit": "a91f5401898e125f10771c5f5f0909d8c4c82396" |
||||
}, |
||||
"_source": "https://github.com/aspnet/jquery-validation-unobtrusive.git", |
||||
"_target": "^3.2.9", |
||||
"_originalSource": "jquery-validation-unobtrusive", |
||||
"_direct": true |
||||
} |
@ -0,0 +1,12 @@ |
||||
Copyright (c) .NET Foundation. All rights reserved. |
||||
|
||||
Licensed under the Apache License, Version 2.0 (the "License"); you may not use |
||||
these files except in compliance with the License. You may obtain a copy of the |
||||
License at |
||||
|
||||
http://www.apache.org/licenses/LICENSE-2.0 |
||||
|
||||
Unless required by applicable law or agreed to in writing, software distributed |
||||
under the License is distributed on an "AS IS" BASIS, WITHOUT WARRANTIES OR |
||||
CONDITIONS OF ANY KIND, either express or implied. See the License for the |
||||
specific language governing permissions and limitations under the License. |
@ -0,0 +1,431 @@ |
||||
// Unobtrusive validation support library for jQuery and jQuery Validate
|
||||
// Copyright (C) Microsoft Corporation. All rights reserved.
|
||||
// @version v3.2.9
|
||||
|
||||
/*jslint white: true, browser: true, onevar: true, undef: true, nomen: true, eqeqeq: true, plusplus: true, bitwise: true, regexp: true, newcap: true, immed: true, strict: false */ |
||||
/*global document: false, jQuery: false */ |
||||
|
||||
(function (factory) { |
||||
if (typeof define === 'function' && define.amd) { |
||||
// AMD. Register as an anonymous module.
|
||||
define("jquery.validate.unobtrusive", ['jquery.validation'], factory); |
||||
} else if (typeof module === 'object' && module.exports) { |
||||
// CommonJS-like environments that support module.exports
|
||||
module.exports = factory(require('jquery-validation')); |
||||
} else { |
||||
// Browser global
|
||||
jQuery.validator.unobtrusive = factory(jQuery); |
||||
} |
||||
}(function ($) { |
||||
var $jQval = $.validator, |
||||
adapters, |
||||
data_validation = "unobtrusiveValidation"; |
||||
|
||||
function setValidationValues(options, ruleName, value) { |
||||
options.rules[ruleName] = value; |
||||
if (options.message) { |
||||
options.messages[ruleName] = options.message; |
||||
} |
||||
} |
||||
|
||||
function splitAndTrim(value) { |
||||
return value.replace(/^\s+|\s+$/g, "").split(/\s*,\s*/g); |
||||
} |
||||
|
||||
function escapeAttributeValue(value) { |
||||
// As mentioned on http://api.jquery.com/category/selectors/
|
||||
return value.replace(/([!"#$%&'()*+,./:;<=>?@\[\\\]^`{|}~])/g, "\\$1"); |
||||
} |
||||
|
||||
function getModelPrefix(fieldName) { |
||||
return fieldName.substr(0, fieldName.lastIndexOf(".") + 1); |
||||
} |
||||
|
||||
function appendModelPrefix(value, prefix) { |
||||
if (value.indexOf("*.") === 0) { |
||||
value = value.replace("*.", prefix); |
||||
} |
||||
return value; |
||||
} |
||||
|
||||
function onError(error, inputElement) { // 'this' is the form element
|
||||
var container = $(this).find("[data-valmsg-for='" + escapeAttributeValue(inputElement[0].name) + "']"), |
||||
replaceAttrValue = container.attr("data-valmsg-replace"), |
||||
replace = replaceAttrValue ? $.parseJSON(replaceAttrValue) !== false : null; |
||||
|
||||
container.removeClass("field-validation-valid").addClass("field-validation-error"); |
||||
error.data("unobtrusiveContainer", container); |
||||
|
||||
if (replace) { |
||||
container.empty(); |
||||
error.removeClass("input-validation-error").appendTo(container); |
||||
} |
||||
else { |
||||
error.hide(); |
||||
} |
||||
} |
||||
|
||||
function onErrors(event, validator) { // 'this' is the form element
|
||||
var container = $(this).find("[data-valmsg-summary=true]"), |
||||
list = container.find("ul"); |
||||
|
||||
if (list && list.length && validator.errorList.length) { |
||||
list.empty(); |
||||
container.addClass("validation-summary-errors").removeClass("validation-summary-valid"); |
||||
|
||||
$.each(validator.errorList, function () { |
||||
$("<li />").html(this.message).appendTo(list); |
||||
}); |
||||
} |
||||
} |
||||
|
||||
function onSuccess(error) { // 'this' is the form element
|
||||
var container = error.data("unobtrusiveContainer"); |
||||
|
||||
if (container) { |
||||
var replaceAttrValue = container.attr("data-valmsg-replace"), |
||||
replace = replaceAttrValue ? $.parseJSON(replaceAttrValue) : null; |
||||
|
||||
container.addClass("field-validation-valid").removeClass("field-validation-error"); |
||||
error.removeData("unobtrusiveContainer"); |
||||
|
||||
if (replace) { |
||||
container.empty(); |
||||
} |
||||
} |
||||
} |
||||
|
||||
function onReset(event) { // 'this' is the form element
|
||||
var $form = $(this), |
||||
key = '__jquery_unobtrusive_validation_form_reset'; |
||||
if ($form.data(key)) { |
||||
return; |
||||
} |
||||
// Set a flag that indicates we're currently resetting the form.
|
||||
$form.data(key, true); |
||||
try { |
||||
$form.data("validator").resetForm(); |
||||
} finally { |
||||
$form.removeData(key); |
||||
} |
||||
|
||||
$form.find(".validation-summary-errors") |
||||
.addClass("validation-summary-valid") |
||||
.removeClass("validation-summary-errors"); |
||||
$form.find(".field-validation-error") |
||||
.addClass("field-validation-valid") |
||||
.removeClass("field-validation-error") |
||||
.removeData("unobtrusiveContainer") |
||||
.find(">*") // If we were using valmsg-replace, get the underlying error
|
||||
.removeData("unobtrusiveContainer"); |
||||
} |
||||
|
||||
function validationInfo(form) { |
||||
var $form = $(form), |
||||
result = $form.data(data_validation), |
||||
onResetProxy = $.proxy(onReset, form), |
||||
defaultOptions = $jQval.unobtrusive.options || {}, |
||||
execInContext = function (name, args) { |
||||
var func = defaultOptions[name]; |
||||
func && $.isFunction(func) && func.apply(form, args); |
||||
}; |
||||
|
||||
if (!result) { |
||||
result = { |
||||
options: { // options structure passed to jQuery Validate's validate() method
|
||||
errorClass: defaultOptions.errorClass || "input-validation-error", |
||||
errorElement: defaultOptions.errorElement || "span", |
||||
errorPlacement: function () { |
||||
onError.apply(form, arguments); |
||||
execInContext("errorPlacement", arguments); |
||||
}, |
||||
invalidHandler: function () { |
||||
onErrors.apply(form, arguments); |
||||
execInContext("invalidHandler", arguments); |
||||
}, |
||||
messages: {}, |
||||
rules: {}, |
||||
success: function () { |
||||
onSuccess.apply(form, arguments); |
||||
execInContext("success", arguments); |
||||
} |
||||
}, |
||||
attachValidation: function () { |
||||
$form |
||||
.off("reset." + data_validation, onResetProxy) |
||||
.on("reset." + data_validation, onResetProxy) |
||||
.validate(this.options); |
||||
}, |
||||
validate: function () { // a validation function that is called by unobtrusive Ajax
|
||||
$form.validate(); |
||||
return $form.valid(); |
||||
} |
||||
}; |
||||
$form.data(data_validation, result); |
||||
} |
||||
|
||||
return result; |
||||
} |
||||
|
||||
$jQval.unobtrusive = { |
||||
adapters: [], |
||||
|
||||
parseElement: function (element, skipAttach) { |
||||
/// <summary>
|
||||
/// Parses a single HTML element for unobtrusive validation attributes.
|
||||
/// </summary>
|
||||
/// <param name="element" domElement="true">The HTML element to be parsed.</param>
|
||||
/// <param name="skipAttach" type="Boolean">[Optional] true to skip attaching the
|
||||
/// validation to the form. If parsing just this single element, you should specify true.
|
||||
/// If parsing several elements, you should specify false, and manually attach the validation
|
||||
/// to the form when you are finished. The default is false.</param>
|
||||
var $element = $(element), |
||||
form = $element.parents("form")[0], |
||||
valInfo, rules, messages; |
||||
|
||||
if (!form) { // Cannot do client-side validation without a form
|
||||
return; |
||||
} |
||||
|
||||
valInfo = validationInfo(form); |
||||
valInfo.options.rules[element.name] = rules = {}; |
||||
valInfo.options.messages[element.name] = messages = {}; |
||||
|
||||
$.each(this.adapters, function () { |
||||
var prefix = "data-val-" + this.name, |
||||
message = $element.attr(prefix), |
||||
paramValues = {}; |
||||
|
||||
if (message !== undefined) { // Compare against undefined, because an empty message is legal (and falsy)
|
||||
prefix += "-"; |
||||
|
||||
$.each(this.params, function () { |
||||
paramValues[this] = $element.attr(prefix + this); |
||||
}); |
||||
|
||||
this.adapt({ |
||||
element: element, |
||||
form: form, |
||||
message: message, |
||||
params: paramValues, |
||||
rules: rules, |
||||
messages: messages |
||||
}); |
||||
} |
||||
}); |
||||
|
||||
$.extend(rules, { "__dummy__": true }); |
||||
|
||||
if (!skipAttach) { |
||||
valInfo.attachValidation(); |
||||
} |
||||
}, |
||||
|
||||
parse: function (selector) { |
||||
/// <summary>
|
||||
/// Parses all the HTML elements in the specified selector. It looks for input elements decorated
|
||||
/// with the [data-val=true] attribute value and enables validation according to the data-val-*
|
||||
/// attribute values.
|
||||
/// </summary>
|
||||
/// <param name="selector" type="String">Any valid jQuery selector.</param>
|
||||
|
||||
// $forms includes all forms in selector's DOM hierarchy (parent, children and self) that have at least one
|
||||
// element with data-val=true
|
||||
var $selector = $(selector), |
||||
$forms = $selector.parents() |
||||
.addBack() |
||||
.filter("form") |
||||
.add($selector.find("form")) |
||||
.has("[data-val=true]"); |
||||
|
||||
$selector.find("[data-val=true]").each(function () { |
||||
$jQval.unobtrusive.parseElement(this, true); |
||||
}); |
||||
|
||||
$forms.each(function () { |
||||
var info = validationInfo(this); |
||||
if (info) { |
||||
info.attachValidation(); |
||||
} |
||||
}); |
||||
} |
||||
}; |
||||
|
||||
adapters = $jQval.unobtrusive.adapters; |
||||
|
||||
adapters.add = function (adapterName, params, fn) { |
||||
/// <summary>Adds a new adapter to convert unobtrusive HTML into a jQuery Validate validation.</summary>
|
||||
/// <param name="adapterName" type="String">The name of the adapter to be added. This matches the name used
|
||||
/// in the data-val-nnnn HTML attribute (where nnnn is the adapter name).</param>
|
||||
/// <param name="params" type="Array" optional="true">[Optional] An array of parameter names (strings) that will
|
||||
/// be extracted from the data-val-nnnn-mmmm HTML attributes (where nnnn is the adapter name, and
|
||||
/// mmmm is the parameter name).</param>
|
||||
/// <param name="fn" type="Function">The function to call, which adapts the values from the HTML
|
||||
/// attributes into jQuery Validate rules and/or messages.</param>
|
||||
/// <returns type="jQuery.validator.unobtrusive.adapters" />
|
||||
if (!fn) { // Called with no params, just a function
|
||||
fn = params; |
||||
params = []; |
||||
} |
||||
this.push({ name: adapterName, params: params, adapt: fn }); |
||||
return this; |
||||
}; |
||||
|
||||
adapters.addBool = function (adapterName, ruleName) { |
||||
/// <summary>Adds a new adapter to convert unobtrusive HTML into a jQuery Validate validation, where
|
||||
/// the jQuery Validate validation rule has no parameter values.</summary>
|
||||
/// <param name="adapterName" type="String">The name of the adapter to be added. This matches the name used
|
||||
/// in the data-val-nnnn HTML attribute (where nnnn is the adapter name).</param>
|
||||
/// <param name="ruleName" type="String" optional="true">[Optional] The name of the jQuery Validate rule. If not provided, the value
|
||||
/// of adapterName will be used instead.</param>
|
||||
/// <returns type="jQuery.validator.unobtrusive.adapters" />
|
||||
return this.add(adapterName, function (options) { |
||||
setValidationValues(options, ruleName || adapterName, true); |
||||
}); |
||||
}; |
||||
|
||||
adapters.addMinMax = function (adapterName, minRuleName, maxRuleName, minMaxRuleName, minAttribute, maxAttribute) { |
||||
/// <summary>Adds a new adapter to convert unobtrusive HTML into a jQuery Validate validation, where
|
||||
/// the jQuery Validate validation has three potential rules (one for min-only, one for max-only, and
|
||||
/// one for min-and-max). The HTML parameters are expected to be named -min and -max.</summary>
|
||||
/// <param name="adapterName" type="String">The name of the adapter to be added. This matches the name used
|
||||
/// in the data-val-nnnn HTML attribute (where nnnn is the adapter name).</param>
|
||||
/// <param name="minRuleName" type="String">The name of the jQuery Validate rule to be used when you only
|
||||
/// have a minimum value.</param>
|
||||
/// <param name="maxRuleName" type="String">The name of the jQuery Validate rule to be used when you only
|
||||
/// have a maximum value.</param>
|
||||
/// <param name="minMaxRuleName" type="String">The name of the jQuery Validate rule to be used when you
|
||||
/// have both a minimum and maximum value.</param>
|
||||
/// <param name="minAttribute" type="String" optional="true">[Optional] The name of the HTML attribute that
|
||||
/// contains the minimum value. The default is "min".</param>
|
||||
/// <param name="maxAttribute" type="String" optional="true">[Optional] The name of the HTML attribute that
|
||||
/// contains the maximum value. The default is "max".</param>
|
||||
/// <returns type="jQuery.validator.unobtrusive.adapters" />
|
||||
return this.add(adapterName, [minAttribute || "min", maxAttribute || "max"], function (options) { |
||||
var min = options.params.min, |
||||
max = options.params.max; |
||||
|
||||
if (min && max) { |
||||
setValidationValues(options, minMaxRuleName, [min, max]); |
||||
} |
||||
else if (min) { |
||||
setValidationValues(options, minRuleName, min); |
||||
} |
||||
else if (max) { |
||||
setValidationValues(options, maxRuleName, max); |
||||
} |
||||
}); |
||||
}; |
||||
|
||||
adapters.addSingleVal = function (adapterName, attribute, ruleName) { |
||||
/// <summary>Adds a new adapter to convert unobtrusive HTML into a jQuery Validate validation, where
|
||||
/// the jQuery Validate validation rule has a single value.</summary>
|
||||
/// <param name="adapterName" type="String">The name of the adapter to be added. This matches the name used
|
||||
/// in the data-val-nnnn HTML attribute(where nnnn is the adapter name).</param>
|
||||
/// <param name="attribute" type="String">[Optional] The name of the HTML attribute that contains the value.
|
||||
/// The default is "val".</param>
|
||||
/// <param name="ruleName" type="String" optional="true">[Optional] The name of the jQuery Validate rule. If not provided, the value
|
||||
/// of adapterName will be used instead.</param>
|
||||
/// <returns type="jQuery.validator.unobtrusive.adapters" />
|
||||
return this.add(adapterName, [attribute || "val"], function (options) { |
||||
setValidationValues(options, ruleName || adapterName, options.params[attribute]); |
||||
}); |
||||
}; |
||||
|
||||
$jQval.addMethod("__dummy__", function (value, element, params) { |
||||
return true; |
||||
}); |
||||
|
||||
$jQval.addMethod("regex", function (value, element, params) { |
||||
var match; |
||||
if (this.optional(element)) { |
||||
return true; |
||||
} |
||||
|
||||
match = new RegExp(params).exec(value); |
||||
return (match && (match.index === 0) && (match[0].length === value.length)); |
||||
}); |
||||
|
||||
$jQval.addMethod("nonalphamin", function (value, element, nonalphamin) { |
||||
var match; |
||||
if (nonalphamin) { |
||||
match = value.match(/\W/g); |
||||
match = match && match.length >= nonalphamin; |
||||
} |
||||
return match; |
||||
}); |
||||
|
||||
if ($jQval.methods.extension) { |
||||
adapters.addSingleVal("accept", "mimtype"); |
||||
adapters.addSingleVal("extension", "extension"); |
||||
} else { |
||||
// for backward compatibility, when the 'extension' validation method does not exist, such as with versions
|
||||
// of JQuery Validation plugin prior to 1.10, we should use the 'accept' method for
|
||||
// validating the extension, and ignore mime-type validations as they are not supported.
|
||||
adapters.addSingleVal("extension", "extension", "accept"); |
||||
} |
||||
|
||||
adapters.addSingleVal("regex", "pattern"); |
||||
adapters.addBool("creditcard").addBool("date").addBool("digits").addBool("email").addBool("number").addBool("url"); |
||||
adapters.addMinMax("length", "minlength", "maxlength", "rangelength").addMinMax("range", "min", "max", "range"); |
||||
adapters.addMinMax("minlength", "minlength").addMinMax("maxlength", "minlength", "maxlength"); |
||||
adapters.add("equalto", ["other"], function (options) { |
||||
var prefix = getModelPrefix(options.element.name), |
||||
other = options.params.other, |
||||
fullOtherName = appendModelPrefix(other, prefix), |
||||
element = $(options.form).find(":input").filter("[name='" + escapeAttributeValue(fullOtherName) + "']")[0]; |
||||
|
||||
setValidationValues(options, "equalTo", element); |
||||
}); |
||||
adapters.add("required", function (options) { |
||||
// jQuery Validate equates "required" with "mandatory" for checkbox elements
|
||||
if (options.element.tagName.toUpperCase() !== "INPUT" || options.element.type.toUpperCase() !== "CHECKBOX") { |
||||
setValidationValues(options, "required", true); |
||||
} |
||||
}); |
||||
adapters.add("remote", ["url", "type", "additionalfields"], function (options) { |
||||
var value = { |
||||
url: options.params.url, |
||||
type: options.params.type || "GET", |
||||
data: {} |
||||
}, |
||||
prefix = getModelPrefix(options.element.name); |
||||
|
||||
$.each(splitAndTrim(options.params.additionalfields || options.element.name), function (i, fieldName) { |
||||
var paramName = appendModelPrefix(fieldName, prefix); |
||||
value.data[paramName] = function () { |
||||
var field = $(options.form).find(":input").filter("[name='" + escapeAttributeValue(paramName) + "']"); |
||||
// For checkboxes and radio buttons, only pick up values from checked fields.
|
||||
if (field.is(":checkbox")) { |
||||
return field.filter(":checked").val() || field.filter(":hidden").val() || ''; |
||||
} |
||||
else if (field.is(":radio")) { |
||||
return field.filter(":checked").val() || ''; |
||||
} |
||||
return field.val(); |
||||
}; |
||||
}); |
||||
|
||||
setValidationValues(options, "remote", value); |
||||
}); |
||||
adapters.add("password", ["min", "nonalphamin", "regex"], function (options) { |
||||
if (options.params.min) { |
||||
setValidationValues(options, "minlength", options.params.min); |
||||
} |
||||
if (options.params.nonalphamin) { |
||||
setValidationValues(options, "nonalphamin", options.params.nonalphamin); |
||||
} |
||||
if (options.params.regex) { |
||||
setValidationValues(options, "regex", options.params.regex); |
||||
} |
||||
}); |
||||
adapters.add("fileextensions", ["extensions"], function (options) { |
||||
setValidationValues(options, "extension", options.params.extensions); |
||||
}); |
||||
|
||||
$(function () { |
||||
$jQval.unobtrusive.parse(document); |
||||
}); |
||||
|
||||
return $jQval.unobtrusive; |
||||
})); |
File diff suppressed because one or more lines are too long
@ -0,0 +1,41 @@ |
||||
{ |
||||
"name": "jquery-validation", |
||||
"homepage": "https://jqueryvalidation.org/", |
||||
"repository": { |
||||
"type": "git", |
||||
"url": "git://github.com/jquery-validation/jquery-validation.git" |
||||
}, |
||||
"authors": [ |
||||
"Jörn Zaefferer <joern.zaefferer@gmail.com>" |
||||
], |
||||
"description": "Form validation made easy", |
||||
"main": "dist/jquery.validate.js", |
||||
"keywords": [ |
||||
"forms", |
||||
"validation", |
||||
"validate" |
||||
], |
||||
"license": "MIT", |
||||
"ignore": [ |
||||
"**/.*", |
||||
"node_modules", |
||||
"bower_components", |
||||
"test", |
||||
"demo", |
||||
"lib" |
||||
], |
||||
"dependencies": { |
||||
"jquery": ">= 1.7.2" |
||||
}, |
||||
"version": "1.17.0", |
||||
"_release": "1.17.0", |
||||
"_resolution": { |
||||
"type": "version", |
||||
"tag": "1.17.0", |
||||
"commit": "fc9b12d3bfaa2d0c04605855b896edb2934c0772" |
||||
}, |
||||
"_source": "https://github.com/jzaefferer/jquery-validation.git", |
||||
"_target": "^1.17.0", |
||||
"_originalSource": "jquery-validation", |
||||
"_direct": true |
||||
} |
@ -0,0 +1,22 @@ |
||||
The MIT License (MIT) |
||||
===================== |
||||
|
||||
Copyright Jörn Zaefferer |
||||
|
||||
Permission is hereby granted, free of charge, to any person obtaining a copy |
||||
of this software and associated documentation files (the "Software"), to deal |
||||
in the Software without restriction, including without limitation the rights |
||||
to use, copy, modify, merge, publish, distribute, sublicense, and/or sell |
||||
copies of the Software, and to permit persons to whom the Software is |
||||
furnished to do so, subject to the following conditions: |
||||
|
||||
The above copyright notice and this permission notice shall be included in |
||||
all copies or substantial portions of the Software. |
||||
|
||||
THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR |
||||
IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, |
||||
FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE |
||||
AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER |
||||
LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, |
||||
OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN |
||||
THE SOFTWARE. |
File diff suppressed because it is too large
Load Diff
File diff suppressed because one or more lines are too long
File diff suppressed because it is too large
Load Diff
File diff suppressed because one or more lines are too long
@ -0,0 +1,26 @@ |
||||
{ |
||||
"name": "jquery", |
||||
"main": "dist/jquery.js", |
||||
"license": "MIT", |
||||
"ignore": [ |
||||
"package.json" |
||||
], |
||||
"keywords": [ |
||||
"jquery", |
||||
"javascript", |
||||
"browser", |
||||
"library" |
||||
], |
||||
"homepage": "https://github.com/jquery/jquery-dist", |
||||
"version": "3.3.1", |
||||
"_release": "3.3.1", |
||||
"_resolution": { |
||||
"type": "version", |
||||
"tag": "3.3.1", |
||||
"commit": "9e8ec3d10fad04748176144f108d7355662ae75e" |
||||
}, |
||||
"_source": "https://github.com/jquery/jquery-dist.git", |
||||
"_target": "^3.3.1", |
||||
"_originalSource": "jquery", |
||||
"_direct": true |
||||
} |
@ -0,0 +1,36 @@ |
||||
Copyright JS Foundation and other contributors, https://js.foundation/ |
||||
|
||||
This software consists of voluntary contributions made by many |
||||
individuals. For exact contribution history, see the revision history |
||||
available at https://github.com/jquery/jquery |
||||
|
||||
The following license applies to all parts of this software except as |
||||
documented below: |
||||
|
||||
==== |
||||
|
||||
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. |
||||
|
||||
==== |
||||
|
||||
All files located in the node_modules and external directories are |
||||
externally maintained libraries used by this software which have their |
||||
own licenses; we recommend you read them, as their terms may differ from |
||||
the terms above. |
File diff suppressed because it is too large
Load Diff
File diff suppressed because one or more lines are too long
File diff suppressed because one or more lines are too long
@ -0,0 +1,55 @@ |
||||
# Use ASP.NET Core on Linux ARM32 with Docker |
||||
|
||||
You can use ASP.NET Core and Docker together on [ARM32](https://en.wikipedia.org/wiki/ARM_architecture) devices, with [Docker for Raspberry Pi and ARM32 devices](https://docs.docker.com/install/linux/docker-ce/debian). |
||||
|
||||
> Note: that Docker refers to ARM32 as `armhf` in documentation and other places. |
||||
|
||||
See [Use .NET Core on Linux ARM32 with Docker](../dotnetapp/aspnetcore-docker-arm32.md) for .NET Core console apps. |
||||
|
||||
See [.NET Core and Docker for ARM64](dotnet-docker-arm64.md) if you are interested in [ARM64](https://en.wikipedia.org/wiki/ARM64) usage. |
||||
|
||||
## Try a pre-built ASP.NET Core Docker Image |
||||
|
||||
You can quickly run a container with a pre-built [sample ASP.NET Core Docker image](https://hub.docker.com/r/microsoft/dotnet-samples/), based on this [sample](Dockerfile.preview). |
||||
|
||||
Type the following command to run a sample with [Docker](https://www.docker.com/products/docker): |
||||
|
||||
```console |
||||
docker run --rm -it -p 8000:80 microsoft/dotnet-samples:aspnetapp |
||||
``` |
||||
|
||||
After the application starts, navigate to `http://localhost:8000` in your web browser and/or to the IP address (example: http://192.168.1.18:8000) of your ARM32 device on your network. |
||||
|
||||
## Building .NET Core Samples with Docker |
||||
|
||||
You can build the same [.NET Core console samples](README.md) and [ASP.NET Core sample](../aspnetapp/README.md) on ARM devices as you can on other architectures. For example, the following instructions will work on an ARM32 device. The instructions assume that you are in the root of this repository. |
||||
|
||||
```console |
||||
cd samples |
||||
cd aspnetapp |
||||
docker build --pull -t aspnetapp . |
||||
docker run --rm -it -p 8000:80 aspnetapp |
||||
``` |
||||
|
||||
Another option is to build ARM32 Docker images on an X64 machine. You can do by using the same pattern used in the [Dockerfile.debian-arm32-selfcontained](../dotnetapp/Dockerfile.debian-arm32-selfcontained) dockerfile. It uses a multi-arch tag for building with the SDK and then an ARM32-specific tag for creating a runtime image. The pattern of building for other architectures only works because the Dockerfile doesn't run code in the runtime image. |
||||
|
||||
### Viewing the Site |
||||
|
||||
After the application starts, visit the site one of two ways: |
||||
|
||||
* From the web browser on the ARM32 device at `http://localhost:8000` |
||||
* From the web browser on another device on the same network on the ARM32 device IP on port 8000, similar to: `http://192.168.1.18:8000` |
||||
|
||||
You must set the `ASPNETCORE_URLS` environment variable manually ([example usage](https://github.com/dotnet/dotnet-docker/blob/master/2.1/runtime-deps/stretch-slim/arm32v7/Dockerfile#L19)) if you build the sample locally (without Docker) and want to navigate to the site from another machine. |
||||
|
||||
## Pushing the image to a Container Registry |
||||
|
||||
Push the image to a container registry after building the image so that you can pull it from another ARM32 device. You can also build an ARM32 image on an X64 machine, push to a registry and then pull from an ARM32 device. Instructions are provided for pushing to both Azure Container Registry and DockerHub (you only need to choose one): |
||||
|
||||
* [Push Docker Images to Azure Container Registry](push-image-to-acr.md) |
||||
* [Push Docker Images to DockerHub](push-image-to-dockerhub.md) |
||||
|
||||
## More Samples |
||||
|
||||
* [.NET Core Docker Samples](../README.md) |
||||
* [.NET Framework Docker Samples](https://github.com/microsoft/dotnet-framework-docker-samples/) |
@ -0,0 +1,210 @@ |
||||
# Developing ASP.NET Core Applications with Docker over HTTPS |
||||
|
||||
ASP.NET Core 2.1 uses [HTTPS by default](https://docs.microsoft.com/aspnet/core/security/enforcing-ssl). [HTTPS](https://en.wikipedia.org/wiki/HTTPS) relies on [certificates](https://en.wikipedia.org/wiki/Public_key_certificate) for trust, identity, and encryption. |
||||
|
||||
This document demonstrates how to develop ASP.NET Core applications with HTTPS in Docker containers. It is recommended to try the [ASP.NET Core Docker Sample](README.md) first, which is simpler because the container only exposes HTTP. The more basic will help you validate that you have the sample working correctly before adding the complication of certificates. |
||||
|
||||
See [Hosting ASP.NET Core Images with Docker over HTTPS](aspnetcore-docker-https.md) for production scenarios. |
||||
|
||||
The samples are written for `cmd.exe`. PowerShell users will need to special case the environment variables that are used in the instructions. |
||||
|
||||
This sample requires [Docker 17.06](https://docs.docker.com/release-notes/docker-ce) or later of the [Docker client](https://www.docker.com/products/docker). |
||||
|
||||
## Getting the sample |
||||
|
||||
The easiest way to get the sample is by cloning the samples repository with git, using the following instructions: |
||||
|
||||
```console |
||||
git clone https://github.com/dotnet/dotnet-docker/ |
||||
``` |
||||
|
||||
You can also [download the repository as a zip](https://github.com/dotnet/dotnet-docker/archive/master.zip). |
||||
|
||||
## Certificates |
||||
|
||||
ASP.NET Core uses [self-signed development certificates](https://en.wikipedia.org/wiki/Self-signed_certificate) for development. Self-signed certificates are easy and free to create. |
||||
|
||||
The instructions volume mount certificates into containers. You can add certificates into container images with a `COPY` command in a Dockerfile. This approach is not recommended. It makes it harder to use the same image for testing with dev certificates and hosting with production certificates. There is also a significant risk of certificate disclosure if certificates are made part of container images. |
||||
|
||||
## Application Secrets |
||||
|
||||
These instructions assume that your project is configured for [application secrets](https://docs.microsoft.com/aspnet/core/security/app-secrets). The primary requirement is a [UserSecretsId](https://github.com/dotnet/dotnet-docker/blob/master/samples/aspnetapp/aspnetapp/aspnetapp.csproj#L5) element in your project file. If you are using the ASP.NET Core sample in this repo, you don't need to do anything. It is already correctly configured. If you are using your own project file, add an `UserSecretsId` element. |
||||
|
||||
You can add the element manually or use Visual Studio to do it for you. The following image demonstrates the experience in Visual Studio. |
||||
|
||||
![Manage user secrets in Visual Studio](https://user-images.githubusercontent.com/7681382/39641521-85d4a7b4-4f9c-11e8-9466-d1ff56db33cb.png) |
||||
|
||||
The format of the `UserSecretsId` content doesn't matter. The sample in this repo used [Random String Generator](https://www.random.org/strings/?num=6&len=20&digits=on&unique=on&format=html&rnd=new) to produce a unique string. |
||||
|
||||
> Note: `User Secrets` and `Application Secrets` terms are used interchangebly. |
||||
|
||||
## Building and Running the Sample with HTTPS |
||||
|
||||
Use the following instructions, for your operating system configuration. The commands assume that you are in the root of the repository. |
||||
|
||||
> Note: The sample includes a banner to accept a cookie policy. When switching between HTTP and HTTPS, you may see the banner repeatedly. Delete the cookie for the site in `Developer Tools` in this case. |
||||
|
||||
![Developer Tools -- Delete cookie](https://user-images.githubusercontent.com/2608468/40246148-875fee5a-5a7c-11e8-9728-7da89a491014.png) |
||||
|
||||
### Windows using Linux containers |
||||
|
||||
Navigate to sample: |
||||
|
||||
```console |
||||
cd samples\aspnetapp |
||||
``` |
||||
|
||||
Generate cert and configure local machine: |
||||
|
||||
```console |
||||
dotnet dev-certs https -ep %USERPROFILE%\.aspnet\https\aspnetapp.pfx -p crypticpassword |
||||
dotnet dev-certs https --trust |
||||
``` |
||||
|
||||
> Note: The certificate name, in this case *aspnetapp*.pfx must match the project assembly name. |
||||
|
||||
> Note: `crypticpassword` is used as a stand-in for a password of your own choosing. |
||||
|
||||
Configure application secrets, for the certificate: |
||||
|
||||
```console |
||||
dotnet user-secrets -p aspnetapp\aspnetapp.csproj set "Kestrel:Certificates:Development:Password" "crypticpassword" |
||||
``` |
||||
|
||||
> Note: The password must match the password used for the certificate. |
||||
|
||||
Build a container image: |
||||
|
||||
```console |
||||
docker build --pull -t aspnetapp . |
||||
``` |
||||
|
||||
Run the container image with ASP.NET Core configured for HTTPS: |
||||
|
||||
```console |
||||
docker run --rm -it -p 8000:80 -p 8001:443 -e ASPNETCORE_URLS="https://+;http://+" -e ASPNETCORE_HTTPS_PORT=8001 -e ASPNETCORE_ENVIRONMENT=Development -v %APPDATA%\microsoft\UserSecrets\:/root/.microsoft/usersecrets -v %USERPROFILE%\.aspnet\https:/root/.aspnet/https/ aspnetapp |
||||
``` |
||||
|
||||
After the application starts, navigate to `http://localhost:8000` in your web browser. |
||||
|
||||
### macOS |
||||
|
||||
```console |
||||
cd samples\aspnetapp |
||||
``` |
||||
|
||||
Generate cert and configure local machine: |
||||
|
||||
```console |
||||
dotnet dev-certs https -ep ${HOME}/.aspnet/https/aspnetapp.pfx -p crypticpassword |
||||
dotnet dev-certs https --trust |
||||
``` |
||||
|
||||
> Note: The certificate name, in this case *aspnetapp*.pfx must match the project assembly name. |
||||
|
||||
> Note: `crypticpassword` is used as a stand-in for a password of your own choosing. |
||||
|
||||
Configure application secrets, for the certificate: |
||||
|
||||
```console |
||||
dotnet user-secrets -p aspnetapp/aspnetapp.csproj set "Kestrel:Certificates:Development:Password" "crypticpassword" |
||||
``` |
||||
|
||||
> Note: The password must match the password used for the certificate. |
||||
|
||||
Build a container image: |
||||
|
||||
```console |
||||
docker build --pull -t aspnetapp . |
||||
``` |
||||
|
||||
Run the container image with ASP.NET Core configured for HTTPS: |
||||
|
||||
```console |
||||
docker run --rm -it -p 8000:80 -p 8001:443 -e ASPNETCORE_URLS="https://+;http://+" -e ASPNETCORE_HTTPS_PORT=8001 -e ASPNETCORE_ENVIRONMENT=Development -v ${HOME}/.microsoft/UserSecrets/:/root/.microsoft/usersecrets -v ${HOME}/.aspnet/https:/root/.aspnet/https/ aspnetapp |
||||
``` |
||||
|
||||
After the application starts, navigate to `http://localhost:8000` in your web browser. |
||||
|
||||
### Linux |
||||
|
||||
```console |
||||
cd samples\aspnetapp |
||||
``` |
||||
|
||||
Generate cert and configure local machine: |
||||
|
||||
```console |
||||
dotnet dev-certs https -ep ${HOME}/.aspnet/https/aspnetapp.pfx -p crypticpassword |
||||
``` |
||||
|
||||
> Note: `dotnet dev-certs https --trust` is only supported on macOS and Windows. You need to trust certs on Linux in the way that is supported by your distro. It is likely that you need to trust the certificate in your browser. |
||||
|
||||
> Note: The certificate name, in this case *aspnetapp*.pfx must match the project assembly name. |
||||
|
||||
> Note: `crypticpassword` is used as a stand-in for a password of your own choosing. |
||||
|
||||
Build a container image: |
||||
|
||||
```console |
||||
docker build --pull -t aspnetapp . |
||||
``` |
||||
|
||||
Run the container image with ASP.NET Core configured for HTTPS: |
||||
|
||||
```console |
||||
docker run --rm -it -p 8000:80 -p 8001:443 -e ASPNETCORE_URLS="https://+;http://+" -e ASPNETCORE_HTTPS_PORT=8001 -e ASPNETCORE_ENVIRONMENT=Development -e ASPNETCORE_Kestrel__Certificates__Development__Password="crypticpassword" -v ${HOME}/.microsoft/UserSecrets/:/root/.microsoft/usersecrets -v ${HOME}/.aspnet/https:/root/.aspnet/https/ aspnetapp |
||||
``` |
||||
|
||||
After the application starts, navigate to `http://localhost:8000` in your web browser. |
||||
|
||||
### Windows using Windows containers |
||||
|
||||
Navigate to sample: |
||||
|
||||
```console |
||||
cd samples\aspnetapp |
||||
``` |
||||
|
||||
Generate cert and configure local machine: |
||||
|
||||
```console |
||||
dotnet dev-certs https -ep %USERPROFILE%\.aspnet\https\aspnetapp.pfx -p crypticpassword |
||||
dotnet dev-certs https --trust |
||||
``` |
||||
|
||||
> Note: The certificate name, in this case *aspnetapp*.pfx must match the project assembly name. |
||||
|
||||
> Note: `crypticpassword` is used as a stand-in for a password of your own choosing. |
||||
|
||||
Configure application secrets, for the certificate: |
||||
|
||||
```console |
||||
dotnet user-secrets -p aspnetapp\aspnetapp.csproj set "Kestrel:Certificates:Development:Password" "crypticpassword" |
||||
``` |
||||
|
||||
> Note: The password must match the password used for the certificate. |
||||
|
||||
Build a container image: |
||||
|
||||
```console |
||||
docker build --pull -t aspnetapp . |
||||
``` |
||||
|
||||
Run the container image with ASP.NET Core configured for HTTPS. Select the correct syntax, depending on the Windows Server version. |
||||
|
||||
#### Windows Server 2016 |
||||
|
||||
```console |
||||
docker run --rm -it -p 8000:80 -p 8001:443 -e ASPNETCORE_URLS="https://+;http://+" -e ASPNETCORE_HTTPS_PORT=8001 -e ASPNETCORE_ENVIRONMENT=Development -v %APPDATA%\microsoft\UserSecrets\:C:\Users\ContainerAdministrator\AppData\Roaming\microsoft\UserSecrets -v %USERPROFILE%\.aspnet\https:C:\Users\ContainerAdministrator\AppData\Roaming\ASP.NET\Https aspnetapp |
||||
``` |
||||
|
||||
#### Windows Server 2016, version 1709 or higher |
||||
|
||||
```console |
||||
docker run --rm -it -p 8000:80 -p 8001:443 -e ASPNETCORE_URLS="https://+;http://+" -e ASPNETCORE_HTTPS_PORT=8001 -e ASPNETCORE_ENVIRONMENT=Development -v %APPDATA%\microsoft\UserSecrets\:C:\Users\ContainerUser\AppData\Roaming\microsoft\UserSecrets -v %USERPROFILE%\.aspnet\https:C:\Users\ContainerUser\AppData\Roaming\ASP.NET\Https aspnetapp |
||||
``` |
||||
|
||||
#### Viewing Site, with Windows Containers |
||||
|
||||
After the application starts, navigate to `http://localhost:8000` in your web browser. On Windows, you may need to navigate to the container via IP address. See [ASP.NET Core apps in Windows Containers](aspnetcore-docker-windows.md) for instructions on determining the IP address, using the value of `--name` that you used in `docker run`. |
Some files were not shown because too many files have changed in this diff Show More
Loading…
Reference in new issue