Skip to content

Release 1.0.1: foco do ark-toaster, disabled do ark-toggle-group e cobertura de testes - #13

Merged
paulosfjunior merged 7 commits into
mainfrom
release/1.0.1
Sep 20, 2026
Merged

paulosfjunior merged 7 commits into
mainfrom
release/1.0.1

Conversation

@paulosfjunior

Copy link
Copy Markdown
Contributor

Release 1.0.1

Duas correcoes encontradas ao subir a cobertura de testes, mais as stories que as expuseram. O release.yml publica os dez pacotes em 1.0.1 no push para a main e cria a release com a secao do CHANGELOG.md.

Correcoes

  • ark-toaster mantem o foco do teclado. Cada toast novo refazia a pilha inteira e destruia o botao que o usuario de teclado estava lendo (o README ja prometia o contrario, e o raise() que deveria preservar o foco nunca via foco dentro da pilha). O render virou incremental: cards existentes ficam, so o novo e criado no topo, os dispensados saem; um card em saida mantem a animacao. Mudar atributo do host continua recriando os cards, sem reanimar.
  • ark-toggle-group preserva o disabled individual. Ao reabilitar o grupo, itens desabilitados por conta propria voltavam habilitados, porque o grupo marcava todos como desabilitados por ele.
  • arkReveal (@tooark/motion): guard morto removido; o once e garantido pelo contrato do inView.

Testes

Suite: 376 -> 388 stories. Cobertura: linhas 90,7% -> 93,6%, branches 76,4% -> 80,1%.

Arquivo Linhas antes -> depois
motion/flip.ts / swipe.ts / stagger.ts / reveal.ts 0 / 35 / 63 / 86 -> 100
motion/internal.ts 46 -> 95
ark-toaster.ts 77 -> 99
ark-code-editor.ts 77 -> 98
ark-toggle.ts / ark-copy-button.ts 79 / 83 -> 100
ark-toggle-group.ts 89 -> 99
  • ark-motion-plus.stories.ts: play nas quatro stories + RevealOnce e TargetsAndOptions.
  • ark-toaster.stories.ts: FocoNoTeclado, TiposAcoesERichColors, Posicoes, AutoDismissEFila, TestHooks.
  • ark-code-editor.stories.ts: Properties. ark-copy-button.stories.ts: PropertiesAndFallbacks.
  • ark-toggle.stories.ts: KeyboardAndDisabled, ClassAndTestHooks, GroupPropagation.
  • CLAUDE.md: armadilhas das play functions (instrumentador do expect, pointer-events: none, timers de demo, PointerEvent sintetico, corrida transform/opacity, stub de matchMedia).

Verificacao local

biome ci . limpo; pnpm -r build (10 pacotes) e pnpm check:publish OK na 1.0.1; suite completa 388/388 com coverage.

…ao reabilitar o grupo

Ao tirar `disabled` do grupo, os itens desabilitados por conta propria voltavam habilitados: syncToggles marcava
todo item com data-group-disabled, inclusive os que ja estavam desabilitados, e a marca e o que autoriza a remocao.
Um item ja desabilitado agora nao leva a marca, entao so o disabled que o grupo aplicou e retirado.

- ark-toggle.stories.ts: KeyboardAndDisabled (Enter/Espaco, tecla vinda de um filho, clique cancelado e setters
  com a regra dos wrappers), ClassAndTestHooks (reescrever class mantem as classes do host; hooks no host) e
  GroupPropagation (value por propriedade, size/intent/theme/disabled descendo para os itens, regressao acima).
- CHANGELOG: entrada em Unreleased.

Signed-off-by: Paulo Freitas <paulosfjunior@gmail.com>
…um toast novo

Cada toast novo refazia a pilha inteira (innerHTML = "" e todos os cards recriados): o botao que o usuario de
teclado estava lendo era destruido e o foco caia no body, ao contrario do que o README promete, e o raise() que
deveria preservar o foco nunca via foco dentro da pilha. Um card em saida tambem era recriado oculto e perdia a
animacao.

O render passou a ser incremental: cards ja montados ficam onde estao, os que sairam da lista sao removidos e so o
novo e criado, na posicao da lista (o mais novo no topo). O corpo do loop antigo virou buildCard(). Mudar um
atributo do host (position, rich-colors, close-button, lang, testid) continua recriando todos os cards, sem
reanimar a entrada; um id repetido tira o card antigo e volta ao topo como novo. cardOf() centraliza o seletor
com CSS.escape.

- ark-toaster.stories.ts: FocoNoTeclado (o foco fica e o card e o mesmo no), TiposAcoesERichColors (icone e
  paleta por tipo, acao emite ark-toast-action, cancelamento so fecha, excedente de max-visible), Posicoes (seis
  posicoes, valor invalido e maiusculas, entrada e saida em cada uma), AutoDismissEFila (duration do host, timers
  cancelados ao sair da fila ou do DOM, mesmo id, atributos invalidos, evento sem titulo) e TestHooks.
- CHANGELOG: entrada em Unreleased.

Signed-off-by: Paulo Freitas <paulosfjunior@gmail.com>
…e swipe)

O arquivo nao tinha nenhuma play function: as demos montavam os helpers, mas nada os executava, e o pacote ficava
em 42% de linhas (arkFlip em 0%, arkSwipe em 35%). Cada story ganhou um play, e entraram duas de cobertura:
RevealOnce (once padrao) e TargetsAndOptions (seletor, elemento, lista, NodeList, SVG ignorado, presets,
distancia em rem/em/px, easing por token, curva e nome da lib, from, movimento reduzido).

- Swipe usa PointerEvent feito a mao (pointerId 1, isPrimary) com setTimeout entre os eventos para a velocidade,
  como o ark-split-pane; movimento reduzido no JS entra por um stub de matchMedia em try/finally.
- settled() espera transform (JS) e opacity (WAAPI) na mesma waitFor: o transform chega a none um frame antes.
- O pacote sobe para 99% de linhas e 93% de branches.

Signed-off-by: Paulo Freitas <paulosfjunior@gmail.com>
O guard `if (once && revealed) return` nunca rodava: o inView da Motion documenta que, sem cleanup devolvido
pelo callback, o elemento deixa de ser observado depois da primeira entrada. A flag e o guard cobriam um caso
que a lib garante que nao acontece; o comentario passa a apontar o contrato.

Signed-off-by: Paulo Freitas <paulosfjunior@gmail.com>
…opy-button

- ark-code-editor.stories.ts: Properties cobre todos os setters e getters (reflexo no atributo, validacao de
  faixa, booleanos com a regra dos wrappers), variableKeys/completions/completionSource/formatter depois de
  montado e focus(). Os 19 setters nunca eram chamados; o componente sobe de 77% para 98% de linhas.
- ark-copy-button.stories.ts: PropertiesAndFallbacks cobre value/feedbackMs por propriedade, `for` em input e
  sem alvo, locale-json com lang="custom", copia repetida dentro do feedback, fallback de execCommand quando a
  Clipboard API nega, icon-only com aria-label proprio e do usuario, comentarios e filhos do usuario.

Signed-off-by: Paulo Freitas <paulosfjunior@gmail.com>
Seis padroes que custaram uma rodada cada nesta leva de testes: o instrumentador do storybook/test embrulha
funcoes passadas ao expect, userEvent.click recusa pointer-events: none, setTimeout em handler de demo vaza para
a story seguinte, PointerEvent sintetico com setPointerCapture, corrida transform/opacity dos helpers da Motion e
o stub de matchMedia para movimento reduzido no JS.

Signed-off-by: Paulo Freitas <paulosfjunior@gmail.com>
Versao raiz e dos dez pacotes (scripts/sync-versions.mjs); o CHANGELOG fecha a secao 1.0.1 com as correcoes do
ark-wysiwyg-editor, ark-carousel, ark-toggle-group e ark-toaster. O release.yml publica no push para a main.

Signed-off-by: Paulo Freitas <paulosfjunior@gmail.com>
@paulosfjunior
paulosfjunior enabled auto-merge (rebase) September 20, 2026 15:55
@paulosfjunior
paulosfjunior merged commit da42093 into main Sep 20, 2026
5 checks passed
@paulosfjunior
paulosfjunior deleted the release/1.0.1 branch September 20, 2026 15:57
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment

Labels

None yet

Projects

None yet

Development

Successfully merging this pull request may close these issues.

1 participant