Skip to content

feat(button): add hasHorizontalPadding to OceanButton#1092

Merged
leonardodouradol merged 3 commits into
masterfrom
feat/button-remove-horizontal-padding
Jun 9, 2026
Merged

feat(button): add hasHorizontalPadding to OceanButton#1092
leonardodouradol merged 3 commits into
masterfrom
feat/button-remove-horizontal-padding

Conversation

@leonardodouradol

@leonardodouradol leonardodouradol commented Jun 9, 2026

Copy link
Copy Markdown
Contributor

Summary

Adds an opt-in hasHorizontalPadding flag (default true) to OceanButton / OceanButtonModel. When false, the button renders without the size-based horizontal content padding, so a tertiary button can be aligned to the surrounding content — matching web's textTertiary and iOS (where tertiary styles already use zero horizontal padding via getPadding() == .zero).

What changed

  • OceanButtonModel: new hasHorizontalPadding: Boolean = true
  • OceanButton(...): new hasHorizontalPadding param; contentPadding uses the style's size-based padding when true, otherwise 0.dp
  • Interactive preview (PreviewButtonInteractive): toggle to demonstrate the behavior
  • Dedicated static preview (PreviewButtonHasHorizontalPadding): compares true vs false side by side

Backward compatibility

Defaults to true → existing buttons are unaffected.

Motivation

Consumers (e.g. blu-mobile-android's contextual hero) currently apply a negative Modifier.offset workaround to align tertiary buttons to the content. This moves that responsibility into the design system, in parity with iOS/web.

##Evidences
image

Leonardo Dourado added 2 commits June 9, 2026 15:23
Adds an opt-in `removeHorizontalPadding` flag to OceanButton/OceanButtonModel.
When true, the button is rendered without the size-based horizontal content
padding, so a tertiary button can be aligned to the surrounding content
(matching web's textTertiary and iOS, where tertiary styles use zero padding).

Backward-compatible: defaults to false, so existing buttons are unaffected.
The interactive preview gets a toggle to demonstrate the behavior.
@leonardodouradol

Copy link
Copy Markdown
Contributor Author

@claude

@leonardodouradol

Copy link
Copy Markdown
Contributor Author

Code Review — removeHorizontalPadding

Revisão atuando como dev sênior. Apliquei os princípios do reviewer da KB da Blu (severidades 🔴/🟡/🟢; foco em clean code / arquitetura de API / testes / retrocompat) + o CONTRIBUTING do ocean-android (simplicidade, sem mudanças não relacionadas, self-documenting).

Resumo

Flag opt-in removeHorizontalPadding no OceanButton/OceanButtonModel para alinhar o texto do botão ao conteúdo (paridade com o textTertiary do web e o tertiary do iOS). Mudança atômica (1 arquivo), retrocompatível (default false), com preview de demonstração. Compila + ktlint OK.

🟡 Pontos de atenção (decisão do time do Ocean)

1. Abordagem vs paridade cross-platform. No iOS o alinhamento vem do próprio DS (getPadding() == .zero para tertiary* por padrão) e no web o textTertiary já é sem padding. Aqui foi escolhida uma flag opt-in — então o Android diverge na abordagem: o consumidor precisa lembrar de ligar a flag em cada tertiary-em-conteúdo e os tertiary existentes seguem com padding. Vale a decisão: tertiary deveria ter padding horizontal 0 por padrão (paridade com iOS/web) em vez de flag? A flag é mais conservadora (não muda telas existentes), mas empurra a responsabilidade pro consumidor e abre espaço pra inconsistência.

2. Flag sem escopo de estilo. removeHorizontalPadding vale para qualquer OceanButtonStyle, inclusive Primary/Secondary, onde zerar o padding quebra o visual. Por ser opt-in é "caller beware", mas o DS poderia restringir/documentar o uso pretendido (tertiary alinhado ao conteúdo).

🟢 Sugestões

3. Naming. removeHorizontalPadding descreve o "como". Um nome por intenção (contentAligned/alignToContent) lê melhor no call site — menor, o nome atual já é explícito.

4. Loading. O CircularProgressIndicator reusa getHorizontalPadding() como tamanho (pré-existente). Com a flag + showProgress, o contentPadding vai a 0 mas o spinner mantém 16dp — ok, só registrando que o tamanho do spinner não acompanha a flag (sem ação).

5. Testes. Sem teste novo. O repo não tem testes de botão e o default-false não altera comportamento existente → consistente com o repo. Se entrarem screenshot tests no futuro, valeria capturar o caso removeHorizontalPadding = true.

Veredito

Baixo risco / aprovável. A única questão de fato é de design (#1): flag opt-in vs tertiary com padding 0 por padrão para paridade cross-platform — decisão do time do Ocean. Contexto de origem: workaround de Modifier.offset no blu-mobile-android (hero de gestão de crédito) que esta mudança elimina na raiz.

@leonardodouradol leonardodouradol self-assigned this Jun 9, 2026
Renames `removeHorizontalPadding` to `hasHorizontalPadding` and inverts the
default to `true`, avoiding the double-negative at the call site and matching
the predicate-style booleans already used by OceanButton (disabled,
showProgress). Behavior and backward compatibility are unchanged.
@leonardodouradol leonardodouradol changed the title feat(button): add removeHorizontalPadding to OceanButton feat(button): add hasHorizontalPadding to OceanButton Jun 9, 2026
@leonardodouradol

Copy link
Copy Markdown
Contributor Author

Aplicado o ponto 🟢 #3 do review: o flag foi renomeado de removeHorizontalPadding para hasHorizontalPadding (default true), eliminando o duplo-negativo no call site e alinhando ao estilo de booleano predicado já usado no OceanButton (disabled, showProgress). Comportamento e retrocompatibilidade inalterados.

@sonarqubecloud

sonarqubecloud Bot commented Jun 9, 2026

Copy link
Copy Markdown

@leonardodouradol leonardodouradol marked this pull request as ready for review June 9, 2026 19:03
@leonardodouradol leonardodouradol merged commit 75f8006 into master Jun 9, 2026
3 checks passed
@leonardodouradol leonardodouradol deleted the feat/button-remove-horizontal-padding branch June 9, 2026 19:11
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.

3 participants