diff --git a/.github/SUPPORT.md b/.github/SUPPORT.md
index 23e735c05d..b1e9038a3a 100644
--- a/.github/SUPPORT.md
+++ b/.github/SUPPORT.md
@@ -1,3 +1,3 @@
## Need Help?
-If you have any questions please start with [Stack Overflow](https://stackoverflow.com/questions/tagged/botframework) where we're happy to help. Please use this GitHub Repos issue tracking capability to raise [issues](https://github.com/Microsoft/AI/issues/new?assignees=&labels=Type%3A+Bug&template=bug_report.md&title=) or [feature requests](https://github.com/Microsoft/AI/issues/new?assignees=&labels=Type%3A+Suggestion&template=feature_request.md&title=).
\ No newline at end of file
+If you have any questions please start with [Stack Overflow](https://stackoverflow.com/questions/tagged/botframework) where we're happy to help. Please use this GitHub Repos issue tracking capability to raise [issues](https://github.com/microsoft/botframework-solutions/issues/new?assignees=&labels=Needs+Triage%2C+Type%3A+Bug&template=bug_report.md&title=) or [feature requests](https://github.com/microsoft/botframework-solutions/issues/new?assignees=&labels=Needs+Triage&template=feature_request.md&title=).
\ No newline at end of file
diff --git a/.gitignore b/.gitignore
index e3edd6f97e..37dd258f48 100644
--- a/.gitignore
+++ b/.gitignore
@@ -262,7 +262,7 @@ FakesAssemblies/
.ntvs_analysis.dat
/solutions/**/node_modules/
/templates/**/node_modules/
-/lib/**/node_modules/
+/sdk/**/node_modules/
/tools/**/node_modules/
/skills/**/node_modules/
/samples/**/node_modules/
@@ -359,6 +359,8 @@ ASALocalRun/
**/remove_skill_log.txt
**/publish_log.txt
**/.deployment
+**/ComposerDialogs/generated
+**/ComposerDialogs/settings
# Zip files
*.7z
diff --git a/build/build.botbuilder-libs.ts.ps1 b/build/build.botbuilder-libs.ts.ps1
index 194af4d179..19795845b4 100644
--- a/build/build.botbuilder-libs.ts.ps1
+++ b/build/build.botbuilder-libs.ts.ps1
@@ -3,7 +3,7 @@ Param(
)
if (-not $version) {
- Write-Host "Version for botbuilder-libs required!. Please use the param -version" -ForegroundColor DarkRed
+ Write-Host "Version for bot-libs required!. Please use the param -version" -ForegroundColor DarkRed
}
pushd sdk\typescript\libraries
@@ -12,14 +12,7 @@ node .\common\scripts\install-run-rush.js install --no-link
node .\common\scripts\install-run-rush.js link
-pushd .\botbuilder-solutions
-
-npm version $($version) --allow-same-version
-npm run build
-
-popd
-
-pushd .\botbuilder-skills
+pushd .\bot-solutions
npm version $($version) --allow-same-version
npm run build
@@ -35,7 +28,6 @@ if (-not(test-path ".\outputpackages"))
pushd .\outputpackages
-npm pack ..\sdk\typescript\libraries\botbuilder-solutions
-npm pack ..\sdk\typescript\libraries\botbuilder-skills
+npm pack ..\sdk\typescript\libraries\bot-solutions
popd
diff --git a/build/build.generator-assistant.ts.ps1 b/build/build.generator-assistant.ts.ps1
index 5b4e0903e4..d846a58a95 100644
--- a/build/build.generator-assistant.ts.ps1
+++ b/build/build.generator-assistant.ts.ps1
@@ -3,10 +3,10 @@ Param(
)
if (-not $version) {
- Write-Host "Version for generator-botbuilder-assistant required!. Please use the param -version" -ForegroundColor DarkRed
+ Write-Host "Version for generator-bot-virtualassistant required!. Please use the param -version" -ForegroundColor DarkRed
}
-pushd templates/typescript/generator-botbuilder-assistant
+pushd templates/typescript/generator-bot-virtualassistant
npm install
npm version $($version) --allow-same-version
@@ -21,6 +21,6 @@ if (-not(test-path ".\outputpackages"))
pushd .\outputpackages
-npm pack ..\templates\typescript\generator-botbuilder-assistant
+npm pack ..\templates\typescript\generator-bot-virtualassistant
popd
diff --git a/build/yaml/typescript/bot-solutions.yml b/build/yaml/typescript/bot-solutions.yml
new file mode 100644
index 0000000000..b8009829aa
--- /dev/null
+++ b/build/yaml/typescript/bot-solutions.yml
@@ -0,0 +1,58 @@
+# specific branch build
+trigger:
+ branches:
+ include:
+ - master
+ - feature/*
+
+ paths:
+ include:
+ - 'sdk/typescript/libraries/bot-solutions/*'
+
+# By default will disable PR builds
+pr: none
+
+pool:
+ vmImage: 'vs2017-win2016'
+steps:
+- task: NodeTool@0
+ displayName: 'Use Node 10.'
+ inputs:
+ versionSpec: 10.x
+
+- task: Npm@1
+ displayName: 'npm install'
+ inputs:
+ workingDir: 'sdk/typescript/libraries/bot-solutions'
+ verbose: false
+
+- task: Npm@1
+ displayName: 'npm run build'
+ inputs:
+ command: custom
+ workingDir: 'sdk/typescript/libraries/bot-solutions'
+ verbose: false
+ customCommand: 'run build'
+
+- task: Npm@1
+ displayName: 'npm test - coverage'
+ inputs:
+ command: custom
+ workingDir: 'sdk/typescript/libraries/bot-solutions'
+ verbose: false
+ customCommand: 'run test-coverage-ci'
+
+- task: PublishTestResults@2
+ displayName: 'Publish Test Results '
+ inputs:
+ testResultsFiles: 'test-results.xml'
+ searchFolder: 'sdk/typescript/libraries/bot-solutions'
+ failTaskOnFailedTests: true
+
+- task: PublishCodeCoverageResults@1
+ displayName: 'Publish code coverage '
+ condition: succeededOrFailed()
+ inputs:
+ codeCoverageTool: Cobertura
+ summaryFileLocation: 'sdk/typescript/libraries/bot-solutions/coverage/cobertura-coverage.xml'
+ reportDirectory: 'sdk/typescript/libraries/bot-solutions/coverage/'
diff --git a/build/yaml/typescript/botbuilder-skills.yml b/build/yaml/typescript/botbuilder-skills.yml
deleted file mode 100644
index f1135fd050..0000000000
--- a/build/yaml/typescript/botbuilder-skills.yml
+++ /dev/null
@@ -1,54 +0,0 @@
-# specific branch build
-trigger:
- branches:
- include:
- - master
- - feature/*
-
- paths:
- include:
- - 'sdk/typescript/libraries/botbuilder-skills/*'
-
-# By default will disable PR builds
-pr: none
-
-pool:
- vmImage: 'vs2017-win2016'
-steps:
-- task: NodeTool@0
- displayName: 'Use Node 10.'
- inputs:
- versionSpec: 10.x
-
-- pwsh: 'node ./common/scripts/install-run-rush.js install --no-link'
- workingDirectory: sdk/typescript/libraries
- displayName: 'rush install'
-
-- pwsh: 'node ./common/scripts/install-run-rush.js link'
- workingDirectory: sdk/typescript/libraries
- displayName: 'rush link'
-
-- pwsh: 'node ./common/scripts/install-run-rush.js build'
- workingDirectory: sdk/typescript/libraries
- displayName: 'rush build'
-
-- pwsh: 'npm run test-coverage-ci'
- errorActionPreference: continue
- ignoreLASTEXITCODE: 'true'
- workingDirectory: sdk/typescript/libraries/botbuilder-skills
- displayName: 'npm test coverage'
-
-- task: PublishTestResults@2
- displayName: 'publish test results'
- inputs:
- testResultsFiles: 'test-results.xml'
- searchFolder: 'sdk/typescript/libraries/botbuilder-skills'
- failTaskOnFailedTests: true
-
-- task: PublishCodeCoverageResults@1
- displayName: 'Publish code coverage'
- condition: succeededOrFailed()
- inputs:
- codeCoverageTool: Cobertura
- summaryFileLocation: 'sdk/typescript/libraries/botbuilder-skills/coverage/cobertura-coverage.xml'
- reportDirectory: 'sdk/typescript/libraries/botbuilder-skills/coverage/'
diff --git a/build/yaml/typescript/botbuilder-solutions.yml b/build/yaml/typescript/botbuilder-solutions.yml
deleted file mode 100644
index 8a06ed28c3..0000000000
--- a/build/yaml/typescript/botbuilder-solutions.yml
+++ /dev/null
@@ -1,55 +0,0 @@
-# specific branch build
-trigger:
- branches:
- include:
- - master
- - feature/*
-
- paths:
- include:
- - 'sdk/typescript/libraries/botbuilder-solutions/*'
-
-# By default will disable PR builds
-pr: none
-
-pool:
- vmImage: 'vs2017-win2016'
-steps:
-- task: NodeTool@0
- displayName: 'Use Node 10.'
- inputs:
- versionSpec: 10.x
-
-- pwsh: 'node ./common/scripts/install-run-rush.js install --no-link'
- workingDirectory: sdk/typescript/libraries
- displayName: 'rush install'
-
-- pwsh: 'node ./common/scripts/install-run-rush.js link'
- workingDirectory: sdk/typescript/libraries
- displayName: 'rush link'
-
-- pwsh: 'node ./common/scripts/install-run-rush.js build'
- workingDirectory: sdk/typescript/libraries
- displayName: 'rush build'
-
-- pwsh: 'npm run test-coverage-ci'
- errorActionPreference: continue
- ignoreLASTEXITCODE: 'true'
- workingDirectory: sdk/typescript/libraries/botbuilder-solutions
- displayName: 'npm test coverage'
-
-- task: PublishTestResults@2
- displayName: 'Publish Test Results '
- inputs:
- testResultsFiles: 'test-results.xml'
- searchFolder: 'sdk/typescript/libraries/botbuilder-solutions'
- failTaskOnFailedTests: true
-
-- task: PublishCodeCoverageResults@1
- displayName: 'Publish code coverage '
- condition: succeededOrFailed()
- inputs:
- codeCoverageTool: Cobertura
- summaryFileLocation: 'sdk/typescript/libraries/botbuilder-solutions/coverage/cobertura-coverage.xml'
- reportDirectory: 'sdk/typescript/libraries/botbuilder-solutions/coverage/'
-
diff --git a/build/yaml/typescript/generator-bot-virtualassistant.yml b/build/yaml/typescript/generator-bot-virtualassistant.yml
new file mode 100644
index 0000000000..728cf87b33
--- /dev/null
+++ b/build/yaml/typescript/generator-bot-virtualassistant.yml
@@ -0,0 +1,49 @@
+# specific branch build
+trigger:
+ branches:
+ include:
+ - master
+ - feature/*
+
+ paths:
+ include:
+ - 'templates/typescript/generator-bot-virtualassistant/*'
+
+# By default will disable PR builds
+pr: none
+
+pool:
+ name: Hosted VS2017
+steps:
+- task: NodeTool@0
+ displayName: 'Use Node 10.8.0'
+ inputs:
+ versionSpec: 10.8.0
+
+- task: Npm@1
+ displayName: 'npm install'
+ inputs:
+ workingDir: 'templates/typescript/generator-bot-virtualassistant'
+ verbose: false
+
+- task: Npm@1
+ displayName: 'npm test - coverage'
+ inputs:
+ command: custom
+ workingDir: 'templates/typescript/generator-bot-virtualassistant'
+ verbose: false
+ customCommand: 'run test-coverage-ci'
+
+- task: PublishTestResults@2
+ displayName: 'publish test results'
+ inputs:
+ testResultsFiles: 'test-results.xml'
+ searchFolder: 'templates/typescript/generator-bot-virtualassistant'
+ failTaskOnFailedTests: true
+
+- task: PublishCodeCoverageResults@1
+ displayName: 'publish code coverage'
+ inputs:
+ codeCoverageTool: Cobertura
+ summaryFileLocation: 'templates/typescript/generator-bot-virtualassistant/coverage/cobertura-coverage.xml'
+ reportDirectory: 'templates/typescript/generator-bot-virtualassistant/coverage/'
\ No newline at end of file
diff --git a/build/yaml/typescript/generator-botbuilder-assistant.yml b/build/yaml/typescript/generator-botbuilder-assistant.yml
deleted file mode 100644
index 0d33d48b15..0000000000
--- a/build/yaml/typescript/generator-botbuilder-assistant.yml
+++ /dev/null
@@ -1,49 +0,0 @@
-# specific branch build
-trigger:
- branches:
- include:
- - master
- - feature/*
-
- paths:
- include:
- - 'templates/typescript/generator-botbuilder-assistant/*'
-
-# By default will disable PR builds
-pr: none
-
-pool:
- name: Hosted VS2017
-steps:
-- task: NodeTool@0
- displayName: 'Use Node 10.8.0'
- inputs:
- versionSpec: 10.8.0
-
-- task: Npm@1
- displayName: 'npm install'
- inputs:
- workingDir: 'templates/typescript/generator-botbuilder-assistant'
- verbose: false
-
-- task: Npm@1
- displayName: 'npm test - coverage'
- inputs:
- command: custom
- workingDir: 'templates/typescript/generator-botbuilder-assistant'
- verbose: false
- customCommand: 'run test-coverage-ci'
-
-- task: PublishTestResults@2
- displayName: 'publish test results'
- inputs:
- testResultsFiles: 'test-results.xml'
- searchFolder: 'templates/typescript/generator-botbuilder-assistant'
- failTaskOnFailedTests: true
-
-- task: PublishCodeCoverageResults@1
- displayName: 'publish code coverage'
- inputs:
- codeCoverageTool: Cobertura
- summaryFileLocation: 'templates/typescript/generator-botbuilder-assistant/coverage/cobertura-coverage.xml'
- reportDirectory: 'templates/typescript/generator-botbuilder-assistant/coverage/'
\ No newline at end of file
diff --git a/docs/_data/button.yml b/docs/_data/button.yml
new file mode 100644
index 0000000000..496c8afa30
--- /dev/null
+++ b/docs/_data/button.yml
@@ -0,0 +1,261 @@
+# Programming Languages
+cs_img: &cs_img 'assets/images/icons/csharp.png'
+cs_alt: &cs_alt C# icon
+ts_img: &ts_img 'assets/images/icons/typescript.png'
+ts_alt: &ts_alt TypeScript icon
+java_img: &java_img 'assets/images/icons/java.png'
+java_alt: &java_alt Java icon
+# Channels
+android_img: &android_img 'assets/images/icons/android.png'
+android_alt: &android_alt Android icon
+msteams_img: &msteams_img 'assets/images/icons/teams.png'
+msteams_alt: &msteams_alt Microsoft Teams icon
+speech_img: &speech_img 'assets/images/icons/speech.png'
+speech_alt: &speech_alt Speech icon
+# Skills
+skill_img: &skill_img 'assets/images/icons/skill.png'
+skill_alt: &skill_alt Skill icon
+calendar_img: &calendar_img 'assets/images/icons/calendar-skill.png'
+calendar_alt: &calendar_alt Calendar icon
+email_img: &email_img 'assets/images/icons/email-skill.png'
+email_alt: &email_alt Email icon
+todo_img: &todo_img 'assets/images/icons/todo-skill.png'
+todo_alt: &todo_alt To Do icon
+poi_img: &poi_img 'assets/images/icons/point-of-interest-skill.png'
+poi_alt: &poi_alt Point of Interest icon
+# Others
+notification_img: ¬ification_img 'assets/images/icons/notification.png'
+notification_alt: ¬ification_alt 'Notifications icon'
+
+# Create VA
+create_va:
+ title: &create_va_title Create a Virtual Assistant
+ text: &create_va_text Get up and running with the solution accelerator.
+ button: &create_va_button Get started
+create_va_cs:
+ title: *create_va_title
+ text: *create_va_text
+ button: *create_va_button
+ ref: 'virtual-assistant/tutorials/create-assistant/csharp/1-intro/'
+ img: *cs_img
+ alt: *cs_alt
+create_va_ts:
+ title: *create_va_title
+ text: *create_va_text
+ button: *create_va_button
+ ref: 'virtual-assistant/tutorials/create-assistant/typescript/1-intro/'
+ img: *ts_img
+ alt: *ts_alt
+
+# Create skill
+create_skill:
+ title: &create_skill_title Create a Skill
+ text: &create_skill_text Build a custom skill to extend to your Virtual Assistant.
+ button: &create_skill_button Get started
+create_skill_cs:
+ title: *create_skill_title
+ text: *create_skill_text
+ button: *create_skill_button
+ ref: 'skills/tutorials/create-skill/csharp/1-intro/'
+ img: *cs_img
+ alt: *cs_alt
+create_skill_ts:
+ title: *create_skill_title
+ text: *create_skill_text
+ button: *create_skill_button
+ ref: 'skills/tutorials/create-skill/typescript/1-intro/'
+ img: *ts_img
+ alt: *ts_alt
+
+# Customize VA
+customize_va:
+ title: &customize_va_title Customize a Virtual Assistant
+ text: &customize_va_text Personalize the experience for your brand and users.
+ button: &customize_va_button Get started
+customize_va_cs:
+ title: *customize_va_title
+ text: *customize_va_text
+ button: *customize_va_button
+ ref: 'virtual-assistant/tutorials/customize-assistant/csharp/1-intro/'
+ img: *cs_img
+ alt: *cs_alt
+customize_va_ts:
+ title: *customize_va_title
+ text: *customize_va_text
+ button: *customize_va_button
+ ref: 'virtual-assistant/tutorials/customize-assistant/typescript/1-intro/'
+ img: *ts_img
+ alt: *ts_alt
+
+# Customize skill
+customize_skill:
+ title: &customize_skill_title Customize a Skill
+ text: &customize_skill_text Customize your skill for your brand and users.
+ button: &customize_skill_button Get started
+customize_skill_cs:
+ title: *customize_skill_title
+ text: *customize_skill_text
+ button: *customize_skill_button
+ ref: 'skills/tutorials/customize-skill/csharp/1-intro/'
+ img: *cs_img
+ alt: *cs_alt
+customize_skill_ts:
+ title: *customize_skill_title
+ text: *customize_skill_text
+ button: *customize_skill_button
+ ref: 'skills/tutorials/customize-skill/typescript/1-intro/'
+ img: *ts_img
+ alt: *ts_alt
+
+# Skills
+calendar_skill:
+ title: Calendar Skill
+ text: Get up and running with the Calendar Skill sample.
+ button: Learn more
+ ref: 'skills/samples/calendar/'
+ img: *calendar_img
+ alt: *calendar_alt
+email_skill:
+ title: Email Skill
+ text: Get up and running with the Email Skill sample.
+ button: Learn more
+ ref: 'skills/samples/email/'
+ img: *email_img
+ alt: *email_alt
+todo_skill:
+ title: To Do Skill
+ text: Get up and running with the To Do Skill sample.
+ button: Learn more
+ ref: 'skills/samples/to-do/'
+ img: *todo_img
+ alt: *todo_alt
+poi_skill:
+ title: Point of Interest Skill
+ text: Get up and running with the Point of Interest Skill sample.
+ button: Learn more
+ ref: 'skills/samples/point-of-interest/'
+ img: *poi_img
+ alt: *poi_alt
+
+# Add action
+add_action:
+ title: &add_action_title Add action support
+ text: &add_action_text Add action support to your Skill.
+ button: &add_action_button Get started
+add_action_cs:
+ title: *add_action_title
+ text: *add_action_text
+ button: *add_action_button
+ ref: 'skills/tutorials/add-action-support/csharp/1-intro/'
+ img: *skill_img
+ alt: *skill_alt
+
+# Proactive
+proactive:
+ title: Send a notification to your assistant
+ text: Enable the proactive notifications solution on your Virtual Assistant.
+ button: Get started
+ ref: 'solution-accelerators/tutorials/enable-proactive-notifications/1-intro/'
+ img: *notification_img
+ alt: *notification_alt
+
+# Enable channels
+enable_speech:
+ title: Enable Speech
+ text: Enable the Microsoft Speech Channel for your assistant.
+ button: Get started
+ ref: 'clients-and-channels/tutorials/enable-speech/1-intro/'
+ img: *speech_img
+ alt: *speech_alt
+enable_msteams:
+ title: Extend to Microsoft Teams
+ text: Enable the Microsoft Teams Channel for your assistant.
+ button: Get started
+ ref: 'clients-and-channels/tutorials/enable-teams/1-intro/'
+ img: *msteams_img
+ alt: *msteams_alt
+
+# Enable speech
+enable_speech_uwp:
+ title: Create a voice-first virtual assistant with the Speech SDK, UWP
+ text: Develop a C# Universal Windows Platform (UWP) application by using the Speech SDK.
+ button: Learn more
+ ref: 'https://docs.microsoft.com/en-us/azure/cognitive-services/speech-service/quickstart-virtual-assistant-csharp-uwp'
+ ext_ref: true
+ img: *cs_img
+ alt: *cs_alt
+enable_speech_java:
+ title: Create a voice-first virtual assistant with the Speech SDK, Java
+ text: Develop a Java console application by using the Cognitive Services Speech SDK.
+ button: Learn more
+ ref: 'https://docs.microsoft.com/en-us/azure/cognitive-services/speech-service/quickstart-virtual-assistant-java-jre'
+ ext_ref: true
+ img: *java_img
+ alt: *java_alt
+enable_speech_android_java:
+ title: Create a voice-first virtual assistant in Java on Android by using the Speech SDK
+ text: Build a voice-first virtual assistant with Java for Android using the Speech SDK.
+ button: Learn more
+ ref: 'https://docs.microsoft.com/en-us/azure/cognitive-services/speech-service/quickstart-virtual-assistant-java-android'
+ ext_ref: true
+ img: *android_img
+ alt: *android_alt
+enable_speech_android:
+ title: Virtual Assistant Client on Android
+ text: Connect your Direct Line Speech-enabled bot to a sample Android application.
+ button: Learn more
+ ref: 'https://docs.microsoft.com/en-us/microsoftteams/platform/get-started/get-started-app-studio'
+ ext_ref: true
+ img: *android_img
+ alt: *android_alt
+
+# Enable msteams
+enable_msteams_bot:
+ title: Test and debug your Microsoft Teams bot
+ text: When testing your bot you need to take into consideration both the context(s) you want your bot to run in, as well as any functionality you may have added to your bot that requires data specific to Microsoft Teams
+ button: Learn more
+ ref: 'https://docs.microsoft.com/en-us/microsoftteams/platform/concepts/bots/bots-test'
+ ext_ref: true
+ img: *msteams_img
+ alt: *msteams_alt
+enable_msteams_app_studio:
+ title: Quickly develop apps with App Studio for Microsoft Teams
+ text: App Studio makes it easy to start creating or integrating your own Microsoft Teams apps
+ button: Learn more
+ ref: 'https://docs.microsoft.com/en-us/microsoftteams/platform/get-started/get-started-app-studio'
+ ext_ref: true
+ img: *msteams_img
+ alt: *msteams_alt
+
+# CICD
+azure_pipelines:
+ title: What is Azure Pipelines?
+ text: Azure Pipelines is a cloud service that you can use to automatically build and test your code project and make it available to other users
+ button: Learn more
+ ref: 'https://docs.microsoft.com/en-us/azure/devops/pipelines/get-started/what-is-azure-pipelines?view=azure-devops'
+ ext_ref: true
+enable_cd:
+ title: Enable continuous deployment
+ text: Use release pipelines in Azure DevOps to continuously deliver your bot solution
+ button: Learn more
+ ref: 'solution-accelerators/tutorials/enable-continuous-deployment/1-intro/'
+release_pipelines:
+ title: What are release pipelines?
+ text: Release pipelines in Azure Pipelines help your team continuously deliver software to your customers at a faster pace and with lower risk
+ button: Learn more
+ ref: 'https://docs.microsoft.com/en-us/azure/devops/pipelines/release/?view=azure-devops'
+ ext_ref: true
+
+# Telemetry
+telemetry_add:
+ title: Add telemetry to your bot
+ text: Learn what specific code components are required that enable the out-of-the-box telemetry
+ button: Learn more
+ ref: 'https://docs.microsoft.com/en-us/azure/bot-service/bot-builder-telemetry?view=azure-bot-service-4.0'
+ ext_ref: true
+telemetry_event:
+ title: Events generated by the Bot Framework Service telemetry
+ text: Learn about events generated by the Bot Framwork Service telemetry
+ button: Learn more
+ ref: 'https://docs.microsoft.com/en-us/azure/bot-service/bot-builder-telemetry-reference?view=azure-bot-service-4.0'
+ ext_ref: true
diff --git a/docs/_data/displayNames.json b/docs/_data/displayNames.json
index 5015141901..e754b712a3 100644
--- a/docs/_data/displayNames.json
+++ b/docs/_data/displayNames.json
@@ -5,5 +5,6 @@
"web": "Using the web",
"0_7_release": "Beta Release 0.7",
"0_8_release": "Beta Release 0.8",
- "experimental_skills": "Experimental Skills"
+ "experimental_skills": "Experimental Skills",
+ "1_0_release": "Release 1.0 (GA)"
}
\ No newline at end of file
diff --git a/docs/_docs/clients-and-channels/clients/direct-line-web-client.md b/docs/_docs/clients-and-channels/clients/direct-line-web-client.md
new file mode 100644
index 0000000000..e286aceaaf
--- /dev/null
+++ b/docs/_docs/clients-and-channels/clients/direct-line-web-client.md
@@ -0,0 +1,101 @@
+---
+category: Clients and Channels
+subcategory: Clients
+title: Direct Line Web Client
+description: The **Direct Line Web Client** client lets you chat with any Virtual Assistant that has Direct Line or Direct Line Speech enabled from your browser.
+order: 3
+toc: true
+---
+
+# {{ page.title }}
+{:.no_toc}
+{{page.description}}
+
+## Prerequisites
+1. [Create a Virtual Assistant]({{site.baseurl}}/virtual-assistant/tutorials/create-assistant/csharp/1-intro) to setup your Virtual Assistant environment.
+
+1. Download the [**Direct Line Web Client** app source code](https://aka.ms/virtualassistantwebchat).
+
+## Configuring Your Client
+
+The configuration for the client can be located in the appsettings.json file within the root directory of the project. It contains the following notable settings:
+
+```json
+{
+ "BotName": "", // The name of the bot as it will be rendered on the web chat UI, e.g. 'My Virtual Assistant'.
+ "DirectLineSecret": "", // The secret that is used to acquire an authorization token for the Direct Line endpoint.
+ "EnableDirectLineEnhancedAuthentication": false, // Indicates whether Enhanced Authentication should be enabled when using the Direct Line channel to communicate with your bot.
+ "SpeechServiceRegionIdentifier": "", // The identifier of the region to which your Speech Service resource is deployed to within your Azure subscription, e.g. 'westus'.
+ "SpeechServiceSubscriptionKey": "" // The subscription key associated with your Speech Service resource to be used for acquiring access tokens.
+}
+```
+
+The configuration settings you will need to provide depends on which channel you wish to enable your client to integrate with:
+
+* To enable the client for **Direct Line**, you will need to specify values for **DirectLineSecret**.
+* To enable the client for **Direct Line Speech**, you will need to specify values for **SpeechServiceRegionIdentifier** and **SpeechServiceSubscriptionKey**.
+
+### Configure for Direct Line
+
+To enable your Virtual Assistant to communicate over Direct Line, open your Web App Bot resource in Azure Portal, and select the Channels tab.
+
+![Add Direct Line Channel]({{site.baseurl}}/assets/images/direct-line-web-client-add-direct-line-channel.png)
+
+Next, click the **Configure Direct Line channel** button. You will then be presented with the Direct Line channel configuration view.
+
+![Direct Line Channel Configuration]({{site.baseurl}}/assets/images/direct-line-web-client-channel-config.png)
+
+From here, you may either add a new site configuration, or repurpose the default site configuration. Here, we have repurposed the default site configuration and renamed it to 'Direct Line Web Client'.
+
+Once you have chosen your desired site configuration, click the **Show** button next to one of the text boxes underneath the **Secret keys** section, and copy the displayed value.
+
+Finally, return to your appsettings.json file in your Direct Line Web Client code, and paste the value into the **DirectLineSecret** setting.
+
+#### Enable Direct Line Enhanced Authentication
+
+By default, when a user is prompted to sign in using an OAuth prompt over a Direct Line channel, the user must send a six-digit code back to the Virtual Assistant afterwards to complete the process.
+
+To provide a more secure and seamless experience, you can optionally enable Enhanced Authentication for your Direct Line channel. This will enable automatically completing the sign-in process without needing to enter a separate code. You can learn more about Direct Line Enhanced Authentication [here](https://aka.ms/bfDirectLineEnhancedAuthenticationBlog).
+
+To enable Enhanced Authentication in your client, go to the Direct Line channel configuration for your Web App Bot resource in Azure Portal.
+
+![Enhanced Authentication Configuration]({{site.baseurl}}/assets/images/direct-line-web-client-enhanced-auth-config.png)
+
+From here, underneath the **Enhanced authentication options** section, click the Enabled toggle to turn it on.
+
+Once you have done this, you will need to register one or more trusted origins:
+
+* If you are running on your local environment, simply put in 'http://localhost/'. Note that the URI scheme must be HTTP.
+* To add a deployed Virtual Assistant, simply type in the base URI of your Virtual Assistant's messaging endpoint, as located in your Web App Bot resource's Settings tab, e.g. "https://myvirtualassistant.azurewebsites.net/".
+
+Finally, return to your appsettings.json file in your Direct Line Web Client code, and change the value of the **EnableDirectLineEnhancedAuthentication** setting to 'true'.
+
+### Configure for Direct Line Speech
+
+By [extending your Virtual Assistant to Direct Link Speech]({{site.baseurl}}/clients-and-channels/tutorials/enable-speech/1-intro/), it is very simple to enable voice control for your Virtual Assistant using the Direct Line Web Client.
+
+In order to enable voice control, first follow the instructions above to enable Direct Line Speech. Once you have done this, you will need to update your appsettings.json as follows:
+
+* **SpeachServiceRegionIdentifier** must be set to a corresponding identifier based on the Azure Region that your Speech Cognitive Service is deployed to, as described [here](https://aka.ms/bfRegionIdentifierMappings).
+* **SpeechServiceSubscriptionKey** must be set to one of the Speech Cognitive Service resource keys, which can be found on the Keys and Endpoint tab for the resource in Azure Portal, as shown below:
+
+![Speech Key]({{site.baseurl}}/assets/images/direct-line-web-client-speech-key.png)
+
+## Running Your Client
+
+Once you have successfully configured your Virtual Assistant and made the necessary updates to the Direct Line Web Client's appsettings.json, you are ready to run the client! Just simply build the DirectLine.Web project, set it to the startup project, and run. A new browser will automatically open with your configured client running.
+
+### Direct Line Mode
+
+To chat with your bot, simply type into the text box and hit enter or click the send button.
+
+![Direct Line Client UI]({{site.baseurl}}/assets/images/direct-line-web-client-ui.png)
+
+### Direct Line Speech Mode
+
+To chat with your bot, either:
+
+* Click the microphone icon and wait for the icon to turn red. When the text box displays 'Listening...', just speak into your microphone. Your Virtual Assistant will then reply back using audio and text. If it expects a response from the user, then you can speak directly back - as long as the microphone icon is red, it will detect speech input.
+* Alternatively, type directly into the text box and hit enter to send a message using text.
+
+![Direct Line Speech Client UI]({{site.baseurl}}/assets/images/direct-line-web-client-speech-ui.png)
diff --git a/docs/_docs/clients-and-channels/clients/virtual-assistant-client.md b/docs/_docs/clients-and-channels/clients/virtual-assistant-client.md
index dad8ee2f66..d80c5555e9 100644
--- a/docs/_docs/clients-and-channels/clients/virtual-assistant-client.md
+++ b/docs/_docs/clients-and-channels/clients/virtual-assistant-client.md
@@ -35,23 +35,24 @@ There are two configuration files used to provide your environment settings.
{:.no_toc}
```json
{
- "service_key": "SPEECH_SERVICE_SUBSCRIPTION_KEY", // Replace with your Speech Service subscription key
- "service_region": "westus2",
- "bot_id": "DIRECT_LINE_SPEECH_SECRET_KEY", // Replace with your Direct Line Speech secret
- "custom_commands_app_id": "", // Optional, if you are connecting to a Custom Commands application
- "custom_voice_deployment_ids": "", // Optional, to point to custom voices
- "custom_speech_recognition_endpoint_id": "", // Optional, to point to a customized speech recognition endpoint
- "barge_in_supported": false, // Whether or not to listen to keyword while TTS is playing. If true, TTS playback stops once Keyword is verified.
- "user_id": "android",
- "user_name": "Android",
- "locale": "en-us",
- "keyword": "computer",
- "enableKWS": false, // Keyword spotting
- "linkedAccountEndpoint": "" // Optional if you enabled the Linked Accounts solution in the prerequisites
+ "SpeechSubscriptionKey": "SPEECH_SERVICE_SUBSCRIPTION_KEY", // Replace with your Speech Service subscription key
+ "SpeechRegion": "westus2",
+ "BotId": "DIRECT_LINE_SPEECH_SECRET_KEY", // Replace with your Direct Line Speech secret
+ "CustomCommandsAppId": "", // Optional, if you are connecting to a Custom Commands application
+ "CustomVoiceDeploymentIds": "", // Optional, to point to custom voices
+ "CustomSREndpointId": "", // Optional, to point to a customized speech recognition endpoint
+ "TTSBargeInSupported": false, // Whether or not to listen to keyword while TTS is playing. If true, TTS playback stops once Keyword is verified.
+ "SpeechSDKLogEnabled": false, // Optional, whether to log Direct Line Speech activites. The default file path is on the device internal storage at Android/data/com.microsoft.bot.builder.solutions.virtualassistant/files/SpeechSDK.log
+ "UserId": "android",
+ "UserName": "Android",
+ "SRLanguage": "en-us",
+ "Keyword": "computer",
+ "EnableKWS": false, // Keyword spotting
+ "LinkedAccountEndpoint": "" // Optional if you enabled the Linked Accounts solution in the prerequisites
}
```
-The **user_id** is a unique identifier for all messages generated by the user, this can be combined with [Linked Accounts sample]({{site.baseurl}}/solution-accelerators/samples/linked-accounts/).
+The **UserId** is a unique identifier for all messages generated by the user, this can be combined with [Linked Accounts sample]({{site.baseurl}}/solution-accelerators/samples/linked-accounts/).
#### [App configuration]({{site.repo}}/blob/master/samples/android/clients/VirtualAssistantClient/app/src/main/assets/default_app_configuration.json)
{:.no_toc}
diff --git a/docs/_docs/clients-and-channels/tutorials/enable-speech/6-next-steps.md b/docs/_docs/clients-and-channels/tutorials/enable-speech/6-next-steps.md
index 6a43ad4c90..2d06950602 100644
--- a/docs/_docs/clients-and-channels/tutorials/enable-speech/6-next-steps.md
+++ b/docs/_docs/clients-and-channels/tutorials/enable-speech/6-next-steps.md
@@ -13,47 +13,11 @@ order: 6
This tutorial is based on sample applications provided by the Cognitive Services Speech SDK, learn more.
-
-
+ {% include button.html params=site.data.button.enable_speech_android_java %}
+ {% include button.html params=site.data.button.enable_speech_android %}
\ No newline at end of file
diff --git a/docs/_docs/clients-and-channels/tutorials/enable-teams/7-next-steps.md b/docs/_docs/clients-and-channels/tutorials/enable-teams/7-next-steps.md
index 8b6ca7447c..103abca3eb 100644
--- a/docs/_docs/clients-and-channels/tutorials/enable-teams/7-next-steps.md
+++ b/docs/_docs/clients-and-channels/tutorials/enable-teams/7-next-steps.md
@@ -13,24 +13,6 @@ order: 7
Learn more from additional documentation provided by Microsoft Teams.
-
-
+ {% include button.html params=site.data.button.enable_msteams_bot %}
+ {% include button.html params=site.data.button.enable_msteams_app_studio %}
\ No newline at end of file
diff --git a/docs/_docs/help/faq.md b/docs/_docs/help/faq.md
index 8af0de221c..48f22408f1 100644
--- a/docs/_docs/help/faq.md
+++ b/docs/_docs/help/faq.md
@@ -113,11 +113,11 @@ A Skill needs to be able to authenticate the request from a Virtual Assistant, [
### How do I enable Bot Framework Skills on an existing v4 Bot?
{:.no_toc}
-Learn how to [enable Bot Framework Skill support on an existing v4 Bot](https://docs.microsoft.com/en-us/azure/bot-service/skill-implement-consumer?view=azure-bot-service-4.0&tabs=cs).
+Learn how to [Migrate existing Virtual Assistant to Bot Framework Skills GA]({{site.baseurl}}/overview/whats-new/0.8-beta/migrate-existing-va-to-0.8/).
### How do I convert an existing v4 Bot to a Bot Framework Skill?
{:.no_toc}
-Learn how to [convert an existing v4 Bot to a Bot Framework Skill](https://docs.microsoft.com/en-us/azure/bot-service/skill-implement-skill?view=azure-bot-service-4.0&tabs=cs).
+Learn how to [Migrate existing Skills to Bot Framework Skills GA]({{site.baseurl}}/overview/whats-new/0.8-beta/migrate-existing-skills-to-0.8/).
## Analytics
@@ -151,4 +151,4 @@ Learn how to [configure your Virtual Assistant with the Virtual Assistant Androi
### How do I use the Hospitality Assistant sample?
{:.no_toc}
-The [Hospitality Aassistant sample](https://aka.ms/hospitalityassistantdocs) is a prototype of a Virtual Assistant solution that helps to conceptualize and demonstrate how an assistant could be used in a hospitality-focused scenario. It also provides a starting point for those interested in creating an assistant customized for this scenario.
+The [Hospitality Aassistant sample](https://aka.ms/hospitalityassistantdocs) is a prototype of a Virtual Assistant solution that helps to conceptualize and demonstrate how an assistant could be used in a hospitality-focused scenario. It also provides a starting point for those interested in creating an assistant customized for this scenario.
\ No newline at end of file
diff --git a/docs/_docs/overview/skills.md b/docs/_docs/overview/skills.md
index c350afd71f..a3fe06e40f 100644
--- a/docs/_docs/overview/skills.md
+++ b/docs/_docs/overview/skills.md
@@ -21,49 +21,13 @@ Apart from some minor differences that enable this special invocation pattern, a
The following Skill samples are available out of the box, each with deployment steps required to deploy and configure Skills for your use.
-
-
+ {% include button.html params=site.data.button.create_skill_cs %}
+ {% include button.html params=site.data.button.create_skill_ts %}
diff --git a/docs/_docs/overview/virtual-assistant-solution.md b/docs/_docs/overview/virtual-assistant-solution.md
index fcae47b140..576000473e 100644
--- a/docs/_docs/overview/virtual-assistant-solution.md
+++ b/docs/_docs/overview/virtual-assistant-solution.md
@@ -96,24 +96,6 @@ Sample client applications are implementations of clients that will integrate se
{:.toc}
-
-
+ {% include button.html params=site.data.button.create_va_cs %}
+ {% include button.html params=site.data.button.create_va_ts %}
diff --git a/docs/_docs/overview/whats-new/0.8-beta/migrate-existing-skills-to-0.8.md b/docs/_docs/overview/whats-new/0.8-beta/migrate-existing-skills-to-0.8.md
index 7d129660b5..3c88520f5c 100644
--- a/docs/_docs/overview/whats-new/0.8-beta/migrate-existing-skills-to-0.8.md
+++ b/docs/_docs/overview/whats-new/0.8-beta/migrate-existing-skills-to-0.8.md
@@ -76,7 +76,9 @@ One migration step will be to create a new Skill project and migrate your custom
"botframework-connector": "^4.8.0",
```
-1. Remove `botbuilder-skills` library from the package.json, which will require to change all the references to `botbuilder-solutions`.
+1. Remove `botbuilder-skills` library from the package.json, which will require to change all the references to `bot-solutions`.
+
+**Note:** Take into account that `botbuilder-solutions` will be deprecated and it should be `bot-solutions@1.0.0` instead following the C# pattern.
## BotController changes
@@ -276,6 +278,32 @@ One migration step will be to create a new Skill project and migrate your custom
The existing `MultiProviderAuthDialog` if used will automatically adapt to this change and no changes are required. As required you can switch to using the `OAuthPrompt` directly.
+
+## LocaleTemplateManager
+
+The class `LocaleTemplateEngineManager` has been remamed to `LocaleTemplateManager` and its constructor has been slightly modified.
+
+1. Make sure rename the instances of `localeTemplateEngineManager` to `localeTemplateManager`.
+
+1. In `index.ts`, update the incialization of `LocaleTemplateManager` with the localized responses to this:
+
+ ```typescript
+ // Configure localized responses
+ const localizedTemplates: Map = new Map();
+ const templateFile = 'AllResponses';
+ const supportedLocales: string[] = ['en-us', 'de-de', 'es-es', 'fr-fr', 'it-it', 'zh-cn'];
+
+ supportedLocales.forEach((locale: string) => {
+ // LG template for en-us does not include locale in file extension.
+ const localTemplateFile = locale === 'en-us'
+ ? join(__dirname, 'responses', `${ templateFile }.lg`)
+ : join(__dirname, 'responses', `${ templateFile }.${ locale }.lg`);
+ localizedTemplates.set(locale, localTemplateFile);
+ });
+
+ const localeTemplateManager: LocaleTemplateManager = new LocaleTemplateManager(localizedTemplates, botSettings.defaultLocale || 'en-us');
+ ```
+
## Manifest Changes
The provided `manifestTemplate.json` schema type has been retired, therefore these steps will create a new Manifest supporting the new schema.
@@ -346,4 +374,4 @@ The provided `manifestTemplate.json` schema type has been retired, therefore the
1. Update your `botskills` CLI tool to ensure it supports the new Manifest schema: `npm install -g botskills`
-Once complete you have transitioned your exiting Skill to support the new Generally Available Bot Framework Skills capability.
\ No newline at end of file
+Once complete you have transitioned your exiting Skill to support the new Generally Available Bot Framework Skills capability.
diff --git a/docs/_docs/overview/whats-new/0.8-beta/migrate-existing-va-to-0.8.md b/docs/_docs/overview/whats-new/0.8-beta/migrate-existing-va-to-0.8.md
index 811cfa10e1..f1ea9c636c 100644
--- a/docs/_docs/overview/whats-new/0.8-beta/migrate-existing-va-to-0.8.md
+++ b/docs/_docs/overview/whats-new/0.8-beta/migrate-existing-va-to-0.8.md
@@ -93,7 +93,9 @@ The Virtual Assistant you are migrating from has to be created with the Virtual
"botframework-connector": "^4.8.0"
```
-1. Remove `botbuilder-skills` library from the package.json, which will require to change all the references to `botbuilder-solutions`.
+1. Remove `botbuilder-skills` library from the package.json, which will require to change all the references to `bot-solutions`.
+
+**Note:** Take into account that `botbuilder-solutions` will be deprecated and it should be `bot-solutions@1.0.0` instead following the C# pattern.
1. Within `adapters/defaultAdapter.ts`, add SetSpeakMiddleware into the middleware list of the adapter ensuring Speech scenarios work as expected out of the box.
@@ -245,7 +247,7 @@ The Virtual Assistant you are migrating from has to be created with the Virtual
ActivityTypes,
BotState } from 'botbuilder';
import { Dialog, DialogContext, DialogSet, DialogState } from 'botbuilder-dialogs';
- import { DialogEx, LocaleTemplateEngineManager, TokenEvents } from 'botbuilder-solutions';
+ import { DialogEx, LocaleTemplateManager, TokenEvents } from 'bot-solutions';
export class DefaultActivityHandler extends TeamsActivityHandler {
private readonly conversationState: BotState;
@@ -255,12 +257,12 @@ The Virtual Assistant you are migrating from has to be created with the Virtual
private readonly dialog: Dialog;
private dialogStateAccessor: StatePropertyAccessor;
private userProfileState: StatePropertyAccessor;
- private templateEngine: LocaleTemplateEngineManager;
+ private templateEngine: LocaleTemplateManager;
public constructor(
conversationState: ConversationState,
userState: UserState,
- templateEngine: LocaleTemplateEngineManager,
+ templateEngine: LocaleTemplateManager,
dialog: T) {
super();
this.dialog = dialog;
@@ -391,7 +393,7 @@ The Virtual Assistant you are migrating from has to be created with the Virtual
1. Within the `index.ts` file, you have to import the following classes/interfaces:
- `SimpleCredentialProvider` and `AuthenticationConfiguration` classes from `botframework-connector`
- `ChannelServiceRoutes`, `SkillHandler` classes from `botbuilder`
- - `SkillConversationIdFactory` from `botbuilder-solutions`
+ - `SkillConversationIdFactory` from `bot-solutions`
Besides, add the following lines into the plugins list in the `index` file.
@@ -468,7 +470,7 @@ Finally, add the endpoints to handle the response messages from a Skill.
```typescript
import { Claim, JwtTokenValidation, SkillValidation } from 'botframework-connector';
- import { SkillsConfiguration } from 'botbuilder-solutions';
+ import { SkillsConfiguration } from 'bot-solutions';
/**
* Sample claims validator that loads an allowed list from configuration if present and checks that responses are coming from configured skills.
@@ -667,6 +669,26 @@ Please also refer to the documentation to [Migrate existing skills to the new Sk
}
}
```
+1. The class `LocaleTemplateEngineManager` has been remamed to `LocaleTemplateManager` and its constructor has been slightly modified. Make sure to rename the instances of `localeTemplateEngineManager` to `localeTemplateManager`.
+
+ In `index.ts`, update the incialization of `LocaleTemplateManager` with the localized responses to this:
+
+ ```typescript
+ // Configure localized responses
+ const localizedTemplates: Map = new Map();
+ const templateFile = 'AllResponses';
+ const supportedLocales: string[] = ['en-us', 'de-de', 'es-es', 'fr-fr', 'it-it', 'zh-cn'];
+
+ supportedLocales.forEach((locale: string) => {
+ // LG template for en-us does not include locale in file extension.
+ const localTemplateFile = locale === 'en-us'
+ ? join(__dirname, 'responses', `${ templateFile }.lg`)
+ : join(__dirname, 'responses', `${ templateFile }.${ locale }.lg`);
+ localizedTemplates.set(locale, localTemplateFile);
+ });
+
+ const localeTemplateManager: LocaleTemplateManager = new LocaleTemplateManager(localizedTemplates, botSettings.defaultLocale || 'en-us');
+ ```
1. If you have already added skills to your assistant these are stored in `skills.json`. The new Skills configuration section has been simplified and is stored as part of `appSettings.json`. Create a new section as shown below in appSettings.json and update with the configured skills.
@@ -693,4 +715,4 @@ Please also refer to the documentation to [Migrate existing skills to the new Sk
Please also refer to the documentation to [Migrate existing skills to the new Skill capability.](https://microsoft.github.io/botframework-solutions/overview/whats-new/0.8-beta/migrate-existing-skills-to-0.8/)
-Once complete you have transitioned your exiting Virtual Assistant to support the new Generally Available Bot Framework Skills capability.
+Once complete you have transitioned your exiting Virtual Assistant to support the new Generally Available Bot Framework Skills capability.
\ No newline at end of file
diff --git a/docs/_docs/overview/whats-new/1.0/Summary.md b/docs/_docs/overview/whats-new/1.0/Summary.md
new file mode 100644
index 0000000000..40ea4e9ba0
--- /dev/null
+++ b/docs/_docs/overview/whats-new/1.0/Summary.md
@@ -0,0 +1,36 @@
+---
+category: Overview
+subcategory: What's New
+language: 1_0_release
+title: Summary
+date: 2020-04-21
+order: 1
+toc: true
+---
+
+# Release 1.0 (GA)
+## {{ page.title }}
+
+This document describes the new features available in the **1.0 GA release** version of the Virtual Assistant across the following categories:
+- Virtual Assistant and Skills
+
+## Virtual Assistant and Skills
+### Current State of Feedback
+{:.no_toc}
+The Feedback Middleware approach has been deprecated since the 0.8 release of **Microsoft.Bot.Solutions**.
+With the 1.0 release we have implemented a temporary feedback mechanism which is outlined [here](https://aka.ms/bfFeedbackDoc). We will have an
+incremental release in the near future with a more robust feedback implementation that will be a part of the **Microsoft.Bot.Solutions** library.
+As of now the **Microsoft.Bot.Solutions** library still contains the middleware solution but it is marked as deprecated and it will not work as
+desired due to the waterfall flow of the VA since the 0.8 release.
+
+### Language Generation
+{:.no_toc}
+With the **1.0 GA release**, we are now utilizing Language Generation 4.8 Preview. As part of this, there are some breaking changes which may require you to update your .lg files to adhere to new syntax.
+
+For full details regarding these breaking changes, please refer to the [Language Generation 4.8 Preview breaking changes](https://github.com/microsoft/BotBuilder-Samples/tree/master/experimental/language-generation#48-preview).
+
+### Single Sign-On for Skills
+{:.no_toc}
+In the previous **0.8-beta release**, we added documentation covering how to enable single sign-on for Skills. In the **1.0 GA release**, these changes are officially included.
+
+For instructions on enabling single sign-on for Skills, refer to the instructions located here: [Enable SSO with Skils using OAuthCredentials setting]({{site.baseurl}}//overview/whats-new/1.0/enable-sso-with-skills-using-oauthcredentials-setting).
\ No newline at end of file
diff --git a/docs/_docs/overview/whats-new/1.0/enable-sso-with-skills-using-oauthcredentials-setting.md b/docs/_docs/overview/whats-new/1.0/enable-sso-with-skills-using-oauthcredentials-setting.md
new file mode 100644
index 0000000000..4177baa23b
--- /dev/null
+++ b/docs/_docs/overview/whats-new/1.0/enable-sso-with-skills-using-oauthcredentials-setting.md
@@ -0,0 +1,64 @@
+---
+category: Overview
+subcategory: What's New
+language: 1_0_release
+title: Enable SSO with Skills using OAuthCredentials setting
+date: 2020-03-31
+order: 2
+toc: true
+---
+
+# 1.0 Release
+## {{ page.title }}
+{:.no_toc}
+{{ page.description }}
+
+## Intro
+
+In the previous 0.8 release we added documentation covering how to [enable SSO for Skills](https://microsoft.github.io/botframework-solutions/overview/whats-new/0.8-beta/achieve-SSO-among-skills/). In the 1.0 release these changes are officially included.
+
+When a Virtual Assistant has multiple Skills added, in order to achieve SSO, one approach is for all Skills within your trust boundary to share the same OAuth connection settings from one central Bot Channel Registration, typically the parent Virtual Assistant.
+
+1. Add an oauth connection setting that includes all the necessary scopes that are needed for all the Skills
+ Go to Virtual Assistant's Azure portal Settings tab, and click `Add Setting` to add an OAuth connection
+ ![Add NuGet Package]({{site.baseurl}}/assets/images/add-nuget.png)
+
+1. Within each appropriate Skill (take [CalendarSkill](https://github.com/microsoft/botframework-skills/tree/master/skills/csharp/calendarskill) for example), ensure you add an `oauthCredentials` entry within appsettings.json
+
+ ```json
+ "oauthCredentials": {
+ "microsoftAppId": "(Virtual Assistant MsAppId)",
+ "microsoftAppPassword": "(Virtual Assistant MsAppPassword)"
+ },
+
+ ```
+
+1. In the same appsettings.json file, make sure the oauthConnections setting has the correct OAuth connection name
+
+ ```json
+ "oauthConnections": {
+ "name": "(Virtual Assistant's OAuth connection name)",
+ "provider": "(Virtual Assistant's OAuth connection provider)"
+ },
+
+ ```
+
+1. Within the code for a given Skill which is using `MultiProviderAuthDialog` class to perform authentication OAuth, be sure to use these new settings with this code
+
+ ```csharp
+
+ AppCredentials oauthCredentials = null;
+ if (Settings.OAuthCredentials != null &&
+ !string.IsNullOrWhiteSpace(Settings.OAuthCredentials.MicrosoftAppId) &&
+ !string.IsNullOrWhiteSpace(Settings.OAuthCredentials.MicrosoftAppPassword))
+ {
+ oauthCredentials = new MicrosoftAppCredentials(Settings.OAuthCredentials.MicrosoftAppId, Settings.OAuthCredentials.MicrosoftAppPassword);
+ }
+
+ AddDialog(new MultiProviderAuthDialog(Settings.OAuthConnections, null, oauthCredentials));
+
+ ```
+
+ Note that the Settings property is from BotSettings class which inherits from BotSettingsBase class from Microsoft.Bot.Solutions library. It will automatically pull in the oauthCredentials settings from appsettings.
+
+With these changes, Skills that use the same oauthCredentials and OAuth connection, users only have to login once and when users switch to use a different skill, the skill will be able to retrieve the OAuth token without prompting users again.
diff --git a/docs/_docs/overview/whats-new/1.0/migrate-existing-va-to-not-use-chitchat-in-dispatch.md b/docs/_docs/overview/whats-new/1.0/migrate-existing-va-to-not-use-chitchat-in-dispatch.md
new file mode 100644
index 0000000000..bccedc8913
--- /dev/null
+++ b/docs/_docs/overview/whats-new/1.0/migrate-existing-va-to-not-use-chitchat-in-dispatch.md
@@ -0,0 +1,124 @@
+---
+category: Overview
+subcategory: What's New
+language: 1_0_release
+date: 2020-05-11
+title: Migrate existing Virtual Assistant to not use Chitchat in Dispatch
+description: Explains the steps to migrate an existing VA to remove `Chitchat` from Dispatch
+order: 4
+toc: true
+---
+
+# {{ page.title }}
+{:.no_toc}
+{{ page.description }}
+
+# Remove Chitchat intent from Dispatch
+
+As part of the default deployment, the Virtual Assistant template creates two LUIS apps: one called `_Dispatch` and the other `_General`, along with 2 QnA Knowledge Bases (KBs) for replying to `Chitchat` and `Faq` requests. The `Chitchat` KB in particular can be large and is used to provide a [personality](https://github.com/Microsoft/BotBuilder-PersonalityChat) to the bot.
+
+The `Dispatch` LUIS App is used to determine if a user utterance has a `General`, `Skill` or `Chitchat` intent. Once the intent is recognized, the user utterance is routed to the specific `LUIS` or `QnA Kb` to fetch a more specific response for the user.
+
+This architecture works well if there are relatively similar numbers of training samples per intent (i.e. if the dataset is balanced). However, our `Chitchat` personality dataset tends to be very large relative to the other datasets. Once a dataset becomes imbalanced relative to the others, LUIS has a tendency to overfit the user utterance to that intent [^fn1].
+
+To combat the issue of overfitting on `Chitchat`, we have removed the `Chitchat` intent from the `Dispatch` Luis App and only route to the Chitchat KB in the event that there are no other matches. In v1.0, this is the default behavior.
+
+This guide shows you how to remove the `Chitchat` intent from the `Dispatch` app if you are migrating from an earlier version of the Virtual Assistant Template. In v1.0, this is the default behavior and nothing needs to be done.
+
+## Changes
+
+### C#
+
+1. In the `Dialogs` folder of your Virtual Assistant Project, add this new function to `MainDialog.cs`:
+ ```csharp
+ ///
+ /// A simple set of heuristics to govern if we should invoke the personality .
+ ///
+ /// Current dialog context.
+ /// Intent that Dispatch thinks should be invoked.
+ /// Confidence score for intent.
+ /// User provided threshold between 0.0 and 1.0, if above this threshold do NOT show chitchat.
+ /// A indicating if we should invoke the personality dialog.
+ private bool ShouldBeginChitChatDialog(WaterfallStepContext stepContext, DispatchLuis.Intent dispatchIntent, double dispatchScore, double threshold = 0.5)
+ {
+ if (threshold < 0.0 || threshold > 1.0)
+ {
+ throw new ArgumentOutOfRangeException(nameof(threshold));
+ }
+
+ if (dispatchIntent == DispatchLuis.Intent.None)
+ {
+ return true;
+ }
+
+ if (dispatchIntent == DispatchLuis.Intent.l_General)
+ {
+ // If dispatch classifies user query as general, we should check against the cached general Luis score instead.
+ var generalResult = stepContext.Context.TurnState.Get(StateProperties.GeneralResult);
+ if (generalResult != null)
+ {
+ (var _, var generalScore) = generalResult.TopIntent();
+ return generalScore < threshold;
+ }
+ }
+ else if (dispatchScore < threshold)
+ {
+ return true;
+ }
+
+ return false;
+ }
+ ```
+1. In the `RouteStepAsync` method in `MainDialog.cs`, look for the line that says:
+ ```csharp
+ if (dispatchIntent == DispatchLuis.Intent.q_Chitchat)
+ ```
+ and replace this with the newly added method:
+ ```csharp
+ if (ShouldBeginChitChatDialog(stepContext, dispatchIntent, dispatchScore))
+ ```
+1. `deploy-cognitive-models.ps1` and `update-cognitive-models.ps1` must be updated to prevent the ChitChat kb from being added to Dispatch. Look for sections that call the `dispatch add` tool with `--type "qna"`:
+ ```powershell
+ if ($dispatch) {
+ Write-Host "> Adding $($langCode) $($kb.id) kb to dispatch file ..." -NoNewline
+ dispatch add `
+ --type "qna" `
+ --name $kb.name `
+ --id $kb.kbId `
+ --key $kb.subscriptionKey `
+ --intentName "q_$($kb.id)" `
+ --dispatch $dispatchFile `
+ --dataFolder $(Join-Path $dispatchFolder $langCode) 2>> $logFile | Out-Null
+ Write-Host "Done." -ForegroundColor Green
+ }
+ ```
+ and change the conditions to prevent the Chitchat data from being added to dispatch e.g.:
+ ```powershell
+ if ($dispatch -and -not @("Chitchat").Contains($kb.id)) {
+ ...
+ }
+ ```
+1. Run `update-cognitive-models.ps1`. Log in to [luis.ai](https://luis.ai), and inspect your `Dispatch` app. The `Chitchat` intent should not be present. The file `services/DispatchLuis.cs` should also have been automatically updated when `update-cognitive-models.ps1` ran `bf luis:generate:cs` as one of the script steps.
+ ```powershell
+ if ($useLuisGen) {
+ # Update dispatch.cs file
+ Write-Host "> Running LuisGen for Dispatch app..." -NoNewline
+ bf luis:generate:cs `
+ --in $(Join-Path $dispatchFolder $langCode "$($dispatch.name).json") `
+ --className "DispatchLuis" `
+ --out $lgOutFolder `
+ --force 2>> $logFile | Out-Null
+ Write-Host "Done." -ForegroundColor Green
+ }
+ ```
+ This updates the `services/DispatchLuis.cs` `Intent` enum to not include `Chitchat` anymore.
+
+1. Please see Pull Request [#3291](https://github.com/microsoft/botframework-solutions/pull/3291) for more details
+
+
+### Typescript
+
+1. Please see Pull Request [3304](https://github.com/microsoft/botframework-solutions/pull/3304) for more details
+
+
+[^fn1]: [Training a Chatbot with Microsoft LUIS: Effect of Imbalance on Prediction Accuracy](https://dl.acm.org/doi/pdf/10.1145/3379336.3381494) E.Ruane, R.Young & A.Ventrisque. Mar 20, 2020
\ No newline at end of file
diff --git a/docs/_docs/skills/handbook/add-skills-to-a-virtual-assistant.md b/docs/_docs/skills/handbook/add-skills-to-a-virtual-assistant.md
index 39800e2790..62ff64b649 100644
--- a/docs/_docs/skills/handbook/add-skills-to-a-virtual-assistant.md
+++ b/docs/_docs/skills/handbook/add-skills-to-a-virtual-assistant.md
@@ -14,10 +14,10 @@ toc: true
## Prerequisites
- [Node.js](https://nodejs.org/) version 10.8 or higher
-- Install the Dispatch, LUDown and LUISGen CLI tools
+- Install the Dispatch and botframework-cli
```shell
- npm install -g botdispatch ludown luisgen
+ npm install -g botdispatch @microsoft/botframework-cli
```
## Adding Skills
diff --git a/docs/_docs/skills/handbook/botskills.md b/docs/_docs/skills/handbook/botskills.md
index c87465bf43..a15846e75b 100644
--- a/docs/_docs/skills/handbook/botskills.md
+++ b/docs/_docs/skills/handbook/botskills.md
@@ -21,10 +21,10 @@ The CLI performs the following operations on your behalf:
## Prerequisites
- [Node.js](https://nodejs.org/) version 10.8 or higher
-- Install the Dispatch, LUDown and LUISGen CLI tools
+- Install the Dispatch and botframework-cli
```shell
- npm install -g botdispatch ludown luisgen
+ npm install -g botdispatch @microsoft/botframework-cli
```
- Install the `botskills` CLI
```shell
@@ -32,7 +32,7 @@ The CLI performs the following operations on your behalf:
```
## Commands
-For all of this commands, the tool assumes that you are running the CLI within the **Virtual Assistant project directory** and have created your Bot through the template, and therefore have a `appsettings.json` file present in the working folder which contains the connected skills.
+For all of this commands, the tool assumes that you are running the CLI within the **Virtual Assistant project directory** and have created your Bot through the template, and therefore have a `skills.json` file present in the working folder which contains the connected skills.
### Connect Skills
{:.no_toc}
@@ -41,24 +41,11 @@ The `connect` command allows you to connect a Skill, be it local or remote, to y
Here is an example:
```bash
-botskills connect --remoteManifest "{{site.data.urls.SkillManifest}}" --cs
+botskills connect --remoteManifest "{{site.data.urls.SkillManifest}}" --luisFolder "\Deployment\Resources\LU" --languages "en-us" --cs
```
*Remember to re-publish your Assistant to Azure after you've added a Skill unless you plan on testing locally only*
-Once the connect command finish successfully, you can see under the `botFrameworkSkills` property of your Virtual Assistant's appsettings.json file that the following structure was added with the information provided in the Skill manifest.
-
-```json
- "botFrameworkSkills": {
- "id": "",
- "appId": "",
- "skillEndpoint": "",
- "name": "",
- "description": ""
- },
- "skillHostEndpoint": ""
-```
-
For further information, see the [Connect command documentation]({{site.repo}}/tree/master/tools/botskills/docs/commands/connect.md).
### Disconnect Skills
@@ -73,7 +60,7 @@ botskills disconnect --skillId --cs
For further information, see the [Disconnect command documentation]({{site.repo}}/tree/master/tools/botskills/docs/commands/disconnect.md).
-> Note: The id of the Skill can also be aquired using the `botskills list` command. You can check the [List command documentation]({{site.repo}}/tree/master/tools/botskills/docs/list.md).
+> Note: The id of the Skill can also be aquired using the `botskills list` command. You can check the [List command documentation]({{site.repo}}/tree/master/tools/botskills/docs/commands/list.md).
### Update a connected Skill
{:.no_toc}
@@ -82,7 +69,7 @@ The `update` command allows you to update a Skill, be it local or remote, to you
Here is an example:
```bash
-botskills update --remoteManifest "{{site.data.urls.SkillManifest}}" --cs
+botskills update --botName --remoteManifest "{{site.data.urls.SkillManifest}}" --luisFolder --cs
```
For further information, see the [Update command documentation]({{site.repo}}/tree/master/tools/botskills/docs/commands/update.md).
@@ -110,3 +97,14 @@ botskills list
```
For further information, see the [List command documentation]({{site.repo}}/tree/master/tools/botskills/docs/commands/list.md).
+
+### Migrate Skills
+
+The `migrate` command allows you to transfer all the skills currently connected to your assistant to the new schema configuration settings.
+
+Here is an example:
+```bash
+botskills migrate --sourceFile "/skills.json" --destFile "/appsettings.json"
+```
+
+For further information, see the [Migrate command documentation]({{site.repo}}/tree/master/tools/botskills/docs/commands/migrate.md).
diff --git a/docs/_docs/skills/tutorials/add-prebuilt-skill/2-download-and-install.md b/docs/_docs/skills/tutorials/add-prebuilt-skill/2-download-and-install.md
index aea93cc8ee..d7afa08f19 100644
--- a/docs/_docs/skills/tutorials/add-prebuilt-skill/2-download-and-install.md
+++ b/docs/_docs/skills/tutorials/add-prebuilt-skill/2-download-and-install.md
@@ -20,7 +20,7 @@ order: 2
1. Install Bot Framework (CLI) tool dependencies. It's important to do this even if you have earlier versions as we make use of the latest capabilities:
```
- npm install -g botdispatch ludown luis-apis qnamaker luisgen@2.0.2
+ npm install -g botdispatch @microsoft/botframework-cli
```
1. Install Botskills CLI tool:
diff --git a/docs/_docs/skills/tutorials/add-prebuilt-skill/6-next-steps.md b/docs/_docs/skills/tutorials/add-prebuilt-skill/6-next-steps.md
index 2db2ccce64..11e1ad5de4 100644
--- a/docs/_docs/skills/tutorials/add-prebuilt-skill/6-next-steps.md
+++ b/docs/_docs/skills/tutorials/add-prebuilt-skill/6-next-steps.md
@@ -12,32 +12,8 @@ order: 6
Now that you've connected a pre-built skill to your assistant, try out these other tutorials:
-
-
-
-
Create a skill
-
Build a custom skill for your scenario.
-
-
-
-
-
-
Enable Speech
-
Enable the Microsoft Speech Channel for your assistant.
-
-
-
-
-
-
Enable Microsoft Teams
-
Enable the Microsoft Teams Channel for your assistant.
-
-
-
+
+ {% include button.html params=site.data.button.create_skill_cs %}
+ {% include button.html params=site.data.button.enable_speech %}
+ {% include button.html params=site.data.button.enable_msteams %}
\ No newline at end of file
diff --git a/docs/_docs/skills/tutorials/create-skill/csharp/2-download-and-install.md b/docs/_docs/skills/tutorials/create-skill/csharp/2-download-and-install.md
index e18c4e71f0..4fa4606854 100644
--- a/docs/_docs/skills/tutorials/create-skill/csharp/2-download-and-install.md
+++ b/docs/_docs/skills/tutorials/create-skill/csharp/2-download-and-install.md
@@ -20,7 +20,7 @@ order: 2
1. Download and install the Bot Framework CLI tools:
```
- npm install -g @microsoft/botframework-cli botdispatch luis-apis
+ npm install -g botdispatch @microsoft/botframework-cli
```
1. Install Botskills CLI tool:
diff --git a/docs/_docs/skills/tutorials/create-skill/csharp/9-next-steps.md b/docs/_docs/skills/tutorials/create-skill/csharp/9-next-steps.md
index 12f71111cd..01258e273a 100644
--- a/docs/_docs/skills/tutorials/create-skill/csharp/9-next-steps.md
+++ b/docs/_docs/skills/tutorials/create-skill/csharp/9-next-steps.md
@@ -14,34 +14,7 @@ order: 9
Now that you've created your skill, try the one of these tutorials:
-
-
+ {% include button.html params=site.data.button.customize_skill_cs %}
+ {% include button.html params=site.data.button.enable_speech %}
+ {% include button.html params=site.data.button.enable_msteams %}
\ No newline at end of file
diff --git a/docs/_docs/skills/tutorials/create-skill/typescript/2-download-and-install.md b/docs/_docs/skills/tutorials/create-skill/typescript/2-download-and-install.md
index 10e493b7a3..bc278a9e90 100644
--- a/docs/_docs/skills/tutorials/create-skill/typescript/2-download-and-install.md
+++ b/docs/_docs/skills/tutorials/create-skill/typescript/2-download-and-install.md
@@ -18,7 +18,7 @@ order: 2
1. Download and install the Bot Framework CLI tools:
```
- npm install -g botdispatch ludown luis-apis qnamaker luisgen@2.0.2
+ npm install -g botdispatch @microsoft/botframework-cli
```
1. Install Botskills CLI tool:
diff --git a/docs/_docs/skills/tutorials/create-skill/typescript/3-create-your-skill.md b/docs/_docs/skills/tutorials/create-skill/typescript/3-create-your-skill.md
index 34cce0b501..d42d7cad04 100644
--- a/docs/_docs/skills/tutorials/create-skill/typescript/3-create-your-skill.md
+++ b/docs/_docs/skills/tutorials/create-skill/typescript/3-create-your-skill.md
@@ -11,16 +11,16 @@ order: 3
## {{ page.title }}
-Install the botbuilder-assistant generator
+Install the bot-virtualassistant generator
```bash
-npm install -g generator-botbuilder-assistant
+npm install -g generator-bot-virtualassistant
```
Now you can execute the Skill sub-generator with this command.
```bash
-yo botbuilder-assistant:skill
+yo bot-virtualassistant:skill
```
**At this point you have two different options to proceed:**
@@ -61,7 +61,7 @@ yo botbuilder-assistant:skill
#### Example
```bash
-> yo botbuilder-assistant:skill -n "My skill" -d "A description for my new skill" -l "en" -p "\aPath" --noPrompt
+> yo bot-virtualassistant:skill -n "My skill" -d "A description for my new skill" -l "en" -p "\aPath" --noPrompt
```
After this, you can check the summary in your screen:
diff --git a/docs/_docs/skills/tutorials/create-skill/typescript/8-next-steps.md b/docs/_docs/skills/tutorials/create-skill/typescript/8-next-steps.md
index 96198d639a..bbf225f528 100644
--- a/docs/_docs/skills/tutorials/create-skill/typescript/8-next-steps.md
+++ b/docs/_docs/skills/tutorials/create-skill/typescript/8-next-steps.md
@@ -14,34 +14,7 @@ order: 8
Now that you've created your custom skill, try the one of these tutorials:
-
-
+ {% include button.html params=site.data.button.customize_skill_ts %}
+ {% include button.html params=site.data.button.enable_speech %}
+ {% include button.html params=site.data.button.enable_msteams %}
\ No newline at end of file
diff --git a/docs/_docs/skills/tutorials/customize-skill/csharp/5-next-steps.md b/docs/_docs/skills/tutorials/customize-skill/csharp/5-next-steps.md
index 2a3ee73418..20388066cd 100644
--- a/docs/_docs/skills/tutorials/customize-skill/csharp/5-next-steps.md
+++ b/docs/_docs/skills/tutorials/customize-skill/csharp/5-next-steps.md
@@ -13,34 +13,7 @@ order: 5
Now that you've customized your skill, try one of these tutorials:
-
-
+ {% include button.html params=site.data.button.add_action_cs %}
+ {% include button.html params=site.data.button.enable_speech %}
+ {% include button.html params=site.data.button.enable_msteams %}
\ No newline at end of file
diff --git a/docs/_docs/skills/tutorials/customize-skill/typescript/5-next-steps.md b/docs/_docs/skills/tutorials/customize-skill/typescript/5-next-steps.md
index d046199e95..1db718d164 100644
--- a/docs/_docs/skills/tutorials/customize-skill/typescript/5-next-steps.md
+++ b/docs/_docs/skills/tutorials/customize-skill/typescript/5-next-steps.md
@@ -13,24 +13,6 @@ order: 5
Now that you've customized your skill, try one of these tutorials:
-
-
+ {% include button.html params=site.data.button.enable_speech %}
+ {% include button.html params=site.data.button.enable_msteams %}
\ No newline at end of file
diff --git a/docs/_docs/solution-accelerators/samples/proactive-notifications.md b/docs/_docs/solution-accelerators/samples/proactive-notifications.md
index 8f5bac7aa7..194c0129f6 100644
--- a/docs/_docs/solution-accelerators/samples/proactive-notifications.md
+++ b/docs/_docs/solution-accelerators/samples/proactive-notifications.md
@@ -29,12 +29,5 @@ An automated deployment will be available in the [Enterprise Assistant sample]({
## Next Steps
-
+ {% include button.html params=site.data.button.proactive %}
\ No newline at end of file
diff --git a/docs/_docs/solution-accelerators/tutorials/enable-continuous-deployment/4-next-steps.md b/docs/_docs/solution-accelerators/tutorials/enable-continuous-deployment/4-next-steps.md
index 14b2c79b2a..47ae2b057c 100644
--- a/docs/_docs/solution-accelerators/tutorials/enable-continuous-deployment/4-next-steps.md
+++ b/docs/_docs/solution-accelerators/tutorials/enable-continuous-deployment/4-next-steps.md
@@ -12,13 +12,5 @@ order: 4
{:.no_toc}
-
-
+ {% include button.html params=site.data.button.release_pipelines %}
\ No newline at end of file
diff --git a/docs/_docs/solution-accelerators/tutorials/enable-continuous-integration/csharp/5-next-steps.md b/docs/_docs/solution-accelerators/tutorials/enable-continuous-integration/csharp/5-next-steps.md
index 9d6ed67abc..a8d972585c 100644
--- a/docs/_docs/solution-accelerators/tutorials/enable-continuous-integration/csharp/5-next-steps.md
+++ b/docs/_docs/solution-accelerators/tutorials/enable-continuous-integration/csharp/5-next-steps.md
@@ -12,22 +12,6 @@ order: 5
{:.no_toc}
+ {% include button.html params=site.data.button.azure_pipelines %}
+ {% include button.html params=site.data.button.enable_cd %}
+
\ No newline at end of file
diff --git a/docs/_docs/solution-accelerators/tutorials/enable-continuous-integration/typescript/4-next-steps.md b/docs/_docs/solution-accelerators/tutorials/enable-continuous-integration/typescript/4-next-steps.md
index 8a1c14c93f..30ca588622 100644
--- a/docs/_docs/solution-accelerators/tutorials/enable-continuous-integration/typescript/4-next-steps.md
+++ b/docs/_docs/solution-accelerators/tutorials/enable-continuous-integration/typescript/4-next-steps.md
@@ -12,22 +12,6 @@ order: 4
{:.no_toc}
-
-
+ {% include button.html params=site.data.button.azure_pipelines %}
+ {% include button.html params=site.data.button.enable_cd %}
\ No newline at end of file
diff --git a/docs/_docs/solution-accelerators/tutorials/view-analytics/4-next-steps.md b/docs/_docs/solution-accelerators/tutorials/view-analytics/4-next-steps.md
index fa07caff01..dac1b7d854 100644
--- a/docs/_docs/solution-accelerators/tutorials/view-analytics/4-next-steps.md
+++ b/docs/_docs/solution-accelerators/tutorials/view-analytics/4-next-steps.md
@@ -13,22 +13,6 @@ order: 4
Now that you've learned learned how to view a sample of Virtual Assistant analytics, learn more from the following resources.
-
-
+ {% include button.html params=site.data.button.telemetry_add %}
+ {% include button.html params=site.data.button.telemetry_event %}
\ No newline at end of file
diff --git a/docs/_docs/virtual-assistant/handbook/feedback.md b/docs/_docs/virtual-assistant/handbook/feedback.md
index 5f18072843..8b728b63d1 100644
--- a/docs/_docs/virtual-assistant/handbook/feedback.md
+++ b/docs/_docs/virtual-assistant/handbook/feedback.md
@@ -11,55 +11,45 @@ toc: true
{:.no_toc}
{{ page.description }}
-## Add and configure the middleware
-To start collecting user feedback, add the following code block in your adapter class (DefaultAdapter.cs in the Virtual Assistant and Skill templates):
+## Feedback Mechanism
+The **VirtualAssistantSample** project within the Enterprise Assistant sample has feedback implemented using a temporary solution. It's recommended to review the provided [MainDialog.cs](https://aka.ms/bfEnterpriseAssistantMainDialog) in parallel to this document to gain a full understanding of this implementation.
-```csharp
-Use(new FeedbackMiddleware(conversationState, telemetryClient, new FeedbackOptions()));
-```
+This implementation allows for feedback to be collected when a child dialog of main dialog ends. The user's feedback is recorded and sent to app insights and results will be visible in your [PowerBI dashboard](https://aka.ms/bfFeedbackDocPowerBiHeader).
-This enables the FeedbackMiddleware with the following default settings:
+## Steps to implement feedback
-| Property | Description | Type | Default value |
+1) If you are using an older VA template it may contain references to `FeedbackMiddleware`. Check your bot adapter class (default adapter being `defaultadapter.cs`) and remove any reference to FeedbackMiddleware in your bot adapter.
+1) To start collecting user feedback, add the feedback directory found in the **VirtualAssistantSample** project within the Enterprise Assistant sample to your VA. This will have all the utility and helper functions you will need.
+1) Add feedback options to startup.cs
+ ```csharp
+ services.AddSingleton(new FeedbackOptions());
+ ```
+
+ FeedbackOptions consists of the following. You can alter any of the properties when you declare your options in startup.cs
+
+ | Property | Description | Type | Default value |
| -------- | ----------- | ---- |------------- |
+| FeedbackEnabled | Value determines whether or not user should be prompted for feedback when a dialog ends and returns to main dialog | **bool** | *True* |
| FeedbackActions | Feedback options shown to the user. | **CardAction List** | 👍 / 👎 |
| DismissAction | Option to dismiss request for feedback, or request for comment. | **CardAction** | *Dismiss*
| FeedbackReceivedMessage | Message to show after user has provided feedback. | **string** | *Thanks for your feedback!* |
| CommentsEnabled | Flag indicating whether the bot should prompt for free-form comments after user has provided feedback. | **bool** | false |
| CommentPrompt | Message to show after user provided feedback if CommentsEnabled is true. | **string** | *Please add any additional comments in the chat.*
| CommentReceivedMessage | Message to show after user provides a free-form comment. | **string** | *Your comment has been received.* |
+| FeedbackPromptMessage | Message to show after user when prompting for feedback | **string** | *Was that helpful?* |
-Here is an example customization with different feedback options and comments enabled:
-
-```csharp
-Use(new FeedbackMiddleware(conversationState, telemetryClient, new FeedbackOptions()
-{
- FeedbackActions = new List()
- {
- new CardAction(ActionTypes.PostBack, title: "🙂", value: "positive"),
- new CardAction(ActionTypes.PostBack, title: "😐", value: "neutral"),
- new CardAction(ActionTypes.PostBack, title: "🙁", value: "negative"),
- };
- CommentsEnabled = true
-}));
-```
-
-## Request feedback
-You can request feedback from your users using the following code snippet:
-
-```csharp
-FeedbackMiddleware.RequestFeedbackAsync(turnContext, "your-tag")
-```
-> Replace "your-tag" with a custom label for your feedback to be shown in Power BI dashboard. For example, QnA Maker feedback might be labelled "qna".
-
-## Request feedback in skills
-To enable requesting feedback in your skills, you must either be using the same state storage and Application Insights services as your Virtual Assistant (with FeedbackMiddleware enabled) or you need to follow the above steps to configure the FeedbackMiddleware in your adapter.
-
-After the middleware is configured, you can request feedback as usual.
+3. Copy the feedback waterfall steps from Maindialog.cs in the Enterprise Assistant solution (RequestFeedback, RequestFeedbackComment, ProcessFeedback) and add them to your VAs mainDialog.cs waterfall flow.
+ - Add corresponding steps and prompts to the Maindialog constructor (use enterprise assistant for reference)
+1. When you copy the waterfall steps over ensure you resolve any unknown object/function references with the implementations added in step 1.
+ - There are separate implementations in the lib, **do not use those for this feedback solution, use the implementations you manually added in step 1**.
+1. If you have followed these steps and used the Enterprise Assistant as a reference then you should now have all you need.
+1. Run through any dialog in your VA, when the dialog ends and returns to MainDialog.cs then the feedback flow should be triggered.
+ - If the user ignores the feedback prompt and sends an unrelated query to the bot then they're query will skip feedback and be routed accordingly.
+ - If the user provides any feedback at all then it will be logged with app insights and that telemetry will be part of your PowerBI dashboard
## View your feedback in Power BI
You can view your **Feedback** in the Feedback tab of the Conversational AI Dashboard.
![]({{site.baseurl}}/assets/images/analytics/virtual-assistant-analytics-powerbi-13.png)
-[Learn how to set up your own Power BI dashboard.]({{site.baseurl}}/solution-accelerators/tutorials/view-analytics/1-intro/)
\ No newline at end of file
+[Learn how to set up your own Power BI dashboard.]({{site.baseurl}}/solution-accelerators/tutorials/view-analytics/1-intro/)
diff --git a/docs/_docs/virtual-assistant/handbook/migration.md b/docs/_docs/virtual-assistant/handbook/migration.md
index 39df91f6db..9ecbf30f48 100644
--- a/docs/_docs/virtual-assistant/handbook/migration.md
+++ b/docs/_docs/virtual-assistant/handbook/migration.md
@@ -160,4 +160,4 @@ Copy any LuisGen-generated classes into the Services directory.
## Extend your assistant with Skills
-If your assistant was based on the [Virtual Assistant (Beta Release 0.3) solution](https://github.com/microsoft/AI/releases/tag/0.3), continue with [adding back the Skills]({{site.baseurl}}/skills/handbook/add-skills-to-a-virtual-assistant/)
+If your assistant was based on the [Virtual Assistant (Beta Release 0.3) solution](https://github.com/microsoft/botframework-solutions/releases/tag/0.3), continue with [adding back the Skills]({{site.baseurl}}/skills/handbook/add-skills-to-a-virtual-assistant/)
diff --git a/docs/_docs/virtual-assistant/tutorials/create-assistant/csharp/2-download-and-install.md b/docs/_docs/virtual-assistant/tutorials/create-assistant/csharp/2-download-and-install.md
index 88702c662c..f930d7be10 100644
--- a/docs/_docs/virtual-assistant/tutorials/create-assistant/csharp/2-download-and-install.md
+++ b/docs/_docs/virtual-assistant/tutorials/create-assistant/csharp/2-download-and-install.md
@@ -20,7 +20,7 @@ order: 2
1. Download and install the Bot Framework CLI tools:
```
- npm install -g @microsoft/botframework-cli botdispatch luis-apis
+ npm install -g botdispatch @microsoft/botframework-cli
```
1. Install Botskills CLI tool:
diff --git a/docs/_docs/virtual-assistant/tutorials/create-assistant/csharp/6-next-steps.md b/docs/_docs/virtual-assistant/tutorials/create-assistant/csharp/6-next-steps.md
index 7939d66873..f50e2fa020 100644
--- a/docs/_docs/virtual-assistant/tutorials/create-assistant/csharp/6-next-steps.md
+++ b/docs/_docs/virtual-assistant/tutorials/create-assistant/csharp/6-next-steps.md
@@ -14,44 +14,8 @@ order: 6
Now that you've got the basics, try the one of these tutorials:
-
-
+ {% include button.html params=site.data.button.customize_va_cs %}
+ {% include button.html params=site.data.button.create_skill_cs %}
+ {% include button.html params=site.data.button.enable_speech %}
+ {% include button.html params=site.data.button.enable_msteams %}
diff --git a/docs/_docs/virtual-assistant/tutorials/create-assistant/typescript/2-download-and-install.md b/docs/_docs/virtual-assistant/tutorials/create-assistant/typescript/2-download-and-install.md
index d791145654..a5519e6e4b 100644
--- a/docs/_docs/virtual-assistant/tutorials/create-assistant/typescript/2-download-and-install.md
+++ b/docs/_docs/virtual-assistant/tutorials/create-assistant/typescript/2-download-and-install.md
@@ -16,7 +16,7 @@ order: 2
1. Download and install Bot Framework (CLI) tool dependencies. It's important to do this even if you have earlier versions because the Virtual Assistant makes use of the latest capabilities:
```shell
- npm install -g botdispatch ludown luis-apis qnamaker luisgen@2.0.2
+ npm install -g botdispatch @microsoft/botframework-cli
```
1. Install Botskills CLI tool:
diff --git a/docs/_docs/virtual-assistant/tutorials/create-assistant/typescript/3-create-project.md b/docs/_docs/virtual-assistant/tutorials/create-assistant/typescript/3-create-project.md
index 33b489f881..fdfb802af6 100644
--- a/docs/_docs/virtual-assistant/tutorials/create-assistant/typescript/3-create-project.md
+++ b/docs/_docs/virtual-assistant/tutorials/create-assistant/typescript/3-create-project.md
@@ -11,16 +11,16 @@ order: 3
## Create your Virtual Assistant project
-Install the botbuilder-assistant generator
+Install the bot-virtualassistant generator
```bash
- npm install -g generator-botbuilder-assistant
+ npm install -g generator-bot-virtualassistant
```
Now you can execute the Virtual Assistant generator with this command.
```bash
-yo botbuilder-assistant
+yo bot-virtualassistant
```
**At this point you can proceed with two different options:**
@@ -61,7 +61,7 @@ yo botbuilder-assistant
#### Example
```bash
-> yo botbuilder-assistant -n "Virtual Assistant" -d "A description for my new assistant" -l "en,es" -p "\aPath" --noPrompt
+> yo bot-virtualassistant -n "Virtual Assistant" -d "A description for my new assistant" -l "en,es" -p "\aPath" --noPrompt
```
After this, you can check the summary on your screen:
diff --git a/docs/_docs/virtual-assistant/tutorials/create-assistant/typescript/6-next-steps.md b/docs/_docs/virtual-assistant/tutorials/create-assistant/typescript/6-next-steps.md
index 8512a40320..57eab8761f 100644
--- a/docs/_docs/virtual-assistant/tutorials/create-assistant/typescript/6-next-steps.md
+++ b/docs/_docs/virtual-assistant/tutorials/create-assistant/typescript/6-next-steps.md
@@ -14,44 +14,8 @@ order: 6
Now that you've got the basics, try the one of these tutorials:
-
-
+ {% include button.html params=site.data.button.customize_va_ts %}
+ {% include button.html params=site.data.button.create_skill_ts %}
+ {% include button.html params=site.data.button.enable_speech %}
+ {% include button.html params=site.data.button.enable_msteams %}
diff --git a/docs/_docs/virtual-assistant/tutorials/customize-assistant/csharp/5-next-steps.md b/docs/_docs/virtual-assistant/tutorials/customize-assistant/csharp/5-next-steps.md
index 8e47e01f05..402ed9ab51 100644
--- a/docs/_docs/virtual-assistant/tutorials/customize-assistant/csharp/5-next-steps.md
+++ b/docs/_docs/virtual-assistant/tutorials/customize-assistant/csharp/5-next-steps.md
@@ -14,34 +14,7 @@ order: 5
Now that you've learned how to personalize a Virtual Assistant, try one of these tutorials:
-
-
+ {% include button.html params=site.data.button.create_skill_cs %}
+ {% include button.html params=site.data.button.enable_speech %}
+ {% include button.html params=site.data.button.enable_msteams %}
\ No newline at end of file
diff --git a/docs/_docs/virtual-assistant/tutorials/customize-assistant/typescript/5-next-steps.md b/docs/_docs/virtual-assistant/tutorials/customize-assistant/typescript/5-next-steps.md
index 7e30321414..b4b42cd6fc 100644
--- a/docs/_docs/virtual-assistant/tutorials/customize-assistant/typescript/5-next-steps.md
+++ b/docs/_docs/virtual-assistant/tutorials/customize-assistant/typescript/5-next-steps.md
@@ -14,34 +14,7 @@ order: 5
Now that you've learned learned how to personalize a Virtual Assistant, try one of these tutorials:
` elements.\n\nbody {\n margin: 0; // 1\n font-family: $font-family-base;\n font-size: $font-size-base;\n font-weight: $font-weight-base;\n line-height: $line-height-base;\n color: $body-color;\n text-align: left; // 3\n background-color: $body-bg; // 2\n}\n\n// Suppress the focus outline on elements that cannot be accessed via keyboard.\n// This prevents an unwanted focus outline from appearing around elements that\n// might still respond to pointer events.\n//\n// Credit: https://github.com/suitcss/base\n[tabindex=\"-1\"]:focus {\n outline: 0 !important;\n}\n\n\n// Content grouping\n//\n// 1. Add the correct box sizing in Firefox.\n// 2. Show the overflow in Edge and IE.\n\nhr {\n box-sizing: content-box; // 1\n height: 0; // 1\n overflow: visible; // 2\n}\n\n\n//\n// Typography\n//\n\n// Remove top margins from headings\n//\n// By default, `
`-`
` all receive top and bottom margins. We nuke the top\n// margin for easier control within type scales as it avoids margin collapsing.\n// stylelint-disable selector-list-comma-newline-after\nh1, h2, h3, h4, h5, h6 {\n margin-top: 0;\n margin-bottom: $headings-margin-bottom;\n}\n// stylelint-enable selector-list-comma-newline-after\n\n// Reset margins on paragraphs\n//\n// Similarly, the top margin on `
`s get reset. However, we also reset the\n// bottom margin to use `rem` units instead of `em`.\np {\n margin-top: 0;\n margin-bottom: $paragraph-margin-bottom;\n}\n\n// Abbreviations\n//\n// 1. Remove the bottom border in Firefox 39-.\n// 2. Add the correct text decoration in Chrome, Edge, IE, Opera, and Safari.\n// 3. Add explicit cursor to indicate changed behavior.\n// 4. Duplicate behavior to the data-* attribute for our tooltip plugin\n\nabbr[title],\nabbr[data-original-title] { // 4\n text-decoration: underline; // 2\n text-decoration: underline dotted; // 2\n cursor: help; // 3\n border-bottom: 0; // 1\n}\n\naddress {\n margin-bottom: 1rem;\n font-style: normal;\n line-height: inherit;\n}\n\nol,\nul,\ndl {\n margin-top: 0;\n margin-bottom: 1rem;\n}\n\nol ol,\nul ul,\nol ul,\nul ol {\n margin-bottom: 0;\n}\n\ndt {\n font-weight: $dt-font-weight;\n}\n\ndd {\n margin-bottom: .5rem;\n margin-left: 0; // Undo browser default\n}\n\nblockquote {\n margin: 0 0 1rem;\n}\n\ndfn {\n font-style: italic; // Add the correct font style in Android 4.3-\n}\n\n// stylelint-disable font-weight-notation\nb,\nstrong {\n font-weight: bolder; // Add the correct font weight in Chrome, Edge, and Safari\n}\n// stylelint-enable font-weight-notation\n\nsmall {\n font-size: 80%; // Add the correct font size in all browsers\n}\n\n//\n// Prevent `sub` and `sup` elements from affecting the line height in\n// all browsers.\n//\n\nsub,\nsup {\n position: relative;\n font-size: 75%;\n line-height: 0;\n vertical-align: baseline;\n}\n\nsub { bottom: -.25em; }\nsup { top: -.5em; }\n\n\n//\n// Links\n//\n\na {\n color: $link-color;\n text-decoration: $link-decoration;\n background-color: transparent; // Remove the gray background on active links in IE 10.\n -webkit-text-decoration-skip: objects; // Remove gaps in links underline in iOS 8+ and Safari 8+.\n\n @include hover {\n color: $link-hover-color;\n text-decoration: $link-hover-decoration;\n }\n}\n\n// And undo these styles for placeholder links/named anchors (without href)\n// which have not been made explicitly keyboard-focusable (without tabindex).\n// It would be more straightforward to just use a[href] in previous block, but that\n// causes specificity issues in many other styles that are too complex to fix.\n// See https://github.com/twbs/bootstrap/issues/19402\n\na:not([href]):not([tabindex]) {\n color: inherit;\n text-decoration: none;\n\n @include hover-focus {\n color: inherit;\n text-decoration: none;\n }\n\n &:focus {\n outline: 0;\n }\n}\n\n\n//\n// Code\n//\n\npre,\ncode,\nkbd,\nsamp {\n font-family: $font-family-monospace;\n font-size: 1em; // Correct the odd `em` font sizing in all browsers.\n}\n\npre {\n // Remove browser default top margin\n margin-top: 0;\n // Reset browser default of `1em` to use `rem`s\n margin-bottom: 1rem;\n // Don't allow content to break outside\n overflow: auto;\n // We have @viewport set which causes scrollbars to overlap content in IE11 and Edge, so\n // we force a non-overlapping, non-auto-hiding scrollbar to counteract.\n -ms-overflow-style: scrollbar;\n}\n\n\n//\n// Figures\n//\n\nfigure {\n // Apply a consistent margin strategy (matches our type styles).\n margin: 0 0 1rem;\n}\n\n\n//\n// Images and content\n//\n\nimg {\n vertical-align: middle;\n border-style: none; // Remove the border on images inside links in IE 10-.\n}\n\nsvg {\n // Workaround for the SVG overflow bug in IE10/11 is still required.\n // See https://github.com/twbs/bootstrap/issues/26878\n overflow: hidden;\n vertical-align: middle;\n}\n\n\n//\n// Tables\n//\n\ntable {\n border-collapse: collapse; // Prevent double borders\n}\n\ncaption {\n padding-top: $table-cell-padding;\n padding-bottom: $table-cell-padding;\n color: $table-caption-color;\n text-align: left;\n caption-side: bottom;\n}\n\nth {\n // Matches default `
` alignment by inheriting from the ``, or the\n // closest parent with a set `text-align`.\n text-align: inherit;\n}\n\n\n//\n// Forms\n//\n\nlabel {\n // Allow labels to use `margin` for spacing.\n display: inline-block;\n margin-bottom: $label-margin-bottom;\n}\n\n// Remove the default `border-radius` that macOS Chrome adds.\n//\n// Details at https://github.com/twbs/bootstrap/issues/24093\nbutton {\n border-radius: 0;\n}\n\n// Work around a Firefox/IE bug where the transparent `button` background\n// results in a loss of the default `button` focus styles.\n//\n// Credit: https://github.com/suitcss/base/\nbutton:focus {\n outline: 1px dotted;\n outline: 5px auto -webkit-focus-ring-color;\n}\n\ninput,\nbutton,\nselect,\noptgroup,\ntextarea {\n margin: 0; // Remove the margin in Firefox and Safari\n font-family: inherit;\n font-size: inherit;\n line-height: inherit;\n}\n\nbutton,\ninput {\n overflow: visible; // Show the overflow in Edge\n}\n\nbutton,\nselect {\n text-transform: none; // Remove the inheritance of text transform in Firefox\n}\n\n// 1. Prevent a WebKit bug where (2) destroys native `audio` and `video`\n// controls in Android 4.\n// 2. Correct the inability to style clickable types in iOS and Safari.\nbutton,\nhtml [type=\"button\"], // 1\n[type=\"reset\"],\n[type=\"submit\"] {\n -webkit-appearance: button; // 2\n}\n\n// Remove inner border and padding from Firefox, but don't restore the outline like Normalize.\nbutton::-moz-focus-inner,\n[type=\"button\"]::-moz-focus-inner,\n[type=\"reset\"]::-moz-focus-inner,\n[type=\"submit\"]::-moz-focus-inner {\n padding: 0;\n border-style: none;\n}\n\ninput[type=\"radio\"],\ninput[type=\"checkbox\"] {\n box-sizing: border-box; // 1. Add the correct box sizing in IE 10-\n padding: 0; // 2. Remove the padding in IE 10-\n}\n\n\ninput[type=\"date\"],\ninput[type=\"time\"],\ninput[type=\"datetime-local\"],\ninput[type=\"month\"] {\n // Remove the default appearance of temporal inputs to avoid a Mobile Safari\n // bug where setting a custom line-height prevents text from being vertically\n // centered within the input.\n // See https://bugs.webkit.org/show_bug.cgi?id=139848\n // and https://github.com/twbs/bootstrap/issues/11266\n -webkit-appearance: listbox;\n}\n\ntextarea {\n overflow: auto; // Remove the default vertical scrollbar in IE.\n // Textareas should really only resize vertically so they don't break their (horizontal) containers.\n resize: vertical;\n}\n\nfieldset {\n // Browsers set a default `min-width: min-content;` on fieldsets,\n // unlike e.g. `
`s, which have `min-width: 0;` by default.\n // So we reset that to ensure fieldsets behave more like a standard block element.\n // See https://github.com/twbs/bootstrap/issues/12359\n // and https://html.spec.whatwg.org/multipage/#the-fieldset-and-legend-elements\n min-width: 0;\n // Reset the default outline behavior of fieldsets so they don't affect page layout.\n padding: 0;\n margin: 0;\n border: 0;\n}\n\n// 1. Correct the text wrapping in Edge and IE.\n// 2. Correct the color inheritance from `fieldset` elements in IE.\nlegend {\n display: block;\n width: 100%;\n max-width: 100%; // 1\n padding: 0;\n margin-bottom: .5rem;\n font-size: 1.5rem;\n line-height: inherit;\n color: inherit; // 2\n white-space: normal; // 1\n}\n\nprogress {\n vertical-align: baseline; // Add the correct vertical alignment in Chrome, Firefox, and Opera.\n}\n\n// Correct the cursor style of increment and decrement buttons in Chrome.\n[type=\"number\"]::-webkit-inner-spin-button,\n[type=\"number\"]::-webkit-outer-spin-button {\n height: auto;\n}\n\n[type=\"search\"] {\n // This overrides the extra rounded corners on search inputs in iOS so that our\n // `.form-control` class can properly style them. Note that this cannot simply\n // be added to `.form-control` as it's not specific enough. For details, see\n // https://github.com/twbs/bootstrap/issues/11586.\n outline-offset: -2px; // 2. Correct the outline style in Safari.\n -webkit-appearance: none;\n}\n\n//\n// Remove the inner padding and cancel buttons in Chrome and Safari on macOS.\n//\n\n[type=\"search\"]::-webkit-search-cancel-button,\n[type=\"search\"]::-webkit-search-decoration {\n -webkit-appearance: none;\n}\n\n//\n// 1. Correct the inability to style clickable types in iOS and Safari.\n// 2. Change font properties to `inherit` in Safari.\n//\n\n::-webkit-file-upload-button {\n font: inherit; // 2\n -webkit-appearance: button; // 1\n}\n\n//\n// Correct element displays\n//\n\noutput {\n display: inline-block;\n}\n\nsummary {\n display: list-item; // Add the correct display in all browsers\n cursor: pointer;\n}\n\ntemplate {\n display: none; // Add the correct display in IE\n}\n\n// Always hide an element with the `hidden` HTML attribute (from PureCSS).\n// Needed for proper display in IE 10-.\n[hidden] {\n display: none !important;\n}\n","// Variables\n//\n// Variables should follow the `$component-state-property-size` formula for\n// consistent naming. Ex: $nav-link-disabled-color and $modal-content-box-shadow-xs.\n\n\n//\n// Color system\n//\n\n$white: #fff !default;\n$gray-100: #f8f9fa !default;\n$gray-200: #e9ecef !default;\n$gray-300: #dee2e6 !default;\n$gray-400: #ced4da !default;\n$gray-500: #adb5bd !default;\n$gray-600: #6c757d !default;\n$gray-700: #495057 !default;\n$gray-800: #343a40 !default;\n$gray-900: #212529 !default;\n$black: #000 !default;\n\n$grays: () !default;\n// stylelint-disable-next-line scss/dollar-variable-default\n$grays: map-merge(\n (\n \"100\": $gray-100,\n \"200\": $gray-200,\n \"300\": $gray-300,\n \"400\": $gray-400,\n \"500\": $gray-500,\n \"600\": $gray-600,\n \"700\": $gray-700,\n \"800\": $gray-800,\n \"900\": $gray-900\n ),\n $grays\n);\n\n\n$blue: #007bff !default;\n$indigo: #6610f2 !default;\n$purple: #6f42c1 !default;\n$pink: #e83e8c !default;\n$red: #dc3545 !default;\n$orange: #fd7e14 !default;\n$yellow: #ffc107 !default;\n$green: #28a745 !default;\n$teal: #20c997 !default;\n$cyan: #17a2b8 !default;\n\n$colors: () !default;\n// stylelint-disable-next-line scss/dollar-variable-default\n$colors: map-merge(\n (\n \"blue\": $blue,\n \"indigo\": $indigo,\n \"purple\": $purple,\n \"pink\": $pink,\n \"red\": $red,\n \"orange\": $orange,\n \"yellow\": $yellow,\n \"green\": $green,\n \"teal\": $teal,\n \"cyan\": $cyan,\n \"white\": $white,\n \"gray\": $gray-600,\n \"gray-dark\": $gray-800\n ),\n $colors\n);\n\n$primary: $blue !default;\n$secondary: $gray-600 !default;\n$success: $green !default;\n$info: $cyan !default;\n$warning: $yellow !default;\n$danger: $red !default;\n$light: $gray-100 !default;\n$dark: $gray-800 !default;\n\n$theme-colors: () !default;\n// stylelint-disable-next-line scss/dollar-variable-default\n$theme-colors: map-merge(\n (\n \"primary\": $primary,\n \"secondary\": $secondary,\n \"success\": $success,\n \"info\": $info,\n \"warning\": $warning,\n \"danger\": $danger,\n \"light\": $light,\n \"dark\": $dark\n ),\n $theme-colors\n);\n\n// Set a specific jump point for requesting color jumps\n$theme-color-interval: 8% !default;\n\n// The yiq lightness value that determines when the lightness of color changes from \"dark\" to \"light\". Acceptable values are between 0 and 255.\n$yiq-contrasted-threshold: 150 !default;\n\n// Customize the light and dark text colors for use in our YIQ color contrast function.\n$yiq-text-dark: $gray-900 !default;\n$yiq-text-light: $white !default;\n\n// Options\n//\n// Quickly modify global styling by enabling or disabling optional features.\n\n$enable-caret: true !default;\n$enable-rounded: true !default;\n$enable-shadows: false !default;\n$enable-gradients: false !default;\n$enable-transitions: true !default;\n$enable-hover-media-query: false !default; // Deprecated, no longer affects any compiled CSS\n$enable-grid-classes: true !default;\n$enable-print-styles: true !default;\n\n\n// Spacing\n//\n// Control the default styling of most Bootstrap elements by modifying these\n// variables. Mostly focused on spacing.\n// You can add more entries to the $spacers map, should you need more variation.\n\n$spacer: 1rem !default;\n$spacers: () !default;\n// stylelint-disable-next-line scss/dollar-variable-default\n$spacers: map-merge(\n (\n 0: 0,\n 1: ($spacer * .25),\n 2: ($spacer * .5),\n 3: $spacer,\n 4: ($spacer * 1.5),\n 5: ($spacer * 3)\n ),\n $spacers\n);\n\n// This variable affects the `.h-*` and `.w-*` classes.\n$sizes: () !default;\n// stylelint-disable-next-line scss/dollar-variable-default\n$sizes: map-merge(\n (\n 25: 25%,\n 50: 50%,\n 75: 75%,\n 100: 100%,\n auto: auto\n ),\n $sizes\n);\n\n// Body\n//\n// Settings for the `` element.\n\n$body-bg: $white !default;\n$body-color: $gray-900 !default;\n\n// Links\n//\n// Style anchor elements.\n\n$link-color: theme-color(\"primary\") !default;\n$link-decoration: none !default;\n$link-hover-color: darken($link-color, 15%) !default;\n$link-hover-decoration: underline !default;\n\n// Paragraphs\n//\n// Style p element.\n\n$paragraph-margin-bottom: 1rem !default;\n\n\n// Grid breakpoints\n//\n// Define the minimum dimensions at which your layout will change,\n// adapting to different screen sizes, for use in media queries.\n\n$grid-breakpoints: (\n xs: 0,\n sm: 576px,\n md: 768px,\n lg: 992px,\n xl: 1200px\n) !default;\n\n@include _assert-ascending($grid-breakpoints, \"$grid-breakpoints\");\n@include _assert-starts-at-zero($grid-breakpoints);\n\n\n// Grid containers\n//\n// Define the maximum width of `.container` for different screen sizes.\n\n$container-max-widths: (\n sm: 540px,\n md: 720px,\n lg: 960px,\n xl: 1140px\n) !default;\n\n@include _assert-ascending($container-max-widths, \"$container-max-widths\");\n\n\n// Grid columns\n//\n// Set the number of columns and specify the width of the gutters.\n\n$grid-columns: 12 !default;\n$grid-gutter-width: 30px !default;\n\n// Components\n//\n// Define common padding and border radius sizes and more.\n\n$line-height-lg: 1.5 !default;\n$line-height-sm: 1.5 !default;\n\n$border-width: 1px !default;\n$border-color: $gray-300 !default;\n\n$border-radius: .25rem !default;\n$border-radius-lg: .3rem !default;\n$border-radius-sm: .2rem !default;\n\n$box-shadow-sm: 0 .125rem .25rem rgba($black, .075) !default;\n$box-shadow: 0 .5rem 1rem rgba($black, .15) !default;\n$box-shadow-lg: 0 1rem 3rem rgba($black, .175) !default;\n\n$component-active-color: $white !default;\n$component-active-bg: theme-color(\"primary\") !default;\n\n$caret-width: .3em !default;\n\n$transition-base: all .2s ease-in-out !default;\n$transition-fade: opacity .15s linear !default;\n$transition-collapse: height .35s ease !default;\n\n\n// Fonts\n//\n// Font, line-height, and color for body text, headings, and more.\n\n// stylelint-disable value-keyword-case\n$font-family-sans-serif: -apple-system, BlinkMacSystemFont, \"Segoe UI\", Roboto, \"Helvetica Neue\", Arial, sans-serif, \"Apple Color Emoji\", \"Segoe UI Emoji\", \"Segoe UI Symbol\", \"Noto Color Emoji\" !default;\n$font-family-monospace: SFMono-Regular, Menlo, Monaco, Consolas, \"Liberation Mono\", \"Courier New\", monospace !default;\n$font-family-base: $font-family-sans-serif !default;\n// stylelint-enable value-keyword-case\n\n$font-size-base: 1rem !default; // Assumes the browser default, typically `16px`\n$font-size-lg: ($font-size-base * 1.25) !default;\n$font-size-sm: ($font-size-base * .875) !default;\n\n$font-weight-light: 300 !default;\n$font-weight-normal: 400 !default;\n$font-weight-bold: 700 !default;\n\n$font-weight-base: $font-weight-normal !default;\n$line-height-base: 1.5 !default;\n\n$h1-font-size: $font-size-base * 2.5 !default;\n$h2-font-size: $font-size-base * 2 !default;\n$h3-font-size: $font-size-base * 1.75 !default;\n$h4-font-size: $font-size-base * 1.5 !default;\n$h5-font-size: $font-size-base * 1.25 !default;\n$h6-font-size: $font-size-base !default;\n\n$headings-margin-bottom: ($spacer / 2) !default;\n$headings-font-family: inherit !default;\n$headings-font-weight: 500 !default;\n$headings-line-height: 1.2 !default;\n$headings-color: inherit !default;\n\n$display1-size: 6rem !default;\n$display2-size: 5.5rem !default;\n$display3-size: 4.5rem !default;\n$display4-size: 3.5rem !default;\n\n$display1-weight: 300 !default;\n$display2-weight: 300 !default;\n$display3-weight: 300 !default;\n$display4-weight: 300 !default;\n$display-line-height: $headings-line-height !default;\n\n$lead-font-size: ($font-size-base * 1.25) !default;\n$lead-font-weight: 300 !default;\n\n$small-font-size: 80% !default;\n\n$text-muted: $gray-600 !default;\n\n$blockquote-small-color: $gray-600 !default;\n$blockquote-font-size: ($font-size-base * 1.25) !default;\n\n$hr-border-color: rgba($black, .1) !default;\n$hr-border-width: $border-width !default;\n\n$mark-padding: .2em !default;\n\n$dt-font-weight: $font-weight-bold !default;\n\n$kbd-box-shadow: inset 0 -.1rem 0 rgba($black, .25) !default;\n$nested-kbd-font-weight: $font-weight-bold !default;\n\n$list-inline-padding: .5rem !default;\n\n$mark-bg: #fcf8e3 !default;\n\n$hr-margin-y: $spacer !default;\n\n\n// Tables\n//\n// Customizes the `.table` component with basic values, each used across all table variations.\n\n$table-cell-padding: .75rem !default;\n$table-cell-padding-sm: .3rem !default;\n\n$table-bg: transparent !default;\n$table-accent-bg: rgba($black, .05) !default;\n$table-hover-bg: rgba($black, .075) !default;\n$table-active-bg: $table-hover-bg !default;\n\n$table-border-width: $border-width !default;\n$table-border-color: $gray-300 !default;\n\n$table-head-bg: $gray-200 !default;\n$table-head-color: $gray-700 !default;\n\n$table-dark-bg: $gray-900 !default;\n$table-dark-accent-bg: rgba($white, .05) !default;\n$table-dark-hover-bg: rgba($white, .075) !default;\n$table-dark-border-color: lighten($gray-900, 7.5%) !default;\n$table-dark-color: $body-bg !default;\n\n$table-striped-order: odd !default;\n\n$table-caption-color: $text-muted !default;\n\n// Buttons + Forms\n//\n// Shared variables that are reassigned to `$input-` and `$btn-` specific variables.\n\n$input-btn-padding-y: .375rem !default;\n$input-btn-padding-x: .75rem !default;\n$input-btn-line-height: $line-height-base !default;\n\n$input-btn-focus-width: .2rem !default;\n$input-btn-focus-color: rgba($component-active-bg, .25) !default;\n$input-btn-focus-box-shadow: 0 0 0 $input-btn-focus-width $input-btn-focus-color !default;\n\n$input-btn-padding-y-sm: .25rem !default;\n$input-btn-padding-x-sm: .5rem !default;\n$input-btn-line-height-sm: $line-height-sm !default;\n\n$input-btn-padding-y-lg: .5rem !default;\n$input-btn-padding-x-lg: 1rem !default;\n$input-btn-line-height-lg: $line-height-lg !default;\n\n$input-btn-border-width: $border-width !default;\n\n\n// Buttons\n//\n// For each of Bootstrap's buttons, define text, background, and border color.\n\n$btn-padding-y: $input-btn-padding-y !default;\n$btn-padding-x: $input-btn-padding-x !default;\n$btn-line-height: $input-btn-line-height !default;\n\n$btn-padding-y-sm: $input-btn-padding-y-sm !default;\n$btn-padding-x-sm: $input-btn-padding-x-sm !default;\n$btn-line-height-sm: $input-btn-line-height-sm !default;\n\n$btn-padding-y-lg: $input-btn-padding-y-lg !default;\n$btn-padding-x-lg: $input-btn-padding-x-lg !default;\n$btn-line-height-lg: $input-btn-line-height-lg !default;\n\n$btn-border-width: $input-btn-border-width !default;\n\n$btn-font-weight: $font-weight-normal !default;\n$btn-box-shadow: inset 0 1px 0 rgba($white, .15), 0 1px 1px rgba($black, .075) !default;\n$btn-focus-width: $input-btn-focus-width !default;\n$btn-focus-box-shadow: $input-btn-focus-box-shadow !default;\n$btn-disabled-opacity: .65 !default;\n$btn-active-box-shadow: inset 0 3px 5px rgba($black, .125) !default;\n\n$btn-link-disabled-color: $gray-600 !default;\n\n$btn-block-spacing-y: .5rem !default;\n\n// Allows for customizing button radius independently from global border radius\n$btn-border-radius: $border-radius !default;\n$btn-border-radius-lg: $border-radius-lg !default;\n$btn-border-radius-sm: $border-radius-sm !default;\n\n$btn-transition: color .15s ease-in-out, background-color .15s ease-in-out, border-color .15s ease-in-out, box-shadow .15s ease-in-out !default;\n\n\n// Forms\n\n$label-margin-bottom: .5rem !default;\n\n$input-padding-y: $input-btn-padding-y !default;\n$input-padding-x: $input-btn-padding-x !default;\n$input-line-height: $input-btn-line-height !default;\n\n$input-padding-y-sm: $input-btn-padding-y-sm !default;\n$input-padding-x-sm: $input-btn-padding-x-sm !default;\n$input-line-height-sm: $input-btn-line-height-sm !default;\n\n$input-padding-y-lg: $input-btn-padding-y-lg !default;\n$input-padding-x-lg: $input-btn-padding-x-lg !default;\n$input-line-height-lg: $input-btn-line-height-lg !default;\n\n$input-bg: $white !default;\n$input-disabled-bg: $gray-200 !default;\n\n$input-color: $gray-700 !default;\n$input-border-color: $gray-400 !default;\n$input-border-width: $input-btn-border-width !default;\n$input-box-shadow: inset 0 1px 1px rgba($black, .075) !default;\n\n$input-border-radius: $border-radius !default;\n$input-border-radius-lg: $border-radius-lg !default;\n$input-border-radius-sm: $border-radius-sm !default;\n\n$input-focus-bg: $input-bg !default;\n$input-focus-border-color: lighten($component-active-bg, 25%) !default;\n$input-focus-color: $input-color !default;\n$input-focus-width: $input-btn-focus-width !default;\n$input-focus-box-shadow: $input-btn-focus-box-shadow !default;\n\n$input-placeholder-color: $gray-600 !default;\n$input-plaintext-color: $body-color !default;\n\n$input-height-border: $input-border-width * 2 !default;\n\n$input-height-inner: ($font-size-base * $input-btn-line-height) + ($input-btn-padding-y * 2) !default;\n$input-height: calc(#{$input-height-inner} + #{$input-height-border}) !default;\n\n$input-height-inner-sm: ($font-size-sm * $input-btn-line-height-sm) + ($input-btn-padding-y-sm * 2) !default;\n$input-height-sm: calc(#{$input-height-inner-sm} + #{$input-height-border}) !default;\n\n$input-height-inner-lg: ($font-size-lg * $input-btn-line-height-lg) + ($input-btn-padding-y-lg * 2) !default;\n$input-height-lg: calc(#{$input-height-inner-lg} + #{$input-height-border}) !default;\n\n$input-transition: border-color .15s ease-in-out, box-shadow .15s ease-in-out !default;\n\n$form-text-margin-top: .25rem !default;\n\n$form-check-input-gutter: 1.25rem !default;\n$form-check-input-margin-y: .3rem !default;\n$form-check-input-margin-x: .25rem !default;\n\n$form-check-inline-margin-x: .75rem !default;\n$form-check-inline-input-margin-x: .3125rem !default;\n\n$form-group-margin-bottom: 1rem !default;\n\n$input-group-addon-color: $input-color !default;\n$input-group-addon-bg: $gray-200 !default;\n$input-group-addon-border-color: $input-border-color !default;\n\n$custom-forms-transition: background-color .15s ease-in-out, border-color .15s ease-in-out, box-shadow .15s ease-in-out !default;\n\n$custom-control-gutter: 1.5rem !default;\n$custom-control-spacer-x: 1rem !default;\n\n$custom-control-indicator-size: 1rem !default;\n$custom-control-indicator-bg: $gray-300 !default;\n$custom-control-indicator-bg-size: 50% 50% !default;\n$custom-control-indicator-box-shadow: inset 0 .25rem .25rem rgba($black, .1) !default;\n\n$custom-control-indicator-disabled-bg: $gray-200 !default;\n$custom-control-label-disabled-color: $gray-600 !default;\n\n$custom-control-indicator-checked-color: $component-active-color !default;\n$custom-control-indicator-checked-bg: $component-active-bg !default;\n$custom-control-indicator-checked-disabled-bg: rgba(theme-color(\"primary\"), .5) !default;\n$custom-control-indicator-checked-box-shadow: none !default;\n\n$custom-control-indicator-focus-box-shadow: 0 0 0 1px $body-bg, $input-btn-focus-box-shadow !default;\n\n$custom-control-indicator-active-color: $component-active-color !default;\n$custom-control-indicator-active-bg: lighten($component-active-bg, 35%) !default;\n$custom-control-indicator-active-box-shadow: none !default;\n\n$custom-checkbox-indicator-border-radius: $border-radius !default;\n$custom-checkbox-indicator-icon-checked: str-replace(url(\"data:image/svg+xml;charset=utf8,%3Csvg xmlns='http://www.w3.org/2000/svg' viewBox='0 0 8 8'%3E%3Cpath fill='#{$custom-control-indicator-checked-color}' d='M6.564.75l-3.59 3.612-1.538-1.55L0 4.26 2.974 7.25 8 2.193z'/%3E%3C/svg%3E\"), \"#\", \"%23\") !default;\n\n$custom-checkbox-indicator-indeterminate-bg: $component-active-bg !default;\n$custom-checkbox-indicator-indeterminate-color: $custom-control-indicator-checked-color !default;\n$custom-checkbox-indicator-icon-indeterminate: str-replace(url(\"data:image/svg+xml;charset=utf8,%3Csvg xmlns='http://www.w3.org/2000/svg' viewBox='0 0 4 4'%3E%3Cpath stroke='#{$custom-checkbox-indicator-indeterminate-color}' d='M0 2h4'/%3E%3C/svg%3E\"), \"#\", \"%23\") !default;\n$custom-checkbox-indicator-indeterminate-box-shadow: none !default;\n\n$custom-radio-indicator-border-radius: 50% !default;\n$custom-radio-indicator-icon-checked: str-replace(url(\"data:image/svg+xml;charset=utf8,%3Csvg xmlns='http://www.w3.org/2000/svg' viewBox='-4 -4 8 8'%3E%3Ccircle r='3' fill='#{$custom-control-indicator-checked-color}'/%3E%3C/svg%3E\"), \"#\", \"%23\") !default;\n\n$custom-select-padding-y: .375rem !default;\n$custom-select-padding-x: .75rem !default;\n$custom-select-height: $input-height !default;\n$custom-select-indicator-padding: 1rem !default; // Extra padding to account for the presence of the background-image based indicator\n$custom-select-line-height: $input-btn-line-height !default;\n$custom-select-color: $input-color !default;\n$custom-select-disabled-color: $gray-600 !default;\n$custom-select-bg: $input-bg !default;\n$custom-select-disabled-bg: $gray-200 !default;\n$custom-select-bg-size: 8px 10px !default; // In pixels because image dimensions\n$custom-select-indicator-color: $gray-800 !default;\n$custom-select-indicator: str-replace(url(\"data:image/svg+xml;charset=utf8,%3Csvg xmlns='http://www.w3.org/2000/svg' viewBox='0 0 4 5'%3E%3Cpath fill='#{$custom-select-indicator-color}' d='M2 0L0 2h4zm0 5L0 3h4z'/%3E%3C/svg%3E\"), \"#\", \"%23\") !default;\n$custom-select-border-width: $input-btn-border-width !default;\n$custom-select-border-color: $input-border-color !default;\n$custom-select-border-radius: $border-radius !default;\n$custom-select-box-shadow: inset 0 1px 2px rgba($black, .075) !default;\n\n$custom-select-focus-border-color: $input-focus-border-color !default;\n$custom-select-focus-width: $input-btn-focus-width !default;\n$custom-select-focus-box-shadow: 0 0 0 $custom-select-focus-width rgba($custom-select-focus-border-color, .5) !default;\n\n$custom-select-font-size-sm: 75% !default;\n$custom-select-height-sm: $input-height-sm !default;\n\n$custom-select-font-size-lg: 125% !default;\n$custom-select-height-lg: $input-height-lg !default;\n\n$custom-range-track-width: 100% !default;\n$custom-range-track-height: .5rem !default;\n$custom-range-track-cursor: pointer !default;\n$custom-range-track-bg: $gray-300 !default;\n$custom-range-track-border-radius: 1rem !default;\n$custom-range-track-box-shadow: inset 0 .25rem .25rem rgba($black, .1) !default;\n\n$custom-range-thumb-width: 1rem !default;\n$custom-range-thumb-height: $custom-range-thumb-width !default;\n$custom-range-thumb-bg: $component-active-bg !default;\n$custom-range-thumb-border: 0 !default;\n$custom-range-thumb-border-radius: 1rem !default;\n$custom-range-thumb-box-shadow: 0 .1rem .25rem rgba($black, .1) !default;\n$custom-range-thumb-focus-box-shadow: 0 0 0 1px $body-bg, $input-btn-focus-box-shadow !default;\n$custom-range-thumb-focus-box-shadow-width: $input-btn-focus-width !default; // For focus box shadow issue in IE/Edge\n$custom-range-thumb-active-bg: lighten($component-active-bg, 35%) !default;\n\n$custom-file-height: $input-height !default;\n$custom-file-height-inner: $input-height-inner !default;\n$custom-file-focus-border-color: $input-focus-border-color !default;\n$custom-file-focus-box-shadow: $input-btn-focus-box-shadow !default;\n$custom-file-disabled-bg: $input-disabled-bg !default;\n\n$custom-file-padding-y: $input-btn-padding-y !default;\n$custom-file-padding-x: $input-btn-padding-x !default;\n$custom-file-line-height: $input-btn-line-height !default;\n$custom-file-color: $input-color !default;\n$custom-file-bg: $input-bg !default;\n$custom-file-border-width: $input-btn-border-width !default;\n$custom-file-border-color: $input-border-color !default;\n$custom-file-border-radius: $input-border-radius !default;\n$custom-file-box-shadow: $input-box-shadow !default;\n$custom-file-button-color: $custom-file-color !default;\n$custom-file-button-bg: $input-group-addon-bg !default;\n$custom-file-text: (\n en: \"Browse\"\n) !default;\n\n\n// Form validation\n$form-feedback-margin-top: $form-text-margin-top !default;\n$form-feedback-font-size: $small-font-size !default;\n$form-feedback-valid-color: theme-color(\"success\") !default;\n$form-feedback-invalid-color: theme-color(\"danger\") !default;\n\n\n// Dropdowns\n//\n// Dropdown menu container and contents.\n\n$dropdown-min-width: 10rem !default;\n$dropdown-padding-y: .5rem !default;\n$dropdown-spacer: .125rem !default;\n$dropdown-bg: $white !default;\n$dropdown-border-color: rgba($black, .15) !default;\n$dropdown-border-radius: $border-radius !default;\n$dropdown-border-width: $border-width !default;\n$dropdown-divider-bg: $gray-200 !default;\n$dropdown-box-shadow: 0 .5rem 1rem rgba($black, .175) !default;\n\n$dropdown-link-color: $gray-900 !default;\n$dropdown-link-hover-color: darken($gray-900, 5%) !default;\n$dropdown-link-hover-bg: $gray-100 !default;\n\n$dropdown-link-active-color: $component-active-color !default;\n$dropdown-link-active-bg: $component-active-bg !default;\n\n$dropdown-link-disabled-color: $gray-600 !default;\n\n$dropdown-item-padding-y: .25rem !default;\n$dropdown-item-padding-x: 1.5rem !default;\n\n$dropdown-header-color: $gray-600 !default;\n\n\n// Z-index master list\n//\n// Warning: Avoid customizing these values. They're used for a bird's eye view\n// of components dependent on the z-axis and are designed to all work together.\n\n$zindex-dropdown: 1000 !default;\n$zindex-sticky: 1020 !default;\n$zindex-fixed: 1030 !default;\n$zindex-modal-backdrop: 1040 !default;\n$zindex-modal: 1050 !default;\n$zindex-popover: 1060 !default;\n$zindex-tooltip: 1070 !default;\n\n// Navs\n\n$nav-link-padding-y: .5rem !default;\n$nav-link-padding-x: 1rem !default;\n$nav-link-disabled-color: $gray-600 !default;\n\n$nav-tabs-border-color: $gray-300 !default;\n$nav-tabs-border-width: $border-width !default;\n$nav-tabs-border-radius: $border-radius !default;\n$nav-tabs-link-hover-border-color: $gray-200 $gray-200 $nav-tabs-border-color !default;\n$nav-tabs-link-active-color: $gray-700 !default;\n$nav-tabs-link-active-bg: $body-bg !default;\n$nav-tabs-link-active-border-color: $gray-300 $gray-300 $nav-tabs-link-active-bg !default;\n\n$nav-pills-border-radius: $border-radius !default;\n$nav-pills-link-active-color: $component-active-color !default;\n$nav-pills-link-active-bg: $component-active-bg !default;\n\n$nav-divider-color: $gray-200 !default;\n$nav-divider-margin-y: ($spacer / 2) !default;\n\n// Navbar\n\n$navbar-padding-y: ($spacer / 2) !default;\n$navbar-padding-x: $spacer !default;\n\n$navbar-nav-link-padding-x: .5rem !default;\n\n$navbar-brand-font-size: $font-size-lg !default;\n// Compute the navbar-brand padding-y so the navbar-brand will have the same height as navbar-text and nav-link\n$nav-link-height: ($font-size-base * $line-height-base + $nav-link-padding-y * 2) !default;\n$navbar-brand-height: $navbar-brand-font-size * $line-height-base !default;\n$navbar-brand-padding-y: ($nav-link-height - $navbar-brand-height) / 2 !default;\n\n$navbar-toggler-padding-y: .25rem !default;\n$navbar-toggler-padding-x: .75rem !default;\n$navbar-toggler-font-size: $font-size-lg !default;\n$navbar-toggler-border-radius: $btn-border-radius !default;\n\n$navbar-dark-color: rgba($white, .5) !default;\n$navbar-dark-hover-color: rgba($white, .75) !default;\n$navbar-dark-active-color: $white !default;\n$navbar-dark-disabled-color: rgba($white, .25) !default;\n$navbar-dark-toggler-icon-bg: str-replace(url(\"data:image/svg+xml;charset=utf8,%3Csvg viewBox='0 0 30 30' xmlns='http://www.w3.org/2000/svg'%3E%3Cpath stroke='#{$navbar-dark-color}' stroke-width='2' stroke-linecap='round' stroke-miterlimit='10' d='M4 7h22M4 15h22M4 23h22'/%3E%3C/svg%3E\"), \"#\", \"%23\") !default;\n$navbar-dark-toggler-border-color: rgba($white, .1) !default;\n\n$navbar-light-color: rgba($black, .5) !default;\n$navbar-light-hover-color: rgba($black, .7) !default;\n$navbar-light-active-color: rgba($black, .9) !default;\n$navbar-light-disabled-color: rgba($black, .3) !default;\n$navbar-light-toggler-icon-bg: str-replace(url(\"data:image/svg+xml;charset=utf8,%3Csvg viewBox='0 0 30 30' xmlns='http://www.w3.org/2000/svg'%3E%3Cpath stroke='#{$navbar-light-color}' stroke-width='2' stroke-linecap='round' stroke-miterlimit='10' d='M4 7h22M4 15h22M4 23h22'/%3E%3C/svg%3E\"), \"#\", \"%23\") !default;\n$navbar-light-toggler-border-color: rgba($black, .1) !default;\n\n// Pagination\n\n$pagination-padding-y: .5rem !default;\n$pagination-padding-x: .75rem !default;\n$pagination-padding-y-sm: .25rem !default;\n$pagination-padding-x-sm: .5rem !default;\n$pagination-padding-y-lg: .75rem !default;\n$pagination-padding-x-lg: 1.5rem !default;\n$pagination-line-height: 1.25 !default;\n\n$pagination-color: $link-color !default;\n$pagination-bg: $white !default;\n$pagination-border-width: $border-width !default;\n$pagination-border-color: $gray-300 !default;\n\n$pagination-focus-box-shadow: $input-btn-focus-box-shadow !default;\n$pagination-focus-outline: 0 !default;\n\n$pagination-hover-color: $link-hover-color !default;\n$pagination-hover-bg: $gray-200 !default;\n$pagination-hover-border-color: $gray-300 !default;\n\n$pagination-active-color: $component-active-color !default;\n$pagination-active-bg: $component-active-bg !default;\n$pagination-active-border-color: $pagination-active-bg !default;\n\n$pagination-disabled-color: $gray-600 !default;\n$pagination-disabled-bg: $white !default;\n$pagination-disabled-border-color: $gray-300 !default;\n\n\n// Jumbotron\n\n$jumbotron-padding: 2rem !default;\n$jumbotron-bg: $gray-200 !default;\n\n\n// Cards\n\n$card-spacer-y: .75rem !default;\n$card-spacer-x: 1.25rem !default;\n$card-border-width: $border-width !default;\n$card-border-radius: $border-radius !default;\n$card-border-color: rgba($black, .125) !default;\n$card-inner-border-radius: calc(#{$card-border-radius} - #{$card-border-width}) !default;\n$card-cap-bg: rgba($black, .03) !default;\n$card-bg: $white !default;\n\n$card-img-overlay-padding: 1.25rem !default;\n\n$card-group-margin: ($grid-gutter-width / 2) !default;\n$card-deck-margin: $card-group-margin !default;\n\n$card-columns-count: 3 !default;\n$card-columns-gap: 1.25rem !default;\n$card-columns-margin: $card-spacer-y !default;\n\n\n// Tooltips\n\n$tooltip-font-size: $font-size-sm !default;\n$tooltip-max-width: 200px !default;\n$tooltip-color: $white !default;\n$tooltip-bg: $black !default;\n$tooltip-border-radius: $border-radius !default;\n$tooltip-opacity: .9 !default;\n$tooltip-padding-y: .25rem !default;\n$tooltip-padding-x: .5rem !default;\n$tooltip-margin: 0 !default;\n\n$tooltip-arrow-width: .8rem !default;\n$tooltip-arrow-height: .4rem !default;\n$tooltip-arrow-color: $tooltip-bg !default;\n\n\n// Popovers\n\n$popover-font-size: $font-size-sm !default;\n$popover-bg: $white !default;\n$popover-max-width: 276px !default;\n$popover-border-width: $border-width !default;\n$popover-border-color: rgba($black, .2) !default;\n$popover-border-radius: $border-radius-lg !default;\n$popover-box-shadow: 0 .25rem .5rem rgba($black, .2) !default;\n\n$popover-header-bg: darken($popover-bg, 3%) !default;\n$popover-header-color: $headings-color !default;\n$popover-header-padding-y: .5rem !default;\n$popover-header-padding-x: .75rem !default;\n\n$popover-body-color: $body-color !default;\n$popover-body-padding-y: $popover-header-padding-y !default;\n$popover-body-padding-x: $popover-header-padding-x !default;\n\n$popover-arrow-width: 1rem !default;\n$popover-arrow-height: .5rem !default;\n$popover-arrow-color: $popover-bg !default;\n\n$popover-arrow-outer-color: fade-in($popover-border-color, .05) !default;\n\n\n// Badges\n\n$badge-font-size: 75% !default;\n$badge-font-weight: $font-weight-bold !default;\n$badge-padding-y: .25em !default;\n$badge-padding-x: .4em !default;\n$badge-border-radius: $border-radius !default;\n\n$badge-pill-padding-x: .6em !default;\n// Use a higher than normal value to ensure completely rounded edges when\n// customizing padding or font-size on labels.\n$badge-pill-border-radius: 10rem !default;\n\n\n// Modals\n\n// Padding applied to the modal body\n$modal-inner-padding: 1rem !default;\n\n$modal-dialog-margin: .5rem !default;\n$modal-dialog-margin-y-sm-up: 1.75rem !default;\n\n$modal-title-line-height: $line-height-base !default;\n\n$modal-content-bg: $white !default;\n$modal-content-border-color: rgba($black, .2) !default;\n$modal-content-border-width: $border-width !default;\n$modal-content-border-radius: $border-radius-lg !default;\n$modal-content-box-shadow-xs: 0 .25rem .5rem rgba($black, .5) !default;\n$modal-content-box-shadow-sm-up: 0 .5rem 1rem rgba($black, .5) !default;\n\n$modal-backdrop-bg: $black !default;\n$modal-backdrop-opacity: .5 !default;\n$modal-header-border-color: $gray-200 !default;\n$modal-footer-border-color: $modal-header-border-color !default;\n$modal-header-border-width: $modal-content-border-width !default;\n$modal-footer-border-width: $modal-header-border-width !default;\n$modal-header-padding: 1rem !default;\n\n$modal-lg: 800px !default;\n$modal-md: 500px !default;\n$modal-sm: 300px !default;\n\n$modal-transition: transform .3s ease-out !default;\n\n\n// Alerts\n//\n// Define alert colors, border radius, and padding.\n\n$alert-padding-y: .75rem !default;\n$alert-padding-x: 1.25rem !default;\n$alert-margin-bottom: 1rem !default;\n$alert-border-radius: $border-radius !default;\n$alert-link-font-weight: $font-weight-bold !default;\n$alert-border-width: $border-width !default;\n\n$alert-bg-level: -10 !default;\n$alert-border-level: -9 !default;\n$alert-color-level: 6 !default;\n\n\n// Progress bars\n\n$progress-height: 1rem !default;\n$progress-font-size: ($font-size-base * .75) !default;\n$progress-bg: $gray-200 !default;\n$progress-border-radius: $border-radius !default;\n$progress-box-shadow: inset 0 .1rem .1rem rgba($black, .1) !default;\n$progress-bar-color: $white !default;\n$progress-bar-bg: theme-color(\"primary\") !default;\n$progress-bar-animation-timing: 1s linear infinite !default;\n$progress-bar-transition: width .6s ease !default;\n\n// List group\n\n$list-group-bg: $white !default;\n$list-group-border-color: rgba($black, .125) !default;\n$list-group-border-width: $border-width !default;\n$list-group-border-radius: $border-radius !default;\n\n$list-group-item-padding-y: .75rem !default;\n$list-group-item-padding-x: 1.25rem !default;\n\n$list-group-hover-bg: $gray-100 !default;\n$list-group-active-color: $component-active-color !default;\n$list-group-active-bg: $component-active-bg !default;\n$list-group-active-border-color: $list-group-active-bg !default;\n\n$list-group-disabled-color: $gray-600 !default;\n$list-group-disabled-bg: $list-group-bg !default;\n\n$list-group-action-color: $gray-700 !default;\n$list-group-action-hover-color: $list-group-action-color !default;\n\n$list-group-action-active-color: $body-color !default;\n$list-group-action-active-bg: $gray-200 !default;\n\n\n// Image thumbnails\n\n$thumbnail-padding: .25rem !default;\n$thumbnail-bg: $body-bg !default;\n$thumbnail-border-width: $border-width !default;\n$thumbnail-border-color: $gray-300 !default;\n$thumbnail-border-radius: $border-radius !default;\n$thumbnail-box-shadow: 0 1px 2px rgba($black, .075) !default;\n\n\n// Figures\n\n$figure-caption-font-size: 90% !default;\n$figure-caption-color: $gray-600 !default;\n\n\n// Breadcrumbs\n\n$breadcrumb-padding-y: .75rem !default;\n$breadcrumb-padding-x: 1rem !default;\n$breadcrumb-item-padding: .5rem !default;\n\n$breadcrumb-margin-bottom: 1rem !default;\n\n$breadcrumb-bg: $gray-200 !default;\n$breadcrumb-divider-color: $gray-600 !default;\n$breadcrumb-active-color: $gray-600 !default;\n$breadcrumb-divider: quote(\"/\") !default;\n\n$breadcrumb-border-radius: $border-radius !default;\n\n\n// Carousel\n\n$carousel-control-color: $white !default;\n$carousel-control-width: 15% !default;\n$carousel-control-opacity: .5 !default;\n\n$carousel-indicator-width: 30px !default;\n$carousel-indicator-height: 3px !default;\n$carousel-indicator-spacer: 3px !default;\n$carousel-indicator-active-bg: $white !default;\n\n$carousel-caption-width: 70% !default;\n$carousel-caption-color: $white !default;\n\n$carousel-control-icon-width: 20px !default;\n\n$carousel-control-prev-icon-bg: str-replace(url(\"data:image/svg+xml;charset=utf8,%3Csvg xmlns='http://www.w3.org/2000/svg' fill='#{$carousel-control-color}' viewBox='0 0 8 8'%3E%3Cpath d='M5.25 0l-4 4 4 4 1.5-1.5-2.5-2.5 2.5-2.5-1.5-1.5z'/%3E%3C/svg%3E\"), \"#\", \"%23\") !default;\n$carousel-control-next-icon-bg: str-replace(url(\"data:image/svg+xml;charset=utf8,%3Csvg xmlns='http://www.w3.org/2000/svg' fill='#{$carousel-control-color}' viewBox='0 0 8 8'%3E%3Cpath d='M2.75 0l-1.5 1.5 2.5 2.5-2.5 2.5 1.5 1.5 4-4-4-4z'/%3E%3C/svg%3E\"), \"#\", \"%23\") !default;\n\n$carousel-transition: transform .6s ease !default; // Define transform transition first if using multiple transitions (e.g., `transform 2s ease, opacity .5s ease-out`)\n\n\n// Close\n\n$close-font-size: $font-size-base * 1.5 !default;\n$close-font-weight: $font-weight-bold !default;\n$close-color: $black !default;\n$close-text-shadow: 0 1px 0 $white !default;\n\n// Code\n\n$code-font-size: 87.5% !default;\n$code-color: $pink !default;\n\n$kbd-padding-y: .2rem !default;\n$kbd-padding-x: .4rem !default;\n$kbd-font-size: $code-font-size !default;\n$kbd-color: $white !default;\n$kbd-bg: $gray-900 !default;\n\n$pre-color: $gray-900 !default;\n$pre-scrollable-max-height: 340px !default;\n\n\n// Printing\n$print-page-size: a3 !default;\n$print-body-min-width: map-get($grid-breakpoints, \"lg\") !default;\n","/*!\n * Bootstrap Reboot v4.1.3 (https://getbootstrap.com/)\n * Copyright 2011-2018 The Bootstrap Authors\n * Copyright 2011-2018 Twitter, Inc.\n * Licensed under MIT (https://github.com/twbs/bootstrap/blob/master/LICENSE)\n * Forked from Normalize.css, licensed MIT (https://github.com/necolas/normalize.css/blob/master/LICENSE.md)\n */\n*,\n*::before,\n*::after {\n box-sizing: border-box;\n}\n\nhtml {\n font-family: sans-serif;\n line-height: 1.15;\n -webkit-text-size-adjust: 100%;\n -ms-text-size-adjust: 100%;\n -ms-overflow-style: scrollbar;\n -webkit-tap-highlight-color: rgba(0, 0, 0, 0);\n}\n\n@-ms-viewport {\n width: device-width;\n}\n\narticle, aside, figcaption, figure, footer, header, hgroup, main, nav, section {\n display: block;\n}\n\nbody {\n margin: 0;\n font-family: -apple-system, BlinkMacSystemFont, \"Segoe UI\", Roboto, \"Helvetica Neue\", Arial, sans-serif, \"Apple Color Emoji\", \"Segoe UI Emoji\", \"Segoe UI Symbol\", \"Noto Color Emoji\";\n font-size: 1rem;\n font-weight: 400;\n line-height: 1.5;\n color: #212529;\n text-align: left;\n background-color: #fff;\n}\n\n[tabindex=\"-1\"]:focus {\n outline: 0 !important;\n}\n\nhr {\n box-sizing: content-box;\n height: 0;\n overflow: visible;\n}\n\nh1, h2, h3, h4, h5, h6 {\n margin-top: 0;\n margin-bottom: 0.5rem;\n}\n\np {\n margin-top: 0;\n margin-bottom: 1rem;\n}\n\nabbr[title],\nabbr[data-original-title] {\n text-decoration: underline;\n text-decoration: underline dotted;\n cursor: help;\n border-bottom: 0;\n}\n\naddress {\n margin-bottom: 1rem;\n font-style: normal;\n line-height: inherit;\n}\n\nol,\nul,\ndl {\n margin-top: 0;\n margin-bottom: 1rem;\n}\n\nol ol,\nul ul,\nol ul,\nul ol {\n margin-bottom: 0;\n}\n\ndt {\n font-weight: 700;\n}\n\ndd {\n margin-bottom: .5rem;\n margin-left: 0;\n}\n\nblockquote {\n margin: 0 0 1rem;\n}\n\ndfn {\n font-style: italic;\n}\n\nb,\nstrong {\n font-weight: bolder;\n}\n\nsmall {\n font-size: 80%;\n}\n\nsub,\nsup {\n position: relative;\n font-size: 75%;\n line-height: 0;\n vertical-align: baseline;\n}\n\nsub {\n bottom: -.25em;\n}\n\nsup {\n top: -.5em;\n}\n\na {\n color: #007bff;\n text-decoration: none;\n background-color: transparent;\n -webkit-text-decoration-skip: objects;\n}\n\na:hover {\n color: #0056b3;\n text-decoration: underline;\n}\n\na:not([href]):not([tabindex]) {\n color: inherit;\n text-decoration: none;\n}\n\na:not([href]):not([tabindex]):hover, a:not([href]):not([tabindex]):focus {\n color: inherit;\n text-decoration: none;\n}\n\na:not([href]):not([tabindex]):focus {\n outline: 0;\n}\n\npre,\ncode,\nkbd,\nsamp {\n font-family: SFMono-Regular, Menlo, Monaco, Consolas, \"Liberation Mono\", \"Courier New\", monospace;\n font-size: 1em;\n}\n\npre {\n margin-top: 0;\n margin-bottom: 1rem;\n overflow: auto;\n -ms-overflow-style: scrollbar;\n}\n\nfigure {\n margin: 0 0 1rem;\n}\n\nimg {\n vertical-align: middle;\n border-style: none;\n}\n\nsvg {\n overflow: hidden;\n vertical-align: middle;\n}\n\ntable {\n border-collapse: collapse;\n}\n\ncaption {\n padding-top: 0.75rem;\n padding-bottom: 0.75rem;\n color: #6c757d;\n text-align: left;\n caption-side: bottom;\n}\n\nth {\n text-align: inherit;\n}\n\nlabel {\n display: inline-block;\n margin-bottom: 0.5rem;\n}\n\nbutton {\n border-radius: 0;\n}\n\nbutton:focus {\n outline: 1px dotted;\n outline: 5px auto -webkit-focus-ring-color;\n}\n\ninput,\nbutton,\nselect,\noptgroup,\ntextarea {\n margin: 0;\n font-family: inherit;\n font-size: inherit;\n line-height: inherit;\n}\n\nbutton,\ninput {\n overflow: visible;\n}\n\nbutton,\nselect {\n text-transform: none;\n}\n\nbutton,\nhtml [type=\"button\"],\n[type=\"reset\"],\n[type=\"submit\"] {\n -webkit-appearance: button;\n}\n\nbutton::-moz-focus-inner,\n[type=\"button\"]::-moz-focus-inner,\n[type=\"reset\"]::-moz-focus-inner,\n[type=\"submit\"]::-moz-focus-inner {\n padding: 0;\n border-style: none;\n}\n\ninput[type=\"radio\"],\ninput[type=\"checkbox\"] {\n box-sizing: border-box;\n padding: 0;\n}\n\ninput[type=\"date\"],\ninput[type=\"time\"],\ninput[type=\"datetime-local\"],\ninput[type=\"month\"] {\n -webkit-appearance: listbox;\n}\n\ntextarea {\n overflow: auto;\n resize: vertical;\n}\n\nfieldset {\n min-width: 0;\n padding: 0;\n margin: 0;\n border: 0;\n}\n\nlegend {\n display: block;\n width: 100%;\n max-width: 100%;\n padding: 0;\n margin-bottom: .5rem;\n font-size: 1.5rem;\n line-height: inherit;\n color: inherit;\n white-space: normal;\n}\n\nprogress {\n vertical-align: baseline;\n}\n\n[type=\"number\"]::-webkit-inner-spin-button,\n[type=\"number\"]::-webkit-outer-spin-button {\n height: auto;\n}\n\n[type=\"search\"] {\n outline-offset: -2px;\n -webkit-appearance: none;\n}\n\n[type=\"search\"]::-webkit-search-cancel-button,\n[type=\"search\"]::-webkit-search-decoration {\n -webkit-appearance: none;\n}\n\n::-webkit-file-upload-button {\n font: inherit;\n -webkit-appearance: button;\n}\n\noutput {\n display: inline-block;\n}\n\nsummary {\n display: list-item;\n cursor: pointer;\n}\n\ntemplate {\n display: none;\n}\n\n[hidden] {\n display: none !important;\n}\n\n/*# sourceMappingURL=bootstrap-reboot.css.map */","// Hover mixin and `$enable-hover-media-query` are deprecated.\n//\n// Originally added during our alphas and maintained during betas, this mixin was\n// designed to prevent `:hover` stickiness on iOS-an issue where hover styles\n// would persist after initial touch.\n//\n// For backward compatibility, we've kept these mixins and updated them to\n// always return their regular pseudo-classes instead of a shimmed media query.\n//\n// Issue: https://github.com/twbs/bootstrap/issues/25195\n\n@mixin hover {\n &:hover { @content; }\n}\n\n@mixin hover-focus {\n &:hover,\n &:focus {\n @content;\n }\n}\n\n@mixin plain-hover-focus {\n &,\n &:hover,\n &:focus {\n @content;\n }\n}\n\n@mixin hover-focus-active {\n &:hover,\n &:focus,\n &:active {\n @content;\n }\n}\n"]}
\ No newline at end of file
diff --git a/samples/csharp/clients/directline.web/wwwroot/lib/bootstrap/dist/css/bootstrap-reboot.min.css b/samples/csharp/clients/directline.web/wwwroot/lib/bootstrap/dist/css/bootstrap-reboot.min.css
new file mode 100644
index 0000000000..402715d5d3
--- /dev/null
+++ b/samples/csharp/clients/directline.web/wwwroot/lib/bootstrap/dist/css/bootstrap-reboot.min.css
@@ -0,0 +1,8 @@
+/*!
+ * Bootstrap Reboot v4.1.3 (https://getbootstrap.com/)
+ * Copyright 2011-2018 The Bootstrap Authors
+ * Copyright 2011-2018 Twitter, Inc.
+ * Licensed under MIT (https://github.com/twbs/bootstrap/blob/master/LICENSE)
+ * Forked from Normalize.css, licensed MIT (https://github.com/necolas/normalize.css/blob/master/LICENSE.md)
+ */*,::after,::before{box-sizing:border-box}html{font-family:sans-serif;line-height:1.15;-webkit-text-size-adjust:100%;-ms-text-size-adjust:100%;-ms-overflow-style:scrollbar;-webkit-tap-highlight-color:transparent}@-ms-viewport{width:device-width}article,aside,figcaption,figure,footer,header,hgroup,main,nav,section{display:block}body{margin:0;font-family:-apple-system,BlinkMacSystemFont,"Segoe UI",Roboto,"Helvetica Neue",Arial,sans-serif,"Apple Color Emoji","Segoe UI Emoji","Segoe UI Symbol","Noto Color Emoji";font-size:1rem;font-weight:400;line-height:1.5;color:#212529;text-align:left;background-color:#fff}[tabindex="-1"]:focus{outline:0!important}hr{box-sizing:content-box;height:0;overflow:visible}h1,h2,h3,h4,h5,h6{margin-top:0;margin-bottom:.5rem}p{margin-top:0;margin-bottom:1rem}abbr[data-original-title],abbr[title]{text-decoration:underline;-webkit-text-decoration:underline dotted;text-decoration:underline dotted;cursor:help;border-bottom:0}address{margin-bottom:1rem;font-style:normal;line-height:inherit}dl,ol,ul{margin-top:0;margin-bottom:1rem}ol ol,ol ul,ul ol,ul ul{margin-bottom:0}dt{font-weight:700}dd{margin-bottom:.5rem;margin-left:0}blockquote{margin:0 0 1rem}dfn{font-style:italic}b,strong{font-weight:bolder}small{font-size:80%}sub,sup{position:relative;font-size:75%;line-height:0;vertical-align:baseline}sub{bottom:-.25em}sup{top:-.5em}a{color:#007bff;text-decoration:none;background-color:transparent;-webkit-text-decoration-skip:objects}a:hover{color:#0056b3;text-decoration:underline}a:not([href]):not([tabindex]){color:inherit;text-decoration:none}a:not([href]):not([tabindex]):focus,a:not([href]):not([tabindex]):hover{color:inherit;text-decoration:none}a:not([href]):not([tabindex]):focus{outline:0}code,kbd,pre,samp{font-family:SFMono-Regular,Menlo,Monaco,Consolas,"Liberation Mono","Courier New",monospace;font-size:1em}pre{margin-top:0;margin-bottom:1rem;overflow:auto;-ms-overflow-style:scrollbar}figure{margin:0 0 1rem}img{vertical-align:middle;border-style:none}svg{overflow:hidden;vertical-align:middle}table{border-collapse:collapse}caption{padding-top:.75rem;padding-bottom:.75rem;color:#6c757d;text-align:left;caption-side:bottom}th{text-align:inherit}label{display:inline-block;margin-bottom:.5rem}button{border-radius:0}button:focus{outline:1px dotted;outline:5px auto -webkit-focus-ring-color}button,input,optgroup,select,textarea{margin:0;font-family:inherit;font-size:inherit;line-height:inherit}button,input{overflow:visible}button,select{text-transform:none}[type=reset],[type=submit],button,html [type=button]{-webkit-appearance:button}[type=button]::-moz-focus-inner,[type=reset]::-moz-focus-inner,[type=submit]::-moz-focus-inner,button::-moz-focus-inner{padding:0;border-style:none}input[type=checkbox],input[type=radio]{box-sizing:border-box;padding:0}input[type=date],input[type=datetime-local],input[type=month],input[type=time]{-webkit-appearance:listbox}textarea{overflow:auto;resize:vertical}fieldset{min-width:0;padding:0;margin:0;border:0}legend{display:block;width:100%;max-width:100%;padding:0;margin-bottom:.5rem;font-size:1.5rem;line-height:inherit;color:inherit;white-space:normal}progress{vertical-align:baseline}[type=number]::-webkit-inner-spin-button,[type=number]::-webkit-outer-spin-button{height:auto}[type=search]{outline-offset:-2px;-webkit-appearance:none}[type=search]::-webkit-search-cancel-button,[type=search]::-webkit-search-decoration{-webkit-appearance:none}::-webkit-file-upload-button{font:inherit;-webkit-appearance:button}output{display:inline-block}summary{display:list-item;cursor:pointer}template{display:none}[hidden]{display:none!important}
+/*# sourceMappingURL=bootstrap-reboot.min.css.map */
\ No newline at end of file
diff --git a/samples/csharp/clients/directline.web/wwwroot/lib/bootstrap/dist/css/bootstrap-reboot.min.css.map b/samples/csharp/clients/directline.web/wwwroot/lib/bootstrap/dist/css/bootstrap-reboot.min.css.map
new file mode 100644
index 0000000000..2d7932cdbc
--- /dev/null
+++ b/samples/csharp/clients/directline.web/wwwroot/lib/bootstrap/dist/css/bootstrap-reboot.min.css.map
@@ -0,0 +1 @@
+{"version":3,"sources":["../../scss/bootstrap-reboot.scss","../../scss/_reboot.scss","dist/css/bootstrap-reboot.css","bootstrap-reboot.css","../../scss/mixins/_hover.scss"],"names":[],"mappings":"AAAA;;;;;;ACoBA,ECXA,QADA,SDeE,WAAA,WAGF,KACE,YAAA,WACA,YAAA,KACA,yBAAA,KACA,qBAAA,KACA,mBAAA,UACA,4BAAA,YAKA,cACE,MAAA,aAMJ,QAAA,MAAA,WAAA,OAAA,OAAA,OAAA,OAAA,KAAA,IAAA,QACE,QAAA,MAWF,KACE,OAAA,EACA,YAAA,aAAA,CAAA,kBAAA,CAAA,UAAA,CAAA,MAAA,CAAA,gBAAA,CAAA,KAAA,CAAA,UAAA,CAAA,mBAAA,CAAA,gBAAA,CAAA,iBAAA,CAAA,mBACA,UAAA,KACA,YAAA,IACA,YAAA,IACA,MAAA,QACA,WAAA,KACA,iBAAA,KEvBF,sBFgCE,QAAA,YASF,GACE,WAAA,YACA,OAAA,EACA,SAAA,QAaF,GAAA,GAAA,GAAA,GAAA,GAAA,GACE,WAAA,EACA,cAAA,MAQF,EACE,WAAA,EACA,cAAA,KChDF,0BD0DA,YAEE,gBAAA,UACA,wBAAA,UAAA,OAAA,gBAAA,UAAA,OACA,OAAA,KACA,cAAA,EAGF,QACE,cAAA,KACA,WAAA,OACA,YAAA,QCrDF,GDwDA,GCzDA,GD4DE,WAAA,EACA,cAAA,KAGF,MCxDA,MACA,MAFA,MD6DE,cAAA,EAGF,GACE,YAAA,IAGF,GACE,cAAA,MACA,YAAA,EAGF,WACE,OAAA,EAAA,EAAA,KAGF,IACE,WAAA,OAIF,EC1DA,OD4DE,YAAA,OAIF,MACE,UAAA,IAQF,IChEA,IDkEE,SAAA,SACA,UAAA,IACA,YAAA,EACA,eAAA,SAGF,IAAM,OAAA,OACN,IAAM,IAAA,MAON,EACE,MAAA,QACA,gBAAA,KACA,iBAAA,YACA,6BAAA,QG7LA,QHgME,MAAA,QACA,gBAAA,UAUJ,8BACE,MAAA,QACA,gBAAA,KGzMA,oCAAA,oCH4ME,MAAA,QACA,gBAAA,KANJ,oCAUI,QAAA,EClEJ,KACA,ID0EA,ICzEA,KD6EE,YAAA,cAAA,CAAA,KAAA,CAAA,MAAA,CAAA,QAAA,CAAA,iBAAA,CAAA,aAAA,CAAA,UACA,UAAA,IAGF,IAEE,WAAA,EAEA,cAAA,KAEA,SAAA,KAGA,mBAAA,UAQF,OAEE,OAAA,EAAA,EAAA,KAQF,IACE,eAAA,OACA,aAAA,KAGF,IAGE,SAAA,OACA,eAAA,OAQF,MACE,gBAAA,SAGF,QACE,YAAA,OACA,eAAA,OACA,MAAA,QACA,WAAA,KACA,aAAA,OAGF,GAGE,WAAA,QAQF,MAEE,QAAA,aACA,cAAA,MAMF,OACE,cAAA,EAOF,aACE,QAAA,IAAA,OACA,QAAA,IAAA,KAAA,yBC9GF,ODiHA,MC/GA,SADA,OAEA,SDmHE,OAAA,EACA,YAAA,QACA,UAAA,QACA,YAAA,QAGF,OCjHA,MDmHE,SAAA,QAGF,OCjHA,ODmHE,eAAA,KC7GF,aACA,cDkHA,OCpHA,mBDwHE,mBAAA,OCjHF,gCACA,+BACA,gCDmHA,yBAIE,QAAA,EACA,aAAA,KClHF,qBDqHA,kBAEE,WAAA,WACA,QAAA,EAIF,iBCrHA,2BACA,kBAFA,iBD+HE,mBAAA,QAGF,SACE,SAAA,KAEA,OAAA,SAGF,SAME,UAAA,EAEA,QAAA,EACA,OAAA,EACA,OAAA,EAKF,OACE,QAAA,MACA,MAAA,KACA,UAAA,KACA,QAAA,EACA,cAAA,MACA,UAAA,OACA,YAAA,QACA,MAAA,QACA,YAAA,OAGF,SACE,eAAA,SEnIF,yCDEA,yCDuIE,OAAA,KEpIF,cF4IE,eAAA,KACA,mBAAA,KExIF,4CDEA,yCD+IE,mBAAA,KAQF,6BACE,KAAA,QACA,mBAAA,OAOF,OACE,QAAA,aAGF,QACE,QAAA,UACA,OAAA,QAGF,SACE,QAAA,KErJF,SF2JE,QAAA","sourcesContent":["/*!\n * Bootstrap Reboot v4.1.3 (https://getbootstrap.com/)\n * Copyright 2011-2018 The Bootstrap Authors\n * Copyright 2011-2018 Twitter, Inc.\n * Licensed under MIT (https://github.com/twbs/bootstrap/blob/master/LICENSE)\n * Forked from Normalize.css, licensed MIT (https://github.com/necolas/normalize.css/blob/master/LICENSE.md)\n */\n\n@import \"functions\";\n@import \"variables\";\n@import \"mixins\";\n@import \"reboot\";\n","// stylelint-disable at-rule-no-vendor-prefix, declaration-no-important, selector-no-qualifying-type, property-no-vendor-prefix\n\n// Reboot\n//\n// Normalization of HTML elements, manually forked from Normalize.css to remove\n// styles targeting irrelevant browsers while applying new styles.\n//\n// Normalize is licensed MIT. https://github.com/necolas/normalize.css\n\n\n// Document\n//\n// 1. Change from `box-sizing: content-box` so that `width` is not affected by `padding` or `border`.\n// 2. Change the default font family in all browsers.\n// 3. Correct the line height in all browsers.\n// 4. Prevent adjustments of font size after orientation changes in IE on Windows Phone and in iOS.\n// 5. Setting @viewport causes scrollbars to overlap content in IE11 and Edge, so\n// we force a non-overlapping, non-auto-hiding scrollbar to counteract.\n// 6. Change the default tap highlight to be completely transparent in iOS.\n\n*,\n*::before,\n*::after {\n box-sizing: border-box; // 1\n}\n\nhtml {\n font-family: sans-serif; // 2\n line-height: 1.15; // 3\n -webkit-text-size-adjust: 100%; // 4\n -ms-text-size-adjust: 100%; // 4\n -ms-overflow-style: scrollbar; // 5\n -webkit-tap-highlight-color: rgba($black, 0); // 6\n}\n\n// IE10+ doesn't honor `` in some cases.\n@at-root {\n @-ms-viewport {\n width: device-width;\n }\n}\n\n// stylelint-disable selector-list-comma-newline-after\n// Shim for \"new\" HTML5 structural elements to display correctly (IE10, older browsers)\narticle, aside, figcaption, figure, footer, header, hgroup, main, nav, section {\n display: block;\n}\n// stylelint-enable selector-list-comma-newline-after\n\n// Body\n//\n// 1. Remove the margin in all browsers.\n// 2. As a best practice, apply a default `background-color`.\n// 3. Set an explicit initial text-align value so that we can later use the\n// the `inherit` value on things like `
` elements.\n\nbody {\n margin: 0; // 1\n font-family: $font-family-base;\n font-size: $font-size-base;\n font-weight: $font-weight-base;\n line-height: $line-height-base;\n color: $body-color;\n text-align: left; // 3\n background-color: $body-bg; // 2\n}\n\n// Suppress the focus outline on elements that cannot be accessed via keyboard.\n// This prevents an unwanted focus outline from appearing around elements that\n// might still respond to pointer events.\n//\n// Credit: https://github.com/suitcss/base\n[tabindex=\"-1\"]:focus {\n outline: 0 !important;\n}\n\n\n// Content grouping\n//\n// 1. Add the correct box sizing in Firefox.\n// 2. Show the overflow in Edge and IE.\n\nhr {\n box-sizing: content-box; // 1\n height: 0; // 1\n overflow: visible; // 2\n}\n\n\n//\n// Typography\n//\n\n// Remove top margins from headings\n//\n// By default, `
`-`
` all receive top and bottom margins. We nuke the top\n// margin for easier control within type scales as it avoids margin collapsing.\n// stylelint-disable selector-list-comma-newline-after\nh1, h2, h3, h4, h5, h6 {\n margin-top: 0;\n margin-bottom: $headings-margin-bottom;\n}\n// stylelint-enable selector-list-comma-newline-after\n\n// Reset margins on paragraphs\n//\n// Similarly, the top margin on `
`s get reset. However, we also reset the\n// bottom margin to use `rem` units instead of `em`.\np {\n margin-top: 0;\n margin-bottom: $paragraph-margin-bottom;\n}\n\n// Abbreviations\n//\n// 1. Remove the bottom border in Firefox 39-.\n// 2. Add the correct text decoration in Chrome, Edge, IE, Opera, and Safari.\n// 3. Add explicit cursor to indicate changed behavior.\n// 4. Duplicate behavior to the data-* attribute for our tooltip plugin\n\nabbr[title],\nabbr[data-original-title] { // 4\n text-decoration: underline; // 2\n text-decoration: underline dotted; // 2\n cursor: help; // 3\n border-bottom: 0; // 1\n}\n\naddress {\n margin-bottom: 1rem;\n font-style: normal;\n line-height: inherit;\n}\n\nol,\nul,\ndl {\n margin-top: 0;\n margin-bottom: 1rem;\n}\n\nol ol,\nul ul,\nol ul,\nul ol {\n margin-bottom: 0;\n}\n\ndt {\n font-weight: $dt-font-weight;\n}\n\ndd {\n margin-bottom: .5rem;\n margin-left: 0; // Undo browser default\n}\n\nblockquote {\n margin: 0 0 1rem;\n}\n\ndfn {\n font-style: italic; // Add the correct font style in Android 4.3-\n}\n\n// stylelint-disable font-weight-notation\nb,\nstrong {\n font-weight: bolder; // Add the correct font weight in Chrome, Edge, and Safari\n}\n// stylelint-enable font-weight-notation\n\nsmall {\n font-size: 80%; // Add the correct font size in all browsers\n}\n\n//\n// Prevent `sub` and `sup` elements from affecting the line height in\n// all browsers.\n//\n\nsub,\nsup {\n position: relative;\n font-size: 75%;\n line-height: 0;\n vertical-align: baseline;\n}\n\nsub { bottom: -.25em; }\nsup { top: -.5em; }\n\n\n//\n// Links\n//\n\na {\n color: $link-color;\n text-decoration: $link-decoration;\n background-color: transparent; // Remove the gray background on active links in IE 10.\n -webkit-text-decoration-skip: objects; // Remove gaps in links underline in iOS 8+ and Safari 8+.\n\n @include hover {\n color: $link-hover-color;\n text-decoration: $link-hover-decoration;\n }\n}\n\n// And undo these styles for placeholder links/named anchors (without href)\n// which have not been made explicitly keyboard-focusable (without tabindex).\n// It would be more straightforward to just use a[href] in previous block, but that\n// causes specificity issues in many other styles that are too complex to fix.\n// See https://github.com/twbs/bootstrap/issues/19402\n\na:not([href]):not([tabindex]) {\n color: inherit;\n text-decoration: none;\n\n @include hover-focus {\n color: inherit;\n text-decoration: none;\n }\n\n &:focus {\n outline: 0;\n }\n}\n\n\n//\n// Code\n//\n\npre,\ncode,\nkbd,\nsamp {\n font-family: $font-family-monospace;\n font-size: 1em; // Correct the odd `em` font sizing in all browsers.\n}\n\npre {\n // Remove browser default top margin\n margin-top: 0;\n // Reset browser default of `1em` to use `rem`s\n margin-bottom: 1rem;\n // Don't allow content to break outside\n overflow: auto;\n // We have @viewport set which causes scrollbars to overlap content in IE11 and Edge, so\n // we force a non-overlapping, non-auto-hiding scrollbar to counteract.\n -ms-overflow-style: scrollbar;\n}\n\n\n//\n// Figures\n//\n\nfigure {\n // Apply a consistent margin strategy (matches our type styles).\n margin: 0 0 1rem;\n}\n\n\n//\n// Images and content\n//\n\nimg {\n vertical-align: middle;\n border-style: none; // Remove the border on images inside links in IE 10-.\n}\n\nsvg {\n // Workaround for the SVG overflow bug in IE10/11 is still required.\n // See https://github.com/twbs/bootstrap/issues/26878\n overflow: hidden;\n vertical-align: middle;\n}\n\n\n//\n// Tables\n//\n\ntable {\n border-collapse: collapse; // Prevent double borders\n}\n\ncaption {\n padding-top: $table-cell-padding;\n padding-bottom: $table-cell-padding;\n color: $table-caption-color;\n text-align: left;\n caption-side: bottom;\n}\n\nth {\n // Matches default `
` alignment by inheriting from the ``, or the\n // closest parent with a set `text-align`.\n text-align: inherit;\n}\n\n\n//\n// Forms\n//\n\nlabel {\n // Allow labels to use `margin` for spacing.\n display: inline-block;\n margin-bottom: $label-margin-bottom;\n}\n\n// Remove the default `border-radius` that macOS Chrome adds.\n//\n// Details at https://github.com/twbs/bootstrap/issues/24093\nbutton {\n border-radius: 0;\n}\n\n// Work around a Firefox/IE bug where the transparent `button` background\n// results in a loss of the default `button` focus styles.\n//\n// Credit: https://github.com/suitcss/base/\nbutton:focus {\n outline: 1px dotted;\n outline: 5px auto -webkit-focus-ring-color;\n}\n\ninput,\nbutton,\nselect,\noptgroup,\ntextarea {\n margin: 0; // Remove the margin in Firefox and Safari\n font-family: inherit;\n font-size: inherit;\n line-height: inherit;\n}\n\nbutton,\ninput {\n overflow: visible; // Show the overflow in Edge\n}\n\nbutton,\nselect {\n text-transform: none; // Remove the inheritance of text transform in Firefox\n}\n\n// 1. Prevent a WebKit bug where (2) destroys native `audio` and `video`\n// controls in Android 4.\n// 2. Correct the inability to style clickable types in iOS and Safari.\nbutton,\nhtml [type=\"button\"], // 1\n[type=\"reset\"],\n[type=\"submit\"] {\n -webkit-appearance: button; // 2\n}\n\n// Remove inner border and padding from Firefox, but don't restore the outline like Normalize.\nbutton::-moz-focus-inner,\n[type=\"button\"]::-moz-focus-inner,\n[type=\"reset\"]::-moz-focus-inner,\n[type=\"submit\"]::-moz-focus-inner {\n padding: 0;\n border-style: none;\n}\n\ninput[type=\"radio\"],\ninput[type=\"checkbox\"] {\n box-sizing: border-box; // 1. Add the correct box sizing in IE 10-\n padding: 0; // 2. Remove the padding in IE 10-\n}\n\n\ninput[type=\"date\"],\ninput[type=\"time\"],\ninput[type=\"datetime-local\"],\ninput[type=\"month\"] {\n // Remove the default appearance of temporal inputs to avoid a Mobile Safari\n // bug where setting a custom line-height prevents text from being vertically\n // centered within the input.\n // See https://bugs.webkit.org/show_bug.cgi?id=139848\n // and https://github.com/twbs/bootstrap/issues/11266\n -webkit-appearance: listbox;\n}\n\ntextarea {\n overflow: auto; // Remove the default vertical scrollbar in IE.\n // Textareas should really only resize vertically so they don't break their (horizontal) containers.\n resize: vertical;\n}\n\nfieldset {\n // Browsers set a default `min-width: min-content;` on fieldsets,\n // unlike e.g. `
` elements.\n\nbody {\n margin: 0; // 1\n font-family: $font-family-base;\n font-size: $font-size-base;\n font-weight: $font-weight-base;\n line-height: $line-height-base;\n color: $body-color;\n text-align: left; // 3\n background-color: $body-bg; // 2\n}\n\n// Suppress the focus outline on elements that cannot be accessed via keyboard.\n// This prevents an unwanted focus outline from appearing around elements that\n// might still respond to pointer events.\n//\n// Credit: https://github.com/suitcss/base\n[tabindex=\"-1\"]:focus {\n outline: 0 !important;\n}\n\n\n// Content grouping\n//\n// 1. Add the correct box sizing in Firefox.\n// 2. Show the overflow in Edge and IE.\n\nhr {\n box-sizing: content-box; // 1\n height: 0; // 1\n overflow: visible; // 2\n}\n\n\n//\n// Typography\n//\n\n// Remove top margins from headings\n//\n// By default, `
`-`
` all receive top and bottom margins. We nuke the top\n// margin for easier control within type scales as it avoids margin collapsing.\n// stylelint-disable selector-list-comma-newline-after\nh1, h2, h3, h4, h5, h6 {\n margin-top: 0;\n margin-bottom: $headings-margin-bottom;\n}\n// stylelint-enable selector-list-comma-newline-after\n\n// Reset margins on paragraphs\n//\n// Similarly, the top margin on `
`s get reset. However, we also reset the\n// bottom margin to use `rem` units instead of `em`.\np {\n margin-top: 0;\n margin-bottom: $paragraph-margin-bottom;\n}\n\n// Abbreviations\n//\n// 1. Remove the bottom border in Firefox 39-.\n// 2. Add the correct text decoration in Chrome, Edge, IE, Opera, and Safari.\n// 3. Add explicit cursor to indicate changed behavior.\n// 4. Duplicate behavior to the data-* attribute for our tooltip plugin\n\nabbr[title],\nabbr[data-original-title] { // 4\n text-decoration: underline; // 2\n text-decoration: underline dotted; // 2\n cursor: help; // 3\n border-bottom: 0; // 1\n}\n\naddress {\n margin-bottom: 1rem;\n font-style: normal;\n line-height: inherit;\n}\n\nol,\nul,\ndl {\n margin-top: 0;\n margin-bottom: 1rem;\n}\n\nol ol,\nul ul,\nol ul,\nul ol {\n margin-bottom: 0;\n}\n\ndt {\n font-weight: $dt-font-weight;\n}\n\ndd {\n margin-bottom: .5rem;\n margin-left: 0; // Undo browser default\n}\n\nblockquote {\n margin: 0 0 1rem;\n}\n\ndfn {\n font-style: italic; // Add the correct font style in Android 4.3-\n}\n\n// stylelint-disable font-weight-notation\nb,\nstrong {\n font-weight: bolder; // Add the correct font weight in Chrome, Edge, and Safari\n}\n// stylelint-enable font-weight-notation\n\nsmall {\n font-size: 80%; // Add the correct font size in all browsers\n}\n\n//\n// Prevent `sub` and `sup` elements from affecting the line height in\n// all browsers.\n//\n\nsub,\nsup {\n position: relative;\n font-size: 75%;\n line-height: 0;\n vertical-align: baseline;\n}\n\nsub { bottom: -.25em; }\nsup { top: -.5em; }\n\n\n//\n// Links\n//\n\na {\n color: $link-color;\n text-decoration: $link-decoration;\n background-color: transparent; // Remove the gray background on active links in IE 10.\n -webkit-text-decoration-skip: objects; // Remove gaps in links underline in iOS 8+ and Safari 8+.\n\n @include hover {\n color: $link-hover-color;\n text-decoration: $link-hover-decoration;\n }\n}\n\n// And undo these styles for placeholder links/named anchors (without href)\n// which have not been made explicitly keyboard-focusable (without tabindex).\n// It would be more straightforward to just use a[href] in previous block, but that\n// causes specificity issues in many other styles that are too complex to fix.\n// See https://github.com/twbs/bootstrap/issues/19402\n\na:not([href]):not([tabindex]) {\n color: inherit;\n text-decoration: none;\n\n @include hover-focus {\n color: inherit;\n text-decoration: none;\n }\n\n &:focus {\n outline: 0;\n }\n}\n\n\n//\n// Code\n//\n\npre,\ncode,\nkbd,\nsamp {\n font-family: $font-family-monospace;\n font-size: 1em; // Correct the odd `em` font sizing in all browsers.\n}\n\npre {\n // Remove browser default top margin\n margin-top: 0;\n // Reset browser default of `1em` to use `rem`s\n margin-bottom: 1rem;\n // Don't allow content to break outside\n overflow: auto;\n // We have @viewport set which causes scrollbars to overlap content in IE11 and Edge, so\n // we force a non-overlapping, non-auto-hiding scrollbar to counteract.\n -ms-overflow-style: scrollbar;\n}\n\n\n//\n// Figures\n//\n\nfigure {\n // Apply a consistent margin strategy (matches our type styles).\n margin: 0 0 1rem;\n}\n\n\n//\n// Images and content\n//\n\nimg {\n vertical-align: middle;\n border-style: none; // Remove the border on images inside links in IE 10-.\n}\n\nsvg {\n // Workaround for the SVG overflow bug in IE10/11 is still required.\n // See https://github.com/twbs/bootstrap/issues/26878\n overflow: hidden;\n vertical-align: middle;\n}\n\n\n//\n// Tables\n//\n\ntable {\n border-collapse: collapse; // Prevent double borders\n}\n\ncaption {\n padding-top: $table-cell-padding;\n padding-bottom: $table-cell-padding;\n color: $table-caption-color;\n text-align: left;\n caption-side: bottom;\n}\n\nth {\n // Matches default `
` alignment by inheriting from the ``, or the\n // closest parent with a set `text-align`.\n text-align: inherit;\n}\n\n\n//\n// Forms\n//\n\nlabel {\n // Allow labels to use `margin` for spacing.\n display: inline-block;\n margin-bottom: $label-margin-bottom;\n}\n\n// Remove the default `border-radius` that macOS Chrome adds.\n//\n// Details at https://github.com/twbs/bootstrap/issues/24093\nbutton {\n border-radius: 0;\n}\n\n// Work around a Firefox/IE bug where the transparent `button` background\n// results in a loss of the default `button` focus styles.\n//\n// Credit: https://github.com/suitcss/base/\nbutton:focus {\n outline: 1px dotted;\n outline: 5px auto -webkit-focus-ring-color;\n}\n\ninput,\nbutton,\nselect,\noptgroup,\ntextarea {\n margin: 0; // Remove the margin in Firefox and Safari\n font-family: inherit;\n font-size: inherit;\n line-height: inherit;\n}\n\nbutton,\ninput {\n overflow: visible; // Show the overflow in Edge\n}\n\nbutton,\nselect {\n text-transform: none; // Remove the inheritance of text transform in Firefox\n}\n\n// 1. Prevent a WebKit bug where (2) destroys native `audio` and `video`\n// controls in Android 4.\n// 2. Correct the inability to style clickable types in iOS and Safari.\nbutton,\nhtml [type=\"button\"], // 1\n[type=\"reset\"],\n[type=\"submit\"] {\n -webkit-appearance: button; // 2\n}\n\n// Remove inner border and padding from Firefox, but don't restore the outline like Normalize.\nbutton::-moz-focus-inner,\n[type=\"button\"]::-moz-focus-inner,\n[type=\"reset\"]::-moz-focus-inner,\n[type=\"submit\"]::-moz-focus-inner {\n padding: 0;\n border-style: none;\n}\n\ninput[type=\"radio\"],\ninput[type=\"checkbox\"] {\n box-sizing: border-box; // 1. Add the correct box sizing in IE 10-\n padding: 0; // 2. Remove the padding in IE 10-\n}\n\n\ninput[type=\"date\"],\ninput[type=\"time\"],\ninput[type=\"datetime-local\"],\ninput[type=\"month\"] {\n // Remove the default appearance of temporal inputs to avoid a Mobile Safari\n // bug where setting a custom line-height prevents text from being vertically\n // centered within the input.\n // See https://bugs.webkit.org/show_bug.cgi?id=139848\n // and https://github.com/twbs/bootstrap/issues/11266\n -webkit-appearance: listbox;\n}\n\ntextarea {\n overflow: auto; // Remove the default vertical scrollbar in IE.\n // Textareas should really only resize vertically so they don't break their (horizontal) containers.\n resize: vertical;\n}\n\nfieldset {\n // Browsers set a default `min-width: min-content;` on fieldsets,\n // unlike e.g. `