Revert "Dev to staging; June 7th, 2019"

This reverts commit 53440fc7fe.
This commit is contained in:
Jason Doo 2019-06-10 14:31:30 -07:00
Родитель 53440fc7fe
Коммит efc9295024
1417 изменённых файлов: 17390 добавлений и 19830 удалений

2
.github/CODEOWNERS поставляемый
Просмотреть файл

@ -1,2 +1,2 @@
# At least one of the code owners below will be required on each PR:
* @KirillShchetinin @mohannad-abwah @tejbirsingh @markAtMicrosoft @sibille @mvegaca @dgomezc @smmatte @trevorNgo @crutkas
* @KirillShchetinin @mohannad-abwah @tejbirsingh @markAtMicrosoft @sibille @mvegaca @dgomezc @smmatte @trevorNgo

2
.gitmodules поставляемый
Просмотреть файл

@ -1,4 +1,4 @@
[submodule "src/CoreTemplateStudio"]
path = src/CoreTemplateStudio
url = https://github.com/Microsoft/CoreTemplateStudio.git
branch = dev
branch = master

Просмотреть файл

@ -49,9 +49,9 @@ Every contribution has to come with:
- If you've changed the UI:
- Be sure you are including screenshots to show the changes.
- Be sure you have reviewed the [web accessibility standard](https://www.w3.org/WAI/standards-guidelines/wcag/).
- Be sure you have reviewed the [web accesibility standard](https://www.w3.org/WAI/standards-guidelines/wcag/).
- If you've included a new template, make sure it meets the [web accessibility standard](https://www.w3.org/WAI/standards-guidelines/wcag/) and is compatible with other templates.
- If you've included a new template, make sure it meets the [web accesibility standard](https://www.w3.org/WAI/standards-guidelines/wcag/) and is compatible with other templates.
- You've run all existing tests to make sure you've not broken anything. Manual testing
must be done against all PRs following the testing plan while unit tests are not in place.

Просмотреть файл

@ -1,42 +1,17 @@
# Microsoft Web Template Studio
# Web Template Studio
<img src="https://img.shields.io/badge/platform-linux--64%20%7C%20win--64%20%7C%20osx--64%20-lightgrey.svg" alt="Platforms Supported: MacOSX, Linux, Windows"/> <a href="https://www.repostatus.org/#active"><img src="https://www.repostatus.org/badges/latest/active.svg" alt="Project Status: Active – The project has reached a stable, usable state and is being actively developed." /></a> <a href="LICENSE"><img src="https://img.shields.io/badge/license-MIT-blue.svg" alt="License: We are using the MIT License"></a> <a href="CONTRIBUTING.md"><img src="https://img.shields.io/badge/PRs-Welcome-brightgreen.svg" alt="We are welcoming PRS!"></a>
Microsoft Web Template Studio (_WebTS_) is a Visual Studio Code Extension that accelerates the creation of new web applications using a
wizard-based experience. WebTS enables developers to generate boilerplate code for a web application
by choosing between different front-end frameworks, back-end frameworks, pages and cloud services.
The resulting web app is well-formed, readable code that incorporates cloud services on
Web Template Studio (_WebTS_) is a Visual Studio Code Extension that accelerates the creation of new Web apps using a
wizard-based experience. The resulting Web application is well-formed, readable code that incorporates cloud services on
Azure while implementing proven patterns and best practices. Sprinkled throughout the generated code we have links to
Docs to provide useful insights. WebTS was created using TypeScript and React. Different combinations of generated code
are merged together by [Core Template Studio](https://github.com/Microsoft/CoreTemplateStudio), which was made using .NET Core.
Docs to provide useful insights.
## Build Status
| Branch | Build Status |
| :------ | :-------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------: |
| dev | [![Build Status](https://winappstudio.visualstudio.com/Vegas/_apis/build/status/WebTemplateStudio%20-%20CI%20and%20Deploy?branchName=dev)](https://winappstudio.visualstudio.com/Vegas/_build/latest?definitionId=158&branchName=dev) |
| staging | [![Build Status](https://winappstudio.visualstudio.com/Vegas/_apis/build/status/WebTemplateStudio%20-%20CI%20and%20Deploy?branchName=staging)](https://winappstudio.visualstudio.com/Vegas/_build/latest?definitionId=158&branchName=staging) |
| master | [![Build Status](https://winappstudio.visualstudio.com/Vegas/_apis/build/status/WebTemplateStudio%20-%20CI%20and%20Deploy?branchName=master)](https://winappstudio.visualstudio.com/Vegas/_build/latest?definitionId=158&branchName=master) |
# Documentation
- [Installing the extension](/docs/install.md)
- [Getting started with the codebase](/docs/getting-started-developers.md)
- [Terminology for developers](/docs/terminology.md)
## SHA256
Visual Studio Code extensions are currently not signed. WebTS provides the Secure Hash Algorithm (SHA) of each version we publish. You can find the current extensions sha256 value in the following files:
- Dev-nightly: [sha256-dev-nightly.md](sha256-dev-nightly.md)
To verify the integrity of the package, download the vsix from the Marketplace, calculate the hash of the package using the powershell command Get-FileHash or any other tool that allows you to calculate the packages hash, and compare both.
## Instruction To Use
- Open **VSCode**
- Press `ctrl+shift+p` in Windows/Linux or `⇧⌘P` in Mac to open VSCode's extension launcher
- Type/Select `Web Template Studio: Launch` and press `Enter` to launch the extension
| Branch | Build Status |
| :------ | :-----------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------: |
| dev | [![Build Status](https://microsoftgarage.visualstudio.com/Intern%20GitHub/_apis/build/status/Web-Template-Studio-DevCI/WebTemplateStudio%20-%20CI%20and%20Deploy?branchName=dev)](https://microsoftgarage.visualstudio.com/Intern%20GitHub/_build/latest?definitionId=275&branchName=dev) |
| staging | [![Build Status](https://microsoftgarage.visualstudio.com/Intern%20GitHub/_apis/build/status/Web-Template-Studio-DevCI/WebTemplateStudio%20-%20CI%20and%20Deploy?branchName=staging)](https://microsoftgarage.visualstudio.com/Intern%20GitHub/_build/latest?definitionId=275&branchName=staging) |
| master | [![Build Status](https://microsoftgarage.visualstudio.com/Intern%20GitHub/_apis/build/status/Web-Template-Studio-DevCI/WebTemplateStudio%20-%20CI%20and%20Deploy?branchName=master)](https://microsoftgarage.visualstudio.com/Intern%20GitHub/_build/latest?definitionId=275&branchName=master) |
# Documentation
@ -51,7 +26,7 @@ To verify the integrity of the package, download the vsix from the Marketplace,
## Example Scenario
I need a full-stack web app that stores data in a Cosmos database.
I need a Fullstack web app that stores blog posts in a Cosmos database.
![Readme-app-screenshot](./docs/resources/readme-app-screenshot.png)
@ -70,39 +45,25 @@ Once you make the selections you want and click generate, you can quickly extend
Please use [GitHub issues](https://github.com/Microsoft/WebTemplateStudio/issues) for feedback, questions or comments.
If you have specific feature requests or would like to vote on what others are recommending, please go to the [GitHub issues](https://github.com/Microsoft/WebTemplateStudio/issues) section as well. We would love to see what you are thinking.
If you have specific feature requests or would like to vote on what others are recommending, please go to the [GitHub issues](https://github.com/Microsoft/WebTemplateStudio/issues) section as well. We would love to see what you are thinking.
We are still extremely early in development and are looking for feedback for roadmap. Currently we are in the process of stabilizing our React / Node.js golden path.
We are still extremely early in development and are looking for feedback for roadmap. Currently we are in the process of stabilizing our React / Node.js golden path.
## Contributing
Do you want to contribute? We would love to have you help out. Here are our [contribution guidelines](CONTRIBUTING.md).
## Reporting Security Issues
Security issues and bugs should be reported privately, via email, to the Microsoft Security Response Center (MSRC) at secure@microsoft.com. You should receive a response within 24 hours. If for some reason you do not, please follow up via email to ensure we received your original message. Further information, including the MSRC PGP key, can be found in the Security TechCenter.
## License
This code is distributed under the terms and conditions of the [MIT license](LICENSE.md).
## Privacy Statement
# Privacy Statement
The extension does [log basic telemetry](docs/telemetry.md) for what is being selected. We are in the process of creating a [Telemetry Data](docs/telemetryData.md) page to summarize usage trends. Please read the [Microsoft privacy statement](http://go.microsoft.com/fwlink/?LinkId=521839) for more information.
## Frameworks in Generated Code Not Created by Our Team
## Frameworks and libraries in generated code not created by our team
**Frameworks**
- [TBD](https://github.com/)
- [React](https://reactjs.org/)
- [Create-React-App](https://github.com/facebook/create-react-app)
- [Express](https://expressjs.com/)
- [Express Generator](https://expressjs.com/en/starter/generator.html)
- [Bootstrap](https://getbootstrap.com/)
- [Angular](https://angular.io/)
- [Angular CLI](https://angular.io/cli)
- [Vue](https://vuejs.org/)
- [Vue CLI](https://cli.vuejs.org/)
- [Node.js](https://nodejs.org/en/)
## Acknowledgments
Microsoft Web Template Studio was [initially created by Microsoft Garage interns](docs/acknowledgments.md). We hope many more continue with the project
**Libraries**
- [TBD](https://github.com/)

Просмотреть файл

@ -1,6 +0,0 @@
<?xml version="1.0" encoding="utf-8" ?>
<SignConfigXML>
<job platform="" configuration="release" dest="" jobname="WebTemplateStudio Sign" approvers="crutkas;ralarcon">
<file src="__INPATHROOT__\dist\webts-0.0.0-UNTRACKEDVERSION.vsix" signType="100040160" dest="__OUTPATHROOT__\dist\webts-0.0.0-UNTRACKEDVERSION.vsix" />
</job>
</SignConfigXML>

Просмотреть файл

@ -1,31 +0,0 @@
# Accessibility
The generated code was tested against [Accessibility Insights](https://accessibilityinsights.io/) and [Lighthouse](https://developers.google.com/web/tools/lighthouse/) to ensure web accessibility standards were met. The full assessment through Accessibility Insights was used to measure compliance against the [Web Content Accessibility Guidelines](https://www.w3.org/WAI/WCAG21/quickref/?currentsidebar=%23col_overview&versions=2.0&levels=aaa) (WCAG) 2.0 Level AA Success Criteria. Please ensure all pull requests meet the [WCAG](https://www.w3.org/WAI/WCAG21/quickref/?currentsidebar=%23col_overview&versions=2.0&levels=aaa) success criteria with the exception of [WCAG 2.4.5](https://www.w3.org/WAI/WCAG21/Understanding/multiple-ways.html).
## Results
The following test results hold as of April 23, 2019.
| React | Lighthouse | Accessibility Insights Fast Pass | Accessibility Insights Assessment |
|----------------|-------------|-----------------------------------|------------------------------------|
| Grid | 100% | Pass | Pass with exception WCAG 2.4.5 |
| List | 100% | Pass | Pass with exception WCAG 2.4.5 |
| Master Detail | 100% | Pass | Pass with exception WCAG 2.4.5 |
| Blank | 100% | Pass | Pass with exception WCAG 2.4.5 |
<br/>
| Angular | Lighthouse | Accessibility Insights Fast Pass | Accessibility Insights Assessment |
|----------------|-------------|-----------------------------------|------------------------------------|
| Grid | 100% | Pass | Pass with exception WCAG 2.4.5 |
| List | 100% | Pass | Pass with exception WCAG 2.4.5 |
| Master Detail | 100% | Pass | Pass with exception WCAG 2.4.5 |
| Blank | 100% | Pass | Pass with exception WCAG 2.4.5 |
## Exceptions:
[WCAG 2.4.5 Multiple Ways (Level AA)](https://www.w3.org/WAI/WCAG21/Understanding/multiple-ways.html):
More than one way is available to locate a web page within a set of web pages except where the Web Page is the result of, or a step in, a process.
In order to make the generated code as easy to build off of as possible the only form of navigation included in the generated code is the navbar. Developers who build off of the generated code are encouraged to add a second form of navigation (preferably site search) to ensure that the web app is fully compliant with WCAG 2.0 Level AA Success Criteria.

Просмотреть файл

@ -1,33 +0,0 @@
# Acknowledgments
Microsoft Web Template Studio was initially built by a great group of interns from the Microsoft Garage. This full list of individuals that helped build the project during the first quarter of 2019.
**Design Intern**
[Jimmy Hsu](https://www.linkedin.com/in/jimmy-hsu-650b7bbb/)
**Developer Interns**
[Amr Sharaf](https://www.linkedin.com/in/amr-sharaf/),
[Danish Dua](https://www.linkedin.com/in/dandua98/),
[Kai Bailey](https://www.linkedin.com/in/kai-bailey/),
[Kelly Ng](https://www.linkedin.com/in/ngkelly3/),
[Sahil Tara](https://www.linkedin.com/in/sahiltara/),
[Trevor Ngo](https://www.linkedin.com/in/trevor-ngo-vy/)
**Project Manager Intern**
[Imho Traore](https://www.linkedin.com/in/imho-traore/)
**Coaches**
[Kirill Shchetynin](https://github.com/KirillShchetinin),
[Lucas Wang](https://www.linkedin.com/in/uxfool/),
[Mark Schramm](https://www.linkedin.com/in/markschramm/),
[Mohannad Abwah](https://www.linkedin.com/in/mohannad-abwah-1156944a/),
[Tejbir Sodhan](https://www.linkedin.com/in/tejbirsodhan/)
**Program Managers**
[Clint Rutkas](https://www.linkedin.com/in/clintrutkas/),
[Stephane Morichere-Matte](https://www.linkedin.com/in/stephanemoricherematte/)

Просмотреть файл

@ -1,69 +0,0 @@
Web Template Studio is a [Visual Studio Code Extension](https://code.visualstudio.com/api) built in [Typescript](https://www.typescriptlang.org/)/[React.js](https://reactjs.org/). It leverages the templating engine ([Core Template Studio](https://github.com/Microsoft/CoreTemplateStudio)) used by [Windows Template Studio](https://github.com/Microsoft/WindowsTemplateStudio). For more info on the terminology, please refer to the [terminology document](./terminology.md).
[Core Template Studio](https://github.com/Microsoft/CoreTemplateStudio) serves both Web and Windows Template Studios in merging the templates selected by the user. For more information on Core Template Studio, refer to its [documentation](https://github.com/Microsoft/CoreTemplateStudio/blob/dev/docs/getting-started-developers.md).
[Web Template Studio](https://github.com/Microsoft/WebTemplateStudio) has two major components. The extension's backend (referred to as the [extension](https://github.com/Microsoft/WebTemplateStudio/tree/dev/src/extension)), which is written in [Typescript](https://www.typescriptlang.org/) and the front-end wizard (referred to as the [client](https://github.com/Microsoft/WebTemplateStudio/tree/dev/src/client)), written in [React.tsx](https://www.typescriptlang.org/docs/handbook/jsx.html).
Here is a diagram that illustrates the high level functionality of each of the components:
![Architecture Diagram](./arch-diagram.png)
Before the extension is ready to run, the build script compiles the wizard's React code into JavaScript that gets injected into html, which then gets served using [VSCode's Webview API](https://code.visualstudio.com/api/extension-guides/webview). Visit [this page](https://github.com/Microsoft/WebTemplateStudio/blob/dev/docs/install.md) to know more about how to run the extension. As the extension is launching, it starts up the Engine (which will by default run on PORT 9502) and updates the cache with the updated templates (if any were added). The Engine will keep listening to the extension's requests such as generation, etc.
The two components will be discussed separately later. There are a few important concepts that will help you get started on development quickly:
## **Communication**
The wizard runs in an isolated environment, and mimics how applications run on a browser. For example, the wizard does not have access to the local storage of the user, or any of the OS's resources/actions. For this reason, most of the logic is done in the extension. The wizard communicates with the extension using the WebView API, with a command defined for each function (look at the extension's constants file and the wizard's constants file to see the currently defined commands).
For example, if we want to send the email of a user from the extension to the wizard, you can use the VSCode object to do so:
```js
vscode.postMessage({
command: "sendEmailCommand",
payload: {
email: "example@email.com"
}
});
```
This sends the email using the WebView API and
```js
panel.webview.onDidReceiveMessage(
message => {
switch (message.command) {
case "sendEmailCommand":
// message.payload.email = example@email.com
return;
// other commands
}
},
undefined,
undefined
);
```
receives the email.
We receive all the commands from the extension in [App.tsx](https://github.com/Microsoft/WebTemplateStudio/blob/dev/src/client/src/App.tsx) and receive all the commands from the wizard in the [controller.ts](https://github.com/Microsoft/WebTemplateStudio/blob/dev/src/extension/src/controller.ts). You will find the documentation very helpful if you need more info on the Webview API.
## **Separating the UI from the Logic**:
One of our main concerns is increasing the speed of the wizard and making it as light as possible. Therefore, the wizard does not perform any expensive computations, and does not make any API requests. Most of these actions are done in the extension. So as the user navigates through the wizard, the selections are validated in the wizard and stored. When the user clicks generate, these selections will then be sent to the extension, which will deal with them synchronously. The extension starts with the templates (if any were selected), which will get sent to the Engine (Core Template Studio). After their successful generation, the extension uses Azure SDK to deploy the resources if the user selects any.
We will briefly discuss the architecture of the extension and the wizard:
## **Client**:
As previously mentioned, the client is written in React.js. It keeps track of the state using Redux. If you are not familiar with Redux, we suggest familiarizing yourself with it before you start development on the wizard.
## **Extension**:
TODO: Explain the architecture of the extension and the key concepts to contribute.
The extension back-end is responsible for running all services pertaining to the core experience. This includes launching the VS Code WebView React Panel, hosting the core template generation engine and enabling functionality with the Azure Cloud Computing Platform.
To communicate with the user-facing React Wizard, VS Code extension API exposes the `PostMessage()` function to communicate with the extension and vice versa. The behavior of a received message from the wizard is defined in a function delegate that gets passed to the ReactPanel from the controller.
The controller acts as a router to and for behavior. The flow of command from client starts when the `postMessage()` gets called in the client and the reactpanel object in the extension receives it. With the argument payload `message: any` from the client, there is a property specified within message called `module`. This tells the controller which service module the message payload should be routed to.
For more details about how to make specific contributions to the project (adding templates, services, etc.) please refer to the [FAQ](./faq.md) section.

Двоичные данные
docs/arch-diagram.png

Двоичный файл не отображается.

До

Ширина:  |  Высота:  |  Размер: 145 KiB

Просмотреть файл

@ -1,23 +0,0 @@
## The purpose of this document is to provide guidance on how to make large contributions that involve more than one component.
## **FAQs**:
1. **How can I add functionality for another Azure Cloud Service like SQL Server?**
Before you start working on a service, make sure it does not conflict with any of our contribution [guidelines](https://github.com/Microsoft/WebTemplateStudio/blob/dev/CONTRIBUTING.md). To implement the functionality of a new service in the extension, make sure you familiarize yourself with how Cosmos DB is deployed in the [AzureServices](https://github.com/Microsoft/WebTemplateStudio/blob/dev/src/extension/src/azure/azureServices.ts) class. Typically, every service will have a directory with its name (for example azure-sql) in the [azure](https://github.com/Microsoft/WebTemplateStudio/tree/dev/src/extension/src/azure) directory (assuming it is an Azure Service). The class should define functions that handle the service's deployment details. You should then define a function in AzureServices class that deals with the deployment (for example deploySQLServer). Since this function will be called on a command, it needs to implement the interface for command functions.
```
public static async deploySQLServer(message: any): Promise<IPayloadResponse>
```
where [message] is the message which contains the command that will call this function. Therefore, you can access the message attributes to access the received info (example: message.subscription).
This function can utilize methods you defined in the service's directory.
You should then define a command, on which your deploy function will get called. To add a command, go to constants.ts and add a command in ExtensionCommands. After adding a command in constants, add an entry in the AzureServices map where each entry's key is the command and each entry's value is the function. Assuming you receive the right info, your function will run everytime the extension receives the command you specified in the map.
2. **How can I add a card for another service in the wizard?**
If you are not familiar with React-Redux. We suggest familarizing yourself with it before contributing to the wizard.
To add a card for a service, you need to define that option in azureServiceOptions. We suggest you use the wizard a few times in the dev environment to understand the workflow of adding a service in the wizard.
At a high level is the objects in azureServiceOptions get mapped to the Card component. The mapping takes place in AzureSubscriptions container. We recommend you add a details page to every service since our target audience includes beginner developers.

Просмотреть файл

@ -53,7 +53,7 @@ installed by anyone who has VSCode using the command in the extension directory:
code --install-extension [extensionName].vsix
```
`webts-0.0.0-UNTRACKEDVERSION.vsix` is the default extensionName.
`wts-0.0.0-UNTRACKEDVERSION.vsix` is the default extensionName.
Alternatively, copy the extension into your extensions directory. For _Windows_, it is
`%USERPROFILE%\.vscode\extensions`. For _Mac/Linux_, it is `~/.vscode/extensions` (By Default).

Просмотреть файл

@ -3,15 +3,9 @@
## Prerequisites
Web Template Studio runs as a VSCode extension and hence you'll need to have _VScode_ version 1.33 or above installed.
Also, you'll need [_Node_](https://nodejs.org/en/download/) and _npm_/[_yarn_](https://yarnpkg.com/en/docs/install) to run the generated templates.
Also, you'll need _Node_ and _npm_/_yarn_ to run the generated templates.
## Where is the offical release?
We are currently early in our development phase and only have a dev nightly on Visual Studio Marketplace.
## Installing the nightly dev branch build _preferred_
Head over to [Visual Studio Marketplaces Web Template Studio page](https://marketplace.visualstudio.com/items?itemName=WASTeamAccount.WebTemplateStudio-dev-nightly) and click "[install](vscode:extension/WASTeamAccount.WebTemplateStudio-dev-nightly)" 😊.
## Installing the latest Microsoft Web Template Studio release manually
## Installing the latest Microsoft Web Template Studio Release
1. Get the latest release from Web Template Studio [Github releases](https://github.com/Microsoft/WebTemplateStudio/releases)
2. Scroll down to _Assets_ and download the `.vsix` file

Двоичные данные
docs/resources/readme-app-screenshot.png

Двоичный файл не отображается.

До

Ширина:  |  Высота:  |  Размер: 72 KiB

После

Ширина:  |  Высота:  |  Размер: 92 KiB

Просмотреть файл

@ -17,7 +17,7 @@
"react": "^16.8.4",
"react-dom": "^16.8.4",
"react-router-dom": "^4.3.1",
"react-scripts": "3.0.1",
"react-scripts": "2.1.8",
"uuid": "^3.3.2"
},
"devDependencies": {

Просмотреть файл

@ -2,6 +2,18 @@
# yarn lockfile v1
"@types/babel-types@*", "@types/babel-types@^7.0.0":
version "7.0.6"
resolved "https://registry.yarnpkg.com/@types/babel-types/-/babel-types-7.0.6.tgz#a7cfaaeee96e90c4c54da0e580aaff3f4cffacac"
integrity sha512-8zYZyy2kgwBXdz2j8Ix7LOghGiZbOiHf6vqmmBX1r76FdAzVNv7cODyJTEglUWiOdRnXh0s/o58neUwv5vaitQ==
"@types/babylon@^6.16.2":
version "6.16.5"
resolved "https://registry.yarnpkg.com/@types/babylon/-/babylon-6.16.5.tgz#1c5641db69eb8cdf378edd25b4be7754beeb48b4"
integrity sha512-xH2e58elpj1X4ynnKp9qSnWlsRTIs6n3tgLGNfwAGHwePw0mulHQllV34n0T25uYSu1k0hRKkWXF890B1yS47w==
dependencies:
"@types/babel-types" "*"
accepts@~1.3.5:
version "1.3.5"
resolved "https://registry.yarnpkg.com/accepts/-/accepts-1.3.5.tgz#eb777df6011723a3b14e8a72c0805c8e86746bd2"
@ -10,11 +22,47 @@ accepts@~1.3.5:
mime-types "~2.1.18"
negotiator "0.6.1"
acorn-globals@^3.0.0:
version "3.1.0"
resolved "https://registry.yarnpkg.com/acorn-globals/-/acorn-globals-3.1.0.tgz#fd8270f71fbb4996b004fa880ee5d46573a731bf"
integrity sha1-/YJw9x+7SZawBPqIDuXUZXOnMb8=
dependencies:
acorn "^4.0.4"
acorn@^3.1.0:
version "3.3.0"
resolved "https://registry.yarnpkg.com/acorn/-/acorn-3.3.0.tgz#45e37fb39e8da3f25baee3ff5369e2bb5f22017a"
integrity sha1-ReN/s56No/JbruP/U2niu18iAXo=
acorn@^4.0.4, acorn@~4.0.2:
version "4.0.13"
resolved "https://registry.yarnpkg.com/acorn/-/acorn-4.0.13.tgz#105495ae5361d697bd195c825192e1ad7f253787"
integrity sha1-EFSVrlNh1pe9GVyCUZLhrX8lN4c=
align-text@^0.1.1, align-text@^0.1.3:
version "0.1.4"
resolved "https://registry.yarnpkg.com/align-text/-/align-text-0.1.4.tgz#0cd90a561093f35d0a99256c22b7069433fad117"
integrity sha1-DNkKVhCT810KmSVsIrcGlDP60Rc=
dependencies:
kind-of "^3.0.2"
longest "^1.0.1"
repeat-string "^1.5.2"
amdefine@>=0.0.4:
version "1.0.1"
resolved "https://registry.yarnpkg.com/amdefine/-/amdefine-1.0.1.tgz#4a5282ac164729e93619bcfd3ad151f817ce91f5"
integrity sha1-SlKCrBZHKek2Gbz9OtFR+BfOkfU=
array-flatten@1.1.1:
version "1.1.1"
resolved "https://registry.yarnpkg.com/array-flatten/-/array-flatten-1.1.1.tgz#9a5f699051b1e7073328f2a008968b64ea2955d2"
integrity sha1-ml9pkFGx5wczKPKgCJaLZOopVdI=
asap@~2.0.3:
version "2.0.6"
resolved "https://registry.yarnpkg.com/asap/-/asap-2.0.6.tgz#e50347611d7e690943208bbdafebcbc2fb866d46"
integrity sha1-5QNHYR1+aQlDIIu9r+vLwvuGbUY=
async@2.6.1:
version "2.6.1"
resolved "https://registry.yarnpkg.com/async/-/async-2.6.1.tgz#b245a23ca71930044ec53fa46aa00a3e87c6a610"
@ -22,6 +70,29 @@ async@2.6.1:
dependencies:
lodash "^4.17.10"
babel-runtime@^6.26.0:
version "6.26.0"
resolved "https://registry.yarnpkg.com/babel-runtime/-/babel-runtime-6.26.0.tgz#965c7058668e82b55d7bfe04ff2337bc8b5647fe"
integrity sha1-llxwWGaOgrVde/4E/yM3vItWR/4=
dependencies:
core-js "^2.4.0"
regenerator-runtime "^0.11.0"
babel-types@^6.26.0:
version "6.26.0"
resolved "https://registry.yarnpkg.com/babel-types/-/babel-types-6.26.0.tgz#a3b073f94ab49eb6fa55cd65227a334380632497"
integrity sha1-o7Bz+Uq0nrb6Vc1lInozQ4BjJJc=
dependencies:
babel-runtime "^6.26.0"
esutils "^2.0.2"
lodash "^4.17.4"
to-fast-properties "^1.0.3"
babylon@^6.18.0:
version "6.18.0"
resolved "https://registry.yarnpkg.com/babylon/-/babylon-6.18.0.tgz#af2f3b88fa6f5c1e4c634d1a0f8eac4f55b395e3"
integrity sha512-q/UEjfGJ2Cm3oKV71DJz9d25TPnq5rhBVL2Q4fA5wcC3jcrdn7+SssEybFIxwAvvP+YCsCYNKughoF33GxgycQ==
basic-auth@~2.0.0:
version "2.0.1"
resolved "https://registry.yarnpkg.com/basic-auth/-/basic-auth-2.0.1.tgz#b998279bf47ce38344b4f3cf916d4679bbf51e3a"
@ -60,6 +131,60 @@ bytes@3.0.0:
resolved "https://registry.yarnpkg.com/bytes/-/bytes-3.0.0.tgz#d32815404d689699f85a4ea4fa8755dd13a96048"
integrity sha1-0ygVQE1olpn4Wk6k+odV3ROpYEg=
camelcase@^1.0.2:
version "1.2.1"
resolved "https://registry.yarnpkg.com/camelcase/-/camelcase-1.2.1.tgz#9bb5304d2e0b56698b2c758b08a3eaa9daa58a39"
integrity sha1-m7UwTS4LVmmLLHWLCKPqqdqlijk=
center-align@^0.1.1:
version "0.1.3"
resolved "https://registry.yarnpkg.com/center-align/-/center-align-0.1.3.tgz#aa0d32629b6ee972200411cbd4461c907bc2b7ad"
integrity sha1-qg0yYptu6XIgBBHL1EYckHvCt60=
dependencies:
align-text "^0.1.3"
lazy-cache "^1.0.3"
character-parser@^2.1.1:
version "2.2.0"
resolved "https://registry.yarnpkg.com/character-parser/-/character-parser-2.2.0.tgz#c7ce28f36d4bcd9744e5ffc2c5fcde1c73261fc0"
integrity sha1-x84o821LzZdE5f/CxfzeHHMmH8A=
dependencies:
is-regex "^1.0.3"
clean-css@^3.3.0:
version "3.4.28"
resolved "https://registry.yarnpkg.com/clean-css/-/clean-css-3.4.28.tgz#bf1945e82fc808f55695e6ddeaec01400efd03ff"
integrity sha1-vxlF6C/ICPVWlebd6uwBQA79A/8=
dependencies:
commander "2.8.x"
source-map "0.4.x"
cliui@^2.1.0:
version "2.1.0"
resolved "https://registry.yarnpkg.com/cliui/-/cliui-2.1.0.tgz#4b475760ff80264c762c3a1719032e91c7fea0d1"
integrity sha1-S0dXYP+AJkx2LDoXGQMukcf+oNE=
dependencies:
center-align "^0.1.1"
right-align "^0.1.1"
wordwrap "0.0.2"
commander@2.8.x:
version "2.8.1"
resolved "https://registry.yarnpkg.com/commander/-/commander-2.8.1.tgz#06be367febfda0c330aa1e2a072d3dc9762425d4"
integrity sha1-Br42f+v9oMMwqh4qBy09yXYkJdQ=
dependencies:
graceful-readlink ">= 1.0.0"
constantinople@^3.0.1:
version "3.1.2"
resolved "https://registry.yarnpkg.com/constantinople/-/constantinople-3.1.2.tgz#d45ed724f57d3d10500017a7d3a889c1381ae647"
integrity sha512-yePcBqEFhLOqSBtwYOGGS1exHo/s1xjekXiinh4itpNQGCu4KA1euPh1fg07N2wMITZXQkBz75Ntdt1ctGZouw==
dependencies:
"@types/babel-types" "^7.0.0"
"@types/babylon" "^6.16.2"
babel-types "^6.26.0"
babylon "^6.18.0"
content-disposition@0.5.2:
version "0.5.2"
resolved "https://registry.yarnpkg.com/content-disposition/-/content-disposition-0.5.2.tgz#0cf68bb9ddf5f2be7961c3a85178cb85dba78cb4"
@ -88,6 +213,11 @@ cookie@0.3.1:
resolved "https://registry.yarnpkg.com/cookie/-/cookie-0.3.1.tgz#e7e0a1f9ef43b4c8ba925c5c5a96e806d16873bb"
integrity sha1-5+Ch+e9DtMi6klxcWpboBtFoc7s=
core-js@^2.4.0:
version "2.6.5"
resolved "https://registry.yarnpkg.com/core-js/-/core-js-2.6.5.tgz#44bc8d249e7fb2ff5d00e0341a7ffb94fbf67895"
integrity sha512-klh/kDpwX8hryYL14M9w/xei6vrv6sE8gTHDG7/T/+SEovB/G4ejwcfE/CBzO6Edsu+OETZMZ3wcX/EjUkrl5A==
debug@2.6.9, debug@~2.6.9:
version "2.6.9"
resolved "https://registry.yarnpkg.com/debug/-/debug-2.6.9.tgz#5d128515df134ff327e90a4c93f4e077a536341f"
@ -102,6 +232,11 @@ debug@3.1.0:
dependencies:
ms "2.0.0"
decamelize@^1.0.0:
version "1.2.0"
resolved "https://registry.yarnpkg.com/decamelize/-/decamelize-1.2.0.tgz#f6534d15148269b20352e7bee26f501f9a191290"
integrity sha1-9lNNFRSCabIDUue+4m9QH5oZEpA=
depd@~1.1.2:
version "1.1.2"
resolved "https://registry.yarnpkg.com/depd/-/depd-1.1.2.tgz#9bcd52e14c097763e749b274c4346ed2e560b5a9"
@ -112,6 +247,11 @@ destroy@~1.0.4:
resolved "https://registry.yarnpkg.com/destroy/-/destroy-1.0.4.tgz#978857442c44749e4206613e37946205826abd80"
integrity sha1-l4hXRCxEdJ5CBmE+N5RiBYJqvYA=
doctypes@^1.1.0:
version "1.1.0"
resolved "https://registry.yarnpkg.com/doctypes/-/doctypes-1.1.0.tgz#ea80b106a87538774e8a3a4a5afe293de489e0a9"
integrity sha1-6oCxBqh1OHdOijpKWv4pPeSJ4Kk=
dotenv@^7.0.0:
version "7.0.0"
resolved "https://registry.yarnpkg.com/dotenv/-/dotenv-7.0.0.tgz#a2be3cd52736673206e8a85fb5210eea29628e7c"
@ -132,6 +272,11 @@ escape-html@~1.0.3:
resolved "https://registry.yarnpkg.com/escape-html/-/escape-html-1.0.3.tgz#0258eae4d3d0c0974de1c169188ef0051d1d1988"
integrity sha1-Aljq5NPQwJdN4cFpGI7wBR0dGYg=
esutils@^2.0.2:
version "2.0.2"
resolved "https://registry.yarnpkg.com/esutils/-/esutils-2.0.2.tgz#0abf4f1caa5bcb1f7a9d8acc6dea4faaa04bac9b"
integrity sha1-Cr9PHKpbyx96nYrMbepPqqBLrJs=
etag@~1.8.1:
version "1.8.1"
resolved "https://registry.yarnpkg.com/etag/-/etag-1.8.1.tgz#41ae2eeb65efa62268aebfea83ac7d79299b0887"
@ -196,6 +341,23 @@ fresh@0.5.2:
resolved "https://registry.yarnpkg.com/fresh/-/fresh-0.5.2.tgz#3d8cadd90d976569fa835ab1f8e4b23a105605a7"
integrity sha1-PYyt2Q2XZWn6g1qx+OSyOhBWBac=
function-bind@^1.1.1:
version "1.1.1"
resolved "https://registry.yarnpkg.com/function-bind/-/function-bind-1.1.1.tgz#a56899d3ea3c9bab874bb9773b7c5ede92f4895d"
integrity sha512-yIovAzMX49sF8Yl58fSCWJ5svSLuaibPxXQJFLmBObTuCr0Mf1KiPopGM9NiFjiYBCbfaa2Fh6breQ6ANVTI0A==
"graceful-readlink@>= 1.0.0":
version "1.0.1"
resolved "https://registry.yarnpkg.com/graceful-readlink/-/graceful-readlink-1.0.1.tgz#4cafad76bc62f02fa039b2f94e9a3dd3a391a725"
integrity sha1-TK+tdrxi8C+gObL5Tpo906ORpyU=
has@^1.0.1:
version "1.0.3"
resolved "https://registry.yarnpkg.com/has/-/has-1.0.3.tgz#722d7cbfc1f6aa8241f16dd814e011e1f41e8796"
integrity sha512-f2dvO0VU6Oej7RkWJGrehjbzMAjFp5/VKPp5tTpWIV4JHHZK1/BxbFRtf/siA2SWTe09caDmVtYYzWEIbBS4zw==
dependencies:
function-bind "^1.1.1"
http-errors@1.6.3, http-errors@~1.6.2, http-errors@~1.6.3:
version "1.6.3"
resolved "https://registry.yarnpkg.com/http-errors/-/http-errors-1.6.3.tgz#8b55680bb4be283a0b5bf4ea2e38580be1d9320d"
@ -223,16 +385,71 @@ ipaddr.js@1.8.0:
resolved "https://registry.yarnpkg.com/ipaddr.js/-/ipaddr.js-1.8.0.tgz#eaa33d6ddd7ace8f7f6fe0c9ca0440e706738b1e"
integrity sha1-6qM9bd16zo9/b+DJygRA5wZzix4=
is-buffer@^1.1.5:
version "1.1.6"
resolved "https://registry.yarnpkg.com/is-buffer/-/is-buffer-1.1.6.tgz#efaa2ea9daa0d7ab2ea13a97b2b8ad51fefbe8be"
integrity sha512-NcdALwpXkTm5Zvvbk7owOUSvVvBKDgKP5/ewfXEznmQFfs4ZRmanOeKBTjRVjka3QFoN6XJ+9F3USqfHqTaU5w==
is-expression@^3.0.0:
version "3.0.0"
resolved "https://registry.yarnpkg.com/is-expression/-/is-expression-3.0.0.tgz#39acaa6be7fd1f3471dc42c7416e61c24317ac9f"
integrity sha1-Oayqa+f9HzRx3ELHQW5hwkMXrJ8=
dependencies:
acorn "~4.0.2"
object-assign "^4.0.1"
is-promise@^2.0.0:
version "2.1.0"
resolved "https://registry.yarnpkg.com/is-promise/-/is-promise-2.1.0.tgz#79a2a9ece7f096e80f36d2b2f3bc16c1ff4bf3fa"
integrity sha1-eaKp7OfwlugPNtKy87wWwf9L8/o=
is-regex@^1.0.3:
version "1.0.4"
resolved "https://registry.yarnpkg.com/is-regex/-/is-regex-1.0.4.tgz#5517489b547091b0930e095654ced25ee97e9491"
integrity sha1-VRdIm1RwkbCTDglWVM7SXul+lJE=
dependencies:
has "^1.0.1"
js-stringify@^1.0.1:
version "1.0.2"
resolved "https://registry.yarnpkg.com/js-stringify/-/js-stringify-1.0.2.tgz#1736fddfd9724f28a3682adc6230ae7e4e9679db"
integrity sha1-Fzb939lyTyijaCrcYjCufk6Weds=
jstransformer@1.0.0:
version "1.0.0"
resolved "https://registry.yarnpkg.com/jstransformer/-/jstransformer-1.0.0.tgz#ed8bf0921e2f3f1ed4d5c1a44f68709ed24722c3"
integrity sha1-7Yvwkh4vPx7U1cGkT2hwntJHIsM=
dependencies:
is-promise "^2.0.0"
promise "^7.0.1"
kareem@2.3.0:
version "2.3.0"
resolved "https://registry.yarnpkg.com/kareem/-/kareem-2.3.0.tgz#ef33c42e9024dce511eeaf440cd684f3af1fc769"
integrity sha512-6hHxsp9e6zQU8nXsP+02HGWXwTkOEw6IROhF2ZA28cYbUk4eJ6QbtZvdqZOdD9YPKghG3apk5eOCvs+tLl3lRg==
lodash@^4.17.10:
kind-of@^3.0.2:
version "3.2.2"
resolved "https://registry.yarnpkg.com/kind-of/-/kind-of-3.2.2.tgz#31ea21a734bab9bbb0f32466d893aea51e4a3c64"
integrity sha1-MeohpzS6ubuw8yRm2JOupR5KPGQ=
dependencies:
is-buffer "^1.1.5"
lazy-cache@^1.0.3:
version "1.0.4"
resolved "https://registry.yarnpkg.com/lazy-cache/-/lazy-cache-1.0.4.tgz#a1d78fc3a50474cb80845d3b3b6e1da49a446e8e"
integrity sha1-odePw6UEdMuAhF07O24dpJpEbo4=
lodash@^4.17.10, lodash@^4.17.4:
version "4.17.11"
resolved "https://registry.yarnpkg.com/lodash/-/lodash-4.17.11.tgz#b39ea6229ef607ecd89e2c8df12536891cac9b8d"
integrity sha512-cQKh8igo5QUhZ7lg38DYWAxMvjSAKG0A8wGSVimP07SIUEK2UO+arSRKbRZWtelMtN5V0Hkwh5ryOto/SshYIg==
longest@^1.0.1:
version "1.0.1"
resolved "https://registry.yarnpkg.com/longest/-/longest-1.0.1.tgz#30a0b2da38f73770e8294a0d22e6625ed77d0097"
integrity sha1-MKCy2jj3N3DoKUoNIuZiXtd9AJc=
media-typer@0.3.0:
version "0.3.0"
resolved "https://registry.yarnpkg.com/media-typer/-/media-typer-0.3.0.tgz#8710d7af0aa626f8fffa1ce00168545263255748"
@ -354,6 +571,11 @@ negotiator@0.6.1:
resolved "https://registry.yarnpkg.com/negotiator/-/negotiator-0.6.1.tgz#2b327184e8992101177b28563fb5e7102acd0ca9"
integrity sha1-KzJxhOiZIQEXeyhWP7XnECrNDKk=
object-assign@^4.0.1, object-assign@^4.1.0:
version "4.1.1"
resolved "https://registry.yarnpkg.com/object-assign/-/object-assign-4.1.1.tgz#2109adc7965887cfc05cbbd442cac8bfbb360863"
integrity sha1-IQmtx5ZYh8/AXLvUQsrIv7s2CGM=
on-finished@~2.3.0:
version "2.3.0"
resolved "https://registry.yarnpkg.com/on-finished/-/on-finished-2.3.0.tgz#20f1336481b083cd75337992a16971aa2d906947"
@ -371,11 +593,23 @@ parseurl@~1.3.2:
resolved "https://registry.yarnpkg.com/parseurl/-/parseurl-1.3.2.tgz#fc289d4ed8993119460c156253262cdc8de65bf3"
integrity sha1-/CidTtiZMRlGDBViUyYs3I3mW/M=
path-parse@^1.0.6:
version "1.0.6"
resolved "https://registry.yarnpkg.com/path-parse/-/path-parse-1.0.6.tgz#d62dbb5679405d72c4737ec58600e9ddcf06d24c"
integrity sha512-GSmOT2EbHrINBf9SR7CDELwlJ8AENk3Qn7OikK4nFYAu3Ote2+JYNVvkpAEQm3/TLNEJFD/xZJjzyxg3KBWOzw==
path-to-regexp@0.1.7:
version "0.1.7"
resolved "https://registry.yarnpkg.com/path-to-regexp/-/path-to-regexp-0.1.7.tgz#df604178005f522f15eb4490e7247a1bfaa67f8c"
integrity sha1-32BBeABfUi8V60SQ5yR6G/qmf4w=
promise@^7.0.1:
version "7.3.1"
resolved "https://registry.yarnpkg.com/promise/-/promise-7.3.1.tgz#064b72602b18f90f29192b8b1bc418ffd1ebd3bf"
integrity sha512-nolQXZ/4L+bP/UGlkfaIujX9BKxGwmQ9OT4mOt5yvy8iK1h3wqTEJCijzGANTCCl9nWjY41juyAn2K3Q1hLLTg==
dependencies:
asap "~2.0.3"
proxy-addr@~2.0.4:
version "2.0.4"
resolved "https://registry.yarnpkg.com/proxy-addr/-/proxy-addr-2.0.4.tgz#ecfc733bf22ff8c6f407fa275327b9ab67e48b93"
@ -384,6 +618,111 @@ proxy-addr@~2.0.4:
forwarded "~0.1.2"
ipaddr.js "1.8.0"
pug-attrs@^2.0.2:
version "2.0.3"
resolved "https://registry.yarnpkg.com/pug-attrs/-/pug-attrs-2.0.3.tgz#a3095f970e64151f7bdad957eef55fb5d7905d15"
integrity sha1-owlflw5kFR972tlX7vVftdeQXRU=
dependencies:
constantinople "^3.0.1"
js-stringify "^1.0.1"
pug-runtime "^2.0.4"
pug-code-gen@^1.1.1:
version "1.1.1"
resolved "https://registry.yarnpkg.com/pug-code-gen/-/pug-code-gen-1.1.1.tgz#1cf72744ef2a039eae6a3340caaa1105871258e8"
integrity sha1-HPcnRO8qA56uajNAyqoRBYcSWOg=
dependencies:
constantinople "^3.0.1"
doctypes "^1.1.0"
js-stringify "^1.0.1"
pug-attrs "^2.0.2"
pug-error "^1.3.2"
pug-runtime "^2.0.3"
void-elements "^2.0.1"
with "^5.0.0"
pug-error@^1.3.2:
version "1.3.2"
resolved "https://registry.yarnpkg.com/pug-error/-/pug-error-1.3.2.tgz#53ae7d9d29bb03cf564493a026109f54c47f5f26"
integrity sha1-U659nSm7A89WRJOgJhCfVMR/XyY=
pug-filters@^2.1.1:
version "2.1.5"
resolved "https://registry.yarnpkg.com/pug-filters/-/pug-filters-2.1.5.tgz#66bf6e80d97fbef829bab0aa35eddff33fc964f3"
integrity sha512-xkw71KtrC4sxleKiq+cUlQzsiLn8pM5+vCgkChW2E6oNOzaqTSIBKIQ5cl4oheuDzvJYCTSYzRaVinMUrV4YLQ==
dependencies:
clean-css "^3.3.0"
constantinople "^3.0.1"
jstransformer "1.0.0"
pug-error "^1.3.2"
pug-walk "^1.1.5"
resolve "^1.1.6"
uglify-js "^2.6.1"
pug-lexer@^3.0.0:
version "3.1.0"
resolved "https://registry.yarnpkg.com/pug-lexer/-/pug-lexer-3.1.0.tgz#fd087376d4a675b4f59f8fef422883434e9581a2"
integrity sha1-/QhzdtSmdbT1n4/vQiiDQ06VgaI=
dependencies:
character-parser "^2.1.1"
is-expression "^3.0.0"
pug-error "^1.3.2"
pug-linker@^2.0.2:
version "2.0.3"
resolved "https://registry.yarnpkg.com/pug-linker/-/pug-linker-2.0.3.tgz#b331ffa25737dde69c127b56c10ff17fae766dca"
integrity sha1-szH/olc33eacEntWwQ/xf652bco=
dependencies:
pug-error "^1.3.2"
pug-walk "^1.1.2"
pug-load@^2.0.5:
version "2.0.11"
resolved "https://registry.yarnpkg.com/pug-load/-/pug-load-2.0.11.tgz#e648e57ed113fe2c1f45d57858ea2bad6bc01527"
integrity sha1-5kjlftET/iwfRdV4WOorrWvAFSc=
dependencies:
object-assign "^4.1.0"
pug-walk "^1.1.7"
pug-parser@^2.0.2:
version "2.0.2"
resolved "https://registry.yarnpkg.com/pug-parser/-/pug-parser-2.0.2.tgz#53a680cfd05039dcb0c27d029094bc4a792689b0"
integrity sha1-U6aAz9BQOdywwn0CkJS8SnkmibA=
dependencies:
pug-error "^1.3.2"
token-stream "0.0.1"
pug-runtime@^2.0.3, pug-runtime@^2.0.4:
version "2.0.4"
resolved "https://registry.yarnpkg.com/pug-runtime/-/pug-runtime-2.0.4.tgz#e178e1bda68ab2e8c0acfc9bced2c54fd88ceb58"
integrity sha1-4XjhvaaKsujArPybztLFT9iM61g=
pug-strip-comments@^1.0.2:
version "1.0.3"
resolved "https://registry.yarnpkg.com/pug-strip-comments/-/pug-strip-comments-1.0.3.tgz#f1559592206edc6f85310dacf4afb48a025af59f"
integrity sha1-8VWVkiBu3G+FMQ2s9K+0igJa9Z8=
dependencies:
pug-error "^1.3.2"
pug-walk@^1.1.2, pug-walk@^1.1.5, pug-walk@^1.1.7:
version "1.1.7"
resolved "https://registry.yarnpkg.com/pug-walk/-/pug-walk-1.1.7.tgz#c00d5c5128bac5806bec15d2b7e7cdabe42531f3"
integrity sha1-wA1cUSi6xYBr7BXSt+fNq+QlMfM=
pug@2.0.0-beta11:
version "2.0.0-beta11"
resolved "https://registry.yarnpkg.com/pug/-/pug-2.0.0-beta11.tgz#15abe6af5004c7e2cf4613e4b27465c9546b5f01"
integrity sha1-Favmr1AEx+LPRhPksnRlyVRrXwE=
dependencies:
pug-code-gen "^1.1.1"
pug-filters "^2.1.1"
pug-lexer "^3.0.0"
pug-linker "^2.0.2"
pug-load "^2.0.5"
pug-parser "^2.0.2"
pug-runtime "^2.0.3"
pug-strip-comments "^1.0.2"
qs@6.5.2:
version "6.5.2"
resolved "https://registry.yarnpkg.com/qs/-/qs-6.5.2.tgz#cb3ae806e8740444584ef154ce8ee98d403f3e36"
@ -404,11 +743,21 @@ raw-body@2.3.3:
iconv-lite "0.4.23"
unpipe "1.0.0"
regenerator-runtime@^0.11.0:
version "0.11.1"
resolved "https://registry.yarnpkg.com/regenerator-runtime/-/regenerator-runtime-0.11.1.tgz#be05ad7f9bf7d22e056f9726cee5017fbf19e2e9"
integrity sha512-MguG95oij0fC3QV3URf4V2SDYGJhJnJGqvIIgdECeODCT98wSWDAJ94SSuVpYQUoTcGUIL6L4yNB7j1DFFHSBg==
regexp-clone@0.0.1:
version "0.0.1"
resolved "https://registry.yarnpkg.com/regexp-clone/-/regexp-clone-0.0.1.tgz#a7c2e09891fdbf38fbb10d376fb73003e68ac589"
integrity sha1-p8LgmJH9vzj7sQ03b7cwA+aKxYk=
repeat-string@^1.5.2:
version "1.6.1"
resolved "https://registry.yarnpkg.com/repeat-string/-/repeat-string-1.6.1.tgz#8dcae470e1c88abc2d600fff4a776286da75e637"
integrity sha1-jcrkcOHIirwtYA//Sndihtp15jc=
require_optional@^1.0.1:
version "1.0.1"
resolved "https://registry.yarnpkg.com/require_optional/-/require_optional-1.0.1.tgz#4cf35a4247f64ca3df8c2ef208cc494b1ca8fc2e"
@ -422,6 +771,20 @@ resolve-from@^2.0.0:
resolved "https://registry.yarnpkg.com/resolve-from/-/resolve-from-2.0.0.tgz#9480ab20e94ffa1d9e80a804c7ea147611966b57"
integrity sha1-lICrIOlP+h2egKgEx+oUdhGWa1c=
resolve@^1.1.6:
version "1.10.0"
resolved "https://registry.yarnpkg.com/resolve/-/resolve-1.10.0.tgz#3bdaaeaf45cc07f375656dfd2e54ed0810b101ba"
integrity sha512-3sUr9aq5OfSg2S9pNtPA9hL1FVEAjvfOC4leW0SNf/mpnaakz2a9femSd6LqAww2RaFctwyf1lCqnTHuF1rxDg==
dependencies:
path-parse "^1.0.6"
right-align@^0.1.1:
version "0.1.3"
resolved "https://registry.yarnpkg.com/right-align/-/right-align-0.1.3.tgz#61339b722fe6a3515689210d24e14c96148613ef"
integrity sha1-YTObci/mo1FWiSENJOFMlhSGE+8=
dependencies:
align-text "^0.1.1"
safe-buffer@5.1.2, safe-buffer@^5.1.2:
version "5.1.2"
resolved "https://registry.yarnpkg.com/safe-buffer/-/safe-buffer-5.1.2.tgz#991ec69d296e0313747d59bdfd2b745c35f8828d"
@ -483,6 +846,18 @@ sliced@1.0.1:
resolved "https://registry.yarnpkg.com/sliced/-/sliced-1.0.1.tgz#0b3a662b5d04c3177b1926bea82b03f837a2ef41"
integrity sha1-CzpmK10Ewxd7GSa+qCsD+Dei70E=
source-map@0.4.x:
version "0.4.4"
resolved "https://registry.yarnpkg.com/source-map/-/source-map-0.4.4.tgz#eba4f5da9c0dc999de68032d8b4f76173652036b"
integrity sha1-66T12pwNyZneaAMti092FzZSA2s=
dependencies:
amdefine ">=0.0.4"
source-map@~0.5.1:
version "0.5.7"
resolved "https://registry.yarnpkg.com/source-map/-/source-map-0.5.7.tgz#8a039d2d1021d22d1ea14c80d8ea468ba2ef3fcc"
integrity sha1-igOdLRAh0i0eoUyA2OpGi6LvP8w=
sparse-bitfield@^3.0.3:
version "3.0.3"
resolved "https://registry.yarnpkg.com/sparse-bitfield/-/sparse-bitfield-3.0.3.tgz#ff4ae6e68656056ba4b3e792ab3334d38273ca11"
@ -500,6 +875,16 @@ statuses@~1.4.0:
resolved "https://registry.yarnpkg.com/statuses/-/statuses-1.4.0.tgz#bb73d446da2796106efcc1b601a253d6c46bd087"
integrity sha512-zhSCtt8v2NDrRlPQpCNtw/heZLtfUDqxBM1udqikb/Hbk52LK4nQSwr10u77iopCW5LsyHpuXS0GnEc48mLeew==
to-fast-properties@^1.0.3:
version "1.0.3"
resolved "https://registry.yarnpkg.com/to-fast-properties/-/to-fast-properties-1.0.3.tgz#b83571fa4d8c25b82e231b06e3a3055de4ca1a47"
integrity sha1-uDVx+k2MJbguIxsG46MFXeTKGkc=
token-stream@0.0.1:
version "0.0.1"
resolved "https://registry.yarnpkg.com/token-stream/-/token-stream-0.0.1.tgz#ceeefc717a76c4316f126d0b9dbaa55d7e7df01a"
integrity sha1-zu78cXp2xDFvEm0LnbqlXX598Bo=
type-is@~1.6.16:
version "1.6.16"
resolved "https://registry.yarnpkg.com/type-is/-/type-is-1.6.16.tgz#f89ce341541c672b25ee7ae3c73dee3b2be50194"
@ -508,6 +893,21 @@ type-is@~1.6.16:
media-typer "0.3.0"
mime-types "~2.1.18"
uglify-js@^2.6.1:
version "2.8.29"
resolved "https://registry.yarnpkg.com/uglify-js/-/uglify-js-2.8.29.tgz#29c5733148057bb4e1f75df35b7a9cb72e6a59dd"
integrity sha1-KcVzMUgFe7Th913zW3qcty5qWd0=
dependencies:
source-map "~0.5.1"
yargs "~3.10.0"
optionalDependencies:
uglify-to-browserify "~1.0.0"
uglify-to-browserify@~1.0.0:
version "1.0.2"
resolved "https://registry.yarnpkg.com/uglify-to-browserify/-/uglify-to-browserify-1.0.2.tgz#6e0924d6bda6b5afe349e39a6d632850a0f882b7"
integrity sha1-bgkk1r2mta/jSeOabWMoUKD4grc=
unpipe@1.0.0, unpipe@~1.0.0:
version "1.0.0"
resolved "https://registry.yarnpkg.com/unpipe/-/unpipe-1.0.0.tgz#b2bf4ee8514aae6165b4817829d21b2ef49904ec"
@ -522,3 +922,36 @@ vary@~1.1.2:
version "1.1.2"
resolved "https://registry.yarnpkg.com/vary/-/vary-1.1.2.tgz#2299f02c6ded30d4a5961b0b9f74524a18f634fc"
integrity sha1-IpnwLG3tMNSllhsLn3RSShj2NPw=
void-elements@^2.0.1:
version "2.0.1"
resolved "https://registry.yarnpkg.com/void-elements/-/void-elements-2.0.1.tgz#c066afb582bb1cb4128d60ea92392e94d5e9dbec"
integrity sha1-wGavtYK7HLQSjWDqkjkulNXp2+w=
window-size@0.1.0:
version "0.1.0"
resolved "https://registry.yarnpkg.com/window-size/-/window-size-0.1.0.tgz#5438cd2ea93b202efa3a19fe8887aee7c94f9c9d"
integrity sha1-VDjNLqk7IC76Ohn+iIeu58lPnJ0=
with@^5.0.0:
version "5.1.1"
resolved "https://registry.yarnpkg.com/with/-/with-5.1.1.tgz#fa4daa92daf32c4ea94ed453c81f04686b575dfe"
integrity sha1-+k2qktrzLE6pTtRTyB8EaGtXXf4=
dependencies:
acorn "^3.1.0"
acorn-globals "^3.0.0"
wordwrap@0.0.2:
version "0.0.2"
resolved "https://registry.yarnpkg.com/wordwrap/-/wordwrap-0.0.2.tgz#b79669bb42ecb409f83d583cad52ca17eaa1643f"
integrity sha1-t5Zpu0LstAn4PVg8rVLKF+qhZD8=
yargs@~3.10.0:
version "3.10.0"
resolved "https://registry.yarnpkg.com/yargs/-/yargs-3.10.0.tgz#f7ee7bd857dd7c1d2d38c0e74efbd681d1431fd1"
integrity sha1-9+572FfdfB0tOMDnTvvWgdFDH9E=
dependencies:
camelcase "^1.0.2"
cliui "^2.1.0"
decamelize "^1.0.0"
window-size "0.1.0"

Просмотреть файл

@ -1,5 +1,5 @@
import React from "react";
export default function Blank() {
return <main id="mainContent" />;
return <div />;
}

Просмотреть файл

@ -50,7 +50,7 @@ export default class Grid extends Component {
WarningMessageText
} = this.state;
return (
<main id="mainContent">
<main>
<div className={classnames("text-center", styles.header)}>
<h1>Project Name</h1>
<p> This is placeholder text. Your web app description goes here.</p>

Просмотреть файл

@ -114,7 +114,7 @@ export default class List extends Component {
WarningMessageText
} = this.state;
return (
<main className="container" id="mainContent">
<main className="container">
<div className="row">
<div className="col mt-5 p-0">
<h3>Bootstrap List Template</h3>

Просмотреть файл

@ -71,7 +71,7 @@ export default class MasterDetail extends Component {
WarningMessageText
} = this.state;
return (
<main id="mainContent">
<main>
<div className="container-fluid">
<div className="row">
<div

Просмотреть файл

@ -1,15 +0,0 @@
.skipLink a {
position: absolute;
left: -100px;
top: -100px;
}
.skipLink a:focus {
position: fixed;
z-index: 1000;
top: 0;
left: 0;
padding: 10px;
color: #ffffff;
background: #000000;
}

Разница между файлами не показана из-за своего большого размера Загрузить разницу

Просмотреть файл

@ -1,3 +0,0 @@
Version: 0.0.1914003
sha256: E851C0E30054E8DEA70A8E99FD6148B1E5ED03D12FAD6C24E84F864CDFCF2536

Просмотреть файл

@ -31,7 +31,7 @@
"react-redux": "^6.0.0",
"react-router": "^4.3.1",
"react-router-dom": "^4.3.1",
"react-scripts": "^3.0.1",
"react-scripts": "2.1.5",
"react-select": "^2.3.0",
"react-sortable-hoc": "^1.7.1",
"redux": "^4.0.1",
@ -50,7 +50,7 @@
"build": "yarn manage:translations && node ./scripts/build-non-split.js",
"postbuild": "rm -rf ../extension/react && mv build ../extension/react",
"manage:translations": "node scripts/manageTranslations.js",
"test": "react-scripts test --coverage",
"test": "react-scripts test",
"eject": "react-scripts eject",
"lint": "tslint -c tslint.json src/**/*.{ts,tsx}",
"format": "prettier --write src/**/*.{ts,tsx}",
@ -66,14 +66,10 @@
"not op_mini all"
],
"devDependencies": {
"@types/enzyme": "^3.9.3",
"@types/enzyme-adapter-react-16": "^1.0.5",
"enzyme": "^3.9.0",
"enzyme-adapter-react-16": "^1.13.2",
"react-intl-translations-manager": "^5.0.3",
"tslint-config-prettier": "^1.18.0",
"tslint-microsoft-contrib": "^6.1.0",
"tslint-react-hooks": "^2.0.0"
},
"proxy": "http://localhost:9052"
"proxy": "http://localhost:5000"
}

Просмотреть файл

@ -1,18 +1,9 @@
import * as React from "react";
import { shallow } from "enzyme";
import * as ReactDOM from "react-dom";
import App from "./App";
describe("App", () => {
let props: any;
let wrapper: any;
beforeEach(() => {
props = {};
wrapper = shallow(<App {...props} />);
});
it("renders without crashing", () => {
expect(wrapper).toBeDefined();
});
it("renders without crashing", () => {
const div = document.createElement("div");
ReactDOM.render(<App />, div);
ReactDOM.unmountComponentAtNode(div);
});

Просмотреть файл

@ -3,13 +3,14 @@ import * as React from "react";
import { connect } from "react-redux";
import { withRouter } from "react-router";
import { Route, RouteComponentProps } from "react-router-dom";
import * as Redux from "redux";
import LeftSidebar from "./components/LeftSidebar";
import PageDetails from "./containers/PageDetails";
import SelectFrameworks from "./components/SelectFrameworks";
import SelectPages from "./containers/SelectPages";
import SelectWebApp from "./containers/SelectWebApp";
import NewProject from "./containers/NewProject";
import Welcome from "./containers/Welcome";
import CosmosResourceModal from "./containers/CosmosResourceModal";
import Footer from "./containers/Footer";
import Header from "./containers/Header";
@ -55,9 +56,6 @@ import { ISelected } from "./types/selected";
import { AppState } from "./reducers";
import { IOption } from "./types/option";
import { setPreviewStatusAction } from "./actions/wizardContentActions/setPreviewStatus";
import { setPortAction } from "./actions/wizardContentActions/setPort";
import { ThunkDispatch } from "redux-thunk";
import RootAction from "./actions/ActionType";
if (process.env.NODE_ENV === DEVELOPMENT) {
require("./css/themes.css");
@ -83,7 +81,6 @@ interface IDispatchProps {
resetPageSelection: () => any;
selectFrontend: (frontendFramework: ISelected) => any;
setPreviewStatus: (isPreview: boolean) => void;
setPort: (port: number) => void;
}
interface IStateProps {
@ -108,8 +105,7 @@ class App extends React.Component<Props> {
updateTemplateGenStatusMessage: () => {},
updateTemplateGenStatus: () => {},
getVersionsData: () => {},
setPreviewStatus: () => {},
setPort: () => {}
setPreviewStatus: () => {}
};
public componentDidMount() {
@ -122,7 +118,7 @@ class App extends React.Component<Props> {
if (message.payload != null && message.payload.outputPath != null) {
this.props.updateOutputPath(message.payload.outputPath);
}
break;
return;
case EXTENSION_COMMANDS.GET_USER_STATUS:
case EXTENSION_COMMANDS.AZURE_LOGIN:
// email will be null or undefined if login didn't work correctly
@ -132,10 +128,10 @@ class App extends React.Component<Props> {
message.payload.subscriptions
);
}
break;
return;
case EXTENSION_COMMANDS.AZURE_LOGOUT:
this.props.startLogOutToAzure();
break;
return;
case EXTENSION_COMMANDS.SUBSCRIPTION_DATA_FUNCTIONS:
case EXTENSION_COMMANDS.SUBSCRIPTION_DATA_COSMOS:
// Expect resource groups and locations on this request
@ -147,7 +143,7 @@ class App extends React.Component<Props> {
resourceGroups: message.payload.resourceGroups
});
}
break;
return;
case EXTENSION_COMMANDS.NAME_COSMOS:
// Receive input validation
// and update redux (boolean, string)
@ -156,7 +152,7 @@ class App extends React.Component<Props> {
message: message.payload.reason
});
this.props.setAzureValidationStatus(false);
break;
return;
case EXTENSION_COMMANDS.NAME_FUNCTIONS:
this.props.setAppNameAvailability({
@ -164,21 +160,21 @@ class App extends React.Component<Props> {
message: message.payload.reason
});
this.props.setAzureValidationStatus(false);
break;
return;
case EXTENSION_COMMANDS.PROJECT_PATH_VALIDATION:
this.props.setProjectPathValidation(
message.payload.projectPathValidation
);
break;
return;
case EXTENSION_COMMANDS.GEN_STATUS_MESSAGE:
this.props.updateTemplateGenStatusMessage(message.payload.status);
break;
return;
case EXTENSION_COMMANDS.GEN_STATUS:
this.props.updateTemplateGenStatus(message.payload);
break;
return;
case EXTENSION_COMMANDS.GET_VERSIONS:
this.props.getVersionsData(message.payload);
break;
return;
case EXTENSION_COMMANDS.RESET_PAGES:
if (message.payload.resetPages) {
this.props.frontendOptions.map((frontend: IOption) => {
@ -202,13 +198,9 @@ class App extends React.Component<Props> {
this.props.resetPageSelection();
this.props.history.push(ROUTES.SELECT_PAGES);
}
break;
return;
case EXTENSION_COMMANDS.GET_PREVIEW_STATUS:
this.props.setPreviewStatus(message.payload.preview);
break;
case EXTENSION_COMMANDS.GET_PORT:
this.props.setPort(message.payload.port);
break;
}
});
}
@ -252,7 +244,7 @@ class App extends React.Component<Props> {
/>
<Route path={ROUTES.SELECT_PAGES} component={SelectPages} />
<Route path={ROUTES.SELECT_PROJECT_TYPE} component={SelectWebApp} />
<Route exact={true} path={ROUTES.NEW_PROJECT} component={NewProject} />
<Route exact={true} path={ROUTES.WELCOME} component={Welcome} />
</main>
<RightSidebar />
</div>
@ -262,7 +254,7 @@ class App extends React.Component<Props> {
}
}
const mapDispatchToProps = (dispatch: ThunkDispatch<AppState, void, RootAction>): IDispatchProps => ({
const mapDispatchToProps = (dispatch: Redux.Dispatch<any>): IDispatchProps => ({
getVSCodeApi: () => {
dispatch(getVSCodeApi());
},
@ -307,9 +299,6 @@ const mapDispatchToProps = (dispatch: ThunkDispatch<AppState, void, RootAction>)
},
setPreviewStatus: (isPreview: boolean) => {
dispatch(setPreviewStatusAction(isPreview));
},
setPort: (port: number) => {
dispatch(setPortAction(port));
}
});

Просмотреть файл

@ -1,4 +1,5 @@
import { AZURE_TYPEKEYS } from "./typeKeys";
import { IAvailability } from "../../reducers/wizardSelectionReducers/services/cosmosDbReducer";
export interface IAvailabilityFromExtension {
isAvailable: boolean;

Просмотреть файл

@ -5,7 +5,7 @@ export interface IGetSubscription {
payload: any;
}
export const getSubscriptionData = (subscriptionData: any): IGetSubscription => ({
export const getSubscriptionData = (subscriptionData: any) => ({
type: AZURE_TYPEKEYS.GET_SUBSCRIPTION_DATA,
payload: subscriptionData
});

Просмотреть файл

@ -19,13 +19,12 @@ export const getBackendFrameworksSuccess = (
// thunk
export const getBackendFrameworksAction = (
projectType: string,
isPreview: boolean,
serverPort: number
isPreview: boolean
) => {
return async (dispatch: Dispatch<WizardContentActionType>) => {
return dispatch(
getBackendFrameworksSuccess(
await getFrameworks(projectType, "backend", isPreview, serverPort)
await getFrameworks(projectType, "backend", isPreview)
)
);
};

Просмотреть файл

@ -9,10 +9,9 @@ type FrameworkType = "frontend" | "backend";
export const getFrameworks = async (
projectType: string,
type: FrameworkType,
isPreview: boolean,
serverPort: number
isPreview: boolean
): Promise<IOption[]> => {
const api = new EngineAPIService(serverPort, undefined);
const api = new EngineAPIService("5000", undefined);
try {
const frameworksJson = await api.getFrameworks(projectType);

Просмотреть файл

@ -19,13 +19,12 @@ export const getFrontendFrameworksSuccess = (
// thunk
export const getFrontendFrameworksAction = (
projectType: string,
isPreview: boolean,
serverPort: number
isPreview: boolean
) => {
return async (dispatch: Dispatch<WizardContentActionType>) => {
return dispatch(
getFrontendFrameworksSuccess(
await getFrameworks(projectType, "frontend", isPreview, serverPort)
await getFrameworks(projectType, "frontend", isPreview)
)
);
};

Просмотреть файл

@ -14,11 +14,11 @@ export interface IPageOptionsActionType {
const getPagesOptionsAction = (
projectType: string,
frontendFramework: string,
backendFramework: string,
serverPort: number
backendFramework: string
) => {
return async (dispatch: Dispatch<WizardContentActionType>) => {
const api = new EngineAPIService(serverPort, undefined);
const port = "5000";
const api = new EngineAPIService(port, undefined);
try {
const pagesJson = await api.getPages(

Просмотреть файл

@ -7,9 +7,9 @@ import WizardContentActionType from "./wizardContentActionType";
import { Dispatch } from "react";
// thunk
export const getProjectTypesAction = (serverPort: number) => {
export const getProjectTypesAction = () => {
return async (dispatch: Dispatch<WizardContentActionType>) => {
const api = new EngineAPIService(serverPort, undefined);
const api = new EngineAPIService("5000", undefined);
try {
const projectTypesJson = await api.getProjectTypes();
@ -53,6 +53,7 @@ function getOptionalFromMetadata(items: IMetadata[]): IOption[] {
position: val.position,
svgUrl: getSvgUrl(val.name),
selected: val.selected,
licenses: val.licenses
licenses: val.licenses,
author: val.author
}));
}

Просмотреть файл

@ -1,11 +0,0 @@
import { WIZARD_CONTENT_TYPEKEYS } from "./typeKeys";
export interface ISetPortActionType {
type: WIZARD_CONTENT_TYPEKEYS.SET_PORT;
payload: number;
}
export const setPortAction = (port: number): ISetPortActionType => ({
payload: port,
type: WIZARD_CONTENT_TYPEKEYS.SET_PORT
});

Просмотреть файл

@ -10,7 +10,6 @@ export enum WIZARD_CONTENT_TYPEKEYS {
GET_FRONTEND_FRAMEWORKS_SUCCESS = "WTS/wizardContent/GET_FRONTEND_FRAMEWORKS_SUCCESS",
GET_BACKEND_FRAMEWORKS = "WTS/wizardContent/GET_BACKEND_FRAMEWORKS",
SET_PREVIEW_STATUS = "WTS/wizardContent/SET_PREVIEW_STATUS",
SET_PORT = "WTS/wizardContent/SET_PORT",
GET_BACKEND_FRAMEWORKS_SUCCESS = "WTS/wizardContent/GET_BACKEND_FRAMEWORKS_SUCCESS",
LOAD_WIZARD_CONTENT = "WTS/wizardContent/LOAD_WIZARD_CONTENT"
}

Просмотреть файл

@ -3,14 +3,12 @@ import { IFrontendFrameworksActionType } from "./getFrontendFrameworks";
import { IPageOptionsActionType } from "./getPagesOptions";
import { IProjectTypesActionType } from "./getProjectTypesSuccess";
import { IPreviewStatusActionType } from "./setPreviewStatus";
import { ISetPortActionType } from "./setPort";
type WizardContentActionType =
| IBackendFrameworksSuccessActionType
| IFrontendFrameworksActionType
| IPageOptionsActionType
| IProjectTypesActionType
| IPreviewStatusActionType
| ISetPortActionType;
| IPreviewStatusActionType;
export default WizardContentActionType;

Просмотреть файл

@ -1,5 +1,6 @@
import { IOption } from "../../types/option";
import { WIZARD_INFO_TYPEKEYS } from "./typeKeys";
import { IMetadata } from "../../types/metadata";
export interface IDetail {
data: IOption;

Просмотреть файл

@ -11,7 +11,7 @@ export interface IUpdateGenStatus {
payload: IServiceStatus;
}
const updateTemplateGenerationStatusMessageAction = (status: string): IUpdateGenStatusMessage => ({
const updateTemplateGenerationStatusMessageAction = (status: string) => ({
type: WIZARD_INFO_TYPEKEYS.UPDATE_TEMPLATE_GENERATION_STATUS_MESSAGE,
payload: status
});

Просмотреть файл

@ -10,13 +10,13 @@
width: 100%;
box-sizing: border-box;
background-color: var(--vscode-editor-background);
height: calc(100vh - 104px);
height: calc(100vh - 122px);
margin-top: 51px;
margin-bottom: 53px;
margin-bottom: 71px;
justify-content: flex-start;
}
.centerViewMaxHeight {
height: calc(100vh - 51px);
margin-bottom: 0px;
}
}

Просмотреть файл

@ -1 +1 @@
<svg data-name="Layer 1" xmlns="http://www.w3.org/2000/svg" viewBox="0 0 36 36"><defs><style>.cls-1{fill:#2272b9;}</style></defs><title>Azure</title><g id="Page-1"><path id="Combined-Shape" class="cls-1" d="M8.22,31.91l17-3L16.48,18.54,21,6.05,36,31.92ZM19.85,4.08,8.26,28.88v0H0L9.16,13Z"/></g></svg>
<svg data-name="Layer 1" xmlns="http://www.w3.org/2000/svg" viewBox="0 0 36 36"><defs><style>.cls-1{fill:#2272b9;}</style></defs><title>Azure Functions copy</title><g id="Page-1"><path id="Combined-Shape" class="cls-1" d="M8.22,31.91l17-3L16.48,18.54,21,6.05,36,31.92ZM19.85,4.08,8.26,28.88v0H0L9.16,13Z"/></g></svg>

До

Ширина:  |  Высота:  |  Размер: 301 B

После

Ширина:  |  Высота:  |  Размер: 316 B

Просмотреть файл

@ -1,4 +1,3 @@
<svg alt="Return to Previous Page" role="img" width="18" height="18" viewBox="0 0 18 18" fill="none" xmlns="http://www.w3.org/2000/svg">
<title>Back Arrow</title>
<svg width="18" height="18" viewBox="0 0 18 18" fill="none" xmlns="http://www.w3.org/2000/svg">
<path d="M17.9999 9.56047H2.19493L9.11493 16.5005L8.32493 17.2905L0.0549316 9.00047L8.32493 0.730469L9.11493 1.50047L2.19493 8.43547H17.9999V9.56047Z" fill="white"/>
</svg>

До

Ширина:  |  Высота:  |  Размер: 336 B

После

Ширина:  |  Высота:  |  Размер: 269 B

Просмотреть файл

@ -1 +1 @@
<svg data-name="Layer 1" xmlns="http://www.w3.org/2000/svg" viewBox="0 0 36 36"><defs><style>.cls-1{fill:#fff;}</style></defs><title>Blank Page</title><path class="cls-1" d="M32.62,9.65V36H3.38V0H23Zm-2.24,24.1V11.25h-9v-9H5.63v31.5ZM23.63,9h5.15L23.63,3.85Z"/></svg>
<svg data-name="Layer 1" xmlns="http://www.w3.org/2000/svg" viewBox="0 0 36 36"><defs><style>.cls-1{fill:#fff;}</style></defs><title>Blank Page White</title><path class="cls-1" d="M32.62,9.65V36H3.38V0H23Zm-2.24,24.1V11.25h-9v-9H5.63v31.5ZM23.63,9h5.15L23.63,3.85Z"/></svg>

До

Ширина:  |  Высота:  |  Размер: 267 B

После

Ширина:  |  Высота:  |  Размер: 273 B

Различия файлов скрыты, потому что одна или несколько строк слишком длинны

До

Ширина:  |  Высота:  |  Размер: 118 KiB

После

Ширина:  |  Высота:  |  Размер: 102 KiB

Просмотреть файл

@ -1 +1 @@
<svg alt="Delete Item" role="img" xmlns="http://www.w3.org/2000/svg" width="36" height="36" viewBox="0 0 36 36"><title>Cancel</title><path d="M19.6,18,35.67,34.08l-1.59,1.59L18,19.6,1.92,35.67.33,34.08,16.4,18,.33,1.92,1.92.33,18,16.4,34.08.33l1.59,1.59Z" fill="#231f20"/></svg>
<svg xmlns="http://www.w3.org/2000/svg" width="36" height="36" viewBox="0 0 36 36"><title>Icon Individual Artboards</title><path d="M19.6,18,35.67,34.08l-1.59,1.59L18,19.6,1.92,35.67.33,34.08,16.4,18,.33,1.92,1.92.33,18,16.4,34.08.33l1.59,1.59Z" fill="#231f20"/></svg>

До

Ширина:  |  Высота:  |  Размер: 279 B

После

Ширина:  |  Высота:  |  Размер: 269 B

Просмотреть файл

@ -1 +1 @@
<svg alt="Check Mark" role="img" xmlns="http://www.w3.org/2000/svg" width="36" height="36" viewBox="0 0 36 36"><title>Check Mark</title><path d="M.33,19.92l1.59-1.59,9.33,9.32L34.08,4.83l1.59,1.59L11.25,30.85Z" fill="#231f20"/></svg>
<svg xmlns="http://www.w3.org/2000/svg" width="36" height="36" viewBox="0 0 36 36"><title>Icon Individual Artboards</title><path d="M.33,19.92l1.59-1.59,9.33,9.32L34.08,4.83l1.59,1.59L11.25,30.85Z" fill="#231f20"/></svg>

До

Ширина:  |  Высота:  |  Размер: 234 B

После

Ширина:  |  Высота:  |  Размер: 221 B

Просмотреть файл

@ -1 +1 @@
<svg data-name="Layer 1" xmlns="http://www.w3.org/2000/svg" viewBox="0 0 36 36"><defs><style>.cls-6{fill:#99FFA7;}</style></defs><title>Green Check Mark</title><path class="cls-6" d="M36,7.15,12.33,30.84,0,18.49l2-2L12.33,26.81,34,5.16Z"/></svg>
<svg data-name="Layer 1" xmlns="http://www.w3.org/2000/svg" viewBox="0 0 36 36"><defs><style>.cls-6{fill:#99FFA7;}</style></defs><title>Check</title><path class="cls-6" d="M36,7.15,12.33,30.84,0,18.49l2-2L12.33,26.81,34,5.16Z"/></svg>

До

Ширина:  |  Высота:  |  Размер: 245 B

После

Ширина:  |  Высота:  |  Размер: 234 B

Просмотреть файл

@ -1 +1 @@
<svg alt="" data-name="Layer 1" xmlns="http://www.w3.org/2000/svg" viewBox="0 0 36 36"><defs><style>.cls-1{stroke:#000;stroke-miterlimit:10;stroke-width:1.25px;}</style></defs><title>Contact Page</title><path d="M32.62,9.65V36H3.38V0H23Zm-2.24,24.1V11.25h-9v-9H5.63v31.5ZM23.63,9h5.15L23.63,3.85Z"/><path class="cls-1" d="M20.39,24.18a6.81,6.81,0,0,1,3.38,2.56,7.11,7.11,0,0,1,.92,1.9A7.36,7.36,0,0,1,25,30.79H24a6.23,6.23,0,0,0-.46-2.38,5.78,5.78,0,0,0-3.17-3.17A6,6,0,0,0,12,30.79H11a7,7,0,0,1,1.26-4,6.78,6.78,0,0,1,1.46-1.52,7.2,7.2,0,0,1,1.91-1,4.79,4.79,0,0,1-1.09-.8,4.87,4.87,0,0,1-.83-1,5.17,5.17,0,0,1-.52-1.23A5,5,0,0,1,13,19.78a4.93,4.93,0,0,1,.4-2,5,5,0,0,1,2.66-2.66,5,5,0,0,1,3.9,0,5,5,0,0,1,2.66,2.66,4.93,4.93,0,0,1,.4,2,5,5,0,0,1-.19,1.34,5.27,5.27,0,0,1-.52,1.22,5.15,5.15,0,0,1-.82,1A4.79,4.79,0,0,1,20.39,24.18ZM14,19.78a3.91,3.91,0,0,0,.31,1.56,4.06,4.06,0,0,0,2.13,2.13,4.08,4.08,0,0,0,3.12,0,4.06,4.06,0,0,0,2.13-2.13,4.08,4.08,0,0,0,0-3.12A4.13,4.13,0,0,0,20.83,17a4.25,4.25,0,0,0-1.27-.86,4.08,4.08,0,0,0-3.12,0,4.25,4.25,0,0,0-1.27.86,4.13,4.13,0,0,0-.86,1.27A3.91,3.91,0,0,0,14,19.78Z"/></svg>
<svg data-name="Layer 1" xmlns="http://www.w3.org/2000/svg" viewBox="0 0 36 36"><defs><style>.cls-1{stroke:#000;stroke-miterlimit:10;stroke-width:1.25px;}</style></defs><title>Contact Page</title><path d="M32.62,9.65V36H3.38V0H23Zm-2.24,24.1V11.25h-9v-9H5.63v31.5ZM23.63,9h5.15L23.63,3.85Z"/><path class="cls-1" d="M20.39,24.18a6.81,6.81,0,0,1,3.38,2.56,7.11,7.11,0,0,1,.92,1.9A7.36,7.36,0,0,1,25,30.79H24a6.23,6.23,0,0,0-.46-2.38,5.78,5.78,0,0,0-3.17-3.17A6,6,0,0,0,12,30.79H11a7,7,0,0,1,1.26-4,6.78,6.78,0,0,1,1.46-1.52,7.2,7.2,0,0,1,1.91-1,4.79,4.79,0,0,1-1.09-.8,4.87,4.87,0,0,1-.83-1,5.17,5.17,0,0,1-.52-1.23A5,5,0,0,1,13,19.78a4.93,4.93,0,0,1,.4-2,5,5,0,0,1,2.66-2.66,5,5,0,0,1,3.9,0,5,5,0,0,1,2.66,2.66,4.93,4.93,0,0,1,.4,2,5,5,0,0,1-.19,1.34,5.27,5.27,0,0,1-.52,1.22,5.15,5.15,0,0,1-.82,1A4.79,4.79,0,0,1,20.39,24.18ZM14,19.78a3.91,3.91,0,0,0,.31,1.56,4.06,4.06,0,0,0,2.13,2.13,4.08,4.08,0,0,0,3.12,0,4.06,4.06,0,0,0,2.13-2.13,4.08,4.08,0,0,0,0-3.12A4.13,4.13,0,0,0,20.83,17a4.25,4.25,0,0,0-1.27-.86,4.08,4.08,0,0,0-3.12,0,4.25,4.25,0,0,0-1.27.86,4.13,4.13,0,0,0-.86,1.27A3.91,3.91,0,0,0,14,19.78Z"/></svg>

До

Ширина:  |  Высота:  |  Размер: 1.1 KiB

После

Ширина:  |  Высота:  |  Размер: 1.1 KiB

Просмотреть файл

@ -1 +1 @@
<svg xmlns="http://www.w3.org/2000/svg" width="36" height="36" viewBox="0 0 36 36"><title>Content Grid Page</title><path d="M32.62,9.65V36H3.38V0H23Zm-2.24,24.1V11.25h-9v-9H5.63v31.5ZM23.63,9h5.15L23.63,3.85Z"/><path d="M16.84,22.45H8.42V15.62h8.42Z"/><path d="M27.58,22.45H19.16V15.62h8.42Z"/><path d="M16.84,31.51H8.42V24.68h8.42Z"/><path d="M27.58,31.51H19.16V24.68h8.42Z"/></svg>
<svg xmlns="http://www.w3.org/2000/svg" width="36" height="36" viewBox="0 0 36 36"><title>1</title><path d="M32.62,9.65V36H3.38V0H23Zm-2.24,24.1V11.25h-9v-9H5.63v31.5ZM23.63,9h5.15L23.63,3.85Z"/><path d="M16.84,22.45H8.42V15.62h8.42Z"/><path d="M27.58,22.45H19.16V15.62h8.42Z"/><path d="M16.84,31.51H8.42V24.68h8.42Z"/><path d="M27.58,31.51H19.16V24.68h8.42Z"/></svg>

До

Ширина:  |  Высота:  |  Размер: 384 B

После

Ширина:  |  Высота:  |  Размер: 368 B

Просмотреть файл

@ -1 +1 @@
<svg data-name="Layer 1" xmlns="http://www.w3.org/2000/svg" viewBox="0 0 36 36"><defs><style>.cls-1{fill:#fff;}</style></defs><title>Content Grid Page</title><path class="cls-1" d="M32.62,9.65V36H3.38V0H23Zm-2.24,24.1V11.25h-9v-9H5.63v31.5ZM23.63,9h5.15L23.63,3.85Z"/><rect class="cls-1" x="8.29" y="15.89" width="8.28" height="6.5"/><rect class="cls-1" x="19.36" y="15.89" width="8.28" height="6.5"/><rect class="cls-1" x="8.29" y="24.82" width="8.28" height="6.5"/><rect class="cls-1" x="19.36" y="24.82" width="8.28" height="6.5"/></svg>
<svg data-name="Layer 1" xmlns="http://www.w3.org/2000/svg" viewBox="0 0 36 36"><defs><style>.cls-1{fill:#fff;}</style></defs><title>Content Grid White</title><path class="cls-1" d="M32.62,9.65V36H3.38V0H23Zm-2.24,24.1V11.25h-9v-9H5.63v31.5ZM23.63,9h5.15L23.63,3.85Z"/><rect class="cls-1" x="8.29" y="15.89" width="8.28" height="6.5"/><rect class="cls-1" x="19.36" y="15.89" width="8.28" height="6.5"/><rect class="cls-1" x="8.29" y="24.82" width="8.28" height="6.5"/><rect class="cls-1" x="19.36" y="24.82" width="8.28" height="6.5"/></svg>

До

Ширина:  |  Высота:  |  Размер: 540 B

После

Ширина:  |  Высота:  |  Размер: 541 B

Просмотреть файл

@ -1,6 +1,6 @@
<svg xmlns="http://www.w3.org/2000/svg" id="Layer_1" data-name="Layer 1" viewBox="0 0 50.035 46.007">
<title>
Cosmos Database
CosmosDB_rgb_UI_darktheme
</title>
<path fill="#59b4d9" d="M41.545,20.885A16.527,16.527,0,1,1,21.625,8.7,16.457,16.457,0,0,1,41.545,20.885Z" transform="translate(-0.178 -0.234)"/>
<path fill="#fff" d="M23.143,31.381A4.391,4.391,0,0,0,18.742,27h-.665a4.365,4.365,0,0,0-4.28-5.386H9.234A16.352,16.352,0,0,0,13.21,35.761h5.531A4.391,4.391,0,0,0,23.143,31.381Z" opacity="0.5" style="isolation:isolate" transform="translate(-0.178 -0.234)"/>

До

Ширина:  |  Высота:  |  Размер: 2.3 KiB

После

Ширина:  |  Высота:  |  Размер: 2.4 KiB

Просмотреть файл

@ -1 +1 @@
<svg alt="Edit Name" xmlns="http://www.w3.org/2000/svg" width="36" height="36" viewBox="0 0 36 36"><title>Edit Name</title><path d="M36,5.89a6,6,0,0,1-.44,2.25,5.66,5.66,0,0,1-1.28,1.93L11.13,33.22,0,36,2.78,24.87,25.93,1.72A5.66,5.66,0,0,1,27.86.44,6,6,0,0,1,30.11,0,5.72,5.72,0,0,1,32.4.47,5.89,5.89,0,0,1,35.53,3.6,5.72,5.72,0,0,1,36,5.89Zm-32.91,27,5.79-1.45a5.94,5.94,0,0,0-.57-1.52,6.19,6.19,0,0,0-1-1.29,6.19,6.19,0,0,0-1.29-1,5.94,5.94,0,0,0-1.52-.57ZM5.73,25.1a8.14,8.14,0,0,1,3.21,2,8.14,8.14,0,0,1,2,3.21l19-19L24.75,6.1ZM31.5,9.65l.84-.83A6.06,6.06,0,0,0,33.06,8a3.84,3.84,0,0,0,.51-.93,3.51,3.51,0,0,0,.18-1.17,3.53,3.53,0,0,0-.29-1.42,3.76,3.76,0,0,0-1.95-1.95,3.74,3.74,0,0,0-2.59-.11,3.84,3.84,0,0,0-.93.51,6.06,6.06,0,0,0-.81.72l-.83.84Z" fill="#231f20"/></svg>
<svg xmlns="http://www.w3.org/2000/svg" width="36" height="36" viewBox="0 0 36 36"><title>Icon Individual Artboards</title><path d="M36,5.89a6,6,0,0,1-.44,2.25,5.66,5.66,0,0,1-1.28,1.93L11.13,33.22,0,36,2.78,24.87,25.93,1.72A5.66,5.66,0,0,1,27.86.44,6,6,0,0,1,30.11,0,5.72,5.72,0,0,1,32.4.47,5.89,5.89,0,0,1,35.53,3.6,5.72,5.72,0,0,1,36,5.89Zm-32.91,27,5.79-1.45a5.94,5.94,0,0,0-.57-1.52,6.19,6.19,0,0,0-1-1.29,6.19,6.19,0,0,0-1.29-1,5.94,5.94,0,0,0-1.52-.57ZM5.73,25.1a8.14,8.14,0,0,1,3.21,2,8.14,8.14,0,0,1,2,3.21l19-19L24.75,6.1ZM31.5,9.65l.84-.83A6.06,6.06,0,0,0,33.06,8a3.84,3.84,0,0,0,.51-.93,3.51,3.51,0,0,0,.18-1.17,3.53,3.53,0,0,0-.29-1.42,3.76,3.76,0,0,0-1.95-1.95,3.74,3.74,0,0,0-2.59-.11,3.84,3.84,0,0,0-.93.51,6.06,6.06,0,0,0-.81.72l-.83.84Z" fill="#231f20"/></svg>

До

Ширина:  |  Высота:  |  Размер: 779 B

После

Ширина:  |  Высота:  |  Размер: 779 B

Просмотреть файл

@ -1 +1 @@
<svg alt="Open File Explorer" xmlns="http://www.w3.org/2000/svg" width="36" height="36" viewBox="0 0 36 36"><title>Open File Explorer</title><path d="M0,7.87A2.25,2.25,0,0,1,.17,7a2.36,2.36,0,0,1,.49-.72,2.34,2.34,0,0,1,.71-.48,2.13,2.13,0,0,1,.88-.18H19.69a2.61,2.61,0,0,0,1-.16A3.84,3.84,0,0,0,21.42,5a7,7,0,0,0,.71-.54,5.36,5.36,0,0,1,.8-.55,5.29,5.29,0,0,1,1-.41,5,5,0,0,1,1.36-.17h8.44a2.13,2.13,0,0,1,.88.18,2.29,2.29,0,0,1,1.2,1.2,2.25,2.25,0,0,1,.17.87v27H0Zm33.75,22.5V10.12H25.31A5,5,0,0,1,24,10a4.73,4.73,0,0,1-1-.42,4.66,4.66,0,0,1-.8-.54c-.23-.2-.47-.38-.71-.55A4.37,4.37,0,0,0,20.65,8a2.61,2.61,0,0,0-1-.17H2.25v22.5ZM25.31,5.62a3.13,3.13,0,0,0-.73.08,2.34,2.34,0,0,0-.58.23,4.3,4.3,0,0,0-.52.35c-.17.14-.36.29-.56.47l.56.46a3.46,3.46,0,0,0,.52.36,2,2,0,0,0,.58.22,2.67,2.67,0,0,0,.73.08h8.44V5.62Z"/></svg>
<svg xmlns="http://www.w3.org/2000/svg" width="36" height="36" viewBox="0 0 36 36"><title>Folder</title><path d="M0,7.87A2.25,2.25,0,0,1,.17,7a2.36,2.36,0,0,1,.49-.72,2.34,2.34,0,0,1,.71-.48,2.13,2.13,0,0,1,.88-.18H19.69a2.61,2.61,0,0,0,1-.16A3.84,3.84,0,0,0,21.42,5a7,7,0,0,0,.71-.54,5.36,5.36,0,0,1,.8-.55,5.29,5.29,0,0,1,1-.41,5,5,0,0,1,1.36-.17h8.44a2.13,2.13,0,0,1,.88.18,2.29,2.29,0,0,1,1.2,1.2,2.25,2.25,0,0,1,.17.87v27H0Zm33.75,22.5V10.12H25.31A5,5,0,0,1,24,10a4.73,4.73,0,0,1-1-.42,4.66,4.66,0,0,1-.8-.54c-.23-.2-.47-.38-.71-.55A4.37,4.37,0,0,0,20.65,8a2.61,2.61,0,0,0-1-.17H2.25v22.5ZM25.31,5.62a3.13,3.13,0,0,0-.73.08,2.34,2.34,0,0,0-.58.23,4.3,4.3,0,0,0-.52.35c-.17.14-.36.29-.56.47l.56.46a3.46,3.46,0,0,0,.52.36,2,2,0,0,0,.58.22,2.67,2.67,0,0,0,.73.08h8.44V5.62Z"/></svg>

До

Ширина:  |  Высота:  |  Размер: 822 B

После

Ширина:  |  Высота:  |  Размер: 785 B

Просмотреть файл

@ -1 +1 @@
<svg alt="" xmlns="http://www.w3.org/2000/svg" width="36" height="36" viewBox="0 0 36 36"><title>Full Stack Web App</title><path d="M27.68,18.84l5-3.2-6.15-4,3.38-2.18L18,1.83,6.14,9.49l3.38,2.18-6.15,4,5,3.2-7,4.54L18,34.17,34.7,23.38ZM18,4.81l7.25,4.68L18,14.17,10.75,9.49Zm-6.18,8.35,6.18,4,6.18-4L28,15.64,18,22.12,8,15.64ZM5.9,23.38l4.73-3.05L18,25.09l7.37-4.76,4.73,3.05L18,31.2Z"/></svg>
<svg xmlns="http://www.w3.org/2000/svg" width="36" height="36" viewBox="0 0 36 36"><title>full stack web app</title><path d="M27.68,18.84l5-3.2-6.15-4,3.38-2.18L18,1.83,6.14,9.49l3.38,2.18-6.15,4,5,3.2-7,4.54L18,34.17,34.7,23.38ZM18,4.81l7.25,4.68L18,14.17,10.75,9.49Zm-6.18,8.35,6.18,4,6.18-4L28,15.64,18,22.12,8,15.64ZM5.9,23.38l4.73-3.05L18,25.09l7.37-4.76,4.73,3.05L18,31.2Z"/></svg>

До

Ширина:  |  Высота:  |  Размер: 395 B

После

Ширина:  |  Высота:  |  Размер: 388 B

Просмотреть файл

@ -1 +1 @@
<svg alt="" data-name="Layer 1" xmlns="http://www.w3.org/2000/svg" viewBox="0 0 36 36"><defs><style>.cls-1{fill:none;stroke:#FFFFFF;stroke-miterlimit:10;stroke-width:2.5px;}</style></defs><title>Full Stack Web App</title><polyline class="cls-1" points="11.47 11.9 5.67 15.64 18 23.61 30.33 15.64 24.53 11.9"/><polygon class="cls-1" points="18 15.66 8.44 9.49 18 3.32 27.56 9.49 18 15.66"/><polyline class="cls-1" points="10.37 19.01 3.6 23.38 18 32.68 32.4 23.38 25.63 19.01"/></svg>
<svg data-name="Layer 1" xmlns="http://www.w3.org/2000/svg" viewBox="0 0 36 36"><defs><style>.cls-1{fill:none;stroke:#FFFFFF;stroke-miterlimit:10;stroke-width:2.5px;}</style></defs><title>Full Stack Web App</title><polyline class="cls-1" points="11.47 11.9 5.67 15.64 18 23.61 30.33 15.64 24.53 11.9"/><polygon class="cls-1" points="18 15.66 8.44 9.49 18 3.32 27.56 9.49 18 15.66"/><polyline class="cls-1" points="10.37 19.01 3.6 23.38 18 32.68 32.4 23.38 25.63 19.01"/></svg>

До

Ширина:  |  Высота:  |  Размер: 483 B

После

Ширина:  |  Высота:  |  Размер: 476 B

Различия файлов скрыты, потому что одна или несколько строк слишком длинны

До

Ширина:  |  Высота:  |  Размер: 827 KiB

После

Ширина:  |  Высота:  |  Размер: 811 KiB

Просмотреть файл

@ -1 +1 @@
<svg data-name="Layer 1" xmlns="http://www.w3.org/2000/svg" viewBox="0 0 36 36"><title>Key Vault SQL</title><defs><style>.cls-1{fill:#2272b9;}.cls-2,.cls-3{fill:#fff;}.cls-2{opacity:0.15;isolation:isolate;}.cls-4{fill:#7fbb42;}.cls-5{fill:#b8d433;}</style></defs><title>SQL Database</title><path class="cls-1" d="M3.66,4.92V31.08C3.66,33.8,9.74,36,17.24,36V4.92Z"/><path class="cls-1" d="M17.06,36h.18c7.5,0,13.58-2.2,13.58-4.92V4.92H17.06Z"/><path class="cls-2" d="M17.06,36h.18c7.5,0,13.58-2.2,13.58-4.92V4.92H17.06Z"/><path class="cls-3" d="M30.82,4.92c0,2.71-6.08,4.92-13.58,4.92S3.66,7.63,3.66,4.92,9.74,0,17.24,0,30.82,2.2,30.82,4.92"/><path class="cls-4" d="M28.05,4.63c0,1.8-4.84,3.25-10.81,3.25S6.44,6.43,6.44,4.63s4.84-3.24,10.8-3.24S28.05,2.84,28.05,4.63"/><path class="cls-5" d="M25.78,6.62c1.42-.55,2.27-1.24,2.27-2,0-1.8-4.84-3.25-10.81-3.25S6.44,2.84,6.44,4.64c0,.74.85,1.43,2.26,2a25.2,25.2,0,0,1,8.54-1.26,25.12,25.12,0,0,1,8.54,1.26"/><path class="cls-3" d="M12.93,23.08A2.24,2.24,0,0,1,12.05,25a4,4,0,0,1-2.45.67,4.67,4.67,0,0,1-2.22-.48V23.25a3.44,3.44,0,0,0,2.27.87,1.53,1.53,0,0,0,.92-.24.74.74,0,0,0,.33-.63.9.9,0,0,0-.32-.68,5.44,5.44,0,0,0-1.27-.74,2.8,2.8,0,0,1-2-2.51,2.26,2.26,0,0,1,.85-1.85,3.52,3.52,0,0,1,2.27-.7,5.63,5.63,0,0,1,2.08.33v1.79a3.35,3.35,0,0,0-2-.6,1.46,1.46,0,0,0-.88.24.76.76,0,0,0-.32.63.9.9,0,0,0,.26.66,4.05,4.05,0,0,0,1.07.65,5.29,5.29,0,0,1,1.71,1.15A2.15,2.15,0,0,1,12.93,23.08Z"/><path class="cls-3" d="M22.15,21.14a4.89,4.89,0,0,1-.69,2.63,3.68,3.68,0,0,1-1.93,1.56L22,27.63H19.5l-1.77-2A4.14,4.14,0,0,1,15.67,25a3.78,3.78,0,0,1-1.42-1.54,4.72,4.72,0,0,1-.5-2.17,5.12,5.12,0,0,1,.54-2.38,3.85,3.85,0,0,1,1.52-1.6,4.43,4.43,0,0,1,2.25-.57,4.16,4.16,0,0,1,2.12.55,3.69,3.69,0,0,1,1.45,1.55A4.81,4.81,0,0,1,22.15,21.14Zm-2,.11a3.36,3.36,0,0,0-.57-2.06A1.83,1.83,0,0,0,18,18.44a2,2,0,0,0-1.61.75,3.17,3.17,0,0,0-.6,2,3.12,3.12,0,0,0,.59,2,2,2,0,0,0,3.15,0A3.08,3.08,0,0,0,20.12,21.25Z"/><polygon class="cls-3" points="28.67 25.49 23.57 25.49 23.57 16.92 25.5 16.92 25.5 23.92 28.67 23.92 28.67 25.49"/></svg>
<svg data-name="Layer 1" xmlns="http://www.w3.org/2000/svg" viewBox="0 0 36 36"><defs><style>.cls-1{fill:#2272b9;}.cls-2,.cls-3{fill:#fff;}.cls-2{opacity:0.15;isolation:isolate;}.cls-4{fill:#7fbb42;}.cls-5{fill:#b8d433;}</style></defs><title>SQL Database</title><path class="cls-1" d="M3.66,4.92V31.08C3.66,33.8,9.74,36,17.24,36V4.92Z"/><path class="cls-1" d="M17.06,36h.18c7.5,0,13.58-2.2,13.58-4.92V4.92H17.06Z"/><path class="cls-2" d="M17.06,36h.18c7.5,0,13.58-2.2,13.58-4.92V4.92H17.06Z"/><path class="cls-3" d="M30.82,4.92c0,2.71-6.08,4.92-13.58,4.92S3.66,7.63,3.66,4.92,9.74,0,17.24,0,30.82,2.2,30.82,4.92"/><path class="cls-4" d="M28.05,4.63c0,1.8-4.84,3.25-10.81,3.25S6.44,6.43,6.44,4.63s4.84-3.24,10.8-3.24S28.05,2.84,28.05,4.63"/><path class="cls-5" d="M25.78,6.62c1.42-.55,2.27-1.24,2.27-2,0-1.8-4.84-3.25-10.81-3.25S6.44,2.84,6.44,4.64c0,.74.85,1.43,2.26,2a25.2,25.2,0,0,1,8.54-1.26,25.12,25.12,0,0,1,8.54,1.26"/><path class="cls-3" d="M12.93,23.08A2.24,2.24,0,0,1,12.05,25a4,4,0,0,1-2.45.67,4.67,4.67,0,0,1-2.22-.48V23.25a3.44,3.44,0,0,0,2.27.87,1.53,1.53,0,0,0,.92-.24.74.74,0,0,0,.33-.63.9.9,0,0,0-.32-.68,5.44,5.44,0,0,0-1.27-.74,2.8,2.8,0,0,1-2-2.51,2.26,2.26,0,0,1,.85-1.85,3.52,3.52,0,0,1,2.27-.7,5.63,5.63,0,0,1,2.08.33v1.79a3.35,3.35,0,0,0-2-.6,1.46,1.46,0,0,0-.88.24.76.76,0,0,0-.32.63.9.9,0,0,0,.26.66,4.05,4.05,0,0,0,1.07.65,5.29,5.29,0,0,1,1.71,1.15A2.15,2.15,0,0,1,12.93,23.08Z"/><path class="cls-3" d="M22.15,21.14a4.89,4.89,0,0,1-.69,2.63,3.68,3.68,0,0,1-1.93,1.56L22,27.63H19.5l-1.77-2A4.14,4.14,0,0,1,15.67,25a3.78,3.78,0,0,1-1.42-1.54,4.72,4.72,0,0,1-.5-2.17,5.12,5.12,0,0,1,.54-2.38,3.85,3.85,0,0,1,1.52-1.6,4.43,4.43,0,0,1,2.25-.57,4.16,4.16,0,0,1,2.12.55,3.69,3.69,0,0,1,1.45,1.55A4.81,4.81,0,0,1,22.15,21.14Zm-2,.11a3.36,3.36,0,0,0-.57-2.06A1.83,1.83,0,0,0,18,18.44a2,2,0,0,0-1.61.75,3.17,3.17,0,0,0-.6,2,3.12,3.12,0,0,0,.59,2,2,2,0,0,0,3.15,0A3.08,3.08,0,0,0,20.12,21.25Z"/><polygon class="cls-3" points="28.67 25.49 23.57 25.49 23.57 16.92 25.5 16.92 25.5 23.92 28.67 23.92 28.67 25.49"/></svg>

До

Ширина:  |  Высота:  |  Размер: 2.0 KiB

После

Ширина:  |  Высота:  |  Размер: 2.0 KiB

Просмотреть файл

@ -1 +1 @@
<svg xmlns="http://www.w3.org/2000/svg" width="36" height="36" viewBox="0 0 36 36"><title>List Page</title><path d="M32.62,9.65V36H3.38V0H23Zm-2.24,24.1V11.25h-9v-9H5.63v31.5ZM23.63,9h5.15L23.63,3.85Z"/><rect x="9.36" y="26.13" width="11.38" height="1.81"/><rect x="9.36" y="21.88" width="17.75" height="1.81"/><rect x="9.36" y="17.63" width="14.56" height="1.81"/></svg>
<svg xmlns="http://www.w3.org/2000/svg" width="36" height="36" viewBox="0 0 36 36"><title>Icon Individual Artboards</title><path d="M32.62,9.65V36H3.38V0H23Zm-2.24,24.1V11.25h-9v-9H5.63v31.5ZM23.63,9h5.15L23.63,3.85Z"/><rect x="9.36" y="26.13" width="11.38" height="1.81"/><rect x="9.36" y="21.88" width="17.75" height="1.81"/><rect x="9.36" y="17.63" width="14.56" height="1.81"/></svg>

До

Ширина:  |  Высота:  |  Размер: 372 B

После

Ширина:  |  Высота:  |  Размер: 388 B

Различия файлов скрыты, потому что одна или несколько строк слишком длинны

До

Ширина:  |  Высота:  |  Размер: 1.7 MiB

После

Ширина:  |  Высота:  |  Размер: 1.7 MiB

Просмотреть файл

@ -1 +1 @@
<svg data-name="Layer 1" xmlns="http://www.w3.org/2000/svg" viewBox="0 0 36 36"><defs><style>.cls-1,.cls-2{fill:#fff;}.cls-2{stroke:#fff;stroke-miterlimit:10;stroke-width:0.75px;}</style></defs><title>List Page</title><path class="cls-1" d="M32.62,9.65V36H3.38V0H23Zm-2.24,24.1V11.25h-9v-9H5.63v31.5ZM23.63,9h5.15L23.63,3.85Z"/><path class="cls-2" d="M23.55,18v1.06H9.74V18ZM9.74,22.25h17v1.06h-17Zm0,5.31V26.5H20.36v1.06Z"/></svg>
<svg data-name="Layer 1" xmlns="http://www.w3.org/2000/svg" viewBox="0 0 36 36"><defs><style>.cls-1,.cls-2{fill:#fff;}.cls-2{stroke:#fff;stroke-miterlimit:10;stroke-width:0.75px;}</style></defs><title>Long List White</title><path class="cls-1" d="M32.62,9.65V36H3.38V0H23Zm-2.24,24.1V11.25h-9v-9H5.63v31.5ZM23.63,9h5.15L23.63,3.85Z"/><path class="cls-2" d="M23.55,18v1.06H9.74V18ZM9.74,22.25h17v1.06h-17Zm0,5.31V26.5H20.36v1.06Z"/></svg>

До

Ширина:  |  Высота:  |  Размер: 431 B

После

Ширина:  |  Высота:  |  Размер: 437 B

Просмотреть файл

@ -1 +1 @@
<svg xmlns="http://www.w3.org/2000/svg" width="36" height="36" viewBox="0 0 36 36"><title>Master Detail Page</title><path d="M32.62,9.65V36H3.38V0H23Zm-2.24,24.1V11.25h-9v-9H5.63v31.5ZM23.63,9h5.15L23.63,3.85Z"/><rect x="19.32" y="25.14" width="6.11" height="1.82" fill="#010101"/><polygon points="28.65 22.71 19.36 22.71 19.31 20.89 28.65 20.89 28.65 22.71" fill="#010101"/><rect x="19.32" y="16.64" width="7.75" height="1.82" fill="#010101"/><path d="M16.42,31.7H7.62V22.34h8.8ZM9.37,30h5.3V24.09H9.37Z" fill="#010101"/><path d="M16.42,24.09H7.62V14.72h8.8Z"/></svg>
<svg xmlns="http://www.w3.org/2000/svg" width="36" height="36" viewBox="0 0 36 36"><title>Icon Individual Artboards</title><path d="M32.62,9.65V36H3.38V0H23Zm-2.24,24.1V11.25h-9v-9H5.63v31.5ZM23.63,9h5.15L23.63,3.85Z"/><rect x="19.32" y="25.14" width="6.11" height="1.82" fill="#010101"/><polygon points="28.65 22.71 19.36 22.71 19.31 20.89 28.65 20.89 28.65 22.71" fill="#010101"/><rect x="19.32" y="16.64" width="7.75" height="1.82" fill="#010101"/><path d="M16.42,31.7H7.62V22.34h8.8ZM9.37,30h5.3V24.09H9.37Z" fill="#010101"/><path d="M16.42,24.09H7.62V14.72h8.8Z"/></svg>

До

Ширина:  |  Высота:  |  Размер: 569 B

После

Ширина:  |  Высота:  |  Размер: 576 B

Различия файлов скрыты, потому что одна или несколько строк слишком длинны

До

Ширина:  |  Высота:  |  Размер: 874 KiB

После

Ширина:  |  Высота:  |  Размер: 735 KiB

Просмотреть файл

@ -1 +1 @@
<svg data-name="Layer 1" xmlns="http://www.w3.org/2000/svg" viewBox="0 0 36 36"><defs><style>.cls-1,.cls-3{fill:#fff;}.cls-2{fill:none;stroke-width:1.75px;}.cls-2,.cls-3{stroke:#fff;stroke-miterlimit:10;}.cls-3{stroke-width:0.75px;}</style></defs><title>Master Detail Page</title><path class="cls-1" d="M32.62,9.65V36H3.38V0H23Zm-2.24,24.1V11.25h-9v-9H5.63v31.5ZM23.63,9h5.15L23.63,3.85Z"/><g id="Layer_1-2" data-name="Layer 1-2"><rect class="cls-2" x="8.49" y="15.59" width="7.05" height="15.23"/><path class="cls-3" d="M26.69,17v1.07h-7V17Zm-7,4.25h8.58v1.07H19.72Zm0,5.32V25.51h5.36v1.07Z"/><rect class="cls-1" x="8.49" y="15.59" width="7.05" height="7.62"/></g></svg>
<svg data-name="Layer 1" xmlns="http://www.w3.org/2000/svg" viewBox="0 0 36 36"><defs><style>.cls-1,.cls-3{fill:#fff;}.cls-2{fill:none;stroke-width:1.75px;}.cls-2,.cls-3{stroke:#fff;stroke-miterlimit:10;}.cls-3{stroke-width:0.75px;}</style></defs><title>Master detail White</title><path class="cls-1" d="M32.62,9.65V36H3.38V0H23Zm-2.24,24.1V11.25h-9v-9H5.63v31.5ZM23.63,9h5.15L23.63,3.85Z"/><g id="Layer_1-2" data-name="Layer 1-2"><rect class="cls-2" x="8.49" y="15.59" width="7.05" height="15.23"/><path class="cls-3" d="M26.69,17v1.07h-7V17Zm-7,4.25h8.58v1.07H19.72Zm0,5.32V25.51h5.36v1.07Z"/><rect class="cls-1" x="8.49" y="15.59" width="7.05" height="7.62"/></g></svg>

До

Ширина:  |  Высота:  |  Размер: 671 B

После

Ширина:  |  Высота:  |  Размер: 672 B

Просмотреть файл

@ -1 +1 @@
<svg data-name="Layer 1" xmlns="http://www.w3.org/2000/svg" viewBox="0 0 36 36"><defs><style>.cls-1{fill:#010101;}</style></defs><title>Multiple Pages</title><path class="cls-1" d="M33.17,7.93V29.58H26.85V27.73h4.48V9.25H23.94V1.85H11V6.43H9.15V0H25.28ZM25.79,7.4H30L25.79,3.17Z"/><polygon class="cls-1" points="26.84 29.58 26.84 36 2.83 36 2.83 6.43 9.15 6.43 9.15 8.28 4.67 8.28 4.67 34.15 25 34.15 25 29.58 26.84 29.58"/><rect class="cls-1" x="25.01" y="27.73" width="1.84" height="1.85"/><path class="cls-1" d="M26.85,14.36V27.73H25V15.67H17.62V8.28H11V6.43h7.93Zm-7.38-.54h4.22L19.47,9.59Z"/><rect class="cls-1" x="9.15" y="6.43" width="1.85" height="1.85"/></svg>
<svg data-name="Layer 1" xmlns="http://www.w3.org/2000/svg" viewBox="0 0 36 36"><defs><style>.cls-1{fill:#010101;}</style></defs><title>Blank Page copy</title><path class="cls-1" d="M33.17,7.93V29.58H26.85V27.73h4.48V9.25H23.94V1.85H11V6.43H9.15V0H25.28ZM25.79,7.4H30L25.79,3.17Z"/><polygon class="cls-1" points="26.84 29.58 26.84 36 2.83 36 2.83 6.43 9.15 6.43 9.15 8.28 4.67 8.28 4.67 34.15 25 34.15 25 29.58 26.84 29.58"/><rect class="cls-1" x="25.01" y="27.73" width="1.84" height="1.85"/><path class="cls-1" d="M26.85,14.36V27.73H25V15.67H17.62V8.28H11V6.43h7.93Zm-7.38-.54h4.22L19.47,9.59Z"/><rect class="cls-1" x="9.15" y="6.43" width="1.85" height="1.85"/></svg>

До

Ширина:  |  Высота:  |  Размер: 669 B

После

Ширина:  |  Высота:  |  Размер: 670 B

Различия файлов скрыты, потому что одна или несколько строк слишком длинны

До

Ширина:  |  Высота:  |  Размер: 10 KiB

После

Ширина:  |  Высота:  |  Размер: 10 KiB

Просмотреть файл

@ -1 +1 @@
<svg alt="Reorder Item" role="img" data-name="Layer 1" xmlns="http://www.w3.org/2000/svg" viewBox="0 0 36 36"><defs><style>.cls-1{fill:#FFFFFF;}</style></defs><title>Reorder</title><path class="cls-1" d="M18.77,8.79l-1.58,1.58L11.27,4.46l0,31.5H9L9,4.41l-6,6L1.48,8.79,10.13.15ZM32.92,25.63l1.6,1.58-8.65,8.64-8.66-8.64,1.6-1.58,5.92,5.93V0H27l0,31.53Z"/></svg>
<svg data-name="Layer 1" xmlns="http://www.w3.org/2000/svg" viewBox="0 0 36 36"><defs><style>.cls-1{fill:#FFFFFF;}</style></defs><title>Reorder</title><path class="cls-1" d="M18.77,8.79l-1.58,1.58L11.27,4.46l0,31.5H9L9,4.41l-6,6L1.48,8.79,10.13.15ZM32.92,25.63l1.6,1.58-8.65,8.64-8.66-8.64,1.6-1.58,5.92,5.93V0H27l0,31.53Z"/></svg>

До

Ширина:  |  Высота:  |  Размер: 361 B

После

Ширина:  |  Высота:  |  Размер: 331 B

Просмотреть файл

@ -1 +1 @@
<svg data-name="Layer 1" xmlns="http://www.w3.org/2000/svg" viewBox="0 0 36 36"><defs><style>.cls-1{fill:#fff;}</style></defs><title>Save</title><path class="cls-1" d="M33.43,0a2.51,2.51,0,0,1,1,.2,2.88,2.88,0,0,1,.82.55,2.88,2.88,0,0,1,.55.82,2.55,2.55,0,0,1,.2,1V36H4.6L0,31.38V2.57a2.55,2.55,0,0,1,.2-1A2.69,2.69,0,0,1,.75.75,2.88,2.88,0,0,1,1.57.2a2.55,2.55,0,0,1,1-.2Zm0,2.57H30.86V18H5.14V2.57H2.57V30.31l3.09,3.12H7.71V23.14h18V33.43h7.72ZM7.71,15.43H28.29V2.57H7.71ZM23.14,25.71H10.29v7.72h2.57V28.29h2.57v5.14h7.71Z"/></svg>
<svg data-name="Layer 1" xmlns="http://www.w3.org/2000/svg" viewBox="0 0 36 36"><defs><style>.cls-1{fill:#fff;}</style></defs><title>Save White</title><path class="cls-1" d="M33.43,0a2.51,2.51,0,0,1,1,.2,2.88,2.88,0,0,1,.82.55,2.88,2.88,0,0,1,.55.82,2.55,2.55,0,0,1,.2,1V36H4.6L0,31.38V2.57a2.55,2.55,0,0,1,.2-1A2.69,2.69,0,0,1,.75.75,2.88,2.88,0,0,1,1.57.2a2.55,2.55,0,0,1,1-.2Zm0,2.57H30.86V18H5.14V2.57H2.57V30.31l3.09,3.12H7.71V23.14h18V33.43h7.72ZM7.71,15.43H28.29V2.57H7.71ZM23.14,25.71H10.29v7.72h2.57V28.29h2.57v5.14h7.71Z"/></svg>

До

Ширина:  |  Высота:  |  Размер: 533 B

После

Ширина:  |  Высота:  |  Размер: 539 B

Просмотреть файл

@ -1 +1 @@
<svg xmlns="http://www.w3.org/2000/svg" width="36" height="36" viewBox="0 0 36 36"><title>Loading Spinner</title><path d="M18,2.68A15.32,15.32,0,1,1,2.68,18" fill="none"/><path d="M18,2.68A15.32,15.32,0,1,1,2.68,18" fill="none" stroke="#231f20" stroke-miterlimit="10" stroke-width="2"/></svg>
<svg xmlns="http://www.w3.org/2000/svg" width="36" height="36" viewBox="0 0 36 36"><title>Icon Individual Artboards</title><path d="M18,2.68A15.32,15.32,0,1,1,2.68,18" fill="none"/><path d="M18,2.68A15.32,15.32,0,1,1,2.68,18" fill="none" stroke="#231f20" stroke-miterlimit="10" stroke-width="2"/></svg>

До

Ширина:  |  Высота:  |  Размер: 293 B

После

Ширина:  |  Высота:  |  Размер: 303 B

Просмотреть файл

@ -1 +0,0 @@
<svg data-name="Layer 1" xmlns="http://www.w3.org/2000/svg" viewBox="0 0 36 36"><defs><style>.cls-1{fill:#4eb987;}.cls-2{fill:#455567;}</style></defs><title>VueJS</title><g id="g10"><g id="g12"><path id="path14" class="cls-1" d="M22.16,2.41,18,9.61l-4.16-7.2H0L18,33.59,36,2.41Z"/></g><g id="g16"><path id="path18" class="cls-2" d="M22.16,2.41,18,9.61l-4.16-7.2H7.2L18,21.12,28.8,2.41Z"/></g></g></svg>

До

Ширина:  |  Высота:  |  Размер: 402 B

Просмотреть файл

@ -1 +1 @@
<svg data-name="Layer 1" xmlns="http://www.w3.org/2000/svg" viewBox="0 0 36 36"><defs><style>.cls-1{fill:#231f20;}</style></defs><title>Warning</title><path class="cls-1" d="M36,36H0L18,0ZM3.88,33.6H32.12L18,5.36ZM19.2,14.4v12H16.8v-12ZM16.8,28.8h2.4v2.4H16.8Z"/></svg>
<svg data-name="Layer 1" xmlns="http://www.w3.org/2000/svg" viewBox="0 0 36 36"><defs><style>.cls-1{fill:#231f20;}</style></defs><title>Blank Page copy 2</title><path class="cls-1" d="M36,36H0L18,0ZM3.88,33.6H32.12L18,5.36ZM19.2,14.4v12H16.8v-12ZM16.8,28.8h2.4v2.4H16.8Z"/></svg>

До

Ширина:  |  Высота:  |  Размер: 269 B

После

Ширина:  |  Высота:  |  Размер: 279 B

Просмотреть файл

@ -1,39 +0,0 @@
import * as React from "react";
import { shallow } from "enzyme";
import { Card } from "./index";
describe("Card", () => {
let props: any;
let wrapper: any;
beforeEach(() => {
props = {
option: {
body: {
id: "cosmosResourceModule.addResource",
defaultMessage: "Add Resource"
},
title: {
id: "cosmosResourceModule.addResource",
defaultMessage: "Add Resource"
}
},
buttonText: "Test",
disabled: true,
handleButtonClick: () => {},
handleDetailsClick: () => {},
useNormalButtons: true,
intl: global.intl
};
wrapper = shallow(<Card {...props} />);
});
it("renders without crashing", () => {
expect(wrapper).toBeDefined();
});
it("should have 1 button", () => {
const buttons = wrapper.find("button");
expect(buttons.length).toBe(1);
});
});

Просмотреть файл

@ -9,6 +9,7 @@ import buttonStyles from "../../css/buttonStyles.module.css";
import styles from "./styles.module.css";
import { IOption } from "../../types/option";
import { Link } from "react-router-dom";
import classNames from "classnames";
import { ROUTES } from "../../utils/constants";
interface IProps {
@ -22,7 +23,7 @@ interface IProps {
type Props = IProps & InjectedIntlProps;
export const Card = ({
const Card = ({
option,
buttonText,
disabled,
@ -37,7 +38,7 @@ export const Card = ({
<div className={styles.loginContainer}>
<div className={styles.cardTitleContainer}>
{option.svgUrl && (
<img className={styles.icon} src={option.svgUrl} alt="" />
<img className={styles.icon} src={option.svgUrl} alt="icon" />
)}
<div className={styles.cardTitle}>
{intl.formatMessage(formattedTitle)}
@ -57,13 +58,10 @@ export const Card = ({
<FormattedMessage id="card.details" defaultMessage="Details" />
</Link>
<button
disabled={disabled!}
onClick={handleButtonClick}
className={classnames(styles.signInButton, {
[buttonStyles.buttonHighlighted]: !useNormalButtons,
[buttonStyles.buttonDark]: useNormalButtons,
[buttonStyles.buttonCursorDefault]: disabled,
[buttonStyles.buttonCursorPointer]: !disabled
[buttonStyles.buttonDark]: useNormalButtons
})}
tabIndex={disabled! ? -1 : 0}
>

Просмотреть файл

@ -27,7 +27,7 @@
.signInButton {
margin-left: 10px;
font-size: var(--vscode-font-size);
font-size: var(--vscode-editor-font-size);
border: none;
}
@ -37,7 +37,6 @@
.cardTitle {
margin-left: 10px;
font-size: 16px;
font-weight: bold;
}
@ -49,12 +48,12 @@
.cardTitleContainer {
display: flex;
align-items: center;
margin-bottom: 16px;
margin-bottom: 1em;
}
.details {
color: var(--vscode-textLink-foreground);
font-size: 14px;
font-size: var(--vscode-editor-font-size);
text-decoration: none;
}

Просмотреть файл

@ -44,12 +44,6 @@ const Details = ({
{props.children}
</a>
);
const ParagraphRenderer = (props: any) => (
<React.Fragment>
<p className={styles.longDescription}>{props.children}</p>
<br />
</React.Fragment>
);
const keyDownHandler = (event: any) => {
if (event.keyCode === 13 || event.keyCode === 32) {
handleBackClick();
@ -66,7 +60,7 @@ const Details = ({
source={intl.formatMessage(
info as FormattedMessage.MessageDescriptor
)}
renderers={{ link: LinkRenderer, paragraph: ParagraphRenderer }}
renderers={{ link: LinkRenderer }}
/>
);
}
@ -76,7 +70,7 @@ const Details = ({
return (
<ReactMarkdown
source={info as string}
renderers={{ link: LinkRenderer, paragraph: ParagraphRenderer }}
renderers={{ link: LinkRenderer }}
/>
);
} else {
@ -100,90 +94,82 @@ const Details = ({
</div>
</div>
</div>
<div className={styles.headerContainer}>
{detailInfo.internalName &&
(getSvg(detailInfo.internalName, styles.icon) || (
<img className={styles.icon} src={detailInfo.svgUrl} alt="" />
))}
<div className={styles.detailsTitle}>
{renderFormattedData(detailInfo.title, false)}
</div>
</div>
<div className={styles.detailsContainer}>
<div className={styles.spacer} />
<div>
{detailInfo.internalName &&
(getSvg(detailInfo.internalName, styles.icon) || (
<img
className={styles.icon}
src={detailInfo.svgUrl}
alt="icon"
/>
))}
</div>
<div>
<div className={styles.detailsTitle}>
{renderFormattedData(detailInfo.title, false)}
</div>
<div className={styles.detailsDescription}>
{renderFormattedData(detailInfo.longDescription, true)}
</div>
<div>
{detailInfo.author && (
<div className={classnames(styles.metaData, grid.row)}>
<div className={classnames(styles.category, styles.colWidth)}>
<FormattedMessage
id="details.author"
defaultMessage="Author:"
/>
</div>
<div className={grid.col8}>
{<ReactMarkdown source={detailInfo.author} /> ||
intl!.formatMessage(messages.none)}
</div>
<div className={classnames(styles.metaData, grid.row)}>
<div className={classnames(styles.category, grid.col4)}>
<FormattedMessage
id="details.author"
defaultMessage="Author:"
/>
</div>
)}
<div className={grid.col8}>
{<ReactMarkdown source={detailInfo.author} /> ||
intl!.formatMessage(messages.none)}
</div>
</div>
</div>
<div>
{detailInfo.licenses && (
<div className={classnames(styles.metaData, grid.row)}>
<div
className={classnames(
styles.licenseCategory,
styles.colWidth
)}
>
<FormattedMessage
id="details.licenses"
defaultMessage="Licenses:"
/>
</div>
<div className={classnames(grid.col8, styles.licenses)}>
{Array.isArray(detailInfo.licenses)
? detailInfo.licenses.map(
(license: License, idx: number) => {
const licenseObject = license as ILicenseObject;
return (
<p key={license + idx.toString()}>
<a
className={styles.link}
href={licenseObject.url}
>
{licenseObject.text}
</a>
</p>
);
}
)
: (
<ReactMarkdown
source={detailInfo.licenses}
renderers={{ link: LinkRenderer }}
/>
) || intl!.formatMessage(messages.none)}
</div>
<div className={classnames(styles.metaData, grid.row)}>
<div className={classnames(styles.licenseCategory, grid.col4)}>
<FormattedMessage
id="details.licenses"
defaultMessage="Licenses:"
/>
</div>
)}
{detailInfo.version && (
<div className={classnames(styles.metaData, grid.row)}>
<div className={classnames(styles.category, styles.colWidth)}>
<FormattedMessage
id="details.version"
defaultMessage="Version:"
/>
</div>
<div className={grid.col8}>
<ReactMarkdown source={detailInfo.version} />
</div>
<div className={classnames(grid.col8, styles.licenses)}>
{Array.isArray(detailInfo.licenses)
? detailInfo.licenses.map(
(license: License, idx: number) => {
const licenseObject = license as ILicenseObject;
return (
<p key={license + idx.toString()}>
<a
className={styles.link}
href={licenseObject.url}
>
{licenseObject.text}
</a>
</p>
);
}
)
: (
<ReactMarkdown
source={detailInfo.licenses}
renderers={{ link: LinkRenderer }}
/>
) || intl!.formatMessage(messages.none)}
</div>
)}
</div>
<div className={classnames(styles.metaData, grid.row)}>
<div className={classnames(styles.category, grid.col4)}>
<FormattedMessage
id="details.version"
defaultMessage="Version:"
/>
</div>
<div className={grid.col8}>
<ReactMarkdown source={detailInfo.version || "1.0"} />
</div>
</div>
</div>
</div>
</div>

Просмотреть файл

@ -1,15 +1,8 @@
.icon {
height: 36px;
width: 36px;
margin-right: 16px;
}
.spacer {
margin-right: 52px;
}
.backIcon path {
fill: var(--vscode-editor-foreground);
height: 48px;
width: 48px;
margin-right: 48px;
padding-right: 20px;
}
.backIcon path {
@ -23,13 +16,14 @@
}
.container {
margin: 48px;
max-width: 65%;
margin: 2em;
padding: 2em;
max-width: 40em;
}
.backContainer {
display: flex;
margin-bottom: 48px;
margin-bottom: 4em;
}
.innerBackContainer {
@ -42,14 +36,8 @@
outline: 1px solid var(--vscode-contrastActiveBorder);
}
.headerContainer,
.detailsContainer {
display: flex;
margin-bottom: 12px;
}
.headerContainer {
align-items: center;
}
.licenseCategory {
@ -63,16 +51,17 @@
.detailsTitle {
font-weight: bold;
font-size: 20px;
font-size: 24px;
margin-top: 0.5em;
margin-bottom: 1em;
}
.licenses {
margin-top: 0px !important;
margin-bottom: 0px !important;
}
.detailsDescription {
margin-bottom: 0px;
margin-bottom: 1em;
}
.categoriesContainer {
@ -82,12 +71,10 @@
.metaData {
display: flex;
align-items: center;
width: 80% !important;
}
.details {
padding-top: 2px;
font-size: 14px;
color: var(--vscode-textLink-foreground);
cursor: pointer;
}
@ -98,18 +85,10 @@
.link {
color: var(--vscode-textLink-foreground);
font-weight: var(--vscode-font-weight);
font-weight: var(--vscode-editor-font-weight);
text-decoration: none;
}
.link:focus {
outline: 1px solid var(--vscode-contrastActiveBorder);
}
.longDescription {
line-height: 1.75em;
}
.colWidth {
width: 70px;
}

Просмотреть файл

@ -37,8 +37,7 @@ const DraggableSidebarItem = ({
handleCloseClick,
intl,
customInputStyle,
isAzureFunction,
totalPageCount
isAzureFunction
}: {
page?: ISelected;
text?: string;
@ -55,7 +54,6 @@ const DraggableSidebarItem = ({
intl: InjectedIntl;
customInputStyle?: string;
isAzureFunction?: boolean;
totalPageCount?: number;
}) => {
const handleKeyDown = (event: any) => {
if (event.keyCode === 13 || event.keyCode === 32) {
@ -98,9 +96,9 @@ const DraggableSidebarItem = ({
<div className={styles.inputContainer}>
{reorderSvgUrl &&
(getSvg(page!.internalName, styles.icon) || (
<img className={styles.icon} src={pageSvgUrl} alt="" />
<img className={styles.icon} src={pageSvgUrl} />
))}
{handleInputChange && (page || isAzureFunction) && idx ? (
{handleInputChange && (page || isAzureFunction) && idx && (
<input
aria-label={intl.formatMessage(messages.changeItemName)}
className={classnames(styles.input, {
@ -113,17 +111,8 @@ const DraggableSidebarItem = ({
}
}}
/>
) : (
<input
className={classnames(
styles.disabledInput,
styles.input,
customInputStyle
)}
value={text}
disabled={true}
/>
)}
<div>{text}</div>
</div>
</div>
{((page && !page.isValidTitle) ||
@ -141,14 +130,12 @@ const DraggableSidebarItem = ({
</div>
)}
</div>
{(totalPageCount !== undefined ? totalPageCount > 1 : true) &&
<CloseSVG
tabIndex={0}
onClick={handleCloseOnClick}
onKeyDown={handleKeyDown}
className={styles.cancelIcon}
/>
}
</div>
</div>
);

Просмотреть файл

@ -10,8 +10,9 @@
.errorStack {
width: 100%;
display: block;
position: relative;
display: flex;
flex-direction: column;
justify-content: flex-end;
}
.textContainer,
@ -35,12 +36,9 @@
justify-content: space-between;
align-items: center;
padding: 0px 10px;
border-radius: 2px;
font-size: 90%;
opacity: 50%;
box-sizing: border-box;
position: absolute;
width: calc(100 - 8px);
z-index: 1;
}
.pagesTextContainer {
@ -104,7 +102,6 @@
.inputContainer {
display: flex;
align-items: center;
width: 100%;
}
.azureFunctionNameInput,
@ -119,10 +116,6 @@
border: none;
}
.disabledInput {
padding-left: 0px;
}
.azureFunctionNameInput {
padding-left: 0;
}
@ -132,4 +125,4 @@
align-items: center;
width: 20px;
padding-top: 8px;
}
}

Просмотреть файл

@ -58,7 +58,6 @@ export default {
...base,
// kill the white space on first and last option
padding: 0,
background: "var(--vscode-editor-background)",
border: "0.5px solid var(--vscode-editor-foreground)"
background: "var(--vscode-editor-background)"
})
};

Просмотреть файл

@ -6,7 +6,8 @@ import { withRouter } from "react-router-dom";
import {
InjectedIntlProps,
injectIntl,
defineMessages
defineMessages,
FormattedMessage
} from "react-intl";
import LeftSidebarLink from "../LeftSidebarLink";
@ -19,8 +20,8 @@ import { isValidNameAndProjectPathSelector } from "../../selectors/wizardSelecti
const messages = defineMessages({
welcome: {
id: "leftSidebar.newProject",
defaultMessage: "1. New Project"
id: "leftSidebar.welcome",
defaultMessage: "1. Welcome"
},
projectType: {
id: "leftSidebar.projectType",
@ -112,6 +113,12 @@ const LeftSidebar = (props: Props) => {
);
})}
</div>
<a href="https://aka.ms/give-feedback" className={styles.feedback}>
<FormattedMessage
id="leftSidebar.giveFeedback"
defaultMessage="Give Feedback"
/>
</a>
</nav>
)}
</React.Fragment>

Просмотреть файл

@ -2,11 +2,7 @@
display: flex;
flex-direction: column;
justify-content: space-between;
box-sizing: border-box;
margin-top: 51px;
margin-bottom: 53px;
padding-top: 10%;
overflow: auto;
padding-top: 15%;
}
.itemBorder {
@ -30,22 +26,16 @@
width: 350px;
background-color: var(--vscode-editor-background);
height: 100vh;
border-right: 0.5px solid #7f7f7f;
border-right: 0.5px solid #555555;
box-sizing: border-box;
height: calc(100vh - 104px);
height: calc(100vh - 70.625px);
}
.feedback {
text-align: center;
color: var(--vscode-textLink-foreground);
text-decoration: none;
margin-bottom: 19px;
margin-top: 19px;
font-size: 14px;
}
.feedback:focus {
outline: 1px solid var(--vscode-contrastActiveBorder);
margin-bottom: 10px;
}
.feedback:focus {

Просмотреть файл

@ -32,7 +32,7 @@ const LoginCard = ({
return (
<div className={styles.loginContainer}>
<div className={styles.cardTitle}>
<img className={styles.icon} src={svgUrl} alt="" />
<img className={styles.icon} src={svgUrl} alt="icon" />
{cardTitle}
</div>
<div className={styles.cardBody}>

Просмотреть файл

@ -10,7 +10,7 @@
align-items: center;
justify-content: space-between;
color: var(--vscode-textLink-foreground);
font-size: var(--vscode-font-size);
font-size: var(--vscode-editor-font-size);
}
.createAccountButton {
@ -29,7 +29,7 @@
.signInButton {
font-size: 1em;
margin-left: 16px;
margin-left: 10px;
border: none;
}
@ -39,19 +39,18 @@
.cardTitle {
font-weight: bold;
font-size: 16px;
margin-bottom: 16px;
margin-bottom: 25px;
display: flex;
align-items: center;
}
.cardBody {
margin-bottom: 5%;
margin-bottom: 1em;
}
.details {
color: var(--vscode-textLink-foreground);
font-size: 14px;
font-size: var(--vscode-editor-font-size);
background: none;
border: none;
text-decoration: none;
@ -68,5 +67,5 @@
.icon {
height: 36px;
margin-right: 10px;
margin-right: 0.5em;
}

Просмотреть файл

@ -16,36 +16,32 @@ import Modal from "react-modal";
* Custom styling guidance:
* https://reactcommunity.org/react-modal/styles/
*/
const getCustomStyles = (isPostGenModalOpen: boolean) => {
return {
overlay: {
position: "fixed",
top: 0,
left: 0,
right: 0,
bottom: 0,
backgroundColor: "rgba(0, 0, 0, 0.6)"
},
content: {
top: "50%",
left: "50%",
right: "auto",
bottom: "auto",
marginRight: "-50%",
transform: "translate(-50%, -50%)",
borderRadius: "0px",
width: isPostGenModalOpen ? "30%" : "40%",
padding: "2.4%",
background: "var(--vscode-menu-background)",
border: "0.5px solid var(--vscode-editor-foreground)"
}
};
const customStyles = {
overlay: {
position: "fixed",
top: 0,
left: 0,
right: 0,
bottom: 0,
backgroundColor: "rgba(0, 0, 0, 0.6)"
},
content: {
top: "50%",
left: "50%",
right: "auto",
bottom: "auto",
marginRight: "-50%",
transform: "translate(-50%, -50%)",
borderRadius: "0px",
width: "40%",
padding: "2.4%",
background: "var(--vscode-menu-background)"
}
};
interface IProps {
closeModal: () => any;
isModalOpen: boolean;
isPostGenModalOpen: boolean;
}
const asModal = <P extends object>(
@ -54,17 +50,15 @@ const asModal = <P extends object>(
return class extends React.Component<P & IProps> {
static defaultProps = {
isModalOpen: false,
isPostGenModalOpen: false,
closeModal: () => {}
};
render() {
const { isPostGenModalOpen } = this.props;
return (
<Modal
isOpen={this.props.isModalOpen}
onRequestClose={this.props.closeModal}
contentLabel="Modal Display"
style={getCustomStyles(isPostGenModalOpen)}
style={customStyles}
ariaHideApp={false}
>
<WrappedComponent {...this.props as P} />

Просмотреть файл

@ -46,16 +46,13 @@
opacity: 50%;
min-height: 38px;
overflow: auto;
box-sizing: border-box;
position: absolute;
width: 100%;
z-index: 1;
}
.errorStack {
width: 100%;
display: block;
position: relative;
display: flex;
flex-direction: column;
justify-content: flex-end;
}
.outputPath {
@ -68,5 +65,5 @@
width: 100%;
font-size: 1em;
background-color: var(--vscode-input-background);
border: 0.5px solid var(--vscode-editor-foreground);
}
border: 1px solid var(--vscode-editor-foreground);
}

Просмотреть файл

@ -1,10 +1,8 @@
.dropdownTitle {
font-weight: bold;
margin-bottom: 3px;
font-size: 14px;
}
.sidebarItem {
margin: 15px;
margin-bottom: 30px;
}
}

Просмотреть файл

@ -73,7 +73,7 @@ const SelectableCard = ({
<div className={styles.icon}>
{getSvg(option.internalName, iconStyles) ||
(iconPath && (
<img src={iconPath} className={iconStyles} alt="" />
<img src={iconPath} className={iconStyles} alt="icon" />
))}
</div>
<div
@ -109,17 +109,7 @@ const SelectableCard = ({
[styles.cardCount]: selected && clickCount
})}
>
{clickCount || (
<div className={styles.selectedText}>
<div>
<FormattedMessage
id="selectableCard.selected"
defaultMessage="Selected"
/>
</div>
<Check className={styles.iconCheckMark} />
</div>
)}
{clickCount || <Check className={styles.iconCheckMark} />}
</div>
</div>
</div>

Просмотреть файл

@ -36,7 +36,7 @@
}
.iconCheckMark {
margin-left: 8px;
padding-left: 5px;
height: 18px;
width: 18px;
align-self: center;
@ -66,7 +66,7 @@
display: flex;
justify-content: space-between;
align-items: center;
min-height: 30px;
max-height: 22px;
}
.icon {
@ -89,17 +89,17 @@
}
.titleLeftJustified {
margin-left: 10px;
margin-left: 0px;
}
.body {
margin-top: 16px;
margin-top: 15px;
margin-bottom: 10px;
}
.link {
color: var(--vscode-textLink-foreground);
font-size: 14px;
font-size: var(--vscode-editor-font-size);
text-decoration: none;
}
@ -120,8 +120,3 @@
padding: 3px;
border-radius: 50%;
}
.selectedText {
display: flex;
font-size: 14px;
}

Просмотреть файл

@ -17,14 +17,12 @@ const SortableSidebarItem = SortableElement(
page,
idx,
handleInputChange,
handleCloseClick,
totalPageCount
handleCloseClick
}: {
page: any;
idx: number;
handleInputChange: any;
handleCloseClick?: (idx: number) => void;
totalPageCount: number;
}) => {
return (
<DraggableSidebarItem
@ -35,7 +33,6 @@ const SortableSidebarItem = SortableElement(
handleInputChange={handleInputChange}
handleCloseClick={handleCloseClick}
idx={idx + 1}
totalPageCount={totalPageCount}
/>
);
// use idx+1 to prevent falsiness of 0th value
@ -61,7 +58,7 @@ const SortableSummaryTile = SortableElement(
<React.Fragment>
<div className={styles.tileContainer}>
<SummaryTile
originalTitle={page.defaultName}
originalTitle={page.id}
title={page.title}
version="v1.0"
internalName={page.internalName}
@ -86,21 +83,20 @@ const SortableSummaryTile = SortableElement(
const SortableList = SortableContainer(
({
pages,
isSummaryPage,
pagesRows,
handleInputChange,
handleCloseClick
}: {
pages: ISelected[];
isSummaryPage?: boolean;
pagesRows?: any[];
handleInputChange: any;
handleCloseClick?: (idx: number) => void;
}) => {
const totalPageCount = pages.length;
return (
<div>
{!isSummaryPage && (
<div className={styles.sidebarItem}>
{pages.map((page: ISelected, idx: number) => {
<div className={styles.sidebarItem}>
{!pagesRows &&
pages.map((page: any, idx: number) => {
return (
<SortableSidebarItem
key={page.id}
@ -109,16 +105,14 @@ const SortableList = SortableContainer(
page={page}
handleInputChange={handleInputChange}
handleCloseClick={handleCloseClick}
totalPageCount={totalPageCount}
/>
);
})
// index prop required by react-sortable, while idx used for updating redux state changes
}
</div>
)}
{isSummaryPage &&
pages.map((page: ISelected, idx: number) => {
// index prop required by react-sortable, while idx used for updating redux state changes
}
</div>
{pagesRows &&
pagesRows.map((page: any, idx: number) => {
return (
<SortableSummaryTile
key={`item-${page.id}`}
@ -127,7 +121,7 @@ const SortableList = SortableContainer(
page={page}
handleInputChange={handleInputChange}
handleCloseClick={handleCloseClick}
error={page.error}
error={pages[idx].error}
/>
);
})}

Просмотреть файл

@ -40,7 +40,6 @@ interface IProps {
showFolderIcon?: boolean;
subTitle?: string;
error?: string | FormattedMessage.MessageDescriptor;
canDelete?: boolean;
}
type Props = IProps & InjectedIntlProps;
@ -63,8 +62,7 @@ const SummaryTile = ({
showFolderIcon,
subTitle,
intl,
error,
canDelete
error
}: Props) => {
const [componentTitle, setTitle] = React.useState(title);
const [isDisabled, setDisabled] = React.useState(true);
@ -83,9 +81,7 @@ const SummaryTile = ({
setTitle(target.value);
};
const handleClick = () => {
if (isEditable && !canDelete) {
setDisabled(false);
}
setDisabled(false);
};
const handleFocusOut = () => {
setDisabled(true);
@ -126,11 +122,6 @@ const SummaryTile = ({
setEditable(false);
}
};
const handleKeyDown = (event: any) => {
if (event.keyCode === 13) {
handleFocusOut();
}
};
return (
<div
className={styles.container}
@ -140,106 +131,84 @@ const SummaryTile = ({
>
{isDraggable && <ReorderSVG className={styles.reorder} />}
<div
className={classnames(styles.container, {
[styles.indent]: withIndent
role="button"
tabIndex={isEditable ? 0 : -1}
className={classnames({
[styles.indent]: withIndent,
[styles.summaryTileContainer]: isEditable,
[styles.disableHover]: !isEditable
})}
onKeyDown={onSummaryTileLeave}
>
<div
role="button"
tabIndex={isEditable ? 0 : -1}
className={classnames({
[styles.summaryTileContainer]: isEditable,
[styles.disableHover]: !isEditable
})}
onKeyDown={onSummaryTileLeave}
>
<div className={styles.leftContainer}>
{showFolderIcon ? (
<FolderSVG className={styles.leftIcon} />
) : (
getSvg(internalName as string, styles.leftIcon) || (
<img
alt=""
src={getSvgUrl(internalName as string)}
className={styles.leftIcon}
/>
)
)}
<div className={styles.tileContent}>
<div className={styles.errorStack} onDoubleClick={handleClick}>
<input
aria-label={intl.formatMessage(messages.changeItemName)}
ref={inputRef}
className={styles.tileInput}
value={componentTitle}
onChange={handleChange}
disabled={isDisabled}
onBlur={handleFocusOut}
onKeyDown={handleKeyDown}
/>
{error && <div className={styles.errorMessage}>{error}</div>}
</div>
<div className={styles.metaData}>
{
<React.Fragment>
{subTitle ? (
<input
className={styles.subTitle}
value={subTitle}
disabled={true}
/>
) : (
originalTitle && (
<div className={styles.leftContainer}>
{showFolderIcon ? (
<FolderSVG className={styles.leftIcon} />
) : (
getSvg(internalName as string, styles.leftIcon) || (
<img
src={getSvgUrl(internalName as string)}
className={styles.leftIcon}
/>
)
)}
<div className={styles.tileContent}>
<input
aria-label={intl.formatMessage(messages.changeItemName)}
ref={inputRef}
className={styles.tileInput}
value={componentTitle}
onChange={handleChange}
disabled={isDisabled}
onBlur={handleFocusOut}
onClick={handleClick}
/>
<div className={styles.metaData}>
{(error && (
<div className={styles.errorMessage}>{error}</div>
)) || (
<React.Fragment>
{subTitle
? subTitle
: originalTitle && (
<React.Fragment>
<div>{originalTitle}</div>
<div>&nbsp;|&nbsp;</div>
</React.Fragment>
)
)}
{author && (
<React.Fragment>
{author && (
<div>
{(subTitle || originalTitle) && (
<span>&nbsp;|&nbsp;</span>
)}
{author}
</div>
)}
{version && (
<React.Fragment>
<div>&nbsp;|&nbsp;</div>
<div>{version}</div>
</React.Fragment>
)}
</React.Fragment>
)}
</React.Fragment>
}
</div>
)}
{author && (
<React.Fragment>
{author && <div>{author}</div>}
{version && (
<React.Fragment>
<div>&nbsp;|&nbsp;</div>
<div>{version}</div>
</React.Fragment>
)}
</React.Fragment>
)}
</React.Fragment>
)}
</div>
</div>
<div className={styles.editSpacer}>
{showEditable && !withoutEditIcon && !canDelete && (
<EditSVG
tabIndex={0}
className={styles.rightIcon}
onClick={handleClick}
onKeyDown={onEditKeyDown}
/>
)}
</div>
</div>
<div className={styles.spacer}>
<CloseSVG
{showEditable && !withoutEditIcon && (
<EditSVG
tabIndex={0}
onClick={onCloseClick}
onKeyDown={onCloseKeyDown}
className={classnames(styles.closeIcon, {
[styles.hidden]: !showEditable || !isEditable
})}
className={styles.rightIcon}
onClick={handleClick}
onKeyDown={onEditKeyDown}
/>
</div>
)}
</div>
<div className={styles.spacer}>
<CloseSVG
tabIndex={0}
onClick={onCloseClick}
onKeyDown={onCloseKeyDown}
className={classnames(styles.closeIcon, {
[styles.hidden]: !showEditable || !isEditable
})}
/>
</div>
</div>
);

Просмотреть файл

@ -2,7 +2,6 @@
display: flex;
justify-content: space-between;
align-items: center;
width: 100%;
}
.disableHover,
@ -14,8 +13,7 @@
padding: 11px;
justify-content: space-between;
width: 100%;
margin-right: 11px;
box-sizing: border-box;
margin-right: 10px;
}
.summaryTileContainer:hover {
@ -43,19 +41,8 @@
.closeIcon,
.rightIcon {
height: 18px;
width: 18px;
}
.rightIcon {
margin-left: 10px;
}
.leftIcon path,
.reorder path,
.closeIcon path,
.rightIcon path {
fill: var(--vscode-editor-foreground);
max-height: 18px;
padding: 3px;
}
.leftIcon path,
@ -75,10 +62,8 @@
.rightIcon:hover {
cursor: pointer;
}
.rightIcon:focus {
outline: 1px solid var(--vscode-contrastActiveBorder);
padding: 3px;
border-radius: 3px;
}
.rightIcon:focus {
@ -89,29 +74,13 @@
width: 24px;
}
.editSpacer {
width: 30px;
padding: 3px;
}
.tileInput {
font-size: 18px;
font-weight: bold;
background-color: var(--vscode-sideBar-background);
border: none;
max-width: 100%;
max-width: 300px;
color: var(--vscode-editor-foreground);
text-overflow: ellipsis;
width: 100%;
}
.subTitle {
background-color: var(--vscode-sideBar-background);
border: none;
max-width: 100%;
color: var(--vscode-editor-foreground);
text-overflow: ellipsis;
width: 100%;
}
.tileInput:focus {
@ -155,13 +124,4 @@
opacity: 50%;
min-height: 38px;
font-size: 15px;
box-sizing: border-box;
position: absolute;
z-index: 1;
max-width: 100%;
}
.errorStack {
display: block;
position: relative;
}

Просмотреть файл

@ -2,6 +2,6 @@
font-size: 18px;
margin-top: 1.75em;
margin-right: 1%;
margin-bottom: 12px;
font-weight: 500;
}
margin-bottom: 3px;
font-weight: bold;
}

Просмотреть файл

@ -1,5 +1,6 @@
import * as React from "react";
import { connect } from "react-redux";
import { ILicenseObject } from "../../types/license";
import styles from "./styles.module.css";
import { getVersionsSelector } from "../../selectors/vscodeApiSelector";
@ -38,7 +39,7 @@ const About = ({ versions, intl }: Props) => {
return (
<div className={styles.container}>
<div className={styles.title}>{intl.formatMessage(messages.about)}</div>
<p className={styles.repo}>
<p>
<a
className={styles.link}
href="https://github.com/Microsoft/WebTemplateStudio"
@ -46,6 +47,7 @@ const About = ({ versions, intl }: Props) => {
Web Template Studio
</a>
</p>
<br />
<p>
<a
className={styles.link}
@ -53,7 +55,7 @@ const About = ({ versions, intl }: Props) => {
>
<FormattedMessage
id="about.reportAnIssue"
defaultMessage="Give Feedback or Report an issue"
defaultMessage="Report an issue"
/>
</a>
</p>

Просмотреть файл

@ -1,7 +1,6 @@
.title {
font-weight: bold;
margin-bottom: 3px;
font-size: 14px;
}
.container {
@ -20,8 +19,3 @@
.name {
margin-bottom: 1.5em;
}
.repo {
font-size: 14px;
margin-bottom: 30px;
}

Просмотреть файл

@ -26,7 +26,8 @@ import buttonStyles from "../../css/buttonStyles.module.css";
import {
EXTENSION_COMMANDS,
EXTENSION_MODULES,
WIZARD_CONTENT_INTERNAL_NAMES
WIZARD_CONTENT_INTERNAL_NAMES,
INTL_MESSAGES
} from "../../utils/constants";
import styles from "./styles.module.css";
import { Dispatch } from "redux";
@ -147,13 +148,11 @@ const AzureFunctionsResourceModal = (props: Props) => {
}
};
// The data we are presenting to the user (available resource groups, locations)
const [functionsData, setData] = React.useState(
azureFunctionModalInitialState
);
// Hardcoding a "node" value until data can be loaded dynamically
// Updates the data we are presenting to the user when the subscription changes
React.useEffect(() => {
setData({
appName: [
@ -165,7 +164,7 @@ const AzureFunctionsResourceModal = (props: Props) => {
runtimeStack: [
{
value: "node",
label: "JavaScript"
label: "node"
}
],
subscription: props.subscriptions,
@ -173,12 +172,10 @@ const AzureFunctionsResourceModal = (props: Props) => {
location: props.subscriptionData.locations
});
}, [props.subscriptionData]);
// The data the user has entered into the modal
const [azureFunctionsFormData, updateForm] = React.useState(initialState);
const [formIsSendable, setFormIsSendable] = React.useState(false);
// Updates the data the user enters (azureFunctionsFormData) as the user types
const handleChange = (updatedFunctionsForm: IFunctionsState) => {
setFunctionsModalButtonStatus(
updatedFunctionsForm,
@ -189,14 +186,14 @@ const AzureFunctionsResourceModal = (props: Props) => {
updateForm(updatedFunctionsForm);
};
const handleDropdown = (infoLabel: string, option: IDropDownOptionType) => {
const handleDropdown = (infoLabel: string, value: string) => {
// Send command to extension on change
// Populate resource groups on received commands
let updatedForm = {
...azureFunctionsFormData,
[infoLabel]: {
value: option.value,
label: option.label
value: value,
label: value
}
};
if (infoLabel === FORM_CONSTANTS.SUBSCRIPTION.value) {
@ -209,7 +206,7 @@ const AzureFunctionsResourceModal = (props: Props) => {
module: EXTENSION_MODULES.AZURE,
command: EXTENSION_COMMANDS.SUBSCRIPTION_DATA_FUNCTIONS,
track: true,
subscription: option.value
subscription: value
});
updatedForm = {
...updatedForm,
@ -226,7 +223,8 @@ const AzureFunctionsResourceModal = (props: Props) => {
* Listens on account name change and validates the input in VSCode
*/
React.useEffect(() => {
if (azureFunctionsFormData.appName.value !== "") {
if (azureFunctionsFormData.appName.value != "") {
props.setValidationStatus(true);
if (timeout) {
clearTimeout(timeout);
}
@ -241,7 +239,7 @@ const AzureFunctionsResourceModal = (props: Props) => {
});
}, 700);
}
}, [azureFunctionsFormData.appName.value]);
}, [azureFunctionsFormData.appName]);
React.useEffect(() => {
if (props.selection) {
@ -269,10 +267,6 @@ const AzureFunctionsResourceModal = (props: Props) => {
*/
const handleInput = (e: React.SyntheticEvent<HTMLInputElement>): void => {
const element = e.currentTarget as HTMLInputElement;
// Changes in account name will trigger an update in validation status
// Set validation status here to avoid premature error messages
props.setValidationStatus(true);
handleChange({
...azureFunctionsFormData,
appName: {
@ -325,7 +319,7 @@ const AzureFunctionsResourceModal = (props: Props) => {
ariaLabel={ariaLabel}
options={options}
handleChange={option => {
handleDropdown(formSectionId, option);
handleDropdown(formSectionId, option.value);
}}
value={
azureFunctionsFormData[formSectionId].value
@ -387,14 +381,16 @@ const AzureFunctionsResourceModal = (props: Props) => {
DEFAULT_VALUE
)}
<div
className={classnames(
styles.selectionInputContainer,
styles.selectionContainer,
{
[styles.selectionContainerDisabled]:
azureFunctionsFormData.subscription.value === ""
}
)}
className={classnames({
[styles.selectionInputContainer]:
!isAppNameAvailable &&
azureFunctionsFormData.appName.value.length > 0,
[styles.selectionContainer]:
isAppNameAvailable ||
azureFunctionsFormData.appName.value.length === 0,
[styles.selectionContainerDisabled]:
azureFunctionsFormData.subscription.value === ""
})}
>
<div className={styles.selectionHeaderContainer}>
<div>{props.intl.formatMessage(messages.appName)}</div>
@ -406,31 +402,33 @@ const AzureFunctionsResourceModal = (props: Props) => {
documents.azure.com
</a>
</div>
<div className={styles.errorStack}>
<div className={styles.inputContainer}>
<input
aria-label={props.intl.formatMessage(messages.ariaAppNameLabel)}
className={styles.input}
onChange={handleInput}
value={azureFunctionsFormData.appName.value}
placeholder={FORM_CONSTANTS.APP_NAME.label}
disabled={azureFunctionsFormData.subscription === ""}
tabIndex={
azureFunctionsFormData.subscription.value === "" ? -1 : 0
}
/>
{isAppNameAvailable && !isValidatingName && (
<GreenCheck className={styles.validationIcon} />
)}
{isValidatingName && <Spinner className={styles.spinner} />}
</div>
{!isValidatingName && !isAppNameAvailable &&
azureFunctionsFormData.appName.value.length > 0 && (
<div className={styles.errorMessage}>
{props.appNameAvailability.message}
</div>
)}
<div
className={classnames(styles.inputContainer, {
[styles.borderRed]:
!isAppNameAvailable &&
azureFunctionsFormData.appName.value.length > 0
})}
>
<input
aria-label={props.intl.formatMessage(messages.ariaAppNameLabel)}
className={styles.input}
onChange={handleInput}
value={azureFunctionsFormData.appName.value}
placeholder={FORM_CONSTANTS.APP_NAME.label}
disabled={azureFunctionsFormData.subscription === ""}
tabIndex={azureFunctionsFormData.subscription.value === "" ? -1 : 0}
/>
{isAppNameAvailable && !isValidatingName && (
<GreenCheck className={styles.validationIcon} />
)}
{isValidatingName && <Spinner className={styles.spinner} />}
</div>
{!isAppNameAvailable &&
azureFunctionsFormData.appName.value.length > 0 && (
<div className={styles.errorMessage}>
{props.appNameAvailability.message}
</div>
)}
</div>
{getDropdownSection(
FORM_CONSTANTS.LOCATION.label,

Просмотреть файл

@ -11,7 +11,7 @@
}
.selectionContainer {
margin-top: 2em;
margin-bottom: 2em;
}
.selectionContainerDisabled {
@ -25,7 +25,7 @@
}
.selectionInputContainer {
margin-bottom: 26px;
margin-bottom: 14px;
}
.modalFooterContainer {
@ -38,18 +38,6 @@
font-size: 1em;
border: none;
height: 50%;
align-self: flex-end;
}
.button:focus {
outline: 1px solid var(--vscode-contrastActiveBorder);
}
.button:disabled {
opacity: 0.5;
outline: none;
background-color: var(--vscode-badge-background);
cursor: default;
}
.button:focus {
@ -104,7 +92,7 @@
padding: 9px;
box-sizing: border-box;
background-color: var(--vscode-input-background);
border: 0.5px solid var(--vscode-editor-foreground);
border: 1px solid var(--vscode-editor-foreground);
}
.input {
@ -149,10 +137,6 @@ input::placeholder {
padding: 0px 10px;
font-size: 90%;
opacity: 50%;
box-sizing: border-box;
position: absolute;
width: 100%;
z-index: 1;
}
.spinner {
@ -179,8 +163,3 @@ input::placeholder {
height: 18px;
width: 18px;
}
.errorStack {
display: block;
position: relative;
}

Просмотреть файл

@ -17,7 +17,7 @@ export const setFunctionsModalButtonStatus = (
isAppNameEmpty = selections.appName.value === "";
isNumFunctionsZero = selections.numFunctions.value === 0;
isLocationEmpty = selections.location.value === "";
isRuntimeStackEmpty = selections.runtimeStack.value === "";
isRuntimeStackEmpty = selections.runtimeStack.value == "";
isAnyEmpty =
isSubscriptionEmpty ||

Просмотреть файл

@ -22,8 +22,9 @@ import {
InjectedIntlProps,
defineMessages
} from "react-intl";
import { Dispatch } from "redux";
import RootAction from "../../actions/ActionType";
import { ThunkDispatch } from "redux-thunk";
import { ThunkAction, ThunkDispatch } from "redux-thunk";
import { AppState } from "../../reducers";
import { validateName } from "../../utils/validateName";
@ -35,7 +36,6 @@ export interface IFunctionName {
title: string;
isValidTitle: boolean;
error: string;
id: string;
}
export interface IFunctionApp {
@ -54,7 +54,7 @@ type Props = IProps & IDispatchProps & InjectedIntlProps;
const messages = defineMessages({
duplicateFunctionName: {
id: "azureFunctionsSelection.duplicateName",
id: "functionName.duplicateName",
defaultMessage: "Function name has to be unique"
}
});
@ -115,7 +115,7 @@ const AzureFunctionsSelection = ({
{!_.isEmpty(selection) &&
selection.map(
(functionApp: ISelectedAzureFunctionsService, idx: number) => (
<React.Fragment key={serviceType + functionApp.appName.value + idx}>
<React.Fragment key={serviceType + functionApp.appName + idx}>
<div className={styles.headerContainer}>
<div>{intl.formatMessage(serviceType)}</div>
<div
@ -133,8 +133,8 @@ const AzureFunctionsSelection = ({
</div>
<DraggableSidebarItem
customInputStyle={styles.input}
key={functionApp.appName.value + idx}
text={functionApp.appName.value}
key={functionApp.appName + idx}
text={functionApp.appName}
closeSvgUrl={getSvg.getCancelSvg()}
withIndent={true}
idx={idx + 1}
@ -144,7 +144,7 @@ const AzureFunctionsSelection = ({
functionApp.functionNames.map(
(functionName: IFunctionName, idx: number) => (
<DraggableSidebarItem
key={functionApp.appName.value + idx.toString()}
key={functionApp.appName + idx.toString()}
closeSvgUrl={getSvg.getCancelSvg()}
withLargeIndent={true}
azureFunctionName={functionName}

Просмотреть файл

@ -21,5 +21,4 @@
.input {
background-color: var(--vscode-sideBar-background);
color: var(--vscode-editor-foreground);
text-overflow: ellipsis;
}
}

Просмотреть файл

@ -1,5 +1,5 @@
import * as React from "react";
import { withRouter, RouteComponentProps } from "react-router-dom";
import { withRouter } from "react-router-dom";
import { connect } from "react-redux";
import LoginCard from "../../components/LoginCard";
@ -18,6 +18,7 @@ import { messages } from "../../mockData/azureServiceOptions";
import { microsoftAzureDetails } from "../../mockData/azureServiceOptions";
import { withLocalPath } from "../../utils/getSvgUrl";
import { AppState } from "../../reducers";
import { IMetadata } from "../../types/metadata";
import { Dispatch } from "redux";
import RootAction from "../../actions/ActionType";
@ -30,7 +31,7 @@ interface IAzureLoginProps {
vscode: any;
}
type Props = IDispatchProps & IAzureLoginProps & InjectedIntlProps & RouteComponentProps;
type Props = IDispatchProps & IAzureLoginProps & InjectedIntlProps;
class AzureLogin extends React.Component<Props> {
handleClick = () => {

Просмотреть файл

@ -21,5 +21,4 @@
.input {
color: var(--vscode-editor-foreground);
background-color: var(--vscode-sideBar-background);
text-overflow: ellipsis;
}
}

Просмотреть файл

@ -30,6 +30,7 @@ import styles from "./styles.module.css";
import { getCosmosSelectionInDropdownForm } from "../../selectors/cosmosServiceSelector";
import { InjectedIntlProps, injectIntl } from "react-intl";
import { Dispatch } from "redux";
import { setAzureValidationStatusAction } from "../../actions/azureActions/setAzureValidationStatusAction";
import {
setAccountAvailability,
@ -136,11 +137,8 @@ const CosmosResourceModal = (props: Props) => {
}
};
// The data we are presenting to the user (available resource groups, locations, api's)
const [cosmosData, setData] = React.useState(cosmosInitialState);
// Hardcoding database options until data can be loaded dynamically
// Updates the data we are presenting to the user when the subscription changes
React.useEffect(() => {
setData({
accountName: [
@ -156,11 +154,9 @@ const CosmosResourceModal = (props: Props) => {
});
}, [props.subscriptionData]);
// The data the user has entered into the modal
const [cosmosFormData, updateForm] = React.useState(initialState);
const [formIsSendable, setFormIsSendable] = React.useState(false);
// Updates the data the user enters (cosmosFormData) as the user types
const handleChange = (updatedCosmosForm: CosmosDb) => {
setCosmosModalButtonStatus(
updatedCosmosForm,
@ -171,13 +167,12 @@ const CosmosResourceModal = (props: Props) => {
updateForm(updatedCosmosForm);
};
// Disable add resource button until all data fields have been entered
const getButtonClassNames = () => {
const buttonClass = formIsSendable
? buttonStyles.buttonHighlighted
: buttonStyles.buttonDark;
return classNames(buttonClass, styles.button);
return classNames(buttonClass, styles.button, styles.selectionContainer);
};
const handleDropdown = (infoLabel: string, value: string) => {
@ -207,6 +202,7 @@ const CosmosResourceModal = (props: Props) => {
}
};
}
handleChange(updatedForm);
};
@ -223,7 +219,8 @@ const CosmosResourceModal = (props: Props) => {
* Listens on account name change and validates the input in VSCode
*/
React.useEffect(() => {
if (cosmosFormData.accountName.value !== "") {
if (cosmosFormData.accountName.value != "") {
props.setValidationStatus(true);
if (timeout) {
clearTimeout(timeout);
}
@ -258,10 +255,6 @@ const CosmosResourceModal = (props: Props) => {
const handleInput = (e: React.SyntheticEvent<HTMLInputElement>): void => {
const element = e.currentTarget as HTMLInputElement;
const strippedInput = element.value;
// Changes in account name will trigger an update in validation status
// Set validation status here to avoid premature error messages
props.setValidationStatus(true);
handleChange({
...cosmosFormData,
accountName: {
@ -359,7 +352,10 @@ const CosmosResourceModal = (props: Props) => {
DEFAULT_VALUE
)}
<div
className={classnames(styles.selectionInputContainer, {
className={classnames({
[styles.selectionInputContainer]:
!isAccountNameAvailable &&
cosmosFormData.accountName.value.length > 0,
[styles.selectionContainer]:
isAccountNameAvailable ||
cosmosFormData.accountName.value.length === 0,
@ -377,30 +373,32 @@ const CosmosResourceModal = (props: Props) => {
documents.azure.com
</a>
</div>
<div className={styles.errorStack}>
<div className={styles.inputContainer}>
<input
aria-label={props.intl.formatMessage(
messages.ariaAccountNameLabel
)}
className={styles.input}
onChange={handleInput}
value={cosmosFormData.accountName.value}
placeholder={FORM_CONSTANTS.ACCOUNT_NAME.label}
disabled={cosmosFormData.subscription.value === ""}
/>
{isAccountNameAvailable && !isValidatingName && (
<GreenCheck className={styles.validationIcon} />
)}
{isValidatingName && <Spinner className={styles.spinner} />}
</div>
{!isValidatingName && !isAccountNameAvailable &&
cosmosFormData.accountName.value.length > 0 && (
<div className={styles.errorMessage}>
{props.accountNameAvailability.message}
</div>
)}
<div
className={classnames(styles.inputContainer, {
[styles.borderRed]:
!isAccountNameAvailable &&
cosmosFormData.accountName.value.length > 0
})}
>
<input
aria-label={props.intl.formatMessage(messages.ariaAccountNameLabel)}
className={styles.input}
onChange={handleInput}
value={cosmosFormData.accountName.value}
placeholder={FORM_CONSTANTS.ACCOUNT_NAME.label}
disabled={cosmosFormData.subscription.value === ""}
/>
{isAccountNameAvailable && !isValidatingName && (
<GreenCheck className={styles.validationIcon} />
)}
{isValidatingName && <Spinner className={styles.spinner} />}
</div>
{!isAccountNameAvailable &&
cosmosFormData.accountName.value.length > 0 && (
<div className={styles.errorMessage}>
{props.accountNameAvailability.message}
</div>
)}
</div>
{getDropdownSection(
FORM_CONSTANTS.API.label,

Просмотреть файл

@ -25,7 +25,7 @@
}
.selectionInputContainer {
margin-bottom: 26px;
margin-bottom: 14px;
}
.buttonContainer {
@ -134,10 +134,6 @@ input::placeholder {
padding: 0px 10px;
font-size: 90%;
opacity: 50%;
box-sizing: border-box;
position: absolute;
width: 100%;
z-index: 1;
}
.spinner {
@ -164,8 +160,3 @@ input::placeholder {
height: 18px;
width: 18px;
}
.errorStack {
display: block;
position: relative;
}

Некоторые файлы не были показаны из-за слишком большого количества измененных файлов Показать больше