@abrasileirado/dsgovbr-bootstraped 0.2.1 → 0.3.0

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "@abrasileirado/dsgovbr-bootstraped",
3
- "version": "0.2.1",
3
+ "version": "0.3.0",
4
4
  "description": "Camada de compatibilidade visual não oficial entre o Bootstrap 5 e o Design System GOV.BR (DSGovBR)",
5
5
  "license": "MIT",
6
6
  "author": "Kelson da Costa Medeiros",
@@ -23,12 +23,19 @@
23
23
  "scripts": {
24
24
  "build:css": "sass src/scss/index.scss:dist/dsgovbr-bootstraped.css --style=expanded --source-map",
25
25
  "build:css:min": "sass src/scss/index.scss:dist/dsgovbr-bootstraped.min.css --style=compressed --no-source-map",
26
- "build:docs-assets": "node -e \"require('fs').mkdirSync('docs/assets/css',{recursive:true});require('fs').copyFileSync('dist/dsgovbr-bootstraped.min.css','docs/assets/css/dsgovbr-bootstraped.css')\"",
26
+ "build:docs-assets": "node scripts/build-docs-assets.js",
27
27
  "build:site": "node scripts/build-site.js",
28
28
  "build": "npm run build:css && npm run build:css:min && npm run build:docs-assets && npm run build:site",
29
- "test": "node scripts/test-package.js"
29
+ "test": "npm run test:unit && npm run test:package",
30
+ "test:unit": "node --test \"tests/**/*.test.js\"",
31
+ "test:package": "node scripts/test-package.js",
32
+ "test:browser": "playwright test",
33
+ "serve": "node scripts/serve.js",
34
+ "test:visual:update": "node scripts/test-visual-update.js"
30
35
  },
31
36
  "devDependencies": {
37
+ "@axe-core/playwright": "^4.14.0",
38
+ "@playwright/test": "1.64.1",
32
39
  "sass": "^1.80.0"
33
40
  }
34
41
  }
@@ -59,10 +59,9 @@ $btn-padding-x: 1.5rem !default; // 24px
59
59
  $btn-padding-x-sm: 1rem !default; // 16px
60
60
  $btn-padding-x-lg: 2rem !default; // 32px
61
61
 
62
- // Padding vertical ajustado para aproximar as alturas de referência do
63
- // GOV.BR DS (32/40/48px — ver _tokens.scss). É uma aproximação deliberada,
64
- // não paridade de pixel: a matriz de compatibilidade (docs/requisitos.md §6)
65
- // não exige identidade exata, só declarar a aproximação.
62
+ // A altura exata (32/40/48px — ver _tokens.scss) vem de min-height em
63
+ // components/_button.scss. Este padding vertical só dá respiro quando o
64
+ // rótulo quebra de linha (aí o botão cresce além do mínimo).
66
65
  $btn-padding-y: 0.5rem !default; // ~40px de altura total (padrão)
67
66
  $btn-padding-y-sm: 0.375rem !default; // ~32px de altura total
68
67
  $btn-padding-y-lg: 0.625rem !default; // ~48px de altura total
@@ -110,6 +109,11 @@ $form-check-input-width: 24px !default;
110
109
  // sobrescrevemos o resultado final também: 24px (caixa) + 8px (espaçamento,
111
110
  // spacing-scale-base do GOV.BR DS) = 32px.
112
111
  $form-check-padding-start: 2rem !default;
112
+ // Linha do GOV.BR DS: altura da caixa (24px) e 8px entre linhas
113
+ // (spacing-scale-base). Os padrões do Bootstrap (21px e .125rem) são menores
114
+ // que a caixa, e as caixas de linhas seguidas quase se tocavam.
115
+ $form-check-min-height: 24px !default;
116
+ $form-check-margin-bottom: 0.5rem !default;
113
117
  $form-check-input-border-radius: $govbr-radius-sm !default; // 4px (só a caixa do checkbox)
114
118
  $form-check-label-cursor: pointer !default;
115
119
 
@@ -30,6 +30,12 @@ $govbr-warning: #ffcd07 !default;
30
30
  // vendor/govbr-ds-core/.../configs/colors/_red-vivid.scss
31
31
  $govbr-danger: #e52207 !default;
32
32
 
33
+ // Texto amarelo legível: o amarelo do tema (#ffcd07) como TEXTO sobre fundo
34
+ // claro dá contraste 1.5:1 (WCAG 1.4.3 exige 4.5:1). Usado só em
35
+ // .btn-outline-warning (components/_button.scss). yellow-vivid-60 dá ~6:1.
36
+ // vendor/govbr-ds-core/.../configs/colors/_yellow-vivid.scss
37
+ $govbr-warning-text: #776017 !default;
38
+
33
39
  // --- Neutros ---
34
40
  // vendor/govbr-ds-core/.../configs/colors/_gray.scss
35
41
  $govbr-gray-90: #1b1b1b !default; // tom mais escuro (usado como $dark)
@@ -53,6 +59,19 @@ $govbr-font-weight-semibold: 600 !default;
53
59
  // vendor/govbr-ds-core/.../configs/colors/_gray.scss
54
60
  $govbr-gray-40: #888 !default;
55
61
 
62
+ // --- Foco (issue #30) ---
63
+ // --focus: var(--focus-color) = var(--focus-color-light) = var(--gold-vivid-40)
64
+ // vendor/govbr-ds-core/src/partial/scss/_tokens.scss (bloco :root)
65
+ // vendor/govbr-ds-core/.../configs/colors/_gold-vivid.scss
66
+ $govbr-focus: #c2850c !default;
67
+ // --focus-width: var(--surface-width-lg) (contorno do botão)
68
+ // vendor/govbr-ds-core/src/partial/scss/configs/_surface.scss ($width-lg)
69
+ $govbr-focus-width: 4px !default;
70
+ // focus-soft (campos): box-shadow 0 0 0 var(--surface-width-md) ($width-md)
71
+ $govbr-focus-ring-width: 2px !default;
72
+ // --focus-offset: var(--spacing-scale-half) = $spacer * 0.5
73
+ $govbr-focus-offset: 4px !default;
74
+
56
75
  // --- Superfície (raio de borda) ---
57
76
  // vendor/govbr-ds-core/src/partial/scss/configs/_surface.scss ($rounder-sm)
58
77
  $govbr-radius-sm: 4px !default;
@@ -0,0 +1,50 @@
1
+ // Ícone de severidade do alerta (GOV.BR DS: elemento .icon dentro de .message,
2
+ // com Font Awesome: check-circle, times-circle, info-circle e
3
+ // exclamation-triangle). O GOV.BR DS não redistribui nem dependemos do Font
4
+ // Awesome (DP-05), então aqui são formas SVG PRÓPRIAS (autoria deste
5
+ // projeto), aplicadas por ::before com mask-image: sem markup novo (RF-03), e
6
+ // a cor vem de CSS (um data-URI não enxerga custom properties; a máscara sim).
7
+ //
8
+ // O ícone é decorativo: a severidade continua no texto e no role="alert".
9
+ // Só nas quatro severidades do GOV.BR DS; alert-primary/secondary/light/dark
10
+ // são extensões (DP-06) e ficam sem ícone.
11
+
12
+ $govbr-alert-icons: (
13
+ // círculo com check
14
+ "success": escape-svg(url("data:image/svg+xml,<svg xmlns='http://www.w3.org/2000/svg' viewBox='0 0 16 16'><path fill-rule='evenodd' d='M8 0a8 8 0 1 0 0 16A8 8 0 0 0 8 0zM11.35 5.35L7 9.7 4.65 7.35l-1 1L7 11.7l5.35-5.35-1-1z'/></svg>")),
15
+ // círculo com X
16
+ "danger": escape-svg(url("data:image/svg+xml,<svg xmlns='http://www.w3.org/2000/svg' viewBox='0 0 16 16'><path fill-rule='evenodd' d='M8 0a8 8 0 1 0 0 16A8 8 0 0 0 8 0zM5.2 4.2L8 7l2.8-2.8 1 1L9 8l2.8 2.8-1 1L8 9l-2.8 2.8-1-1L7 8 4.2 5.2z'/></svg>")),
17
+ // círculo com "i"
18
+ "info": escape-svg(url("data:image/svg+xml,<svg xmlns='http://www.w3.org/2000/svg' viewBox='0 0 16 16'><path fill-rule='evenodd' d='M8 0a8 8 0 1 0 0 16A8 8 0 0 0 8 0zM7.1 3.6h1.8v1.8H7.1zM7.1 6.8h1.8v5.6H7.1z'/></svg>")),
19
+ // triângulo com "!"
20
+ "warning": escape-svg(url("data:image/svg+xml,<svg xmlns='http://www.w3.org/2000/svg' viewBox='0 0 16 16'><path fill-rule='evenodd' d='M8 .8l7.7 14H.3zM7.1 5.8h1.8v4.9H7.1zM7.1 11.6h1.8v1.8H7.1z'/></svg>"))
21
+ );
22
+
23
+ // success/danger/info usam a cor da severidade; o aviso usa o texto escuro
24
+ // (no GOV.BR DS o ícone do aviso herda --color, não o amarelo).
25
+ $govbr-alert-icon-colors: (
26
+ "success": var(--bs-success),
27
+ "danger": var(--bs-danger),
28
+ "info": var(--bs-info),
29
+ "warning": var(--bs-body-color)
30
+ );
31
+
32
+ @each $nome, $icone in $govbr-alert-icons {
33
+ .alert-#{$nome} {
34
+ // abre espaço à esquerda: ícone (1.25rem) + respiro (.75rem)
35
+ padding-left: calc(var(--bs-alert-padding-x) + 1.25rem + 0.75rem);
36
+
37
+ &::before {
38
+ content: "";
39
+ position: absolute;
40
+ // centraliza o ícone (20px) na primeira linha do texto (21px)
41
+ top: calc(var(--bs-alert-padding-y) + 0.03125rem);
42
+ left: var(--bs-alert-padding-x);
43
+ width: 1.25rem;
44
+ height: 1.25rem;
45
+ background-color: map-get($govbr-alert-icon-colors, $nome);
46
+ -webkit-mask: $icone center / contain no-repeat;
47
+ mask: $icone center / contain no-repeat;
48
+ }
49
+ }
50
+ }
@@ -0,0 +1,48 @@
1
+ // Contraste (WCAG 1.4.3): o Bootstrap usa a cor do tema como texto do
2
+ // .btn-outline-warning; com o amarelo do GOV.BR DS (#ffcd07) sobre fundo claro
3
+ // são 1.5:1 (mínimo 4.5:1). Escurecemos só o texto; a borda e o estado hover
4
+ // (fundo amarelo com texto preto) continuam os do tema. Variante que não
5
+ // existe no GOV.BR DS (extensão — DP-06), mas não pode ficar ilegível.
6
+ .btn-outline-warning {
7
+ --bs-btn-color: #{$govbr-warning-text};
8
+ }
9
+
10
+ // Forma do botão do GOV.BR DS (vendor/govbr-ds-core/.../button/_mixins.scss):
11
+ // sem borda nas variantes preenchidas e altura FIXA por tamanho (32/40/48px),
12
+ // conteúdo centralizado. Usamos min-height (não height) para um rótulo que
13
+ // quebre linha fazer o botão crescer em vez de transbordar. O padding vertical
14
+ // de _bootstrap-settings.scss deixa de definir a altura; só dá respiro se quebrar.
15
+ .btn {
16
+ --bs-btn-border-width: 0;
17
+ display: inline-flex;
18
+ align-items: center;
19
+ justify-content: center;
20
+ min-height: $govbr-button-height-medium;
21
+ }
22
+
23
+ .btn-sm,
24
+ .btn-group-sm > .btn {
25
+ min-height: $govbr-button-height-small;
26
+ }
27
+
28
+ .btn-lg,
29
+ .btn-group-lg > .btn {
30
+ min-height: $govbr-button-height-large;
31
+ }
32
+
33
+ // No GOV.BR DS só a ênfase "secondary" tem borda (1px). Aqui: as variantes
34
+ // outline do Bootstrap (extensão, exceto outline-primary — ver DP-06).
35
+ [class*="btn-outline-"] {
36
+ --bs-btn-border-width: 1px;
37
+ }
38
+
39
+ // Foco por teclado do GOV.BR DS (mixin focus em partial/scss/mixins/_focus.scss):
40
+ // contorno tracejado dourado, afastado do botão, no lugar do anel azul
41
+ // translúcido (box-shadow) do Bootstrap. Contraste do dourado sobre branco
42
+ // ~3,2:1 (WCAG 1.4.11 pede 3:1 para componentes de interface).
43
+ .btn:focus-visible,
44
+ .btn-check:focus-visible + .btn {
45
+ outline: $govbr-focus-width dashed $govbr-focus;
46
+ outline-offset: $govbr-focus-offset;
47
+ box-shadow: none;
48
+ }
@@ -0,0 +1,38 @@
1
+ // Foco dos campos de texto (mixin focus-soft do GOV.BR DS): borda dourada mais
2
+ // um anel de 2px, no lugar do anel azul translúcido do Bootstrap.
3
+ // !important como no GOV.BR DS: o foco vence a cor de borda e o anel dos
4
+ // estados de validação (.is-valid/.is-invalid), que têm especificidade maior.
5
+ .form-control:focus,
6
+ .form-select:focus {
7
+ border-color: $govbr-focus !important;
8
+ box-shadow: 0 0 0 $govbr-focus-ring-width $govbr-focus !important;
9
+ outline: 0;
10
+ }
11
+
12
+ // Estados de validação: o GOV.BR DS engrossa a borda do campo para 2px na cor
13
+ // do estado (input-states: border-width: 2px). Engrossar a borda aqui mudaria
14
+ // a altura (e exigiria compensar o padding em cada tamanho), então os 2px
15
+ // visuais saem de 1px de borda (a cor do estado já vem do Bootstrap) + 1px de
16
+ // sombra interna na mesma cor: mesmo desenho, layout intocado. Em :focus a
17
+ // regra acima (dourada, !important) prevalece, como no GOV.BR DS.
18
+ .form-control.is-valid,
19
+ .form-select.is-valid,
20
+ .was-validated .form-control:valid,
21
+ .was-validated .form-select:valid {
22
+ box-shadow: inset 0 0 0 1px var(--bs-form-valid-border-color);
23
+ }
24
+
25
+ .form-control.is-invalid,
26
+ .form-select.is-invalid,
27
+ .was-validated .form-control:invalid,
28
+ .was-validated .form-select:invalid {
29
+ box-shadow: inset 0 0 0 1px var(--bs-form-invalid-border-color);
30
+ }
31
+
32
+ // Centraliza a caixa na primeira linha do rótulo. O Bootstrap faz
33
+ // ($line-height-base - $form-check-input-width) * .5, que só funciona com a
34
+ // largura em em (1.5 - 1em); com a caixa de 24px vira 1.5 - 24px = -11.25px e
35
+ // a caixa sobe ~10px. Aqui: (altura da linha - 24px) / 2 = -1.5px.
36
+ .form-check-input {
37
+ margin-top: calc((var(--bs-body-line-height) * 1em - #{$form-check-input-width}) / 2);
38
+ }
@@ -16,4 +16,7 @@
16
16
 
17
17
  // Ajustes que as variáveis de tema, sozinhas, não resolvem — um adaptador
18
18
  // por componente (ver docs/desenvolvimento.md).
19
+ @import "components/alert";
20
+ @import "components/button";
19
21
  @import "components/card";
22
+ @import "components/form";