Repository navigation
Planejamento da v4.0.0: padronização da API dos componentes, toolchain e limpeza #1140
Unanswered
lucasn4s
asked this question in
Nova versão
Replies: 0 comments
Sign up for free
to join this conversation on GitHub.
Already have an account?
Sign in to comment
Uh oh!
There was an error while loading. Please reload this page.
Planejamento da v4.0.0
Galera, a ideia desta discussão é começar a fechar o escopo da v4. A #692 continua sendo o lugar para jogar ideias soltas de melhoria; aqui a proposta é organizar o que de fato entra na próxima major, principalmente o que quebra compatibilidade e por isso só cabe numa versão nova.
Como já foi dito na #692, a v4 deve ser mais incremental que a migração da v2 para a v3: nada de trocar framework, mas sim arrumar a API dos componentes, atualizar o toolchain e remover o que já está marcado como deprecated.
Abaixo vão quatro frentes, com os dados que levantamos e alguns pontos em aberto. Comentem em cada tópico: concordâncias, objeções, coisas que faltaram. As decisões que saírem daqui viram issues.
1. Padronizar os nomes de props e eventos
Hoje o mesmo conceito tem nomes diferentes dependendo do componente. Isso obriga quem usa o Cuida a abrir a doc de cada componente para adivinhar o nome e torna a doc mais propensa a erro. Num levantamento recente achamos páginas escutando eventos que o componente não emite justamente por isso: o DropdownButton documenta
click, mas emitebutton-click.Na discussão da v3 (#268) chegamos a combinar de escrever guidelines de API no CONTRIBUTING, mas isso não aconteceu. Hoje o CONTRIBUTING só diz que tudo deve estar em inglês.
1.1 Props
Alguns exemplos (entre parênteses, quantos componentes ativos usam cada nome):
label(20),title(19),text(10),description(4),content(Card),subtitle(3) ×subTitle(AlertCard)sizecomsm/md/lg(19; o Modal aceita tambémxl) × booleanossmall/large(Switch),slim/thick(ProgressCircular),slim(Tooltip),compact(CalloutCard, PageHeader)fluid(20) ×block(Button) ×widthcom presets (Select, deprecated) ×fitContentWidth,verticalFluid,autoHeighthide*, 13no*, 10show*e 5with*enableAutocomplete(BaseInput, SearchInput) ×disableAutocomplete(TextInput)modelValue(22) × Stepper comvalue+ eventoinput(padrão do Vue 2, entãov-modelnão funciona nele no Vue 3) × AlertCard comvaluesem eventotooltip(inputs) ×tooltipText(Button, DropdownButton, IconButton)errorMessage(16) ×errorMessageText(WebcamModal)icon,leadingIcon/trailingIcon,iconLeft(Chip, booleano),persistantActionIcon(com typo)variant(55) convivendo comlight(10),dark,dimmed,muted,ghost,secondary,prominent,theme(charts) ecolor(Icon, Text)Inventário completo de props por grupo
label: BaseInput, Checkbox, CheckboxGroup, ColorPicker, ComboBox, DateInput, DynamicInputList, FileViewer, MonthAndYearPicker, Multiselect, NumberInput, PasswordInput, Radio, … ·title: AlertCard, BottomSheet, CalloutCard, Card, CollapsibleContainer, DashboardCard, Dialog, DialogModal, EmptyState, FloatingAssistant, InteractionBlockingOverlay, Modal, PageHeader, PanelCard, … ·text: Alert, Button, CalloutCard, Divider, DropdownButton, EmptyState, FlatButton, Label, Link, Tooltip.hideActionButton,hideAppSwitcher,hideCustomizeButton,hideHelp,hideLabel,hideLogout,hideNotification,hideSelectAll,hideSettings·noCancelButton,noCloseButton,noCloseCancelButton,noCloseOkButton,noCloseOnBackdrop,noCloseOnEsc,noContentPadding,noFooter,noHeader,noLabel,noMargin,noTitle,noWrap·showAction,showArrows,showBackNavigation,showLabel,showLabelName,showLogout,showMenuIcon,showProfileMenu,showTarget,showText·withIcon,withOverlay,withSearch,withSearchButton,withText.okButtonText,cancelButtonText,actionButtonText,nextButtonText,submitButtonText,savePhotoButtonText,takePhotoButtonText,takeAnotherPhotoButtonText. No SideSheet,okButtonText/cancelButtonTextestão tipadas como Boolean.items(10),options(5),actions(3),steps(2),segments,tabs,documents,groups,avatars,fields.activeItem(5),activeStep,activeTab.1.2 Eventos
Hoje convivem quatro estilos de nome e vários prefixos:
button-click,item-click,tab-click,action-button-click…boxClick(Box),cardClick(Card),cdsClick(Tile),onEnterPress,onItemClick,onRemoveRecent,onSeeMoreClick(QuickActionBar),supportLinkClick(inputs).cds-(cds-clickno IconButton,cdsClickno Tile) eon/on-(on-menu-click,on-take-photo,onEnterPress…). Oongera listeners como@on-menu-click.update:modelValuena maioria ×update:model-value(BottomSheet, WebcamModal).click,button-click,cds-click,cdsClick,boxClick,cardClick,action-click,action-clicked,item-click,navbar-click,sidebar-click,sidebar-item-click.clicksem declarar ememits. O listener recebe o evento do componente e o clique nativo; no SegmentedControl cada clique disparaclickduas vezes.Inventário completo de eventos
add,cancel,change,click,close,collapse,dismiss,expand,expanded,input,logout,ok,remove,search,select,submit,subtract.action-button-click,action-click,action-clicked,button-click,cancel-action,cds-click,chart-click,click-back,click-forward,collapse-click,customize-click,disable-tip,download-click,item-click,logo-click,main-button-click,navbar-click,navigation-item-click,next-action,on-menu-click,on-take-photo,popover-item-click,profile-click,profile-menu-option-click,search-button-click,sidebar-click,sidebar-item-click,sidebar-logout,sidebar-settings,step-change,tab-click,update-fields-list,variant-chosen.boxClick,cardClick,cdsClick,onEnterPress,onItemClick,onRemoveRecent,onSeeMoreClick,supportLinkClick.1.3 Proposta
label(rótulo de campo/controle),title(cabeçalho de container/overlay) etext/description. O Button deveria usarlabeloutext?hide*para esconder algo que aparece por padrão,show*para mostrar algo que não aparece. Acabar comno*,with*e paresenable*/disable*para o mesmo conceito.sizesó faz sentido quando o componente tem três ou mais tamanhos reais (sm/md/lg, exlonde couber, como no Modal). Para um componente que só tem o padrão e uma versão reduzida, umsizecomsmemdvira uma prop genérica para uma escolha binária. Nesse caso, um booleano é mais honesto.small,slimecompactpara ideias parecidas. Vale combinar um nome só para "versão reduzida", que pode ser ocompactpedido na Discussão sobre novas melhorias e possiblidade de v4.0.0 #692 para os inputs.smallelargealém do padrão, são três tamanhos e encaixariam emsize.slim/thickdo ProgressCircular, por exemplo, fala da espessura do traço, não do tamanho do componente.fluidcomo padrão para "ocupar toda a largura disponível". O Button usablock, que é uma convenção bem conhecida para botões (vem do Bootstrap), e não vemos problema em mantê-lo. Mas fica o ponto para discutir: mantemosblockcomo exceção documentada no Button ou aceitamosfluidtambém nele, para quem usa o resto do Cuida não precisar lembrar da diferença?modelValue/update:modelValue.on/cds.clickpara o elemento principal e<elemento>-clickpara partes internas (item-click,action-click). Todo evento declarado ememits.vue/custom-event-name-casing,vue/require-explicit-emitse uma checagem simples dos nomes de props no CI.2. Toolchain e compatibilidade
Algumas atualizações de dependência que estão paradas só fazem sentido numa major:
engines/.nvmrc). O CI testa 18/20/22, mas o 18 está em EOL desde abril de 2025. O vitest 5 (PR chore(deps): bump @vitest/mocker, @vitest/coverage-v8, @vitest/ui and vitest #1129) exige Node^22.12, o que derruba 18 e 20. Opublish.ymlroda em 20 e orelease.ymlainda em 16.enginese definir o piso (≥ 20 ou ≥ 22.12?), alinhando os workflows.peerDependencies, um projeto com Vue mais antigo quebraria em silêncio.peerDependencies: { vue: "^3.5.41" }. Precisamos conferir a versão do Vue nos projetos que consomem o Cuida.dist/style.csssome.build.lib.cssFileName. Decidir se a v4 aproveita para revisar osexportsdo pacote.3. Remover o que já está deprecated
hasSlot().mobile→floatingLabel(TextInput, Select, DateInput, MonthAndYearPicker, NumberInput);linkText/linkUrl→supportLink/supportLinkUrl(TextInput, Select, NumberInput);showTodayDot→highlightToday(DateInput);allowsExpand→fluid(RadioButtonGroup);widthcom presets (Select);type="email"no TextInput → EmailInput.4. Outros temas para a v4
Componentes ainda em Options API: cerca de 60 componentes ativos. Migrar para
<script setup>não é breaking por si só, mas casa bem com a padronização de props/eventos (tipagem de props e emits) e pode ser feito junto.Itens que já estão na Discussão sobre novas melhorias e possiblidade de v4.0.0 #692:
.fireno DialogModal;Documentação:
defineModel, e por isso ov-modelsome da doc de 19 componentes;Não é breaking, mas vale atacar junto para a doc da v4 já sair certa. Temos um levantamento detalhado disso e vamos abrir issues separadas.
Como seguir
next, que já tem um workflow para publicar versões de pré-lançamento no npm, para os projetos testarem antes.Perguntas para começar:
labeloutextno Button e afins?hide*/show*resolvem todos os casos, ou precisamos de mais alguma forma?sizesó com 3+ tamanhos, booleano para a versão reduzida" faz sentido? Qual nome usamos para a versão reduzida (compact,small…)?blockou aceitamosfluidtambém?All reactions