Partilhar via


Estilos básicos para seus widgets

Serviços de DevOps do Azure | Azure DevOps Server | Azure DevOps Server 2022

Tip

Para as mais recentes orientações de desenvolvimento de extensões, incluindo tema e migração do VSS. SDK, consulte o portal para programadores do Azure DevOps Extension SDK.

Use os estilos básicos fornecidos pelo Widget SDK para um aspeto consistente entre os widgets do dashboard.

Para incluir estilos de widgets, chame WidgetHelpers.IncludeWidgetStyles() durante a inicialização do widget:

WidgetHelpers.IncludeWidgetStyles();

Isto carrega sdk-widget.css no iframe do seu widget, fornecendo estilos para família de fontes, tamanho de letra, margens, preenchimentos, cabeçalhos e links.

Para painéis de configuração de widgets, chame WidgetHelpers.IncludeWidgetConfigurationStyles() em vez disso:

WidgetHelpers.IncludeWidgetConfigurationStyles();

Isto carrega sdk-widget-configuration.css, que fornece estilos para a família de fontes, o tamanho da fonte e elementos comuns de formulário como input, textarea, e select.

Observação

Para que estes estilos se apliquem, adicione uma widget classe no elemento HTML que contenha o seu widget. Todos os estilos de sdk-widget.css estão limitados a esta classe. Da mesma forma, adiciona uma widget-configuration classe no elemento que contém a configuração do teu widget.

Para um exemplo prático, veja a amostra de extensão.

Corpo, título e descrição do widget

Ao adicionar a classe widget no elemento de contentor do seu widget, obtém automaticamente o padding, a fonte e a cor para os conteúdos do widget.

Inclua sempre um título para o seu widget para que os utilizadores possam identificar o seu propósito num instante. Utilize <h2> com a classe title. Isto também ajuda os leitores de ecrã a identificar os diferentes widgets no painel de controlo.

Widget com título e descrição

Princípio de design: Widgets devem ter um título. Utilize a <h2> tag com a title classe.

Para adicionar uma descrição, use a description classe no elemento que contém a descrição do seu widget.

Princípio de design: Usa a description classe para a descrição do widget. As descrições devem fazer sentido mesmo quando lidas fora do contexto do widget.

	<div class="widget">
	    <h2 class="title">Widget title</h2>	
		<div class="description">The widget description is used to describe the widget. It makes sense even when read outside of the widget context.</div>
		<p>Place widget content here.</p>
	</div>

Títulos e legendas de widgets

As legendas complementam o título e podem não fazer sentido quando lidas fora de contexto.

Widget com título e subtítulo

Princípio de design: Use a subtitle classe para fornecer mais informações sobre o widget.

Use as classes title, inner-title e subtitle para obter a fonte, cor e margens certas para a combinação de título e subtítulo. O subtítulo tem uma cor suave em relação ao título.

	<div class="widget">
	    <h2 class="title">
			<div class="inner-title">Widget title</div>
			<div class="subtitle">Widget subtitle</div>
		</h2>
		<div class="content">
			Place widget content here.  
		</div>
	</div>

Dicas para a combinação de título e legendas:

  • Use um elemento inline, como <span> para a legenda aparecer na mesma linha do título.
  • Usa um elemento de bloco, como <div> para a legenda aparecer numa nova linha.

Alguns widgets incluem ligações com um ícone, texto e subtexto.

Widget que tem link com ícone e texto

Princípio de design: Use links com um ícone e subtexto para tornar o propósito do link óbvio para o usuário. Certifique-se de que o ícone simboliza o destino do link.

Para obter a mesma aparência, use a estrutura e as classes HTML abaixo.

	<div class="widget">
	    <h2 class="title">Widget title</h2>
		<div class="content">
			<p>Place your content here.</p>
			<a class="link-with-icon-text" href="http://bing.com" target="_blank">
				<span class="icon-container" style="background-color: #68217A"></span>
				<div class="title">
					Primary link text
					<div class="subtitle">Link subtext</div>
				</div>
			</a>		
		</div>
	</div>

Contadores

Para widgets que mostram uma contagem, adicione a big-count classe no elemento que contém o número. Os widgets Query Tile e Code Tile usam este mesmo estilo.

Widget Contador

Princípio de design: Use a big-count classe para apresentar números em letra grande. Não o uses com caracteres não numéricos.

<div class="widget">
    <h2 class="title">Counter widget</h2>
	<div class="big-count">223</div>
	<div>Additional text</div>
</div>

Widgets clicáveis

Para tornar um widget clicável para que ao o selecionar em qualquer lugar se navegue para outra página:

  1. Adicione uma etiqueta de âncora como filho do elemento do contentor de widget.
  2. Coloque todo o conteúdo do widget dentro da tag âncora.
  3. Adicione target="_blank" à etiqueta âncora para que o link abra numa nova aba.
  4. Adicione a clickable classe ao contentor de widgets.

Sem a clickable classe, a cor azul padrão do link aplica-se a todo o texto dentro do widget. A clickable classe também disponibiliza um indicador de foco personalizado para a navegação por teclado.

Princípio de design: Usa a clickable classe e a <a> etiqueta para tornar todo o widget clicável. Este padrão funciona bem quando o seu widget resume dados disponíveis noutra página.

<div class="widget clickable">
    <a href="https://bing.com"  target="_blank">
		<h2 class="title">Counter widget</h2>
		<div class="big-count">223</div>
		<div>Click me!</div>
	</a>
</div>

Elementos do formulário de configuração

Use as seguintes classes para elementos de formulário comuns na configuração de widgets:

Elemento de formulário Elemento de empacotamento Orientações
Caixa de texto simples div com a classe "single-line-text-input". Use um elemento label para adicionar texto ao lado da caixa de texto. Use o elemento input para criar uma caixa de texto. Use o atributo placeholder para fornecer texto de espaço reservado.
Caixa de verificação fieldset com a classe "checkbox" Use um elemento label para adicionar texto ao lado de cada caixa de seleção. Use um elemento legend para legendar o grupo de caixas de seleção. Use o atributo for em cada elemento label para ajudar os leitores de tela a entender o elemento de formulário.
Botão de opção fieldset com a classe "rádio" Utilize um elemento label para adicionar texto ao lado de cada botão de opção. Use um elemento legend para rotular o grupo de botões de rádio. Use o atributo for em cada elemento label para ajudar os leitores de tela a entender o elemento de formulário.
Menu Suspenso div com classe "dropdown" Utilize um elemento label para adicionar texto ao lado da lista suspensa. Se você quiser uma lista suspensa ocupando metade da largura, adicione a classe "metade" ao elemento div de encapsulamento. Se você quiser usar o ícone de seta padrão do sdk em vez do fornecido pelo navegador, envolva o elemento select com outro div com a classe "wrapper".
Caixa de texto com várias linhas div com a classe “multi-line-text-input”. Use label elemento para rotular o elemento textarea usado como caixa de texto de várias linhas.

O exemplo seguinte utiliza cada um dos elementos da forma listados na tabela.

Exemplo de configuração do widget

<div class="widget-configuration">

    <div class="single-line-text-input" id="name-input">
        <label>Your name</label>
        <input type="text" value="Contoso"></input>
    </div>

    <div class="dropdown" id="query-path-dropdown">
        <label>Drop down</label>
        <div class="wrapper">
            <select>						
				<option value="Shared Queries/Feedback">Shared Queries/Feedback</option>
				<option value="Shared Queries/My Bugs">Shared Queries/My Bugs</option>
				<option value="Shared Queries/My Tasks">Shared Queries/My Tasks</option>							
			</select>
        </div>

        <fieldset class="checkbox" id="select-results">
            <legend>Select results to display</legend>
            <input type="checkbox" id="check-option1" value="id" name="check" checked="true">
            <label for="check-option1">Query ID</label><br/>
            <input type="checkbox" id="check-option2" value="name" name="check" checked="true">
            <label for="check-option2">Query Name</label><br/>
            <input type="checkbox" id="check-option3" value="createdBy" name="check" checked="true">
            <label for="check-option3">Created By</label><br/>
        </fieldset>

        <fieldset class="radio" id="display-options">
            <legend>Display as </legend>
            <input type="radio" id="radio-option1" value="ordered" name="radio" checked="true">
            <label for="radio-option1">Ordered List</label><br/>
            <input type="radio" id="radio-option2" value="unordered" name="radio">
            <label for="radio-option2">Unordered List</label><br/>
        </fieldset>

        <div class="multi-line-text-input">
            <label>Comments</label>
            <textarea></textarea>
        </div>
    </div>
</div>

Mensagens de erro de validação

Para mostrar erros de validação abaixo dos elementos do formulário de forma consistente com widgets de primeira parte, adicione o seguinte excerto sob cada elemento do formulário:

<span class="validation-error">
	<span class="icon-error-exclamation"></span>
	<span class="validation-error-text"></span>
</span>

A visibilidade está oculta por defeito. Para mostrar uma mensagem de erro, encontre o elemento correspondente validation-error-text, defina o seu texto, e aplique visibility: visible ao seu elemento pai.

Por exemplo, para mostrar um erro quando uma caixa de texto está vazia:

Exemplo de erro de configuração do widget

O html para isso seria:

<div class="widget-configuration">
	<div class="single-line-text-input">
		<label>Your name</label>
		<input type="text" placeholder="Type Here">

		<span class="validation-error">
			<span class="icon-error-exclamation"></span>
			<span class="validation-error-text"></span>
		</span>
	</div>
</div>

E o JavaScript:

const input = document.querySelector(".single-line-text-input input");
const errorText = document.querySelector(".single-line-text-input .validation-error-text");

input.addEventListener("input", function () {
    if (input.value === "") {
        errorText.textContent = "Please enter your name.";
        errorText.parentElement.style.visibility = "visible";
    } else {
        errorText.parentElement.style.visibility = "hidden";
    }
});