O que é a regra @property e como ela funciona com fallbacks?

A regra @property é um recurso poderoso do CSS que permite aos desenvolvedores definir propriedades personalizadas com maior controle sobre seu comportamento, incluindo como elas animam e seus valores iniciais. Esta regra fornece uma maneira de aprimorar a funcionalidade das propriedades personalizadas do CSS e oferece mais flexibilidade em sua aplicação. A sintaxe básica da regra @property é a seguinte:
@property --property-name {
  syntax: '<type>';
  inherits: true | false;
  initial-value: <value>;
}
O --property-name é o nome da propriedade personalizada que você está definindo. Como todas as propriedades personalizadas, ela deve começar com dois traços. syntax define o tipo da propriedade, que pode ser coisas como <color>, <length>, <number>, <percentage> ou tipos mais complexos. inherits especifica se a propriedade deve herdar seu valor do elemento pai. initial-value define o valor padrão da propriedade. Aqui está um exemplo prático de como usar a regra @property:
<link rel="stylesheet" href="styles.css">
<button class="button">Click Me</button>
@property --main-color {
  syntax: '<color>';
  inherits: false;
  initial-value: #3498db;
}

.button {
  background-color: var(--main-color);
}
Neste exemplo, estamos definindo uma propriedade personalizada --main-color como um valor color, configurando-a para não herdar e dando a ela um valor inicial de #3498db. Um dos principais benefícios da regra @property é que ela permite a animação de propriedades personalizadas, o que não era possível antes:
<link rel="stylesheet" href="styles.css">
<div class="gradient-box"></div>
@property --gradient-angle {
  syntax: '<angle>';
  inherits: false;
  initial-value: 0deg;
}

.gradient-box {
  width: 100px;
  height: 100px;
  background: linear-gradient(var(--gradient-angle), red, blue);
  transition: --gradient-angle 0.5s;
}

.gradient-box:hover {
  --gradient-angle: 90deg;
}
O código acima cria um gradiente que anima suavemente quando o elemento é hoverado, algo que não era possível com propriedades customizadas padrão. Agora, vamos discutir como a regra @property funciona com fallbacks. Fallbacks são cruciais em CSS para garantir que os estilos se degradam de forma suave em navegadores que não suportam certos recursos. Com o @property, os fallbacks funcionam em dois níveis: para a própria regra e para o uso da propriedade customizada. Para navegadores que não suportam a regra @property, você pode fornecer uma alternativa declarando a propriedade customizada da maneira tradicional:
<link rel="stylesheet" href="styles.css">
:root {
  --main-color: #3498db;
}

@property --main-color {
  syntax: '<color>';
  inherits: false;
  initial-value: #3498db;
}

body {
  background-color: var(--main-color);
}
Neste caso, navegadores que suportam @property usarão a versão mais estritamente definida, enquanto outros recorrerão à declaração padrão de propriedade customizada. Ao usar a propriedade customizada, você pode fornecer um valor de fallback usando a função var(), assim como faria com propriedades customizadas padrão:
<link rel="stylesheet" href="styles.css">
<button class="button">Click Me</button>
.button {
  background-color: var(--main-color, #3498db);
}
Isso garante que mesmo se a propriedade --main-color não estiver definida ou for inválida, o botão ainda terá uma cor de fundo. A regra @property também permite cenários de fallback mais complexos. Por exemplo, você pode usá-lo para fornecer alternativas seguras para tipos:
<link rel="stylesheet" href="styles.css">
<div class="box">Colored box</div>
@property --padding {
  syntax: '<length>';
  inherits: false;
  initial-value: 10px;
}

.box {
  width: 100px;
  height: 100px;
  background-color: darkred;
  color: white;
  padding: var(--padding);
}
Neste caso, se alguém tentar definir --padding para um valor inválido, como uma cor, o navegador usará o valor inicial de 10px, mantendo a segurança de tipo. A regra CSS @property é considerada amplamente disponível em todos os principais motores de navegadores modernos (como Chrome, Edge, Opera, Firefox e Safari) desde o início de 2024. Se você quiser suportar navegadores mais antigos, precisa fornecer CSS de fallback conforme explicado acima. Em conclusão, a regra @property representa um avanço significativo na forma como trabalhamos com propriedades customizadas em CSS. Ele fornece mais controle e possibilita novas funcionalidades como animação de propriedades personalizadas. No entanto, é importante usá-lo com moderação e sempre fornecer alternativas apropriadas para garantir uma boa experiência em todos os navegadores. Como em qualquer tecnologia web de ponta, o segredo é melhorar a experiência para os navegadores que a suportam enquanto garante a funcionalidade básica para aqueles que não a suportam.
Este módulo não possui perguntas. Marque como concluído.